Handle the fact that StyleTextPropAtom needs to work with a text length that's one larger than the underlying text it represents. (Fix from Yegor from bug #40143)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@495278 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e7c94a114b
commit
ff124420a0
@ -417,7 +417,7 @@ public class TextRun
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a new one at the right size
|
// Create a new one at the right size
|
||||||
_styleAtom = new StyleTextPropAtom(getRawText().length());
|
_styleAtom = new StyleTextPropAtom(getRawText().length() + 1);
|
||||||
|
|
||||||
// Use the TextHeader atom to get at the parent
|
// Use the TextHeader atom to get at the parent
|
||||||
RecordContainer runAtomsParent = _headerAtom.getParentRecord();
|
RecordContainer runAtomsParent = _headerAtom.getParentRecord();
|
||||||
|
@ -228,7 +228,8 @@ public class StyleTextPropAtom extends RecordAtom
|
|||||||
|
|
||||||
// While we have text in need of paragraph stylings, go ahead and
|
// While we have text in need of paragraph stylings, go ahead and
|
||||||
// grok the contents as paragraph formatting data
|
// grok the contents as paragraph formatting data
|
||||||
while(pos < rawContents.length && textHandled < size) {
|
int prsize = size;
|
||||||
|
while(pos < rawContents.length && textHandled < prsize) {
|
||||||
// First up, fetch the number of characters this applies to
|
// First up, fetch the number of characters this applies to
|
||||||
int textLen = LittleEndian.getInt(rawContents,pos);
|
int textLen = LittleEndian.getInt(rawContents,pos);
|
||||||
textHandled += textLen;
|
textHandled += textLen;
|
||||||
@ -250,11 +251,21 @@ public class StyleTextPropAtom extends RecordAtom
|
|||||||
|
|
||||||
// Save this properties set
|
// Save this properties set
|
||||||
paragraphStyles.add(thisCollection);
|
paragraphStyles.add(thisCollection);
|
||||||
|
|
||||||
|
// Handle extra 1 paragraph styles at the end
|
||||||
|
if(pos < rawContents.length && textHandled == size) {
|
||||||
|
prsize++;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (rawContents.length > 0 && textHandled != (size+1)){
|
||||||
|
System.err.println("Problem reading paragraph style runs: textHandled = " + textHandled + ", text.size+1 = " + (size+1));
|
||||||
|
}
|
||||||
|
|
||||||
// Now do the character stylings
|
// Now do the character stylings
|
||||||
textHandled = 0;
|
textHandled = 0;
|
||||||
while(pos < rawContents.length && textHandled < size) {
|
int chsize = size;
|
||||||
|
while(pos < rawContents.length && textHandled < chsize) {
|
||||||
// First up, fetch the number of characters this applies to
|
// First up, fetch the number of characters this applies to
|
||||||
int textLen = LittleEndian.getInt(rawContents,pos);
|
int textLen = LittleEndian.getInt(rawContents,pos);
|
||||||
textHandled += textLen;
|
textHandled += textLen;
|
||||||
@ -279,9 +290,12 @@ public class StyleTextPropAtom extends RecordAtom
|
|||||||
|
|
||||||
// Handle extra 1 char styles at the end
|
// Handle extra 1 char styles at the end
|
||||||
if(pos < rawContents.length && textHandled == size) {
|
if(pos < rawContents.length && textHandled == size) {
|
||||||
size++;
|
chsize++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (rawContents.length > 0 && textHandled != (size+1)){
|
||||||
|
System.err.println("Problem reading character style runs: textHandled = " + textHandled + ", text.size+1 = " + (size+1));
|
||||||
|
}
|
||||||
|
|
||||||
// Handle anything left over
|
// Handle anything left over
|
||||||
if(pos < rawContents.length) {
|
if(pos < rawContents.length) {
|
||||||
|
@ -49,7 +49,7 @@ public class TestStyleTextPropAtom extends TestCase {
|
|||||||
00, 00, 0x04, 00, // font.color only
|
00, 00, 0x04, 00, // font.color only
|
||||||
0xFF-256, 0x33, 00, 0xFE-256 // red
|
0xFF-256, 0x33, 00, 0xFE-256 // red
|
||||||
};
|
};
|
||||||
private int data_a_text_len = 54;
|
private int data_a_text_len = 0x36-1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* From a real file: 4 paragraphs with text in 4 different styles:
|
* From a real file: 4 paragraphs with text in 4 different styles:
|
||||||
@ -125,7 +125,7 @@ public class TestStyleTextPropAtom extends TestCase {
|
|||||||
28, 0, 1, 0, 0, 0, 0, 0,
|
28, 0, 1, 0, 0, 0, 0, 0,
|
||||||
3, 0, 1, 0, 24, 0
|
3, 0, 1, 0, 24, 0
|
||||||
};
|
};
|
||||||
private int data_c_text_len = 123;
|
private int data_c_text_len = 123-1;
|
||||||
|
|
||||||
|
|
||||||
public void testRecordType() throws Exception {
|
public void testRecordType() throws Exception {
|
||||||
|
Loading…
Reference in New Issue
Block a user