parse method

void parse(
  1. BuildTree tree
)

Parses tree for build ops and text styles.

Implementation

void parse(BuildTree tree) {
  final attrs = tree.element.attributes;
  final localName = tree.element.localName;

  switch (localName) {
    case kTagA:
      if (attrs.containsKey(kAttributeAHref)) {
        tree
          ..inherit<BuildContext?>(TagA.defaultColor)
          ..register(_tagA ??= TagA(this).buildOp);
      }

      final name = attrs[kAttributeAName];
      if (name != null) {
        tree.register(Anchor(this, name).buildOp);
      }
      break;

    case 'abbr':
    case kTagAcronym:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagAcronym,
          defaultStyles: _tagAcronym,
          priority: Early.tagAcronym,
        ),
      );
      break;

    case kTagAddress:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagAddress,
          defaultStyles: _tagAddress,
          priority: Early.tagAddress,
        ),
      );
      break;
    case 'article':
    case 'aside':
    case 'dl':
    case 'figcaption':
    case 'footer':
    case 'header':
    case 'main':
    case 'nav':
    case 'section':
    case kTagDiv:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagDiv,
          defaultStyles: _cssDisplayBlock,
          priority: Early.tagDiv,
        ),
      );
      break;

    case 'blockquote':
    case kTagFigure:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagFigure,
          defaultStyles: _tagFigure,
          priority: Early.tagFigure,
        ),
      );
      break;

    case 'b':
    case 'strong':
      tree.inherit(text_ops.fontWeight, FontWeight.bold);
      break;

    case 'big':
      tree.inherit(text_ops.fontSizeTerm, kCssFontSizeLarger);
      break;
    case 'small':
      tree.inherit(text_ops.fontSizeTerm, kCssFontSizeSmaller);
      break;

    case kTagBr:
      tree.register(tagBr);
      break;

    case kTagCenter:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagCenter,
          defaultStyles: _tagCenter,
          priority: Early.tagCenter,
        ),
      );
      break;

    case 'cite':
    case 'dfn':
    case 'em':
    case 'i':
    case 'var':
      tree.inherit(text_ops.fontStyle, FontStyle.italic);
      break;

    case kTagCode:
    case kTagKbd:
    case kTagSamp:
    case kTagTt:
      tree.inherit(
        text_ops.fontFamily,
        const [kTagCodeFont1, kTagCodeFont2],
      );
      break;
    case kTagPre:
      tree.register(_tagPre ??= TagPre(this).buildOp);
      break;

    case kTagDetails:
      tree.register(_tagDetails ??= TagDetails(this).buildOp);
      break;

    case kTagDd:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagDd,
          defaultStyles: _tagDd,
          priority: Early.tagDd,
        ),
      );
      break;
    case kTagDt:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagDt,
          defaultStyles: _tagDt,
          priority: Early.tagDt,
        ),
      );
      break;

    case 'del':
    case 's':
    case kTagStrike:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagStrike,
          defaultStyles: _cssTextDecorationLineThrough,
          priority: Early.tagStrike,
        ),
      );
      break;

    case kTagFont:
      tree.register(tagFont);
      break;

    case kTagH1:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagH1,
          defaultStyles: _tagH1,
          priority: Early.tagH1,
        ),
      );
      break;
    case kTagH2:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagH2,
          defaultStyles: _tagH2,
          priority: Early.tagH2,
        ),
      );
      break;
    case kTagH3:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagH3,
          defaultStyles: _tagH3,
          priority: Early.tagH3,
        ),
      );
      break;
    case kTagH4:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagH4,
          defaultStyles: _tagH4,
          priority: Early.tagH4,
        ),
      );
      break;
    case kTagH5:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagH5,
          defaultStyles: _tagH5,
          priority: Early.tagH5,
        ),
      );
      break;
    case kTagH6:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagH6,
          defaultStyles: _tagH6,
          priority: Early.tagH6,
        ),
      );
      break;

    case kTagHr:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagHr,
          defaultStyles: _tagHrDefaultStyles,
          onRenderBlock: _tagHrOnRenderBlock,
          priority: Priority.tagHr,
        ),
      );
      break;

    case kTagImg:
      tree.register(_tagImg ??= TagImg(this).buildOp);
      break;

    case kTagOrderedList:
    case kTagUnorderedList:
      tree.register(_tagLi ??= TagLi(this).buildOp);
      break;

    case kTagMark:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagMark,
          defaultStyles: _tagMark,
          priority: Early.tagMark,
        ),
      );
      break;

    case kTagP:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagP,
          defaultStyles: _tagP,
          priority: Early.tagP,
        ),
      );
      break;

    case kTagQ:
      tree.register(tagQ);
      break;

    case kTagRuby:
      tree.register(tagRuby);
      break;

    case 'style':
    case kTagScript:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagScript,
          defaultStyles: _cssDisplayNone,
          priority: Early.tagScript,
        ),
      );
      break;

    case kTagSub:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagSub,
          defaultStyles: _tagSub,
          priority: Early.tagSub,
        ),
      );
      break;
    case kTagSup:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagSup,
          defaultStyles: _tagSup,
          priority: Early.tagSup,
        ),
      );
      break;

    case kTagTable:
      final tagTable = _tagTable ??= TagTable(this);
      tree
        ..register(
          const BuildOp.v2(
            debugLabel: kTagTable,
            defaultStyles: _cssDisplayTable,
            priority: Early.tagTableDisplayTable,
          ),
        )
        ..register(tagTable.borderOp)
        ..register(tagTable.cellPaddingOp);
      break;
    case kTagTableCell:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagTableCell,
          defaultStyles: _cssVerticalAlignMiddle,
          priority: Early.tagTableCellValignDefault,
        ),
      );
      break;
    case kTagTableHeaderCell:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagTableHeaderCell,
          defaultStyles: _tagTableHeaderCell,
          priority: Early.tagTableHeaderCellDefaultStyles,
        ),
      );
      break;
    case kTagTableCaption:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagTableCaption,
          defaultStyles: _cssTextAlignCenter,
          priority: Early.tagTableCaptionTextAlignCenter,
        ),
      );
      break;

    case 'u':
    case kTagIns:
      tree.register(
        const BuildOp.v2(
          debugLabel: kTagIns,
          defaultStyles: _cssTextDecorationUnderline,
          priority: Early.tagIns,
        ),
      );
      break;
  }

  for (final attribute in attrs.entries) {
    switch (attribute.key) {
      case kAttributeAlign:
        tree.register(
          const BuildOp.v2(
            debugLabel: kAttributeAlign,
            defaultStyles: _cssTextAlignFromAttribute,
            priority: Early.attributeAlign,
          ),
        );
        break;
      case kAttributeDir:
        tree.register(
          const BuildOp.v2(
            debugLabel: kAttributeDir,
            defaultStyles: _cssDirectionFromAttribute,
            priority: Early.attributeDir,
          ),
        );
        break;
      case kAttributeId:
        tree.register(Anchor(this, attribute.value).buildOp);
        break;
    }
  }
}