-
Notifications
You must be signed in to change notification settings - Fork 0
/
basicserver_withheader.py
executable file
·106 lines (80 loc) · 2.55 KB
/
basicserver_withheader.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#! /usr/bin/env python
import cgi, os, SocketServer, sys, time, urllib, re
from SimpleHTTPServer import SimpleHTTPRequestHandler
from StringIO import StringIO
import BaseHTTPServer
import pickle
class DirectoryHandler(SimpleHTTPRequestHandler):
def do_GET(self):
"""Serve a GET request."""
if self.path.startswith("/__zwheader"):
self.generateHeader()
else:
SimpleHTTPRequestHandler.do_GET(self)
def generateHeader(self):
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
scanDir()
refs = getRefs(self.path.split('?')[-1])
if len(refs)>0:
reflinks = ['['+a+'](?'+a+')' for a in refs]
w = self.wfile
w.write('<div class="zwheader" style="position: absolute; left: 2em; top: 2em;">')
w.write('Referenced by: ')
w.write(', '.join(reflinks))
w.write('</div>')
dump = None
def getDump():
global dump
if (dump is None):
try:
with open('.zwdump', 'rb') as dumpfile:
dump = pickle.load(dumpfile)
except IOError as e:
print(".zwdump was not found. Starting from scratch over here.")
dump = {}
return dump
def saveDump():
d = getDump()
with open('.zwdump', 'wb') as dumpfile:
pickle.dump(d, dumpfile)
linkpatt = re.compile("\]\(([^\)]+?\.md)(?:\#[^\)]*?)?\)")
def processFile(fname):
print("scanning updated file '"+ fname + "'.")
d = getDump()
with open(fname, "r") as myfile:
data=myfile.read()
links = re.findall(linkpatt, data)
d[fname]['links'] = links
def scanFile(fname):
d = getDump()
if fname not in d:
d[fname] = {}
d[fname]['lastchecked'] = 0
date_checked = d[fname]['lastchecked']
date_modified = int(os.path.getmtime(fname))
if date_modified > (date_checked):
processFile(fname)
d[fname]['lastchecked'] = int(time.time())
return True
return False
def getRefs(fname):
d = getDump()
out = []
for otherfile in d:
if 'links' in d[otherfile]:
if fname in d[otherfile]['links']:
out.append(otherfile)
return out
def scanDir():
dr = os.listdir(os.getcwd())
dr = [f for f in dr if os.path.isfile(f) and f.endswith('.md')]
s = False
for f in dr:
if scanFile(f):
s = True
if s:
saveDump()
if __name__=="__main__":
BaseHTTPServer.test(DirectoryHandler, BaseHTTPServer.HTTPServer)