OpenIndented Markup Language
An indented, easy-to-parse, easy-to-read, easy-to-write markup language.
Home FAQ ImplementationThe origin
OpenIndented Markup Language (OIML) started as a command language (with a different name) for a visual novel engine like system from a private company. I kept refining the syntax in my spare time in the last 4 years and this is the result.
What's so different about it?
Unlike most of the markup languages used for similar purposes (e.g. TOML, YAML, JSON), OIML does not have a separate "mapping" the only container construct in OIML is a kind of 3-tuple called a "block" which can in turn contains other blocks; this design originates from the command language it was derived from, where the syntax originally designed to represent a list of commands was reused as the syntax for mapping; in this regard, OIML is closer to XML rather than JSON and YAML. Consider this XML snippet:
<description> simple example build file </description> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="build" location="build"/> <property name="dist" location="dist"/> <target name="init"> <!-- Create the time stamp --> <tstamp/> <!-- Create the build directory structure used by compile --> <mkdir dir="${build}"/> </target> <target name="compile" depends="init" description="compile the source"> <!-- Compile the Java code from ${src} into ${build} --> <javac srcdir="${src}" destdir="${build}"/> </target>
XML like this can be trivially adapted to OIML:
decription: : simple example build file // set global properties for this build property name="src" location="src" property name="build" location="build" property name="dist" location="dist" target name="init": // Create the time stamp tstamp // Create the build directory structure used by compile mkdir: ${build} target name="compile": depends: : init description: : compile the soure // Compile the Java code from ${src} into ${build} javc srcdir="${src}" destdir="${build}"
A more "OIML-native" way is to write it like this:
decription: : simple example build file // set global properties for this build property: src location: src property: build location: build property: dist location: dist target: init // Create the time stamp tstamp // Create the build directory structure used by compile mkdir: ${build} target: compile depends: : init description: : compile the soure // Compile the Java code from ${src} into ${build} javc srcdir="${src}" destdir="${build}"
Why no multi-line string literal?
I found it extremely annoying to manually format multi-line string literals under the 80-column rule that a lot of people believe to be a superior rule to have, so I make sure the rule won't make sense and you'll have to enable word wrap in your editor.
See also:
Why prohibit tab altogether?
Because tab can have different width in different editor settings and OIML is indented, one could have make a mistake and have the wrong indent in their OIML files; to strictly uphold the core goal of strong predictability, using tab for indent is prohibited to make sure this kind of situation won't happen.
Why no anchors & aliases & tags etc. (like in YAML)?
Higher-level constructs like anchors are unnecessary for a markup language mainly aimed to be a configuration language; they make the language more complex while providing little to no real benefits. If you want higher-level constructs it's better to use a separate language like Dhall.
Did you get your idea from Plan9 ndb or Recfiles?
No. The command language I mentioned before was largely inspired by the scripting language of Ren'Py, but later it took on a life of its own.