whole_func_string: 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);
  }
func_code_string: 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);
  }
func_documentation_string: Called after consuming `<zc-${directive_name}`