mirror of
https://github.com/bobwen-dev/react-templates
synced 2025-04-12 00:56:39 +02:00
playground version 0.0001
This commit is contained in:
parent
4fe2addc17
commit
44703b6600
15
playground/index.html
Normal file
15
playground/index.html
Normal file
@ -0,0 +1,15 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>React templates - Image Search Sample</title>
|
||||
<link rel="stylesheet" href="playground.css"/>
|
||||
</head>
|
||||
<body>
|
||||
<div id="preloader" style="text-align: center;">Loading...</div>
|
||||
<div id="playground">
|
||||
</div>
|
||||
<script src="main.browser.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
47675
playground/main.browser.js
Normal file
47675
playground/main.browser.js
Normal file
File diff suppressed because one or more lines are too long
58
playground/main.js
Normal file
58
playground/main.js
Normal file
@ -0,0 +1,58 @@
|
||||
var reactTemplates = require('../src/reactTemplates');
|
||||
var playgroundTemplate = require('./playground.rt.js');
|
||||
var React = require('react/addons');
|
||||
var _ = require('lodash');
|
||||
|
||||
|
||||
var html = "<div>hello</div>";
|
||||
var res = reactTemplates.convertTemplateToReact(html.trim());
|
||||
console.log(res);
|
||||
|
||||
function emptyFunc() {
|
||||
return null;
|
||||
}
|
||||
|
||||
function generateTemplateFunction(html) {
|
||||
try {
|
||||
var code = reactTemplates.convertTemplateToReact(html.trim().replace(/\r/g,""));
|
||||
var defineMap = {"react":React,"lodash":_};
|
||||
var define = function (requirementsNames,content) {
|
||||
var requirements = _.map(requirementsNames,function (reqName) {
|
||||
return defineMap[reqName];
|
||||
});
|
||||
return content.apply(this,requirements);
|
||||
};
|
||||
var res = eval(code);
|
||||
return res;
|
||||
} catch (e) {
|
||||
return emptyFunc
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var Playground = React.createClass({
|
||||
|
||||
displayName: 'Playground',
|
||||
mixins: [React.addons.LinkedStateMixin],
|
||||
|
||||
getInitialState: function () {
|
||||
var currentState = {
|
||||
templateHTML: '<div>\n hello {this.state.name}\n</div>',
|
||||
templateProps: JSON.stringify({name:"reactTemplates"})
|
||||
};
|
||||
this.templateFunc = generateTemplateFunction(currentState.templateHTML);
|
||||
console.log(this.templateFunc);
|
||||
return currentState;
|
||||
},
|
||||
componentWillUpdate: function (nextProps,nextState) {
|
||||
if (nextState.templateHTML !== this.state.templateHTML) {
|
||||
this.templateFunc = generateTemplateFunction(nextState.templateHTML)
|
||||
}
|
||||
},
|
||||
|
||||
render: function () {
|
||||
return playgroundTemplate.apply(this);
|
||||
}
|
||||
});
|
||||
|
||||
React.render(Playground(),document.getElementById('playground'));
|
8
playground/playground.css
Normal file
8
playground/playground.css
Normal file
@ -0,0 +1,8 @@
|
||||
.hidden {
|
||||
display:none;
|
||||
}
|
||||
|
||||
.large-text-area {
|
||||
width:800px;
|
||||
height:300px;
|
||||
}
|
11
playground/playground.rt
Normal file
11
playground/playground.rt
Normal file
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE rt PlaygroundSample="./playgroundSample">
|
||||
<div>
|
||||
<form>
|
||||
<textarea valueLink="{this.linkState('templateHTML')}" class="large-text-area"></textarea>
|
||||
<br/>
|
||||
<textarea valueLink="{this.linkState('templateProps')}" class="large-text-area"></textarea>
|
||||
</form>
|
||||
<PlaygroundSample renderFunc="{this.templateFunc}" stateString="{this.state.templateProps}">
|
||||
|
||||
</PlaygroundSample>
|
||||
</div>
|
16
playground/playground.rt.js
Normal file
16
playground/playground.rt.js
Normal file
@ -0,0 +1,16 @@
|
||||
var React = require('react');
|
||||
var _ = require('lodash');
|
||||
var PlaygroundSample = require('./playgroundSample');
|
||||
'use strict';
|
||||
module.exports = function () {
|
||||
return React.DOM.div({}, React.DOM.form({}, React.DOM.textarea({
|
||||
'valueLink': this.linkState('templateHTML'),
|
||||
'className': 'large-text-area'
|
||||
}), React.DOM.br({}), React.DOM.textarea({
|
||||
'valueLink': this.linkState('templateProps'),
|
||||
'className': 'large-text-area'
|
||||
})), PlaygroundSample({
|
||||
'renderFunc': this.templateFunc,
|
||||
'stateString': this.state.templateProps
|
||||
}));
|
||||
};
|
27
playground/playgroundSample.js
Normal file
27
playground/playgroundSample.js
Normal file
@ -0,0 +1,27 @@
|
||||
var React = require('react/addons');
|
||||
var _ = require('lodash');
|
||||
var playgroundSample = React.createClass({
|
||||
componentWillReceiveProps: function (nextProps) {
|
||||
if (nextProps.stateString) {
|
||||
try {
|
||||
this.setState(JSON.parse(nextProps.stateString));
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
render: function () {
|
||||
var res = null;
|
||||
try {
|
||||
res = this.props.renderFunc.apply(this)
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
return React.DOM.div.apply(this, _.flatten([
|
||||
{},
|
||||
res
|
||||
]));
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = playgroundSample;
|
24
src/cli.js
24
src/cli.js
@ -8,15 +8,23 @@ var _ = require('lodash');
|
||||
var path = require('path');
|
||||
var reactTemplates = require('./reactTemplates');
|
||||
var pkg = require('../package.json');
|
||||
var options = {commonJS: false};
|
||||
|
||||
if (process.argv.length > 2) {
|
||||
if (process.argv.indexOf('-v') !== -1 || process.argv.indexOf('--version') !== -1) {
|
||||
console.log(pkg.version);
|
||||
} else if (process.argv.indexOf('-h') !== -1 || process.argv.indexOf('--help') !== -1) {
|
||||
printHelp();
|
||||
} else {
|
||||
_.forEach(process.argv.slice(2), handleSingleFile);
|
||||
}
|
||||
var files = [];
|
||||
_.forEach(process.argv.slice(2),function (param) {
|
||||
if (param === '-v' || param === '--version') {
|
||||
console.log(pkg.version);
|
||||
} else if (param === '-h' || param === '--help') {
|
||||
printHelp();
|
||||
} else if (param === '--common') {
|
||||
options.commonJS = true;
|
||||
} else {
|
||||
files.push(param);
|
||||
}
|
||||
});
|
||||
_.forEach(files,handleSingleFile);
|
||||
|
||||
} else {
|
||||
printHelp();
|
||||
}
|
||||
@ -41,7 +49,7 @@ function handleSingleFile(filename) {
|
||||
// var js = reactTemplates.convertTemplateToReact(html);
|
||||
// fs.writeFileSync(filename + '.js', js);
|
||||
try {
|
||||
reactTemplates.convertFile(filename, filename + '.js');
|
||||
reactTemplates.convertFile(filename, filename + '.js', options);
|
||||
} catch (e) {
|
||||
console.log('Error processing file: ' + filename + ', ' + e.description);
|
||||
}
|
||||
|
@ -16,8 +16,8 @@ var classSetTemplate = _.template('React.addons.classSet(<%= classSet %>)');
|
||||
var simpleTagTemplate = _.template('<%= name %>(<%= props %><%= children %>)');
|
||||
var tagTemplate = _.template('<%= name %>.apply(this,_.flatten([<%= props %><%= children %>]))');
|
||||
var commentTemplate = _.template(' /* <%= data %> */ ');
|
||||
var templateTemplate = _.template("define([<%= requirePaths %>], function (<%= requireNames %>) {\n'use strict';\n <%= injectedFunctions %>\nreturn function(){ return <%= body %>};\n});");
|
||||
|
||||
var templateAMDTemplate = _.template("define([<%= requirePaths %>], function (<%= requireNames %>) {\n'use strict';\n <%= injectedFunctions %>\nreturn function(){ return <%= body %>};\n});");
|
||||
var templateCommonJSTemplate = _.template("<%= vars %>\n\n'use strict';\n <%= injectedFunctions %>\nmodule.exports = function(){ return <%= body %>};\n");
|
||||
var templateProp = 'rt-repeat';
|
||||
var ifProp = 'rt-if';
|
||||
var classSetProp = 'rt-class';
|
||||
@ -261,8 +261,9 @@ function extractDefinesFromJSXTag(html, defines) {
|
||||
* @param {string} html
|
||||
* @return {string}
|
||||
*/
|
||||
function convertTemplateToReact(html) {
|
||||
function convertTemplateToReact(html,options) {
|
||||
// var x = cheerio.load(html);
|
||||
options = options || {};
|
||||
var defines = {react: 'React', lodash: '_'};
|
||||
html = extractDefinesFromJSXTag(html, defines);
|
||||
var rootNode = cheerio.load(html.trim(), {lowerCaseTags: false, lowerCaseAttributeNames: false, xmlMode: true});
|
||||
@ -270,9 +271,10 @@ function convertTemplateToReact(html) {
|
||||
var body = convertHtmlToReact(rootNode.root()[0].children[0], context);
|
||||
var requirePaths = _(defines).keys().map(function (reqName) { return '"' + reqName + '"'; }).value().join(',');
|
||||
var requireVars = _(defines).values().value().join(',');
|
||||
var data = {body: body, injectedFunctions: '', requireNames: requireVars, requirePaths: requirePaths};
|
||||
var vars = _(defines).map(function (reqVar,reqPath) {return "var "+reqVar+" = require('"+reqPath+"');"}).join("\n");
|
||||
var data = {body: body, injectedFunctions: '', requireNames: requireVars, requirePaths: requirePaths, vars:vars};
|
||||
data.injectedFunctions = context.injectedFunctions.join('\n');
|
||||
var code = templateTemplate(data);
|
||||
var code = options.commonJS ? templateCommonJSTemplate(data) : templateAMDTemplate(data);
|
||||
try {
|
||||
var tree = esprima.parse(code, {range: true, tokens: true, comment: true});
|
||||
tree = escodegen.attachComments(tree, tree.comments, tree.tokens);
|
||||
@ -288,7 +290,7 @@ function convertTemplateToReact(html) {
|
||||
* @param {string} source
|
||||
* @param {string} target
|
||||
*/
|
||||
function convertFile(source, target) {
|
||||
function convertFile(source, target, options) {
|
||||
// if (path.extname(filename) !== ".html") {
|
||||
// console.log('invalid file, only handle html files');
|
||||
// return;// only handle html files
|
||||
@ -304,7 +306,7 @@ function convertFile(source, target) {
|
||||
if (!html.match(/\<\!doctype rt/i)) {
|
||||
throw new Error('invalid file, missing header');
|
||||
}
|
||||
var js = convertTemplateToReact(html);
|
||||
var js = convertTemplateToReact(html, options);
|
||||
fs.writeFileSync(target, js);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user