fix: escape attributes in markdown less aggressively
This commit is contained in:
parent
bc864fda4a
commit
ac1ad1b897
|
|
@ -19,6 +19,8 @@
|
||||||
import 'package:markdown/markdown.dart';
|
import 'package:markdown/markdown.dart';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
|
const htmlAttrEscape = HtmlEscape(HtmlEscapeMode.attribute);
|
||||||
|
|
||||||
class LinebreakSyntax extends InlineSyntax {
|
class LinebreakSyntax extends InlineSyntax {
|
||||||
LinebreakSyntax() : super(r'\n');
|
LinebreakSyntax() : super(r'\n');
|
||||||
|
|
||||||
|
|
@ -51,7 +53,7 @@ class SpoilerSyntax extends TagSyntax {
|
||||||
bool onMatchEnd(InlineParser parser, Match match, TagState state) {
|
bool onMatchEnd(InlineParser parser, Match match, TagState state) {
|
||||||
final element = Element('span', state.children);
|
final element = Element('span', state.children);
|
||||||
element.attributes['data-mx-spoiler'] =
|
element.attributes['data-mx-spoiler'] =
|
||||||
htmlEscape.convert(reasonMap[match.input] ?? '');
|
htmlAttrEscape.convert(reasonMap[match.input] ?? '');
|
||||||
parser.addNode(element);
|
parser.addNode(element);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -84,9 +86,9 @@ class EmoteSyntax extends InlineSyntax {
|
||||||
}
|
}
|
||||||
final element = Element.empty('img');
|
final element = Element.empty('img');
|
||||||
element.attributes['data-mx-emoticon'] = '';
|
element.attributes['data-mx-emoticon'] = '';
|
||||||
element.attributes['src'] = htmlEscape.convert(mxc);
|
element.attributes['src'] = htmlAttrEscape.convert(mxc);
|
||||||
element.attributes['alt'] = htmlEscape.convert(emote);
|
element.attributes['alt'] = htmlAttrEscape.convert(emote);
|
||||||
element.attributes['title'] = htmlEscape.convert(emote);
|
element.attributes['title'] = htmlAttrEscape.convert(emote);
|
||||||
element.attributes['height'] = '32';
|
element.attributes['height'] = '32';
|
||||||
element.attributes['vertical-align'] = 'middle';
|
element.attributes['vertical-align'] = 'middle';
|
||||||
parser.addNode(element);
|
parser.addNode(element);
|
||||||
|
|
|
||||||
|
|
@ -54,11 +54,11 @@ void main() {
|
||||||
});
|
});
|
||||||
test('emotes', () {
|
test('emotes', () {
|
||||||
expect(markdown(':fox:', emotePacks),
|
expect(markdown(':fox:', emotePacks),
|
||||||
'<img data-mx-emoticon="" src="mxc://roomfox" alt=":fox:" title=":fox:" height="32" vertical-align="middle" />');
|
'<img data-mx-emoticon="" src="mxc://roomfox" alt=":fox:" title=":fox:" height="32" vertical-align="middle" />');
|
||||||
expect(markdown(':user~fox:', emotePacks),
|
expect(markdown(':user~fox:', emotePacks),
|
||||||
'<img data-mx-emoticon="" src="mxc://userfox" alt=":fox:" title=":fox:" height="32" vertical-align="middle" />');
|
'<img data-mx-emoticon="" src="mxc://userfox" alt=":fox:" title=":fox:" height="32" vertical-align="middle" />');
|
||||||
expect(markdown(':raccoon:', emotePacks),
|
expect(markdown(':raccoon:', emotePacks),
|
||||||
'<img data-mx-emoticon="" src="mxc://raccoon" alt=":raccoon:" title=":raccoon:" height="32" vertical-align="middle" />');
|
'<img data-mx-emoticon="" src="mxc://raccoon" alt=":raccoon:" title=":raccoon:" height="32" vertical-align="middle" />');
|
||||||
expect(markdown(':invalid:', emotePacks), ':invalid:');
|
expect(markdown(':invalid:', emotePacks), ':invalid:');
|
||||||
expect(markdown(':room~invalid:', emotePacks), ':room~invalid:');
|
expect(markdown(':room~invalid:', emotePacks), ':room~invalid:');
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue