Skip to content

Commit 696d489

Browse files
committed
fix code indentation display, added example of radio usage
1 parent 6b47b2d commit 696d489

File tree

4 files changed

+114
-25
lines changed

4 files changed

+114
-25
lines changed

lesson2.html

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,31 @@
99
<script src="lib/prism.js"></script>
1010
<script src="lib/JSXTransformer.js"></script>
1111
<script id="sourceView">
12+
function fixExtraIndent(content) {
13+
function countspace(line) {
14+
var r = line.match(/^\s*/);
15+
if (!r) return 0;
16+
return r[0].length;
17+
}
18+
19+
var lines = content.split(/\n/);
20+
var returnlines = []
21+
var guttersize = null;
22+
_.each(lines, function(line) {
23+
if (guttersize == null) {
24+
var gspace = countspace(line)
25+
if (gspace == line.length) {
26+
return;
27+
} else {
28+
guttersize = gspace;
29+
}
30+
}
31+
returnlines.push(line.substr(guttersize));
32+
});
33+
return returnlines.join("\n");
34+
}
35+
1236
var SourceCode = React.createClass({
13-
//define our prop/attribute types
1437
propTypes: {
1538
sourceId: React.PropTypes.string,
1639
language: React.PropTypes.string,
@@ -23,19 +46,18 @@
2346
},
2447
getInitialState: function() {
2548
return {
26-
source: document.getElementById(this.props.sourceId).innerHTML
49+
source: fixExtraIndent(document.getElementById(this.props.sourceId).innerHTML)
2750
};
2851
},
29-
//refresh Prism on state change
3052
componentDidMount: function() {
3153
Prism.highlightElement(this.refs.source.getDOMNode());
3254
},
3355
componentDidUpdate: function() {
3456
Prism.highlightElement(this.refs.source.getDOMNode());
3557
},
3658
refreshCode: function() {
37-
if (!this.props.liveEdit) return;
3859
var code = this.refs.source.getDOMNode().innerText;
60+
if (!code) return;
3961
try {
4062
var result = JSXTransformer.transform(code)
4163
var jscode = result['code']
@@ -56,14 +78,11 @@
5678
ref: "source"}, this.state.source));
5779
}
5880
});
59-
window.SourceCode = SourceCode;
6081

