@@ -123,13 +123,29 @@ class _KatexParser {
123
123
}
124
124
125
125
List <KatexNode > _parseChildSpans (dom.Element element) {
126
- return List .unmodifiable (element.nodes.map ((node) {
127
- if (node case dom.Element (localName: 'span' )) {
128
- return _parseSpan (node);
129
- } else {
126
+ var resultSpans = < KatexNode > [];
127
+ for (final node in element.nodes.reversed) {
128
+ if (node is ! dom.Element || node.localName != 'span' ) {
130
129
throw KatexHtmlParseError ();
131
130
}
132
- }));
131
+
132
+ final span = _parseSpan (node);
133
+ resultSpans.add (span);
134
+
135
+ if (span is KatexSpanNode ) {
136
+ final marginRightEm = span.styles.marginRightEm;
137
+ if (marginRightEm != null && marginRightEm.isNegative) {
138
+ final previousSpansReversed =
139
+ resultSpans.reversed.toList (growable: false );
140
+ resultSpans = [];
141
+ resultSpans.add (KatexNegativeMarginNode (
142
+ marginRightEm: marginRightEm,
143
+ nodes: previousSpansReversed));
144
+ }
145
+ }
146
+ }
147
+
148
+ return resultSpans.reversed.toList (growable: false );
133
149
}
134
150
135
151
static final _resetSizeClassRegExp = RegExp (r'^reset-size(\d\d?)$' );
@@ -524,6 +540,7 @@ class _KatexParser {
524
540
final stylesheet = css_parser.parse ('*{$styleStr }' );
525
541
if (stylesheet.topLevels case [css_visitor.RuleSet () && final rule]) {
526
542
double ? heightEm;
543
+ double ? marginRightEm;
527
544
double ? topEm;
528
545
double ? verticalAlignEm;
529
546
@@ -538,6 +555,10 @@ class _KatexParser {
538
555
heightEm = _getEm (expression);
539
556
if (heightEm != null ) continue ;
540
557
558
+ case 'margin-right' :
559
+ marginRightEm = _getEm (expression);
560
+ if (marginRightEm != null ) continue ;
561
+
541
562
case 'top' :
542
563
topEm = _getEm (expression);
543
564
if (topEm != null ) continue ;
@@ -557,6 +578,7 @@ class _KatexParser {
557
578
558
579
return KatexSpanStyles (
559
580
heightEm: heightEm,
581
+ marginRightEm: marginRightEm,
560
582
topEm: topEm,
561
583
verticalAlignEm: verticalAlignEm,
562
584
);
@@ -592,6 +614,7 @@ enum KatexSpanTextAlign {
592
614
593
615
class KatexSpanStyles {
594
616
double ? heightEm;
617
+ double ? marginRightEm;
595
618
double ? topEm;
596
619
double ? verticalAlignEm;
597
620
@@ -603,6 +626,7 @@ class KatexSpanStyles {
603
626
604
627
KatexSpanStyles ({
605
628
this .heightEm,
629
+ this .marginRightEm,
606
630
this .topEm,
607
631
this .verticalAlignEm,
608
632
this .fontFamily,
@@ -616,6 +640,7 @@ class KatexSpanStyles {
616
640
int get hashCode => Object .hash (
617
641
'KatexSpanStyles' ,
618
642
heightEm,
643
+ marginRightEm,
619
644
topEm,
620
645
verticalAlignEm,
621
646
fontFamily,
@@ -629,6 +654,7 @@ class KatexSpanStyles {
629
654
bool operator == (Object other) {
630
655
return other is KatexSpanStyles &&
631
656
other.heightEm == heightEm &&
657
+ other.marginRightEm == marginRightEm &&
632
658
other.topEm == topEm &&
633
659
other.verticalAlignEm == verticalAlignEm &&
634
660
other.fontFamily == fontFamily &&
@@ -642,6 +668,7 @@ class KatexSpanStyles {
642
668
String toString () {
643
669
final args = < String > [];
644
670
if (heightEm != null ) args.add ('heightEm: $heightEm ' );
671
+ if (marginRightEm != null ) args.add ('marginRightEm: $marginRightEm ' );
645
672
if (topEm != null ) args.add ('topEm: $topEm ' );
646
673
if (verticalAlignEm != null ) args.add ('verticalAlignEm: $verticalAlignEm ' );
647
674
if (fontFamily != null ) args.add ('fontFamily: $fontFamily ' );
@@ -655,6 +682,7 @@ class KatexSpanStyles {
655
682
KatexSpanStyles merge (KatexSpanStyles other) {
656
683
return KatexSpanStyles (
657
684
heightEm: other.heightEm ?? heightEm,
685
+ marginRightEm: other.marginRightEm ?? marginRightEm,
658
686
topEm: other.topEm ?? topEm,
659
687
verticalAlignEm: other.verticalAlignEm ?? verticalAlignEm,
660
688
fontFamily: other.fontFamily ?? fontFamily,
0 commit comments