wip
This commit is contained in:
		
							parent
							
								
									b72de5b254
								
							
						
					
					
						commit
						a5e0857285
					
				
							
								
								
									
										53
									
								
								.gitea/workflows/test.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								.gitea/workflows/test.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					name: test
 | 
				
			||||||
 | 
					run-name: test
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  workflow_call:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    branches:
 | 
				
			||||||
 | 
					      - '*'
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  clippy:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - uses: https://github.com/actions/checkout.git@v4
 | 
				
			||||||
 | 
					      - uses: https://gitea.com/wolfogre/cache/restore@v3
 | 
				
			||||||
 | 
					        id: cache
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          path: |
 | 
				
			||||||
 | 
					            .cache
 | 
				
			||||||
 | 
					            target
 | 
				
			||||||
 | 
					          key: ${{github.repository}}-cache-cargo-clippy-v4-${{ hashFiles('Cargo.lock') }}
 | 
				
			||||||
 | 
					          restore-keys: ${{github.repository}}-cache-cargo-clippy-v4
 | 
				
			||||||
 | 
					      - uses: nanobyte-public/rust-action@master
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          args: CARGO_HOME=./.cache cargo clippy -- -Dwarnings
 | 
				
			||||||
 | 
					      - uses: https://gitea.com/wolfogre/cache/save@v3
 | 
				
			||||||
 | 
					        if: steps.cache.outputs.cache-hit != 'true'
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          path: |
 | 
				
			||||||
 | 
					            .cache
 | 
				
			||||||
 | 
					            target
 | 
				
			||||||
 | 
					          key: ${{github.repository}}-cache-cargo-clippy-v4-${{ hashFiles('Cargo.lock') }}
 | 
				
			||||||
 | 
					  test:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - uses: https://github.com/actions/checkout.git@v4
 | 
				
			||||||
 | 
					      - uses: https://gitea.com/wolfogre/cache/restore@v3
 | 
				
			||||||
 | 
					        id: cache
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          path: |
 | 
				
			||||||
 | 
					            .cache
 | 
				
			||||||
 | 
					            target
 | 
				
			||||||
 | 
					          key: ${{github.repository}}-cache-cargo-test-v4-${{ hashFiles('Cargo.lock') }}
 | 
				
			||||||
 | 
					          restore-keys: ${{github.repository}}-cache-cargo-test-v4
 | 
				
			||||||
 | 
					      - uses: nanobyte-public/rust-action@master
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          args: |
 | 
				
			||||||
 | 
					            CARGO_HOME=./.cache  cargo test
 | 
				
			||||||
 | 
					      - uses: https://gitea.com/wolfogre/cache/save@v3
 | 
				
			||||||
 | 
					        if: steps.cache.outputs.cache-hit != 'true'
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          path: |
 | 
				
			||||||
 | 
					            .cache
 | 
				
			||||||
 | 
					            target
 | 
				
			||||||
 | 
					          key: ${{github.repository}}-cache-cargo-test-v4-${{ hashFiles('Cargo.lock') }}
 | 
				
			||||||
							
								
								
									
										26
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										26
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -1128,6 +1128,21 @@ dependencies = [
 | 
				
			|||||||
 "version_check",
 | 
					 "version_check",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "nanobyte_tera"
 | 
				
			||||||
 | 
					version = "0.1.0"
 | 
				
			||||||
 | 
					source = "git+https://glpat-Us_EdFTzQLv4shViQXi_:glpat-Us_EdFTzQLv4shViQXi_@gitlab.nanobyte.cz/tools/nanobyte_tera.git?branch=master#75c20a9806663ca04c6f8a7afff64d7b5906d113"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "chrono",
 | 
				
			||||||
 | 
					 "fluent-bundle",
 | 
				
			||||||
 | 
					 "fluent-resmgr",
 | 
				
			||||||
 | 
					 "log",
 | 
				
			||||||
 | 
					 "ovlach_data",
 | 
				
			||||||
 | 
					 "rocket_dyn_templates",
 | 
				
			||||||
 | 
					 "sha256",
 | 
				
			||||||
 | 
					 "unic-langid",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "native-tls"
 | 
					name = "native-tls"
 | 
				
			||||||
version = "0.2.11"
 | 
					version = "0.2.11"
 | 
				
			||||||
@ -1287,7 +1302,9 @@ dependencies = [
 | 
				
			|||||||
 "fluent-bundle",
 | 
					 "fluent-bundle",
 | 
				
			||||||
 "fluent-resmgr",
 | 
					 "fluent-resmgr",
 | 
				
			||||||
 "log",
 | 
					 "log",
 | 
				
			||||||
 | 
					 "nanobyte_tera",
 | 
				
			||||||
 "ovlach_data",
 | 
					 "ovlach_data",
 | 
				
			||||||
 | 
					 "ovlach_tera",
 | 
				
			||||||
 "phf",
 | 
					 "phf",
 | 
				
			||||||
 "reqwest",
 | 
					 "reqwest",
 | 
				
			||||||
 "rocket",
 | 
					 "rocket",
 | 
				
			||||||
@ -1299,6 +1316,15 @@ dependencies = [
 | 
				
			|||||||
 "unic-langid",
 | 
					 "unic-langid",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "ovlach_tera"
 | 
				
			||||||
 | 
					version = "0.1.0"
 | 
				
			||||||
 | 
					source = "git+https://glpat-_yPuXbEzECyk3FaHudCN:glpat-_yPuXbEzECyk3FaHudCN@gitlab.nanobyte.cz/ondrej/ovlach_tera.git?branch=master#0ab1bbadd76c1336e00b2a38e572048003879ab6"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "rocket_dyn_templates",
 | 
				
			||||||
 | 
					 "serde",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "parking_lot"
 | 
					name = "parking_lot"
 | 
				
			||||||
version = "0.12.1"
 | 
					version = "0.12.1"
 | 
				
			||||||
 | 
				
			|||||||
@ -20,4 +20,6 @@ sha256 = "1.4.0"
 | 
				
			|||||||
fluent-bundle = "0.15.2"
 | 
					fluent-bundle = "0.15.2"
 | 
				
			||||||
fluent-resmgr = "0.0.6"
 | 
					fluent-resmgr = "0.0.6"
 | 
				
			||||||
unic-langid = "0.9.1"
 | 
					unic-langid = "0.9.1"
 | 
				
			||||||
phf = { version = "0.11.2", features = ["macros"] }
 | 
					phf = { version = "0.11.2", features = ["macros"] }
 | 
				
			||||||
 | 
					nanobyte_tera = {  git = "https://glpat-Us_EdFTzQLv4shViQXi_:glpat-Us_EdFTzQLv4shViQXi_@gitlab.nanobyte.cz/tools/nanobyte_tera.git", branch = "master" }
 | 
				
			||||||
 | 
					ovlach_tera = { git = "https://glpat-_yPuXbEzECyk3FaHudCN:glpat-_yPuXbEzECyk3FaHudCN@gitlab.nanobyte.cz/ondrej/ovlach_tera.git", branch = "master" }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					use nanobyte_tera::{hosts::static_filter, l18n::translate_filter, date::{calculate_age, get_year}, string::insert_space_every, gravatar::gravatar_link};
 | 
				
			||||||
 | 
					use ovlach_tera::entity::lang_entity;
 | 
				
			||||||
use rocket::{*, fairing::AdHoc};
 | 
					use rocket::{*, fairing::AdHoc};
 | 
				
			||||||
use rocket_dyn_templates::Template;
 | 
					use rocket_dyn_templates::Template;
 | 
				
			||||||
use ::serde::Deserialize;
 | 
					use ::serde::Deserialize;
 | 
				
			||||||
use tools::tera::{static_filter, translate_filter, calculate_age, insert_space_every, lang_entity, gravatar_link, format_date};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub mod routes;
 | 
					pub mod routes;
 | 
				
			||||||
pub mod services;
 | 
					pub mod services;
 | 
				
			||||||
@ -36,7 +37,8 @@ pub fn rocket_builder() -> Rocket<Build> {
 | 
				
			|||||||
            engines.tera.register_filter("gravatar_link", gravatar_link);
 | 
					            engines.tera.register_filter("gravatar_link", gravatar_link);
 | 
				
			||||||
            // filters specific to API
 | 
					            // filters specific to API
 | 
				
			||||||
            engines.tera.register_filter("lang_entity", lang_entity);
 | 
					            engines.tera.register_filter("lang_entity", lang_entity);
 | 
				
			||||||
            engines.tera.register_filter("format_date", format_date);
 | 
					            engines.tera.register_filter("format_date", get_year); // deprecated
 | 
				
			||||||
 | 
					            engines.tera.register_filter("get_year", get_year);
 | 
				
			||||||
            Ok(())
 | 
					            Ok(())
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
    ).attach(
 | 
					    ).attach(
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,2 @@
 | 
				
			|||||||
pub mod tera;
 | 
					 | 
				
			||||||
pub mod rocket;
 | 
					pub mod rocket;
 | 
				
			||||||
pub mod lang;
 | 
					pub mod lang;
 | 
				
			||||||
@ -1,143 +0,0 @@
 | 
				
			|||||||
use std::{collections::HashMap, str::FromStr};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use chrono::{Utc, Datelike, NaiveDate};
 | 
					 | 
				
			||||||
use log::{error, debug};
 | 
					 | 
				
			||||||
use rocket_dyn_templates::tera::{Value, Error};
 | 
					 | 
				
			||||||
use ovlach_data::cv::chrono::from_string;
 | 
					 | 
				
			||||||
use sha256::digest;
 | 
					 | 
				
			||||||
use fluent_resmgr::resource_manager::ResourceManager;
 | 
					 | 
				
			||||||
use unic_langid::LanguageIdentifier;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use crate::tools::lang::get_lang_name_from_code;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// TODO: tenhle modul je trochu prasacky..
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn static_filter(
 | 
					 | 
				
			||||||
    value: &Value,
 | 
					 | 
				
			||||||
    args: &HashMap<String, rocket_dyn_templates::tera::Value>
 | 
					 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					 | 
				
			||||||
    let host = args.get("static_host");
 | 
					 | 
				
			||||||
    return Ok(rocket_dyn_templates::tera::Value::String(format!("{}/{}", host.unwrap().as_str().unwrap(), value.as_str().unwrap()))); // TODO: fix-me here!
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn translate_filter(
 | 
					 | 
				
			||||||
    value: &Value,
 | 
					 | 
				
			||||||
    args: &HashMap<String, rocket_dyn_templates::tera::Value>
 | 
					 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					 | 
				
			||||||
    // TODO: prepis me!
 | 
					 | 
				
			||||||
    let mgr = ResourceManager::new("./resources/{locale}/{res_id}".into());
 | 
					 | 
				
			||||||
    let lang = args["lang"].as_str().unwrap();
 | 
					 | 
				
			||||||
    let locales = vec![LanguageIdentifier::from_str(lang).unwrap()];
 | 
					 | 
				
			||||||
    let val = value.as_str().unwrap().to_string();
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    let bundle = mgr.get_bundle(locales, vec!["ovlach_frontend".to_string()]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let mut errors = vec![];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    match bundle.get_message(&val) {
 | 
					 | 
				
			||||||
        Some(msg) => {
 | 
					 | 
				
			||||||
            match msg.value() {
 | 
					 | 
				
			||||||
                Some(pattern) => {
 | 
					 | 
				
			||||||
                    let output = bundle.format_pattern(pattern, None, &mut errors);
 | 
					 | 
				
			||||||
                    return Ok(rocket_dyn_templates::tera::Value::String(output.clone().to_string()))
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                None => {
 | 
					 | 
				
			||||||
                    error!("Can't translate message: {}", val);
 | 
					 | 
				
			||||||
                    return Ok(rocket_dyn_templates::tera::Value::String(format!("{}", val)));
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        None =>  {
 | 
					 | 
				
			||||||
            error!("Can't translate message: {}", val);
 | 
					 | 
				
			||||||
            return Ok(rocket_dyn_templates::tera::Value::String(format!("{}", val)));
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn lang_entity(
 | 
					 | 
				
			||||||
    value: &Value,
 | 
					 | 
				
			||||||
    attrs: &HashMap<String, rocket_dyn_templates::tera::Value>
 | 
					 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					 | 
				
			||||||
    // TODO: rewrite me!
 | 
					 | 
				
			||||||
    let chosen_lang = attrs["lang"].as_str().unwrap();
 | 
					 | 
				
			||||||
    let output_value = match value.as_object().unwrap().get(get_lang_name_from_code(chosen_lang)) {
 | 
					 | 
				
			||||||
        Some(value) => value.as_str().unwrap(),
 | 
					 | 
				
			||||||
        None => value["en"].as_str().unwrap(), // TODO: default
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    return Ok(rocket_dyn_templates::tera::Value::String(output_value.to_string())); // TODO: fix-me here!
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn gravatar_link(
 | 
					 | 
				
			||||||
    value: &Value,
 | 
					 | 
				
			||||||
    _: &HashMap<String, rocket_dyn_templates::tera::Value>
 | 
					 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					 | 
				
			||||||
    let val = digest(value.as_str().unwrap());
 | 
					 | 
				
			||||||
    return Ok(rocket_dyn_templates::tera::Value::String(format!("https://gravatar.com/avatar/{}", val))); // TODO: fix-me here!
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn format_date(
 | 
					 | 
				
			||||||
    value: &Value,
 | 
					 | 
				
			||||||
    _: &HashMap<String, rocket_dyn_templates::tera::Value>
 | 
					 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    if value.is_null() {
 | 
					 | 
				
			||||||
        return Ok(rocket_dyn_templates::tera::Value::String("".to_string()))
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    let val = value.as_str().unwrap();
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    if val == "" {
 | 
					 | 
				
			||||||
        return Ok(rocket_dyn_templates::tera::Value::String("".to_string()))
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    let value =  from_string(value.as_str().unwrap().into());
 | 
					 | 
				
			||||||
    match value {
 | 
					 | 
				
			||||||
        Ok(date) => Ok(rocket_dyn_templates::tera::Value::String(date.format("%Y").to_string())),
 | 
					 | 
				
			||||||
        Err(e) => {
 | 
					 | 
				
			||||||
                error!("Can't parse date: {}", e);
 | 
					 | 
				
			||||||
                return Ok(rocket_dyn_templates::tera::Value::String("".to_string())) // TOdo: error
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn insert_space_every(
 | 
					 | 
				
			||||||
        value: &Value,
 | 
					 | 
				
			||||||
        args: &HashMap<String, rocket_dyn_templates::tera::Value>
 | 
					 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					 | 
				
			||||||
    let input = value.as_u64().unwrap().to_string();
 | 
					 | 
				
			||||||
    let times = args.get("times").unwrap().as_u64().unwrap();
 | 
					 | 
				
			||||||
    let mut result = String::new();
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    for (index, ch) in input.chars().enumerate() {
 | 
					 | 
				
			||||||
        if index > 0 && index as u64 % times == 0 {
 | 
					 | 
				
			||||||
            result.push(' ');
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        result.push(ch);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Ok(rocket_dyn_templates::tera::Value::String(result))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn calculate_age(
 | 
					 | 
				
			||||||
    value: &Value,
 | 
					 | 
				
			||||||
    _: &HashMap<String, rocket_dyn_templates::tera::Value>
 | 
					 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					 | 
				
			||||||
    //let s = value.to_string().trim_matches('"'); // TODO: unwrap here!
 | 
					 | 
				
			||||||
    let value =  from_string(value.as_str().unwrap().into());
 | 
					 | 
				
			||||||
    match value {
 | 
					 | 
				
			||||||
        Ok(value) => {
 | 
					 | 
				
			||||||
            let current_date = Utc::now().naive_utc().date();
 | 
					 | 
				
			||||||
            let mut age = current_date.year() - value.year();
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
            // Adjust age if the birthday hasn't occurred yet this year
 | 
					 | 
				
			||||||
            age = if current_date.month() < value.month() || 
 | 
					 | 
				
			||||||
               (current_date.month() == value.month() && current_date.day() < value.day()) {
 | 
					 | 
				
			||||||
                age - 1
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                age
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            Ok(rocket_dyn_templates::tera::Value::String(age.to_string()))
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        Err(e) => panic!("Can't parse date: {}", e)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -178,7 +178,7 @@
 | 
				
			|||||||
          <div class="text-muted text-small mb-3">{{ education.from | format_date(type="job") }} - {{ education.to | format_date(type="job") }}</div>
 | 
					          <div class="text-muted text-small mb-3">{{ education.from | format_date(type="job") }} - {{ education.to | format_date(type="job") }}</div>
 | 
				
			||||||
          <div>{{ education.description | lang_entity(lang=lang) }}</div>
 | 
					          <div>{{ education.description | lang_entity(lang=lang) }}</div>
 | 
				
			||||||
        {% else %}
 | 
					        {% else %}
 | 
				
			||||||
           2011 - 2013
 | 
					          {{ education.from | format_date(type="job") }}
 | 
				
			||||||
        {% endif %}
 | 
					        {% endif %}
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user