# from misc import SaveFileMapping, SaveFileObject
from .api import EtherpadLiteLazyAPI
from slugify import slugify
from lazymappingstorage import LazyMappingStorage, LazyStorageObject
from flask import Blueprint, make_response, render_template
import bs4
import re
from dataclasses import dataclass
from anytree import NodeMixin
import settings
# import html
ep = EtherpadLiteLazyAPI(
url=settings.ETHERPAD_API,
exturl=settings.ETHERPAD_EXT,
keyfile=settings.ETHERPAD_KEYFILE,
groupmapper=settings.ETHERPAD_GROUP,
)
def clean_path(path):
path = path.split("/")
return "/".join([slugify(p) for p in path])
def parse_intern_page(text):
if not text:
return text
soup = bs4.BeautifulSoup(text, "html.parser")
textNodes = soup.findAll(text=True)
entities = {
"internallinks": re.findall(r"\[(\w+)\]", text),
"tags": re.findall(r"#([\w-]+)\s?", text),
}
if not textNodes:
return text
for textNode in textNodes:
text = re.sub(r"\[(\w+)\]", r'\g<1>', str(textNode))
# text = re.sub(r"^(\w+)\:\s?(.+)$",'config param - \g<1> : \g<2> ',text)
text = re.sub(r"#([\w-]+)\s?", r'#\g<1>', text)
print(text)
textNode.replaceWith(bs4.BeautifulSoup(text, "html.parser"))
return str(soup), entities
@dataclass
class Page(LazyStorageObject, NodeMixin):
path: str = None
count: int = 1
@property
def id(self):
return slugify(self.path)
@property
def editlink(self):
return ep.getPadLink(self.id)
@property
def content(self):
return parse_intern_page(ep.getPadHTML(self.id))
class PageManager(LazyMappingStorage):
filename = "pages.yaml"
object_class = Page
def __getitem__(self, key):
o = super().__getitem__(clean_path(key))
o.path = clean_path(key)
if not o.path == "":
o.parent = self["/".join(o.path.split("/")[:-1])]
return o
def __setitem__(self, key, value):
super().__setitem__(clean_path(key), value)
pages = PageManager()
bp = Blueprint("wiki", __name__, url_prefix="/wiki")
@bp.route("/")
@bp.route("/")
def web(path=""):
page = pages[path]
pages.to_file()
response = make_response(render_template("wiki.html", page=page))
response.set_cookie("sessionID", str(ep.getSessionID("andis")), path="/etherpad")
return response