{"id":31727219,"url":"https://github.com/orkhan-muradov-dev/qt-text-matcher","last_synced_at":"2026-04-11T20:40:17.488Z","repository":{"id":318177865,"uuid":"1070237939","full_name":"orkhan-muradov-dev/qt-text-matcher","owner":"orkhan-muradov-dev","description":"A Qt Widgets application for searching and matching text in files. Started from the Qt Text Finder tutorial and evolved into a feature-rich, asynchronous search tool with filters, regex support, and a modern UI.","archived":false,"fork":false,"pushed_at":"2025-10-05T16:34:27.000Z","size":15,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-05T17:37:43.035Z","etag":null,"topics":["cpp","qt","qt-creator","qt-designer","qt-widgets","search","text-processing"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/orkhan-muradov-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-05T14:47:57.000Z","updated_at":"2025-10-05T16:34:25.000Z","dependencies_parsed_at":"2025-10-05T17:37:44.765Z","dependency_job_id":"31be1886-7f07-4dcf-80b4-d1e8d814c3b5","html_url":"https://github.com/orkhan-muradov-dev/qt-text-matcher","commit_stats":null,"previous_names":["orkhan-muradov-dev/qt-text-matcher"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/orkhan-muradov-dev/qt-text-matcher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orkhan-muradov-dev%2Fqt-text-matcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orkhan-muradov-dev%2Fqt-text-matcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orkhan-muradov-dev%2Fqt-text-matcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orkhan-muradov-dev%2Fqt-text-matcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/orkhan-muradov-dev","download_url":"https://codeload.github.com/orkhan-muradov-dev/qt-text-matcher/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orkhan-muradov-dev%2Fqt-text-matcher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000849,"owners_count":26082950,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","qt","qt-creator","qt-designer","qt-widgets","search","text-processing"],"created_at":"2025-10-09T06:19:19.423Z","updated_at":"2026-04-11T20:40:17.478Z","avatar_url":"https://github.com/orkhan-muradov-dev.png","language":"C++","funding_links":[],"categories":["C++"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eTextMatcher 🔍\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n   \u003cem\u003eA powerful text search and navigation tool built with Qt6 and modern C++\u003c/em\u003e\n\n   \u003cimg src=\"media/demo-navigation.gif\" width=\"400\" alt=\"TextMatcher Demo\"/\u003e\n\n   [![C++17](https://img.shields.io/badge/C%2B%2B-17-00599C.svg?style=flat\u0026logo=c%2B%2B)](https://isocpp.org/)\n   [![Qt6](https://img.shields.io/badge/Qt-6.0%2B-41CD52.svg?style=flat\u0026logo=qt)](https://www.qt.io/)\n   [![CMake](https://img.shields.io/badge/CMake-3.16%2B-064F8C.svg?style=flat\u0026logo=cmake)](https://cmake.org/)\n   [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat)](LICENSE)\n   [![Platform](https://img.shields.io/badge/Platform-Windows%20%7C%20Linux%20%7C%20macOS-lightgrey.svg?style=flat)](https://doc.qt.io/qt-6/supported-platforms.html)\n   [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat)](CONTRIBUTING.md)\n\n   [Features](#-features) • [Installation](#-installation) • [Usage](#-usage) • [Contributing](#-contributing)\n\n\u003c/div\u003e\n\n---\n\n## 🎯 Overview\n\nTextMatcher is a cross-platform desktop application for efficient text search and navigation. Built with Qt6 and C++17, it provides regex-powered search with real-time visual feedback and intuitive keyboard-driven navigation.\n\n**Key Highlights:**\n- **⚡ Fast Search** - Regex-based pattern matching with instant results\n- **🎨 Visual Excellence** - Smart dual-color highlighting system that distinguishes current match from all matches\n- **🧠 Intelligent Search** - Whole-word matching, case sensitivity control, and automatic wraparound\n- **⌨️ Keyboard Control** - Complete keyboard-driven workflow with intuitive shortcuts\n- **🎯 Precision Navigation** - Real-time match counter shows your exact position (e.g., \"3 of 47 matches\")\n- **🔄 State Aware** - Smart caching avoids redundant searches when navigating same results\n- **🌍 Cross-Platform** - Native look and feel on Windows, Linux, and macOS\n\n## ✨ Features\n\n### 🔍 Search Capabilities\n- **Pattern Matching** - Full QRegularExpression (PCRE2) support\n- **Whole Word Search** - Match complete words only using word boundaries\n- **Case Sensitivity** - Toggle case-sensitive/insensitive matching\n- **Bidirectional** - Navigate forward and backward through results\n- **Wraparound** - Seamlessly cycle through matches at document boundaries\n\n### 🎨 User Interface\n- **Multi-Match Highlighting** - All matches highlighted simultaneously\n- **Current Match Emphasis** - Distinct color for active result\n- **Match Counter** - Shows position like \"Matches: 3/47\"\n- **File Loading** - Native file dialogs with directory memory\n- **Keyboard Shortcuts** - Arrow keys, Enter, Ctrl+O, Ctrl+L, Ctrl+Q, Alt+W, Alt+S\n\n### ⚡ Performance\n- **Optimized Counting** - Early exit algorithm for current position\n- **State Caching** - Avoids re-counting when navigating same search\n- **Efficient Rendering** - QTextEdit extraSelections for highlighting\n- **Responsive** - Handles 1000+ matches smoothly\n\n## 📸 Screenshots\n\n\u003cdetails open\u003e\n\u003csummary\u003e\u003cb\u003eClick to view screenshots\u003c/b\u003e\u003c/summary\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" width=\"50%\"\u003e\n      \u003cimg src=\"media/feature-highlighted-matches.png\" width=\"50%\"/\u003e\n      \u003cbr\u003e\u003cb\u003e🎯 Multi-Match Highlighting\u003c/b\u003e\n      \u003cbr\u003e\u003ci\u003eAll matches highlighted, current match emphasized\u003c/i\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"50%\"\u003e\n      \u003cimg src=\"media/option-whole-word.png\" width=\"50%\"/\u003e\n      \u003cbr\u003e\u003cb\u003e📝 Whole Word Search\u003c/b\u003e\n      \u003cbr\u003e\u003ci\u003eFind \"run\" without matching \"running\"\u003c/i\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" width=\"50%\"\u003e\n      \u003cimg src=\"media/option-case-sensitive.png\" width=\"50%\"/\u003e\n      \u003cbr\u003e\u003cb\u003e🔤 Case Sensitive Mode\u003c/b\u003e\n      \u003cbr\u003e\u003ci\u003eDistinguish \"Apple\" from \"apple\"\u003c/i\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"50%\"\u003e\n      \u003cimg src=\"media/action-load-file.png\" width=\"100%\"/\u003e\n      \u003cbr\u003e\u003cb\u003e📁 File Loading\u003c/b\u003e\n      \u003cbr\u003e\u003ci\u003eQuick import with native file dialog\u003c/i\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c/details\u003e\n\n## 🚀 Installation\n\n### Prerequisites\n\nEnsure you have the following installed:\n\n| Requirement      | Minimum Version | Recommended | Download |\n|------------------|-----------------|-------------|----------|\n| **C++ Compiler** | C++17           | C++20       | [GCC](https://gcc.gnu.org/) / [Clang](https://clang.llvm.org/) / [MSVC](https://visualstudio.microsoft.com/) |\n| **Qt Framework** | 6.0             | 6.5+        | [Qt Downloads](https://www.qt.io/download) |\n| **CMake**        | 3.16            | 3.25+       | [CMake](https://cmake.org/download/) |\n| **Git**          | Any             | Latest      | [Git](https://git-scm.com/) |\n\n**Optional but Recommended:**\n- [Qt Creator](https://www.qt.io/product/development-tools) - Integrated development environment\n\n### Quick Start (5 Minutes)\n\n```bash\n# 1. Clone the repository\ngit clone https://github.com/orkhan-muradov-dev/qt-text-matcher.git\ncd qt-text-matcher\n\n# 2. Create build directory\nmkdir build \u0026\u0026 cd build\n\n# 3. Configure (replace /path/to/Qt with your Qt installation)\ncmake .. -DCMAKE_PREFIX_PATH=/path/to/Qt/6.x.x/gcc_64 -DCMAKE_BUILD_TYPE=Release\n\n# 4. Build\ncmake --build . --parallel\n\n# 5. Run!\n./TextMatcher\n```\n\n### Detailed Build Instructions\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🪟 Windows (Click to expand)\u003c/b\u003e\u003c/summary\u003e\n\n#### Using MinGW\n\n```powershell\n# Open PowerShell or Command Prompt\ngit clone https://github.com/orkhan-muradov-dev/qt-text-matcher.git\ncd qt-text-matcher\nmkdir build\ncd build\n\n# Configure with MinGW\ncmake .. -G \"MinGW Makefiles\" ^\n  -DCMAKE_PREFIX_PATH=C:/Qt/6.5.0/mingw_64 ^\n  -DCMAKE_BUILD_TYPE=Release\n\n# Build\ncmake --build . --config Release --parallel\n\n# Run\nRelease\\TextMatcher.exe\n```\n\n#### Using Visual Studio\n\n```powershell\n# Configure with Visual Studio 2022\ncmake .. -G \"Visual Studio 17 2022\" ^\n  -DCMAKE_PREFIX_PATH=C:/Qt/6.5.0/msvc2019_64 ^\n  -DCMAKE_BUILD_TYPE=Release\n\n# Build\ncmake --build . --config Release\n\n# Run\nRelease\\TextMatcher.exe\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🐧 Linux (Click to expand)\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n# Install dependencies (Ubuntu/Debian)\nsudo apt update\nsudo apt install build-essential cmake qt6-base-dev\n\n# Or on Fedora\nsudo dnf install gcc-c++ cmake qt6-qtbase-devel\n\n# Clone and build\ngit clone https://github.com/orkhan-muradov-dev/qt-text-matcher.git\ncd qt-text-matcher\nmkdir build \u0026\u0026 cd build\n\n# Configure\ncmake .. -DCMAKE_BUILD_TYPE=Release\n\n# Build with all cores\ncmake --build . --parallel $(nproc)\n\n# Run\n./TextMatcher\n```\n\n**Adding to Applications Menu:**\n```bash\n# Create desktop entry\ncat \u003e ~/.local/share/applications/textmatcher.desktop \u003c\u003c EOF\n[Desktop Entry]\nName=TextMatcher\nExec=/path/to/TextMatcher/build/TextMatcher\nIcon=/path/to/TextMatcher/media/app-overview.png\nType=Application\nCategories=Utility;TextEditor;\nEOF\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🍎 macOS (Click to expand)\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n# Install dependencies via Homebrew\nbrew install cmake qt@6\n\n# Clone and build\ngit clone https://github.com/orkhan-muradov-dev/qt-text-matcher.git\ncd qt-text-matcher\nmkdir build \u0026\u0026 cd build\n\n# Configure (may need to specify Qt path)\nexport Qt6_DIR=/usr/local/opt/qt@6/lib/cmake/Qt6\ncmake .. -DCMAKE_BUILD_TYPE=Release\n\n# Build\ncmake --build . --parallel\n\n# Run\n./TextMatcher.app/Contents/MacOS/TextMatcher\n```\n\n**Creating .app Bundle:**\n```bash\n# Use macdeployqt to create standalone application\n/path/to/Qt/6.x.x/macos/bin/macdeployqt TextMatcher.app -dmg\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🎨 Qt Creator (Recommended for Development)\u003c/b\u003e\u003c/summary\u003e\n\n1. **Open Project**\n   - Launch Qt Creator\n   - `File → Open File or Project...`\n   - Select `CMakeLists.txt` from the cloned repository\n\n2. **Configure Kit**\n   - Choose your Qt6 kit (Desktop Qt 6.x.x)\n   - Click \"Configure Project\"\n\n3. **Build \u0026 Run**\n   - Press `Ctrl+B` (Cmd+B on macOS) to build\n   - Press `Ctrl+R` (Cmd+R on macOS) to run\n\n4. **Debug**\n   - Set breakpoints by clicking line numbers\n   - Press `F5` to start debugging\n\n\u003c/details\u003e\n\n### Build Options\n\nCustomize your build with CMake options:\n\n```bash\n# Debug build with symbols\ncmake .. -DCMAKE_BUILD_TYPE=Debug\n\n# Release with debug info\ncmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo\n\n# Static linking (where applicable)\ncmake .. -DBUILD_SHARED_LIBS=OFF\n\n# Custom install prefix\ncmake .. -DCMAKE_INSTALL_PREFIX=/opt/textmatcher\n\n# Specify compiler\ncmake .. -DCMAKE_CXX_COMPILER=g++-12\n```\n\n### Verifying Installation\n\n```bash\n# Check the built executable\n./TextMatcher --version  # (if version flag implemented)\n\n# Or simply run it\n./TextMatcher\n\n# Expected: Application window opens with sample text loaded\n```\n\n## 📖 Usage\n\n### Basic Workflow\n\n1. **Start Searching**\n   - Type your search term in the \"Keyword\" field\n   - Press `Enter` or click `↓` button to find first match\n   - Current match highlighted in orange, others in yellow\n\n2. **Navigate Results**\n   - Press `↓` or `Enter` for next match\n   - Press `↑` for previous match\n   - Watch the counter update (e.g., \"Matches: 5/23\")\n\n3. **Refine Search**\n   - Check **Whole Word** (`Alt+W`) to match complete words only\n   - Check **Case Sensitive** (`Alt+S`) for exact case matching\n   - Search automatically updates\n\n4. **Load Your Files**\n   - Click `📁` button or press `Ctrl+O`\n   - Select any `.txt` file\n   - Start searching immediately\n\n### Search Options Explained\n\n| Option             | Behavior                          | Example                              |\n|--------------------|-----------------------------------|--------------------------------------|\n| **Default**        | Substring match, case-insensitive | \"cat\" finds \"cat\", \"Cat\", \"category\" |\n| **Whole Word**     | Complete words only               | \"cat\" finds \"cat\" but NOT \"category\" |\n| **Case Sensitive** | Exact case required               | \"Cat\" finds \"Cat\" but NOT \"cat\"      |\n| **Both Enabled**   | Complete words, exact case        | Most restrictive search              |\n\n## ⌨️ Keyboard Shortcuts\n\n| Shortcut | Action            | Description                             |\n|----------|-------------------|-----------------------------------------|\n| `Enter`  | Find Next         | Search forward from current position    |\n| `↓`      | Find Next         | Alternative to Enter                    |\n| `↑`      | Find Previous     | Search backward from current position   |\n| `Ctrl+O` | Open File         | Load a new text file                    |\n| `Ctrl+L` | Clear Search      | Remove search term and reset highlights |\n| `Ctrl+Q` | Quit              | Exit application                        |\n| `Alt+W`  | Toggle Whole Word | Toggle the \"Whole Word\" checkbox        |\n| `Alt+S`  | Toggle Case Sens. | Toggle the \"Case Sensitive\" checkbox    |\n\n**Tip:** Arrow keys work from anywhere in the application, making navigation seamless.\n\n## 🏗️ Architecture\n\n**Core Technologies:**\n- **Language:** C++17 (modern features: structured bindings, if-init statements)\n- **GUI Framework:** Qt6 Widgets (cross-platform native UI)\n- **Regex Engine:** QRegularExpression (PCRE2 backend)\n- **Build System:** CMake 3.16+ (modern target-based)\n- **Design Tool:** Qt Designer (`.ui` XML format)\n\n### Project Structure\n\n```\nTextMatcher/\n├── 📄 README.md             # This file\n├── 📄 CHANGELOG.md          # Version history\n├── 📄 LICENSE               # MIT License\n├── 📄 .gitignore            # Git ignore rules\n│\n├── 📁 src/                  # Source code\n│   ├── 📄 CMakeLists.txt    # Build configuration\n│   ├── 📝 main.cpp          # Application entry point\n│   ├── 📝 textmatcher.h     # Class declaration\n│   ├── 📝 textmatcher.cpp   # Implementation\n│   ├── 📝 textmatcher.ui    # Qt Designer UI (XML)\n│   ├── 📝 textmatcher.qrc   # Qt resources (embedded files)\n│   └── 📄 input.txt         # Embedded sample text\n│\n└── 📁 media/                # Screenshots, gifs\n```\n\n### Core Components\n\n**SearchOptions Struct**\n- Encapsulates QRegularExpression, FindFlags, and PatternOptions\n- Handles regex compilation with automatic escaping\n- Provides validation via `isValid()` method\n\n**State Management**\n- `m_totalMatches` - Cached count to avoid recalculation\n- `m_lastRegexPattern` - Detects when new search is needed\n- `m_lastFolder` - Remembers last opened directory\n\n**Search Algorithm**\n- Forward/backward iteration with same core logic\n- Early exit when counting to current position\n- Wraparound at document start/end\n\n**Highlighting System**\n- QTextEdit::ExtraSelection for non-invasive overlay\n- Dual colors: orange for current, yellow for others\n- Single-pass rendering for efficiency\n\n### Code Architecture\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eClass Design (Click to expand)\u003c/b\u003e\u003c/summary\u003e\n\n```cpp\nclass TextMatcher : public QWidget {\n    // --- Nested Types ---\n    struct SearchOptions {\n        QRegularExpression regex;           // Compiled pattern\n        QTextDocument::FindFlags flags;     // Search direction \u0026 options\n        QRegularExpression::PatternOptions patternOptions;\n        \n        SearchOptions(const QString\u0026 text, bool wholeWord, bool caseSensitive);\n        bool isValid() const;\n    };\n\n    // --- State Management ---\n    size_t m_totalMatches;                  // Cached match count\n    QString m_lastRegexPattern;             // Previous search pattern\n    QRegularExpression::PatternOptions m_lastPatternOptions;\n    QString m_lastFolder;                   // Last opened directory\n\n    // --- Core Search Logic ---\n    void performFind(bool backwards);       // Main search orchestration\n    size_t countMatches(...);               // Efficient match counting\n    void highlightAllMatches(...);          // Visual feedback system\n    \n    // --- State Optimization ---\n    bool isNewSearch(...) const;            // Avoid redundant work\n    void resetSearchState();                // Clean slate\n};\n```\n\n**Key Design Principles:**\n1. **Encapsulation:** SearchOptions bundles regex + flags\n2. **State Caching:** Avoid re-counting matches on navigation\n3. **Separation of Concerns:** UI, search logic, state management decoupled\n4. **RAII:** Qt's parent-child ownership handles cleanup\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eSearch Algorithm (Click to expand)\u003c/b\u003e\u003c/summary\u003e\n\n**Match Counting Strategy:**\n```cpp\n// Optimized counting stops early when finding current position\nsize_t countMatches(search, stopAtCurrentSelection) {\n    iterate through document with regex\n    if (stopAtCurrentSelection \u0026\u0026 cursor matches current selection)\n        break;  // Found our position\n    return count;\n}\n```\n\n**Highlighting System:**\n```cpp\n// Dual-color system for visual feedback\nQTextEdit::ExtraSelection {\n    cursor: match_position\n    format.background: (isCurrent ? Orange : Yellow)\n}\n```\n\n**State Machine:**\n```\nNew Search → Count Total → Highlight All → Navigate\n                ↑                              ↓\n                └──────── Same Search ─────────┘\n```\n\n\u003c/details\u003e\n\n## 🔧 Configuration\n\n### Customizing Colors\n\nEdit `textmatcher.cpp` to change highlight colors:\n\n```cpp\nnamespace {\n    const QColor HighlightColor(100, 92, 17);        // All matches (yellow)\n    const QColor CurrentHighlightColor(100, 52, 17); // Current match (orange)\n}\n```\n\n### Default Sample Text\n\nModify `input.txt` to change the embedded sample text:\n\n```txt\nYour custom sample text here.\nThis will be embedded in the application binary.\n```\n\nRebuild after changes: `cmake --build . --parallel`\n\n### Build Flags\n\nFine-tune compilation:\n\n```bash\n# Enable compiler warnings\ncmake .. -DCMAKE_CXX_FLAGS=\"-Wall -Wextra -Wpedantic\"\n\n# Optimize for size\ncmake .. -DCMAKE_BUILD_TYPE=MinSizeRel\n\n# Link-time optimization\ncmake .. -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON\n\n# Generate compile_commands.json for LSP\ncmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON\n```\n\n## 🧪 Testing\n\n### Manual Testing\n\n1. **Basic Search**\n   ```\n   Input: \"the\"\n   Expected: Multiple matches highlighted\n   ```\n\n2. **Whole Word**\n   ```\n   Input: \"test\" (Whole Word enabled)\n   Should NOT match: \"testing\", \"attest\"\n   Should match: \"test\", \"Test\"\n   ```\n\n3. **Case Sensitive**\n   ```\n   Input: \"Test\" (Case Sensitive enabled)\n   Should NOT match: \"test\"\n   Should match: \"Test\"\n   ```\n\n4. **Navigation**\n   ```\n   - Verify wraparound at document start/end\n   - Check counter updates correctly (e.g., 1/5 → 2/5 → ...)\n   ```\n\n5. **Edge Cases**\n   ```\n   - Empty search term (should reset)\n   - No matches found (should show 0/0)\n   - Single match (wraparound should work)\n   ```\n\n### Future Testing\n\nPlanned additions:\n- Qt Test framework integration\n- Automated UI testing\n- Performance benchmarks\n- Regression test suite\n\n## 🗺️ Roadmap\n\n### Current Version (0.8.3)\n- [x] Core search functionality\n- [x] Dual-color highlighting\n- [x] Keyboard shortcuts\n- [x] File loading\n\n### Future Enhancements\n- [ ] **Search History** - Dropdown of recent searches\n- [ ] **Replace Functionality** - Find and replace text\n- [ ] **Custom Themes** - User-configurable colors\n\nSee [GitHub Issues](https://github.com/orkhan-muradov-dev/qt-text-matcher/issues) for detailed feature requests and bugs.\n\n## 🐛 Troubleshooting\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eBuild Errors\u003c/b\u003e\u003c/summary\u003e\n\n**Problem:** `CMake Error: Could not find Qt6`\n\n**Solution:**\n```bash\n# Specify Qt6 path explicitly\ncmake .. -DCMAKE_PREFIX_PATH=/path/to/Qt/6.x.x/gcc_64\n```\n\n**Problem:** `error: 'QString' has not been declared`\n\n**Solution:** Ensure you're using C++17:\n```bash\ncmake .. -DCMAKE_CXX_STANDARD=17\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eRuntime Issues\u003c/b\u003e\u003c/summary\u003e\n\n**Problem:** Application won't start - missing Qt libraries\n\n**Solution (Linux):**\n```bash\n# Add Qt libraries to LD_LIBRARY_PATH\nexport LD_LIBRARY_PATH=/path/to/Qt/6.x.x/gcc_64/lib:$LD_LIBRARY_PATH\n```\n\n**Solution (Windows):**\n- Copy Qt DLLs to executable directory, or\n- Add Qt bin directory to PATH, or\n- Use `windeployqt.exe TextMatcher.exe`\n\n**Problem:** File dialog doesn't appear\n\n**Solution:** Install platform plugins:\n```bash\n# Linux\nsudo apt install qt6-qpa-plugins\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eSearch Not Working\u003c/b\u003e\u003c/summary\u003e\n\n**Problem:** No matches found despite visible text\n\n**Check:**\n1. Case sensitivity setting (try disabling)\n2. Whole word setting (try disabling)\n3. Verify text is in the text edit widget\n4. Check for trailing spaces in search term\n\n\u003c/details\u003e\n\n## 🤝 Contributing\n\nWe welcome contributions of all kinds! Whether you're fixing bugs, adding features, improving documentation, or suggesting ideas, your input is valued.\n\n### How to Contribute\n\n1. **Fork the Repository**\n   ```bash\n   # Click 'Fork' on GitHub, then clone your fork\n   git clone https://github.com/YOUR_USERNAME/qt-text-matcher.git\n   ```\n\n2. **Create a Feature Branch**\n   ```bash\n   git checkout -b feature/amazing-new-feature\n   ```\n\n3. **Make Your Changes**\n   - Write clean, documented code\n   - Follow existing code style\n   - Test thoroughly\n\n4. **Commit with Clear Messages**\n   ```bash\n   git commit -m \"feat: add search history dropdown\"\n   ```\n\n5. **Push and Create Pull Request**\n   ```bash\n   git push origin feature/amazing-new-feature\n   # Then open PR on GitHub\n   ```\n\n### Contribution Guidelines\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eCode Style (Click to expand)\u003c/b\u003e\u003c/summary\u003e\n\n- **Indentation:** 4 spaces\n- **Naming:**\n  - Classes: `PascalCase`\n  - Functions: `camelCase`\n  - Variables: `camelCase`\n  - Member variables: `m_camelCase`\n  - Constants: `UPPER_SNAKE_CASE`\n- **Braces:** Allman style (braces on new line)\n- **Comments:** Use `//` for single-line, `/* */` for multi-line\n- **Headers:** Include guards with `#ifndef FILENAME_H`\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eCommit Message Format\u003c/b\u003e\u003c/summary\u003e\n\nUse [Conventional Commits](https://www.conventionalcommits.org/):\n\n```\ntype(scope): short description\n\nLonger description if needed.\n\nFixes #123\n```\n\n**Types:**\n- `feat`: New feature\n- `fix`: Bug fix\n- `docs`: Documentation only\n- `style`: Code style (formatting, no logic change)\n- `refactor`: Code restructuring\n- `perf`: Performance improvement\n- `test`: Adding tests\n- `chore`: Maintenance tasks\n\n**Examples:**\n```\nfeat(search): add regex mode toggle\nfix(ui): correct match counter display\ndocs(readme): update build instructions\n```\n\n\u003c/details\u003e\n\n### Areas for Contribution\n\n- 🐛 **Bug Fixes:** Check [open issues](https://github.com/orkhan-muradov-dev/qt-text-matcher/issues)\n- ✨ **New Features:** See [roadmap](#-roadmap)\n- 📚 **Documentation:** Improve README, add tutorials\n- 🌍 **Translations:** Internationalization support\n- 🎨 **UI/UX:** Design improvements, accessibility\n- ⚡ **Performance:** Optimization opportunities\n- 🧪 **Testing:** Write unit/integration tests\n\n### Code of Conduct\n\nWe follow the [Contributor Covenant Code of Conduct](https://www.contributor-covenant.org/). Please be respectful and constructive in all interactions.\n\n## 📜 License\n\nThis project is licensed under the **MIT License** - see the [LICENSE](LICENSE) file for full details.\n\n**TL;DR:** You can do almost anything with this code. Attribution appreciated but not required.\n\n## 📬 Support \u0026 Contact\n\n### Getting Help\n\n- 📖 **Documentation:** You're reading it!\n- 💬 **Discussions:** [GitHub Discussions](https://github.com/orkhan-muradov-dev/qt-text-matcher/discussions)\n- 🐛 **Bug Reports:** [GitHub Issues](https://github.com/orkhan-muradov-dev/qt-text-matcher/issues)\n- 📧 **Email:** orkhan.muradov.business@gmail.com\n\n### Community\n\n- ⭐ **Star this repo** if you find it useful!\n- 🐦 **Follow** for updates: [orkhan-muradov-dev](https://github.com/orkhan-muradov-dev)\n- 📣 **Share** with others who might benefit\n\n### Bug Reports\n\nWhen reporting bugs, please include:\n1. Operating system and version\n2. Qt version\n3. Steps to reproduce\n4. Expected vs actual behavior\n5. Screenshots if applicable\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eExample (Click to expand)\u003c/b\u003e\u003c/summary\u003e\n\n```\n**Environment:**\n- OS: Ubuntu 22.04 LTS\n- Qt: 6.5.0\n- Compiler: GCC 11.3.0\n\n**Steps:**\n1. Load file with 1000+ lines\n2. Search for \"test\"\n3. Click \"Find Next\" rapidly\n\n**Expected:** Smooth navigation\n**Actual:** UI freezes for 2 seconds\n\n**Screenshots:** [attached]\n```\n\n\u003c/details\u003e\n\n## 🙏 Acknowledgments\n\nThis project is built on the shoulders of giants:\n\n- **[Qt Project](https://www.qt.io/)** - Exceptional cross-platform framework\n- **[PCRE2](https://www.pcre.org/)** - Powerful regex engine\n- **[CMake](https://cmake.org/)** - Build system that doesn't make you cry\n- **[Keep a Changelog](https://keepachangelog.com/)** - Changelog format\n- **[Semantic Versioning](https://semver.org/)** - Version numbering scheme\n\nSpecial thanks to:\n- All [contributors](https://github.com/orkhan-muradov-dev/qt-text-matcher/graphs/contributors)\n- Everyone who reports bugs and suggests features\n- The Qt and C++ communities for endless learning resources\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n   **[⬆ Back to Top](#textmatcher-)**\n\n   Made with ❤️ by [Orkhan Muradov](https://github.com/orkhan-muradov-dev)\n\n   If this project helped you, consider giving it a ⭐!\n\n   [Report Bug](https://github.com/orkhan-muradov-dev/qt-text-matcher/issues) •\n   [Request Feature](https://github.com/orkhan-muradov-dev/qt-text-matcher/issues) •\n   [Contribute](CONTRIBUTING.md)\n\n\u003c/div\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forkhan-muradov-dev%2Fqt-text-matcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Forkhan-muradov-dev%2Fqt-text-matcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forkhan-muradov-dev%2Fqt-text-matcher/lists"}