An open API service indexing awesome lists of open source software.

https://github.com/zkry/yaml.el

YAML parser in Elisp
https://github.com/zkry/yaml.el

yaml-parser

Last synced: 5 months ago
JSON representation

YAML parser in Elisp

Awesome Lists containing this project

README

          

# yaml.el

[![MELPA](https://melpa.org/packages/yaml-badge.svg)](https://melpa.org/#/yaml)

yaml.el is a YAML parser written in Emacs List without any external
dependencies. It provides an interface similar to the Emacs JSON
parsing utility. The functions provided are as follows:

``` emacs-lisp
(yaml-parse-string string &rest args)
```

The following keyword args are accepted:

- `:object-type` specifies the Lisp data structure to store parsed
objects data in. It takes the following symbols:
- `hash-table` (default)
- `alist`
- `plist`
- `:object-key-type` specifies how map keys should be handled. It takes the following symbols:
- `string`
- `symbol` (default) Use symbols as keys. If `:object-type` is `plist`, this becomes the same as `keyword`.
- `keyword` Always use keywords as keys.
- `:sequence-type` specifies the Lisp data structure to store the
parsed sequences in. It takes the following symbols:
- `array` (default)
- `list`
- `:null-object` specifies the lisp object to use for nulls. Defaults
to the symbol `:null`.
- `:false-object` specifies the lisp object to use for false.
Defaults to the symbol `:false`.

```emacs-lisp
(yaml-encode object)
```

The function `yaml-encode` will encode a Lisp object to a YAML string.

## Installation

Until this is published to MELPA you will need to use the code from this repo directly.
You can put yaml.el in you load path directly or use a tool like use-package or straight.el.

## Examples

``` emacs-lisp
(require 'yaml)

(yaml-parse-string "
recipe:
ingredients:
- milk
- eggs
- oil
- flour
duration: 10
steps: null" :object-type 'alist
:sequence-type 'array
:null-object :empty)

;; => (("recipe" ("ingredients" . ["milk" "eggs" "oil" "flour"]) ("duration" . 10) ("steps" . :empty)))

(yaml-parse-string "
translations:
one: бір
two: екі
three: үш")

;; => #s(hash-table ... data ("translations" #s(hash-table ...)))

(yaml-encode '("omitted" ((count . 3) (value . 10) (items ("ruby" "diamond"))) "omitted"))

;; => "
- omitted
- count: 3
value: 10
items:
ruby: [diamond]
- omitted"

```

## Caveats

Since this is implemented in Emacs Lisp performance is probably not the best. An alternative implementation using libyaml exists and can be found [here](https://github.com/syohex/emacs-libyaml).

If you have a very deeply nested YAML file and your `max-lisp-eval-depth` variable is set too low, these is a chance that you might hit the maximum Lisp eval depth limit. In the future I may work on changing the parsing algorithm to avoid this problem but in the meantime you can bump up the `max-lisp-eval-depth` variable in your config.

## Development

You can run the tests by executing

```
$ ~/path/to/git-repo/yaml.el
$ emacs -batch -l ert -l yaml.el -l yaml-tests.el -f ert-run-tests-batch-and-exit
```