1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2017年4月22日 |
---|
#1674 在 文本处理
21KB
575 行
缩进平坦化器
一个简单的小型库,用于将带缩进的文本转换为带“PushIndent”和“PopIndent”额外符号的文本
该项目基于 indent_tokenizer
此格式更适合与 peg 语法一起使用(我将这样做)
用法
添加到 cargo.toml
[source, toml]
[dependencies]
pending...
请参阅以下示例
修改
无
缩进格式
制表符在缩进分组中无效。
“Push”和“Pop”缩进将在每个缩进级别更改时插入。
让我们通过示例来查看。
简单有效输入
.....
...
.... new ident level
.... new ident level
....
.... one back indent level
....
.... new indent level
.... two back indent level
....
.... new indent level
缩进组可以有任意数量的空格
有效缩进,不同空格
.....
.... level1 <--
.... level2
.... level1 <--
....
....
....
.... level1 <--
.... level2 <--
在创建新级别时,同一级别的不同空格不是一个好主意,但是当您在此级别上回退时是允许的。
在此示例中,最后一个级别1和最后一个级别2的缩进比之前的缩进更多
无效缩进
.....
...
....
....
.... <-- incorrect indentation
.... <-- correct previous ident level
....
....
....
....
为了回退一个级别,缩进必须与该级别上的上一个缩进匹配。
正如我们在前面的示例中所看到的,增加级别是自由缩进。
开始行指示符
|.....
|.....
|......
|......
您可以使用 |
开始行,但这不是必需的。
开始行指示符是可选的
.....
|1234
1234
......
......
但是,如果您在同一级别上结合使用带有 |
的行和没有的行,则列将不会匹配
当您需要以空格开始时非常有用。
我想以空格开始一行
.....
| ..... <- This line starts with an space
| ...... <- Starting with 2 spaces
|..... <- starts with no spaces
..... <- starting with no spaces
... <- starting with no spaces
我的行以 |
开始
.....
||..... This line starts with a `|`
|...... This one starts with `.`
.....
.....
||..... This line starts with a `|`
...... This one starts with `.`
如果一行没有内容或只包含空格(无论有多少),则该行是空的。
空行将生成新的 char
行,并且不会更改缩进级别
空行
.....
.....
.....
.....
..... next line is empty
..... next line is empty
.....
..... next line is empty
如果我想表示空行怎么办?
表示空行
.....
.....
..... There is a new line after (same indent level)
.....
..... There is a new line after (explicitly marked)
|
..... three new lines after
|
|
|
..... Two new lines at end of document
|
|
|
非常有用,如果您需要在文档末尾表示空行。
如果我想表示行尾的空格怎么办?
行尾的空格将不会被删除,因此您无需对此做任何事情。
但这可能很有趣,因为它可以用某些编辑器运行尾随操作,或者仅仅是因为你可以可视化它。
表示行尾空格
.....
.....
.....
.....
This line keeps 2 spaces and end |
and you know it
Next line is properly indented and only has spaces
| |
实际上,你可以在所有行的末尾写上|
。它将被删除。
接下来几个字符串是等效的。
.|
在行尾是可选的
.....|
.....|
.....|
.....|
.....
.....
.....
.....
但我可能需要在行尾有一个管道|
.行尾的管道
.....
.....
.....
.....
This line ends with a pipe||
输出格式
输出将是一个包含PUSH_INDENT和POP_INDENT代码的字符串
.从lib.rs [source, rust]
const PUSH_INDENT: char = 0x02 as char;
const POP_INDENT: char = 0x03 as char;
用于标记缩进的空格将被从输出中删除。
下面有示例。
由于系统按行工作,所以每个有内容的现有行都将以end of line
结尾
API
它与具体类型(如String、u32或usize)和通用类型(如String、u32或usize)一起工作
常量:: [source, rust]
const EOL: char = '\n';
const PUSH_INDENT: char = 0x02 as char;
const POP_INDENT: char = 0x03 as char;
具体类型:: [source, rust]
#[derive(Debug, PartialEq, Copy, Clone)]
pub struct LineNum(u32);
#[derive(Debug, PartialEq, Clone, Eq)]
pub struct SLine(String);
#[derive(Debug, PartialEq, Clone, Eq, Default)]
pub struct SFlattedText(String);
要调用的函数:: [source, rust]
pub fn flatter(input: &str) -> Result<SFlattedText, Error>
错误类型:: [source, rust]
#[derive(Debug, PartialEq)]
pub struct Error {
pub line: LineNum,
pub desc: String,
}
这就结束了
查看lib.rs
示例
你可以查看tests.rs,那里有几个测试。
.简单示例 [source, rust]
# this input...
0
01
02
020
021
023
0230
0231
# produces...
0
\u{2}01
02
\u{2}020
021
023
\u{2}0230
0231
\u{3}\u{3}\u{3}"
如你所见,缩进已经被标记PUSH_INDENT和POP_INDENT的代码删除了
[注意]所有行都以换行符结束。如果最后一行没有换行符,系统将插入一个
.复杂示例 [source, rust]
let flat = flatter("
0
|| 01a
01b
01c
02a
02b
|020a
||020b
| 021a
|021b
1a
1b
11a
||11b
11c
12a ||
|12b ||
2a
21a
21b
|
|
")
.unwrap();
assert!(flat ==
SFlattedText::from("
0
\u{2}| 01a
01b
01c
02a
02b
\u{2}020a
|020b
021a
021b
\u{3}\u{3}1a
1b
\u{2}11a
|11b
11c
12a |
12b |
\u{3}2a
\u{2}21a
21b
\u{3}"));
更多示例在tests.rs中