diff options
| author | Xe Iaso <me@christine.website> | 2022-09-20 21:05:44 -0400 |
|---|---|---|
| committer | Xe Iaso <me@christine.website> | 2022-09-20 21:05:44 -0400 |
| commit | 67005bc59dd918eadcbd9c7c9285aed0c3422292 (patch) | |
| tree | de54bbad6aa651d4e56517af56a6773f02766fcf | |
| parent | 839c44e535d03f8ae747139acd27109e897c76e4 (diff) | |
| download | xesite-67005bc59dd918eadcbd9c7c9285aed0c3422292.tar.xz xesite-67005bc59dd918eadcbd9c7c9285aed0c3422292.zip | |
move markdown and templates into a dedicated crate
This does not move the ructe templates around, only the newer Maud ones.
The only template I can't move easily is the salary history one, but I
should get rid of that anyways.
| -rw-r--r-- | Cargo.lock | 25 | ||||
| -rw-r--r-- | Cargo.toml | 4 | ||||
| -rw-r--r-- | blog/my-career-in-dates-titles-salaries-2019-03-14.markdown | 13 | ||||
| -rw-r--r-- | lib/jsonfeed/src/item.rs | 1 | ||||
| -rw-r--r-- | lib/xesite_markdown/Cargo.toml | 18 | ||||
| -rw-r--r-- | lib/xesite_markdown/src/lib.rs (renamed from src/app/markdown.rs) | 34 | ||||
| -rw-r--r-- | lib/xesite_templates/Cargo.toml | 9 | ||||
| -rw-r--r-- | lib/xesite_templates/src/lib.rs | 91 | ||||
| -rw-r--r-- | src/app/mod.rs | 3 | ||||
| -rw-r--r-- | src/main.rs | 3 | ||||
| -rw-r--r-- | src/post/mod.rs | 2 | ||||
| -rw-r--r-- | src/tmpl/mod.rs | 92 | ||||
| -rw-r--r-- | src/tmpl/nag.rs | 2 | ||||
| -rw-r--r-- | templates/salary_transparency.rs.html | 52 |
14 files changed, 209 insertions, 140 deletions
@@ -3246,7 +3246,6 @@ dependencies = [ "cfcache", "chrono", "color-eyre", - "comrak", "derive_more", "dirs", "envy", @@ -3260,7 +3259,6 @@ dependencies = [ "kankyo", "lazy_static", "log", - "lol_html", "maud", "mi", "mime", @@ -3289,11 +3287,34 @@ dependencies = [ "url", "uuid 0.8.2", "xe_jsonfeed", + "xesite_markdown", + "xesite_templates", "xesite_types", "xml-rs", ] [[package]] +name = "xesite_markdown" +version = "0.1.0" +dependencies = [ + "color-eyre", + "comrak", + "lazy_static", + "lol_html", + "maud", + "tracing", + "url", + "xesite_templates", +] + +[[package]] +name = "xesite_templates" +version = "0.1.0" +dependencies = [ + "maud", +] + +[[package]] name = "xesite_types" version = "0.1.0" dependencies = [ @@ -15,7 +15,6 @@ axum-macros = "0.2" axum-extra = "0.3" color-eyre = "0.6" chrono = "0.4" -comrak = "0.14.0" derive_more = "0.99" dirs = "4" envy = "0.4" @@ -28,7 +27,6 @@ hyper = "0.14" kankyo = "0.3" lazy_static = "1.4" log = "0.4" -lol_html = "0.3" maud = { version = "0.23.0", features = ["axum"] } mime = "0.3.0" prometheus = { version = "0.13", default-features = false, features = ["process"] } @@ -56,6 +54,8 @@ cfcache = { path = "./lib/cfcache" } xe_jsonfeed = { path = "./lib/jsonfeed" } mi = { path = "./lib/mi" } patreon = { path = "./lib/patreon" } +xesite_markdown = { path = "./lib/xesite_markdown" } +xesite_templates = { path = "./lib/xesite_templates" } [dependencies.tower] version = "0.4" diff --git a/blog/my-career-in-dates-titles-salaries-2019-03-14.markdown b/blog/my-career-in-dates-titles-salaries-2019-03-14.markdown index 97548ea..27b648c 100644 --- a/blog/my-career-in-dates-titles-salaries-2019-03-14.markdown +++ b/blog/my-career-in-dates-titles-salaries-2019-03-14.markdown @@ -32,7 +32,11 @@ might not want. The following table is a history of my software career by title, date and salary (company names are omitted). -<xeblog-salary-history></xeblog-salary-history> +<xeblog-conv name="Cadey" mood="coffee">While modernizing part of my site and +lifting common code into crates, I was no longer able to embed this data into +this page itself. This page has a better home [here](/salary-transparency). +Sorry for this, I had no other option. +</xeblog-conv> Even though I've been fired three times, I don't regret my career as it's been thus far. I've been able to work on experimental technology integrating into @@ -49,7 +53,8 @@ like with the company that hired me over the border. [Fear stops you. Nothing prevents you.](https://twitter.com/theprincessxena/status/1106119712025382912?s=21) -Please go out and try, Creator. Go for your larger dreams of success. Inaction is a lot easier to regret than action is. +Please go out and try, Creator. Go for your larger dreams of success. Inaction +is a lot easier to regret than action is. Be well. @@ -67,6 +72,6 @@ Be well. If you can, please make a blogpost similar to this. Don't include company names. Include start date, end date, time spent there, time spent job hunting, salary -(if you remember it) and how you left it. Let's [end salary -secrecy](https://thegirlpowercode.com/2018/09/12/is-salary-secrecy-coming-to-an-end/) +(if you remember it) and how you left it. Let's +[end salary secrecy](https://thegirlpowercode.com/2018/09/12/is-salary-secrecy-coming-to-an-end/) one step at a time. diff --git a/lib/jsonfeed/src/item.rs b/lib/jsonfeed/src/item.rs index 7b5d734..3b308cb 100644 --- a/lib/jsonfeed/src/item.rs +++ b/lib/jsonfeed/src/item.rs @@ -1,4 +1,3 @@ -use std::collections::HashMap; use std::default::Default; use std::fmt; diff --git a/lib/xesite_markdown/Cargo.toml b/lib/xesite_markdown/Cargo.toml new file mode 100644 index 0000000..b05ca75 --- /dev/null +++ b/lib/xesite_markdown/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "xesite_markdown" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +color-eyre = "0.6" +comrak = "0.14.0" +lazy_static = "1.4" +lol_html = "0.3" +maud = "0.23.0" +tracing = "0.1" +url = "2" + +# local deps +xesite_templates = { path = "../xesite_templates" }
\ No newline at end of file diff --git a/src/app/markdown.rs b/lib/xesite_markdown/src/lib.rs index 9c3266e..882278b 100644 --- a/src/app/markdown.rs +++ b/lib/xesite_markdown/src/lib.rs @@ -1,5 +1,3 @@ -use crate::app::Config; -use crate::templates::Html; use color_eyre::eyre::{Result, WrapErr}; use comrak::nodes::{Ast, AstNode, NodeValue}; use comrak::plugins::syntect::SyntectAdapter; @@ -9,15 +7,15 @@ use comrak::{ }; use lazy_static::lazy_static; use lol_html::{element, html_content::ContentType, rewrite_str, RewriteStrSettings}; -use std::cell::RefCell; -use std::sync::Arc; +use maud::PreEscaped; +use std::{cell::RefCell, io::Write}; use url::Url; lazy_static! { static ref SYNTECT_ADAPTER: SyntectAdapter<'static> = SyntectAdapter::new("base16-mocha.dark"); } -pub fn render(cfg: Arc<Config>, inp: &str) -> Result<String> { +pub fn render(inp: &str) -> Result<String> { let mut options = ComrakOptions::default(); options.extension.autolink = true; @@ -58,7 +56,16 @@ pub fn render(cfg: Arc<Config>, inp: &str) -> Result<String> { let name = u.host_str().unwrap_or("Mara"); let mut html = vec![]; - crate::templates::mara(&mut html, mood, name, Html(message.trim().into()))?; + write!( + html, + "{}", + xesite_templates::conv( + name.to_string(), + mood.to_string(), + PreEscaped(message.trim().into()) + ) + .0 + )?; let new_node = arena.alloc(AstNode::new(RefCell::new(Ast::new( NodeValue::HtmlInline(html), @@ -100,35 +107,30 @@ pub fn render(cfg: Arc<Config>, inp: &str) -> Result<String> { }), element!("xeblog-picture", |el| { let path = el.get_attribute("path").expect("wanted xeblog-picture to contain path"); - el.replace(&crate::tmpl::xeblog_picture(path).0, ContentType::Html); + el.replace(&xesite_templates::picture(path).0, ContentType::Html); Ok(()) }), element!("xeblog-hero", |el| { let file = el.get_attribute("file").expect("wanted xeblog-hero to contain file"); - el.replace(&crate::tmpl::xeblog_hero(file, el.get_attribute("prompt"), el.get_attribute("ai")).0, ContentType::Html); - Ok(()) - }), - element!("xeblog-salary-history", |el| { - el.replace(&crate::tmpl::xeblog_salary_history(cfg.clone()).0, ContentType::Html); - + el.replace(&xesite_templates::hero(file, el.get_attribute("prompt"), el.get_attribute("ai")).0, ContentType::Html); Ok(()) }), element!("xeblog-sticker", |el| { let name = el.get_attribute("name").expect("wanted xeblog-sticker to contain name"); let mood = el.get_attribute("mood").expect("wanted xeblog-sticker to contain mood"); - el.replace(&crate::tmpl::xeblog_sticker(name, mood).0, ContentType::Html); + el.replace(&xesite_templates::sticker(name, mood).0, ContentType::Html); Ok(()) }), element!("xeblog-slide", |el| { let name = el.get_attribute("name").expect("wanted xeblog-slide to contain name"); let essential = el.get_attribute("essential").is_some(); - el.replace(&crate::tmpl::xeblog_slide(name, essential).0, ContentType::Html); + el.replace(&xesite_templates::slide(name, essential).0, ContentType::Html); Ok(()) }), element!("xeblog-talk-warning", |el| { - el.replace(&crate::tmpl::xeblog_talk_warning().0, ContentType::Html); + el.replace(&xesite_templates::talk_warning().0, ContentType::Html); Ok(()) }), ], diff --git a/lib/xesite_templates/Cargo.toml b/lib/xesite_templates/Cargo.toml new file mode 100644 index 0000000..06ab92d --- /dev/null +++ b/lib/xesite_templates/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "xesite_templates" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +maud = "0.23.0"
\ No newline at end of file diff --git a/lib/xesite_templates/src/lib.rs b/lib/xesite_templates/src/lib.rs new file mode 100644 index 0000000..0a8ff1d --- /dev/null +++ b/lib/xesite_templates/src/lib.rs @@ -0,0 +1,91 @@ +use maud::{html, Markup}; + +pub fn talk_warning() -> Markup { + html! { + div.warning { + (conv("Cadey".to_string(), "coffee".to_string(), html!{ + "So you are aware: you are reading the written version of a conference talk. This is written in a different style that is more lighthearted, conversational and different than the content normally on this blog. The words being said are the verbatim words that were spoken at the conference. The slides are the literal slides for each spoken utterance. If you want to hide the non-essential slides, please install this userstyle: " + a href="/css/no-fun-allowed.user.css" {code {"No fun allowed"}} + ". If this isn't enough, please edit it to also hide this CSS class: " + code { "xeblog-slides-essential" } + ". Doing this may make the presentation page harder to understand." + })) + } + } +} + +pub fn slide(name: String, essential: bool) -> Markup { + html! { + div.hero.{@if essential {("xeblog-slides-essential")} @else {("xeblog-slides-fluff")}} { + picture style="margin:0" { + source type="image/avif" srcset={"https://cdn.xeiaso.net/file/christine-static/talks/" (name) ".avif"}; + source type="image/webp" srcset={"https://cdn.xeiaso.net/file/christine-static/talks/" (name) ".webp"}; + img style="padding:0" loading="lazy" src={"https://cdn.xeiaso.net/file/christine-static/talks/" (name) "-smol.png"}; + } + } + } +} + +pub fn picture(path: String) -> Markup { + html! { + picture style="margin:0" { + source type="image/avif" srcset={"https://cdn.xeiaso.net/file/christine-static/" (path) ".avif"}; + source type="image/webp" srcset={"https://cdn.xeiaso.net/file/christine-static/" (path) ".webp"}; + img style="padding:0" loading="lazy" alt={"hero image " (path)} src={"https://cdn.xeiaso.net/file/christine-static/" (path) "-smol.png"}; + } + } +} + +pub fn hero(file: String, prompt: Option<String>, ai: Option<String>) -> Markup { + let ai = ai.unwrap_or("MidJourney".to_string()); + html! { + meta property="og:image" content={"https://cdn.xeiaso.net/file/christine-static/hero/" (file) "-smol.png"} + figure.hero style="margin:0" { + picture style="margin:0" { + source type="image/avif" srcset={"https://cdn.xeiaso.net/file/christine-static/hero/" (file) ".avif"}; + source type="image/webp" srcset={"https://cdn.xeiaso.net/file/christine-static/hero/" (file) ".webp"}; + img style="padding:0" loading="lazy" alt={"hero image " (file)} src={"https://cdn.xeiaso.net/file/christine-static/hero/" (file) "-smol.png"}; + } + figcaption { + "Image generated by " + (ai) + @if let Some(prompt) = prompt { " -- " (prompt) } + } + } + } +} + +pub fn conv(name: String, mood: String, body: Markup) -> Markup { + let name_lower = name.clone().to_lowercase(); + + html! { + .conversation { + ."conversation-picture"."conversation-smol" { + picture { + source type="image/avif" srcset={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".avif"}; + source type="image/webp" srcset={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".webp"}; + img alt={(name) " is " (mood)} loading="lazy" src={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".png"}; + } + } + ."conversation-chat" { + "<" + b { (name) } + "> " + (body) + } + } + } +} + +pub fn sticker(name: String, mood: String) -> Markup { + let name_lower = name.to_lowercase(); + html! { + center { + picture { + source type="image/avif" srcset={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".avif"}; + source type="image/webp" srcset={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".webp"}; + img alt={(name) " is " (mood)} src={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".png"}; + } + } + } +} diff --git a/src/app/mod.rs b/src/app/mod.rs index 5b8e719..9a331a4 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -5,7 +5,6 @@ use std::{fs, path::PathBuf, sync::Arc}; use tracing::{error, instrument}; pub mod config; -pub mod markdown; pub mod poke; pub use config::*; @@ -64,7 +63,7 @@ pub async fn init(cfg: PathBuf) -> Result<State> { let cfg: Arc<Config> = Arc::new(serde_dhall::from_file(cfg).parse()?); let sb = cfg.signalboost.clone(); let resume = fs::read_to_string(cfg.clone().resume_fname.clone())?; - let resume: String = markdown::render(cfg.clone(), &resume)?; + let resume: String = xesite_markdown::render(&resume)?; let mi = mi::Client::new( cfg.clone().mi_token.clone(), crate::APPLICATION_NAME.to_string(), diff --git a/src/main.rs b/src/main.rs index cdcae68..1df4a02 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,7 +12,6 @@ use axum::{ use color_eyre::eyre::Result; use hyper::StatusCode; use prometheus::{Encoder, TextEncoder}; -use sdnotify::SdNotify; use std::{ env, io, net::{IpAddr, SocketAddr}, @@ -214,6 +213,8 @@ async fn main() -> Result<()> { #[cfg(target_os = "linux")] { + use sdnotify::SdNotify; + match SdNotify::from_env() { Ok(ref mut n) => { // shitty heuristic for detecting if we're running in prod diff --git a/src/post/mod.rs b/src/post/mod.rs index 5c2ed2d..263471d 100644 --- a/src/post/mod.rs +++ b/src/post/mod.rs @@ -103,7 +103,7 @@ async fn read_post( let date = NaiveDate::parse_from_str(&front_matter.clone().date, "%Y-%m-%d") .map_err(|why| eyre!("error parsing date in {:?}: {}", fname, why))?; let link = format!("{}/{}", dir, fname.file_stem().unwrap().to_str().unwrap()); - let body_html = crate::app::markdown::render(cfg.clone(), &body) + let body_html = xesite_markdown::render(&body) .wrap_err_with(|| format!("can't parse markdown for {:?}", fname))?; let date: DateTime<FixedOffset> = DateTime::<Utc>::from_utc(NaiveDateTime::new(date, NaiveTime::from_hms(0, 0, 0)), Utc) diff --git a/src/tmpl/mod.rs b/src/tmpl/mod.rs index ec7ccd5..b2ffd0d 100644 --- a/src/tmpl/mod.rs +++ b/src/tmpl/mod.rs @@ -4,7 +4,7 @@ use std::sync::Arc; pub mod nag; -pub fn xeblog_salary_history(cfg: Arc<Config>) -> Markup { +pub fn salary_history(cfg: Arc<Config>) -> Markup { html! { table.salary_history { tr { @@ -21,93 +21,3 @@ pub fn xeblog_salary_history(cfg: Arc<Config>) -> Markup { } } } - -pub fn xeblog_talk_warning() -> Markup { - html! { - div.warning { - (xeblog_conv("Cadey".to_string(), "coffee".to_string(), html!{ - "So you are aware: you are reading the written version of a conference talk. This is written in a different style that is more lighthearted, conversational and different than the content normally on this blog. The words being said are the verbatim words that were spoken at the conference. The slides are the literal slides for each spoken utterance. If you want to hide the non-essential slides, please install this userstyle: " - a href="/css/no-fun-allowed.user.css" {code {"No fun allowed"}} - ". If this isn't enough, please edit it to also hide this CSS class: " - code { "xeblog-slides-essential" } - ". Doing this may make the presentation page harder to understand." - })) - } - } -} - -pub fn xeblog_slide(name: String, essential: bool) -> Markup { - html! { - div.hero.{@if essential {("xeblog-slides-essential")} @else {("xeblog-slides-fluff")}} { - picture style="margin:0" { - source type="image/avif" srcset={"https://cdn.xeiaso.net/file/christine-static/talks/" (name) ".avif"}; - source type="image/webp" srcset={"https://cdn.xeiaso.net/file/christine-static/talks/" (name) ".webp"}; - img style="padding:0" loading="lazy" src={"https://cdn.xeiaso.net/file/christine-static/talks/" (name) "-smol.png"}; - } - } - } -} - -pub fn xeblog_picture(path: String) -> Markup { - html! { - picture style="margin:0" { - source type="image/avif" srcset={"https://cdn.xeiaso.net/file/christine-static/" (path) ".avif"}; - source type="image/webp" srcset={"https://cdn.xeiaso.net/file/christine-static/" (path) ".webp"}; - img style="padding:0" loading="lazy" alt={"hero image " (path)} src={"https://cdn.xeiaso.net/file/christine-static/" (path) "-smol.png"}; - } - } -} - -pub fn xeblog_hero(file: String, prompt: Option<String>, ai: Option<String>) -> Markup { - let ai = ai.unwrap_or("MidJourney".to_string()); - html! { - meta property="og:image" content={"https://cdn.xeiaso.net/file/christine-static/hero/" (file) "-smol.png"} - figure.hero style="margin:0" { - picture style="margin:0" { - source type="image/avif" srcset={"https://cdn.xeiaso.net/file/christine-static/hero/" (file) ".avif"}; - source type="image/webp" srcset={"https://cdn.xeiaso.net/file/christine-static/hero/" (file) ".webp"}; - img style="padding:0" loading="lazy" alt={"hero image " (file)} src={"https://cdn.xeiaso.net/file/christine-static/hero/" (file) "-smol.png"}; - } - figcaption { - "Image generated by " - (ai) - @if let Some(prompt) = prompt { " -- " (prompt) } - } - } - } -} - -pub fn xeblog_conv(name: String, mood: String, body: Markup) -> Markup { - let name_lower = name.clone().to_lowercase(); - - html! { - .conversation { - ."conversation-picture"."conversation-smol" { - picture { - source type="image/avif" srcset={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".avif"}; - source type="image/webp" srcset={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".webp"}; - img alt={(name) " is " (mood)} loading="lazy" src={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".png"}; - } - } - ."conversation-chat" { - "<" - b { (name) } - "> " - (body) - } - } - } -} - -pub fn xeblog_sticker(name: String, mood: String) -> Markup { - let name_lower = name.to_lowercase(); - html! { - center { - picture { - source type="image/avif" srcset={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".avif"}; - source type="image/webp" srcset={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".webp"}; - img alt={(name) " is " (mood)} src={"https://cdn.xeiaso.net/file/christine-static/stickers/" (name_lower) "/" (mood) ".png"}; - } - } - } -} diff --git a/src/tmpl/nag.rs b/src/tmpl/nag.rs index a41447b..4ba165e 100644 --- a/src/tmpl/nag.rs +++ b/src/tmpl/nag.rs @@ -1,9 +1,9 @@ -use super::xeblog_conv; use crate::post::Post; use chrono::prelude::*; use lazy_static::lazy_static; use maud::{html, Markup}; use regex::Regex; +use xesite_templates::conv as xeblog_conv; lazy_static! { static ref HN: Regex = Regex::new(r#"^https?://news.ycombinator.com"#).unwrap(); diff --git a/templates/salary_transparency.rs.html b/templates/salary_transparency.rs.html index 609f2d5..787f0e4 100644 --- a/templates/salary_transparency.rs.html +++ b/templates/salary_transparency.rs.html @@ -1,35 +1,49 @@ @use super::{header_html, footer_html}; -@use crate::{app::Config, tmpl::xeblog_salary_history}; +@use crate::{app::Config, tmpl::salary_history}; @use std::sync::Arc; @(cfg: Arc<Config>) -@:header_html(Some("Salary Transparency"), None) + @:header_html(Some("Salary Transparency"), None) -<h1>Salary Transparency</h1> + <h1>Salary Transparency</h1> -<p>This page lists my salary for every job I've had in tech. I have had this data open to the public <a href="https://xeiaso.net/blog/my-career-in-dates-titles-salaries-2019-03-14">for years</a>, but I feel this should be more prominently displayed on my website. Other people have copied my approach of having a list of every salary they have ever been payed on their websites, and I would like to set the example by making it prominent on my website.</p> + <p>This page lists my salary for every job I've had in tech. I have had this data open to the public <a + href="https://xeiaso.net/blog/my-career-in-dates-titles-salaries-2019-03-14">for years</a>, but I feel this + should be more prominently displayed on my website. Other people have copied my approach of having a list of + every salary they have ever been payed on their websites, and I would like to set the example by making it + prominent on my website.</p> -<p>As someone who has seen pay discrimination work in action first-hand, data is one of the ways that we can end this pointless hiding of information that leads to people being uninformed and hurt by their lack of knowledge. By laying my hand out in the open like this, I hope to ensure that people are better informed about how much money they <i>can</i> make, so that they can be paid equally for equal work.</p> + <p>As someone who has seen pay discrimination work in action first-hand, data is one of the ways that we can end + this pointless hiding of information that leads to people being uninformed and hurt by their lack of knowledge. + By laying my hand out in the open like this, I hope to ensure that people are better informed about how much + money they <i>can</i> make, so that they can be paid equally for equal work.</p> -<h2>Salary Data</h2> + <h2>Salary Data</h2> -<p>To get this data, I have scoured over past emails, contracts and everything so that I can be sure that this information is as accurate as possible. The data on this page intentionally omits employer names.</p> + <p>To get this data, I have scoured over past emails, contracts and everything so that I can be sure that this + information is as accurate as possible. The data on this page intentionally omits employer names.</p> -<p>Raw data (including employer names) is available at <code>/api/salary_transparency.json</code>. The JSON format is not stable. Do not treat it as such. I reserve the right to change the formatting or semantics of the JSON format at any time without warning. The raw data is in <code>/dhall/jobHistory.dhall</code> in my site's git repository.</p> + <p>Raw data (including employer names) is available at <code>/api/salary_transparency.json</code>. The JSON format + is not stable. Do not treat it as such. I reserve the right to change the formatting or semantics of the JSON + format at any time without warning. The raw data is in <code>/dhall/jobHistory.dhall</code> in my site's git + repository.</p> -@Html(xeblog_salary_history(cfg.clone()).0) + @Html(salary_history(cfg.clone()).0) -<p>I typically update this page once any of the following things happens:</p> + <p>I typically update this page once any of the following things happens:</p> -<ul> - <li>I quit a job.</li> - <li>I get a raise/title change at the same company.</li> - <li>I get terminated from a job.</li> - <li>I get converted from a contracter to a full-time employee.</li> - <li>Other unspecified extranormal events happen.</li> -</ul> + <ul> + <li>I quit a job.</li> + <li>I get a raise/title change at the same company.</li> + <li>I get terminated from a job.</li> + <li>I get converted from a contracter to a full-time employee.</li> + <li>Other unspecified extranormal events happen.</li> + </ul> -<p>Please consider publishing your salary data like this as well. By open, voluntary transparency we can help to end stigmas around discussing pay and help ensure that the next generations of people in tech are treated fairly. Stigmas thrive in darkness but die in the light of day. You can help end the stigma by playing your cards out in the open like this.</p> + <p>Please consider publishing your salary data like this as well. By open, voluntary transparency we can help to end + stigmas around discussing pay and help ensure that the next generations of people in tech are treated fairly. + Stigmas thrive in darkness but die in the light of day. You can help end the stigma by playing your cards out in + the open like this.</p> -@:footer_html() + @:footer_html()
\ No newline at end of file |
