Browse Source

Announcement framework from Pharo (simplified)

Nicolas Petton 12 years ago
parent
commit
c41a1efb1f
5 changed files with 428 additions and 106 deletions
  1. 106 106
      index.html
  2. 107 0
      js/Kernel-Announcements.deploy.js
  3. 152 0
      js/Kernel-Announcements.js
  4. 2 0
      js/amber.js
  5. 61 0
      st/Kernel-Announcements.st

+ 106 - 106
index.html

@@ -7,109 +7,109 @@
     <link rel="stylesheet" type="text/css" href='css/style.css' /> 
     <link type="image/x-icon" rel="shortcut icon" href="/favicon.ico"/> 
     <link href='http://fonts.googleapis.com/css?family=Istok+Web' rel='stylesheet' type='text/css'> 
-			<script type='text/javascript' src='js/amber.js'></script> 
-		</head> 
-		<body> 
-			
-			<a href="http://github.com/NicolasPetton/amber"><img style="position: absolute; top: 0; lef
-			t: 0; border: 0;" src="https://assets.github.com/img/bec6c51521dcc8148146135149fe06a9cc737577?repo=&url=http%3A%2F%2Fs3.amazonaws.com%2Fgithub%2Fribbons%2Fforkme_left_darkblue_121621.png&path=" alt="Fork me on GitHub"></a> 
-			
-			<div id="wrapper"> 
-				
-				<div id="header"> 
-					<div class="main"> 
-						<div class="logo"> 
-							<img src="images/amber.png"/> 
-						</div> 
-						
-						<ul id="tabs"> 
-							<li><a target="_blank" href="http://amber-lang.net/index.html">Overview</a></li> · 
-							<li><a target="_blank" href="http://amber-lang.net/index.html#download">Download</a></li> · 
-							<li><a target="_blank" href="http://amber-lang.net/learn.html">Learn</a></li> ·
-							<li><a target="_blank" href="http://amber-lang.net/documentation.html">Documentation</a></li> ·
-							<li><a target="_blank" target="_blank" href="https://github.com/NicolasPetton/amber">Source</a></li> 
-						</ul> 
-						
-						<div class="clear"></div> 
-						
-					</div> 
-				</div> 
-				
-				<div class="teaser"> 
-					<div class="main"> 
-						<h1>Welcome aboard!</h1> 
-						<div class="column">
-							<h2>What is Amber?</h2>
-							<p>Amber, formerly known as Jtalk, is an implementation of the Smalltalk-80 language. It is designed to make client-side development faster and easier. It allows developers to write client-side heavy web applications in Smalltalk. </p> 
-							<p>Amber includes an integrated development environment with a class browser, workspace, transcript, object inspector and debugger.</p> 
-							<p>Amber is written in itself, including the compiler, and compiles into efficient JavaScript, mapping one-to-one with the JS equivalent.</p> 
-							<h2>Give it a try!</h2>
-							<p><b>Try a <button onClick="smalltalk.Browser._open()"> Class browser</button> right now!</b></p> 
-						</div> 
-						<div class="column">
-							<h2>Getting started</h2>
-							<p>The <a href="https://github.com/NicolasPetton/amber/wiki">Wiki on GitHub</a> includes a <a href="https://github.com/NicolasPetton/amber/wiki/Getting-started">Getting started</a> tutorial for OSX, Linux and Windows.</p>
-							<p>If you're new to Smalltalk, You can learn it online with <a href="http://amber-lang.net/learn.html">ProfStef</a>.</p>
-							<h2>Join the community</h2>
-							<ul>
-								<li><a href="http://amber-lang.net">Amber's website</a></li>
-								<li><a href="https://github.com/NicolasPetton/amber/wiki">Wiki on GitHub</a></li>
-								<li><a href="http://groups.google.com/group/amber-lang">Mailing list</a></li>
-								<li>Join us on IRC at #amber-lang on Freenode</li>
-							</ul>
-						</div>
-						<div class="clear"></div> 
-					</div> 
-					
-					
-				</div> 
-				
-				<div id="content"> 
-					<div class="main"> 
-						<div class="box"> 
-							<h2>Client-side usage</h2> 
-							<div class="content"> 
-								<p>Load the full Amber Smalltalk environment with the IDE in your page:</p> 
-								
-								<code><pre>&lt;script src="js/amber.js" type="text/javascript"&gt;&lt;/script&gt;
-&lt;script type="text/javascript"&gt; loadAmber()&lt;/script&gt;</pre></code>
-							</div> 
-							
-							
-							<p>Or the deployment JavaScript file only (without the Smalltalk sources, parser, compiler and IDE):</p>
-							<code><pre>&lt;script src="js/amber.js" type="text/javascript"&gt;&lt;/script&gt;
-&lt;script type="text/javascript"&gt; loadAmber({deploy: true})&lt;/script&gt;</pre></code>
-						</div> 
-						
-						<div class="box last examples"> 
-							<h2>Examples</h2> 
-							<div class="content"> 
-								<ul>
-									<li>
-										<a href="examples/trysmalltalk/index.html">
-											<img src="images/profstef.png" alt="Learn Smalltalk with ProfStef"/>
-										</a>
-									</li>
-									<li>
-										<a href="examples/presentation/index.html">
-											<img src="images/presentation.png" alt="ESUG 2011 presentation"/>
-										</a>
-									</li>
-									<li>
-										<a href="examples/twitterwall/index.html">
-											<img src="images/twitterwall.png" alt="Twitter Wall"/>
-										</a>
-									</li>
-									<div class="clear"></div>
-								</ul>
-							</div> 
-						</div> 
-						
-					</div> 
-				</div> 
-			</div> 
-			
-			<script type='text/javascript'> loadAmber() </script> 
-			
-		</body> 
-	</html> 
+    <script type='text/javascript' src='js/amber.js'></script> 
+    <script type='text/javascript' src='js/lib/showdown.js'></script> 
+  </head> 
+  <body> 
+    
+    <a href="http://github.com/NicolasPetton/amber"><img style="position: absolute; top: 0; left: 0; border: 0;" src="https://assets.github.com/img/bec6c51521dcc8148146135149fe06a9cc737577?repo=&url=http%3A%2F%2Fs3.amazonaws.com%2Fgithub%2Fribbons%2Fforkme_left_darkblue_121621.png&path=" alt="Fork me on GitHub"></a> 
+    
+    <div id="wrapper"> 
+      
+      <div id="header"> 
+	<div class="main"> 
+	  <div class="logo"> 
+	    <img src="images/amber.png"/> 
+	  </div> 
+	  
+	  <ul id="tabs"> 
+	    <li><a target="_blank" href="http://amber-lang.net/index.html">Overview</a></li> · 
+	    <li><a target="_blank" href="http://amber-lang.net/index.html#download">Download</a></li> · 
+	    <li><a target="_blank" href="http://amber-lang.net/learn.html">Learn</a></li> ·
+	    <li><a target="_blank" href="http://amber-lang.net/documentation.html">Documentation</a></li> ·
+	    <li><a target="_blank" target="_blank" href="https://github.com/NicolasPetton/amber">Source</a></li> 
+	  </ul> 
+	  
+	  <div class="clear"></div> 
+	  
+	</div> 
+      </div> 
+      
+      <div class="teaser"> 
+	<div class="main"> 
+	  <h1>Welcome aboard!</h1> 
+	  <div class="column">
+	    <h2>What is Amber?</h2>
+	    <p>Amber, formerly known as Jtalk, is an implementation of the Smalltalk-80 language. It is designed to make client-side development faster and easier. It allows developers to write client-side heavy web applications in Smalltalk. </p> 
+	    <p>Amber includes an integrated development environment with a class browser, workspace, transcript, object inspector and debugger.</p> 
+	    <p>Amber is written in itself, including the compiler, and compiles into efficient JavaScript, mapping one-to-one with the JS equivalent.</p> 
+	    <h2>Give it a try!</h2>
+	    <p><b>Try a <button onClick="smalltalk.Browser._open()"> Class browser</button> right now!</b></p> 
+	  </div> 
+	  <div class="column">
+	    <h2>Getting started</h2>
+	    <p>The <a href="https://github.com/NicolasPetton/amber/wiki">Wiki on GitHub</a> includes a <a href="https://github.com/NicolasPetton/amber/wiki/Getting-started">Getting started</a> tutorial for OSX, Linux and Windows.</p>
+	    <p>If you're new to Smalltalk, You can learn it online with <a href="http://amber-lang.net/learn.html">ProfStef</a>.</p>
+	    <h2>Join the community</h2>
+	    <ul>
+	      <li><a href="http://amber-lang.net">Amber's website</a></li>
+	      <li><a href="https://github.com/NicolasPetton/amber/wiki">Wiki on GitHub</a></li>
+	      <li><a href="http://groups.google.com/group/amber-lang">Mailing list</a></li>
+	      <li>Join us on IRC at #amber-lang on Freenode</li>
+	    </ul>
+	  </div>
+	  <div class="clear"></div> 
+	</div> 
+	
+	
+      </div> 
+      
+      <div id="content"> 
+	<div class="main"> 
+	  <div class="box"> 
+	    <h2>Client-side usage</h2> 
+	    <div class="content"> 
+	      <p>Load the full Amber Smalltalk environment with the IDE in your page:</p> 
+	      
+	      <code><pre>&lt;script src="js/amber.js" type="text/javascript"&gt;&lt;/script&gt;
+		  &lt;script type="text/javascript"&gt; loadAmber()&lt;/script&gt;</pre></code>
+	    </div> 
+	    
+	    
+	    <p>Or the deployment JavaScript file only (without the Smalltalk sources, parser, compiler and IDE):</p>
+	    <code><pre>&lt;script src="js/amber.js" type="text/javascript"&gt;&lt;/script&gt;
+		&lt;script type="text/javascript"&gt; loadAmber({deploy: true})&lt;/script&gt;</pre></code>
+	  </div> 
+	  
+	  <div class="box last examples"> 
+	    <h2>Examples</h2> 
+	    <div class="content"> 
+	      <ul>
+		<li>
+		  <a href="examples/trysmalltalk/index.html">
+		    <img src="images/profstef.png" alt="Learn Smalltalk with ProfStef"/>
+		  </a>
+		</li>
+		<li>
+		  <a href="examples/presentation/index.html">
+		    <img src="images/presentation.png" alt="ESUG 2011 presentation"/>
+		  </a>
+		</li>
+		<li>
+		  <a href="examples/twitterwall/index.html">
+		    <img src="images/twitterwall.png" alt="Twitter Wall"/>
+		  </a>
+		</li>
+		<div class="clear"></div>
+	      </ul>
+	    </div> 
+	  </div> 
+	  
+	</div> 
+      </div> 
+    </div> 
+    
+    <script type='text/javascript'> loadAmber() </script> 
+    
+  </body> 
+</html> 

