Пример #1
0
    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))
Пример #2
0
 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))
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
 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)
Пример #6
0
 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)
Пример #7
0
    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)))
Пример #8
0
    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)))
Пример #9
0
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
Пример #10
0
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
Пример #11
0
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')
Пример #12
0
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
Пример #13
0
 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 = []
Пример #16
0
        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 = []
Пример #17
0
 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)