whole_func_string: function consume_directive_entity (proc_stack) {
    let pos = proc_stack._tGetNPos();
  
    proc_stack.tSkip(4);
    let directive_name = proc_stack.tAcceptUntil("(");
    proc_stack.tSkip();
  
    let raw_args = {};
    do {
      proc_stack.tSkipWhile(WHITESPACE);
      if (proc_stack.tPeek() == ")") {
        break;
      }
  
      let arg_name = proc_stack.tAcceptUntil("=");
      proc_stack.tSkip();
  
      raw_args[arg_name] = consume_char_data_with_entity_directives(proc_stack, true, ",", ")");
    } while (proc_stack.tSkipIf(","));
  
    if (!proc_stack.tSkipIf(")")) {
      throw new SyntaxError(`HTML directive entity is missing closing parenthesis`);
    }
    proc_stack.tSkipIf(";");
  
    return new DirectiveExpr(proc_stack, pos, directive_name, raw_args);
  }
func_code_string: function consume_directive_entity (proc_stack) {
    let pos = proc_stack._tGetNPos();
  
    proc_stack.tSkip(4);
    let directive_name = proc_stack.tAcceptUntil("(");
    proc_stack.tSkip();
  
    let raw_args = {};
    do {
      proc_stack.tSkipWhile(WHITESPACE);
      if (proc_stack.tPeek() == ")") {
        break;
      }
  
      let arg_name = proc_stack.tAcceptUntil("=");
      proc_stack.tSkip();
  
      raw_args[arg_name] = consume_char_data_with_entity_directives(proc_stack, true, ",", ")");
    } while (proc_stack.tSkipIf(","));
  
    if (!proc_stack.tSkipIf(")")) {
      throw new SyntaxError(`HTML directive entity is missing closing parenthesis`);
    }
    proc_stack.tSkipIf(";");
  
    return new DirectiveExpr(proc_stack, pos, directive_name, raw_args);
  }
func_documentation_string: Called on match `&zc-`