Skip to content
Snippets Groups Projects
Commit 3ca93284 authored by Jarka Kadlecova's avatar Jarka Kadlecova
Browse files

Fix LaTeX formatting for AsciiDoc wiki

parent 0b946a7b
No related branches found
No related tags found
No related merge requests found
module Banzai
module Filter
class AsciiDocPostProcessingFilter < HTML::Pipeline::Filter
def call
doc.search('[data-math-style]').each do |node|
node.set_attribute('class', 'code math js-render-math')
end
doc
end
end
end
end
Loading
Loading
@@ -31,6 +31,10 @@ module Banzai
# Allow span elements
whitelist[:elements].push('span')
 
# Allow data-math-style attribute in order to support LaTeX formatting
whitelist[:attributes]['code'] = %w(data-math-style)
whitelist[:attributes]['pre'] = %w(data-math-style)
# Allow html5 details/summary elements
whitelist[:elements].push('details')
whitelist[:elements].push('summary')
Loading
Loading
module Banzai
module Pipeline
class AsciiDocPipeline < BasePipeline
def self.filters
FilterArray[
Filter::SanitizationFilter,
Filter::ExternalLinkFilter,
Filter::PlantumlFilter,
Filter::AsciiDocPostProcessingFilter
]
end
end
end
end
Loading
Loading
@@ -20,21 +20,20 @@ module Gitlab
backend: :gitlab_html5,
attributes: DEFAULT_ADOC_ATTRS }
 
context[:pipeline] = :markup
context[:pipeline] = :ascii_doc
 
plantuml_setup
 
html = ::Asciidoctor.convert(input, asciidoc_opts)
html = Banzai.render(html, context)
html.html_safe
end
 
def self.plantuml_setup
Asciidoctor::PlantUml.configure do |conf|
conf.url = ApplicationSetting.current.plantuml_url
conf.svg_enable = ApplicationSetting.current.plantuml_enabled
conf.png_enable = ApplicationSetting.current.plantuml_enabled
conf.url = current_application_settings.plantuml_url
conf.svg_enable = current_application_settings.plantuml_enabled
conf.png_enable = current_application_settings.plantuml_enabled
conf.txt_enable = false
end
end
Loading
Loading
@@ -47,13 +46,13 @@ module Gitlab
def stem(node)
return super unless node.style.to_sym == :latexmath
 
%(<pre#{id_attribute(node)} class="code math js-render-math #{node.role}" data-math-style="display"><code>#{node.content}</code></pre>)
%(<pre#{id_attribute(node)} data-math-style="display"><code>#{node.content}</code></pre>)
end
 
def inline_quoted(node)
return super unless node.type.to_sym == :latexmath
 
%(<code#{id_attribute(node)} class="code math js-render-math #{node.role}" data-math-style="inline">#{node.text}</code>)
%(<code#{id_attribute(node)} data-math-style="inline">#{node.text}</code>)
end
 
private
Loading
Loading
Loading
Loading
@@ -28,6 +28,40 @@ feature 'Projects > Wiki > User creates wiki page', js: true, feature: true do
expect(page).to have_content("Last edited by #{user.name}")
expect(page).to have_content('My awesome wiki!')
end
scenario 'creates ASCII wiki with LaTeX blocks' do
stub_application_setting(plantuml_url: 'http://localhost', plantuml_enabled: true)
ascii_content = <<~MD
:stem: latexmath
[stem]
++++
\sqrt{4} = 2
++++
another part
[latexmath]
++++
\beta_x \gamma
++++
stem:[2+2] is 4
MD
find('#wiki_format option[value=asciidoc]').select_option
fill_in :wiki_content, with: ascii_content
page.within '.wiki-form' do
click_button 'Create page'
end
page.within '.wiki' do
expect(page).to have_selector('.katex', count: 3)
expect(page).to have_content('2+2 is 4')
end
end
end
 
context 'when wiki is not empty' do
Loading
Loading
require 'spec_helper'
describe Banzai::Filter::AsciiDocPostProcessingFilter, lib: true do
include FilterSpecHelper
it "adds class for elements with data-math-style" do
result = filter('<pre data-math-style="inline">some code</pre><div data-math>and</div>').to_html
expect(result).to eq('<pre data-math-style="inline" class="code math js-render-math">some code</pre><div data-math>and</div>')
end
it "keeps content when no data-math-style found" do
result = filter('<pre>some code</pre><div data-math>and</div>').to_html
expect(result).to eq('<pre>some code</pre><div data-math>and</div>')
end
end
Loading
Loading
@@ -97,6 +97,22 @@ describe Banzai::Filter::SanitizationFilter, lib: true do
expect(filter(act).to_html).to eq exp
end
 
it 'allows `data-math-style` attribute on `code` and `pre` elements' do
html = <<-HTML
<pre class="code" data-math-style="inline">something</pre>
<code class="code" data-math-style="inline">something</code>
<div class="code" data-math-style="inline">something</div>
HTML
output = <<-HTML
<pre data-math-style="inline">something</pre>
<code data-math-style="inline">something</code>
<div>something</div>
HTML
expect(filter(html).to_html).to eq(output)
end
it 'removes `rel` attribute from `a` elements' do
act = %q{<a href="#" rel="nofollow">Link</a>}
exp = %q{<a href="#">Link</a>}
Loading
Loading
Loading
Loading
@@ -70,6 +70,31 @@ module Gitlab
expect(output).to include('rel="nofollow noreferrer noopener"')
end
end
context 'LaTex code' do
it 'adds class js-render-math to the output' do
input = <<~MD
:stem: latexmath
[stem]
++++
\sqrt{4} = 2
++++
another part
[latexmath]
++++
\beta_x \gamma
++++
stem:[2+2] is 4
MD
expect(render(input, context)).to include('<pre data-math-style="display" class="code math js-render-math"><code>eta_x gamma</code></pre>')
expect(render(input, context)).to include('<p><code data-math-style="inline" class="code math js-render-math">2+2</code> is 4</p>')
end
end
end
 
def render(*args)
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment