FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
python-docs-de/fix_roles.py at 3.15 · python/python-docs-de · GitHub
python
/
python-docs-de
Public
Notifications
You must be signed in to change notification settings
Fork
1
Star
1
Code
Issues
0
Pull requests
0
Actions
Security and quality
0
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Security and quality
Insights
Expand file tree
Breadcrumbs
python-docs-de
/
fix_roles.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
157 lines (122 loc) · 5.55 KB
Breadcrumbs
python-docs-de
/
fix_roles.py
Copy path
File metadata and controls
157 lines (122 loc) · 5.55 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/usr/bin/env python3
"""Ergaenzt fehlende Sprungziele in uebersetzten Sphinx-Rollen.
Hintergrund: Wer im Transifex-Editor uebersetzt, sieht nur den gerenderten
Text. Aus ":term:`bytecode`" wird dann ":term:`Bytecode`" -- der Verweis
zeigt ins Leere, weil das Glossar den englischen Begriff fuehrt. Richtig
waere ":term:`Bytecode <bytecode>`".
Dieses Skript holt das englische Ziel aus dem msgid und setzt es im msgstr
ein. Es aendert nur Faelle, in denen die Zuordnung eindeutig ist: genau eine
Rolle dieses Typs im msgid und genau eine im msgstr. Alles andere bleibt
unberuehrt und wird gemeldet.
Aufruf:
python fix_roles.py reference/datamodel.po reference/expressions.po
python fix_roles.py --dry-run reference/*.po
python fix_roles.py --rollen term,ref reference/datamodel.po
Danach immer powrap ueber die geaenderten Dateien laufen lassen -- das
Skript schreibt msgstr einzeilig zurueck.
"""
import
argparse
import
re
import
sys
from
pathlib
import
Path
# Rollen, bei denen ein uebersetzter Anzeigetext zulaessig ist, sofern das
# Ziel in spitzen Klammern mitgegeben wird.
STANDARD_ROLLEN
=
[
"term"
,
"ref"
]
# Ein Eintrag: msgid-Block gefolgt von msgstr-Block, beide ein- oder
# mehrzeilig. Vorangehende #-Kommentare bleiben unangetastet.
EINTRAG
=
re
.
compile
(
r'(?m)^msgid ((?:".*"\n)+)msgstr ((?:".*"\n)+)'
)
# Eine Rolle: :typ:`Text` oder :typ:`Text <ziel>`
ROLLE
=
re
.
compile
(
r':([a-z:+-]+):`([^`]*)`'
)
def
zusammenfuegen
(
block
:
str
)
->
str
:
"""PO-Mehrzeiler zu einer Zeichenkette verbinden (ohne Anfuehrungszeichen)."""
return
""
.
join
(
re
.
findall
(
r'"(.*)"'
,
block
))
def
als_msgstr
(
text
:
str
)
->
str
:
"""Zeichenkette als einzeiligen msgstr-Block ausgeben."""
return
f'msgstr "
{
text
}
"
\n
'
def
ziel_von
(
inhalt
:
str
)
->
str
:
"""Das Sprungziel einer Rolle: der Teil in <...>, sonst der Text selbst."""
m
=
re
.
search
(
r'<([^<>]*)>\s*$'
,
inhalt
)
return
m
.
group
(
1
)
if
m
else
inhalt
.
strip
()
def
hat_ziel
(
inhalt
:
str
)
->
bool
:
return
re
.
search
(
r'<[^<>]*>\s*$'
,
inhalt
)
is
not
None
def
rollen_nach_typ
(
text
:
str
,
typ
:
str
)
->
list
:
return
[
m
for
m
in
ROLLE
.
finditer
(
text
)
if
m
.
group
(
1
)
==
typ
]
def
datei_bearbeiten
(
pfad
:
Path
,
rollen
:
list
,
probelauf
:
bool
)
->
tuple
:
text
=
pfad
.
read_text
(
encoding
=
"utf-8"
)
geaendert
=
[]
uebersprungen
=
[]
def
ersetze
(
treffer
):
quelle
=
zusammenfuegen
(
treffer
.
group
(
1
))
ziel_text
=
zusammenfuegen
(
treffer
.
group
(
2
))
if
not
quelle
or
not
ziel_text
:
return
treffer
.
group
(
0
)
neu
=
ziel_text
for
typ
in
rollen
:
q
=
rollen_nach_typ
(
quelle
,
typ
)
z
=
rollen_nach_typ
(
neu
,
typ
)
if
not
z
:
continue
offen
=
[
m
for
m
in
z
if
not
hat_ziel
(
m
.
group
(
2
))]
if
not
offen
:
continue
if
len
(
q
)
!=
1
or
len
(
z
)
!=
1
:
uebersprungen
.
append
(
(
quelle
[:
60
],
typ
,
f"
{
len
(
q
)
}
im msgid,
{
len
(
z
)
}
im msgstr"
)
)
continue
anzeige
=
offen
[
0
].
group
(
2
).
strip
()
sprungziel
=
ziel_von
(
q
[
0
].
group
(
2
))
if
anzeige
==
sprungziel
:
continue
# unuebersetzt, loest korrekt auf
if
not
anzeige
:
uebersprungen
.
append
(
(
quelle
[:
60
],
typ
,
"Anzeigetext ist leer -- von Hand pruefen"
)
)
continue
if
anzeige
.
startswith
(
"-"
)
or
anzeige
.
endswith
(
"-"
):
uebersprungen
.
append
(
(
quelle
[:
60
],
typ
,
f"Anzeigetext '
{
anzeige
}
' faengt mit Bindestrich an oder hoert damit auf"
)
)
continue
alt
=
offen
[
0
].
group
(
0
)
ersatz
=
f":
{
typ
}
:`
{
anzeige
}
<
{
sprungziel
}
>`"
neu
=
neu
.
replace
(
alt
,
ersatz
,
1
)
geaendert
.
append
((
typ
,
anzeige
,
sprungziel
))
if
neu
==
ziel_text
:
return
treffer
.
group
(
0
)
return
"msgid "
+
treffer
.
group
(
1
)
+
als_msgstr
(
neu
)
neuer_text
=
EINTRAG
.
sub
(
ersetze
,
text
)
if
geaendert
and
not
probelauf
:
pfad
.
write_text
(
neuer_text
,
encoding
=
"utf-8"
)
return
geaendert
,
uebersprungen
def
main
():
p
=
argparse
.
ArgumentParser
(
description
=
__doc__
,
formatter_class
=
argparse
.
RawDescriptionHelpFormatter
)
p
.
add_argument
(
"dateien"
,
nargs
=
"+"
,
type
=
Path
,
help
=
"zu pruefende .po-Dateien"
)
p
.
add_argument
(
"--dry-run"
,
action
=
"store_true"
,
help
=
"nur anzeigen, nichts schreiben"
)
p
.
add_argument
(
"--rollen"
,
default
=
","
.
join
(
STANDARD_ROLLEN
),
help
=
f"Rollentypen, Komma-getrennt (Vorgabe:
{
','
.
join
(
STANDARD_ROLLEN
)
}
)"
)
args
=
p
.
parse_args
()
rollen
=
[
r
.
strip
()
for
r
in
args
.
rollen
.
split
(
","
)
if
r
.
strip
()]
summe
=
0
for
pfad
in
args
.
dateien
:
if
not
pfad
.
is_file
():
print
(
f"!! nicht gefunden:
{
pfad
}
"
,
file
=
sys
.
stderr
)
continue
geaendert
,
uebersprungen
=
datei_bearbeiten
(
pfad
,
rollen
,
args
.
dry_run
)
if
not
geaendert
and
not
uebersprungen
:
continue
print
(
f"
\n
{
pfad
}
"
)
for
typ
,
anzeige
,
sprungziel
in
geaendert
:
print
(
f" :
{
typ
}
:`
{
anzeige
}
` -> :
{
typ
}
:`
{
anzeige
}
<
{
sprungziel
}
>`"
)
for
quelle
,
typ
,
grund
in
uebersprungen
:
print
(
f" ubersprungen (
{
typ
}
,
{
grund
}
):
{
quelle
}
..."
)
summe
+=
len
(
geaendert
)
modus
=
"waeren zu aendern"
if
args
.
dry_run
else
"geaendert"
print
(
f"
\n
{
summe
}
Rollen
{
modus
}
."
)
if
summe
and
not
args
.
dry_run
:
print
(
"Jetzt powrap ueber die geaenderten Dateien laufen lassen."
)
if
__name__
==
"__main__"
:
main
()
Back
|
FazBrowse Home
|
New Git URL