Merge commit 'c58967c3bd7b7eee0b284ee2b77a48ed9ce6863e' into glitch-soc/merge-upstream

Conflicts:
- `lib/sanitize_ext/sanitize_config.rb`:
  Conflict due to upstream adding fallback support for MathML Core while
  glitch-soc supported slightly more tags than upstream.
  Added the MathML Core fallback code to glitch-soc.
- `spec/lib/sanitize/config_spec.rb`:
  Ditto.
This commit is contained in:
Claire
2024-12-01 18:03:21 +01:00
204 changed files with 2169 additions and 4238 deletions

View File

@@ -74,6 +74,44 @@ class Sanitize
current_node.replace(current_node.document.create_text_node(current_node.text)) unless LINK_PROTOCOLS.include?(scheme)
end
# We assume that incomming <math> nodes are of the form
# <math><semantics>...<annotation>...</annotation></semantics></math>
# according to the [FEP]. We try to grab the most relevant plain-text
# annotation from the semantics node, and use it to display a representation
# of the mathematics.
#
# FEP: https://codeberg.org/fediverse/fep/src/branch/main/fep/dc88/fep-dc88.md
MATH_TRANSFORMER = lambda do |env|
math = env[:node]
return if env[:is_allowlisted]
return unless math.element? && env[:node_name] == 'math'
semantics = math.element_children[0]
return if semantics.nil? || semantics.name != 'semantics'
# next, we find the plain-text description
is_annotation_with_encoding = lambda do |encoding, node|
return false unless node.name == 'annotation'
node.attributes['encoding'].value == encoding
end
annotation = semantics.children.find(&is_annotation_with_encoding.curry['application/x-tex'])
if annotation
text = if math.attributes['display']&.value == 'block'
"$$#{annotation.text}$$"
else
"$#{annotation.text}$"
end
math.replace(math.document.create_text_node(text))
return
end
# Don't bother surrounding 'text/plain' annotations with dollar signs,
# since it isn't LaTeX
annotation = semantics.children.find(&is_annotation_with_encoding.curry['text/plain'])
math.replace(math.document.create_text_node(annotation.text)) unless annotation.nil?
end
MASTODON_STRICT = freeze_config(
elements: %w(p br span a abbr del s pre blockquote code b strong u sub sup i em h1 h2 h3 h4 h5 ul ol li ruby rt rp),
@@ -102,6 +140,7 @@ class Sanitize
ALLOWED_CLASS_TRANSFORMER,
IMG_TAG_TRANSFORMER,
TRANSLATE_TRANSFORMER,
MATH_TRANSFORMER,
UNSUPPORTED_HREF_TRANSFORMER,
]
)