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",