128 lines
3.7 KiB
Python
Executable File
128 lines
3.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import sys
|
|
import re
|
|
import os
|
|
from collections import *
|
|
|
|
def add_quotes(s):
|
|
return "\"" + s.lower() + "\""
|
|
|
|
def wordify(s):
|
|
return s.strip().rstrip(".,;:")
|
|
|
|
def is_keyword(s):
|
|
if s == "GTK":
|
|
return False
|
|
elif s.startswith(("Gtk", "Gdk", "Pango")):
|
|
return True
|
|
elif s.startswith("G") and s[1].isupper():
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
out_file = sys.argv[1]
|
|
in_files = sys.argv[2:]
|
|
|
|
|
|
file_output = """
|
|
typedef GtkWidget *(*GDoDemoFunc) (GtkWidget *do_widget);
|
|
|
|
typedef struct _DemoData DemoData;
|
|
|
|
struct _DemoData
|
|
{
|
|
const char *name;
|
|
const char *title;
|
|
const char **keywords;
|
|
const char *filename;
|
|
GDoDemoFunc func;
|
|
DemoData *children;
|
|
};
|
|
"""
|
|
|
|
# Demo = namedtuple('Demo', ['name', 'title', 'keywords', 'file', 'func'])
|
|
|
|
demos = []
|
|
|
|
for demo_file in in_files:
|
|
filename = demo_file[demo_file.rfind('/')+1:]
|
|
demo_name = filename.replace(".c", "")
|
|
with open(demo_file, 'r', encoding='utf-8') as f:
|
|
title = f.readline().replace("/*", "").strip()
|
|
keywords = set()
|
|
line = f.readline().strip();
|
|
while not line.endswith('*/'):
|
|
if line.startswith("* #Keywords:"):
|
|
keywords = keywords.union(set(map(wordify, line.replace ("* #Keywords:", "").strip().split(","))))
|
|
else:
|
|
keywords = keywords.union(set(filter(is_keyword, map(wordify, line.replace ("* ", "").split()))))
|
|
line = f.readline().strip()
|
|
|
|
file_output += "GtkWidget *do_" + demo_name + " (GtkWidget *do_widget);\n"
|
|
demos.append((demo_name, title, keywords, filename, "do_" + demo_name, -1))
|
|
|
|
# Generate a List of "Parent names"
|
|
parents = []
|
|
parent_ids = []
|
|
parent_index = 0
|
|
for demo in demos:
|
|
if "/" in demo[1]:
|
|
slash_index = demo[1].index('/')
|
|
parent_name = demo[1][:slash_index]
|
|
do_break = False
|
|
|
|
# Check for duplicates
|
|
if not parent_name in parents:
|
|
parents.append(parent_name)
|
|
parent_ids.append(parent_index)
|
|
demos.append(("NULL", parent_name, set(), "NULL", "NULL", parent_index))
|
|
|
|
parent_index = parent_index + 1
|
|
|
|
|
|
# For every child with a parent, generate a list of child demos
|
|
i = 0
|
|
for parent in parents:
|
|
id = parent_ids[i]
|
|
file_output += "\nDemoData child" + str(id) + "[] = {\n"
|
|
# iterate over all demos and check if the name starts with the given parent name
|
|
for child in demos:
|
|
if child[1].startswith(parent + "/"):
|
|
title = child[1][child[1].rfind('/') + 1:]
|
|
file_output += " { \"" + child[0] + "\", \"" + title + "\", " + "(const char*[]) {" + ", ".join(list(map(add_quotes, child[2])) + ["NULL"]) + " }, \"" + child[3] + "\", " + child[4] + ", NULL },\n"
|
|
|
|
file_output += " { NULL }\n};\n"
|
|
i = i + 1
|
|
|
|
|
|
# Sort demos by title
|
|
demos = sorted(demos, key=lambda x: x[1])
|
|
|
|
file_output += "\nDemoData gtk_demos[] = {\n"
|
|
for demo in demos:
|
|
# Do not generate one of these for demos with a parent demo
|
|
if "/" not in demo[1]:
|
|
child_array = "NULL"
|
|
name = demo[0]
|
|
title = demo[1]
|
|
keywords = demo[2]
|
|
file = demo[3]
|
|
if name != "NULL":
|
|
name = "\"" + name + "\""
|
|
if title != "NULL":
|
|
title = "\"" + title + "\""
|
|
if file != "NULL":
|
|
file = "\"" + file + "\""
|
|
|
|
if demo[5] != -1:
|
|
child_array = "child" + str(demo[5])
|
|
file_output += " { " + name + ", " + title + ", " + "(const char*[]) {" + ", ".join(list(map(add_quotes, keywords)) + ["NULL"]) + " }, " + file + ", " + demo[4] + ", " + child_array + " },\n"
|
|
|
|
file_output += " { NULL }\n};\n"
|
|
|
|
ofile = open(out_file, "w")
|
|
ofile.write(file_output)
|
|
ofile.close()
|