Pass properties as integers internally

master
Raymon Zutekouw 3 days ago
parent 6458d2f0af
commit 19a7658c51
Signed by: raymon
GPG Key ID: 0E62222846283925
  1. 24
      src/lib.rs

@ -5,23 +5,23 @@ pub mod wikipedia_infobox_analyzer {
use itertools::Itertools; use itertools::Itertools;
/// Looks for a used template that does lists wikidata properties listing /// Looks for a used template that does lists wikidata properties listing
pub fn extract_used_properties_from_template(template: String) -> Vec<String> { pub fn extract_used_properties_from_template(template: String) -> Vec<u64> {
let mut lines = template.lines(); let mut lines = template.lines();
let used = lines let used = lines
.find(|line| line.starts_with("{{") && line.contains("Wikidata|")) .find(|line| line.starts_with("{{") && line.contains("Wikidata|"))
.expect("Template should have a line declaring which properties are used"); .expect("Template should have a line declaring which properties are used");
// The properties are listed inside the template with their number: P1|P2|P... // The properties are listed inside the template with their number: P1|P2|P...
let re = Regex::new(r"P\d+").unwrap(); let re = Regex::new(r"P(\d+)").unwrap();
// Find all matches and collect the properties into vector // Find all matches and collect the properties into vector
re.find_iter(used) re.captures_iter(used)
.map(|m| m.as_str().to_owned()) .map(|m| m[1].parse().unwrap())
.collect() .collect()
} }
/// Creates an ascii infobox out of the properties /// Creates an ascii infobox out of the properties
pub fn format_infobox_from_used_properties(name: String, properties: Vec<String>) -> String { pub fn format_infobox_from_used_properties(name: String, properties: Vec<u64>) -> String {
let mut ascii_table = AsciiTable::default(); let mut ascii_table = AsciiTable::default();
ascii_table.set_max_width(26); ascii_table.set_max_width(26);
ascii_table ascii_table
@ -29,7 +29,7 @@ pub mod wikipedia_infobox_analyzer {
.set_header(name) .set_header(name)
.set_align(Align::Left); .set_align(Align::Left);
let data: Vec<Vec<&String>> = properties.iter().map(|v| vec![v]).collect(); let data: Vec<Vec<String>> = properties.iter().map(|v| vec![format!("P{v}")]).collect();
ascii_table.format(data) ascii_table.format(data)
} }
@ -116,9 +116,9 @@ mod tests {
assert_eq!( assert_eq!(
extract_used_properties_from_template(contents), extract_used_properties_from_template(contents),
vec![ vec![
"P18", "P154", "P1128", "P4103", "P2139", "P2295", "P2226", "P856", "P169", 18, 154, 1128, 4103, 2139, 2295, 2226, 856, 169,
"P1448", "P159", "P749", "P355", "P17", "P1056", "P452", "P576", "P112", "P127", 1448, 159, 749, 355, 17, 1056, 452, 576, 112, 127,
"P856", "P2096" 856, 2096
] ]
); );
@ -128,8 +128,8 @@ mod tests {
assert_eq!( assert_eq!(
extract_used_properties_from_template(contents), extract_used_properties_from_template(contents),
vec![ vec![
"P18", "P154", "P170", "P178", "P275", "P277", "P306", "P348", "P400", "P548", 18, 154, 170, 178, 275, 277, 306, 348, 400, 548,
"P571", "P577", "P856", "P1324", "P2096" 571, 577, 856, 1324, 2096
] ]
); );
} }
@ -139,7 +139,7 @@ mod tests {
assert_eq!( assert_eq!(
format_infobox_from_used_properties( format_infobox_from_used_properties(
"Earth".to_string(), "Earth".to_string(),
vec!["P31".to_string(), "P361".to_string(), "P571".to_string()] vec![31, 361, 571]
), ),
concat![ concat![
"┌───────┐\n", "┌───────┐\n",

Loading…
Cancel
Save