diff options
Diffstat (limited to 'js/lib/blocks.js')
| -rw-r--r-- | js/lib/blocks.js | 181 | 
1 files changed, 92 insertions, 89 deletions
diff --git a/js/lib/blocks.js b/js/lib/blocks.js index d5ad49e..85dfb9a 100644 --- a/js/lib/blocks.js +++ b/js/lib/blocks.js @@ -103,12 +103,12 @@ var acceptsLines = function(block_type) {  // into lists and sublists.  var endsWithBlankLine = function(block) {      while (block) { -        if (block.last_line_blank) { +        if (block._lastLineBlank) {              return true;          } -        var t = block.type(); +        var t = block.type;          if (t === 'List' || t === 'Item') { -            block = block.lastChild; +            block = block._lastChild;          } else {              break;          } @@ -124,19 +124,19 @@ var breakOutOfLists = function(block) {      var b = block;      var last_list = null;      do { -        if (b.type() === 'List') { +        if (b.type === 'List') {              last_list = b;          } -        b = b.parent; +        b = b._parent;      } while (b);      if (last_list) {          while (block !== last_list) {              this.finalize(block, this.lineNumber); -            block = block.parent; +            block = block._parent;          }          this.finalize(last_list, this.lineNumber); -        this.tip = last_list.parent; +        this.tip = last_list._parent;      }  }; @@ -144,24 +144,24 @@ var breakOutOfLists = function(block) {  // can accept lines -- that check should be done before calling this.  var addLine = function(ln, offset) {      var s = ln.slice(offset); -    if (!(this.tip.open)) { +    if (!(this.tip._open)) {          throw { msg: "Attempted to add line (" + ln + ") to closed container." };      } -    this.tip.strings.push(s); +    this.tip._strings.push(s);  };  // Add block of type tag as a child of the tip.  If the tip can't  // accept children, close and finalize it and try its parent,  // and so on til we find a block that can accept children.  var addChild = function(tag, offset) { -    while (!canContain(this.tip.type(), tag)) { +    while (!canContain(this.tip.type, tag)) {          this.finalize(this.tip, this.lineNumber - 1);      }      var column_number = offset + 1; // offset 0 = column 1      var newBlock = new Node(tag, [[this.lineNumber, column_number], [0, 0]]); -    newBlock.strings = []; -    newBlock.string_content = null; +    newBlock._strings = []; +    newBlock._string_content = null;      this.tip.appendChild(newBlock);      this.tip = newBlock;      return newBlock; @@ -179,7 +179,7 @@ var parseListMarker = function(ln, offset, indent) {                   start: null,                   delimiter: null,                   padding: null, -                 marker_offset: indent }; +                 markerOffset: indent };      if (rest.match(reHrule)) {          return null;      } @@ -220,7 +220,7 @@ var listsMatch = function(list_data, item_data) {  var closeUnmatchedBlocks = function() {      // finalize any blocks not matched      while (this.oldtip !== this.lastMatchedContainer) { -        var parent = this.oldtip.parent; +        var parent = this.oldtip._parent;          this.finalize(this.oldtip, this.lineNumber - 1);          this.oldtip = parent;      } @@ -256,11 +256,12 @@ var incorporateLine = function(ln) {      // For each containing block, try to parse the associated line start.      // Bail out on failure: container will point to the last matching block.      // Set all_matched to false if not all containers match. -    while (container.lastChild) { -        if (!container.lastChild.open) { +    var lastChild; +    while ((lastChild = container._lastChild)) { +        if (!lastChild._open) {              break;          } -        container = container.lastChild; +        container = lastChild;          match = matchAt(reNonSpace, ln, offset);          if (match === -1) { @@ -272,7 +273,7 @@ var incorporateLine = function(ln) {          }          indent = first_nonspace - offset; -        switch (container.type()) { +        switch (container.type) {          case 'BlockQuote':              if (indent <= 3 && ln.charCodeAt(first_nonspace) === C_GREATERTHAN) {                  offset = first_nonspace + 1; @@ -285,10 +286,10 @@ var incorporateLine = function(ln) {              break;          case 'Item': -            if (indent >= container.list_data.marker_offset + -                container.list_data.padding) { -                offset += container.list_data.marker_offset + -                    container.list_data.padding; +            if (indent >= container._listData.markerOffset + +                container._listData.padding) { +                offset += container._listData.markerOffset + +                    container._listData.padding;              } else if (blank) {                  offset = first_nonspace;              } else { @@ -301,14 +302,14 @@ var incorporateLine = function(ln) {              // a header can never container > 1 line, so fail to match:              all_matched = false;              if (blank) { -                container.last_line_blank = true; +                container._lastLineBlank = true;              }              break;          case 'CodeBlock': -            if (container.fence_length > 0) { // fenced +            if (container._isFenced) { // fenced                  // skip optional spaces of fence offset -                i = container.fence_offset; +                i = container._fenceOffset;                  while (i > 0 && ln.charCodeAt(offset) === C_SPACE) {                      offset++;                      i--; @@ -326,14 +327,14 @@ var incorporateLine = function(ln) {          case 'HtmlBlock':              if (blank) { -                container.last_line_blank = true; +                container._lastLineBlank = true;                  all_matched = false;              }              break;          case 'Paragraph':              if (blank) { -                container.last_line_blank = true; +                container._lastLineBlank = true;                  all_matched = false;              }              break; @@ -342,7 +343,7 @@ var incorporateLine = function(ln) {          }          if (!all_matched) { -            container = container.parent; // back up to last matching block +            container = container._parent; // back up to last matching block              break;          }      } @@ -351,13 +352,13 @@ var incorporateLine = function(ln) {      this.lastMatchedContainer = container;      // Check to see if we've hit 2nd blank line; if so break out of list: -    if (blank && container.last_line_blank) { +    if (blank && container._lastLineBlank) {          this.breakOutOfLists(container);      }      // Unless last matched container is a code block, try new container starts,      // adding children to the last matched container: -    var t = container.type(); +    var t = container.type;      while (t !== 'CodeBlock' && t !== 'HtmlBlock' &&             // this is a little performance optimization:             matchAt(reMaybeSpecial, ln, offset) !== -1) { @@ -375,7 +376,7 @@ var incorporateLine = function(ln) {          if (indent >= CODE_INDENT) {              // indented code -            if (this.tip.type() !== 'Paragraph' && !blank) { +            if (this.tip.type !== 'Paragraph' && !blank) {                  offset += CODE_INDENT;                  allClosed = allClosed ||                      this.closeUnmatchedBlocks(); @@ -405,19 +406,20 @@ var incorporateLine = function(ln) {              container = this.addChild('Header', first_nonspace);              container.level = match[0].trim().length; // number of #s              // remove trailing ###s: -            container.strings = +            container._strings =                  [ln.slice(offset).replace(/^ *#+ *$/, '').replace(/ +#+ *$/, '')];              break;          } else if ((match = ln.slice(offset).match(reCodeFence))) {              // fenced code block -            var fence_length = match[0].length; +            var fenceLength = match[0].length;              allClosed = allClosed || this.closeUnmatchedBlocks();              container = this.addChild('CodeBlock', first_nonspace); -            container.fence_length = fence_length; -            container.fence_char = match[0][0]; -            container.fence_offset = indent; -            offset += fence_length; +            container._isFenced = true; +            container._fenceLength = fenceLength; +            container._fenceChar = match[0][0]; +            container._fenceOffset = indent; +            offset += fenceLength;              break;          } else if (matchAt(reHtmlBlockOpen, ln, offset) !== -1) { @@ -428,13 +430,13 @@ var incorporateLine = function(ln) {              break;          } else if (t === 'Paragraph' && -                   container.strings.length === 1 && +                   container._strings.length === 1 &&                     ((match = ln.slice(offset).match(reSetextHeaderLine)))) {              // setext header line              allClosed = allClosed || this.closeUnmatchedBlocks(); -            var header = new Node('Header', container.sourcepos()); +            var header = new Node('Header', container.sourcepos);              header.level = match[0][0] === '=' ? 1 : 2; -            header.strings = container.strings; +            header._strings = container._strings;              container.insertAfter(header);              container.unlink();              container = header; @@ -456,14 +458,14 @@ var incorporateLine = function(ln) {              // add the list if needed              if (t !== 'List' || -                !(listsMatch(container.list_data, data))) { +                !(listsMatch(container._listData, data))) {                  container = this.addChild('List', first_nonspace); -                container.list_data = data; +                container._listData = data;              }              // add the list item              container = this.addChild('Item', first_nonspace); -            container.list_data = data; +            container._listData = data;          } else {              break; @@ -487,35 +489,35 @@ var incorporateLine = function(ln) {      // First check for a lazy paragraph continuation:      if (!allClosed && !blank && -        this.tip.type() === 'Paragraph' && -        this.tip.strings.length > 0) { +        this.tip.type === 'Paragraph' && +        this.tip._strings.length > 0) {          // lazy paragraph continuation -        this.last_line_blank = false; +        this._lastLineBlank = false;          this.addLine(ln, offset);      } else { // not a lazy continuation          // finalize any blocks not matched          allClosed = allClosed || this.closeUnmatchedBlocks(); -        t = container.type(); +        t = container.type;          // Block quote lines are never blank as they start with >          // and we don't count blanks in fenced code for purposes of tight/loose -        // lists or breaking out of lists.  We also don't set last_line_blank +        // lists or breaking out of lists.  We also don't set _lastLineBlank          // on an empty list item. -        container.last_line_blank = blank && +        container._lastLineBlank = blank &&              !(t === 'BlockQuote' ||                t === 'Header' || -              (t === 'CodeBlock' && container.fence_length > 0) || +              (t === 'CodeBlock' && container._isFenced) ||                (t === 'Item' && -               !container.firstChild && -               container.sourcepos()[0][0] === this.lineNumber)); +               !container._firstChild && +               container.sourcepos[0][0] === this.lineNumber));          var cont = container; -        while (cont.parent) { -            cont.parent.last_line_blank = false; -            cont = cont.parent; +        while (cont._parent) { +            cont._parent._lastLineBlank = false; +            cont = cont._parent;          }          switch (t) { @@ -524,12 +526,12 @@ var incorporateLine = function(ln) {              break;          case 'CodeBlock': -            if (container.fence_length > 0) { // fenced +            if (container._isFenced) { // fenced                  // check for closing code fence:                  match = (indent <= 3 && -                         ln.charAt(first_nonspace) === container.fence_char && +                         ln.charAt(first_nonspace) === container._fenceChar &&                           ln.slice(first_nonspace).match(reClosingCodeFence)); -                if (match && match[0].length >= container.fence_length) { +                if (match && match[0].length >= container._fenceLength) {                      // don't add closing fence to container; instead, close it:                      this.finalize(container, this.lineNumber);                  } else { @@ -567,24 +569,24 @@ var incorporateLine = function(ln) {  // parent of the closed block.  var finalize = function(block, lineNumber) {      var pos; -    var above = block.parent || this.top; +    var above = block._parent || this.top;      // don't do anything if the block is already closed -    if (!block.open) { +    if (!block._open) {          return 0;      } -    block.open = false; -    block.sourcepos()[1] = [lineNumber, this.lastLineLength + 1]; +    block._open = false; +    block.sourcepos[1] = [lineNumber, this.lastLineLength + 1]; -    switch (block.type()) { +    switch (block.type) {      case 'Paragraph': -        block.string_content = block.strings.join('\n'); +        block._string_content = block._strings.join('\n');          // try parsing the beginning as link reference definitions: -        while (block.string_content.charCodeAt(0) === C_OPEN_BRACKET && -               (pos = this.inlineParser.parseReference(block.string_content, +        while (block._string_content.charCodeAt(0) === C_OPEN_BRACKET && +               (pos = this.inlineParser.parseReference(block._string_content,                                                         this.refmap))) { -            block.string_content = block.string_content.slice(pos); -            if (isBlank(block.string_content)) { +            block._string_content = block._string_content.slice(pos); +            if (isBlank(block._string_content)) {                  block.unlink();                  break;              } @@ -592,49 +594,50 @@ var finalize = function(block, lineNumber) {          break;      case 'Header': -        block.string_content = block.strings.join('\n'); +        block._string_content = block._strings.join('\n');          break;      case 'HtmlBlock': -        block.literal = block.strings.join('\n'); +        block._literal = block._strings.join('\n');          break;      case 'CodeBlock': -        if (block.fence_length > 0) { // fenced +        if (block._isFenced) { // fenced              // first line becomes info string -            block.info = unescapeString(block.strings[0].trim()); -            if (block.strings.length === 1) { -                block.literal = ''; +            block.info = unescapeString(block._strings[0].trim()); +            if (block._strings.length === 1) { +                block._literal = '';              } else { -                block.literal = block.strings.slice(1).join('\n') + '\n'; +                block._literal = block._strings.slice(1).join('\n') + '\n';              }          } else { // indented -            stripFinalBlankLines(block.strings); -            block.literal = block.strings.join('\n') + '\n'; +            stripFinalBlankLines(block._strings); +            block._literal = block._strings.join('\n') + '\n';          }          break;      case 'List': -        block.list_data.tight = true; // tight by default +        block._listData.tight = true; // tight by default -        var item = block.firstChild; +        var item = block._firstChild;          while (item) {              // check for non-final list item ending with blank line: -            if (endsWithBlankLine(item) && item.next) { -                block.list_data.tight = false; +            if (endsWithBlankLine(item) && item._next) { +                block._listData.tight = false;                  break;              }              // recurse into children of list item, to see if there are              // spaces between any of them: -            var subitem = item.firstChild; +            var subitem = item._firstChild;              while (subitem) { -                if (endsWithBlankLine(subitem) && (item.next || subitem.next)) { -                    block.list_data.tight = false; +                if (endsWithBlankLine(subitem) && +                    (item._next || subitem._next)) { +                    block._listData.tight = false;                      break;                  } -                subitem = subitem.next; +                subitem = subitem._next;              } -            item = item.next; +            item = item._next;          }          break; @@ -652,7 +655,7 @@ var processInlines = function(block) {      var walker = block.walker();      while ((event = walker.next())) {          node = event.node; -        t = node.type(); +        t = node.type;          if (!event.entering && (t === 'Paragraph' || t === 'Header')) {              this.inlineParser.parse(node, this.refmap);          } @@ -661,8 +664,8 @@ var processInlines = function(block) {  var Document = function() {      var doc = new Node('Document', [[1, 1], [0, 0]]); -    doc.string_content = null; -    doc.strings = []; +    doc._string_content = null; +    doc._strings = [];      return doc;  };  | 
