def wiki_image(self, addr, alt, class_='wiki', lineno=0): addr = addr.strip() chunk = '' if hatta.parser.external_link(addr): return html.img(src=werkzeug.url_fix(addr), class_="external", alt=alt) if '#' in addr: addr, chunk = addr.split('#', 1) if addr == '': return html.a(name=chunk) elif addr.startswith(':'): if chunk: chunk = '#' + chunk alias = self._link_alias(addr[1:]) href = werkzeug.url_fix(alias + chunk) return html.img(src=href, class_="external alias", alt=alt) elif addr in self.wiki.storage: mime = page_mime(addr) if mime.startswith('image/'): return html.img(src=self.get_ref_path(addr), class_=class_, alt=alt) else: return html.img(href=self.get_ref_path(addr), alt=alt) else: return html.a(html(alt), href=self.get_ref_path(addr))
def convert_page(page_name, wiki, out_dir, file_prefix=None, files_in_one_dir=False, add_link_ext=None): converter = WikiConverter(wiki, file_prefix=file_prefix, files_in_one_dir=files_in_one_dir, add_link_ext=add_link_ext) # find & construct destination dir out_subpath = converter.out_subpath(page_name) out_path = os.path.join(out_dir, out_subpath) mkdir_p(os.path.dirname(out_path)) if converter.is_raw(page_name): # copy files straight through page_data = wiki.storage.page_data(page_name) with open(out_path, 'wb') as out_fp: out_fp.write(page_data) coarse_type = 'file' else: # render pages & copy in rendered output page_html = converter.render(page_name) with open(out_path + '.html', 'wb') as out_fp: out_fp.write(page_html.encode('utf8')) coarse_type = 'page' # log progress mime_type = page_mime(page_name) print('%s (%s): %s -> %s' % (coarse_type, mime_type, page_name, out_subpath))
def get_page(self, request, title): """Creates a page object based on page's mime type""" if title: try: page_class, mime = self.filename_map[title] except KeyError: mime = page.page_mime(title) major, minor = mime.split('/', 1) try: page_class = self.mime_map[mime] except KeyError: try: plus_pos = minor.find('+') if plus_pos > 0: minor_base = minor[plus_pos:] else: minor_base = '' base_mime = '/'.join([major, minor_base]) page_class = self.mime_map[base_mime] except KeyError: try: page_class = self.mime_map[major] except KeyError: page_class = self.mime_map[''] else: page_class = page.WikiPageSpecial mime = '' return page_class(self, request, title, mime)
def _title_to_file(self, title): title = unicode(title).strip() filename = werkzeug.url_quote(title, safe='') # Escape special windows filenames and dot files _windows_device_files = ('CON', 'AUX', 'COM1', 'COM2', 'COM3', 'COM4', 'LPT1', 'LPT2', 'LPT3', 'PRN', 'NUL') if (filename.split('.')[0].upper() in _windows_device_files or filename.startswith('_') or filename.startswith('.')): filename = '_' + filename if page.page_mime(title) == 'text/x-wiki' and self.extension: filename += self.extension return os.path.join(self.repo_prefix, filename)
def download(self, request, title): """Serve the raw content of a page directly from disk.""" mime = page.page_mime(title) if mime == 'text/x-wiki': mime = 'text/plain' try: wrap_file = werkzeug.wrap_file except AttributeError: wrap_file = lambda x, y: y f = wrap_file(request.environ, self.storage.open_page(title)) response = self.response(request, title, f, '/download', mime, size=-1) response.direct_passthrough = True return response
def _title_to_file(self, title): """ Modified escaping allowing (some) slashes and spaces. If the entry is a directory, use an index file. """ title = unicode(title).strip() escaped = werkzeug.url_quote(title, safe='/ ') escaped = self.periods_re.sub('%2E', escaped) escaped = self.slashes_re.sub('%2F', escaped) path = os.path.join(self.repo_prefix, escaped) if os.path.isdir(os.path.join(self.repo_path, path)): path = os.path.join(path, self.index) if page.page_mime(title) == 'text/x-wiki' and self.extension: path += self.extension return path
def _title_to_file(self, title): """ Modified escaping allowing (some) slashes and spaces. If the entry is a directory, use an index file. """ title = unicode(title).strip() escaped = werkzeug.url_quote(title, safe='/ ') escaped = self.periods_re.sub('%2E', escaped) escaped = self.slashes_re.sub('%2F', escaped) path = os.path.join(self.repo_prefix, escaped) if self._is_directory(path): path = os.path.join(path, self.index) if page.page_mime(title) == 'text/x-wiki' and self.extension: path += self.extension return path
def is_raw(self, title): return page_mime(title) != 'text/x-wiki'