17
17
import re , sys , re , getopt
18
18
from pathlib import Path
19
19
20
+
20
21
class UpdateLicenseCode (object ):
21
22
"""Add common elements -- current Site Header, Site Footer, and Head
22
23
statements -- to licence code HTML files."""
23
24
24
- placeholders = {\
25
- 'head' : ('<!-- Head Start - DO NOT DELETE -->' , '<!-- Head End - DO NOT DELETE -->' ), \
26
- 'header' : ('<!-- Site Header Start - DO NOT DELETE -->' , '<!-- Site Header End - DO NOT DELETE -->' ), \
27
- 'footer' : ('<!-- Site Footer Start - DO NOT DELETE -->' , '<!-- Site Footer End - DO NOT DELETE -->' ), \
28
- 'language-selector' : ('<!-- Language Selector Start - DO NOT DELETE -->' , '<!-- Language Selector End - DO NOT DELETE -->' ) \
25
+ placeholders = {
26
+ "head" : (
27
+ "<!-- Head Start - DO NOT DELETE -->" ,
28
+ "<!-- Head End - DO NOT DELETE -->" ,
29
+ ),
30
+ "header" : (
31
+ "<!-- Site Header Start - DO NOT DELETE -->" ,
32
+ "<!-- Site Header End - DO NOT DELETE -->" ,
33
+ ),
34
+ "footer" : (
35
+ "<!-- Site Footer Start - DO NOT DELETE -->" ,
36
+ "<!-- Site Footer End - DO NOT DELETE -->" ,
37
+ ),
38
+ "language-selector" : (
39
+ "<!-- Language Selector Start - DO NOT DELETE -->" ,
40
+ "<!-- Language Selector End - DO NOT DELETE -->" ,
41
+ ),
29
42
}
30
43
31
44
languages = {}
32
45
33
- iso_to_language = { \
34
- 'ar' : 'العربية' , 'de' : 'Deutsch' , 'en' : 'English' , 'fi' : 'suomeksi' , \
35
- 'fa' : 'پارسی' , \
36
- 'fr' : 'français' , 'hr' : 'hrvatski' , 'id' : 'bahasa Indonesia' , 'it' : 'italiano' , \
37
- 'ja' : '日本語' , 'mi' : 'Te Reo Māori' , 'nl' : 'Nederlands' , 'no' : 'norsk' , \
38
- 'pl' : 'polski' , 'sv' : 'svenska' , 'tr' : 'Türkçe' , 'uk' : 'українська' , \
39
- 'ru' : 'русский' , 'pt' : 'Português' , 'lt' : 'Lietuvių' , 'lv' : 'latviski' , \
40
- 'es' : 'Español' , 'ms' : 'Bahasa Malaysia' , 'ca' : 'Català' , 'da' : 'Dansk' , \
41
- 'eo' : 'Esperanto' , 'gl' : 'Galego' , 'hu' : 'Magyar' , 'ro' : 'română' , \
42
- 'sl' : 'Slovenščina' , 'is' : 'Íslenska' , 'cs' : 'čeština' , 'el' : 'Ελληνικά' , \
43
- 'be' : 'Беларуская' , 'bn' : 'বাংলা' , 'zh' : '中文' , 'ko' : '한국어' , \
44
- 'es_ES' : 'Castellano (España)' , 'eu' : 'euskara' , 'zh-Hans' : '中文' , \
46
+ iso_to_language = {
47
+ "ar" : "العربية" ,
48
+ "de" : "Deutsch" ,
49
+ "en" : "English" ,
50
+ "fi" : "suomeksi" ,
51
+ "fa" : "پارسی" ,
52
+ "fr" : "français" ,
53
+ "hr" : "hrvatski" ,
54
+ "id" : "bahasa Indonesia" ,
55
+ "it" : "italiano" ,
56
+ "ja" : "日本語" ,
57
+ "mi" : "Te Reo Māori" ,
58
+ "nl" : "Nederlands" ,
59
+ "no" : "norsk" ,
60
+ "pl" : "polski" ,
61
+ "sv" : "svenska" ,
62
+ "tr" : "Türkçe" ,
63
+ "uk" : "українська" ,
64
+ "ru" : "русский" ,
65
+ "pt" : "Português" ,
66
+ "lt" : "Lietuvių" ,
67
+ "lv" : "latviski" ,
68
+ "es" : "Español" ,
69
+ "ms" : "Bahasa Malaysia" ,
70
+ "ca" : "Català" ,
71
+ "da" : "Dansk" ,
72
+ "eo" : "Esperanto" ,
73
+ "gl" : "Galego" ,
74
+ "hu" : "Magyar" ,
75
+ "ro" : "română" ,
76
+ "sl" : "Slovenščina" ,
77
+ "is" : "Íslenska" ,
78
+ "cs" : "čeština" ,
79
+ "el" : "Ελληνικά" ,
80
+ "be" : "Беларуская" ,
81
+ "bn" : "বাংলা" ,
82
+ "zh" : "中文" ,
83
+ "ko" : "한국어" ,
84
+ "es_ES" : "Castellano (España)" ,
85
+ "eu" : "euskara" ,
86
+ "zh-Hans" : "中文" ,
45
87
}
46
88
47
- lang_sel_text = { \
48
- 'ar' : ' هذة الصفحة متوفرة باللغات التالية:' , \
49
- 'be' : ' Гэта старонка даступная на наступных мовах:' , \
50
- 'bn' : ' পৃষ্ঠাটি নিন্মোক্ত ভাষায় বিদ্যমান রয়েছে:' , \
51
- 'ca' : ' Aquesta pàgina està disponible en els idiomes següents:' , \
52
- 'cs' : ' Tato stránka je k dispozici v následujících jazycích:' , \
53
- 'da' : ' Denne side er tilgængelig på følgende sprog:' , \
54
- 'de' : ' Diese Seite ist in folgenden Sprachen verfügbar:' , \
55
- 'el' : ' Η σελίδα αυτή είναι διαθέσιμη στις ακόλουθες γλώσσες:' , \
56
- 'en' : ' This page is available in the following languages:' , \
57
- 'eo' : ' Ĉi tiu paĝo estas disponebla en la jenaj lingvoj:' , \
58
- 'es' : ' Esta página está disponible en los siguientes idiomas:' , \
59
- ' es_ES' : '' , \
60
- 'eu' : ' Orri hau hizkuntza hauetan ikus daiteke:' ,\
61
- 'fa' : ' این صفحه به زبان های زیر در دسترس است : ' , \
62
- 'fi' : ' Tämä sivu on saatavilla seuraavilla kielillä:' , \
63
- 'fr' : ' Cette page existe aussi dans les langues suivantes :' , \
64
- 'gl' : ' Esta páxina tamén está dispoñíbel nos idiomas seguintes:' , \
65
- 'hr' : ' Ova stranica je dostupna na sljedećim jezicima:' , \
66
- 'hu' : ' Ez az oldal az alábbi nyelveken érhető még el:' , \
67
- 'id' : ' Laman ini tersedia dalam bahasa berikut:' , \
68
- 'is' : ' Þessi síða er tiltæk á eftirfarandi tungumálum:' , \
69
- 'it' : ' Questa pagina è disponibile nelle seguenti lingue:' , \
70
- 'ja' : ' このページは以下の言語でもご覧になれます:' , \
71
- 'ko' : ' 이 페이지는 다음의 언어로 이용할 수 있습니다.' , \
72
- 'lt' : ' Šis puslapis yra prienamas šiomis kalbomis:' , \
73
- 'lv' : ' Šī lapa ir pieejama sekojošās valodās:' , \
74
- 'mi' : ' E wātea ana tēnei whārangi i ēnei reo:' , \
75
- 'ms' : ' Halaman ini boleh didapati dalam bahasa-bahasa berikut:' , \
76
- 'nl' : ' Deze pagina is beschikbaar in de volgende talen:' , \
77
- 'no' : ' Denne siden er tilgjengelig på følgende språk:' , \
78
- 'pl' : ' Strona jest dostępna w następujących językach:' , \
79
- 'pt' : ' Esta página está disponível nas seguintes línguas:' , \
80
- 'ro' : ' Această pagină este disponibilă în următoarele limbi:' , \
81
- 'ru' : ' Эта страница доступна на следующих языках:' , \
82
- 'sl' : ' Ta stran je dosegljiva v naslednjih jezikih:' , \
83
- 'sv' : ' Denna sida finns tillgänglig på följande språk:' , \
84
- 'tr' : ' Bu sayfa şu dillerde mevcuttur:' , \
85
- 'uk' : ' Ця сторінка доступна наступними мовами:' , \
86
- 'zh' : ' 声明:' , \
87
- ' zh-Hans' : ' 本网页有下述几种语言版本:' , \
89
+ lang_sel_text = {
90
+ "ar" : " هذة الصفحة متوفرة باللغات التالية:" ,
91
+ "be" : " Гэта старонка даступная на наступных мовах:" ,
92
+ "bn" : " পৃষ্ঠাটি নিন্মোক্ত ভাষায় বিদ্যমান রয়েছে:" ,
93
+ "ca" : " Aquesta pàgina està disponible en els idiomes següents:" ,
94
+ "cs" : " Tato stránka je k dispozici v následujících jazycích:" ,
95
+ "da" : " Denne side er tilgængelig på følgende sprog:" ,
96
+ "de" : " Diese Seite ist in folgenden Sprachen verfügbar:" ,
97
+ "el" : " Η σελίδα αυτή είναι διαθέσιμη στις ακόλουθες γλώσσες:" ,
98
+ "en" : " This page is available in the following languages:" ,
99
+ "eo" : " Ĉi tiu paĝo estas disponebla en la jenaj lingvoj:" ,
100
+ "es" : " Esta página está disponible en los siguientes idiomas:" ,
101
+ " es_ES" : "" ,
102
+ "eu" : " Orri hau hizkuntza hauetan ikus daiteke:" ,
103
+ "fa" : " این صفحه به زبان های زیر در دسترس است : " ,
104
+ "fi" : " Tämä sivu on saatavilla seuraavilla kielillä:" ,
105
+ "fr" : " Cette page existe aussi dans les langues suivantes :" ,
106
+ "gl" : " Esta páxina tamén está dispoñíbel nos idiomas seguintes:" ,
107
+ "hr" : " Ova stranica je dostupna na sljedećim jezicima:" ,
108
+ "hu" : " Ez az oldal az alábbi nyelveken érhető még el:" ,
109
+ "id" : " Laman ini tersedia dalam bahasa berikut:" ,
110
+ "is" : " Þessi síða er tiltæk á eftirfarandi tungumálum:" ,
111
+ "it" : " Questa pagina è disponibile nelle seguenti lingue:" ,
112
+ "ja" : " このページは以下の言語でもご覧になれます:" ,
113
+ "ko" : " 이 페이지는 다음의 언어로 이용할 수 있습니다." ,
114
+ "lt" : " Šis puslapis yra prienamas šiomis kalbomis:" ,
115
+ "lv" : " Šī lapa ir pieejama sekojošās valodās:" ,
116
+ "mi" : " E wātea ana tēnei whārangi i ēnei reo:" ,
117
+ "ms" : " Halaman ini boleh didapati dalam bahasa-bahasa berikut:" ,
118
+ "nl" : " Deze pagina is beschikbaar in de volgende talen:" ,
119
+ "no" : " Denne siden er tilgjengelig på følgende språk:" ,
120
+ "pl" : " Strona jest dostępna w następujących językach:" ,
121
+ "pt" : " Esta página está disponível nas seguintes línguas:" ,
122
+ "ro" : " Această pagină este disponibilă în următoarele limbi:" ,
123
+ "ru" : " Эта страница доступна на следующих языках:" ,
124
+ "sl" : " Ta stran je dosegljiva v naslednjih jezikih:" ,
125
+ "sv" : " Denna sida finns tillgänglig på följande språk:" ,
126
+ "tr" : " Bu sayfa şu dillerde mevcuttur:" ,
127
+ "uk" : " Ця сторінка доступна наступними мовами:" ,
128
+ "zh" : " 声明:" ,
129
+ " zh-Hans" : " 本网页有下述几种语言版本:" ,
88
130
}
89
131
90
132
def usage (self ):
91
- print ('' )
92
- print (' update_cc4_includes.py [-av]' )
93
- print (' -v: Verbose output' )
94
- print ('' )
95
- print (' e.g. update_cc4_includes.py' )
96
- print (' update_cc4_includes.py -v' )
97
-
98
- def log (self , message , type = ' standard' ):
99
- if (type == ' standard' ) or (type == ' verbose' and self .verbose ):
133
+ print ("" )
134
+ print (" update_cc4_includes.py [-av]" )
135
+ print (" -v: Verbose output" )
136
+ print ("" )
137
+ print (" e.g. update_cc4_includes.py" )
138
+ print (" update_cc4_includes.py -v" )
139
+
140
+ def log (self , message , type = " standard" ):
141
+ if (type == " standard" ) or (type == " verbose" and self .verbose ):
100
142
print (message )
101
143
102
144
def get_args (self ):
@@ -110,27 +152,26 @@ def get_args(self):
110
152
111
153
self .verbose = False
112
154
for option in opts :
113
- if '-v' in option :
155
+ if "-v" in option :
114
156
self .verbose = True
115
157
116
158
return True
117
159
118
-
119
160
def get_path (self ):
120
161
"""Where are the licenses?"""
121
162
self .path = False
122
163
path = Path .cwd ()
123
164
pathdir = path .name
124
- if pathdir == ' legalcode' :
165
+ if pathdir == " legalcode" :
125
166
self .path = path
126
- if pathdir == ' docroot' :
127
- self .path = path / ' legalcode'
128
- if pathdir == ' tools' :
129
- self .path = path .parent / ' docroot' / ' legalcode'
167
+ if pathdir == " docroot" :
168
+ self .path = path / " legalcode"
169
+ if pathdir == " tools" :
170
+ self .path = path .parent / " docroot" / " legalcode"
130
171
if not self .path :
131
- print (' Please run from within the checked-out project.' )
172
+ print (" Please run from within the checked-out project." )
132
173
if self .path :
133
- self .includes_path = Path (sys .path [0 ] + ' /legalcode-includes' )
174
+ self .includes_path = Path (sys .path [0 ] + " /legalcode-includes" )
134
175
return self .path != False
135
176
136
177
def process_files (self , filelist ):
@@ -141,19 +182,19 @@ def process_files(self, filelist):
141
182
def process_file (self , filepath ):
142
183
"""Verify the required placeholders exist and update file with common
143
184
elements"""
144
- self .log ("\n " + ' Processing: ' + filepath .name , ' verbose' )
145
- with filepath .open (encoding = ' utf-8' ) as infile :
185
+ self .log ("\n " + " Processing: " + filepath .name , " verbose" )
186
+ with filepath .open (encoding = " utf-8" ) as infile :
146
187
content = infile .read ()
147
-
188
+
148
189
if self .has_placeholders (content ):
149
- self .log (' Updating content: ' + filepath .name , ' verbose' )
190
+ self .log (" Updating content: " + filepath .name , " verbose" )
150
191
content = self .add_includes (content )
151
192
content = self .add_language_selector (content , filepath )
152
- with filepath .open ('w' , encoding = ' utf-8' ) as outfile :
193
+ with filepath .open ("w" , encoding = " utf-8" ) as outfile :
153
194
outfile .write (content )
154
195
else :
155
- self .log (' No placeholders, skipping: ' + filepath .name , ' standard' )
156
-
196
+ self .log (" No placeholders, skipping: " + filepath .name , " standard" )
197
+
157
198
return
158
199
159
200
def add_includes (self , content ):
@@ -162,78 +203,88 @@ def add_includes(self, content):
162
203
start , end = UpdateLicenseCode .placeholders [placeholder_pair ]
163
204
164
205
includefile = False
165
- if placeholder_pair == ' head' :
166
- includefile = self .includes_path / ' html-head.html'
167
- elif placeholder_pair == ' header' :
168
- includefile = self .includes_path / ' site-header.html'
169
- elif placeholder_pair == ' footer' :
170
- includefile = self .includes_path / ' site-footer.html'
206
+ if placeholder_pair == " head" :
207
+ includefile = self .includes_path / " html-head.html"
208
+ elif placeholder_pair == " header" :
209
+ includefile = self .includes_path / " site-header.html"
210
+ elif placeholder_pair == " footer" :
211
+ includefile = self .includes_path / " site-footer.html"
171
212
if not includefile :
172
213
continue
173
214
174
215
with includefile .open () as infile :
175
216
includetext = infile .read ()
176
217
177
218
replacement = start + "\n " + includetext + "\n " + end
178
- target_string = re .search (start + ' .*?' + end , content , re .DOTALL ).group ()
219
+ target_string = re .search (start + " .*?" + end , content , re .DOTALL ).group ()
179
220
content = content .replace (target_string , replacement , 1 )
180
-
221
+
181
222
return content
182
-
223
+
183
224
def add_language_selector (self , content , filepath ):
184
225
"""Build and insert a language selector dropdown list."""
185
226
# Get a list of all the other languages for this license type and store it so
186
227
# it can be reused.
187
228
license_data = self .parse_filename (filepath )
188
- if license_data ['type' ] not in self .languages :
189
- self .languages [license_data ['type' ]] = []
190
- glob_string = license_data ['type' ] + '_' + license_data ['version' ] + '*.html'
229
+ if license_data ["type" ] not in self .languages :
230
+ self .languages [license_data ["type" ]] = []
231
+ glob_string = (
232
+ license_data ["type" ] + "_" + license_data ["version" ] + "*.html"
233
+ )
191
234
language_file_list = [f for f in self .path .glob (glob_string )]
192
235
for filepath in language_file_list :
193
236
sibling_data = self .parse_filename (filepath )
194
- self .languages [license_data [' type' ]].append (sibling_data [' language' ])
195
- self .languages [license_data [' type' ]].sort ()
237
+ self .languages [license_data [" type" ]].append (sibling_data [" language" ])
238
+ self .languages [license_data [" type" ]].sort ()
196
239
197
- current_language = license_data [' language' ]
198
- sibling_languages = self .languages [license_data [' type' ]]
240
+ current_language = license_data [" language" ]
241
+ sibling_languages = self .languages [license_data [" type" ]]
199
242
200
- selector = '<div id="language-selector-block" class="container">'
243
+ selector = '<div id="language-selector-block" class="container">'
201
244
selector += ' <div class="language-selector-inner">'
202
245
selector += self .lang_sel_text [current_language ]
203
246
selector += ' <img class="language-icon" src="/images/language_icon_x2.png" alt="Languages" />'
204
- selector += ' <select>'
247
+ selector += " <select>"
205
248
for iso_code in sibling_languages :
206
249
# Set the selected option to the current language of the page
207
- selected = ''
250
+ selected = ""
208
251
if iso_code == current_language :
209
252
selected = ' selected="selected" '
210
253
# Determine to option value for the language. English breaks the pattern so handle it differently.
211
- option_value = ' legalcode.' + iso_code
212
- if iso_code == 'en' :
213
- option_value = ' legalcode'
254
+ option_value = " legalcode." + iso_code
255
+ if iso_code == "en" :
256
+ option_value = " legalcode"
214
257
# Add the selector vlaue
215
- selector += '<option value="' + option_value + '"' + selected + '>' + self .iso_to_language [iso_code ] + '</option>'
216
- selector += ' </select>'
217
- selector += ' </div>'
218
- selector += '</div>'
258
+ selector += (
259
+ '<option value="'
260
+ + option_value
261
+ + '"'
262
+ + selected
263
+ + ">"
264
+ + self .iso_to_language [iso_code ]
265
+ + "</option>"
266
+ )
267
+ selector += " </select>"
268
+ selector += " </div>"
269
+ selector += "</div>"
219
270
220
271
# Add the language selector block to the content
221
- start , end = UpdateLicenseCode .placeholders [' language-selector' ]
222
- target_string = re .search (start + ' .*?' + end , content , re .DOTALL ).group ()
272
+ start , end = UpdateLicenseCode .placeholders [" language-selector" ]
273
+ target_string = re .search (start + " .*?" + end , content , re .DOTALL ).group ()
223
274
replacement = start + "\n " + selector + "\n " + end
224
275
content = content .replace (target_string , replacement , 1 )
225
276
226
277
return content
227
278
228
279
def parse_filename (self , filepath ):
229
- license_info = filepath .name [0 :- 5 ].split ('_' );
280
+ license_info = filepath .name [0 :- 5 ].split ("_" )
230
281
type = license_info [0 ]
231
282
version = license_info [1 ]
232
283
if len (license_info ) > 2 :
233
284
language = license_info [2 ]
234
285
else :
235
- language = 'en'
236
- return {' type' : type , ' version' : version , ' language' : language }
286
+ language = "en"
287
+ return {" type" : type , " version" : version , " language" : language }
237
288
238
289
def has_placeholders (self , content ):
239
290
"""Verify all of the required placeholders exist in a file"""
@@ -246,9 +297,10 @@ def has_placeholders(self, content):
246
297
def main (self ):
247
298
"""Get the command line arguments, find the files, and process them"""
248
299
if self .get_args () and self .get_path ():
249
- file_list = [f for f in self .path .glob (' *4.0*.html' )]
300
+ file_list = [f for f in self .path .glob (" *4.0*.html" )]
250
301
self .process_files (file_list )
251
302
252
- if __name__ == '__main__' :
303
+
304
+ if __name__ == "__main__" :
253
305
updater = UpdateLicenseCode ()
254
306
updater .main ()
0 commit comments