6182
(function(d, w){
6283
window.addEventListener("load", function() {
63-
//Register our own jsx language
6484
Prism.languages.jsx = _.merge({}, Prism.languages.javascript, Prism.languages.markup);
6585

66-
//mount SourceCode for each element with class of sourceCode
6786
_.each(d.querySelectorAll(".sourceCode"), function(el) {
6887
React.renderComponent(SourceCode({sourceId: el.dataset.source,
6988
language: el.dataset.language,
@@ -158,18 +177,17 @@
158177
newItems.splice(number, 1);
159178
this.setState({items: newItems});
160179
},
180+
renderItem: function(item, index) {
181+
return <li key={index}>
182+
{item}
183+
{/*bind callback to the index of this item*/}
184+
<button onClick={this.remove.bind(this, index)}>Remove</button>
185+
</li>
186+
},
161187
render: function() {
162-
//keep this object around since we will be rendering in an anonymous function
163-
var self = this;
164188
return <div>
165189
<ul>
166-
{_.map(this.state.items, function(item, number) {
167-
return <li key={number}>
168-
{item}
169-
{/*bind callback to the index of this item*/}
170-
<button onClick={self.remove.bind(self, number)}>Remove</button>
171-
</li>
172-
})}
190+
{_.map(this.state.items, this.renderItem)}
173191
</ul>
174192
<fieldset><input ref="newItem" type="text"/></fieldset>
175193
<button onClick={this.add}>Add</button>
@@ -192,7 +210,6 @@ <h1>Rendering a List</h1>
192210
<li>Use "map" to iterate over items and emit virtual DOM</li>
193211
<li>Specify "key" attribute to distinguish each item in the virtual DOM</li>
194212
<li>Construct the DOM in the order that it will be rendered</li>
195-
<li>Define other render methods to keep the main render function simple</li>
196213
</ul>
197214
<div class="result" id="renderList"></div>
198215
</div>
@@ -223,6 +240,7 @@ <h1>Binding data to callbacks</h1>
223240
<ul>
224241
<li>function.bind(this, arg1, arg2, ...)</li>
225242
<li>embed callback data from the rendering cycle to the callback</li>
243+
<li>Define other render methods to keep the main render function simple</li>
226244
</ul>
227245
<div class="result" id="todoList"></div>
228246
</div>

lesson3.html

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,77 @@
11
<html>
22
<head>
3-
<title>Syntax, Componets, Properties, State, Events</title>
3+
<title>Messages, Ajax &amp; Routes</title>
44
<link href="lib/bootstrap.css" rel="stylesheet" />
55
<link href="lib/prism.css" rel="stylesheet" />
66
<link href="lib/style.css" rel="stylesheet" type="text/css" media="all" />
77
<script src="lib/lodash.min.js"></script>
8+
<script src="lib/radio.min.js"></script>
89
<script src="lib/react.js"></script>
910
<script src="lib/prism.js"></script>
1011
<script src="lib/JSXTransformer.js"></script>
1112
<script src="lib/sourceview.js"></script>
1213
<script type="text/jsx" id="useMessageSource">
1314
/** @jsx React.DOM */
14-
var UberTag = React.createClass({
15+
var ChatWindow = React.createClass({
16+
getInitialState: function() {
17+
return {
18+
messages: this.props.messages || []
19+
}
20+
},
21+
componentWillMount: function() {
22+
radio(this.props.channel + ".message.received").subscribe(this.receiveMessage);
23+
},
24+
componentWillUnmount: function() {
25+
radio(this.props.channel + ".message.received").unsubscribe(this.receiveMessage);
26+
},
27+
receiveMessage: function(message) {
28+
var messages = this.state.messages;
29+
messages.push(message);
30+
this.setState({messages: messages})
31+
},
32+
renderMessage: function(message) {
33+
return <li key={message.id}>{message.message}</li>
34+
},
35+
sendMessage: function(event) {
36+
var input = this.refs.input;
37+
radio(this.props.channel + ".message.send").broadcast({message: input.state.value});
38+
input.setState({value: ""});
39+
},
1540
render: function() {
16-
return <h3>{this.props.children}</h3>;
41+
return <div>
42+
<h3>Chat Connection</h3>
43+
<ol>
44+
{_.map(this.state.messages, this.renderMessage)}
45+
</ol>
46+
<fieldset>
47+
<input ref="input" type="text"/>
48+
<button onClick={this.sendMessage}>Send</button>
49+
</fieldset>
50+
</div>;
1751
}
1852
});
1953

54+
var ChatConnection = function(channel) {
55+
function send(msg) {
56+
radio(channel + ".message.received").broadcast({
57+
message: msg,
58+
id: _.uniqueId()
59+
});
60+
}
61+
62+
radio(channel + ".message.send").subscribe(function(data) {
63+
send(data.message);
64+
});
65+
66+
send("[Client] Connection established")
67+
};
68+
69+
2070
React.renderComponent(
21-
<UberTag>Hello World</UberTag>,
71+
<ChatWindow channel="chat">Hello World</ChatWindow>,
2272
document.getElementById('useMessage')
2373
);
74+
ChatConnection("chat")
2475
</script>
2576
<script type="text/jsx" id="ajaxSource">
2677
/** @jsx React.DOM */
@@ -85,7 +136,7 @@ <h1>Messages</h1>
85136
<div class="result" id="useMessage"></div>
86137
</div>
87138
<div class="col-sm-8">
88-
<div class="sourceCode" data-source="useMessageSource"></div>
139+
<div class="sourceCode" data-source="useMessageSource" data-edit="true"></div>
89140
</div>
90141
</div>
91142
</section>

lib/radio.min.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/sourceview.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,25 @@
11
function fixExtraIndent(content) {
2-
var lines = content.split(/\n/);
2+
function countspace(line) {
3+
var r = line.match(/^\s*/);
4+
if (!r) return 0;
5+
return r[0].length;
6+
}
37

8+
var lines = content.split(/\n/);
9+
var returnlines = []
10+
var guttersize = null;
11+
_.each(lines, function(line) {
12+
if (guttersize == null) {
13+
var gspace = countspace(line)
14+
if (gspace == line.length) {
15+
return;
16+
} else {
17+
guttersize = gspace;
18+
}
19+
}
20+
returnlines.push(line.substr(guttersize));
21+
});
22+
return returnlines.join("\n");
423
}
524

625
var SourceCode = React.createClass({
@@ -16,7 +35,7 @@ var SourceCode = React.createClass({
1635
},
1736
getInitialState: function() {
1837
return {
19-
source: document.getElementById(this.props.sourceId).innerHTML
38+
source: fixExtraIndent(document.getElementById(this.props.sourceId).innerHTML)
2039
};
2140
},
2241
componentDidMount: function() {
@@ -27,6 +46,7 @@ var SourceCode = React.createClass({
2746
},
2847
refreshCode: function() {
2948
var code = this.refs.source.getDOMNode().innerText;
49+
if (!code) return;
3050
try {
3151
var result = JSXTransformer.transform(code)
3252
var jscode = result['code']
@@ -47,7 +67,6 @@ var SourceCode = React.createClass({
4767
ref: "source"}, this.state.source));
4868
}
4969
});
50-
window.SourceCode = SourceCode;
5170

5271
(function(d, w){
5372
window.addEventListener("load", function() {

0 commit comments

Comments
 (0)