diff --git a/.gitignore b/.gitignore index e6e21e7..27e2613 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,4 @@ *.swp perf.data perf.data.old -tex/ Cargo.lock diff --git a/Cargo.toml b/Cargo.toml index a8f4e70..05cfe95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,4 +22,3 @@ debug = true members = ["jxl_headers_derive"] [features] -tex = ["jxl_headers_derive/tex"] diff --git a/jxl_headers_derive/src/lib.rs b/jxl_headers_derive/src/lib.rs index 3493bc8..2a414fd 100644 --- a/jxl_headers_derive/src/lib.rs +++ b/jxl_headers_derive/src/lib.rs @@ -11,12 +11,6 @@ use proc_macro_error::{abort, proc_macro_error}; use quote::quote; use syn::{parse_macro_input, DeriveInput}; -#[cfg(feature = "tex")] -use std::fs; - -#[cfg(feature = "tex")] -const THIN_LINE: &str = " \\noalign{\\color{gray!50}\\hrule height 0.1pt}\n"; - fn get_bits(expr_call: &syn::ExprCall) -> syn::Expr { if let syn::Expr::Path(ep) = &*expr_call.func { if !ep.path.is_ident("Bits") { @@ -179,30 +173,6 @@ fn prettify_coder(coder: &syn::Expr) -> String { (quote! {#coder}).to_string() } -#[cfg(feature = "tex")] -fn prettify_type(ty: &syn::Type) -> (String, String) { - let mut ret = (quote! {#ty}).to_string().replace(' ', ""); - if ret.starts_with("Option<") { - ret = ret[7..ret.len() - 1].to_owned(); - } - if ret.starts_with("Vec<") { - ret = ret[4..ret.len() - 1].to_owned(); - } - let ret_href = ret.replace("[", "_").replace("]", "_").replace(";", "_"); - (ret_href, ret) -} - -#[cfg(feature = "tex")] -fn prettify_default(d: String, ty: &str) -> String { - d.replace(&(ty.to_owned() + " :: default()"), "") - .replace(" :: ", "::") -} - -#[cfg(feature = "tex")] -fn minted(x: &str) -> String { - "\\mintinline[breaklines]{rust}{".to_owned() + x + "}" -} - #[derive(Debug)] struct Condition { expr: Option, @@ -561,158 +531,8 @@ impl Field { } } } - - #[cfg(feature = "tex")] - fn texify_coder_and_cond( - cond: Option<&str>, - coder: &Coder, - dfl: Option<&str>, - ident: &str, - add_row: &mut F, - ) where - F: FnMut(Option<&str>, &str, Option<&str>, &str), - { - match &coder { - Coder::WithoutConfig(ty) => { - let (href_ty, ty) = prettify_type(ty); - add_row( - cond.as_deref(), - &("\\hyperref[hdr:".to_owned() + &href_ty + "]{" + &minted(&ty) + "}"), - dfl.as_deref(), - ident, - ); - } - Coder::U32(U32 { coder: _, pretty }) => { - add_row(cond.as_deref(), &minted(pretty), dfl.as_deref(), ident); - } - Coder::Select( - Condition { - expr: _, - has_all_default: _, - pretty: condition, - }, - U32 { - coder: _, - pretty: coder_true, - }, - U32 { - coder: _, - pretty: coder_false, - }, - ) => { - let cond_true = if let Some(c) = &cond { - "(".to_owned() + condition + ") && (" + c + ")" - } else { - condition.clone() - }; - let cond_false = if let Some(c) = &cond { - "!(".to_owned() + condition + ") && (" + c + ")" - } else { - "!(".to_owned() + condition + ")" - }; - add_row(Some(&cond_true), &minted(coder_true), dfl.as_deref(), ident); - add_row( - Some(&cond_false), - &minted(coder_false), - dfl.as_deref(), - ident, - ); - } - Coder::Vector(size_coder, value_coder) => { - Field::texify_coder_and_cond( - cond, - &Coder::U32((*size_coder).clone()), - Some("0"), - &("num_".to_owned() + ident), - add_row, - ); - Field::texify_coder_and_cond( - Some(&("0..num_".to_owned() + ident)), - &**value_coder, - dfl, - ident, - add_row, - ); - } - }; - } - - #[cfg(feature = "tex")] - fn texify(&self, mut row: usize) -> String { - let ident = &self.name; - let ident = "e! {#ident}.to_string(); - let (coder, condition) = match &self.kind { - FieldKind::Unconditional(coder) => (coder, None), - FieldKind::Conditional(condition, coder) => (coder, Some(&condition.pretty)), - FieldKind::Defaulted(condition, coder) => (coder, Some(&condition.pretty)), - }; - let mut ret = String::new(); - let mut add_row = |cond: Option<&str>, coder: &str, dfl: Option<&str>, ident: &str| { - if row != 0 { - ret += THIN_LINE; - } - row += 1; - ret += &format!( - " {} & {} & {} & {} \\\\\n", - minted(cond.unwrap_or("")), - coder, - minted(dfl.unwrap_or("")), - minted(ident) - ); - }; - let default = self.default.as_ref().map(|d| quote! { #d }.to_string()); - let default = match &coder { - Coder::WithoutConfig(ty) => { - let ty = prettify_type(ty).1; - default.map(|d| prettify_default(d, &ty)) - } - Coder::Vector(_, _) if self.default_element.is_some() => { - Some(self.default_element.as_ref().unwrap().to_string()) - } - _ => default, - }; - - Field::texify_coder_and_cond( - condition.map(String::as_str), - coder, - default.as_deref(), - ident, - &mut add_row, - ); - ret - } } -#[cfg(feature = "tex")] -fn texify(name: &str, fields: &[Field]) { - let mut table = String::new(); - table += &format!( - "\\begin{{table}}[h]\n \\caption{{{} bundle. \\label{{hdr:{}}}}}\n", - name, name - ); - table += r#" - \centering - \begin{tabular}{>{\centering\arraybackslash}m{0.27\textwidth}>{\centering\arraybackslash}m{0.3\textwidth}>{\centering\arraybackslash}m{0.1\textwidth}>{\centering\arraybackslash}m{0.27\textwidth}} - \toprule - \bf condition & \bf type & \bf default & \bf name \\ - \midrule -"#; - for (i, f) in fields.iter().enumerate() { - table += &f.texify(i); - } - table += r#" - \bottomrule - \end{tabular} -\end{table}"#; - // TODO(veluca93): this may be problematic. - fs::create_dir_all("tex").unwrap(); - let fname = format!("tex/{}.tex", name.to_owned()); - fs::write(fname, table).unwrap(); -} - -#[cfg(not(feature = "tex"))] -fn texify(_: &str, _: &[Field]) {} - fn derive_struct(input: DeriveInput) -> TokenStream2 { let name = &input.ident; @@ -796,8 +616,6 @@ fn derive_struct(input: DeriveInput) -> TokenStream2 { false => quote! {}, }; - texify("e! {#name}.to_string(), &fields); - quote! { #impl_default impl crate::headers::encodings::UnconditionalCoder<()> for #name { @@ -820,62 +638,7 @@ fn derive_struct(input: DeriveInput) -> TokenStream2 { } } -#[cfg(feature = "tex")] -fn texify_enum(input: &DeriveInput) { - let name = &input.ident; - let name = "e! {#name}.to_string(); - let mut table = String::new(); - table += &format!( - "\\begin{{table}}[h]\n \\caption{{{} enum. \\label{{hdr:{}}}}}\n", - name, name - ); - table += r#" - \centering - \begin{tabular}{cc} - \toprule - \bf name & \bf value \\ - \midrule -"#; - let data = if let syn::Data::Enum(enum_data) = &input.data { - enum_data - } else { - abort!(input, "derive_enum didn't get a enum"); - }; - let mut last_variant = -1; - for (row, var) in data.variants.iter().enumerate() { - let ident = &var.ident; - let discr = &var.discriminant; - let n = quote! {#ident}.to_string(); - let discr = if let Some((_, d)) = discr { - (quote! {#d}).to_string().parse::().unwrap() - } else { - last_variant + 1 - }; - last_variant = discr; - if row != 0 { - table += THIN_LINE; - } - table += &format!( - " {} & {} \\\\\n", - &minted(&n), - &minted(&discr.to_string()) - ); - } - table += r#" - \bottomrule - \end{tabular} -\end{table}"#; - // TODO(veluca93): this may be problematic. - fs::create_dir_all("tex").unwrap(); - let fname = format!("tex/{}.tex", name.to_owned()); - fs::write(fname, table).unwrap(); -} - -#[cfg(not(feature = "tex"))] -fn texify_enum(_: &DeriveInput) {} - fn derive_enum(input: DeriveInput) -> TokenStream2 { - texify_enum(&input); let name = &input.ident; quote! { impl crate::headers::encodings::UnconditionalCoder for #name { diff --git a/make_all_tex.sh b/make_all_tex.sh deleted file mode 100755 index e08ff2f..0000000 --- a/make_all_tex.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# Copyright (c) the JPEG XL Project Authors. All rights reserved. -# -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - - -rm -rf tex/all -mkdir -p tex/all/ - -cat > tex/all/main.tex << EOF -\documentclass[9pt]{article} -\usepackage{array} -\usepackage[colorlinks,linkcolor=blue]{hyperref} -\usepackage{fullpage} -\usepackage{minted} -\usepackage{booktabs} - -\\begin{document} -EOF - -for i in $(ls tex/*.tex) -do - echo "\\input{../$(basename $i)}" >> tex/all/main.tex -done - -echo "\end{document}" >> tex/all/main.tex - -cd tex/all -latexmk -pdf --shell-escape main