squash merge detect-html

This commit is contained in:
likho 2024-01-06 23:30:03 -08:00
parent 332863fb30
commit af589847e7
2 changed files with 83 additions and 30 deletions

View File

@ -11,7 +11,7 @@ Simple and stylish text-to-html microblog generator.
* `make` (optional), method for invoking the script.
* `urllib` (optional), for uploading multiple files to neocities (`neouploader.py`).
### Usage
## Usage
The following generates a sample page `result.html`.
@ -30,10 +30,6 @@ This script generate a text file after operation.
* `updatedfiles.txt`, a list of files updated by the script for use in automated uploads.
## Configuration
Settings are read from `settings.toml`. See `example/settings.toml`.
### Writing Content
See `example/demo.txt`.
@ -56,6 +52,24 @@ The content file is a plain text file of posts. Each post has two types of infor
* the two last lines of the file must be empty
* html can be placed in the message for embedded videos and rich text
## Configuration
Settings are read from `settings.toml`. See `example/settings.toml`.
Configuration options as understood by the script are tentative and may change in the future.
### A key may be missing from your settings file (KeyError)
>I'm getting KeyError when I run the program
>This script is throwing KeyError after I ran git pull
In most cases, this means I added new configuration options. You can resolve this error by copying and pasting the missing keys from `example/settings.toml` to `settings.toml`.
The following command shows differences between the files.
diff settings.toml example/settings.toml
## Anything else
This is a script I wrote for personal use. The output can be seen on [https://likho.neocities.org/microblog/index.html](https://likho.neocities.org/microblog/index.html). I figure someone else may want to use it for their own personal websites, so it is published.

View File

@ -54,6 +54,32 @@ def make_gallery(indices, w, conf=None):
return tag
# apply basic HTML formatting - only div class here is gallery
from html.parser import HTMLParser
class My_Html_Parser(HTMLParser):
def __init__(self):
super().__init__()
self.stack = []
self.completed_by = ""
def handle_starttag(self, tag, attrs):
self.stack.append(tag)
self.is_completed_by = ""
def handle_endtag(self, tag):
# ignore common inline tags
ignore = ["i", "em", "b", "strong","u", "s", "a", "span"]
# remove an item == tag from the end of the list
i = len(self.stack) - 1
last = self.stack[i]
while i > -1:
if tag == last:
self.stack.pop(i)
break
i -= 1
last = self.stack[i]
if self.stack == [] and tag not in ignore:
self.completed_by = "</%s>" % tag
from html import escape
def markup(message, config):
def is_image(s, image_formats):
@ -71,28 +97,18 @@ def markup(message, config):
return True
return False
result = 0
tagged = ""
# support multiple images (gallery style)
tags = [] # list of strings
output = []
gallery = []
ptags = config["tag_paragraphs"]
sep = ""
if "line_separator" in config:
sep = config["line_separator"]
for line in message:
images = [] # list of integers
words = line.split()
for i in range(len(words)):
word = words[i]
def automarkup(list_of_words):
images = []
tags = []
for i in range(len(list_of_words)):
word = list_of_words[i]
# don't help people click http
if word.find("src=") == 0 or word.find("href=") == 0:
continue
elif word.find("https://") != -1:
w = escape(word)
new_word = ("<a href=\"%s\">%s</a>") % (w, w)
words[i] = new_word
list_of_words[i] = new_word
elif word.find("#") != -1 and len(word) > 1:
# split by unicode blank character if present
# allows tagging such as #fanfic|tion
@ -102,17 +118,40 @@ def markup(message, config):
new_word = "<span class=\"hashtag\">%s</span>" % (w[0])
if len(w) > 1:
new_word += w[1]
words[i] = new_word
list_of_words[i] = new_word
elif is_image(word, config["accepted_images"]):
images.append(i)
if len(images) > 0:
# function invokes pop() which modifies list 'words'
gc = config["gallery"] if "gallery" in config else None
gallery = make_gallery(images, words, gc)
if ptags and len(words) > 0:
words.insert(0,"<p>")
words.append("</p>")
output.append(" ".join(words))
return list_of_words, images, tags
tags = [] # list of strings
output = []
gallery = []
ptags = config["tag_paragraphs"]
sep = ""
parser = My_Html_Parser()
if "line_separator" in config:
sep = config["line_separator"]
for line in message:
images = [] # list of integers
parser.feed(line)
if parser.stack == [] \
and (parser.completed_by == "" or parser.completed_by not in line):
words, images, t = automarkup(line.split())
tags += t
if len(images) > 0:
# function invokes pop() which modifies list 'words'
gc = config["gallery"] if "gallery" in config else None
gallery = make_gallery(images, words, gc)
elif ptags and len(words) > 0:
words.insert(0,"<p>")
words.append("</p>")
output.append(" ".join(words))
elif "pre" in parser.stack \
and ("<pre>" not in line \
and "<code>" not in line and "</code>" not in line):
output.append(escape(line))
else: # <pre> is in the parser.stack
output.append(line.strip())
# avoid paragraph with an image gallery
if len(gallery) > 0:
output.append("".join(gallery))