/usr/include/poppler/StructElement.h is in libpoppler-private-dev 0.48.0-2+deb9u2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 | //========================================================================
//
// StructElement.h
//
// This file is licensed under the GPLv2 or later
//
// Copyright 2013, 2014 Igalia S.L.
// Copyright 2014 Luigi Scarso <luigi.scarso@gmail.com>
// Copyright 2014 Albert Astals Cid <aacid@kde.org>
//
//========================================================================
#ifndef STRUCTELEMENT_H
#define STRUCTELEMENT_H
#ifdef USE_GCC_PRAGMAS
#pragma interface
#endif
#include "goo/gtypes.h"
#include "goo/GooString.h"
#include "MarkedContentOutputDev.h"
#include "Object.h"
#include <vector>
#include <set>
class GooString;
class Dict;
class StructElement;
class StructTreeRoot;
class Attribute {
public:
enum Type {
Unknown = 0, // Uninitialized, parsing error, etc.
UserProperty, // User defined attribute (i.e. non-standard)
// Common standard attributes
Placement, WritingMode, BackgroundColor, BorderColor, BorderStyle,
BorderThickness, Color, Padding,
// Block element standard attributes
SpaceBefore, SpaceAfter, StartIndent, EndIndent, TextIndent, TextAlign,
BBox, Width, Height, BlockAlign, InlineAlign, TBorderStyle, TPadding,
// Inline element standard attributes
BaselineShift, LineHeight, TextDecorationColor, TextDecorationThickness,
TextDecorationType, RubyAlign, RubyPosition, GlyphOrientationVertical,
// Column-only standard attributes
ColumnCount, ColumnGap, ColumnWidths,
// List-only standard attributes
ListNumbering,
// PrintField-only standard attributes
Role, checked, Desc,
// Table-only standard attributes
RowSpan, ColSpan, Headers, Scope, Summary,
};
enum Owner {
UnknownOwner = 0,
// User-defined attributes
UserProperties,
// Standard attributes
Layout, List, PrintField, Table,
// Translation to other formats
XML_1_00, HTML_3_20, HTML_4_01, OEB_1_00, RTF_1_05, CSS_1_00, CSS_2_00,
};
// Creates a standard attribute. The name is predefined, and the
// value is type-checked to conform to the PDF specification.
Attribute(Type type, Object *value);
// Creates an UserProperty attribute, with an arbitrary name and value.
Attribute(const char *name, int nameLen, Object *value);
GBool isOk() const { return type != Unknown; }
// Name, type and value can be set only on construction.
Type getType() const { return type; }
Owner getOwner() const { return owner; }
const char *getTypeName() const;
const char *getOwnerName() const;
Object *getValue() const { return &value; }
static Object *getDefaultValue(Type type);
// The caller gets the ownership of the return GooString and is responsible of deleting it
GooString *getName() const { return type == UserProperty ? name.copy() : new GooString(getTypeName()); }
// The revision is optional, and defaults to zero.
Guint getRevision() const { return revision; }
void setRevision(Guint revisionA) { revision = revisionA; }
// Hidden elements should not be displayed by the user agent
GBool isHidden() const { return hidden; }
void setHidden(GBool hiddenA) { hidden = hiddenA; }
// The formatted value may be in the PDF, or be left undefined (NULL).
// In the later case the user agent should provide a default representation.
const char *getFormattedValue() const { return formatted ? formatted->getCString() : NULL; }
void setFormattedValue(const char *formattedA);
~Attribute();
private:
Type type;
Owner owner;
Guint revision;
mutable GooString name;
mutable Object value;
GBool hidden;
GooString *formatted;
GBool checkType(StructElement *element = NULL);
static Type getTypeForName(const char *name, StructElement *element = NULL);
static Attribute *parseUserProperty(Dict *property);
friend class StructElement;
};
class StructElement {
public:
enum Type {
Unknown = 0,
MCID, // MCID reference, used internally
OBJR, // Object reference, used internally
Document, Part, Art, Sect, Div, // Structural elements
Span, Quote, Note, Reference, BibEntry, // Inline elements
Code, Link, Annot,
BlockQuote, Caption, NonStruct,
TOC, TOCI, Index, Private,
P, H, H1, H2, H3, H4, H5, H6, // Paragraph-like
L, LI, Lbl, LBody, // List elements
Table, TR, TH, TD, THead, TFoot, TBody, // Table elements
Ruby, RB, RT, RP, // Ruby text elements
Warichu, WT, WP,
Figure, Formula, Form, // Illustration-like elements
};
static const Ref InvalidRef;
const char *getTypeName() const;
Type getType() const { return type; }
GBool isOk() const { return type != Unknown; }
GBool isBlock() const;
GBool isInline() const;
GBool isGrouping() const;
inline GBool isContent() const { return (type == MCID) || isObjectRef(); }
inline GBool isObjectRef() const { return (type == OBJR && c->ref.num != -1 && c->ref.gen != -1); }
int getMCID() const { return c->mcid; }
Ref getObjectRef() const { return c->ref; }
Ref getParentRef() { return isContent() ? parent->getParentRef() : s->parentRef.getRef(); }
GBool hasPageRef() const;
GBool getPageRef(Ref& ref) const;
StructTreeRoot *getStructTreeRoot() { return treeRoot; }
// Optional element identifier.
const GooString *getID() const { return isContent() ? NULL : s->id; }
GooString *getID() { return isContent() ? NULL : s->id; }
// Optional ISO language name, e.g. en_US
GooString *getLanguage() {
if (!isContent() && s->language) return s->language;
return parent ? parent->getLanguage() : NULL;
}
const GooString *getLanguage() const {
if (!isContent() && s->language) return s->language;
return parent ? parent->getLanguage() : NULL;
}
// Optional revision number, defaults to zero.
Guint getRevision() const { return isContent() ? 0 : s->revision; }
void setRevision(Guint revision) { if (isContent()) s->revision = revision; }
// Optional element title, in human-readable form.
const GooString *getTitle() const { return isContent() ? NULL : s->title; }
GooString *getTitle() { return isContent() ? NULL : s->title; }
// Optional element expanded abbreviation text.
const GooString *getExpandedAbbr() const { return isContent() ? NULL : s->expandedAbbr; }
GooString *getExpandedAbbr() { return isContent() ? NULL : s->expandedAbbr; }
unsigned getNumChildren() const { return isContent() ? 0 : s->elements.size(); }
const StructElement *getChild(int i) const { return isContent() ? NULL : s->elements.at(i); }
StructElement *getChild(int i) { return isContent() ? NULL : s->elements.at(i); }
void appendChild(StructElement *element) {
if (!isContent() && element && element->isOk()) {
s->elements.push_back(element);
}
}
unsigned getNumAttributes() const { return isContent() ? 0 : s->attributes.size(); }
const Attribute *getAttribute(int i) const { return isContent() ? NULL : s->attributes.at(i); }
Attribute *getAttribute(int i) { return isContent() ? NULL : s->attributes.at(i); }
void appendAttribute(Attribute *attribute) {
if (!isContent() && attribute) {
s->attributes.push_back(attribute);
}
}
const Attribute* findAttribute(Attribute::Type attributeType, GBool inherit = gFalse,
Attribute::Owner owner = Attribute::UnknownOwner) const;
const GooString *getAltText() const { return isContent() ? NULL : s->altText; }
GooString *getAltText() { return isContent() ? NULL : s->altText; }
const GooString *getActualText() const { return isContent() ? NULL : s->actualText; }
GooString *getActualText() { return isContent() ? NULL : s->actualText; }
// Content text referenced by the element:
//
// - For MCID reference elements, this is just the text of the
// corresponding marked content object in the page stream, regardless
// of the setting of the "recursive" flag.
// - For other elements, if the "recursive" flag is set, the text
// enclosed by *all* the child MCID reference elements of the subtree
// is returned. The text is assembled by traversing the leaf MCID
// reference elements in logical order.
// - In any other case, the function returns NULL.
//
// A new string is returned, and the ownership passed to the caller.
//
GooString *getText(GBool recursive = gTrue) const {
return appendSubTreeText(NULL, recursive);
}
const TextSpanArray getTextSpans() const {
if (!isContent())
return TextSpanArray();
MarkedContentOutputDev mcdev(getMCID());
return getTextSpansInternal(mcdev);
}
~StructElement();
private:
GooString* appendSubTreeText(GooString *string, GBool recursive) const;
const TextSpanArray& getTextSpansInternal(MarkedContentOutputDev& mcdev) const;
typedef std::vector<Attribute*> AttrPtrArray;
typedef std::vector<StructElement*> ElemPtrArray;
struct StructData {
Object parentRef;
GooString *altText;
GooString *actualText;
GooString *id;
GooString *title;
GooString *expandedAbbr;
GooString *language;
Guint revision;
ElemPtrArray elements;
AttrPtrArray attributes;
StructData();
~StructData();
};
// Data in content elements (MCID, MCR)
struct ContentData {
union {
int mcid;
Ref ref;
};
ContentData(int mcidA): mcid(mcidA) {}
ContentData(const Ref& r) { ref.num = r.num; ref.gen = r.gen; }
};
// Common data
Type type;
StructTreeRoot *treeRoot;
StructElement *parent;
mutable Object pageRef;
union {
StructData *s;
ContentData *c;
};
StructElement(Dict *elementDict, StructTreeRoot *treeRootA, StructElement *parentA, std::set<int> &seen);
StructElement(int mcid, StructTreeRoot *treeRootA, StructElement *parentA);
StructElement(const Ref &ref, StructTreeRoot *treeRootA, StructElement *parentA);
void parse(Dict* elementDict);
StructElement* parseChild(Object *ref, Object* childObj, std::set<int> &seen);
void parseChildren(Dict* element, std::set<int> &seen);
void parseAttributes(Dict *element, GBool keepExisting = gFalse);
friend class StructTreeRoot;
};
#endif
|