-/* $Id: d1_write.c,v 1.6 2005-01-15 19:38:18 adam Exp $
- Copyright (C) 1995-2005
+/* $Id: d1_write.c,v 1.10 2007-01-15 15:10:14 adam Exp $
+ Copyright (C) 1995-2007
Index Data ApS
This file is part of the Zebra server.
for more details.
You should have received a copy of the GNU General Public License
-along with Zebra; see the file LICENSE.zebra. If not, write to the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
*/
/* converts data1 tree to XML record */
}
}
+static void wrbuf_write_tag(WRBUF b, const char *tag, int opening)
+{
+ int i, fixup = 0;
+
+ /* see if we must fix the tag.. The grs.marc filter produces
+ a data1 tree with not well-formed XML */
+ if (*tag >= '0' && *tag <= '9')
+ fixup = 1;
+ for (i = 0; tag[i]; i++)
+ if (strchr( " <>$,()[]", tag[i]))
+ fixup = 1;
+ if (fixup)
+ {
+ wrbuf_puts(b, "tag");
+ if (opening)
+ {
+ wrbuf_puts(b, " value=\"");
+ wrbuf_xmlputs(b, tag);
+ wrbuf_puts(b, "\"");
+ }
+ }
+ else
+ wrbuf_puts(b, tag);
+}
+
static int nodetoidsgml(data1_node *n, int select, WRBUF b, int col,
int pretty_format)
{
{
if (pretty_format)
indent (b, col);
- wrbuf_puts (b, "<");
- wrbuf_xmlputs (b, tag);
+ wrbuf_puts(b, "<");
+ wrbuf_write_tag(b, tag, 1);
wrbuf_put_xattr (b, c->u.tag.attributes);
wrbuf_puts(b, ">");
if (pretty_format)
if (pretty_format)
indent (b, col);
wrbuf_puts(b, "</");
- wrbuf_xmlputs(b, tag);
+ wrbuf_write_tag(b, tag, 0);
wrbuf_puts(b, ">");
if (pretty_format)
wrbuf_puts (b, "\n");
if (!data1_is_xmlmode (dh))
{
wrbuf_puts (b, "<");
- wrbuf_puts (b, n->u.root.type);
+ wrbuf_write_tag(b, n->u.root.type, 1);
wrbuf_puts (b, ">\n");
}
if (nodetoidsgml(n, select, b, 0, 0 /* no pretty format */))
if (!data1_is_xmlmode (dh))
{
wrbuf_puts (b, "</");
- wrbuf_puts (b, n->u.root.type);
+ wrbuf_write_tag(b, n->u.root.type, 0);
wrbuf_puts (b, ">\n");
}
*len = wrbuf_len(b);
return wrbuf_buf(b);
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+