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
#![allow(clippy::upper_case_acronyms)]

extern crate anyhow;
#[macro_use]
extern crate lazy_static;
extern crate pest;
#[macro_use]
extern crate pest_derive;

use pest::iterators::Pairs;
use pest::RuleType;

#[macro_export]
macro_rules! inline {
    ($x:expr) => {
        $x.replace("\n", "")
    };
}

mod dtd;
pub mod document;
pub mod document_type;

pub mod parser;
pub mod renderer;

#[allow(dead_code)]
fn print_type<T>(_: &T) {
    println!("{}", std::any::type_name::<T>());
}

#[allow(dead_code)]
fn print_pairs<T>(pairs: &mut Pairs<T>, level: usize)
where
    T: RuleType,
{
    let indent = " ".repeat(level);

    for pair in pairs {
        let rule = pair.as_rule();
        let span = pair.as_span();

        let tag = format!("{:?}", &rule);
        if tag == "EOI" {
            println!();
            continue;
        }

        println!("{}Rule: {:?}", indent, rule);
        println!("{}Span: {:?}", indent, span);

        let mut inner = pair.into_inner();

        // TODO: print inner text at here
        if tag == "comment" {
            if let Some(text) = inner.clone().last() {
                println!("{}Text: {:?}", indent, text);
            }
        }

        print_pairs(&mut inner, level + 2);
    }
}