styles.go

  1// Package styles provides default styles for the glamour package.
  2package styles
  3
  4//go:generate go run ../internal/generate-style-json
  5
  6import (
  7	"github.com/charmbracelet/glamour/v2/ansi"
  8)
  9
 10const (
 11	defaultListIndent      = 2
 12	defaultListLevelIndent = 4
 13	defaultMargin          = 2
 14)
 15
 16// Default styles.
 17const (
 18	AsciiStyle      = "ascii" //nolint: revive
 19	DarkStyle       = "dark"
 20	DraculaStyle    = "dracula"
 21	TokyoNightStyle = "tokyo-night"
 22	LightStyle      = "light"
 23	NoTTYStyle      = "notty"
 24	PinkStyle       = "pink"
 25)
 26
 27var (
 28	// ASCIIStyleConfig uses only ASCII characters.
 29	ASCIIStyleConfig = ansi.StyleConfig{
 30		Document: ansi.StyleBlock{
 31			StylePrimitive: ansi.StylePrimitive{
 32				BlockPrefix: "\n",
 33				BlockSuffix: "\n",
 34			},
 35			Margin: uintPtr(defaultMargin),
 36		},
 37		BlockQuote: ansi.StyleBlock{
 38			StylePrimitive: ansi.StylePrimitive{},
 39			Indent:         uintPtr(1),
 40			IndentToken:    stringPtr("| "),
 41		},
 42		Paragraph: ansi.StyleBlock{
 43			StylePrimitive: ansi.StylePrimitive{},
 44		},
 45		List: ansi.StyleList{
 46			StyleBlock: ansi.StyleBlock{
 47				StylePrimitive: ansi.StylePrimitive{},
 48			},
 49			LevelIndent: defaultListLevelIndent,
 50		},
 51		Heading: ansi.StyleBlock{
 52			StylePrimitive: ansi.StylePrimitive{
 53				BlockSuffix: "\n",
 54			},
 55		},
 56		H1: ansi.StyleBlock{
 57			StylePrimitive: ansi.StylePrimitive{
 58				Prefix: "# ",
 59			},
 60		},
 61		H2: ansi.StyleBlock{
 62			StylePrimitive: ansi.StylePrimitive{
 63				Prefix: "## ",
 64			},
 65		},
 66		H3: ansi.StyleBlock{
 67			StylePrimitive: ansi.StylePrimitive{
 68				Prefix: "### ",
 69			},
 70		},
 71		H4: ansi.StyleBlock{
 72			StylePrimitive: ansi.StylePrimitive{
 73				Prefix: "#### ",
 74			},
 75		},
 76		H5: ansi.StyleBlock{
 77			StylePrimitive: ansi.StylePrimitive{
 78				Prefix: "##### ",
 79			},
 80		},
 81		H6: ansi.StyleBlock{
 82			StylePrimitive: ansi.StylePrimitive{
 83				Prefix: "###### ",
 84			},
 85		},
 86		Strikethrough: ansi.StylePrimitive{
 87			BlockPrefix: "~~",
 88			BlockSuffix: "~~",
 89		},
 90		Emph: ansi.StylePrimitive{
 91			BlockPrefix: "*",
 92			BlockSuffix: "*",
 93		},
 94		Strong: ansi.StylePrimitive{
 95			BlockPrefix: "**",
 96			BlockSuffix: "**",
 97		},
 98		HorizontalRule: ansi.StylePrimitive{
 99			Format: "\n--------\n",
100		},
101		Item: ansi.StylePrimitive{
102			BlockPrefix: "• ",
103		},
104		Enumeration: ansi.StylePrimitive{
105			BlockPrefix: ". ",
106		},
107		Task: ansi.StyleTask{
108			Ticked:   "[x] ",
109			Unticked: "[ ] ",
110		},
111		ImageText: ansi.StylePrimitive{
112			Format: "Image: {{.text}} →",
113		},
114		Code: ansi.StyleBlock{
115			StylePrimitive: ansi.StylePrimitive{
116				BlockPrefix: "`",
117				BlockSuffix: "`",
118			},
119		},
120		CodeBlock: ansi.StyleCodeBlock{
121			StyleBlock: ansi.StyleBlock{
122				Margin: uintPtr(defaultMargin),
123			},
124		},
125		Table: ansi.StyleTable{
126			CenterSeparator: stringPtr("|"),
127			ColumnSeparator: stringPtr("|"),
128			RowSeparator:    stringPtr("-"),
129		},
130		DefinitionDescription: ansi.StylePrimitive{
131			BlockPrefix: "\n* ",
132		},
133	}
134
135	// DarkStyleConfig is the default dark style.
136	DarkStyleConfig = ansi.StyleConfig{
137		Document: ansi.StyleBlock{
138			StylePrimitive: ansi.StylePrimitive{
139				BlockPrefix: "\n",
140				BlockSuffix: "\n",
141				Color:       stringPtr("252"),
142			},
143			Margin: uintPtr(defaultMargin),
144		},
145		BlockQuote: ansi.StyleBlock{
146			StylePrimitive: ansi.StylePrimitive{},
147			Indent:         uintPtr(1),
148			IndentToken:    stringPtr("│ "),
149		},
150		List: ansi.StyleList{
151			LevelIndent: defaultListIndent,
152		},
153		Heading: ansi.StyleBlock{
154			StylePrimitive: ansi.StylePrimitive{
155				BlockSuffix: "\n",
156				Color:       stringPtr("39"),
157				Bold:        boolPtr(true),
158			},
159		},
160		H1: ansi.StyleBlock{
161			StylePrimitive: ansi.StylePrimitive{
162				Prefix:          " ",
163				Suffix:          " ",
164				Color:           stringPtr("228"),
165				BackgroundColor: stringPtr("63"),
166				Bold:            boolPtr(true),
167			},
168		},
169		H2: ansi.StyleBlock{
170			StylePrimitive: ansi.StylePrimitive{
171				Prefix: "## ",
172			},
173		},
174		H3: ansi.StyleBlock{
175			StylePrimitive: ansi.StylePrimitive{
176				Prefix: "### ",
177			},
178		},
179		H4: ansi.StyleBlock{
180			StylePrimitive: ansi.StylePrimitive{
181				Prefix: "#### ",
182			},
183		},
184		H5: ansi.StyleBlock{
185			StylePrimitive: ansi.StylePrimitive{
186				Prefix: "##### ",
187			},
188		},
189		H6: ansi.StyleBlock{
190			StylePrimitive: ansi.StylePrimitive{
191				Prefix: "###### ",
192				Color:  stringPtr("35"),
193				Bold:   boolPtr(false),
194			},
195		},
196		Strikethrough: ansi.StylePrimitive{
197			CrossedOut: boolPtr(true),
198		},
199		Emph: ansi.StylePrimitive{
200			Italic: boolPtr(true),
201		},
202		Strong: ansi.StylePrimitive{
203			Bold: boolPtr(true),
204		},
205		HorizontalRule: ansi.StylePrimitive{
206			Color:  stringPtr("240"),
207			Format: "\n--------\n",
208		},
209		Item: ansi.StylePrimitive{
210			BlockPrefix: "• ",
211		},
212		Enumeration: ansi.StylePrimitive{
213			BlockPrefix: ". ",
214		},
215		Task: ansi.StyleTask{
216			StylePrimitive: ansi.StylePrimitive{},
217			Ticked:         "[āœ“] ",
218			Unticked:       "[ ] ",
219		},
220		Link: ansi.StylePrimitive{
221			Color:     stringPtr("30"),
222			Underline: boolPtr(true),
223		},
224		LinkText: ansi.StylePrimitive{
225			Color: stringPtr("35"),
226			Bold:  boolPtr(true),
227		},
228		Image: ansi.StylePrimitive{
229			Color:     stringPtr("212"),
230			Underline: boolPtr(true),
231		},
232		ImageText: ansi.StylePrimitive{
233			Color:  stringPtr("243"),
234			Format: "Image: {{.text}} →",
235		},
236		Code: ansi.StyleBlock{
237			StylePrimitive: ansi.StylePrimitive{
238				Prefix:          " ",
239				Suffix:          " ",
240				Color:           stringPtr("203"),
241				BackgroundColor: stringPtr("236"),
242			},
243		},
244		CodeBlock: ansi.StyleCodeBlock{
245			StyleBlock: ansi.StyleBlock{
246				StylePrimitive: ansi.StylePrimitive{
247					Color: stringPtr("244"),
248				},
249				Margin: uintPtr(defaultMargin),
250			},
251			Chroma: &ansi.Chroma{
252				Text: ansi.StylePrimitive{
253					Color: stringPtr("#C4C4C4"),
254				},
255				Error: ansi.StylePrimitive{
256					Color:           stringPtr("#F1F1F1"),
257					BackgroundColor: stringPtr("#F05B5B"),
258				},
259				Comment: ansi.StylePrimitive{
260					Color: stringPtr("#676767"),
261				},
262				CommentPreproc: ansi.StylePrimitive{
263					Color: stringPtr("#FF875F"),
264				},
265				Keyword: ansi.StylePrimitive{
266					Color: stringPtr("#00AAFF"),
267				},
268				KeywordReserved: ansi.StylePrimitive{
269					Color: stringPtr("#FF5FD2"),
270				},
271				KeywordNamespace: ansi.StylePrimitive{
272					Color: stringPtr("#FF5F87"),
273				},
274				KeywordType: ansi.StylePrimitive{
275					Color: stringPtr("#6E6ED8"),
276				},
277				Operator: ansi.StylePrimitive{
278					Color: stringPtr("#EF8080"),
279				},
280				Punctuation: ansi.StylePrimitive{
281					Color: stringPtr("#E8E8A8"),
282				},
283				Name: ansi.StylePrimitive{
284					Color: stringPtr("#C4C4C4"),
285				},
286				NameBuiltin: ansi.StylePrimitive{
287					Color: stringPtr("#FF8EC7"),
288				},
289				NameTag: ansi.StylePrimitive{
290					Color: stringPtr("#B083EA"),
291				},
292				NameAttribute: ansi.StylePrimitive{
293					Color: stringPtr("#7A7AE6"),
294				},
295				NameClass: ansi.StylePrimitive{
296					Color:     stringPtr("#F1F1F1"),
297					Underline: boolPtr(true),
298					Bold:      boolPtr(true),
299				},
300				NameDecorator: ansi.StylePrimitive{
301					Color: stringPtr("#FFFF87"),
302				},
303				NameFunction: ansi.StylePrimitive{
304					Color: stringPtr("#00D787"),
305				},
306				LiteralNumber: ansi.StylePrimitive{
307					Color: stringPtr("#6EEFC0"),
308				},
309				LiteralString: ansi.StylePrimitive{
310					Color: stringPtr("#C69669"),
311				},
312				LiteralStringEscape: ansi.StylePrimitive{
313					Color: stringPtr("#AFFFD7"),
314				},
315				GenericDeleted: ansi.StylePrimitive{
316					Color: stringPtr("#FD5B5B"),
317				},
318				GenericEmph: ansi.StylePrimitive{
319					Italic: boolPtr(true),
320				},
321				GenericInserted: ansi.StylePrimitive{
322					Color: stringPtr("#00D787"),
323				},
324				GenericStrong: ansi.StylePrimitive{
325					Bold: boolPtr(true),
326				},
327				GenericSubheading: ansi.StylePrimitive{
328					Color: stringPtr("#777777"),
329				},
330				Background: ansi.StylePrimitive{
331					BackgroundColor: stringPtr("#373737"),
332				},
333			},
334		},
335		Table: ansi.StyleTable{
336			StyleBlock: ansi.StyleBlock{
337				StylePrimitive: ansi.StylePrimitive{},
338			},
339		},
340		DefinitionDescription: ansi.StylePrimitive{
341			BlockPrefix: "\n🠶 ",
342		},
343	}
344
345	// LightStyleConfig is the default light style.
346	LightStyleConfig = ansi.StyleConfig{
347		Document: ansi.StyleBlock{
348			StylePrimitive: ansi.StylePrimitive{
349				BlockPrefix: "\n",
350				BlockSuffix: "\n",
351				Color:       stringPtr("234"),
352			},
353			Margin: uintPtr(defaultMargin),
354		},
355		BlockQuote: ansi.StyleBlock{
356			StylePrimitive: ansi.StylePrimitive{},
357			Indent:         uintPtr(1),
358			IndentToken:    stringPtr("│ "),
359		},
360		List: ansi.StyleList{
361			LevelIndent: defaultListIndent,
362		},
363		Heading: ansi.StyleBlock{
364			StylePrimitive: ansi.StylePrimitive{
365				BlockSuffix: "\n",
366				Color:       stringPtr("27"),
367				Bold:        boolPtr(true),
368			},
369		},
370		H1: ansi.StyleBlock{
371			StylePrimitive: ansi.StylePrimitive{
372				Prefix:          " ",
373				Suffix:          " ",
374				Color:           stringPtr("228"),
375				BackgroundColor: stringPtr("63"),
376				Bold:            boolPtr(true),
377			},
378		},
379		H2: ansi.StyleBlock{
380			StylePrimitive: ansi.StylePrimitive{
381				Prefix: "## ",
382			},
383		},
384		H3: ansi.StyleBlock{
385			StylePrimitive: ansi.StylePrimitive{
386				Prefix: "### ",
387			},
388		},
389		H4: ansi.StyleBlock{
390			StylePrimitive: ansi.StylePrimitive{
391				Prefix: "#### ",
392			},
393		},
394		H5: ansi.StyleBlock{
395			StylePrimitive: ansi.StylePrimitive{
396				Prefix: "##### ",
397			},
398		},
399		H6: ansi.StyleBlock{
400			StylePrimitive: ansi.StylePrimitive{
401				Prefix: "###### ",
402				Bold:   boolPtr(false),
403			},
404		},
405		Strikethrough: ansi.StylePrimitive{
406			CrossedOut: boolPtr(true),
407		},
408		Emph: ansi.StylePrimitive{
409			Italic: boolPtr(true),
410		},
411		Strong: ansi.StylePrimitive{
412			Bold: boolPtr(true),
413		},
414		HorizontalRule: ansi.StylePrimitive{
415			Color:  stringPtr("249"),
416			Format: "\n--------\n",
417		},
418		Item: ansi.StylePrimitive{
419			BlockPrefix: "• ",
420		},
421		Enumeration: ansi.StylePrimitive{
422			BlockPrefix: ". ",
423		},
424		Task: ansi.StyleTask{
425			StylePrimitive: ansi.StylePrimitive{},
426			Ticked:         "[āœ“] ",
427			Unticked:       "[ ] ",
428		},
429		Link: ansi.StylePrimitive{
430			Color:     stringPtr("36"),
431			Underline: boolPtr(true),
432		},
433		LinkText: ansi.StylePrimitive{
434			Color: stringPtr("29"),
435			Bold:  boolPtr(true),
436		},
437		Image: ansi.StylePrimitive{
438			Color:     stringPtr("205"),
439			Underline: boolPtr(true),
440		},
441		ImageText: ansi.StylePrimitive{
442			Color:  stringPtr("243"),
443			Format: "Image: {{.text}} →",
444		},
445		Code: ansi.StyleBlock{
446			StylePrimitive: ansi.StylePrimitive{
447				Prefix:          " ",
448				Suffix:          " ",
449				Color:           stringPtr("203"),
450				BackgroundColor: stringPtr("254"),
451			},
452		},
453		CodeBlock: ansi.StyleCodeBlock{
454			StyleBlock: ansi.StyleBlock{
455				StylePrimitive: ansi.StylePrimitive{
456					Color: stringPtr("242"),
457				},
458				Margin: uintPtr(defaultMargin),
459			},
460			Chroma: &ansi.Chroma{
461				Text: ansi.StylePrimitive{
462					Color: stringPtr("#2A2A2A"),
463				},
464				Error: ansi.StylePrimitive{
465					Color:           stringPtr("#F1F1F1"),
466					BackgroundColor: stringPtr("#FF5555"),
467				},
468				Comment: ansi.StylePrimitive{
469					Color: stringPtr("#8D8D8D"),
470				},
471				CommentPreproc: ansi.StylePrimitive{
472					Color: stringPtr("#FF875F"),
473				},
474				Keyword: ansi.StylePrimitive{
475					Color: stringPtr("#279EFC"),
476				},
477				KeywordReserved: ansi.StylePrimitive{
478					Color: stringPtr("#FF5FD2"),
479				},
480				KeywordNamespace: ansi.StylePrimitive{
481					Color: stringPtr("#FB406F"),
482				},
483				KeywordType: ansi.StylePrimitive{
484					Color: stringPtr("#7049C2"),
485				},
486				Operator: ansi.StylePrimitive{
487					Color: stringPtr("#FF2626"),
488				},
489				Punctuation: ansi.StylePrimitive{
490					Color: stringPtr("#FA7878"),
491				},
492				NameBuiltin: ansi.StylePrimitive{
493					Color: stringPtr("#0A1BB1"),
494				},
495				NameTag: ansi.StylePrimitive{
496					Color: stringPtr("#581290"),
497				},
498				NameAttribute: ansi.StylePrimitive{
499					Color: stringPtr("#8362CB"),
500				},
501				NameClass: ansi.StylePrimitive{
502					Color:     stringPtr("#212121"),
503					Underline: boolPtr(true),
504					Bold:      boolPtr(true),
505				},
506				NameConstant: ansi.StylePrimitive{
507					Color: stringPtr("#581290"),
508				},
509				NameDecorator: ansi.StylePrimitive{
510					Color: stringPtr("#A3A322"),
511				},
512				NameFunction: ansi.StylePrimitive{
513					Color: stringPtr("#019F57"),
514				},
515				LiteralNumber: ansi.StylePrimitive{
516					Color: stringPtr("#22CCAE"),
517				},
518				LiteralString: ansi.StylePrimitive{
519					Color: stringPtr("#7E5B38"),
520				},
521				LiteralStringEscape: ansi.StylePrimitive{
522					Color: stringPtr("#00AEAE"),
523				},
524				GenericDeleted: ansi.StylePrimitive{
525					Color: stringPtr("#FD5B5B"),
526				},
527				GenericEmph: ansi.StylePrimitive{
528					Italic: boolPtr(true),
529				},
530				GenericInserted: ansi.StylePrimitive{
531					Color: stringPtr("#00D787"),
532				},
533				GenericStrong: ansi.StylePrimitive{
534					Bold: boolPtr(true),
535				},
536				GenericSubheading: ansi.StylePrimitive{
537					Color: stringPtr("#777777"),
538				},
539				Background: ansi.StylePrimitive{
540					BackgroundColor: stringPtr("#373737"),
541				},
542			},
543		},
544		Table: ansi.StyleTable{
545			StyleBlock: ansi.StyleBlock{
546				StylePrimitive: ansi.StylePrimitive{},
547			},
548		},
549		DefinitionDescription: ansi.StylePrimitive{
550			BlockPrefix: "\n🠶 ",
551		},
552	}
553
554	// PinkStyleConfig is the default pink style.
555	PinkStyleConfig = ansi.StyleConfig{
556		Document: ansi.StyleBlock{
557			Margin: uintPtr(defaultMargin),
558		},
559		BlockQuote: ansi.StyleBlock{
560			Indent:      uintPtr(1),
561			IndentToken: stringPtr("│ "),
562		},
563		List: ansi.StyleList{
564			LevelIndent: defaultListIndent,
565		},
566		Heading: ansi.StyleBlock{
567			StylePrimitive: ansi.StylePrimitive{
568				BlockSuffix: "\n",
569				Color:       stringPtr("212"),
570				Bold:        boolPtr(true),
571			},
572		},
573		H1: ansi.StyleBlock{
574			StylePrimitive: ansi.StylePrimitive{
575				BlockSuffix: "\n",
576				BlockPrefix: "\n",
577				Prefix:      "",
578			},
579		},
580		H2: ansi.StyleBlock{
581			StylePrimitive: ansi.StylePrimitive{
582				Prefix: "ā–Œ ",
583			},
584		},
585		H3: ansi.StyleBlock{
586			StylePrimitive: ansi.StylePrimitive{
587				Prefix: "ā”ƒ ",
588			},
589		},
590		H4: ansi.StyleBlock{
591			StylePrimitive: ansi.StylePrimitive{
592				Prefix: "│ ",
593			},
594		},
595		H5: ansi.StyleBlock{
596			StylePrimitive: ansi.StylePrimitive{
597				Prefix: "┆ ",
598			},
599		},
600		H6: ansi.StyleBlock{
601			StylePrimitive: ansi.StylePrimitive{
602				Prefix: "ā”Š ",
603				Bold:   boolPtr(false),
604			},
605		},
606		Text: ansi.StylePrimitive{},
607		Strikethrough: ansi.StylePrimitive{
608			CrossedOut: boolPtr(true),
609		},
610		Emph: ansi.StylePrimitive{
611			Italic: boolPtr(true),
612		},
613		Strong: ansi.StylePrimitive{
614			Bold: boolPtr(true),
615		},
616		HorizontalRule: ansi.StylePrimitive{
617			Color:  stringPtr("212"),
618			Format: "\n──────\n",
619		},
620		Item: ansi.StylePrimitive{
621			BlockPrefix: "• ",
622		},
623		Enumeration: ansi.StylePrimitive{
624			BlockPrefix: ". ",
625		},
626		Task: ansi.StyleTask{
627			Ticked:   "[āœ“] ",
628			Unticked: "[ ] ",
629		},
630		Link: ansi.StylePrimitive{
631			Color:     stringPtr("99"),
632			Underline: boolPtr(true),
633		},
634		LinkText: ansi.StylePrimitive{
635			Bold: boolPtr(true),
636		},
637		Image: ansi.StylePrimitive{
638			Underline: boolPtr(true),
639		},
640		ImageText: ansi.StylePrimitive{
641			Format: "Image: {{.text}}",
642		},
643		Code: ansi.StyleBlock{
644			StylePrimitive: ansi.StylePrimitive{
645				Color:           stringPtr("212"),
646				BackgroundColor: stringPtr("236"),
647				Prefix:          " ",
648				Suffix:          " ",
649			},
650		},
651		Table:          ansi.StyleTable{},
652		DefinitionList: ansi.StyleBlock{},
653		DefinitionTerm: ansi.StylePrimitive{},
654		DefinitionDescription: ansi.StylePrimitive{
655			BlockPrefix: "\n🠶 ",
656		},
657		HTMLBlock: ansi.StyleBlock{},
658		HTMLSpan:  ansi.StyleBlock{},
659	}
660
661	// NoTTYStyleConfig is the default notty style.
662	NoTTYStyleConfig = ASCIIStyleConfig
663
664	// DefaultStyles are the default styles.
665	DefaultStyles = map[string]*ansi.StyleConfig{
666		AsciiStyle: &ASCIIStyleConfig,
667		DarkStyle:  &DarkStyleConfig,
668		LightStyle: &LightStyleConfig,
669		NoTTYStyle: &NoTTYStyleConfig,
670		PinkStyle:  &PinkStyleConfig,
671
672		// Popular themes
673		DraculaStyle:    &DraculaStyleConfig,
674		TokyoNightStyle: &TokyoNightStyleConfig,
675	}
676)
677
678func boolPtr(b bool) *bool       { return &b }
679func stringPtr(s string) *string { return &s }
680func uintPtr(u uint) *uint       { return &u }