1
1
import yaml
2
2
import json
3
- import base64
3
+ import glob
4
4
5
5
class Trie :
6
6
@@ -24,7 +24,7 @@ def json(self):
24
24
def tabulator_leaf (self ):
25
25
result = {}
26
26
for v in self .values :
27
- result [v ["format" ]] = v ["file " ]
27
+ result [v ["format" ]] = v ["table_cell " ]
28
28
return result
29
29
30
30
def tabulator (self ):
@@ -52,88 +52,41 @@ def size(self):
52
52
return 1
53
53
return sum ([v .size () for v in self .children .values ()])
54
54
55
- def render_features_formats_table (filename ):
56
- s = yaml .load (open (filename ), Loader = yaml .SafeLoader )
57
-
58
- features = Trie ()
59
- for l in s :
60
- features .insert (l ["feature" ].split ("/" ), l )
61
-
62
- formats = {}
63
- for l in s :
64
- formats [l ["format" ]] = features .depth () + len (formats ) - 1
65
-
66
- n_columns = features .depth () + len (formats )
67
55
68
- table_cells = list (list (None for _ in range (n_columns )) for _ in range (features .size ()))
69
- table_headers = list (None for _ in range (n_columns ))
70
-
71
- def add_spanners (node , row , col ):
72
- # if node.children:
73
- # print("<<<")
74
- # print(row, col)
75
- # print(json.dumps(node.json(), indent=2))
76
- # print(">>>")
77
- for k , v in node .children .items ():
78
- # print("::::", row, col)
79
- table_cells [row ][col ] = "<td class='spanner' rowspan='%s'><div class='inner_spanner'>%s</div></td>" % (v .size (), k )
80
- for i in range (row + 1 , row + v .size ()):
81
- table_cells [i ][col ] = ""
82
- add_spanners (v , row , col + 1 )
83
- row += v .size ()
84
- def add_headers ():
85
- for k , i in formats .items ():
86
- table_headers [i ] = "<th>%s</th>" % k
87
- def add_entries (node , row , col ):
88
- for v in node .values :
89
- content = "[{{< fa link >}}](%s/%s.qmd)" % (v ["feature" ], v ["format" ])
90
- # content = "<a href='%s'><i class='fa-solid fa-link' aria-label='link'></i></a>" % v.get("file", "%s/%s.qmd" % (v["feature"], v["format"]))
91
- # encode as base64
92
- b64 = base64 .encodebytes (content .encode ("utf-8" ))
93
- table_cells [row ][formats [v ["format" ]]] = "<td><span data-qmd-base64='%s'></span></td>" % b64 .decode ("utf-8" ).strip ()
94
- for _ , v in node .children .items ():
95
- add_entries (v , row , col + 1 )
96
- row += v .size ()
97
- add_spanners (features , 0 , 0 )
98
- add_entries (features , 0 , 0 )
99
- add_headers ()
100
- table_headers [0 ] = '<th colspan="%s">↓ Features \\ Formats → </th>' % features .depth ()
101
- for i in range (1 , features .depth ()):
102
- table_headers [i ] = ""
103
-
104
- def render_table ():
105
- html = []
106
- html .append ("```{=html}\n <table class='features-formats-table'>" )
107
- html .append ("<tr class='header-row'>" )
108
- for h in table_headers :
109
- if h is None :
110
- html .append ("<th></th>" )
56
+ def extract_metadata_from_file (file ):
57
+ with open (file , "r" ) as f :
58
+ lines = f .readlines ()
59
+ start = None
60
+ end = None
61
+ for i , line in enumerate (lines ):
62
+ if line .strip () == "---" :
63
+ if start is None :
64
+ start = i
111
65
else :
112
- html .append (h )
113
- html .append ("</tr>" )
114
- for row in table_cells :
115
- html .append ("<tr>" )
116
- for d in row :
117
- if d is None :
118
- html .append ("<td></td>" )
119
- else :
120
- html .append (d )
121
- html .append ("</tr>" )
122
- html .append ("</table>\n ```\n " )
123
- return "\n " .join (html )
124
- return render_table ()
125
- import glob
66
+ end = i
67
+ metadata = yaml .load ("" .join (lines [start + 1 :end ]), Loader = yaml .SafeLoader )
68
+ return metadata
69
+ raise ValueError ("No metadata found in file %s" % file )
70
+
71
+ def table_cell (entry , _feature , _format_name , _format_config ):
72
+ return "<a href='%s' target='_blank'><i class='fa-solid fa-link' aria-label='link'></i></a>" % entry
126
73
127
74
def render_features_formats_data ():
128
75
trie = Trie ()
129
- for entry in glob .glob ("qmd-files/**/*.qmd" , recursive = True ):
130
- feature = entry .split ("/" )[1 :]
131
- format = feature .pop ().split ("." )[0 ]
132
- trie .insert (feature , {
133
- "feature" : "/" .join (feature ),
134
- "format" : format ,
135
- "file" : "<a href='%s' target='_blank'><i class='fa-solid fa-link' aria-label='link'></i></a>" % entry
136
- })
76
+ for entry in glob .glob ("qmd-files/**/document.qmd" , recursive = True ):
77
+ feature = entry .split ("/" )[1 :- 1 ]
78
+ front_matter = extract_metadata_from_file (entry )
79
+ try :
80
+ format = front_matter ["format" ]
81
+ except KeyError :
82
+ raise Exception ("No format found in %s" % entry )
83
+ for format_name , format_config in format .items ():
84
+ trie .insert (feature , {
85
+ "feature" : "/" .join (feature ),
86
+ "format" : format_name ,
87
+ "format_config" : format_config ,
88
+ "table_cell" : table_cell (entry , feature , format_name , format_config )
89
+ })
137
90
entries = trie .tabulator ()
138
91
139
92
return "```{=html}\n <script type='text/javascript'>\n var tableData = %s;\n </script>\n ```\n " % json .dumps (entries , indent = 2 )
0 commit comments