function consume_directive_tag (proc_stack, tag_name) {
  let pos = proc_stack._tGetNPos() - tag_name.length;
  let directive_name = tag_name.slice(3);

  let raw_args = {};

  proc_stack.tSkipWhile(WHITESPACE);
  while (!proc_stack.tSkipIf(">")) {
    let arg_name = proc_stack.tAcceptUntil("=");
    proc_stack.tSkip();

    if (!proc_stack.tSkipIf("\"")) {
      throw new SyntaxError(`HTML directive tag argument attr value is unquoted`);
    }

    raw_args[arg_name] = consume_char_data_with_entity_directives(proc_stack, true, "\"");
    proc_stack.tSkip();

    proc_stack.tSkipWhile(WHITESPACE);
  }

  let closing_tag = `</zc-${directive_name}>`;
  // HTML entities in content will not be decoded (i.e. treat all HTML as text)
  if (raw_args.value != null) {
    throw new SyntaxError("Value argument provided as attribute");
  }
  raw_args.value = consume_html_content(proc_stack, closing_tag);
  proc_stack.tSkip(closing_tag.length);

  return new DirectiveExpr(proc_stack, pos, directive_name, raw_args);
}
function consume_directive_tag (proc_stack, tag_name) {
  let pos = proc_stack._tGetNPos() - tag_name.length;
  let directive_name = tag_name.slice(3);

  let raw_args = {};

  proc_stack.tSkipWhile(WHITESPACE);
  while (!proc_stack.tSkipIf(">")) {
    let arg_name = proc_stack.tAcceptUntil("=");
    proc_stack.tSkip();

    if (!proc_stack.tSkipIf("\"")) {
      throw new SyntaxError(`HTML directive tag argument attr value is unquoted`);
    }

    raw_args[arg_name] = consume_char_data_with_entity_directives(proc_stack, true, "\"");
    proc_stack.tSkip();

    proc_stack.tSkipWhile(WHITESPACE);
  }

  let closing_tag = `</zc-${directive_name}>`;
  
  if (raw_args.value != null) {
    throw new SyntaxError("Value argument provided as attribute");
  }
  raw_args.value = consume_html_content(proc_stack, closing_tag);
  proc_stack.tSkip(closing_tag.length);

  return new DirectiveExpr(proc_stack, pos, directive_name, raw_args);
}
function consume_directive_tag ( proc_stack , tag_name ) { let pos = proc_stack . _tGetNPos ( ) - tag_name . length ; let directive_name = tag_name . slice ( 3 ) ; let raw_args = { } ; proc_stack . tSkipWhile ( WHITESPACE ) ; while ( ! proc_stack . tSkipIf ( ">" ) ) { let arg_name = proc_stack . tAcceptUntil ( "=" ) ; proc_stack . tSkip ( ) ; if ( ! proc_stack . tSkipIf ( "\"" ) ) { throw new SyntaxError ( ` ` ) ; } raw_args [ arg_name ] = consume_char_data_with_entity_directives ( proc_stack , true , "\"" ) ; proc_stack . tSkip ( ) ; proc_stack . tSkipWhile ( WHITESPACE ) ; } let closing_tag = ` ${ directive_name } ` ; // HTML entities in content will not be decoded (i.e. treat all HTML as text) if ( raw_args . value != null ) { throw new SyntaxError ( "Value argument provided as attribute" ) ; } raw_args . value = consume_html_content ( proc_stack , closing_tag ) ; proc_stack . tSkip ( closing_tag . length ) ; return new DirectiveExpr ( proc_stack , pos , directive_name , raw_args ) ; }
Called after consuming `<zc-${directive_name}`
Called after consuming <zc - $ { directive_name }