17次发布

0.3.7 2022年12月17日
0.3.6 2020年6月16日
0.3.5 2020年3月25日
0.3.4 2019年8月17日
0.2.3 2017年10月23日

#10 in #literal

Download history 40604/week @ 2024-04-22 31363/week @ 2024-04-29 33734/week @ 2024-05-06 24749/week @ 2024-05-13 25102/week @ 2024-05-20 26092/week @ 2024-05-27 28419/week @ 2024-06-03 25275/week @ 2024-06-10 24884/week @ 2024-06-17 23182/week @ 2024-06-24 24654/week @ 2024-07-01 27193/week @ 2024-07-08 26895/week @ 2024-07-15 26201/week @ 2024-07-22 27827/week @ 2024-07-29 29630/week @ 2024-08-05

每月112,355次下载

MIT/Apache

19KB
192

缩进文档 (indoc)

github crates.io docs.rs build status

此crate提供了一种用于缩进字符串字面量的过程宏。宏 indoc!() 接受多行字符串字面量并将其取消缩进,使得最左侧的非空格字符位于第一列。

[dependencies]
indoc = "0.3"

发布说明可在 GitHub发布 下找到。

使用Indoc

use indoc::indoc;

fn main() {
    let testing = indoc!("
        def hello():
            print('Hello, world!')

        hello()
        ");
    let expected = "def hello():\n    print('Hello, world!')\n\nhello()\n";
    assert_eq!(testing, expected);
}

Indoc还可以与原始字符串字面量一起使用

use indoc::indoc;

fn main() {
    let testing = indoc!(r#"
        def hello():
            print("Hello, world!")

        hello()
        "#);
    let expected = "def hello():\n    print(\"Hello, world!\")\n\nhello()\n";
    assert_eq!(testing, expected);
}

以及字节字符串字面量

use indoc::indoc;

fn main() {
    let testing = indoc!(b"
        def hello():
            print('Hello, world!')

        hello()
        ");
    let expected = b"def hello():\n    print('Hello, world!')\n\nhello()\n";
    assert_eq!(testing[..], expected[..]);
}

说明

以下规则描述了 indoc!() 宏的行为

  1. 计算每行的前导空格数,忽略第一行和任何只包含空格的空行。
  2. 取最小值。
  3. 如果第一行是空的,即字符串以换行符开头,则删除第一行。
  4. 从每行的开头删除计算出的空格数。

这意味着有几种格式化相同字符串的等效方法,因此请选择您喜欢的格式。以下所有格式均产生相同的字符串 "line one\nline two\n"

indoc!("            /      indoc!(             /      indoc!("line one
   line one        /         "line one        /               line two
   line two       /           line two       /                ")
   ")            /            ")            /

取消缩进

Indoc的缩进逻辑可在 unindent crate中找到。这可能对处理在编译时不是静态已知的字符串很有用。

该crate公开了两个函数

  • unindent(&str) ->String
  • unindent_bytes(&[u8]) -> Vec<u8>
use unindent::unindent;

fn main() {
    let indented = "
            line one
            line two";
    assert_eq!("line one\nline two", unindent(indented));
}

许可协议

在您的选择下,根据 Apache License, Version 2.0MIT许可协议 许可。
除非您明确说明,否则根据Apache-2.0许可证定义,您有意提交以包含在此软件包中的任何贡献,都将采用上述双重许可,不附加任何额外条款或条件。

依赖项

~1.5MB
~35K SLoC