1
0
mirror of https://github.com/alecthomas/chroma.git synced 2025-03-19 21:10:15 +02:00

56 Commits

Author SHA1 Message Date
Siavash Askari Nasr
d18e8a46f2 Add InlineCode option for inline code blocks
- Add an `InlineCode` option for inline code blocks
- When `PreventSurroundingPre` option is enabled, do not wrap the code by `Line` and `CodeLine`
- Write and update related tests
2022-06-14 21:17:50 +10:00
Siavash Askari Nasr
530c45d213 Don't append semicolon to styleEntry if there is no other style
This means we also need to append semicolon to `Background`.
2022-06-14 15:34:02 +10:00
Siavash Askari Nasr
5397b4880b Append semicolon to tabWidthStyle. 2022-06-14 15:34:02 +10:00
Siavash Askari Nasr
c78b8a6a03 Fix extra semicolon in tabWidthStyle
Needed after changes in #636
2022-06-14 07:16:12 +10:00
Siavash Askari Nasr
dea6a13339 Add CSS style inheritance to WithCustomCSS option 2022-05-18 02:45:33 -07:00
Siavash Askari Nasr
7d779408db [html formatter] Add option to let users provide custom CSS styles
Example: WithCustomCSS(map[chroma.TokenType]string{chroma.Line: `display: inline;`})
2022-05-18 02:45:33 -07:00
Alec Thomas
cc2dd5b8ad Version 2 of Chroma
This cleans up the API in general, removing a bunch of deprecated stuff,
cleaning up circular imports, etc.

But the biggest change is switching to an optional XML format for the
regex lexer.

Having lexers defined only in Go is not ideal for a couple of reasons.
Firstly, it impedes a significant portion of contributors who use Chroma
in Hugo, but don't know Go. Secondly, it bloats the binary size of any
project that imports Chroma.

Why XML? YAML is an abomination and JSON is not human editable. XML
also compresses very well (eg. Go template lexer XML compresses from
3239 bytes to 718).

Why a new syntax format? All major existing formats rely on the
Oniguruma regex engine, which is extremely complex and for which there
is no Go port.

Why not earlier? Prior to the existence of fs.FS this was not a viable
option.

Benchmarks:

    $ hyperfine --warmup 3 \
        './chroma.master --version' \
        './chroma.xml-pre-opt --version' \
        './chroma.xml --version'
    Benchmark 1: ./chroma.master --version
      Time (mean ± σ):       5.3 ms ±   0.5 ms    [User: 3.6 ms, System: 1.4 ms]
      Range (min … max):     4.2 ms …   6.6 ms    233 runs

    Benchmark 2: ./chroma.xml-pre-opt --version
      Time (mean ± σ):      50.6 ms ±   0.5 ms    [User: 52.4 ms, System: 3.6 ms]
      Range (min … max):    49.2 ms …  51.5 ms    51 runs

    Benchmark 3: ./chroma.xml --version
      Time (mean ± σ):       6.9 ms ±   1.1 ms    [User: 5.1 ms, System: 1.5 ms]
      Range (min … max):     5.7 ms …  19.9 ms    196 runs

    Summary
      './chroma.master --version' ran
        1.30 ± 0.23 times faster than './chroma.xml --version'
        9.56 ± 0.83 times faster than './chroma.xml-pre-opt --version'

A slight increase in init time, but I think this is okay given the
increase in flexibility.

And binary size difference:

    $ du -h lexers.test*
    $ du -sh chroma*                                                                                                                                                                                                                                                                                                                                                                                                                                                             951371ms
    8.8M	chroma.master
    7.8M	chroma.xml
    7.8M	chroma.xml-pre-opt

Benchmarks:

    $ hyperfine --warmup 3 \
        './chroma.master --version' \
        './chroma.xml-pre-opt --version' \
        './chroma.xml --version'
    Benchmark 1: ./chroma.master --version
      Time (mean ± σ):       5.3 ms ±   0.5 ms    [User: 3.6 ms, System: 1.4 ms]
      Range (min … max):     4.2 ms …   6.6 ms    233 runs

    Benchmark 2: ./chroma.xml-pre-opt --version
      Time (mean ± σ):      50.6 ms ±   0.5 ms    [User: 52.4 ms, System: 3.6 ms]
      Range (min … max):    49.2 ms …  51.5 ms    51 runs

    Benchmark 3: ./chroma.xml --version
      Time (mean ± σ):       6.9 ms ±   1.1 ms    [User: 5.1 ms, System: 1.5 ms]
      Range (min … max):     5.7 ms …  19.9 ms    196 runs

    Summary
      './chroma.master --version' ran
        1.30 ± 0.23 times faster than './chroma.xml --version'
        9.56 ± 0.83 times faster than './chroma.xml-pre-opt --version'

Incompatible changes:

