Doxhooks lets you abstract away the content and maintenance of files in your project. Doxhooks has three main classes of abstractions: Resources (files), preprocessors and preprocessor mini-languages.


  • Give names to files and directories, instead of hard-coding their paths.
  • Refer to URLs by the identity of the resources, instead of hard-coding the URLs.
  • Give a resource a default URL (based on its output path) or override the default.
  • Mangle a URL and output filename with a custom fingerprint of the resource content.
  • Update one resource, or all resources, or all resources that depend on a given input file.
  • Specify the order in which resources are updated.
  • Mix and match resources with preprocessors and preprocessor mini-languages.


  • Create customised preprocessors by extending and overriding other preprocessors, including the built-in general-purpose lexical preprocessor.
  • Use different types of preprocessors for different types of resources in the same project.
  • Customise the delimiters of the preprocessor directives and variables.
  • Apply character encodings and newline conventions to the output files.
  • Replace HTML character references with Unicode characters, other character references, etc.
  • See a preprocessor ‘stack trace’ when an error occurs in a preprocessor directive or variable.
  • Evaluate preprocessor variables recursively and late.
  • Mix and match preprocessors with preprocessor mini-languages.

Preprocessor mini-languages

  • Create customised preprocessor mini-languages by extending and overriding other preprocessor mini-languages, including the built-in preprocessor mini-language.
  • Use different types of preprocessor mini-languages for different types of resources in the same project.
  • Share data that is common to different resources by using preprocessor variables and the inheritance hierarchy of your preprocessor mini-languages.
  • Create your own common or domain-specific keywords in addition to the built-in keywords: insert or include a file, write a line, set a variable, raise an error or print a warning, if a condition is true.
  • Represent boolean output values in lowercase (true) or start-case (True), or exclude boolean as a valid output type.