Skip to content

Commit 7b03446

Browse files
committed
use d3-graphviz
1 parent 55f112b commit 7b03446

File tree

5 files changed

+80
-74
lines changed

5 files changed

+80
-74
lines changed

djaif/book/book_map.py

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,57 @@
1-
from graphviz import Digraph
2-
31
from djaif.book import models
42

53

64
def book_map(book):
7-
dig = Digraph('Map')
5+
dig = ['digraph {',
6+
' node [style="filled"]'
7+
]
88

99
for page in book.bookpage_set.all():
10-
dig.node(
11-
_pid(page),
12-
label='{page.id}:"{page.title}"\n{items}'.format(
13-
page=page,
14-
items='\n'.join(
15-
'+ {id}:"{name}"'.format(
16-
id=i.id, name=i.name[:10],
17-
) for i in page.items.all()
10+
dig.append('{pid} [ \
11+
label="{label}" \
12+
tooltip="{tooltip}" \
13+
href="{href}" \
14+
]'.format(
15+
pid = _pid(page),
16+
label='{page.title} ({page.id})\\n{items}'.format(
17+
page=page,
18+
items='\\n'.join(
19+
'+ {id}: {name}'.format(
20+
id=i.id, name=i.name[:10],
21+
) for i in page.items.all()
22+
),
1823
),
19-
),
20-
tooltip=page.body,
21-
href='/admin/book/bookpage/{0.id}/change'.format(page),
24+
tooltip=page.body.replace("\r\n", " "),
25+
href='/admin/book/bookpage/{0.id}/change'.format(page),
26+
)
2227
)
2328

2429
links = models.PageLink.objects.filter(from_page__book_id=book.id)
2530
for link in links.all():
26-
dig.edge(
27-
_pid(link.from_page),
28-
_pid(link.to_page),
29-
label='{link.id}:"{shortname}"\n{items}'.format(
30-
link=link,
31-
shortname=link.name[:10],
32-
items='\n'.join(
33-
'? {id}:"{name}"'.format(
34-
id=i.id, name=i.name[:10],
35-
) for i in link.items.all()
31+
dig.append('{from_page} -> {to_page} [ \
32+
shape="circle" \
33+
label="{label}" \
34+
labeltooltip="{labeltooltip}" \
35+
labelhref="{labelhref}" \
36+
]'.format(
37+
from_page = _pid(link.from_page),
38+
to_page = _pid(link.to_page),
39+
label='{link.id}: {shortname}\\n{items}'.format(
40+
link=link,
41+
shortname=link.name[:10],
42+
items='\\n'.join(
43+
'? {id}: {name}'.format(
44+
id=i.id, name=i.name[:10],
45+
) for i in link.items.all()
46+
),
3647
),
37-
),
38-
labeltooltip=link.name,
39-
labelhref='/admin/book/pagelink/{0.id}/change'.format(link),
48+
labeltooltip=link.name,
49+
labelhref='/admin/book/pagelink/{0.id}/change'.format(link),
50+
)
4051
)
4152

42-
dig.format = 'svg' # noqa: WPS125
43-
return dig.pipe().decode('utf-8')
53+
dig.append('}')
54+
return ' '.join(dig)
4455

4556

4657
def _pid(page):

djaif/book/templates/map.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<script src="//d3js.org/d3.v5.min.js"></script>
6+
<script src="https://unpkg.com/@hpcc-js/[email protected]/dist/index.min.js"></script>
7+
<script src="https://unpkg.com/[email protected]/build/d3-graphviz.js"></script>
8+
</head>
9+
<body>
10+
<div id="graph" style="text-align: center;"></div>
11+
<script>
12+
d3.select("#graph").graphviz().renderDot('{{ book|safe }}');
13+
</script>
14+
</body>
15+
</html>

djaif/book/views.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,11 @@ def delete_save(request, book_id, save_id):
189189

190190
def view_book_map(request, book_id):
191191
book = get_object_or_404(models.Book, id=book_id)
192-
return FileResponse(book_map.book_map(book), filename='map.svg')
192+
return render(
193+
request,
194+
'map.html',
195+
context={'book': book_map.book_map(book)},
196+
)
193197

194198

195199
@on_progress

poetry.lock

Lines changed: 20 additions & 43 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ authors = ["Your Name <[email protected]>"]
88
python = "^3.8"
99
django = "^4.0.6"
1010
Pillow = "^9.2.0"
11-
graphviz = "^0.20"
1211
django-extensions = "^3.2.0"
1312
python-dotenv = "^0.20.0"
1413

0 commit comments

Comments
 (0)