.. _kiplot-yaml: KiPlot YAML =========== You can find a lot of information about YAML format on internet. This document doesn’t pretend to be a complete YAML reference, just a complement to understand how to use it for the configuration files. YAML files are structured data arranged in a way that’s easy to understand. The basic idea -------------- You associate data with labels. After a label you put a colon (**:**) and then the data: .. code:: yaml version: 1 Here so associate the label **version** with the data value **1**. Basic data types ---------------- We use three basic data types: - **number**: can be integer, floating point, positive and negative. - **boolean**: can take only two values *true* and *false*. - **string**: almost anything else. Here are some examples for numbers: .. code:: yaml v1: 1 v2: 5.3 v3: -3 Note that the decimal point is always a point, no matters what your locale settings indicate. Here are some examples for booleans: .. code:: yaml v1: true v2: false And here are some examples for strings: .. code:: yaml v1: Hi! v2: '3' v3: "true" v4: " I have spaces " Note that quotes are optional and can be used to disambiguate. Compound data types ------------------- We use two types: - **list**: just a list of data elements. Each element start with a hyphen (**-**). - **dict**: dictionaries or maps. Just a bunch of label with associated data. Here is an example for a list of strings (**list(string)** in our case): .. code:: yaml - abc - '3' - "true" - " I have spaces " And here an example for a dict: .. code:: yaml v1: Hi! v2: '3' v3: "true" v4: " I have spaces " The list and dict elements can also be other lists and/or dicts. To understand how this is achieved we need one more thing. Indentation ----------- YAML uses the indentation to group data that belongs to a label. Here is an example of a list associated to a label: .. code:: yaml people: - John - Cindy - Luca - Laura We use two spaces, other values are possible, but you must keep coherence in the indentation. And here we have a dict: .. code:: yaml John: age: 25 gender: male And here is a mix of both: .. code:: yaml people: - John: age: 25 gender: male - Cindy - Luca - Laura The indentation shows that ``age`` and ``gender`` are attached to ``John``, not directly applied to ``people``. Note that lists can be nested, here is a list of lists (**list(list(string))**): .. code:: yaml list_of_lists: - - a - b - c - - 1 - 2 - 3 - 4 In this example we have a list with two elements, the first is a list with three elements and the second a list with four elements. Compact notation ---------------- You can use a more compat notation for small lists and dicts. The following list: .. code:: yaml list_of_lists: - - a - b - c - - 1 - 2 - 3 - 4 Can be defined in the following way: .. code:: yaml list_of_lists: - [ a, b, c ] - [ 1, 2, 3, 4 ] And this example: .. code:: yaml people: - John: age: 25 gender: male - Cindy - Luca - Laura Can be defined as: .. code:: yaml people: - John: { age: 25, gender: male } - Cindy - Luca - Laura Putting all together -------------------- So a **.kiplot.yaml** file is basically a dict containing the following labels: - ``kiplot``: contains a dict with special global options. Currently the format version used. - ``preflight``: contains a dict with pre-flight (or pre-run) actions. - ``outputs``: contains a list of outputs (or targets). Advanced tricks --------------- If you have various similar outputs with repeating options you can use *anchors*. This a nice YAML feature that allows to memorize a value and reuse it. Here is an example: .. code:: yaml kiplot: version: 1 outputs: - name: PcbDraw 1 comment: "PcbDraw test top" type: pcbdraw dir: PcbDraw options: &pcb_draw_ops format: svg style: board: "#1b1f44" copper: "#00406a" silk: "#d5dce4" pads: "#cfb96e" clad: "#72786c" outline: "#000000" vcut: "#bf2600" highlight_on_top: false highlight_style: "stroke:none;fill:#ff0000;opacity:0.5;" highlight_padding: 1.5 libs: - default - eagle-default remap: L_G1: "LEDs:LED-5MM_green" L_B1: "LEDs:LED-5MM_blue" L_Y1: "LEDs:LED-5MM_yellow" PHOTO1: "yaqwsx:R_PHOTO_7mm" J8: "yaqwsx:Pin_Header_Straight_1x02_circle" 'REF**': "dummy:dummy" G***: "dummy:dummy" svg2mod: "dummy:dummy" JP1: "dummy:dummy" JP2: "dummy:dummy" JP3: "dummy:dummy" JP4: "dummy:dummy" no_drillholes: False mirror: False highlight: - L_G1 - L_B1 - R10 - RV1 show_components: all vcuts: True warnings: visible dpi: 600 - name: PcbDraw 2 comment: "PcbDraw test bottom" type: pcbdraw dir: PcbDraw options: <<: *pcb_draw_ops style: set-red-enig bottom: True show_components: - L_G1 - L_B1 remap: Here we have two outputs: ‘PcbDraw 1’ and ‘PcbDraw 2’. The options for are big because we are including a custom color style and a list of component remappings. In this case ‘PcbDraw 2’ wants to use the same options, but with some changes. So we use an anchor in the first options list (``&pcb_draw_ops``) and then we copy the data with ``<<: *pcb_draw_ops``. The good thing is that we can overwrite options. Here we choose another ``style`` (ridiculous example), the bottom side (good example), a different list of components to show and we eliminate the ``remap`` dict.