From e1ce47a901e23b0f7f4e28a94861be5ce5a415d3 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 21 Jul 2017 13:20:45 -0400 Subject: [PATCH] Pass the full CommonMark spec --- .../engines/discourse-markdown-it.js.es6 | 2 +- .../engines/discourse-markdown/code.js.es6 | 4 +- .../pretty-text/pretty-text.js.es6 | 4 +- lib/pretty_text.rb | 1 + spec/components/pretty_text_spec.rb | 68 +---------------- spec/integrity/common_mark_spec.rb | 74 +++++++++++++++++++ 6 files changed, 84 insertions(+), 69 deletions(-) create mode 100644 spec/integrity/common_mark_spec.rb diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown-it.js.es6 b/app/assets/javascripts/pretty-text/engines/discourse-markdown-it.js.es6 index 2e3ba250b91..6ffa5092572 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown-it.js.es6 +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown-it.js.es6 @@ -213,7 +213,7 @@ export function setup(opts, siteSettings, state) { html: true, breaks: opts.discourse.features.newline, xhtmlOut: false, - linkify: true, + linkify: opts.discourse.features.linkify, typographer: siteSettings.enable_markdown_typographer }); diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/code.js.es6 b/app/assets/javascripts/pretty-text/engines/discourse-markdown/code.js.es6 index 47e222b1748..a8def62ce27 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/code.js.es6 +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/code.js.es6 @@ -13,7 +13,7 @@ function render(tokens, idx, options, env, slf, md) { if (info) { // strip off any additional languages - info = info.split(/\s+/g)[0]; + info = info.trim().split(/\s+/g)[0]; } const acceptableCodeClasses = md.options.discourse.acceptableCodeClasses; @@ -23,7 +23,7 @@ function render(tokens, idx, options, env, slf, md) { className = TEXT_CODE_CLASSES.indexOf(info) !== -1 ? 'lang-nohighlight' : 'lang-' + langName; - return `
${escapedContent}
\n`; + return `
${escapedContent}
\n`; } export function setup(helper) { diff --git a/app/assets/javascripts/pretty-text/pretty-text.js.es6 b/app/assets/javascripts/pretty-text/pretty-text.js.es6 index 3859fde27e8..21708cbe211 100644 --- a/app/assets/javascripts/pretty-text/pretty-text.js.es6 +++ b/app/assets/javascripts/pretty-text/pretty-text.js.es6 @@ -21,7 +21,8 @@ export function buildOptions(state) { lookupAvatarByPostNumber, emojiUnicodeReplacer, lookupInlineOnebox, - previewing + previewing, + linkify } = state; let features = { @@ -33,6 +34,7 @@ export function buildOptions(state) { 'html': true, 'category-hashtag': true, 'onebox': true, + 'linkify': linkify !== false, 'newline': !siteSettings.traditional_markdown_linebreaks }; diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb index 50131970efa..69e60f1bed7 100644 --- a/lib/pretty_text.rb +++ b/lib/pretty_text.rb @@ -165,6 +165,7 @@ module PrettyText __optInput.customEmoji = #{custom_emoji.to_json}; __optInput.emojiUnicodeReplacer = __emojiUnicodeReplacer; __optInput.lookupInlineOnebox = __lookupInlineOnebox; + #{opts[:linkify] == false ? "__optInput.linkify = false;": ""} JS if opts[:topicId] diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index 4fe3d0f28a6..9f587060f6c 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -215,9 +215,12 @@ describe PrettyText do end it 'can include code class correctly' do + # keep in mind spaces should be trimmed per spec + expect(PrettyText.cook("``` ruby the mooby\n`````")).to eq('
') expect(PrettyText.cook("```cpp\ncpp\n```")).to match_html("
cpp\n
") expect(PrettyText.cook("```\ncpp\n```")).to match_html("
cpp\n
") expect(PrettyText.cook("```text\ncpp\n```")).to match_html("
cpp\n
") + end it 'indents code correctly' do @@ -966,69 +969,4 @@ HTML end end - # work in progress - skip 'passes commonmark spec' do - - SiteSetting.traditional_markdown_linebreaks = true - - html,state,md = nil - failed = 0 - - File.readlines(Rails.root + 'spec/fixtures/md/spec.txt').each do |line| - if line == "```````````````````````````````` example\n" - state = :example - next - end - - if line == "````````````````````````````````\n" - md.gsub!('→', "\t") - html ||= '' - html.gsub!('→', "\t") - html.strip! - - # normalize brs - html.gsub!('
', '
') - html.gsub!('
', '
') - html.gsub!(/]+) \/>/, "") - - cooked = PrettyText.markdown(md, sanitize: false) - cooked.strip! - cooked.gsub!(" class='lang-auto'", '') - cooked.gsub!(/(.*)<\/span>/, "\\1") - # we don't care about this - cooked.gsub!("
\n
", "
") - - unless cooked == html - failed += 1 - puts "FAILED SPEC" - puts "Expected: " - puts html - puts "Got: " - puts cooked - puts "Markdown: " - puts md - puts - end - html,state,md = nil - next - end - - if state == :example && line == ".\n" - state = :html - next - end - - if state == :example - md = (md || "") << line - end - - if state == :html - html = (html || "") << line - end - - - end - - expect(failed).to eq(0) - end end diff --git a/spec/integrity/common_mark_spec.rb b/spec/integrity/common_mark_spec.rb new file mode 100644 index 00000000000..9d2427d8426 --- /dev/null +++ b/spec/integrity/common_mark_spec.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true +require 'rails_helper' + +describe "CommonMark" do + it 'passes spec' do + + SiteSetting.traditional_markdown_linebreaks = true + SiteSetting.enable_markdown_typographer = false + + html,state,md = nil + failed = 0 + + File.readlines(Rails.root + 'spec/fixtures/md/spec.txt').each do |line| + if line == "```````````````````````````````` example\n" + state = :example + next + end + + if line == "````````````````````````````````\n" + md.gsub!('→', "\t") + html ||= String.new + html.gsub!('→', "\t") + html.strip! + + # normalize brs + html.gsub!('
', '
') + html.gsub!('
', '
') + html.gsub!(/]+) \/>/, "") + + cooked = PrettyText.markdown(md, sanitize: false, linkify: false) + cooked.strip! + cooked.gsub!(" class=\"lang-auto\"", '') + cooked.gsub!(/(.*)<\/span>/, "\\1") + # we don't care about this + cooked.gsub!("
\n
", "
") + html.gsub!("
\n
", "
") + html.gsub!("language-ruby", "lang-ruby") + # strip out unsupported languages + html.gsub!(/ class="language-[;f].*"/, "") + + unless cooked == html + failed += 1 + puts "FAILED SPEC" + puts "Expected: " + puts html + puts "Got: " + puts cooked + puts "Markdown: " + puts md + puts + end + html,state,md = nil + next + end + + if state == :example && line == ".\n" + state = :html + next + end + + if state == :example + md = (md || String.new) << line + end + + if state == :html + html = (html || String.new) << line + end + + + end + + expect(failed).to eq(0) + end +end