diff --git a/src/languages/freedesktop.js b/src/languages/freedesktop.js new file mode 100644 index 0000000000..e05d742e25 --- /dev/null +++ b/src/languages/freedesktop.js @@ -0,0 +1,86 @@ +/* +Language: FreeDesktop Configs +Description: FreeDesktop Config Specification file format +Contributors: Lee Yunjin +Category: common, config +Website: https://www.freedesktop.org/ +*/ +export default function(hljs) { + const FIELD_CODES = { + className: 'variable', + match: /%[a-zA-Z]/, + relevance: 1 + }; + + const STRING = { + className: 'string', + begin: /"/, + end: /"/, + contains: [ hljs.BACKSLASH_ESCAPE ], + relevance: 0 + }; + + const COMMENT = { + className: 'comment', + begin: /[#]/, + end: /$/, + relevance: 0 + }; + + const SECTION = { + className: 'section', + begin: /^\[(Desktop Entry|Unit|Service|Install|Socket|Mount|Automount|Swap|Path|Timer|Slice|Scope|Manager|connection|ipv4|wifi|wifi-security|ipv6|802-3-ethernet|802-11-wireless|802-11-wireless-security|vpn|Journal|Bridge|Desktop Action\s+[A-Za-z0-9_-]+)\]$/, + relevance: 10 + }; + + const KEY_NAME = { + className: 'attr', + begin: /^[A-Za-z0-9_-]+(\[[A-Za-z0-9_@.]+\])?/, + end: /\s*=/, + excludeEnd: true, + relevance: 10 + }; + + const OPERATOR = { + className: 'operator', + match: /=/, + relevance: 0 + }; + + const VALUE = { + begin: /=\s*/, + end: /$/, + excludeBegin: true, + contains: [ + STRING, + { + className: 'literal', + match: /\b(Application|Link|Directory|forking|oneshot|OneShot|true|false|True|False)\b/, + relevance: 10 + } + ] + }; + + const KEY_VALUE = { + begin: /^([A-Za-z0-9_-]+(\[[A-Za-z0-9_@.]+\])?)\s*=/, + returnBegin: true, + contains: [ + FIELD_CODES, + KEY_NAME, + OPERATOR, + VALUE + ] + }; + + return { + name: 'FreeDesktop configuration format', + aliases: ['desktop', 'service', 'mount', 'socket', 'timer', 'nmconnection', 'systemd', 'freedesktop'], + case_insensitive: false, + contains: [ + COMMENT, + SECTION, + KEY_VALUE + ] + }; +} +