Add TOML syntax
It's used by the Rust book, and old mdBook supported it.
This commit is contained in:
parent
5efaec85b1
commit
67cd22a5aa
|
@ -1,5 +1,12 @@
|
||||||
|
Console.sublime-syntax was written for mdBook.
|
||||||
|
|
||||||
|
Handlebars.sublime-syntax is from PLACEHOLDER
|
||||||
|
|
||||||
|
TOML.sublime-syntax is from https://github.com/jasonwilliams/sublime_toml_highlighting/blob/0f14b7caf3c775a5d18551a9563a9debdb10c9a9/TOML.sublime-syntax
|
||||||
|
|
||||||
# Note
|
# Note
|
||||||
|
|
||||||
This folder is not copied over to the book directory when using `mdbook init`, nor is it indexed at runtime. All of the files in this folder are scraped by build.rs.
|
This folder is not copied over to the book directory when using `mdbook init`, nor is it indexed at runtime. All of the files in this folder are scraped by build.rs.
|
||||||
|
|
||||||
To make build.rs run again without running `cargo clean`, touch the run `touch build.rs`.
|
To make build.rs run again without running `cargo clean`, touch the run `touch build.rs`.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,405 @@
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
# http://www.sublimetext.com/docs/3/syntax.html
|
||||||
|
name: TOML
|
||||||
|
|
||||||
|
file_extensions:
|
||||||
|
- toml
|
||||||
|
- tml
|
||||||
|
- Cargo.lock
|
||||||
|
- Gopkg.lock
|
||||||
|
- Pipfile
|
||||||
|
|
||||||
|
scope: source.toml
|
||||||
|
|
||||||
|
variables:
|
||||||
|
ws: '[ \t]*'
|
||||||
|
wsnl: '([ \t\n])*'
|
||||||
|
|
||||||
|
# Used to detect the possible start of a key.
|
||||||
|
peek_key_start: '(?=[A-Za-z0-9_''"-])'
|
||||||
|
dot_peek_key: '{{ws}}(\.){{ws}}{{peek_key_start}}'
|
||||||
|
|
||||||
|
# integer = [ "-" / "+" ] int
|
||||||
|
# int = DIGIT / digit1-9 1*( DIGIT / "_" DIGIT )
|
||||||
|
integer: '([\+\-]?) (?: [0-9] | [1-9] (?: [0-9] | _ [0-9] )+ )'
|
||||||
|
|
||||||
|
HEXDIG: '[0-9A-Fa-f]'
|
||||||
|
hex_int: '0x{{HEXDIG}}(?:{{HEXDIG}}|_{{HEXDIG}})*'
|
||||||
|
oct_int: '0o[0-7](?:[0-7]|_[0-7])*'
|
||||||
|
bin_int: '0b[0-1](?:[0-1]|_[0-1])*'
|
||||||
|
|
||||||
|
# zero-prefixable-int = DIGIT *( DIGIT / underscore DIGIT )
|
||||||
|
zero_prefixable_int: '[0-9] (?: [0-9] | _ [0-9] )*'
|
||||||
|
# frac = decimal-point zero-prefixable-int
|
||||||
|
frac: '\. {{zero_prefixable_int}}'
|
||||||
|
# exp = "e" float-exp-part
|
||||||
|
# float-exp-part = [ minus / plus ] zero-prefixable-int
|
||||||
|
exp: '[eE] [\+\-]? {{zero_prefixable_int}}'
|
||||||
|
|
||||||
|
# date-time = offset-date-time / local-date-time / local-date / local-time
|
||||||
|
date_time: '{{offset_date_time}} | {{local_date_time}} | {{local_date}} | {{local_time}}'
|
||||||
|
# date-fullyear = 4DIGIT
|
||||||
|
date_fullyear: '[0-9]{4}'
|
||||||
|
# date-month = 2DIGIT ; 01-12
|
||||||
|
date_month: '[0-1][0-9]'
|
||||||
|
# date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on month/year
|
||||||
|
date_mday: '[0-3][0-9]'
|
||||||
|
# time-hour = 2DIGIT ; 00-23
|
||||||
|
time_hour: '[0-2][0-9]'
|
||||||
|
# time-minute = 2DIGIT ; 00-59
|
||||||
|
time_minute: '[0-5][0-9]'
|
||||||
|
# time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second rules
|
||||||
|
time_second: '[0-6][0-9]'
|
||||||
|
# time-secfrac = "." 1*DIGIT
|
||||||
|
time_secfrac: '\.[0-9]+'
|
||||||
|
# time-numoffset = ( "+" / "-" ) time-hour ":" time-minute
|
||||||
|
time_numoffset: '[+-] {{time_hour}} : {{time_minute}}'
|
||||||
|
# time-offset = "Z" / time-numoffset
|
||||||
|
time_offset: '(?: [zZ] | {{time_numoffset}} )'
|
||||||
|
# partial-time = time-hour ":" time-minute ":" time-second [time-secfrac]
|
||||||
|
partial_time: '{{time_hour}} : {{time_minute}} : {{time_second}} (?: {{time_secfrac}} )?'
|
||||||
|
# full-date = date-fullyear "-" date-month "-" date-mday
|
||||||
|
full_date: '{{date_fullyear}} - {{date_month}} - {{date_mday}}'
|
||||||
|
# full-time = partial-time time-offset
|
||||||
|
full_time: '{{partial_time}} {{time_offset}}'
|
||||||
|
# offset-date-time = full-date T|%20 full-time
|
||||||
|
offset_date_time: '{{full_date}} [tT ] {{full_time}}'
|
||||||
|
# local-date-time = full-date T|%20 partial-time
|
||||||
|
local_date_time: '{{full_date}} [tT ] {{partial_time}}'
|
||||||
|
# local-date = full-date
|
||||||
|
local_date: '{{full_date}}'
|
||||||
|
# local-time = partial-time
|
||||||
|
local_time: '{{partial_time}}'
|
||||||
|
|
||||||
|
contexts:
|
||||||
|
main:
|
||||||
|
- match: '^{{ws}}'
|
||||||
|
# Ignore leading whitespace for all expressions.
|
||||||
|
- include: comments
|
||||||
|
- include: tables
|
||||||
|
- include: keyval
|
||||||
|
- include: illegal
|
||||||
|
|
||||||
|
illegal:
|
||||||
|
- match: (.*)
|
||||||
|
# Invalid things -> everything unmatched
|
||||||
|
captures:
|
||||||
|
1: invalid.illegal.toml
|
||||||
|
|
||||||
|
comments:
|
||||||
|
- match: '{{ws}}((#).*)'
|
||||||
|
captures:
|
||||||
|
1: comment.line.number-sign.toml
|
||||||
|
2: punctuation.definition.comment.toml
|
||||||
|
|
||||||
|
data-types:
|
||||||
|
- include: inline-table
|
||||||
|
- include: array
|
||||||
|
- include: string
|
||||||
|
- include: date-time
|
||||||
|
- include: float
|
||||||
|
- include: integer
|
||||||
|
- include: boolean
|
||||||
|
- match: '{{ws}}$'
|
||||||
|
# Don't show an incomplete line as invalid to avoid frequent red
|
||||||
|
# highlighting while typing.
|
||||||
|
pop: true
|
||||||
|
- match: '\w+|.'
|
||||||
|
scope: invalid.illegal.value.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
boolean:
|
||||||
|
- match: (true|false)
|
||||||
|
captures:
|
||||||
|
1: constant.language.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
integer:
|
||||||
|
- match: |-
|
||||||
|
(?x)
|
||||||
|
(?<!\w)
|
||||||
|
{{hex_int}}
|
||||||
|
|{{oct_int}}
|
||||||
|
|{{bin_int}}
|
||||||
|
|{{integer}}
|
||||||
|
(?!\w)
|
||||||
|
captures:
|
||||||
|
0: constant.numeric.integer.toml
|
||||||
|
1: keyword.operator.arithmetic.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
float:
|
||||||
|
# float = float-int-part ( exp / frac [ exp ] )
|
||||||
|
# float =/ special-float
|
||||||
|
# special-float = [ minus / plus ] ( inf / nan )
|
||||||
|
# float-int-part = dec-int
|
||||||
|
- match: |-
|
||||||
|
(?x)
|
||||||
|
(?<!\w)
|
||||||
|
{{integer}}
|
||||||
|
(?: {{frac}} | (?: {{frac}} {{exp}} ) | {{exp}} )
|
||||||
|
(?!\w)
|
||||||
|
captures:
|
||||||
|
0: constant.numeric.float.toml
|
||||||
|
1: keyword.operator.arithmetic.toml
|
||||||
|
pop: true
|
||||||
|
- match: '(?<!\w)([+-])?(inf|nan)(?!\w)'
|
||||||
|
captures:
|
||||||
|
0: constant.numeric.float.toml
|
||||||
|
1: keyword.operator.arithmetic.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
date-time:
|
||||||
|
- match: '(?x) {{date_time}}'
|
||||||
|
scope: constant.other.datetime.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
string:
|
||||||
|
- match: "'''"
|
||||||
|
# multi-line literal string (no escape sequences)
|
||||||
|
scope: punctuation.definition.string.begin.toml
|
||||||
|
set:
|
||||||
|
- meta_scope: string.quoted.triple.literal.block.toml
|
||||||
|
- match: "'''"
|
||||||
|
scope: punctuation.definition.string.end.toml
|
||||||
|
pop: true
|
||||||
|
- match: '"""'
|
||||||
|
# multi-line basic string
|
||||||
|
scope: punctuation.definition.string.begin.toml
|
||||||
|
set:
|
||||||
|
- meta_scope: string.quoted.triple.basic.block.toml
|
||||||
|
- match: '"""'
|
||||||
|
scope: punctuation.definition.string.end.toml
|
||||||
|
pop: true
|
||||||
|
- include: string-escape
|
||||||
|
- include: basic-string
|
||||||
|
- include: literal-string
|
||||||
|
|
||||||
|
basic-string:
|
||||||
|
- match: '"'
|
||||||
|
scope: punctuation.definition.string.begin.toml
|
||||||
|
set:
|
||||||
|
- meta_scope: string.quoted.double.basic.toml
|
||||||
|
- include: string-escape
|
||||||
|
- match: '"'
|
||||||
|
scope: punctuation.definition.string.end.toml
|
||||||
|
pop: true
|
||||||
|
- match: '\n'
|
||||||
|
scope: invalid.illegal.string.non-terminated.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
string-escape:
|
||||||
|
- match: '\\(?:[btnfr"\\]|u\h{4}|U\h{8})'
|
||||||
|
scope: constant.character.escape.toml
|
||||||
|
- match: '\\.'
|
||||||
|
scope: invalid.illegal.string.escape.toml
|
||||||
|
|
||||||
|
literal-string:
|
||||||
|
- match: '('')[^'']*('')'
|
||||||
|
# There is ambiguity in what is allowed in a literal string.
|
||||||
|
# See: https://github.com/toml-lang/toml/issues/473
|
||||||
|
scope: string.quoted.single.literal.toml
|
||||||
|
captures:
|
||||||
|
1: punctuation.definition.string.begin.toml
|
||||||
|
2: punctuation.definition.string.end.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
array:
|
||||||
|
- match: '\['
|
||||||
|
scope: punctuation.definition.array.begin.toml
|
||||||
|
set: [maybe-empty-array, maybe-array-comments]
|
||||||
|
|
||||||
|
maybe-empty-array:
|
||||||
|
- match: ']'
|
||||||
|
scope: punctuation.definition.array.end.toml
|
||||||
|
pop: true
|
||||||
|
- match: ''
|
||||||
|
set: [array-sep, data-types]
|
||||||
|
|
||||||
|
array-sep:
|
||||||
|
- match: '{{wsnl}}'
|
||||||
|
- include: comments
|
||||||
|
- match: ']'
|
||||||
|
scope: punctuation.definition.array.end.toml
|
||||||
|
pop: true
|
||||||
|
- match: ','
|
||||||
|
scope: punctuation.separator.array.toml
|
||||||
|
set:
|
||||||
|
- match: '{{wsnl}}'
|
||||||
|
- include: comments
|
||||||
|
- match: ']'
|
||||||
|
scope: punctuation.definition.array.end.toml
|
||||||
|
pop: true
|
||||||
|
- match: '(?=[^\n])'
|
||||||
|
set: [array-sep, data-types]
|
||||||
|
- match: '\w+|.'
|
||||||
|
scope: invalid.illegal.array.toml
|
||||||
|
|
||||||
|
maybe-array-comments:
|
||||||
|
- match: '{{wsnl}}'
|
||||||
|
- include: comments
|
||||||
|
- match: '(?=[^\n])'
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
inline-table:
|
||||||
|
- match: '\{'
|
||||||
|
scope: punctuation.definition.inline-table.begin.toml
|
||||||
|
set:
|
||||||
|
- match: '{{ws}}'
|
||||||
|
- match: '\}'
|
||||||
|
# Empty table.
|
||||||
|
scope: punctuation.definition.inline-table.end.toml
|
||||||
|
pop: true
|
||||||
|
- match: ''
|
||||||
|
set: [inline-keyval-sep, key]
|
||||||
|
|
||||||
|
inline-keyval-sep:
|
||||||
|
- match: '{{ws}}(=){{ws}}'
|
||||||
|
captures:
|
||||||
|
1: punctuation.definition.key-value.toml
|
||||||
|
set: [inline-table-keyvals, data-types]
|
||||||
|
- match: '(?=\w+|.)'
|
||||||
|
scope: invalid.illegal.inline-sep.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
inline-table-keyvals:
|
||||||
|
- match: '{{ws}}'
|
||||||
|
- match: '\}'
|
||||||
|
scope: punctuation.definition.inline-table.end.toml
|
||||||
|
pop: true
|
||||||
|
- match: ','
|
||||||
|
scope: punctuation.separator.inline-table.toml
|
||||||
|
set:
|
||||||
|
- match: '{{ws}}'
|
||||||
|
- match: ''
|
||||||
|
set: [inline-keyval-sep, key]
|
||||||
|
- match: '(?=\w+|.)'
|
||||||
|
scope: invalid.illegal.inline-key.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
keyval:
|
||||||
|
- match: '{{peek_key_start}}'
|
||||||
|
push: [keyval-sep, key]
|
||||||
|
|
||||||
|
keyval-sep:
|
||||||
|
- match: '{{ws}}(=){{ws}}'
|
||||||
|
captures:
|
||||||
|
# This could arguably be keyword.operator.assignment.toml, but since
|
||||||
|
# Monokai uses the same color for non-C sources with entity.name.tag,
|
||||||
|
# it doesn't have the appropriate visual distinction.
|
||||||
|
1: punctuation.definition.key-value.toml
|
||||||
|
set: [maybe-comment-eol, data-types]
|
||||||
|
- match: '{{ws}}$'
|
||||||
|
# Don't show an incomplete line as invalid to avoid flickering.
|
||||||
|
pop: true
|
||||||
|
- match: '.+$'
|
||||||
|
scope: invalid.illegal.keyval.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
key:
|
||||||
|
- meta_scope: meta.tag.key.toml
|
||||||
|
- match: '{{peek_key_start}}'
|
||||||
|
push: [maybe-dot-key, key-simple]
|
||||||
|
- match: '(?={{ws}}=)'
|
||||||
|
pop: true
|
||||||
|
- match: '{{ws}}$'
|
||||||
|
# Early exit to avoid errors while typing.
|
||||||
|
pop: true
|
||||||
|
- match: '.'
|
||||||
|
scope: invalid.illegal.key.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
key-simple:
|
||||||
|
- match: '[A-Za-z0-9_-]+'
|
||||||
|
scope: entity.name.tag.toml
|
||||||
|
pop: true
|
||||||
|
- include: key-quoted
|
||||||
|
- match: '\S+'
|
||||||
|
scope: invalid.illegal.key.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
key-quoted:
|
||||||
|
- include: basic-string
|
||||||
|
- include: literal-string
|
||||||
|
|
||||||
|
maybe-dot-key:
|
||||||
|
- match: '{{dot_peek_key}}'
|
||||||
|
captures:
|
||||||
|
1: punctuation.separator.key.toml
|
||||||
|
push: key-simple
|
||||||
|
- match: '(?={{ws}}(?:=|$))'
|
||||||
|
pop: true
|
||||||
|
- match: '.'
|
||||||
|
scope: invalid.illegal.key.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
maybe-comment-eol:
|
||||||
|
- include: comments
|
||||||
|
- match: '$'
|
||||||
|
pop: true
|
||||||
|
- match: '.+'
|
||||||
|
# This also highlights trailing whitespece. Although that is valid
|
||||||
|
# TOML, it doesn't seem bad to me. If that's annoying, change this
|
||||||
|
# to '[^ \n]+'.
|
||||||
|
scope: invalid.illegal.trailing.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
tables:
|
||||||
|
- match: '\[?\[{{ws}}\]\]?'
|
||||||
|
scope: invalid.illegal.table.toml
|
||||||
|
|
||||||
|
- match: '(\[\[){{ws}}'
|
||||||
|
# Array table. Same as std-table with double-brackets.
|
||||||
|
captures:
|
||||||
|
1: punctuation.definition.table.array.begin.toml
|
||||||
|
push: [maybe-comment-eol, table-array-name]
|
||||||
|
|
||||||
|
- match: '(\[){{ws}}'
|
||||||
|
# std-table = ws "[" ws key (ws "." ws key)* ws "]" ws comment?
|
||||||
|
captures:
|
||||||
|
1: punctuation.definition.table.begin.toml
|
||||||
|
push: [maybe-comment-eol, table-name]
|
||||||
|
|
||||||
|
table-name:
|
||||||
|
- meta_content_scope: meta.tag.table.toml
|
||||||
|
- match: '{{ws}}(\])'
|
||||||
|
captures:
|
||||||
|
1: punctuation.definition.table.end.toml
|
||||||
|
pop: true
|
||||||
|
- include: table-name-inc
|
||||||
|
|
||||||
|
table-array-name:
|
||||||
|
- meta_content_scope: meta.tag.table.array.toml
|
||||||
|
- match: '{{ws}}(\]\])'
|
||||||
|
captures:
|
||||||
|
1: punctuation.definition.table.array.end.toml
|
||||||
|
pop: true
|
||||||
|
- include: table-name-inc
|
||||||
|
|
||||||
|
table-name-inc:
|
||||||
|
- match: '{{peek_key_start}}'
|
||||||
|
push: [maybe-dot-table-name, table-name-simple]
|
||||||
|
- match: '[^\]]+\]?'
|
||||||
|
scope: invalid.illegal.table.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
table-name-simple:
|
||||||
|
- match: '[A-Za-z0-9_-]+'
|
||||||
|
scope: entity.name.table.toml
|
||||||
|
pop: true
|
||||||
|
- include: key-quoted
|
||||||
|
- match: '.'
|
||||||
|
scope: invalid.illegal.table.toml
|
||||||
|
pop: true
|
||||||
|
|
||||||
|
maybe-dot-table-name:
|
||||||
|
- match: '{{dot_peek_key}}'
|
||||||
|
captures:
|
||||||
|
1: punctuation.separator.table.toml
|
||||||
|
push: table-name-simple
|
||||||
|
- match: '(?={{ws}}(?:\]|$))'
|
||||||
|
pop: true
|
||||||
|
- match: '.'
|
||||||
|
scope: invalid.illegal.table.toml
|
||||||
|
pop: true
|
Loading…
Reference in New Issue