From dcbb9f6279a4a2c3c057a1fafe233590ed1aecc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20d=27Herbais=20de=20Thun?= Date: Mon, 6 Nov 2023 18:05:07 +0100 Subject: [PATCH] codly:0.1.0 (#217) --- packages/preview/codly/0.1.0/LICENSE | 21 ++ packages/preview/codly/0.1.0/README.md | 133 ++++++++++ packages/preview/codly/0.1.0/codly.typ | 239 ++++++++++++++++++ packages/preview/codly/0.1.0/demo.png | Bin 0 -> 30539 bytes .../codly/0.1.0/example/brand-python.svg | 10 + .../codly/0.1.0/example/brand-rust.svg | 10 + packages/preview/codly/0.1.0/example/main.pdf | Bin 0 -> 35712 bytes packages/preview/codly/0.1.0/example/main.typ | 82 ++++++ packages/preview/codly/0.1.0/typst.toml | 11 + 9 files changed, 506 insertions(+) create mode 100644 packages/preview/codly/0.1.0/LICENSE create mode 100644 packages/preview/codly/0.1.0/README.md create mode 100644 packages/preview/codly/0.1.0/codly.typ create mode 100644 packages/preview/codly/0.1.0/demo.png create mode 100644 packages/preview/codly/0.1.0/example/brand-python.svg create mode 100644 packages/preview/codly/0.1.0/example/brand-rust.svg create mode 100644 packages/preview/codly/0.1.0/example/main.pdf create mode 100644 packages/preview/codly/0.1.0/example/main.typ create mode 100644 packages/preview/codly/0.1.0/typst.toml diff --git a/packages/preview/codly/0.1.0/LICENSE b/packages/preview/codly/0.1.0/LICENSE new file mode 100644 index 000000000..a5a5f2f23 --- /dev/null +++ b/packages/preview/codly/0.1.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) [2023] [slashformotion] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/preview/codly/0.1.0/README.md b/packages/preview/codly/0.1.0/README.md new file mode 100644 index 000000000..572fdee1e --- /dev/null +++ b/packages/preview/codly/0.1.0/README.md @@ -0,0 +1,133 @@ + +# Codly: simple and beautiful code blocks for Typst + +Codly is a package that lets you easily create beautiful code blocks for your Typst documents. +It uses the newly added [`raw.line`](https://typst.app/docs/reference/text/raw/#definitions-line) +function to work across all languages easily. You can customize the icons, colors, and more to +suit your document's theme. By default it has zebra striping, line numbers, for ease of reading. + +````typ +#let icon(codepoint) = { + box( + height: 0.8em, + baseline: 0.05em, + image(codepoint) + ) + h(0.1em) +} + +#show: codly-init.with() +#codly(languages: ( + rust: (name: "Rust", icon: icon("brand-python.svg"), color: rgb("#CE412B")), +)) + +```rust +pub fn main() { + println!("Hello, world!"); +} +``` +```` + +Which renders to: + +![Example](./demo.png) + +You can find all of the documentation in the [example](https://github.com/Dherse/codly/tree/main/example/main.typ) file. + +## Short manual + +### Setup + +To start using codly, you need to initialize codly using a show rule: + +```typ +#show: codly-init.with() +``` + +Then you need to congigure codly with your parameters: + +```typ +#codly( + languages: ( + rust: (name: "Rust", icon: icon("\u{fa53}"), color: rgb("#CE412B")), + ) +) +``` + +Then you just need to add a code block and it will be automatically displayed correctly: + +```` +```rust +pub fn main() { + println!("Hello, world!"); +} +``` +```` + +### Disabling + +To locally disable codly, you can just do the following, you can then later re-enable it using the `codly` configuration function. + +```typ +#disable-codly() +``` + +### Setting an offset + +If you wish to add an offset to your code block, but without selecting a subset of lines, you can use the `codly-offset` function: + +```typ +// Sets a 5 line offset +#codly-offset(5) +``` + +### Selecting a subset of lines + +If you wish to select a subset of lines, you can use the `codly-range` function. By setting the start to 1 and the end to `none` you can select all lines from the start to the end of the code block. + +```typ +#codly-range(start: 5, end: 10) +``` + +### Disabling line numbers + +You can configure this with the `codly` function: + +```typ +#codly( + width-numbers: none, +) +``` + +### Disabling zebra striping + +You disable zebra striping by setting the `zebra-color` to white. + +```typ +#codly( + zebra-color: white, +) +``` + +### Customize the stroke + +You can customize the stroke surrounding the figure using the `stroke-width` and `stroke-color` parameters of the `codly` function: + +```typ +#codly( + stroke-width: 1pt, + stroke-color: red, +) +``` + +### Misc + +You can also disable the icon, by setting the `display-icon` parameter to `false`: + +```typ +#codly( + display-icon: false, +) +``` + +Same with the name, whether the block is breakable, the radius, the padding, and the width of the numbers columns. \ No newline at end of file diff --git a/packages/preview/codly/0.1.0/codly.typ b/packages/preview/codly/0.1.0/codly.typ new file mode 100644 index 000000000..7814be9ee --- /dev/null +++ b/packages/preview/codly/0.1.0/codly.typ @@ -0,0 +1,239 @@ +// Lets you set a line number offset. +#let codly-offset(offset: 0) = { + state("codly-offset").update(offset) +} + +// Lets you set a range of line numbers to highlight. +#let codly-range( + start: 1, + end: none, +) = { + state("codly-range").update((start, end)) +} + +// Disables codly. +#let disable-codly() = { + state("codly-config").update(none) +} + +// Configures codly. +#let codly( + // The list of languages, allows setting a display name and an icon, + // it should be a dict of the form: + // `: (name: , icon: , color: )` + languages: (:), + + // Whether to display the language name. + display-name: true, + + // Whether to display the language icon. + display-icon: true, + + // The default color for a language not in the list. + // Only used if `display-icon` or `display-name` is `true`. + default-color: rgb("#283593"), + + // Radius of a code block. + radius: 0.32em, + + // Padding of a code block. + padding: 0.32em, + + // The zebra color to use or `none` to disable. + zebra-color: luma(240), + + // The stroke width to use to surround the code block. + // Set to `none` to disable. + stroke-width: 0.1em, + + // The stroke color to use to surround the code block. + stroke-color: luma(240), + + // The width of the numbers column. + // If set to `none`, the numbers column will be disabled. + width-numbers: 2em, + + // Whether this code block is breakable. + breakable: true, +) = locate(loc => { + let old = state("codly-config").at(loc); + if old == none { + state("codly-config").update(( + languages: languages, + display-name: display-name, + display-icon: display-icon, + default-color: default-color, + radius: radius, + padding: padding, + zebra-color: zebra-color, + stroke-width: stroke-width, + width-numbers: width-numbers, + breakable: breakable, + stroke-color: stroke-color, + )) + } else { + let folded_langs = old.languages; + for (lang, def) in languages { + folded_langs.insert(lang, def) + } + + state("codly-config").update(( + languages: folded_langs, + display-name: display-name, + display-icon: display-icon, + default-color: default-color, + radius: radius, + padding: padding, + zebra-color: zebra-color, + stroke-width: stroke-width, + width-numbers: width-numbers, + breakable: breakable, + stroke-color: stroke-color, + )) + } +}) + +#let codly-init( + body, +) = { + show raw.where(block: true): it => locate(loc => { + let config = state("codly-config").at(loc) + let range = state("codly-range").at(loc) + let in_range(line) = { + if range == none { + true + } else if range.at(1) == none { + line >= range.at(0) + } else { + line >= range.at(0) and line <= range.at(1) + } + } + if config == none { + return it + } + let language_block = if config.display-name == false and config.display-icon == false { + none + } else if it.lang == none { + none + } else if it.lang in config.languages { + let lang =config. languages.at(it.lang); + let content = if config.display-name == true and config.display-icon == true { + lang.icon + lang.name + } else if config.display-name == true { + lang.name + } else { + lang.icon + }; + + style(styles => { + let height = measure(content, styles).height + box( + radius: config.radius, + fill: lang.color.lighten(60%), + inset: config.padding, + height: height + config.padding * 2, + stroke: config.stroke-width + lang.color, + content, + ) + }) + } else { + if config.display-name == false { + style(styles => { + let height = measure(it.lang, styles).height + box( + radius: config.radius, + fill: config.default-color.lighten(60%), + inset: config.padding, + height: height + padding * 2, + stroke: config.stroke-width + config.default-color, + it.lang, + ) + }) + } else { + none + } + }; + + let offset = state("codly-offset").at(loc); + let start = if range == none { 1 } else { range.at(0) }; + let border(i, len) = { + let end = if range == none { len } else if range.at(1) == none { len } else { range.at(1) }; + + let stroke-width = if config.stroke-width == none { 0pt } else { config.stroke-width }; + let radii = (:) + let stroke = (x: config.stroke-color + stroke-width) + + if i == start { + radii.insert("top-left", config.radius) + radii.insert("top-right", config.radius) + stroke.insert("top", config.stroke-color + stroke-width) + } + + if i == end { + radii.insert("bottom-left", config.radius) + radii.insert("bottom-right", config.radius) + stroke.insert("bottom", config.stroke-color + stroke-width) + } + + radii.insert("rest", 0pt) + + (radius: radii, stroke: stroke) + } + + let width = if config.width-numbers == none { 0pt } else { config.width-numbers } + show raw.line: it => if not in_range(it.number) { + none + } else { + block( + width: 100%, + height: 1.2em + config.padding * 2, + inset: (left: config.padding + width, top: config.padding + 0.1em, rest: config.padding), + fill: if calc.rem(it.number, 2) == 0 { + config.zebra-color + } else { + white + }, + radius: border(it.number, it.count).radius, + stroke: border(it.number, it.count).stroke, + { + if it.number == start { + place( + top + right, + language_block, + dy: -config.padding * 0.66666, + dx: config.padding * 0.66666 - 0.1em, + ) + } + + set par(justify: false) + if config.width-numbers != none { + place( + top + left, + dx: -config.width-numbers, + [#(offset + it.number)] + ) + } + it + } + ) + } + + let stroke = if config.stroke-width == 0pt or config.stroke-width == none { + none + } else { + config.stroke-width + config.zebra-color + }; + + block( + breakable: config.breakable, + clip: false, + width: 100%, + stack(dir: ttb, ..it.lines) + ) + + codly-offset() + codly-range(start: 1, end: none) + }) + + body +} \ No newline at end of file diff --git a/packages/preview/codly/0.1.0/demo.png b/packages/preview/codly/0.1.0/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..ae7550b3f0f7b5b7a985e17ed9e2db6ca66cc5f1 GIT binary patch literal 30539 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 literal 0 HcmV?d00001 diff --git a/packages/preview/codly/0.1.0/example/brand-python.svg b/packages/preview/codly/0.1.0/example/brand-python.svg new file mode 100644 index 000000000..eb7b9657f --- /dev/null +++ b/packages/preview/codly/0.1.0/example/brand-python.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/preview/codly/0.1.0/example/brand-rust.svg b/packages/preview/codly/0.1.0/example/brand-rust.svg new file mode 100644 index 000000000..19ffb9843 --- /dev/null +++ b/packages/preview/codly/0.1.0/example/brand-rust.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/preview/codly/0.1.0/example/main.pdf b/packages/preview/codly/0.1.0/example/main.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d32129621bf03c021e6cfe3e8e805bfd9c58aa1b GIT binary patch literal 35712 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 literal 0 HcmV?d00001 diff --git a/packages/preview/codly/0.1.0/example/main.typ b/packages/preview/codly/0.1.0/example/main.typ new file mode 100644 index 000000000..e1ee9d962 --- /dev/null +++ b/packages/preview/codly/0.1.0/example/main.typ @@ -0,0 +1,82 @@ +#import "../codly.typ": * + +#show: codly-init.with() + +#let icon(codepoint) = { + box( + height: 0.8em, + baseline: 0.05em, + image(codepoint) + ) + h(0.1em) +} + +#codly(languages: ( + rust: (name: "Rust", icon: icon("brand-python.svg"), color: rgb("#CE412B")), + python: (name: "Python", icon: icon("brand-rust.svg"), color: rgb("#3572A5")), +)) + +```rust +pub fn main() { + println!("Hello, world!"); +} +``` + +```python +def fibonaci(n): + if n <= 1: + return n + else: + return(fibonaci(n-1) + fibonaci(n-2)) +``` + +We can also set a line number offset with `codly-offset(int)`: + +#codly-offset(offset: 1) +```rust + println!("Hello, world!"); +``` + +And we can also disable line numbers: + +#codly(width-numbers: none) + +```rust +pub fn main() { + println!("Hello, world!"); +} +``` + +We can also select only a range of lines to show: + +#codly-range(start: 5, end: 5) + +```python +def fibonaci(n): + if n <= 1: + return n + else: + return(fibonaci(n-1) + fibonaci(n-2)) +``` + +#codly( + stroke-width: 1pt, + stroke-color: red, +) + +```rust +pub fn main() { + println!("Hello, world!"); +} +``` + + +#codly( + display-icon: false, +) + +```rust +pub fn main() { + println!("Hello, world!"); +} +``` \ No newline at end of file diff --git a/packages/preview/codly/0.1.0/typst.toml b/packages/preview/codly/0.1.0/typst.toml new file mode 100644 index 000000000..bf221f8b1 --- /dev/null +++ b/packages/preview/codly/0.1.0/typst.toml @@ -0,0 +1,11 @@ +[package] +name = "codly" +version = "0.1.0" +entrypoint = "codly.typ" +authors = ["Dherse"] +license = "MIT" +description = "Codly is a beautiful code presentation template." +repository = "https://github.com/Dherse/codly" +exclude = ["example/*", "demo.png" ] +compiler = "0.9.0" +keywords = [ "code", "pretty", "template", "raw" ] \ No newline at end of file