paragraphs.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /**
  2. *
  3. */
  4. showdown.subParser('paragraphs', function (text, options, globals) {
  5. 'use strict';
  6. text = globals.converter._dispatch('paragraphs.before', text, options, globals);
  7. // Strip leading and trailing lines:
  8. text = text.replace(/^\n+/g, '');
  9. text = text.replace(/\n+$/g, '');
  10. var grafs = text.split(/\n{2,}/g),
  11. grafsOut = [],
  12. end = grafs.length; // Wrap <p> tags
  13. for (var i = 0; i < end; i++) {
  14. var str = grafs[i];
  15. // if this is an HTML marker, copy it
  16. if (str.search(/¨(K|G)(\d+)\1/g) >= 0) {
  17. grafsOut.push(str);
  18. } else {
  19. str = showdown.subParser('spanGamut')(str, options, globals);
  20. str = str.replace(/^([ \t]*)/g, '<p>');
  21. str += '</p>';
  22. grafsOut.push(str);
  23. }
  24. }
  25. /** Unhashify HTML blocks */
  26. end = grafsOut.length;
  27. for (i = 0; i < end; i++) {
  28. var blockText = '',
  29. grafsOutIt = grafsOut[i],
  30. codeFlag = false;
  31. // if this is a marker for an html block...
  32. while (grafsOutIt.search(/¨(K|G)(\d+)\1/) >= 0) {
  33. var delim = RegExp.$1,
  34. num = RegExp.$2;
  35. if (delim === 'K') {
  36. blockText = globals.gHtmlBlocks[num];
  37. } else {
  38. // we need to check if ghBlock is a false positive
  39. if (codeFlag) {
  40. // use encoded version of all text
  41. blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text, options, globals);
  42. } else {
  43. blockText = globals.ghCodeBlocks[num].codeblock;
  44. }
  45. }
  46. blockText = blockText.replace(/\$/g, '$$$$'); // Escape any dollar signs
  47. grafsOutIt = grafsOutIt.replace(/(\n\n)?¨(K|G)\d+\2(\n\n)?/, blockText);
  48. // Check if grafsOutIt is a pre->code
  49. if (/^<pre\b[^>]*>\s*<code\b[^>]*>/.test(grafsOutIt)) {
  50. codeFlag = true;
  51. }
  52. }
  53. grafsOut[i] = grafsOutIt;
  54. }
  55. text = grafsOut.join('\n');
  56. // Strip leading and trailing lines:
  57. text = text.replace(/^\n+/g, '');
  58. text = text.replace(/\n+$/g, '');
  59. return globals.converter._dispatch('paragraphs.after', text, options, globals);
  60. });