greek-name-correction 2.1.0 → 2.1.1

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/README.md CHANGED
@@ -13,7 +13,8 @@ A powerful, zero-dependency Node.js library for correcting, formatting, and vali
13
13
  🔄 **Transliteration** - Greeklish ↔ Greek ↔ Latin
14
14
  📝 **Smart Formatting** - Proper capitalization and syntax
15
15
  👔 **Title Support** - Handles Greek honorifics (Δρ., Καθ., etc.)
16
- 🔀 **Genitive Conversion** - Automatic του/της forms
16
+ 🎩 **Auto Title Addition** - Automatically adds general titles (Κ. for men, Κα for women)
17
+ 🔀 **Case Conversion** - Genitive, vocative, and accusative forms
17
18
  🎯 **Gender Detection** - Identifies gender from name endings
18
19
  📊 **Statistics** - Comprehensive name analysis
19
20
  🔍 **Diminutive Detection** - Recognizes nickname patterns
@@ -122,10 +123,60 @@ GreekNameCorrection('Γιώργος Παπαδόπουλος', {
122
123
  });
123
124
  // → {
124
125
  // corrected: "Γιώργος Παπαδόπουλος",
125
- // genitive: "Γιώργος Παπαδόπουλου"
126
+ // genitive: "Γιώργου Παπαδόπουλου"
126
127
  // }
127
128
  ```
128
129
 
130
+ ### Vocative Case Conversion
131
+ ```javascript
132
+ // Convert to vocative case (for addressing someone)
133
+ GreekNameCorrection('Γιώργος Παπαδόπουλος', {
134
+ convertToCase: 'vocative'
135
+ });
136
+ // → "Γιώργο Παπαδόπουλο"
137
+
138
+ // With preserveOriginal to get both forms
139
+ GreekNameCorrection('Γιάννης Αλεξίου', {
140
+ convertToCase: 'vocative',
141
+ preserveOriginal: true
142
+ });
143
+ // → {
144
+ // corrected: "Γιάννης Αλεξίου",
145
+ // vocative: "Γιάννη Αλεξίου"
146
+ // }
147
+
148
+ // Feminine names usually remain unchanged
149
+ GreekNameCorrection('Μαρία Κωνσταντίνου', {
150
+ convertToCase: 'vocative'
151
+ });
152
+ // → "Μαρία Κωνσταντίνου"
153
+ ```
154
+
155
+ ### Accusative Case Conversion
156
+ ```javascript
157
+ // Convert to accusative case (for direct objects)
158
+ GreekNameCorrection('Γιώργος Παπαδόπουλος', {
159
+ convertToCase: 'accusative'
160
+ });
161
+ // → "Γιώργο Παπαδόπουλο"
162
+
163
+ // With preserveOriginal to get both forms
164
+ GreekNameCorrection('Κώστας Παπαδάκης', {
165
+ convertToCase: 'accusative',
166
+ preserveOriginal: true
167
+ });
168
+ // → {
169
+ // corrected: "Κώστας Παπαδάκης",
170
+ // accusative: "Κώστα Παπαδάκη"
171
+ // }
172
+
173
+ // Feminine names usually remain unchanged
174
+ GreekNameCorrection('Μαρία Κωνσταντίνου', {
175
+ convertToCase: 'accusative'
176
+ });
177
+ // → "Μαρία Κωνσταντίνου"
178
+ ```
179
+
129
180
  ### Title Handling
130
181
  ```javascript
