react / react-0.13.3 / node_modules / coffee-react / node_modules / coffee-react-transform / lib / serialiser.js
80758 views// Generated by CoffeeScript 1.9.11var $, SPACES_ONLY, Serialiser, TEXT_LEADING_WHITESPACE, TEXT_TRAILING_WHITESPACE, WHITESPACE_ONLY, containsNewlines, entityDecode, exports, find, firstNonWhitespaceChild, genericBranchSerialiser, genericLeafSerialiser, joinList, last, nodeSerialisers, ref, serialise, stringEscape, tagConvention;23ref = require('./helpers'), last = ref.last, find = ref.find;45$ = require('./symbols');67stringEscape = require('./stringescape');89entityDecode = require('./entitydecode');1011module.exports = exports = serialise = function(parseTree) {12return new Serialiser().serialise(parseTree);13};1415Serialiser = (function() {16function Serialiser() {}1718Serialiser.prototype.serialise = function(parseTree) {19var domObjectParts;20if (parseTree.children && parseTree.children.length && parseTree.children[0].type === $.CJSX_PRAGMA) {21this.domObject = parseTree.children[0].value;22} else {23this.domObject = 'React.DOM';24}25domObjectParts = this.domObject.split('.');26if (domObjectParts.length > 0 && domObjectParts[0] !== '') {27this.reactObject = domObjectParts[0];28} else {29this.reactObject = 'React';30}31return this.serialiseNode(parseTree);32};3334Serialiser.prototype.serialiseNode = function(node) {35var serialised;36if (nodeSerialisers[node.type] == null) {37throw new Error("unknown parseTree node type " + node.type);38}39serialised = nodeSerialisers[node.type].call(this, node);40if (!(typeof serialised === 'string' || serialised === null)) {41throw new Error("serialiser " + node.type + " didn\'t return a string");42}43return serialised;44};4546Serialiser.prototype.serialiseSpreadAndPairAttributes = function(children) {47var accumulatedWhitespace, assignIndex, assignItem, assigns, assignsWithWhitespace, child, childIndex, flushPairs, j, joinedAssigns, k, lastAssignWithWhitespace, len, len1, pairAttrsBuffer, ref1, trailingWhiteplace;48assigns = [];49pairAttrsBuffer = [];50flushPairs = (function(_this) {51return function() {52var serialisedChild, serialisedPairs;53if (pairAttrsBuffer.length) {54serialisedChild = _this.serialiseAttributePairs(pairAttrsBuffer);55if (serialisedChild) {56assigns.push({57type: $.CS,58value: serialisedChild59});60} else {61serialisedPairs = pairAttrsBuffer.map(function(p) {62return _this.serialiseNode(p);63}).join('').replace('\n', '\\\n');64assigns.push({65type: $.CJSX_WHITESPACE,66value: serialisedPairs67});68}69return pairAttrsBuffer = [];70}71};72})(this);73if (((ref1 = firstNonWhitespaceChild(children)) != null ? ref1.type : void 0) === $.CJSX_ATTR_SPREAD) {74assigns.push({75type: $.CS,76value: '{}'77});78}79for (childIndex = j = 0, len = children.length; j < len; childIndex = ++j) {80child = children[childIndex];81if (child.type === $.CJSX_ATTR_SPREAD) {82flushPairs();83assigns.push({84type: $.CS,85value: child.value86});87} else {88pairAttrsBuffer.push(child);89}90}91flushPairs();92accumulatedWhitespace = '';93assignsWithWhitespace = [];94for (assignIndex = k = 0, len1 = assigns.length; k < len1; assignIndex = ++k) {95assignItem = assigns[assignIndex];96if (assignItem != null) {97if (assignItem.type === $.CJSX_WHITESPACE) {98accumulatedWhitespace += this.serialiseNode(assignItem);99} else {100assignsWithWhitespace.push(accumulatedWhitespace + this.serialiseNode(assignItem));101accumulatedWhitespace = '';102}103}104}105if (assignsWithWhitespace.length) {106lastAssignWithWhitespace = assignsWithWhitespace.pop();107trailingWhiteplace = accumulatedWhitespace.replace('\\\n', '\n');108assignsWithWhitespace.push(lastAssignWithWhitespace + trailingWhiteplace);109}110joinedAssigns = joinList(assignsWithWhitespace);111return "React.__spread(" + (joinList(assignsWithWhitespace)) + ")";112};113114Serialiser.prototype.serialiseAttributePairs = function(children) {115var child, childIndex, indexOfLastSemanticChild, isBeforeLastSemanticChild, ref1, semanticChildren, serialisedChild, serialisedChildren, whitespaceChildren;116ref1 = children.reduce(function(partitionedChildren, child) {117if (child.type === $.CJSX_WHITESPACE) {118partitionedChildren[0].push(child);119} else {120partitionedChildren[1].push(child);121}122return partitionedChildren;123}, [[], []]), whitespaceChildren = ref1[0], semanticChildren = ref1[1];124indexOfLastSemanticChild = children.lastIndexOf(last(semanticChildren));125isBeforeLastSemanticChild = function(childIndex) {126return childIndex < indexOfLastSemanticChild;127};128if (semanticChildren.length) {129serialisedChildren = (function() {130var j, len, results;131results = [];132for (childIndex = j = 0, len = children.length; j < len; childIndex = ++j) {133child = children[childIndex];134serialisedChild = this.serialiseNode(child);135if (child.type === $.CJSX_WHITESPACE) {136if (containsNewlines(serialisedChild)) {137if (isBeforeLastSemanticChild(childIndex)) {138results.push(serialisedChild.replace('\n', ' \\\n'));139} else {140results.push(serialisedChild);141}142} else {143results.push(null);144}145} else if (isBeforeLastSemanticChild(childIndex)) {146results.push(serialisedChild + ', ');147} else {148results.push(serialisedChild);149}150}151return results;152}).call(this);153return '{' + serialisedChildren.join('') + '}';154} else {155return null;156}157};158159return Serialiser;160161})();162163genericBranchSerialiser = function(node) {164return node.children.map((function(_this) {165return function(child) {166return _this.serialiseNode(child);167};168})(this)).join('');169};170171genericLeafSerialiser = function(node) {172return node.value;173};174175tagConvention = /^[a-z]|\-/;176177nodeSerialisers = {178ROOT: genericBranchSerialiser,179CJSX_PRAGMA: function() {180return "`/** @jsx " + this.domObject + " */`";181},182CJSX_EL: function(node) {183var accumulatedWhitespace, child, element, j, len, ref1, serialisedChild, serialisedChildren;184serialisedChildren = [];185accumulatedWhitespace = '';186ref1 = node.children;187for (j = 0, len = ref1.length; j < len; j++) {188child = ref1[j];189serialisedChild = this.serialiseNode(child);190if (child != null) {191if (serialisedChild.length === 0 || WHITESPACE_ONLY.test(serialisedChild)) {192accumulatedWhitespace += serialisedChild;193} else {194serialisedChildren.push(accumulatedWhitespace + serialisedChild);195accumulatedWhitespace = '';196}197}198}199if (serialisedChildren.length) {200serialisedChildren[serialisedChildren.length - 1] += accumulatedWhitespace;201accumulatedWhitespace = '';202}203if (tagConvention.test(node.value)) {204element = '"' + node.value + '"';205} else {206element = node.value;207}208return this.reactObject + ".createElement(" + element + ", " + (joinList(serialisedChildren)) + ")";209},210CJSX_COMMENT: function(node) {211return '';212},213CJSX_ESC: function(node) {214var childrenSerialised;215childrenSerialised = node.children.map((function(_this) {216return function(child) {217return _this.serialiseNode(child);218};219})(this)).join('');220return '(' + childrenSerialised + ')';221},222CJSX_ATTRIBUTES: function(node) {223if (node.children.some(function(child) {224return child.type === $.CJSX_ATTR_SPREAD;225})) {226return this.serialiseSpreadAndPairAttributes(node.children);227} else {228return this.serialiseAttributePairs(node.children) || 'null';229}230},231CJSX_ATTR_PAIR: function(node) {232return node.children.map((function(_this) {233return function(child) {234return _this.serialiseNode(child);235};236})(this)).join(': ');237},238CJSX_ATTR_SPREAD: function(node) {239return node.value;240},241CS: genericLeafSerialiser,242CS_COMMENT: genericLeafSerialiser,243CS_HEREDOC: genericLeafSerialiser,244CS_STRING: genericLeafSerialiser,245CS_REGEX: genericLeafSerialiser,246CS_HEREGEX: genericLeafSerialiser,247JS_ESC: genericLeafSerialiser,248CJSX_WHITESPACE: genericLeafSerialiser,249CJSX_TEXT: function(node) {250var escapedText, leftSpace, leftTrim, rightSpace, rightTrim, text, trimmedText;251text = node.value;252if (containsNewlines(text)) {253if (WHITESPACE_ONLY.test(text)) {254return text;255} else {256leftSpace = text.match(TEXT_LEADING_WHITESPACE);257rightSpace = text.match(TEXT_TRAILING_WHITESPACE);258if (leftSpace) {259leftTrim = text.indexOf('\n');260} else {261leftTrim = 0;262}263if (rightSpace) {264rightTrim = text.lastIndexOf('\n') + 1;265} else {266rightTrim = text.length;267}268trimmedText = text.substring(leftTrim, rightTrim);269escapedText = stringEscape(entityDecode(trimmedText), {270preserveNewlines: true271});272return '"""' + escapedText + '"""';273}274} else {275if (text === '') {276return null;277} else {278return '"' + stringEscape(entityDecode(text)) + '"';279}280}281},282CJSX_ATTR_KEY: genericLeafSerialiser,283CJSX_ATTR_VAL: genericLeafSerialiser284};285286firstNonWhitespaceChild = function(children) {287return find.call(children, function(child) {288return child.type !== $.CJSX_WHITESPACE;289});290};291292containsNewlines = function(text) {293return text.indexOf('\n') > -1;294};295296joinList = function(items) {297var i, output;298output = items[items.length - 1];299i = items.length - 2;300while (i >= 0) {301if (output.charAt(0) === '\n') {302output = items[i] + ',' + output;303} else {304output = items[i] + ', ' + output;305}306i--;307}308return output;309};310311SPACES_ONLY = /^\s+$/;312313WHITESPACE_ONLY = /^[\n\s]+$/;314315TEXT_LEADING_WHITESPACE = /^\s*?\n\s*/;316317TEXT_TRAILING_WHITESPACE = /\s*?\n\s*?$/;318319exports.Serialiser = Serialiser;320321exports.nodeSerialisers = nodeSerialisers;322323324