summaryrefslogtreecommitdiffstats
path: root/scribus/desaxe/saxXML.cpp
blob: 460393f1a812d2373fec5c691d31551093357eec (plain)
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
/*
 *  saxXML.cpp
 *  
 *
 *  Created by Andreas Vox on 21.09.06.
 *  Copyright 2006 under GPL2. All rights reserved.
 *
 */

#include <fstream>
#include <cassert>
#include "saxXML.h"

using namespace std;

SaxXML::SaxXML(std::ostream& file, bool pretty) : m_stream(file), 
     m_pretty(pretty), m_indentLevel(0), pendingEmptyTag(false) {} 

SaxXML::SaxXML(const char* filename, bool pretty) : m_file(filename, ios::out | ios::binary), m_stream(m_file), 
     m_pretty(pretty), m_indentLevel(0), pendingEmptyTag(false) {}

SaxXML::~SaxXML() { m_stream.flush(); m_file.close(); }

void SaxXML::beginDoc()
{
	m_stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
}


void SaxXML::endDoc()
{
	m_stream << "\n";
	m_stream.flush(); m_file.close();
}


void SaxXML::finalizePendingEmptyTag()
{
	if (pendingEmptyTag) {
		if (m_pretty && m_manyAttributes)
		{
			m_stream << "\n";
			for (int k=0; k < m_indentLevel*4; ++k)
				m_stream << " ";
			m_stream << ">";
		}
		else
			m_stream << " >";
		pendingEmptyTag = false;
	}
}

void SaxXML::begin(const Xml_string& tag, Xml_attr attr)
{
	finalizePendingEmptyTag();
	assert( !tag.isNull() );
	if (m_pretty)
	{
		// indent tag
		m_stream << "\n";
		for (int k=0; k < m_indentLevel*4; ++k)
			m_stream << " ";
	}
	m_stream << "<" << fromXMLString(tag);
	Xml_attr::iterator it;
	m_manyAttributes = false;
	uint i = 0;
	for (it=attr.begin(); it != attr.end(); ++it) {
		// newline and indent every 4 attributes
		if (i > 0 && (i%4)==0 && m_pretty)
		{
			m_stream << "\n";
			for (int k=0; k < m_indentLevel*4 + 1 + tag.length(); ++k)
				m_stream << " ";
			m_manyAttributes = true;
		}
		++i;
		if (Xml_data(it).isNull())
			m_stream << " " << fromXMLString(Xml_key(it)) << "=\"\"";
		else
		{
			QString txt(Xml_data(it));
			txt.replace("&", "&amp;");
			txt.replace("\"", "&quot;");
			txt.replace("<", "&lt;");
			txt.replace(">", "&gt;"); 
			m_stream << " " << fromXMLString(Xml_key(it)) << "=\"" << fromXMLString(txt) << "\"";
		}
	}
	pendingEmptyTag = true;
	++m_indentLevel;
}


void SaxXML::end(const Xml_string& tag)
{
	--m_indentLevel;
	if (pendingEmptyTag) {
		if (m_pretty && m_manyAttributes)
		{
			m_stream << "\n";
			for (int k=0; k < m_indentLevel*4; ++k)
				m_stream << " ";
		}
		m_stream << " />"; 
		pendingEmptyTag = false;
	}
	else {
		if (m_pretty)
		{
			m_stream << "\n";
			for (int k=0; k < m_indentLevel*4; ++k)
				m_stream << " ";
		}
		m_stream << "</" << fromXMLString(tag) << ">";
	}
}


void SaxXML::chars(const Xml_string& text)
{
	finalizePendingEmptyTag();
	QString txt(text);
	txt.replace("&", "&amp;");
	txt.replace("<", "&lt;");
	txt.replace(">", "&gt;");
	m_stream << fromXMLString(txt);
}