def _tiddler_div(self, tiddler): """ The string that starts the div that contains a tiddler. """ return u""" <div class="tiddler" title="%s" server.page.revision="%s" modifier="%s" creator="%s" modified="%s" created="%s" tags="%s" %s> """ % (escape_attribute_value(tiddler.title), tiddler.revision, escape_attribute_value(tiddler.modifier), escape_attribute_value(tiddler.creator), tiddler.modified, tiddler.created, escape_attribute_value(self.tags_as( tiddler.tags)), self._tiddler_fields(tiddler.fields))
def _tiddler_div(self, tiddler): """ The string that starts the div that contains a tiddler. """ return u'<div class="tiddler" title="%s" server.page.revision="%s" ' \ 'modifier="%s" creator="%s" modified="%s" created="%s" tags="%s" %s>' % \ (escape_attribute_value(tiddler.title), tiddler.revision, escape_attribute_value(tiddler.modifier), escape_attribute_value(tiddler.creator), tiddler.modified, tiddler.created, escape_attribute_value(self.tags_as(tiddler.tags)), self._tiddler_fields(tiddler.fields))
def tiddler_as(self, tiddler): """ Send out the bare minimum required to make webtwik know there is a tiddler. """ # branch away if we are going to use the render system if self.environ['tiddlyweb.config'].get('twikified.render', True): return self._render(tiddler) common_container = self.environ.get('tiddlyweb.config', {}).get('twikified.container', '/bags/common/tiddlers/') scripts = """ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" type="text/javascript"></script> <script> $.ajaxSetup({ beforeSend: function(xhr) { xhr.setRequestHeader("X-ControlView", "false"); } }); </script> <script src="%(container)stwikifier" type="text/javascript"></script> <script src="%(container)stwik" type="text/javascript"></script> <script src="%(container)swebtwik" type="text/javascript"></script> """ % { 'container': common_container } tiddler_div = ( '<div class="tiddler" title="%s" %s><pre>%s</pre></div>' % (escape_attribute_value(tiddler.title), self._tiddler_provenance(tiddler), self._text(tiddler))) self.environ['tiddlyweb.title'] = tiddler.title return tiddler_div + scripts
def tiddler_as(self, tiddler): """ Send out the bare minimum required to make webtwik know there is a tiddler. """ # branch away if we are going to use the render system if self.environ['tiddlyweb.config'].get('twikified.render', True): return self._render(tiddler) common_container = self.environ.get( 'tiddlyweb.config', {}).get( 'twikified.container', '/bags/common/tiddlers/') scripts = """ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" type="text/javascript"></script> <script> $.ajaxSetup({ beforeSend: function(xhr) { xhr.setRequestHeader("X-ControlView", "false"); } }); </script> <script src="%(container)stwikifier" type="text/javascript"></script> <script src="%(container)stwik" type="text/javascript"></script> <script src="%(container)swebtwik" type="text/javascript"></script> """ % {'container': common_container} tiddler_div = '<div class="tiddler" title="%s" %s><pre>%s</pre></div>' % ( escape_attribute_value(tiddler.title), self._tiddler_provenance(tiddler), self._text(tiddler)) self.environ['tiddlyweb.title'] = tiddler.title return tiddler_div + scripts
def _tiddler_fields(self, fields): """ Turn tiddler fields into a string suitable for _tiddler_div. """ output = [] for key, val in fields.items(): output.append('%s="%s"' % (key, escape_attribute_value(val))) return ' '.join(output)
def _tiddler_fields(self, fields): """ Turn tiddler fields into a string suitable for a div attribute. """ output = [] for key, val in fields.items(): output.append('%s="%s"' % (key, escape_attribute_value(val))) return ' '.join(output)
def _tiddler_as_div(self, tiddler): """ Read in the tiddler from a div. """ recipe_name = '' if tiddler.recipe: recipe_name = tiddler.recipe try: host = server_base_url(self.environ) except KeyError: host = '' host = '%s' % host if binary_tiddler(tiddler): tiddler_output = self._binary_tiddler(tiddler) else: tiddler_output = tiddler.text if tiddler.type == 'None' or not tiddler.type: tiddler.type = '' return ('<div title="%s" server.title="%s" server.page.revision="%s" ' 'server.etag="%s" ' 'modifier="%s" creator="%s" server.workspace="bags/%s" ' 'server.type="tiddlyweb" server.host="%s" ' 'server.recipe="%s" server.bag="%s" server.permissions="%s" ' 'server.content-type="%s" ' 'modified="%s" created="%s" tags="%s" %s>\n' '<pre>%s</pre>\n</div>\n' % (escape_attribute_value(tiddler.title), escape_attribute_value(tiddler.title), tiddler.revision, escape_attribute_value(tiddler_etag( self.environ, tiddler)), escape_attribute_value(tiddler.modifier), escape_attribute_value(tiddler.creator), escape_attribute_value(tiddler.bag), host, escape_attribute_value(recipe_name), escape_attribute_value(tiddler.bag), self._tiddler_permissions(tiddler), tiddler.type, tiddler.modified, tiddler.created, escape_attribute_value(self.tags_as(tiddler.tags)), self._tiddler_fields(tiddler.fields), html_encode(tiddler_output)))
def _tiddler_as_div(self, tiddler): """ Read in the tiddler from a div. """ recipe_name = '' if tiddler.recipe: recipe_name = tiddler.recipe try: host = server_base_url(self.environ) except KeyError: host = '' host = '%s/' % host if binary_tiddler(tiddler): tiddler_output = self._binary_tiddler(tiddler) else: tiddler_output = tiddler.text if tiddler.type == 'None' or not tiddler.type: tiddler.type = '' return ('<div title="%s" server.title="%s" server.page.revision="%s" ' 'server.etag="%s" ' 'modifier="%s" creator="%s" server.workspace="bags/%s" ' 'server.type="tiddlyweb" server.host="%s" ' 'server.recipe="%s" server.bag="%s" server.permissions="%s" ' 'server.content-type="%s" ' 'modified="%s" created="%s" tags="%s" %s>\n' '<pre>%s</pre>\n</div>\n' % (escape_attribute_value(tiddler.title), escape_attribute_value(tiddler.title), tiddler.revision, escape_attribute_value(_tiddler_etag(self.environ, tiddler)), escape_attribute_value( tiddler.modifier), escape_attribute_value( tiddler.creator), escape_attribute_value(tiddler.bag), host, escape_attribute_value(recipe_name), escape_attribute_value( tiddler.bag), self._tiddler_permissions(tiddler), tiddler.type, tiddler.modified, tiddler.created, escape_attribute_value(self.tags_as( tiddler.tags)), self._tiddler_fields( tiddler.fields), html_encode(tiddler_output)))
def render(tiddler, environ, seen_titles=None): """ Return tiddler.text as rendered HTML by passing it down a socket to the nodejs based server.js process. Transclusions are identified in the returned text and processed recursively. If there is a current user, that user is passed along the pipe so that private content can be retrieved by nodejs (over HTTP). """ if seen_titles is None: seen_titles = [] parser = html5lib.HTMLParser( tree=html5lib.treebuilders.getTreeBuilder("dom")) if tiddler.recipe: collection = recipe_url(environ, Recipe(tiddler.recipe)) + '/tiddlers' else: collection = bag_url(environ, Bag(tiddler.bag)) + '/tiddlers' try: user_cookie = environ['HTTP_COOKIE'] cookie = Cookie.SimpleCookie() cookie.load(user_cookie) tiddlyweb_cookie = 'tiddlyweb_user='******'tiddlyweb_user'].value except KeyError: tiddlyweb_cookie = '' socket_path = environ['tiddlyweb.config'].get('twikified.socket', '/tmp/wst.sock') twik_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: twik_socket.connect(socket_path) except (socket.error, IOError), exc: output = """ <div class='error'>There was a problem rendering this tiddler. The raw text is given below.</div> <pre class='wikitext'>%s</pre> """ % (escape_attribute_value(tiddler.text)) logging.warn('twikifier socket connect failed: %s', exc) twik_socket.shutdown(socket.SHUT_RDWR) twik_socket.close() return output
def render(tiddler, environ, seen_titles=None): """ Return tiddler.text as rendered HTML by passing it down a socket to the nodejs based server.js process. Transclusions are identified in the returned text and processed recursively. If there is a current user, that user is passed along the pipe so that private content can be retrieved by nodejs (over HTTP). """ if seen_titles is None: seen_titles = [] parser = html5lib.HTMLParser( tree = html5lib.treebuilders.getTreeBuilder("dom")) if tiddler.recipe: collection = recipe_url(environ, Recipe(tiddler.recipe)) + '/tiddlers' else: collection = bag_url(environ, Bag(tiddler.bag)) + '/tiddlers' try: user_cookie = environ['HTTP_COOKIE'] cookie = Cookie.SimpleCookie() cookie.load(user_cookie) tiddlyweb_cookie = 'tiddlyweb_user='******'tiddlyweb_user'].value except KeyError: tiddlyweb_cookie = '' socket_path = environ['tiddlyweb.config'].get('twikified.socket', '/tmp/wst.sock') twik_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: twik_socket.connect(socket_path) except (socket.error, IOError), exc: output = """ <div class='error'>There was a problem rendering this tiddler. The raw text is given below.</div> <pre class='wikitext'>%s</pre> """ % (escape_attribute_value(tiddler.text)) logging.warn('twikifier socket connect failed: %s', exc) twik_socket.shutdown(socket.SHUT_RDWR) twik_socket.close() return output
def render(tiddler, environ): if tiddler.recipe: collection = recipe_url(environ, Recipe(tiddler.recipe)) + '/tiddlers' else: collection = bag_url(environ, Bag(tiddler.bag)) + '/tiddlers' try: user_cookie = environ['HTTP_COOKIE'] cookie = Cookie.SimpleCookie() cookie.load(user_cookie) tiddlyweb_cookie = 'tiddlyweb_user='******'tiddlyweb_user'].value except KeyError: tiddlyweb_cookie = '' socket_path = environ['tiddlyweb.config'].get('twikified.socket', '/tmp/wst.sock') twik_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: twik_socket.connect('/tmp/wst.sock') except IOError: output = """ <div class='error'>There was a problem rendering this tiddler. The raw text is given instead below.</div> <pre class='wikitext'>%s</pre> """%(escape_attribute_value(tiddler.text)) return output twik_socket.sendall('%s\x00%s\x00%s\n' % (collection, tiddler.title, tiddlyweb_cookie)) output = '' try: while True: data = twik_socket.recv(1024) if data: output += data else: break finally: twik_socket.close() return output.decode('UTF-8')
def render(tiddler, environ): """ Return tiddler.text as rendered HTML by passing it down a socket to the nodejs based server.js process. Transclusions are identified in the returned text and processed recursively. If there is a current user, that user is passed along the pipe so that private content can be retrieved by nodejs (over HTTP). """ if tiddler.recipe: collection = recipe_url(environ, Recipe(tiddler.recipe)) + '/tiddlers' else: collection = bag_url(environ, Bag(tiddler.bag)) + '/tiddlers' try: user_cookie = environ['HTTP_COOKIE'] cookie = Cookie.SimpleCookie() cookie.load(user_cookie) tiddlyweb_cookie = 'tiddlyweb_user='******'tiddlyweb_user'].value except KeyError: tiddlyweb_cookie = '' socket_path = environ['tiddlyweb.config'].get( 'twikified.socket', '/var/run/twikifier/wst.sock') twik_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) twik_socket.settimeout(15.0) try: try: twik_socket.connect(socket_path) except (socket.error, IOError), exc: output = """ <div class='error'>There was a problem rendering this tiddler. The raw text is given below.</div> <pre class='wikitext'>%s</pre> """ % (escape_attribute_value(tiddler.text)) LOGGER.warn('twikifier socket connect failed: %s', exc) twik_socket.shutdown(socket.SHUT_RDWR) twik_socket.close() return output try: twik_socket.sendall( '%s\x00%s\x00%s\n' % (collection, tiddler.text.encode('utf-8', 'replace'), tiddlyweb_cookie)) twik_socket.shutdown(socket.SHUT_WR) output = '' try: while True: data = twik_socket.recv(1024) if data: output += data else: break finally: twik_socket.shutdown(socket.SHUT_RDWR) twik_socket.close() except (socket.error, IOError), exc: if hasattr(exc, 'errno') and exc.errno == 57: twik_socket.close() else: LOGGER.warn('twikifier error during data processing: %s', exc) output = """ <div class='error'>There was a problem rendering this tiddler. The raw text is given below.</div> <pre class='wikitext'>%s</pre> """ % (escape_attribute_value(tiddler.text)) try: twik_socket.shutdown(socket.SHUT_RDWR) twik_socket.close() except (socket.error), exc: LOGGER.warn('twikifier bad socket shutdown: %s', exc) return output
def _tiddler_provenance(self, tiddler): if tiddler.recipe: return 'server.recipe="%s"' % escape_attribute_value( tiddler.recipe) else: return 'server.bag="%s"' % escape_attribute_value(tiddler.bag)
def render(tiddler, environ): """ Return tiddler.text as rendered HTML by passing it down a socket to the nodejs based server.js process. Transclusions are identified in the returned text and processed recursively. If there is a current user, that user is passed along the pipe so that private content can be retrieved by nodejs (over HTTP). """ if tiddler.recipe: collection = recipe_url(environ, Recipe(tiddler.recipe)) + '/tiddlers' else: collection = bag_url(environ, Bag(tiddler.bag)) + '/tiddlers' try: user_cookie = environ['HTTP_COOKIE'] cookie = Cookie.SimpleCookie() cookie.load(user_cookie) tiddlyweb_cookie = 'tiddlyweb_user='******'tiddlyweb_user'].value except KeyError: tiddlyweb_cookie = '' socket_path = environ['tiddlyweb.config'].get('twikified.socket', '/var/run/twikifier/wst.sock') twik_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) twik_socket.settimeout(15.0) try: try: twik_socket.connect(socket_path) except (socket.error, IOError), exc: output = """ <div class='error'>There was a problem rendering this tiddler. The raw text is given below.</div> <pre class='wikitext'>%s</pre> """ % (escape_attribute_value(tiddler.text)) LOGGER.warn('twikifier socket connect failed: %s', exc) twik_socket.shutdown(socket.SHUT_RDWR) twik_socket.close() return output try: twik_socket.sendall('%s\x00%s\x00%s\n' % (collection, tiddler.text.encode('utf-8', 'replace'), tiddlyweb_cookie)) twik_socket.shutdown(socket.SHUT_WR) output = '' try: while True: data = twik_socket.recv(1024) if data: output += data else: break finally: twik_socket.shutdown(socket.SHUT_RDWR) twik_socket.close() except (socket.error, IOError), exc: if hasattr(exc, 'errno') and exc.errno == 57: twik_socket.close() else: LOGGER.warn('twikifier error during data processing: %s', exc) output = """ <div class='error'>There was a problem rendering this tiddler. The raw text is given below.</div> <pre class='wikitext'>%s</pre> """ % (escape_attribute_value(tiddler.text)) try: twik_socket.shutdown(socket.SHUT_RDWR) twik_socket.close() except (socket.error), exc: LOGGER.warn('twikifier bad socket shutdown: %s', exc) return output
The raw text is given below.</div> <pre class='wikitext'>%s</pre> """ % (escape_attribute_value(tiddler.text)) try: twik_socket.shutdown(socket.SHUT_RDWR) twik_socket.close() except (socket.error), exc: LOGGER.warn('twikifier bad socket shutdown: %s', exc) return output except socket.timeout: LOGGER.warn('twikifier socket timeout') output = """ <div class='error'>There was a timeout problem rendering this tiddler. The raw text is given below.</div> <pre class='wikitext'>%s</pre> """ % (escape_attribute_value(tiddler.text)) twik_socket.shutdown(socket.SHUT_RDWR) twik_socket.close() return output return _process_for_transclusion(output, tiddler, environ) def _process_for_transclusion(output, tiddler, environ): """ Process the output for transclusions. """ if 'twikified.seen_titles' in environ: seen_titles = environ['twikified.seen_titles'] else: seen_titles = []
def _tiddler_provenance(self, tiddler): if tiddler.recipe: return 'server.recipe="%s"' % escape_attribute_value(tiddler.recipe) else: return 'server.bag="%s"' % escape_attribute_value(tiddler.bag)