1717import re , sys , re , getopt
1818from pathlib import Path
1919
20+
2021class UpdateLicenseCode (object ):
2122 """Add common elements -- current Site Header, Site Footer, and Head
2223 statements -- to licence code HTML files."""
2324
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+ ),
2942 }
3043
3144 languages = {}
3245
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" : "中文" ,
4587 }
4688
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" : " 本网页有下述几种语言版本:" ,
88130 }
89131
90132 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 ):
100142 print (message )
101143
102144 def get_args (self ):
@@ -110,27 +152,26 @@ def get_args(self):
110152
111153 self .verbose = False
112154 for option in opts :
113- if '-v' in option :
155+ if "-v" in option :
114156 self .verbose = True
115157
116158 return True
117159
118-
119160 def get_path (self ):
120161 """Where are the licenses?"""
121162 self .path = False
122163 path = Path .cwd ()
123164 pathdir = path .name
124- if pathdir == ' legalcode' :
165+ if pathdir == " legalcode" :
125166 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"
130171 if not self .path :
131- print (' Please run from within the checked-out project.' )
172+ print (" Please run from within the checked-out project." )
132173 if self .path :
133- self .includes_path = Path (sys .path [0 ] + ' /legalcode-includes' )
174+ self .includes_path = Path (sys .path [0 ] + " /legalcode-includes" )
134175 return self .path != False
135176
136177 def process_files (self , filelist ):
@@ -141,19 +182,19 @@ def process_files(self, filelist):
141182 def process_file (self , filepath ):
142183 """Verify the required placeholders exist and update file with common
143184 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 :
146187 content = infile .read ()
147-
188+
148189 if self .has_placeholders (content ):
149- self .log (' Updating content: ' + filepath .name , ' verbose' )
190+ self .log (" Updating content: " + filepath .name , " verbose" )
150191 content = self .add_includes (content )
151192 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 :
153194 outfile .write (content )
154195 else :
155- self .log (' No placeholders, skipping: ' + filepath .name , ' standard' )
156-
196+ self .log (" No placeholders, skipping: " + filepath .name , " standard" )
197+
157198 return
158199
159200 def add_includes (self , content ):
@@ -162,78 +203,88 @@ def add_includes(self, content):
162203 start , end = UpdateLicenseCode .placeholders [placeholder_pair ]
163204
164205 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"
171212 if not includefile :
172213 continue
173214
174215 with includefile .open () as infile :
175216 includetext = infile .read ()
176217
177218 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 ()
179220 content = content .replace (target_string , replacement , 1 )
180-
221+
181222 return content
182-
223+
183224 def add_language_selector (self , content , filepath ):
184225 """Build and insert a language selector dropdown list."""
185226 # Get a list of all the other languages for this license type and store it so
186227 # it can be reused.
187228 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+ )
191234 language_file_list = [f for f in self .path .glob (glob_string )]
192235 for filepath in language_file_list :
193236 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 ()
196239
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" ]]
199242
200- selector = '<div id="language-selector-block" class="container">'
243+ selector = '<div id="language-selector-block" class="container">'
201244 selector += ' <div class="language-selector-inner">'
202245 selector += self .lang_sel_text [current_language ]
203246 selector += ' <img class="language-icon" src="/images/language_icon_x2.png" alt="Languages" />'
204- selector += ' <select>'
247+ selector += " <select>"
205248 for iso_code in sibling_languages :
206249 # Set the selected option to the current language of the page
207- selected = ''
250+ selected = ""
208251 if iso_code == current_language :
209252 selected = ' selected="selected" '
210253 # 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"
214257 # 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>"
219270
220271 # 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 ()
223274 replacement = start + "\n " + selector + "\n " + end
224275 content = content .replace (target_string , replacement , 1 )
225276
226277 return content
227278
228279 def parse_filename (self , filepath ):
229- license_info = filepath .name [0 :- 5 ].split ('_' );
280+ license_info = filepath .name [0 :- 5 ].split ("_" )
230281 type = license_info [0 ]
231282 version = license_info [1 ]
232283 if len (license_info ) > 2 :
233284 language = license_info [2 ]
234285 else :
235- language = 'en'
236- return {' type' : type , ' version' : version , ' language' : language }
286+ language = "en"
287+ return {" type" : type , " version" : version , " language" : language }
237288
238289 def has_placeholders (self , content ):
239290 """Verify all of the required placeholders exist in a file"""
@@ -246,9 +297,10 @@ def has_placeholders(self, content):
246297 def main (self ):
247298 """Get the command line arguments, find the files, and process them"""
248299 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" )]
250301 self .process_files (file_list )
251302
252- if __name__ == '__main__' :
303+
304+ if __name__ == "__main__" :
253305 updater = UpdateLicenseCode ()
254306 updater .main ()
0 commit comments