summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pypaste/server/__init__.py32
1 files changed, 22 insertions, 10 deletions
diff --git a/pypaste/server/__init__.py b/pypaste/server/__init__.py
index 1c40f71..6b8291b 100644
--- a/pypaste/server/__init__.py
+++ b/pypaste/server/__init__.py
@@ -21,7 +21,7 @@ from dataclasses import dataclass
from typing import Optional
from pypaste import log_error, log_warning, log_info
from pygments import highlight
-from pygments.lexers import guess_lexer, get_lexer_by_name
+from pygments.lexers import guess_lexer, get_lexer_by_name, get_lexer_for_mimetype
from pygments.formatters import HtmlFormatter
from pygments.styles import get_style_by_name
from abc import abstractmethod
@@ -32,15 +32,21 @@ from functools import lru_cache
@lru_cache(16)
def pygmentize(
- content: str, syntax: Optional[str], style: str, line_numbers: str | bool
+ content: str,
+ syntax: Optional[str],
+ mime: Optional[str],
+ style: str,
+ line_numbers: str | bool,
) -> str:
- if syntax is not None:
- try:
- lexer = get_lexer_by_name(syntax)
- except Exception:
- log_warning(f"failed to find lexer for {syntax}")
- lexer = guess_lexer(content)
- else:
+ try:
+ match [syntax, mime]:
+ case [str(syntax), _]:
+ lexer = get_lexer_by_name(syntax)
+ case [_, str(mime)]:
+ lexer = get_lexer_for_mimetype(mime)
+ case _:
+ lexer = guess_lexer(content)
+ except Exception:
lexer = guess_lexer(content)
try:
@@ -190,7 +196,13 @@ class App:
else:
def render():
- return pygmentize(paste.text, syntax, style, self.config.line_numbers)
+ return pygmentize(
+ paste.text,
+ syntax,
+ request.query.get("mime"),
+ style,
+ self.config.line_numbers,
+ )
highlighted = await asyncio.to_thread(render)