📄 main.c
字号:
fprintf(f, "<h2>SVG Tiny 1.2 Elements</h2>\n");
fprintf(f, "<table class='reference-list' align='center'>\n");
fprintf(f, "<thead>\n");
fprintf(f, "<tr>\n");
fprintf(f, "<th>Element Name</th>\n");
fprintf(f, "<th>Status</th>\n");
fprintf(f, "<th>Observations</th>\n");
fprintf(f, "<th>Example(s)</th>\n");
fprintf(f, "<th>Bug(s)</th>\n");
fprintf(f, "</tr>\n");
fprintf(f, "</thead>\n");
fprintf(f, "<tbody>\n");
for (i = 0; i < gf_list_count(elements); i++) {
SVGElement *elt = gf_list_get(elements, i);
fprintf(f, "<tr class='element' id='element_%s'>\n", elt->implementation_name);
fprintf(f, "<td class='element-name'><a href='#table_%s'>%s</a></td>\n", elt->svg_name, elt->svg_name);
fprintf(f, "<td class='not-supported'></td>\n");
fprintf(f, "<td class='element-observation'> </td>\n");
fprintf(f, "<td class='element-example'> </td>\n");
fprintf(f, "<td class='element-bug'> </td>\n");
fprintf(f, "</tr>\n");
}
fprintf(f, "</tbody>\n");
fprintf(f, "</table>\n");
for (i = 0; i < gf_list_count(elements); i++) {
SVGElement *elt = gf_list_get(elements, i);
fprintf(f, "<h2 id='table_%s'>%s</h2>\n", elt->implementation_name, elt->svg_name);
fprintf(f, "<table>\n");
fprintf(f, "<thead>\n");
fprintf(f, "<tr>\n");
fprintf(f, "<th>Attribute Name</th>\n");
fprintf(f, "<th>Status</th>\n");
fprintf(f, "<th>Observations</th>\n");
fprintf(f, "<th>Example(s)</th>\n");
fprintf(f, "<th>Bug(s)</th>\n");
fprintf(f, "</tr>\n");
fprintf(f, "</thead>\n");
fprintf(f, "<tbody>\n");
for (j = 0; j < gf_list_count(elt->attributes); j++) {
SVGAttribute *att = gf_list_get(elt->attributes, j);
if (!strcmp(att->svg_name, "textContent")) continue;
fprintf(f, "<tr>\n");
fprintf(f, "<td class='attribute-name'>%s</td>\n",att->svg_name);
fprintf(f, "<td class='not-supported'></td>\n");
fprintf(f, "<td class='attribute-observation'> </td>\n");
fprintf(f, "<td class='attribute-example'>%d - </td>\n",++nbExamples);
fprintf(f, "<td class='attribute-bug'> </td>\n");
fprintf(f, "</tr>\n");
}
fprintf(f, "</tbody>\n");
fprintf(f, "</table>\n");
}
EndHtml(f);
gf_list_del(elements);
}
void replaceIncludes(xmlDocPtr doc, xmlXPathContextPtr xpathCtx)
{
int k;
xmlNodeSetPtr nodes;
xmlXPathObjectPtr xpathObj;
/* Get all the RNG elements */
xpathObj = xmlXPathEvalExpression("//rng:include", xpathCtx);
if(xpathObj == NULL || xpathObj->type != XPATH_NODESET) return;
nodes = xpathObj->nodesetval;
for (k = 0; k < nodes->nodeNr; k++) {
xmlNodePtr node = nodes->nodeTab[k];
if (node->type == XML_ELEMENT_NODE) {
xmlChar *href;
xmlDocPtr sub_doc;
href = xmlGetNoNsProp(node, "href");
sub_doc = xmlParseFile(href);
xmlReplaceNode(nodes->nodeTab[k], xmlDocGetRootElement(sub_doc));
}
}
xmlXPathFreeObject(xpathObj);
}
static char *attribute_name_type_list[] = {
"a.target", "accumulate", "additive", "attributeName", "audio-level", "bandwidth", "begin", "calcMode", "children", "choice", "clipBegin", "clipEnd", "color", "color-rendering", "cx", "cy", "d", "display", "display-align", "dur", "editable", "enabled", "end", "event", "externalResourcesRequired", "fill", "fill-opacity", "fill-rule", "focusable", "font-family", "font-size", "font-style", "font-variant", "font-weight", "gradientUnits", "handler", "height", "image-rendering", "keyPoints", "keySplines", "keyTimes", "line-increment", "listener.target", "mediaCharacterEncoding", "mediaContentEncodings", "mediaSize", "mediaTime", "nav-down", "nav-down-left", "nav-down-right", "nav-left", "nav-next", "nav-prev", "nav-right", "nav-up", "nav-up-left", "nav-up-right", "observer", "offset", "opacity", "overflow", "overlay", "path", "pathLength", "pointer-events", "points", "preserveAspectRatio", "r", "repeatCount", "repeatDur", "requiredExtensions", "requiredFeatures", "requiredFormats", "restart", "rotate", "rotation", "rx", "ry", "scale", "shape-rendering", "size", "solid-color", "solid-opacity", "stop-color", "stop-opacity", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "svg.height", "svg.width", "syncBehavior", "syncBehaviorDefault", "syncReference", "syncTolerance", "syncToleranceDefault", "systemLanguage", "text-anchor", "text-decoration", "text-rendering", "textContent", "transform", "transformBehavior", "translation", "vector-effect", "viewBox", "viewport-fill", "viewport-fill-opacity", "visibility", "width", "x", "x1", "x2", "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", "xlink:title", "xlink:type", "xml:base", "xml:lang", "y", "y1", "y2", "zoomAndPan", NULL
};
static s32 get_lsr_att_name_type(const char *name)
{
u32 i = 0;
while (attribute_name_type_list[i]) {
if (!strcmp(name, attribute_name_type_list[i])) return i;
i++;
}
return -1;
}
void generateGenericAttrib(FILE *output, SVGElement *elt, u32 index)
{
int k;
for (k=0; k < generic_attributes[index].array_length; k++) {
char *att_name = generic_attributes[index].array[k];
SVGAttribute *a = findAttribute(elt, att_name);
if (a) {
s32 type = get_lsr_att_name_type(att_name);
/*SMIL anim fill not updatable*/
if ((index==4) && !strcmp(att_name, "fill")) {
type = -1;
}
fprintf(output, ", %d", type);
}
}
}
static void generate_laser_tables(GF_List *svg_elements)
{
FILE *output;
u32 i;
u32 special_cases;
output = BeginFile(2);
fprintf(output, "\n#include <gpac/nodes_svg.h>\n\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
u32 j, fcount;
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
fcount = gf_list_count(elt->attributes);
fprintf(output, "static const s32 %s_field_to_attrib_type[] = {\n", elt->implementation_name);
/*core info: id, xml:id, class, xml:lang, xml:base, xml:space, externalResourcesRequired*/
fprintf(output, "-1, -1, -1, 125, 124, -1, 24");
if (elt->has_properties) generateGenericAttrib(output, elt, 1);
if (elt->has_focus) generateGenericAttrib(output, elt, 2);
if (elt->has_xlink) generateGenericAttrib(output, elt, 3);
if (elt->has_timing) generateGenericAttrib(output, elt, 4);
if (elt->has_sync) generateGenericAttrib(output, elt, 5);
if (elt->has_animation) generateGenericAttrib(output, elt, 6);
if (elt->has_conditional) generateGenericAttrib(output, elt, 7);
/*WATCHOUT - HARDCODED VALUES*/
if (elt->has_transform) fprintf(output, ", 105");
if (elt->has_xy) fprintf(output, ", 116, 129");
/*svg.width and svg.height escapes*/
special_cases = 0;
if (!strcmp(elt->svg_name, "svg")) special_cases = 1;
else if (!strcmp(elt->svg_name, "a")) special_cases = 2;
for (j=0; j<fcount; j++) {
SVGAttribute *att = gf_list_get(elt->attributes, j);
s32 type = get_lsr_att_name_type(att->svg_name);
if (special_cases==1) {
if (!strcmp(att->svg_name, "width"))
type = 95;
else if (!strcmp(att->svg_name, "height"))
type = 94;
}
if ((special_cases==2) && !strcmp(att->svg_name, "target"))
type = 0;
fprintf(output, ", %d", type);
}
fprintf(output, "\n};\n\n");
}
fprintf(output, "s32 gf_lsr_field_to_attrib_type(GF_Node *n, u32 fieldIndex)\n{\n\tif(!n) return -2;\n\tswitch (gf_node_get_tag(n)) {\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
u32 fcount;
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
fprintf(output, "\tcase TAG_SVG_%s:\n", elt->implementation_name);
fcount = gf_list_count(elt->attributes);
fprintf(output, "\t\treturn %s_field_to_attrib_type[fieldIndex];\n", elt->implementation_name);
}
fprintf(output, "\tdefault:\n\t\treturn -2;\n\t}\n}\n\n");
}
int main(int argc, char **argv)
{
FILE *output;
xmlDocPtr doc = NULL;
xmlXPathContextPtr xpathCtx = NULL;
GF_List *svg_elements = NULL;
u32 i;
xmlInitParser();
LIBXML_TEST_VERSION
doc = xmlParseFile(argv[1]);
if (!doc) {
printf("error: could not parse file %s\n", argv[1]);
return -1;
}
xpathCtx = xmlXPathNewContext(doc);
if(xpathCtx == NULL) {
fprintf(stderr,"Error: unable to create new XPath context\n");
xmlFreeDoc(doc);
return(-1);
}
xmlXPathRegisterNs(xpathCtx, RNG_PREFIX, RNG_NS);
xmlXPathRegisterNs(xpathCtx, RNGA_PREFIX, RNGA_NS);
xmlXPathRegisterNs(xpathCtx, SVGA_PREFIX, SVGA_NS);
replaceIncludes(doc, xpathCtx);
xmlSaveFile("completerng_props.xml", doc);
globalAttrGrp = gf_list_new();
getAllGlobalAttrGrp(doc, xpathCtx);
svg_elements = getElements(doc, xpathCtx);
svg_elements = sortElements(svg_elements);
if (argv[2] && !strcmp(argv[2], "-html")) {
generate_table(svg_elements);
} else {
output = BeginFile(0);
fprintf(output, "#include <gpac/scenegraph_svg.h>\n\n\n");
fprintf(output, "/* Definition of SVG element internal tags */\n");
fprintf(output, "/* TAG names are made of \"TAG_SVG\" + SVG element name (with - replaced by _) */\n");
/* write all tags */
fprintf(output, "enum {\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
if (i == 0)
fprintf(output, "\tTAG_SVG_%s = GF_NODE_RANGE_FIRST_SVG", elt->implementation_name);
else
fprintf(output, ",\n\tTAG_SVG_%s", elt->implementation_name);
}
fprintf(output, ",\n\t/*undefined elements (when parsing) use this tag*/\n\tTAG_SVG_UndefinedElement\n};\n\n");
#if 0
fprintf(output, "/******************************************\n");
fprintf(output, "* SVG Attributes Groups definitions *\n");
fprintf(output, "*******************************************\n");
for (i=0; i<gf_list_count(globalAttrGrp); i++) {
SVGAttrGrp *attgrp = gf_list_get(globalAttrGrp, i);
fprintf(output, "/* %d attributes *\n", attgrp->nb_attrs);
fprintf(output, "#define %s \\\n", strupr(attgrp->imp_name));
for (j = 0; j<gf_list_count(attgrp->attrgrps); j++) {
SVGAttrGrp *a = gf_list_get(attgrp->attrgrps, j);
fprintf(output, "\t%s ", strupr(a->imp_name));
if (j != gf_list_count(attgrp->attrgrps) - 1)
fprintf(output, "\\\n");
else if (gf_list_count(attgrp->attrs))
fprintf(output, "\\\n");
else
fprintf(output, "\n");
}
attgrp->attrs = sortAttr(attgrp->attrs);
generateAttributes(output, attgrp->attrs, 1);
fprintf(output, "\n");
}
#endif
fprintf(output, "/******************************************\n");
fprintf(output, "* SVG Elements structure definitions *\n");
fprintf(output, "*******************************************/\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
generateNode(output, elt);
}
fprintf(output, "/******************************************\n");
fprintf(output, "* End SVG Elements structure definitions *\n");
fprintf(output, "*******************************************/\n");
EndFile(output, 0);
output = BeginFile(1);
fprintf(output, "#include <gpac/nodes_svg.h>\n\n");
fprintf(output, "#ifndef GPAC_DISABLE_SVG\n\n");
fprintf(output, "#include <gpac/internal/scenegraph_dev.h>\n\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
generateNodeImpl(output, elt);
}
/* SVGElement *gf_svg_create_node(u32 ElementTag)*/
fprintf(output, "SVGElement *gf_svg_create_node(u32 ElementTag)\n");
fprintf(output, "{\n");
fprintf(output, "\tswitch (ElementTag) {\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
fprintf(output, "\t\tcase TAG_SVG_%s: return gf_svg_new_%s();\n",elt->implementation_name,elt->implementation_name);
}
fprintf(output, "\t\tdefault: return NULL;\n\t}\n}\n\n");
/* void gf_svg_element_del(SVGElement *elt) */
fprintf(output, "void gf_svg_element_del(SVGElement *elt)\n{\n");
fprintf(output, "\tGF_Node *node = (GF_Node *)elt;\n");
fprintf(output, "\tswitch (node->sgprivate->tag) {\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
fprintf(output, "\t\tcase TAG_SVG_%s: gf_svg_%s_del(node); return;\n", elt->implementation_name, elt->implementation_name);
}
fprintf(output, "\t\tdefault: return;\n\t}\n}\n\n");
/* u32 gf_svg_get_attribute_count(SVGElement *elt) */
fprintf(output, "u32 gf_svg_get_attribute_count(GF_Node *node)\n{\n");
fprintf(output, "\tswitch (node->sgprivate->tag) {\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
fprintf(output, "\t\tcase TAG_SVG_%s: return %i;\n", elt->implementation_name, elt->nb_atts);
}
fprintf(output, "\t\tdefault: return 0;\n\t}\n}\n\n");
/* GF_Err gf_svg_get_attribute_info(GF_Node *node, GF_FieldInfo *info) */
fprintf(output, "GF_Err gf_svg_get_attribute_info(GF_Node *node, GF_FieldInfo *info)\n{\n");
fprintf(output, "\tswitch (node->sgprivate->tag) {\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
fprintf(output, "\t\tcase TAG_SVG_%s: return gf_svg_%s_get_attribute(node, info);\n", elt->implementation_name, elt->implementation_name);
}
fprintf(output, "\t\tdefault: return GF_BAD_PARAM;\n\t}\n}\n\n");
/* u32 gf_node_svg_type_by_class_name(const char *element_name) */
fprintf(output, "u32 gf_node_svg_type_by_class_name(const char *element_name)\n{\n\tif (!element_name) return TAG_UndefinedNode;\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
fprintf(output, "\tif (!stricmp(element_name, \"%s\")) return TAG_SVG_%s;\n", elt->svg_name, elt->implementation_name);
}
fprintf(output, "\treturn TAG_UndefinedNode;\n}\n\n");
/* const char *gf_svg_get_element_name(u32 tag) */
fprintf(output, "const char *gf_svg_get_element_name(u32 tag)\n{\n\tswitch(tag) {\n");
for (i=0; i<gf_list_count(svg_elements); i++) {
SVGElement *elt = (SVGElement *)gf_list_get(svg_elements, i);
fprintf(output, "\tcase TAG_SVG_%s: return \"%s\";\n", elt->implementation_name, elt->svg_name);
}
fprintf(output, "\tdefault: return \"UndefinedNode\";\n\t}\n}\n\n");
fprintf(output, "#endif /*GPAC_DISABLE_SVG*/\n\n");
EndFile(output, 1);
generate_laser_tables(svg_elements);
}
xmlXPathFreeContext(xpathCtx);
//xmlFreeDoc(doc);
xmlCleanupParser();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -