diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-11-03 11:44:53 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-11-03 13:35:39 +0100 |
| commit | 37a7afddfaffd44cb9bc013c9506599267e08983 (patch) | |
| tree | 20e7d62d3c5418baff01a21d0406b91bf3096214 /library/src/lib.rs | |
| parent | 56342bd972a13ffe21beaf2b87ab7eb1597704b4 (diff) | |
Split crates
Diffstat (limited to 'library/src/lib.rs')
| -rw-r--r-- | library/src/lib.rs | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/library/src/lib.rs b/library/src/lib.rs new file mode 100644 index 00000000..ed332a06 --- /dev/null +++ b/library/src/lib.rs @@ -0,0 +1,191 @@ +//! Typst's standard library. + +pub mod graphics; +pub mod layout; +pub mod math; +pub mod prelude; +pub mod structure; +pub mod text; +pub mod utility; + +mod ext; + +use typst::geom::{Align, Color, Dir, GenAlign}; +use typst::model::{LangItems, Node, Scope, StyleMap}; + +use self::layout::Layout; + +/// Construct the standard library scope. +pub fn scope() -> Scope { + let mut std = Scope::new(); + + // Text. + std.def_node::<text::SpaceNode>("space"); + std.def_node::<text::LinebreakNode>("linebreak"); + std.def_node::<text::SmartQuoteNode>("smartquote"); + std.def_node::<text::TextNode>("text"); + std.def_node::<text::ParNode>("par"); + std.def_node::<text::ParbreakNode>("parbreak"); + std.def_node::<text::StrongNode>("strong"); + std.def_node::<text::EmphNode>("emph"); + std.def_node::<text::RawNode>("raw"); + std.def_node::<text::UnderlineNode>("underline"); + std.def_node::<text::StrikethroughNode>("strike"); + std.def_node::<text::OverlineNode>("overline"); + std.def_node::<text::SuperNode>("super"); + std.def_node::<text::SubNode>("sub"); + std.def_node::<text::LinkNode>("link"); + std.def_node::<text::RepeatNode>("repeat"); + std.def_fn("lower", text::lower); + std.def_fn("upper", text::upper); + std.def_fn("smallcaps", text::smallcaps); + + // Structure. + std.def_node::<structure::RefNode>("ref"); + std.def_node::<structure::HeadingNode>("heading"); + std.def_node::<structure::ListNode>("list"); + std.def_node::<structure::EnumNode>("enum"); + std.def_node::<structure::DescNode>("desc"); + std.def_node::<structure::TableNode>("table"); + + // Layout. + std.def_node::<layout::PageNode>("page"); + std.def_node::<layout::PagebreakNode>("pagebreak"); + std.def_node::<layout::HNode>("h"); + std.def_node::<layout::VNode>("v"); + std.def_node::<layout::BoxNode>("box"); + std.def_node::<layout::BlockNode>("block"); + std.def_node::<layout::AlignNode>("align"); + std.def_node::<layout::PadNode>("pad"); + std.def_node::<layout::StackNode>("stack"); + std.def_node::<layout::GridNode>("grid"); + std.def_node::<layout::ColumnsNode>("columns"); + std.def_node::<layout::ColbreakNode>("colbreak"); + std.def_node::<layout::PlaceNode>("place"); + std.def_node::<layout::MoveNode>("move"); + std.def_node::<layout::ScaleNode>("scale"); + std.def_node::<layout::RotateNode>("rotate"); + + // Graphics. + std.def_node::<graphics::ImageNode>("image"); + std.def_node::<graphics::LineNode>("line"); + std.def_node::<graphics::RectNode>("rect"); + std.def_node::<graphics::SquareNode>("square"); + std.def_node::<graphics::EllipseNode>("ellipse"); + std.def_node::<graphics::CircleNode>("circle"); + std.def_node::<graphics::HideNode>("hide"); + + // Math. + std.def_node::<math::MathNode>("math"); + std.define("sum", "∑"); + std.define("in", "∈"); + std.define("arrow", "→"); + std.define("NN", "ℕ"); + std.define("RR", "ℝ"); + + // Utility. + std.def_fn("type", utility::type_); + std.def_fn("assert", utility::assert); + std.def_fn("eval", utility::eval); + std.def_fn("int", utility::int); + std.def_fn("float", utility::float); + std.def_fn("abs", utility::abs); + std.def_fn("min", utility::min); + std.def_fn("max", utility::max); + std.def_fn("even", utility::even); + std.def_fn("odd", utility::odd); + std.def_fn("mod", utility::mod_); + std.def_fn("range", utility::range); + std.def_fn("luma", utility::luma); + std.def_fn("rgb", utility::rgb); + std.def_fn("cmyk", utility::cmyk); + std.def_fn("repr", utility::repr); + std.def_fn("str", utility::str); + std.def_fn("regex", utility::regex); + std.def_fn("letter", utility::letter); + std.def_fn("roman", utility::roman); + std.def_fn("symbol", utility::symbol); + std.def_fn("lorem", utility::lorem); + std.def_fn("csv", utility::csv); + std.def_fn("json", utility::json); + std.def_fn("xml", utility::xml); + + // Predefined colors. + std.define("black", Color::BLACK); + std.define("gray", Color::GRAY); + std.define("silver", Color::SILVER); + std.define("white", Color::WHITE); + std.define("navy", Color::NAVY); + std.define("blue", Color::BLUE); + std.define("aqua", Color::AQUA); + std.define("teal", Color::TEAL); + std.define("eastern", Color::EASTERN); + std.define("purple", Color::PURPLE); + std.define("fuchsia", Color::FUCHSIA); + std.define("maroon", Color::MAROON); + std.define("red", Color::RED); + std.define("orange", Color::ORANGE); + std.define("yellow", Color::YELLOW); + std.define("olive", Color::OLIVE); + std.define("green", Color::GREEN); + std.define("lime", Color::LIME); + + // Other constants. + std.define("ltr", Dir::LTR); + std.define("rtl", Dir::RTL); + std.define("ttb", Dir::TTB); + std.define("btt", Dir::BTT); + std.define("start", GenAlign::Start); + std.define("end", GenAlign::End); + std.define("left", GenAlign::Specific(Align::Left)); + std.define("center", GenAlign::Specific(Align::Center)); + std.define("right", GenAlign::Specific(Align::Right)); + std.define("top", GenAlign::Specific(Align::Top)); + std.define("horizon", GenAlign::Specific(Align::Horizon)); + std.define("bottom", GenAlign::Specific(Align::Bottom)); + + std +} + +/// Construct the standard style map. +pub fn styles() -> StyleMap { + StyleMap::new() +} + +/// Construct the standard lang item mapping. +pub fn items() -> LangItems { + LangItems { + root: |world, content| content.layout(world), + em: |styles| styles.get(text::TextNode::SIZE), + dir: |styles| styles.get(text::TextNode::DIR), + space: || text::SpaceNode.pack(), + linebreak: |justify| text::LinebreakNode { justify }.pack(), + text: |text| text::TextNode(text).pack(), + smart_quote: |double| text::SmartQuoteNode { double }.pack(), + parbreak: || text::ParbreakNode.pack(), + strong: |body| text::StrongNode(body).pack(), + emph: |body| text::EmphNode(body).pack(), + raw: |text, lang, block| { + let content = text::RawNode { text, block }.pack(); + match lang { + Some(_) => content.styled(text::RawNode::LANG, lang), + None => content, + } + }, + link: |url| text::LinkNode::from_url(url).pack(), + ref_: |target| structure::RefNode(target).pack(), + heading: |level, body| structure::HeadingNode { level, body }.pack(), + list_item: |body| structure::ListItem::List(Box::new(body)).pack(), + enum_item: |number, body| { + structure::ListItem::Enum(number, Box::new(body)).pack() + }, + desc_item: |term, body| { + structure::ListItem::Desc(Box::new(structure::DescItem { term, body })).pack() + }, + math: |children, display| math::MathNode { children, display }.pack(), + math_atom: |atom| math::AtomNode(atom).pack(), + math_script: |base, sub, sup| math::ScriptNode { base, sub, sup }.pack(), + math_frac: |num, denom| math::FracNode { num, denom }.pack(), + math_align: |count| math::AlignNode(count).pack(), + } +} |
