diff --git a/lib/banzai/filter/inline_math_filter.rb b/lib/banzai/filter/inline_math_filter.rb new file mode 100644 index 0000000000000000000000000000000000000000..a63116c12ce7fadad0326820ebc8518a991d4181 --- /dev/null +++ b/lib/banzai/filter/inline_math_filter.rb @@ -0,0 +1,29 @@ +require 'uri' + +module Banzai + module Filter + # HTML filter that adds class="code math" and removes the dolar sign in $`2+2`$. + # + class InlineMathFilter < HTML::Pipeline::Filter + def call + doc.xpath("descendant-or-self::text()[substring(., string-length(.)) = '$']"\ + "/following-sibling::*[name() = 'code']"\ + "/following-sibling::text()[starts-with(.,'$')]").each do |el| + closing = el + code = el.previous + code[:class] = 'code math' + opening = code.previous + + closing.content = closing.content[1..-1] + opening.content = opening.content[0..-2] + + closing + end + + puts doc + + doc + end + end + end +end diff --git a/lib/banzai/pipeline/gfm_pipeline.rb b/lib/banzai/pipeline/gfm_pipeline.rb index 5da2d0b008c860ad9c27c49506aabcc05ce2c6b4..2c81cbe56b30768d71d8e50d840c1fd3ec48ec76 100644 --- a/lib/banzai/pipeline/gfm_pipeline.rb +++ b/lib/banzai/pipeline/gfm_pipeline.rb @@ -6,6 +6,7 @@ module Banzai Filter::SyntaxHighlightFilter, Filter::SanitizationFilter, + Filter::InlineMathFilter, Filter::UploadLinkFilter, Filter::VideoLinkFilter, Filter::ImageLinkFilter, diff --git a/spec/lib/banzai/filter/inline_math_filter_spec.rb b/spec/lib/banzai/filter/inline_math_filter_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..1edec83a6f27a11d2305d0e0f28e3da758a2678f --- /dev/null +++ b/spec/lib/banzai/filter/inline_math_filter_spec.rb @@ -0,0 +1,31 @@ +require 'spec_helper' + +describe Banzai::Filter::InlineMathFilter, lib: true do + include FilterSpecHelper + + it 'leaves regular inline code unchanged' do + doc = filter("<code>2+2</code>") + expect(doc.to_s).to eq "<code>2+2</code>" + end + + it 'removes surrounding dollar signs and adds class' do + doc = filter("$<code>2+2</code>$") + expect(doc.to_s).to eq '<code class="code math">2+2</code>' + end + + it 'only removes surrounding dollar signs' do + doc = filter("test $<code>2+2</code>$ test") + expect(doc.to_s).to eq 'test <code class="code math">2+2</code> test' + end + + it 'only removes surrounding single dollar sign' do + doc = filter("test $$<code>2+2</code>$$ test") + expect(doc.to_s).to eq 'test $<code class="code math">2+2</code>$ test' + end + + it 'ignores cases with missing dolar sign' do + doc = filter("test $<code>2+2</code> test") + expect(doc.to_s).to eq 'test $<code>2+2</code> test' + end + +end