flappa-doormal 2.6.4 → 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 +7 -3
- package/README.md +22 -0
- package/dist/index.d.mts +69 -25
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1242 -1108
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -71,13 +71,17 @@ src/
|
|
|
71
71
|
4. **`rule-regex.ts`** - SplitRule → compiled regex builder
|
|
72
72
|
- `buildRuleRegex()` - Compiles rule patterns (`lineStartsWith`, `lineStartsAfter`, `lineEndsWith`, `template`, `regex`)
|
|
73
73
|
- `processPattern()` - Token expansion + auto-escaping + optional fuzzy application
|
|
74
|
-
- `extractNamedCaptureNames()` - Extract `(?<name>...)` groups from raw regex patterns
|
|
74
|
+
- `extractNamedCaptureNames()` - Extract `(?<name>...)` groups from raw regex patterns
|
|
75
75
|
|
|
76
|
-
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
|
|
77
81
|
- `applyBreakpoints()` - Splits oversized structural segments using breakpoint patterns + windowing
|
|
78
82
|
- Applies `pageJoiner` normalization to breakpoint-created segments
|
|
79
83
|
|
|
80
|
-
|
|
84
|
+
7. **`breakpoint-utils.ts`** - Breakpoint processing utilities
|
|
81
85
|
- `normalizeBreakpoint()` - Convert string to BreakpointRule object
|
|
82
86
|
- `isPageExcluded()` - Check if page is in exclude list
|
|
83
87
|
- `isInBreakpointRange()` - Validate page against min/max/exclude constraints
|
package/README.md
CHANGED
|
@@ -406,6 +406,28 @@ Key options:
|
|
|
406
406
|
- If you paste these signatures into `lineStartsWith` / `lineStartsAfter` / `template`, that’s fine: those template pattern types **auto-escape `()[]`** outside `{{tokens}}`.
|
|
407
407
|
- If you paste them into a raw `regex` rule, you may need to escape literal brackets yourself.
|
|
408
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
|
|
409
431
|
|
|
410
432
|
## Prompting LLMs / Agents to Generate Rules (Shamela books)
|
|
411
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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"}
|