public ComplexFileTable(byte[] documentStream, byte[] tableStream, int offset, int fcMin) { //skips through the prms before we reach the piece table. These contain data //for actual fast saved files List <SprmBuffer> sprmBuffers = new List <SprmBuffer>(); //skips through the prms before we reach the piece table. These contain data //for actual fast saved files while (tableStream[offset] == GRPPRL_TYPE) { offset++; int size = LittleEndian.GetShort(tableStream, offset); offset += LittleEndianConsts.SHORT_SIZE; byte[] bs = LittleEndian.GetByteArray(tableStream, offset, size); offset += size; SprmBuffer sprmBuffer = new SprmBuffer(bs, false, 0); sprmBuffers.Add(sprmBuffer); } this._grpprls = sprmBuffers.ToArray(); if (tableStream[offset] != TEXT_PIECE_TABLE_TYPE) { throw new IOException("The text piece table is corrupted"); } int pieceTableSize = LittleEndian.GetInt(tableStream, ++offset); offset += LittleEndianConsts.INT_SIZE; _tpt = new TextPieceTable(documentStream, tableStream, offset, pieceTableSize, fcMin); }
internal Paragraph(PAPX papx, Range parent) : base(Math.Max(parent._start, papx.Start), Math.Min(parent._end, papx.End), parent) { _props = papx.GetParagraphProperties(_doc.GetStyleSheet()); _papx = papx.GetSprmBuf(); _istd = papx.GetIstd(); }
private SprmBuffer FindHuge(SprmBuffer buf, byte[] datastream) { byte[] grpprl = buf.ToByteArray(); if (grpprl.Length == 8 && datastream != null) // then check for sprmPHugePapx { SprmOperation sprm = new SprmOperation(grpprl, 2); if ((sprm.Operation == 0x45 || sprm.Operation == 0x46) && sprm.SizeCode == 3) { int hugeGrpprlOffset = sprm.Operand; if (hugeGrpprlOffset + 1 < datastream.Length) { int grpprlSize = LittleEndian.GetShort(datastream, hugeGrpprlOffset); if (hugeGrpprlOffset + grpprlSize < datastream.Length) { byte[] hugeGrpprl = new byte[grpprlSize + 2]; // copy original istd into huge Grpprl hugeGrpprl[0] = grpprl[0]; hugeGrpprl[1] = grpprl[1]; // copy Grpprl from dataStream Array.Copy(datastream, hugeGrpprlOffset + 2, hugeGrpprl, 2, grpprlSize); return(new SprmBuffer(hugeGrpprl, 2)); } } } } return(null); }
internal Paragraph(int startIdx, int endIdx, Table parent) : base(startIdx, endIdx, parent) { InitAll(); PAPX papx = (PAPX)_paragraphs[_parEnd - 1]; _props = papx.GetParagraphProperties(_doc.GetStyleSheet()); _papx = papx.GetSprmBuf(); _istd = papx.GetIstd(); }
public byte[] GetGrpprl() { if (sectionProperties != null) { byte[] grpprl = SectionSprmCompressor .CompressSectionProperty(sectionProperties); _buf = new SprmBuffer(grpprl, 0); } return(((SprmBuffer)_buf).ToByteArray()); }
public PAPX(int fcStart, int fcEnd, CharIndexTranslator translator, SprmBuffer buf, byte[] dataStream) : base(fcStart, fcEnd, translator, buf) { _phe = new ParagraphHeight(); buf = FindHuge(buf, dataStream); if (buf != null) { _buf = buf; } }
public PAPX(int fcStart, int fcEnd, CharIndexTranslator translator, byte[] papx, ParagraphHeight phe, byte[] dataStream) : base(fcStart, fcEnd, translator, new SprmBuffer(papx, 2)) { _phe = phe; SprmBuffer buf = FindHuge(new SprmBuffer(papx, 2), dataStream); if (buf != null) { _buf = buf; } }
public PAPX(int charStart, int charEnd, byte[] papx, ParagraphHeight phe, byte[] dataStream) : base(charStart, charEnd, new SprmBuffer(papx, 2)) { _phe = phe; SprmBuffer buf = FindHuge(new SprmBuffer(papx, 2), dataStream); if (buf != null) { _buf = buf; } }
public CharacterRun InsertAfter(String text, CharacterProperties props) // { InitAll(); PAPX papx = _paragraphs[_parEnd - 1]; short istd = papx.GetIstd(); StyleSheet ss = _doc.GetStyleSheet(); CharacterProperties baseStyle = ss.GetCharacterStyle(istd); byte[] grpprl = CharacterSprmCompressor.CompressCharacterProperty(props, baseStyle); SprmBuffer buf = new SprmBuffer(grpprl); _doc.CharacterTable.Insert(_charEnd, _end, buf); _charEnd++; return(InsertAfter(text)); }
protected Paragraph InsertBefore(ParagraphProperties props, int styleIndex, String text) // { InitAll(); StyleSheet ss = _doc.GetStyleSheet(); ParagraphProperties baseStyle = ss.GetParagraphStyle(styleIndex); CharacterProperties baseChp = ss.GetCharacterStyle(styleIndex); byte[] grpprl = ParagraphSprmCompressor.CompressParagraphProperty(props, baseStyle); byte[] withIndex = new byte[grpprl.Length + LittleEndianConsts.SHORT_SIZE]; LittleEndian.PutShort(withIndex, (short)styleIndex); Array.Copy(grpprl, 0, withIndex, LittleEndianConsts.SHORT_SIZE, grpprl.Length); SprmBuffer buf = new SprmBuffer(withIndex); _doc.ParagraphTable.Insert(_parStart, _start, buf); InsertBefore(text, baseChp); return(GetParagraph(0)); }
public void Insert(int listIndex, int cpStart, SprmBuffer buf) { PAPX forInsert = new PAPX(0, 0, buf); // Ensure character OffSets are really characters forInsert.Start = cpStart; forInsert.End = cpStart; if (listIndex == _paragraphs.Count) { _paragraphs.Add(forInsert); } else { PAPX currentPap = _paragraphs[listIndex]; if (currentPap != null && currentPap.Start < cpStart) { SprmBuffer ClonedBuf = null; ClonedBuf = (SprmBuffer)currentPap.GetSprmBuf().Clone(); // Copy the properties of the one before to afterwards // Will go: // Original, until insert at point // New one // Clone of original, on to the old end PAPX clone = new PAPX(0, 0, ClonedBuf); // Again ensure Contains character based OffSets no matter what clone.Start = (cpStart); clone.End = (currentPap.End); currentPap.End = cpStart; _paragraphs.Insert(listIndex + 1, forInsert); _paragraphs.Insert(listIndex + 2, clone); } else { _paragraphs.Insert(listIndex, forInsert); } } }
public void Insert(int listIndex, int cpStart, SprmBuffer buf) { CHPX insertChpx = new CHPX(0, 0, buf); // Ensure character OffSets are really characters insertChpx.Start = (cpStart); insertChpx.End = (cpStart); if (listIndex == _textRuns.Count) { _textRuns.Add(insertChpx); } else { CHPX chpx = _textRuns[listIndex]; if (chpx.Start < cpStart) { // Copy the properties of the one before to afterwards // Will go: // Original, until insert at point // New one // Clone of original, on to the old end CHPX clone = new CHPX(0, 0, chpx.GetSprmBuf()); // Again ensure Contains character based OffSets no matter what clone.Start = (cpStart); clone.End = (chpx.End); chpx.End = (cpStart); _textRuns.Insert(listIndex + 1, insertChpx); _textRuns.Insert(listIndex + 2, clone); } else { _textRuns.Insert(listIndex, insertChpx); } } }
public void Rebuild(ComplexFileTable complexFileTable) { long start = DateTime.Now.Ticks; if (complexFileTable != null) { SprmBuffer[] sprmBuffers = complexFileTable.GetGrpprls(); // adding CHPX from fast-saved SPRMs foreach (TextPiece textPiece in complexFileTable.GetTextPieceTable() .TextPieces) { PropertyModifier prm = textPiece.PieceDescriptor.Prm; if (!prm.IsComplex()) { continue; } int igrpprl = prm.GetIgrpprl(); if (igrpprl < 0 || igrpprl >= sprmBuffers.Length) { logger.Log(POILogger.WARN, textPiece + "'s PRM references to unknown grpprl"); continue; } bool hasChp = false; SprmBuffer sprmBuffer = sprmBuffers[igrpprl]; for (SprmIterator iterator = sprmBuffer.Iterator(); ; iterator .HasNext()) { SprmOperation sprmOperation = iterator.Next(); if (sprmOperation.Type == SprmOperation.TYPE_CHP) { hasChp = true; break; } } if (hasChp) { SprmBuffer newSprmBuffer; newSprmBuffer = (SprmBuffer)sprmBuffer.Clone(); CHPX chpx = new CHPX(textPiece.Start, textPiece.End, newSprmBuffer); _textRuns.Add(chpx); } } logger.Log(POILogger.DEBUG, "Merged with CHPX from complex file table in ", DateTime.Now.Ticks - start, " ms (", _textRuns.Count, " elements in total)"); start = DateTime.Now.Ticks; } List <CHPX> oldChpxSortedByStartPos = new List <CHPX>(_textRuns); oldChpxSortedByStartPos.Sort( (IComparer <CHPX>)PropertyNode.CHPXComparator.instance); logger.Log(POILogger.DEBUG, "CHPX sorted by start position in ", DateTime.Now.Ticks - start, " ms"); start = DateTime.Now.Ticks; Dictionary <CHPX, int> chpxToFileOrder = new Dictionary <CHPX, int>(); int counter = 0; foreach (CHPX chpx in _textRuns) { chpxToFileOrder.Add(chpx, counter++); } logger.Log(POILogger.DEBUG, "CHPX's order map created in ", DateTime.Now.Ticks - start, " ms"); start = DateTime.Now.Ticks; List <int> textRunsBoundariesList; List <int> textRunsBoundariesSet = new List <int>(); foreach (CHPX chpx in _textRuns) { textRunsBoundariesSet.Add(chpx.Start); textRunsBoundariesSet.Add(chpx.End); } textRunsBoundariesSet.Remove(0); textRunsBoundariesList = new List <int>( textRunsBoundariesSet); textRunsBoundariesList.Sort(); logger.Log(POILogger.DEBUG, "Texts CHPX boundaries collected in ", DateTime.Now.Ticks - start, " ms"); start = DateTime.Now.Ticks; List <CHPX> newChpxs = new List <CHPX>(); int lastTextRunStart = 0; foreach (int objBoundary in textRunsBoundariesList) { int boundary = objBoundary; int startInclusive = lastTextRunStart; int endExclusive = boundary; lastTextRunStart = endExclusive; int startPosition = BinarySearch(oldChpxSortedByStartPos, boundary); startPosition = Math.Abs(startPosition); while (startPosition >= oldChpxSortedByStartPos.Count) { startPosition--; } while (startPosition > 0 && oldChpxSortedByStartPos[startPosition].Start >= boundary) { startPosition--; } List <CHPX> chpxs = new List <CHPX>(); for (int c = startPosition; c < oldChpxSortedByStartPos.Count; c++) { CHPX chpx = oldChpxSortedByStartPos[c]; if (boundary < chpx.Start) { break; } int left = Math.Max(startInclusive, chpx.Start); int right = Math.Min(endExclusive, chpx.End); if (left < right) { chpxs.Add(chpx); } } if (chpxs.Count == 0) { logger.Log(POILogger.WARN, "Text piece [", startInclusive, "; ", endExclusive, ") has no CHPX. Creating new one."); // create it manually CHPX chpx = new CHPX(startInclusive, endExclusive, new SprmBuffer(0)); newChpxs.Add(chpx); continue; } if (chpxs.Count == 1) { // can we reuse existing? CHPX existing = chpxs[0]; if (existing.Start == startInclusive && existing.End == endExclusive) { newChpxs.Add(existing); continue; } } CHPXToFileComparer chpxFileOrderComparator = new CHPXToFileComparer(chpxToFileOrder); chpxs.Sort(chpxFileOrderComparator); SprmBuffer sprmBuffer = new SprmBuffer(0); foreach (CHPX chpx in chpxs) { sprmBuffer.Append(chpx.GetGrpprl(), 0); } CHPX newChpx = new CHPX(startInclusive, endExclusive, sprmBuffer); newChpxs.Add(newChpx); continue; } this._textRuns = new List <CHPX>(newChpxs); logger.Log(POILogger.DEBUG, "CHPX rebuilded in ", DateTime.Now.Ticks - start, " ms (", _textRuns.Count, " elements)"); start = DateTime.Now.Ticks; CHPX previous = null; for (int iterator = _textRuns.Count; iterator != 0;) { CHPX current = previous; previous = _textRuns[--iterator]; if (current == null) { continue; } if (previous.End == current.Start && Arrays .Equals(previous.GetGrpprl(), current.GetGrpprl())) { previous.End = current.End; _textRuns.Remove(current); continue; } previous = current; } logger.Log(POILogger.DEBUG, "CHPX compacted in ", DateTime.Now.Ticks - start, " ms (", _textRuns.Count, " elements)"); }
public Format(int initialSize, int initialOffset) { this.m_grpprl = new SprmBuffer(initialSize, initialOffset); }
public CHPX(int fcStart, int fcEnd, CharIndexTranslator translator, SprmBuffer buf) : base(fcStart, translator.LookIndexBackward(fcEnd), translator, buf) { }
internal CHPX(int charStart, int charEnd, SprmBuffer buf) : base(charStart, charEnd, buf) { }
public void Rebuild(StringBuilder docText, ComplexFileTable complexFileTable) { long start = DateTime.Now.Ticks; if (complexFileTable != null) { SprmBuffer[] sprmBuffers = complexFileTable.GetGrpprls(); // adding PAPX from fast-saved SPRMs foreach (TextPiece textPiece in complexFileTable.GetTextPieceTable() .TextPieces) { PropertyModifier prm = textPiece.PieceDescriptor.Prm; if (!prm.IsComplex()) { continue; } int igrpprl = prm.GetIgrpprl(); if (igrpprl < 0 || igrpprl >= sprmBuffers.Length) { logger.Log(POILogger.WARN, textPiece + "'s PRM references to unknown grpprl"); continue; } bool hasPap = false; SprmBuffer sprmBuffer = sprmBuffers[igrpprl]; for (SprmIterator iterator = sprmBuffer.Iterator(); iterator .HasNext();) { SprmOperation sprmOperation = iterator.Next(); if (sprmOperation.Type == SprmOperation.TYPE_PAP) { hasPap = true; break; } } if (hasPap) { SprmBuffer newSprmBuffer = new SprmBuffer(2); newSprmBuffer.Append(sprmBuffer.ToByteArray()); PAPX papx = new PAPX(textPiece.Start, textPiece.End, newSprmBuffer); _paragraphs.Add(papx); } } logger.Log(POILogger.DEBUG, "Merged (?) with PAPX from complex file table in ", DateTime.Now.Ticks - start, " ms (", _paragraphs.Count, " elements in total)"); start = DateTime.Now.Ticks; } List <PAPX> oldPapxSortedByEndPos = new List <PAPX>(_paragraphs); oldPapxSortedByEndPos.Sort( (IComparer <PAPX>)PropertyNode.PAPXComparator.instance); logger.Log(POILogger.DEBUG, "PAPX sorted by end position in ", DateTime.Now.Ticks - start, " ms"); start = DateTime.Now.Ticks; Dictionary <PAPX, int> papxToFileOrder = new Dictionary <PAPX, int>(); int counter = 0; foreach (PAPX papx in _paragraphs) { papxToFileOrder[papx] = counter++; } logger.Log(POILogger.DEBUG, "PAPX's order map created in ", DateTime.Now.Ticks - start, " ms"); start = DateTime.Now.Ticks; List <PAPX> newPapxs = new List <PAPX>(); int lastParStart = 0; int lastPapxIndex = 0; for (int charIndex = 0; charIndex < docText.Length; charIndex++) { char c = docText[charIndex]; if (c != 13 && c != 7 && c != 12) { continue; } int startInclusive = lastParStart; int endExclusive = charIndex + 1; bool broken = false; List <PAPX> papxs = new List <PAPX>(); for (int papxIndex = lastPapxIndex; papxIndex < oldPapxSortedByEndPos .Count; papxIndex++) { broken = false; PAPX papx = oldPapxSortedByEndPos[papxIndex]; if (papx.End - 1 > charIndex) { lastPapxIndex = papxIndex; broken = true; break; } papxs.Add(papx); } if (!broken) { lastPapxIndex = oldPapxSortedByEndPos.Count - 1; } if (papxs.Count == 0) { logger.Log(POILogger.WARN, "Paragraph [", startInclusive, "; ", endExclusive, ") has no PAPX. Creating new one."); // create it manually PAPX papx = new PAPX(startInclusive, endExclusive, new SprmBuffer(2)); newPapxs.Add(papx); lastParStart = endExclusive; continue; } if (papxs.Count == 1) { // can we reuse existing? PAPX existing = papxs[0]; if (existing.Start == startInclusive && existing.End == endExclusive) { newPapxs.Add(existing); lastParStart = endExclusive; continue; } } PAPXToFileComparer papxFileOrderComparator = new PAPXToFileComparer(papxToFileOrder); // restore file order of PAPX papxs.Sort(papxFileOrderComparator); SprmBuffer sprmBuffer = null; foreach (PAPX papx in papxs) { if (sprmBuffer == null) { sprmBuffer = (SprmBuffer)papx.GetSprmBuf().Clone(); } else { sprmBuffer.Append(papx.GetGrpprl(), 2); } } PAPX newPapx = new PAPX(startInclusive, endExclusive, sprmBuffer); newPapxs.Add(newPapx); lastParStart = endExclusive; continue; } this._paragraphs = new List <PAPX>(newPapxs); logger.Log(POILogger.DEBUG, "PAPX rebuilded from document text in ", DateTime.Now.Ticks - start, " ms (", _paragraphs.Count, " elements)"); start = DateTime.Now.Ticks; }
public PAPX(int charStart, int charEnd, SprmBuffer buf) : base(charStart, charEnd, buf) { _phe = new ParagraphHeight(); }
/** * * @param chpx The chpx this object is based on. * @param ss The stylesheet for the document this run belongs to. * @param istd The style index if this Run's base style. * @param parent The parent range of this character run (usually a paragraph). */ internal CharacterRun(CHPX chpx, StyleSheet ss, short istd, Range parent) : base(Math.Max(parent._start, chpx.Start), Math.Min(parent._end, chpx.End), parent) { _props = chpx.GetCharacterProperties(ss, istd); _chpx = chpx.GetSprmBuf(); }
public CachedPropertyNode(int start, int end, SprmBuffer buf) : base(start, end, buf) { }
internal Format(int initialSize, int initialOffset) { m_grpprl = new SprmBuffer(initialSize, initialOffset); }