GreekTranscoder : Historique des versions

Note : le contenu de cette page est de nature très technique et n’est disponible qu’en anglais.
V 2
Nota bene: seul GreekTranscoder 2.0.5 (ou plus récent) prend pleinement en charge l’encodage WinGreek. Parce qu’elles utilisent exclusivement le format .docx, les versions 2.0.0–2.0.4 du programme peuvent supprimer sans prévenir les apostrophes et les guillemets utilisés par WinGreek. Aussi assurez-vous que vous utilisez bien la toute dernière version de GreekTranscoder 2 avant de lancer une conversion.
Passer en revue l’intégralité du code de GreekTranscoder vingt ans après l’avoir écrit et créer une nouvelle application pour macOS afin de proposer aux utilisateurs une interface à jour et fonctionnelle auraient constitué autant de gageures difficiles à affronter sans l’aide de Claude Opus 4.5+, un assistant IA conçu par Anthropic particulièrement doué pour analyser, corriger et améliorer les programmes informatiques.
Les assistants IA ont besoin d’être constamment surveillés et ne peuvent être laissés à eux-mêmes, mais, du moment que le fruit de leur travail fait l’objet de contrôles incessants et répétés, leur aide peut s’avérer déterminante afin de mener à bien un projet technique tel que celui-ci.
- Version 2.0.6: 2026.03.25
- Version 2.0.5: 2026.03.03
- Version 2.0.4: 2026.02.25
- Version 2.0.3: 2026.02.09
- Version 2.0.2: 2026.02.02
- Version 2.0.1: 2026.01.26
- Version 2.0.0: 2026.01.24
Version 2.0.6: 2026.03.25
-
New Legacy Encodings
- Added support for the Galilee encoding: single "Galilee" (Regular, Bold and Italic) font by Rodney J. Decker (
Galilee1_2.ttf, v1.002, 2003), 135 glyphs. - Galilee is an ASCII-based encoding: it uses ASCII letters (a–z, A–Z) for Greek and repurposed ASCII punctuation for diacritics. Small letters take postpositive diacritics with optional iota subscript
/; capitals take prepositive diacritics with optional prosgegrammeni|. - Galilee does not support quote characters at all: all quotation marks are rescued to Unicode (set in Times New Roman, colored green), following the same pattern as SPIonic.
- The transcoder tries to identify non-combining psilis used as pseudo-apostrophes and rescues them to Unicode (set in Times New Roman, colored green).
- Added support for the Lector encoding: single "graece" font by R. Maier 1996 (
lingraec.ttf), 215 glyphs. - Lector is a hybrid encoding: small letters exist as composed characters with diacritics, but can also be used with composing diacritics, while capitals use composing diacritics exclusively.
- When converted, it is treated as composed-first, composing-second: canonical records store the composed forms for the small letters.
- Added support for the Teknia encoding: single "TekniaGreek" font by Bill Mounce (
TekniaGreek.ttf, v1.004, 2001), 163 glyphs. - Teknia is an ASCII-based encoding: it uses ASCII letters (a–z, A–Z) for Greek and repurposed ASCII punctuation for diacritics. Small letters take postpositive diacritics with optional iota subscript
/; capitals take prepositive diacritics with optional prosgegrammenii. - Teknia uses a three-width combining diacritic system: regular width for alpha, eta, omicron, and upsilon; narrow for epsilon and iota; wide for omega.
- Teknia does not support quote characters at all: all quotation marks are rescued to Unicode (set in Times New Roman, colored green), following the same pattern as SPIonic.
- The transcoder tries to identify non-combining psilis used as pseudo-apostrophes and rescues them to Unicode (set in Times New Roman, colored green).
- Added support for the Galilee encoding: single "Galilee" (Regular, Bold and Italic) font by Rodney J. Decker (
-
Transcoder Improvements
CapitalCheckerandComposingChecker- Improved the reliability of the
CapitalCheckerfunction which normalizes white spaces in front of capital letters. - Improved the BetaCode, SGreek and SPIonic
ComposingChecker. - Optimized the SPIonic and BibleWorks
ComposingChecker. - Fixed a Word quote equivalence bug in the BibleWorks, LaserGreek, SuperGreek and SPIonic
ComposingChecker: a new function converts sequences that containChrW(34)orChrW(39)with.MatchWildcardsset toTrue(see "VBA Bugs and Quirks" below). - The
ComposingCheckernow runs before theCapitalCheckerin BibleWorks, Lector, SGreek and SPIonic, which allows for the most efficient normalization pipeline.
- New
NBSPCheckerandNBSPRescuefunctions for SGreek, SPIonic and Lector when converting to Titus, which is the only target encoding without an NBSP value. Because these three source encodings useChrW(160)as an "anchor" for all capital-with-diacritics sequences, NBSP cannot be rescued using the regularRescuefunctions, but requires a dedicated mechanism.
- New
GreekKeysMetricalCheckerfunction: instead of being post-positioned, GreekKeys COMBINING MACRONChrW(168)and COMBINING BREVEChrW(8800)are pre-positioned (they affect the next character). TheGreekKeysMetricalCheckernormalizes the "wide" macronChrW(8482)toChrW(168), then inverts the combining diacritics' positions using wildcard patterns so that they can be converted normally. - Lector COMBINING DOT BELOW
ChrW(183)is also post-positioned. TheLectorDotCheckerfunction normalizes the alternate dot belowChrW(8729)toChrW(183), then inverts the character's position using a wildcard pattern so that it can be converted normally.
- Improved the reliability of the
-
Database Improvements
- Stored
ChrW(168)andChrW(8800)as alternate-only records, ensuring no other transcoder creates them when targeting GreekKeys.
- In v. 2.0.5, SOFT-HYPHEN
ChrW(173)(U+00AD) used for NON-COMBINING MACRON (EN DASH) in Paulina Greek was demoted by mistake and its "alternate" MINUS SIGNChrW(8722)(U+2212) promoted to canonical status. - Restored
ChrW(173)to canonical status and movedChrW(8722)to a new alternate record. - Non-combining CIRCUMFLEX ACCENT added (canonical
ChrW(160) & ChrW(166)and malformedChrW(32) & ChrW(166)). - New malformed entries for capital accent ordering and for circumflex used as perispomeni in compounds.
SuperGreek, LaserGreek, Paulina Greek
- Record identity fix in all three encodings:
ChrW(8212)is used as a COMBINING MACRON for capital letters, not a COMBINING OVERLINE (OVERSTRIKE FOR NOMINA SACRA). - New malformed entries for combining diacritics: compound ordering duplicates for capital-equivalent breathing marks, diaresis, and ypogegrammeni (LaserGreek +31, SuperGreek +57, Paulina Greek +9).
- Perispomeni consolidation:
ChrW(96)in SuperGreek/LaserGreek andChrW(247)in Paulina Greek are alternate perispomeni keystrokes, not tildes. In the older Linguist fonts Graeca and SuperGreek,ChrW(96)displayed a tilde shape, but in SymbolGreek and in all LaserGreek fonts it is visually identical to the canonical perispomeniChrW(39). Likewise,ChrW(247)in Paulina Greek is a perispomeni variant. These alternates are now normalized to the canonical perispomeni before any compound processing. - Non-combining tilde entries removed from all three encodings (the combining tilde, which handles Unicode perispomeni normalization, is unaffected).
- SuperGreek retains
ChrW(126)as a malformed perispomeni following the original SuperGreek specification; in SymbolGreek and in all LaserGreek fonts,ChrW(126)was repurposed as a final sigma. - Added five malformed entries for alternate code points found only in the TrueType version of the SuperGreek font:
ChrW(713)LATIN CAPITAL LETTER J,ChrW(894)COMBINING GRAVE TONE MARK,ChrW(916)NON-COMBINING GREEK PSILI,ChrW(8486)LATIN SMALL LETTER z, andChrW(61446)LATIN SMALL LETTER p.
- Added DICOLON alternate
ChrW(42889)(U+A789 MODIFIER LETTER COLON) to both encodings. - Alternate Vilnius code point
ChrW(8225)(U+2021) reclassified from VERTICAL LINE EXTENSION to VERTICAL BAR. - Fixed: Titus
ChrW(96)was incorrectly assigned to NON-COMBINING GREEK VARIA instead of NON-COMBINING GREEK PSILI AND VARIA.
- Added records for non-combining DOT ABOVE (U+02D9) and OVERLINE (U+203E), with corresponding entries in all compatible legacy encodings.
- Sort order fix: COMBINING GREEK DIALYTIKA TONOS (
ChrW(776) & ChrW(833)) now sorts before standalone COMBINING ACUTE ACCENT (ChrW(833)) in the Unicode transcoder, preventing the sequential conversion loop from consuming the acute accent component of the compound before it can be matched. - VERTICAL LINE EXTENSION
ChrW(9474)(U+2502) normalized to VERTICAL BARChrW(124). - NT Fraktur symbol fix: the surrogate pairs for MAJORITY READING OF MSS (MATHEMATICAL FRAKTUR CAPITAL M, U+1D510) and PAPYRUS REFERENCE (MATHEMATICAL FRAKTUR CAPITAL P, U+1D513) were transposed (a regression introduced in v1.0.4).
- Added 6 malformed entries to normalize mathematical Greek symbol variants to their standard letter equivalents: U+03D2 UPSILON WITH HOOK SYMBOL, U+03D3 UPSILON WITH ACUTE AND HOOK SYMBOL, U+03D4 UPSILON WITH DIAERESIS AND HOOK SYMBOL, U+03F4 CAPITAL THETA SYMBOL, U+00B5 MICRO SIGN, and U+03D6 PI SYMBOL.
- The native WinGreek GREEK SMALL LUNATE SIGMA SYMBOL
ChrW(1)is incompatible with the.docxformat and cannot be displayed in Word anymore: it has been demoted to "alternate" status. - Recognized in original WinGreek
.docdocuments,ChrW(1)will be transcoded (or rescued) into other encodings, but it will not be added to new WinGreek conversions, where it will appear as a rescued character instead. - Following the same logic, the native WinGreek METRICAL (NON-COMBINING) BREVE
ChrW(26)and NON-COMBINING MACRON (EN DASH)ChrW(27)were added as alternate characters with no corresponding canonical entries. - Added five code points from the Grammata and Korinthus font families as alternate characters:
ChrW(61447)(U+F007, left guillemet),ChrW(61466)(U+F01A, breve),ChrW(61467)(U+F01B, macron),ChrW(61468)(U+F01C, left single angle quote), andChrW(61469)(U+F01D, right single angle quote). These are XML-safe duplicates of the C0 control characters at positions 7, 26, 27, 28, and 29 respectively. Grammata and Korinthus are the only WinGreek fonts that relocated these glyphs to PUA positions. - Added
ChrW(127)(U+007F, DEL position) as an alternate character on the canonical VERTICAL BAR recordChrW(124).
- Stored
Version 2.0.5: 2026.03.03
- WinGreek Compatibility
- Beta Code Bracket-Digit Protection
- Color Cleanups
- Quote Marker Improvements
- Database Improvements
- Beta Symbol Block Ordering Fix (Unified version)
- Homonymous Font Warning Fix (macOS-only version)
- Interface.frm Dispatcher Refactoring (Unified version)
-
WinGreek Compatibility
- WinGreek C0 control characters are silently stripped from
.docxfiles on save (see “VBA Bugs and Quirks” below for details). GreekTranscoder 2 now saves the.xcodedworking copy in.docformat when targeting WinGreek, preserving those characters. - When converting to WinGreek, a specific bilingual alert replaces the standard working-copy notice.
- The native WinGreek quotes
ChrW(7)(LEFT-POINTING DOUBLE ANGLE QUOTATION MARK "«"),ChrW(28)(LEFT SINGLE QUOTATION MARK "‘") andChrW(29)(RIGHT SINGLE QUOTATION MARK "’") have been demoted to "alternate" characters: recognized in original WinGreek.docdocuments, but replaced by XML-compatible marker sequences in new conversions. - Previous conversions that relied on these characters should be redone from the original source
.docdocument. - The font previously listed as “GRAMMATA (WinGreek encoding)” is actually called “Grammata” in Word.
- WinGreek C0 control characters are silently stripped from
-
Beta Code Bracket-Digit Protection
- Beta Code uses bracket-digit sequences (e.g.,
[5,[73,]8) so that source text containing numbered sections in square brackets (e.g.,[5],[67],[142]) could be corrupted during conversion. - A new
BetaCodeDigitsCheckerfunction now protects those sequences by converting them to Unicode in Times New Roman, colored green.
- Beta Code uses bracket-digit sequences (e.g.,
-
Color Cleanups
- The
BetaCode/SPIonic Digit Cleanupnow only runs if neither SPIonic nor Beta Code is the target encoding, since they only support digits as control modifiers. - Post-conversion, if Times New Roman is the target font, rescued characters (green) are switched to
wdColorAutomatic. - Post-conversion, if Unicode is the target encoding, unconverted characters already in the target font (red) are switched to
wdColorAutomatic.
- The
-
Quote Marker Improvements
- In v 2.0.4, the quote marker system was updated so that BibleWorks, SGreek and WinGreek use encoding-specific exclamation mark characters and the corresponding
ChrW(33)-based marker patterns were removed from theGreekRemoveQuoteMarkersmodule. - 8 backward-compatibility patterns restored in the SINGLE ! MARKERS section: Vilnius
ChrW(171)/ChrW(187), BibleWorksChrW(185)/ChrW(190).
- The WinGreek quote marker system has been entirely redone in order to demote C0 control characters to "alternate" status.
ChrW(123)(LEFT CURLY BRACKET "{") is now used instead ofChrW(28)andChrW(125)(RIGHT CURLY BRACKET "}") instead ofChrW(29).- ANGLE QUOTATION MARKS now use
ChrW(8218)as a distinctive marker and the sequenceChrW(128) & ChrW(8218)replacesChrW(7)as the canonical entry for the LEFT-POINTING DOUBLE ANGLE QUOTATION MARK "«". - Because
ChrW(7),ChrW(28)andChrW(29)are unavailable in converted documents, the corresponding quote markers cannot be fully stripped byGreekRemoveQuoteMarkersand are switched towdColorBlueinstead.
SmartQuotesMarker System: NBSP Collision Fix- The v2.0.0 marker system used NBSP
ChrW(160)as a directional marker for English curly quotes and French guillemets, causing collisions with contextual NBSPs from French typography in particular. - Each affected source encoding now uses an encoding-specific unused marker instead of NBSP:
ChrW(64)("@") for BetaCode/Ismini/SuperGreek/LaserGreek,ChrW(182)("¶") for BibleWorks/SGreek/Vilnius,ChrW(179)("³" displayed as "@") for PaulinaGreek,ChrW(37)("%" displayed as "Ϲ") for GreekKeys.
Obsolete NBSP Marker Migration
- A new
MigrateObsoleteNBSPMarkersfunction inGreekRemoveQuoteMarkerssilently upgrades v2.0.3–2.0.4 NBSP-based blue markers to the new encoding-specific markers before conversion (black markers created by v.2.0.0–2.0.2 will have to be replaced or stripped manually, or the original document converted anew). - Detection uses blue-colored
ChrW(160)as a safety constraint: contextual black NBSPs are untouched.
- In v 2.0.4, the quote marker system was updated so that BibleWorks, SGreek and WinGreek use encoding-specific exclamation mark characters and the corresponding
-
Database Improvements
"#15"was assigned to DOTTED RIGHT POINTING ANGLE (DIPLE PERIESTIGMENE, U+2E16) by mistake, duplicating the correct MORE-THAN SIGN (U+003E)."%25"was assigned to COMBINING COMMA BELOW (U+0326) and COMBINING OGONEK (U+0328) by mistake: it has been reassigned to the correct COMBINING CEDILLA (U+0327)."%149"has been assigned to COMBINING OGONEK (U+0328) and COMBINING COMMA BELOW (U+0326) has been removed from Beta Code (it is absent from the TLG reference)."%91"and"%92"were assigned to both NON-COMBINING and COMBINING diacritics, which are legitimate per the TLG reference, but incompatible with the way conversions work. Only the non-combining forms, which carry legacy values, have been kept.
- Archaic letters and apparatus symbols added: RIGHT-POINTING ANGLE QUOTATION MARK, CAPITAL/SMALL LETTER SHO, KAI SYMBOL, CAPITAL LETTER ARCHAIC KOPPA, CAPITAL LETTER STIGMA, CAPITAL LETTER DIGAMMA, CAPITAL LETTER KOPPA, CAPITAL LETTER SAMPI, CAPITAL LUNATE SIGMA SYMBOL, CAPITAL/SMALL LETTER SAN, GREEK RHO WITH STROKE SYMBOL; LATIN SMALL LETTER F WITH HOOK, DAGGER, DOUBLE DAGGER, BLACK-LETTER CAPITAL I, SCRIPT SMALL L, ALEF SYMBOL, LEFT/RIGHT WHITE SQUARE BRACKET, BLACK-LETTER CAPITAL R, COMBINING DOUBLE INVERTED BREVE, COMBINING RING BELOW.
- New standalone records added: ASTERISK OPERATOR, MEDIUM SMALL WHITE CIRCLE, COMBINING TILDE BELOW.
- Several corrections applied to existing records.
- New
GreekKeysAltfield for characters present in some GreekKeys fonts such as Xanthippe but absent from the default Athenian font. - 16 new Xanthippe-only records added: 12 are alternates of existing canonical records; 4 are non-canonical (no Athenian equivalent).
- QUESTION MARK was assigned
ChrW(63)by mistake, duplicating the correct GREEK ANO TELEIA (ANO STIGME) entry. - UNDERSCORE was assigned
ChrW(95)by mistake, duplicating the correct EM DASH entry. ChrW(8211)reclassified from MIDDLE DOT (U+00B7) to BULLET (U+2022).
- Linguist Software changed the use of
ChrW(45)andChrW(60)over the years, creating several inconsistencies in its encodings and associated fonts. GreekTranscoder 2 now adheres to the most recent LaserGreek usage. - HYPHEN-MINUS:
ChrW(60)corrected toChrW(45). - NON-COMBINING MACRON = EN DASH: corrected to
ChrW(60).
ChrW(8240)was assigned to both GREEK NUMERAL SIGN and NON-COMBINING OXIA: the GREEK NUMERAL SIGN record has been removed.- NON-COMBINING GREEK DASIA AND VARIA:
ChrW(352)corrected toChrW(189). - Added entries for LATIN SMALL LIGATURE OE
ChrW(339)and PLUS-MINUS SIGNChrW(177). - Some corrections applied to existing records.
ChrW(353)reclassified from MIDDLE DOT (U+00B7) to BULLET (U+2022).
- LEFT/RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK AND NO-BREAK SPACE: the
SmartQuotesmarker for these records now usesChrW(33), because Word's smart quote folding normalizesChrW(171) & ChrW(160)intoChrW(8220)(curly double quote), making a single real NBSP unusable adjacent to native guillemets.
Ismini, GreekKeys, Paulina Greek
- DOUBLE SOLIDUS was assigned a single
ChrW(47)instead ofChrW(47) & ChrW(47)in all three encodings.
-
Beta Symbol Block Ordering Fix (Unified version)
- The beta symbol pre-conversion check (
ChrW(976)detection and replacement) was running before the.xcodedbackup copy was created. Moved to run after versioning, matching the macOS-only version.
- The beta symbol pre-conversion check (
-
Homonymous Font Warning Fix (macOS-only version)
- The Vilnius University variants of Odyssea and Hellenica are stored as "Odyssea " and "Hellenica " (with a trailing space) to distinguish them from their LaserGreek homonyms.
- The HTML form's
gatherFormData()was passing trailing-space font names to validation, causing homonymous font confirmation dialogs to silently fail. Fixed by trimming font names after the encoding lookup.
-
Interface.frm Dispatcher Refactoring (Unified version)
- The conversion dispatcher has been rewritten from a nested
If/ElseIfcascade to aSelect Casestructure, aligning it with the macOSASEntrydispatcher. - Inline font-switching code extracted into a new
Private Sub SwitchFonts.
- The conversion dispatcher has been rewritten from a nested
Version 2.0.4: 2026.02.25
- Transcoder Improvements
- Database Improvements
- macOS-only Version Improvements
- Windows-only Improvements
-
Transcoder Improvements
Database: Self-Contained Transcoders
- In v 2.0.3, several encoding-specific functions were hand-coded in the Engine and UI modules: blue marker coloring (
ColorQuoteMarkers) and quote marker rescue for SPIonic targets (RescueQuoteMarkers). These duplicated pattern data already present in the FileMaker database and required manual synchronization with the character mappings. - In v 2.0.4, all encoding-specific logic is generated directly from the database and resides in the transcoders.
- Each transcoder is now self-contained and includes, in execution order:
ComposingChecker— normalizes precomposed/decomposed forms (unchanged).QuotesRescue— for X-into-SPIonic only: converts blue marker sequences to Unicode quotes in Times New Roman, colored green. Generated from the same marker records used bySmartQuotes.Rescue— converts source characters with no target equivalent to Unicode in Times New Roman, colored green. Target-aware exclusion lists prevent collisions with multi-character composed sequences in the main conversion loops.SmartQuotes— places quote marker sequences in the target encoding, then colors them blue. Previously, coloring was a separate Engine function; it is now part of the same generated block.Mainconversion loops — standard character mapping (unchanged).Catch-All— colors all remaining source-font characters red (unchanged).
- Enforcing the original GreekTranscoder's architecture, the Engine no longer contains any encoding-specific dispatch tables, marker pattern data, or coloring logic.
- It is once again a generic service layer: conversion, detection, whitespace cleanup, error logging.
Three-Color Post-Conversion Scheme and Alerts
- In previous versions, legacy-encoded characters which could not be converted were colored red, but their meaning was essentially lost. Now, they are "rescued" as legible Unicode code points.
- Post-conversion characters now use three distinct colors:
Color Meaning Font Set by Red Unconverted characters source font Catch-all Green Rescued to legible Unicode Times New Roman Rescue/QuotesRescue Blue Quote marker sequences target font SmartQuotes - The completion dialog now reports 8 possible alert states based on those three independent color flags.
- Blocks are ordered by severity: red (warning), green (informational), blue (informational).
- Removed smart quotes' records from legacy target encodings' conversions (redundant with
SmartQuotespre-processing), eliminating ~1,100 no-op Find/Replace operations across 11 transcoders. - Moved
Select Case iCharTotal(progress rate computation) out of theFor i = 1 To iCharTotalloop and into procedure-level code: the value is constant per function.
Unicode Transcoder Optimization and Fixes
- In Unicode-to-Unicode conversions, many composing characters are identical to their composed counterparts and only need a font switch instead of a no-op replacement.
- Word's fuzzy character equivalence was conflating straight and curly quotes in Unicode-to-SPIonic conversions. Those conversions now use
bMatchWildcards:=Truescoped toUnicodeComposedOther_into_SPIonic.
- In v 2.0.3, several encoding-specific functions were hand-coded in the Engine and UI modules: blue marker coloring (
-
Database Improvements
- All 12 legacy font encodings cross-validated against their original font files (BetaCode audited separately via the Beta Code Manual). All 12 phases complete with 0 outstanding issues.
- 9 wrong character values corrected across 5 encodings (Ismini, LaserGreek, SuperGreek, Unicode, Vilnius). 10 new records added. 10 new values added to existing records.
- Custom value list for sorting.
- COMBINING COMMA ABOVE (PSILI, U+0313):
")"changed to"%177". COMBINING REVERSED COMMA ABOVE (DASIA, U+0314):"("changed to"%178". Avoids collisions and better aligns with TLG specification. - 5 new characters: GREEK CAPITAL LETTER HETA (
*#400, U+0370), GREEK SMALL LETTER HETA (#400, U+0371), GREEK CAPITAL LETTER YOT (*#401, U+037F), GREEK SMALL LETTER YOT (#401, U+03F3), RAISED OMISSION MARKER (#1204, U+00B0). - Half bracket codes added for 3 new records (see SuperGreek/LaserGreek):
[7/]7for top,[5/]5for bottom. Floor brackets reassigned from[5/]5to[8/]8.
ChrW(160)instead ofChrW(32)as prefix for all capital letters with standalone VARIA, OXIA, TONOS, or DIALYTIKA (prevents double-space collapsing).CapitalCheckersubscript added to normalize malformed capital letters.
- OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI (U+1FA2):
ChrW(311)corrected toChrW(711)(digit transposition).
- LATIN SMALL LETTER Y: wrong PostScript code point
ChrW(180)(ACUTE ACCENT) corrected toChrW(165). Both encodings. - NON-COMBINING PERISPOMENI: LaserGreek
ChrW(96)corrected toChrW(39)(was indistinguishable from TILDE rec 436). SuperGreek already hadChrW(39). - LEFT HALF BRACKET (U+2E22): wrong Unicode
ChrW(11776)corrected toChrW(11810). SuperGreek/LaserGreek values moved to new rec 555. - COMBINING CIRCUMFLEX FOR CAPITAL LETTERS: wrong LaserGreek PostScript values deleted (byte 223 is NUMBER 2 SUPERSCRIPT in LaserGreek, CIRCUMFLEX only in SuperGreek).
- COMBINING GRAVE/ACUTE FOR CAPITAL LETTERS: wrong LaserGreek convention values
ChrW(204)/ChrW(200)emptied (these are NUMBER 1 SUPERSCRIPT and DOUBLE SOLIDUS, not convention diacritics). - 3 new records: half brackets TOP RIGHT, BOTTOM LEFT, BOTTOM RIGHT (U+2E23–U+2E25).
- 5 new malformed records: space/NBSP + breathing marks
ChrW(74)/ChrW(106), space + tildeChrW(96).
- PLUS-MINUS SIGN (U+00B1): was set by mistake to
ChrW(232), corrected to empty.
- 2 new records: CENT SIGN (U+00A2)
ChrW(199), POUND SIGN (U+00A3)ChrW(198). - 6 new Alt/Malformed values on existing records: overline/underline 3-width variants.
- ETA WITH PSILI AND VARIA (U+1F22):
"^"corrected to"^^"("^"is not allowed in Word's "Replace with" box and is equivalent to"^^"in the "Find box"). - LATIN SMALL LETTER Z WITH CARON (U+017E): added
TitusAlt=ChrW(158)(Win-1252 byte duplicate at U+009E).
- VERTICAL LINE EXTENSION (U+23D0) deleted: normalized to VERTICAL BAR (U+007C).
- LEFT HALF BRACKET (U+2E22): wrong
ChrW(11776)corrected toChrW(11810).
- OMICRON WITH PSILI AND VARIA (U+1F42):
ChrW(211)corrected toChrW(204)(was duplicate of UPSILON WITH PSILI AND VARIA). - MIDDLE DOT (U+00B7):
VilniusAlt=ChrW(9729)corrected toChrW(8729)(digit transposition).
- NON-COMBINING DIAERESIS: added
WinGreek=ChrW(64). - EPSILON WITH DASIA AND VARIA: added
ChrW(382)as an alternate character (Win-1252 for C1 byte). - RHO WITH DASIA: added
ChrW(8729)as an alternate character (BULLET OPERATOR, same glyph as canonicalChrW(183)MIDDLE DOT).
- Fixed an issue where six combining diacritic records covering four code points (
ChrW(768),ChrW(769),ChrW(771),ChrW(787)) and representing valid TLG vs scholarly convention differences, not malformed data, were not always processed correctly.
- The last prefix collisions caused by faulty sort orders have been eliminated.
- Only BetaCode, BibleWorks and SGreek were affected and are now fixed.
- The marker system uses
ChrW(33)(EXCLAMATION MARK) as a default directional marker character. However, three legacy encodings map code point 33 to non-exclamation glyphs: BibleWorks (PLUS SIGN), SGreek (alternate GREEK ANO TELEIA), WinGreek (SOUTH WEST ARROW). In these encodings, marker sequences displayed the wrong glyph and could collide with the encoding's own mapping for code point 33. - Each of the three encodings now uses its own canonical exclamation mark character as the marker: BibleWorks
ChrW(184), SGreekChrW(8222), WinGreekChrW(8218). The remaining encodings (GreekKeys, Ismini, LaserGreek, PaulinaGreek, SuperGreek, Titus, Vilnius) retainChrW(33). - The
GreekRemoveQuoteMarkersutility module was updated to match the encoding-specific marker characters in addition to the defaultChrW(33).
-
macOS-only Version Improvements
- Resolved the v 2.0.3 known limitation where macros did not appear in Word for Mac's Macros… dialog at startup (see "VBA Bugs and Quirks" below for details).
- macOS sandbox blocks
ActiveDocument.Savewhen the document is in a folder monitored by a sync agent (iCloud, Google Drive, OneDrive, Dropbox, etc.). This caused a silent Error #0 that aborted conversions. - Pre-loop calls removed from all generator templates (redundant: each function's checkpoint save covers the next function's start).
- Remaining checkpoint saves wrapped with
On Error Resume Next. - When overwrite is blocked, the
SaveAsretry loop is now capped atMAX_SAVEAS_RETRIES = 5. - The xcoded version-finding loop retains its
MAX_XCODED_VERSIONS = 999cap for normal use.
- New
GT_DOTM_VERSIONconstant in the Launcher module. - Before launching the external application, the Launcher reads
CFBundleShortVersionStringfrom the app'sInfo.plistand compares withGT_DOTM_VERSION(see "VBA Bugs and Quirks" below for implementation details). - On mismatch, a bilingual alert shows both version numbers and aborts, preventing unpredictable behavior from running mismatched components.
- Three distinct bilingual warnings prepare the user for a possible macOS sandbox "Grant File Access" dialog depending on the context:
- First launch (no saved path): explains the upcoming file chooser and sandbox grant dialog.
- Application not found (saved path invalid): explains relocation and possible sandbox grant.
- Template updated (dotm version differs from last successful check): explains the sandbox grant may reappear. Skipped when the user has just located the app (cases 1–2 already cover it).
- A
last_checked_version.txtpreference file (alongside the existingapp_path.txt) records the dotm version that last completed the sandbox grant, enabling detection of dotm updates without redundant warnings on normal runs.
-
Windows-only Improvements
WinGreek and Titus Removed as Target Encodings
- WinGreek and Titus use byte positions in the C1 control character range (128–159) and DEL (127) for Greek characters. Windows Word cannot write these code points in Find/Replace operations, causing conversions to these encodings to silently corrupt characters. Conversions from these encodings work correctly on all platforms; conversions to them work correctly on macOS only.
- Normal mode: WinGreek and Titus fonts are excluded from the target dropdown. They remain available as source fonts.
- Expert mode: WinGreek and Titus encodings can still be selected manually, but a warning with Cancel as default explains the incompatibility (WinGreek: 5 affected characters; Titus: 30 out of 339, including all capitals with dasia or with psili and perispomeni).
- macOS: no changes. Both encodings remain fully functional as targets.
Version 2.0.3: 2026.02.09
- Post-Conversion Marker Highlighting
- Remove Quote Markers: Color-Aware Matching
- Font-Switch Color Setting
- Post-Conversion Whitespace Cleanup
- Selection Boundary Shift Fix
- VBA Code Change
- Known Limitation: macOS Macros Dialog
-
Post-Conversion Marker Highlighting
- After conversion, quote marker sequences in the target encoding are now colored blue so users can identify them visually.
- Each target encoding's exact marker patterns are matched and colored directly.
- SPIonic and Unicode targets are excluded: SPIonic has no quotation mark records; Unicode uses native typographical quotes.
- After conversion, the Engine now scans for any characters colored red in the source font or blue in the target font.
- Red detection runs after the BetaCode/SPIonic digit cleanup to avoid false positives from digits that are legitimately red before cleanup.
- Both detection functions (red and blue) share a common
DetectColorInFonthelper to avoid code duplication. - Because
FindText:=""catches paragraph marks indiscriminately (see "VBA Bugs and Quirks" below), the helper uses patterns built fromChrW()ranges with.MatchWildcards = Trueto avoid ghost matches left by the catch-all's format-only replace. - The helper respects
ReplaceAllvs.Selectionmode.
- The completion dialog now dynamically reports what colors are present in the converted document: no colors, red only, blue only, or both.
- When blue markers are detected, the alert notes the availability of
GreekTranscoder_RemoveQuoteMarkersvia Tools > Macro > Macros… (macOS) or Alt+F8 (Windows). - When no red or blue characters are found, the alert is a clean "conversion done" message without unnecessary color warnings.
-
Remove Quote Markers: Color-Aware Matching
- The
GreekRemoveQuoteMarkersutility module now only matches blue-colored marker sequences, leveraging the blue coloring applied byColorQuoteMarkers(§1). - Find side uses
.Font.Color = wdColorBlueto restrict matching to markers colored by the conversion engine; replace side resets towdColorAutomatic. Both constraints require.Format = True.
- The
-
Font-Switch Color Setting
- The FileMaker database was updated to support the new coloring features: all generated
CharConvertercalls now pass an explicitlFontColor:=wdColorAutomaticparameter.
- The
CharConverterfunction's defaultlFontColorparameter changed fromwdColorAutomaticto-1(sentinel meaning "preserve existing color"). - All three
.Font.Color = lFontColorassignment sites inProcessStoryRangeandProcessSelectionRangeare now guarded withIf lFontColor <> -1. - This ensures that font-switch operations (same encoding, different fonts) no longer reset text color to
Automatic, preserving blue markers from a prior conversion.
- Because the improved color preservation in
CharConverterremoved the incidental color reset, beta symbols colored red by the catch-all retained their red color after being switched to the target font. - The beta symbol cleanup (
ChrW(976)font switch for Unicode targets supporting U+03D0) now explicitly passeslFontColor:=wdColorAutomatic.
- The FileMaker database was updated to support the new coloring features: all generated
-
Post-Conversion Whitespace Cleanup
- The catch-all in each transcoder colors all remaining source-font characters red via a format-only replace (
findChar:=""). This legitimately flags unconverted characters, but also colors structural marks (paragraph marks, line breaks, section breaks) and Unicode exotic spaces. - These characters become "ghost red": they carry red formatting in the document XML but are invisible on screen and cannot be found using a color filter (see "VBA Bugs and Quirks" below).
- In addition, the document-final paragraph mark, once colored red by the catch-all's format-only replace, cannot be found or modified by any subsequent Find/Replace operation.
- New
CleanUpWhiteSpaceEngine function runs after digit cleanup and beforeDetectRedCharactersin bothReplaceAllandSelectionmodes. - Uses a single-pass wildcard
CharConvertercall covering structural marks (U+000B–U+000D) and Unicode exotic spaces (U+2000–U+200A, U+202F, U+205F). - Font-only search (no
lFindFontColor) withlFontColor:=wdColorAutomaticsince color filtering does not work on ghost-red characters. - The document's final paragraph mark is handled separately and directly, bypassing Find/Replace entirely (see "VBA Bugs and Quirks" below).
- The catch-all in each transcoder colors all remaining source-font characters red via a format-only replace (
-
Selection Boundary Shift Fix
- The v2.0.3 post-conversion pipeline (
CleanUpWhiteSpace,ColorMarkerSequence,DetectRedCharacters) runs multiple^&format-only Find/Replace operations sequentially. Word's Find/Replace with^&self-replacement shifts all liveRangeobjects and theSelectionin the same story as a side effect, even when operating on a.Duplicate. Cumulative drift across 8–10 pipeline calls pushes the final marker sequence outside the selection boundary.
ProcessSelectionRangenow savesSelection.Start/.Endbefore Find/Replace and restores them after^&operations (guarded byIf replaceChar = "^&"). Non-^&calls (main conversion) are unaffected since text length changes must be reflected inSelection.
Non-Body Stories Branch (Footnotes, Endnotes, Headers, Footers)
- Same drift affects
m_OriginalRangeand theSelection(which is back in the footnote afterStartRange.Select).ProcessSelectionRangenow saves and restores bothm_OriginalRange.Start/.EndandSelection.Start/.Endfor^&operations.
Beta Symbol Detection in Non-Body Stories
- Beta symbol detection and replacement (
ChrW(976)→ChrW(946)) inInterface.frmandASEntry.basusedSelection.Rangeto scope the search. On Windows, the modalUserFormsteals focus from the footnote; on macOS, the view switch to Normal kicks the cursor out. Both causeSelection.Rangeto resolve to body text instead of the footnote. - New
GetStoredRange()public getter on both Engines returnsm_OriginalRange.Duplicate. Detection and replacement now use it for non-body stories (HasStoredSelection() And GetStoredStoryType() <> wdMainTextStory), falling back toSelection.Rangefor body text.
- The v2.0.3 post-conversion pipeline (
-
VBA Code Change
IsMacOS()Made Public (Unified Engine Only)- The Unified Engine's
IsMacOS()function was changed fromPrivatetoPublicwith a bogusOptionalparameter to hide it from the Macros menu. - This allows the Unified Interface form to branch alert text at runtime based on the current platform (macOS menu path vs. Windows Alt+F8).
- The macOS Engine's
IsMacOS()remainsPrivatesinceASEntry.basalways knows it is running on macOS.
- Language preference detection consolidated in the Launcher module. Both Installers now delegate to
GetLanguagePreference()in the Launcher instead of duplicating the detection logic.
- The Unified Engine's
-
Known Limitation: macOS Macros Dialog (resolved in 2.0.4)
- In the macOS-only distribution, GreekTranscoder macros do not appear in Word's Tools > Macro > Macros… dialog until the macOS application has been opened at least once from the Ribbon during the current Word session.
- Once the application is launched from the Ribbon, Word for Mac rebuilds its internal state and macros appear for the rest of the session (see "VBA Bugs and Quirks" below).
- All macros remain fully functional from the Ribbon, but
GreekTranscoder_RemoveQuoteMarkersis only available via the Macros… dialog.
Version 2.0.2: 2026.02.02
- Language-Aware Alerts
- Smarter Startup Validation
- Improved Pre-flight Validation Checks
- VBA Bug Workarounds
- Interface Fixes
- New Utility Module: Remove Quote Markers
-
Language-Aware Alerts
- Whenever possible, all user-facing alerts now respect the saved language preference (English or French).
- When a preference is set, alerts are displayed in the selected language only.
- When no preference is set (first run or preference cleared), alerts fall back to bilingual display (English + French) for accessibility.
If sLang = "en"/ElseIf sLang = "fr"/Elsethree-branch pattern across all alert functions in all VBA modules (Launcher, Engine, Installer, Interface) and the macOS HTML form.
Language Preference Infrastructure
- Added
GetLanguagePreference()function to Engine and Installer modules for reading saved preferences. - macOS: reads from sandbox path
~/Library/Application Support/GreekTranscoder/language.txt(where~is Word's sandboxed HOME). - Windows: reads from Registry
HKCU\Software\VB and VBA Program Settings\GreekTranscoder\Preferences\Language. - Returns "en", "fr", or "" (empty for bilingual fallback).
Word/System Language Fallback (First Run)
- When no preference file exists, alerts now detect the user's language from Word or the OS.
- VBA modules (Engine, Installer): fall back to Word's UI language via
Application.Language. - AppleScript: falls back to macOS system language via
defaults read -g AppleLanguages. - The detected language is saved automatically, so subsequent runs use the file-based preference.
-
Smarter Startup Validation
STARTUP Load Warning (Windows-only)
- New
AutoExecmacro in the Installer modules runs automatically on Windows when the templates load from STARTUP as add-ins. - Triggers
CheckInstallationand displays warnings immediately. - Note:
AutoExecmust bePublicto function, so it appears in the Macros menu on both platforms; this is harmless.
Improved Case 0: Wrong Platform Check (macOS Installer)
- Previously: opening the macOS-only template on Windows always showed "Wrong Version Installed" error.
- Case 0a (new): Wrong platform, but correct version installed = informational message ("Wrong Version for This Platform").
- Case 0b: Wrong platform, correct version not installed = error with replacement guidance.
Improved Case 2: Template Location Check
- Previously: any template opened from outside the Startup folder triggered a "Not Installed" error.
- Case 2a (new): Running from outside, but installed = informational message ("Running from Outside Startup Folder").
- Case 2b: Running from outside, not installed = error with installation guidance.
- When the macOS-only template is used on Windows, clicking the Ribbon button now displays a "Wrong Version" warning.
- Detection uses
PingmacOSsignature function.
- New
-
Improved Pre-flight Validation Checks
New Pre-flight Check: Template Documents Rejected
- GreekTranscoder is designed to convert text in regular documents, not in template files.
- New Check 2b rejects
.dotm,.dotx, and.dottemplate files with a bilingual alert. - See v2.0.0 §2 for the full list of pre-flight checks.
-
VBA Bug Workarounds
#If MacCompile-Time Directive Bug- VBA's
#If Mac/#If Not Maccompile-time directives do not work reliably when a template is opened via File > Open (see "VBA Bugs and Quirks" below). - Workaround: replaced compile-time checks with runtime
IsMacOS()function (Application.PathSeparator = "/") in the macOS-only Installer module where platform detection is critical.
Selection.Font.Name Fails Inside HTTP(S) Hyperlinks
- Accessing
Selection.Font.Nameinside an HTTP(S) hyperlink causes Word to attempt URL resolution and generates an initialization error (see "VBA Bugs and Quirks" below). - Workaround: new
IsSelectionInHyperlink()helper duplicates the selection range, expands to word level, then checks for hyperlinks. If detected, font pre-fill is skipped and the Source Font dropdown is left empty.
- VBA's
-
Interface Fixes
macOS VBA Form: Resizing and Helvetica Font
- Form scaled up from 560×495 to 660×584 for better readability on Retina displays.
- Added programmatic font assignment via private constant in
.frmfile. - Default font is now Helvetica (14pt labels, 13pt comboboxes, 11pt copyright).
Windows VBA Form: Segoe UI Font and Resizing
- Replaced Arial with Segoe UI (11pt labels, 10pt comboboxes, 9pt copyright).
- Form scaled down from 660×584 to 500×440 with all control positions recalculated.
Windows VBA Form: Language Loading Order
- Fixed bug where the homonymous font warning (Hellenica/Odyssea) was displayed before the language preference was loaded. Moved language loading earlier in
UserForm_Initialize, before font auto-detection. - The warning is now displayed in the user's preferred language instead of always being bilingual.
- Reviewed and harmonized all alert messages across both Windows and macOS versions for consistent content, formatting, and bilingual presentation.
-
New Utility Module: Remove Quote Markers
- GreekTranscoder's marker system preserves typographical quote information (curly quotes, guillemets) when converting through legacy Greek encodings that only support straight quotes.
- The new
GreekRemoveQuoteMarkersmodule provides a way to strip these markers, "dumbing down" the text to plain quotes for users who prefer or need this.
- Run the macro
GreekTranscoder_RemoveQuoteMarkersfrom the Macros menu (Tools > Macro > Macros…). - The macro displays a warning before proceeding, as this is a one-way, destructive operation.
- If no selection, processes the entire document including footnotes, endnotes, headers, etc.
Version 2.0.1: 2026.01.26
-
Startup Validation
- New startup checks detect installation issues before any conversion.
- All alerts are bilingual and offer to reveal/open Word's Startup folder.
- Detection uses platform-specific no-op functions (
PingmacOS,PingUnified) as module signatures.
- Case 0: Wrong platform — macOS-only template on Windows (macOS Installer only).
- Case 1: Startup folder missing or not configured.
- Case 2: Template not in Startup folder.
- Case 3: Both Unified and macOS-only templates installed (Unified Engine and macOS application).
- Case 4: v1.x template coexisting with v2 (informational warning).
- macOS-only
GreekTranscoder__Installer.bas: includes Case 0; Windows code paths removed. - Unified
GreekTranscoder__Installer.bas: retains platform conditionals.
-
Interface Cleanup
- Standardized folder-action verbs across platforms and languages.
- Fixed inconsistent NBSP usage around "/" in bilingual alert titles.
Version 2.0.0: 2026.01.24
- Critical Bug Fixes (Functional)
- Major Architectural Changes
- New Features
- Database Fixes
- Interface Improvements
- Code Quality Improvements
-
Critical Bug Fixes (Functional)
Story Iteration: Footnotes & Endnotes
- Fixed broken footnote/endnote/header/footer/comment processing caused by incomplete story iteration that only processed the first story of each type instead of following Word's
NextStoryRangechain. - Implemented
Selection.Range.Duplicateto preserve the selection beforeUserFormsteals focus. - Worked around a bug where
Selection.StoryTypeincorrectly returnswdMainTextStorywhenUserFormis displayed.
- Implemented document versioning system with Yes/No/Cancel prompts.
- Added comprehensive error handling around all
SaveAsoperations with automatic fallback to versioned filenames (xcoded2,xcoded3, etc.).
- Implemented post-conversion detection of Track Changes corruption caused by the unreliable
TrackRevisionsproperty (see "VBA Bugs and Quirks" below). - Critical warning with recovery instructions displayed when corruption detected; document not saved automatically.
- Implemented
GetAttr()pre-flight check to detect locked files before conversion (see "VBA Bugs and Quirks" below). - Two check points: Launcher (source document) and
ASEntry/frm(xcodedoverwrite scenario).
- Fixed 40 records (Modern Greek tonos vowels, non-combining diacritics, combining accents) being incorrectly excluded from Unicode-to-legacy conversion functions.
- Fixed
UnicodeComposingfield inconsistencies (mixed TLG/scholarly characters) causing bidirectional conversion failures. - Resolved duplicate character mappings causing conversion conflicts (KORONIS/PSILI, MIDDLE DOT/ANO TELEIA).
- Added missing reverse Unicode conversion functions for scholarly-to-NFC transformations.
- Fixed composing mode not properly decomposing composed characters.
Checker Functions and Malformed Record Sorting
- Systematic verification and debugging of all initial "Checker" functions that normalize malformed character sequences before conversion.
- Analyzed sort order requirements for malformed records to ensure longer patterns are processed before shorter ones that could match prematurely.
- Converted all accented French characters in string literals to
ChrW()calls to prevent encoding corruption when transferring files between macOS and Windows and to allow for proper French and English typography.
Word 2011 for Mac Path Bug Workaround
- Implemented detection and workaround for a Word 2011 for Mac
ActiveDocument.Pathbug (see "VBA Bugs and Quirks" below). Applied defensively to both codepaths as a no-op safeguard.
- Implemented comprehensive lossless quotation mark transcoding system using marker sequences.
- Preserves opening/closing distinction for curly quotes (
""'') and guillemets («») through "dumb" encodings that use a single character for both. - Marker position encodes direction: marker after quote = left/opening, marker before quote = right/closing.
- Markers:
!for plain guillemets, NBSP for English curly quotes, NBSP×2 for French guillemets (actual NBSP present),!!!/!!/!for Titus (no NBSP support). - BetaCode uses TLG codes (
"6/"7/"3) + NBSP/!markers; other legacy encodings use their native quote character + markers. - SPIonic is inherently lossy and marker sequences conflict with its NBSP + diacritic system for capitals.
- Quick reference master table:
Char Unicode BetaCode Titus Other Legacy «+NBSP U+00AB U+00A0 "6 +NBSP char+ !!! char+NBSP×2 « U+00AB "6 + ! char+ ! char+ ! NBSP+» U+00A0 U+00BB NBSP+"6 !!! +char NBSP×2+char » U+00BB ! + "6 ! +char ! +char " U+201C "7 +NBSP char+ !! char+NBSP " U+201D NBSP+"7 !! +char NBSP+char ' U+2018 "3 +NBSP char+ ! char+NBSP ' U+2019 NBSP+"3 ! +char NBSP+char - Fixed broken footnote/endnote/header/footer/comment processing caused by incomplete story iteration that only processed the first story of each type instead of following Word's
-
Major Architectural Changes
- Complete rewrite with modular helper functions replacing monolithic code.
- Restructured
CharConverterfunction. - New platform strategy separating macOS and Windows codepaths.
- Added optional
lFindFontColorparameter toCharConverterfor find-by-color operations.
Public/Private Function Architecture
- Converted monolithic
Publicfunctions toPublicdispatcher +Privatemain function pattern following the architecture already used by complex encodings (Unicode, SuperGreek, LaserGreek, etc.).
- Created AppleScriptObjC +
WKWebViewsolution to provide a modern, reliable interface on macOS. - The original VBA
UserFormremains functional on macOS but it cannot be edited any longer in the Visual Basic Editor on macOS, making maintenance impossible without a Windows machine. - The native macOS application hosts an HTML form in a
WKWebView, providing pixel-perfect rendering and full editability. WKScriptMessageHandlerimplementation for JavaScript-to-AppleScript communication.- Custom message dialog system compatible with
WKWebViewmodal constraints. ASEntrybridge module for AppleScript-to-VBA parameter passing.- Critical error handling with automatic quit: the standalone macOS app quits after displaying bilingual alerts for "Word not running" (at startup) and "VBA modules not installed" conditions.
- The HTML form intentionally replicates the VBA
UserForm's visual design to ensure consistency across platforms.
Unified Cross-Platform Architecture
- Both Windows/macOS and macOS-only versions share the same VBA conversion engine (all transcoder modules, helper functions, and core logic).
- Platform differences are isolated to the interface layer: VBA
UserFormon Windows/macOS, AppleScriptObjC + HTML on macOS. - Validation logic synchronized between HTML form (macOS-only) and VBA form (Windows/macOS) to ensure identical behavior.
- Created cross-platform initialization module.
- Implemented macOS app path discovery and persistence in
~/Library/Containers/com.microsoft.Word/Data/Library/Application Support/GreekTranscoder/. - Implemented Windows folder writability fallback chain.
- Check 0: Word must be running (macOS standalone app only, uses System Events to check without launching Word).
- Check 1: Document must be open (macOS only).
- Check 2: Document must not be empty.
- Check 3: Document must be saved at least once.
- Check 4a: Document must be unlocked in Finder/File Explorer (
xcodedfiles only). - Check 4b: Document must not be protected (Word protection).
- Check 5: Output folder must be writable.
- Check 6a: Document must not contain pending tracked changes.
- Check 6b: Track Changes must be disabled.
- Check 7: Document format must be compatible (RTF, TXT, HTML, PDF blocked).
- Check 8: Master Documents with unexpanded subdocuments warning.
- Check 9: Field codes display warning with OS-specific shortcuts (Alt+F9/Option+F9).
- Check 10: Source font must exist in document.
- Check 1: Font list must load successfully.
- Check 2: Array initialization must succeed.
-
New Features
- Implemented BibleWorks transcoder and added BibleWorks fonts (Bwgrki, Bwgrkl, Bwgrkn).
- Implemented Titus transcoder and added Titus fonts (Titus Greek, TITUS-Griechisch, TITUS GRIECHISCH).
- Implemented four distinct Unicode modes: Composed Scholarly, Composed NFC, Composing Scholarly, Composing TLG.
- NFC and Composing options being mutually exclusive, only two checkboxes are needed to control all four modes.
- Full Ribbon integration for both macOS and Windows versions of Microsoft Word.
- Fonts are now grouped by encoding.
- Removed obsolete fonts: Arial Unicode MS, Garamond Classical, GentiumAlt, GR Andale Mono, GR Cambridge, GR Lucida Sans, GR Mellonta, GR Oxford, GR Times New Roman, GR Uncial, Thryomanes, TITUS Cyberbit Basic, Vusillus Old Face.
- Added new (mostly Unicode) fonts as modern alternatives: Adobe Text Pro, Alfios, Anaktoria, AncientGreekBetaCode (Beta Code), Arial, Aristarcoj (WinGreek, with source warning due to font's ability to display both WinGreek and Unicode text), Arno Pro, BosporosU, Brill, EB Garamond, Calibri, Gentium Book Plus, Gentium Plus, GFS DidotClassic, GFS Porson, Hypatia Sans Pro, KadmosU, Minion 3, Noto Sans, Noto Serif, Palatino (macOS version), SBL Greek.
- Implemented source-only font filtering: fonts with known rendering issues are excluded from the target dropdown while remaining available as source fonts for conversion.
- Source-only fonts (available in source dropdown, excluded from target): SGRead, Aisa, Aristarcoj, Greek, Code2000.
- Expert Mode only fonts (removed from both dropdowns, accessible only via Expert Mode): Bosporos, Kadmos, BSTGreek, IsminiPC, Ismini Regular.
- Expert Mode warnings trigger when these fonts are manually entered as target: incomplete character sets (BSTGreek, Code2000, SGRead), NBSP collision in older versions (Bosporos, Kadmos), missing NBSP glyph breaking marker system (Aristarcoj), display problems (Aisa, Greek, IsminiPC, Ismini Regular).
- Automatic cleanup of orphaned GREEK BETA SYMBOL characters (U+03D0) in Unicode-to-Unicode conversions: when a target font supports U+03D0, any instances left in substitution fonts (like Cambria) are switched to the target font.
- New warning when converting from Unicode to any legacy encoding: detects GREEK BETA SYMBOL characters (used in the French editorial tradition as medial betas) and offers to convert them to regular GREEK SMALL LETTER BETA characters (U+03B2). If declined, they remain in their original font and are colored in red as unconvertible characters.
BetaCode/SPIonic Digit Cleanup
- These encodings use digits as control character modifiers; unconverted digits are colored red by the catch-all function.
- Post-conversion cleanup finds red digits in any font (not just the source font) and normalizes them to target font with automatic color. This handles digits that fell through from prior conversions and remained in a different font.
- Respects selection boundaries in Selection mode.
- Integrated utility for two-way conversion between GREEK SMALL LETTER BETA (β: U+03B2) and GREEK BETA SYMBOL (ϐ: U+03D0).
- Using curly betas as medial betas is a French typographical convention dating back to the Renaissance.
GreekBetaSymbol: converts medial betas to beta symbols using context-aware detection (only converts betas following Greek letters or hyphens).GreekBetaSmall: converts all beta symbols back to small letter betas.- Both functions respect the current selection if any text is selected, otherwise process the entire document.
- Accessible via dedicated Ribbon buttons.
-
Database Fixes
- Fixed composed character variants "v" and "^" in SGreek.
- Fixed
UnicodeComposingfield: standardized to scholarly characters (varia, oxia, psili). - Fixed
UnicodeMalformedfield for proper checker function operation. - Added 24 new character mappings for NT apparatus symbols and non-combining diacritics.
- Corrected UPSILON and ALPHA record
UnicodeComposingvalues. - Improved quotation marks mappings to make their lossless transcoding possible.
WinGreek and Unicode Variant Symbol Normalization
- Added
WinGreekAltvalues to 5 canonical Greek letter records (SMALL LETTER THETA, EPSILON, KAPPA, RHO and PHI) to normalize WinGreek variant symbol positionsChrW(2)throughChrW(6)to standard letters during conversion. - Added
SGreekAltChrW(74)to GREEK SMALL LETTER THETA record for variant normalization. - Added WinGreek
ChrW(1)to LUNATE SIGMA SYMBOL record (U+03F2). - Added
UnicodeMalformedentries to normalize 5 mathematical Greek variant symbols (U+03D1 THETA SYMBOL, U+03F5 LUNATE EPSILON SYMBOL, U+03F0 KAPPA SYMBOL, U+03F1 RHO SYMBOL, U+03D5 PHI SYMBOL) to their standard Greek letter equivalents. - Added
UnicodeMalformedentries to normalize spacing diacritics (U+02D8 BREVE, U+00AF MACRON) to TLG metrical characters (U+23D1 METRICAL BREVE, U+2013 EN DASH). - Added
UnicodeMalformedentry to normalize U+2010 HYPHEN to U+002D HYPHEN-MINUS for compatibility. - Deleted redundant GREEK THETA SYMBOL record.
- Resolved KORONIS/PSILI conflict (PSILI takes precedence).
- MIDDLE DOT vs ANO TELEIA (scholarly default via processing order).
- Of 89 duplicate entries found, 24 causing conversion conflicts were fixed.
-
Interface Improvements
- New
GreekTranscoder__Installermodule detects when template is opened from outside Word's Startup folder and displays bilingual installation guidance. - Offers to reveal Word's Startup folder in Finder (macOS) or File Explorer (Windows) for easy template installation.
- On Windows, if the Startup folder does not exist, offers to create it automatically before revealing.
- On macOS, if the Startup folder has not been configured, displays instructions for setting it via Word's preferences (File Locations).
- macOS standalone app: "Reveal" button available in the "VBA modules not installed" alert, with fallback instructions if Startup folder is not configured.
- User's language preference saved (Windows: Registry; macOS:
~/Library/Application Support/GreekTranscoder/language.txt). - Selection detection logic improved (insertion point vs actual selection).
- Default button standardized to "Yes/Continue" (first button) across all confirmation dialogs for consistent keyboard navigation.
- Dynamic encoding descriptions in both English and French.
- Comprehensive tooltips.
Validation Dialog Improvements
- Consolidated composing diacritics warning into single pre-validation check, eliminating duplicate warning blocks from conversion dispatcher.
- Implemented complete 8-case Unicode-to-Unicode confirmation dialogs with detailed explanations:
– Same font: Cases 1–4 (no options, NFC, composing scholarly, composing TLG)
– Different fonts: Cases 5–8 (same four combinations, with font-switch hint where applicable) - Validation order synchronized between VBA form and HTML form.
- AppleScript WKWebView integration.
- macOS sandbox permission error handling (error #5487): Word runs in a sandboxed environment and may require folder access via the "Grant File Access" dialog; clear bilingual instructions provided.
- Keyboard shortcut: Cmd+Return implemented for macOS form (workaround for WKWebView consuming Enter).
- Selection state validation at conversion time with user prompts when selection changes after form launch.
- Windows-only: WinGreek encoding warning for C1 control character positions (129, 141, 143, 144, 157).
- Fixed bug where Unicode options (Use Composing Characters, TLG Usage/NFC Normalization) remained visually checked but disabled when switching from a Unicode target font to a legacy target font.
- The checkbox state and underlying boolean variables are now properly reset when the target encoding changes to non-Unicode.
- Track Changes corruption: bilingual critical warning with 5-step recovery instructions.
- Locked file: bilingual warning with unlock instructions.
- New
-
Code Quality Improvements
- Comprehensive error handling replacing prior silent suppression.
- Date-based error logging with session tracking.
Defensive Programming: Engine Hardening
StoryRangesvalidation with automatic fallback to main body conversion when document structure is corrupted.- Find object state cleanup via
.ClearFormattingafter each processing operation (avoids re-adding formatting criteria). - Application-level Find state cleanup (
Selection.Find) ensures Word's Find/Replace dialog is completely clean after conversion. - Session-aware warning system (warnings shown only once per conversion session).
AutoFormat Options Preservation
- All 25 Word
AutoFormatoptions (13AutoFormatAsYouType+ 12AutoFormat) are now saved at conversion start and restored on completion. - Previously, GreekTranscoder disabled these options during conversion but did not restore the user's original settings.
ScreenUpdatingandDisplayAlertsapplication states are now saved and restored instead of being systematically set toFalsethenTrue.
Defensive Programming: Error Recovery
- Range object cleanup in error handlers to prevent orphaned references.
GTParamsproperty deletion verification with non-critical error logging.
Defensive Programming: AppleScript-VBA Communication
- JSON-safe font name escaping for WebView initialization data.
- Pre-flight parameter validation before Word macro calls.
- Specific error handling: immediate failure for fatal errors (-1728 Word not accessible, -10810 Word not found, -1708 VBA modules not installed), retry logic for transient errors (4198).
- Consolidated boolean flags and font/encoding lists using arrays and helper functions.
- French typography: non-breaking space (and narrow non-breaking space where applicable in the HTML form) before high punctuation (? ! : ;), proper guillemets with interior spaces (« … ») and curly apostrophes.
- English typography: curly quotes and curly apostrophes.
- Inline documentation of Word VBA bugs discovered during development.
- Module identification blocks in all files.
- Improved comments in VBA code.
- Updated web site and documentation.
- GPL 3.0 license update.
V 1
- Version 1.0.9: 2016.09.29
- Version 1.0.8: 2016.09.22
- Version 1.0.7: 2016.09.20
- Version 1.0.6: 2016.09.15
- Version 1.0.5 (beta): 2010.09.29
- Version 1.0.4: 2005.07.20
- Version 1.0.3: 2005.07.18
- Version 1.0.2: 2005.07.15
- Version 1.0.1: 2005.07.08
- Version 1.0.0: 2005.06.27
Version 1.0.9: 2016.09.29
- Minor UI changes to better work with recent versions of Word: in particular, the "Conversion Settings" frame's caption has been removed, since it was not being displayed properly.
- Corrected a few typos and switched from straight single quotes to closing ones in all the captions.
- Removed all the user-defined styles from the
GreekTranscoder.dottemplates. - Updated the screen captures in the documentation.
Version 1.0.8: 2016.09.22
- Minor UI changes to better work with Word 2016 for macOS.
- There are now two versions of GreekTranscoder: one for Windows and one for macOS (a.k.a Mac OS X), in order to properly display French accented letters in the program's UI when used in Word for Windows. The macOS version uses the old and obsolete Mac OS Roman encoding internally and will not display accented letters correctly when used under Word for Windows: it is a limitation of the VBA implementation in Word for macOS (all versions).
- The French captions now properly use non-breaking spaces when needed.
- The documentation has been completely revised.
- Removed
GreekTranscoderToolbar.dot: if you are using an older version of Word that still supports it, you can download it separately.
Version 1.0.7: 2016.09.20
- This version has been tested with Word 2011 & 2016 for macOS and with Word 2016 for Windows and is compatible with all three.
- Times New Roman (Unicode) is now a valid source and target font.
- Removed the warnings about using non-Unicode versions of Times and Helvetica as target fonts.
- The background color now used in the GreekTranscoder's user form is a bit lighter and better matches the most recent macOS UI.
- GreekTranscoder is released as uncompiled VBA code to avoid compatibility issues between different versions of Office and is compiled by Word at runtime.
Version 1.0.6: 2016.09.15
- Confirmed that Microsoft Word 2016's VBA implementation has the same bugs as the version that shipped with Microsoft Word 2011 and requires the same workaround.
- People willing to make a donation to support GreekTranscoder are now sent to the program's web site.
Version 1.0.5 (beta): 2010.09.29
- Modified the code to work around some of the bugs in Microsoft Word 2011's VBA implementation; however some limitations remain.
Version 1.0.4: 2005.07.20
- In the Unicode transcoder, the MATHEMATICAL FRAKTUR CAPITAL M (U+1D510) and MATHEMATICAL FRAKTUR CAPITAL P (U+1D513) characters were transposed: the error has been corrected.
- In message boxes, the program now displays icons appropriate to the context if available on the current platform.
- Better interrupt handling.
- Minor code optimizations.
Version 1.0.3: 2005.07.18
- The program now always reports the conversion progress accurately.
- When verifying and sorting composing characters' sequences, the program now properly switches fonts if needed.
- When switching fonts, the "Convert Selection Only" setting is now correctly taken into account.
- When replacing Greek characters, the program now makes sure that all the "AutoFormat" options are turned off, not just those affecting quotes.
- The program requires Word 2000 or later, not Word XP or later, as the included warning message's title mistakenly put it.
- The font previously identified as ALPHABETUM in the default font list is now properly called ALPHABETUM Unicode.
- The font Code2001 should not have been included in the font list: the font Code2000 now replaces it.
Version 1.0.2: 2005.07.15
- General code clean-up and optimization: the program is much smaller as a result, and should be faster as well.
- The program now systematically verifies and sorts composing characters' sequences for encodings that use them.
- Providing an encoding is susceptible of such composing characters' verifications, choosing both a source and a target font belonging to that encoding will run those checks.
- The program now produces pairs of surrogate UTF-16 code points to represent UTF-32 code points Word cannot insert directly rather than use other characters as substitute.
- Worked around a problem with Word sometimes losing track of the current selection and transcoding all the document instead.
- Sometimes the program would fail to color in red the characters it could not transcode: it is now fixed.
- When converting Beta Code texts which only use regular sigma letters, the program will now produce final sigma letters as needed.
- Increased the font box size in the GreekTranscoderToolbar.
Version 1.0.1: 2005.07.08
- The Vilnius University encoding is now supported.
- The routine which verifies the Unicode composing characters' sequences is now much more efficient.
- The default font list now includes Code2001, Gentium and GentiumAlt, and ALPHABETUM, plus all the Vilnius-University-encoding fonts listed in the Antioch documentation.
- The default font list no longer includes the so-called "Semata" fonts.
- The replacement order has been modified so that capital vowels with prosgegrammeni are now treated after the small letter iota with diacritics, but before the plain small letter iota.
- The transcoders have been updated and a few mistakes corrected.
- Improved the treatment of WinGreek quotation marks.
- Corrected an issue on Windows where, even if the minimal configuration was not met, the program would still load.
- On Windows, the program displays a smaller window and uses Arial 10pt instead of 12pt.
Version 1.0.0: 2005.06.27
- Initial release.
Word VBA Bugs and Quirks
This section documents Word VBA bugs and quirks discovered during GreekTranscoder development. These are provided as a reference for developers working with Word VBA, particularly on macOS.
- Find/Replace Behavior
- Document Format & XML
- Track Changes & Document State
- File System & Paths
- MacScript & AppleScript
- Compile-Time Directives
UserForm& UI Rendering (macOS)- Module Loading
Find/Replace Behavior
- FindText:="" Matches Paragraph Marks
- Word Find Normalizes Unicode Characters
- Wildcard Character Ranges Use Windows-1252 Ordering on Windows
- Ghost-Red Characters: Colored Structural Marks Become Unfindable
- Document's Final Paragraph Mark Is Immune to Find/Replace
- Format-Only Find/Replace Overflows Selection Boundary
^0nnnWildcard Notation Resolves Through Platform-Specific Encoding- Wildcard-Special Characters and VBA Escaping Quick Reference
-
FindText:=""Matches Paragraph Marks- Word's Find with
.Text = ""(format-only search) matches paragraph marks in addition to text characters. This causes two distinct failure modes:- Selection mode: when the selection contains paragraph marks, font-only searches fail or return incorrect results.
- Format-only detection: paragraph marks whose
pPr/rPrcarries the target formatting (e.g., font color set by a prior format-only replace) are matched even though those properties are invisible in Word's UI and unreachable by Word's own Find & Replace dialog. This causes false positives.
- The
^?special character and the equivalent?wildcard also match paragraph marks and cannot be used as alternatives. - Fix: use
.Text = "^$"(any single letter) for letter-only searches, or.MatchWildcards = Truewith explicit character class ranges (e.g.,[ChrW(32)-ChrW(255)]) for searches that must include non-letter characters such as NBSP or punctuation. Both approaches exclude control characters including the paragraph mark (CR = 13). "^$"was the original v1.0 method to detect thefindFont's presence in the document and has proven reliable for 20+ years.
- Word's Find with
-
Word Find Normalizes Unicode Characters
- Word's Find function treats certain Unicode characters as equivalent, even when they are distinct code points.
- This causes false positives when searching for specific Unicode variants.
- Example: GREEK BETA SYMBOL (ϐ: U+03D0) and GREEK SMALL LETTER BETA (β: U+03B2) are treated as the same character in normal searches.
- An impactful instance of this bug involves quotation marks:
ChrW(39)(APOSTROPHE) is treated as equivalent toChrW(8216)(LEFT SINGLE QUOTATION MARK) andChrW(8217)(RIGHT SINGLE QUOTATION MARK);ChrW(34)(QUOTATION MARK) is treated as equivalent toChrW(8220)(LEFT DOUBLE QUOTATION MARK) andChrW(8221)(RIGHT DOUBLE QUOTATION MARK). - This "smart quote folding" is silent and pervasive: a Find for
ChrW(39)will match all three single-quote code points, and a Find forChrW(34)will match all three double-quote code points. Replace operations using these characters in Word's "Find box" will consume the wrong code points. - In legacy Greek font encodings, the straight quote code points frequently serve as diacritics (e.g., SPIonic uses
ChrW(34)for COMBINING GREEK DIARESIS for "wide" vowels, BibleWorks usesChrW(39)for COMBINING GREEK PSILI AND VARIA), as do the curly code points (e.g., Lector usesChrW(8221)for COMBINING GREEK DASIA AND OXIA). AComposingCheckerentry normalizingChrW(39)silently corrupts allChrW(8216)andChrW(8217)instances in the document. - Workaround: use
.MatchWildcards = Trueto force exact character matching. In GreekTranscoder, affectedComposingCheckerentries are processed with a function that runs with.MatchWildcards:=True. This applies to BibleWorks, LaserGreek, SuperGreek, and SPIonic.
-
Wildcard Character Ranges Use Windows-1252 Ordering on Windows
- In
.MatchWildcards = Truemode, bracket expressions support ranges with hyphens (e.g.,[^0135-^0140]for "characters 135 through 140"). On macOS, Word evaluates the range endpoints by raw character code: 135 < 140, valid. On Windows, Word resolves^0nnncodes through Windows-1252 before comparing, mapping C1 control positions (128–159) to scattered Unicode code points. If the Windows-1252 mapping of the start character has a higher Unicode value than the end character, the range is backwards and Word raises Error #5590 ("The Find What text contains a range that is not valid"). - Example:
[^0135-^0140]— on Windows,^0135maps to U+2021 DOUBLE DAGGER (code point 8225) and^0140maps to U+0152 LATIN CAPITAL LIGATURE OE (code point 338). Since 8225 > 338, the range is invalid. - This affects only the five Windows-1252 "holes" at positions 129, 141, 143, 144, 157 (which have no defined mapping) and any range whose endpoints, after Windows-1252 resolution, are not in ascending Unicode order.
- The bug is silent on macOS and may go undetected for years if testing is limited to one platform.
- Workaround: replace hyphen ranges with explicit character enumeration (
[^0135^0136^0137^0138^0139^0140]). This avoids range interpretation entirely and works identically on both platforms.
- In
-
Ghost-Red Characters: Colored Structural Marks Become Unfindable
- A format-only replace (
findChar:="",replaceChar:=""with color formatting) colors structural characters (paragraph marks, line breaks, section breaks) and Unicode exotic spaces (U+2000–U+200A, U+202F, U+205F). - However, a subsequent Find operation with a color filter (e.g.,
Font.Color = wdColorRed) cannot find these characters, even though the Font dialog confirms they carry the color. A Find for the font name alone (without color filter) works. - The characters are "ghost colored": the formatting exists in the document XML (
pPr/rPr) but is invisible in Word's UI and unreachable by Find. - Workaround: use a font-only search (no color filter) with a wildcard character class to find and reset these characters. The
^&replacement text preserves the character while changing only the formatting.
- A format-only replace (
-
Document's Final Paragraph Mark Is Immune to Find/Replace
- The last paragraph mark in a Word document cannot be found or modified by any Find/Replace operation, even format-only replaces that work on all other paragraph marks.
- It can be colored by a blanket format-only replace (
findChar:=""), but once colored, it cannot be reset by any Find/Replace operation — not even the same kind of format-only replace targeting its font. - The
ActiveDocument.Content.Characters.LastRange object provides direct access to this character and allows reading and writing its font properties (.Font.Name,.Font.Color). This is the only reliable method. - The
Collapse wdCollapseEnd/MoveStart wdCharacter, -1approach does NOT land on the same Range asCharacters.Lastand fails to modify the mark.
-
Format-Only Find/Replace Overflows Selection Boundary
- In Selection mode, a format-only Find/Replace with
findChar:=""andreplaceChar:=""andWrap:=wdFindStopdoes not stop at the end ("Down") or at the beginning ("Up") of the selection: it continues past the selection boundary and processes the rest of the document downward or upward. - Workaround: before the empty-string replacement, perform a character-specific replacement on the first character of the selection (
Selection.Characters(1).Text), replacing it with itself in the target font. This "anchors" Word's Find engine to the selection boundary. The subsequent empty-string replacement then respects the end or the beginning of the selection as expected.
- In Selection mode, a format-only Find/Replace with
-
^0nnnWildcard Notation Resolves Through Platform-Specific Encoding- In
.MatchWildcards = Truemode, Word's^0nnnnotation (used in both Find and Replace boxes) does not refer to a Unicode code point. Instead, it resolves through the platform's native single-byte encoding: Windows-1252 on Windows, MacRoman on macOS. For ASCII-range code points (0–127), the two encodings agree. Above 127, they diverge: the same^0nnnvalue maps to different Unicode characters on each platform. - Example: NBSP is at byte position 202 in MacRoman but at byte position 160 in Windows-1252.
^0202produces NBSP on macOS butChrW(202)(LATIN SMALL LETTER E WITH CIRCUMFLEX) on Windows. Conversely,^0160produces NBSP on Windows butChrW(160)resolves differently through MacRoman on macOS. - This affects both the find pattern and the replace pattern. A wildcard rule written with
^0202for NBSP works on macOS but silently matches/inserts the wrong character on Windows. - The C1 control range (128–159) is particularly treacherous: Windows-1252 maps these 32 positions to scattered Unicode code points (typographical quotes, dashes, trademark symbols, etc.), while MacRoman maps them to a completely different set of characters. Five Windows-1252 positions (129, 141, 143, 144, 157) have no defined mapping at all. A
^0nnnvalue in this range is essentially undefined on one or both platforms. - Bracket ranges using hyphens (e.g.,
[^0135-^0140]) compound the problem: Word evaluates the range endpoints through the platform encoding. If the resolved code points are not in ascending order, Word raises Error #5590 ("The Find What text contains a range that is not valid"). A range that works on macOS may fail on Windows or vice versa (see bug #3 above). - Workaround —
ChrW()concatenation: For code points above 127, build the wildcard pattern string in VBA usingChrW()concatenation instead of^0nnn. Word receives the literal Unicode character and matches it exactly, with no platform-dependent resolution. Example: instead of writing the range"[^0185^178^179]", use"[" & ChrW(185) & ChrW(178) & ChrW(179) & "]". This is the only foolproof method for non-ASCII characters in wildcard patterns. - Note:
ChrW()concatenation works for ALL code points including ASCII, making it the universal safe choice. The only reason to use^0nnnat all is readability for simple ASCII characters in patterns. For anything above 127, always useChrW(). - Workaround —
^sfor NBSP: Word provides the shortcut^s(lowercase) which represents NBSP in both find and replace patterns, regardless of platform, whether.MatchWildcards = Trueor not. Unlike^0nnn,^sis a semantic shortcut that Word resolves to the correct character internally. For the specific case of NBSP,^sis simpler thanChrW()concatenation and equally reliable. GreekTranscoder uses^sin all wildcard patterns that reference NBSP. - Summary of safe practices for wildcard patterns:
Code point range Safe notation Unsafe notation 0–127 (ASCII) ^0nnn, literal, orChrW()All equivalent 128–159 (C1) ChrW()concatenation only^0nnn(platform-dependent)160 (NBSP) ^sorChrW(160)concat^0160(Mac),^0202(Win)161–255 ChrW()concatenation only^0nnn(platform-dependent)256+ ChrW()concatenation only^0nnnnot available
- In
-
Wildcard-Special Characters and VBA Escaping Quick Reference
- In
.MatchWildcards = Truemode, 14 ASCII characters have special meaning in Word's Find box and must be escaped with\when used as literals:?(any char),*(any string),[](range),{}(count),<>(word boundary),()(group),\(escape),@(1+ repetition). Two more are special only inside bracket ranges:!(negation) and-(range). The caret^is a special-sequence prefix (^p,^t,^0nnn,^s) in both wildcard and non-wildcard modes; literal caret is^^or^0094. - Characters passed via
ChrW(N)are equally affected: for example,ChrW(91)in a wildcard findChar is interpreted as a range opener, not a literal bracket. The escaped quoted form (e.g.,"\[") must be used instead. - Not special in wildcards:
|(pipe),/(slash),:(colon),;(semicolon). - The Replace box has fewer special characters.
^is always special (literal:"^^";ChrW(94)in replaceChar causes Error 5624).\is special only with wildcards (backreference prefix\1,\2; literal:"^0092";ChrW(92)is safe without wildcards). All other wildcard operators are safe in the Replace box. - In VBA string literals, only
"(ChrW(34)) requires special handling: use""(doubled) orChrW(34)concatenation. All other ASCII characters (32–127 except 34) are safe. Non-ASCII characters (128+) must always useChrW(N)in generated.basfiles to prevent cross-platform mojibake.
- In
Document Format & XML
-
XML 1.0 Control Characters Silently Stripped on
.docxSave- The
.docxformat stores document content as XML 1.0, which only permits three control characters below U+0020: TAB (U+0009), LINE FEED (U+000A), and CARRIAGE RETURN (U+000D). All other control characters in the C0 range (U+0000--U+0008, U+000B--U+000C, U+000E--U+001F) are invalid and Word silently discards them when saving. - Characters created via
ChrW()in VBA exist in Word's in-memory document model and participate normally in Find/Replace operations during the current session. However, they do not survive a save/reopen cycle: they are stripped from the XML on save with no warning or error. - This affects any encoding that maps glyphs to control character positions. In GreekTranscoder, three canonical WinGreek characters were affected:
ChrW(7)BELL (left guillemet),ChrW(28)FILE SEPARATOR (left single curly quote), andChrW(29)GROUP SEPARATOR (right single curly quote). In-session conversions appeared to work because the characters were present in memory, but reopening a saved intermediate.docxfile showed the characters had vanished. - This limitation is specific to the Office Open XML formats (
.docx,.docm,.dotx,.dotm). The legacy binary format (.doc) stores text as raw bytes and preserves all control characters. - Workaround: remap affected characters to XML-safe code points in the C1 range or above (see version 2.0.5 §1 for details). The legacy
.docbinary format is unaffected and preserves all control characters, which is why GreekTranscoder 2.0.5 now saves WinGreek working copies in.docformat.
- The
Track Changes & Document State
-
TrackRevisionsProperty Unreliable- In certain document states, reading
TrackRevisionsreturns False when TC is actually ON. - Setting
TrackRevisions = Falsemay silently fail. - Workaround: check
Revisions.Count > 0after conversion to detect corruption.
- In certain document states, reading
-
Selection.Font.NameFails Inside HTTP(S) Hyperlinks- Accessing
Selection.Font.Namewhen the cursor or selection is inside an HTTP(S) hyperlink causes Word to attempt URL resolution and generates an initialization error. mailto:and internal bookmark links are not affected.Selection.Hyperlinks.Countreturns 0 even when the cursor is inside a hyperlink (it only counts hyperlinks fully contained within the selection).- Workaround: new
IsSelectionInHyperlink()helper function duplicates the selection range, expands to word level, then checks for hyperlinks. If detected, font pre-fill is skipped and the Source Font dropdown is left empty.
- Accessing
File System & Paths
- Word Error 5155 on Locked Files
ActiveDocument.PathReturns FullName (Word 2011 for Mac)Environ("HOME")Returns Sandboxed Path on macOS- Full Disk Access Does Not Affect Word Sandbox
-
Word Error 5155 on Locked Files
- When saving a Finder-locked file, Word shows error 5155 followed by two
SaveAsdialogs. - VBA cannot intercept between dialogs; control returns only after both complete.
- Workaround: pre-flight
GetAttr()check before any conversion work.
- When saving a Finder-locked file, Word shows error 5155 followed by two
-
ActiveDocument.PathReturns FullName (Word 2011 for Mac)- In Word 2011 for Mac (version 14),
ActiveDocument.Pathreturns the full file path instead of the directory path. - Example: returns
/Users/john/Documents/MyDoc.docinstead of/Users/john/Documents. - This causes malformed paths when constructing save locations for the versioning system.
- Detection: if
ActiveDocument.Path = ActiveDocument.FullName, the bug is present. - Workaround: extract directory using
InStrRev()to find the last path separator.
- In Word 2011 for Mac (version 14),
-
Environ("HOME")Returns Sandboxed Path on macOS- Inside Word's sandbox on macOS,
Environ("HOME")returns the sandboxed home path, not the real user home. - Real HOME:
/Users/username - Sandboxed HOME:
/Users/username/Library/Containers/com.microsoft.Word/Data - Code that constructs paths by appending
/Library/Containers/com.microsoft.Word/Data/...toEnviron("HOME")creates doubled, invalid paths. - Workaround: use
Environ("HOME") & "/Library/Application Support/..."since the sandboxed HOME already points to the container's data directory.
- Inside Word's sandbox on macOS,
-
Full Disk Access Does Not Affect Word Sandbox
- macOS Full Disk Access (FDA) controls access to privacy-protected areas (Mail, Messages, Safari data, etc.). Word's App Sandbox is a separate permission system: VBA file operations are governed by the sandbox, not FDA.
- When Word needs folder access, it displays a "Grant File Access" dialog; FDA status is irrelevant.
MacScript & AppleScript
-
MacScript Error 5 With Non-Trivial AppleScript Expressions
- VBA's
MacScript()function in Word for Mac raises Error 5 ("Invalid procedure call or argument") when the AppleScript expression involves paths containing spaces, regardless of quoting method. do shell scriptcommands with single-quoted paths,quoted form ofvariables, and backslash-escaped spaces all fail identically when the path contains a space (e.g.,/Applications/GreekTranscoder 2.app). The same commands succeed with space-free paths (e.g.,/Applications/Safari.app).tell application "System Events"commands fail unconditionally (sandbox blocks inter-process communication), even with simple space-free targets.PlistBuddyas an alternative todefaults readalso fails with spaced paths.- Simple expressions (
MacScript("return ""ok"""),MacScript("do shell script ""echo ok""")) work reliably. - Workaround: for file reads, use VBA's native
Open/Line Inputstatements instead of shelling out viaMacScript. For launching applications,MacScript("do shell script ""open "" & quoted form of ""path""")works becauseopenis a simple single-argument command that does not require path quoting within AppleScript itself.
- VBA's
Compile-Time Directives
#If MacCompile-Time Directive Unreliable- Function Inside
#If MacBlock Causes Compile Error - Macros Invisible When Module's Final Code Section Is Inside
#If MacBlock msoLanguageIDUIConstant Prevents Module LoadingApplication.RunBreaksAutoExecWhen Called During STARTUP Loading
-
#If MacCompile-Time Directive Unreliable- VBA's
#If Macand#If Not Maccompile-time conditional compilation directives do not work reliably when a template is opened via File > Open. - When a template loads from the Startup folder (normal operation), the directives work correctly.
- When the same template is opened manually (File > Open or double-click), code from both
#If Macand#If Not Macbranches may execute. - This appears to be a bug in how Word evaluates compile-time constants for manually opened templates.
- Workaround: use runtime platform detection instead:
If Application.PathSeparator = "/" Then(macOS) orIf Application.PathSeparator = "\" Then(Windows).
- VBA's
-
Function Inside
#If MacBlock Causes Compile Error- When a function is defined inside an
#If Mac Thenblock but called from code outside that block, Windows VBA raises "Sub or Function not defined" at compile time. - This occurs because Windows VBA excludes the function definition during compilation, but still compiles the call site.
- Workaround: move cross-platform functions outside
#If Mac Thenblocks, using internal#If Mac Then/#Elsebranches for platform-specific implementation.
- When a function is defined inside an
-
Macros Invisible When Module's Final Code Section Is Inside
#If MacBlock- When a VBA module's final code section is entirely inside a large
#If Mac Then ... #End Ifblock with no functions (public or private) defined between the main code and that block, public macros defined in other modules of the same project may not appear in the Macros menu on Windows. - This occurs both when the template is loaded from the STARTUP folder as an add-in and when it is opened manually via File > Open.
- Root cause: unclear, but appears related to how Windows VBA initializes projects when a significant portion of a module is excluded by compile-time conditionals.
- Adding any function (even a trivial private function) outside the
#If Mac Thenblock causes the macros to appear normally. - Example: in v2.0.1 macOS-only, the Launcher module ended with
#End If, hiding the Engine'sGreekTranscodermacro on Windows. AddingGetLanguagePreference()outside the block in v2.0.2 resolved the issue.
- When a VBA module's final code section is entirely inside a large
-
msoLanguageIDUIConstant Prevents Module Loading- Using the
msoLanguageIDUIconstant (from the Microsoft Office Object Library) inside a#If Mac Thenblock can prevent the module from loading correctly when the template is loaded from the STARTUP folder. - Symptoms:
AutoExecdoes not fire, yet the same code works when the template is opened manually or when triggered via Ribbon buttons. - Root cause: the constant may not be resolved during early module initialization when Word loads add-ins from STARTUP.
- Workaround: use
Application.Languageinstead ofApplication.LanguageSettings.LanguageID(msoLanguageIDUI), or use the numeric value directly (msoLanguageIDUI = 2). - Example:
Select Case Application.LanguageSettings.LanguageID(msoLanguageIDUI)fails silently;lLangID = Application.Languagefollowed bySelect Case lLangIDworks reliably.
- Using the
-
Application.RunBreaksAutoExecWhen Called During STARTUP Loading- Calling
Application.Run "MacroName"duringAutoExecexecution (when templates are loading from STARTUP) can break theAutoExecsequence. - Symptoms:
AutoExecfires but subsequent code does not execute; the same code works when triggered manually or via Ribbon buttons. - This affects version conflict detection that uses
Application.Runto check for signature functions in other templates. - Workaround: use file-based detection instead of
Application.Runfor checks that must run duringAutoExec. - Example: instead of
Application.Run "PingUnified"to detect if the Unified template is loaded, checkDir(Application.StartupPath & "/GreekTranscoder 2.dotm") <> ""to see if it is installed.
- Calling
UserForm & UI Rendering (macOS)
- VBA
MsgBoxUnicode Rendering (macOS) - VBA
UserFormRendering (macOS) - Stub
UserForm.ShowDoes Not Raise Error - Macros Invisible Without Macro Command Directory on macOS
-
VBA
MsgBoxUnicode Rendering (macOS)ChrW(8984)⌘ andChrW(8997)⌥ are displayed as placeholders or underscores.- Workaround: use text equivalents ("Cmd", "Option").
-
VBA
UserFormRendering (macOS)- Word for Mac's VBA
UserFormimplementation has regular rendering issues: garbled text, disappearing controls, incorrect font display. - These issues are specific to macOS; the same forms render correctly on Windows.
- The Visual Basic Editor on macOS cannot edit
UserForms nor view them any longer. - GreekTranscoder 2's VBA
UserFormremains functional but may display visual artifacts on some macOS/Word version combinations.
- Word for Mac's VBA
-
Stub
UserForm.ShowDoes Not Raise Error- When a template includes a stub
UserForm(minimal.clsfile to prevent compile errors), calling.Showon that form does not raise a VBA error, even though the form is not displayed properly. - This prevents error-trapping approaches from detecting whether a functional form exists.
- Workaround: use alternative detection methods (e.g., checking for module-specific signatures like
PingmacOS) instead of trying to show the form and catching errors.
- When a template includes a stub
-
Macros Invisible Without Macro Command Directory on macOS
- Word for Mac populates the Macros dialog (Tools > Macro > Macros…) from a macro command directory (
<wne:mcds>) stored invbaData.xmlinside the.dotmarchive. - Word for Windows writes this directory only when the project contains a real
UserForm(with controls and event handlers). A minimal or emptyUserFormis not sufficient. - When the directory is absent, macros do not appear in the Macros dialog, though they execute correctly from the Ribbon or via
Application.Run. - Saving the
.dotmfrom Word for Mac always writes the directory, regardless of project structure. This is why re-saving a Windows-built.dotmfrom Word for Mac resolves the issue (and adds ~100–200 KB of platform-specific data, including per-module SRP p-code streams). - Once the application is launched from the Ribbon, Word for Mac rebuilds its internal state and macros appear for the rest of the session.
- Workaround: inject the
<wne:mcds>block intovbaData.xmlas a post-build step. - This is distinct from the
#If Mac Thenblock visibility bug (see "Compile-Time Directives" above), which affects both platforms and is resolved by code placement.
- Word for Mac populates the Macros dialog (Tools > Macro > Macros…) from a macro command directory (
Module Loading
-
Module Name Collision with Multiple Templates Loaded
- When two templates are loaded simultaneously (e.g., one from STARTUP, one opened manually) and both contain a module with the same name, VBA's module resolution becomes unpredictable.
- Example: calling
GreekTranscoder__Engine.PingmacOSwhen both macOS-only and Unified templates are loaded may resolve to the wrong module, causing "Method or data member not found" compile errors. - This is an edge case that occurs when a user has the macOS-only template in STARTUP and manually opens the Unified template (or vice versa).
- No workaround: users should only have one version of GreekTranscoder installed at a time.
Soutien au projet
Si vous trouvez cet outil utile, vous pouvez contribuer par un don au soutien du projet. Développer et tenir à jour des logiciels gratuits est une occupation coûteuse et votre aide est la bienvenue.
