diff options
Diffstat (limited to 'rust/wolfree_sed_in_place')
-rw-r--r-- | rust/wolfree_sed_in_place/Cargo.toml | 25 | ||||
-rw-r--r-- | rust/wolfree_sed_in_place/src/include_str.html | 17 | ||||
-rw-r--r-- | rust/wolfree_sed_in_place/src/include_str.js (renamed from rust/wolfree_sed_in_place/src/include_str.tsx) | 24 | ||||
-rw-r--r-- | rust/wolfree_sed_in_place/src/main.rs | 113 |
4 files changed, 68 insertions, 111 deletions
diff --git a/rust/wolfree_sed_in_place/Cargo.toml b/rust/wolfree_sed_in_place/Cargo.toml index ab2b32f..0a8bf1d 100644 --- a/rust/wolfree_sed_in_place/Cargo.toml +++ b/rust/wolfree_sed_in_place/Cargo.toml @@ -1,21 +1,24 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -# This file is part of Wolfree. -# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. [package] name = "wolfree_sed_in_place" -version = "23.7.31" +version = "2023.8.31" +authors = [ + "See the commit history of the Git repositories.", + "https://git.kiwifarms.net/wolfree", +] +categories = [ + "command-line-utilities", + "development-tools::build-utils", + "web-programming", + "template-engine", +] edition = "2021" - -authors = ["See the commit history of the Git repositories: <https://try.gitea.io/wolfree>"] -description = "This Rust program performs in-place search and replaces operations on all files within specified directories. It uses regular expressions to find occurrences of a given pattern in each file's contents and replaces them with the replacement text." +keywords = ["rust", "search", "replace", "regular expressions", "regex", "file"] license = "AGPL-3.0-or-later" -repository = "https://try.gitea.io/wolfree" readme = "README.md" -keywords = ["rust", "search", "replace", "regular expressions", "regex", "file", "in-place"] -categories = ["command-line-utilities", "development-tools::build-utils", "web-programming", "template-engine"] - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +repository = "https://git.kiwifarms.net/wolfree" +description = "Perform in-place search and replaces operations on all files within specified directories." [dependencies] regex = "1" diff --git a/rust/wolfree_sed_in_place/src/include_str.html b/rust/wolfree_sed_in_place/src/include_str.html index 2fbe0f4..f09b167 100644 --- a/rust/wolfree_sed_in_place/src/include_str.html +++ b/rust/wolfree_sed_in_place/src/include_str.html @@ -1,13 +1,15 @@ +<!-- SPDX-License-Identifier: AGPL-3.0-or-later --> + <meta name="referrer" content="no-referrer" /> -<script type="module" src="/ajax/libs/jquery/3.7.0/jquery.min.js"></script> +<script type="module" src="/ajax/libs/jquery/3.7.1/jquery.min.js"></script> <script type="module" src="/ajax/libs/dompurify/3.0.5/purify.min.js"></script> -<script type="module" src="/ajax/libs/wolfree/23.7.8/js/onload.js"></script> +<script type="module" src="/ajax/libs/wolfree/2023.8.31/js/onload.js"></script> <link rel="preload" as="style" onload="this.onload = null; this.rel = 'stylesheet';" - href="/ajax/libs/wolfree/23.7.8/css/Placeholder.css" /> + href="/ajax/libs/wolfree/2023.8.31/css/Placeholder.css" /> <link rel="preload" as="style" onload="this.onload = null; this.rel = 'stylesheet';" - href="/ajax/libs/wolfree/23.7.8/css/PodsParser.css" /> + href="/ajax/libs/wolfree/2023.8.31/css/PodsParser.css" /> <style> html>body>#__next>div>header { @@ -64,6 +66,10 @@ } </style> +<!-- + Regex in regex - Rust + https://docs.rs/regex/latest/regex/struct.Regex.html#replacement-string-syntax +--> $0 <header> @@ -72,5 +78,4 @@ $0 <a href="../mirror">Mirror</a> <a href="../source">Source</a> </nav> -</header> -<!-- SPDX-License-Identifier: AGPL-3.0-or-later -->
\ No newline at end of file +</header>
\ No newline at end of file diff --git a/rust/wolfree_sed_in_place/src/include_str.tsx b/rust/wolfree_sed_in_place/src/include_str.js index 3c8ff4e..9ef3a31 100644 --- a/rust/wolfree_sed_in_place/src/include_str.tsx +++ b/rust/wolfree_sed_in_place/src/include_str.js @@ -1,14 +1,10 @@ -/** - * @license - * SPDX-License-Identifier: AGPL-3.0-or-later - * This file is part of Wolfree. - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - */ +/* SPDX-License-Identifier: AGPL-3.0-or-later */ // @ts-check const wolfreeLexicalScopeName = (() => { - const possibleLetters = Array(); + /** @type {string[]} */ + const possibleLetters = []; for (let i = 32; i < 127; i++) { possibleLetters.push(String.fromCharCode(i)); @@ -18,7 +14,7 @@ const wolfreeLexicalScopeName = (() => { possibleLetters.map((y) => x + y) ); - const isValid = (name = String()) => { + const isValid = (name = "") => { try { return ( typeof eval(name).value === "string" && @@ -32,7 +28,7 @@ const wolfreeLexicalScopeName = (() => { const wolfreeLexicalScopeName = possibleNames.find(isValid); if (typeof wolfreeLexicalScopeName !== "string") { - console.error({ wolfreeLexicalScopeName }); + console.warn({ wolfreeLexicalScopeName }); return ""; } @@ -40,7 +36,7 @@ const wolfreeLexicalScopeName = (() => { })(); (() => { - const get = (params = String()) => { + const get = (params = "") => { return new URLSearchParams(location.search).get(params); }; @@ -51,8 +47,6 @@ const wolfreeLexicalScopeName = (() => { /** * Regex in regex - Rust * https://docs.rs/regex/latest/regex/struct.Regex.html#replacement-string-syntax - * All instances of $ref in the replacement string are replaced with the substring corresponding to the capture group identified by ref. - * ref may be an integer corresponding to the index of the capture group (counted by order of opening parenthesis where 0 is the entire match) or it can be a name (consisting of letters, digits or underscores) corresponding to a named capture group. */ // @ts-ignore $0; @@ -61,11 +55,11 @@ $0; ( await import( // @ts-ignore - "../../../ajax/libs/wolfree/23.7.8/js/Entrypoint.js" + "/ajax/libs/wolfree/2023.8.31/js/entrypoint.js" ) ).default({ input: eval(wolfreeLexicalScopeName).value, - i2d: eval(wolfreeLexicalScopeName).i2d, - extraPodstates: [], + ...(eval(wolfreeLexicalScopeName).i2d ? { i2d: true } : {}), + podstate: ["Step-by-step solution", "Step-by-step", "Show all steps"], }); })(); diff --git a/rust/wolfree_sed_in_place/src/main.rs b/rust/wolfree_sed_in_place/src/main.rs index 7d56889..f20393f 100644 --- a/rust/wolfree_sed_in_place/src/main.rs +++ b/rust/wolfree_sed_in_place/src/main.rs @@ -1,17 +1,14 @@ -//! The `wolfree_sed_in_place` crate provides a function for performing in-place replacements of patterns in multiple files using regular expressions. +/* SPDX-License-Identifier: AGPL-3.0-or-later */ + +//! This crate provides a function for performing in-place replacements of patterns in multiple files using regular expressions. //! It allows you to recursively process all files within a specified directory and replace occurrences of a given pattern with a specified replacement string. #![allow(clippy::blanket_clippy_restriction_lints)] -#![allow(clippy::exit)] -#![allow(clippy::print_stderr)] #![allow(clippy::implicit_return)] - -/* SPDX-License-Identifier: AGPL-3.0-or-later - * This file is part of Wolfree. - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - */ +#![allow(clippy::question_mark_used)] use regex::Regex; +use std::error; use std::fs; use walkdir::WalkDir; @@ -21,94 +18,52 @@ use walkdir::WalkDir; /// filters out directories, and applies a regular expression-based replacement /// on the contents of each file. /// -/// # Arguments -/// /// * `directory_path`: A string slice representing the path of the directory to traverse. /// * `pattern`: A string slice containing the regular expression pattern to search for. /// * `replacement`: A string slice representing the replacement for each matched pattern. -/// -/// # Examples -/// -/// ```rust -/// // Replace a specific pattern in the file contents in the "./data/" directory. -/// wolfree_sed_in_place("./data/", r"\bFoo\b", "Bar"); -/// ``` -/// -/// This example replaces all occurrences of the word "Foo" with "Bar" in the files inside the "data" directory. -fn wolfree_sed_in_place(directory_path: &str, pattern: &str, replacement: &str) { - // Compile the regular expression pattern - let regex = match Regex::new(pattern) { - Ok(re) => re, - Err(err) => { - eprintln!("Error: {err}",); - std::process::exit(1); - } - }; - - // Create a directory walker and filter out non-file entries - let walker = WalkDir::new(directory_path) +fn sed( + directory_path: &str, + pattern: &str, + replacement: &str +) -> Result<(), Box<dyn error::Error>> { + // Compile the regular expression pattern. + let regex = Regex::new(pattern)?; + // Create a directory walker and filter out non-file entries. + for entry in WalkDir::new(directory_path) .into_iter() .filter_map(Result::ok) - .filter(|entry| !entry.file_type().is_dir()); - - // Process each file in the directory - for entry in walker { + .filter(|entry| !entry.file_type().is_dir()) { let file_path = entry.path(); - - // Read the file's contents into a string - let file_contents = match fs::read_to_string(file_path) { - Ok(contents) => contents, - Err(err) => { - eprintln!("Error: {err}",); - std::process::exit(1); - } - }; - - // Perform the regex replacement on the file's contents - let modified_contents = regex.replace(&file_contents, replacement); - let modified_contents_as_ref = modified_contents.as_ref(); - - // Write the modified contents back to the file, overwriting its previous contents - match fs::write(file_path, modified_contents_as_ref) { - Ok(_) => (), - Err(err) => { - eprintln!("Error: {err}",); - std::process::exit(1); - } - }; + // Read the file's contents into a string. + // Perform the regex replacement on the file's contents. + // Write the modified contents back to the file, overwriting its previous contents. + fs::write(file_path, &*regex.replace(&fs::read_to_string(file_path)?, replacement))?; } + Ok(()) } /// Entry point of the program. -/// Demonstrates using `wolfree_sed_in_place` function to perform in-place replacements on files in specific directories. -fn main() { - wolfree_sed_in_place( - "./docusaurus/build/input/", - "</head><body>", - include_str!("include_str.html"), - ); +/// Demonstrates using `sed` function to perform in-place replacements on files in specific directories. +fn main() -> Result<(), Box<dyn error::Error>> { + sed("./docusaurus/static/input/", "</head><body>", include_str!("include_str.html"))?; - wolfree_sed_in_place( - "./docusaurus/build/_next/static/chunks/", + sed( + "./docusaurus/static/_next/static/chunks/", r"try(.{0,100}?)generateEncodedJSONFromValue(.*?)unescapeForUrl(.*?)catch(.*?)\{}", - include_str!("include_str.tsx"), - ); + include_str!("include_str.js") + )?; // console error: - // _app-daabd76ef4fe402d.js:5 // WebSocket connection to 'wss://localhost/n/v1/api/fetcher/results' failed: - // startWebsocket @ _app-daabd76ef4fe402d.js:5 - // send @ _app-daabd76ef4fe402d.js:5 - // sendMessage @ 1695-ae743311a23f8eb5.js:1 - // newQuery @ 1695-ae743311a23f8eb5.js:78 - // newQuery @ 1695-ae743311a23f8eb5.js:78 // fix: - // Override the hostname in the minified JavaScript source code. - wolfree_sed_in_place( - "./docusaurus/build/_next/static/chunks/pages/", + // override the hostname + sed( + "./docusaurus/static/_next/static/chunks/pages/", "window.location.hostname", - "'www.wolframalpha.com'", - ); + "'www.wolframalpha.com'" + )?; + + Ok(()) } // regex101: build, test, and debug regex |