This commit is contained in:
ido 2015-08-02 17:16:55 +03:00
parent 731f8d8b1f
commit 0e744736ce
6 changed files with 10 additions and 25 deletions

View File

@ -18,7 +18,6 @@ var propsTemplate = _.template('mergeProps( <%= generatedProps %>, <%= rtProps %
var propsMergeFunction = 'function mergeProps(inline,external) {\n var res = _.assign({},inline,external)\nif (inline.hasOwnProperty(\'style\')) {\n res.style = _.defaults(res.style, inline.style);\n}\n' +
' if (inline.hasOwnProperty(\'className\') && external.hasOwnProperty(\'className\')) {\n' +
' res.className = external.className + \' \' + inline.className;\n} return res;\n}\n';
//var classSetTemplate = _.template('React.addons.classSet(<%= classSet %>)');
var classSetTemplate = _.template('_.keys(_.pick(<%= classSet %>, _.identity)).join(" ")');
var simpleTagTemplate = _.template('<%= name %>(<%= props %><%= children %>)');
var tagTemplate = _.template('<%= name %>.apply(this, [<%= props %><%= children %>])');
@ -55,7 +54,7 @@ var classAttr = 'class';
var scopeAttr = 'rt-scope';
var propsAttr = 'rt-props';
var defaultOptions = {modules: 'amd', version: false, force: false, format: 'stylish', targetVersion: '0.13.1'};
var defaultOptions = {modules: 'amd', version: false, force: false, format: 'stylish', targetVersion: '0.13.1', reactImportPath: 'react/addons', lodashImportPath: 'lodash'};
/**
* @param {Context} context
@ -230,7 +229,7 @@ function generateProps(node, context) {
var existing = props[propKey] ? props[propKey] + ' + " " + ' : '';
if (key === classSetAttr) {
props[propKey] = existing + classSetTemplate({classSet: val});
} else if (key === classAttr) {
} else if (key === classAttr || key === classNameProp) {
props[propKey] = existing + convertText(node, context, val.trim());
}
} else if (key.indexOf('rt-') !== 0) {
@ -402,12 +401,6 @@ function convertHtmlToReact(node, context) {
}
}
//function removeDocType(html) {
// html = html.replace(/^\s*\<\!doctype\s+rt\s*>/mi, function () {
// return '';
// });
// return html;
//}
/**
* @param node
* @return {boolean}
@ -416,15 +409,10 @@ function isTag(node) {
return node.type === 'tag';
}
//function isEmptyText(node) {
// return node.type === 'text' && /^\s*$/g.test(node.data);
//}
function handleSelfClosingHtmlTags(nodes) {
return _(nodes)
.map(function (node) {
var externalNodes = [];
//node.children = _.reject(node.children, isEmptyText);
node.children = handleSelfClosingHtmlTags(node.children);
if (node.type === 'tag' && _.contains(htmlSelfClosingTags, node.name)) {
externalNodes = _.filter(node.children, isTag);
@ -470,11 +458,9 @@ function convertRT(html, reportContext, options) {
var rootNode = cheerio.load(html, {lowerCaseTags: false, lowerCaseAttributeNames: false, xmlMode: true, withStartIndices: true});
options = _.defaults({}, options, defaultOptions);
var reactPath = options.reactImportPath || 'react/addons';
var lodashPath = options.lodashImportPath || 'lodash';
var defaultDefines = {};
defaultDefines[reactPath] = 'React';
defaultDefines[lodashPath] = '_';
defaultDefines[options.reactImportPath] = 'React';
defaultDefines[options.lodashImportPath] = '_';
var defines = options.defines ? _.clone(options.defines) : defaultDefines;
@ -493,11 +479,7 @@ function convertRT(html, reportContext, options) {
} else if (tag.children.length) {
throw RTCodeError.build('rt-require may have no children', context, tag);
}
//if (options.modules === 'typescript') {
// defines['./' + tag.attribs.dependency] = tag.attribs.as;
//} else {
defines[tag.attribs.dependency] = tag.attribs.as;
//}
} else if (firstTag === null) {
firstTag = tag;
} else {
@ -527,7 +509,6 @@ function convertRT(html, reportContext, options) {
tree = escodegen.attachComments(tree, tree.comments, tree.tokens);
code = escodegen.generate(tree, {comment: true});
} catch (e) {
//console.log(code);
throw new RTCodeError(e.message, e.index, -1);
}
}

1
test/data/className.rt Normal file
View File

@ -0,0 +1 @@
<div className="a"></div>

View File

@ -0,0 +1 @@
<div class="a"></div>

View File

@ -2,4 +2,5 @@
<div class="f g-{1+2} h-i" rt-class="{'a': true, b: false, c: 1, 'd-e': true}"></div>
Order should not matter
<div rt-class="{'a': true, b: false, c: 1, 'd-e': true}" class="f g-{1+2} h-i"></div>
<div className="a"></div>
</div>

View File

@ -1 +1 @@
<div><div class="f g-3 h-i a c d-e"></div>Order should not matter<div class="a c d-e f g-3 h-i"></div></div>
<div><div class="f g-3 h-i a c d-e"></div>Order should not matter<div class="a c d-e f g-3 h-i"></div><div class="a"></div></div>

View File

@ -178,7 +178,8 @@ function normalizeHtml(html) {
}
test('html tests', function (t) {
var files = ['scope.rt', 'scope-trailing-semicolon.rt', 'scope-variable-references.rt', 'lambda.rt', 'eval.rt', 'props.rt', 'custom-element.rt', 'style.rt', 'concat.rt', 'js-in-attr.rt', 'props-class.rt', 'rt-class.rt'];
var files = ['scope.rt', 'scope-trailing-semicolon.rt', 'scope-variable-references.rt', 'lambda.rt', 'eval.rt', 'props.rt', 'custom-element.rt', 'style.rt', 'concat.rt',
'js-in-attr.rt', 'props-class.rt', 'rt-class.rt', 'className.rt'];
t.plan(files.length);
files.forEach(check);