- (*RegexLexer).SetAnalyser: changed from func(func(text string) float32) *RegexLexer to func(func(text string) float32) Lexer
- (*TokenType).UnmarshalJSON: removed
- Lexer.AnalyseText: added
- Lexer.SetAnalyser: added
- Lexer.SetRegistry: added
- MustNewLazyLexer: removed
- MustNewLexer: changed from func(*Config, Rules) *RegexLexer to func(*Config, func() Rules) *RegexLexer
- Mutators: changed from func(...Mutator) MutatorFunc to func(...Mutator) Mutator
- NewLazyLexer: removed
- NewLexer: changed from func(*Config, Rules) (*RegexLexer, error) to func(*Config, func() Rules) (*RegexLexer, error)
- Pop: changed from func(int) MutatorFunc to func(int) Mutator
- Push: changed from func(...string) MutatorFunc to func(...string) Mutator
- TokenType.MarshalJSON: removed
- Using: changed from func(Lexer) Emitter to func(string) Emitter
- UsingByGroup: changed from func(func(string) Lexer, int, int, ...Emitter) Emitter to func(int, int, ...Emitter) Emitter
2022-01-27 15:22:00 +11:00
Siavash Askari Nasr
d6e61d3cbe Use span for .line, put code inside <code>
Apparently only "phrasing content" are permitted inside `pre` and
`code`, and `div` is not one of them, so replace it with `span`, `div`
wasn't necessary anyway.

Also it makes sense to put code inside `code` tag(except for line
numbers).

Removed `overflow:auto` and `width: auto` as they didn't seem to be
necessary and actually prevented horizontal scroll bar to appear when content
didn't fit in the viewport.
2021-11-10 19:52:49 +11:00
Siavash Askari Nasr
5ed5054d73 Put lines in a div & code lines in a span, Add WrapLongLines Option 2021-11-09 19:14:33 +11:00
rhymes
c8581d47ee Add tabindex="0" to default <pre> wrapper 2021-05-24 07:16:54 +10:00
Alvaro Aleman
ab61726cdb Make linkeable lines a link to themselves
Currently its already possible to make line lumbers linkeable. Getting
such a link however requires the end user to look at the pages source
and then to manually edit the URL, which is not a great UX.

This PR changes that to make the line numbers a link to themselves, so
clicking on them gives a link to that line that can then be passed
around, similiar to e.G. GitHub.
2020-11-03 21:31:04 +11:00
Cameron Little
809ff9ba45 Don't emit styles that are missing a class 2020-05-09 22:56:49 +10:00
Alec Thomas
cc53faa932 Add option to preserve all HTML classes.
Fixes #346.
2020-04-13 07:36:37 +10:00
Pablo Santiago Blum de Aguiar
9e22bd6e2f Consider baseLineNumber when calculating the column width 2020-01-10 08:23:54 +11:00
Alexandru Băluț
19d5ee688c Highlight the line number targeted by the URL anchor
This currently works only when `html.WithClasses(true)` is used.
The same colors as for the pre-highlighted lines are used.
Only the line number is highlighted, so difficult to notice, but
better than nothing.
2019-12-31 11:10:38 +11:00
Alexandru Băluț
a41c89767d Add the option of making the line numbers linkable 2019-12-12 17:31:43 -08:00
Bjørn Erik Pedersen
5921c52787 Add bool argument to WithClasses, WithLineNumbers etc.
This allows the boolean options to be reconfigured, e.g:

```go
options := getOptions()
options = append(options, html.WithLineNumbers(true))
```

Fixes #301
2019-11-22 10:13:00 +11:00
Bjørn Erik Pedersen
d3926cc0e1 Add WithPreWrapper option 2019-11-20 20:09:17 +11:00
Alec Thomas
bbc59ac372 Emit error tokens when there's a group mismatch.
Also don't panic/recover, as we no longer use panic to report "real"
errors.

Fixes #295.
2019-10-24 17:03:35 +11:00
Alec Thomas
e6a56651ad Add width:100% to content <td> when inlining styles.
Fixes #225.
2019-07-20 23:19:20 +10:00
Alec Thomas
da5ac60d8c Add golangci-lint and fix all lint issues. 2018-12-31 22:46:59 +11:00
Alec Thomas
2a59c2c77e Synthesise meta style-entries on demand.
This includes line highlighting, numbers, etc.

