Skip to content

Commit 005690e

Browse files
author
Sergey Zarouski
committed
Merge pull request #6 from szarouski/developer
add an option to add JSX component code example before source_example
2 parents 33c98b0 + 9035f3c commit 005690e

4 files changed

Lines changed: 73 additions & 2 deletions

File tree

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,17 @@ In order to show just JSX markup, instead of rendered markup, you can use `.src-
134134
</div>
135135
</section>
136136
```
137+
138+
Alternatively you can import `sourcejs-react/SourceExample.jsx`:
139+
```js
140+
var SourceExample = require('sourcejs-react/SourceExample.jsx');
141+
```
142+
and use it like in example below inside render method, code block will be auto-generated for you:
143+
```html
144+
<section className="source_section">
145+
<h2>Button (Purple)</h2>
146+
<SourceExample extraClasses="you addition class names">
147+
<Button color="purple">Btn Copy Gibson Reg; 1.2em</Button>
148+
</SourceExample>
149+
</section>
150+
```

SourceExample.jsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
'use strict';
2+
var React = require('react/addons');
3+
module.exports = React.createClass({
4+
displayName: 'SourceExample',
5+
propTypes: {
6+
children: React.PropTypes.element.isRequired,
7+
extraClasses: React.PropTypes.string
8+
},
9+
getDefaultProps: function getDefaultProps() {
10+
return {
11+
extraClasses: ''
12+
};
13+
},
14+
render: function render() {
15+
return (
16+
<div className={`source_example ${this.props.extraClasses}`}>
17+
{this.props.children}
18+
</div>
19+
);
20+
}
21+
});

core/middleware/index.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
require('node-jsx').install({extension: '.jsx', harmony: true});
44
var React = require('react/addons');
5+
var JSXTransformer = require('react/dist/JSXTransformer');
56
var path = require('path');
7+
var fs = require('fs');
68
var _ = require('lodash');
79

810
/*
@@ -22,7 +24,17 @@ exports.process = function (req, res, next) {
2224
var pathToFile = path.join(global.app.get('user'), req.url);
2325
var html;
2426
try {
25-
var component = React.createFactory(require(pathToFile));
27+
var matchingPattern = /<SourceExample((?:.|\n)*?)>\s*((?:.|\n)+?)\n\s*?<\/SourceExample>/g;
28+
//noinspection HtmlUnknownAttribute
29+
var replacementPattern = '<code className="src-html source_visible">{`$2`}</code>' +
30+
'<SourceExample$1>$2</SourceExample>';
31+
var specContents = fs.readFileSync(pathToFile, {
32+
encoding: 'utf-8'
33+
}).replace(matchingPattern, replacementPattern);
34+
specContents = JSXTransformer.transform(specContents, {
35+
harmony: true
36+
}).code;
37+
var component = React.createFactory(requireCode(specContents, pathToFile));
2638
html = getHtml(component);
2739
} catch (ex) {
2840
html = getErrorAsHtml(ex);
@@ -33,6 +45,30 @@ exports.process = function (req, res, next) {
3345
next();
3446
};
3547

48+
function requireCode(code, pathToCode) {
49+
var path = require('path');
50+
var Module = require('module').Module;
51+
52+
var filepath = path.resolve(process.cwd(), pathToCode);
53+
var dirname = path.dirname(filepath);
54+
55+
var cachedModule = Module._cache[filepath];
56+
if (cachedModule) {
57+
return cachedModule.exports;
58+
}
59+
60+
var mod = new Module(filepath, module);
61+
Module._cache[filepath] = mod;
62+
63+
mod.filename = filepath;
64+
mod.paths = Module._nodeModulePaths(dirname);
65+
66+
mod._compile(code, filepath);
67+
mod.loaded = true;
68+
69+
return mod.exports;
70+
}
71+
3672
function getHtml(component) {
3773
try {
3874
return React.renderToString(component({}));

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sourcejs-react",
3-
"version": "1.0.0",
3+
"version": "1.1.0",
44
"description": "React middleware for sourcejs.com",
55
"main": "index.js",
66
"dependencies": {

0 commit comments

Comments
 (0)