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

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 

7 

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()) 

11 

12 

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() 

26 

27 class Meta: 

28 ordering = ("created",) 

29 

30 def __str__(self): 

31 return self.title 1b

32 

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)