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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Copyright 2018 Fredrik Portström <https://portstrom.com>
// This is free software distributed under the terms specified in
// the file LICENSE at the top-level directory of this distribution.
pub fn parse_external_links<'a>(
context: &mut ::Context<'a>,
heading_node: &::Node,
nodes: &[::Node<'a>],
output: &mut Option<Option<Vec<::ExternalLink<'a>>>>,
) -> usize {
::parse_unordered_list_section_basic(
context,
heading_node,
nodes,
output,
|context, _list_node, list_items| {
Some(
list_items
.iter()
.filter_map(|item| {
let result = if let [::Node::Template {
name, parameters, ..
}] = item.nodes.as_slice()
{
::parse_text(name).and_then(|name| match &name as _ {
"Commons" => parse_template(
parameters,
::ExternalLinkType::Commons,
&["galerie", "kategorie"],
),
"Wikicesty" => parse_template(
parameters,
::ExternalLinkType::Wikivoyage,
&["kategorie", "průvodce"],
),
"Wikicitáty" => parse_template(
parameters,
::ExternalLinkType::Wikiquote,
&["dílo", "kategorie", "osoba", "téma"],
),
"Wikidruhy" => parse_template(
parameters,
::ExternalLinkType::Wikispecies,
&["kategorie", "taxon"],
),
"Wikiknihy" => parse_template(
parameters,
::ExternalLinkType::Wikibooks,
&["kategorie", "kniha"],
),
"Wikipedie" => parse_template(
parameters,
::ExternalLinkType::Wikipedia,
&["kategorie", "portál", "rozcestník", "článek"],
),
"Wikiverzita" => parse_template(
parameters,
::ExternalLinkType::Wikiversity,
&["kategorie", "kurs"],
),
"Wikizdroje" => parse_template(
parameters,
::ExternalLinkType::Wikisource,
&["OSN", "autor", "dílo", "kategorie", "rozcestník"],
),
"Wikizprávy" => parse_template(
parameters,
::ExternalLinkType::Wikinews,
&["kategorie", "zpráva"],
),
_ => None,
})
} else {
None
};
if result.is_none() {
::add_warning(context, item, ::WarningMessage::ValueUnrecognized);
}
result
})
.collect(),
)
},
)
}
fn parse_template<'a>(
parameters: &[::Parameter<'a>],
type_: ::ExternalLinkType,
kinds: &[&str],
) -> Option<::ExternalLink<'a>> {
if let [parameter] = parameters {
if let Some(kind) = ::parse_parameter_name(parameter) {
if kinds.iter().any(|item| kind == *item) {
if let Some(value) = ::parse_text(¶meter.value) {
return Some(::ExternalLink {
kind: ::Cow::Borrowed(kind),
type_,
value,
});
}
}
}
}
None
}