diff --git a/README.md b/README.md
index d925655a0..ca58c5d9a 100644
--- a/README.md
+++ b/README.md
@@ -185,7 +185,7 @@ following constructor options:
- `ClassPrefix(prefix)` - prefix each generated CSS class.
- `TabWidth(width)` - Set the rendered tab width, in characters.
- `WithLineNumbers()` - Render line numbers (style with `LineNumbers`).
-- `LinkableLineNumbers()` - Make the line numbers linkable and be a link to themselves.
+- `WithLinkableLineNumbers()` - Make the line numbers linkable and be a link to themselves.
- `HighlightLines(ranges)` - Highlight lines in these ranges (style with `LineHighlight`).
- `LineNumbersInTable()` - Use a table for formatting line numbers and code, rather than spans.
diff --git a/bin/.stringer-0.1.11.pkg b/bin/.stringer-0.1.11.pkg
new file mode 120000
index 000000000..383f4511d
--- /dev/null
+++ b/bin/.stringer-0.1.11.pkg
@@ -0,0 +1 @@
+hermit
\ No newline at end of file
diff --git a/bin/stringer b/bin/stringer
new file mode 120000
index 000000000..51f658623
--- /dev/null
+++ b/bin/stringer
@@ -0,0 +1 @@
+.stringer-0.1.11.pkg
\ No newline at end of file
diff --git a/cmd/chroma/main.go b/cmd/chroma/main.go
index a1086419b..7bce609f1 100644
--- a/cmd/chroma/main.go
+++ b/cmd/chroma/main.go
@@ -267,7 +267,7 @@ func configureHTMLFormatter(ctx *kong.Context) {
html.WithLineNumbers(cli.HTMLLines),
html.LineNumbersInTable(cli.HTMLLinesTable),
html.PreventSurroundingPre(cli.HTMLPreventSurroundingPre),
- html.LinkableLineNumbers(cli.HTMLLinkableLines, "L"),
+ html.WithLinkableLineNumbers(cli.HTMLLinkableLines, "L"),
}
if len(cli.HTMLHighlight) > 0 {
ranges := [][2]int{}
diff --git a/formatters/html/html.go b/formatters/html/html.go
index 0a45d8714..8b682b72c 100644
--- a/formatters/html/html.go
+++ b/formatters/html/html.go
@@ -100,9 +100,9 @@ func LineNumbersInTable(b bool) Option {
}
}
-// LinkableLineNumbers decorates the line numbers HTML elements with an "id"
+// WithLinkableLineNumbers decorates the line numbers HTML elements with an "id"
// attribute so they can be linked.
-func LinkableLineNumbers(b bool, prefix string) Option {
+func WithLinkableLineNumbers(b bool, prefix string) Option {
return func(f *Formatter) {
f.linkableLineNumbers = b
f.lineNumbersIDPrefix = prefix
@@ -262,7 +262,7 @@ func (f *Formatter) writeHTML(w io.Writer, style *chroma.Style, tokens []chroma.
fmt.Fprintf(w, "", f.styleAttr(css, chroma.LineHighlight))
}
- fmt.Fprintf(w, "%s\n", f.styleAttr(css, chroma.LineNumbersTable), f.lineIDAttribute(line), f.lineTitleWithLinkIfNeeded(lineDigits, line))
+ fmt.Fprintf(w, "%s\n", f.styleAttr(css, chroma.LineNumbersTable), f.lineIDAttribute(line), f.lineTitleWithLinkIfNeeded(css, lineDigits, line))
if highlight {
fmt.Fprintf(w, "")
@@ -302,7 +302,7 @@ func (f *Formatter) writeHTML(w io.Writer, style *chroma.Style, tokens []chroma.
// Line number
if f.lineNumbers && !wrapInTable {
- fmt.Fprintf(w, "%s", f.styleAttr(css, chroma.LineNumbers), f.lineIDAttribute(line), f.lineTitleWithLinkIfNeeded(lineDigits, line))
+ fmt.Fprintf(w, "%s", f.styleAttr(css, chroma.LineNumbers), f.lineIDAttribute(line), f.lineTitleWithLinkIfNeeded(css, lineDigits, line))
}
fmt.Fprintf(w, ``, f.styleAttr(css, chroma.CodeLine))
@@ -345,12 +345,12 @@ func (f *Formatter) lineIDAttribute(line int) string {
return fmt.Sprintf(" id=\"%s\"", f.lineID(line))
}
-func (f *Formatter) lineTitleWithLinkIfNeeded(lineDigits, line int) string {
+func (f *Formatter) lineTitleWithLinkIfNeeded(css map[chroma.TokenType]string, lineDigits, line int) string {
title := fmt.Sprintf("%*d", lineDigits, line)
if !f.linkableLineNumbers {
return title
}
- return fmt.Sprintf("%s", f.lineID(line), title)
+ return fmt.Sprintf("%s", f.styleAttr(css, chroma.LineLink), f.lineID(line), title)
}
func (f *Formatter) lineID(line int) string {
@@ -520,6 +520,7 @@ func (f *Formatter) styleToCSS(style *chroma.Style) map[chroma.TokenType]string
classes[chroma.LineNumbersTable] = lineNumbersStyle + classes[chroma.LineNumbersTable]
classes[chroma.LineTable] = "border-spacing: 0; padding: 0; margin: 0; border: 0;" + classes[chroma.LineTable]
classes[chroma.LineTableTD] = "vertical-align: top; padding: 0; margin: 0; border: 0;" + classes[chroma.LineTableTD]
+ classes[chroma.LineLink] = "outline: none; text-decoration:none; color:inherit" + classes[chroma.LineLink]
return classes
}
diff --git a/formatters/html/html_test.go b/formatters/html/html_test.go
index 2670a9073..174ee9398 100644
--- a/formatters/html/html_test.go
+++ b/formatters/html/html_test.go
@@ -199,7 +199,7 @@ func TestPreWrapper(t *testing.T) {
}
func TestLinkeableLineNumbers(t *testing.T) {
- f := New(WithClasses(true), WithLineNumbers(true), LinkableLineNumbers(true, "line"))
+ f := New(WithClasses(true), WithLineNumbers(true), WithLinkableLineNumbers(true, "line"), WithClasses(false))
it, err := lexers.Get("go").Tokenise(nil, "package main\nfunc main()\n{\nprintln(\"hello world\")\n}\n")
assert.NoError(t, err)
@@ -207,12 +207,12 @@ func TestLinkeableLineNumbers(t *testing.T) {
err = f.Format(&buf, styles.Fallback, it)
assert.NoError(t, err)
- assert.Contains(t, buf.String(), `id="line1">1`)
- assert.Contains(t, buf.String(), `id="line5">5`)
+ assert.Contains(t, buf.String(), `id="line1">1`)
+ assert.Contains(t, buf.String(), `id="line5">5`)
}
func TestTableLinkeableLineNumbers(t *testing.T) {
- f := New(WithClasses(true), WithLineNumbers(true), LineNumbersInTable(true), LinkableLineNumbers(true, "line"))
+ f := New(Standalone(true), WithClasses(true), WithLineNumbers(true), LineNumbersInTable(true), WithLinkableLineNumbers(true, "line"))
it, err := lexers.Get("go").Tokenise(nil, "package main\nfunc main()\n{\nprintln(`hello world`)\n}\n")
assert.NoError(t, err)
@@ -220,8 +220,9 @@ func TestTableLinkeableLineNumbers(t *testing.T) {
err = f.Format(&buf, styles.Fallback, it)
assert.NoError(t, err)
- assert.Contains(t, buf.String(), `id="line1">1`)
- assert.Contains(t, buf.String(), `id="line5">5`)
+ assert.Contains(t, buf.String(), `id="line1">1`)
+ assert.Contains(t, buf.String(), `id="line5">5`)
+ assert.Contains(t, buf.String(), `/* LineLinks */ .chroma .lnlinks { outline: none; text-decoration:none; color:inherit }`, buf.String())
}
func TestTableLineNumberSpacing(t *testing.T) {
diff --git a/tokentype_string.go b/tokentype_string.go
index 9c302f9c9..0f6c1a50d 100644
--- a/tokentype_string.go
+++ b/tokentype_string.go
@@ -16,10 +16,11 @@ func _() {
_ = x[LineHighlight - -6]
_ = x[LineTable - -7]
_ = x[LineTableTD - -8]
- _ = x[CodeLine - -9]
- _ = x[Error - -10]
- _ = x[Other - -11]
- _ = x[None - -12]
+ _ = x[LineLink - -9]
+ _ = x[CodeLine - -10]
+ _ = x[Error - -11]
+ _ = x[Other - -12]
+ _ = x[None - -13]
_ = x[EOFType-0]
_ = x[Keyword-1000]
_ = x[KeywordConstant-1001]
@@ -108,107 +109,108 @@ func _() {
_ = x[TextPunctuation-8003]
}
-const _TokenType_name = "NoneOtherErrorCodeLineLineTableTDLineTableLineHighlightLineNumbersTableLineNumbersLinePreWrapperBackgroundEOFTypeKeywordKeywordConstantKeywordDeclarationKeywordNamespaceKeywordPseudoKeywordReservedKeywordTypeNameNameAttributeNameBuiltinNameBuiltinPseudoNameClassNameConstantNameDecoratorNameEntityNameExceptionNameFunctionNameFunctionMagicNameKeywordNameLabelNameNamespaceNameOperatorNameOtherNamePseudoNamePropertyNameTagNameVariableNameVariableAnonymousNameVariableClassNameVariableGlobalNameVariableInstanceNameVariableMagicLiteralLiteralDateLiteralOtherLiteralStringLiteralStringAffixLiteralStringAtomLiteralStringBacktickLiteralStringBooleanLiteralStringCharLiteralStringDelimiterLiteralStringDocLiteralStringDoubleLiteralStringEscapeLiteralStringHeredocLiteralStringInterpolLiteralStringNameLiteralStringOtherLiteralStringRegexLiteralStringSingleLiteralStringSymbolLiteralNumberLiteralNumberBinLiteralNumberFloatLiteralNumberHexLiteralNumberIntegerLiteralNumberIntegerLongLiteralNumberOctOperatorOperatorWordPunctuationCommentCommentHashbangCommentMultilineCommentSingleCommentSpecialCommentPreprocCommentPreprocFileGenericGenericDeletedGenericEmphGenericErrorGenericHeadingGenericInsertedGenericOutputGenericPromptGenericStrongGenericSubheadingGenericTracebackGenericUnderlineTextTextWhitespaceTextSymbolTextPunctuation"
+const _TokenType_name = "NoneOtherErrorCodeLineLineLinksLineTableTDLineTableLineHighlightLineNumbersTableLineNumbersLinePreWrapperBackgroundEOFTypeKeywordKeywordConstantKeywordDeclarationKeywordNamespaceKeywordPseudoKeywordReservedKeywordTypeNameNameAttributeNameBuiltinNameBuiltinPseudoNameClassNameConstantNameDecoratorNameEntityNameExceptionNameFunctionNameFunctionMagicNameKeywordNameLabelNameNamespaceNameOperatorNameOtherNamePseudoNamePropertyNameTagNameVariableNameVariableAnonymousNameVariableClassNameVariableGlobalNameVariableInstanceNameVariableMagicLiteralLiteralDateLiteralOtherLiteralStringLiteralStringAffixLiteralStringAtomLiteralStringBacktickLiteralStringBooleanLiteralStringCharLiteralStringDelimiterLiteralStringDocLiteralStringDoubleLiteralStringEscapeLiteralStringHeredocLiteralStringInterpolLiteralStringNameLiteralStringOtherLiteralStringRegexLiteralStringSingleLiteralStringSymbolLiteralNumberLiteralNumberBinLiteralNumberFloatLiteralNumberHexLiteralNumberIntegerLiteralNumberIntegerLongLiteralNumberOctOperatorOperatorWordPunctuationCommentCommentHashbangCommentMultilineCommentSingleCommentSpecialCommentPreprocCommentPreprocFileGenericGenericDeletedGenericEmphGenericErrorGenericHeadingGenericInsertedGenericOutputGenericPromptGenericStrongGenericSubheadingGenericTracebackGenericUnderlineTextTextWhitespaceTextSymbolTextPunctuation"
var _TokenType_map = map[TokenType]string{
- -12: _TokenType_name[0:4],
- -11: _TokenType_name[4:9],
- -10: _TokenType_name[9:14],
- -9: _TokenType_name[14:22],
- -8: _TokenType_name[22:33],
- -7: _TokenType_name[33:42],
- -6: _TokenType_name[42:55],
- -5: _TokenType_name[55:71],
- -4: _TokenType_name[71:82],
- -3: _TokenType_name[82:86],
- -2: _TokenType_name[86:96],
- -1: _TokenType_name[96:106],
- 0: _TokenType_name[106:113],
- 1000: _TokenType_name[113:120],
- 1001: _TokenType_name[120:135],
- 1002: _TokenType_name[135:153],
- 1003: _TokenType_name[153:169],
- 1004: _TokenType_name[169:182],
- 1005: _TokenType_name[182:197],
- 1006: _TokenType_name[197:208],
- 2000: _TokenType_name[208:212],
- 2001: _TokenType_name[212:225],
- 2002: _TokenType_name[225:236],
- 2003: _TokenType_name[236:253],
- 2004: _TokenType_name[253:262],
- 2005: _TokenType_name[262:274],
- 2006: _TokenType_name[274:287],
- 2007: _TokenType_name[287:297],
- 2008: _TokenType_name[297:310],
- 2009: _TokenType_name[310:322],
- 2010: _TokenType_name[322:339],
- 2011: _TokenType_name[339:350],
- 2012: _TokenType_name[350:359],
- 2013: _TokenType_name[359:372],
- 2014: _TokenType_name[372:384],
- 2015: _TokenType_name[384:393],
- 2016: _TokenType_name[393:403],
- 2017: _TokenType_name[403:415],
- 2018: _TokenType_name[415:422],
- 2019: _TokenType_name[422:434],
- 2020: _TokenType_name[434:455],
- 2021: _TokenType_name[455:472],
- 2022: _TokenType_name[472:490],
- 2023: _TokenType_name[490:510],
- 2024: _TokenType_name[510:527],
- 3000: _TokenType_name[527:534],
- 3001: _TokenType_name[534:545],
- 3002: _TokenType_name[545:557],
- 3100: _TokenType_name[557:570],
- 3101: _TokenType_name[570:588],
- 3102: _TokenType_name[588:605],
- 3103: _TokenType_name[605:626],
- 3104: _TokenType_name[626:646],
- 3105: _TokenType_name[646:663],
- 3106: _TokenType_name[663:685],
- 3107: _TokenType_name[685:701],
- 3108: _TokenType_name[701:720],
- 3109: _TokenType_name[720:739],
- 3110: _TokenType_name[739:759],
- 3111: _TokenType_name[759:780],
- 3112: _TokenType_name[780:797],
- 3113: _TokenType_name[797:815],
- 3114: _TokenType_name[815:833],
- 3115: _TokenType_name[833:852],
- 3116: _TokenType_name[852:871],
- 3200: _TokenType_name[871:884],
- 3201: _TokenType_name[884:900],
- 3202: _TokenType_name[900:918],
- 3203: _TokenType_name[918:934],
- 3204: _TokenType_name[934:954],
- 3205: _TokenType_name[954:978],
- 3206: _TokenType_name[978:994],
- 4000: _TokenType_name[994:1002],
- 4001: _TokenType_name[1002:1014],
- 5000: _TokenType_name[1014:1025],
- 6000: _TokenType_name[1025:1032],
- 6001: _TokenType_name[1032:1047],
- 6002: _TokenType_name[1047:1063],
- 6003: _TokenType_name[1063:1076],
- 6004: _TokenType_name[1076:1090],
- 6100: _TokenType_name[1090:1104],
- 6101: _TokenType_name[1104:1122],
- 7000: _TokenType_name[1122:1129],
- 7001: _TokenType_name[1129:1143],
- 7002: _TokenType_name[1143:1154],
- 7003: _TokenType_name[1154:1166],
- 7004: _TokenType_name[1166:1180],
- 7005: _TokenType_name[1180:1195],
- 7006: _TokenType_name[1195:1208],
- 7007: _TokenType_name[1208:1221],
- 7008: _TokenType_name[1221:1234],
- 7009: _TokenType_name[1234:1251],
- 7010: _TokenType_name[1251:1267],
- 7011: _TokenType_name[1267:1283],
- 8000: _TokenType_name[1283:1287],
- 8001: _TokenType_name[1287:1301],
- 8002: _TokenType_name[1301:1311],
- 8003: _TokenType_name[1311:1326],
+ -13: _TokenType_name[0:4],
+ -12: _TokenType_name[4:9],
+ -11: _TokenType_name[9:14],
+ -10: _TokenType_name[14:22],
+ -9: _TokenType_name[22:31],
+ -8: _TokenType_name[31:42],
+ -7: _TokenType_name[42:51],
+ -6: _TokenType_name[51:64],
+ -5: _TokenType_name[64:80],
+ -4: _TokenType_name[80:91],
+ -3: _TokenType_name[91:95],
+ -2: _TokenType_name[95:105],
+ -1: _TokenType_name[105:115],
+ 0: _TokenType_name[115:122],
+ 1000: _TokenType_name[122:129],
+ 1001: _TokenType_name[129:144],
+ 1002: _TokenType_name[144:162],
+ 1003: _TokenType_name[162:178],
+ 1004: _TokenType_name[178:191],
+ 1005: _TokenType_name[191:206],
+ 1006: _TokenType_name[206:217],
+ 2000: _TokenType_name[217:221],
+ 2001: _TokenType_name[221:234],
+ 2002: _TokenType_name[234:245],
+ 2003: _TokenType_name[245:262],
+ 2004: _TokenType_name[262:271],
+ 2005: _TokenType_name[271:283],
+ 2006: _TokenType_name[283:296],
+ 2007: _TokenType_name[296:306],
+ 2008: _TokenType_name[306:319],
+ 2009: _TokenType_name[319:331],
+ 2010: _TokenType_name[331:348],
+ 2011: _TokenType_name[348:359],
+ 2012: _TokenType_name[359:368],
+ 2013: _TokenType_name[368:381],
+ 2014: _TokenType_name[381:393],
+ 2015: _TokenType_name[393:402],
+ 2016: _TokenType_name[402:412],
+ 2017: _TokenType_name[412:424],
+ 2018: _TokenType_name[424:431],
+ 2019: _TokenType_name[431:443],
+ 2020: _TokenType_name[443:464],
+ 2021: _TokenType_name[464:481],
+ 2022: _TokenType_name[481:499],
+ 2023: _TokenType_name[499:519],
+ 2024: _TokenType_name[519:536],
+ 3000: _TokenType_name[536:543],
+ 3001: _TokenType_name[543:554],
+ 3002: _TokenType_name[554:566],
+ 3100: _TokenType_name[566:579],
+ 3101: _TokenType_name[579:597],
+ 3102: _TokenType_name[597:614],
+ 3103: _TokenType_name[614:635],
+ 3104: _TokenType_name[635:655],
+ 3105: _TokenType_name[655:672],
+ 3106: _TokenType_name[672:694],
+ 3107: _TokenType_name[694:710],
+ 3108: _TokenType_name[710:729],
+ 3109: _TokenType_name[729:748],
+ 3110: _TokenType_name[748:768],
+ 3111: _TokenType_name[768:789],
+ 3112: _TokenType_name[789:806],
+ 3113: _TokenType_name[806:824],
+ 3114: _TokenType_name[824:842],
+ 3115: _TokenType_name[842:861],
+ 3116: _TokenType_name[861:880],
+ 3200: _TokenType_name[880:893],
+ 3201: _TokenType_name[893:909],
+ 3202: _TokenType_name[909:927],
+ 3203: _TokenType_name[927:943],
+ 3204: _TokenType_name[943:963],
+ 3205: _TokenType_name[963:987],
+ 3206: _TokenType_name[987:1003],
+ 4000: _TokenType_name[1003:1011],
+ 4001: _TokenType_name[1011:1023],
+ 5000: _TokenType_name[1023:1034],
+ 6000: _TokenType_name[1034:1041],
+ 6001: _TokenType_name[1041:1056],
+ 6002: _TokenType_name[1056:1072],
+ 6003: _TokenType_name[1072:1085],
+ 6004: _TokenType_name[1085:1099],
+ 6100: _TokenType_name[1099:1113],
+ 6101: _TokenType_name[1113:1131],
+ 7000: _TokenType_name[1131:1138],
+ 7001: _TokenType_name[1138:1152],
+ 7002: _TokenType_name[1152:1163],
+ 7003: _TokenType_name[1163:1175],
+ 7004: _TokenType_name[1175:1189],
+ 7005: _TokenType_name[1189:1204],
+ 7006: _TokenType_name[1204:1217],
+ 7007: _TokenType_name[1217:1230],
+ 7008: _TokenType_name[1230:1243],
+ 7009: _TokenType_name[1243:1260],
+ 7010: _TokenType_name[1260:1276],
+ 7011: _TokenType_name[1276:1292],
+ 8000: _TokenType_name[1292:1296],
+ 8001: _TokenType_name[1296:1310],
+ 8002: _TokenType_name[1310:1320],
+ 8003: _TokenType_name[1320:1335],
}
func (i TokenType) String() string {
diff --git a/types.go b/types.go
index 2ff8928c4..ee9052475 100644
--- a/types.go
+++ b/types.go
@@ -35,6 +35,8 @@ const (
LineTable
// Line numbers table TD wrapper style.
LineTableTD
+ // Line number links.
+ LineLink
// Code line wrapper style.
CodeLine
// Input that could not be tokenised.
@@ -216,6 +218,7 @@ var (
LineHighlight: "hl",
LineTable: "lntable",
LineTableTD: "lntd",
+ LineLink: "lnlinks",
CodeLine: "cl",
Text: "",
Whitespace: "w",