Make sure EOF is defined
[xapian.git] / xapian-applications / omega / svgparse.cc
blob7a93227e8f9099c03e888594a23ca23239deb4c4
1 /** @file svgparse.cc
2 * @brief Extract text from an SVG file.
3 */
4 /* Copyright (C) 2010,2011 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 "svgparse.h"
24 #include "stringutils.h"
26 using namespace std;
28 void
29 SvgParser::process_text(const string &text)
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 KEYWORDS:
40 target = &keywords;
41 break;
42 case AUTHOR:
43 target = &author;
44 break;
45 case METADATA: case OTHER:
46 // Ignore context in other places.
47 return;
49 if (!target->empty())
50 *target += ' ';
51 *target += text;
54 bool
55 SvgParser::opening_tag(const string &tag)
57 switch (state) {
58 case OTHER:
59 if (tag == "text")
60 state = TEXT;
61 else if (tag == "metadata")
62 state = METADATA;
63 break;
64 case METADATA:
65 // Ignore nested "dc:" tags - for example dc:title is also used to
66 // specify the creator's name inside dc:creator.
67 if (dc_tag.empty() && startswith(tag, "dc:")) {
68 dc_tag = tag;
69 if (tag == "dc:title")
70 state = TITLE;
71 else if (tag == "dc:subject")
72 state = KEYWORDS;
73 else if (tag == "dc:creator")
74 state = AUTHOR;
76 break;
77 case KEYWORDS: case TEXT: case TITLE: case AUTHOR:
78 // Avoid compiler warnings.
79 break;
81 return true;
84 bool
85 SvgParser::closing_tag(const string &tag)
87 if (tag == "text" || tag == "metadata") {
88 state = OTHER;
89 } else if (tag == dc_tag) {
90 dc_tag.resize(0);
91 state = METADATA;
93 return true;