From 5b7bb3c070f0af7435e481d05fa9e3a8befa2c82 Mon Sep 17 00:00:00 2001 From: Kovacsics Robert Date: Sat, 5 Apr 2025 21:11:08 +0100 Subject: [PATCH 1/3] Auto-fix whitespace --- src/lib.typ | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/lib.typ b/src/lib.typ index 6881d36..0bcb08f 100644 --- a/src/lib.typ +++ b/src/lib.typ @@ -51,7 +51,7 @@ /// ``` /// /// - offset (int): the offset to apply to the code block -/// +/// /// -> content #let codly-offset(offset: 0) = { (__codly-args.offset.update)(offset) @@ -71,7 +71,7 @@ /// /// - start (int): the start of the displayed range /// - end (none, int): the end of the displayed range, none for the rest of the block -/// +/// /// -> content #let codly-range( start, @@ -98,7 +98,7 @@ /// ``` /// Hello, world! /// ``` -/// +/// /// -> content #let codly-disable() = { (__codly-args.enabled.update)(false) @@ -121,7 +121,7 @@ /// ``` /// Hello, world! /// ``` -/// +/// /// -> content #let codly-enable() = { (__codly-args.enabled.update)(true) @@ -139,7 +139,7 @@ /// #no-codly(``` /// Hello, world! /// ```) -/// +/// /// -> content #let no-codly(body) = { (__codly-args.enabled.update)(false) @@ -160,7 +160,7 @@ /// #yes-codly(``` /// Hello, world! /// ```) -/// +/// /// -> content #let yes-codly(body) = { (__codly-args.enabled.update)(true) @@ -175,10 +175,10 @@ /// Hello, world! /// Goodbye, world! /// ``` -/// +/// /// - position (int): the line at which to insert the skip /// - length (int): the number of lines the skip is long -/// +/// /// -> content #let codly-skip( position, @@ -974,7 +974,7 @@ skips.sorted(key: x => x.at(0)).dedup() } } - + let highlighted-lines = ( __codly-args.highlighted-lines.type_check )(if "highlighted-lines" in extra { @@ -993,7 +993,7 @@ let highlighted-by-line = () if highlighted-lines == none { - + } else if type(highlighted-lines) == array { if highlighted-lines.len() > 0 { let ix = 1 @@ -1004,7 +1004,7 @@ assert(l.len() == 2, message: "codly: a highlighted line definition must be an integer or an array of two elements: the line, and the highlight color (array length mismatch)") let ln = l.at(0) assert(type(ln) == int, message: "codly: the type of a `highlighted-lines` line must be either an integer, found: " + str(type(ln))); - + let col = l.at(1) assert( type(col) == color or type(col) == gradient or type(col) == pattern, @@ -1423,7 +1423,7 @@ let smart-skip-enabled = if type(smart-skip) == bool { smart-skip } else { - smart-skip.values().any((v) => v) + smart-skip.values().any((v) => v) } let in-skip = false @@ -1457,7 +1457,7 @@ // Try and look for a skip let skip = skips.at(0, default: none) if skip != none and line.number == skip.at(0) { - if numbers-format != none { + if numbers-format != none { items.push(skip-number) } @@ -1469,7 +1469,7 @@ } else if smart-skip-enabled and not in_range(ranges, line.number) and not in-skip { if in-first { if smart-skip-top { - if numbers-format != none { + if numbers-format != none { items.push(skip-number) } items.push(skip-line) @@ -1477,7 +1477,7 @@ } } else if array.range(line.number, line.count).any((i) => in_range(ranges, i)) { if smart-skip-rest { - if numbers-format != none { + if numbers-format != none { items.push(skip-number) } items.push(skip-line) @@ -1485,7 +1485,7 @@ } } else { if smart-skip-bot { - if numbers-format != none { + if numbers-format != none { items.push(skip-number) } items.push(skip-line) @@ -1530,7 +1530,7 @@ // Must be done before the smart indentation code. // Otherwise it results in two paragraphs. if numbers-format != none { - items.push(numbers-format(line.number + offset)) + items.push(numbers-format(line.number + offset)) } let annot = none @@ -1568,7 +1568,7 @@ annot-content, ) } - + if had-first or ( display-names != true and display-icons != true ) { @@ -1695,7 +1695,7 @@ type(zebra-color) != color and zebra-color != none ) ) - + let width_lines_number = calc.max(2, (calc.ceil(calc.log(it.lines.len())) + 1)) * 1em let line_colors = () @@ -1748,7 +1748,7 @@ (auto, 1fr) }, inset: padding.pairs().map(((k, x)) => (k, x * 1.5)).to-dict(), - stroke: (x,y) => + stroke: (x,y) => if numbers-outside { let idx_end = if has-annotations { 2 @@ -1770,7 +1770,7 @@ none } else { (x, y) => if numbers-outside and x == 0 { - none + none } else { line_colors.at(y, default: fill) } @@ -1801,9 +1801,9 @@ } }, ) - + block_content - + figure( kind: "__codly-end-block", supplement: none, @@ -1868,9 +1868,9 @@ /// ```typ /// #show: codly-init /// ``` -/// +/// /// - body (content): the body of the document -/// +/// /// -> content #let codly-init( body, From 9d2d579a1a683da3db09390d43a61519529b29e3 Mon Sep 17 00:00:00 2001 From: Kovacsics Robert Date: Sat, 5 Apr 2025 21:12:23 +0100 Subject: [PATCH 2/3] Fix highlight-inset not taking effect --- src/lib.typ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.typ b/src/lib.typ index 0bcb08f..4810d90 100644 --- a/src/lib.typ +++ b/src/lib.typ @@ -710,7 +710,7 @@ )(if "highlight-inset" in extra { extra.highlight-inset } else { - state("highlight-inset", __codly-args.highlight-inset.default).get() + state("codly-highlight-inset", __codly-args.highlight-inset.default).get() }); show raw.line.where(label: ): codly-line.with( From 77944dc87cf3291b44dae132e16e27539fe7ff1a Mon Sep 17 00:00:00 2001 From: Kovacsics Robert Date: Sat, 5 Apr 2025 23:08:24 +0100 Subject: [PATCH 3/3] Update test for highlight-align --- tests/issues/22-highlight-align.typ | 38 +++++++++++++++++++++++++--- tests/issues/ref/1.png | Bin 6850 -> 9002 bytes 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/tests/issues/22-highlight-align.typ b/tests/issues/22-highlight-align.typ index 8351963..538a5f7 100644 --- a/tests/issues/22-highlight-align.typ +++ b/tests/issues/22-highlight-align.typ @@ -3,9 +3,39 @@ #set page(width: 300pt, height: auto) #show: codly-init.with() -#codly(highlight-inset: (x: 0pt, y: 0.32em)) +#codly( + display-icon: false, + display-name: false, +) + +#grid(columns: 3)[ #codly(highlights: ((line: 2, start: 0, end: none), )) ```kotlin -private val n = 0 -private val n = 0 -``` \ No newline at end of file +val n = 0 +val n = 0 +``` +][ + #codly(highlights: ((line: 1, start: 0, end: none), )) + #local( + highlight-inset: 0em, + highlight-outset: 0.32em, + highlight-clip: true, + )[ + ```kotlin +val n = 0 +val n = 0 + ``` + ] +][ + #codly(highlights: ((line: 2, start: 0, end: none), )) + #local( + highlight-inset: 0em, + highlight-outset: 0.32em, + highlight-clip: true, + )[ + ```kotlin +val n = 0 +val n = 0 + ``` + ] +] diff --git a/tests/issues/ref/1.png b/tests/issues/ref/1.png index 2cbb6b3442158c013a25d4e60b10b857d95aa825..540ead5b96c8b199fe129705670bf2b2c130504b 100644 GIT binary patch literal 9002 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 Vg_{tF