diff --git a/content/treehouse/dev/syntax-highlighting.tree b/content/treehouse/dev/syntax-highlighting.tree index cc80b17..b907f2c 100644 --- a/content/treehouse/dev/syntax-highlighting.tree +++ b/content/treehouse/dev/syntax-highlighting.tree @@ -197,3 +197,73 @@ end end ``` + +- `rust` + + - patterns + ```rust + // this is a comment + /* this is a multiline comment */ + + "string" 'c' 'ł' + b"string" b'ł' + r"string" r#"string"# r##"string"## r###"string"### + 0b11001100 0b11001100_u8 + 0o1234567_f32 + 0xDEADBEEF 0xDEADBEEF_i16 + 2137 + 3.14159265 2.3e-32 + + - * / % == ~= <= >= & . + #![doc = ""] + identifier macro! function() 'static + T Vec + union Example + europeanunion A + ``` + + - keywords + ```rust + _ as async await break const continue dyn else enum extern fn for if impl in let loop + macro_rules! match mod move mut pub ref return static struct trait type unsafe use where while + + crate self Self super + + true false + + abstract become box do final macro override priv try typeof unsized virtual yield + ``` + + - sample + ```rust + use chrono::{Datelike, Utc}; + use serde::{Deserialize, Serialize}; + + #[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)] + #[serde(rename_all = "snake_case")] + pub enum Season { + Spring, + Summer, + Autumn, + Winter, + } + + impl Season { + pub fn on(month: u32, day: u32) -> Option { + let md = (month, day); + Some(match () { + _ if ((1, 1)..=(3, 20)).contains(&md) => Season::Winter, + _ if ((3, 21)..=(6, 21)).contains(&md) => Season::Spring, + _ if ((6, 22)..=(9, 22)).contains(&md) => Season::Summer, + _ if ((9, 23)..=(12, 21)).contains(&md) => Season::Autumn, + _ if ((12, 22)..=(12, 31)).contains(&md) => Season::Winter, + // Just in case something really darn weird happens to the calendar. + _ => return None, + }) + } + + pub fn current() -> Option { + let now = Utc::now(); + Self::on(now.month(), now.day()) + } + } + ``` diff --git a/static/syntax/rust.json b/static/syntax/rust.json new file mode 100644 index 0000000..f317747 --- /dev/null +++ b/static/syntax/rust.json @@ -0,0 +1,119 @@ +{ + "patterns": [ + { "regex": "\\/\\/.*", "is": "comment" }, + { + "regex": "\\/\\*.*?\\*\\/", + "flags": ["dotMatchesNewline"], + "is": "comment" + }, + { "regex": "'(\\\\'|[^'])'", "is": "string" }, + { "regex": "\"(\\\\\"|[^\"])*\"", "is": "string" }, + { "regex": "b'(\\\\'|[^'])'", "is": "string" }, + { "regex": "b\"(\\\\\"|[^\"])*\"", "is": "string" }, + { "regex": "r\"(\\\\\"|[^\"])*\"", "is": "string" }, + { "regex": "r#\"(\\\\\"|[^\"])*\"#", "is": "string" }, + { "regex": "r##\"(\\\\\"|[^\"])*\"##", "is": "string" }, + { "regex": "r###\"(\\\\\"|[^\"])*\"###", "is": "string" }, + { "regex": "0[bB][01_]+([uif](8|16|32|64|128))?", "is": "literal" }, + { "regex": "0[oO][0-7_]+([uif](8|16|32|64|128))?", "is": "literal" }, + { + "regex": "0[xX][0-9a-fA-F_]+([uif](8|16|32|64|128))?", + "is": "literal" + }, + { "regex": "[0-9_]+n", "is": "literal" }, + { "regex": "[0-9_]+(\\.[0-9_]*([eE][-+]?[0-9_]+)?)?", "is": "literal" }, + { "regex": "[+=/*^%<>!~|&\\.?:@-]+", "is": "operator" }, + { "regex": "#!\\[", "is": "default" }, + { + "regex": "[a-zA-Z_][a-zA-Z0-9_]*(\\()", + "is": { "default": "function", "captures": ["default"] } + }, + { "regex": "[a-zA-Z_][a-zA-Z0-9_]*!", "is": "function" }, + { "regex": "[A-Z_][a-zA-Z0-9_]*", "is": "keyword2" }, + { + "regex": "union\\s+([a-zA-Z_][a-zA-Z0-9_]*)", + "is": { + "default": "keyword1", + "captures": ["keyword2"] + } + }, + { "regex": "[a-zA-Z_][a-zA-Z0-9_]*", "is": "identifier" }, + { "regex": "'[a-zA-Z_][a-zA-Z0-9_]*", "is": "literal" } + ], + "keywords": { + "_": { "into": "keyword1" }, + "as": { "into": "keyword1" }, + "async": { "into": "keyword1" }, + "await": { "into": "keyword1" }, + "break": { "into": "keyword1" }, + "const": { "into": "keyword1" }, + "continue": { "into": "keyword1" }, + "dyn": { "into": "keyword1" }, + "else": { "into": "keyword1" }, + "enum": { "into": "keyword1" }, + "extern": { "into": "keyword1" }, + "fn": { "into": "keyword1" }, + "for": { "into": "keyword1" }, + "if": { "into": "keyword1" }, + "impl": { "into": "keyword1" }, + "in": { "into": "keyword1" }, + "let": { "into": "keyword1" }, + "loop": { "into": "keyword1" }, + "macro_rules!": { "into": "keyword1" }, + "match": { "into": "keyword1" }, + "mod": { "into": "keyword1" }, + "move": { "into": "keyword1" }, + "mut": { "into": "keyword1" }, + "pub": { "into": "keyword1" }, + "ref": { "into": "keyword1" }, + "return": { "into": "keyword1" }, + "static": { "into": "keyword1" }, + "struct": { "into": "keyword1" }, + "trait": { "into": "keyword1" }, + "type": { "into": "keyword1" }, + "unsafe": { "into": "keyword1" }, + "use": { "into": "keyword1" }, + "where": { "into": "keyword1" }, + "while": { "into": "keyword1" }, + + "crate": { "into": "keyword2" }, + "self": { "into": "keyword2" }, + "Self": { "into": "keyword2" }, + "super": { "into": "keyword2" }, + + "bool": { "into": "keyword2" }, + "i8": { "into": "keyword2" }, + "i16": { "into": "keyword2" }, + "i32": { "into": "keyword2" }, + "i64": { "into": "keyword2" }, + "i128": { "into": "keyword2" }, + "isize": { "into": "keyword2" }, + "u8": { "into": "keyword2" }, + "u16": { "into": "keyword2" }, + "u32": { "into": "keyword2" }, + "u64": { "into": "keyword2" }, + "u128": { "into": "keyword2" }, + "usize": { "into": "keyword2" }, + "f32": { "into": "keyword2" }, + "f64": { "into": "keyword2" }, + "char": { "into": "keyword2" }, + "str": { "into": "keyword2" }, + + "true": { "into": "literal" }, + "false": { "into": "literal" }, + + "abstract": { "into": "error reserved-word" }, + "become": { "into": "error reserved-word" }, + "box": { "into": "error reserved-word" }, + "do": { "into": "error reserved-word" }, + "final": { "into": "error reserved-word" }, + "macro": { "into": "error reserved-word" }, + "override": { "into": "error reserved-word" }, + "priv": { "into": "error reserved-word" }, + "try": { "into": "error reserved-word" }, + "typeof": { "into": "error reserved-word" }, + "unsized": { "into": "error reserved-word" }, + "virtual": { "into": "error reserved-word" }, + "yield": { "into": "error reserved-word" } + } +}