=== Dev Highlighter ===
Contributors:      devshujon
Tags:              keyword highlight, auto link, text highlighter, keyword linking, highlight keywords
Requires at least: 6.0
Tested up to:      7.0
Requires PHP:      7.4
Stable tag:        1.2.0
License:           GPLv2 or later
License URI:       https://www.gnu.org/licenses/gpl-2.0.html

Highlight, style, and automatically link keywords across your WordPress site with a flexible, context-aware rules engine.

== Description ==

Dev Highlighter lets you turn any word or phrase into a styled, optionally-linked highlight everywhere it appears in your content — without editing a single post by hand.

Define a keyword once, choose how it should look (text colour, background colour, bold, italic, underline), optionally give it a link, and Dev Highlighter does the rest on the front end. It is built for performance: rules are compiled and cached, and content is parsed safely with DOMDocument so your markup is never mangled.

= Key features =

* **Context-aware rules engine** — one keyword can have many rules, each with its own colour, link, and target. Highlight "Mental Health" gold site-wide, green on selected pages, and blue in a category — all at once.
* **Targeting** — apply a rule Site-Wide, or to Selected Pages, Selected Posts, Categories, Tags, or Post Types.
* **Exclusions** — exclude specific posts/pages by ID, categories, or whole post types per rule.
* **Priority system** — when several rules match, the most specific one wins (Page › Post › Category › Tag › Post Type › Site-Wide); a per-rule priority breaks ties.
* **Smart conflict detection** — the admin flags keywords with multiple rules and shows which one wins.
* **Future-proof architecture** — a pluggable condition registry and filterable scope weights make new conditions drop-in additions.
* **Unlimited keyword rules** — add as many as you need.
* **Styling** — text colour, background colour, bold, italic, and underline per keyword.
* **Auto-linking** — add an optional URL to turn a keyword into a link, with optional "open in new tab" (adds `rel="noopener noreferrer"`).
* **Smart phrase protection** — longer phrases always win, so "Mental Health Program" is never broken into "Mental Health" + "Program".
* **Post type control** — choose exactly where processing runs: Posts, Pages, or any public custom post type.
* **Safe parsing** — never touches text inside `script`, `style`, `textarea`, `pre`, `code`, or existing links.
* **Optimised CSS** — identical styles are de-duplicated into shared, generated classes; no repeated inline CSS.
* **Import / Export** — move your rules between sites as JSON, with merge or replace.
* **Performance first** — compiled rules are cached in a transient and only rebuilt when a rule changes, so sites with 500+ keywords stay fast.
* **Translation ready** — fully internationalised with the `dev-highlighter` text domain.

= Where processing runs =

Dev Highlighter only filters `the_content` on the front end. It never runs in the admin area, feeds, REST requests, AJAX requests, or cron. It makes no external/third-party HTTP requests.

= Extensible by design =

Dev Highlighter exposes documented filters and actions (`word_spotlight_condition_evaluators`, `word_spotlight_collect_conditions`, `word_spotlight_sanitize_extra_conditions`, `word_spotlight_rule_builder_fields`, and the scope-weight filters) so optional add-ons can register new targeting conditions and rule-builder fields without modifying the core engine. An optional premium add-on, **Dev Highlighter Pro**, builds on these hooks; it is a separate plugin and is not required for any feature described above.

== Installation ==

1. Upload the `dev-highlighter` folder to the `/wp-content/plugins/` directory, or install the plugin through the **Plugins** screen in WordPress.
2. Activate the plugin through the **Plugins** screen.
3. Go to **Dev Highlighter → Keywords** and add your first keyword rule.
4. Visit **Dev Highlighter → Settings** to choose which post types are processed and to set any exclusions.

== Frequently Asked Questions ==

= Does it modify my stored content? =

No. Highlighting happens on output via the `the_content` filter. Your posts are never altered in the database.

= Will it break my HTML? =

No. Content is parsed with DOMDocument rather than naive string replacement, and text inside `script`, `style`, `textarea`, `pre`, `code`, and existing `a` tags is skipped.

= How does phrase protection work? =

Keywords are sorted longest-first and matched with ordered alternation, so the longest matching phrase at any position always wins.

= Is it fast on large sites? =

Yes. Compiled rules and the generated stylesheet are cached in a transient and only rebuilt when you change a rule. A fast pre-check skips the DOM entirely on content that contains no keywords.

= How do I exclude my cart or checkout page? =

Go to **Dev Highlighter → Settings → Exclusions** and add the page slugs (for example `cart`, `checkout`, `my-account`) or their post IDs.

= Does the plugin contact any external service? =

No. The free plugin makes no outbound network requests and stores all of its data in your own WordPress database.

== Screenshots ==

1. The Keywords list with live style previews.
2. Adding a keyword with colour pickers and styling options.
3. The Settings screen with post type control and exclusions.
4. Import / Export with merge or replace.

== Changelog ==

= 1.2.0 =
* Added documented extension points (filters/actions) so optional add-ons can register custom targeting conditions and rule-builder fields without modifying the core engine.
* Internal refinements to the rules engine and admin.

= 1.1.0 =
* New: context-aware rules engine — multiple rules per keyword, each with its own styling, link, and target.
* New: rule targeting by Site-Wide, Selected Pages, Selected Posts, Categories, Tags, or Post Types.
* New: per-rule exclusions (post/page IDs, categories, post types) and a priority tiebreaker.
* New: specificity-based priority resolution (Page › Post › Category › Tag › Post Type › Site-Wide) — the most specific rule always wins.
* New: visual rule builder with a live preview and smart conflict detection.
* New: pluggable condition registry and filters for future conditions.
* Existing keywords are automatically migrated to Site-Wide rules — no action needed.

= 1.0.0 =
* Initial release.

== Upgrade Notice ==

= 1.2.0 =
Adds documented extension points for optional add-ons. The core rules engine is unchanged and all existing rules are preserved.

= 1.1.0 =
Adds a full rules engine: multiple rules per keyword with page/post/category/tag/post-type targeting and priority. Existing keywords become Site-Wide rules automatically.

= 1.0.0 =
Initial release.
