[ci] Test Tcl bindings for dragonfly/freebsd
[xapian.git] / xapian-applications / omega / svgparser.cc
blob90fa67d36560248638e5f3bfd4aafa18bfca6848
1 /** @file
2 * @brief Extract text from an SVG file.
3 */
4 /* Copyright (C) 2010-2022 Olly Betts
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 #include <config.h>
23 #include "svgparser.h"
24 #include "stringutils.h"
26 using namespace std;
28 void
29 SvgParser::process_content(const string& content)
31 string * target = NULL;
32 switch (state) {
33 case TEXT:
34 target = &dump;
35 break;
36 case TITLE:
37 target = &title;
38 break;
39 case DC_TITLE:
40 // Prefer <title> to <dc:title>.
41 if (!title.empty()) return;
42 break;
43 case KEYWORDS:
44 target = &keywords;
45 break;
46 case AUTHOR:
47 target = &author;
48 break;
49 case METADATA: case OTHER:
50 // Ignore context in other places.
51 return;
53 if (!target->empty())
54 *target += ' ';
55 *target += content;
58 bool
59 SvgParser::opening_tag(const string& tag)
61 switch (state) {
62 case OTHER:
63 if (tag == "text" || tag == "svg:text")
64 state = TEXT;
65 else if (tag == "metadata" || tag == "svg:metadata")
66 state = METADATA;
67 else if (tag == "title")
68 state = TITLE;
69 break;
70 case METADATA:
71 // Ignore nested "dc:" tags - for example dc:title is also used to
72 // specify the creator's name inside dc:creator.
73 if (dc_tag.empty() && startswith(tag, "dc:")) {
74 dc_tag = tag;
75 if (tag == "dc:title")
76 state = DC_TITLE;
77 else if (tag == "dc:subject")
78 state = KEYWORDS;
79 else if (tag == "dc:creator")
80 state = AUTHOR;
82 break;
83 case DC_TITLE: case KEYWORDS: case TEXT: case TITLE: case AUTHOR:
84 // Avoid compiler warnings.
85 break;
87 return true;
90 bool
91 SvgParser::closing_tag(const string& tag)
93 if (tag == "text" || tag == "svg:text" ||
94 tag == "title" ||
95 tag == "metadata" || tag == "svg:metadata") {
96 state = OTHER;
97 } else if (tag == dc_tag) {
98 dc_tag.resize(0);
99 state = METADATA;
101 return true;