<h:panelGrid columns="3"> <h:outputText value="Search term:"/> <p:inputText id="searchInput" value="#{synonymsMarkTextController.searchTerm}" placeholder="Enter search term"> <p:ajax event="keyup" delay="500" update="searchContainer markText"/> </p:inputText> <p:commandButton value="Highlight" update="searchContainer markText" icon="pi pi-search"/> </h:panelGrid> <p:panel id="searchContainer" header="Searchable Content" style="margin-top: 20px"> <h:panelGroup id="searchContent" layout="block"> #{synonymsMarkTextController.processedText} </h:panelGroup> </p:panel> <pe:markText id="markText" for="searchContent" value="#{synonymsMarkTextController.searchTerm}" synonyms="#{synonymsMarkTextController.synonyms}" styleClass="marktext-highlight" actionListener="#{synonymsMarkTextController.onHighlight}"/>
@Named @ViewScoped public class SynonymsMarkTextController implements Serializable { private static final long serialVersionUID = 1L; private String searchTerm = "one"; private Map<String, String> synonyms = new HashMap<String, String>() { { put("one", "1"); put("two", "2"); put("three", "3"); put("four", "4"); put("five", "5"); } }; private String processedText = "Counting is easy: one, two, three, four, five. " + "Numbers: 1, 2, 3, 4, 5. " + "You can use either words or digits: one (1), two (2), three (3). " + "This demonstrates synonyms highlighting both ways."; private List<String> lastMatchedTerms = new ArrayList<>(); private List<MarkPosition> lastPositions = new ArrayList<>(); private String lastMatchedTermsJson; private String lastPositionsJson; public String getSearchTerm() { return searchTerm; } public void setSearchTerm(String searchTerm) { this.searchTerm = searchTerm; } public Map<String, String> getSynonyms() { return synonyms; } public void setSynonyms(Map<String, String> synonyms) { this.synonyms = synonyms; } public String getProcessedText() { return processedText; } public void setProcessedText(String processedText) { this.processedText = processedText; } public List<String> getLastMatchedTerms() { return lastMatchedTerms; } public List<MarkPosition> getLastPositions() { return lastPositions; } public void onHighlight(MarkEvent event) { this.lastMatchedTerms = event.getMatchedTerms(); this.lastPositions = event.getPositions(); this.lastMatchedTermsJson = lastMatchedTerms.toString(); this.lastPositionsJson = lastPositions.stream() .map(MarkPosition::toString) .collect(Collectors.joining(", ")); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Mark Event Triggered", "Found " + lastMatchedTerms.size() + " matched terms and " + lastPositions.size() + " positions.")); } public String getLastMatchedTermsJson() { return lastMatchedTermsJson; } public void setLastMatchedTermsJson(String lastMatchedTermsJson) { this.lastMatchedTermsJson = lastMatchedTermsJson; } public String getLastPositionsJson() { return lastPositionsJson; } public void setLastPositionsJson(String lastPositionsJson) { this.lastPositionsJson = lastPositionsJson; } }