source: lliurex-jclic-shared/trunk/fuentes/lliurex-jclic-shared.install-files/net/server-sync/share/jclic-aula/helper.py @ 4455

Last change on this file since 4455 was 4455, checked in by daduve, 4 years ago

adding support to html5

  • Property svn:executable set to *
File size: 7.9 KB
Line 
1#!/usr/bin/env python
2import zipfile
3import shutil
4import os
5import re
6import unicodedata
7from tempfile import mkstemp
8from os import remove, close
9import sys
10from time import sleep
11
12name_zip=str(sys.argv[1])
13#name_zip="/home/lliurex/mat_alh.jclic.zip"
14extract_dir="/net/server-sync/share/jclic-aula/jclic_uploads"
15dir_jclic_orig="/net/server-sync/share/jclic-aula/jclic_uploads/0rig_jclic"
16#extract_dir="/tmp/jclic-aula"
17index="index.html"
18jclic_js="http://server/jclic-aula/jclic.min.js"
19sufix=".lock"
20
21#sys.exit()
22
23def title_file(line):
24        try:
25                line = unicodedata.normalize('NFKD', unicode(line, 'utf8'))
26                line = line.encode('ascii', 'ignore')
27                line = line.decode("utf-8")
28                clean=re.compile('<.*?>')
29                title=re.sub(clean, '', line)
30                title=title.lstrip()
31                title=unicode(title.strip('\n'))
32                title=re.sub('\W+',' ', title )
33                print "Titulo: %s"%title
34                return [True, title]
35               
36        except Exception as e:
37                        return [False,str(e)]
38       
39#def title_file
40
41
42def remove_utf8(s):
43       
44        try:
45                char=""
46               
47                if type(s) == str:
48                        s=s.decode("utf-8")
49               
50                for c in unicodedata.normalize("NFD",s):
51                        c = c.encode('ascii', 'ignore')
52                        c=c.lower()
53                        c=c.decode()
54                        c=c.replace("-", "_")
55                       
56                        #if len(c) > 0 and unicodedata.category(c) not in ['Mn','Ps','Pc',"Pe","Z","C","S"] :
57                        if len(c) > 0 and unicodedata.category(c) in ["Ll","Nd"] or c==".":
58                                char+=c
59                               
60                        else:
61                                if len(c)>0:
62                                        char+="_"
63               
64                return char
65               
66        except Exception as e:
67                        print e
68                        return [False,str(e)]
69
70
71def media_line (linea):
72        try:
73                linea = unicodedata.normalize('NFKD', unicode(linea, 'utf8'))
74                linea = linea.encode('ascii', 'ignore')
75                linea = linea.decode("utf-8")
76                finded = re.search(r'(<media name=")([\s\S]*?)(")', linea)
77                ruta=finded.group(2)
78                head, tail = os.path.split(ruta)
79                ruta=remove_utf8(tail)
80                new_text = re.sub(r'(<media name=")([\s\S\d]*?)(")', r'\g<1>%s\3'%ruta, linea)
81                new_text2 = re.sub(r'(file=")([\s\S\d]*?)(")', r'\g<1>%s\3'%ruta, new_text)
82                return [True, new_text2]
83               
84        except Exception as e:
85                        print e
86                        return [False,str(e)]
87       
88#def media_line
89
90def image_line (linea):
91        try:
92                linea = unicodedata.normalize('NFKD', unicode(linea, 'utf8'))
93                linea = linea.encode('ascii', 'ignore')
94                linea = linea.decode("utf-8")
95                finded = re.search(r'(image=")([\s\S]*?)(")', linea)
96                ruta=finded.group(2)
97                head, tail = os.path.split(ruta)
98                ruta=remove_utf8(tail)
99                new_text = re.sub(r'(image=")([\s\S]*?)(")', r'\g<1>%s\3'%ruta, linea)
100                return [True, new_text]
101               
102        except Exception as e:
103                        return [False,str(e)]
104       
105#def media_line
106
107def sound_line (linea):
108        try:
109                linea = unicodedata.normalize('NFKD', unicode(linea, 'utf8'))
110                linea = linea.encode('ascii', 'ignore')
111                linea = linea.decode("utf-8")
112                finded = re.search(r'(file=")([\s\S]*?)(")', linea)
113                ruta=finded.group(2)
114                head, tail = os.path.split(ruta)
115                ruta=remove_utf8(tail)
116                new_text = re.sub(r'(file=")([\s\S]*?)(")', r'\g<1>%s\3'%ruta, linea)
117                return [True, new_text]
118               
119        except Exception as e:
120                        return [False,str(e)]
121       
122#def sound_line
123
124
125
126
127def index_write(extract_dira,indexa,title_in,jclic_js_path,name_jclic_used):
128        index_path=os.path.join(extract_dira, indexa)
129
130        html_str="""
131        <!DOCTYPE html>
132        <html>
133          <head>
134            <meta charset="UTF-8">
135            <title>%s</title>
136            <meta name="apple-mobile-web-app-capable" content="yes">
137            <meta name="mobile-web-app-capable" content="yes">
138            <meta name="application-name" content="%s">
139            <link rel="shortcut icon" href="favicon.ico">
140            <link rel="icon" sizes="16x16" href="favicon.ico">
141            <link rel="icon" sizes="72x72" href="icon-72.png">
142            <link rel="icon" sizes="192x192" href="icon-192.png">
143            <meta name="viewport" content="width=device-width, initial-scale=1.0">
144            <script type="text/javascript" src="%s"></script>
145          </head>
146          <body style="margin:0">
147            <div class ="JClic" data-project="%s"></div>
148          </body>
149        </html>
150        """%(title_in,title_in,jclic_js_path,name_jclic_used)
151
152        html_index=open(index_path, "w")
153        html_index.write(html_str)
154        html_index.close()
155        print "Created index.html in: %s"%index_path
156       
157# def index_write
158
159
160
161
162
163def index_create (jclic_file):
164        try:
165                tilte="No Exist edit index.html"
166                with open(jclic_file) as f:
167                        for line in f:
168                                #obtengo el titulo del index
169                                if "<title>" in line or "<Title>" in line:
170                                        title=title_file(line)[1]
171                return [True,title]
172               
173        except Exception as e:
174                        return [False,str(e)]
175                       
176#def index_create       
177
178
179
180
181
182def jclic_review (jclic_filer):
183       
184        try:
185                fh, jclic_tmp=mkstemp()
186                with open(jclic_tmp,'w') as new_file:
187                        with open(jclic_filer) as f:
188                                for line in f:                 
189                                        #Modifico las rutas de los ficheros...
190                                        if "<media name" in line:
191                                                line=media_line(line)[1]
192                                        if "image=" in line:
193                                                line=image_line(line)[1]
194                                        if "sound id=" in line:
195                                                line=sound_line(line)[1]
196                                        new_file.write(line)
197                close(fh)
198                remove(jclic_filer)
199                shutil.move(jclic_tmp, jclic_filer)
200                print "New jclic file created in: %s"%jclic_filer
201                return [True]
202               
203        except Exception as e:
204                        return [False,str(e)]
205
206
207
208def isNotEmpty(s):
209    return bool(s and s.strip())
210#def_isNotEmpty
211
212
213
214
215
216# ########################################################
217
218# ###################MAIN PROGRAM######################
219try:
220        if not os.path.exists(dir_jclic_orig):
221                os.makedirs(dir_jclic_orig)
222               
223        if not os.path.exists(dir_jclic_orig):
224                print
225                print "Your system cannot permit to www-data write in: %s"%extract_dir
226                print
227                sys.exit()
228
229
230        #Comprueba que el fichero que se le pasa existe y no es un fantasma
231        if not os.path.exists(name_zip):
232                print
233                print "File not find in: %s"%name_zip
234                print
235                sys.exit()
236
237        #Creo un lock y bloqueo la transformacion para que solo un usuario la haga, sino saldra sin hacer nada.
238        orig_name_file=os.path.basename(name_zip)
239        name_zip_lock=os.path.join(dir_jclic_orig,orig_name_file+sufix)
240        print name_zip_lock
241
242        if os.path.exists(name_zip_lock):
243                print
244                print "File %s is blocked because other user is transforming it, please wait"%name_zip
245                print
246                sys.exit()
247        else:
248                os.mknod(name_zip_lock)
249
250        #Inicializo unas variables
251
252        html5=False
253        orig_name_file=os.path.basename(name_zip)
254        dir_name=os.path.splitext(os.path.basename(name_zip))[0]
255        #orig_name_file
256
257
258        if dir_name.endswith(".jclic"):
259                dir_name=os.path.splitext(dir_name)[0] 
260        extract_dir=os.path.join(extract_dir, dir_name)
261       
262
263        print "-----------------------------------"
264        print "%s to HTML5"%name_zip
265        print "-----------------------------------"
266       
267        #Test directory to extract and directory to save older file
268        if not os.path.exists (extract_dir):
269                os.makedirs(extract_dir)
270
271        if not os.path.exists (dir_jclic_orig):
272                os.makedirs(dir_jclic_orig)
273                               
274        #Extraccion de los ficheros del jclic
275        with zipfile.ZipFile(name_zip,"r") as zip_file:
276                for member in zip_file.namelist():
277                        filename=os.path.basename(member)
278                        #Me aseguro que no es una linea en blanco
279                        if isNotEmpty(filename):
280                                #transformamos mayusculas y espacios en minusculas y raya baja
281                                filename=filename.replace(" ", "_").lower()
282                                if filename == "index.html":
283                                        html5=True
284                                filename=remove_utf8(filename)
285                                source=zip_file.open(member)
286                                target=file(os.path.join(extract_dir,filename), "wb")
287                                shutil.copyfileobj(source, target)
288
289
290        #Averiguamos el fichero del jclic
291        for file in os.listdir(extract_dir):
292                if file.endswith(".jclic"):
293                        name_jclic=file
294        print "name_jclic: %s"%name_jclic
295
296        extend_jclic=os.path.join(extract_dir, name_jclic)
297
298
299        #Creacion del index.html
300        if not html5:
301                index_write(extract_dir,index,index_create(extend_jclic)[1],jclic_js,name_jclic)
302
303
304
305        #Modificando el fichero jclic con nuevas rutas
306        jclic_review (extend_jclic)
307        os.chmod(extend_jclic,0775) 
308        #textito=os.path.dirname(name_zip)
309        #with open("/tmp/kkita.txt", "w") as text_file:
310        #       text_file.write("Path name_zip: %s" % textito)
311        #Movemos el fichero del jclic original
312        if "jclic_uploads" in os.path.dirname(name_zip):
313                print "Lo muevo"
314                new_name=dir_jclic_orig+"/"+orig_name_file
315                shutil.move(name_zip,new_name)
316
317               
318        os.remove(name_zip_lock)
319        #sleep(4)
320       
321        sys.exit()
322       
323except Exception as e:
324                print Exception
325                sys.exit()
326
327                               
328       
Note: See TracBrowser for help on using the repository browser.