Also fix gutenberg serve that has been broken (not re-rendering content) for quite some time now.index-subcmd
@@ -0,0 +1,21 @@ | |||||
[submodule "sublime_syntaxes/Packages"] | |||||
path = sublime_syntaxes/Packages | |||||
url = git@github.com:sublimehq/Packages.git | |||||
[submodule "sublime_syntaxes/sublimeassembly"] | |||||
path = sublime_syntaxes/sublimeassembly | |||||
url = https://github.com/Nessphoro/sublimeassembly.git | |||||
[submodule "sublime_syntaxes/LESS-sublime"] | |||||
path = sublime_syntaxes/LESS-sublime | |||||
url = https://github.com/danro/LESS-sublime.git | |||||
[submodule "sublime_syntaxes/TypeScript-Sublime-Plugin"] | |||||
path = sublime_syntaxes/TypeScript-Sublime-Plugin | |||||
url = https://github.com/Microsoft/TypeScript-Sublime-Plugin.git | |||||
[submodule "sublime_syntaxes/Handlebars"] | |||||
path = sublime_syntaxes/Handlebars | |||||
url = https://github.com/daaain/Handlebars.git | |||||
[submodule "sublime_syntaxes/Julia-sublime"] | |||||
path = sublime_syntaxes/Julia-sublime | |||||
url = https://github.com/JuliaEditorSupport/Julia-sublime.git | |||||
[submodule "sublime_syntaxes/Elm.tmLanguage"] | |||||
path = sublime_syntaxes/Elm.tmLanguage | |||||
url = https://github.com/elm-community/Elm.tmLanguage.git |
@@ -148,9 +148,6 @@ built-in: | |||||
- solarized-dark | - solarized-dark | ||||
- solarized-light | - solarized-light | ||||
A gallery containing lots of themes at https://tmtheme-editor.herokuapp.com/#!/editor/theme/Agola%20Dark. | |||||
More themes can be easily added to gutenberg, just make a PR with the wanted theme. | |||||
### Internal links | ### Internal links | ||||
You can have internal links in your markdown that will be replaced with the full URL when rendering. | You can have internal links in your markdown that will be replaced with the full URL when rendering. | ||||
To do so, use the normal markdown link syntax, start the link with `./` and point to the `.md` file you want | To do so, use the normal markdown link syntax, start the link with `./` and point to the `.md` file you want | ||||
@@ -207,3 +204,41 @@ In case of shortcodes with a body, the body will be passed as the `body` variabl | |||||
## Example sites | ## Example sites | ||||
- [vincent.is](https://vincent.is): https://gitlab.com/Keats/vincent.is | - [vincent.is](https://vincent.is): https://gitlab.com/Keats/vincent.is | ||||
## Adding syntax highlighting languages and themes | |||||
### Adding a syntax | |||||
Syntax highlighting depends on submodules so ensure you load them first: | |||||
```bash | |||||
$ git submodule update --init | |||||
``` | |||||
Gutenberg only works with syntaxes in the `.sublime-syntax` format. If your syntax | |||||
is in `.tmLanguage` format, open it in Sublime Text and convert it to `sublime-syntax` by clicking on | |||||
Tools > Developer > New Syntax from ... and put it at the root of `sublime_syntaxes`. | |||||
You can also add a submodule to the repository of the wanted syntax: | |||||
```bash | |||||
$ cd sublime_syntaxes | |||||
$ git submodule add https://github.com/elm-community/Elm.tmLanguage.git | |||||
``` | |||||
Note that you can also only copy manually the updated syntax definition file but this means | |||||
Gutenberg won't be able to automatically update it. | |||||
And finally from the root of the repository run the following command: | |||||
```bash | |||||
$ cargo run --example generate_sublime synpack sublime_syntaxes sublime_syntaxes/newlines.packdump sublime_syntaxes/nonewlines.packdump | |||||
``` | |||||
### Adding a theme | |||||
A gallery containing lots of themes at https://tmtheme-editor.herokuapp.com/#!/editor/theme/Agola%20Dark. | |||||
More themes can be easily added to gutenberg, just make a PR with the wanted theme added in the `sublime_themes` directory | |||||
and run the following command from the repository root: | |||||
```bash | |||||
$ cargo run --example generate_sublime themepack sublime_themes sublime_themes/all.themedump | |||||
``` | |||||
You should see the list of themes being added. |
@@ -9,19 +9,18 @@ use syntect::dumps::*; | |||||
use std::env; | use std::env; | ||||
fn usage_and_exit() -> ! { | fn usage_and_exit() -> ! { | ||||
println!("USAGE: gendata synpack source-dir newlines.packdump nonewlines.packdump\n | |||||
gendata themepack source-dir themepack.themedump"); | |||||
println!("USAGE: cargo run --example generate_sublime synpack source-dir newlines.packdump nonewlines.packdump\n | |||||
cargo run --example generate_sublime themepack source-dir themepack.themedump"); | |||||
::std::process::exit(2); | ::std::process::exit(2); | ||||
} | } | ||||
// Not an example of Gutenberg but is used to generate the theme and syntax dump | |||||
// used for syntax highlighting. | |||||
// Check README for more details | |||||
fn main() { | fn main() { | ||||
let mut a = env::args().skip(1); | |||||
match (a.next(), a.next(), a.next(), a.next()) { | |||||
(Some(ref cmd), | |||||
Some(ref package_dir), | |||||
Some(ref packpath_newlines), | |||||
Some(ref packpath_nonewlines)) if cmd == "synpack" => { | |||||
let mut args = env::args().skip(1); | |||||
match (args.next(), args.next(), args.next(), args.next()) { | |||||
(Some(ref cmd), Some(ref package_dir), Some(ref packpath_newlines), Some(ref packpath_nonewlines)) if cmd == "synpack" => { | |||||
let mut ps = SyntaxSet::new(); | let mut ps = SyntaxSet::new(); | ||||
ps.load_plain_text_syntax(); | ps.load_plain_text_syntax(); | ||||
ps.load_syntaxes(package_dir, true).unwrap(); | ps.load_syntaxes(package_dir, true).unwrap(); | ||||
@@ -31,9 +30,8 @@ fn main() { | |||||
ps.load_plain_text_syntax(); | ps.load_plain_text_syntax(); | ||||
ps.load_syntaxes(package_dir, false).unwrap(); | ps.load_syntaxes(package_dir, false).unwrap(); | ||||
dump_to_file(&ps, packpath_nonewlines).unwrap(); | dump_to_file(&ps, packpath_nonewlines).unwrap(); | ||||
} | |||||
(Some(ref s), Some(ref theme_dir), Some(ref packpath), None) if s == "themepack" => { | |||||
}, | |||||
(Some(ref cmd), Some(ref theme_dir), Some(ref packpath), None) if cmd == "themepack" => { | |||||
let ts = ThemeSet::load_from_folder(theme_dir).unwrap(); | let ts = ThemeSet::load_from_folder(theme_dir).unwrap(); | ||||
for path in ts.themes.keys() { | for path in ts.themes.keys() { | ||||
println!("{:?}", path); | println!("{:?}", path); |
@@ -18,7 +18,7 @@ use errors::{Result, ResultExt}; | |||||
// We need to put those in a struct to impl Send and sync | // We need to put those in a struct to impl Send and sync | ||||
pub struct Setup { | pub struct Setup { | ||||
syntax_set: SyntaxSet, | |||||
pub syntax_set: SyntaxSet, | |||||
pub theme_set: ThemeSet, | pub theme_set: ThemeSet, | ||||
} | } | ||||
@@ -28,7 +28,11 @@ unsafe impl Sync for Setup {} | |||||
lazy_static!{ | lazy_static!{ | ||||
static ref SHORTCODE_RE: Regex = Regex::new(r#"\{(?:%|\{)\s+([[:alnum:]]+?)\(([[:alnum:]]+?="?.+?"?)\)\s+(?:%|\})\}"#).unwrap(); | static ref SHORTCODE_RE: Regex = Regex::new(r#"\{(?:%|\{)\s+([[:alnum:]]+?)\(([[:alnum:]]+?="?.+?"?)\)\s+(?:%|\})\}"#).unwrap(); | ||||
pub static ref SETUP: Setup = Setup { | pub static ref SETUP: Setup = Setup { | ||||
syntax_set: SyntaxSet::load_defaults_newlines(), | |||||
syntax_set: { | |||||
let mut ps: SyntaxSet = from_binary(include_bytes!("../sublime_syntaxes/newlines.packdump")); | |||||
ps.link_syntaxes(); | |||||
ps | |||||
}, | |||||
theme_set: from_binary(include_bytes!("../sublime_themes/all.themedump")) | theme_set: from_binary(include_bytes!("../sublime_themes/all.themedump")) | ||||
}; | }; | ||||
} | } | ||||
@@ -70,6 +70,7 @@ pub struct Site { | |||||
static_path: PathBuf, | static_path: PathBuf, | ||||
pub tags: HashMap<String, Vec<PathBuf>>, | pub tags: HashMap<String, Vec<PathBuf>>, | ||||
pub categories: HashMap<String, Vec<PathBuf>>, | pub categories: HashMap<String, Vec<PathBuf>>, | ||||
pub permalinks: HashMap<String, String>, | |||||
} | } | ||||
impl Site { | impl Site { | ||||
@@ -96,6 +97,7 @@ impl Site { | |||||
static_path: path.join("static"), | static_path: path.join("static"), | ||||
tags: HashMap::new(), | tags: HashMap::new(), | ||||
categories: HashMap::new(), | categories: HashMap::new(), | ||||
permalinks: HashMap::new(), | |||||
}; | }; | ||||
Ok(site) | Ok(site) | ||||
@@ -146,6 +148,7 @@ impl Site { | |||||
page.render_markdown(&permalinks, &self.tera, &self.config)?; | page.render_markdown(&permalinks, &self.tera, &self.config)?; | ||||
} | } | ||||
self.permalinks = permalinks; | |||||
self.populate_sections(); | self.populate_sections(); | ||||
self.populate_tags_and_categories(); | self.populate_tags_and_categories(); | ||||
@@ -166,6 +169,14 @@ impl Site { | |||||
Ok(()) | Ok(()) | ||||
} | } | ||||
/// Called in serve, add a page again updating permalinks and its content | |||||
fn add_page_and_render(&mut self, path: &Path) -> Result<()> { | |||||
self.add_page(path)?; | |||||
let mut page = self.pages.get_mut(path).unwrap(); | |||||
self.permalinks.insert(page.relative_path.clone(), page.permalink.clone()); | |||||
page.render_markdown(&self.permalinks, &self.tera, &self.config) | |||||
} | |||||
/// Find out the direct subsections of each subsection if there are some | /// Find out the direct subsections of each subsection if there are some | ||||
/// as well as the pages for each section | /// as well as the pages for each section | ||||
fn populate_sections(&mut self) { | fn populate_sections(&mut self) { | ||||
@@ -272,15 +283,17 @@ impl Site { | |||||
self.add_section(path)?; | self.add_section(path)?; | ||||
} else { | } else { | ||||
// probably just an update so just re-parse that page | // probably just an update so just re-parse that page | ||||
self.add_page(path)?; | |||||
self.add_page_and_render(path)?; | |||||
} | } | ||||
} else { | } else { | ||||
// new file? | // new file? | ||||
self.add_page(path)?; | |||||
self.add_page_and_render(path)?; | |||||
} | } | ||||
} else { | } else { | ||||
// File doesn't exist -> a deletion so we remove it from | |||||
// File doesn't exist -> a deletion so we remove it from everything | |||||
let relative_path = self.pages[path].relative_path.clone(); | |||||
self.pages.remove(path); | self.pages.remove(path); | ||||
self.permalinks.remove(&relative_path); | |||||
} | } | ||||
self.populate_sections(); | self.populate_sections(); | ||||
self.populate_tags_and_categories(); | self.populate_tags_and_categories(); | ||||
@@ -0,0 +1,67 @@ | |||||
%YAML 1.2 | |||||
--- | |||||
# http://www.sublimetext.com/docs/3/syntax.html | |||||
name: Assembly x86 (NASM) | |||||
file_extensions: | |||||
- asm | |||||
- inc | |||||
scope: source.assembly | |||||
contexts: | |||||
main: | |||||
- match: \b(?i)(v)?(aaa|aad|aam|aas|adc|add|addpd|addps|addsd|addss|addsubpd|addsubps|aesdec|aesdeclast|aesenc|aesenclast|aesimc|aeskeygenassist|and|andpd|andps|andnpd|andnps|arpl|blendpd|bmi|blendps|blendvpd|blendvps|bound|bsf|bsr|bswap|bt|btc|btr|bts|cbw|cwde|cdqe|clc|cld|cflush|clts|cmc|cmov(n?e|ge?|ae?|le?|be?|n?o|n?z)|cmp|cmppd|cmpps|cmps|cnpsb|cmpsw|cmpsd|cmpsq|cmpss|cmpxchg|cmpxchg8b|cmpxchg16b|comisd|comiss|cpuid|crc32|cvtdq2pd|cvtdq2ps|cvtpd2dq|cvtpd2pi|cvtpd2ps|cvtpi2pd|cvtpi2ps|cvtps2dq|cvtps2pd|cvtps2pi|cvtsd2si|cvtsd2ss|cvts2sd|cvtsi2ss|cvtss2sd|cvtss2si|cvttpd2dq|cvtpd2pi|cvttps2dq|cvttps2pi|cvttps2dq|cvttps2pi|cvttsd2si|cvttss2si|cwd|cdq|cqo|daa|das|dec|div|divpd|divps|divsd|divss|dppd|dpps|emms|enter|extractps|f2xm1|fabs|fadd|faddp|fiadd|fbld|fbstp|fchs|fclex|fnclex|fcmov(n?e|ge?|ae?|le?|be?|n?o|n?z)|fcom|fcmop|fcompp|fcomi|fcomip|fucomi|fucomip|fcos|fdecstp|fdiv|fdivp|fidiv|fdivr|fdivrp|fidivr|ffree|ficom|ficomp|fild|fincstp|finit|fnint|fist|fistp|fisttp|fld|fld1|fldl2t|fldl2e|fldpi|fldlg2|fldln2|fldz|fldcw|fldenv|fmul|fmulp|fimul|fnop|fpatan|fprem|fprem1|fptan|frndint|frstor|fsave|fnsave|fscale|fsin|fsincos|fsqrt|fst|fstp|fstcw|fnstcw|fstenv|fnstenv|fsts(w?)|fnstsw|fsub|fsubp|fisub|fsubr|fsubrp|fisubr|ftst|fucom|fucomp|fucompp|fxam|fxch|fxrstor|fxsave|fxtract|fyl2x|fyl2xp1|haddpd|haddps|husbpd|hsubps|idiv|imul|in|inc|ins|insb|insw|insd|insertps|int|into|invd|invlpg|invpcid|iret|iretd|iretq|lahf|lar|lddqu|ldmxcsr|lds|les|lfs|lgs|lss|lea|leave|lfence|lgdt|lidt|llgdt|lmsw|lock|lods|lodsb|lodsw|lodsd|lodsq|lsl|ltr|maskmovdqu|maskmovq|maxpd|maxps|maxsd|maxss|mfence|minpd|minps|minsd|minss|monitor|mov|movapd|movaps|movbe|movd|movq|movddup|movdqa|movdqu|movq2q|movhlps|movhpd|movhps|movlhps|movlpd|movlps|movmskpd|movmskps|movntdqa|movntdq|movnti|movntpd|movntps|movntq|movq|movq2dq|movs|movsb|movsw|movsd|movsq|movsd|movshdup|movsldup|movss|movsx|movsxd|movupd|movups|movzx|mpsadbw|mul|mulpd|mulps|mulsd|mulss|mwait|neg|not|or|orpd|orps|out|outs|outsb|outsw|outsd|pabsb|pabsw|pabsd|packsswb|packssdw|packusdw|packuswb|paddb|paddw|paddd|paddq|paddsb|paddsw|paddusb|paddusw|palignr|pand|pandn|pause|pavgb|pavgw|pblendvb|pblendw|pclmulqdq|pcmpeqb|pcmpeqw|pcmpeqd|pcmpeqq|pcmpestri|pcmpestrm|pcmptb|pcmptgw|pcmpgtd|pcmpgtq|pcmpistri|pcmpisrm|pdep|pext|pextrb|pextrd|pextrq|pextrw|phaddw|phaddd|phaddsw|phinposuw|phsubw|phsubd|phsubsw|pinsrb|pinsrd|pinsrq|pinsrw|pmaddubsw|pmadddwd|pmaxsb|pmaxsd|pmaxsw|pmaxsw|pmaxub|pmaxud|pmaxuw|pminsb|pminsd|pminsw|pminub|pminud|pminuw|pmovmskb|pmovsx|pmovzx|pmuldq|pmulhrsw|pmulhuw|pmulhw|pmulld|pmullw|pmuludw|pop|popa|popad|popcnt|popf|popfd|popfq|por|prefetch|psadbw|pshufb|pshufd|pshufhw|pshuflw|pshufw|psignb|psignw|psignd|pslldq|psllw|pslld|psllq|psraw|psrad|psrldq|psrlw|psrld|psrlq|psubb|psubw|psubd|psubq|psubsb|psubsw|psubusb|psubusw|test|ptest|punpckhbw|punpckhwd|punpckhdq|punpckhddq|punpcklbw|punpcklwd|punpckldq|punpckldqd|push|pusha|pushad|pushf|pushfd|pxor|prcl|rcr|rol|ror|rcpps|rcpss|rdfsbase|rdgsbase|rdmsr|rdpmc|rdrand|rdtsc|rdtscp|rep|repe|repz|repne|repnz|roundpd|roundps|roundsd|roundss|rsm|rsqrps|rsqrtss|sahf|sal|sar|shl|shr|sbb|scas|scasb|scasw|scasd|set(n?e|ge?|ae?|le?|be?|n?o|n?z)|sfence|sgdt|shld|shrd|shufpd|shufps|sidt|sldt|smsw|sqrtpd|sqrtps|sqrtsd|sqrtss|stc|std|stmxcsr|stos|stosb|stosw|stosd|stosq|str|sub|subpd|subps|subsd|subss|swapgs|syscall|sysenter|sysexit|sysret|teset|ucomisd|ucomiss|ud2|unpckhpd|unpckhps|unpcklpd|unpcklps|vbroadcast|vcvtph2ps|vcvtp2sph|verr|verw|vextractf128|vinsertf128|vmaskmov|vpermilpd|vpermilps|vperm2f128|vtestpd|vzeroall|vzeroupper|wait|fwait|wbinvd|wrfsbase|wrgsbase|wrmsr|xadd|xchg|xgetbv|xlat|xlatb|xor|xorpd|xorps|xrstor|xsave|xsaveopt|xsetbv|lzcnt|extrq|insertq|movntsd|movntss|vfmaddpd|vfmaddps|vfmaddsd|vfmaddss|vfmaddsubbpd|vfmaddsubps|vfmsubaddpd|vfmsubaddps|vfmsubpd|vfmsubps|vfmsubsd|vfnmaddpd|vfnmaddps|vfnmaddsd|vfnmaddss|vfnmsubpd|vfnmusbps|vfnmusbsd|vfnmusbss|vbroadcastss|vbroadcastsd|vbroadcastf128|vmaskmovps|vmaskmovpd|cvt|xor|cli|sti|hlt|nop|lock|wait|enter|leave|ret|loop(n?e|n?z)?|call|j(mp|n?e|n?ge?|n?ae?|le?|be?|n?o|n?z|n?c|n?p|n?b))\b | |||||
scope: keyword.control.assembly | |||||
- match: '\b(?i)(RBP|EBP|BP|CS|DS|ES|FS|GS|SS|RAX|EAX|RBX|EBX|RCX|ECX|RDX|EDX|RIP|EIP|IP|RSP|ESP|SP|RSI|ESI|SI|RDI|EDI|DI|RFLAGS|EFLAGS|FLAGS|R(8|9|10|11|12|13|14|15)(d|w|b)?|(Y|X)MM([0-9]|10|11|12|13|14|15)|(A|B|C|D)(X|H|L)|CR[0-4]|DR[0-7]|TR6|TR7|EFER)\b' | |||||
scope: variable.parameter.register.assembly | |||||
- match: '\b[0-9]+\b' | |||||
scope: constant.character.decimal.assembly | |||||
- match: '\b(0x)(?i)[A-F0-9]+\b' | |||||
scope: constant.character.hexadecimal.assembly | |||||
- match: '\b(?i)[A-F0-9]+h\b' | |||||
scope: constant.character.hexadecimal.assembly | |||||
- match: \b(?i)(0|1)+b\b | |||||
scope: constant.character.binary.assembly | |||||
- match: ("|').*?("|') | |||||
scope: string.assembly | |||||
- match: '^\[' | |||||
push: | |||||
- meta_scope: support.function.directive.assembly | |||||
- match: '\]' | |||||
pop: true | |||||
- match: "(^struc) ([_a-zA-Z][_a-zA-Z0-9]*)" | |||||
scope: support.function.directive.assembly | |||||
captures: | |||||
2: entity.name.function.assembly | |||||
- match: ^endstruc | |||||
scope: support.function.directive.assembly | |||||
- match: "^%macro ([_a-zA-Z][_a-zA-Z0-9]*) ([0-9]+)" | |||||
scope: support.function.directive.assembly | |||||
captures: | |||||
1: entity.name.function.assembly | |||||
2: constant.character.assembly | |||||
- match: ^%endmacro | |||||
scope: support.function.directive.assembly | |||||
- match: ^%comment | |||||
push: | |||||
- meta_scope: comment.assembly | |||||
- match: ^%endcomment | |||||
pop: true | |||||
- match: '\s*(?i)(%define|%ifndef|%xdefine|%idefine|%undef|%assign|%defstr|%strcat|%strlen|%substr|%00|%0|%rotate|%rep|%endrep|%include|\$\$|\$|%unmacro|%if|%elif|%else|%endif|%(el)?ifdef|%(el)?ifmacro|%(el)?ifctx|%(el)?ifidn|%(el)?ifidni|%(el)?ifid|%(el)?ifnum|%(el)?ifstr|%(el)?iftoken|%(el)?ifempty|%(el)?ifenv|%pathsearch|%depend|%use|%push|%pop|%repl|%arg|%stacksize|%local|%error|%warning|%fatal|%line|%!|%comment|%endcomment|__NASM_VERSION_ID__|__NASM_VER__|__FILE__|__LINE__|__BITS__|__OUTPUT_FORMAT__|__DATE__|__TIME__|__DATE_NUM__|_TIME__NUM__|__UTC_DATE__|__UTC_TIME__|__UTC_DATE_NUM__|__UTC_TIME_NUM__|__POSIX_TIME__|__PASS__|ISTRUC|AT|IEND|BITS 16|BITS 32|BITS 64|USE16|USE32|__SECT__|ABSOLUTE|EXTERN|GLOBAL|COMMON|CPU|FLOAT)\b ?([_a-zA-Z][_a-zA-Z0-9]*)?' | |||||
captures: | |||||
1: support.function.directive.assembly | |||||
13: entity.name.function.assembly | |||||
- match: \b(?i)(d(b|w|d|q|t|o|y)|res(b|w|d|q|t|o)|equ|times|align|alignb|sectalign|section|ptr|byte|word|dword|qword|incbin|)\b | |||||
scope: support.function.directive.assembly | |||||
- match: (\s)*;.*$ | |||||
scope: comment.assembly | |||||
- match: '(,|\[|\]|\+|\-|\*)' | |||||
scope: source.assembly | |||||
- match: '^\s*%%(.-[;])+?:$' | |||||
scope: entity.name.function.assembly | |||||
- match: '^\s*%\$(.-[;])+?:$' | |||||
scope: entity.name.function.assembly | |||||
- match: '^\.?(.-[;])+?:$' | |||||
scope: entity.name.function.assembly | |||||
- match: '^\.?(.-[;])+?\b' | |||||
scope: entity.name.function.assembly | |||||
- match: .+? | |||||
scope: entity.name.function.assembly |
@@ -0,0 +1,200 @@ | |||||
%YAML 1.2 | |||||
--- | |||||
# http://www.sublimetext.com/docs/3/syntax.html | |||||
name: Elm | |||||
file_extensions: | |||||
- elm | |||||
scope: source.elm | |||||
contexts: | |||||
main: | |||||
- match: "(`)[a-zA-Z_']*?(`)" | |||||
scope: keyword.operator.function.infix.elm | |||||
captures: | |||||
1: punctuation.definition.entity.elm | |||||
2: punctuation.definition.entity.elm | |||||
- match: \(\) | |||||
scope: constant.language.unit.elm | |||||
- match: ^\b((effect|port)\s+)?(module)\s+ | |||||
captures: | |||||
1: keyword.other.elm | |||||
3: keyword.other.elm | |||||
push: | |||||
- meta_scope: meta.declaration.module.elm | |||||
- match: $|; | |||||
captures: | |||||
1: keyword.other.elm | |||||
pop: true | |||||
- include: module_name | |||||
- match: '(where)\s*\{' | |||||
captures: | |||||
1: keyword.other.elm | |||||
push: | |||||
- match: '\}' | |||||
pop: true | |||||
- include: type_signature | |||||
- match: (exposing) | |||||
scope: keyword.other.elm | |||||
- include: module_exports | |||||
- match: (where) | |||||
scope: keyword.other.elm | |||||
- match: "[a-z]+" | |||||
scope: invalid | |||||
- match: ^\b(import)\s+((open)\s+)? | |||||
captures: | |||||
1: keyword.other.elm | |||||
3: invalid | |||||
push: | |||||
- meta_scope: meta.import.elm | |||||
- match: ($|;) | |||||
pop: true | |||||
- match: (as|exposing) | |||||
scope: keyword.import.elm | |||||
- include: module_name | |||||
- include: module_exports | |||||
- match: '(\[)(glsl)(\|)' | |||||
captures: | |||||
1: keyword.other.elm | |||||
2: support.function.prelude.elm | |||||
3: keyword.other.elm | |||||
push: | |||||
- meta_scope: entity.glsl.elm | |||||
- match: '(\|\])' | |||||
captures: | |||||
1: keyword.other.elm | |||||
pop: true | |||||
- include: scope:source.glsl | |||||
- match: \b(type alias|type|case|of|let|in|as)\s+ | |||||
scope: keyword.other.elm | |||||
- match: \b(if|then|else)\s+ | |||||
scope: keyword.control.elm | |||||
- match: '\b([0-9]+\.[0-9]+([eE][+-]?[0-9]+)?|[0-9]+[eE][+-]?[0-9]+)\b' | |||||
comment: Floats are always decimal | |||||
scope: constant.numeric.float.elm | |||||
- match: '\b([0-9]+)\b' | |||||
scope: constant.numeric.elm | |||||
- match: '"""' | |||||
captures: | |||||
0: punctuation.definition.string.begin.elm | |||||
push: | |||||
- meta_scope: string.quoted.double.elm | |||||
- match: '"""' | |||||
captures: | |||||
0: punctuation.definition.string.end.elm | |||||
pop: true | |||||
- match: '\\(NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[abfnrtv\\''\&])' | |||||
scope: constant.character.escape.elm | |||||
- match: '\^[A-Z@\[\]\\\^_]' | |||||
scope: constant.character.escape.control.elm | |||||
- match: '"' | |||||
captures: | |||||
0: punctuation.definition.string.begin.elm | |||||
push: | |||||
- meta_scope: string.quoted.double.elm | |||||
- match: '"' | |||||
captures: | |||||
0: punctuation.definition.string.end.elm | |||||
pop: true | |||||
- match: '\\(NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[abfnrtv\\\"''\&])' | |||||
scope: constant.character.escape.elm | |||||
- match: '\^[A-Z@\[\]\\\^_]' | |||||
scope: constant.character.escape.control.elm | |||||
- match: |- | |||||
(?x) | |||||
(') | |||||
(?: | |||||
[\ -\[\]-~] # Basic Char | |||||
| (\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE | |||||
|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS | |||||
|US|SP|DEL|[abfnrtv\\\"'\&])) # Escapes | |||||
| (\^[A-Z@\[\]\\\^_]) # Control Chars | |||||
) | |||||
(') | |||||
scope: string.quoted.single.elm | |||||
captures: | |||||
1: punctuation.definition.string.begin.elm | |||||
2: constant.character.escape.elm | |||||
3: punctuation.definition.string.end.elm | |||||
- match: '^(port\s+)?([a-z_][a-zA-Z0-9_'']*|\([|!%$+\-.,=</>]+\))\s*((:)([:]+)?)' | |||||
captures: | |||||
1: keyword.other.port.elm | |||||
2: entity.name.function.elm | |||||
4: keyword.other.colon.elm | |||||
5: invalid | |||||
push: | |||||
- meta_scope: meta.function.type-declaration.elm | |||||
- match: $\n? | |||||
pop: true | |||||
- include: type_signature | |||||
- match: \bport\s+ | |||||
scope: keyword.other.port.elm | |||||
- match: '\b[A-Z]\w*\b' | |||||
scope: constant.other.elm | |||||
- include: comments | |||||
- match: '^[a-z][A-Za-z0-9_'']*\s+' | |||||
scope: entity.name.function.elm | |||||
- include: infix_op | |||||
- match: '[|!%$?~+:\-.=</>&\\*^]+' | |||||
scope: keyword.operator.elm | |||||
- match: '([\[\]\{\},])' | |||||
scope: constant.language.delimiter.elm | |||||
captures: | |||||
1: support.function.delimiter.elm | |||||
- match: '([\(\)])' | |||||
scope: keyword.other.parenthesis.elm | |||||
block_comment: | |||||
- match: '\{-(?!#)' | |||||
captures: | |||||
0: punctuation.definition.comment.elm | |||||
push: | |||||
- meta_scope: comment.block.elm | |||||
- include: block_comment | |||||
- match: '-\}' | |||||
captures: | |||||
0: punctuation.definition.comment.elm | |||||
pop: true | |||||
comments: | |||||
- match: (--).*$\n? | |||||
scope: comment.line.double-dash.elm | |||||
captures: | |||||
1: punctuation.definition.comment.elm | |||||
- include: block_comment | |||||
infix_op: | |||||
- match: '(\([|!%$+:\-.=</>]+\)|\(,+\))' | |||||
scope: entity.name.function.infix.elm | |||||
module_exports: | |||||
- match: \( | |||||
push: | |||||
- meta_scope: meta.declaration.exports.elm | |||||
- match: \) | |||||
pop: true | |||||
- match: '\b[a-z][a-zA-Z_''0-9]*' | |||||
scope: entity.name.function.elm | |||||
- match: '\b[A-Z][A-Za-z_''0-9]*' | |||||
scope: storage.type.elm | |||||
- match: "," | |||||
scope: punctuation.separator.comma.elm | |||||
- include: infix_op | |||||
- match: \(.*?\) | |||||
comment: So named because I don't know what to call this. | |||||
scope: meta.other.unknown.elm | |||||
module_name: | |||||
- match: "[A-Z][A-Za-z._']*" | |||||
scope: support.other.module.elm | |||||
type_signature: | |||||
- match: '\(\s*([A-Z][A-Za-z]*)\s+([a-z][A-Za-z_'']*)\)\s*(=>)' | |||||
scope: meta.class-constraint.elm | |||||
captures: | |||||
1: entity.other.inherited-class.elm | |||||
2: variable.other.generic-type.elm | |||||
3: keyword.other.big-arrow.elm | |||||
- match: "->" | |||||
scope: keyword.other.arrow.elm | |||||
- match: "=>" | |||||
scope: keyword.other.big-arrow.elm | |||||
- match: '\b[a-z][a-zA-Z0-9_'']*\b' | |||||
scope: variable.other.generic-type.elm | |||||
- match: '\b[A-Z][a-zA-Z0-9_'']*\b' | |||||
scope: storage.type.elm | |||||
- match: \(\) | |||||
scope: support.constant.unit.elm | |||||
- include: comments |
@@ -0,0 +1 @@ | |||||
Subproject commit 195e71c6a70beadea428f684a073aec425a65a81 |
@@ -0,0 +1 @@ | |||||
Subproject commit 63c28f7aa9360681451779164f40d80f2e70a9cc |
@@ -0,0 +1,473 @@ | |||||
%YAML 1.2 | |||||
--- | |||||
# http://www.sublimetext.com/docs/3/syntax.html | |||||
name: Handlebars | |||||
file_extensions: | |||||
- handlebars | |||||
- handlebars.html | |||||
- hbr | |||||
- hbrs | |||||
- hbs | |||||
- hdbs | |||||
- hjs | |||||
- mu | |||||
- mustache | |||||
- rac | |||||
- stache | |||||
- template | |||||
- tmpl | |||||
scope: text.html.handlebars | |||||
contexts: | |||||
main: | |||||
- include: yfm | |||||
- include: extends | |||||
- include: block_comments | |||||
- include: comments | |||||
- include: block_helper | |||||
- include: end_block | |||||
- include: else_token | |||||
- include: partial_and_var | |||||
- include: inline_script | |||||
- include: html_tags | |||||
- include: scope:text.html.basic | |||||
block_comments: | |||||
- match: '\{\{!--' | |||||
push: | |||||
- meta_scope: comment.block.handlebars | |||||
- match: '--\}\}' | |||||
pop: true | |||||
- match: '@\w*' | |||||
scope: keyword.annotation.handlebars | |||||
- include: comments | |||||
- match: <!-- | |||||
captures: | |||||
0: punctuation.definition.comment.html | |||||
push: | |||||
- meta_scope: comment.block.html | |||||
- match: '-{2,3}\s*>' | |||||
captures: | |||||
0: punctuation.definition.comment.html | |||||
pop: true | |||||
- match: "--" | |||||
scope: invalid.illegal.bad-comments-or-CDATA.html | |||||
block_helper: | |||||
- match: '(\{\{~?\#)([-a-zA-Z0-9_\./>]+)\s?(@?[-a-zA-Z0-9_\./]+)*\s?(@?[-a-zA-Z0-9_\./]+)*\s?(@?[-a-zA-Z0-9_\./]+)*' | |||||
captures: | |||||
1: support.constant.handlebars | |||||
2: support.constant.handlebars | |||||
3: variable.parameter.handlebars | |||||
4: support.constant.handlebars | |||||
5: variable.parameter.handlebars | |||||
6: support.constant.handlebars | |||||
push: | |||||
- meta_scope: meta.function.block.start.handlebars | |||||
- match: '(~?\}\})' | |||||
captures: | |||||
1: support.constant.handlebars | |||||
pop: true | |||||
- include: string | |||||
- include: handlebars_attribute | |||||
comments: | |||||
- match: '\{\{!' | |||||
push: | |||||
- meta_scope: comment.block.handlebars | |||||
- match: '\}\}' | |||||
pop: true | |||||
- match: '@\w*' | |||||
scope: keyword.annotation.handlebars | |||||
- include: comments | |||||
- match: <!-- | |||||
captures: | |||||
0: punctuation.definition.comment.html | |||||
push: | |||||
- meta_scope: comment.block.html | |||||
- match: '-{2,3}\s*>' | |||||
captures: | |||||
0: punctuation.definition.comment.html | |||||
pop: true | |||||
- match: "--" | |||||
scope: invalid.illegal.bad-comments-or-CDATA.html | |||||
else_token: | |||||
- match: '(\{\{~?else)(@?\s(if)\s([-a-zA-Z0-9_\./]+))?' | |||||
captures: | |||||
1: support.constant.handlebars | |||||
3: support.constant.handlebars | |||||
4: variable.parameter.handlebars | |||||
push: | |||||
- meta_scope: meta.function.inline.else.handlebars | |||||
- match: '(~?\}\}\}*)' | |||||
captures: | |||||
1: support.constant.handlebars | |||||
pop: true | |||||
end_block: | |||||
- match: '(\{\{~?/)([a-zA-Z0-9/_\.-]+)\s*' | |||||
captures: | |||||
1: support.constant.handlebars | |||||
2: support.constant.handlebars | |||||
push: | |||||
- meta_scope: meta.function.block.end.handlebars | |||||
- match: '(~?\}\})' | |||||
captures: | |||||
1: support.constant.handlebars | |||||
pop: true | |||||
entities: | |||||
- match: "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)" | |||||
scope: constant.character.entity.html | |||||
captures: | |||||
1: punctuation.definition.entity.html | |||||
3: punctuation.definition.entity.html | |||||
- match: "&" | |||||
scope: invalid.illegal.bad-ampersand.html | |||||
escaped-double-quote: | |||||
- match: \\" | |||||
scope: constant.character.escape.js | |||||
escaped-single-quote: | |||||
- match: \\' | |||||
scope: constant.character.escape.js | |||||
extends: | |||||
- match: '(\{\{!<)\s([-a-zA-Z0-9_\./]+)' | |||||
captures: | |||||
1: support.function.handlebars | |||||
2: support.class.handlebars | |||||
push: | |||||
- meta_scope: meta.preprocessor.handlebars | |||||
- match: '(\}\})' | |||||
captures: | |||||
1: support.function.handlebars | |||||
pop: true | |||||
handlebars_attribute: | |||||
- include: handlebars_attribute_name | |||||
- include: handlebars_attribute_value | |||||
handlebars_attribute_name: | |||||
- match: '\b([-a-zA-Z0-9_\.]+)\b=' | |||||
captures: | |||||
1: variable.parameter.handlebars | |||||
push: | |||||
- meta_scope: entity.other.attribute-name.handlebars | |||||
- match: (?='|"|) | |||||
captures: | |||||
1: variable.parameter.handlebars | |||||
pop: true | |||||
handlebars_attribute_value: | |||||
- match: '([-a-zA-Z0-9_\./]+)\b' | |||||
captures: | |||||
1: variable.parameter.handlebars | |||||
push: | |||||
- meta_scope: entity.other.attribute-value.handlebars | |||||
- match: ('|"|) | |||||
captures: | |||||
1: variable.parameter.handlebars | |||||
pop: true | |||||
- include: string | |||||
html_tags: | |||||
- match: '(<)([a-zA-Z0-9:-]+)(?=[^>]*></\2>)' | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.html | |||||
push: | |||||
- meta_scope: meta.tag.any.html | |||||
- match: (>(<)/)(\2)(>) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: meta.scope.between-tag-pair.html | |||||
3: entity.name.tag.html | |||||
4: punctuation.definition.tag.html | |||||
pop: true | |||||
- include: tag-stuff | |||||
- match: (<\?)(xml) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.xml.html | |||||
push: | |||||
- meta_scope: meta.tag.preprocessor.xml.html | |||||
- match: (\?>) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.xml.html | |||||
pop: true | |||||
- include: tag_generic_attribute | |||||
- include: string | |||||
- match: <!-- | |||||
captures: | |||||
0: punctuation.definition.comment.html | |||||
push: | |||||
- meta_scope: comment.block.html | |||||
- match: '--\s*>' | |||||
captures: | |||||
0: punctuation.definition.comment.html | |||||
pop: true | |||||
- match: "--" | |||||
scope: invalid.illegal.bad-comments-or-CDATA.html | |||||
- match: <! | |||||
captures: | |||||
0: punctuation.definition.tag.html | |||||
push: | |||||
- meta_scope: meta.tag.sgml.html | |||||
- match: ">" | |||||
captures: | |||||
0: punctuation.definition.tag.html | |||||
pop: true | |||||
- match: (DOCTYPE|doctype) | |||||
captures: | |||||
1: entity.name.tag.doctype.html | |||||
push: | |||||
- meta_scope: meta.tag.sgml.doctype.html | |||||
- match: (?=>) | |||||
captures: | |||||
1: entity.name.tag.doctype.html | |||||
pop: true | |||||
- match: '"[^">]*"' | |||||
scope: string.quoted.double.doctype.identifiers-and-DTDs.html | |||||
- match: '\[CDATA\[' | |||||
push: | |||||
- meta_scope: constant.other.inline-data.html | |||||
- match: "]](?=>)" | |||||
pop: true | |||||
- match: (\s*)(?!--|>)\S(\s*) | |||||
scope: invalid.illegal.bad-comments-or-CDATA.html | |||||
- match: '(?:^\s+)?(<)((?i:style))\b(?![^>]*/>)' | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.style.html | |||||
3: punctuation.definition.tag.html | |||||
push: | |||||
- meta_scope: source.css.embedded.html | |||||
- match: (</)((?i:style))(>)(?:\s*\n)? | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.style.html | |||||
3: punctuation.definition.tag.html | |||||
pop: true | |||||
- include: tag-stuff | |||||
- match: (>) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
push: | |||||
- match: (?=</(?i:style)) | |||||
pop: true | |||||
- include: scope:source.css | |||||
- match: '(?:^\s+)?(<)((?i:script))\b(?![^>]*/>)' | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.script.html | |||||
push: | |||||
- meta_scope: source.js.embedded.html | |||||
- match: (?<=</(script|SCRIPT))(>)(?:\s*\n)? | |||||
captures: | |||||
2: punctuation.definition.tag.html | |||||
pop: true | |||||
- include: tag-stuff | |||||
- match: (?<!</(?:script|SCRIPT))(>) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.script.html | |||||
push: | |||||
- match: (</)((?i:script)) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.script.html | |||||
pop: true | |||||
- match: (//).*?((?=</script)|$\n?) | |||||
scope: comment.line.double-slash.js | |||||
captures: | |||||
1: punctuation.definition.comment.js | |||||
- match: /\* | |||||
captures: | |||||
0: punctuation.definition.comment.js | |||||
push: | |||||
- meta_scope: comment.block.js | |||||
- match: \*/|(?=</script) | |||||
captures: | |||||
0: punctuation.definition.comment.js | |||||
pop: true | |||||
- include: scope:source.js | |||||
- match: (</?)((?i:body|head|html)\b) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.structure.any.html | |||||
push: | |||||
- meta_scope: meta.tag.structure.any.html | |||||
- match: (>) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.structure.any.html | |||||
pop: true | |||||
- include: tag-stuff | |||||
- match: (</?)((?i:address|blockquote|dd|div|header|section|footer|aside|nav|dl|dt|fieldset|form|frame|frameset|h1|h2|h3|h4|h5|h6|iframe|noframes|object|ol|p|ul|applet|center|dir|hr|menu|pre)\b) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.block.any.html | |||||
push: | |||||
- meta_scope: meta.tag.block.any.html | |||||
- match: (>) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.block.any.html | |||||
pop: true | |||||
- include: tag-stuff | |||||
- match: (</?)((?i:a|abbr|acronym|area|b|base|basefont|bdo|big|br|button|caption|cite|code|col|colgroup|del|dfn|em|font|head|html|i|img|input|ins|isindex|kbd|label|legend|li|link|map|meta|noscript|optgroup|option|param|q|s|samp|script|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|u|var)\b) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.inline.any.html | |||||
push: | |||||
- meta_scope: meta.tag.inline.any.html | |||||
- match: "((?: ?/)?>)" | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.inline.any.html | |||||
pop: true | |||||
- include: tag-stuff | |||||
- match: "(</?)([a-zA-Z0-9:-]+)" | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.other.html | |||||
push: | |||||
- meta_scope: meta.tag.other.html | |||||
- match: (>) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.other.html | |||||
pop: true | |||||
- include: tag-stuff | |||||
- match: "(</?)([a-zA-Z0-9{}:-]+)" | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.tokenised.html | |||||
push: | |||||
- meta_scope: meta.tag.tokenised.html | |||||
- match: (>) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.tokenised.html | |||||
pop: true | |||||
- include: tag-stuff | |||||
- include: entities | |||||
- match: <> | |||||
scope: invalid.illegal.incomplete.html | |||||
- match: < | |||||
scope: invalid.illegal.bad-angle-bracket.html | |||||
inline_script: | |||||
- match: '(?:^\s+)?(<)((?i:script))\b(?:.*(type)=(["''](?:text/x-handlebars-template|text/x-handlebars|text/template|x-tmpl-handlebars)["'']))(?![^>]*/>)' | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.script.html | |||||
3: entity.other.attribute-name.html | |||||
4: string.quoted.double.html | |||||
push: | |||||
- meta_scope: source.handlebars.embedded.html | |||||
- match: (?<=</(script|SCRIPT))(>)(?:\s*\n)? | |||||
captures: | |||||
2: punctuation.definition.tag.html | |||||
pop: true | |||||
- include: tag-stuff | |||||
- match: (?<!</(?:script|SCRIPT))(>) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.script.html | |||||
push: | |||||
- match: (</)((?i:script)) | |||||
captures: | |||||
1: punctuation.definition.tag.html | |||||
2: entity.name.tag.script.html | |||||
pop: true | |||||
- include: block_comments | |||||
- include: comments | |||||
- include: block_helper | |||||
- include: end_block | |||||
- include: else_token | |||||
- include: partial_and_var | |||||
- include: html_tags | |||||
- include: scope:text.html.basic | |||||
partial_and_var: | |||||
- match: '(\{\{~?\{*(>|!<)*)\s*(@?[-a-zA-Z0-9$_\./]+)*' | |||||
captures: | |||||
1: support.constant.handlebars | |||||
3: variable.parameter.handlebars | |||||
push: | |||||
- meta_scope: meta.function.inline.other.handlebars | |||||
- match: '(~?\}\}\}*)' | |||||
captures: | |||||
1: support.constant.handlebars | |||||
pop: true | |||||
- include: string | |||||
- include: handlebars_attribute | |||||
string: | |||||
- include: string-single-quoted | |||||
- include: string-double-quoted | |||||
string-double-quoted: | |||||
- match: '"' | |||||
captures: | |||||
0: punctuation.definition.string.begin.html | |||||
push: | |||||
- meta_scope: string.quoted.double.handlebars | |||||
- match: '"' | |||||
captures: | |||||
0: punctuation.definition.string.end.html | |||||
pop: true | |||||
- include: escaped-double-quote | |||||
- include: block_comments | |||||
- include: comments | |||||
- include: block_helper | |||||
- include: else_token | |||||
- include: end_block | |||||
- include: partial_and_var | |||||
string-single-quoted: | |||||
- match: "'" | |||||
captures: | |||||
0: punctuation.definition.string.begin.html | |||||
push: | |||||
- meta_scope: string.quoted.single.handlebars | |||||
- match: "'" | |||||
captures: | |||||
0: punctuation.definition.string.end.html | |||||
pop: true | |||||
- include: escaped-single-quote | |||||
- include: block_comments | |||||
- include: comments | |||||
- include: block_helper | |||||
- include: else_token | |||||
- include: end_block | |||||
- include: partial_and_var | |||||
tag-stuff: | |||||
- include: tag_id_attribute | |||||
- include: tag_generic_attribute | |||||
- include: string | |||||
- include: block_comments | |||||
- include: comments | |||||
- include: block_helper | |||||
- include: end_block | |||||
- include: else_token | |||||
- include: partial_and_var | |||||
tag_generic_attribute: | |||||
- match: '\b([a-zA-Z0-9_-]+)\b\s*(=)' | |||||
captures: | |||||
1: entity.other.attribute-name.generic.html | |||||
2: punctuation.separator.key-value.html | |||||
push: | |||||
- meta_scope: entity.other.attribute-name.html | |||||
- match: (?<='|"|) | |||||
captures: | |||||
1: entity.other.attribute-name.generic.html | |||||
2: punctuation.separator.key-value.html | |||||
pop: true | |||||
- include: string | |||||
tag_id_attribute: | |||||
- match: \b(id)\b\s*(=) | |||||
captures: | |||||
1: entity.other.attribute-name.id.html | |||||
2: punctuation.separator.key-value.html | |||||
push: | |||||
- meta_scope: meta.attribute-with-value.id.html | |||||
- match: (?<='|"|) | |||||
captures: | |||||
1: entity.other.attribute-name.id.html | |||||
2: punctuation.separator.key-value.html | |||||
pop: true | |||||
- include: string | |||||
yfm: | |||||
- match: (?<!\s)---\n$ | |||||
push: | |||||
- meta_scope: markup.raw.yaml.front-matter | |||||
- match: ^---\s | |||||
pop: true | |||||
- include: scope:source.yaml |
@@ -0,0 +1 @@ | |||||
Subproject commit 206a35b4697afd2545dec6f1f6747c4dc2201fbf |
@@ -0,0 +1 @@ | |||||
Subproject commit ebd4a2f049fb61686664a68c8d0f34d83292e07e |
@@ -0,0 +1,326 @@ | |||||
%YAML 1.2 | |||||
--- | |||||
# http://www.sublimetext.com/docs/3/syntax.html | |||||
name: LESS | |||||
comment: LESS | |||||
file_extensions: | |||||
- less | |||||
scope: source.less | |||||
contexts: | |||||
main: | |||||
- include: comment-block | |||||
- include: comment-line | |||||
- include: less-at-rules | |||||
- include: less-declarations | |||||
- include: less-variables | |||||
- include: less-functions | |||||
- include: string-double | |||||
- include: string-single | |||||
- include: selector | |||||
- include: rule-list | |||||
- include: less-operators | |||||
- include: less-parameters | |||||
- include: numeric-values | |||||
color-values: | |||||
- match: \b(aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)\b | |||||
comment: http://www.w3.org/TR/CSS21/syndata.html#value-def-color | |||||
scope: support.constant.color.w3c-standard-color-name.css | |||||
- match: \b(aliceblue|antiquewhite|aquamarine|azure|beige|bisque|blanchedalmond|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|gainsboro|ghostwhite|gold|goldenrod|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|limegreen|linen|magenta|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|oldlace|olivedrab|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|thistle|tomato|turquoise|violet|wheat|whitesmoke|yellowgreen)\b | |||||
comment: "These colours are mostly recognised but will not validate. ref: http://www.w3schools.com/css/css_colornames.asp" | |||||
scope: support.constant.color.non-standard | |||||
- match: (hsla?|rgba?)\s*(\() | |||||
captures: | |||||
1: support.function.misc.css | |||||
2: punctuation.section.function.css | |||||
push: | |||||
- match: (\)) | |||||
captures: | |||||
1: punctuation.section.function.css | |||||
pop: true | |||||
- match: '(?x)\b(0*((1?[0-9]{1,2})|(2([0-4][0-9]|5[0-5])))\s*,\s*){2}(0*((1?[0-9]{1,2})|(2([0-4][0-9]|5[0-5])))\b)(\s*,\s*((0?\.[0-9]+)|[0-1]))?' | |||||
scope: constant.other.color.rgb-value.css | |||||
- match: '\b([0-9]{1,2}|100)\s*%,\s*([0-9]{1,2}|100)\s*%,\s*([0-9]{1,2}|100)\s*%' | |||||
scope: constant.other.color.rgb-percentage.css | |||||
- include: numeric-values | |||||
comment-block: | |||||
- match: /\* | |||||
captures: | |||||
0: punctuation.definition.comment.css | |||||
push: | |||||
- meta_scope: comment.block.css | |||||
- match: \*/ | |||||
captures: | |||||
0: punctuation.definition.comment.css | |||||
pop: true | |||||
comment-line: | |||||
- match: // | |||||
captures: | |||||
0: punctuation.definition.comment.css | |||||
push: | |||||
- meta_scope: comment.line.double-slash.less | |||||
- match: $\n? | |||||
captures: | |||||
0: punctuation.definition.comment.css | |||||
pop: true | |||||
less-at-rules: | |||||
- match: ^\s*((@)(?:-(?:webkit|moz|o)-)?(charset|import|namespace|media|page|font-face|keyframes|supports|document)\b) | |||||
scope: meta.at-rule.css | |||||
captures: | |||||
1: keyword.control.at-rule.css | |||||
2: punctuation.definition.keyword.css | |||||
less-data-uri: | |||||
- match: (url)(\()(data:) | |||||
captures: | |||||
1: support.function.misc.css | |||||
2: punctuation.section.function.css | |||||
3: parameter.less.data-uri comment markup.raw | |||||
push: | |||||
- meta_content_scope: parameter.less.data-uri comment markup.raw | |||||
- match: (\)) | |||||
captures: | |||||
1: punctuation.section.function.css | |||||
pop: true | |||||
- match: (url)(\()("data:) | |||||
captures: | |||||
1: support.function.misc.css | |||||
2: punctuation.section.function.css | |||||
3: parameter.less.data-uri comment markup.raw | |||||
push: | |||||
- meta_content_scope: parameter.less.data-uri comment markup.raw | |||||
- match: (?<=")(\)) | |||||
captures: | |||||
1: punctuation.section.function.css | |||||
pop: true | |||||
- match: (url)(\()('data:) | |||||
captures: | |||||
1: support.function.misc.css | |||||
2: punctuation.section.function.css | |||||
3: parameter.less.data-uri comment markup.raw | |||||
push: | |||||
- meta_content_scope: parameter.less.data-uri comment markup.raw | |||||
- match: (?<=\')(\)) | |||||
captures: | |||||
1: punctuation.section.function.css | |||||
pop: true | |||||
less-declarations: | |||||
- match: '(?>@[a-zA-Z0-9_-][\w-]*+)(?!:)' | |||||
scope: variable.other.less | |||||
- match: '@[a-zA-Z0-9_-][\w-]*' | |||||
scope: variable.declaration.less | |||||
less-functions: | |||||
- match: '([%a-zA-Z\-\_\d]*)(?=\()' | |||||
scope: support.function.less | |||||
- match: '([\.#](?![0-9])[a-zA-Z0-9_-]+(?=\())' | |||||
captures: | |||||
1: entity.other.attribute-name.class.css entity.other.less.mixin | |||||
less-operators: | |||||
- match: /|!important|$|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|(?<!\()/=|%=|\+=|\-=|&=|when\b|and\b|not\b | |||||
scope: keyword.operator.less | |||||
less-parameters: | |||||
- match: '\(|(}\s*,)' | |||||
push: | |||||
- meta_scope: parameter.less | |||||
- match: '\)|{' | |||||
pop: true | |||||
- include: color-values | |||||
- include: less-parameters | |||||
- include: less-functions | |||||
- include: numeric-values | |||||
- include: string-double | |||||
- include: string-single | |||||
- include: less-variables | |||||
- match: '(?:\:/)?[\/\.a-zA-Z0-9_\-]*' | |||||
scope: variable.parameter.misc.css | |||||
- include: less-operators | |||||
less-variables: | |||||
- match: '@[a-zA-Z0-9_-][\w-]*' | |||||
scope: variable.other.less | |||||
- match: '@{[a-zA-Z0-9_-][\w-]*}' | |||||
scope: variable.interpolation.less | |||||
- match: "`" | |||||
push: | |||||
- meta_scope: comment markup.raw | |||||
- match: "`" | |||||
pop: true | |||||
- match: (~)` | |||||
captures: | |||||
1: keyword.operator.less | |||||
push: | |||||
- meta_scope: comment markup.raw | |||||
- match: "`" | |||||
pop: true | |||||
- match: (~)" | |||||
captures: | |||||
1: keyword.operator.less | |||||
push: | |||||
- meta_scope: string.quoted.double.css comment markup.raw | |||||
- match: '"' | |||||
pop: true | |||||
- match: (~)' | |||||
captures: | |||||
1: keyword.operator.less | |||||
push: | |||||
- meta_scope: string.quoted.single.css comment markup.raw | |||||
- match: "'" | |||||
pop: true | |||||
numeric-values: | |||||
- match: '(#)([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b' | |||||
scope: constant.other.color.rgb-value.css | |||||
captures: | |||||
1: punctuation.definition.constant.css | |||||
- match: '(?x)(?:-|\+)?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+))((?:px|pt|ch|cm|mm|in|r?em|ex|pc|deg|g?rad|dpi|dpcm|ms|s)\b|%)?' | |||||
scope: constant.numeric.css | |||||
captures: | |||||
1: keyword.other.unit.css | |||||
property-names: | |||||
- match: "(?<![-a-z])(?=[-a-z])" | |||||
push: | |||||
- meta_scope: support.type.property-name.css | |||||
- match: "$|(?![-a-z])" | |||||
pop: true | |||||
- match: \b(word)\b | |||||
scope: support.type.property-name.css | |||||
property-values: | |||||
- include: less-variables | |||||
- include: less-data-uri | |||||
- include: less-functions | |||||
- include: less-operators | |||||
- include: color-values | |||||
- include: numeric-values | |||||
- include: less-parameters | |||||
- match: \b(absolute|all(-scroll)?|always|subpixel-antialiased|antialiased|armenian|auto|avoid|baseline|below|bidi-override|block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|char|circle|cjk-ideographic|content-box|col-resize|collapse|crosshair|dashed|decimal-leading-zero|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fixed|geometricPrecision|georgian|groove|hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|keep-all|left|lighter|line-edge|line-through|line|list-item|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|optimize(Legibility|Quality|Speed)|outset|outside|overline|pointer|pre(-(wrap|line))?|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table|tb-rl|text-bottom|text-top|textfield|text|thick|thin|top|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|vertical(-(ideographic|text))?|visible(Painted|Fill|Stroke)?|w-resize|wait|whitespace|zero|smaller|larger|((xx?-)?(small|large))|painted|fill|stroke)\b | |||||
scope: support.constant.property-value.css | |||||
- include: selector | |||||
- match: (\b(?i:arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace)\b) | |||||
scope: support.constant.font-name.css | |||||
- include: string-double | |||||
- include: string-single | |||||
- match: (rect)\s*(\() | |||||
captures: | |||||
1: support.function.misc.css | |||||
2: punctuation.section.function.css | |||||
push: | |||||
- match: (\)) | |||||
captures: | |||||
1: punctuation.section.function.css | |||||
pop: true | |||||
- include: numeric-values | |||||
- match: (format|local|url|attr|counter|counters)\s*(\() | |||||
captures: | |||||
1: support.function.misc.css | |||||
2: punctuation.section.function.css | |||||
push: | |||||
- match: (\)) | |||||
captures: | |||||
1: punctuation.section.function.css | |||||
pop: true | |||||
- include: string-single | |||||
- include: string-double | |||||
- match: '[^''") \t]+' | |||||
scope: variable.parameter.misc.css | |||||
- match: \!\s*important | |||||
scope: keyword.other.important.css | |||||
rule-list: | |||||
- include: comment-block | |||||
- include: comment-line | |||||
- include: selector | |||||
- include: property-names | |||||
- match: (:)\s* | |||||
captures: | |||||
1: punctuation.separator.key-value.css | |||||
push: | |||||
- meta_scope: meta.property-value.css | |||||
- match: '\s*(;|(?=[{}]))' | |||||
captures: | |||||
1: punctuation.terminator.rule.css | |||||
pop: true | |||||
- include: property-values | |||||
selector: | |||||
- match: '\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|datalist|dd|del|details|dfn|dialog|div|dl|dt|em|eventsource|fieldset|figure|figcaption|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|samp|script|section|select|small|span|strike|strong|style|sub|summary|sup|svg|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\b' | |||||
scope: entity.name.tag.css, keyword.control.html.elements | |||||
- match: '(\.)-?[a-zA-Z_][a-zA-Z0-9_-]*' | |||||
scope: entity.other.attribute-name.class.css | |||||
captures: | |||||
1: punctuation.definition.entity.css | |||||
- match: "(#)-?[a-zA-Z_][a-zA-Z0-9_-]*" | |||||
scope: entity.other.attribute-name.id.css | |||||
captures: | |||||
1: punctuation.definition.entity.css | |||||
- match: \* | |||||
scope: entity.name.tag.wildcard.css | |||||
- match: (:+)((first|last|only)-child|(first|last|only)-of-type|empty|root|target|first-letter|first-line|first|left|right|lang)\b | |||||
scope: entity.other.attribute-name.pseudo-class.css | |||||
captures: | |||||
1: punctuation.definition.entity.css | |||||
- match: (:)(extend)\b | |||||
scope: entity.other.attribute-name.pseudo-class.less | |||||
captures: | |||||
1: punctuation.definition.entity.css | |||||
- match: (:)(checked|enabled|default|disabled|indeterminate|invalid|optional|required|valid)\b | |||||
scope: entity.other.attribute-name.pseudo-class.ui-state.css | |||||
captures: | |||||
1: punctuation.definition.entity.css | |||||
- match: ((:)not)(\() | |||||
captures: | |||||
1: entity.other.attribute-name.pseudo-class.css | |||||
2: punctuation.definition.entity.css | |||||
3: punctuation.section.function.css | |||||
push: | |||||
- match: \) | |||||
captures: | |||||
0: punctuation.section.function.css | |||||
pop: true | |||||
- include: selector | |||||
- match: ((:)nth-(?:(?:last-)?child|(?:last-)?of-type))(\() | |||||
captures: | |||||
1: entity.other.attribute-name.pseudo-class.css | |||||
2: punctuation.definition.entity.css | |||||
3: punctuation.section.function.css | |||||
push: | |||||
- meta_content_scope: constant.numeric.css | |||||
- match: (\)) | |||||
captures: | |||||
1: punctuation.section.function.css | |||||
pop: true | |||||
- match: (:+)(?:-(?:webkit|moz|o)-)?(after|before|selection|scrollbar|placeholder|input-placeholder)\b | |||||
scope: entity.other.attribute-name.pseudo-element.css | |||||
captures: | |||||
1: punctuation.definition.entity.css | |||||
- match: (:+)(?:-(?:webkit|moz|o)-)?(active|hover|link|visited|focus-inner|focus)\b | |||||
scope: entity.other.attribute-name.pseudo-class.css | |||||
captures: | |||||
1: punctuation.definition.entity.css | |||||
- match: '(?i)(\[)\s*(-?[_a-z\\[[:^ascii:]]][_a-z0-9\-\\[[:^ascii:]]]*)(?:\s*([~|^$*]?=)\s*(?:(-?[_a-z\\[[:^ascii:]]][_a-z0-9\-\\[[:^ascii:]]]*)|((?>([''"])(?:[^\\]|\\.)*?(\6)))))?\s*(\])' | |||||
scope: meta.attribute-selector.css | |||||
captures: | |||||
1: punctuation.definition.entity.css | |||||
2: entity.other.attribute-name.attribute.css | |||||
3: punctuation.separator.operator.css | |||||
4: string.unquoted.attribute-value.css | |||||
5: string.quoted.double.attribute-value.css | |||||
6: punctuation.definition.string.begin.css | |||||
7: punctuation.definition.string.end.css | |||||
string-double: | |||||
- match: '"' | |||||
captures: | |||||
0: punctuation.definition.string.begin.css | |||||
push: | |||||
- meta_scope: string.quoted.double.css | |||||
- match: '"' | |||||
captures: | |||||
0: punctuation.definition.string.end.css | |||||
pop: true | |||||
- match: \\. | |||||
scope: constant.character.escape.css | |||||
string-single: | |||||
- match: "'" | |||||
captures: | |||||
0: punctuation.definition.string.begin.css | |||||
push: | |||||
- meta_scope: string.quoted.single.css | |||||
- match: "'" | |||||
captures: | |||||
0: punctuation.definition.string.end.css | |||||
pop: true | |||||
- match: \\. | |||||
scope: constant.character.escape.css |
@@ -0,0 +1 @@ | |||||
Subproject commit 31d287243975662ec95c346c6adacef2e63c10ef |
@@ -0,0 +1 @@ | |||||
Subproject commit eb57cebd62d0c2ea2c17d222c8c1c3cefa40f31b |
@@ -0,0 +1 @@ | |||||
Subproject commit 41f2b92d326d35c3a9261da4f99a43b4ad7f07e8 |
@@ -7,7 +7,7 @@ | |||||
<meta name="description" content="{{ config.description }}"> | <meta name="description" content="{{ config.description }}"> | ||||
<meta name="author" content="{{ config.extra.author.name }}"> | <meta name="author" content="{{ config.extra.author.name }}"> | ||||
<link href="https://fonts.googleapis.com/css?family=Fira+Mono|Fira+Sans|Merriweather" rel="stylesheet"> | <link href="https://fonts.googleapis.com/css?family=Fira+Mono|Fira+Sans|Merriweather" rel="stylesheet"> | ||||
<link href="site.css" rel="stylesheet"> | |||||
<link href="{{ config.base_url }}/site.css" rel="stylesheet"> | |||||
<title>{{ config.title }}</title> | <title>{{ config.title }}</title> | ||||
</head> | </head> | ||||