Fixes #211.
2018-12-31 11:33:36 +11:00
Alec Thomas
69c9a262c3 Expose Colour.BrightenOrDarken (useful for #211). 2018-12-31 10:48:45 +11:00
Randall C. O'Reilly
a4f179974b move SplitTokensIntoLines into chroma/iterator.go, fixes issue #190 2018-11-08 16:21:45 +11:00
Daniel Eloff
9c3abeae1d Tokens by value (#187)
This results in about a 8% improvement in speed.
2018-11-04 10:22:51 +11:00
Felix Knischewski
e36baa268a Add option to prevent surroundign pre tags 2018-09-18 19:44:44 +10:00
Kaushal Modi
371820dad6 Assign .gl class to GenericUnderline; add CSS rules for the same
'l' in gl is for under(l)ine, as the "gu" class is taken by
GenericSubheading.

- Rules for GenericUnderline are added to all the styles
- Make "Underline" style insert "text-decoration: underline" in CSS.

Fixes https://github.com/alecthomas/chroma/issues/159.
2018-08-01 17:28:52 -04:00
John Millikin
aaa96c6984 Avoid adding an HTML prefix to empty class names.
This makes the raw markup a bit cleaner when there's lots of `Text`
tokens.
2018-02-25 19:46:48 +11:00
John Millikin
d7ee3c10b0 Add newlines in line number spans when wrapping in an HTML table.
Since these are wrapped in a `<pre>`, newlines hint the browser that the
line numbers should be on separate lines. This helps when rendering
content with broken CSS, or in a text-only browser.
2018-02-25 17:52:15 +11:00
John Millikin
df4ec264da Render HTML class prefixes. 2018-02-18 14:58:46 +11:00
Alec Thomas
e4cd1649a3 Ensure that HTML code column expands to full width of container.
Fixes #114.
2018-02-11 21:14:56 +11:00
MunifTanjim
03fd03809c fix func compressStyle(s string) for CSS Shorthand properties 2018-02-11 19:10:59 +11:00
Denis Brodbeck
c9f612c194 Fix broken css rules output
Strip leading semicolons in combination with line numbers.

fixes #98
2017-12-11 21:20:14 -08:00
Bjørn Erik Pedersen
02c4adc066 Add a chroma class wrapper when in "table mode" (#63)
This commits adds a div wrapper when linenumbers are formatted in table, to get the correct CSS matchers.

This commit also fixes some CSS table issues when tables are put into a larger context with other stylesheets:

* No borders.
* Overflow to fit in potentially narrower containers.

Fixes #62
2017-10-14 20:02:40 +11:00
Depado
4a55aefee6 Adding HasClasses method for HTML formatter (#61)
* Adding HasClasses method for HTML formatter

* Removing helper function and simply export the field
2017-10-14 08:41:40 +11:00
Bjørn Erik Pedersen
27733ac753 Add table styled line numbers (#54)
Fixes #52
2017-10-13 10:49:20 +11:00
Alec Thomas
0e0960930d Don't output trailing \n for HTML-only fragment.
See #47.
2017-09-30 14:45:37 +10:00
Alec Thomas
33f604c892 Always use CSS class from StandardTypes.
As opposed to remapping to classes that exist in the current style.
2017-09-27 22:05:47 +10:00
Alec Thomas
80d3b96869 Ensure class names from default set exist. 2017-09-27 22:01:03 +10:00
Alec Thomas
bdc1124369 Switch to Pygments-style CSS class names.
Add GitHub theme + CSS to style importer.
2017-09-25 21:46:25 +10:00
Alec Thomas
b0295f66bd Remove spurious newline in HTML output.
Fixes #29.
2017-09-25 15:25:32 +10:00
Alec Thomas
c984ca45c7 Add html.BaseLineNumber(n).
Fixes #22.
2017-09-24 20:33:50 +10:00
Alec Thomas
1af7e1a0bc Adjust line number padding a bit. 2017-09-23 22:45:05 +10:00
Alec Thomas
d5083b3f7c Big changes to the style and colour APIs.
- Styles now use a builder system, to enforce immutability of styles.
- Corrected and cleaned up how style inheritance works.
- Added a brightening function to colours
- HTML formatter will now automatically pick line and highlight colours
  if they are not provided in the style. This is done by slightly
  darkening or lightening.

Fixes #21.
2017-09-23 22:09:46 +10:00
Alec Thomas
1724aab879 Implement compile-time lexer mutators.
This should fix #15.
2017-09-21 20:02:53 +10:00
Alec Thomas
e2d6abaa64 Document and add iterator panic recovery. 2017-09-20 23:06:23 +10:00
Alec Thomas
cc0e4a59ab Switch to an Iterator interface.
This is to solve an issue where writers returned by the Formatter
were often stateful, but this fact was not obvious to the API consumer,
and failed in interesting ways.
2017-09-20 22:19:36 +10:00
Alec Thomas
3f941ddff4 Correctly add styles for line numbers and line highlights when inling.
Fixes #7. Fixes #9.
2017-09-20 20:32:15 +10:00
Alec Thomas
a5637e60b2 Support for highlighting ranges of lines. 2017-09-20 14:24:49 +10:00
Alec Thomas
3f230ec717 Add support for line numbers. 2017-09-20 13:33:44 +10:00