Skip to content

Conversation

NicolaIsotta
Copy link
Contributor

@NicolaIsotta NicolaIsotta commented May 31, 2025

This PR aims at improving the logic/heuristic behind the recognition of attributes of faces components as css classes.
In the current version, only the standard "h" library is considered; this PR adds third-party libraries (eg. PrimeFaces) as well. It also simplifies/improves the logic behind the attribute recognition.
I have tested using the primefaces-test project and the new logic seems to work well, here's the result of my tests:

Attributes found with the current logic
h:body -> [styleClass]
h:button -> [styleClass]
h:commandButton -> [styleClass]
h:commandLink -> [styleClass]
h:dataTable -> [styleClass, headerClass, footerClass, rowClasses, columnClasses, captionClass]
h:form -> [styleClass]
h:graphicImage -> [styleClass]
h:inputFile -> [styleClass]
h:inputSecret -> [styleClass]
h:inputText -> [styleClass]
h:inputTextarea -> [styleClass]
h:link -> [styleClass]
h:message -> [styleClass]
h:messages -> [styleClass]
h:outputFormat -> [styleClass]
h:outputLabel -> [styleClass]
h:outputLink -> [styleClass]
h:outputText -> [styleClass]
h:panelGrid -> [styleClass]
h:panelGroup -> [styleClass]
h:selectBooleanCheckbox -> [styleClass]
h:selectManyCheckbox -> [styleClass]
h:selectManyListbox -> [styleClass]
h:selectManyMenu -> [styleClass]
h:selectOneListbox -> [styleClass]
h:selectOneMenu -> [styleClass]
h:selectOneRadio -> [styleClass]
Attributes found with the PR applied
h:body -> [styleClass]
h:button -> [styleClass]
h:column -> [footerClass, headerClass]
h:commandButton -> [styleClass]
h:commandLink -> [styleClass]
h:dataTable -> [rowClasses, columnClasses, styleClass, headerClass, footerClass, captionClass]
h:form -> [styleClass]
h:graphicImage -> [styleClass]
h:inputFile -> [styleClass]
h:inputSecret -> [styleClass]
h:inputText -> [styleClass]
h:inputTextarea -> [styleClass]
h:link -> [styleClass]
h:message -> [errorClass, styleClass, warnClass, fatalClass, infoClass]
h:messages -> [errorClass, styleClass, warnClass, fatalClass, infoClass]
h:outputFormat -> [styleClass]
h:outputLabel -> [styleClass]
h:outputLink -> [styleClass]
h:outputText -> [styleClass]
h:panelGrid -> [rowClasses, columnClasses, styleClass, headerClass, footerClass, captionClass]
h:panelGroup -> [styleClass]
h:selectBooleanCheckbox -> [styleClass]
h:selectManyCheckbox -> [enabledClass, styleClass, selectedClass, unselectedClass, disabledClass]
h:selectManyListbox -> [enabledClass, styleClass, disabledClass]
h:selectManyMenu -> [enabledClass, styleClass, disabledClass]
h:selectOneListbox -> [enabledClass, styleClass, disabledClass]
h:selectOneMenu -> [enabledClass, styleClass, disabledClass]
h:selectOneRadio -> [enabledClass, styleClass, disabledClass]
p:accordionPanel -> [styleClass]
p:ajaxStatus -> [styleClass]
p:audio -> [styleClass]
p:autoComplete -> [styleClass, inputStyleClass, itemStyleClass, panelStyleClass]
p:avatar -> [styleClass]
p:avatarGroup -> [styleClass]
p:badge -> [styleClass]
p:barcode -> [styleClass]
p:blockUI -> [styleClass]
p:breadCrumb -> [styleClass]
p:button -> [styleClass]
p:calendar -> [styleClass, inputStyleClass]
p:card -> [styleClass]
p:carousel -> [containerStyleClass, styleClass, contentStyleClass, indicatorsContentStyleClass]
p:cascadeSelect -> [styleClass]
p:chart -> [canvasStyleClass, styleClass]
p:checkbox -> [styleClass]
p:chip -> [removeIconClass, styleClass]
p:chips -> [styleClass, inputStyleClass]
p:chronoline -> [styleClass]
p:colorPicker -> [styleClass]
p:column -> [filterStyleClass, styleClass]
p:columns -> [styleClass, filterStyleClass]
p:commandButton -> [styleClass]
p:commandLink -> [styleClass]
p:confirm -> [yesButtonClass, noButtonClass]
p:confirmDialog -> [styleClass]
p:confirmPopup -> [styleClass]
p:contextMenu -> [styleClass]
p:dashboard -> [styleClass]
p:dataGrid -> [styleClass, rowStyleClass]
p:dataList -> [styleClass, itemStyleClass]
p:dataScroller -> [styleClass]
p:dataTable -> [styleClass, rowStyleClass, tableStyleClass]
p:dataView -> [gridRowStyleClass, styleClass]
p:datePicker -> [styleClass, inputStyleClass, panelStyleClass]
p:diagram -> [styleClass]
p:dialog -> [styleClass]
p:divider -> [styleClass]
p:droppable -> [activeStyleClass, hoverStyleClass]
p:fieldset -> [styleClass]
p:fileUpload -> [styleClass, uploadButtonStyleClass, cancelButtonStyleClass, chooseButtonStyleClass]
p:galleria -> [styleClass]
p:gmap -> [styleClass]
p:graphicImage -> [styleClass]
p:headerRow -> [styleClass]
p:imageCompare -> [styleClass]
p:imageSwitch -> [styleClass]
p:inplace -> [styleClass]
p:inputMask -> [styleClass]
p:inputNumber -> [styleClass, inputStyleClass]
p:inputText -> [styleClass]
p:inputTextarea -> [styleClass]
p:keyboard -> [styleClass]
p:knob -> [styleClass]
p:link -> [styleClass]
p:linkButton -> [styleClass]
p:media -> [styleClass]
p:megaMenu -> [styleClass]
p:menu -> [styleClass]
p:menuButton -> [styleClass, buttonStyleClass, menuStyleClass]
p:menubar -> [styleClass]
p:menuitem -> [containerStyleClass, styleClass]
p:message -> [styleClass]
p:messages -> [styleClass]
p:mindmap -> [styleClass]
p:multiSelectListbox -> [styleClass]
p:notificationBar -> [styleClass]
p:orderList -> [styleClass]
p:organigram -> [styleClass]
p:organigramNode -> [styleClass]
p:outputLabel -> [styleClass]
p:outputPanel -> [styleClass]
p:overlayPanel -> [styleClass]
p:panel -> [styleClass]
p:panelGrid -> [styleClass, contentStyleClass, columnClasses]
p:panelMenu -> [styleClass]
p:password -> [styleClass]
p:photoCam -> [styleClass]
p:pickList -> [styleClass]
p:progressBar -> [styleClass]
p:radioButton -> [styleClass]
p:rating -> [styleClass]
p:row -> [styleClass]
p:rowEditor -> [styleClass]
p:rowExpansion -> [styleClass]
p:schedule -> [styleClass]
p:scrollPanel -> [styleClass]
p:scrollTop -> [styleClass]
p:selectBooleanButton -> [styleClass]
p:selectBooleanCheckbox -> [styleClass]
p:selectCheckboxMenu -> [styleClass, panelStyleClass]
p:selectManyButton -> [styleClass]
p:selectManyCheckbox -> [styleClass]
p:selectManyMenu -> [styleClass]
p:selectOneButton -> [styleClass]
p:selectOneListbox -> [styleClass]
p:selectOneMenu -> [styleClass, panelStyleClass]
p:selectOneRadio -> [styleClass, columnClasses]
p:separator -> [styleClass]
p:sidebar -> [styleClass]
p:signature -> [styleClass]
p:skeleton -> [styleClass]
p:slideMenu -> [styleClass]
p:slider -> [styleClass]
p:spacer -> [styleClass]
p:speedDial -> [maskStyleClass, styleClass, buttonStyleClass]
p:spinner -> [styleClass, downButtonStyleClass, upButtonStyleClass]
p:splitButton -> [styleClass, menuStyleClass]
p:splitter -> [styleClass]
p:splitterPanel -> [styleClass]
p:staticMessage -> [styleClass]
p:steps -> [styleClass]
p:submenu -> [styleClass]
p:tab -> [titleStyleClass]
p:tabMenu -> [styleClass]
p:tabView -> [styleClass]
p:tag -> [styleClass]
p:tagCloud -> [styleClass]
p:terminal -> [styleClass]
p:textEditor -> [styleClass]
p:tieredMenu -> [styleClass]
p:timeline -> [styleClass, dropActiveStyleClass, dropHoverStyleClass]
p:toggleSwitch -> [styleClass]
p:toolbar -> [styleClass]
p:toolbarGroup -> [styleClass]
p:tooltip -> [styleClass]
p:tree -> [styleClass]
p:treeNode -> [styleClass]
p:treeTable -> [styleClass, rowStyleClass, tableStyleClass]
p:triStateCheckbox -> [styleClass]
p:video -> [styleClass]
p:wizard -> [styleClass]

