D 2018-07-03T21:09:21.905 L config N text/x-markdown P e1ad60618e01c55443a5b88263446b4d1510cc777e0ddeff326728dcc81cd571 U mario W 4309 ## # config: {…} The `config:` field is a list of entries describing feature- and application-level settings. # config: # { name: linky, type: bool, description: autolink urls } # { name: xy.title, type: str, value: "blog title" } # { name: perm, type: select, select: 3=USER|2=EX|1=SUP|0=KERN } [PMD](wiki/Plugin+Meta+Data) is about uniform feature lookup. And plugin handling goes hand in hand with configuration management. However it requires a structured field to avoid bulky definitions, yet support enough variation. Usually `config:` contains multiple indented lines, each being a JSOL-dictionary. #### {
name: associates some variable/constant/expression to a setting.
type: A few common types may cover 90% of configuration needs.
bool/boolean would render as checkbox often.
str/string for plain textual content.
int/integer verifies the value to be numeric.
select/multi defining a predefined list of defaults.
select: * With `select: "aaa┃bbb┃ccc"` being the alternatives attribute for combobox options.
description: holds some elaboration on the key name.
value: just sets a default
#### } ## Storage and key `name:` Notably this scheme just defines a list of available options. It does **not** prescribe if they're stored in an `.ini`, `.json`, `xml` or code file, or a database perhaps. Applications might utilize different stores even, and dispatch depending on the `name:` syntax * For example `name: ALL_UPPERCASE` might become a code constant, * While `name: sectioned.feature.option` indicated an INI setting, * Or `name: "$cfg.plugins[after][]"` even a literal code target. So names can be somewhat free-form. I'd avoid including the `$` sigil however, or spaces obviously. Mostly-alphunumeric and dotted keys are certainly most versatile. ## `select:` type and alternatives The syntax for `select:` is * preferrably `"alt|alt|alt"` * or with optional title `"1=title|2=alternative|3=…"`. * Though implementations may allow to use `,` comma and `|` dash. * Or `:` like `=` again. ## Other fields and types Other per-config attributes migh encompass * `category:` and `class:` for decoration or grouping. * Or `arg:` and `param:` for defining commandline args rather than global application settings. Other types might be * `text` for lengthy textarea-style strings), * `color` for a color picker, * `file` bringing up a file selection dialog * Or `table`/`csv`/`dict` for supporting more complex (Excel-style) setting lists. ## Regex tokenizer You can get by with a somewhat simple regex extractor for this config scheme. It's simply finding `{…}` pairs, then splitting key-value pairs, and handling optional quoting. * Which allows syntax alternatives `[:=>]+` for key-value pairs. * Same as shortened/aliased type names add some user-friendliness. Of course a stringent JSON-parser could be used. But that's obstructing maintanability, and buys little performance-wise. (Plugin or option management is rarely done during runtime; but confined to some admin or installer UI.) ## Purpose Once config options are easily parseable, it quickly pays off to implement a centralized option/admin UI. And it sometimes can be combined with plugin configuration itself. Which is why plugin meta data defines this simple scheme. Z 62cc7b32ace6bbe1881a5c1e271e63b3