From 6855525e48fad5de270500a5445c4f4ff85d8bda Mon Sep 17 00:00:00 2001 From: Jeremy Laine Date: Wed, 5 Apr 2006 21:11:11 +0000 Subject: [PATCH] import of Diogenes 0.9.18 --- AUTHORS | 26 + COPYING | 340 ++ ChangeLog | 167 + Makefile | 70 + README | 56 + classes.dia | 5612 ++++++++++++++++++++ config/apache.conf | 20 + config/checkspool.pl | 74 + config/db/diogenes.logactions.sql | 31 + config/db/diogenes.sql | 141 + config/diogenes.config.inc.php.dist | 28 + config/make_dirs.sh | 50 + config/updatedb.php | 230 + cvs.pl | 318 ++ debian/README.Debian | 40 + debian/changelog | 354 ++ debian/compat | 1 + debian/control | 34 + debian/copyright | 31 + debian/diogenes.config | 114 + debian/diogenes.config.inc.php | 20 + debian/diogenes.debian.inc.php | 11 + debian/diogenes.postinst | 209 + debian/diogenes.postrm | 94 + debian/diogenes.prerm | 26 + debian/diogenes.templates | 105 + debian/po/POTFILES.in | 1 + debian/po/cs.po | 281 + debian/po/de.po | 286 + debian/po/es.po | 282 + debian/po/fr.po | 287 + debian/po/templates.pot | 235 + debian/po/vi.po | 226 + debian/prefix.sql | 4 + debian/rules | 47 + debian/watch | 3 + diogenes.kdevelop | 123 + htdocs/common.css | 253 + htdocs/ekitapplet.jar | Bin 0 -> 111385 bytes htdocs/gnu-regexp-1.1.4.jar | Bin 0 -> 30163 bytes htdocs/images/Makefile | 23 + htdocs/images/action-add.png | Bin 0 -> 761 bytes htdocs/images/action-delete.png | Bin 0 -> 1268 bytes htdocs/images/action-edit.png | Bin 0 -> 1531 bytes htdocs/images/action-plugins.png | Bin 0 -> 1472 bytes htdocs/images/action-properties.png | Bin 0 -> 1466 bytes htdocs/images/action-remove.png | Bin 0 -> 484 bytes htdocs/images/action-rename.png | Bin 0 -> 949 bytes htdocs/images/action-revisions.png | Bin 0 -> 894 bytes htdocs/images/action-update.png | Bin 0 -> 1379 bytes htdocs/images/action-view.png | Bin 0 -> 1501 bytes htdocs/images/banner.png | Bin 0 -> 14671 bytes htdocs/images/barrel-directory.png | Bin 0 -> 1418 bytes htdocs/images/barrel-home.png | Bin 0 -> 1541 bytes htdocs/images/barrel.gif | Bin 0 -> 2658 bytes htdocs/images/favicon.png | Bin 0 -> 2181 bytes htdocs/images/gartoon.defs | 33 + htdocs/images/link-external.png | Bin 0 -> 165 bytes htdocs/images/link-secure.gif | Bin 0 -> 918 bytes htdocs/images/menu-back.gif | Bin 0 -> 269 bytes htdocs/images/mime-audio.png | Bin 0 -> 1419 bytes htdocs/images/mime-compressed.png | Bin 0 -> 1130 bytes htdocs/images/mime-deb.png | Bin 0 -> 1297 bytes htdocs/images/mime-drm.png | Bin 0 -> 1506 bytes htdocs/images/mime-excel.png | Bin 0 -> 1632 bytes htdocs/images/mime-html.png | Bin 0 -> 1565 bytes htdocs/images/mime-image.png | Bin 0 -> 1425 bytes htdocs/images/mime-lyx.png | Bin 0 -> 1688 bytes htdocs/images/mime-msword.png | Bin 0 -> 1624 bytes htdocs/images/mime-pdf.png | Bin 0 -> 1471 bytes htdocs/images/mime-postscript.png | Bin 0 -> 1520 bytes htdocs/images/mime-powerpoint.png | Bin 0 -> 1648 bytes htdocs/images/mime-text.png | Bin 0 -> 1587 bytes htdocs/images/mime-unknown.png | Bin 0 -> 798 bytes htdocs/images/mime-video.png | Bin 0 -> 1418 bytes htdocs/images/mime-xml.png | Bin 0 -> 1565 bytes htdocs/images/perm-admin.png | Bin 0 -> 1653 bytes htdocs/images/perm-auth.png | Bin 0 -> 962 bytes htdocs/images/perm-forbidden.png | Bin 0 -> 827 bytes htdocs/images/perm-public.png | Bin 0 -> 1544 bytes htdocs/images/perm-user.png | Bin 0 -> 1447 bytes htdocs/index.php | 20 + htdocs/kafenio-config.jar | Bin 0 -> 36969 bytes htdocs/kafenio-icons.jar | Bin 0 -> 8759 bytes htdocs/kafenio.jar | Bin 0 -> 141513 bytes htdocs/links-main.css | 12 + htdocs/links-sidebar.css | 10 + htdocs/md5.js | 257 + htdocs/phplayersmenu/gnome/style.css | 0 htdocs/phplayersmenu/gnome/tree_collapse.png | Bin 0 -> 196 bytes .../phplayersmenu/gnome/tree_collapse_corner.png | Bin 0 -> 196 bytes htdocs/phplayersmenu/gnome/tree_collapse_first.png | Bin 0 -> 194 bytes htdocs/phplayersmenu/gnome/tree_corner.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/gnome/tree_expand.png | Bin 0 -> 204 bytes htdocs/phplayersmenu/gnome/tree_expand_corner.png | Bin 0 -> 204 bytes htdocs/phplayersmenu/gnome/tree_expand_first.png | Bin 0 -> 202 bytes htdocs/phplayersmenu/gnome/tree_folder_closed.png | Bin 0 -> 664 bytes htdocs/phplayersmenu/gnome/tree_folder_open.png | Bin 0 -> 727 bytes htdocs/phplayersmenu/gnome/tree_leaf.png | Bin 0 -> 1041 bytes htdocs/phplayersmenu/gnome/tree_space.png | Bin 0 -> 150 bytes htdocs/phplayersmenu/gnome/tree_split.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/gnome/tree_split_first.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/gnome/tree_vertline.png | Bin 0 -> 156 bytes htdocs/phplayersmenu/gorilla/style.css | 0 htdocs/phplayersmenu/gorilla/tree_collapse.png | Bin 0 -> 196 bytes .../phplayersmenu/gorilla/tree_collapse_corner.png | Bin 0 -> 196 bytes .../phplayersmenu/gorilla/tree_collapse_first.png | Bin 0 -> 194 bytes htdocs/phplayersmenu/gorilla/tree_corner.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/gorilla/tree_expand.png | Bin 0 -> 204 bytes .../phplayersmenu/gorilla/tree_expand_corner.png | Bin 0 -> 204 bytes htdocs/phplayersmenu/gorilla/tree_expand_first.png | Bin 0 -> 202 bytes .../phplayersmenu/gorilla/tree_folder_closed.png | Bin 0 -> 868 bytes htdocs/phplayersmenu/gorilla/tree_folder_open.png | Bin 0 -> 924 bytes htdocs/phplayersmenu/gorilla/tree_leaf.png | Bin 0 -> 689 bytes htdocs/phplayersmenu/gorilla/tree_space.png | Bin 0 -> 150 bytes htdocs/phplayersmenu/gorilla/tree_split.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/gorilla/tree_split_first.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/gorilla/tree_vertline.png | Bin 0 -> 156 bytes htdocs/phplayersmenu/layerstreemenu-cookies.js | 64 + htdocs/phplayersmenu/layerstreemenu-nocookies.js | 17 + htdocs/phplayersmenu/layerstreemenu.ijs | 47 + htdocs/phplayersmenu/lush/style.css | 0 htdocs/phplayersmenu/lush/tree_collapse.png | Bin 0 -> 196 bytes htdocs/phplayersmenu/lush/tree_collapse_corner.png | Bin 0 -> 196 bytes htdocs/phplayersmenu/lush/tree_collapse_first.png | Bin 0 -> 194 bytes htdocs/phplayersmenu/lush/tree_corner.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/lush/tree_expand.png | Bin 0 -> 204 bytes htdocs/phplayersmenu/lush/tree_expand_corner.png | Bin 0 -> 204 bytes htdocs/phplayersmenu/lush/tree_expand_first.png | Bin 0 -> 202 bytes htdocs/phplayersmenu/lush/tree_folder_closed.png | Bin 0 -> 650 bytes htdocs/phplayersmenu/lush/tree_folder_open.png | Bin 0 -> 708 bytes htdocs/phplayersmenu/lush/tree_leaf.png | Bin 0 -> 979 bytes htdocs/phplayersmenu/lush/tree_space.png | Bin 0 -> 150 bytes htdocs/phplayersmenu/lush/tree_split.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/lush/tree_split_first.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/lush/tree_vertline.png | Bin 0 -> 156 bytes htdocs/phplayersmenu/mozilla/style.css | 0 htdocs/phplayersmenu/mozilla/tree_collapse.png | Bin 0 -> 196 bytes .../phplayersmenu/mozilla/tree_collapse_corner.png | Bin 0 -> 196 bytes .../phplayersmenu/mozilla/tree_collapse_first.png | Bin 0 -> 194 bytes htdocs/phplayersmenu/mozilla/tree_corner.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/mozilla/tree_expand.png | Bin 0 -> 204 bytes .../phplayersmenu/mozilla/tree_expand_corner.png | Bin 0 -> 204 bytes htdocs/phplayersmenu/mozilla/tree_expand_first.png | Bin 0 -> 202 bytes .../phplayersmenu/mozilla/tree_folder_closed.png | Bin 0 -> 247 bytes htdocs/phplayersmenu/mozilla/tree_folder_open.png | Bin 0 -> 278 bytes htdocs/phplayersmenu/mozilla/tree_leaf.png | Bin 0 -> 207 bytes htdocs/phplayersmenu/mozilla/tree_space.png | Bin 0 -> 150 bytes htdocs/phplayersmenu/mozilla/tree_split.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/mozilla/tree_split_first.png | Bin 0 -> 160 bytes htdocs/phplayersmenu/mozilla/tree_vertline.png | Bin 0 -> 156 bytes htdocs/prefs.php | 50 + htdocs/site.php | 35 + htdocs/toplevel.css | 48 + htdocs/toplevel/accounts.php | 22 + htdocs/toplevel/admins.php | 68 + htdocs/toplevel/boot.php | 50 + htdocs/toplevel/index.php | 18 + htdocs/toplevel/logger.php | 12 + htdocs/toplevel/logger_actions.php | 19 + htdocs/toplevel/options.php | 69 + htdocs/toplevel/options_expert.php | 84 + htdocs/toplevel/plugins.php | 60 + include/Barrel.php | 387 ++ include/Barrel/Editor.php | 176 + include/Barrel/File.php | 124 + include/Barrel/Options.php | 105 + include/Barrel/Page.php | 330 ++ include/HTTP/WebDAV/Server.php | 1874 +++++++ include/HTTP/WebDAV/Tools/_parse_lockinfo.php | 237 + include/HTTP/WebDAV/Tools/_parse_propfind.php | 178 + include/HTTP/WebDAV/Tools/_parse_proppatch.php | 214 + include/Plugin/Editor.php | 290 + include/Plugin/Filter.php | 86 + include/Plugin/Render.php | 49 + include/Plugin/Skel.php | 155 + include/Plugins.php | 337 ++ include/Text/Wiki.php | 1280 +++++ include/Text/Wiki/Parse.php | 273 + include/Text/Wiki/Parse/Default/Anchor.php | 87 + include/Text/Wiki/Parse/Default/Blockquote.php | 179 + include/Text/Wiki/Parse/Default/Bold.php | 79 + include/Text/Wiki/Parse/Default/Break.php | 72 + include/Text/Wiki/Parse/Default/Center.php | 78 + include/Text/Wiki/Parse/Default/Code.php | 99 + include/Text/Wiki/Parse/Default/Colortext.php | 89 + include/Text/Wiki/Parse/Default/Deflist.php | 122 + include/Text/Wiki/Parse/Default/Delimiter.php | 80 + include/Text/Wiki/Parse/Default/Embed.php | 106 + include/Text/Wiki/Parse/Default/Emphasis.php | 85 + include/Text/Wiki/Parse/Default/Freelink.php | 129 + include/Text/Wiki/Parse/Default/Function.php | 141 + include/Text/Wiki/Parse/Default/Heading.php | 107 + include/Text/Wiki/Parse/Default/Horiz.php | 70 + include/Text/Wiki/Parse/Default/Html.php | 75 + include/Text/Wiki/Parse/Default/Image.php | 84 + include/Text/Wiki/Parse/Default/Include.php | 100 + include/Text/Wiki/Parse/Default/Interwiki.php | 138 + include/Text/Wiki/Parse/Default/Italic.php | 85 + include/Text/Wiki/Parse/Default/List.php | 248 + include/Text/Wiki/Parse/Default/Newline.php | 75 + include/Text/Wiki/Parse/Default/Paragraph.php | 146 + include/Text/Wiki/Parse/Default/Phplookup.php | 73 + include/Text/Wiki/Parse/Default/Prefilter.php | 78 + include/Text/Wiki/Parse/Default/Raw.php | 73 + include/Text/Wiki/Parse/Default/Revise.php | 145 + include/Text/Wiki/Parse/Default/Strong.php | 90 + include/Text/Wiki/Parse/Default/Superscript.php | 79 + include/Text/Wiki/Parse/Default/Table.php | 226 + include/Text/Wiki/Parse/Default/Tighten.php | 49 + include/Text/Wiki/Parse/Default/Toc.php | 130 + include/Text/Wiki/Parse/Default/Tt.php | 84 + include/Text/Wiki/Parse/Default/Url.php | 281 + include/Text/Wiki/Parse/Default/Wikilink.php | 197 + include/Text/Wiki/Render.php | 197 + include/Text/Wiki/Render/Latex.php | 90 + include/Text/Wiki/Render/Latex/Anchor.php | 33 + include/Text/Wiki/Render/Latex/Blockquote.php | 36 + include/Text/Wiki/Render/Latex/Bold.php | 4 + include/Text/Wiki/Render/Latex/Break.php | 24 + include/Text/Wiki/Render/Latex/Center.php | 33 + include/Text/Wiki/Render/Latex/Code.php | 26 + include/Text/Wiki/Render/Latex/Colortext.php | 58 + include/Text/Wiki/Render/Latex/Deflist.php | 53 + include/Text/Wiki/Render/Latex/Delimiter.php | 25 + include/Text/Wiki/Render/Latex/Embed.php | 23 + include/Text/Wiki/Render/Latex/Emphasis.php | 29 + include/Text/Wiki/Render/Latex/Freelink.php | 34 + include/Text/Wiki/Render/Latex/Function.php | 23 + include/Text/Wiki/Render/Latex/Heading.php | 33 + include/Text/Wiki/Render/Latex/Horiz.php | 23 + include/Text/Wiki/Render/Latex/Html.php | 25 + include/Text/Wiki/Render/Latex/Image.php | 70 + include/Text/Wiki/Render/Latex/Include.php | 8 + include/Text/Wiki/Render/Latex/Interwiki.php | 60 + include/Text/Wiki/Render/Latex/Italic.php | 5 + include/Text/Wiki/Render/Latex/List.php | 57 + include/Text/Wiki/Render/Latex/Newline.php | 12 + include/Text/Wiki/Render/Latex/Paragraph.php | 31 + include/Text/Wiki/Render/Latex/Phplookup.php | 34 + include/Text/Wiki/Render/Latex/Prefilter.php | 40 + include/Text/Wiki/Render/Latex/Raw.php | 23 + include/Text/Wiki/Render/Latex/Revise.php | 38 + include/Text/Wiki/Render/Latex/Strong.php | 30 + include/Text/Wiki/Render/Latex/Superscript.php | 31 + include/Text/Wiki/Render/Latex/Table.php | 93 + include/Text/Wiki/Render/Latex/Tighten.php | 9 + include/Text/Wiki/Render/Latex/Toc.php | 30 + include/Text/Wiki/Render/Latex/Tt.php | 30 + include/Text/Wiki/Render/Latex/Url.php | 35 + include/Text/Wiki/Render/Latex/Wikilink.php | 60 + include/Text/Wiki/Render/Plain.php | 16 + include/Text/Wiki/Render/Plain/Anchor.php | 23 + include/Text/Wiki/Render/Plain/Blockquote.php | 39 + include/Text/Wiki/Render/Plain/Bold.php | 23 + include/Text/Wiki/Render/Plain/Break.php | 24 + include/Text/Wiki/Render/Plain/Center.php | 23 + include/Text/Wiki/Render/Plain/Code.php | 24 + include/Text/Wiki/Render/Plain/Colortext.php | 23 + include/Text/Wiki/Render/Plain/Deflist.php | 59 + include/Text/Wiki/Render/Plain/Delimiter.php | 23 + include/Text/Wiki/Render/Plain/Embed.php | 23 + include/Text/Wiki/Render/Plain/Emphasis.php | 23 + include/Text/Wiki/Render/Plain/Freelink.php | 23 + include/Text/Wiki/Render/Plain/Function.php | 39 + include/Text/Wiki/Render/Plain/Heading.php | 14 + include/Text/Wiki/Render/Plain/Horiz.php | 23 + include/Text/Wiki/Render/Plain/Html.php | 24 + include/Text/Wiki/Render/Plain/Image.php | 22 + include/Text/Wiki/Render/Plain/Include.php | 8 + include/Text/Wiki/Render/Plain/Interwiki.php | 23 + include/Text/Wiki/Render/Plain/Italic.php | 23 + include/Text/Wiki/Render/Plain/List.php | 68 + include/Text/Wiki/Render/Plain/Newline.php | 12 + include/Text/Wiki/Render/Plain/Paragraph.php | 31 + include/Text/Wiki/Render/Plain/Phplookup.php | 25 + include/Text/Wiki/Render/Plain/Prefilter.php | 40 + include/Text/Wiki/Render/Plain/Raw.php | 23 + include/Text/Wiki/Render/Plain/Revise.php | 24 + include/Text/Wiki/Render/Plain/Strong.php | 24 + include/Text/Wiki/Render/Plain/Superscript.php | 23 + include/Text/Wiki/Render/Plain/Table.php | 57 + include/Text/Wiki/Render/Plain/Tighten.php | 10 + include/Text/Wiki/Render/Plain/Toc.php | 39 + include/Text/Wiki/Render/Plain/Tt.php | 24 + include/Text/Wiki/Render/Plain/Url.php | 25 + include/Text/Wiki/Render/Plain/Wikilink.php | 24 + include/Text/Wiki/Render/Xhtml.php | 33 + include/Text/Wiki/Render/Xhtml/Anchor.php | 37 + include/Text/Wiki/Render/Xhtml/Blockquote.php | 46 + include/Text/Wiki/Render/Xhtml/Bold.php | 34 + include/Text/Wiki/Render/Xhtml/Break.php | 29 + include/Text/Wiki/Render/Xhtml/Center.php | 29 + include/Text/Wiki/Render/Xhtml/Code.php | 102 + include/Text/Wiki/Render/Xhtml/Colortext.php | 56 + include/Text/Wiki/Render/Xhtml/Deflist.php | 64 + include/Text/Wiki/Render/Xhtml/Delimiter.php | 23 + include/Text/Wiki/Render/Xhtml/Embed.php | 23 + include/Text/Wiki/Render/Xhtml/Emphasis.php | 35 + include/Text/Wiki/Render/Xhtml/Freelink.php | 9 + include/Text/Wiki/Render/Xhtml/Function.php | 87 + include/Text/Wiki/Render/Xhtml/Heading.php | 29 + include/Text/Wiki/Render/Xhtml/Horiz.php | 28 + include/Text/Wiki/Render/Xhtml/Html.php | 24 + include/Text/Wiki/Render/Xhtml/Image.php | 156 + include/Text/Wiki/Render/Xhtml/Include.php | 8 + include/Text/Wiki/Render/Xhtml/Interwiki.php | 74 + include/Text/Wiki/Render/Xhtml/Italic.php | 34 + include/Text/Wiki/Render/Xhtml/List.php | 142 + include/Text/Wiki/Render/Xhtml/Newline.php | 12 + include/Text/Wiki/Render/Xhtml/Paragraph.php | 36 + include/Text/Wiki/Render/Xhtml/Phplookup.php | 59 + include/Text/Wiki/Render/Xhtml/Prefilter.php | 40 + include/Text/Wiki/Render/Xhtml/Raw.php | 23 + include/Text/Wiki/Render/Xhtml/Revise.php | 45 + include/Text/Wiki/Render/Xhtml/Strong.php | 35 + include/Text/Wiki/Render/Xhtml/Superscript.php | 34 + include/Text/Wiki/Render/Xhtml/Table.php | 98 + include/Text/Wiki/Render/Xhtml/Tighten.php | 10 + include/Text/Wiki/Render/Xhtml/Toc.php | 80 + include/Text/Wiki/Render/Xhtml/Tt.php | 35 + include/Text/Wiki/Render/Xhtml/Url.php | 95 + include/Text/Wiki/Render/Xhtml/Wikilink.php | 137 + include/admin/compose.php | 78 + include/admin/edit.php | 56 + include/admin/files.php | 233 + include/admin/index.php | 110 + include/admin/menus.php | 235 + include/admin/options.php | 78 + include/admin/pages.php | 187 + include/admin/plugins.php | 38 + include/admin/prefs.php | 31 + include/admin/users.php | 53 + include/admin/webdav.php | 20 + include/classTextile.php | 952 ++++ include/diogenes.admin.inc.php | 87 + include/diogenes.barrel.inc.php | 488 ++ include/diogenes.common.inc.php | 60 + include/diogenes.compose.inc.php | 81 + include/diogenes.cvs.inc.php | 187 + include/diogenes.globals.inc.php.in | 181 + include/diogenes.icons.inc.php | 185 + include/diogenes.page.inc.php | 359 ++ include/diogenes.rcs.inc.php | 617 +++ include/diogenes.session.inc.php | 181 + include/diogenes.spool.inc.php | 177 + include/diogenes.toplevel.inc.php | 107 + include/diogenes.webdav.inc.php | 627 +++ include/diogenes.webdav.logger.inc.php | 87 + include/diogenes/AUTHORS | 19 + include/diogenes/ChangeLog | 96 + include/diogenes/diogenes.core.globals.inc.php | 96 + include/diogenes/diogenes.core.logger.inc.php | 137 + include/diogenes/diogenes.core.page.inc.php | 389 ++ include/diogenes/diogenes.core.session.inc.php | 197 + include/diogenes/diogenes.database-creator.inc.php | 258 + include/diogenes/diogenes.database.inc.php | 274 + include/diogenes/diogenes.database.table.inc.php | 71 + include/diogenes/diogenes.flagset.inc.php | 105 + include/diogenes/diogenes.hermes.inc.php | 147 + include/diogenes/diogenes.logger-view.inc.php | 390 ++ include/diogenes/diogenes.mailer.inc.php | 199 + include/diogenes/diogenes.mime.inc.php | 157 + include/diogenes/diogenes.misc.inc.php | 243 + include/diogenes/diogenes.query.inc.php | 94 + include/diogenes/diogenes.table-editor.inc.php | 553 ++ include/diogenes/templates/database-debug.tpl | 29 + include/diogenes/templates/logger-view.tpl | 107 + include/diogenes/templates/table-editor.tpl | 149 + include/phplayersmenu/PHPLIB.php | 565 ++ include/phplayersmenu/layersmenu-common.inc.php | 699 +++ include/phplayersmenu/treemenu.inc.php | 305 ++ plugins/FileList.php | 148 + plugins/HtmlHead.php | 54 + plugins/HttpHeader.php | 54 + plugins/LinksMagic.php | 60 + plugins/MailForm.php | 134 + plugins/RenderPhp.php | 47 + plugins/TextileMarkup.php | 57 + plugins/WikiMarkup.php | 56 + po/Makefile | 59 + po/diogenes.pot | 1480 ++++++ po/es.po | 1528 ++++++ po/fr.po | 1536 ++++++ po/nl.po | 1775 +++++++ po/shtool | 716 +++ po/sv.po | 1525 ++++++ style.css | 43 + templates/admin-edit.tpl | 24 + templates/admin-ekit.tpl | 60 + templates/admin-files.tpl | 36 + templates/admin-index.tpl | 17 + templates/admin-kafenio.tpl | 68 + templates/admin-menus.tpl | 98 + templates/admin-options.tpl | 64 + templates/admin-prefs.tpl | 19 + templates/admin-revs.tpl | 69 + templates/admin-users.tpl | 36 + templates/admin-webdav.tpl | 7 + templates/barrel-editor.tpl | 111 + templates/footer.tpl | 14 + templates/header.tpl | 22 + templates/header/debug.tpl | 49 + templates/header/head.tpl | 14 + templates/header/phplayersmenu.tpl | 28 + templates/header/sidebar.tpl | 3 + templates/header/status.tpl | 7 + templates/header/toolbar.tpl | 7 + templates/index.tpl | 9 + templates/login.tpl | 59 + templates/master.tpl | 6 + templates/page-browser.tpl | 92 + templates/page-properties.tpl | 126 + templates/plugin-editor.tpl | 74 + templates/prefs.tpl | 80 + templates/toplevel-admins.tpl | 34 + templates/toplevel-boot.tpl | 0 templates/toplevel-options.tpl | 68 + templates/toplevel-options_expert.tpl | 23 + templates/toplevel-plugins.tpl | 18 + templates/toplevel-sites.tpl | 5 + testing/DBTest.php | 96 + testing/DiogenesLoggerViewTest.php | 140 + testing/InternalTest.php | 26 + testing/README | 165 + testing/TestHelpers.php | 18 + testing/alltests | 39 + testing/assert.patch | 92 + testing/run | 5 + 429 files changed, 47573 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 Makefile create mode 100644 README create mode 100644 classes.dia create mode 100644 config/apache.conf create mode 100755 config/checkspool.pl create mode 100644 config/db/diogenes.logactions.sql create mode 100644 config/db/diogenes.sql create mode 100644 config/diogenes.config.inc.php.dist create mode 100755 config/make_dirs.sh create mode 100755 config/updatedb.php create mode 100755 cvs.pl create mode 100644 debian/README.Debian create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/diogenes.config create mode 100644 debian/diogenes.config.inc.php create mode 100644 debian/diogenes.debian.inc.php create mode 100644 debian/diogenes.postinst create mode 100644 debian/diogenes.postrm create mode 100644 debian/diogenes.prerm create mode 100644 debian/diogenes.templates create mode 100644 debian/po/POTFILES.in create mode 100644 debian/po/cs.po create mode 100644 debian/po/de.po create mode 100644 debian/po/es.po create mode 100644 debian/po/fr.po create mode 100644 debian/po/templates.pot create mode 100644 debian/po/vi.po create mode 100644 debian/prefix.sql create mode 100755 debian/rules create mode 100644 debian/watch create mode 100644 diogenes.kdevelop create mode 100644 htdocs/common.css create mode 100644 htdocs/ekitapplet.jar create mode 100644 htdocs/gnu-regexp-1.1.4.jar create mode 100644 htdocs/images/Makefile create mode 100644 htdocs/images/action-add.png create mode 100644 htdocs/images/action-delete.png create mode 100644 htdocs/images/action-edit.png create mode 100644 htdocs/images/action-plugins.png create mode 100644 htdocs/images/action-properties.png create mode 100644 htdocs/images/action-remove.png create mode 100644 htdocs/images/action-rename.png create mode 100644 htdocs/images/action-revisions.png create mode 100644 htdocs/images/action-update.png create mode 100644 htdocs/images/action-view.png create mode 100644 htdocs/images/banner.png create mode 100644 htdocs/images/barrel-directory.png create mode 100644 htdocs/images/barrel-home.png create mode 100644 htdocs/images/barrel.gif create mode 100644 htdocs/images/favicon.png create mode 100644 htdocs/images/gartoon.defs create mode 100644 htdocs/images/link-external.png create mode 100644 htdocs/images/link-secure.gif create mode 100644 htdocs/images/menu-back.gif create mode 100644 htdocs/images/mime-audio.png create mode 100644 htdocs/images/mime-compressed.png create mode 100644 htdocs/images/mime-deb.png create mode 100644 htdocs/images/mime-drm.png create mode 100644 htdocs/images/mime-excel.png create mode 100644 htdocs/images/mime-html.png create mode 100644 htdocs/images/mime-image.png create mode 100644 htdocs/images/mime-lyx.png create mode 100644 htdocs/images/mime-msword.png create mode 100644 htdocs/images/mime-pdf.png create mode 100644 htdocs/images/mime-postscript.png create mode 100644 htdocs/images/mime-powerpoint.png create mode 100644 htdocs/images/mime-text.png create mode 100644 htdocs/images/mime-unknown.png create mode 100644 htdocs/images/mime-video.png create mode 100644 htdocs/images/mime-xml.png create mode 100644 htdocs/images/perm-admin.png create mode 100644 htdocs/images/perm-auth.png create mode 100644 htdocs/images/perm-forbidden.png create mode 100644 htdocs/images/perm-public.png create mode 100644 htdocs/images/perm-user.png create mode 100644 htdocs/index.php create mode 100644 htdocs/kafenio-config.jar create mode 100644 htdocs/kafenio-icons.jar create mode 100644 htdocs/kafenio.jar create mode 100644 htdocs/links-main.css create mode 100644 htdocs/links-sidebar.css create mode 100644 htdocs/md5.js create mode 100644 htdocs/phplayersmenu/gnome/style.css create mode 100644 htdocs/phplayersmenu/gnome/tree_collapse.png create mode 100644 htdocs/phplayersmenu/gnome/tree_collapse_corner.png create mode 100644 htdocs/phplayersmenu/gnome/tree_collapse_first.png create mode 100644 htdocs/phplayersmenu/gnome/tree_corner.png create mode 100644 htdocs/phplayersmenu/gnome/tree_expand.png create mode 100644 htdocs/phplayersmenu/gnome/tree_expand_corner.png create mode 100644 htdocs/phplayersmenu/gnome/tree_expand_first.png create mode 100644 htdocs/phplayersmenu/gnome/tree_folder_closed.png create mode 100644 htdocs/phplayersmenu/gnome/tree_folder_open.png create mode 100644 htdocs/phplayersmenu/gnome/tree_leaf.png create mode 100644 htdocs/phplayersmenu/gnome/tree_space.png create mode 100644 htdocs/phplayersmenu/gnome/tree_split.png create mode 100644 htdocs/phplayersmenu/gnome/tree_split_first.png create mode 100644 htdocs/phplayersmenu/gnome/tree_vertline.png create mode 100644 htdocs/phplayersmenu/gorilla/style.css create mode 100644 htdocs/phplayersmenu/gorilla/tree_collapse.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_collapse_corner.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_collapse_first.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_corner.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_expand.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_expand_corner.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_expand_first.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_folder_closed.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_folder_open.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_leaf.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_space.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_split.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_split_first.png create mode 100644 htdocs/phplayersmenu/gorilla/tree_vertline.png create mode 100644 htdocs/phplayersmenu/layerstreemenu-cookies.js create mode 100644 htdocs/phplayersmenu/layerstreemenu-nocookies.js create mode 100644 htdocs/phplayersmenu/layerstreemenu.ijs create mode 100644 htdocs/phplayersmenu/lush/style.css create mode 100644 htdocs/phplayersmenu/lush/tree_collapse.png create mode 100644 htdocs/phplayersmenu/lush/tree_collapse_corner.png create mode 100644 htdocs/phplayersmenu/lush/tree_collapse_first.png create mode 100644 htdocs/phplayersmenu/lush/tree_corner.png create mode 100644 htdocs/phplayersmenu/lush/tree_expand.png create mode 100644 htdocs/phplayersmenu/lush/tree_expand_corner.png create mode 100644 htdocs/phplayersmenu/lush/tree_expand_first.png create mode 100644 htdocs/phplayersmenu/lush/tree_folder_closed.png create mode 100644 htdocs/phplayersmenu/lush/tree_folder_open.png create mode 100644 htdocs/phplayersmenu/lush/tree_leaf.png create mode 100644 htdocs/phplayersmenu/lush/tree_space.png create mode 100644 htdocs/phplayersmenu/lush/tree_split.png create mode 100644 htdocs/phplayersmenu/lush/tree_split_first.png create mode 100644 htdocs/phplayersmenu/lush/tree_vertline.png create mode 100644 htdocs/phplayersmenu/mozilla/style.css create mode 100644 htdocs/phplayersmenu/mozilla/tree_collapse.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_collapse_corner.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_collapse_first.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_corner.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_expand.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_expand_corner.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_expand_first.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_folder_closed.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_folder_open.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_leaf.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_space.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_split.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_split_first.png create mode 100644 htdocs/phplayersmenu/mozilla/tree_vertline.png create mode 100644 htdocs/prefs.php create mode 100644 htdocs/site.php create mode 100644 htdocs/toplevel.css create mode 100644 htdocs/toplevel/accounts.php create mode 100644 htdocs/toplevel/admins.php create mode 100644 htdocs/toplevel/boot.php create mode 100644 htdocs/toplevel/index.php create mode 100644 htdocs/toplevel/logger.php create mode 100644 htdocs/toplevel/logger_actions.php create mode 100644 htdocs/toplevel/options.php create mode 100644 htdocs/toplevel/options_expert.php create mode 100644 htdocs/toplevel/plugins.php create mode 100644 include/Barrel.php create mode 100644 include/Barrel/Editor.php create mode 100644 include/Barrel/File.php create mode 100644 include/Barrel/Options.php create mode 100644 include/Barrel/Page.php create mode 100644 include/HTTP/WebDAV/Server.php create mode 100644 include/HTTP/WebDAV/Tools/_parse_lockinfo.php create mode 100644 include/HTTP/WebDAV/Tools/_parse_propfind.php create mode 100644 include/HTTP/WebDAV/Tools/_parse_proppatch.php create mode 100644 include/Plugin/Editor.php create mode 100644 include/Plugin/Filter.php create mode 100644 include/Plugin/Render.php create mode 100644 include/Plugin/Skel.php create mode 100644 include/Plugins.php create mode 100644 include/Text/Wiki.php create mode 100644 include/Text/Wiki/Parse.php create mode 100644 include/Text/Wiki/Parse/Default/Anchor.php create mode 100644 include/Text/Wiki/Parse/Default/Blockquote.php create mode 100644 include/Text/Wiki/Parse/Default/Bold.php create mode 100644 include/Text/Wiki/Parse/Default/Break.php create mode 100644 include/Text/Wiki/Parse/Default/Center.php create mode 100644 include/Text/Wiki/Parse/Default/Code.php create mode 100644 include/Text/Wiki/Parse/Default/Colortext.php create mode 100644 include/Text/Wiki/Parse/Default/Deflist.php create mode 100644 include/Text/Wiki/Parse/Default/Delimiter.php create mode 100644 include/Text/Wiki/Parse/Default/Embed.php create mode 100644 include/Text/Wiki/Parse/Default/Emphasis.php create mode 100644 include/Text/Wiki/Parse/Default/Freelink.php create mode 100644 include/Text/Wiki/Parse/Default/Function.php create mode 100644 include/Text/Wiki/Parse/Default/Heading.php create mode 100644 include/Text/Wiki/Parse/Default/Horiz.php create mode 100644 include/Text/Wiki/Parse/Default/Html.php create mode 100644 include/Text/Wiki/Parse/Default/Image.php create mode 100644 include/Text/Wiki/Parse/Default/Include.php create mode 100644 include/Text/Wiki/Parse/Default/Interwiki.php create mode 100644 include/Text/Wiki/Parse/Default/Italic.php create mode 100644 include/Text/Wiki/Parse/Default/List.php create mode 100644 include/Text/Wiki/Parse/Default/Newline.php create mode 100644 include/Text/Wiki/Parse/Default/Paragraph.php create mode 100644 include/Text/Wiki/Parse/Default/Phplookup.php create mode 100644 include/Text/Wiki/Parse/Default/Prefilter.php create mode 100644 include/Text/Wiki/Parse/Default/Raw.php create mode 100644 include/Text/Wiki/Parse/Default/Revise.php create mode 100644 include/Text/Wiki/Parse/Default/Strong.php create mode 100644 include/Text/Wiki/Parse/Default/Superscript.php create mode 100644 include/Text/Wiki/Parse/Default/Table.php create mode 100644 include/Text/Wiki/Parse/Default/Tighten.php create mode 100644 include/Text/Wiki/Parse/Default/Toc.php create mode 100644 include/Text/Wiki/Parse/Default/Tt.php create mode 100644 include/Text/Wiki/Parse/Default/Url.php create mode 100644 include/Text/Wiki/Parse/Default/Wikilink.php create mode 100644 include/Text/Wiki/Render.php create mode 100644 include/Text/Wiki/Render/Latex.php create mode 100644 include/Text/Wiki/Render/Latex/Anchor.php create mode 100644 include/Text/Wiki/Render/Latex/Blockquote.php create mode 100644 include/Text/Wiki/Render/Latex/Bold.php create mode 100644 include/Text/Wiki/Render/Latex/Break.php create mode 100644 include/Text/Wiki/Render/Latex/Center.php create mode 100644 include/Text/Wiki/Render/Latex/Code.php create mode 100644 include/Text/Wiki/Render/Latex/Colortext.php create mode 100644 include/Text/Wiki/Render/Latex/Deflist.php create mode 100644 include/Text/Wiki/Render/Latex/Delimiter.php create mode 100644 include/Text/Wiki/Render/Latex/Embed.php create mode 100644 include/Text/Wiki/Render/Latex/Emphasis.php create mode 100644 include/Text/Wiki/Render/Latex/Freelink.php create mode 100644 include/Text/Wiki/Render/Latex/Function.php create mode 100644 include/Text/Wiki/Render/Latex/Heading.php create mode 100644 include/Text/Wiki/Render/Latex/Horiz.php create mode 100644 include/Text/Wiki/Render/Latex/Html.php create mode 100644 include/Text/Wiki/Render/Latex/Image.php create mode 100644 include/Text/Wiki/Render/Latex/Include.php create mode 100644 include/Text/Wiki/Render/Latex/Interwiki.php create mode 100644 include/Text/Wiki/Render/Latex/Italic.php create mode 100644 include/Text/Wiki/Render/Latex/List.php create mode 100644 include/Text/Wiki/Render/Latex/Newline.php create mode 100644 include/Text/Wiki/Render/Latex/Paragraph.php create mode 100644 include/Text/Wiki/Render/Latex/Phplookup.php create mode 100644 include/Text/Wiki/Render/Latex/Prefilter.php create mode 100644 include/Text/Wiki/Render/Latex/Raw.php create mode 100644 include/Text/Wiki/Render/Latex/Revise.php create mode 100644 include/Text/Wiki/Render/Latex/Strong.php create mode 100644 include/Text/Wiki/Render/Latex/Superscript.php create mode 100644 include/Text/Wiki/Render/Latex/Table.php create mode 100644 include/Text/Wiki/Render/Latex/Tighten.php create mode 100644 include/Text/Wiki/Render/Latex/Toc.php create mode 100644 include/Text/Wiki/Render/Latex/Tt.php create mode 100644 include/Text/Wiki/Render/Latex/Url.php create mode 100644 include/Text/Wiki/Render/Latex/Wikilink.php create mode 100644 include/Text/Wiki/Render/Plain.php create mode 100644 include/Text/Wiki/Render/Plain/Anchor.php create mode 100644 include/Text/Wiki/Render/Plain/Blockquote.php create mode 100644 include/Text/Wiki/Render/Plain/Bold.php create mode 100644 include/Text/Wiki/Render/Plain/Break.php create mode 100644 include/Text/Wiki/Render/Plain/Center.php create mode 100644 include/Text/Wiki/Render/Plain/Code.php create mode 100644 include/Text/Wiki/Render/Plain/Colortext.php create mode 100644 include/Text/Wiki/Render/Plain/Deflist.php create mode 100644 include/Text/Wiki/Render/Plain/Delimiter.php create mode 100644 include/Text/Wiki/Render/Plain/Embed.php create mode 100644 include/Text/Wiki/Render/Plain/Emphasis.php create mode 100644 include/Text/Wiki/Render/Plain/Freelink.php create mode 100644 include/Text/Wiki/Render/Plain/Function.php create mode 100644 include/Text/Wiki/Render/Plain/Heading.php create mode 100644 include/Text/Wiki/Render/Plain/Horiz.php create mode 100644 include/Text/Wiki/Render/Plain/Html.php create mode 100644 include/Text/Wiki/Render/Plain/Image.php create mode 100644 include/Text/Wiki/Render/Plain/Include.php create mode 100644 include/Text/Wiki/Render/Plain/Interwiki.php create mode 100644 include/Text/Wiki/Render/Plain/Italic.php create mode 100644 include/Text/Wiki/Render/Plain/List.php create mode 100644 include/Text/Wiki/Render/Plain/Newline.php create mode 100644 include/Text/Wiki/Render/Plain/Paragraph.php create mode 100644 include/Text/Wiki/Render/Plain/Phplookup.php create mode 100644 include/Text/Wiki/Render/Plain/Prefilter.php create mode 100644 include/Text/Wiki/Render/Plain/Raw.php create mode 100644 include/Text/Wiki/Render/Plain/Revise.php create mode 100644 include/Text/Wiki/Render/Plain/Strong.php create mode 100644 include/Text/Wiki/Render/Plain/Superscript.php create mode 100644 include/Text/Wiki/Render/Plain/Table.php create mode 100644 include/Text/Wiki/Render/Plain/Tighten.php create mode 100644 include/Text/Wiki/Render/Plain/Toc.php create mode 100644 include/Text/Wiki/Render/Plain/Tt.php create mode 100644 include/Text/Wiki/Render/Plain/Url.php create mode 100644 include/Text/Wiki/Render/Plain/Wikilink.php create mode 100644 include/Text/Wiki/Render/Xhtml.php create mode 100644 include/Text/Wiki/Render/Xhtml/Anchor.php create mode 100644 include/Text/Wiki/Render/Xhtml/Blockquote.php create mode 100644 include/Text/Wiki/Render/Xhtml/Bold.php create mode 100644 include/Text/Wiki/Render/Xhtml/Break.php create mode 100644 include/Text/Wiki/Render/Xhtml/Center.php create mode 100644 include/Text/Wiki/Render/Xhtml/Code.php create mode 100644 include/Text/Wiki/Render/Xhtml/Colortext.php create mode 100644 include/Text/Wiki/Render/Xhtml/Deflist.php create mode 100644 include/Text/Wiki/Render/Xhtml/Delimiter.php create mode 100644 include/Text/Wiki/Render/Xhtml/Embed.php create mode 100644 include/Text/Wiki/Render/Xhtml/Emphasis.php create mode 100644 include/Text/Wiki/Render/Xhtml/Freelink.php create mode 100644 include/Text/Wiki/Render/Xhtml/Function.php create mode 100644 include/Text/Wiki/Render/Xhtml/Heading.php create mode 100644 include/Text/Wiki/Render/Xhtml/Horiz.php create mode 100644 include/Text/Wiki/Render/Xhtml/Html.php create mode 100644 include/Text/Wiki/Render/Xhtml/Image.php create mode 100644 include/Text/Wiki/Render/Xhtml/Include.php create mode 100644 include/Text/Wiki/Render/Xhtml/Interwiki.php create mode 100644 include/Text/Wiki/Render/Xhtml/Italic.php create mode 100644 include/Text/Wiki/Render/Xhtml/List.php create mode 100644 include/Text/Wiki/Render/Xhtml/Newline.php create mode 100644 include/Text/Wiki/Render/Xhtml/Paragraph.php create mode 100644 include/Text/Wiki/Render/Xhtml/Phplookup.php create mode 100644 include/Text/Wiki/Render/Xhtml/Prefilter.php create mode 100644 include/Text/Wiki/Render/Xhtml/Raw.php create mode 100644 include/Text/Wiki/Render/Xhtml/Revise.php create mode 100644 include/Text/Wiki/Render/Xhtml/Strong.php create mode 100644 include/Text/Wiki/Render/Xhtml/Superscript.php create mode 100644 include/Text/Wiki/Render/Xhtml/Table.php create mode 100644 include/Text/Wiki/Render/Xhtml/Tighten.php create mode 100644 include/Text/Wiki/Render/Xhtml/Toc.php create mode 100644 include/Text/Wiki/Render/Xhtml/Tt.php create mode 100644 include/Text/Wiki/Render/Xhtml/Url.php create mode 100644 include/Text/Wiki/Render/Xhtml/Wikilink.php create mode 100644 include/admin/compose.php create mode 100644 include/admin/edit.php create mode 100644 include/admin/files.php create mode 100644 include/admin/index.php create mode 100644 include/admin/menus.php create mode 100644 include/admin/options.php create mode 100644 include/admin/pages.php create mode 100644 include/admin/plugins.php create mode 100644 include/admin/prefs.php create mode 100644 include/admin/users.php create mode 100644 include/admin/webdav.php create mode 100644 include/classTextile.php create mode 100644 include/diogenes.admin.inc.php create mode 100644 include/diogenes.barrel.inc.php create mode 100644 include/diogenes.common.inc.php create mode 100644 include/diogenes.compose.inc.php create mode 100644 include/diogenes.cvs.inc.php create mode 100644 include/diogenes.globals.inc.php.in create mode 100644 include/diogenes.icons.inc.php create mode 100644 include/diogenes.page.inc.php create mode 100644 include/diogenes.rcs.inc.php create mode 100644 include/diogenes.session.inc.php create mode 100644 include/diogenes.spool.inc.php create mode 100644 include/diogenes.toplevel.inc.php create mode 100644 include/diogenes.webdav.inc.php create mode 100644 include/diogenes.webdav.logger.inc.php create mode 100644 include/diogenes/AUTHORS create mode 100644 include/diogenes/ChangeLog create mode 100644 include/diogenes/diogenes.core.globals.inc.php create mode 100644 include/diogenes/diogenes.core.logger.inc.php create mode 100644 include/diogenes/diogenes.core.page.inc.php create mode 100644 include/diogenes/diogenes.core.session.inc.php create mode 100644 include/diogenes/diogenes.database-creator.inc.php create mode 100644 include/diogenes/diogenes.database.inc.php create mode 100644 include/diogenes/diogenes.database.table.inc.php create mode 100644 include/diogenes/diogenes.flagset.inc.php create mode 100644 include/diogenes/diogenes.hermes.inc.php create mode 100644 include/diogenes/diogenes.logger-view.inc.php create mode 100644 include/diogenes/diogenes.mailer.inc.php create mode 100644 include/diogenes/diogenes.mime.inc.php create mode 100644 include/diogenes/diogenes.misc.inc.php create mode 100644 include/diogenes/diogenes.query.inc.php create mode 100644 include/diogenes/diogenes.table-editor.inc.php create mode 100644 include/diogenes/templates/database-debug.tpl create mode 100644 include/diogenes/templates/logger-view.tpl create mode 100644 include/diogenes/templates/table-editor.tpl create mode 100644 include/phplayersmenu/PHPLIB.php create mode 100644 include/phplayersmenu/layersmenu-common.inc.php create mode 100644 include/phplayersmenu/treemenu.inc.php create mode 100644 plugins/FileList.php create mode 100644 plugins/HtmlHead.php create mode 100644 plugins/HttpHeader.php create mode 100644 plugins/LinksMagic.php create mode 100644 plugins/MailForm.php create mode 100644 plugins/RenderPhp.php create mode 100644 plugins/TextileMarkup.php create mode 100644 plugins/WikiMarkup.php create mode 100644 po/Makefile create mode 100644 po/diogenes.pot create mode 100644 po/es.po create mode 100644 po/fr.po create mode 100644 po/nl.po create mode 100755 po/shtool create mode 100644 po/sv.po create mode 100644 style.css create mode 100644 templates/admin-edit.tpl create mode 100644 templates/admin-ekit.tpl create mode 100644 templates/admin-files.tpl create mode 100644 templates/admin-index.tpl create mode 100644 templates/admin-kafenio.tpl create mode 100644 templates/admin-menus.tpl create mode 100644 templates/admin-options.tpl create mode 100644 templates/admin-prefs.tpl create mode 100644 templates/admin-revs.tpl create mode 100644 templates/admin-users.tpl create mode 100644 templates/admin-webdav.tpl create mode 100644 templates/barrel-editor.tpl create mode 100644 templates/footer.tpl create mode 100644 templates/header.tpl create mode 100644 templates/header/debug.tpl create mode 100644 templates/header/head.tpl create mode 100644 templates/header/phplayersmenu.tpl create mode 100644 templates/header/sidebar.tpl create mode 100644 templates/header/status.tpl create mode 100644 templates/header/toolbar.tpl create mode 100644 templates/index.tpl create mode 100644 templates/login.tpl create mode 100644 templates/master.tpl create mode 100644 templates/page-browser.tpl create mode 100644 templates/page-properties.tpl create mode 100644 templates/plugin-editor.tpl create mode 100644 templates/prefs.tpl create mode 100644 templates/toplevel-admins.tpl create mode 100644 templates/toplevel-boot.tpl create mode 100644 templates/toplevel-options.tpl create mode 100644 templates/toplevel-options_expert.tpl create mode 100644 templates/toplevel-plugins.tpl create mode 100644 templates/toplevel-sites.tpl create mode 100644 testing/DBTest.php create mode 100644 testing/DiogenesLoggerViewTest.php create mode 100644 testing/InternalTest.php create mode 100644 testing/README create mode 100644 testing/TestHelpers.php create mode 100755 testing/alltests create mode 100644 testing/assert.patch create mode 100755 testing/run diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..f756b9c --- /dev/null +++ b/AUTHORS @@ -0,0 +1,26 @@ +The following people contributed to Diogenes : + +Jeremy Lainé + * original author of Diogenes + +Matthew Palmer + * testing framework + +Michiel Alkemade + * Dutch translations + +Jonas Johansson + * Swedish translations + +Pablo Castellazzi + * Spanish translations + + +Many thanks to the following people for writing the Polytechnique.edu +administration interface from which Diogenes's barrel administration +interface is derived : + +Yann Chevalier +Jean-Sebastien Bedo +Denis Cabasson + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..0b795c1 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,167 @@ +Diogenes 0.9.18 + * improved - resync Textile plugin with Textpattern 4.0.2 + * improved - merge page catalog and file browser with slicker layout + * improved - add "home", "up", "add a page" to file browser toolbar + * fixed - PHP5 compatibility fixes + * improved - refresh Dutch translations (thanks Michiel!) + * improved - add support for OMA DRM contents + * improved - switch to XHTML 1.0 strict + * improved - add debugging and W3C validation options in global options + +Diogenes 0.9.17.2 + * fixed - handle log messages with quotes properly + +Diogenes 0.9.17.1 + * improved - fix URL rewriting to allow access to barrel 'foo' via + (..)/site.php/foo/ as well as (..)/site/foo/ + +Diogenes 0.9.17 + * improved - recognise additional MIME types and associated icons + * added - add a generic plugin mechanism + * added - add MailForm plugin to display a mail form to a fixed recipient + * added - add FileList plugin to display a directory listing with icons + * added - add an option to create an empty file + * improved - use new icons to represent MIME types + * added - add WikiMarkup plugin to render Wiki markup + * added - add RenderPhp plugin to handle PHP execution of barrel pages + * improved - barrel-level templates do not apply to admin pages + * improved - merge all *_option tables into diogenes_option + * added - offer copy, move and rename file operations in file browser + * improved - add debugging options for WebDAV + * fixed - work around Apache 2 / HTTP_WebDAV_Server issue + * improved - add support for spaces in file names + * improved - add support for nested pages (abritary directory tree depth) + * fixed - correct WebDAV support for barrels on virtual hosts + * improved - directory tree is cached in a file to reduce database calls + * improved - add some icons to the admin interface + * added - add TextileMarkup plugin to handle Textile markup + * improved - beautify the barrel activity page + * improved - warn that $globals->rooturl must be full URL for some features + * added - add HttpHeader plugin to add custom HTTP headers to a page + * added - add HtmlHead plugin to add entries to a pages's block + * added - add LinksMagic plugin to highlight external and secure links + +Diogenes 0.9.16 + * improved - add a global option to control Word import + * improved - touchup the barrel activity summary + * improved - use unsigned ints instead of smallints for user/page/menu ids + +Diogenes 0.9.15 + * improved - add Kafenio as the default HTML editor + * added - user accounts now have an 'email' field + * fixed - correct escaping of PHP code when using HTML editor + * added - new bootstrapping interface to create initial admin + * added - add a toplevel option to switch HTML editor (Ekit/Kafenio) + * improved - integrate user preferences menu into barrels + * added - add an option to hide the Diogenes part of a barrel's menu + * improved - order barrels by alias in toplevel interface + +Diogenes 0.9.14 + * added - new expert mode for direct access to the global options table + * improved - new debugging toolbar and floating database trace + * fixed - always use custom function to determine mime type + +Diogenes 0.9.13 + * improved - return a Content-Length header for static content + * fixed - various fixes in the Diogenes library (see library ChangeLog) + * fixed - correct the file revision browser's 'restore' function + * fixed - make sure the CVS wrapper exits when it has no children left + * added - full Spanish translation (Pablo Castellazzi) + * fixed - pass correct baseurl and stylesheet to Ekit + +Diogenes 0.9.12 + * improved - mention what constitutes a valid barrel name + * added - allow admins to choose site-wide or page-specific templates + * improved - make PHP execution of pages more flexible + * fixed - correct handling of HTML entities in raw editor + * improved - replace unused 'visible' flag by a more flexible status selector + * improved - replace useless 'root' access level by 'forbidden' + * added - ability to add a log message to page file commits + * fixed - expand 'Edit this page' menu entry for publicly writable pages + +Diogenes 0.9.11 + * improved - stop using tables so admins can control their site's appearance + * fixed - new JavaScript MD5 which supports accentuated characters + * improved - several updates to French translation (Nicolas Bertolissio) + * improved - improved cache-control for public, static content + * improved - various layout and stylesheet enhancements + * added - include a note about customising Diogenes + * improved - stop hardcoding charset in the pages + * added - full Dutch translation (Michiel Alkemade) + * added - full Swedish translation (Jonas Johansson) + * improved - send back appropriate HTTP status codes on error pages + * improved - offer to authenticate again after login failure + +Diogenes 0.9.10 + * improved - changed DB structure for the menus for increased speed + * fixed - explicitly set magic_quotes_gpc On and register_globals Off + * added - barrels have their own set of options + * added - customisable menu expanding level + * added - integrated phpLayersMenu + * fixed - reworked Word import to make it safer and to handle images + * improved - make it possible to use a different WebDAV class + * improved - do not allow the creation of a barrel called CVSROOT + * added - selectable themes for the menu + * improved - allow customisation of the toplevel pages + +Diogenes 0.9.9.3 + * improved - split document root into separate subdirectory + * fixed - do not escape special characters in raw editor + * improved - added some missing translations + +Diogenes 0.9.9.2 + * improved - group WebDAV operations into sessions to declutter log + * improved - when logging in/out the user stays on the current page + +Diogenes 0.9.9.1 + * fixed - do not start session when in WebDAV mode (possible file corruption) + * fixed - check validity of page location + * fixed - use UNIX_TIMESTAMP when retrieving dates in log browser + * fixed - Ekit must be within a barrel (Java security violation on vhosts) + * improved - use HTML import function when a page is PUT with WebDAV + * improved - check new barrel names against list of invalid names + +Diogenes 0.9.9 + * address rewriting (mod_rewrite) is no longer required + * added support for WebDAV + * use page location exclusively for browsing (not page ID) + * fixed faulty date selection in log browser + * various code cleanups + * user-generated pages no longer have the "valid XHTML/CSS" logos + +Diogenes 0.9.8.3 + * fixed a regexp that killed old PHP versions (Word import bug) + * large speed improvements for log browsing + * enhanced database debugging + +Diogenes 0.9.8.2 + * fixed admin menu not always being displayed on public pages + * fixed distribution problems (Makefile & cvs.pl missing) + +Diogenes 0.9.8.1 + * fixed bug in diff viewing + * tightened HTML import code + +Diogenes 0.9.8 + * added customisable write access for pages + * added support for anonymous (Wiki-style) write access + * fixed extra checks on RCS operations + * added CVS support as an alternative to bare RCS (experimental) + * added toplevel page for RCS <-> CVS switching. + * fixed added missing stripslashes for page title + +Diogenes 0.9.7 + * split fullname into firstname and lastname + * improved display of authentication method (native, etc.) + * added script to update database structure + +Diogenes 0.9.6 + * reworked packaging + +Diogenes 0.9.5 + * started ChangeLog + * Ekit WYSIWYG editor integration + * allow language selection + * links to Diogenes documentation + * improved Word document handling + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..644a474 --- /dev/null +++ b/Makefile @@ -0,0 +1,70 @@ +# definitions + +VERSION = 0.9.18 +PKG_DIST = diogenes-$(VERSION) +LIB_DIST = libdiogenes-$(VERSION) + +PKG_FILES = AUTHORS ChangeLog COPYING README Makefile \ + cvs.pl style.css + +PKG_DIRS = config htdocs include locale po plugins templates + +LIB_FILES = COPYING +LIB_BASE = include/diogenes + +VCS_FILTER = ! -name .arch-ids ! -name CVS + +# global targets + +build: pkg-build lib-build + +dist: clean pkg-dist lib-dist + +clean: + rm -rf locale include/diogenes.globals.inc.php + for ext in php tpl css po; \ + do \ + find -type f -name *.$$ext~ -exec rm -f {} \; ; \ + done + +%: %.in Makefile + sed -e 's,@VERSION@,$(VERSION),g' $< > $@ + + +# diogenes package targets + +pkg-build: include/diogenes.globals.inc.php + make -C po + +pkg-dist: pkg-build + rm -rf $(PKG_DIST) $(PKG_DIST).tar.gz + mkdir $(PKG_DIST) + cp -a $(PKG_FILES) $(PKG_DIST) + for dir in `find $(PKG_DIRS) -type d $(VCS_FILTER)`; \ + do \ + mkdir -p $(PKG_DIST)/$$dir; \ + find $$dir -maxdepth 1 -type f -exec cp {} $(PKG_DIST)/$$dir \; ; \ + done + tar czf $(PKG_DIST).tar.gz $(PKG_DIST) + rm -rf $(PKG_DIST) + + +# diogenes library targets + +lib-build: + +lib-dist: lib-build + rm -rf $(LIB_DIST) + mkdir $(LIB_DIST) + cp -a $(LIB_FILES) $(LIB_DIST) + for dir in `cd $(LIB_BASE) && find -type d $(VCS_FILTER)`; \ + do \ + mkdir -p $(LIB_DIST)/$$dir; \ + find $(LIB_BASE)/$$dir -maxdepth 1 -type f -exec cp {} $(LIB_DIST)/$$dir \; ; \ + done + tar czf $(LIB_DIST).tar.gz $(LIB_DIST) + rm -rf $(LIB_DIST) + + +.PHONY: build dist clean pkg-build pkg-dist lib-build lib-dist + diff --git a/README b/README new file mode 100644 index 0000000..6d8c879 --- /dev/null +++ b/README @@ -0,0 +1,56 @@ +Notes for Diogenes + +PRESENTATION +------------ + +Diogenes is a content management system that allows you to quickly create and +host web sites for communities. It was written by the Polytechnique.org +team. More information can be found on the Diogenes project page : + + http://opensource.polytechnique.org/diogenes/ + +It is released under the terms of the GNU Public License (GPL) version 2. The +full text of this license can be found in the COPYING file included in this +distribution. + + +DOCUMENTATION & INSTALLATION +---------------------------- + +The documentation for Diogenes, including installation instructions can +be found here: + + http://doc.polytechnique.org/diogenes/ + + +CUSTOMISING DIOGENES +-------------------- + +Diogenes provides several means of customising its look and behaviour. + + * CONFIGURATION FILE + +The first thing you can modify is Diogenes's configuration file called +"diogenes.config.inc.php". To have a list of the values you can assign, take a +look at the file called "diogenes.globals.inc.php". + + * SUBCLASSING DIOGENES'S CLASSES + +Diogenes is written in Object-Oriented Programming (OOP), and it is possible to +specify the classes to use from the configuration file. For instance, if you +want to change the look and/or behaviour of Diogenes's toplevel pages you would : + +- create a class called "CustomToplevel" for instance, which derives from + "DiogenesToplevel". Let us say this class is stored in a file called + "custom.toplevel.inc.php". + +- include "custom.toplevel.inc.php" from your configuration file like this : + + require_once 'custom.toplevel.inc.php'; + +- tell Diogenes to use your CustomToplevel class to display toplevel pages by + setting the following in your configuration file : + + $globals->toplevel = "CustomToplevel"; + + diff --git a/classes.dia b/classes.dia new file mode 100644 index 0000000..8435210 --- /dev/null +++ b/classes.dia @@ -0,0 +1,5612 @@ + + + + + + + + + + + + + #A4# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #LoggerView# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #dbh# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #TableEditor# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #actions# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #autoinc# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #id# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #idfield# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #jtables# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #prefix# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #CorePage# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #CoreLogger# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #uid# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #session# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #actions# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #table_actions# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #table_events# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #table_sessions# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #DatabaseTable# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #dbh# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #table# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #vars# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #CoreGlobals# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #libroot# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #root# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #rooturl# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #db# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #dbdb# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #dbhost# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #dbuser# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #dbpwd# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #table_log_actions# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #table_log_events# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #table_log_sessions# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #session# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #gettext# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #flagset# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #value# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #sep# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Database# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #connect_id# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #_trace# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #_trace_data# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Query# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Mailer# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #CoreSession# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #challenge# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #uid# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #username# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #perms# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #HTTP_WebDAV_Server# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #path# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #http_auth_realm# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #WebDAVLogger# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #newsession# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #sessionlength# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #BarrelOptions# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #table_option# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #title# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #description# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #favicon# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #keywords# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #menu_min_level# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #menu_style# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #menu_theme# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #template# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #template_dir# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Session# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #fullname# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #auth# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #log# + + + ## + + + ## + + + #In $_SESSION# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Toplevel# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #WebDAV# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #alias# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #vhost# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #table_page# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #spool# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Page# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #dbh# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #head# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #menu# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Globals# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #root# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #spoolroot# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #rcsroot# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #rooturl# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #version# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #cssfile# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #htmlfile# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #wordfile# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #rcs# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #toplevel# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #barrel# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #session# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #webdav# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #tauth# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #tlabel# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #validatepages# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #debugdatabase# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #invalidlocations# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #invalidaliases# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #locales# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #menu_styles# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #menu_themes# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #menu_style# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #menu_theme# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #template_dir# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #template# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Barrel# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #table_menu# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #table_page# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #flags# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #options# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #pathinfo# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #PID# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #vhost# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #alias# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #canedit# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Spool# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #alias# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #datadir# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #caller# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Rcs# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #rcsdir# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Cvs# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #cvsopt# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + #port# + + + ## + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #Smarty# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + #Admin# + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #spool# + + + + + + + + ## + + + #1# + + + + + + + + + + + ## + + + #1# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #db# + + + + + + + + ## + + + #1# + + + + + + + + + + + ## + + + #1# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #dbh# + + + + + + + + ## + + + #1# + + + + + + + + + + + ## + + + #1# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #dbh# + + + + + + + + ## + + + #1# + + + + + + + + + + + ## + + + #1# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #dbh# + + + + + + + + ## + + + #1# + + + + + + + + + + + ## + + + #1# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #options# + + + + + + + + ## + + + #1# + + + + + + + + + + + ## + + + #1# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #caller# + + + + + + + + ## + + + ## + + + + + + + + + + + ## + + + ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #log# + + + + + + + + ## + + + #1# + + + + + + + + + + + ## + + + #1# + + + + + + + + + + + + + + + + diff --git a/config/apache.conf b/config/apache.conf new file mode 100644 index 0000000..b9f150a --- /dev/null +++ b/config/apache.conf @@ -0,0 +1,20 @@ +Alias /diogenes /usr/share/diogenes/htdocs + + + Options FollowSymLinks MultiViews + Order allow,deny + Allow from all + + DirectoryIndex index.php + + + php_value magic_quotes_gpc On + php_value register_globals Off + php_value include_path ".:/etc/diogenes:/usr/share/diogenes/include:/usr/share/php/smarty/libs:/usr/share/php" + + + php_value magic_quotes_gpc On + php_value register_globals Off + php_value include_path ".:/etc/diogenes:/usr/share/diogenes/include:/usr/share/php/smarty/libs:/usr/share/php" + + diff --git a/config/checkspool.pl b/config/checkspool.pl new file mode 100755 index 0000000..2ee0066 --- /dev/null +++ b/config/checkspool.pl @@ -0,0 +1,74 @@ +#!/usr/bin/perl + +use strict; +my $revision = '$Revision: 1.1 $'; + + +# compare two directories recursively +sub scandir { + my ($rRoot,$oRoot,$rPat,$oPat,$curdir) = @_; + + opendir(SPOOL,"$rRoot/$curdir") || die "can't open '$rRoot/$curdir'"; + my @entries = grep { ! /^\.{1,2}$/ } readdir SPOOL; + closedir SPOOL; + + my @children; + + # process entries + foreach my $entry(@entries) { + my $fentry = $curdir ? "$curdir/$entry" : $entry; + if ( -d "$rRoot/$fentry" ) { + if ( -d "$oRoot/$fentry" ) { + push @children,$fentry; + } else { + print "[d] $fentry\n"; + } + } else { + $fentry =~ s/$rPat/$oPat/; + ( -f "$oRoot/$fentry") or + print "[f] $fentry\n"; + } + } + + # recurse + foreach my $child(@children) { + &scandir($rRoot,$oRoot,$rPat,$oPat,$child); + } +} + + +# display usage +sub syntax { + $revision =~ s/(\$)Revision: (.*) \$$/v\2/; + + print "[ This is checkspool.pl ($revision), a checker for Diogenes's spool ]\n\n", + "Syntax:\n", + " checkspool.pl \n\n", + " Arguments:\n", + " rcs - the RCS root\n", + " spool - the spool directory\n", + "\n"; +} + + +# the main routine +sub main { + + if (@ARGV < 2) { + &syntax; + exit(1); + } + + my $rcs = $ARGV[0]; + my $spool = $ARGV[1]; + + # forward scan + print "\nNot in RCS (ignore templates_c) :\n"; + &scandir($spool,$rcs,'$',',v'); + + # reverse scan + print "\nNot in spool :\n"; + &scandir($rcs,$spool,',v$',''); +} + +&main diff --git a/config/db/diogenes.logactions.sql b/config/db/diogenes.logactions.sql new file mode 100644 index 0000000..ae34df0 --- /dev/null +++ b/config/db/diogenes.logactions.sql @@ -0,0 +1,31 @@ +# phpMyAdmin SQL Dump +# version 2.5.4 +# http://www.phpmyadmin.net +# +# Host: localhost +# Generation Time: Nov 17, 2003 at 02:35 AM +# Server version: 4.0.16 +# PHP Version: 4.3.3 +# +# Database : `diogenes` +# + +# +# Dumping data for table `diogenes_logactions` +# + +INSERT INTO diogenes_logactions VALUES (3, 'auth_ok', 'successful password authentication'); +INSERT INTO diogenes_logactions VALUES (2, 'auth_logout', 'the user logged out'); +INSERT INTO diogenes_logactions VALUES (4, 'auth_fail', 'password authentication failed'); +INSERT INTO diogenes_logactions VALUES (5, 'page_create', 'the user created a new page'); +INSERT INTO diogenes_logactions VALUES (6, 'page_delete', 'the user deleted a page'); +INSERT INTO diogenes_logactions VALUES (7, 'rcs_commit', 'Commit to RCS'); +INSERT INTO diogenes_logactions VALUES (8, 'rcs_delete', 'An RCS-managed file was deleted'); +INSERT INTO diogenes_logactions VALUES (9, 'barrel_create', 'a new barrel was created'); +INSERT INTO diogenes_logactions VALUES (10, 'barrel_delete', 'a complete barrel was deleted'); +INSERT INTO diogenes_logactions VALUES (11, 'file_upload', 'a file was uploaded'); +INSERT INTO diogenes_logactions VALUES (12, 'file_delete', 'a file was deleted'); +INSERT INTO diogenes_logactions VALUES (13, 'barrel_options', 'the barrel options were updated'); +INSERT INTO diogenes_logactions VALUES (14, 'barrel_plugins', 'the barrel plugins were modified'); +INSERT INTO diogenes_logactions VALUES (15, 'page_props', 'the page properties were updated'); +INSERT INTO diogenes_logactions VALUES (16, 'page_plugins', 'the page plugins were modified'); diff --git a/config/db/diogenes.sql b/config/db/diogenes.sql new file mode 100644 index 0000000..dad6e88 --- /dev/null +++ b/config/db/diogenes.sql @@ -0,0 +1,141 @@ +-- phpMyAdmin SQL Dump +-- version 2.6.1-pl3 +-- http://www.phpmyadmin.net +-- +-- Host: localhost +-- Generation Time: Apr 09, 2005 at 01:25 AM +-- Server version: 4.0.24 +-- PHP Version: 4.3.10-10 +-- +-- Database: `diogenes` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `diogenes_auth` +-- + +CREATE TABLE `diogenes_auth` ( + `user_id` int(10) unsigned NOT NULL auto_increment, + `username` varchar(32) NOT NULL default '', + `firstname` varchar(127) NOT NULL default '', + `lastname` varchar(127) NOT NULL default '', + `password` varchar(32) NOT NULL default '', + `perms` enum('user','admin') NOT NULL default 'user', + `email` varchar(255) NOT NULL default '', + PRIMARY KEY (`user_id`), + UNIQUE KEY `username` (`username`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `diogenes_logactions` +-- + +CREATE TABLE `diogenes_logactions` ( + `id` int(2) NOT NULL auto_increment, + `text` varchar(32) NOT NULL default '', + `description` varchar(255) NOT NULL default '', + PRIMARY KEY (`id`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `diogenes_logevents` +-- + +CREATE TABLE `diogenes_logevents` ( + `stamp` timestamp(14) NOT NULL, + `session` int(6) NOT NULL default '0', + `action` int(2) NOT NULL default '0', + `data` varchar(255) NOT NULL default '', + KEY `session` (`session`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `diogenes_logsessions` +-- + +CREATE TABLE `diogenes_logsessions` ( + `id` int(10) unsigned NOT NULL auto_increment, + `auth` enum('native','external') NOT NULL default 'native', + `uid` int(10) unsigned NOT NULL default '0', + `start` timestamp(14) NOT NULL, + `ip` varchar(64) NOT NULL default '', + `host` varchar(128) NOT NULL default '', + `sauth` enum('native','external') NOT NULL default 'native', + `suid` int(10) unsigned NOT NULL default '0', + `browser` varchar(255) NOT NULL default '', + PRIMARY KEY (`id`), + KEY `uid` (`uid`), + KEY `start` (`start`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `diogenes_option` +-- + +CREATE TABLE `diogenes_option` ( + `barrel` VARCHAR( 16 ) NOT NULL default '', + `name` varchar(32) NOT NULL default '', + `value` text NOT NULL, + PRIMARY KEY (`barrel`, `name`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `diogenes_perm` +-- + +CREATE TABLE `diogenes_perm` ( + `alias` varchar(16) NOT NULL default '', + `auth` enum('native','external') NOT NULL default 'native', + `uid` int(10) unsigned NOT NULL default '0', + `perms` enum('admin','user') NOT NULL default 'user', + PRIMARY KEY (`alias`,`auth`,`uid`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `diogenes_plugin` +-- + +CREATE TABLE `diogenes_plugin` ( + `plugin` varchar(32) NOT NULL default '', + `barrel` varchar(16) NOT NULL default '', + `page` int(10) unsigned NOT NULL default '0', + `pos` int(10) unsigned NOT NULL default '0', + `params` text NOT NULL, + PRIMARY KEY (`plugin`,`barrel`,`page`), + KEY `pos` (`pos`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `diogenes_site` +-- + +CREATE TABLE `diogenes_site` ( + `alias` varchar(16) NOT NULL default '', + `vhost` varchar(255) NOT NULL default '', + `flags` varchar(255) NOT NULL default '', + PRIMARY KEY (`alias`) +) TYPE=MyISAM; + +-- -------------------------------------------------------- + +-- +-- Set the database format version +-- + +INSERT INTO `diogenes_option` SET name='dbversion', value='0.9.16+0.9.17pre21'; diff --git a/config/diogenes.config.inc.php.dist b/config/diogenes.config.inc.php.dist new file mode 100644 index 0000000..c87bad6 --- /dev/null +++ b/config/diogenes.config.inc.php.dist @@ -0,0 +1,28 @@ +spoolroot = "/var/spool/diogenes" +$globals->rcsroot = "/var/lib/diogenes"; +$globals->root = "/var/www/diogenes"; + +/* Base url for the Diogenes system, including trailing slash. + * + * In order to make use of virtualhosts or WebDAV, please set + * this to a full URL starting with http:// or https:// for instance: + * + * $globals->rooturl = "http://www.foo.org/diogenes/"; +*/ +$globals->rooturl = "http://diogenes.polytechnique.org/"; + +// database access + +// $globals->dbdb = "diogenes"; +// $globals->dbhost = "localhost"; +// $globals->dbuser = "diogenes"; +$globals->dbpwd = "changeme"; + +// Utility to use for Word file import. +// set 'wvHtml' to make us of wv for Word import. +// var $word_import = 'wvHtml'; + +?> diff --git a/config/make_dirs.sh b/config/make_dirs.sh new file mode 100755 index 0000000..f5d1578 --- /dev/null +++ b/config/make_dirs.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +# Introductory text +# +cat << EOF +This script will create the Diogenes spool and RCS directories +and set the permissions so that the directories are writable +by the web server. + +You can cancel this script at any time using Ctrl-C. + +EOF + +echo -n "Where do you want the Diogenes RCS repository? [/var/lib/diogenes] " +read RCS_DIR +if [ "x$RCS_DIR" = "x" ]; then + RCS_DIR="/var/lib/diogenes" +fi + +echo -n "Where do you want the Diogenes spool? [/var/spool/diogenes] " +read SPOOL_DIR +if [ "x$SPOOL_DIR" = "x" ]; then + SPOOL_DIR="/var/spool/diogenes" +fi + +# Get the web server's group. +# +echo -n "Under what user does the web process run? [www-data] " +read OWNER +if [ "x$OWNER" = "x" ]; then + OWNER="www-data" +fi + +# Create directories. +# +echo +echo -n "Creating directories... " +mkdir -p $RCS_DIR +mkdir -p $SPOOL_DIR +mkdir -p $SPOOL_DIR/templates_c +echo "done." + +# Set ownership +# +echo +echo -n "Setting ownership recursively... " +chown -R $OWNER $RCS_DIR +chown -R $OWNER $SPOOL_DIR +echo "done." + diff --git a/config/updatedb.php b/config/updatedb.php new file mode 100755 index 0000000..3012f23 --- /dev/null +++ b/config/updatedb.php @@ -0,0 +1,230 @@ +#!/usr/bin/php -q +info("* Pre-upgrading master tables : diogenes_*"); + $this->preupgradeMaster($newversion); + + // upgrade barrels + $res = $this->dbh->query("select alias from diogenes_site"); + while (list($alias) = mysql_fetch_row($res)) + { + $this->info("* Upgrading barrel '$alias'"); + $this->upgradeBarrel($alias, $newversion); + } + mysql_free_result($res); + + // upgrade master tables + $this->info("* Upgrading master tables : diogenes_*"); + $this->upgradeMaster($newversion); + } + + + /** Upgrades the master (i.e. common) tables before touching the barrel tables. + * + * @param $newversion + */ + function preupgradeMaster($newversion) + { + switch($newversion) { + case "0.9.16+0.9.17pre15"; + $this->info(" - adding 'barrel' field to 'diogenes_options' table"); + $this->dbh->query("ALTER TABLE `diogenes_option` ADD `barrel` VARCHAR( 16 ) NOT NULL FIRST;"); + $this->dbh->query( + "ALTER TABLE `diogenes_option` DROP PRIMARY KEY , + ADD PRIMARY KEY ( `barrel` , `name` )"); + break; + + default: + break; + } + } + + + /** Upgrade a barrel's tables + * + * @param $alias + * @param $newversion + */ + function upgradeBarrel($alias, $newversion) + { +# $this->info("Processing : {$alias}_menu, {$alias}_page and {$alias}_option"); + + switch($newversion) { + case "0.9.10": + $this->info(" - upgrading : {$alias}_menu"); + // these field where NULL, change to NOT NULL + $this->dbh->query("ALTER TABLE `{$alias}_menu` CHANGE `link` `link` TEXT NOT NULL"); + $this->dbh->query("ALTER TABLE `{$alias}_menu` CHANGE `ordre` `ordre` SMALLINT( 6 ) UNSIGNED NOT NULL"); + $this->dbh->query("ALTER TABLE `{$alias}_menu` CHANGE `MIDpere` `MIDpere` SMALLINT( 6 ) UNSIGNED NOT NULL"); + + // break down old 'link' column into 'link' and 'PID' + $this->dbh->query("ALTER TABLE `{$alias}_menu` ADD `PID` SMALLINT( 6 ) UNSIGNED NOT NULL"); + $res2 = $this->dbh->query("select MID,link from {$alias}_menu"); + while (list($MID,$link) = mysql_fetch_row($res2)) { + switch (substr($link,0,3)) { + case "PI:": + $pid = substr($link,3); + $this->dbh->query("UPDATE `{$alias}_menu` SET link='',PID='$pid' WHERE MID='$MID'"); + break; + case "SE:": + $adr = substr($link,3); + $this->dbh->query("UPDATE `{$alias}_menu` SET link='$adr' WHERE MID='$MID'"); + break; + } + } + mysql_free_result($res2); + + $this->info(" - creating : {$alias}_option"); + $this->dbh->query("CREATE TABLE `{$alias}_option` (name VARCHAR( 32 ) NOT NULL, value TEXT NOT NULL, PRIMARY KEY (`name`)) TYPE=MyISAM;"); + + $this->info(" - registering title, description and keywords"); + $res2 = $this->dbh->query("select title,description,keywords from diogenes_site where alias='$alias'"); + list($title,$description,$keywords) = mysql_fetch_row($res2); + $this->dbh->query("replace into `{$alias}_option` set name='title',value='$title'"); + $this->dbh->query("replace into `{$alias}_option` set name='description',value='$description'"); + $this->dbh->query("replace into `{$alias}_option` set name='keywords',value='$keywords'"); + break; + + case "0.9.12": + $this->info(" - adding 'template' field"); + $this->dbh->query("ALTER TABLE `{$alias}_page` ADD `template` VARCHAR(255) NOT NULL"); + $this->info(" - dropping 'hits' field"); + $this->dbh->query("ALTER TABLE `{$alias}_page` DROP `hits`"); + $this->info(" - replacing 'visible' field by 'status'"); + $this->dbh->query("ALTER TABLE `{$alias}_page` DROP `visible`"); + $this->dbh->query("ALTER TABLE `{$alias}_page` ADD `status` tinyint(1) unsigned NOT NULL"); + $this->info(" - modifying 'perms' and 'wperms' to add 'forbidden' access"); + $this->dbh->query("ALTER TABLE `{$alias}_page` CHANGE `perms` `perms` ENUM( 'public', 'auth', 'user', 'admin', 'forbidden' ) DEFAULT 'public' NOT NULL"); + $this->dbh->query("ALTER TABLE `{$alias}_page` CHANGE `wperms` `wperms` ENUM( 'public', 'auth', 'user', 'admin', 'forbidden' ) DEFAULT 'admin' NOT NULL"); + break; + + case "0.9.16": + $this->info(" - changing page id fields to INT UNSIGNED"); + $this->dbh->query("ALTER TABLE `{$alias}_page` CHANGE `PID` `PID` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT"); + $this->dbh->query("ALTER TABLE `{$alias}_menu` CHANGE `PID` `PID` INT( 10 ) UNSIGNED NOT NULL default '0'"); + $this->info(" - changing menu id fields to INT UNSIGNED"); + $this->dbh->query("ALTER TABLE `{$alias}_menu` CHANGE `MID` `MID` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT"); + $this->dbh->query("ALTER TABLE `{$alias}_menu` CHANGE `MIDpere` `MIDpere` INT( 10 ) UNSIGNED NOT NULL default '0'"); + $this->dbh->query("ALTER TABLE `{$alias}_menu` CHANGE `ordre` `ordre` INT( 10 ) UNSIGNED NOT NULL default '0'"); + break; + + case "0.9.16+0.9.17pre15": + $this->info(" - merging '{$alias}_option' into 'diogenes_options'"); + $res = $this->dbh->query("select name,value from `{$alias}_option`"); + while (list($o_name,$o_value) = mysql_fetch_row($res)) + { + $this->dbh->query("insert into `diogenes_option` set barrel='$alias',name='$o_name',value='".addslashes($o_value)."'"); + } + mysql_free_result($res); + $this->info(" - dropping '{$alias}_option'"); + $this->dbh->query("drop table `{$alias}_option`"); + + $this->info(" - adding 'parent' field to `{$alias}_page`"); + $this->dbh->query("ALTER TABLE `{$alias}_page` ADD `parent` INT( 10 ) UNSIGNED NOT NULL default '0' AFTER `PID`"); + $res = $this->dbh->query("select PID from `{$alias}_page` where location=''"); + list($homepage) = mysql_fetch_row($res); + $this->dbh->query("update `{$alias}_page` set parent='$homepage' where location!=''"); + + $this->info(" - ordering `{$alias}_page` entries by `location`"); + $this->dbh->query("ALTER TABLE `{$alias}_page` CHANGE `location` `location` VARCHAR( 255 ) NOT NULL"); + $this->dbh->query("ALTER TABLE `{$alias}_page` ORDER BY `location`"); + break; + + default: + $this->info(" - no changes needed."); + break; + } + } + + + /** Upgrades the master (i.e. common) tables after the barrel tables have been updated. + * + * @param $newversion + */ + function upgradeMaster($newversion) + { + // upgrade master tables + switch($newversion) { + case "0.9.10": + $this->info(" - dropping fields : title, description, keywords"); + $this->dbh->query("ALTER TABLE `diogenes_site` DROP `title`"); + $this->dbh->query("ALTER TABLE `diogenes_site` DROP `description`"); + $this->dbh->query("ALTER TABLE `diogenes_site` DROP `keywords`"); + break; + + case "0.9.15": + $this->info(" - adding field : email"); + $this->dbh->query("ALTER TABLE `diogenes_auth` ADD `email` VARCHAR( 255 ) NOT NULL"); + break; + + case "0.9.16": + $this->info(" - changing user id fields to INT UNSIGNED"); + $this->dbh->query("ALTER TABLE `diogenes_auth` CHANGE `user_id` `user_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT"); + $this->dbh->query("ALTER TABLE `diogenes_logsessions` CHANGE `uid` `uid` INT(10) UNSIGNED NOT NULL default '0'"); + $this->dbh->query("ALTER TABLE `diogenes_logsessions` CHANGE `suid` `suid` INT(10) UNSIGNED NOT NULL default '0'"); + $this->dbh->query("ALTER TABLE `diogenes_perm` CHANGE `uid` `uid` INT(10) UNSIGNED NOT NULL default '0'"); + break; + + case "0.9.16+0.9.17pre15": + $this->info(" - creating 'diogenes_plugin' table"); + $this->dbh->query( + "CREATE TABLE `diogenes_plugin` ( + `plugin` varchar(32) NOT NULL default '', + `barrel` varchar(16) NOT NULL default '', + `page` int(10) unsigned NOT NULL default '0', + `pos` int(10) unsigned NOT NULL default '0', + `params` text NOT NULL, + PRIMARY KEY (`plugin`,`barrel`,`page`), + KEY `pos` (`pos`) + ) TYPE=MyISAM;"); + break; + + case "0.9.16+0.9.17pre19": + $this->info(" - changing id of `diogenes_logsessions` to INT(10) UNSIGNED"); + $this->dbh->query("ALTER TABLE `diogenes_logsessions` CHANGE `id` `id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT"); + break; + + case "0.9.16+0.9.17pre21": + $this->dbh->query("INSERT INTO diogenes_logactions VALUES (13, 'barrel_options', 'the barrel options were updated');"); + $this->dbh->query("INSERT INTO diogenes_logactions VALUES (14, 'barrel_plugins', 'the barrel plugins were modified');"); + $this->dbh->query("INSERT INTO diogenes_logactions VALUES (15, 'page_props', 'the page properties were updated');"); + $this->dbh->query("INSERT INTO diogenes_logactions VALUES (16, 'page_plugins', 'the page plugins were modified');"); + break; + + default: + $this->info(" - no changes needed."); + break; + } + } +} + +/* + * Main routine +*/ +$creator = new DiogenesDbInit("diogenes_option"); +$creator->parseOptions($argv, "diogenes", "localhost", "diogenes", ""); +$creator->run(); + +?> diff --git a/cvs.pl b/cvs.pl new file mode 100755 index 0000000..bd8e192 --- /dev/null +++ b/cvs.pl @@ -0,0 +1,318 @@ +#!/usr/bin/perl +# +# Custom wrapper around the CVS pserver for Diogenes +# +# Copyright 2003-2004 Jeremy Lainé +use strict; +use IPC::Open2; +use Socket; +use Fcntl qw(:DEFAULT :flock); +use Getopt::Std; +use POSIX qw(strftime waitpid WNOHANG WIFEXITED); + +my $package = "cvs.pl"; +my $version = "0.3"; +my %opts; +my $daemon; + + +# get command-line arguments +sub init { + if ( not getopts('dhp:r:fms:', \%opts) or $opts{'h'}) { + &syntax(); + return 1; + } + + # check we have a valid port + if ($opts{'p'} !~ /^[0-9]+$/) { + print("Error : no port or invalid port specified!\n"); + &syntax; + return 1; + } + + # check we have a cvsroot + if (!$opts{'r'}) { + print("Error : no CVS repository was specified!\n"); + &syntax; + return 1; + } + $opts{'r'} =~ s/^(.*)\/$/$1/; + if (! -d "$opts{'r'}/CVSROOT") { + print("Error : no CVS repository found at $opts{'r'}\n"); + return 1; + } + + # check we have a valid suicide delay + if ($opts{'s'} !~ /^[0-9]*$/) { + print("Error : invalid suicide delay!\n"); + &syntax; + return 1; + } + + return 0; +} + + +# debugging information +sub debug() +{ + if ($opts{'d'}) { + &log(@_); + } +} + + +# add a log entry +sub log() +{ + my $msg = shift; + if (open(LOG,">> $opts{'r'}/CVSROOT/serverlog")) + { + my $hdr = strftime("%a %b %e %H:%M:%S",gmtime)." [$daemon]"; + if ($$ != $daemon) { + $hdr .= "[$$]"; + } + print LOG "$hdr $msg\n"; + close LOG; + } +} + + +# add a user to the passwd file +sub pwdUser() +{ + my $user = shift; + my $pwfile = $opts{'r'}."/CVSROOT/passwd"; + + # read the password file, strip out current user + my @lines; + if (open(FH,"< $pwfile")) { + @lines = ; + @lines = grep !/^$user(:.*)?(:*)?$/,@lines; + close(FH); + } + + # add user to password file + my @pwuid = getpwuid($<); + push @lines, $user . "::" . $pwuid[0] . "\n"; + sysopen(FH, $pwfile, O_WRONLY | O_CREAT) + or die("Can't open passwd file!"); + flock(FH, LOCK_EX) + or die("Can't lock passwd file!"); + truncate(FH,0); + print FH @lines; + close(FH); + #die; +} + + +# the main loop of the server +sub serve() +{ + # make the socket + socket(Server, PF_INET, SOCK_STREAM, getprotobyname('tcp')); + + # so we can restart our server quickly + setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, 1); + + # build socket address + my $addr = sockaddr_in($opts{'p'}, 127.0.0.1); + + # bind and start listening + if (!bind(Server, $addr) or !listen(Server,SOMAXCONN)) { + print "Error : could not bind and listen to port $opts{'p'}!\n"; + close Server; + exit(2); + } + + + # if necessary, fork to background + if ($opts{'f'} && fork) { + # close parent + exit; + } + + # store the PID of the parent process + $daemon = $$; + + # select single-shot or full server + if ($opts{'m'}) { + &log("forked daemon bound"); + + my $children = 0; + # set up zombie reaper and suicide timer + $SIG{CHLD} = sub { + while (waitpid(-1,&WNOHANG) != -1) { + &WIFEXITED($?) and $children--; + } + + # if he have no more children, start suicide timer + if (($$ == $daemon) && ($children == 0)) { + alarm $opts{s}; + } + }; + + $SIG{ALRM} = sub { + &log("reached inactivity limit of $opts{s} seconds, returning"); + exit; + }; + + # if set, start suicide timer + alarm $opts{s}; + + # full-blown server that forks for each request + for (my $conn = 0;; $conn++) { + # we can get interrupted system calls + # ignore these and loop back + if (!accept(Client,Server)) { + next; + } + + # stop inactivity timer + alarm 0; + + &debug("forking child to handle request"); + + if (my $cpid = fork) { + + # parent process, closes unused handle + $children++; + close Client; + + } elsif (defined $cpid) { + + # child process + close Server; + &serveClient(\*Client); + close Client; + exit; + + } else { + print "Could not fork serveClient!"; + exit(2); + } + } + close Server; + + } else { + + &log("single-request daemon bound"); + # accepts a single connection, then returns + accept(Client,Server); + close Server; + &serveClient(\*Client); + + } + + &log("returning"); +} + + +# wraps around an instance of "cvs pserver" +sub serveClient() +{ + my $client = shift; + my $cvsroot = $opts{'r'}; + + # begin auth + chomp(my $in = <$client>); + if ($in !~ /^BEGIN AUTH REQUEST$/) { + &log("client did not send BEGIN AUTH REQUEST, returning!"); + close $client; + return; + } + chomp($in = <$client>); + if ($in !~ /^$cvsroot$/) { + close $client; + return; + } + # user name + chomp(my $user = <$client>); + + # password, discarded + <$client>; + # end auth + chomp($in = <$client>); + if ($in !~ /^END AUTH REQUEST$/) { + close $client; + return; + } + + # add the user to the passwd file + &log("authenticated $user"); + &pwdUser($user); + + + select($client); + $| = 1; + + + local(*Reader,*Writer); + + # create bidirectional pipe + if ( !open2(\*Reader, \*Writer, "cvs -f --allow-root $cvsroot pserver") ) { + close $client; + return; + } + + print Writer "BEGIN AUTH REQUEST\n$cvsroot\n$user\nA\nEND AUTH REQUEST\n"; + + # process input and output + if (my $pid = fork) { + close Reader; + + # process client input + while (my $inn = <$client>) + { + print Writer $inn; + } + + close Client; + close Writer; + + } elsif (defined $pid) { + close Writer; + + # feed output back to client + while (my $out = ) + { + print $client $out; + } + + close Reader; + close Client; + exit; + + } else { + die("Could not fork!"); + } + +} + + +# display program syntax +sub syntax { + print "\n", + "[ This is $package (v$version), Diogenes's wrapper around the CVS pserver ]\n\n", + "Syntax:\n", + " $package (-h | -p -r ) [options]\n\n", + " Help:\n", + " -h - display this help message\n", + " Required:\n", + " -p - listen on port \n", + " -r - use the local CVS repository \n", + " Options:\n", + " -d - debugging mode\n", + " -f - fork to background\n", + " -m - serve multiple client requests instead of dying after first client\n", + " -s - suicide after seconds of inactivity\n"; +} + + +# execute program +if (&init()) { + exit(1); +} else { + &serve(); + exit(0); +} diff --git a/debian/README.Debian b/debian/README.Debian new file mode 100644 index 0000000..7e8fcd8 --- /dev/null +++ b/debian/README.Debian @@ -0,0 +1,40 @@ +Diogenes for Debian +------------------- + +GETTING STARTED WITH DIOGENES + + Diogenes will be available at http://localhost/diogenes/ after installation. + To make any real use of Diogenes, you will most likely want to set Diogenes's + location to a proper URL which is accessible from remote hosts. You can set + this URL in the configuration file: + + /etc/diogenes/diogenes.debian.inc.php + + To start using Diogenes, you need to create a user account so that you + can log in. You can do so by visiting the following page: + + http://localhost/diogenes/toplevel/boot.php + + Alternatively, the following MySQL command will allow you to login with the + username "root" and no password. You can then change the password upon your + first login using Diogenes's user account manager. + + use diogenes; + insert into diogenes_auth set username="root",password=MD5(""),perms="admin"; + + +MANUAL INSTALLATION NOTES + + If during installation you selected not to automatically configure Apache + you will have to modify your Apache configuration to include + /etc/diogenes/apache.conf. + + If during installation you selected not to automatically configure MySQL + you will have to create Diogenes's database by hand. To do so, you can use + the SQL files found in /usr/share/diogenes/scripts. If you select a manual + database installation you will also have to handle database structure + upgrades yourself by running the update.php script which is provided in + /usr/share/diogenes/scripts. + + + -- Jeremy Lainé Mon, 29 Mar 2004 13:24:19 +0200 diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..a5b4ec8 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,354 @@ +diogenes (0.9.18-1) unstable; urgency=low + + * New upstream release. + * Update dependencies to allow use with php5 instead of php4. + + -- Jeremy Lainé Wed, 5 Apr 2006 21:31:21 +0200 + +diogenes (0.9.17.2-1) unstable; urgency=low + + * New upstream release. + + -- Jeremy Lainé Mon, 3 Oct 2005 19:29:45 +0200 + +diogenes (0.9.17.1-2) unstable; urgency=low + + * Remove hardcoded depends on debconf, let debhelper handle it + * Do not remove debian/compat on clean, fixes lintian warning + * Do not run 'make' manually, let cdbs handle it by using makefile.mk + + -- Jeremy Lainé Mon, 26 Sep 2005 21:40:19 +0200 + +diogenes (0.9.17.1-1) unstable; urgency=low + + * New upstream release. + - convert debian/* to utf8 + - diogenes.postinst, diogenes.postrm : fix possible bashisms + + -- Jeremy Lainé Tue, 30 Aug 2005 01:31:49 +0200 + +diogenes (0.9.17-2) unstable; urgency=low + + * Update to Standards-Version 3.6.2 + * Add Czech translation of debconf messages (Closes: #315827) + + -- Jeremy Laine Sun, 26 Jun 2005 14:38:30 +0200 + +diogenes (0.9.17-1) unstable; urgency=low + + * New upstream release. + - disable custom templates on admin pages (Closes: #296125) + * Rework package dependencies + - add Depends on php4-mysql for libphp-diogenes + - change wv from Depends to Suggests for diogenes + * Add error information when enabling apache modules + * Purge Smarty template cache during configure + * Update German translation of debconf messages (Closes: #311718) + * Document the fact that $globals->rooturl defaults to + http://localhost/diogenes/ (Closes: #311673) + * Add Vietnamese translation of debconf messages (Closes: #313543) + + -- Jeremy Laine Tue, 14 Jun 2005 21:01:44 +0200 + +diogenes (0.9.16+0.9.17pre24-1) experimental; urgency=low + + * New upstream release. + * Update German translation of debconf messages (Closes: #311718) + * Document the fact that $globals->rooturl defaults to + http://localhost/diogenes/ (Closes: #311673) + + -- Jeremy Laine Sun, 5 Jun 2005 20:15:04 +0200 + +diogenes (0.9.16+0.9.17pre23-1) experimental; urgency=low + + * New upstream release + * Rework package dependencies + - add Depends on php4-mysql for libphp-diogenes + - change wv from Depends to Suggests for diogenes + * Add error information when enable apache modules + * Purge Smarty template cache during configure + + -- Jeremy Laine Sun, 29 May 2005 23:30:33 +0200 + +diogenes (0.9.16-1) unstable; urgency=low + + * New upstream release + - use unsigned ints instead of smallints for user ids (Closes: #299377) + + -- Jeremy Laine Sun, 13 Mar 2005 23:54:48 +0100 + +diogenes (0.9.15-3) unstable; urgency=low + + * Update French translations (Closes: #296343) + + -- Jeremy Laine Wed, 23 Feb 2005 20:11:23 +0100 + +diogenes (0.9.15-1) unstable; urgency=low + + * New upstream release + - control : add Depends on php-mail-mime for libphp-diogenes + - control : add Recommends on mysql-server + * Add support for apache2, apache-ssl and apache-perl + + -- Jeremy Laine Sat, 22 Jan 2005 13:18:39 +0100 + +diogenes (0.9.14-2) unstable; urgency=low + + * Use code contributed to wwwconfig-common + - diogenes.postinst : replace custom code by call to apache-php.sh + - diogenes.postinst : replace custom code by call to php-extensions.sh + - control : update Depends to wwwconfig-common (>= 0.0.41) + - control : change Depends from php4-cgi to php4-cli + + -- Jeremy Laine Mon, 15 Nov 2004 02:56:13 +0100 + +diogenes (0.9.14-1) unstable; urgency=low + + * New upstream release + + -- Jeremy Laine Thu, 14 Oct 2004 23:14:45 +0200 + +diogenes (0.9.13-2) unstable; urgency=low + + * Mention all copyright holders in debian/copyright + * Add debian/watch file + + -- Jeremy Laine Tue, 17 Aug 2004 16:46:58 +0200 + +diogenes (0.9.13-1) unstable; urgency=low + + * New upstream release + * Add Pablo Castellazzi's Spanish debconf translation + + -- Jeremy Laine Wed, 21 Jul 2004 18:45:19 +0200 + +diogenes (0.9.12-3) unstable; urgency=low + + * Fix the revision browser's 'restore' function + * Fix incorrect mimetype for MS Office documents + + -- Jeremy Laine Fri, 2 Jul 2004 11:52:23 +0200 + +diogenes (0.9.12-2) unstable; urgency=low + + * Fix missing 'delete' button in the table editor + + -- Jeremy Laine Wed, 23 Jun 2004 18:07:46 +0200 + +diogenes (0.9.12-1) unstable; urgency=low + + * New upstream release + - explicitly state what barrel names are valid (Closes: #252788) + - added customisable templates (Closes: #252805) + + -- Jeremy Laine Thu, 10 Jun 2004 14:57:09 +0200 + +diogenes (0.9.11-1) unstable; urgency=low + + * New upstream release + - fixed French translations (Closes: #250485, #250487) + * Packaging improvements + - added Nicolas Bertolissio's French debconf translation + - added Erik Schanze's German debconf translation (Closes: #252327) + - diogenes.postinst : check that upgradedb.php returns OK + + -- Jeremy Laine Tue, 1 Jun 2004 15:03:11 +0200 + +diogenes (0.9.10-3) unstable; urgency=low + + * Check that PHP has MySQL support activated + - diogenes.postinst : enable MySQL support if necessary (Closes: #250081) + * Fix incorrect MD5 hashing of accentuated characters (Closes: #250198) + + -- Jeremy Laine Sun, 23 May 2004 14:15:37 +0200 + +diogenes (0.9.10-2) unstable; urgency=low + + * Improved debconf templates: + - "unpersonalise" computer (Closes: #249983) + - set untranslatable strings (Closes: #249984) + - be consistent, use "web server" (Closes: #249989) + - do not end templates with question mark (Closes: #249991) + - be more explicit about automatic password generation (Closes: #249987) + + -- Jeremy Laine Thu, 20 May 2004 13:07:02 +0200 + +diogenes (0.9.10-1) unstable; urgency=low + + * New upstream release. + - apache.conf : add PEAR to the include_path + - diogenes.postinst : check whether database creation succeeds + - diogenes.postinst : call modules-config more cautiously + - diogenes.postinst : handle case where webserver does not restart + + -- Jeremy Laine Tue, 18 May 2004 10:29:22 +0200 + +diogenes (0.9.9.3-7) unstable; urgency=low + + * General improvements + - apache.conf : explicitly set magic_quotes_gpc and register_globals + - README.Debian : added a note about using updatedb.php + * Minimise changes to httpd.conf + - apache.conf : set index.php as the DirectoryIndex + - diogenes.postinst : do not touch DirectoryIndex in httpd.conf + - diogenes.postinst / diogenes.postrm : use a symlink to apache.conf + - diogenes.postinst : use modules-config to enable php4 support + * Better cleanup upon purge + - diogenes.config : ask the user whether to clear data on purge + - diogenes.postrm : remove /var/(lib|spool)/diogenes and drop database + + -- Jeremy Laine Wed, 5 May 2004 15:09:51 +0200 + +diogenes (0.9.9.3-6) unstable; urgency=low + + * Upload sponsored by Matthew Palmer . + * Initial upload to Debian. Closes: #243865. + * We also need the user that runs the webserver + - diogenes.config : retrieve webuser with getwwwoption or db_input + - diogenes.postinst : corrected chown of /var/(lib|spool)/diogenes + + -- Jeremy Laine Fri, 16 Apr 2004 11:52:24 +0200 + +diogenes (0.9.9.3-5) unstable; urgency=low + + * Server group gets determined during config + - diogenes.config : imported getwwwoption() + - diogenes.postinst : do not communicate via console + + -- Jeremy Laine Fri, 16 Apr 2004 10:04:20 +0200 + +diogenes (0.9.9.3-4) unstable; urgency=low + + * Stop trying to guess the MySQL user / password + - diogenes.config : to not use mysql-localadmpass.get + + -- Jeremy Laine Thu, 15 Apr 2004 19:26:39 +0200 + +diogenes (0.9.9.3-3) unstable; urgency=low + + * Better cleanup on remove + - rules : create /var/spool/diogenes/templates_c and /var/lib/diogenes + - diogenes.prerm : purge Smarty compiled templates cache + * Fix some issues pointed out by Matthew Palmer + - diogenes.templates : miscount of available options + - rules : moved install scripts out of /usr/share/doc + - diogenes.postinst : use wwwconfig-common to GRANT privileges + - diogenes.postinst : install ucf-managed files before configuring apache + - diogenes.postrm : removed .dpkg-dist files + * Fix potential problem with apache restart + - apache.conf : protect php_value with an IfModule + + -- Jeremy Laine Thu, 15 Apr 2004 19:13:01 +0200 + +diogenes (0.9.9.3-2) unstable; urgency=low + + * Use ucf to manage conffiles. + - diogenes.postinst : removed some cruft + + -- Jeremy Laine Wed, 14 Apr 2004 11:29:33 +0200 + +diogenes (0.9.9.3-1) unstable; urgency=low + + * New upstream release. + - rules : documents are now in 'htdocs' + - apache.conf : changed document root to 'htdocs' + + -- Jeremy Laine Tue, 13 Apr 2004 14:46:09 +0200 + +diogenes (0.9.9.2-2) unstable; urgency=low + + * Improved package description and notes. + - control : more explicit description + - README.Debian : corrected MySQL instructions + * Fixed bug when MySQL admin password is empty. + - diogenes.postinst : escape arguments passed to updatedb.php + + -- Jeremy Laine Mon, 29 Mar 2004 14:12:45 +0200 + +diogenes (0.9.9.2-1) unstable; urgency=low + + * New upstream release. + - rules : make use of dh_install instead of copying files + - rules : libphp-diogenes has its own ChangeLog + - README.Debian : added + + -- Jeremy Laine Fri, 26 Mar 2004 15:57:48 +0100 + +diogenes (0.9.9.1-1) unstable; urgency=low + + * New upstream release. + + -- Jeremy Laine Wed, 24 Mar 2004 12:22:58 +0100 + +diogenes (0.9.9-1) unstable; urgency=low + + * New upstream release. + - apache.conf : removed rewrite block + - control : use standard version 3.6.1 + - control : use ${Source-Version} for Depends + - control : use po-debconf instead of debconf + - rules : distribute HTTP_WebDAV_Server files + + -- Jeremy Laine Tue, 16 Mar 2004 22:20:51 +0100 + +diogenes (0.9.8.3-1) unstable; urgency=low + + * New upstream release. + + -- Jeremy Laine Mon, 1 Mar 2004 14:40:43 +0100 + +diogenes (0.9.8.2-1) unstable; urgency=low + + * New upstream release. + - rules : cvs.pl needs to be installed + + -- Jeremy Laine Wed, 17 Dec 2003 11:18:27 +0100 + +diogenes (0.9.8.1-1) unstable; urgency=low + + * New upstream release. + + -- Jeremy Laine Fri, 12 Dec 2003 17:09:02 +0100 + +diogenes (0.9.8-2) unstable; urgency=low + + * Fixed Lintian warnings. + - copyright : added + - diogenes.postinst : removed a bashism + - diogenes.postinst : removed calls to db_input (already in diogenes.config) + + -- Jeremy Laine Thu, 11 Dec 2003 22:50:37 +0100 + +diogenes (0.9.8-1) unstable; urgency=low + + * New upstream release. + - control : added missing dependencies on php4-mysql and rcs + - control : added new dependency on cvs + + -- Jeremy Laine Thu, 11 Dec 2003 15:41:00 +0100 + +diogenes (0.9.7-1) unstable; urgency=low + + * New upstream release. + - rules : make call to updatedb.php + + -- Jeremy Laine Wed, 3 Dec 2003 19:23:01 +0100 + +diogenes (0.9.6-3) unstable; urgency=low + + * Better default for base url. + + -- Jeremy Laine Wed, 3 Dec 2003 07:23:45 +0100 + +diogenes (0.9.6-2) unstable; urgency=low + + * Fixed up MySQL initialisation. + + -- Jeremy Laine Wed, 3 Dec 2003 04:33:10 +0100 + +diogenes (0.9.6-1) unstable; urgency=low + + * Initial release. + + -- Jeremy Laine Tue, 2 Dec 2003 20:17:24 +0100 + diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +4 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..7e77b0e --- /dev/null +++ b/debian/control @@ -0,0 +1,34 @@ +Source: diogenes +Section: web +Priority: optional +Maintainer: Jeremy Lainé +Standards-Version: 3.6.2 +Build-Depends-Indep: cdbs, debhelper (>= 4.1.16), po-debconf + +Package: diogenes +Architecture: all +Depends: ${misc:Depends}, libphp-diogenes (= ${Source-Version}), gettext, wwwconfig-common (>=0.0.41), apache | apache2 | httpd, php4-cli | php5-cli, php-pear, cvs, rcs, perl-modules, ucf (>=0.28) +Recommends: mysql-server +Suggests: wv +Description: web content management system + The Diogenes content management system allows you to create, host and + manage web sites through a web interface and/or WebDAV. You can host several + independent sites on a single server and even have them run on separate + virtualhosts. Diogenes offers fine-grained control of the read and write + permissions of the pages making up a site. + . + Diogenes provides a number of options to customise the appearance of your + web sites. If you are familiar with PHP it is even possible to extend and + customise Diogenes's engine by subclassing its core classes. Diogenes's user + interface is available in Dutch, English, French, Spanish and Swedish. + . + Homepage: http://opensource.polytechnique.org/diogenes/ + +Package: libphp-diogenes +Architecture: all +Depends: smarty, php-mail-mime, php4-mysql | php5-mysql +Description: library for web site creation + A set of PHP classes used by the Diogenes content management system. + . + Homepage: http://opensource.polytechnique.org/libdiogenes/ + diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..dc5ab01 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,31 @@ +This package was debianized by Jeremy Lainé on +Tue, 2 Dec 2003 20:17:24 +0100 + +It was downloaded from http://opensource.polytechnique.org/diogenes/ + +Upstream Author: Jeremy Lainé + +* HTTP_WebDAV_Server is licensed under the terms of the + PHP license 2.02 and copyright (c) 1997-2003 The PHP Group. + +* PHPLIB is licensed under the terms of the LGPL and + is copyright (c) Kristian Koehntopp and the NetUSE AG. + +* PHP Layers Menu is licensed under the terms of the LGPL version 2.1 + or later and is copyright (c) 2001-2004 Marco Pratesi. + +* Gartoon Gnome Icon Theme is licensed under the terms of the + GPL version 2 or later and is copyright (c) Zeus. + +* Text_Wiki is licensed under the terms of the LGPL version 2.1 + or later and is copyright (c) 2003-2005 Paul M. Jones. + +* Textile is licensed under the terms put forth at + http://www.textism.com/tools/textile/license.html and is + copyright (c) 2003 Dean Allen. + +* Diogenes is licensed under the terms of the GPL version 2 + or later and is copyright (c) 2003-2005 Jeremy Lainé. + +On Debian GNU/Linux systems, the complete text of the GNU General Public +License may be found in `/usr/share/common-licenses/GPL'. diff --git a/debian/diogenes.config b/debian/diogenes.config new file mode 100644 index 0000000..08221cb --- /dev/null +++ b/debian/diogenes.config @@ -0,0 +1,114 @@ +#!/bin/bash -e + +RANDOMDEVICE=/dev/urandom +allowed=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./ +declare -a RVAL + +second () { + echo $2 +} + +create-random-pw() { + if ! read -n 0 < $RANDOMDEVICE ; then + echo 1>&2 "Warning, no random device found, password might be insecure" + for i in 0 1 2 3 4 5 6 7; do + RVAL[i]=$RANDOM + done + else + for i in 0 1 2 3 4 5 6 7; do + RVAL[i]=$(second $(od -N 1 -t d $RANDOMDEVICE)) + done + fi + + PW="" + for i in 0 1 2 3 4 5 6 7; do + idx=$((${RVAL[i]} & 0x3F)) + PW="${PW}${allowed:$idx:1}" + done + + printf "%s" $PW +} + +# this function comes from wwwconfig-common's apache.func script +getwwwoption() { + getwwwoption="" + if [ -f $2 ] ; then + if grep $1 $2 | grep -v "#" > /dev/null 2>&1 ; then + getwwwoption=$(sed -ne "/^[[:space:]]*$1[[:space:]]\+/ s|[[:space:]]*$1[[:space:]]\+\([^[:space:]]\+\)[[:space:]]*$|\1|pg;" < $2) + fi + fi +} + + +# Use debconf baby +. /usr/share/debconf/confmodule +db_version 2.0 +db_title Diogenes + +db_input "low" "diogenes/welcome" || true +db_go +db_input "high" "diogenes/purge_removes_data" || true +db_go + +### Required options no matter what ### +db_input "high" "diogenes/webservers" || true +db_go +db_get "diogenes/webservers" +webservers="$RET" + +# if a single webserver is selected, +# try to get the user and group the webserver runs as +nbsrv=0 +for i in $webservers ; do nbsrv=`expr $nbsrv + 1`; done + +if [ $nbsrv == 1 ]; then + server=$(echo $webservers | sed 's/,$//') + if [ -f /etc/$server/httpd.conf ]; then + getwwwoption User /etc/$server/httpd.conf + webuser=$(echo "$getwwwoption" | sed -e "q") + getwwwoption Group /etc/$server/httpd.conf + webgroup=$(echo "$getwwwoption" | sed -e "q") + fi +fi + +if [ -z "$webuser" ]; then + db_input "high" "diogenes/webuser" || true + db_go +else + db_set "diogenes/webuser" "$webuser" +fi +if [ -z "$webgroup" ]; then + db_input "high" "diogenes/webgroup" || true + db_go +else + db_set "diogenes/webgroup" "$webgroup" +fi + +db_input "high" "diogenes/databasemgr_type" || true +db_go +db_get "diogenes/databasemgr_type" +dbtype="$RET" + +if [ "$dbtype" = "Automatic" ] ; then + db_input "high" "diogenes/databasemgr_server" || true + db_go + db_input "high" "diogenes/dbmyadmin" || true + db_go + db_input "critical" "diogenes/dbadmpass" || true + db_go + db_input "medium" "diogenes/database_name" || true + db_go + db_input "medium" "diogenes/database_user" || true + db_go + db_input "medium" "diogenes/database_pass" || true + db_go + db_get "diogenes/database_pass" + dbpass="$RET" + if [ "$dbpass" = "auto" ]; then + dbpass=$(create-random-pw) + elif [ "$dbpass" = "none" ]; then + dbpass="" + fi + db_set "diogenes/database_pass" "$dbpass" + +fi diff --git a/debian/diogenes.config.inc.php b/debian/diogenes.config.inc.php new file mode 100644 index 0000000..8dd3389 --- /dev/null +++ b/debian/diogenes.config.inc.php @@ -0,0 +1,20 @@ +spoolroot = "/var/spool/diogenes"; +$globals->rcsroot = "/var/lib/diogenes"; +$globals->root = "/usr/share/diogenes"; +$globals->libroot = "/usr/share/php/diogenes"; + +// database access +$globals->dbdb = "@dbname@"; +$globals->dbhost = "@dbserver@"; +$globals->dbuser = "@dbuser@"; +$globals->dbpwd = "@dbpass@"; + +// include local configuration +require("diogenes.debian.inc.php"); + +?> diff --git a/debian/diogenes.debian.inc.php b/debian/diogenes.debian.inc.php new file mode 100644 index 0000000..949890d --- /dev/null +++ b/debian/diogenes.debian.inc.php @@ -0,0 +1,11 @@ +rooturl = "http://www.foo.org/diogenes/"; +*/ +$globals->rooturl = "http://localhost/diogenes/"; + +?> diff --git a/debian/diogenes.postinst b/debian/diogenes.postinst new file mode 100644 index 0000000..f0b5b83 --- /dev/null +++ b/debian/diogenes.postinst @@ -0,0 +1,209 @@ +#! /bin/sh +# Horde postinst script using debconf +# Written by Ola Lundqvist +# Adapted for Horde2 by Nils Rennebarth +# Adapted for Diogenes by Jeremy Lainé +# +# All questions should have been asked via debconf +# now we just go get those, build a temp file which we read in and +# then build our config files and set everthing up + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see /usr/share/doc/packaging-manual/ +# +# quoting from the policy: +# Any necessary prompting should almost always be confined to the +# post-installation script, and should be protected with a conditional +# so that unnecessary prompting doesn't happen if a package's +# installation fails and the `postinst' is called with `abort-upgrade', +# `abort-remove' or `abort-deconfigure'. + +create_file_from_template() { + infile=$1 + outfile=$2 + # Password may contain anything, so we need to descend to quoting + # hell. + safepass="$dbpass" + # quote normal quote and final backslash because we need to write + # a single quoted PHP string + safepass=$(echo "$safepass" | sed -e "s/'/\\\\'/g" -e 's/\\$/\\\\'/) + # Now double backslashes because we will use sed + safepass=$(echo "$safepass" | sed -e 's/\\/\\\\/g') + # Finally escape an eventual hash sign with a backslash because + # we use the hash sign as a delimiter + safepass=$(echo "$safepass" | sed -e 's/#/\\#/g') + sed -e " \ + s#@dbname@#$dbname#; \ + s#@dbserver@#$dbserver#; \ + s#@dbuser@#$dbuser#; \ + s#@dbpass@#$safepass#; \ + " <$infile >$outfile +} + + +case "$1" in + configure) + +# install ucf-managed files +ucf --debconf-ok /usr/share/diogenes/config/diogenes.debian.inc.php /etc/diogenes/diogenes.debian.inc.php +ucf --debconf-ok /usr/share/diogenes/config/apache.conf /etc/diogenes/apache.conf + +# get debconf started +. /usr/share/debconf/confmodule +db_version 2.0 + +############################################################################### +############################### Configure database ############################ +############################################################################### + +# Type of the databasemgr to use. +db_get "diogenes/databasemgr_type" +dbtype="$RET" +if [ "$dbtype" = "Automatic" ] ; then + # Where it is located. + db_get "diogenes/databasemgr_server" + dbserver="$RET" + # Name of the database + db_get "diogenes/database_name" + dbname="$RET" + # Name of the user to have access. + db_get "diogenes/database_user" + dbuser="$RET" + # Its password. + db_get "diogenes/database_pass" + dbpass="$RET" + + if [ ! -z $(which mysql) ]; then + + # retrieve admin user and password + db_get "diogenes/dbmyadmin" + dbadmin="$RET" + db_get "diogenes/dbadmpass" + dbadmpass="$RET" + db_reset "diogenes/dbadmpass" + + . /usr/share/wwwconfig-common/mysql-createdb.sh + if [ "$status" = "create" ] ; then + sqlfile=/usr/share/diogenes/scripts/diogenes.tables.sql + create_file_from_template $sqlfile.in $sqlfile + . /usr/share/wwwconfig-common/mysql-exec.sh + rm $sqlfile + sqlfile=/usr/share/diogenes/scripts/diogenes.logactions.sql + create_file_from_template $sqlfile.in $sqlfile + . /usr/share/wwwconfig-common/mysql-exec.sh + rm $sqlfile + elif [ "$status" = "nothing" ] ; then + if ! /usr/share/diogenes/scripts/updatedb.php -q -s "$dbserver" -d "$dbname" -u "$dbadmin" -p "$dbadmpass" ; then + echo "There was an error while upgrading the Diogenes database." + fi + else + echo $error + fi + . /usr/share/wwwconfig-common/mysql-createuser.sh + else + echo "Not configuring MySQL database because we cannot locate" + echo "the mysql client executable (mysql-client package missing)." + fi +else + echo "Not configuring MySQL database at your request." +fi + + +############################################################################### +########################## Configure web servers ############################## +############################################################################### + +db_get "diogenes/webservers" +webservers="$RET" + +for server in $webservers; do + server=$(echo $server | sed 's/,$//') + servers="$server $servers" + # Make sure our web server has PHP support + phpver=php4 + phpini=/etc/$phpver/$server/php.ini + . /usr/share/wwwconfig-common/apache-php.sh + if [ "$status" = "uncomment" ] ; then + restart="$server $restart" + elif [ "$status" = "error" ] ; then + echo "Error while trying to enable $phpver support for '$server' : $error." + fi + + # Make sure that PHP has MySQL support enabled + checkextensions=mysql + . /usr/share/wwwconfig-common/php-extensions.sh + + includefile=/etc/diogenes/apache.conf + # For old versions of Diogenes, remove the include of ourapache.conf + if dpkg --compare-versions "$2" le-nl "0.9.9.3-6" ; then + . /usr/share/wwwconfig-common/apache-uninclude_all.sh + if [ "$status" = "uncomment" ] ; then + restart="$server $restart" + fi + fi + + # If necessary, add a symlink to our apache.conf + if [ -d /etc/$server/conf.d ] && [ ! -e /etc/$server/conf.d/diogenes ] ; then + ln -s $includefile /etc/$server/conf.d/diogenes + restart="$server $restart" + fi +done + + +############################################################################### +########################## Configure Diogenes ################################# +############################################################################### + +db_get "diogenes/webuser" +webuser="$RET" +db_get "diogenes/webgroup" +webgroup="$RET" + +( umask 0027 # File may contain passwords + create_file_from_template /usr/share/diogenes/config/diogenes.config.inc.php /etc/diogenes/diogenes.config.inc.php + chgrp $webgroup /etc/diogenes/diogenes.config.inc.php +) + +# purge Smarty templates cache +rm -rf /var/spool/diogenes/templates_c/* + +# correct ownership on Diogenes directories +chown -R $webuser /var/lib/diogenes +chown -R $webuser /var/spool/diogenes + + +############################################################################### +############################# Servers restart ################################# +############################################################################### +if ! eval . /usr/share/wwwconfig-common/restart.sh ; then + echo "There was a problem restarting web server(s)." +fi + + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + diff --git a/debian/diogenes.postrm b/debian/diogenes.postrm new file mode 100644 index 0000000..3e394d2 --- /dev/null +++ b/debian/diogenes.postrm @@ -0,0 +1,94 @@ +#!/bin/sh -e +# Horde postrm script using debconf +# Originally written for horde by Ola Lundqvist +# Adapted for horde2 by Nils Rennebarth +# Adapted for Diogenes by Jeremy Lainé + +remove_from_webconfig () { + webservers="$RET" + + # Remove symlink to our apache.conf + for server in $webservers ; do + server=$(echo $server | sed 's/,$//') + servers="$server $servers" + if [ -s /etc/$server/conf.d/diogenes ] ; then + rm -f /etc/$server/conf.d/diogenes + restart="$server $restart" + fi + done + + # Restart servers + if [ -e /usr/share/wwwconfig-common/restart.sh ] ; then + . /usr/share/wwwconfig-common/restart.sh + fi +} + +ACTION=$1 +case "$ACTION" in +remove) + # + # Remove Diogenes from the webserver configuration + # + . /usr/share/debconf/confmodule + db_version 2.0 + + # + # Only try to remove Diogenes from the webserver configs if the db key + # diogenes/webservers exists. If not, Diogenes had not been installed + # correctly so we just skip the webserver part + # + if db_get "diogenes/webservers"; then + remove_from_webconfig + fi + ;; + +purge) + . /usr/share/debconf/confmodule + db_version 2.0 + + # + # Remove ucf-managed files + # + for myfile in /etc/diogenes/apache.conf /etc/diogenes/diogenes.debian.inc.php; do + ucf --purge $myfile + rm -f $myfile $myfile.dpkg-dist $myfile.dpkg-new $myfile.dpkg-old + done + + # + # If we were asked to, purge Diogenes data + # + db_get "diogenes/purge_removes_data" + if [ "$RET" = "true" ]; then + # remove files + rm -rf /var/spool/diogenes /var/lib/diogenes + + # drop the database if we are Automatic mode + db_get "diogenes/databasemgr_type" + if [ "$RET" = "Automatic" ] ; then + db_get "diogenes/databasemgr_server" + dbserver="$RET" + db_get "diogenes/database_name" + dbname="$RET" + # we use the Diogenes user as the "admin", as he is authorized to do a drop + db_get "diogenes/database_user" + dbadmin="$RET" + db_get "diogenes/database_pass" + dbadmpass="$RET" + if [ -f /usr/share/wwwconfig-common/mysql.get ] && [ -x $(which mysql) ] ; then + . /usr/share/wwwconfig-common/mysql.get + if eval $mysqlcmd -f -e "\"DROP DATABASE $dbname;\"" ; then + status=dropped + fi + fi + fi + fi + ;; + +*) + ;; +esac + + +#DEBHELPER# + +exit 0 diff --git a/debian/diogenes.prerm b/debian/diogenes.prerm new file mode 100644 index 0000000..8de7ce1 --- /dev/null +++ b/debian/diogenes.prerm @@ -0,0 +1,26 @@ +#!/bin/sh -e + +ACTION=$1 +case "$ACTION" in +remove) + # + # Remove the automatically generated diogenes.config.inc.php + # + rm -f /etc/diogenes/diogenes.config.inc.php + + # + # Remove the compiled templates directory + # + rm -rf /var/spool/diogenes/templates_c + ;; +*) + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + diff --git a/debian/diogenes.templates b/debian/diogenes.templates new file mode 100644 index 0000000..44add82 --- /dev/null +++ b/debian/diogenes.templates @@ -0,0 +1,105 @@ +Template: diogenes/welcome +Type: note +_Description: Welcome to the Diogenes setup program + You must have a database server already setup and ready to go if you are + going to have this program configure your database for you. If you are + not comfortable with this, you should tell the debconf process that you do + not have any database server. You will then need to configure Diogenes manually. + . + If debconf is set up in a way that you will not be asked questions + interactively (i.e. you do not see this note during installation but as a + mail to your root account), Diogenes will assume that your web server is + apache and your database server is MySQL and no MySQL root password is set. If + any of these do not apply, Diogenes will not run unless you configure it + manually by creating its database and editing the files in /etc/diogenes. + +Template: diogenes/purge_removes_data +Type: boolean +Default: true +_Description: Remove web site data after "purging" the diogenes package? + Should the data that makes up Diogenes's web sites be removed when + the diogenes packages is purged with the "dpkg --purge diogenes" command + (i.e. remove everything including the configuration)? + +Template: diogenes/webservers +Type: multiselect +_Choices: apache, apache-ssl, apache-perl, apache2 +Default: apache +_Description: Type of web server: + By default Diogenes supports any web server that php4 does. This config + process currently only supports Apache directly. If you use another one + you will have to handle the web ends manually. If you choose the first + option, this install process will manage the configuration (or attempt to) + of the Apache specific portions necessary to run Diogenes properly. + +Template: diogenes/webuser +Type: string +Default: www-data +_Description: User your web server runs as: + Unable to obtain the user your web server runs as. This is needed in order + to allow the web server to write the files that make up the Diogenes-managed + web sites. + +Template: diogenes/webgroup +Type: string +Default: www-data +_Description: Group your web server runs as: + Unable to obtain the group your web server runs as. This is needed in order + to allow the web server to read Diogenes's configuration files. + +Template: diogenes/databasemgr_type +Type: select +_Choices: Automatic, Manual +Default: Automatic +_Description: Type of database installation: + If you want the setup program to ask you questions and do the database + setup for you, select "Automatic". (Recommended) + . + If you want to configure your database by hand, select "Manual". In this + case you will have to create the Diogenes database and user by hand and + handle database upgrades manually. + +Template: diogenes/dbadmpass +Type: password +_Description: Database admin password: + Enter the password for your database admin user to access the database. + This password had been set when installing your database. It is most + likely NOT the same password that your Diogenes manager account will use. + +Template: diogenes/databasemgr_server +Type: string +Default: localhost +_Description: Hostname of the database server: + If your database is on another machine besides the one that Diogenes is + running on then you need to change this value to the fully qualified + domain name for that system. + +Template: diogenes/database_name +Type: string +Default: diogenes +_Description: Name for the Diogenes database: + By default this will be "diogenes". This is where all the Diogenes related + database items will be setup and stored. + +Template: diogenes/database_user +Type: string +Default: diogenes +_Description: Database username: + What username will access the database for Diogenes? By default this is + it's own user "diogenes" so that permissions can be tightened down. + +Template: diogenes/database_pass +Type: password +Default: auto +_Description: Password for the Diogenes user: + Enter a password for the database user which will be used along with + the database user name you have already supplied to connect to the + database. + . + If you wish to leave the password empty, type "none". If you wish to use + an automatically generated random password type "auto". + +Template: diogenes/dbmyadmin +Type: string +Default: root +_Description: MySQL administrator username: diff --git a/debian/po/POTFILES.in b/debian/po/POTFILES.in new file mode 100644 index 0000000..3130767 --- /dev/null +++ b/debian/po/POTFILES.in @@ -0,0 +1 @@ +[type: gettext/rfc822deb] diogenes.templates diff --git a/debian/po/cs.po b/debian/po/cs.po new file mode 100644 index 0000000..42a7042 --- /dev/null +++ b/debian/po/cs.po @@ -0,0 +1,281 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: diogenes\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-01-14 01:45+0100\n" +"PO-Revision-Date: 2005-06-25 16:08+0200\n" +"Last-Translator: Miroslav Kure \n" +"Language-Team: Czech \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "Welcome to the Diogenes setup program" +msgstr "Vítejte v konfiguračním systému programu Diogenes" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "" +"You must have a database server already setup and ready to go if you are " +"going to have this program configure your database for you. If you are not " +"comfortable with this, you should tell the debconf process that you do not " +"have any database server. You will then need to configure Diogenes manually." +msgstr "" +"Chcete-li využít konfigurační systém pro automatické nastavení databáze, " +"musíte již mít nastaven databázový server. Pokud vás automatické nastavení " +"příliÅ¡ neoslovuje, sdělte debconfu, že nemáte žádný databázový server a " +"můžete si tak nastavit Diogenes ručně." + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "" +"If debconf is set up in a way that you will not be asked questions " +"interactively (i.e. you do not see this note during installation but as a " +"mail to your root account), Diogenes will assume that your web server is " +"apache and your database server is MySQL and no MySQL root password is set. " +"If any of these do not apply, Diogenes will not run unless you configure it " +"manually by creating its database and editing the files in /etc/diogenes." +msgstr "" +"Pokud je debconf nastavený tak, že se nemá ptát otázky interaktivně (tj. " +"tuto poznámku nevidíte během instalace, ale byla vám zaslána poÅ¡tou), " +"bude Diogenes předpokládat, že je vaším webovým serverem apache, databázovým " +"serverem MySQL a že v databázi není nastaveno žádné rootovské heslo. " +"Pokud něco z toho není pravda, Diogenes se nespustí dokud jej nenastavíte " +"ručně (tj. nevytvoříte databázi a neupravíte soubory v /etc/diogenes)." + +#. Type: boolean +#. Description +#: ../diogenes.templates:19 +msgid "Remove web site data after \"purging\" the diogenes package?" +msgstr "Odstranit data při vyčiÅ¡tění balíku diogenes ze systému?" + +#. Type: boolean +#. Description +#: ../diogenes.templates:19 +msgid "" +"Should the data that makes up Diogenes's web sites be removed when the " +"diogenes packages is purged with the \"dpkg --purge diogenes\" command (i.e. " +"remove everything including the configuration)?" +msgstr "" +"Vyberte si, zda se mají při kompletním odstranění balíku diogenes příkazem " +"\"dpkg --purge diogenes\" odstranit i data tvořící webové stránky systému " +"Diogenes (tj. vÅ¡e včetně nastavení)." + +#. Type: multiselect +#. Choices +#: ../diogenes.templates:26 +msgid "apache, apache-ssl, apache-perl, apache2" +msgstr "apache, apache-ssl, apache-perl, apache2" + +#. Type: multiselect +#. Description +#: ../diogenes.templates:28 +msgid "Type of web server:" +msgstr "Typ webového serveru:" + +#. Type: multiselect +#. Description +#: ../diogenes.templates:28 +msgid "" +"By default Diogenes supports any web server that php4 does. This config " +"process currently only supports Apache directly. If you use another one you " +"will have to handle the web ends manually. If you choose the first option, " +"this install process will manage the configuration (or attempt to) of the " +"Apache specific portions necessary to run Diogenes properly." +msgstr "" +"Diogenes podporuje libovolný webový server, pod kterým běží php4, avÅ¡ak " +"tento konfigurační program zatím podporuje jenom Apache. " +"Jestliže používáte jiný webový server, budete jej muset nastavit ručně. " +"Zvolíte-li první možnost, postará se o automatické nastavení " +"instalační program." + +#. Type: string +#. Description +#: ../diogenes.templates:38 +msgid "User your web server runs as:" +msgstr "Uživatel, pod kterým běží webový server:" + +#. Type: string +#. Description +#: ../diogenes.templates:38 +msgid "" +"Unable to obtain the user your web server runs as. This is needed in order " +"to allow the web server to write the files that make up the Diogenes-managed " +"web sites." +msgstr "" +"Nemohu zjistit uživatele, pod kterým běží váš webový server. Tuto informaci " +"potřebuji proto, abych povolil webovému serveru zapsat do souborů, " +"které jsou uloženy ve webech kontrolovaných systémem Diogenes." + +#. Type: string +#. Description +#: ../diogenes.templates:46 +msgid "Group your web server runs as:" +msgstr "Skupina, pod kterou běží webový server:" + +#. Type: string +#. Description +#: ../diogenes.templates:46 +msgid "" +"Unable to obtain the group your web server runs as. This is needed in order " +"to allow the web server to read Diogenes's configuration files." +msgstr "" +"Nemohu zjistit skupinu, pod kterou běží váš webový server. Tuto informaci " +"potřebuji proto, abych mohl webovému serveru povolit čtení konfiguračních " +"souborů systému Diogenes." + +#. Type: select +#. Choices +#: ../diogenes.templates:52 +msgid "Automatic, Manual" +msgstr "Automatická, Ruční" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "Type of database installation:" +msgstr "Typ databázové instalace:" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "" +"If you want the setup program to ask you questions and do the database setup " +"for you, select \"Automatic\". (Recommended)" +msgstr "" +"Pokud chcete, aby se vás konfigurační program zeptal několik otázek a " +"podle nich nastavil databázi automaticky, vyberte \"Automatická\". " +"(Doporučeno)" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "" +"If you want to configure your database by hand, select \"Manual\". In this " +"case you will have to create the Diogenes database and user by hand and " +"handle database upgrades manually." +msgstr "" +"Chcete-li mít raději vÅ¡e pod kontrolou, zvolte \"Ruční\". V tomto případě " +"budete muset databázi a databázového uživatele vytvořit ručně a následně " +"se také ručně starat o aktualizaci databáze." + +#. Type: password +#. Description +#: ../diogenes.templates:64 +msgid "Database admin password:" +msgstr "Heslo správce databáze:" + +#. Type: password +#. Description +#: ../diogenes.templates:64 +msgid "" +"Enter the password for your database admin user to access the database. This " +"password had been set when installing your database. It is most likely NOT " +"the same password that your Diogenes manager account will use." +msgstr "" +"Zadejte heslo administrátora databáze, které se použije pro přístup k " +"databázi. Toto heslo jste nastavili při instalaci databáze. S největší " +"pravděpodobností se NEJEDNÁ o stejné heslo, jaké bude používat správcovský " +"účet systému Diogenes." + +#. Type: string +#. Description +#: ../diogenes.templates:72 +msgid "Hostname of the database server:" +msgstr "Jméno počítače s databázovým serverem:" + +#. Type: string +#. Description +#: ../diogenes.templates:72 +msgid "" +"If your database is on another machine besides the one that Diogenes is " +"running on then you need to change this value to the fully qualified domain " +"name for that system." +msgstr "" +"Jestliže se vaÅ¡e databáze nachází na jiném počítači než na kterém běží " +"Diogenes, pak budete muset změnit tuto hodnotu na plně kvalifikované " +"doménové jméno daného systému." + +#. Type: string +#. Description +#: ../diogenes.templates:80 +msgid "Name for the Diogenes database:" +msgstr "Jméno Diogenes databáze:" + +#. Type: string +#. Description +#: ../diogenes.templates:80 +msgid "" +"By default this will be \"diogenes\". This is where all the Diogenes " +"related database items will be setup and stored." +msgstr "" +"Implicitně se použije \"diogenes\". V této databázi se budou ukládat vÅ¡echny " +"záznamy systému Diogenes." + +#. Type: string +#. Description +#: ../diogenes.templates:87 +msgid "Database username:" +msgstr "Databázové uživatelské jméno:" + +#. Type: string +#. Description +#: ../diogenes.templates:87 +msgid "" +"What username will access the database for Diogenes? By default this is " +"it's own user \"diogenes\" so that permissions can be tightened down." +msgstr "" +"Jaké uživatelské jméno budete používat pro přístup k databázi Diogenes? " +"Implicitně se použije vestavěný uživatel \"diogenes\", což dovolí zpřísnit " +"přístupová oprávnění." + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "Password for the Diogenes user:" +msgstr "Heslo uživatele Diogenes:" + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "" +"Enter a password for the database user which will be used along with the " +"database user name you have already supplied to connect to the database." +msgstr "" +"Zadejte heslo pro databázového uživatele, které se použije společně se " +"jménem databázového uživatele (již jste jej zadali) pro připojení do " +"databáze." + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "" +"If you wish to leave the password empty, type \"none\". If you wish to use " +"an automatically generated random password type \"auto\"." +msgstr "" +"Pokud chcete použít prázdné heslo, napiÅ¡te \"none\". Chcete-li vygenerovat " +"náhodné heslo, zadejte \"auto\"." + +#. Type: string +#. Description +#: ../diogenes.templates:105 +msgid "MySQL administrator username:" +msgstr "Uživatelské jméno administrátora databáze:" diff --git a/debian/po/de.po b/debian/po/de.po new file mode 100644 index 0000000..f5c312e --- /dev/null +++ b/debian/po/de.po @@ -0,0 +1,286 @@ +# translation of diogenes_0.9.10-3_templates.po to German +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans# +# Developers do not need to manually edit POT or PO files. +# Erik Schanze , 2004, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: diogenes_0.9.16-1_de\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-01-14 01:45+0100\n" +"PO-Revision-Date: 2005-06-02 22:51+0200\n" +"Last-Translator: Erik Schanze \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.9.1\n" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "Welcome to the Diogenes setup program" +msgstr "Willkommen zum Einrichtungsprogramm von Diogenes" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "" +"You must have a database server already setup and ready to go if you are " +"going to have this program configure your database for you. If you are not " +"comfortable with this, you should tell the debconf process that you do not " +"have any database server. You will then need to configure Diogenes manually." +msgstr "" +"Es muss ein Datenbank-Server eingerichtet und betriebsbereit sein, " +"wenn dieses Programm die Datenbank für Sie einrichten soll. Wenn Sie das " +"nicht möchten, geben Sie an, dass Sie keinen Datenbank-Server haben. Sie " +"müssen Diogenes dann manuell einrichten." + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "" +"If debconf is set up in a way that you will not be asked questions " +"interactively (i.e. you do not see this note during installation but as a " +"mail to your root account), Diogenes will assume that your web server is " +"apache and your database server is MySQL and no MySQL root password is set. " +"If any of these do not apply, Diogenes will not run unless you configure it " +"manually by creating its database and editing the files in /etc/diogenes." +msgstr "" +"Wenn debconf so eingerichtet ist, dass es interaktiv keine Fragen stellt " +"(z. B. Sie sehen diesen Hinweis nicht während der Installation, sondern als " +"E-Mail in Ihrem root-Postfach), hat Diogenes angenommen, dass Ihr Web-Server " +"Apache ist, als Datenbank MySQL verwendet wird und kein MySQL-root-Passwort " +"vergeben ist. Wenn etwas davon nicht zutrifft, wird Diogenes nicht " +"funktionieren bis Sie die Datenbank manuell eingerichtet und die Dateien in " +"/etc/diogenes angepasst haben." + +#. Type: boolean +#. Description +#: ../diogenes.templates:19 +msgid "Remove web site data after \"purging\" the diogenes package?" +msgstr "Daten der Web-Seiten beim restlosen Entfernen des Pakets Diogenes löschen?" + +#. Type: boolean +#. Description +#: ../diogenes.templates:19 +msgid "" +"Should the data that makes up Diogenes's web sites be removed when the " +"diogenes packages is purged with the \"dpkg --purge diogenes\" command (i.e. " +"remove everything including the configuration)?" +msgstr "" +"Sollen die Daten, aus denen die Web-Seiten von Diogenes zusammengebaut " +"werden, gelöscht werden, wenn das Paket mit dem Kommando \"dpkg --purge " +"diogenes\" (alles incl. Konfigurationsdateien löschen) entfernt wird?" + +#. Type: multiselect +#. Choices +#: ../diogenes.templates:26 +msgid "apache, apache-ssl, apache-perl, apache2" +msgstr "apache, apache-ssl, apache-perl, apache2" + +#. Type: multiselect +#. Description +#: ../diogenes.templates:28 +msgid "Type of web server:" +msgstr "Web-Server:" + +#. Type: multiselect +#. Description +#: ../diogenes.templates:28 +msgid "" +"By default Diogenes supports any web server that php4 does. This config " +"process currently only supports Apache directly. If you use another one you " +"will have to handle the web ends manually. If you choose the first option, " +"this install process will manage the configuration (or attempt to) of the " +"Apache specific portions necessary to run Diogenes properly." +msgstr "" +"Standardmäßig unterstützt Diogenes jeden Web-Server, der PHP4 kann. Dieses " +"Einrichtungsprogramm unterstützt nur Apache direkt. Wenn Sie einen anderen " +"benutzen, müssen Sie die Einrichtung manuell vornehmen. Wenn Sie den ersten " +"Eintrag auswählen, werden jetzt die Einstellungen der Apache-spezifischen " +"Teile, die für Diogenes nötig sind, vorgenommen (oder zumindest versucht). " +"Wenn Sie das nicht wollen, wählen Sie den Eintrag \"Anderer\" aus." + +#. Type: string +#. Description +#: ../diogenes.templates:38 +msgid "User your web server runs as:" +msgstr "Web-Server läuft unter Benutzer:" + +#. Type: string +#. Description +#: ../diogenes.templates:38 +msgid "" +"Unable to obtain the user your web server runs as. This is needed in order " +"to allow the web server to write the files that make up the Diogenes-managed " +"web sites." +msgstr "" +"Der Benutzer, unter dem Ihr Web-Server läuft, konnte nicht festgestellt " +"werden. Das ist nötig, um dem Web-Server das Schreiben der Dateien zu " +"ermöglichen, aus denen die von Diogenes verwalteten Web-Seiten " +"zusammengebaut werden." + +#. Type: string +#. Description +#: ../diogenes.templates:46 +msgid "Group your web server runs as:" +msgstr "Web-Server läuft unter Gruppe:" + +#. Type: string +#. Description +#: ../diogenes.templates:46 +msgid "" +"Unable to obtain the group your web server runs as. This is needed in order " +"to allow the web server to read Diogenes's configuration files." +msgstr "" +"Die Gruppe, unter der Ihr Web-Server läuft, konnte nicht festgestellt " +"werden. Das ist nötig, um dem Web-Server das Lesen der Konfigurationsdateien " +"von Diogenes zu ermöglichen." + +#. Type: select +#. Choices +#: ../diogenes.templates:52 +msgid "Automatic, Manual" +msgstr "Automatisch, Manuell" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "Type of database installation:" +msgstr "Art der Datenbank-Installation:" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "" +"If you want the setup program to ask you questions and do the database setup " +"for you, select \"Automatic\". (Recommended)" +msgstr "" +"Wenn das Einrichtungsprogramm Sie befragen und die Datenbank für Sie " +"einrichten soll, dann wählen Sie \"Automatisch\" aus. (empfohlen)" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "" +"If you want to configure your database by hand, select \"Manual\". In this " +"case you will have to create the Diogenes database and user by hand and " +"handle database upgrades manually." +msgstr "" +"Wenn Sie Ihre Datenbank selbst einrichten wollen, dann wählen Sie \"Manuell" +"\" aus. In diesem Fall müssen Sie die Datenbank und den Benutzer für " +"Diogenes manuell anlegen und Datenbank-Aktualisierungen selbst durchführen." + +#. Type: password +#. Description +#: ../diogenes.templates:64 +msgid "Database admin password:" +msgstr "Passwort des Datenbank-Administrators:" + +#. Type: password +#. Description +#: ../diogenes.templates:64 +msgid "" +"Enter the password for your database admin user to access the database. This " +"password had been set when installing your database. It is most likely NOT " +"the same password that your Diogenes manager account will use." +msgstr "" +"Geben Sie das Passwort des Datenbank-Administrators für den Zugriff auf die " +"Datenbank ein. Dieses Passwort wurde bei der Installation der Datenbank " +"vergeben. Es ist höchstwahrscheinlich NICHT das selbe Passwort wie das des " +"Diogenes Manager Zugangs." + +#. Type: string +#. Description +#: ../diogenes.templates:72 +msgid "Hostname of the database server:" +msgstr "Rechnername des Datenbank-Servers:" + +#. Type: string +#. Description +#: ../diogenes.templates:72 +msgid "" +"If your database is on another machine besides the one that Diogenes is " +"running on then you need to change this value to the fully qualified domain " +"name for that system." +msgstr "" +"Wenn Ihre Datenbank auf einem anderen Rechner installiert ist, als der, auf " +"dem Diogenes läuft, dann sollten Sie hier den vollständigen Rechnernamen " +"(FQDN) dieses Systems eingeben." + +#. Type: string +#. Description +#: ../diogenes.templates:80 +msgid "Name for the Diogenes database:" +msgstr "Name der Datenbank für Diogenes:" + +#. Type: string +#. Description +#: ../diogenes.templates:80 +msgid "" +"By default this will be \"diogenes\". This is where all the Diogenes " +"related database items will be setup and stored." +msgstr "" +"Standard ist \"diogenes\". Dort werden alle Datenbankeinträge gespeichert, " +"die Diogenes betreffen." + +#. Type: string +#. Description +#: ../diogenes.templates:87 +msgid "Database username:" +msgstr "Datenbank-Benutzername:" + +#. Type: string +#. Description +#: ../diogenes.templates:87 +msgid "" +"What username will access the database for Diogenes? By default this is " +"it's own user \"diogenes\" so that permissions can be tightened down." +msgstr "" +"Mit welchem Benutzernamen wird Diogenes auf die Datenbank zugreifen? " +"Standardmäßig hat es seinen eigenen Benutzer \"diogenes\", damit die " +"Zugriffsrechte eingeschränkt werden können." + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "Password for the Diogenes user:" +msgstr "Passwort für den Benutzer:" + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "" +"Enter a password for the database user which will be used along with the " +"database user name you have already supplied to connect to the database." +msgstr "" +"Vergeben Sie ein Passwort für den Datenbank-Benutzer, das zusammen mit dem " +"Benutzernamen, den Sie gerade eingegeben haben, verwendet wird, um sich mit " +"der Datenbank zu verbinden." + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "" +"If you wish to leave the password empty, type \"none\". If you wish to use " +"an automatically generated random password type \"auto\"." +msgstr "" +"Wenn Sie dieses Passwort leer lassen wollen, geben Sie \"none\" ein. Wenn " +"Sie ein automatisch erzeugtes, zufälliges Passwort wünschen, geben Sie " +"\"auto\" ein." + +#. Type: string +#. Description +#: ../diogenes.templates:105 +msgid "MySQL administrator username:" +msgstr "Benutzername des MySQL-Administrators:" + diff --git a/debian/po/es.po b/debian/po/es.po new file mode 100644 index 0000000..2a761f4 --- /dev/null +++ b/debian/po/es.po @@ -0,0 +1,282 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: diogenes 0.9.12-3\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-01-14 01:45+0100\n" +"PO-Revision-Date: 2004-07-04 21:54-0300\n" +"Last-Translator: Pablo Castellazzi \n" +"Language-Team: Pablo Castellazzi \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "Welcome to the Diogenes setup program" +msgstr "Bienvenido al programa de instalación de Diogenes" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "" +"You must have a database server already setup and ready to go if you are " +"going to have this program configure your database for you. If you are not " +"comfortable with this, you should tell the debconf process that you do not " +"have any database server. You will then need to configure Diogenes manually." +msgstr "" +"Debe tener un servidor de base de datos configurado y funcionando si desea " +"que este programa configure su base de datos por Ud. Si no está de acuerdo " +"debe decirle a debconf que no tiene ningun servidor de base de datos. Tendrá " +"entonces que configurar Diogenes manualmente." + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "" +"If debconf is set up in a way that you will not be asked questions " +"interactively (i.e. you do not see this note during installation but as a " +"mail to your root account), Diogenes will assume that your web server is " +"apache and your database server is MySQL and no MySQL root password is set. " +"If any of these do not apply, Diogenes will not run unless you configure it " +"manually by creating its database and editing the files in /etc/diogenes." +msgstr "" +"Si debconf está configurado en una forma en la que Ud. no responde a sus " +"preguntas interactivamente (ej. no ve esta nota durante la instalación, la " +"ve en un correo electrónico en la cuenta de root), Diogenes asumirá que su " +"servidor web es Apache, que su servidor de base de datos es MySQL y que noy " +"hay contraseña de root en MySQL. Si alguna de estas condiciones no se " +"cumple, Diogenes no funcionará hasta que sea configurado manualmente creando " +"su base de datos y modificando los archivos en /etc/diogenes." + +#. Type: boolean +#. Description +#: ../diogenes.templates:19 +msgid "Remove web site data after \"purging\" the diogenes package?" +msgstr "" +"¿Eliminar la información de los sitios web después de \"purgar\" el paquete " +"diogenes?" + +#. Type: boolean +#. Description +#: ../diogenes.templates:19 +msgid "" +"Should the data that makes up Diogenes's web sites be removed when the " +"diogenes packages is purged with the \"dpkg --purge diogenes\" command (i.e. " +"remove everything including the configuration)?" +msgstr "" +"¿La información de los sitios web de Diogenes deberá ser eliminada cuando el " +"paquete diogenes es purgado con el comando \"dpkg --purge diogenes\" (ej. " +"eliminar todo incluída la configuración)?" + +#. Type: multiselect +#. Choices +#: ../diogenes.templates:26 +msgid "apache, apache-ssl, apache-perl, apache2" +msgstr "" + +#. Type: multiselect +#. Description +#: ../diogenes.templates:28 +msgid "Type of web server:" +msgstr "Tipo del servidor web:" + +#. Type: multiselect +#. Description +#: ../diogenes.templates:28 +#, fuzzy +msgid "" +"By default Diogenes supports any web server that php4 does. This config " +"process currently only supports Apache directly. If you use another one you " +"will have to handle the web ends manually. If you choose the first option, " +"this install process will manage the configuration (or attempt to) of the " +"Apache specific portions necessary to run Diogenes properly." +msgstr "" +"Por omisión Diogenes soporta cualquier servidor web con php4. Este proceso " +"de configuración solo soporta Apache directamente. Si utiliza otro servidor " +"deberá manejarlo manualmente. Si selecciona la primera opción, este proceso " +"de instalación manejará las porciones necesarias de la configuración de " +"Apache (o intentará) para ejecutar Diogenes como es debido. Si no desea que " +"esto ocurra por favor seleccione la opción \"Otros\"." + +#. Type: string +#. Description +#: ../diogenes.templates:38 +msgid "User your web server runs as:" +msgstr "Usuario bajo el que su servidor web es ejecutado:" + +#. Type: string +#. Description +#: ../diogenes.templates:38 +msgid "" +"Unable to obtain the user your web server runs as. This is needed in order " +"to allow the web server to write the files that make up the Diogenes-managed " +"web sites." +msgstr "" +"Imposible obtener el usuario bajo el que su servidor web es ejecutado. Esto " +"es necesario para permitirle escribir los archivos de los sitios manejados " +"por Diogenes." + +#. Type: string +#. Description +#: ../diogenes.templates:46 +msgid "Group your web server runs as:" +msgstr "Grupo bajo el que su servidor web es ejecutado:" + +#. Type: string +#. Description +#: ../diogenes.templates:46 +msgid "" +"Unable to obtain the group your web server runs as. This is needed in order " +"to allow the web server to read Diogenes's configuration files." +msgstr "" +"Imposible obtener el grupo bajo el que su servidor web es ejecutado. Esto es " +"necesario para permitirle escribir los archivos de los sitios manejados por " +"Diogenes." + +#. Type: select +#. Choices +#: ../diogenes.templates:52 +msgid "Automatic, Manual" +msgstr "Automático, Manual" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "Type of database installation:" +msgstr "Tipo de la instalación de la base de datos:" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "" +"If you want the setup program to ask you questions and do the database setup " +"for you, select \"Automatic\". (Recommended)" +msgstr "" +"Si quiere que este programa le consule y configure la base de datos por Ud. " +"seleccione \"Automático\". (Recomendado)" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "" +"If you want to configure your database by hand, select \"Manual\". In this " +"case you will have to create the Diogenes database and user by hand and " +"handle database upgrades manually." +msgstr "" +"Si quiere configurar su base de datos manualmente seleccione \"Manual\". En " +"este caso tendrá que crear el usuario y la base de datos de Diogenes a mano, " +"y manejar las actualizaciones de la base de datos de igual manera." + +#. Type: password +#. Description +#: ../diogenes.templates:64 +msgid "Database admin password:" +msgstr "Contraseña del administrador de la base datos:" + +#. Type: password +#. Description +#: ../diogenes.templates:64 +msgid "" +"Enter the password for your database admin user to access the database. This " +"password had been set when installing your database. It is most likely NOT " +"the same password that your Diogenes manager account will use." +msgstr "" +"Ingrese la contraseña del usuario administrador de la base de datos. Esta " +"contraseña fue puesta cuando instaló la base de datos. Se recomienda que NO " +"sea la misma que la del usuario administrador de Diogenes." + +#. Type: string +#. Description +#: ../diogenes.templates:72 +msgid "Hostname of the database server:" +msgstr "Nombre del servidor de base de datos:" + +#. Type: string +#. Description +#: ../diogenes.templates:72 +msgid "" +"If your database is on another machine besides the one that Diogenes is " +"running on then you need to change this value to the fully qualified domain " +"name for that system." +msgstr "" +"Si su base de datos se encuentra en otra maquina distinta a la que Diogenes " +"se está ejecutando debe cambiar este valor a un nombre de dominio válido " +"para su sistema." + +#. Type: string +#. Description +#: ../diogenes.templates:80 +msgid "Name for the Diogenes database:" +msgstr "Nombre para la base de datos de Diogenes:" + +#. Type: string +#. Description +#: ../diogenes.templates:80 +msgid "" +"By default this will be \"diogenes\". This is where all the Diogenes " +"related database items will be setup and stored." +msgstr "" +"Por omisión será \"diogenes\". Esto es donde Diogenes configurará y guardará " +"todos los elementos relacionados con su base datos." + +#. Type: string +#. Description +#: ../diogenes.templates:87 +msgid "Database username:" +msgstr "Usuario de la base de datos:" + +#. Type: string +#. Description +#: ../diogenes.templates:87 +msgid "" +"What username will access the database for Diogenes? By default this is " +"it's own user \"diogenes\" so that permissions can be tightened down." +msgstr "" +"¿Cual usuario accederá a la base de datos de Diogenes? Por omisión es su " +"propio usuario \"diogenes\", asi los permisos pueden ser reforzados." + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "Password for the Diogenes user:" +msgstr "Contraseña para el usuario Diogenes:" + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "" +"Enter a password for the database user which will be used along with the " +"database user name you have already supplied to connect to the database." +msgstr "" +"Ingrese una contraseña para el usuario de la base de datos anteriormente " +"mencionado." + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "" +"If you wish to leave the password empty, type \"none\". If you wish to use " +"an automatically generated random password type \"auto\"." +msgstr "" +"Si desea dejar la contraseña vacía ingrese \"none\". Si desea que se genere " +"de forma aleatoria ingrese \"auto\"." + +#. Type: string +#. Description +#: ../diogenes.templates:105 +msgid "MySQL administrator username:" +msgstr "Usuario administrador de MySQL:" diff --git a/debian/po/fr.po b/debian/po/fr.po new file mode 100644 index 0000000..296c68b --- /dev/null +++ b/debian/po/fr.po @@ -0,0 +1,287 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: diogenes 0.9.15-1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-01-14 01:45+0100\n" +"PO-Revision-Date: 2005-02-21 22:06+0100\n" +"Last-Translator: Nicolas Bertolissio \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "Welcome to the Diogenes setup program" +msgstr "Bienvenue dans le programme de paramétrage de diogenes" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "" +"You must have a database server already setup and ready to go if you are " +"going to have this program configure your database for you. If you are not " +"comfortable with this, you should tell the debconf process that you do not " +"have any database server. You will then need to configure Diogenes manually." +msgstr "" +"Vous devez déjà avoir un serveur de bases de données paramétré et prêt si " +"vous souhaitez que ce programme configure la base de données pour vous. Si " +"cela ne vous convient pas, vous devriez indiquer au processus debconf que " +"vous n'avez pas de serveur de bases de données. Vous devrez ensuite " +"configurer diogenes vous-même." + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "" +"If debconf is set up in a way that you will not be asked questions " +"interactively (i.e. you do not see this note during installation but as a " +"mail to your root account), Diogenes will assume that your web server is " +"apache and your database server is MySQL and no MySQL root password is set. " +"If any of these do not apply, Diogenes will not run unless you configure it " +"manually by creating its database and editing the files in /etc/diogenes." +msgstr "" +"Si debconf est paramétré pour ne pas vous poser de questions de façon " +"interactive (c'est-à-dire que vous ne voyez pas cette note pendant " +"l'installation mais dans un courriel adressé au super-utilisateur), diogenes " +"supposera que votre serveur web est apache, que votre serveur de bases de " +"données est MySQL et qu'il n'y a pas de mot de passe pour l'administrateur " +"de MySQL. Si l'une de ces conditions ne s'applique pas, diogenes ne " +"fonctionnera pas tant que vous ne l'aurez pas configuré vous-même en créant " +"sa base de données et en modifiant les fichiers dans /etc/diogenes." + +#. Type: boolean +#. Description +#: ../diogenes.templates:19 +msgid "Remove web site data after \"purging\" the diogenes package?" +msgstr "Supprimer les données du site lors de la purge du paquet ?" + +#. Type: boolean +#. Description +#: ../diogenes.templates:19 +msgid "" +"Should the data that makes up Diogenes's web sites be removed when the " +"diogenes packages is purged with the \"dpkg --purge diogenes\" command (i.e. " +"remove everything including the configuration)?" +msgstr "" +"Veuillez choisir si vous souhaitez supprimer les données créées pour les " +"sites de diogenes lors de la purge du paquet par la commande « dpkg --purge " +"diogenes » (c'est-à-dire tout supprimer y compris la configuration)." + +#. Type: multiselect +#. Choices +#: ../diogenes.templates:26 +msgid "apache, apache-ssl, apache-perl, apache2" +msgstr "apache, apache-ssl, apache-perl, apache2" + +#. Type: multiselect +#. Description +#: ../diogenes.templates:28 +msgid "Type of web server:" +msgstr "Type de serveur web :" + +#. Type: multiselect +#. Description +#: ../diogenes.templates:28 +msgid "" +"By default Diogenes supports any web server that php4 does. This config " +"process currently only supports Apache directly. If you use another one you " +"will have to handle the web ends manually. If you choose the first option, " +"this install process will manage the configuration (or attempt to) of the " +"Apache specific portions necessary to run Diogenes properly." +msgstr "" +"Par défaut, diogenes gère les mêmes serveurs web que PHP4. Le processus de " +"configuration actuel ne supporte directement qu'apache. Si vous en utilisez " +"un autre, vous devrez vous occuper de la partie web vous-même. Si vous " +"choisissez la première option, le processus d'installation gérera (ou " +"essayera de gérer) la configuration des parties d'apache spécifiques " +"nécessaires au fonctionnement correct de diogenes." + +#. Type: string +#. Description +#: ../diogenes.templates:38 +msgid "User your web server runs as:" +msgstr "Identifiant utilisé par le serveur web :" + +#. Type: string +#. Description +#: ../diogenes.templates:38 +msgid "" +"Unable to obtain the user your web server runs as. This is needed in order " +"to allow the web server to write the files that make up the Diogenes-managed " +"web sites." +msgstr "" +"Il s'est avéré impossible d'obtenir l'identifiant qu'utilise le serveur web " +"pour fonctionner. Cet identifiant est nécessaire pour permettre au serveur " +"web de gérer les fichiers qui composent les sites gérés par diogenes." + +#. Type: string +#. Description +#: ../diogenes.templates:46 +msgid "Group your web server runs as:" +msgstr "Groupe utilisé par le serveur web :" + +#. Type: string +#. Description +#: ../diogenes.templates:46 +msgid "" +"Unable to obtain the group your web server runs as. This is needed in order " +"to allow the web server to read Diogenes's configuration files." +msgstr "" +"Il s'est avéré impossible d'obtenir le groupe utilisé par le serveur web " +"pour fonctionner. Ce groupe est nécessaire pour permettre au serveur web de " +"lire les fichiers de configuration de diogenes." + +#. Type: select +#. Choices +#: ../diogenes.templates:52 +msgid "Automatic, Manual" +msgstr "Automatique, Manuelle" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "Type of database installation:" +msgstr "Type d'installation de la base de données :" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "" +"If you want the setup program to ask you questions and do the database setup " +"for you, select \"Automatic\". (Recommended)" +msgstr "" +"Si vous souhaitez que le programme de paramétrage vous pose des questions et " +"paramètre la base de données pour vous, veuillez choisir " +"« Automatique » (option recommandée)." + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "" +"If you want to configure your database by hand, select \"Manual\". In this " +"case you will have to create the Diogenes database and user by hand and " +"handle database upgrades manually." +msgstr "" +"Si vous souhaitez configurer la base de données vous-même, veuillez choisir " +"« Manuelle ». Dans ce cas vous devrez créer l'utilisateur et la base de " +"données de diogenes et vous occuper des mises à jour de la base de données " +"vous-même." + +#. Type: password +#. Description +#: ../diogenes.templates:64 +msgid "Database admin password:" +msgstr "Mot de passe de l'administrateur du serveur de bases de données :" + +#. Type: password +#. Description +#: ../diogenes.templates:64 +msgid "" +"Enter the password for your database admin user to access the database. This " +"password had been set when installing your database. It is most likely NOT " +"the same password that your Diogenes manager account will use." +msgstr "" +"Veuillez indiquer le mot de passe de l'administrateur de votre serveur de " +"bases de données. Ce mot de passe a été établi lors de l'installation de " +"votre serveur de bases de données. Il y a de fortes chances qu'il ne soit " +"PAS le même que celui utilisé pour le compte du gestionnaire de diogenes." + +#. Type: string +#. Description +#: ../diogenes.templates:72 +msgid "Hostname of the database server:" +msgstr "Nom d'hôte du serveur de bases de données :" + +#. Type: string +#. Description +#: ../diogenes.templates:72 +msgid "" +"If your database is on another machine besides the one that Diogenes is " +"running on then you need to change this value to the fully qualified domain " +"name for that system." +msgstr "" +"Si votre serveur de bases de données est sur une machine autre que celle où " +"fonctionne diogenes, vous devez modifier cette valeur et indiquer le nom de " +"domaine complètement qualifié de ce système." + +#. Type: string +#. Description +#: ../diogenes.templates:80 +msgid "Name for the Diogenes database:" +msgstr "Nom de la base de données de diogenes :" + +#. Type: string +#. Description +#: ../diogenes.templates:80 +msgid "" +"By default this will be \"diogenes\". This is where all the Diogenes " +"related database items will be setup and stored." +msgstr "" +"Par défaut, il s'agit de « diogenes ». C'est l'endroit où tous les objets de " +"base de données liés à diogenes sont paramétrés et conservés." + +#. Type: string +#. Description +#: ../diogenes.templates:87 +msgid "Database username:" +msgstr "Propriétaire de la base de données :" + +#. Type: string +#. Description +#: ../diogenes.templates:87 +msgid "" +"What username will access the database for Diogenes? By default this is " +"it's own user \"diogenes\" so that permissions can be tightened down." +msgstr "" +"Veuillez indiquer l'identifiant qu'utilisera diogenes pour accéder à la base " +"de données pour diogenes. Par défaut, il s'agit de l'utilisateur " +"« diogenes » lui-même, ce qui permet de restreindre les permissions." + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "Password for the Diogenes user:" +msgstr "Mot de passe du propriétaire de la base de données :" + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "" +"Enter a password for the database user which will be used along with the " +"database user name you have already supplied to connect to the database." +msgstr "" +"Veuillez indiquer un mot de passe pour le propriétaire de la base de données." +"Il s'agit du mot de passe qui sera utilisé avec l'identifiant du " +"propriétaire pour se connecter à la base de données." + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "" +"If you wish to leave the password empty, type \"none\". If you wish to use " +"an automatically generated random password type \"auto\"." +msgstr "" +"Si vous souhaitez ne pas utiliser de mot de passe, veuillez indiquer " +"« none », aucun. Si vous souhaitez utiliser un mot de passe généré de " +"manière aléatoire, veuillez indiquer « auto »." + +#. Type: string +#. Description +#: ../diogenes.templates:105 +msgid "MySQL administrator username:" +msgstr "Nom de l'administrateur de MySQL :" diff --git a/debian/po/templates.pot b/debian/po/templates.pot new file mode 100644 index 0000000..22c99cb --- /dev/null +++ b/debian/po/templates.pot @@ -0,0 +1,235 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-01-14 01:45+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "Welcome to the Diogenes setup program" +msgstr "" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "" +"You must have a database server already setup and ready to go if you are " +"going to have this program configure your database for you. If you are not " +"comfortable with this, you should tell the debconf process that you do not " +"have any database server. You will then need to configure Diogenes manually." +msgstr "" + +#. Type: note +#. Description +#: ../diogenes.templates:3 +msgid "" +"If debconf is set up in a way that you will not be asked questions " +"interactively (i.e. you do not see this note during installation but as a " +"mail to your root account), Diogenes will assume that your web server is " +"apache and your database server is MySQL and no MySQL root password is set. " +"If any of these do not apply, Diogenes will not run unless you configure it " +"manually by creating its database and editing the files in /etc/diogenes." +msgstr "" + +#. Type: boolean +#. Description +#: ../diogenes.templates:19 +msgid "Remove web site data after \"purging\" the diogenes package?" +msgstr "" + +#. Type: boolean +#. Description +#: ../diogenes.templates:19 +msgid "" +"Should the data that makes up Diogenes's web sites be removed when the " +"diogenes packages is purged with the \"dpkg --purge diogenes\" command (i.e. " +"remove everything including the configuration)?" +msgstr "" + +#. Type: multiselect +#. Choices +#: ../diogenes.templates:26 +msgid "apache, apache-ssl, apache-perl, apache2" +msgstr "" + +#. Type: multiselect +#. Description +#: ../diogenes.templates:28 +msgid "Type of web server:" +msgstr "" + +#. Type: multiselect +#. Description +#: ../diogenes.templates:28 +msgid "" +"By default Diogenes supports any web server that php4 does. This config " +"process currently only supports Apache directly. If you use another one you " +"will have to handle the web ends manually. If you choose the first option, " +"this install process will manage the configuration (or attempt to) of the " +"Apache specific portions necessary to run Diogenes properly." +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:38 +msgid "User your web server runs as:" +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:38 +msgid "" +"Unable to obtain the user your web server runs as. This is needed in order " +"to allow the web server to write the files that make up the Diogenes-managed " +"web sites." +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:46 +msgid "Group your web server runs as:" +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:46 +msgid "" +"Unable to obtain the group your web server runs as. This is needed in order " +"to allow the web server to read Diogenes's configuration files." +msgstr "" + +#. Type: select +#. Choices +#: ../diogenes.templates:52 +msgid "Automatic, Manual" +msgstr "" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "Type of database installation:" +msgstr "" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "" +"If you want the setup program to ask you questions and do the database setup " +"for you, select \"Automatic\". (Recommended)" +msgstr "" + +#. Type: select +#. Description +#: ../diogenes.templates:54 +msgid "" +"If you want to configure your database by hand, select \"Manual\". In this " +"case you will have to create the Diogenes database and user by hand and " +"handle database upgrades manually." +msgstr "" + +#. Type: password +#. Description +#: ../diogenes.templates:64 +msgid "Database admin password:" +msgstr "" + +#. Type: password +#. Description +#: ../diogenes.templates:64 +msgid "" +"Enter the password for your database admin user to access the database. This " +"password had been set when installing your database. It is most likely NOT " +"the same password that your Diogenes manager account will use." +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:72 +msgid "Hostname of the database server:" +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:72 +msgid "" +"If your database is on another machine besides the one that Diogenes is " +"running on then you need to change this value to the fully qualified domain " +"name for that system." +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:80 +msgid "Name for the Diogenes database:" +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:80 +msgid "" +"By default this will be \"diogenes\". This is where all the Diogenes " +"related database items will be setup and stored." +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:87 +msgid "Database username:" +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:87 +msgid "" +"What username will access the database for Diogenes? By default this is " +"it's own user \"diogenes\" so that permissions can be tightened down." +msgstr "" + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "Password for the Diogenes user:" +msgstr "" + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "" +"Enter a password for the database user which will be used along with the " +"database user name you have already supplied to connect to the database." +msgstr "" + +#. Type: password +#. Description +#: ../diogenes.templates:94 +msgid "" +"If you wish to leave the password empty, type \"none\". If you wish to use " +"an automatically generated random password type \"auto\"." +msgstr "" + +#. Type: string +#. Description +#: ../diogenes.templates:105 +msgid "MySQL administrator username:" +msgstr "" diff --git a/debian/po/vi.po b/debian/po/vi.po new file mode 100644 index 0000000..66a488c --- /dev/null +++ b/debian/po/vi.po @@ -0,0 +1,226 @@ +# Vietnamese translation for diogenes. +# Copyright © 2005 Free Software Foundation, Inc. +# Clytie Siddall , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: diogenes 0.9.16-1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-01-14 01:45+0100\n" +"PO-Revision-Date: 2005-06-14 18:28+0930\n" +"Last-Translator: Clytie Siddall \n" +"Language-Team: Vietnamese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#.Type: note +#.Description +#:../diogenes.templates:3 +msgid "Welcome to the Diogenes setup program" +msgstr "Chúc mừng bạn dùng chÆ°Æ¡ng trình thiết lập Diogenes" + +#.Type: note +#.Description +#:../diogenes.templates:3 +msgid "" +"You must have a database server already setup and ready to go if you are " +"going to have this program configure your database for you. If you are not " +"comfortable with this, you should tell the debconf process that you do not " +"have any database server. You will then need to configure Diogenes manually." +msgstr "Nếu bạn muốn trình này cấu hình cÆ¡ sở dữ liệu cho bạn, cần phải đã thiết lập một trình phục vụ cÆ¡ sở dữ liệu trước này. Nếu bạn chÆ°a sẵn sàng, hãy báo tiến trình debconf bạn không có trình phục vụ cÆ¡ sở dữ liệu. NhÆ° thế thì bạn sẽ cần phải tá»± cấu hình trình Diogenes." + +#.Type: note +#.Description +#:../diogenes.templates:3 +msgid "" +"If debconf is set up in a way that you will not be asked questions " +"interactively (i.e. you do not see this note during installation but as a " +"mail to your root account), Diogenes will assume that your web server is " +"apache and your database server is MySQL and no MySQL root password is set. " +"If any of these do not apply, Diogenes will not run unless you configure it " +"manually by creating its database and editing the files in /etc/diogenes." +msgstr "Nếu bạn đã lập trình debconf không tÆ°Æ¡ng tác với bạn (tức là bạn không xem thông điệp này trong khi cài đặt, có xem nó trong một thÆ° được gá»­i cho tài khoản người chủ) thì trình Diogenes sẽ giả sá»­ trình phục vụ Mạng là Apache, trình phục vụ cÆ¡ sở dữ liệu là MySQL, và chÆ°a lập mật khẩu người chủ MySQL. Nếu bất cứ điều nào trong những giá trị này không phải đúng, trình Diogenes sẽ không chạy, cho đến khi bạn tá»± cấu hình nó bằng cách tạo một cÆ¡ sở dữ liệu cho nó và hiệu chỉnh những tập tin trong «/etc/diogenes»." + +#.Type: boolean +#.Description +#:../diogenes.templates:19 +msgid "Remove web site data after \"purging\" the diogenes package?" +msgstr "Loại bỏ các dữ liệu trong nÆ¡i Mạng sau khi tẩy gói tin Diogenes không?" + +#.Type: boolean +#.Description +#:../diogenes.templates:19 +msgid "" +"Should the data that makes up Diogenes's web sites be removed when the " +"diogenes packages is purged with the \"dpkg --purge diogenes\" command (i.e. " +"remove everything including the configuration)?" +msgstr "Bạn có muốn xóa bỏ các dữ liệu trong các bộ trang Mạng Diogenes vào cùng lúc với lúc tẩy những gói tin Diogenes dùng lệnh «dpkg --purge diogenes» (tức là loại bỏ mọi điều gồm cấu hình) không?" + +#.Type: multiselect +#.Choices +#:../diogenes.templates:26 +msgid "apache, apache-ssl, apache-perl, apache2" +msgstr "apache, apache-ssl, apache-perl, apache2" + +#.Type: multiselect +#.Description +#:../diogenes.templates:28 +msgid "Type of web server:" +msgstr "Loại trình phục vụ Mạng:" + +#.Type: multiselect +#.Description +#:../diogenes.templates:28 +msgid "" +"By default Diogenes supports any web server that php4 does. This config " +"process currently only supports Apache directly. If you use another one you " +"will have to handle the web ends manually. If you choose the first option, " +"this install process will manage the configuration (or attempt to) of the " +"Apache specific portions necessary to run Diogenes properly." +msgstr "Mặc định là trình Diogenes hỗ trợ cùng mọi trình phục vụ Mạng với PHP4. Tuy nhiên, tiến trình cấu hình này hiện thời hỗ trợ chỉ Apache một cách trá»±c tiếp. Nếu bạn sá»­ dụng một trình phục vụ Mạng khác, thì cần phải tá»± cấu hình nó. Nếu bạn chọn tùy chọn thứ nhất, tiến trình cài đặt này sẽ (cố) quản lý cấu hình các phần Apache cần thiết để chạy trình Diogenes cho đúng." + +#.Type: string +#.Description +#:../diogenes.templates:38 +msgid "User your web server runs as:" +msgstr "Trình phục vụ Mạng chạy với tÆ° cách người dùng nào?" + +#.Type: string +#.Description +#:../diogenes.templates:38 +msgid "" +"Unable to obtain the user your web server runs as. This is needed in order " +"to allow the web server to write the files that make up the Diogenes-managed " +"web sites." +msgstr "Không thể gọi người dùng có chạy trình phục vụ Mạng. Cần đến thông tin này để cho phép trình phục vụ Mạng ghi những tập tin là những bộ trang Mạng do Diogenes quản lý." + +#.Type: string +#.Description +#:../diogenes.templates:46 +msgid "Group your web server runs as:" +msgstr "Trình phục vụ Mạng chạy với tÆ° cách nhóm nào?" + +#.Type: string +#.Description +#:../diogenes.templates:46 +msgid "" +"Unable to obtain the group your web server runs as. This is needed in order " +"to allow the web server to read Diogenes's configuration files." +msgstr "Không thể gọi nhóm có chạy trình phục vụ Mạng. Cần đến thông tin này để cho phép trình phục vụ Mạng đọc những tập tin cấu hình Diogenes." + +#.Type: select +#.Choices +#:../diogenes.templates:52 +msgid "Automatic, Manual" +msgstr "Tá»± động, Thủ công" + +#.Type: select +#.Description +#:../diogenes.templates:54 +msgid "Type of database installation:" +msgstr "Cách cài đặt cÆ¡ sở dữ liệu:" + +#.Type: select +#.Description +#:../diogenes.templates:54 +msgid "" +"If you want the setup program to ask you questions and do the database setup " +"for you, select \"Automatic\". (Recommended)" +msgstr "Nếu bạn muốn chÆ°Æ¡ng trình thiết lập thiết lập cÆ¡ sở dữ liệu cho bạn, hỏi bạn nhập thông tin cần thiết, thì bạn hãy chọn «Tá»± động» (có khuyên tùy chọn này)." + +#.Type: select +#.Description +#:../diogenes.templates:54 +msgid "" +"If you want to configure your database by hand, select \"Manual\". In this " +"case you will have to create the Diogenes database and user by hand and " +"handle database upgrades manually." +msgstr "Nếu bạn muốn tá»± cấu hình cÆ¡ sở dữ liệu, hãy chọn «Thủ công». NhÆ° thế thì bạn sẽ cần phải tạo cÆ¡ sở dữ liệu và người dùng Diogenes, và cÅ©ng hãy tá»± quản lý mỗi lần nâng cấp cÆ¡ sở dữ liệu." + +#.Type: password +#.Description +#:../diogenes.templates:64 +msgid "Database admin password:" +msgstr "Mật khẩu quản trị cÆ¡ sở dữ liệu:" + +#.Type: password +#.Description +#:../diogenes.templates:64 +msgid "" +"Enter the password for your database admin user to access the database. This " +"password had been set when installing your database. It is most likely NOT " +"the same password that your Diogenes manager account will use." +msgstr "Hãy nhập mật khẩu cho phép người dùng quản lý cÆ¡ sở dữ liệu truy cập cÆ¡ sở dữ liệu ấy. Mật khẩu này được lập trong khi cài đặt cÆ¡ sở dữ liệu ấy. Rất có thể là nó • không phải • là cùng một mật khẩu với điều trong tài khoản quản trị Diogenes." + +#.Type: string +#.Description +#:../diogenes.templates:72 +msgid "Hostname of the database server:" +msgstr "Tên máy của máy phục vụ cÆ¡ sở dữ liệu:" + +#.Type: string +#.Description +#:../diogenes.templates:72 +msgid "" +"If your database is on another machine besides the one that Diogenes is " +"running on then you need to change this value to the fully qualified domain " +"name for that system." +msgstr "Nếu cÆ¡ sở dữ liệu bạn có trên một máy khác với máy có chạy trình Diogenes, thì bạn cần phải thay đổi giá trị này thành tên miền khả năng đầy đủ (FQDN) cho hệ thống ấy." + +#.Type: string +#.Description +#:../diogenes.templates:80 +msgid "Name for the Diogenes database:" +msgstr "Tên cho cÆ¡ sở dữ liệu Diogenes:" + +#.Type: string +#.Description +#:../diogenes.templates:80 +msgid "" +"By default this will be \"diogenes\". This is where all the Diogenes " +"related database items will be setup and stored." +msgstr "Tên mặc định là «diogenes». Sẽ thiết lập và cất giữ các mục cÆ¡ sở dữ liệu liên quan đến Diogenes tại đây." + +#.Type: string +#.Description +#:../diogenes.templates:87 +msgid "Database username:" +msgstr "Tên người dùng cÆ¡ sở dữ liệu:" + +#.Type: string +#.Description +#:../diogenes.templates:87 +msgid "" +"What username will access the database for Diogenes? By default this is " +"it's own user \"diogenes\" so that permissions can be tightened down." +msgstr "Diogenes sẽ dùng tên người dùng nào để truy cập cÆ¡ sở dữ liệu ấy? Mặc định là người dùng của chính nó, «diogenes», để bản quản hệ thống bảo mật hÆ¡n." + +#.Type: password +#.Description +#:../diogenes.templates:94 +msgid "Password for the Diogenes user:" +msgstr "Mật khẩu cho người dùng Diogenes:" + +#.Type: password +#.Description +#:../diogenes.templates:94 +msgid "" +"Enter a password for the database user which will be used along with the " +"database user name you have already supplied to connect to the database." +msgstr "Hãy nhập một mật khẩu cho người dùng cÆ¡ sở dữ liệu. CÅ©ng với tên người dùng cÆ¡ sở dữ liệu đã cung cấp, mật khẩu này sẽ được dùng để kết nối đến cÆ¡ sở dữ liệu ấy." + +#.Type: password +#.Description +#:../diogenes.templates:94 +msgid "" +"If you wish to leave the password empty, type \"none\". If you wish to use " +"an automatically generated random password type \"auto\"." +msgstr "Nếu bạn chÆ°a muốn lập một mật khẩu, hãy gõ «none» (không có). Nếu bạn muốn sá»­ dụng một mật khẩu sẽ được tạo ra tá»± động, hãy gõ «auto» (tá»± động)." + +#.Type: string +#.Description +#:../diogenes.templates:105 +msgid "MySQL administrator username:" +msgstr "Tên người dùng của quản trị MySQL:" diff --git a/debian/prefix.sql b/debian/prefix.sql new file mode 100644 index 0000000..76cf14d --- /dev/null +++ b/debian/prefix.sql @@ -0,0 +1,4 @@ +# establish connection to database + +connect @dbname@; + diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..ba1daf9 --- /dev/null +++ b/debian/rules @@ -0,0 +1,47 @@ +#!/usr/bin/make -f +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/makefile.mk + +# definitions +SCRIPTDIR := usr/share/diogenes/scripts + +# documentation +DEB_INSTALL_DOCS_ALL := +DEB_INSTALL_DOCS_diogenes := AUTHORS README +DEB_INSTALL_DOCS_libphp-diogenes := include/diogenes/AUTHORS + +# changelogs +DEB_INSTALL_CHANGELOGS_ALL := +DEB_INSTALL_CHANGELOGS_diogenes := ChangeLog +DEB_INSTALL_CHANGELOGS_libphp-diogenes := include/diogenes/ChangeLog + +#directories +DEB_INSTALL_DIRS_diogenes := etc/diogenes var/lib/diogenes var/spool/diogenes/templates_c var/spool/diogenes/diogenes_c + +binary-install/diogenes:: + # config + dh_install -X.arch-ids -pdiogenes debian/diogenes.debian.inc.php \ + debian/diogenes.config.inc.php \ + config/apache.conf \ + usr/share/diogenes/config + + # files for db installation + dh_install -X.arch-ids -pdiogenes config/updatedb.php $(SCRIPTDIR) + cat debian/prefix.sql config/db/diogenes.sql > debian/diogenes/$(SCRIPTDIR)/diogenes.tables.sql.in + cat debian/prefix.sql config/db/diogenes.logactions.sql > debian/diogenes/$(SCRIPTDIR)/diogenes.logactions.sql.in + + # PHP files, templates, locales et al. + dh_install -X.arch-ids -pdiogenes -Xdiogenes.globals.inc.php.in \ + cvs.pl style.css \ + htdocs include locale plugins templates \ + usr/share/diogenes + + # remove library files + rm -rf debian/diogenes/usr/share/diogenes/include/diogenes + +binary-install/libphp-diogenes:: + + # PHP files and templates + dh_install -X.arch-ids -plibphp-diogenes include/diogenes/*.php usr/share/php/diogenes + dh_install -X.arch-ids -plibphp-diogenes include/diogenes/templates usr/share/php/diogenes + diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..a916052 --- /dev/null +++ b/debian/watch @@ -0,0 +1,3 @@ +version=2 +# Site/Directory Pattern Version Script +http://opensource.polytechnique.org/dist/ diogenes-([\d\.]+)\.tar\.gz debian uupdate diff --git a/diogenes.kdevelop b/diogenes.kdevelop new file mode 100644 index 0000000..260a63a --- /dev/null +++ b/diogenes.kdevelop @@ -0,0 +1,123 @@ + + + + Jeremy Laine + jeremy.laine@m4x.org + $VERSION$ + KDevScriptProject + PHP + + KDevClearCase + CvsService + KDevDebugger + KDevDoxygen + KDevdistpart + KDevPerforce + KDevsubversion + KDevVisualBoyAdvance + + . + false + + + + + + *.php + *{arch}/* + + + executable + + + + + gtk + kde + gnustep + python + perl + + + + + true + true + false + + + 0 + + + http://localhost/ + 2 + + + + /usr/local/bin/php + + + + + ada + ada_bugs_gcc + bash + bash_bugs + c++_bugs_gcc + clanlib + fortran_bugs_gcc + gnome1 + gnustep + gtk + gtk_bugs + haskell + haskell_bugs_ghc + java_bugs_gcc + java_bugs_sun + kde2book + libc + libstdc++ + opengl + pascal_bugs_fp + perl + perl_bugs + python + python_bugs + qt-kdev3 + ruby + ruby_bugs + sdl + stl + sw + wxwidgets_bugs + + + Guide to the Qt Translation Tools + Qt Assistant Manual + Qt Designer Manual + Qt Reference Documentation + qmake User Guide + + + KDE Libraries (Doxygen) + + + + + + + + + + + + + false + false + + + *.o,*.lo,CVS + false + + + diff --git a/htdocs/common.css b/htdocs/common.css new file mode 100644 index 0000000..4ad9ebe --- /dev/null +++ b/htdocs/common.css @@ -0,0 +1,253 @@ +/* block definitions */ + +/* header */ + +#header { + color: white; + background-color: #444444; +} + +#header .logo { + float: left; + width: 190px; +} + +#header .titlebar { + margin-left: 210px; + padding: 5px; +} + +#header .site { + display: inline; + font-size: 20pt; + font-weight: bold; + letter-spacing: 4px; +} + +#header .page { + display: inline; + padding-left: 10px; + font-size: 16pt; + font-weight: bold; +} + +/* the debugging banner */ + +#debug { + background-color: #777777; + font-size: 11pt; +} + +#debug .title { + display: inline; + padding-left: 5px; + padding-right: 10px; +} + +#debug .item { + display: inline; + background-color: #999999; + padding-left: 5px; + padding-right: 5px; + border: 1px black solid; +} + +#debug .item:hover { + background-color: #dddddd; +} + +#debug .hide { + display: none; + background-color: white; + padding: 15px; + border: 1px black solid; + position: fixed; +} + +#call-trace:hover div.hide { display: block; } + +#db-trace:hover div.hide { display: block; } + +#plugins-trace:hover div.hide { display: block; } + +/* the sidebar */ + +#sidebar { + float: left; + margin: 5px; + padding: 5px; + font-size: 10pt; +} + +/* the main display area */ + +#main { + padding: 5px; + margin-right: 40px; + margin-left: 210px; + font-size: 11pt; +} + +/* the footer */ + +#footer { + clear: both; + text-align: center; + padding: 10px; + font-size: 9pt; +} + + +/* element redefinitions */ +body +{ + background-color:white; + border:0; + margin: 0; + font-family:verdana,arial,sans-serif; +} + +a { + color: #70100c; +} + +img { + border:0; +} + +h2 { + font-size: 14pt; +} + +h3 { + font-size: 12pt; +} + + +/* classic menu */ +.menu { + margin: 0px; + padding: 0px; + text-align: left; + width: 180px; +} + +.menu a { + text-decoration: none; + display: block; +} + +.menu .item a { + padding-top: 2px; + padding-bottom: 3px; + padding-left: 10px; + padding-right: 10px; + background-color: #fbd080; + color: black; +} + +.menu .item a.odd { + background-color: #f9b550; + color: inherit; +} + +.menu .item a:hover { + background-color: #c06040; + color: white; +} + +.menu .item a.top { + padding-left: 20px; + font-weight: bold; + background-color: #901510; + color: white; +} + +/* PHP layers menu styling */ + +.phplmnormal img.imgs { + border: 0; + vertical-align: top; +} + +/* element redefinitions */ +a.action +{ + font-size: 9pt; +} + +table.light +{ + border-collapse: collapse; + border:1px #901510 solid; + background-color: #fbd080; + color: black; +} + +table.light td +{ + padding:3px; + border:0; +} + +table.light th +{ + background-color: #901510; + color: white; + padding: 2px 5px 2px 5px; +} + +table.light tr.odd +{ + background-color: #f9b550; + color: inherit; +} + +/* file viewing */ +img.fileicon { + padding-left: 6px; + padding-right: 6px; +} + +/* diff viewing */ +.diff td { + vertical-align: top; +} + +.diff .change { + background-color: #ffff77; +} + +.diff .delete { + background-color: #ffaaaa; +} + +.diff .add { + background-color: #aaffaa; +} + +/* plugin viewer styles */ +.plugins .name { + font-weight: bold; +} + + +.plugins .description { + font-size: 9pt; +} + +/* log browsing */ +.logdate { + font-size: 10pt; +} + +.logauthor { + font-size: 10pt; + font-weight: bold; +} + +.filesize { + font-size: 10pt; +} + + diff --git a/htdocs/ekitapplet.jar b/htdocs/ekitapplet.jar new file mode 100644 index 0000000000000000000000000000000000000000..be5b559bb4a8ca9fe7d68d3709c896f63b24679c GIT binary patch literal 111385 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

YbU5NF}!bUuNX7JAdcT7WopHGCUek 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 literal 0 HcmV?d00001 diff --git a/htdocs/gnu-regexp-1.1.4.jar b/htdocs/gnu-regexp-1.1.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..c3c8770b1e1ef43c3172e2801a01dd2d356880c9 GIT binary patch literal 30163 zcmbTdbCe}vwmn#B-L!4nwr$(CU1{64ZQHi3O53Qcseb+DH}CaK_a76nVy(OG4czbS z*yr1E&JG1>5KxpKkbl=~XI1JS|6_sr0s2E$R7H?hQcjHid-BH*kRJ-t5Rm`a1Ngsp zQ~0+Bqx{|D{~RnUC?_ci{VVd25`PQ`JGj(Utvn)(CP>cQ#W3FyBrFZ~XC!29>)e1Et9=knJ7^51d( z{%UULO7CQ9ZtCGcFKl7xBxz@2>S1a^XKZ8W>?|A03l}JW5V98;=ug2$mg=TOVLs1F z#-@~y#%2}*YvjNPIohP@@dKU|Zhd`vYRZTCeK+qE28-+rvz*}xBxNH4aC~I-m?WV# znFfE3UCyLo?uhP2qGG^3*7T$VzO-QnH~YZg-g+4_)!z<&%t`A}ZC9aiE+>*F?e;bT{#6{4_$l}rgIXOJj$RB*CzG$&=~zJ)IvhNF1}scuLvsQumCt&D^rWhD9vXv<91#J7*B^#- zy4+brem$r6)22CfYpnh1~;r3fYspv%)7&+U`Pak2Eb;WT>tPCnD>1g-V~pMCsBmp_2u#P^eZ6 z$>l!uf2N4c-i+ntATLv(Pl-}R*8AYgS7oIyzYemS=YYsDJM0i+M7J@XK ze>jT={G@>*re3;)Ry)TpJBz=O#C!OFNX+4yIln+261LqJ>OPgsF3l{m*zycN98 z=2!ei{|Ay1x~U58KtFy^{H4~vzpcstEs~OU4z4cBE>5O~w*SP^S4r0%TNQ!Vy6$M* z2HRX)Ykad=R#{?IAxnwxae-|Vs4Rk*Rlk^EV6#`U)p2!ovlf^h66#wZBp5od6mo*z zuR^5^n2JyD9s3K2WcM<+t1Bj2<=(;l*KQ7{v)Sy|^I6&+!YH*yBvJAHbn4P%yOH$O z3Ui0;6fFm81348~*{&5GyRPB2SOJy9cDvNC)P~&p>2(d9$~xi*23n z&9M-p8!bOZeI3Pol)<0SVB$`!Wed&OzcN*Ap}-ba4p$Bry%@hd>(-PJs5+pPVDxyq zQZsCA?Vw-zgUL`uY&0V}N>bxujus~8+D2HZp%TC|aFB2_D)VTUlH6HdcJ3HPL}I0B0ny#UE4p~3n?%M=ry;8$8Va5EkQ;(i&*m(MI`9Ara! zD-McC7?oYE!WLECO@~^hh-26uw2|znINm~q^~rnGQC>^6oK6hMr&3E0vz8pO=A_%) zSfz|ZYooEcY5b?;zf4ysC5zpZ-|p8~v->AFj?6iox&#kwIIk$T8nUMS{Js=w{W8`A zLV3iFblP5v*~trFu;`8=LA#_PQmtv*XntK$Nn^_I^*thCmt`RQiZDPR4u6=k`9V1B z;a_@Nd#^w@SN1bk7SxTSKD*SM6MPermrWx0)Z;T*8>_aK0miz9@q{?)1+=c zcl$sC)9!8x6u?cDEW(amp04-`4O3Nq3yk~10Jn7zBfS#`_S%PzFE1NAVRgDuBw>1D zY(QRatiYz^(UC3r8(p!5rG0}K>tBxWoOwZuyAN=U~xm(z# zJ~H+XR)_xJVhI5G@xu)4Ke3wV-?CcC)X>D#>A#b+vabD-8Hyhcw=6P17M2>aj2HzY zhFPMuL4K1dvxKHZw#;unMb=2}p_LWZ?S!LzbB4w8FL&wEL6a?&?3|b*KrIOjy0+mD zup+z%Ia{|FV_^DDvtN1f=Q!u?`Rl%YfHBJ$(1k^WtY++f=`@hFvN?yiF41nVHjr99 z4pu|4gNq71RC?}AugH4Sva5GcRq6qJkwSOz#BY+Mm6b={sY{#;dpWde=%wPNnDPY% zcLR;td6r)2GM-E05wxlFY369tPV&5Za)TvCQXDKs>&!VjCVpL1I=I(ory#VnLx!kk zR>5A1OA)|iNxi7fTyU+WLL(u$j%}o)T%z@f^cG={plRd1$C}Y4DLPo8a4;Be6mEB` zA>I^fR=}V_+{tAV;HecD@>^4)2A!E->jv&!R$xF*7g4Yhu7Pc2Q>uzj#AEg; z5n|Im%T8r_0Z$Hx2=VxDu-QQBs-t+VwvMe@?0R^NPNTI*x$4_aSga1TBee|Ej^!P^l~sydar7DhVk zwH3^?+xv6QULn`|X8$~M4CIgmZZtn1SIsN<9I@kvrsBbqGZ>yh3u0it7`t5Xt>E=? z%4JMeuq9*;vTNky)hU$8Cc58a$PeXON)P77y~F&#QK4wu^9UdGxL`y2pjWz;yCo$J z#J^jii{ombNWj?#vOKpPHleBjjop_8;I3JQa6G;yKUotCNx;(15-%<5mPVf)okdoc zq^Y5Bam_dR6FO&+W&4K8K#XZ)u;39kC9WL8Gs>a^95`Lk9f?;)rXTPLyEXli%zC?WmG(w;tNj>AM*vz#;7NgU zJ;{>0nAnzx5%pe`=X@jzeSpg24#p`Xz5Ib%k9If#(g%cVXg}D^u1mRDF}jSKWs)U zLwrnWSpp}~iGLTd}Sj~^4pVW9+N)p5>D%6Ju` z-a{*M4$>A8!ad!D=^rz9XHjIBaSAI&$=gm7BUH^oMOgmY3jEsX`oVab;FRDq$nh9M&<31qXnC}Qh7##DTBsYm?jO7y<%nYou@fM&D`Zn;tKVb!C>mD` zYFr(qSLifb*0j-EOtZ{Rw9y-A_xRj&trx8?VE=$!x`@KE?5|48`Hw1%;@{@;f5I;0 zYG(F-XLVOaUHTyd4Bom`E9Fsu@raK-^2M(BAd)2Vfl=ddt;=PVx2e`S7oz_ND!bjb zgbxYb*AM+d%o@33H16qF~1=?yvU*Y=q@x+kTfC&1XD`Zm>P zuEW*N%Q@vM$~ZvS{8vc@yX@F1ytR4v4RttU^zS*f`LTF7%)ynZZDccLovaoza|7DY z>F>JDJxOc;<5C5?PTU88>Y}*ghSS(vc{9yoV>p0LY^1G^lEMmS|!;;u1cb z(rNzu7wTTuaz^=oQ7`z9sAK-WQCGFIbonR8apk(?h6E6@UB7;iQ^22sC;=mF!{@W8 zDT#_m0fX&qWM47QV&)hHzg4M7P(A>?Qw--uOuK!c01d(FN*QDeadX)Y~kd`2~OVvpzd2OZEI6EQN^-Ginv2C+XKmej$s@? z8}y28Gj8)e!d5XhIR}2~N5=}FV=#NAe}Vji3bm$j9kYLj{QP(O_YW)>|2rs>b}kBr zmj5kiXyvA)Km-x0cTJcbVSfqo5s0I@_z84}3kk?DBz|6%>T*>#F>RpU*YQB%JplP7 zuOsugs4AqTb zDU`HQ!yQt+J9v%+KWPru63%DOZ#gP{#?YxBmUNK0$jz+=-^lhTUf${P@Hf+QhLvI9 z5ezw&!sj3~s_uja-jcXwj%`hOz%pBe$VG}QGA7D_D zVfg;9pvZ%E{G9tce>=`9$gYE&{8H6`MxfP=8fRNua%{ zFG279z{O2x=dJ1y=icudo<#0~&oMfFyW8Kh?z^Wxr#^e^p7(Wm+^}qr2llAt0(V!k z(Jf@pJs$-NtGRGsSCG9(^Qj5Hy?_NbRu`7AuWt&^XS0kUjB11%hIdzYU7Q#i+GfD$ zf+taFskPKX4?lnoH~A7JN{l0(TG!{(WB0LEl`Gcucth&f3Gk)i;aXnKDiRt@`g;9n z5b+nc!o}ssTDl6aFTJ=C7_2}HP^&Q83%sXlYh$l-7HZ+ZlQQwZ?Kd|&NUeY+q1ZvX zI@_vmZ%o45ew;H9piB5&c5c>P-bA?Bp0y_oti|hsAJ$r|rN-vY?BrawLYBHCL{OL;i+>mk2idP2WdZDobhcU2BEa-fx9jtfAoW8| z91ty~x1%}PK?@`U%z{Nv4u#+ds278T*o4Y8%wBV|p1)nRo0lnj!jR9`3tBB)-r0z5 zIF{?;N+&LofvFMDQuBY2qqgG=aBI7wstIBk3VId$>eF=4WklnWk+ah7ZQO)T8I%C4 z6RBL;sQ>h7b6~swXb1q}tr%2wU=4JZ80}we=D7%ktX4F{tuEUp(PwamPOGBC+S!oP zdi-Lga_LtBE)|zi*M-4GX|ENL9Ri}F0fOh|s1zb*xm&|lEobj#qpZ&W(O}3Lu_aBb zoCoPC-o$#jT@hkM+JR-KsIPIs6+=FsX&5NRZXJZBdK!Rxh*-|TBwS`sILtv~+FaKP z##Z$}?#{?wk*Di_kxFz*f@WM7R*FF6X6^I|!#=Fn2I^7KWzMI%0xPUtZ_3lSGC%{N zx(XwFP^7_2oAB35S^+lfLaVnf}XZRHZVFE8%jsTkzOIFvd6O&q}y6x+V93#l3u(VWYJfNg~- zIm&66HXu5Ei1#w)9V~rHV>xsueV~WFE&ohZ5qHtxB5hPmIuon7@2g^Y%2h3%f9{Cx z^K)3L@Y|QMlFbo}FTCD_ZpKZ?>NlinpvFTz3?3Q1bf*SY3AyKaCBrQBw6#aI!tM65 zIiHF5*7S5V44=?D&H2;8!jqw}JZh{^s1j#Mne2*4041^&H3#>FA{ZZ6SADpq9_ZC@ zA8{SK=$3o^99|f?&Yfd$X2Y-p%}$?uT-%l8=*R1&CAtri;B}c)u95r&)WZa$Q(p)^ zB@!3&H_M8Pk&S~N65mN6G6_{KS9^hb7j#}o5)1!$#xAb`O#{VRO_>gZP(9YRogbD|wZ{9cA)l}Y&h+CK~XHHiew~be5t5>;09 zPeunW13o?K&NngNU5a`Gp(Nj;(j}?%$lPpT;r0 z{YR6eD}k{u%wOps?v5PJy^>v42ri0EIOQAY4ITAc7u21jRiB*<^UI#<3;m0o+|Fuf ze^+n;do$y3?k*4dE5u7!&{5Bz!LL#edYa(v^rAUeO)ZWupNPoz1jjL`pr}HZCWL>< zD+td8GNwrAsIPDb7QRq-Kngmr1eqdLrlns)aclcbs12q{f^jlUWolsHsW+9Egk6-{ zGq2tl*<3TDvQK!#>S?C3@mH_dlgKa@T>1zLGX3x)Mbbvd6<}f21huI@Z>NBiOPz69 zMJM{Xxw@ox;Xu)BII|sXktybFA&{`7#KZGO_b42sw2`&)m3fKpfgyl**5ita@AXRQP~ObC+Gu|1%PdR*V9 zIf9XOF5zfshV72c?Wc*DSv_cvo9>50fjqf^ofL@M=^ChsTpyl=xT+obrr+fd|EB;f zP2eHL`R9wN4$S40*o4N(5EWTRJ(oq!NFu;9D$-a&+{@g?MdetEmo>;~bN(B6Y1B~F zVo{LXFvly8<3Z0awwI2GC=W+yv#XBFybT?>31T<0{y~RWL8giz2MFtQJ(-tB;&9sH&-T>MAb*f zX2dcm-Dqq34V15x09V}#nhhcQm_#?7wA9n9gL_n-09WhkzTrTzp>rw)ijVYYO!tkF z>cyIv$}e;Rg^ZZEL&;BTpbP=4y2wm#^l5)Wle@sjPQfa#e~wB5BI~gx(iV#kpqFq>L&2;L>$KQHoS)g`EJckG&Znuv0N7(Rl zGK{}Q=TKT(JmpcU!U+BW^{AtD5FY|IwiLRqQzUYJd++k!03rKm4&hz?m$E|6QZ0Y2V7@6r(b=|9eWd!yKwdenA;^btiBwq?U)p2==JQx+kqu|A*l>wGM z-yT;Vz|#Q0IV_eZ+LsCfvFleaw&le#=JIq$j;@Fr)5lmxj`Crxp~YNURHMeAFTQmb z-VDz?@;VXTjcJYM!8cT=o38k#*3{y{rY3Wchdf*G0ZOG)EFD?vH6Um zgETJK-(T+xJ}*=CCf1(p$lC{oP6?i?9ym8>dZd8M1Cn;K9~sUJV-3~pg`)yo^UIMs zhWN;VFNT;?$r8q}t2-z&Nu7--uOnoC|#J?Q8q z?x)dI;0|7GbI8up{0=*mHW5szA+@hf857#Q$%_7GPUcph0km7_xhs;Jr~S-N`s12O zLH;<1Jw705Aw723F~h!qgINKYX;}gNacxOu(76bi#5|@P~$+_pJ=*6V$ z;06g+>WrtZ*+4E>2#GLZ#I(JWy4iu6VmJL^V%E7zb_^%GiGF-xy)=a1TH{>=b&DL` zI0#-<1(NN=IyI`+H{|=se$OP^BY(DkgD%SrmH76$%MEm0YyJK1HG0ok4R}u*;Dd&T zk#_f*Hi)176YS7-mS2S@FDL@a0%g!A&V*z%3R!OCy&gi*^u-oKtQx+IEH^6jWz(QRRTmE9b>Fk6ciemh0x#y3`br%fYL@kW^?+%nNb8VFSNLWvGvawiwoy z*r&oBRRpgkrS026RInC#E8ke%@GMnoiYG+5Mt@Epn5kMZXg$<2s(~$=5g8k=PP-f!Sx-xY4lxp8YZUdz zM5CJxqz*GQQouJUw}k1&eexdj{kzYDPxpxz@4p|sD?EVx& z`(zo2a8%8rNrbSY7 zS{Cl{YardRE3`5XtW@t&SU2D{R)Hu32z-Wj=%FJ-okN#1{_E$pHc zbs-{tmnT~cb&I%3J~2wVGzcb-3kaWs&t0}+W^s3yps;eHuNW8FrIu3zmQidkWK>g= zD-UaEFzVZrE8YF5EP=YUD%HGdwNjL5Jvx_#A*Q^?Q`ewllaXxm(#BOPyI3^cHApY5 z%^JUNTwhiSS-&Uf+t6!I3zlv(PxFPi5&3bs^bp2U1_P+#_mbMjo9!JO!SxNWbb&b{ zs08K0AM>*QjGDZ>!+V{*O+g&Q%mjQ8hf~WB)c!JKyD2Sd9FHepdQbf5KOY;=?w`b( zDM#boj@f?JLBEKDk_=xto5>TsCP|tt49K5J9ohsI(?txO>9?R5xs!|*4K^%mlfqDL zFE4OJ!Uj}Be|yRr!N!xqdEFX7=<8krC0@8u4e zY2BevfAB@rkg0;>ych#Ic#K}R=4QLCk}~h(=9SD~d)|v_J9`*mzm!w6^~6e>?xQ$z z=Y&!F0yzQZ8|#vQym%D#eJja>G!(qtI2(8bx2&CHZaYeLOD-E&J=5za>)2DqRZZ?5 zNMl>iGIyLbIr}kKq)RoY4xwAcM*)kmaAKIt-)?j{WGOgAB=X_jXh(J7@yU;YQc;Ij4V#z zUDZmJeSJTjnnW~dlA0%Xn$2MBQatjK{d}8QOhvoL1YsVw@aRcA#0kcG@vzE% zrw7qnU#z#)_>up91f>8N_n!z9V_+)6)wdOCGUOn)PxkS96fKH zFoZ$0P5qFY#t~TR74}%)jA=t-uxoNNMjWL@DhhxbzY@D;+1*ti?`_LUcRxrV3flsN zu{X85qbcmNvXjlklu)?O#YhrQSlKO?8}^M&Kf53GAl=e3k#%}%xFQ6MM#OHt4PMfy zI4$yv=PqCMjx^h|Ir}Zx zr@PIb`T3{5i15k=GPhK>@>l%llhzmH`GpNanawGq_PXhAgIZ>R3k3F8iVI!uq`u|N zdexU5qd`shfgIpiO}=KGBwl02?F1UL6ksmAM8 zfxfYZh(K9p8o>s02!J`rb!X5aW>D{3Lvyezu+SXR^)<}aFGF+Rkb4kxRFx~3ahmd!8XGAGg|D&XhCthn5PHli&zG26d#oo_Zy zcfINO{e3@yAO_b_9YPG-i&uz3m6R@0B*YRgL`#e+JIVSd7#t}2(uhqpsYU640lU%7 zFLY?S6UEK|nu8zx7+!~+YOJO+(^DszgZq|dBTPI8QqGwuQzA!5>NswuIn=YMi4mo% z)!DVFNOP!*sfSjS=N4j8j-m!4NAjNlINvIc;IF41wz)&Do<2F3QE&DLB9h)!Hz!o1nrepl2xuP4DEbQ8aa$$&Nz><|Mt{T4-aqzhxM+u>DD6I0mp@37Y4FdiceMk6vMc4C=q>NOWcdd4}sr0P_Wt#b$;^p`QZTKnEf z`>09)dgQgqKBE>8NocnHbB97#h6U_z}1|xp~X`p>;Eii({HOm|qpvjb1Yp zR8>|Pt$XHO-Ag`jEx5R3&$jep3t;F8S$iUo!+6-<5nZ-4NU!T}RE~8qzQew3H{^Kr z_XPLxF<}wnHa;;P%cE-%qc%KpJcdWu!|b*`QG6~X)q6>+XT|Hd+ailo3E&qS@*1MFVsQ&g%{?9`4_tXDycq)mCS=zXm{&ji&iw`bDRaRNq9L3M> zMi%%SjD{5wxD|3G9@4T#39(qU-zx>46cXI(lC&GD?U%Kk9SwiKXj{&?nE9sTW(YQ0 z4x?kKoNnh?<&x|l*>mSafp@1)&eQJG?9c4S+{f+-{6AkWSX`m;Pz4a^f$bQ9@WeA` zqh&;N5g4eBn!_59N9{yLLJxc}hmQ!ghnd4=7Z!AhUY~i8ATQBE<(C(^HnGTd>^idR^+iTDFzW6#CR25n9Rl z(VXrhSqqGqvxtNwV~a zruLeGTYr0+2zMEuaAq3_+^w zc2YCY6O7T~FtnPiPsAr#FVfzchr!@zW(3N5j?kuvOm8@0?ZGnNwD9ZFd`nX#u~CjV zz0}LRtIK%edP7jw(M=Oo-aVT|F-LV3NgQGWIC%$hS+j{b?oGL=ep$AsnCG@bVYk>W z7*VR~(95X_4c1{oo5RhI7%OF*r0YwnIjUY&%|7A|5!s{!(n8lhR9P!F&yXB%oHzj9 zvqH4aK|0~ z;UxWKKMNA^V5j&p%UsxtU5hKy<}>QIM8@BwPteh49nfD31<=5KOoGD6jX~%Aq?3xx zM@(`C(YDddQg|zbErw$6mw|nS^awsdK$T>SRTkfvxJIH$E;ShNR2G#)&7x_FBi!-_ zueLpb8OIy?qA;q|+Ll=fO~=EP950}+M)Y^JatnO;RsQdK#2(qGm5}r>KGsLmST%|h zFe(d*hL%N*TQl+uBa7}{`HqKD^4_P+mLfQ#beT_^n@ug;VOib03?U2<7y%(L?IGCd z159S`{lE4N@Uq%tZXF=_4S?hw(EIMr?Fb{F^G#r@W@ zU)0EZbNsaLbT5!Eig+L#XbhgZpCgo~LmiJJI?~Jz)29AZEV9AxI4rV@9erBAq>{tC zde9E#uT8k-;VT&J`$r0ylVe}M|7*|L2mhb5Zj(p!|4JeF|KBO(f12)mm35twRWbbJ z+?GfW=G6!&5(`(9*q{(DJ`qfLyEw1>?m<`>5e86-kVd9Qr+j$)U zpqQD4O3?MZPEzYXw!kk``mB4JnM4&-^Kcixkoe{#ha*V)ldWsjTl-C*{(d6 z^uKDk>cu5{w`9uYr^t0t6X4)&wrHt?sdNU^ZI|{>q#>iP>g-vnu7Ie*UNR?0_Er8g zG{>+<+f*%C@St^VTBD){5ZwP} zSC53uAvp#erBBAP^}w)kf)C=$xz?6$-3fm`%{h?YSj-M`RRq&rO)tH*o7*0I z84qk4jI!11SL9(3DX+L&@3}Jvb>1dYR04$KNyhY4;tH-wuLX? z3RYtnkQ8n7#V~vRMS;l#gRumyV1Lb~fML@9Z^O8)}6%l{)%d5LI zWzW`C-v<`u#}w@OvQ|F+et6z{aHB?z+VE`M(y zpg^)~Ah1Z_${)l160+hnMwQ&kVV2?3*VjLIaTU}Y`2jAhl6R_#Bks?QF-YY#Pc5ei z)WLn!^gxHG^nN%7LC!!#FwpQ=AmJCSd4XPyR_jm{ zGd7r>D`3h5^1LNek(U0PsJ|+o2s(_n#dTXR^-5{YS=Z;(M+|isnDle0uEY^ z8Gv`yuhOG(=muHFPCZ-nO=`l97q@{1WO+B~ii{(yIyvc1)w*RAOck>!HA zMg~;15GnJQY8JZ71(R@^d8>HMRE#x;YnZw0m=Q({e(V}h2|4a;60!Lg>I^l)jq7e(oUVStiil+ad9Uxl2xa~ zvD~5Qsv0^Le5X8HvjH+Oy^*fYxik{)Rz)>opgCOn8kSbWwX5G8_Wn=7$73!Mp<^Zu z2`B>S@00lAjh}A_(bU|&8z)nC`imc(jdN+u>$RxJQ*wR6E?pNyAg9e?9tZ06I*F_Z zl2-f%?UZq9=Pao1Xi+R-8fl`nYV~(S>#PySyD|lK#j*SvJ07z}wKNpnebmtB z#X^7=wb}zTWeZV?CupBw+QNTEfTljYa|5B>2Yg!q85uqL=IbRES_w90ZN99im&4|M za7Gd>Q&pJnKo_Utzo~7MX^m)ATO|5cK~)x61fscd?ueJgAE@l(ZGP--pn-Nn1R%(< z-rvyWf$5OXz3yzqZ{beNdBbb=e7I)yov^_MN8|TfI7dtWK;vW=uFCZO3fRa5!ghqb&d9~JU zErT7OwJ%#uXIJ1n?Yf7%XM&tJIWm)TyS?;VttI``)*m2Wc&N-JoILClz1Ui7ZRq)a z8m~e32Vu#ggobvr-(0IWV)N#S^9ftvxBWjf3y-A{V-@J%ck7`3r)K%rgh%|Zn&rO| zo~WIxt*MjY|5GpsQPx&o5Z=-H{k9&FRtg)j|o#WdzJfv60>MnZvtg@Bj7ng$gZatSJ1mfZe>q zQTte=1SLTk(u8ggS&bAK`?}6Sg4Zhz0Vgw->#6qijP&>eM$QUk7^ zzd1%7X0rC3t+KEr#nLhzK-5{cP0qHtO=Gtpmt-P0Y&1C*f76DNNvq)aV~GSvxLoK< zEn*BsOjc4zBBio!o1XoVoQx8zaSGgcAR$clu*F!5!I+EQhY^ttylGaNx4S zKaHq~15SYr1_W9_C~_V`@ObnT2y9XKI{^37Y_siZy={@`!;?#PElEU39tn(h_Yb{6WP$3&SIBv+Meke)smseq8_OG4*d^@V)&Kxd)OOLM=tDhIO(- z)#ya74_p{NrVqrlT;z7)4N?hpOZIcqZL!R1igNqIflzx1luG7q0pWyDMJAaZu{s%>Gh{rb z?%I(1p;$Ygf#XB8U%dq{Glva(IqB@G`SN>%-L(>*8Yv&lIwfpRlSo|Uq3aO*QRKVn zXnz0Y;Y4oAvSR-$JhuO%@c0+Euac;;r=5$T$3K-virTwBvM7rGRu)Miq~c|dlSOB^m1gX*P6X*>s7uoaZn3wbOF_+o^N z69HStUJey#fm$G3T-GFF&b264b+gD8)xPTz&f;0x_(e4N05}q>O2zFQH8pCSXG>PKF3rWNkZ$#T^?x6 zfeo3ygbDOf#1qS?ElHOmd2O8LY%B$(L{4tDW%IYPjM`P$`nx3TwE{Rgaa2O$KXtgRJYi zFi`pC=6)m5B04^d99v zwYjbcsY97A5{tWEXfc(c*A1x>_0=>M_xTB8ZJ^IVnb+%#+V^6u$>ejf)s4<5kE_%= znY1*lwPkP(32zR=Dn}*R={z<s%gI@DRUJBP!e-p zsPxFWkbisfb7Sg-vEQNgS08m;5wfdu&<%7(rld6p-Jx}(1-D7}2Cv@x4Df0|+#Z_F zd2hVj79o=leWH}-Y$oLt-WGPTM>@-r>>&6+-hv$v^VE}$gw|uPr#Y@mcFCJy0Eck7 zWRhJV-8x^aP;UBC4nZdQ(FTpW?Tz0-ZuwFVF>LwL2Ti*1Pa>Fg<(Y=p@6a;=8h7fL z&TL-009zY3g@7U(c4Fb=>)LUH`kib5W9z4ID96@}G(uzJQU_(XtK|!$8S+(G=zy3C z)V@9}K!AM)AAiZzW%yh%1c7D#HJfjSfY=Vnf%y;(sEx=D*@62I4#=J82I&rIcn4T7 z@=qF+2j?LwuwH~m%1?D-J>q?BggvVLErdO~{g&`Gs5iJ_Uf>(iZSwu+@LQBS@ZsOU zcmh6YKiP?TwfkQQc1iYU!f#RUe8X?i??A%wQSQ)&wZXm++|09n;)`+S(%Q=fWruR& z9;%$Uq%R@L5ocRv+nu^3E9Wdxl!2Eq${pd=6uPe!z0r8POmnllT-}ZCcSiY<66hD| ztNN~}8_4g08So?B7yN?GDOV6R^GzGj{o3_TFuz7i5F&c&{CJ`F^ zPi5u-CdZNUc>j`pzG!JlL@Jv8BaJ&gh1W|mR#fH;>BU~c2PsEXEePK$tKw`MCE zGT@zyA4(O)+3Hyp4e2p?u7Ti`0n&MCUwW2#0yEj;txfbTP~Tm;$KFZOMpW058f)s) zQS(fkaY57!#@F(7#!Qo_38iz@Tn{xJw|G}fnw(a**=4D5c&&G|xh|#sZHeE`-xK}y z!~Y)|^GnGtD&=oY%n|NCY0UrEL$!*%wdsF%qFfaR?EVVN?3f%5Nm)wS%^yISi@>qU z46g(vkqTz+}w}5TX}uG zzF`4l>rDzq8t|sSNO_JQnQwQhhBhGRXww1KW#8g^Q9hVn_G4u{60|B9neY0Hk77KC zek6SFN8!xriF3-ExZk#`<`m{k3Y8b0YNqA z8XY0rQ=U^}yur52%6WJb>Z*3G}i?1;#e zmZKRIdQDyg4C=nZXr--_Sm+em(4m}P(>h8ws13MG{$G8aby!qe*T9wTkQzWzx;sTW z1!<&vaOfD2Mo9??>29Q?LAtx7L0Y=IMCu#v`@OHg_1?|H^X&O!e$P2`)>(V)wO3e{ zpKSQODp8T?)m{h0D>7vwnl60BwW_M8B9++7tF}a*z8~SX4gSIj=#|p70^Y&_8GR5I)?H{3R^HR{vj8!XbPbA}^4V z68&jZ9dg5i(W2o{E5`h$+J(xhbeIS)O_@QeVuhO>TAljVKr2MIGjBQQBV zA`WERg0ZFh`X%Ya?Px&I{N2U%3Vo@1s}U@|AEi8nTARQNVh!fxUDSD-63RLHE>@Lm zIaV64Mr5~UeD%;Y3_ja;#St)%MJJaIzA|63Al7O-9lR&YC*%?>WVa7scF47$Mnrcm zUwaC7OqHU>uI_SHsg~r4HQBOawEMO8o%;7^r|ET5nl#y!hRiO19U)k8*oo`YL|l-1 z3tOvpihZSFX~wj~8l9ECVzZpzO0U)%&md$}=RTY!g|SrGj2b`wSZbW+&Jr1T=LAD; zL`j&9*@^k@uwS?AtQFmJ}^KCJsk@!?D;BWzqSQq(G$89Tv{HHjy+5 zm2cfC0%~^mB(pA{VgqzBtP&wSOGKrZB6zeS9pm9X6+PO<7cBCOT$H;%Rzjv`b-fyj zH%~_KlNwc7wX!TT>QUJYSSjpSBE#9wcc3b{*`(fX3r6(_rNRh%6LdwV(BH za%7cW1PqVG5F5P8yL+vo(_SC9X}B5ioTH}z{M_Z-Rw5SE=TEQ#oG;b5@`=_+NHrO! zR*wrm=Fb}Wasv?#c!b#0uA60uu-qQp{j;$A&Ex);u!tBKnJWQJ{$o44EA?89C}0Ro zlo*8*Jem4DNVTA-8xYa)99l_%lEBlLwiuL8jugaqAZHdoBNh^T`1n%Np#3vpCKUp% z+oPMNqDSB)CK~MR_NVi_;MKmL9v25I^oHuq&_qbBhLS$f1N?3r#p5K_r)O2_U`^Mp zx&l#P>=l1M29`mn=Ol`)JW4fSxRc9!9PBmD|Xe7ec~9!@L9YZLvILQZQIt367%;OFx#qm=xJa zyQ-AjNFUSo$zdkCv)!B!n)Bg2xnro57UTE!UnorE`Abh)Te_hE>Js5yUZGwTj0bE6 z+}o&tQr`~qwO}I$qM;HlsClfUisIQ-kAf=T4>+XJUVN0Uu;uZf8$)V?#hQ>O8a#1i z?P{5RS9-y0C$8&=%<7a1#XFX!tt~qnnOeh_jL>|qy4`1iQdY;JjqNE;I=|4toy;QQ zr_FNY9gk>^hm)U)onWt+LP_@wU_4RCuqbo$FL(Ao@1aWrW9H>K14#lt=GA%Q@^`(i zKv!o{bfL}IS)LuJN==O%O0QzZx8{r;YPg7srY9LoCHdWRa?K%(@YrV%udJns;6g|oq0wAlsI7I6agM~&?0-@(pZowX zAVEZm;a_#o-@+&U606(dHvf?+2c>!W5e0yNqj~NYovc1-={Z)#4xFf%il4Ftiv}CT z<2IfrqLWM+T{T(uNPE{<&+${77TSIE2t4kB0lyj4A*(dTh}&`pSuw-*~4!|*!%gJus%pI!3Y66+BB9MpvmAGJZ+A`Fn~d8 z>o{CmU{{d1^tPK)L1C;E#Y>Ua&hKj?@F=F@klfLvzg@LZNbDs73Lbu2>4wV}TF!~l zp@>fvL2gNSBh|_>R02+#z4RbS_$V#nKx1Q3|HW{h!gpC0ut-c9A5`%C9cL&F%+%Oh z*2OD*zMDRa*Q5`#X&%9UZ9~KjXtAPvecnXWs=Y)UkcQ7@wGi*~!Y>5ps6I}Ub0>Vj z09SjLrpg^FiIVN%qp9I1j>A)lUhn|2 z-afOaX>q?;K5Nj8cdwI=0b*!(&k?2=hXi+9|DZ@efph3PZ23)U*0o#$qp&x0oY_r! z>iNr7nHv&lPMLtr2m~mE!IyYldP9$g7>4n@WY1X&rc6yZD%bfz0#g!KrlOgj-XS*^ zC7&L}{qV2yO%t<&Pg1m9pf7}BAy?Skq-s%Ic*I>vDp4bZk*0EvD=tdtvk!tn)Fy#X1PAhx9Yp?)aFF&6x~ z{P>N$4fcquk4~V~R)G5qzZHkiMX-cU1LOO|{k+rt{gW6t6YLE*ldwz#j~#S zG^vjs)&j}%CtM7jmsdz7uTRYUvK#sbuAy%ADBFw&Up7SG`5>Oaf7YXaUUbE+{=d4F zLwG-USP0OOLh17;7`MbU-@ibU^RdO{ve#RQIKEaCm*OP8rS3=uQw|1M*~kd$8#KXJ zx>Y>Nw#Pq)ykFmt9O&pvXqllUI69`Boi$u+UteDB@MCKWtBQIx?~7S{m|40?z5;=3 zFA{^~7R;pBmfutYIGXif8-A3}x~s?%q$eM&HznUl&_PQ)U^$3KBxxyg7tn_9Qh9zod$a z(?R={X(UGU9iddWGOeq(ibKI_J7H?1#j1(+Fk^HF^9%TS@fyw6SIw>(^iK^bio}&B z>4qY|HrpD%8P%u}f7!}Mv<-r_wYq2t<&rYsGTD0>U1saPI1=)Fk<)KmjT=qtvVo*) z>*od4IFPS!c%z${0BaZ}a9LI~UX2aAT`J`Dl^u|zv(b>uGuY5$Lm=AJgRk<}FGh}) zXKYz^K>x+m^3W)fstgrXeEdy}{4wJpsRr*nl(`%WS=P~PtT0wJRNIZ#^$F}$6qa+Q z*2J&HLIsrTDNJkQemT#tIaI$dt!5bpoC2r8SuJ=oG^#I*faHc%(ne5~*AT&hM-X7# z*SM|IM)j|nllYI;8$^(l9Sr}YJAn#+)dUl0&G%}T6c<164O5ZxDIQc! zi&64L&MjETn2E)Z)BXv`)3#+Q-e>Ke;b(vIEw1|PXzL1E@#%t)s85&!5cI1BXX%r( zvN;-w&ll-z%&(kn2p#VtF-X1(XG^jmkE2&jm0i`?x2f~sY~k%FRlE+Y^ig+MM`$Ts zk+#J_n`*J1+G!a4)Iv^1mnrH$GZrEBEZ1OT?=m+m1n0{WT;kSK`=_3Y#p(G)Vp!`0%O~fAeJVZWJ|#_!P5gSq>DR*aWRGR-aFYE zHaN$beA8!vJbkpw;p&s5yNY4W@&N@7JCbH)u9&+O@j_YT`mbO>-PRdjDTt9Y1Nr~w zmz(U5&qUVR+FTd}sR#65Gf77tOBh>VWVaNklcg^#vjy*A<%k@lms229?CFzfNDlMl z2}$%@8sr^|G7IS&nRlMd?yR3U51M~2dkgkBWmCd{9KvUls?QR^12eUaH*PncJgW+W z7)D*AV!en?!IcT$I-}%n!h%ZoNSOA(m3hJju>csBHmGl5bm*T0Q4pKWt=5UKymnY} zP`STsv-7MvJDJX-j*CTAI#)O;uGahDf!kDMJfg%pdXj%^6?8D6bIs23aoeC8WoqSK zh}5uvSD??nJ8Tx_@RGbmccNt21azvRV#Vy7wV~z!@L^jWpfd&?HajvOqaxzh8tB9E z;o#K~^{7lW$;}uJ&SpF-qEdry6s7^^Y%pqYzg#xUAIhAIUrV&~@uW7}({y!xPHGHw zmJ_@h?g{VI#j?nipsj*`=$&Y|tH;JCJ2Mex6iW~iw)vGq=~s~-P@lLACH}ZxyQtT7 z;8X5I@_tJt%E)T5;@W&HdMp$1Ql`VRu zQ*EDIG!u~EtS7;q=3C8xunnP?^st--*CLw?G4lDCR`jzTLX{Ruz4l8w#}h<-$#`T!^TIFHKWN7HKpmV zQJEPod>DZ8EVFAYb=#baV|ush0csOG_#C1hn*UWj5dBdU<*k77|FzbY=fMQ3*w;+8 z39vPCG^m!CITeb%MLs#4bQHm~RDqOY36TgT6);v^YU+Sed$thvhUFB0^pKs8tuIXy zzi}iC_3^k5Scsp=7mG0GPzM4xBeYEUm=(o9lBtDM06EB>2|$yrEa+PEpp} zSe0w93H0oYx_`VRq%(%w+jt3AF~o7=S0X+!37_>LOKf`7Jm5KVLa~+rD5(_tJmIMWOx8S z&P4B+=63VCZ>ZpJ#{0hPmn4^dS4Kc>LROEi4kUPnVM=rGJV?H6(#_xo|j50^{P9#J{FE>E3 zMSTn--W)+NClV%w(qI|r&E4LNy@Ez3v+kkQ>MF%n^-@dAWlSB!xykWt!IO9ycCyw- z*K{HQ#d9B#x7Xw)cOLgNAz_{Pr&oP!Jmb5(tkk~*6Gp>2;EhFdCzmCB$vpUYan6~a zbK}}5w|_96_<`V=j2Sq56Lj#&kHG|#F8&x?5pT1O8xa55nbVp@8|lrfd^+4`&ZxX@ zW@k*y;V&@Z>Fc|{1yyURmHcvJzLxIhJPJF5+-c@hnoC-PV_Z5j+)m3DdV7Seh?yD3G#MsQo z*^}Ph4dvnW-0`k1bjKML=@;zB(V5`5WURTek>Ox8uc2%Jq6W_mO1N*3Z(NfRP4fm( zfNxu{Zw#@+4a#=&^)S+p0}zGZ@f12$oA!a%WCSapjPf^?~X^-cuDx}R}ya{JFO$jcFff`_qu1- zJ2`#X#6cGZm#-5AzlDZsNp-urD;_`vgzxPwnQ=&zPn>0DhcOU zvXEx(jIpmshMh%au=3tgNU;o8Jl-*zH+Wa8fQC4>%ejQ(>>%$rR4 z_*SKqV_XNRV-ObsPt(pinFKO?RaxjK5Qroui#E$U`RYR#9+Yj0;R1V#+xuEv8GfWA zM0EPlns-;oeHTs59-@icxCj)+~I z=Z{x6Uwi`9(4|?}kW=oYQR;ReeB*=OP<0925a24W1fb>9SWCQ0sz0k7m~&v%;OM!3ckT-LI~4Bq3Ao-+TGehHs% zHt7eRd3YOktx(!E@oFfXltQDsdWCak-)9M_ zycC$kH-VUPuQRf?t29}bq}4xsHj@c|?L{(8cPzF2laaw{L?TSA2~A`sojs7 z2(;oOhEi?*?>{f$O^|%AGCf+yP3f$)w9q^1Dgon#BwJff){qs?H`W*Ew6K1(Q)qD8 z6XTUOC|p-Wl<{>UO?fBerVZl|llhTac~h+T+34gLqk-}{%P3#OcR7k0K5@KaPlBdo zI^Yo$0q&W;q^Y3@W4Q}FrLiz`u5ucWOQ5Cb+)e4*XQ3aFvvWK`zlJHmM0HL|$h|2~ znC0qv1&jFxMkTo1ro0U5GSr3knt3zQ|43}mPPRo{JH3>k+Lx;6h~bpOok_t=U}1ls zMX%H!ulJm2d9+Rl#j^XOvkWG)vLrozeI(979xbHS3+9B>Q|fOK2e<*W zR+yN3VX;g!=hB#apJEr#Fb*CEIP*c{YriSUq?S&k8nPh8B#BU8Ob`4Ssl*vYS6R-V zOpg<8R@pJ1xH8VX^|pcNtwO;0g-XzvO_Q|LvNeUaPd?*!xvCB?%9fW5PP7X^+&;Hn zMs=#X7OyRY39WsZmV5>$&MV@wADxKY>iYyO!MJtNEbfaxQ{K;m!C4dC+T3yZ5e(c$ z$j%m&%hV}!nh6$`l?rE^Zm9h3N8ewdO15s}2!m3SYE$Mf%FJ+A))2S9I5B0Z{)jz= zon_i)+VU}vdl=%FXEcv_Jiu_SB+`n+C475hUJ@#=)gCq!EXtmIV4O0 z987~%GE2w=f+IhZI`mjXk+ujL#m`WpImSa~-}k;netSWD!FVY={XyerLCMz*xcvNr zO+6_h-~#oNWZ(iC;uX7kPhec&N_qPdUy{8Ifz>Kw0;LJVW^O5ee#Xet!fpa9bz-Z; zPW3UlUR`e2;$myeqpB!p#uOX4-j!u?Btqv`vPK&9E13)v=U9>E7YDrCC!7~+Y5h~U zNMI;xdhu!WT8&*D;1fsi&iZpZ(SAYFlq&CVHy7do#qMe$e(A`8A&$^q4s>@_GWx}H zq)E8+bULG~q6M_VpW}ULtrI*Sg!Ss((XfCQV@?5i8ed7$e_TE-jPej8HHawczghb7}INtjD?&tK!wUPQ1?H1xL`~2aeahBtzTLZ$O2g1Owhd>+$-( zALv_cJV3wI->G&zK@O0h1-X9>Ao{cZRx+@91N^VEY}#&E0b2)NL|Nps0w@>hK&gUC zTV~9q-Jrw7-VcB3!&ha=WZ4A{F)|i1n#RS15cG!qMcLdKc)_O7(p^y-iwYAe4gQNS z_1~s05=jIb-6a9ykw70nw1uO>VO9T!`r*@v*NElvQUG>>u;6QMfPfpiR2ejlAo|GcyNQ&_;`vWm}nlX?P_FW z(^OwtlAZ3uY1X=VQZuq`iuVukd*OXAQhxTUB_nZ{(|L zdQ-RU;dQ+Q9oh`~Q|d_bMR3hWQTqet!axz}VIVs%4jz#JU06ueEp|U9TM1n-#&fX0 z{KQu&@nY^nU(w8lMK=T-#yIy6QcjWlZS9q@V-5P%=|clOuEwyNB*h9&uk1J40lC@@ zHa?d$ms+(#6VC^AsRYSd>~*n87EIEmNXQ_iz(yh)L->`iq3xcKF|4ws*b2sIMQ$1` z2z7^hhlZ6JeNhO1q8T>WF$j$>(Vl+wq46)5LoKt?0vBXYVfL?k3erFBDU^UVKm+^# zmS>Mr(Xu8K$G)c0b=^7n?jSP5CWj?eeI8vigY-pCB%G?9QkqO!hk&U)AUj0M6>HKQ zTgX4=I^a-2Q>fJE@R3sKC!stiGYSv%fmrrhLdzQ4;(4Qjs1B`FmEk z&l#Z$_Whg7TBTH#Tt`9dy@Zun6*Szy_Gncig4QNQLD9j}?H@CW)}Ca8Um_x+MsrKs zG0dhN@=sxP3RnRBJ(ktWdN4{GY~Eb;icu)ktDDi<>m09v=GCQBVNc=GF0D zR+Y%~TQ`_a_^P&4dXb1=zs0i#5pA{Y&nfDTwEJ?9df?3@c|V4+yo-kTUqywue#}y; z`SSJHDBL$N62~_bL>tY;SHQ`uWu4>s;&gX_mLf4b7v>RYU70!HmHVb;HP@n+ONz0> zFCIf|lI)R3v+Sj5AHN1&>;1Sw{XsiFFRym)9Y=I*ePQL2+MxAwgVio2U7iP^DTt79 za@eBoS(QYZfc|k!HaM<%p2f}`{f(T?x(IkbJ4b zIPx_P-^4@=WRerqOTPT0V*V31Dr^FdpEt7OC#(hcHeUn3jUamie}9&@1~u74v5|#+ z9((ebN`j)~<@3|Z(kjaS#ksSHEGZG>%5H=C)tL>FEX9oW@K|{1ean3xS=r~>zYIo* zS!rSpp{aL@Ut+Q@1WL~=AGc$B$hNstvBDC8QCX|8b|^ELB&;QED)n|x3HN=rm2d3b z>aD}V%peKVWbC5VzD!IZ=OR@<(M%$dgnbL*gyk7TeSB7pNXmB%LO*E$ruPJ}n^UfG z`xnE}Pq92tKGnw%IZZTQa=r$^2Th7iHLISK@hCKeDz@ufc)D%wGqwcC;x&t@wcFc{ z)yn39c3v1xw)w2lm|*GgCQmmzRL1k&__I%n?WX*i_sp*m$BB@0+u;XkpfnCQe+w~e zUvnRKhi>Zb8zg?wz5LcR&Ck(PFoHs4DCo`4(Wujo`P+rBo8X$64&pC2fd4nQ+MgFb zWqSj=|F6;M5Fu?132o@SiE!#R1l91QWg6&}DwbiF!KezsC}lQzMv~hKRUJ^U^1NE+ z3&WyrfDw2kaN-pfCW9ehv)mNS3{xj<2TE9M?MrZOJWDxS4SshudG5)=l$uH27G~xm z(7Gl!w?`1VTVStiSA?tXkt$*s8)wg!L;P-skC@u=#P_6!O}p2eprXmK&LlwCN=vxD zUEesrHocdzx5$ZW4_vDk(u{Kc;89zR|X51q{6Vz;)gEnxOf%{H^{zDEa<2D|#DArYKV4bd% zkuVY~4c+>&gLbtL@@?JP-mq`4W_D(EGn%iItW>={gUAb~SCSdO+wH!yM~NxPSwsT5 zvIz54J{>@e4(L*&BBTq^YN=2>$WOn=tL>NR>1V17WO?Ng9 zhzdm55$m2xbMRRmIJX1|Hn(#K8CF*X8=GK-QYs@Q$aqF?e7qv+6lGCuUhjF7Evxa` z;T$^MKzT}JwV2nQou5-*O z|7kCd<7{pg`lp1hPXX@Yznmo;`V`&C;-C4pl|5z>IA^1ZwsDZn>|!usNoDm(_|F-*n?jnV0A&3O``7jFZ;7ja9ag@!wlfy7cCa!wu={W1gi^24t%o1~h36qQ02c)m>bz z`>L`==dxgEb0DLW|Fs6=y`J!VX->G!i|~yO@kCXdfV91z5+Ib?TDlg0g&~*xCdQzI(EcyFW0oPZ z#zWqKLK=VeYp|S{YCir7976nHkVGU)X&5K3=ZC;n*XZFtYb;I~(_6bk|<%@!ejgX5_=g4Ow zC>b0u2MrW8GWbk^Gm90%X;oVa+iBwLW$y9h8n&A-bw2x_&Vmemx8>J-*lF7SE2ok$isT{Y@0o^r6=Dx6G1;dM^4|fB`3W|E)uo15(y6v4}Sh} zOAt-crEncrB2zVBRK(l{KC{9d%~eu2ihB^xX7YUSdXC=}Y>ztke(Mpl8z(`~-VZ*? zM3SL%s~@Yn85(Az!f$0+YPnc2wu-B+y5+jAONeH4zKabOf}jOhZ;Yvz0?tQTF3LM& z#jQeFrQDuq=-KbH?@D@40|NZMvQ7!JE$^fW{`@PbdUUTvs2lQXfbSh^0{^{hkE)ds z2xw#uH2!ae+~7~s%+SKv9gQ0nmS4nY18e5Bl!ATma00qy;zud92$GF!smyb7N7Z@+ zm*e2&q@2zq1InZrHoTpAz!yn-3G8b-R~xWTP5UL2Nk21-m*X%|1 zwD@>(@qH~=Y8m==-LY_x3|xCHMSatoW|QHToop%2ujydVa?DZ9g(?2gAgvqAPHsg> z9NPF*7S~H@9O!0UxMUQe5Mrz=fIf?tW|nevrHbOOd8_J~7+LL34ADjE-a=YEU4;DI zz?XVzkpY+=!-J_WEo~iEoQy{jWPRO`JXGnJ&GnzQ@=B8F8{NxHll7*)r9h8I!Y_ayRG;c`^Sr$=YS_22-Uee#%W&M7pv3W0c}}Oy@6ONd z{qQXdEqkHe6}~iB6z^&t=R8+agiCUOLhWvCzySuZYRMN0AZoJ35SY393Mw}kuBXU9 ztkA?0q(pW9mRzlR3qJ<5OAwTFPa6;SR=tvN(a?mWZ46$-jb zx~-UUw-Cau2L3&gA=>#K=^yH++$G)?P`I0yeH+gCdn_>hk@#=IbvNhn{_ma1_5gM# zvHR{N-M-{^Gq#@nz8=Udiu+HLzhz541l|pkzb{Qh{11S4)4m>J?gmibzq@nc2bjP1 z0DpdA?nc($#(n)BRAPUk{4ezS;pN29FX{rgLJ`6trokN0$sJkv0(%*Ln znZ4HiBkG>J_aW`>M*9AR4H*83cE^eH5OsIsabE$x2L1{4_kH+X;_ZgzuDN?(^6fzP uh=1F@+$G(b$9Ju!``7l$>>lYKjb(+Gu#m(0M~_G$e-@BqA4QAXPyYuC!#yeh literal 0 HcmV?d00001 diff --git a/htdocs/images/Makefile b/htdocs/images/Makefile new file mode 100644 index 0000000..91221e6 --- /dev/null +++ b/htdocs/images/Makefile @@ -0,0 +1,23 @@ +icondef = gartoon.defs +conv = sodipodi + +include .deps + +all: $(ICONS) + +.deps: Makefile $(icondef) + echo "boot: all" > .deps + echo >> .deps + rawicons=`cat $(icondef) | cut -f1`; \ + allicons=""; \ + for icon in $$rawicons; do \ + allicons="$$allicons $$icon.png"; \ + isrc=`cat $(icondef) | grep ^$$icon | cut -f2`; \ + echo "$$icon.png: $$isrc" >> .deps; \ + echo " $(conv) -z --file=$$isrc --export-png=$$icon.png --export-width=24 --export-height=24" >> .deps; \ + echo >> .deps; \ + done; \ + echo "ICONS=$$allicons" >> .deps; \ + +.PHONY: all deps + diff --git a/htdocs/images/action-add.png b/htdocs/images/action-add.png new file mode 100644 index 0000000000000000000000000000000000000000..8da21b0523491934b5702415f749136f77814f12 GIT binary patch literal 761 zcmVf03X_Vs^&;S4elSxEDR7i=<0xUZRWEGDkxp))}X4_s#EaQ^$B```c0g*8O~1nW73zZQ(76%MI2==k8Pw_yeoEwlEq}7+W-e8ZLBH zrkY?RE9nlyB51vjS}O9(MdsW&t=P$SwWDSzf&q$&B8>NJ&5bVA3BJGXG!br!@!gVn zJir&hQ{zSbY4cW>p!THs2zazw_r+3p9~fPp7l=G3lV2Y<-~LI`OecBi%#z_2`5S^Y z#(zj4{CkO_O5A<-@-FebnMx$7hbQ$`@~|8A=birOQ)Qz= literal 0 HcmV?d00001 diff --git a/htdocs/images/action-delete.png b/htdocs/images/action-delete.png new file mode 100644 index 0000000000000000000000000000000000000000..21edc3b4c276914c637c9fed64db1018d68a6954 GIT binary patch literal 1268 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 UY!u*cX#fBK07*qoM6N<$g0Y*xjQ{`u literal 0 HcmV?d00001 diff --git a/htdocs/images/action-remove.png b/htdocs/images/action-remove.png new file mode 100644 index 0000000000000000000000000000000000000000..5f9997e8048e82aa8bb2fcd2bdade0f7544f5f12 GIT binary patch literal 484 zcmVf03X_Vs^&;S4den~_@R7i>KkugtGVHAd+ z^WE?Ek_JkeQetc3!e1avvJluDpo0Va1QOlwKe*MzpCB+b3?>d57I0ApT}em?12xvB zv}r51_ulWgU@<~WE)FdB+0GfB?|sh)85tS!_hPS7TvU|>3{z=DM(HJ@pK9lw!&@I{ zJe(>S=k0=XytrjBP)cw1~$eG-aeWx#*t|oRhe(~DAl*f)s|8vA2s%AKYz(lxquT<>$}pE zvu?)%BoT9fy+~42;XTcd1QpvM2^@9!1ijh zvjKm6vIe?INI5pL(#!{`(_f<>oJpSjo^BksQ7u09R2H02NTW4MPtnh-&CbDpq|3;- a4}Jm3!;CzM7jzo{0000f03X_Vs^&;S4fPf0{UR7i>Kluu|}RT#y8 z_r5o8CNqY*JD1smutQh^B0&JxJ=M5Z8*H>i2#1bq9O|=znYw*=E%VEnh^?HJfsdC80%{vMW*^ zirn#Ft#!-&_c1q_;X=>%>fGTmjSzj>^Pft>r5hT=wov8;g1tggrxkj&tq<=#<266f zx>0W5cRQvf!HB|5dtpT*`LVC)ekSRT_Kl>Kt7?-lD*&QRp&bI=1YHRzU|N8u5$iy& zinl}|4^usJ#C(GfpWDK=>iBi5R>RG0Xsvno&btel3+YdizS<{NG=*+e=ySnJGh|hm z=z>PM8eN=^(JYgcZ7pGcLpzsq7dg=RKHgZ7w;rqK>BRcQCRRCAzd>%`W8Q9T!-pyn zO$476g3gM^V?2EC9-1q56E-8{+$l~@rs$nG#)R`T0FChk5i`mcpMA--(>Cq9YG~h8 zyVxYY6QXszwsxymbo@t6A-D~|H#`nr?&jd7?!P?$sZ1XLyYeGmL!{0^7d6^}sUtRRiS@j)d*h#qkMv&U z>(?yrywKy>ehQel`}fYPMGp2pRy) zWE@f-465%wKaUi$BdPV#-%j~Ac!*%>Oeh7q5y5$ot^~Io|}!_#fd{ X!6sO8+n$Ck00000NkvXXu0mjfyy~|) literal 0 HcmV?d00001 diff --git a/htdocs/images/action-revisions.png b/htdocs/images/action-revisions.png new file mode 100644 index 0000000000000000000000000000000000000000..b18e1a4cec2929fc8fb71ccdc11e670ac586116b GIT binary patch literal 894 zcmV-^1A+XBP)f03X_Vs^&;S4f7)eAyR7i>K(qCwkR~X0f z@B6;_pENOb{j+r`ZD^uncF=Z?jMiG{2D4Zk(+MhLinZu=G1#SSP|#iMN;Y@3DJbq@ zu*twe84lT$*c8`B>{`j1)|95z)=r~Io7c2C@7YDCh!^hdb~pUpJQwHie9n2!foFM^ z|7Th|yJ}mveGo9SS6OxQZQUORUa0&kP*p)PHJzTDzk5zq=v%hAeu;g5O#g2{PmkI$ zc7NhX&nGn*UBm6rkV`odqr*gFgN5Xc^aVwgeHcdHrQQ>%RRb-Z2e%&F_ik@hsEMKh zLdZwe2TzGFL2)es(AKrK#@CorfZyA3r1W1tDiH$7E*Wh7`h( zk7w%J)ACaNI{9l=nLHYLX&l%LVCn{nB6qYkH^O3;wL{=O_t<5xUOM`@6Bm z2Ji{N@2_p*TcQ(|AkqcSuQWCnJWca{d^jkOSe{(bbpMJ)j*AZLZ z;>Xg^gQ;YE#5BDWy>lxA%s-mI zKLJlp3@8D7z?v4PtuE~?FSS(!Ypo9V+Uev_G@H5o2Qc_=fv2Hs02`173J(|m0%TiF UT1If{y#N3J07*qoM6N<$f=2PIy8r+H literal 0 HcmV?d00001 diff --git a/htdocs/images/action-update.png b/htdocs/images/action-update.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd240a7871ce997a93050a58e99b12e55450f2f GIT binary patch literal 1379 zcmV-p1)TbcP)f03X_Vs^&;S4g{YgYYR7i=vlv`}nMHI$= zXa3i1cek|5ZUJdYeZYuXi^dBAMq?Be@bW;65+w$LM1v^tK}|3<#ss3qs8NwbQKK=j zMuIMbz$@ymHobSsynHk|f+AX)N z^@gn6RI!7&qg7m#9BJOZ`RL?4Ial$BKQ>FWRfo~%gVX_a0y7Q7DR^{JnGs`d-t*~} zU4PxQ0j^v2U^vL+?*+M4U~Y=+jIdWOiFhSbB4H|`C65q|Mkx=636+Hjm4%2!%PDgL zRzJ2;QlshnfQbT^uU_p0eZdY9wP4ZpS99&v4V*V~CgDg0V_D7VtR|faNM|&o8BL%K z+CW+xMot_0(y;jQI9FXZhp)c*zJBsF>_}2q2UrW1-n4*KEAHa=fgHnG&0sQvHlT}y z2!vcg8$oMBU<9Kf(1x*`CLFRz{nC7KO+4QB+sTv5fv*6R4pb#Tbt1+eBYA8~@LYxO zDtt%qT}8-M_>RJNEkdp$RE)l-2ziQZPP6NSt$e&?v%J4@W%aDe%C~?D0A-Ad0>rDP z;8=oZ3%;%JY{7F1#NJs#1srk;am(gcxo45b_V=D7mr5}!7K;HF0N8;FMlG%IJO|fN zXl*cnHi9t*qYGGb1{-4vdj`5X+R#V0vZ8S#LCd48diGQHv>$sLhyd6skO2hJ=`lP< z2((~|b2or76tEGrF~xO3#I+0`zPyU9FRq8f8%Pdi*>PxK1o#X%Rv3}w2LaNj$8apc zvB0(k*A^U0;n)hdxOR)UqRgUZs>jw>o@Ud-mtpmN1i4|>zn&x%pK}UG0i6J9?lHfiwNUB*)}}A5oc;Wuf4aMuFQ1SJoXZGb#=^}H;;Hc z4nSS)3`ER$2X;}VLj%42N$P56oXrgE+_@7=!S(f()Yq>f7K>3+Q$r$=Kq)nzS9@MH z2Y)(z!Lnt`tfr=>zy`=E(`jkp_&*5DpFf}3vuES`K2=p!_`d(QdExRh0RQ)VEC!sg z0o+GhztA`_<-SnLpC>;l2Hqh9p;mkV#p}nK4XM#WwXu5m) zIMVeSM~X!4ojsgNjh0d}z|R7$f@#6fnzz-D`?kGt;tXxk7A{@=2qG_DbHyciu1jx! zlFshqWV5+a%26@2f@wiXE6QrAwokS-H8lnQ)a{we*x0D9J=nY62zLMmq!mnyh;GSb l{X++KymIQ_jPHN9KLIei{7X~jV*>yH002ovPDHLkV1gxKedquH literal 0 HcmV?d00001 diff --git a/htdocs/images/action-view.png b/htdocs/images/action-view.png new file mode 100644 index 0000000000000000000000000000000000000000..bd07de6734085a958511c314069995c8f62b8b0d GIT binary patch literal 1501 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 R2C@JE002ovPDHLkV1lpWFaH1l literal 0 HcmV?d00001 diff --git a/htdocs/images/barrel-directory.png b/htdocs/images/barrel-directory.png new file mode 100644 index 0000000000000000000000000000000000000000..52da676d225adb7b2f3e470e18b81bf169f9fff1 GIT binary patch literal 1418 zcmV;51$Fv~P)f03X_Vs^&;S4hBuPX;R7i={)5~w1)fva} z@43u7;~7uJW544|<`NUvWE^`85yhldVkLx>78+IRB5GL_5NcUab;Y6*e?d20AVH~A zsjXU7jZm^_L}(JZKnyfO#Wc195xB8EW5@Q~e3|?0bn)6oX$4fU;wL>i?|T-{N9P7# z_lPIHb?=xF>Vz<@+bzVArZL^pnD;HWxb(-jZr%RMz>mh`lS+w`#z31_bM~o2+?vZV zeSMvBsWELZ7fh>l{@g!4{_x8HDiIA$oH={&$aBBA54T5g<*$oG4z%;k&l4OR4D_{{ z=HYC*`rL51>xYSGsBa|Fou5smSO0HdBo-P-42nmGV3 zCg$!HgnNtmjq3B?d(1{4ko7XUoTEJ&Bb%v^TQ75DppGtOa24+0(-j8d9ZWnn$dQM7 z@U$s^E>j(=l$%e=g8kFcSl8-IGCQ*e%r37Nha>jSjvepu`q~5tjWE!3`?0)k{`T4` zCyxh^N+X0qHmc}y4p(87fUiaT{vIAaGsvOgAjR!Q``SwB2cuD2%p@~!04RV&)c$V# zaPXeKkP9I-2nAB(@9p5D**q6t-yjfh(`|c@E*D6(gH_O_G_FzxyG!%HL_gbwCJXah zN5^7aFHR@3H3cvlvqu7*ZR3d{KS%{aAzDpn^D#EDpZy2?T)CX)+=UFwYb}h>bai=9 z+U2YmP_+_*7U6i9s~4AauF&}N$7}g@2Z-42{AT@$)8Fm`q=O((wF&}5XSbJ!PDVL? zI)c!e8?y!eaz4%cVx6J*J}i#~LSwXrt0Ty37jE;x(&h*GqBXApYPH(6Y?@{|XH=-u z0t~{m0E4PlQPm0vflIp>doaj1$9t(a;mu1+{OZ>$yzqQKN}JssM=5~>4^$6IfLH(d z?@eI(#_SeGX^8GHv;$~?)>4D< z$ldE?;PTsVuRG26%7u|G*n?ac<;{cd4? z%OvkqcA6{aEItEd2l4N-h}^S}#Z(of1;(JXKuV!OH1>c$y*u}bz)YS$H&06l5E3I5 zM(&OZBlTUNXbD8C#i_>+aP6Ipv%NcKpoCN)YI^`cljgHC)0wqbUYaGdQFEFLiIEb7 zgu5^Ylnp~qpO<2(LA@oN+ovQ_2^R?G9qeWrAVdT#OJqgd$ofIusn)3pXS=tWtLWo*HgL5l>RJW zH?O|8unN4gQ~Lh?@W`!&&BuM07LT=A`o8^PU*Dm_LGB$6GB^~ZSg5mhr-Z@OK~=>U z0iP2EzR+N|FVPe9oC@~ literal 0 HcmV?d00001 diff --git a/htdocs/images/barrel-home.png b/htdocs/images/barrel-home.png new file mode 100644 index 0000000000000000000000000000000000000000..a1905de96e6951d8b62f3c6a98ee11cbca42af66 GIT binary patch literal 1541 zcmV+g2KxDlP)f03X_Vs^&;S4hpGibPR7i=nmT7EM*A>Tq z@6Eg!&%8HY#vVM_gKaPYvBrhk#V$c=lMtfBC0&T3D5{E@ibxSslF}~`Z4!!#x_l|E z(n@U=sZE+H`H(hSsRCJ06)+eub|Bt}O~xLN$Ftggv%Yt4Kg`6K2&MhfBOU2(=lpf< zJ?DQe{GUa+)#4^t>wpIU;}!n!?}SOyaL~vU_JWQo;upY_@l{a`{SgS{+w2)Yyn2k+j<8`}9U;GahXaCus!Hf-Q4|ay3%Hl%Zn2_kfVDuk zuJho5^@OKQ+ z_meOTHW~(QUB{_uD64B|Yc+W7?NNU4twlh+QBWewo_jqEkEPk!9Ylu>K!Xz)ek+ma z0hB-fCV-ifBvX=j!p0ScnW)X#nIf?{8!-_h{wh58OgoBhA*3j$yA*(AZ?BVMKbz*@ zflagqy|;};vjL|c9y0VV_7Ki;khC1yJr>i3q=j6SKkLK3l|g^OxYnaR*R@;KO-y0E}KO5#7yIc6_j~^iwpI~Tk0H>xRG#@UPM2H0n*XIGa zm|vjaQGpD?&d~S%I3^4Lv!5~PO#lu!-G4Ux@2B_wg|Do&IC7|!iJ{}{+_3`baG_N> z5JIAuWeVx2GSF630gy@NxIUheakv89sJ`U@mtgKHe0MOi@be$;e`V(2Lod+Qq_M4| zkwVGBt81haIdny>7%J$ibP9Qkldq3r!9)Sf<<|qZZkZk@bTz|)T2*;q@55U?`yTCL zK9xjusJ!v`2h?~qVou3eKFg<*8H6oM8F=+NyaT)lSYHJ2nbhmBy9pkvb~)|{1a)OL zvWRU7BxEg^D!}L>e4K!B8%mY?fBU~h@OfEX5Bqf3T!O?rOqr0Z?AaBk)4&wv55P_G rzW_kF^KAs`DW_q)qG>>Wk>P&;KLc^w#l?QC00000NkvXXu0mjfbc@fv literal 0 HcmV?d00001 diff --git a/htdocs/images/barrel.gif b/htdocs/images/barrel.gif new file mode 100644 index 0000000000000000000000000000000000000000..dbc3e3d8c5844fd07a115d0e7afe77f5d2937075 GIT binary patch literal 2658 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 QCHO!J^^(F6CLIs}I}aDIa{vGU literal 0 HcmV?d00001 diff --git a/htdocs/images/favicon.png b/htdocs/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..81342546057ab1a75d219121bf09a1ea79a028fb GIT binary patch literal 2181 zcmV;02zvL4P)P|%&?`~iVv<3fTEf}5<8Kp-VXvuBy6Aut$C6OP?3r!JBUu^RsuAb^XqaexhzC zkEU^Vt!leAr7XsNXZm5>Jh=bhN+@|-k?$VNk6*t1!|(so<-H$$`w#!%aKZr~6{|u^8hA56>REuB(!qK%0UX6W&MG>oqB7QVLX6g+TDgBiC_bj|-mjAHT|K z`QY}fDW3i0$DjYlpU=<_3;yB@pQzvQ!B741n9_3wNjsktV%+1h3V89w7vH?z?Kpk% z*Ga-Kcu7$xtn;LlDT)GP3<-r)8JVDIYm8Q`S1XK2w3S5e&iUcDzmMy8n9AJTdj~%7 zzW4mq$$b7hC&vdgO+`CDpgTN66b-s8(Mls!fhi2lq{H<)at!2PiQbc9Bzlh!kZn)S zk+W+P;&%IMAA0_U|9Zm-jIM7kR&X@$u(rTmED>2!)(xpJ1k+F`i7*w5^#W5?KqAM0 zR0@$ZQbel8Agh9F#|J1kaNEka18)ovSzXI1bG}+(%8}Y=q=qgGDAQnSkI;%tLys&m$5W2Zj_GDonr_N`K4&`y z+&ECzHB~bKAV*87GNnuiB}p+6mRH=rfMHA|1Se14qCGgR_5x6t_Q7rkIwDeHb+O|3 z_>^%yqP4-uj1ZDQfi4@87x+}7>Xu>fxN#r`jV=t;amn$cj}u}d27kI2Kqy^3e(M&8 zM~4JwiEbc>NR}BFMzRz{tI+hQ3`!NG=uy$q&Kl}ziO7+nnIWY_C`}wzjGN_q_W}eT zbj(oIE$zt}QVQCp=BYP5#bU9>I!jenBm_;<5@Vz=6+%gf5pR2>ROFm+hFK-cpu{5E3EwRP6*e?2sbj?SS_YKkjIY zgt9%(#%?dbLDwwnu$f_3h{=@ET1sPZb|eIccb0K12;P%&X1iYEyhmJK(zPX((PXO-yO0l>MT&x^tPu;5b0`$)R{ca;Zz53~G3b$i2YlyB!xFeGH4BItCM^2Ica>s5v zBE}_!f+S8+J|IU&aFSP6o=QhfZr)&e`l#Ov&`zgU&TV+Gwru)Kx^73;O_;@h!zqIj z8N1O$Afrs0%J5WWwa9HoEZ8YW!+$xi`RE+ zy#F#^@8wnYNHq`YL6C-}?(Yi$lsOlPJN`}pb%ZvL=CKIGG z5IiDh?6@N&Z~xD<9|ri^*T0!I+y1r9W_CM5Yk`T-R3u!=XZ!lXXKP93Po8O zq>?y05JNy@$T{QPNYhS;-cuCCUoaUpYha!6HIcxxF+2mwVoAqGouTSQI_+YP(n4$)gqZ{DOiIwNQO-@nqa{F#sZ z)<0+wo-UK8G&OBgfe>_EgQ;7pszMvX>CuFXg@x!KNuswDg|*iS z-J@rp`)uCt768ku<=>rLJAS&IpJK|Ahc^}mEU^kOYfHfzVqFG`N?9r`QF8ybH>dYl{}mEjupxO^pf>?=qFq-&Beheo=q*Mu2;F@1!Sg-TW%#BoXgus7%)ggy`};+A^ts>u@H6oj^%wjK^?T2LXnr!EKGRn1 z``b#tEem~9mvvT3u5(Ivbz%OsEagAfP5X`KKl8#%`}F)Dkp(E*4aL_>00000NkvXX Hu0mjfF;^Hb literal 0 HcmV?d00001 diff --git a/htdocs/images/gartoon.defs b/htdocs/images/gartoon.defs new file mode 100644 index 0000000..a8870ab --- /dev/null +++ b/htdocs/images/gartoon.defs @@ -0,0 +1,33 @@ +action-add gartoon/scalable/stock/gtk-add.svg +action-delete gartoon/scalable/stock/gtk-delete.svg +action-edit gartoon/scalable/stock/gtk-edit.svg +action-properties gartoon/scalable/stock/gtk-properties.svg +action-plugins gartoon/scalable/stock/gtk-execute.svg +action-rename gartoon/scalable/stock/gtk-jump-to-ltr.svg +action-remove gartoon/scalable/stock/gtk-remove.svg +action-revisions gartoon/scalable/emblems/emblem-cvs-modified.svg +action-update gartoon/scalable/stock/gtk-compose.svg +action-view gartoon/scalable/stock/gtk-screenshot.svg +barrel-directory gartoon/scalable/filesystems/gnome-fs-directory.svg +barrel-home gartoon/scalable/filesystems/gnome-fs-home.svg +perm-public gartoon/scalable/apps/gnome-globe.svg +perm-auth gartoon/scalable/stock/gtk-dialog-authentication.svg +perm-admin gartoon/scalable/apps/administration.svg +perm-user gartoon/scalable/apps/user_icon.svg +perm-forbidden gartoon/scalable/stock/stock_dialog_error.svg +mime-audio gartoon/scalable/mimetypes/gnome-mime-audio.svg +mime-compressed gartoon/scalable/mimetypes/gnome-compressed.svg +mime-deb gartoon/scalable/mimetypes/gnome-mime-application-x-deb.svg +mime-drm gartoon/scalable/mimetypes/gnome-mime-application-pgp-encrypted.svg +mime-html gartoon/scalable/mimetypes/gnome-mime-text-html.svg +mime-xml gartoon/scalable/mimetypes/gnome-mime-text-xml.svg +mime-image gartoon/scalable/mimetypes/gnome-mime-image.svg +mime-msword gartoon/scalable/mimetypes/gnome-mime-application-msword.svg +mime-pdf gartoon/scalable/mimetypes/gnome-mime-application-pdf.svg +mime-lyx gartoon/scalable/mimetypes/gnome-mime-text-x-lyx.svg +mime-postscript gartoon/scalable/mimetypes/gnome-mime-application-postscript.svg +mime-excel gartoon/scalable/mimetypes/gnome-mime-application-vnd.ms-excel.svg +mime-powerpoint gartoon/scalable/mimetypes/gnome-mime-application-vnd.ms-powerpoint.svg +mime-text gartoon/scalable/mimetypes/gnome-mime-text.svg +mime-unknown gartoon/scalable/apps/gnome-help.svg +mime-video gartoon/scalable/mimetypes/gnome-mime-video.svg diff --git a/htdocs/images/link-external.png b/htdocs/images/link-external.png new file mode 100644 index 0000000000000000000000000000000000000000..419c06fb960b0b665791c90044a78621616a4cb8 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&i3a$DxTeiKV?6WB%rpNP(#|lX z{f7XTR~%D;3fN16{DL7O3{u|AZa^UmPZ!4!iE!1^jzSC$EX7 z>#2$@InOtpuqyg8<+R}9g-+|v&13&5`dCp`{|95_8^+nQkC>(b&0z3!^>bP0l+XkK DO07OF literal 0 HcmV?d00001 diff --git a/htdocs/images/link-secure.gif b/htdocs/images/link-secure.gif new file mode 100644 index 0000000000000000000000000000000000000000..8a87e283306994f247a3015a9d309f19a08c877f GIT binary patch literal 918 zcmZ?wbhEHb6kygqaky7k&s78}-D?A&I)Z>QO@L#8K>np`|*eD{X({oDFi zE*RgsW_bIC;e*=-5AFbw(b-ecPae2GdEoWzQPlG%u`iyaPntAo(V|7`)~&m7ZO+@* z-S6Kn{P1r1M_wNsX|9<)Z@9%#g zU>F6XAuuo@p!k!8k%2)62!Q~UCm1-286r7EW-LrN*vP@2Cb5v|CRNKE3`spQHjC~p=q<3mGg8zU>9PR54^ tj;#E4+4s(5Iy#-7z{DZpaNt1WMLy5mM^`KvnNACc9q!s|V4%QY4FEFIiq8N5 literal 0 HcmV?d00001 diff --git a/htdocs/images/menu-back.gif b/htdocs/images/menu-back.gif new file mode 100644 index 0000000000000000000000000000000000000000..b03a615d11e64fbdb907d72bfc5341bd34667438 GIT binary patch literal 269 zcmV+o0rLJwNk%w1VJrbg0FeR!|Ns9_Uy_ZQ#sB~SA^8LW00062EC2ui04xDU0008s zl#i*)?GK}zwAzca-n{z{hT=$;=82~2%C_zc$MQ_q_KoNI&iDQg3<`(DqVb4KDwoWr z^9hYgr_`$Tip^@b+^+Wv4vWX+viXcotJmzd`wfrF=k&V$j?e4&{J#GW7$`VMSZH{N zn5ekO*y#8O87VnQS!sERnW?$S+3EQS8Y((UT55WVnyR|W+UoiW8!J0YTWfoZo2$Fa z+w1!a94tIcTx@)dTnvz$2C&R*=KKsjCOu6JX6-Dn+|B*%9S%M&UQT{)o{qk*-p>B+ T9uGe+Ur&E;pN~(jT>t<(;jV_{ literal 0 HcmV?d00001 diff --git a/htdocs/images/mime-audio.png b/htdocs/images/mime-audio.png new file mode 100644 index 0000000000000000000000000000000000000000..fa63711b704af6bd38304f60ba27f3aeb64298e8 GIT binary patch literal 1419 zcmV;61$6p}P)f03X_Vs^&;S4hB}qg3gWS+lXFn5o*=&c*Kj z_f`YJ+gc=)cyZnGIY`aG!dXlCt>tS5LS8m5d6P}+-@t6K;`4i1_sL9bbIcsAE@ocg z;~*r7HjS#fW_kkyYOtfO8t4MJc>{OBmJ|dF*A~r2*A+|hi|B0fV@@~HbnOy$dp!O? zC*?K2qP!MN2927|69jv`m<zog{O!Gti`>wXKQv zx*&;}HX7UN(W67GeP=OcJwMnm7Mv;s0Bh&a&Pf|`qGSoP3qUVVQ%&HLK$?Hc5v zwi)D2$s^F$H_{$G);DJ$X<+~N(q^42yinMR_0I&?{{ zw72r*d%IbEY%PI4Ka<=UOqw(qcWNq{rcqk?2WqIl24dYnbQGXq&C2=H(d5WrZ(Os9 zRJ)tX+Hz7KzMmNzXOfxu08&bpFM49^Y!VEGsXX6Eq`z}idjLpWy4m3>+&Xlkra}GR z96WkfxeB*LwfLlG0o$$nOKng-ndFE!<>zJHcCvd-NktucBz!3r?C}BvqW};K3-UZ@ zQjSx8_vpIf$f=9O2D+;m+a5p)DZ(df8`*Q{G=YJ^{|ub1Z^75wPuSNq>iyq{K|}k% z=j&dw{o`+Pgb-v*aFLsx&NNRtx!EJ1D=}eQ;Fsg)QL#wJP)B_W&^>nj#{XcVF=_I$ zIM?KC&FadMCaXspEFPq^0;IYeBjAIRnC3|%H#?p5)MSF8FtgV0pyS%*gZ^`SKLo1A z0{{|$WWWJ90lPWn!HFhknn$xGd88>mOB&5nK$roX308Dn(H9Iw0`(f03X_Vs^&;S4g1W80eR7i=nmd|fgRTRfR z_r96w{Gja=+6LNUThNv&sI&z%L2QCx&_ok;L)^G?MdH@D@Lw>|gcwN-YK+3F3nZGf zAqAquXwd*IZ7FSOr!5RjJJaF4H}AcBTudpY?a*%gzMRdy=bX>I=e&3Cga27-BTgM1 z#1jj=p%gDGbe$-&3vu&Vd0u}h$Wfqq(RCEmCDG=Kz8mzf3+QU4Q*kgmW9z;F`u&^g^IGI<-&DF)&z95P;D%AN(t|ll|^{9a}O`=evYPR z>Z#e11mLSvXYidYpL}$9DK3+J$ne-*e(1i!gZccwO3CM|09|doBBIU$4P6I2`0#^c z#G+-Z7U8-DdV6~~_S&xEfR2C;gN|_a{GW86@0&?m(imD9XoMXK8s0u~kmK*aiI`wj za@%$o8o0qGa*U^P)HSsbjzpK{|N7@9ASbV1r?3jpH^`5#@8V+bi54er7d*rLtoy{c?Ybo*igH{Rgt=vT z)>iKjDZsh=z(p-R8rSun3II^Tl2b_l#XZiX=Ugy)(G+fBeSp!A0VR8|D9;as;-?@W z3ddO=pqCv%PX{P`ODlZO0D=IH^Yk7h5($h@xiNs?Sqi*@UwkJ-u${shega}Zgk-W3 zrAV#^2m$2?n?Z0~4-o+oBH9PfMZ|y!iiwRuBmiUBoJ@j9Nq`1+0(F)}l_=_B5zRx} z1rY=xu6=@h2E-K4DH9+PAjTlZr?#pbfvU9t+kiG84p0@RT7iy*6#2Z3AczQ&h>gFH zMoh56e8dFQmRl&EEKv;D3v6D#m1K;1fcnnkM5|kI=BG&yU&fxkiJP580)Hu~F+O?6 zR<EN4+`h;TL1t607*qoM6N<$f>L}5{Qv*} literal 0 HcmV?d00001 diff --git a/htdocs/images/mime-deb.png b/htdocs/images/mime-deb.png new file mode 100644 index 0000000000000000000000000000000000000000..dfb5a0c14fcdd8c89196c37fa342219c097ccd5f GIT binary patch literal 1297 zcmV+s1@8KZP)f03X_Vs^&;S4gt4TybR7i=nmP>3^RTPH5 zz0ZC3bz4dUr4`DfrSj|pP{X4UK@g)xoe&)u1{wz>Ox1xiBQp~p#6UEtQG_^PfG7z~ zEf7Re9#S4{DHKW{a7*u_xA&fV&e_XBTLel&C$3}<&f4o=|N8%ZcFuwSIn-2&8XAb? z4fC8*ELZ4qQ6z^W=7WN?{#1~SK-E}j7pUW+%_prFIrCV8rWzVWsrP^vfDk}_UWDnT z#a!#Y)e5Zj`z%61KUymismwT3lqJs^uvWbpWVnTHU}KuWu$C z3QicpwsSN$A7%5Jg`)`_0PP1I;K1QOIe56WKW52n-@`y7%vDgaWy5N=zVE|O1*?%ovTbE@$NLihInI(G$-U2SdTCJ?k<=KFOEd528z+TII?5YNH#g$NXs zaW@4wy4o?RK5818ShDd|wDn($_)voO>%H{!4jALI3qU{W42;P3V`p!Au4@4B+$@=) z8wBm^jPzfkcIA31YwFOJk5p=yo`EDfGK0mdHeh^(06oV#xdUK5ir~f|12YSyv@bTi zYEfkfH8ypvc^v;2#R4 z?UKpnPyrwIKpYVvn;0P#PjT+6BP@G&6VYf9N)dgW0v}L-Py#~Mb`TK|A)sBfW$@y| z;EYhac?qX?AEIDoCAIUWQ4)=U$fN`sm0gq|+G$K|}}yGPuJr>bBHyd|xxq zyto)K9%5X?c$5`bC?2#Z4AcQ7_e+U}nFTPbaVw$H8nTH#VjU;Q^j*PD4p3OB2(+h3 z^xq&5RHU;GCobG%-_Iu|C>Ztop@`<6;-^XG)pb5p43onSybf(RHR~hn5%sm z99McABR>ZGeA#-5j!F7V?XO}yR@P9Z9O{*3@b^wyrh@qwo0|zK9b(bM00000NkvXX Hu0mjft1wHV literal 0 HcmV?d00001 diff --git a/htdocs/images/mime-drm.png b/htdocs/images/mime-drm.png new file mode 100644 index 0000000000000000000000000000000000000000..1670b41880674b12d01588ecb6c5a75430357f6d GIT binary patch literal 1506 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 literal 0 HcmV?d00001 diff --git a/htdocs/images/mime-lyx.png b/htdocs/images/mime-lyx.png new file mode 100644 index 0000000000000000000000000000000000000000..38780479b2e3260591acc20ca1071d69cc0339af GIT binary patch literal 1688 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 literal 0 HcmV?d00001 diff --git a/htdocs/images/mime-video.png b/htdocs/images/mime-video.png new file mode 100644 index 0000000000000000000000000000000000000000..3872d9a386dc90f0623636990beea8322da5da06 GIT binary patch literal 1418 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 literal 0 HcmV?d00001 diff --git a/htdocs/images/perm-auth.png b/htdocs/images/perm-auth.png new file mode 100644 index 0000000000000000000000000000000000000000..39b1fb6e4d4e7afc3a211f5631aeda195552c7c8 GIT binary patch literal 962 zcmV;z13mnSP)f03X_Vs^&;S4fTuDShR7i=Hmd$S)RTRa4 zZ|oV5?bu^dlf;2UPSTW$(DD%xT1ZQgA`q!6SRqj%p=?oi@HenQeDBzFfdr^KP=tgE zLQ#=Q6|7RViADKH?6kF#w05y4vE%W~W8pNiJu|I2(vxQ1JNKS@=biU7g6^OLqrgLe z36z1GK)uU&UnD{K3`7lt>=-tPUxAZ=@Jryk01SY*IB1YQbr>dwLc}8qX4U4dX|Yk3 zEEizmPq1w94LGL(`9B22FQZ9b_++l117j)5m2GU>K~;n3x{8#Ne1^ z3w+eAz+n(qzI>;b$M^TKn7K~juESahv;Y`k7#q--K6;SLSN`GKMU!(G3LpnN69s() zjwE~Fz{oz9vw1G(9lp2#5;lMc&|`$_e5&Ud9ZoWF!vshHBfv^)BE?4_qN|{(L8`Sn z*Ec}IJji~KF_4LWt5mW#cL;@4qS{`Z(QOA_(13KyyOgdib;C;_qU-wWu+usJGKduq zek=3`2`GkP{QTHZaO$m@^xovh?>)tn&yKsY{q)_XX4X)Ev7s=3ubCf$oTkODZF?{| zIeDf(A*U{!eTg?;9ezNufDpR^3cr0dLqrce56rez-1?HsN={Xl8C8{561xIL@TH56BUa^)!c|6>oz^HFf*?mp}JKgJ?^qM0MEVn z1b$htzj>|<2N5c9x z;&v6{T5|;MbE8-eY&TFVb;=d13jurA0JenEPIK(y$IK>~HIp}vr5M@ga%8i(t~&6* zxgXY8nqLLrOM_0doj6d*kuBdD}*ybyafweKU~WWUaAQrvEMiZ}rU z8&G^qr78k&es7%%bZ~Bgm|MA1(`P4o(K_rId^k)gp>z6JiboRdr~C7TTg)$&ioh9~ zKL*XtJPLUQ#Mz)CQcn*>nI1JT!ku+AAtl_|vbdD1u$VIoAm0Ygw{rYWPz;y_f03X_Vs^&;S4e)k#D_R7i=%)?a9qbr=Wm z&wI{}F*a13smPMegrY$gGmEmV9EuQwE+VPyqUgfAf~3e57(@wm6GSXYA_*#jpt2w+ zu+=gwT{)`@Qz9DFoQtX3j@!;TPZ#ewImZ6)qAz^;y}$Q;-tY70_q-2p*1}MSYj9j< zhV|}zhSWc3R+ z%||?c;MtBC{H{A<%k>f0nv{#y6@Iu}yZ}>3osq+j#SR zA}E#8btal(^Vt0|y}xNoc$*t54(d={?EjmQVXCXSu3>TE=W<|ex~nHGQ4#+6_4MLI zCu3s5SdnbHE0AU|gyG(=yK3)%i$fgiB1y<((se3Lx}I#4A2nX$d;ZSo*&duq;UpOXY}13rv*K&ipyc;{`5p6uYGLpVa~BJl~6F>Jl}3s@RN`<%dH!iGu|O z!v*Ze!Rg8}SEW}=r((Nww$w|%&_0}&w&D@#Pr(0!e*qN)h9PU=h`Im(002ovPDHLk FV1nZ~jBx+} literal 0 HcmV?d00001 diff --git a/htdocs/images/perm-public.png b/htdocs/images/perm-public.png new file mode 100644 index 0000000000000000000000000000000000000000..069b22769af65494e41c7d68db44418eb0a9df4c GIT binary patch literal 1544 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 B&;bAd literal 0 HcmV?d00001 diff --git a/htdocs/index.php b/htdocs/index.php new file mode 100644 index 0000000..bc0a8fe --- /dev/null +++ b/htdocs/index.php @@ -0,0 +1,20 @@ +toplevel; + +$editor = new Diogenes_Barrel_Editor(); +$editor->readonly = 1; +$editor->run($page, 'viewer_content'); + +$page->assign('greeting', __("Welcome to Diogenes")."!"); +$page->assign('about', + $globals->urlise(__("Welcome to the Diogenes content management system.")." ". + __("Diogenes was developed by the webmasters of the Polytechnique.org web site."))); +$page->assign('available',__("The following barrels are currently available")); + +$page->display("index.tpl"); +?> diff --git a/htdocs/kafenio-config.jar b/htdocs/kafenio-config.jar new file mode 100644 index 0000000000000000000000000000000000000000..e9821a5c2f4c4bb7bcba01548a37874661b4ba78 GIT binary patch literal 36969 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 I|MuJe0W~-#$p8QV literal 0 HcmV?d00001 diff --git a/htdocs/kafenio-icons.jar b/htdocs/kafenio-icons.jar new file mode 100644 index 0000000000000000000000000000000000000000..3df468309f910efa0ca865bdcd59205dec2b1d70 GIT binary patch literal 8759 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

4W+xWL$-|`MrJ67~R>61Nu!BjwWM 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 ZC`f|=t7{MtW#Eq+aL&kcdm{z%{{UMk?d|{o literal 0 HcmV?d00001 diff --git a/htdocs/links-main.css b/htdocs/links-main.css new file mode 100644 index 0000000..2b0086c --- /dev/null +++ b/htdocs/links-main.css @@ -0,0 +1,12 @@ +/* external links */ +#main a[href ^="http://"], +#main a[href ^="ftp://"] { + background: url("images/link-external.png") center right no-repeat; + padding-right: 13px; +} + +/* secure links */ +#main a[href ^="https://"] { + background: url("images/link-secure.gif") center right no-repeat; + padding-right: 16px; +} diff --git a/htdocs/links-sidebar.css b/htdocs/links-sidebar.css new file mode 100644 index 0000000..51697a7 --- /dev/null +++ b/htdocs/links-sidebar.css @@ -0,0 +1,10 @@ +/* external links */ +.menu a[href ^="http://"], +.menu a[href ^="ftp://"] { + background: url("images/link-external.png") center right no-repeat; +} + +/* secure links */ +.menu a[href ^="https://"] { + background: url("images/link-secure.gif") center right no-repeat; +} diff --git a/htdocs/md5.js b/htdocs/md5.js new file mode 100644 index 0000000..4bb89df --- /dev/null +++ b/htdocs/md5.js @@ -0,0 +1,257 @@ +/* + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +/* + * Configurable variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + */ +var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ +var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ +var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ + +/* + * These are the functions you'll usually want to call + * They take string arguments and return either hex or base-64 encoded strings + */ +function MD5(s){ return hex_md5(s); } +function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} +function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} +function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));} +function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } +function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } +function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); } + +/* + * Perform a simple self-test to see if the VM is working + */ +function md5_vm_test() +{ + return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; +} + +/* + * Calculate the MD5 of an array of little-endian words, and a bit length + */ +function core_md5(x, len) +{ + /* append padding */ + x[len >> 5] |= 0x80 << ((len) % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for(var i = 0; i < x.length; i += 16) + { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + + a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); + d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); + d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); + d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i+10], 17, -42063); + b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); + d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); + d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); + c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); + d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); + c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); + d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); + c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); + d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); + c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); + d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); + d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); + d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); + d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); + d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); + d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); + d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); + d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + } + return Array(a, b, c, d); + +} + +/* + * These functions implement the four basic operations the algorithm uses. + */ +function md5_cmn(q, a, b, x, s, t) +{ + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); +} +function md5_ff(a, b, c, d, x, s, t) +{ + return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); +} +function md5_gg(a, b, c, d, x, s, t) +{ + return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); +} +function md5_hh(a, b, c, d, x, s, t) +{ + return md5_cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5_ii(a, b, c, d, x, s, t) +{ + return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +/* + * Calculate the HMAC-MD5, of a key and some data + */ +function core_hmac_md5(key, data) +{ + var bkey = str2binl(key); + if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); + + var ipad = Array(16), opad = Array(16); + for(var i = 0; i < 16; i++) + { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); + return core_md5(opad.concat(hash), 512 + 128); +} + +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ +function safe_add(x, y) +{ + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* + * Bitwise rotate a 32-bit number to the left. + */ +function bit_rol(num, cnt) +{ + return (num << cnt) | (num >>> (32 - cnt)); +} + +/* + * Convert a string to an array of little-endian words + * If chrsz is ASCII, characters >255 have their hi-byte silently ignored. + */ +function str2binl(str) +{ + var bin = Array(); + var mask = (1 << chrsz) - 1; + for(var i = 0; i < str.length * chrsz; i += chrsz) + bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32); + return bin; +} + +/* + * Convert an array of little-endian words to a string + */ +function binl2str(bin) +{ + var str = ""; + var mask = (1 << chrsz) - 1; + for(var i = 0; i < bin.length * 32; i += chrsz) + str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask); + return str; +} + +/* + * Convert an array of little-endian words to a hex string. + */ +function binl2hex(binarray) +{ + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i++) + { + str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF); + } + return str; +} + +/* + * Convert an array of little-endian words to a base-64 string + */ +function binl2b64(binarray) +{ + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i += 3) + { + var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) + | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) + | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF); + for(var j = 0; j < 4; j++) + { + if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; + else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); + } + } + return str; +} diff --git a/htdocs/phplayersmenu/gnome/style.css b/htdocs/phplayersmenu/gnome/style.css new file mode 100644 index 0000000..e69de29 diff --git a/htdocs/phplayersmenu/gnome/tree_collapse.png b/htdocs/phplayersmenu/gnome/tree_collapse.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9be7591474dec5e8badf0d285f8f38007dd5fc GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDgFST5ZC|z|IeO1yQQV2uC5L! z_ISgNdq9e@B*-tA!Qt7BG!Q4r+uensgH_f8$l)yTh%9Dc;1&X5#!GkW{s0BpOFVsD z*)KD(2{8%X{ISLpD5U4<;uumfCpm$EiIJ_OA=oAI=7|#wM;HXTcmkMwj~qREaDw1| isZ<36g#>XH28NnYmWOM7ZafF-WbkzLb6Mw<&;$TqC^qE) literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/gnome/tree_collapse_corner.png b/htdocs/phplayersmenu/gnome/tree_collapse_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..b3328adcc2ab423fed5cc45a7105588b19028efe GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDgFST5ZC|z|IeO1yQQV2uC5L! z_ISgNdq9e@B*-tA!Qt7BG!Q4r+uensgH_f8$l)yTh%9Dc;1&X5#!GkW{s0BpOFVsD z*)KD(2{CDAe0I$R3h8;eIEGZrNlsv3Vq`062zH6QdEx}a5e7jno&YA_BS()OoFKSg iDpkSYzy=m+28PP1EC&ljIDP?jGI+ZBxvXH=O z_RFkHLK;RJ_H(}j3h8*dIEGZrNlsAU)zFrflx&btaB5`qTF|*;hlPaEqwvK%ENlYG ftOh!cf{YAFt}Gkl=B@Vz>SOS9^>bP0l+XkK0535l literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/gnome/tree_corner.png b/htdocs/phplayersmenu/gnome/tree_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..541c5b3bafea8a3e2599b173cd5b56d7887ca711 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQfvV}A+G=b|DQd3cHo=2ML-e8 zk|4ie28U-i(myGkCiCxvXF#WAE}PI3YR6C+zmL$FKa%@ZdWjxY#v@gy8-WYl`ZAX->h qXprI}=(wWsRS+8!GgFx(1H*|>)`yP{9O?&}z~JfX=d#Wzp$Py%F#WAE}PI3YR6C+zmL$FKa%@ZdWjxY#v@gy8-WYl`ZAX->h qXprI}=(wWsRS+8!GmrNMMuwwPSr4X~T-E`az~JfX=d#Wzp$PyIl{lLK literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/gnome/tree_expand_first.png b/htdocs/phplayersmenu/gnome/tree_expand_first.png new file mode 100644 index 0000000000000000000000000000000000000000..034b88ec60162b057faf10b971430d3369c01fd9 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDgFST5ZC|z|IeO1yQQV2uC5L! z_ISgNdq9e@B*-tA!Qt7BG!Q4r+uensgH_f8$l)yTh%9Dc;1&d7#`=`_i9kX25>H=O z_RFkHLRws_x-WhL3YmDiIEGZrNlsAU)zFrflx&btaB5`qu`qCOm06&qr^naUqoKrM n8W4NRA%Vd#h~co1h#~nl_fV<=77|x@|t9R987Vm#sd;NbIcxc@o_D9Z_Zdjn2SkHH6|R{*js19!+W+(Fg& zc{chAw4gD=!9GPXYO=Z`5njG{#lpfos)oBIwT8K2s#Nua&CR#$?CdtBjmIT(`3+X? z-=j6@>C-2WRUG~}LPSxWO%X+6B#KasMl+9=m+$)e#u`;!V&<4B5{04|qpFzMZ__QQ zb4Sf)pgiwpAx@Z-W7HJYM!K4zW|%bZR24DBM2RBAD41RVxf?MCLadPlF*U>zFqI~4 zdD4^@B_b*_keO506;)Lu+GJ@JG=YYyOp`P|2_j9|EvRE|ofsn_glR^#7G$VMT3bpY z(*tn#44BJ-o{IEC2-J0z0%xF$>RPi!3{h!*1+y-2GY5L2+7B@hLQK-FF|~#2?8H=U zswT@a%&Y?}iM#jG&1cIp_sFsL_!45o0_k@$SKcf5Dr-!J8NTHF7jD z7{LPsfv_=)?81PsGcaFWRUT$$MdQJP2Ro^Bb-L@V_pNjl{BO$xxHx&?;q>&imm&@@ z3^0SG#nn%r7ZzXq4UiAeJl>eTefR3UG)plvObs<<=tSez#Kh@w-}h4hGo#v74a{h_ zJB!Q9E3bTjG|lLAdVJqKpy3}Y85ymi(dN|D_|rk~Ac-JONVAabV5<$3Kv_n&yUmlw z&zPB+!OWPQon>ihiF&<`=N0r-4Kqcxu=)9qoIf{tvc3N8kq^}3!{k)2yTjVr8gp}V zL{Y?-l|}A9xIvo4)7$(kvgh^h$5o&_Y>3vRYRPh zQr>9+RLP5zgfNT(-^}{EyWg|nk!Di{S+xi(ABza$N)T5vat`MlVL#&VFb;hn==HV^ z&zv1=R&1n{;atx3C4!-E`9A82fD_O`^yhxJxvV@JkOKR_UiF|}2GoyEg+KVePYweFaQ|!`{QyH-EV!w(V`=~Z002ov JPDHLkV1l0>O1c05 literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/gnome/tree_leaf.png b/htdocs/phplayersmenu/gnome/tree_leaf.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d1f13fc640236a6f7d00928f0b07a606ee9739 GIT binary patch literal 1041 zcmV+s1n&EZP)9Ay;7fA7rf>`XTMk)-Wz%(hKQv8`5Hdm(Lu_Nv!{Uw9+xogfI}ji?Cz z2kND_UJ5}_5L60cYYS~^K}ni6{mABPvtQZS&CJd_^S(1)xRJEEX)CyVrl2`(K?2F#FbrqU5CS&%Sv2%h{JMWJ|>& zy-?8)6;h|fI$_kwU>YU|DrKWQ`P9tqg@r2i=&#%LnglQaMnrtPTG{{cx%0D`5!a>Z z`2>+dVG^f;NT;Mgf*?|wa=FZzv*%wQ9nHP+$c&66diCU~(}#3waJyC~)B?xJVp=Im zCpczG&kyN%JE&NZ&$&#`95*Xd)%Wg>PtFCM%^eG1e0<_!H_+mr~VksWafB8_31 zBuTh@4dv%1;JB`PZJwk8&rSB%o(ItQmJOzz9G-tuT|_YsDHAyN+R%Oiw9 zMln)G*qIEg>s!>D9V1DUy<5l*f}pc>zecH;C+Ajqx_W@cha0SIb%~W?uHL{T<%MTw zaGflXQY_qFrtfXXItm>iV*t)hYvXUsXG(VKAeue6=t(E=r{$ckbTf&T@@VO2SYg!vS{2q%>CK z%H?a^|Lga*?AEVBIuF#$-F?!bZ-xEs%6MgJ!X3?vKd;Wy^8;iU{)fSUp6AhS*137< z$8OMkaE&y%0?Y#~F}$}Ta1tS2&W;o=P8>dQO4(zDj9V}?NMQuI!hYn1v)PS~ujE l0fl%xT^vIy<|HR5umgE!42;`KcIpCI44$rjF6*2UngHK-BHI7} literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/gnome/tree_split.png b/htdocs/phplayersmenu/gnome/tree_split.png new file mode 100644 index 0000000000000000000000000000000000000000..1a49fab4550598ae110fe90c7fb77c4b098a911f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQfvV}A+G=b|DQd3cHo=2ML-e8 zk|4ie28U-i(mXH28NnYmWOM7ZafF-WbkzLb6Mw<&;$TqC^qE) literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/gorilla/tree_collapse_corner.png b/htdocs/phplayersmenu/gorilla/tree_collapse_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..b3328adcc2ab423fed5cc45a7105588b19028efe GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDgFST5ZC|z|IeO1yQQV2uC5L! z_ISgNdq9e@B*-tA!Qt7BG!Q4r+uensgH_f8$l)yTh%9Dc;1&X5#!GkW{s0BpOFVsD z*)KD(2{CDAe0I$R3h8;eIEGZrNlsv3Vq`062zH6QdEx}a5e7jno&YA_BS()OoFKSg iDpkSYzy=m+28PP1EC&ljIDP?jGI+ZBxvXH=O z_RFkHLK;RJ_H(}j3h8*dIEGZrNlsAU)zFrflx&btaB5`qTF|*;hlPaEqwvK%ENlYG ftOh!cf{YAFt}Gkl=B@Vz>SOS9^>bP0l+XkK0535l literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/gorilla/tree_corner.png b/htdocs/phplayersmenu/gorilla/tree_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..541c5b3bafea8a3e2599b173cd5b56d7887ca711 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQfvV}A+G=b|DQd3cHo=2ML-e8 zk|4ie28U-i(myGkCiCxvXF#WAE}PI3YR6C+zmL$FKa%@ZdWjxY#v@gy8-WYl`ZAX->h qXprI}=(wWsRS+8!GgFx(1H*|>)`yP{9O?&}z~JfX=d#Wzp$Py%F#WAE}PI3YR6C+zmL$FKa%@ZdWjxY#v@gy8-WYl`ZAX->h qXprI}=(wWsRS+8!GmrNMMuwwPSr4X~T-E`az~JfX=d#Wzp$PyIl{lLK literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/gorilla/tree_expand_first.png b/htdocs/phplayersmenu/gorilla/tree_expand_first.png new file mode 100644 index 0000000000000000000000000000000000000000..034b88ec60162b057faf10b971430d3369c01fd9 GIT binary patch literal 202 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 X>7E2+=HOYP00000NkvXXu0mjf{n0D0 literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/gorilla/tree_space.png b/htdocs/phplayersmenu/gorilla/tree_space.png new file mode 100644 index 0000000000000000000000000000000000000000..fbdfa6a8e1e456ea42a1d39969b15e295a06cc75 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQp^E9A+G=b|6hJY`UH^6SQ6wH z%;50sMjD8d?NMQuI!hYn1v)PS~ujE l0fl%xT^vIy<|HR5umgE!42;`KcIpCI44$rjF6*2UngHK-BHI7} literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/gorilla/tree_split.png b/htdocs/phplayersmenu/gorilla/tree_split.png new file mode 100644 index 0000000000000000000000000000000000000000..1a49fab4550598ae110fe90c7fb77c4b098a911f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQfvV}A+G=b|DQd3cHo=2ML-e8 zk|4ie28U-i(m -1) { + nodeLayer.src = "{img_collapse}"; + } else if (nodeLayer.src.indexOf("{img_expand_first}") > -1) { + nodeLayer.src = "{img_collapse_first}"; + } else { + nodeLayer.src = "{img_collapse_corner}"; + } + folderLayer.src = "{img_folder_open}"; + expand[nodeid] = 1; + collapse[nodeid] = 0; + } else { + sonLayer.style.display = "none"; + if (nodeLayer.src.indexOf("{img_collapse}") > -1) { + nodeLayer.src = "{img_expand}"; + } else if (nodeLayer.src.indexOf("{img_collapse_first}") > -1) { + nodeLayer.src = "{img_expand_first}"; + } else { + nodeLayer.src = "{img_expand_corner}"; + } + folderLayer.src = "{img_folder_closed}"; + expand[nodeid] = 0; + collapse[nodeid] = 1; + } + saveExpandString(); + saveCollapseString(); +} + diff --git a/htdocs/phplayersmenu/lush/style.css b/htdocs/phplayersmenu/lush/style.css new file mode 100644 index 0000000..e69de29 diff --git a/htdocs/phplayersmenu/lush/tree_collapse.png b/htdocs/phplayersmenu/lush/tree_collapse.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9be7591474dec5e8badf0d285f8f38007dd5fc GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDgFST5ZC|z|IeO1yQQV2uC5L! z_ISgNdq9e@B*-tA!Qt7BG!Q4r+uensgH_f8$l)yTh%9Dc;1&X5#!GkW{s0BpOFVsD z*)KD(2{8%X{ISLpD5U4<;uumfCpm$EiIJ_OA=oAI=7|#wM;HXTcmkMwj~qREaDw1| isZ<36g#>XH28NnYmWOM7ZafF-WbkzLb6Mw<&;$TqC^qE) literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/lush/tree_collapse_corner.png b/htdocs/phplayersmenu/lush/tree_collapse_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..b3328adcc2ab423fed5cc45a7105588b19028efe GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDgFST5ZC|z|IeO1yQQV2uC5L! z_ISgNdq9e@B*-tA!Qt7BG!Q4r+uensgH_f8$l)yTh%9Dc;1&X5#!GkW{s0BpOFVsD z*)KD(2{CDAe0I$R3h8;eIEGZrNlsv3Vq`062zH6QdEx}a5e7jno&YA_BS()OoFKSg iDpkSYzy=m+28PP1EC&ljIDP?jGI+ZBxvXH=O z_RFkHLK;RJ_H(}j3h8*dIEGZrNlsAU)zFrflx&btaB5`qTF|*;hlPaEqwvK%ENlYG ftOh!cf{YAFt}Gkl=B@Vz>SOS9^>bP0l+XkK0535l literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/lush/tree_corner.png b/htdocs/phplayersmenu/lush/tree_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..541c5b3bafea8a3e2599b173cd5b56d7887ca711 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQfvV}A+G=b|DQd3cHo=2ML-e8 zk|4ie28U-i(myGkCiCxvXF#WAE}PI3YR6C+zmL$FKa%@ZdWjxY#v@gy8-WYl`ZAX->h qXprI}=(wWsRS+8!GgFx(1H*|>)`yP{9O?&}z~JfX=d#Wzp$Py%F#WAE}PI3YR6C+zmL$FKa%@ZdWjxY#v@gy8-WYl`ZAX->h qXprI}=(wWsRS+8!GmrNMMuwwPSr4X~T-E`az~JfX=d#Wzp$PyIl{lLK literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/lush/tree_expand_first.png b/htdocs/phplayersmenu/lush/tree_expand_first.png new file mode 100644 index 0000000000000000000000000000000000000000..034b88ec60162b057faf10b971430d3369c01fd9 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDgFST5ZC|z|IeO1yQQV2uC5L! z_ISgNdq9e@B*-tA!Qt7BG!Q4r+uensgH_f8$l)yTh%9Dc;1&d7#`=`_i9kX25>H=O z_RFkHLRws_x-WhL3YmDiIEGZrNlsAU)zFrflx&btaB5`qu`qCOm06&qr^naUqoKrM n8W4NRA%Vd#h~co1h#)`PWJv|4Y1;LRMwUJ3>2f8f1>M_U9D@o34} zo8sA%ASGgGn_AmLC8lO$l*S}YyJ=?TdDz{Unu}gMxbWr8gMFX<&f7Nw|Lvoq#ps36 ziK*$Sht^s%e}DdNylS`e>VkbKpXeAN@L>Pfzmm(<6U^d0S+ZgZ4=m(KXsXXl^{ zC}K*Zl_I8MXruo_b5CvqZ**oQ^J=G5YT1DtT1%J!&SLCI&yWCyVT87x?eHfHZrC%024<`;6IdOrEn7~boBP*7XGsApY-|_*k2?9Q?t*-7{f<832B7uX3 z`{gFehtG|WTiz%}eqp_D>ys~L{t<7biGq+Kd$vbr&jyl%QW`<*T6Wity+e&59kMa!w*DKzYVbsWkOYf koj*B`8t4Mz|Ku9^2|mPk1j0?Lng9R*07*qoM6N<$f}pq}z5oCK literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/lush/tree_folder_open.png b/htdocs/phplayersmenu/lush/tree_folder_open.png new file mode 100644 index 0000000000000000000000000000000000000000..c2cf11320793e40604686ea6bb7360963b1ad32a GIT binary patch literal 708 zcmV;#0z3VQP)f{&15o{-EQ|@sZ`p_=kq(MRLWf}7C+W%wPhgE5(-`q-W(1M zKeKJSG5L7%fn`|1cM59qgMn>+LvCpxjr7R9PL?94a zAcaH-fpj1c7#K(-{$4*@xh*Wq!sGD}i9{6eS|$_8cZEU$aI*hlXa{{)`zV*oD5Y3h zTG|2f68M_lOk0}Mp-w^ntpV28*GVK2q*AF5I1f!Sk^CaGKxu`o?Niy%jTW!;`iRHl zM59rFg_h9#tND4M&MxFR*GZlV@0TM0pISn()!5tYb{3`8FJkS%?Q1O*7kV#|IoLe{ zvMnKCb1lABJ1KPXMD4ym7@&Gk{szZC)D&W6d1Y1UpATwd)A$W+Z1%e(rR?rOGu~`E zbI<1D&UdON&ew{zO<7dQFw?-pMp&2Zu`l&Of5(4;=YrG&>WJ z65e{em;H@Nq?Y(v5p`XfYHN6^?O|>#JjA7`A2F_pMC)q4%fd4NHo&Qi?_H1~t2bR- z;+@02L>-&yOq!h!#L>pAHyUjW^^qvGfiRPqIULt%b$j;B7Dpx~1b`a~zCM+o=V^05Osqbt=r3sT~87T2G<2fZmd0DSmw9+Kd4Fxp8pkq09aXB z?z1W~SN5x%zdA&FLz35eP7(`8w&bu_t#Enb28*R-bh$c5)jz)}A`JsCJt4!vF(ZT( za$Ncj9j7bVLOc}4*NSv8&-mRm-%gE_DX*ZV)K0n5dGEr|)RxfJ54?O#?r^?VjuR7> zz_lGB0T-nV!iJJxr6PT7UuGTOKb;#G`uV!-W(SAmw*Tl~Qde2lE5ewx1=q5J!`}VazW`I3o(B8U(&PXD002ovPDHLkV1gI? B)OY{@ literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/lush/tree_space.png b/htdocs/phplayersmenu/lush/tree_space.png new file mode 100644 index 0000000000000000000000000000000000000000..fbdfa6a8e1e456ea42a1d39969b15e295a06cc75 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQp^E9A+G=b|6hJY`UH^6SQ6wH z%;50sMjD8d?NMQuI!hYn1v)PS~ujE l0fl%xT^vIy<|HR5umgE!42;`KcIpCI44$rjF6*2UngHK-BHI7} literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/lush/tree_split.png b/htdocs/phplayersmenu/lush/tree_split.png new file mode 100644 index 0000000000000000000000000000000000000000..1a49fab4550598ae110fe90c7fb77c4b098a911f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQfvV}A+G=b|DQd3cHo=2ML-e8 zk|4ie28U-i(mXH28NnYmWOM7ZafF-WbkzLb6Mw<&;$TqC^qE) literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/mozilla/tree_collapse_corner.png b/htdocs/phplayersmenu/mozilla/tree_collapse_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..b3328adcc2ab423fed5cc45a7105588b19028efe GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDgFST5ZC|z|IeO1yQQV2uC5L! z_ISgNdq9e@B*-tA!Qt7BG!Q4r+uensgH_f8$l)yTh%9Dc;1&X5#!GkW{s0BpOFVsD z*)KD(2{CDAe0I$R3h8;eIEGZrNlsv3Vq`062zH6QdEx}a5e7jno&YA_BS()OoFKSg iDpkSYzy=m+28PP1EC&ljIDP?jGI+ZBxvXH=O z_RFkHLK;RJ_H(}j3h8*dIEGZrNlsAU)zFrflx&btaB5`qTF|*;hlPaEqwvK%ENlYG ftOh!cf{YAFt}Gkl=B@Vz>SOS9^>bP0l+XkK0535l literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/mozilla/tree_corner.png b/htdocs/phplayersmenu/mozilla/tree_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..541c5b3bafea8a3e2599b173cd5b56d7887ca711 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQfvV}A+G=b|DQd3cHo=2ML-e8 zk|4ie28U-i(myGkCiCxvXF#WAE}PI3YR6C+zmL$FKa%@ZdWjxY#v@gy8-WYl`ZAX->h qXprI}=(wWsRS+8!GgFx(1H*|>)`yP{9O?&}z~JfX=d#Wzp$Py%F#WAE}PI3YR6C+zmL$FKa%@ZdWjxY#v@gy8-WYl`ZAX->h qXprI}=(wWsRS+8!GmrNMMuwwPSr4X~T-E`az~JfX=d#Wzp$PyIl{lLK literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/mozilla/tree_expand_first.png b/htdocs/phplayersmenu/mozilla/tree_expand_first.png new file mode 100644 index 0000000000000000000000000000000000000000..034b88ec60162b057faf10b971430d3369c01fd9 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDgFST5ZC|z|IeO1yQQV2uC5L! z_ISgNdq9e@B*-tA!Qt7BG!Q4r+uensgH_f8$l)yTh%9Dc;1&d7#`=`_i9kX25>H=O z_RFkHLRws_x-WhL3YmDiIEGZrNlsAU)zFrflx&btaB5`qu`qCOm06&qr^naUqoKrM n8W4NRA%Vd#h~co1h#3p^r=85p>QK$!8; z-MT+OLG}_)Usv|aOl(3T92QIuo&be{JY5_^D&{07I575b1+*DVIhY}&!68^+XqKAb z;jL{_Sjd@>@OqBkn@5jM9hhJ!%(9GGa;icATZ#{RVw&)78&qol`;+0GE79%K!iX literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/mozilla/tree_folder_open.png b/htdocs/phplayersmenu/mozilla/tree_folder_open.png new file mode 100644 index 0000000000000000000000000000000000000000..4190b969845fba00d0ac6ca0c5a889818eebbeea GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDa8Pv5ZC`8a0bXTo;j1Dp+QMW zDJ|^`P-y1N{|62nICJLzF{Y2Ffzpg6L4Lsu4$p3+fjCLt?k)@+tg;?J4rhT!WHAE+ zw-5+3Ub*oF%FT1tLu>VJeJQnH(d+g`BG_ z1$>ygHk39sh)pnLW@(xvAz|dGwAPD9;A*CWpqi>dgEc2Zp{e4eYkN}4fi^REy85}S Ib4q9e0B@C3i2wiq literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/mozilla/tree_leaf.png b/htdocs/phplayersmenu/mozilla/tree_leaf.png new file mode 100644 index 0000000000000000000000000000000000000000..6f999fba427b8c3f54b5bb6fea272b44eb821bb3 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp!VDxAh&o3CDgFST5ZC|z|1$tlLjzEtp`pPo z#jzL2Vk`;r3ubV5b|VeMN%D4gVd!9$^#F1>3p^r=85p>QK$!8;-MT+OLG}_)Usv|a zOl(4Oa%Pr$?SVp;o-U3d6?2jk99WqGW(9Jd5(o-v;L^}^WSuf4k%=vZOG4UOb2kHH qz=@MA9@Y$!=MuP17!*1d3Nj=-;}V*1`l>L{5C%_IKbLh*2~7aI8#Iyt literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/mozilla/tree_space.png b/htdocs/phplayersmenu/mozilla/tree_space.png new file mode 100644 index 0000000000000000000000000000000000000000..fbdfa6a8e1e456ea42a1d39969b15e295a06cc75 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQp^E9A+G=b|6hJY`UH^6SQ6wH z%;50sMjD8d?NMQuI!hYn1v)PS~ujE l0fl%xT^vIy<|HR5umgE!42;`KcIpCI44$rjF6*2UngHK-BHI7} literal 0 HcmV?d00001 diff --git a/htdocs/phplayersmenu/mozilla/tree_split.png b/htdocs/phplayersmenu/mozilla/tree_split.png new file mode 100644 index 0000000000000000000000000000000000000000..1a49fab4550598ae110fe90c7fb77c4b098a911f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRp$P6SizMjzpQfvV}A+G=b|DQd3cHo=2ML-e8 zk|4ie28U-i(mtoplevel; +$_SESSION['session']->doAuth($page); + +$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ""; +$myuid = $_SESSION['session']->uid; + +switch ($action) { +case "passwd": + if ($_SESSION['session']->auth == "native") { + $page->info(__("Changing password..")); + $newpass = $_REQUEST['newpass']; + $globals->db->query("update {$globals->tauth['native']} set password='$newpass' where user_id='$myuid'"); + } + break; +} + + +$page->assign('md5',$page->url('md5.js')); +$page->assign('native',$_SESSION['session']->auth == "native"); +$page->assign('username',$_SESSION['session']->username); +$page->assign('fullname',$_SESSION['session']->fullname); +$page->assign('langs', $globals->locales); + +$page->assign('page', __("User preferences")); +$page->assign('greeting', __("Diogenes preferences")); + +$page->assign('msg_myinfo' ,__("my information")); +$page->assign('msg_username' ,__("username")); +$page->assign('msg_fullname' ,__("full name")); + +$page->assign('msg_lang', __("language")); +$page->assign('msg_lang_blab', __("You can select your preferred language by clicking on the appropriate language below.")); + +$page->assign('msg_mypassword' ,__("my password")); +$page->assign('msg_password' ,__("new password")); +$page->assign('msg_confirmation' ,__("confirmation")); + +$page->assign('submit', __("Change")); + +$page->display("prefs.tpl"); +?> diff --git a/htdocs/site.php b/htdocs/site.php new file mode 100644 index 0000000..a8daf86 --- /dev/null +++ b/htdocs/site.php @@ -0,0 +1,35 @@ +webdav; + $server->ServeRequest(); + +} elseif (preg_match("/^\/([^\/]+)\/admin\/(.*)/",$_SERVER['PATH_INFO'],$tmp)) { + $afile = $tmp[2]; + if (preg_match("/^(ekitapplet|gnu-regexp-1.1.4|kafenio-config|kafenio-icons|kafenio)\.jar$/", $afile)) { + header("Content-Type: application/java-archive"); + header("Last-modified:".gmdate("D, d M Y H:i:s T", filemtime($afile))); + readfile($afile); + } else { + // include the requested admin page + if (!$afile) $afile = "index"; + require("admin/$afile.php"); + } + +} else { + + // post or get on a barrel file + require_once 'diogenes.common.inc.php'; + require_once 'diogenes.barrel.inc.php'; + $page = new $globals->barrel; + + if (!$globals->validatepages) + $page->assign("skipvalidator",1); + + $page->doContent(); + +} +?> diff --git a/htdocs/toplevel.css b/htdocs/toplevel.css new file mode 100644 index 0000000..91a0710 --- /dev/null +++ b/htdocs/toplevel.css @@ -0,0 +1,48 @@ +#header { + background-color: #787878; + background-image: url(images/banner.png); + background-repeat: no-repeat; + background-attachment: scroll; + height: 55px; + background-position: right; + margin:0; padding:0; + border-bottom: 1px solid black; +} + +#header .logo { + height: 55px; + background-image: url(images/barrel.gif); + background-repeat: no-repeat; + background-position: center; + margin:0; +} + +#header .titlebar { + padding: 10px; +} + +.menu a { + background-image: url(images/menu-back.gif); + background-position: right bottom; + background-repeat: no-repeat; +} + +.logevents { + font-weight: bold; + font-size: 9pt; + text-align: right; +} + +.logmain { + font-weight: bold; + font-size: 9pt; +} + +.center { + text-align: center; +} + +.auth { + font-weight: bold; + font-size: 9pt; +} diff --git a/htdocs/toplevel/accounts.php b/htdocs/toplevel/accounts.php new file mode 100644 index 0000000..e6a5167 --- /dev/null +++ b/htdocs/toplevel/accounts.php @@ -0,0 +1,22 @@ +toplevel(true); +$page->assign('greeting',__("User accounts")); + +$editor = new DiogenesTableEditor("diogenes_auth","user_id"); + +$editor->add_join_table("diogenes_perm","uid",true); + +$editor->describe("username", __("username"), true); +$editor->describe("firstname", __("first name"), true); +$editor->describe("lastname", __("last name"), true); +$editor->describe("password", __("password"), false, "password"); +$editor->describe("perms", __("permissions"), true, "set"); + +$editor->addAction(__("view log"), "logger.php?logauth=native&loguser=%username%"); +$editor->run($page,'page_content'); +$page->display(''); +?> diff --git a/htdocs/toplevel/admins.php b/htdocs/toplevel/admins.php new file mode 100644 index 0000000..6843645 --- /dev/null +++ b/htdocs/toplevel/admins.php @@ -0,0 +1,68 @@ +toplevel(true); +$page->assign('post',$page->script_self()); +$page->assign('greeting', __("Site administrators")); +$page->assign('msg_site',__("site")); +$page->assign('msg_admin',__("administrator")); +$page->assign('msg_actions',__("actions")); + +$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ""; +switch($action) { +case "add": + if (isset($_REQUEST['target']) && isset($_REQUEST['auth']) && isset($_REQUEST['username'])) { + $auth = $_REQUEST['auth']; + if ($uid = call_user_func(array($globals->session,'getUserId'),$auth,$_REQUEST['username'])) + $globals->db->query("replace into diogenes_perm set alias='{$_REQUEST['target']}',auth='$auth',uid='$uid',perms='admin'"); + else + $page->info(__("Could not find requested user")." '{$_REQUEST['username']}'"); + } + break; + +case "demote": + if (isset($_REQUEST['target']) && isset($_REQUEST['uid'])) + $globals->db->query("replace into diogenes_perm set alias='{$_REQUEST['target']}',auth='{$_REQUEST['auth']}',uid='{$_REQUEST['uid']}',perms='user'"); + break; + +case "remove": + if (isset($_REQUEST['target']) && isset($_REQUEST['uid'])) + $globals->db->query("delete from diogenes_perm where alias='{$_REQUEST['target']}' and auth='{$_REQUEST['auth']}' and uid='{$_REQUEST['uid']}'"); + break; +} + +// add alias/username entries +$odd = false; +$res = $globals->db->query("select s.alias,s.vhost,auth,uid from diogenes_perm as p". + " left join diogenes_site as s on s.alias=p.alias". + " where p.perms='admin' order by alias,auth"); +while (list($target,$vhost,$auth,$uid) = mysql_fetch_row($res)) { + $username = call_user_func(array($globals->session,'getUsername'),$auth,$uid); + $actions = array( + array(__("site users"), $page->urlBarrel($target,$vhost,"admin/users")), + array(__("demote to user"),"?action=demote&target=$target&auth=$auth&uid=$uid"), + array(__("remove"),"?action=remove&target=$target&auth=$auth&uid=$uid"), + array(__("view log"),"logger.php?logauth=$auth&loguser=$username") + + ); + $page->append('entries',array($odd ? "odd" : "even",$target,$globals->tlabel[$auth],$username,$actions)); + $odd = !$odd; +} +mysql_free_result($res); + +// add the sites +$res = $globals->db->query("select alias from diogenes_site"); +$sites = array(); +while (list($target) = mysql_fetch_row($res)) + $sites[$target]=$target; +$page->assign('sites', $sites); +mysql_free_result($res); + +// auth methods +foreach ($globals->tauth as $key=>$val) + $auths[$key]=$globals->tlabel[$key]; +$page->assign('auths',$auths); + +$page->display('toplevel-admins.tpl'); +?> diff --git a/htdocs/toplevel/boot.php b/htdocs/toplevel/boot.php new file mode 100644 index 0000000..825e616 --- /dev/null +++ b/htdocs/toplevel/boot.php @@ -0,0 +1,50 @@ +toplevel(false); +$page->assign('greeting',__("Initial setup")); + +// check we are using native Diogenes authentication +if ((count($globals->tauth) != 1) or empty($globals->tauth["native"])) { + $page->assign('page_content', __("Sorry, this feature is only available using native Diogenes authentication.")); + $page->display(''); + exit; +} + +// check there are currently no admins +$res = $globals->db->query("select username from {$globals->tauth["native"]} where perms='admin'"); +if (list($username) = mysql_fetch_row($res)) { + $page->assign('page_content', __("The database is already configured.")); + $page->display(''); + exit; +} + +$editor = new DiogenesTableEditor("diogenes_auth","user_id"); + +$editor->add_join_table("diogenes_perm","uid",true); + +$editor->describe("username", __("username"), true); +$editor->describe("firstname", __("first name"), true); +$editor->describe("lastname", __("last name"), true); +$editor->describe("password", __("password"), false, "password"); +$editor->describe("perms", __("permissions"), true, "set"); + +$editor->lock("username", "root"); +$editor->lock("perms", "admin"); +if (empty($_REQUEST['action']) or ($_REQUEST['action'] != 'update')) +{ + $_REQUEST['action'] = 'edit'; +} + +$editor->run($page,'page_content'); + +// check if we have completed initial setup +$res = $globals->db->query("select username from {$globals->tauth["native"]} where perms='admin'"); +if (list($username) = mysql_fetch_row($res)) { + $page->assign('page_content', __("The initial setup of the database was performed successfuly.")); +} + +$page->display(''); +?> diff --git a/htdocs/toplevel/index.php b/htdocs/toplevel/index.php new file mode 100644 index 0000000..d9eac03 --- /dev/null +++ b/htdocs/toplevel/index.php @@ -0,0 +1,18 @@ +toplevel(true); + +$editor = new Diogenes_Barrel_Editor(); +$editor->run($page, 'sites_content'); + +if (!$globals->checkRootUrl()) +{ + $page->assign('msg_information', __('Warning : in order to make use of virtual hosts or WebDAV, you need to set $globals->rooturl to a full URL starting with http:// or https:// in your Diogenes configuration file.')); +} + +$page->assign('greeting',__("List of sites")); +$page->display('toplevel-sites.tpl'); +?> diff --git a/htdocs/toplevel/logger.php b/htdocs/toplevel/logger.php new file mode 100644 index 0000000..a061552 --- /dev/null +++ b/htdocs/toplevel/logger.php @@ -0,0 +1,12 @@ +toplevel(true); +$page->assign('greeting', __("User activity log")); + +$logview = new DiogenesLoggerView; +$logview->run($page,'page_content'); +$page->display(''); +?> diff --git a/htdocs/toplevel/logger_actions.php b/htdocs/toplevel/logger_actions.php new file mode 100644 index 0000000..cf39e36 --- /dev/null +++ b/htdocs/toplevel/logger_actions.php @@ -0,0 +1,19 @@ +toplevel(true); +$page->assign("greeting",__("Logger actions")); + +// set up the editor +$editor = new DiogenesTableEditor($globals->table_log_actions,"id"); +$editor->add_join_table($globals->table_log_events,"action",true); +$editor->describe("text", __("title"), true); +$editor->describe("description", __("description"), true); + +// run the editor +$editor->run($page,'page_content'); +$page->display(''); +?> diff --git a/htdocs/toplevel/options.php b/htdocs/toplevel/options.php new file mode 100644 index 0000000..15e4a33 --- /dev/null +++ b/htdocs/toplevel/options.php @@ -0,0 +1,69 @@ +toplevel(true); + +$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ""; + +switch ($action) { +case "options": + $globals->updateOption("menu_style", $_REQUEST['menu_style']); + if (isset($_REQUEST['menu_theme'])) + $globals->updateOption("menu_theme", $_REQUEST['menu_theme']); + $globals->updateOption("template_dir", $_REQUEST['template_dir']); + $globals->updateOption("template", $_REQUEST['template']); + $globals->updateOption("html_editor", $_REQUEST['html_editor']); + $globals->updateOption("word_import", $_REQUEST['word_import']); + $globals->updateOption("debugdatabase", $_REQUEST['debugdatabase'] ? 1 : 0); + $globals->updateOption("debugplugins", $_REQUEST['debugplugins'] ? 1 : 0); + $globals->updateOption("validatepages", $_REQUEST['validatepages'] ? 1 : 0); + break; +} + + +// fill out values +$page->assign('menu_styles', $globals->menu_styles); +$page->assign('menu_style', $globals->menu_style); +if ($globals->menu_style == 1 || $globals->menu_style == 2) { + $page->assign('menu_themes', $globals->menu_themes); + $page->assign('menu_theme', $globals->menu_theme); +} +$page->assign('template_dir', $globals->template_dir); +$page->assign('template', $globals->template); +$page->assign('templates', $page->getTemplates()); + +$page->assign('validatepages', $globals->validatepages); + +$page->assign('html_editors', $globals->html_editors); +$page->assign('html_editor', $globals->html_editor); + +$page->assign('word_imports', $globals->word_imports); +$page->assign('word_import', $globals->word_import); + +$page->assign('debugdatabase', $globals->debugdatabase); +$page->assign('debugplugins', $globals->debugplugins); + +// translations +$page->assign('greeting', __("Global options")); +$page->toolbar(__("Mode"), array( __("standard"), array(__("expert"), "options_expert.php"))); +$page->assign('msg_display_options', __("display options")); +$page->assign('msg_menu_style', __("menu style")); +$page->assign('msg_menu_theme', __("menu theme")); +$page->assign('msg_site_template_dir', __("templates directory")); +$page->assign('msg_site_template', __("default template")); +$page->assign('msg_validate_pages', __("display W3C validator links for barrel pages")); +$page->assign('msg_system_options', __("system options")); +$page->assign('msg_html_editor', __("HTML editor")); +$page->assign('msg_word_import', __("Word document import")); +$page->assign('msg_debug_options', __("debugging options")); +$page->assign('msg_debug_database', __("debug database")); +$page->assign('msg_debug_plugins', __("debug plugins")); +$page->assign('msg_submit', __("Submit")); + +$page->display('toplevel-options.tpl'); + +?> diff --git a/htdocs/toplevel/options_expert.php b/htdocs/toplevel/options_expert.php new file mode 100644 index 0000000..cd46dc8 --- /dev/null +++ b/htdocs/toplevel/options_expert.php @@ -0,0 +1,84 @@ +toplevel(true); +$page->assign("greeting",__("Global options")); +$page->toolbar(__("Mode"), array( array( __("standard"), "options.php" ), __("expert"))); + +$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ""; + +switch ($action) { +case "cvs-rcs": + $page->info("converting spool from CVS to RCS.."); + $res = $globals->db->query("select alias from diogenes_site"); + while(list($site) = mysql_fetch_row($res)) { + $page->info("processing '$site'.."); + $spool = new DiogenesSpool($page,$site); + $page->info("-> deleting 'CVS' subdirectories from spool.."); + $goners = System::find($spool->datadir.' -type d'); + foreach($goners as $goner) { + if (basename($goner) == "CVS") + System::rm("-r $goner"); + } + $page->info("-> changing files in spool to read-only.."); + $modfiles = System::find($spool->datadir.' -type f'); + foreach($modfiles as $modfile) { + chmod($modfile,0444); + } + } + $globals->updateOption("rcs","DiogenesRcs"); + break; + +case "rcs-cvs": + $page->info("converting spool from RCS to CVS.."); + if (!is_dir("{$globals->rcsroot}/CVSROOT")) { + $page->info("-> no CVSROOT not found, running init.."); + if ($ret = shell_exec(escapeshellcmd("cvs -d".escapeshellarg($globals->rcsroot)." init"))) + $page->info($ret); + } + + // remove current spool dirs and do a clean checkout of each site + $res = $globals->db->query("select alias from diogenes_site"); + while(list($site) = mysql_fetch_row($res)) { + $page->info("processing '$site'.."); + $page->info("-> removing '{$globals->spoolroot}/$site'.."); + System::rm("-r {$globals->spoolroot}/$site"); + $page->info("-> doing a checkout of module '$site'.."); + $spool = new DiogenesCvs($page,$site,$_SESSION['session']->username,true); + } + $globals->updateOption("rcs","DiogenesCvs"); + break; +} + +$page->assign('msg_convert',__("Convert")); +$page->assign('msg_vcs',__("version control system")); + +switch ($globals->rcs) { +case "DiogenesRcs": + $page->assign('msg_current_vcs',__("You are currently using RCS as the version control system for your barrels.")); + $page->append('conversions',array("rcs-cvs", __("You can switch to a full CVS repository by clicking here."))); + break; + +case "DiogenesCvs": + $page->assign('msg_current_vcs',__("You are currently using CVS as the version control system for your barrels.")); + $page->append('conversions',array("cvs-rcs", __("You can switch back to RCS by clicking here."))); + break; +} + + +// set up the editor +$editor = new DiogenesTableEditor($globals->table_global_options,"name",true); +$editor->add_where_condition("barrel=''"); +$editor->hide('barrel', ''); +$editor->describe("name", __("option"), false); +$editor->describe("value", __("value"), true); + +// run the editor +$editor->table_style = "width:80%"; +$editor->run($page,'editor_content'); + +$page->display('toplevel-options_expert.tpl'); +?> diff --git a/htdocs/toplevel/plugins.php b/htdocs/toplevel/plugins.php new file mode 100644 index 0000000..c874d4d --- /dev/null +++ b/htdocs/toplevel/plugins.php @@ -0,0 +1,60 @@ +toplevel(true); +$page->assign('post',$page->script_self()); + +$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; +$barrel = isset($_REQUEST['plug_barrel']) ? $_REQUEST['plug_barrel'] : ''; + +if ($action == "clean") +{ + $globals->plugins->clean_database($page); +} + +if ($barrel) +{ + $page->assign('greeting',__("Barrel plugins") . " - $barrel"); +} else { + $page->assign('greeting',__("Global plugin settings")); +} + +/* plugin editor */ +$editor = new Diogenes_Plugin_Editor($barrel, 0); +$editor->hide_params(1); +$editor->run($page,'editor_content'); + +// if necessary, rebuild site plugin caches +if ($action == "update" && !$barrel) +{ + $res = $globals->db->query("select alias,flags from diogenes_site"); + while (list($p_alias, $p_flags) = mysql_fetch_row($res)) + { + $flags = new flagset($p_flags); + if ($p_alias && $flags->hasFlag('plug')) + { + $page->info(sprintf( __("Rebuilding plugin cache for barrel '%s'"), $p_alias)); + $cachefile = $globals->plugins->cacheFile($p_alias); + $globals->plugins->compileCache($cachefile, $p_alias); + } + } + mysql_free_result($res); +} + +// translations +$page->assign('msg_clean_database', __('Clean plugins database')); +$page->assign('msg_clean_database_text', __("If you are having problems with references to plugins that no longer exist, you can have Diogenes remove such entries from the database.")); +$page->assign('msg_clean', __("Clean")); + +$page->assign('msg_enable_disable', __('Enable or disable plugins')); +if ($barrel) +{ + $page->assign('msg_enable_disable_text', __("You can select the plugins you want to enable for this barrel.")); +} else { + $page->assign('msg_enable_disable_text', __("You can select the plugins you want to enable or disable globally, that is the plugins that can be used in the different barrels. Please note that for a plugin to be accessible from a barrel, you will need to activate that plugin for the barrel. To do this, from the List of sites click on 'plugins' next to the barrel of your choice.")); +} +$page->display('toplevel-plugins.tpl'); + +?> diff --git a/include/Barrel.php b/include/Barrel.php new file mode 100644 index 0000000..cc41014 --- /dev/null +++ b/include/Barrel.php @@ -0,0 +1,387 @@ +db->query("select alias,vhost,flags from diogenes_site where alias='$alias'"); + if (!list($this->alias,$this->vhost,$flags) = mysql_fetch_row($res)) { + return; + } + mysql_free_result($res); + + $this->table_menu = "{$this->alias}_menu"; + $this->table_page = "{$this->alias}_page"; + $this->treeCacheFile = $globals->spoolroot."/diogenes_c/". $this->alias.".tree"; + $this->pluginsCacheFile = $globals->plugins->cacheFile($this->alias); + + $this->flags = new flagset($flags); + $this->options = new Diogenes_Barrel_Options($this->alias); + $this->spool = new DiogenesSpool($this,$this->alias); + + $this->readTree(); + } + + + /** Create a new Diogenes barrel. This creates the database, RCS and + * spool entries for the new barrel. + * + * @param $alias + * @param $caller + */ + function create($alias, &$caller) + { + global $globals; + + /* sanity check */ + if (!preg_match("/^[a-zA-Z0-9_]+$/",$alias) or + in_array($alias, $globals->invalidaliases)) + { + $caller->info("Invalid barrel name!"); + return; + } + + $res = $globals->db->query("select alias from diogenes_site where alias='$alias'"); + if (mysql_num_rows($res) > 0) { + $caller->info("Entry '{$alias}' already exists in table 'diogenes_site'!"); + return; + } + + if (file_exists("{$globals->rcsroot}/$alias")) { + $caller->info("Directory '{$globals->rcsroot}/$alias' already exists!"); + return; + } + + if (!is_dir($globals->rcsroot) || !is_writable($globals->rcsroot)) { + $caller->info("Directory '{$globals->rcsroot}' is not writable!"); + return; + } + + /* log this event */ + $caller->log("barrel_create","$alias:*"); + + /* create DB entry */ + $globals->db->query("insert into diogenes_site set alias='$alias'"); + + $globals->db->query("CREATE TABLE {$alias}_menu (" + . "MID int(10) unsigned NOT NULL auto_increment," + . "MIDpere int(10) unsigned NOT NULL," + . "ordre int(10) unsigned NOT NULL," + . "title tinytext NOT NULL," + . "link text NOT NULL," + . "PID int(10) unsigned NOT NULL," + . "PRIMARY KEY (MID)" + . ") TYPE=MyISAM;"); + + $globals->db->query("CREATE TABLE {$alias}_page (" + . "PID int(10) unsigned NOT NULL auto_increment," + . "parent INT( 10 ) UNSIGNED NOT NULL default '0'," + . "location tinytext NOT NULL," + . "title tinytext NOT NULL," + . "status tinyint(1) unsigned NOT NULL default '0'," + . "perms enum('public','auth','user','admin','forbidden') NOT NULL default 'public'," + . "wperms enum('public','auth','user','admin','forbidden') NOT NULL default 'admin'," + . "template varchar(255) NOT NULL," + . "PRIMARY KEY (PID)" + . ") TYPE=MyISAM;"); + + /* set the barrel's title */ + $opt = new Diogenes_Barrel_Options($alias); + $opt->updateOption('title',$alias); + + /* create entry for the homepage */ + $globals->db->query("insert into {$alias}_page set location='temp'"); + $homepage = mysql_insert_id(); + $globals->db->query("update {$alias}_page set location='',title='Home',perms='public' where PID='$homepage'"); + + /* create home page & copy CSS template */ + $rcs = new $globals->rcs($caller,$alias,$_SESSION['session']->username,true); + $rcs->newdir("",$homepage); + $rcs->commit($homepage,$globals->htmlfile,""); + $rcs->commit($homepage,$globals->cssfile, + file_get_contents("{$globals->root}/{$globals->cssfile}") ); + } + + + /** Destroy a Diogenes barrel. This removes the related database, RCS + * and spool entries. + * + * @param $alias + * @param $caller + */ + function destroy($alias, &$caller) { + global $globals; + + /** Sanity check */ + if (!$alias) { + $caller->info("Empty alias supplied!"); + return; + } + + /* log this event */ + $caller->log("barrel_delete","$alias:*"); + + system(escapeshellcmd("rm -rf ".escapeshellarg("{$globals->spoolroot}/$alias"))); + system(escapeshellcmd("rm -rf ".escapeshellarg("{$globals->rcsroot}/$alias"))); + system(escapeshellcmd("rm -f ".escapeshellarg("{$globals->spoolroot}/diogenes_c/$alias.tree"))); + system(escapeshellcmd("rm -f ".escapeshellarg($globals->plugins->cacheFile($alias)))); + $globals->db->query("drop table {$alias}_menu"); + $globals->db->query("drop table {$alias}_page"); + $globals->db->query("delete from diogenes_perm where alias='$alias'"); + $globals->db->query("delete from diogenes_site where alias='$alias'"); + $globals->db->query("delete from diogenes_option where barrel='$alias'"); + $globals->db->query("delete from diogenes_plugin where barrel='$alias'"); + } + + + /** Return the location corresponding to a given page ID + * + * @param $PID + */ + function getLocation($PID) + { + return array_search($PID, $this->treeCache); + } + + + + /** Return all the barrel's pages. + */ + function getPages() + { + global $globals; + $bpages = array(); + + $res = $globals->db->query("select * from {$this->table_page}"); + while ($props = mysql_fetch_assoc($res)) { + $bpages[$props['PID']] = new Diogenes_Barrel_Page($this, $props); + } + mysql_free_result($res); + return $bpages; + } + + + /** Return the page ID matching a given directory location + * + * @param $dir + */ + function getPID($dir) + { + if (isset($this->treeCache[$dir])) + return $this->treeCache[$dir]; + else + return; + } + + + /** List the plugins that are active in a given context + * + * @param $page + */ + function getPlugins($page = 0) + { + $plugins = array(); + foreach ($this->pluginsCache as $plug) + { + if ($plug['page'] == $page) + { + array_push($plugins, $plug); + } + } + return $plugins; + } + + + /** Check whether the barrel has a given flag + * + * @param $flag + */ + function hasFlag($flag) + { + return $this->flags->hasFlag($flag); + } + + + /** Compile the directory tree + */ + function compileTree() + { + global $globals; + + if (!$fp = fopen($this->treeCacheFile, "w")) { + trigger_error("failed to open '{$this->treeCacheFile}' for writing", E_USER_ERROR); + return; + } + + // load all the pages + $res = $globals->db->query("select * from {$this->table_page}"); + $tpages = array(); + while ($props = mysql_fetch_assoc($res)) + { + $tpage = new Diogenes_Barrel_Page($this, $props); + $tpages[$props['PID']] = $tpage; + if (!strlen($props['location'])) + { + $homepage = $props['PID']; + } + } + + // recursively build the tree, starting at the homepage + $str = $this->compilePageTree($tpages, $homepage, ''); + fputs($fp, $str); + fclose($fp); + } + + + /** Compile a single page + */ + function compilePageTree(&$tpages, $PID, $ploc) + { + global $globals; + + $cpage = $tpages[$PID]; + $ploc = ($ploc ? "$ploc/" : "") . $cpage->props['location']; + + // add this page + $out = "$ploc\t$PID\t".$cpage->props['parent']."\n"; + + // add children + $res = $globals->db->query("select PID from {$this->table_page} where parent='$PID'"); + while (list($child) = mysql_fetch_row($res)) + { + $out .= $this->compilePageTree($tpages, $child, $ploc); + } + mysql_free_result($res); + return $out; + } + + + /** Load all plugins for the specified page. + * + * @param $bpage + */ + function loadPlugins(&$bpage) + { + global $globals; + + $plugins = $this->getPlugins($bpage->props['PID']); + + $loaded = array(); + foreach ($plugins as $plugentry) + { + $loaded[$plugentry['plugin']] =& $globals->plugins->load($plugentry); + } + return $loaded; + } + + + /** Read the compiled plugin cache + */ + function readPlugins() + { + global $globals; + + $this->pluginsCache = $globals->plugins->readCache($this->pluginsCacheFile, $this->alias); + } + + + /** Read the compiled directory tree + */ + function readTree() + { + global $globals; + + // if the tree cache does not exits, try to init it + if (!file_exists($this->treeCacheFile)) { + $this->compileTree(); + } + + if (!$fp = fopen($this->treeCacheFile, "r")) { + trigger_error("failed to open '{$this->treeCacheFile}' for reading", E_USER_ERROR); + return; + } + + $locations = array(); + while ($line = fgets($fp)) + { + $line = substr($line, 0, -1); + $bits = explode("\t", $line); + list($loc, $pid, $parent) = $bits; + $locations[$loc] = $pid; + } + fclose($fp); + + $this->treeCache = $locations; + } + +} diff --git a/include/Barrel/Editor.php b/include/Barrel/Editor.php new file mode 100644 index 0000000..de22864 --- /dev/null +++ b/include/Barrel/Editor.php @@ -0,0 +1,176 @@ +readonly) { + array_push($actions, array(__("edit"), "?action=edit&target={$barrel['alias']}")); + } + array_push($actions, array(__("admin"), $page->urlBarrel($barrel['alias'],$barrel['vhost'],"admin/"))); + + if (!$this->readonly) { + $flags = new flagset($barrel['flags']); + if ($flags->hasFlag('plug')) { + array_push($actions, array(__("plugins"), "plugins?plug_barrel={$barrel['alias']}")); + } + array_push($actions, array(__("delete"), "javascript:del('{$barrel['alias']}');")); + } + + + $page->append('sites',array( + 'alias' => $barrel['alias'], + 'title' => array( $barrel['title'], $page->urlBarrel($barrel['alias'],$barrel['vhost']) ), + 'description' => $barrel['description'], + 'actions' => $actions ) + ); + } + + + /** Run the Barrel editor. + * + * @param $page + * @param $outputvar + */ + function run(&$page, $outputvar = '') + { + global $globals; + + $page->assign('post',$page->script_self()); + + $action = isset($_REQUEST["action"]) ? $_REQUEST["action"] : "list"; + switch($action) { + case "create": + if ($this->readonly) die("Sorry, this barrel editor is read-only."); + if (isset($_REQUEST["target"])) { + Diogenes_Barrel::create($_REQUEST["target"], $page); + } + $action="list"; + break; + case "update": + if ($this->readonly) die("Sorry, this barrel editor is read-only."); + if (isset($_REQUEST["target"])) { + // build flags + $flags = isset($_REQUEST['flags']) ? implode(",",array_values($_REQUEST['flags'])) : ""; + $globals->db->query("update diogenes_site set vhost='{$_REQUEST['vhost']}',flags='$flags' where alias='{$_REQUEST['target']}'"); + $opts = new Diogenes_Barrel_Options($_REQUEST['target']); + $opts->updateOption('description', $_REQUEST['description']); + $opts->updateOption('title', $_REQUEST['title']); + $opts->updateOption('keywords', $_REQUEST['keywords']); + } + $action="list"; + break; + case "edit": + if ($this->readonly) die("Sorry, this barrel editor is read-only."); + if (isset($_REQUEST["target"])) { + $res = $globals->db->query("select alias,vhost,flags from diogenes_site where alias='{$_REQUEST['target']}'"); + if (!list($target,$vhost,$flags) = mysql_fetch_row($res)) { + $page->info("Could not find specified site!"); + $action = "list"; + break; + } + mysql_free_result($res); + $page->assign('target',$target); + $page->assign('v_vhost',$vhost); + $flags = new flagset($flags); + $flag_opts = array('tpl' => __("custom templates"), 'plug' => __("plugins")); + $page->assign('v_flag_opts', $flag_opts); + foreach($flag_opts as $key=>$val) { + if ($flags->hasFlag($key)) + $page->append('v_flags', $key); + } + $opts = new Diogenes_Barrel_Options($target); + $page->assign('v_desc',$opts->description); + $page->assign('v_title',$opts->title); + $page->assign('v_keywords',$opts->keywords); + + } + break; + case "delete": + if ($this->readonly) die("Sorry, this barrel editor is read-only."); + if (isset($_REQUEST["target"])) { + Diogenes_Barrel::destroy($_REQUEST["target"], $page); + } + $action="list"; + break; + default: + $action="list"; + } + + if ($action == "list") { + $res = $globals->db->query("select s.alias,s.vhost,s.flags,o.name,o.value from diogenes_site as s left join diogenes_option as o on s.alias=o.barrel order by s.alias"); + $barrel = array('alias' => ''); + + while (list($s_alias,$s_vhost,$s_flags,$o_name,$o_value) = mysql_fetch_row($res)) { + if ($s_alias != $barrel['alias']) { + if ($barrel['alias']) $this->addBarrel($page, $barrel); + $barrel = array('alias' => $s_alias,'vhost' => $s_vhost, 'flags' => $s_flags, 'title' => '','description' => ''); + } + $barrel[$o_name] = $o_value; + } + mysql_free_result($res); + if ($barrel['alias']) $this->addBarrel($page, $barrel); + } // $action == "list" + + // values + $page->assign('action',$action); + $page->assign('readonly', $this->readonly); + + + // translations + $page->assign('msg_alias',__("alias")); + $page->assign('msg_title',__("site")); + $page->assign('msg_desc',__("description")); + $page->assign('msg_keywords',__("keywords")); + $page->assign('msg_create',__("Create a new site")); + $page->assign('msg_create_note',__("The site alias may only contain letters, numbers and underscores.")); + $page->assign('msg_submit',__("Submit")); + $page->assign('msg_no_barrels', __("no barrels available")); + $page->assign('msg_vhost',__("vhost (see note)")); + $page->assign('msg_vhost_note', __("vhost note: If you intend to serve this site from a virtualhost, you should enter the name of the virtualhost in this field.")); + $page->assign('msg_flags',__("flags")); + + // if requested, assign the content to be displayed + if (!empty($outputvar)) { + $page->assign($outputvar, $page->fetch('barrel-editor.tpl')); + } + } +} +?> diff --git a/include/Barrel/File.php b/include/Barrel/File.php new file mode 100644 index 0000000..7582c86 --- /dev/null +++ b/include/Barrel/File.php @@ -0,0 +1,124 @@ +page =& $page; + $this->props = array( + 'file' => $file + ); + + /* + if (is_array($props)) + { + foreach (array_keys($props) as $key) + { + $this->props[$key] = $props[$key]; + } + }*/ + } + + + /** Delete a file (not implemented) + * + * @param $barrel + * @param $dir + */ + function delete(&$barrel, $dir) + { + global $globals; + + } + + + /** Return the list of action applicable to the file + * + * @param $canedit + */ + function make_actions($canedit) + { + global $globals; + + $dir = $this->page->props['PID']; + $file = $this->props['file']; + + $rev = "files?action=revs&dir=$dir&target=$file"; + $edit = "edit?dir=$dir&file=$file"; + $del = "javascript:file_delete('$dir','$file');"; + $rename = "javascript:file_rename('$dir','$file');"; + $view = "../". $this->page->getLocation($file); + + $actions = array(); + if ($view) array_push($actions, array(__("view"), $view, "view")); + if ($edit && $canedit) array_push($actions, array(__("edit"), $edit, "edit")); + if ($rev) array_push($actions, array(__("revisions"),$rev, "revisions")); + if ($rename && $canedit) array_push($actions, array(__("rename"), $rename, "rename")); + if ($del && $canedit) array_push($actions, array(__("delete"), $del, "delete")); + + return $globals->icons->get_action_icons($actions); + } + + + /** Build the 'File' toolbar + * + * @param $canedit + */ + function make_toolbar($canedit) + { + $dir = $this->page->props['PID']; + $file = $this->props['file']; + global $afile; + + $filebar = array (); + if ($canedit) + { + array_push($filebar, array( __("raw editor"), ($afile == "edit") ? "" : "edit?dir=$dir&file=$file")); + array_push($filebar, array( __("HTML editor"), ($afile == "compose") ? "" : "compose?dir=$dir&file=$file")); + } + array_push($filebar, array( __("file revisions"), "files?action=revs&dir=$dir&target=$file")); + + return $filebar; + } + +} + +?> diff --git a/include/Barrel/Options.php b/include/Barrel/Options.php new file mode 100644 index 0000000..c87f604 --- /dev/null +++ b/include/Barrel/Options.php @@ -0,0 +1,105 @@ +barrel = $alias; + $this->readOptions(); + } + + + /** Read options from database. + */ + function readOptions() { + global $globals; + + // we only accept options which already exist in this class + $res = $globals->db->query("select name,value from {$this->table_option} where barrel='{$this->barrel}'"); + while (list($key,$value) = mysql_fetch_row($res)) { + if (isset($this->$key) && ($key != "table_option")) + $this->$key = $value; + } + mysql_free_result($res); + + } + + + /** Update an option's value and write the new value to database. + */ + function updateOption($name, $value) { + global $globals; + + $this->$name = stripslashes($value); + $globals->db->query("replace into {$this->table_option} set barrel='{$this->barrel}',name='$name',value='$value'"); + } + +} + +?> diff --git a/include/Barrel/Page.php b/include/Barrel/Page.php new file mode 100644 index 0000000..d680bc4 --- /dev/null +++ b/include/Barrel/Page.php @@ -0,0 +1,330 @@ +barrel =& $barrel; + $this->props = array( + 'PID' => 0, + 'parent' => 0, + 'location' => '', + 'title' => '', + 'perms' => 'public', + 'wperms' => 'admin', + 'status' => 0, + 'template' => '' + ); + + if (is_array($props)) + { + foreach (array_keys($props) as $key) + { + $this->props[$key] = $props[$key]; + } + } + //echo "[" . $this->props['PID'] . "][". $this->props['location'] . "], parent : [".$this->props['parent']."]
"; + } + + + /** Delete a Barrel Page. + * + * @param $barrel + * @param $dir + * @param $caller + */ + function delete(&$barrel, $dir, &$caller) + { + global $globals; + + $caller->info(__("Deleting page"). " $dir"); + + // check there are no child pages + $res = $globals->db->query("select PID from {$barrel->table_page} where parent=$dir"); + $num = mysql_num_rows($res); + mysql_free_result($res); + if ($num > 0) + { + $caller->info(__("Not deleting page, it has child pages!")); + return; + } + + $rcs = $caller->getRcs(); + $globals->db->query("delete from {$barrel->table_page} where PID=$dir"); + $caller->log("page_delete","{$barrel->alias}:$dir"); + system("rm -rf ". escapeshellarg($rcs->rcsPath($dir))); + system("rm -rf ". escapeshellarg($rcs->spoolPath($dir))); + $barrel->compileTree(); + $barrel->readTree(); + } + + + /** Read a Page's properties from database. + * + * @param $barrel + * @param $dir + */ + function fromDb(&$barrel, $dir) + { + global $globals; + $retval = ''; + + $res = $globals->db->query("select * from {$barrel->table_page} where PID='$dir'"); + if ($props = mysql_fetch_assoc($res)) { + $retval = new Diogenes_Barrel_Page($barrel, $props); + } + mysql_free_result($res); + return $retval; + } + + + /** Returns the location of a given file + * + * @param $file + */ + function getLocation($file = '') + { + $dirloc = $this->barrel->getLocation($this->props['PID']); + $floc = (strlen($dirloc) ? "$dirloc/" : '') . $file; + return $floc; + } + + + /** Return the list of action applicable to the page + */ + function make_actions() + { + global $globals; + $props = $this->props; + + $actions = array( + array( __("view"), "../". $this->getLocation(), "view" ), + array( __("edit"), "edit?dir={$props['PID']}&file=page.html", "edit"), + array( __("properties"), "pages?action=edit&dir={$props['PID']}", "properties"), + array( __("revisions"), "files?action=revs&dir={$props['PID']}&target={$globals->htmlfile}","revisions") + ); + + if ($this->barrel->flags->hasFlag('plug')) + { + array_push($actions, array( __("plugins"), "plugins?plug_page={$props['PID']}", "plugins")); + } + if ($props['location'] != '') + array_push($actions, array( __("delete"), "javascript:page_delete('{$props['PID']}','{$props['location']}');","delete")); + + return $globals->icons->get_action_icons($actions); + } + + + /** Build the 'Page' toolbar + */ + function make_toolbar() + { + global $globals; + $props = $this->props; + + $topbar = array (); + + if ($props['PID']) { + $hp = $this->barrel->getPID(''); + array_push($topbar, array(__("home"), ($props['PID'] == $hp) ? "" : "files?dir=$hp")); + array_push($topbar, array(__("parent page"), $props['parent'] ? "files?dir=".$props['parent'] : "")); + + array_push($topbar, array( __("browse files"), "files?dir={$props['PID']}" )); + array_push($topbar, array( __("page properties"), "pages?dir={$props['PID']}" )); + array_push($topbar, array( __("view page"), "../". $this->getLocation())); + array_push($topbar, array(__("add a page"), "pages?action=edit&parent=".$props['PID']) ); + if ($this->barrel->flags->hasFlag("plug")) { + array_push($topbar, array( __("plugins"), "plugins?plug_page={$props['PID']}" ) ); + } + } + + return $topbar; + + } + + + /** Build the 'File' toolbar + */ + function make_doc_toolbar(&$rcs) + { + global $globals; + + if ($globals->word_import && file_exists($rcs->spoolPath($this->props['PID'],$globals->wordfile)) ) { + $bfile = new Diogenes_Barrel_File($this, $globals->wordfile); + $toolbar = $bfile->make_toolbar(0); + } else { + $bfile = new Diogenes_Barrel_File($this, $globals->htmlfile); + $toolbar = $bfile->make_toolbar(1); + } + return $toolbar; + } + + + /** Write the page's properties to database + * + * @param $homepage + * @param $caller + */ + function toDb($homepage, &$caller) + { + global $globals; + + $props = $this->props; + // check we are not creating a publicly writable page + // on a barrel with PHP execution enabled! + if ($props['PID']) + { + $cache = $globals->plugins->readCache($this->barrel->pluginsCacheFile, $this->barrel->alias); + $plugs_active = $globals->plugins->cachedActive($cache, $this->barrel->alias, $props['PID']); + foreach($plugs_active as $plugentry) + { + $plug_h = $globals->plugins->load($plugentry); + if (!is_object($plug_h)) + { + $caller->info("failed to load plugin '{$plugentry['plugin']}'"); + return; + } + if (!$plug_h->allow_wperms($props['wperms'])) + { + $caller->info("plugin '{$plugentry['plugin']}' is not allowed with write permissions '{$props['wperms']}'!"); + return; + } + } + } + + + // check that the location is valid + if ($homepage) + { + // homepage + $props['location'] = ''; + + } else { + + // check the location is well formatted + if (!preg_match("/^[a-zA-Z0-9_\-]*$/",$props['location'])) + { + $caller->info(__("the page location cannot contain spaces or special characters")); + return; + } + + // check this is not a forbidden location + if (in_array($props['location'], $globals->invalidlocations)) + { + $caller->info(__("this location cannot be used, it is reserved by Diogenes")); + return; + } + + } + + // this is a new entry, initialise + if (!$props['PID']) { + // new entry + $globals->db->query("insert into {$this->barrel->table_page} set location='temp'"); + $props['PID'] = mysql_insert_id(); + $caller->info(__("Creating new page")." {$props['PID']}"); + + $caller->log("page_create","{$this->barrel->alias}:{$props['PID']}"); + + // initialise the page + $rcs = $caller->getRcs(); + $rcs->newdir("",$props['PID']); + $rcs->commit($props['PID'],$globals->htmlfile,""); + } else { + $caller->log("page_props","{$this->barrel->alias}:{$props['PID']}"); + } + + + // check we have a location + if (!$homepage and !strlen($props['location'])) + { + $props['location'] = $props['PID']; + } + + + // check that the filiation is valid + if ($props['parent']) + { + // we need to insure that the parent is not already a child of the current page + $parent = $props['parent']; + while ($parent) + { + $oldparent = $parent; + $res = $globals->db->query("select parent from {$this->barrel->table_page} where PID=$parent"); + list($parent) = mysql_fetch_row($res); + mysql_free_result($res); + if ($parent == $props['PID']) + { + $caller->info(__("A page cannot be its own parent (page $oldparent is a child of $parent)!")); + break; + } + } + } + +// $caller->info("setting parent to {$props['parent']}"); + + // update data fields + $sql = + "update {$this->barrel->table_page} set ". + "parent='{$props['parent']}',". + "location='{$props['location']}',". + "title='{$props['title']}',". + "perms='{$props['perms']}',". + "wperms='{$props['wperms']}',". + "status='{$props['status']}',". + "template='{$props['template']}' ". + "where PID='{$props['PID']}'"; + //$caller->info($sql); + $globals->db->query($sql); + + // order by location + $globals->db->query("alter table {$this->barrel->table_page} order by parent,location"); + + // recompile tree + $this->barrel->compileTree(); + $this->barrel->readTree(); + } +} + +?> diff --git a/include/HTTP/WebDAV/Server.php b/include/HTTP/WebDAV/Server.php new file mode 100644 index 0000000..3caf13f --- /dev/null +++ b/include/HTTP/WebDAV/Server.php @@ -0,0 +1,1874 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: Server.php,v 1.21 2004/04/14 21:44:26 hholzgra Exp $ +// +require_once "HTTP/WebDAV/Tools/_parse_propfind.php"; +require_once "HTTP/WebDAV/Tools/_parse_proppatch.php"; +require_once "HTTP/WebDAV/Tools/_parse_lockinfo.php"; + + + +/** + * Virtual base class for implementing WebDAV servers + * + * WebDAV server base class, needs to be extended to do useful work + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version 0.99.1dev + */ +class HTTP_WebDAV_Server +{ + // {{{ Member Variables + + /** + * URI path for this request + * + * @var string + */ + var $path; + + /** + * Realm string to be used in authentification popups + * + * @var string + */ + var $http_auth_realm = "PHP WebDAV"; + + /** + * String to be used in "X-Dav-Powered-By" header + * + * @var string + */ + var $dav_powered_by = ""; + + /** + * Remember parsed If: (RFC2518/9.4) header conditions + * + * @var array + */ + var $_if_header_uris = array(); + + /** + * HTTP response status/message + * + * @var string + */ + var $_http_status = "200 OK"; + + /** + * encoding of property values passed in + * + * @var string + */ + var $_prop_encoding = "utf-8"; + + // }}} + + // {{{ Constructor + + /** + * Constructor + * + * @param void + */ + function HTTP_WebDAV_Server() + { + // PHP messages destroy XML output -> switch them off + ini_set("display_errors", 0); + } + + // }}} + + // {{{ ServeRequest() + /** + * Serve WebDAV HTTP request + * + * dispatch WebDAV HTTP request to the apropriate method handler + * + * @param void + * @return void + */ + function ServeRequest() + { + // identify ourselves + if (empty($this->dav_powered_by)) { + header("X-Dav-Powered-By: PHP class: ".get_class($this)); + } else { + header("X-Dav-Powered-By: ".$this->dav_powered_by ); + } + + // check authentication + if (!$this->_check_auth()) { + $this->http_status('401 Unauthorized'); + + // RFC2518 says we must use Digest instead of Basic + // but Microsoft Clients do not support Digest + // and we don't support NTLM and Kerberos + // so we are stuck with Basic here + header('WWW-Authenticate: Basic realm="'.($this->http_auth_realm).'"'); + + return; + } + + // check + if(! $this->_check_if_header_conditions()) { + $this->http_status("412 Precondition failed"); + return; + } + + // set path + $this->path = $this->_urldecode(!empty($_SERVER["PATH_INFO"]) ? $_SERVER["PATH_INFO"] : "/"); + if(ini_get("magic_quotes_gpc")) { + $this->path = stripslashes($this->path); + } + + + // detect requested method names + $method = strtolower($_SERVER["REQUEST_METHOD"]); + $wrapper = "http_".$method; + + // activate HEAD emulation by GET if no HEAD method found + if ($method == "head" && !method_exists($this, "head")) { + $method = "get"; + } + + if (method_exists($this, $wrapper) && ($method == "options" || method_exists($this, $method))) { + $this->$wrapper(); // call method by name + } else { // method not found/implemented + if ($_SERVER["REQUEST_METHOD"] == "LOCK") { + $this->http_status("412 Precondition failed"); + } else { + $this->http_status("405 Method not allowed"); + header("Allow: ".join(", ", $this->_allow())); // tell client what's allowed + } + } + } + + // }}} + + // {{{ abstract WebDAV methods + + // {{{ GET() + /** + * GET implementation + * + * overload this method to retrieve resources from your server + *
+ * + * + * @abstract + * @param array &$params Array of input and output parameters + *
input

+ *
output
    + *
  • size - + *
+ * @returns int HTTP-Statuscode + */ + + /* abstract + function GET(&$params) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ PUT() + /** + * PUT implementation + * + * PUT implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PUT() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ COPY() + + /** + * COPY implementation + * + * COPY implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function COPY() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ MOVE() + + /** + * MOVE implementation + * + * MOVE implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function MOVE() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ DELETE() + + /** + * DELETE implementation + * + * DELETE implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function DELETE() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ PROPFIND() + + /** + * PROPFIND implementation + * + * PROPFIND implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PROPFIND() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ PROPPATCH() + + /** + * PROPPATCH implementation + * + * PROPPATCH implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PROPPATCH() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ LOCK() + + /** + * LOCK implementation + * + * LOCK implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function LOCK() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ UNLOCK() + + /** + * UNLOCK implementation + * + * UNLOCK implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function UNLOCK() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // }}} + + // {{{ other abstract methods + + // {{{ check_auth() + + /** + * check authentication + * + * overload this method to retrieve and confirm authentication information + * + * @abstract + * @param string type Authentication type, e.g. "basic" or "digest" + * @param string username Transmitted username + * @param string passwort Transmitted password + * @returns bool Authentication status + */ + + /* abstract + function checkAuth($type, $username, $password) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ checklock() + + /** + * check lock status for a resource + * + * overload this method to return shared and exclusive locks + * active for this resource + * + * @abstract + * @param string resource Resource path to check + * @returns array An array of lock entries each consisting + * of 'type' ('shared'/'exclusive'), 'token' and 'timeout' + */ + + /* abstract + function checklock($resource) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // }}} + + // {{{ WebDAV HTTP method wrappers + + // {{{ http_OPTIONS() + + /** + * OPTIONS method handler + * + * The OPTIONS method handler creates a valid OPTIONS reply + * including Dav: and Allowed: heaers + * based on the implemented methods found in the actual instance + * + * @param void + * @return void + */ + function http_OPTIONS() + { + // Microsoft clients default to the Frontpage protocol + // unless we tell them to use WebDAV + header("MS-Author-Via: DAV"); + + // get allowed methods + $allow = $this->_allow(); + + // dav header + $dav = array(1); // assume we are always dav class 1 compliant + if (isset($allow['LOCK'])) { + $dav[] = 2; // dav class 2 requires that locking is supported + } + + // tell clients what we found + $this->http_status("200 OK"); + header("DAV: " .join("," , $dav)); + header("Allow: ".join(", ", $allow)); + } + + // }}} + + + // {{{ http_PROPFIND() + + /** + * PROPFIND method handler + * + * @param void + * @return void + */ + function http_PROPFIND() + { + $options = Array(); + $options["path"] = $this->path; + + // search depth from header (default is "infinity) + if (isset($_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // analyze request payload + $propinfo = new _parse_propfind("php://input"); + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + $options['props'] = $propinfo->props; + + // call user handler + if (!$this->propfind($options, $files)) { + $this->http_status("404 Not Found"); + return; + } + + // collect namespaces here + $ns_hash = array(); + + // Microsoft Clients need this special namespace for date and time values + $ns_defs = "xmlns:ns0=\"urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/\""; + + // now we loop over all returned file entries + foreach($files["files"] as $filekey => $file) { + + // nothing to do if no properties were returend for a file + if (!isset($file["props"]) || !is_array($file["props"])) { + continue; + } + + // now loop over all returned properties + foreach($file["props"] as $key => $prop) { + // as a convenience feature we do not require that user handlers + // restrict returned properties to the requested ones + // here we strip all unrequested entries out of the response + + switch($options['props']) { + case "all": + // nothing to remove + break; + + case "names": + // only the names of all existing properties were requested + // so we remove all values + unset($files["files"][$filekey]["props"][$key]["val"]); + break; + + default: + $found = false; + + // search property name in requested properties + foreach((array)$options["props"] as $reqprop) { + if ( $reqprop["name"] == $prop["name"] + && $reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + // unset property and continue with next one if not found/requested + if (!$found) { + $files["files"][$filekey]["props"][$key]=""; + continue(2); + } + break; + } + + // namespace handling + if (empty($prop["ns"])) continue; // no namespace + $ns = $prop["ns"]; + if ($ns == "DAV:") continue; // default namespace + if (isset($ns_hash[$ns])) continue; // already known + + // register namespace + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$ns] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$ns\""; + } + + // we also need to add empty entries for properties that were requested + // but for which no values where returned by the user handler + if (is_array($options['props'])) { + foreach($options["props"] as $reqprop) { + if($reqprop['name']=="") continue; // skip empty entries + + $found = false; + + // check if property exists in result + foreach($file["props"] as $prop) { + if ( $reqprop["name"] == $prop["name"] + && $reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + if (!$found) { + if($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery") { + // lockdiscovery is handled by the base class + $files["files"][$filekey]["props"][] + = $this->mkprop("DAV:", + "lockdiscovery" , + $this->lockdiscovery($files["files"][$filekey]['path'])); + } else { + // add empty value for this property + $files["files"][$filekey]["noprops"][] = + $this->mkprop($reqprop["xmlns"], $reqprop["name"], ""); + + // register property namespace if not known yet + if ($reqprop["xmlns"] != "DAV:" && !isset($ns_hash[$reqprop["xmlns"]])) { + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$reqprop["xmlns"]] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$reqprop[xmlns]\""; + } + } + } + } + } + } + + // now we generate the reply header ... + $this->http_status("207 Multi-Status"); + header('Content-Type: text/xml; charset="utf-8"'); + + // ... and payload + echo "\n"; + echo "\n"; + + foreach($files["files"] as $file) { + // ignore empty or incomplete entries + if(!is_array($file) || empty($file) || !isset($file["path"])) continue; + $path = $file['path']; + if(!is_string($path) || $path==="") continue; + + echo " \n"; + + $href = (@$_SERVER["HTTPS"] === "on" ? "https:" : "http:"); + $href.= "//".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']; + $href.= $path; + //TODO make sure collection resource pathes end in a trailing slash + + echo " $href\n"; + + // report all found properties and their values (if any) + if (isset($file["props"]) && is_array($file["props"])) { + echo " \n"; + echo " \n"; + + foreach($file["props"] as $key => $prop) { + + if (!is_array($prop)) continue; + if (!isset($prop["name"])) continue; + + if (!isset($prop["val"]) || $prop["val"] === "" || $prop["val"] === false) { + // empty properties (cannot use empty() for check as "0" is a legal value here) + if($prop["ns"]=="DAV:") { + echo " \n"; + } else if(!empty($prop["ns"])) { + echo " <".$ns_hash[$prop["ns"]].":$prop[name]/>\n"; + } else { + echo " <$prop[name] xmlns=\"\"/>"; + } + } else if ($prop["ns"] == "DAV:") { + // some WebDAV properties need special treatment + switch ($prop["name"]) { + case "creationdate": + echo " " + . gmdate("Y-m-d\\TH:i:s\\Z",$prop['val']) + . "\n"; + break; + case "getlastmodified": + echo " " + . gmdate("D, d M Y H:i:s ", $prop['val']) + . "GMT\n"; + break; + case "resourcetype": + echo " \n"; + break; + case "supportedlock": + echo " $prop[val]\n"; + break; + case "lockdiscovery": + echo " \n"; + echo $prop["val"]; + echo " \n"; + break; + default: + echo " " + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + break; + } + } else { + // properties from namespaces != "DAV:" or without any namespace + if ($prop["ns"]) { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]>" + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + } else { + echo " <$prop[name] xmlns=\"\">" + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + } + } + } + + echo " \n"; + echo " HTTP/1.1 200 OK\n"; + echo " \n"; + } + + // now report all properties requested bot not found + if (isset($file["noprops"])) { + echo " \n"; + echo " \n"; + + foreach($file["noprops"] as $key => $prop) { + if ($prop["ns"] == "DAV:") { + echo " \n"; + } else if ($prop["ns"] == "") { + echo " <$prop[name] xmlns=\"\"/>\n"; + } else { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]/>\n"; + } + } + + echo " \n"; + echo " HTTP/1.1 404 Not Found\n"; + echo " \n"; + } + + echo " \n"; + } + + echo "\n"; + } + + + // }}} + + // {{{ http_PROPPATCH() + + /** + * PROPPATCH method handler + * + * @param void + * @return void + */ + function http_PROPPATCH() + { + if($this->_check_lock_status($this->path)) { + $options = Array(); + $options["path"] = $this->path; + + $propinfo = new _parse_proppatch("php://input"); + + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + + $options['props'] = $propinfo->props; + + $responsedescr = $this->proppatch($options); + + $this->http_status("207 Multi-Status"); + header('Content-Type: text/xml; charset="utf-8"'); + + echo "\n"; + + echo "\n"; + echo " \n"; + echo " ".$this->_urlencode($_SERVER["SCRIPT_NAME"].$this->path)."\n"; + + foreach($options["props"] as $prop) { + echo " \n"; + echo " <$prop[name] xmlns=\"$prop[ns]\"/>\n"; + echo " HTTP/1.1 $prop[status]\n"; + echo " \n"; + } + + if ($responsedescr) { + echo " ". + $this->_prop_encode(htmlspecialchars($responsedescr)). + "\n"; + } + + echo " \n"; + echo "\n"; + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_MKCOL() + + /** + * MKCOL method handler + * + * @param void + * @return void + */ + function http_MKCOL() + { + $options = Array(); + $options["path"] = $this->path; + + $stat = $this->mkcol($options); + + $this->http_status($stat); + } + + // }}} + + + // {{{ http_GET() + + /** + * GET method handler + * + * @param void + * @returns void + */ + function http_GET() + { + // TODO check for invalid stream + $options = Array(); + $options["path"] = $this->path; + + $this->_get_ranges($options); + + if (true === ($status = $this->get($options))) { + if (!headers_sent()) { + $status = "200 OK"; + + if (!isset($options['mimetype'])) { + $options['mimetype'] = "application/octet-stream"; + } + header("Content-type: $options[mimetype]"); + + if (isset($options['mtime'])) { + header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT"); + } + + if (isset($options['stream'])) { + // GET handler returned a stream + if (!empty($options['ranges']) && (0===fseek($options['stream'], 0, SEEK_SET))) { + // partial request and stream is seekable + + if (count($options['ranges']) === 1) { + $range = $options['ranges'][0]; + + if (isset($range['start'])) { + fseek($options['stream'], $range['start'], SEEK_SET); + if (feof($options['stream'])) { + http_status("416 Requested range not satisfiable"); + exit; + } + + if (isset($range['end'])) { + $size = $range['end']-$range['start']+1; + http_status("206 partial"); + header("Content-length: $size"); + header("Content-range: $range[start]-$range[end]/" + . (isset($options['size']) ? $options['size'] : "*")); + while ($size && !feof($options['stream'])) { + $buffer = fread($options['stream'], 4096); + $size -= strlen($buffer); + echo $buffer; + } + } else { + http_status("206 partial"); + if (isset($options['size'])) { + header("Content-length: ".($options['size'] - $range['start'])); + header("Content-range: $start-$end/" + . (isset($options['size']) ? $options['size'] : "*")); + } + fpassthru($options['stream']); + } + } else { + header("Content-length: ".$range['last']); + fseek($options['stream'], -$range['last'], SEEK_END); + fpassthru($options['stream']); + } + } else { + $this->_multipart_byterange_header(); // init multipart + foreach ($options['ranges'] as $range) { + // TODO what if size unknown? 500? + if (isset($range['start'])) { + $from = $range['start']; + $to = !empty($range['end']) ? $range['end'] : $options['size']-1; + } else { + $from = $options['size'] - $range['last']-1; + $to = $options['size'] -1; + } + $total = isset($options['size']) ? $options['size'] : "*"; + $size = $to - $from + 1; + $this->_multipart_byterange_header($options['mimetype'], $from, $to, $total); + + + fseek($options['stream'], $start, SEEK_SET); + while ($size && !feof($options['stream'])) { + $buffer = fread($options['stream'], 4096); + $size -= strlen($buffer); + echo $buffer; + } + } + $this->_multipart_byterange_header(); // end multipart + } + } else { + // normal request or stream isn't seekable, return full content + if (isset($options['size'])) { + header("Content-length: ".$options['size']); + } + fpassthru($options['stream']); + return; // no more headers + } + } elseif (isset($options['data'])) { + if (is_array($options['data'])) { + // reply to partial request + } else { + header("Content-length: ".strlen($options['data'])); + echo $options['data']; + } + } + } + } + + if (false === $status) { + $this->http_status("404 not found"); + } + + $this->http_status("$status"); + } + + + /** + * parse HTTP Range: header + * + * @param array options array to store result in + * @return void + */ + function _get_ranges(&$options) + { + // process Range: header if present + if (isset($_SERVER['HTTP_RANGE'])) { + + // we only support standard "bytes" range specifications for now + if (ereg("bytes[[:space:]]*=[[:space:]]*(.+)", $_SERVER['HTTP_RANGE'], $matches)) { + $options["ranges"] = array(); + + // ranges are comma separated + foreach (explode(",", $matches[1]) as $range) { + // ranges are either from-to pairs or just end positions + list($start, $end) = explode("-", $range); + $options["ranges"][] = ($start==="") + ? array("last"=>$end) + : array("start"=>$start, "end"=>$end); + } + } + } + } + + /** + * generate separator headers for multipart response + * + * first and last call happen without parameters to generate + * the initial header and closing sequence, all calls inbetween + * require content mimetype, start and end byte position and + * optionaly the total byte length of the requested resource + * + * @param string mimetype + * @param int start byte position + * @param int end byte position + * @param int total resource byte size + */ + function _multipart_byterange_header($mimetype = false, $from = false, $to=false, $total=false) + { + if ($mimetype === false) { + if (!isset($this->multipart_separator)) { + // initial + + // a little naive, this sequence *might* be part of the content + // but it's really not likely and rather expensive to check + $this->multipart_separator = "SEPARATOR_".md5(microtime()); + + // generate HTTP header + header("Content-type: multipart/byteranges; boundary=".$this->multipart_separator); + } else { + // final + + // generate closing multipart sequence + echo "\n--{$this->multipart_separator}--"; + } + } else { + // generate separator and header for next part + echo "\n--{$this->multipart_separator}\n"; + echo "Content-type: $mimetype\n"; + echo "Content-range: $from-$to/". ($total === false ? "*" : $total); + echo "\n\n"; + } + } + + + + // }}} + + // {{{ http_HEAD() + + /** + * HEAD method handler + * + * @param void + * @return void + */ + function http_HEAD() + { + $status = false; + $options = Array(); + $options["path"] = $this->path; + + if (method_exists($this, "HEAD")) { + $status = $this->head($options); + } else if (method_exists($this, "GET")) { + ob_start(); + $status = $this->GET($options); + ob_end_clean(); + } + + if($status===true) $status = "200 OK"; + if($status===false) $status = "404 Not found"; + + $this->http_status($status); + } + + // }}} + + // {{{ http_PUT() + + /** + * PUT method handler + * + * @param void + * @return void + */ + function http_PUT() + { + if ($this->_check_lock_status($this->path)) { + $options = Array(); + $options["path"] = $this->path; + $options["content_length"] = $_SERVER["CONTENT_LENGTH"]; + + // get the Content-type + if (isset($_SERVER["CONTENT_TYPE"])) { + // for now we do not support any sort of multipart requests + if (!strncmp($_SERVER["CONTENT_TYPE"], "multipart/", 10)) { + $this->http_status("501 not implemented"); + echo "The service does not support mulipart PUT requests"; + return; + } + $options["content_type"] = $_SERVER["CONTENT_TYPE"]; + } else { + // default content type if none given + $options["content_type"] = "application/octet-stream"; + } + + /* RFC 2616 2.6 says: "The recipient of the entity MUST NOT + ignore any Content-* (e.g. Content-Range) headers that it + does not understand or implement and MUST return a 501 + (Not Implemented) response in such cases." + */ + foreach ($_SERVER as $key => $val) { + if (strncmp($key, "HTTP_CONTENT", 11)) continue; + switch ($key) { + case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11 + // TODO support this if ext/zlib filters are available + $this->http_status("501 not implemented"); + echo "The service does not support '$val' content encoding"; + return; + + case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12 + // we assume it is not critical if this one is ignored + // in the actual PUT implementation ... + $options["content_language"] = $value; + break; + + case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14 + /* The meaning of the Content-Location header in PUT + or POST requests is undefined; servers are free + to ignore it in those cases. */ + break; + + case 'HTTP_CONTENT_RANGE': // RFC 2616 14.16 + // single byte range requests are supported + // the header format is also specified in RFC 2616 14.16 + // TODO we have to ensure that implementations support this or send 501 instead + if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $value, $matches)) { + $this->http_status("400 bad request"); + echo "The service does only support single byte ranges"; + return; + } + + $range = array("start"=>$matches[1], "end"=>$matches[2]); + if (is_numeric($matches[3])) { + $range["total_length"] = $matches[3]; + } + $option["ranges"][] = $range; + + // TODO make sure the implementation supports partial PUT + // this has to be done in advance to avoid data being overwritten + // on implementations that do not support this ... + break; + + case 'HTTP_CONTENT_MD5': // RFC 2616 14.15 + // TODO: maybe we can just pretend here? + $this->http_status("501 not implemented"); + echo "The service does not support content MD5 checksum verification"; + return; + + default: + // any other unknown Content-* headers + $this->http_status("501 not implemented"); + echo "The service does not support '$key'"; + return; + } + } + + $options["stream"] = fopen("php://input", "r"); + + $stat = $this->PUT($options); + + if (is_resource($stat) && get_resource_type($stat) == "stream") { + $stream = $stat; + if (!empty($options["ranges"])) { + // TODO multipart support is missing (see also above) + // TODO error checking + $stat = fseek($stream, $range[0]["start"], SEEK_SET); + fwrite($stream, fread($options["stream"], $range[0]["end"]-$range[0]["start"]+1)); + } else { + while (!feof($options["stream"])) { + fwrite($stream, fread($options["stream"], 4096)); + } + } + fclose($stream); + + $stat = $options["new"] ? "201 Created" : "204 No Content"; + } + + $this->http_status($stat); + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_DELETE() + + /** + * DELETE method handler + * + * @param void + * @return void + */ + function http_DELETE() + { + // check RFC 2518 Section 9.2, last paragraph + if (isset($_SERVER["HTTP_DEPTH"])) { + if ($_SERVER["HTTP_DEPTH"] != "infinity") { + $this->http_status("400 Bad Request"); + return; + } + } + + // check lock status + if ($this->_check_lock_status($this->path)) { + // ok, proceed + $options = Array(); + $options["path"] = $this->path; + + $stat = $this->delete($options); + + $this->http_status($stat); + } else { + // sorry, its locked + $this->http_status("423 Locked"); + } + } + + // }}} + + // {{{ http_COPY() + + /** + * COPY method handler + * + * @param void + * @return void + */ + function http_COPY() + { + // no need to check source lock status here + // destination lock status is always checked by the helper method + $this->_copymove("copy"); + } + + // }}} + + // {{{ http_MOVE() + + /** + * MOVE method handler + * + * @param void + * @return void + */ + function http_MOVE() + { + if ($this->_check_lock_status($this->path)) { + // destination lock status is always checked by the helper method + $this->_copymove("move"); + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_LOCK() + + /** + * LOCK method handler + * + * @param void + * @return void + */ + function http_LOCK() + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + if (isset($_SERVER["HTTP_TIMEOUT"])) { + $options["timeout"] = explode(",", $_SERVER["HTTP_TIMEOUT"]); + } + + if(empty($_SERVER['CONTENT_LENGTH']) && !empty($_SERVER['HTTP_IF'])) { + // check if locking is possible + if(!$this->_check_lock_status($this->path)) { + $this->http_status("423 Locked"); + return; + } + + // refresh lock + $options["update"] = substr($_SERVER['HTTP_IF'], 2, -2); + $stat = $this->lock($options); + } else { + // extract lock request information from request XML payload + $lockinfo = new _parse_lockinfo("php://input"); + if (!$lockinfo->success) { + $this->http_status("400 bad request"); + } + + // check if locking is possible + if(!$this->_check_lock_status($this->path, $lockinfo->lockscope === "shared")) { + $this->http_status("423 Locked"); + return; + } + + // new lock + $options["scope"] = $lockinfo->lockscope; + $options["type"] = $lockinfo->locktype; + $options["owner"] = $lockinfo->owner; + + $options["locktoken"] = $this->_new_locktoken(); + + $stat = $this->lock($options); + } + + if(is_bool($stat)) { + $http_stat = $stat ? "200 OK" : "423 Locked"; + } else { + $http_stat = $stat; + } + + $this->http_status($http_stat); + + if ($http_stat{0} == 2) { // 2xx states are ok + if($options["timeout"]) { + // more than a million is considered an absolute timestamp + // less is more likely a relative value + if($options["timeout"]>1000000) { + $timeout = "Second-".($options['timeout']-time()); + } else { + $timeout = "Second-$options[timeout]"; + } + } else { + $timeout = "Infinite"; + } + + header('Content-Type: text/xml; charset="utf-8"'); + header("Lock-Token: <$options[locktoken]>"); + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " $options[depth]\n"; + echo " $options[owner]\n"; + echo " $timeout\n"; + echo " $options[locktoken]\n"; + echo " \n"; + echo " \n"; + echo "\n\n"; + } + } + + + // }}} + + // {{{ http_UNLOCK() + + /** + * UNLOCK method handler + * + * @param void + * @return void + */ + function http_UNLOCK() + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // strip surrounding <> + $options["token"] = substr(trim($_SERVER["HTTP_LOCK_TOKEN"]), 1, -1); + + // call user method + $stat = $this->unlock($options); + + $this->http_status($stat); + } + + // }}} + + // }}} + + // {{{ _copymove() + + function _copymove($what) + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($_SERVER["HTTP_DEPTH"])) { + $options["depth"] = $_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + extract(parse_url($_SERVER["HTTP_DESTINATION"])); + $http_host = $host; + if (isset($port) && $port != 80) + $http_host.= ":$port"; + + list($http_header_host,$http_header_port) = explode(":",$_SERVER["HTTP_HOST"]); + if (isset($http_header_port) && $http_header_port != 80) { + $http_header_host .= ":".$http_header_port; + } + + if ($http_host == $http_header_host && + !strncmp($_SERVER["SCRIPT_NAME"], $path, + strlen($_SERVER["SCRIPT_NAME"]))) { + $options["dest"] = substr($path, strlen($_SERVER["SCRIPT_NAME"])); + if (!$this->_check_lock_status($options["dest"])) { + $this->http_status("423 Locked"); + return; + } + + } else { + $options["dest_url"] = $_SERVER["HTTP_DESTINATION"]; + } + + // see RFC 2518 Sections 9.6, 8.8.4 and 8.9.3 + if (isset($_SERVER["HTTP_OVERWRITE"])) { + $options["overwrite"] = $_SERVER["HTTP_OVERWRITE"] == "T"; + } else { + $options["overwrite"] = true; + } + + $stat = $this->$what($options); + $this->http_status($stat); + } + + // }}} + + // {{{ _allow() + + /** + * check for implemented HTTP methods + * + * @param void + * @return array something + */ + function _allow() + { + // OPTIONS is always there + $allow = array("OPTIONS" =>"OPTIONS"); + + // all other METHODS need both a http_method() wrapper + // and a method() implementation + // the base class supplies wrappers only + foreach(get_class_methods($this) as $method) { + if (!strncmp("http_", $method, 5)) { + $method = strtoupper(substr($method, 5)); + if (method_exists($this, $method)) { + $allow[$method] = $method; + } + } + } + + // we can emulate a missing HEAD implemetation using GET + if (isset($allow["GET"])) + $allow["HEAD"] = "HEAD"; + + // no LOCK without checklok() + if (!method_exists($this, "checklock")) { + unset($allow["LOCK"]); + unset($allow["UNLOCK"]); + } + + return $allow; + } + + // }}} + + /** + * helper for property element creation + * + * @param string XML namespace (optional) + * @param string property name + * @param string property value + * @return array property array + */ + function mkprop() + { + $args = func_get_args(); + if (count($args) == 3) { + return array("ns" => $args[0], + "name" => $args[1], + "val" => $args[2]); + } else { + return array("ns" => "DAV:", + "name" => $args[0], + "val" => $args[1]); + } + } + + // {{{ _check_auth + + /** + * check authentication if check is implemented + * + * @param void + * @return bool true if authentication succeded or not necessary + */ + function _check_auth() + { + if (method_exists($this, "checkAuth")) { + // PEAR style method name + return $this->checkAuth(@$_SERVER["AUTH_TYPE"], + @$_SERVER["PHP_AUTH_USER"], + @$_SERVER["PHP_AUTH_PW"]); + } else if (method_exists($this, "check_auth")) { + // old (pre 1.0) method name + return $this->check_auth(@$_SERVER["AUTH_TYPE"], + @$_SERVER["PHP_AUTH_USER"], + @$_SERVER["PHP_AUTH_PW"]); + } else { + // no method found -> no authentication required + return true; + } + } + + // }}} + + // {{{ UUID stuff + + /** + * generate Unique Universal IDentifier for lock token + * + * @param void + * @return string a new UUID + */ + function _new_uuid() + { + // use uuid extension from PECL if available + if (function_exists("uuid_create")) { + return uuid_create(); + } + + // fallback + $uuid = md5(microtime().getmypid()); // this should be random enough for now + + // set variant and version fields for 'true' random uuid + $uuid{12} = "4"; + $n = 8 + (ord($uuid{16}) & 3); + $hex = "0123456789abcdef"; + $uuid{16} = $hex{$n}; + + // return formated uuid + return substr($uuid, 0, 8)."-" + . substr($uuid, 8, 4)."-" + . substr($uuid, 12, 4)."-" + . substr($uuid, 16, 4)."-" + . substr($uuid, 20); + } + + /** + * create a new opaque lock token as defined in RFC2518 + * + * @param void + * @return string new RFC2518 opaque lock token + */ + function _new_locktoken() + { + return "opaquelocktoken:".$this->_new_uuid(); + } + + // }}} + + // {{{ WebDAV If: header parsing + + /** + * + * + * @param string header string to parse + * @param int current parsing position + * @return array next token (type and value) + */ + function _if_header_lexer($string, &$pos) + { + // skip whitespace + while (ctype_space($string{$pos})) { + ++$pos; + } + + // already at end of string? + if (strlen($string) <= $pos) { + return false; + } + + // get next character + $c = $string{$pos++}; + + // now it depends on what we found + switch ($c) { + case "<": + // URIs are enclosed in <...> + $pos2 = strpos($string, ">", $pos); + $uri = substr($string, $pos, $pos2 - $pos); + $pos = $pos2 + 1; + return array("URI", $uri); + + case "[": + //Etags are enclosed in [...] + if ($string{$pos} == "W") { + $type = "ETAG_WEAK"; + $pos += 2; + } else { + $type = "ETAG_STRONG"; + } + $pos2 = strpos($string, "]", $pos); + $etag = substr($string, $pos + 1, $pos2 - $pos - 2); + $pos = $pos2 + 1; + return array($type, $etag); + + case "N": + // "N" indicates negation + $pos += 2; + return array("NOT", "Not"); + + default: + // anything else is passed verbatim char by char + return array("CHAR", $c); + } + } + + /** + * parse If: header + * + * @param string header string + * @return array URIs and their conditions + */ + function _if_header_parser($str) + { + $pos = 0; + $len = strlen($str); + + $uris = array(); + + // parser loop + while ($pos < $len) { + // get next token + $token = $this->_if_header_lexer($str, $pos); + + // check for URI + if ($token[0] == "URI") { + $uri = $token[1]; // remember URI + $token = $this->_if_header_lexer($str, $pos); // get next token + } else { + $uri = ""; + } + + // sanity check + if ($token[0] != "CHAR" || $token[1] != "(") { + return false; + } + + $list = array(); + $level = 1; + $not = ""; + while ($level) { + $token = $this->_if_header_lexer($str, $pos); + if ($token[0] == "NOT") { + $not = "!"; + continue; + } + switch ($token[0]) { + case "CHAR": + switch ($token[1]) { + case "(": + $level++; + break; + case ")": + $level--; + break; + default: + return false; + } + break; + + case "URI": + $list[] = $not."<$token[1]>"; + break; + + case "ETAG_WEAK": + $list[] = $not."[W/'$token[1]']>"; + break; + + case "ETAG_STRONG": + $list[] = $not."['$token[1]']>"; + break; + + default: + return false; + } + $not = ""; + } + + if (@is_array($uris[$uri])) { + $uris[$uri] = array_merge($uris[$uri],$list); + } else { + $uris[$uri] = $list; + } + } + + return $uris; + } + + /** + * check if conditions from "If:" headers are meat + * + * the "If:" header is an extension to HTTP/1.1 + * defined in RFC 2518 section 9.4 + * + * @param void + * @return void + */ + function _check_if_header_conditions() + { + if (isset($_SERVER["HTTP_IF"])) { + $this->_if_header_uris = + $this->_if_header_parser($_SERVER["HTTP_IF"]); + + foreach($this->_if_header_uris as $uri => $conditions) { + if ($uri == "") { + // default uri is the complete request uri + $uri = (@$_SERVER["HTTPS"] === "on" ? "https:" : "http:"); + $uri.= "//$_SERVER[HTTP_HOST]$_SERVER[SCRIPT_NAME]$_SERVER[PATH_INFO]"; + } + // all must match + $state = true; + foreach($conditions as $condition) { + // lock tokens may be free form (RFC2518 6.3) + // but if opaquelocktokens are used (RFC2518 6.4) + // we have to check the format (litmus tests this) + if (!strncmp($condition, "$", $condition)) { + return false; + } + } + if (!$this->_check_uri_condition($uri, $condition)) { + $state = false; + break; + } + } + + // any match is ok + if ($state == true) { + return true; + } + } + return false; + } + return true; + } + + /** + * Check a single URI condition parsed from an if-header + * + * Check a single URI condition parsed from an if-header + * + * @abstract + * @param string $uri URI to check + * @param string $condition Condition to check for this URI + * @returns bool Condition check result + */ + function _check_uri_condition($uri, $condition) + { + // not really implemented here, + // implementations must override + return true; + } + + + /** + * + * + * @param string path of resource to check + * @param bool exclusive lock? + */ + function _check_lock_status($path, $exclusive_only = false) + { + // FIXME depth -> ignored for now + if (method_exists($this, "checkLock")) { + // is locked? + $lock = $this->checkLock($path); + + // ... and lock is not owned? + if (is_array($lock) && count($lock)) { + // FIXME doesn't check uri restrictions yet + if (!strstr($_SERVER["HTTP_IF"], $lock["token"])) { + if (!$exclusive_only || ($lock["scope"] !== "shared")) + return false; + } + } + } + return true; + } + + + // }}} + + + /** + * Generate lockdiscovery reply from checklock() result + * + * @param string resource path to check + * @return string lockdiscovery response + */ + function lockdiscovery($path) + { + // no lock support without checklock() method + if (!method_exists($this, "checklock")) { + return ""; + } + + // collect response here + $activelocks = ""; + + // get checklock() reply + $lock = $this->checklock($path); + + // generate block for returned data + if (is_array($lock) && count($lock)) { + // check for 'timeout' or 'expires' + if (!empty($lock["expires"])) { + $timeout = "Second-".($lock["expires"] - time()); + } else if (!empty($lock["timeout"])) { + $timeout = "Second-$lock[timeout]"; + } else { + $timeout = "Infinite"; + } + + // genreate response block + $activelocks.= " + + + + $lock[depth] + $lock[owner] + $timeout + $lock[token] + + "; + } + + // return generated response + return $activelocks; + } + + /** + * set HTTP return status and mirror it in a private header + * + * @param string status code and message + * @return void + */ + function http_status($status) + { + // simplified success case + if($status === true) { + $status = "200 OK"; + } + + // remember status + $this->_http_status = $status; + + // generate HTTP status response + header("HTTP/1.1 $status"); + header("X-WebDAV-Status: $status", true); + } + + /** + * private minimalistic version of PHP urlencode() + * + * only blanks and XML special chars must be encoded here + * full urlencode() encoding confuses some clients ... + * + * @param string URL to encode + * @return string encoded URL + */ + function _urlencode($url) + { + return strtr($url, array(" "=>"%20", + "&"=>"%26", + "<"=>"%3C", + ">"=>"%3E", + )); + } + + /** + * private version of PHP urldecode + * + * not really needed but added for completenes + * + * @param string URL to decode + * @return string decoded URL + */ + function _urldecode($path) + { + return urldecode($path); + } + + /** + * UTF-8 encode property values if not already done so + * + * @param string text to encode + * @return string utf-8 encoded text + */ + function _prop_encode($text) + { + switch (strtolower($this->_prop_encoding)) { + case "utf-8": + return $text; + case "iso-8859-1": + case "iso-8859-15": + case "latin-1": + default: + return utf8_encode($text); + } + } +} + + /* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/include/HTTP/WebDAV/Tools/_parse_lockinfo.php b/include/HTTP/WebDAV/Tools/_parse_lockinfo.php new file mode 100644 index 0000000..3b32e2f --- /dev/null +++ b/include/HTTP/WebDAV/Tools/_parse_lockinfo.php @@ -0,0 +1,237 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_lockinfo.php,v 1.2 2004/01/05 12:32:40 hholzgra Exp $ +// + +/** + * helper class for parsing LOCK request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version 0.99.1dev + */ +class _parse_lockinfo +{ + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * lock type, currently only "write" + * + * @var string + * @access public + */ + var $locktype = ""; + + /** + * lock scope, "shared" or "exclusive" + * + * @var string + * @access public + */ + var $lockscope = ""; + + /** + * lock owner information + * + * @var string + * @access public + */ + var $owner = ""; + + /** + * flag that is set during lock owner read + * + * @var bool + * @access private + */ + var $collect_owner = false; + + /** + * constructor + * + * @param string path of stream to read + * @access public + */ + function _parse_lockinfo($path) + { + // we assume success unless problems occur + $this->success = true; + + // remember if any input was parsed + $had_input = false; + + // open stream + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + // create namespace aware parser + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + // set tag and data handlers + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + xml_set_character_data_handler($xml_parser, + array(&$this, "_data")); + + // we want a case sensitive parser + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + // parse input + while($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + // finish parsing + if($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + // check if required tags where found + $this->success &= !empty($this->locktype); + $this->success &= !empty($this->lockscope); + + // free parser resource + xml_parser_free($xml_parser); + + // close input stream + fclose($f_in); + } + + + /** + * tag start handler + * + * @param resource parser + * @param string tag name + * @param array tag attributes + * @return void + * @access private + */ + function _startElement($parser, $name, $attrs) + { + // namespace handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + } else { + $ns = ""; + $tag = $name; + } + + + if ($this->collect_owner) { + // everything within the tag needs to be collected + $ns_short = ""; + $ns_attr = ""; + if ($ns) { + if ($ns == "DAV:") { + $ns_short = "D:"; + } else { + $ns_attr = " xmlns='$ns'"; + } + } + $this->owner .= "<$ns_short$tag$ns_attr>"; + } else if ($ns == "DAV:") { + // parse only the essential tags + switch ($tag) { + case "write": + $this->locktype = $tag; + break; + case "exclusive": + case "shared": + $this->lockscope = $tag; + break; + case "owner": + $this->collect_owner = true; + break; + } + } + } + + /** + * data handler + * + * @param resource parser + * @param string data + * @return void + * @access private + */ + function _data($parser, $data) + { + // only the tag has data content + if ($this->collect_owner) { + $this->owner .= $data; + } + } + + /** + * tag end handler + * + * @param resource parser + * @param string tag name + * @return void + * @access private + */ + function _endElement($parser, $name) + { + // namespace handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + } else { + $ns = ""; + $tag = $name; + } + + // finished? + if (($ns == "DAV:") && ($tag == "owner")) { + $this->collect_owner = false; + } + + // within we have to collect everything + if ($this->collect_owner) { + $ns_short = ""; + $ns_attr = ""; + if ($ns) { + if ($ns == "DAV:") { + $ns_short = "D:"; + } else { + $ns_attr = " xmlns='$ns'"; + } + } + $this->owner .= ""; + } + } +} + +?> \ No newline at end of file diff --git a/include/HTTP/WebDAV/Tools/_parse_propfind.php b/include/HTTP/WebDAV/Tools/_parse_propfind.php new file mode 100644 index 0000000..15234cb --- /dev/null +++ b/include/HTTP/WebDAV/Tools/_parse_propfind.php @@ -0,0 +1,178 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_propfind.php,v 1.2 2004/01/05 12:33:22 hholzgra Exp $ +// + +/** + * helper class for parsing PROPFIND request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version 0.99.1dev + */ +class _parse_propfind +{ + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * found properties are collected here + * + * @var array + * @access public + */ + var $props = false; + + /** + * internal tag nesting depth counter + * + * @var int + * @access private + */ + var $depth = 0; + + + /** + * constructor + * + * @access public + */ + function _parse_propfind($path) + { + // success state flag + $this->success = true; + + // property storage array + $this->props = array(); + + // internal tag depth counter + $this->depth = 0; + + // remember if any input was parsed + $had_input = false; + + // open input stream + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + // create XML parser + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + // set tag and data handlers + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + + // we want a case sensitive parser + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + + // parse input + while($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + // finish parsing + if($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + // free parser + xml_parser_free($xml_parser); + + // close input stream + fclose($f_in); + + // if no input was parsed it was a request + if(!count($this->props)) $this->props = "all"; // default + } + + + /** + * start tag handler + * + * @access private + * @param resource parser + * @param string tag name + * @param array tag attributes + */ + function _startElement($parser, $name, $attrs) + { + // name space handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + // special tags at level 1: and + if ($this->depth == 1) { + if ($tag == "allprop") + $this->props = "all"; + + if ($tag == "propname") + $this->props = "names"; + } + + // requested properties are found at level 2 + if ($this->depth == 2) { + $prop = array("name" => $tag); + if ($ns) + $prop["xmlns"] = $ns; + $this->props[] = $prop; + } + + // increment depth count + $this->depth++; + } + + + /** + * end tag handler + * + * @access private + * @param resource parser + * @param string tag name + */ + function _endElement($parser, $name) + { + // here we only need to decrement the depth count + $this->depth--; + } +} + + +?> \ No newline at end of file diff --git a/include/HTTP/WebDAV/Tools/_parse_proppatch.php b/include/HTTP/WebDAV/Tools/_parse_proppatch.php new file mode 100644 index 0000000..9836ab2 --- /dev/null +++ b/include/HTTP/WebDAV/Tools/_parse_proppatch.php @@ -0,0 +1,214 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_proppatch.php,v 1.3 2004/01/05 12:41:34 hholzgra Exp $ +// + +/** + * helper class for parsing PROPPATCH request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version 0.99.1dev + */ +class _parse_proppatch +{ + /** + * + * + * @var + * @access + */ + var $success; + + /** + * + * + * @var + * @access + */ + var $props; + + /** + * + * + * @var + * @access + */ + var $depth; + + /** + * + * + * @var + * @access + */ + var $mode; + + /** + * + * + * @var + * @access + */ + var $current; + + /** + * constructor + * + * @param string path of input stream + * @access public + */ + function _parse_proppatch($path) + { + $this->success = true; + + $this->depth = 0; + $this->props = array(); + $had_input = false; + + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + + xml_set_character_data_handler($xml_parser, + array(&$this, "_data")); + + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + while($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + if($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + xml_parser_free($xml_parser); + + fclose($f_in); + } + + /** + * tag start handler + * + * @param resource parser + * @param string tag name + * @param array tag attributes + * @return void + * @access private + */ + function _startElement($parser, $name, $attrs) + { + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + if ($this->depth == 1) { + $this->mode = $tag; + } + + if ($this->depth == 3) { + $prop = array("name" => $tag); + $this->current = array("name" => $tag, "ns" => $ns, "status"=> 200); + if ($this->mode == "set") { + $this->current["val"] = ""; // default set val + } + } + + if ($this->depth >= 4) { + $this->current["val"] .= "<$tag"; + foreach ($attr as $key => $val) { + $this->current["val"] .= ' '.$key.'="'.str_replace('"','"', $val).'"'; + } + $this->current["val"] .= ">"; + } + + + + $this->depth++; + } + + /** + * tag end handler + * + * @param resource parser + * @param string tag name + * @return void + * @access private + */ + function _endElement($parser, $name) + { + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + $this->depth--; + + if ($this->depth >= 4) { + $this->current["val"] .= ""; + } + + if ($this->depth == 3) { + if (isset($this->current)) { + $this->props[] = $this->current; + unset($this->current); + } + } + } + + /** + * input data handler + * + * @param resource parser + * @param string data + * @return void + * @access private + */ + function _data($parser, $data) { + if (isset($this->current)) { + $this->current["val"] .= $data; + } + } +} + +?> \ No newline at end of file diff --git a/include/Plugin/Editor.php b/include/Plugin/Editor.php new file mode 100644 index 0000000..9de3b2f --- /dev/null +++ b/include/Plugin/Editor.php @@ -0,0 +1,290 @@ +plug_barrel = $plug_barrel; + $this->plug_page = $plug_page; + $this->plug_page_wperms = $plug_page_wperms; + } + + + /** Run the plugin editor. + * + * @param $page + * @param $outputvar + */ + function run(&$page, $outputvar = '') + { + global $globals; + + $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; + $target = isset($_REQUEST['plug_target']) ? $_REQUEST['plug_target'] : ''; + + // load all available plugins + $cachefile = $globals->plugins->cacheFile($this->plug_barrel); + + // if the tree cache does not exits, try to init it + if (!file_exists($cachefile)) { + $globals->plugins->compileCache($cachefile, $this->plug_barrel); + } + $cache = $globals->plugins->readCache($cachefile, $this->plug_barrel); + $available = $globals->plugins->cachedAvailable($cache, $this->plug_barrel, $this->plug_page); + + + // handle updates + switch ($action) { + case "move_up": case "move_down": + if ($this->readonly) die("Sorry, this plugin view is read-only."); + + $delta = ($action == "move_down") ? 1 : -1; + //$page->info("moving plugin '$target'.."); + $plugcache_a = $globals->plugins->cacheGet($cache, $this->plug_barrel, $this->plug_page, $target); + $plug_a =& $globals->plugins->load($plugcache_a); + //$plug_a =& $globals->plugins->get($target); + + if (is_object($plug_a) && ($plug_a->active)) { + $old_pos = $plug_a->pos; + //$plug_b =& $globals->plugins->getAtPos($old_pos + $delta); + $plugcache_b = $globals->plugins->cacheGetAtPos($cache, $this->plug_barrel, $this->plug_page, $old_pos + $delta); + + if (is_array($plugcache_b)) + { + $plug_b =& $globals->plugins->load($plugcache_b); + + // swap the current plugin and the next plugin + if (is_object($plug_b) && ($plug_b->active)) + { + $plug_a->writeParams($this->plug_barrel, $this->plug_page, $old_pos + $delta); + $plug_b->writeParams($this->plug_barrel, $this->plug_page, $old_pos); + } + } + } + $globals->plugins->compileCache($cachefile, $this->plug_barrel); + $cache = $globals->plugins->readCache($cachefile, $this->plug_barrel); + $available = $globals->plugins->cachedAvailable($cache, $this->plug_barrel, $this->plug_page); + break; + + case "update": + if ($this->readonly) die("Sorry, this plugin view is read-only."); + + // list of active plugins + $active = array(); + if (isset($_REQUEST['plugins_active'])) { + $active = array_values($_REQUEST['plugins_active']); + } + + foreach ($available as $plugin) { + $plugentry =& $globals->plugins->cacheGet($cache, $this->plug_barrel, $this->plug_page, $plugin); + if (!is_array($plugentry) and $this->plug_page) { + $plugentry = $globals->plugins->cacheGet($cache, $this->plug_barrel, 0, $plugin); + if (is_array($plugentry)) + { + $plugentry['active'] = 0; + } + } + + // check we have a valid cache entry + if (!is_array($plugentry)) { + $page->info("could not find plugin '$plugin' in cache for barrel '{$this->plug_barrel}'"); + return; + } + + $plug_h =& $globals->plugins->load($plugentry); + + if (is_object($plug_h) && is_array($plugentry)) { + $pos = array_search($plugin, $active); + + if ($pos !== false) { + // check the plugin is allowed in the current context + if ($this->plug_barrel and $this->plug_page) { + $wperms = $this->plug_page_wperms; + + // $page->info("checking plugin '$plugin' vs. write permissions '$wperms'.."); + if (!$plug_h->allow_wperms($wperms)) + { + $page->info("plugin '$plugin' is not allowed with write permissions '$wperms'!"); + break; + } + } + + // retrieve parameters from REQUEST + foreach ($plug_h->params as $key => $val) + { + if (isset($_REQUEST[$plug_h->name."_".$key])) { + $plug_h->params[$key] = $_REQUEST[$plug_h->name."_".$key]; + } + } + + // write parameters to database + $plug_h->writeParams($this->plug_barrel, $this->plug_page, $pos); + } else { + // erase parameters from database + $plug_h->eraseParams($this->plug_barrel, $this->plug_page); + } + } + } + + // log this action + if ($this->plug_barrel) + { + if ($this->plug_page) + { + $page->log('page_plugins', $this->plug_barrel.":".$this->plug_page); + } else { + $page->log('barrel_plugins', $this->plug_barrel.":*"); + } + } + + $globals->plugins->compileCache($cachefile, $this->plug_barrel); + $cache = $globals->plugins->readCache($cachefile, $this->plug_barrel); + $available = $globals->plugins->cachedAvailable($cache, $this->plug_barrel, $this->plug_page); + break; + } + + // get dump of plugins to fill out form + $page->assign('plug_barrel', $this->plug_barrel); + $page->assign('plug_page', $this->plug_page); + + $plugs = array(); + + // start by adding the active plugins + foreach ($cache as $plugcache) + { + if (in_array($plugcache['plugin'], $available) and ($plugcache['page'] == $this->plug_page) and ($plugcache['active'])) + { + // check we have a valid plugin handle + $plug_h = $globals->plugins->load($plugcache); + if (!is_object($plug_h)) { + + $page->info("could not load disabled plugin '{$plugcache['plugin']}' in barrel '{$this->plug_barrel}'"); + + } else { + + $plugentry = $plug_h->dump(); + $plugentry['icon'] = $globals->icons->get_action_icon('plugins'); + $type = $plugentry['type']; + if (!empty($plugs[$type])) { + $plugentry['move_up'] = 1; + $last = count($plugs[$type]) - 1; + $plugs[$type][$last]['move_down'] = 1; + } else { + $plugs[$type] = array(); + } + array_push($plugs[$type], $plugentry); + + } + } + } + + // next we add the disabled plugins + if (!$this->readonly) + { + foreach ($available as $plugname) + { + $plugcache = $globals->plugins->cacheGet($cache, $this->plug_barrel, $this->plug_page, $plugname); + if (!is_array($plugcache) or !$plugcache['active']) + { + $plugcache = $globals->plugins->cacheGet($cache, $this->plug_barrel, 0, $plugname); + $plugcache['active'] = 0; + $plug_h = $globals->plugins->load($plugcache); + if (!is_object($plug_h)) { + $page->info("could not load disabled plugin '$plugname' in barrel '{$this->plug_barrel}'"); + return; + } + + $plugentry = $plug_h->dump(); + $plugentry['icon'] = $globals->icons->get_action_icon('plugins'); + $type = $plugentry['type']; + if (empty($plugs[$type])) { + $plugs[$type] = array(); + } + array_push($plugs[$type], $plugentry); + } + } + } + + /* + echo "plugins
";
+    print_r($plugs);
+    echo "
"; + */ + $page->assign('plugins', $plugs); + + // values + $page->assign('show_params', $this->show_params); + $page->assign('readonly',$this->readonly); + + // translations + $page->assign('msg_submit', __("Submit")); + $page->assign('msg_plugedit_plugin', __("plugin")); + $page->assign('msg_plugedit_plugins', __("plugins")); + $page->assign('msg_plugedit_description', __("description")); + $page->assign('msg_plugedit_parameters', __("parameters")); + $page->assign('msg_move_up', __("move up")); + $page->assign('msg_move_down', __("move down")); + + // if requested, assign the content to be displayed + if (!empty($outputvar)) { + $page->assign($outputvar, $page->fetch('plugin-editor.tpl')); + } + } + + + /** Do not display plugin parameters. + * + * @param $hide boolean + */ + function hide_params($hide) + { + $this->show_params = !$hide; + } + +} + +?> diff --git a/include/Plugin/Filter.php b/include/Plugin/Filter.php new file mode 100644 index 0000000..58dcd85 --- /dev/null +++ b/include/Plugin/Filter.php @@ -0,0 +1,86 @@ +name; + + $mask = "/(\{$name(\s+[^\}]*)?\})/"; + $bits = preg_split($mask, $input, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + $output = ""; + while($bit = array_shift($bits)) { + if (preg_match($mask, $bit)) { + $argstr = array_shift($bits); + $argbits = preg_split("/\s/", trim($argstr)); + $args = array(); + foreach($argbits as $argbit) + { + if (preg_match('/([a-zA-Z]+)=([\'"])(.*)\2$/', $argbit, $matches)) { + $args[$matches[1]] = $matches[3]; + } + } + $output .= $this->show($args); + } else { + $output .= $bit; + } + } + return $output; + } + + + /** Show an instance of the plugin. This is called by filter() every time + * a tag representing the plugin is found. + */ + function show() + { + return ''; + } + + +} + +?> diff --git a/include/Plugin/Render.php b/include/Plugin/Render.php new file mode 100644 index 0000000..0165f8d --- /dev/null +++ b/include/Plugin/Render.php @@ -0,0 +1,49 @@ + diff --git a/include/Plugin/Skel.php b/include/Plugin/Skel.php new file mode 100644 index 0000000..093000d --- /dev/null +++ b/include/Plugin/Skel.php @@ -0,0 +1,155 @@ +params[$key])) { + $this->params[$key] = $val; + } + } + } + + + /** Erase parameters from database. + * + * @param $barrel + * @param $page + */ + function eraseParams($barrel = '', $page = 0) + { + global $globals; + + //echo $this->name . " : deleteParams($barrel, $page)
\n"; + $globals->db->query("delete from diogenes_plugin where plugin='{$this->name}' and barrel='$barrel' and page='$page'"); + + $this->active = 0; + unset($this->pos); + foreach ($this->params as $key => $val) + { + $this->params[$key] = ''; + } + } + + + /** Store parameters to database. + * + * @param $barrel + * @param $page + * @param $pos + */ + function writeParams($barrel = '', $page = 0, $pos = 0) + { + global $globals; + + $this->pos = $pos; + $this->active = 1; + + $params = ''; + foreach ($this->params as $key => $val) + { + //echo $this->name . " $key=$val
"; + $params .= "$key=$val\0"; + } + $globals->db->query("replace into diogenes_plugin set plugin='{$this->name}', barrel='$barrel', page='$page', pos='$pos', params='$params'"); + } + + + /** Dump parameters to a table. + */ + function dump() + { + $plugentr = array(); + + // copy over properties + $props = array('active', 'name', 'params', 'description', 'version', 'type', 'pos'); + foreach ($props as $prop) + { + if (isset($this->$prop)) + { + $plugentr[$prop] = stripslashes_recurse($this->$prop); + } + } + return $plugentr; + } + +} + +?> diff --git a/include/Plugins.php b/include/Plugins.php new file mode 100644 index 0000000..dc55ac7 --- /dev/null +++ b/include/Plugins.php @@ -0,0 +1,337 @@ +dbh =& $dbh; + $this->plugdir = $plugdir; + $this->cachedir = $cachedir; + } + + + /** Return the path of the cache file + * + * @param $barrel + */ + function cacheFile($barrel) + { + $cachefile = $this->cachedir . "/" . ($barrel ? $barrel : "__diogenes__") . ".plugins"; + return $cachefile; + } + + + /** Return the cache entry for specified plugin + * + * @param $cache + * @param $barrel + * @param $page + * @param $plugin + */ + function cacheGet($cache, $barrel, $page, $plugin) + { + foreach ($cache as $plugentry) + { + if (($plugentry['plugin'] == $plugin) && ($plugentry['page'] == $page)) + { + return $plugentry; + } + } + return; + } + + + /** Return the cache entry for a plugin at a specified position + * + * @param $cache + * @param $barrel + * @param $page + * @param $pos + */ + function cacheGetAtPos($cache, $barrel, $page, $pos) + { + foreach ($cache as $plugentry) + { + if (($plugentry['pos'] == $pos) && ($plugentry['page'] == $page)) + { + return $plugentry; + } + } + } + + + /** List the plugins that are active in a given context + * + * @param $cache + * @param $barrel + * @param $page + */ + function cachedActive($cache, $barrel, $page) + { + $plugins = array(); + foreach ($cache as $plug) + { + if ($plug['page'] == $page) + { + array_push($plugins, $plug); + } + } + return $plugins; + } + + + /** Returns an array of cache entries representing the available plugins + * in a given context + * + * @param $cache + * @param $barrel + * @param $page + */ + function cachedAvailable($cache, $barrel, $page) + { + $available = array(); + foreach ($cache as $plugentry) + { + $plugfile = $this->plugdir."/".$plugentry['plugin'].".php"; + if (file_exists($plugfile) and ($plugentry['page'] == 0) and (!$page or $plugentry['active'])) + { + array_push($available, $plugentry['plugin']); + } + } + return $available; + } + + + /** Remove database references to plugins that are not available. + */ + function clean_database(&$page) + { + /* + $res = $this->dbh->query("select distinct plugin from diogenes_plugin"); + while (list($plugname) = mysql_fetch_row($res)) + { + $page->info("examining $plugname.."); + $plug = $this->load($plugname); + if (!is_object($plug)) { + $page->info("plugin $plugname is broken, removing"); + $this->dbh->query("delete from diogenes_plugin where plugin='$plugname'"); + } + } + mysql_free_result($res); + */ + } + + + /** Compile plugin cache. + * + * @param $cachefile + * @param $barrel + */ + function compileCache($cachefile, $barrel) + { + if (!$fp = fopen($cachefile, "w")) { + trigger_error("failed to open '$cachefile' for writing", E_USER_ERROR); + } + + // get the list of available plugins + $available = array(); + if (!$barrel) { + + $plugfiles = System::find($this->plugdir.' -type f -name *.php'); + foreach ($plugfiles as $file) { + $name = basename($file); + $name = substr($name, 0, -4); + array_push($available, $name); + } + + } else { + + $sql = "select plugin from diogenes_plugin where page=0 AND barrel=''"; + $res = $this->dbh->query($sql); + while (list($plugin) = mysql_fetch_row($res)) + { + array_push($available, $plugin); + } + mysql_free_result($res); + } + +/* + echo "compile : available
";
+   print_r($available);
+   echo "
"; +*/ + // get active plugins + $sql = "select page, pos, plugin, params from diogenes_plugin where barrel='{$barrel}' order by page, pos"; + $res = $this->dbh->query($sql); + $active = array(); + while ($row = mysql_fetch_row($res)) + { + $plugin = $row[2]; + if (in_array($plugin, $available)) { + array_unshift($row, 1); + fputs($fp, join("\t", $row) . "\n"); + if (!$row[1]) { + array_push($active, $plugin); + //echo "compileCache : adding active plugin $plugin
"; + } + } + } + mysql_free_result($res); + + // add inactive plugins + foreach ($available as $plugin) + { + if (!in_array($plugin, $active)) + { + //echo "compileCache : adding inactive plugin $plugin
"; + $row = array(0, 0, 0, $plugin, ''); + fputs($fp, join("\t", $row) . "\n"); + } + } + + fclose($fp); + + //$this->log("rcs_commit","{$this->alias}:$dir/$file:$message"); + + } + + + /** Load the specified plugin + * + * @param $plugentry + */ + function load($plugentry) + { + $plugin = $plugentry['plugin']; + $plugfile = $this->plugdir."/$plugin.php"; + if (!file_exists($plugfile)) { + trigger_error("could not find plugin file '$plugfile'", E_USER_WARNING); + return; + } + + include_once($plugfile); + + if (!class_exists($plugin)) { + trigger_error("could not find class '$plugin'", E_USER_WARNING); + return; + } + + // load and register plugin + $plug = new $plugin(); + $plug->pos = $plugentry['pos']; + $plug->active = $plugentry['active']; + $plug->setParams($plugentry['params']); + $this->loaded[$plugin] =& $plug; + + return $plug; + } + + + /** Read the compiled plugin cache + * + * @param $cachefile + * @param $barrel + */ + function readCache($cachefile, $barrel) + { + if (!file_exists($cachefile)) { + return array(); + } + + if (!$fp = fopen($cachefile, "r")) { + trigger_error("failed to open '$cachefile' for reading", E_USER_WARNING); + return; + } + + $plugins = array(); + while ($line = fgets($fp)) + { + // drop end of line + $line = substr($line, 0, -1); + $bits = explode("\t", $line); + $plug = array( + 'active' => $bits[0], + 'page' => $bits[1], + 'pos' => $bits[2], + 'plugin' => $bits[3], + 'params' => $bits[4], + ); + array_push($plugins, $plug); + } + + fclose($fp); + + return $plugins; + } + + + /** Prepare plugins trace for output + */ + function trace_format() + { + $out = ""; + foreach ($this->loaded as $key => $val) + { + $out .= ''; + $out .= ''; + if (isset($val->pos)) { + $out .= ''; + } + $out .= ''; + $out .= ''; + if (empty($val->params)) { + $out .= ''; + foreach ($val->params as $skey => $sval) + { + $out .= ""; + } + } + $out .= "
'.$key.' v'.$val->version.'
position'.$val->pos.'
type'.$val->type.'
description'.$val->description.'
parameters
$skey$sval

"; + } + return $out; + } + + + +} + +?> diff --git a/include/Text/Wiki.php b/include/Text/Wiki.php new file mode 100644 index 0000000..cf54c63 --- /dev/null +++ b/include/Text/Wiki.php @@ -0,0 +1,1280 @@ + +* +* @license LGPL +* +* @version $Id: Wiki.php,v 1.29 2005/02/24 17:26:29 pmjones Exp $ +* +*/ + +/** +* The baseline abstract parser class. +*/ + +require_once 'Text/Wiki/Parse.php'; + +/** +* The baseline abstract render class. +*/ + +require_once 'Text/Wiki/Render.php'; + + +/** +* +* Parse structured wiki text and render into arbitrary formats such as XHTML. +* +* This is the "master" class for handling the management and convenience +* functions to transform Wiki-formatted text. +* +* @category Text +* +* @package Text_Wiki +* +<<<<<<< Wiki.php +* @version 0.25.0 +* +* @license LGPL +======= +* @author Paul M. Jones +* +* @version @package_version@ +>>>>>>> 1.28 +* +*/ + +class Text_Wiki { + + /** + * + * The default list of rules, in order, to apply to the source text. + * + * @access public + * + * @var array + * + */ + + var $rules = array( + 'Prefilter', + 'Delimiter', + 'Code', + 'Function', + 'Html', + 'Raw', + 'Include', + 'Embed', + 'Anchor', + 'Heading', + 'Toc', + 'Horiz', + 'Break', + 'Blockquote', + 'List', + 'Deflist', + 'Table', + 'Image', + 'Phplookup', + 'Center', + 'Newline', + 'Paragraph', + 'Url', + 'Freelink', + 'Interwiki', + 'Wikilink', + 'Colortext', + 'Strong', + 'Bold', + 'Emphasis', + 'Italic', + 'Tt', + 'Superscript', + 'Subscript', + 'Revise', + 'Tighten' + ); + + + /** + * + * The list of rules to not-apply to the source text. + * + * @access public + * + * @var array + * + */ + + var $disable = array( + 'Html', + 'Include', + 'Embed' + ); + + + /** + * + * Custom configuration for rules at the parsing stage. + * + * In this array, the key is the parsing rule name, and the value is + * an array of key-value configuration pairs corresponding to the $conf + * property in the target parsing rule. + * + * For example: + * + * + * $parseConf = array( + * 'Include' => array( + * 'base' => '/path/to/scripts/' + * ) + * ); + * + * + * Note that most default rules do not need any parsing configuration. + * + * @access public + * + * @var array + * + */ + + var $parseConf = array(); + + + /** + * + * Custom configuration for rules at the rendering stage. + * + * Because rendering may be different for each target format, the + * first-level element in this array is always a format name (e.g., + * 'Xhtml'). + * + * Within that first level element, the subsequent elements match the + * $parseConf format. That is, the sub-key is the rendering rule name, + * and the sub-value is an array of key-value configuration pairs + * corresponding to the $conf property in the target rendering rule. + * + * @access public + * + * @var array + * + */ + + var $renderConf = array( + 'Docbook' => array(), + 'Latex' => array(), + 'Pdf' => array(), + 'Plain' => array(), + 'Rtf' => array(), + 'Xhtml' => array() + ); + + + /** + * + * Custom configuration for the output format itself. + * + * Even though Text_Wiki will render the tokens from parsed text, + * the format itself may require some configuration. For example, + * RTF needs to know font names and sizes, PDF requires page layout + * information, and DocBook needs a section hierarchy. This array + * matches the $conf property of the the format-level renderer + * (e.g., Text_Wiki_Render_Xhtml). + * + * In this array, the key is the rendering format name, and the value is + * an array of key-value configuration pairs corresponding to the $conf + * property in the rendering format rule. + * + * @access public + * + * @var array + * + */ + + var $formatConf = array( + 'Docbook' => array(), + 'Latex' => array(), + 'Pdf' => array(), + 'Plain' => array(), + 'Rtf' => array(), + 'Xhtml' => array() + ); + + + /** + * + * The delimiter for token numbers of parsed elements in source text. + * + * @access public + * + * @var string + * + */ + + var $delim = "\xFF"; + + + /** + * + * The tokens generated by rules as the source text is parsed. + * + * As Text_Wiki applies rule classes to the source text, it will + * replace portions of the text with a delimited token number. This + * is the array of those tokens, representing the replaced text and + * any options set by the parser for that replaced text. + * + * The tokens array is sequential; each element is itself a sequential + * array where element 0 is the name of the rule that generated the + * token, and element 1 is an associative array where the key is an + * option name and the value is an option value. + * + * @access private + * + * @var array + * + */ + + var $tokens = array(); + + + /** + * + * The source text to which rules will be applied. + * + * This text will be transformed in-place, which means that it will + * change as the rules are applied. + * + * @access private + * + * @var string + * + */ + + var $source = ''; + + + /** + * + * Array of rule parsers. + * + * Text_Wiki creates one instance of every rule that is applied to + * the source text; this array holds those instances. The array key + * is the rule name, and the array value is an instance of the rule + * class. + * + * @access private + * + * @var array + * + */ + + var $parseObj = array(); + + + /** + * + * Array of rule renderers. + * + * Text_Wiki creates one instance of every rule that is applied to + * the source text; this array holds those instances. The array key + * is the rule name, and the array value is an instance of the rule + * class. + * + * @access private + * + * @var array + * + */ + + var $renderObj = array(); + + + /** + * + * Array of format renderers. + * + * @access private + * + * @var array + * + */ + + var $formatObj = array(); + + + /** + * + * Array of paths to search, in order, for parsing and rendering rules. + * + * @access private + * + * @var array + * + */ + + var $path = array( + 'parse' => array(), + 'render' => array() + ); + + + + /** + * + * The directory separator character. + * + * @access private + * + * @var string + * + */ + + var $_dirSep = DIRECTORY_SEPARATOR; + + + /** + * + * Constructor. + * + * @access public + * + * @param array $rules The set of rules to load for this object. + * + */ + + function Text_Wiki($rules = null) + { + if (is_array($rules)) { + $this->rules = $rules; + } + + $this->addPath( + 'parse', + $this->fixPath(dirname(__FILE__)) . 'Wiki/Parse/Default/' + ); + + $this->addPath( + 'render', + $this->fixPath(dirname(__FILE__)) . 'Wiki/Render/' + ); + + } + + + /** + * + * Set parser configuration for a specific rule and key. + * + * @access public + * + * @param string $rule The parse rule to set config for. + * + * @param array|string $arg1 The full config array to use for the + * parse rule, or a conf key in that array. + * + * @param string $arg2 The config value for the key. + * + * @return void + * + */ + + function setParseConf($rule, $arg1, $arg2 = null) + { + $rule = ucwords(strtolower($rule)); + + if (! isset($this->parseConf[$rule])) { + $this->parseConf[$rule] = array(); + } + + // if first arg is an array, use it as the entire + // conf array for the rule. otherwise, treat arg1 + // as a key and arg2 as a value for the rule conf. + if (is_array($arg1)) { + $this->parseConf[$rule] = $arg1; + } else { + $this->parseConf[$rule][$arg1] = $arg2; + } + } + + + /** + * + * Get parser configuration for a specific rule and key. + * + * @access public + * + * @param string $rule The parse rule to get config for. + * + * @param string $key A key in the conf array; if null, + * returns the entire conf array. + * + * @return mixed The whole conf array if no key is specified, + * or the specific conf key value. + * + */ + + function getParseConf($rule, $key = null) + { + $rule = ucwords(strtolower($rule)); + + // the rule does not exist + if (! isset($this->parseConf[$rule])) { + return null; + } + + // no key requested, return the whole array + if (is_null($key)) { + return $this->parseConf[$rule]; + } + + // does the requested key exist? + if (isset($this->parseConf[$rule][$key])) { + // yes, return that value + return $this->parseConf[$rule][$key]; + } else { + // no + return null; + } + } + + + /** + * + * Set renderer configuration for a specific format, rule, and key. + * + * @access public + * + * @param string $format The render format to set config for. + * + * @param string $rule The render rule to set config for in the format. + * + * @param array|string $arg1 The config array, or the config key + * within the render rule. + * + * @param string $arg2 The config value for the key. + * + * @return void + * + */ + + function setRenderConf($format, $rule, $arg1, $arg2 = null) + { + $format = ucwords(strtolower($format)); + $rule = ucwords(strtolower($rule)); + + if (! isset($this->renderConf[$format])) { + $this->renderConf[$format] = array(); + } + + if (! isset($this->renderConf[$format][$rule])) { + $this->renderConf[$format][$rule] = array(); + } + + // if first arg is an array, use it as the entire + // conf array for the render rule. otherwise, treat arg1 + // as a key and arg2 as a value for the render rule conf. + if (is_array($arg1)) { + $this->renderConf[$format][$rule] = $arg1; + } else { + $this->renderConf[$format][$rule][$arg1] = $arg2; + } + } + + + /** + * + * Get renderer configuration for a specific format, rule, and key. + * + * @access public + * + * @param string $format The render format to get config for. + * + * @param string $rule The render format rule to get config for. + * + * @param string $key A key in the conf array; if null, + * returns the entire conf array. + * + * @return mixed The whole conf array if no key is specified, + * or the specific conf key value. + * + */ + + function getRenderConf($format, $rule, $key = null) + { + $format = ucwords(strtolower($format)); + $rule = ucwords(strtolower($rule)); + + if (! isset($this->renderConf[$format]) || + ! isset($this->renderConf[$format][$rule])) { + return null; + } + + // no key requested, return the whole array + if (is_null($key)) { + return $this->renderConf[$format][$rule]; + } + + // does the requested key exist? + if (isset($this->renderConf[$format][$rule][$key])) { + // yes, return that value + return $this->renderConf[$format][$rule][$key]; + } else { + // no + return null; + } + + } + + /** + * + * Set format configuration for a specific rule and key. + * + * @access public + * + * @param string $format The format to set config for. + * + * @param string $key The config key within the format. + * + * @param string $val The config value for the key. + * + * @return void + * + */ + + function setFormatConf($format, $arg1, $arg2 = null) + { + if (! is_array($this->formatConf[$format])) { + $this->formatConf[$format] = array(); + } + + // if first arg is an array, use it as the entire + // conf array for the format. otherwise, treat arg1 + // as a key and arg2 as a value for the format conf. + if (is_array($arg1)) { + $this->formatConf[$format] = $arg1; + } else { + $this->formatConf[$format][$arg1] = $arg2; + } + } + + + + /** + * + * Get configuration for a specific format and key. + * + * @access public + * + * @param string $format The format to get config for. + * + * @param mixed $key A key in the conf array; if null, + * returns the entire conf array. + * + * @return mixed The whole conf array if no key is specified, + * or the specific conf key value. + * + */ + + function getFormatConf($format, $key = null) + { + // the format does not exist + if (! isset($this->formatConf[$format])) { + return null; + } + + // no key requested, return the whole array + if (is_null($key)) { + return $this->formatConf[$format]; + } + + // does the requested key exist? + if (isset($this->formatConf[$format][$key])) { + // yes, return that value + return $this->formatConf[$format][$key]; + } else { + // no + return null; + } + } + + + /** + * + * Inserts a rule into to the rule set. + * + * @access public + * + * @param string $name The name of the rule. Should be different from + * all other keys in the rule set. + * + * @param string $tgt The rule after which to insert this new rule. By + * default (null) the rule is inserted at the end; if set to '', inserts + * at the beginning. + * + * @return void + * + */ + + function insertRule($name, $tgt = null) + { + $name = ucwords(strtolower($name)); + if (! is_null($tgt)) { + $tgt = ucwords(strtolower($tgt)); + } + + // does the rule name to be inserted already exist? + if (in_array($name, $this->rules)) { + // yes, return + return null; + } + + // the target name is not null, and not '', but does not exist + // in the list of rules. this means we're trying to insert after + // a target key, but the target key isn't there. + if (! is_null($tgt) && $tgt != '' && + ! in_array($tgt, $this->rules)) { + return false; + } + + // if $tgt is null, insert at the end. We know this is at the + // end (instead of resetting an existing rule) becuase we exited + // at the top of this method if the rule was already in place. + if (is_null($tgt)) { + $this->rules[] = $name; + return true; + } + + // save a copy of the current rules, then reset the rule set + // so we can insert in the proper place later. + // where to insert the rule? + if ($tgt == '') { + // insert at the beginning + array_unshift($this->rules, $name); + return true; + } + + // insert after the named rule + $tmp = $this->rules; + $this->rules = array(); + + foreach ($tmp as $val) { + $this->rules[] = $val; + if ($val == $tgt) { + $this->rules[] = $name; + } + } + + return true; + + } + + + /** + * + * Delete (remove or unset) a rule from the $rules property. + * + * @access public + * + * @param string $rule The name of the rule to remove. + * + * @return void + * + */ + + function deleteRule($name) + { + $name = ucwords(strtolower($name)); + $key = array_search($name, $this->rules); + if ($key !== false) { + unset($this->rules[$key]); + } + } + + + /** + * + * Change from one rule to another in-place. + * + * @access public + * + * @param string $old The name of the rule to change from. + * + * @param string $new The name of the rule to change to. + * + * @return void + * + */ + + function changeRule($old, $new) + { + $old = ucwords(strtolower($old)); + $new = ucwords(strtolower($new)); + $key = array_search($old, $this->rules); + if ($key !== false) { + $this->rules[$old] = $new; + } + } + + + /** + * + * Enables a rule so that it is applied when parsing. + * + * @access public + * + * @param string $rule The name of the rule to enable. + * + * @return void + * + */ + + function enableRule($name) + { + $name = ucwords(strtolower($name)); + $key = array_search($name, $this->disable); + if ($key !== false) { + unset($this->disable[$key]); + } + } + + + /** + * + * Disables a rule so that it is not applied when parsing. + * + * @access public + * + * @param string $rule The name of the rule to disable. + * + * @return void + * + */ + + function disableRule($name) + { + $name = ucwords(strtolower($name)); + $key = array_search($name, $this->disable); + if ($key === false) { + $this->disable[] = $name; + } + } + + + /** + * + * Parses and renders the text passed to it, and returns the results. + * + * First, the method parses the source text, applying rules to the + * text as it goes. These rules will modify the source text + * in-place, replacing some text with delimited tokens (and + * populating the $this->tokens array as it goes). + * + * Next, the method renders the in-place tokens into the requested + * output format. + * + * Finally, the method returns the transformed text. Note that the + * source text is transformed in place; once it is transformed, it is + * no longer the same as the original source text. + * + * @access public + * + * @param string $text The source text to which wiki rules should be + * applied, both for parsing and for rendering. + * + * @param string $format The target output format, typically 'xhtml'. + * If a rule does not support a given format, the output from that + * rule is rule-specific. + * + * @return string The transformed wiki text. + * + */ + + function transform($text, $format = 'Xhtml') + { + $this->parse($text); + return $this->render($format); + } + + + /** + * + * Sets the $_source text property, then parses it in place and + * retains tokens in the $_tokens array property. + * + * @access public + * + * @param string $text The source text to which wiki rules should be + * applied, both for parsing and for rendering. + * + * @return void + * + */ + + function parse($text) + { + // set the object property for the source text + $this->source = $text; + + // reset the tokens. + $this->tokens = array(); + + // apply the parse() method of each requested rule to the source + // text. + foreach ($this->rules as $name) { + // do not parse the rules listed in $disable + if (! in_array($name, $this->disable)) { + + // load the parsing object + $this->loadParseObj($name); + + // load may have failed; only parse if + // an object is in the array now + if (is_object($this->parseObj[$name])) { + $this->parseObj[$name]->parse(); + } + } + } + } + + + /** + * + * Renders tokens back into the source text, based on the requested format. + * + * @access public + * + * @param string $format The target output format, typically 'xhtml'. + * If a rule does not support a given format, the output from that + * rule is rule-specific. + * + * @return string The transformed wiki text. + * + */ + + function render($format = 'Xhtml') + { + // the rendering method we're going to use from each rule + $format = ucwords(strtolower($format)); + + // the eventual output text + $output = ''; + + // when passing through the parsed source text, keep track of when + // we are in a delimited section + $in_delim = false; + + // when in a delimited section, capture the token key number + $key = ''; + + // load the format object + $this->loadFormatObj($format); + + // pre-rendering activity + if (is_object($this->formatObj[$format])) { + $output .= $this->formatObj[$format]->pre(); + } + + // load the render objects + foreach (array_keys($this->parseObj) as $rule) { + $this->loadRenderObj($format, $rule); + } + + // pass through the parsed source text character by character + $k = strlen($this->source); + for ($i = 0; $i < $k; $i++) { + + // the current character + $char = $this->source{$i}; + + // are alredy in a delimited section? + if ($in_delim) { + + // yes; are we ending the section? + if ($char == $this->delim) { + + // yes, get the replacement text for the delimited + // token number and unset the flag. + $key = (int)$key; + $rule = $this->tokens[$key][0]; + $opts = $this->tokens[$key][1]; + $output .= $this->renderObj[$rule]->token($opts); + $in_delim = false; + + } else { + + // no, add to the dlimited token key number + $key .= $char; + + } + + } else { + + // not currently in a delimited section. + // are we starting into a delimited section? + if ($char == $this->delim) { + // yes, reset the previous key and + // set the flag. + $key = ''; + $in_delim = true; + } else { + // no, add to the output as-is + $output .= $char; + } + } + } + + // post-rendering activity + if (is_object($this->formatObj[$format])) { + $output .= $this->formatObj[$format]->post(); + } + + // return the rendered source text. + return $output; + } + + + /** + * + * Returns the parsed source text with delimited token placeholders. + * + * @access public + * + * @return string The parsed source text. + * + */ + + function getSource() + { + return $this->source; + } + + + /** + * + * Returns tokens that have been parsed out of the source text. + * + * @access public + * + * @param array $rules If an array of rule names is passed, only return + * tokens matching these rule names. If no array is passed, return all + * tokens. + * + * @return array An array of tokens. + * + */ + + function getTokens($rules = null) + { + if (is_null($rules)) { + return $this->tokens; + } else { + settype($rules, 'array'); + $result = array(); + foreach ($this->tokens as $key => $val) { + if (in_array($val[0], $rules)) { + $result[] = $val; + } + } + return $result; + } + } + + + /** + * + * Add a token to the Text_Wiki tokens array, and return a delimited + * token number. + * + * @access public + * + * @param array $options An associative array of options for the new + * token array element. The keys and values are specific to the + * rule, and may or may not be common to other rule options. Typical + * options keys are 'text' and 'type' but may include others. + * + * @param boolean $id_only If true, return only the token number, not + * a delimited token string. + * + * @return string|int By default, return the number of the + * newly-created token array element with a delimiter prefix and + * suffix; however, if $id_only is set to true, return only the token + * number (no delimiters). + * + */ + + function addToken($rule, $options = array(), $id_only = false) + { + // increment the token ID number. note that if you parse + // multiple times with the same Text_Wiki object, the ID number + // will not reset to zero. + static $id; + if (! isset($id)) { + $id = 0; + } else { + $id ++; + } + + // force the options to be an array + settype($options, 'array'); + + // add the token + $this->tokens[$id] = array( + 0 => $rule, + 1 => $options + ); + + // return a value + if ($id_only) { + // return the last token number + return $id; + } else { + // return the token number with delimiters + return $this->delim . $id . $this->delim; + } + } + + + /** + * + * Set or re-set a token with specific information, overwriting any + * previous rule name and rule options. + * + * @access public + * + * @param int $id The token number to reset. + * + * @param int $rule The rule name to use. + * + * @param array $options An associative array of options for the + * token array element. The keys and values are specific to the + * rule, and may or may not be common to other rule options. Typical + * options keys are 'text' and 'type' but may include others. + * + * @return void + * + */ + + function setToken($id, $rule, $options = array()) + { + // reset the token + $this->tokens[$id] = array( + 0 => $rule, + 1 => $options + ); + } + + + /** + * + * Load a rule parser class file. + * + * @access public + * + * @return bool True if loaded, false if not. + * + */ + + function loadParseObj($rule) + { + $rule = ucwords(strtolower($rule)); + $file = $rule . '.php'; + $class = "Text_Wiki_Parse_$rule"; + + if (! class_exists($class)) { + $loc = $this->findFile('parse', $file); + if ($loc) { + // found the class + include_once $loc; + } else { + // can't find the class + $this->parseObj[$rule] = null; + return false; + } + } + + $this->parseObj[$rule] =& new $class($this); + + } + + + /** + * + * Load a rule-render class file. + * + * @access public + * + * @return bool True if loaded, false if not. + * + */ + + function loadRenderObj($format, $rule) + { + $format = ucwords(strtolower($format)); + $rule = ucwords(strtolower($rule)); + $file = "$format/$rule.php"; + $class = "Text_Wiki_Render_$format" . "_$rule"; + + if (! class_exists($class)) { + // load the class + $loc = $this->findFile('render', $file); + if ($loc) { + // found the class + include_once $loc; + } else { + // can't find the class + return false; + } + } + + $this->renderObj[$rule] =& new $class($this); + } + + + /** + * + * Load a format-render class file. + * + * @access public + * + * @return bool True if loaded, false if not. + * + */ + + function loadFormatObj($format) + { + $format = ucwords(strtolower($format)); + $file = $format . '.php'; + $class = "Text_Wiki_Render_$format"; + + if (! class_exists($class)) { + $loc = $this->findFile('render', $file); + if ($loc) { + // found the class + include_once $loc; + } else { + // can't find the class + return false; + } + } + + $this->formatObj[$format] =& new $class($this); + } + + + /** + * + * Add a path to a path array. + * + * @access public + * + * @param string $type The path-type to add (parse or render). + * + * @param string $dir The directory to add to the path-type. + * + * @return void + * + */ + + function addPath($type, $dir) + { + $dir = $this->fixPath($dir); + if (! isset($this->path[$type])) { + $this->path[$type] = array($dir); + } else { + array_unshift($this->path[$type], $dir); + } + } + + + /** + * + * Get the current path array for a path-type. + * + * @access public + * + * @param string $type The path-type to look up (plugin, filter, or + * template). If not set, returns all path types. + * + * @return array The array of paths for the requested type. + * + */ + + function getPath($type = null) + { + if (is_null($type)) { + return $this->path; + } elseif (! isset($this->path[$type])) { + return array(); + } else { + return $this->path[$type]; + } + } + + + /** + * + * Searches a series of paths for a given file. + * + * @param array $type The type of paths to search (template, plugin, + * or filter). + * + * @param string $file The file name to look for. + * + * @return string|bool The full path and file name for the target file, + * or boolean false if the file is not found in any of the paths. + * + */ + + function findFile($type, $file) + { + // get the set of paths + $set = $this->getPath($type); + + // start looping through them + foreach ($set as $path) { + $fullname = $path . $file; + if (file_exists($fullname) && is_readable($fullname)) { + return $fullname; + } + } + + // could not find the file in the set of paths + return false; + } + + + /** + * + * Append a trailing '/' to paths, unless the path is empty. + * + * @access private + * + * @param string $path The file path to fix + * + * @return string The fixed file path + * + */ + + function fixPath($path) + { + $len = strlen($this->_dirSep); + + if (! empty($path) && + substr($path, -1 * $len, $len) != $this->_dirSep) { + return $path . $this->_dirSep; + } else { + return $path; + } + } +} + +?> \ No newline at end of file diff --git a/include/Text/Wiki/Parse.php b/include/Text/Wiki/Parse.php new file mode 100644 index 0000000..522a5af --- /dev/null +++ b/include/Text/Wiki/Parse.php @@ -0,0 +1,273 @@ + +* +* @license LGPL +* +*/ + +/** +* +* Baseline rule class for extension into a "real" parser component. +* +* Text_Wiki_Rule classes do not stand on their own; they are called by a +* Text_Wiki object, typcially in the transform() method. Each rule class +* performs three main activities: parse, process, and render. +>>>>>>> 1.4 +* +* The parse() method takes a regex and applies it to the whole block of +* source text at one time. Each match is sent as $matches to the +* process() method. +* +* The process() method acts on the matched text from the source, and +* then processes the source text is some way. This may mean the +* creation of a delimited token using addToken(). In every case, the +* process() method returns the text that should replace the matched text +* from parse(). +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + +class Text_Wiki_Parse { + + + /** + * + * Configuration options for this parser rule. + * + * @access public + * + * @var string + * + */ + + var $conf = array(); + + + /** + * + * Regular expression to find matching text for this rule. + * + * @access public + * + * @var string + * + * @see parse() + * + */ + + var $regex = null; + + + /** + * + * The name of this rule for new token array elements. + * + * @access public + * + * @var string + * + */ + + var $rule = null; + + + /** + * + * A reference to the calling Text_Wiki object. + * + * This is needed so that each rule has access to the same source + * text, token set, URLs, interwiki maps, page names, etc. + * + * @access public + * + * @var object + */ + + var $wiki = null; + + + /** + * + * Constructor for this parser rule. + * + * @access public + * + * @param object &$obj The calling "parent" Text_Wiki object. + * + */ + + function Text_Wiki_Parse(&$obj) + { + // set the reference to the calling Text_Wiki object; + // this allows us access to the shared source text, token + // array, etc. + $this->wiki =& $obj; + + // set the name of this rule; generally used when adding + // to the tokens array. strip off the Text_Wiki_Parse_ portion. + // text_wiki_parse_ + // 0123456789012345 + $tmp = substr(get_class($this), 16); + $this->rule = ucwords(strtolower($tmp)); + + // override config options for the rule if specified + if (isset($this->wiki->parseConf[$this->rule]) && + is_array($this->wiki->parseConf[$this->rule])) { + + $this->conf = array_merge( + $this->conf, + $this->wiki->parseConf[$this->rule] + ); + + } + } + + + /** + * + * Abstrct method to parse source text for matches. + * + * Applies the rule's regular expression to the source text, passes + * every match to the process() method, and replaces the matched text + * with the results of the processing. + * + * @access public + * + * @see Text_Wiki_Parse::process() + * + */ + + function parse() + { + $this->wiki->source = preg_replace_callback( + $this->regex, + array(&$this, 'process'), + $this->wiki->source + ); + } + + + /** + * + * Abstract method to generate replacements for matched text. + * + * @access public + * + * @param array $matches An array of matches from the parse() method + * as generated by preg_replace_callback. $matches[0] is the full + * matched string, $matches[1] is the first matched pattern, + * $matches[2] is the second matched pattern, and so on. + * + * @return string The processed text replacement; defaults to the + * full matched string (i.e., no changes to the text). + * + * @see Text_Wiki_Parse::parse() + * + */ + + function process(&$matches) + { + return $matches[0]; + } + + + /** + * + * Simple method to safely get configuration key values. + * + * @access public + * + * @param string $key The configuration key. + * + * @param mixed $default If the key does not exist, return this value + * instead. + * + * @return mixed The configuration key value (if it exists) or the + * default value (if not). + * + */ + + function getConf($key, $default = null) + { + if (isset($this->conf[$key])) { + return $this->conf[$key]; + } else { + return $default; + } + } + + + /** + * + * Extract 'attribute="value"' portions of wiki markup. + * + * This kind of markup is typically used only in macros, but is useful + * anywhere. + * + * The syntax is pretty strict; there can be no spaces between the + * option name, the equals, and the first double-quote; the value + * must be surrounded by double-quotes. You can escape characters in + * the value with a backslash, and the backslash will be stripped for + * you. + * + * @access public + * + * @param string $text The "attributes" portion of markup. + * + * @return array An associative array of key-value pairs where the + * key is the option name and the value is the option value. + * + */ + + function getAttrs($text) + { + // find the =" sections; + $tmp = explode('="', trim($text)); + + // basic setup + $k = count($tmp) - 1; + $attrs = array(); + $key = null; + + // loop through the sections + foreach ($tmp as $i => $val) { + + // first element is always the first key + if ($i == 0) { + $key = trim($val); + continue; + } + + // find the last double-quote in the value. + // the part to the left is the value for the last key, + // the part to the right is the next key name + $pos = strrpos($val, '"'); + $attrs[$key] = stripslashes(substr($val, 0, $pos)); + $key = trim(substr($val, $pos+1)); + + } + + return $attrs; + + } +} +?> \ No newline at end of file diff --git a/include/Text/Wiki/Parse/Default/Anchor.php b/include/Text/Wiki/Parse/Default/Anchor.php new file mode 100644 index 0000000..83dae34 --- /dev/null +++ b/include/Text/Wiki/Parse/Default/Anchor.php @@ -0,0 +1,87 @@ + +* +* @author Paul M. Jones +* +* @license LGPL +* +* @version $Id: Anchor.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ +* +*/ + +/** +* +* This class implements a Text_Wiki_Parse to add an anchor target name +* in the wiki page. +* +* @author Manuel Holtgrewe +* +* @author Paul M. Jones +* +* @category Text +* +* @package Text_Wiki +* +*/ + +class Text_Wiki_Parse_Anchor extends Text_Wiki_Parse { + + + /** + * + * The regular expression used to find source text matching this + * rule. Looks like a macro: [[# anchor_name]] + * + * @access public + * + * @var string + * + */ + + var $regex = '/(\[\[# )([-_A-Za-z0-9.]+?)( .+)?(\]\])/i'; + + + /** + * + * Generates a token entry for the matched text. Token options are: + * + * 'text' => The full matched text, not including the tags. + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return A delimited token number to be used as a placeholder in + * the source text. + * + */ + + function process(&$matches) { + + $name = $matches[2]; + $text = $matches[3]; + + $start = $this->wiki->addToken( + $this->rule, + array('type' => 'start', 'name' => $name) + ); + + $end = $this->wiki->addToken( + $this->rule, + array('type' => 'end', 'name' => $name) + ); + + // done, place the script output directly in the source + return $start . trim($text) . $end; + } +} +?> diff --git a/include/Text/Wiki/Parse/Default/Blockquote.php b/include/Text/Wiki/Parse/Default/Blockquote.php new file mode 100644 index 0000000..d3c95fb --- /dev/null +++ b/include/Text/Wiki/Parse/Default/Blockquote.php @@ -0,0 +1,179 @@ + +* +* @license LGPL +* +* @version $Id: Blockquote.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ +* +*/ + +/** +* +* Parse for block-quoted text. +* +* Find source text marked as a blockquote, identified by any number of +* greater-than signs '>' at the start of the line, followed by a space, +* and then the quote text; each '>' indicates an additional level of +* quoting. +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + +class Text_Wiki_Parse_Blockquote extends Text_Wiki_Parse { + + + /** + * + * Regex for parsing the source text. + * + * @access public + * + * @var string + * + * @see parse() + * + */ + + var $regex = '/\n((\>).*\n)(?!(\>))/Us'; + + + /** + * + * Generates a replacement for the matched text. + * + * Token options are: + * + * 'type' => + * 'start' : the start of a blockquote + * 'end' : the end of a blockquote + * + * 'level' => the indent level (0 for the first level, 1 for the + * second, etc) + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return A series of text and delimited tokens marking the different + * list text and list elements. + * + */ + + function process(&$matches) + { + // the replacement text we will return to parse() + $return = ''; + + // the list of post-processing matches + $list = array(); + + // $matches[1] is the text matched as a list set by parse(); + // create an array called $list that contains a new set of + // matches for the various list-item elements. + preg_match_all( + '=^(\>+) (.*\n)=Ums', + $matches[1], + $list, + PREG_SET_ORDER + ); + + // a stack of starts and ends; we keep this so that we know what + // indent level we're at. + $stack = array(); + + // loop through each list-item element. + foreach ($list as $key => $val) { + + // $val[0] is the full matched list-item line + // $val[1] is the number of initial '>' chars (indent level) + // $val[2] is the quote text + + // we number levels starting at 1, not zero + $level = strlen($val[1]); + + // get the text of the line + $text = $val[2]; + + // add a level to the list? + while ($level > count($stack)) { + + // the current indent level is greater than the number + // of stack elements, so we must be starting a new + // level. push the new level onto the stack with a + // dummy value (boolean true)... + array_push($stack, true); + + $return .= "\n"; + + // ...and add a start token to the return. + $return .= $this->wiki->addToken( + $this->rule, + array( + 'type' => 'start', + 'level' => $level - 1 + ) + ); + + $return .= "\n\n"; + } + + // remove a level? + while (count($stack) > $level) { + + // as long as the stack count is greater than the + // current indent level, we need to end list types. + // continue adding end-list tokens until the stack count + // and the indent level are the same. + array_pop($stack); + + $return .= "\n\n"; + + $return .= $this->wiki->addToken( + $this->rule, + array ( + 'type' => 'end', + 'level' => count($stack) + ) + ); + + $return .= "\n"; + } + + // add the line text. + $return .= $text; + } + + // the last line may have been indented. go through the stack + // and create end-tokens until the stack is empty. + $return .= "\n"; + + while (count($stack) > 0) { + array_pop($stack); + $return .= $this->wiki->addToken( + $this->rule, + array ( + 'type' => 'end', + 'level' => count($stack) + ) + ); + } + + // we're done! send back the replacement text. + return "\n$return\n\n"; + } +} +?> \ No newline at end of file diff --git a/include/Text/Wiki/Parse/Default/Bold.php b/include/Text/Wiki/Parse/Default/Bold.php new file mode 100644 index 0000000..c4c26af --- /dev/null +++ b/include/Text/Wiki/Parse/Default/Bold.php @@ -0,0 +1,79 @@ + +* +* @license LGPL +* +* @version $Id: Bold.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ +* +*/ + +/** +* +* Parses for bold text. +* +* This class implements a Text_Wiki_Rule to find source text marked for +* strong emphasis (bold) as defined by text surrounded by three +* single-quotes. On parsing, the text itself is left in place, but the +* starting and ending instances of three single-quotes are replaced with +* tokens. +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + +class Text_Wiki_Parse_Bold extends Text_Wiki_Parse { + + + /** + * + * The regular expression used to parse the source text and find + * matches conforming to this rule. Used by the parse() method. + * + * @access public + * + * @var string + * + * @see parse() + * + */ + + var $regex = "/'''(()|[^'].*)'''/U"; + + + /** + * + * Generates a replacement for the matched text. Token options are: + * + * 'type' => ['start'|'end'] The starting or ending point of the + * emphasized text. The text itself is left in the source. + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return A pair of delimited tokens to be used as a placeholder in + * the source text surrounding the text to be emphasized. + * + */ + + function process(&$matches) + { + $start = $this->wiki->addToken($this->rule, array('type' => 'start')); + $end = $this->wiki->addToken($this->rule, array('type' => 'end')); + return $start . $matches[1] . $end; + } +} +?> \ No newline at end of file diff --git a/include/Text/Wiki/Parse/Default/Break.php b/include/Text/Wiki/Parse/Default/Break.php new file mode 100644 index 0000000..fa0fd04 --- /dev/null +++ b/include/Text/Wiki/Parse/Default/Break.php @@ -0,0 +1,72 @@ + +* +* @license LGPL +* +* @version $Id: Break.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ +* +*/ + +/** +* +* Parses for explicit line breaks. +* +* This class implements a Text_Wiki_Parse to mark forced line breaks in the +* source text. +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + +class Text_Wiki_Parse_Break extends Text_Wiki_Parse { + + + /** + * + * The regular expression used to parse the source text and find + * matches conforming to this rule. Used by the parse() method. + * + * @access public + * + * @var string + * + * @see parse() + * + */ + + var $regex = '/ _\n/'; + + + /** + * + * Generates a replacement token for the matched text. + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return string A delimited token to be used as a placeholder in + * the source text. + * + */ + + function process(&$matches) + { + return $this->wiki->addToken($this->rule); + } +} + +?> \ No newline at end of file diff --git a/include/Text/Wiki/Parse/Default/Center.php b/include/Text/Wiki/Parse/Default/Center.php new file mode 100644 index 0000000..b3c0a2d --- /dev/null +++ b/include/Text/Wiki/Parse/Default/Center.php @@ -0,0 +1,78 @@ + +* +* @license LGPL +* +* @version $Id: Center.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ +* +*/ + +/** +* +* Parses for centered lines of text. +* +* This class implements a Text_Wiki_Parse to find lines marked for centering. +* The line must start with "= " (i.e., an equal-sign followed by a space). +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + +class Text_Wiki_Parse_Center extends Text_Wiki_Parse { + + + /** + * + * The regular expression used to find source text matching this + * rule. + * + * @access public + * + * @var string + * + */ + + var $regex = '/\n\= (.*?)\n/'; + + /** + * + * Generates a token entry for the matched text. + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return A delimited token number to be used as a placeholder in + * the source text. + * + */ + + function process(&$matches) + { + $start = $this->wiki->addToken( + $this->rule, + array('type' => 'start') + ); + + $end = $this->wiki->addToken( + $this->rule, + array('type' => 'end') + ); + + return "\n" . $start . $matches[1] . $end . "\n"; + } +} +?> \ No newline at end of file diff --git a/include/Text/Wiki/Parse/Default/Code.php b/include/Text/Wiki/Parse/Default/Code.php new file mode 100644 index 0000000..00e99f1 --- /dev/null +++ b/include/Text/Wiki/Parse/Default/Code.php @@ -0,0 +1,99 @@ + +* +* @license LGPL +* +* @version $Id: Code.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ +* +*/ + +/** +* +* Parses for text marked as a code example block. +* +* This class implements a Text_Wiki_Parse to find sections marked as code +* examples. Blocks are marked as the string on a line by itself, +* followed by the inline code example, and terminated with the string +* on a line by itself. The code example is run through the +* native PHP highlight_string() function to colorize it, then surrounded +* with
...
tags when rendered as XHTML. +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + +class Text_Wiki_Parse_Code extends Text_Wiki_Parse { + + + /** + * + * The regular expression used to find source text matching this + * rule. + * + * @access public + * + * @var string + * + */ + + var $regex = '/^(\)\n(.+)\n(\<\/code\>)(\s|$)/Umsi'; + + + /** + * + * Generates a token entry for the matched text. Token options are: + * + * 'text' => The full matched text, not including the tags. + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return A delimited token number to be used as a placeholder in + * the source text. + * + */ + + function process(&$matches) + { + // are there additional attribute arguments? + $args = trim($matches[2]); + + if ($args == '') { + $options = array( + 'text' => $matches[3], + 'attr' => array('type' => '') + ); + } else { + // get the attributes... + $attr = $this->getAttrs($args); + + // ... and make sure we have a 'type' + if (! isset($attr['type'])) { + $attr['type'] = ''; + } + + // retain the options + $options = array( + 'text' => $matches[3], + 'attr' => $attr + ); + } + + return $this->wiki->addToken($this->rule, $options) . $matches[5]; + } +} +?> \ No newline at end of file diff --git a/include/Text/Wiki/Parse/Default/Colortext.php b/include/Text/Wiki/Parse/Default/Colortext.php new file mode 100644 index 0000000..de976ab --- /dev/null +++ b/include/Text/Wiki/Parse/Default/Colortext.php @@ -0,0 +1,89 @@ + +* +* @license LGPL +* +* @version $Id: Colortext.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ +* +*/ + +/** +* +* Parses for colorized text. +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + +class Text_Wiki_Parse_Colortext extends Text_Wiki_Parse { + + /** + * + * The regular expression used to parse the source text and find + * matches conforming to this rule. Used by the parse() method. + * + * @access public + * + * @var string + * + * @see parse() + * + */ + + var $regex = "/\#\#(.+?)\|(.+?)\#\#/"; + + + /** + * + * Generates a replacement for the matched text. Token options are: + * + * 'type' => ['start'|'end'] The starting or ending point of the + * emphasized text. The text itself is left in the source. + * + * 'color' => the color indicator + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return string A pair of delimited tokens to be used as a + * placeholder in the source text surrounding the text to be + * emphasized. + * + */ + + function process(&$matches) + { + $start = $this->wiki->addToken( + $this->rule, + array( + 'type' => 'start', + 'color' => $matches[1] + ) + ); + + $end = $this->wiki->addToken( + $this->rule, + array( + 'type' => 'end', + 'color' => $matches[1] + ) + ); + + return $start . $matches[2] . $end; + } +} +?> \ No newline at end of file diff --git a/include/Text/Wiki/Parse/Default/Deflist.php b/include/Text/Wiki/Parse/Default/Deflist.php new file mode 100644 index 0000000..8071684 --- /dev/null +++ b/include/Text/Wiki/Parse/Default/Deflist.php @@ -0,0 +1,122 @@ + +* +* @license LGPL +* +* @version $Id: Deflist.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ +* +*/ + +/** +* +* Parses for definition lists. +* +* This class implements a Text_Wiki_Parse to find source text marked as a +* definition list. In short, if a line starts with ':' then it is a +* definition list item; another ':' on the same line indicates the end +* of the definition term and the beginning of the definition narrative. +* The list items must be on sequential lines (no blank lines between +* them) -- a blank line indicates the beginning of a new list. +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + +class Text_Wiki_Parse_Deflist extends Text_Wiki_Parse { + + + /** + * + * The regular expression used to parse the source text and find + * matches conforming to this rule. Used by the parse() method. + * + * @access public + * + * @var string + * + * @see parse() + * + */ + + var $regex = '/\n((: ).*\n)(?!(: |\n))/Us'; + + + /** + * + * Generates a replacement for the matched text. Token options are: + * + * 'type' => + * 'list_start' : the start of a definition list + * 'list_end' : the end of a definition list + * 'term_start' : the start of a definition term + * 'term_end' : the end of a definition term + * 'narr_start' : the start of definition narrative + * 'narr_end' : the end of definition narrative + * 'unknown' : unknown type of definition portion + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return A series of text and delimited tokens marking the different + * list text and list elements. + * + */ + + function process(&$matches) + { + // the replacement text we will return to parse() + $return = ''; + + // the list of post-processing matches + $list = array(); + + // start the deflist + $options = array('type' => 'list_start'); + $return .= $this->wiki->addToken($this->rule, $options); + + // $matches[1] is the text matched as a list set by parse(); + // create an array called $list that contains a new set of + // matches for the various definition-list elements. + preg_match_all( + '/^(: )(.*)?( : )(.*)?$/Ums', + $matches[1], + $list, + PREG_SET_ORDER + ); + + // add each term and narrative + foreach ($list as $key => $val) { + $return .= ( + $this->wiki->addToken($this->rule, array('type' => 'term_start')) . + trim($val[2]) . + $this->wiki->addToken($this->rule, array('type' => 'term_end')) . + $this->wiki->addToken($this->rule, array('type' => 'narr_start')) . + trim($val[4]) . + $this->wiki->addToken($this->rule, array('type' => 'narr_end')) + ); + } + + + // end the deflist + $options = array('type' => 'list_end'); + $return .= $this->wiki->addToken($this->rule, $options); + + // done! + return "\n" . $return . "\n\n"; + } +} +?> \ No newline at end of file diff --git a/include/Text/Wiki/Parse/Default/Delimiter.php b/include/Text/Wiki/Parse/Default/Delimiter.php new file mode 100644 index 0000000..811e8f5 --- /dev/null +++ b/include/Text/Wiki/Parse/Default/Delimiter.php @@ -0,0 +1,80 @@ + +* +* @license LGPL +* +* @version $Id: Delimiter.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ +* +*/ + +/** +* +* Parses for Text_Wiki delimiter characters already in the source text. +* +* This class implements a Text_Wiki_Parse to find instances of the delimiter +* character already embedded in the source text; it extracts them and replaces +* them with a delimited token, then renders them as the delimiter itself +* when the target format is XHTML. +* +* @category Text +* +* @package Text_Wiki +* +* @author Paul M. Jones +* +*/ + +class Text_Wiki_Parse_Delimiter extends Text_Wiki_Parse { + + /** + * + * Constructor. Overrides the Text_Wiki_Parse constructor so that we + * can set the $regex property dynamically (we need to include the + * Text_Wiki $delim character. + * + * @param object &$obj The calling "parent" Text_Wiki object. + * + * @param string $name The token name to use for this rule. + * + */ + + function Text_Wiki_Parse_delimiter(&$obj) + { + parent::Text_Wiki_Parse($obj); + $this->regex = '/' . $this->wiki->delim . '/'; + } + + + /** + * + * Generates a token entry for the matched text. Token options are: + * + * 'text' => The full matched text. + * + * @access public + * + * @param array &$matches The array of matches from parse(). + * + * @return A delimited token number to be used as a placeholder in + * the source text. + * + */ + + function process(&$matches) + { + return $this->wiki->addToken( + $this->rule, + array('text' => $this->wiki->delim) + ); + } +} +?> \ No newline at end of file diff --git a/include/Text/Wiki/Parse/Default/Embed.php b/include/Text/Wiki/Parse/Default/Embed.php new file mode 100644 index 0000000..586134c --- /dev/null +++ b/include/Text/Wiki/Parse/Default/Embed.php @@ -0,0 +1,106 @@ + +* +* @license LGPL +* +* @version $Id: Embed.php,v 1.3 2005/02/23 17:38:29 pmjones Exp $ +* +*/ + +/** +* +* Embeds the results of a PHP script at render-time. +* +* This class implements a Text_Wiki_Parse to embed the contents of a URL +* inside the page at render-time. Typically used to get script output. +* This differs from the 'include' rule, which incorporates results at +* parse-time; 'embed' output does not get parsed by Text_Wiki, while +* 'include' ouput does. +* +* This rule is inherently not secure; it allows cross-site scripting to +* occur if the embedded output has +{/literal} +{/if} + +
+ + +
+ + + + {if $idsum}{/if} + {foreach from=$vars item=myval} + {if $myval.sum}{/if} + {/foreach} +{if !$hideactions} + +{/if} + +{if !$readonly} + + + + +{/if} +{counter start=1 assign=cnt print=0} +{foreach from=$rows item=myrow}{assign var="myarr" value=$myrow[1]} + +{if $idsum} {/if} +{foreach from=$vars key=mykey item=myval} +{if $myval.sum} + +{/if} +{/foreach} +{if !$hideactions} + +{/if} + +{counter} +{/foreach} +
{$msg_id}{$myval.desc}{$msg_action}
{$msg_new_entry} + {$msg_create} +
{$myrow[0]} + {if $myval.type=="timestamp"} + {$myarr.$mykey|date_format:"%Y-%m-%d %H:%M:%S"} + {elseif $myval.type=="set" and $myval.trans} + {$myval.trans[$myval.value]} + {elseif $myval.type=="ext"} + {extval table=$table field=$mykey value=$myarr.$mykey vtable=$myval.vtable vjoinid=$myval.vjoinid vfield=$myval.vfield} + {else} + {$myarr.$mykey} + {/if} + +{if !$readonly} + {$msg_edit} + {$msg_delete} +{/if} +{foreach from=$myrow[2] item=myaction} + {a class="action" lnk=$myaction} +{/foreach} +
+ +{if ($p_prev > -1) || ($p_next > -1)} +
+{/if} + +{else} + +
+ +{if $id!=''} + +{/if} + + + + +{foreach from=$vars key=mykey item=myval} +{if $myval.show} + + + + +{/if} +{/foreach} +
+ {if $id!=''}{$msg_existing_entry} {$id} + {else}{$msg_new_entry}{/if} +
+ {$myval.desc} + {if $myval.type=="password"}
{$msg_no_change}{/if} +
+{if $myval.edit} +{if $myval.type=="textarea"} + +{elseif $myval.type=="set"} + {if $myval.trans} + {flags table=$table field=$mykey name="$prefix$mykey" selected=$myval.trans[$myval.value] trans=$myval.trans} + {else} + {flags table=$table field=$mykey name="$prefix$mykey" selected=$myval.value} + {/if} +{elseif $myval.type=="ext"} + {extval table=$table field=$mykey name="$prefix$mykey" vtable=$myval.vtable vjoinid=$myval.vjoinid vfield=$myval.vfield selected=$myval.value} +{elseif $myval.type=="timestamp"} + +{elseif $myval.type=="password"} + +{else} + +{/if} +{else} + {$myval.value|escape} +{/if} +
+ +

+ +

+ +
+ +

+ {$msg_back} +

+ +{/if} diff --git a/include/phplayersmenu/PHPLIB.php b/include/phplayersmenu/PHPLIB.php new file mode 100644 index 0000000..c6be785 --- /dev/null +++ b/include/phplayersmenu/PHPLIB.php @@ -0,0 +1,565 @@ + (original from PHPLIB) +// Bjoern Schotte (PEARification) +// Martin Jansen (PEAR conformance) +// + +//require_once "PEAR.php"; + +/** + * Converted PHPLIB Template class + * + * For those who want to use PHPLIB's fine template class, + * here's a PEAR conforming class with the original PHPLIB + * template code from phplib-stable CVS. Original author + * was Kristian Koehntopp + * + * @author Bjoern Schotte + * @author Martin Jansen (PEAR conformance) + * @version 1.0 + */ +class Template_PHPLIB +{ + /** + * If set, echo assignments + * @var bool + */ + var $debug = false; + + /** + * $file[handle] = "filename"; + * @var array + */ + var $file = array(); + + /** + * fallback paths that should be defined in a child class + * @var array + */ + var $file_fallbacks = array(); + + /** + * Relative filenames are relative to this pathname + * @var string + */ + var $root = ""; + + /* + * $_varKeys[key] = "key" + * @var array + */ + var $_varKeys = array(); + + /** + * $_varVals[key] = "value"; + * @var array + */ + var $_varVals = array(); + + /** + * "remove" => remove undefined variables + * "comment" => replace undefined variables with comments + * "keep" => keep undefined variables + * @var string + */ + var $unknowns = "remove"; + + /** + * "yes" => halt, "report" => report error, continue, "no" => ignore error quietly + * @var string + */ + var $haltOnError = "report"; + + /** + * The last error message is retained here + * @var string + * @see halt + */ + var $_lastError = ""; + + + /** + * Constructor + * + * @access public + * @param string template root directory + * @param string how to handle unknown variables + * @param array fallback paths + */ + function Template_PHPLIB($root = ".", $unknowns = "remove", $fallback="") + { + $this->setRoot($root); + $this->setUnknowns($unknowns); + if (is_array($fallback)) $this->file_fallbacks = $fallback; + } + + /** + * Sets the template directory + * + * @access public + * @param string new template directory + * @return bool + */ + function setRoot($root) + { + if (!is_dir($root)) { + $this->halt("setRoot: $root is not a directory."); + return false; + } + + $this->root = $root; + + return true; + } + + /** + * What to do with unknown variables + * + * three possible values: + * + * - "remove" will remove unknown variables + * (don't use this if you define CSS in your page) + * - "comment" will replace undefined variables with comments + * - "keep" will keep undefined variables as-is + * + * @access public + * @param string unknowns + */ + function setUnknowns($unknowns = "keep") + { + $this->unknowns = $unknowns; + } + + /** + * Set appropriate template files + * + * With this method you set the template files you want to use. + * Either you supply an associative array with key/value pairs + * where the key is the handle for the filname and the value + * is the filename itself, or you define $handle as the file name + * handle and $filename as the filename if you want to define only + * one template. + * + * @access public + * @param mixed handle for a filename or array with handle/name value pairs + * @param string name of template file + * @return bool + */ + function setFile($handle, $filename = "") + { + if (!is_array($handle)) { + + if ($filename == "") { + $this->halt("setFile: For handle $handle filename is empty."); + return false; + } + + $this->file[$handle] = $this->_filename($filename); + + } else { + + reset($handle); + while (list($h, $f) = each($handle)) { + $this->file[$h] = $this->_filename($f); + } + } + } + + /** + * Set a block in the appropriate template handle + * + * By setting a block like that: + * + * <!-- BEGIN blockname --> + * html code + * <!-- END blockname --> + * + * you can easily do repeating HTML code, i.e. output + * database data nice formatted into a HTML table where + * each DB row is placed into a HTML table row which is + * defined in this block. + * It extracts the template $handle from $parent and places + * variable {$name} instead. + * + * @access public + * @param string parent handle + * @param string block name handle + * @param string variable substitution name + */ + function setBlock($parent, $handle, $name = "") + { + if (!$this->_loadFile($parent)) { + $this->halt("setBlock: unable to load $parent."); + return false; + } + + if ($name == "") { + $name = $handle; + } + + $str = $this->getVar($parent); + $reg = "/[ \t]*\s*?\n?(\s*.*?\n?)\s*\s*?\n?/sm"; + preg_match_all($reg, $str, $m); + $str = preg_replace($reg, "{" . "$name}", $str); + + if (isset($m[1][0])) $this->setVar($handle, $m[1][0]); + $this->setVar($parent, $str); + } + + /** + * Set corresponding substitutions for placeholders + * + * @access public + * @param string name of a variable that is to be defined or an array of variables with value substitution as key/value pairs + * @param string value of that variable + * @param boolean if true, the value is appended to the variable's existing value + */ + function setVar($varname, $value = "", $append = false) + { + if (!is_array($varname)) { + + if (!empty($varname)) + if ($this->debug) print "scalar: set *$varname* to *$value*
\n"; + + $this->_varKeys[$varname] = $this->_varname($varname); + ($append) ? $this->_varVals[$varname] .= $value : $this->_varVals[$varname] = $value; + + } else { + reset($varname); + + while (list($k, $v) = each($varname)) { + if (!empty($k)) + if ($this->debug) print "array: set *$k* to *$v*
\n"; + + $this->_varKeys[$k] = $this->_varname($k); + ($append) ? $this->_varVals[$k] .= $v : $this->_varVals[$k] = $v; + } + } + } + + /** + * Substitute variables in handle $handle + * + * @access public + * @param string name of handle + * @return mixed string substituted content of handle + */ + function subst($handle) + { + if (!$this->_loadFile($handle)) { + $this->halt("subst: unable to load $handle."); + return false; + } + + return @str_replace($this->_varKeys, $this->_varVals, $this->getVar($handle)); + } + + /** + * Same as subst but printing the result + * + * @access public + * @brother subst + * @param string handle of template + * @return bool always false + */ + function pSubst($handle) + { + print $this->subst($handle); + return false; + } + + /** + * Parse handle into target + * + * Parses handle $handle into $target, eventually + * appending handle at $target if $append is defined + * as TRUE. + * + * @access public + * @param string target handle to parse into + * @param string which handle should be parsed + * @param boolean append it to $target or not? + * @return string parsed handle + */ + function parse($target, $handle, $append = false) + { + if (!is_array($handle)) { + $str = $this->subst($handle); + + ($append) ? $this->setVar($target, $this->getVar($target) . $str) : $this->setVar($target, $str); + } else { + reset($handle); + + while (list(, $h) = each($handle)) { + $str = $this->subst($h); + $this->setVar($target, $str); + } + } + + return $str; + } + + /** + * Same as parse, but printing it. + * + * @access public + * @brother parse + * @param string target to parse into + * @param string handle which should be parsed + * @param should $handle be appended to $target? + * @return bool + */ + function pParse($target, $handle, $append = false) + { + print $this->finish($this->parse($target, $handle, $append)); + return false; + } + + /** + * Return all defined variables and their values + * + * @access public + * @return array with all defined variables and their values + */ + function getVars() + { + reset($this->_varKeys); + + while (list($k, ) = each($this->_varKeys)) { + $result[$k] = $this->getVar($k); + } + + return $result; + } + + /** + * Return one or more specific variable(s) with their values. + * + * @access public + * @param mixed array with variable names or one variable name as a string + * @return mixed array of variable names with their values or value of one specific variable + */ + function getVar($varname) + { + if (!is_array($varname)) { + if (isset($this->_varVals[$varname])) { + return $this->_varVals[$varname]; + } else { + return ""; + } + } else { + reset($varname); + + while (list($k, ) = each($varname)) { + $result[$k] = (isset($this->_varVals[$k])) ? $this->_varVals[$k] : ""; + } + + return $result; + } + } + + /** + * Get undefined values of a handle + * + * @access public + * @param string handle name + * @return mixed false if an error occured or the undefined values + */ + function getUndefined($handle) + { + if (!$this->_loadFile($handle)) { + $this->halt("getUndefined: unable to load $handle."); + return false; + } + + preg_match_all("/{([^ \t\r\n}]+)}/", $this->getVar($handle), $m); + $m = $m[1]; + if (!is_array($m)) { + return false; + } + + reset($m); + while (list(, $v) = each($m)) { + if (!isset($this->_varKeys[$v])) { + $result[$v] = $v; + } + } + + if (isset($result) && count($result)) { + return $result; + } else { + return false; + } + } + + /** + * Finish string + * + * @access public + * @param string string to finish + * @return finished, i.e. substituted string + */ + function finish($str) + { + switch ($this->unknowns) { + case "remove": + $str = preg_replace('/{[^ \t\r\n}]+}/', "", $str); + break; + + case "comment": + $str = preg_replace('/{([^ \t\r\n}]+)}/', "", $str); + break; + } + + return $str; + } + + /** + * Print variable to the browser + * + * @access public + * @param string name of variable to print + */ + function p($varname) + { + print $this->finish($this->getVar($varname)); + } + + /** + * Get finished variable + * + * @access public public + * @param string variable to get + * @return string string with finished variable + */ + function get($varname) + { + return $this->finish($this->getVar($varname)); + } + + /** + * Complete filename + * + * Complete filename, i.e. testing it for slashes + * + * @access private + * @param string filename to be completed + * @return string completed filename + */ + function _filename($filename) + { +// if (substr($filename, 0, 1) != "/") { +// $filename = $this->root."/".$filename; +// } + + if (file_exists($filename)) return $filename; + if (is_array($this->file_fallbacks) && count($this->file_fallbacks) > 0) { + reset($this->file_fallbacks); + while (list(,$v) = each($this->file_fallbacks)) { + if (file_exists($v.basename($filename))) return $v.basename($filename); + } + $this->halt(sprintf("filename: file %s does not exist in the fallback paths %s.",$filename,implode(",",$this->file_fallbacks))); + return false; + } else { + $this->halt(sprintf("filename: file %s does not exist.",$filename)); + return false; + } + + return $filename; + } + + /** + * Protect a replacement variable + * + * @access private + * @param string name of replacement variable + * @return string replaced variable + */ + function _varname($varname) + { + return "{".$varname."}"; + } + + /** + * load file defined by handle if it is not loaded yet + * + * @access private + * @param string handle + * @return bool FALSE if error, true if all is ok + */ + function _loadFile($handle) + { + if (isset($this->_varKeys[$handle]) and !empty($this->_varVals[$handle])) { + return true; + } + + if (!isset($this->file[$handle])) { + $this->halt("loadfile: $handle is not a valid handle."); + return false; + } + + $filename = $this->file[$handle]; + if (function_exists("file_get_contents")) { + $str = file_get_contents($filename); + } else { + if (!$fp = @fopen($filename,"r")) { + $this->halt("loadfile: couldn't open $filename"); + return false; + } + + $str = fread($fp,filesize($filename)); + fclose($fp); + } + + if ($str=='') { + $this->halt("loadfile: While loading $handle, $filename does not exist or is empty."); + return false; + } + + $this->setVar($handle, $str); + + return true; + } + + /** + * Error function. Halt template system with message to show + * + * @access public + * @param string message to show + * @return bool + */ + function halt($msg) + { + $this->_lastError = $msg; + + if ($this->haltOnError != "no") { +// return $this->haltMsg($msg); + $this->haltMsg($msg); + } + + if ($this->haltOnError == "yes") { + die("Halted."); + } + + return false; + } + + /** + * printf error message to show + * + * @access public + * @param string message to show + * @return object PEAR error object + */ + function haltMsg($msg) + { +// PEAR::raiseError(sprintf("Template Error: %s
\n", $msg)); + printf("Template Error: %s
\n", $msg); + } +} +?> diff --git a/include/phplayersmenu/layersmenu-common.inc.php b/include/phplayersmenu/layersmenu-common.inc.php new file mode 100644 index 0000000..1f94a85 --- /dev/null +++ b/include/phplayersmenu/layersmenu-common.inc.php @@ -0,0 +1,699 @@ + "id", + "parent_id" => "parent_id", + "text" => "text", + "href" => "href", + "title" => "title", + "icon" => "icon", + "target" => "target", + "orderfield" => "orderfield", + "expanded" => "expanded" +); +/** +* Names of fields of the i18n table corresponding to $tableName +* @access private +* @var array +*/ +var $tableFields_i18n = array( + "language" => "language", + "id" => "id", + "text" => "text", + "title" => "title" +); +/** +* A temporary array to store data retrieved from the DB and to perform the depth-first search +* @access private +* @var array +*/ +var $_tmpArray = array(); + +/** +* The constructor method; it initializates the menu system +* @return void +*/ +function LayersMenuCommon() { + + $this->_packageName = "PHP Layers Menu"; + $this->version = "3.1.1"; + $this->copyright = "(C) 2001-2003"; + $this->author = "Marco Pratesi (marco at telug dot it)"; + + $this->prependedUrl = ""; + + $this->dirroot = "./"; + $this->libjsdir = "./libjs/"; + $this->imgdir = "./images/"; + $this->imgwww = "images/"; + $this->tpldir = "./templates/"; + $this->menuStructure = ""; + $this->separator = "|"; + + $this->_nodesCount = 0; + $this->tree = array(); + $this->_maxLevel = array(); + $this->_firstLevelCnt = array(); + $this->_firstItem = array(); + $this->_lastItem = array(); +} + +/** +* The method to set the prepended URL +* @access public +* @return boolean +*/ +function setPrependedUrl($prependedUrl) { + // We do not perform any check + $this->prependedUrl = $prependedUrl; + return true; +} + +/** +* The method to set the dirroot directory +* @access public +* @return boolean +*/ +function setDirrootCommon($dirroot) { + if (!is_dir($dirroot)) { + $this->error("setDirroot: $dirroot is not a directory."); + return false; + } + if (substr($dirroot, -1) != "/") { + $dirroot .= "/"; + } + $oldlength = strlen($this->dirroot); + $foobar = strpos($this->libjsdir, $this->dirroot); + if (!($foobar === false || $foobar != 0)) { + $this->libjsdir = $dirroot . substr($this->libjsdir, $oldlength); + } + $foobar = strpos($this->imgdir, $this->dirroot); + if (!($foobar === false || $foobar != 0)) { + $this->imgdir = $dirroot . substr($this->imgdir, $oldlength); + } + $foobar = strpos($this->tpldir, $this->dirroot); + if (!($foobar === false || $foobar != 0)) { + $this->tpldir = $dirroot . substr($this->tpldir, $oldlength); + } + $this->dirroot = $dirroot; + return true; +} + +/** +* The method to set the libjsdir directory +* @access public +* @return boolean +*/ +function setLibjsdir($libjsdir) { + if ($libjsdir != "" && substr($libjsdir, -1) != "/") { + $libjsdir .= "/"; + } + if ($libjsdir == "" || substr($libjsdir, 0, 1) != "/") { + $foobar = strpos($libjsdir, $this->dirroot); + if ($foobar === false || $foobar != 0) { + $libjsdir = $this->dirroot . $libjsdir; + } + } + if (!is_dir($libjsdir)) { + $this->error("setLibjsdir: $libjsdir is not a directory."); + return false; + } + $this->libjsdir = $libjsdir; + return true; +} + +/** +* The method to set the imgdir directory +* @access public +* @return boolean +*/ +function setImgdir($imgdir) { + if ($imgdir != "" && substr($imgdir, -1) != "/") { + $imgdir .= "/"; + } + if ($imgdir == "" || substr($imgdir, 0, 1) != "/") { + $foobar = strpos($imgdir, $this->dirroot); + if ($foobar === false || $foobar != 0) { + $imgdir = $this->dirroot . $imgdir; + } + } + if (!is_dir($imgdir)) { + $this->error("setImgdir: $imgdir is not a directory."); + return false; + } + $this->imgdir = $imgdir; + return true; +} + +/** +* The method to set imgwww +* @access public +* @return void +*/ +function setImgwww($imgwww) { + if ($imgwww != "" && substr($imgwww, -1) != "/") { + $imgwww .= "/"; + } + $this->imgwww = $imgwww; +} + +/** +* The method to set the tpldir directory +* @access public +* @return boolean +*/ +function setTpldirCommon($tpldir) { + if ($tpldir != "" && substr($tpldir, -1) != "/") { + $tpldir .= "/"; + } + if ($tpldir == "" || substr($tpldir, 0, 1) != "/") { + $foobar = strpos($tpldir, $this->dirroot); + if ($foobar === false || $foobar != 0) { + $tpldir = $this->dirroot . $tpldir; + } + } + if (!is_dir($tpldir)) { + $this->error("setTpldir: $tpldir is not a directory."); + return false; + } + $this->tpldir = $tpldir; + return true; +} + +/** +* The method to read the menu structure from a file +* @access public +* @param string $tree_file the menu structure file +* @return boolean +*/ +function setMenuStructureFile($tree_file) { + if (!($fd = fopen($tree_file, "r"))) { + $this->error("setMenuStructureFile: unable to open file $tree_file."); + return false; + } + $this->menuStructure = ""; + while ($buffer = fgets($fd, 4096)) { + $buffer = ereg_replace(chr(13), "", $buffer); // Microsoft Stupidity Suppression + $this->menuStructure .= $buffer; + } + fclose($fd); + if ($this->menuStructure == "") { + $this->error("setMenuStructureFile: $tree_file is empty."); + return false; + } + return true; +} + +/** +* The method to set the menu structure passing it through a string +* @access public +* @param string $tree_string the menu structure string +* @return boolean +*/ +function setMenuStructureString($tree_string) { + $this->menuStructure = ereg_replace(chr(13), "", $tree_string); // Microsoft Stupidity Suppression + if ($this->menuStructure == "") { + $this->error("setMenuStructureString: empty string."); + return false; + } + return true; +} + +/** +* The method to set the value of separator +* @access public +* @return void +*/ +function setSeparator($separator) { + $this->separator = $separator; +} + +/** +* The method to set parameters for the DB connection +* @access public +* @param string $dns Data Source Name: the connection string for PEAR DB +* @param bool $persistent DB connections are either persistent or not persistent +* @return boolean +*/ +function setDBConnParms($dsn, $persistent=false) { + if (!is_string($dsn)) { + $this->error("initdb: \$dsn is not an string."); + return false; + } + if (!is_bool($persistent)) { + $this->error("initdb: \$persistent is not a boolean."); + return false; + } + $this->dsn = $dsn; + $this->persistent = $persistent; + return true; +} + +/** +* The method to set the name of the table storing data describing the menu +* @access public +* @param string +* @return boolean +*/ +function setTableName($tableName) { + if (!is_string($tableName)) { + $this->error("setTableName: \$tableName is not a string."); + return false; + } + $this->tableName = $tableName; + return true; +} + +/** +* The method to set the name of the i18n table corresponding to $tableName +* @access public +* @param string +* @return boolean +*/ +function setTableName_i18n($tableName_i18n) { + if (!is_string($tableName_i18n)) { + $this->error("setTableName_i18n: \$tableName_i18n is not a string."); + return false; + } + $this->tableName_i18n = $tableName_i18n; + return true; +} + +/** +* The method to set names of fields of the table storing data describing the menu +* @access public +* @param array +* @return boolean +*/ +function setTableFields($tableFields) { + if (!is_array($tableFields)) { + $this->error("setTableFields: \$tableFields is not an array."); + return false; + } + if (count($tableFields) == 0) { + $this->error("setTableFields: \$tableFields is a zero-length array."); + return false; + } + reset ($tableFields); + while (list($key, $value) = each($tableFields)) { + $this->tableFields[$key] = ($value == "") ? "''" : $value; + } + return true; +} + +/** +* The method to set names of fields of the i18n table corresponding to $tableName +* @access public +* @param array +* @return boolean +*/ +function setTableFields_i18n($tableFields_i18n) { + if (!is_array($tableFields_i18n)) { + $this->error("setTableFields_i18n: \$tableFields_i18n is not an array."); + return false; + } + if (count($tableFields_i18n) == 0) { + $this->error("setTableFields_i18n: \$tableFields_i18n is a zero-length array."); + return false; + } + reset ($tableFields_i18n); + while (list($key, $value) = each($tableFields_i18n)) { + $this->tableFields_i18n[$key] = ($value == "") ? "''" : $value; + } + return true; +} + +/** +* The method to parse the current menu structure and correspondingly update related variables +* @access public +* @param string $menu_name the name to be attributed to the menu +* whose structure has to be parsed +* @return void +*/ +function parseStructureForMenu( + $menu_name = "" // non consistent default... + ) { + $this->_maxLevel[$menu_name] = 0; + $this->_firstLevelCnt[$menu_name] = 0; + $this->_firstItem[$menu_name] = $this->_nodesCount + 1; + $cnt = $this->_firstItem[$menu_name]; + $menuStructure = $this->menuStructure; + + /* *********************************************** */ + /* Partially based on a piece of code taken from */ + /* TreeMenu 1.1 - Bjorge Dijkstra (bjorge@gmx.net) */ + /* *********************************************** */ + + while ($menuStructure != "") { + $before_cr = strcspn($menuStructure, "\n"); + $buffer = substr($menuStructure, 0, $before_cr); + $menuStructure = substr($menuStructure, $before_cr+1); + if (substr($buffer, 0, 1) != "#") { // non commented item line... + $tmp = rtrim($buffer); + $node = explode($this->separator, $tmp); + for ($i=count($node); $i<=6; $i++) { + $node[$i] = ""; + } + $this->tree[$cnt]["level"] = strlen($node[0]); + $this->tree[$cnt]["text"] = $node[1]; + $this->tree[$cnt]["href"] = $node[2]; + $this->tree[$cnt]["title"] = $node[3]; + $this->tree[$cnt]["icon"] = $node[4]; + $this->tree[$cnt]["target"] = $node[5]; + $this->tree[$cnt]["expanded"] = $node[6]; + $cnt++; + } + } + + /* *********************************************** */ + + $this->_lastItem[$menu_name] = count($this->tree); + $this->_nodesCount = $this->_lastItem[$menu_name]; + $this->tree[$this->_lastItem[$menu_name]+1]["level"] = 0; + $this->_postParse($menu_name); +} + +/** +* The method to parse the current menu table and correspondingly update related variables +* @access public +* @param string $menu_name the name to be attributed to the menu +* whose structure has to be parsed +* @param string $language i18n language; either omit it or pass +* an empty string ("") if you do not want to use any i18n table +* @return void +*/ +function scanTableForMenu( + $menu_name = "", // non consistent default... + $language = "" + ) { + $this->_maxLevel[$menu_name] = 0; + $this->_firstLevelCnt[$menu_name] = 0; + unset($this->tree[$this->_nodesCount+1]); + $this->_firstItem[$menu_name] = $this->_nodesCount + 1; +/* BEGIN BENCHMARK CODE +$time_start = $this->_getmicrotime(); +/* END BENCHMARK CODE */ + $db = DB::connect($this->dsn, $this->persistent); + if (DB::isError($db)) { + $this->error("scanTableForMenu: " . $db->getMessage()); + } + $dbresult = $db->query(" + SELECT " . + $this->tableFields["id"] . " AS id, " . + $this->tableFields["parent_id"] . " AS parent_id, " . + $this->tableFields["text"] . " AS text, " . + $this->tableFields["href"] . " AS href, " . + $this->tableFields["title"] . " AS title, " . + $this->tableFields["icon"] . " AS icon, " . + $this->tableFields["target"] . " AS target, " . + $this->tableFields["expanded"] . " AS expanded + FROM " . $this->tableName . " + WHERE " . $this->tableFields["id"] . " <> 1 + ORDER BY " . $this->tableFields["orderfield"] . ", " . $this->tableFields["text"] . " ASC + "); + $this->_tmpArray = array(); + while ($dbresult->fetchInto($row, DB_FETCHMODE_ASSOC)) { + $this->_tmpArray[$row["id"]]["parent_id"] = $row["parent_id"]; + $this->_tmpArray[$row["id"]]["text"] = $row["text"]; + $this->_tmpArray[$row["id"]]["href"] = $row["href"]; + $this->_tmpArray[$row["id"]]["title"] = $row["title"]; + $this->_tmpArray[$row["id"]]["icon"] = $row["icon"]; + $this->_tmpArray[$row["id"]]["target"] = $row["target"]; + $this->_tmpArray[$row["id"]]["expanded"] = $row["expanded"]; + } + if ($language != "") { + $dbresult = $db->query(" + SELECT " . + $this->tableFields_i18n["id"] . " AS id, " . + $this->tableFields_i18n["text"] . " AS text, " . + $this->tableFields_i18n["title"] . " AS title + FROM " . $this->tableName_i18n . " + WHERE " . $this->tableFields_i18n["id"] . " <> 1 + AND " . $this->tableFields_i18n["language"] . " = '$language' + "); + while ($dbresult->fetchInto($row, DB_FETCHMODE_ASSOC)) { + $this->_tmpArray[$row["id"]]["text"] = $row["text"]; + $this->_tmpArray[$row["id"]]["title"] = $row["title"]; + } + } + unset($dbresult); + unset($row); + $this->_depthFirstSearch($this->_tmpArray, $menu_name, 1, 1); +/* BEGIN BENCHMARK CODE +$time_end = $this->_getmicrotime(); +$time = $time_end - $time_start; +print "TIME ELAPSED = " . $time . "\n
"; +/* END BENCHMARK CODE */ + $this->_lastItem[$menu_name] = count($this->tree); + $this->_nodesCount = $this->_lastItem[$menu_name]; + $this->tree[$this->_lastItem[$menu_name]+1]["level"] = 0; + $this->_postParse($menu_name); +} + +function _getmicrotime() { + list($usec, $sec) = explode(" ", microtime()); + return ((float) $usec + (float) $sec); +} + +/** +* Recursive method to perform the depth-first search of the tree data taken from the current menu table +* @access private +* @param array $tmpArray the temporary array that stores data to perform +* the depth-first search +* @param string $menu_name the name to be attributed to the menu +* whose structure has to be parsed +* @param integer $parent_id id of the item whose children have +* to be searched for +* @param integer $level the hierarchical level of children to be searched for +* @return void +*/ +function _depthFirstSearch($tmpArray, $menu_name, $parent_id=1, $level) { + reset ($tmpArray); + while (list($id, $foobar) = each($tmpArray)) { + if ($foobar["parent_id"] == $parent_id) { + unset($tmpArray[$id]); + unset($this->_tmpArray[$id]); + $cnt = count($this->tree) + 1; + $this->tree[$cnt]["level"] = $level; + $this->tree[$cnt]["text"] = $foobar["text"]; + $this->tree[$cnt]["href"] = $foobar["href"]; + $this->tree[$cnt]["title"] = $foobar["title"]; + $this->tree[$cnt]["icon"] = $foobar["icon"]; + $this->tree[$cnt]["target"] = $foobar["target"]; + $this->tree[$cnt]["expanded"] = $foobar["expanded"]; + unset($foobar); + if ($id != $parent_id) { + $this->_depthFirstSearch($this->_tmpArray, $menu_name, $id, $level+1); + } + } + } +} + +/** +* A method providing parsing needed after both file/string parsing and DB table parsing +* @access private +* @param string $menu_name the name of the menu for which the parsing +* has to be performed +* @return void +*/ +function _postParse( + $menu_name = "" // non consistent default... + ) { + for ($cnt=$this->_firstItem[$menu_name]; $cnt<=$this->_lastItem[$menu_name]; $cnt++) { // this counter scans all nodes of the new menu + $this->tree[$cnt]["child_of_root_node"] = ($this->tree[$cnt]["level"] == 1); + $this->tree[$cnt]["parsed_text"] = stripslashes($this->tree[$cnt]["text"]); + $this->tree[$cnt]["parsed_href"] = (ereg_replace(" ", "", $this->tree[$cnt]["href"]) == "") ? "#" : $this->prependedUrl . $this->tree[$cnt]["href"]; + $this->tree[$cnt]["parsed_title"] = ($this->tree[$cnt]["title"] == "") ? "" : " title=\"" . addslashes($this->tree[$cnt]["title"]) . "\""; + $fooimg = $this->imgdir . $this->tree[$cnt]["icon"]; + if ($this->tree[$cnt]["icon"] == "" || !(file_exists($fooimg))) { + $this->tree[$cnt]["parsed_icon"] = ""; + } else { + $this->tree[$cnt]["parsed_icon"] = $this->tree[$cnt]["icon"]; + $foobar = getimagesize($fooimg); + $this->tree[$cnt]["iconwidth"] = $foobar[0]; + $this->tree[$cnt]["iconheight"] = $foobar[1]; + } + $this->tree[$cnt]["parsed_target"] = ($this->tree[$cnt]["target"] == "") ? "" : " target=\"" . $this->tree[$cnt]["target"] . "\""; +// $this->tree[$cnt]["expanded"] = ($this->tree[$cnt]["expanded"] == "") ? 0 : $this->tree[$cnt]["expanded"]; + $this->_maxLevel[$menu_name] = max($this->_maxLevel[$menu_name], $this->tree[$cnt]["level"]); + if ($this->tree[$cnt]["level"] == 1) { + $this->_firstLevelCnt[$menu_name]++; + } + } +} + +/** +* Method to handle errors +* @access private +* @param string $errormsg the error message +* @return void +*/ +function error($errormsg) { + print "LayersMenu Error: " . $errormsg . "
\n"; + if ($this->haltOnError == "yes") { + die("Halted.
\n"); + } +} + +} /* END OF CLASS */ + +?> diff --git a/include/phplayersmenu/treemenu.inc.php b/include/phplayersmenu/treemenu.inc.php new file mode 100644 index 0000000..2f80d55 --- /dev/null +++ b/include/phplayersmenu/treemenu.inc.php @@ -0,0 +1,305 @@ +LayersMenuCommon(); + + $this->treeMenuImagesType = "png"; + $this->_treeMenu = array(); + + $this->_nodesCount = 0; + $this->tree = array(); + $this->_maxLevel = array(); + $this->_firstLevelCnt = array(); + $this->_firstItem = array(); + $this->_lastItem = array(); +} + +/** +* The method to set the dirroot directory +* @access public +* @return boolean +*/ +function setDirroot($dirroot) { + return $this->setDirrootCommon($dirroot); +} + +/** +* The method to set the type of images used for the Tree Menu +* @access public +* @return void +*/ +function setTreeMenuImagesType($treeMenuImagesType) { + $this->treeMenuImagesType = $treeMenuImagesType; +} + +/** +* Method to prepare a new Tree Menu. +* +* This method processes items of a menu to prepare and return +* the corresponding Tree Menu code. +* +* @access public +* @param string $menu_name the name of the menu whose items have to be processed +* @return string +*/ +function newTreeMenu( + $menu_name = "" // non consistent default... + ) { + if (!isset($this->_firstItem[$menu_name]) || !isset($this->_lastItem[$menu_name])) { + $this->error("newTreeMenu: the first/last item of the menu '$menu_name' is not defined; please check if you have parsed its menu data."); + return 0; + } + + $this->_treeMenu[$menu_name] = ""; + + $img_space = $this->imgwww . "tree_space." . $this->treeMenuImagesType; + $alt_space = " "; + $img_vertline = $this->imgwww . "tree_vertline." . $this->treeMenuImagesType; + $alt_vertline = "| "; + $img_expand = $this->imgwww . "tree_expand." . $this->treeMenuImagesType; + $alt_expand = "+-"; + $img_expand_first = $this->imgwww . "tree_expand_first." . $this->treeMenuImagesType; + $alt_expand_first = "+-"; + $img_expand_corner = $this->imgwww . "tree_expand_corner." . $this->treeMenuImagesType; + $alt_expand_corner = "+-"; + $img_collapse = $this->imgwww . "tree_collapse." . $this->treeMenuImagesType; + $alt_collapse = "--"; + $img_collapse_first = $this->imgwww . "tree_collapse_first." . $this->treeMenuImagesType; + $alt_collapse_first = "--"; + $img_collapse_corner = $this->imgwww . "tree_collapse_corner." . $this->treeMenuImagesType; + $alt_collapse_corner = "--"; + $img_split = $this->imgwww . "tree_split." . $this->treeMenuImagesType; + $alt_split = "|-"; + $img_split_first = $this->imgwww . "tree_split_first." . $this->treeMenuImagesType; + $alt_split_first = "|-"; + $img_corner = $this->imgwww . "tree_corner." . $this->treeMenuImagesType; + $alt_corner = "`-"; + $img_folder_closed = $this->imgwww . "tree_folder_closed." . $this->treeMenuImagesType; + $alt_folder_closed = "->"; + $img_folder_open = $this->imgwww . "tree_folder_open." . $this->treeMenuImagesType; + $alt_folder_open = "->"; + $img_leaf = $this->imgwww . "tree_leaf." . $this->treeMenuImagesType; + $alt_leaf = "->"; + + for ($i=0; $i<=$this->_maxLevel[$menu_name]; $i++) { + $levels[$i] = 0; + } + + // Find last nodes of subtrees + $last_level = $this->_maxLevel[$menu_name]; + for ($i=$this->_lastItem[$menu_name]; $i>=$this->_firstItem[$menu_name]; $i--) { + if ($this->tree[$i]["level"] < $last_level) { + for ($j=$this->tree[$i]["level"]+1; $j<=$this->_maxLevel[$menu_name]; $j++) { + $levels[$j] = 0; + } + } + if ($levels[$this->tree[$i]["level"]] == 0) { + $levels[$this->tree[$i]["level"]] = 1; + $this->tree[$i]["last_item"] = 1; + } else { + $this->tree[$i]["last_item"] = 0; + } + $last_level = $this->tree[$i]["level"]; + } + + $toggle = ""; + $toggle_function_name = "toggle" . $menu_name; + + for ($cnt=$this->_firstItem[$menu_name]; $cnt<=$this->_lastItem[$menu_name]; $cnt++) { + $this->_treeMenu[$menu_name] .= "
\n"; + + // vertical lines from higher levels + for ($i=0; $i<$this->tree[$cnt]["level"]-1; $i++) { + if ($levels[$i] == 1) { + $img = $img_vertline; + $alt = $alt_vertline; + } else { + $img = $img_space; + $alt = $alt_space; + } + $this->_treeMenu[$menu_name] .= "\"""; + } + + $not_a_leaf = $cnt<$this->_lastItem[$menu_name] && $this->tree[$cnt+1]["level"]>$this->tree[$cnt]["level"]; + + if ($this->tree[$cnt]["last_item"] == 1) { + // corner at end of subtree or t-split + if ($not_a_leaf) { + $this->_treeMenu[$menu_name] .= "\"""; + } else { + $this->_treeMenu[$menu_name] .= "\"""; + } + $levels[$this->tree[$cnt]["level"]-1] = 0; + } else { + if ($not_a_leaf) { + if ($cnt == $this->_firstItem[$menu_name]) { + $img = $img_collapse_first; + $alt = $alt_collapse_first; + } else { + $img = $img_collapse; + $alt = $alt_collapse; + } + $this->_treeMenu[$menu_name] .= "\"""; + } else { + if ($cnt == $this->_firstItem[$menu_name]) { + $img = $img_split_first; + $alt = $alt_split_first; + } else { + $img = $img_split; + $alt = $alt_split; + } + $this->_treeMenu[$menu_name] .= "\"""; + } + $levels[$this->tree[$cnt]["level"]-1] = 1; + } + + if ($this->tree[$cnt]["parsed_href"] == "" || $this->tree[$cnt]["parsed_href"] == "#") { + $a_href_open_img = ""; + $a_href_close_img = ""; + $a_href_open = ""; + $a_href_close = ""; + } else { + $a_href_open_img = "tree[$cnt]["parsed_href"] . "\"" . $this->tree[$cnt]["parsed_title"] . $this->tree[$cnt]["parsed_target"] . ">"; + $a_href_close_img = ""; + $a_href_open = "tree[$cnt]["parsed_href"] . "\"" . $this->tree[$cnt]["parsed_title"] . $this->tree[$cnt]["parsed_target"] . " class=\"phplm\">"; + $a_href_close = ""; + } + + if ($not_a_leaf) { + $this->_treeMenu[$menu_name] .= $a_href_open_img . "\""" . $a_href_close_img; + } else { + if ($this->tree[$cnt]["parsed_icon"] != "") { + $this->_treeMenu[$menu_name] .= $a_href_open_img . "imgwww . $this->tree[$cnt]["parsed_icon"] . "\" width=\"" . $this->tree[$cnt]["iconwidth"] . "\" height=\"" . $this->tree[$cnt]["iconheight"] . "\" alt=\"" . $alt_leaf . "\" />" . $a_href_close_img; + } else { + $this->_treeMenu[$menu_name] .= $a_href_open_img . "\""" . $a_href_close_img; + } + } + $this->_treeMenu[$menu_name] .= " " . $a_href_open . $this->tree[$cnt]["text"] . $a_href_close . "\n"; + $this->_treeMenu[$menu_name] .= "
\n"; + + if ($cnt<$this->_lastItem[$menu_name] && $this->tree[$cnt]["level"]<$this->tree[$cnt+1]["level"]) { + $this->_treeMenu[$menu_name] .= "
\n"; + if ($this->tree[$cnt]["expanded"] != 1) { + $toggle .= "if (expand[" . $cnt . "] != 1) " . $toggle_function_name . "('" . $cnt . "');\n"; + } else { + $toggle .= "if (collapse[" . $cnt . "] == 1) " . $toggle_function_name . "('" . $cnt . "');\n"; + } + } + + if ($cnt>$this->_firstItem[$menu_name] && $this->tree[$cnt]["level"]>$this->tree[$cnt+1]["level"]) { + for ($i=max(1, $this->tree[$cnt+1]["level"]); $i<$this->tree[$cnt]["level"]; $i++) { + $this->_treeMenu[$menu_name] .= "
\n"; + } + } + } + +/* + $this->_treeMenu[$menu_name] = + "
\n" . + $this->_treeMenu[$menu_name] . + "
\n"; +*/ + // Some (old) browsers do not support the "white-space: nowrap;" CSS property... + $this->_treeMenu[$menu_name] = + "\n" . + "\n" . + "\n" . + "\n" . + "
\n" . + $this->_treeMenu[$menu_name] . + "
\n"; + + $t = new Template_PHPLIB(); + $t->setFile("tplfile", $this->libjsdir . "layerstreemenu.ijs"); + $t->setVar(array( + "toggle_function_name" => $toggle_function_name, + "img_expand" => $img_expand, + "img_expand_first" => $img_expand_first, + "img_collapse" => $img_collapse, + "img_collapse_first" => $img_collapse_first, + "img_collapse_corner" => $img_collapse_corner, + "img_folder_open" => $img_folder_open, + "img_expand_corner" => $img_expand_corner, + "img_folder_closed" => $img_folder_closed + )); + $toggle_function = $t->parse("out", "tplfile"); + $toggle_function = + "\n"; + + $toggle = + "\n"; + + $this->_treeMenu[$menu_name] = $toggle_function . "\n" . $this->_treeMenu[$menu_name] . "\n" . $toggle; + + return $this->_treeMenu[$menu_name]; +} + +/** +* Method that returns the code of the requested Tree Menu +* @access public +* @param string $menu_name the name of the menu whose Tree Menu code +* has to be returned +* @return string +*/ +function getTreeMenu($menu_name) { + return $this->_treeMenu[$menu_name]; +} + +/** +* Method that prints the code of the requested Tree Menu +* @access public +* @param string $menu_name the name of the menu whose Tree Menu code +* has to be printed +* @return void +*/ +function printTreeMenu($menu_name) { + print $this->_treeMenu[$menu_name]; +} + +} /* END OF CLASS */ + +?> diff --git a/plugins/FileList.php b/plugins/FileList.php new file mode 100644 index 0000000..f97197a --- /dev/null +++ b/plugins/FileList.php @@ -0,0 +1,148 @@ +{FileList}
in your page where the file list should appear."; + + /** Plugin parameters */ + var $params = array('dirbase' => "", 'urlbase' => "", 'match' => ""); + + + /** Prepare the output for a single file of the list. + * + * @param $file + * @param $title + * @param $url + */ + function list_file($file,$title,$url="") { + if (empty($url)) $url = $file; + global $globals; + + /* get modification date / time */ + $modified = date ("d M Y H:m:s", filemtime($file)); + + /* get file icon */ + $icon = $globals->icons->get_mime_icon($file); + + /* calculate file size */ + $size = filesize($file); + if ($size < 1000) + $size = "$size B"; + elseif ($size < 1000000) + $size = floor($size/1000)." kB"; + else + $size = floor($size/1000000)." MB"; + + /* figure out description */ + $show = 1; + if (preg_match("/(i386\.changes|\.dsc)$/",$file)) + $show = 0; + elseif (preg_match("/\.tar\.gz$/",$file)) + $desc = "source tarball"; + elseif (preg_match("/_(all|i386)\.deb$/",$file,$matches)) + { + $type = $matches[1]; + $desc = "Debian package"; + if ($type == "all") + $desc .= " [platform independant]"; + else + $desc .= " [$type specific]"; + } + elseif (preg_match("/\.diff\.gz$/",$file)) + $desc = "Debian diff"; + else $desc = " "; + + /* display the link */ + if ($show) + return "$title$modified$size$desc\n"; + } + + + /** Show an instance of the FileList plugin. + * + * @param $args + */ + function show($args) + { + global $page; + $bbarel = $page->barrel; + + // process arguments + $params = array(); + foreach($this->params as $key => $val) { + $params[$key] = isset($args[$key]) ? $args[$key] : $this->params[$key]; + } + + //print_r($params); + if (empty($params['dirbase'])) { + $params['dirbase'] = $bbarel->spool->spoolPath($page->curpage->props['PID']); + } + + // process parameters + $output = ''; + $dir = $params['dirbase']; + if (is_dir($dir) && ($dh = opendir($dir))) { + $output .= + ' + + + + + + '; + + /* get the matching files */ + while (($fname = readdir($dh)) !== false) { + if ( is_file("$dir/$fname") + && preg_match('/^'.$params['match'].'/',$fname) ) + $filelist[] = $fname; + } + closedir($dh); + + /* order and display */ + if (is_array($filelist)) { + rsort($filelist); + while(list ($key,$val) = each($filelist)) { + $output .= $this->list_file("$dir/$val",$val,$params['urlbase'].$val); + } + } else { + $output .= ''; + } + $output .= '
'.__("file").''.__("date").''.__("size").''.__("description").'
'.__("no files").'
'; + } + return $output; + } +} + +?> diff --git a/plugins/HtmlHead.php b/plugins/HtmlHead.php new file mode 100644 index 0000000..a1be65c --- /dev/null +++ b/plugins/HtmlHead.php @@ -0,0 +1,54 @@ + block. + */ +class HtmlHead extends Diogenes_Plugin_Filter +{ + /** Plugin name */ + var $name = "HtmlHead"; + + /** Plugin description */ + var $description = "This plugin allows you to add entries to a page's <head> block."; + + /** Plugin parameters */ + var $params = array('contents' => ''); + + /** Apply filtering to the input and return an output. + * + * @param $input + */ + function filter($input) + { + global $page; + + if ($this->params['contents']) + { + array_push($page->head, $this->params['contents']); + } + + return $input; + } + +} +?> diff --git a/plugins/HttpHeader.php b/plugins/HttpHeader.php new file mode 100644 index 0000000..9c89fb4 --- /dev/null +++ b/plugins/HttpHeader.php @@ -0,0 +1,54 @@ + ''); + + /** Apply filtering to the input and return an output. + * + * @param $input + */ + function filter($input) + { + $header = $this->params['contents']; + + if ($header) + { + header($header); + } + + return $input; + } + +} +?> diff --git a/plugins/LinksMagic.php b/plugins/LinksMagic.php new file mode 100644 index 0000000..7301c0f --- /dev/null +++ b/plugins/LinksMagic.php @@ -0,0 +1,60 @@ + 1, 'sidebar' => 1); + + /** Apply filtering to the input and return an output. + * + * @param $input + */ + function filter($input) + { + global $page; + + if ($this->params['sidebar']) + { + array_unshift($page->head, ''); + } + + if ($this->params['main']) + { + array_unshift($page->head, ''); + } + + return $input; + } + +} +?> diff --git a/plugins/MailForm.php b/plugins/MailForm.php new file mode 100644 index 0000000..8125ebb --- /dev/null +++ b/plugins/MailForm.php @@ -0,0 +1,134 @@ +{MailForm}
in your page where the mail form should appear."; + + /** Plugin parameters */ + var $params = array('email' => '', 'title' => '', 'subject_tag' => '[web form] '); + + /** Show an instance of the MailForm plugin. + */ + function show() + { + global $page; + + // get params + $to_email = $this->params['email']; + $form_title = $this->params['title']; + + if (!isvalid_email($to_email)) { + return '

You must specify a valid e-mail in the "email" parameter to make use of the MailForm plugin.

'; + } + + // get input + $action = clean_request('action'); + $from = clean_request('from'); + + $refer = strip_request('refer'); + if (!$refer) + $refer = $_SERVER['HTTP_REFERER']; + $message = strip_request('message'); + $subject = strip_request('subject'); + + $showform=0; + $output = ''; + switch($action) { + case "mail": + if ((!$subject)||(!$message)||(!$from)) { + $output .= '

Missing fields !

'; + $showform=1; + break; + } + + if (!isvalid_email($from)) { + $output .= '

Invalid email address !

'; + $showform=1; + break; + } + + $mymail = new HermesMailer(); + $mymail->setFrom($from); + $mymail->setSubject($this->params['subject_tag'].$subject); + $mymail->addTo($to_email); + $mymail->setTxtBody($message); + $mymail->send(); + + $output .= '

Message sent !

'; + if ($refer!="") { + $output .= '

To return to referring web page click here

'; + } + break; + default: + $showform=1; + } + + if ($showform) { + $output .= + '
+ +
+ + + + + + + + + + + + + + + + + + + + + +
'.$form_title.'
'.__("from").'
'.__("subject").'
'.__("message").'
  + + + +
+ +
'; + } + return $output; + } +} +?> diff --git a/plugins/RenderPhp.php b/plugins/RenderPhp.php new file mode 100644 index 0000000..d1aa999 --- /dev/null +++ b/plugins/RenderPhp.php @@ -0,0 +1,47 @@ + diff --git a/plugins/TextileMarkup.php b/plugins/TextileMarkup.php new file mode 100644 index 0000000..29f700d --- /dev/null +++ b/plugins/TextileMarkup.php @@ -0,0 +1,57 @@ +sample Textile markup pages."; + + + /** Is the plugin allowed with respect to a given write permission on a page ? + * + * @param $wperms + */ + function allow_wperms($wperms) + { + return 1; + } + + + /** Take the Wiki markup and return XHTML. + * + * @param $input + */ + function filter($input) + { + $textile = new Textile(); + return $textile->TextileThis($input); + } + +} + +?> diff --git a/plugins/WikiMarkup.php b/plugins/WikiMarkup.php new file mode 100644 index 0000000..f1cf322 --- /dev/null +++ b/plugins/WikiMarkup.php @@ -0,0 +1,56 @@ +sample Text_Wiki markup pages."; + + + /** Is the plugin allowed with respect to a given write permission on a page ? + * @param $wperms + */ + function allow_wperms($wperms) + { + return 1; + } + + + /** Take the Wiki markup and return XHTML. + * + * @param $input + */ + function filter($input) + { + $wiki =& new Text_Wiki(); + return $wiki->transform($input, 'Xhtml'); + } +} + +?> diff --git a/po/Makefile b/po/Makefile new file mode 100644 index 0000000..9deeda3 --- /dev/null +++ b/po/Makefile @@ -0,0 +1,59 @@ +# Horde .mo files makefile +# +# $Horde: horde/po/Makefile,v 1.2.2.3 2002/05/20 17:36:22 jan Exp $ +# + +APPLICATION = diogenes +MSGFMT = msgfmt --statistics -c -v -o +MSGFMTSOL = msgfmt -v -o +MSGMERGE = msgmerge -U +XGETTEXT = xgettext +XGETTEXT_OPTS = -j -k__ -o +PHPFILES = find htdocs include -name "*.php" + + +all: install + +clearlocations: + cd .. && ${XGETTEXT} --no-location ${XGETTEXT_OPTS} po/${APPLICATION}.pot `${PHPFILES}` + cd .. && ${XGETTEXT} --add-location ${XGETTEXT_OPTS} po/${APPLICATION}.pot `${PHPFILES}` + +xgettext: + cd .. && ${XGETTEXT} ${XGETTEXT_OPTS} po/${APPLICATION}.pot `${PHPFILES}` + +%.po: ${APPLICATION}.pot + @echo "Updating .po files from .pot:" + ${MSGMERGE} $@ $< + +install: *.po + @echo "Checking for os ... ${OSTYPE}"; \ + if test "${OSTYPE}" = "solaris"; then \ + echo "You'll probably get some warnings on Solaris. This is normal."; \ + fi; \ + for LOCALE in `ls *.po | sed 's/\.[^.]*$$//g'`; do \ + if test $${LOCALE}.po = "messages.po"; then \ + continue; \ + fi; \ + echo "Compiling locale $${LOCALE}:"; \ + if ./shtool mkdir -p ../locale/$${LOCALE}/LC_MESSAGES; then \ + if test "${OSTYPE}" = "solaris"; then \ + if ${MSGFMTSOL} ../locale/$${LOCALE}/LC_MESSAGES/${APPLICATION}.mo $${LOCALE}.po; then \ + echo " ... done"; \ + echo; \ + else \ + echo " ... FAILED"; \ + echo; \ + fi \ + else \ + if ${MSGFMT} ../locale/$${LOCALE}/LC_MESSAGES/${APPLICATION}.mo $${LOCALE}.po; then \ + echo " ... done"; \ + echo; \ + else \ + echo " ... FAILED"; \ + echo; \ + fi \ + fi; \ + else \ + echo "Could not create locale directory for $${LOCALE}."; \ + fi \ + done; diff --git a/po/diogenes.pot b/po/diogenes.pot new file mode 100644 index 0000000..ca02387 --- /dev/null +++ b/po/diogenes.pot @@ -0,0 +1,1480 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-01-07 16:44+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: htdocs/index.php:9 htdocs/index.php:13 include/admin/bad.php:46 +msgid "Welcome to Diogenes" +msgstr "" + +#: htdocs/index.php:11 htdocs/index.php:15 +msgid "Welcome to the Diogenes content management system." +msgstr "" + +#: htdocs/index.php:12 htdocs/index.php:16 +msgid "" +"Diogenes was developed by the webmasters of the Polytechnique.org web site." +msgstr "" + +#: htdocs/index.php:13 htdocs/index.php:17 +msgid "The following barrels are currently available" +msgstr "" + +#: htdocs/index.php:14 htdocs/toplevel/admins.php:8 +#: include/diogenes.barrel-editor.inc.php:152 include/Barrel/Editor.php:159 +msgid "site" +msgstr "" + +#: htdocs/index.php:15 htdocs/toplevel/index.php:12 +#: htdocs/toplevel/logger_actions.php:14 include/admin/options.php:61 +#: include/admin/options.php:63 include/diogenes.barrel-editor.inc.php:153 +#: include/diogenes.plugin-editor.inc.php:238 include/admin/options.php:65 +#: include/Barrel/Editor.php:160 include/Plugin/Editor.php:267 +msgid "description" +msgstr "" + +#: htdocs/prefs.php:19 +msgid "Changing password.." +msgstr "" + +#: htdocs/prefs.php:33 include/admin/prefs.php:20 +msgid "User preferences" +msgstr "" + +#: htdocs/prefs.php:34 include/admin/prefs.php:21 +msgid "Diogenes preferences" +msgstr "" + +#: htdocs/prefs.php:36 +msgid "my information" +msgstr "" + +#: htdocs/prefs.php:37 htdocs/toplevel/accounts.php:13 +#: htdocs/toplevel/boot.php:28 include/diogenes.session.inc.php:138 +msgid "username" +msgstr "" + +#: htdocs/prefs.php:38 +msgid "full name" +msgstr "" + +#: htdocs/prefs.php:40 include/admin/prefs.php:23 +msgid "language" +msgstr "" + +#: htdocs/prefs.php:41 include/admin/prefs.php:24 +msgid "" +"You can select your preferred language by clicking on the appropriate " +"language below." +msgstr "" + +#: htdocs/prefs.php:43 +msgid "my password" +msgstr "" + +#: htdocs/prefs.php:44 +msgid "new password" +msgstr "" + +#: htdocs/prefs.php:45 +msgid "confirmation" +msgstr "" + +#: htdocs/prefs.php:47 include/admin/prefs.php:26 +msgid "Change" +msgstr "" + +#: include/admin/compose.php:32 include/admin/edit.php:31 +#: include/admin/compose.php:34 include/admin/edit.php:33 +msgid "Commiting changes to file" +msgstr "" + +#: include/admin/edit.php:41 include/admin/edit.php:43 +msgid "File editor" +msgstr "" + +#: include/admin/edit.php:45 include/admin/edit.php:47 +msgid "File source" +msgstr "" + +#: htdocs/toplevel/index.php:16 htdocs/toplevel/options.php:89 +#: include/admin/menus.php:151 include/admin/options.php:72 +#: include/admin/pages.php:12 include/admin/edit.php:48 +#: include/diogenes.session.inc.php:137 +#: include/diogenes/diogenes.logger-view.inc.php:382 +#: include/diogenes/diogenes.table-editor.inc.php:536 +#: htdocs/toplevel/options.php:53 include/admin/files.php:41 +#: include/admin/menus.php:152 include/admin/options.php:74 +#: include/admin/pages.php:15 include/admin/edit.php:50 +#: include/diogenes/diogenes.logger-view.inc.php:379 +#: include/diogenes/diogenes.table-editor.inc.php:541 +#: include/diogenes.barrel-editor.inc.php:157 +#: include/diogenes.plugin-editor.inc.php:235 include/admin/files.php:38 +#: include/admin/menus.php:164 include/admin/options.php:76 +#: include/admin/pages.php:14 include/Barrel/Editor.php:164 +#: include/Plugin/Editor.php:264 +#: include/diogenes/diogenes.logger-view.inc.php:378 +msgid "Submit" +msgstr "" + +#: include/admin/files.php:27 include/admin/pages.php:152 +#: include/admin/compose.php:58 include/admin/edit.php:50 +#: include/Barrel/Page.php:143 +msgid "pages catalog" +msgstr "" + +#: include/admin/files.php:28 include/admin/pages.php:154 +#: include/admin/compose.php:59 include/admin/edit.php:51 +#: include/Barrel/Page.php:147 include/admin/index.php:74 +#: include/Barrel/Page.php:174 +msgid "page properties" +msgstr "" + +#: include/admin/files.php:29 include/admin/pages.php:155 +#: include/admin/compose.php:60 include/admin/edit.php:52 +#: include/diogenes.rcs.inc.php:452 include/diogenes.rcs.inc.php:621 +#: include/Barrel/Page.php:148 include/admin/files.php:146 +#: include/Barrel/Page.php:175 +msgid "view page" +msgstr "" + +#: include/admin/files.php:83 include/admin/files.php:92 +#: include/admin/files.php:101 include/admin/pages.php:156 +#: include/admin/compose.php:61 include/admin/edit.php:53 +#: include/Barrel/Page.php:149 include/Barrel/Page.php:173 +msgid "browse files" +msgstr "" + +#: include/admin/files.php:35 include/admin/pages.php:167 +#: include/admin/compose.php:64 include/admin/edit.php:56 +#: include/admin/pages.php:132 include/Barrel/File.php:94 +#: include/Barrel/File.php:114 +msgid "raw editor" +msgstr "" + +#: htdocs/toplevel/options.php:88 include/admin/files.php:36 +#: include/admin/pages.php:168 include/admin/compose.php:65 +#: include/admin/edit.php:57 include/diogenes.barrel.inc.php:316 +#: htdocs/toplevel/options.php:51 include/admin/pages.php:133 +#: include/diogenes.barrel.inc.php:347 include/Barrel/File.php:95 +#: include/Barrel/File.php:115 include/diogenes.barrel.inc.php:343 +msgid "HTML editor" +msgstr "" + +#: include/admin/files.php:85 include/admin/files.php:94 +#: include/admin/pages.php:163 include/admin/pages.php:170 +#: include/admin/compose.php:66 include/admin/edit.php:58 +#: include/admin/pages.php:129 include/admin/pages.php:134 +#: include/Barrel/File.php:97 include/Barrel/File.php:117 +msgid "file revisions" +msgstr "" + +msgid "Ekit" +msgstr "" + +#: include/admin/menus.php:36 include/admin/menus.php:37 +msgid "The site's menus" +msgstr "" + +#: include/admin/menus.php:44 include/admin/menus.php:45 +msgid "The selected menu has child items, please remove them first." +msgstr "" + +#: include/admin/menus.php:144 include/admin/menus.php:145 +#: include/admin/menus.php:157 +msgid "menu entry properties" +msgstr "" + +#: include/admin/menus.php:147 include/admin/menus.php:148 +#: include/admin/menus.php:160 +msgid "none" +msgstr "" + +#: include/admin/menus.php:148 include/admin/menus.php:149 +#: include/admin/menus.php:161 +msgid "internal link" +msgstr "" + +#: include/admin/menus.php:149 include/admin/menus.php:150 +#: include/admin/menus.php:162 +msgid "external link" +msgstr "" + +#: include/admin/menus.php:173 include/diogenes.plugin-editor.inc.php:240 +#: include/admin/menus.php:185 include/Plugin/Editor.php:269 +msgid "move up" +msgstr "" + +#: include/admin/menus.php:176 include/diogenes.plugin-editor.inc.php:241 +#: include/admin/menus.php:188 include/Plugin/Editor.php:270 +msgid "move down" +msgstr "" + +#: htdocs/toplevel/index.php:85 include/admin/menus.php:178 +#: include/diogenes.rcs.inc.php:417 +#: include/diogenes/diogenes.table-editor.inc.php:529 +#: include/diogenes/diogenes.table-editor.inc.php:534 +#: include/diogenes.barrel-editor.inc.php:43 include/Barrel/Page.php:119 +#: include/Barrel/File.php:74 include/admin/menus.php:190 +#: include/Barrel/File.php:92 include/Barrel/Page.php:143 +#: include/Barrel/Editor.php:45 +msgid "edit" +msgstr "" + +#: htdocs/toplevel/index.php:87 include/admin/menus.php:179 +#: include/admin/pages.php:202 include/diogenes.rcs.inc.php:419 +#: include/diogenes/diogenes.table-editor.inc.php:528 +#: include/diogenes/diogenes.table-editor.inc.php:533 +#: include/diogenes.barrel-editor.inc.php:52 include/Barrel/Page.php:129 +#: include/Barrel/File.php:77 include/admin/menus.php:191 +#: include/Barrel/File.php:95 include/Barrel/Page.php:153 +#: include/Barrel/Editor.php:54 +msgid "delete" +msgstr "" + +#: include/admin/menus.php:217 include/admin/menus.php:216 +#: include/admin/menus.php:228 +msgid "External links are denoted with the [ext] prefix." +msgstr "" + +#: include/admin/menus.php:222 include/admin/menus.php:221 +#: include/admin/menus.php:233 +msgid "Add new entry" +msgstr "" + +#: include/admin/files.php:63 include/admin/files.php:86 +#: include/admin/files.php:88 +msgid "Error during file transfer!" +msgstr "" + +#: include/admin/files.php:69 include/admin/files.php:92 +#: include/admin/files.php:94 +msgid "Deleting file" +msgstr "" + +#: include/admin/files.php:81 include/admin/files.php:112 +#: include/admin/files.php:120 +msgid "Revision differences" +msgstr "" + +#: include/admin/files.php:90 include/admin/files.php:120 +#: include/admin/files.php:128 +msgid "File revisions" +msgstr "" + +#: include/admin/files.php:103 include/admin/files.php:155 +#: include/admin/files.php:194 +msgid "File manager" +msgstr "" + +#: include/admin/files.php:40 include/admin/files.php:38 +msgid "Files in current directory" +msgstr "" + +#: include/admin/files.php:41 include/admin/files.php:40 +#: include/admin/files.php:37 +msgid "Import file" +msgstr "" + +#: include/admin/files.php:42 include/admin/pages.php:210 +#: include/admin/pages.php:191 include/admin/files.php:39 +#: include/admin/pages.php:163 +msgid "Send" +msgstr "" + +#: include/admin/files.php:43 +msgid "File to upload" +msgstr "" + +#: include/admin/index.php:20 include/admin/index.php:45 +#: include/admin/index.php:47 +msgid "site created" +msgstr "" + +#: include/admin/index.php:23 include/admin/index.php:50 +#: include/admin/index.php:63 +msgid "page created" +msgstr "" + +#: include/admin/index.php:26 include/admin/index.php:54 +msgid "page deleted" +msgstr "" + +#: include/admin/index.php:31 include/admin/index.php:59 +#: include/admin/index.php:86 +msgid "file updated" +msgstr "" + +#: include/admin/index.php:34 include/admin/index.php:64 +msgid "file removed" +msgstr "" + +#: include/admin/index.php:43 include/admin/index.php:77 +#: include/admin/index.php:105 +msgid "Welcome to the Diogenes backoffice" +msgstr "" + +#: include/admin/files.php:47 include/admin/index.php:44 +#: include/diogenes/diogenes.logger-view.inc.php:372 +#: include/admin/files.php:49 include/admin/index.php:78 +#: include/diogenes/diogenes.logger-view.inc.php:369 +#: include/admin/files.php:46 include/admin/index.php:106 +#: include/diogenes/diogenes.logger-view.inc.php:368 +msgid "date" +msgstr "" + +#: include/admin/index.php:45 include/admin/users.php:28 +#: include/diogenes/diogenes.logger-view.inc.php:369 +#: include/admin/index.php:79 +#: include/diogenes/diogenes.logger-view.inc.php:366 +#: include/admin/index.php:107 +#: include/diogenes/diogenes.logger-view.inc.php:365 +msgid "user" +msgstr "" + +#: include/admin/index.php:46 include/admin/index.php:80 +#: include/admin/index.php:108 +msgid "event" +msgstr "" + +#: include/admin/pages.php:11 include/admin/pages.php:14 +#: include/admin/pages.php:158 +msgid "Page manager" +msgstr "" + +#: include/admin/pages.php:13 include/admin/pages.php:16 +#: include/admin/pages.php:15 +msgid "Reset" +msgstr "" + +#: include/admin/pages.php:14 include/diogenes.barrel.inc.php:312 +#: include/admin/pages.php:17 include/diogenes.barrel.inc.php:343 +#: include/admin/pages.php:16 include/diogenes.barrel.inc.php:339 +msgid "Page properties" +msgstr "" + +#: include/admin/pages.php:15 include/admin/files.php:55 +#: include/admin/pages.php:19 include/admin/files.php:52 +#: include/admin/pages.php:18 +msgid "location" +msgstr "" + +#: htdocs/toplevel/index.php:10 htdocs/toplevel/logger_actions.php:13 +#: include/admin/options.php:60 include/admin/pages.php:16 +#: include/admin/files.php:56 include/admin/options.php:62 +#: include/admin/pages.php:20 include/admin/files.php:53 +#: include/admin/options.php:64 include/admin/pages.php:19 +msgid "title" +msgstr "" + +msgid "display" +msgstr "" + +#: include/admin/files.php:56 include/admin/pages.php:22 +msgid "access" +msgstr "" + +#: include/admin/pages.php:22 include/admin/pages.php:26 +msgid "Add a page" +msgstr "" + +#: include/admin/pages.php:43 include/admin/pages.php:47 +#: include/admin/pages.php:50 +msgid "Document name does not end in .doc" +msgstr "" + +#: include/admin/pages.php:46 include/admin/pages.php:50 +#: include/admin/pages.php:53 +msgid "Checking in Word file" +msgstr "" + +#: include/admin/pages.php:51 include/admin/pages.php:55 +#: include/admin/pages.php:58 +msgid "Importing Word file" +msgstr "" + +#: include/admin/pages.php:57 include/admin/pages.php:61 +#: include/admin/pages.php:64 +msgid "Importing HTML file" +msgstr "" + +#: include/admin/pages.php:62 include/admin/pages.php:66 +#: include/admin/pages.php:69 +msgid "Raw file import" +msgstr "" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "visible" +msgstr "" + +msgid "invisible" +msgstr "" + +#: htdocs/toplevel/index.php:84 include/admin/pages.php:196 +#: include/diogenes.rcs.inc.php:416 include/diogenes.rcs.inc.php:450 +#: include/diogenes.rcs.inc.php:619 include/Barrel/Page.php:118 +#: include/Barrel/File.php:73 include/admin/files.php:144 +#: include/Barrel/File.php:91 include/Barrel/Page.php:142 +msgid "view" +msgstr "" + +#: include/admin/pages.php:197 include/Barrel/Page.php:120 +#: include/Barrel/Page.php:144 +msgid "properties" +msgstr "" + +#: include/admin/pages.php:198 +msgid "files" +msgstr "" + +#: include/admin/pages.php:199 include/diogenes.rcs.inc.php:418 +#: include/Barrel/Page.php:121 include/Barrel/File.php:75 +#: include/Barrel/File.php:93 include/Barrel/Page.php:145 +msgid "revisions" +msgstr "" + +#: include/admin/pages.php:211 include/admin/pages.php:195 +#: include/admin/pages.php:172 +msgid "Import a Word document" +msgstr "" + +#: include/admin/pages.php:214 include/admin/pages.php:198 +#: include/admin/pages.php:176 +msgid "This page's master document is currently a Word document." +msgstr "" + +#: include/admin/pages.php:215 include/admin/pages.php:199 +#: include/admin/pages.php:177 +msgid "You can upload a new version of the Word document below." +msgstr "" + +#: include/admin/pages.php:216 include/admin/pages.php:200 +#: include/admin/pages.php:178 +msgid "You can get the current version of the file here" +msgstr "" + +#: include/admin/pages.php:219 include/admin/pages.php:203 +#: include/admin/pages.php:181 +msgid "If you wish, you can set this page's content from a Word document." +msgstr "" + +#: include/admin/pages.php:220 include/admin/pages.php:204 +#: include/admin/pages.php:182 +msgid "To do so, simply upload the Word document below." +msgstr "" + +#: include/admin/pages.php:222 include/admin/pages.php:208 +#: include/admin/pages.php:160 +msgid "Import HTML" +msgstr "" + +#: include/admin/pages.php:223 include/admin/pages.php:209 +#: include/admin/pages.php:161 +msgid "" +"You can replace the current page's contents by uploading an HTML file below." +msgstr "" + +#: include/admin/pages.php:224 include/admin/pages.php:210 +#: include/admin/pages.php:162 +msgid "" +"If the file name ends with .htm or .html, anything outside the <body>" +"</body> pair will be stripped." +msgstr "" + +#: htdocs/toplevel/admins.php:20 include/admin/users.php:15 +msgid "Could not find requested user" +msgstr "" + +#: include/admin/users.php:24 +msgid "Users administration" +msgstr "" + +#: include/admin/users.php:25 +msgid "Registered users" +msgstr "" + +#: include/admin/users.php:26 include/diogenes.toplevel.inc.php:200 +#: include/diogenes.toplevel.inc.php:94 include/diogenes.toplevel.inc.php:95 +msgid "Administrators" +msgstr "" + +#: include/admin/users.php:29 +#: include/diogenes/diogenes.logger-view.inc.php:373 +#: include/diogenes/diogenes.table-editor.inc.php:526 +#: include/diogenes/diogenes.logger-view.inc.php:370 +#: include/diogenes/diogenes.table-editor.inc.php:531 +#: include/diogenes/diogenes.logger-view.inc.php:369 +msgid "action" +msgstr "" + +#: htdocs/toplevel/admins.php:45 include/admin/users.php:35 +msgid "remove" +msgstr "" + +#: include/diogenes.session.inc.php:134 +msgid "Diogenes login" +msgstr "" + +#: include/diogenes.session.inc.php:135 +msgid "Connexion" +msgstr "" + +#: htdocs/toplevel/accounts.php:16 htdocs/toplevel/boot.php:31 +#: include/diogenes.session.inc.php:136 +msgid "password" +msgstr "" + +#: include/diogenes.toplevel.inc.php:52 include/diogenes.barrel.inc.php:104 +#: include/diogenes.barrel.inc.php:105 include/diogenes.toplevel.inc.php:53 +#: include/diogenes.barrel.inc.php:107 +msgid "You are not authorized to view this page!" +msgstr "" + +#: include/diogenes.toplevel.inc.php:38 include/diogenes.toplevel.inc.php:187 +#: include/diogenes.admin.inc.php:62 include/diogenes.barrel.inc.php:301 +#: include/diogenes.toplevel.inc.php:81 include/diogenes.barrel.inc.php:332 +#: include/diogenes.admin.inc.php:69 include/diogenes.toplevel.inc.php:39 +#: include/diogenes.toplevel.inc.php:82 include/diogenes.admin.inc.php:68 +#: include/diogenes.barrel.inc.php:328 +msgid "Home" +msgstr "" + +#: include/diogenes.toplevel.inc.php:192 include/diogenes.barrel.inc.php:303 +#: include/diogenes.toplevel.inc.php:86 include/diogenes.barrel.inc.php:334 +#: include/diogenes.toplevel.inc.php:87 include/diogenes.barrel.inc.php:330 +msgid "Logout" +msgstr "" + +#: include/diogenes.toplevel.inc.php:194 include/diogenes.barrel.inc.php:306 +#: include/diogenes.toplevel.inc.php:88 include/diogenes.barrel.inc.php:337 +#: include/diogenes.toplevel.inc.php:89 include/diogenes.barrel.inc.php:333 +msgid "Login" +msgstr "" + +#: include/diogenes.admin.inc.php:37 include/diogenes.admin.inc.php:64 +#: include/diogenes.barrel.inc.php:310 include/diogenes.barrel.inc.php:341 +#: include/diogenes.admin.inc.php:71 include/diogenes.admin.inc.php:70 +#: include/diogenes.barrel.inc.php:337 +msgid "Administration" +msgstr "" + +#: include/diogenes.rcs.inc.php:455 include/diogenes.rcs.inc.php:624 +#: include/admin/files.php:149 +msgid "diff to" +msgstr "" + +#: include/diogenes.rcs.inc.php:459 include/diogenes.rcs.inc.php:628 +#: include/admin/files.php:153 +msgid "restore" +msgstr "" + +#: include/diogenes.admin.inc.php:63 include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:69 +msgid "Admin manual" +msgstr "" + +msgid "Settings" +msgstr "" + +#: include/diogenes.toplevel.inc.php:202 include/diogenes.admin.inc.php:67 +#: include/diogenes.toplevel.inc.php:97 include/diogenes.admin.inc.php:78 +#: include/diogenes.toplevel.inc.php:98 include/diogenes.admin.inc.php:77 +msgid "Users" +msgstr "" + +#: include/diogenes.admin.inc.php:68 include/diogenes.admin.inc.php:80 +#: include/diogenes.admin.inc.php:79 +msgid "Content" +msgstr "" + +#: include/diogenes.admin.inc.php:69 include/diogenes.admin.inc.php:81 +#: include/diogenes.admin.inc.php:80 +msgid "Pages catalog" +msgstr "" + +#: include/diogenes.admin.inc.php:70 include/diogenes.admin.inc.php:82 +#: include/diogenes.admin.inc.php:81 +msgid "Edit style sheet" +msgstr "" + +#: include/diogenes.admin.inc.php:71 include/diogenes.admin.inc.php:83 +#: include/diogenes.admin.inc.php:82 +msgid "Edit menu" +msgstr "" + +#: include/diogenes.toplevel.inc.php:38 include/diogenes.toplevel.inc.php:39 +msgid "Toplevel administration" +msgstr "" + +#: include/diogenes.page.inc.php:59 +msgid "Powered by Diogenes" +msgstr "" + +#: include/diogenes.page.inc.php:213 include/diogenes.page.inc.php:216 +#: include/diogenes.page.inc.php:212 +msgid "The requested document was not found." +msgstr "" + +#: include/diogenes.toplevel.inc.php:188 include/diogenes.toplevel.inc.php:82 +#: include/diogenes.toplevel.inc.php:83 +msgid "User manual" +msgstr "" + +#: include/diogenes.toplevel.inc.php:191 include/diogenes.barrel.inc.php:304 +#: include/diogenes.toplevel.inc.php:85 include/diogenes.barrel.inc.php:335 +#: include/diogenes.toplevel.inc.php:86 include/diogenes.barrel.inc.php:331 +msgid "Preferences" +msgstr "" + +#: include/diogenes.toplevel.inc.php:197 include/diogenes.toplevel.inc.php:91 +#: include/diogenes.toplevel.inc.php:92 +msgid "Sites" +msgstr "" + +#: include/diogenes.toplevel.inc.php:198 include/diogenes.toplevel.inc.php:92 +#: include/diogenes.toplevel.inc.php:93 +msgid "Root manual" +msgstr "" + +#: htdocs/toplevel/index.php:8 include/diogenes.toplevel.inc.php:199 +#: htdocs/toplevel/index.php:11 include/diogenes.toplevel.inc.php:93 +#: htdocs/toplevel/index.php:16 include/diogenes.toplevel.inc.php:94 +msgid "List of sites" +msgstr "" + +#: htdocs/toplevel/admins.php:7 +msgid "Site administrators" +msgstr "" + +#: htdocs/toplevel/accounts.php:7 include/diogenes.toplevel.inc.php:203 +#: include/diogenes.toplevel.inc.php:98 include/diogenes.toplevel.inc.php:99 +msgid "User accounts" +msgstr "" + +#: include/diogenes.toplevel.inc.php:204 include/diogenes.toplevel.inc.php:99 +#: include/diogenes.toplevel.inc.php:100 +msgid "Browse user log" +msgstr "" + +#: htdocs/toplevel/logger_actions.php:8 include/diogenes.toplevel.inc.php:205 +#: include/diogenes.toplevel.inc.php:100 include/diogenes.toplevel.inc.php:101 +msgid "Logger actions" +msgstr "" + +#: include/diogenes.page.inc.php:198 include/diogenes.page.inc.php:201 +#: include/diogenes.page.inc.php:197 +msgid "Diogenes error" +msgstr "" + +#: include/diogenes.page.inc.php:199 include/diogenes.page.inc.php:202 +#: include/diogenes.page.inc.php:198 +msgid "Error" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:338 +#: include/diogenes/diogenes.logger-view.inc.php:337 +#: include/diogenes/diogenes.logger-view.inc.php:336 +msgid "view session" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:339 +#: include/diogenes/diogenes.logger-view.inc.php:338 +#: include/diogenes/diogenes.logger-view.inc.php:337 +msgid "user's log" +msgstr "" + +#: htdocs/toplevel/logger.php:7 +msgid "User activity log" +msgstr "" + +#: htdocs/toplevel/accounts.php:17 htdocs/toplevel/boot.php:32 +msgid "permissions" +msgstr "" + +#: htdocs/toplevel/accounts.php:19 htdocs/toplevel/admins.php:46 +msgid "view log" +msgstr "" + +#: htdocs/toplevel/admins.php:9 +msgid "administrator" +msgstr "" + +#: htdocs/toplevel/admins.php:10 htdocs/toplevel/index.php:11 +#: include/admin/files.php:50 include/admin/menus.php:220 +#: include/admin/pages.php:21 +#: include/diogenes/diogenes.logger-view.inc.php:378 +#: include/admin/files.php:52 include/admin/menus.php:219 +#: include/admin/pages.php:25 +#: include/diogenes/diogenes.logger-view.inc.php:375 +#: include/admin/files.php:49 include/admin/menus.php:231 +#: include/diogenes/diogenes.logger-view.inc.php:374 +msgid "actions" +msgstr "" + +#: htdocs/toplevel/admins.php:43 +msgid "site users" +msgstr "" + +#: htdocs/toplevel/admins.php:44 +msgid "demote to user" +msgstr "" + +#: htdocs/toplevel/index.php:9 include/diogenes.barrel-editor.inc.php:151 +#: include/Barrel/Editor.php:158 +msgid "alias" +msgstr "" + +#: htdocs/toplevel/index.php:13 include/admin/options.php:62 +#: include/admin/options.php:64 include/diogenes.barrel-editor.inc.php:154 +#: include/admin/options.php:66 include/Barrel/Editor.php:161 +msgid "keywords" +msgstr "" + +#: htdocs/toplevel/index.php:14 include/diogenes.barrel-editor.inc.php:155 +#: include/Barrel/Editor.php:162 +msgid "Create a new site" +msgstr "" + +#: htdocs/toplevel/index.php:17 include/diogenes.barrel-editor.inc.php:158 +#: include/Barrel/Editor.php:166 +msgid "vhost (see note)" +msgstr "" + +#: htdocs/toplevel/index.php:19 include/diogenes.barrel-editor.inc.php:160 +#: include/Barrel/Editor.php:168 +msgid "flags" +msgstr "" + +#: htdocs/toplevel/index.php:86 include/diogenes.barrel-editor.inc.php:45 +#: include/Barrel/Editor.php:47 +msgid "admin" +msgstr "" + +#: include/diogenes.admin.inc.php:65 include/diogenes.admin.inc.php:72 +#: include/diogenes.admin.inc.php:71 +msgid "Activity" +msgstr "" + +#: htdocs/toplevel/accounts.php:14 htdocs/toplevel/boot.php:29 +msgid "first name" +msgstr "" + +#: htdocs/toplevel/accounts.php:15 htdocs/toplevel/boot.php:30 +msgid "last name" +msgstr "" + +#: include/admin/compose.php:16 include/admin/edit.php:15 +#: include/diogenes.admin.inc.php:44 +msgid "Directory not found" +msgstr "" + +#: include/admin/pages.php:19 include/admin/pages.php:23 +#: include/admin/files.php:57 +msgid "read access" +msgstr "" + +#: include/admin/pages.php:20 include/admin/pages.php:24 +#: include/admin/files.php:58 +msgid "write access" +msgstr "" + +#: include/admin/pages.php:83 +msgid "world-writable pages are not allowed with PHP execution enabled!" +msgstr "" + +#: include/diogenes.barrel.inc.php:314 include/diogenes.barrel.inc.php:345 +#: include/diogenes.barrel.inc.php:341 +msgid "Edit this page" +msgstr "" + +#: include/diogenes.barrel.inc.php:315 include/diogenes.barrel.inc.php:346 +#: include/diogenes.barrel.inc.php:342 +msgid "Raw editor" +msgstr "" + +#: htdocs/toplevel/options.php:90 htdocs/toplevel/options_expert.php:56 +msgid "Convert" +msgstr "" + +#: htdocs/toplevel/options.php:95 htdocs/toplevel/options_expert.php:61 +msgid "" +"You are currently using RCS as the version control system for your barrels." +msgstr "" + +#: htdocs/toplevel/options.php:96 htdocs/toplevel/options_expert.php:62 +msgid "You can switch to a full CVS repository by clicking here." +msgstr "" + +#: htdocs/toplevel/options.php:100 htdocs/toplevel/options_expert.php:66 +msgid "" +"You are currently using CVS as the version control system for your barrels." +msgstr "" + +#: htdocs/toplevel/options.php:101 htdocs/toplevel/options_expert.php:67 +msgid "You can switch back to RCS by clicking here." +msgstr "" + +#: include/admin/files.php:44 include/admin/files.php:46 +#: include/admin/files.php:43 +msgid "file" +msgstr "" + +#: include/admin/files.php:46 include/admin/files.php:48 +#: include/admin/files.php:45 +msgid "version" +msgstr "" + +#: include/admin/files.php:48 include/admin/files.php:50 +#: include/admin/files.php:47 +msgid "author" +msgstr "" + +#: include/admin/files.php:49 include/admin/files.php:51 +#: include/admin/files.php:48 +msgid "size" +msgstr "" + +#: include/admin/pages.php:91 include/Barrel/Page.php:205 +#: include/Barrel/Page.php:248 +msgid "the page location cannot contain spaces or special characters" +msgstr "" + +#: include/admin/pages.php:95 include/Barrel/Page.php:212 +#: include/Barrel/Page.php:255 +msgid "this location cannot be used, it is reserved by Diogenes" +msgstr "" + +#: include/admin/files.php:45 include/admin/files.php:47 +#: include/admin/files.php:44 +msgid "log" +msgstr "" + +#: include/admin/menus.php:145 include/admin/menus.php:146 +#: include/admin/menus.php:158 +msgid "entry title" +msgstr "" + +#: include/admin/menus.php:146 include/admin/menus.php:147 +#: include/admin/menus.php:159 +msgid "type of link" +msgstr "" + +#: include/admin/menus.php:218 include/admin/menus.php:217 +#: include/admin/menus.php:229 +msgid "menu name" +msgstr "" + +#: include/admin/menus.php:219 include/admin/menus.php:218 +#: include/admin/menus.php:230 +msgid "link" +msgstr "" + +#: htdocs/toplevel/options.php:80 htdocs/toplevel/options_expert.php:8 +#: include/diogenes.toplevel.inc.php:201 htdocs/toplevel/options.php:43 +#: include/diogenes.toplevel.inc.php:95 include/diogenes.toplevel.inc.php:96 +msgid "Global options" +msgstr "" + +msgid "menu options" +msgstr "" + +#: htdocs/toplevel/options.php:83 include/admin/options.php:69 +#: htdocs/toplevel/options.php:46 include/admin/options.php:71 +#: include/admin/options.php:73 +msgid "menu style" +msgstr "" + +#: htdocs/toplevel/options.php:84 include/admin/options.php:70 +#: htdocs/toplevel/options.php:47 include/admin/options.php:72 +#: include/admin/options.php:74 +msgid "menu theme" +msgstr "" + +#: htdocs/toplevel/options.php:91 htdocs/toplevel/options_expert.php:57 +msgid "version control system" +msgstr "" + +#: include/admin/options.php:6 include/admin/options.php:7 +msgid "Site options" +msgstr "" + +#: include/admin/options.php:55 include/admin/options.php:57 +#: include/admin/options.php:59 +msgid "fully expanded" +msgstr "" + +#: include/admin/options.php:71 include/admin/options.php:73 +#: include/admin/options.php:75 +msgid "minimum menu levels to expand" +msgstr "" + +#: include/diogenes.admin.inc.php:66 include/diogenes.admin.inc.php:73 +#: include/diogenes.admin.inc.php:72 +msgid "Options" +msgstr "" + +#: include/admin/options.php:59 include/admin/options.php:61 +#: include/admin/options.php:63 +msgid "general options" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:368 +#: include/diogenes/diogenes.logger-view.inc.php:365 +#: include/diogenes/diogenes.logger-view.inc.php:364 +msgid "session properties" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:370 +#: include/diogenes/diogenes.logger-view.inc.php:367 +#: include/diogenes/diogenes.logger-view.inc.php:366 +msgid "host" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:371 +#: include/diogenes/diogenes.logger-view.inc.php:368 +#: include/diogenes/diogenes.logger-view.inc.php:367 +msgid "browser" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:374 +#: include/diogenes/diogenes.logger-view.inc.php:371 +#: include/diogenes/diogenes.logger-view.inc.php:370 +msgid "data" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:375 +#: include/diogenes/diogenes.logger-view.inc.php:372 +#: include/diogenes/diogenes.logger-view.inc.php:371 +msgid "filter by" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:376 +#: include/diogenes/diogenes.logger-view.inc.php:373 +#: include/diogenes/diogenes.logger-view.inc.php:372 +msgid "start" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:377 +#: include/diogenes/diogenes.logger-view.inc.php:374 +#: include/diogenes/diogenes.logger-view.inc.php:373 +msgid "summary" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:379 +#: include/diogenes/diogenes.logger-view.inc.php:376 +#: include/diogenes/diogenes.logger-view.inc.php:375 +msgid "year" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:380 +#: include/diogenes/diogenes.logger-view.inc.php:377 +#: include/diogenes/diogenes.logger-view.inc.php:376 +msgid "month" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:381 +#: include/diogenes/diogenes.logger-view.inc.php:378 +#: include/diogenes/diogenes.logger-view.inc.php:377 +msgid "day" +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:525 +#: include/diogenes/diogenes.table-editor.inc.php:530 +msgid "id" +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:527 +#: include/diogenes/diogenes.table-editor.inc.php:532 +msgid "create" +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:530 +#: include/diogenes/diogenes.table-editor.inc.php:535 +msgid "new entry" +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:531 +#: include/diogenes/diogenes.table-editor.inc.php:536 +msgid "existing entry" +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:532 +#: include/diogenes/diogenes.table-editor.inc.php:537 +msgid "(blank = no change)" +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:533 +#: include/diogenes/diogenes.table-editor.inc.php:538 +msgid "back" +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:535 +#: include/diogenes/diogenes.table-editor.inc.php:540 +msgid "You are about to delete this entry. Do you want to proceed?" +msgstr "" + +#: include/diogenes.session.inc.php:62 include/diogenes.session.inc.php:71 +msgid "Authentication error!" +msgstr "" + +#: include/admin/files.php:84 include/admin/files.php:93 +#: include/admin/files.php:102 include/admin/pages.php:158 +#: include/admin/compose.php:57 include/admin/edit.php:49 +#: include/admin/files.php:114 include/admin/files.php:122 +#: include/admin/files.php:154 include/admin/pages.php:124 +#: include/admin/compose.php:61 include/admin/edit.php:53 +#: include/admin/plugins.php:23 include/admin/files.php:61 +#: include/admin/pages.php:122 +msgid "Page" +msgstr "" + +#: include/admin/files.php:86 include/admin/files.php:95 +#: include/admin/pages.php:172 include/admin/compose.php:63 +#: include/admin/edit.php:55 include/admin/files.php:115 +#: include/admin/files.php:123 include/admin/pages.php:136 +#: include/admin/compose.php:62 include/admin/edit.php:54 +#: include/admin/files.php:122 include/admin/files.php:161 +#: include/admin/pages.php:123 +msgid "File" +msgstr "" + +#: htdocs/toplevel/index.php:15 include/diogenes.barrel-editor.inc.php:156 +#: include/Barrel/Editor.php:163 +msgid "The site alias may only contain letters, numbers and underscores." +msgstr "" + +#: htdocs/toplevel/index.php:18 include/diogenes.barrel-editor.inc.php:159 +#: include/Barrel/Editor.php:167 +msgid "" +"vhost note: If you intend to serve this site from a virtualhost, you " +"should enter the name of the virtualhost in this field." +msgstr "" + +#: htdocs/toplevel/index.php:55 +msgid "PHP execution" +msgstr "" + +#: htdocs/toplevel/index.php:55 include/diogenes.barrel-editor.inc.php:106 +#: include/Barrel/Editor.php:113 +msgid "custom templates" +msgstr "" + +msgid "template options" +msgstr "" + +#: htdocs/toplevel/options.php:85 include/admin/options.php:66 +#: htdocs/toplevel/options.php:48 include/admin/options.php:68 +#: include/admin/options.php:70 +msgid "templates directory" +msgstr "" + +#: htdocs/toplevel/options.php:86 include/admin/options.php:67 +#: htdocs/toplevel/options.php:49 include/admin/options.php:69 +#: include/admin/options.php:71 +msgid "default template" +msgstr "" + +#: include/admin/compose.php:56 include/admin/edit.php:46 +#: include/admin/compose.php:58 include/admin/edit.php:48 +msgid "log message" +msgstr "" + +#: include/admin/options.php:63 include/admin/options.php:65 +#: include/admin/options.php:67 +msgid "favicon" +msgstr "" + +#: include/admin/options.php:64 include/admin/options.php:66 +#: include/admin/options.php:68 +msgid "(relative url to a PNG image)" +msgstr "" + +#: include/admin/pages.php:17 include/admin/files.php:57 +#: include/admin/pages.php:21 include/admin/files.php:54 +#: include/admin/pages.php:20 +msgid "page template" +msgstr "" + +#: include/admin/pages.php:18 include/admin/files.php:58 +#: include/admin/pages.php:22 include/admin/files.php:55 +#: include/admin/pages.php:21 +msgid "status" +msgstr "" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "under construction" +msgstr "" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "disabled" +msgstr "" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "archived" +msgstr "" + +#: include/diogenes.barrel.inc.php:152 include/diogenes.barrel.inc.php:153 +#: include/diogenes.barrel.inc.php:155 +msgid "This page is currently under construction." +msgstr "" + +#: include/diogenes.barrel.inc.php:156 include/diogenes.barrel.inc.php:157 +#: include/diogenes.barrel.inc.php:159 +msgid "This page is currently unavailable." +msgstr "" + +#: include/diogenes.admin.inc.php:63 include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:69 +msgid "http://diogenes-doc.polytechnique.org/en-admin/" +msgstr "" + +#: include/diogenes.toplevel.inc.php:188 include/diogenes.toplevel.inc.php:82 +#: include/diogenes.toplevel.inc.php:83 +msgid "http://diogenes-doc.polytechnique.org/en-user/" +msgstr "" + +#: include/diogenes.toplevel.inc.php:198 include/diogenes.toplevel.inc.php:92 +#: include/diogenes.toplevel.inc.php:93 +msgid "http://diogenes-doc.polytechnique.org/en-root/" +msgstr "" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "Mode" +msgstr "" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "standard" +msgstr "" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "expert" +msgstr "" + +#: htdocs/toplevel/options.php:82 include/admin/options.php:65 +#: htdocs/toplevel/options.php:45 include/admin/options.php:67 +#: include/admin/options.php:69 +msgid "display options" +msgstr "" + +#: htdocs/toplevel/options.php:87 htdocs/toplevel/options.php:50 +msgid "system options" +msgstr "" + +msgid "Initial user setup" +msgstr "" + +#: htdocs/toplevel/boot.php:11 +msgid "" +"Sorry, this feature is only available using native Diogenes authentication." +msgstr "" + +#: htdocs/toplevel/boot.php:19 +msgid "The database is already configured." +msgstr "" + +#: htdocs/toplevel/options_expert.php:13 htdocs/toplevel/options_expert.php:75 +#: htdocs/toplevel/options_expert.php:76 +msgid "option" +msgstr "" + +#: htdocs/toplevel/options_expert.php:14 htdocs/toplevel/options_expert.php:76 +#: htdocs/toplevel/options_expert.php:77 +msgid "value" +msgstr "" + +#: include/admin/menus.php:221 include/admin/menus.php:220 +#: include/admin/menus.php:232 +msgid "Menu" +msgstr "" + +#: include/diogenes.page.inc.php:65 include/diogenes.page.inc.php:66 +msgid "debugging" +msgstr "" + +#: include/diogenes.page.inc.php:66 include/diogenes.page.inc.php:67 +msgid "call trace" +msgstr "" + +#: include/diogenes.page.inc.php:67 include/diogenes.page.inc.php:68 +msgid "database trace" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:59 +#: include/diogenes/diogenes.logger-view.inc.php:85 +#: include/diogenes/diogenes.logger-view.inc.php:130 +#: include/diogenes/diogenes.logger-view.inc.php:183 +#: include/diogenes/diogenes.logger-view.inc.php:58 +#: include/diogenes/diogenes.logger-view.inc.php:84 +#: include/diogenes/diogenes.logger-view.inc.php:129 +#: include/diogenes/diogenes.logger-view.inc.php:182 +msgid "all" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:363 +#: include/diogenes/diogenes.logger-view.inc.php:360 +#: include/diogenes/diogenes.logger-view.inc.php:359 +msgid "Please select a year and/or a user." +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:523 +#: include/diogenes/diogenes.table-editor.inc.php:528 +msgid "previous page" +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:524 +#: include/diogenes/diogenes.table-editor.inc.php:529 +msgid "next page" +msgstr "" + +#: htdocs/toplevel/boot.php:7 +msgid "Initial setup" +msgstr "" + +#: htdocs/toplevel/boot.php:46 +msgid "The initial setup of the database was performed successfuly." +msgstr "" + +#: include/admin/options.php:47 include/admin/options.php:49 +#: include/admin/options.php:51 +msgid "no" +msgstr "" + +#: include/admin/options.php:47 include/admin/options.php:49 +#: include/admin/options.php:51 +msgid "yes" +msgstr "" + +#: include/admin/options.php:68 include/admin/options.php:70 +#: include/admin/options.php:72 +msgid "hide Diogenes menu" +msgstr "" + +#: include/admin/prefs.php:28 +msgid "account preferences" +msgstr "" + +#: htdocs/toplevel/plugins.php:19 +msgid "Barrel plugins" +msgstr "" + +#: htdocs/toplevel/plugins.php:21 +msgid "Global plugin settings" +msgstr "" + +#: htdocs/toplevel/plugins.php:38 +#, php-format +msgid "Rebuilding plugin cache for barrel '%s'" +msgstr "" + +#: htdocs/toplevel/plugins.php:47 +msgid "Clean plugins database" +msgstr "" + +#: htdocs/toplevel/plugins.php:48 +msgid "" +"If you are having problems with references to plugins that no longer exist, " +"you can have Diogenes remove such entries from the database." +msgstr "" + +#: htdocs/toplevel/plugins.php:49 +msgid "Clean" +msgstr "" + +#: htdocs/toplevel/plugins.php:51 +msgid "Enable or disable plugins" +msgstr "" + +#: htdocs/toplevel/plugins.php:54 +msgid "You can select the plugins you want to enable for this barrel." +msgstr "" + +#: htdocs/toplevel/plugins.php:56 +msgid "" +"You can select the plugins you want to enable or disable globally, that is " +"the plugins that can be used in the different barrels. Please note that for " +"a plugin to be accessible from a barrel, you will need to activate that " +"plugin for the barrel. To do this, from the List of sites click on " +"'plugins' next to the barrel of your choice." +msgstr "" + +#: htdocs/toplevel/options.php:52 +msgid "Word document import" +msgstr "" + +#: include/admin/files.php:39 +msgid "File operations" +msgstr "" + +#: include/admin/files.php:43 include/admin/files.php:40 +msgid "Create an empty file" +msgstr "" + +#: include/admin/files.php:44 include/admin/files.php:41 +msgid "Copy or move a file" +msgstr "" + +#: include/admin/files.php:45 include/admin/files.php:42 +msgid "Create" +msgstr "" + +#: include/admin/files.php:53 include/admin/files.php:50 +msgid "to" +msgstr "" + +#: include/admin/files.php:59 +msgid "read" +msgstr "" + +#: include/admin/files.php:60 +msgid "write" +msgstr "" + +#: include/admin/files.php:67 include/admin/files.php:69 +msgid "Creating empty file" +msgstr "" + +#: include/admin/files.php:69 include/admin/files.php:71 +msgid "The specified file already exists!" +msgstr "" + +#: include/admin/files.php:155 include/admin/pages.php:160 +#: include/admin/plugins.php:22 include/admin/files.php:194 +#: include/admin/pages.php:156 include/Barrel/Page.php:170 +msgid "home" +msgstr "" + +#: include/admin/files.php:182 include/admin/files.php:224 +msgid "Copy" +msgstr "" + +#: include/admin/files.php:182 include/admin/files.php:224 +msgid "Move" +msgstr "" + +#: include/admin/pages.php:18 include/admin/pages.php:17 +#: include/Barrel/Page.php:171 +msgid "parent page" +msgstr "" + +#: include/admin/webdav.php:7 include/diogenes.admin.inc.php:79 +#: include/diogenes.admin.inc.php:78 +msgid "WebDAV" +msgstr "" + +#: include/admin/webdav.php:9 include/admin/webdav.php:11 +msgid "" +"You can access your barrel's files using WebDAV by pointing your WebDAV " +"client to the following address." +msgstr "" + +#: include/admin/plugins.php:22 +msgid "Page plugins " +msgstr "" + +#: include/admin/plugins.php:26 +msgid "Available plugins" +msgstr "" + +#: include/diogenes.page.inc.php:69 include/diogenes.barrel-editor.inc.php:50 +#: include/diogenes.barrel-editor.inc.php:106 include/Barrel/Page.php:126 +#: include/Barrel/Page.php:152 include/diogenes.plugin-editor.inc.php:237 +#: include/Barrel/Page.php:150 include/Barrel/Page.php:178 +#: include/Barrel/Editor.php:52 include/Barrel/Editor.php:113 +#: include/Plugin/Editor.php:266 include/diogenes.page.inc.php:68 +msgid "plugins" +msgstr "" + +#: include/diogenes.toplevel.inc.php:96 include/diogenes.admin.inc.php:76 +#: include/diogenes.toplevel.inc.php:97 include/diogenes.admin.inc.php:75 +msgid "Plugins" +msgstr "" + +#: include/Barrel/Page.php:70 include/Barrel/Page.php:89 +msgid "Not deleting page, it has child pages!" +msgstr "" + +#: include/Barrel/File.php:76 include/Barrel/File.php:94 +msgid "rename" +msgstr "" + +#: include/diogenes.plugin-editor.inc.php:236 include/Plugin/Editor.php:265 +msgid "plugin" +msgstr "" + +#: include/diogenes.plugin-editor.inc.php:239 include/Plugin/Editor.php:268 +msgid "parameters" +msgstr "" + +#: include/admin/files.php:192 +msgid "Document" +msgstr "" + +#: include/admin/index.php:52 +msgid "barrel options" +msgstr "" + +#: include/admin/index.php:57 +msgid "barrel plugins" +msgstr "" + +#: include/admin/index.php:68 +msgid "page removed" +msgstr "" + +#: include/admin/index.php:80 +msgid "page plugins" +msgstr "" + +#: include/admin/index.php:92 +msgid "file deleted" +msgstr "" + +#: include/admin/webdav.php:14 +msgid "" +"In order to access your barrel's files using WebDAV, please ask your " +"Diogenes administrator to enable this feature in the Diogenes configuration " +"file." +msgstr "" + +#: include/Barrel/Page.php:81 +msgid "Deleting page" +msgstr "" + +#: include/Barrel/Page.php:176 +msgid "add a page" +msgstr "" + +#: include/Barrel/Page.php:266 +msgid "Creating new page" +msgstr "" + +#: include/Barrel/Editor.php:165 +msgid "no barrels available" +msgstr "" + +#: htdocs/toplevel/index.php:13 +msgid "" +"Warning : in order to make use of virtual hosts or WebDAV, you need to set " +"$globals->rooturl to a full URL starting with http:// or https:// in your " +"Diogenes configuration file." +msgstr "" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..479aed5 --- /dev/null +++ b/po/es.po @@ -0,0 +1,1528 @@ +# Spanish translation for Diogenes package. +# Copyright (C) 2004 Pablo Castellazzi +# This file is distributed under the same license as the Diogenes package. +# Pablo Castellazzi , 2004 +# +msgid "" +msgstr "" +"Project-Id-Version: Diogenes 0.9.12\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-01-07 16:41+0100\n" +"PO-Revision-Date: 2004-07-02 05:19-0300\n" +"Last-Translator: Pablo Castellazzi \n" +"Language-Team: Spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: htdocs/index.php:9 htdocs/index.php:13 include/admin/bad.php:46 +msgid "Welcome to Diogenes" +msgstr "Bienvenido a Diogenes" + +#: htdocs/index.php:11 htdocs/index.php:15 +msgid "Welcome to the Diogenes content management system." +msgstr "Bienvenido al administrador de contenido Diogenes." + +#: htdocs/index.php:12 htdocs/index.php:16 +msgid "" +"Diogenes was developed by the webmasters of the Polytechnique.org web site." +msgstr "Diogenes ha sido desarrollado por los webmasters de Polytechnique.org." + +#: htdocs/index.php:13 htdocs/index.php:17 +msgid "The following barrels are currently available" +msgstr "Los siguientes barriles están disponibles actualmente." + +#: htdocs/index.php:14 htdocs/toplevel/admins.php:8 +#: include/diogenes.barrel-editor.inc.php:152 include/Barrel/Editor.php:159 +msgid "site" +msgstr "sitio" + +#: htdocs/index.php:15 htdocs/toplevel/index.php:12 +#: htdocs/toplevel/logger_actions.php:14 include/admin/options.php:61 +#: include/admin/options.php:63 include/diogenes.barrel-editor.inc.php:153 +#: include/diogenes.plugin-editor.inc.php:238 include/admin/options.php:65 +#: include/Barrel/Editor.php:160 include/Plugin/Editor.php:267 +msgid "description" +msgstr "descripción" + +#: htdocs/prefs.php:19 +msgid "Changing password.." +msgstr "Cambiando contraseña ..." + +#: htdocs/prefs.php:33 include/admin/prefs.php:20 +msgid "User preferences" +msgstr "Preferencias de usuario" + +#: htdocs/prefs.php:34 include/admin/prefs.php:21 +msgid "Diogenes preferences" +msgstr "Preferencias de Diogenes" + +#: htdocs/prefs.php:36 +msgid "my information" +msgstr "mi información" + +#: htdocs/prefs.php:37 htdocs/toplevel/accounts.php:13 +#: htdocs/toplevel/boot.php:28 include/diogenes.session.inc.php:138 +msgid "username" +msgstr "usuario" + +#: htdocs/prefs.php:38 +msgid "full name" +msgstr "nombre completo" + +#: htdocs/prefs.php:40 include/admin/prefs.php:23 +msgid "language" +msgstr "idioma" + +#: htdocs/prefs.php:41 include/admin/prefs.php:24 +msgid "" +"You can select your preferred language by clicking on the appropriate " +"language below." +msgstr "" +"A continuación puede seleccionar su idioma preferido haciendo clic en él." + +#: htdocs/prefs.php:43 +msgid "my password" +msgstr "mi contraseña" + +#: htdocs/prefs.php:44 +msgid "new password" +msgstr "nueva contraseña" + +#: htdocs/prefs.php:45 +msgid "confirmation" +msgstr "confirmación" + +#: htdocs/prefs.php:47 include/admin/prefs.php:26 +msgid "Change" +msgstr "Cambiar" + +#: include/admin/compose.php:32 include/admin/edit.php:31 +#: include/admin/compose.php:34 include/admin/edit.php:33 +msgid "Commiting changes to file" +msgstr "Guardar cambios en archivo" + +#: include/admin/edit.php:41 include/admin/edit.php:43 +msgid "File editor" +msgstr "Editor de archivos" + +#: include/admin/edit.php:45 include/admin/edit.php:47 +msgid "File source" +msgstr "Código del archivo" + +#: htdocs/toplevel/index.php:16 htdocs/toplevel/options.php:89 +#: include/admin/menus.php:151 include/admin/options.php:72 +#: include/admin/pages.php:12 include/admin/edit.php:48 +#: include/diogenes.session.inc.php:137 +#: include/diogenes/diogenes.logger-view.inc.php:382 +#: include/diogenes/diogenes.table-editor.inc.php:536 +#: htdocs/toplevel/options.php:53 include/admin/files.php:41 +#: include/admin/menus.php:152 include/admin/options.php:74 +#: include/admin/pages.php:15 include/admin/edit.php:50 +#: include/diogenes/diogenes.logger-view.inc.php:379 +#: include/diogenes/diogenes.table-editor.inc.php:541 +#: include/diogenes.barrel-editor.inc.php:157 +#: include/diogenes.plugin-editor.inc.php:235 include/admin/files.php:38 +#: include/admin/menus.php:164 include/admin/options.php:76 +#: include/admin/pages.php:14 include/Barrel/Editor.php:164 +#: include/Plugin/Editor.php:264 +#: include/diogenes/diogenes.logger-view.inc.php:378 +msgid "Submit" +msgstr "Enviar" + +#: include/admin/files.php:27 include/admin/pages.php:152 +#: include/admin/compose.php:58 include/admin/edit.php:50 +#: include/Barrel/Page.php:143 +msgid "pages catalog" +msgstr "catalogo de páginas" + +#: include/admin/files.php:28 include/admin/pages.php:154 +#: include/admin/compose.php:59 include/admin/edit.php:51 +#: include/Barrel/Page.php:147 include/admin/index.php:74 +#: include/Barrel/Page.php:174 +msgid "page properties" +msgstr "propiedades de la página" + +#: include/admin/files.php:29 include/admin/pages.php:155 +#: include/admin/compose.php:60 include/admin/edit.php:52 +#: include/diogenes.rcs.inc.php:452 include/diogenes.rcs.inc.php:621 +#: include/Barrel/Page.php:148 include/admin/files.php:146 +#: include/Barrel/Page.php:175 +msgid "view page" +msgstr "ver página" + +#: include/admin/files.php:83 include/admin/files.php:92 +#: include/admin/files.php:101 include/admin/pages.php:156 +#: include/admin/compose.php:61 include/admin/edit.php:53 +#: include/Barrel/Page.php:149 include/Barrel/Page.php:173 +msgid "browse files" +msgstr "examinar archivos" + +#: include/admin/files.php:35 include/admin/pages.php:167 +#: include/admin/compose.php:64 include/admin/edit.php:56 +#: include/admin/pages.php:132 include/Barrel/File.php:94 +#: include/Barrel/File.php:114 +msgid "raw editor" +msgstr "editor en grueso" + +#: htdocs/toplevel/options.php:88 include/admin/files.php:36 +#: include/admin/pages.php:168 include/admin/compose.php:65 +#: include/admin/edit.php:57 include/diogenes.barrel.inc.php:316 +#: htdocs/toplevel/options.php:51 include/admin/pages.php:133 +#: include/diogenes.barrel.inc.php:347 include/Barrel/File.php:95 +#: include/Barrel/File.php:115 include/diogenes.barrel.inc.php:343 +msgid "HTML editor" +msgstr "editor HTML" + +#: include/admin/files.php:85 include/admin/files.php:94 +#: include/admin/pages.php:163 include/admin/pages.php:170 +#: include/admin/compose.php:66 include/admin/edit.php:58 +#: include/admin/pages.php:129 include/admin/pages.php:134 +#: include/Barrel/File.php:97 include/Barrel/File.php:117 +msgid "file revisions" +msgstr "revisiones de archivos" + +msgid "Ekit" +msgstr "Ekit" + +#: include/admin/menus.php:36 include/admin/menus.php:37 +msgid "The site's menus" +msgstr "Menú del sitio" + +#: include/admin/menus.php:44 include/admin/menus.php:45 +msgid "The selected menu has child items, please remove them first." +msgstr "" +"El menú seleccionado tiene elementos hijo, por favor eliminelos primero." + +#: include/admin/menus.php:144 include/admin/menus.php:145 +#: include/admin/menus.php:157 +msgid "menu entry properties" +msgstr "propiedades de la entrada" + +#: include/admin/menus.php:147 include/admin/menus.php:148 +#: include/admin/menus.php:160 +msgid "none" +msgstr "ninguno" + +#: include/admin/menus.php:148 include/admin/menus.php:149 +#: include/admin/menus.php:161 +msgid "internal link" +msgstr "enlace interno" + +#: include/admin/menus.php:149 include/admin/menus.php:150 +#: include/admin/menus.php:162 +msgid "external link" +msgstr "enlace externo" + +#: include/admin/menus.php:173 include/diogenes.plugin-editor.inc.php:240 +#: include/admin/menus.php:185 include/Plugin/Editor.php:269 +msgid "move up" +msgstr "mover hacia arriba" + +#: include/admin/menus.php:176 include/diogenes.plugin-editor.inc.php:241 +#: include/admin/menus.php:188 include/Plugin/Editor.php:270 +msgid "move down" +msgstr "mover hacia abajo" + +#: htdocs/toplevel/index.php:85 include/admin/menus.php:178 +#: include/diogenes.rcs.inc.php:417 +#: include/diogenes/diogenes.table-editor.inc.php:529 +#: include/diogenes/diogenes.table-editor.inc.php:534 +#: include/diogenes.barrel-editor.inc.php:43 include/Barrel/Page.php:119 +#: include/Barrel/File.php:74 include/admin/menus.php:190 +#: include/Barrel/File.php:92 include/Barrel/Page.php:143 +#: include/Barrel/Editor.php:45 +msgid "edit" +msgstr "editar" + +#: htdocs/toplevel/index.php:87 include/admin/menus.php:179 +#: include/admin/pages.php:202 include/diogenes.rcs.inc.php:419 +#: include/diogenes/diogenes.table-editor.inc.php:528 +#: include/diogenes/diogenes.table-editor.inc.php:533 +#: include/diogenes.barrel-editor.inc.php:52 include/Barrel/Page.php:129 +#: include/Barrel/File.php:77 include/admin/menus.php:191 +#: include/Barrel/File.php:95 include/Barrel/Page.php:153 +#: include/Barrel/Editor.php:54 +msgid "delete" +msgstr "eliminar" + +#: include/admin/menus.php:217 include/admin/menus.php:216 +#: include/admin/menus.php:228 +msgid "External links are denoted with the [ext] prefix." +msgstr "Los enlaces externos están marcados con el prefijo [ext]." + +#: include/admin/menus.php:222 include/admin/menus.php:221 +#: include/admin/menus.php:233 +msgid "Add new entry" +msgstr "Agregar nueva entrada" + +#: include/admin/files.php:63 include/admin/files.php:86 +#: include/admin/files.php:88 +msgid "Error during file transfer!" +msgstr "Error durante la transferencia del archivo!" + +#: include/admin/files.php:69 include/admin/files.php:92 +#: include/admin/files.php:94 +msgid "Deleting file" +msgstr "Eliminando archivo" + +#: include/admin/files.php:81 include/admin/files.php:112 +#: include/admin/files.php:120 +msgid "Revision differences" +msgstr "Diferentes revisiones" + +#: include/admin/files.php:90 include/admin/files.php:120 +#: include/admin/files.php:128 +msgid "File revisions" +msgstr "Revisiones del archivo" + +#: include/admin/files.php:103 include/admin/files.php:155 +#: include/admin/files.php:194 +msgid "File manager" +msgstr "Manajador de archivos" + +#: include/admin/files.php:40 include/admin/files.php:38 +msgid "Files in current directory" +msgstr "Archivos en el directorio actual" + +#: include/admin/files.php:41 include/admin/files.php:40 +#: include/admin/files.php:37 +msgid "Import file" +msgstr "Importar archivo" + +#: include/admin/files.php:42 include/admin/pages.php:210 +#: include/admin/pages.php:191 include/admin/files.php:39 +#: include/admin/pages.php:163 +msgid "Send" +msgstr "Enviar" + +#: include/admin/files.php:43 +msgid "File to upload" +msgstr "Archivo a subir" + +#: include/admin/index.php:20 include/admin/index.php:45 +#: include/admin/index.php:47 +msgid "site created" +msgstr "sitio creado" + +#: include/admin/index.php:23 include/admin/index.php:50 +#: include/admin/index.php:63 +msgid "page created" +msgstr "página creada" + +#: include/admin/index.php:26 include/admin/index.php:54 +msgid "page deleted" +msgstr "página eliminada" + +#: include/admin/index.php:31 include/admin/index.php:59 +#: include/admin/index.php:86 +msgid "file updated" +msgstr "archivo actualizado" + +#: include/admin/index.php:34 include/admin/index.php:64 +msgid "file removed" +msgstr "archivo eliminado" + +#: include/admin/index.php:43 include/admin/index.php:77 +#: include/admin/index.php:105 +msgid "Welcome to the Diogenes backoffice" +msgstr "Bienvenido a Diogenes backoffice" + +#: include/admin/files.php:47 include/admin/index.php:44 +#: include/diogenes/diogenes.logger-view.inc.php:372 +#: include/admin/files.php:49 include/admin/index.php:78 +#: include/diogenes/diogenes.logger-view.inc.php:369 +#: include/admin/files.php:46 include/admin/index.php:106 +#: include/diogenes/diogenes.logger-view.inc.php:368 +msgid "date" +msgstr "fecha" + +#: include/admin/index.php:45 include/admin/users.php:28 +#: include/diogenes/diogenes.logger-view.inc.php:369 +#: include/admin/index.php:79 +#: include/diogenes/diogenes.logger-view.inc.php:366 +#: include/admin/index.php:107 +#: include/diogenes/diogenes.logger-view.inc.php:365 +msgid "user" +msgstr "usuario" + +#: include/admin/index.php:46 include/admin/index.php:80 +#: include/admin/index.php:108 +msgid "event" +msgstr "evento" + +#: include/admin/pages.php:11 include/admin/pages.php:14 +#: include/admin/pages.php:158 +msgid "Page manager" +msgstr "Administrador de páginas" + +#: include/admin/pages.php:13 include/admin/pages.php:16 +#: include/admin/pages.php:15 +msgid "Reset" +msgstr "Reiniciar" + +#: include/admin/pages.php:14 include/diogenes.barrel.inc.php:312 +#: include/admin/pages.php:17 include/diogenes.barrel.inc.php:343 +#: include/admin/pages.php:16 include/diogenes.barrel.inc.php:339 +msgid "Page properties" +msgstr "Propiedades de la página" + +#: include/admin/pages.php:15 include/admin/files.php:55 +#: include/admin/pages.php:19 include/admin/files.php:52 +#: include/admin/pages.php:18 +msgid "location" +msgstr "hubicación" + +#: htdocs/toplevel/index.php:10 htdocs/toplevel/logger_actions.php:13 +#: include/admin/options.php:60 include/admin/pages.php:16 +#: include/admin/files.php:56 include/admin/options.php:62 +#: include/admin/pages.php:20 include/admin/files.php:53 +#: include/admin/options.php:64 include/admin/pages.php:19 +msgid "title" +msgstr "título" + +msgid "display" +msgstr "mostrar" + +#: include/admin/files.php:56 include/admin/pages.php:22 +msgid "access" +msgstr "acceder" + +#: include/admin/pages.php:22 include/admin/pages.php:26 +msgid "Add a page" +msgstr "Agregar página" + +#: include/admin/pages.php:43 include/admin/pages.php:47 +#: include/admin/pages.php:50 +msgid "Document name does not end in .doc" +msgstr "El documento no termina en .doc" + +#: include/admin/pages.php:46 include/admin/pages.php:50 +#: include/admin/pages.php:53 +msgid "Checking in Word file" +msgstr "Verificando archivo Word" + +#: include/admin/pages.php:51 include/admin/pages.php:55 +#: include/admin/pages.php:58 +msgid "Importing Word file" +msgstr "Importando archivo Word" + +#: include/admin/pages.php:57 include/admin/pages.php:61 +#: include/admin/pages.php:64 +msgid "Importing HTML file" +msgstr "Importando archivo HTML" + +#: include/admin/pages.php:62 include/admin/pages.php:66 +#: include/admin/pages.php:69 +msgid "Raw file import" +msgstr "Importando archivo en grueso" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "visible" +msgstr "mostrar" + +msgid "invisible" +msgstr "ocultar" + +#: htdocs/toplevel/index.php:84 include/admin/pages.php:196 +#: include/diogenes.rcs.inc.php:416 include/diogenes.rcs.inc.php:450 +#: include/diogenes.rcs.inc.php:619 include/Barrel/Page.php:118 +#: include/Barrel/File.php:73 include/admin/files.php:144 +#: include/Barrel/File.php:91 include/Barrel/Page.php:142 +msgid "view" +msgstr "ver" + +#: include/admin/pages.php:197 include/Barrel/Page.php:120 +#: include/Barrel/Page.php:144 +msgid "properties" +msgstr "propiedades" + +#: include/admin/pages.php:198 +msgid "files" +msgstr "archivos" + +#: include/admin/pages.php:199 include/diogenes.rcs.inc.php:418 +#: include/Barrel/Page.php:121 include/Barrel/File.php:75 +#: include/Barrel/File.php:93 include/Barrel/Page.php:145 +msgid "revisions" +msgstr "revisiones" + +#: include/admin/pages.php:211 include/admin/pages.php:195 +#: include/admin/pages.php:172 +msgid "Import a Word document" +msgstr "Importar documento Word" + +#: include/admin/pages.php:214 include/admin/pages.php:198 +#: include/admin/pages.php:176 +msgid "This page's master document is currently a Word document." +msgstr "El documento maestro es actualemente un documento Word" + +#: include/admin/pages.php:215 include/admin/pages.php:199 +#: include/admin/pages.php:177 +msgid "You can upload a new version of the Word document below." +msgstr "A continuaicón puede subir una nueva version del documento Word." + +#: include/admin/pages.php:216 include/admin/pages.php:200 +#: include/admin/pages.php:178 +msgid "You can get the current version of the file here" +msgstr "Aquí obtendrá la versión actual del archivo" + +#: include/admin/pages.php:219 include/admin/pages.php:203 +#: include/admin/pages.php:181 +msgid "If you wish, you can set this page's content from a Word document." +msgstr "" +"Si lo desea, puede cargar el contenido de esta página desde un documento de " +"Word." + +#: include/admin/pages.php:220 include/admin/pages.php:204 +#: include/admin/pages.php:182 +msgid "To do so, simply upload the Word document below." +msgstr "Para hacerlo, a continuación simplemente suba el documento." + +#: include/admin/pages.php:222 include/admin/pages.php:208 +#: include/admin/pages.php:160 +msgid "Import HTML" +msgstr "Importar HTML" + +#: include/admin/pages.php:223 include/admin/pages.php:209 +#: include/admin/pages.php:161 +msgid "" +"You can replace the current page's contents by uploading an HTML file below." +msgstr "" +"A continuación puede reemplezar el contenido actual de la página subiendo un " +"archivo HTML." + +#: include/admin/pages.php:224 include/admin/pages.php:210 +#: include/admin/pages.php:162 +msgid "" +"If the file name ends with .htm or .html, anything outside the <body>" +"</body> pair will be stripped." +msgstr "" +"Si el archivo termina en .htm o .html, cualquier cosa fuera de <body>" +"</body> será eliminado." + +#: htdocs/toplevel/admins.php:20 include/admin/users.php:15 +msgid "Could not find requested user" +msgstr "No se puede encontrar al usuario solicitado" + +#: include/admin/users.php:24 +msgid "Users administration" +msgstr "Administración de usuarios" + +#: include/admin/users.php:25 +msgid "Registered users" +msgstr "Usuarios registrados" + +#: include/admin/users.php:26 include/diogenes.toplevel.inc.php:200 +#: include/diogenes.toplevel.inc.php:94 include/diogenes.toplevel.inc.php:95 +msgid "Administrators" +msgstr "Administradores" + +#: include/admin/users.php:29 +#: include/diogenes/diogenes.logger-view.inc.php:373 +#: include/diogenes/diogenes.table-editor.inc.php:526 +#: include/diogenes/diogenes.logger-view.inc.php:370 +#: include/diogenes/diogenes.table-editor.inc.php:531 +#: include/diogenes/diogenes.logger-view.inc.php:369 +msgid "action" +msgstr "Acción" + +#: htdocs/toplevel/admins.php:45 include/admin/users.php:35 +msgid "remove" +msgstr "Eliminar" + +#: include/diogenes.session.inc.php:134 +msgid "Diogenes login" +msgstr "Ingresar a Diogenes" + +#: include/diogenes.session.inc.php:135 +msgid "Connexion" +msgstr "Conexión" + +#: htdocs/toplevel/accounts.php:16 htdocs/toplevel/boot.php:31 +#: include/diogenes.session.inc.php:136 +msgid "password" +msgstr "contraseña" + +#: include/diogenes.toplevel.inc.php:52 include/diogenes.barrel.inc.php:104 +#: include/diogenes.barrel.inc.php:105 include/diogenes.toplevel.inc.php:53 +#: include/diogenes.barrel.inc.php:107 +msgid "You are not authorized to view this page!" +msgstr "No está autorizado a ver esta página!" + +#: include/diogenes.toplevel.inc.php:38 include/diogenes.toplevel.inc.php:187 +#: include/diogenes.admin.inc.php:62 include/diogenes.barrel.inc.php:301 +#: include/diogenes.toplevel.inc.php:81 include/diogenes.barrel.inc.php:332 +#: include/diogenes.admin.inc.php:69 include/diogenes.toplevel.inc.php:39 +#: include/diogenes.toplevel.inc.php:82 include/diogenes.admin.inc.php:68 +#: include/diogenes.barrel.inc.php:328 +msgid "Home" +msgstr "Inicio" + +#: include/diogenes.toplevel.inc.php:192 include/diogenes.barrel.inc.php:303 +#: include/diogenes.toplevel.inc.php:86 include/diogenes.barrel.inc.php:334 +#: include/diogenes.toplevel.inc.php:87 include/diogenes.barrel.inc.php:330 +msgid "Logout" +msgstr "Desconectar" + +#: include/diogenes.toplevel.inc.php:194 include/diogenes.barrel.inc.php:306 +#: include/diogenes.toplevel.inc.php:88 include/diogenes.barrel.inc.php:337 +#: include/diogenes.toplevel.inc.php:89 include/diogenes.barrel.inc.php:333 +msgid "Login" +msgstr "Iniciar sesión" + +#: include/diogenes.admin.inc.php:37 include/diogenes.admin.inc.php:64 +#: include/diogenes.barrel.inc.php:310 include/diogenes.barrel.inc.php:341 +#: include/diogenes.admin.inc.php:71 include/diogenes.admin.inc.php:70 +#: include/diogenes.barrel.inc.php:337 +msgid "Administration" +msgstr "Administración" + +#: include/diogenes.rcs.inc.php:455 include/diogenes.rcs.inc.php:624 +#: include/admin/files.php:149 +msgid "diff to" +msgstr "diferencias con" + +#: include/diogenes.rcs.inc.php:459 include/diogenes.rcs.inc.php:628 +#: include/admin/files.php:153 +msgid "restore" +msgstr "recuperar" + +#: include/diogenes.admin.inc.php:63 include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:69 +msgid "Admin manual" +msgstr "Manual de administración" + +msgid "Settings" +msgstr "Opciones" + +#: include/diogenes.toplevel.inc.php:202 include/diogenes.admin.inc.php:67 +#: include/diogenes.toplevel.inc.php:97 include/diogenes.admin.inc.php:78 +#: include/diogenes.toplevel.inc.php:98 include/diogenes.admin.inc.php:77 +msgid "Users" +msgstr "Usuarios" + +#: include/diogenes.admin.inc.php:68 include/diogenes.admin.inc.php:80 +#: include/diogenes.admin.inc.php:79 +msgid "Content" +msgstr "Contenido" + +#: include/diogenes.admin.inc.php:69 include/diogenes.admin.inc.php:81 +#: include/diogenes.admin.inc.php:80 +msgid "Pages catalog" +msgstr "Catalogo de páginas" + +#: include/diogenes.admin.inc.php:70 include/diogenes.admin.inc.php:82 +#: include/diogenes.admin.inc.php:81 +msgid "Edit style sheet" +msgstr "Editar CSS" + +#: include/diogenes.admin.inc.php:71 include/diogenes.admin.inc.php:83 +#: include/diogenes.admin.inc.php:82 +msgid "Edit menu" +msgstr "Editar menú" + +#: include/diogenes.toplevel.inc.php:38 include/diogenes.toplevel.inc.php:39 +msgid "Toplevel administration" +msgstr "Administración principal" + +#: include/diogenes.page.inc.php:59 +msgid "Powered by Diogenes" +msgstr "Construído con Diogenes" + +#: include/diogenes.page.inc.php:213 include/diogenes.page.inc.php:216 +#: include/diogenes.page.inc.php:212 +msgid "The requested document was not found." +msgstr "El documento solicitado no existe." + +#: include/diogenes.toplevel.inc.php:188 include/diogenes.toplevel.inc.php:82 +#: include/diogenes.toplevel.inc.php:83 +msgid "User manual" +msgstr "Manual de usuario" + +#: include/diogenes.toplevel.inc.php:191 include/diogenes.barrel.inc.php:304 +#: include/diogenes.toplevel.inc.php:85 include/diogenes.barrel.inc.php:335 +#: include/diogenes.toplevel.inc.php:86 include/diogenes.barrel.inc.php:331 +msgid "Preferences" +msgstr "Preferencias" + +#: include/diogenes.toplevel.inc.php:197 include/diogenes.toplevel.inc.php:91 +#: include/diogenes.toplevel.inc.php:92 +msgid "Sites" +msgstr "Sitios" + +#: include/diogenes.toplevel.inc.php:198 include/diogenes.toplevel.inc.php:92 +#: include/diogenes.toplevel.inc.php:93 +msgid "Root manual" +msgstr "Manual de Root" + +#: htdocs/toplevel/index.php:8 include/diogenes.toplevel.inc.php:199 +#: htdocs/toplevel/index.php:11 include/diogenes.toplevel.inc.php:93 +#: htdocs/toplevel/index.php:16 include/diogenes.toplevel.inc.php:94 +msgid "List of sites" +msgstr "Lista de sitios" + +#: htdocs/toplevel/admins.php:7 +msgid "Site administrators" +msgstr "Administradores de sitios" + +#: htdocs/toplevel/accounts.php:7 include/diogenes.toplevel.inc.php:203 +#: include/diogenes.toplevel.inc.php:98 include/diogenes.toplevel.inc.php:99 +msgid "User accounts" +msgstr "Cuentas de usuario" + +#: include/diogenes.toplevel.inc.php:204 include/diogenes.toplevel.inc.php:99 +#: include/diogenes.toplevel.inc.php:100 +msgid "Browse user log" +msgstr "Examinar registro de usuario" + +#: htdocs/toplevel/logger_actions.php:8 include/diogenes.toplevel.inc.php:205 +#: include/diogenes.toplevel.inc.php:100 include/diogenes.toplevel.inc.php:101 +msgid "Logger actions" +msgstr "Registrar acciones" + +#: include/diogenes.page.inc.php:198 include/diogenes.page.inc.php:201 +#: include/diogenes.page.inc.php:197 +msgid "Diogenes error" +msgstr "Error de Diogenes" + +#: include/diogenes.page.inc.php:199 include/diogenes.page.inc.php:202 +#: include/diogenes.page.inc.php:198 +msgid "Error" +msgstr "Error" + +#: include/diogenes/diogenes.logger-view.inc.php:338 +#: include/diogenes/diogenes.logger-view.inc.php:337 +#: include/diogenes/diogenes.logger-view.inc.php:336 +msgid "view session" +msgstr "ver sesión" + +#: include/diogenes/diogenes.logger-view.inc.php:339 +#: include/diogenes/diogenes.logger-view.inc.php:338 +#: include/diogenes/diogenes.logger-view.inc.php:337 +msgid "user's log" +msgstr "registro de usuarios" + +#: htdocs/toplevel/logger.php:7 +msgid "User activity log" +msgstr "Registro de actividad de usuarios" + +#: htdocs/toplevel/accounts.php:17 htdocs/toplevel/boot.php:32 +msgid "permissions" +msgstr "permisos" + +#: htdocs/toplevel/accounts.php:19 htdocs/toplevel/admins.php:46 +msgid "view log" +msgstr "ver registro" + +#: htdocs/toplevel/admins.php:9 +msgid "administrator" +msgstr "administrador" + +#: htdocs/toplevel/admins.php:10 htdocs/toplevel/index.php:11 +#: include/admin/files.php:50 include/admin/menus.php:220 +#: include/admin/pages.php:21 +#: include/diogenes/diogenes.logger-view.inc.php:378 +#: include/admin/files.php:52 include/admin/menus.php:219 +#: include/admin/pages.php:25 +#: include/diogenes/diogenes.logger-view.inc.php:375 +#: include/admin/files.php:49 include/admin/menus.php:231 +#: include/diogenes/diogenes.logger-view.inc.php:374 +msgid "actions" +msgstr "acciones" + +#: htdocs/toplevel/admins.php:43 +msgid "site users" +msgstr "usuarios del sitio" + +#: htdocs/toplevel/admins.php:44 +msgid "demote to user" +msgstr "degradar al usuario" + +#: htdocs/toplevel/index.php:9 include/diogenes.barrel-editor.inc.php:151 +#: include/Barrel/Editor.php:158 +msgid "alias" +msgstr "alias" + +#: htdocs/toplevel/index.php:13 include/admin/options.php:62 +#: include/admin/options.php:64 include/diogenes.barrel-editor.inc.php:154 +#: include/admin/options.php:66 include/Barrel/Editor.php:161 +msgid "keywords" +msgstr "palabras clave" + +#: htdocs/toplevel/index.php:14 include/diogenes.barrel-editor.inc.php:155 +#: include/Barrel/Editor.php:162 +msgid "Create a new site" +msgstr "Crear un nuevo sitio" + +#: htdocs/toplevel/index.php:17 include/diogenes.barrel-editor.inc.php:158 +#: include/Barrel/Editor.php:166 +msgid "vhost (see note)" +msgstr "vhost (ver notas)" + +#: htdocs/toplevel/index.php:19 include/diogenes.barrel-editor.inc.php:160 +#: include/Barrel/Editor.php:168 +msgid "flags" +msgstr "banderas" + +#: htdocs/toplevel/index.php:86 include/diogenes.barrel-editor.inc.php:45 +#: include/Barrel/Editor.php:47 +msgid "admin" +msgstr "administrador" + +#: include/diogenes.admin.inc.php:65 include/diogenes.admin.inc.php:72 +#: include/diogenes.admin.inc.php:71 +msgid "Activity" +msgstr "Actividad" + +#: htdocs/toplevel/accounts.php:14 htdocs/toplevel/boot.php:29 +msgid "first name" +msgstr "nombre" + +#: htdocs/toplevel/accounts.php:15 htdocs/toplevel/boot.php:30 +msgid "last name" +msgstr "apellido" + +#: include/admin/compose.php:16 include/admin/edit.php:15 +#: include/diogenes.admin.inc.php:44 +msgid "Directory not found" +msgstr "Directorio no encontrado" + +#: include/admin/pages.php:19 include/admin/pages.php:23 +#: include/admin/files.php:57 +msgid "read access" +msgstr "acceso de lectura" + +#: include/admin/pages.php:20 include/admin/pages.php:24 +#: include/admin/files.php:58 +msgid "write access" +msgstr "acceso de escritura" + +#: include/admin/pages.php:83 +msgid "world-writable pages are not allowed with PHP execution enabled!" +msgstr "" +"las páginas con escritura global no están permitidas cuando la ejecución de " +"PHP está activa." + +#: include/diogenes.barrel.inc.php:314 include/diogenes.barrel.inc.php:345 +#: include/diogenes.barrel.inc.php:341 +msgid "Edit this page" +msgstr "Editar es página" + +#: include/diogenes.barrel.inc.php:315 include/diogenes.barrel.inc.php:346 +#: include/diogenes.barrel.inc.php:342 +msgid "Raw editor" +msgstr "Editor en grueso" + +#: htdocs/toplevel/options.php:90 htdocs/toplevel/options_expert.php:56 +msgid "Convert" +msgstr "Convertir" + +#: htdocs/toplevel/options.php:95 htdocs/toplevel/options_expert.php:61 +msgid "" +"You are currently using RCS as the version control system for your barrels." +msgstr "" +"Actualmente está usando RCS como sistema de control de versión para sus " +"barriles." + +#: htdocs/toplevel/options.php:96 htdocs/toplevel/options_expert.php:62 +msgid "You can switch to a full CVS repository by clicking here." +msgstr "Puede cambiar a CVS haciendo click aquí." + +#: htdocs/toplevel/options.php:100 htdocs/toplevel/options_expert.php:66 +msgid "" +"You are currently using CVS as the version control system for your barrels." +msgstr "" +"Actualmente está usando CVS como sistema de control de versión para sus " +"barriles." + +#: htdocs/toplevel/options.php:101 htdocs/toplevel/options_expert.php:67 +msgid "You can switch back to RCS by clicking here." +msgstr "Puede volver a RCS haciendo click aquí." + +#: include/admin/files.php:44 include/admin/files.php:46 +#: include/admin/files.php:43 +msgid "file" +msgstr "archivo" + +#: include/admin/files.php:46 include/admin/files.php:48 +#: include/admin/files.php:45 +msgid "version" +msgstr "versión" + +#: include/admin/files.php:48 include/admin/files.php:50 +#: include/admin/files.php:47 +msgid "author" +msgstr "autor" + +#: include/admin/files.php:49 include/admin/files.php:51 +#: include/admin/files.php:48 +msgid "size" +msgstr "tamaño" + +#: include/admin/pages.php:91 include/Barrel/Page.php:205 +#: include/Barrel/Page.php:248 +msgid "the page location cannot contain spaces or special characters" +msgstr "" +"la ubicación de la página no pueden contener espacios o símbolos de " +"puntuación." + +#: include/admin/pages.php:95 include/Barrel/Page.php:212 +#: include/Barrel/Page.php:255 +msgid "this location cannot be used, it is reserved by Diogenes" +msgstr "esta ubicación no puede ser usada, es reservada para Diogenes" + +#: include/admin/files.php:45 include/admin/files.php:47 +#: include/admin/files.php:44 +msgid "log" +msgstr "registro" + +#: include/admin/menus.php:145 include/admin/menus.php:146 +#: include/admin/menus.php:158 +msgid "entry title" +msgstr "ingrese título" + +#: include/admin/menus.php:146 include/admin/menus.php:147 +#: include/admin/menus.php:159 +msgid "type of link" +msgstr "tipo del enlace" + +#: include/admin/menus.php:218 include/admin/menus.php:217 +#: include/admin/menus.php:229 +msgid "menu name" +msgstr "nombre del menú" + +#: include/admin/menus.php:219 include/admin/menus.php:218 +#: include/admin/menus.php:230 +msgid "link" +msgstr "enlace" + +#: htdocs/toplevel/options.php:80 htdocs/toplevel/options_expert.php:8 +#: include/diogenes.toplevel.inc.php:201 htdocs/toplevel/options.php:43 +#: include/diogenes.toplevel.inc.php:95 include/diogenes.toplevel.inc.php:96 +msgid "Global options" +msgstr "Opciones globales" + +msgid "menu options" +msgstr "opciones del menú" + +#: htdocs/toplevel/options.php:83 include/admin/options.php:69 +#: htdocs/toplevel/options.php:46 include/admin/options.php:71 +#: include/admin/options.php:73 +msgid "menu style" +msgstr "estilo del menú" + +#: htdocs/toplevel/options.php:84 include/admin/options.php:70 +#: htdocs/toplevel/options.php:47 include/admin/options.php:72 +#: include/admin/options.php:74 +msgid "menu theme" +msgstr "tema del menú" + +#: htdocs/toplevel/options.php:91 htdocs/toplevel/options_expert.php:57 +msgid "version control system" +msgstr "sistema de control de versión" + +#: include/admin/options.php:6 include/admin/options.php:7 +msgid "Site options" +msgstr "Opciones del sitio" + +#: include/admin/options.php:55 include/admin/options.php:57 +#: include/admin/options.php:59 +msgid "fully expanded" +msgstr "completamente expandido" + +#: include/admin/options.php:71 include/admin/options.php:73 +#: include/admin/options.php:75 +msgid "minimum menu levels to expand" +msgstr "níveles mínimos a expandir" + +#: include/diogenes.admin.inc.php:66 include/diogenes.admin.inc.php:73 +#: include/diogenes.admin.inc.php:72 +msgid "Options" +msgstr "Opciones" + +#: include/admin/options.php:59 include/admin/options.php:61 +#: include/admin/options.php:63 +msgid "general options" +msgstr "opciones generales" + +#: include/diogenes/diogenes.logger-view.inc.php:368 +#: include/diogenes/diogenes.logger-view.inc.php:365 +#: include/diogenes/diogenes.logger-view.inc.php:364 +msgid "session properties" +msgstr "propiedades de la sesión" + +#: include/diogenes/diogenes.logger-view.inc.php:370 +#: include/diogenes/diogenes.logger-view.inc.php:367 +#: include/diogenes/diogenes.logger-view.inc.php:366 +msgid "host" +msgstr "host" + +#: include/diogenes/diogenes.logger-view.inc.php:371 +#: include/diogenes/diogenes.logger-view.inc.php:368 +#: include/diogenes/diogenes.logger-view.inc.php:367 +msgid "browser" +msgstr "examinar" + +#: include/diogenes/diogenes.logger-view.inc.php:374 +#: include/diogenes/diogenes.logger-view.inc.php:371 +#: include/diogenes/diogenes.logger-view.inc.php:370 +msgid "data" +msgstr "datos" + +#: include/diogenes/diogenes.logger-view.inc.php:375 +#: include/diogenes/diogenes.logger-view.inc.php:372 +#: include/diogenes/diogenes.logger-view.inc.php:371 +msgid "filter by" +msgstr "filtrar por" + +#: include/diogenes/diogenes.logger-view.inc.php:376 +#: include/diogenes/diogenes.logger-view.inc.php:373 +#: include/diogenes/diogenes.logger-view.inc.php:372 +msgid "start" +msgstr "comenzar" + +#: include/diogenes/diogenes.logger-view.inc.php:377 +#: include/diogenes/diogenes.logger-view.inc.php:374 +#: include/diogenes/diogenes.logger-view.inc.php:373 +msgid "summary" +msgstr "sumario" + +#: include/diogenes/diogenes.logger-view.inc.php:379 +#: include/diogenes/diogenes.logger-view.inc.php:376 +#: include/diogenes/diogenes.logger-view.inc.php:375 +msgid "year" +msgstr "año" + +#: include/diogenes/diogenes.logger-view.inc.php:380 +#: include/diogenes/diogenes.logger-view.inc.php:377 +#: include/diogenes/diogenes.logger-view.inc.php:376 +msgid "month" +msgstr "mes" + +#: include/diogenes/diogenes.logger-view.inc.php:381 +#: include/diogenes/diogenes.logger-view.inc.php:378 +#: include/diogenes/diogenes.logger-view.inc.php:377 +msgid "day" +msgstr "día" + +#: include/diogenes/diogenes.table-editor.inc.php:525 +#: include/diogenes/diogenes.table-editor.inc.php:530 +msgid "id" +msgstr "id" + +#: include/diogenes/diogenes.table-editor.inc.php:527 +#: include/diogenes/diogenes.table-editor.inc.php:532 +msgid "create" +msgstr "crear" + +#: include/diogenes/diogenes.table-editor.inc.php:530 +#: include/diogenes/diogenes.table-editor.inc.php:535 +msgid "new entry" +msgstr "nueva entrada" + +#: include/diogenes/diogenes.table-editor.inc.php:531 +#: include/diogenes/diogenes.table-editor.inc.php:536 +msgid "existing entry" +msgstr "entrada existente" + +#: include/diogenes/diogenes.table-editor.inc.php:532 +#: include/diogenes/diogenes.table-editor.inc.php:537 +msgid "(blank = no change)" +msgstr "(blanco = no cambiar)" + +#: include/diogenes/diogenes.table-editor.inc.php:533 +#: include/diogenes/diogenes.table-editor.inc.php:538 +msgid "back" +msgstr "volver" + +#: include/diogenes/diogenes.table-editor.inc.php:535 +#: include/diogenes/diogenes.table-editor.inc.php:540 +msgid "You are about to delete this entry. Do you want to proceed?" +msgstr "Esta apunto de eliminar esta entrada. ¿Desea continuar?" + +#: include/diogenes.session.inc.php:62 include/diogenes.session.inc.php:71 +msgid "Authentication error!" +msgstr "Error de autenticación!" + +#: include/admin/files.php:84 include/admin/files.php:93 +#: include/admin/files.php:102 include/admin/pages.php:158 +#: include/admin/compose.php:57 include/admin/edit.php:49 +#: include/admin/files.php:114 include/admin/files.php:122 +#: include/admin/files.php:154 include/admin/pages.php:124 +#: include/admin/compose.php:61 include/admin/edit.php:53 +#: include/admin/plugins.php:23 include/admin/files.php:61 +#: include/admin/pages.php:122 +msgid "Page" +msgstr "Página" + +#: include/admin/files.php:86 include/admin/files.php:95 +#: include/admin/pages.php:172 include/admin/compose.php:63 +#: include/admin/edit.php:55 include/admin/files.php:115 +#: include/admin/files.php:123 include/admin/pages.php:136 +#: include/admin/compose.php:62 include/admin/edit.php:54 +#: include/admin/files.php:122 include/admin/files.php:161 +#: include/admin/pages.php:123 +msgid "File" +msgstr "Archivo" + +#: htdocs/toplevel/index.php:15 include/diogenes.barrel-editor.inc.php:156 +#: include/Barrel/Editor.php:163 +msgid "The site alias may only contain letters, numbers and underscores." +msgstr "El alias del sitio solo puede contener letras, números y guión bajo." + +#: htdocs/toplevel/index.php:18 include/diogenes.barrel-editor.inc.php:159 +#: include/Barrel/Editor.php:167 +msgid "" +"vhost note: If you intend to serve this site from a virtualhost, you " +"should enter the name of the virtualhost in this field." +msgstr "" +"nota sobre vhost: si quiere servir este sitio desde un host virtual, " +"debe ingresar el nombre del mismo en este campo." + +#: htdocs/toplevel/index.php:55 +msgid "PHP execution" +msgstr "Ejecutar PHP" + +#: htdocs/toplevel/index.php:55 include/diogenes.barrel-editor.inc.php:106 +#: include/Barrel/Editor.php:113 +msgid "custom templates" +msgstr "plantillas personalizadas" + +msgid "template options" +msgstr "opciones de la plantilla" + +#: htdocs/toplevel/options.php:85 include/admin/options.php:66 +#: htdocs/toplevel/options.php:48 include/admin/options.php:68 +#: include/admin/options.php:70 +msgid "templates directory" +msgstr "directiorio de plantillas" + +#: htdocs/toplevel/options.php:86 include/admin/options.php:67 +#: htdocs/toplevel/options.php:49 include/admin/options.php:69 +#: include/admin/options.php:71 +msgid "default template" +msgstr "plantilla por omisión" + +#: include/admin/compose.php:56 include/admin/edit.php:46 +#: include/admin/compose.php:58 include/admin/edit.php:48 +msgid "log message" +msgstr "registrar mensaje" + +#: include/admin/options.php:63 include/admin/options.php:65 +#: include/admin/options.php:67 +msgid "favicon" +msgstr "favicon" + +#: include/admin/options.php:64 include/admin/options.php:66 +#: include/admin/options.php:68 +msgid "(relative url to a PNG image)" +msgstr "(url relativa a una imagen PNG)" + +#: include/admin/pages.php:17 include/admin/files.php:57 +#: include/admin/pages.php:21 include/admin/files.php:54 +#: include/admin/pages.php:20 +msgid "page template" +msgstr "plantilla de la página" + +#: include/admin/pages.php:18 include/admin/files.php:58 +#: include/admin/pages.php:22 include/admin/files.php:55 +#: include/admin/pages.php:21 +msgid "status" +msgstr "estado" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "under construction" +msgstr "en construcción" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "disabled" +msgstr "deshabilitado" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "archived" +msgstr "archivado" + +#: include/diogenes.barrel.inc.php:152 include/diogenes.barrel.inc.php:153 +#: include/diogenes.barrel.inc.php:155 +msgid "This page is currently under construction." +msgstr "Esta página se encuentra en construcción." + +#: include/diogenes.barrel.inc.php:156 include/diogenes.barrel.inc.php:157 +#: include/diogenes.barrel.inc.php:159 +msgid "This page is currently unavailable." +msgstr "Está página no se encuentra disponible." + +#: include/diogenes.admin.inc.php:63 include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:69 +msgid "http://diogenes-doc.polytechnique.org/en-admin/" +msgstr "http://diogenes-doc.polytechnique.org/en-admin/" + +#: include/diogenes.toplevel.inc.php:188 include/diogenes.toplevel.inc.php:82 +#: include/diogenes.toplevel.inc.php:83 +msgid "http://diogenes-doc.polytechnique.org/en-user/" +msgstr "http://diogenes-doc.polytechnique.org/en-user/" + +#: include/diogenes.toplevel.inc.php:198 include/diogenes.toplevel.inc.php:92 +#: include/diogenes.toplevel.inc.php:93 +msgid "http://diogenes-doc.polytechnique.org/en-root/" +msgstr "http://diogenes-doc.polytechnique.org/en-root/" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "Mode" +msgstr "" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +#, fuzzy +msgid "standard" +msgstr "comenzar" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "expert" +msgstr "" + +#: htdocs/toplevel/options.php:82 include/admin/options.php:65 +#: htdocs/toplevel/options.php:45 include/admin/options.php:67 +#: include/admin/options.php:69 +#, fuzzy +msgid "display options" +msgstr "opciones de la plantilla" + +#: htdocs/toplevel/options.php:87 htdocs/toplevel/options.php:50 +#, fuzzy +msgid "system options" +msgstr "Opciones del sitio" + +msgid "Initial user setup" +msgstr "" + +#: htdocs/toplevel/boot.php:11 +msgid "" +"Sorry, this feature is only available using native Diogenes authentication." +msgstr "" + +#: htdocs/toplevel/boot.php:19 +msgid "The database is already configured." +msgstr "" + +#: htdocs/toplevel/options_expert.php:13 htdocs/toplevel/options_expert.php:75 +#: htdocs/toplevel/options_expert.php:76 +#, fuzzy +msgid "option" +msgstr "Opciones" + +#: htdocs/toplevel/options_expert.php:14 htdocs/toplevel/options_expert.php:76 +#: htdocs/toplevel/options_expert.php:77 +msgid "value" +msgstr "" + +#: include/admin/menus.php:221 include/admin/menus.php:220 +#: include/admin/menus.php:232 +msgid "Menu" +msgstr "" + +#: include/diogenes.page.inc.php:65 include/diogenes.page.inc.php:66 +msgid "debugging" +msgstr "" + +#: include/diogenes.page.inc.php:66 include/diogenes.page.inc.php:67 +msgid "call trace" +msgstr "" + +#: include/diogenes.page.inc.php:67 include/diogenes.page.inc.php:68 +msgid "database trace" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:59 +#: include/diogenes/diogenes.logger-view.inc.php:85 +#: include/diogenes/diogenes.logger-view.inc.php:130 +#: include/diogenes/diogenes.logger-view.inc.php:183 +#: include/diogenes/diogenes.logger-view.inc.php:58 +#: include/diogenes/diogenes.logger-view.inc.php:84 +#: include/diogenes/diogenes.logger-view.inc.php:129 +#: include/diogenes/diogenes.logger-view.inc.php:182 +msgid "all" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:363 +#: include/diogenes/diogenes.logger-view.inc.php:360 +#: include/diogenes/diogenes.logger-view.inc.php:359 +msgid "Please select a year and/or a user." +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:523 +#: include/diogenes/diogenes.table-editor.inc.php:528 +#, fuzzy +msgid "previous page" +msgstr "ver página" + +#: include/diogenes/diogenes.table-editor.inc.php:524 +#: include/diogenes/diogenes.table-editor.inc.php:529 +#, fuzzy +msgid "next page" +msgstr "ver página" + +#: htdocs/toplevel/boot.php:7 +msgid "Initial setup" +msgstr "" + +#: htdocs/toplevel/boot.php:46 +msgid "The initial setup of the database was performed successfuly." +msgstr "" + +#: include/admin/options.php:47 include/admin/options.php:49 +#: include/admin/options.php:51 +#, fuzzy +msgid "no" +msgstr "ninguno" + +#: include/admin/options.php:47 include/admin/options.php:49 +#: include/admin/options.php:51 +msgid "yes" +msgstr "" + +#: include/admin/options.php:68 include/admin/options.php:70 +#: include/admin/options.php:72 +#, fuzzy +msgid "hide Diogenes menu" +msgstr "Menú del sitio" + +#: include/admin/prefs.php:28 +#, fuzzy +msgid "account preferences" +msgstr "Preferencias de Diogenes" + +#: htdocs/toplevel/plugins.php:19 +msgid "Barrel plugins" +msgstr "" + +#: htdocs/toplevel/plugins.php:21 +#, fuzzy +msgid "Global plugin settings" +msgstr "Opciones globales" + +#: htdocs/toplevel/plugins.php:38 +#, php-format +msgid "Rebuilding plugin cache for barrel '%s'" +msgstr "" + +#: htdocs/toplevel/plugins.php:47 +msgid "Clean plugins database" +msgstr "" + +#: htdocs/toplevel/plugins.php:48 +msgid "" +"If you are having problems with references to plugins that no longer exist, " +"you can have Diogenes remove such entries from the database." +msgstr "" + +#: htdocs/toplevel/plugins.php:49 +msgid "Clean" +msgstr "" + +#: htdocs/toplevel/plugins.php:51 +msgid "Enable or disable plugins" +msgstr "" + +#: htdocs/toplevel/plugins.php:54 +msgid "You can select the plugins you want to enable for this barrel." +msgstr "" + +#: htdocs/toplevel/plugins.php:56 +msgid "" +"You can select the plugins you want to enable or disable globally, that is " +"the plugins that can be used in the different barrels. Please note that for " +"a plugin to be accessible from a barrel, you will need to activate that " +"plugin for the barrel. To do this, from the List of sites click on " +"'plugins' next to the barrel of your choice." +msgstr "" + +#: htdocs/toplevel/options.php:52 +#, fuzzy +msgid "Word document import" +msgstr "Importar documento Word" + +#: include/admin/files.php:39 +#, fuzzy +msgid "File operations" +msgstr "Opciones del sitio" + +#: include/admin/files.php:43 include/admin/files.php:40 +#, fuzzy +msgid "Create an empty file" +msgstr "Crear un nuevo sitio" + +#: include/admin/files.php:44 include/admin/files.php:41 +msgid "Copy or move a file" +msgstr "" + +#: include/admin/files.php:45 include/admin/files.php:42 +#, fuzzy +msgid "Create" +msgstr "crear" + +#: include/admin/files.php:53 include/admin/files.php:50 +msgid "to" +msgstr "" + +#: include/admin/files.php:59 +#, fuzzy +msgid "read" +msgstr "crear" + +#: include/admin/files.php:60 +#, fuzzy +msgid "write" +msgstr "sitio" + +#: include/admin/files.php:67 include/admin/files.php:69 +#, fuzzy +msgid "Creating empty file" +msgstr "Eliminando archivo" + +#: include/admin/files.php:69 include/admin/files.php:71 +msgid "The specified file already exists!" +msgstr "" + +#: include/admin/files.php:155 include/admin/pages.php:160 +#: include/admin/plugins.php:22 include/admin/files.php:194 +#: include/admin/pages.php:156 include/Barrel/Page.php:170 +#, fuzzy +msgid "home" +msgstr "Inicio" + +#: include/admin/files.php:182 include/admin/files.php:224 +msgid "Copy" +msgstr "" + +#: include/admin/files.php:182 include/admin/files.php:224 +#, fuzzy +msgid "Move" +msgstr "Eliminar" + +#: include/admin/pages.php:18 include/admin/pages.php:17 +#: include/Barrel/Page.php:171 +#, fuzzy +msgid "parent page" +msgstr "ver página" + +#: include/admin/webdav.php:7 include/diogenes.admin.inc.php:79 +#: include/diogenes.admin.inc.php:78 +msgid "WebDAV" +msgstr "" + +#: include/admin/webdav.php:9 include/admin/webdav.php:11 +msgid "" +"You can access your barrel's files using WebDAV by pointing your WebDAV " +"client to the following address." +msgstr "" + +#: include/admin/plugins.php:22 +msgid "Page plugins " +msgstr "" + +#: include/admin/plugins.php:26 +msgid "Available plugins" +msgstr "" + +#: include/diogenes.page.inc.php:69 include/diogenes.barrel-editor.inc.php:50 +#: include/diogenes.barrel-editor.inc.php:106 include/Barrel/Page.php:126 +#: include/Barrel/Page.php:152 include/diogenes.plugin-editor.inc.php:237 +#: include/Barrel/Page.php:150 include/Barrel/Page.php:178 +#: include/Barrel/Editor.php:52 include/Barrel/Editor.php:113 +#: include/Plugin/Editor.php:266 include/diogenes.page.inc.php:68 +msgid "plugins" +msgstr "" + +#: include/diogenes.toplevel.inc.php:96 include/diogenes.admin.inc.php:76 +#: include/diogenes.toplevel.inc.php:97 include/diogenes.admin.inc.php:75 +msgid "Plugins" +msgstr "" + +#: include/Barrel/Page.php:70 include/Barrel/Page.php:89 +msgid "Not deleting page, it has child pages!" +msgstr "" + +#: include/Barrel/File.php:76 include/Barrel/File.php:94 +#, fuzzy +msgid "rename" +msgstr "usuario" + +#: include/diogenes.plugin-editor.inc.php:236 include/Plugin/Editor.php:265 +#, fuzzy +msgid "plugin" +msgstr "enlace" + +#: include/diogenes.plugin-editor.inc.php:239 include/Plugin/Editor.php:268 +#, fuzzy +msgid "parameters" +msgstr "propiedades" + +#: include/admin/files.php:192 +msgid "Document" +msgstr "" + +#: include/admin/index.php:52 +#, fuzzy +msgid "barrel options" +msgstr "Opciones globales" + +#: include/admin/index.php:57 +#, fuzzy +msgid "barrel plugins" +msgstr "Opciones globales" + +#: include/admin/index.php:68 +#, fuzzy +msgid "page removed" +msgstr "página creada" + +#: include/admin/index.php:80 +#, fuzzy +msgid "page plugins" +msgstr "enlace" + +#: include/admin/index.php:92 +#, fuzzy +msgid "file deleted" +msgstr "página eliminada" + +#: include/admin/webdav.php:14 +msgid "" +"In order to access your barrel's files using WebDAV, please ask your " +"Diogenes administrator to enable this feature in the Diogenes configuration " +"file." +msgstr "" + +#: include/Barrel/Page.php:81 +#, fuzzy +msgid "Deleting page" +msgstr "Eliminando archivo" + +#: include/Barrel/Page.php:176 +#, fuzzy +msgid "add a page" +msgstr "Agregar página" + +#: include/Barrel/Page.php:266 +#, fuzzy +msgid "Creating new page" +msgstr "Eliminando archivo" + +#: include/Barrel/Editor.php:165 +msgid "no barrels available" +msgstr "" + +#: htdocs/toplevel/index.php:13 +msgid "" +"Warning : in order to make use of virtual hosts or WebDAV, you need to set " +"$globals->rooturl to a full URL starting with http:// or https:// in your " +"Diogenes configuration file." +msgstr "" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..8bfef4b --- /dev/null +++ b/po/fr.po @@ -0,0 +1,1536 @@ +# translation of fr.po to +# translation of fr.po to English +# French translations for Diogenes package. +# Copyright (C) 2003, 2004 Jeremy Lainé +# This file is distributed under the same license as the Diogenes package. +# Jeremy Lainé , 2003, 2004, 2005, 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: fr\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-01-07 16:41+0100\n" +"PO-Revision-Date: 2006-01-07 16:18+0100\n" +"Last-Translator: Jeremy Lainé \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: KBabel 1.10.2\n" + +#: htdocs/index.php:9 htdocs/index.php:13 include/admin/bad.php:46 +msgid "Welcome to Diogenes" +msgstr "Bienvenue sur Diogenes" + +#: htdocs/index.php:11 htdocs/index.php:15 +msgid "Welcome to the Diogenes content management system." +msgstr "" +"Diogenes est un système permettant de créer des sites web et de les " +"administrer à travers une interface web." + +#: htdocs/index.php:12 htdocs/index.php:16 +msgid "" +"Diogenes was developed by the webmasters of the Polytechnique.org web site." +msgstr "Diogenes a été mis au point par l'équipe de Polytechnique.org." + +#: htdocs/index.php:13 htdocs/index.php:17 +msgid "The following barrels are currently available" +msgstr "Les tonneaux suivants sont disponibles" + +#: htdocs/index.php:14 htdocs/toplevel/admins.php:8 +#: include/diogenes.barrel-editor.inc.php:152 include/Barrel/Editor.php:159 +msgid "site" +msgstr "site" + +#: htdocs/index.php:15 htdocs/toplevel/index.php:12 +#: htdocs/toplevel/logger_actions.php:14 include/admin/options.php:61 +#: include/admin/options.php:63 include/diogenes.barrel-editor.inc.php:153 +#: include/diogenes.plugin-editor.inc.php:238 include/admin/options.php:65 +#: include/Barrel/Editor.php:160 include/Plugin/Editor.php:267 +msgid "description" +msgstr "description" + +#: htdocs/prefs.php:19 +msgid "Changing password.." +msgstr "Changement de mot de passe..." + +#: htdocs/prefs.php:33 include/admin/prefs.php:20 +msgid "User preferences" +msgstr "Préférences" + +#: htdocs/prefs.php:34 include/admin/prefs.php:21 +msgid "Diogenes preferences" +msgstr "Préférences de Diogenes" + +#: htdocs/prefs.php:36 +msgid "my information" +msgstr "mes informations" + +#: htdocs/prefs.php:37 htdocs/toplevel/accounts.php:13 +#: htdocs/toplevel/boot.php:28 include/diogenes.session.inc.php:138 +msgid "username" +msgstr "utilisateur" + +#: htdocs/prefs.php:38 +msgid "full name" +msgstr "identité" + +#: htdocs/prefs.php:40 include/admin/prefs.php:23 +msgid "language" +msgstr "langue" + +#: htdocs/prefs.php:41 include/admin/prefs.php:24 +msgid "" +"You can select your preferred language by clicking on the appropriate " +"language below." +msgstr "" +"Vous pouvez choisir votre langue préférée en cliquant sur la langue de votre " +"choix ci-dessous." + +#: htdocs/prefs.php:43 +msgid "my password" +msgstr "mot de passe" + +#: htdocs/prefs.php:44 +msgid "new password" +msgstr "nouveau mot de passe" + +#: htdocs/prefs.php:45 +msgid "confirmation" +msgstr "confirmation" + +#: htdocs/prefs.php:47 include/admin/prefs.php:26 +msgid "Change" +msgstr "Changer" + +#: include/admin/compose.php:32 include/admin/edit.php:31 +#: include/admin/compose.php:34 include/admin/edit.php:33 +msgid "Commiting changes to file" +msgstr "Enregistrement des modifications" + +#: include/admin/edit.php:41 include/admin/edit.php:43 +msgid "File editor" +msgstr "Éditeur de fichier" + +#: include/admin/edit.php:45 include/admin/edit.php:47 +msgid "File source" +msgstr "Source du fichier" + +#: htdocs/toplevel/index.php:16 htdocs/toplevel/options.php:89 +#: include/admin/menus.php:151 include/admin/options.php:72 +#: include/admin/pages.php:12 include/admin/edit.php:48 +#: include/diogenes.session.inc.php:137 +#: include/diogenes/diogenes.logger-view.inc.php:382 +#: include/diogenes/diogenes.table-editor.inc.php:536 +#: htdocs/toplevel/options.php:53 include/admin/files.php:41 +#: include/admin/menus.php:152 include/admin/options.php:74 +#: include/admin/pages.php:15 include/admin/edit.php:50 +#: include/diogenes/diogenes.logger-view.inc.php:379 +#: include/diogenes/diogenes.table-editor.inc.php:541 +#: include/diogenes.barrel-editor.inc.php:157 +#: include/diogenes.plugin-editor.inc.php:235 include/admin/files.php:38 +#: include/admin/menus.php:164 include/admin/options.php:76 +#: include/admin/pages.php:14 include/Barrel/Editor.php:164 +#: include/Plugin/Editor.php:264 +#: include/diogenes/diogenes.logger-view.inc.php:378 +msgid "Submit" +msgstr "Envoyer" + +#: include/admin/files.php:27 include/admin/pages.php:152 +#: include/admin/compose.php:58 include/admin/edit.php:50 +#: include/Barrel/Page.php:143 +msgid "pages catalog" +msgstr "catalogue des pages" + +#: include/admin/files.php:28 include/admin/pages.php:154 +#: include/admin/compose.php:59 include/admin/edit.php:51 +#: include/Barrel/Page.php:147 include/admin/index.php:74 +#: include/Barrel/Page.php:174 +msgid "page properties" +msgstr "propriétés de la page" + +#: include/admin/files.php:29 include/admin/pages.php:155 +#: include/admin/compose.php:60 include/admin/edit.php:52 +#: include/diogenes.rcs.inc.php:452 include/diogenes.rcs.inc.php:621 +#: include/Barrel/Page.php:148 include/admin/files.php:146 +#: include/Barrel/Page.php:175 +msgid "view page" +msgstr "voir la page" + +#: include/admin/files.php:83 include/admin/files.php:92 +#: include/admin/files.php:101 include/admin/pages.php:156 +#: include/admin/compose.php:61 include/admin/edit.php:53 +#: include/Barrel/Page.php:149 include/Barrel/Page.php:173 +msgid "browse files" +msgstr "parcourir les fichiers" + +#: include/admin/files.php:35 include/admin/pages.php:167 +#: include/admin/compose.php:64 include/admin/edit.php:56 +#: include/admin/pages.php:132 include/Barrel/File.php:94 +#: include/Barrel/File.php:114 +msgid "raw editor" +msgstr "éditeur brut" + +#: htdocs/toplevel/options.php:88 include/admin/files.php:36 +#: include/admin/pages.php:168 include/admin/compose.php:65 +#: include/admin/edit.php:57 include/diogenes.barrel.inc.php:316 +#: htdocs/toplevel/options.php:51 include/admin/pages.php:133 +#: include/diogenes.barrel.inc.php:347 include/Barrel/File.php:95 +#: include/Barrel/File.php:115 include/diogenes.barrel.inc.php:343 +msgid "HTML editor" +msgstr "éditeur HTML" + +#: include/admin/files.php:85 include/admin/files.php:94 +#: include/admin/pages.php:163 include/admin/pages.php:170 +#: include/admin/compose.php:66 include/admin/edit.php:58 +#: include/admin/pages.php:129 include/admin/pages.php:134 +#: include/Barrel/File.php:97 include/Barrel/File.php:117 +msgid "file revisions" +msgstr "versions du fichier" + +msgid "Ekit" +msgstr "Ekit" + +#: include/admin/menus.php:36 include/admin/menus.php:37 +msgid "The site's menus" +msgstr "Menus du site" + +#: include/admin/menus.php:44 include/admin/menus.php:45 +msgid "The selected menu has child items, please remove them first." +msgstr "" +"Le menu sélectionné a encore des menus fils, il faut d'abord les supprimer." + +#: include/admin/menus.php:144 include/admin/menus.php:145 +#: include/admin/menus.php:157 +msgid "menu entry properties" +msgstr "propriétés de l'entrée" + +#: include/admin/menus.php:147 include/admin/menus.php:148 +#: include/admin/menus.php:160 +msgid "none" +msgstr "aucun" + +#: include/admin/menus.php:148 include/admin/menus.php:149 +#: include/admin/menus.php:161 +msgid "internal link" +msgstr "lien interne" + +#: include/admin/menus.php:149 include/admin/menus.php:150 +#: include/admin/menus.php:162 +msgid "external link" +msgstr "lien extérieur" + +#: include/admin/menus.php:173 include/diogenes.plugin-editor.inc.php:240 +#: include/admin/menus.php:185 include/Plugin/Editor.php:269 +msgid "move up" +msgstr "remonter" + +#: include/admin/menus.php:176 include/diogenes.plugin-editor.inc.php:241 +#: include/admin/menus.php:188 include/Plugin/Editor.php:270 +msgid "move down" +msgstr "descendre" + +#: htdocs/toplevel/index.php:85 include/admin/menus.php:178 +#: include/diogenes.rcs.inc.php:417 +#: include/diogenes/diogenes.table-editor.inc.php:529 +#: include/diogenes/diogenes.table-editor.inc.php:534 +#: include/diogenes.barrel-editor.inc.php:43 include/Barrel/Page.php:119 +#: include/Barrel/File.php:74 include/admin/menus.php:190 +#: include/Barrel/File.php:92 include/Barrel/Page.php:143 +#: include/Barrel/Editor.php:45 +msgid "edit" +msgstr "éditer" + +#: htdocs/toplevel/index.php:87 include/admin/menus.php:179 +#: include/admin/pages.php:202 include/diogenes.rcs.inc.php:419 +#: include/diogenes/diogenes.table-editor.inc.php:528 +#: include/diogenes/diogenes.table-editor.inc.php:533 +#: include/diogenes.barrel-editor.inc.php:52 include/Barrel/Page.php:129 +#: include/Barrel/File.php:77 include/admin/menus.php:191 +#: include/Barrel/File.php:95 include/Barrel/Page.php:153 +#: include/Barrel/Editor.php:54 +msgid "delete" +msgstr "supprimer" + +#: include/admin/menus.php:217 include/admin/menus.php:216 +#: include/admin/menus.php:228 +msgid "External links are denoted with the [ext] prefix." +msgstr "Les liens extérieurs sont signalés par le préfixe [ext]." + +#: include/admin/menus.php:222 include/admin/menus.php:221 +#: include/admin/menus.php:233 +msgid "Add new entry" +msgstr "Ajouter une entrée" + +#: include/admin/files.php:63 include/admin/files.php:86 +#: include/admin/files.php:88 +msgid "Error during file transfer!" +msgstr "Erreur lors de l'envoi du fichier !" + +#: include/admin/files.php:69 include/admin/files.php:92 +#: include/admin/files.php:94 +msgid "Deleting file" +msgstr "Suppression du fichier" + +#: include/admin/files.php:81 include/admin/files.php:112 +#: include/admin/files.php:120 +msgid "Revision differences" +msgstr "Différences entre versions" + +#: include/admin/files.php:90 include/admin/files.php:120 +#: include/admin/files.php:128 +msgid "File revisions" +msgstr "Versions du fichier" + +#: include/admin/files.php:103 include/admin/files.php:155 +#: include/admin/files.php:194 +msgid "File manager" +msgstr "Gestionnaire de fichiers" + +#: include/admin/files.php:40 include/admin/files.php:38 +msgid "Files in current directory" +msgstr "Fichiers actuellement dans ce répertoire" + +#: include/admin/files.php:41 include/admin/files.php:40 +#: include/admin/files.php:37 +msgid "Import file" +msgstr "Importer un fichier" + +#: include/admin/files.php:42 include/admin/pages.php:210 +#: include/admin/pages.php:191 include/admin/files.php:39 +#: include/admin/pages.php:163 +msgid "Send" +msgstr "Envoyer" + +#: include/admin/files.php:43 +msgid "File to upload" +msgstr "Fichier à envoyer" + +#: include/admin/index.php:20 include/admin/index.php:45 +#: include/admin/index.php:47 +msgid "site created" +msgstr "site créé" + +#: include/admin/index.php:23 include/admin/index.php:50 +#: include/admin/index.php:63 +msgid "page created" +msgstr "page créée" + +#: include/admin/index.php:26 include/admin/index.php:54 +msgid "page deleted" +msgstr "page supprimée" + +#: include/admin/index.php:31 include/admin/index.php:59 +#: include/admin/index.php:86 +msgid "file updated" +msgstr "mise à jour" + +#: include/admin/index.php:34 include/admin/index.php:64 +msgid "file removed" +msgstr "suppression du fichier" + +#: include/admin/index.php:43 include/admin/index.php:77 +#: include/admin/index.php:105 +msgid "Welcome to the Diogenes backoffice" +msgstr "Bienvenue sur l'interface d'administration" + +#: include/admin/files.php:47 include/admin/index.php:44 +#: include/diogenes/diogenes.logger-view.inc.php:372 +#: include/admin/files.php:49 include/admin/index.php:78 +#: include/diogenes/diogenes.logger-view.inc.php:369 +#: include/admin/files.php:46 include/admin/index.php:106 +#: include/diogenes/diogenes.logger-view.inc.php:368 +msgid "date" +msgstr "date" + +#: include/admin/index.php:45 include/admin/users.php:28 +#: include/diogenes/diogenes.logger-view.inc.php:369 +#: include/admin/index.php:79 +#: include/diogenes/diogenes.logger-view.inc.php:366 +#: include/admin/index.php:107 +#: include/diogenes/diogenes.logger-view.inc.php:365 +msgid "user" +msgstr "utilisateur" + +#: include/admin/index.php:46 include/admin/index.php:80 +#: include/admin/index.php:108 +msgid "event" +msgstr "événement" + +#: include/admin/pages.php:11 include/admin/pages.php:14 +#: include/admin/pages.php:158 +msgid "Page manager" +msgstr "Gestionnaire des pages" + +#: include/admin/pages.php:13 include/admin/pages.php:16 +#: include/admin/pages.php:15 +msgid "Reset" +msgstr "R.À.Z." + +#: include/admin/pages.php:14 include/diogenes.barrel.inc.php:312 +#: include/admin/pages.php:17 include/diogenes.barrel.inc.php:343 +#: include/admin/pages.php:16 include/diogenes.barrel.inc.php:339 +msgid "Page properties" +msgstr "Propriétés de la page" + +#: include/admin/pages.php:15 include/admin/files.php:55 +#: include/admin/pages.php:19 include/admin/files.php:52 +#: include/admin/pages.php:18 +msgid "location" +msgstr "emplacement" + +#: htdocs/toplevel/index.php:10 htdocs/toplevel/logger_actions.php:13 +#: include/admin/options.php:60 include/admin/pages.php:16 +#: include/admin/files.php:56 include/admin/options.php:62 +#: include/admin/pages.php:20 include/admin/files.php:53 +#: include/admin/options.php:64 include/admin/pages.php:19 +msgid "title" +msgstr "titre" + +msgid "display" +msgstr "affichage" + +#: include/admin/files.php:56 include/admin/pages.php:22 +msgid "access" +msgstr "accès" + +#: include/admin/pages.php:22 include/admin/pages.php:26 +msgid "Add a page" +msgstr "Ajouter une page" + +#: include/admin/pages.php:43 include/admin/pages.php:47 +#: include/admin/pages.php:50 +msgid "Document name does not end in .doc" +msgstr "Le nom du document ne se termine pas en .doc" + +#: include/admin/pages.php:46 include/admin/pages.php:50 +#: include/admin/pages.php:53 +msgid "Checking in Word file" +msgstr "Enregistrement du fichier Word" + +#: include/admin/pages.php:51 include/admin/pages.php:55 +#: include/admin/pages.php:58 +msgid "Importing Word file" +msgstr "Import du fichier Word" + +#: include/admin/pages.php:57 include/admin/pages.php:61 +#: include/admin/pages.php:64 +msgid "Importing HTML file" +msgstr "Import du fichier HTML" + +#: include/admin/pages.php:62 include/admin/pages.php:66 +#: include/admin/pages.php:69 +msgid "Raw file import" +msgstr "Import du fichier brut" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "visible" +msgstr "visible" + +msgid "invisible" +msgstr "invisible" + +#: htdocs/toplevel/index.php:84 include/admin/pages.php:196 +#: include/diogenes.rcs.inc.php:416 include/diogenes.rcs.inc.php:450 +#: include/diogenes.rcs.inc.php:619 include/Barrel/Page.php:118 +#: include/Barrel/File.php:73 include/admin/files.php:144 +#: include/Barrel/File.php:91 include/Barrel/Page.php:142 +msgid "view" +msgstr "voir" + +#: include/admin/pages.php:197 include/Barrel/Page.php:120 +#: include/Barrel/Page.php:144 +msgid "properties" +msgstr "propriétés" + +#: include/admin/pages.php:198 +msgid "files" +msgstr "fichiers" + +#: include/admin/pages.php:199 include/diogenes.rcs.inc.php:418 +#: include/Barrel/Page.php:121 include/Barrel/File.php:75 +#: include/Barrel/File.php:93 include/Barrel/Page.php:145 +msgid "revisions" +msgstr "versions" + +#: include/admin/pages.php:211 include/admin/pages.php:195 +#: include/admin/pages.php:172 +msgid "Import a Word document" +msgstr "Importer un document Word" + +#: include/admin/pages.php:214 include/admin/pages.php:198 +#: include/admin/pages.php:176 +msgid "This page's master document is currently a Word document." +msgstr "Le document maître pour cette page est actuellement un fichier Word." + +#: include/admin/pages.php:215 include/admin/pages.php:199 +#: include/admin/pages.php:177 +msgid "You can upload a new version of the Word document below." +msgstr "Vous pouvez envoyer une nouvelle version du fichier Word ci-dessous." + +#: include/admin/pages.php:216 include/admin/pages.php:200 +#: include/admin/pages.php:178 +msgid "You can get the current version of the file here" +msgstr "Vous pouvez récupérer la version actuelle du fichier ici" + +#: include/admin/pages.php:219 include/admin/pages.php:203 +#: include/admin/pages.php:181 +msgid "If you wish, you can set this page's content from a Word document." +msgstr "" +"Si vous le souhaitez, vous pouvez remplacer le contenu de cette page par " +"celui d'un fichier Word." + +#: include/admin/pages.php:220 include/admin/pages.php:204 +#: include/admin/pages.php:182 +msgid "To do so, simply upload the Word document below." +msgstr "" +"Pour ce faire, il vous suffit d'indiquer le fichier Word à importer ci-" +"dessous." + +#: include/admin/pages.php:222 include/admin/pages.php:208 +#: include/admin/pages.php:160 +msgid "Import HTML" +msgstr "Import HTML" + +#: include/admin/pages.php:223 include/admin/pages.php:209 +#: include/admin/pages.php:161 +msgid "" +"You can replace the current page's contents by uploading an HTML file below." +msgstr "" +"Vous pouvez remplacer le contenu de la page en important un fichier HTML ci-" +"dessous." + +#: include/admin/pages.php:224 include/admin/pages.php:210 +#: include/admin/pages.php:162 +msgid "" +"If the file name ends with .htm or .html, anything outside the <body>" +"</body> pair will be stripped." +msgstr "" +"Si le nom se termine par .htm ou .html, tout ce qui est en dehors des " +"balises <body></body> sera retiré." + +#: htdocs/toplevel/admins.php:20 include/admin/users.php:15 +msgid "Could not find requested user" +msgstr "L'utilisateur demandé n'a pas été trouvé" + +#: include/admin/users.php:24 +msgid "Users administration" +msgstr "Gestion des utilisateurs" + +#: include/admin/users.php:25 +msgid "Registered users" +msgstr "Utilisateurs du site" + +#: include/admin/users.php:26 include/diogenes.toplevel.inc.php:200 +#: include/diogenes.toplevel.inc.php:94 include/diogenes.toplevel.inc.php:95 +msgid "Administrators" +msgstr "Administrateurs" + +#: include/admin/users.php:29 +#: include/diogenes/diogenes.logger-view.inc.php:373 +#: include/diogenes/diogenes.table-editor.inc.php:526 +#: include/diogenes/diogenes.logger-view.inc.php:370 +#: include/diogenes/diogenes.table-editor.inc.php:531 +#: include/diogenes/diogenes.logger-view.inc.php:369 +msgid "action" +msgstr "action" + +#: htdocs/toplevel/admins.php:45 include/admin/users.php:35 +msgid "remove" +msgstr "retirer" + +#: include/diogenes.session.inc.php:134 +msgid "Diogenes login" +msgstr "Connexion à Diogenes" + +#: include/diogenes.session.inc.php:135 +msgid "Connexion" +msgstr "Connexion" + +#: htdocs/toplevel/accounts.php:16 htdocs/toplevel/boot.php:31 +#: include/diogenes.session.inc.php:136 +msgid "password" +msgstr "mot de passe" + +#: include/diogenes.toplevel.inc.php:52 include/diogenes.barrel.inc.php:104 +#: include/diogenes.barrel.inc.php:105 include/diogenes.toplevel.inc.php:53 +#: include/diogenes.barrel.inc.php:107 +msgid "You are not authorized to view this page!" +msgstr "Vous n'êtes pas autorisé à consulter cette page !" + +#: include/diogenes.toplevel.inc.php:38 include/diogenes.toplevel.inc.php:187 +#: include/diogenes.admin.inc.php:62 include/diogenes.barrel.inc.php:301 +#: include/diogenes.toplevel.inc.php:81 include/diogenes.barrel.inc.php:332 +#: include/diogenes.admin.inc.php:69 include/diogenes.toplevel.inc.php:39 +#: include/diogenes.toplevel.inc.php:82 include/diogenes.admin.inc.php:68 +#: include/diogenes.barrel.inc.php:328 +msgid "Home" +msgstr "Accueil" + +#: include/diogenes.toplevel.inc.php:192 include/diogenes.barrel.inc.php:303 +#: include/diogenes.toplevel.inc.php:86 include/diogenes.barrel.inc.php:334 +#: include/diogenes.toplevel.inc.php:87 include/diogenes.barrel.inc.php:330 +msgid "Logout" +msgstr "Déconnexion" + +#: include/diogenes.toplevel.inc.php:194 include/diogenes.barrel.inc.php:306 +#: include/diogenes.toplevel.inc.php:88 include/diogenes.barrel.inc.php:337 +#: include/diogenes.toplevel.inc.php:89 include/diogenes.barrel.inc.php:333 +msgid "Login" +msgstr "Connexion" + +#: include/diogenes.admin.inc.php:37 include/diogenes.admin.inc.php:64 +#: include/diogenes.barrel.inc.php:310 include/diogenes.barrel.inc.php:341 +#: include/diogenes.admin.inc.php:71 include/diogenes.admin.inc.php:70 +#: include/diogenes.barrel.inc.php:337 +msgid "Administration" +msgstr "Administration" + +#: include/diogenes.rcs.inc.php:455 include/diogenes.rcs.inc.php:624 +#: include/admin/files.php:149 +msgid "diff to" +msgstr "diff. avec" + +#: include/diogenes.rcs.inc.php:459 include/diogenes.rcs.inc.php:628 +#: include/admin/files.php:153 +msgid "restore" +msgstr "restaurer" + +#: include/diogenes.admin.inc.php:63 include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:69 +msgid "Admin manual" +msgstr "Manuel d'administration" + +msgid "Settings" +msgstr "Paramètres" + +#: include/diogenes.toplevel.inc.php:202 include/diogenes.admin.inc.php:67 +#: include/diogenes.toplevel.inc.php:97 include/diogenes.admin.inc.php:78 +#: include/diogenes.toplevel.inc.php:98 include/diogenes.admin.inc.php:77 +msgid "Users" +msgstr "Utilisateurs" + +#: include/diogenes.admin.inc.php:68 include/diogenes.admin.inc.php:80 +#: include/diogenes.admin.inc.php:79 +msgid "Content" +msgstr "Contenu" + +#: include/diogenes.admin.inc.php:69 include/diogenes.admin.inc.php:81 +#: include/diogenes.admin.inc.php:80 +msgid "Pages catalog" +msgstr "Catalogue des pages" + +#: include/diogenes.admin.inc.php:70 include/diogenes.admin.inc.php:82 +#: include/diogenes.admin.inc.php:81 +msgid "Edit style sheet" +msgstr "Éditer la feuille de style" + +#: include/diogenes.admin.inc.php:71 include/diogenes.admin.inc.php:83 +#: include/diogenes.admin.inc.php:82 +msgid "Edit menu" +msgstr "Éditer le menu" + +#: include/diogenes.toplevel.inc.php:38 include/diogenes.toplevel.inc.php:39 +msgid "Toplevel administration" +msgstr "Administration" + +#: include/diogenes.page.inc.php:59 +msgid "Powered by Diogenes" +msgstr "Fonctionne sous Diogenes" + +#: include/diogenes.page.inc.php:213 include/diogenes.page.inc.php:216 +#: include/diogenes.page.inc.php:212 +msgid "The requested document was not found." +msgstr "Le document demandé n'existe pas." + +#: include/diogenes.toplevel.inc.php:188 include/diogenes.toplevel.inc.php:82 +#: include/diogenes.toplevel.inc.php:83 +msgid "User manual" +msgstr "Manuel de l'utilisateur" + +#: include/diogenes.toplevel.inc.php:191 include/diogenes.barrel.inc.php:304 +#: include/diogenes.toplevel.inc.php:85 include/diogenes.barrel.inc.php:335 +#: include/diogenes.toplevel.inc.php:86 include/diogenes.barrel.inc.php:331 +msgid "Preferences" +msgstr "Préférences" + +#: include/diogenes.toplevel.inc.php:197 include/diogenes.toplevel.inc.php:91 +#: include/diogenes.toplevel.inc.php:92 +msgid "Sites" +msgstr "Sites" + +#: include/diogenes.toplevel.inc.php:198 include/diogenes.toplevel.inc.php:92 +#: include/diogenes.toplevel.inc.php:93 +msgid "Root manual" +msgstr "Manuel du système" + +#: htdocs/toplevel/index.php:8 include/diogenes.toplevel.inc.php:199 +#: htdocs/toplevel/index.php:11 include/diogenes.toplevel.inc.php:93 +#: htdocs/toplevel/index.php:16 include/diogenes.toplevel.inc.php:94 +msgid "List of sites" +msgstr "Liste des sites" + +#: htdocs/toplevel/admins.php:7 +msgid "Site administrators" +msgstr "Administrateurs des sites" + +#: htdocs/toplevel/accounts.php:7 include/diogenes.toplevel.inc.php:203 +#: include/diogenes.toplevel.inc.php:98 include/diogenes.toplevel.inc.php:99 +msgid "User accounts" +msgstr "Comptes utilisateurs" + +#: include/diogenes.toplevel.inc.php:204 include/diogenes.toplevel.inc.php:99 +#: include/diogenes.toplevel.inc.php:100 +msgid "Browse user log" +msgstr "Afficher le journal" + +#: htdocs/toplevel/logger_actions.php:8 include/diogenes.toplevel.inc.php:205 +#: include/diogenes.toplevel.inc.php:100 include/diogenes.toplevel.inc.php:101 +msgid "Logger actions" +msgstr "Actions logger" + +#: include/diogenes.page.inc.php:198 include/diogenes.page.inc.php:201 +#: include/diogenes.page.inc.php:197 +msgid "Diogenes error" +msgstr "Erreur de Diogenes" + +#: include/diogenes.page.inc.php:199 include/diogenes.page.inc.php:202 +#: include/diogenes.page.inc.php:198 +msgid "Error" +msgstr "Erreur" + +#: include/diogenes/diogenes.logger-view.inc.php:338 +#: include/diogenes/diogenes.logger-view.inc.php:337 +#: include/diogenes/diogenes.logger-view.inc.php:336 +msgid "view session" +msgstr "afficher la session" + +#: include/diogenes/diogenes.logger-view.inc.php:339 +#: include/diogenes/diogenes.logger-view.inc.php:338 +#: include/diogenes/diogenes.logger-view.inc.php:337 +msgid "user's log" +msgstr "voir le journal" + +#: htdocs/toplevel/logger.php:7 +msgid "User activity log" +msgstr "Journal des événements" + +#: htdocs/toplevel/accounts.php:17 htdocs/toplevel/boot.php:32 +msgid "permissions" +msgstr "permissions" + +#: htdocs/toplevel/accounts.php:19 htdocs/toplevel/admins.php:46 +msgid "view log" +msgstr "voir le journal" + +#: htdocs/toplevel/admins.php:9 +msgid "administrator" +msgstr "administrateur" + +#: htdocs/toplevel/admins.php:10 htdocs/toplevel/index.php:11 +#: include/admin/files.php:50 include/admin/menus.php:220 +#: include/admin/pages.php:21 +#: include/diogenes/diogenes.logger-view.inc.php:378 +#: include/admin/files.php:52 include/admin/menus.php:219 +#: include/admin/pages.php:25 +#: include/diogenes/diogenes.logger-view.inc.php:375 +#: include/admin/files.php:49 include/admin/menus.php:231 +#: include/diogenes/diogenes.logger-view.inc.php:374 +msgid "actions" +msgstr "actions" + +#: htdocs/toplevel/admins.php:43 +msgid "site users" +msgstr "utilisateurs du site" + +#: htdocs/toplevel/admins.php:44 +msgid "demote to user" +msgstr "rétrograder" + +#: htdocs/toplevel/index.php:9 include/diogenes.barrel-editor.inc.php:151 +#: include/Barrel/Editor.php:158 +msgid "alias" +msgstr "alias" + +#: htdocs/toplevel/index.php:13 include/admin/options.php:62 +#: include/admin/options.php:64 include/diogenes.barrel-editor.inc.php:154 +#: include/admin/options.php:66 include/Barrel/Editor.php:161 +msgid "keywords" +msgstr "mots clés" + +#: htdocs/toplevel/index.php:14 include/diogenes.barrel-editor.inc.php:155 +#: include/Barrel/Editor.php:162 +msgid "Create a new site" +msgstr "Créer un nouveau site" + +#: htdocs/toplevel/index.php:17 include/diogenes.barrel-editor.inc.php:158 +#: include/Barrel/Editor.php:166 +msgid "vhost (see note)" +msgstr "vhost (voir notice)" + +#: htdocs/toplevel/index.php:19 include/diogenes.barrel-editor.inc.php:160 +#: include/Barrel/Editor.php:168 +msgid "flags" +msgstr "drapeaux" + +#: htdocs/toplevel/index.php:86 include/diogenes.barrel-editor.inc.php:45 +#: include/Barrel/Editor.php:47 +msgid "admin" +msgstr "admin" + +#: include/diogenes.admin.inc.php:65 include/diogenes.admin.inc.php:72 +#: include/diogenes.admin.inc.php:71 +msgid "Activity" +msgstr "Activité" + +#: htdocs/toplevel/accounts.php:14 htdocs/toplevel/boot.php:29 +msgid "first name" +msgstr "prénom" + +#: htdocs/toplevel/accounts.php:15 htdocs/toplevel/boot.php:30 +msgid "last name" +msgstr "nom" + +#: include/admin/compose.php:16 include/admin/edit.php:15 +#: include/diogenes.admin.inc.php:44 +msgid "Directory not found" +msgstr "Répertoire introuvable" + +#: include/admin/pages.php:19 include/admin/pages.php:23 +#: include/admin/files.php:57 +msgid "read access" +msgstr "accès en lecture" + +#: include/admin/pages.php:20 include/admin/pages.php:24 +#: include/admin/files.php:58 +msgid "write access" +msgstr "accès en écriture" + +#: include/admin/pages.php:83 +msgid "world-writable pages are not allowed with PHP execution enabled!" +msgstr "" +"il n'est pas possible de rendre une page publiquement modifiable avec " +"l'exécution PHP activée !" + +#: include/diogenes.barrel.inc.php:314 include/diogenes.barrel.inc.php:345 +#: include/diogenes.barrel.inc.php:341 +msgid "Edit this page" +msgstr "Éditer cette page" + +#: include/diogenes.barrel.inc.php:315 include/diogenes.barrel.inc.php:346 +#: include/diogenes.barrel.inc.php:342 +msgid "Raw editor" +msgstr "Éditeur brut" + +#: htdocs/toplevel/options.php:90 htdocs/toplevel/options_expert.php:56 +msgid "Convert" +msgstr "Convertir" + +#: htdocs/toplevel/options.php:95 htdocs/toplevel/options_expert.php:61 +msgid "" +"You are currently using RCS as the version control system for your barrels." +msgstr "Vous utilisez actuellement RCS pour gérer les versions de fichiers." + +#: htdocs/toplevel/options.php:96 htdocs/toplevel/options_expert.php:62 +msgid "You can switch to a full CVS repository by clicking here." +msgstr "Vous pouvez passer à CVS en cliquant ici." + +#: htdocs/toplevel/options.php:100 htdocs/toplevel/options_expert.php:66 +msgid "" +"You are currently using CVS as the version control system for your barrels." +msgstr "Vous utilisez actuellement CVS pour gérer les versions de fichiers." + +#: htdocs/toplevel/options.php:101 htdocs/toplevel/options_expert.php:67 +msgid "You can switch back to RCS by clicking here." +msgstr "Vous pouvez repasser à RCS en cliquant ici." + +#: include/admin/files.php:44 include/admin/files.php:46 +#: include/admin/files.php:43 +msgid "file" +msgstr "fichier" + +#: include/admin/files.php:46 include/admin/files.php:48 +#: include/admin/files.php:45 +msgid "version" +msgstr "version" + +#: include/admin/files.php:48 include/admin/files.php:50 +#: include/admin/files.php:47 +msgid "author" +msgstr "auteur" + +#: include/admin/files.php:49 include/admin/files.php:51 +#: include/admin/files.php:48 +msgid "size" +msgstr "taille" + +#: include/admin/pages.php:91 include/Barrel/Page.php:205 +#: include/Barrel/Page.php:248 +msgid "the page location cannot contain spaces or special characters" +msgstr "" +"l'emplacement de la page ne peut contenir ni espaces ni caractères spéciaux" + +#: include/admin/pages.php:95 include/Barrel/Page.php:212 +#: include/Barrel/Page.php:255 +msgid "this location cannot be used, it is reserved by Diogenes" +msgstr "cet emplacement ne peut être utilisé, il est réservé par Diogenes" + +#: include/admin/files.php:45 include/admin/files.php:47 +#: include/admin/files.php:44 +msgid "log" +msgstr "journal" + +#: include/admin/menus.php:145 include/admin/menus.php:146 +#: include/admin/menus.php:158 +msgid "entry title" +msgstr "titre de l'entrée" + +#: include/admin/menus.php:146 include/admin/menus.php:147 +#: include/admin/menus.php:159 +msgid "type of link" +msgstr "type de lien" + +#: include/admin/menus.php:218 include/admin/menus.php:217 +#: include/admin/menus.php:229 +msgid "menu name" +msgstr "nom du menu" + +#: include/admin/menus.php:219 include/admin/menus.php:218 +#: include/admin/menus.php:230 +msgid "link" +msgstr "lien" + +#: htdocs/toplevel/options.php:80 htdocs/toplevel/options_expert.php:8 +#: include/diogenes.toplevel.inc.php:201 htdocs/toplevel/options.php:43 +#: include/diogenes.toplevel.inc.php:95 include/diogenes.toplevel.inc.php:96 +msgid "Global options" +msgstr "Options globales" + +msgid "menu options" +msgstr "options des menus" + +#: htdocs/toplevel/options.php:83 include/admin/options.php:69 +#: htdocs/toplevel/options.php:46 include/admin/options.php:71 +#: include/admin/options.php:73 +msgid "menu style" +msgstr "style du menu" + +#: htdocs/toplevel/options.php:84 include/admin/options.php:70 +#: htdocs/toplevel/options.php:47 include/admin/options.php:72 +#: include/admin/options.php:74 +msgid "menu theme" +msgstr "thème du menu" + +#: htdocs/toplevel/options.php:91 htdocs/toplevel/options_expert.php:57 +msgid "version control system" +msgstr "système de révision" + +#: include/admin/options.php:6 include/admin/options.php:7 +msgid "Site options" +msgstr "Options du site" + +#: include/admin/options.php:55 include/admin/options.php:57 +#: include/admin/options.php:59 +msgid "fully expanded" +msgstr "totalement déroulé" + +#: include/admin/options.php:71 include/admin/options.php:73 +#: include/admin/options.php:75 +msgid "minimum menu levels to expand" +msgstr "nombre minimum de niveaux à afficher" + +#: include/diogenes.admin.inc.php:66 include/diogenes.admin.inc.php:73 +#: include/diogenes.admin.inc.php:72 +msgid "Options" +msgstr "Options" + +#: include/admin/options.php:59 include/admin/options.php:61 +#: include/admin/options.php:63 +msgid "general options" +msgstr "options générales" + +#: include/diogenes/diogenes.logger-view.inc.php:368 +#: include/diogenes/diogenes.logger-view.inc.php:365 +#: include/diogenes/diogenes.logger-view.inc.php:364 +msgid "session properties" +msgstr "propriétés de la session" + +#: include/diogenes/diogenes.logger-view.inc.php:370 +#: include/diogenes/diogenes.logger-view.inc.php:367 +#: include/diogenes/diogenes.logger-view.inc.php:366 +msgid "host" +msgstr "hôte" + +#: include/diogenes/diogenes.logger-view.inc.php:371 +#: include/diogenes/diogenes.logger-view.inc.php:368 +#: include/diogenes/diogenes.logger-view.inc.php:367 +msgid "browser" +msgstr "navigateur" + +#: include/diogenes/diogenes.logger-view.inc.php:374 +#: include/diogenes/diogenes.logger-view.inc.php:371 +#: include/diogenes/diogenes.logger-view.inc.php:370 +msgid "data" +msgstr "données" + +#: include/diogenes/diogenes.logger-view.inc.php:375 +#: include/diogenes/diogenes.logger-view.inc.php:372 +#: include/diogenes/diogenes.logger-view.inc.php:371 +msgid "filter by" +msgstr "filtrer par" + +#: include/diogenes/diogenes.logger-view.inc.php:376 +#: include/diogenes/diogenes.logger-view.inc.php:373 +#: include/diogenes/diogenes.logger-view.inc.php:372 +msgid "start" +msgstr "début" + +#: include/diogenes/diogenes.logger-view.inc.php:377 +#: include/diogenes/diogenes.logger-view.inc.php:374 +#: include/diogenes/diogenes.logger-view.inc.php:373 +msgid "summary" +msgstr "résumé" + +#: include/diogenes/diogenes.logger-view.inc.php:379 +#: include/diogenes/diogenes.logger-view.inc.php:376 +#: include/diogenes/diogenes.logger-view.inc.php:375 +msgid "year" +msgstr "année" + +#: include/diogenes/diogenes.logger-view.inc.php:380 +#: include/diogenes/diogenes.logger-view.inc.php:377 +#: include/diogenes/diogenes.logger-view.inc.php:376 +msgid "month" +msgstr "mois" + +#: include/diogenes/diogenes.logger-view.inc.php:381 +#: include/diogenes/diogenes.logger-view.inc.php:378 +#: include/diogenes/diogenes.logger-view.inc.php:377 +msgid "day" +msgstr "jour" + +#: include/diogenes/diogenes.table-editor.inc.php:525 +#: include/diogenes/diogenes.table-editor.inc.php:530 +msgid "id" +msgstr "id" + +#: include/diogenes/diogenes.table-editor.inc.php:527 +#: include/diogenes/diogenes.table-editor.inc.php:532 +msgid "create" +msgstr "créer" + +#: include/diogenes/diogenes.table-editor.inc.php:530 +#: include/diogenes/diogenes.table-editor.inc.php:535 +msgid "new entry" +msgstr "nouvelle entrée" + +#: include/diogenes/diogenes.table-editor.inc.php:531 +#: include/diogenes/diogenes.table-editor.inc.php:536 +msgid "existing entry" +msgstr "entrée existante" + +#: include/diogenes/diogenes.table-editor.inc.php:532 +#: include/diogenes/diogenes.table-editor.inc.php:537 +msgid "(blank = no change)" +msgstr "(vide = ne pas changer)" + +#: include/diogenes/diogenes.table-editor.inc.php:533 +#: include/diogenes/diogenes.table-editor.inc.php:538 +msgid "back" +msgstr "retour" + +#: include/diogenes/diogenes.table-editor.inc.php:535 +#: include/diogenes/diogenes.table-editor.inc.php:540 +msgid "You are about to delete this entry. Do you want to proceed?" +msgstr "" +"Vous êtes sur le point de supprimer cette entrée. Souhaitez-vous continuer?" + +#: include/diogenes.session.inc.php:62 include/diogenes.session.inc.php:71 +msgid "Authentication error!" +msgstr "Erreur lors de l'authentification !" + +#: include/admin/files.php:84 include/admin/files.php:93 +#: include/admin/files.php:102 include/admin/pages.php:158 +#: include/admin/compose.php:57 include/admin/edit.php:49 +#: include/admin/files.php:114 include/admin/files.php:122 +#: include/admin/files.php:154 include/admin/pages.php:124 +#: include/admin/compose.php:61 include/admin/edit.php:53 +#: include/admin/plugins.php:23 include/admin/files.php:61 +#: include/admin/pages.php:122 +msgid "Page" +msgstr "Page" + +#: include/admin/files.php:86 include/admin/files.php:95 +#: include/admin/pages.php:172 include/admin/compose.php:63 +#: include/admin/edit.php:55 include/admin/files.php:115 +#: include/admin/files.php:123 include/admin/pages.php:136 +#: include/admin/compose.php:62 include/admin/edit.php:54 +#: include/admin/files.php:122 include/admin/files.php:161 +#: include/admin/pages.php:123 +msgid "File" +msgstr "Fichier" + +#: htdocs/toplevel/index.php:15 include/diogenes.barrel-editor.inc.php:156 +#: include/Barrel/Editor.php:163 +msgid "The site alias may only contain letters, numbers and underscores." +msgstr "" +"L'alias du site ne peut contenir que des lettres, des chiffres et des tirets " +"bas." + +#: htdocs/toplevel/index.php:18 include/diogenes.barrel-editor.inc.php:159 +#: include/Barrel/Editor.php:167 +msgid "" +"vhost note: If you intend to serve this site from a virtualhost, you " +"should enter the name of the virtualhost in this field." +msgstr "" +"note sur vhost : Si vous comptez héberger ce site sur un virtualhost, " +"il vous faut saisir dans ce champs le nom du virtualhost." + +#: htdocs/toplevel/index.php:55 +msgid "PHP execution" +msgstr "exécution PHP" + +#: htdocs/toplevel/index.php:55 include/diogenes.barrel-editor.inc.php:106 +#: include/Barrel/Editor.php:113 +msgid "custom templates" +msgstr "templates personnalisées" + +msgid "template options" +msgstr "options des templates" + +#: htdocs/toplevel/options.php:85 include/admin/options.php:66 +#: htdocs/toplevel/options.php:48 include/admin/options.php:68 +#: include/admin/options.php:70 +msgid "templates directory" +msgstr "répertoire des templates" + +#: htdocs/toplevel/options.php:86 include/admin/options.php:67 +#: htdocs/toplevel/options.php:49 include/admin/options.php:69 +#: include/admin/options.php:71 +msgid "default template" +msgstr "template par défaut" + +#: include/admin/compose.php:56 include/admin/edit.php:46 +#: include/admin/compose.php:58 include/admin/edit.php:48 +msgid "log message" +msgstr "message pour le log" + +#: include/admin/options.php:63 include/admin/options.php:65 +#: include/admin/options.php:67 +msgid "favicon" +msgstr "favicon" + +#: include/admin/options.php:64 include/admin/options.php:66 +#: include/admin/options.php:68 +msgid "(relative url to a PNG image)" +msgstr "(adresse relative de l'image PNG)" + +#: include/admin/pages.php:17 include/admin/files.php:57 +#: include/admin/pages.php:21 include/admin/files.php:54 +#: include/admin/pages.php:20 +msgid "page template" +msgstr "template de la page" + +#: include/admin/pages.php:18 include/admin/files.php:58 +#: include/admin/pages.php:22 include/admin/files.php:55 +#: include/admin/pages.php:21 +msgid "status" +msgstr "état" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "under construction" +msgstr "en construction" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "disabled" +msgstr "désactivée" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "archived" +msgstr "archivée" + +#: include/diogenes.barrel.inc.php:152 include/diogenes.barrel.inc.php:153 +#: include/diogenes.barrel.inc.php:155 +msgid "This page is currently under construction." +msgstr "Cette page est actuellement en construction." + +#: include/diogenes.barrel.inc.php:156 include/diogenes.barrel.inc.php:157 +#: include/diogenes.barrel.inc.php:159 +msgid "This page is currently unavailable." +msgstr "Cette page n'est pas disponible actuellement." + +#: include/diogenes.admin.inc.php:63 include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:69 +msgid "http://diogenes-doc.polytechnique.org/en-admin/" +msgstr "http://diogenes-doc.polytechnique.org/fr-admin/" + +#: include/diogenes.toplevel.inc.php:188 include/diogenes.toplevel.inc.php:82 +#: include/diogenes.toplevel.inc.php:83 +msgid "http://diogenes-doc.polytechnique.org/en-user/" +msgstr "http://diogenes-doc.polytechnique.org/fr-user/" + +#: include/diogenes.toplevel.inc.php:198 include/diogenes.toplevel.inc.php:92 +#: include/diogenes.toplevel.inc.php:93 +msgid "http://diogenes-doc.polytechnique.org/en-root/" +msgstr "http://diogenes-doc.polytechnique.org/fr-root/" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "Mode" +msgstr "Mode" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "standard" +msgstr "standard" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "expert" +msgstr "expert" + +#: htdocs/toplevel/options.php:82 include/admin/options.php:65 +#: htdocs/toplevel/options.php:45 include/admin/options.php:67 +#: include/admin/options.php:69 +msgid "display options" +msgstr "options d'affichage" + +#: htdocs/toplevel/options.php:87 htdocs/toplevel/options.php:50 +msgid "system options" +msgstr "options système" + +msgid "Initial user setup" +msgstr "Paramétrage d'un utilisateur initial" + +#: htdocs/toplevel/boot.php:11 +msgid "" +"Sorry, this feature is only available using native Diogenes authentication." +msgstr "" +"Désolé, cette fonctionalité est disponible uniquement pour " +"l'authentification native de Diogenes." + +#: htdocs/toplevel/boot.php:19 +msgid "The database is already configured." +msgstr "La base de données est déjà configurée." + +#: htdocs/toplevel/options_expert.php:13 htdocs/toplevel/options_expert.php:75 +#: htdocs/toplevel/options_expert.php:76 +msgid "option" +msgstr "option" + +#: htdocs/toplevel/options_expert.php:14 htdocs/toplevel/options_expert.php:76 +#: htdocs/toplevel/options_expert.php:77 +msgid "value" +msgstr "valeur" + +#: include/admin/menus.php:221 include/admin/menus.php:220 +#: include/admin/menus.php:232 +msgid "Menu" +msgstr "Menu" + +#: include/diogenes.page.inc.php:65 include/diogenes.page.inc.php:66 +msgid "debugging" +msgstr "deboggage" + +#: include/diogenes.page.inc.php:66 include/diogenes.page.inc.php:67 +msgid "call trace" +msgstr "appels de fonctions" + +#: include/diogenes.page.inc.php:67 include/diogenes.page.inc.php:68 +msgid "database trace" +msgstr "appels base de données" + +#: include/diogenes/diogenes.logger-view.inc.php:59 +#: include/diogenes/diogenes.logger-view.inc.php:85 +#: include/diogenes/diogenes.logger-view.inc.php:130 +#: include/diogenes/diogenes.logger-view.inc.php:183 +#: include/diogenes/diogenes.logger-view.inc.php:58 +#: include/diogenes/diogenes.logger-view.inc.php:84 +#: include/diogenes/diogenes.logger-view.inc.php:129 +#: include/diogenes/diogenes.logger-view.inc.php:182 +msgid "all" +msgstr "tous" + +#: include/diogenes/diogenes.logger-view.inc.php:363 +#: include/diogenes/diogenes.logger-view.inc.php:360 +#: include/diogenes/diogenes.logger-view.inc.php:359 +msgid "Please select a year and/or a user." +msgstr "Veuillez sélectionner une année et/ou un utilisateur." + +#: include/diogenes/diogenes.table-editor.inc.php:523 +#: include/diogenes/diogenes.table-editor.inc.php:528 +msgid "previous page" +msgstr "page précédente" + +#: include/diogenes/diogenes.table-editor.inc.php:524 +#: include/diogenes/diogenes.table-editor.inc.php:529 +msgid "next page" +msgstr "page suivante" + +#: htdocs/toplevel/boot.php:7 +msgid "Initial setup" +msgstr "Paramétrage initial" + +#: htdocs/toplevel/boot.php:46 +msgid "The initial setup of the database was performed successfuly." +msgstr "" +"Le paramétrage initial de la base de données a été effectué avec succès." + +#: include/admin/options.php:47 include/admin/options.php:49 +#: include/admin/options.php:51 +msgid "no" +msgstr "non" + +#: include/admin/options.php:47 include/admin/options.php:49 +#: include/admin/options.php:51 +msgid "yes" +msgstr "oui" + +#: include/admin/options.php:68 include/admin/options.php:70 +#: include/admin/options.php:72 +msgid "hide Diogenes menu" +msgstr "cacher le menu Diogenes" + +#: include/admin/prefs.php:28 +msgid "account preferences" +msgstr "préférences" + +#: htdocs/toplevel/plugins.php:19 +msgid "Barrel plugins" +msgstr "Plugins du tonneau" + +#: htdocs/toplevel/plugins.php:21 +msgid "Global plugin settings" +msgstr "Configuration globale des plugins" + +#: htdocs/toplevel/plugins.php:38 +#, php-format +msgid "Rebuilding plugin cache for barrel '%s'" +msgstr "Reconstruction du cache pour le tonneau '%s'" + +#: htdocs/toplevel/plugins.php:47 +msgid "Clean plugins database" +msgstr "Nettoyage de la base de données des plugins" + +#: htdocs/toplevel/plugins.php:48 +msgid "" +"If you are having problems with references to plugins that no longer exist, " +"you can have Diogenes remove such entries from the database." +msgstr "" +"Si vous rencontrez des problèmes de références à des plugins qui n'existent " +"plus, vous pouvez demander à Diogenes de supprimer ces références dans la " +"base de données." + +#: htdocs/toplevel/plugins.php:49 +msgid "Clean" +msgstr "Nettoyer" + +#: htdocs/toplevel/plugins.php:51 +msgid "Enable or disable plugins" +msgstr "Active ou désactiver des plugins" + +#: htdocs/toplevel/plugins.php:54 +msgid "You can select the plugins you want to enable for this barrel." +msgstr "Sélectionnez les plugins que vous voulez activer pour ce tonneau." + +#: htdocs/toplevel/plugins.php:56 +msgid "" +"You can select the plugins you want to enable or disable globally, that is " +"the plugins that can be used in the different barrels. Please note that for " +"a plugin to be accessible from a barrel, you will need to activate that " +"plugin for the barrel. To do this, from the List of sites click on " +"'plugins' next to the barrel of your choice." +msgstr "" +"Sélectionnez les plugins que vous souhaitez activer ou désactiver de façon " +"globale, c'est à dire que vous définissez la liste de plugins qui peuvent " +"être utilisés dans les différents tonneaux. Veuillez noter que pour qu'un " +"plugin soit accessible depuis un tonneau, il vous faudra activer ce plugin " +"pour le tonneau. Pour ce faire, depuis la List des sites, cliquez sur " +"'plugins' à côté du tonneau de votre choix." + +#: htdocs/toplevel/options.php:52 +msgid "Word document import" +msgstr "Import d'un document Word" + +#: include/admin/files.php:39 +msgid "File operations" +msgstr "Opérations sur les fichiers" + +#: include/admin/files.php:43 include/admin/files.php:40 +msgid "Create an empty file" +msgstr "Créer un fichier vide" + +#: include/admin/files.php:44 include/admin/files.php:41 +msgid "Copy or move a file" +msgstr "Copier ou déplacer un fichier" + +#: include/admin/files.php:45 include/admin/files.php:42 +msgid "Create" +msgstr "Créer" + +#: include/admin/files.php:53 include/admin/files.php:50 +msgid "to" +msgstr "vers" + +#: include/admin/files.php:59 +msgid "read" +msgstr "lecture" + +#: include/admin/files.php:60 +msgid "write" +msgstr "écriture" + +#: include/admin/files.php:67 include/admin/files.php:69 +msgid "Creating empty file" +msgstr "Création d'un fichier vide" + +#: include/admin/files.php:69 include/admin/files.php:71 +msgid "The specified file already exists!" +msgstr "Le fichier spécifié existe déjà!" + +#: include/admin/files.php:155 include/admin/pages.php:160 +#: include/admin/plugins.php:22 include/admin/files.php:194 +#: include/admin/pages.php:156 include/Barrel/Page.php:170 +msgid "home" +msgstr "accueil" + +#: include/admin/files.php:182 include/admin/files.php:224 +msgid "Copy" +msgstr "Copier" + +#: include/admin/files.php:182 include/admin/files.php:224 +msgid "Move" +msgstr "Déplacer" + +#: include/admin/pages.php:18 include/admin/pages.php:17 +#: include/Barrel/Page.php:171 +msgid "parent page" +msgstr "page parent" + +#: include/admin/webdav.php:7 include/diogenes.admin.inc.php:79 +#: include/diogenes.admin.inc.php:78 +msgid "WebDAV" +msgstr "WebDAV" + +#: include/admin/webdav.php:9 include/admin/webdav.php:11 +msgid "" +"You can access your barrel's files using WebDAV by pointing your WebDAV " +"client to the following address." +msgstr "" +"Vous pouvez accéder aux fichiers de votre site par WebDAV en vous rendant à " +"l'adresse suivante." + +#: include/admin/plugins.php:22 +msgid "Page plugins " +msgstr "Plugins de la page" + +#: include/admin/plugins.php:26 +msgid "Available plugins" +msgstr "Plugins disponibles" + +#: include/diogenes.page.inc.php:69 include/diogenes.barrel-editor.inc.php:50 +#: include/diogenes.barrel-editor.inc.php:106 include/Barrel/Page.php:126 +#: include/Barrel/Page.php:152 include/diogenes.plugin-editor.inc.php:237 +#: include/Barrel/Page.php:150 include/Barrel/Page.php:178 +#: include/Barrel/Editor.php:52 include/Barrel/Editor.php:113 +#: include/Plugin/Editor.php:266 include/diogenes.page.inc.php:68 +msgid "plugins" +msgstr "plugins" + +#: include/diogenes.toplevel.inc.php:96 include/diogenes.admin.inc.php:76 +#: include/diogenes.toplevel.inc.php:97 include/diogenes.admin.inc.php:75 +msgid "Plugins" +msgstr "Plugins" + +#: include/Barrel/Page.php:70 include/Barrel/Page.php:89 +msgid "Not deleting page, it has child pages!" +msgstr "Impossible de supprimer la page, elle comporte des sous-pages." + +#: include/Barrel/File.php:76 include/Barrel/File.php:94 +msgid "rename" +msgstr "renommer" + +#: include/diogenes.plugin-editor.inc.php:236 include/Plugin/Editor.php:265 +msgid "plugin" +msgstr "plugin" + +#: include/diogenes.plugin-editor.inc.php:239 include/Plugin/Editor.php:268 +msgid "parameters" +msgstr "paramètres" + +#: include/admin/files.php:192 +msgid "Document" +msgstr "Document" + +#: include/admin/index.php:52 +msgid "barrel options" +msgstr "options du tonneau" + +#: include/admin/index.php:57 +msgid "barrel plugins" +msgstr "plugins du tonneau" + +#: include/admin/index.php:68 +msgid "page removed" +msgstr "page supprimée" + +#: include/admin/index.php:80 +msgid "page plugins" +msgstr "plugins de la page" + +#: include/admin/index.php:92 +msgid "file deleted" +msgstr "page supprimée" + +#: include/admin/webdav.php:14 +msgid "" +"In order to access your barrel's files using WebDAV, please ask your " +"Diogenes administrator to enable this feature in the Diogenes configuration " +"file." +msgstr "" +"Pour accéder aux fichiers de votre tonneau grâce à WebDAV, veuillez demander " +"à votre administrateur de Diogenes d'activer cette fonctionalité dans la " +"configuration de Diogenes." + +#: include/Barrel/Page.php:81 +msgid "Deleting page" +msgstr "Suppression du fichier" + +#: include/Barrel/Page.php:176 +msgid "add a page" +msgstr "ajouter une page" + +#: include/Barrel/Page.php:266 +msgid "Creating new page" +msgstr "Création d'une nouvelle page" + +#: include/Barrel/Editor.php:165 +msgid "no barrels available" +msgstr "pas de tonneaux disponibles" + +#: htdocs/toplevel/index.php:13 +msgid "" +"Warning : in order to make use of virtual hosts or WebDAV, you need to set " +"$globals->rooturl to a full URL starting with http:// or https:// in your " +"Diogenes configuration file." +msgstr "" +"Attention : pour utiliser les fonctionalités de serveurs virtuels ou de " +"WebDAV, $globals->rooturl doit être une URL complete commen_ant par http:// " +"ou https:// dans votre fichier de configuration de Diogenes." + +#~ msgid "Warning" +#~ msgstr "Avertissement" + +#~ msgid "" +#~ "in order to make use of virtual hosts or WebDAV, you need to set $globals-" +#~ ">rooturl to a full URL starting with http:// or https:// in your Diogenes " +#~ "configuration file." +#~ msgstr "" +#~ "pour utiliser les fonctionalités de serveurs virtuels ou de WebDAV, " +#~ "$globals->rooturl doit être une URL complete commen_ant par http:// ou " +#~ "https:// dans votre fichier de configuration de Diogenes." diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..9025ea2 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,1775 @@ +# translation of nl.po to English +# translation of nl.po to +# Dutch translations for Diogenes package. +# Copyright (C) 2004 Jeremy Lainé +# This file is distributed under the same license as the Diogenes package. +# Michiel Alkemade , 2004. +# Jeremy Lainé , 2004, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: nl\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-01-07 16:41+0100\n" +"PO-Revision-Date: 2006-01-10 07:50+0100\n" +"Last-Translator: Jeremy Lainé \n" +"Language-Team: English\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: KBabel 1.9.1\n" + +#: htdocs/index.php:9 +#: htdocs/index.php:13 +#: include/admin/bad.php:46 +msgid "Welcome to Diogenes" +msgstr "Welkom bij Diogenes" + +#: htdocs/index.php:11 +#: htdocs/index.php:15 +msgid "Welcome to the Diogenes content management system." +msgstr "Welkom bij het Diogenes Content Management Systeem." + +#: htdocs/index.php:12 +#: htdocs/index.php:16 +msgid "Diogenes was developed by the webmasters of the Polytechnique.org web site." +msgstr "Diogenes is ontwikkeld door de webmasters van Polytechnique.org." + +#: htdocs/index.php:13 +#: htdocs/index.php:17 +msgid "The following barrels are currently available" +msgstr "De volgende barrels zijn momenteel beschikbaar" + +#: htdocs/index.php:14 +#: htdocs/toplevel/admins.php:8 +#: include/diogenes.barrel-editor.inc.php:152 +#: include/Barrel/Editor.php:159 +msgid "site" +msgstr "site" + +#: htdocs/index.php:15 +#: htdocs/toplevel/index.php:12 +#: htdocs/toplevel/logger_actions.php:14 +#: include/admin/options.php:61 +#: include/admin/options.php:63 +#: include/diogenes.barrel-editor.inc.php:153 +#: include/diogenes.plugin-editor.inc.php:238 +#: include/admin/options.php:65 +#: include/Barrel/Editor.php:160 +#: include/Plugin/Editor.php:267 +msgid "description" +msgstr "beschrijving" + +#: htdocs/prefs.php:19 +msgid "Changing password.." +msgstr "Bezig wachtwoord te veranderen.." + +#: htdocs/prefs.php:33 +#: include/admin/prefs.php:20 +msgid "User preferences" +msgstr "Gebruikersvoorkeuren" + +#: htdocs/prefs.php:34 +#: include/admin/prefs.php:21 +msgid "Diogenes preferences" +msgstr "Diogenes voorkeuren" + +#: htdocs/prefs.php:36 +msgid "my information" +msgstr "mijn informatie" + +#: htdocs/prefs.php:37 +#: htdocs/toplevel/accounts.php:13 +#: htdocs/toplevel/boot.php:28 +#: include/diogenes.session.inc.php:138 +msgid "username" +msgstr "gebruikersnaam" + +#: htdocs/prefs.php:38 +msgid "full name" +msgstr "volledige naam" + +#: htdocs/prefs.php:40 +#: include/admin/prefs.php:23 +msgid "language" +msgstr "taal" + +#: htdocs/prefs.php:41 +#: include/admin/prefs.php:24 +msgid "You can select your preferred language by clicking on the appropriate language below." +msgstr "Je kan een voorkeurstaal selecteren door de gewenste taal hieronder aan te klikken." + +#: htdocs/prefs.php:43 +msgid "my password" +msgstr "mijn wachtwoord" + +#: htdocs/prefs.php:44 +msgid "new password" +msgstr "nieuw wachtwoord" + +#: htdocs/prefs.php:45 +msgid "confirmation" +msgstr "bevestiging" + +#: htdocs/prefs.php:47 +#: include/admin/prefs.php:26 +msgid "Change" +msgstr "Veranderen" + +#: include/admin/compose.php:32 +#: include/admin/edit.php:31 +#: include/admin/compose.php:34 +#: include/admin/edit.php:33 +msgid "Commiting changes to file" +msgstr "Veranderingen aan file aan het doorvoeren" + +#: include/admin/edit.php:41 +#: include/admin/edit.php:43 +msgid "File editor" +msgstr "Bestands editor" + +#: include/admin/edit.php:45 +#: include/admin/edit.php:47 +msgid "File source" +msgstr "Bestands locatie" + +#: htdocs/toplevel/index.php:16 +#: htdocs/toplevel/options.php:89 +#: include/admin/menus.php:151 +#: include/admin/options.php:72 +#: include/admin/pages.php:12 +#: include/admin/edit.php:48 +#: include/diogenes.session.inc.php:137 +#: include/diogenes/diogenes.logger-view.inc.php:382 +#: include/diogenes/diogenes.table-editor.inc.php:536 +#: htdocs/toplevel/options.php:53 +#: include/admin/files.php:41 +#: include/admin/menus.php:152 +#: include/admin/options.php:74 +#: include/admin/pages.php:15 +#: include/admin/edit.php:50 +#: include/diogenes/diogenes.logger-view.inc.php:379 +#: include/diogenes/diogenes.table-editor.inc.php:541 +#: include/diogenes.barrel-editor.inc.php:157 +#: include/diogenes.plugin-editor.inc.php:235 +#: include/admin/files.php:38 +#: include/admin/menus.php:164 +#: include/admin/options.php:76 +#: include/admin/pages.php:14 +#: include/Barrel/Editor.php:164 +#: include/Plugin/Editor.php:264 +#: include/diogenes/diogenes.logger-view.inc.php:378 +msgid "Submit" +msgstr "Bevestigen" + +#: include/admin/files.php:27 +#: include/admin/pages.php:152 +#: include/admin/compose.php:58 +#: include/admin/edit.php:50 +#: include/Barrel/Page.php:143 +msgid "pages catalog" +msgstr "pagina catalogus" + +#: include/admin/files.php:28 +#: include/admin/pages.php:154 +#: include/admin/compose.php:59 +#: include/admin/edit.php:51 +#: include/Barrel/Page.php:147 +#: include/admin/index.php:74 +#: include/Barrel/Page.php:174 +msgid "page properties" +msgstr "pagina-eigenschappen" + +#: include/admin/files.php:29 +#: include/admin/pages.php:155 +#: include/admin/compose.php:60 +#: include/admin/edit.php:52 +#: include/diogenes.rcs.inc.php:452 +#: include/diogenes.rcs.inc.php:621 +#: include/Barrel/Page.php:148 +#: include/admin/files.php:146 +#: include/Barrel/Page.php:175 +msgid "view page" +msgstr "pagina tonen" + +#: include/admin/files.php:83 +#: include/admin/files.php:92 +#: include/admin/files.php:101 +#: include/admin/pages.php:156 +#: include/admin/compose.php:61 +#: include/admin/edit.php:53 +#: include/Barrel/Page.php:149 +#: include/Barrel/Page.php:173 +msgid "browse files" +msgstr "bestanden doorbladeren" + +#: include/admin/files.php:35 +#: include/admin/pages.php:167 +#: include/admin/compose.php:64 +#: include/admin/edit.php:56 +#: include/admin/pages.php:132 +#: include/Barrel/File.php:94 +#: include/Barrel/File.php:114 +msgid "raw editor" +msgstr "raw editor" + +#: htdocs/toplevel/options.php:88 +#: include/admin/files.php:36 +#: include/admin/pages.php:168 +#: include/admin/compose.php:65 +#: include/admin/edit.php:57 +#: include/diogenes.barrel.inc.php:316 +#: htdocs/toplevel/options.php:51 +#: include/admin/pages.php:133 +#: include/diogenes.barrel.inc.php:347 +#: include/Barrel/File.php:95 +#: include/Barrel/File.php:115 +#: include/diogenes.barrel.inc.php:343 +msgid "HTML editor" +msgstr "HTML editor" + +#: include/admin/files.php:85 +#: include/admin/files.php:94 +#: include/admin/pages.php:163 +#: include/admin/pages.php:170 +#: include/admin/compose.php:66 +#: include/admin/edit.php:58 +#: include/admin/pages.php:129 +#: include/admin/pages.php:134 +#: include/Barrel/File.php:97 +#: include/Barrel/File.php:117 +msgid "file revisions" +msgstr "bestandsrevisies" + +msgid "Ekit" +msgstr "Ekit" + +#: include/admin/menus.php:36 +#: include/admin/menus.php:37 +msgid "The site's menus" +msgstr "Menu opbouw van de site" + +#: include/admin/menus.php:44 +#: include/admin/menus.php:45 +msgid "The selected menu has child items, please remove them first." +msgstr "Het geselecteerde menu item heeft onderliggende items, verwijder deze eerst." + +#: include/admin/menus.php:144 +#: include/admin/menus.php:145 +#: include/admin/menus.php:157 +msgid "menu entry properties" +msgstr "eigenschappen van menu ingang" + +#: include/admin/menus.php:147 +#: include/admin/menus.php:148 +#: include/admin/menus.php:160 +msgid "none" +msgstr "geen" + +#: include/admin/menus.php:148 +#: include/admin/menus.php:149 +#: include/admin/menus.php:161 +msgid "internal link" +msgstr "intern koppeling" + +#: include/admin/menus.php:149 +#: include/admin/menus.php:150 +#: include/admin/menus.php:162 +msgid "external link" +msgstr "extern koppeling" + +#: include/admin/menus.php:173 +#: include/diogenes.plugin-editor.inc.php:240 +#: include/admin/menus.php:185 +#: include/Plugin/Editor.php:269 +msgid "move up" +msgstr "naar boven" + +#: include/admin/menus.php:176 +#: include/diogenes.plugin-editor.inc.php:241 +#: include/admin/menus.php:188 +#: include/Plugin/Editor.php:270 +msgid "move down" +msgstr "naar beneden" + +#: htdocs/toplevel/index.php:85 +#: include/admin/menus.php:178 +#: include/diogenes.rcs.inc.php:417 +#: include/diogenes/diogenes.table-editor.inc.php:529 +#: include/diogenes/diogenes.table-editor.inc.php:534 +#: include/diogenes.barrel-editor.inc.php:43 +#: include/Barrel/Page.php:119 +#: include/Barrel/File.php:74 +#: include/admin/menus.php:190 +#: include/Barrel/File.php:92 +#: include/Barrel/Page.php:143 +#: include/Barrel/Editor.php:45 +msgid "edit" +msgstr "bewerken" + +#: htdocs/toplevel/index.php:87 +#: include/admin/menus.php:179 +#: include/admin/pages.php:202 +#: include/diogenes.rcs.inc.php:419 +#: include/diogenes/diogenes.table-editor.inc.php:528 +#: include/diogenes/diogenes.table-editor.inc.php:533 +#: include/diogenes.barrel-editor.inc.php:52 +#: include/Barrel/Page.php:129 +#: include/Barrel/File.php:77 +#: include/admin/menus.php:191 +#: include/Barrel/File.php:95 +#: include/Barrel/Page.php:153 +#: include/Barrel/Editor.php:54 +msgid "delete" +msgstr "verwijderen" + +#: include/admin/menus.php:217 +#: include/admin/menus.php:216 +#: include/admin/menus.php:228 +msgid "External links are denoted with the [ext] prefix." +msgstr "Externe koppelingen beginnen met het voorvoegsel [ext]." + +#: include/admin/menus.php:222 +#: include/admin/menus.php:221 +#: include/admin/menus.php:233 +msgid "Add new entry" +msgstr "Nieuwe ingang toevoegen" + +#: include/admin/files.php:63 +#: include/admin/files.php:86 +#: include/admin/files.php:88 +msgid "Error during file transfer!" +msgstr "Fout bij het verzenden van het bestand!" + +#: include/admin/files.php:69 +#: include/admin/files.php:92 +#: include/admin/files.php:94 +msgid "Deleting file" +msgstr "Bezig met verwijderen van bestand" + +#: include/admin/files.php:81 +#: include/admin/files.php:112 +#: include/admin/files.php:120 +msgid "Revision differences" +msgstr "Verschillen tussen revisies" + +#: include/admin/files.php:90 +#: include/admin/files.php:120 +#: include/admin/files.php:128 +msgid "File revisions" +msgstr "Bestandsrevisies" + +#: include/admin/files.php:103 +#: include/admin/files.php:155 +#: include/admin/files.php:194 +msgid "File manager" +msgstr "Bestandmanager" + +#: include/admin/files.php:40 +#: include/admin/files.php:38 +msgid "Files in current directory" +msgstr "Bestanden in huidige map" + +#: include/admin/files.php:41 +#: include/admin/files.php:40 +#: include/admin/files.php:37 +msgid "Import file" +msgstr "Bestand importeren" + +#: include/admin/files.php:42 +#: include/admin/pages.php:210 +#: include/admin/pages.php:191 +#: include/admin/files.php:39 +#: include/admin/pages.php:163 +msgid "Send" +msgstr "Verzenden" + +#: include/admin/files.php:43 +msgid "File to upload" +msgstr "Te verzenden bestand" + +#: include/admin/index.php:20 +#: include/admin/index.php:45 +#: include/admin/index.php:47 +msgid "site created" +msgstr "site angemaakt" + +#: include/admin/index.php:23 +#: include/admin/index.php:50 +#: include/admin/index.php:63 +msgid "page created" +msgstr "pagina angemaakt" + +#: include/admin/index.php:26 +#: include/admin/index.php:54 +msgid "page deleted" +msgstr "pagina verwijdert" + +#: include/admin/index.php:31 +#: include/admin/index.php:59 +#: include/admin/index.php:86 +msgid "file updated" +msgstr "bestand bijgewerkt" + +#: include/admin/index.php:34 +#: include/admin/index.php:64 +msgid "file removed" +msgstr "bestand verwijderd" + +#: include/admin/index.php:43 +#: include/admin/index.php:77 +#: include/admin/index.php:105 +msgid "Welcome to the Diogenes backoffice" +msgstr "Welkom bij het Diogenes backoffice" + +#: include/admin/files.php:47 +#: include/admin/index.php:44 +#: include/diogenes/diogenes.logger-view.inc.php:372 +#: include/admin/files.php:49 +#: include/admin/index.php:78 +#: include/diogenes/diogenes.logger-view.inc.php:369 +#: include/admin/files.php:46 +#: include/admin/index.php:106 +#: include/diogenes/diogenes.logger-view.inc.php:368 +msgid "date" +msgstr "datum" + +#: include/admin/index.php:45 +#: include/admin/users.php:28 +#: include/diogenes/diogenes.logger-view.inc.php:369 +#: include/admin/index.php:79 +#: include/diogenes/diogenes.logger-view.inc.php:366 +#: include/admin/index.php:107 +#: include/diogenes/diogenes.logger-view.inc.php:365 +msgid "user" +msgstr "gebruiker" + +#: include/admin/index.php:46 +#: include/admin/index.php:80 +#: include/admin/index.php:108 +msgid "event" +msgstr "gebeurtenis" + +#: include/admin/pages.php:11 +#: include/admin/pages.php:14 +#: include/admin/pages.php:158 +msgid "Page manager" +msgstr "Paginabeheer" + +#: include/admin/pages.php:13 +#: include/admin/pages.php:16 +#: include/admin/pages.php:15 +msgid "Reset" +msgstr "Terugzetten" + +#: include/admin/pages.php:14 +#: include/diogenes.barrel.inc.php:312 +#: include/admin/pages.php:17 +#: include/diogenes.barrel.inc.php:343 +#: include/admin/pages.php:16 +#: include/diogenes.barrel.inc.php:339 +msgid "Page properties" +msgstr "Pagina-eigenschappen" + +#: include/admin/pages.php:15 +#: include/admin/files.php:55 +#: include/admin/pages.php:19 +#: include/admin/files.php:52 +#: include/admin/pages.php:18 +msgid "location" +msgstr "locatie" + +#: htdocs/toplevel/index.php:10 +#: htdocs/toplevel/logger_actions.php:13 +#: include/admin/options.php:60 +#: include/admin/pages.php:16 +#: include/admin/files.php:56 +#: include/admin/options.php:62 +#: include/admin/pages.php:20 +#: include/admin/files.php:53 +#: include/admin/options.php:64 +#: include/admin/pages.php:19 +msgid "title" +msgstr "titel" + +msgid "display" +msgstr "tonen" + +#: include/admin/files.php:56 +#: include/admin/pages.php:22 +msgid "access" +msgstr "toegang" + +#: include/admin/pages.php:22 +#: include/admin/pages.php:26 +msgid "Add a page" +msgstr "Pagina toevoegen" + +#: include/admin/pages.php:43 +#: include/admin/pages.php:47 +#: include/admin/pages.php:50 +msgid "Document name does not end in .doc" +msgstr "Dit document heeft geen .doc exensie" + +#: include/admin/pages.php:46 +#: include/admin/pages.php:50 +#: include/admin/pages.php:53 +msgid "Checking in Word file" +msgstr "Controleren in Word document" + +#: include/admin/pages.php:51 +#: include/admin/pages.php:55 +#: include/admin/pages.php:58 +msgid "Importing Word file" +msgstr "Bezig Word bestand te importeren" + +#: include/admin/pages.php:57 +#: include/admin/pages.php:61 +#: include/admin/pages.php:64 +msgid "Importing HTML file" +msgstr "Bezig HTML file te importeren" + +#: include/admin/pages.php:62 +#: include/admin/pages.php:66 +#: include/admin/pages.php:69 +msgid "Raw file import" +msgstr "Raw file importeren" + +#: include/admin/pages.php:184 +#: include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "visible" +msgstr "zichtbaar" + +msgid "invisible" +msgstr "onzichtbaar" + +#: htdocs/toplevel/index.php:84 +#: include/admin/pages.php:196 +#: include/diogenes.rcs.inc.php:416 +#: include/diogenes.rcs.inc.php:450 +#: include/diogenes.rcs.inc.php:619 +#: include/Barrel/Page.php:118 +#: include/Barrel/File.php:73 +#: include/admin/files.php:144 +#: include/Barrel/File.php:91 +#: include/Barrel/Page.php:142 +msgid "view" +msgstr "tonen" + +#: include/admin/pages.php:197 +#: include/Barrel/Page.php:120 +#: include/Barrel/Page.php:144 +msgid "properties" +msgstr "eigenschappen" + +#: include/admin/pages.php:198 +msgid "files" +msgstr "bestanden" + +#: include/admin/pages.php:199 +#: include/diogenes.rcs.inc.php:418 +#: include/Barrel/Page.php:121 +#: include/Barrel/File.php:75 +#: include/Barrel/File.php:93 +#: include/Barrel/Page.php:145 +msgid "revisions" +msgstr "revisies" + +#: include/admin/pages.php:211 +#: include/admin/pages.php:195 +#: include/admin/pages.php:172 +msgid "Import a Word document" +msgstr "Importeer een Word document" + +#: include/admin/pages.php:214 +#: include/admin/pages.php:198 +#: include/admin/pages.php:176 +msgid "This page's master document is currently a Word document." +msgstr "Het master document van deze pagina is op een Word document." + +#: include/admin/pages.php:215 +#: include/admin/pages.php:199 +#: include/admin/pages.php:177 +msgid "You can upload a new version of the Word document below." +msgstr "Upload een nieuwe versie van het Word document hieronder." + +#: include/admin/pages.php:216 +#: include/admin/pages.php:200 +#: include/admin/pages.php:178 +msgid "You can get the current version of the file here" +msgstr "Haal hier de huidige versie van het bestand op" + +#: include/admin/pages.php:219 +#: include/admin/pages.php:203 +#: include/admin/pages.php:181 +msgid "If you wish, you can set this page's content from a Word document." +msgstr "Indien gewenst kan de content uit een Word document worden overgenomen." + +#: include/admin/pages.php:220 +#: include/admin/pages.php:204 +#: include/admin/pages.php:182 +msgid "To do so, simply upload the Word document below." +msgstr "Om dit te doen, upload het Word document hier beneden." + +#: include/admin/pages.php:222 +#: include/admin/pages.php:208 +#: include/admin/pages.php:160 +msgid "Import HTML" +msgstr "Importeer HTML" + +#: include/admin/pages.php:223 +#: include/admin/pages.php:209 +#: include/admin/pages.php:161 +msgid "You can replace the current page's contents by uploading an HTML file below." +msgstr "Vervang de huidige content in de pagina door onderstaand een HTML bestand te uploaden." + +#: include/admin/pages.php:224 +#: include/admin/pages.php:210 +#: include/admin/pages.php:162 +msgid "If the file name ends with .htm or .html, anything outside the <body></body> pair will be stripped." +msgstr "Indien de bestandsnaam eindigt op .htm of .html, alles buiten de <body></body> zal worden verwijdert." + +#: htdocs/toplevel/admins.php:20 +#: include/admin/users.php:15 +msgid "Could not find requested user" +msgstr "Registreerde gebruiker is niet te vinden" + +#: include/admin/users.php:24 +msgid "Users administration" +msgstr "Gebruikersbeheer" + +#: include/admin/users.php:25 +msgid "Registered users" +msgstr "Registreerde gebruikers" + +#: include/admin/users.php:26 +#: include/diogenes.toplevel.inc.php:200 +#: include/diogenes.toplevel.inc.php:94 +#: include/diogenes.toplevel.inc.php:95 +msgid "Administrators" +msgstr "Administratoren" + +#: include/admin/users.php:29 +#: include/diogenes/diogenes.logger-view.inc.php:373 +#: include/diogenes/diogenes.table-editor.inc.php:526 +#: include/diogenes/diogenes.logger-view.inc.php:370 +#: include/diogenes/diogenes.table-editor.inc.php:531 +#: include/diogenes/diogenes.logger-view.inc.php:369 +msgid "action" +msgstr "actie" + +#: htdocs/toplevel/admins.php:45 +#: include/admin/users.php:35 +msgid "remove" +msgstr "verwijderen" + +#: include/diogenes.session.inc.php:134 +msgid "Diogenes login" +msgstr "Diogenes login" + +#: include/diogenes.session.inc.php:135 +msgid "Connexion" +msgstr "Verbinding" + +#: htdocs/toplevel/accounts.php:16 +#: htdocs/toplevel/boot.php:31 +#: include/diogenes.session.inc.php:136 +msgid "password" +msgstr "wachtwoord" + +#: include/diogenes.toplevel.inc.php:52 +#: include/diogenes.barrel.inc.php:104 +#: include/diogenes.barrel.inc.php:105 +#: include/diogenes.toplevel.inc.php:53 +#: include/diogenes.barrel.inc.php:107 +msgid "You are not authorized to view this page!" +msgstr "Je bent niet geautoriseerd om deze pagina te bekijken!" + +#: include/diogenes.toplevel.inc.php:38 +#: include/diogenes.toplevel.inc.php:187 +#: include/diogenes.admin.inc.php:62 +#: include/diogenes.barrel.inc.php:301 +#: include/diogenes.toplevel.inc.php:81 +#: include/diogenes.barrel.inc.php:332 +#: include/diogenes.admin.inc.php:69 +#: include/diogenes.toplevel.inc.php:39 +#: include/diogenes.toplevel.inc.php:82 +#: include/diogenes.admin.inc.php:68 +#: include/diogenes.barrel.inc.php:328 +msgid "Home" +msgstr "Home" + +#: include/diogenes.toplevel.inc.php:192 +#: include/diogenes.barrel.inc.php:303 +#: include/diogenes.toplevel.inc.php:86 +#: include/diogenes.barrel.inc.php:334 +#: include/diogenes.toplevel.inc.php:87 +#: include/diogenes.barrel.inc.php:330 +msgid "Logout" +msgstr "Afmelden" + +#: include/diogenes.toplevel.inc.php:194 +#: include/diogenes.barrel.inc.php:306 +#: include/diogenes.toplevel.inc.php:88 +#: include/diogenes.barrel.inc.php:337 +#: include/diogenes.toplevel.inc.php:89 +#: include/diogenes.barrel.inc.php:333 +msgid "Login" +msgstr "Aanmelden" + +#: include/diogenes.admin.inc.php:37 +#: include/diogenes.admin.inc.php:64 +#: include/diogenes.barrel.inc.php:310 +#: include/diogenes.barrel.inc.php:341 +#: include/diogenes.admin.inc.php:71 +#: include/diogenes.admin.inc.php:70 +#: include/diogenes.barrel.inc.php:337 +msgid "Administration" +msgstr "Beheer" + +#: include/diogenes.rcs.inc.php:455 +#: include/diogenes.rcs.inc.php:624 +#: include/admin/files.php:149 +msgid "diff to" +msgstr "diff to" + +#: include/diogenes.rcs.inc.php:459 +#: include/diogenes.rcs.inc.php:628 +#: include/admin/files.php:153 +msgid "restore" +msgstr "herstellen" + +#: include/diogenes.admin.inc.php:63 +#: include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:69 +msgid "Admin manual" +msgstr "Admin handleiding" + +msgid "Settings" +msgstr "Instellingen" + +#: include/diogenes.toplevel.inc.php:202 +#: include/diogenes.admin.inc.php:67 +#: include/diogenes.toplevel.inc.php:97 +#: include/diogenes.admin.inc.php:78 +#: include/diogenes.toplevel.inc.php:98 +#: include/diogenes.admin.inc.php:77 +msgid "Users" +msgstr "Gebruikers" + +#: include/diogenes.admin.inc.php:68 +#: include/diogenes.admin.inc.php:80 +#: include/diogenes.admin.inc.php:79 +msgid "Content" +msgstr "Inhoud" + +#: include/diogenes.admin.inc.php:69 +#: include/diogenes.admin.inc.php:81 +#: include/diogenes.admin.inc.php:80 +msgid "Pages catalog" +msgstr "Paginacatalogus" + +#: include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:82 +#: include/diogenes.admin.inc.php:81 +msgid "Edit style sheet" +msgstr "Stijlblad bewerken" + +#: include/diogenes.admin.inc.php:71 +#: include/diogenes.admin.inc.php:83 +#: include/diogenes.admin.inc.php:82 +msgid "Edit menu" +msgstr "Menu bewerken" + +#: include/diogenes.toplevel.inc.php:38 +#: include/diogenes.toplevel.inc.php:39 +msgid "Toplevel administration" +msgstr "Topniveau beheer" + +#: include/diogenes.page.inc.php:59 +msgid "Powered by Diogenes" +msgstr "Powered by Diogenes" + +#: include/diogenes.page.inc.php:213 +#: include/diogenes.page.inc.php:216 +#: include/diogenes.page.inc.php:212 +msgid "The requested document was not found." +msgstr "Het gevraagde document werd niet gevonden." + +#: include/diogenes.toplevel.inc.php:188 +#: include/diogenes.toplevel.inc.php:82 +#: include/diogenes.toplevel.inc.php:83 +msgid "User manual" +msgstr "Handleiding" + +#: include/diogenes.toplevel.inc.php:191 +#: include/diogenes.barrel.inc.php:304 +#: include/diogenes.toplevel.inc.php:85 +#: include/diogenes.barrel.inc.php:335 +#: include/diogenes.toplevel.inc.php:86 +#: include/diogenes.barrel.inc.php:331 +msgid "Preferences" +msgstr "Voorkeuren" + +#: include/diogenes.toplevel.inc.php:197 +#: include/diogenes.toplevel.inc.php:91 +#: include/diogenes.toplevel.inc.php:92 +msgid "Sites" +msgstr "Websites" + +#: include/diogenes.toplevel.inc.php:198 +#: include/diogenes.toplevel.inc.php:92 +#: include/diogenes.toplevel.inc.php:93 +msgid "Root manual" +msgstr "Root handleiding" + +#: htdocs/toplevel/index.php:8 +#: include/diogenes.toplevel.inc.php:199 +#: htdocs/toplevel/index.php:11 +#: include/diogenes.toplevel.inc.php:93 +#: htdocs/toplevel/index.php:16 +#: include/diogenes.toplevel.inc.php:94 +msgid "List of sites" +msgstr "Lijst met websites" + +#: htdocs/toplevel/admins.php:7 +msgid "Site administrators" +msgstr "Website administratoren" + +#: htdocs/toplevel/accounts.php:7 +#: include/diogenes.toplevel.inc.php:203 +#: include/diogenes.toplevel.inc.php:98 +#: include/diogenes.toplevel.inc.php:99 +msgid "User accounts" +msgstr "Accounts" + +#: include/diogenes.toplevel.inc.php:204 +#: include/diogenes.toplevel.inc.php:99 +#: include/diogenes.toplevel.inc.php:100 +msgid "Browse user log" +msgstr "Log bladeren" + +#: htdocs/toplevel/logger_actions.php:8 +#: include/diogenes.toplevel.inc.php:205 +#: include/diogenes.toplevel.inc.php:100 +#: include/diogenes.toplevel.inc.php:101 +msgid "Logger actions" +msgstr "Logger acties" + +#: include/diogenes.page.inc.php:198 +#: include/diogenes.page.inc.php:201 +#: include/diogenes.page.inc.php:197 +msgid "Diogenes error" +msgstr "Diogenes fout" + +#: include/diogenes.page.inc.php:199 +#: include/diogenes.page.inc.php:202 +#: include/diogenes.page.inc.php:198 +msgid "Error" +msgstr "Fout" + +#: include/diogenes/diogenes.logger-view.inc.php:338 +#: include/diogenes/diogenes.logger-view.inc.php:337 +#: include/diogenes/diogenes.logger-view.inc.php:336 +msgid "view session" +msgstr "bekijk sessie" + +#: include/diogenes/diogenes.logger-view.inc.php:339 +#: include/diogenes/diogenes.logger-view.inc.php:338 +#: include/diogenes/diogenes.logger-view.inc.php:337 +msgid "user's log" +msgstr "gebruikers log" + +#: htdocs/toplevel/logger.php:7 +msgid "User activity log" +msgstr "Gebruikers activiteiten log" + +#: htdocs/toplevel/accounts.php:17 +#: htdocs/toplevel/boot.php:32 +msgid "permissions" +msgstr "toestemmingen" + +#: htdocs/toplevel/accounts.php:19 +#: htdocs/toplevel/admins.php:46 +msgid "view log" +msgstr "log tonen" + +#: htdocs/toplevel/admins.php:9 +msgid "administrator" +msgstr "administrator" + +#: htdocs/toplevel/admins.php:10 +#: htdocs/toplevel/index.php:11 +#: include/admin/files.php:50 +#: include/admin/menus.php:220 +#: include/admin/pages.php:21 +#: include/diogenes/diogenes.logger-view.inc.php:378 +#: include/admin/files.php:52 +#: include/admin/menus.php:219 +#: include/admin/pages.php:25 +#: include/diogenes/diogenes.logger-view.inc.php:375 +#: include/admin/files.php:49 +#: include/admin/menus.php:231 +#: include/diogenes/diogenes.logger-view.inc.php:374 +msgid "actions" +msgstr "acties" + +#: htdocs/toplevel/admins.php:43 +msgid "site users" +msgstr "site gebruikers" + +#: htdocs/toplevel/admins.php:44 +msgid "demote to user" +msgstr "gewoon user" + +#: htdocs/toplevel/index.php:9 +#: include/diogenes.barrel-editor.inc.php:151 +#: include/Barrel/Editor.php:158 +msgid "alias" +msgstr "alias" + +#: htdocs/toplevel/index.php:13 +#: include/admin/options.php:62 +#: include/admin/options.php:64 +#: include/diogenes.barrel-editor.inc.php:154 +#: include/admin/options.php:66 +#: include/Barrel/Editor.php:161 +msgid "keywords" +msgstr "zoektermen" + +#: htdocs/toplevel/index.php:14 +#: include/diogenes.barrel-editor.inc.php:155 +#: include/Barrel/Editor.php:162 +msgid "Create a new site" +msgstr "Nieuw website toevoegen" + +#: htdocs/toplevel/index.php:17 +#: include/diogenes.barrel-editor.inc.php:158 +#: include/Barrel/Editor.php:166 +msgid "vhost (see note)" +msgstr "vhost (zie documentatie)" + +#: htdocs/toplevel/index.php:19 +#: include/diogenes.barrel-editor.inc.php:160 +#: include/Barrel/Editor.php:168 +msgid "flags" +msgstr "flags" + +#: htdocs/toplevel/index.php:86 +#: include/diogenes.barrel-editor.inc.php:45 +#: include/Barrel/Editor.php:47 +msgid "admin" +msgstr "admin" + +#: include/diogenes.admin.inc.php:65 +#: include/diogenes.admin.inc.php:72 +#: include/diogenes.admin.inc.php:71 +msgid "Activity" +msgstr "Activiteit" + +#: htdocs/toplevel/accounts.php:14 +#: htdocs/toplevel/boot.php:29 +msgid "first name" +msgstr "voornaam" + +#: htdocs/toplevel/accounts.php:15 +#: htdocs/toplevel/boot.php:30 +msgid "last name" +msgstr "achternaam" + +#: include/admin/compose.php:16 +#: include/admin/edit.php:15 +#: include/diogenes.admin.inc.php:44 +msgid "Directory not found" +msgstr "Map niet gevonden" + +#: include/admin/pages.php:19 +#: include/admin/pages.php:23 +#: include/admin/files.php:57 +msgid "read access" +msgstr "leestoegang" + +#: include/admin/pages.php:20 +#: include/admin/pages.php:24 +#: include/admin/files.php:58 +msgid "write access" +msgstr "schrijftoegang" + +#: include/admin/pages.php:83 +msgid "world-writable pages are not allowed with PHP execution enabled!" +msgstr "world-writable paginas zijn niet toegestaan met PHP executie toestemming in werken!" + +#: include/diogenes.barrel.inc.php:314 +#: include/diogenes.barrel.inc.php:345 +#: include/diogenes.barrel.inc.php:341 +msgid "Edit this page" +msgstr "Pagina bewerken" + +#: include/diogenes.barrel.inc.php:315 +#: include/diogenes.barrel.inc.php:346 +#: include/diogenes.barrel.inc.php:342 +msgid "Raw editor" +msgstr "Raw editor" + +#: htdocs/toplevel/options.php:90 +#: htdocs/toplevel/options_expert.php:56 +msgid "Convert" +msgstr "Converteren" + +#: htdocs/toplevel/options.php:95 +#: htdocs/toplevel/options_expert.php:61 +msgid "You are currently using RCS as the version control system for your barrels." +msgstr "RCS wordt op dit moment gebruikt als versie controle systeem voor je barrels." + +#: htdocs/toplevel/options.php:96 +#: htdocs/toplevel/options_expert.php:62 +msgid "You can switch to a full CVS repository by clicking here." +msgstr "Je kan naar het CVS repository linken door hier te klikken." + +#: htdocs/toplevel/options.php:100 +#: htdocs/toplevel/options_expert.php:66 +msgid "You are currently using CVS as the version control system for your barrels." +msgstr "CVS wordt op dit moment gebruikt als versie controle systeem voor je barrels." + +#: htdocs/toplevel/options.php:101 +#: htdocs/toplevel/options_expert.php:67 +msgid "You can switch back to RCS by clicking here." +msgstr "Je kan terug gaan naar RCS door hier te klikken." + +#: include/admin/files.php:44 +#: include/admin/files.php:46 +#: include/admin/files.php:43 +msgid "file" +msgstr "bestand" + +#: include/admin/files.php:46 +#: include/admin/files.php:48 +#: include/admin/files.php:45 +msgid "version" +msgstr "versie" + +#: include/admin/files.php:48 +#: include/admin/files.php:50 +#: include/admin/files.php:47 +msgid "author" +msgstr "auteur" + +#: include/admin/files.php:49 +#: include/admin/files.php:51 +#: include/admin/files.php:48 +msgid "size" +msgstr "grootte" + +#: include/admin/pages.php:91 +#: include/Barrel/Page.php:205 +#: include/Barrel/Page.php:248 +msgid "the page location cannot contain spaces or special characters" +msgstr "de pagina lokatie kan geen spaties en speciale karakters als invoer gebruiken" + +#: include/admin/pages.php:95 +#: include/Barrel/Page.php:212 +#: include/Barrel/Page.php:255 +msgid "this location cannot be used, it is reserved by Diogenes" +msgstr "deze locatie kan niet worden gebruikt omdat het is gereserveerd door Diogenes" + +#: include/admin/files.php:45 +#: include/admin/files.php:47 +#: include/admin/files.php:44 +msgid "log" +msgstr "log" + +#: include/admin/menus.php:145 +#: include/admin/menus.php:146 +#: include/admin/menus.php:158 +msgid "entry title" +msgstr "ingangtitel" + +#: include/admin/menus.php:146 +#: include/admin/menus.php:147 +#: include/admin/menus.php:159 +msgid "type of link" +msgstr "type koppeling" + +#: include/admin/menus.php:218 +#: include/admin/menus.php:217 +#: include/admin/menus.php:229 +msgid "menu name" +msgstr "menunaam" + +#: include/admin/menus.php:219 +#: include/admin/menus.php:218 +#: include/admin/menus.php:230 +msgid "link" +msgstr "koppeling" + +#: htdocs/toplevel/options.php:80 +#: htdocs/toplevel/options_expert.php:8 +#: include/diogenes.toplevel.inc.php:201 +#: htdocs/toplevel/options.php:43 +#: include/diogenes.toplevel.inc.php:95 +#: include/diogenes.toplevel.inc.php:96 +msgid "Global options" +msgstr "Algemene opties" + +msgid "menu options" +msgstr "menuopties" + +#: htdocs/toplevel/options.php:83 +#: include/admin/options.php:69 +#: htdocs/toplevel/options.php:46 +#: include/admin/options.php:71 +#: include/admin/options.php:73 +msgid "menu style" +msgstr "menustijl" + +#: htdocs/toplevel/options.php:84 +#: include/admin/options.php:70 +#: htdocs/toplevel/options.php:47 +#: include/admin/options.php:72 +#: include/admin/options.php:74 +msgid "menu theme" +msgstr "menuthema" + +#: htdocs/toplevel/options.php:91 +#: htdocs/toplevel/options_expert.php:57 +msgid "version control system" +msgstr "versie controle systeem" + +#: include/admin/options.php:6 +#: include/admin/options.php:7 +msgid "Site options" +msgstr "Website opties" + +#: include/admin/options.php:55 +#: include/admin/options.php:57 +#: include/admin/options.php:59 +msgid "fully expanded" +msgstr "volledige uitgeklapt" + +#: include/admin/options.php:71 +#: include/admin/options.php:73 +#: include/admin/options.php:75 +msgid "minimum menu levels to expand" +msgstr "minimum aantal menu niveaus om uit te klappen" + +#: include/diogenes.admin.inc.php:66 +#: include/diogenes.admin.inc.php:73 +#: include/diogenes.admin.inc.php:72 +msgid "Options" +msgstr "Opties" + +#: include/admin/options.php:59 +#: include/admin/options.php:61 +#: include/admin/options.php:63 +msgid "general options" +msgstr "algemene opties" + +#: include/diogenes/diogenes.logger-view.inc.php:368 +#: include/diogenes/diogenes.logger-view.inc.php:365 +#: include/diogenes/diogenes.logger-view.inc.php:364 +msgid "session properties" +msgstr "sessie-eigenschappen" + +#: include/diogenes/diogenes.logger-view.inc.php:370 +#: include/diogenes/diogenes.logger-view.inc.php:367 +#: include/diogenes/diogenes.logger-view.inc.php:366 +msgid "host" +msgstr "server" + +#: include/diogenes/diogenes.logger-view.inc.php:371 +#: include/diogenes/diogenes.logger-view.inc.php:368 +#: include/diogenes/diogenes.logger-view.inc.php:367 +msgid "browser" +msgstr "browser" + +#: include/diogenes/diogenes.logger-view.inc.php:374 +#: include/diogenes/diogenes.logger-view.inc.php:371 +#: include/diogenes/diogenes.logger-view.inc.php:370 +msgid "data" +msgstr "data" + +#: include/diogenes/diogenes.logger-view.inc.php:375 +#: include/diogenes/diogenes.logger-view.inc.php:372 +#: include/diogenes/diogenes.logger-view.inc.php:371 +msgid "filter by" +msgstr "filteren op" + +#: include/diogenes/diogenes.logger-view.inc.php:376 +#: include/diogenes/diogenes.logger-view.inc.php:373 +#: include/diogenes/diogenes.logger-view.inc.php:372 +msgid "start" +msgstr "begin" + +#: include/diogenes/diogenes.logger-view.inc.php:377 +#: include/diogenes/diogenes.logger-view.inc.php:374 +#: include/diogenes/diogenes.logger-view.inc.php:373 +msgid "summary" +msgstr "samenvatting" + +#: include/diogenes/diogenes.logger-view.inc.php:379 +#: include/diogenes/diogenes.logger-view.inc.php:376 +#: include/diogenes/diogenes.logger-view.inc.php:375 +msgid "year" +msgstr "jaar" + +#: include/diogenes/diogenes.logger-view.inc.php:380 +#: include/diogenes/diogenes.logger-view.inc.php:377 +#: include/diogenes/diogenes.logger-view.inc.php:376 +msgid "month" +msgstr "maand" + +#: include/diogenes/diogenes.logger-view.inc.php:381 +#: include/diogenes/diogenes.logger-view.inc.php:378 +#: include/diogenes/diogenes.logger-view.inc.php:377 +msgid "day" +msgstr "dag" + +#: include/diogenes/diogenes.table-editor.inc.php:525 +#: include/diogenes/diogenes.table-editor.inc.php:530 +msgid "id" +msgstr "id" + +#: include/diogenes/diogenes.table-editor.inc.php:527 +#: include/diogenes/diogenes.table-editor.inc.php:532 +msgid "create" +msgstr "toevoegen" + +#: include/diogenes/diogenes.table-editor.inc.php:530 +#: include/diogenes/diogenes.table-editor.inc.php:535 +msgid "new entry" +msgstr "nieuwe item" + +#: include/diogenes/diogenes.table-editor.inc.php:531 +#: include/diogenes/diogenes.table-editor.inc.php:536 +msgid "existing entry" +msgstr "bestaande item" + +#: include/diogenes/diogenes.table-editor.inc.php:532 +#: include/diogenes/diogenes.table-editor.inc.php:537 +msgid "(blank = no change)" +msgstr "(leeg = geen veranderingen)" + +#: include/diogenes/diogenes.table-editor.inc.php:533 +#: include/diogenes/diogenes.table-editor.inc.php:538 +msgid "back" +msgstr "terug" + +#: include/diogenes/diogenes.table-editor.inc.php:535 +#: include/diogenes/diogenes.table-editor.inc.php:540 +msgid "You are about to delete this entry. Do you want to proceed?" +msgstr "Je gaat het item verwijderen, wil je doorgaan?" + +#: include/diogenes.session.inc.php:62 +#: include/diogenes.session.inc.php:71 +msgid "Authentication error!" +msgstr "Authenticatie fout!" + +#: include/admin/files.php:84 +#: include/admin/files.php:93 +#: include/admin/files.php:102 +#: include/admin/pages.php:158 +#: include/admin/compose.php:57 +#: include/admin/edit.php:49 +#: include/admin/files.php:114 +#: include/admin/files.php:122 +#: include/admin/files.php:154 +#: include/admin/pages.php:124 +#: include/admin/compose.php:61 +#: include/admin/edit.php:53 +#: include/admin/plugins.php:23 +#: include/admin/files.php:61 +#: include/admin/pages.php:122 +msgid "Page" +msgstr "Pagina" + +#: include/admin/files.php:86 +#: include/admin/files.php:95 +#: include/admin/pages.php:172 +#: include/admin/compose.php:63 +#: include/admin/edit.php:55 +#: include/admin/files.php:115 +#: include/admin/files.php:123 +#: include/admin/pages.php:136 +#: include/admin/compose.php:62 +#: include/admin/edit.php:54 +#: include/admin/files.php:122 +#: include/admin/files.php:161 +#: include/admin/pages.php:123 +msgid "File" +msgstr "Bestand" + +#: htdocs/toplevel/index.php:15 +#: include/diogenes.barrel-editor.inc.php:156 +#: include/Barrel/Editor.php:163 +msgid "The site alias may only contain letters, numbers and underscores." +msgstr "De alias van de website mag alleen bestaan uit letters, cijfers en onderstreeptekens." + +#: htdocs/toplevel/index.php:18 +#: include/diogenes.barrel-editor.inc.php:159 +#: include/Barrel/Editor.php:167 +msgid "vhost note: If you intend to serve this site from a virtualhost, you should enter the name of the virtualhost in this field." +msgstr "vhost notitie : Als je van plan bent deze website op en virtualhost te draaien, dan moet je de virtualhost hier invoeren." + +#: htdocs/toplevel/index.php:55 +msgid "PHP execution" +msgstr "PHP uitvoering" + +#: htdocs/toplevel/index.php:55 +#: include/diogenes.barrel-editor.inc.php:106 +#: include/Barrel/Editor.php:113 +msgid "custom templates" +msgstr "aagepaste sjablonen" + +msgid "template options" +msgstr "sjabloonopties" + +#: htdocs/toplevel/options.php:85 +#: include/admin/options.php:66 +#: htdocs/toplevel/options.php:48 +#: include/admin/options.php:68 +#: include/admin/options.php:70 +msgid "templates directory" +msgstr "sjablonenmap" + +#: htdocs/toplevel/options.php:86 +#: include/admin/options.php:67 +#: htdocs/toplevel/options.php:49 +#: include/admin/options.php:69 +#: include/admin/options.php:71 +msgid "default template" +msgstr "stan&daardsjabloon" + +#: include/admin/compose.php:56 +#: include/admin/edit.php:46 +#: include/admin/compose.php:58 +#: include/admin/edit.php:48 +msgid "log message" +msgstr "logbericht" + +#: include/admin/options.php:63 +#: include/admin/options.php:65 +#: include/admin/options.php:67 +msgid "favicon" +msgstr "favicon" + +#: include/admin/options.php:64 +#: include/admin/options.php:66 +#: include/admin/options.php:68 +msgid "(relative url to a PNG image)" +msgstr "(relatief pad naar en PNG afbeelding)" + +#: include/admin/pages.php:17 +#: include/admin/files.php:57 +#: include/admin/pages.php:21 +#: include/admin/files.php:54 +#: include/admin/pages.php:20 +msgid "page template" +msgstr "pagina sjabloon" + +#: include/admin/pages.php:18 +#: include/admin/files.php:58 +#: include/admin/pages.php:22 +#: include/admin/files.php:55 +#: include/admin/pages.php:21 +msgid "status" +msgstr "status" + +#: include/admin/pages.php:184 +#: include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "under construction" +msgstr "nog in ontwikkeling" + +#: include/admin/pages.php:184 +#: include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "disabled" +msgstr "uitgeschakeld" + +#: include/admin/pages.php:184 +#: include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "archived" +msgstr "gearchiveerd" + +#: include/diogenes.barrel.inc.php:152 +#: include/diogenes.barrel.inc.php:153 +#: include/diogenes.barrel.inc.php:155 +msgid "This page is currently under construction." +msgstr "Deze pagina is nog in ontwikkeling." + +#: include/diogenes.barrel.inc.php:156 +#: include/diogenes.barrel.inc.php:157 +#: include/diogenes.barrel.inc.php:159 +msgid "This page is currently unavailable." +msgstr "Deze pagina is momenteel niet beschikbaar." + +#: include/diogenes.admin.inc.php:63 +#: include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:69 +msgid "http://diogenes-doc.polytechnique.org/en-admin/" +msgstr "http://diogenes-doc.polytechnique.org/en-admin/" + +#: include/diogenes.toplevel.inc.php:188 +#: include/diogenes.toplevel.inc.php:82 +#: include/diogenes.toplevel.inc.php:83 +msgid "http://diogenes-doc.polytechnique.org/en-user/" +msgstr "http://diogenes-doc.polytechnique.org/en-user/" + +#: include/diogenes.toplevel.inc.php:198 +#: include/diogenes.toplevel.inc.php:92 +#: include/diogenes.toplevel.inc.php:93 +msgid "http://diogenes-doc.polytechnique.org/en-root/" +msgstr "http://diogenes-doc.polytechnique.org/en-root/" + +#: htdocs/toplevel/options.php:81 +#: htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "Mode" +msgstr "Modus" + +#: htdocs/toplevel/options.php:81 +#: htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "standard" +msgstr "standaard" + +#: htdocs/toplevel/options.php:81 +#: htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "expert" +msgstr "expert" + +#: htdocs/toplevel/options.php:82 +#: include/admin/options.php:65 +#: htdocs/toplevel/options.php:45 +#: include/admin/options.php:67 +#: include/admin/options.php:69 +msgid "display options" +msgstr "weergave-opties" + +#: htdocs/toplevel/options.php:87 +#: htdocs/toplevel/options.php:50 +msgid "system options" +msgstr "systeem opties" + +msgid "Initial user setup" +msgstr "Initiele gebruikers configuratie" + +#: htdocs/toplevel/boot.php:11 +msgid "Sorry, this feature is only available using native Diogenes authentication." +msgstr "Sorry, deze functionaliteit is alleen beschikbaar met de specifieke Diogenes authenticatie. " + +#: htdocs/toplevel/boot.php:19 +msgid "The database is already configured." +msgstr "De database is al geconfigureerd. " + +#: htdocs/toplevel/options_expert.php:13 +#: htdocs/toplevel/options_expert.php:75 +#: htdocs/toplevel/options_expert.php:76 +msgid "option" +msgstr "optie" + +#: htdocs/toplevel/options_expert.php:14 +#: htdocs/toplevel/options_expert.php:76 +#: htdocs/toplevel/options_expert.php:77 +msgid "value" +msgstr "waarde" + +#: include/admin/menus.php:221 +#: include/admin/menus.php:220 +#: include/admin/menus.php:232 +msgid "Menu" +msgstr "Menu" + +#: include/diogenes.page.inc.php:65 +#: include/diogenes.page.inc.php:66 +msgid "debugging" +msgstr "debug" + +#: include/diogenes.page.inc.php:66 +#: include/diogenes.page.inc.php:67 +msgid "call trace" +msgstr "call trace" + +#: include/diogenes.page.inc.php:67 +#: include/diogenes.page.inc.php:68 +msgid "database trace" +msgstr "database trace" + +#: include/diogenes/diogenes.logger-view.inc.php:59 +#: include/diogenes/diogenes.logger-view.inc.php:85 +#: include/diogenes/diogenes.logger-view.inc.php:130 +#: include/diogenes/diogenes.logger-view.inc.php:183 +#: include/diogenes/diogenes.logger-view.inc.php:58 +#: include/diogenes/diogenes.logger-view.inc.php:84 +#: include/diogenes/diogenes.logger-view.inc.php:129 +#: include/diogenes/diogenes.logger-view.inc.php:182 +msgid "all" +msgstr "allemaal" + +#: include/diogenes/diogenes.logger-view.inc.php:363 +#: include/diogenes/diogenes.logger-view.inc.php:360 +#: include/diogenes/diogenes.logger-view.inc.php:359 +msgid "Please select a year and/or a user." +msgstr "Selecteer een jaar en/of gebruiker. " + +#: include/diogenes/diogenes.table-editor.inc.php:523 +#: include/diogenes/diogenes.table-editor.inc.php:528 +msgid "previous page" +msgstr "vorige pagina" + +#: include/diogenes/diogenes.table-editor.inc.php:524 +#: include/diogenes/diogenes.table-editor.inc.php:529 +msgid "next page" +msgstr "volgende pagina" + +#: htdocs/toplevel/boot.php:7 +msgid "Initial setup" +msgstr "Initiele configuratie" + +#: htdocs/toplevel/boot.php:46 +msgid "The initial setup of the database was performed successfuly." +msgstr "De initiele configuratie is succesvol ingesteld." + +#: include/admin/options.php:47 +#: include/admin/options.php:49 +#: include/admin/options.php:51 +msgid "no" +msgstr "nee" + +#: include/admin/options.php:47 +#: include/admin/options.php:49 +#: include/admin/options.php:51 +msgid "yes" +msgstr "ja" + +#: include/admin/options.php:68 +#: include/admin/options.php:70 +#: include/admin/options.php:72 +msgid "hide Diogenes menu" +msgstr "Diogenes menu verbergen" + +#: include/admin/prefs.php:28 +msgid "account preferences" +msgstr "account voorkeuren" + +#: htdocs/toplevel/plugins.php:19 +msgid "Barrel plugins" +msgstr "Barrel plugins" + +#: htdocs/toplevel/plugins.php:21 +msgid "Global plugin settings" +msgstr "Algemene plugin opties" + +#: htdocs/toplevel/plugins.php:38 +#, php-format +msgid "Rebuilding plugin cache for barrel '%s'" +msgstr "Vernieuwen plugin cache voor barrel '%s'" + +#: htdocs/toplevel/plugins.php:47 +msgid "Clean plugins database" +msgstr "Opschonen van de plugins database" + +#: htdocs/toplevel/plugins.php:48 +msgid "If you are having problems with references to plugins that no longer exist, you can have Diogenes remove such entries from the database." +msgstr "Indien er problemen zijn met verwijzingen naar plugins die niet langer meer werken kan Diogenes zulke verwijzingen verwijderen uit de database. " + +#: htdocs/toplevel/plugins.php:49 +msgid "Clean" +msgstr "Opschonen" + +#: htdocs/toplevel/plugins.php:51 +msgid "Enable or disable plugins" +msgstr "Plugins activeren of deactiveren" + +#: htdocs/toplevel/plugins.php:54 +msgid "You can select the plugins you want to enable for this barrel." +msgstr "Selecteer de plugin die je wilt activeren voor deze barrel. " + +#: htdocs/toplevel/plugins.php:56 +msgid "You can select the plugins you want to enable or disable globally, that is the plugins that can be used in the different barrels. Please note that for a plugin to be accessible from a barrel, you will need to activate that plugin for the barrel. To do this, from the List of sites click on 'plugins' next to the barrel of your choice." +msgstr "" + +#: htdocs/toplevel/options.php:52 +msgid "Word document import" +msgstr "Importeer een Word document" + +#: include/admin/files.php:39 +msgid "File operations" +msgstr "Bestands aanpassingen" + +#: include/admin/files.php:43 +#: include/admin/files.php:40 +msgid "Create an empty file" +msgstr "Een nieuw bestand toevoegen" + +#: include/admin/files.php:44 +#: include/admin/files.php:41 +msgid "Copy or move a file" +msgstr "Kopieer of verplaats een file" + +#: include/admin/files.php:45 +#: include/admin/files.php:42 +msgid "Create" +msgstr "Aanmaken" + +#: include/admin/files.php:53 +#: include/admin/files.php:50 +msgid "to" +msgstr "naar" + +#: include/admin/files.php:59 +msgid "read" +msgstr "lezen" + +#: include/admin/files.php:60 +msgid "write" +msgstr "schrijven" + +#: include/admin/files.php:67 +#: include/admin/files.php:69 +msgid "Creating empty file" +msgstr "Leeg bestand aanmaken" + +#: include/admin/files.php:69 +#: include/admin/files.php:71 +msgid "The specified file already exists!" +msgstr "Dit specifieke bestand is reeds aanwezig!" + +#: include/admin/files.php:155 +#: include/admin/pages.php:160 +#: include/admin/plugins.php:22 +#: include/admin/files.php:194 +#: include/admin/pages.php:156 +#: include/Barrel/Page.php:170 +msgid "home" +msgstr "home" + +#: include/admin/files.php:182 +#: include/admin/files.php:224 +msgid "Copy" +msgstr "Kopieer" + +#: include/admin/files.php:182 +#: include/admin/files.php:224 +msgid "Move" +msgstr "Verplaats" + +#: include/admin/pages.php:18 +#: include/admin/pages.php:17 +#: include/Barrel/Page.php:171 +msgid "parent page" +msgstr "moeder pagina" + +#: include/admin/webdav.php:7 +#: include/diogenes.admin.inc.php:79 +#: include/diogenes.admin.inc.php:78 +msgid "WebDAV" +msgstr "WebDAV" + +#: include/admin/webdav.php:9 +#: include/admin/webdav.php:11 +msgid "You can access your barrel's files using WebDAV by pointing your WebDAV client to the following address." +msgstr "Je hebt toegang tot de bestanden in je barrel via WebDAV door je WebDAV client naar het volgende adres te verwijzen. " + +#: include/admin/plugins.php:22 +msgid "Page plugins " +msgstr "Pagina plugins" + +#: include/admin/plugins.php:26 +msgid "Available plugins" +msgstr "Beschikbare plugins" + +#: include/diogenes.page.inc.php:69 +#: include/diogenes.barrel-editor.inc.php:50 +#: include/diogenes.barrel-editor.inc.php:106 +#: include/Barrel/Page.php:126 +#: include/Barrel/Page.php:152 +#: include/diogenes.plugin-editor.inc.php:237 +#: include/Barrel/Page.php:150 +#: include/Barrel/Page.php:178 +#: include/Barrel/Editor.php:52 +#: include/Barrel/Editor.php:113 +#: include/Plugin/Editor.php:266 +#: include/diogenes.page.inc.php:68 +msgid "plugins" +msgstr "plugins" + +#: include/diogenes.toplevel.inc.php:96 +#: include/diogenes.admin.inc.php:76 +#: include/diogenes.toplevel.inc.php:97 +#: include/diogenes.admin.inc.php:75 +msgid "Plugins" +msgstr "Plugins" + +#: include/Barrel/Page.php:70 +#: include/Barrel/Page.php:89 +msgid "Not deleting page, it has child pages!" +msgstr "Pagina kan niet verwijdert worden, er zijn nog afgeleide pagina's!" + +#: include/Barrel/File.php:76 +#: include/Barrel/File.php:94 +msgid "rename" +msgstr "naam wijzigen" + +#: include/diogenes.plugin-editor.inc.php:236 +#: include/Plugin/Editor.php:265 +msgid "plugin" +msgstr "plugin" + +#: include/diogenes.plugin-editor.inc.php:239 +#: include/Plugin/Editor.php:268 +msgid "parameters" +msgstr "parameters" + +#: include/admin/files.php:192 +msgid "Document" +msgstr "Document" + +#: include/admin/index.php:52 +msgid "barrel options" +msgstr "barrel opties" + +#: include/admin/index.php:57 +msgid "barrel plugins" +msgstr "barrel plugins" + +#: include/admin/index.php:68 +msgid "page removed" +msgstr "pagina verwijderd" + +#: include/admin/index.php:80 +msgid "page plugins" +msgstr "pagina plugins" + +#: include/admin/index.php:92 +msgid "file deleted" +msgstr "bestand verwijdert" + +#: include/admin/webdav.php:14 +msgid "In order to access your barrel's files using WebDAV, please ask your Diogenes administrator to enable this feature in the Diogenes configuration file." +msgstr "Voor toegang tot de bestande in je barrel via WebDAV, vraag uw Diogenes administrator om deze functie aan te zetten in het Diogenes configuratie bestand. " + +#: include/Barrel/Page.php:81 +msgid "Deleting page" +msgstr "Pagina aan het verwijderen" + +#: include/Barrel/Page.php:176 +msgid "add a page" +msgstr "Voeg een pagina toe" + +#: include/Barrel/Page.php:266 +msgid "Creating new page" +msgstr "Nieuwe pagina aanmaken" + +#: include/Barrel/Editor.php:165 +msgid "no barrels available" +msgstr "geen barrels beschikbaar" + +#: htdocs/toplevel/index.php:13 +msgid "Warning : in order to make use of virtual hosts or WebDAV, you need to set $globals->rooturl to a full URL starting with http:// or https:// in your Diogenes configuration file." +msgstr "LET OP: om gebruik te maken van virtual hosts of WebDAV dient $globals->rooturl te verwijzen naar een volledige URL beginnend met http:// of https:// in je Diogenes configuratie bestand." + diff --git a/po/shtool b/po/shtool new file mode 100755 index 0000000..4c1a739 --- /dev/null +++ b/po/shtool @@ -0,0 +1,716 @@ +#!/bin/sh +## +## GNU shtool -- The GNU Portable Shell Tool +## Copyright (c) 1994-2000 Ralf S. Engelschall +## +## See http://www.gnu.org/software/shtool/ for more information. +## See ftp://ftp.gnu.org/gnu/shtool/ for latest version. +## +## Version 1.4.9 (16-Apr-2000) +## Ingredients: 3/17 available modules +## + +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +## USA, or contact Ralf S. Engelschall . +## +## Notice: Given that you include this file verbatim into your own +## source tree, you are justified in saying that it remains separate +## from your package, and that this way you are simply just using GNU +## shtool. So, in this situation, there is no requirement that your +## package itself is licensed under the GNU General Public License in +## order to take advantage of GNU shtool. +## + +## +## Usage: shtool [] [ [] []] +## +## Available commands: +## echo Print string with optional construct expansion +## install Install a program, script or datafile +## mkdir Make one or more directories +## +## Not available commands (because module was not built-in): +## mdate Pretty-print modification time of a file or dir +## table Pretty-print a field-separated list as a table +## prop Display progress with a running propeller +## move Move files with simultaneous substitution +## mkln Make link with calculation of relative paths +## mkshadow Make a shadow tree through symbolic links +## fixperm Fix file permissions inside a source tree +## tarball Roll distribution tarballs +## guessos Simple operating system guesser +## arx Extended archive command +## slo Separate linker options by library class +## scpp Sharing C Pre-Processor +## version Generate and maintain a version information file +## path Deal with program paths +## + +if [ $# -eq 0 ]; then + echo "$0:Error: invalid command line" 1>&2 + echo "$0:Hint: run \`$0 -h' for usage" 1>&2 + exit 1 +fi +if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then + echo "This is GNU shtool, version 1.4.9 (16-Apr-2000)" + echo "Copyright (c) 1994-2000 Ralf S. Engelschall " + echo "Report bugs to " + echo '' + echo "Usage: shtool [] [ [] []]" + echo '' + echo 'Available global :' + echo ' -v, --version display shtool version information' + echo ' -h, --help display shtool usage help page (this one)' + echo ' -d, --debug display shell trace information' + echo '' + echo 'Available [] []:' + echo ' echo [-n] [-e] [ ...]' + echo ' install [-v] [-t] [-c] [-C] [-s] [-m] [-o] [-g]' + echo ' [-e] ' + echo ' mkdir [-t] [-f] [-p] [-m] [ ...]' + echo '' + echo 'Not available (because module was not built-in):' + echo ' mdate [-n] [-z] [-s] [-d] [-f] [-o] ' + echo ' table [-F] [-w] [-c] [-s] ...' + echo ' prop [-p]' + echo ' move [-v] [-t] [-e] [-p] ' + echo ' mkln [-t] [-f] [-s] [ ...] ' + echo ' mkshadow [-v] [-t] [-a] ' + echo ' fixperm [-v] [-t] [ ...]' + echo ' tarball [-t] [-v] [-o ] [-c ] [-d ] [-u' + echo ' ] [-g ] [-e ] [ ...]' + echo ' guessos ' + echo ' arx [-t] [-C] [ ...]' + echo ' slo [-p] -- -L -l [-L -l ...]' + echo ' scpp [-v] [-p] [-f] [-o] [-t] [-M]' + echo ' [-D] [-C] [ ...]' + echo ' version [-l] [-n] [-p] [-s] [-i]' + echo ' [-d] ' + echo ' path [-s] [-r] [-d] [-b] [-m] [-p] [ ...]' + echo '' + exit 0 +fi +if [ ".$1" = ".-v" -o ".$1" = ."--version" ]; then + echo "GNU shtool 1.4.9 (16-Apr-2000)" + exit 0 +fi +if [ ".$1" = ".-d" -o ".$1" = ."--debug" ]; then + shift + set -x +fi +name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` +case "$name" in + echo|install|mkdir ) + # implicit tool command selection + tool="$name" + ;; + * ) + # explicit tool command selection + tool="$1" + shift + ;; +esac +arg_spec="" +opt_spec="" +gen_tmpfile=no + +## +## DISPATCH INTO SCRIPT PROLOG +## + +case $tool in + echo ) + str_tool="echo" + str_usage="[-n] [-e] [ ...]" + arg_spec="0+" + opt_spec="n.e." + opt_n=no + opt_e=no + ;; + install ) + str_tool="install" + str_usage="[-v] [-t] [-c] [-C] [-s] [-m] [-o] [-g] [-e] " + arg_spec="2=" + opt_spec="v.t.c.C.s.m:o:g:e:" + opt_v=no + opt_t=no + opt_c=no + opt_C=no + opt_s=no + opt_m="" + opt_o="" + opt_g="" + opt_e="" + ;; + mkdir ) + str_tool="mkdir" + str_usage="[-t] [-f] [-p] [-m] [ ...]" + arg_spec="1+" + opt_spec="t.f.p.m:" + opt_t=no + opt_f=no + opt_p=no + opt_m="" + ;; + -* ) + echo "$0:Error: unknown option \`$tool'" 2>&1 + echo "$0:Hint: run \`$0 -h' for usage" 2>&1 + exit 1 + ;; + * ) + echo "$0:Error: unknown command \`$tool'" 2>&1 + echo "$0:Hint: run \`$0 -h' for usage" 2>&1 + exit 1 + ;; +esac + +## +## COMMON UTILITY CODE +## + +# determine name of tool +if [ ".$tool" != . ]; then + # used inside shtool script + toolcmd="$0 $tool" + toolcmdhelp="shtool $tool" + msgprefix="shtool:$tool" +else + # used as standalone script + toolcmd="$0" + toolcmdhelp="sh $0" + msgprefix="$str_tool" +fi + +# parse argument specification string +eval `echo $arg_spec |\ + sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` + +# parse option specification string +eval `echo h.$opt_spec |\ + sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` + +# interate over argument line +opt_PREV='' +while [ $# -gt 0 ]; do + # special option stops processing + if [ ".$1" = ".--" ]; then + shift + break + fi + + # determine option and argument + opt_ARG_OK=no + if [ ".$opt_PREV" != . ]; then + # merge previous seen option with argument + opt_OPT="$opt_PREV" + opt_ARG="$1" + opt_ARG_OK=yes + opt_PREV='' + else + # split argument into option and argument + case "$1" in + -[a-zA-Z0-9]*) + eval `echo "x$1" |\ + sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ + -e 's/";\(.*\)$/"; opt_ARG="\1"/'` + ;; + -[a-zA-Z0-9]) + opt_OPT=`echo "x$1" | cut -c3-` + opt_ARG='' + ;; + *) + break + ;; + esac + fi + + # eat up option + shift + + # determine whether option needs an argument + eval "opt_MODE=\$opt_MODE_${opt_OPT}" + if [ ".$opt_ARG" = . -a ".$opt_ARG_OK" != .yes ]; then + if [ ".$opt_MODE" = ".:" -o ".$opt_MODE" = ".+" ]; then + opt_PREV="$opt_OPT" + continue + fi + fi + + # process option + case $opt_MODE in + '.' ) + # boolean option + eval "opt_${opt_OPT}=yes" + ;; + ':' ) + # option with argument (multiple occurances override) + eval "opt_${opt_OPT}=\"\$opt_ARG\"" + ;; + '+' ) + # option with argument (multiple occurances append) + eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\"" + ;; + * ) + echo "$msgprefix:Error: unknown option: \`-$opt_OPT'" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 + exit 1 + ;; + esac +done +if [ ".$opt_PREV" != . ]; then + echo "$msgprefix:Error: missing argument to option \`-$opt_PREV'" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 + exit 1 +fi + +# process help option +if [ ".$opt_h" = .yes ]; then + echo "Usage: $toolcmdhelp $str_usage" + exit 0 +fi + +# complain about incorrect number of arguments +case $arg_MODE in + '=' ) + if [ $# -ne $arg_NUMS ]; then + echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 + exit 1 + fi + ;; + '+' ) + if [ $# -lt $arg_NUMS ]; then + echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 + exit 1 + fi + ;; +esac + +# establish a temporary file on request +if [ ".$gen_tmpfile" = .yes ]; then + if [ ".$TMPDIR" != . ]; then + tmpdir="$TMPDIR" + elif [ ".$TEMPDIR" != . ]; then + tmpdir="$TEMPDIR" + else + tmpdir="/tmp" + fi + tmpfile="$tmpdir/.shtool.$$" + rm -f $tmpfile >/dev/null 2>&1 + touch $tmpfile +fi + +## +## DISPATCH INTO SCRIPT BODY +## + +case $tool in + +echo ) + ## + ## echo -- Print string with optional construct expansion + ## Copyright (c) 1998-2000 Ralf S. Engelschall + ## Originally written for WML as buildinfo + ## + + text="$*" + + # check for broken escape sequence expansion + seo='' + bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'` + if [ ".$bytes" != .3 ]; then + bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'` + if [ ".$bytes" = .3 ]; then + seo='-E' + fi + fi + + # check for existing -n option (to suppress newline) + minusn='' + bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'` + if [ ".$bytes" = .3 ]; then + minusn='-n' + fi + + # determine terminal bold sequence + term_bold='' + term_norm='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[Bb]'`" != . ]; then + case $TERM in + # for the most important terminal types we directly know the sequences + xterm|xterm*|vt220|vt220*) + term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' /dev/null` + term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' /dev/null` + ;; + vt100|vt100*) + term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' /dev/null` + term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' /dev/null` + ;; + # for all others, we try to use a possibly existing `tput' or `tcout' utility + * ) + paths=`echo $PATH | sed -e 's/:/ /g'` + for tool in tput tcout; do + for dir in $paths; do + if [ -r "$dir/$tool" ]; then + for seq in bold md smso; do # 'smso' is last + bold="`$dir/$tool $seq 2>/dev/null`" + if [ ".$bold" != . ]; then + term_bold="$bold" + break + fi + done + if [ ".$term_bold" != . ]; then + for seq in sgr0 me rmso reset; do # 'reset' is last + norm="`$dir/$tool $seq 2>/dev/null`" + if [ ".$norm" != . ]; then + term_norm="$norm" + break + fi + done + fi + break + fi + done + if [ ".$term_bold" != . -a ".$term_norm" != . ]; then + break; + fi + done + ;; + esac + if [ ".$term_bold" = . -o ".$term_norm" = . ]; then + echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2 + fi + fi + + # determine user name + username='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[uU]'`" != . ]; then + username="$LOGNAME" + if [ ".$username" = . ]; then + username="$USER" + if [ ".$username" = . ]; then + username="`(whoami) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$username" = . ]; then + username="`(who am i) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$username" = . ]; then + username='unknown' + fi + fi + fi + fi + fi + + # determine user id + userid='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%U'`" != . ]; then + userid="`(id -u) 2>/dev/null`" + if [ ".$userid" = . ]; then + str="`(id) 2>/dev/null`" + if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then + userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*//'` + fi + if [ ".$userid" = . ]; then + userid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \ + sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$userid" = . ]; then + userid=`(ypcat passwd) 2>/dev/null | + egrep "^${username}:" | \ + sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$userid" = . ]; then + userid='?' + fi + fi + fi + fi + fi + + # determine host name + hostname='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%h'`" != . ]; then + hostname="`(uname -n) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$hostname" = . ]; then + hostname="`(hostname) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$hostname" = . ]; then + hostname='unknown' + fi + fi + case $hostname in + *.* ) + domainname=".`echo $hostname | cut -d. -f2-`" + hostname="`echo $hostname | cut -d. -f1`" + ;; + esac + fi + + # determine domain name + domainname='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%d'`" != . ]; then + if [ ".$domainname" = . ]; then + if [ -f /etc/resolv.conf ]; then + domainname="`egrep '^[ ]*domain' /etc/resolv.conf | head -1 |\ + sed -e 's/.*domain//' \ + -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ + -e 's/^\.//' -e 's/^/./' |\ + awk '{ printf("%s", $1); }'`" + if [ ".$domainname" = . ]; then + domainname="`egrep '^[ ]*search' /etc/resolv.conf | head -1 |\ + sed -e 's/.*search//' \ + -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ + -e 's/ .*//' -e 's/ .*//' \ + -e 's/^\.//' -e 's/^/./' |\ + awk '{ printf("%s", $1); }'`" + fi + fi + fi + fi + + # determine current time + time_day='' + time_month='' + time_year='' + time_monthname='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[DMYm]'`" != . ]; then + time_day=`date '+%d'` + time_month=`date '+%m'` + time_year=`date '+%Y' 2>/dev/null` + if [ ".$time_year" = . ]; then + time_year=`date '+%y'` + case $time_year in + [5-9][0-9]) time_year="19$time_year" ;; + [0-4][0-9]) time_year="20$time_year" ;; + esac + fi + case $time_month in + 1|01) time_monthname='Jan' ;; + 2|02) time_monthname='Feb' ;; + 3|03) time_monthname='Mar' ;; + 4|04) time_monthname='Apr' ;; + 5|05) time_monthname='May' ;; + 6|06) time_monthname='Jun' ;; + 7|07) time_monthname='Jul' ;; + 8|08) time_monthname='Aug' ;; + 9|09) time_monthname='Sep' ;; + 10) time_monthname='Oct' ;; + 11) time_monthname='Nov' ;; + 12) time_monthname='Dec' ;; + esac + fi + + # expand special ``%x'' constructs + if [ ".$opt_e" = .yes ]; then + text=`echo $seo "$text" |\ + sed -e "s/%B/${term_bold}/g" \ + -e "s/%b/${term_norm}/g" \ + -e "s/%u/${username}/g" \ + -e "s/%U/${userid}/g" \ + -e "s/%h/${hostname}/g" \ + -e "s/%d/${domainname}/g" \ + -e "s/%D/${time_day}/g" \ + -e "s/%M/${time_month}/g" \ + -e "s/%Y/${time_year}/g" \ + -e "s/%m/${time_monthname}/g" 2>/dev/null` + fi + + # create output + if [ .$opt_n = .no ]; then + echo $seo "$text" + else + # the harder part: echo -n is best, because + # awk may complain about some \xx sequences. + if [ ".$minusn" != . ]; then + echo $seo $minusn "$text" + else + echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text" + fi + fi + ;; + +install ) + ## + ## install -- Install a program, script or datafile + ## Copyright (c) 1997-2000 Ralf S. Engelschall + ## Originally written for shtool + ## + + src="$1" + dst="$2" + + # If destination is a directory, append the input filename + if [ -d $dst ]; then + dst=`echo "$dst" | sed -e 's:/$::'` + dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` + dst="$dst/$dstfile" + fi + + # Add a possible extension to src and dst + if [ ".$opt_e" != . ]; then + src="$src$opt_e" + dst="$dst$opt_e" + fi + + # Check for correct arguments + if [ ".$src" = ".$dst" ]; then + echo "$msgprefix:Error: source and destination are the same" 1>&2 + exit 1 + fi + + # Make a temp file name in the destination directory + dstdir=`echo $dst | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'` + dsttmp="$dstdir/#INST@$$#" + + # Verbosity + if [ ".$opt_v" = .yes ]; then + echo "$src -> $dst" 1>&2 + fi + + # Copy or move the file name to the temp name + # (because we might be not allowed to change the source) + if [ ".$opt_C" = .yes ]; then + opt_c=yes + fi + if [ ".$opt_c" = .yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "cp $src $dsttmp" 1>&2 + fi + cp $src $dsttmp || exit $? + else + if [ ".$opt_t" = .yes ]; then + echo "mv $src $dsttmp" 1>&2 + fi + mv $src $dsttmp || exit $? + fi + + # Adjust the target file + # (we do chmod last to preserve setuid bits) + if [ ".$opt_s" = .yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "strip $dsttmp" 1>&2 + fi + strip $dsttmp || exit $? + fi + if [ ".$opt_o" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown $opt_o $dsttmp" 1>&2 + fi + chown $opt_o $dsttmp || exit $? + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp $opt_g $dsttmp" 1>&2 + fi + chgrp $opt_g $dsttmp || exit $? + fi + if [ ".$opt_m" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chmod $opt_m $dsttmp" 1>&2 + fi + chmod $opt_m $dsttmp || exit $? + fi + + # Determine whether to do a quick install + # (has to be done _after_ the strip was already done) + quick=no + if [ ".$opt_C" = .yes ]; then + if [ -r $dst ]; then + if cmp -s $src $dst; then + quick=yes + fi + fi + fi + + # Finally install the file to the real destination + if [ $quick = yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "rm -f $dsttmp" 1>&2 + fi + rm -f $dsttmp + else + if [ ".$opt_t" = .yes ]; then + echo "rm -f $dst && mv $dsttmp $dst" 1>&2 + fi + rm -f $dst && mv $dsttmp $dst + fi + ;; + +mkdir ) + ## + ## mkdir -- Make one or more directories + ## Copyright (c) 1996-2000 Ralf S. Engelschall + ## Originally written for public domain by Noah Friedman + ## Cleaned up and enhanced for shtool + ## + + errstatus=0 + for p in ${1+"$@"}; do + # if the directory already exists... + if [ -d "$p" ]; then + if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then + echo "$msgprefix:Error: directory already exists: $p" 1>&2 + errstatus=1 + break + else + continue + fi + fi + # if the directory has to be created... + if [ ".$opt_p" = .no ]; then + if [ ".$opt_t" = .yes ]; then + echo "mkdir $p" 1>&2 + fi + mkdir $p || errstatus=$? + else + # the smart situation + set fnord `echo ":$p" |\ + sed -e 's/^:\//%/' \ + -e 's/^://' \ + -e 's/\// /g' \ + -e 's/^%/\//'` + shift + pathcomp='' + for d in ${1+"$@"}; do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp="./$pathcomp" ;; + esac + if [ ! -d "$pathcomp" ]; then + if [ ".$opt_t" = .yes ]; then + echo "mkdir $pathcomp" 1>&2 + fi + mkdir $pathcomp || errstatus=$? + if [ ".$opt_m" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chmod $opt_m $pathcomp" 1>&2 + fi + chmod $opt_m $pathcomp || errstatus=$? + fi + fi + pathcomp="$pathcomp/" + done + fi + done + exit $errstatus + ;; + +esac + +exit 0 + +##EOF## diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..ec645ac --- /dev/null +++ b/po/sv.po @@ -0,0 +1,1525 @@ +# Swedish translations for Diogenes package. +# Copyright (C) 2004 Jeremy Lainé +# This file is distributed under the same license as the Diogenes package. +# Jonas Johansson , 2004. +# Jeremy Lainé , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: Diogenes 0.9.12\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-01-07 16:41+0100\n" +"PO-Revision-Date: 2004-06-10 17:09+0200\n" +"Last-Translator: Jeremy Lainé \n" +"Language-Team: Swedish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: KBabel 1.3.1\n" + +#: htdocs/index.php:9 htdocs/index.php:13 include/admin/bad.php:46 +msgid "Welcome to Diogenes" +msgstr "Välkommen till Diogenes" + +#: htdocs/index.php:11 htdocs/index.php:15 +msgid "Welcome to the Diogenes content management system." +msgstr "Välkommen till Diogenes innehållshanteringssystem." + +#: htdocs/index.php:12 htdocs/index.php:16 +msgid "" +"Diogenes was developed by the webmasters of the Polytechnique.org web site." +msgstr "Diogenes utvecklades av Polytechnique.org:s webmasters." + +#: htdocs/index.php:13 htdocs/index.php:17 +msgid "The following barrels are currently available" +msgstr "Följande tunnor är tillgängliga för tillfället." + +#: htdocs/index.php:14 htdocs/toplevel/admins.php:8 +#: include/diogenes.barrel-editor.inc.php:152 include/Barrel/Editor.php:159 +msgid "site" +msgstr "sajt" + +#: htdocs/index.php:15 htdocs/toplevel/index.php:12 +#: htdocs/toplevel/logger_actions.php:14 include/admin/options.php:61 +#: include/admin/options.php:63 include/diogenes.barrel-editor.inc.php:153 +#: include/diogenes.plugin-editor.inc.php:238 include/admin/options.php:65 +#: include/Barrel/Editor.php:160 include/Plugin/Editor.php:267 +msgid "description" +msgstr "beskrivning" + +#: htdocs/prefs.php:19 +msgid "Changing password.." +msgstr "Ändrar lösenord.." + +#: htdocs/prefs.php:33 include/admin/prefs.php:20 +msgid "User preferences" +msgstr "Användarinställningar" + +#: htdocs/prefs.php:34 include/admin/prefs.php:21 +msgid "Diogenes preferences" +msgstr "Diogenes inställningar" + +#: htdocs/prefs.php:36 +msgid "my information" +msgstr "min information" + +#: htdocs/prefs.php:37 htdocs/toplevel/accounts.php:13 +#: htdocs/toplevel/boot.php:28 include/diogenes.session.inc.php:138 +msgid "username" +msgstr "användarnamn" + +#: htdocs/prefs.php:38 +msgid "full name" +msgstr "fullständigt namn" + +#: htdocs/prefs.php:40 include/admin/prefs.php:23 +msgid "language" +msgstr "språk" + +#: htdocs/prefs.php:41 include/admin/prefs.php:24 +msgid "" +"You can select your preferred language by clicking on the appropriate " +"language below." +msgstr "Du kan välja språk genom att klicka på det språk som passar nedan." + +#: htdocs/prefs.php:43 +msgid "my password" +msgstr "mitt lösenord" + +#: htdocs/prefs.php:44 +msgid "new password" +msgstr "nytt lösenord" + +#: htdocs/prefs.php:45 +msgid "confirmation" +msgstr "bekräftelse" + +#: htdocs/prefs.php:47 include/admin/prefs.php:26 +msgid "Change" +msgstr "Ändra" + +#: include/admin/compose.php:32 include/admin/edit.php:31 +#: include/admin/compose.php:34 include/admin/edit.php:33 +msgid "Commiting changes to file" +msgstr "Genomför ändringar av filen" + +#: include/admin/edit.php:41 include/admin/edit.php:43 +msgid "File editor" +msgstr "Fileditor" + +#: include/admin/edit.php:45 include/admin/edit.php:47 +msgid "File source" +msgstr "Filens källa" + +#: htdocs/toplevel/index.php:16 htdocs/toplevel/options.php:89 +#: include/admin/menus.php:151 include/admin/options.php:72 +#: include/admin/pages.php:12 include/admin/edit.php:48 +#: include/diogenes.session.inc.php:137 +#: include/diogenes/diogenes.logger-view.inc.php:382 +#: include/diogenes/diogenes.table-editor.inc.php:536 +#: htdocs/toplevel/options.php:53 include/admin/files.php:41 +#: include/admin/menus.php:152 include/admin/options.php:74 +#: include/admin/pages.php:15 include/admin/edit.php:50 +#: include/diogenes/diogenes.logger-view.inc.php:379 +#: include/diogenes/diogenes.table-editor.inc.php:541 +#: include/diogenes.barrel-editor.inc.php:157 +#: include/diogenes.plugin-editor.inc.php:235 include/admin/files.php:38 +#: include/admin/menus.php:164 include/admin/options.php:76 +#: include/admin/pages.php:14 include/Barrel/Editor.php:164 +#: include/Plugin/Editor.php:264 +#: include/diogenes/diogenes.logger-view.inc.php:378 +msgid "Submit" +msgstr "Skicka" + +#: include/admin/files.php:27 include/admin/pages.php:152 +#: include/admin/compose.php:58 include/admin/edit.php:50 +#: include/Barrel/Page.php:143 +msgid "pages catalog" +msgstr "sidornas katalog" + +#: include/admin/files.php:28 include/admin/pages.php:154 +#: include/admin/compose.php:59 include/admin/edit.php:51 +#: include/Barrel/Page.php:147 include/admin/index.php:74 +#: include/Barrel/Page.php:174 +msgid "page properties" +msgstr "sidans egenskaper" + +#: include/admin/files.php:29 include/admin/pages.php:155 +#: include/admin/compose.php:60 include/admin/edit.php:52 +#: include/diogenes.rcs.inc.php:452 include/diogenes.rcs.inc.php:621 +#: include/Barrel/Page.php:148 include/admin/files.php:146 +#: include/Barrel/Page.php:175 +msgid "view page" +msgstr "visa sida" + +#: include/admin/files.php:83 include/admin/files.php:92 +#: include/admin/files.php:101 include/admin/pages.php:156 +#: include/admin/compose.php:61 include/admin/edit.php:53 +#: include/Barrel/Page.php:149 include/Barrel/Page.php:173 +msgid "browse files" +msgstr "bläddra bland filer" + +#: include/admin/files.php:35 include/admin/pages.php:167 +#: include/admin/compose.php:64 include/admin/edit.php:56 +#: include/admin/pages.php:132 include/Barrel/File.php:94 +#: include/Barrel/File.php:114 +msgid "raw editor" +msgstr "raw editor" + +#: htdocs/toplevel/options.php:88 include/admin/files.php:36 +#: include/admin/pages.php:168 include/admin/compose.php:65 +#: include/admin/edit.php:57 include/diogenes.barrel.inc.php:316 +#: htdocs/toplevel/options.php:51 include/admin/pages.php:133 +#: include/diogenes.barrel.inc.php:347 include/Barrel/File.php:95 +#: include/Barrel/File.php:115 include/diogenes.barrel.inc.php:343 +msgid "HTML editor" +msgstr "HTML editor" + +#: include/admin/files.php:85 include/admin/files.php:94 +#: include/admin/pages.php:163 include/admin/pages.php:170 +#: include/admin/compose.php:66 include/admin/edit.php:58 +#: include/admin/pages.php:129 include/admin/pages.php:134 +#: include/Barrel/File.php:97 include/Barrel/File.php:117 +msgid "file revisions" +msgstr "filversion" + +msgid "Ekit" +msgstr "Ekit" + +#: include/admin/menus.php:36 include/admin/menus.php:37 +msgid "The site's menus" +msgstr "Sajtens menyer" + +#: include/admin/menus.php:44 include/admin/menus.php:45 +msgid "The selected menu has child items, please remove them first." +msgstr "Den valda menyn har undermenyer, var vänlig ta bort dem först." + +#: include/admin/menus.php:144 include/admin/menus.php:145 +#: include/admin/menus.php:157 +msgid "menu entry properties" +msgstr "menyinläggsegenskaper" + +#: include/admin/menus.php:147 include/admin/menus.php:148 +#: include/admin/menus.php:160 +msgid "none" +msgstr "ingen" + +#: include/admin/menus.php:148 include/admin/menus.php:149 +#: include/admin/menus.php:161 +msgid "internal link" +msgstr "intern länk" + +#: include/admin/menus.php:149 include/admin/menus.php:150 +#: include/admin/menus.php:162 +msgid "external link" +msgstr "extern länk" + +#: include/admin/menus.php:173 include/diogenes.plugin-editor.inc.php:240 +#: include/admin/menus.php:185 include/Plugin/Editor.php:269 +msgid "move up" +msgstr "flytta upp" + +#: include/admin/menus.php:176 include/diogenes.plugin-editor.inc.php:241 +#: include/admin/menus.php:188 include/Plugin/Editor.php:270 +msgid "move down" +msgstr "flytta ner" + +#: htdocs/toplevel/index.php:85 include/admin/menus.php:178 +#: include/diogenes.rcs.inc.php:417 +#: include/diogenes/diogenes.table-editor.inc.php:529 +#: include/diogenes/diogenes.table-editor.inc.php:534 +#: include/diogenes.barrel-editor.inc.php:43 include/Barrel/Page.php:119 +#: include/Barrel/File.php:74 include/admin/menus.php:190 +#: include/Barrel/File.php:92 include/Barrel/Page.php:143 +#: include/Barrel/Editor.php:45 +msgid "edit" +msgstr "redigera" + +#: htdocs/toplevel/index.php:87 include/admin/menus.php:179 +#: include/admin/pages.php:202 include/diogenes.rcs.inc.php:419 +#: include/diogenes/diogenes.table-editor.inc.php:528 +#: include/diogenes/diogenes.table-editor.inc.php:533 +#: include/diogenes.barrel-editor.inc.php:52 include/Barrel/Page.php:129 +#: include/Barrel/File.php:77 include/admin/menus.php:191 +#: include/Barrel/File.php:95 include/Barrel/Page.php:153 +#: include/Barrel/Editor.php:54 +msgid "delete" +msgstr "ta bort" + +#: include/admin/menus.php:217 include/admin/menus.php:216 +#: include/admin/menus.php:228 +msgid "External links are denoted with the [ext] prefix." +msgstr "Externa länkar är märkta med prefixet [ext]." + +#: include/admin/menus.php:222 include/admin/menus.php:221 +#: include/admin/menus.php:233 +msgid "Add new entry" +msgstr "Lägg till ny post" + +#: include/admin/files.php:63 include/admin/files.php:86 +#: include/admin/files.php:88 +msgid "Error during file transfer!" +msgstr "Fel vid filöverföring!" + +#: include/admin/files.php:69 include/admin/files.php:92 +#: include/admin/files.php:94 +msgid "Deleting file" +msgstr "Tar bort fil" + +#: include/admin/files.php:81 include/admin/files.php:112 +#: include/admin/files.php:120 +msgid "Revision differences" +msgstr "Versionsskillnader" + +#: include/admin/files.php:90 include/admin/files.php:120 +#: include/admin/files.php:128 +msgid "File revisions" +msgstr "Filversioner" + +#: include/admin/files.php:103 include/admin/files.php:155 +#: include/admin/files.php:194 +msgid "File manager" +msgstr "Filhanterare" + +#: include/admin/files.php:40 include/admin/files.php:38 +msgid "Files in current directory" +msgstr "Filer i aktuell katalog" + +#: include/admin/files.php:41 include/admin/files.php:40 +#: include/admin/files.php:37 +msgid "Import file" +msgstr "Importera fil" + +#: include/admin/files.php:42 include/admin/pages.php:210 +#: include/admin/pages.php:191 include/admin/files.php:39 +#: include/admin/pages.php:163 +msgid "Send" +msgstr "Skicka" + +#: include/admin/files.php:43 +msgid "File to upload" +msgstr "Fil att ladda upp" + +#: include/admin/index.php:20 include/admin/index.php:45 +#: include/admin/index.php:47 +msgid "site created" +msgstr "sajten skapad" + +#: include/admin/index.php:23 include/admin/index.php:50 +#: include/admin/index.php:63 +msgid "page created" +msgstr "sidan skapad" + +#: include/admin/index.php:26 include/admin/index.php:54 +msgid "page deleted" +msgstr "sidan borttagen" + +#: include/admin/index.php:31 include/admin/index.php:59 +#: include/admin/index.php:86 +msgid "file updated" +msgstr "filen uppdaterad" + +#: include/admin/index.php:34 include/admin/index.php:64 +msgid "file removed" +msgstr "filen borttagen" + +#: include/admin/index.php:43 include/admin/index.php:77 +#: include/admin/index.php:105 +msgid "Welcome to the Diogenes backoffice" +msgstr "Välkommen till Diogenes backoffice" + +#: include/admin/files.php:47 include/admin/index.php:44 +#: include/diogenes/diogenes.logger-view.inc.php:372 +#: include/admin/files.php:49 include/admin/index.php:78 +#: include/diogenes/diogenes.logger-view.inc.php:369 +#: include/admin/files.php:46 include/admin/index.php:106 +#: include/diogenes/diogenes.logger-view.inc.php:368 +msgid "date" +msgstr "datum" + +#: include/admin/index.php:45 include/admin/users.php:28 +#: include/diogenes/diogenes.logger-view.inc.php:369 +#: include/admin/index.php:79 +#: include/diogenes/diogenes.logger-view.inc.php:366 +#: include/admin/index.php:107 +#: include/diogenes/diogenes.logger-view.inc.php:365 +msgid "user" +msgstr "användare" + +#: include/admin/index.php:46 include/admin/index.php:80 +#: include/admin/index.php:108 +msgid "event" +msgstr "händelse" + +#: include/admin/pages.php:11 include/admin/pages.php:14 +#: include/admin/pages.php:158 +msgid "Page manager" +msgstr "Sidhanterare" + +#: include/admin/pages.php:13 include/admin/pages.php:16 +#: include/admin/pages.php:15 +msgid "Reset" +msgstr "Återställ" + +#: include/admin/pages.php:14 include/diogenes.barrel.inc.php:312 +#: include/admin/pages.php:17 include/diogenes.barrel.inc.php:343 +#: include/admin/pages.php:16 include/diogenes.barrel.inc.php:339 +msgid "Page properties" +msgstr "Sidegenskaper" + +#: include/admin/pages.php:15 include/admin/files.php:55 +#: include/admin/pages.php:19 include/admin/files.php:52 +#: include/admin/pages.php:18 +msgid "location" +msgstr "plats" + +#: htdocs/toplevel/index.php:10 htdocs/toplevel/logger_actions.php:13 +#: include/admin/options.php:60 include/admin/pages.php:16 +#: include/admin/files.php:56 include/admin/options.php:62 +#: include/admin/pages.php:20 include/admin/files.php:53 +#: include/admin/options.php:64 include/admin/pages.php:19 +msgid "title" +msgstr "titel" + +msgid "display" +msgstr "visa" + +#: include/admin/files.php:56 include/admin/pages.php:22 +msgid "access" +msgstr "åtkomst" + +#: include/admin/pages.php:22 include/admin/pages.php:26 +msgid "Add a page" +msgstr "Lägg till en sida" + +#: include/admin/pages.php:43 include/admin/pages.php:47 +#: include/admin/pages.php:50 +msgid "Document name does not end in .doc" +msgstr "Dokumentets namn slutar inte med .doc" + +#: include/admin/pages.php:46 include/admin/pages.php:50 +#: include/admin/pages.php:53 +msgid "Checking in Word file" +msgstr "Kollar i Wordfilen" + +#: include/admin/pages.php:51 include/admin/pages.php:55 +#: include/admin/pages.php:58 +msgid "Importing Word file" +msgstr "Importerar Wordfil" + +#: include/admin/pages.php:57 include/admin/pages.php:61 +#: include/admin/pages.php:64 +msgid "Importing HTML file" +msgstr "Importerar HTML-fil" + +#: include/admin/pages.php:62 include/admin/pages.php:66 +#: include/admin/pages.php:69 +msgid "Raw file import" +msgstr "Importera Raw-fil" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "visible" +msgstr "synlig" + +msgid "invisible" +msgstr "osynlig" + +#: htdocs/toplevel/index.php:84 include/admin/pages.php:196 +#: include/diogenes.rcs.inc.php:416 include/diogenes.rcs.inc.php:450 +#: include/diogenes.rcs.inc.php:619 include/Barrel/Page.php:118 +#: include/Barrel/File.php:73 include/admin/files.php:144 +#: include/Barrel/File.php:91 include/Barrel/Page.php:142 +msgid "view" +msgstr "vy" + +#: include/admin/pages.php:197 include/Barrel/Page.php:120 +#: include/Barrel/Page.php:144 +msgid "properties" +msgstr "egenskaper" + +#: include/admin/pages.php:198 +msgid "files" +msgstr "filer" + +#: include/admin/pages.php:199 include/diogenes.rcs.inc.php:418 +#: include/Barrel/Page.php:121 include/Barrel/File.php:75 +#: include/Barrel/File.php:93 include/Barrel/Page.php:145 +msgid "revisions" +msgstr "versioner" + +#: include/admin/pages.php:211 include/admin/pages.php:195 +#: include/admin/pages.php:172 +msgid "Import a Word document" +msgstr "Importera ett Worddokument" + +#: include/admin/pages.php:214 include/admin/pages.php:198 +#: include/admin/pages.php:176 +msgid "This page's master document is currently a Word document." +msgstr "Den här sidans källdokument är för tillfället ett Worddokument." + +#: include/admin/pages.php:215 include/admin/pages.php:199 +#: include/admin/pages.php:177 +msgid "You can upload a new version of the Word document below." +msgstr "Du kan ladda upp en ny version av Worddokumentet nedan." + +#: include/admin/pages.php:216 include/admin/pages.php:200 +#: include/admin/pages.php:178 +msgid "You can get the current version of the file here" +msgstr "Du kan hämta den aktuella versionen av filen här" + +#: include/admin/pages.php:219 include/admin/pages.php:203 +#: include/admin/pages.php:181 +msgid "If you wish, you can set this page's content from a Word document." +msgstr "" +"Om du vill kan du välja att innehållet på den här sidan kommer från ett " +"Worddokument." + +#: include/admin/pages.php:220 include/admin/pages.php:204 +#: include/admin/pages.php:182 +msgid "To do so, simply upload the Word document below." +msgstr "För att göra så är det bara att ladda upp Worddokumentet nedan." + +#: include/admin/pages.php:222 include/admin/pages.php:208 +#: include/admin/pages.php:160 +msgid "Import HTML" +msgstr "Importera HTML" + +#: include/admin/pages.php:223 include/admin/pages.php:209 +#: include/admin/pages.php:161 +msgid "" +"You can replace the current page's contents by uploading an HTML file below." +msgstr "" +"Du kan byta ut den aktuella sidans innehåll genom att ladda upp en HTML-fil " +"nedan." + +#: include/admin/pages.php:224 include/admin/pages.php:210 +#: include/admin/pages.php:162 +msgid "" +"If the file name ends with .htm or .html, anything outside the <body>" +"</body> pair will be stripped." +msgstr "" +"Om filnamnet slutar med .htm eller .html, så tas allt utanför <body>" +"</body> bort." + +#: htdocs/toplevel/admins.php:20 include/admin/users.php:15 +msgid "Could not find requested user" +msgstr "Kunde inte hitta efterfrågad användare" + +#: include/admin/users.php:24 +msgid "Users administration" +msgstr "Användaradministration" + +#: include/admin/users.php:25 +msgid "Registered users" +msgstr "Registrerade användare" + +#: include/admin/users.php:26 include/diogenes.toplevel.inc.php:200 +#: include/diogenes.toplevel.inc.php:94 include/diogenes.toplevel.inc.php:95 +msgid "Administrators" +msgstr "Administratörer" + +#: include/admin/users.php:29 +#: include/diogenes/diogenes.logger-view.inc.php:373 +#: include/diogenes/diogenes.table-editor.inc.php:526 +#: include/diogenes/diogenes.logger-view.inc.php:370 +#: include/diogenes/diogenes.table-editor.inc.php:531 +#: include/diogenes/diogenes.logger-view.inc.php:369 +msgid "action" +msgstr "funktion" + +#: htdocs/toplevel/admins.php:45 include/admin/users.php:35 +msgid "remove" +msgstr "ta bort" + +#: include/diogenes.session.inc.php:134 +msgid "Diogenes login" +msgstr "Diogenes login" + +#: include/diogenes.session.inc.php:135 +msgid "Connexion" +msgstr "Anslutning" + +#: htdocs/toplevel/accounts.php:16 htdocs/toplevel/boot.php:31 +#: include/diogenes.session.inc.php:136 +msgid "password" +msgstr "lösenord" + +#: include/diogenes.toplevel.inc.php:52 include/diogenes.barrel.inc.php:104 +#: include/diogenes.barrel.inc.php:105 include/diogenes.toplevel.inc.php:53 +#: include/diogenes.barrel.inc.php:107 +msgid "You are not authorized to view this page!" +msgstr "Du har inte behörighet för att se den här sidan!" + +#: include/diogenes.toplevel.inc.php:38 include/diogenes.toplevel.inc.php:187 +#: include/diogenes.admin.inc.php:62 include/diogenes.barrel.inc.php:301 +#: include/diogenes.toplevel.inc.php:81 include/diogenes.barrel.inc.php:332 +#: include/diogenes.admin.inc.php:69 include/diogenes.toplevel.inc.php:39 +#: include/diogenes.toplevel.inc.php:82 include/diogenes.admin.inc.php:68 +#: include/diogenes.barrel.inc.php:328 +msgid "Home" +msgstr "Hemma" + +#: include/diogenes.toplevel.inc.php:192 include/diogenes.barrel.inc.php:303 +#: include/diogenes.toplevel.inc.php:86 include/diogenes.barrel.inc.php:334 +#: include/diogenes.toplevel.inc.php:87 include/diogenes.barrel.inc.php:330 +msgid "Logout" +msgstr "Logga ut" + +#: include/diogenes.toplevel.inc.php:194 include/diogenes.barrel.inc.php:306 +#: include/diogenes.toplevel.inc.php:88 include/diogenes.barrel.inc.php:337 +#: include/diogenes.toplevel.inc.php:89 include/diogenes.barrel.inc.php:333 +msgid "Login" +msgstr "Login" + +#: include/diogenes.admin.inc.php:37 include/diogenes.admin.inc.php:64 +#: include/diogenes.barrel.inc.php:310 include/diogenes.barrel.inc.php:341 +#: include/diogenes.admin.inc.php:71 include/diogenes.admin.inc.php:70 +#: include/diogenes.barrel.inc.php:337 +msgid "Administration" +msgstr "Administration" + +#: include/diogenes.rcs.inc.php:455 include/diogenes.rcs.inc.php:624 +#: include/admin/files.php:149 +msgid "diff to" +msgstr "skillnad från" + +#: include/diogenes.rcs.inc.php:459 include/diogenes.rcs.inc.php:628 +#: include/admin/files.php:153 +msgid "restore" +msgstr "återskapa" + +#: include/diogenes.admin.inc.php:63 include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:69 +msgid "Admin manual" +msgstr "Admin manual" + +msgid "Settings" +msgstr "Inställningar" + +#: include/diogenes.toplevel.inc.php:202 include/diogenes.admin.inc.php:67 +#: include/diogenes.toplevel.inc.php:97 include/diogenes.admin.inc.php:78 +#: include/diogenes.toplevel.inc.php:98 include/diogenes.admin.inc.php:77 +msgid "Users" +msgstr "Användare" + +#: include/diogenes.admin.inc.php:68 include/diogenes.admin.inc.php:80 +#: include/diogenes.admin.inc.php:79 +msgid "Content" +msgstr "Innehåll" + +#: include/diogenes.admin.inc.php:69 include/diogenes.admin.inc.php:81 +#: include/diogenes.admin.inc.php:80 +msgid "Pages catalog" +msgstr "Sidornas katalog" + +#: include/diogenes.admin.inc.php:70 include/diogenes.admin.inc.php:82 +#: include/diogenes.admin.inc.php:81 +msgid "Edit style sheet" +msgstr "Editera style sheet" + +#: include/diogenes.admin.inc.php:71 include/diogenes.admin.inc.php:83 +#: include/diogenes.admin.inc.php:82 +msgid "Edit menu" +msgstr "Editera menyen" + +#: include/diogenes.toplevel.inc.php:38 include/diogenes.toplevel.inc.php:39 +msgid "Toplevel administration" +msgstr "Huvudadministration" + +#: include/diogenes.page.inc.php:59 +msgid "Powered by Diogenes" +msgstr "Powered by Diogenes" + +#: include/diogenes.page.inc.php:213 include/diogenes.page.inc.php:216 +#: include/diogenes.page.inc.php:212 +msgid "The requested document was not found." +msgstr "Det efterfrågade dokumentet hittades inte." + +#: include/diogenes.toplevel.inc.php:188 include/diogenes.toplevel.inc.php:82 +#: include/diogenes.toplevel.inc.php:83 +msgid "User manual" +msgstr "Användarmanual" + +#: include/diogenes.toplevel.inc.php:191 include/diogenes.barrel.inc.php:304 +#: include/diogenes.toplevel.inc.php:85 include/diogenes.barrel.inc.php:335 +#: include/diogenes.toplevel.inc.php:86 include/diogenes.barrel.inc.php:331 +msgid "Preferences" +msgstr "Inställningar" + +#: include/diogenes.toplevel.inc.php:197 include/diogenes.toplevel.inc.php:91 +#: include/diogenes.toplevel.inc.php:92 +msgid "Sites" +msgstr "Sajter" + +#: include/diogenes.toplevel.inc.php:198 include/diogenes.toplevel.inc.php:92 +#: include/diogenes.toplevel.inc.php:93 +msgid "Root manual" +msgstr "Källmanual" + +#: htdocs/toplevel/index.php:8 include/diogenes.toplevel.inc.php:199 +#: htdocs/toplevel/index.php:11 include/diogenes.toplevel.inc.php:93 +#: htdocs/toplevel/index.php:16 include/diogenes.toplevel.inc.php:94 +msgid "List of sites" +msgstr "Lista över sajter" + +#: htdocs/toplevel/admins.php:7 +msgid "Site administrators" +msgstr "Sajtadministratörer" + +#: htdocs/toplevel/accounts.php:7 include/diogenes.toplevel.inc.php:203 +#: include/diogenes.toplevel.inc.php:98 include/diogenes.toplevel.inc.php:99 +msgid "User accounts" +msgstr "Användarkonton" + +#: include/diogenes.toplevel.inc.php:204 include/diogenes.toplevel.inc.php:99 +#: include/diogenes.toplevel.inc.php:100 +msgid "Browse user log" +msgstr "Bläddra igenom användarloggen" + +#: htdocs/toplevel/logger_actions.php:8 include/diogenes.toplevel.inc.php:205 +#: include/diogenes.toplevel.inc.php:100 include/diogenes.toplevel.inc.php:101 +msgid "Logger actions" +msgstr "Logghändelser" + +#: include/diogenes.page.inc.php:198 include/diogenes.page.inc.php:201 +#: include/diogenes.page.inc.php:197 +msgid "Diogenes error" +msgstr "Diogenes fel" + +#: include/diogenes.page.inc.php:199 include/diogenes.page.inc.php:202 +#: include/diogenes.page.inc.php:198 +msgid "Error" +msgstr "Fel" + +#: include/diogenes/diogenes.logger-view.inc.php:338 +#: include/diogenes/diogenes.logger-view.inc.php:337 +#: include/diogenes/diogenes.logger-view.inc.php:336 +msgid "view session" +msgstr "visa session" + +#: include/diogenes/diogenes.logger-view.inc.php:339 +#: include/diogenes/diogenes.logger-view.inc.php:338 +#: include/diogenes/diogenes.logger-view.inc.php:337 +msgid "user's log" +msgstr "användarens logg" + +#: htdocs/toplevel/logger.php:7 +msgid "User activity log" +msgstr "Användarens aktivitetslogg" + +#: htdocs/toplevel/accounts.php:17 htdocs/toplevel/boot.php:32 +msgid "permissions" +msgstr "tillåtelser" + +#: htdocs/toplevel/accounts.php:19 htdocs/toplevel/admins.php:46 +msgid "view log" +msgstr "visa logg" + +#: htdocs/toplevel/admins.php:9 +msgid "administrator" +msgstr "administratör" + +#: htdocs/toplevel/admins.php:10 htdocs/toplevel/index.php:11 +#: include/admin/files.php:50 include/admin/menus.php:220 +#: include/admin/pages.php:21 +#: include/diogenes/diogenes.logger-view.inc.php:378 +#: include/admin/files.php:52 include/admin/menus.php:219 +#: include/admin/pages.php:25 +#: include/diogenes/diogenes.logger-view.inc.php:375 +#: include/admin/files.php:49 include/admin/menus.php:231 +#: include/diogenes/diogenes.logger-view.inc.php:374 +msgid "actions" +msgstr "händelser" + +#: htdocs/toplevel/admins.php:43 +msgid "site users" +msgstr "sajtanvändare" + +#: htdocs/toplevel/admins.php:44 +msgid "demote to user" +msgstr "överlåt till användare" + +#: htdocs/toplevel/index.php:9 include/diogenes.barrel-editor.inc.php:151 +#: include/Barrel/Editor.php:158 +msgid "alias" +msgstr "alias" + +#: htdocs/toplevel/index.php:13 include/admin/options.php:62 +#: include/admin/options.php:64 include/diogenes.barrel-editor.inc.php:154 +#: include/admin/options.php:66 include/Barrel/Editor.php:161 +msgid "keywords" +msgstr "nyckelord" + +#: htdocs/toplevel/index.php:14 include/diogenes.barrel-editor.inc.php:155 +#: include/Barrel/Editor.php:162 +msgid "Create a new site" +msgstr "Skapa en ny sajt" + +#: htdocs/toplevel/index.php:17 include/diogenes.barrel-editor.inc.php:158 +#: include/Barrel/Editor.php:166 +msgid "vhost (see note)" +msgstr "vhost (se anteckning)" + +#: htdocs/toplevel/index.php:19 include/diogenes.barrel-editor.inc.php:160 +#: include/Barrel/Editor.php:168 +msgid "flags" +msgstr "flaggor" + +#: htdocs/toplevel/index.php:86 include/diogenes.barrel-editor.inc.php:45 +#: include/Barrel/Editor.php:47 +msgid "admin" +msgstr "admin" + +#: include/diogenes.admin.inc.php:65 include/diogenes.admin.inc.php:72 +#: include/diogenes.admin.inc.php:71 +msgid "Activity" +msgstr "Aktivitet" + +#: htdocs/toplevel/accounts.php:14 htdocs/toplevel/boot.php:29 +msgid "first name" +msgstr "förnamn" + +#: htdocs/toplevel/accounts.php:15 htdocs/toplevel/boot.php:30 +msgid "last name" +msgstr "efternamn" + +#: include/admin/compose.php:16 include/admin/edit.php:15 +#: include/diogenes.admin.inc.php:44 +msgid "Directory not found" +msgstr "Katalog hittades inte" + +#: include/admin/pages.php:19 include/admin/pages.php:23 +#: include/admin/files.php:57 +msgid "read access" +msgstr "läsbehörighet" + +#: include/admin/pages.php:20 include/admin/pages.php:24 +#: include/admin/files.php:58 +msgid "write access" +msgstr "skrivbehörighet" + +#: include/admin/pages.php:83 +msgid "world-writable pages are not allowed with PHP execution enabled!" +msgstr "världsskrivbara sidor är inte tillåtna med PHP exekvering påslagen!" + +#: include/diogenes.barrel.inc.php:314 include/diogenes.barrel.inc.php:345 +#: include/diogenes.barrel.inc.php:341 +msgid "Edit this page" +msgstr "Editera den här sidan" + +#: include/diogenes.barrel.inc.php:315 include/diogenes.barrel.inc.php:346 +#: include/diogenes.barrel.inc.php:342 +msgid "Raw editor" +msgstr "Raw editor" + +#: htdocs/toplevel/options.php:90 htdocs/toplevel/options_expert.php:56 +msgid "Convert" +msgstr "Konvertera" + +#: htdocs/toplevel/options.php:95 htdocs/toplevel/options_expert.php:61 +msgid "" +"You are currently using RCS as the version control system for your barrels." +msgstr "" +"Du använder för närvarande RCS som versionskontrollsystem för dina tunnor." + +#: htdocs/toplevel/options.php:96 htdocs/toplevel/options_expert.php:62 +msgid "You can switch to a full CVS repository by clicking here." +msgstr "" +"Du kan byta till en fullständig CVS-förvaringsplats genom att klicka här." + +#: htdocs/toplevel/options.php:100 htdocs/toplevel/options_expert.php:66 +msgid "" +"You are currently using CVS as the version control system for your barrels." +msgstr "" +"Du använder för närvarande CVS som versionskontrollsystem för dina tunnor." + +#: htdocs/toplevel/options.php:101 htdocs/toplevel/options_expert.php:67 +msgid "You can switch back to RCS by clicking here." +msgstr "Du kan byta tillbaka till RCS genom att klicka här." + +#: include/admin/files.php:44 include/admin/files.php:46 +#: include/admin/files.php:43 +msgid "file" +msgstr "fil" + +#: include/admin/files.php:46 include/admin/files.php:48 +#: include/admin/files.php:45 +msgid "version" +msgstr "version" + +#: include/admin/files.php:48 include/admin/files.php:50 +#: include/admin/files.php:47 +msgid "author" +msgstr "författare" + +#: include/admin/files.php:49 include/admin/files.php:51 +#: include/admin/files.php:48 +msgid "size" +msgstr "storlek" + +#: include/admin/pages.php:91 include/Barrel/Page.php:205 +#: include/Barrel/Page.php:248 +msgid "the page location cannot contain spaces or special characters" +msgstr "sidans plats kan inte innehålla mellanslag eller specialsymboler" + +#: include/admin/pages.php:95 include/Barrel/Page.php:212 +#: include/Barrel/Page.php:255 +msgid "this location cannot be used, it is reserved by Diogenes" +msgstr "platsen kan inte användas, den är reserverad av Diogenes" + +#: include/admin/files.php:45 include/admin/files.php:47 +#: include/admin/files.php:44 +msgid "log" +msgstr "logg" + +#: include/admin/menus.php:145 include/admin/menus.php:146 +#: include/admin/menus.php:158 +msgid "entry title" +msgstr "postens titel" + +#: include/admin/menus.php:146 include/admin/menus.php:147 +#: include/admin/menus.php:159 +msgid "type of link" +msgstr "typ av länk" + +#: include/admin/menus.php:218 include/admin/menus.php:217 +#: include/admin/menus.php:229 +msgid "menu name" +msgstr "menynamn" + +#: include/admin/menus.php:219 include/admin/menus.php:218 +#: include/admin/menus.php:230 +msgid "link" +msgstr "länk" + +#: htdocs/toplevel/options.php:80 htdocs/toplevel/options_expert.php:8 +#: include/diogenes.toplevel.inc.php:201 htdocs/toplevel/options.php:43 +#: include/diogenes.toplevel.inc.php:95 include/diogenes.toplevel.inc.php:96 +msgid "Global options" +msgstr "Globala valmöjligheter" + +msgid "menu options" +msgstr "menyvalmöjligheter" + +#: htdocs/toplevel/options.php:83 include/admin/options.php:69 +#: htdocs/toplevel/options.php:46 include/admin/options.php:71 +#: include/admin/options.php:73 +msgid "menu style" +msgstr "menystil" + +#: htdocs/toplevel/options.php:84 include/admin/options.php:70 +#: htdocs/toplevel/options.php:47 include/admin/options.php:72 +#: include/admin/options.php:74 +msgid "menu theme" +msgstr "menytema" + +#: htdocs/toplevel/options.php:91 htdocs/toplevel/options_expert.php:57 +msgid "version control system" +msgstr "versionskontrollssystem" + +#: include/admin/options.php:6 include/admin/options.php:7 +msgid "Site options" +msgstr "Sajtens valmöjligheter" + +#: include/admin/options.php:55 include/admin/options.php:57 +#: include/admin/options.php:59 +msgid "fully expanded" +msgstr "fullt expanderad" + +#: include/admin/options.php:71 include/admin/options.php:73 +#: include/admin/options.php:75 +msgid "minimum menu levels to expand" +msgstr "minimum menynivåer att expandera" + +#: include/diogenes.admin.inc.php:66 include/diogenes.admin.inc.php:73 +#: include/diogenes.admin.inc.php:72 +msgid "Options" +msgstr "Valmöjligheter" + +#: include/admin/options.php:59 include/admin/options.php:61 +#: include/admin/options.php:63 +msgid "general options" +msgstr "generella valmöjligheter" + +#: include/diogenes/diogenes.logger-view.inc.php:368 +#: include/diogenes/diogenes.logger-view.inc.php:365 +#: include/diogenes/diogenes.logger-view.inc.php:364 +msgid "session properties" +msgstr "sessionegenskaper" + +#: include/diogenes/diogenes.logger-view.inc.php:370 +#: include/diogenes/diogenes.logger-view.inc.php:367 +#: include/diogenes/diogenes.logger-view.inc.php:366 +msgid "host" +msgstr "värd" + +#: include/diogenes/diogenes.logger-view.inc.php:371 +#: include/diogenes/diogenes.logger-view.inc.php:368 +#: include/diogenes/diogenes.logger-view.inc.php:367 +msgid "browser" +msgstr "browser" + +#: include/diogenes/diogenes.logger-view.inc.php:374 +#: include/diogenes/diogenes.logger-view.inc.php:371 +#: include/diogenes/diogenes.logger-view.inc.php:370 +msgid "data" +msgstr "data" + +#: include/diogenes/diogenes.logger-view.inc.php:375 +#: include/diogenes/diogenes.logger-view.inc.php:372 +#: include/diogenes/diogenes.logger-view.inc.php:371 +msgid "filter by" +msgstr "sortera efter" + +#: include/diogenes/diogenes.logger-view.inc.php:376 +#: include/diogenes/diogenes.logger-view.inc.php:373 +#: include/diogenes/diogenes.logger-view.inc.php:372 +msgid "start" +msgstr "starta" + +#: include/diogenes/diogenes.logger-view.inc.php:377 +#: include/diogenes/diogenes.logger-view.inc.php:374 +#: include/diogenes/diogenes.logger-view.inc.php:373 +msgid "summary" +msgstr "summering" + +#: include/diogenes/diogenes.logger-view.inc.php:379 +#: include/diogenes/diogenes.logger-view.inc.php:376 +#: include/diogenes/diogenes.logger-view.inc.php:375 +msgid "year" +msgstr "år" + +#: include/diogenes/diogenes.logger-view.inc.php:380 +#: include/diogenes/diogenes.logger-view.inc.php:377 +#: include/diogenes/diogenes.logger-view.inc.php:376 +msgid "month" +msgstr "månad" + +#: include/diogenes/diogenes.logger-view.inc.php:381 +#: include/diogenes/diogenes.logger-view.inc.php:378 +#: include/diogenes/diogenes.logger-view.inc.php:377 +msgid "day" +msgstr "dag" + +#: include/diogenes/diogenes.table-editor.inc.php:525 +#: include/diogenes/diogenes.table-editor.inc.php:530 +msgid "id" +msgstr "id" + +#: include/diogenes/diogenes.table-editor.inc.php:527 +#: include/diogenes/diogenes.table-editor.inc.php:532 +msgid "create" +msgstr "skapa" + +#: include/diogenes/diogenes.table-editor.inc.php:530 +#: include/diogenes/diogenes.table-editor.inc.php:535 +msgid "new entry" +msgstr "nytt inlägg" + +#: include/diogenes/diogenes.table-editor.inc.php:531 +#: include/diogenes/diogenes.table-editor.inc.php:536 +msgid "existing entry" +msgstr "existerande inlägg" + +#: include/diogenes/diogenes.table-editor.inc.php:532 +#: include/diogenes/diogenes.table-editor.inc.php:537 +msgid "(blank = no change)" +msgstr "(blank = ingen förändring)" + +#: include/diogenes/diogenes.table-editor.inc.php:533 +#: include/diogenes/diogenes.table-editor.inc.php:538 +msgid "back" +msgstr "tillbaka" + +#: include/diogenes/diogenes.table-editor.inc.php:535 +#: include/diogenes/diogenes.table-editor.inc.php:540 +msgid "You are about to delete this entry. Do you want to proceed?" +msgstr "Du håller på att ta bort den här posten. Vill du fortsätta?" + +#: include/diogenes.session.inc.php:62 include/diogenes.session.inc.php:71 +msgid "Authentication error!" +msgstr "Autenticeringsfel!" + +#: include/admin/files.php:84 include/admin/files.php:93 +#: include/admin/files.php:102 include/admin/pages.php:158 +#: include/admin/compose.php:57 include/admin/edit.php:49 +#: include/admin/files.php:114 include/admin/files.php:122 +#: include/admin/files.php:154 include/admin/pages.php:124 +#: include/admin/compose.php:61 include/admin/edit.php:53 +#: include/admin/plugins.php:23 include/admin/files.php:61 +#: include/admin/pages.php:122 +msgid "Page" +msgstr "Sida" + +#: include/admin/files.php:86 include/admin/files.php:95 +#: include/admin/pages.php:172 include/admin/compose.php:63 +#: include/admin/edit.php:55 include/admin/files.php:115 +#: include/admin/files.php:123 include/admin/pages.php:136 +#: include/admin/compose.php:62 include/admin/edit.php:54 +#: include/admin/files.php:122 include/admin/files.php:161 +#: include/admin/pages.php:123 +msgid "File" +msgstr "Fil" + +#: htdocs/toplevel/index.php:15 include/diogenes.barrel-editor.inc.php:156 +#: include/Barrel/Editor.php:163 +msgid "The site alias may only contain letters, numbers and underscores." +msgstr "" +"Alias för sajten får endast bestå av bokstäver, siffror och understreck." + +#: htdocs/toplevel/index.php:18 include/diogenes.barrel-editor.inc.php:159 +#: include/Barrel/Editor.php:167 +msgid "" +"vhost note: If you intend to serve this site from a virtualhost, you " +"should enter the name of the virtualhost in this field." +msgstr "" +"vhost anmärkning: Om sajten kommer att användas från en virtualhost, " +"så måste du fylla i namnet på virtualhost i detta fält." + +#: htdocs/toplevel/index.php:55 +msgid "PHP execution" +msgstr "PHP-exekvering" + +#: htdocs/toplevel/index.php:55 include/diogenes.barrel-editor.inc.php:106 +#: include/Barrel/Editor.php:113 +msgid "custom templates" +msgstr "egna mallar" + +msgid "template options" +msgstr "mallvalmöjligheter" + +#: htdocs/toplevel/options.php:85 include/admin/options.php:66 +#: htdocs/toplevel/options.php:48 include/admin/options.php:68 +#: include/admin/options.php:70 +msgid "templates directory" +msgstr "mallkatalog" + +#: htdocs/toplevel/options.php:86 include/admin/options.php:67 +#: htdocs/toplevel/options.php:49 include/admin/options.php:69 +#: include/admin/options.php:71 +msgid "default template" +msgstr "standardmall" + +#: include/admin/compose.php:56 include/admin/edit.php:46 +#: include/admin/compose.php:58 include/admin/edit.php:48 +msgid "log message" +msgstr "loggmeddelande" + +#: include/admin/options.php:63 include/admin/options.php:65 +#: include/admin/options.php:67 +msgid "favicon" +msgstr "favicon" + +#: include/admin/options.php:64 include/admin/options.php:66 +#: include/admin/options.php:68 +msgid "(relative url to a PNG image)" +msgstr "(relativ sökväg till en PNG bildfil)" + +#: include/admin/pages.php:17 include/admin/files.php:57 +#: include/admin/pages.php:21 include/admin/files.php:54 +#: include/admin/pages.php:20 +msgid "page template" +msgstr "sidmall" + +#: include/admin/pages.php:18 include/admin/files.php:58 +#: include/admin/pages.php:22 include/admin/files.php:55 +#: include/admin/pages.php:21 +msgid "status" +msgstr "status" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "under construction" +msgstr "under konstruktion" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "disabled" +msgstr "inaktiverad" + +#: include/admin/pages.php:184 include/admin/pages.php:169 +#: include/admin/pages.php:167 +msgid "archived" +msgstr "arkiverad" + +#: include/diogenes.barrel.inc.php:152 include/diogenes.barrel.inc.php:153 +#: include/diogenes.barrel.inc.php:155 +msgid "This page is currently under construction." +msgstr "Sidan är för närvarande under konstruktion." + +#: include/diogenes.barrel.inc.php:156 include/diogenes.barrel.inc.php:157 +#: include/diogenes.barrel.inc.php:159 +msgid "This page is currently unavailable." +msgstr "Sidan är för närvarande otillgänglig." + +#: include/diogenes.admin.inc.php:63 include/diogenes.admin.inc.php:70 +#: include/diogenes.admin.inc.php:69 +msgid "http://diogenes-doc.polytechnique.org/en-admin/" +msgstr "http://diogenes-doc.polytechnique.org/en-admin/" + +#: include/diogenes.toplevel.inc.php:188 include/diogenes.toplevel.inc.php:82 +#: include/diogenes.toplevel.inc.php:83 +msgid "http://diogenes-doc.polytechnique.org/en-user/" +msgstr "http://diogenes-doc.polytechnique.org/en-user/" + +#: include/diogenes.toplevel.inc.php:198 include/diogenes.toplevel.inc.php:92 +#: include/diogenes.toplevel.inc.php:93 +msgid "http://diogenes-doc.polytechnique.org/en-root/" +msgstr "http://diogenes-doc.polytechnique.org/en-root/" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "Mode" +msgstr "" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +#, fuzzy +msgid "standard" +msgstr "starta" + +#: htdocs/toplevel/options.php:81 htdocs/toplevel/options_expert.php:9 +#: htdocs/toplevel/options.php:44 +msgid "expert" +msgstr "" + +#: htdocs/toplevel/options.php:82 include/admin/options.php:65 +#: htdocs/toplevel/options.php:45 include/admin/options.php:67 +#: include/admin/options.php:69 +#, fuzzy +msgid "display options" +msgstr "mallvalmöjligheter" + +#: htdocs/toplevel/options.php:87 htdocs/toplevel/options.php:50 +#, fuzzy +msgid "system options" +msgstr "Sajtens valmöjligheter" + +msgid "Initial user setup" +msgstr "" + +#: htdocs/toplevel/boot.php:11 +msgid "" +"Sorry, this feature is only available using native Diogenes authentication." +msgstr "" + +#: htdocs/toplevel/boot.php:19 +msgid "The database is already configured." +msgstr "" + +#: htdocs/toplevel/options_expert.php:13 htdocs/toplevel/options_expert.php:75 +#: htdocs/toplevel/options_expert.php:76 +#, fuzzy +msgid "option" +msgstr "Valmöjligheter" + +#: htdocs/toplevel/options_expert.php:14 htdocs/toplevel/options_expert.php:76 +#: htdocs/toplevel/options_expert.php:77 +msgid "value" +msgstr "" + +#: include/admin/menus.php:221 include/admin/menus.php:220 +#: include/admin/menus.php:232 +msgid "Menu" +msgstr "" + +#: include/diogenes.page.inc.php:65 include/diogenes.page.inc.php:66 +msgid "debugging" +msgstr "" + +#: include/diogenes.page.inc.php:66 include/diogenes.page.inc.php:67 +msgid "call trace" +msgstr "" + +#: include/diogenes.page.inc.php:67 include/diogenes.page.inc.php:68 +msgid "database trace" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:59 +#: include/diogenes/diogenes.logger-view.inc.php:85 +#: include/diogenes/diogenes.logger-view.inc.php:130 +#: include/diogenes/diogenes.logger-view.inc.php:183 +#: include/diogenes/diogenes.logger-view.inc.php:58 +#: include/diogenes/diogenes.logger-view.inc.php:84 +#: include/diogenes/diogenes.logger-view.inc.php:129 +#: include/diogenes/diogenes.logger-view.inc.php:182 +msgid "all" +msgstr "" + +#: include/diogenes/diogenes.logger-view.inc.php:363 +#: include/diogenes/diogenes.logger-view.inc.php:360 +#: include/diogenes/diogenes.logger-view.inc.php:359 +msgid "Please select a year and/or a user." +msgstr "" + +#: include/diogenes/diogenes.table-editor.inc.php:523 +#: include/diogenes/diogenes.table-editor.inc.php:528 +#, fuzzy +msgid "previous page" +msgstr "visa sida" + +#: include/diogenes/diogenes.table-editor.inc.php:524 +#: include/diogenes/diogenes.table-editor.inc.php:529 +#, fuzzy +msgid "next page" +msgstr "visa sida" + +#: htdocs/toplevel/boot.php:7 +msgid "Initial setup" +msgstr "" + +#: htdocs/toplevel/boot.php:46 +msgid "The initial setup of the database was performed successfuly." +msgstr "" + +#: include/admin/options.php:47 include/admin/options.php:49 +#: include/admin/options.php:51 +#, fuzzy +msgid "no" +msgstr "ingen" + +#: include/admin/options.php:47 include/admin/options.php:49 +#: include/admin/options.php:51 +msgid "yes" +msgstr "" + +#: include/admin/options.php:68 include/admin/options.php:70 +#: include/admin/options.php:72 +#, fuzzy +msgid "hide Diogenes menu" +msgstr "Sajtens menyer" + +#: include/admin/prefs.php:28 +#, fuzzy +msgid "account preferences" +msgstr "Diogenes inställningar" + +#: htdocs/toplevel/plugins.php:19 +msgid "Barrel plugins" +msgstr "" + +#: htdocs/toplevel/plugins.php:21 +#, fuzzy +msgid "Global plugin settings" +msgstr "Globala valmöjligheter" + +#: htdocs/toplevel/plugins.php:38 +#, php-format +msgid "Rebuilding plugin cache for barrel '%s'" +msgstr "" + +#: htdocs/toplevel/plugins.php:47 +msgid "Clean plugins database" +msgstr "" + +#: htdocs/toplevel/plugins.php:48 +msgid "" +"If you are having problems with references to plugins that no longer exist, " +"you can have Diogenes remove such entries from the database." +msgstr "" + +#: htdocs/toplevel/plugins.php:49 +msgid "Clean" +msgstr "" + +#: htdocs/toplevel/plugins.php:51 +msgid "Enable or disable plugins" +msgstr "" + +#: htdocs/toplevel/plugins.php:54 +msgid "You can select the plugins you want to enable for this barrel." +msgstr "" + +#: htdocs/toplevel/plugins.php:56 +msgid "" +"You can select the plugins you want to enable or disable globally, that is " +"the plugins that can be used in the different barrels. Please note that for " +"a plugin to be accessible from a barrel, you will need to activate that " +"plugin for the barrel. To do this, from the List of sites click on " +"'plugins' next to the barrel of your choice." +msgstr "" + +#: htdocs/toplevel/options.php:52 +#, fuzzy +msgid "Word document import" +msgstr "Importera ett Worddokument" + +#: include/admin/files.php:39 +#, fuzzy +msgid "File operations" +msgstr "Sajtens valmöjligheter" + +#: include/admin/files.php:43 include/admin/files.php:40 +#, fuzzy +msgid "Create an empty file" +msgstr "Skapa en ny sajt" + +#: include/admin/files.php:44 include/admin/files.php:41 +msgid "Copy or move a file" +msgstr "" + +#: include/admin/files.php:45 include/admin/files.php:42 +#, fuzzy +msgid "Create" +msgstr "skapa" + +#: include/admin/files.php:53 include/admin/files.php:50 +msgid "to" +msgstr "" + +#: include/admin/files.php:59 +#, fuzzy +msgid "read" +msgstr "skapa" + +#: include/admin/files.php:60 +#, fuzzy +msgid "write" +msgstr "sajt" + +#: include/admin/files.php:67 include/admin/files.php:69 +#, fuzzy +msgid "Creating empty file" +msgstr "Tar bort fil" + +#: include/admin/files.php:69 include/admin/files.php:71 +msgid "The specified file already exists!" +msgstr "" + +#: include/admin/files.php:155 include/admin/pages.php:160 +#: include/admin/plugins.php:22 include/admin/files.php:194 +#: include/admin/pages.php:156 include/Barrel/Page.php:170 +#, fuzzy +msgid "home" +msgstr "Hemma" + +#: include/admin/files.php:182 include/admin/files.php:224 +msgid "Copy" +msgstr "" + +#: include/admin/files.php:182 include/admin/files.php:224 +#, fuzzy +msgid "Move" +msgstr "ta bort" + +#: include/admin/pages.php:18 include/admin/pages.php:17 +#: include/Barrel/Page.php:171 +#, fuzzy +msgid "parent page" +msgstr "visa sida" + +#: include/admin/webdav.php:7 include/diogenes.admin.inc.php:79 +#: include/diogenes.admin.inc.php:78 +msgid "WebDAV" +msgstr "" + +#: include/admin/webdav.php:9 include/admin/webdav.php:11 +msgid "" +"You can access your barrel's files using WebDAV by pointing your WebDAV " +"client to the following address." +msgstr "" + +#: include/admin/plugins.php:22 +msgid "Page plugins " +msgstr "" + +#: include/admin/plugins.php:26 +msgid "Available plugins" +msgstr "" + +#: include/diogenes.page.inc.php:69 include/diogenes.barrel-editor.inc.php:50 +#: include/diogenes.barrel-editor.inc.php:106 include/Barrel/Page.php:126 +#: include/Barrel/Page.php:152 include/diogenes.plugin-editor.inc.php:237 +#: include/Barrel/Page.php:150 include/Barrel/Page.php:178 +#: include/Barrel/Editor.php:52 include/Barrel/Editor.php:113 +#: include/Plugin/Editor.php:266 include/diogenes.page.inc.php:68 +msgid "plugins" +msgstr "" + +#: include/diogenes.toplevel.inc.php:96 include/diogenes.admin.inc.php:76 +#: include/diogenes.toplevel.inc.php:97 include/diogenes.admin.inc.php:75 +msgid "Plugins" +msgstr "" + +#: include/Barrel/Page.php:70 include/Barrel/Page.php:89 +msgid "Not deleting page, it has child pages!" +msgstr "" + +#: include/Barrel/File.php:76 include/Barrel/File.php:94 +#, fuzzy +msgid "rename" +msgstr "användarnamn" + +#: include/diogenes.plugin-editor.inc.php:236 include/Plugin/Editor.php:265 +#, fuzzy +msgid "plugin" +msgstr "länk" + +#: include/diogenes.plugin-editor.inc.php:239 include/Plugin/Editor.php:268 +#, fuzzy +msgid "parameters" +msgstr "egenskaper" + +#: include/admin/files.php:192 +msgid "Document" +msgstr "" + +#: include/admin/index.php:52 +#, fuzzy +msgid "barrel options" +msgstr "Globala valmöjligheter" + +#: include/admin/index.php:57 +#, fuzzy +msgid "barrel plugins" +msgstr "Globala valmöjligheter" + +#: include/admin/index.php:68 +#, fuzzy +msgid "page removed" +msgstr "sidan skapad" + +#: include/admin/index.php:80 +#, fuzzy +msgid "page plugins" +msgstr "länk" + +#: include/admin/index.php:92 +#, fuzzy +msgid "file deleted" +msgstr "sidan borttagen" + +#: include/admin/webdav.php:14 +msgid "" +"In order to access your barrel's files using WebDAV, please ask your " +"Diogenes administrator to enable this feature in the Diogenes configuration " +"file." +msgstr "" + +#: include/Barrel/Page.php:81 +#, fuzzy +msgid "Deleting page" +msgstr "Tar bort fil" + +#: include/Barrel/Page.php:176 +#, fuzzy +msgid "add a page" +msgstr "Lägg till en sida" + +#: include/Barrel/Page.php:266 +#, fuzzy +msgid "Creating new page" +msgstr "Tar bort fil" + +#: include/Barrel/Editor.php:165 +msgid "no barrels available" +msgstr "" + +#: htdocs/toplevel/index.php:13 +msgid "" +"Warning : in order to make use of virtual hosts or WebDAV, you need to set " +"$globals->rooturl to a full URL starting with http:// or https:// in your " +"Diogenes configuration file." +msgstr "" diff --git a/style.css b/style.css new file mode 100644 index 0000000..f9cbc22 --- /dev/null +++ b/style.css @@ -0,0 +1,43 @@ +/* insert your CSS customisations below */ + +body { + background-color: #60a5e0; + color: inherit; +} + +.menu .item a { + background-color: #4080c0; + color: inherit; +} + +.menu .item a.odd { + background-color: #4590d0; + color: inherit; +} + +.menu .item a:hover { + background-color: #3050d0; + color: white; +} + +.menu .item a.top { + background-color: #2050a0; + color: white; +} + +/* table class 'light' */ +table.light { + border-collapse: collapse; + background-color: #edf8ff; + border: 2px solid #2050a0; + color: black; +} + +table.light tr.odd { + background-color: #90c0e0; +} + +table.light th { + background-color: #2050a0; + color: white; +} diff --git a/templates/admin-edit.tpl b/templates/admin-edit.tpl new file mode 100644 index 0000000..f4a2305 --- /dev/null +++ b/templates/admin-edit.tpl @@ -0,0 +1,24 @@ +
+ + + + + + + + + + + + + + +
{$source}
+ +
+ {$msg_log} + + +
+ +
diff --git a/templates/admin-ekit.tpl b/templates/admin-ekit.tpl new file mode 100644 index 0000000..a1bec39 --- /dev/null +++ b/templates/admin-ekit.tpl @@ -0,0 +1,60 @@ +{literal} + +{/literal} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ {$msg_log} + + +
+ +
diff --git a/templates/admin-files.tpl b/templates/admin-files.tpl new file mode 100644 index 0000000..cc9a515 --- /dev/null +++ b/templates/admin-files.tpl @@ -0,0 +1,36 @@ +{if $canedit} +
+ + + + + + + + + + + + + + + + +
{$msg_import}
+ + {$msg_copy_or_move} + + {html_options name='file_action' options=$fileops selected=$smarty.request.file_action} + + {$msg_fileop_to} + {html_options name='fileop_ddir' options=$fileop_ddirs selected=$smarty.request.fileop_ddir} +
{$msg_create}
+
+{/if} + +{include file='page-browser.tpl'} + diff --git a/templates/admin-index.tpl b/templates/admin-index.tpl new file mode 100644 index 0000000..bac68e0 --- /dev/null +++ b/templates/admin-index.tpl @@ -0,0 +1,17 @@ + + + + + + + +{foreach from=$events item=myevent} + + + + + + + +{/foreach} +
 {$msg_date}{$msg_user}{$msg_event}
{if $myevent.icon}{else} {/if}{$myevent.stamp|date_format:"%Y-%m-%d %H:%M:%S"}{$myevent.username}{a lnk=$myevent.desc}{$myevent.file}
diff --git a/templates/admin-kafenio.tpl b/templates/admin-kafenio.tpl new file mode 100644 index 0000000..d60339b --- /dev/null +++ b/templates/admin-kafenio.tpl @@ -0,0 +1,68 @@ +{literal} + +{/literal} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ {$msg_log} + + +
+ +
diff --git a/templates/admin-menus.tpl b/templates/admin-menus.tpl new file mode 100644 index 0000000..7c8c57f --- /dev/null +++ b/templates/admin-menus.tpl @@ -0,0 +1,98 @@ +{if $doedit} + +{* we are in editor mode *} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$msg_prop}
{$msg_title} + +
{$msg_type} + + {$msg_type_z} +
  + + {$msg_type_pi} + + +
  + + {$msg_type_se} + + +
+ + +
+ +
+ +{else} + +{* we are viewing the list *} + +

{$msg_ext}

+ +

{$msg_menubar} : {toolbar lnk=$menubar}

+ + + + + + + + +{counter start=0 assign=cnt print=0} +{foreach from=$entries item=entry} + + + + + + + +{counter} +{/foreach} +
 {$msg_menu}{$msg_link}{$msg_actions}
{$entry[0]}{a lnk=$entry[1]}{$entry[2]} + {a lnk=$entry[3] class='action'} + {a lnk=$entry[4] class='action'} + + {a lnk=$entry[5] class='action'} + {a lnk=$entry[6] class='action'} +
+ +
+ +
+ + + +
+ +{/if} diff --git a/templates/admin-options.tpl b/templates/admin-options.tpl new file mode 100644 index 0000000..4d3b8d6 --- /dev/null +++ b/templates/admin-options.tpl @@ -0,0 +1,64 @@ +
+ + + + + + + + + + + + + + + + + + + + + +
{$msg_general_options}
{$msg_title}
{$msg_description}
{$msg_keywords}
{$msg_favicon} {$msg_favicon_hint}
+ +
+ + + + + +{if $template_dirs} + + + + +{/if} + + + + + + + + +{if $menu_themes} + + + + +{/if} + + + + + + + + +
{$msg_display_options}
{$msg_site_template_dir}{html_options name='template_dir' selected=$template_dir options=$template_dirs}
{$msg_site_template}{html_options name='template' selected=$template options=$templates}
{$msg_menu_style}{html_options name='menu_style' selected=$menu_style options=$menu_styles}
{$msg_menu_theme}{html_options name='menu_theme' selected=$menu_theme options=$menu_themes}
{$msg_menu_min_level}{html_options name='menu_min_level' selected=$menu_min_level options=$menu_levels}
{$msg_menu_hide_diogenes}{html_options name='menu_hide_diogenes' selected=$menu_hide_diogenes options=$menu_hide_diogeness}
+ +

+ +

+
diff --git a/templates/admin-prefs.tpl b/templates/admin-prefs.tpl new file mode 100644 index 0000000..f7fe7c4 --- /dev/null +++ b/templates/admin-prefs.tpl @@ -0,0 +1,19 @@ + + + + + + + +
{$msg_lang}
+ {$msg_lang_blab} +
    +{foreach key=key item=item from=$langs} +
  • {$item}
  • +{/foreach} +
+
+ +

+ {$msg_global_prefs} +

diff --git a/templates/admin-revs.tpl b/templates/admin-revs.tpl new file mode 100644 index 0000000..af3f77b --- /dev/null +++ b/templates/admin-revs.tpl @@ -0,0 +1,69 @@ +{if $diff} + +
+ + + + +{foreach from=$diff item=mydiff} + + + + + + + + +{/foreach} +
differences between {$smarty.request.r1} and {$smarty.request.r2}
[ {$smarty.request.r1} - {$mydiff[0]} ][ {$smarty.request.r2} - {$mydiff[2]} ]
{diff block=$mydiff[3] op=$mydiff[1]}{diff block=$mydiff[4] op=$mydiff[1]}
+
+ +{else} + +{literal} + +{/literal} + +
+ + + + +
+ + + + + + + + + +{counter start=0 assign=cnt print=0} +{foreach from=$entries item=entry} + + + + + + + +{counter} +{/foreach} +
{$msg_version}{$msg_date}{$msg_author}{$msg_log}{$msg_actions}
{$entry[0]}{$entry[1]}{$entry[2]}{$entry[3]} + {foreach from=$entry[4] item=myaction} + {a lnk=$myaction class="action"} + {/foreach} +
+ +{/if} diff --git a/templates/admin-users.tpl b/templates/admin-users.tpl new file mode 100644 index 0000000..93d4936 --- /dev/null +++ b/templates/admin-users.tpl @@ -0,0 +1,36 @@ +

{$msg_users}

+ +
+ + + + + +{foreach from=$users item=myuser} + + + + +{/foreach} + + + +
{$user}{$action}
{$myuser[0]} ({$myuser[1]}){a lnk=$myuser[2]}
+ + {html_options name="auth" options=$auths} + +
+
+ +

{$msg_admins}

+ + + + + +{foreach from=$admins item=myuser} + + + +{/foreach} +
{$user}
{$myuser[0]} ({$myuser[1]})
diff --git a/templates/admin-webdav.tpl b/templates/admin-webdav.tpl new file mode 100644 index 0000000..c2255bf --- /dev/null +++ b/templates/admin-webdav.tpl @@ -0,0 +1,7 @@ +

+ {$msg_webdav} +

+ +
+{$url_webdav}
+
\ No newline at end of file diff --git a/templates/barrel-editor.tpl b/templates/barrel-editor.tpl new file mode 100644 index 0000000..2c839c9 --- /dev/null +++ b/templates/barrel-editor.tpl @@ -0,0 +1,111 @@ +{if $action eq "edit"} + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$target}
{$msg_title}
{$msg_desc}
{$msg_keywords}
{$msg_vhost}
{$msg_flags}{html_checkboxes name="flags" options=$v_flag_opts selected=$v_flags}
+ +
+
+ +

+ {$msg_vhost_note} +

+ +{else} + +{if !$readonly} +{literal} + +{/literal} + +
+ + +
+{/if} + + + +{if !$readonly} + +{/if} + + + + +{if $sites} +{counter start=0 assign=cnt print=0} +{foreach from=$sites item=mysite} + +{if !$readonly} + +{/if} + + + +{counter} +{/foreach} +{else} + + + +{/if} +
{$msg_alias}{$msg_title}{$msg_desc} 
{$mysite.alias}{a lnk=$mysite.title}{$mysite.description} + {foreach from=$mysite.actions item=action} + {a lnk=$action class="action"} + {/foreach} +
{$msg_no_barrels}
+ +{if !$readonly} +
+ +

+ {$msg_create} : +

+

+ {$msg_create_note} +

+
+{/if} + +{/if} diff --git a/templates/footer.tpl b/templates/footer.tpl new file mode 100644 index 0000000..3445629 --- /dev/null +++ b/templates/footer.tpl @@ -0,0 +1,14 @@ + + + + + + + diff --git a/templates/header.tpl b/templates/header.tpl new file mode 100644 index 0000000..ab1e3a9 --- /dev/null +++ b/templates/header.tpl @@ -0,0 +1,22 @@ +{include file='header/head.tpl'} +{if $banner}{include file=$banner}{/if} + +{include file='header/debug.tpl'} + + + +{include file='header/sidebar.tpl'} + +
+{if $greeting}

{$greeting}

{/if} + +{include file='header/toolbar.tpl'} +{include file='header/status.tpl'} + + diff --git a/templates/header/debug.tpl b/templates/header/debug.tpl new file mode 100644 index 0000000..2da63bb --- /dev/null +++ b/templates/header/debug.tpl @@ -0,0 +1,49 @@ +{if $db_trace or $call_trace or $plugins_trace} +{literal} + +{/literal} +
+
{$msg_debug_bar}
+{if $db_trace} + +{/if} +{if $call_trace} + +{/if} +{if $plugins_trace} + +{/if} +
+{/if} diff --git a/templates/header/head.tpl b/templates/header/head.tpl new file mode 100644 index 0000000..01992d6 --- /dev/null +++ b/templates/header/head.tpl @@ -0,0 +1,14 @@ + + + +{$site}{if $page} - {$page}{/if} +{foreach from=$head item=mytag} +{$mytag} +{/foreach} +{if ($menustyle==1 or $menustyle==2)} +{include file='header/phplayersmenu.tpl'} +{/if} + + diff --git a/templates/header/phplayersmenu.tpl b/templates/header/phplayersmenu.tpl new file mode 100644 index 0000000..dadfea1 --- /dev/null +++ b/templates/header/phplayersmenu.tpl @@ -0,0 +1,28 @@ + + +{if $menustyle==1} + +{else} + +{/if} diff --git a/templates/header/sidebar.tpl b/templates/header/sidebar.tpl new file mode 100644 index 0000000..b38dde6 --- /dev/null +++ b/templates/header/sidebar.tpl @@ -0,0 +1,3 @@ + diff --git a/templates/header/status.tpl b/templates/header/status.tpl new file mode 100644 index 0000000..570dc94 --- /dev/null +++ b/templates/header/status.tpl @@ -0,0 +1,7 @@ +{if $status} +
+{foreach from=$status item=mystatus}
+{$mystatus}
+{/foreach}
+
+{/if} diff --git a/templates/header/toolbar.tpl b/templates/header/toolbar.tpl new file mode 100644 index 0000000..0ddcc76 --- /dev/null +++ b/templates/header/toolbar.tpl @@ -0,0 +1,7 @@ +{if $toolbars} +
    +{foreach from=$toolbars item=mybar} +
  • {$mybar.title} : {toolbar lnk=$mybar.items}
  • +{/foreach} +
+{/if} diff --git a/templates/index.tpl b/templates/index.tpl new file mode 100644 index 0000000..4bcaba8 --- /dev/null +++ b/templates/index.tpl @@ -0,0 +1,9 @@ +

+ {$about} +

+ +

+ {$available} : +

+ +{$viewer_content} \ No newline at end of file diff --git a/templates/login.tpl b/templates/login.tpl new file mode 100644 index 0000000..76f5440 --- /dev/null +++ b/templates/login.tpl @@ -0,0 +1,59 @@ + +{literal} + +{/literal} + +
+ + + + + + + + + + + + + + + + +
{$msg_connexion}
{$msg_username}
{$msg_password}
 
+
+ + +
+ + + +
+ + diff --git a/templates/master.tpl b/templates/master.tpl new file mode 100644 index 0000000..a1142a4 --- /dev/null +++ b/templates/master.tpl @@ -0,0 +1,6 @@ +{include file='header.tpl'} + +{if $page_template}{include file=$page_template}{/if} +{if $page_content}{$page_content}{/if} + +{include file='footer.tpl'} diff --git a/templates/page-browser.tpl b/templates/page-browser.tpl new file mode 100644 index 0000000..b7f3292 --- /dev/null +++ b/templates/page-browser.tpl @@ -0,0 +1,92 @@ +{literal} + +{/literal} + +
+ + + + +
+ + +{if $childpages} + + + + + + +{counter start=0 assign=cnt print=0} +{foreach from=$childpages item=page} + + + + + + +{counter} +{/foreach} +{/if} +{if $childfiles} + + + + + + + + +{counter start=0 assign=cnt print=0} +{foreach from=$childfiles item=entry} + + + + + + + + +{counter} +{/foreach} +{/if} +
{$msg_location}{$msg_access}{$msg_title}{$msg_actions}
+ + {if $page.location==''}home{else}{$page.location}{/if} + {$msg_read_perms} : {$page.perms}{$msg_write_perms} : {$page.wperms}{$page.title|escape} +{foreach from=$page.actions item=action} +{a lnk=$action class="action"} +{/foreach} +
{$msg_file}{$msg_version}{$msg_date}{$msg_author}{$msg_size}{$msg_actions}
{a lnk=$entry.file}{a lnk=$entry.rev}{$entry.date}{$entry.author}{$entry.size} +{foreach from=$entry.actions item=lnk} +{a lnk=$lnk class="action" title=$lnk[0]} +{/foreach} +
diff --git a/templates/page-properties.tpl b/templates/page-properties.tpl new file mode 100644 index 0000000..ec7d915 --- /dev/null +++ b/templates/page-properties.tpl @@ -0,0 +1,126 @@ +
+ + + + + + +{if $page_obj.parent} + + + + +{else} + +{/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$msg_properties}
{$msg_parent} + {html_options name='pedit_parent' options=$parent_opts selected=$page_obj.parent} +
{$msg_location} + {if $page_obj.PID && $page_obj.location==''} + home + {else} + + {/if} +
{$msg_title}
{$msg_page_template}{html_options name='pedit_template' selected=$page_obj.template options=$templates}
{$msg_status} + {html_options name='pedit_status' options=$status_opts selected=$page_obj.status} +
{$msg_read_perms} + +
{$msg_write_perms} + +
+
+ +{if $smarty.request.dir} + +{if $word} + + + + + + + + +
{$word}
+

+ {$wordblab} +

+{if $wordfile} +

+ {$wordfile} : {a lnk=$wordlnk} +

+{/if} +

+ {$wordsend} +

+
+ + + + +
+
+ +{/if} + +{if !$wordfile} +
+ + + + + + + + +{/if} +
{$html}
+

+ {$htmlblab} +

+

+ {$htmlstrip} +

+
+ + + + +
+
+ +{/if} diff --git a/templates/plugin-editor.tpl b/templates/plugin-editor.tpl new file mode 100644 index 0000000..14155d5 --- /dev/null +++ b/templates/plugin-editor.tpl @@ -0,0 +1,74 @@ +{if !$readonly} +{literal} + +{/literal} + +
+ + + + +{/if} + +
+{foreach from=$plugins key=plugtype item=plugarr} + + + + +{counter start=0 assign=cnt print=0} +{foreach from=$plugarr item=plug} + + + + +{if !$readonly && $show_params} + +{/if} + +{counter} +{/foreach} +
{$plugtype} {$msg_plugedit_plugins}
+ + +
{if !$readonly} {/if}{$plug.name} v{$plug.version}
+{if !$readonly} + {$msg_move_up} {$msg_move_down} +{/if} +
+
{$plug.description}
+
+ +{foreach from=$plug.params key=key item=val} + + + + +{/foreach} +
{$key}
+
+
+{/foreach} +
+ +{if !$readonly} +

+ +

+
+{/if} diff --git a/templates/prefs.tpl b/templates/prefs.tpl new file mode 100644 index 0000000..4ab5fc6 --- /dev/null +++ b/templates/prefs.tpl @@ -0,0 +1,80 @@ + + + + + + + + + + + + +
{$msg_myinfo}
{$msg_username}{$username}
{$msg_fullname}{$fullname}
+ +
+ + + + + + + + +
{$msg_lang}
+ {$msg_lang_blab} +
    +{foreach key=key item=item from=$langs} +
  • {$item}
  • +{/foreach} +
+
+ +{if $native} + +{literal} + +{/literal} + +
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + +
{$msg_mypassword}
{$msg_password}
{$msg_confirmation}
 
+
+ +{/if} diff --git a/templates/toplevel-admins.tpl b/templates/toplevel-admins.tpl new file mode 100644 index 0000000..d8c5576 --- /dev/null +++ b/templates/toplevel-admins.tpl @@ -0,0 +1,34 @@ +
+ + + + + + +{foreach from=$entries item=entry} + + + + + +{/foreach} + + + + +
{$msg_site}{$msg_admin}{$msg_actions}
{$entry[1]}{$entry[3]} ({$entry[2]}) + {foreach from=$entry[4] item=myaction} + {a class="action" lnk=$myaction} + {/foreach} +
+ + + + + +
+
diff --git a/templates/toplevel-boot.tpl b/templates/toplevel-boot.tpl new file mode 100644 index 0000000..e69de29 diff --git a/templates/toplevel-options.tpl b/templates/toplevel-options.tpl new file mode 100644 index 0000000..f4d8647 --- /dev/null +++ b/templates/toplevel-options.tpl @@ -0,0 +1,68 @@ +
+ + + + + + + + + +{if $menu_themes} + + + + +{/if} + + + + + + + + + + + + +
{$msg_display_options}
{$msg_menu_style}{html_options name='menu_style' selected=$menu_style options=$menu_styles}
{$msg_menu_theme}{html_options name='menu_theme' selected=$menu_theme options=$menu_themes}
{$msg_site_template_dir}
{$msg_site_template}{html_options name='template' selected=$template options=$templates}
{$msg_validate_pages}
+ +
+ + + + + + + + + + + + + +
{$msg_system_options}
{$msg_html_editor}{html_options name='html_editor' selected=$html_editor options=$html_editors}
{$msg_word_import}{html_options name='word_import' selected=$word_import options=$word_imports}
+ +
+ + + + + + + + + + + + + +
{$msg_debug_options}
{$msg_debug_database}
{$msg_debug_plugins}
+ +

+ +

+ +
+ diff --git a/templates/toplevel-options_expert.tpl b/templates/toplevel-options_expert.tpl new file mode 100644 index 0000000..3c6f090 --- /dev/null +++ b/templates/toplevel-options_expert.tpl @@ -0,0 +1,23 @@ +{$editor_content} + +
+ + + + + + + + +{foreach from=$conversions item="conv"} + + + +{/foreach} +
{$msg_vcs}
{$msg_current_vcs}
+
+ {$conv[1]} + + +
+
\ No newline at end of file diff --git a/templates/toplevel-plugins.tpl b/templates/toplevel-plugins.tpl new file mode 100644 index 0000000..ba28cfa --- /dev/null +++ b/templates/toplevel-plugins.tpl @@ -0,0 +1,18 @@ +{if 0 && !$plug_barrel} +

{$msg_clean_database}

+ +
+ +

+ {$msg_clean_database_text} + +

+
+{/if} + +

{$msg_enable_disable}

+

+ {$msg_enable_disable_text} +

+ +{$editor_content} \ No newline at end of file diff --git a/templates/toplevel-sites.tpl b/templates/toplevel-sites.tpl new file mode 100644 index 0000000..585b554 --- /dev/null +++ b/templates/toplevel-sites.tpl @@ -0,0 +1,5 @@ +{if $msg_information} +

{$msg_information}

+{/if} + +{$sites_content} diff --git a/testing/DBTest.php b/testing/DBTest.php new file mode 100644 index 0000000..e626edd --- /dev/null +++ b/testing/DBTest.php @@ -0,0 +1,96 @@ +getMessage()."\n".$DB->getUserInfo()."\n"); + } + + $this->assertEquals($tables, $DB->getCol('show tables')); + } +} + +class DiogenesDatabaseTest extends PHPUnit_TestCase +{ + function testConstructor() + { + $DB = new DiogenesDatabase('localhost', 'test', 'test', ''); + + $this->assertTrue(is_object($DB)); + } + + function testErrors() + { + $db = new DiogenesDatabase('tst', 'localhost', 'test', ''); + + $this->assertTrue($db->err()); + $this->assertEquals(1049, $db->errno()); + $this->assertEquals("Unknown database 'tst'", $db->error()); + + $db->ResetError(); + $this->assertFalse($db->err()); + $this->assertEquals(0, $db->errno()); + $this->assertEquals('', $db->error()); + + } + + function testMoreErrors() + { + $db = new DiogenesDatabase('test', 'localhost', 'test', ''); + + $this->assertFalse($db->err(), "Should be no error"); + + $db->query("SLECT"); + + $this->assertTrue($db->err(), "Should be error"); + $this->assertEquals(1064, $db->errno()); + $this->assertEquals("You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SLECT' at line 1", $db->error()); + $this->assertEquals("SLECT", $db->errinfo()); + + $db->ResetError(); + $this->assertEquals('', $db->errinfo()); + } +} diff --git a/testing/DiogenesLoggerViewTest.php b/testing/DiogenesLoggerViewTest.php new file mode 100644 index 0000000..621f495 --- /dev/null +++ b/testing/DiogenesLoggerViewTest.php @@ -0,0 +1,140 @@ +database_error_fatal = true; + $globals->db = new DiogenesDatabase('test', 'localhost', 'test', ''); + $globals->db->_fatal = true; + + if ($globals->db->err()) + { + echo "DB err: " . $globals->db->error() . "\n"; + } + + $this->o = new DiogenesLoggerView(); + } + + function testConstructor() + { + global $globals; + + $this->assertEquals($this->o->dbh, $globals->db); + $this->assertTrue(is_a($this->o->dbh, 'diogenesdatabase')); + } + + function test_getAuths() + { + global $globals; + $globals->table_log_sessions = 'diogenes_logsessions'; + + $this->assertEquals(array(0 => __('all'), 'native' => 'native', 'external' => 'external'), $this->o->_getAuths()); + + $globals->db->query("CREATE TABLE logsesh (auth enum('x', 'y', 'z', 'heh'))"); + $this->assertFalse($globals->db->err()); + + $globals->table_log_sessions = 'logsesh'; + $this->assertEquals(array(0 => __('all'), 'x' => 'x', 'y' => 'y', 'z' => 'z', 'heh' => 'heh'), $this->o->_getAuths()); + } + + function test_getDays() + { + global $globals; + + $rows[] = "DELETE FROM diogenes_logsessions"; + $rows[] = "INSERT INTO diogenes_logsessions (start) + VALUES (20040215000000)"; + $rows[] = "INSERT INTO diogenes_logsessions (start) + VALUES (20040315000000)"; + $rows[] = "INSERT INTO diogenes_logsessions (start) + VALUES (20040415000000)"; + BulkQueries($rows); + + $globals->table_log_sessions = 'diogenes_logsessions'; + + $febdays[0] = __('all'); + $mardays[0] = __('all'); + $aprdays[0] = __('all'); + + // Febdays should be 16 to 29 (leap year), mardays should be + // all month, and aprdays should be up to and including + // the 15th. + + for ($i = 1; $i < 16; $i++) + { + $aprdays[$i] = $mardays[$i] = $i; + } + + for ($i = 15; $i < 30; $i++) + { + $mardays[$i] = $febdays[$i] = $i; + } + + $mardays[30] = 30; + $mardays[31] = 31; + + $this->assertTrue(checkdate(2,29,2004), "Checkdate giving dodgy results"); + $this->assertEquals(array(), $this->o->_getDays(2003, 1)); + $this->assertEquals(array(), $this->o->_getDays(2003, 3)); + $this->assertEquals(array(), $this->o->_getDays(2003, 6)); + $this->assertEquals(array(), $this->o->_getDays(2004, 1)); + $this->assertEquals($febdays, $this->o->_getDays(2004, 2)); + $this->assertEquals($mardays, $this->o->_getDays(2004, 3)); + $this->assertEquals($aprdays, $this->o->_getDays(2004, 4)); + $this->assertEquals(array(), $this->o->_getDays(2004, 6)); + $this->assertEquals(array(), $this->o->_getDays(2005, 1)); + $this->assertEquals(array(), $this->o->_getDays(2005, 3)); + $this->assertEquals(array(), $this->o->_getDays(2005, 8)); + } + + function test_getMonths() + { + global $globals; + + $rows[] = "DELETE FROM diogenes_logsessions"; + $rows[] = "INSERT INTO diogenes_logsessions (start) + VALUES (20020401000000)"; + $rows[] = "INSERT INTO diogenes_logsessions (start) + VALUES (20030401000000)"; + $rows[] = "INSERT INTO diogenes_logsessions (start) + VALUES (20040401000000)"; + BulkQueries($rows); + + $this->assertEquals(array(), $this->o->_getMonths(2001)); + $this->assertEquals(array(0=>__('all'), 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, + 9=>9, 10=>10, 11=>11, 12=>12), + $this->o->_getMonths(2002)); + $this->assertEquals(array(0=>__('all'), 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, + 7=>7, 8=>8, 9=>9, 10=>10, 11=>11, 12=>12), + $this->o->_getMonths(2003)); + $this->assertEquals(array(0=>__('all'), 1=>1, 2=>2, 3=>3, 4=>4), + $this->o->_getMonths(2004)); + $this->assertEquals(array(), $this->o->_getMonths(2005)); + } + + function test_getYears() + { + global $globals; + + $rows[] = "DELETE FROM diogenes_logsessions"; + $rows[] = "INSERT INTO diogenes_logsessions (start) + VALUES (20020401000000)"; + $rows[] = "INSERT INTO diogenes_logsessions (start) + VALUES (20040401000000)"; + BulkQueries($rows); + + $this->assertEquals(array(0=>__('all'), 2002=>2002, 2003=>2003, 2004=>2004), + $this->o->_getYears()); + + } +} diff --git a/testing/InternalTest.php b/testing/InternalTest.php new file mode 100644 index 0000000..7635e6f --- /dev/null +++ b/testing/InternalTest.php @@ -0,0 +1,26 @@ +PHPUnit_TestCase($name); + } + + function testInternal() + { + $this->assertEquals('xyz', 'xyz'); + $this->assertNull(NULL, "Aiee! It's not null!"); + $this->assertNotNull('notnull', "Aiee! It's null!"); + $this->assertTrue(true, "Feck! It's false!"); + +/* if (!method_exists($this, 'assertSubStr')) + { + die("You need a version of PHPUnit which supports assertSubStr. Apply\nassert.patch to your PHPUnit code. Hassle Matt if this makes no sense.\n"); + } +*/ + } +} + diff --git a/testing/README b/testing/README new file mode 100644 index 0000000..1e01ab1 --- /dev/null +++ b/testing/README @@ -0,0 +1,165 @@ +Unit Testing for Diogenes +=========================== + +Unit testing is the process of writing lots of little pieces of test code +which each test some part of the functionality of a software system. By +having a comprehensive set of test cases which are satisfied by the +production code, we can have real confidence in our software, instead of +just "hoping" it works. + +What is a unit test? +---------------------- + +The general structure of all unit tests is as follows: + +* Setup pre-conditions (the state of the system prior to the execution of the + code under test) +* Run the code to be tested, giving it all applicable arguments +* Validate that the code ran correctly by examining the state of the system + after the code under test has run, and ensuring that it has done + what it should have done. + +The pre-conditions are normally either set at the beginning of the test +method, or in a general method called setUp() (see below for the structure +of test code). + +Running the code itself is normally making a call to the function to +be tested, constructing an object, or, for Web applications, running the +top-level web script (using require()). + +Validating the post-run state of the system is done by examining the +database, system files, and script output, and using various assert methods +to communicate the success or failure of various tests to the user. + +Testing Web applications such as Diogenes is relatively easy, especially the +user interface side of things. + +Unlike traditional GUI applications, every state change of a web application +is defined by the database and filesystem, the user's session, and the +values passed from the web browser through $_REQUEST and $_SERVER. Since +all of these aspects are relatively easy to control, setting the pre-run +state of the application is quite simple. There are also relatively few +discrete states that your web application can be in, because all of the +system control has to be made through the constrained interface above. + +Testing post-conditions, as well, is simple. If you want to ensure that a +certain thing is part of the post-run display, you can just interrogate the +HTML output from the test run, which is all text and can be tested with +assertRegExp() and assertSubStr(). Again, the only state available is in +the user's session, database, and filesystem, all of which are easy to +interrogate. + +Test cases and test methods +----------------------------- + +(This is where things get a bit hairy -- hold on, and perhaps read it twice) + +A test case is a collection of tests which are related in some way. Each +test case is represented in our testing framework by a class subclassed from +PHPUnit_TestCase. Each test is a method on the test case whose name starts +with 'test'. You should name the tests appropriately from there. + +Test cases can have a couple of special methods defined on them, called +setUp() and tearDown(). The first method is called before each of the test +methods is called, and the second is called after each test method has run. + +The setUp() and tearDown() methods are the primary reason for grouping test +methods together. Methods should, as much as possible, grouped into test +cases with common setUp() and tearDown() requirements. + +So how do I write a Unit Test? +------------------------------- + +Put together a snippet of code which sets up the state of the application, +then run the code to be tested, and check the result. This snippet of code +should be placed in a test case in a method named test[Something](). Each +test method takes no arguments and returns nothing. + +Have a look at the existing test code in the testing/ directory of the +diogenes source distribution for examples of how to write test code. + +When you create a new test case, you need to tell the test code runner that +it needs to run the new test code. There is an array in the alltests script +which defines the files and test cases to be run. Each key in the array +specifies a filename to be read (without the .php extension), while the +value associated with the key is an array of class names in that file. + +What should I test? +--------------------- + +The naive answer would be "everything". However, that is impractical. +There are just too many things that could be tested for a policy of "test +everything" to allow any actual code to be written. + +It helps to think of tests as pulls of the handle on a poker machine. Each +pull costs you something (some time to write it). You "win" when a test +that you expected to pass fails, or when a test you expected to fail passes. +You lose when a test gives you no additional useful feedback. You want to +maximise your winnings. + +So, write tests that demonstrate something new and different about the +operation of the system. Before you write any production code, write a test +which defines how you want the system to act in order to pass the test. Run +the test suite, verify that the test fails. Now, modify the production code +just enough so the test passes. If you want the system to do something that +can't be expressed in one test, write multiple tests, each one interspersed +with some production development to satisfy *just* *that* new test. This +is, in my experience, the best way to ensure that you have good test +coverage, whilst minimising the production of tests which add no value to +the system. + +How do I retro-fit unit testing onto an existing codebase? +------------------------------------------------------------ + +Diogenes already has a significant amount of code written, which would take +hundreds of tests to cover completely. There is little point in going back +and writing tests for all of this functionality. It appears to work well +enough, so we should just leave it as-is. + +However, from now on, every time you want to make some modification (whether +it be a refactoring, a bug fix, or a feature addition), write one or more +test cases which demonstrate your desired result: + +Refactoring: Write tests surrounding the functionality you intend to + refactor. Show the test cases accurately represent the desired + functionality of the system by ensuring they all run properly. Then + perform the refactoring, ensuring you haven't broken anything by + making sure the tests all still run properly. + +Bug fix: Write one or more tests which shows the bug in action -- in other + words, it hits the bug, and produces erroneous results. Then modify + the system so that the test passes. You can be confident that + you've fixed the bug, because you have concrete feedback in the form + of your test suite that the bug no longer exists. + +Feature addition: Put together some tests which invoke the feature you want + to add, and test that the feature is working as it should. + Naturally, these tests will fail at first, because the feature + doesn't exist. But you then modify the production code to make the + feature work, and you stop when your tests all pass. + +Over time, as old code gets modified, the percentage of code covered by the +tests will increase, and eventually we will have a comprehensively tested +piece of software. + +During modifications, if you manage to break something accidentally, write a +test to show the breakage and fix it from there. If you broke it once, +there's a good chance it'll break again when someone else modifies it, and +there should be a test to immediately warn the programmer that they've +broken something. + +How do I run the unit tests? +------------------------------ + +The primary script that executes all of the unit tests is the 'alltests' +script in the testing/ directory of the distribution. However, the output +of this script is one line for every test that passes or fails. + +To help highlight the test failures, there is a 'run' script, which filters +out all of the passes, and only shows you the failures. Very useful. + +So, your regular test run will be done with ./run, but if you want to see a +thousand passes, run ./alltests. Both of these should be run from the +testing/ directory. Running it from elsewhere isn't likely to get good +results. + diff --git a/testing/TestHelpers.php b/testing/TestHelpers.php new file mode 100644 index 0000000..f542734 --- /dev/null +++ b/testing/TestHelpers.php @@ -0,0 +1,18 @@ +db->query($q); + if ($globals->db->err()) + { + die($globals->db->error()."\n".$globals->db->errinfo()."\n"); + } + } +} diff --git a/testing/alltests b/testing/alltests new file mode 100755 index 0000000..dcf1de0 --- /dev/null +++ b/testing/alltests @@ -0,0 +1,39 @@ +#!/usr/bin/php4 -Cq + array('InternalTest'), + 'DBTest' => array('DBInitialTest', + 'DiogenesDatabaseTest'), + 'DiogenesLoggerViewTest' => array('DiogenesLoggerViewTest') + ); + +global $TESTING; +$TESTING=true; +chdir('..'); + +error_reporting(E_ALL); +ini_set('include_path', 'include:testing:'.ini_get('include_path')); + +require_once 'PHPUnit.php'; + +foreach ($testfiles as $file => $tests) +{ + require_once "$file.php"; + + echo "Now running tests from $file.php...\n"; + + $suite = new PHPUnit_TestSuite(); + + foreach ($tests as $test) + { + $suite->addTestSuite($test); + } + + $result = PHPUnit::run($suite); + + echo $result->toString(); +} + +echo "All Tests Complete\n"; diff --git a/testing/assert.patch b/testing/assert.patch new file mode 100644 index 0000000..d2e9737 --- /dev/null +++ b/testing/assert.patch @@ -0,0 +1,92 @@ +--- Assert.php.orig 2004-06-09 15:52:13.000000000 +1000 ++++ Assert.php 2004-06-09 15:55:10.000000000 +1000 +@@ -240,6 +240,89 @@ + } + + /** ++ * Asserts that the actual string does not match a given ++ * regular expression. ++ * ++ * @param string ++ * @param string ++ * @param string ++ * @access public ++ * @author Sébastien Hordeaux ++ * @author Matthew Palmer ++ */ ++ function assertNotRegExp($expected, $actual, $message = '') { ++ $message = sprintf( ++ '%sexpected %s, actual %s', ++ ++ !empty($message) ? $message . ' ' : '', ++ $expected, ++ $actual ++ ); ++ ++ if (preg_match($expected, $actual)) { ++ return $this->fail($message); ++ } ++ } ++ ++ /** ++ * Asserts that the expected string is contained somewhere within the ++ * data string given. ++ * ++ * @param string ++ * @param string ++ * @param string ++ * @access public ++ * @author Matthew Palmer ++ */ ++ function assertSubStr($needle, $haystack, $message = '') ++ { ++ if (empty($message)) ++ { ++ $message = sprintf( ++ '"%s" not found in "%s"', ++ $expected, ++ $actual ++ ); ++ } ++ ++ if (substr_count($haystack, $needle) == 0) ++ { ++ return $this->fail($message); ++ } ++ ++ return $this->pass(); ++ } ++ ++ /** ++ * Asserts that the expected string is not contained anywhere within the ++ * data string given. ++ * ++ * @param string ++ * @param string ++ * @param string ++ * @access public ++ * @author Matthew Palmer ++ */ ++ function assertNotSubStr($needle, $haystack, $message = '') ++ { ++ if (empty($message)) ++ { ++ $message = sprintf( ++ '"%s" found in "%s"', ++ $expected, ++ $actual ++ ); ++ } ++ ++ if (substr_count($haystack, $needle) > 0) ++ { ++ return $this->fail($message); ++ } ++ ++ return $this->pass(); ++ } ++ ++ /** + * Asserts that a variable is of a given type. + * + * @param string $expected diff --git a/testing/run b/testing/run new file mode 100755 index 0000000..17e8235 --- /dev/null +++ b/testing/run @@ -0,0 +1,5 @@ +#!/bin/sh -e + +./alltests | grep -v '() passed$' + +echo -- 2.1.4