diff --git a/lib/filter/jsx.js b/lib/filter/jsx.js new file mode 100644 index 00000000..ee569d34 --- /dev/null +++ b/lib/filter/jsx.js @@ -0,0 +1,34 @@ +/** +* Changes `class=` to `className=` and 'for=' to `htmlFor=` +* for the sake of JSX! +*/ +if (typeof module === 'object' && typeof define !== 'function') { + var define = function (factory) { + module.exports = factory(require, exports, module); + }; +} + +define(function(require, exports, module) { + var tokenMap = { + 'class=': 'className=', + 'for=': 'htmlFor=' + }; + + function replaceTokens(str) { + Object.keys(tokenMap).forEach(function(k){ + str = str.replace(k, tokenMap[k]); + }) + return str + } + + return function process(tree) { + tree.children.forEach(function(item) { + item.start = replaceTokens(item.start); + item.end = replaceTokens(item.end); + item.content = replaceTokens(item.content); + process(item); + }); + + return tree; + }; +}); diff --git a/lib/filter/main.js b/lib/filter/main.js index e1844fb4..40e6eecc 100644 --- a/lib/filter/main.js +++ b/lib/filter/main.js @@ -17,6 +17,7 @@ define(function(require, exports, module) { html: require('./html'), haml: require('./haml'), jade: require('./jade'), + jsx: require('./jsx'), slim: require('./slim'), xsl: require('./xsl'), css: require('./css'), diff --git a/lib/snippets.json b/lib/snippets.json index 0546da88..2f0df1ff 100644 --- a/lib/snippets.json +++ b/lib/snippets.json @@ -920,6 +920,12 @@ "profile": "xml" }, + "jsx": { + "filters": "html, jsx", + "extends": "html", + "profile": "xml" + }, + "slim": { "filters": "slim", "extends": "html", diff --git a/test/filters.js b/test/filters.js index ad83dd27..fc5e6019 100644 --- a/test/filters.js +++ b/test/filters.js @@ -204,6 +204,21 @@ describe('Filters', function() { }); }); + describe('JSX', function() { + it('should work', function() { + var oldSyntax = editor.getSyntax(); + var oldProfile = editor.getProfileName(); + editor.setSyntax('jsx'); + editor.setProfileName('xml'); + + expand('.foo>input[name="bob"]+label[for="bob"]|html|jsx'); + assert.equal(editor.getContent(), '
\n\t\n\t\n
'); + + editor.setSyntax(oldSyntax); + editor.setProfileName(oldProfile); + }); + }); + describe('Slim', function() { it('should work', function() { var oldSyntax = editor.getSyntax();