react / react-0.13.3 / examples / basic-commonjs / node_modules / reactify / node_modules / react-tools / vendor / fbtransform / transforms / xjs.js
81159 views/**1* Copyright 2013-2014, Facebook, Inc.2* All rights reserved.3*4* This source code is licensed under the BSD-style license found in the5* LICENSE file in the root directory of this source tree. An additional grant6* of patent rights can be found in the PATENTS file in the same directory.7*/8/*global exports:true*/9"use strict";10var Syntax = require('jstransform').Syntax;11var utils = require('jstransform/src/utils');1213var knownTags = {14a: true,15abbr: true,16address: true,17applet: true,18area: true,19article: true,20aside: true,21audio: true,22b: true,23base: true,24bdi: true,25bdo: true,26big: true,27blockquote: true,28body: true,29br: true,30button: true,31canvas: true,32caption: true,33circle: true,34cite: true,35code: true,36col: true,37colgroup: true,38command: true,39data: true,40datalist: true,41dd: true,42defs: true,43del: true,44details: true,45dfn: true,46dialog: true,47div: true,48dl: true,49dt: true,50ellipse: true,51em: true,52embed: true,53fieldset: true,54figcaption: true,55figure: true,56footer: true,57form: true,58g: true,59h1: true,60h2: true,61h3: true,62h4: true,63h5: true,64h6: true,65head: true,66header: true,67hgroup: true,68hr: true,69html: true,70i: true,71iframe: true,72img: true,73input: true,74ins: true,75kbd: true,76keygen: true,77label: true,78legend: true,79li: true,80line: true,81linearGradient: true,82link: true,83main: true,84map: true,85mark: true,86marquee: true,87mask: false,88menu: true,89menuitem: true,90meta: true,91meter: true,92nav: true,93noscript: true,94object: true,95ol: true,96optgroup: true,97option: true,98output: true,99p: true,100param: true,101path: true,102pattern: false,103picture: true,104polygon: true,105polyline: true,106pre: true,107progress: true,108q: true,109radialGradient: true,110rect: true,111rp: true,112rt: true,113ruby: true,114s: true,115samp: true,116script: true,117section: true,118select: true,119small: true,120source: true,121span: true,122stop: true,123strong: true,124style: true,125sub: true,126summary: true,127sup: true,128svg: true,129table: true,130tbody: true,131td: true,132text: true,133textarea: true,134tfoot: true,135th: true,136thead: true,137time: true,138title: true,139tr: true,140track: true,141tspan: true,142u: true,143ul: true,144'var': true,145video: true,146wbr: true147};148149function renderXJSLiteral(object, isLast, state, start, end) {150var lines = object.value.split(/\r\n|\n|\r/);151152if (start) {153utils.append(start, state);154}155156var lastNonEmptyLine = 0;157158lines.forEach(function (line, index) {159if (line.match(/[^ \t]/)) {160lastNonEmptyLine = index;161}162});163164lines.forEach(function (line, index) {165var isFirstLine = index === 0;166var isLastLine = index === lines.length - 1;167var isLastNonEmptyLine = index === lastNonEmptyLine;168169// replace rendered whitespace tabs with spaces170var trimmedLine = line.replace(/\t/g, ' ');171172// trim whitespace touching a newline173if (!isFirstLine) {174trimmedLine = trimmedLine.replace(/^[ ]+/, '');175}176if (!isLastLine) {177trimmedLine = trimmedLine.replace(/[ ]+$/, '');178}179180if (!isFirstLine) {181utils.append(line.match(/^[ \t]*/)[0], state);182}183184if (trimmedLine || isLastNonEmptyLine) {185utils.append(186JSON.stringify(trimmedLine) +187(!isLastNonEmptyLine ? " + ' ' +" : ''),188state);189190if (isLastNonEmptyLine) {191if (end) {192utils.append(end, state);193}194if (!isLast) {195utils.append(', ', state);196}197}198199// only restore tail whitespace if line had literals200if (trimmedLine && !isLastLine) {201utils.append(line.match(/[ \t]*$/)[0], state);202}203}204205if (!isLastLine) {206utils.append('\n', state);207}208});209210utils.move(object.range[1], state);211}212213function renderXJSExpressionContainer(traverse, object, isLast, path, state) {214// Plus 1 to skip `{`.215utils.move(object.range[0] + 1, state);216traverse(object.expression, path, state);217218if (!isLast && object.expression.type !== Syntax.XJSEmptyExpression) {219// If we need to append a comma, make sure to do so after the expression.220utils.catchup(object.expression.range[1], state, trimLeft);221utils.append(', ', state);222}223224// Minus 1 to skip `}`.225utils.catchup(object.range[1] - 1, state, trimLeft);226utils.move(object.range[1], state);227return false;228}229230function quoteAttrName(attr) {231// Quote invalid JS identifiers.232if (!/^[a-z_$][a-z\d_$]*$/i.test(attr)) {233return '"' + attr + '"';234}235return attr;236}237238function trimLeft(value) {239return value.replace(/^[ ]+/, '');240}241242exports.knownTags = knownTags;243exports.renderXJSExpressionContainer = renderXJSExpressionContainer;244exports.renderXJSLiteral = renderXJSLiteral;245exports.quoteAttrName = quoteAttrName;246exports.trimLeft = trimLeft;247248249