mirror of
https://github.com/servo/servo.git
synced 2025-06-08 08:33:26 +00:00
Support persisting unminified external stylesheets (#33919)
* Support local tweaking of external stylesheets Signed-off-by: Taym <haddadi.taym@gmail.com> * Remove duplicated code between unminify_css and unminify_js Signed-off-by: Taym <haddadi.taym@gmail.com> * Add License Signed-off-by: Taym <haddadi.taym@gmail.com> * Use js-beautify instead of npx Signed-off-by: Taym <haddadi.taym@gmail.com> * Fix clippy warning Signed-off-by: Taym <haddadi.taym@gmail.com> --------- Signed-off-by: Taym <haddadi.taym@gmail.com>
This commit is contained in:
parent
bac1101163
commit
ee68dc2589
8 changed files with 206 additions and 77 deletions
100
components/script/unminify.rs
Normal file
100
components/script/unminify.rs
Normal file
|
@ -0,0 +1,100 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::fs::{create_dir_all, File};
|
||||
use std::io::{Error, ErrorKind};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::process::Command;
|
||||
|
||||
use servo_url::ServoUrl;
|
||||
use tempfile::NamedTempFile;
|
||||
use uuid::Uuid;
|
||||
|
||||
pub fn create_temp_files() -> Option<(NamedTempFile, File)> {
|
||||
// Write the minified code to a temporary file and pass its path as an argument
|
||||
// to js-beautify to read from. Meanwhile, redirect the process' stdout into
|
||||
// another temporary file and read that into a string. This avoids some hangs
|
||||
// observed on macOS when using direct input/output pipes with very large
|
||||
// unminified content.
|
||||
let (input, output) = (NamedTempFile::new(), tempfile::tempfile());
|
||||
if let (Ok(input), Ok(output)) = (input, output) {
|
||||
Some((input, output))
|
||||
} else {
|
||||
log::warn!("Error creating input and output temp files");
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum BeautifyFileType {
|
||||
Css,
|
||||
Js,
|
||||
}
|
||||
|
||||
pub fn execute_js_beautify(input: &Path, output: File, file_type: BeautifyFileType) -> bool {
|
||||
let mut cmd = Command::new("js-beautify");
|
||||
match file_type {
|
||||
BeautifyFileType::Js => (),
|
||||
BeautifyFileType::Css => {
|
||||
cmd.arg("--type").arg("css");
|
||||
},
|
||||
}
|
||||
match cmd.arg(input).stdout(output).status() {
|
||||
Ok(status) => status.success(),
|
||||
_ => {
|
||||
log::warn!(
|
||||
"Failed to execute js-beautify --type {:?}, Will store unmodified script",
|
||||
file_type
|
||||
);
|
||||
false
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_output_file(
|
||||
unminified_dir: Option<String>,
|
||||
url: &ServoUrl,
|
||||
external: Option<bool>,
|
||||
) -> Result<File, Error> {
|
||||
let path = match unminified_dir {
|
||||
Some(unminified_dir) => PathBuf::from(unminified_dir),
|
||||
None => {
|
||||
warn!("Unminified file directory not found");
|
||||
return Err(Error::new(
|
||||
ErrorKind::NotFound,
|
||||
"Unminified file directory not found",
|
||||
));
|
||||
},
|
||||
};
|
||||
|
||||
let (base, has_name) = match url.as_str().ends_with('/') {
|
||||
true => (
|
||||
path.join(&url[url::Position::BeforeHost..])
|
||||
.as_path()
|
||||
.to_owned(),
|
||||
false,
|
||||
),
|
||||
false => (
|
||||
path.join(&url[url::Position::BeforeHost..])
|
||||
.parent()
|
||||
.unwrap()
|
||||
.to_owned(),
|
||||
true,
|
||||
),
|
||||
};
|
||||
|
||||
create_dir_all(&base)?;
|
||||
|
||||
let path = if external.unwrap_or(true) && has_name {
|
||||
// External.
|
||||
path.join(&url[url::Position::BeforeHost..])
|
||||
} else {
|
||||
// Inline file or url ends with '/'
|
||||
base.join(Uuid::new_v4().to_string())
|
||||
};
|
||||
|
||||
debug!("Unminified files will be stored in {:?}", path);
|
||||
|
||||
File::create(path)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue