1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include <com/sun/star/xml/sax/SAXParseException.hpp>
27 #include <com/sun/star/xml/sax/SAXException.hpp>
28 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
29 #include <com/sun/star/xml/sax/XAttributeList.hpp>
30 #include <xmloff/nmspmap.hxx>
31 #include <xmloff/xmltoken.hxx>
32 #include "xmloff/xmlnmspe.hxx"
33
34 #ifndef _XMLOFF_TRANSFOERMERBASE_HXX
35 #include "TransformerBase.hxx"
36 #endif
37 #include "TransformerActions.hxx"
38 #include "AttrTransformerAction.hxx"
39 #include "ActionMapTypesOASIS.hxx"
40 #include "MutableAttrList.hxx"
41 #include "RenameElemTContext.hxx"
42 #include "FlatTContext.hxx"
43
44 #ifndef _XMLOFF_NOTESCONTEXT_HXX
45 #include "NotesTContext.hxx"
46 #endif
47
48 using ::rtl::OUString;
49 using namespace ::xmloff::token;
50 using namespace ::com::sun::star::uno;
51 using namespace ::com::sun::star::xml::sax;
52
53 TYPEINIT1( XMLNotesTransformerContext, XMLPersElemContentTContext );
54
XMLNotesTransformerContext(XMLTransformerBase & rImp,const OUString & rQName,XMLTokenEnum eToken,sal_Bool bPersistent)55 XMLNotesTransformerContext::XMLNotesTransformerContext(
56 XMLTransformerBase& rImp,
57 const OUString& rQName,
58 XMLTokenEnum eToken, sal_Bool bPersistent ) :
59 XMLPersElemContentTContext( rImp, rQName ),
60 m_bEndNote( sal_False ),
61 m_bPersistent( bPersistent ),
62 m_eTypeToken( eToken )
63 {
64 }
65
~XMLNotesTransformerContext()66 XMLNotesTransformerContext::~XMLNotesTransformerContext()
67 {
68 }
69
StartElement(const Reference<XAttributeList> & rAttrList)70 void XMLNotesTransformerContext::StartElement(
71 const Reference< XAttributeList >& rAttrList )
72 {
73 XMLTransformerActions *pActions =
74 GetTransformer().GetUserDefinedActions( OASIS_NOTES_ACTIONS );
75 OSL_ENSURE( pActions, "go no actions" );
76
77 Reference< XAttributeList > xAttrList( rAttrList );
78 XMLMutableAttributeList *pMutableAttrList = 0;
79 sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
80 for( sal_Int16 i=0; i < nAttrCount; i++ )
81 {
82 const OUString& rAttrName = xAttrList->getNameByIndex( i );
83 OUString aLocalName;
84 sal_uInt16 nPrefix =
85 GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
86 &aLocalName );
87 XMLTransformerActions::key_type aKey( nPrefix, aLocalName );
88 XMLTransformerActions::const_iterator aIter =
89 pActions->find( aKey );
90 if( !(aIter == pActions->end() ) )
91 {
92 const OUString& rAttrValue = xAttrList->getValueByIndex( i );
93
94 if( !pMutableAttrList )
95 {
96 pMutableAttrList =
97 new XMLMutableAttributeList( xAttrList );
98 xAttrList = pMutableAttrList;
99 }
100 switch( (*aIter).second.m_nActionType )
101 {
102 case XML_ATACTION_STYLE_FAMILY:
103 {
104 if( IsXMLToken( rAttrValue, XML_FOOTNOTE ) )
105 {
106 }
107 else if( IsXMLToken( rAttrValue, XML_ENDNOTE ) )
108 {
109 m_bEndNote = sal_True;
110 }
111 pMutableAttrList->RemoveAttributeByIndex( i );
112 --i;
113 --nAttrCount;
114 }
115 break;
116 case XML_ATACTION_DECODE_STYLE_NAME:
117 case XML_ATACTION_DECODE_STYLE_NAME_REF:
118 {
119 OUString aAttrValue( rAttrValue );
120 if( GetTransformer().DecodeStyleName(aAttrValue) )
121 pMutableAttrList->SetValueByIndex( i, aAttrValue );
122 }
123 break;
124 }
125 }
126 }
127
128 XMLTokenEnum eToken = XML_FOOTNOTE;
129 switch( m_eTypeToken )
130 {
131 case XML_NOTE:
132 eToken = (m_bEndNote ? XML_ENDNOTE : XML_FOOTNOTE);
133 break;
134 case XML_NOTES_CONFIGURATION:
135 eToken = (m_bEndNote ? XML_ENDNOTES_CONFIGURATION
136 : XML_FOOTNOTES_CONFIGURATION);
137 break;
138 case XML_NOTE_REF:
139 eToken = (m_bEndNote ? XML_ENDNOTE_REF : XML_FOOTNOTE_REF);
140 break;
141 default:
142 OSL_ENSURE( XML_NOTE==m_eTypeToken, "invalid note type" );
143 break;
144 }
145
146 SetExportQName( GetTransformer().GetNamespaceMap().GetQNameByKey(
147 XML_NAMESPACE_TEXT,
148 ::xmloff::token::GetXMLToken( eToken ) ) );
149 if( m_bPersistent )
150 XMLPersElemContentTContext::StartElement( xAttrList );
151 else
152 GetTransformer().GetDocHandler()->startElement( GetExportQName(),
153 xAttrList );
154 }
155
EndElement()156 void XMLNotesTransformerContext::EndElement()
157 {
158 if( m_bPersistent )
159 {
160 XMLPersElemContentTContext::EndElement();
161 }
162 else
163 {
164 GetTransformer().GetDocHandler()->endElement( GetExportQName() );
165 }
166 }
167
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const OUString & rQName,const Reference<XAttributeList> & rAttrList)168 XMLTransformerContext *XMLNotesTransformerContext::CreateChildContext(
169 sal_uInt16 nPrefix,
170 const OUString& rLocalName,
171 const OUString& rQName,
172 const Reference< XAttributeList >& rAttrList )
173 {
174 XMLTransformerContext *pContext = 0;
175 if( XML_NOTE == m_eTypeToken )
176 {
177 if( XML_NAMESPACE_TEXT == nPrefix )
178 {
179 XMLTokenEnum eToken ( XML_TOKEN_INVALID );
180 if( IsXMLToken( rLocalName, XML_NOTE_CITATION ) )
181 {
182 eToken = m_bEndNote ? XML_ENDNOTE_CITATION
183 : XML_FOOTNOTE_CITATION;
184 }
185 else if( IsXMLToken( rLocalName, XML_NOTE_BODY ) )
186 {
187 eToken = m_bEndNote ? XML_ENDNOTE_BODY
188 : XML_FOOTNOTE_BODY;
189 }
190
191 if( XML_TOKEN_INVALID != eToken )
192 {
193 if( m_bPersistent )
194 {
195 pContext = new XMLPersTextContentTContext(
196 GetTransformer(), rQName,
197 XML_NAMESPACE_TEXT,
198 eToken );
199 AddContent( pContext );
200
201 }
202 else
203 {
204 pContext = new XMLRenameElemTransformerContext(
205 GetTransformer(), rQName,
206 XML_NAMESPACE_TEXT,
207 eToken );
208 }
209 }
210 }
211 }
212
213 if( !pContext )
214 {
215 pContext = m_bPersistent
216 ? XMLPersElemContentTContext::CreateChildContext(
217 nPrefix, rLocalName, rQName, rAttrList )
218 : XMLTransformerContext::CreateChildContext(
219 nPrefix, rLocalName, rQName, rAttrList );
220 }
221
222 return pContext;
223 }
224
IsPersistent() const225 sal_Bool XMLNotesTransformerContext::IsPersistent() const
226 {
227 return m_bPersistent;
228 }
229