bug fixes

This commit is contained in:
Efstratios Giannopoulos 2024-05-09 12:39:25 +03:00
parent e3a9e552a7
commit 62f69d2ea5
1 changed files with 198 additions and 238 deletions

View File

@ -367,7 +367,7 @@ public class WordBuilderImpl implements WordBuilder {
}
// hasValue = createFields(multiplicityFieldset.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService, hasMultiplicityItems);
boolean hasValueInner = false;
if (fieldSetModel.getMultiplicity() != null && fieldSetModel.getMultiplicity().getTableView()) {
if (fieldSetModel.getMultiplicity() != null && fieldSetModel.getMultiplicity().getTableView() && tbl != null) {
row = tbl.createRow();
hasValueInner = createFieldsInTable(fieldSetModel, multiplicityFieldset, row, indent, createListing, hasMultiplicityItems, numOfRows, visibilityService);
numOfRows++;
@ -385,7 +385,7 @@ public class WordBuilderImpl implements WordBuilder {
}
}
if (multiplicityItems == 1) {
String text = mainDocumentPart.getLastParagraph().getRuns().get(0).getText(0);
String text = mainDocumentPart.getLastParagraph().getRuns().getFirst().getText(0);
if (text.equals("a. ")) {
mainDocumentPart.getLastParagraph().removeRun(0);
}
@ -471,78 +471,49 @@ public class WordBuilderImpl implements WordBuilder {
}
} else if (fieldValueModel != null) {
this.indent = indent;
String format = this.formatter(field, fieldValueModel);
Boolean hasMultiAutoComplete = false;
boolean isResearcher = false;
if (field.getData() instanceof LabelAndMultiplicityDataModel) {
hasMultiAutoComplete = ((LabelAndMultiplicityDataModel) field.getData()).getMultipleSelect();
}
if (field.getData() instanceof SelectDataModel) {
hasMultiAutoComplete = ((SelectDataModel) field.getData()).getMultipleSelect();
}
if (field.getData() instanceof ReferenceTypeDataModel) {
hasMultiAutoComplete = ((ReferenceTypeDataModel) field.getData()).getMultipleSelect();
isResearcher = ((ReferenceTypeDataModel) field.getData()).getReferenceType().getCode().equals(this.wordFileTransformerServiceProperties.getResearcherReferenceCode());
}
if (format != null && !format.isEmpty()) {
boolean isMultiAutoComplete = hasMultiAutoComplete != null && hasMultiAutoComplete;
boolean arrayStringFormat = format.charAt(0) == '[';
if (arrayStringFormat || isMultiAutoComplete) {
List<String> values = (arrayStringFormat) ? Arrays.asList(format.substring(1, format.length() - 1).split(",[ ]*")) : Arrays.asList(format.split(",[ ]*"));
if (values.size() > 1) {
boolean orcidResearcher;
int numOfValuesInCell = 0;
for (String val : values) {
orcidResearcher = false;
String orcId = null;
if (isResearcher && val.contains("orcid:")) {
orcId = val.substring(val.indexOf(':') + 1, val.indexOf(')'));
val = val.substring(0, val.indexOf(':') + 1) + " ";
orcidResearcher = true;
}
format = "" + val;
if (hasMultiplicityItems) {
XWPFParagraph paragraph = mainDocumentPart.getCell(mainDocumentPart.getTableCells().size()).addParagraph();
paragraph.createRun().setText(format);
if (orcidResearcher) {
XWPFHyperlinkRun run = paragraph.createHyperlinkRun("https://orcid.org/" + orcId);
run.setText(orcId);
run.setUnderline(UnderlinePatterns.SINGLE);
run.setColor("0000FF");
paragraph.createRun().setText(")");
}
hasMultiplicityItems = false;
} else {
XWPFParagraph paragraph = addCellContent(format, mainDocumentPart, field.getData().getFieldType().equals(FieldType.RICH_TEXT_AREA) ? ParagraphStyle.HTML : ParagraphStyle.TEXT, numId, indent, numOfRows, numOfCells, numOfValuesInCell);
numOfValuesInCell++;
if (orcidResearcher) {
XWPFHyperlinkRun run = paragraph.createHyperlinkRun("https://orcid.org/" + orcId);
run.setText(orcId);
run.setUnderline(UnderlinePatterns.SINGLE);
run.setColor("0000FF");
paragraph.createRun().setText(")");
}
if (paragraph != null) {
hasValue = true;
}
}
format = null;
}
} else if (values.size() == 1) {
format = values.getFirst();
List<String> extractValues = this.extractValues(field, fieldValueModel);
if (!extractValues.isEmpty()){
int numOfValuesInCell = 0;
for (String extractValue : extractValues){
boolean orcidResearcher = false;
String orcId = null;
if (isResearcher && extractValue.contains("orcid:")) {
orcId = extractValue.substring(extractValue.indexOf(':') + 1, extractValue.indexOf(')'));
extractValue = extractValue.substring(0, extractValue.indexOf(':') + 1) + " ";
orcidResearcher = true;
}
if (extractValues.size() > 1) extractValue = "" + extractValue;
if (hasMultiplicityItems) {
XWPFParagraph paragraph = mainDocumentPart.getCell(mainDocumentPart.getTableCells().size()).addParagraph();
paragraph.createRun().setText(extractValue);
if (orcidResearcher) {
XWPFHyperlinkRun run = paragraph.createHyperlinkRun("https://orcid.org/" + orcId);
run.setText(orcId);
run.setUnderline(UnderlinePatterns.SINGLE);
run.setColor("0000FF");
paragraph.createRun().setText(")");
}
hasValue = true;
hasMultiplicityItems = false;
} else {
XWPFParagraph paragraph = addCellContent(extractValue, mainDocumentPart, field.getData().getFieldType().equals(FieldType.RICH_TEXT_AREA) ? ParagraphStyle.HTML : ParagraphStyle.TEXT, numId, indent, numOfRows, numOfCells, numOfValuesInCell);
if (paragraph != null) {
numOfValuesInCell++;
if (orcidResearcher) {
XWPFHyperlinkRun run = paragraph.createHyperlinkRun("https://orcid.org/" + orcId);
run.setText(orcId);
run.setUnderline(UnderlinePatterns.SINGLE);
run.setColor("0000FF");
paragraph.createRun().setText(")");
}
hasValue = true;
}
}
}
}
if (hasMultiplicityItems && format != null) {
XWPFParagraph paragraph = mainDocumentPart.getCell(mainDocumentPart.getTableCells().size()).addParagraph();
paragraph.createRun().setText(format);
hasMultiplicityItems = false;
hasValue = true;
} else {
XWPFParagraph paragraph = addCellContent(format, mainDocumentPart, field.getData().getFieldType().equals(FieldType.RICH_TEXT_AREA) ? ParagraphStyle.HTML : ParagraphStyle.TEXT, numId, indent, numOfRows, numOfCells, 0);
if (paragraph != null) {
hasValue = true;
}
}
}
@ -617,7 +588,6 @@ public class WordBuilderImpl implements WordBuilder {
}
} else if (fieldValueModel != null) {
this.indent = indent;
String format = this.formatter(field, fieldValueModel);
boolean isMultiAutoComplete = false;
boolean isResearcher = false;
boolean isOrganization = false;
@ -639,68 +609,57 @@ public class WordBuilderImpl implements WordBuilder {
if (isOrganization || isExternalDataset || isPublication) {
if (fieldValueModel.getReferences() != null) {
for (ReferenceModel referenceModel : fieldValueModel.getReferences())
createHypeLink(mainDocumentPart, format, referenceModel.getDefinition().getFields().stream().filter(x -> x.getCode().equals("pidTypeField")).map(ReferenceFieldModel::getValue).findFirst().orElse(null), referenceModel.getReference(), hasMultiplicityItems, isMultiAutoComplete && fieldValueModel.getReferences().size() > 1);
for (ReferenceModel referenceModel : fieldValueModel.getReferences()) {
String label = "";
if (referenceModel.getLabel() != null && !referenceModel.getLabel().isBlank()) {
label = referenceModel.getLabel();
}
if (referenceModel.getDescription() != null && !referenceModel.getDescription().isBlank()) {
label = (label.isBlank() ? "" : " ") + referenceModel.getDescription();
}
createHypeLink(mainDocumentPart, label, referenceModel.getDefinition().getFields().stream().filter(x -> x.getCode().equals("pidTypeField")).map(ReferenceFieldModel::getValue).findFirst().orElse(null), referenceModel.getReference(), hasMultiplicityItems, isMultiAutoComplete && fieldValueModel.getReferences().size() > 1);
}
if (hasMultiplicityItems) hasMultiplicityItems = false;
hasValue = true;
}
} else {
if (format != null && !format.isEmpty()) {
boolean arrayStringFormat = format.charAt(0) == '[';
if (arrayStringFormat || isMultiAutoComplete) {
List<String> values = (arrayStringFormat) ? Arrays.asList(format.substring(1, format.length() - 1).split(",[ ]*")) : Arrays.asList(format.split(",[ ]*"));
if (values.size() > 1) {
boolean orcidResearcher;
for (String val : values) {
orcidResearcher = false;
String orcId = null;
if (isResearcher && val.contains("orcid:")) {
orcId = val.substring(val.indexOf(':') + 1, val.indexOf(')'));
val = val.substring(0, val.indexOf(':') + 1) + " ";
orcidResearcher = true;
}
format = "" + val;
if (hasMultiplicityItems) {
mainDocumentPart.getLastParagraph().createRun().setText(format);
if (orcidResearcher) {
XWPFHyperlinkRun run = mainDocumentPart.getLastParagraph().createHyperlinkRun("https://orcid.org/" + orcId);
run.setText(orcId);
run.setUnderline(UnderlinePatterns.SINGLE);
run.setColor("0000FF");
mainDocumentPart.getLastParagraph().createRun().setText(")");
}
hasMultiplicityItems = false;
} else {
XWPFParagraph paragraph = addParagraphContent(format, mainDocumentPart, field.getData().getFieldType().equals(FieldType.RICH_TEXT_AREA) ? ParagraphStyle.HTML : ParagraphStyle.TEXT, numId, indent);
if (orcidResearcher) {
XWPFHyperlinkRun run = paragraph.createHyperlinkRun("https://orcid.org/" + orcId);
run.setText(orcId);
run.setUnderline(UnderlinePatterns.SINGLE);
run.setColor("0000FF");
paragraph.createRun().setText(")");
}
if (paragraph != null) {
hasValue = true;
}
}
format = null;
}
} else if (values.size() == 1) {
format = values.getFirst();
List<String> extractValues = this.extractValues(field, fieldValueModel);
if (!extractValues.isEmpty()){
for (String extractValue : extractValues){
boolean orcidResearcher = false;
String orcId = null;
if (isResearcher && extractValue.contains("orcid:")) {
orcId = extractValue.substring(extractValue.indexOf(':') + 1, extractValue.indexOf(')'));
extractValue = extractValue.substring(0, extractValue.indexOf(':') + 1) + " ";
orcidResearcher = true;
}
}
}
if (format != null) {
if (hasMultiplicityItems) {
mainDocumentPart.getLastParagraph().createRun().setText(format);
hasMultiplicityItems = false;
hasValue = true;
} else {
XWPFParagraph paragraph = addParagraphContent(format, mainDocumentPart, field.getData().getFieldType().equals(FieldType.RICH_TEXT_AREA) ? ParagraphStyle.HTML : ParagraphStyle.TEXT, numId, indent);
if (paragraph != null) {
if (extractValues.size() > 1) extractValue = "" + extractValue;
if (hasMultiplicityItems) {
mainDocumentPart.getLastParagraph().createRun().setText(extractValue);
if (orcidResearcher) {
XWPFHyperlinkRun run = mainDocumentPart.getLastParagraph().createHyperlinkRun("https://orcid.org/" + orcId);
run.setText(orcId);
run.setUnderline(UnderlinePatterns.SINGLE);
run.setColor("0000FF");
mainDocumentPart.getLastParagraph().createRun().setText(")");
}
hasValue = true;
hasMultiplicityItems = false;
} else {
XWPFParagraph paragraph = addParagraphContent(extractValue, mainDocumentPart, field.getData().getFieldType().equals(FieldType.RICH_TEXT_AREA) ? ParagraphStyle.HTML : ParagraphStyle.TEXT, numId, indent);
if (paragraph != null) {
if (orcidResearcher) {
XWPFHyperlinkRun run = paragraph.createHyperlinkRun("https://orcid.org/" + orcId);
run.setText(orcId);
run.setUnderline(UnderlinePatterns.SINGLE);
run.setColor("0000FF");
paragraph.createRun().setText(")");
}
hasValue = true;
}
}
}
}
@ -716,32 +675,29 @@ public class WordBuilderImpl implements WordBuilder {
return hasValue;
}
private XWPFParagraph addCellContent(Object content, XWPFTableRow mainDocumentPart, ParagraphStyle style, BigInteger numId, int indent, int numOfRows, int numOfCells, int numOfValuesInCell) {
if (content != null) {
if (content instanceof String && ((String) content).isEmpty()) {
return null;
}
this.indent = indent;
XWPFTableCell cell;
if (numOfRows > 0 || numOfValuesInCell > 0) {
cell = mainDocumentPart.getCell(numOfCells);
} else {
cell = mainDocumentPart.createCell();
}
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.valueOf("CENTER"));
if (numOfValuesInCell == 0) {
cell.removeParagraph(0);
}
private XWPFParagraph addCellContent(String content, XWPFTableRow mainDocumentPart, ParagraphStyle style, BigInteger numId, int indent, int numOfRows, int numOfCells, int numOfValuesInCell) {
if (content == null || content.isEmpty()) return null;
this.indent = indent;
XWPFTableCell cell;
if (numOfRows > 0 || numOfValuesInCell > 0) {
cell = mainDocumentPart.getCell(numOfCells);
} else {
cell = mainDocumentPart.createCell();
}
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.valueOf("CENTER"));
if (numOfValuesInCell == 0) {
cell.removeParagraph(0);
}
XWPFParagraph paragraph = this.optionsInTable.get(style).apply(cell, content);
if (paragraph != null) {
paragraph.setAlignment(ParagraphAlignment.CENTER);
paragraph.setSpacingBefore(100);
if (numId != null) {
paragraph.setNumID(numId);
}
return paragraph;
XWPFParagraph paragraph = this.optionsInTable.get(style).apply(cell, content);
if (paragraph != null) {
paragraph.setAlignment(ParagraphAlignment.CENTER);
paragraph.setSpacingBefore(100);
if (numId != null) {
paragraph.setNumID(numId);
}
return paragraph;
}
return null;
}
@ -782,31 +738,31 @@ public class WordBuilderImpl implements WordBuilder {
}
}
private String formatter(FieldModel field, org.opencdmp.commonmodels.models.description.FieldModel fieldValueModel) throws InvalidApplicationException {
private List<String> extractValues(FieldModel field, org.opencdmp.commonmodels.models.description.FieldModel fieldValueModel) throws InvalidApplicationException {
List<String> values = new ArrayList<>();
if (fieldValueModel == null || field == null || field.getData() == null) {
return null;
return values;
}
switch (field.getData().getFieldType()) {
case REFERENCE_TYPES: {
List<String> values = new ArrayList<>();
if (fieldValueModel.getReferences() != null && !fieldValueModel.getReferences().isEmpty()) {
for (ReferenceModel referenceModel : fieldValueModel.getReferences()) {
if (referenceModel != null) {
String label = "";
if (referenceModel.getLabel() != null && !referenceModel.getLabel().isBlank()) {
values.add(referenceModel.getLabel());
label = referenceModel.getLabel();
}
if (referenceModel.getDescription() != null && !referenceModel.getDescription().isBlank()) {
values.add(referenceModel.getLabel());
label = (label.isBlank() ? "" : " ") + referenceModel.getDescription();
}
if (!label.isBlank()) values.add(label);
}
}
}
return String.join(", ", values);
break;
}
case TAGS:
case SELECT: {
List<String> values = new ArrayList<>();
if (fieldValueModel.getTextListValue() != null && !fieldValueModel.getTextListValue().isEmpty()) {
SelectDataModel selectDataModel = (SelectDataModel) field.getData();
if (selectDataModel != null && selectDataModel.getOptions() != null && !selectDataModel.getOptions().isEmpty()) {
@ -815,44 +771,54 @@ public class WordBuilderImpl implements WordBuilder {
}
}
}
return String.join(", ", values);
break;
}
case BOOLEAN_DECISION:
if (fieldValueModel.getBooleanValue() != null && fieldValueModel.getBooleanValue()) return "Yes";
if (fieldValueModel.getBooleanValue() != null && !fieldValueModel.getBooleanValue()) return "No";
return null;
if (fieldValueModel.getBooleanValue() != null && fieldValueModel.getBooleanValue()) values.add("Yes");
if (fieldValueModel.getBooleanValue() != null && !fieldValueModel.getBooleanValue()) values.add("No");
break;
case RADIO_BOX:
RadioBoxDataModel radioBoxDataModel = (RadioBoxDataModel) field.getData();
if (fieldValueModel.getTextValue() != null && radioBoxDataModel != null && radioBoxDataModel.getOptions() != null) {
for (RadioBoxDataModel.RadioBoxOptionModel option : radioBoxDataModel.getOptions()) {
if (option.getValue().equals(fieldValueModel.getTextValue()) || option.getLabel().equals(fieldValueModel.getTextValue())) return option.getLabel();
if (option.getValue().equals(fieldValueModel.getTextValue()) || option.getLabel().equals(fieldValueModel.getTextValue())) {
values.add(option.getLabel());
break;
}
}
}
return null;
case CHECK_BOX:
break;
case CHECK_BOX: {
LabelDataModel checkBoxData = (LabelDataModel) field.getData();
if (fieldValueModel.getBooleanValue() == null || !fieldValueModel.getBooleanValue()) return null;
return checkBoxData != null ? checkBoxData.getLabel() : null;
if (fieldValueModel.getBooleanValue() != null && fieldValueModel.getBooleanValue() && checkBoxData != null && checkBoxData.getLabel() != null) values.add(checkBoxData.getLabel());
break;
}
case DATE_PICKER: {
return fieldValueModel.getDateValue() != null ? DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()).format(fieldValueModel.getDateValue()) : "";
if (fieldValueModel.getDateValue() != null) values.add(DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.systemDefault()).format(fieldValueModel.getDateValue()));
break;
}
case FREE_TEXT:
case TEXT_AREA:
case RICH_TEXT_AREA:
return fieldValueModel.getTextValue() != null ? fieldValueModel.getTextValue() : "";
case RICH_TEXT_AREA: {
if (fieldValueModel.getTextValue() != null && !fieldValueModel.getTextValue().isBlank()) values.add(fieldValueModel.getTextValue());
break;
}
case DATASET_IDENTIFIER:
case VALIDATION:
case VALIDATION: {
if (fieldValueModel.getExternalIdentifier() != null) {
return "id: " + fieldValueModel.getExternalIdentifier().getIdentifier() + ", Type: " + fieldValueModel.getExternalIdentifier().getType();
values.add("id: " + fieldValueModel.getExternalIdentifier().getIdentifier() + ", Type: " + fieldValueModel.getExternalIdentifier().getType());
}
return "";
break;
}
case UPLOAD:
case INTERNAL_ENTRIES_DESCRIPTIONS:
case INTERNAL_ENTRIES_DMPS:
return null;
break;
default:
throw new InvalidApplicationException("Invalid type " + field.getData().getFieldType());
}
return values;
}
@Override
@ -908,21 +874,21 @@ public class WordBuilderImpl implements WordBuilder {
this.replaceTextSegment(p, "'{ARGOS.DATASET.TITLE}'", descriptionModel.getLabel());
}
String researchersNames = "";
StringBuilder researchersNames = new StringBuilder();
int i = 0;
for (ReferenceModel researcher : researchers) {
i++;
researchersNames += researcher.getLabel() + (i < researchers.size() ? ", " : "");
researchersNames.append(researcher.getLabel()).append(i < researchers.size() ? ", " : "");
}
this.replaceTextSegment(p, "'{ARGOS.DMP.RESEARCHERS}'", researchersNames, 15);
this.replaceTextSegment(p, "'{ARGOS.DMP.RESEARCHERS}'", researchersNames.toString(), 15);
String organisationsNames = "";
StringBuilder organisationsNames = new StringBuilder();
i = 0;
for (ReferenceModel organisation : organizations) {
i++;
organisationsNames += organisation.getLabel() + (i < organizations.size() ? ", " : "");
organisationsNames.append(organisation.getLabel()).append(i < organizations.size() ? ", " : "");
}
this.replaceTextSegment(p, "'{ARGOS.DMP.ORGANIZATIONS}'", organisationsNames, 15);
this.replaceTextSegment(p, "'{ARGOS.DMP.ORGANIZATIONS}'", organisationsNames.toString(), 15);
if (this.textSegmentExists(p, "'{ARGOS.DMP.DESCRIPTION}'")) {
descrParPos = parPos;
@ -935,27 +901,27 @@ public class WordBuilderImpl implements WordBuilder {
this.replaceTextSegment(p, "'{ARGOS.DATASET.DESCRIPTION}'", "");
}
}
if ((descrParPos != -1) && (dmpEntity != null) && (dmpEntity.getDescription() != null) && !isDescription) {
if ((descrParPos != -1) && (dmpEntity.getDescription() != null) && !isDescription) {
XmlCursor cursor = descrPar.getCTP().newCursor();
cursor.toNextSibling();
Document htmlDoc = Jsoup.parse(((String) dmpEntity.getDescription()).replaceAll("\n", "<br>"));
Document htmlDoc = Jsoup.parse((dmpEntity.getDescription()).replaceAll("\n", "<br>"));
HtmlToWorldBuilder htmlToWorldBuilder = new HtmlToWorldBuilder(descrPar, 0, cursor);
NodeTraversor.traverse(htmlToWorldBuilder, htmlDoc);
}
if ((descrParPos != -1) && (descriptionModel != null) && (descriptionModel.getDescription() != null) && isDescription) {
XmlCursor cursor = descrPar.getCTP().newCursor();
cursor.toNextSibling();
Document htmlDoc = Jsoup.parse(((String) descriptionModel.getDescription()).replaceAll("\n", "<br>"));
Document htmlDoc = Jsoup.parse((descriptionModel.getDescription()).replaceAll("\n", "<br>"));
HtmlToWorldBuilder htmlToWorldBuilder = new HtmlToWorldBuilder(descrPar, 0, cursor);
NodeTraversor.traverse(htmlToWorldBuilder, htmlDoc);
}
XWPFTable tbl = document.getTables().get(0);
XWPFTable tbl = document.getTables().getFirst();
Iterator<XWPFTableRow> it = tbl.getRows().iterator();
it.next(); // skip first row
if (it.hasNext() && !funders.isEmpty()) {
XWPFParagraph p = it.next().getCell(0).getParagraphs().get(0);
XWPFParagraph p = it.next().getCell(0).getParagraphs().getFirst();
XWPFRun run = p.createRun();
run.setText(funders.getFirst().getLabel());
run.setFontSize(15);
@ -964,7 +930,7 @@ public class WordBuilderImpl implements WordBuilder {
it = tbl.getRows().iterator();
it.next();
if (it.hasNext() && !grants.isEmpty()) {
XWPFParagraph p = it.next().getCell(1).getParagraphs().get(0);
XWPFParagraph p = it.next().getCell(1).getParagraphs().getFirst();
XWPFRun run = p.createRun();
String text = grants.getFirst().getLabel();
String reference = grants.getFirst().getReference();
@ -979,12 +945,8 @@ public class WordBuilderImpl implements WordBuilder {
}
private boolean textSegmentExists(XWPFParagraph paragraph, String textToFind) {
TextSegment foundTextSegment = null;
PositionInParagraph startPos = new PositionInParagraph(0, 0, 0);
while ((foundTextSegment = this.searchText(paragraph, textToFind, startPos)) != null) {
return true;
}
return false;
return this.searchText(paragraph, textToFind, startPos) != null;
}
private void replaceTextSegment(XWPFParagraph paragraph, String textToFind, String replacement) {
@ -992,7 +954,7 @@ public class WordBuilderImpl implements WordBuilder {
}
private void replaceTextSegment(XWPFParagraph paragraph, String textToFind, String replacement, Integer fontSize) {
TextSegment foundTextSegment = null;
TextSegment foundTextSegment;
PositionInParagraph startPos = new PositionInParagraph(0, 0, 0);
while((foundTextSegment = this.searchText(paragraph, textToFind, startPos)) != null) { // search all text segments having text to find
@ -1047,56 +1009,54 @@ public class WordBuilderImpl implements WordBuilder {
//CTR ctRun = rArray[runPos];
CTR ctRun = runs.get(runPos).getCTR();
XmlCursor c = ctRun.newCursor();
c.selectPath("./*");
try {
while (c.toNextSelection()) {
XmlObject o = c.getObject();
if (o instanceof CTText) {
if (textPos >= startText) {
String candidate = ((CTText) o).getStringValue();
if (runPos == startRun) {
charPos = startChar;
} else {
charPos = 0;
}
try (c) {
c.selectPath("./*");
while (c.toNextSelection()) {
XmlObject o = c.getObject();
if (o instanceof CTText) {
if (textPos >= startText) {
String candidate = ((CTText) o).getStringValue();
if (runPos == startRun) {
charPos = startChar;
} else {
charPos = 0;
}
for (; charPos < candidate.length(); charPos++) {
if ((candidate.charAt(charPos) == searched.charAt(0)) && (candCharPos == 0)) {
beginTextPos = textPos;
beginCharPos = charPos;
beginRunPos = runPos;
newList = true;
}
if (candidate.charAt(charPos) == searched.charAt(candCharPos)) {
if (candCharPos + 1 < searched.length()) {
candCharPos++;
} else if (newList) {
TextSegment segment = new TextSegment();
segment.setBeginRun(beginRunPos);
segment.setBeginText(beginTextPos);
segment.setBeginChar(beginCharPos);
segment.setEndRun(runPos);
segment.setEndText(textPos);
segment.setEndChar(charPos);
return segment;
}
} else {
candCharPos = 0;
}
}
}
textPos++;
} else if (o instanceof CTProofErr) {
c.removeXml();
} else if (o instanceof CTRPr) {
//do nothing
} else {
candCharPos = 0;
}
}
} finally {
c.dispose();
}
for (; charPos < candidate.length(); charPos++) {
if ((candidate.charAt(charPos) == searched.charAt(0)) && (candCharPos == 0)) {
beginTextPos = textPos;
beginCharPos = charPos;
beginRunPos = runPos;
newList = true;
}
if (candidate.charAt(charPos) == searched.charAt(candCharPos)) {
if (candCharPos + 1 < searched.length()) {
candCharPos++;
} else if (newList) {
TextSegment segment = new TextSegment();
segment.setBeginRun(beginRunPos);
segment.setBeginText(beginTextPos);
segment.setBeginChar(beginCharPos);
segment.setEndRun(runPos);
segment.setEndText(textPos);
segment.setEndChar(charPos);
return segment;
}
} else {
candCharPos = 0;
}
}
}
textPos++;
} else if (o instanceof CTProofErr) {
c.removeXml();
} else if (o instanceof CTRPr) {
//do nothing
} else {
candCharPos = 0;
}
}
}
}
return null;
}