summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock61
-rw-r--r--android/translations-converter/Cargo.toml1
-rw-r--r--android/translations-converter/src/android.rs19
3 files changed, 66 insertions, 15 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 0579b09ae3..aec551d796 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -815,6 +815,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35"
[[package]]
+name = "htmlize"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76afe6d2bfc32d303d6add823bdf8785fbcadab9bd63a7407e457a4e7684d9f5"
+dependencies = [
+ "phf",
+ "serde_json",
+]
+
+[[package]]
name = "http"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1775,6 +1785,50 @@ dependencies = [
]
[[package]]
+name = "phf"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
+dependencies = [
+ "phf_macros",
+ "phf_shared",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
+dependencies = [
+ "phf_shared",
+ "rand 0.7.3",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
+dependencies = [
+ "phf_generator",
+ "phf_shared",
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
name = "pin-project"
version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2413,6 +2467,12 @@ dependencies = [
]
[[package]]
+name = "siphasher"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa8f3741c7372e75519bd9346068370c9cdaabcc1f9599cbcf2a2719352286b7"
+
+[[package]]
name = "slab"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3104,6 +3164,7 @@ dependencies = [
name = "translations-converter"
version = "0.1.0"
dependencies = [
+ "htmlize",
"lazy_static",
"regex",
"serde",
diff --git a/android/translations-converter/Cargo.toml b/android/translations-converter/Cargo.toml
index fadfdc6396..a5f01aa386 100644
--- a/android/translations-converter/Cargo.toml
+++ b/android/translations-converter/Cargo.toml
@@ -8,6 +8,7 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+htmlize = "0.5"
lazy_static = "1"
regex = "1"
serde = { version = "1", features = ["derive"] }
diff --git a/android/translations-converter/src/android.rs b/android/translations-converter/src/android.rs
index 8360b34f1d..9cd634b1b7 100644
--- a/android/translations-converter/src/android.rs
+++ b/android/translations-converter/src/android.rs
@@ -10,9 +10,6 @@ lazy_static! {
static ref LINE_BREAKS: Regex = Regex::new(r"\s*\n\s*").unwrap();
static ref APOSTROPHES: Regex = Regex::new(r"\\'").unwrap();
static ref PARAMETERS: Regex = Regex::new(r"%[0-9]*\$").unwrap();
- static ref AMPERSANDS: Regex = Regex::new(r"&").unwrap();
- static ref LESS_THANS: Regex = Regex::new(r"<").unwrap();
- static ref GREATER_THANS: Regex = Regex::new(r">").unwrap();
}
/// Contents of an Android string resources file.
@@ -293,13 +290,10 @@ pub struct StringValue(String);
impl From<&str> for StringValue {
fn from(string: &str) -> Self {
- let value_with_parameters = string
+ let value_with_parameters = htmlize::unescape(string)
.replace(r"\", r"\\")
.replace("\"", "\\\"")
- .replace(r"'", r"\'")
- .replace("&", "&amp;")
- .replace("<", "&lt;")
- .replace(">", "&gt;");
+ .replace(r"'", r"\'");
let mut parts = value_with_parameters.split("%");
let mut value = parts.next().unwrap().to_owned();
@@ -324,14 +318,9 @@ impl StringValue {
let value = APOSTROPHES.replace_all(&value, "'");
// Mark where parameters are positioned, removing the parameter index
let value = PARAMETERS.replace_all(&value, "%");
- // Unescape ampersands
- let value = AMPERSANDS.replace_all(&value, "&");
- // Unescape less thans
- let value = LESS_THANS.replace_all(&value, "<");
- // Unescape greater thans
- let value = GREATER_THANS.replace_all(&value, ">");
- self.0 = value.into_owned();
+ // Unescape XML characters
+ self.0 = htmlize::escape_text(value.as_bytes());
}
/// Clones the internal string value.