diff --git a/lib/banzai/filter/math_filter.rb b/lib/banzai/filter/math_filter.rb index cb037f89337..b6e784c886b 100644 --- a/lib/banzai/filter/math_filter.rb +++ b/lib/banzai/filter/math_filter.rb @@ -5,12 +5,6 @@ module Banzai # HTML filter that adds class="code math" and removes the dollar sign in $`2+2`$. # class MathFilter < HTML::Pipeline::Filter - # This picks out .... - INLINE_MATH = 'descendant-or-self::code'.freeze - - # Pick out a code block which is declared math - DISPLAY_MATH = "descendant-or-self::pre[contains(@class, 'math') and contains(@class, 'code')]".freeze - # Attribute indicating inline or display math. STYLE_ATTRIBUTE = 'data-math-style'.freeze @@ -22,13 +16,14 @@ module Banzai DOLLAR_SIGN = '$'.freeze def call - doc.xpath(INLINE_MATH).each do |code| + doc.css('code').each do |code| closing = code.next opening = code.previous # We need a sibling before and after. # They should end and start with $ respectively. if closing && opening && + closing.text? && opening.text? && closing.content.first == DOLLAR_SIGN && opening.content.last == DOLLAR_SIGN @@ -39,7 +34,7 @@ module Banzai end end - doc.xpath(DISPLAY_MATH).each do |el| + doc.css('pre.code.math').each do |el| el[STYLE_ATTRIBUTE] = 'display' el[:class] += " #{TAG_CLASS}" end diff --git a/spec/lib/banzai/filter/math_filter_spec.rb b/spec/lib/banzai/filter/math_filter_spec.rb index 3fe2c7f5d5d..51883782e19 100644 --- a/spec/lib/banzai/filter/math_filter_spec.rb +++ b/spec/lib/banzai/filter/math_filter_spec.rb @@ -79,6 +79,13 @@ describe Banzai::Filter::MathFilter, lib: true do expect(doc.to_s).to eq input end + it 'ignores dollar signs if they are inside another element' do + input = '

We check strictly $2+2$

' + doc = filter(input) + + expect(doc.to_s).to eq input + end + # Display math it 'adds data-math-style display attribute to display math' do