blob: 1af15d53c1188f242e544e397511d489ff5245f5 [file] [log] [blame]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import '../assets/html_entities.dart';
import '../ast.dart';
import '../charcode.dart';
import '../inline_parser.dart';
import '../patterns.dart';
import '../util.dart';
import 'inline_syntax.dart';
/// Decodes numeric character references, for example decode `#` to `#`.
// https://spec.commonmark.org/0.30/#entity-and-numeric-character-references
class DecodeHtmlSyntax extends InlineSyntax {
DecodeHtmlSyntax()
: super(htmlCharactersPattern.pattern,
caseSensitive: false, startCharacter: $ampersand);
@override
bool tryMatch(InlineParser parser, [int? startMatchPos]) {
if (parser.pos > 0 && parser.charAt(parser.pos - 1) == $backquote) {
return false;
}
final match = pattern.matchAsPrefix(parser.source, parser.pos);
if (match == null) {
return false;
}
if (match[1] != null && htmlEntitiesMap[match.match] == null) {
return false;
}
parser.writeText();
if (onMatch(parser, match)) parser.consume(match.match.length);
return true;
}
@override
bool onMatch(InlineParser parser, Match match) {
var decodedText = decodeHtmlCharacterFromMatch(match);
if (parser.encodeHtml) {
decodedText = escapeHtml(decodedText);
}
parser.addNode(Text(decodedText));
return true;
}
}