Fixed hyphens at page borders
This commit is contained in:
parent
98cfd4dd37
commit
2d208538f4
1 changed files with 71 additions and 61 deletions
|
@ -521,83 +521,37 @@ public class PageSplitter {
|
|||
int i = 0;
|
||||
NodeList сhilds = para.getChildNodes();
|
||||
while (сhilds.getLength() > i) {
|
||||
Node сhild = сhilds.item(i);
|
||||
Node child = сhilds.item(i);
|
||||
//NOT TEXT NODES
|
||||
if ((сhild.getNodeType() == Node.ELEMENT_NODE)) {
|
||||
String childName = сhild.getNodeName();
|
||||
if ((child.getNodeType() == Node.ELEMENT_NODE)) {
|
||||
String childName = child.getNodeName();
|
||||
//SPB FOUND
|
||||
if (containsSPB(сhild)){
|
||||
if (containsSPB(child)){
|
||||
if (childName.equals(TEXT_SOFT_PAGE_BREAK)){
|
||||
//Next node in paragraph. If it is text node go further
|
||||
Node paraNextNode = сhilds.item(i+1);
|
||||
Node paraPrevNode = paraBefore.getLastChild();
|
||||
String nextText = null;
|
||||
String prevText = null;
|
||||
if (paraNextNode != null && paraPrevNode != null ){
|
||||
|
||||
if (paraNextNode.getNodeType() == Node.TEXT_NODE) {
|
||||
nextText = paraNextNode.getTextContent();
|
||||
} else if (paraNextNode.getNodeType() == Node.ELEMENT_NODE) {
|
||||
Node nextNodeFirstChild = paraNextNode.getFirstChild();
|
||||
if (nextNodeFirstChild != null && nextNodeFirstChild.getNodeType() == Node.TEXT_NODE) {
|
||||
nextText = nextNodeFirstChild.getTextContent();
|
||||
}
|
||||
}
|
||||
if (paraPrevNode.getNodeType() == Node.TEXT_NODE){
|
||||
prevText = paraPrevNode.getTextContent();
|
||||
} else if (paraPrevNode.getNodeType() == Node.ELEMENT_NODE) {
|
||||
Node prevNodeLastChild = paraPrevNode.getLastChild();
|
||||
if (prevNodeLastChild != null && prevNodeLastChild.getNodeType() == Node.TEXT_NODE) {
|
||||
prevText = prevNodeLastChild.getTextContent();
|
||||
}
|
||||
}
|
||||
//If previous and next texts exists
|
||||
if (nextText != null && prevText != null) {
|
||||
//If first character in next text is a letter
|
||||
//And if last character in previous text is a letter or soft hyphen
|
||||
if (Character.isLetter(nextText.charAt(0))
|
||||
&& (Character.isLetter(prevText.charAt(prevText.length() - 1))
|
||||
|| prevText.charAt(prevText.length() - 1) == 173)) {
|
||||
paraPrevNode.setTextContent(prevText + "\u2010");
|
||||
}
|
||||
}
|
||||
}
|
||||
// In case paragraph is empty add space to prevent it's removing
|
||||
if (paraNextNode == null && paraPrevNode == null){
|
||||
Document doc = para.getOwnerDocument();
|
||||
Node space = doc.createTextNode(" ");
|
||||
para.insertBefore(space, сhild);
|
||||
}
|
||||
|
||||
// remove inner soft page break node
|
||||
para.removeChild(сhild);
|
||||
|
||||
/* Check if next node in para is text and first char is a letter
|
||||
* Check if last node in paraFirstPart is text and last char is a letter
|
||||
* If both true - add
|
||||
*/
|
||||
//removeSPB
|
||||
para.removeChild(child);
|
||||
} else {
|
||||
System.out.println("ERROR: SPB INSIDE Paragraph Element in inner element " + childName);
|
||||
//checkSoftPageBreak(internalNode, true);
|
||||
//paraFirstPart.appendChild(internalNode);
|
||||
//dataMoved = true;
|
||||
System.exit(1);
|
||||
}
|
||||
break;
|
||||
//ELEMENT WITHOUT SPB
|
||||
//Other elements
|
||||
} else if (childName.equals(TEXT_BOOKMARK_START)){
|
||||
paraBefore.appendChild(сhild.cloneNode(true));
|
||||
paraBefore.appendChild(child.cloneNode(true));
|
||||
i++;
|
||||
} else {
|
||||
paraBefore.appendChild(сhild);
|
||||
dataMoved = true;
|
||||
dataMoved = appendChild(paraBefore, child);
|
||||
}
|
||||
//TEXT NODES
|
||||
} else {
|
||||
paraBefore.appendChild(сhild);
|
||||
dataMoved = true;
|
||||
dataMoved = appendChild(paraBefore, child);
|
||||
}
|
||||
|
||||
}
|
||||
addHyphen(para,paraBefore);
|
||||
|
||||
|
||||
|
||||
if (dataMoved) {
|
||||
removeIndent(para);
|
||||
return paraBefore;
|
||||
|
@ -606,6 +560,62 @@ public class PageSplitter {
|
|||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean appendChild(Node parent, Node child) {
|
||||
boolean dataMoved;
|
||||
parent.appendChild(child);
|
||||
dataMoved = true;
|
||||
return dataMoved;
|
||||
}
|
||||
|
||||
private static void addHyphen(Node para, Node paraBefore) {
|
||||
//Debug.printNode(paraBefore);
|
||||
//Debug.printNode(para);
|
||||
Character softHyphen = 0x00ad;
|
||||
Character lastChar = getLastChar(paraBefore);
|
||||
Character firstChar = getFirstChar(para);
|
||||
|
||||
if (lastChar == null || firstChar == null) {
|
||||
return;
|
||||
}
|
||||
Node lastNode = paraBefore;
|
||||
while (lastNode.hasChildNodes()) {
|
||||
lastNode = lastNode.getLastChild();
|
||||
}
|
||||
String lineEndsWith = lastNode.getTextContent();
|
||||
if (Character.isLetter(lastChar) && Character.isLetter(firstChar)) {
|
||||
|
||||
lastNode.setTextContent(lastNode.getTextContent() + "\u2010");
|
||||
} else if (lastChar.equals(softHyphen)) {
|
||||
lastNode.setTextContent(lineEndsWith.substring(0, lineEndsWith.length()-1) + "\u2010");
|
||||
}
|
||||
}
|
||||
private static Character getLastChar(Node para) {
|
||||
if (para == null) { return null; }
|
||||
Node lastNode = para;
|
||||
while (lastNode.hasChildNodes()) {
|
||||
lastNode = lastNode.getLastChild();
|
||||
}
|
||||
String content = lastNode.getTextContent();
|
||||
if (content != null && !content.isEmpty()) {
|
||||
return content.charAt(content.length()-1);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Character getFirstChar(Node para) {
|
||||
if (para == null) { return null; }
|
||||
Node firstNode = para;
|
||||
while (firstNode.hasChildNodes()) {
|
||||
firstNode = firstNode.getFirstChild();
|
||||
}
|
||||
String content = firstNode.getTextContent();
|
||||
if (content != null && !content.isEmpty()) {
|
||||
return content.charAt(0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void removeIndent(Node paraAfter) {
|
||||
String baseStyleName = Misc.getAttribute(paraAfter, TEXT_STYLE_NAME);
|
||||
String newStyleName = officeReader.cloneParStyle(baseStyleName);
|
||||
|
|
Loading…
Add table
Reference in a new issue