trying to get links working again?
This commit is contained in:
parent
d52b9ddd9d
commit
85b2750204
|
@ -30,14 +30,6 @@ if args.prod:
|
||||||
build_url = config.absolute_build_url
|
build_url = config.absolute_build_url
|
||||||
|
|
||||||
|
|
||||||
def generate_config():
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def generate_page(template_file=config.template_main, options=generate_config()):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def generate_navigation(template_nav=config.template_nav):
|
def generate_navigation(template_nav=config.template_nav):
|
||||||
file_loader = FileSystemLoader('')
|
file_loader = FileSystemLoader('')
|
||||||
env = Environment(loader=file_loader)
|
env = Environment(loader=file_loader)
|
||||||
|
@ -48,6 +40,14 @@ def generate_navigation(template_nav=config.template_nav):
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def generate_head(template_head=config.template_head, page_title=config.home_name):
|
||||||
|
file_loader = FileSystemLoader('')
|
||||||
|
env = Environment(loader=file_loader)
|
||||||
|
template = env.get_template(template_head)
|
||||||
|
output = template.render(build_url=build_url, page_title=page_title, name_of_site=config.name_of_site)
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
def add_file_path(pages, root_dir):
|
def add_file_path(pages, root_dir):
|
||||||
ret = set()
|
ret = set()
|
||||||
for page in pages:
|
for page in pages:
|
||||||
|
@ -55,25 +55,30 @@ def add_file_path(pages, root_dir):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def generate_index_pages(template=config.template_main, template_nav=config.template_nav):
|
def generate_index_pages(template=config.template_main, template_nav=config.template_nav, template_head=config.template_head):
|
||||||
template = template
|
template = template
|
||||||
all_tags = TagHelper.getAllTags()
|
all_tags = TagHelper.getAllTags()
|
||||||
index_tags = config.nav_tags
|
|
||||||
metaIndexSubPages = []
|
|
||||||
for index in all_tags.keys():
|
for index in all_tags.keys():
|
||||||
pages = all_tags[index]
|
pages = all_tags[index]
|
||||||
pages = add_file_path(pages, config.content_folder[0])
|
pages = add_file_path(pages, config.files_folder)
|
||||||
entries = create_entries(pages)
|
entries = create_entries(pages)
|
||||||
# TODO this broke as well, not sure what happened to entries, but the whole page is blank?
|
# TODO this broke as well, not sure what happened to entries, but the whole page is blank?
|
||||||
subPages = generate_sub_pages(entries, len(
|
subPages = generate_sub_pages(entries, len(
|
||||||
entries), config.content_folder[0], False)
|
entries), config.files_folder, False)
|
||||||
# Build the files by filling out the template
|
# Build the files by filling out the template
|
||||||
file_loader = FileSystemLoader('')
|
file_loader = FileSystemLoader('')
|
||||||
env = Environment(loader=file_loader)
|
env = Environment(loader=file_loader)
|
||||||
# regular index pagse use main template
|
# regular index pagse use main template
|
||||||
template = env.get_template(template)
|
template = env.get_template(template)
|
||||||
current_index_template = template.render(page_body=subPages, page_date=None, page_tags=None, page_navigation=generate_navigation(
|
page_title = index.capitalize() + ' index'
|
||||||
template_nav), page_title=index.capitalize() + ' index', config=config)
|
current_index_template = template.render(
|
||||||
|
head=generate_head(template_head, page_title),
|
||||||
|
page_body=subPages,
|
||||||
|
page_date=None,
|
||||||
|
page_tags=None,
|
||||||
|
page_navigation=generate_navigation(template_nav),
|
||||||
|
page_title=page_title,
|
||||||
|
config=config)
|
||||||
slugfile = config.build_folder + index + '_index.html'
|
slugfile = config.build_folder + index + '_index.html'
|
||||||
with open(slugfile, 'w', encoding=encoding) as fobj:
|
with open(slugfile, 'w', encoding=encoding) as fobj:
|
||||||
fobj.write(current_index_template)
|
fobj.write(current_index_template)
|
||||||
|
@ -115,8 +120,15 @@ def generate_html_pages(site_folder, entries, template, sub_pages_list, template
|
||||||
template = env.get_template(template)
|
template = env.get_template(template)
|
||||||
if len(entry['tags']) > 1:
|
if len(entry['tags']) > 1:
|
||||||
entry['tags'] = entry['tags'].split(' ')
|
entry['tags'] = entry['tags'].split(' ')
|
||||||
page_template = template.render(page_body=entry['pageContent'], page_date="<date>%s</date>" % entry['date'], page_tags=entry['tags'],
|
page_template = template.render(
|
||||||
name_of_site="Kitaab", page_navigation=nav_html, page_title=entry['title'], build_url=entry['parent_text'], config=config)
|
page_body=entry['pageContent'],
|
||||||
|
page_date="<date>%s</date>" % entry['date'],
|
||||||
|
page_tags=entry['tags'],
|
||||||
|
name_of_site="Kitaab",
|
||||||
|
page_navigation=nav_html,
|
||||||
|
page_title=entry['title'],
|
||||||
|
build_url=entry['parent_text'],
|
||||||
|
config=config)
|
||||||
|
|
||||||
# Checking if content folder exists
|
# Checking if content folder exists
|
||||||
folderExists = os.path.exists(site_folder + entry['folder'])
|
folderExists = os.path.exists(site_folder + entry['folder'])
|
||||||
|
@ -261,7 +273,6 @@ def remove_title(page):
|
||||||
textContent = textContent[1:]
|
textContent = textContent[1:]
|
||||||
return '\n'.join(textContent)
|
return '\n'.join(textContent)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
|
||||||
print(f'Unexpected error in removing title in {page}')
|
print(f'Unexpected error in removing title in {page}')
|
||||||
return page
|
return page
|
||||||
|
|
||||||
|
@ -273,7 +284,7 @@ def remove_date(page):
|
||||||
return page
|
return page
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
print(f'Unexpected error in removing title in {page}')
|
print(f'Unexpected error in removing date in {page}')
|
||||||
return page
|
return page
|
||||||
|
|
||||||
|
|
||||||
|
@ -284,7 +295,7 @@ def replacement_function(replace):
|
||||||
# TODO gross hardcoded
|
# TODO gross hardcoded
|
||||||
lines = []
|
lines = []
|
||||||
# this file should probably be an asset??
|
# this file should probably be an asset??
|
||||||
with open(config.content_folder[0] + '210124-0033.wiki') as f:
|
with open(config.files_folder + '210124-0033.wiki') as f:
|
||||||
lines = f.readlines()
|
lines = f.readlines()
|
||||||
lines = lines[-2:]
|
lines = lines[-2:]
|
||||||
line1 = lines[0].split(',')
|
line1 = lines[0].split(',')
|
||||||
|
@ -496,12 +507,6 @@ def generate_sub_pages(entries, num, folder, title, title_name=""):
|
||||||
return sub_page_list
|
return sub_page_list
|
||||||
|
|
||||||
|
|
||||||
def fill_template_defaults(template):
|
|
||||||
template = template.replace('page_title', config.home_name)
|
|
||||||
template = template.replace('build_url', build_url)
|
|
||||||
return template
|
|
||||||
|
|
||||||
|
|
||||||
# Creates the home page using home.md
|
# Creates the home page using home.md
|
||||||
def create_home_page(template, site_folder):
|
def create_home_page(template, site_folder):
|
||||||
|
|
||||||
|
@ -528,8 +533,8 @@ def create_rss_feed(rss_entries, rss_template, rss_item_template, site_folder):
|
||||||
entry_template = itemTemplate
|
entry_template = itemTemplate
|
||||||
entry_template = entry_template.replace(
|
entry_template = entry_template.replace(
|
||||||
'rssItemTitle', rss_entry["title"])
|
'rssItemTitle', rss_entry["title"])
|
||||||
entry_template = entry_template.replace('rssItemUrl', build_url +
|
entry_template = entry_template.replace('rssItemUrl', build_url
|
||||||
rss_entry["slug"])
|
+ rss_entry["slug"])
|
||||||
entry_template = entry_template.replace(
|
entry_template = entry_template.replace(
|
||||||
'rssItemDate', rss_entry["iso_date"])
|
'rssItemDate', rss_entry["iso_date"])
|
||||||
entry_template = entry_template.replace(
|
entry_template = entry_template.replace(
|
||||||
|
@ -563,26 +568,21 @@ def generate_website():
|
||||||
# Get main html template
|
# Get main html template
|
||||||
file_loader = FileSystemLoader('')
|
file_loader = FileSystemLoader('')
|
||||||
env = Environment(loader=file_loader)
|
env = Environment(loader=file_loader)
|
||||||
home_page = env.get_template(
|
home_page = env.get_template(config.template_main)
|
||||||
config.template_main) # TODO maybe not hardcode
|
|
||||||
# home_page = create_home_page(template, config.build_folder)
|
|
||||||
|
|
||||||
generate_index_pages(config.template_main, config.template_nav)
|
generate_index_pages(config.template_main, config.template_nav)
|
||||||
|
|
||||||
rss_entries = []
|
rss_entries = []
|
||||||
home_pageSubList = []
|
home_pageSubList = []
|
||||||
for folder in config.content_folder:
|
|
||||||
pages = glob.glob(folder + '**/*.wiki', recursive=True)
|
pages = glob.glob(config.files_folder + '**/*.wiki', recursive=True)
|
||||||
entries = create_entries(pages)
|
entries = create_entries(pages)
|
||||||
sub_pages_list = generate_sub_pages(
|
sub_pages_list = generate_sub_pages(
|
||||||
entries, len(entries), folder, False)
|
entries, len(entries), config.files_folder, False)
|
||||||
|
|
||||||
# For each section, create a short listing of sub pages
|
# For each section, create a short listing of sub pages
|
||||||
# and add it to the home page
|
# and add it to the home page
|
||||||
home_pageSubList = generate_sub_pages(entries, 50, folder, False)
|
home_pageSubList = generate_sub_pages(entries, 50, config.files_folder, False)
|
||||||
# home_page = home_page.replace('content_list', home_pageSubList +
|
|
||||||
# "content_list")
|
|
||||||
# home_page = home_page.replace('page_date', "")
|
|
||||||
|
|
||||||
generate_html_pages(config.build_folder, entries, config.template_main,
|
generate_html_pages(config.build_folder, entries, config.template_main,
|
||||||
sub_pages_list, config.template_nav)
|
sub_pages_list, config.template_nav)
|
||||||
|
@ -595,15 +595,14 @@ def generate_website():
|
||||||
move_files(config.build_folder, config.medias_folder)
|
move_files(config.build_folder, config.medias_folder)
|
||||||
|
|
||||||
# Once all sections have been processed, finish the home page
|
# Once all sections have been processed, finish the home page
|
||||||
# Removes the "content_list" in the partial
|
home_page = home_page.render(
|
||||||
# home_page = home_page.replace('content_list', "")
|
head=generate_head(page_title="Recent Files"),
|
||||||
# home_page = home_page.replace('name_of_site', config.name_of_site)
|
page_body=home_pageSubList,
|
||||||
# home_page = home_page.replace('site_meta_description',
|
page_date=None,
|
||||||
# config.site_meta_description)
|
page_tags=None,
|
||||||
# home_page = home_page.replace(
|
page_navigation=generate_navigation(),
|
||||||
# 'twitter_name', config.twitter_name)
|
page_title="Recent Files",
|
||||||
home_page = home_page.render(page_body=home_pageSubList, page_date=None, page_tags=None,
|
config=config)
|
||||||
page_navigation=generate_navigation(), page_title="Recent Files", config=config)
|
|
||||||
|
|
||||||
slug_file = config.build_folder + "recents.html"
|
slug_file = config.build_folder + "recents.html"
|
||||||
with open(slug_file, 'w', encoding=encoding) as fobj:
|
with open(slug_file, 'w', encoding=encoding) as fobj:
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
import pypandoc
|
|
||||||
|
|
||||||
def convert_file(file):
|
|
||||||
filename = file.strip('wiki')[:-1] # filenames can contain ../ ./ etc, so we strip only the final wiki, and then drop the last character which is a '.'
|
|
||||||
pypandoc.convert_file(filename + '.wiki', 'md',format='vimwiki', outputfile=filename + '.md')
|
|
||||||
|
|
||||||
def convert_files(files):
|
|
||||||
for file in files:
|
|
||||||
convert_file(file)
|
|
||||||
|
|
|
@ -1,101 +0,0 @@
|
||||||
#! /usr/bin/env python3
|
|
||||||
|
|
||||||
# Various methods of grabbing files from Kitaab
|
|
||||||
# based on their ctags as generated by vimwiki
|
|
||||||
# censor - burn all mentions of this word wherever it appears in Kitaab
|
|
||||||
# filter - leave names in tact but do not link to relevant documents
|
|
||||||
# create - list in an index file for website
|
|
||||||
from basant.shared import TagHelper, config, helpers
|
|
||||||
from basant.shared import censor as c
|
|
||||||
from os import listdir, mkdir, path, remove
|
|
||||||
import shutil
|
|
||||||
from . import convert
|
|
||||||
import os
|
|
||||||
|
|
||||||
# TODO: generalize based on headings(?) in index.wiki
|
|
||||||
|
|
||||||
censor = c.privateList
|
|
||||||
# TODO put this in config too...
|
|
||||||
filter = ["dream", "gratitude", "review", "jrnl", "work", "job", "debt",
|
|
||||||
"people", "priv", "threatdefence", "info"]
|
|
||||||
# TODO create = ...
|
|
||||||
outputBasePath = config.raw_folder
|
|
||||||
|
|
||||||
|
|
||||||
def filterFiles(AllFileList):
|
|
||||||
toFilter = filter + censor
|
|
||||||
tagList = TagHelper.getAllTags()
|
|
||||||
doNotTakeFiles = set()
|
|
||||||
for mask in toFilter:
|
|
||||||
try:
|
|
||||||
doNotTakeFiles.update(tagList[mask])
|
|
||||||
except KeyError:
|
|
||||||
print("Key not found: {}".format(mask))
|
|
||||||
return AllFileList - doNotTakeFiles
|
|
||||||
|
|
||||||
|
|
||||||
def copyFiles(fileList):
|
|
||||||
baseFilePath = config.files_folder
|
|
||||||
outputFilePath = outputBasePath
|
|
||||||
try:
|
|
||||||
mkdir(outputFilePath)
|
|
||||||
except FileExistsError:
|
|
||||||
pass
|
|
||||||
for f in fileList:
|
|
||||||
try:
|
|
||||||
shutil.copy(baseFilePath + f, outputFilePath + f)
|
|
||||||
except FileNotFoundError:
|
|
||||||
print("Could not copy file {} to {}".format(baseFilePath+f,
|
|
||||||
outputFilePath+f))
|
|
||||||
|
|
||||||
|
|
||||||
def censorFiles(outputBasePath=outputBasePath):
|
|
||||||
for fileName in listdir(outputBasePath):
|
|
||||||
if not path.isfile(outputBasePath + fileName):
|
|
||||||
continue
|
|
||||||
fileName = outputBasePath + fileName
|
|
||||||
newFile = ""
|
|
||||||
with open(fileName, 'r', errors='ignore') as f:
|
|
||||||
for line in f.readlines():
|
|
||||||
for c in censor:
|
|
||||||
line = line.replace(c, helpers.generateBlocks(len(c)))
|
|
||||||
newFile = newFile + line
|
|
||||||
with open(fileName, 'w') as f:
|
|
||||||
for line in newFile:
|
|
||||||
f.write(line)
|
|
||||||
|
|
||||||
|
|
||||||
def convertFiles(outputBasePath=outputBasePath):
|
|
||||||
for filename in listdir(outputBasePath):
|
|
||||||
if not path.isfile(outputBasePath + filename):
|
|
||||||
continue
|
|
||||||
if '.md' == filename[-3:]:
|
|
||||||
print(f"{filename} file already converted, skipping")
|
|
||||||
continue
|
|
||||||
try:
|
|
||||||
convert.convert_file(outputBasePath + filename)
|
|
||||||
remove(outputBasePath + filename)
|
|
||||||
except RuntimeError as e:
|
|
||||||
print(f"Could not convert file {outputBasePath+filename}: {e}")
|
|
||||||
|
|
||||||
|
|
||||||
def deleteOldRaw():
|
|
||||||
if os.path.exists(config.raw_folder):
|
|
||||||
shutil.rmtree(config.raw_folder)
|
|
||||||
|
|
||||||
|
|
||||||
def grabFiles():
|
|
||||||
deleteOldRaw()
|
|
||||||
AllFiles = TagHelper.getAllFiles()
|
|
||||||
FilteredFiles = filterFiles(AllFiles)
|
|
||||||
copyFiles(FilteredFiles)
|
|
||||||
print("Censoring files...")
|
|
||||||
censorFiles()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
# network = loadNetwork()
|
|
||||||
# network = censorNetwork(network)
|
|
||||||
# print("Converting files...")
|
|
||||||
# convertFiles()
|
|
||||||
grabFiles()
|
|
|
@ -1,25 +0,0 @@
|
||||||
import json
|
|
||||||
import networkx as nx
|
|
||||||
import pygraphviz
|
|
||||||
|
|
||||||
def loadJson(file):
|
|
||||||
with open(file, 'r') as f:
|
|
||||||
return json.load(f)
|
|
||||||
|
|
||||||
def makeNetwork(json):
|
|
||||||
G = nx.DiGraph()
|
|
||||||
for (key, value) in json.items():
|
|
||||||
G.add_nodes_from([key] + value)
|
|
||||||
G.add_edges_from([(key, v) for v in value])
|
|
||||||
return G
|
|
||||||
|
|
||||||
def makeAGraph(graph):
|
|
||||||
G = nx.nx_agraph.to_agraph(graph)
|
|
||||||
G.draw("nop.png", prog="nop")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
OUTFILE = 'network.json'
|
|
||||||
json = loadJson('network.json')
|
|
||||||
graph = makeNetwork(json)
|
|
||||||
with open(OUTFILE, 'w') as f:
|
|
||||||
json.dump(f, makeAGraph(graph))
|
|
|
@ -1,35 +0,0 @@
|
||||||
import json
|
|
||||||
import random
|
|
||||||
from basant.shared import helpers
|
|
||||||
import basant.shared.censor
|
|
||||||
|
|
||||||
censor = basant.shared.censor.privateList
|
|
||||||
|
|
||||||
|
|
||||||
def loadNetwork(path='network.json'):
|
|
||||||
# Loads the network.json file
|
|
||||||
with open(path, 'r') as f:
|
|
||||||
everything = json.load(f)
|
|
||||||
return everything
|
|
||||||
|
|
||||||
|
|
||||||
def setNetwork(everything):
|
|
||||||
# Everything is loaded from the network.json file
|
|
||||||
# keys = set(everything.network())
|
|
||||||
network = ""
|
|
||||||
values = set(everything.values())
|
|
||||||
everything = network + values
|
|
||||||
return everything
|
|
||||||
|
|
||||||
|
|
||||||
def censorNetwork(network):
|
|
||||||
# Takes network as a set
|
|
||||||
for c in censor:
|
|
||||||
if c in network:
|
|
||||||
network.add(helpers.generateBlocks(len(c) + random.randint(0, 5)))
|
|
||||||
network.remove(c)
|
|
||||||
return network
|
|
||||||
|
|
||||||
|
|
||||||
def createIndexNode(network):
|
|
||||||
pass
|
|
|
@ -1,120 +0,0 @@
|
||||||
#! /usr/bin/env python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
from icecream import ic
|
|
||||||
import json
|
|
||||||
|
|
||||||
"""network-vimwiki.py
|
|
||||||
Create site map for vimwiki.
|
|
||||||
Must run script under vimwiki directory.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
output network map to network.json
|
|
||||||
dfsvw.py
|
|
||||||
|
|
||||||
Python version: 3"""
|
|
||||||
import sys
|
|
||||||
import re
|
|
||||||
|
|
||||||
linkRE = re.compile(r'\[\[([^\\\]|#]+)(?:#[^\\\]|]+)?(?:\|([^\\\]]+))?\]\]', re.UNICODE)
|
|
||||||
|
|
||||||
def probeLink(s):
|
|
||||||
"""
|
|
||||||
>>> probeLink(' abc')
|
|
||||||
[]
|
|
||||||
>>> probeLink(' [[]]')
|
|
||||||
[]
|
|
||||||
>>> probeLink(' [[abc]] [[abc|123]] ')
|
|
||||||
[('abc', ''), ('abc', '123')]
|
|
||||||
>>> a, b = probeLink(' [[中文1|中文2]]')[0]; print a, b
|
|
||||||
中文1 中文2
|
|
||||||
>>> probeLink(' [[abc|abc 123]]')
|
|
||||||
[('abc', 'abc 123')]
|
|
||||||
"""
|
|
||||||
ret = linkRE.findall(s)
|
|
||||||
return [(a, b) for a, b in ret]
|
|
||||||
|
|
||||||
|
|
||||||
def probeAllLink(fn):
|
|
||||||
"""extract all link in a wiki file"""
|
|
||||||
try:
|
|
||||||
lst = []
|
|
||||||
print(fn)
|
|
||||||
fp = open(fn)
|
|
||||||
for line in fp.readlines():
|
|
||||||
l = probeLink(line)
|
|
||||||
lst.extend(l)
|
|
||||||
except IOError:
|
|
||||||
print("cannot open",sys.stderr)
|
|
||||||
except UnicodeDecodeError:
|
|
||||||
lst = []
|
|
||||||
fp = open(fn, encoding="utf-16BE")
|
|
||||||
for line in fp.readlines():
|
|
||||||
l = probeLink(line)
|
|
||||||
lst.extend(l)
|
|
||||||
return lst
|
|
||||||
|
|
||||||
|
|
||||||
def outputNode(link, name, level):
|
|
||||||
"""output one wiki node, level for vimwiki tree hierarchy"""
|
|
||||||
""" Unused """
|
|
||||||
prefix = " " * 4 * level
|
|
||||||
if not name:
|
|
||||||
name = link
|
|
||||||
dct = {"prefix":prefix, "link":link, "name":name}
|
|
||||||
if sys.stdout.isatty():
|
|
||||||
fmt = "{prefix}{name}"
|
|
||||||
else:
|
|
||||||
if link == name:
|
|
||||||
fmt = "{prefix}[[{name}]]"
|
|
||||||
else:
|
|
||||||
fmt = "{prefix}[[{link}|{name}]]"
|
|
||||||
print(fmt.format(**dct))
|
|
||||||
|
|
||||||
def addNode(link, node, name, graph):
|
|
||||||
""" adds a node to the dictionary that tracks edges"""
|
|
||||||
if name:
|
|
||||||
node = name
|
|
||||||
if link in graph.keys():
|
|
||||||
graph[link].add(node)
|
|
||||||
else:
|
|
||||||
graph[link] = {node}
|
|
||||||
|
|
||||||
def bfs(index):
|
|
||||||
"""breath first search on vimwiki
|
|
||||||
keep seen and unseen to track which files to search
|
|
||||||
ugly loops instead of recursive setup """
|
|
||||||
seen = set()
|
|
||||||
unseen = [index]
|
|
||||||
graph = {}
|
|
||||||
filecount = 0
|
|
||||||
while 1:
|
|
||||||
try:
|
|
||||||
link = unseen.pop(0)
|
|
||||||
except IndexError:
|
|
||||||
print("Search complete...")
|
|
||||||
ic(filecount)
|
|
||||||
return graph
|
|
||||||
seen.add(link)
|
|
||||||
ret = probeAllLink(link + '.wiki')
|
|
||||||
for (node, name) in ret:
|
|
||||||
addNode(link, node, name, graph)
|
|
||||||
if not node in seen:
|
|
||||||
unseen.append(node)
|
|
||||||
filecount = filecount + 1
|
|
||||||
ic(filecount)
|
|
||||||
ic(seen)
|
|
||||||
|
|
||||||
def transformGraph(graph):
|
|
||||||
for key, value in graph.items():
|
|
||||||
graph[key] = list(value)
|
|
||||||
return graph
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
graph = bfs('index')
|
|
||||||
print("Transforming Graph...")
|
|
||||||
graph = transformGraph(graph)
|
|
||||||
print("Transform Complete...")
|
|
||||||
ic(graph)
|
|
||||||
print("Outputting file")
|
|
||||||
with open('network.json', 'w+') as out:
|
|
||||||
json.dump(graph, out)
|
|
42
basant/partial/head.html
Normal file
42
basant/partial/head.html
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>{{page_title}} | {{config.name_of_site}}</title>
|
||||||
|
<meta property="og:title" content="{{page_title}} | {{config.name_of_site}}">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:description"
|
||||||
|
content="config.site_meta_description">
|
||||||
|
<meta property="og:site_name" content="{{config.name_of_site}}">
|
||||||
|
<meta property="og:url" content="{{build_url}}">
|
||||||
|
<meta property="og:image" content="assets/social.png">
|
||||||
|
<meta property="og:image:height" content="300">
|
||||||
|
<meta property="og:image:width" content="300">
|
||||||
|
<meta property="og:image:type" content="image/jpeg">
|
||||||
|
<link rel="stylesheet" href="assets/style.css" type="text/css"
|
||||||
|
media="screen" title="no title" charset="utf-8">
|
||||||
|
<!-- Mastodon stuff should go here
|
||||||
|
<meta name="twitter:site" content="config.twitter_name">
|
||||||
|
<meta name="twitter:title" content="page_title | config.name_of_site">
|
||||||
|
<meta name="twitter:image" content="{{build_url}}assets/social.png">
|
||||||
|
<meta name="twitter:image:alt" content="page_title | config.name_of_site">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="assets/main.css" type="text/css">
|
||||||
|
--!>
|
||||||
|
<link rel="apple-touch-icon" sizes="57x57" href="{{build_url}}assets/apple-icon-57x57.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="60x60" href="{{build_url}}assets/apple-icon-60x60.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="72x72" href="{{build_url}}assets/apple-icon-72x72.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="76x76" href="{{build_url}}assets/apple-icon-76x76.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="114x114" href="{{build_url}}assets/apple-icon-114x114.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="120x120" href="{{build_url}}assets/apple-icon-120x120.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="144x144" href="{{build_url}}assets/apple-icon-144x144.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="152x152" href="{{build_url}}assets/apple-icon-152x152.png">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="{{build_url}}assets/apple-icon-180x180.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="192x192" href="{{build_url}}assets/android-icon-192x192.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="{{build_url}}assets/favicon-32x32.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="96x96" href="{{build_url}}assets/favicon-96x96.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="{{build_url}}assets/favicon-16x16.png">
|
||||||
|
<meta name="msapplication-TileColor" content="#5927e0">
|
||||||
|
<meta name="msapplication-TileImage" content="{{build_url}}assets/ms-icon-144x144.png">
|
||||||
|
<meta name="theme-color" content="#5927e0">
|
||||||
|
<link rel="canonical" href="{{build_url}}">
|
||||||
|
</head>
|
|
@ -1,48 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
{{head}}
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>{{page_title}} | {{config.name_of_site}}</title>
|
|
||||||
<meta property="og:title" content="{{page_title}} | {{config.name_of_site}}">
|
|
||||||
<meta property="og:type" content="website">
|
|
||||||
<meta property="og:description"
|
|
||||||
content="config.site_meta_description">
|
|
||||||
<meta property="og:site_name" content="{{config.name_of_site}}">
|
|
||||||
<meta property="og:url" content="build_url">
|
|
||||||
<meta property="og:image" content="build_urlassets/social.png">
|
|
||||||
<meta property="og:image:height" content="300">
|
|
||||||
<meta property="og:image:width" content="300">
|
|
||||||
<meta property="og:image:type" content="image/jpeg">
|
|
||||||
<link rel="stylesheet" href="asset/style.css" type="text/css"
|
|
||||||
media="screen" title="no title" charset="utf-8">
|
|
||||||
<!-- Mastodon stuff should go here
|
|
||||||
<meta name="twitter:site" content="config.twitter_name">
|
|
||||||
<meta name="twitter:title" content="page_title | config.name_of_site">
|
|
||||||
<meta name="twitter:image" content="build_urlassets/social.png">
|
|
||||||
<meta name="twitter:image:alt" content="page_title | config.name_of_site">
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="assets/main.css">
|
|
||||||
--!>
|
|
||||||
<link rel="apple-touch-icon" sizes="57x57" href="build_urlassets/apple-icon-57x57.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="60x60" href="build_urlassets/apple-icon-60x60.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="72x72" href="build_urlassets/apple-icon-72x72.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="76x76" href="build_urlassets/apple-icon-76x76.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="114x114" href="build_urlassets/apple-icon-114x114.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="120x120" href="build_urlassets/apple-icon-120x120.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="144x144" href="build_urlassets/apple-icon-144x144.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="152x152" href="build_urlassets/apple-icon-152x152.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="build_urlassets/apple-icon-180x180.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="192x192" href="build_urlassets/android-icon-192x192.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="build_urlassets/favicon-32x32.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="96x96" href="build_urlassets/favicon-96x96.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="build_urlassets/favicon-16x16.png">
|
|
||||||
<meta name="msapplication-TileColor" content="#5927e0">
|
|
||||||
<meta name="msapplication-TileImage" content="build_urlassets/ms-icon-144x144.png">
|
|
||||||
<meta name="theme-color" content="#5927e0">
|
|
||||||
<link rel="canonical" href="{{build_url}}">
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body class="flow-large container">
|
<body class="flow-large container">
|
||||||
<header>
|
<header>
|
||||||
|
|
|
@ -1,48 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
|
|
||||||
<head>
|
{{head}}
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>{{page_title}} | {{config.name_of_site}}</title>
|
|
||||||
<meta property="og:title" content="{{page_title}} | {{config.name_of_site}}">
|
|
||||||
<meta property="og:type" content="website">
|
|
||||||
<meta property="og:description"
|
|
||||||
content="config.site_meta_description">
|
|
||||||
<meta property="og:site_name" content="{{config.name_of_site}}">
|
|
||||||
<meta property="og:url" content="{{build_url}}">
|
|
||||||
<meta property="og:image" content="assets/social.png">
|
|
||||||
<meta property="og:image:height" content="300">
|
|
||||||
<meta property="og:image:width" content="300">
|
|
||||||
<meta property="og:image:type" content="image/jpeg">
|
|
||||||
<link rel="stylesheet" href="assets/style.css" type="text/css"
|
|
||||||
media="screen" title="no title" charset="utf-8">
|
|
||||||
<!-- Mastodon stuff should go here
|
|
||||||
<meta name="twitter:site" content="config.twitter_name">
|
|
||||||
<meta name="twitter:title" content="page_title | config.name_of_site">
|
|
||||||
<meta name="twitter:image" content="{{build_url}}assets/social.png">
|
|
||||||
<meta name="twitter:image:alt" content="page_title | config.name_of_site">
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="assets/main.css" type="text/css">
|
|
||||||
--!>
|
|
||||||
<link rel="apple-touch-icon" sizes="57x57" href="{{build_url}}assets/apple-icon-57x57.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="60x60" href="{{build_url}}assets/apple-icon-60x60.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="72x72" href="{{build_url}}assets/apple-icon-72x72.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="76x76" href="{{build_url}}assets/apple-icon-76x76.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="114x114" href="{{build_url}}assets/apple-icon-114x114.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="120x120" href="{{build_url}}assets/apple-icon-120x120.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="144x144" href="{{build_url}}assets/apple-icon-144x144.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="152x152" href="{{build_url}}assets/apple-icon-152x152.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="{{build_url}}assets/apple-icon-180x180.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="192x192" href="{{build_url}}assets/android-icon-192x192.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="{{build_url}}assets/favicon-32x32.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="96x96" href="{{build_url}}assets/favicon-96x96.png">
|
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="{{build_url}}assets/favicon-16x16.png">
|
|
||||||
<meta name="msapplication-TileColor" content="#5927e0">
|
|
||||||
<meta name="msapplication-TileImage" content="{{build_url}}assets/ms-icon-144x144.png">
|
|
||||||
<meta name="theme-color" content="#5927e0">
|
|
||||||
<link rel="canonical" href="{{build_url}}">
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body class="flow-large container">
|
<body class="flow-large container">
|
||||||
<header>
|
<header>
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
from ctags import CTags, TagEntry
|
from ctags import CTags, TagEntry
|
||||||
import sys
|
import sys
|
||||||
from os import listdir, path
|
from os import listdir, path
|
||||||
from . import config, censor as c
|
from . import config
|
||||||
|
|
||||||
privateList = c.privateList
|
|
||||||
|
|
||||||
|
|
||||||
def getAllFiles():
|
def getAllFiles():
|
||||||
|
@ -13,20 +11,6 @@ def getAllFiles():
|
||||||
return files
|
return files
|
||||||
|
|
||||||
|
|
||||||
def untaggedFiles(AllFileList=getAllFiles()):
|
|
||||||
# TODO broken
|
|
||||||
censor = []
|
|
||||||
toFilter = filter + censor
|
|
||||||
tagList = getAllTags()
|
|
||||||
doNotTakeFiles = set()
|
|
||||||
for mask in toFilter:
|
|
||||||
try:
|
|
||||||
doNotTakeFiles.update(tagList[mask])
|
|
||||||
except KeyError:
|
|
||||||
print("Key not found: {}".format(mask))
|
|
||||||
return set.difference(AllFileList, doNotTakeFiles)
|
|
||||||
|
|
||||||
|
|
||||||
def loadTagFile(path=config.files_folder + '.vimwiki_tags'):
|
def loadTagFile(path=config.files_folder + '.vimwiki_tags'):
|
||||||
# Available file information keys:
|
# Available file information keys:
|
||||||
# opened - was the tag file successfully opened?
|
# opened - was the tag file successfully opened?
|
||||||
|
@ -90,6 +74,8 @@ def getAllFilesWithTags():
|
||||||
def getUntaggedFiles():
|
def getUntaggedFiles():
|
||||||
allFiles = getAllFiles()
|
allFiles = getAllFiles()
|
||||||
allTags = getAllFilesWithTags()
|
allTags = getAllFilesWithTags()
|
||||||
|
print("All tags from untagged")
|
||||||
|
print(allTags)
|
||||||
return allFiles - allTags
|
return allFiles - allTags
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,6 +85,4 @@ def getAllTags():
|
||||||
# - values as files that have the key in their tags
|
# - values as files that have the key in their tags
|
||||||
all_tags = makeDictFromTags(loadTagFile())
|
all_tags = makeDictFromTags(loadTagFile())
|
||||||
all_tags['untagged'] = getUntaggedFiles()
|
all_tags['untagged'] = getUntaggedFiles()
|
||||||
for tag in privateList:
|
|
||||||
all_tags.pop(tag, None)
|
|
||||||
return all_tags
|
return all_tags
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
privateList = ['y0x3y', 'piracy', 'weed', 'drugs', 'gel capsules',
|
|
||||||
'no weed', 'hackres town', 'hackers.town', 'radicalEd']
|
|
|
@ -1,17 +1,17 @@
|
||||||
content_folder = ['public/']
|
|
||||||
nav_tags = ['dev', 'way', 'recipe', 'ops', 'blog',
|
nav_tags = ['dev', 'way', 'recipe', 'ops', 'blog',
|
||||||
'rock', 'phil', 'story', 'blog', 'untagged']
|
'rock', 'phil', 'story', 'blog', 'untagged']
|
||||||
relative_build_url = ""
|
relative_build_url = ""
|
||||||
absolute_build_url = "https://anish.lakhwara.com/"
|
absolute_build_url = "https://anish.lakhwara.com/"
|
||||||
files_folder = 'public/'
|
files_folder = 'public/'
|
||||||
build_folder = "output/"
|
build_folder = "output/"
|
||||||
assets_folder = "basant/assets/"
|
assets_folder = "./basant/assets/"
|
||||||
medias_folder = "basant/media/"
|
medias_folder = "./basant/media/"
|
||||||
raw_folder = "raw/"
|
raw_folder = "raw/"
|
||||||
template_main = "./basant/partial/main.html"
|
template_main = "./basant/partial/main.html"
|
||||||
template_nav = "./basant/partial/nav.html"
|
template_nav = "./basant/partial/nav.html"
|
||||||
template_index = "./basant/partial/index_table.html"
|
template_index = "./basant/partial/index_table.html"
|
||||||
template_list = "./basant/partial/list.html"
|
template_list = "./basant/partial/list.html"
|
||||||
|
template_head = './basant/partial/head.html'
|
||||||
rss_template = "./basant/partial/rss.xml"
|
rss_template = "./basant/partial/rss.xml"
|
||||||
rss_item_template = "./basant/partial/item.xml"
|
rss_item_template = "./basant/partial/item.xml"
|
||||||
name_of_site = "Kitaab"
|
name_of_site = "Kitaab"
|
||||||
|
|
|
@ -1,106 +0,0 @@
|
||||||
#! /usr/bin/env python3
|
|
||||||
|
|
||||||
import ctags
|
|
||||||
from ctags import CTags, TagEntry
|
|
||||||
import sys
|
|
||||||
from icecream import ic
|
|
||||||
import shutil
|
|
||||||
from . import config
|
|
||||||
|
|
||||||
|
|
||||||
def loadTagFile(path='.vimwiki_tags'):
|
|
||||||
# Available file information keys:
|
|
||||||
# opened - was the tag file successfully opened?
|
|
||||||
# error_number - errno value when 'opened' is false
|
|
||||||
# format - format of tag file (1 = original, 2 = extended)
|
|
||||||
# sort - how is the tag file sorted?
|
|
||||||
# author - name of author of generating program (may be empy string)
|
|
||||||
# name - name of program (may be empy string)
|
|
||||||
# url - URL of distribution (may be empy string)
|
|
||||||
# version - program version (may be empty string)
|
|
||||||
try:
|
|
||||||
tagFile = CTags(path)
|
|
||||||
return tagFile
|
|
||||||
except:
|
|
||||||
print("No tagfile at {}".farmat(path))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def loopThrough(tagFile):
|
|
||||||
# Available TagEntry keys:
|
|
||||||
# name - name of tag
|
|
||||||
# file - path of source file containing definition of tag
|
|
||||||
# pattern - pattern for locating source line (None if no pattern)
|
|
||||||
# lineNumber - line number in source file of tag definition (may be zero if not known)
|
|
||||||
# kind - kind of tag (none if not known)
|
|
||||||
# fileScope - is tag of file-limited scope?
|
|
||||||
|
|
||||||
# Note: other keys will be assumed as an extension key and will
|
|
||||||
# return None if no such key is found
|
|
||||||
''' Entries that are less than 1 character in length are errors
|
|
||||||
Returns a set containing of all the files with errors in their tags'''
|
|
||||||
entry = TagEntry()
|
|
||||||
tag = tagFile.next(entry)
|
|
||||||
tagErrors = set()
|
|
||||||
errorTagNames = set()
|
|
||||||
while tag:
|
|
||||||
if len(entry['name']) <= 1:
|
|
||||||
tagErrors.add(entry['file'])
|
|
||||||
errorTagNames.add(entry['name'])
|
|
||||||
else:
|
|
||||||
print("Good tag found: {}".format(entry['name']))
|
|
||||||
tag = tagFile.next(entry)
|
|
||||||
ic(errorTagNames)
|
|
||||||
return tagErrors
|
|
||||||
|
|
||||||
|
|
||||||
def fixErrors(errors):
|
|
||||||
''' Replaces :: with :, which seems to be the error for many of the tags '''
|
|
||||||
fileBase = config.files_folder
|
|
||||||
for v in errors:
|
|
||||||
print("Fixing {}...".format(v))
|
|
||||||
fileName = fileBase + getFileName(v)
|
|
||||||
newFile = ""
|
|
||||||
with open(fileName, 'r') as f:
|
|
||||||
for line in f.readlines():
|
|
||||||
line = line.replace("::", ":")
|
|
||||||
newFile = newFile + line
|
|
||||||
with open(fileName, 'w') as f:
|
|
||||||
for line in newFile:
|
|
||||||
f.write(line)
|
|
||||||
print("Written new file...")
|
|
||||||
print()
|
|
||||||
print(newFile)
|
|
||||||
|
|
||||||
|
|
||||||
def printErrors(errors):
|
|
||||||
fileBase = config.files_folder
|
|
||||||
for v in errors:
|
|
||||||
fileName = fileBase + getFileName(v)
|
|
||||||
print("Reading {}...".format(v))
|
|
||||||
with open(fileName, 'r') as f:
|
|
||||||
f.readline()
|
|
||||||
ic(f.readline())
|
|
||||||
|
|
||||||
|
|
||||||
def getFileName(f):
|
|
||||||
return str(f, encoding="utf-8")
|
|
||||||
|
|
||||||
|
|
||||||
def getBackupFiles(errors):
|
|
||||||
fileBase = config.files_folder
|
|
||||||
backupBase = config.files_folder + '/jrnl/'
|
|
||||||
for files in errors.values():
|
|
||||||
for f in files:
|
|
||||||
f = getFileName(f)
|
|
||||||
print("Moving {} from backup".format(f))
|
|
||||||
shutil.copy(backupBase + f, fileBase + f)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
tagFile = loadTagFile()
|
|
||||||
errors = loopThrough(tagFile)
|
|
||||||
printErrors(errors)
|
|
||||||
# ic(errors)
|
|
||||||
# getBackupFiles(errors)
|
|
||||||
# fixErrors(errors)
|
|
|
@ -50,11 +50,11 @@
|
||||||
"nixpkgs": "nixpkgs_2"
|
"nixpkgs": "nixpkgs_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1649834414,
|
"lastModified": 1649938384,
|
||||||
"narHash": "sha256-Wu/PJQ+4KBL7GkAJWDLY6CG7n/GIP9keB1nLvFsEpAw=",
|
"narHash": "sha256-VZUS7k1NFszRpvvpZKgswF3dlv72DvkRyNrir7RLlus=",
|
||||||
"ref": "main",
|
"ref": "main",
|
||||||
"rev": "5e217728465fdd0617c8496dd4059d631b7394ae",
|
"rev": "b96c3ee8a8d1b9b83b2a27e6fc6100f3c2cf8bcc",
|
||||||
"revCount": 302,
|
"revCount": 304,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "ssh://gitea@git.sealight.xyz/aynish/kitaab"
|
"url": "ssh://gitea@git.sealight.xyz/aynish/kitaab"
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue