parseDoctype method

Doctype? parseDoctype()

Implementation

Doctype? parseDoctype() {
  if (!next(TokenType.lt)) return null;
  var lt = _current;

  if (!next(TokenType.doctype)) {
    _index--;
    return null;
  }
  var doctype = _current, html = parseIdentifier();
  if (html?.span?.text?.toLowerCase() != 'html') {
    errors.add(TwigDartError(
        TwigDartErrorSeverity.error, 'Expected "html" in doctype declaration.', html?.span ?? doctype!.span));
    return null;
  }

  var public = parseIdentifier();
  if (public == null) {
    if (!next(TokenType.gt)) {
      errors.add(TwigDartError(TwigDartErrorSeverity.error, 'Expected ">" in doctype declaration.', html!.span));
      return null;
    }

    return Doctype(lt, doctype, html as Identifier?, null, null, null, _current);
  }

  if (public.span?.text.toLowerCase() != 'public') {
    errors.add(TwigDartError(
        TwigDartErrorSeverity.error, 'Expected "public" in doctype declaration.', public.span ?? html!.span));
    return null;
  }

  var stringParser = prefixParselets[TokenType.string];

  if (!next(TokenType.string)) {
    errors.add(TwigDartError(TwigDartErrorSeverity.error, 'Expected string in doctype declaration.', public.span));
    return null;
  }

  var name = stringParser!.parse(this, _current) as StringLiteral?;

  if (!next(TokenType.string)) {
    errors.add(TwigDartError(TwigDartErrorSeverity.error, 'Expected string in doctype declaration.', name!.span));
    return null;
  }

  var url = stringParser.parse(this, _current) as StringLiteral?;

  if (!next(TokenType.gt)) {
    errors.add(TwigDartError(TwigDartErrorSeverity.error, 'Expected ">" in doctype declaration.', url!.span));
    return null;
  }

  return Doctype(lt, doctype, html as Identifier?, public, name, url, _current);
}