Coverage for snippets/models.py: 100.00%
29 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-29 13:21 -0700
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-29 13:21 -0700
1from django.contrib.auth import get_user_model
2from django.db import models
3from pygments import highlight
4from pygments.formatters.html import HtmlFormatter
5from pygments.lexers import get_all_lexers, get_lexer_by_name
6from pygments.styles import get_all_styles
8LEXERS = [item for item in get_all_lexers() if item[1]]
9LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
10STYLE_CHOICES = sorted((item, item) for item in get_all_styles())
13class Snippet(models.Model):
14 created = models.DateTimeField(auto_now_add=True)
15 title = models.CharField(max_length=100, blank=True, default="")
16 code = models.TextField()
17 linenos = models.BooleanField(default=False)
18 language = models.CharField(
19 choices=LANGUAGE_CHOICES, default="python", max_length=100
20 )
21 style = models.CharField(choices=STYLE_CHOICES, default="friendly", max_length=100)
22 owner = models.ForeignKey(
23 get_user_model(), related_name="snippets", on_delete=models.CASCADE
24 )
25 highlighted = models.TextField()
27 class Meta:
28 ordering = ("created",)
30 def __str__(self):
31 return self.title 1b
33 def save(self, *args, **kwargs):
34 """
35 Use the 'pygments' library to create a highlighted HTML
36 representation of the code snippet.
37 """
38 lexer = get_lexer_by_name(self.language)
39 linenos = "table" if self.linenos else False
40 options = {"title": self.title} if self.title else {}
41 formatter = HtmlFormatter(
42 style=self.style, linenos=linenos, full=True, **options
43 )
44 self.highlighted = highlight(self.code, lexer, formatter)
45 super().save(*args, **kwargs)