How to Use Comparison Operators with CSS‑Like Selectors in OfficeCLI
OfficeCLI supports six comparison operators (=, !=, >, <, >=, <=) within CSS‑like selectors to filter document elements by numeric or lexical attributes.
OfficeCLI provides a powerful query interface for Office documents using a CSS‑like selector syntax. This article explains how to use comparison operators with CSS‑like selectors in OfficeCLI to precisely target paragraphs, runs, and other elements in Word, Excel, and PowerPoint files. The selector engine parses these operators in WordHandler.Selector.cs and evaluates them through the AttributeFilter class according to the iOfficeAI/OfficeCLI source code.
Understanding the Selector Syntax
OfficeCLI selectors mirror CSS attribute selectors. A basic selector consists of an element name followed by one or more attribute filters enclosed in square brackets:
element[attribute operator value]
You can chain multiple filters on a single element (AND logic) or use the child combinator (>) to target nested elements:
element[attr1=value1][attr2>value2] > child[attr3!=value3]
Supported Comparison Operators
The parser recognizes the following operators inside attribute brackets:
| Operator | Meaning |
|---|---|
= |
Exact equality (default) |
!= |
Not‑equal |
> |
Greater‑than |
< |
Less‑than |
>= |
Greater‑than‑or‑equal |
<= |
Less‑than‑or‑equal |
These operators work for both numeric comparisons (font sizes, line heights) and lexical comparisons (style names, text content).
How the Selector Engine Parses Operators
According to the source code in src/officecli/Handlers/Word/WordHandler.Selector.cs, the selector parser uses a regular expression to capture the operator:
@"\[@?(\w+)(\\?!?=)([^\]]+)\]"
This regex extracts the attribute name, the operator (with any leading backslash removed), and the value. After parsing via ParseSelector and SplitChildCombinator, the resulting SelectorPart objects are passed to the attribute‑filter engine implemented in src/officecli/Core/AttributeFilter.cs.
The AttributeFilter class normalizes values (e.g., stripping # from color codes), converts operators into concrete comparisons (using double.TryParse for numbers or case‑insensitive string comparison), and returns a boolean indicating whether the document node satisfies the filter.
Practical Use Cases and Examples
Numeric Comparisons
Filter elements by measurable properties like font size or row height:
# Select paragraphs with font size 14 pt or larger
officecli query "paragraph[size>=14pt]"
# Find table rows taller than 50 points
officecli query "row[height>50]"
Lexical Comparisons
Compare string attributes such as style names using alphabetical ordering:
# Select paragraphs whose style name sorts before "Heading 3"
officecli query "paragraph[style<\"Heading 3\"]"
Negation
Exclude elements that match a specific condition:
# List runs that are NOT bold
officecli query "run[bold!=true]"
Combined Filters
Chain multiple conditions to narrow results:
# Centered paragraphs larger than 12 pt
officecli query "paragraph[align=center][size>12pt]"
Child Combinator
Apply filters to child elements while maintaining parent context:
# Italic runs inside Heading 2 paragraphs
officecli query "paragraph[style=Heading2] > run[italic=true]"
Implementation Details: From Parser to Filter
The query execution flow involves several key components in the iOfficeAI/OfficeCLI repository:
- Entry Point:
CommandBuilder.Query.csreceives theofficecli querycommand and forwards the selector string. - Parsing:
WordHandler.Selector.cscontainsParseSelectorandSplitChildCombinatormethods that tokenize the selector intoSelectorPartobjects, extracting element names, attributes, operators, and values. - Evaluation:
AttributeFilter.csperforms the actual comparison logic, handling type coercion between strings and numbers and interpreting the operator stored from the regex capture group.
This architecture ensures that adding new comparison operators or attribute types requires minimal changes to the core parser.
Summary
- OfficeCLI selectors use CSS‑like syntax with element names and bracketed attribute filters.
- Six comparison operators are supported:
=,!=,>,<,>=, and<=. - The parser in
WordHandler.Selector.csextracts operators using a specific regex pattern before evaluation. - Numeric comparisons use
double.TryParse, while lexical comparisons use case‑insensitive string ordering. - Filters can be chained with AND logic and combined with child combinators (
>) for complex queries.
Frequently Asked Questions
Can I use comparison operators with Excel and PowerPoint documents, or only Word?
The selector syntax and comparison operators work across all Office document types supported by OfficeCLI. While WordHandler.Selector.cs handles Word‑specific parsing, the core AttributeFilter.cs logic is document‑agnostic and reused for Excel and PowerPoint handlers.
Are string comparisons case‑sensitive when using operators like < or >?
No, lexical comparisons performed by the AttributeFilter engine are case‑insensitive. The implementation uses standard case‑insensitive string comparison methods to ensure that style="Heading1" matches style="heading1" regardless of capitalization.
How do I escape special characters in selector values?
When attribute values contain spaces or special characters, wrap them in double quotes. For example: paragraph[style="Heading 1"]. The parser in WordHandler.Selector.cs handles quoted values within the regex capture group ([^\]]+).
Can I mix different operators in a single selector?
Yes, you can chain multiple attribute filters on the same element, and each can use a different operator. The engine treats chained filters as AND conditions. For example, paragraph[size>=12pt][size<=14pt][style!=Quote] selects paragraphs between 12 and 14 points that are not styled as quotes.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →