Փոփոխությունից հետո օրացույցների մեջ ամիսների անունները բացակայում էին: Այն այցելուները, ովքեր ծանոթ չեն գերմաներենին, կարող են հետաքրքրվել նաև այն հարցով, թե ինչպես եմ օրացույցներում վերանորոգել ամիսների անունները: Հուսով եմ `մեքենայական թարգմանությունը և՛ զվարճալի է, և՛ հասկանալի: Այստեղ ես ցույց եմ տալիս սցենարների էական մասերը: Ամբողջական փաստաթղթավորված սցենարները շուտով հասանելի կլինեն օրացույցերի ծրագրաշարի նկարագրության մեջ, բայց միայն գերմաներեն:
DOCROOT/local/local.xml.LANG.
ֆայլերում լեզվից կախված տեքստերի նույնացուցիչները փոխվել են: Լեզվից կախված տեքստերը ներառում են ամսվա անունները: Այնուամենայնիվ, հին նույնացուցիչները դեռ առկա են հիմնական օրացույցի տվյալների DOCROOT/kal/b/YEAR/COUNTRY.xml.
և DOCROOT/kal/b/YEAR/a.xml.LANG.
: Դրանք պետք է փոխարինվեն նոր վկայականներով: Այս սխալի պատճառով օրացույցերում ամսվա անունները բացակայում են:
Դրա համար ես օգտագործում եմ Perl սցենար:
Հին նույնացուցիչներն օգտագործվում են տվյալների հիմնական յուրաքանչյուր ֆայլում: Ես այն կարդացի DOCROOT/kal/b/2020/de.xml.
- ից: Տեղապահները պարունակվում են ֆայլում ՝ <l:ph id="ID"/>
տեսքով: Ֆայլը պարունակում է օրացուցային տվյալները ոչ միայն ընթացիկ տարվա, այլ նաև նախորդ տարվա դեկտեմբերի և հաջորդ տարվա հունվար ամսվա համար: Յուրաքանչյուր ամսվա տվյալները սովորաբար մի քանի անգամ պարունակում են ամսվա անվան տեղապահ: Հետևյալ Perl կոդը կարդում է հին ID- ները:
my $oldids = []; my $fn = "DOCROOT/kal/b/2020/de.xml."; my $verb = 1; my $h; if (!open ($h, "<", $fn)) { print STDERR "Kann Datei \"$fn\" nicht öffnen\n"; return; } my $d; { local $INPUT_RECORD_SEPARATOR; $d = <$h>; close $h; } my $pid = ""; my $id = ""; while ( $d =~ /<l:ph id="([a-z0-9]+)"\/>/g ) { $id = $1; if ($id ne $pid) { push (@$oldids, $id); $pid = $id; } } if ($verb) { $pid = 0; for $id (@$oldids) { print "$pid $id\n"; ++$pid; } }
Ես կարդում եմ ID- ների համար նախատեսված տեքստերը DOCROOT/local/local.xml.de.
ֆայլից գերմանական տեքստերի հետ: Դրանք պարունակվում են <t id="ID">TEXT</t>
ձևի մեջ: Ես բոլոր տեքստերի համար ID- ները պահպանում եմ որպես $newids -> {"TEXT"} = "ID"
:
my $newids = {}; $fn = "DOCROOT/local/local.xml.de."; $h = undef; if (!open ($h, "<:encoding(utf-8)", $fn)) { print STDERR "Kann Datei \"$fn\" nicht öffnen\n"; return; } { local $INPUT_RECORD_SEPARATOR; $d = <$h>; close $h; } # <t id="cr">Januar</t> while ( $d =~ /<t id="([a-z0-9]+)">([^>]+)<\/t>/g ) { $newids -> {$2} = $1; } my $names = [ "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember", ], if ($verb) { my $nm; my $i = 0; for $nm (@$names) { ++$i; print "$i $nm ", $newids -> {$nm}, "\n"; } }
Այժմ ես նոր ID- ները վերագրում եմ հին ID- ներին `$idmap -> {"OLD_ID"} = "NEW_ID"}
տեսքով:
Հին նույնացուցիչների ցուցակի առաջին գրառումը նախորդ տարվա դեկտեմբերի ամսվա անվանման նույնացուցիչն է: Ես անտեսում եմ այս գրառումը: Listուցակի հաջորդ տասներկու գրառումները հունվարից դեկտեմբեր ամիսների անունների նույնացուցիչներն են: Հանձնարարությունը պարզ է.
my $idmap = {}; shift @$oldids; my $nm; while (@$names) { $nm = shift @$names; $id = shift @$oldids; $idmap -> {$id} = $newids -> {$nm}; }
Այժմ ես ստեղծում եմ մի գործառույթ, որը փոխարինում է հին ID- ները նոր ID- ների հետ օրացուցային տվյալների ֆայլում: Հերթական արտահայտությունը գտնում է <l:ph id="ID"/>
ձևի բոլոր տեղապահները: Հին ID
- ը կանոնավոր արտահայտության առաջին $1
համընկնող խումբն է: Օժանդակ ֆունկցիան տեղապահին մատակարարում է նոր ID ՝ <l:ph id="NEWID"/>
: Մնում է հին ID, որին նոր ID չի տրվել (այսինքն ՝ ամսվա անուն չկա):
my $subst = sub { $id = $idmap -> {$1} || $1; return "<l:ph id=\"$id\"/>"; };
Ֆայլը մշակելու գործառույթը տևում է երկու պարամետր. $in
մուտքային ֆայլի ֆայլի ուղին է հին ID- ներով, $out
ելքային ֆայլի ֆայլի ուղին է նոր ID- ներով:
my $proc_file = sub { my ($in, $out) = @_; print "$in -> $out\n" if $verb; $h = undef; if (!open ($h, "<:encoding(utf-8)", $in)) { print STDERR "Kann Datei \"$in\" nicht öffnen\n"; return; } { local $INPUT_RECORD_SEPARATOR; $d = <$h>; close $h; } $d =~ s/<l:ph id="([a-z0-9]+)"\/>/$subst -> ($idmap, $1)/ge ; $h = undef; if (!open ($h, ">:encoding(utf-8)", $out)) { print STDERR "Kann Ausgabedatei \"$out\" nicht öffnen\n"; return; } print $h $d; close $h; };
DOCROOT/kal/b/YEAR/COUNTRY.xml.
և DOCROOT/kal/b/YEAR/a.xml.LANG.
տվյալների բոլոր հիմնական ֆայլերը պետք է շտկվեն: Ուղղված ֆայլերի համար ես ընտրում եմ այլ ուղու նախածանց `DOCROOT/kal/b
- ի փոխարեն (DOCROOT/kal/bnew
. Ես կարդում եմ DOCROOT/kal/b
գրացուցակը և YEAR
ենթագրացուցակները և մշակում տվյալների հիմնական ֆայլերը.
use File::Spec::Functions qw(catdir catfile); use File::Path qw(make_path); my $indir = "DOCROOT/kal/b"; my $outdir = "DOCROOT/kal/bnew"; my ($dh, $sdh); my ($de, $sde); my $dp; my $od; opendir ($dh, $indir); while (defined ($de = readdir ($dh))) { next unless $de =~ /^20\d\d$/; $dp = catdir ($indir, $de); next unless -d $dp; $sdh = undef; opendir ($sdh, $dp) $od = catdir ($outdir, $de); make_path ($od); while (defined ($sde = readdir ($sdh))) { next unless $sde =~ /\.xml(?:\..+)?\.$/; $proc_file -> (catfile ($dp, $sde), catfile ($od, $sde)); } closedir $sdh; } closedir $dh;
Յուրաքանչյուր հիմնական տվյալների ֆայլին ավելացնում եմ gzip- սեղմված ֆայլ .gz
ածանցով: Դա անելու համար ես օգտագործում եմ bash գրություն.
#!/bin/bash b=$(realpath $0); b=${b%/src/*}; dir=$b/docroot/kal/bnew; for sd in $dir/*; do echo "subdir $sd"; f=${sd#$dir/}; [[ $f =~ ^20[0-9][0-9]$ ]] || continue; [[ -d $sd ]] || continue; for f in $sd/*xml*\. ; do echo $f; gzip --best --stdout $f > ${f}gz ; done; done;