Skip to content

Commit

Permalink
feat: Shows all capture groups in table, closes #40
Browse files Browse the repository at this point in the history
  • Loading branch information
rbozan committed Jan 18, 2022
1 parent 63c89a6 commit d58de28
Show file tree
Hide file tree
Showing 5 changed files with 207 additions and 71 deletions.
177 changes: 118 additions & 59 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ use lsp_document::{IndexedText, Pos, TextAdapter, TextMap};
mod string_helper;
use crate::string_helper::find_translation_key_by_position;
use country_emoji::flag;
use std::collections::HashMap;
use std::convert::TryInto;
use std::path::Path;
use string_helper::get_editing_range;
Expand Down Expand Up @@ -258,19 +259,17 @@ impl Backend {
.translation_files
.include
.iter()
.map(|pattern| {
FileSystemWatcher {
glob_pattern: path_clean::clean(
folder
.uri
.to_file_path()
.unwrap()
.join(PathBuf::from(pattern))
.to_str()
.unwrap(),
),
kind: None,
}
.map(|pattern| FileSystemWatcher {
glob_pattern: path_clean::clean(
folder
.uri
.to_file_path()
.unwrap()
.join(PathBuf::from(pattern))
.to_str()
.unwrap(),
),
kind: None,
})
.collect::<Vec<FileSystemWatcher>>()
})
Expand Down Expand Up @@ -316,27 +315,37 @@ impl Backend {

let mut new_definitions = self.parse_translation_structure(&value, "".to_string())?;

let mut extra_data = HashMap::<String, String>::new();

// Use file regex language for all above definitions
let language = self
if let Some(file_name_details_regex) = self
.config
.lock()
.unwrap()
.get_mut()
.file_name
.details
.as_ref()
.and_then(|file_name_details_regex| {
file_name_details_regex
.captures(path.file_name().unwrap().to_str().unwrap())
.and_then(|cap| {
cap.name("language")
.map(|matches| matches.as_str().to_string())
})
});
{
if let Some(cap) =
file_name_details_regex.captures(path.file_name().unwrap().to_str().unwrap())
{
for capture_group_name in file_name_details_regex.capture_names().flatten() {
let capture_group_result = cap.name(capture_group_name);

if capture_group_result.is_some() {
extra_data.insert(
capture_group_name.to_string(),
capture_group_result.unwrap().as_str().to_string(),
);
}
}
};
};

let translation_file = TranslationFile {
path: path.to_path_buf(),
language,
extra_data,
};

for definition in new_definitions.iter_mut() {
Expand Down Expand Up @@ -401,27 +410,31 @@ impl Backend {
.and_then(|cap| cap.get(1).map(|group| group.as_str().to_string()))
});

let language = &self
.config
.lock()
.unwrap()
.get_mut()
.key
.details
.as_ref()
.and_then(|key_details_regex| {
key_details_regex.captures(&json_path).and_then(|cap| {
cap.name("language")
.map(|matches| matches.as_str().to_string())
})
});
let mut extra_data = HashMap::<String, String>::new();

if let Some(key_details_regex) =
&self.config.lock().unwrap().get_mut().key.details.as_ref()
{
if let Some(cap) = key_details_regex.captures(&json_path) {
for capture_group_name in key_details_regex.capture_names().flatten() {
let capture_group_result = cap.name(capture_group_name);

if capture_group_result.is_some() {
extra_data.insert(
capture_group_name.to_string(),
capture_group_result.unwrap().as_str().to_string(),
);
}
}
}
};

// key_filter_regex.captures_iter(&json_path).intersperse(".").collect();
definitions.push(Definition {
key: json_path,
cleaned_key,
value: value.to_string(),
language: language.clone(),
extra_data,
..Default::default()
});

Expand Down Expand Up @@ -456,29 +469,72 @@ impl Backend {
.clone()
.any(|definition| definition.get_flag().is_some());

let extra_data_keys: Vec<&String> = definitions_same_key
.clone()
.flat_map(|definition| {
[
definition
.extra_data
.keys()
.into_iter()
.collect::<Vec<&String>>(),
definition.file.as_ref().map_or([].into(), |file| {
file.extra_data.keys().into_iter().collect()
}),
]
})
.flatten()
.filter(|key| *key != &"language".to_string())
.unique()
.collect();

let mut table_headers = Vec::new();
if has_flag || has_language {
table_headers.push("flag");
table_headers.push("language");
}

extra_data_keys.iter().for_each(|data_key| {
table_headers.push(&data_key);
});

table_headers.push("translation");

let body = definitions_same_key
.map(|def| {
let mut row_data = Vec::<String>::new();
if has_flag || has_language {
let row_data = vec![
def.get_flag().unwrap_or("🏴󠁢󠁳󠁢󠁰󠁿".to_string()),
format!("**{}**", def.get_language().unwrap_or(&"".to_string())),
def.get_printable_value(),
];

row_data.join("|")
} else {
format!("|{}", def.get_printable_value())
row_data.push(def.get_flag().unwrap_or("🏴󠁢󠁳󠁢󠁰󠁿".to_string()));

row_data.push(format!(
"**{}**",
def.get_language().unwrap_or(&"-".to_string())
));
}

extra_data_keys.iter().for_each(|data_key| {
row_data.push(
def.get_full_extra_data(*data_key)
.unwrap_or(&"-".to_string())
.to_string(),
);
});

row_data.push(def.get_printable_value());

row_data.join("|")
})
.intersperse("\n".to_string())
.collect::<String>();

let header = if has_flag || has_language {
"flag|language|translation\n-|-|-"
} else {
"|translation|\n|-"
};
return Some(format!("{}\n{}", header, body));
let table_separators: String = table_headers.iter().map(|_| "-").join("|");

return Some(format!(
"|{}|\n|{}|\n|{}|",
table_headers.join("|"),
table_separators,
body
));
}
None
}
Expand Down Expand Up @@ -761,16 +817,16 @@ async fn main() {
#[derive(Debug, Clone)]
struct TranslationFile {
path: PathBuf,
language: Option<String>,
extra_data: HashMap<String, String>,
}

#[derive(Default, Debug)]
struct Definition {
key: String,
cleaned_key: Option<String>,
file: Option<TranslationFile>,
language: Option<String>,
value: String,
extra_data: HashMap<String, String>,
}

impl PartialEq for Definition {
Expand All @@ -797,11 +853,14 @@ impl Definition {
self.cleaned_key.as_ref().unwrap_or(&self.key)
}

fn get_full_extra_data(&self, key: &str) -> Option<&String> {
self.extra_data
.get(key)
.or(self.file.as_ref().and_then(|file| file.extra_data.get(key)))
}

fn get_language(&self) -> Option<&String> {
return self
.language
.as_ref()
.or(self.file.as_ref().and_then(|file| file.language.as_ref()));
self.get_full_extra_data("language")
}

/// Returns a flag emoji based on the supplied `language`
Expand Down
15 changes: 12 additions & 3 deletions src/tests/definition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@ use super::*;

#[test]
fn converts_en_to_us_flag() {
let mut extra_data = HashMap::<String, String>::new();
extra_data.insert("language".to_string(), "en".to_string());

let definition = Definition {
key: "en.test_key".to_string(),
cleaned_key: Some("test_key".to_string()),
language: Some("en".to_string()),
extra_data,
value: "some value".to_string(),
..Default::default()
};
Expand All @@ -15,10 +18,13 @@ fn converts_en_to_us_flag() {

#[test]
fn printable_value_escapes_newlines() {
let mut extra_data = HashMap::<String, String>::new();
extra_data.insert("language".to_string(), "en".to_string());

let definition = Definition {
key: "en.test_key".to_string(),
cleaned_key: Some("test_key".to_string()),
language: Some("en".to_string()),
extra_data,
value: "\nSome value with multiple\nnewlines".to_string(),
..Default::default()
};
Expand All @@ -31,10 +37,13 @@ fn printable_value_escapes_newlines() {

#[test]
fn printable_value_escapes_vertical_line() {
let mut extra_data = HashMap::<String, String>::new();
extra_data.insert("language".to_string(), "en".to_string());

let definition = Definition {
key: "en.test_key".to_string(),
cleaned_key: Some("test_key".to_string()),
language: Some("en".to_string()),
extra_data,
value: "Abc|defg".to_string(),
..Default::default()
};
Expand Down
3 changes: 3 additions & 0 deletions src/tests/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ use futures::select;
use futures::{FutureExt, StreamExt};
use std::env;

#[cfg(test)]
use pretty_assertions::assert_eq;

lazy_static! {
static ref INITIALIZE_REQUEST: Incoming = serde_json::from_str(
r#"{"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{}},"id":1}"#
Expand Down
Loading

0 comments on commit d58de28

Please sign in to comment.