diff options
Diffstat (limited to 'src/character.rs')
-rw-r--r-- | src/character.rs | 86 |
1 files changed, 84 insertions, 2 deletions
diff --git a/src/character.rs b/src/character.rs index b82ac18..b0322dd 100644 --- a/src/character.rs +++ b/src/character.rs | |||
@@ -1,6 +1,11 @@ | |||
1 | use super::tags; | ||
1 | use super::tags::Tag; | 2 | use super::tags::Tag; |
3 | use super::dl_list; | ||
2 | use super::dl_list::DLListItem; | 4 | use super::dl_list::DLListItem; |
5 | use super::section; | ||
3 | use super::section::Section; | 6 | use super::section::Section; |
7 | use super::regex::Regex; | ||
8 | use super::tiles; | ||
4 | 9 | ||
5 | use std::collections::HashMap; | 10 | use std::collections::HashMap; |
6 | 11 | ||
@@ -29,12 +34,86 @@ pub struct Character { | |||
29 | pub image: Images, | 34 | pub image: Images, |
30 | pub tags: Vec<Tag>, | 35 | pub tags: Vec<Tag>, |
31 | pub traits: Traits, | 36 | pub traits: Traits, |
37 | pub assignments: Vec<u32>, | ||
38 | pub chars_similar_traits: Vec<u32>, | ||
32 | pub extra: Vec<DLListItem>, | 39 | pub extra: Vec<DLListItem>, |
33 | 40 | ||
34 | pub role: Option<String> | 41 | pub role: Option<String>, |
35 | } | 42 | } |
36 | 43 | ||
37 | pub fn get_sections() -> HashMap<String, Section> { | 44 | impl Names { |
45 | pub fn new() -> Self { | ||
46 | Names { romaji: String::new(), japanese: String::new(), aliases: vec![] } | ||
47 | } | ||
48 | } | ||
49 | |||
50 | impl Images { | ||
51 | pub fn new() -> Self { | ||
52 | Images { thumb: String::new(), full: String::new() } | ||
53 | } | ||
54 | } | ||
55 | |||
56 | impl Traits { | ||
57 | pub fn new() -> Self { | ||
58 | Traits { official: vec![], indexed: vec![] } | ||
59 | } | ||
60 | } | ||
61 | |||
62 | impl Character { | ||
63 | pub fn new() -> Self { | ||
64 | Character { | ||
65 | name: Names::new(), | ||
66 | image: Images::new(), | ||
67 | tags: vec![], | ||
68 | traits: Traits::new(), | ||
69 | assignments: vec![], | ||
70 | chars_similar_traits: vec![], | ||
71 | extra: vec![], | ||
72 | role: None | ||
73 | } | ||
74 | } | ||
75 | |||
76 | pub fn parse(&mut self, buf: &str) { | ||
77 | let re_extras = Regex::new(r#"(?is)Extra Details \| [0-9]+</H3>.*?<dl>(.*?)</dl>"#).unwrap(); | ||
78 | let mut sections = get_sections(); | ||
79 | section::process(&buf, &mut sections); | ||
80 | |||
81 | let caps = re_extras.captures(&buf); | ||
82 | if caps.is_some() { | ||
83 | self.extra = dl_list::parse(caps.unwrap().at(1).unwrap()); | ||
84 | } | ||
85 | |||
86 | { | ||
87 | let name: &Section = §ions["name".into()]; | ||
88 | let image: &Section = §ions["image".into()]; | ||
89 | let misc: &Section = §ions["misc".into()]; | ||
90 | |||
91 | self.name.romaji = name.data["romaji".into()].clone(); | ||
92 | self.name.japanese = name.data["japanese".into()].clone(); | ||
93 | |||
94 | if name.data["aliases".into()].len() > 0 { | ||
95 | self.name.aliases = name.data["aliases".into()].split(", ").map(|s| s.to_string()).collect(); | ||
96 | } | ||
97 | |||
98 | self.image.thumb = image.data["thumb".into()].clone(); | ||
99 | self.image.full = image.data["full".into()].clone(); | ||
100 | |||
101 | self.tags = tags::parse(&(§ions["tags".into()] as &Section).data["tags_raw".into()]); | ||
102 | |||
103 | self.traits.official = dl_list::parse(&(§ions["traits"] as &Section).data["official_raw".into()]); | ||
104 | self.traits.indexed = dl_list::parse(&(§ions["traits"] as &Section).data["indexed_raw".into()]); | ||
105 | |||
106 | self.assignments = tiles::parse_tile_link_ids(&(§ions["assignments"] as &Section).data["raw".into()], "series"); | ||
107 | self.chars_similar_traits = tiles::parse_tile_link_ids(&(§ions["chars_similar_traits"] as &Section).data["raw".into()], "character"); | ||
108 | |||
109 | if misc.data["role".into()].len() > 0 { | ||
110 | self.role = Some(misc.data["role".into()].clone()); | ||
111 | } | ||
112 | } | ||
113 | } | ||
114 | } | ||
115 | |||
116 | fn get_sections() -> HashMap<String, Section> { | ||
38 | let mut s: HashMap<String, Section> = HashMap::new(); | 117 | let mut s: HashMap<String, Section> = HashMap::new(); |
39 | 118 | ||
40 | s.insert("name".into(), Section::new("name", r#"(?is)Romaji Name.*?<TD>(.*?)\s?</TD>.*?Japanese Name.*?<TD>(.*?)\s?</TD>.*?Aliases.*?<TD>(.*?)\s?</TD>"#, vec!["romaji", "japanese", "aliases"])); | 119 | s.insert("name".into(), Section::new("name", r#"(?is)Romaji Name.*?<TD>(.*?)\s?</TD>.*?Japanese Name.*?<TD>(.*?)\s?</TD>.*?Aliases.*?<TD>(.*?)\s?</TD>"#, vec!["romaji", "japanese", "aliases"])); |
@@ -42,5 +121,8 @@ pub fn get_sections() -> HashMap<String, Section> { | |||
42 | s.insert("image".into(), Section::new("image", r#"(?is)<H3 id="section99">.*<img src="(.*?)" alt=.*?></a><p><a href="(.*?)">View Full Size Image"#, vec!["thumb", "full"])); | 121 | s.insert("image".into(), Section::new("image", r#"(?is)<H3 id="section99">.*<img src="(.*?)" alt=.*?></a><p><a href="(.*?)">View Full Size Image"#, vec!["thumb", "full"])); |
43 | s.insert("tags".into(), Section::new("tags", r#"(?is)tagged as</P>.*?<TH>(.*?)</TH>"#, vec!["tags_raw"])); | 122 | s.insert("tags".into(), Section::new("tags", r#"(?is)tagged as</P>.*?<TH>(.*?)</TH>"#, vec!["tags_raw"])); |
44 | s.insert("traits".into(), Section::new("traits", r#"(?is)indexed traits</P>.*?<dl>(.*?)</dl>.*?official traits\s?</P>.*?<dl>(.*?)</dl>"#, vec!["indexed_raw", "official_raw"])); | 123 | s.insert("traits".into(), Section::new("traits", r#"(?is)indexed traits</P>.*?<dl>(.*?)</dl>.*?official traits\s?</P>.*?<dl>(.*?)</dl>"#, vec!["indexed_raw", "official_raw"])); |
124 | s.insert("assignments".into(), Section::new("assignments", r#"(?is)appears in the following</P>(.*?)</UL>"#, vec!["raw"])); | ||
125 | s.insert("chars_similar_traits".into(), Section::new("assignments", r#"(?is)with Similar Traits</H3>(.*?)</UL>"#, vec!["raw"])); | ||
126 | |||
45 | s | 127 | s |
46 | } | 128 | } |