archive/directives/process/process_html_directives.js
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}>`;
  // 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}`