aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVosjedev <vosje@vosjedev.net>2025-11-09 09:07:01 +0100
committerVosjedev <vosje@vosjedev.net>2025-11-09 09:07:01 +0100
commit4ef1b675284980e4e9de8d3fbcc34e5a74dd6466 (patch)
tree18068d545a2dbf2ce780e857bc75376855927ec2
parent4ba83d1a51ffab43909028b389fc65d8045d1955 (diff)
downloadacit-4ef1b675284980e4e9de8d3fbcc34e5a74dd6466.tar.gz
acit-4ef1b675284980e4e9de8d3fbcc34e5a74dd6466.tar.bz2
acit-4ef1b675284980e4e9de8d3fbcc34e5a74dd6466.tar.xz
Highlight patch emails
-rw-r--r--src/acit/html.py89
-rw-r--r--src/acit/pagegenerator.py2
-rw-r--r--src/acit/util.py17
3 files changed, 105 insertions, 3 deletions
diff --git a/src/acit/html.py b/src/acit/html.py
index dd06c77..898a447 100644
--- a/src/acit/html.py
+++ b/src/acit/html.py
@@ -341,4 +341,93 @@ h1, h2 {
}
+.highlight {
+ /* python3 -c "from pygments.formattters import HtmlFormatter; print(HtmlFormatter(style="monokai").get_style_defs())" */
+ pre { line-height: 125%; }
+ td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+ span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+ td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+ .hll { background-color: #49483e }
+ .c { color: #959077 } /* Comment */
+ .err { color: #ED007E; background-color: #1E0010 } /* Error */
+ .esc { color: #F8F8F2 } /* Escape */
+ .g { color: #F8F8F2 } /* Generic */
+ .k { color: #66D9EF } /* Keyword */
+ .l { color: #AE81FF } /* Literal */
+ .n { color: #F8F8F2 } /* Name */
+ .o { color: #FF4689 } /* Operator */
+ .x { color: #F8F8F2 } /* Other */
+ .p { color: #F8F8F2 } /* Punctuation */
+ .ch { color: #959077 } /* Comment.Hashbang */
+ .cm { color: #959077 } /* Comment.Multiline */
+ .cp { color: #959077 } /* Comment.Preproc */
+ .cpf { color: #959077 } /* Comment.PreprocFile */
+ .c1 { color: #959077 } /* Comment.Single */
+ .cs { color: #959077 } /* Comment.Special */
+ .gd { color: #FF4689 } /* Generic.Deleted */
+ .ge { color: #F8F8F2; font-style: italic } /* Generic.Emph */
+ .ges { color: #F8F8F2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+ .gr { color: #F8F8F2 } /* Generic.Error */
+ .gh { color: #F8F8F2 } /* Generic.Heading */
+ .gi { color: #A6E22E } /* Generic.Inserted */
+ .go { color: #66D9EF } /* Generic.Output */
+ .gp { color: #FF4689; font-weight: bold } /* Generic.Prompt */
+ .gs { color: #F8F8F2; font-weight: bold } /* Generic.Strong */
+ .gu { color: #959077 } /* Generic.Subheading */
+ .gt { color: #F8F8F2 } /* Generic.Traceback */
+ .kc { color: #66D9EF } /* Keyword.Constant */
+ .kd { color: #66D9EF } /* Keyword.Declaration */
+ .kn { color: #FF4689 } /* Keyword.Namespace */
+ .kp { color: #66D9EF } /* Keyword.Pseudo */
+ .kr { color: #66D9EF } /* Keyword.Reserved */
+ .kt { color: #66D9EF } /* Keyword.Type */
+ .ld { color: #E6DB74 } /* Literal.Date */
+ .m { color: #AE81FF } /* Literal.Number */
+ .s { color: #E6DB74 } /* Literal.String */
+ .na { color: #A6E22E } /* Name.Attribute */
+ .nb { color: #F8F8F2 } /* Name.Builtin */
+ .nc { color: #A6E22E } /* Name.Class */
+ .no { color: #66D9EF } /* Name.Constant */
+ .nd { color: #A6E22E } /* Name.Decorator */
+ .ni { color: #F8F8F2 } /* Name.Entity */
+ .ne { color: #A6E22E } /* Name.Exception */
+ .nf { color: #A6E22E } /* Name.Function */
+ .nl { color: #F8F8F2 } /* Name.Label */
+ .nn { color: #F8F8F2 } /* Name.Namespace */
+ .nx { color: #A6E22E } /* Name.Other */
+ .py { color: #F8F8F2 } /* Name.Property */
+ .nt { color: #FF4689 } /* Name.Tag */
+ .nv { color: #F8F8F2 } /* Name.Variable */
+ .ow { color: #FF4689 } /* Operator.Word */
+ .pm { color: #F8F8F2 } /* Punctuation.Marker */
+ .w { color: #F8F8F2 } /* Text.Whitespace */
+ .mb { color: #AE81FF } /* Literal.Number.Bin */
+ .mf { color: #AE81FF } /* Literal.Number.Float */
+ .mh { color: #AE81FF } /* Literal.Number.Hex */
+ .mi { color: #AE81FF } /* Literal.Number.Integer */
+ .mo { color: #AE81FF } /* Literal.Number.Oct */
+ .sa { color: #E6DB74 } /* Literal.String.Affix */
+ .sb { color: #E6DB74 } /* Literal.String.Backtick */
+ .sc { color: #E6DB74 } /* Literal.String.Char */
+ .dl { color: #E6DB74 } /* Literal.String.Delimiter */
+ .sd { color: #E6DB74 } /* Literal.String.Doc */
+ .s2 { color: #E6DB74 } /* Literal.String.Double */
+ .se { color: #AE81FF } /* Literal.String.Escape */
+ .sh { color: #E6DB74 } /* Literal.String.Heredoc */
+ .si { color: #E6DB74 } /* Literal.String.Interpol */
+ .sx { color: #E6DB74 } /* Literal.String.Other */
+ .sr { color: #E6DB74 } /* Literal.String.Regex */
+ .s1 { color: #E6DB74 } /* Literal.String.Single */
+ .ss { color: #E6DB74 } /* Literal.String.Symbol */
+ .bp { color: #F8F8F2 } /* Name.Builtin.Pseudo */
+ .fm { color: #A6E22E } /* Name.Function.Magic */
+ .vc { color: #F8F8F2 } /* Name.Variable.Class */
+ .vg { color: #F8F8F2 } /* Name.Variable.Global */
+ .vi { color: #F8F8F2 } /* Name.Variable.Instance */
+ .vm { color: #F8F8F2 } /* Name.Variable.Magic */
+ .il { color: #AE81FF } /* Literal.Number.Integer.Long */
+}
+
+
"""
diff --git a/src/acit/pagegenerator.py b/src/acit/pagegenerator.py
index 939d00b..678e84c 100644
--- a/src/acit/pagegenerator.py
+++ b/src/acit/pagegenerator.py
@@ -109,7 +109,7 @@ class Generator(plugins.SimplePlugin):
date=msg.date_str,
from_=msg.from_)
currentpage+='with Subject: <i>%s</i></div>'%msg.subject
- currentpage+=email2html(msg.text)
+ currentpage+=email2html(msg.text, ispatch=msg.subject.startswith("[PATCH"))
# end block
emailsonpage+=1
diff --git a/src/acit/util.py b/src/acit/util.py
index 343fbc1..65c0816 100644
--- a/src/acit/util.py
+++ b/src/acit/util.py
@@ -17,11 +17,24 @@ def lookahead(iterable): # https://stackoverflow.com/a/1630350
# Report the last value.
yield last, True
-def email2html(mailtext:str,extraclasses=""):
+def email2html(mailtext:str,extraclasses="",ispatch=False):
#print(mailtext)
from html import escape
+ if ispatch:
+ from pygments import highlight
+ from pygments.lexers import DiffLexer
+ from pygments.formatters import HtmlFormatter
+ extraclasses+=" highlight"
+
res='<article class="email %s"><p>'%extraclasses
- mail=escape(mailtext).replace("\n\n","</p><p>").replace("\n","<br>")
+ mail=escape(mailtext)
+
+ if ispatch:
+ mail=highlight(mail,lexer=DiffLexer(),formatter=HtmlFormatter(style="monokai"))
+ else:
+ mail=mail.replace("\n\n","</p><p>").replace("\n","<br>")
+
+
res+=mail
res+="</p></article>"
return res