The eno notation language

A modern plaintext data format, designed from the ground up for file-based content - simple, powerful and elegant:

author: Jane Doe
email: jane@eno-lang.org

-- my_content
Multi-line embedded content (e.g. markdown) here ...
-- my_content

states:
active = #fff
hover = #b6b6b6

# cities
Den Haag: 52.069961, 4.302315
Málaga: 36.721447, -4.421291
서울특별시: 37.566984, 126.977041

# cities expanded < cities
Springfield: 38.790312, -77.186418

Language Overview:

  • As fast to write and edit as it probably gets
  • Intuitive and simple - easy to use for non-programmers too
  • No indentation, all empty lines and whitespace optional
  • No type syntax rules and restrictions on the language level
  • Documents map to ubiquitous structural types in all programming languages
  • Powerful advanced features - copy, merge, deep merge elements

Usecases:

  • Authoring blogs, up to entire websites, from the macro to the micro level
  • Generating documentation, invoices, CVs, reports, you name it
  • Large scale textfile-based databases and archives
  • Configuration files, from the simplest to the most complex

Visit eno-lang.org/language for more information.

The eno libraries

Blazing fast, zero-dependency, fully documented eno parsers for JavaScript, PHP Python, Ruby (and soon also Rust) - featuring a powerful, expressive API:

# Ruby example (JavaScript / PHP / Python APIs are identical)
require 'enorb'

document = Eno.parse(
  File.read('example.eno'),
  locale: :es,                   # Fully localized error messages
  reporter: Eno::Reporters::HTML # Multi-format error messages
)

document.string('author', required: true)  # accessing = validating
  #=> 'Jane Doe'
document.section('cities').lat_lng('Málaga')  # high-level types
  #=> { lat: 36.721447, lng: -4.421291 }
document.lookup(9, 12)  # "What's at line 9, column 12?"
  #=> {
  #   element: #<Eno::Field name="hover" value="#b6b6b6">,
  #   zone: :value
  # }

Libraries Overview:

  • Data access = Data validation = Guaranteed data structure and type-safety
  • High-level types for emails, urls, colors, ... included out of the box
  • Custom type loaders can be easily defined with simple closures/functions
  • Fully localized, handwritten, human language error messages everywhere
  • Rich error metadata - message, snippet, cursor position, selection range
  • Both ordered and associative access to all data in the document

Usecases:

  • Static site generation, scalable up to massive amounts of content
  • Generating documentation, invoices, CVs, reports, you name it
  • Highly reliable app configuration data with minimal development effort
  • Content management tooling for apps, websites, editors, IDEs, ...

Visit eno-lang.org/libraries for more information.

Stay in the loop

Get development updates and info on new releases through the newsletter.

Available for