aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2023-05-27 19:27:26 -0400
committerBobby <[email protected]>2023-05-27 19:27:26 -0400
commit48872c66c5e1179302e24ae9df26a7ae2eab07b2 (patch)
tree1b2c650ede797443dd7a01d07a09366a88af1818
parent3a765998cc2984cf5e38bd77392409446facfeb7 (diff)
downloadthatcomputerscientist-48872c66c5e1179302e24ae9df26a7ae2eab07b2.tar.xz
thatcomputerscientist-48872c66c5e1179302e24ae9df26a7ae2eab07b2.zip
Ability to define languages in comments by tapping into `lang-<language>` markup
-rw-r--r--blog/context_processors.py34
-rw-r--r--templates/blog/post.html16
2 files changed, 41 insertions, 9 deletions
diff --git a/blog/context_processors.py b/blog/context_processors.py
index e59e6300..bc8d3039 100644
--- a/blog/context_processors.py
+++ b/blog/context_processors.py
@@ -54,7 +54,7 @@ def avatar_list():
avatar_list[directory].remove(file)
return avatar_list
-def highlight_code_blocks(code_block):
+def highlight_code_blocks(code_block, language=None):
# replace &nbsp; with space
try:
cb = code_block.string
@@ -63,11 +63,16 @@ def highlight_code_blocks(code_block):
cb = cb.replace(u'\xa0', u' ')
# guess the language as there is no data-lang attribute
- try:
- lexer = guess_lexer(cb)
- except:
- lexer = get_lexer_by_name('text')
-
+ if language:
+ try:
+ lexer = get_lexer_by_name(language.strip())
+ except:
+ lexer = get_lexer_by_name('text')
+ else:
+ try:
+ lexer = guess_lexer(cb)
+ except:
+ lexer = get_lexer_by_name('text')
# highlight the code
formatter = HtmlFormatter(noclasses=True, style='native', wrapcode=True)
highlighted_code = highlight(cb, lexer, formatter)
@@ -80,9 +85,24 @@ def comment_processor(comment):
comment = re.sub(r'>', '&gt;', comment)
# any text between ``` and ``` must be highlighted as code
+ # code_blocks = re.findall(r'```(.+?)```', comment, re.DOTALL)
+ # for code_block in code_blocks:
+ # comment = comment.replace('```' + code_block + '```', highlight_code_blocks(code_block.replace('&lt;', '<').replace('&gt;', '>')))
+
+ # new highlight code block:
+ # any text between ``` and ``` must be highlighted as code with guessed language
+ # and any text between ```lang-<language> and ``` must be highlighted as code with specified language
code_blocks = re.findall(r'```(.+?)```', comment, re.DOTALL)
for code_block in code_blocks:
- comment = comment.replace('```' + code_block + '```', highlight_code_blocks(code_block.replace('&lt;', '<').replace('&gt;', '>')))
+ if code_block.startswith('lang-'):
+ language = code_block.split('\n')[0].replace('lang-', '')
+ code_block = code_block.replace('lang-' + language + '\n', '')
+ # comment = highlight_code_blocks(code_block.replace('&lt;', '<').replace('&gt;', '>'), language)
+ comment = comment.replace('```lang-' + language + '\n' + code_block + '```', highlight_code_blocks(code_block.replace('&lt;', '<').replace('&gt;', '>'), language))
+ else:
+ comment = comment.replace('```' + code_block + '```', highlight_code_blocks(code_block.replace('&lt;', '<').replace('&gt;', '>')))
+
+
# retain line breaks, for every newline character, add a <br> tag
comment = comment.replace('\n', '<br>')
diff --git a/templates/blog/post.html b/templates/blog/post.html
index 58a7a362..67b9dda3 100644
--- a/templates/blog/post.html
+++ b/templates/blog/post.html
@@ -127,9 +127,21 @@
&nbsp;&nbsp;shortkey: <kbd>Ctrl or Cmd + D</kbd>
<br><br>
</li>
- <li>Wrap text in triple backticks (```) to make it a code block.
+ <li>Wrap text in triple backticks (```) to make it a code block:
<br>
- &nbsp;&nbsp;e.g. <code>```code block```</code>,
+ &nbsp;&nbsp;e.g.
+<pre>
+ ```
+ code block
+ ```
+</pre>
+ or define with language as:
+<pre>
+ ```lang-&lt;language&gt;
+ code block
+ ```
+</pre>
+ &nbsp;&nbsp;e.g. lang-python, lang-java, lang-javascript, etc.
&nbsp;&nbsp;shortkey: <kbd>Ctrl or Cmd + K</kbd>
<br><br>
</li>