#include #include "xml/node-event-vector.h" #include "xml/repr.h" #include "document.h" #include "sp-style-elem.h" #include "attributes.h" #include "style.h" using Inkscape::XML::TEXT_NODE; static void sp_style_elem_init(SPStyleElem *style_elem); static void sp_style_elem_class_init(SPStyleElemClass *klass); static void sp_style_elem_build(SPObject *object, SPDocument *doc, Inkscape::XML::Node *repr); static void sp_style_elem_set(SPObject *object, unsigned const key, gchar const *const value); static void sp_style_elem_read_content(SPObject *); static Inkscape::XML::Node *sp_style_elem_write(SPObject *, Inkscape::XML::Document *, Inkscape::XML::Node *, guint flags); static SPObjectClass *parent_class; GType sp_style_elem_get_type() { static GType type = 0; if (!type) { GTypeInfo info = { sizeof(SPStyleElemClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) sp_style_elem_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(SPStyleElem), 16, /* n_preallocs */ (GInstanceInitFunc) sp_style_elem_init, NULL, /* value_table */ }; type = g_type_register_static(SP_TYPE_OBJECT, "SPStyleElem", &info, (GTypeFlags) 0); } return type; } static void sp_style_elem_class_init(SPStyleElemClass *klass) { parent_class = (SPObjectClass *)g_type_class_ref(SP_TYPE_OBJECT); /* FIXME */ klass->build = sp_style_elem_build; klass->set = sp_style_elem_set; klass->read_content = sp_style_elem_read_content; klass->write = sp_style_elem_write; } static void sp_style_elem_init(SPStyleElem *style_elem) { media_set_all(style_elem->media); style_elem->is_css = false; } static void sp_style_elem_set(SPObject *object, unsigned const key, gchar const *const value) { g_return_if_fail(object); SPStyleElem &style_elem = *SP_STYLE_ELEM(object); switch (key) { case SP_ATTR_TYPE: { if (!value) { /* TODO: `type' attribute is required. Give error message as per http://www.w3.org/TR/SVG11/implnote.html#ErrorProcessing. */ style_elem.is_css = false; } else { /* fixme: determine what whitespace is allowed. Will probably need to ask on SVG * list; though the relevant RFC may give info on its lexer. */ style_elem.is_css = ( g_ascii_strncasecmp(value, "text/css", 8) == 0 && ( value[8] == '\0' || value[8] == ';' ) ); } break; } #if 0 /* unfinished */ case SP_ATTR_MEDIA: { parse_media(style_elem, value); break; } #endif /* title is ignored. */ default: { if (parent_class->set) { parent_class->set(object, key, value); } break; } } } static void child_add_rm_cb(Inkscape::XML::Node *, Inkscape::XML::Node *, Inkscape::XML::Node *, void *const data) { sp_style_elem_read_content(static_cast(data)); } static void content_changed_cb(Inkscape::XML::Node *, gchar const *, gchar const *, void *const data) { sp_style_elem_read_content(static_cast(data)); } static void child_order_changed_cb(Inkscape::XML::Node *, Inkscape::XML::Node *, Inkscape::XML::Node *, Inkscape::XML::Node *, void *const data) { sp_style_elem_read_content(static_cast(data)); } static Inkscape::XML::Node * sp_style_elem_write(SPObject *const object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint const flags) { if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { repr = xml_doc->createElement("svg:style"); } g_return_val_if_fail(object, repr); SPStyleElem &style_elem = *SP_STYLE_ELEM(object); if (flags & SP_OBJECT_WRITE_BUILD) { g_warning("nyi: Forming