*** goplus has left #zope3-dev | 00:02 | |
*** RaFromBRC is now known as RaFromBRC|lunch | 00:03 | |
*** pelle_ has quit IRC | 00:03 | |
*** pelle_ has joined #zope3-dev | 00:05 | |
*** norro has quit IRC | 00:18 | |
X-scream | anyone know of a proper way to work with/do changes on a deployed Z3 app? First you'd want to test any changes before actually changing the running site.. | 00:34 |
---|---|---|
X-scream | mirrored instances? SVN? etc.. | 00:34 |
X-scream | ZEO maybe? | 00:34 |
bigkevmcd | X-scream: how do you deal with non-Z3 deployed apps currently? | 00:35 |
X-scream | I don't.. I'm about to start planning and designing one. But I need to think of the future too :) | 00:35 |
iap | start with unit testing | 00:35 |
X-scream | ok | 00:36 |
X-scream | that seems reasonable :) | 00:36 |
iap | that should catch the stupid errors ;) | 00:36 |
X-scream | if you get a webhost which gives you a shared zope instance, how would you restart the server to apply changes you make ? | 00:38 |
X-scream | I'm kind of in an investigating phase here, got a big project coming up and I've been assigned to learn Z3 :) | 00:39 |
*** jfroche_ has joined #zope3-dev | 00:39 | |
X-scream | any suggestions on how to deal with the develop/commit&stage/deploy process of a live site is higly appreciated :) | 00:45 |
*** BjornT has quit IRC | 00:47 | |
bigkevmcd | It can range from simple to complex, depending on the architecture of the application, and the hosting environment. | 00:47 |
*** pelle_ has quit IRC | 00:48 | |
X-scream | I guess that's a bit into the future, now I just need to study Z3 | 00:49 |
X-scream | just got Philipp's book 2nd ed.. very good so far | 00:49 |
*** RaFromBRC|lunch is now known as RaFromBRC | 00:51 | |
*** rcrafton has quit IRC | 00:51 | |
*** BjornT has joined #zope3-dev | 00:52 | |
*** jfroche has quit IRC | 00:52 | |
X-scream | btw, you guys refer to zope 3 as Z3 right? | 00:52 |
X-scream | or is that acronym already occupied :) | 00:52 |
*** natea|lunch is now known as natea|boston | 00:55 | |
*** greenman has joined #zope3-dev | 00:56 | |
*** goplus has joined #zope3-dev | 00:57 | |
*** goplus has left #zope3-dev | 00:57 | |
*** johnlr has quit IRC | 01:02 | |
*** schwendinger|sle has quit IRC | 01:04 | |
*** bigkevmcd has quit IRC | 01:04 | |
*** twcook has joined #zope3-dev | 01:09 | |
*** greenman_ has joined #zope3-dev | 01:09 | |
*** greenman has quit IRC | 01:09 | |
*** greenman_ has quit IRC | 01:10 | |
*** bac is now known as bac_afk | 01:10 | |
*** jodok has quit IRC | 01:15 | |
*** jfroche_ has quit IRC | 01:17 | |
*** pcardune has quit IRC | 01:21 | |
*** jodok has joined #zope3-dev | 01:31 | |
*** Ariel_Calzada has quit IRC | 01:34 | |
*** jinty has joined #zope3-dev | 01:35 | |
*** iap is now known as jap | 01:38 | |
*** jap is now known as iap | 01:38 | |
*** benji_ has joined #zope3-dev | 01:40 | |
*** benji has quit IRC | 01:41 | |
*** jodok has quit IRC | 01:49 | |
*** derek_richardson is now known as derek|office | 01:49 | |
*** jinty_ has joined #zope3-dev | 02:06 | |
*** johnlr has joined #zope3-dev | 02:08 | |
*** harobed has quit IRC | 02:12 | |
*** lmiller has joined #zope3-dev | 02:20 | |
*** benji_ has quit IRC | 02:20 | |
*** jinty has quit IRC | 02:23 | |
*** J1m has quit IRC | 02:34 | |
*** redir has quit IRC | 02:55 | |
*** jsadjohnson has quit IRC | 02:56 | |
CSWookie | Is there any tutorial/exemplars of z3c.configurator? | 03:08 |
CSWookie | s/Is/Are/ | 03:08 |
*** natea|boston is now known as natea|dinner | 03:37 | |
*** alecm has quit IRC | 03:59 | |
*** pcardune has joined #zope3-dev | 04:07 | |
*** natea|dinner_ has joined #zope3-dev | 04:30 | |
*** hazmat has quit IRC | 04:38 | |
*** natea|dinner has quit IRC | 04:39 | |
*** jsadjohnson has joined #zope3-dev | 04:42 | |
*** jsadjohnson has quit IRC | 04:58 | |
*** niemeyer has quit IRC | 05:06 | |
*** natea|dinner has joined #zope3-dev | 05:13 | |
*** natea|dinner_ has quit IRC | 05:22 | |
*** RaFromBRC has quit IRC | 05:24 | |
*** alecm has joined #zope3-dev | 05:33 | |
*** alecm has quit IRC | 05:33 | |
*** natea|dinner_ has joined #zope3-dev | 05:44 | |
*** natea|dinner has quit IRC | 05:51 | |
*** frankpitt has joined #zope3-dev | 05:56 | |
*** frankpitt has left #zope3-dev | 06:16 | |
*** pcardune has quit IRC | 06:31 | |
*** natea_ has joined #zope3-dev | 06:43 | |
*** natea|dinner_ has quit IRC | 06:50 | |
*** natea_ has quit IRC | 07:05 | |
*** natea_ has joined #zope3-dev | 07:05 | |
*** alecm has joined #zope3-dev | 07:24 | |
*** cursor has joined #zope3-dev | 07:30 | |
*** alecm has quit IRC | 07:38 | |
*** alecm has joined #zope3-dev | 07:39 | |
*** alecm_ has joined #zope3-dev | 07:40 | |
*** alecm has quit IRC | 07:56 | |
*** alecm has joined #zope3-dev | 07:56 | |
*** jukart has joined #zope3-dev | 08:00 | |
*** baijum has joined #zope3-dev | 08:01 | |
*** alecm_ has quit IRC | 08:05 | |
*** twcook has quit IRC | 08:12 | |
*** cursor has quit IRC | 08:17 | |
*** natea_ has quit IRC | 08:19 | |
*** natea_ has joined #zope3-dev | 08:20 | |
*** natea_ has quit IRC | 08:45 | |
*** natea_ has joined #zope3-dev | 08:49 | |
*** sorin has joined #zope3-dev | 08:52 | |
*** d2m has joined #zope3-dev | 08:52 | |
*** sorin is now known as sorindregan | 08:52 | |
*** schwendinger|sle has joined #zope3-dev | 08:54 | |
*** alecm_ has joined #zope3-dev | 08:56 | |
*** alecm has quit IRC | 08:57 | |
*** greenman has joined #zope3-dev | 08:58 | |
*** ghendi has joined #zope3-dev | 09:10 | |
*** jodok has joined #zope3-dev | 09:29 | |
*** jodok has quit IRC | 09:37 | |
*** jodok has joined #zope3-dev | 09:43 | |
*** febb has joined #zope3-dev | 09:54 | |
*** bigkevmcd has joined #zope3-dev | 09:59 | |
*** alga has joined #zope3-dev | 09:59 | |
*** philiKON has quit IRC | 10:00 | |
*** schwendinger|sle is now known as schwendinger | 10:13 | |
*** jinty_ has quit IRC | 10:14 | |
*** theuni has joined #zope3-dev | 10:16 | |
*** natea_ has quit IRC | 10:21 | |
*** natea_ has joined #zope3-dev | 10:21 | |
*** theuni has quit IRC | 10:28 | |
*** theuni has joined #zope3-dev | 10:29 | |
*** romanofski has joined #zope3-dev | 10:30 | |
*** theuni has quit IRC | 10:31 | |
*** Jell-O-Fishi has quit IRC | 10:31 | |
*** theuni has joined #zope3-dev | 10:31 | |
*** foxmjay has quit IRC | 10:34 | |
*** dunny has joined #zope3-dev | 10:44 | |
*** b52lap has joined #zope3-dev | 10:49 | |
*** b52laptop has quit IRC | 10:53 | |
*** b52lap has quit IRC | 10:55 | |
*** lmiller has quit IRC | 10:57 | |
*** baijum changes topic to "Zope 3.4.0b1 is out: http://www.zope.org/Products/Zope3/3.4.0b1 | Zope 3.4 bugs: http://tinyurl.com/yvyeo5 | bugs: https://bugs.launchpad.net/zope3/ | FAQ: http://wiki.zope.org/zope3/FAQ | wiki: http://wiki.zope.org/zope3 | paste: http://paste.lisp.org/new/zope3-dev | irc logs: http://zope3.pov.lt/irclogs/ | new buildbot : http://uter.gocept.com:3333/" | 10:59 | |
*** alecm_ has quit IRC | 11:04 | |
*** pelle_ has joined #zope3-dev | 11:05 | |
*** jfroche has joined #zope3-dev | 11:08 | |
*** jsadjohnson has joined #zope3-dev | 11:21 | |
*** greenman has quit IRC | 11:22 | |
*** jsadjohnson has left #zope3-dev | 11:27 | |
*** greenman has joined #zope3-dev | 11:28 | |
*** dunny has quit IRC | 11:30 | |
*** stub has joined #zope3-dev | 11:35 | |
*** dunny has joined #zope3-dev | 11:36 | |
*** jodok has quit IRC | 11:36 | |
*** jodok has joined #zope3-dev | 11:40 | |
*** jodok has quit IRC | 11:45 | |
*** jodok has joined #zope3-dev | 11:46 | |
*** jodok has quit IRC | 11:47 | |
*** jodok has joined #zope3-dev | 11:48 | |
*** febb has quit IRC | 11:49 | |
*** kobold has joined #zope3-dev | 11:50 | |
*** norro has joined #zope3-dev | 11:51 | |
*** MJ has joined #zope3-dev | 11:54 | |
*** ktwilight_ has quit IRC | 11:56 | |
*** ktwilight has joined #zope3-dev | 11:57 | |
*** mgedmin has joined #zope3-dev | 12:09 | |
*** ktwilight has quit IRC | 12:19 | |
*** dobee has joined #zope3-dev | 12:19 | |
*** ktwilight has joined #zope3-dev | 12:22 | |
*** MJ is now known as MJ|sprint | 12:23 | |
*** b52laptop has joined #zope3-dev | 12:24 | |
*** gmat has joined #zope3-dev | 12:35 | |
*** gmat has left #zope3-dev | 12:51 | |
*** pandres has quit IRC | 12:51 | |
*** jodok_ has joined #zope3-dev | 12:51 | |
*** jodok has quit IRC | 12:52 | |
*** Jell-O-Fishi has joined #zope3-dev | 12:55 | |
*** twcook has joined #zope3-dev | 13:14 | |
*** tarek has quit IRC | 13:16 | |
*** mkerrin has joined #zope3-dev | 13:16 | |
*** tarek has joined #zope3-dev | 13:21 | |
*** dunny has quit IRC | 13:44 | |
*** Jell-O-Fishi has quit IRC | 13:47 | |
*** mgedmin has quit IRC | 14:03 | |
*** kleist has joined #zope3-dev | 14:23 | |
*** greenman has quit IRC | 14:47 | |
*** chacha_chaudhry has joined #zope3-dev | 14:49 | |
*** projekt01 has joined #zope3-dev | 14:53 | |
*** bac_afk is now known as bac | 14:56 | |
*** alecm has joined #zope3-dev | 15:00 | |
*** niemeyer has joined #zope3-dev | 15:05 | |
*** marianom has joined #zope3-dev | 15:07 | |
*** natea_ has quit IRC | 15:10 | |
*** natea_ has joined #zope3-dev | 15:10 | |
*** timte has joined #zope3-dev | 15:12 | |
*** chacha_chaudhry has quit IRC | 15:14 | |
*** benji has joined #zope3-dev | 15:16 | |
*** alecm has quit IRC | 15:16 | |
dennis__ | if my request has ?item=blah;more , self.request.form breaks the item into "blah", and creates a new dictionary item "more" = "", i would expect that to happen only for item=blah&more, not for a semilcolon. Is that a bug or my fault? | 15:18 |
norro | dennis__ semicolon is a reserved character inside an URI | 15:21 |
d2m | the part following the semicolon should be considered as a parameter to the pathsegment | 15:23 |
dennis__ | hmm :) do you happen to remember the name of the encoding method so I can add ?item=<safely encoded value> | 15:23 |
dennis__ | makes sense actually since i could have & in my argument anyway | 15:23 |
theuni | d2m: even within the querystring? | 15:24 |
d2m | http://www.ietf.org/rfc/rfc2396.txt >> 3.3. Path Component | 15:24 |
d2m | theuni: i see what you mean | 15:25 |
d2m | 3.4 says, "Within a query component, the characters ";", "/", "?", ":", "@", "&", "=", "+", ",", and "$" are reserved." | 15:25 |
*** pcardune has joined #zope3-dev | 15:26 | |
*** J1m has joined #zope3-dev | 15:30 | |
dennis__ | does anyone remember how to escape this? | 15:30 |
theuni | there's a function either in the cgi module or urlquote | 15:31 |
theuni | it takes a mapping and gives you back a - correctly quoted - query string | 15:31 |
dennis__ | cgi.escape('foo;bar') give me 'foo;bar', so that wouldn't be enough | 15:33 |
dennis__ | but urllib.quote seems to make it 'foo%3Bbar' | 15:34 |
dennis__ | lemme try that :) | 15:34 |
theuni | right, as i said: the method you're looking for takes a dictionary | 15:34 |
theuni | otherwise you can't do this right. | 15:34 |
theuni | urlencode(query, doseq=0) | 15:35 |
theuni | Encode a sequence of two-element tuples or dictionary into a URL query string. | 15:35 |
theuni | that's in urllib | 15:35 |
*** afd_ has joined #zope3-dev | 15:35 | |
*** romanofski has quit IRC | 15:38 | |
norro | how can i sort of /extend/ the apply action of my custom edit form properly? | 15:44 |
norro | I want some further actions to be done right after the default formlib stuff happened | 15:44 |
*** pcardune has quit IRC | 15:46 | |
*** rcrafton has joined #zope3-dev | 15:47 | |
*** norro_ has joined #zope3-dev | 15:48 | |
*** jodok has joined #zope3-dev | 15:56 | |
*** redir has joined #zope3-dev | 15:56 | |
*** norro has quit IRC | 16:03 | |
d2m | dennis__: look at cgi.parse_qls() for the inner workings of querystring parsing | 16:04 |
d2m | cgi.parse_qsl() to be correct | 16:04 |
*** norro_ has quit IRC | 16:06 | |
*** pcardune has joined #zope3-dev | 16:14 | |
*** jodok_ has quit IRC | 16:15 | |
*** b52laptop has quit IRC | 16:16 | |
*** b52laptop has joined #zope3-dev | 16:17 | |
*** gumpa has joined #zope3-dev | 16:19 | |
*** jsadjohnson has joined #zope3-dev | 16:20 | |
*** baijum has quit IRC | 16:22 | |
*** jodok has quit IRC | 16:25 | |
*** tarek_ has joined #zope3-dev | 16:29 | |
dennis__ | brr i dont get it. My folder has an object "foo" and an object "foo;bar". If i check in the debug shell, they both have a different contents. But if I browse to foo%3Bbar (zapi.absoluteURL generated uri) I get the contents for "foo" only, zope ignores anything following the %3b (encoded ";") including any view. So "foo%3Bbar/edit.html" gives me "foo/index.html" | 16:32 |
*** ghendi has quit IRC | 16:32 | |
dennis__ | (its a wiki kind of thing, and people have added a name with a semicolon in it) | 16:32 |
*** mgedmin has joined #zope3-dev | 16:32 | |
*** tarek has quit IRC | 16:40 | |
*** pcardune has quit IRC | 16:46 | |
*** richardkan has joined #zope3-dev | 16:49 | |
*** richardkan has left #zope3-dev | 16:50 | |
srichter | dennis__: well, you need to make sure the names are somewhat restricted | 16:51 |
J1m | ';' has special meaning in URLs. | 16:52 |
dennis__ | yes but it's encoded, isn't that the point of encoding it? | 16:52 |
J1m | I'm not sure escaping it changes that. | 16:52 |
srichter | correct | 16:53 |
J1m | I don't *think* encoding changes it's meaning, but I'm not sure. | 16:53 |
J1m | You have to be an RFC lawyer to be sure. :) | 16:53 |
srichter | well, in Konqueror it certainly does not | 16:53 |
dennis__ | i've solved my issues with funny chars by escaping everything properly, but now zope does received /foo%3bbar/edit.html and it traverses to /foo/index.html | 16:53 |
srichter | my @@ get automatically encoded by Konqueror but are correctly handled by Zope | 16:53 |
dennis__ | srichter yeah that's true too | 16:54 |
J1m | dennis, ; separates the normal path from url parameters. | 16:54 |
J1m | so, technically, ';' ends the path part of the URL. | 16:55 |
dennis__ | so even escaping doesn't allow me to use certain chars anywhere in the uri .. argh | 16:57 |
dennis__ | is there a function which strips (since it can't escape/encode) "illegal" chars away from a given string? that's my best chance to resolve this with the least amount of changes | 17:00 |
theuni | str.replace(';', '') | 17:01 |
dennis__ | sure, but then tomorrow someone adds "@" in the name, and then "+", and then "&", etc :) i trust a dedicated function/lib to do it better than myself :) | 17:02 |
*** pcardune has joined #zope3-dev | 17:09 | |
dennis__ | """For example, the reserved character "/", if used in the "path" component of a URI, has the special meaning of being a delimiter between path segments. If, according to a given URI scheme, "/" needs to be in a path segment, then the three characters "%2F" or "%2f" must be used in the segment instead of a raw "/". """ | 17:12 |
*** lisppaste6 has quit IRC | 17:14 | |
dennis__ | for the @@ case I would interpret it that the browser should encode it since they are not used as their intended meaning, and zope of course unescapes them since it attaches a special meaning to it itself | 17:15 |
*** cursor has joined #zope3-dev | 17:21 | |
dennis__ | hmpf no this won't work, have to work around this now :( | 17:21 |
*** lisppaste6 has joined #zope3-dev | 17:21 | |
*** derek|office is now known as derek_richardson | 17:21 | |
*** sorindregan has quit IRC | 17:27 | |
*** philiKON has joined #zope3-dev | 17:33 | |
*** schwendinger has quit IRC | 17:37 | |
*** rocky has quit IRC | 17:39 | |
*** philiKON has quit IRC | 17:43 | |
*** Jell-O-Fishi has joined #zope3-dev | 17:43 | |
*** philiKON has joined #zope3-dev | 17:50 | |
*** schwendinger has joined #zope3-dev | 17:53 | |
*** jhauser has joined #zope3-dev | 17:54 | |
*** philiKON has quit IRC | 17:56 | |
*** Ariel_Calzada has joined #zope3-dev | 18:00 | |
*** tarek has joined #zope3-dev | 18:01 | |
*** drzoltron has joined #zope3-dev | 18:04 | |
drzoltron | Could someone pls point me to a svn where I can get lovely.rest ? | 18:05 |
*** natea_ has quit IRC | 18:06 | |
*** Jell-O-Squidy has joined #zope3-dev | 18:06 | |
*** natea_ has joined #zope3-dev | 18:06 | |
*** tarek_ has quit IRC | 18:06 | |
*** Jell-O-Squidy has quit IRC | 18:08 | |
*** dobee has quit IRC | 18:11 | |
*** GuestBaha18 has joined #zope3-dev | 18:14 | |
*** GuestBaha18 has quit IRC | 18:15 | |
*** mgedmin has quit IRC | 18:24 | |
*** dobee has joined #zope3-dev | 18:25 | |
*** kleist has left #zope3-dev | 18:28 | |
*** johnlr has quit IRC | 18:28 | |
*** dobee has quit IRC | 18:37 | |
*** natea_ has quit IRC | 18:39 | |
*** richardkan has joined #zope3-dev | 18:40 | |
*** Ariel_Calzada has quit IRC | 18:42 | |
*** pelle_ has quit IRC | 18:46 | |
*** sm has quit IRC | 18:48 | |
*** sm has joined #zope3-dev | 18:49 | |
*** projekt01 has quit IRC | 18:50 | |
*** alecm has joined #zope3-dev | 18:53 | |
*** richardkan has left #zope3-dev | 18:55 | |
*** natea_ has joined #zope3-dev | 18:55 | |
*** nathany has joined #zope3-dev | 19:04 | |
*** Ariel_Calzada has joined #zope3-dev | 19:11 | |
X-scream | schemas fields have implied type constraints right? So if i have a "x = Int(...)" in my schema shouldn't I get an error when I do >>> foo.x = "bar" | 19:11 |
X-scream | where foo is an instance of a class that implements my schema | 19:11 |
X-scream | or how does this work, confused :) | 19:12 |
J1m | The schema system doesn't enforce anything on it's own. | 19:12 |
*** stub has quit IRC | 19:12 | |
J1m | It is almost entorely specification. | 19:12 |
J1m | You can build tools on top of it that check. | 19:12 |
J1m | There are some tools like that already, such as the widget/form frameworks. | 19:13 |
J1m | There is also a SchemaFieldProperty that you can put in a class definition to enforce a field constraint. | 19:13 |
X-scream | ah | 19:14 |
X-scream | I also saw a validate function... >>> x = Int(...) >>> x.validate('an error') | 19:15 |
X-scream | but why can't I do obj.x.validate('meep') if I have an Int field in obj... | 19:16 |
J1m | right. Arguably, that is a wart. The intent is that fields are purely specification. We should probably have used adapters to provide validation. | 19:16 |
J1m | because fields libe in the interface, not in the object that provides the interface. | 19:17 |
J1m | live | 19:17 |
X-scream | ah | 19:17 |
J1m | obj.x is just an integer. | 19:17 |
X-scream | yeah, 'int' object has no attribute 'validate' | 19:18 |
*** tarek has quit IRC | 19:19 | |
*** schwendinger has quit IRC | 19:25 | |
*** jukart has quit IRC | 19:30 | |
*** alga has quit IRC | 19:33 | |
*** schwendinger has joined #zope3-dev | 19:40 | |
*** philiKON has joined #zope3-dev | 19:41 | |
*** schwendinger has quit IRC | 19:48 | |
*** mkerrin has quit IRC | 19:55 | |
*** gumpa has quit IRC | 20:01 | |
*** natea_ has quit IRC | 20:16 | |
*** natea_ has joined #zope3-dev | 20:17 | |
*** nathany has quit IRC | 20:27 | |
*** RaFromBRC has joined #zope3-dev | 20:30 | |
*** nathany has joined #zope3-dev | 20:31 | |
*** cursor has quit IRC | 20:33 | |
*** drzoltron has quit IRC | 20:33 | |
*** cursor has joined #zope3-dev | 20:34 | |
*** natea_ has quit IRC | 20:36 | |
*** natea_ has joined #zope3-dev | 20:45 | |
*** kobold has left #zope3-dev | 20:50 | |
*** cursor has quit IRC | 20:52 | |
*** natea_ has quit IRC | 20:54 | |
*** natea_ has joined #zope3-dev | 20:54 | |
*** MJ|sprint has quit IRC | 21:19 | |
*** b52laptop has quit IRC | 21:25 | |
*** nerdalert has joined #zope3-dev | 21:29 | |
*** Ariel_Calzada has quit IRC | 21:44 | |
*** pbugni-afk has joined #zope3-dev | 21:45 | |
*** pbugni-afk is now known as pbugni | 21:45 | |
*** dobee has joined #zope3-dev | 21:45 | |
*** pandres has joined #zope3-dev | 21:53 | |
*** natea_ has quit IRC | 21:55 | |
*** natea_ has joined #zope3-dev | 21:55 | |
*** theuni has quit IRC | 22:01 | |
*** theuni has joined #zope3-dev | 22:02 | |
*** dobee has quit IRC | 22:07 | |
*** deo has joined #zope3-dev | 22:15 | |
*** b52laptop has joined #zope3-dev | 22:29 | |
*** theuni has quit IRC | 22:29 | |
*** deo has quit IRC | 22:30 | |
*** Ariel_Calzada has joined #zope3-dev | 22:33 | |
*** dunny has joined #zope3-dev | 22:43 | |
*** deo has joined #zope3-dev | 22:49 | |
*** deo has quit IRC | 22:59 | |
*** deo has joined #zope3-dev | 23:00 | |
*** twcook has quit IRC | 23:03 | |
*** lucielejard has joined #zope3-dev | 23:06 | |
*** lucielejard has left #zope3-dev | 23:06 | |
*** lucielejard has joined #zope3-dev | 23:11 | |
*** pbugni has quit IRC | 23:27 | |
*** danfairs has quit IRC | 23:27 | |
*** natea_ has quit IRC | 23:53 |
Generated by irclog2html.py 2.15.1 by Marius Gedminas - find it at mg.pov.lt!