+ 107 - 0
js/Kernel-Announcements.deploy.js

@@ -0,0 +1,107 @@
+smalltalk.addPackage('Kernel-Announcements', {});
+smalltalk.addClass('Announcer', smalltalk.Object, ['registry', 'subscriptions'], 'Kernel-Announcements');
+smalltalk.addMethod(
+'_initialize',
+smalltalk.method({
+selector: 'initialize',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_initialize", [], smalltalk.Object);
+self['@subscriptions']=smalltalk.send((smalltalk.OrderedCollection || OrderedCollection), "_new", []);
+return self;}
+}),
+smalltalk.Announcer);
+
+smalltalk.addMethod(
+'_on_do_',
+smalltalk.method({
+selector: 'on:do:',
+fn: function (aClass, aBlock){
+var self=this;
+smalltalk.send(self['@subscriptions'], "_add_", [(function($rec){smalltalk.send($rec, "_block_", [aBlock]);smalltalk.send($rec, "_announcementClass_", [aClass]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.AnnouncementSubscription || AnnouncementSubscription), "_new", []))]);
+return self;}
+}),
+smalltalk.Announcer);
+
+smalltalk.addMethod(
+'_announce_',
+smalltalk.method({
+selector: 'announce:',
+fn: function (anAnnouncement){
+var self=this;
+smalltalk.send(self['@subscriptions'], "_do_", [(function(each){return smalltalk.send(each, "_deliver_", [anAnnouncement]);})]);
+return self;}
+}),
+smalltalk.Announcer);
+
+
+
+smalltalk.addClass('AnnouncementSubscription', smalltalk.Object, ['block', 'announcementClass'], 'Kernel-Announcements');
+smalltalk.addMethod(
+'_announcementClass',
+smalltalk.method({
+selector: 'announcementClass',
+fn: function (){
+var self=this;
+return self['@announcementClass'];
+return self;}
+}),
+smalltalk.AnnouncementSubscription);
+
+smalltalk.addMethod(
+'_announcementClass_',
+smalltalk.method({
+selector: 'announcementClass:',
+fn: function (aClass){
+var self=this;
+self['@announcementClass']=aClass;
+return self;}
+}),
+smalltalk.AnnouncementSubscription);
+
+smalltalk.addMethod(
+'_block',
+smalltalk.method({
+selector: 'block',
+fn: function (){
+var self=this;
+return self['@block'];
+return self;}
+}),
+smalltalk.AnnouncementSubscription);
+
+smalltalk.addMethod(
+'_block_',
+smalltalk.method({
+selector: 'block:',
+fn: function (aBlock){
+var self=this;
+self['@block']=aBlock;
+return self;}
+}),
+smalltalk.AnnouncementSubscription);
+
+smalltalk.addMethod(
+'_deliver_',
+smalltalk.method({
+selector: 'deliver:',
+fn: function (anAnnouncement){
+var self=this;
+((($receiver = smalltalk.send(self, "_handlesAnnouncement_", [anAnnouncement])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_block", []), "_value_", [anAnnouncement]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_block", []), "_value_", [anAnnouncement]);})]));
+return self;}
+}),
+smalltalk.AnnouncementSubscription);
+
+smalltalk.addMethod(
+'_handlesAnnouncement_',
+smalltalk.method({
+selector: 'handlesAnnouncement:',
+fn: function (anAnnouncement){
+var self=this;
+return smalltalk.send(anAnnouncement, "_isKindOf_", [smalltalk.send(self, "_announcementClass", [])]);
+return self;}
+}),
+smalltalk.AnnouncementSubscription);
+
+
+

+ 152 - 0
js/Kernel-Announcements.js

@@ -0,0 +1,152 @@
+smalltalk.addPackage('Kernel-Announcements', {});
+smalltalk.addClass('Announcer', smalltalk.Object, ['registry', 'subscriptions'], 'Kernel-Announcements');
+smalltalk.addMethod(
+unescape('_initialize'),
+smalltalk.method({
+selector: unescape('initialize'),
+category: 'initialization',
+fn: function (){
+var self=this;
+smalltalk.send(self, "_initialize", [], smalltalk.Object);
+self['@subscriptions']=smalltalk.send((smalltalk.OrderedCollection || OrderedCollection), "_new", []);
+return self;},
+args: [],
+source: unescape('initialize%0A%09super%20initialize.%0A%09subscriptions%20%3A%3D%20OrderedCollection%20new'),
+messageSends: ["initialize", "new"],
+referencedClasses: ["OrderedCollection"]
+}),
+smalltalk.Announcer);
+
+smalltalk.addMethod(
+unescape('_on_do_'),
+smalltalk.method({
+selector: unescape('on%3Ado%3A'),
+category: 'subscribing',
+fn: function (aClass, aBlock){
+var self=this;
+smalltalk.send(self['@subscriptions'], "_add_", [(function($rec){smalltalk.send($rec, "_block_", [aBlock]);smalltalk.send($rec, "_announcementClass_", [aClass]);return smalltalk.send($rec, "_yourself", []);})(smalltalk.send((smalltalk.AnnouncementSubscription || AnnouncementSubscription), "_new", []))]);
+return self;},
+args: ["aClass", "aBlock"],
+source: unescape('on%3A%20aClass%20do%3A%20aBlock%0A%09subscriptions%20add%3A%20%28AnnouncementSubscription%20new%0A%09%09block%3A%20aBlock%3B%0A%09%09announcementClass%3A%20aClass%3B%0A%09%09yourself%29'),
+messageSends: ["add:", "block:", "announcementClass:", "yourself", "new"],
+referencedClasses: ["AnnouncementSubscription"]
+}),
+smalltalk.Announcer);
+
+smalltalk.addMethod(
+unescape('_announce_'),
+smalltalk.method({
+selector: unescape('announce%3A'),
+category: 'announcing',
+fn: function (anAnnouncement){
+var self=this;
+smalltalk.send(self['@subscriptions'], "_do_", [(function(each){return smalltalk.send(each, "_deliver_", [anAnnouncement]);})]);
+return self;},
+args: ["anAnnouncement"],
+source: unescape('announce%3A%20anAnnouncement%0A%09subscriptions%20do%3A%20%5B%3Aeach%20%7C%0A%09%09each%20deliver%3A%20anAnnouncement%5D'),
+messageSends: ["do:", "deliver:"],
+referencedClasses: []
+}),
+smalltalk.Announcer);
+
+
+
+smalltalk.addClass('AnnouncementSubscription', smalltalk.Object, ['block', 'announcementClass'], 'Kernel-Announcements');
+smalltalk.addMethod(
+unescape('_announcementClass'),
+smalltalk.method({
+selector: unescape('announcementClass'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@announcementClass'];
+return self;},
+args: [],
+source: unescape('announcementClass%0A%09%5EannouncementClass'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.AnnouncementSubscription);
+
+smalltalk.addMethod(
+unescape('_announcementClass_'),
+smalltalk.method({
+selector: unescape('announcementClass%3A'),
+category: 'accessing',
+fn: function (aClass){
+var self=this;
+self['@announcementClass']=aClass;
+return self;},
+args: ["aClass"],
+source: unescape('announcementClass%3A%20aClass%0A%09announcementClass%20%3A%3D%20aClass'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.AnnouncementSubscription);
+
+smalltalk.addMethod(
+unescape('_block'),
+smalltalk.method({
+selector: unescape('block'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return self['@block'];
+return self;},
+args: [],
+source: unescape('block%0A%09%5Eblock'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.AnnouncementSubscription);
+
+smalltalk.addMethod(
+unescape('_block_'),
+smalltalk.method({
+selector: unescape('block%3A'),
+category: 'accessing',
+fn: function (aBlock){
+var self=this;
+self['@block']=aBlock;
+return self;},
+args: ["aBlock"],
+source: unescape('block%3A%20aBlock%0A%09block%20%3A%3D%20aBlock'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.AnnouncementSubscription);
+
+smalltalk.addMethod(
+unescape('_deliver_'),
+smalltalk.method({
+selector: unescape('deliver%3A'),
+category: 'announcing',
+fn: function (anAnnouncement){
+var self=this;
+((($receiver = smalltalk.send(self, "_handlesAnnouncement_", [anAnnouncement])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_block", []), "_value_", [anAnnouncement]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_block", []), "_value_", [anAnnouncement]);})]));
+return self;},
+args: ["anAnnouncement"],
+source: unescape('deliver%3A%20anAnnouncement%0A%09%28self%20handlesAnnouncement%3A%20anAnnouncement%29%0A%09%09ifTrue%3A%20%5Bself%20block%20value%3A%20anAnnouncement%5D'),
+messageSends: ["ifTrue:", "handlesAnnouncement:", "value:", "block"],
+referencedClasses: []
+}),
+smalltalk.AnnouncementSubscription);
+
+smalltalk.addMethod(
+unescape('_handlesAnnouncement_'),
+smalltalk.method({
+selector: unescape('handlesAnnouncement%3A'),
+category: 'announcing',
+fn: function (anAnnouncement){
+var self=this;
+return smalltalk.send(anAnnouncement, "_isKindOf_", [smalltalk.send(self, "_announcementClass", [])]);
+return self;},
+args: ["anAnnouncement"],
+source: unescape('handlesAnnouncement%3A%20anAnnouncement%0A%09%5EanAnnouncement%20isKindOf%3A%20self%20announcementClass'),
+messageSends: ["isKindOf:", "announcementClass"],
+referencedClasses: []
+}),
+smalltalk.AnnouncementSubscription);
+
+
+

+ 2 - 0
js/amber.js

@@ -53,6 +53,7 @@ amber = (function() {
 					'Kernel-Collections.deploy',
 					'Kernel-Exceptions.deploy',
 					'Kernel-Transcript.deploy',
+					'Kernel-Announcements.deploy',
 					'Canvas.deploy'
 					]);
 		} else {
@@ -66,6 +67,7 @@ amber = (function() {
 				'Kernel-Collections',
 				'Kernel-Exceptions',
 				'Kernel-Transcript',
+				'Kernel-Announcements',
 				'Canvas',
 				'Compiler',
 				'parser',

+ 61 - 0
st/Kernel-Announcements.st

@@ -0,0 +1,61 @@
+Smalltalk current createPackage: 'Kernel-Announcements' properties: #{}!
+Object subclass: #Announcer
+	instanceVariableNames: 'registry subscriptions'
+	category: 'Kernel-Announcements'!
+
+!Announcer methodsFor: 'announcing'!
+
+announce: anAnnouncement
+	subscriptions do: [:each |
+		each deliver: anAnnouncement]
+! !
+
+!Announcer methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	subscriptions := OrderedCollection new
+! !
+
+!Announcer methodsFor: 'subscribing'!
+
+on: aClass do: aBlock
+	subscriptions add: (AnnouncementSubscription new
+		block: aBlock;
+		announcementClass: aClass;
+		yourself)
+! !
+
+Object subclass: #AnnouncementSubscription
+	instanceVariableNames: 'block announcementClass'
+	category: 'Kernel-Announcements'!
+
+!AnnouncementSubscription methodsFor: 'accessing'!
+
+announcementClass
+	^announcementClass
+!
+
+announcementClass: aClass
+	announcementClass := aClass
+!
+
+block
+	^block
+!
+
+block: aBlock
+	block := aBlock
+! !
+
+!AnnouncementSubscription methodsFor: 'announcing'!
+
+deliver: anAnnouncement
+	(self handlesAnnouncement: anAnnouncement)
+		ifTrue: [self block value: anAnnouncement]
+!
+
+handlesAnnouncement: anAnnouncement
+	^anAnnouncement isKindOf: self announcementClass
+! !
+