diff options
author | Rory Dudley | 2024-09-01 04:27:00 -0600 |
---|---|---|
committer | Rory Dudley | 2024-09-01 04:27:00 -0600 |
commit | 49676c0e1c5fd0660edfd73cfd97001a00b7bd8b (patch) | |
tree | 140bbb0a79252dabbe9535f9b7eaa31ad6ee701e /src | |
parent | 0596517643d9daffa1c4b7b3b0f913ac6d1ab9cd (diff) | |
parent | d03b4643c9c4f85c642182da7a56a613b6f819d4 (diff) | |
download | dwarvish-49676c0e1c5fd0660edfd73cfd97001a00b7bd8b.tar.gz |
Merge branch 'main' into escsq
Diffstat (limited to 'src')
-rw-r--r-- | src/poem/elements/rune.rs | 4 | ||||
-rw-r--r-- | src/poem/read.rs | 9 | ||||
-rw-r--r-- | src/poem/read/parse.rs | 16 |
3 files changed, 29 insertions, 0 deletions
diff --git a/src/poem/elements/rune.rs b/src/poem/elements/rune.rs index 64e3326..79d53d0 100644 --- a/src/poem/elements/rune.rs +++ b/src/poem/elements/rune.rs @@ -19,6 +19,9 @@ pub enum Rune { /// The space character, to dilineate words (`' '`) Pause, + /// The backslash character, to escape special character (`\`) + Special, + /// The forward slash character, to dilineate paths (`/`) Path, @@ -81,6 +84,7 @@ impl fmt::Display for Rune { let rune = match self { Rune::None => "", Rune::Pause => " ", + Rune::Special => "\\", Rune::Path => "/", Rune::Remark => "#", Rune::String => "\"", diff --git a/src/poem/read.rs b/src/poem/read.rs index 8f3fd4a..7f3ae32 100644 --- a/src/poem/read.rs +++ b/src/poem/read.rs @@ -243,6 +243,7 @@ impl Readable for Poem { // Determine the meter based on the character let rune = match c { ' ' => Rune::Pause, + '\\' => Rune::Special, '/' => Rune::Path, '#' => Rune::Remark, '\'' | '"' => Rune::String, @@ -356,6 +357,14 @@ impl Readable for Poem { verse.add(&mut word, channel); } + Rune::Special => { + let c = chars.next(); + match c { + Some(c) => word.push(c), + None => continue, + } + } + Rune::Remark => { remark!(chars); } diff --git a/src/poem/read/parse.rs b/src/poem/read/parse.rs index fc1979f..0b6c5a3 100644 --- a/src/poem/read/parse.rs +++ b/src/poem/read/parse.rs @@ -74,6 +74,14 @@ macro_rules! string { $word.push('\x0e'); $i += 1; } + Some(c) if c == '\\' => { + let c = match $chars.next() { + Some(c) => c, + None => continue, + }; + $word.push(c); + $i += 1; + } Some(c) => { $word.push(c); $i += 1; @@ -108,6 +116,14 @@ macro_rules! poem { match $chars.next() { None => return Err(Mishap::PartialMishap($j, $i, $c)), Some(c) if c == token => break, + Some(c) if c == '\\' => { + let c = match $chars.next() { + Some(c) => c, + None => continue, + }; + $word.push(c); + $i += 1; + } Some(c) => { poetry.push(c); $i += 1; |