def siteInfo(siteName): """ Display information about a site. """ import wiki tem = jinjaEnv.get_template("generic_10_2.html") dirPan = wiki.getDirPan(siteName, "") realPan = os.path.realpath(dirPan) realPanInfo = "" if realPan != dirPan: realPanInfo = form( "<p>Canonical path is <code>{realPan}" "</code> .</p>\n", realPan=realPan) #prvars("dirPan realPan realPanInfo") fns, dirs = butil.getFilesDirs(dirPan) if butil.fileExists(butil.join(dirPan, "home.md")): homePageInfo = form( "View <a href='/{siteName}/w/home'>" "<i class='fa fa-home'></i> home page</a>.", siteName=siteName) else: homePageInfo = form("""There is no home page. <a href='/{siteName}/wikiedit/home'> <i class='fa fa-plus'></i> Create one</a>.""", siteName=siteName) contents = """\ <h1>Information about site <i class='fa fa-bank'></i> {siteName}</h1> <p><b>{siteName}</b> is stored in directory <code>{siteRoot}</code> .</p> {realPanInfo} <p>There are {numPages} pages in the root folder, and {numSubDirs} sub-folders. <a href='/{siteName}/w/'><i class='fa fa-folder'></i> View root folder</a>. </p> <p>{homePageInfo}</p> """.format( siteName=siteName, siteRoot=dirPan, realPanInfo=realPanInfo, numPages=len(fns), numSubDirs=len(dirs), homePageInfo=homePageInfo, ) h = tem.render( siteName=siteName, title="Information about " + siteName, nav2=wiki.locationSitePath(siteName, ""), wikiText=contents, ) return h
def bsColumns(hs, numColumns, linSize='md'): """ Bootstrap multiple columns @param hs::[str] = each string contains html @param numColumns::int = number of columns. values are 2|3|4|6. @param linSize::str = linearize on size. Linearize means revert to a one-column setup when screen width gets below a certain size. Allowed values are: 'xs' = never linearize 'sm' = on <768 pixels 'md' = on <992 pixels 'lg' = on <1200 pixels @return::str containing html """ if numColumns not in (2, 3, 4, 6) or len(hs) < 2 * numColumns: h = ("""<div class='container-fluid'><div class='row'> <div class='col-md-12'> """ + "<br>\n".join(hs) + "</div></div></div>\n") return h columnClass = "col-{}-{}".format(linSize, 12 / numColumns) itemsPerRow = int(math.ceil(len(hs) * 1.0 / numColumns)) h = "<div class='container-fluid'><div class='row'>\n" for rowIx in range(numColumns): f = itemsPerRow * rowIx useHs = hs[f:f + itemsPerRow] h += form("""<div class='{columnClass}'> {elements} </div> """, columnClass=columnClass, elements="<br>\n".join(useHs)) #//for row h += "</div></div>\n" return h
def siteInfo(siteName): """ Display information about a site. """ import wiki tem = jinjaEnv.get_template("generic_10_2.html") dirPan = wiki.getDirPan(siteName, "") fns, dirs = butil.getFilesDirs(dirPan) if butil.fileExists(butil.join(dirPan, "home.md")): homePageInfo = form("View <a href='/{siteName}/w/home'>" "<i class='fa fa-home'></i> home page</a>.", siteName = siteName) else: homePageInfo = form("""There is no home page. <a href='/{siteName}/wikiedit/home'> <i class='fa fa-plus'></i> Create one</a>.""", siteName = siteName) contents = """\ <h1>Information about site <i class='fa fa-bank'></i> {siteName}</h1> <p><b>{siteName}</b> is stored in directory <code>{siteRoot}</code> .</p> <p>There are {numPages} pages in the root folder, and {numSubDirs} sub-folders. <a href='/{siteName}/w/'><i class='fa fa-folder'></i> View root folder</a>. </p> <p>{homePageInfo}</p> """.format( siteName = siteName, siteRoot = dirPan, numPages = len(fns), numSubDirs = len(dirs), homePageInfo = homePageInfo, ) h = tem.render( siteName = siteName, title = "Information about " + siteName, nav2 = wiki.locationSitePath(siteName, ""), wikiText = contents, ) return h
def getArticleBody(siteName, pathName): """ given an article name, return the body of the article. @return ::(str,str) =title,html """ articlePan = getArticlePan(siteName, pathName) #prvars() if butil.fileExists(articlePan): src = butil.readFileUtf8(articlePan) src = convertQuickLinks(src) contents = md(src) return pathName, contents else: h = form("<p>({pathName} does not exist; " "<a href='/{siteName}/wikiedit/{pathName}'>create it</a>)</p>\n", siteName = htmlEscape(siteName), pathName = htmlEscape(pathName)) return (pathName, h)
def getArticleBody(siteName, pathName): """ given an article name, return the body of the article. @return ::(str,str) =title,html """ articlePan = getArticlePan(siteName, pathName) #prvars() if butil.fileExists(articlePan): src = butil.readFileUtf8(articlePan) src = convertQuickLinks(src) contents = md(src) return pathName, contents else: h = form( "<p>({pathName} does not exist; " "<a href='/{siteName}/wikiedit/{pathName}'>create it</a>)</p>\n", siteName=htmlEscape(siteName), pathName=htmlEscape(pathName)) return (pathName, h)
def getCommitsTable(pathName, commits): """ @param commits::[git.Commit] @return::str containing html """ h = """<table class='report_table'> <tr> <th>Date</th> <th>Author</th> <th>Message</th> <th>Size</th> <th>Hex SHA</th> </tr> """ for co in commits: path = pathName + ".md" fileData = (co.tree / path).data_stream.read() prvars("fileData") h += form( """<tr> <td><tt>{date}</tt></td> <td>{author}</td> <td>{message}</td> <td>{size}</td> <td><tt>{hexsha}</tt></td> </tr>""", date=niceTime(co.authored_date), author=co.author.name, message=htmlEsc(co.message), size=len(fileData), hexsha=co.hexsha, ) #//for co h += "</table>\n" return h
def bsColumns(hs, numColumns, linSize='md'): """ Bootstrap multiple columns @param hs::[str] = each string contains html @param numColumns::int = number of columns. values are 2|3|4|6. @param linSize::str = linearize on size. Linearize means revert to a one-column setup when screen width gets below a certain size. Allowed values are: 'xs' = never linearize 'sm' = on <768 pixels 'md' = on <992 pixels 'lg' = on <1200 pixels @return::str containing html """ if numColumns not in (2,3,4,6) or len(hs)<2*numColumns: h = ("""<div class='container-fluid'><div class='row'> <div class='col-md-12'> """ + "<br>\n".join(hs) + "</div></div></div>\n") return h columnClass = "col-{}-{}".format(linSize, 12/numColumns) itemsPerRow = int(math.ceil(len(hs)*1.0 / numColumns)) h = "<div class='container-fluid'><div class='row'>\n" for rowIx in range(numColumns): f = itemsPerRow * rowIx useHs = hs[f:f+itemsPerRow] h += form("""<div class='{columnClass}'> {elements} </div> """, columnClass = columnClass, elements = "<br>\n".join(useHs)) #//for row h += "</div></div>\n" return h
def getIndex(siteName, pathName): """ get an index of a directory. @param siteName::str @param pathName::str @return::(str,str) =title,html """ def isArticle(fn): """ is a filename an article? """ return (fn[-3:]==".md" and not fn[:1]=="~") if pathName[-1:] == "/": uPath = pathName[:-1] else: uPath = pathName dirPan = getDirPan(siteName, uPath) #prvars() if not os.path.isdir(dirPan): h = "<p>Directory {} does not exist.</p>\n".format(pathName) return h fns, dirs = butil.getFilesDirs(dirPan) dirs = [d for d in dirs if d[:1] != "."] arts = sorted([fn[:-3] for fn in fns if isArticle(fn)]) nonArticles = sorted([fn for fn in fns if not isArticle(fn)]) dirs = sorted(dirs) h = ("<h1><i class='fa fa-list'></i> Index of articles in " " /{}</h1>\n").format(pathName) items = [] nonArticleItems = [] if arts: for fn in arts: text = getTitle(butil.join(dirPan, fn+".md")) if text==fn: text = "" else: text = " - " + text if fn=="home": item = form("<a href='{fn}'>" "<span class='home-icon'><i class='fa fa-home'></i></span>" " {fn}</a>{text}", fn = fn, text = text) else: item = form("<a href='{fn}'>" "<i class='fa fa-file-text-o'></i> {fn}</a>{text}", fn = fn, text = text) items.append(item) #//for h += bsColumns(items, 3) if nonArticles: for fn in nonArticles: nonArticleItems.append(form("<a href='{fn}'>" "<i class='fa fa-file-o'></i> " "{fn}</a>", fn = fn)) #//for h += "<h3>Other files</h3>\n" + bsColumns(nonArticleItems, 3) if dirs: dirItems = [] for d in dirs: dirItems.append(("<a href='{d}/'><i class='fa fa-folder'></i> " "{text}</a>").format( d = d, text = d, )) #//for h += "<h3>Folders</h3>\n" + bsColumns(dirItems, 3) title = "Index of {}".format(pathName) return title, h
def getIndex(siteName, pathName): """ get an index of a directory. @param siteName::str @param pathName::str @return::(str,str) =title,html """ def isArticle(fn): """ is a filename an article? """ return (fn[-3:] == ".md" and not fn[:1] == "~") if pathName[-1:] == "/": uPath = pathName[:-1] else: uPath = pathName dirPan = getDirPan(siteName, uPath) #prvars() if not os.path.isdir(dirPan): h = "<p>Directory {} does not exist.</p>\n".format(pathName) return h fns, dirs = butil.getFilesDirs(dirPan) dirs = [d for d in dirs if d[:1] != "."] arts = sorted([fn[:-3] for fn in fns if isArticle(fn)]) nonArticles = sorted([fn for fn in fns if not isArticle(fn)]) dirs = sorted(dirs) h = ("<h1><i class='fa fa-list'></i> Index of articles in " " /{}</h1>\n").format(pathName) items = [] nonArticleItems = [] if arts: for fn in arts: text = getTitle(butil.join(dirPan, fn + ".md")) if text == fn: text = "" else: text = " - " + text if fn == "home": item = form( "<a href='{fn}'>" "<span class='home-icon'><i class='fa fa-home'></i></span>" " {fn}</a>{text}", fn=fn, text=text) else: item = form( "<a href='{fn}'>" "<i class='fa fa-file-text-o'></i> {fn}</a>{text}", fn=fn, text=text) items.append(item) #//for h += bsColumns(items, 3) if nonArticles: for fn in nonArticles: hf = form( "<a href='{fn}'>" "<i class='fa fa-file-o'></i> " "{fn}</a>", fn=fn) if hasImageExtension(fn): hf += form( "<br>\n<a href='{fn}'>" "<img class='index_image' src='{fn}'>" "</a>", fn=fn) nonArticleItems.append(hf) #//for h += "<h3>Other files</h3>\n" + bsColumns(nonArticleItems, 3) if dirs: dirItems = [] for d in dirs: dirItems.append(("<a href='{d}/'><i class='fa fa-folder'></i> " "{text}</a>").format( d=d, text=d, )) #//for h += "<h3>Folders</h3>\n" + bsColumns(dirItems, 3) title = "Index of {}".format(pathName) return title, h