flappa-doormal 2.6.3 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -3
- package/README.md +27 -1
- package/dist/index.d.mts +69 -25
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1247 -1076
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -59,7 +59,9 @@ src/
|
|
|
59
59
|
2. **`tokens.ts`** - Template system
|
|
60
60
|
- `TOKEN_PATTERNS` - Map of token names to regex patterns
|
|
61
61
|
- `expandTokensWithCaptures()` - Expands `{{token:name}}` syntax
|
|
62
|
+
- `shouldDefaultToFuzzy()` - Checks if patterns contain fuzzy-default tokens (bab, basmalah, fasl, kitab, naql)
|
|
62
63
|
- Supports fuzzy transform for diacritic-insensitive matching
|
|
64
|
+
- **Fuzzy-default tokens**: `bab`, `basmalah`, `fasl`, `kitab`, `naql` - auto-enable fuzzy matching unless `fuzzy: false` is set
|
|
63
65
|
|
|
64
66
|
3. **`match-utils.ts`** - Extracted utilities (for testability)
|
|
65
67
|
- `extractNamedCaptures()` - Get named groups from regex match
|
|
@@ -69,13 +71,17 @@ src/
|
|
|
69
71
|
4. **`rule-regex.ts`** - SplitRule → compiled regex builder
|
|
70
72
|
- `buildRuleRegex()` - Compiles rule patterns (`lineStartsWith`, `lineStartsAfter`, `lineEndsWith`, `template`, `regex`)
|
|
71
73
|
- `processPattern()` - Token expansion + auto-escaping + optional fuzzy application
|
|
72
|
-
- `extractNamedCaptureNames()` - Extract `(?<name>...)` groups from raw regex patterns
|
|
74
|
+
- `extractNamedCaptureNames()` - Extract `(?<name>...)` groups from raw regex patterns
|
|
73
75
|
|
|
74
|
-
5. **`
|
|
76
|
+
5. **`pattern-validator.ts`** - Rule validation utilities
|
|
77
|
+
- `validateRules()` - Detects typos in patterns (missing `{{}}`, unknown tokens, duplicates)
|
|
78
|
+
- Returns parallel array structure for easy error tracking
|
|
79
|
+
|
|
80
|
+
6. **`breakpoint-processor.ts`** - Breakpoint post-processing engine
|
|
75
81
|
- `applyBreakpoints()` - Splits oversized structural segments using breakpoint patterns + windowing
|
|
76
82
|
- Applies `pageJoiner` normalization to breakpoint-created segments
|
|
77
83
|
|
|
78
|
-
|
|
84
|
+
7. **`breakpoint-utils.ts`** - Breakpoint processing utilities
|
|
79
85
|
- `normalizeBreakpoint()` - Convert string to BreakpointRule object
|
|
80
86
|
- `isPageExcluded()` - Check if page is in exclude list
|
|
81
87
|
- `isInBreakpointRange()` - Validate page against min/max/exclude constraints
|
package/README.md
CHANGED
|
@@ -50,7 +50,7 @@ Working with Arabic hadith and Islamic text collections requires splitting conti
|
|
|
50
50
|
|
|
51
51
|
✅ **Readable templates**: `{{raqms}} {{dash}}` instead of cryptic regex
|
|
52
52
|
✅ **Named captures**: `{{raqms:hadithNum}}` auto-extracts to `meta.hadithNum`
|
|
53
|
-
✅ **Fuzzy matching**:
|
|
53
|
+
✅ **Fuzzy matching**: Auto-enabled for `{{bab}}`, `{{kitab}}`, `{{basmalah}}`, `{{fasl}}`, `{{naql}}` (override with `fuzzy: false`)
|
|
54
54
|
✅ **Page tracking**: Know which page each segment came from
|
|
55
55
|
✅ **Declarative rules**: Describe *what* to match, not *how*
|
|
56
56
|
|
|
@@ -345,6 +345,10 @@ const segments = segmentPages(pages, {
|
|
|
345
345
|
// content: '...' (rumuz stripped)
|
|
346
346
|
```
|
|
347
347
|
|
|
348
|
+
**Supported codes**: Single-letter (`ع`, `خ`, `م`, `د`, etc.), two-letter (`خت`, `عس`, `سي`, etc.), digit `٤`, and the word `تمييز` (used in jarḥ wa taʿdīl books).
|
|
349
|
+
|
|
350
|
+
> **Note**: Single-letter rumuz like `ع` are only matched when they appear as standalone codes, not as the first letter of words like `عَن`. The pattern is diacritic-safe.
|
|
351
|
+
|
|
348
352
|
If your data uses *only single-letter codes separated by spaces* (e.g., `د ت س ي ق`), you can also use `{{harfs}}`.
|
|
349
353
|
|
|
350
354
|
## Analysis Helpers (no LLM required)
|
|
@@ -402,6 +406,28 @@ Key options:
|
|
|
402
406
|
- If you paste these signatures into `lineStartsWith` / `lineStartsAfter` / `template`, that’s fine: those template pattern types **auto-escape `()[]`** outside `{{tokens}}`.
|
|
403
407
|
- If you paste them into a raw `regex` rule, you may need to escape literal brackets yourself.
|
|
404
408
|
|
|
409
|
+
## Rule Validation
|
|
410
|
+
|
|
411
|
+
Use `validateRules()` to detect common mistakes in rule patterns before running segmentation:
|
|
412
|
+
|
|
413
|
+
```typescript
|
|
414
|
+
import { validateRules } from 'flappa-doormal';
|
|
415
|
+
|
|
416
|
+
const issues = validateRules([
|
|
417
|
+
{ lineStartsAfter: ['raqms:num'] }, // Missing {{}}
|
|
418
|
+
{ lineStartsWith: ['{{unknown}}'] }, // Unknown token
|
|
419
|
+
{ lineStartsAfter: ['## (rumuz:rumuz)'] } // Typo - should be {{rumuz:rumuz}}
|
|
420
|
+
]);
|
|
421
|
+
|
|
422
|
+
// issues[0]?.lineStartsAfter?.[0]?.type === 'missing_braces'
|
|
423
|
+
// issues[1]?.lineStartsWith?.[0]?.type === 'unknown_token'
|
|
424
|
+
// issues[2]?.lineStartsAfter?.[0]?.type === 'missing_braces'
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
**Checks performed:**
|
|
428
|
+
- **Missing braces**: Detects token names like `raqms:num` without `{{}}`
|
|
429
|
+
- **Unknown tokens**: Flags tokens inside `{{}}` that don't exist (e.g., `{{nonexistent}}`)
|
|
430
|
+
- **Duplicates**: Finds duplicate patterns within the same rule
|
|
405
431
|
|
|
406
432
|
## Prompting LLMs / Agents to Generate Rules (Shamela books)
|
|
407
433
|
|
package/dist/index.d.mts
CHANGED
|
@@ -766,6 +766,74 @@ type Segment = {
|
|
|
766
766
|
meta?: Record<string, unknown>;
|
|
767
767
|
};
|
|
768
768
|
//#endregion
|
|
769
|
+
//#region src/segmentation/pattern-validator.d.ts
|
|
770
|
+
/**
|
|
771
|
+
* Types of validation issues that can be detected.
|
|
772
|
+
*/
|
|
773
|
+
type ValidationIssueType = 'missing_braces' | 'unknown_token' | 'duplicate';
|
|
774
|
+
/**
|
|
775
|
+
* A validation issue found in a pattern.
|
|
776
|
+
*/
|
|
777
|
+
type ValidationIssue = {
|
|
778
|
+
type: ValidationIssueType;
|
|
779
|
+
message: string;
|
|
780
|
+
suggestion?: string;
|
|
781
|
+
};
|
|
782
|
+
/**
|
|
783
|
+
* Validation result for a single rule, with issues keyed by pattern type.
|
|
784
|
+
* Arrays parallel the input pattern arrays - undefined means no issue.
|
|
785
|
+
*/
|
|
786
|
+
type RuleValidationResult = {
|
|
787
|
+
lineStartsWith?: (ValidationIssue | undefined)[];
|
|
788
|
+
lineStartsAfter?: (ValidationIssue | undefined)[];
|
|
789
|
+
lineEndsWith?: (ValidationIssue | undefined)[];
|
|
790
|
+
template?: ValidationIssue;
|
|
791
|
+
};
|
|
792
|
+
/**
|
|
793
|
+
* Validates split rules for common pattern issues.
|
|
794
|
+
*
|
|
795
|
+
* Checks for:
|
|
796
|
+
* - Missing `{{}}` around known token names (e.g., `raqms:num` instead of `{{raqms:num}}`)
|
|
797
|
+
* - Unknown token names inside `{{}}` (e.g., `{{nonexistent}}`)
|
|
798
|
+
* - Duplicate patterns within the same rule
|
|
799
|
+
*
|
|
800
|
+
* @param rules - Array of split rules to validate
|
|
801
|
+
* @returns Array parallel to input with validation results (undefined if no issues)
|
|
802
|
+
*
|
|
803
|
+
* @example
|
|
804
|
+
* const issues = validateRules([
|
|
805
|
+
* { lineStartsAfter: ['raqms:num'] }, // Missing braces
|
|
806
|
+
* { lineStartsWith: ['{{unknown}}'] }, // Unknown token
|
|
807
|
+
* ]);
|
|
808
|
+
* // issues[0]?.lineStartsAfter?.[0]?.type === 'missing_braces'
|
|
809
|
+
* // issues[1]?.lineStartsWith?.[0]?.type === 'unknown_token'
|
|
810
|
+
*/
|
|
811
|
+
declare const validateRules: (rules: SplitRule[]) => (RuleValidationResult | undefined)[];
|
|
812
|
+
//#endregion
|
|
813
|
+
//#region src/segmentation/replace.d.ts
|
|
814
|
+
/**
|
|
815
|
+
* A single replacement rule applied by `applyReplacements()` / `SegmentationOptions.replace`.
|
|
816
|
+
*
|
|
817
|
+
* Notes:
|
|
818
|
+
* - `regex` is a raw JavaScript regex source string (no token expansion).
|
|
819
|
+
* - Default flags are `gu` (global + unicode).
|
|
820
|
+
* - If `flags` is provided, it is validated and `g` + `u` are always enforced.
|
|
821
|
+
* - If `pageIds` is omitted, the rule applies to all pages.
|
|
822
|
+
* - If `pageIds` is `[]`, the rule applies to no pages (rule is skipped).
|
|
823
|
+
*/
|
|
824
|
+
type ReplaceRule = NonNullable<SegmentationOptions['replace']>[number];
|
|
825
|
+
/**
|
|
826
|
+
* Applies ordered regex replacements to page content (per page).
|
|
827
|
+
*
|
|
828
|
+
* - Replacement rules are applied in array order.
|
|
829
|
+
* - Each rule is applied globally (flag `g` enforced) with unicode mode (flag `u` enforced).
|
|
830
|
+
* - `pageIds` can scope a rule to specific pages. `pageIds: []` skips the rule entirely.
|
|
831
|
+
*
|
|
832
|
+
* This function is intentionally **pure**:
|
|
833
|
+
* it returns a new pages array only when changes are needed, otherwise it returns the original pages.
|
|
834
|
+
*/
|
|
835
|
+
declare const applyReplacements: (pages: Page[], rules?: ReplaceRule[]) => Page[];
|
|
836
|
+
//#endregion
|
|
769
837
|
//#region src/segmentation/segmenter.d.ts
|
|
770
838
|
/**
|
|
771
839
|
* Applies breakpoints to oversized segments.
|
|
@@ -825,30 +893,6 @@ type Segment = {
|
|
|
825
893
|
*/
|
|
826
894
|
declare const segmentPages: (pages: Page[], options: SegmentationOptions) => Segment[];
|
|
827
895
|
//#endregion
|
|
828
|
-
//#region src/segmentation/replace.d.ts
|
|
829
|
-
/**
|
|
830
|
-
* A single replacement rule applied by `applyReplacements()` / `SegmentationOptions.replace`.
|
|
831
|
-
*
|
|
832
|
-
* Notes:
|
|
833
|
-
* - `regex` is a raw JavaScript regex source string (no token expansion).
|
|
834
|
-
* - Default flags are `gu` (global + unicode).
|
|
835
|
-
* - If `flags` is provided, it is validated and `g` + `u` are always enforced.
|
|
836
|
-
* - If `pageIds` is omitted, the rule applies to all pages.
|
|
837
|
-
* - If `pageIds` is `[]`, the rule applies to no pages (rule is skipped).
|
|
838
|
-
*/
|
|
839
|
-
type ReplaceRule = NonNullable<SegmentationOptions['replace']>[number];
|
|
840
|
-
/**
|
|
841
|
-
* Applies ordered regex replacements to page content (per page).
|
|
842
|
-
*
|
|
843
|
-
* - Replacement rules are applied in array order.
|
|
844
|
-
* - Each rule is applied globally (flag `g` enforced) with unicode mode (flag `u` enforced).
|
|
845
|
-
* - `pageIds` can scope a rule to specific pages. `pageIds: []` skips the rule entirely.
|
|
846
|
-
*
|
|
847
|
-
* This function is intentionally **pure**:
|
|
848
|
-
* it returns a new pages array only when changes are needed, otherwise it returns the original pages.
|
|
849
|
-
*/
|
|
850
|
-
declare const applyReplacements: (pages: Page[], rules?: ReplaceRule[]) => Page[];
|
|
851
|
-
//#endregion
|
|
852
896
|
//#region src/segmentation/tokens.d.ts
|
|
853
897
|
/**
|
|
854
898
|
* Token-based template system for Arabic text pattern matching.
|
|
@@ -1263,5 +1307,5 @@ declare const analyzeTextForRule: (text: string) => {
|
|
|
1263
1307
|
detected: DetectedPattern[];
|
|
1264
1308
|
} | null;
|
|
1265
1309
|
//#endregion
|
|
1266
|
-
export { type Breakpoint, type BreakpointRule, type CommonLineStartPattern, type DetectedPattern, type ExpandResult, type LineStartAnalysisOptions, type LineStartPatternExample, type Logger, type Page, type PageRange, type ReplaceRule, type Segment, type SegmentationOptions, type SplitRule, TOKEN_PATTERNS, analyzeCommonLineStarts, analyzeTextForRule, applyReplacements, containsTokens, detectTokenPatterns, escapeRegex, escapeTemplateBrackets, expandCompositeTokensInTemplate, expandTokens, expandTokensWithCaptures, generateTemplateFromText, getAvailableTokens, getTokenPattern, makeDiacriticInsensitive, segmentPages, suggestPatternConfig, templateToRegex };
|
|
1310
|
+
export { type Breakpoint, type BreakpointRule, type CommonLineStartPattern, type DetectedPattern, type ExpandResult, type LineStartAnalysisOptions, type LineStartPatternExample, type Logger, type Page, type PageRange, type ReplaceRule, type RuleValidationResult, type Segment, type SegmentationOptions, type SplitRule, TOKEN_PATTERNS, type ValidationIssue, type ValidationIssueType, analyzeCommonLineStarts, analyzeTextForRule, applyReplacements, containsTokens, detectTokenPatterns, escapeRegex, escapeTemplateBrackets, expandCompositeTokensInTemplate, expandTokens, expandTokensWithCaptures, generateTemplateFromText, getAvailableTokens, getTokenPattern, makeDiacriticInsensitive, segmentPages, suggestPatternConfig, templateToRegex, validateRules };
|
|
1267
1311
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/segmentation/fuzzy.ts","../src/segmentation/types.ts","../src/segmentation/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/segmentation/fuzzy.ts","../src/segmentation/types.ts","../src/segmentation/pattern-validator.ts","../src/segmentation/replace.ts","../src/segmentation/segmenter.ts","../src/segmentation/tokens.ts","../src/analysis.ts","../src/detection.ts"],"sourcesContent":[],"mappings":"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"}
|