xref: /Universal-ctags/parsers/svg.c (revision 17e5887416156b2d9d89c8794bcfa1a1a6942973)
13441ff40SMasatake YAMATO /*
23441ff40SMasatake YAMATO *
33441ff40SMasatake YAMATO *   Copyright (c) 2016, Masatake YAMATO
43441ff40SMasatake YAMATO *   Copyright (c) 2016, Red Hat, K.K.
53441ff40SMasatake YAMATO *
63441ff40SMasatake YAMATO *   This source code is released for free distribution under the terms of the
73441ff40SMasatake YAMATO *   GNU General Public License version 2 or (at your option) any later version.
83441ff40SMasatake YAMATO *
93441ff40SMasatake YAMATO *   This module contains functions for generating tags for svg.
103441ff40SMasatake YAMATO *
113441ff40SMasatake YAMATO */
123441ff40SMasatake YAMATO 
133441ff40SMasatake YAMATO #include "general.h"	/* must always come first */
1414781660SMasatake YAMATO #include "entry.h"
153441ff40SMasatake YAMATO #include "options.h"
163441ff40SMasatake YAMATO #include "parse.h"
173441ff40SMasatake YAMATO #include "read.h"
183441ff40SMasatake YAMATO #include "routines.h"
19*17e58874SMasatake YAMATO #include "xml.h"
203441ff40SMasatake YAMATO 
21*17e58874SMasatake YAMATO #include <string.h>
223441ff40SMasatake YAMATO 
233441ff40SMasatake YAMATO typedef enum {
24*17e58874SMasatake YAMATO 	K_DEF,
253441ff40SMasatake YAMATO } svgKind;
263441ff40SMasatake YAMATO 
27e112e8abSMasatake YAMATO static kindDefinition SvgKinds [] = {
28*17e58874SMasatake YAMATO 	{ true,  'd', "def", "ids in defs tags" },
293441ff40SMasatake YAMATO };
303441ff40SMasatake YAMATO 
313441ff40SMasatake YAMATO static void
findSvgTags(void)323441ff40SMasatake YAMATO findSvgTags (void)
333441ff40SMasatake YAMATO {
34*17e58874SMasatake YAMATO 	scheduleRunningBaseparser (RUN_DEFAULT_SUBPARSERS);
353441ff40SMasatake YAMATO }
363441ff40SMasatake YAMATO 
37*17e58874SMasatake YAMATO static void
makeTagEntryWithNodeNotify(xmlSubparser * s,xmlNode * node,tagEntryInfo * xmlTag)38*17e58874SMasatake YAMATO makeTagEntryWithNodeNotify (xmlSubparser *s,
39*17e58874SMasatake YAMATO 							xmlNode *node,
40*17e58874SMasatake YAMATO 							tagEntryInfo *xmlTag)
41*17e58874SMasatake YAMATO {
42*17e58874SMasatake YAMATO 	if (node->type == XML_ATTRIBUTE_NODE
43*17e58874SMasatake YAMATO 		&& (strcmp ((char *)node->name, "id") == 0)
44*17e58874SMasatake YAMATO 		&& node->parent && node->parent->parent
45*17e58874SMasatake YAMATO 		&& node->parent->parent->type == XML_ELEMENT_NODE
46*17e58874SMasatake YAMATO 		&& (strcmp ((char *)node->parent->parent->name, "defs") == 0))
47*17e58874SMasatake YAMATO 	{
48*17e58874SMasatake YAMATO 		tagEntryInfo tag;
49*17e58874SMasatake YAMATO 		initTagEntry (&tag, xmlTag->name, K_DEF);
50*17e58874SMasatake YAMATO 		tag.filePosition = xmlTag->filePosition;
51*17e58874SMasatake YAMATO 		tag.lineNumber = xmlTag->lineNumber;
52*17e58874SMasatake YAMATO 		makeTagEntry (&tag);
53*17e58874SMasatake YAMATO 	}
54*17e58874SMasatake YAMATO }
55*17e58874SMasatake YAMATO 
56*17e58874SMasatake YAMATO static xmlSubparser svgSubparser = {
57*17e58874SMasatake YAMATO 	.subparser = {
58*17e58874SMasatake YAMATO 		.direction = SUBPARSER_BI_DIRECTION,
59*17e58874SMasatake YAMATO 	},
60*17e58874SMasatake YAMATO 	.makeTagEntryWithNodeNotify = makeTagEntryWithNodeNotify,
61*17e58874SMasatake YAMATO };
62*17e58874SMasatake YAMATO 
633441ff40SMasatake YAMATO extern parserDefinition*
SvgParser(void)643441ff40SMasatake YAMATO SvgParser (void)
653441ff40SMasatake YAMATO {
663441ff40SMasatake YAMATO 	static const char *const extensions [] = { "svg", NULL };
673441ff40SMasatake YAMATO 	parserDefinition* const def = parserNew ("SVG");
683441ff40SMasatake YAMATO 
69*17e58874SMasatake YAMATO 	static parserDependency dependencies [] = {
70*17e58874SMasatake YAMATO 		[0] = { DEPTYPE_SUBPARSER, "XML", &svgSubparser },
71*17e58874SMasatake YAMATO 	};
72*17e58874SMasatake YAMATO 
73*17e58874SMasatake YAMATO 	def->dependencies = dependencies;
74*17e58874SMasatake YAMATO 	def->dependencyCount = ARRAY_SIZE (dependencies);
75*17e58874SMasatake YAMATO 
7609ae690fSMasatake YAMATO 	def->kindTable         = SvgKinds;
773441ff40SMasatake YAMATO 	def->kindCount     = ARRAY_SIZE (SvgKinds);
783441ff40SMasatake YAMATO 	def->extensions    = extensions;
793441ff40SMasatake YAMATO 	def->parser        = findSvgTags;
803441ff40SMasatake YAMATO 	return def;
813441ff40SMasatake YAMATO }
82