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
105
|
import click
from app.settings import app_cfg
from app.utils.file_utils import load_text, write_json, write_text
from os.path import join
@click.command('info')
@click.option('-g', '--graph', 'opt_graph_path', required=True,
help='Graph name')
@click.option('-o', '--output', 'opt_output_dir', required=True, default=app_cfg.DIR_EXPORTS,
help='Output dir')
@click.pass_context
def cli(ctx, opt_graph_path, opt_output_dir):
"""Export a graph"""
# ------------------------------------------------
# imports
from app.sql.common import db, Session, Graph, Page, Tile
# ------------------------------------------------
# generate HTML for index and all pages
session = Session()
graph = session.query(Graph).filter(Graph.path == opt_graph_path).first()
if graph is None:
print(f"Not a graph: {opt_graph_path}")
return
print(f"Output site to {opt_output_dir}")
site_data = { 'graph': sanitize_graph(graph.toSiteJSON()) }
index_html = load_text(join(app_cfg.DIR_STATIC, 'site.html'), split=False)
write_json(site_data, join(opt_output_dir, graph.path, 'index.json'), default=str)
# write_index(graph, None, index_html, join(opt_output_dir, graph.path, 'index.html'))
home_page = site_data['graph']['home_page']
write_text(f'<meta http-equiv="refresh" content="0; url={home_page}">', join(opt_output_dir, graph.path, 'index.html'))
index_path = ""
for page in graph.pages:
page_path = f'{graph.path}/{page.path}'
if page.id == graph.home_page_id:
index_path = page_path
print(f'/{page_path} [index]')
else:
print(f'/{page_path}')
write_index(graph, page, index_html, join(opt_output_dir, graph.path, page.path, 'index.html'))
# ------------------------------------------------
# generate javascript...
# NODE_ENV=production webpack --config ./webpack.config.site.js -o ./data_store/exports/asdf/bundle.js
def write_index(graph, page, index_html, fp_out):
if page is None:
page_title = graph.title
else:
page_title = page.title
index_html = index_html.replace('BUNDLE_PATH', join('/', graph.path, 'bundle.js'))
index_html = index_html.replace('PAGE_TITLE', page_title)
write_text(index_html, fp_out)
def sanitize_graph(graph):
page_path_lookup = {}
page_lookup = {}
for page in graph['pages']:
page_path_lookup[page['id']] = join('/', graph['path'], page['path'])
for page in graph['pages']:
sanitize_page(page)
for tile in page['tiles']:
if tile['target_page_id']:
if tile['target_page_id'] == -1:
tile['href'] = tile['external_link_url']
elif tile['target_page_id'] > 0:
tile['href'] = page_path_lookup[tile['target_page_id']]
sanitize_tile(tile)
page_path = page_path_lookup[page['id']]
page_lookup[page_path] = page
graph['pages'] = page_lookup
graph['home_page'] = page_path_lookup[graph['home_page_id']]
return graph
def sanitize_page(data):
if 'created_at' in data:
del data['created_at']
if 'updated_at' in data:
del data['updated_at']
if 'graph_id' in data:
del data['graph_id']
def sanitize_tile(data):
if 'created_at' in data:
del data['created_at']
if 'updated_at' in data:
del data['updated_at']
if 'username' in data:
del data['username']
if 'graph_id' in data:
del data['graph_id']
if 'page_id' in data:
del data['page_id']
if 'target_page_id' in data:
del data['target_page_id']
|