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
|
//! Resolve events.
use crate::construct;
use crate::subtokenize::Subresult;
use crate::tokenizer::Tokenizer;
use alloc::string::String;
/// Names of resolvers.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Name {
/// Resolve labels.
///
/// Labels are parsed as starts and ends, and when they match, merged
/// together to form media (links and images), and otherwise turned into
/// data.
Label,
/// Resolve attention.
///
/// Attention sequences are parsed and finally matched together to form
/// attention (emphasis and strong) based on which characters they contain,
/// and what occurs before and after each sequence.
/// Otherwise they are turned into data.
Attention,
/// Resolve GFM tables.
///
/// The table head, and later each row, are all parsed separately.
/// Resolving groups everything together, and groups cells.
GfmTable,
/// Resolve heading (atx).
///
/// Heading (atx) contains further sequences and data.
/// At the end, a final sequence is kept that way, while the rest is merged
/// with the data.
HeadingAtx,
/// Resolve heading (setext).
///
/// Heading (setext) is parsed as an underline that is preceded by content,
/// both will form the whole construct.
HeadingSetext,
/// Resolve list item.
///
/// List items are parsed on their own.
/// They are wrapped into ordered or unordered lists based on whether items
/// with the same marker occur next to each other.
ListItem,
/// Resolve content.
///
/// Content is parsed as single lines, as what remains if other flow
/// constructs don’t match.
/// But, when they occur next to each other, they need to be merged.
Content,
/// Resolve data.
///
/// Data is parsed as many small bits, due to many punctuation characters
/// potentially starting something in particularly text content.
/// It helps performance to merge them together if those markers did not
/// match anything and hence they occur next to each other.
Data,
/// Resolve whitespace in `string`.
String,
/// Resolve whitespace in `text`.
Text,
}
/// Call the corresponding resolver.
pub fn call(tokenizer: &mut Tokenizer, name: Name) -> Result<Option<Subresult>, String> {
let result = match name {
Name::Label => construct::label_end::resolve(tokenizer),
Name::Attention => construct::attention::resolve(tokenizer),
Name::GfmTable => construct::gfm_table::resolve(tokenizer),
Name::HeadingAtx => construct::heading_atx::resolve(tokenizer),
Name::HeadingSetext => construct::heading_setext::resolve(tokenizer),
Name::ListItem => construct::list_item::resolve(tokenizer),
Name::Content => construct::content::resolve(tokenizer)?,
Name::Data => construct::partial_data::resolve(tokenizer),
Name::String => construct::string::resolve(tokenizer),
Name::Text => construct::text::resolve(tokenizer),
};
Ok(result)
}
|