Module: Relaton::Bib::Sanitizer

Defined in:
lib/relaton/bib/sanitizer.rb

Overview

Strips inline markup not in the basicdoc PureTextElement set (plus

, , , ) from raw marked-up content strings. Disallowed elements are unwrapped: tags removed, inner text kept.

is admitted beyond strict PureTextElement because bibliographic titles in real Metanorma input routinely carry footnotes (e.g. ISO standards titles with a disclaimer footnote), and downstream consumers — notably relaton-render's own inline-tag allow-list — already accept as a legitimate child of . Stripping it here would break the round-trip.</p> <p>OPAQUE elements (currently <stem>) are also allowed, but the sanitiser does not descend into them: their contents are out-of-band inline notation (MathML, AsciiMath, LaTeX) rather than basicdoc markup, and must be preserved verbatim. Without the opaque-skip, the recursive walk would unwrap MathML / AsciiMath elements down to bare text nodes — see #116 for the round-trip-loss symptom.</p> </div> </div> <div class="tags"> </div> <h2> Constant Summary <small><a href="#" class="constants_summary_toggle">collapse</a></small> </h2> <dl class="constants"> <dt id="ALLOWED-constant" class="">ALLOWED = </dt> <dd><pre class="code"><span class='qwords_beg'>%w[</span><span class='words_sep'> </span><span class='words_sep'> </span><span class='tstring_content'>em</span><span class='words_sep'> </span><span class='tstring_content'>strong</span><span class='words_sep'> </span><span class='tstring_content'>sub</span><span class='words_sep'> </span><span class='tstring_content'>sup</span><span class='words_sep'> </span><span class='tstring_content'>tt</span><span class='words_sep'> </span><span class='tstring_content'>underline</span><span class='words_sep'> </span><span class='tstring_content'>strike</span><span class='words_sep'> </span><span class='tstring_content'>smallcap</span><span class='words_sep'> </span><span class='tstring_content'>br</span><span class='words_sep'> </span><span class='tstring_content'>stem</span><span class='words_sep'> </span><span class='words_sep'> </span><span class='tstring_content'>p</span><span class='words_sep'> </span><span class='tstring_content'>eref</span><span class='words_sep'> </span><span class='tstring_content'>xref</span><span class='words_sep'> </span><span class='tstring_content'>fn</span><span class='words_sep'> </span><span class='tstring_end'>]</span></span><span class='period'>.</span><span class='id identifier rubyid_freeze'>freeze</span></pre></dd> <dt id="OPAQUE-constant" class="">OPAQUE = <div class="docstring"> <div class="discussion"> <p>Elements whose children are non-basicdoc inline notation (MathML, AsciiMath, LaTeX, …) and must be preserved verbatim rather than sanitised against ALLOWED.</p> </div> </div> <div class="tags"> </div> </dt> <dd><pre class="code"><span class='qwords_beg'>%w[</span><span class='tstring_content'>stem</span><span class='tstring_end'>]</span></span><span class='period'>.</span><span class='id identifier rubyid_freeze'>freeze</span></pre></dd> <dt id="RENAME-constant" class="">RENAME = </dt> <dd><pre class="code"><span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>italic</span><span class='tstring_end'>"</span></span> <span class='op'>=></span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>em</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_freeze'>freeze</span></pre></dd> <dt id="TAG_RX-constant" class="">TAG_RX = </dt> <dd><pre class="code"><span class='tstring'><span class='regexp_beg'>%r{</span><span class='tstring_content'><[a-zA-Z/!?]</span><span class='regexp_end'>}</span></span></pre></dd> </dl> <h2> Class Method Summary <small><a href="#" class="summary_toggle">collapse</a></small> </h2> <ul class="summary"> <li class="public "> <span class="summary_signature"> <a href="#sanitize-class_method" title="sanitize (class method)">.<strong>sanitize</strong>(content) ⇒ Object </a> </span> <span class="summary_desc"><div class='inline'></div></span> </li> </ul> <div id="class_method_details" class="method_details_list"> <h2>Class Method Details</h2> <div class="method_details first"> <h3 class="signature first" id="sanitize-class_method"> .<strong>sanitize</strong>(content) ⇒ <tt>Object</tt> </h3><table class="source_code"> <tr> <td> <pre class="lines"> 39 40 41 42 43 44 45 46 47</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/relaton/bib/sanitizer.rb', line 39</span> <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_sanitize'>sanitize</span><span class='lparen'>(</span><span class='id identifier rubyid_content'>content</span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='id identifier rubyid_content'>content</span> <span class='kw'>unless</span> <span class='id identifier rubyid_sanitizable?'>sanitizable?</span><span class='lparen'>(</span><span class='id identifier rubyid_content'>content</span><span class='rparen'>)</span> <span class='id identifier rubyid_fragment'>fragment</span> <span class='op'>=</span> <span class='const'>Nokogiri</span><span class='op'>::</span><span class='const'>XML</span><span class='op'>::</span><span class='const'>DocumentFragment</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_content'>content</span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='id identifier rubyid_content'>content</span> <span class='kw'>if</span> <span class='id identifier rubyid_fragment'>fragment</span><span class='period'>.</span><span class='id identifier rubyid_errors'>errors</span><span class='period'>.</span><span class='id identifier rubyid_any?'>any?</span> <span class='id identifier rubyid_sanitize_children'>sanitize_children</span><span class='lparen'>(</span><span class='id identifier rubyid_fragment'>fragment</span><span class='rparen'>)</span> <span class='id identifier rubyid_fragment'>fragment</span><span class='period'>.</span><span class='id identifier rubyid_children'>children</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_c'>c</span><span class='op'>|</span> <span class='id identifier rubyid_c'>c</span><span class='period'>.</span><span class='id identifier rubyid_to_xml'>to_xml</span><span class='lparen'>(</span><span class='label'>encoding:</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>UTF-8</span><span class='tstring_end'>"</span></span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> </div> </div> <div id="footer"> Generated on Tue Jul 7 03:22:42 2026 by <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a> 0.9.44 (ruby-4.0.2). </div> </div> </body> </html>