Browse Source

Putting an association sets an attribute.

Herbert Vojčík 9 years ago
parent
commit
b158007622
2 changed files with 50 additions and 3 deletions
  1. 25 1
      src/Silk.js
  2. 25 2
      src/Silk.st

+ 25 - 1
src/Silk.js

@@ -6,7 +6,7 @@ $core.packages["Silk"].transport = {"type":"amd","amdNamespace":"silk"};
 
 $core.addClass('Silk', $globals.Domite, [], 'Silk');
 //>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.Silk.comment="I am adding convenience APIs to my subclass, `Domite`.\x0a\x0a##Rendering\x0a\x0a - `aSilk << anObject` uses double-dispatch via `renderOnSilk:`. This allows creating widgets (no formal superclass, anything with `renderOnSilk:` is a widget), as well as incorporating blocks: `aSilk << aBlock` runs the block, passing aSilk as a parameter.\x0a\x0a##Convenience\x0a\x0a - `aCssSelectorString asSilk` returns Silk wrapping an element at a selector.\x0a - `anObject inSilk` returns anObject rendered in a document fragment.\x0a\x0a##Element creation\x0a\x0aThese messages use DNU to dynamically create\x0aelements with any (letters-and-numbers) tag name,\x0aNext samples show this on an example of `<div>`.\x0a\x0a - `Silk DIV` is shortcut for `Silk newElement: 'div'`.\x0a - `aSilk DIV` is shortcut for `[ |tmp| tmp := Silk DIV. aSilk << tmp. tmp] value`. IOW, it not just creates the element and returns it, but also puts in on aSilk.\x0a - `aSilk DIV: anObject` is shortcut for `aSilk DIV << anObject; yourself`. IOW, it not just creates and insert the element, but puts a content into it.";
+$globals.Silk.comment="I am adding convenience APIs to my subclass, `Domite`.\x0a\x0a##Rendering\x0a\x0a - `aSilk << anObject` uses double-dispatch via `renderOnSilk:`. This allows creating widgets (no formal superclass, anything with `renderOnSilk:` is a widget), as well as incorporating magic on other objects:\x0a   - blocks: `aSilk << aBlock` runs the block, passing aSilk as a parameter.\x0a   - associations: `aSilk << (key -> value)` set attribute key to value.\x0a\x0aIt is good to note that rendering collection has magic\x0aof its own built-in in general: if you `stream << aCollection`, its items are `<<`'d in sequence.\x0aSo, de facto, array are deeply flattened\x0awhen putting on a stream via `<<`.\x0a\x0a##Convenience\x0a\x0a - `aCssSelectorString asSilk` returns Silk wrapping an element at a selector.\x0a - `anObject inSilk` returns anObject rendered in a document fragment.\x0a\x0a##Element creation\x0a\x0aThese messages use DNU to dynamically create\x0aelements with any (letters-and-numbers) tag name,\x0aNext samples show this on an example of `<div>`.\x0a\x0a - `Silk DIV` is shortcut for `Silk newElement: 'div'`.\x0a - `aSilk DIV` is shortcut for `[ |tmp| tmp := Silk DIV. aSilk << tmp. tmp] value`. IOW, it not just creates the element and returns it, but also puts in on aSilk.\x0a - `aSilk DIV: anObject` is shortcut for `aSilk DIV << anObject; yourself`. IOW, it not just creates and insert the element, but puts a content into it.\x0a\x0a##Conclusions\x0a\x0aTaken all this together, one can do pretty neat constructs:\x0a\x0a```\x0a  aSilk P: { 'id'->'mission'. 'We are the champions.' }\x0a```\x0a\x0aadds `<p id=\x22mission\x22>We are the champions.</p>` into `aSilk`.";
 //>>excludeEnd("ide");
 $core.addMethod(
 $core.method({
@@ -176,6 +176,30 @@ messageSends: ["selector", "ifFalse:", "=", "asUppercase", "doesNotUnderstand:",
 }),
 $globals.Silk.klass);
 
+$core.addMethod(
+$core.method({
+selector: "renderOnSilk:",
+protocol: '*Silk',
+fn: function (aSilk){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$recv(aSilk)._attrAt_put_(self["@key"],self["@value"]);
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"renderOnSilk:",{aSilk:aSilk},$globals.Association)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aSilk"],
+source: "renderOnSilk: aSilk\x0a\x09aSilk attrAt: key put: value",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["attrAt:put:"]
+}),
+$globals.Association);
+
 $core.addMethod(
 $core.method({
 selector: "renderOnSilk:",

+ 25 - 2
src/Silk.st

@@ -7,7 +7,14 @@ I am adding convenience APIs to my subclass, `Domite`.
 
 ##Rendering
 
- - `aSilk << anObject` uses double-dispatch via `renderOnSilk:`. This allows creating widgets (no formal superclass, anything with `renderOnSilk:` is a widget), as well as incorporating blocks: `aSilk << aBlock` runs the block, passing aSilk as a parameter.
+ - `aSilk << anObject` uses double-dispatch via `renderOnSilk:`. This allows creating widgets (no formal superclass, anything with `renderOnSilk:` is a widget), as well as incorporating magic on other objects:
+   - blocks: `aSilk << aBlock` runs the block, passing aSilk as a parameter.
+   - associations: `aSilk << (key -> value)` set attribute key to value.
+
+It is good to note that rendering collection has magic
+of its own built-in in general: if you `stream << aCollection`, its items are `<<`'d in sequence.
+So, de facto, array are deeply flattened
+when putting on a stream via `<<`.
 
 ##Convenience
 
@@ -22,7 +29,17 @@ Next samples show this on an example of `<div>`.
 
  - `Silk DIV` is shortcut for `Silk newElement: 'div'`.
  - `aSilk DIV` is shortcut for `[ |tmp| tmp := Silk DIV. aSilk << tmp. tmp] value`. IOW, it not just creates the element and returns it, but also puts in on aSilk.
- - `aSilk DIV: anObject` is shortcut for `aSilk DIV << anObject; yourself`. IOW, it not just creates and insert the element, but puts a content into it.!
+ - `aSilk DIV: anObject` is shortcut for `aSilk DIV << anObject; yourself`. IOW, it not just creates and insert the element, but puts a content into it.
+
+##Conclusions
+
+Taken all this together, one can do pretty neat constructs:
+
+```
+  aSilk P: { 'id'->'mission'. 'We are the champions.' }
+```
+
+adds `<p id="mission">We are the champions.</p>` into `aSilk`.!
 
 !Silk methodsFor: 'writing'!
 
@@ -67,6 +84,12 @@ doesNotUnderstand: aMessage
 	^ self newElement: selector asLowercase
 ! !
 
+!Association methodsFor: '*Silk'!
+
+renderOnSilk: aSilk
+	aSilk attrAt: key put: value
+! !
+
 !BlockClosure methodsFor: '*Silk'!
 
 renderOnSilk: aSilk