Skip to main content

ftml/parsing/rule/impls/
bibcite.rs

1/*
2 * parsing/rule/impls/bibcite.rs
3 *
4 * ftml - Library to parse Wikidot text
5 * Copyright (C) 2019-2026 Wikijump Team
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21use super::prelude::*;
22
23pub const RULE_BIBCITE: Rule = Rule {
24    name: "bibcite",
25    position: LineRequirement::Any,
26    try_consume_fn,
27};
28
29fn try_consume_fn<'r, 't>(
30    parser: &mut Parser<'r, 't>,
31) -> ParseResult<'r, 't, Elements<'t>> {
32    debug!("Trying to create bibcite element");
33    assert_step(parser, Token::LeftParentheses)?;
34
35    // This is like a poor man's block, it's "((bibcite <label>))"
36    let current = parser.current();
37    if current.token != Token::Identifier
38        && !current.slice.eq_ignore_ascii_case("bibcite")
39    {
40        warn!("'((' not followed by 'bibcite', failing rule");
41        return Err(parser.make_err(ParseErrorKind::RuleFailed));
42    }
43    parser.step()?;
44
45    // Then check the next token is a space
46    if !matches!(parser.current().token, Token::Whitespace) {
47        warn!("'((bibcite' not followed by a space, failing rule");
48        return Err(parser.make_err(ParseErrorKind::RuleFailed));
49    }
50    parser.step()?;
51
52    let label = collect_text(
53        parser,
54        RULE_BIBCITE,
55        &[ParseCondition::current(Token::RightParentheses)],
56        &[
57            ParseCondition::current(Token::Whitespace),
58            ParseCondition::current(Token::ParagraphBreak),
59            ParseCondition::current(Token::LineBreak),
60        ],
61        None,
62    )?;
63
64    ok!(Element::BibliographyCite {
65        label: cow!(label),
66        brackets: false,
67    })
68}