void s_XSL_FO_Listener::_outputData(const UT_UCSChar * data, UT_uint32 length) { UT_UTF8String sBuf; const UT_UCSChar * pData; UT_ASSERT(sizeof(UT_Byte) == sizeof(char)); sBuf.reserve(length); for (pData=data; (pData<data+length); /**/) { switch (*pData) { case '<': { sBuf += "<"; pData++; break; } case '>': { sBuf += ">"; pData++; break; } case '&': { sBuf += "&"; pData++; break; } case UCS_LF: // LF -- representing a Forced-Line-Break { UT_ASSERT(UT_TODO); pData++; break; } case UCS_VTAB: // VTAB -- representing a Forced-Column-Break { UT_ASSERT(UT_TODO); pData++; break; } case UCS_FF: // FF -- representing a Forced-Page-Break { UT_ASSERT(UT_TODO); pData++; break; } default: { if(*pData < 0x20) //invalid xml chars { pData++; } else { sBuf.appendUCS4(pData, 1); pData++; } break; } } } m_pie->write(sBuf.utf8_str(), sBuf.byteLength()); }
void ODe_AbiDocListener::_outputData(const UT_UCSChar* pData, UT_uint32 length) { UT_UTF8String sBuf; const UT_UCSChar* p; UT_uint32 nSpaces = 0; UT_ASSERT(sizeof(UT_Byte) == sizeof(char)); sBuf.reserve(length); for (p=pData; (p<pData+length); /**/) { switch (*p) { case '<': if(nSpaces > 1) _appendSpaces(&sBuf, nSpaces); nSpaces = 0; sBuf += "<"; p++; break; case '>': if(nSpaces > 1) _appendSpaces(&sBuf, nSpaces); nSpaces = 0; sBuf += ">"; p++; break; case '&': if(nSpaces > 1) _appendSpaces(&sBuf, nSpaces); nSpaces = 0; sBuf += "&"; p++; break; case ' ': nSpaces++; if(nSpaces == 1) sBuf.appendUCS4 (p, 1); p++; break; case UCS_LF: // LF -- representing a Forced-Line-Break if(nSpaces > 1) _appendSpaces(&sBuf, nSpaces); nSpaces = 0; m_pCurrentImpl->insertText(sBuf); m_pCurrentImpl->insertLineBreak(); sBuf.clear(); p++; break; case UCS_VTAB: // VTAB -- representing a Forced-Column-Break if(nSpaces > 1) _appendSpaces(&sBuf, nSpaces); nSpaces = 0; m_pCurrentImpl->insertText(sBuf); m_pCurrentImpl->insertColumnBreak(); sBuf.clear(); p++; break; case UCS_TAB: if(nSpaces > 1) _appendSpaces(&sBuf, nSpaces); nSpaces = 0; m_pCurrentImpl->insertText(sBuf); m_pCurrentImpl->insertTabChar(); sBuf.clear(); p++; break; case UCS_FF: // FF -- representing a Forced-Page-Break if(nSpaces > 1) _appendSpaces(&sBuf, nSpaces); nSpaces = 0; m_pCurrentImpl->insertText(sBuf); m_pCurrentImpl->insertPageBreak(); sBuf.clear(); p++; break; default: if (*p < 0x20) // Silently eat these characters. { if(nSpaces > 1) _appendSpaces(&sBuf, nSpaces); nSpaces = 0; p++; } else { if(nSpaces > 1) _appendSpaces(&sBuf, nSpaces); nSpaces = 0; sBuf.appendUCS4 (p, 1); p++; } } } if (!sBuf.empty()) { if(nSpaces > 1) _appendSpaces(&sBuf, nSpaces); nSpaces = 0; m_pCurrentImpl->insertText(sBuf); } }