@@ -26,6 +26,11 @@ enum Args {
26
26
/// The file you wish to parse.
27
27
file : PathBuf ,
28
28
} ,
29
+ /// Parse a provided document and show the spans of the detected tokens.
30
+ Spans {
31
+ /// The file you wish to display the spans.
32
+ file : PathBuf ,
33
+ } ,
29
34
/// Emit decompressed, line-separated list of words in Harper's dictionary.
30
35
Words ,
31
36
}
@@ -72,7 +77,7 @@ fn main() -> anyhow::Result<()> {
72
77
let report = report_builder. finish ( ) ;
73
78
report. print ( ( & filename, Source :: from ( source) ) ) ?;
74
79
75
- std :: process :: exit ( 1 ) ;
80
+ Ok ( ( ) )
76
81
}
77
82
Args :: Parse { file } => {
78
83
let ( doc, _) = load_file ( & file) ?;
@@ -84,6 +89,39 @@ fn main() -> anyhow::Result<()> {
84
89
85
90
Ok ( ( ) )
86
91
}
92
+ Args :: Spans { file } => {
93
+ let ( doc, source) = load_file ( & file) ?;
94
+
95
+ let primary_color = Color :: Blue ;
96
+ let secondary_color = Color :: Magenta ;
97
+ let filename = file
98
+ . file_name ( )
99
+ . map ( |s| s. to_string_lossy ( ) . into ( ) )
100
+ . unwrap_or ( "<file>" . to_string ( ) ) ;
101
+
102
+ let mut report_builder =
103
+ Report :: build ( ReportKind :: Custom ( "Spans" , primary_color) , & filename, 0 ) ;
104
+ let mut color = primary_color;
105
+ for token in doc. tokens ( ) {
106
+ report_builder = report_builder. with_label (
107
+ Label :: new ( ( & filename, token. span . into ( ) ) )
108
+ . with_message ( format ! ( "[{}, {})" , token. span. start, token. span. end) )
109
+ . with_color ( color) ,
110
+ ) ;
111
+
112
+ // Alternate colors so spans are clear
113
+ color = if color == primary_color {
114
+ secondary_color
115
+ } else {
116
+ primary_color
117
+ } ;
118
+ }
119
+
120
+ let report = report_builder. finish ( ) ;
121
+ report. print ( ( & filename, Source :: from ( source) ) ) ?;
122
+
123
+ Ok ( ( ) )
124
+ }
87
125
Args :: Words => {
88
126
let dict = FstDictionary :: curated ( ) ;
89
127
0 commit comments