https://github.com/monsterkodi/noon
no ordinary object notation
https://github.com/monsterkodi/noon
data-format noon object-notation serialization
Last synced: 2 months ago
JSON representation
no ordinary object notation
- Host: GitHub
- URL: https://github.com/monsterkodi/noon
- Owner: monsterkodi
- Created: 2015-12-05T02:35:40.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2025-02-28T22:36:48.000Z (4 months ago)
- Last Synced: 2025-04-13T14:06:59.473Z (2 months ago)
- Topics: data-format, noon, object-notation, serialization
- Language: JavaScript
- Homepage:
- Size: 1.72 MB
- Stars: 9
- Watchers: 2
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README

### noon
is an object notation with a focus on human readability.
Whitespace is preferred over other control characters:
- Indentation is used to express hierarchy
- Strings don't need to be escaped
- works well in config files
- works well in [command line arguments](https://github.com/monsterkodi/colorcat/blob/master/test/test.sh)
- good for storing [regexp patterns](https://github.com/monsterkodi/ko/blob/master/syntax/ko.noon)
### example files* [package](https://github.com/monsterkodi/noon/blob/master/package.noon)
* [language](https://github.com/monsterkodi/language-noon/blob/master/grammars/noon.noon)
* [font](https://github.com/monsterkodi/salter/blob/master/font.noon)
* [menu](https://github.com/monsterkodi/kaligraf/blob/master/coffee/menu.noon)### format
#### hierarchy
is expressed by indentation with spaces
```
grandpa
parent
child
sibling
uncle
```#### dictionaries
two or more spaces mark the end of a dictionary key, therefore ...
keys and list items can have single spaces in them but ...
unescaped dictionary keys can't contain consecutive spaces:```
key 1 value 1
key 2 value 2 contains spaces
```#### one key makes an object
```
this is
an object
```the above as json: `{"this is": null, "an": "object"}`
while```
this is
not an object
```is equivalent to `["this is", "not an object"]`
#### objects inside lists
are expressed like this:
```
.
a 1
.
b 2
```
the above as json: `[{"a": 1}, {"b": 2}]`### strings
#### escaping
if trimming your strings is not an option, you can escape:
```
a | leading spaces
b trailing spaces |
c | leading and trailing spaces |
pipe symbol |||
empty string ||
```keys must be escaped from both ends:
```
| s pace | key keeps spaces
| | key consists of spaces
|| key is empty string
```#### multiline strings
```
key ...
value is
a text with
line breaks
which stops
now
...
```#### comments
```coffeescript
# comments start with the hash sign
# mixing of data and comments is not allowed
therefore:
1 # this is not a comment
| # neither is this one
# but this one is
```### inline
sometimes data needs to be encoded in a single line.
#### dense notation
```
key . a .. b . c
```is equivalent to
```
key
a
b
c
```#### one line notation
**::** represents a line break
no spaces in keys allowed, therefore ...
no two-space-seperation necessary:```
key . a :: b . c :: d 1 :: e 2
```is equivalent to
```
key
a
b
c
d 1
e 2
```### command line

### module
```coffeescript
noon = require 'noon'# usage is similar to JSON
noon.stringify { hello: 'world' }
# hello world
noon.parse """
hello world
what's up? ☺
"""# { hello: 'world', 'what\'s up?': '☺' }
stringify_options = # stringify's second argument, defaults are:
ext: 'noon' # output format: noon or json
indent: 4 # number of spaces per indent level
align: true # vertically align object values
maxalign: 32 # maximal number of spaces when aligning
sort: false # sort object keys alphabetically
circular: false # check for circular references (expensive!)
colors: false # colorize output with ansi colors
``````coffeescript
# load data from file
data = noon.load 'file.noon'
data = noon.load 'file.json'# write data to file
noon.save 'file.noon', data
noon.save 'file.noon', data, stringify_options
noon.save 'file.json', data # < write as json
noon.save 'noext', data, ext: 'noon'```
### caveats
- keys can't start with the pipe symbol: |
- escaped keys can't contain the pipe symbol
- empty objects are not expressibleDon't use it if you can't live with the limitations mentioned above.
[![npm package][npm-image]][npm-url]
[![downloads][downloads-image]][downloads-url][npm-image]:https://img.shields.io/npm/v/noon.svg
[npm-url]:http://npmjs.org/package/noon
[downloads-image]:https://img.shields.io/npm/dm/noon.svg
[downloads-url]:https://www.npmtrends.com/noon