harper_core/
punctuation.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
use is_macro::Is;
use serde::{Deserialize, Serialize};

#[derive(
    Debug, Is, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Default, Hash,
)]
#[serde(tag = "kind")]
pub enum Punctuation {
    /// `…`
    Ellipsis,
    /// `–`
    EnDash,
    /// `—`
    EmDash,
    /// `&`
    Ampersand,
    /// `.`
    #[default]
    Period,
    /// `!`
    Bang,
    /// `?`
    Question,
    /// `:`
    Colon,
    /// ``;``
    Semicolon,
    /// `"`
    Quote(Quote),
    /// `,`
    Comma,
    /// `-`
    Hyphen,
    /// `[`
    OpenSquare,
    /// `]`
    CloseSquare,
    /// `(`
    OpenRound,
    /// `)`
    CloseRound,
    /// `{`
    OpenCurly,
    /// `}`
    CloseCurly,
    /// `"`
    Hash,
    /// `'`
    Apostrophe,
    /// `%`
    Percent,
    /// `/`
    ForwardSlash,
    /// `\`
    Backslash,
    /// `<`
    LessThan,
    /// `>`
    GreaterThan,
    /// `=`
    Equal,
    /// `*`
    Star,
    /// `~`
    Tilde,
    /// `@`
    At,
    /// `^`
    Carrot,
    /// `+`
    Plus,
    /// `$`
    Dollar,
    /// `|`
    Pipe,
    /// `_`
    Underscore,
}

impl Punctuation {
    pub fn from_char(c: char) -> Option<Punctuation> {
        let punct = match c {
            '@' => Punctuation::At,
            '~' => Punctuation::Tilde,
            '=' => Punctuation::Equal,
            '<' => Punctuation::LessThan,
            '>' => Punctuation::GreaterThan,
            '/' => Punctuation::ForwardSlash,
            '\\' => Punctuation::Backslash,
            '%' => Punctuation::Percent,
            '’' => Punctuation::Apostrophe,
            '\'' => Punctuation::Apostrophe,
            '.' => Punctuation::Period,
            '!' => Punctuation::Bang,
            '?' => Punctuation::Question,
            ':' => Punctuation::Colon,
            ';' => Punctuation::Semicolon,
            ',' => Punctuation::Comma,
            '-' => Punctuation::Hyphen,
            '[' => Punctuation::OpenSquare,
            ']' => Punctuation::CloseSquare,
            '{' => Punctuation::OpenCurly,
            '}' => Punctuation::CloseCurly,
            '(' => Punctuation::OpenRound,
            ')' => Punctuation::CloseRound,
            '#' => Punctuation::Hash,
            '*' => Punctuation::Star,
            '&' => Punctuation::Ampersand,
            '–' => Punctuation::EnDash,
            '—' => Punctuation::EmDash,
            '…' => Punctuation::Ellipsis,
            '^' => Punctuation::Carrot,
            '+' => Punctuation::Plus,
            '$' => Punctuation::Dollar,
            '|' => Punctuation::Pipe,
            '_' => Punctuation::Underscore,
            _ => return None,
        };

        Some(punct)
    }
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Hash)]
pub struct Quote {
    /// The location of the matching quote, if it exists.
    pub twin_loc: Option<usize>,
}