def export(self, package): """ Export web site Cleans up the previous packages pages and performs the export """ outputDir = self.filename if not outputDir.exists(): outputDir.mkdir() # Import the Website Page class. If the style has it's own page class # use that, else use the default one. if (self.stylesDir/"websitepage.py").exists(): global WebsitePage module = imp.load_source("websitepage", self.stylesDir/"websitepage.py") WebsitePage = module.WebsitePage self.pages = [ WebsitePage(self.prefix + "index", 1, package.root) ] self.generatePages(package.root, 1) uniquifyNames(self.pages) prevPage = None thisPage = self.pages[0] for nextPage in self.pages[1:]: thisPage.save(outputDir, prevPage, nextPage, self.pages) prevPage = thisPage thisPage = nextPage thisPage.save(outputDir, prevPage, None, self.pages) if self.prefix == "": self.copyFiles(package, outputDir)
def exportZip(self, package): """ Export web site Cleans up the previous packages pages and performs the export """ outputDir = TempDirPath() # Import the Website Page class. If the style has it's own page class # use that, else use the default one. if (self.stylesDir/"websitepage.py").exists(): global WebsitePage module = imp.load_source("websitepage", self.stylesDir/"websitepage.py") WebsitePage = module.WebsitePage self.pages = [ WebsitePage("index", 1, package.root) ] self.generatePages(package.root, 1) uniquifyNames(self.pages) prevPage = None thisPage = self.pages[0] for nextPage in self.pages[1:]: thisPage.save(outputDir, prevPage, nextPage, self.pages) prevPage = thisPage thisPage = nextPage thisPage.save(outputDir, prevPage, None, self.pages) self.copyFiles(package, outputDir) # Zip up the website package self.filename.safeSave(self.doZip, _('EXPORT FAILED!\nLast succesful export is %s.'), outputDir) # Clean up the temporary dir outputDir.rmtree()
def generateJQueryMobileTOC(self, rootNode, outputDir): tocFile = open(outputDir + "/exetoc.html", "w") tocTitle = _("Table of Contents") output = "<html><head>" #add the CSS from EXE output += """ <link rel="stylesheet" type="text/css" href="base.css" /> <link rel="stylesheet" type="text/css" href="content.css" /> <link rel="stylesheet" type="text/css" href="nav.css" /> """ #add the Javascript from EXE jsSettings = common.getJavaScriptStrings() output += """ <script type="text/javascript" src="exe_jquery.js"></script> %s <script type="text/javascript" src="common.js"></script> """ % jsSettings output += WebsitePage.make_tincan_js_elements() output += WebsitePage.makeUstadMobileHeadElement() #this has to come after ustadmobile.js scripts load output += """ <script type="text/javascript"> initTableOfContents(); </script> """ output += "</head>" output += "<body class=\"exe-web-site\" onload='_onLoadFunction();' " \ + "data-tincan-prefix=\"%s\" data-package-title=\"%s\">" \ % (WebsiteExport.current_xapi_prefix, common.escape_for_attrib(WebsiteExport.current_package_title)) output += WebsitePage.makeUstadMobileHeader(tocTitle, None, None) output += self.generateJQueryMobileTOCNode(rootNode, 0) output += WebsitePage.makeUstadMobileFooter() output += "</body></html>" tocFile.write(output) tocFile.close() return output
def generatePages(self, node, depth): """ Recursively generate pages and store in pages member variable for retrieving later """ for child in node.children: pageName = child.titleShort.lower().replace(" ", "_") pageName = re.sub(r"\W", "", pageName) if not pageName: pageName = "__" self.pages.append(WebsitePage(pageName, depth, child)) self.generatePages(child, depth + 1)
def generatePages(self, node, depth): """ Recursively generate pages and store in pages member variable for retrieving later """ for child in node.children: # assure lower pagename, without whitespaces or alphanumeric characters: pageName = child.titleShort.lower().replace(" ", "_") pageName = re.sub(r"\W", "", pageName) if not pageName: pageName = "__" self.pages.append(WebsitePage(self.prefix + pageName, depth, child)) self.generatePages(child, depth + 1)
def export(self, package): """ Export web site Cleans up the previous packages pages and performs the export """ if not self.report: outputDir = self.filename if not outputDir.exists(): outputDir.mkdir() # Import the Website Page class. If the style has it's own page class # use that, else use the default one. if (self.stylesDir / "websitepage.py").exists(): global WebsitePage module = imp.load_source("websitepage", self.stylesDir / "websitepage.py") WebsitePage = module.WebsitePage self.pages = [WebsitePage(self.prefix + "index", 0, package.root)] self.generatePages(package.root, 1) uniquifyNames(self.pages) prevPage = None thisPage = self.pages[0] if self.report: self.report = u'"%s","%s","%s","%s","%s","%s","%s","%s","%s","%s"\n' % ( 'File', 'Page Name', 'Level', 'Page File Name', 'Idevice Type', 'Idevice Title', 'Resource File Name', 'Resource User Name', 'Resource Path', 'Resource Checksum') self.appendPageReport(thisPage, package) for nextPage in self.pages[1:]: if self.report: self.appendPageReport(nextPage, package) else: thisPage.save(outputDir, prevPage, nextPage, self.pages) prevPage = thisPage thisPage = nextPage if not self.report: thisPage.save(outputDir, prevPage, None, self.pages) if self.prefix == "": self.copyFiles(package, outputDir) return outputDir else: self.filename.write_text(self.report, 'utf-8')
def render(self, ustadmobile_mode = False): """ Returns an XHTML string rendering this page. """ old_dT = common.getExportDocType() common.setExportDocType('HTML5') dT = common.getExportDocType() lb = "\n" # Line breaks sectionTag = "div" articleTag = "div" headerTag = "div" if dT == "HTML5": sectionTag = "section" articleTag = "article" headerTag = "header" html = common.docType() lenguaje = G.application.config.locale if self.node.package.lang != "": lenguaje = self.node.package.lang html += u"<html lang=\"" + lenguaje + "\" xml:lang=\"" + lenguaje + "\" xmlns=\"http://www.w3.org/1999/xhtml\">" + lb html += u"<head>" + lb html += u"<title>" if self.node.id == '0': if self.node.package.title != '': html += escape(self.node.package.title) else: html += escape(self.node.titleLong) else: if self.node.package.title != '': html += escape(self.node.titleLong) + " | " + escape(self.node.package.title) else: html += escape(self.node.titleLong) html += u" </title>" + lb html += u'<meta charset="utf-8" />' + lb if dT != "HTML5" and self.node.package.lang != "": html += '<meta http-equiv="content-language" content="' + lenguaje + '" />' + lb if self.node.package.author != "": html += '<meta name="author" content="' + escape(self.node.package.author, True) + '" />' + lb html += '<meta name="generator" content="eXeLearning ' + release + ' - exelearning.net" />' + lb if self.node.id == '0': if self.node.package.description != "": html += '<meta name="description" content="' + escape(self.node.package.description, True) + '" />' + lb html += u"<link rel=\"stylesheet\" type=\"text/css\" href=\"base.css\" />" + lb if common.hasWikipediaIdevice(self.node): html += u"<link rel=\"stylesheet\" type=\"text/css\" href=\"exe_wikipedia.css\" />" + lb if common.hasGalleryIdevice(self.node): html += u"<link rel=\"stylesheet\" type=\"text/css\" href=\"exe_lightbox.css\" />" + lb html += u"<link rel=\"stylesheet\" type=\"text/css\" href=\"content.css\" />" + lb if dT == "HTML5" or common.nodeHasMediaelement(self.node): html += u'<!--[if lt IE 9]><script type="text/javascript" src="exe_html5.js"></script><![endif]-->' + lb style = G.application.config.styleStore.getStyle(self.node.package.style) # jQuery if style.hasValidConfig: if style.get_jquery() == True: html += u'<script type="text/javascript" src="exe_jquery.js"></script>' + lb else: html += u'<script type="text/javascript" src="' + style.get_jquery() + '"></script>' + lb else: html += u'<script type="text/javascript" src="exe_jquery.js"></script>' + lb if common.hasGalleryIdevice(self.node): html += u'<script type="text/javascript" src="exe_lightbox.js"></script>' + lb html += common.getJavaScriptStrings() + lb html += u'<script type="text/javascript" src="common.js"></script>' + lb if common.hasMagnifier(self.node): html += u'<script type="text/javascript" src="mojomagnify.js"></script>' + lb # Some styles might have their own JavaScript files (see their config.xml file) if style.hasValidConfig: html += style.get_extra_head() # UstadMobile if ustadmobile_mode is True: html += WebsitePage.makeUstadMobileHeadElement() html += WebsitePage.make_tincan_js_elements() html += u"</head>" + lb html += u'<body class="exe-epub3"><script type="text/javascript">document.body.className+=" js"</script>' + lb html += u"<div id=\"outer\">" + lb html += u"<" + sectionTag + " id=\"main\">" + lb if ustadmobile_mode is True: html += "<div data-role=\"page\">" + lb html += u"<" + headerTag + " id=\"nodeDecoration\">" html += u'<h1 id=\"nodeTitle\">' html += escape(self.node.titleLong) html += u'</h1>' html += u"</" + headerTag + ">" + lb for idevice in self.node.idevices: if idevice.klass != 'NotaIdevice': e = " em_iDevice" if unicode(idevice.emphasis) == '0': e = "" html += u'<' + articleTag + ' class="iDevice_wrapper %s%s" id="id%s">%s' % (idevice.klass, e, idevice.id, lb) block = g_blockFactory.createBlock(None, idevice) if not block: log.critical("Unable to render iDevice.") raise Error("Unable to render iDevice.") if hasattr(idevice, "isQuiz"): html += htmlentitydecode(block.renderJavascriptForWeb()) if idevice.title != "Forum Discussion": html += htmlentitydecode(self.processInternalLinks( block.renderView(self.node.package.style), self.node.package)) html += u'</' + articleTag + '>' + lb # iDevice div if ustadmobile_mode is True: html += u"</div>" + lb #end JQM Page html += u"</" + sectionTag + ">" + lb # /#main html += self.renderLicense() html += unicode(BeautifulSoup(self.renderFooter(), convertEntities=BeautifulSoup.XHTML_ENTITIES)) html += u"</div>" + lb # /#outer if style.hasValidConfig: html += style.get_extra_body() html += u'</body></html>' html = html.encode('utf8') # JR: Eliminamos los atributos de las ecuaciones aux = re.compile("exe_math_latex=\"[^\"]*\"") html = aux.sub("", html) aux = re.compile("exe_math_size=\"[^\"]*\"") html = aux.sub("", html) # JR: Cambio el & en los enlaces del glosario html = html.replace("&concept", "&concept") # Remove "resources/" from data="resources/ and the url param html = html.replace("video/quicktime\" data=\"resources/", "video/quicktime\" data=\"") html = html.replace("application/x-mplayer2\" data=\"resources/", "application/x-mplayer2\" data=\"") html = html.replace("audio/x-pn-realaudio-plugin\" data=\"resources/", "audio/x-pn-realaudio-plugin\" data=\"") html = html.replace("<param name=\"url\" value=\"resources/", "<param name=\"url\" value=\"") common.setExportDocType(old_dT) return html