|
@ -2,7 +2,8 @@ import os |
|
|
import json |
|
|
import json |
|
|
from flask import Flask, request, render_template, redirect, url_for |
|
|
from flask import Flask, request, render_template, redirect, url_for |
|
|
from urllib.request import urlopen |
|
|
from urllib.request import urlopen |
|
|
from urllib.parse import urlencode |
|
|
from urllib.parse import urlencode, urlparse |
|
|
|
|
|
import subprocess |
|
|
|
|
|
|
|
|
# To sanitize Flask input fields |
|
|
# To sanitize Flask input fields |
|
|
from markupsafe import Markup, escape |
|
|
from markupsafe import Markup, escape |
|
@ -23,9 +24,9 @@ def get_pad_content(pad_name, ext=""): |
|
|
if ext: |
|
|
if ext: |
|
|
pad_name = f'{ pad_name }{ ext }' |
|
|
pad_name = f'{ pad_name }{ ext }' |
|
|
|
|
|
|
|
|
print(pad_name) |
|
|
# print(pad_name) |
|
|
|
|
|
|
|
|
arguments = { |
|
|
arguments = { |
|
|
'padID' : pad_name, |
|
|
'padID' : pad_name, |
|
|
'apikey' : APP.config['PAD_API_KEY'] |
|
|
'apikey' : APP.config['PAD_API_KEY'] |
|
|
} |
|
|
} |
|
@ -43,7 +44,7 @@ def get_pad_content(pad_name, ext=""): |
|
|
return content |
|
|
return content |
|
|
|
|
|
|
|
|
def all_pads(): |
|
|
def all_pads(): |
|
|
arguments = { |
|
|
arguments = { |
|
|
'apikey' : APP.config['PAD_API_KEY'], |
|
|
'apikey' : APP.config['PAD_API_KEY'], |
|
|
} |
|
|
} |
|
|
api_call = 'listAllPads' |
|
|
api_call = 'listAllPads' |
|
@ -62,10 +63,12 @@ def create_pad_on_first_run(name, ext): |
|
|
default_template = 'templates/default.md' |
|
|
default_template = 'templates/default.md' |
|
|
elif 'css' in ext: |
|
|
elif 'css' in ext: |
|
|
default_template = 'templates/default.css' |
|
|
default_template = 'templates/default.css' |
|
|
|
|
|
elif 'template' in ext: |
|
|
|
|
|
default_template = 'templates/default.template.html' |
|
|
default_template = open(default_template).read() |
|
|
default_template = open(default_template).read() |
|
|
|
|
|
|
|
|
# Create pad and add the default template |
|
|
# Create pad and add the default template |
|
|
arguments = { |
|
|
arguments = { |
|
|
'padID' : pad, |
|
|
'padID' : pad, |
|
|
'apikey' : APP.config['PAD_API_KEY'], |
|
|
'apikey' : APP.config['PAD_API_KEY'], |
|
|
'text' : default_template |
|
|
'text' : default_template |
|
@ -73,16 +76,22 @@ def create_pad_on_first_run(name, ext): |
|
|
api_call = 'createPad' |
|
|
api_call = 'createPad' |
|
|
json.load(urlopen(f"{ APP.config['PAD_API_URL'] }/{ api_call }", data=urlencode(arguments).encode())) |
|
|
json.load(urlopen(f"{ APP.config['PAD_API_URL'] }/{ api_call }", data=urlencode(arguments).encode())) |
|
|
|
|
|
|
|
|
def md_to_html(md_pad_content): |
|
|
def md_to_html(md_pad_content, name): |
|
|
# Convert Markdown to HTML |
|
|
# Convert Markdown to HTML, using the template from the NAME.template.html pad |
|
|
# html = markdown.markdown(md_pad_content, extensions=['meta', 'attr_list']) # attr_list does not work |
|
|
protocol = urlparse(request.base_url).scheme + "://" |
|
|
html = pypandoc.convert_text(md_pad_content, 'html', format='md') |
|
|
hostname = urlparse(request.base_url).netloc |
|
|
|
|
|
domain = protocol + hostname |
|
|
|
|
|
template_url = f"{ domain }{ APP.config['APPLICATION_ROOT'] }{ name }/template.html" |
|
|
|
|
|
md_url = f"{ domain }{ APP.config['APPLICATION_ROOT'] }{ name }/pad.md" |
|
|
|
|
|
# html = pypandoc.convert_text(md_pad_content, 'html', format='md', extra_args=[f'--template={ template_url }', '--standalone']) |
|
|
|
|
|
result = subprocess.run(["pandoc", "--from", "markdown", "--to", "html", "--template", f"{ template_url }", md_url], capture_output=True, text=True) |
|
|
|
|
|
html = result.stdout |
|
|
|
|
|
|
|
|
# Sanitize the Markdown |
|
|
# Sanitize the Markdown |
|
|
# html = bleach.clean(html) |
|
|
# html = bleach.clean(html) |
|
|
|
|
|
|
|
|
# Another built-in Flask way to sanitize |
|
|
# Another built-in Flask way to sanitize |
|
|
# html = escape(html) |
|
|
# html = escape(html) |
|
|
html = Markup(html) |
|
|
html = Markup(html) |
|
|
|
|
|
|
|
|
return html |
|
|
return html |
|
@ -102,10 +111,10 @@ def index(): |
|
|
name = False |
|
|
name = False |
|
|
if request.values.get('name'): |
|
|
if request.values.get('name'): |
|
|
name = escape(request.values.get('name')) # Returns a Markup() object, which is "None" when False |
|
|
name = escape(request.values.get('name')) # Returns a Markup() object, which is "None" when False |
|
|
if name: |
|
|
if name: |
|
|
# This is when the environment is "created" |
|
|
# This is when the environment is "created" |
|
|
# The pads are filled with the default templates (pad, stylesheet, template) |
|
|
# The pads are filled with the default templates (pad, stylesheet, template) |
|
|
exts = ['.md', '.css'] |
|
|
exts = ['.md', '.css', '.template.html'] |
|
|
for ext in exts: |
|
|
for ext in exts: |
|
|
create_pad_on_first_run(name, ext) |
|
|
create_pad_on_first_run(name, ext) |
|
|
return redirect(url_for("pad", name=name)) |
|
|
return redirect(url_for("pad", name=name)) |
|
@ -126,6 +135,11 @@ def stylesheet(name): |
|
|
url = f"{ APP.config['PAD_URL'] }/{ name }.css" |
|
|
url = f"{ APP.config['PAD_URL'] }/{ name }.css" |
|
|
return render_template('iframe.html', url=url, name=name.strip(), pad_url=APP.config['PAD_URL']) |
|
|
return render_template('iframe.html', url=url, name=name.strip(), pad_url=APP.config['PAD_URL']) |
|
|
|
|
|
|
|
|
|
|
|
@APP.route('/<name>/template/') |
|
|
|
|
|
def template(name): |
|
|
|
|
|
url = f"{ APP.config['PAD_URL'] }/{ name }.template.html" |
|
|
|
|
|
return render_template('iframe.html', url=url, name=name.strip(), pad_url=APP.config['PAD_URL']) |
|
|
|
|
|
|
|
|
@APP.route('/<name>/html/') |
|
|
@APP.route('/<name>/html/') |
|
|
def html(name): |
|
|
def html(name): |
|
|
# only here we need application root to make all the URLs work..... |
|
|
# only here we need application root to make all the URLs work..... |
|
@ -151,7 +165,7 @@ def pdf(name): |
|
|
return render_template('pdf.html', url=url, name=name.strip(), pad_url=APP.config['PAD_URL']) |
|
|
return render_template('pdf.html', url=url, name=name.strip(), pad_url=APP.config['PAD_URL']) |
|
|
|
|
|
|
|
|
# ////////////////// |
|
|
# ////////////////// |
|
|
# RENDERED RESOURCES |
|
|
# RENDERED RESOURCES |
|
|
# ////////////////// |
|
|
# ////////////////// |
|
|
# (These are not saved as a file on the server) |
|
|
# (These are not saved as a file on the server) |
|
|
|
|
|
|
|
@ -162,11 +176,25 @@ def css(name): |
|
|
|
|
|
|
|
|
return css, 200, {'Content-Type': 'text/css; charset=utf-8'} |
|
|
return css, 200, {'Content-Type': 'text/css; charset=utf-8'} |
|
|
|
|
|
|
|
|
|
|
|
@APP.route('/<name>/pad.md') |
|
|
|
|
|
def md(name): |
|
|
|
|
|
# TO GENERATE THE CONTENT IN MARKDOWN |
|
|
|
|
|
template_pad_content = get_pad_content(name, ext='.md') |
|
|
|
|
|
|
|
|
|
|
|
return template_pad_content, 200, {'Content-Type': 'text/plain; charset=utf-8'} |
|
|
|
|
|
|
|
|
|
|
|
@APP.route('/<name>/template.html') |
|
|
|
|
|
def pandoctemplate(name): |
|
|
|
|
|
# TO GENERATE THE PANDOC TEMPLATE |
|
|
|
|
|
template_pad_content = get_pad_content(name, ext='.template.html') |
|
|
|
|
|
|
|
|
|
|
|
return template_pad_content, 200, {'Content-Type': 'text/plain; charset=utf-8'} |
|
|
|
|
|
|
|
|
@APP.route('/<name>/preview.html') |
|
|
@APP.route('/<name>/preview.html') |
|
|
def preview(name): |
|
|
def preview(name): |
|
|
# TO GENERATE THE PREVIEW WEBPAGE |
|
|
# TO GENERATE THE PREVIEW WEBPAGE |
|
|
md_pad_content = get_pad_content(name, ext='.md') |
|
|
md_pad_content = get_pad_content(name, ext='.md') |
|
|
html = md_to_html(md_pad_content) |
|
|
html = md_to_html(md_pad_content, name) |
|
|
metadata = get_md_metadata(md_pad_content) |
|
|
metadata = get_md_metadata(md_pad_content) |
|
|
if metadata: |
|
|
if metadata: |
|
|
lang = metadata['language'][0] |
|
|
lang = metadata['language'][0] |
|
@ -181,7 +209,7 @@ def preview(name): |
|
|
def pagedjs(name): |
|
|
def pagedjs(name): |
|
|
# TO GENERATE THE PAGED.JS WEBPAGE |
|
|
# TO GENERATE THE PAGED.JS WEBPAGE |
|
|
md_pad_content = get_pad_content(name, ext='.md') |
|
|
md_pad_content = get_pad_content(name, ext='.md') |
|
|
html = md_to_html(md_pad_content) |
|
|
html = md_to_html(md_pad_content, name) |
|
|
metadata = get_md_metadata(md_pad_content) |
|
|
metadata = get_md_metadata(md_pad_content) |
|
|
lang = metadata['language'][0] |
|
|
lang = metadata['language'][0] |
|
|
title = metadata['title'][0] |
|
|
title = metadata['title'][0] |
|
|