Beginning to hand out footnote ids.
This commit is contained in:
parent
06dcd22e69
commit
52ca300de3
@ -1 +1 @@
|
|||||||
!!!!!!!! footnote_reference
|
<sup><a id="{.reference_id}" href="{.definition_link}">{.label}</a></sup>
|
||||||
|
25
org_test_documents/footnote_definitions.org
Normal file
25
org_test_documents/footnote_definitions.org
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# Test proves that:
|
||||||
|
#
|
||||||
|
# - Anonymous references with identical content get unique IDs.
|
||||||
|
# - Unreferenced footnote definitions are dropped.
|
||||||
|
# - Footnote definitions that come before their first reference are dropped.
|
||||||
|
|
||||||
|
foo[fn:2:something]
|
||||||
|
|
||||||
|
bar[fn::something]
|
||||||
|
|
||||||
|
baz[fn::something]
|
||||||
|
|
||||||
|
cat[fn::something]
|
||||||
|
|
||||||
|
dog[fn:3]
|
||||||
|
|
||||||
|
[fn:3] ipsum
|
||||||
|
|
||||||
|
[fn:4] lorem
|
||||||
|
|
||||||
|
[fn:3] dolar
|
||||||
|
|
||||||
|
[fn:5] not referenced
|
||||||
|
|
||||||
|
stuff[fn:4] and things
|
@ -3,13 +3,16 @@ use crate::error::CustomError;
|
|||||||
use super::registry::Registry;
|
use super::registry::Registry;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub(crate) struct IFootnoteReference {}
|
pub(crate) struct IFootnoteReference {
|
||||||
|
footnote_id: usize,
|
||||||
|
}
|
||||||
|
|
||||||
impl IFootnoteReference {
|
impl IFootnoteReference {
|
||||||
pub(crate) async fn new<'parse>(
|
pub(crate) async fn new<'parse>(
|
||||||
registry: &mut Registry<'parse>,
|
registry: &mut Registry<'parse>,
|
||||||
original: &organic::types::FootnoteReference<'parse>,
|
original: &organic::types::FootnoteReference<'parse>,
|
||||||
) -> Result<IFootnoteReference, CustomError> {
|
) -> Result<IFootnoteReference, CustomError> {
|
||||||
Ok(IFootnoteReference {})
|
let footnote_id = registry.get_footnote_reference_id(original.label, &original.definition);
|
||||||
|
Ok(IFootnoteReference { footnote_id })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use organic::types::Object;
|
||||||
|
|
||||||
type IdCounter = u16;
|
type IdCounter = u16;
|
||||||
|
|
||||||
pub(crate) struct Registry<'parse> {
|
pub(crate) struct Registry<'intermediate, 'parse> {
|
||||||
id_counter: IdCounter,
|
id_counter: IdCounter,
|
||||||
targets: HashMap<&'parse str, String>,
|
targets: HashMap<&'parse str, String>,
|
||||||
|
footnote_ids: Vec<(Option<&'parse str>, &Vec<Object<'parse>>)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'parse> Registry<'parse> {
|
impl<'parse> Registry<'parse> {
|
||||||
@ -12,6 +15,7 @@ impl<'parse> Registry<'parse> {
|
|||||||
Registry {
|
Registry {
|
||||||
id_counter: 0,
|
id_counter: 0,
|
||||||
targets: HashMap::new(),
|
targets: HashMap::new(),
|
||||||
|
footnote_ids: Vec::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,4 +25,37 @@ impl<'parse> Registry<'parse> {
|
|||||||
format!("target_{}", self.id_counter)
|
format!("target_{}", self.id_counter)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get a 0-indexed ID for a footnote.
|
||||||
|
///
|
||||||
|
/// This needs to be incremented to be 1-indexed for render.
|
||||||
|
pub(crate) fn get_footnote_reference_id<'b>(
|
||||||
|
&'b mut self,
|
||||||
|
label: Option<&'parse str>,
|
||||||
|
definition: &'parse Vec<Object<'parse>>,
|
||||||
|
) -> usize {
|
||||||
|
if let None = label {
|
||||||
|
// If it has no label then it must always get a new ID.
|
||||||
|
self.footnote_ids.push((None, definition));
|
||||||
|
return self.footnote_ids.len();
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(existing_id) = self
|
||||||
|
.footnote_ids
|
||||||
|
.iter()
|
||||||
|
.position(|(id, _definition)| *id == label)
|
||||||
|
{
|
||||||
|
if !definition.is_empty() {
|
||||||
|
let entry = self
|
||||||
|
.footnote_ids
|
||||||
|
.get_mut(existing_id)
|
||||||
|
.expect("If-statement proves this to be Some.");
|
||||||
|
entry.1 = definition;
|
||||||
|
}
|
||||||
|
existing_id
|
||||||
|
} else {
|
||||||
|
self.footnote_ids.push((label, definition));
|
||||||
|
self.footnote_ids.len()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user