MarkdownParser constructor

MarkdownParser(
  1. String data
)

Implementation

MarkdownParser(this.data) {
  plainText = '';
  spans = [MarkdownSpan(text: '', markups: [], style: const TextStyle())];

  bool bold = false;
  bool italic = false;
  bool underline = false;

  const String markupBold = '**';
  const String markupItalic = '_';
  const String markupUnderline = '++';

  addSpan(String markup, bool isOpening) {
    final List<Markup> markups = [Markup(markup, isOpening)];

    if (bold && markup != markupBold) markups.add(Markup(markupBold, true));
    if (italic && markup != markupItalic) {
      markups.add(Markup(markupItalic, true));
    }
    if (underline && markup != markupUnderline) {
      markups.add(Markup(markupUnderline, true));
    }

    spans.add(
      MarkdownSpan(
        text: '',
        markups: markups,
        style: TextStyle(
          fontWeight: bold ? FontWeight.bold : null,
          fontStyle: italic ? FontStyle.italic : null,
          decoration: underline ? TextDecoration.underline : null,
        ),
      ),
    );
  }

  bool checkMarkup(int i, String markup) {
    return data.substring(i, min(i + markup.length, data.length)) == markup;
  }

  for (int c = 0; c < data.length; c++) {
    if (checkMarkup(c, markupBold)) {
      bold = !bold;
      addSpan(markupBold, bold);
      c += markupBold.length - 1;
    } else if (checkMarkup(c, markupItalic)) {
      italic = !italic;
      addSpan(markupItalic, italic);
      c += markupItalic.length - 1;
    } else if (checkMarkup(c, markupUnderline)) {
      underline = !underline;
      addSpan(markupUnderline, underline);
      c += markupUnderline.length - 1;
    } else {
      spans[spans.length - 1].text += data[c];
      plainText = plainText ?? data[c];
    }
  }
}