^Add meaningful description above

Click to collapse/expand PR instructions

By opening a pull request you confirm that, unless explicitly stated otherwise, the changes -

  • are all your own work, and you have the right to contribute them.
  • are contributed solely under the terms and conditions of the Apache License 2.0 (see section 5 of the license for more information).

Please make sure (eg. git log) that all commits have a valid name and email address for you in the Author field.

If you're a first time contributor, see the Contributing guidelines for more information.

If you're a committer, please label the PR before pressing "Create pull request" so that the right test jobs can run.

PR approval and merge checklist:

  1. Was this PR correctly labeled, did the right tests run? When did they run?
  2. Is this PR squashed?
  3. Are author name / email address correct? Are co-authors correctly listed? Do the commit messages need updates?
  4. Does the PR title and description still fit after the Nth iteration? Is the description sufficient to appear in the release notes?

If this PR targets the delivery branch: don't merge. (full wiki article)

@mbien mbien added Java EE/Jakarta EE [ci] enable enterprise job ci:dev-build [ci] produce a dev-build zip artifact (7 days expiration, see link on workflow summary page) Editor labels May 31, 2025
@NicolaIsotta
Copy link
Contributor Author

Updated and squashed

@matthiasblaesing
Copy link
Contributor

In general looks sane to me. But given that this a heuristic, we might try to draw a cleaner line: looking at the "now supported" list, I notice, that using the logic "ends with classes or class" would work too and reduce possible false positives. I don't remember whether JSF is case sensitive regarding its attributes, if so, not normalizing casing to lowercase might add another factor.

@NicolaIsotta
Copy link
Contributor Author

Makes sense. I'll give it a try.

@NicolaIsotta
Copy link
Contributor Author

It works. Updated and squashed.

@matthiasblaesing matthiasblaesing added this to the NB27 milestone Jun 6, 2025
Copy link
Contributor

@matthiasblaesing matthiasblaesing left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change looks sane and survived a quick local test. Lets get this in.

@NicolaIsotta thank you!

@matthiasblaesing matthiasblaesing merged commit e016f70 into apache:master Jun 6, 2025
31 checks passed
@NicolaIsotta NicolaIsotta deleted the jsf-ac branch June 6, 2025 20:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ci:dev-build [ci] produce a dev-build zip artifact (7 days expiration, see link on workflow summary page) Editor Java EE/Jakarta EE [ci] enable enterprise job
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants