Add format lua support

This commit is contained in:
2025-08-29 17:08:54 +08:00
parent 40436a05f5
commit 0b2e5f5589
7 changed files with 621 additions and 23 deletions

View File

@@ -253,6 +253,10 @@ pub struct Arg {
/// Specify the language of Artemis AST script.
/// If not specified, the first language will be used.
pub artemis_ast_lang: Option<String>,
#[cfg(feature = "artemis")]
#[arg(long, global = true, action = ArgAction::SetTrue)]
/// Do not format lua code in Artemis ASB script(.asb/.iet) when exporting.
pub artemis_asb_no_format_lua: bool,
// Default value is from tagFilters in macro.iet
#[cfg(feature = "artemis-panmimisoft")]
#[arg(

View File

@@ -1775,6 +1775,8 @@ fn main() {
lossless_audio_fmt: arg.lossless_audio_fmt,
#[cfg(feature = "audio-flac")]
flac_compression_level: arg.flac_compression_level,
#[cfg(feature = "artemis")]
artemis_asb_format_lua: !arg.artemis_asb_no_format_lua,
};
match &arg.command {
args::Command::Export { input, output } => {

View File

@@ -9,6 +9,7 @@ use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::io::{Read, Write};
use std::ops::Index;
use stylua_lib::{Config as LuaFormatterConfig, OutputVerification, format_code};
use unicode_segmentation::UnicodeSegmentation;
#[derive(Debug)]
@@ -422,6 +423,7 @@ pub struct Asb {
items: Vec<Item>,
custom_yaml: bool,
is_iet: bool,
format_lua: bool,
}
impl Asb {
@@ -453,8 +455,26 @@ impl Asb {
is_iet: std::path::Path::new(filename)
.extension()
.map_or(false, |ext| ext.eq_ignore_ascii_case("iet")),
format_lua: config.artemis_asb_format_lua,
})
}
fn to_string(&self, items: &[Item]) -> Result<String> {
if self.custom_yaml {
Ok(serde_yaml_ng::to_string(items)?)
} else {
Ok(serde_json::to_string_pretty(items)?)
}
}
fn format_lua(&self, script: &str) -> Result<String> {
let mut config = LuaFormatterConfig::new();
config.indent_type = stylua_lib::IndentType::Spaces;
config.indent_width = 2;
config.column_width = 120;
config.line_endings = stylua_lib::LineEndings::Unix;
Ok(format_code(script, config, None, OutputVerification::None)?)
}
}
impl Script for Asb {
@@ -673,10 +693,36 @@ impl Script for Asb {
}
fn custom_export(&self, filename: &std::path::Path, encoding: Encoding) -> Result<()> {
let s = if self.custom_yaml {
serde_yaml_ng::to_string(&self.items)?
let s = if self.format_lua {
let items: Vec<_> = self
.items
.iter()
.map(|s| {
if let Item::Command(cmd) = s {
if cmd.name == "lua" {
if let Some(script) = cmd.attributes.get("script") {
let mut cmd = cmd.clone();
cmd.attributes.insert(
"script".to_string(),
match self.format_lua(script) {
Ok(s) => s,
Err(_) => {
eprintln!("Warning: Failed to format Lua script.");
crate::COUNTER.inc_warning();
script.clone()
}
},
);
return Item::Command(cmd);
}
}
}
s.clone()
})
.collect();
self.to_string(&items)?
} else {
serde_json::to_string_pretty(&self.items)?
self.to_string(&self.items)?
};
let s = encode_string(encoding, &s, false)?;
let mut file = std::fs::File::create(filename)?;

View File

@@ -264,6 +264,7 @@ pub struct ExtraConfig {
/// Whether to compress files in BGI archive when packing BGI archive.
pub bgi_compress_file: bool,
#[cfg(feature = "bgi-arc")]
#[default(3)]
/// Minimum length of match size for DSC compression. Possible values are 2-256.
pub bgi_compress_min_len: usize,
#[cfg(feature = "emote-img")]
@@ -280,6 +281,7 @@ pub struct ExtraConfig {
/// Disable Artemis script indent, used to format Artemis script.
pub artemis_no_indent: bool,
#[cfg(feature = "artemis")]
#[default(100)]
/// Max line width in Artemis script, used to format Artemis script.
pub artemis_max_line_width: usize,
#[cfg(feature = "artemis")]
@@ -363,6 +365,10 @@ pub struct ExtraConfig {
#[default(5)]
/// FLAC compression level for output FLAC audio files. 0 means fastest compression, 8 means best compression. Default level is 5.
pub flac_compression_level: u32,
#[cfg(feature = "artemis")]
#[default(true)]
/// Format lua code in Artemis ASB script(.asb/.iet) when exporting.
pub artemis_asb_format_lua: bool,
}
#[derive(Clone, Copy, Debug, ValueEnum, PartialEq, Eq, PartialOrd, Ord)]