Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

Parser.js

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 6.18 KiB


 001  var    pos, table = null, tableTag, tables, text;
 002   
 003  if (config.overwriteMarkdown)
 004  {
 005      overwriteMarkdown();
 006  }
 007  if (config.overwriteEscapes)
 008  {
 009      overwriteEscapes();
 010  }
 011   
 012  captureTables();
 013  processTables();
 014   
 015  /**
 016  * Add current line to a table
 017  *
 018  * @param {!string} line Line of text
 019  */
 020  function addLine(line)
 021  {
 022      var ignoreLen = 0;
 023   
 024      if (!table)
 025      {
 026          table = { rows: [] };
 027   
 028          // Make the table start at the first non-space character
 029          ignoreLen = /^ */.exec(line)[0].length;
 030          line      = line.substr(ignoreLen);
 031      }
 032   
 033      // Overwrite the outermost pipes
 034      line = line.replace(/^( *)\|/, '$1 ').replace(/\|( *)$/, ' $1');
 035   
 036      table.rows.push({ line: line, pos: pos + ignoreLen });
 037  }
 038   
 039  /**
 040  * Process current table's body
 041  */
 042  function addTableBody()
 043  {
 044      var i   = 1,
 045          cnt = table.rows.length;
 046      while (++i < cnt)
 047      {
 048          addTableRow('TD', table.rows[i]);
 049      }
 050   
 051      createBodyTags(table.rows[2].pos, pos);
 052  }
 053   
 054  /**
 055  * Add a cell's tags for current table at current position
 056  *
 057  * @param {!string} tagName Either TD or TH
 058  * @param {!string} align   Either "left", "center", "right" or ""
 059  */
 060  function addTableCell(tagName, align, text)
 061  {
 062      var startPos  = pos,
 063          endPos    = startPos + text.length,
 064          ignoreLen;
 065      pos = endPos;
 066   
 067      var m = /^( *).*?( *)$/.exec(text);
 068      if (m[1])
 069      {
 070          ignoreLen = m[1].length;
 071          createIgnoreTag(startPos, ignoreLen);
 072          startPos += ignoreLen;
 073      }
 074      if (m[2])
 075      {
 076          ignoreLen = m[2].length;
 077          createIgnoreTag(endPos - ignoreLen, ignoreLen);
 078          endPos -= ignoreLen;
 079      }
 080   
 081      createCellTags(tagName, startPos, endPos, align);
 082  }
 083   
 084  /**
 085  * Process current table's head
 086  */
 087  function addTableHead()
 088  {
 089      addTableRow('TH', table.rows[0]);
 090      createHeadTags(table.rows[0].pos, pos);
 091  }
 092   
 093  /**
 094  * Process given table row
 095  *
 096  * @param {!string} tagName Either TD or TH
 097  * @param {!Object} row
 098  */
 099  function addTableRow(tagName, row)
 100  {
 101      pos = row.pos;
 102      row.line.split('|').forEach(function(str, i)
 103      {
 104          if (i > 0)
 105          {
 106              createIgnoreTag(pos, 1);
 107              ++pos;
 108          }
 109   
 110          var align = (!table.cols[i]) ? '' : table.cols[i];
 111          addTableCell(tagName, align, str);
 112      });
 113   
 114      createRowTags(row.pos, pos);
 115  }
 116   
 117  /**
 118  * Capture all pipe tables in current text
 119  */
 120  function captureTables()
 121  {
 122      table  = null;
 123      tables = [];
 124   
 125      pos = 0;
 126      text.split("\n").forEach(function(line)
 127      {
 128          if (line.indexOf('|') < 0)
 129          {
 130              endTable();
 131          }
 132          else
 133          {
 134              addLine(line);
 135          }
 136          pos += 1 + line.length;
 137      });
 138      endTable();
 139  }
 140   
 141  /**
 142  * Create a pair of TBODY tags for given text span
 143  *
 144  * @param {!number} startPos
 145  * @param {!number} endPos
 146  */
 147  function createBodyTags(startPos, endPos)
 148  {
 149      addTagPair('TBODY', startPos, 0, endPos, 0, -3);
 150  }
 151   
 152  /**
 153  * Create a pair of TD or TH tags for given text span
 154  *
 155  * @param {!string} tagName  Either TD or TH
 156  * @param {!number} startPos
 157  * @param {!number} endPos
 158  * @param {!string} align    Either "left", "center", "right" or ""
 159  */
 160  function createCellTags(tagName, startPos, endPos, align)
 161  {
 162      var tag = addTagPair(tagName, startPos, 0, endPos, 0, -1);
 163      if (align)
 164      {
 165          tag.setAttribute('align', align);
 166      }
 167  }
 168   
 169  /**
 170  * Create a pair of THEAD tags for given text span
 171  *
 172  * @param {!number} startPos
 173  * @param {!number} endPos
 174  */
 175  function createHeadTags(startPos, endPos)
 176  {
 177      addTagPair('THEAD', startPos, 0, endPos, 0, -3);
 178  }
 179   
 180  /**
 181  * Create an ignore tag for given text span
 182  *
 183  * @param {!number} pos
 184  * @param {!number} len
 185  */
 186  function createIgnoreTag(pos, len)
 187  {
 188      tableTag.cascadeInvalidationTo(addIgnoreTag(pos, len, 1000));
 189  }
 190   
 191  /**
 192  * Create a pair of TR tags for given text span
 193  *
 194  * @param {!number} startPos
 195  * @param {!number} endPos
 196  */
 197  function createRowTags(startPos, endPos)
 198  {
 199      addTagPair('TR', startPos, 0, endPos, 0, -2);
 200  }
 201   
 202  /**
 203  * Create an ignore tag for given separator row
 204  *
 205  * @param {!Object} row
 206  */
 207  function createSeparatorTag(row)
 208  {
 209      createIgnoreTag(row.pos - 1, 1 + row.line.length);
 210  }
 211   
 212  /**
 213  * Create a pair of TABLE tags for given text span
 214  *
 215  * @param {!number} startPos
 216  * @param {!number} endPos
 217  */
 218  function createTableTags(startPos, endPos)
 219  {
 220      tableTag = addTagPair('TABLE', startPos, 0, endPos, 0, -4);
 221  }
 222   
 223  /**
 224  * End current buffered table
 225  */
 226  function endTable()
 227  {
 228      if (hasValidTable())
 229      {
 230          table.cols = parseColumnAlignments(table.rows[1].line);
 231          tables.push(table);
 232      }
 233      table = null;
 234  }
 235   
 236  /**
 237  * Test whether a valid table is currently buffered
 238  *
 239  * @return {!boolean}
 240  */
 241  function hasValidTable()
 242  {
 243      return (table && table.rows.length > 2 && isValidSeparator(table.rows[1].line));
 244  }
 245   
 246  /**
 247  * Test whether given line is a valid separator
 248  *
 249  * @param  {!string}  line
 250  * @return {!boolean}
 251  */
 252  function isValidSeparator(line)
 253  {
 254      return /^ *:?-+:?(?:(?:\+| *\| *):?-+:?)+ */.test(line);
 255  }
 256   
 257  /**
 258  * Overwrite right angle brackets in given match
 259  *
 260  * @param  {!string} str
 261  * @return {!string}
 262  */
 263  function overwriteBlockquoteCallback(str)
 264  {
 265      return str.replace(/>/g, ' ');
 266  }
 267   
 268  /**
 269  * Overwrite escape sequences in current text
 270  */
 271  function overwriteEscapes()
 272  {
 273      if (text.indexOf('\\|') > -1)
 274      {
 275          text = text.replace(/\\[\\|]/g, '..');
 276      }
 277  }
 278   
 279  /**
 280  * Overwrite backticks in given match
 281  *
 282  * @param  {!string} str
 283  * @return string
 284  */
 285  function overwriteInlineCodeCallback(str)
 286  {
 287      return str.replace(/\|/g, '.');
 288  }
 289   
 290  /**
 291  * Overwrite Markdown-style markup in current text
 292  */
 293  function overwriteMarkdown()
 294  {
 295      // Overwrite inline code spans
 296      if (text.indexOf('`') > -1)
 297      {
 298          text = text.replace(/`[^`]*`/g, overwriteInlineCodeCallback);
 299      }
 300   
 301      // Overwrite blockquotes
 302      if (text.indexOf('>') > -1)
 303      {
 304          text = text.replace(/^(?:> ?)+/gm, overwriteBlockquoteCallback);
 305      }
 306  }
 307   
 308  /**
 309  * Parse and return column alignments in given separator line
 310  *
 311  * @param  {!string} line
 312  * @return {!Array<!string>}
 313  */
 314  function parseColumnAlignments(line)
 315  {
 316      // Use a bitfield to represent the colons' presence and map it to the CSS value
 317      var align = [
 318              '',
 319              'right',
 320              'left',
 321              'center'
 322          ],
 323          cols = [],
 324          regexp = /(:?)-+(:?)/g,
 325          m;
 326   
 327      while (m = regexp.exec(line))
 328      {
 329          var key = (m[1] ? 2 : 0) + (m[2] ? 1 : 0);
 330          cols.push(align[key]);
 331      }
 332   
 333      return cols;
 334  }
 335   
 336  /**
 337  * Process current table declaration
 338  */
 339  function processCurrentTable()
 340  {
 341      var firstRow = table.rows[0],
 342          lastRow  = table.rows[table.rows.length - 1];
 343      createTableTags(firstRow.pos, lastRow.pos + lastRow.line.length);
 344   
 345      addTableHead();
 346      createSeparatorTag(table.rows[1]);
 347      addTableBody();
 348  }
 349   
 350  /**
 351  * Process all the captured tables
 352  */
 353  function processTables()
 354  {
 355      var i = -1, cnt = tables.length;
 356      while (++i < cnt)
 357      {
 358          table = tables[i];
 359          processCurrentTable();
 360      }
 361  }