The eno notation language and libraries


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.

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

# Ruby example (JavaScript and Python APIs are identical)
require 'enorb' document = Eno.parse( File.read('example.eno'), locale: :es, # Fully localized error messages reporter: Eno::Reporters::HTML # Text, Terminal also available
) document.string('author', required: true) # query and validate #=> '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:

  • Automatic implicit document structure and value type validation
  • High-level types for emails, urls, colors, ... included out of the box
  • Custom types can be easily defined with simple loader 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.