Parse complete vng files
This commit is contained in:
@@ -1,19 +1,11 @@
|
||||
use std::{collections::HashMap, path::Path};
|
||||
use std::path::Path;
|
||||
|
||||
use dialogi::DialogSequence;
|
||||
use vn_settings::{Change, Parameter, SettingsContext};
|
||||
|
||||
pub fn parse_map(
|
||||
story_path: &Path,
|
||||
settings_context: &mut SettingsContext,
|
||||
) -> Result<Vec<DialogSequence<Change, Parameter>>, dialogi::ParsingError> {
|
||||
let mut layers = HashMap::new();
|
||||
layers.insert("Background".into(), 0);
|
||||
layers.insert("Character".into(), 1);
|
||||
|
||||
let mut settings_context = SettingsContext {
|
||||
object_cache: HashMap::new(),
|
||||
layers,
|
||||
};
|
||||
|
||||
DialogSequence::map_from_path(story_path, &mut settings_context)
|
||||
DialogSequence::map_from_path(story_path, settings_context)
|
||||
}
|
||||
|
||||
39
src/main.rs
39
src/main.rs
@@ -19,6 +19,7 @@ use data_stream::{
|
||||
from_stream, to_stream,
|
||||
};
|
||||
use dialog::parse_map;
|
||||
use header_config::parse_config;
|
||||
use maud::html;
|
||||
use percent_encoding::percent_decode_str;
|
||||
use pukram2html::{Settings, convert, convert_extended, convert_subheader};
|
||||
@@ -28,7 +29,7 @@ mod request;
|
||||
use request::Request;
|
||||
use vn_settings::{
|
||||
ColorSettings, ImageSettings, LayoutSettings, Names, ObjectSettings, PlayerSettings,
|
||||
TimingSettings,
|
||||
SettingsContext, TimingSettings,
|
||||
};
|
||||
|
||||
mod dialog;
|
||||
@@ -597,12 +598,38 @@ fn handle_relative_connection(
|
||||
}
|
||||
|
||||
let check_path: &Path = relative_path.as_ref();
|
||||
let interactive = check_path.parent().is_some_and(|parent| {
|
||||
std::fs::metadata(parent.with_extension("vng")).is_ok_and(|file| file.is_file())
|
||||
});
|
||||
let config_map = check_path
|
||||
.parent()
|
||||
.map(|parent| parse_config(&parent.with_extension("vng")).ok())
|
||||
.unwrap_or_default();
|
||||
|
||||
if interactive {
|
||||
let Ok(dialogs) = parse_map(file_paths.pk) else {
|
||||
if let Some(mut config_map) = config_map {
|
||||
let mut layers = HashMap::new();
|
||||
|
||||
let keys: Vec<_> = config_map.keys().cloned().collect();
|
||||
for key in keys {
|
||||
let Some(("Layer", name)) = key.split_once(':') else {
|
||||
continue;
|
||||
};
|
||||
|
||||
let value = config_map.shift_remove(&key).expect("Invalid layer");
|
||||
if !value.is_empty() {
|
||||
eprintln!("Layers don't accept arguments!");
|
||||
}
|
||||
layers.insert(name.into(), layers.len());
|
||||
}
|
||||
|
||||
if layers.is_empty() {
|
||||
layers.insert("Background".into(), 0);
|
||||
layers.insert("Character".into(), 1);
|
||||
}
|
||||
|
||||
let mut settings_context = SettingsContext {
|
||||
object_cache: HashMap::new(),
|
||||
layers,
|
||||
};
|
||||
|
||||
let Ok(dialogs) = parse_map(file_paths.pk, &mut settings_context) else {
|
||||
fail(stream);
|
||||
return;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user