131
182
  GreekNameCorrection('δρ. γιώργος παπαδόπουλος', {
@@ -138,6 +189,39 @@ GreekNameCorrection('δρ. γιώργος παπαδόπουλος', {
138
189
  // }
139
190
  ```
140
191
 
192
+ ### Automatic General Title Addition
193
+ ```javascript
194
+ // Add general title (κ. for men, κα for women) if no title exists
195
+ // Titles are always lowercase
196
+ GreekNameCorrection('Γιώργος Παπαδόπουλος', {
197
+ addGeneralTitle: true
198
+ });
199
+ // → "κ. Γιώργος Παπαδόπουλος"
200
+
201
+ GreekNameCorrection('Μαρία Κωνσταντίνου', {
202
+ addGeneralTitle: true
203
+ });
204
+ // → "κα Μαρία Κωνσταντίνου"
205
+
206
+ // Names with existing titles are not modified
207
+ GreekNameCorrection('Δρ. Γιώργος Παπαδόπουλος', {
208
+ addGeneralTitle: true
209
+ });
210
+ // → "Δρ. Γιώργος Παπαδόπουλος"
211
+
212
+ // Works with preserveOriginal option
213
+ GreekNameCorrection('Ελένη Γεωργίου', {
214
+ addGeneralTitle: true,
215
+ preserveOriginal: true
216
+ });
217
+ // → {
218
+ // corrected: "κα Ελένη Γεωργίου",
219
+ // original: "Ελένη Γεωργίου",
220
+ // title: "κα",
221
+ // isValid: true
222
+ // }
223
+ ```
224
+
141
225
  ### Name Corrections
142
226
  ```javascript
143
227
  GreekNameCorrection('γιοργος παπαδοπουλος', {
@@ -258,9 +342,11 @@ GreekNameCorrection(input, options)
258
342
  | `removeExtraSpaces` | `boolean` | `true` | Remove extra whitespace |
259
343
  | `handleParticles` | `boolean` | `true` | Handle Greek particles (του/της/των) |
260
344
  | `convertToGenitive` | `boolean` | `false` | Convert to genitive case |
345
+ | `convertToCase` | `string\|null` | `null` | Convert to case: `'vocative'` or `'accusative'` |
261
346
  | `transliterate` | `string\|null` | `null` | Transliteration mode: `'greeklish-to-greek'`, `'greek-to-latin'`, `'greek-to-greeklish'` |
262
347
  | `detectDiminutive` | `boolean` | `false` | Detect diminutive/nickname forms |
263
348
  | `handleTitles` | `boolean` | `true` | Extract and format titles |
349
+ | `addGeneralTitle` | `boolean` | `false` | Automatically add general title (κ. for men, κα for women) if no title exists (always lowercase) |
264
350
  | `suggestCorrections` | `boolean` | `false` | Suggest corrections for misspellings |
265
351
  | `recognizeKatharevousa` | `boolean` | `false` | Convert archaic Greek forms |
266
352
  | `databaseSafe` | `boolean` | `false` | Remove problematic characters |
@@ -286,6 +372,8 @@ When `preserveOriginal: true`, returns an object with:
286
372
  parts?: Object, // Name parts (if splitNames)
287
373
  diminutive?: Array, // Diminutive info (if detectDiminutive)
288
374
  genitive?: string, // Genitive form (if convertToGenitive)
375
+ vocative?: string, // Vocative form (if convertToCase: 'vocative')
376
+ accusative?: string, // Accusative form (if convertToCase: 'accusative')
289
377
  sortKey?: string, // Sort key (if generateSortKey)
290
378
  statistics?: Object, // Name statistics (if statistics)
291
379
  wasCorrected?: boolean, // If corrections were applied
@@ -303,6 +391,14 @@ The library recognizes and properly formats the following Greek titles:
303
391
  - **Religious**: Αρχιεπίσκοπος, Μητροπολίτης, Επίσκοπος, Πατήρ
304
392
  - **Military**: Στρατηγός, Ταξίαρχος, Συνταγματάρχης, Αντισυνταγματάρχης
305
393
 
394
+ ### Automatic General Title Addition
395
+
396
+ When `addGeneralTitle: true` is enabled, the library automatically adds general titles based on detected gender:
397
+ - **κ.** (κύριος) for male names
398
+ - **κα** (κυρία) for female names
399
+
400
+ **Note:** General titles are always added in lowercase format. This feature only adds titles when no existing title is detected, ensuring that professional or academic titles are preserved.
401
+
306
402
  ## Common Name Corrections
307
403
 
308
404
  The library automatically corrects common Greek name misspellings:
@@ -347,6 +443,7 @@ const result = GreekNameCorrection('dr giorgos tou papa', {
347
443
  transliterate: 'greeklish-to-greek',
348
444
  preserveOriginal: true,
349
445
  handleTitles: true,
446
+ addGeneralTitle: true,
350
447
  handleParticles: true,
351
448
  suggestCorrections: true,
352
449
  detectGender: true,
@@ -448,6 +545,20 @@ const recipient = GreekNameCorrection(name, {
448
545
  });
449
546
 
450
547
  console.log(`Προς: ${recipient.genitive}`);
548
+
549
+ // Use vocative case for addressing someone
550
+ const addressee = GreekNameCorrection('Γιώργος Παπαδόπουλος', {
551
+ convertToCase: 'vocative'
552
+ });
553
+
554
+ console.log(`Αγαπητέ ${addressee},`); // "Αγαπητέ Γιώργο Παπαδόπουλο,"
555
+
556
+ // Use accusative case for direct objects
557
+ const object = GreekNameCorrection('Δημήτρης Νικολάου', {
558
+ convertToCase: 'accusative'
559
+ });
560
+
561
+ console.log(`Είδα τον ${object}`); // "Είδα τον Δημήτρη Νικολάου"
451
562
  ```
452
563
 
453
564
  ### 5. Gender-Based Processing
@@ -513,8 +624,9 @@ The test suite covers:
513
624
  - Array processing
514
625
  - Object processing
515
626
  - All transliteration modes
516
- - Genitive conversion
627
+ - Case conversions (genitive, vocative, accusative)
517
628
  - Title handling
629
+ - Automatic general title addition
518
630
  - Diminutive detection
519
631
  - Gender detection
520
632
  - Statistics generation
@@ -522,7 +634,10 @@ The test suite covers:
522
634
 
523
635
  ## Changelog
524
636
 
525
- ### Version 2.1.0 (Current)
637
+ ### Version 2.1.1 (Current)
638
+ - ✨ **Automatic General Title Addition** - Added `addGeneralTitle` option to automatically add general titles (κ. for men, κα for women) when no title exists
639
+
640
+ ### Version 2.1.0
526
641
  - 🏗️ **Modular Architecture** - Complete codebase refactoring into logical modules
527
642
  - 📦 **Improved Structure** - Separated into `transliteration.js`, `cases.js`, `validation.js`, `utils.js`, `constants.js`
528
643
  - 🔧 **Better Maintainability** - Clean separation of concerns for easier testing and development
@@ -530,7 +645,7 @@ The test suite covers:
530
645
 
531
646
  ### Version 2.0.0
532
647
  - ✨ Added transliteration support (Greeklish ↔ Greek ↔ Latin)
533
- - ✨ Added genitive case conversion
648
+ - ✨ Added case conversion (genitive, vocative, accusative)
534
649
  - ✨ Added diminutive detection
535
650
  - ✨ Added title/honorific support
536
651
  - ✨ Added name correction suggestions
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "greek-name-correction",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "A zero-dependency Node.js library for correcting and formatting Greek names with transliteration, genitive conversion, and advanced features",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
package/src/index.js CHANGED
@@ -23,7 +23,8 @@ const {
23
23
  generateSortKey,
24
24
  generateStatistics,
25
25
  detectGender,
26
- splitNameParts
26
+ splitNameParts,
27
+ addGeneralTitleIfMissing
27
28
  } = require("./utils");
28
29
 
29
30
  /**
@@ -54,7 +55,8 @@ function GreekNameCorrection(input, options = {}) {
54
55
  recognizeKatharevousa: false,
55
56
  databaseSafe: false,
56
57
  generateSortKey: false,
57
- statistics: false
58
+ statistics: false,
59
+ addGeneralTitle: false
58
60
  };
59
61
 
60
62
  const config = { ...defaults, ...options };
@@ -131,7 +133,21 @@ function GreekNameCorrection(input, options = {}) {
131
133
  genitiveForm = convertToGenitive(processed, config);
132
134
  }
133
135
 
134
- // Convert to case (vocative or accusative) - before re-attaching title
136
+ // Database-safe output
137
+ if (config.databaseSafe) {
138
+ processed = makeDatabaseSafe(processed);
139
+ }
140
+
141
+ // Add general title (Κ. or Κα) if no title exists and option is enabled
142
+ // This is done after processing so gender detection works on the final name
143
+ if (config.addGeneralTitle && !extractedTitle) {
144
+ const generalTitle = addGeneralTitleIfMissing(processed);
145
+ if (generalTitle) {
146
+ extractedTitle = generalTitle;
147
+ }
148
+ }
149
+
150
+ // Convert to case (vocative or accusative) - after adding general title if needed
135
151
  let caseForm = null;
136
152
  if (config.convertToCase) {
137
153
  if (config.convertToCase === "vocative") {
@@ -139,18 +155,13 @@ function GreekNameCorrection(input, options = {}) {
139
155
  } else if (config.convertToCase === "accusative") {
140
156
  caseForm = convertToAccusative(processed, config);
141
157
  }
142
- // Re-attach title to case form if it was extracted
158
+ // Re-attach title to case form if it was extracted or added
143
159
  if (extractedTitle && caseForm) {
144
160
  caseForm = extractedTitle + " " + caseForm;
145
161
  }
146
162
  }
147
163
 
148
- // Database-safe output
149
- if (config.databaseSafe) {
150
- processed = makeDatabaseSafe(processed);
151
- }
152
-
153
- // Re-attach title if it was extracted
164
+ // Re-attach title if it was extracted or added
154
165
  if (extractedTitle) {
155
166
  processed = extractedTitle + " " + processed;
156
167
  }
package/src/utils.js CHANGED
@@ -218,6 +218,26 @@ function splitNameParts(fullname) {
218
218
  };
219
219
  }
220
220
 
221
+ // Add general title (κ. for men, κα for women) if no title exists
222
+ function addGeneralTitleIfMissing(nameWithoutTitle) {
223
+ if (!nameWithoutTitle || nameWithoutTitle.trim() === "") {
224
+ return null;
225
+ }
226
+
227
+ // Detect gender from the name
228
+ const gender = detectGender(nameWithoutTitle);
229
+
230
+ // Add appropriate title based on gender (always lowercase)
231
+ if (gender === "male") {
232
+ return "κ.";
233
+ } else if (gender === "female") {
234
+ return "κα";
235
+ }
236
+
237
+ // If gender is unknown, don't add a title
238
+ return null;
239
+ }
240
+
221
241
  module.exports = {
222
242
  capitalizeGreekName,
223
243
  isGreekParticle,
@@ -229,5 +249,6 @@ module.exports = {
229
249
  generateSortKey,
230
250
  generateStatistics,
231
251
  detectGender,
232
- splitNameParts
252
+ splitNameParts,
253
+ addGeneralTitleIfMissing
233
254
  };