summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rw-r--r--README2
-rw-r--r--_cs/DokuWiki/DokuWikiCodingStandard.php78
-rw-r--r--_cs/DokuWiki/Sniffs/NamingConventions/ConstructorNameSniff.php85
-rw-r--r--_cs/DokuWiki/Sniffs/PHP/DeprecatedFunctionsSniff.php61
-rw-r--r--_cs/DokuWiki/Sniffs/PHP/DiscouragedFunctionsSniff.php4
-rw-r--r--_cs/DokuWiki/ruleset.xml64
-rw-r--r--_test/README166
-rw-r--r--_test/bootstrap.php112
-rw-r--r--_test/cases/inc/DifferenceEngine.test.php31
-rw-r--r--_test/cases/inc/auth_aclcheck.test.php231
-rw-r--r--_test/cases/inc/auth_admincheck.test.php132
-rw-r--r--_test/cases/inc/common_pagetemplate.test.php19
-rw-r--r--_test/cases/inc/html_hilight.test.php104
-rw-r--r--_test/cases/inc/indexer_idx_indexlengths.test.php60
-rw-r--r--_test/cases/inc/mail_send.php49
-rw-r--r--_test/cases/inc/parser/lexer.group.php21
-rw-r--r--_test/cases/inc/parser/lexer.test.php625
-rw-r--r--_test/cases/inc/parser/parser.group.php34
-rw-r--r--_test/cases/inc/parser/parser.inc.php53
-rw-r--r--_test/cases/inc/parser/parser_formatting.test.php434
-rw-r--r--_test/cases/inc/parser/xhtml_htmlphp.test.php203
-rw-r--r--_test/cases/inc/parser/xhtml_links.test.php239
-rw-r--r--_test/conf/acl.auth.php27
-rw-r--r--_test/conf/local.php10
-rw-r--r--_test/conf/plugins.local.php8
-rw-r--r--_test/conf/users.auth.php12
-rw-r--r--_test/core/DokuWikiTest.php117
-rw-r--r--_test/core/TestRequest.php155
-rw-r--r--_test/core/TestResponse.php55
-rw-r--r--_test/core/TestUtils.php70
-rw-r--r--_test/core/phpQuery-onefile.php5702
-rw-r--r--_test/data/_dummy (renamed from _test/cases/inc/search/data/ns1/ns3/page3.txt)0
-rw-r--r--_test/data/attic/_dummy (renamed from _test/cases/inc/search/data/ns1/page1.txt)0
-rw-r--r--_test/data/cache/_dummy (renamed from _test/cases/inc/search/data/ns1/page2.txt)0
-rw-r--r--_test/data/index/_dummy (renamed from _test/cases/inc/search/data/ns2/nopage.ext)0
-rw-r--r--_test/data/locks/_dummy (renamed from _test/cases/inc/search/data/ns2/page1.txt)0
-rw-r--r--_test/data/media/wiki/dokuwiki-128.pngbin0 -> 33615 bytes
-rw-r--r--_test/data/media_attic/_dummy0
-rw-r--r--_test/data/media_meta/_dummy0
-rw-r--r--_test/data/meta/_dummy0
-rw-r--r--_test/data/pages/wiki/dokuwiki.txt64
-rw-r--r--_test/data/pages/wiki/syntax.txt486
-rw-r--r--_test/data/tmp/_dummy0
-rw-r--r--_test/debug.note4
-rw-r--r--_test/index.php228
-rw-r--r--_test/jslint.js89
-rw-r--r--_test/lib/cli_reporter.php114
-rw-r--r--_test/lib/mock_functions.php519
-rw-r--r--_test/lib/rss_writer_class.php369
-rw-r--r--_test/lib/testmanager.php579
-rw-r--r--_test/lib/unittest.php5
-rw-r--r--_test/lib/web.inc.php47
-rw-r--r--_test/lib/xml_writer_class.php292
-rw-r--r--_test/phpunit.xml26
-rwxr-xr-x_test/remotetests.php163
-rw-r--r--_test/rss2html.xsl110
-rwxr-xr-x_test/runtests.php187
-rw-r--r--_test/tests.css27
-rw-r--r--_test/tests.ini12
-rw-r--r--_test/tests/conf/title.test.php19
-rw-r--r--_test/tests/inc/auth_aclcheck.test.php267
-rw-r--r--_test/tests/inc/auth_admincheck.test.php126
-rw-r--r--_test/tests/inc/auth_nameencode.test.php (renamed from _test/cases/inc/auth_nameencode.test.php)17
-rw-r--r--_test/tests/inc/auth_password.test.php (renamed from _test/cases/inc/auth_password.test.php)42
-rw-r--r--_test/tests/inc/blowfish.test.php33
-rw-r--r--_test/tests/inc/cache_stalecheck.test.php27
-rw-r--r--_test/tests/inc/common_cleanText.test.php21
-rw-r--r--_test/tests/inc/common_clientip.test.php (renamed from _test/cases/inc/common_clientip.test.php)42
-rw-r--r--_test/tests/inc/common_obfuscate.test.php (renamed from _test/cases/inc/common_obfuscate.test.php)10
-rw-r--r--_test/tests/inc/common_pagetemplate.test.php15
-rw-r--r--_test/tests/inc/common_wl.test.php148
-rw-r--r--_test/tests/inc/events_nested.test.php36
-rw-r--r--_test/tests/inc/form_form.test.php (renamed from _test/cases/inc/form_form.test.php)19
-rw-r--r--_test/tests/inc/html_hilight.test.php132
-rw-r--r--_test/tests/inc/httpclient_http.test.php195
-rw-r--r--_test/tests/inc/httpclient_https.test.php15
-rw-r--r--_test/tests/inc/indexer_histogram.test.php19
-rw-r--r--_test/tests/inc/init_fullpath.test.php (renamed from _test/cases/inc/init_fullpath.test.php)9
-rw-r--r--_test/tests/inc/init_getbaseurl.test.php (renamed from _test/cases/inc/init_getbaseurl.test.php)28
-rw-r--r--_test/tests/inc/input.test.php233
-rw-r--r--_test/tests/inc/ixr_library_date.test.php (renamed from _test/cases/inc/IXR_Library_date.test.php)5
-rw-r--r--_test/tests/inc/ixr_library_ixr_message.test.php (renamed from _test/cases/inc/IXR_Library_IXR_Message.test.php)49
-rw-r--r--_test/tests/inc/json.test.php418
-rw-r--r--_test/tests/inc/mail_isvalid.test.php (renamed from _test/cases/inc/mail_isvalid.test.php)9
-rw-r--r--_test/tests/inc/mail_quoted_printable_encode.test.php (renamed from _test/cases/inc/mail_quoted_printable_encode.php)16
-rw-r--r--_test/tests/inc/mailer.test.php94
-rw-r--r--_test/tests/inc/pageutils_clean_id.test.php (renamed from _test/cases/inc/pageutils_clean_id.test.php)20
-rw-r--r--_test/tests/inc/pageutils_findnearest.test.php40
-rw-r--r--_test/tests/inc/pageutils_getid.test.php (renamed from _test/cases/inc/pageutils_getid.test.php)20
-rw-r--r--_test/tests/inc/pageutils_resolve_id.test.php (renamed from _test/cases/inc/pageutils_resolve_id.test.php)6
-rw-r--r--_test/tests/inc/pageutils_resolve_pageid.test.php (renamed from _test/cases/inc/pageutils_resolve_pageid.test.php)13
-rw-r--r--_test/tests/inc/parser/lexer.test.php531
-rw-r--r--_test/tests/inc/parser/parser.inc.php29
-rw-r--r--_test/tests/inc/parser/parser_eol.test.php (renamed from _test/cases/inc/parser/parser_eol.test.php)26
-rw-r--r--_test/tests/inc/parser/parser_footnote.test.php (renamed from _test/cases/inc/parser/parser_footnote.test.php)36
-rw-r--r--_test/tests/inc/parser/parser_headers.test.php (renamed from _test/cases/inc/parser/parser_headers.test.php)60
-rw-r--r--_test/tests/inc/parser/parser_i18n.test.php (renamed from _test/cases/inc/parser/parser_i18n.test.php)16
-rw-r--r--_test/tests/inc/parser/parser_links.test.php (renamed from _test/cases/inc/parser/parser_links.test.php)102
-rw-r--r--_test/tests/inc/parser/parser_lists.test.php (renamed from _test/cases/inc/parser/parser_lists.test.php)28
-rw-r--r--_test/tests/inc/parser/parser_preformatted.test.php (renamed from _test/cases/inc/parser/parser_preformatted.test.php)28
-rw-r--r--_test/tests/inc/parser/parser_quote.test.php (renamed from _test/cases/inc/parser/parser_quote.test.php)26
-rw-r--r--_test/tests/inc/parser/parser_quotes.test.php (renamed from _test/cases/inc/parser/parser_quotes.test.php)32
-rw-r--r--_test/tests/inc/parser/parser_replacements.test.php (renamed from _test/cases/inc/parser/parser_replacements.test.php)47
-rw-r--r--_test/tests/inc/parser/parser_table.test.php (renamed from _test/cases/inc/parser/parser_table.test.php)30
-rw-r--r--_test/tests/inc/parser/parser_unformatted.test.php (renamed from _test/cases/inc/parser/parser_unformatted.test.php)14
-rw-r--r--_test/tests/inc/parserutils_set_metadata_during_rendering.test.php (renamed from _test/cases/inc/parserutils_set_metadata_during_rendering.test.php)16
-rw-r--r--_test/tests/inc/remote.test.php330
-rw-r--r--_test/tests/inc/safefn.test.php (renamed from _test/cases/inc/safefn.test.php)12
-rw-r--r--_test/tests/inc/search/data/ns1/ns3/page3.txt0
-rw-r--r--_test/tests/inc/search/data/ns1/page1.txt0
-rw-r--r--_test/tests/inc/search/data/ns1/page2.txt0
-rw-r--r--_test/tests/inc/search/data/ns2/nopage.ext0
-rw-r--r--_test/tests/inc/search/data/ns2/page1.txt0
-rw-r--r--_test/tests/inc/search/search.test.php (renamed from _test/cases/inc/search/search.test.php)9
-rw-r--r--_test/tests/inc/subscription_set.test.php20
-rw-r--r--_test/tests/inc/template_sidebar.test.php40
-rw-r--r--_test/tests/inc/utf8_basename.test.php91
-rw-r--r--_test/tests/inc/utf8_correctidx.test.php (renamed from _test/cases/inc/utf8_correctidx.test.php)11
-rw-r--r--_test/tests/inc/utf8_html.test.php (renamed from _test/cases/inc/utf8_html.test.php)24
-rw-r--r--_test/tests/inc/utf8_kanaromaji.txt (renamed from _test/cases/inc/utf8_kanaromaji.txt)0
-rw-r--r--_test/tests/inc/utf8_romanize.test.php (renamed from _test/cases/inc/utf8_romanize.test.php)11
-rw-r--r--_test/tests/inc/utf8_stripspecials.test.php (renamed from _test/cases/inc/utf8_stripspecials.test.php)5
-rw-r--r--_test/tests/inc/utf8_substr.test.php (renamed from _test/cases/inc/utf8_substr.test.php)7
-rw-r--r--_test/tests/inc/utf8_unicode.test.php (renamed from _test/cases/inc/utf8_unicode.test.php)20
-rw-r--r--_test/tests/inc/utf8_utf16be.test.php (renamed from _test/cases/inc/utf8_utf16be.test.php)8
-rw-r--r--_test/tests/lib/exe/css_css_compress.test.php (renamed from _test/cases/lib/exe/css_css_compress.test.php)19
-rw-r--r--_test/tests/lib/exe/css_css_loadfile.test.php (renamed from _test/cases/lib/exe/css_css_loadfile.test.php)6
-rw-r--r--_test/tests/lib/exe/js_js_compress.test.php (renamed from _test/cases/lib/exe/js_js_compress.test.php)83
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes1-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes1-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes2-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes2-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentMultiline-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentMultiline-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentMultiline-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentMultiline-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentSingleLine-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-CommentSingleLine-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-IfThenElseBraces-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-IfThenElseBraces-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-IfThenElseNoBraces-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-IfThenElseNoBraces-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-RegexpBackslash-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-RegexpBackslash-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpSimple-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-RegexpSimple-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpSimple-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-RegexpSimple-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpString-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-RegexpString-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpString-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-RegexpString-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-StatementDoWhile-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-StatementDoWhile-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementForIn-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-StatementForIn-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementForIn-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-StatementForIn-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementNew-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-StatementNew-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementNew-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-StatementNew-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-StatementSwitchCase-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-StatementSwitchCase-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-StringDoubleQuotes-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-StringDoubleQuotes-out.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-in.js (renamed from _test/cases/lib/exe/js_js_compress/test-StringSingleQuotes-in.js)0
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-out.js (renamed from _test/cases/lib/exe/js_js_compress/test-StringSingleQuotes-out.js)0
-rw-r--r--_test/tests/test/basic.test.php105
-rw-r--r--_test/tests/test/globals.test.php49
-rw-r--r--_test/tests/test/hooks.test.php24
-rw-r--r--_test/tests/test/phpquery.test.php18
-rw-r--r--_test/tests/test/plugins.test.php32
-rw-r--r--_test/tests/test/plugins_defaults.test.php24
-rw-r--r--_test/tests/test/reset.test.php38
-rw-r--r--_test/tests/test/scope.test.php49
-rwxr-xr-x_test/webtest-stripper.sh41
-rwxr-xr-xbin/dwpage.php2
-rw-r--r--conf/dokuwiki.php174
-rw-r--r--conf/mime.conf1
-rw-r--r--conf/plugins.php6
-rw-r--r--conf/users.auth.php.dist2
-rw-r--r--data/_dummy1
-rw-r--r--data/deleted.files17
-rw-r--r--data/pages/wiki/syntax.txt8
-rw-r--r--doku.php58
-rw-r--r--feed.php349
-rw-r--r--inc/DifferenceEngine.php81
-rw-r--r--inc/HTTPClient.php483
-rw-r--r--inc/IXR_Library.php11
-rw-r--r--inc/Input.class.php263
-rw-r--r--inc/JSON.php27
-rw-r--r--inc/JpegMeta.php6
-rw-r--r--inc/Mailer.class.php658
-rw-r--r--inc/PassHash.class.php303
-rw-r--r--inc/RemoteAPICore.php777
-rw-r--r--inc/SafeFN.class.php23
-rw-r--r--inc/Sitemapper.php61
-rw-r--r--inc/TarLib.class.php8
-rw-r--r--inc/ZipLib.class.php4
-rw-r--r--inc/actions.php84
-rw-r--r--inc/adLDAP.php2422
-rw-r--r--inc/adLDAP/adLDAP.php951
-rw-r--r--inc/adLDAP/classes/adLDAPComputers.php153
-rw-r--r--inc/adLDAP/classes/adLDAPContacts.php294
-rw-r--r--inc/adLDAP/classes/adLDAPExchange.php390
-rw-r--r--inc/adLDAP/classes/adLDAPFolders.php179
-rw-r--r--inc/adLDAP/classes/adLDAPGroups.php631
-rw-r--r--inc/adLDAP/classes/adLDAPUsers.php682
-rw-r--r--inc/adLDAP/classes/adLDAPUtils.php264
-rw-r--r--inc/adLDAP/collections/adLDAPCollection.php137
-rw-r--r--inc/adLDAP/collections/adLDAPComputerCollection.php46
-rw-r--r--inc/adLDAP/collections/adLDAPContactCollection.php46
-rw-r--r--inc/adLDAP/collections/adLDAPGroupCollection.php46
-rw-r--r--inc/adLDAP/collections/adLDAPUserCollection.php46
-rw-r--r--inc/auth.php724
-rw-r--r--inc/cache.php10
-rw-r--r--inc/changelog.php20
-rw-r--r--inc/cliopts.php10
-rw-r--r--inc/common.php947
-rw-r--r--inc/config_cascade.php5
-rw-r--r--inc/confutils.php14
-rw-r--r--inc/events.php10
-rw-r--r--inc/farm.php148
-rw-r--r--inc/feedcreator.class.php4
-rw-r--r--inc/form.php5
-rw-r--r--inc/fulltext.php11
-rw-r--r--inc/geshi.php115
-rw-r--r--inc/geshi/4cs.php2
-rw-r--r--inc/geshi/6502acme.php230
-rw-r--r--inc/geshi/6502kickass.php241
-rw-r--r--inc/geshi/6502tasm.php189
-rw-r--r--inc/geshi/68000devpac.php168
-rw-r--r--inc/geshi/abap.php2
-rw-r--r--inc/geshi/actionscript.php2
-rw-r--r--inc/geshi/actionscript3.php6
-rw-r--r--inc/geshi/ada.php2
-rw-r--r--inc/geshi/algol68.php329
-rw-r--r--inc/geshi/apache.php5
-rw-r--r--inc/geshi/applescript.php2
-rw-r--r--inc/geshi/apt_sources.php12
-rw-r--r--inc/geshi/arm.php3318
-rw-r--r--inc/geshi/asm.php536
-rw-r--r--inc/geshi/asp.php2
-rw-r--r--inc/geshi/asymptote.php194
-rw-r--r--inc/geshi/autoconf.php2
-rw-r--r--inc/geshi/autohotkey.php2
-rw-r--r--inc/geshi/autoit.php2
-rw-r--r--inc/geshi/avisynth.php2
-rw-r--r--inc/geshi/awk.php2
-rw-r--r--inc/geshi/bascomavr.php185
-rw-r--r--inc/geshi/bash.php141
-rw-r--r--inc/geshi/basic4gl.php2
-rw-r--r--inc/geshi/bf.php15
-rw-r--r--inc/geshi/bibtex.php2
-rw-r--r--inc/geshi/blitzbasic.php4
-rw-r--r--inc/geshi/bnf.php2
-rw-r--r--inc/geshi/boo.php2
-rw-r--r--inc/geshi/c.php85
-rw-r--r--inc/geshi/c_loadrunner.php323
-rw-r--r--inc/geshi/c_mac.php2
-rw-r--r--inc/geshi/caddcl.php2
-rw-r--r--inc/geshi/cadlisp.php2
-rw-r--r--inc/geshi/cfdg.php2
-rw-r--r--inc/geshi/cfm.php2
-rw-r--r--inc/geshi/chaiscript.php4
-rw-r--r--inc/geshi/cil.php2
-rw-r--r--inc/geshi/clojure.php2
-rw-r--r--inc/geshi/cmake.php2
-rw-r--r--inc/geshi/cobol.php2
-rw-r--r--inc/geshi/coffeescript.php146
-rw-r--r--inc/geshi/cpp-qt.php8
-rw-r--r--inc/geshi/cpp.php4
-rw-r--r--inc/geshi/csharp.php19
-rw-r--r--inc/geshi/css.php22
-rw-r--r--inc/geshi/cuesheet.php2
-rw-r--r--inc/geshi/d.php68
-rw-r--r--inc/geshi/dcl.php192
-rw-r--r--inc/geshi/dcpu16.php131
-rw-r--r--inc/geshi/dcs.php2
-rw-r--r--inc/geshi/delphi.php46
-rw-r--r--inc/geshi/diff.php2
-rw-r--r--inc/geshi/div.php2
-rw-r--r--inc/geshi/dos.php37
-rw-r--r--inc/geshi/dot.php2
-rw-r--r--inc/geshi/e.php208
-rw-r--r--inc/geshi/ecmascript.php2
-rw-r--r--inc/geshi/eiffel.php2
-rw-r--r--inc/geshi/email.php26
-rw-r--r--inc/geshi/epc.php154
-rw-r--r--inc/geshi/erlang.php10
-rw-r--r--inc/geshi/euphoria.php140
-rw-r--r--inc/geshi/f1.php151
-rw-r--r--inc/geshi/falcon.php218
-rw-r--r--inc/geshi/fo.php2
-rw-r--r--inc/geshi/fortran.php2
-rw-r--r--inc/geshi/freebasic.php2
-rw-r--r--inc/geshi/freeswitch.php168
-rw-r--r--inc/geshi/fsharp.php8
-rw-r--r--inc/geshi/gambas.php2
-rw-r--r--inc/geshi/gdb.php63
-rw-r--r--inc/geshi/genero.php2
-rw-r--r--inc/geshi/genie.php2
-rw-r--r--inc/geshi/gettext.php2
-rw-r--r--inc/geshi/glsl.php2
-rw-r--r--inc/geshi/gml.php2
-rw-r--r--inc/geshi/gnuplot.php2
-rw-r--r--inc/geshi/go.php375
-rw-r--r--inc/geshi/groovy.php18
-rw-r--r--inc/geshi/gwbasic.php2
-rw-r--r--inc/geshi/haskell.php8
-rw-r--r--inc/geshi/haxe.php161
-rw-r--r--inc/geshi/hicest.php2
-rw-r--r--inc/geshi/hq9plus.php2
-rw-r--r--inc/geshi/html4strict.php29
-rw-r--r--inc/geshi/html5.php212
-rw-r--r--inc/geshi/icon.php2
-rw-r--r--inc/geshi/idl.php2
-rw-r--r--inc/geshi/ini.php2
-rw-r--r--inc/geshi/inno.php2
-rw-r--r--inc/geshi/intercal.php2
-rw-r--r--inc/geshi/io.php2
-rw-r--r--inc/geshi/j.php73
-rw-r--r--inc/geshi/java.php4
-rw-r--r--inc/geshi/java5.php328
-rw-r--r--inc/geshi/javascript.php70
-rw-r--r--inc/geshi/jquery.php2
-rw-r--r--inc/geshi/kixtart.php2
-rw-r--r--inc/geshi/klonec.php2
-rw-r--r--inc/geshi/klonecpp.php2
-rw-r--r--inc/geshi/latex.php8
-rw-r--r--inc/geshi/lb.php162
-rw-r--r--inc/geshi/ldif.php116
-rw-r--r--inc/geshi/lisp.php2
-rw-r--r--inc/geshi/llvm.php385
-rw-r--r--inc/geshi/locobasic.php2
-rw-r--r--inc/geshi/logtalk.php35
-rw-r--r--inc/geshi/lolcode.php2
-rw-r--r--inc/geshi/lotusformulas.php2
-rw-r--r--inc/geshi/lotusscript.php2
-rw-r--r--inc/geshi/lscript.php2
-rw-r--r--inc/geshi/lsl2.php2
-rw-r--r--inc/geshi/lua.php62
-rw-r--r--inc/geshi/m68k.php2
-rw-r--r--inc/geshi/magiksf.php2
-rw-r--r--inc/geshi/make.php2
-rw-r--r--inc/geshi/mapbasic.php2
-rw-r--r--inc/geshi/matlab.php2
-rw-r--r--inc/geshi/mirc.php2
-rw-r--r--inc/geshi/mmix.php66
-rw-r--r--inc/geshi/modula2.php2
-rw-r--r--inc/geshi/modula3.php4
-rw-r--r--inc/geshi/mpasm.php2
-rw-r--r--inc/geshi/mxml.php2
-rw-r--r--inc/geshi/mysql.php34
-rw-r--r--inc/geshi/nagios.php225
-rw-r--r--inc/geshi/netrexx.php163
-rw-r--r--inc/geshi/newlisp.php2
-rw-r--r--inc/geshi/nsis.php2
-rw-r--r--inc/geshi/oberon2.php2
-rw-r--r--inc/geshi/objc.php2
-rw-r--r--inc/geshi/objeck.php116
-rw-r--r--inc/geshi/ocaml-brief.php2
-rw-r--r--inc/geshi/ocaml.php2
-rw-r--r--inc/geshi/octave.php515
-rw-r--r--inc/geshi/oobas.php2
-rw-r--r--inc/geshi/oorexx.php171
-rw-r--r--inc/geshi/oracle11.php2
-rw-r--r--inc/geshi/oracle8.php2
-rw-r--r--inc/geshi/oxygene.php6
-rw-r--r--inc/geshi/oz.php2
-rw-r--r--inc/geshi/parasail.php133
-rw-r--r--inc/geshi/parigp.php277
-rw-r--r--inc/geshi/pascal.php53
-rw-r--r--inc/geshi/pcre.php2
-rw-r--r--inc/geshi/per.php2
-rw-r--r--inc/geshi/perl.php2
-rw-r--r--inc/geshi/perl6.php2
-rw-r--r--inc/geshi/pf.php2
-rw-r--r--inc/geshi/php-brief.php4
-rw-r--r--inc/geshi/php.php21
-rw-r--r--inc/geshi/pic16.php2
-rw-r--r--inc/geshi/pike.php2
-rw-r--r--inc/geshi/pixelbender.php2
-rw-r--r--inc/geshi/pli.php200
-rw-r--r--inc/geshi/plsql.php2
-rw-r--r--inc/geshi/postgresql.php2
-rw-r--r--inc/geshi/povray.php2
-rw-r--r--inc/geshi/powerbuilder.php2
-rw-r--r--inc/geshi/powershell.php2
-rw-r--r--inc/geshi/proftpd.php374
-rw-r--r--inc/geshi/progress.php2
-rw-r--r--inc/geshi/prolog.php2
-rw-r--r--inc/geshi/properties.php2
-rw-r--r--inc/geshi/providex.php2
-rw-r--r--inc/geshi/purebasic.php2
-rw-r--r--inc/geshi/pycon.php64
-rw-r--r--inc/geshi/pys60.php273
-rw-r--r--inc/geshi/python.php17
-rw-r--r--inc/geshi/q.php2
-rw-r--r--inc/geshi/qbasic.php6
-rw-r--r--inc/geshi/rails.php2
-rw-r--r--inc/geshi/rebol.php2
-rw-r--r--inc/geshi/reg.php2
-rw-r--r--inc/geshi/rexx.php162
-rw-r--r--inc/geshi/robots.php2
-rw-r--r--inc/geshi/rpmspec.php2
-rw-r--r--inc/geshi/rsplus.php20
-rw-r--r--inc/geshi/ruby.php2
-rw-r--r--inc/geshi/sas.php6
-rw-r--r--inc/geshi/scala.php26
-rw-r--r--inc/geshi/scheme.php2
-rw-r--r--inc/geshi/scilab.php2
-rw-r--r--inc/geshi/sdlbasic.php2
-rw-r--r--inc/geshi/smalltalk.php2
-rw-r--r--inc/geshi/smarty.php2
-rw-r--r--inc/geshi/spark.php132
-rw-r--r--inc/geshi/sparql.php155
-rw-r--r--inc/geshi/sql.php75
-rw-r--r--inc/geshi/stonescript.php307
-rw-r--r--inc/geshi/systemverilog.php8
-rw-r--r--inc/geshi/tcl.php2
-rw-r--r--inc/geshi/teraterm.php147
-rw-r--r--inc/geshi/text.php2
-rw-r--r--inc/geshi/thinbasic.php2
-rw-r--r--inc/geshi/tsql.php6
-rw-r--r--inc/geshi/typoscript.php20
-rw-r--r--inc/geshi/unicon.php2
-rw-r--r--inc/geshi/upc.php270
-rw-r--r--inc/geshi/urbi.php200
-rw-r--r--inc/geshi/uscript.php299
-rw-r--r--inc/geshi/vala.php2
-rw-r--r--inc/geshi/vb.php2
-rw-r--r--inc/geshi/vbnet.php127
-rw-r--r--inc/geshi/vedit.php103
-rw-r--r--inc/geshi/verilog.php4
-rw-r--r--inc/geshi/vhdl.php105
-rw-r--r--inc/geshi/vim.php2
-rw-r--r--inc/geshi/visualfoxpro.php2
-rw-r--r--inc/geshi/visualprolog.php2
-rw-r--r--inc/geshi/whitespace.php2
-rw-r--r--inc/geshi/whois.php2
-rw-r--r--inc/geshi/winbatch.php2
-rw-r--r--inc/geshi/xbasic.php3
-rw-r--r--inc/geshi/xml.php2
-rw-r--r--inc/geshi/xorg_conf.php2
-rw-r--r--inc/geshi/xpp.php2
-rw-r--r--inc/geshi/yaml.php150
-rw-r--r--inc/geshi/z80.php2
-rw-r--r--inc/geshi/zxbasic.php150
-rw-r--r--inc/html.php242
-rw-r--r--inc/httputils.php10
-rw-r--r--inc/indexer.php69
-rw-r--r--inc/infoutils.php61
-rw-r--r--inc/init.php74
-rw-r--r--inc/io.php15
-rw-r--r--inc/lang/af/lang.php4
-rw-r--r--inc/lang/ar/install.html4
-rw-r--r--inc/lang/ar/lang.php70
-rw-r--r--inc/lang/ar/resetpwd.txt3
-rw-r--r--inc/lang/az/install.html2
-rw-r--r--inc/lang/az/lang.php17
-rw-r--r--inc/lang/bg/install.html8
-rw-r--r--inc/lang/bg/lang.php92
-rw-r--r--inc/lang/bg/mailtext.txt2
-rw-r--r--inc/lang/bg/mailwrap.html13
-rw-r--r--inc/lang/bg/resetpwd.txt4
-rw-r--r--inc/lang/ca-valencia/install.html4
-rw-r--r--inc/lang/ca-valencia/lang.php17
-rw-r--r--inc/lang/ca/install.html2
-rw-r--r--inc/lang/ca/lang.php17
-rw-r--r--inc/lang/cs/install.html2
-rw-r--r--inc/lang/cs/lang.php28
-rw-r--r--inc/lang/cs/mailwrap.html13
-rw-r--r--inc/lang/cs/resetpwd.txt3
-rw-r--r--inc/lang/cs/subscr_digest.txt2
-rw-r--r--inc/lang/cs/subscr_list.txt2
-rw-r--r--inc/lang/cs/subscr_single.txt2
-rw-r--r--inc/lang/da/install.html30
-rw-r--r--inc/lang/da/lang.php75
-rw-r--r--inc/lang/da/mailwrap.html13
-rw-r--r--inc/lang/da/resetpwd.txt3
-rw-r--r--inc/lang/da/subscr_digest.txt20
-rw-r--r--inc/lang/da/subscr_list.txt17
-rw-r--r--inc/lang/de-informal/install.html2
-rw-r--r--inc/lang/de-informal/lang.php45
-rw-r--r--inc/lang/de-informal/mailwrap.html13
-rw-r--r--inc/lang/de-informal/resetpwd.txt4
-rw-r--r--inc/lang/de/install.html2
-rw-r--r--inc/lang/de/lang.php31
-rw-r--r--inc/lang/de/mailwrap.html13
-rw-r--r--inc/lang/de/resetpwd.txt4
-rw-r--r--inc/lang/el/install.html32
-rw-r--r--inc/lang/el/lang.php18
-rw-r--r--inc/lang/en/install.html2
-rw-r--r--inc/lang/en/lang.php34
-rw-r--r--inc/lang/en/mailwrap.html13
-rw-r--r--inc/lang/en/newpage.txt2
-rw-r--r--inc/lang/en/norev.txt2
-rw-r--r--inc/lang/en/resetpwd.txt4
-rw-r--r--inc/lang/en/searchpage.txt2
-rw-r--r--inc/lang/en/subscr_digest.txt2
-rw-r--r--inc/lang/en/subscr_list.txt2
-rw-r--r--inc/lang/en/subscr_single.txt2
-rw-r--r--inc/lang/eo/conflict.txt4
-rw-r--r--inc/lang/eo/denied.txt2
-rw-r--r--inc/lang/eo/diff.txt2
-rw-r--r--inc/lang/eo/draft.txt4
-rw-r--r--inc/lang/eo/edit.txt2
-rw-r--r--inc/lang/eo/editrev.txt2
-rw-r--r--inc/lang/eo/index.txt2
-rw-r--r--inc/lang/eo/install.html12
-rw-r--r--inc/lang/eo/lang.php85
-rw-r--r--inc/lang/eo/locked.txt2
-rw-r--r--inc/lang/eo/mailtext.txt7
-rw-r--r--inc/lang/eo/mailwrap.html13
-rw-r--r--inc/lang/eo/newpage.txt2
-rw-r--r--inc/lang/eo/norev.txt2
-rw-r--r--inc/lang/eo/password.txt7
-rw-r--r--inc/lang/eo/preview.txt2
-rw-r--r--inc/lang/eo/pwconfirm.txt9
-rw-r--r--inc/lang/eo/read.txt2
-rw-r--r--inc/lang/eo/recent.txt2
-rw-r--r--inc/lang/eo/register.txt2
-rw-r--r--inc/lang/eo/registermail.txt5
-rw-r--r--inc/lang/eo/resendpwd.txt2
-rw-r--r--inc/lang/eo/resetpwd.txt4
-rw-r--r--inc/lang/eo/showrev.txt2
-rw-r--r--inc/lang/eo/stopwords.txt4
-rw-r--r--inc/lang/eo/subscr_digest.txt3
-rw-r--r--inc/lang/eo/subscr_list.txt3
-rw-r--r--inc/lang/eo/subscr_single.txt3
-rw-r--r--inc/lang/eo/updateprofile.txt2
-rw-r--r--inc/lang/eo/uploadmail.txt5
-rw-r--r--inc/lang/es/install.html6
-rw-r--r--inc/lang/es/lang.php35
-rw-r--r--inc/lang/es/mailwrap.html13
-rw-r--r--inc/lang/es/resetpwd.txt3
-rw-r--r--inc/lang/et/lang.php11
-rw-r--r--inc/lang/eu/install.html6
-rw-r--r--inc/lang/eu/lang.php17
-rw-r--r--inc/lang/fa/install.html2
-rw-r--r--inc/lang/fa/lang.php72
-rw-r--r--inc/lang/fa/mailwrap.html14
-rw-r--r--inc/lang/fa/resetpwd.txt3
-rw-r--r--inc/lang/fi/install.html28
-rw-r--r--inc/lang/fi/lang.php28
-rw-r--r--inc/lang/fi/mailwrap.html13
-rw-r--r--inc/lang/fi/resetpwd.txt3
-rw-r--r--inc/lang/fo/lang.php2
-rw-r--r--inc/lang/fr/install.html12
-rw-r--r--inc/lang/fr/lang.php29
-rw-r--r--inc/lang/fr/mailtext.txt1
-rw-r--r--inc/lang/fr/mailwrap.html13
-rw-r--r--inc/lang/fr/resetpwd.txt3
-rw-r--r--inc/lang/gl/install.html6
-rw-r--r--inc/lang/gl/lang.php107
-rw-r--r--inc/lang/he/install.html6
-rw-r--r--inc/lang/he/lang.php17
-rw-r--r--inc/lang/hi/lang.php8
-rw-r--r--inc/lang/hr/lang.php17
-rw-r--r--inc/lang/hu/install.html4
-rw-r--r--inc/lang/hu/lang.php17
-rw-r--r--inc/lang/ia/install.html2
-rw-r--r--inc/lang/ia/lang.php17
-rw-r--r--inc/lang/id-ni/lang.php2
-rw-r--r--inc/lang/id/install.html18
-rw-r--r--inc/lang/id/lang.php13
-rw-r--r--inc/lang/is/lang.php9
-rw-r--r--inc/lang/it/install.html4
-rw-r--r--inc/lang/it/lang.php72
-rw-r--r--inc/lang/it/mailwrap.html13
-rw-r--r--inc/lang/it/resetpwd.txt1
-rw-r--r--inc/lang/ja/install.html2
-rw-r--r--inc/lang/ja/lang.php27
-rw-r--r--inc/lang/ja/resetpwd.txt3
-rw-r--r--inc/lang/kk/lang.php2
-rw-r--r--inc/lang/km/lang.php2
-rw-r--r--inc/lang/ko/admin.txt3
-rw-r--r--inc/lang/ko/backlinks.txt5
-rw-r--r--inc/lang/ko/conflict.txt5
-rw-r--r--inc/lang/ko/denied.txt3
-rw-r--r--inc/lang/ko/diff.txt6
-rw-r--r--inc/lang/ko/draft.txt7
-rw-r--r--inc/lang/ko/edit.txt3
-rw-r--r--inc/lang/ko/editrev.txt2
-rw-r--r--inc/lang/ko/index.txt5
-rw-r--r--inc/lang/ko/install.html24
-rw-r--r--inc/lang/ko/lang.php374
-rw-r--r--inc/lang/ko/locked.txt4
-rw-r--r--inc/lang/ko/login.txt3
-rw-r--r--inc/lang/ko/mailtext.txt23
-rw-r--r--inc/lang/ko/mailwrap.html13
-rw-r--r--inc/lang/ko/newpage.txt4
-rw-r--r--inc/lang/ko/norev.txt2
-rw-r--r--inc/lang/ko/password.txt11
-rw-r--r--inc/lang/ko/preview.txt5
-rw-r--r--inc/lang/ko/pwconfirm.txt14
-rw-r--r--inc/lang/ko/read.txt2
-rw-r--r--inc/lang/ko/recent.txt6
-rw-r--r--inc/lang/ko/register.txt3
-rw-r--r--inc/lang/ko/registermail.txt15
-rw-r--r--inc/lang/ko/resendpwd.txt5
-rw-r--r--inc/lang/ko/resetpwd.txt3
-rw-r--r--inc/lang/ko/revisions.txt3
-rw-r--r--inc/lang/ko/searchpage.txt4
-rw-r--r--inc/lang/ko/stopwords.txt18
-rw-r--r--inc/lang/ko/subscr_digest.txt14
-rw-r--r--inc/lang/ko/subscr_form.txt2
-rw-r--r--inc/lang/ko/subscr_list.txt9
-rw-r--r--inc/lang/ko/subscr_single.txt11
-rw-r--r--inc/lang/ko/updateprofile.txt4
-rw-r--r--inc/lang/ko/uploadmail.txt23
-rw-r--r--inc/lang/la/install.html4
-rw-r--r--inc/lang/la/lang.php17
-rw-r--r--inc/lang/lb/lang.php17
-rw-r--r--inc/lang/lt/lang.php13
-rw-r--r--inc/lang/lv/install.html12
-rw-r--r--inc/lang/lv/lang.php18
-rw-r--r--inc/lang/mk/lang.php16
-rw-r--r--inc/lang/mr/install.html4
-rw-r--r--inc/lang/mr/lang.php97
-rw-r--r--inc/lang/ne/lang.php15
-rw-r--r--inc/lang/nl/edit.txt2
-rw-r--r--inc/lang/nl/index.txt2
-rw-r--r--inc/lang/nl/install.html10
-rw-r--r--inc/lang/nl/lang.php41
-rw-r--r--inc/lang/nl/mailwrap.html13
-rw-r--r--inc/lang/nl/register.txt2
-rw-r--r--inc/lang/nl/resetpwd.txt3
-rw-r--r--inc/lang/nl/subscr_digest.txt2
-rw-r--r--inc/lang/nl/subscr_single.txt5
-rw-r--r--inc/lang/nl/uploadmail.txt1
-rw-r--r--inc/lang/no/install.html2
-rw-r--r--inc/lang/no/lang.php18
-rw-r--r--inc/lang/pl/install.html8
-rw-r--r--inc/lang/pl/lang.php30
-rw-r--r--inc/lang/pl/mailwrap.html13
-rw-r--r--inc/lang/pl/resetpwd.txt3
-rw-r--r--inc/lang/pt-br/install.html2
-rw-r--r--inc/lang/pt-br/lang.php17
-rw-r--r--inc/lang/pt/install.html2
-rw-r--r--inc/lang/pt/lang.php18
-rw-r--r--inc/lang/ro/install.html4
-rw-r--r--inc/lang/ro/lang.php28
-rw-r--r--inc/lang/ro/resetpwd.txt3
-rw-r--r--inc/lang/ru/install.html2
-rw-r--r--inc/lang/ru/lang.php124
-rw-r--r--inc/lang/ru/resetpwd.txt3
-rw-r--r--inc/lang/sk/install.html24
-rw-r--r--inc/lang/sk/lang.php35
-rw-r--r--inc/lang/sk/mailwrap.html13
-rw-r--r--inc/lang/sk/resetpwd.txt3
-rw-r--r--inc/lang/sl/install.html2
-rw-r--r--inc/lang/sl/lang.php75
-rw-r--r--inc/lang/sl/locked.txt2
-rw-r--r--inc/lang/sl/stopwords.txt6
-rw-r--r--inc/lang/sq/install.html2
-rw-r--r--inc/lang/sq/lang.php17
-rw-r--r--inc/lang/sr/install.html8
-rw-r--r--inc/lang/sr/lang.php17
-rw-r--r--inc/lang/sv/install.html8
-rw-r--r--inc/lang/sv/lang.php17
-rw-r--r--inc/lang/th/lang.php17
-rw-r--r--inc/lang/tr/install.html4
-rw-r--r--inc/lang/tr/lang.php15
-rw-r--r--inc/lang/uk/install.html10
-rw-r--r--inc/lang/uk/lang.php28
-rw-r--r--inc/lang/vi/backlinks.txt4
-rw-r--r--inc/lang/vi/conflict.txt2
-rw-r--r--inc/lang/vi/denied.txt2
-rw-r--r--inc/lang/vi/edit.txt2
-rw-r--r--inc/lang/vi/editrev.txt2
-rw-r--r--inc/lang/vi/lang.php184
-rw-r--r--inc/lang/vi/login.txt2
-rw-r--r--inc/lang/vi/mailtext.txt2
-rw-r--r--inc/lang/vi/newpage.txt2
-rw-r--r--inc/lang/vi/norev.txt2
-rw-r--r--inc/lang/vi/password.txt2
-rw-r--r--inc/lang/vi/preview.txt2
-rw-r--r--inc/lang/vi/read.txt2
-rw-r--r--inc/lang/vi/revisions.txt2
-rw-r--r--inc/lang/vi/searchpage.txt2
-rw-r--r--inc/lang/zh-tw/admin.txt3
-rw-r--r--inc/lang/zh-tw/diff.txt3
-rw-r--r--inc/lang/zh-tw/index.txt2
-rw-r--r--inc/lang/zh-tw/install.html6
-rw-r--r--inc/lang/zh-tw/lang.php89
-rw-r--r--inc/lang/zh-tw/mailwrap.html13
-rw-r--r--inc/lang/zh-tw/resetpwd.txt3
-rw-r--r--inc/lang/zh-tw/subscr_digest.txt4
-rw-r--r--inc/lang/zh-tw/subscr_form.txt2
-rw-r--r--inc/lang/zh-tw/subscr_list.txt6
-rw-r--r--inc/lang/zh-tw/subscr_single.txt4
-rw-r--r--inc/lang/zh/install.html2
-rw-r--r--inc/lang/zh/lang.php34
-rw-r--r--inc/lang/zh/mailwrap.html13
-rw-r--r--inc/lang/zh/resetpwd.txt3
-rw-r--r--inc/load.php17
-rw-r--r--inc/mail.php34
-rw-r--r--inc/media.php201
-rw-r--r--inc/pageutils.php52
-rw-r--r--inc/parser/code.php5
-rw-r--r--inc/parser/metadata.php8
-rw-r--r--inc/parser/parser.php14
-rw-r--r--inc/parser/renderer.php4
-rw-r--r--inc/parser/xhtml.php35
-rw-r--r--inc/parserutils.php59
-rw-r--r--inc/plugin.php2
-rw-r--r--inc/plugincontroller.class.php9
-rw-r--r--inc/pluginutils.php2
-rw-r--r--inc/preload.php.dist17
-rw-r--r--inc/remote.php253
-rw-r--r--inc/search.php4
-rw-r--r--inc/subscription.php86
-rw-r--r--inc/template.php1067
-rw-r--r--inc/toolbar.php2
-rw-r--r--inc/utf8.php87
-rw-r--r--install.php160
-rw-r--r--lib/exe/ajax.php77
-rw-r--r--lib/exe/css.php122
-rw-r--r--lib/exe/detail.php5
-rw-r--r--lib/exe/fetch.php16
-rw-r--r--lib/exe/index.html5
-rw-r--r--lib/exe/indexer.php21
-rw-r--r--lib/exe/js.php45
-rw-r--r--lib/exe/mediamanager.php36
-rw-r--r--lib/exe/opensearch.php4
-rw-r--r--lib/exe/xmlrpc.php876
-rw-r--r--lib/images/arrow_down.gifbin273 -> 0 bytes
-rw-r--r--lib/images/arrow_up.gifbin274 -> 0 bytes
-rw-r--r--lib/images/at.gifbin57 -> 0 bytes
-rw-r--r--lib/images/close.pngbin137 -> 0 bytes
-rw-r--r--lib/images/del.pngbin355 -> 0 bytes
-rw-r--r--lib/images/edit.gifbin142 -> 0 bytes
-rw-r--r--lib/images/fileicons/ico.pngbin0 -> 907 bytes
-rw-r--r--lib/images/fileicons/index.php6
-rw-r--r--lib/images/icon-file.pngbin3363 -> 0 bytes
-rw-r--r--lib/images/icon-thumb.pngbin969 -> 0 bytes
-rw-r--r--lib/images/index.html5
-rw-r--r--lib/images/interwiki/amazon.de.gifbin110 -> 132 bytes
-rw-r--r--lib/images/interwiki/amazon.gifbin110 -> 132 bytes
-rw-r--r--lib/images/interwiki/amazon.uk.gifbin110 -> 132 bytes
-rw-r--r--lib/images/interwiki/callto.gifbin178 -> 177 bytes
-rw-r--r--lib/images/interwiki/paypal.gifbin171 -> 138 bytes
-rw-r--r--lib/images/interwiki/skype.gifbin0 -> 157 bytes
-rw-r--r--lib/images/interwiki/skype.pngbin675 -> 0 bytes
-rw-r--r--lib/images/list-minus.gifbin64 -> 0 bytes
-rw-r--r--lib/images/list-plus.gifbin67 -> 0 bytes
-rw-r--r--lib/images/pencil.pngbin391 -> 0 bytes
-rw-r--r--lib/images/resizecol.pngbin0 -> 158 bytes
-rw-r--r--lib/index.html5
-rw-r--r--lib/plugins/acl/admin.php70
-rw-r--r--lib/plugins/acl/ajax.php22
-rw-r--r--lib/plugins/acl/lang/bg/lang.php6
-rw-r--r--lib/plugins/acl/lang/cs/lang.php1
-rw-r--r--lib/plugins/acl/lang/da/lang.php1
-rw-r--r--lib/plugins/acl/lang/de-informal/lang.php4
-rw-r--r--lib/plugins/acl/lang/eo/help.txt4
-rw-r--r--lib/plugins/acl/lang/eo/lang.php24
-rw-r--r--lib/plugins/acl/lang/es/lang.php1
-rw-r--r--lib/plugins/acl/lang/fa/lang.php1
-rw-r--r--lib/plugins/acl/lang/fr/lang.php2
-rw-r--r--lib/plugins/acl/lang/gl/lang.php1
-rw-r--r--lib/plugins/acl/lang/it/lang.php2
-rw-r--r--lib/plugins/acl/lang/ja/lang.php1
-rw-r--r--lib/plugins/acl/lang/ko/help.txt10
-rw-r--r--lib/plugins/acl/lang/ko/lang.php34
-rw-r--r--lib/plugins/acl/lang/nl/lang.php1
-rw-r--r--lib/plugins/acl/lang/pl/lang.php1
-rw-r--r--lib/plugins/acl/lang/ro/lang.php2
-rw-r--r--lib/plugins/acl/lang/ru/lang.php1
-rw-r--r--lib/plugins/acl/lang/sl/help.txt10
-rw-r--r--lib/plugins/acl/lang/sl/lang.php2
-rw-r--r--lib/plugins/acl/lang/vi/help.txt12
-rw-r--r--lib/plugins/acl/lang/vi/lang.php35
-rw-r--r--lib/plugins/acl/lang/zh-tw/help.txt5
-rw-r--r--lib/plugins/acl/lang/zh-tw/lang.php15
-rw-r--r--lib/plugins/acl/plugin.info.txt3
-rw-r--r--lib/plugins/acl/rtl.css40
-rw-r--r--lib/plugins/acl/style.css43
-rw-r--r--lib/plugins/auth.php742
-rw-r--r--lib/plugins/authad/auth.php459
-rw-r--r--lib/plugins/authldap/auth.php110
-rw-r--r--lib/plugins/authmysql/auth.php941
-rw-r--r--lib/plugins/authplain/auth.php293
-rw-r--r--lib/plugins/config/admin.php19
-rw-r--r--lib/plugins/config/lang/ar/lang.php13
-rw-r--r--lib/plugins/config/lang/bg/lang.php410
-rw-r--r--lib/plugins/config/lang/ca-valencia/lang.php2
-rw-r--r--lib/plugins/config/lang/ca/lang.php2
-rw-r--r--lib/plugins/config/lang/cs/lang.php108
-rw-r--r--lib/plugins/config/lang/da/lang.php105
-rw-r--r--lib/plugins/config/lang/de-informal/intro.txt2
-rw-r--r--lib/plugins/config/lang/de-informal/lang.php13
-rw-r--r--lib/plugins/config/lang/de/intro.txt2
-rw-r--r--lib/plugins/config/lang/de/lang.php13
-rw-r--r--lib/plugins/config/lang/el/lang.php4
-rw-r--r--lib/plugins/config/lang/en/lang.php141
-rw-r--r--lib/plugins/config/lang/eo/intro.txt4
-rw-r--r--lib/plugins/config/lang/eo/lang.php166
-rw-r--r--lib/plugins/config/lang/es/lang.php109
-rw-r--r--lib/plugins/config/lang/eu/lang.php2
-rw-r--r--lib/plugins/config/lang/fa/lang.php110
-rw-r--r--lib/plugins/config/lang/fi/lang.php100
-rw-r--r--lib/plugins/config/lang/fr/lang.php105
-rw-r--r--lib/plugins/config/lang/gl/lang.php9
-rw-r--r--lib/plugins/config/lang/he/lang.php1
-rw-r--r--lib/plugins/config/lang/hu/lang.php2
-rw-r--r--lib/plugins/config/lang/ia/lang.php2
-rw-r--r--lib/plugins/config/lang/id-ni/lang.php1
-rw-r--r--lib/plugins/config/lang/it/lang.php109
-rw-r--r--lib/plugins/config/lang/ja/lang.php106
-rw-r--r--lib/plugins/config/lang/ko/intro.txt8
-rw-r--r--lib/plugins/config/lang/ko/lang.php236
-rw-r--r--lib/plugins/config/lang/la/lang.php2
-rw-r--r--lib/plugins/config/lang/lv/lang.php2
-rw-r--r--lib/plugins/config/lang/mr/lang.php2
-rw-r--r--lib/plugins/config/lang/nl/lang.php128
-rw-r--r--lib/plugins/config/lang/no/lang.php7
-rw-r--r--lib/plugins/config/lang/pl/lang.php108
-rw-r--r--lib/plugins/config/lang/pt-br/lang.php2
-rw-r--r--lib/plugins/config/lang/pt/lang.php2
-rw-r--r--lib/plugins/config/lang/ro/lang.php10
-rw-r--r--lib/plugins/config/lang/ru/lang.php104
-rw-r--r--lib/plugins/config/lang/sk/lang.php106
-rw-r--r--lib/plugins/config/lang/sl/lang.php17
-rw-r--r--lib/plugins/config/lang/sq/lang.php2
-rw-r--r--lib/plugins/config/lang/sr/lang.php2
-rw-r--r--lib/plugins/config/lang/sv/lang.php2
-rw-r--r--lib/plugins/config/lang/th/lang.php1
-rw-r--r--lib/plugins/config/lang/uk/intro.txt4
-rw-r--r--lib/plugins/config/lang/uk/lang.php133
-rw-r--r--lib/plugins/config/lang/vi/lang.php5
-rw-r--r--lib/plugins/config/lang/zh-tw/intro.txt6
-rw-r--r--lib/plugins/config/lang/zh-tw/lang.php106
-rw-r--r--lib/plugins/config/lang/zh/lang.php108
-rw-r--r--lib/plugins/config/plugin.info.txt3
-rw-r--r--lib/plugins/config/rtl.css45
-rw-r--r--lib/plugins/config/settings/config.class.php18
-rw-r--r--lib/plugins/config/settings/config.metadata.php49
-rw-r--r--lib/plugins/config/style.css36
-rw-r--r--lib/plugins/index.html5
-rw-r--r--lib/plugins/info/plugin.info.txt3
-rw-r--r--lib/plugins/info/syntax.php8
-rw-r--r--lib/plugins/plugin/classes/ap_download.class.php13
-rw-r--r--lib/plugins/plugin/classes/ap_enable.class.php4
-rw-r--r--lib/plugins/plugin/classes/ap_manage.class.php13
-rw-r--r--lib/plugins/plugin/lang/ar/lang.php1
-rw-r--r--lib/plugins/plugin/lang/cs/lang.php1
-rw-r--r--lib/plugins/plugin/lang/da/lang.php2
-rw-r--r--lib/plugins/plugin/lang/eo/admin_plugin.txt2
-rw-r--r--lib/plugins/plugin/lang/eo/lang.php25
-rw-r--r--lib/plugins/plugin/lang/es/lang.php1
-rw-r--r--lib/plugins/plugin/lang/fa/lang.php1
-rw-r--r--lib/plugins/plugin/lang/fr/lang.php2
-rw-r--r--lib/plugins/plugin/lang/gl/lang.php2
-rw-r--r--lib/plugins/plugin/lang/it/lang.php3
-rw-r--r--lib/plugins/plugin/lang/ja/lang.php1
-rw-r--r--lib/plugins/plugin/lang/ko/admin_plugin.txt2
-rw-r--r--lib/plugins/plugin/lang/ko/lang.php54
-rw-r--r--lib/plugins/plugin/lang/nl/lang.php3
-rw-r--r--lib/plugins/plugin/lang/pl/lang.php1
-rw-r--r--lib/plugins/plugin/lang/ro/lang.php2
-rw-r--r--lib/plugins/plugin/lang/ru/lang.php2
-rw-r--r--lib/plugins/plugin/lang/sl/admin_plugin.txt2
-rw-r--r--lib/plugins/plugin/lang/sl/lang.php2
-rw-r--r--lib/plugins/plugin/lang/vi/lang.php5
-rw-r--r--lib/plugins/plugin/lang/zh-tw/lang.php19
-rw-r--r--lib/plugins/plugin/lang/zh/lang.php2
-rw-r--r--lib/plugins/plugin/plugin.info.txt7
-rw-r--r--lib/plugins/plugin/rtl.css51
-rw-r--r--lib/plugins/plugin/style.css39
-rw-r--r--lib/plugins/popularity/admin.php16
-rw-r--r--lib/plugins/popularity/lang/cs/lang.php1
-rw-r--r--lib/plugins/popularity/lang/da/lang.php6
-rw-r--r--lib/plugins/popularity/lang/da/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/eo/intro.txt6
-rw-r--r--lib/plugins/popularity/lang/eo/lang.php10
-rw-r--r--lib/plugins/popularity/lang/eo/submitted.txt2
-rw-r--r--lib/plugins/popularity/lang/es/lang.php1
-rw-r--r--lib/plugins/popularity/lang/fa/lang.php1
-rw-r--r--lib/plugins/popularity/lang/fr/lang.php6
-rw-r--r--lib/plugins/popularity/lang/gl/lang.php6
-rw-r--r--lib/plugins/popularity/lang/gl/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/it/lang.php2
-rw-r--r--lib/plugins/popularity/lang/ja/lang.php1
-rw-r--r--lib/plugins/popularity/lang/ko/intro.txt6
-rw-r--r--lib/plugins/popularity/lang/ko/lang.php6
-rw-r--r--lib/plugins/popularity/lang/ko/submitted.txt2
-rw-r--r--lib/plugins/popularity/lang/nl/lang.php1
-rw-r--r--lib/plugins/popularity/lang/pl/lang.php1
-rw-r--r--lib/plugins/popularity/lang/ro/lang.php2
-rw-r--r--lib/plugins/popularity/lang/ru/lang.php1
-rw-r--r--lib/plugins/popularity/lang/sl/intro.txt10
-rw-r--r--lib/plugins/popularity/lang/sl/submitted.txt4
-rw-r--r--lib/plugins/popularity/lang/vi/lang.php5
-rw-r--r--lib/plugins/popularity/lang/zh-tw/lang.php1
-rw-r--r--lib/plugins/popularity/plugin.info.txt2
-rw-r--r--lib/plugins/remote.php21
-rw-r--r--lib/plugins/revert/admin.php6
-rw-r--r--lib/plugins/revert/lang/cs/lang.php1
-rw-r--r--lib/plugins/revert/lang/da/lang.php1
-rw-r--r--lib/plugins/revert/lang/eo/lang.php8
-rw-r--r--lib/plugins/revert/lang/es/lang.php1
-rw-r--r--lib/plugins/revert/lang/fa/lang.php1
-rw-r--r--lib/plugins/revert/lang/fr/lang.php2
-rw-r--r--lib/plugins/revert/lang/gl/lang.php1
-rw-r--r--lib/plugins/revert/lang/it/lang.php2
-rw-r--r--lib/plugins/revert/lang/ja/lang.php1
-rw-r--r--lib/plugins/revert/lang/ko/intro.txt2
-rw-r--r--lib/plugins/revert/lang/ko/lang.php14
-rw-r--r--lib/plugins/revert/lang/nl/lang.php1
-rw-r--r--lib/plugins/revert/lang/pl/lang.php1
-rw-r--r--lib/plugins/revert/lang/ro/lang.php2
-rw-r--r--lib/plugins/revert/lang/ru/lang.php1
-rw-r--r--lib/plugins/revert/lang/sl/intro.txt2
-rw-r--r--lib/plugins/revert/lang/vi/lang.php5
-rw-r--r--lib/plugins/revert/lang/zh-tw/lang.php1
-rw-r--r--lib/plugins/revert/plugin.info.txt3
-rw-r--r--lib/plugins/safefnrecode/plugin.info.txt2
-rw-r--r--lib/plugins/syntax.php22
-rw-r--r--lib/plugins/testing/_test/dummy_plugin_integration_test.test.php32
-rw-r--r--lib/plugins/testing/_test/dummy_plugin_test.test.php9
-rw-r--r--lib/plugins/testing/action.php19
-rw-r--r--lib/plugins/testing/plugin.info.txt7
-rw-r--r--lib/plugins/usermanager/admin.php21
-rw-r--r--lib/plugins/usermanager/lang/cs/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/da/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/de-informal/lang.php12
-rw-r--r--lib/plugins/usermanager/lang/de/lang.php6
-rw-r--r--lib/plugins/usermanager/lang/eo/intro.txt2
-rw-r--r--lib/plugins/usermanager/lang/eo/lang.php22
-rw-r--r--lib/plugins/usermanager/lang/eo/list.txt2
-rw-r--r--lib/plugins/usermanager/lang/es/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/fa/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/fr/lang.php2
-rw-r--r--lib/plugins/usermanager/lang/gl/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/it/lang.php2
-rw-r--r--lib/plugins/usermanager/lang/ja/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/ko/lang.php40
-rw-r--r--lib/plugins/usermanager/lang/nl/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/pl/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/ro/lang.php2
-rw-r--r--lib/plugins/usermanager/lang/ru/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/sl/delete.txt2
-rw-r--r--lib/plugins/usermanager/lang/vi/lang.php5
-rw-r--r--lib/plugins/usermanager/lang/zh-tw/intro.txt2
-rw-r--r--lib/plugins/usermanager/lang/zh-tw/lang.php7
-rw-r--r--lib/plugins/usermanager/plugin.info.txt5
-rw-r--r--lib/scripts/edit.js2
-rw-r--r--lib/scripts/index.html5
-rw-r--r--lib/scripts/media.js17
-rw-r--r--lib/scripts/page.js96
-rw-r--r--lib/styles/index.html5
-rw-r--r--lib/styles/screen.css18
-rw-r--r--lib/tpl/default/_mediamanager.css58
-rw-r--r--lib/tpl/default/_tabs.css13
-rw-r--r--lib/tpl/default/design.css56
-rw-r--r--lib/tpl/default/detail.php3
-rw-r--r--lib/tpl/default/main.php7
-rw-r--r--lib/tpl/default/media.css11
-rw-r--r--lib/tpl/default/mediamanager.php11
-rw-r--r--lib/tpl/default/print.css4
-rw-r--r--lib/tpl/default/rtl.css30
-rw-r--r--lib/tpl/default/template.info.txt7
-rw-r--r--lib/tpl/dokuwiki/css/_admin.css59
-rw-r--r--lib/tpl/dokuwiki/css/_diff.css65
-rw-r--r--lib/tpl/dokuwiki/css/_edit.css147
-rw-r--r--lib/tpl/dokuwiki/css/_fileuploader.css112
-rw-r--r--lib/tpl/dokuwiki/css/_footnotes.css28
-rw-r--r--lib/tpl/dokuwiki/css/_forms.css92
-rw-r--r--lib/tpl/dokuwiki/css/_imgdetail.css38
-rw-r--r--lib/tpl/dokuwiki/css/_links.css74
-rw-r--r--lib/tpl/dokuwiki/css/_media_fullscreen.css491
-rw-r--r--lib/tpl/dokuwiki/css/_media_popup.css257
-rw-r--r--lib/tpl/dokuwiki/css/_modal.css94
-rw-r--r--lib/tpl/dokuwiki/css/_recent.css59
-rw-r--r--lib/tpl/dokuwiki/css/_search.css109
-rw-r--r--lib/tpl/dokuwiki/css/_tabs.css53
-rw-r--r--lib/tpl/dokuwiki/css/_toc.css93
-rw-r--r--lib/tpl/dokuwiki/css/basic.css417
-rw-r--r--lib/tpl/dokuwiki/css/content.css164
-rw-r--r--lib/tpl/dokuwiki/css/design.css606
-rw-r--r--lib/tpl/dokuwiki/css/includes.css4
-rw-r--r--lib/tpl/dokuwiki/css/mobile.css270
-rw-r--r--lib/tpl/dokuwiki/css/pagetools.css334
-rw-r--r--lib/tpl/dokuwiki/css/print.css193
-rw-r--r--lib/tpl/dokuwiki/css/structure.css81
-rw-r--r--lib/tpl/dokuwiki/detail.php134
-rw-r--r--lib/tpl/dokuwiki/images/apple-touch-icon.pngbin0 -> 6399 bytes
-rw-r--r--lib/tpl/dokuwiki/images/bullet.pngbin0 -> 112 bytes
-rw-r--r--lib/tpl/dokuwiki/images/button-css.pngbin0 -> 299 bytes
-rw-r--r--lib/tpl/dokuwiki/images/button-donate.gifbin0 -> 187 bytes
-rw-r--r--lib/tpl/dokuwiki/images/button-dw.pngbin0 -> 398 bytes
-rw-r--r--lib/tpl/dokuwiki/images/button-php.gifbin0 -> 207 bytes
-rw-r--r--lib/tpl/dokuwiki/images/button-rss.pngbin0 -> 180 bytes
-rw-r--r--lib/tpl/dokuwiki/images/button-xhtml.pngbin0 -> 321 bytes
-rw-r--r--lib/tpl/dokuwiki/images/closed-rtl.pngbin0 -> 118 bytes
-rw-r--r--lib/tpl/dokuwiki/images/closed.pngbin0 -> 119 bytes
-rw-r--r--lib/tpl/dokuwiki/images/email.pngbin0 -> 659 bytes
-rw-r--r--lib/tpl/dokuwiki/images/external-link.pngbin0 -> 816 bytes
-rw-r--r--lib/tpl/dokuwiki/images/favicon.icobin0 -> 7406 bytes
-rw-r--r--lib/tpl/dokuwiki/images/icons-license.txt5
-rw-r--r--lib/tpl/dokuwiki/images/logo.pngbin0 -> 3820 bytes
-rw-r--r--lib/tpl/dokuwiki/images/open.pngbin0 -> 118 bytes
-rw-r--r--lib/tpl/dokuwiki/images/page-background.svg8
-rw-r--r--lib/tpl/dokuwiki/images/page-gradient.pngbin0 -> 280 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools-build.php121
-rw-r--r--lib/tpl/dokuwiki/images/pagetools-sprite.pngbin0 -> 5931 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/01_edit.pngbin0 -> 740 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/02_create.pngbin0 -> 808 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/03_draft.pngbin0 -> 828 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/04_show.pngbin0 -> 458 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/05_source.pngbin0 -> 753 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/06_revert.pngbin0 -> 752 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/07_revisions.pngbin0 -> 1144 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/08_backlink.pngbin0 -> 844 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/09_subscribe.pngbin0 -> 589 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/10_top.pngbin0 -> 465 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/11_mediamanager.pngbin0 -> 441 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/12_back.pngbin0 -> 483 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools/license.txt4
-rw-r--r--lib/tpl/dokuwiki/images/search.pngbin0 -> 316 bytes
-rw-r--r--lib/tpl/dokuwiki/images/toc-arrows.pngbin0 -> 225 bytes
-rw-r--r--lib/tpl/dokuwiki/images/toc-bullet.pngbin0 -> 121 bytes
-rw-r--r--lib/tpl/dokuwiki/images/unc.pngbin0 -> 553 bytes
-rw-r--r--lib/tpl/dokuwiki/images/usertools.pngbin0 -> 1541 bytes
-rw-r--r--lib/tpl/dokuwiki/main.php96
-rw-r--r--lib/tpl/dokuwiki/mediamanager.php46
-rw-r--r--lib/tpl/dokuwiki/script.js75
-rw-r--r--lib/tpl/dokuwiki/style.ini71
-rw-r--r--lib/tpl/dokuwiki/template.info.txt7
-rw-r--r--lib/tpl/dokuwiki/tpl_footer.php32
-rw-r--r--lib/tpl/dokuwiki/tpl_header.php91
-rw-r--r--lib/tpl/index.php7
1033 files changed, 45033 insertions, 17201 deletions
diff --git a/.gitignore b/.gitignore
index f9155eaed..1daf647bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,6 +15,7 @@
*.old
*~
*.DS_Store
+*.iml
/data/attic/*
/data/cache/*
/data/index/*
@@ -26,6 +27,9 @@
/data/pages/*
/data/tmp/*
/lib/tpl/*
+!/lib/tpl/default
+!/lib/tpl/dokuwiki
+!/lib/tpl/index.php
/lib/plugins/*
!/lib/plugins/acl
!/lib/plugins/config
@@ -34,6 +38,7 @@
!/lib/plugins/popularity
!/lib/plugins/revert
!/lib/plugins/safefnrecode
+!/lib/plugins/testing
!/lib/plugins/usermanager
!/lib/plugins/action.php
!/lib/plugins/admin.php
diff --git a/README b/README
index 6bb9a3bd9..0490040f2 100644
--- a/README
+++ b/README
@@ -4,7 +4,7 @@ at http://www.dokuwiki.org/
For Installation Instructions see
http://www.dokuwiki.org/install
-DokuWiki - 2004-2011 (c) Andreas Gohr <andi@splitbrain.org>
+DokuWiki - 2004-2012 (c) Andreas Gohr <andi@splitbrain.org>
and the DokuWiki Community
See COPYING and file headers for license info
diff --git a/_cs/DokuWiki/DokuWikiCodingStandard.php b/_cs/DokuWiki/DokuWikiCodingStandard.php
deleted file mode 100644
index 36133fc46..000000000
--- a/_cs/DokuWiki/DokuWikiCodingStandard.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-/**
- * DokuWiki Coding Standard.
- *
- * @category PHP
- * @package PHP_CodeSniffer
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-
-if (class_exists('PHP_CodeSniffer_Standards_CodingStandard', true) === false) {
- throw new PHP_CodeSniffer_Exception('Class PHP_CodeSniffer_Standards_CodingStandard not found');
-}
-
-/**
- * DokuWiki Coding Standard.
- *
- * @category PHP
- * @package PHP_CodeSniffer
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-class PHP_CodeSniffer_Standards_DokuWiki_DokuWikiCodingStandard extends PHP_CodeSniffer_Standards_CodingStandard {
-
-
- /**
- * Return a list of external sniffs to include with this standard.
- *
- * @return array
- */
- public function getIncludedSniffs() {
- return array(
- 'Generic/Sniffs/Classes/DuplicateClassNameSniff.php',
- 'Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php',
- 'Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php',
- 'Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php',
- 'Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php',
- 'Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php',
- 'Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php',
- 'Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php',
- 'Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php',
- 'Generic/Sniffs/Commenting/TodoSniff.php',
- 'Generic/Sniffs/Files/LineEndingsSniff.php',
- 'Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php',
- 'Generic/Sniffs/Metrics/NestingLevelSniff.php',
-// 'Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php', //FIXME we might need to tune this first
- 'Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php',
- 'Generic/Sniffs/PHP/LowerCaseConstantSniff.php',
- 'Generic/Sniffs/PHP/DisallowShortOpenTagSniff.php',
- 'Generic/Sniffs/PHP/ForbiddenFunctionsSniff.php',
- 'Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php',
- 'DokuWiki/Sniffs/WhiteSpace/ScopeIndentSniff.php',
- 'Zend/Sniffs/Files/ClosingTagSniff.php',
- 'PEAR/Sniffs/Functions/ValidDefaultValueSniff.php',
- 'Squiz/Sniffs/PHP/EvalSniff.php',
- 'Squiz/Sniffs/PHP/NonExecutableCodeSniff.php',
-// 'Squiz/Sniffs/PHP/CommentedOutCodeSniff.php', //FIXME should ignore oneliners
- 'Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php',
- 'Squiz/Sniffs/PHP/NonExecutableCodeSniff.php',
- 'Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php',
- 'Squiz/Sniffs/CSS/MissingColonSniff.php',
- 'Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php',
- 'Squiz/Sniffs/CSS/ColonSpacingSniff.php',
- 'Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php',
- 'Squiz/Sniffs/CSS/SemicolonSpacingSniff.php',
- 'Squiz/Sniffs/CSS/IndentationSniff.php',
- 'Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php',
- 'Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php',
- 'Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php',
- 'Squiz/Sniffs/CSS/OpacitySniff.php',
- 'Squiz/Sniffs/CSS/ColourDefinitionSniff.php',
- 'Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php',
- 'Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php',
-
- 'Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php',
-
- );
- }
-
-}//end class
diff --git a/_cs/DokuWiki/Sniffs/NamingConventions/ConstructorNameSniff.php b/_cs/DokuWiki/Sniffs/NamingConventions/ConstructorNameSniff.php
new file mode 100644
index 000000000..7dd6d9366
--- /dev/null
+++ b/_cs/DokuWiki/Sniffs/NamingConventions/ConstructorNameSniff.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Generic_Sniffs_NamingConventions_ConstructorNameSniff.
+ *
+ * PHP version 5
+ *
+ * @category PHP
+ * @package PHP_CodeSniffer
+ * @author Greg Sherwood <gsherwood@squiz.net>
+ * @author Leif Wickland <lwickland@rightnow.com>
+ * @copyright 2006-2011 Squiz Pty Ltd (ABN 77 084 670 600)
+ * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
+ * @link http://pear.php.net/package/PHP_CodeSniffer
+ */
+
+if (class_exists('PHP_CodeSniffer_Standards_AbstractScopeSniff', true) === false) {
+ $error = 'Class PHP_CodeSniffer_Standards_AbstractScopeSniff not found';
+ throw new PHP_CodeSniffer_Exception($error);
+}
+
+/**
+ * Generic_Sniffs_NamingConventions_ConstructorNameSniff.
+ *
+ * Favor PHP 5 constructor syntax, which uses "function __construct()".
+ * Avoid PHP 4 constructor syntax, which uses "function ClassName()".
+ *
+ * @category PHP
+ * @package PHP_CodeSniffer
+ * @author Leif Wickland <lwickland@rightnow.com>
+ * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
+ * @version Release: 1.3.3
+ * @link http://pear.php.net/package/PHP_CodeSniffer
+ */
+class DokuWiki_Sniffs_NamingConventions_ConstructorNameSniff extends Generic_Sniffs_NamingConventions_ConstructorNameSniff
+{
+ /**
+ * Processes this test when one of its tokens is encountered.
+ *
+ * @param PHP_CodeSniffer_File $phpcsFile The current file being scanned.
+ * @param int $stackPtr The position of the current token
+ * in the stack passed in $tokens.
+ * @param int $currScope A pointer to the start of the scope.
+ *
+ * @return void
+ */
+ protected function processTokenWithinScope(
+ PHP_CodeSniffer_File $phpcsFile,
+ $stackPtr,
+ $currScope
+ ) {
+ $className = $phpcsFile->getDeclarationName($currScope);
+ $methodName = $phpcsFile->getDeclarationName($stackPtr);
+
+ if (strcasecmp($methodName, $className) === 0) {
+ $error = 'PHP4 style constructors are discouraged; use "__construct()" instead';
+ $phpcsFile->addWarning($error, $stackPtr, 'OldStyle');
+ } else if (strcasecmp($methodName, '__construct') !== 0) {
+ // Not a constructor.
+ return;
+ }
+
+ $tokens = $phpcsFile->getTokens();
+
+ $parentClassName = $phpcsFile->findExtendedClassName($currScope);
+ if ($parentClassName === false) {
+ return;
+ }
+
+ $endFunctionIndex = $tokens[$stackPtr]['scope_closer'];
+ $startIndex = $stackPtr;
+ while ($doubleColonIndex = $phpcsFile->findNext(array(T_DOUBLE_COLON), $startIndex, $endFunctionIndex)) {
+ if ($tokens[($doubleColonIndex + 1)]['code'] === T_STRING
+ && $tokens[($doubleColonIndex + 1)]['content'] === $parentClassName
+ ) {
+ $error = 'PHP4 style calls to parent constructors are discouraged; use "parent::__construct()" instead';
+ $phpcsFile->addWarning($error, ($doubleColonIndex + 1), 'OldStyleCall');
+ }
+
+ $startIndex = ($doubleColonIndex + 1);
+ }
+
+ }//end processTokenWithinScope()
+
+
+}//end class
diff --git a/_cs/DokuWiki/Sniffs/PHP/DeprecatedFunctionsSniff.php b/_cs/DokuWiki/Sniffs/PHP/DeprecatedFunctionsSniff.php
new file mode 100644
index 000000000..ecd4093b8
--- /dev/null
+++ b/_cs/DokuWiki/Sniffs/PHP/DeprecatedFunctionsSniff.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * DokuWiki_Sniffs_PHP_DiscouragedFunctionsSniff.
+ *
+ * PHP version 5
+ *
+ * @category PHP
+ * @package PHP_CodeSniffer
+ * @author Greg Sherwood <gsherwood@squiz.net>
+ * @copyright 2006 Squiz Pty Ltd (ABN 77 084 670 600)
+ * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
+ * @version CVS: $Id: DiscouragedFunctionsSniff.php 265110 2008-08-19 06:36:11Z squiz $
+ * @link http://pear.php.net/package/PHP_CodeSniffer
+ */
+
+if (class_exists('Generic_Sniffs_PHP_ForbiddenFunctionsSniff', true) === false) {
+ throw new PHP_CodeSniffer_Exception('Class Generic_Sniffs_PHP_ForbiddenFunctionsSniff not found');
+}
+
+/**
+ * DokuWiki_Sniffs_PHP_DiscouragedFunctionsSniff.
+ *
+ * @category PHP
+ * @package PHP_CodeSniffer
+ * @author Greg Sherwood <gsherwood@squiz.net>
+ * @copyright 2006 Squiz Pty Ltd (ABN 77 084 670 600)
+ * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
+ * @version Release: 1.2.2
+ * @link http://pear.php.net/package/PHP_CodeSniffer
+ */
+class DokuWiki_Sniffs_PHP_DeprecatedFunctionsSniff extends Generic_Sniffs_PHP_ForbiddenFunctionsSniff
+{
+
+ /**
+ * A list of forbidden functions with their alternatives.
+ *
+ * The value is NULL if no alternative exists. IE, the
+ * function should just not be used.
+ *
+ * @var array(string => string|null)
+ */
+ protected $forbiddenFunctions = array(
+ 'setCorrectLocale' => null,
+ 'html_attbuild' => 'buildAttributes',
+ 'io_runcmd' => null,
+ 'p_wiki_xhtml_summary' => 'p_cached_output',
+ 'search_callback' => 'call_user_func_array',
+ 'search_backlinks' => 'ft_backlinks',
+ 'search_fulltext' => 'Fulltext Indexer',
+ 'search_regex' => 'Fulltext Indexer',
+ 'tpl_getFavicon' => 'tpl_getMediaFile',
+ );
+
+ /**
+ * If true, an error will be thrown; otherwise a warning.
+ *
+ * @var bool
+ */
+ public $error = true;
+
+}//end class
diff --git a/_cs/DokuWiki/Sniffs/PHP/DiscouragedFunctionsSniff.php b/_cs/DokuWiki/Sniffs/PHP/DiscouragedFunctionsSniff.php
index c95e0fd33..9cd9a7d36 100644
--- a/_cs/DokuWiki/Sniffs/PHP/DiscouragedFunctionsSniff.php
+++ b/_cs/DokuWiki/Sniffs/PHP/DiscouragedFunctionsSniff.php
@@ -49,8 +49,6 @@ class DokuWiki_Sniffs_PHP_DiscouragedFunctionsSniff extends Generic_Sniffs_PHP_F
*
* @var bool
*/
- protected $error = false;
+ public $error = false;
}//end class
-
-?>
diff --git a/_cs/DokuWiki/ruleset.xml b/_cs/DokuWiki/ruleset.xml
new file mode 100644
index 000000000..bfbef87fe
--- /dev/null
+++ b/_cs/DokuWiki/ruleset.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<ruleset name="DokuWiki">
+ <description>DokuWiki Coding Standard</description>
+
+ <!-- ignore 3rd party libraries (that we haven't adopted) -->
+ <exclude-pattern>*/adLDAP.php</exclude-pattern>
+ <exclude-pattern>*/EmailAddressValidator.php</exclude-pattern>
+ <exclude-pattern>*/feedcreator.class.php</exclude-pattern>
+ <exclude-pattern>*/SimplePie.php</exclude-pattern>
+ <exclude-pattern>*/geshi.php</exclude-pattern>
+ <exclude-pattern>*/geshi/*</exclude-pattern>
+ <exclude-pattern>*/JSON.php</exclude-pattern>
+
+ <!-- ignore devel only parts -->
+ <exclude-pattern>*/_test/*</exclude-pattern>
+ <exclude-pattern>*/_cs/*</exclude-pattern>
+
+ <rule ref="Generic.Classes.DuplicateClassName" />
+ <rule ref="Generic.CodeAnalysis.JumbledIncrementer" />
+ <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier" />
+ <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement" />
+ <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop" />
+ <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall" />
+ <rule ref="Generic.CodeAnalysis.UnusedFunctionParameter" />
+ <rule ref="Generic.CodeAnalysis.EmptyStatement" />
+ <rule ref="Generic.CodeAnalysis.UselessOverridingMethod" />
+ <rule ref="Generic.Commenting.Todo" />
+ <ruke ref="Generic.Files.ByteOrderMark" />
+ <rule ref="Generic.Files.LineEndings" />
+ <rule ref="Generic.Formatting.DisallowMultipleStatements" />
+ <rule ref="Generic.Metrics.NestingLevel">
+ <properties>
+ <property name="nestingLevel" value="6" />
+ </properties>
+ </rule>
+ <rule ref="Generic.NamingConventions.UpperCaseConstantName" />
+ <rule ref="Generic.PHP.LowerCaseConstant" />
+ <rule ref="Generic.PHP.DeprecatedFunctions.php" />
+ <rule ref="Generic.PHP.DisallowShortOpenTag" />
+ <rule ref="Generic.PHP.ForbiddenFunctions" />
+ <rule ref="Generic.WhiteSpace.DisallowTabIndent" />
+ <rule ref="Generic.Classes.DuplicateClassName" />
+ <rule ref="Generic.Functions.CallTimePassByReference" />
+ <rule ref="Zend.Files.ClosingTag" />
+ <rule ref="PEAR.Functions.ValidDefaultValue" />
+ <rule ref="Squiz.PHP.Eval" />
+ <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace" />
+ <rule ref="Squiz.CSS.LowercaseStyleDefinition" />
+ <rule ref="Squiz.CSS.MissingColon" />
+ <rule ref="Squiz.CSS.DisallowMultipleStyleDefinitions" />
+ <rule ref="Squiz.CSS.ColonSpacing" />
+ <rule ref="Squiz.CSS.ClassDefinitionClosingBraceSpace" />
+ <rule ref="Squiz.CSS.SemicolonSpacing" />
+ <rule ref="Squiz.CSS.Indentation" />
+ <rule ref="Squiz.CSS.EmptyClassDefinition" />
+ <rule ref="Squiz.CSS.ClassDefinitionNameSpacing" />
+ <rule ref="Squiz.CSS.EmptyStyleDefinition" />
+ <rule ref="Squiz.CSS.Opacity" />
+ <rule ref="Squiz.CSS.ColourDefinition" />
+ <rule ref="Squiz.CSS.DuplicateClassDefinition" />
+ <rule ref="Squiz.CSS.ClassDefinitionOpeningBraceSpace" />
+ <rule ref="Squiz.Commenting.DocCommentAlignment" />
+
+</ruleset>
diff --git a/_test/README b/_test/README
index 099290a0d..a4206f489 100644
--- a/_test/README
+++ b/_test/README
@@ -1,84 +1,82 @@
---------------------------------------------------------------------------------
- Dokuwiki Unit Test Suite
---------------------------------------------------------------------------------
-$Date: 2004/02/14 02:14:50 $
-
-Credits: to the WACT team - http://www.phpwact.org, from whom the basis of
-this test suite was stolen
-
---------------------------------------------------------------------------------
-INSTALLING & SETUP
-
-1. Grab a copy of the SimpleTest unit testing framework an extract somewhere
-
- http://www.lastcraft.com/simple_test.php
- or
- http://sourceforge.net/projects/simpletest
-
-2. Edit ./tests.ini
-
- - TEST_ENABLED - set to "1" to allow the test suite to be used
- by vistors to your site. Generally best to leave as 0 for
- a productive site - running tests alot will hammer the server
- Note: you will still be able to run the tests from the command
- line even when this is set to 0
-
- - WEB_TEST_URL - this is for running "web tests" where SimpleTest
- acts as a web browser and executes HTTP requests against pages.
- Should point at your Dokuwiki URL e.g.
-
- http://localhost/dokuwiki
-
- - PROXY - if you're behind a proxy, specify it here
- Note: username / password are optional e.g.
-
- http://proxyuser:proxypwd@proxy.yourdomain.com:8080
-
- - REMOTE_TEST_URL - it's possible to run the full test suite
- remotely (over HTTP) with some XML goodness. This should
- point at the URL of the test suite you want to test
- See the following URL for more info;
- http://www.sitepoint.com/blogs/2004/06/15/simple-test-remote-testing/
-
- - Simple Test
- Update the library_path to point at the directory where you installed
- Simple Test
-
---------------------------------------------------------------------------------
-RUNNING THE TESTS
-
-You can run the tests in three ways. From the command line:
-
- $ ./runtests.php -h
-
-Using a web browser;
-
- http://localhost/dokuwiki/_test/index.php
-
-As remote tests run on a remote serveri (specified in tests.ini with REMOTE_TEST_URL) and driven locally from the command line using;
-
- $ ./remotetests.php -h
-
-
---------------------------------------------------------------------------------
-ADDING TESTS
-
-The test cases are kept in the './cases' directory in a directory structure
-mirroring that of the Dokuwiki's
-
-Files with the extension .group.php are group tests (collections of
-one or more seperate unit test files) - there should be one group
-test per file in Dokuwiki's real directory.
-
-Individual tests files have the extension .test.php
-
-To add tests, create a .test.php file in the correct directory under ./cases
-Probably best to use one of the existing scripts as a basis
-
-The test will not be executable via one of the test runners (see above).
-
-To add it to a group of tests, modify the corresponding .group.php file.
-
-One exception to the naming convention - files named .webtest.php and
-.webgroup.php are run using SimpleTest's browser simulator.
-
+====== DokuWiki Test Suite ======
+
+This is the test suit to automatically test various parts of DokuWiki.
+
+===== Requirements =====
+
+ * PHPUnit 3.6.10+ http://www.phpunit.de/
+ * PHP 5.3+ http://www.php.net
+
+===== PHPUnit Installation ======
+
+via PEAR:
+
+ pear config-set auto_discover 1
+ pear upgrade
+ pear install pear.phpunit.de/PHPUnit
+
+on Windows:
+
+ FIXME
+
+
+===== Running all Tests =====
+
+Just change to the ''_test'' directory and run phpunit:
+
+ cd _testing/
+ phpunit
+
+PHPUnit will fail on some systems with a //headers already sent// error.
+This is a known problem with PHPUnit, the error can be avoided by passing the
+'--stderr' flag to phpunit:
+
+ phpunit --stderr
+
+On windows you may have to enable OpenSSL support for https tests.
+Some of them point to httpclient_http.tests.php on the failure.
+To enable HTTPS support copy the ''libeay32.dll'' and ''ssleay32.dll'' to your ''windows\system32'' folder
+and add the following line to your php.ini in the extension section:
+<code ini>
+extension=php_openssl.dll
+</code>
+
+===== Running selected Tests =====
+
+You can run a single test file by providing it as an argument to phpunit:
+
+ phpunit --stderr tests/inc/common_cleanText.test.php
+
+You can also use groups to exclude certain test from running. For example use
+the following command to avoid long running test or tests accessing the
+Internet.
+
+ phpunit --stderr --exclude-group slow,internet
+
+===== Create new Tests =====
+
+To create a test for DokuWiki, create a *.test.php file within the tests/
+folder. Please respect the folder structure and naming convention. Inside the
+file, implement a class, extending 'DokuWikiTest'. Every method, starting
+with 'test' will be called as a test (e.g. 'testIfThisIsValid');
+
+
+===== TODO for the test framework =====
+
+ * test cross platform compatibility: especially test windows
+ * update http://www.dokuwiki.org/devel:unittesting
+ * optional: add helper methods to TestRequest for easy form submission
+ * createForm(), ...
+ * check PHP Unit test_helpers https://github.com/sebastianbergmann/php-test-helpers
+
+
+===== Migration Protocol =====
+
+The following tests were not migrated:
+
+ * inc/indexer_idx_indexlengths (fs dependencies)
+ * inc/mail_send (integration test)
+ * inc/parser/parser_formatting
+ * inc/parser/xhtml_htmlphp (runkit)
+ * inc/parser/xhtml_links
+
diff --git a/_test/bootstrap.php b/_test/bootstrap.php
new file mode 100644
index 000000000..58ad6a0d7
--- /dev/null
+++ b/_test/bootstrap.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Test Suite bootstrapping for DokuWiki
+ */
+
+if(!defined('DOKU_UNITTEST')) define('DOKU_UNITTEST',dirname(__FILE__).'/');
+require_once DOKU_UNITTEST.'core/phpQuery-onefile.php';
+require_once DOKU_UNITTEST.'core/DokuWikiTest.php';
+require_once DOKU_UNITTEST.'core/TestResponse.php';
+require_once DOKU_UNITTEST.'core/TestRequest.php';
+require_once DOKU_UNITTEST.'core/TestUtils.php';
+
+
+// backward compatibility to old test suite
+define('SIMPLE_TEST', true);
+
+// basic behaviours
+error_reporting(E_ALL);
+set_time_limit(0);
+ini_set('memory_limit','2048M');
+
+// prepare temporary directories
+define('DOKU_INC', dirname(dirname(__FILE__)).'/');
+define('TMP_DIR', sys_get_temp_dir().'/dwtests-'.microtime(true));
+define('DOKU_CONF', TMP_DIR.'/conf/');
+define('DOKU_TMP_DATA', TMP_DIR.'/data/');
+
+// default plugins
+$default_plugins = array(
+ 'acl',
+ 'config',
+ 'info',
+ 'plugin',
+ 'popularity',
+ 'revert',
+ 'safefnrecode',
+ 'usermanager'
+);
+
+// default server variables
+$default_server_vars = array(
+ 'QUERY_STRING' => '?id=',
+ 'REQUEST_METHOD' => 'GET',
+ 'CONTENT_TYPE' => '',
+ 'CONTENT_LENGTH' => '',
+ 'SCRIPT_NAME' => '/doku.php',
+ 'REQUEST_URI' => '/doku.php?id=',
+ 'DOCUMENT_URI' => '/doku.php',
+ 'DOCUMENT_ROOT' => DOKU_INC,
+ 'SERVER_PROTOCOL' => 'HTTP/1.1',
+ 'SERVER_SOFTWARE' => 'nginx/0.7.67',
+ 'REMOTE_ADDR' => '87.142.120.6',
+ 'REMOTE_PORT' => '21418',
+ 'SERVER_ADDR' => '46.38.241.24',
+ 'SERVER_PORT' => '443',
+ 'SERVER_NAME' => 'wiki.example.com',
+ 'REDIRECT_STATUS' => '200',
+ 'SCRIPT_FILENAME' => DOKU_INC.'doku.php',
+ 'HTTP_HOST' => 'wiki.example.com',
+ 'HTTP_USER_AGENT' => 'Mozilla/5.0 (X11; OpenBSD amd64; rv:11.0) Gecko/20100101 Firefox/11.0',
+ 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
+ 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate',
+ 'HTTP_CONNECTION' => 'keep-alive',
+ 'HTTP_CACHE_CONTROL' => 'max-age=0',
+ 'PHP_SELF' => '/doku.php',
+ 'REQUEST_TIME' => time(),
+);
+
+// create temp directories
+mkdir(TMP_DIR);
+
+// cleanup dir after exit
+if (getenv('PRESERVE_TMP') != 'true') {
+ register_shutdown_function(function() {
+ TestUtils::rdelete(TMP_DIR);
+ });
+} else {
+ echo ">>>> Preserving temporary directory: ".TMP_DIR."\n";
+}
+
+// populate default dirs
+TestUtils::rcopy(TMP_DIR, DOKU_INC.'/conf');
+TestUtils::rcopy(TMP_DIR, dirname(__FILE__).'/conf');
+mkdir(DOKU_TMP_DATA);
+foreach(array(
+ 'attic', 'cache', 'index', 'locks', 'media',
+ 'media_attic', 'media_meta', 'meta', 'pages', 'tmp') as $dir){
+ mkdir(DOKU_TMP_DATA.'/'.$dir);
+}
+
+// disable all non-default plugins by default
+$dh = dir(DOKU_INC.'lib/plugins/');
+while (false !== ($entry = $dh->read())) {
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+
+ if (!is_dir(DOKU_INC.'lib/plugins/'.$entry)) {
+ continue;
+ }
+
+ if (!in_array($entry, $default_plugins)) {
+ // disable this plugin
+ TestUtils::fappend(DOKU_CONF.'plugins.local.php', "\$plugins['$entry'] = 0;\n");
+ }
+}
+$dh->close();
+
+// load dw
+require_once(DOKU_INC.'inc/init.php');
+
diff --git a/_test/cases/inc/DifferenceEngine.test.php b/_test/cases/inc/DifferenceEngine.test.php
deleted file mode 100644
index aa1756114..000000000
--- a/_test/cases/inc/DifferenceEngine.test.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-require_once DOKU_INC.'inc/DifferenceEngine.php';
-
-class differenceengine_test extends UnitTestCase {
-
- function test_white_between_words(){
- // From FS#2161
- global $lang;
-
- $df = new Diff(explode("\n","example"),
- explode("\n","example example2"));
-
- $idf = new InlineDiffFormatter();
- $tdf = new TableDiffFormatter();
-
- $this->assertEqual($idf->format($df), '<tr><td colspan="4" class="diff-blockheader">@@ ' . $lang['line'] .
- ' -1 +1 @@&nbsp;<span class="diff-deletedline"><del>' . $lang['deleted'] .
- '</del></span>&nbsp;<span class="diff-addedline">' . $lang['created'] .
- '</span></td></tr>
-
-<tr><td colspan="4">example&nbsp;<span class="diff-addedline">example2</span></td></tr>
-');
- $this->assertEqual($tdf->format($df),
- '<tr><td class="diff-blockheader" colspan="2">' . $lang['line'] . ' 1:</td>
-<td class="diff-blockheader" colspan="2">' . $lang['line'] . ' 1:</td>
-</tr>
-<tr><td>-</td><td class="diff-deletedline">example</td><td>+</td><td class="diff-addedline">example&nbsp;<strong>example2</strong></td></tr>
-');
- }
-}
-//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/auth_aclcheck.test.php b/_test/cases/inc/auth_aclcheck.test.php
deleted file mode 100644
index ff092c2de..000000000
--- a/_test/cases/inc/auth_aclcheck.test.php
+++ /dev/null
@@ -1,231 +0,0 @@
-<?php
-
-require_once DOKU_INC.'inc/init.php';
-require_once DOKU_INC.'inc/auth.php';
-
-class auth_acl_test extends UnitTestCase {
-
- function teardown() {
- global $conf;
- global $AUTH_ACL;
- unset($conf);
- unset($AUTH_ACL);
-
- }
-
- function test_restricted(){
- global $conf;
- global $AUTH_ACL;
- $conf['superuser'] = 'john';
- $conf['useacl'] = 1;
-
- $AUTH_ACL = array(
- '* @ALL 0',
- '* @user 8',
- );
-
- // anonymous user
- $this->assertEqual(auth_aclcheck('page', '',array()), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
-
- // user with no matching group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
-
- // user with matching group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_UPLOAD);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
-
- // super user
- $this->assertEqual(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
- }
-
- function test_restricted_ropage(){
- global $conf;
- global $AUTH_ACL;
- $conf['superuser'] = 'john';
- $conf['useacl'] = 1;
-
- $AUTH_ACL = array(
- '* @ALL 0',
- '* @user 8',
- 'namespace:page @user 1',
- );
-
- // anonymous user
- $this->assertEqual(auth_aclcheck('page', '',array()), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
-
- // user with no matching group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
-
- // user with matching group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_READ);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
-
- // super user
- $this->assertEqual(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
- }
-
- function test_aclexample(){
- global $conf;
- global $AUTH_ACL;
- $conf['superuser'] = 'john';
- $conf['useacl'] = 1;
-
- $AUTH_ACL = array(
- '* @ALL 4',
- '* bigboss 16',
- 'start @ALL 1',
- 'marketing:* @marketing 8',
- 'devel:* @ALL 0',
- 'devel:* @devel 8',
- 'devel:* bigboss 16',
- 'devel:funstuff bigboss 0',
- 'devel:* @marketing 1',
- 'devel:marketing @marketing 2',
- );
-
-
- $this->assertEqual(auth_aclcheck('page', '' ,array()) , AUTH_CREATE);
- $this->assertEqual(auth_aclcheck('page', 'bigboss' ,array('foo')) , AUTH_DELETE);
- $this->assertEqual(auth_aclcheck('page', 'jill' ,array('marketing')) , AUTH_CREATE);
- $this->assertEqual(auth_aclcheck('page', 'jane' ,array('devel')) , AUTH_CREATE);
-
- $this->assertEqual(auth_aclcheck('start', '' ,array()) , AUTH_READ);
- $this->assertEqual(auth_aclcheck('start', 'bigboss' ,array('foo')) , AUTH_READ);
- $this->assertEqual(auth_aclcheck('start', 'jill' ,array('marketing')) , AUTH_READ);
- $this->assertEqual(auth_aclcheck('start', 'jane' ,array('devel')) , AUTH_READ);
-
- $this->assertEqual(auth_aclcheck('marketing:page', '' ,array()) , AUTH_CREATE);
- $this->assertEqual(auth_aclcheck('marketing:page', 'bigboss' ,array('foo')) , AUTH_DELETE);
- $this->assertEqual(auth_aclcheck('marketing:page', 'jill' ,array('marketing')) , AUTH_UPLOAD);
- $this->assertEqual(auth_aclcheck('marketing:page', 'jane' ,array('devel')) , AUTH_CREATE);
-
-
- $this->assertEqual(auth_aclcheck('devel:page', '' ,array()) , AUTH_NONE);
- $this->assertEqual(auth_aclcheck('devel:page', 'bigboss' ,array('foo')) , AUTH_DELETE);
- $this->assertEqual(auth_aclcheck('devel:page', 'jill' ,array('marketing')) , AUTH_READ);
- $this->assertEqual(auth_aclcheck('devel:page', 'jane' ,array('devel')) , AUTH_UPLOAD);
-
- $this->assertEqual(auth_aclcheck('devel:funstuff', '' ,array()) , AUTH_NONE);
- $this->assertEqual(auth_aclcheck('devel:funstuff', 'bigboss' ,array('foo')) , AUTH_NONE);
- $this->assertEqual(auth_aclcheck('devel:funstuff', 'jill' ,array('marketing')) , AUTH_READ);
- $this->assertEqual(auth_aclcheck('devel:funstuff', 'jane' ,array('devel')) , AUTH_UPLOAD);
-
- $this->assertEqual(auth_aclcheck('devel:marketing', '' ,array()) , AUTH_NONE);
- $this->assertEqual(auth_aclcheck('devel:marketing', 'bigboss' ,array('foo')) , AUTH_DELETE);
- $this->assertEqual(auth_aclcheck('devel:marketing', 'jill' ,array('marketing')) , AUTH_EDIT);
- $this->assertEqual(auth_aclcheck('devel:marketing', 'jane' ,array('devel')) , AUTH_UPLOAD);
-
- }
-
- function test_multiadmin_restricted(){
- global $conf;
- global $AUTH_ACL;
- $conf['superuser'] = 'john,@admin,doe,@roots';
- $conf['useacl'] = 1;
-
- $AUTH_ACL = array(
- '* @ALL 0',
- '* @user 8',
- );
-
- // anonymous user
- $this->assertEqual(auth_aclcheck('page', '',array()), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
-
- // user with no matching group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
-
- // user with matching group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_UPLOAD);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
-
- // super user john
- $this->assertEqual(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
-
- // super user doe
- $this->assertEqual(auth_aclcheck('page', 'doe',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:page','doe',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:*', 'doe',array('foo')), AUTH_ADMIN);
-
- // user with matching admin group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo','admin')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo','admin')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo','admin')), AUTH_ADMIN);
-
- // user with matching another admin group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo','roots')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo','roots')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo','roots')), AUTH_ADMIN);
- }
-
- function test_multiadmin_restricted_ropage(){
- global $conf;
- global $AUTH_ACL;
- $conf['superuser'] = 'john,@admin,doe,@roots';
- $conf['useacl'] = 1;
-
- $AUTH_ACL = array(
- '* @ALL 0',
- '* @user 8',
- 'namespace:page @user 1',
- );
-
- // anonymous user
- $this->assertEqual(auth_aclcheck('page', '',array()), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
-
- // user with no matching group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
-
- // user with matching group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_READ);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
-
- // super user john
- $this->assertEqual(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
-
- // super user doe
- $this->assertEqual(auth_aclcheck('page', 'doe',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:page','doe',array('foo')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:*', 'doe',array('foo')), AUTH_ADMIN);
-
- // user with matching admin group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo','admin')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo','admin')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo','admin')), AUTH_ADMIN);
-
- // user with matching another admin group
- $this->assertEqual(auth_aclcheck('page', 'jill',array('foo','roots')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:page','jill',array('foo','roots')), AUTH_ADMIN);
- $this->assertEqual(auth_aclcheck('namespace:*', 'jill',array('foo','roots')), AUTH_ADMIN);
- }
-
-}
-
-//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/auth_admincheck.test.php b/_test/cases/inc/auth_admincheck.test.php
deleted file mode 100644
index 2a420ffd4..000000000
--- a/_test/cases/inc/auth_admincheck.test.php
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-
-require_once DOKU_INC.'inc/init.php';
-require_once DOKU_INC.'inc/auth.php';
-require_once DOKU_INC.'inc/auth/basic.class.php';
-
-class auth_admin_test_AuthInSensitive extends auth_basic {
- function isCaseSensitive(){
- return false;
- }
-}
-
-class auth_admin_test extends UnitTestCase {
-
- private $oldauth;
-
- function setup() {
- global $auth;
- $this->oldauth = $auth;
- parent::setup();
- }
-
- function setSensitive() {
- global $auth;
- $auth = new auth_basic;
- }
-
- function setInSensitive() {
- global $auth;
- $auth = new auth_admin_test_AuthInSensitive;
- }
-
- function teardown() {
- global $auth;
- global $conf;
- global $AUTH_ACL;
- unset($conf);
- unset($AUTH_ACL);
- $auth = $this->oldauth;
- parent::teardown();
- }
-
- function test_ismanager_insensitive(){
- $this->setInSensitive();
- global $conf;
- $conf['superuser'] = 'john,@admin,@Mötly Görls, Dörte';
- $conf['manager'] = 'john,@managers,doe, @Mötly Böys, Dänny';
-
- // anonymous user
- $this->assertEqual(auth_ismanager('jill', null,false), false);
-
- // admin or manager users
- $this->assertEqual(auth_ismanager('john', null,false), true);
- $this->assertEqual(auth_ismanager('doe', null,false), true);
-
- $this->assertEqual(auth_ismanager('dörte', null,false), true);
- $this->assertEqual(auth_ismanager('dänny', null,false), true);
-
- // admin or manager groups
- $this->assertEqual(auth_ismanager('jill', array('admin'),false), true);
- $this->assertEqual(auth_ismanager('jill', array('managers'),false), true);
-
- $this->assertEqual(auth_ismanager('jill', array('mötly görls'),false), true);
- $this->assertEqual(auth_ismanager('jill', array('mötly böys'),false), true);
- }
-
- function test_isadmin_insensitive(){
- $this->setInSensitive();
- global $conf;
- $conf['superuser'] = 'john,@admin,doe,@roots';
-
- // anonymous user
- $this->assertEqual(auth_ismanager('jill', null,true), false);
-
- // admin user
- $this->assertEqual(auth_ismanager('john', null,true), true);
- $this->assertEqual(auth_ismanager('doe', null,true), true);
-
- // admin groups
- $this->assertEqual(auth_ismanager('jill', array('admin'),true), true);
- $this->assertEqual(auth_ismanager('jill', array('roots'),true), true);
- $this->assertEqual(auth_ismanager('john', array('admin'),true), true);
- $this->assertEqual(auth_ismanager('doe', array('admin'),true), true);
- }
-
- function test_ismanager_sensitive(){
- $this->setSensitive();
- global $conf;
- $conf['superuser'] = 'john,@admin,@Mötly Görls, Dörte';
- $conf['manager'] = 'john,@managers,doe, @Mötly Böys, Dänny';
-
- // anonymous user
- $this->assertEqual(auth_ismanager('jill', null,false), false);
-
- // admin or manager users
- $this->assertEqual(auth_ismanager('john', null,false), true);
- $this->assertEqual(auth_ismanager('doe', null,false), true);
-
- $this->assertEqual(auth_ismanager('dörte', null,false), false);
- $this->assertEqual(auth_ismanager('dänny', null,false), false);
-
- // admin or manager groups
- $this->assertEqual(auth_ismanager('jill', array('admin'),false), true);
- $this->assertEqual(auth_ismanager('jill', array('managers'),false), true);
-
- $this->assertEqual(auth_ismanager('jill', array('mötly görls'),false), false);
- $this->assertEqual(auth_ismanager('jill', array('mötly böys'),false), false);
- }
-
- function test_isadmin_sensitive(){
- $this->setSensitive();
- global $conf;
- $conf['superuser'] = 'john,@admin,doe,@roots';
-
- // anonymous user
- $this->assertEqual(auth_ismanager('jill', null,true), false);
-
- // admin user
- $this->assertEqual(auth_ismanager('john', null,true), true);
- $this->assertEqual(auth_ismanager('Doe', null,true), false);
-
- // admin groups
- $this->assertEqual(auth_ismanager('jill', array('admin'),true), true);
- $this->assertEqual(auth_ismanager('jill', array('roots'),true), true);
- $this->assertEqual(auth_ismanager('john', array('admin'),true), true);
- $this->assertEqual(auth_ismanager('doe', array('admin'),true), true);
- $this->assertEqual(auth_ismanager('Doe', array('admin'),true), true);
- }
-
-}
-
-//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/common_pagetemplate.test.php b/_test/cases/inc/common_pagetemplate.test.php
deleted file mode 100644
index 2db8b64ae..000000000
--- a/_test/cases/inc/common_pagetemplate.test.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-require_once DOKU_INC.'inc/common.php';
-
-class common_pagetemplate_test extends UnitTestCase {
-
- function test_none(){
- global $conf;
- $conf['sepchar'] = '-';
- $data = array(
- 'id' => 'page-id-long',
- 'tpl' => '"@PAGE@" "@!PAGE@" "@!!PAGE@" "@!PAGE!@"',
- );
- $old = error_reporting(E_ALL & ~E_NOTICE);
- $this->assertEqual(parsePageTemplate($data), '"page id long" "Page id long" "Page Id Long" "PAGE ID LONG"');
- error_reporting($old);
- }
-}
-//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/html_hilight.test.php b/_test/cases/inc/html_hilight.test.php
deleted file mode 100644
index cc5579c71..000000000
--- a/_test/cases/inc/html_hilight.test.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-
-require_once DOKU_INC.'inc/html.php';
-
-if (!extension_loaded('runkit')) {
- SimpleTestOptions::ignore('html_hilight_test');
- trigger_error('Skipping html_hilight_test - http://www.php.net/runkit required');
-}
-
-function html_hilight_test_unslash($string,$char="'"){
- $str= str_replace('\\'.$char,$char,$string);
- return $str;
-}
-
-class html_hilight_test extends UnitTestCase{
-
- function setup() {
- if ( function_exists('unslash') ) {
- runkit_function_rename('unslash','html_hilight_test_unslash_real');
- }
- runkit_function_rename('html_hilight_test_unslash','unslash');
- }
-
- function teardown() {
- runkit_function_rename('unslash','html_hilight_test_unslash');
- if ( function_exists('html_hilight_test_unslash_real') ) {
- runkit_function_rename('html_hilight_test_unslash_real','unslash');
- }
- }
-
- function testHighlightOneWord() {
- $html = 'Foo bar Foo';
- $this->assertPattern(
- '/Foo <span.*>bar<\/span> Foo/',
- html_hilight($html,'bar')
- );
- }
-
- function testHighlightTwoWords() {
- $html = 'Foo bar Foo php Foo';
- $this->assertPattern(
- '/Foo <span.*>bar<\/span> Foo <span.*>php<\/span> Foo/',
- html_hilight($html,array('bar','php'))
- );
- }
-
- function testHighlightTwoWordsHtml() {
- $html = 'Foo <b>bar</b> <i>Foo</i> php Foo';
- $this->assertPattern(
- '/Foo <b><span.*>bar<\/span><\/b> <i>Foo<\/i> <span.*>php<\/span> Foo/',
- html_hilight($html,array('bar','php'))
- );
- }
-
- function testNoHighlight() {
- $html = 'Foo bar Foo';
- $this->assertPattern(
- '/Foo bar Foo/',
- html_hilight($html,'php')
- );
- }
-
- function testHighlightPHP() {
- $html = 'Foo $_GET[\'bar\'] Foo';
- $this->assertEqual(
- 'Foo <span class="search_hit">$_GET[\'bar\']</span> Foo',
- html_hilight($html,'$_GET[\'bar\']')
- );
- }
-
- function testMatchAttribute() {
- $html = 'Foo <b class="x">bar</b> Foo';
- $this->assertPattern(
- '/Foo <b class="x">bar<\/b> Foo/',
- html_hilight($html,'class="x"')
- );
- }
-
- function testMatchAttributeWord() {
- $html = 'Foo <b class="x">bar</b> Foo';
- $this->assertEqual(
- 'Foo <b class="x">bar</b> Foo',
- html_hilight($html,'class="x">bar')
- );
- }
-
- function testRegexInjection() {
- $html = 'Foo bar Foo';
- $this->assertPattern(
- '/Foo bar Foo/',
- html_hilight($html,'*')
- );
- }
-
- function testRegexInjectionSlash() {
- $html = 'Foo bar Foo';
- $this->assertPattern(
- '/Foo bar Foo/',
- html_hilight($html,'x/')
- );
- }
-
-}
-
diff --git a/_test/cases/inc/indexer_idx_indexlengths.test.php b/_test/cases/inc/indexer_idx_indexlengths.test.php
deleted file mode 100644
index a0f7c9224..000000000
--- a/_test/cases/inc/indexer_idx_indexlengths.test.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-require_once DOKU_INC.'inc/indexer.php';
-
-class indexer_idx_indexlengths_test extends UnitTestCase {
-
- /**
- * Test the function with an array of one value
- */
- function test_oneWord(){
- global $conf;
- $filter[8] = array('dokuwiki');
- // one word should return the index
- $ref[] = 8;
- sort($ref);
- $result = idx_indexLengths(&$filter);
- sort($result);
- $this->assertIdentical($result, $ref);
- }
-
- /**
- * Test the function with an array of values
- */
- function test_moreWords() {
- global $conf;
- $filter = array( 4 => array('test'), 8 => array('dokuwiki'), 7 => array('powered'));
- // more words should return the indexes
- $ref = array(4, 7, 8);
- sort($ref);
- $result = idx_indexLengths(&$filter);
- sort($result);
- $this->assertIdentical($result, $ref);
- }
-
- /**
- * Test a minimal value in case of wildcard search
- */
- function test_minValue() {
- global $conf;
- $filter = 5;
- // construction of the list of the index to compare
- $dir = @opendir($conf['indexdir']);
- $ref = array();
- while (($f = readdir($dir)) !== false) {
- if (substr($f,0,1) == 'i' && substr($f,-4) == '.idx'){
- $i = substr($f,1,-4);
- if (is_numeric($i) && $i >= $filter)
- $ref[] = (int)$i;
- }
- }
- closedir($dir);
- sort($ref);
- $result = idx_indexLengths(&$filter);
- sort($result);
- $this->assertIdentical($result, $ref);
- }
-}
-
-
-//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/mail_send.php b/_test/cases/inc/mail_send.php
deleted file mode 100644
index e41c501fe..000000000
--- a/_test/cases/inc/mail_send.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-require_once DOKU_INC.'inc/mail.php';
-
-class mail_send extends UnitTestCase {
-
- /**
- * These tests will try to send a bunch of mails to dokuwiki1@spam.la and
- * dokuwiki2@spam.la - check the correctness at http://spam.la
- */
- function test1(){
- $addr = array(
- 'dokuwiki1@spam.la',
- 'dokuwiki2@spam.la',
- 'Test User <dokuwiki1@spam.la>',
- 'dokuwiki1@spam.la, dokuwiki2@spam.la',
- 'Test User 1 <dokuwiki1@spam.la>, Test User 2 <dokuwiki2@spam.la>'
- );
-
-
- $run = 0;
- foreach($addr as $ad){
- $run++;
- $data = array(
- 'to' => $ad,
- 'subject' => 'mailtest 1-'.$run,
- 'body' => "Mailtest run 1-$run using to: $ad from:",
- );
- $this->assertTrue((bool) _mail_send_action($data));
-
- $data = array(
- 'to' => $ad,
- 'from' => 'dokuwiki1@spam.la',
- 'subject' => 'mailtest 2-'.$run,
- 'body' => "Mailtest run 2-$run using to: $ad from: dokuwiki1@spam.la",
- );
- $this->assertTrue((bool) _mail_send_action($data));
-
- $data = array(
- 'to' => $ad,
- 'from' => '"Foo Bar" <dokuwiki@spam.la>',
- 'subject' => 'mailtest 3-'.$run,
- 'body' => "Mailtest run 3-$run using to: $ad from: \"Foo Bar\" <dokuwiki@spam.la>",
- );
- $this->assertTrue((bool) _mail_send_action($data));
- }
- }
-
-}
-//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/parser/lexer.group.php b/_test/cases/inc/parser/lexer.group.php
deleted file mode 100644
index 6e9ef0742..000000000
--- a/_test/cases/inc/parser/lexer.group.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-/**
-* @version $Id: lexer.group.php,v 1.2 2005/03/25 21:00:22 harryf Exp $
-* @package JPSpan
-* @subpackage Tests
-*/
-
-/**
-* @package JPSpan
-* @subpackage Tests
-*/
-class LexerGroupTest extends GroupTest {
-
- function LexerGroupTest() {
- $this->GroupTest('LexerGroupTest');
- $this->addTestFile(dirname(__FILE__).'/lexer.test.php');
- }
-
-}
-
-?>
diff --git a/_test/cases/inc/parser/lexer.test.php b/_test/cases/inc/parser/lexer.test.php
deleted file mode 100644
index e802277f1..000000000
--- a/_test/cases/inc/parser/lexer.test.php
+++ /dev/null
@@ -1,625 +0,0 @@
-<?php
-/**
-* @version $Id: lexer.test.php,v 1.2 2005/03/25 21:00:22 harryf Exp $
-* @package Doku
-* @subpackage Tests
-*/
-
-/**
-* Includes
-*/
-require_once DOKU_INC . 'inc/parser/lexer.php';
-
-/**
-* @package Doku
-* @subpackage Tests
-*/
-class TestOfLexerParallelRegex extends UnitTestCase {
- function TestOfLexerParallelRegex() {
- $this->UnitTestCase();
- }
- function testNoPatterns() {
- $regex = new Doku_LexerParallelRegex(false);
- $this->assertFalse($regex->match("Hello", $match));
- $this->assertEqual($match, "");
- }
- function testNoSubject() {
- $regex = new Doku_LexerParallelRegex(false);
- $regex->addPattern(".*");
- $this->assertTrue($regex->match("", $match));
- $this->assertEqual($match, "");
- }
- function testMatchAll() {
- $regex = new Doku_LexerParallelRegex(false);
- $regex->addPattern(".*");
- $this->assertTrue($regex->match("Hello", $match));
- $this->assertEqual($match, "Hello");
- }
- function testCaseSensitive() {
- $regex = new Doku_LexerParallelRegex(true);
- $regex->addPattern("abc");
- $this->assertTrue($regex->match("abcdef", $match));
- $this->assertEqual($match, "abc");
- $this->assertTrue($regex->match("AAABCabcdef", $match));
- $this->assertEqual($match, "abc");
- }
- function testCaseInsensitive() {
- $regex = new Doku_LexerParallelRegex(false);
- $regex->addPattern("abc");
- $this->assertTrue($regex->match("abcdef", $match));
- $this->assertEqual($match, "abc");
- $this->assertTrue($regex->match("AAABCabcdef", $match));
- $this->assertEqual($match, "ABC");
- }
- function testMatchMultiple() {
- $regex = new Doku_LexerParallelRegex(true);
- $regex->addPattern("abc");
- $regex->addPattern("ABC");
- $this->assertTrue($regex->match("abcdef", $match));
- $this->assertEqual($match, "abc");
- $this->assertTrue($regex->match("AAABCabcdef", $match));
- $this->assertEqual($match, "ABC");
- $this->assertFalse($regex->match("Hello", $match));
- }
- function testPatternLabels() {
- $regex = new Doku_LexerParallelRegex(false);
- $regex->addPattern("abc", "letter");
- $regex->addPattern("123", "number");
- $this->assertIdentical($regex->match("abcdef", $match), "letter");
- $this->assertEqual($match, "abc");
- $this->assertIdentical($regex->match("0123456789", $match), "number");
- $this->assertEqual($match, "123");
- }
- function testMatchMultipleWithLookaheadNot() {
- $regex = new Doku_LexerParallelRegex(true);
- $regex->addPattern("abc");
- $regex->addPattern("ABC");
- $regex->addPattern("a(?!\n).{1}");
- $this->assertTrue($regex->match("abcdef", $match));
- $this->assertEqual($match, "abc");
- $this->assertTrue($regex->match("AAABCabcdef", $match));
- $this->assertEqual($match, "ABC");
- $this->assertTrue($regex->match("a\nab", $match));
- $this->assertEqual($match, "ab");
- $this->assertFalse($regex->match("Hello", $match));
- }
- function testMatchSetOptionCaseless() {
- $regex = new Doku_LexerParallelRegex(true);
- $regex->addPattern("a(?i)b(?i)c");
- $this->assertTrue($regex->match("aBc", $match));
- $this->assertEqual($match, "aBc");
- }
- function testMatchSetOptionUngreedy() {
- $regex = new Doku_LexerParallelRegex(true);
- $regex->addPattern("(?U)\w+");
- $this->assertTrue($regex->match("aaaaaa", $match));
- $this->assertEqual($match, "a");
- }
- function testMatchLookaheadEqual() {
- $regex = new Doku_LexerParallelRegex(true);
- $regex->addPattern("\w(?=c)");
- $this->assertTrue($regex->match("xbyczd", $match));
- $this->assertEqual($match, "y");
- }
- function testMatchLookaheadNot() {
- $regex = new Doku_LexerParallelRegex(true);
- $regex->addPattern("\w(?!b|c)");
- $this->assertTrue($regex->match("xbyczd", $match));
- $this->assertEqual($match, "b");
- }
- function testMatchLookbehindEqual() {
- $regex = new Doku_LexerParallelRegex(true);
- $regex->addPattern("(?<=c)\w");
- $this->assertTrue($regex->match("xbyczd", $match));
- $this->assertEqual($match, "z");
- }
- function testMatchLookbehindNot() {
- $regex = new Doku_LexerParallelRegex(true);
- $regex->addPattern("(?<!\A|x|b)\w");
- $this->assertTrue($regex->match("xbyczd", $match));
- $this->assertEqual($match, "c");
- }
-}
-
-
-class TestOfLexerStateStack extends UnitTestCase {
- function TestOfLexerStateStack() {
- $this->UnitTestCase();
- }
- function testStartState() {
- $stack = new Doku_LexerStateStack("one");
- $this->assertEqual($stack->getCurrent(), "one");
- }
- function testExhaustion() {
- $stack = new Doku_LexerStateStack("one");
- $this->assertFalse($stack->leave());
- }
- function testStateMoves() {
- $stack = new Doku_LexerStateStack("one");
- $stack->enter("two");
- $this->assertEqual($stack->getCurrent(), "two");
- $stack->enter("three");
- $this->assertEqual($stack->getCurrent(), "three");
- $this->assertTrue($stack->leave());
- $this->assertEqual($stack->getCurrent(), "two");
- $stack->enter("third");
- $this->assertEqual($stack->getCurrent(), "third");
- $this->assertTrue($stack->leave());
- $this->assertTrue($stack->leave());
- $this->assertEqual($stack->getCurrent(), "one");
- }
-}
-
-class TestParser {
- function TestParser() {
- }
- function accept() {
- }
- function a() {
- }
- function b() {
- }
-}
-Mock::generate('TestParser');
-
-class TestOfLexer extends UnitTestCase {
- function TestOfLexer() {
- $this->UnitTestCase();
- }
- function testNoPatterns() {
- $handler = new MockTestParser($this);
- $handler->expectNever("accept");
- $handler->setReturnValue("accept", true);
- $lexer = new Doku_Lexer($handler);
- $this->assertFalse($lexer->parse("abcdef"));
- }
- function testEmptyPage() {
- $handler = new MockTestParser($this);
- $handler->expectNever("accept");
- $handler->setReturnValue("accept", true);
- $handler->expectNever("accept");
- $handler->setReturnValue("accept", true);
- $lexer = new Doku_Lexer($handler);
- $lexer->addPattern("a+");
- $this->assertTrue($lexer->parse(""));
- }
- function testSinglePattern() {
- $handler = new MockTestParser($this);
- $handler->expectArgumentsAt(0, "accept", array("aaa", DOKU_LEXER_MATCHED, 0));
- $handler->expectArgumentsAt(1, "accept", array("x", DOKU_LEXER_UNMATCHED, 3));
- $handler->expectArgumentsAt(2, "accept", array("a", DOKU_LEXER_MATCHED, 4));
- $handler->expectArgumentsAt(3, "accept", array("yyy", DOKU_LEXER_UNMATCHED, 5));
- $handler->expectArgumentsAt(4, "accept", array("a", DOKU_LEXER_MATCHED, 8));
- $handler->expectArgumentsAt(5, "accept", array("x", DOKU_LEXER_UNMATCHED, 9));
- $handler->expectArgumentsAt(6, "accept", array("aaa", DOKU_LEXER_MATCHED, 10));
- $handler->expectArgumentsAt(7, "accept", array("z", DOKU_LEXER_UNMATCHED, 13));
- $handler->expectCallCount("accept", 8);
- $handler->setReturnValue("accept", true);
- $lexer = new Doku_Lexer($handler);
- $lexer->addPattern("a+");
- $this->assertTrue($lexer->parse("aaaxayyyaxaaaz"));
- $handler->tally();
- }
- function testMultiplePattern() {
- $handler = new MockTestParser($this);
- $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x");
- $positions = array(0,1,2,3,5,6,7,8,14,15);
- for ($i = 0; $i < count($target); $i++) {
- $handler->expectArgumentsAt($i, "accept", array($target[$i], '*', $positions[$i]));
- }
- $handler->expectCallCount("accept", count($target));
- $handler->setReturnValue("accept", true);
- $lexer = new Doku_Lexer($handler);
- $lexer->addPattern("a+");
- $lexer->addPattern("b+");
- $this->assertTrue($lexer->parse("ababbxbaxxxxxxax"));
- $handler->tally();
- }
-}
-
-class TestOfLexerModes extends UnitTestCase {
- function TestOfLexerModes() {
- $this->UnitTestCase();
- }
- function testIsolatedPattern() {
- $handler = new MockTestParser($this);
- $handler->expectArgumentsAt(0, "a", array("a", DOKU_LEXER_MATCHED,0));
- $handler->expectArgumentsAt(1, "a", array("b", DOKU_LEXER_UNMATCHED,1));
- $handler->expectArgumentsAt(2, "a", array("aa", DOKU_LEXER_MATCHED,2));
- $handler->expectArgumentsAt(3, "a", array("bxb", DOKU_LEXER_UNMATCHED,4));
- $handler->expectArgumentsAt(4, "a", array("aaa", DOKU_LEXER_MATCHED,7));
- $handler->expectArgumentsAt(5, "a", array("x", DOKU_LEXER_UNMATCHED,10));
- $handler->expectArgumentsAt(6, "a", array("aaaa", DOKU_LEXER_MATCHED,11));
- $handler->expectArgumentsAt(7, "a", array("x", DOKU_LEXER_UNMATCHED,15));
- $handler->expectCallCount("a", 8);
- $handler->setReturnValue("a", true);
- $lexer = new Doku_Lexer($handler, "a");
- $lexer->addPattern("a+", "a");
- $lexer->addPattern("b+", "b");
- $this->assertTrue($lexer->parse("abaabxbaaaxaaaax"));
- $handler->tally();
- }
- function testModeChange() {
- $handler = new MockTestParser($this);
- $handler->expectArgumentsAt(0, "a", array("a", DOKU_LEXER_MATCHED,0));
- $handler->expectArgumentsAt(1, "a", array("b", DOKU_LEXER_UNMATCHED,1));
- $handler->expectArgumentsAt(2, "a", array("aa", DOKU_LEXER_MATCHED,2));
- $handler->expectArgumentsAt(3, "a", array("b", DOKU_LEXER_UNMATCHED,4));
- $handler->expectArgumentsAt(4, "a", array("aaa", DOKU_LEXER_MATCHED,5));
- $handler->expectArgumentsAt(0, "b", array(":", DOKU_LEXER_ENTER,8));
- $handler->expectArgumentsAt(1, "b", array("a", DOKU_LEXER_UNMATCHED,9));
- $handler->expectArgumentsAt(2, "b", array("b", DOKU_LEXER_MATCHED, 10));
- $handler->expectArgumentsAt(3, "b", array("a", DOKU_LEXER_UNMATCHED,11));
- $handler->expectArgumentsAt(4, "b", array("bb", DOKU_LEXER_MATCHED,12));
- $handler->expectArgumentsAt(5, "b", array("a", DOKU_LEXER_UNMATCHED,14));
- $handler->expectArgumentsAt(6, "b", array("bbb", DOKU_LEXER_MATCHED,15));
- $handler->expectArgumentsAt(7, "b", array("a", DOKU_LEXER_UNMATCHED,18));
- $handler->expectCallCount("a", 5);
- $handler->expectCallCount("b", 8);
- $handler->setReturnValue("a", true);
- $handler->setReturnValue("b", true);
- $lexer = new Doku_Lexer($handler, "a");
- $lexer->addPattern("a+", "a");
- $lexer->addEntryPattern(":", "a", "b");
- $lexer->addPattern("b+", "b");
- $this->assertTrue($lexer->parse("abaabaaa:ababbabbba"));
- $handler->tally();
- }
- function testNesting() {
- $handler = new MockTestParser($this);
- $handler->setReturnValue("a", true);
- $handler->setReturnValue("b", true);
- $handler->expectArgumentsAt(0, "a", array("aa", DOKU_LEXER_MATCHED,0));
- $handler->expectArgumentsAt(1, "a", array("b", DOKU_LEXER_UNMATCHED,2));
- $handler->expectArgumentsAt(2, "a", array("aa", DOKU_LEXER_MATCHED,3));
- $handler->expectArgumentsAt(3, "a", array("b", DOKU_LEXER_UNMATCHED,5));
- $handler->expectArgumentsAt(0, "b", array("(", DOKU_LEXER_ENTER,6));
- $handler->expectArgumentsAt(1, "b", array("bb", DOKU_LEXER_MATCHED,7));
- $handler->expectArgumentsAt(2, "b", array("a", DOKU_LEXER_UNMATCHED,9));
- $handler->expectArgumentsAt(3, "b", array("bb", DOKU_LEXER_MATCHED,10));
- $handler->expectArgumentsAt(4, "b", array(")", DOKU_LEXER_EXIT,12));
- $handler->expectArgumentsAt(4, "a", array("aa", DOKU_LEXER_MATCHED,13));
- $handler->expectArgumentsAt(5, "a", array("b", DOKU_LEXER_UNMATCHED,15));
- $handler->expectCallCount("a", 6);
- $handler->expectCallCount("b", 5);
- $lexer = new Doku_Lexer($handler, "a");
- $lexer->addPattern("a+", "a");
- $lexer->addEntryPattern("(", "a", "b");
- $lexer->addPattern("b+", "b");
- $lexer->addExitPattern(")", "b");
- $this->assertTrue($lexer->parse("aabaab(bbabb)aab"));
- $handler->tally();
- }
- function testSingular() {
- $handler = new MockTestParser($this);
- $handler->setReturnValue("a", true);
- $handler->setReturnValue("b", true);
- $handler->expectArgumentsAt(0, "a", array("aa", DOKU_LEXER_MATCHED,0));
- $handler->expectArgumentsAt(1, "a", array("aa", DOKU_LEXER_MATCHED,3));
- $handler->expectArgumentsAt(2, "a", array("xx", DOKU_LEXER_UNMATCHED,5));
- $handler->expectArgumentsAt(3, "a", array("xx", DOKU_LEXER_UNMATCHED,10));
- $handler->expectArgumentsAt(0, "b", array("b", DOKU_LEXER_SPECIAL,2));
- $handler->expectArgumentsAt(1, "b", array("bbb", DOKU_LEXER_SPECIAL,7));
- $handler->expectCallCount("a", 4);
- $handler->expectCallCount("b", 2);
- $lexer = new Doku_Lexer($handler, "a");
- $lexer->addPattern("a+", "a");
- $lexer->addSpecialPattern("b+", "a", "b");
- $this->assertTrue($lexer->parse("aabaaxxbbbxx"));
- $handler->tally();
- }
- function testUnwindTooFar() {
- $handler = new MockTestParser($this);
- $handler->setReturnValue("a", true);
- $handler->expectArgumentsAt(0, "a", array("aa", DOKU_LEXER_MATCHED,0));
- $handler->expectArgumentsAt(1, "a", array(")", DOKU_LEXER_EXIT,2));
- $handler->expectCallCount("a", 2);
- $lexer = new Doku_Lexer($handler, "a");
- $lexer->addPattern("a+", "a");
- $lexer->addExitPattern(")", "a");
- $this->assertFalse($lexer->parse("aa)aa"));
- $handler->tally();
- }
-}
-
-class TestOfLexerHandlers extends UnitTestCase {
- function TestOfLexerHandlers() {
- $this->UnitTestCase();
- }
- function testModeMapping() {
- $handler = new MockTestParser($this);
- $handler->setReturnValue("a", true);
- $handler->expectArgumentsAt(0, "a", array("aa", DOKU_LEXER_MATCHED,0));
- $handler->expectArgumentsAt(1, "a", array("(", DOKU_LEXER_ENTER,2));
- $handler->expectArgumentsAt(2, "a", array("bb", DOKU_LEXER_MATCHED,3));
- $handler->expectArgumentsAt(3, "a", array("a", DOKU_LEXER_UNMATCHED,5));
- $handler->expectArgumentsAt(4, "a", array("bb", DOKU_LEXER_MATCHED,6));
- $handler->expectArgumentsAt(5, "a", array(")", DOKU_LEXER_EXIT,8));
- $handler->expectArgumentsAt(6, "a", array("b", DOKU_LEXER_UNMATCHED,9));
- $handler->expectCallCount("a", 7);
- $lexer = new Doku_Lexer($handler, "mode_a");
- $lexer->addPattern("a+", "mode_a");
- $lexer->addEntryPattern("(", "mode_a", "mode_b");
- $lexer->addPattern("b+", "mode_b");
- $lexer->addExitPattern(")", "mode_b");
- $lexer->mapHandler("mode_a", "a");
- $lexer->mapHandler("mode_b", "a");
- $this->assertTrue($lexer->parse("aa(bbabb)b"));
- $handler->tally();
- }
-}
-
-class TestParserByteIndex {
-
- function TestParserByteIndex() {}
-
- function ignore() {}
-
- function caught() {}
-}
-
-Mock::generate('TestParserByteIndex');
-
-class TestOfLexerByteIndices extends UnitTestCase {
-
- function TestOfLexerByteIndices() {
- $this->UnitTestCase();
- }
-
- function testIndex() {
- $doc = "aaa<file>bcd</file>eee";
-
- $handler = new MockTestParserByteIndex($this);
- $handler->setReturnValue("ignore", true);
- $handler->setReturnValue("caught", true);
-
- $handler->expectArgumentsAt(
- 0,
- "caught",
- array("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))
- );
- $handler->expectArgumentsAt(
- 1,
- "caught",
- array("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))
- );
- $handler->expectArgumentsAt(
- 2,
- "caught",
- array("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))
- );
- $handler->expectArgumentsAt(
- 3,
- "caught",
- array("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))
- );
- $handler->expectArgumentsAt(
- 4,
- "caught",
- array("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))
- );
- $handler->expectCallCount("caught", 5);
-
- $lexer = new Doku_Lexer($handler, "ignore");
- $lexer->addEntryPattern("<file>", "ignore", "caught");
- $lexer->addExitPattern("</file>", "caught");
- $lexer->addSpecialPattern('b','caught','special');
- $lexer->mapHandler('special','caught');
- $lexer->addPattern('c','caught');
-
- $this->assertTrue($lexer->parse($doc));
- $handler->tally();
- }
-
- function testIndexLookaheadEqual() {
- $doc = "aaa<file>bcd</file>eee";
-
- $handler = new MockTestParserByteIndex($this);
- $handler->setReturnValue("ignore", true);
- $handler->setReturnValue("caught", true);
-
- $handler->expectArgumentsAt(
- 0,
- "caught",
- array("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))
- );
- $handler->expectArgumentsAt(
- 1,
- "caught",
- array("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))
- );
- $handler->expectArgumentsAt(
- 2,
- "caught",
- array("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))
- );
- $handler->expectArgumentsAt(
- 3,
- "caught",
- array("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))
- );
- $handler->expectArgumentsAt(
- 4,
- "caught",
- array("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))
- );
- $handler->expectCallCount("caught", 5);
-
- $lexer = new Doku_Lexer($handler, "ignore");
- $lexer->addEntryPattern('<file>(?=.*</file>)', "ignore", "caught");
- $lexer->addExitPattern("</file>", "caught");
- $lexer->addSpecialPattern('b','caught','special');
- $lexer->mapHandler('special','caught');
- $lexer->addPattern('c','caught');
-
- $this->assertTrue($lexer->parse($doc));
- $handler->tally();
- }
-
- function testIndexLookaheadNotEqual() {
- $doc = "aaa<file>bcd</file>eee";
-
- $handler = new MockTestParserByteIndex($this);
- $handler->setReturnValue("ignore", true);
- $handler->setReturnValue("caught", true);
-
- $handler->expectArgumentsAt(
- 0,
- "caught",
- array("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))
- );
- $handler->expectArgumentsAt(
- 1,
- "caught",
- array("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))
- );
- $handler->expectArgumentsAt(
- 2,
- "caught",
- array("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))
- );
- $handler->expectArgumentsAt(
- 3,
- "caught",
- array("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))
- );
- $handler->expectArgumentsAt(
- 4,
- "caught",
- array("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))
- );
- $handler->expectCallCount("caught", 5);
-
- $lexer = new Doku_Lexer($handler, "ignore");
- $lexer->addEntryPattern('<file>(?!foo)', "ignore", "caught");
- $lexer->addExitPattern("</file>", "caught");
- $lexer->addSpecialPattern('b','caught','special');
- $lexer->mapHandler('special','caught');
- $lexer->addPattern('c','caught');
-
- $this->assertTrue($lexer->parse($doc));
- $handler->tally();
- }
-
- function testIndexLookbehindEqual() {
- $doc = "aaa<file>bcd</file>eee";
-
- $handler = new MockTestParserByteIndex($this);
- $handler->setReturnValue("ignore", true);
- $handler->setReturnValue("caught", true);
-
- $handler->expectArgumentsAt(
- 0,
- "caught",
- array("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))
- );
- $handler->expectArgumentsAt(
- 1,
- "caught",
- array("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))
- );
- $handler->expectArgumentsAt(
- 2,
- "caught",
- array("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))
- );
- $handler->expectArgumentsAt(
- 3,
- "caught",
- array("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))
- );
- $handler->expectArgumentsAt(
- 4,
- "caught",
- array("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))
- );
- $handler->expectCallCount("caught", 5);
-
- $lexer = new Doku_Lexer($handler, "ignore");
- $lexer->addEntryPattern('<file>', "ignore", "caught");
- $lexer->addExitPattern("(?<=d)</file>", "caught");
- $lexer->addSpecialPattern('b','caught','special');
- $lexer->mapHandler('special','caught');
- $lexer->addPattern('c','caught');
-
- $this->assertTrue($lexer->parse($doc));
- $handler->tally();
- }
-
- function testIndexLookbehindNotEqual() {
- $doc = "aaa<file>bcd</file>eee";
-
- $handler = new MockTestParserByteIndex($this);
- $handler->setReturnValue("ignore", true);
- $handler->setReturnValue("caught", true);
-
- $handler->expectArgumentsAt(
- 0,
- "caught",
- array("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))
- );
- $handler->expectArgumentsAt(
- 1,
- "caught",
- array("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))
- );
- $handler->expectArgumentsAt(
- 2,
- "caught",
- array("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))
- );
- $handler->expectArgumentsAt(
- 3,
- "caught",
- array("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))
- );
- $handler->expectArgumentsAt(
- 4,
- "caught",
- array("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))
- );
- $handler->expectCallCount("caught", 5);
-
- $lexer = new Doku_Lexer($handler, "ignore");
- $lexer->addEntryPattern('<file>', "ignore", "caught");
- $lexer->addExitPattern("(?<!c)</file>", "caught");
- $lexer->addSpecialPattern('b','caught','special');
- $lexer->mapHandler('special','caught');
- $lexer->addPattern('c','caught');
-
- $this->assertTrue($lexer->parse($doc));
- $handler->tally();
- }
-
- /**
- * This test is primarily to ensure the correct match is chosen
- * when there are non-captured elements in the pattern.
- */
- function testIndexSelectCorrectMatch() {
- $doc = "ALL FOOLS ARE FOO";
- $pattern = '\bFOO\b';
-
- $handler = new MockTestParserByteIndex($this);
- $handler->setReturnValue("ignore", true);
- $handler->setReturnValue("caught", true);
-
- $matches = array();
- preg_match('/'.$pattern.'/',$doc,$matches,PREG_OFFSET_CAPTURE);
-
- $handler->expectArgumentsAt(
- 0,
- "caught",
- array("FOO", DOKU_LEXER_SPECIAL, $matches[0][1])
- );
- $handler->expectCallCount("caught", 1);
-
- $lexer = new Doku_Lexer($handler, "ignore");
- $lexer->addSpecialPattern($pattern,'ignore','caught');
-
- $this->assertTrue($lexer->parse($doc));
- $handler->tally();
- }
-
-}
-
-?>
diff --git a/_test/cases/inc/parser/parser.group.php b/_test/cases/inc/parser/parser.group.php
deleted file mode 100644
index ed7fce76e..000000000
--- a/_test/cases/inc/parser/parser.group.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
-* @version $Id: parser.group.php,v 1.3 2005/03/30 13:42:10 harryf Exp $
-* @package Dokuwiki
-* @subpackage Tests
-*/
-
-/**
-* @package Dokuwiki
-* @subpackage Tests
-*/
-class ParserGroupTest extends GroupTest {
-
- function ParserGroupTest() {
- $dir = dirname(__FILE__).'/';
- $this->GroupTest('ParserGroupTest');
- $this->addTestFile($dir . 'parser_eol.test.php');
- $this->addTestFile($dir . 'parser_footnote.test.php');
- $this->addTestFile($dir .'parser_formatting.test.php');
- $this->addTestFile($dir .'parser_headers.test.php');
- $this->addTestFile($dir .'parser_i18n.test.php');
- $this->addTestFile($dir .'parser_links.test.php');
- $this->addTestFile($dir .'parser_lists.test.php');
- $this->addTestFile($dir .'parser_preformatted.test.php');
- $this->addTestFile($dir .'parser_quote.test.php');
- $this->addTestFile($dir .'parser_replacements.test.php');
- $this->addTestFile($dir .'parser_table.test.php');
-# $this->addTestFile($dir .'parser_tocsections.test.php');
- $this->addTestFile($dir .'parser_unformatted.test.php');
- }
-
-}
-
-?>
diff --git a/_test/cases/inc/parser/parser.inc.php b/_test/cases/inc/parser/parser.inc.php
deleted file mode 100644
index 74d956f43..000000000
--- a/_test/cases/inc/parser/parser.inc.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
-* @version $Id: parser.inc.php,v 1.2 2005/03/25 21:00:22 harryf Exp $
-* @package Doku
-* @subpackage Tests
-*/
-
-/**
-* Includes
-*/
-require_once DOKU_INC . 'inc/init.php';
-require_once DOKU_INC . 'inc/confutils.php';
-require_once DOKU_INC . 'inc/parser/parser.php';
-require_once DOKU_INC . 'inc/parser/handler.php';
-require_once DOKU_INC . 'inc/events.php';
-require_once DOKU_INC . 'inc/mail.php';
-
-//require_once DOKU . 'parser/renderer.php';
-
-//Mock::generate('Doku_Renderer');
-
-/**
-* @package Doku
-* @subpackage Tests
-*/
-class TestOfDoku_Parser extends UnitTestCase {
-
- var $P;
- var $H;
-
- function TestOfDoku_Parser() {
- $this->UnitTestCase('TestOfDoku_Parser');
- }
-
- function setup() {
- $this->P = new Doku_Parser();
- $this->H = new Doku_Handler();
- $this->P->Handler = & $this->H;
- }
-
- function tearDown() {
- unset($this->P);
- unset($this->H);
- }
-}
-
-function stripByteIndex($call) {
- unset($call[2]);
- if ($call[0] == "nest") {
- $call[1][0] = array_map('stripByteIndex',$call[1][0]);
- }
- return $call;
-}
diff --git a/_test/cases/inc/parser/parser_formatting.test.php b/_test/cases/inc/parser/parser_formatting.test.php
deleted file mode 100644
index 69c57dfb5..000000000
--- a/_test/cases/inc/parser/parser_formatting.test.php
+++ /dev/null
@@ -1,434 +0,0 @@
-<?php
-require_once 'parser.inc.php';
-
-class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
-
- function TestOfDoku_Parser_Formatting() {
- $this->UnitTestCase('TestOfDoku_Parser_Formatting');
- }
-
- function testStrong() {
- $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
- $this->P->parse('abc **bar** def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('strong_open',array()),
- array('cdata',array('bar')),
- array('strong_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNotStrong() {
- $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
- $this->P->parse('abc **bar def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\nabc **bar def")),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testEm() {
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('abc //bar// def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('emphasis_open',array()),
- array('cdata',array('bar')),
- array('emphasis_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testEmColon() {
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('abc //Тест: // def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('emphasis_open',array()),
- array('cdata',array('Тест: ')),
- array('emphasis_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testEmSingleChar() {
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('abc //b// def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('emphasis_open',array()),
- array('cdata',array('b')),
- array('emphasis_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testEmWithUnknownSchema() {
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('abc //foo:// bar// def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('emphasis_open',array()),
- array('cdata',array('foo:')),
- array('emphasis_close',array()),
- array('cdata',array(' bar// def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testEmWithKnownSchema() {
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
- $this->P->parse('abc //foo http://www.google.com bar// def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('emphasis_open',array()),
- array('cdata',array('foo ')),
- array('externallink',array('http://www.google.com', NULL)),
- array('cdata',array(' bar')),
- array('emphasis_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNotEm() {
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('abc //bar def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\nabc //bar def")),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNotEmSchemaAtOpen() {
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('abc foo://bar// def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc foo:')),
- array('emphasis_open',array()),
- array('cdata',array('bar')),
- array('emphasis_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNotEmSchemaAtClose() {
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('abc //http:// def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\nabc //http:// def")),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testEmWithMultiOccurence() {
- // Case from #763
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('//text:// Blablabla Blablabla
-
-//text:// another Blablabla Blablabla');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n")),
- array('emphasis_open',array()),
- array('cdata',array('text:')),
- array('emphasis_close',array()),
- array('cdata',array(" Blablabla Blablabla\n\n")),
- array('emphasis_open',array()),
- array('cdata',array('text:')),
- array('emphasis_close',array()),
- array('cdata',array(" another Blablabla Blablabla")),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testEmWithUnicode() {
- // Case from #1468
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('//Тест://');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n")),
- array('emphasis_open',array()),
- array('cdata',array('Тест:')),
- array('emphasis_close',array()),
- array('cdata', array('')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNoEmWithInvalidURL() {
- // Case from #1629
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('http://<CertificateServerName>/certsrv/certcarc.asp');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array('http://<CertificateServerName>/certsrv/certcarc.asp')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNoEmWithUnknownURL() {
- // Case from #1640
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('svn://example.com/foo/bar');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array('svn://example.com/foo/bar')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testUnderline() {
- $this->P->addMode('underline',new Doku_Parser_Mode_Formatting('underline'));
- $this->P->parse('abc __bar__ def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('underline_open',array()),
- array('cdata',array('bar')),
- array('underline_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNotUnderline() {
- $this->P->addMode('underline',new Doku_Parser_Mode_Formatting('underline'));
- $this->P->parse('abc __bar def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\nabc __bar def")),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testMonospace() {
- $this->P->addMode('monospace',new Doku_Parser_Mode_Formatting('monospace'));
- $this->P->parse("abc ''bar'' def");
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('monospace_open',array()),
- array('cdata',array('bar')),
- array('monospace_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNotMonospace() {
- $this->P->addMode('monospace',new Doku_Parser_Mode_Formatting('monospace'));
- $this->P->parse("abc ''bar def");
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\nabc ''bar def")),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testSubscript() {
- $this->P->addMode('subscript',new Doku_Parser_Mode_Formatting('subscript'));
- $this->P->parse('abc <sub>bar</sub> def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('subscript_open',array()),
- array('cdata',array('bar')),
- array('subscript_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNotSubscript() {
- $this->P->addMode('subscript',new Doku_Parser_Mode_Formatting('subscript'));
- $this->P->parse('abc <sub>bar def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\nabc <sub>bar def")),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testSuperscript() {
- $this->P->addMode('superscript',new Doku_Parser_Mode_Formatting('superscript'));
- $this->P->parse("abc <sup>bar</sup> def");
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('superscript_open',array()),
- array('cdata',array('bar')),
- array('superscript_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNotSuperscript() {
- $this->P->addMode('superscript',new Doku_Parser_Mode_Formatting('superscript'));
- $this->P->parse("abc <sup>bar def");
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\nabc <sup>bar def")),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testDeleted() {
- $this->P->addMode('deleted',new Doku_Parser_Mode_Formatting('deleted'));
- $this->P->parse('abc <del>bar</del> def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('deleted_open',array()),
- array('cdata',array('bar')),
- array('deleted_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNotDeleted() {
- $this->P->addMode('deleted',new Doku_Parser_Mode_Formatting('deleted'));
- $this->P->parse('abc <del>bar def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\nabc <del>bar def")),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testNestedFormatting() {
- $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
- $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis'));
- $this->P->parse('abc **a//b//c** def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('strong_open',array()),
- array('cdata',array('a')),
- array('emphasis_open',array()),
- array('cdata',array('b')),
- array('emphasis_close',array()),
- array('cdata',array('c')),
- array('strong_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-
- function testIllegalNestedFormatting() {
- $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
- $this->P->parse('abc **a**b**c** def');
- $calls = array (
- array('document_start',array()),
- array('p_open',array()),
- array('cdata',array("\n".'abc ')),
- array('strong_open',array()),
- array('cdata',array('a')),
- array('strong_close',array()),
- array('cdata',array('b')),
- array('strong_open',array()),
- array('cdata',array('c')),
- array('strong_close',array()),
- array('cdata',array(' def')),
- array('p_close',array()),
- array('document_end',array()),
- );
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
- }
-}
-
diff --git a/_test/cases/inc/parser/xhtml_htmlphp.test.php b/_test/cases/inc/parser/xhtml_htmlphp.test.php
deleted file mode 100644
index 65d64e579..000000000
--- a/_test/cases/inc/parser/xhtml_htmlphp.test.php
+++ /dev/null
@@ -1,203 +0,0 @@
-<?php
-if (!defined('DOKU_BASE')) define('DOKU_BASE','./');
-
-require_once 'parser.inc.php';
-require_once DOKU_INC.'inc/parser/xhtml.php';
-require_once DOKU_INC.'inc/geshi.php';
-
-if (!extension_loaded('runkit')) {
- SimpleTestOptions::ignore('xhtml_htmlphp_test');
- trigger_error('Skipping xhtml_htmlphp_test - http://www.php.net/runkit required');
-}
-
-function xhtml_htmlphp_test_io_makefiledir() {
- return;
-}
-function xhtml_htmlphp_test_io_savefile() {
- return true;
-}
-
-
-class Doku_Renderer_tester extends Doku_Renderer_xhtml {
-
-/*
- changes to these tests remove the need to redefine any xhtml methods
- class left for future use
- */
-
-}
-
-/*
- * test case for parser/xhtml.php _headertolink method
- * definition: function _headertolink($title,$create)
- */
-
-class xhtml_htmlphp_test extends TestOfDoku_Parser {
-
- var $purge;
- var $cachedir;
-
- function setup() {
- global $conf;
-
- // set purge to avoid trying to retrieve from cache
- $this->purge = isset($_REQUEST['purge']) ? $_REQUEST['purge'] : null;
- $_REQUEST['purge'] = 1;
-
- if (!isset($conf['cachedir'])) {
- $conf['cachedir'] = '';
- $this->cachedir = false;
- } else {
- $this->cachedir = true;
- }
-
- if (function_exists('io_makefiledir')) {
- runkit_function_rename('io_makefiledir', 'io_makefiledir_real');
- }
- runkit_function_rename('xhtml_htmlphp_test_io_makefiledir','io_makefiledir');
-
- if (function_exists('io_savefile')) {
- runkit_function_rename('io_savefile', 'io_savefile_real');
- }
- runkit_function_rename('xhtml_htmlphp_test_io_savefile','io_savefile');
-
- runkit_method_rename('GeSHi','parse_code','parse_code_real');
- runkit_method_add('GeSHi','parse_code','', '{ return hsc($this->source); }');
-
- parent::setup();
- }
-
- function teardown() {
- global $conf;
-
- // restore purge
- if (is_null($this->purge)) unset($_REQUEST['purge']);
- else $_REQUEST['purge'] = $this->purge;
-
- // restore $conf['cachedir'] if necessary
- if (!$this->cachedir) unset($conf['cachedir']);
-
- // restore io_functions
- runkit_function_rename('io_makefiledir','xhtml_htmlphp_test_io_makefiledir');
- if (function_exists('io_makefiledir_real')) {
- runkit_function_rename('io_makefiledir_real', 'io_makefiledir');
- }
-
- runkit_function_rename('io_savefile','xhtml_htmlphp_test_io_savefile');
- if (function_exists('io_savefile_real')) {
- runkit_function_rename('io_savefile_real', 'io_savefile');
- }
-
- // restore GeSHi::parse_code
- runkit_method_remove('GeSHi','parse_code');
- runkit_method_rename('GeSHi','parse_code_real','parse_code');
-
- parent::setup();
- }
-
- function _run_parser($modes,$data) {
-
- foreach ($modes as $mode => $name) {
- $class = 'Doku_Parser_Mode_'.$name;
- $this->P->addMode($mode,new $class());
- }
-
- $R = new Doku_Renderer_tester();
- $this->P->parse($data);
- foreach ( $this->H->calls as $instruction ) {
- // Execute the callback against the Renderer
- call_user_func_array(array(&$R, $instruction[0]),$instruction[1]);
- }
-
- return str_replace("\n",'',$R->doc);
- }
-
- function test_html_off(){
- $test = array('<html><b>bold</b></html>','<p><code class="code html4strict">&lt;b&gt;bold&lt;/b&gt;</code></p>');
-
- global $conf;
- $conf['htmlok'] = 0;
-
- $result = $this->_run_parser(array('html'=>'html'),$test[0]);
-
- $this->assertEqual($result,$test[1]);
- }
-
- function test_html_on(){
- $test = array('<html><b>bold</b></html>','<p><b>bold</b></p>');
-
- global $conf;
- $conf['htmlok'] = 1;
-
- $result = $this->_run_parser(array('html'=>'html'),$test[0]);
-
- $this->assertEqual($result,$test[1]);
- }
-
- function test_htmlblock_off(){
- $test = array('<HTML><b>bold</b></HTML>','<pre class="code html4strict">&lt;b&gt;bold&lt;/b&gt;</pre>');
-
- global $conf;
- $conf['htmlok'] = 0;
-
- $result = $this->_run_parser(array('html'=>'html'),$test[0]);
-
- $this->assertEqual($result,$test[1]);
- }
-
- function test_htmlblock_on(){
- $test = array('<HTML><b>bold</b></HTML>','<b>bold</b>');
-
- global $conf;
- $conf['htmlok'] = 1;
-
- $result = $this->_run_parser(array('html'=>'html'),$test[0]);
-
- $this->assertEqual($result,$test[1]);
- }
-
- function test_php_off(){
- $test = array('<php>echo(1+1);</php>','<p><code class="code php">echo(1+1);</code></p>');
-
- global $conf;
- $conf['phpok'] = 0;
-
- $result = $this->_run_parser(array('php'=>'php'),$test[0]);
-
- $this->assertEqual($result,$test[1]);
- }
-
- function test_php_on(){
- $test = array('<php>echo(1+1);</php>','<p>2</p>');
-
- global $conf;
- $conf['phpok'] = 1;
-
- $result = $this->_run_parser(array('php'=>'php'),$test[0]);
-
- $this->assertEqual($result,$test[1]);
- }
-
- function test_phpblock_off(){
- $test = array('<PHP>echo(1+1);</PHP>','<pre class="code php">echo(1+1);</pre>');
-
- global $conf;
- $conf['phpok'] = 0;
-
- $result = $this->_run_parser(array('php'=>'php'),$test[0]);
-
- $this->assertEqual($result,$test[1]);
- }
-
- function test_phpblock_on(){
- $test = array('<PHP>echo(1+1);</PHP>',"2");
-
- global $conf;
- $conf['phpok'] = 1;
-
- $result = $this->_run_parser(array('php'=>'php'),$test[0]);
-
- $this->assertEqual($result,$test[1]);
- }
-
-}
diff --git a/_test/cases/inc/parser/xhtml_links.test.php b/_test/cases/inc/parser/xhtml_links.test.php
deleted file mode 100644
index a9a6dfdbc..000000000
--- a/_test/cases/inc/parser/xhtml_links.test.php
+++ /dev/null
@@ -1,239 +0,0 @@
-<?php
-if (!defined('DOKU_BASE')) define('DOKU_BASE','./');
-require_once DOKU_INC.'inc/parser/xhtml.php';
-require_once DOKU_INC.'inc/pageutils.php';
-
-class xhtml_links_test extends UnitTestCase {
-
- function test_emaillink(){
- global $conf;
- $conf['mailguard'] = 'visible';
- $conf['userewrite'] = 0;
-
- $p = new Doku_Renderer_xhtml();
- $p->emaillink('foo@example.com','<script>alert(\'"alert"\');</script>');
-
- $expect = '<a href="mailto:foo%20%5Bat%5D%20example%20%5Bdot%5D%20com" class="mail" title="foo [at] example [dot] com">&lt;script&gt;alert(&#039;&quot;alert&quot;&#039;);&lt;/script&gt;</a>';
-
- $this->assertEqual($p->doc,$expect);
- }
-
- function test_emaillink_with_media(){
- global $conf;
- $conf['mailguard'] = 'visible';
- $conf['userewrite'] = 2;
-
- $image = array(
- 'type'=>'internalmedia',
- 'src'=>'img.gif',
- 'title'=>'Some Image',
- 'align'=>NULL,
- 'width'=>10,
- 'height'=>20,
- 'cache'=>'nocache',
- 'linking'=>'details',
- );
-
- $p = new Doku_Renderer_xhtml();
- $p->emaillink('foo@example.com',$image);
-
- $expect = '<a href="mailto:foo%20%5Bat%5D%20example%20%5Bdot%5D%20com" class="media" title="foo [at] example [dot] com"><img src="'.DOKU_BASE.'lib/exe/fetch.php/img.gif?w=10&amp;h=20&amp;cache=nocache" class="media" title="Some Image" alt="Some Image" width="10" height="20" /></a>';
-
- $this->assertEqual($p->doc,$expect);
- }
-
- /**
- * Produced by syntax like [[ ]]
- */
- function test_empty_internallink(){
- $page = 'my:space';
-
- global $ID;
- $ID = $page;
-
- global $conf;
- $conf['start'] = 'start';
-
- global $conf;
- $conf['basedir'] = '/';
- $conf['useheading'] = 0;
- $conf['userewrite'] = 0;
- $conf['useslash'] = 0;
- $conf['canonical'] = 0;
-
- $p = new Doku_Renderer_xhtml();
- $p->internallink('');
-
-
- if (page_exists($page)) {
- $class = 'wikilink1';
- $rel = '';
- }
- else {
- $class = 'wikilink2';
- $rel = ' rel="nofollow"';
- }
-
- $parts = split(':', $page);
- $caption = $parts[count($parts)-1];
-
- $expect = '<span class="curid"><a href="/./doku.php?id='.$page.'" class="'.$class.'" title="'.$page.'"'.$rel.'>'.$caption.'</a></span>';
-
- $this->assertEqual($p->doc, $expect);
- }
-
- /**
- * Produced by syntax like [[ |my caption]]
- */
- function test_empty_internallink_with_caption(){
- $page = 'my:space';
- $caption = 'my caption';
-
- global $ID;
- $ID = $page;
-
- global $conf;
- $conf['basedir'] = '/';
- $conf['useheading'] = 0;
- $conf['userewrite'] = 0;
- $conf['useslash'] = 0;
- $conf['canonical'] = 0;
-
- $p = new Doku_Renderer_xhtml();
- $p->internallink('', $caption);
-
- if (page_exists($page)) {
- $class = 'wikilink1';
- $rel = '';
- }
- else {
- $class = 'wikilink2';
- $rel = ' rel="nofollow"';
- }
-
- $expect = '<span class="curid"><a href="/./doku.php?id='.$page.'" class="'.$class.'" title="'.$page.'"'.$rel.'>'.$caption.'</a></span>';
-
- $this->assertEqual($p->doc, $expect);
- }
-
- /**
- * Produced by syntax like [[?do=index]]
- */
- function test_empty_internallink_index(){
- $page = 'my:space';
-
- global $ID;
- $ID = $page;
-
- global $conf;
- $conf['start'] = 'start';
-
- global $conf;
- $conf['basedir'] = '/';
- $conf['useheading'] = 0;
- $conf['userewrite'] = 0;
- $conf['useslash'] = 0;
- $conf['canonical'] = 0;
-
- $p = new Doku_Renderer_xhtml();
- $p->internallink('?do=index');
-
- if (page_exists($page)) {
- $class = 'wikilink1';
- $rel = '';
- }
- else {
- $class = 'wikilink2';
- $rel = ' rel="nofollow"';
- }
-
- $parts = split(':', $page);
- $caption = $parts[count($parts)-1];
-
- $expect = '<span class="curid"><a href="/./doku.php?id='.$page.'&amp;do=index" class="'.$class.'" title="'.$page.'"'.$rel.'>'.$caption.'</a></span>';
-
- $this->assertEqual($p->doc, $expect);
- }
-
- /**
- * Produced by syntax like [[?do=index|my caption]]
- */
- function test_empty_internallink_index_with_caption(){
- $page = 'my:space';
- $caption = 'my caption';
-
- global $ID;
- $ID = $page;
-
- global $conf;
- $conf['basedir'] = '/';
- $conf['useheading'] = 0;
- $conf['userewrite'] = 0;
- $conf['useslash'] = 0;
- $conf['canonical'] = 0;
-
- $p = new Doku_Renderer_xhtml();
- $p->internallink('?do=index', $caption);
-
- if (page_exists($page)) {
- $class = 'wikilink1';
- $rel = '';
- }
- else {
- $class = 'wikilink2';
- $rel = ' rel="nofollow"';
- }
-
- $expect = '<span class="curid"><a href="/./doku.php?id='.$page.'&amp;do=index" class="'.$class.'" title="'.$page.'"'.$rel.'>'.$caption.'</a></span>';
-
- $this->assertEqual($p->doc, $expect);
- }
-
- /**
- * Produced by syntax like [[#test]]
- */
- function test_empty_locallink(){
- $page = 'my:spacex';
- global $ID;
- $ID = $page;
-
- global $conf;
- $conf['basedir'] = '/';
- $conf['useheading'] = 0;
- $conf['userewrite'] = 0;
- $conf['useslash'] = 0;
- $conf['canonical'] = 0;
-
- $p = new Doku_Renderer_xhtml();
- $p->locallink('test');
-
- $expect = '<a href="#test" title="'.$page.' &crarr;" class="wikilink1">test</a>';
-
- $this->assertEqual($p->doc, $expect);
- }
-
- /**
- * Produced by syntax like [[#test|my caption]]
- */
- function test_empty_locallink_with_caption(){
- $page = 'my:spacex';
- $caption = 'my caption';
-
- global $ID;
- $ID = $page;
-
- global $conf;
- $conf['basedir'] = '/';
- $conf['useheading'] = 0;
- $conf['userewrite'] = 0;
- $conf['useslash'] = 0;
- $conf['canonical'] = 0;
-
- $p = new Doku_Renderer_xhtml();
- $p->locallink('test', $caption);
-
- $expect = '<a href="#test" title="'.$page.' &crarr;" class="wikilink1">'.$caption.'</a>';
-
- $this->assertEqual($p->doc, $expect);
- }
-}
diff --git a/_test/conf/acl.auth.php b/_test/conf/acl.auth.php
new file mode 100644
index 000000000..8a1b01f23
--- /dev/null
+++ b/_test/conf/acl.auth.php
@@ -0,0 +1,27 @@
+# acl.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Access Control Lists
+#
+# Editing this file by hand shouldn't be necessary. Use the ACL
+# Manager interface instead.
+#
+# If your auth backend allows special char like spaces in groups
+# or user names you need to urlencode them (only chars <128, leave
+# UTF-8 multibyte chars as is)
+#
+# none 0
+# read 1
+# edit 2
+# create 4
+# upload 8
+# delete 16
+
+* @ALL 8
+
+# for testing wildcards:
+users:* @ALL 1
+users:%USER%:* %USER% 16
+groups:* @ALL 1
+groups:%GROUP%:* %GROUP% 16
diff --git a/_test/conf/local.php b/_test/conf/local.php
new file mode 100644
index 000000000..ff1299393
--- /dev/null
+++ b/_test/conf/local.php
@@ -0,0 +1,10 @@
+<?php
+
+$conf['savedir'] = DOKU_TMP_DATA; //where to store all the files
+
+$conf['title'] = 'My Test Wiki'; //what to show in the title
+
+$conf['useacl'] = 1; //Use Access Control Lists to restrict access?
+$conf['superuser'] = 'testuser'; //password: testpass
+
+$conf['dnslookups'] = 0; //speedup tests
diff --git a/_test/conf/plugins.local.php b/_test/conf/plugins.local.php
new file mode 100644
index 000000000..00e8c10be
--- /dev/null
+++ b/_test/conf/plugins.local.php
@@ -0,0 +1,8 @@
+<?php
+/*
+ * Local plugin enable/disable settings
+ * Auto-generated through plugin/extension manager
+ *
+ * NOTE: Plugins will not be added to this file unless there is a need to override a default setting. Plugins are
+ * enabled by default, unless having a 'disabled' file in their plugin folder.
+ */
diff --git a/_test/conf/users.auth.php b/_test/conf/users.auth.php
new file mode 100644
index 000000000..4adee0d4b
--- /dev/null
+++ b/_test/conf/users.auth.php
@@ -0,0 +1,12 @@
+# users.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Userfile
+#
+# Format:
+#
+# user:MD5password:Real Name:email:groups,comma,seperated
+#
+# testuser : testpass
+testuser:179ad45c6ce2cb97cf1029e212046e81:Arthur Dent:arthur@example.com:
diff --git a/_test/core/DokuWikiTest.php b/_test/core/DokuWikiTest.php
new file mode 100644
index 000000000..b9e151456
--- /dev/null
+++ b/_test/core/DokuWikiTest.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Helper class to provide basic functionality for tests
+ */
+abstract class DokuWikiTest extends PHPUnit_Framework_TestCase {
+
+ /**
+ * tests can override this
+ *
+ * @var array plugins to enable for test class
+ */
+ protected $pluginsEnabled = array();
+
+ /**
+ * tests can override this
+ *
+ * @var array plugins to disable for test class
+ */
+ protected $pluginsDisabled = array();
+
+ /**
+ * Setup the data directory
+ *
+ * This is ran before each test class
+ */
+ public static function setUpBeforeClass() {
+ // just to be safe not to delete something undefined later
+ if(!defined('TMP_DIR')) die('no temporary directory');
+ if(!defined('DOKU_TMP_DATA')) die('no temporary data directory');
+
+ // remove any leftovers from the last run
+ if(is_dir(DOKU_TMP_DATA)){
+ TestUtils::rdelete(DOKU_TMP_DATA);
+ }
+
+ // populate default dirs
+ TestUtils::rcopy(TMP_DIR, dirname(__FILE__).'/../data/');
+ }
+
+ /**
+ * Reset the DokuWiki environment before each test run. Makes sure loaded config,
+ * language and plugins are correct.
+ *
+ * @throws Exception if plugin actions fail
+ * @return void
+ */
+ public function setUp() {
+
+ // reload config
+ global $conf, $config_cascade;
+ $conf = array();
+ foreach (array('default','local','protected') as $config_group) {
+ if (empty($config_cascade['main'][$config_group])) continue;
+ foreach ($config_cascade['main'][$config_group] as $config_file) {
+ if (@file_exists($config_file)) {
+ include($config_file);
+ }
+ }
+ }
+
+ // reload license config
+ global $license;
+ $license = array();
+
+ // load the license file(s)
+ foreach (array('default','local') as $config_group) {
+ if (empty($config_cascade['license'][$config_group])) continue;
+ foreach ($config_cascade['license'][$config_group] as $config_file) {
+ if(@file_exists($config_file)){
+ include($config_file);
+ }
+ }
+ }
+
+ // make real paths and check them
+ init_paths();
+ init_files();
+
+ // reset loaded plugins
+ global $plugin_controller_class, $plugin_controller;
+ /** @var Doku_Plugin_Controller $plugin_controller */
+ $plugin_controller = new $plugin_controller_class();
+
+ // disable all non-default plugins
+ global $default_plugins;
+ foreach ($plugin_controller->getList() as $plugin) {
+ if (!in_array($plugin, $default_plugins)) {
+ if (!$plugin_controller->disable($plugin)) {
+ throw new Exception('Could not disable plugin "'.$plugin.'"!');
+ }
+ }
+ }
+
+ // disable and enable configured plugins
+ foreach ($this->pluginsDisabled as $plugin) {
+ if (!$plugin_controller->disable($plugin)) {
+ throw new Exception('Could not disable plugin "'.$plugin.'"!');
+ }
+ }
+ foreach ($this->pluginsEnabled as $plugin) {
+ /* enable() returns false but works...
+ if (!$plugin_controller->enable($plugin)) {
+ throw new Exception('Could not enable plugin "'.$plugin.'"!');
+ }
+ */
+ $plugin_controller->enable($plugin);
+ }
+
+ // reset event handler
+ global $EVENT_HANDLER;
+ $EVENT_HANDLER = new Doku_Event_Handler();
+
+ // reload language
+ $local = $conf['lang'];
+ trigger_event('INIT_LANG_LOAD', $local, 'init_lang', true);
+ }
+}
diff --git a/_test/core/TestRequest.php b/_test/core/TestRequest.php
new file mode 100644
index 000000000..172821576
--- /dev/null
+++ b/_test/core/TestRequest.php
@@ -0,0 +1,155 @@
+<?php
+/**
+ * Simulates a full DokuWiki HTTP Request and allows
+ * runtime inspection.
+ */
+
+// output buffering
+$output_buffer = '';
+
+function ob_start_callback($buffer) {
+ global $output_buffer;
+ $output_buffer .= $buffer;
+}
+
+
+/**
+ * Helper class to execute a fake request
+ */
+class TestRequest {
+
+ private $server = array();
+ private $session = array();
+ private $get = array();
+ private $post = array();
+
+ public function getServer($key) { return $this->server[$key]; }
+ public function getSession($key) { return $this->session[$key]; }
+ public function getGet($key) { return $this->get[$key]; }
+ public function getPost($key) { return $this->post[$key]; }
+
+ public function setServer($key, $value) { $this->server[$key] = $value; }
+ public function setSession($key, $value) { $this->session[$key] = $value; }
+ public function setGet($key, $value) { $this->get[$key] = $value; }
+ public function setPost($key, $value) { $this->post[$key] = $value; }
+
+ /**
+ * Executes the request
+ *
+ * @param string $url end URL to simulate, needs to start with /doku.php currently
+ * @return TestResponse the resulting output of the request
+ */
+ public function execute($uri='/doku.php') {
+ // save old environment
+ $server = $_SERVER;
+ $session = $_SESSION;
+ $get = $_GET;
+ $post = $_POST;
+ $request = $_REQUEST;
+
+ // prepare the right URI
+ $this->setUri($uri);
+
+ // import all defined globals into the function scope
+ foreach(array_keys($GLOBALS) as $glb){
+ global $$glb;
+ }
+
+ // fake environment
+ global $default_server_vars;
+ $_SERVER = array_merge($default_server_vars, $this->server);
+ $_SESSION = $this->session;
+ $_GET = $this->get;
+ $_POST = $this->post;
+ $_REQUEST = array_merge($_GET, $_POST);
+
+ // reset output buffer
+ global $output_buffer;
+ $output_buffer = '';
+
+ // now execute dokuwiki and grep the output
+ header_remove();
+ ob_start('ob_start_callback');
+ include(DOKU_INC.'doku.php');
+ ob_end_flush();
+
+ // create the response object
+ $response = new TestResponse(
+ $output_buffer,
+ headers_list()
+ );
+
+ // reset environment
+ $_SERVER = $server;
+ $_SESSION = $session;
+ $_GET = $get;
+ $_POST = $post;
+ $_REQUEST = $request;
+
+ return $response;
+ }
+
+ /**
+ * Set the virtual URI the request works against
+ *
+ * This parses the given URI and sets any contained GET variables
+ * but will not overwrite any previously set ones (eg. set via setGet()).
+ *
+ * It initializes the $_SERVER['REQUEST_URI'] and $_SERVER['QUERY_STRING']
+ * with all set GET variables.
+ *
+ * @param string $url end URL to simulate, needs to start with /doku.php currently
+ * @todo make this work with other end points
+ */
+ protected function setUri($uri){
+ if(substr($uri,0,9) != '/doku.php'){
+ throw new Exception("only '/doku.php' is supported currently");
+ }
+
+ $params = array();
+ list($uri, $query) = explode('?',$uri,2);
+ if($query) parse_str($query, $params);
+
+ $this->get = array_merge($params, $this->get);
+ if(count($this->get)){
+ $query = '?'.http_build_query($this->get, '', '&');
+ $query = str_replace(
+ array('%3A', '%5B', '%5D'),
+ array(':', '[', ']'),
+ $query
+ );
+ $uri = $uri.$query;
+ }
+
+ $this->setServer('QUERY_STRING', $query);
+ $this->setServer('REQUEST_URI', $uri);
+ }
+
+ /**
+ * Simulate a POST request with the given variables
+ *
+ * @param array $post all the POST parameters to use
+ * @param string $url end URL to simulate, needs to start with /doku.php currently
+ * @param return TestResponse
+ */
+ public function post($post=array(), $uri='/doku.php') {
+ $this->post = array_merge($this->post, $post);
+ $this->setServer('REQUEST_METHOD', 'POST');
+ return $this->execute($uri);
+ }
+
+ /**
+ * Simulate a GET request with the given variables
+ *
+ * @param array $GET all the POST parameters to use
+ * @param string $url end URL to simulate, needs to start with /doku.php currently
+ * @param return TestResponse
+ */
+ public function get($get=array(), $uri='/doku.php') {
+ $this->get = array_merge($this->get, $get);
+ $this->setServer('REQUEST_METHOD', 'GET');
+ return $this->execute($uri);
+ }
+
+
+}
diff --git a/_test/core/TestResponse.php b/_test/core/TestResponse.php
new file mode 100644
index 000000000..6d20afb28
--- /dev/null
+++ b/_test/core/TestResponse.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * holds a copy of all produced outputs of a TestRequest
+ */
+class TestResponse {
+ /**
+ * @var string
+ */
+ private $content;
+
+ /**
+ * @var array
+ */
+ private $headers;
+
+ /**
+ * @var phpQueryObject
+ */
+ private $pq = null;
+
+ /**
+ * @param $content string
+ * @param $headers array
+ */
+ function __construct($content, $headers) {
+ $this->content = $content;
+ $this->headers = $headers;
+ }
+
+ /**
+ * @return string
+ */
+ public function getContent() {
+ return $this->content;
+ }
+
+ /**
+ * @return array
+ */
+ public function getHeaders() {
+ return $this->headers;
+ }
+
+ /**
+ * Query the response for a JQuery compatible CSS selector
+ *
+ * @link https://code.google.com/p/phpquery/wiki/Selectors
+ * @param $selector string
+ * @return phpQueryObject
+ */
+ public function queryHTML($selector){
+ if(is_null($this->pq)) $this->pq = phpQuery::newDocument($this->content);
+ return $this->pq->find($selector);
+ }
+}
diff --git a/_test/core/TestUtils.php b/_test/core/TestUtils.php
new file mode 100644
index 000000000..2750a3edf
--- /dev/null
+++ b/_test/core/TestUtils.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * Helper class with some filesystem utilities.
+ */
+class TestUtils {
+
+ /**
+ * helper for recursive copy()
+ *
+ * @static
+ * @param $destdir string
+ * @param $source string
+ */
+ public static function rcopy($destdir, $source) {
+ if (!is_dir($source)) {
+ copy($source, $destdir.'/'.basename($source));
+ } else {
+ $newdestdir = $destdir.'/'.basename($source);
+ if (!is_dir($newdestdir)) {
+ mkdir($newdestdir);
+ }
+
+ $dh = dir($source);
+ while (false !== ($entry = $dh->read())) {
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ TestUtils::rcopy($newdestdir, $source.'/'.$entry);
+ }
+ $dh->close();
+ }
+ }
+
+ /**
+ * helper for recursive rmdir()/unlink()
+ *
+ * @static
+ * @param $target string
+ */
+ public static function rdelete($target) {
+ if (!is_dir($target)) {
+ unlink($target);
+ } else {
+ $dh = dir($target);
+ while (false !== ($entry = $dh->read())) {
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ TestUtils::rdelete("$target/$entry");
+ }
+ $dh->close();
+ rmdir($target);
+ }
+ }
+
+ /**
+ * helper to append text to a file
+ *
+ * @static
+ * @param $file string
+ * @param $text string
+ */
+ public static function fappend($file, $text) {
+ $fh = fopen($file, 'a');
+ fwrite($fh, $text);
+ fclose($fh);
+ }
+
+}
diff --git a/_test/core/phpQuery-onefile.php b/_test/core/phpQuery-onefile.php
new file mode 100644
index 000000000..402cf8e49
--- /dev/null
+++ b/_test/core/phpQuery-onefile.php
@@ -0,0 +1,5702 @@
+<?php
+/**
+ * phpQuery is a server-side, chainable, CSS3 selector driven
+ * Document Object Model (DOM) API based on jQuery JavaScript Library.
+ *
+ * @version 0.9.5
+ * @link http://code.google.com/p/phpquery/
+ * @link http://phpquery-library.blogspot.com/
+ * @link http://jquery.com/
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @license http://www.opensource.org/licenses/mit-license.php MIT License
+ * @package phpQuery
+ */
+
+// class names for instanceof
+// TODO move them as class constants into phpQuery
+define('DOMDOCUMENT', 'DOMDocument');
+define('DOMELEMENT', 'DOMElement');
+define('DOMNODELIST', 'DOMNodeList');
+define('DOMNODE', 'DOMNode');
+
+/**
+ * DOMEvent class.
+ *
+ * Based on
+ * @link http://developer.mozilla.org/En/DOM:event
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ * @todo implement ArrayAccess ?
+ */
+class DOMEvent {
+ /**
+ * Returns a boolean indicating whether the event bubbles up through the DOM or not.
+ *
+ * @var unknown_type
+ */
+ public $bubbles = true;
+ /**
+ * Returns a boolean indicating whether the event is cancelable.
+ *
+ * @var unknown_type
+ */
+ public $cancelable = true;
+ /**
+ * Returns a reference to the currently registered target for the event.
+ *
+ * @var unknown_type
+ */
+ public $currentTarget;
+ /**
+ * Returns detail about the event, depending on the type of event.
+ *
+ * @var unknown_type
+ * @link http://developer.mozilla.org/en/DOM/event.detail
+ */
+ public $detail; // ???
+ /**
+ * Used to indicate which phase of the event flow is currently being evaluated.
+ *
+ * NOT IMPLEMENTED
+ *
+ * @var unknown_type
+ * @link http://developer.mozilla.org/en/DOM/event.eventPhase
+ */
+ public $eventPhase; // ???
+ /**
+ * The explicit original target of the event (Mozilla-specific).
+ *
+ * NOT IMPLEMENTED
+ *
+ * @var unknown_type
+ */
+ public $explicitOriginalTarget; // moz only
+ /**
+ * The original target of the event, before any retargetings (Mozilla-specific).
+ *
+ * NOT IMPLEMENTED
+ *
+ * @var unknown_type
+ */
+ public $originalTarget; // moz only
+ /**
+ * Identifies a secondary target for the event.
+ *
+ * @var unknown_type
+ */
+ public $relatedTarget;
+ /**
+ * Returns a reference to the target to which the event was originally dispatched.
+ *
+ * @var unknown_type
+ */
+ public $target;
+ /**
+ * Returns the time that the event was created.
+ *
+ * @var unknown_type
+ */
+ public $timeStamp;
+ /**
+ * Returns the name of the event (case-insensitive).
+ */
+ public $type;
+ public $runDefault = true;
+ public $data = null;
+ public function __construct($data) {
+ foreach($data as $k => $v) {
+ $this->$k = $v;
+ }
+ if (! $this->timeStamp)
+ $this->timeStamp = time();
+ }
+ /**
+ * Cancels the event (if it is cancelable).
+ *
+ */
+ public function preventDefault() {
+ $this->runDefault = false;
+ }
+ /**
+ * Stops the propagation of events further along in the DOM.
+ *
+ */
+ public function stopPropagation() {
+ $this->bubbles = false;
+ }
+}
+
+
+/**
+ * DOMDocumentWrapper class simplifies work with DOMDocument.
+ *
+ * Know bug:
+ * - in XHTML fragments, <br /> changes to <br clear="none" />
+ *
+ * @todo check XML catalogs compatibility
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ */
+class DOMDocumentWrapper {
+ /**
+ * @var DOMDocument
+ */
+ public $document;
+ public $id;
+ /**
+ * @todo Rewrite as method and quess if null.
+ * @var unknown_type
+ */
+ public $contentType = '';
+ public $xpath;
+ public $uuid = 0;
+ public $data = array();
+ public $dataNodes = array();
+ public $events = array();
+ public $eventsNodes = array();
+ public $eventsGlobal = array();
+ /**
+ * @TODO iframes support http://code.google.com/p/phpquery/issues/detail?id=28
+ * @var unknown_type
+ */
+ public $frames = array();
+ /**
+ * Document root, by default equals to document itself.
+ * Used by documentFragments.
+ *
+ * @var DOMNode
+ */
+ public $root;
+ public $isDocumentFragment;
+ public $isXML = false;
+ public $isXHTML = false;
+ public $isHTML = false;
+ public $charset;
+ public function __construct($markup = null, $contentType = null, $newDocumentID = null) {
+ if (isset($markup))
+ $this->load($markup, $contentType, $newDocumentID);
+ $this->id = $newDocumentID
+ ? $newDocumentID
+ : md5(microtime());
+ }
+ public function load($markup, $contentType = null, $newDocumentID = null) {
+// phpQuery::$documents[$id] = $this;
+ $this->contentType = strtolower($contentType);
+ if ($markup instanceof DOMDOCUMENT) {
+ $this->document = $markup;
+ $this->root = $this->document;
+ $this->charset = $this->document->encoding;
+ // TODO isDocumentFragment
+ } else {
+ $loaded = $this->loadMarkup($markup);
+ }
+ if ($loaded) {
+// $this->document->formatOutput = true;
+ $this->document->preserveWhiteSpace = true;
+ $this->xpath = new DOMXPath($this->document);
+ $this->afterMarkupLoad();
+ return true;
+ // remember last loaded document
+// return phpQuery::selectDocument($id);
+ }
+ return false;
+ }
+ protected function afterMarkupLoad() {
+ if ($this->isXHTML) {
+ $this->xpath->registerNamespace("html", "http://www.w3.org/1999/xhtml");
+ }
+ }
+ protected function loadMarkup($markup) {
+ $loaded = false;
+ if ($this->contentType) {
+ self::debug("Load markup for content type {$this->contentType}");
+ // content determined by contentType
+ list($contentType, $charset) = $this->contentTypeToArray($this->contentType);
+ switch($contentType) {
+ case 'text/html':
+ phpQuery::debug("Loading HTML, content type '{$this->contentType}'");
+ $loaded = $this->loadMarkupHTML($markup, $charset);
+ break;
+ case 'text/xml':
+ case 'application/xhtml+xml':
+ phpQuery::debug("Loading XML, content type '{$this->contentType}'");
+ $loaded = $this->loadMarkupXML($markup, $charset);
+ break;
+ default:
+ // for feeds or anything that sometimes doesn't use text/xml
+ if (strpos('xml', $this->contentType) !== false) {
+ phpQuery::debug("Loading XML, content type '{$this->contentType}'");
+ $loaded = $this->loadMarkupXML($markup, $charset);
+ } else
+ phpQuery::debug("Could not determine document type from content type '{$this->contentType}'");
+ }
+ } else {
+ // content type autodetection
+ if ($this->isXML($markup)) {
+ phpQuery::debug("Loading XML, isXML() == true");
+ $loaded = $this->loadMarkupXML($markup);
+ if (! $loaded && $this->isXHTML) {
+ phpQuery::debug('Loading as XML failed, trying to load as HTML, isXHTML == true');
+ $loaded = $this->loadMarkupHTML($markup);
+ }
+ } else {
+ phpQuery::debug("Loading HTML, isXML() == false");
+ $loaded = $this->loadMarkupHTML($markup);
+ }
+ }
+ return $loaded;
+ }
+ protected function loadMarkupReset() {
+ $this->isXML = $this->isXHTML = $this->isHTML = false;
+ }
+ protected function documentCreate($charset, $version = '1.0') {
+ if (! $version)
+ $version = '1.0';
+ $this->document = new DOMDocument($version, $charset);
+ $this->charset = $this->document->encoding;
+// $this->document->encoding = $charset;
+ $this->document->formatOutput = true;
+ $this->document->preserveWhiteSpace = true;
+ }
+ protected function loadMarkupHTML($markup, $requestedCharset = null) {
+ if (phpQuery::$debug)
+ phpQuery::debug('Full markup load (HTML): '.substr($markup, 0, 250));
+ $this->loadMarkupReset();
+ $this->isHTML = true;
+ if (!isset($this->isDocumentFragment))
+ $this->isDocumentFragment = self::isDocumentFragmentHTML($markup);
+ $charset = null;
+ $documentCharset = $this->charsetFromHTML($markup);
+ $addDocumentCharset = false;
+ if ($documentCharset) {
+ $charset = $documentCharset;
+ $markup = $this->charsetFixHTML($markup);
+ } else if ($requestedCharset) {
+ $charset = $requestedCharset;
+ }
+ if (! $charset)
+ $charset = phpQuery::$defaultCharset;
+ // HTTP 1.1 says that the default charset is ISO-8859-1
+ // @see http://www.w3.org/International/O-HTTP-charset
+ if (! $documentCharset) {
+ $documentCharset = 'ISO-8859-1';
+ $addDocumentCharset = true;
+ }
+ // Should be careful here, still need 'magic encoding detection' since lots of pages have other 'default encoding'
+ // Worse, some pages can have mixed encodings... we'll try not to worry about that
+ $requestedCharset = strtoupper($requestedCharset);
+ $documentCharset = strtoupper($documentCharset);
+ phpQuery::debug("DOC: $documentCharset REQ: $requestedCharset");
+ if ($requestedCharset && $documentCharset && $requestedCharset !== $documentCharset) {
+ phpQuery::debug("CHARSET CONVERT");
+ // Document Encoding Conversion
+ // http://code.google.com/p/phpquery/issues/detail?id=86
+ if (function_exists('mb_detect_encoding')) {
+ $possibleCharsets = array($documentCharset, $requestedCharset, 'AUTO');
+ $docEncoding = mb_detect_encoding($markup, implode(', ', $possibleCharsets));
+ if (! $docEncoding)
+ $docEncoding = $documentCharset; // ok trust the document
+ phpQuery::debug("DETECTED '$docEncoding'");
+ // Detected does not match what document says...
+ if ($docEncoding !== $documentCharset) {
+ // Tricky..
+ }
+ if ($docEncoding !== $requestedCharset) {
+ phpQuery::debug("CONVERT $docEncoding => $requestedCharset");
+ $markup = mb_convert_encoding($markup, $requestedCharset, $docEncoding);
+ $markup = $this->charsetAppendToHTML($markup, $requestedCharset);
+ $charset = $requestedCharset;
+ }
+ } else {
+ phpQuery::debug("TODO: charset conversion without mbstring...");
+ }
+ }
+ $return = false;
+ if ($this->isDocumentFragment) {
+ phpQuery::debug("Full markup load (HTML), DocumentFragment detected, using charset '$charset'");
+ $return = $this->documentFragmentLoadMarkup($this, $charset, $markup);
+ } else {
+ if ($addDocumentCharset) {
+ phpQuery::debug("Full markup load (HTML), appending charset: '$charset'");
+ $markup = $this->charsetAppendToHTML($markup, $charset);
+ }
+ phpQuery::debug("Full markup load (HTML), documentCreate('$charset')");
+ $this->documentCreate($charset);
+ $return = phpQuery::$debug === 2
+ ? $this->document->loadHTML($markup)
+ : @$this->document->loadHTML($markup);
+ if ($return)
+ $this->root = $this->document;
+ }
+ if ($return && ! $this->contentType)
+ $this->contentType = 'text/html';
+ return $return;
+ }
+ protected function loadMarkupXML($markup, $requestedCharset = null) {
+ if (phpQuery::$debug)
+ phpQuery::debug('Full markup load (XML): '.substr($markup, 0, 250));
+ $this->loadMarkupReset();
+ $this->isXML = true;
+ // check agains XHTML in contentType or markup
+ $isContentTypeXHTML = $this->isXHTML();
+ $isMarkupXHTML = $this->isXHTML($markup);
+ if ($isContentTypeXHTML || $isMarkupXHTML) {
+ self::debug('Full markup load (XML), XHTML detected');
+ $this->isXHTML = true;
+ }
+ // determine document fragment
+ if (! isset($this->isDocumentFragment))
+ $this->isDocumentFragment = $this->isXHTML
+ ? self::isDocumentFragmentXHTML($markup)
+ : self::isDocumentFragmentXML($markup);
+ // this charset will be used
+ $charset = null;
+ // charset from XML declaration @var string
+ $documentCharset = $this->charsetFromXML($markup);
+ if (! $documentCharset) {
+ if ($this->isXHTML) {
+ // this is XHTML, try to get charset from content-type meta header
+ $documentCharset = $this->charsetFromHTML($markup);
+ if ($documentCharset) {
+ phpQuery::debug("Full markup load (XML), appending XHTML charset '$documentCharset'");
+ $this->charsetAppendToXML($markup, $documentCharset);
+ $charset = $documentCharset;
+ }
+ }
+ if (! $documentCharset) {
+ // if still no document charset...
+ $charset = $requestedCharset;
+ }
+ } else if ($requestedCharset) {
+ $charset = $requestedCharset;
+ }
+ if (! $charset) {
+ $charset = phpQuery::$defaultCharset;
+ }
+ if ($requestedCharset && $documentCharset && $requestedCharset != $documentCharset) {
+ // TODO place for charset conversion
+// $charset = $requestedCharset;
+ }
+ $return = false;
+ if ($this->isDocumentFragment) {
+ phpQuery::debug("Full markup load (XML), DocumentFragment detected, using charset '$charset'");
+ $return = $this->documentFragmentLoadMarkup($this, $charset, $markup);
+ } else {
+ // FIXME ???
+ if ($isContentTypeXHTML && ! $isMarkupXHTML)
+ if (! $documentCharset) {
+ phpQuery::debug("Full markup load (XML), appending charset '$charset'");
+ $markup = $this->charsetAppendToXML($markup, $charset);
+ }
+ // see http://pl2.php.net/manual/en/book.dom.php#78929
+ // LIBXML_DTDLOAD (>= PHP 5.1)
+ // does XML ctalogues works with LIBXML_NONET
+ // $this->document->resolveExternals = true;
+ // TODO test LIBXML_COMPACT for performance improvement
+ // create document
+ $this->documentCreate($charset);
+ if (phpversion() < 5.1) {
+ $this->document->resolveExternals = true;
+ $return = phpQuery::$debug === 2
+ ? $this->document->loadXML($markup)
+ : @$this->document->loadXML($markup);
+ } else {
+ /** @link http://pl2.php.net/manual/en/libxml.constants.php */
+ $libxmlStatic = phpQuery::$debug === 2
+ ? LIBXML_DTDLOAD|LIBXML_DTDATTR|LIBXML_NONET
+ : LIBXML_DTDLOAD|LIBXML_DTDATTR|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOERROR;
+ $return = $this->document->loadXML($markup, $libxmlStatic);
+// if (! $return)
+// $return = $this->document->loadHTML($markup);
+ }
+ if ($return)
+ $this->root = $this->document;
+ }
+ if ($return) {
+ if (! $this->contentType) {
+ if ($this->isXHTML)
+ $this->contentType = 'application/xhtml+xml';
+ else
+ $this->contentType = 'text/xml';
+ }
+ return $return;
+ } else {
+ throw new Exception("Error loading XML markup");
+ }
+ }
+ protected function isXHTML($markup = null) {
+ if (! isset($markup)) {
+ return strpos($this->contentType, 'xhtml') !== false;
+ }
+ // XXX ok ?
+ return strpos($markup, "<!DOCTYPE html") !== false;
+// return stripos($doctype, 'xhtml') !== false;
+// $doctype = isset($dom->doctype) && is_object($dom->doctype)
+// ? $dom->doctype->publicId
+// : self::$defaultDoctype;
+ }
+ protected function isXML($markup) {
+// return strpos($markup, '<?xml') !== false && stripos($markup, 'xhtml') === false;
+ return strpos(substr($markup, 0, 100), '<'.'?xml') !== false;
+ }
+ protected function contentTypeToArray($contentType) {
+ $matches = explode(';', trim(strtolower($contentType)));
+ if (isset($matches[1])) {
+ $matches[1] = explode('=', $matches[1]);
+ // strip 'charset='
+ $matches[1] = isset($matches[1][1]) && trim($matches[1][1])
+ ? $matches[1][1]
+ : $matches[1][0];
+ } else
+ $matches[1] = null;
+ return $matches;
+ }
+ /**
+ *
+ * @param $markup
+ * @return array contentType, charset
+ */
+ protected function contentTypeFromHTML($markup) {
+ $matches = array();
+ // find meta tag
+ preg_match('@<meta[^>]+http-equiv\\s*=\\s*(["|\'])Content-Type\\1([^>]+?)>@i',
+ $markup, $matches
+ );
+ if (! isset($matches[0]))
+ return array(null, null);
+ // get attr 'content'
+ preg_match('@content\\s*=\\s*(["|\'])(.+?)\\1@', $matches[0], $matches);
+ if (! isset($matches[0]))
+ return array(null, null);
+ return $this->contentTypeToArray($matches[2]);
+ }
+ protected function charsetFromHTML($markup) {
+ $contentType = $this->contentTypeFromHTML($markup);
+ return $contentType[1];
+ }
+ protected function charsetFromXML($markup) {
+ $matches;
+ // find declaration
+ preg_match('@<'.'?xml[^>]+encoding\\s*=\\s*(["|\'])(.*?)\\1@i',
+ $markup, $matches
+ );
+ return isset($matches[2])
+ ? strtolower($matches[2])
+ : null;
+ }
+ /**
+ * Repositions meta[type=charset] at the start of head. Bypasses DOMDocument bug.
+ *
+ * @link http://code.google.com/p/phpquery/issues/detail?id=80
+ * @param $html
+ */
+ protected function charsetFixHTML($markup) {
+ $matches = array();
+ // find meta tag
+ preg_match('@\s*<meta[^>]+http-equiv\\s*=\\s*(["|\'])Content-Type\\1([^>]+?)>@i',
+ $markup, $matches, PREG_OFFSET_CAPTURE
+ );
+ if (! isset($matches[0]))
+ return;
+ $metaContentType = $matches[0][0];
+ $markup = substr($markup, 0, $matches[0][1])
+ .substr($markup, $matches[0][1]+strlen($metaContentType));
+ $headStart = stripos($markup, '<head>');
+ $markup = substr($markup, 0, $headStart+6).$metaContentType
+ .substr($markup, $headStart+6);
+ return $markup;
+ }
+ protected function charsetAppendToHTML($html, $charset, $xhtml = false) {
+ // remove existing meta[type=content-type]
+ $html = preg_replace('@\s*<meta[^>]+http-equiv\\s*=\\s*(["|\'])Content-Type\\1([^>]+?)>@i', '', $html);
+ $meta = '<meta http-equiv="Content-Type" content="text/html;charset='
+ .$charset.'" '
+ .($xhtml ? '/' : '')
+ .'>';
+ if (strpos($html, '<head') === false) {
+ if (strpos($hltml, '<html') === false) {
+ return $meta.$html;
+ } else {
+ return preg_replace(
+ '@<html(.*?)(?(?<!\?)>)@s',
+ "<html\\1><head>{$meta}</head>",
+ $html
+ );
+ }
+ } else {
+ return preg_replace(
+ '@<head(.*?)(?(?<!\?)>)@s',
+ '<head\\1>'.$meta,
+ $html
+ );
+ }
+ }
+ protected function charsetAppendToXML($markup, $charset) {
+ $declaration = '<'.'?xml version="1.0" encoding="'.$charset.'"?'.'>';
+ return $declaration.$markup;
+ }
+ public static function isDocumentFragmentHTML($markup) {
+ return stripos($markup, '<html') === false && stripos($markup, '<!doctype') === false;
+ }
+ public static function isDocumentFragmentXML($markup) {
+ return stripos($markup, '<'.'?xml') === false;
+ }
+ public static function isDocumentFragmentXHTML($markup) {
+ return self::isDocumentFragmentHTML($markup);
+ }
+ public function importAttr($value) {
+ // TODO
+ }
+ /**
+ *
+ * @param $source
+ * @param $target
+ * @param $sourceCharset
+ * @return array Array of imported nodes.
+ */
+ public function import($source, $sourceCharset = null) {
+ // TODO charset conversions
+ $return = array();
+ if ($source instanceof DOMNODE && !($source instanceof DOMNODELIST))
+ $source = array($source);
+// if (is_array($source)) {
+// foreach($source as $node) {
+// if (is_string($node)) {
+// // string markup
+// $fake = $this->documentFragmentCreate($node, $sourceCharset);
+// if ($fake === false)
+// throw new Exception("Error loading documentFragment markup");
+// else
+// $return = array_merge($return,
+// $this->import($fake->root->childNodes)
+// );
+// } else {
+// $return[] = $this->document->importNode($node, true);
+// }
+// }
+// return $return;
+// } else {
+// // string markup
+// $fake = $this->documentFragmentCreate($source, $sourceCharset);
+// if ($fake === false)
+// throw new Exception("Error loading documentFragment markup");
+// else
+// return $this->import($fake->root->childNodes);
+// }
+ if (is_array($source) || $source instanceof DOMNODELIST) {
+ // dom nodes
+ self::debug('Importing nodes to document');
+ foreach($source as $node)
+ $return[] = $this->document->importNode($node, true);
+ } else {
+ // string markup
+ $fake = $this->documentFragmentCreate($source, $sourceCharset);
+ if ($fake === false)
+ throw new Exception("Error loading documentFragment markup");
+ else
+ return $this->import($fake->root->childNodes);
+ }
+ return $return;
+ }
+ /**
+ * Creates new document fragment.
+ *
+ * @param $source
+ * @return DOMDocumentWrapper
+ */
+ protected function documentFragmentCreate($source, $charset = null) {
+ $fake = new DOMDocumentWrapper();
+ $fake->contentType = $this->contentType;
+ $fake->isXML = $this->isXML;
+ $fake->isHTML = $this->isHTML;
+ $fake->isXHTML = $this->isXHTML;
+ $fake->root = $fake->document;
+ if (! $charset)
+ $charset = $this->charset;
+// $fake->documentCreate($this->charset);
+ if ($source instanceof DOMNODE && !($source instanceof DOMNODELIST))
+ $source = array($source);
+ if (is_array($source) || $source instanceof DOMNODELIST) {
+ // dom nodes
+ // load fake document
+ if (! $this->documentFragmentLoadMarkup($fake, $charset))
+ return false;
+ $nodes = $fake->import($source);
+ foreach($nodes as $node)
+ $fake->root->appendChild($node);
+ } else {
+ // string markup
+ $this->documentFragmentLoadMarkup($fake, $charset, $source);
+ }
+ return $fake;
+ }
+ /**
+ *
+ * @param $document DOMDocumentWrapper
+ * @param $markup
+ * @return $document
+ */
+ private function documentFragmentLoadMarkup($fragment, $charset, $markup = null) {
+ // TODO error handling
+ // TODO copy doctype
+ // tempolary turn off
+ $fragment->isDocumentFragment = false;
+ if ($fragment->isXML) {
+ if ($fragment->isXHTML) {
+ // add FAKE element to set default namespace
+ $fragment->loadMarkupXML('<?xml version="1.0" encoding="'.$charset.'"?>'
+ .'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" '
+ .'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
+ .'<fake xmlns="http://www.w3.org/1999/xhtml">'.$markup.'</fake>');
+ $fragment->root = $fragment->document->firstChild->nextSibling;
+ } else {
+ $fragment->loadMarkupXML('<?xml version="1.0" encoding="'.$charset.'"?><fake>'.$markup.'</fake>');
+ $fragment->root = $fragment->document->firstChild;
+ }
+ } else {
+ $markup2 = phpQuery::$defaultDoctype.'<html><head><meta http-equiv="Content-Type" content="text/html;charset='
+ .$charset.'"></head>';
+ $noBody = strpos($markup, '<body') === false;
+ if ($noBody)
+ $markup2 .= '<body>';
+ $markup2 .= $markup;
+ if ($noBody)
+ $markup2 .= '</body>';
+ $markup2 .= '</html>';
+ $fragment->loadMarkupHTML($markup2);
+ // TODO resolv body tag merging issue
+ $fragment->root = $noBody
+ ? $fragment->document->firstChild->nextSibling->firstChild->nextSibling
+ : $fragment->document->firstChild->nextSibling->firstChild->nextSibling;
+ }
+ if (! $fragment->root)
+ return false;
+ $fragment->isDocumentFragment = true;
+ return true;
+ }
+ protected function documentFragmentToMarkup($fragment) {
+ phpQuery::debug('documentFragmentToMarkup');
+ $tmp = $fragment->isDocumentFragment;
+ $fragment->isDocumentFragment = false;
+ $markup = $fragment->markup();
+ if ($fragment->isXML) {
+ $markup = substr($markup, 0, strrpos($markup, '</fake>'));
+ if ($fragment->isXHTML) {
+ $markup = substr($markup, strpos($markup, '<fake')+43);
+ } else {
+ $markup = substr($markup, strpos($markup, '<fake>')+6);
+ }
+ } else {
+ $markup = substr($markup, strpos($markup, '<body>')+6);
+ $markup = substr($markup, 0, strrpos($markup, '</body>'));
+ }
+ $fragment->isDocumentFragment = $tmp;
+ if (phpQuery::$debug)
+ phpQuery::debug('documentFragmentToMarkup: '.substr($markup, 0, 150));
+ return $markup;
+ }
+ /**
+ * Return document markup, starting with optional $nodes as root.
+ *
+ * @param $nodes DOMNode|DOMNodeList
+ * @return string
+ */
+ public function markup($nodes = null, $innerMarkup = false) {
+ if (isset($nodes) && count($nodes) == 1 && $nodes[0] instanceof DOMDOCUMENT)
+ $nodes = null;
+ if (isset($nodes)) {
+ $markup = '';
+ if (!is_array($nodes) && !($nodes instanceof DOMNODELIST) )
+ $nodes = array($nodes);
+ if ($this->isDocumentFragment && ! $innerMarkup)
+ foreach($nodes as $i => $node)
+ if ($node->isSameNode($this->root)) {
+ // var_dump($node);
+ $nodes = array_slice($nodes, 0, $i)
+ + phpQuery::DOMNodeListToArray($node->childNodes)
+ + array_slice($nodes, $i+1);
+ }
+ if ($this->isXML && ! $innerMarkup) {
+ self::debug("Getting outerXML with charset '{$this->charset}'");
+ // we need outerXML, so we can benefit from
+ // $node param support in saveXML()
+ foreach($nodes as $node)
+ $markup .= $this->document->saveXML($node);
+ } else {
+ $loop = array();
+ if ($innerMarkup)
+ foreach($nodes as $node) {
+ if ($node->childNodes)
+ foreach($node->childNodes as $child)
+ $loop[] = $child;
+ else
+ $loop[] = $node;
+ }
+ else
+ $loop = $nodes;
+ self::debug("Getting markup, moving selected nodes (".count($loop).") to new DocumentFragment");
+ $fake = $this->documentFragmentCreate($loop);
+ $markup = $this->documentFragmentToMarkup($fake);
+ }
+ if ($this->isXHTML) {
+ self::debug("Fixing XHTML");
+ $markup = self::markupFixXHTML($markup);
+ }
+ self::debug("Markup: ".substr($markup, 0, 250));
+ return $markup;
+ } else {
+ if ($this->isDocumentFragment) {
+ // documentFragment, html only...
+ self::debug("Getting markup, DocumentFragment detected");
+// return $this->markup(
+//// $this->document->getElementsByTagName('body')->item(0)
+// $this->document->root, true
+// );
+ $markup = $this->documentFragmentToMarkup($this);
+ // no need for markupFixXHTML, as it's done thought markup($nodes) method
+ return $markup;
+ } else {
+ self::debug("Getting markup (".($this->isXML?'XML':'HTML')."), final with charset '{$this->charset}'");
+ $markup = $this->isXML
+ ? $this->document->saveXML()
+ : $this->document->saveHTML();
+ if ($this->isXHTML) {
+ self::debug("Fixing XHTML");
+ $markup = self::markupFixXHTML($markup);
+ }
+ self::debug("Markup: ".substr($markup, 0, 250));
+ return $markup;
+ }
+ }
+ }
+ protected static function markupFixXHTML($markup) {
+ $markup = self::expandEmptyTag('script', $markup);
+ $markup = self::expandEmptyTag('select', $markup);
+ $markup = self::expandEmptyTag('textarea', $markup);
+ return $markup;
+ }
+ public static function debug($text) {
+ phpQuery::debug($text);
+ }
+ /**
+ * expandEmptyTag
+ *
+ * @param $tag
+ * @param $xml
+ * @return unknown_type
+ * @author mjaque at ilkebenson dot com
+ * @link http://php.net/manual/en/domdocument.savehtml.php#81256
+ */
+ public static function expandEmptyTag($tag, $xml){
+ $indice = 0;
+ while ($indice< strlen($xml)){
+ $pos = strpos($xml, "<$tag ", $indice);
+ if ($pos){
+ $posCierre = strpos($xml, ">", $pos);
+ if ($xml[$posCierre-1] == "/"){
+ $xml = substr_replace($xml, "></$tag>", $posCierre-1, 2);
+ }
+ $indice = $posCierre;
+ }
+ else break;
+ }
+ return $xml;
+ }
+}
+
+/**
+ * Event handling class.
+ *
+ * @author Tobiasz Cudnik
+ * @package phpQuery
+ * @static
+ */
+abstract class phpQueryEvents {
+ /**
+ * Trigger a type of event on every matched element.
+ *
+ * @param DOMNode|phpQueryObject|string $document
+ * @param unknown_type $type
+ * @param unknown_type $data
+ *
+ * @TODO exclusive events (with !)
+ * @TODO global events (test)
+ * @TODO support more than event in $type (space-separated)
+ */
+ public static function trigger($document, $type, $data = array(), $node = null) {
+ // trigger: function(type, data, elem, donative, extra) {
+ $documentID = phpQuery::getDocumentID($document);
+ $namespace = null;
+ if (strpos($type, '.') !== false)
+ list($name, $namespace) = explode('.', $type);
+ else
+ $name = $type;
+ if (! $node) {
+ if (self::issetGlobal($documentID, $type)) {
+ $pq = phpQuery::getDocument($documentID);
+ // TODO check add($pq->document)
+ $pq->find('*')->add($pq->document)
+ ->trigger($type, $data);
+ }
+ } else {
+ if (isset($data[0]) && $data[0] instanceof DOMEvent) {
+ $event = $data[0];
+ $event->relatedTarget = $event->target;
+ $event->target = $node;
+ $data = array_slice($data, 1);
+ } else {
+ $event = new DOMEvent(array(
+ 'type' => $type,
+ 'target' => $node,
+ 'timeStamp' => time(),
+ ));
+ }
+ $i = 0;
+ while($node) {
+ // TODO whois
+ phpQuery::debug("Triggering ".($i?"bubbled ":'')."event '{$type}' on "
+ ."node \n");//.phpQueryObject::whois($node)."\n");
+ $event->currentTarget = $node;
+ $eventNode = self::getNode($documentID, $node);
+ if (isset($eventNode->eventHandlers)) {
+ foreach($eventNode->eventHandlers as $eventType => $handlers) {
+ $eventNamespace = null;
+ if (strpos($type, '.') !== false)
+ list($eventName, $eventNamespace) = explode('.', $eventType);
+ else
+ $eventName = $eventType;
+ if ($name != $eventName)
+ continue;
+ if ($namespace && $eventNamespace && $namespace != $eventNamespace)
+ continue;
+ foreach($handlers as $handler) {
+ phpQuery::debug("Calling event handler\n");
+ $event->data = $handler['data']
+ ? $handler['data']
+ : null;
+ $params = array_merge(array($event), $data);
+ $return = phpQuery::callbackRun($handler['callback'], $params);
+ if ($return === false) {
+ $event->bubbles = false;
+ }
+ }
+ }
+ }
+ // to bubble or not to bubble...
+ if (! $event->bubbles)
+ break;
+ $node = $node->parentNode;
+ $i++;
+ }
+ }
+ }
+ /**
+ * Binds a handler to one or more events (like click) for each matched element.
+ * Can also bind custom events.
+ *
+ * @param DOMNode|phpQueryObject|string $document
+ * @param unknown_type $type
+ * @param unknown_type $data Optional
+ * @param unknown_type $callback
+ *
+ * @TODO support '!' (exclusive) events
+ * @TODO support more than event in $type (space-separated)
+ * @TODO support binding to global events
+ */
+ public static function add($document, $node, $type, $data, $callback = null) {
+ phpQuery::debug("Binding '$type' event");
+ $documentID = phpQuery::getDocumentID($document);
+// if (is_null($callback) && is_callable($data)) {
+// $callback = $data;
+// $data = null;
+// }
+ $eventNode = self::getNode($documentID, $node);
+ if (! $eventNode)
+ $eventNode = self::setNode($documentID, $node);
+ if (!isset($eventNode->eventHandlers[$type]))
+ $eventNode->eventHandlers[$type] = array();
+ $eventNode->eventHandlers[$type][] = array(
+ 'callback' => $callback,
+ 'data' => $data,
+ );
+ }
+ /**
+ * Enter description here...
+ *
+ * @param DOMNode|phpQueryObject|string $document
+ * @param unknown_type $type
+ * @param unknown_type $callback
+ *
+ * @TODO namespace events
+ * @TODO support more than event in $type (space-separated)
+ */
+ public static function remove($document, $node, $type = null, $callback = null) {
+ $documentID = phpQuery::getDocumentID($document);
+ $eventNode = self::getNode($documentID, $node);
+ if (is_object($eventNode) && isset($eventNode->eventHandlers[$type])) {
+ if ($callback) {
+ foreach($eventNode->eventHandlers[$type] as $k => $handler)
+ if ($handler['callback'] == $callback)
+ unset($eventNode->eventHandlers[$type][$k]);
+ } else {
+ unset($eventNode->eventHandlers[$type]);
+ }
+ }
+ }
+ protected static function getNode($documentID, $node) {
+ foreach(phpQuery::$documents[$documentID]->eventsNodes as $eventNode) {
+ if ($node->isSameNode($eventNode))
+ return $eventNode;
+ }
+ }
+ protected static function setNode($documentID, $node) {
+ phpQuery::$documents[$documentID]->eventsNodes[] = $node;
+ return phpQuery::$documents[$documentID]->eventsNodes[
+ count(phpQuery::$documents[$documentID]->eventsNodes)-1
+ ];
+ }
+ protected static function issetGlobal($documentID, $type) {
+ return isset(phpQuery::$documents[$documentID])
+ ? in_array($type, phpQuery::$documents[$documentID]->eventsGlobal)
+ : false;
+ }
+}
+
+
+interface ICallbackNamed {
+ function hasName();
+ function getName();
+}
+/**
+ * Callback class introduces currying-like pattern.
+ *
+ * Example:
+ * function foo($param1, $param2, $param3) {
+ * var_dump($param1, $param2, $param3);
+ * }
+ * $fooCurried = new Callback('foo',
+ * 'param1 is now statically set',
+ * new CallbackParam, new CallbackParam
+ * );
+ * phpQuery::callbackRun($fooCurried,
+ * array('param2 value', 'param3 value'
+ * );
+ *
+ * Callback class is supported in all phpQuery methods which accepts callbacks.
+ *
+ * @link http://code.google.com/p/phpquery/wiki/Callbacks#Param_Structures
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ *
+ * @TODO??? return fake forwarding function created via create_function
+ * @TODO honor paramStructure
+ */
+class Callback
+ implements ICallbackNamed {
+ public $callback = null;
+ public $params = null;
+ protected $name;
+ public function __construct($callback, $param1 = null, $param2 = null,
+ $param3 = null) {
+ $params = func_get_args();
+ $params = array_slice($params, 1);
+ if ($callback instanceof Callback) {
+ // TODO implement recurention
+ } else {
+ $this->callback = $callback;
+ $this->params = $params;
+ }
+ }
+ public function getName() {
+ return 'Callback: '.$this->name;
+ }
+ public function hasName() {
+ return isset($this->name) && $this->name;
+ }
+ public function setName($name) {
+ $this->name = $name;
+ return $this;
+ }
+ // TODO test me
+// public function addParams() {
+// $params = func_get_args();
+// return new Callback($this->callback, $this->params+$params);
+// }
+}
+/**
+ * Shorthand for new Callback(create_function(...), ...);
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ */
+class CallbackBody extends Callback {
+ public function __construct($paramList, $code, $param1 = null, $param2 = null,
+ $param3 = null) {
+ $params = func_get_args();
+ $params = array_slice($params, 2);
+ $this->callback = create_function($paramList, $code);
+ $this->params = $params;
+ }
+}
+/**
+ * Callback type which on execution returns reference passed during creation.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ */
+class CallbackReturnReference extends Callback
+ implements ICallbackNamed {
+ protected $reference;
+ public function __construct(&$reference, $name = null){
+ $this->reference =& $reference;
+ $this->callback = array($this, 'callback');
+ }
+ public function callback() {
+ return $this->reference;
+ }
+ public function getName() {
+ return 'Callback: '.$this->name;
+ }
+ public function hasName() {
+ return isset($this->name) && $this->name;
+ }
+}
+/**
+ * Callback type which on execution returns value passed during creation.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ */
+class CallbackReturnValue extends Callback
+ implements ICallbackNamed {
+ protected $value;
+ protected $name;
+ public function __construct($value, $name = null){
+ $this->value =& $value;
+ $this->name = $name;
+ $this->callback = array($this, 'callback');
+ }
+ public function callback() {
+ return $this->value;
+ }
+ public function __toString() {
+ return $this->getName();
+ }
+ public function getName() {
+ return 'Callback: '.$this->name;
+ }
+ public function hasName() {
+ return isset($this->name) && $this->name;
+ }
+}
+/**
+ * CallbackParameterToReference can be used when we don't really want a callback,
+ * only parameter passed to it. CallbackParameterToReference takes first
+ * parameter's value and passes it to reference.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ */
+class CallbackParameterToReference extends Callback {
+ /**
+ * @param $reference
+ * @TODO implement $paramIndex;
+ * param index choose which callback param will be passed to reference
+ */
+ public function __construct(&$reference){
+ $this->callback =& $reference;
+ }
+}
+//class CallbackReference extends Callback {
+// /**
+// *
+// * @param $reference
+// * @param $paramIndex
+// * @todo implement $paramIndex; param index choose which callback param will be passed to reference
+// */
+// public function __construct(&$reference, $name = null){
+// $this->callback =& $reference;
+// }
+//}
+class CallbackParam {}
+
+/**
+ * Class representing phpQuery objects.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ * @method phpQueryObject clone() clone()
+ * @method phpQueryObject empty() empty()
+ * @method phpQueryObject next() next($selector = null)
+ * @method phpQueryObject prev() prev($selector = null)
+ * @property Int $length
+ */
+class phpQueryObject
+ implements Iterator, Countable, ArrayAccess {
+ public $documentID = null;
+ /**
+ * DOMDocument class.
+ *
+ * @var DOMDocument
+ */
+ public $document = null;
+ public $charset = null;
+ /**
+ *
+ * @var DOMDocumentWrapper
+ */
+ public $documentWrapper = null;
+ /**
+ * XPath interface.
+ *
+ * @var DOMXPath
+ */
+ public $xpath = null;
+ /**
+ * Stack of selected elements.
+ * @TODO refactor to ->nodes
+ * @var array
+ */
+ public $elements = array();
+ /**
+ * @access private
+ */
+ protected $elementsBackup = array();
+ /**
+ * @access private
+ */
+ protected $previous = null;
+ /**
+ * @access private
+ * @TODO deprecate
+ */
+ protected $root = array();
+ /**
+ * Indicated if doument is just a fragment (no <html> tag).
+ *
+ * Every document is realy a full document, so even documentFragments can
+ * be queried against <html>, but getDocument(id)->htmlOuter() will return
+ * only contents of <body>.
+ *
+ * @var bool
+ */
+ public $documentFragment = true;
+ /**
+ * Iterator interface helper
+ * @access private
+ */
+ protected $elementsInterator = array();
+ /**
+ * Iterator interface helper
+ * @access private
+ */
+ protected $valid = false;
+ /**
+ * Iterator interface helper
+ * @access private
+ */
+ protected $current = null;
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function __construct($documentID) {
+// if ($documentID instanceof self)
+// var_dump($documentID->getDocumentID());
+ $id = $documentID instanceof self
+ ? $documentID->getDocumentID()
+ : $documentID;
+// var_dump($id);
+ if (! isset(phpQuery::$documents[$id] )) {
+// var_dump(phpQuery::$documents);
+ throw new Exception("Document with ID '{$id}' isn't loaded. Use phpQuery::newDocument(\$html) or phpQuery::newDocumentFile(\$file) first.");
+ }
+ $this->documentID = $id;
+ $this->documentWrapper =& phpQuery::$documents[$id];
+ $this->document =& $this->documentWrapper->document;
+ $this->xpath =& $this->documentWrapper->xpath;
+ $this->charset =& $this->documentWrapper->charset;
+ $this->documentFragment =& $this->documentWrapper->isDocumentFragment;
+ // TODO check $this->DOM->documentElement;
+// $this->root = $this->document->documentElement;
+ $this->root =& $this->documentWrapper->root;
+// $this->toRoot();
+ $this->elements = array($this->root);
+ }
+ /**
+ *
+ * @access private
+ * @param $attr
+ * @return unknown_type
+ */
+ public function __get($attr) {
+ switch($attr) {
+ // FIXME doesnt work at all ?
+ case 'length':
+ return $this->size();
+ break;
+ default:
+ return $this->$attr;
+ }
+ }
+ /**
+ * Saves actual object to $var by reference.
+ * Useful when need to break chain.
+ * @param phpQueryObject $var
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function toReference(&$var) {
+ return $var = $this;
+ }
+ public function documentFragment($state = null) {
+ if ($state) {
+ phpQuery::$documents[$this->getDocumentID()]['documentFragment'] = $state;
+ return $this;
+ }
+ return $this->documentFragment;
+ }
+ /**
+ * @access private
+ * @TODO documentWrapper
+ */
+ protected function isRoot( $node) {
+// return $node instanceof DOMDOCUMENT || $node->tagName == 'html';
+ return $node instanceof DOMDOCUMENT
+ || ($node instanceof DOMELEMENT && $node->tagName == 'html')
+ || $this->root->isSameNode($node);
+ }
+ /**
+ * @access private
+ */
+ protected function stackIsRoot() {
+ return $this->size() == 1 && $this->isRoot($this->elements[0]);
+ }
+ /**
+ * Enter description here...
+ * NON JQUERY METHOD
+ *
+ * Watch out, it doesn't creates new instance, can be reverted with end().
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function toRoot() {
+ $this->elements = array($this->root);
+ return $this;
+// return $this->newInstance(array($this->root));
+ }
+ /**
+ * Saves object's DocumentID to $var by reference.
+ * <code>
+ * $myDocumentId;
+ * phpQuery::newDocument('<div/>')
+ * ->getDocumentIDRef($myDocumentId)
+ * ->find('div')->...
+ * </code>
+ *
+ * @param unknown_type $domId
+ * @see phpQuery::newDocument
+ * @see phpQuery::newDocumentFile
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function getDocumentIDRef(&$documentID) {
+ $documentID = $this->getDocumentID();
+ return $this;
+ }
+ /**
+ * Returns object with stack set to document root.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function getDocument() {
+ return phpQuery::getDocument($this->getDocumentID());
+ }
+ /**
+ *
+ * @return DOMDocument
+ */
+ public function getDOMDocument() {
+ return $this->document;
+ }
+ /**
+ * Get object's Document ID.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function getDocumentID() {
+ return $this->documentID;
+ }
+ /**
+ * Unloads whole document from memory.
+ * CAUTION! None further operations will be possible on this document.
+ * All objects refering to it will be useless.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function unloadDocument() {
+ phpQuery::unloadDocuments($this->getDocumentID());
+ }
+ public function isHTML() {
+ return $this->documentWrapper->isHTML;
+ }
+ public function isXHTML() {
+ return $this->documentWrapper->isXHTML;
+ }
+ public function isXML() {
+ return $this->documentWrapper->isXML;
+ }
+ /**
+ * Enter description here...
+ *
+ * @link http://docs.jquery.com/Ajax/serialize
+ * @return string
+ */
+ public function serialize() {
+ return phpQuery::param($this->serializeArray());
+ }
+ /**
+ * Enter description here...
+ *
+ * @link http://docs.jquery.com/Ajax/serializeArray
+ * @return array
+ */
+ public function serializeArray($submit = null) {
+ $source = $this->filter('form, input, select, textarea')
+ ->find('input, select, textarea')
+ ->andSelf()
+ ->not('form');
+ $return = array();
+// $source->dumpDie();
+ foreach($source as $input) {
+ $input = phpQuery::pq($input);
+ if ($input->is('[disabled]'))
+ continue;
+ if (!$input->is('[name]'))
+ continue;
+ if ($input->is('[type=checkbox]') && !$input->is('[checked]'))
+ continue;
+ // jquery diff
+ if ($submit && $input->is('[type=submit]')) {
+ if ($submit instanceof DOMELEMENT && ! $input->elements[0]->isSameNode($submit))
+ continue;
+ else if (is_string($submit) && $input->attr('name') != $submit)
+ continue;
+ }
+ $return[] = array(
+ 'name' => $input->attr('name'),
+ 'value' => $input->val(),
+ );
+ }
+ return $return;
+ }
+ /**
+ * @access private
+ */
+ protected function debug($in) {
+ if (! phpQuery::$debug )
+ return;
+ print('<pre>');
+ print_r($in);
+ // file debug
+// file_put_contents(dirname(__FILE__).'/phpQuery.log', print_r($in, true)."\n", FILE_APPEND);
+ // quite handy debug trace
+// if ( is_array($in))
+// print_r(array_slice(debug_backtrace(), 3));
+ print("</pre>\n");
+ }
+ /**
+ * @access private
+ */
+ protected function isRegexp($pattern) {
+ return in_array(
+ $pattern[ mb_strlen($pattern)-1 ],
+ array('^','*','$')
+ );
+ }
+ /**
+ * Determines if $char is really a char.
+ *
+ * @param string $char
+ * @return bool
+ * @todo rewrite me to charcode range ! ;)
+ * @access private
+ */
+ protected function isChar($char) {
+ return extension_loaded('mbstring') && phpQuery::$mbstringSupport
+ ? mb_eregi('\w', $char)
+ : preg_match('@\w@', $char);
+ }
+ /**
+ * @access private
+ */
+ protected function parseSelector($query) {
+ // clean spaces
+ // TODO include this inside parsing ?
+ $query = trim(
+ preg_replace('@\s+@', ' ',
+ preg_replace('@\s*(>|\\+|~)\s*@', '\\1', $query)
+ )
+ );
+ $queries = array(array());
+ if (! $query)
+ return $queries;
+ $return =& $queries[0];
+ $specialChars = array('>',' ');
+// $specialCharsMapping = array('/' => '>');
+ $specialCharsMapping = array();
+ $strlen = mb_strlen($query);
+ $classChars = array('.', '-');
+ $pseudoChars = array('-');
+ $tagChars = array('*', '|', '-');
+ // split multibyte string
+ // http://code.google.com/p/phpquery/issues/detail?id=76
+ $_query = array();
+ for ($i=0; $i<$strlen; $i++)
+ $_query[] = mb_substr($query, $i, 1);
+ $query = $_query;
+ // it works, but i dont like it...
+ $i = 0;
+ while( $i < $strlen) {
+ $c = $query[$i];
+ $tmp = '';
+ // TAG
+ if ($this->isChar($c) || in_array($c, $tagChars)) {
+ while(isset($query[$i])
+ && ($this->isChar($query[$i]) || in_array($query[$i], $tagChars))) {
+ $tmp .= $query[$i];
+ $i++;
+ }
+ $return[] = $tmp;
+ // IDs
+ } else if ( $c == '#') {
+ $i++;
+ while( isset($query[$i]) && ($this->isChar($query[$i]) || $query[$i] == '-')) {
+ $tmp .= $query[$i];
+ $i++;
+ }
+ $return[] = '#'.$tmp;
+ // SPECIAL CHARS
+ } else if (in_array($c, $specialChars)) {
+ $return[] = $c;
+ $i++;
+ // MAPPED SPECIAL MULTICHARS
+// } else if ( $c.$query[$i+1] == '//') {
+// $return[] = ' ';
+// $i = $i+2;
+ // MAPPED SPECIAL CHARS
+ } else if ( isset($specialCharsMapping[$c])) {
+ $return[] = $specialCharsMapping[$c];
+ $i++;
+ // COMMA
+ } else if ( $c == ',') {
+ $queries[] = array();
+ $return =& $queries[ count($queries)-1 ];
+ $i++;
+ while( isset($query[$i]) && $query[$i] == ' ')
+ $i++;
+ // CLASSES
+ } else if ($c == '.') {
+ while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $classChars))) {
+ $tmp .= $query[$i];
+ $i++;
+ }
+ $return[] = $tmp;
+ // ~ General Sibling Selector
+ } else if ($c == '~') {
+ $spaceAllowed = true;
+ $tmp .= $query[$i++];
+ while( isset($query[$i])
+ && ($this->isChar($query[$i])
+ || in_array($query[$i], $classChars)
+ || $query[$i] == '*'
+ || ($query[$i] == ' ' && $spaceAllowed)
+ )) {
+ if ($query[$i] != ' ')
+ $spaceAllowed = false;
+ $tmp .= $query[$i];
+ $i++;
+ }
+ $return[] = $tmp;
+ // + Adjacent sibling selectors
+ } else if ($c == '+') {
+ $spaceAllowed = true;
+ $tmp .= $query[$i++];
+ while( isset($query[$i])
+ && ($this->isChar($query[$i])
+ || in_array($query[$i], $classChars)
+ || $query[$i] == '*'
+ || ($spaceAllowed && $query[$i] == ' ')
+ )) {
+ if ($query[$i] != ' ')
+ $spaceAllowed = false;
+ $tmp .= $query[$i];
+ $i++;
+ }
+ $return[] = $tmp;
+ // ATTRS
+ } else if ($c == '[') {
+ $stack = 1;
+ $tmp .= $c;
+ while( isset($query[++$i])) {
+ $tmp .= $query[$i];
+ if ( $query[$i] == '[') {
+ $stack++;
+ } else if ( $query[$i] == ']') {
+ $stack--;
+ if (! $stack )
+ break;
+ }
+ }
+ $return[] = $tmp;
+ $i++;
+ // PSEUDO CLASSES
+ } else if ($c == ':') {
+ $stack = 1;
+ $tmp .= $query[$i++];
+ while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $pseudoChars))) {
+ $tmp .= $query[$i];
+ $i++;
+ }
+ // with arguments ?
+ if ( isset($query[$i]) && $query[$i] == '(') {
+ $tmp .= $query[$i];
+ $stack = 1;
+ while( isset($query[++$i])) {
+ $tmp .= $query[$i];
+ if ( $query[$i] == '(') {
+ $stack++;
+ } else if ( $query[$i] == ')') {
+ $stack--;
+ if (! $stack )
+ break;
+ }
+ }
+ $return[] = $tmp;
+ $i++;
+ } else {
+ $return[] = $tmp;
+ }
+ } else {
+ $i++;
+ }
+ }
+ foreach($queries as $k => $q) {
+ if (isset($q[0])) {
+ if (isset($q[0][0]) && $q[0][0] == ':')
+ array_unshift($queries[$k], '*');
+ if ($q[0] != '>')
+ array_unshift($queries[$k], ' ');
+ }
+ }
+ return $queries;
+ }
+ /**
+ * Return matched DOM nodes.
+ *
+ * @param int $index
+ * @return array|DOMElement Single DOMElement or array of DOMElement.
+ */
+ public function get($index = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ $return = isset($index)
+ ? (isset($this->elements[$index]) ? $this->elements[$index] : null)
+ : $this->elements;
+ // pass thou callbacks
+ $args = func_get_args();
+ $args = array_slice($args, 1);
+ foreach($args as $callback) {
+ if (is_array($return))
+ foreach($return as $k => $v)
+ $return[$k] = phpQuery::callbackRun($callback, array($v));
+ else
+ $return = phpQuery::callbackRun($callback, array($return));
+ }
+ return $return;
+ }
+ /**
+ * Return matched DOM nodes.
+ * jQuery difference.
+ *
+ * @param int $index
+ * @return array|string Returns string if $index != null
+ * @todo implement callbacks
+ * @todo return only arrays ?
+ * @todo maybe other name...
+ */
+ public function getString($index = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ if ($index)
+ $return = $this->eq($index)->text();
+ else {
+ $return = array();
+ for($i = 0; $i < $this->size(); $i++) {
+ $return[] = $this->eq($i)->text();
+ }
+ }
+ // pass thou callbacks
+ $args = func_get_args();
+ $args = array_slice($args, 1);
+ foreach($args as $callback) {
+ $return = phpQuery::callbackRun($callback, array($return));
+ }
+ return $return;
+ }
+ /**
+ * Return matched DOM nodes.
+ * jQuery difference.
+ *
+ * @param int $index
+ * @return array|string Returns string if $index != null
+ * @todo implement callbacks
+ * @todo return only arrays ?
+ * @todo maybe other name...
+ */
+ public function getStrings($index = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ if ($index)
+ $return = $this->eq($index)->text();
+ else {
+ $return = array();
+ for($i = 0; $i < $this->size(); $i++) {
+ $return[] = $this->eq($i)->text();
+ }
+ // pass thou callbacks
+ $args = func_get_args();
+ $args = array_slice($args, 1);
+ }
+ foreach($args as $callback) {
+ if (is_array($return))
+ foreach($return as $k => $v)
+ $return[$k] = phpQuery::callbackRun($callback, array($v));
+ else
+ $return = phpQuery::callbackRun($callback, array($return));
+ }
+ return $return;
+ }
+ /**
+ * Returns new instance of actual class.
+ *
+ * @param array $newStack Optional. Will replace old stack with new and move old one to history.c
+ */
+ public function newInstance($newStack = null) {
+ $class = get_class($this);
+ // support inheritance by passing old object to overloaded constructor
+ $new = $class != 'phpQuery'
+ ? new $class($this, $this->getDocumentID())
+ : new phpQueryObject($this->getDocumentID());
+ $new->previous = $this;
+ if (is_null($newStack)) {
+ $new->elements = $this->elements;
+ if ($this->elementsBackup)
+ $this->elements = $this->elementsBackup;
+ } else if (is_string($newStack)) {
+ $new->elements = phpQuery::pq($newStack, $this->getDocumentID())->stack();
+ } else {
+ $new->elements = $newStack;
+ }
+ return $new;
+ }
+ /**
+ * Enter description here...
+ *
+ * In the future, when PHP will support XLS 2.0, then we would do that this way:
+ * contains(tokenize(@class, '\s'), "something")
+ * @param unknown_type $class
+ * @param unknown_type $node
+ * @return boolean
+ * @access private
+ */
+ protected function matchClasses($class, $node) {
+ // multi-class
+ if ( mb_strpos($class, '.', 1)) {
+ $classes = explode('.', substr($class, 1));
+ $classesCount = count( $classes );
+ $nodeClasses = explode(' ', $node->getAttribute('class') );
+ $nodeClassesCount = count( $nodeClasses );
+ if ( $classesCount > $nodeClassesCount )
+ return false;
+ $diff = count(
+ array_diff(
+ $classes,
+ $nodeClasses
+ )
+ );
+ if (! $diff )
+ return true;
+ // single-class
+ } else {
+ return in_array(
+ // strip leading dot from class name
+ substr($class, 1),
+ // get classes for element as array
+ explode(' ', $node->getAttribute('class') )
+ );
+ }
+ }
+ /**
+ * @access private
+ */
+ protected function runQuery($XQuery, $selector = null, $compare = null) {
+ if ($compare && ! method_exists($this, $compare))
+ return false;
+ $stack = array();
+ if (! $this->elements)
+ $this->debug('Stack empty, skipping...');
+// var_dump($this->elements[0]->nodeType);
+ // element, document
+ foreach($this->stack(array(1, 9, 13)) as $k => $stackNode) {
+ $detachAfter = false;
+ // to work on detached nodes we need temporary place them somewhere
+ // thats because context xpath queries sucks ;]
+ $testNode = $stackNode;
+ while ($testNode) {
+ if (! $testNode->parentNode && ! $this->isRoot($testNode)) {
+ $this->root->appendChild($testNode);
+ $detachAfter = $testNode;
+ break;
+ }
+ $testNode = isset($testNode->parentNode)
+ ? $testNode->parentNode
+ : null;
+ }
+ // XXX tmp ?
+ $xpath = $this->documentWrapper->isXHTML
+ ? $this->getNodeXpath($stackNode, 'html')
+ : $this->getNodeXpath($stackNode);
+ // FIXME pseudoclasses-only query, support XML
+ $query = $XQuery == '//' && $xpath == '/html[1]'
+ ? '//*'
+ : $xpath.$XQuery;
+ $this->debug("XPATH: {$query}");
+ // run query, get elements
+ $nodes = $this->xpath->query($query);
+ $this->debug("QUERY FETCHED");
+ if (! $nodes->length )
+ $this->debug('Nothing found');
+ $debug = array();
+ foreach($nodes as $node) {
+ $matched = false;
+ if ( $compare) {
+ phpQuery::$debug ?
+ $this->debug("Found: ".$this->whois( $node ).", comparing with {$compare}()")
+ : null;
+ $phpQueryDebug = phpQuery::$debug;
+ phpQuery::$debug = false;
+ // TODO ??? use phpQuery::callbackRun()
+ if (call_user_func_array(array($this, $compare), array($selector, $node)))
+ $matched = true;
+ phpQuery::$debug = $phpQueryDebug;
+ } else {
+ $matched = true;
+ }
+ if ( $matched) {
+ if (phpQuery::$debug)
+ $debug[] = $this->whois( $node );
+ $stack[] = $node;
+ }
+ }
+ if (phpQuery::$debug) {
+ $this->debug("Matched ".count($debug).": ".implode(', ', $debug));
+ }
+ if ($detachAfter)
+ $this->root->removeChild($detachAfter);
+ }
+ $this->elements = $stack;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function find($selectors, $context = null, $noHistory = false) {
+ if (!$noHistory)
+ // backup last stack /for end()/
+ $this->elementsBackup = $this->elements;
+ // allow to define context
+ // TODO combine code below with phpQuery::pq() context guessing code
+ // as generic function
+ if ($context) {
+ if (! is_array($context) && $context instanceof DOMELEMENT)
+ $this->elements = array($context);
+ else if (is_array($context)) {
+ $this->elements = array();
+ foreach ($context as $c)
+ if ($c instanceof DOMELEMENT)
+ $this->elements[] = $c;
+ } else if ( $context instanceof self )
+ $this->elements = $context->elements;
+ }
+ $queries = $this->parseSelector($selectors);
+ $this->debug(array('FIND', $selectors, $queries));
+ $XQuery = '';
+ // remember stack state because of multi-queries
+ $oldStack = $this->elements;
+ // here we will be keeping found elements
+ $stack = array();
+ foreach($queries as $selector) {
+ $this->elements = $oldStack;
+ $delimiterBefore = false;
+ foreach($selector as $s) {
+ // TAG
+ $isTag = extension_loaded('mbstring') && phpQuery::$mbstringSupport
+ ? mb_ereg_match('^[\w|\||-]+$', $s) || $s == '*'
+ : preg_match('@^[\w|\||-]+$@', $s) || $s == '*';
+ if ($isTag) {
+ if ($this->isXML()) {
+ // namespace support
+ if (mb_strpos($s, '|') !== false) {
+ $ns = $tag = null;
+ list($ns, $tag) = explode('|', $s);
+ $XQuery .= "$ns:$tag";
+ } else if ($s == '*') {
+ $XQuery .= "*";
+ } else {
+ $XQuery .= "*[local-name()='$s']";
+ }
+ } else {
+ $XQuery .= $s;
+ }
+ // ID
+ } else if ($s[0] == '#') {
+ if ($delimiterBefore)
+ $XQuery .= '*';
+ $XQuery .= "[@id='".substr($s, 1)."']";
+ // ATTRIBUTES
+ } else if ($s[0] == '[') {
+ if ($delimiterBefore)
+ $XQuery .= '*';
+ // strip side brackets
+ $attr = trim($s, '][');
+ $execute = false;
+ // attr with specifed value
+ if (mb_strpos($s, '=')) {
+ $value = null;
+ list($attr, $value) = explode('=', $attr);
+ $value = trim($value, "'\"");
+ if ($this->isRegexp($attr)) {
+ // cut regexp character
+ $attr = substr($attr, 0, -1);
+ $execute = true;
+ $XQuery .= "[@{$attr}]";
+ } else {
+ $XQuery .= "[@{$attr}='{$value}']";
+ }
+ // attr without specified value
+ } else {
+ $XQuery .= "[@{$attr}]";
+ }
+ if ($execute) {
+ $this->runQuery($XQuery, $s, 'is');
+ $XQuery = '';
+ if (! $this->length())
+ break;
+ }
+ // CLASSES
+ } else if ($s[0] == '.') {
+ // TODO use return $this->find("./self::*[contains(concat(\" \",@class,\" \"), \" $class \")]");
+ // thx wizDom ;)
+ if ($delimiterBefore)
+ $XQuery .= '*';
+ $XQuery .= '[@class]';
+ $this->runQuery($XQuery, $s, 'matchClasses');
+ $XQuery = '';
+ if (! $this->length() )
+ break;
+ // ~ General Sibling Selector
+ } else if ($s[0] == '~') {
+ $this->runQuery($XQuery);
+ $XQuery = '';
+ $this->elements = $this
+ ->siblings(
+ substr($s, 1)
+ )->elements;
+ if (! $this->length() )
+ break;
+ // + Adjacent sibling selectors
+ } else if ($s[0] == '+') {
+ // TODO /following-sibling::
+ $this->runQuery($XQuery);
+ $XQuery = '';
+ $subSelector = substr($s, 1);
+ $subElements = $this->elements;
+ $this->elements = array();
+ foreach($subElements as $node) {
+ // search first DOMElement sibling
+ $test = $node->nextSibling;
+ while($test && ! ($test instanceof DOMELEMENT))
+ $test = $test->nextSibling;
+ if ($test && $this->is($subSelector, $test))
+ $this->elements[] = $test;
+ }
+ if (! $this->length() )
+ break;
+ // PSEUDO CLASSES
+ } else if ($s[0] == ':') {
+ // TODO optimization for :first :last
+ if ($XQuery) {
+ $this->runQuery($XQuery);
+ $XQuery = '';
+ }
+ if (! $this->length())
+ break;
+ $this->pseudoClasses($s);
+ if (! $this->length())
+ break;
+ // DIRECT DESCENDANDS
+ } else if ($s == '>') {
+ $XQuery .= '/';
+ $delimiterBefore = 2;
+ // ALL DESCENDANDS
+ } else if ($s == ' ') {
+ $XQuery .= '//';
+ $delimiterBefore = 2;
+ // ERRORS
+ } else {
+ phpQuery::debug("Unrecognized token '$s'");
+ }
+ $delimiterBefore = $delimiterBefore === 2;
+ }
+ // run query if any
+ if ($XQuery && $XQuery != '//') {
+ $this->runQuery($XQuery);
+ $XQuery = '';
+ }
+ foreach($this->elements as $node)
+ if (! $this->elementsContainsNode($node, $stack))
+ $stack[] = $node;
+ }
+ $this->elements = $stack;
+ return $this->newInstance();
+ }
+ /**
+ * @todo create API for classes with pseudoselectors
+ * @access private
+ */
+ protected function pseudoClasses($class) {
+ // TODO clean args parsing ?
+ $class = ltrim($class, ':');
+ $haveArgs = mb_strpos($class, '(');
+ if ($haveArgs !== false) {
+ $args = substr($class, $haveArgs+1, -1);
+ $class = substr($class, 0, $haveArgs);
+ }
+ switch($class) {
+ case 'even':
+ case 'odd':
+ $stack = array();
+ foreach($this->elements as $i => $node) {
+ if ($class == 'even' && ($i%2) == 0)
+ $stack[] = $node;
+ else if ( $class == 'odd' && $i % 2 )
+ $stack[] = $node;
+ }
+ $this->elements = $stack;
+ break;
+ case 'eq':
+ $k = intval($args);
+ $this->elements = isset( $this->elements[$k] )
+ ? array( $this->elements[$k] )
+ : array();
+ break;
+ case 'gt':
+ $this->elements = array_slice($this->elements, $args+1);
+ break;
+ case 'lt':
+ $this->elements = array_slice($this->elements, 0, $args+1);
+ break;
+ case 'first':
+ if (isset($this->elements[0]))
+ $this->elements = array($this->elements[0]);
+ break;
+ case 'last':
+ if ($this->elements)
+ $this->elements = array($this->elements[count($this->elements)-1]);
+ break;
+ /*case 'parent':
+ $stack = array();
+ foreach($this->elements as $node) {
+ if ( $node->childNodes->length )
+ $stack[] = $node;
+ }
+ $this->elements = $stack;
+ break;*/
+ case 'contains':
+ $text = trim($args, "\"'");
+ $stack = array();
+ foreach($this->elements as $node) {
+ if (mb_stripos($node->textContent, $text) === false)
+ continue;
+ $stack[] = $node;
+ }
+ $this->elements = $stack;
+ break;
+ case 'not':
+ $selector = self::unQuote($args);
+ $this->elements = $this->not($selector)->stack();
+ break;
+ case 'slice':
+ // TODO jQuery difference ?
+ $args = explode(',',
+ str_replace(', ', ',', trim($args, "\"'"))
+ );
+ $start = $args[0];
+ $end = isset($args[1])
+ ? $args[1]
+ : null;
+ if ($end > 0)
+ $end = $end-$start;
+ $this->elements = array_slice($this->elements, $start, $end);
+ break;
+ case 'has':
+ $selector = trim($args, "\"'");
+ $stack = array();
+ foreach($this->stack(1) as $el) {
+ if ($this->find($selector, $el, true)->length)
+ $stack[] = $el;
+ }
+ $this->elements = $stack;
+ break;
+ case 'submit':
+ case 'reset':
+ $this->elements = phpQuery::merge(
+ $this->map(array($this, 'is'),
+ "input[type=$class]", new CallbackParam()
+ ),
+ $this->map(array($this, 'is'),
+ "button[type=$class]", new CallbackParam()
+ )
+ );
+ break;
+// $stack = array();
+// foreach($this->elements as $node)
+// if ($node->is('input[type=submit]') || $node->is('button[type=submit]'))
+// $stack[] = $el;
+// $this->elements = $stack;
+ case 'input':
+ $this->elements = $this->map(
+ array($this, 'is'),
+ 'input', new CallbackParam()
+ )->elements;
+ break;
+ case 'password':
+ case 'checkbox':
+ case 'radio':
+ case 'hidden':
+ case 'image':
+ case 'file':
+ $this->elements = $this->map(
+ array($this, 'is'),
+ "input[type=$class]", new CallbackParam()
+ )->elements;
+ break;
+ case 'parent':
+ $this->elements = $this->map(
+ create_function('$node', '
+ return $node instanceof DOMELEMENT && $node->childNodes->length
+ ? $node : null;')
+ )->elements;
+ break;
+ case 'empty':
+ $this->elements = $this->map(
+ create_function('$node', '
+ return $node instanceof DOMELEMENT && $node->childNodes->length
+ ? null : $node;')
+ )->elements;
+ break;
+ case 'disabled':
+ case 'selected':
+ case 'checked':
+ $this->elements = $this->map(
+ array($this, 'is'),
+ "[$class]", new CallbackParam()
+ )->elements;
+ break;
+ case 'enabled':
+ $this->elements = $this->map(
+ create_function('$node', '
+ return pq($node)->not(":disabled") ? $node : null;')
+ )->elements;
+ break;
+ case 'header':
+ $this->elements = $this->map(
+ create_function('$node',
+ '$isHeader = isset($node->tagName) && in_array($node->tagName, array(
+ "h1", "h2", "h3", "h4", "h5", "h6", "h7"
+ ));
+ return $isHeader
+ ? $node
+ : null;')
+ )->elements;
+// $this->elements = $this->map(
+// create_function('$node', '$node = pq($node);
+// return $node->is("h1")
+// || $node->is("h2")
+// || $node->is("h3")
+// || $node->is("h4")
+// || $node->is("h5")
+// || $node->is("h6")
+// || $node->is("h7")
+// ? $node
+// : null;')
+// )->elements;
+ break;
+ case 'only-child':
+ $this->elements = $this->map(
+ create_function('$node',
+ 'return pq($node)->siblings()->size() == 0 ? $node : null;')
+ )->elements;
+ break;
+ case 'first-child':
+ $this->elements = $this->map(
+ create_function('$node', 'return pq($node)->prevAll()->size() == 0 ? $node : null;')
+ )->elements;
+ break;
+ case 'last-child':
+ $this->elements = $this->map(
+ create_function('$node', 'return pq($node)->nextAll()->size() == 0 ? $node : null;')
+ )->elements;
+ break;
+ case 'nth-child':
+ $param = trim($args, "\"'");
+ if (! $param)
+ break;
+ // nth-child(n+b) to nth-child(1n+b)
+ if ($param{0} == 'n')
+ $param = '1'.$param;
+ // :nth-child(index/even/odd/equation)
+ if ($param == 'even' || $param == 'odd')
+ $mapped = $this->map(
+ create_function('$node, $param',
+ '$index = pq($node)->prevAll()->size()+1;
+ if ($param == "even" && ($index%2) == 0)
+ return $node;
+ else if ($param == "odd" && $index%2 == 1)
+ return $node;
+ else
+ return null;'),
+ new CallbackParam(), $param
+ );
+ else if (mb_strlen($param) > 1 && $param{1} == 'n')
+ // an+b
+ $mapped = $this->map(
+ create_function('$node, $param',
+ '$prevs = pq($node)->prevAll()->size();
+ $index = 1+$prevs;
+ $b = mb_strlen($param) > 3
+ ? $param{3}
+ : 0;
+ $a = $param{0};
+ if ($b && $param{2} == "-")
+ $b = -$b;
+ if ($a > 0) {
+ return ($index-$b)%$a == 0
+ ? $node
+ : null;
+ phpQuery::debug($a."*".floor($index/$a)."+$b-1 == ".($a*floor($index/$a)+$b-1)." ?= $prevs");
+ return $a*floor($index/$a)+$b-1 == $prevs
+ ? $node
+ : null;
+ } else if ($a == 0)
+ return $index == $b
+ ? $node
+ : null;
+ else
+ // negative value
+ return $index <= $b
+ ? $node
+ : null;
+// if (! $b)
+// return $index%$a == 0
+// ? $node
+// : null;
+// else
+// return ($index-$b)%$a == 0
+// ? $node
+// : null;
+ '),
+ new CallbackParam(), $param
+ );
+ else
+ // index
+ $mapped = $this->map(
+ create_function('$node, $index',
+ '$prevs = pq($node)->prevAll()->size();
+ if ($prevs && $prevs == $index-1)
+ return $node;
+ else if (! $prevs && $index == 1)
+ return $node;
+ else
+ return null;'),
+ new CallbackParam(), $param
+ );
+ $this->elements = $mapped->elements;
+ break;
+ default:
+ $this->debug("Unknown pseudoclass '{$class}', skipping...");
+ }
+ }
+ /**
+ * @access private
+ */
+ protected function __pseudoClassParam($paramsString) {
+ // TODO;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function is($selector, $nodes = null) {
+ phpQuery::debug(array("Is:", $selector));
+ if (! $selector)
+ return false;
+ $oldStack = $this->elements;
+ $returnArray = false;
+ if ($nodes && is_array($nodes)) {
+ $this->elements = $nodes;
+ } else if ($nodes)
+ $this->elements = array($nodes);
+ $this->filter($selector, true);
+ $stack = $this->elements;
+ $this->elements = $oldStack;
+ if ($nodes)
+ return $stack ? $stack : null;
+ return (bool)count($stack);
+ }
+ /**
+ * Enter description here...
+ * jQuery difference.
+ *
+ * Callback:
+ * - $index int
+ * - $node DOMNode
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @link http://docs.jquery.com/Traversing/filter
+ */
+ public function filterCallback($callback, $_skipHistory = false) {
+ if (! $_skipHistory) {
+ $this->elementsBackup = $this->elements;
+ $this->debug("Filtering by callback");
+ }
+ $newStack = array();
+ foreach($this->elements as $index => $node) {
+ $result = phpQuery::callbackRun($callback, array($index, $node));
+ if (is_null($result) || (! is_null($result) && $result))
+ $newStack[] = $node;
+ }
+ $this->elements = $newStack;
+ return $_skipHistory
+ ? $this
+ : $this->newInstance();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @link http://docs.jquery.com/Traversing/filter
+ */
+ public function filter($selectors, $_skipHistory = false) {
+ if ($selectors instanceof Callback OR $selectors instanceof Closure)
+ return $this->filterCallback($selectors, $_skipHistory);
+ if (! $_skipHistory)
+ $this->elementsBackup = $this->elements;
+ $notSimpleSelector = array(' ', '>', '~', '+', '/');
+ if (! is_array($selectors))
+ $selectors = $this->parseSelector($selectors);
+ if (! $_skipHistory)
+ $this->debug(array("Filtering:", $selectors));
+ $finalStack = array();
+ foreach($selectors as $selector) {
+ $stack = array();
+ if (! $selector)
+ break;
+ // avoid first space or /
+ if (in_array($selector[0], $notSimpleSelector))
+ $selector = array_slice($selector, 1);
+ // PER NODE selector chunks
+ foreach($this->stack() as $node) {
+ $break = false;
+ foreach($selector as $s) {
+ if (!($node instanceof DOMELEMENT)) {
+ // all besides DOMElement
+ if ( $s[0] == '[') {
+ $attr = trim($s, '[]');
+ if ( mb_strpos($attr, '=')) {
+ list( $attr, $val ) = explode('=', $attr);
+ if ($attr == 'nodeType' && $node->nodeType != $val)
+ $break = true;
+ }
+ } else
+ $break = true;
+ } else {
+ // DOMElement only
+ // ID
+ if ( $s[0] == '#') {
+ if ( $node->getAttribute('id') != substr($s, 1) )
+ $break = true;
+ // CLASSES
+ } else if ( $s[0] == '.') {
+ if (! $this->matchClasses( $s, $node ) )
+ $break = true;
+ // ATTRS
+ } else if ( $s[0] == '[') {
+ // strip side brackets
+ $attr = trim($s, '[]');
+ if (mb_strpos($attr, '=')) {
+ list($attr, $val) = explode('=', $attr);
+ $val = self::unQuote($val);
+ if ($attr == 'nodeType') {
+ if ($val != $node->nodeType)
+ $break = true;
+ } else if ($this->isRegexp($attr)) {
+ $val = extension_loaded('mbstring') && phpQuery::$mbstringSupport
+ ? quotemeta(trim($val, '"\''))
+ : preg_quote(trim($val, '"\''), '@');
+ // switch last character
+ switch( substr($attr, -1)) {
+ // quotemeta used insted of preg_quote
+ // http://code.google.com/p/phpquery/issues/detail?id=76
+ case '^':
+ $pattern = '^'.$val;
+ break;
+ case '*':
+ $pattern = '.*'.$val.'.*';
+ break;
+ case '$':
+ $pattern = '.*'.$val.'$';
+ break;
+ }
+ // cut last character
+ $attr = substr($attr, 0, -1);
+ $isMatch = extension_loaded('mbstring') && phpQuery::$mbstringSupport
+ ? mb_ereg_match($pattern, $node->getAttribute($attr))
+ : preg_match("@{$pattern}@", $node->getAttribute($attr));
+ if (! $isMatch)
+ $break = true;
+ } else if ($node->getAttribute($attr) != $val)
+ $break = true;
+ } else if (! $node->hasAttribute($attr))
+ $break = true;
+ // PSEUDO CLASSES
+ } else if ( $s[0] == ':') {
+ // skip
+ // TAG
+ } else if (trim($s)) {
+ if ($s != '*') {
+ // TODO namespaces
+ if (isset($node->tagName)) {
+ if ($node->tagName != $s)
+ $break = true;
+ } else if ($s == 'html' && ! $this->isRoot($node))
+ $break = true;
+ }
+ // AVOID NON-SIMPLE SELECTORS
+ } else if (in_array($s, $notSimpleSelector)) {
+ $break = true;
+ $this->debug(array('Skipping non simple selector', $selector));
+ }
+ }
+ if ($break)
+ break;
+ }
+ // if element passed all chunks of selector - add it to new stack
+ if (! $break )
+ $stack[] = $node;
+ }
+ $tmpStack = $this->elements;
+ $this->elements = $stack;
+ // PER ALL NODES selector chunks
+ foreach($selector as $s)
+ // PSEUDO CLASSES
+ if ($s[0] == ':')
+ $this->pseudoClasses($s);
+ foreach($this->elements as $node)
+ // XXX it should be merged without duplicates
+ // but jQuery doesnt do that
+ $finalStack[] = $node;
+ $this->elements = $tmpStack;
+ }
+ $this->elements = $finalStack;
+ if ($_skipHistory) {
+ return $this;
+ } else {
+ $this->debug("Stack length after filter(): ".count($finalStack));
+ return $this->newInstance();
+ }
+ }
+ /**
+ *
+ * @param $value
+ * @return unknown_type
+ * @TODO implement in all methods using passed parameters
+ */
+ protected static function unQuote($value) {
+ return $value[0] == '\'' || $value[0] == '"'
+ ? substr($value, 1, -1)
+ : $value;
+ }
+ /**
+ * Enter description here...
+ *
+ * @link http://docs.jquery.com/Ajax/load
+ * @return phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo Support $selector
+ */
+ public function load($url, $data = null, $callback = null) {
+ if ($data && ! is_array($data)) {
+ $callback = $data;
+ $data = null;
+ }
+ if (mb_strpos($url, ' ') !== false) {
+ $matches = null;
+ if (extension_loaded('mbstring') && phpQuery::$mbstringSupport)
+ mb_ereg('^([^ ]+) (.*)$', $url, $matches);
+ else
+ preg_match('^([^ ]+) (.*)$', $url, $matches);
+ $url = $matches[1];
+ $selector = $matches[2];
+ // FIXME this sucks, pass as callback param
+ $this->_loadSelector = $selector;
+ }
+ $ajax = array(
+ 'url' => $url,
+ 'type' => $data ? 'POST' : 'GET',
+ 'data' => $data,
+ 'complete' => $callback,
+ 'success' => array($this, '__loadSuccess')
+ );
+ phpQuery::ajax($ajax);
+ return $this;
+ }
+ /**
+ * @access private
+ * @param $html
+ * @return unknown_type
+ */
+ public function __loadSuccess($html) {
+ if ($this->_loadSelector) {
+ $html = phpQuery::newDocument($html)->find($this->_loadSelector);
+ unset($this->_loadSelector);
+ }
+ foreach($this->stack(1) as $node) {
+ phpQuery::pq($node, $this->getDocumentID())
+ ->markup($html);
+ }
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo
+ */
+ public function css() {
+ // TODO
+ return $this;
+ }
+ /**
+ * @todo
+ *
+ */
+ public function show(){
+ // TODO
+ return $this;
+ }
+ /**
+ * @todo
+ *
+ */
+ public function hide(){
+ // TODO
+ return $this;
+ }
+ /**
+ * Trigger a type of event on every matched element.
+ *
+ * @param unknown_type $type
+ * @param unknown_type $data
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @TODO support more than event in $type (space-separated)
+ */
+ public function trigger($type, $data = array()) {
+ foreach($this->elements as $node)
+ phpQueryEvents::trigger($this->getDocumentID(), $type, $data, $node);
+ return $this;
+ }
+ /**
+ * This particular method triggers all bound event handlers on an element (for a specific event type) WITHOUT executing the browsers default actions.
+ *
+ * @param unknown_type $type
+ * @param unknown_type $data
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @TODO
+ */
+ public function triggerHandler($type, $data = array()) {
+ // TODO;
+ }
+ /**
+ * Binds a handler to one or more events (like click) for each matched element.
+ * Can also bind custom events.
+ *
+ * @param unknown_type $type
+ * @param unknown_type $data Optional
+ * @param unknown_type $callback
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @TODO support '!' (exclusive) events
+ * @TODO support more than event in $type (space-separated)
+ */
+ public function bind($type, $data, $callback = null) {
+ // TODO check if $data is callable, not using is_callable
+ if (! isset($callback)) {
+ $callback = $data;
+ $data = null;
+ }
+ foreach($this->elements as $node)
+ phpQueryEvents::add($this->getDocumentID(), $node, $type, $data, $callback);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param unknown_type $type
+ * @param unknown_type $callback
+ * @return unknown
+ * @TODO namespace events
+ * @TODO support more than event in $type (space-separated)
+ */
+ public function unbind($type = null, $callback = null) {
+ foreach($this->elements as $node)
+ phpQueryEvents::remove($this->getDocumentID(), $node, $type, $callback);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function change($callback = null) {
+ if ($callback)
+ return $this->bind('change', $callback);
+ return $this->trigger('change');
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function submit($callback = null) {
+ if ($callback)
+ return $this->bind('submit', $callback);
+ return $this->trigger('submit');
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function click($callback = null) {
+ if ($callback)
+ return $this->bind('click', $callback);
+ return $this->trigger('click');
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapAllOld($wrapper) {
+ $wrapper = pq($wrapper)->_clone();
+ if (! $wrapper->length() || ! $this->length() )
+ return $this;
+ $wrapper->insertBefore($this->elements[0]);
+ $deepest = $wrapper->elements[0];
+ while($deepest->firstChild && $deepest->firstChild instanceof DOMELEMENT)
+ $deepest = $deepest->firstChild;
+ pq($deepest)->append($this);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * TODO testme...
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapAll($wrapper) {
+ if (! $this->length())
+ return $this;
+ return phpQuery::pq($wrapper, $this->getDocumentID())
+ ->clone()
+ ->insertBefore($this->get(0))
+ ->map(array($this, '___wrapAllCallback'))
+ ->append($this);
+ }
+ /**
+ *
+ * @param $node
+ * @return unknown_type
+ * @access private
+ */
+ public function ___wrapAllCallback($node) {
+ $deepest = $node;
+ while($deepest->firstChild && $deepest->firstChild instanceof DOMELEMENT)
+ $deepest = $deepest->firstChild;
+ return $deepest;
+ }
+ /**
+ * Enter description here...
+ * NON JQUERY METHOD
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapAllPHP($codeBefore, $codeAfter) {
+ return $this
+ ->slice(0, 1)
+ ->beforePHP($codeBefore)
+ ->end()
+ ->slice(-1)
+ ->afterPHP($codeAfter)
+ ->end();
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrap($wrapper) {
+ foreach($this->stack() as $node)
+ phpQuery::pq($node, $this->getDocumentID())->wrapAll($wrapper);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapPHP($codeBefore, $codeAfter) {
+ foreach($this->stack() as $node)
+ phpQuery::pq($node, $this->getDocumentID())->wrapAllPHP($codeBefore, $codeAfter);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapInner($wrapper) {
+ foreach($this->stack() as $node)
+ phpQuery::pq($node, $this->getDocumentID())->contents()->wrapAll($wrapper);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapInnerPHP($codeBefore, $codeAfter) {
+ foreach($this->stack(1) as $node)
+ phpQuery::pq($node, $this->getDocumentID())->contents()
+ ->wrapAllPHP($codeBefore, $codeAfter);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @testme Support for text nodes
+ */
+ public function contents() {
+ $stack = array();
+ foreach($this->stack(1) as $el) {
+ // FIXME (fixed) http://code.google.com/p/phpquery/issues/detail?id=56
+// if (! isset($el->childNodes))
+// continue;
+ foreach($el->childNodes as $node) {
+ $stack[] = $node;
+ }
+ }
+ return $this->newInstance($stack);
+ }
+ /**
+ * Enter description here...
+ *
+ * jQuery difference.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function contentsUnwrap() {
+ foreach($this->stack(1) as $node) {
+ if (! $node->parentNode )
+ continue;
+ $childNodes = array();
+ // any modification in DOM tree breaks childNodes iteration, so cache them first
+ foreach($node->childNodes as $chNode )
+ $childNodes[] = $chNode;
+ foreach($childNodes as $chNode )
+// $node->parentNode->appendChild($chNode);
+ $node->parentNode->insertBefore($chNode, $node);
+ $node->parentNode->removeChild($node);
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * jQuery difference.
+ */
+ public function switchWith($markup) {
+ $markup = pq($markup, $this->getDocumentID());
+ $content = null;
+ foreach($this->stack(1) as $node) {
+ pq($node)
+ ->contents()->toReference($content)->end()
+ ->replaceWith($markup->clone()->append($content));
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function eq($num) {
+ $oldStack = $this->elements;
+ $this->elementsBackup = $this->elements;
+ $this->elements = array();
+ if ( isset($oldStack[$num]) )
+ $this->elements[] = $oldStack[$num];
+ return $this->newInstance();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function size() {
+ return count($this->elements);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @deprecated Use length as attribute
+ */
+ public function length() {
+ return $this->size();
+ }
+ public function count() {
+ return $this->size();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo $level
+ */
+ public function end($level = 1) {
+// $this->elements = array_pop( $this->history );
+// return $this;
+// $this->previous->DOM = $this->DOM;
+// $this->previous->XPath = $this->XPath;
+ return $this->previous
+ ? $this->previous
+ : $this;
+ }
+ /**
+ * Enter description here...
+ * Normal use ->clone() .
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @access private
+ */
+ public function _clone() {
+ $newStack = array();
+ //pr(array('copy... ', $this->whois()));
+ //$this->dumpHistory('copy');
+ $this->elementsBackup = $this->elements;
+ foreach($this->elements as $node) {
+ $newStack[] = $node->cloneNode(true);
+ }
+ $this->elements = $newStack;
+ return $this->newInstance();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function replaceWithPHP($code) {
+ return $this->replaceWith(phpQuery::php($code));
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery $content
+ * @link http://docs.jquery.com/Manipulation/replaceWith#content
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function replaceWith($content) {
+ return $this->after($content)->remove();
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String $selector
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo this works ?
+ */
+ public function replaceAll($selector) {
+ foreach(phpQuery::pq($selector, $this->getDocumentID()) as $node)
+ phpQuery::pq($node, $this->getDocumentID())
+ ->after($this->_clone())
+ ->remove();
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function remove($selector = null) {
+ $loop = $selector
+ ? $this->filter($selector)->elements
+ : $this->elements;
+ foreach($loop as $node) {
+ if (! $node->parentNode )
+ continue;
+ if (isset($node->tagName))
+ $this->debug("Removing '{$node->tagName}'");
+ $node->parentNode->removeChild($node);
+ // Mutation event
+ $event = new DOMEvent(array(
+ 'target' => $node,
+ 'type' => 'DOMNodeRemoved'
+ ));
+ phpQueryEvents::trigger($this->getDocumentID(),
+ $event->type, array($event), $node
+ );
+ }
+ return $this;
+ }
+ protected function markupEvents($newMarkup, $oldMarkup, $node) {
+ if ($node->tagName == 'textarea' && $newMarkup != $oldMarkup) {
+ $event = new DOMEvent(array(
+ 'target' => $node,
+ 'type' => 'change'
+ ));
+ phpQueryEvents::trigger($this->getDocumentID(),
+ $event->type, array($event), $node
+ );
+ }
+ }
+ /**
+ * jQuey difference
+ *
+ * @param $markup
+ * @return unknown_type
+ * @TODO trigger change event for textarea
+ */
+ public function markup($markup = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ $args = func_get_args();
+ if ($this->documentWrapper->isXML)
+ return call_user_func_array(array($this, 'xml'), $args);
+ else
+ return call_user_func_array(array($this, 'html'), $args);
+ }
+ /**
+ * jQuey difference
+ *
+ * @param $markup
+ * @return unknown_type
+ */
+ public function markupOuter($callback1 = null, $callback2 = null, $callback3 = null) {
+ $args = func_get_args();
+ if ($this->documentWrapper->isXML)
+ return call_user_func_array(array($this, 'xmlOuter'), $args);
+ else
+ return call_user_func_array(array($this, 'htmlOuter'), $args);
+ }
+ /**
+ * Enter description here...
+ *
+ * @param unknown_type $html
+ * @return string|phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @TODO force html result
+ */
+ public function html($html = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ if (isset($html)) {
+ // INSERT
+ $nodes = $this->documentWrapper->import($html);
+ $this->empty();
+ foreach($this->stack(1) as $alreadyAdded => $node) {
+ // for now, limit events for textarea
+ if (($this->isXHTML() || $this->isHTML()) && $node->tagName == 'textarea')
+ $oldHtml = pq($node, $this->getDocumentID())->markup();
+ foreach($nodes as $newNode) {
+ $node->appendChild($alreadyAdded
+ ? $newNode->cloneNode(true)
+ : $newNode
+ );
+ }
+ // for now, limit events for textarea
+ if (($this->isXHTML() || $this->isHTML()) && $node->tagName == 'textarea')
+ $this->markupEvents($html, $oldHtml, $node);
+ }
+ return $this;
+ } else {
+ // FETCH
+ $return = $this->documentWrapper->markup($this->elements, true);
+ $args = func_get_args();
+ foreach(array_slice($args, 1) as $callback) {
+ $return = phpQuery::callbackRun($callback, array($return));
+ }
+ return $return;
+ }
+ }
+ /**
+ * @TODO force xml result
+ */
+ public function xml($xml = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ $args = func_get_args();
+ return call_user_func_array(array($this, 'html'), $args);
+ }
+ /**
+ * Enter description here...
+ * @TODO force html result
+ *
+ * @return String
+ */
+ public function htmlOuter($callback1 = null, $callback2 = null, $callback3 = null) {
+ $markup = $this->documentWrapper->markup($this->elements);
+ // pass thou callbacks
+ $args = func_get_args();
+ foreach($args as $callback) {
+ $markup = phpQuery::callbackRun($callback, array($markup));
+ }
+ return $markup;
+ }
+ /**
+ * @TODO force xml result
+ */
+ public function xmlOuter($callback1 = null, $callback2 = null, $callback3 = null) {
+ $args = func_get_args();
+ return call_user_func_array(array($this, 'htmlOuter'), $args);
+ }
+ public function __toString() {
+ return $this->markupOuter();
+ }
+ /**
+ * Just like html(), but returns markup with VALID (dangerous) PHP tags.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo support returning markup with PHP tags when called without param
+ */
+ public function php($code = null) {
+ return $this->markupPHP($code);
+ }
+ /**
+ * Enter description here...
+ *
+ * @param $code
+ * @return unknown_type
+ */
+ public function markupPHP($code = null) {
+ return isset($code)
+ ? $this->markup(phpQuery::php($code))
+ : phpQuery::markupToPHP($this->markup());
+ }
+ /**
+ * Enter description here...
+ *
+ * @param $code
+ * @return unknown_type
+ */
+ public function markupOuterPHP() {
+ return phpQuery::markupToPHP($this->markupOuter());
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function children($selector = null) {
+ $stack = array();
+ foreach($this->stack(1) as $node) {
+// foreach($node->getElementsByTagName('*') as $newNode) {
+ foreach($node->childNodes as $newNode) {
+ if ($newNode->nodeType != 1)
+ continue;
+ if ($selector && ! $this->is($selector, $newNode))
+ continue;
+ if ($this->elementsContainsNode($newNode, $stack))
+ continue;
+ $stack[] = $newNode;
+ }
+ }
+ $this->elementsBackup = $this->elements;
+ $this->elements = $stack;
+ return $this->newInstance();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function ancestors($selector = null) {
+ return $this->children( $selector );
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function append( $content) {
+ return $this->insert($content, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function appendPHP( $content) {
+ return $this->insert("<php><!-- {$content} --></php>", 'append');
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function appendTo( $seletor) {
+ return $this->insert($seletor, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function prepend( $content) {
+ return $this->insert($content, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @todo accept many arguments, which are joined, arrays maybe also
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function prependPHP( $content) {
+ return $this->insert("<php><!-- {$content} --></php>", 'prepend');
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function prependTo( $seletor) {
+ return $this->insert($seletor, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function before($content) {
+ return $this->insert($content, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function beforePHP( $content) {
+ return $this->insert("<php><!-- {$content} --></php>", 'before');
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function insertBefore( $seletor) {
+ return $this->insert($seletor, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function after( $content) {
+ return $this->insert($content, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function afterPHP( $content) {
+ return $this->insert("<php><!-- {$content} --></php>", 'after');
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function insertAfter( $seletor) {
+ return $this->insert($seletor, __FUNCTION__);
+ }
+ /**
+ * Internal insert method. Don't use it.
+ *
+ * @param unknown_type $target
+ * @param unknown_type $type
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @access private
+ */
+ public function insert($target, $type) {
+ $this->debug("Inserting data with '{$type}'");
+ $to = false;
+ switch( $type) {
+ case 'appendTo':
+ case 'prependTo':
+ case 'insertBefore':
+ case 'insertAfter':
+ $to = true;
+ }
+ switch(gettype($target)) {
+ case 'string':
+ $insertFrom = $insertTo = array();
+ if ($to) {
+ // INSERT TO
+ $insertFrom = $this->elements;
+ if (phpQuery::isMarkup($target)) {
+ // $target is new markup, import it
+ $insertTo = $this->documentWrapper->import($target);
+ // insert into selected element
+ } else {
+ // $tagret is a selector
+ $thisStack = $this->elements;
+ $this->toRoot();
+ $insertTo = $this->find($target)->elements;
+ $this->elements = $thisStack;
+ }
+ } else {
+ // INSERT FROM
+ $insertTo = $this->elements;
+ $insertFrom = $this->documentWrapper->import($target);
+ }
+ break;
+ case 'object':
+ $insertFrom = $insertTo = array();
+ // phpQuery
+ if ($target instanceof self) {
+ if ($to) {
+ $insertTo = $target->elements;
+ if ($this->documentFragment && $this->stackIsRoot())
+ // get all body children
+// $loop = $this->find('body > *')->elements;
+ // TODO test it, test it hard...
+// $loop = $this->newInstance($this->root)->find('> *')->elements;
+ $loop = $this->root->childNodes;
+ else
+ $loop = $this->elements;
+ // import nodes if needed
+ $insertFrom = $this->getDocumentID() == $target->getDocumentID()
+ ? $loop
+ : $target->documentWrapper->import($loop);
+ } else {
+ $insertTo = $this->elements;
+ if ( $target->documentFragment && $target->stackIsRoot() )
+ // get all body children
+// $loop = $target->find('body > *')->elements;
+ $loop = $target->root->childNodes;
+ else
+ $loop = $target->elements;
+ // import nodes if needed
+ $insertFrom = $this->getDocumentID() == $target->getDocumentID()
+ ? $loop
+ : $this->documentWrapper->import($loop);
+ }
+ // DOMNODE
+ } elseif ($target instanceof DOMNODE) {
+ // import node if needed
+// if ( $target->ownerDocument != $this->DOM )
+// $target = $this->DOM->importNode($target, true);
+ if ( $to) {
+ $insertTo = array($target);
+ if ($this->documentFragment && $this->stackIsRoot())
+ // get all body children
+ $loop = $this->root->childNodes;
+// $loop = $this->find('body > *')->elements;
+ else
+ $loop = $this->elements;
+ foreach($loop as $fromNode)
+ // import nodes if needed
+ $insertFrom[] = ! $fromNode->ownerDocument->isSameNode($target->ownerDocument)
+ ? $target->ownerDocument->importNode($fromNode, true)
+ : $fromNode;
+ } else {
+ // import node if needed
+ if (! $target->ownerDocument->isSameNode($this->document))
+ $target = $this->document->importNode($target, true);
+ $insertTo = $this->elements;
+ $insertFrom[] = $target;
+ }
+ }
+ break;
+ }
+ phpQuery::debug("From ".count($insertFrom)."; To ".count($insertTo)." nodes");
+ foreach($insertTo as $insertNumber => $toNode) {
+ // we need static relative elements in some cases
+ switch( $type) {
+ case 'prependTo':
+ case 'prepend':
+ $firstChild = $toNode->firstChild;
+ break;
+ case 'insertAfter':
+ case 'after':
+ $nextSibling = $toNode->nextSibling;
+ break;
+ }
+ foreach($insertFrom as $fromNode) {
+ // clone if inserted already before
+ $insert = $insertNumber
+ ? $fromNode->cloneNode(true)
+ : $fromNode;
+ switch($type) {
+ case 'appendTo':
+ case 'append':
+// $toNode->insertBefore(
+// $fromNode,
+// $toNode->lastChild->nextSibling
+// );
+ $toNode->appendChild($insert);
+ $eventTarget = $insert;
+ break;
+ case 'prependTo':
+ case 'prepend':
+ $toNode->insertBefore(
+ $insert,
+ $firstChild
+ );
+ break;
+ case 'insertBefore':
+ case 'before':
+ if (! $toNode->parentNode)
+ throw new Exception("No parentNode, can't do {$type}()");
+ else
+ $toNode->parentNode->insertBefore(
+ $insert,
+ $toNode
+ );
+ break;
+ case 'insertAfter':
+ case 'after':
+ if (! $toNode->parentNode)
+ throw new Exception("No parentNode, can't do {$type}()");
+ else
+ $toNode->parentNode->insertBefore(
+ $insert,
+ $nextSibling
+ );
+ break;
+ }
+ // Mutation event
+ $event = new DOMEvent(array(
+ 'target' => $insert,
+ 'type' => 'DOMNodeInserted'
+ ));
+ phpQueryEvents::trigger($this->getDocumentID(),
+ $event->type, array($event), $insert
+ );
+ }
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return Int
+ */
+ public function index($subject) {
+ $index = -1;
+ $subject = $subject instanceof phpQueryObject
+ ? $subject->elements[0]
+ : $subject;
+ foreach($this->newInstance() as $k => $node) {
+ if ($node->isSameNode($subject))
+ $index = $k;
+ }
+ return $index;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param unknown_type $start
+ * @param unknown_type $end
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @testme
+ */
+ public function slice($start, $end = null) {
+// $last = count($this->elements)-1;
+// $end = $end
+// ? min($end, $last)
+// : $last;
+// if ($start < 0)
+// $start = $last+$start;
+// if ($start > $last)
+// return array();
+ if ($end > 0)
+ $end = $end-$start;
+ return $this->newInstance(
+ array_slice($this->elements, $start, $end)
+ );
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function reverse() {
+ $this->elementsBackup = $this->elements;
+ $this->elements = array_reverse($this->elements);
+ return $this->newInstance();
+ }
+ /**
+ * Return joined text content.
+ * @return String
+ */
+ public function text($text = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ if (isset($text))
+ return $this->html(htmlspecialchars($text));
+ $args = func_get_args();
+ $args = array_slice($args, 1);
+ $return = '';
+ foreach($this->elements as $node) {
+ $text = $node->textContent;
+ if (count($this->elements) > 1 && $text)
+ $text .= "\n";
+ foreach($args as $callback) {
+ $text = phpQuery::callbackRun($callback, array($text));
+ }
+ $return .= $text;
+ }
+ return $return;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function plugin($class, $file = null) {
+ phpQuery::plugin($class, $file);
+ return $this;
+ }
+ /**
+ * Deprecated, use $pq->plugin() instead.
+ *
+ * @deprecated
+ * @param $class
+ * @param $file
+ * @return unknown_type
+ */
+ public static function extend($class, $file = null) {
+ return $this->plugin($class, $file);
+ }
+ /**
+ *
+ * @access private
+ * @param $method
+ * @param $args
+ * @return unknown_type
+ */
+ public function __call($method, $args) {
+ $aliasMethods = array('clone', 'empty');
+ if (isset(phpQuery::$extendMethods[$method])) {
+ array_unshift($args, $this);
+ return phpQuery::callbackRun(
+ phpQuery::$extendMethods[$method], $args
+ );
+ } else if (isset(phpQuery::$pluginsMethods[$method])) {
+ array_unshift($args, $this);
+ $class = phpQuery::$pluginsMethods[$method];
+ $realClass = "phpQueryObjectPlugin_$class";
+ $return = call_user_func_array(
+ array($realClass, $method),
+ $args
+ );
+ // XXX deprecate ?
+ return is_null($return)
+ ? $this
+ : $return;
+ } else if (in_array($method, $aliasMethods)) {
+ return call_user_func_array(array($this, '_'.$method), $args);
+ } else
+ throw new Exception("Method '{$method}' doesnt exist");
+ }
+ /**
+ * Safe rename of next().
+ *
+ * Use it ONLY when need to call next() on an iterated object (in same time).
+ * Normaly there is no need to do such thing ;)
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @access private
+ */
+ public function _next($selector = null) {
+ return $this->newInstance(
+ $this->getElementSiblings('nextSibling', $selector, true)
+ );
+ }
+ /**
+ * Use prev() and next().
+ *
+ * @deprecated
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @access private
+ */
+ public function _prev($selector = null) {
+ return $this->prev($selector);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function prev($selector = null) {
+ return $this->newInstance(
+ $this->getElementSiblings('previousSibling', $selector, true)
+ );
+ }
+ /**
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo
+ */
+ public function prevAll($selector = null) {
+ return $this->newInstance(
+ $this->getElementSiblings('previousSibling', $selector)
+ );
+ }
+ /**
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo FIXME: returns source elements insted of next siblings
+ */
+ public function nextAll($selector = null) {
+ return $this->newInstance(
+ $this->getElementSiblings('nextSibling', $selector)
+ );
+ }
+ /**
+ * @access private
+ */
+ protected function getElementSiblings($direction, $selector = null, $limitToOne = false) {
+ $stack = array();
+ $count = 0;
+ foreach($this->stack() as $node) {
+ $test = $node;
+ while( isset($test->{$direction}) && $test->{$direction}) {
+ $test = $test->{$direction};
+ if (! $test instanceof DOMELEMENT)
+ continue;
+ $stack[] = $test;
+ if ($limitToOne)
+ break;
+ }
+ }
+ if ($selector) {
+ $stackOld = $this->elements;
+ $this->elements = $stack;
+ $stack = $this->filter($selector, true)->stack();
+ $this->elements = $stackOld;
+ }
+ return $stack;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function siblings($selector = null) {
+ $stack = array();
+ $siblings = array_merge(
+ $this->getElementSiblings('previousSibling', $selector),
+ $this->getElementSiblings('nextSibling', $selector)
+ );
+ foreach($siblings as $node) {
+ if (! $this->elementsContainsNode($node, $stack))
+ $stack[] = $node;
+ }
+ return $this->newInstance($stack);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function not($selector = null) {
+ if (is_string($selector))
+ phpQuery::debug(array('not', $selector));
+ else
+ phpQuery::debug('not');
+ $stack = array();
+ if ($selector instanceof self || $selector instanceof DOMNODE) {
+ foreach($this->stack() as $node) {
+ if ($selector instanceof self) {
+ $matchFound = false;
+ foreach($selector->stack() as $notNode) {
+ if ($notNode->isSameNode($node))
+ $matchFound = true;
+ }
+ if (! $matchFound)
+ $stack[] = $node;
+ } else if ($selector instanceof DOMNODE) {
+ if (! $selector->isSameNode($node))
+ $stack[] = $node;
+ } else {
+ if (! $this->is($selector))
+ $stack[] = $node;
+ }
+ }
+ } else {
+ $orgStack = $this->stack();
+ $matched = $this->filter($selector, true)->stack();
+// $matched = array();
+// // simulate OR in filter() instead of AND 5y
+// foreach($this->parseSelector($selector) as $s) {
+// $matched = array_merge($matched,
+// $this->filter(array($s))->stack()
+// );
+// }
+ foreach($orgStack as $node)
+ if (! $this->elementsContainsNode($node, $matched))
+ $stack[] = $node;
+ }
+ return $this->newInstance($stack);
+ }
+ /**
+ * Enter description here...
+ *
+ * @param string|phpQueryObject
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function add($selector = null) {
+ if (! $selector)
+ return $this;
+ $stack = array();
+ $this->elementsBackup = $this->elements;
+ $found = phpQuery::pq($selector, $this->getDocumentID());
+ $this->merge($found->elements);
+ return $this->newInstance();
+ }
+ /**
+ * @access private
+ */
+ protected function merge() {
+ foreach(func_get_args() as $nodes)
+ foreach($nodes as $newNode )
+ if (! $this->elementsContainsNode($newNode) )
+ $this->elements[] = $newNode;
+ }
+ /**
+ * @access private
+ * TODO refactor to stackContainsNode
+ */
+ protected function elementsContainsNode($nodeToCheck, $elementsStack = null) {
+ $loop = ! is_null($elementsStack)
+ ? $elementsStack
+ : $this->elements;
+ foreach($loop as $node) {
+ if ( $node->isSameNode( $nodeToCheck ) )
+ return true;
+ }
+ return false;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function parent($selector = null) {
+ $stack = array();
+ foreach($this->elements as $node )
+ if ( $node->parentNode && ! $this->elementsContainsNode($node->parentNode, $stack) )
+ $stack[] = $node->parentNode;
+ $this->elementsBackup = $this->elements;
+ $this->elements = $stack;
+ if ( $selector )
+ $this->filter($selector, true);
+ return $this->newInstance();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function parents($selector = null) {
+ $stack = array();
+ if (! $this->elements )
+ $this->debug('parents() - stack empty');
+ foreach($this->elements as $node) {
+ $test = $node;
+ while( $test->parentNode) {
+ $test = $test->parentNode;
+ if ($this->isRoot($test))
+ break;
+ if (! $this->elementsContainsNode($test, $stack)) {
+ $stack[] = $test;
+ continue;
+ }
+ }
+ }
+ $this->elementsBackup = $this->elements;
+ $this->elements = $stack;
+ if ( $selector )
+ $this->filter($selector, true);
+ return $this->newInstance();
+ }
+ /**
+ * Internal stack iterator.
+ *
+ * @access private
+ */
+ public function stack($nodeTypes = null) {
+ if (!isset($nodeTypes))
+ return $this->elements;
+ if (!is_array($nodeTypes))
+ $nodeTypes = array($nodeTypes);
+ $return = array();
+ foreach($this->elements as $node) {
+ if (in_array($node->nodeType, $nodeTypes))
+ $return[] = $node;
+ }
+ return $return;
+ }
+ // TODO phpdoc; $oldAttr is result of hasAttribute, before any changes
+ protected function attrEvents($attr, $oldAttr, $oldValue, $node) {
+ // skip events for XML documents
+ if (! $this->isXHTML() && ! $this->isHTML())
+ return;
+ $event = null;
+ // identify
+ $isInputValue = $node->tagName == 'input'
+ && (
+ in_array($node->getAttribute('type'),
+ array('text', 'password', 'hidden'))
+ || !$node->getAttribute('type')
+ );
+ $isRadio = $node->tagName == 'input'
+ && $node->getAttribute('type') == 'radio';
+ $isCheckbox = $node->tagName == 'input'
+ && $node->getAttribute('type') == 'checkbox';
+ $isOption = $node->tagName == 'option';
+ if ($isInputValue && $attr == 'value' && $oldValue != $node->getAttribute($attr)) {
+ $event = new DOMEvent(array(
+ 'target' => $node,
+ 'type' => 'change'
+ ));
+ } else if (($isRadio || $isCheckbox) && $attr == 'checked' && (
+ // check
+ (! $oldAttr && $node->hasAttribute($attr))
+ // un-check
+ || (! $node->hasAttribute($attr) && $oldAttr)
+ )) {
+ $event = new DOMEvent(array(
+ 'target' => $node,
+ 'type' => 'change'
+ ));
+ } else if ($isOption && $node->parentNode && $attr == 'selected' && (
+ // select
+ (! $oldAttr && $node->hasAttribute($attr))
+ // un-select
+ || (! $node->hasAttribute($attr) && $oldAttr)
+ )) {
+ $event = new DOMEvent(array(
+ 'target' => $node->parentNode,
+ 'type' => 'change'
+ ));
+ }
+ if ($event) {
+ phpQueryEvents::trigger($this->getDocumentID(),
+ $event->type, array($event), $node
+ );
+ }
+ }
+ public function attr($attr = null, $value = null) {
+ foreach($this->stack(1) as $node) {
+ if (! is_null($value)) {
+ $loop = $attr == '*'
+ ? $this->getNodeAttrs($node)
+ : array($attr);
+ foreach($loop as $a) {
+ $oldValue = $node->getAttribute($a);
+ $oldAttr = $node->hasAttribute($a);
+ // TODO raises an error when charset other than UTF-8
+ // while document's charset is also not UTF-8
+ @$node->setAttribute($a, $value);
+ $this->attrEvents($a, $oldAttr, $oldValue, $node);
+ }
+ } else if ($attr == '*') {
+ // jQuery difference
+ $return = array();
+ foreach($node->attributes as $n => $v)
+ $return[$n] = $v->value;
+ return $return;
+ } else
+ return $node->hasAttribute($attr)
+ ? $node->getAttribute($attr)
+ : null;
+ }
+ return is_null($value)
+ ? '' : $this;
+ }
+ /**
+ * @access private
+ */
+ protected function getNodeAttrs($node) {
+ $return = array();
+ foreach($node->attributes as $n => $o)
+ $return[] = $n;
+ return $return;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo check CDATA ???
+ */
+ public function attrPHP($attr, $code) {
+ if (! is_null($code)) {
+ $value = '<'.'?php '.$code.' ?'.'>';
+ // TODO tempolary solution
+ // http://code.google.com/p/phpquery/issues/detail?id=17
+// if (function_exists('mb_detect_encoding') && mb_detect_encoding($value) == 'ASCII')
+// $value = mb_convert_encoding($value, 'UTF-8', 'HTML-ENTITIES');
+ }
+ foreach($this->stack(1) as $node) {
+ if (! is_null($code)) {
+// $attrNode = $this->DOM->createAttribute($attr);
+ $node->setAttribute($attr, $value);
+// $attrNode->value = $value;
+// $node->appendChild($attrNode);
+ } else if ( $attr == '*') {
+ // jQuery diff
+ $return = array();
+ foreach($node->attributes as $n => $v)
+ $return[$n] = $v->value;
+ return $return;
+ } else
+ return $node->getAttribute($attr);
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function removeAttr($attr) {
+ foreach($this->stack(1) as $node) {
+ $loop = $attr == '*'
+ ? $this->getNodeAttrs($node)
+ : array($attr);
+ foreach($loop as $a) {
+ $oldValue = $node->getAttribute($a);
+ $node->removeAttribute($a);
+ $this->attrEvents($a, $oldValue, null, $node);
+ }
+ }
+ return $this;
+ }
+ /**
+ * Return form element value.
+ *
+ * @return String Fields value.
+ */
+ public function val($val = null) {
+ if (! isset($val)) {
+ if ($this->eq(0)->is('select')) {
+ $selected = $this->eq(0)->find('option[selected=selected]');
+ if ($selected->is('[value]'))
+ return $selected->attr('value');
+ else
+ return $selected->text();
+ } else if ($this->eq(0)->is('textarea'))
+ return $this->eq(0)->markup();
+ else
+ return $this->eq(0)->attr('value');
+ } else {
+ $_val = null;
+ foreach($this->stack(1) as $node) {
+ $node = pq($node, $this->getDocumentID());
+ if (is_array($val) && in_array($node->attr('type'), array('checkbox', 'radio'))) {
+ $isChecked = in_array($node->attr('value'), $val)
+ || in_array($node->attr('name'), $val);
+ if ($isChecked)
+ $node->attr('checked', 'checked');
+ else
+ $node->removeAttr('checked');
+ } else if ($node->get(0)->tagName == 'select') {
+ if (! isset($_val)) {
+ $_val = array();
+ if (! is_array($val))
+ $_val = array((string)$val);
+ else
+ foreach($val as $v)
+ $_val[] = $v;
+ }
+ foreach($node['option']->stack(1) as $option) {
+ $option = pq($option, $this->getDocumentID());
+ $selected = false;
+ // XXX: workaround for string comparsion, see issue #96
+ // http://code.google.com/p/phpquery/issues/detail?id=96
+ $selected = is_null($option->attr('value'))
+ ? in_array($option->markup(), $_val)
+ : in_array($option->attr('value'), $_val);
+// $optionValue = $option->attr('value');
+// $optionText = $option->text();
+// $optionTextLenght = mb_strlen($optionText);
+// foreach($_val as $v)
+// if ($optionValue == $v)
+// $selected = true;
+// else if ($optionText == $v && $optionTextLenght == mb_strlen($v))
+// $selected = true;
+ if ($selected)
+ $option->attr('selected', 'selected');
+ else
+ $option->removeAttr('selected');
+ }
+ } else if ($node->get(0)->tagName == 'textarea')
+ $node->markup($val);
+ else
+ $node->attr('value', $val);
+ }
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function andSelf() {
+ if ( $this->previous )
+ $this->elements = array_merge($this->elements, $this->previous->elements);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function addClass( $className) {
+ if (! $className)
+ return $this;
+ foreach($this->stack(1) as $node) {
+ if (! $this->is(".$className", $node))
+ $node->setAttribute(
+ 'class',
+ trim($node->getAttribute('class').' '.$className)
+ );
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function addClassPHP( $className) {
+ foreach($this->stack(1) as $node) {
+ $classes = $node->getAttribute('class');
+ $newValue = $classes
+ ? $classes.' <'.'?php '.$className.' ?'.'>'
+ : '<'.'?php '.$className.' ?'.'>';
+ $node->setAttribute('class', $newValue);
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param string $className
+ * @return bool
+ */
+ public function hasClass($className) {
+ foreach($this->stack(1) as $node) {
+ if ( $this->is(".$className", $node))
+ return true;
+ }
+ return false;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function removeClass($className) {
+ foreach($this->stack(1) as $node) {
+ $classes = explode( ' ', $node->getAttribute('class'));
+ if ( in_array($className, $classes)) {
+ $classes = array_diff($classes, array($className));
+ if ( $classes )
+ $node->setAttribute('class', implode(' ', $classes));
+ else
+ $node->removeAttribute('class');
+ }
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function toggleClass($className) {
+ foreach($this->stack(1) as $node) {
+ if ( $this->is( $node, '.'.$className ))
+ $this->removeClass($className);
+ else
+ $this->addClass($className);
+ }
+ return $this;
+ }
+ /**
+ * Proper name without underscore (just ->empty()) also works.
+ *
+ * Removes all child nodes from the set of matched elements.
+ *
+ * Example:
+ * pq("p")._empty()
+ *
+ * HTML:
+ * <p>Hello, <span>Person</span> <a href="#">and person</a></p>
+ *
+ * Result:
+ * [ <p></p> ]
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @access private
+ */
+ public function _empty() {
+ foreach($this->stack(1) as $node) {
+ // thx to 'dave at dgx dot cz'
+ $node->nodeValue = '';
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param array|string $callback Expects $node as first param, $index as second
+ * @param array $scope External variables passed to callback. Use compact('varName1', 'varName2'...) and extract($scope)
+ * @param array $arg1 Will ba passed as third and futher args to callback.
+ * @param array $arg2 Will ba passed as fourth and futher args to callback, and so on...
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function each($callback, $param1 = null, $param2 = null, $param3 = null) {
+ $paramStructure = null;
+ if (func_num_args() > 1) {
+ $paramStructure = func_get_args();
+ $paramStructure = array_slice($paramStructure, 1);
+ }
+ foreach($this->elements as $v)
+ phpQuery::callbackRun($callback, array($v), $paramStructure);
+ return $this;
+ }
+ /**
+ * Run callback on actual object.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function callback($callback, $param1 = null, $param2 = null, $param3 = null) {
+ $params = func_get_args();
+ $params[0] = $this;
+ phpQuery::callbackRun($callback, $params);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo add $scope and $args as in each() ???
+ */
+ public function map($callback, $param1 = null, $param2 = null, $param3 = null) {
+// $stack = array();
+//// foreach($this->newInstance() as $node) {
+// foreach($this->newInstance() as $node) {
+// $result = call_user_func($callback, $node);
+// if ($result)
+// $stack[] = $result;
+// }
+ $params = func_get_args();
+ array_unshift($params, $this->elements);
+ return $this->newInstance(
+ call_user_func_array(array('phpQuery', 'map'), $params)
+// phpQuery::map($this->elements, $callback)
+ );
+ }
+ /**
+ * Enter description here...
+ *
+ * @param <type> $key
+ * @param <type> $value
+ */
+ public function data($key, $value = null) {
+ if (! isset($value)) {
+ // TODO? implement specific jQuery behavior od returning parent values
+ // is child which we look up doesn't exist
+ return phpQuery::data($this->get(0), $key, $value, $this->getDocumentID());
+ } else {
+ foreach($this as $node)
+ phpQuery::data($node, $key, $value, $this->getDocumentID());
+ return $this;
+ }
+ }
+ /**
+ * Enter description here...
+ *
+ * @param <type> $key
+ */
+ public function removeData($key) {
+ foreach($this as $node)
+ phpQuery::removeData($node, $key, $this->getDocumentID());
+ return $this;
+ }
+ // INTERFACE IMPLEMENTATIONS
+
+ // ITERATOR INTERFACE
+ /**
+ * @access private
+ */
+ public function rewind(){
+ $this->debug('iterating foreach');
+// phpQuery::selectDocument($this->getDocumentID());
+ $this->elementsBackup = $this->elements;
+ $this->elementsInterator = $this->elements;
+ $this->valid = isset( $this->elements[0] )
+ ? 1 : 0;
+// $this->elements = $this->valid
+// ? array($this->elements[0])
+// : array();
+ $this->current = 0;
+ }
+ /**
+ * @access private
+ */
+ public function current(){
+ return $this->elementsInterator[ $this->current ];
+ }
+ /**
+ * @access private
+ */
+ public function key(){
+ return $this->current;
+ }
+ /**
+ * Double-function method.
+ *
+ * First: main iterator interface method.
+ * Second: Returning next sibling, alias for _next().
+ *
+ * Proper functionality is choosed automagicaly.
+ *
+ * @see phpQueryObject::_next()
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function next($cssSelector = null){
+// if ($cssSelector || $this->valid)
+// return $this->_next($cssSelector);
+ $this->valid = isset( $this->elementsInterator[ $this->current+1 ] )
+ ? true
+ : false;
+ if (! $this->valid && $this->elementsInterator) {
+ $this->elementsInterator = null;
+ } else if ($this->valid) {
+ $this->current++;
+ } else {
+ return $this->_next($cssSelector);
+ }
+ }
+ /**
+ * @access private
+ */
+ public function valid(){
+ return $this->valid;
+ }
+ // ITERATOR INTERFACE END
+ // ARRAYACCESS INTERFACE
+ /**
+ * @access private
+ */
+ public function offsetExists($offset) {
+ return $this->find($offset)->size() > 0;
+ }
+ /**
+ * @access private
+ */
+ public function offsetGet($offset) {
+ return $this->find($offset);
+ }
+ /**
+ * @access private
+ */
+ public function offsetSet($offset, $value) {
+// $this->find($offset)->replaceWith($value);
+ $this->find($offset)->html($value);
+ }
+ /**
+ * @access private
+ */
+ public function offsetUnset($offset) {
+ // empty
+ throw new Exception("Can't do unset, use array interface only for calling queries and replacing HTML.");
+ }
+ // ARRAYACCESS INTERFACE END
+ /**
+ * Returns node's XPath.
+ *
+ * @param unknown_type $oneNode
+ * @return string
+ * @TODO use native getNodePath is avaible
+ * @access private
+ */
+ protected function getNodeXpath($oneNode = null, $namespace = null) {
+ $return = array();
+ $loop = $oneNode
+ ? array($oneNode)
+ : $this->elements;
+// if ($namespace)
+// $namespace .= ':';
+ foreach($loop as $node) {
+ if ($node instanceof DOMDOCUMENT) {
+ $return[] = '';
+ continue;
+ }
+ $xpath = array();
+ while(! ($node instanceof DOMDOCUMENT)) {
+ $i = 1;
+ $sibling = $node;
+ while($sibling->previousSibling) {
+ $sibling = $sibling->previousSibling;
+ $isElement = $sibling instanceof DOMELEMENT;
+ if ($isElement && $sibling->tagName == $node->tagName)
+ $i++;
+ }
+ $xpath[] = $this->isXML()
+ ? "*[local-name()='{$node->tagName}'][{$i}]"
+ : "{$node->tagName}[{$i}]";
+ $node = $node->parentNode;
+ }
+ $xpath = join('/', array_reverse($xpath));
+ $return[] = '/'.$xpath;
+ }
+ return $oneNode
+ ? $return[0]
+ : $return;
+ }
+ // HELPERS
+ public function whois($oneNode = null) {
+ $return = array();
+ $loop = $oneNode
+ ? array( $oneNode )
+ : $this->elements;
+ foreach($loop as $node) {
+ if (isset($node->tagName)) {
+ $tag = in_array($node->tagName, array('php', 'js'))
+ ? strtoupper($node->tagName)
+ : $node->tagName;
+ $return[] = $tag
+ .($node->getAttribute('id')
+ ? '#'.$node->getAttribute('id'):'')
+ .($node->getAttribute('class')
+ ? '.'.join('.', explode(' ', $node->getAttribute('class'))):'')
+ .($node->getAttribute('name')
+ ? '[name="'.$node->getAttribute('name').'"]':'')
+ .($node->getAttribute('value') && strpos($node->getAttribute('value'), '<'.'?php') === false
+ ? '[value="'.substr(str_replace("\n", '', $node->getAttribute('value')), 0, 15).'"]':'')
+ .($node->getAttribute('value') && strpos($node->getAttribute('value'), '<'.'?php') !== false
+ ? '[value=PHP]':'')
+ .($node->getAttribute('selected')
+ ? '[selected]':'')
+ .($node->getAttribute('checked')
+ ? '[checked]':'')
+ ;
+ } else if ($node instanceof DOMTEXT) {
+ if (trim($node->textContent))
+ $return[] = 'Text:'.substr(str_replace("\n", ' ', $node->textContent), 0, 15);
+ } else {
+
+ }
+ }
+ return $oneNode && isset($return[0])
+ ? $return[0]
+ : $return;
+ }
+ /**
+ * Dump htmlOuter and preserve chain. Usefull for debugging.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ *
+ */
+ public function dump() {
+ print 'DUMP #'.(phpQuery::$dumpCount++).' ';
+ $debug = phpQuery::$debug;
+ phpQuery::$debug = false;
+// print __FILE__.':'.__LINE__."\n";
+ var_dump($this->htmlOuter());
+ return $this;
+ }
+ public function dumpWhois() {
+ print 'DUMP #'.(phpQuery::$dumpCount++).' ';
+ $debug = phpQuery::$debug;
+ phpQuery::$debug = false;
+// print __FILE__.':'.__LINE__."\n";
+ var_dump('whois', $this->whois());
+ phpQuery::$debug = $debug;
+ return $this;
+ }
+ public function dumpLength() {
+ print 'DUMP #'.(phpQuery::$dumpCount++).' ';
+ $debug = phpQuery::$debug;
+ phpQuery::$debug = false;
+// print __FILE__.':'.__LINE__."\n";
+ var_dump('length', $this->length());
+ phpQuery::$debug = $debug;
+ return $this;
+ }
+ public function dumpTree($html = true, $title = true) {
+ $output = $title
+ ? 'DUMP #'.(phpQuery::$dumpCount++)." \n" : '';
+ $debug = phpQuery::$debug;
+ phpQuery::$debug = false;
+ foreach($this->stack() as $node)
+ $output .= $this->__dumpTree($node);
+ phpQuery::$debug = $debug;
+ print $html
+ ? nl2br(str_replace(' ', '&nbsp;', $output))
+ : $output;
+ return $this;
+ }
+ private function __dumpTree($node, $intend = 0) {
+ $whois = $this->whois($node);
+ $return = '';
+ if ($whois)
+ $return .= str_repeat(' - ', $intend).$whois."\n";
+ if (isset($node->childNodes))
+ foreach($node->childNodes as $chNode)
+ $return .= $this->__dumpTree($chNode, $intend+1);
+ return $return;
+ }
+ /**
+ * Dump htmlOuter and stop script execution. Usefull for debugging.
+ *
+ */
+ public function dumpDie() {
+ print __FILE__.':'.__LINE__;
+ var_dump($this->htmlOuter());
+ die();
+ }
+}
+
+
+// -- Multibyte Compatibility functions ---------------------------------------
+// http://svn.iphonewebdev.com/lace/lib/mb_compat.php
+
+/**
+ * mb_internal_encoding()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_internal_encoding'))
+{
+ function mb_internal_encoding($enc) {return true; }
+}
+
+/**
+ * mb_regex_encoding()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_regex_encoding'))
+{
+ function mb_regex_encoding($enc) {return true; }
+}
+
+/**
+ * mb_strlen()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_strlen'))
+{
+ function mb_strlen($str)
+ {
+ return strlen($str);
+ }
+}
+
+/**
+ * mb_strpos()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_strpos'))
+{
+ function mb_strpos($haystack, $needle, $offset=0)
+ {
+ return strpos($haystack, $needle, $offset);
+ }
+}
+/**
+ * mb_stripos()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_stripos'))
+{
+ function mb_stripos($haystack, $needle, $offset=0)
+ {
+ return stripos($haystack, $needle, $offset);
+ }
+}
+
+/**
+ * mb_substr()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_substr'))
+{
+ function mb_substr($str, $start, $length=0)
+ {
+ return substr($str, $start, $length);
+ }
+}
+
+/**
+ * mb_substr_count()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_substr_count'))
+{
+ function mb_substr_count($haystack, $needle)
+ {
+ return substr_count($haystack, $needle);
+ }
+}
+
+
+/**
+ * Static namespace for phpQuery functions.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ */
+abstract class phpQuery {
+ /**
+ * XXX: Workaround for mbstring problems
+ *
+ * @var bool
+ */
+ public static $mbstringSupport = true;
+ public static $debug = false;
+ public static $documents = array();
+ public static $defaultDocumentID = null;
+// public static $defaultDoctype = 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"';
+ /**
+ * Applies only to HTML.
+ *
+ * @var unknown_type
+ */
+ public static $defaultDoctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">';
+ public static $defaultCharset = 'UTF-8';
+ /**
+ * Static namespace for plugins.
+ *
+ * @var object
+ */
+ public static $plugins = array();
+ /**
+ * List of loaded plugins.
+ *
+ * @var unknown_type
+ */
+ public static $pluginsLoaded = array();
+ public static $pluginsMethods = array();
+ public static $pluginsStaticMethods = array();
+ public static $extendMethods = array();
+ /**
+ * @TODO implement
+ */
+ public static $extendStaticMethods = array();
+ /**
+ * Hosts allowed for AJAX connections.
+ * Dot '.' means $_SERVER['HTTP_HOST'] (if any).
+ *
+ * @var array
+ */
+ public static $ajaxAllowedHosts = array(
+ '.'
+ );
+ /**
+ * AJAX settings.
+ *
+ * @var array
+ * XXX should it be static or not ?
+ */
+ public static $ajaxSettings = array(
+ 'url' => '',//TODO
+ 'global' => true,
+ 'type' => "GET",
+ 'timeout' => null,
+ 'contentType' => "application/x-www-form-urlencoded",
+ 'processData' => true,
+// 'async' => true,
+ 'data' => null,
+ 'username' => null,
+ 'password' => null,
+ 'accepts' => array(
+ 'xml' => "application/xml, text/xml",
+ 'html' => "text/html",
+ 'script' => "text/javascript, application/javascript",
+ 'json' => "application/json, text/javascript",
+ 'text' => "text/plain",
+ '_default' => "*/*"
+ )
+ );
+ public static $lastModified = null;
+ public static $active = 0;
+ public static $dumpCount = 0;
+ /**
+ * Multi-purpose function.
+ * Use pq() as shortcut.
+ *
+ * In below examples, $pq is any result of pq(); function.
+ *
+ * 1. Import markup into existing document (without any attaching):
+ * - Import into selected document:
+ * pq('<div/>') // DOESNT accept text nodes at beginning of input string !
+ * - Import into document with ID from $pq->getDocumentID():
+ * pq('<div/>', $pq->getDocumentID())
+ * - Import into same document as DOMNode belongs to:
+ * pq('<div/>', DOMNode)
+ * - Import into document from phpQuery object:
+ * pq('<div/>', $pq)
+ *
+ * 2. Run query:
+ * - Run query on last selected document:
+ * pq('div.myClass')
+ * - Run query on document with ID from $pq->getDocumentID():
+ * pq('div.myClass', $pq->getDocumentID())
+ * - Run query on same document as DOMNode belongs to and use node(s)as root for query:
+ * pq('div.myClass', DOMNode)
+ * - Run query on document from phpQuery object
+ * and use object's stack as root node(s) for query:
+ * pq('div.myClass', $pq)
+ *
+ * @param string|DOMNode|DOMNodeList|array $arg1 HTML markup, CSS Selector, DOMNode or array of DOMNodes
+ * @param string|phpQueryObject|DOMNode $context DOM ID from $pq->getDocumentID(), phpQuery object (determines also query root) or DOMNode (determines also query root)
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery|QueryTemplatesPhpQuery|false
+ * phpQuery object or false in case of error.
+ */
+ public static function pq($arg1, $context = null) {
+ if ($arg1 instanceof DOMNODE && ! isset($context)) {
+ foreach(phpQuery::$documents as $documentWrapper) {
+ $compare = $arg1 instanceof DOMDocument
+ ? $arg1 : $arg1->ownerDocument;
+ if ($documentWrapper->document->isSameNode($compare))
+ $context = $documentWrapper->id;
+ }
+ }
+ if (! $context) {
+ $domId = self::$defaultDocumentID;
+ if (! $domId)
+ throw new Exception("Can't use last created DOM, because there isn't any. Use phpQuery::newDocument() first.");
+// } else if (is_object($context) && ($context instanceof PHPQUERY || is_subclass_of($context, 'phpQueryObject')))
+ } else if (is_object($context) && $context instanceof phpQueryObject)
+ $domId = $context->getDocumentID();
+ else if ($context instanceof DOMDOCUMENT) {
+ $domId = self::getDocumentID($context);
+ if (! $domId) {
+ //throw new Exception('Orphaned DOMDocument');
+ $domId = self::newDocument($context)->getDocumentID();
+ }
+ } else if ($context instanceof DOMNODE) {
+ $domId = self::getDocumentID($context);
+ if (! $domId) {
+ throw new Exception('Orphaned DOMNode');
+// $domId = self::newDocument($context->ownerDocument);
+ }
+ } else
+ $domId = $context;
+ if ($arg1 instanceof phpQueryObject) {
+// if (is_object($arg1) && (get_class($arg1) == 'phpQueryObject' || $arg1 instanceof PHPQUERY || is_subclass_of($arg1, 'phpQueryObject'))) {
+ /**
+ * Return $arg1 or import $arg1 stack if document differs:
+ * pq(pq('<div/>'))
+ */
+ if ($arg1->getDocumentID() == $domId)
+ return $arg1;
+ $class = get_class($arg1);
+ // support inheritance by passing old object to overloaded constructor
+ $phpQuery = $class != 'phpQuery'
+ ? new $class($arg1, $domId)
+ : new phpQueryObject($domId);
+ $phpQuery->elements = array();
+ foreach($arg1->elements as $node)
+ $phpQuery->elements[] = $phpQuery->document->importNode($node, true);
+ return $phpQuery;
+ } else if ($arg1 instanceof DOMNODE || (is_array($arg1) && isset($arg1[0]) && $arg1[0] instanceof DOMNODE)) {
+ /*
+ * Wrap DOM nodes with phpQuery object, import into document when needed:
+ * pq(array($domNode1, $domNode2))
+ */
+ $phpQuery = new phpQueryObject($domId);
+ if (!($arg1 instanceof DOMNODELIST) && ! is_array($arg1))
+ $arg1 = array($arg1);
+ $phpQuery->elements = array();
+ foreach($arg1 as $node) {
+ $sameDocument = $node->ownerDocument instanceof DOMDOCUMENT
+ && ! $node->ownerDocument->isSameNode($phpQuery->document);
+ $phpQuery->elements[] = $sameDocument
+ ? $phpQuery->document->importNode($node, true)
+ : $node;
+ }
+ return $phpQuery;
+ } else if (self::isMarkup($arg1)) {
+ /**
+ * Import HTML:
+ * pq('<div/>')
+ */
+ $phpQuery = new phpQueryObject($domId);
+ return $phpQuery->newInstance(
+ $phpQuery->documentWrapper->import($arg1)
+ );
+ } else {
+ /**
+ * Run CSS query:
+ * pq('div.myClass')
+ */
+ $phpQuery = new phpQueryObject($domId);
+// if ($context && ($context instanceof PHPQUERY || is_subclass_of($context, 'phpQueryObject')))
+ if ($context && $context instanceof phpQueryObject)
+ $phpQuery->elements = $context->elements;
+ else if ($context && $context instanceof DOMNODELIST) {
+ $phpQuery->elements = array();
+ foreach($context as $node)
+ $phpQuery->elements[] = $node;
+ } else if ($context && $context instanceof DOMNODE)
+ $phpQuery->elements = array($context);
+ return $phpQuery->find($arg1);
+ }
+ }
+ /**
+ * Sets default document to $id. Document has to be loaded prior
+ * to using this method.
+ * $id can be retrived via getDocumentID() or getDocumentIDRef().
+ *
+ * @param unknown_type $id
+ */
+ public static function selectDocument($id) {
+ $id = self::getDocumentID($id);
+ self::debug("Selecting document '$id' as default one");
+ self::$defaultDocumentID = self::getDocumentID($id);
+ }
+ /**
+ * Returns document with id $id or last used as phpQueryObject.
+ * $id can be retrived via getDocumentID() or getDocumentIDRef().
+ * Chainable.
+ *
+ * @see phpQuery::selectDocument()
+ * @param unknown_type $id
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function getDocument($id = null) {
+ if ($id)
+ phpQuery::selectDocument($id);
+ else
+ $id = phpQuery::$defaultDocumentID;
+ return new phpQueryObject($id);
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocument($markup = null, $contentType = null) {
+ if (! $markup)
+ $markup = '';
+ $documentID = phpQuery::createDocumentWrapper($markup, $contentType);
+ return new phpQueryObject($documentID);
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentHTML($markup = null, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocument($markup, "text/html{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentXML($markup = null, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocument($markup, "text/xml{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentXHTML($markup = null, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocument($markup, "application/xhtml+xml{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentPHP($markup = null, $contentType = "text/html") {
+ // TODO pass charset to phpToMarkup if possible (use DOMDocumentWrapper function)
+ $markup = phpQuery::phpToMarkup($markup, self::$defaultCharset);
+ return self::newDocument($markup, $contentType);
+ }
+ public static function phpToMarkup($php, $charset = 'utf-8') {
+ $regexes = array(
+ '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(\')([^\']*)<'.'?php?(.*?)(?:\\?>)([^\']*)\'@s',
+ '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(")([^"]*)<'.'?php?(.*?)(?:\\?>)([^"]*)"@s',
+ );
+ foreach($regexes as $regex)
+ while (preg_match($regex, $php, $matches)) {
+ $php = preg_replace_callback(
+ $regex,
+// create_function('$m, $charset = "'.$charset.'"',
+// 'return $m[1].$m[2]
+// .htmlspecialchars("<"."?php".$m[4]."?".">", ENT_QUOTES|ENT_NOQUOTES, $charset)
+// .$m[5].$m[2];'
+// ),
+ array('phpQuery', '_phpToMarkupCallback'),
+ $php
+ );
+ }
+ $regex = '@(^|>[^<]*)+?(<\?php(.*?)(\?>))@s';
+//preg_match_all($regex, $php, $matches);
+//var_dump($matches);
+ $php = preg_replace($regex, '\\1<php><!-- \\3 --></php>', $php);
+ return $php;
+ }
+ public static function _phpToMarkupCallback($php, $charset = 'utf-8') {
+ return $m[1].$m[2]
+ .htmlspecialchars("<"."?php".$m[4]."?".">", ENT_QUOTES|ENT_NOQUOTES, $charset)
+ .$m[5].$m[2];
+ }
+ public static function _markupToPHPCallback($m) {
+ return "<"."?php ".htmlspecialchars_decode($m[1])." ?".">";
+ }
+ /**
+ * Converts document markup containing PHP code generated by phpQuery::php()
+ * into valid (executable) PHP code syntax.
+ *
+ * @param string|phpQueryObject $content
+ * @return string PHP code.
+ */
+ public static function markupToPHP($content) {
+ if ($content instanceof phpQueryObject)
+ $content = $content->markupOuter();
+ /* <php>...</php> to <?php...? > */
+ $content = preg_replace_callback(
+ '@<php>\s*<!--(.*?)-->\s*</php>@s',
+// create_function('$m',
+// 'return "<'.'?php ".htmlspecialchars_decode($m[1])." ?'.'>";'
+// ),
+ array('phpQuery', '_markupToPHPCallback'),
+ $content
+ );
+ /* <node attr='< ?php ? >'> extra space added to save highlighters */
+ $regexes = array(
+ '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(\')([^\']*)(?:&lt;|%3C)\\?(?:php)?(.*?)(?:\\?(?:&gt;|%3E))([^\']*)\'@s',
+ '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(")([^"]*)(?:&lt;|%3C)\\?(?:php)?(.*?)(?:\\?(?:&gt;|%3E))([^"]*)"@s',
+ );
+ foreach($regexes as $regex)
+ while (preg_match($regex, $content))
+ $content = preg_replace_callback(
+ $regex,
+ create_function('$m',
+ 'return $m[1].$m[2].$m[3]."<?php "
+ .str_replace(
+ array("%20", "%3E", "%09", "&#10;", "&#9;", "%7B", "%24", "%7D", "%22", "%5B", "%5D"),
+ array(" ", ">", " ", "\n", " ", "{", "$", "}", \'"\', "[", "]"),
+ htmlspecialchars_decode($m[4])
+ )
+ ." ?>".$m[5].$m[2];'
+ ),
+ $content
+ );
+ return $content;
+ }
+ /**
+ * Creates new document from file $file.
+ * Chainable.
+ *
+ * @param string $file URLs allowed. See File wrapper page at php.net for more supported sources.
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentFile($file, $contentType = null) {
+ $documentID = self::createDocumentWrapper(
+ file_get_contents($file), $contentType
+ );
+ return new phpQueryObject($documentID);
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentFileHTML($file, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocumentFile($file, "text/html{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentFileXML($file, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocumentFile($file, "text/xml{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentFileXHTML($file, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocumentFile($file, "application/xhtml+xml{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentFilePHP($file, $contentType = null) {
+ return self::newDocumentPHP(file_get_contents($file), $contentType);
+ }
+ /**
+ * Reuses existing DOMDocument object.
+ * Chainable.
+ *
+ * @param $document DOMDocument
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @TODO support DOMDocument
+ */
+ public static function loadDocument($document) {
+ // TODO
+ die('TODO loadDocument');
+ }
+ /**
+ * Enter description here...
+ *
+ * @param unknown_type $html
+ * @param unknown_type $domId
+ * @return unknown New DOM ID
+ * @todo support PHP tags in input
+ * @todo support passing DOMDocument object from self::loadDocument
+ */
+ protected static function createDocumentWrapper($html, $contentType = null, $documentID = null) {
+ if (function_exists('domxml_open_mem'))
+ throw new Exception("Old PHP4 DOM XML extension detected. phpQuery won't work until this extension is enabled.");
+// $id = $documentID
+// ? $documentID
+// : md5(microtime());
+ $document = null;
+ if ($html instanceof DOMDOCUMENT) {
+ if (self::getDocumentID($html)) {
+ // document already exists in phpQuery::$documents, make a copy
+ $document = clone $html;
+ } else {
+ // new document, add it to phpQuery::$documents
+ $wrapper = new DOMDocumentWrapper($html, $contentType, $documentID);
+ }
+ } else {
+ $wrapper = new DOMDocumentWrapper($html, $contentType, $documentID);
+ }
+// $wrapper->id = $id;
+ // bind document
+ phpQuery::$documents[$wrapper->id] = $wrapper;
+ // remember last loaded document
+ phpQuery::selectDocument($wrapper->id);
+ return $wrapper->id;
+ }
+ /**
+ * Extend class namespace.
+ *
+ * @param string|array $target
+ * @param array $source
+ * @TODO support string $source
+ * @return unknown_type
+ */
+ public static function extend($target, $source) {
+ switch($target) {
+ case 'phpQueryObject':
+ $targetRef = &self::$extendMethods;
+ $targetRef2 = &self::$pluginsMethods;
+ break;
+ case 'phpQuery':
+ $targetRef = &self::$extendStaticMethods;
+ $targetRef2 = &self::$pluginsStaticMethods;
+ break;
+ default:
+ throw new Exception("Unsupported \$target type");
+ }
+ if (is_string($source))
+ $source = array($source => $source);
+ foreach($source as $method => $callback) {
+ if (isset($targetRef[$method])) {
+// throw new Exception
+ self::debug("Duplicate method '{$method}', can\'t extend '{$target}'");
+ continue;
+ }
+ if (isset($targetRef2[$method])) {
+// throw new Exception
+ self::debug("Duplicate method '{$method}' from plugin '{$targetRef2[$method]}',"
+ ." can\'t extend '{$target}'");
+ continue;
+ }
+ $targetRef[$method] = $callback;
+ }
+ return true;
+ }
+ /**
+ * Extend phpQuery with $class from $file.
+ *
+ * @param string $class Extending class name. Real class name can be prepended phpQuery_.
+ * @param string $file Filename to include. Defaults to "{$class}.php".
+ */
+ public static function plugin($class, $file = null) {
+ // TODO $class checked agains phpQuery_$class
+// if (strpos($class, 'phpQuery') === 0)
+// $class = substr($class, 8);
+ if (in_array($class, self::$pluginsLoaded))
+ return true;
+ if (! $file)
+ $file = $class.'.php';
+ $objectClassExists = class_exists('phpQueryObjectPlugin_'.$class);
+ $staticClassExists = class_exists('phpQueryPlugin_'.$class);
+ if (! $objectClassExists && ! $staticClassExists)
+ require_once($file);
+ self::$pluginsLoaded[] = $class;
+ // static methods
+ if (class_exists('phpQueryPlugin_'.$class)) {
+ $realClass = 'phpQueryPlugin_'.$class;
+ $vars = get_class_vars($realClass);
+ $loop = isset($vars['phpQueryMethods'])
+ && ! is_null($vars['phpQueryMethods'])
+ ? $vars['phpQueryMethods']
+ : get_class_methods($realClass);
+ foreach($loop as $method) {
+ if ($method == '__initialize')
+ continue;
+ if (! is_callable(array($realClass, $method)))
+ continue;
+ if (isset(self::$pluginsStaticMethods[$method])) {
+ throw new Exception("Duplicate method '{$method}' from plugin '{$c}' conflicts with same method from plugin '".self::$pluginsStaticMethods[$method]."'");
+ return;
+ }
+ self::$pluginsStaticMethods[$method] = $class;
+ }
+ if (method_exists($realClass, '__initialize'))
+ call_user_func_array(array($realClass, '__initialize'), array());
+ }
+ // object methods
+ if (class_exists('phpQueryObjectPlugin_'.$class)) {
+ $realClass = 'phpQueryObjectPlugin_'.$class;
+ $vars = get_class_vars($realClass);
+ $loop = isset($vars['phpQueryMethods'])
+ && ! is_null($vars['phpQueryMethods'])
+ ? $vars['phpQueryMethods']
+ : get_class_methods($realClass);
+ foreach($loop as $method) {
+ if (! is_callable(array($realClass, $method)))
+ continue;
+ if (isset(self::$pluginsMethods[$method])) {
+ throw new Exception("Duplicate method '{$method}' from plugin '{$c}' conflicts with same method from plugin '".self::$pluginsMethods[$method]."'");
+ continue;
+ }
+ self::$pluginsMethods[$method] = $class;
+ }
+ }
+ return true;
+ }
+ /**
+ * Unloades all or specified document from memory.
+ *
+ * @param mixed $documentID @see phpQuery::getDocumentID() for supported types.
+ */
+ public static function unloadDocuments($id = null) {
+ if (isset($id)) {
+ if ($id = self::getDocumentID($id))
+ unset(phpQuery::$documents[$id]);
+ } else {
+ foreach(phpQuery::$documents as $k => $v) {
+ unset(phpQuery::$documents[$k]);
+ }
+ }
+ }
+ /**
+ * Parses phpQuery object or HTML result against PHP tags and makes them active.
+ *
+ * @param phpQuery|string $content
+ * @deprecated
+ * @return string
+ */
+ public static function unsafePHPTags($content) {
+ return self::markupToPHP($content);
+ }
+ public static function DOMNodeListToArray($DOMNodeList) {
+ $array = array();
+ if (! $DOMNodeList)
+ return $array;
+ foreach($DOMNodeList as $node)
+ $array[] = $node;
+ return $array;
+ }
+ /**
+ * Checks if $input is HTML string, which has to start with '<'.
+ *
+ * @deprecated
+ * @param String $input
+ * @return Bool
+ * @todo still used ?
+ */
+ public static function isMarkup($input) {
+ return ! is_array($input) && substr(trim($input), 0, 1) == '<';
+ }
+ public static function debug($text) {
+ if (self::$debug)
+ print var_dump($text);
+ }
+ /**
+ * Make an AJAX request.
+ *
+ * @param array See $options http://docs.jquery.com/Ajax/jQuery.ajax#toptions
+ * Additional options are:
+ * 'document' - document for global events, @see phpQuery::getDocumentID()
+ * 'referer' - implemented
+ * 'requested_with' - TODO; not implemented (X-Requested-With)
+ * @return Zend_Http_Client
+ * @link http://docs.jquery.com/Ajax/jQuery.ajax
+ *
+ * @TODO $options['cache']
+ * @TODO $options['processData']
+ * @TODO $options['xhr']
+ * @TODO $options['data'] as string
+ * @TODO XHR interface
+ */
+ public static function ajax($options = array(), $xhr = null) {
+ $options = array_merge(
+ self::$ajaxSettings, $options
+ );
+ $documentID = isset($options['document'])
+ ? self::getDocumentID($options['document'])
+ : null;
+ if ($xhr) {
+ // reuse existing XHR object, but clean it up
+ $client = $xhr;
+// $client->setParameterPost(null);
+// $client->setParameterGet(null);
+ $client->setAuth(false);
+ $client->setHeaders("If-Modified-Since", null);
+ $client->setHeaders("Referer", null);
+ $client->resetParameters();
+ } else {
+ // create new XHR object
+ require_once('Zend/Http/Client.php');
+ $client = new Zend_Http_Client();
+ $client->setCookieJar();
+ }
+ if (isset($options['timeout']))
+ $client->setConfig(array(
+ 'timeout' => $options['timeout'],
+ ));
+// 'maxredirects' => 0,
+ foreach(self::$ajaxAllowedHosts as $k => $host)
+ if ($host == '.' && isset($_SERVER['HTTP_HOST']))
+ self::$ajaxAllowedHosts[$k] = $_SERVER['HTTP_HOST'];
+ $host = parse_url($options['url'], PHP_URL_HOST);
+ if (! in_array($host, self::$ajaxAllowedHosts)) {
+ throw new Exception("Request not permitted, host '$host' not present in "
+ ."phpQuery::\$ajaxAllowedHosts");
+ }
+ // JSONP
+ $jsre = "/=\\?(&|$)/";
+ if (isset($options['dataType']) && $options['dataType'] == 'jsonp') {
+ $jsonpCallbackParam = $options['jsonp']
+ ? $options['jsonp'] : 'callback';
+ if (strtolower($options['type']) == 'get') {
+ if (! preg_match($jsre, $options['url'])) {
+ $sep = strpos($options['url'], '?')
+ ? '&' : '?';
+ $options['url'] .= "$sep$jsonpCallbackParam=?";
+ }
+ } else if ($options['data']) {
+ $jsonp = false;
+ foreach($options['data'] as $n => $v) {
+ if ($v == '?')
+ $jsonp = true;
+ }
+ if (! $jsonp) {
+ $options['data'][$jsonpCallbackParam] = '?';
+ }
+ }
+ $options['dataType'] = 'json';
+ }
+ if (isset($options['dataType']) && $options['dataType'] == 'json') {
+ $jsonpCallback = 'json_'.md5(microtime());
+ $jsonpData = $jsonpUrl = false;
+ if ($options['data']) {
+ foreach($options['data'] as $n => $v) {
+ if ($v == '?')
+ $jsonpData = $n;
+ }
+ }
+ if (preg_match($jsre, $options['url']))
+ $jsonpUrl = true;
+ if ($jsonpData !== false || $jsonpUrl) {
+ // remember callback name for httpData()
+ $options['_jsonp'] = $jsonpCallback;
+ if ($jsonpData !== false)
+ $options['data'][$jsonpData] = $jsonpCallback;
+ if ($jsonpUrl)
+ $options['url'] = preg_replace($jsre, "=$jsonpCallback\\1", $options['url']);
+ }
+ }
+ $client->setUri($options['url']);
+ $client->setMethod(strtoupper($options['type']));
+ if (isset($options['referer']) && $options['referer'])
+ $client->setHeaders('Referer', $options['referer']);
+ $client->setHeaders(array(
+// 'content-type' => $options['contentType'],
+ 'User-Agent' => 'Mozilla/5.0 (X11; U; Linux x86; en-US; rv:1.9.0.5) Gecko'
+ .'/2008122010 Firefox/3.0.5',
+ // TODO custom charset
+ 'Accept-Charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
+// 'Connection' => 'keep-alive',
+// 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'Accept-Language' => 'en-us,en;q=0.5',
+ ));
+ if ($options['username'])
+ $client->setAuth($options['username'], $options['password']);
+ if (isset($options['ifModified']) && $options['ifModified'])
+ $client->setHeaders("If-Modified-Since",
+ self::$lastModified
+ ? self::$lastModified
+ : "Thu, 01 Jan 1970 00:00:00 GMT"
+ );
+ $client->setHeaders("Accept",
+ isset($options['dataType'])
+ && isset(self::$ajaxSettings['accepts'][ $options['dataType'] ])
+ ? self::$ajaxSettings['accepts'][ $options['dataType'] ].", */*"
+ : self::$ajaxSettings['accepts']['_default']
+ );
+ // TODO $options['processData']
+ if ($options['data'] instanceof phpQueryObject) {
+ $serialized = $options['data']->serializeArray($options['data']);
+ $options['data'] = array();
+ foreach($serialized as $r)
+ $options['data'][ $r['name'] ] = $r['value'];
+ }
+ if (strtolower($options['type']) == 'get') {
+ $client->setParameterGet($options['data']);
+ } else if (strtolower($options['type']) == 'post') {
+ $client->setEncType($options['contentType']);
+ $client->setParameterPost($options['data']);
+ }
+ if (self::$active == 0 && $options['global'])
+ phpQueryEvents::trigger($documentID, 'ajaxStart');
+ self::$active++;
+ // beforeSend callback
+ if (isset($options['beforeSend']) && $options['beforeSend'])
+ phpQuery::callbackRun($options['beforeSend'], array($client));
+ // ajaxSend event
+ if ($options['global'])
+ phpQueryEvents::trigger($documentID, 'ajaxSend', array($client, $options));
+ if (phpQuery::$debug) {
+ self::debug("{$options['type']}: {$options['url']}\n");
+ self::debug("Options: <pre>".var_export($options, true)."</pre>\n");
+// if ($client->getCookieJar())
+// self::debug("Cookies: <pre>".var_export($client->getCookieJar()->getMatchingCookies($options['url']), true)."</pre>\n");
+ }
+ // request
+ $response = $client->request();
+ if (phpQuery::$debug) {
+ self::debug('Status: '.$response->getStatus().' / '.$response->getMessage());
+ self::debug($client->getLastRequest());
+ self::debug($response->getHeaders());
+ }
+ if ($response->isSuccessful()) {
+ // XXX tempolary
+ self::$lastModified = $response->getHeader('Last-Modified');
+ $data = self::httpData($response->getBody(), $options['dataType'], $options);
+ if (isset($options['success']) && $options['success'])
+ phpQuery::callbackRun($options['success'], array($data, $response->getStatus(), $options));
+ if ($options['global'])
+ phpQueryEvents::trigger($documentID, 'ajaxSuccess', array($client, $options));
+ } else {
+ if (isset($options['error']) && $options['error'])
+ phpQuery::callbackRun($options['error'], array($client, $response->getStatus(), $response->getMessage()));
+ if ($options['global'])
+ phpQueryEvents::trigger($documentID, 'ajaxError', array($client, /*$response->getStatus(),*/$response->getMessage(), $options));
+ }
+ if (isset($options['complete']) && $options['complete'])
+ phpQuery::callbackRun($options['complete'], array($client, $response->getStatus()));
+ if ($options['global'])
+ phpQueryEvents::trigger($documentID, 'ajaxComplete', array($client, $options));
+ if ($options['global'] && ! --self::$active)
+ phpQueryEvents::trigger($documentID, 'ajaxStop');
+ return $client;
+// if (is_null($domId))
+// $domId = self::$defaultDocumentID ? self::$defaultDocumentID : false;
+// return new phpQueryAjaxResponse($response, $domId);
+ }
+ protected static function httpData($data, $type, $options) {
+ if (isset($options['dataFilter']) && $options['dataFilter'])
+ $data = self::callbackRun($options['dataFilter'], array($data, $type));
+ if (is_string($data)) {
+ if ($type == "json") {
+ if (isset($options['_jsonp']) && $options['_jsonp']) {
+ $data = preg_replace('/^\s*\w+\((.*)\)\s*$/s', '$1', $data);
+ }
+ $data = self::parseJSON($data);
+ }
+ }
+ return $data;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param array|phpQuery $data
+ *
+ */
+ public static function param($data) {
+ return http_build_query($data, null, '&');
+ }
+ public static function get($url, $data = null, $callback = null, $type = null) {
+ if (!is_array($data)) {
+ $callback = $data;
+ $data = null;
+ }
+ // TODO some array_values on this shit
+ return phpQuery::ajax(array(
+ 'type' => 'GET',
+ 'url' => $url,
+ 'data' => $data,
+ 'success' => $callback,
+ 'dataType' => $type,
+ ));
+ }
+ public static function post($url, $data = null, $callback = null, $type = null) {
+ if (!is_array($data)) {
+ $callback = $data;
+ $data = null;
+ }
+ return phpQuery::ajax(array(
+ 'type' => 'POST',
+ 'url' => $url,
+ 'data' => $data,
+ 'success' => $callback,
+ 'dataType' => $type,
+ ));
+ }
+ public static function getJSON($url, $data = null, $callback = null) {
+ if (!is_array($data)) {
+ $callback = $data;
+ $data = null;
+ }
+ // TODO some array_values on this shit
+ return phpQuery::ajax(array(
+ 'type' => 'GET',
+ 'url' => $url,
+ 'data' => $data,
+ 'success' => $callback,
+ 'dataType' => 'json',
+ ));
+ }
+ public static function ajaxSetup($options) {
+ self::$ajaxSettings = array_merge(
+ self::$ajaxSettings,
+ $options
+ );
+ }
+ public static function ajaxAllowHost($host1, $host2 = null, $host3 = null) {
+ $loop = is_array($host1)
+ ? $host1
+ : func_get_args();
+ foreach($loop as $host) {
+ if ($host && ! in_array($host, phpQuery::$ajaxAllowedHosts)) {
+ phpQuery::$ajaxAllowedHosts[] = $host;
+ }
+ }
+ }
+ public static function ajaxAllowURL($url1, $url2 = null, $url3 = null) {
+ $loop = is_array($url1)
+ ? $url1
+ : func_get_args();
+ foreach($loop as $url)
+ phpQuery::ajaxAllowHost(parse_url($url, PHP_URL_HOST));
+ }
+ /**
+ * Returns JSON representation of $data.
+ *
+ * @static
+ * @param mixed $data
+ * @return string
+ */
+ public static function toJSON($data) {
+ if (function_exists('json_encode'))
+ return json_encode($data);
+ require_once('Zend/Json/Encoder.php');
+ return Zend_Json_Encoder::encode($data);
+ }
+ /**
+ * Parses JSON into proper PHP type.
+ *
+ * @static
+ * @param string $json
+ * @return mixed
+ */
+ public static function parseJSON($json) {
+ if (function_exists('json_decode')) {
+ $return = json_decode(trim($json), true);
+ // json_decode and UTF8 issues
+ if (isset($return))
+ return $return;
+ }
+ require_once('Zend/Json/Decoder.php');
+ return Zend_Json_Decoder::decode($json);
+ }
+ /**
+ * Returns source's document ID.
+ *
+ * @param $source DOMNode|phpQueryObject
+ * @return string
+ */
+ public static function getDocumentID($source) {
+ if ($source instanceof DOMDOCUMENT) {
+ foreach(phpQuery::$documents as $id => $document) {
+ if ($source->isSameNode($document->document))
+ return $id;
+ }
+ } else if ($source instanceof DOMNODE) {
+ foreach(phpQuery::$documents as $id => $document) {
+ if ($source->ownerDocument->isSameNode($document->document))
+ return $id;
+ }
+ } else if ($source instanceof phpQueryObject)
+ return $source->getDocumentID();
+ else if (is_string($source) && isset(phpQuery::$documents[$source]))
+ return $source;
+ }
+ /**
+ * Get DOMDocument object related to $source.
+ * Returns null if such document doesn't exist.
+ *
+ * @param $source DOMNode|phpQueryObject|string
+ * @return string
+ */
+ public static function getDOMDocument($source) {
+ if ($source instanceof DOMDOCUMENT)
+ return $source;
+ $source = self::getDocumentID($source);
+ return $source
+ ? self::$documents[$id]['document']
+ : null;
+ }
+
+ // UTILITIES
+ // http://docs.jquery.com/Utilities
+
+ /**
+ *
+ * @return unknown_type
+ * @link http://docs.jquery.com/Utilities/jQuery.makeArray
+ */
+ public static function makeArray($obj) {
+ $array = array();
+ if (is_object($object) && $object instanceof DOMNODELIST) {
+ foreach($object as $value)
+ $array[] = $value;
+ } else if (is_object($object) && ! ($object instanceof Iterator)) {
+ foreach(get_object_vars($object) as $name => $value)
+ $array[0][$name] = $value;
+ } else {
+ foreach($object as $name => $value)
+ $array[0][$name] = $value;
+ }
+ return $array;
+ }
+ public static function inArray($value, $array) {
+ return in_array($value, $array);
+ }
+ /**
+ *
+ * @param $object
+ * @param $callback
+ * @return unknown_type
+ * @link http://docs.jquery.com/Utilities/jQuery.each
+ */
+ public static function each($object, $callback, $param1 = null, $param2 = null, $param3 = null) {
+ $paramStructure = null;
+ if (func_num_args() > 2) {
+ $paramStructure = func_get_args();
+ $paramStructure = array_slice($paramStructure, 2);
+ }
+ if (is_object($object) && ! ($object instanceof Iterator)) {
+ foreach(get_object_vars($object) as $name => $value)
+ phpQuery::callbackRun($callback, array($name, $value), $paramStructure);
+ } else {
+ foreach($object as $name => $value)
+ phpQuery::callbackRun($callback, array($name, $value), $paramStructure);
+ }
+ }
+ /**
+ *
+ * @link http://docs.jquery.com/Utilities/jQuery.map
+ */
+ public static function map($array, $callback, $param1 = null, $param2 = null, $param3 = null) {
+ $result = array();
+ $paramStructure = null;
+ if (func_num_args() > 2) {
+ $paramStructure = func_get_args();
+ $paramStructure = array_slice($paramStructure, 2);
+ }
+ foreach($array as $v) {
+ $vv = phpQuery::callbackRun($callback, array($v), $paramStructure);
+// $callbackArgs = $args;
+// foreach($args as $i => $arg) {
+// $callbackArgs[$i] = $arg instanceof CallbackParam
+// ? $v
+// : $arg;
+// }
+// $vv = call_user_func_array($callback, $callbackArgs);
+ if (is_array($vv)) {
+ foreach($vv as $vvv)
+ $result[] = $vvv;
+ } else if ($vv !== null) {
+ $result[] = $vv;
+ }
+ }
+ return $result;
+ }
+ /**
+ *
+ * @param $callback Callback
+ * @param $params
+ * @param $paramStructure
+ * @return unknown_type
+ */
+ public static function callbackRun($callback, $params = array(), $paramStructure = null) {
+ if (! $callback)
+ return;
+ if ($callback instanceof CallbackParameterToReference) {
+ // TODO support ParamStructure to select which $param push to reference
+ if (isset($params[0]))
+ $callback->callback = $params[0];
+ return true;
+ }
+ if ($callback instanceof Callback) {
+ $paramStructure = $callback->params;
+ $callback = $callback->callback;
+ }
+ if (! $paramStructure)
+ return call_user_func_array($callback, $params);
+ $p = 0;
+ foreach($paramStructure as $i => $v) {
+ $paramStructure[$i] = $v instanceof CallbackParam
+ ? $params[$p++]
+ : $v;
+ }
+ return call_user_func_array($callback, $paramStructure);
+ }
+ /**
+ * Merge 2 phpQuery objects.
+ * @param array $one
+ * @param array $two
+ * @protected
+ * @todo node lists, phpQueryObject
+ */
+ public static function merge($one, $two) {
+ $elements = $one->elements;
+ foreach($two->elements as $node) {
+ $exists = false;
+ foreach($elements as $node2) {
+ if ($node2->isSameNode($node))
+ $exists = true;
+ }
+ if (! $exists)
+ $elements[] = $node;
+ }
+ return $elements;
+// $one = $one->newInstance();
+// $one->elements = $elements;
+// return $one;
+ }
+ /**
+ *
+ * @param $array
+ * @param $callback
+ * @param $invert
+ * @return unknown_type
+ * @link http://docs.jquery.com/Utilities/jQuery.grep
+ */
+ public static function grep($array, $callback, $invert = false) {
+ $result = array();
+ foreach($array as $k => $v) {
+ $r = call_user_func_array($callback, array($v, $k));
+ if ($r === !(bool)$invert)
+ $result[] = $v;
+ }
+ return $result;
+ }
+ public static function unique($array) {
+ return array_unique($array);
+ }
+ /**
+ *
+ * @param $function
+ * @return unknown_type
+ * @TODO there are problems with non-static methods, second parameter pass it
+ * but doesnt verify is method is really callable
+ */
+ public static function isFunction($function) {
+ return is_callable($function);
+ }
+ public static function trim($str) {
+ return trim($str);
+ }
+ /* PLUGINS NAMESPACE */
+ /**
+ *
+ * @param $url
+ * @param $callback
+ * @param $param1
+ * @param $param2
+ * @param $param3
+ * @return phpQueryObject
+ */
+ public static function browserGet($url, $callback, $param1 = null, $param2 = null, $param3 = null) {
+ if (self::plugin('WebBrowser')) {
+ $params = func_get_args();
+ return self::callbackRun(array(self::$plugins, 'browserGet'), $params);
+ } else {
+ self::debug('WebBrowser plugin not available...');
+ }
+ }
+ /**
+ *
+ * @param $url
+ * @param $data
+ * @param $callback
+ * @param $param1
+ * @param $param2
+ * @param $param3
+ * @return phpQueryObject
+ */
+ public static function browserPost($url, $data, $callback, $param1 = null, $param2 = null, $param3 = null) {
+ if (self::plugin('WebBrowser')) {
+ $params = func_get_args();
+ return self::callbackRun(array(self::$plugins, 'browserPost'), $params);
+ } else {
+ self::debug('WebBrowser plugin not available...');
+ }
+ }
+ /**
+ *
+ * @param $ajaxSettings
+ * @param $callback
+ * @param $param1
+ * @param $param2
+ * @param $param3
+ * @return phpQueryObject
+ */
+ public static function browser($ajaxSettings, $callback, $param1 = null, $param2 = null, $param3 = null) {
+ if (self::plugin('WebBrowser')) {
+ $params = func_get_args();
+ return self::callbackRun(array(self::$plugins, 'browser'), $params);
+ } else {
+ self::debug('WebBrowser plugin not available...');
+ }
+ }
+ /**
+ *
+ * @param $code
+ * @return string
+ */
+ public static function php($code) {
+ return self::code('php', $code);
+ }
+ /**
+ *
+ * @param $type
+ * @param $code
+ * @return string
+ */
+ public static function code($type, $code) {
+ return "<$type><!-- ".trim($code)." --></$type>";
+ }
+
+ public static function __callStatic($method, $params) {
+ return call_user_func_array(
+ array(phpQuery::$plugins, $method),
+ $params
+ );
+ }
+ protected static function dataSetupNode($node, $documentID) {
+ // search are return if alredy exists
+ foreach(phpQuery::$documents[$documentID]->dataNodes as $dataNode) {
+ if ($node->isSameNode($dataNode))
+ return $dataNode;
+ }
+ // if doesn't, add it
+ phpQuery::$documents[$documentID]->dataNodes[] = $node;
+ return $node;
+ }
+ protected static function dataRemoveNode($node, $documentID) {
+ // search are return if alredy exists
+ foreach(phpQuery::$documents[$documentID]->dataNodes as $k => $dataNode) {
+ if ($node->isSameNode($dataNode)) {
+ unset(self::$documents[$documentID]->dataNodes[$k]);
+ unset(self::$documents[$documentID]->data[ $dataNode->dataID ]);
+ }
+ }
+ }
+ public static function data($node, $name, $data, $documentID = null) {
+ if (! $documentID)
+ // TODO check if this works
+ $documentID = self::getDocumentID($node);
+ $document = phpQuery::$documents[$documentID];
+ $node = self::dataSetupNode($node, $documentID);
+ if (! isset($node->dataID))
+ $node->dataID = ++phpQuery::$documents[$documentID]->uuid;
+ $id = $node->dataID;
+ if (! isset($document->data[$id]))
+ $document->data[$id] = array();
+ if (! is_null($data))
+ $document->data[$id][$name] = $data;
+ if ($name) {
+ if (isset($document->data[$id][$name]))
+ return $document->data[$id][$name];
+ } else
+ return $id;
+ }
+ public static function removeData($node, $name, $documentID) {
+ if (! $documentID)
+ // TODO check if this works
+ $documentID = self::getDocumentID($node);
+ $document = phpQuery::$documents[$documentID];
+ $node = self::dataSetupNode($node, $documentID);
+ $id = $node->dataID;
+ if ($name) {
+ if (isset($document->data[$id][$name]))
+ unset($document->data[$id][$name]);
+ $name = null;
+ foreach($document->data[$id] as $name)
+ break;
+ if (! $name)
+ self::removeData($node, $name, $documentID);
+ } else {
+ self::dataRemoveNode($node, $documentID);
+ }
+ }
+}
+/**
+ * Plugins static namespace class.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ * @todo move plugin methods here (as statics)
+ */
+class phpQueryPlugins {
+ public function __call($method, $args) {
+ if (isset(phpQuery::$extendStaticMethods[$method])) {
+ $return = call_user_func_array(
+ phpQuery::$extendStaticMethods[$method],
+ $args
+ );
+ } else if (isset(phpQuery::$pluginsStaticMethods[$method])) {
+ $class = phpQuery::$pluginsStaticMethods[$method];
+ $realClass = "phpQueryPlugin_$class";
+ $return = call_user_func_array(
+ array($realClass, $method),
+ $args
+ );
+ return isset($return)
+ ? $return
+ : $this;
+ } else
+ throw new Exception("Method '{$method}' doesnt exist");
+ }
+}
+/**
+ * Shortcut to phpQuery::pq($arg1, $context)
+ * Chainable.
+ *
+ * @see phpQuery::pq()
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ */
+function pq($arg1, $context = null) {
+ $args = func_get_args();
+ return call_user_func_array(
+ array('phpQuery', 'pq'),
+ $args
+ );
+}
+// add plugins dir and Zend framework to include path
+set_include_path(
+ get_include_path()
+ .PATH_SEPARATOR.dirname(__FILE__).'/phpQuery/'
+ .PATH_SEPARATOR.dirname(__FILE__).'/phpQuery/plugins/'
+);
+// why ? no __call nor __get for statics in php...
+// XXX __callStatic will be available in PHP 5.3
+phpQuery::$plugins = new phpQueryPlugins();
+// include bootstrap file (personal library config)
+if (file_exists(dirname(__FILE__).'/phpQuery/bootstrap.php'))
+ require_once dirname(__FILE__).'/phpQuery/bootstrap.php';
diff --git a/_test/cases/inc/search/data/ns1/ns3/page3.txt b/_test/data/_dummy
index e69de29bb..e69de29bb 100644
--- a/_test/cases/inc/search/data/ns1/ns3/page3.txt
+++ b/_test/data/_dummy
diff --git a/_test/cases/inc/search/data/ns1/page1.txt b/_test/data/attic/_dummy
index e69de29bb..e69de29bb 100644
--- a/_test/cases/inc/search/data/ns1/page1.txt
+++ b/_test/data/attic/_dummy
diff --git a/_test/cases/inc/search/data/ns1/page2.txt b/_test/data/cache/_dummy
index e69de29bb..e69de29bb 100644
--- a/_test/cases/inc/search/data/ns1/page2.txt
+++ b/_test/data/cache/_dummy
diff --git a/_test/cases/inc/search/data/ns2/nopage.ext b/_test/data/index/_dummy
index e69de29bb..e69de29bb 100644
--- a/_test/cases/inc/search/data/ns2/nopage.ext
+++ b/_test/data/index/_dummy
diff --git a/_test/cases/inc/search/data/ns2/page1.txt b/_test/data/locks/_dummy
index e69de29bb..e69de29bb 100644
--- a/_test/cases/inc/search/data/ns2/page1.txt
+++ b/_test/data/locks/_dummy
diff --git a/_test/data/media/wiki/dokuwiki-128.png b/_test/data/media/wiki/dokuwiki-128.png
new file mode 100644
index 000000000..b2306ac95
--- /dev/null
+++ b/_test/data/media/wiki/dokuwiki-128.png
Binary files differ
diff --git a/_test/data/media_attic/_dummy b/_test/data/media_attic/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/media_attic/_dummy
diff --git a/_test/data/media_meta/_dummy b/_test/data/media_meta/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/media_meta/_dummy
diff --git a/_test/data/meta/_dummy b/_test/data/meta/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/meta/_dummy
diff --git a/_test/data/pages/wiki/dokuwiki.txt b/_test/data/pages/wiki/dokuwiki.txt
new file mode 100644
index 000000000..e6fac5b65
--- /dev/null
+++ b/_test/data/pages/wiki/dokuwiki.txt
@@ -0,0 +1,64 @@
+====== DokuWiki ======
+
+[[doku>wiki:dokuwiki|{{wiki:dokuwiki-128.png }}]] DokuWiki is a standards compliant, simple to use [[wp>Wiki]], mainly aimed at creating documentation of any kind. It is targeted at developer teams, workgroups and small companies. It has a simple but powerful [[wiki:syntax]] which makes sure the datafiles remain readable outside the Wiki and eases the creation of structured texts. All data is stored in plain text files -- no database is required.
+
+Read the [[doku>manual|DokuWiki Manual]] to unleash the full power of DokuWiki.
+
+===== Download =====
+
+DokuWiki is available at http://www.splitbrain.org/go/dokuwiki
+
+
+===== Read More =====
+
+All documentation and additional information besides the [[syntax|syntax description]] is maintained in the DokuWiki at [[doku>|www.dokuwiki.org]].
+
+**About DokuWiki**
+
+ * [[doku>features|A feature list]] :!:
+ * [[doku>users|Happy Users]]
+ * [[doku>press|Who wrote about it]]
+ * [[doku>blogroll|What Bloggers think]]
+ * [[http://www.wikimatrix.org/show/DokuWiki|Compare it with other wiki software]]
+
+**Installing DokuWiki**
+
+ * [[doku>requirements|System Requirements]]
+ * [[http://www.splitbrain.org/go/dokuwiki|Download DokuWiki]] :!:
+ * [[doku>changes|Change Log]]
+ * [[doku>Install|How to install or upgrade]] :!:
+ * [[doku>config|Configuration]]
+
+**Using DokuWiki**
+
+ * [[doku>syntax|Wiki Syntax]]
+ * [[doku>manual|The manual]] :!:
+ * [[doku>FAQ|Frequently Asked Questions (FAQ)]]
+ * [[doku>glossary|Glossary]]
+ * [[http://search.dokuwiki.org|Search for DokuWiki help and documentation]]
+
+**Customizing DokuWiki**
+
+ * [[doku>tips|Tips and Tricks]]
+ * [[doku>Template|How to create and use templates]]
+ * [[doku>plugins|Installing plugins]]
+ * [[doku>development|Development Resources]]
+
+**DokuWiki Feedback and Community**
+
+ * [[doku>newsletter|Subscribe to the newsletter]] :!:
+ * [[doku>mailinglist|Join the mailing list]]
+ * [[http://forum.dokuwiki.org|Check out the user forum]]
+ * [[doku>irc|Talk to other users in the IRC channel]]
+ * [[http://bugs.splitbrain.org/index.php?project=1|Submit bugs and feature wishes]]
+ * [[http://www.wikimatrix.org/forum/viewforum.php?id=10|Share your experiences in the WikiMatrix forum]]
+ * [[doku>thanks|Some humble thanks]]
+
+
+===== Copyright =====
+
+2004-2010 (c) Andreas Gohr <andi@splitbrain.org>((Please do not contact me for help and support -- use the [[doku>mailinglist]] or [[http://forum.dokuwiki.org|forum]] instead)) and the DokuWiki Community
+
+The DokuWiki engine is licensed under [[http://www.gnu.org/licenses/gpl.html|GNU General Public License]] Version 2. If you use DokuWiki in your company, consider [[doku>donate|donating]] a few bucks ;-).
+
+Not sure what this means? See the [[doku>faq:license|FAQ on the Licenses]].
diff --git a/_test/data/pages/wiki/syntax.txt b/_test/data/pages/wiki/syntax.txt
new file mode 100644
index 000000000..0b5480949
--- /dev/null
+++ b/_test/data/pages/wiki/syntax.txt
@@ -0,0 +1,486 @@
+====== Formatting Syntax ======
+
+[[doku>DokuWiki]] supports some simple markup language, which tries to make the datafiles to be as readable as possible. This page contains all possible syntax you may use when editing the pages. Simply have a look at the source of this page by pressing the //Edit this page// button at the top or bottom of the page. If you want to try something, just use the [[playground:playground|playground]] page. The simpler markup is easily accessible via [[doku>toolbar|quickbuttons]], too.
+
+===== Basic Text Formatting =====
+
+DokuWiki supports **bold**, //italic//, __underlined__ and ''monospaced'' texts. Of course you can **__//''combine''//__** all these.
+
+ DokuWiki supports **bold**, //italic//, __underlined__ and ''monospaced'' texts.
+ Of course you can **__//''combine''//__** all these.
+
+You can use <sub>subscript</sub> and <sup>superscript</sup>, too.
+
+ You can use <sub>subscript</sub> and <sup>superscript</sup>, too.
+
+You can mark something as <del>deleted</del> as well.
+
+ You can mark something as <del>deleted</del> as well.
+
+**Paragraphs** are created from blank lines. If you want to **force a newline** without a paragraph, you can use two backslashes followed by a whitespace or the end of line.
+
+This is some text with some linebreaks\\ Note that the
+two backslashes are only recognized at the end of a line\\
+or followed by\\ a whitespace \\this happens without it.
+
+ This is some text with some linebreaks\\ Note that the
+ two backslashes are only recognized at the end of a line\\
+ or followed by\\ a whitespace \\this happens without it.
+
+You should use forced newlines only if really needed.
+
+===== Links =====
+
+DokuWiki supports multiple ways of creating links.
+
+==== External ====
+
+External links are recognized automagically: http://www.google.com or simply www.google.com - You can set the link text as well: [[http://www.google.com|This Link points to google]]. Email addresses like this one: <andi@splitbrain.org> are recognized, too.
+
+ DokuWiki supports multiple ways of creating links. External links are recognized
+ automagically: http://www.google.com or simply www.google.com - You can set
+ link text as well: [[http://www.google.com|This Link points to google]]. Email
+ addresses like this one: <andi@splitbrain.org> are recognized, too.
+
+==== Internal ====
+
+Internal links are created by using square brackets. You can either just give a [[pagename]] or use an additional [[pagename|link text]].
+
+ Internal links are created by using square brackets. You can either just give
+ a [[pagename]] or use an additional [[pagename|link text]].
+
+[[doku>pagename|Wiki pagenames]] are converted to lowercase automatically, special characters are not allowed.
+
+You can use [[some:namespaces]] by using a colon in the pagename.
+
+ You can use [[some:namespaces]] by using a colon in the pagename.
+
+For details about namespaces see [[doku>namespaces]].
+
+Linking to a specific section is possible, too. Just add the section name behind a hash character as known from HTML. This links to [[syntax#internal|this Section]].
+
+ This links to [[syntax#internal|this Section]].
+
+Notes:
+
+ * Links to [[syntax|existing pages]] are shown in a different style from [[nonexisting]] ones.
+ * DokuWiki does not use [[wp>CamelCase]] to automatically create links by default, but this behavior can be enabled in the [[doku>config]] file. Hint: If DokuWiki is a link, then it's enabled.
+ * When a section's heading is changed, its bookmark changes, too. So don't rely on section linking too much.
+
+==== Interwiki ====
+
+DokuWiki supports [[doku>Interwiki]] links. These are quick links to other Wikis. For example this is a link to Wikipedia's page about Wikis: [[wp>Wiki]].
+
+ DokuWiki supports [[doku>Interwiki]] links. These are quick links to other Wikis.
+ For example this is a link to Wikipedia's page about Wikis: [[wp>Wiki]].
+
+==== Windows Shares ====
+
+Windows shares like [[\\server\share|this]] are recognized, too. Please note that these only make sense in a homogeneous user group like a corporate [[wp>Intranet]].
+
+ Windows Shares like [[\\server\share|this]] are recognized, too.
+
+Notes:
+
+ * For security reasons direct browsing of windows shares only works in Microsoft Internet Explorer per default (and only in the "local zone").
+ * For Mozilla and Firefox it can be enabled through different workaround mentioned in the [[http://kb.mozillazine.org/Links_to_local_pages_do_not_work|Mozilla Knowledge Base]]. However, there will still be a JavaScript warning about trying to open a Windows Share. To remove this warning (for all users), put the following line in ''conf/local.protected.php'':
+
+ $lang['js']['nosmblinks'] = '';
+
+==== Image Links ====
+
+You can also use an image to link to another internal or external page by combining the syntax for links and [[#images_and_other_files|images]] (see below) like this:
+
+ [[http://www.php.net|{{wiki:dokuwiki-128.png}}]]
+
+[[http://www.php.net|{{wiki:dokuwiki-128.png}}]]
+
+Please note: The image formatting is the only formatting syntax accepted in link names.
+
+The whole [[#images_and_other_files|image]] and [[#links|link]] syntax is supported (including image resizing, internal and external images and URLs and interwiki links).
+
+===== Footnotes =====
+
+You can add footnotes ((This is a footnote)) by using double parentheses.
+
+ You can add footnotes ((This is a footnote)) by using double parentheses.
+
+===== Sectioning =====
+
+You can use up to five different levels of headlines to structure your content. If you have more than three headlines, a table of contents is generated automatically -- this can be disabled by including the string ''<nowiki>~~NOTOC~~</nowiki>'' in the document.
+
+==== Headline Level 3 ====
+=== Headline Level 4 ===
+== Headline Level 5 ==
+
+ ==== Headline Level 3 ====
+ === Headline Level 4 ===
+ == Headline Level 5 ==
+
+By using four or more dashes, you can make a horizontal line:
+
+----
+
+===== Images and Other Files =====
+
+You can include external and internal [[doku>images]] with curly brackets. Optionally you can specify the size of them.
+
+Real size: {{wiki:dokuwiki-128.png}}
+
+Resize to given width: {{wiki:dokuwiki-128.png?50}}
+
+Resize to given width and height((when the aspect ratio of the given width and height doesn't match that of the image, it will be cropped to the new ratio before resizing)): {{wiki:dokuwiki-128.png?200x50}}
+
+Resized external image: {{http://de3.php.net/images/php.gif?200x50}}
+
+ Real size: {{wiki:dokuwiki-128.png}}
+ Resize to given width: {{wiki:dokuwiki-128.png?50}}
+ Resize to given width and height: {{wiki:dokuwiki-128.png?200x50}}
+ Resized external image: {{http://de3.php.net/images/php.gif?200x50}}
+
+
+By using left or right whitespaces you can choose the alignment.
+
+{{ wiki:dokuwiki-128.png}}
+
+{{wiki:dokuwiki-128.png }}
+
+{{ wiki:dokuwiki-128.png }}
+
+ {{ wiki:dokuwiki-128.png}}
+ {{wiki:dokuwiki-128.png }}
+ {{ wiki:dokuwiki-128.png }}
+
+Of course, you can add a title (displayed as a tooltip by most browsers), too.
+
+{{ wiki:dokuwiki-128.png |This is the caption}}
+
+ {{ wiki:dokuwiki-128.png |This is the caption}}
+
+If you specify a filename (external or internal) that is not an image (''gif, jpeg, png''), then it will be displayed as a link instead.
+
+For linking an image to another page see [[#Image Links]] above.
+
+===== Lists =====
+
+Dokuwiki supports ordered and unordered lists. To create a list item, indent your text by two spaces and use a ''*'' for unordered lists or a ''-'' for ordered ones.
+
+ * This is a list
+ * The second item
+ * You may have different levels
+ * Another item
+
+ - The same list but ordered
+ - Another item
+ - Just use indention for deeper levels
+ - That's it
+
+<code>
+ * This is a list
+ * The second item
+ * You may have different levels
+ * Another item
+
+ - The same list but ordered
+ - Another item
+ - Just use indention for deeper levels
+ - That's it
+</code>
+
+Also take a look at the [[doku>faq:lists|FAQ on list items]].
+
+===== Text Conversions =====
+
+DokuWiki can convert certain pre-defined characters or strings into images or other text or HTML.
+
+The text to image conversion is mainly done for smileys. And the text to HTML conversion is used for typography replacements, but can be configured to use other HTML as well.
+
+==== Text to Image Conversions ====
+
+DokuWiki converts commonly used [[wp>emoticon]]s to their graphical equivalents. Those [[doku>Smileys]] and other images can be configured and extended. Here is an overview of Smileys included in DokuWiki:
+
+ * 8-) %% 8-) %%
+ * 8-O %% 8-O %%
+ * :-( %% :-( %%
+ * :-) %% :-) %%
+ * =) %% =) %%
+ * :-/ %% :-/ %%
+ * :-\ %% :-\ %%
+ * :-? %% :-? %%
+ * :-D %% :-D %%
+ * :-P %% :-P %%
+ * :-O %% :-O %%
+ * :-X %% :-X %%
+ * :-| %% :-| %%
+ * ;-) %% ;-) %%
+ * ^_^ %% ^_^ %%
+ * :?: %% :?: %%
+ * :!: %% :!: %%
+ * LOL %% LOL %%
+ * FIXME %% FIXME %%
+ * DELETEME %% DELETEME %%
+
+==== Text to HTML Conversions ====
+
+Typography: [[DokuWiki]] can convert simple text characters to their typographically correct entities. Here is an example of recognized characters.
+
+-> <- <-> => <= <=> >> << -- --- 640x480 (c) (tm) (r)
+"He thought 'It's a man's world'..."
+
+<code>
+-> <- <-> => <= <=> >> << -- --- 640x480 (c) (tm) (r)
+"He thought 'It's a man's world'..."
+</code>
+
+The same can be done to produce any kind of HTML, it just needs to be added to the [[doku>entities|pattern file]].
+
+There are three exceptions which do not come from that pattern file: multiplication entity (640x480), 'single' and "double quotes". They can be turned off through a [[doku>config:typography|config option]].
+
+===== Quoting =====
+
+Some times you want to mark some text to show it's a reply or comment. You can use the following syntax:
+
+ I think we should do it
+
+ > No we shouldn't
+
+ >> Well, I say we should
+
+ > Really?
+
+ >> Yes!
+
+ >>> Then lets do it!
+
+I think we should do it
+
+> No we shouldn't
+
+>> Well, I say we should
+
+> Really?
+
+>> Yes!
+
+>>> Then lets do it!
+
+===== Tables =====
+
+DokuWiki supports a simple syntax to create tables.
+
+^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+| Row 2 Col 1 | some colspan (note the double pipe) ||
+| Row 3 Col 1 | Row 3 Col 2 | Row 3 Col 3 |
+
+Table rows have to start and end with a ''|'' for normal rows or a ''^'' for headers.
+
+ ^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+ | Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+ | Row 2 Col 1 | some colspan (note the double pipe) ||
+ | Row 3 Col 1 | Row 3 Col 2 | Row 3 Col 3 |
+
+To connect cells horizontally, just make the next cell completely empty as shown above. Be sure to have always the same amount of cell separators!
+
+Vertical tableheaders are possible, too.
+
+| ^ Heading 1 ^ Heading 2 ^
+^ Heading 3 | Row 1 Col 2 | Row 1 Col 3 |
+^ Heading 4 | no colspan this time | |
+^ Heading 5 | Row 2 Col 2 | Row 2 Col 3 |
+
+As you can see, it's the cell separator before a cell which decides about the formatting:
+
+ | ^ Heading 1 ^ Heading 2 ^
+ ^ Heading 3 | Row 1 Col 2 | Row 1 Col 3 |
+ ^ Heading 4 | no colspan this time | |
+ ^ Heading 5 | Row 2 Col 2 | Row 2 Col 3 |
+
+You can have rowspans (vertically connected cells) by adding '':::'' into the cells below the one to which they should connect.
+
+^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+| Row 1 Col 1 | this cell spans vertically | Row 1 Col 3 |
+| Row 2 Col 1 | ::: | Row 2 Col 3 |
+| Row 3 Col 1 | ::: | Row 2 Col 3 |
+
+Apart from the rowspan syntax those cells should not contain anything else.
+
+ ^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+ | Row 1 Col 1 | this cell spans vertically | Row 1 Col 3 |
+ | Row 2 Col 1 | ::: | Row 2 Col 3 |
+ | Row 3 Col 1 | ::: | Row 2 Col 3 |
+
+You can align the table contents, too. Just add at least two whitespaces at the opposite end of your text: Add two spaces on the left to align right, two spaces on the right to align left and two spaces at least at both ends for centered text.
+
+^ Table with alignment ^^^
+| right| center |left |
+|left | right| center |
+| xxxxxxxxxxxx | xxxxxxxxxxxx | xxxxxxxxxxxx |
+
+This is how it looks in the source:
+
+ ^ Table with alignment ^^^
+ | right| center |left |
+ |left | right| center |
+ | xxxxxxxxxxxx | xxxxxxxxxxxx | xxxxxxxxxxxx |
+
+Note: Vertical alignment is not supported.
+
+===== No Formatting =====
+
+If you need to display text exactly like it is typed (without any formatting), enclose the area either with ''%%<nowiki>%%'' tags or even simpler, with double percent signs ''<nowiki>%%</nowiki>''.
+
+<nowiki>
+This is some text which contains addresses like this: http://www.splitbrain.org and **formatting**, but nothing is done with it.
+</nowiki>
+The same is true for %%//__this__ text// with a smiley ;-)%%.
+
+ <nowiki>
+ This is some text which contains addresses like this: http://www.splitbrain.org and **formatting**, but nothing is done with it.
+ </nowiki>
+ The same is true for %%//__this__ text// with a smiley ;-)%%.
+
+===== Code Blocks =====
+
+You can include code blocks into your documents by either indenting them by at least two spaces (like used for the previous examples) or by using the tags ''%%<code>%%'' or ''%%<file>%%''.
+
+ This is text is indented by two spaces.
+
+<code>
+This is preformatted code all spaces are preserved: like <-this
+</code>
+
+<file>
+This is pretty much the same, but you could use it to show that you quoted a file.
+</file>
+
+Those blocks were created by this source:
+
+ This is text is indented by two spaces.
+
+ <code>
+ This is preformatted code all spaces are preserved: like <-this
+ </code>
+
+ <file>
+ This is pretty much the same, but you could use it to show that you quoted a file.
+ </file>
+
+==== Syntax Highlighting ====
+
+[[wiki:DokuWiki]] can highlight sourcecode, which makes it easier to read. It uses the [[http://qbnz.com/highlighter/|GeSHi]] Generic Syntax Highlighter -- so any language supported by GeSHi is supported. The syntax uses the same code and file blocks described in the previous section, but this time the name of the language syntax to be highlighted is included inside the tag, e.g. ''<nowiki><code java></nowiki>'' or ''<nowiki><file java></nowiki>''.
+
+<code java>
+/**
+ * The HelloWorldApp class implements an application that
+ * simply displays "Hello World!" to the standard output.
+ */
+class HelloWorldApp {
+ public static void main(String[] args) {
+ System.out.println("Hello World!"); //Display the string.
+ }
+}
+</code>
+
+The following language strings are currently recognized: //4cs, abap, actionscript-french, actionscript, actionscript3, ada, apache, applescript, asm, asp, autoconf, autohotkey, autoit, avisynth, awk, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, cpp, cpp-qt, csharp, css, cuesheet, d, dcs, delphi, diff, div, dos, dot, ecmascript, eiffel, email, erlang, fo, fortran, freebasic, fsharp, gambas, genero, genie, gdb, glsl, gml, gnuplot, groovy, gettext, gwbasic, haskell, hicest, hq9plus, html, icon, idl, ini, inno, intercal, io, j, java5, java, javascript, jquery, kixtart, klonec, klonecpp, latex, lisp, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, modula2, modula3, mmix, mpasm, mxml, mysql, newlisp, nsis, oberon2, objc, ocaml-brief, ocaml, oobas, oracle8, oracle11, oxygene, oz, pascal, pcre, perl, perl6, per, pf, php-brief, php, pike, pic16, pixelbender, plsql, postgresql, povray, powerbuilder, powershell, progress, prolog, properties, providex, purebasic, python, q, qbasic, rails, rebol, reg, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, vala, vbnet, vb, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, winbatch, whois, xbasic, xml, xorg_conf, xpp, z80//
+
+==== Downloadable Code Blocks ====
+
+When you use the ''%%<code>%%'' or ''%%<file>%%'' syntax as above, you might want to make the shown code available for download as well. You can to this by specifying a file name after language code like this:
+
+<code>
+<file php myexample.php>
+<?php echo "hello world!"; ?>
+</file>
+</code>
+
+<file php myexample.php>
+<?php echo "hello world!"; ?>
+</file>
+
+If you don't want any highlighting but want a downloadable file, specify a dash (''-'') as the language code: ''%%<code - myfile.foo>%%''.
+
+
+===== Embedding HTML and PHP =====
+
+You can embed raw HTML or PHP code into your documents by using the ''%%<html>%%'' or ''%%<php>%%'' tags. (Use uppercase tags if you need to enclose block level elements.)
+
+HTML example:
+
+<code>
+<html>
+This is some <span style="color:red;font-size:150%;">inline HTML</span>
+</html>
+<HTML>
+<p style="border:2px dashed red;">And this is some block HTML</p>
+</HTML>
+</code>
+
+<html>
+This is some <span style="color:red;font-size:150%;">inline HTML</span>
+</html>
+<HTML>
+<p style="border:2px dashed red;">And this is some block HTML</p>
+</HTML>
+
+PHP example:
+
+<code>
+<php>
+echo 'A logo generated by PHP:';
+echo '<img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" />';
+echo '(generated inline HTML)';
+</php>
+<PHP>
+echo '<table class="inline"><tr><td>The same, but inside a block level element:</td>';
+echo '<td><img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" /></td>';
+echo '</tr></table>';
+</PHP>
+</code>
+
+<php>
+echo 'A logo generated by PHP:';
+echo '<img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" />';
+echo '(inline HTML)';
+</php>
+<PHP>
+echo '<table class="inline"><tr><td>The same, but inside a block level element:</td>';
+echo '<td><img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" /></td>';
+echo '</tr></table>';
+</PHP>
+
+**Please Note**: HTML and PHP embedding is disabled by default in the configuration. If disabled, the code is displayed instead of executed.
+
+===== RSS/ATOM Feed Aggregation =====
+[[DokuWiki]] can integrate data from external XML feeds. For parsing the XML feeds, [[http://simplepie.org/|SimplePie]] is used. All formats understood by SimplePie can be used in DokuWiki as well. You can influence the rendering by multiple additional space separated parameters:
+
+^ Parameter ^ Description ^
+| any number | will be used as maximum number items to show, defaults to 8 |
+| reverse | display the last items in the feed first |
+| author | show item authors names |
+| date | show item dates |
+| description| show the item description. If [[doku>config:htmlok|HTML]] is disabled all tags will be stripped |
+| //n//[dhm] | refresh period, where d=days, h=hours, m=minutes. (e.g. 12h = 12 hours). |
+
+The refresh period defaults to 4 hours. Any value below 10 minutes will be treated as 10 minutes. [[wiki:DokuWiki]] will generally try to supply a cached version of a page, obviously this is inappropriate when the page contains dynamic external content. The parameter tells [[wiki:DokuWiki]] to re-render the page if it is more than //refresh period// since the page was last rendered.
+
+**Example:**
+
+ {{rss>http://slashdot.org/index.rss 5 author date 1h }}
+
+{{rss>http://slashdot.org/index.rss 5 author date 1h }}
+
+
+===== Control Macros =====
+
+Some syntax influences how DokuWiki renders a page without creating any output it self. The following control macros are availble:
+
+^ Macro ^ Description |
+| %%~~NOTOC~~%% | If this macro is found on the page, no table of contents will be created |
+| %%~~NOCACHE~~%% | DokuWiki caches all output by default. Sometimes this might not be wanted (eg. when the %%<php>%% syntax above is used), adding this macro will force DokuWiki to rerender a page on every call |
+
+===== Syntax Plugins =====
+
+DokuWiki's syntax can be extended by [[doku>plugins|Plugins]]. How the installed plugins are used is described on their appropriate description pages. The following syntax plugins are available in this particular DokuWiki installation:
+
+~~INFO:syntaxplugins~~
diff --git a/_test/data/tmp/_dummy b/_test/data/tmp/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/tmp/_dummy
diff --git a/_test/debug.note b/_test/debug.note
deleted file mode 100644
index 28c34d8ee..000000000
--- a/_test/debug.note
+++ /dev/null
@@ -1,4 +0,0 @@
-print "-----------------------------------------------------\n";
-print_r(array_map('stripbyteindex',$this->H->calls));
-print "-----------------------------------------------------\n";
-print_r($calls);
diff --git a/_test/index.php b/_test/index.php
deleted file mode 100644
index f59c44cf4..000000000
--- a/_test/index.php
+++ /dev/null
@@ -1,228 +0,0 @@
-<?php
-define('DOKU_UNITTEST',true);
-define('DOKU_TESTSCRIPT',$_SERVER['PHP_SELF']);
-
-if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
-define('DOKU_CONF',realpath(dirname(__FILE__).'/../conf').'/');
-
-require_once DOKU_CONF . 'dokuwiki.php';
-if(@file_exists(DOKU_CONF.'local.php')){ require_once(DOKU_CONF.'local.php'); }
-
-$conf['lang'] = 'en';
-define('TEST_ROOT', dirname(__FILE__));
-define('TMPL_FILESCHEME_PATH', TEST_ROOT . '/filescheme/');
-error_reporting(E_ALL);
-
-set_time_limit(600);
-ini_set('memory_limit','128M');
-
-/* Used to determine output to display */
-define('DW_TESTS_OUTPUT_HTML',1);
-define('DW_TESTS_OUTPUT_XML',2);
-
-if ( isset($_GET['output']) && $_GET['output'] == 'xml' ) {
- define('DW_TESTS_OUTPUT',DW_TESTS_OUTPUT_XML);
-} else {
- define('DW_TESTS_OUTPUT',DW_TESTS_OUTPUT_HTML);
-}
-
-require_once 'lib/testmanager.php';
-TestManager::setup('tests.ini');
-
-if ( !defined('SIMPLE_TEST') ) {
- define('SIMPLE_TEST', ConfigManager::getOptionAsPath('tests', 'simpletest', 'library_path'));
-}
-
-if (!@include_once SIMPLE_TEST . 'reporter.php') {
- RaiseError('runtime', 'LIBRARY_REQUIRED', array(
- 'library' => 'Simple Test',
- 'path' => SIMPLE_TEST));
-}
-
-function & DW_TESTS_GetReporter() {
- static $Reporter = NULL;
- if ( !$Reporter ) {
- switch ( DW_TESTS_OUTPUT ) {
- case DW_TESTS_OUTPUT_XML:
- require_once SIMPLE_TEST . 'xml.php';
- $Reporter = new XmlReporter();
- break;
- case DW_TESTS_OUTPUT_HTML:
- default:
- $Reporter = new HTMLReporter('utf-8');
- break;
- }
- }
- return $Reporter;
-}
-
-function DW_TESTS_PaintRunMore() {
- switch ( DW_TESTS_OUTPUT ) {
- case DW_TESTS_OUTPUT_XML:
- break;
- case DW_TESTS_OUTPUT_HTML:
- default:
- echo "<p><a href='" . DOKU_TESTSCRIPT . "'>Run more tests</a></p>";
- break;
- }
-}
-
-function DW_TESTS_PaintHeader() {
- switch ( DW_TESTS_OUTPUT ) {
- case DW_TESTS_OUTPUT_XML:
- header('Content-Type: text/xml; charset="utf-8"');
- break;
- case DW_TESTS_OUTPUT_HTML:
- $header = <<<EOD
-<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
- 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
-<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
- <head>
- <meta http-equiv='Content-Type'
- content='text/html; charset=iso-8859-1' />
-
- <title>Dokuwiki: Unit Test Suite</title>
- <link href="tests.css" type="text/css" rel="stylesheet" media="all"/>
-
- </head>
- <body>
-EOD;
- echo $header;
- default:
- break;
- }
-}
-
-function DW_TESTS_PaintSuiteHeader() {
- switch ( DW_TESTS_OUTPUT ) {
- case DW_TESTS_OUTPUT_XML:
- break;
- case DW_TESTS_OUTPUT_HTML:
- default:
- echo "<h1>Dokuwiki: Unit Test Suite</h1>\n";
- echo "<p><a href='". DOKU_TESTSCRIPT ."?show=groups'>Test groups</a>";
- echo " || <a href='". DOKU_TESTSCRIPT ."?show=cases'>Test cases</a></p>";
- break;
- }
-}
-
-function DW_TESTS_PaintCaseList() {
- switch ( DW_TESTS_OUTPUT ) {
- case DW_TESTS_OUTPUT_XML:
- echo XMLTestManager::getTestCaseList(TEST_CASES);
- break;
- case DW_TESTS_OUTPUT_HTML:
- default:
- echo HTMLTestManager::getTestCaseList(TEST_CASES);
- break;
- }
-}
-
-function DW_TESTS_PaintGroupTestList() {
- switch ( DW_TESTS_OUTPUT ) {
- case DW_TESTS_OUTPUT_XML:
- echo XMLTestManager::getGroupTestList(TEST_GROUPS);
- break;
- case DW_TESTS_OUTPUT_HTML:
- default:
- echo HTMLTestManager::getGroupTestList(TEST_GROUPS);
- break;
- }
-}
-
-function DW_TESTS_PaintPluginTestCaseList() {
- switch ( DW_TESTS_OUTPUT ) {
- case DW_TESTS_OUTPUT_XML:
- echo XMLTestManager::getPluginTestCaseList(TEST_PLUGINS);
- break;
- case DW_TESTS_OUTPUT_HTML:
- default:
- echo HTMLTestManager::getPluginTestCaseList(TEST_PLUGINS);
- break;
- }
-}
-
-function DW_TESTS_PaintPluginGroupTestList() {
- switch ( DW_TESTS_OUTPUT ) {
- case DW_TESTS_OUTPUT_XML:
- echo XMLTestManager::getPluginGroupTestList(TEST_PLUGINS);
- break;
- case DW_TESTS_OUTPUT_HTML:
- default:
- echo HTMLTestManager::getPluginGroupTestList(TEST_PLUGINS);
- break;
- }
-}
-
-function DW_TESTS_PaintFooter() {
- switch ( DW_TESTS_OUTPUT ) {
- case DW_TESTS_OUTPUT_XML:
- break;
- case DW_TESTS_OUTPUT_HTML:
- default:
- $footer = <<<EOD
- </body>
-</html>
-EOD;
- echo $footer;
- break;
- }
-}
-
-/** OUTPUT STARTS HERE **/
-
-// If it's a group test
-if (isset($_GET['group'])) {
- if ('all' == $_GET['group']) {
- TestManager::runAllTests(DW_TESTS_GetReporter());
- } else {
- TestManager::runGroupTest(ucfirst($_GET['group']),
- TEST_GROUPS,
- DW_TESTS_GetReporter());
- }
- DW_TESTS_PaintRunMore();
- exit();
-}
-
-// If it's a plugin group test
-if (isset($_GET['plugin_group'])) {
- if ('all' == $_GET['plugin_group']) {
- TestManager::runAllPluginTests(DW_TESTS_GetReporter());
- } else {
- TestManager::runGroupTest(ucfirst($_GET['plugin_group']),
- TEST_PLUGINS,
- DW_TESTS_GetReporter());
- }
- DW_TESTS_PaintRunMore();
- exit();
-}
-
-// If it's a single test case
-if (isset($_GET['case'])) {
- TestManager::runTestCase($_GET['case'], TEST_CASES, DW_TESTS_GetReporter());
- DW_TESTS_PaintRunMore();
- exit();
-}
-
-// If it's a single plugin test case
-if (isset($_GET['plugin_case'])) {
- TestManager::runTestCase($_GET['plugin_case'], TEST_PLUGINS, DW_TESTS_GetReporter());
- DW_TESTS_PaintRunMore();
- exit();
-}
-
-// Else it's the main page
-DW_TESTS_PaintHeader();
-
-DW_TESTS_PaintSuiteHeader();
-
-if (isset($_GET['show']) && $_GET['show'] == 'cases') {
- DW_TESTS_PaintCaseList();
- DW_TESTS_PaintPluginTestCaseList();
-} else {
- /* no group specified, so list them all */
- DW_TESTS_PaintGroupTestList();
- DW_TESTS_PaintPluginGroupTestList();
-}
-
-DW_TESTS_PaintFooter();
diff --git a/_test/jslint.js b/_test/jslint.js
deleted file mode 100644
index 730f8d8a8..000000000
--- a/_test/jslint.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * Copy to a JavaScript console on your DokuWiki instance and execute
- * Runs JSLint on all our JavaScript files with our settings
- */
-
-(function () {
-var globals = ['jQuery', 'SIG', 'NS', 'JSINFO', 'LANG', 'DOKU_BASE',
- 'DOKU_UHC' // FIXME: Should be moved to JSINFO
- ], files = {
- 'scripts/behaviour.js': null,
- //"scripts/compatibility.js": null,
- "scripts/cookie.js": null,
- //"scripts/delay.js": null,
- //"scripts/drag.js": null,
- "scripts/edit.js": null,
- "scripts/editor.js": null,
- "scripts/helpers.js": null,
- "scripts/hotkeys.js": null,
- "scripts/index.js": null,
- "scripts/linkwiz.js": null,
- "scripts/locktimer.js": null,
- "scripts/media.js": null,
- "scripts/page.js": null,
- "scripts/qsearch.js": null,
- "scripts/script.js": null,
- "scripts/textselection.js": null,
- "scripts/toolbar.js": null,
- "scripts/tree.js": null //,
- //"scripts/tw-sack.js": null
- }, overwrites = {
- "scripts/script.js": {evil: true},
- "scripts/media.js": {devel: true, windows: true},
- "scripts/locktimer.js": {devel: true},
- "scripts/behaviour.js": {devel: true},
- "scripts/helpers.js": {windows: true}
- };
-
-jQuery.ajax({
- dataType: 'script',
- type: "GET",
-// url: 'http://jshint.com/jshint.js'
- url: 'https://raw.github.com/douglascrockford/JSLint/master/jslint.js',
- success: function () {
- for (var file in files) {
- jQuery.ajax({
- cache: false,
- async: false,
- type: "GET",
- url: DOKU_BASE + 'lib/' + file,
- dataType: 'text',
- success: function (res) {
- files[file] = res;
- var data = lint(files[file]);
- jQuery.merge(globals, data.globals);
- }});
- }
-
- for (var file in files) {
- if (!files[file]) {
- continue;
- }
- // FIXME more fine-grained write access
- var data = lint('/*global ' + globals.join(':true, ') +
- ':true*/\n' + files[file], overwrites[file]);
- console.log(file);
- jQuery.each(data.errors || [], function (_, val) {
- if (val === null) {
- return;
- }
- console.error(val.reason + ' (Line ' + (val.line - 1) +
- ', character ' + val.character + '):\n' +
- val.evidence);
- });
- };
- }
-});
-
-function lint(txt, overwrite) {
- JSLINT(txt, jQuery.extend({
- // These settings are necessary
- browser: true,
-
- // Things we probably should learn someday
- sloppy: true, white: true, eqeq: true, nomen: true,
- plusplus: true, regexp: true
- }, overwrite));
- return JSLINT.data();
-}
-})();
diff --git a/_test/lib/cli_reporter.php b/_test/lib/cli_reporter.php
deleted file mode 100644
index 3ad88119d..000000000
--- a/_test/lib/cli_reporter.php
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php // -*- fill-column: 80; tab-width: 4; c-basic-offset: 4 -*-
-
-if (! defined('ST_FAILDETAIL_SEPARATOR')) {
- define('ST_FAILDETAIL_SEPARATOR', "->");
-}
-
-if (! defined('ST_FAILS_RETURN_CODE')) {
- define('ST_FAILS_RETURN_CODE', 1);
-}
-
-if (version_compare(phpversion(), '4.3.0', '<') ||
- php_sapi_name() == 'cgi') {
- define('STDOUT', fopen('php://stdout', 'w'));
- define('STDERR', fopen('php://stderr', 'w'));
- register_shutdown_function(
- create_function('', 'fclose(STDOUT); fclose(STDERR); return true;'));
-}
-
-/**
- * Minimal command line test displayer. Writes fail details to STDERR. Returns 0
- * to the shell if all tests pass, ST_FAILS_RETURN_CODE if any test fails.
- */
-class CLIReporter extends SimpleReporter {
-
- var $faildetail_separator = ST_FAILDETAIL_SEPARATOR;
- var $_failinfo;
-
- function CLIReporter($faildetail_separator = NULL) {
- $this->SimpleReporter();
- if (! is_null($faildetail_separator)) {
- $this->setFailDetailSeparator($faildetail_separator);
- }
- }
-
- function setFailDetailSeparator($separator) {
- $this->faildetail_separator = $separator;
- }
-
- /**
- * Return a formatted faildetail for printing.
- */
- function &_paintTestFailDetail(&$message) {
- $buffer = '';
- $faildetail = $this->getTestList();
- array_shift($faildetail);
- $buffer .= implode($this->faildetail_separator, $faildetail);
- $buffer .= $this->faildetail_separator . "$message\n";
- return $buffer;
- }
-
- /**
- * Paint fail faildetail to STDERR.
- */
- function paintFail($message) {
- parent::paintFail($message);
- fwrite(STDERR, 'FAIL' . $this->faildetail_separator .
- $this->_paintTestFailDetail($message));
- if($this->_failinfo){
- fwrite(STDERR, ' additional info was: '.$this->_failinfo."\n");
- $this->_failinfo = '';
- }
- }
-
- /**
- * reset failinfo
- */
- function paintPass($message) {
- parent::paintPass($message);
- $this->_failinfo = '';
- }
-
- /**
- * Paint exception faildetail to STDERR.
- */
- function paintException($message) {
- parent::paintException($message);
- fwrite(STDERR, 'EXCEPTION' . $this->faildetail_separator .
- $this->_paintTestFailDetail($message));
- }
-
- /**
- * Handle failinfo message
- */
- function paintSignal($type,$message) {
- parent::paintSignal($type,$message);
- if($type = 'failinfo') $this->_failinfo = $message;
- }
-
-
-
- /**
- * Paint a footer with test case name, timestamp, counts of fails and
- * exceptions.
- */
- function paintFooter($test_name) {
- $buffer = $this->getTestCaseProgress() . '/' .
- $this->getTestCaseCount() . ' test cases complete: ';
-
- if (0 < ($this->getFailCount() + $this->getExceptionCount())) {
- $buffer .= $this->getPassCount() . " passes";
- if (0 < $this->getFailCount()) {
- $buffer .= ", " . $this->getFailCount() . " fails";
- }
- if (0 < $this->getExceptionCount()) {
- $buffer .= ", " . $this->getExceptionCount() . " exceptions";
- }
- $buffer .= ".\n";
- fwrite(STDOUT, $buffer);
- exit(ST_FAILS_RETURN_CODE);
- } else {
- fwrite(STDOUT, $buffer . $this->getPassCount() . " passes.\n");
- }
- }
-}
diff --git a/_test/lib/mock_functions.php b/_test/lib/mock_functions.php
deleted file mode 100644
index 9ef5b7b8f..000000000
--- a/_test/lib/mock_functions.php
+++ /dev/null
@@ -1,519 +0,0 @@
-<?php
- /**
- * base include file for SimpleTest
- * @package SimpleTest
- * @subpackage MockFunctions
- * @version $Id: mock_objects.php,v 1.86 2005/09/10 23:01:56 lastcraft Exp $
- */
-
- /**
- * Generates a mock version of a function.
- * Note that all public methods in this class should be called
- * statically
- * Note that you must call the restore method yourself, to remove
- * a mock function implementation after associated tests are
- * complete
- * @package SimpleTest
- * @subpackage MockFunctions
- */
- class MockFunction {
-
- /**
- * Raises an error if you construct MockFunction
- * @access private
- */
- function MockFunction() {
- trigger_error('MockFunction only provides static methods',
- E_USER_ERROR);
- }
-
- /**
- * Generates a mock function
- * @param string $function Function name to mock
- * @access public
- * @return SimpleMockFunction
- * @static
- */
- function & generate($function) {
- $mock = & MockFunction::_instance($function, TRUE);
- $mock->deploy();
- return $mock;
- }
-
- /**
- * Removes the mock function implementation and restores
- * the real implementation (if one existed)
- * @TODO Would be good to have this called automatically
- * @param string $function Function name
- * @access public
- * @static
- */
- function restore($function) {
- $mock = & MockFunction::_instance($function);
- $mock->restore();
- }
-
- /**
- * Fetch a singleton instance of SimpleMockFunction
- * @param string $function Function name
- * @param boolean $fresh Force a fresh instance
- * @access private
- * @static
- */
- function &_instance($function, $fresh = FALSE) {
- static $singleton = array();
-
- $function = strtolower($function);
-
- if ( $fresh ) {
- if ( isset($singleton[$function]) ) {
- unset($singleton[$function]);
- }
- }
-
- if ( !isset($singleton[$function]) ) {
- // TODO: case sensitivity issues
- $class = $function."MockFunction";
- MockFunction::_generateSubClass($class, $function);
- $singleton[$function] = new $class($function);
- }
-
- return $singleton[$function];
- }
-
- /**
- * Required for strict mode and SimpleMock
- * @TODO Should perhaps be placed in SimpleFunctionGenerator
- * @param string $class subclass name
- * @param string $method method name
- * @access private
- * @static
- */
- function _generateSubClass($class, $method) {
- if ( class_exists($class) ) {
- return;
- }
- $code = "class $class extends SimpleMockFunction {\n";
- $code .= " function $method () {}\n";
- $code .= "}\n";
- eval($code);
- }
-
- /**
- * Changes the default wildcard object.
- * @param string $function Function name wildcard applies to
- * @param mixed $wildcard Parameter matching wildcard.
- * @access public
- * @static
- */
- function setWildcard($function, $wildcard) {
- $mock = & MockFunction::_instance($function);
- $mock->setWildcard($wildcard);
- }
-
- /**
- * Fetches the call count of a function so far.
- * @param string $function Function name called.
- * @return Number of calls so far.
- * @access public
- * @static
- */
- function getCallCount($function) {
- $mock = & MockFunction::_instance($function);
- return $mock->getCallCount($function);
- }
-
- /**
- * Sets a return for a parameter list that will
- * be passed by value for all calls to this function.
- * @param string $function Function name.
- * @param mixed $value Result of call passed by value.
- * @param array $args List of parameters to match
- * including wildcards.
- * @access public
- * @static
- */
- function setReturnValue($function, $value, $args = false) {
- $mock = & MockFunction::_instance($function);
- $mock->setReturnValue($function, $value, $args);
- }
-
- /**
- * Sets a return for a parameter list that will
- * be passed by value only when the required call count
- * is reached.
- * @param integer $timing Number of calls in the future
- * to which the result applies. If
- * not set then all calls will return
- * the value.
- * @param string $function Function name.
- * @param mixed $value Result of call passed by value.
- * @param array $args List of parameters to match
- * including wildcards.
- * @access public
- * @static
- */
- function setReturnValueAt($timing, $function, $value, $args = false) {
- $mock = & MockFunction::_instance($function);
- $mock->setReturnValueAt($timing, $function, $value, $args);
- }
-
- /**
- * Sets a return for a parameter list that will
- * be passed by reference for all calls.
- * @param string $function Function name.
- * @param mixed $reference Result of the call will be this object.
- * @param array $args List of parameters to match
- * including wildcards.
- * @access public
- * @static
- */
- function setReturnReference($function, &$reference, $args = false) {
- $mock = & MockFunction::_instance($function);
- $mock->setReturnReference($function, $reference, $args);
- }
-
- /**
- * Sets a return for a parameter list that will
- * be passed by value only when the required call count
- * is reached.
- * @param integer $timing Number of calls in the future
- * to which the result applies. If
- * not set then all calls will return
- * the value.
- * @param string $function Function name.
- * @param mixed $reference Result of the call will be this object.
- * @param array $args List of parameters to match
- * including wildcards.
- * @access public
- * @static
- */
- function setReturnReferenceAt($timing, $function, &$reference, $args = false) {
- $mock = & MockFunction::_instance($function);
- $mock->setReturnReferenceAt($timing, $function, $reference, $args);
- }
-
- /**
- * Sets up an expected call with a set of
- * expected parameters in that call. All
- * calls will be compared to these expectations
- * regardless of when the call is made.
- * @param string $function Function call to test.
- * @param array $args Expected parameters for the call
- * including wildcards.
- * @param string $message Overridden message.
- * @access public
- * @static
- */
- function expectArguments($function, $args, $message = '%s') {
- $mock = & MockFunction::_instance($function);
- $mock->expectArguments($function, $args, $message);
- }
-
- /**
- * Sets up an expected call with a set of
- * expected parameters in that call. The
- * expected call count will be adjusted if it
- * is set too low to reach this call.
- * @param integer $timing Number of calls in the future at
- * which to test. Next call is 0.
- * @param string $function Function call to test.
- * @param array $args Expected parameters for the call
- * including wildcards.
- * @param string $message Overridden message.
- * @access public
- * @static
- */
- function expectArgumentsAt($timing, $function, $args, $message = '%s') {
- $mock = & MockFunction::_instance($function);
- $mock->expectArgumentsAt($timing, $function, $args, $message);
- }
-
- /**
- * Sets an expectation for the number of times
- * a function will be called.
- * @param string $function Function call to test.
- * @param integer $count Number of times it should
- * have been called at tally.
- * @param string $message Overridden message.
- * @access public
- * @static
- */
- function expectCallCount($function, $count, $message = '%s') {
- $mock = & MockFunction::_instance($function);
- $mock->expectCallCount($function, $count, $message);
- }
-
- /**
- * Sets the number of times a function may be called
- * before a test failure is triggered.
- * @param string $function Function call to test.
- * @param integer $count Most number of times it should
- * have been called.
- * @param string $message Overridden message.
- * @access public
- * @static
- */
- function expectMaximumCallCount($function, $count, $message = '%s') {
- $mock = & MockFunction::_instance($function);
- $mock->expectMaximumCallCount($function, $count, $message);
- }
-
- /**
- * Sets the minimum number of times the function must be called
- * otherwise a test failure is triggered
- * @param string $function Function call to test.
- * @param integer $count Least number of times it should
- * have been called.
- * @param string $message Overridden message.
- * @access public
- * @static
- */
- function expectMinimumCallCount($function, $count, $message = '%s') {
- $mock = & MockFunction::_instance($function);
- $mock->expectMinimumCallCount($function, $count, $message);
- }
-
- /**
- * Convenience method for barring a function
- * call.
- * @param string $function Function call to ban.
- * @param string $message Overridden message.
- * @access public
- * @static
- */
- function expectNever($function, $message = '%s') {
- $mock = & MockFunction::_instance($function);
- $mock->expectNever($function, $message);
- }
-
- /**
- * Convenience method for a single function
- * call.
- * @param string $function Function call to track.
- * @param array $args Expected argument list or
- * false for any arguments.
- * @param string $message Overridden message.
- * @access public
- * @static
- */
- function expectOnce($function, $args = false, $message = '%s') {
- $mock = & MockFunction::_instance($function);
- $mock->expectOnce($function, $args, $message);
- }
-
- /**
- * Convenience method for requiring a function
- * call.
- * @param string $function Function call to track.
- * @param array $args Expected argument list or
- * false for any arguments.
- * @param string $message Overridden message.
- * @access public
- * @static
- */
- function expectAtLeastOnce($function, $args = false, $message = '%s') {
- $mock = & MockFunction::_instance($function);
- $mock->expectAtLeastOnce($function, $args, $message);
- }
-
- function atTestEnd($function) {
- $mock = & MockFunction::_instance($function);
- $mock->atTestEnd($function);
- }
-
- }
-
- /**
- * Represents a single, mocked function, tracking calls made to it
- * @package SimpleTest
- * @subpackage MockFunctions
- */
- class SimpleMockFunction extends SimpleMock {
-
- var $_is_mocked = FALSE;
- var $_generator;
-
- /**
- * Sets up the mock, creating a generator depending on whether
- * the function is already declared
- * @param string $function Name of function being mocked
- */
- function SimpleMockFunction($function) {
-
- SimpleMock :: SimpleMock();
-
- if ( function_exists($function) ) {
- $this->_generator = new SimpleDeclaredFunctionGenerator($function);
- } else {
- $this->_generator = new SimpleUndeclaredFunctionGenerator($function);
- }
-
- }
-
- /**
- * Deploys the mock function implementation into PHP's function
- * table, replacing any existing implementation
- * @access public
- */
- function deploy() {
-
- if ( !$this->_is_mocked ) {
-
- $this->_is_mocked = TRUE;
- $this->_generator->deploy();
-
- }
-
- }
-
- /**
- * Restores the state of PHP's function table to that before
- * the mock function was deployed. Removes the mock function
- * implementation and restores any existing implementation of
- * that function
- * @access public
- */
- function restore() {
-
- if ( $this->_is_mocked ) {
-
- $this->_is_mocked = FALSE;
- $this->_generator->restore();
-
- }
-
- }
-
- }
-
- /**
- * Base class for deploying and restoring from mock functions
- * @package SimpleTest
- * @subpackage MockFunctions
- * @abstract
- */
- class SimpleFunctionGenerator {
-
- var $_function;
-
- /**
- * @TODO Validate the function name (as it's being used in eval)
- * @TODO Add list of illegal functions (ones which must not be mocked
- * as they will break SimpleTest, which uses them)
- * @param string $function Name of function being mocked
- */
- function SimpleFunctionGenerator($function) {
- $this->_function = $function;
- }
-
- /**
- * Generates the mock function implementation, using eval
- * @access private
- */
- function _generateMockFunction() {
- $code = "function " . $this->_function . "() {\n";
- $code .= " \$args = func_get_args();\n";
- $code .= " \$mock = & MockFunction::_instance('".$this->_function."');\n";
- $code .= " \$result = &\$mock->_invoke(\"".$this->_function."\", \$args);\n";
- $code .= " return \$result;\n";
- $code .= "}\n";
- eval($code);
- }
- }
-
- /**
- * Mock function generator for functions which have already been declared
- * @package SimpleTest
- * @subpackage MockFunctions
- */
- class SimpleDeclaredFunctionGenerator extends SimpleFunctionGenerator {
-
- var $_tmp_function = NULL;
-
- /**
- * Invokes the _generateTmpFnFname
- * @param string $function Name of function being mocked
- */
- function SimpleDeclaredFunctionGenerator($function) {
-
- SimpleFunctionGenerator::SimpleFunctionGenerator($function);
- $this->_generateTmpFnFname();
-
- }
-
- /**
- * Generates a temporary name for the declared function implementation
- * which is will be renamed to while the mock function is in use
- * @access private
- */
- function _generateTmpFnFname() {
- static $count = 1;
- $this->_tmp_function = 'tmp_'.md5(time().$this->_function.$count);
- $count++;
- }
-
- /**
- * Deploys the mock function implementation
- * @access public
- */
- function deploy() {
-
- runkit_function_rename(
- $this->_function,
- $this->_tmp_function
- ) or
- trigger_error('Error archiving real function implementation',
- E_USER_ERROR);
-
- $this->_generateMockFunction();
- }
-
- /**
- * Removes the mock function implementation and restores
- * the previously declared implementation
- * @access public
- */
- function restore() {
-
- runkit_function_remove($this->_function) or
- trigger_error('Error removing mock function',
- E_USER_ERROR);
-
- runkit_function_rename(
- $this->_tmp_function,
- $this->_function
- ) or
- trigger_error('Error restoring real function',
- E_USER_ERROR);
- }
- }
-
- /**
- * Mock function generator for functions which have not
- * already been declared
- * @package SimpleTest
- * @subpackage MockFunctions
- */
- class SimpleUndeclaredFunctionGenerator extends SimpleFunctionGenerator {
-
- /**
- * Deploys the mock function implementation
- * @access public
- */
- function deploy() {
- $this->_generateMockFunction();
- }
-
- /**
- * Removes the mock function implementation
- * @access public
- */
- function restore() {
- runkit_function_remove($this->_function) or
- trigger_error('Error removing mock function',
- E_USER_ERROR);
- }
-
- }
-
diff --git a/_test/lib/rss_writer_class.php b/_test/lib/rss_writer_class.php
deleted file mode 100644
index 684acfcfa..000000000
--- a/_test/lib/rss_writer_class.php
+++ /dev/null
@@ -1,369 +0,0 @@
-<?php
-if(!defined("METAL_LIBRARY_XML_RSS_WRITER_CLASS"))
-{
- define("METAL_LIBRARY_XML_RSS_WRITER_CLASS",1);
-
-/*
- *
- * Copyright � (C) Manuel Lemos 2002
- *
- * @(#) $Id: rss_writer_class.php,v 1.5 2005/08/20 09:46:06 pachanga Exp $
- *
- */
-
-class rss_writer_class extends xml_writer_class
-{
- /*
- * Protected variables
- *
- */
- var $root="";
- var $channel="";
- var $image="";
- var $textinput="";
- var $items=0;
- var $itemsequence="";
-
- /*
- * Public variables
- *
- */
- var $specification="1.0";
- var $about="";
- var $rssnamespaces=array();
- var $allownoitems=0;
- var $generatedcomment="Generated by: http://www.phpclasses.org/rsswriter";
-
-
- /*
- * Protected functions
- *
- */
- Function addrssproperties(&$properties,$parent,&$required,&$optional,$scope)
- {
- $noattributes=array();
- $required_properties=0;
- Reset($properties);
- $end=(GetType($property=Key($properties))!="string");
- for(;!$end;)
- {
- if(IsSet($required[$property]))
- {
- if($required[$property])
- {
- $this->error=("required ".$scope." property \"".$property."\" is already set");
- return 0;
- }
- $required[$property]=1;
- $required_properties++;
- }
- else
- {
- if(IsSet($optional[$property]))
- {
- if($optional[$property])
- {
- $this->error=("optional ".$scope." property \"".$property."\" is already set");
- return 0;
- }
- $optional[$property]=1;
- }
- else
- {
- if(GetType($colon=strpos($property,":",0))=="integer")
- {
- $namespace=substr($property,0,$colon);
- if(!(!strcmp($namespace,"rdf") || IsSet($this->rssnamespaces[$namespace])))
- $this->error=("the name space of property \"".$property."\" was not declared");
- }
- else
- $this->error=("\"".$property."\" is not a supported ".$scope." property");
- }
- }
- if(!($this->adddatatag($property,$noattributes,$properties[$property],$parent,$path)))
- return 0;
- Next($properties);
- $end=(GetType($property=Key($properties))!="string");
- }
- if($required_properties<count($required))
- {
- Reset($required);
- $end=(GetType($property=Key($required))!="string");
- for(;!$end;)
- {
- if(!($required[$property]))
- {
- $this->error=("it was not specified the required ".$scope." property \"".$property."\"");
- return 0;
- }
- Next($required);
- $end=(GetType($property=Key($required))!="string");
- }
- }
- return 1;
- }
-
- /*
- * Public functions
- *
- */
- Function addchannel(&$properties)
- {
- if(strcmp($this->error,""))
- return 0;
- if(strcmp($this->channel,""))
- {
- $this->error="a channel was already added";
- return 0;
- }
- $channel_attributes=array();
- switch($this->specification)
- {
- case "0.9":
- $root="rdf:RDF";
- $attributes=array("xmlns:rdf"=>"http://www.w3.org/1999/02/22-rdf-syntax-ns#","xmlns"=>"http://my.netscape.com/rdf/simple/0.9/");
- $required=array("description"=>0,"link"=>0,"title"=>0);
- $optional=array();
- break;
- case "0.91":
- $root="rss";
- $attributes=array("version"=>$this->specification);
- $required=array("description"=>0,"language"=>0,"link"=>0,"title"=>0);
- $optional=array("copyright"=>0,"docs"=>0,"lastBuildDate"=>0,"managingEditor"=>0,"pubDate"=>0,"rating"=>0,"webMaster"=>0);
- break;
- case "1.0":
- if(!strcmp($this->about,""))
- {
- $this->error="it was not specified the about URL attribute";
- return 0;
- }
- $root="rdf:RDF";
- $attributes=array("xmlns:rdf"=>"http://www.w3.org/1999/02/22-rdf-syntax-ns#","xmlns"=>"http://purl.org/rss/1.0/");
- Reset($this->rssnamespaces);
- $end=(GetType($namespace=Key($this->rssnamespaces))!="string");
- for(;!$end;)
- {
- if(!strcmp($namespace,"rdf"))
- {
- $this->error="the rdf namespace is being redeclared";
- return 0;
- }
- $attributes[("xmlns:".$namespace)]=$this->rssnamespaces[$namespace];
- Next($this->rssnamespaces);
- $end=(GetType($namespace=Key($this->rssnamespaces))!="string");
- }
- $channel_attributes=array("rdf:about"=>$this->about);
- $required=array("description"=>0,"link"=>0,"title"=>0);
- $optional=array();
- break;
- default:
- $this->error="it was not specified a supported RSS specification version";
- return 0;
- }
- $this->addtag($root,$attributes,"",$path,1);
- $this->root=$path;
- if(!($this->addtag("channel",$channel_attributes,$this->root,$path,1)))
- return 0;
- if(!($this->addrssproperties($properties,$path,$required,$optional,"channel")))
- return 0;
- $this->channel=$path;
- return 1;
- }
-
- Function additem(&$properties)
- {
- if(strcmp($this->error,""))
- return 0;
- if(!strcmp($this->channel,""))
- {
- $this->error="the channel was not yet added";
- return 0;
- }
- if(strcmp($this->textinput,""))
- {
- $this->error="items can not be added to the channel after defining the textinput";
- return 0;
- }
- $attributes=array();
- switch($this->specification)
- {
- case "0.9":
- $parent=$this->root;
- break;
- case "0.91":
- $parent=$this->channel;
- break;
- case "1.0":
- if(IsSet($properties["link"]))
- $attributes["rdf:about"]=$properties["link"];
- $parent=$this->root;
- break;
- default:
- $this->error="it was not specified a supported RSS specification version";
- return 0;
- }
- if(!($this->addtag("item",$attributes,$parent,$path,1)))
- return 0;
- $required=array("link"=>0,"title"=>0);
- $optional=array("description"=>0);
- if(!($this->addrssproperties($properties,$path,$required,$optional,"item")))
- return 0;
- if(!strcmp($this->specification,"1.0"))
- {
- if(!strcmp($this->itemsequence,""))
- {
- $attributes=array();
- if(!($this->addtag("items",$attributes,$this->channel,$path,1) && $this->addtag("rdf:Seq",$attributes,$path,$path,1)))
- return 0;
- $this->itemsequence=$path;
- }
- $attributes=array("rdf:resource"=>$properties["link"]);
- if(!($this->addtag("rdf:li",$attributes,$this->itemsequence,$path,0)))
- return 0;
- }
- $this->items++;
- return 1;
- }
-
- Function addimage(&$properties)
- {
- if(strcmp($this->error,""))
- return 0;
- if(!strcmp($this->channel,""))
- {
- $this->error="the channel was not yet added";
- return 0;
- }
- if(strcmp($this->image,""))
- {
- $this->error="the channel image was already associated";
- return 0;
- }
- if($this->items!=0)
- {
- $this->error="the image can only be defined before adding the channel items";
- return 0;
- }
- $attributes=array();
- switch($this->specification)
- {
- case "0.9":
- $parent=$this->root;
- break;
- case "0.91":
- $parent=$this->channel;
- break;
- case "1.0":
- if(IsSet($properties["url"]))
- $attributes["rdf:about"]=$properties["url"];
- $parent=$this->root;
- break;
- default:
- $this->error="it was not specified a supported RSS specification version";
- return 0;
- }
- if(!($this->addtag("image",$attributes,$parent,$path,1)))
- return 0;
- $this->image=$path;
- $required=array("link"=>0,"title"=>0,"url"=>0);
- $optional=array("description"=>0,"width"=>0,"height"=>0);
- if(!($this->addrssproperties($properties,$this->image,$required,$optional,"image")))
- return 0;
- if(!strcmp($this->specification,"1.0"))
- {
- $attributes=array("rdf:resource"=>$properties["url"]);
- return $this->addtag("image",$attributes,$this->channel,$path,0);
- }
- return 1;
- }
-
- Function addtextinput(&$properties)
- {
- if(strcmp($this->error,""))
- return 0;
- if(!strcmp($this->channel,""))
- {
- $this->error="the channel was not yet added";
- return 0;
- }
- if(strcmp($this->textinput,""))
- {
- $this->error="the channel text input was already associated";
- return 0;
- }
- if($this->items==0 && !$this->allownoitems)
- {
- $this->error="it were not specified any items before defining the channel text input";
- return 0;
- }
- $attributes=array();
- switch($this->specification)
- {
- case "0.9":
- $parent=$this->root;
- break;
- case "0.91":
- $parent=$this->channel;
- break;
- case "1.0":
- if(IsSet($properties["link"]))
- $attributes["rdf:about"]=$properties["link"];
- $parent=$this->root;
- break;
- default:
- $this->error="it was not specified a supported RSS specification version";
- return 0;
- }
- if(!($this->addtag("textinput",$attributes,$parent,$path,1)))
- return 0;
- $this->textinput=$path;
- $required=array("description"=>0,"link"=>0,"name"=>0,"title"=>0);
- $optional=array();
- if(!($this->addrssproperties($properties,$this->textinput,$required,$optional,"textinput")))
- return 0;
- if(!strcmp($this->specification,"1.0"))
- {
- $attributes=array("rdf:resource"=>$properties["link"]);
- return $this->addtag("textinput",$attributes,$this->channel,$path,0);
- }
- return 1;
- }
-
- Function writerss(&$output)
- {
- if(strcmp($this->error,""))
- return 0;
- if(!strcmp($this->channel,""))
- {
- $this->error="it was not defined the RSS channel";
- return 0;
- }
- if($this->items==0 && !$this->allownoitems)
- {
- $this->error="it were not defined any RSS channel items";
- return 0;
- }
- switch($this->specification)
- {
- case "0.9":
- $this->dtdtype="PUBLIC";
- $this->dtddefinition="-//Netscape Communications//DTD RSS 0.9//EN";
- $this->dtdurl="http://my.netscape.com/publish/formats/rss-0.9.dtd";
- break;
- case "0.91":
- $this->dtdtype="PUBLIC";
- $this->dtddefinition="-//Netscape Communications//DTD RSS 0.91//EN";
- $this->dtdurl="http://my.netscape.com/publish/formats/rss-0.91.dtd";
- break;
- case "1.0":
- $this->dtdtype="";
- break;
- default:
- $this->error="it was not specified a supported RSS specification version";
- return 0;
- }
- return $this->write($output);
- }
-};
-
-}
diff --git a/_test/lib/testmanager.php b/_test/lib/testmanager.php
deleted file mode 100644
index 06efd2694..000000000
--- a/_test/lib/testmanager.php
+++ /dev/null
@@ -1,579 +0,0 @@
-<?php // -*- fill-column: 80; tab-width: 4; c-basic-offset: 4 -*-
-/**
-* Lots TODO here...
-*/
-
-define('TEST_GROUPS',realpath(dirname(__FILE__).'/../cases'));
-define('TEST_CASES',realpath(dirname(__FILE__).'/../cases'));
-define('TEST_PLUGINS',realpath(dirname(__FILE__).'/../../lib/plugins'));
-
-// try to load runkit extension
-if (!extension_loaded('runkit') && function_exists('dl')) {
- if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')) {
- @dl('php_runkit.dll');
- } else {
- @dl('runkit.so');
- }
-}
-
-class TestManager {
- var $_testcase_extension = '.test.php';
- var $_grouptest_extension = '.group.php';
-
- function setup() {
- $ini_file = realpath(dirname(__FILE__).'/../tests.ini');
-
- if (! file_exists($ini_file)) {
- trigger_error("Missing configuration file {$ini_file}",
- E_USER_ERROR);
- }
- $config = parse_ini_file($ini_file);
- foreach ($config as $key => $value) {
- define($key, $value);
- }
- TestManager::_installSimpleTest();
-
- list($version) = file(SIMPLE_TEST.'VERSION');
- $version = trim($version);
- if(!version_compare('1.0.1alpha',$version,'<')){
- echo "At least SimpleTest Version 1.0.1alpha is required.";
- echo " Yours is $version\n";
- exit;
- }
- }
-
- function _installSimpleTest() {
- require_once SIMPLE_TEST . 'unit_tester.php';
- require_once SIMPLE_TEST . 'web_tester.php';
- require_once SIMPLE_TEST . 'mock_objects.php';
- require_once 'web.inc.php';
- require_once 'mock_functions.php';
- }
-
- function runAllTests(&$reporter) {
- $manager = new TestManager();
- $test_cases =& $manager->_getTestFileList();
- $test = new GroupTest('All Tests');
- foreach ($test_cases as $test_case) {
- $test->addTestFile($test_case);
- }
- $test->run($reporter);
- }
-
- function runAllPluginTests(&$reporter) {
- $manager = new TestManager();
- $test_cases =& $manager->_getTestFileList(TEST_PLUGINS);
- $test = new GroupTest('All Plugin Tests');
- foreach ($test_cases as $test_case) {
- $test->addTestFile($test_case);
- }
- $test->run($reporter);
- }
-
-
- function runTestCase($testcase_name, $test_case_directory, &$reporter) {
- $manager = new TestManager();
-
- $testcase_name = preg_replace('/[^a-zA-Z0-9_:]/','',$testcase_name);
- $testcase_name = str_replace(':',DIRECTORY_SEPARATOR,$testcase_name);
-
- $testcase_file = $test_case_directory . DIRECTORY_SEPARATOR .
- strtolower($testcase_name) . $manager->_testcase_extension;
-
- if (! file_exists($testcase_file)) {
- trigger_error("Test case {$testcase_file} cannot be found",
- E_USER_ERROR);
- }
-
- $test = new GroupTest("Individual test case: " . $testcase_name);
- $test->addTestFile($testcase_file);
- $test->run($reporter);
- }
-
- function runTestFile($testcase_file, &$reporter) {
- $manager = new TestManager();
-
- if (! file_exists($testcase_file)) {
- trigger_error("Test case {$testcase_file} cannot be found",
- E_USER_ERROR);
- }
-
- $test = new GroupTest("Individual test case: " . $testcase_file);
- $test->addTestFile($testcase_file);
- $test->run($reporter);
- }
-
- function runGroupTest($group_test_name, $group_test_directory, &$reporter) {
- $manager = new TestManager();
- $group_test_name = preg_replace('/[^a-zA-Z0-9_:]/','',$group_test_name);
- $group_test_name = str_replace(':',DIRECTORY_SEPARATOR,$group_test_name);
- $file_path = $group_test_directory . DIRECTORY_SEPARATOR .
- strtolower($group_test_name) . $manager->_grouptest_extension;
-
- if (! file_exists($file_path)) {
- trigger_error("Group test {$group_test_name} cannot be found at {$file_path}",
- E_USER_ERROR);
- }
-
- require_once $file_path;
- $test = new GroupTest($group_test_name . ' group test');
- foreach ($manager->_getGroupTestClassNames($file_path) as $group_test) {
- $test->addTestCase(new $group_test());
- }
- $test->run($reporter);
- }
-
- function addTestCasesFromDirectory(&$group_test, $directory = '.') {
- $manager = new TestManager();
- $test_cases =& $manager->_getTestFileList($directory);
- foreach ($test_cases as $test_case) {
- $group_test->addTestFile($test_case);
- }
- }
-
- function &getTestCaseList($directory = '.') {
- $manager = new TestManager();
- return $manager->_getTestCaseList($directory);
- }
-
- function &_getTestCaseList($directory = '.') {
- $file_list =& $this->_getTestFileList($directory);
- $testcases = array();
- foreach ($file_list as $testcase_file) {
- $case = str_replace($this->_testcase_extension, '',$testcase_file);
- $case = str_replace(TEST_GROUPS . DIRECTORY_SEPARATOR, '', $case);
- $case = str_replace(TEST_PLUGINS . DIRECTORY_SEPARATOR, '', $case);
- $case = str_replace(DIRECTORY_SEPARATOR, ':', $case);
- $testcases[$testcase_file] = $case;
- }
- return $testcases;
- }
-
- function &_getTestFileList($directory = '.') {
- return $this->_getRecursiveFileList($directory,
- array(&$this, '_isTestCaseFile'));
- }
-
- function &getPluginTestCaseList($directory = '.') {
- $manager = new TestManager();
- return $manager->_getTestCaseList($directory);
- }
-
- function &getPluginGroupTestList($directory = '.') {
- $manager = new TestManager();
- return $manager->_getTestGroupList($directory);
- }
-
- function &getGroupTestList($directory = '.') {
- $manager = new TestManager();
- return $manager->_getTestGroupList($directory);
- }
-
- function &_getTestGroupFileList($directory = '.') {
- return $this->_getRecursiveFileList($directory,
- array(&$this, '_isTestGroupFile'));
- }
-
- function &_getTestGroupList($directory = '.') {
- $file_list =& $this->_getTestGroupFileList($directory);
- $grouptests = array();
- foreach ($file_list as $grouptest_file) {
- $group = str_replace($this->_grouptest_extension, '',$grouptest_file);
- $group = str_replace(TEST_GROUPS . DIRECTORY_SEPARATOR, '', $group);
- $group = str_replace(TEST_PLUGINS . DIRECTORY_SEPARATOR, '', $group);
- $group = str_replace(DIRECTORY_SEPARATOR, ':', $group);
- $grouptests[$grouptest_file] = $group;
- }
- sort($grouptests);
- return $grouptests;
- }
-
- function &_getGroupTestClassNames($grouptest_file) {
- $file = implode("\n", file($grouptest_file));
- preg_match("~lass\s+?(.*)\s+?extends .*?GroupTest~", $file, $matches);
- if (! empty($matches)) {
- unset($matches[0]);
- return $matches;
- } else {
- return array();
- }
- }
-
- function &_getRecursiveFileList($directory = '.', $file_test_function) {
- $dh = opendir($directory);
- if (! is_resource($dh)) {
- trigger_error("Couldn't open {$directory}", E_USER_ERROR);
- }
-
- $file_list = array();
- while ($file = readdir($dh)) {
- $file_path = $directory . DIRECTORY_SEPARATOR . $file;
-
- if (0 === strpos($file, '.')) continue;
-
- if (is_dir($file_path)) {
- $file_list =
- array_merge($file_list,
- $this->_getRecursiveFileList($file_path,
- $file_test_function));
- }
- if ($file_test_function[0]->$file_test_function[1]($file)) {
- $file_list[] = $file_path;
- }
- }
- closedir($dh);
- return $file_list;
- }
-
- function _isTestCaseFile($file) {
- return $this->_hasExpectedExtension($file, $this->_testcase_extension);
- }
-
- function _isTestGroupFile($file) {
- return $this->_hasExpectedExtension($file, $this->_grouptest_extension);
- }
-
- function _hasExpectedExtension($file, $extension) {
- return $extension ==
- strtolower(substr($file, (0 - strlen($extension))));
- }
-}
-
-/**
-* @package WACT_TESTS
-*/
-class CLITestManager extends TestManager {
- function &getGroupTestList($directory = '.') {
- $manager = new CLITestManager();
- $group_tests =& $manager->_getTestGroupList($directory);
-
- $buffer = "Available grouptests:\n";
- foreach ($group_tests as $group_test) {
- $buffer .= " " . $group_test . "\n";
- }
- return $buffer . "\n";
- }
-
- function &getTestCaseList($directory = '.') {
- $manager = new CLITestManager();
- $test_cases =& $manager->_getTestCaseList($directory);
-
- $buffer = "Available test cases:\n";
- foreach ($test_cases as $test_case) {
- $buffer .= " " . $test_case . "\n";
- }
- return $buffer . "\n";
- }
-
- function &getPluginTestCaseList($directory = '.') {
- $manager = new CLITestManager();
- $test_cases =& $manager->_getTestCaseList($directory);
-
- $buffer = "Available test cases:\n";
- foreach ($test_cases as $test_case) {
- $buffer .= " " . $test_case . "\n";
- }
- return $buffer . "\n";
- }
-
- function &getPluginGroupTestList($directory = '.') {
- $manager = new CLITestManager();
- $test_cases =& $manager->_getTestGroupList($directory);
-
- $buffer = "Available test cases:\n";
- foreach ($test_cases as $test_case) {
- $buffer .= " " . $test_case . "\n";
- }
- return $buffer . "\n";
- }
-
-}
-
-class HTMLTestManager extends TestManager {
- var $_url;
-
- function HTMLTestManager() {
- $this->_url = $_SERVER['PHP_SELF'];
- }
-
- function getBaseURL() {
- return $this->_url;
- }
-
- function &getGroupTestList($directory = '.') {
- $manager = new HTMLTestManager();
- $group_tests =& $manager->_getTestGroupList($directory);
- if (1 > count($group_tests)) {
- return "<p>No test groups set up!</p>";
- }
- $buffer = "<p>Available test groups:</p>\n<ul>";
- $buffer .= "<li><a href='" . $manager->getBaseURL() . "?group=all'>All tests</a></li>\n";
- foreach ($group_tests as $group_test) {
- $buffer .= "<li><a href='" . $manager->getBaseURL() . "?group={$group_test}'>" .
- $group_test . "</a></li>\n";
- }
-
- $buffer .= "</ul>\n";
- return $buffer;
- }
-
- function &getTestCaseList($directory = '.') {
- $manager = new HTMLTestManager();
- $testcases =& $manager->_getTestCaseList($directory);
-
- if (1 > count($testcases)) {
- return "<p>No test cases set up!</p>";
- }
- $buffer = "<p>Available test cases:</p>\n<ul>";
- foreach ($testcases as $testcase) {
- $buffer .= "<li><a href='" . $manager->getBaseURL() .
- "?case=" . urlencode($testcase) . "'>" .
- $testcase . "</a></li>\n";
- }
-
- $buffer .= "</ul>\n";
- return $buffer;
- }
-
- function &getPluginTestCaseList($directory = '.') {
- $manager = new HTMLTestManager();
- $testcases =& $manager->_getTestCaseList($directory);
-
- if (1 > count($testcases)) {
- return "<p>No plugin test cases set up!</p>";
- }
- $buffer = "<p>Available plugin test cases:</p>\n<ul>";
- foreach ($testcases as $testcase) {
- $buffer .= "<li><a href='" . $manager->getBaseURL() .
- "?plugin_case=" . urlencode($testcase) . "'>" .
- $testcase . "</a></li>\n";
- }
-
- $buffer .= "</ul>\n";
- return $buffer;
- }
-
- function &getPluginGroupTestList($directory = '.') {
- $manager = new HTMLTestManager();
- $group_tests =& $manager->_getTestGroupList($directory);
- if (1 > count($group_tests)) {
- return "<p>No plugin test groups set up!</p>";
- }
- $buffer = "<p>Available plugin groups:</p>\n<ul>";
- $buffer .= "<li><a href='" . $manager->getBaseURL() . "?plugin_group=all'>All tests</a></li>\n";
- foreach ($group_tests as $group_test) {
- $buffer .= "<li><a href='" . $manager->getBaseURL() . "?plugin_group={$group_test}'>" .
- $group_test . "</a></li>\n";
- }
-
- $buffer .= "</ul>\n";
- return $buffer;
- }
-
-}
-
-/**
-* @package WACT_TESTS
-*/
-class XMLTestManager extends HTMLTestManager {
-
- function XMLTestManager() {
- parent::HTMLTestManager();
- }
-
- function &getGroupTestList($directory = '.') {
-
- $manager = new XMLTestManager();
- $group_tests =& $manager->_getTestGroupList($directory);
-
- $rss = & $manager->_getRssWriter();
-
- if (1 > count($group_tests)) {
- $rss->writeRss($output);
- return $output;
- }
-
- $properties["title"]="All Tests";
- $properties["description"]="All Tests";
- $properties["link"]='http://'.$_SERVER['SERVER_NAME'].
- $manager->getBaseURL()."?group=all&output=xml";
-
- $rss->additem($properties);
-
- foreach ($group_tests as $group_test) {
- $properties["title"]=$group_test;
- $properties["description"]=$group_test;
- $properties["link"]='http://'.$_SERVER['SERVER_NAME'].
- $manager->getBaseURL().
- "?group={$group_test}&output=xml";
-
- $rss->additem($properties);
- }
- if ( !$rss->writeRss($output) ) {
- die ( $rss->error );
- }
- return $output;
-
- }
-
- function &getTestCaseList($directory = '.') {
-
- $manager = new XMLTestManager();
- $testcases =& $manager->_getTestCaseList($directory);
-
- $rss = & $manager->_getRssWriter();
-
- if (1 > count($testcases)) {
- $rss->writeRss($output);
- return $output;
- }
-
- foreach ($testcases as $testfile => $testcase) {
- $properties["title"]=$testcase;
- $properties["description"]=$testcase;
- $properties["link"]='http://'.$_SERVER['SERVER_NAME'].
- $manager->getBaseURL()."?case=" .
- urlencode($testcase) . "&output=xml";
-
- // Comment this out for performance?
- $properties["dc:date"]=gmdate("Y-m-d\TH:i:sO",filemtime($testfile));
-
- $rss->additem($properties);
- }
-
- $rss->writeRss($output);
- return $output;
- }
-
- function &_getRssWriter() {
-
- $url = 'http://'.$_SERVER['SERVER_NAME'].str_replace('index.php','',$_SERVER['PHP_SELF']);
-
- require_once TEST_ROOT . '/lib/xml_writer_class.php';
- require_once TEST_ROOT . '/lib/rss_writer_class.php';
-
- $rss_writer_object= new rss_writer_class();
- $rss_writer_object->specification="1.0";
- $rss_writer_object->about=$url."index.php?output=xml";
- $rss_writer_object->stylesheet=$url."rss2html.xsl";
- $rss_writer_object->rssnamespaces["dc"]="http://purl.org/dc/elements/1.1/";
-
- // Channel Properties
- $properties=array();
- $properties["title"]="Dokuwiki Unit Test Cases";
- $properties["description"]="Dokuwiki Unit Test Cases";
- $properties["link"]="http://wiki.splitbrain.org/";
- $properties["dc:date"]=gmdate("Y-m-d\TH:i:sO");
- $rss_writer_object->addchannel($properties);
-
- // Logo like this (if we had one)
- /*
- $properties=array();
-
- $properties["link"]="http://www.phpclasses.org/";
- $properties["title"]="PHP Classes repository logo";
- $properties["description"]="Repository of components and other resources for PHP developers";
- $rss_writer_object->addimage($properties);
- */
-
- return $rss_writer_object;
- }
-
-}
-
-/**
-* @package WACT_TESTS
-*/
-class RemoteTestManager extends TestManager {
-
- function RemoteTestManager() {
- RemoteTestManager::_installSimpleTest();
- }
-
- function _installSimpleTest() {
- require_once SIMPLE_TEST . 'remote.php';
- }
-
- function runAllTests(&$reporter, $url = FALSE) {
- $groups = RemoteTestManager::getGroupTestList($url);
- $T = new RemoteTestCase($groups['All Tests']);
- $T->run($reporter);
- }
-
- function runTestUrl($case_url,& $reporter, $url = FALSE) {
- RemoteTestManager::_installSimpleTest();
- $T = new RemoteTestCase($case_url);
- $T->run($reporter);
- }
-
- function runTestCase($case_id,& $reporter, $url = FALSE) {
- $cases = RemoteTestManager::getTestCaseList($url);
- if ( !array_key_exists($case_id, $cases) ) {
- trigger_error("Unknown test id $case_id\n",E_USER_ERROR);
- }
- $T = new RemoteTestCase($cases[$case_id]);
- $T->run($reporter);
- }
-
- function runGroupTest($group_name, &$reporter, $url = FALSE) {
- $groups = RemoteTestManager::getGroupTestList($url);
- if ( !array_key_exists($group_name, $groups) ) {
- trigger_error("Unknown group $group_name\n",E_USER_ERROR);
- }
- $T = new RemoteTestCase($groups[$group_name]);
- $T->run($reporter);
- }
-
- function & getGroupTestList($url = FALSE) {
-
- if ( !$url ) {
- $url = REMOTE_TEST_URL;
- }
-
- $url .= '?output=xml';
-
- $manager = new RemoteTestManager();
- $rss = & $manager->_getRssReader($url);
-
- $groupList = array();
-
- foreach ($rss->getItems() as $item) {
- $groupList[$item['title']] = $item['link'];
- }
-
- return $groupList;
- }
-
- function &getTestCaseList($url = FALSE) {
- if ( !$url ) {
- $url = REMOTE_TEST_URL;
- }
-
- $url .= '?show=cases&output=xml';
- $manager = new RemoteTestManager();
- $rss = & $manager->_getRssReader($url);
-
- $caseList = array();
-
- foreach ($rss->getItems() as $item) {
- $caseList[$item['title']] = $item['link'];
- }
-
- return $caseList;
- }
-
- function &_getRssReader($url) {
- require_once "XML/RSS.php";
-
- $rss_reader = new XML_RSS($url);
-
- $status = $rss_reader->parse();
-
- if (PEAR::isError($status) ) {
- trigger_error($status->getMessage(),E_USER_WARNING);
- }
-
- return $rss_reader;
- }
-
-}
diff --git a/_test/lib/unittest.php b/_test/lib/unittest.php
deleted file mode 100644
index 220aa6c1b..000000000
--- a/_test/lib/unittest.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-class Doku_UnitTestCase extends UnitTestCase {
-}
-class Doku_GroupTest extends GroupTest {
-}
diff --git a/_test/lib/web.inc.php b/_test/lib/web.inc.php
deleted file mode 100644
index 7ca70f204..000000000
--- a/_test/lib/web.inc.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
-* @package WACT_TESTS
-* @version $Id: web.inc.php,v 1.6 2005/08/20 09:46:06 pachanga Exp $
-*/
-
-SimpleTestOptions::ignore('DWWebTestCase');
-
-class DWWebTestCase extends WebTestCase {
-
- function assertNormalPage() {
- $this->assertResponse(array(200));
- $this->assertNoUnwantedPattern('/Warning:/i');
- $this->assertNoUnwantedPattern('/Error:/i');
- $this->assertNoUnwantedPattern('/Fatal error/i');
- }
-
- function assertWantedLiteral($str) {
- $this->assertWantedPattern('/' . preg_quote($str, '/'). '/');
- }
-
- function assertNoUnWantedLiteral($str) {
- $this->assertNoUnWantedPattern('/' . preg_quote($str, '/'). '/');
- }
-
- function &_fileToPattern($file) {
- $file_as_array = file($file);
- $pattern = '#^';
- foreach ($file_as_array as $line) {
- /* strip trailing newline */
- if ($line[strlen($line) - 1] == "\n") {
- $line = substr($line, 0, strlen($line) - 1);
- }
- $line = preg_quote($line, '#');
-
- /* replace paths with wildcard */
- $line = preg_replace("#'/[^']*#", "'.*", $line);
-
- $pattern .= $line . '\n';
- }
- /* strip final newline */
- $pattern = substr($pattern, 0, strlen($pattern) - 2);
- $pattern .= '$#i';
- return $pattern;
- }
-
-}
diff --git a/_test/lib/xml_writer_class.php b/_test/lib/xml_writer_class.php
deleted file mode 100644
index 97fb1bee0..000000000
--- a/_test/lib/xml_writer_class.php
+++ /dev/null
@@ -1,292 +0,0 @@
-<?php
-if(!defined("METAL_LIBRARY_XML_XML_WRITER_CLASS"))
-{
- define("METAL_LIBRARY_XML_XML_WRITER_CLASS",1);
-
-/*
- *
- * Copyright � (C) Manuel Lemos 2001-2002
- *
- * @(#) $Id: xml_writer_class.php,v 1.5 2005/08/20 09:46:06 pachanga Exp $
- *
- */
-
-class xml_writer_class
-{
- /*
- * Protected variables
- *
- */
- var $structure=array();
- var $nodes=array();
-
- /*
- * Public variables
- *
- */
- var $stylesheet="";
- var $stylesheettype="text/xsl";
- var $dtdtype="";
- var $dtddefinition="";
- var $dtdurl="";
- var $outputencoding="utf-8";
- var $inputencoding="iso-8859-1";
- var $linebreak="\n";
- var $indenttext=" ";
- var $generatedcomment="Generated by: http://www.phpclasses.org/xmlwriter";
- var $error="";
-
-
- /*
- * Protected functions
- *
- */
- Function escapedata($data)
- {
- $position=0;
- $length=strlen($data);
- $escapeddata="";
- for(;$position<$length;)
- {
- $character=substr($data,$position,1);
- $code=Ord($character);
- switch($code)
- {
- case 34:
- $character="&quot;";
- break;
- case 38:
- $character="&amp;";
- break;
- case 39:
- $character="&apos;";
- break;
- case 60:
- $character="&lt;";
- break;
- case 62:
- $character="&gt;";
- break;
- default:
- if($code<32)
- $character=("&#".strval($code).";");
- break;
- }
- $escapeddata.=$character;
- $position++;
- }
- return $escapeddata;
- }
-
- Function encodedata($data,&$encodeddata)
- {
- if(!strcmp($this->inputencoding,$this->outputencoding))
- $encodeddata=$this->escapedata($data);
- else
- {
- switch(strtolower($this->outputencoding))
- {
- case "utf-8":
- if(!strcmp(strtolower($this->inputencoding),"iso-8859-1"))
- {
- $encoded_data=utf8_encode($this->escapedata($data));
- $encodeddata=$encoded_data;
- }
- else
- {
- $this->error=("can not encode iso-8859-1 data in ".$this->outputencoding);
- return 0;
- }
- break;
- case "iso-8859-1":
- if(!strcmp(strtolower($this->inputencoding),"utf-8"))
- {
- $decoded=utf8_decode($data);
- $encodeddata=$this->escapedata($decoded);
- }
- else
- {
- $this->error=("can not encode utf-8 data in ".$this->outputencoding);
- return 0;
- }
- break;
- default:
- $this->error=("can not encode data in ".$this->inputencoding);
- return 0;
- }
- }
- return 1;
- }
-
- Function writetag(&$output,$path,$indent)
- {
- $tag=$this->structure[$path]["Tag"];
- $output.=("<".$tag);
- $attributecount=count($this->structure[$path]["Attributes"]);
- if($attributecount>0)
- {
- $attributes=$this->structure[$path]["Attributes"];
- Reset($attributes);
- $end=(GetType($key=Key($attributes))!="string");
- for(;!$end;)
- {
- $output.=(" ".$key."=\"".$attributes[$key]."\"");
- Next($attributes);
- $end=(GetType($key=Key($attributes))!="string");
- }
- }
- $elements=$this->structure[$path]["Elements"];
- if($elements>0)
- {
- $output.=">";
- $doindent=$this->structure[$path]["Indent"];
- $elementindent=(($doindent) ? $this->linebreak.$indent.$this->indenttext : "");
- $element=0;
- for(;$element<$elements;)
- {
- $elementpath=($path.",".strval($element));
- $output.=$elementindent;
- if(IsSet($this->nodes[$elementpath]))
- {
- if(!($this->writetag($output,$elementpath,$indent.$this->indenttext)))
- return 0;
- }
- else
- $output.=$this->structure[$elementpath];
- $element++;
- }
- $output.=((($doindent) ? $this->linebreak.$indent : "")."</".$tag.">");
- }
- else
- $output.="/>";
- return 1;
- }
-
- /*
- * Public functions
- *
- */
- Function write(&$output)
- {
- if(strcmp($this->error,""))
- return 0;
- if(!(IsSet($this->structure["0"])))
- {
- $this->error="XML document structure is empty";
- return 0;
- }
- $output=("<?xml version=\"1.0\" encoding=\"".$this->outputencoding."\"?>".$this->linebreak);
- if(strcmp($this->dtdtype,""))
- {
- $output.=("<!DOCTYPE ".$this->structure["0"]["Tag"]." ");
- switch($this->dtdtype)
- {
- case "INTERNAL":
- if(!strcmp($this->dtddefinition,""))
- {
- $this->error="it was not specified a valid internal DTD definition";
- return 0;
- }
- $output.=("[".$this->linebreak.$this->dtddefinition.$this->linebreak."]");
- break;
- case "SYSTEM":
- if(!strcmp($this->dtdurl,""))
- {
- $this->error="it was not specified a valid system DTD url";
- return 0;
- }
- $output.="SYSTEM";
- if(strcmp($this->dtddefinition,""))
- $output.=(" \"".$this->dtddefinition."\"");
- $output.=(" \"".$this->dtdurl."\"");
- break;
- case "PUBLIC":
- if(!strcmp($this->dtddefinition,""))
- {
- $this->error="it was not specified a valid public DTD definition";
- return 0;
- }
- $output.=("PUBLIC \"".$this->dtddefinition."\"");
- if(strcmp($this->dtdurl,""))
- $output.=(" \"".$this->dtdurl."\"");
- break;
- default:
- $this->error="it was not specified a valid DTD type";
- return 0;
- }
- $output.=(">".$this->linebreak);
- }
- if(strcmp($this->stylesheet,""))
- {
- if(!strcmp($this->stylesheettype,""))
- {
- $this->error="it was not specified a valid stylesheet type";
- return 0;
- }
- $output.=("<?xml-stylesheet type=\"".$this->stylesheettype."\" href=\"".$this->stylesheet."\"?>".$this->linebreak);
- }
- if(strcmp($this->generatedcomment,""))
- $output.=("<!-- ".$this->generatedcomment." -->".$this->linebreak);
- return $this->writetag($output,"0","");
- }
-
- Function addtag($tag,&$attributes,$parent,&$path,$indent)
- {
- if(strcmp($this->error,""))
- return 0;
- $path=((!strcmp($parent,"")) ? "0" : ($parent.",".strval($this->structure[$parent]["Elements"])));
- if(IsSet($this->structure[$path]))
- {
- $this->error=("tag with path ".$path." is already defined");
- return 0;
- }
- $encodedattributes=array();
- Reset($attributes);
- $end=(GetType($attribute_name=Key($attributes))!="string");
- for(;!$end;)
- {
- $encodedattributes[$attribute_name]="";
- if(!($this->encodedata($attributes[$attribute_name],$encoded_data)))
- return 0;
- $encodedattributes[$attribute_name]=$encoded_data;
- Next($attributes);
- $end=(GetType($attribute_name=Key($attributes))!="string");
- }
- $this->structure[$path]=array(
- "Tag"=>$tag,
- "Attributes"=>$encodedattributes,
- "Elements"=>0,
- "Indent"=>$indent
- );
- $this->nodes[$path]=1;
- if(strcmp($parent,""))
- $this->structure[$parent]["Elements"]=($this->structure[$parent]["Elements"]+1);
- return 1;
- }
-
- Function adddata($data,$parent,&$path)
- {
- if(strcmp($this->error,""))
- return 0;
- if(!(IsSet($this->structure[$parent])))
- {
- $this->error=("the parent tag path".$path."is not defined");
- return 0;
- }
- if(!strcmp($data,""))
- return 1;
- $path=($parent.",".strval($this->structure[$parent]["Elements"]));
- if(!($this->encodedata($data,$encoded_data)))
- return 0;
- $this->structure[$path]=$encoded_data;
- $this->structure[$parent]["Elements"]=($this->structure[$parent]["Elements"]+1);
- return 1;
- }
-
- Function adddatatag($tag,&$attributes,$data,$parent,&$path)
- {
- return $this->addtag($tag,$attributes,$parent,$path,0) && $this->adddata($data,$path,$datapath);
- }
-};
-
-}
diff --git a/_test/phpunit.xml b/_test/phpunit.xml
new file mode 100644
index 000000000..13676f207
--- /dev/null
+++ b/_test/phpunit.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit
+ bootstrap="bootstrap.php"
+ convertNoticesToExceptions="false">
+
+ <testsuites>
+ <testsuite name="DokuWiki Tests">
+ <directory suffix=".test.php">tests/</directory>
+ </testsuite>
+ <testsuite name="Plugin Tests">
+ <directory suffix=".test.php">../lib/plugins/*/_test</directory>
+ </testsuite>
+ </testsuites>
+
+ <filter>
+ <whitelist addUncoveredFilesFromWhitelist="false">
+ <directory suffix=".php">../</directory>
+ <exclude>
+ <directory suffix=".php">../_cs/</directory>
+ <directory suffix=".php">../_test/</directory>
+ <directory suffix=".php">../lib/plugins/*/_test/</directory>
+ </exclude>
+ </whitelist>
+ </filter>
+
+</phpunit>
diff --git a/_test/remotetests.php b/_test/remotetests.php
deleted file mode 100755
index 3dd290712..000000000
--- a/_test/remotetests.php
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/usr/bin/php -q
-<?php
-ini_set('memory_limit','128M');
-
-if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
-
-require_once 'lib/testmanager.php';
-TestManager::setup();
-
-function usage() {
- $usage = <<<EOD
-Usage: ./remotetests.php [OPTION]...
-Run the Dokuwiki unit tests remotely executing tests over HTTP and delivering
-results to the command line. If ALL of the test cases pass a count of
-total passes is printed on STDOUT. If ANY of the test cases fail (or raise
-errors) details are printed on STDERR and this script returns a non-zero
-exit code.
- -c --case=NAME specify a test case by it's ID (see -i for list)
- -f --caseurl=NAME specify a test case file (full or relative path)
- -g --group=NAME specify a grouptest. If no grouptest is
- specified, all test cases will be run.
- -i --caselist list individual test cases by their ID
- -l --grouplist list available grouptests
- -s, --separator=SEP set the character(s) used to separate fail
- details to SEP
- -p, --path path to SimpleTest installation
- -h, --help display this help and exit
- -u --url=TEST_URL specify remote server test url (w. index.php)
-
-EOD;
- echo $usage;
- exit(0);
-}
-
-/* default test options */
-$opt_separator = '->';
-$opt_caselist = FALSE;
-$opt_grouplist = FALSE;
-$opt_caseid = FALSE;
-$opt_caseurl = FALSE;
-$opt_groupfile = FALSE;
-$opt_url = FALSE;
-
-include_once(DOKU_INC.'inc/cliopts.php');
-$short_opts = "c:f:g:hils:p:u:";
-$long_opts = array("case=","caselist","help", "caseurl=", "group=", "grouplist", "separator=", "path=","url=");
-$OPTS = Doku_Cli_Opts::getOptions(__FILE__,$short_opts,$long_opts);
-if ( $OPTS->isError() ) {
- fwrite( STDERR, $OPTS->getMessage() . "\n");
- usage($available_grouptests);
- exit(1);
-}
-
-foreach ($OPTS->options as $key => $val) {
- switch ($key) {
- case 'c':
- case 'case':
- $opt_caseid = $val;
- break;
- case 'h':
- case 'help':
- usage();
- break;
- case 'f':
- case 'caseurl':
- $opt_caseurl = $val;
- break;
- case 'g':
- case 'group':
- $opt_groupfile = $val;
- break;
- case 'i':
- case 'caselist':
- $opt_caselist = TRUE;
- break;
- case 'l':
- case 'grouplist':
- $opt_grouplist = TRUE;
- break;
- case 's':
- case 'separator':
- $opt_separator = $val;
- break;
- case 'p':
- case 'path':
- if (file_exists($val)) {
- define('SIMPLE_TEST', $val);
- }
- break;
- case 'u':
- case '--url':
- $opt_url = $val;
- break;
- }
-}
-
-if ( ! $opt_url ) {
- if ( !defined('REMOTE_TEST_URL') ) {
- fwrite( STDERR, "No test URL defined. Either modify tests.ini or use -u option\n");
- exit(1);
- } else {
- $opt_url = REMOTE_TEST_URL;
- }
-}
-
-
-if (!@include_once SIMPLE_TEST . 'reporter.php') {
- if ( defined(SIMPLE_TEST) ) {
- fwrite( STDERR, "Where's Simple Test ?!? Not at ".SIMPLE_TEST." \n");
- } else {
- fwrite( STDERR, "Where's Simple Test ?!? SIMPLE_TEST not even defined!\n");
- }
- exit(1);
-}
-
-require_once 'lib/cli_reporter.php';
-
-/* list grouptests */
-if ($opt_grouplist) {
- $groups = RemoteTestManager::getGroupTestList($opt_url);
- fwrite( STDOUT, "Available grouptests:\n");
- foreach ( array_keys($groups) as $group ) {
- fwrite( STDOUT, $group."\n");
- }
-}
-
-/* list test cases */
-if ($opt_caselist) {
- $cases = RemoteTestManager::getTestCaseList($opt_url);
- fwrite( STDOUT, "Available tests tests:\n");
- foreach ( array_keys($cases) as $case ) {
- fwrite( STDOUT, $case."\n");
- }
-}
-
-/* exit if we've displayed a list */
-if ( $opt_grouplist || $opt_caselist ) {
- exit(0);
-}
-
-/* run a test case given it's URL */
-if ($opt_caseurl) {
- RemoteTestManager::runTestUrl($opt_caseurl, new CLIReporter($opt_separator), $opt_url);
- exit(0);
-}
-
-/* run a test case by id*/
-if ($opt_caseid) {
- RemoteTestManager::runTestCase($opt_caseid, new CLIReporter($opt_separator), $opt_url);
- exit(0);
-}
-
-/* run a grouptest */
-if ($opt_groupfile) {
- RemoteTestManager::runGroupTest(
- $opt_groupfile, new CLIReporter($opt_separator), $opt_url
- );
- exit(0);
-}
-/* run all tests */
-RemoteTestManager::runAllTests(new CLIReporter($opt_separator), $opt_url);
-exit(0);
-?> \ No newline at end of file
diff --git a/_test/rss2html.xsl b/_test/rss2html.xsl
deleted file mode 100644
index ae56d2c20..000000000
--- a/_test/rss2html.xsl
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!--
- @(#) $Id: rss2html.xsl,v 1.1 2004/06/11 22:00:57 harryf Exp $
- -->
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rss="http://purl.org/rss/1.0/" xmlns="http://www.w3.org/1999/xhtml">
-
-<xsl:output method="html"/>
-
-<xsl:template match="/">
-<html>
-<head>
-<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
-<style type="text/css">
-div.channel-title { font-family: sans-serif, arial, helvetica }
-</style>
-<style type="text/css">
-div.image { font-family: sans-serif, arial, helvetica }
-</style>
-<style type="text/css">
-div.image-description { font-family: sans-serif, arial, helvetica }
-</style>
-<style type="text/css">
-div.item-title { font-family: sans-serif, arial, helvetica }
-</style>
-<style type="text/css">
-div.item-description { font-family: sans-serif, arial, helvetica }
-</style>
-<style type="text/css">
-div.textinput-title { font-family: sans-serif, arial, helvetica }
-</style>
-<style type="text/css">
-div.textinput-form { font-family: sans-serif, arial, helvetica }
-</style>
-<title>
-<xsl:for-each select="rdf:RDF/rss:channel">
-<xsl:value-of select="rss:description"/>
-</xsl:for-each>
-</title>
-</head>
-<body>
-
-<xsl:for-each select="rdf:RDF/rss:image">
-<center><div class="image">
-<xsl:element name="a">
- <xsl:attribute name="href"><xsl:value-of select="rss:link"/></xsl:attribute>
- <xsl:element name="img">
- <xsl:attribute name="src"><xsl:value-of select="rss:url"/></xsl:attribute>
- <xsl:attribute name="alt"><xsl:value-of select="rss:title"/></xsl:attribute>
- <xsl:attribute name="border">0</xsl:attribute>
- </xsl:element>
-</xsl:element>
-</div></center>
-<center><div class="image-description">
-<xsl:value-of select="rss:description"/>
-</div></center>
-</xsl:for-each>
-
-<xsl:for-each select="rdf:RDF/rss:channel">
-<center><div class="channel-title">
-<xsl:element name="a">
- <xsl:attribute name="href"><xsl:value-of select="rss:link"/></xsl:attribute>
- <xsl:value-of select="rss:title"/>
- <xsl:text> (</xsl:text>
- <xsl:value-of select="dc:date"/>
- <xsl:text>)</xsl:text>
-</xsl:element>
-</div></center>
-</xsl:for-each>
-
-<ul>
-<hr />
-<xsl:for-each select="rdf:RDF/rss:item">
-<div class="item-title"><li>
-<xsl:element name="a">
- <xsl:attribute name="href"><xsl:value-of select="rss:link"/></xsl:attribute>
- <xsl:value-of select="rss:title"/>
-</xsl:element>
-<xsl:text> (</xsl:text>
-<xsl:value-of select="dc:date"/>
-<xsl:text>)</xsl:text>
-</li></div>
-<div class="item-description"><xsl:value-of select="rss:description"/></div>
-<hr />
-</xsl:for-each>
-</ul>
-
-<xsl:for-each select="rdf:RDF/rss:textinput">
-<center><b><div class="textinput-title"><xsl:value-of select="rss:description"/></div></b></center>
-<xsl:element name="form">
- <xsl:attribute name="action"><xsl:value-of select="rss:link"/></xsl:attribute>
- <xsl:attribute name="method">POST</xsl:attribute>
- <center><div class="textinput-form">
- <xsl:element name="input">
- <xsl:attribute name="name"><xsl:value-of select="rss:name"/></xsl:attribute>
- <xsl:attribute name="type">text</xsl:attribute>
- </xsl:element>
- <xsl:text> </xsl:text>
- <xsl:element name="input">
- <xsl:attribute name="value"><xsl:value-of select="rss:title"/></xsl:attribute>
- <xsl:attribute name="type">submit</xsl:attribute>
- </xsl:element>
-</div></center>
-</xsl:element>
-</xsl:for-each>
-
-</body>
-</html>
-</xsl:template>
-
-</xsl:stylesheet> \ No newline at end of file
diff --git a/_test/runtests.php b/_test/runtests.php
deleted file mode 100755
index 8b93efec3..000000000
--- a/_test/runtests.php
+++ /dev/null
@@ -1,187 +0,0 @@
-#!/usr/bin/php -q
-<?php
-ini_set('memory_limit','128M');
-if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
-define('DOKU_UNITTEST',true);
-
-require_once(DOKU_INC.'inc/init.php');
-require_once(DOKU_INC.'inc/events.php');
-
-define('TEST_ROOT', dirname(__FILE__));
-define('TMPL_FILESCHEME_PATH', TEST_ROOT . '/filescheme/');
-
-require_once 'lib/testmanager.php';
-TestManager::setup();
-
-function usage() {
- $usage = <<<EOD
-Usage: ./runtests.php [OPTION]...
-Run the Dokuwiki unit tests. If ALL of the test cases pass a count of total
-passes is printed on STDOUT. If ANY of the test cases fail (or raise
-errors) details are printed on STDERR and this script returns a non-zero
-exit code.
- -c --case=NAME specify a test case by it's ID (see -i for list)
- --pcase=NAME specify a plugin test case by it's ID
- (see --plugincaselist for list)
- -f --file=NAME specify a test case file (full or relative path)
- -g --group=NAME specify a grouptest. If no grouptest is
- specified, all test cases will be run.
- --pgroup=NAME specify a plugin grouptest. If no grouptest is
- specified, all test cases will be run.
- -i --caselist list individual test cases by their ID
- -l --grouplist list available grouptests
- --plugincaselist list all individual plugin test cases by their ID
- --plugingrouplist list avialable plugin grouptests
- -s, --separator=SEP set the character(s) used to separate fail
- details to SEP
- -p, --path path to SimpleTest installation
- -h, --help display this help and exit
-
-EOD;
- echo $usage;
- exit(0);
-}
-
-/* test options */
-$opt_separator = '->';
-$opt_caselist = FALSE;
-$opt_grouplist = FALSE;
-$opt_plugincaselist = FALSE;
-$opt_plugingrouplist = FALSE;
-$opt_caseid = FALSE;
-$top_plugincaseid = FALSE;
-$opt_casefile = FALSE;
-$opt_groupfile = FALSE;
-$opt_plugingroupfile = FALSE;
-
-include_once(DOKU_INC.'inc/cliopts.php');
-
-$short_opts = "c:f:g:hils:p:";
-$long_opts = array("case=","pcase=","caselist","help", "file=", "group=", "pgroup=", "grouplist", "plugincaselist", "plugingrouplist", "separator=", "path=");
-$OPTS = Doku_Cli_Opts::getOptions(__FILE__,$short_opts,$long_opts);
-if ( $OPTS->isError() ) {
- fwrite( STDERR, $OPTS->getMessage() . "\n");
- usage($available_grouptests);
- exit(1);
-}
-
-foreach ($OPTS->options as $key => $val) {
- switch ($key) {
- case 'c':
- case 'case':
- $opt_caseid = $val;
- break;
- case 'pcase':
- $opt_plugincaseid = $val;
- break;
- case 'h':
- case 'help':
- usage();
- break;
- case 'f':
- case 'file':
- $opt_casefile = $val;
- break;
- case 'g':
- case 'group':
- $opt_groupfile = $val;
- break;
- case 'pgroup':
- $opt_plugingroupfile = $val;
- break;
- case 'i':
- case 'caselist':
- $opt_caselist = TRUE;
- break;
- case 'l':
- case 'grouplist':
- $opt_grouplist = TRUE;
- break;
- case 'plugincaselist':
- $opt_plugincaselist = TRUE;
- break;
- case 'plugingrouplist':
- $opt_plugingrouplist = TRUE;
- break;
- case 's':
- case 'separator':
- $opt_separator = $val;
- break;
- case 'p':
- case 'path':
- if (file_exists($val)) {
- define('SIMPLE_TEST', $val);
- }
- break;
- }
-}
-
-if (!@include_once SIMPLE_TEST . 'reporter.php') {
- die("Where's Simple Test ?!? Not at ".SIMPLE_TEST);
-}
-
-require_once 'lib/cli_reporter.php';
-
-/* list grouptests */
-if ($opt_grouplist) {
- echo CLITestManager::getGroupTestList(TEST_GROUPS);
-}
-
-/* list test cases */
-if ($opt_caselist) {
- echo CLITestManager::getTestCaseList(TEST_CASES);
-}
-
-/* list plugin test cases */
-if ($opt_plugincaselist) {
- echo CLITestManager::getPluginTestCaseList(TEST_PLUGINS);
-}
-
-/* list plugin group tests */
-if($opt_plugingrouplist) {
- echo CLITestManager::getPluginGroupTestList(TEST_PLUGINS);
-}
-
-/* exit if we've displayed a list */
-if ( $opt_grouplist || $opt_caselist || $opt_plugincaselist || $opt_plugingrouplist ) {
- exit(0);
-}
-
-/* run a test case */
-if ($opt_casefile) {
- TestManager::runTestFile($opt_casefile, new CLIReporter($opt_separator));
- exit(0);
-}
-
-/* run a test case by id */
-if ($opt_caseid) {
- TestManager::runTestCase($opt_caseid, TEST_CASES, new CLIReporter($opt_separator));
- exit(0);
-}
-
-/* run a plugin test by case id */
-if ($opt_plugincaseid) {
- TestManager::runTestCase($opt_plugincaseid, TEST_PLUGINS, new CLIReporter($opt_separator));
- exit(0);
-}
-
-/* run a grouptest */
-if ($opt_groupfile) {
- TestManager::runGroupTest($opt_groupfile, TEST_GROUPS,
- new CLIReporter($opt_separator));
- exit(0);
-}
-
-/* run a plugin grouptest */
-if ($opt_plugingroupfile) {
- TestManager::runGroupTest($opt_plugingroupfile, TEST_PLUGINS,
- new CLIReporter($opt_separator));
- exit(0);
-}
-
-/* run a plugin group test */
-//FIXME
-/* run all tests */
-TestManager::runAllTests(new CLIReporter($opt_separator));
-exit(0);
-?>
diff --git a/_test/tests.css b/_test/tests.css
deleted file mode 100644
index c20d8bb4f..000000000
--- a/_test/tests.css
+++ /dev/null
@@ -1,27 +0,0 @@
-body {
- background-color:#eee;
- color:#000;
- font:100%/1.2em Georgia,Verdana,Arial,Helvetica,sans-serif;
- margin-left:20ex;
- max-width:120ex;
- }
-
-#sf { float:right; }
-
-h1 {
- background-image:url(rephlux.png);
- background-repeat:no-repeat;
- margin-top:0;
- padding:20px 0 0 90px;
- color:#600;
- font-size:3em;
- line-height: 1em;
- background-color:inherit;
- border-bottom:9px double #333;
- }
-
-pre {
- font-size:120%;
- line-height:1.2em;
- color:#006;
- } \ No newline at end of file
diff --git a/_test/tests.ini b/_test/tests.ini
deleted file mode 100644
index cb16d4f1b..000000000
--- a/_test/tests.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-TEST_ENABLED = 0
-
-; For performing "web tests" - PHP scripts acting as web browser
-WEB_TEST_URL = http://localhost/dokuwiki
-
-; See http://www.sitepoint.com/blogs/2004/06/15/simple-test-remote-testing/
-REMOTE_TEST_URL = http://localhost/dokuwiki/test/index.php
-
-;PROXY = http://proxyuser:proxypwd@proxy.yourdomain.com:8080
-
-; Path to Simple Test
-SIMPLE_TEST = ../../simpletest/
diff --git a/_test/tests/conf/title.test.php b/_test/tests/conf/title.test.php
new file mode 100644
index 000000000..7cae040e7
--- /dev/null
+++ b/_test/tests/conf/title.test.php
@@ -0,0 +1,19 @@
+<?php
+
+class conf_title_test extends DokuWikiTest {
+
+ function testTitle() {
+ global $conf;
+
+ $request = new TestRequest();
+ $response = $request->get();
+ $content = $response->queryHTML('title');
+ $this->assertTrue(strpos($content,$conf['title']) > 0);
+
+ $conf['title'] = 'Foo';
+ $request = new TestRequest();
+ $response = $request->get();
+ $content = $response->queryHTML('title');
+ $this->assertTrue(strpos($content,'Foo') > 0);
+ }
+}
diff --git a/_test/tests/inc/auth_aclcheck.test.php b/_test/tests/inc/auth_aclcheck.test.php
new file mode 100644
index 000000000..991f82da7
--- /dev/null
+++ b/_test/tests/inc/auth_aclcheck.test.php
@@ -0,0 +1,267 @@
+<?php
+
+class auth_acl_test extends DokuWikiTest {
+
+ var $oldConf;
+ var $oldAuthAcl;
+
+ function setup() {
+ global $conf;
+ global $AUTH_ACL;
+ global $auth;
+ $this->oldConf = $conf;
+ $this->oldAuthAcl = $AUTH_ACL;
+ $auth = new auth_basic();
+ }
+
+ function teardown() {
+ global $conf;
+ global $AUTH_ACL;
+ $conf = $this->oldConf;
+ $AUTH_ACL = $this->oldAuthAcl;
+
+ }
+
+ function test_restricted(){
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'john';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 0',
+ '* @user 8',
+ );
+
+ // anonymous user
+ $this->assertEquals(auth_aclcheck('page', '',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
+
+ // user with no matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
+
+ // user with matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
+
+ // super user
+ $this->assertEquals(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
+ }
+
+ function test_restricted_ropage(){
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'john';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 0',
+ '* @user 8',
+ 'namespace:page @user 1',
+ );
+
+ // anonymous user
+ $this->assertEquals(auth_aclcheck('page', '',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
+
+ // user with no matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
+
+ // user with matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_READ);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
+
+ // super user
+ $this->assertEquals(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
+ }
+
+ function test_aclexample(){
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'john';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 4',
+ '* bigboss 16',
+ 'start @ALL 1',
+ 'marketing:* @marketing 8',
+ 'devel:* @ALL 0',
+ 'devel:* @devel 8',
+ 'devel:* bigboss 16',
+ 'devel:funstuff bigboss 0',
+ 'devel:* @marketing 1',
+ 'devel:marketing @marketing 2',
+ );
+
+
+ $this->assertEquals(auth_aclcheck('page', '' ,array()) , AUTH_CREATE);
+ $this->assertEquals(auth_aclcheck('page', 'bigboss' ,array('foo')) , AUTH_DELETE);
+ $this->assertEquals(auth_aclcheck('page', 'jill' ,array('marketing')) , AUTH_CREATE);
+ $this->assertEquals(auth_aclcheck('page', 'jane' ,array('devel')) , AUTH_CREATE);
+
+ $this->assertEquals(auth_aclcheck('start', '' ,array()) , AUTH_READ);
+ $this->assertEquals(auth_aclcheck('start', 'bigboss' ,array('foo')) , AUTH_READ);
+ $this->assertEquals(auth_aclcheck('start', 'jill' ,array('marketing')) , AUTH_READ);
+ $this->assertEquals(auth_aclcheck('start', 'jane' ,array('devel')) , AUTH_READ);
+
+ $this->assertEquals(auth_aclcheck('marketing:page', '' ,array()) , AUTH_CREATE);
+ $this->assertEquals(auth_aclcheck('marketing:page', 'bigboss' ,array('foo')) , AUTH_DELETE);
+ $this->assertEquals(auth_aclcheck('marketing:page', 'jill' ,array('marketing')) , AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('marketing:page', 'jane' ,array('devel')) , AUTH_CREATE);
+
+
+ $this->assertEquals(auth_aclcheck('devel:page', '' ,array()) , AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('devel:page', 'bigboss' ,array('foo')) , AUTH_DELETE);
+ $this->assertEquals(auth_aclcheck('devel:page', 'jill' ,array('marketing')) , AUTH_READ);
+ $this->assertEquals(auth_aclcheck('devel:page', 'jane' ,array('devel')) , AUTH_UPLOAD);
+
+ $this->assertEquals(auth_aclcheck('devel:funstuff', '' ,array()) , AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('devel:funstuff', 'bigboss' ,array('foo')) , AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('devel:funstuff', 'jill' ,array('marketing')) , AUTH_READ);
+ $this->assertEquals(auth_aclcheck('devel:funstuff', 'jane' ,array('devel')) , AUTH_UPLOAD);
+
+ $this->assertEquals(auth_aclcheck('devel:marketing', '' ,array()) , AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('devel:marketing', 'bigboss' ,array('foo')) , AUTH_DELETE);
+ $this->assertEquals(auth_aclcheck('devel:marketing', 'jill' ,array('marketing')) , AUTH_EDIT);
+ $this->assertEquals(auth_aclcheck('devel:marketing', 'jane' ,array('devel')) , AUTH_UPLOAD);
+
+ }
+
+ function test_multiadmin_restricted(){
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'john,@admin,doe,@roots';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 0',
+ '* @user 8',
+ );
+
+ // anonymous user
+ $this->assertEquals(auth_aclcheck('page', '',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
+
+ // user with no matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
+
+ // user with matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
+
+ // super user john
+ $this->assertEquals(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
+
+ // super user doe
+ $this->assertEquals(auth_aclcheck('page', 'doe',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','doe',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'doe',array('foo')), AUTH_ADMIN);
+
+ // user with matching admin group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','admin')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','admin')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','admin')), AUTH_ADMIN);
+
+ // user with matching another admin group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','roots')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','roots')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','roots')), AUTH_ADMIN);
+ }
+
+ function test_multiadmin_restricted_ropage(){
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'john,@admin,doe,@roots';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 0',
+ '* @user 8',
+ 'namespace:page @user 1',
+ );
+
+ // anonymous user
+ $this->assertEquals(auth_aclcheck('page', '',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
+
+ // user with no matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
+
+ // user with matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_READ);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
+
+ // super user john
+ $this->assertEquals(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
+
+ // super user doe
+ $this->assertEquals(auth_aclcheck('page', 'doe',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','doe',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'doe',array('foo')), AUTH_ADMIN);
+
+ // user with matching admin group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','admin')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','admin')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','admin')), AUTH_ADMIN);
+
+ // user with matching another admin group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','roots')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','roots')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','roots')), AUTH_ADMIN);
+ }
+
+ function test_wildcards(){
+ global $conf;
+ global $AUTH_ACL;
+ global $USERINFO;
+ $conf['useacl'] = 1;
+
+ $_SERVER['REMOTE_USER'] = 'john';
+ $USERINFO['grps'] = array('test','töst','foo bar');
+ $AUTH_ACL = auth_loadACL(); // default test file
+
+ // default setting
+ $this->assertEquals(AUTH_UPLOAD, auth_aclcheck('page', $_SERVER['REMOTE_USER'], $USERINFO['grps']));
+
+ // user namespace
+ $this->assertEquals(AUTH_DELETE, auth_aclcheck('users:john:foo', $_SERVER['REMOTE_USER'], $USERINFO['grps']));
+ $this->assertEquals(AUTH_READ, auth_aclcheck('users:john:foo', 'schmock', array()));
+
+ // group namespace
+ $this->assertEquals(AUTH_DELETE, auth_aclcheck('groups:test:foo', $_SERVER['REMOTE_USER'], $USERINFO['grps']));
+ $this->assertEquals(AUTH_READ, auth_aclcheck('groups:test:foo', 'schmock', array()));
+ $this->assertEquals(AUTH_DELETE, auth_aclcheck('groups:toest:foo', $_SERVER['REMOTE_USER'], $USERINFO['grps']));
+ $this->assertEquals(AUTH_READ, auth_aclcheck('groups:toest:foo', 'schmock', array()));
+ $this->assertEquals(AUTH_DELETE, auth_aclcheck('groups:foo_bar:foo', $_SERVER['REMOTE_USER'], $USERINFO['grps']));
+ $this->assertEquals(AUTH_READ, auth_aclcheck('groups:foo_bar:foo', 'schmock', array()));
+
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/auth_admincheck.test.php b/_test/tests/inc/auth_admincheck.test.php
new file mode 100644
index 000000000..d88399cbe
--- /dev/null
+++ b/_test/tests/inc/auth_admincheck.test.php
@@ -0,0 +1,126 @@
+<?php
+
+class auth_admin_test_AuthInSensitive extends auth_basic {
+ function isCaseSensitive(){
+ return false;
+ }
+}
+
+class auth_admin_test extends DokuWikiTest {
+
+ private $oldauth;
+
+ function setup() {
+ global $auth;
+ $this->oldauth = $auth;
+ }
+
+ function setSensitive() {
+ global $auth;
+ $auth = new auth_basic();
+ }
+
+ function setInSensitive() {
+ global $auth;
+ $auth = new auth_admin_test_AuthInSensitive();
+ }
+
+ function teardown() {
+ global $auth;
+ global $conf;
+ global $AUTH_ACL;
+ unset($conf);
+ unset($AUTH_ACL);
+ $auth = $this->oldauth;
+ }
+
+ function test_ismanager_insensitive(){
+ $this->setInSensitive();
+ global $conf;
+ $conf['superuser'] = 'john,@admin,@Mötly Görls, Dörte';
+ $conf['manager'] = 'john,@managers,doe, @Mötly Böys, Dänny';
+
+ // anonymous user
+ $this->assertEquals(auth_ismanager('jill', null,false), false);
+
+ // admin or manager users
+ $this->assertEquals(auth_ismanager('john', null,false), true);
+ $this->assertEquals(auth_ismanager('doe', null,false), true);
+
+ $this->assertEquals(auth_ismanager('dörte', null,false), true);
+ $this->assertEquals(auth_ismanager('dänny', null,false), true);
+
+ // admin or manager groups
+ $this->assertEquals(auth_ismanager('jill', array('admin'),false), true);
+ $this->assertEquals(auth_ismanager('jill', array('managers'),false), true);
+
+ $this->assertEquals(auth_ismanager('jill', array('mötly görls'),false), true);
+ $this->assertEquals(auth_ismanager('jill', array('mötly böys'),false), true);
+ }
+
+ function test_isadmin_insensitive(){
+ $this->setInSensitive();
+ global $conf;
+ $conf['superuser'] = 'john,@admin,doe,@roots';
+
+ // anonymous user
+ $this->assertEquals(auth_ismanager('jill', null,true), false);
+
+ // admin user
+ $this->assertEquals(auth_ismanager('john', null,true), true);
+ $this->assertEquals(auth_ismanager('doe', null,true), true);
+
+ // admin groups
+ $this->assertEquals(auth_ismanager('jill', array('admin'),true), true);
+ $this->assertEquals(auth_ismanager('jill', array('roots'),true), true);
+ $this->assertEquals(auth_ismanager('john', array('admin'),true), true);
+ $this->assertEquals(auth_ismanager('doe', array('admin'),true), true);
+ }
+
+ function test_ismanager_sensitive(){
+ $this->setSensitive();
+ global $conf;
+ $conf['superuser'] = 'john,@admin,@Mötly Görls, Dörte';
+ $conf['manager'] = 'john,@managers,doe, @Mötly Böys, Dänny';
+
+ // anonymous user
+ $this->assertEquals(auth_ismanager('jill', null,false), false);
+
+ // admin or manager users
+ $this->assertEquals(auth_ismanager('john', null,false), true);
+ $this->assertEquals(auth_ismanager('doe', null,false), true);
+
+ $this->assertEquals(auth_ismanager('dörte', null,false), false);
+ $this->assertEquals(auth_ismanager('dänny', null,false), false);
+
+ // admin or manager groups
+ $this->assertEquals(auth_ismanager('jill', array('admin'),false), true);
+ $this->assertEquals(auth_ismanager('jill', array('managers'),false), true);
+
+ $this->assertEquals(auth_ismanager('jill', array('mötly görls'),false), false);
+ $this->assertEquals(auth_ismanager('jill', array('mötly böys'),false), false);
+ }
+
+ function test_isadmin_sensitive(){
+ $this->setSensitive();
+ global $conf;
+ $conf['superuser'] = 'john,@admin,doe,@roots';
+
+ // anonymous user
+ $this->assertEquals(auth_ismanager('jill', null,true), false);
+
+ // admin user
+ $this->assertEquals(auth_ismanager('john', null,true), true);
+ $this->assertEquals(auth_ismanager('Doe', null,true), false);
+
+ // admin groups
+ $this->assertEquals(auth_ismanager('jill', array('admin'),true), true);
+ $this->assertEquals(auth_ismanager('jill', array('roots'),true), true);
+ $this->assertEquals(auth_ismanager('john', array('admin'),true), true);
+ $this->assertEquals(auth_ismanager('doe', array('admin'),true), true);
+ $this->assertEquals(auth_ismanager('Doe', array('admin'),true), true);
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/auth_nameencode.test.php b/_test/tests/inc/auth_nameencode.test.php
index 56806a862..21db304e0 100644
--- a/_test/cases/inc/auth_nameencode.test.php
+++ b/_test/tests/inc/auth_nameencode.test.php
@@ -1,9 +1,6 @@
<?php
-require_once DOKU_INC.'inc/init.php';
-require_once DOKU_INC.'inc/auth.php';
-
-class auth_nameencode_test extends UnitTestCase {
+class auth_nameencode_test extends DokuWikiTest {
function teardown() {
global $cache_authname;
@@ -13,37 +10,37 @@ class auth_nameencode_test extends UnitTestCase {
function test_simple(){
$in = 'hey$you';
$out = 'hey%24you';
- $this->assertEqual(auth_nameencode($in),$out);
+ $this->assertEquals(auth_nameencode($in),$out);
}
function test_quote(){
$in = 'hey"you';
$out = 'hey%22you';
- $this->assertEqual(auth_nameencode($in),$out);
+ $this->assertEquals(auth_nameencode($in),$out);
}
function test_complex(){
$in = 'hey $ you !$%! foo ';
$out = 'hey%20%24%20you%20%21%24%25%21%20foo%20';
- $this->assertEqual(auth_nameencode($in),$out);
+ $this->assertEquals(auth_nameencode($in),$out);
}
function test_complexutf8(){
$in = 'häü $ yü !$%! foo ';
$out = 'häü%20%24%20yü%20%21%24%25%21%20foo%20';
- $this->assertEqual(auth_nameencode($in),$out);
+ $this->assertEquals(auth_nameencode($in),$out);
}
function test_groupskipon(){
$in = '@hey$you';
$out = '@hey%24you';
- $this->assertEqual(auth_nameencode($in,true),$out);
+ $this->assertEquals(auth_nameencode($in,true),$out);
}
function test_groupskipoff(){
$in = '@hey$you';
$out = '%40hey%24you';
- $this->assertEqual(auth_nameencode($in),$out);
+ $this->assertEquals(auth_nameencode($in),$out);
}
}
diff --git a/_test/cases/inc/auth_password.test.php b/_test/tests/inc/auth_password.test.php
index 928552a14..426353291 100644
--- a/_test/cases/inc/auth_password.test.php
+++ b/_test/tests/inc/auth_password.test.php
@@ -1,9 +1,6 @@
<?php
-require_once DOKU_INC.'inc/init.php';
-require_once DOKU_INC.'inc/auth.php';
-
-class auth_password_test extends UnitTestCase {
+class auth_password_test extends PHPUnit_Framework_TestCase {
// hashes for the password foo$method, using abcdefgh as salt
var $passes = array(
@@ -12,12 +9,11 @@ class auth_password_test extends UnitTestCase {
'md5' => '8fa22d62408e5351553acdd91c6b7003',
'sha1' => 'b456d3b0efd105d613744ffd549514ecafcfc7e1',
'ssha' => '{SSHA}QMHG+uC7bHNYKkmoLbNsNI38/dJhYmNk',
+ 'lsmd5' => '{SMD5}HGbkPrkWgy9KgcRGWlrsUWFiY2RlZmdo',
'crypt' => 'ablvoGr1hvZ5k',
'mysql' => '4a1fa3780bd6fd55',
'my411' => '*e5929347e25f82e19e4ebe92f1dc6b6e7c2dbd29',
'kmd5' => 'a579299436d7969791189acadd86fcb716',
- 'pmd5' => '$P$abcdefgh1RC6Fd32heUzl7EYCG9uGw.',
- 'hmd5' => '$H$abcdefgh1ZbJodHxmeXVAhEzTG7IAp.',
'djangomd5' => 'md5$abcde$d0fdddeda8cd92725d2b54148ac09158',
'djangosha1' => 'sha1$abcde$c8e65a7f0acc9158843048a53dcc5a6bc4d17678',
);
@@ -26,28 +22,36 @@ class auth_password_test extends UnitTestCase {
function test_cryptPassword(){
foreach($this->passes as $method => $hash){
$info = "testing method $method";
- $this->signal('failinfo',$info);
- $this->assertEqual(auth_cryptPassword('foo'.$method,$method,'abcdefgh12345678912345678912345678'),$hash);
+ $this->assertEquals(auth_cryptPassword('foo'.$method, $method,'abcdefgh12345678912345678912345678'),
+ $hash, $info);
}
}
function test_verifyPassword(){
foreach($this->passes as $method => $hash){
$info = "testing method $method";
- $this->signal('failinfo',$info);
- $this->assertTrue(auth_verifyPassword('foo'.$method,$hash));
+ $this->assertTrue(auth_verifyPassword('foo'.$method, $hash), $info);
+ $this->assertFalse(auth_verifyPassword('bar'.$method, $hash), $info);
}
}
function test_verifySelf(){
foreach($this->passes as $method => $hash){
$info = "testing method $method";
- $this->signal('failinfo',$info);
$hash = auth_cryptPassword('foo'.$method,$method);
- $this->assertTrue(auth_verifyPassword('foo'.$method,$hash));
+ $this->assertTrue(auth_verifyPassword('foo'.$method, $hash), $info);
}
}
+ function test_bcrypt_self(){
+ $hash = auth_cryptPassword('foobcrypt','bcrypt');
+ $this->assertTrue(auth_verifyPassword('foobcrypt',$hash));
+ }
+
+ function test_verifyPassword_fixedbcrypt(){
+ $this->assertTrue(auth_verifyPassword('foobcrypt','$2a$12$uTWercxbq4sjp2xAzv3we.ZOxk51m5V/Bv5bp2H27oVFJl5neFQoC'));
+ }
+
function test_verifyPassword_nohash(){
$this->assertTrue(auth_verifyPassword('foo','$1$$n1rTiFE0nRifwV/43bVon/'));
}
@@ -57,6 +61,20 @@ class auth_password_test extends UnitTestCase {
$this->assertTrue(auth_verifyPassword('test12345','$H$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0'));
}
+ /**
+ * pmd5 checking should throw an exception when a hash with a too high
+ * iteration count is passed
+ */
+ function test_verifyPassword_pmd5Exception(){
+ $except = false;
+ try{
+ auth_verifyPassword('foopmd5', '$H$abcdefgh1ZbJodHxmeXVAhEzTG7IAp.');
+ }catch (Exception $e){
+ $except = true;
+ }
+ $this->assertTrue($except);
+ }
+
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/blowfish.test.php b/_test/tests/inc/blowfish.test.php
new file mode 100644
index 000000000..972df11f4
--- /dev/null
+++ b/_test/tests/inc/blowfish.test.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Test for blowfish encryption.
+ */
+class blowfish_test extends DokuWikiTest {
+ public function testEncryptDecryptNumbers() {
+ $secret = '$%ÄüfuDFRR';
+ $string = '12345678';
+ $this->assertEquals(
+ $string,
+ PMA_blowfish_decrypt(PMA_blowfish_encrypt($string, $secret), $secret)
+ );
+ }
+
+ public function testEncryptDecryptChars() {
+ $secret = '$%ÄüfuDFRR';
+ $string = 'abcDEF012!"§$%&/()=?`´"\',.;:-_#+*~öäüÖÄÜ^°²³';
+ $this->assertEquals(
+ $string,
+ PMA_blowfish_decrypt(PMA_blowfish_encrypt($string, $secret), $secret)
+ );
+ }
+
+ // FS#1690 FS#1713
+ public function testEncryptDecryptBinary() {
+ $secret = '$%ÄüfuDFRR';
+ $string = "this is\0binary because of\0zero bytes";
+ $this->assertEquals(
+ $string,
+ PMA_blowfish_decrypt(PMA_blowfish_encrypt($string, $secret), $secret)
+ );
+ }
+}
diff --git a/_test/tests/inc/cache_stalecheck.test.php b/_test/tests/inc/cache_stalecheck.test.php
new file mode 100644
index 000000000..93f44a55c
--- /dev/null
+++ b/_test/tests/inc/cache_stalecheck.test.php
@@ -0,0 +1,27 @@
+<?php
+
+class cache_stalecheck_test extends DokuWikiTest {
+ function test_staleness() {
+ global $ID;
+
+ $ID = 'stale';
+ $file = wikiFN($ID);
+
+ # Prepare test page
+ saveWikiText($ID, 'Fresh', 'Created');
+
+ # Create stale cache
+ $cache = new cache_renderer($ID, $file, 'xhtml');
+ $cache->storeCache('Stale');
+ $stale = $cache->retrieveCache();
+
+ # Prepare stale cache for testing
+ $time = filemtime($file);
+ touch($cache->cache, $time);
+
+ # Make the test
+ $fresh = p_cached_output($file, 'xhtml', $ID);
+ $this->assertNotEquals($fresh, $stale, 'Stale cache failed to expire');
+ }
+}
+
diff --git a/_test/tests/inc/common_cleanText.test.php b/_test/tests/inc/common_cleanText.test.php
new file mode 100644
index 000000000..9d4494332
--- /dev/null
+++ b/_test/tests/inc/common_cleanText.test.php
@@ -0,0 +1,21 @@
+<?php
+
+class common_cleanText_test extends DokuWikiTest {
+
+ function test_unix(){
+ $unix = "one\n two\n\n three";
+ $this->assertEquals($unix,cleanText($unix));
+ }
+
+ function test_win(){
+ $unix = "one\ntwo\nthree";
+ $win = "one\r\ntwo\r\nthree";
+
+ $this->assertEquals(bin2hex($unix), '6f6e650a74776f0a7468726565');
+ $this->assertEquals(bin2hex($win), '6f6e650d0a74776f0d0a7468726565');
+ $this->assertNotEquals($unix, $win);
+ $this->assertEquals($unix, cleanText($win));
+ }
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/common_clientip.test.php b/_test/tests/inc/common_clientip.test.php
index 68c108165..5b569cd98 100644
--- a/_test/cases/inc/common_clientip.test.php
+++ b/_test/tests/inc/common_clientip.test.php
@@ -1,16 +1,13 @@
<?php
-require_once DOKU_INC.'inc/init.php';
-require_once DOKU_INC.'inc/common.php';
-
-class common_clientIP_test extends UnitTestCase {
+class common_clientIP_test extends DokuWikiTest {
function test_simple_all(){
$_SERVER['REMOTE_ADDR'] = '123.123.123.123';
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '';
$out = '123.123.123.123';
- $this->assertEqual(clientIP(),$out);
+ $this->assertEquals(clientIP(),$out);
}
function test_proxy1_all(){
@@ -18,7 +15,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '77.77.77.77';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '';
$out = '123.123.123.123,77.77.77.77';
- $this->assertEqual(clientIP(),$out);
+ $this->assertEquals(clientIP(),$out);
}
function test_proxy2_all(){
@@ -26,7 +23,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77';
$out = '123.123.123.123,77.77.77.77';
- $this->assertEqual(clientIP(),$out);
+ $this->assertEquals(clientIP(),$out);
}
function test_proxyhops_all(){
@@ -34,7 +31,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77,66.66.66.66';
$out = '123.123.123.123,77.77.77.77,66.66.66.66';
- $this->assertEqual(clientIP(),$out);
+ $this->assertEquals(clientIP(),$out);
}
function test_simple_single(){
@@ -42,7 +39,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '';
$out = '123.123.123.123';
- $this->assertEqual(clientIP(true),$out);
+ $this->assertEquals(clientIP(true),$out);
}
function test_proxy1_single(){
@@ -50,7 +47,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '77.77.77.77';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '';
$out = '77.77.77.77';
- $this->assertEqual(clientIP(true),$out);
+ $this->assertEquals(clientIP(true),$out);
}
function test_proxy2_single(){
@@ -58,7 +55,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77';
$out = '77.77.77.77';
- $this->assertEqual(clientIP(true),$out);
+ $this->assertEquals(clientIP(true),$out);
}
function test_proxyhops_single(){
@@ -66,7 +63,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77,66.66.66.66';
$out = '66.66.66.66';
- $this->assertEqual(clientIP(true),$out);
+ $this->assertEquals(clientIP(true),$out);
}
function test_local_all(){
@@ -74,7 +71,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '127.0.0.1';
$out = '123.123.123.123,127.0.0.1';
- $this->assertEqual(clientIP(),$out);
+ $this->assertEquals(clientIP(),$out);
}
function test_local1_single(){
@@ -82,7 +79,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '127.0.0.1';
$out = '123.123.123.123';
- $this->assertEqual(clientIP(true),$out);
+ $this->assertEquals(clientIP(true),$out);
}
function test_local2_single(){
@@ -90,7 +87,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '123.123.123.123';
$out = '123.123.123.123';
- $this->assertEqual(clientIP(true),$out);
+ $this->assertEquals(clientIP(true),$out);
}
function test_local3_single(){
@@ -98,7 +95,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '127.0.0.1,10.0.0.1,192.168.0.2,172.17.1.1,172.21.1.1,172.31.1.1';
$out = '123.123.123.123';
- $this->assertEqual(clientIP(true),$out);
+ $this->assertEquals(clientIP(true),$out);
}
function test_local4_single(){
@@ -106,7 +103,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '192.168.0.5';
$out = '192.168.0.5';
- $this->assertEqual(clientIP(true),$out);
+ $this->assertEquals(clientIP(true),$out);
}
function test_garbage_all(){
@@ -114,7 +111,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
$out = '123.123.123.123';
- $this->assertEqual(clientIP(),$out);
+ $this->assertEquals(clientIP(),$out);
}
function test_garbage_single(){
@@ -122,7 +119,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
$out = '123.123.123.123';
- $this->assertEqual(clientIP(true),$out);
+ $this->assertEquals(clientIP(true),$out);
}
function test_garbageonly_all(){
@@ -130,7 +127,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
$out = '0.0.0.0';
- $this->assertEqual(clientIP(),$out);
+ $this->assertEquals(clientIP(),$out);
}
function test_garbageonly_single(){
@@ -138,7 +135,7 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
$out = '0.0.0.0';
- $this->assertEqual(clientIP(true),$out);
+ $this->assertEquals(clientIP(true),$out);
}
function test_malicious(){
@@ -146,10 +143,9 @@ class common_clientIP_test extends UnitTestCase {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '<?php set_time_limit(0);echo \'my_delim\';passthru(123.123.123.123);die;?>';
$out = '0.0.0.0';
- $this->assertEqual(clientIP(),$out);
+ $this->assertEquals(clientIP(),$out);
}
-
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/common_obfuscate.test.php b/_test/tests/inc/common_obfuscate.test.php
index 31321bea1..b8ec70980 100644
--- a/_test/cases/inc/common_obfuscate.test.php
+++ b/_test/tests/inc/common_obfuscate.test.php
@@ -1,26 +1,24 @@
<?php
-require_once DOKU_INC.'inc/common.php';
-
-class common_obfuscate_test extends UnitTestCase {
+class common_obfuscate_test extends DokuWikiTest {
function test_none(){
global $conf;
$conf['mailguard'] = 'none';
- $this->assertEqual(obfuscate('jon-doe@example.com'), 'jon-doe@example.com');
+ $this->assertEquals(obfuscate('jon-doe@example.com'), 'jon-doe@example.com');
}
function test_hex(){
global $conf;
$conf['mailguard'] = 'hex';
- $this->assertEqual(obfuscate('jon-doe@example.com'),
+ $this->assertEquals(obfuscate('jon-doe@example.com'),
'&#x6a;&#x6f;&#x6e;&#x2d;&#x64;&#x6f;&#x65;&#x40;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x63;&#x6f;&#x6d;');
}
function test_visible(){
global $conf;
$conf['mailguard'] = 'visible';
- $this->assertEqual(obfuscate('jon-doe@example.com'), 'jon [dash] doe [at] example [dot] com');
+ $this->assertEquals(obfuscate('jon-doe@example.com'), 'jon [dash] doe [at] example [dot] com');
}
diff --git a/_test/tests/inc/common_pagetemplate.test.php b/_test/tests/inc/common_pagetemplate.test.php
new file mode 100644
index 000000000..a076ce069
--- /dev/null
+++ b/_test/tests/inc/common_pagetemplate.test.php
@@ -0,0 +1,15 @@
+<?php
+
+class common_pagetemplate_test extends DokuWikiTest {
+
+ function test_none(){
+ global $conf;
+ $conf['sepchar'] = '-';
+ $data = array(
+ 'id' => 'page-id-long',
+ 'tpl' => '"@PAGE@" "@!PAGE@" "@!!PAGE@" "@!PAGE!@"',
+ );
+ $this->assertEquals(parsePageTemplate($data), '"page id long" "Page id long" "Page Id Long" "PAGE ID LONG"');
+ }
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/common_wl.test.php b/_test/tests/inc/common_wl.test.php
new file mode 100644
index 000000000..2e34dcae3
--- /dev/null
+++ b/_test/tests/inc/common_wl.test.php
@@ -0,0 +1,148 @@
+<?php
+
+class common_wl_test extends DokuWikiTest {
+
+ function test_wl_empty() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+ $conf['start'] = 'start';
+
+ $this->assertEquals(DOKU_BASE . DOKU_SCRIPT . '?id=start' , wl());
+ }
+
+ function test_wl_empty_rewrite1() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 1;
+ $conf['start'] = 'start';
+
+ $this->assertEquals(DOKU_BASE . 'start' , wl());
+ }
+
+ function test_wl_empty_rewrite2() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 2;
+ $conf['start'] = 'start';
+
+ $this->assertEquals(DOKU_BASE . DOKU_SCRIPT . '/start' , wl());
+ }
+
+ function test_wl_id() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+
+ $expect = DOKU_BASE . DOKU_SCRIPT . '?id=some';
+ $this->assertEquals($expect, wl('some'));
+ }
+
+ function test_wl_id_ns() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+
+ $expect = DOKU_BASE . DOKU_SCRIPT . '?id=some:some';
+ $this->assertEquals($expect, wl('some:some'));
+ }
+
+ function test_wl_id_ns_start() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+
+ $expect = DOKU_BASE . DOKU_SCRIPT . '?id=some:';
+ $this->assertEquals($expect, wl('some:'));
+ }
+
+ function test_wl_args_array() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+
+ $args = array('a' => 'b', 'c' => 'd', 'q' => '&ä');
+
+ $expect = DOKU_BASE . DOKU_SCRIPT . '?id=some:&amp;a=b&amp;c=d&amp;q=%26%C3%A4';
+ $this->assertEquals($expect, wl('some:', $args));
+ }
+
+ function test_wl_args_string() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+
+ $args = 'a=b&c=d';
+
+ $expect = DOKU_BASE . DOKU_SCRIPT . '?id=some:&amp;a=b&c=d';
+ $this->assertEquals($expect, wl('some:', $args));
+ }
+
+ function test_wl_args_comma_string() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+
+ $args = 'a=b,c=d';
+
+ $expect = DOKU_BASE . DOKU_SCRIPT . '?id=some:&amp;a=b&amp;c=d';
+ $this->assertEquals($expect, wl('some:', $args));
+ }
+
+ function test_wl_abs() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+
+ $expect = DOKU_URL . DOKU_SCRIPT . '?id=some:';
+ $this->assertEquals($expect, wl('some:', '', true));
+ }
+
+ function test_wl_sep() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+
+ $expect = DOKU_BASE . DOKU_SCRIPT . '?id=some:&a=b&c=d';
+ $this->assertEquals($expect, wl('some:', 'a=b,c=d', false, '&'));
+ }
+
+ function test_wl_useslash() {
+ global $conf;
+ $conf['useslash'] = 1;
+ $conf['userewrite'] = 0;
+
+ $expect = DOKU_BASE . DOKU_SCRIPT . '?id=some:&a=b&c=d';
+ $this->assertEquals($expect, wl('some:', 'a=b,c=d', false, '&'));
+ }
+
+ function test_wl_useslash_rewrite1() {
+ global $conf;
+ $conf['useslash'] = 1;
+ $conf['userewrite'] = 1;
+
+ $expect = DOKU_BASE . 'some/?a=b&c=d';
+ $this->assertEquals($expect, wl('some:', 'a=b,c=d', false, '&'));
+ }
+
+ function test_wl_useslash_rewrite1_sub_page() {
+ global $conf;
+ $conf['useslash'] = 1;
+ $conf['userewrite'] = 1;
+
+ $expect = DOKU_BASE . 'some/one?a=b&c=d';
+ $this->assertEquals($expect, wl('some:one', 'a=b,c=d', false, '&'));
+ }
+
+ function test_wl_useslash_rewrite2() {
+ global $conf;
+ $conf['useslash'] = 1;
+ $conf['userewrite'] = 2;
+
+ $expect = DOKU_BASE . DOKU_SCRIPT . '/some/one?a=b&c=d';
+ $this->assertEquals($expect, wl('some:one', 'a=b,c=d', false, '&'));
+ }
+
+
+
+} \ No newline at end of file
diff --git a/_test/tests/inc/events_nested.test.php b/_test/tests/inc/events_nested.test.php
new file mode 100644
index 000000000..fe5e395bb
--- /dev/null
+++ b/_test/tests/inc/events_nested.test.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * This tests if event handlers can trigger the same event again.
+ * This is used by plugins that modify cache handling and use metadata
+ * for checking cache validity which triggers another cache use event.
+ */
+class events_nested_test extends DokuWikiTest {
+ function test_nested_events() {
+ global $EVENT_HANDLER;
+ $firstcount = 0;
+ $secondcount = 0;
+
+ $EVENT_HANDLER->register_hook('NESTED_EVENT', 'BEFORE', null,
+ function() use (&$firstcount) {
+ $firstcount++;
+ if ($firstcount == 1) {
+ $param = array();
+ trigger_event('NESTED_EVENT', $param);
+ }
+ }
+ );
+
+ $EVENT_HANDLER->register_hook('NESTED_EVENT', 'BEFORE', null,
+ function() use (&$secondcount) {
+ $secondcount++;
+ }
+ );
+
+ $param = array();
+ trigger_event('NESTED_EVENT', $param);
+
+ $this->assertEquals(2, $firstcount);
+ $this->assertEquals(2, $secondcount);
+ }
+}
diff --git a/_test/cases/inc/form_form.test.php b/_test/tests/inc/form_form.test.php
index 5d5fa72af..02242a807 100644
--- a/_test/cases/inc/form_form.test.php
+++ b/_test/tests/inc/form_form.test.php
@@ -1,9 +1,6 @@
<?php
-require_once DOKU_INC.'inc/auth.php';
-require_once DOKU_INC.'inc/form.php';
-
-class form_test extends UnitTestCase {
+class form_test extends DokuWikiTest {
function _testform() {
$form = new Doku_Form(array('id' => 'dw__testform', 'action' => '/test'));
@@ -52,13 +49,13 @@ class form_test extends UnitTestCase {
$output = ob_get_contents();
ob_end_clean();
$form->addHidden('sectok', getSecurityToken());
- $this->assertEqual($this->_ignoreTagWS($output),$this->_ignoreTagWS($this->_realoutput()));
+ $this->assertEquals($this->_ignoreTagWS($output),$this->_ignoreTagWS($this->_realoutput()));
}
function test_get_element_at() {
$form = $this->_testform();
$e1 =& $form->getElementAt(1);
- $this->assertEqual($e1, array('_elem'=>'textfield',
+ $this->assertEquals($e1, array('_elem'=>'textfield',
'_text'=>'Text',
'_class'=>'block',
'id'=>'text__id',
@@ -66,24 +63,24 @@ class form_test extends UnitTestCase {
'value'=>'v',
'class'=>'edit'));
$e2 =& $form->getElementAt(99);
- $this->assertEqual($e2, array('_elem'=>'closefieldset'));
+ $this->assertEquals($e2, array('_elem'=>'closefieldset'));
}
function test_find_element_by_type() {
$form = $this->_testform();
- $this->assertEqual($form->findElementByType('button'), 3);
+ $this->assertEquals($form->findElementByType('button'), 3);
$this->assertFalse($form->findElementByType('text'));
}
function test_find_element_by_id() {
$form = $this->_testform();
- $this->assertEqual($form->findElementById('check__id'), 2);
+ $this->assertEquals($form->findElementById('check__id'), 2);
$this->assertFalse($form->findElementById('dw__testform'));
}
function test_find_element_by_attribute() {
$form = $this->_testform();
- $this->assertEqual($form->findElementByAttribute('value','Cancel'), 4);
+ $this->assertEquals($form->findElementByAttribute('value','Cancel'), 4);
$this->assertFalse($form->findElementByAttribute('name','cancel'));
}
@@ -99,7 +96,7 @@ class form_test extends UnitTestCase {
$form->printForm();
$output = ob_get_contents();
ob_end_clean();
- $this->assertEqual($this->_ignoreTagWS($output),$this->_ignoreTagWS($this->_realoutput()));
+ $this->assertEquals($this->_ignoreTagWS($output),$this->_ignoreTagWS($this->_realoutput()));
}
}
diff --git a/_test/tests/inc/html_hilight.test.php b/_test/tests/inc/html_hilight.test.php
new file mode 100644
index 000000000..fc4eced67
--- /dev/null
+++ b/_test/tests/inc/html_hilight.test.php
@@ -0,0 +1,132 @@
+<?php
+
+class html_hilight_test extends DokuWikiTest {
+
+ function testHighlightOneWord() {
+ $html = 'Foo bar Foo';
+ $this->assertRegExp(
+ '/Foo <span.*>bar<\/span> Foo/',
+ html_hilight($html,'bar')
+ );
+ }
+
+ function testHighlightTwoWords() {
+ $html = 'Foo bar Foo php Foo';
+ $this->assertRegExp(
+ '/Foo <span.*>bar<\/span> Foo <span.*>php<\/span> Foo/',
+ html_hilight($html,array('bar','php'))
+ );
+ }
+
+ function testHighlightTwoWordsHtml() {
+ $html = 'Foo <b>bar</b> <i>Foo</i> php Foo';
+ $this->assertRegExp(
+ '/Foo <b><span.*>bar<\/span><\/b> <i>Foo<\/i> <span.*>php<\/span> Foo/',
+ html_hilight($html,array('bar','php'))
+ );
+ }
+
+ function testNoMatchHtml() {
+ $html = 'Foo <font>font</font> Bar';
+ $this->assertRegExp(
+ '/Foo <font><span.*>font<\/span><\/font> Bar/',
+ html_hilight($html,'font')
+ );
+ }
+
+ function testWildcardRight() {
+ $html = 'foo bar foobar barfoo foobarfoo foo';
+ $this->assertRegExp(
+ '/foo <span.*>bar<\/span> foobar <span.*>bar<\/span>foo foobarfoo foo/',
+ html_hilight($html,'bar*')
+ );
+ }
+
+ function testWildcardLeft() {
+ $html = 'foo bar foobar barfoo foobarfoo foo';
+ $this->assertRegExp(
+ '/foo <span.*>bar<\/span> foo<span.*>bar<\/span> barfoo foobarfoo foo/',
+ html_hilight($html,'*bar')
+ );
+ }
+
+ function testWildcardBoth() {
+ $html = 'foo bar foobar barfoo foobarfoo foo';
+ $this->assertRegExp(
+ '/foo <span.*>bar<\/span> foo<span.*>bar<\/span> <span.*>bar<\/span>foo foo<span.*>bar<\/span>foo foo/',
+ html_hilight($html,'*bar*')
+ );
+ }
+
+ function testNoHighlight() {
+ $html = 'Foo bar Foo';
+ $this->assertRegExp(
+ '/Foo bar Foo/',
+ html_hilight($html,'php')
+ );
+ }
+
+ function testMatchAttribute() {
+ $html = 'Foo <b class="x">bar</b> Foo';
+ $this->assertRegExp(
+ '/Foo <b class="x">bar<\/b> Foo/',
+ html_hilight($html,'class="x"')
+ );
+ }
+
+ function testMatchAttributeWord() {
+ $html = 'Foo <b class="x">bar</b> Foo';
+ $this->assertEquals(
+ 'Foo <b class="x">bar</b> Foo',
+ html_hilight($html,'class="x">bar')
+ );
+ }
+
+ function testRegexInjection() {
+ $html = 'Foo bar Foo';
+ $this->assertRegExp(
+ '/Foo bar Foo/',
+ html_hilight($html,'*')
+ );
+ }
+
+ function testRegexInjectionSlash() {
+ $html = 'Foo bar Foo';
+ $this->assertRegExp(
+ '/Foo bar Foo/',
+ html_hilight($html,'x/')
+ );
+ }
+
+ function testMB() {
+ $html = 'foo ДокуВики bar';
+ $this->assertRegExp(
+ '/foo <span.*>ДокуВики<\/span> bar/',
+ html_hilight($html,'ДокуВики')
+ );
+ }
+
+ function testMBright() {
+ $html = 'foo ДокуВики bar';
+ $this->assertRegExp(
+ '/foo <span.*>Доку<\/span>Вики bar/',
+ html_hilight($html,'Доку*')
+ );
+ }
+
+ function testMBleft() {
+ $html = 'foo ДокуВики bar';
+ $this->assertRegExp(
+ '/foo Доку<span.*>Вики<\/span> bar/',
+ html_hilight($html,'*Вики')
+ );
+ }
+
+ function testMBboth() {
+ $html = 'foo ДокуВики bar';
+ $this->assertRegExp(
+ '/foo До<span.*>куВи<\/span>ки bar/',
+ html_hilight($html,'*куВи*')
+ );
+ }
+}
diff --git a/_test/tests/inc/httpclient_http.test.php b/_test/tests/inc/httpclient_http.test.php
new file mode 100644
index 000000000..9959a1f06
--- /dev/null
+++ b/_test/tests/inc/httpclient_http.test.php
@@ -0,0 +1,195 @@
+<?php
+
+class httpclient_http_test extends DokuWikiTest {
+ protected $server = 'http://httpbin.org';
+
+ /**
+ * @group internet
+ */
+ function test_simpleget(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/get?foo=bar');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('args',$resp);
+ $this->assertEquals(array('foo'=>'bar'), $resp['args']);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_dget(){
+ $http = new HTTPClient();
+ $data = $http->dget($this->server.'/get',array('foo'=>'bar'));
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('args',$resp);
+ $this->assertEquals(array('foo'=>'bar'), $resp['args']);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_gzip(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/gzip');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('gzipped',$resp);
+ $this->assertTrue($resp['gzipped']);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_simplepost(){
+ $http = new HTTPClient();
+ $data = $http->post($this->server.'/post',array('foo'=>'bar'));
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('form',$resp);
+ $this->assertEquals(array('foo'=>'bar'), $resp['form']);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_redirect(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/redirect/3');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('url',$resp);
+ $this->assertRegExp('/\/get$/', $resp['url']);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_relredirect(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/relative-redirect/3');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('url',$resp);
+ $this->assertRegExp('/\/get$/', $resp['url']);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_redirectfail(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/redirect/5');
+ $this->assertTrue($data === false, 'HTTP response');
+ $this->assertEquals('Maximum number of redirects exceeded',$http->error);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_cookies(){
+ $http = new HTTPClient();
+ $http->get($this->server.'/cookies/set/foo/bar');
+ $this->assertEquals(array('foo' => 'bar'), $http->cookies);
+ $data = $http->get($this->server.'/cookies');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('cookies',$resp);
+ $this->assertEquals(array('foo'=>'bar'), $resp['cookies']);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_teapot(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/status/418');
+ $this->assertTrue($data === false, 'HTTP response');
+ $this->assertEquals(418,$http->status);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_maxbody(){
+ $http = new HTTPClient();
+ $http->max_bodysize = 250;
+ $data = $http->get($this->server.'/stream/30');
+ $this->assertTrue($data === false, 'HTTP response');
+ $http->max_bodysize_abort = false;
+ $data = $http->get($this->server.'/stream/30');
+ $this->assertFalse($data === false, 'HTTP response');
+ /* should read no more than max_bodysize+1 */
+ $this->assertLessThanOrEqual(251,strlen($data));
+ }
+
+ /**
+ * @group internet
+ */
+ function test_basicauth(){
+ $http = new HTTPClient();
+ $http->user = 'user';
+ $http->pass = 'pass';
+ $data = $http->get($this->server.'/basic-auth/user/pass');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertEquals(array('authenticated'=>true,'user'=>'user'), $resp);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_basicauthfail(){
+ $http = new HTTPClient();
+ $http->user = 'user';
+ $http->pass = 'invalid';
+ $data = $http->get($this->server.'/basic-auth/user/pass');
+ $this->assertTrue($data === false, 'HTTP response');
+ $this->assertEquals(401,$http->status);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_timeout(){
+ $http = new HTTPClient();
+ $http->timeout = 5;
+ $data = $http->get($this->server.'/delay/10');
+ $this->assertTrue($data === false, 'HTTP response');
+ $this->assertEquals(-100,$http->status);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_headers(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/response-headers?baz=&foo=bar');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('baz',$http->resp_headers);
+ $this->assertArrayHasKey('foo',$http->resp_headers);
+ $this->assertEquals('bar',$http->resp_headers['foo']);
+ }
+
+ /**
+ * @group internet
+ */
+ function test_chunked(){
+ $http = new HTTPClient();
+ $data = $http->get('http://whoopdedo.org/cgi-bin/chunked/2550');
+ $this->assertFalse($data === false, 'HTTP response');
+ $this->assertEquals(2550,strlen($data));
+ }
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/httpclient_https.test.php b/_test/tests/inc/httpclient_https.test.php
new file mode 100644
index 000000000..26a0f86db
--- /dev/null
+++ b/_test/tests/inc/httpclient_https.test.php
@@ -0,0 +1,15 @@
+<?php
+
+class httpclient_https_test extends httpclient_http_test {
+ protected $server = 'https://httpbin.org/';
+
+ public function setUp(){
+ // skip tests when this PHP has no SSL support
+ $transports = stream_get_transports();
+ if(!in_array('ssl',$transports)){
+ $this->markTestSkipped('No SSL support available.');
+ }
+ parent::setUp();
+ }
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/indexer_histogram.test.php b/_test/tests/inc/indexer_histogram.test.php
new file mode 100644
index 000000000..df6af7a2b
--- /dev/null
+++ b/_test/tests/inc/indexer_histogram.test.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Tests the histogram function of the indexer.
+ *
+ * @author Michael Hamann <michael@content-space.de>
+ */
+class indexer_histogram_test extends DokuWikiTest {
+ function test_minlength() {
+ $indexer = idx_get_indexer();
+ $indexer->addMetaKeys('histo1', 'testkey', array('foo', 'bar', 'foobar'));
+ $indexer->addMetaKeys('histo2', 'testkey', array('bar', 'testing'));
+ $indexer->addMetaKeys('histo3', 'testkey', array('foo', 'foobar'));
+ $histogram4 = $indexer->histogram(1, 0, 4, 'testkey');
+ $this->assertEquals(array('foobar' => 2, 'testing' => 1), $histogram4);
+ $histogram2 = $indexer->histogram(1, 0, 2, 'testkey');
+ $this->assertEquals(array('foobar' => 2, 'testing' => 1, 'foo' => 2, 'bar' => 2), $histogram2);
+ }
+
+}
diff --git a/_test/cases/inc/init_fullpath.test.php b/_test/tests/inc/init_fullpath.test.php
index aa63b0ce9..fabf03fa0 100644
--- a/_test/cases/inc/init_fullpath.test.php
+++ b/_test/tests/inc/init_fullpath.test.php
@@ -1,7 +1,6 @@
<?php
-require_once DOKU_INC.'inc/init.php';
-class init_fullpath_test extends UnitTestCase {
+class init_fullpath_test extends DokuWikiTest {
function test_unix_paths(){
$base = $_SERVER['SCRIPT_FILENAME'];
@@ -27,9 +26,8 @@ class init_fullpath_test extends UnitTestCase {
foreach($tests as $from => $to){
$info = "Testing '$from' resulted in '".fullpath($from)."'";
- $this->signal('failinfo',$info);
- $this->assertEqual(fullpath($from),$to);
+ $this->assertEquals(fullpath($from), $to, $info);
}
@@ -75,9 +73,8 @@ class init_fullpath_test extends UnitTestCase {
foreach($tests as $from => $to){
$info = "Testing '$from' resulted in '".fullpath($from)."'";
- $this->signal('failinfo',$info);
- $this->assertEqual(fullpath($from),$to);
+ $this->assertEquals(fullpath($from), $to, $info);
}
diff --git a/_test/cases/inc/init_getbaseurl.test.php b/_test/tests/inc/init_getbaseurl.test.php
index a22172feb..af5a8b318 100644
--- a/_test/cases/inc/init_getbaseurl.test.php
+++ b/_test/tests/inc/init_getbaseurl.test.php
@@ -1,8 +1,6 @@
<?php
-require_once DOKU_INC.'inc/init.php';
-
-class init_getBaseURL_test extends UnitTestCase {
+class init_getBaseURL_test extends DokuWikiTest {
/**
* Apache, mod_php, subdirectory
@@ -24,7 +22,7 @@ class init_getBaseURL_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = '/var/www/dokuwiki/doku.php';
$_SERVER['PHP_SELF'] = '/dokuwiki/doku.php';
- $this->assertEqual(getBaseURL(),'/dokuwiki/');
+ $this->assertEquals(getBaseURL(),'/dokuwiki/');
}
/**
@@ -47,7 +45,7 @@ class init_getBaseURL_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = '/home/bengen/public_html/dokuwiki/doku.php';
$_SERVER['PHP_SELF'] = '/~bengen/dokuwiki/doku.php';
- $this->assertEqual(getBaseURL(),'/~bengen/dokuwiki/');
+ $this->assertEquals(getBaseURL(),'/~bengen/dokuwiki/');
}
/**
@@ -70,7 +68,7 @@ class init_getBaseURL_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = '/home/bengen/public_html/dokuwiki/doku.php';
$_SERVER['PHP_SELF'] = '/~bengen/dokuwiki/doku.php';
- $this->assertEqual(getBaseURL(),'/~bengen/dokuwiki/');
+ $this->assertEquals(getBaseURL(),'/~bengen/dokuwiki/');
}
/**
@@ -93,7 +91,7 @@ class init_getBaseURL_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = '/home/bengen/public_html/dokuwiki/doku.php';
$_SERVER['PHP_SELF'] = '/~bengen/dokuwiki/doku.php';
- $this->assertEqual(getBaseURL(),'/~bengen/dokuwiki/');
+ $this->assertEquals(getBaseURL(),'/~bengen/dokuwiki/');
}
/**
@@ -116,7 +114,7 @@ class init_getBaseURL_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = 'C:\\Inetpub\\wwwroot\\wiki\\doku.php';
$_SERVER['PHP_SELF'] = '/wiki/doku.php';
- $this->assertEqual(getBaseURL(),'/wiki/');
+ $this->assertEquals(getBaseURL(),'/wiki/');
}
/**
@@ -139,7 +137,7 @@ class init_getBaseURL_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = null;
$_SERVER['PHP_SELF'] = '/wiki/syntax';
- $this->assertEqual(getBaseURL(),'/');
+ $this->assertEquals(getBaseURL(),'/');
}
/**
@@ -162,7 +160,7 @@ class init_getBaseURL_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = null;
$_SERVER['PHP_SELF'] = '';
- $this->assertEqual(getBaseURL(),'/dokuwiki/');
+ $this->assertEquals(getBaseURL(),'/dokuwiki/');
}
/**
@@ -185,7 +183,7 @@ class init_getBaseURL_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = '/var/www/wiki/syntax';
$_SERVER['PHP_SELF'] = '/dokuwiki/doku.php/wiki/syntax';
- $this->assertEqual(getBaseURL(),'/dokuwiki/');
+ $this->assertEquals(getBaseURL(),'/dokuwiki/');
}
/**
@@ -208,7 +206,7 @@ class init_getBaseURL_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = '/var/www/dokuwiki/doku.php';
$_SERVER['PHP_SELF'] = '/dokuwiki/doku.php';
- $this->assertEqual(getBaseURL(),'/dokuwiki/');
+ $this->assertEquals(getBaseURL(),'/dokuwiki/');
}
/**
@@ -240,7 +238,7 @@ class init_getBaseURL_test extends UnitTestCase {
foreach ($tests as $test => $correct_result) {
$conf['baseurl'] = $test;
- $this->assertEqual(getBaseURL(true),$correct_result);
+ $this->assertEquals(getBaseURL(true),$correct_result);
}
}
/**
@@ -272,7 +270,7 @@ class init_getBaseURL_test extends UnitTestCase {
foreach ($tests as $test => $correct_result) {
$conf['baseurl'] = $test;
- $this->assertEqual(getBaseURL(true),$correct_result);
+ $this->assertEquals(getBaseURL(true),$correct_result);
}
}
@@ -298,7 +296,7 @@ class init_getBaseURL_test extends UnitTestCase {
$_SERVER['PHP_SELF'] = '/~michitux/dokuwiki/doku.php';
$_SERVER['SERVER_PORT'] = '80';
$_SERVER['SERVER_NAME'] = '[fd00';
- $this->assertEqual(getBaseURL(true), 'http://[fd00::6592:39ed:a2ed:2c78]/~michitux/dokuwiki/');
+ $this->assertEquals(getBaseURL(true), 'http://[fd00::6592:39ed:a2ed:2c78]/~michitux/dokuwiki/');
}
}
diff --git a/_test/tests/inc/input.test.php b/_test/tests/inc/input.test.php
new file mode 100644
index 000000000..59b5ea4b9
--- /dev/null
+++ b/_test/tests/inc/input.test.php
@@ -0,0 +1,233 @@
+<?php
+
+/**
+ * Tests for the Input class
+ */
+class input_test extends DokuWikiTest {
+
+ private $data = array(
+ 'array' => array('foo', 'bar'),
+ 'string' => 'foo',
+ 'int' => '17',
+ 'zero' => '0',
+ 'one' => '1',
+ 'empty' => '',
+ 'emptya' => array(),
+ 'do' => array('save' => 'Speichern'),
+ );
+
+ public function test_str() {
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $_GET['get'] = 1;
+ $_POST['post'] = 1;
+ $INPUT = new Input();
+
+ $this->assertSame('foo', $INPUT->str('string'));
+ $this->assertSame('', $INPUT->str('none'));
+ $this->assertSame('', $INPUT->str('empty'));
+ $this->assertSame('foo', $INPUT->str('none', 'foo'));
+ $this->assertSame('', $INPUT->str('empty', 'foo'));
+ $this->assertSame('foo', $INPUT->str('empty', 'foo', true));
+
+ $this->assertSame(false, $INPUT->str('get', false));
+ $this->assertSame(false, $INPUT->str('post', false));
+
+ $this->assertSame('foo', $INPUT->post->str('string'));
+ $this->assertSame('', $INPUT->post->str('none'));
+ $this->assertSame('', $INPUT->post->str('empty'));
+ $this->assertSame('foo', $INPUT->post->str('none', 'foo'));
+ $this->assertSame('', $INPUT->post->str('empty', 'foo'));
+ $this->assertSame('foo', $INPUT->post->str('empty', 'foo', true));
+
+ $this->assertSame(false, $INPUT->post->str('get', false));
+ $this->assertSame('1', $INPUT->post->str('post', false));
+
+ $this->assertSame('foo', $INPUT->get->str('string'));
+ $this->assertSame('', $INPUT->get->str('none'));
+ $this->assertSame('', $INPUT->get->str('empty'));
+ $this->assertSame('foo', $INPUT->get->str('none', 'foo'));
+ $this->assertSame('', $INPUT->get->str('empty', 'foo'));
+ $this->assertSame('foo', $INPUT->get->str('empty', 'foo', true));
+
+ $this->assertSame(false, $INPUT->get->str('post', false));
+ $this->assertSame('1', $INPUT->get->str('get', false));
+
+ $this->assertSame('', $INPUT->str('array'));
+ }
+
+ public function test_int() {
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $_GET['get'] = 1;
+ $_POST['post'] = 1;
+ $INPUT = new Input();
+
+ $this->assertSame(17, $INPUT->int('int'));
+ $this->assertSame(0, $INPUT->int('none'));
+ $this->assertSame(0, $INPUT->int('empty'));
+ $this->assertSame(42, $INPUT->int('none', 42));
+ $this->assertSame(0, $INPUT->int('zero', 42));
+ $this->assertSame(42, $INPUT->int('zero', 42, true));
+
+ $this->assertSame(false, $INPUT->int('get', false));
+ $this->assertSame(false, $INPUT->int('post', false));
+
+ $this->assertSame(17, $INPUT->post->int('int'));
+ $this->assertSame(0, $INPUT->post->int('none'));
+ $this->assertSame(0, $INPUT->post->int('empty'));
+ $this->assertSame(42, $INPUT->post->int('none', 42));
+ $this->assertSame(0, $INPUT->post->int('zero', 42));
+ $this->assertSame(42, $INPUT->post->int('zero', 42, true));
+
+ $this->assertSame(false, $INPUT->post->int('get', false));
+ $this->assertSame(1, $INPUT->post->int('post', false));
+
+ $this->assertSame(17, $INPUT->post->int('int'));
+ $this->assertSame(0, $INPUT->post->int('none'));
+ $this->assertSame(0, $INPUT->post->int('empty'));
+ $this->assertSame(42, $INPUT->post->int('none', 42));
+ $this->assertSame(0, $INPUT->post->int('zero', 42));
+ $this->assertSame(42, $INPUT->post->int('zero', 42, true));
+
+ $this->assertSame(false, $INPUT->get->int('post', false));
+ $this->assertSame(1, $INPUT->get->int('get', false));
+
+ $this->assertSame(0, $INPUT->int('array'));
+
+ $this->assertSame(0, $INPUT->int('zero', -1));
+ $this->assertSame(-1, $INPUT->int('empty', -1));
+ $this->assertSame(-1, $INPUT->int('zero', -1, true));
+ $this->assertSame(-1, $INPUT->int('empty', -1, true));
+ }
+
+ public function test_arr() {
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $_GET['get'] = array(1, 2);
+ $_POST['post'] = array(1, 2);
+ $INPUT = new Input();
+
+ $this->assertSame(array('foo', 'bar'), $INPUT->arr('array'));
+ $this->assertSame(array(), $INPUT->arr('none'));
+ $this->assertSame(array(), $INPUT->arr('empty'));
+ $this->assertSame(array(1, 2), $INPUT->arr('none', array(1, 2)));
+ $this->assertSame(array(), $INPUT->arr('emptya', array(1, 2)));
+ $this->assertSame(array(1, 2), $INPUT->arr('emptya', array(1, 2), true));
+
+ $this->assertSame(false, $INPUT->arr('get', false));
+ $this->assertSame(false, $INPUT->arr('post', false));
+
+ $this->assertSame(array('foo', 'bar'), $INPUT->post->arr('array'));
+ $this->assertSame(array(), $INPUT->post->arr('none'));
+ $this->assertSame(array(), $INPUT->post->arr('empty'));
+ $this->assertSame(array(1, 2), $INPUT->post->arr('none', array(1, 2)));
+ $this->assertSame(array(), $INPUT->post->arr('emptya', array(1, 2)));
+ $this->assertSame(array(1, 2), $INPUT->post->arr('emptya', array(1, 2), true));
+
+ $this->assertSame(false, $INPUT->post->arr('get', false));
+ $this->assertSame(array(1, 2), $INPUT->post->arr('post', false));
+
+ $this->assertSame(array('foo', 'bar'), $INPUT->get->arr('array'));
+ $this->assertSame(array(), $INPUT->get->arr('none'));
+ $this->assertSame(array(), $INPUT->get->arr('empty'));
+ $this->assertSame(array(1, 2), $INPUT->get->arr('none', array(1, 2)));
+ $this->assertSame(array(), $INPUT->get->arr('emptya', array(1, 2)));
+ $this->assertSame(array(1, 2), $INPUT->get->arr('emptya', array(1, 2), true));
+
+ $this->assertSame(array(1, 2), $INPUT->get->arr('get', false));
+ $this->assertSame(false, $INPUT->get->arr('post', false));
+ }
+
+ public function test_bool() {
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $_GET['get'] = '1';
+ $_POST['post'] = '1';
+ $INPUT = new Input();
+
+ $this->assertSame(true, $INPUT->bool('one'));
+ $this->assertSame(false, $INPUT->bool('zero'));
+
+ $this->assertSame(false, $INPUT->bool('get'));
+ $this->assertSame(false, $INPUT->bool('post'));
+
+ $this->assertSame(true, $INPUT->post->bool('one'));
+ $this->assertSame(false, $INPUT->post->bool('zero'));
+
+ $this->assertSame(false, $INPUT->post->bool('get'));
+ $this->assertSame(true, $INPUT->post->bool('post'));
+
+ $this->assertSame(false, $INPUT->bool('zero', -1));
+ $this->assertSame(-1, $INPUT->bool('empty', -1));
+ $this->assertSame(-1, $INPUT->bool('zero', -1, true));
+ $this->assertSame(-1, $INPUT->bool('empty', -1, true));
+ }
+
+ public function test_remove() {
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $INPUT = new Input();
+
+ $INPUT->remove('string');
+ $this->assertNull($_REQUEST['string']);
+ $this->assertNull($_POST['string']);
+ $this->assertNull($_GET['string']);
+
+ $INPUT->post->remove('int');
+ $this->assertNull($_POST['int']);
+ $this->assertEquals(17, $_GET['int']);
+ $this->assertEquals(17, $_REQUEST['int']);
+ }
+
+ public function test_set(){
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $INPUT = new Input();
+
+ $INPUT->set('test','foo');
+ $this->assertEquals('foo',$_REQUEST['test']);
+ $this->assertNull($_POST['test']);
+ $this->assertNull($_GET['test']);
+
+ $INPUT->get->set('test2','foo');
+ $this->assertEquals('foo',$_GET['test2']);
+ $this->assertEquals('foo',$_REQUEST['test2']);
+ $this->assertNull($_POST['test']);
+ }
+
+ public function test_ref(){
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $INPUT = new Input();
+
+ $test = &$INPUT->ref('string');
+ $this->assertEquals('foo',$test);
+ $_REQUEST['string'] = 'bla';
+ $this->assertEquals('bla',$test);
+ }
+
+ public function test_extract(){
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $INPUT = new Input();
+
+ $this->assertEquals('save', $INPUT->extract('do')->str('do'));
+ $this->assertEquals('', $INPUT->extract('emptya')->str('emptya'));
+ $this->assertEquals('foo', $INPUT->extract('string')->str('string'));
+ $this->assertEquals('foo', $INPUT->extract('array')->str('array'));
+
+ $this->assertEquals('save', $INPUT->post->extract('do')->str('do'));
+ $this->assertEquals('', $INPUT->post->extract('emptya')->str('emptya'));
+ $this->assertEquals('foo', $INPUT->post->extract('string')->str('string'));
+ $this->assertEquals('foo', $INPUT->post->extract('array')->str('array'));
+ }
+}
diff --git a/_test/cases/inc/IXR_Library_date.test.php b/_test/tests/inc/ixr_library_date.test.php
index 28fa86486..f38486925 100644
--- a/_test/cases/inc/IXR_Library_date.test.php
+++ b/_test/tests/inc/ixr_library_date.test.php
@@ -1,7 +1,8 @@
<?php
+
require_once DOKU_INC.'inc/IXR_Library.php';
-class ixr_library_date_test extends UnitTestCase {
+class ixr_library_date_test extends DokuWikiTest {
function test_parseIso(){
@@ -26,7 +27,7 @@ class ixr_library_date_test extends UnitTestCase {
foreach($tests as $test){
$dt = new IXR_Date($test[0]);
- $this->assertEqual($dt->getTimeStamp(),$test[1]);
+ $this->assertEquals($dt->getTimeStamp(),$test[1]);
}
}
diff --git a/_test/cases/inc/IXR_Library_IXR_Message.test.php b/_test/tests/inc/ixr_library_ixr_message.test.php
index bc9be572d..b8afd607e 100644
--- a/_test/cases/inc/IXR_Library_IXR_Message.test.php
+++ b/_test/tests/inc/ixr_library_ixr_message.test.php
@@ -1,11 +1,6 @@
<?php
-require_once DOKU_INC.'inc/IXR_Library.php';
-
-class ixr_library_ixr_message_test extends UnitTestCase {
-
-
-
+class ixr_library_ixr_message_test extends DokuWikiTest {
function test_untypedvalue1(){
$xml = '<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>wiki.getBackLinks</methodName><params><param><value> change </value></param></params></methodCall>';
@@ -13,9 +8,9 @@ class ixr_library_ixr_message_test extends UnitTestCase {
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
- $this->assertEqual($ixrmsg->messageType,'methodCall');
- $this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
- $this->assertEqual($ixrmsg->params,array(' change '));
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(' change '));
}
function test_untypedvalue2(){
@@ -32,9 +27,9 @@ class ixr_library_ixr_message_test extends UnitTestCase {
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
- $this->assertEqual($ixrmsg->messageType,'methodCall');
- $this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
- $this->assertEqual($ixrmsg->params,array(' change '));
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(' change '));
}
function test_stringvalue1(){
@@ -43,9 +38,9 @@ class ixr_library_ixr_message_test extends UnitTestCase {
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
- $this->assertEqual($ixrmsg->messageType,'methodCall');
- $this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
- $this->assertEqual($ixrmsg->params,array(' change '));
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(' change '));
}
function test_stringvalue2(){
@@ -64,9 +59,9 @@ class ixr_library_ixr_message_test extends UnitTestCase {
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
- $this->assertEqual($ixrmsg->messageType,'methodCall');
- $this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
- $this->assertEqual($ixrmsg->params,array(' change '));
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(' change '));
}
function test_emptyvalue1(){
@@ -75,9 +70,9 @@ class ixr_library_ixr_message_test extends UnitTestCase {
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
- $this->assertEqual($ixrmsg->messageType,'methodCall');
- $this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
- $this->assertEqual($ixrmsg->params,array(''));
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(''));
}
function test_emptyvalue2(){
@@ -96,9 +91,9 @@ class ixr_library_ixr_message_test extends UnitTestCase {
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
- $this->assertEqual($ixrmsg->messageType,'methodCall');
- $this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
- $this->assertEqual($ixrmsg->params,array(''));
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(''));
}
function test_struct(){
@@ -130,9 +125,9 @@ class ixr_library_ixr_message_test extends UnitTestCase {
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
- $this->assertEqual($ixrmsg->messageType,'methodCall');
- $this->assertEqual($ixrmsg->methodName,'wiki.putPage');
- $this->assertEqual($ixrmsg->params,array('start','test text',array('sum'=>'xmlrpc edit','minor'=>'1')));
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.putPage');
+ $this->assertEquals($ixrmsg->params,array('start','test text',array('sum'=>'xmlrpc edit','minor'=>'1')));
}
}
diff --git a/_test/tests/inc/json.test.php b/_test/tests/inc/json.test.php
new file mode 100644
index 000000000..ca939d885
--- /dev/null
+++ b/_test/tests/inc/json.test.php
@@ -0,0 +1,418 @@
+<?php
+/**
+ * Unit tests for JSON.
+ *
+ * @author Michal Migurski <mike-json@teczno.com>
+ * @author Matt Knapp <mdknapp[at]gmail[dot]com>
+ * @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
+ * @copyright 2005 Michal Migurski
+ * @version CVS: $Id: Test-JSON.php,v 1.28 2006/06/28 05:54:17 migurski Exp $
+ * @license http://www.opensource.org/licenses/bsd-license.php
+ * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198
+ * @link http://mike.teczno.com/JSON/Test-JSON.phps
+ */
+
+class JSON_EncDec_TestCase extends DokuWikiTest {
+
+ function setUp() {
+ parent::setUp();
+
+ $this->json = new JSON();
+ $this->json->skipnative = true;
+
+ $obj = new stdClass();
+ $obj->a_string = '"he":llo}:{world';
+ $obj->an_array = array(1, 2, 3);
+ $obj->obj = new stdClass();
+ $obj->obj->a_number = 123;
+
+ $this->obj = $obj;
+ $this->obj_j = '{"a_string":"\"he\":llo}:{world","an_array":[1,2,3],"obj":{"a_number":123}}';
+ $this->obj_d = 'object with properties, nested object and arrays';
+
+ $this->arr = array(null, true, array(1, 2, 3), "hello\"],[world!");
+ $this->arr_j = '[null,true,[1,2,3],"hello\"],[world!"]';
+ $this->arr_d = 'array with elements and nested arrays';
+
+ $this->str1 = 'hello world';
+ $this->str1_j = '"hello world"';
+ $this->str1_j_ = "'hello world'";
+ $this->str1_d = 'hello world';
+ $this->str1_d_ = 'hello world, double quotes';
+
+ $this->str2 = "hello\t\"world\"";
+ $this->str2_j = '"hello\\t\\"world\\""';
+ $this->str2_d = 'hello world, with tab, double-quotes';
+
+ $this->str3 = "\\\r\n\t\"/";
+ $this->str3_j = '"\\\\\\r\\n\\t\\"\\/"';
+ $this->str3_d = 'backslash, return, newline, tab, double-quote';
+
+ $this->str4 = 'héllö wørłd';
+ $this->str4_j = '"h\u00e9ll\u00f6 w\u00f8r\u0142d"';
+ $this->str4_j_ = '"héllö wørłd"';
+ $this->str4_d = 'hello world, with unicode';
+ }
+
+ function test_to_JSON() {
+ $this->assertEquals('null', $this->json->encode(null), 'type case: null');
+ $this->assertEquals('true', $this->json->encode(true), 'type case: boolean true');
+ $this->assertEquals('false', $this->json->encode(false), 'type case: boolean false');
+
+ $this->assertEquals('1', $this->json->encode(1), 'numeric case: 1');
+ $this->assertEquals('-1', $this->json->encode(-1), 'numeric case: -1');
+ $this->assertEquals('1.000000', $this->json->encode(1.0), 'numeric case: 1.0');
+ $this->assertEquals('1.100000', $this->json->encode(1.1), 'numeric case: 1.1');
+
+ $this->assertEquals($this->str1_j, $this->json->encode($this->str1), "string case: {$this->str1_d}");
+ $this->assertEquals($this->str2_j, $this->json->encode($this->str2), "string case: {$this->str2_d}");
+ $this->assertEquals($this->str3_j, $this->json->encode($this->str3), "string case: {$this->str3_d}");
+ $this->assertEquals($this->str4_j, $this->json->encode($this->str4), "string case: {$this->str4_d}");
+
+ $this->assertEquals($this->arr_j, $this->json->encode($this->arr), "array case: {$this->arr_d}");
+ $this->assertEquals($this->obj_j, $this->json->encode($this->obj), "object case: {$this->obj_d}");
+ }
+
+ function test_from_JSON() {
+ $this->assertEquals(null, $this->json->decode('null'), 'type case: null');
+ $this->assertEquals(true, $this->json->decode('true'), 'type case: boolean true');
+ $this->assertEquals(false, $this->json->decode('false'), 'type case: boolean false');
+
+ $this->assertEquals(1, $this->json->decode('1'), 'numeric case: 1');
+ $this->assertEquals(-1, $this->json->decode('-1'), 'numeric case: -1');
+ $this->assertEquals(1.0, $this->json->decode('1.0'), 'numeric case: 1.0');
+ $this->assertEquals(1.1, $this->json->decode('1.1'), 'numeric case: 1.1');
+
+ $this->assertEquals(11.0, $this->json->decode('1.1e1'), 'numeric case: 1.1e1');
+ $this->assertEquals(11.0, $this->json->decode('1.10e+1'), 'numeric case: 1.10e+1');
+ $this->assertEquals(0.11, $this->json->decode('1.1e-1'), 'numeric case: 1.1e-1');
+ $this->assertEquals(-0.11, $this->json->decode('-1.1e-1'), 'numeric case: -1.1e-1');
+
+ $this->assertEquals($this->str1, $this->json->decode($this->str1_j), "string case: {$this->str1_d}");
+ $this->assertEquals($this->str1, $this->json->decode($this->str1_j_), "string case: {$this->str1_d_}");
+ $this->assertEquals($this->str2, $this->json->decode($this->str2_j), "string case: {$this->str2_d}");
+ $this->assertEquals($this->str3, $this->json->decode($this->str3_j), "string case: {$this->str3_d}");
+ $this->assertEquals($this->str4, $this->json->decode($this->str4_j), "string case: {$this->str4_d}");
+ $this->assertEquals($this->str4, $this->json->decode($this->str4_j_), "string case: {$this->str4_d}");
+
+ $this->assertEquals($this->arr, $this->json->decode($this->arr_j), "array case: {$this->arr_d}");
+ $this->assertEquals($this->obj, $this->json->decode($this->obj_j), "object case: {$this->obj_d}");
+ }
+
+ function test_to_then_from_JSON() {
+ $this->assertEquals(null, $this->json->decode($this->json->encode(null)), 'type case: null');
+ $this->assertEquals(true, $this->json->decode($this->json->encode(true)), 'type case: boolean true');
+ $this->assertEquals(false, $this->json->decode($this->json->encode(false)), 'type case: boolean false');
+
+ $this->assertEquals(1, $this->json->decode($this->json->encode(1)), 'numeric case: 1');
+ $this->assertEquals(-1, $this->json->decode($this->json->encode(-1)), 'numeric case: -1');
+ $this->assertEquals(1.0, $this->json->decode($this->json->encode(1.0)), 'numeric case: 1.0');
+ $this->assertEquals(1.1, $this->json->decode($this->json->encode(1.1)), 'numeric case: 1.1');
+
+ $this->assertEquals($this->str1, $this->json->decode($this->json->encode($this->str1)), "string case: {$this->str1_d}");
+ $this->assertEquals($this->str2, $this->json->decode($this->json->encode($this->str2)), "string case: {$this->str2_d}");
+ $this->assertEquals($this->str3, $this->json->decode($this->json->encode($this->str3)), "string case: {$this->str3_d}");
+ $this->assertEquals($this->str4, $this->json->decode($this->json->encode($this->str4)), "string case: {$this->str4_d}");
+
+ $this->assertEquals($this->arr, $this->json->decode($this->json->encode($this->arr)), "array case: {$this->arr_d}");
+ $this->assertEquals($this->obj, $this->json->decode($this->json->encode($this->obj)), "object case: {$this->obj_d}");
+ }
+
+ function test_from_then_to_JSON() {
+ $this->assertEquals('null', $this->json->encode($this->json->decode('null')), 'type case: null');
+ $this->assertEquals('true', $this->json->encode($this->json->decode('true')), 'type case: boolean true');
+ $this->assertEquals('false', $this->json->encode($this->json->decode('false')), 'type case: boolean false');
+
+ $this->assertEquals('1', $this->json->encode($this->json->decode('1')), 'numeric case: 1');
+ $this->assertEquals('-1', $this->json->encode($this->json->decode('-1')), 'numeric case: -1');
+ $this->assertEquals('1.0', $this->json->encode($this->json->decode('1.0')), 'numeric case: 1.0');
+ $this->assertEquals('1.1', $this->json->encode($this->json->decode('1.1')), 'numeric case: 1.1');
+
+ $this->assertEquals($this->str1_j, $this->json->encode($this->json->decode($this->str1_j)), "string case: {$this->str1_d}");
+ $this->assertEquals($this->str2_j, $this->json->encode($this->json->decode($this->str2_j)), "string case: {$this->str2_d}");
+ $this->assertEquals($this->str3_j, $this->json->encode($this->json->decode($this->str3_j)), "string case: {$this->str3_d}");
+ $this->assertEquals($this->str4_j, $this->json->encode($this->json->decode($this->str4_j)), "string case: {$this->str4_d}");
+ $this->assertEquals($this->str4_j, $this->json->encode($this->json->decode($this->str4_j_)), "string case: {$this->str4_d}");
+
+ $this->assertEquals($this->arr_j, $this->json->encode($this->json->decode($this->arr_j)), "array case: {$this->arr_d}");
+ $this->assertEquals($this->obj_j, $this->json->encode($this->json->decode($this->obj_j)), "object case: {$this->obj_d}");
+ }
+}
+
+class JSON_AssocArray_TestCase extends DokuWikiTest {
+
+ function setUp() {
+ parent::setUp();
+
+ $this->json_l = new JSON(JSON_LOOSE_TYPE);
+ $this->json_l->skipnative = true;
+ $this->json_s = new JSON();
+ $this->json_s->skipnative = true;
+
+ $this->arr = array('car1'=> array('color'=> 'tan', 'model' => 'sedan'),
+ 'car2' => array('color' => 'red', 'model' => 'sports'));
+ $this->arr_jo = '{"car1":{"color":"tan","model":"sedan"},"car2":{"color":"red","model":"sports"}}';
+ $this->arr_d = 'associative array with nested associative arrays';
+
+ $this->arn = array(0=> array(0=> 'tan\\', 'model\\' => 'sedan'), 1 => array(0 => 'red', 'model' => 'sports'));
+ $this->arn_ja = '[{"0":"tan\\\\","model\\\\":"sedan"},{"0":"red","model":"sports"}]';
+ $this->arn_d = 'associative array with nested associative arrays, and some numeric keys thrown in';
+
+ $this->arrs = array (1 => 'one', 2 => 'two', 5 => 'five');
+ $this->arrs_jo = '{"1":"one","2":"two","5":"five"}';
+ $this->arrs_d = 'associative array numeric keys which are not fully populated in a range of 0 to length-1';
+ }
+
+ function test_type() {
+ $this->assertEquals('array', gettype($this->json_l->decode($this->arn_ja)), "loose type should be array");
+ $this->assertEquals('array', gettype($this->json_s->decode($this->arn_ja)), "strict type should be array");
+ }
+
+ function test_to_JSON() {
+ // both strict and loose JSON should result in an object
+ $this->assertEquals($this->arr_jo, $this->json_l->encode($this->arr), "array case - loose: {$this->arr_d}");
+ $this->assertEquals($this->arr_jo, $this->json_s->encode($this->arr), "array case - strict: {$this->arr_d}");
+
+ // ...unless the input array has some numeric indeces, in which case the behavior is to degrade to a regular array
+ $this->assertEquals($this->arn_ja, $this->json_s->encode($this->arn), "array case - strict: {$this->arn_d}");
+
+ // Test a sparsely populated numerically indexed associative array
+ $this->assertEquals($this->arrs_jo, $this->json_l->encode($this->arrs), "sparse numeric assoc array: {$this->arrs_d}");
+ }
+
+ function test_to_then_from_JSON() {
+ // these tests motivated by a bug in which strings that end
+ // with backslashes followed by quotes were incorrectly decoded.
+
+ foreach(array('\\"', '\\\\"', '\\"\\"', '\\""\\""', '\\\\"\\\\"') as $v) {
+ $this->assertEquals(array($v), $this->json_l->decode($this->json_l->encode(array($v))));
+ $this->assertEquals(array('a' => $v), $this->json_l->decode($this->json_l->encode(array('a' => $v))));
+ }
+ }
+}
+
+class JSON_NestedArray_TestCase extends DokuWikiTest {
+
+ function setUp() {
+ parent::setUp();
+
+ $this->json = new JSON(JSON_LOOSE_TYPE);
+ $this->json->skipnative = true;
+
+ $this->str1 = '[{"this":"that"}]';
+ $this->arr1 = array(array('this' => 'that'));
+
+ $this->str2 = '{"this":["that"]}';
+ $this->arr2 = array('this' => array('that'));
+
+ $this->str3 = '{"params":[{"foo":["1"],"bar":"1"}]}';
+ $this->arr3 = array('params' => array(array('foo' => array('1'), 'bar' => '1')));
+
+ $this->str4 = '{"0": {"foo": "bar", "baz": "winkle"}}';
+ $this->arr4 = array('0' => array('foo' => 'bar', 'baz' => 'winkle'));
+
+ $this->str5 = '{"params":[{"options": {"old": [ ], "new": {"0": {"elements": {"old": [], "new": {"0": {"elementName": "aa", "isDefault": false, "elementRank": "0", "priceAdjust": "0", "partNumber": ""}}}, "optionName": "aa", "isRequired": false, "optionDesc": null}}}}]}';
+ $this->arr5 = array (
+ 'params' => array (
+ 0 => array (
+ 'options' =>
+ array (
+ 'old' => array(),
+ 'new' => array (
+ 0 => array (
+ 'elements' => array (
+ 'old' => array(),
+ 'new' => array (
+ 0 => array (
+ 'elementName' => 'aa',
+ 'isDefault' => false,
+ 'elementRank' => '0',
+ 'priceAdjust' => '0',
+ 'partNumber' => '',
+ ),
+ ),
+ ),
+ 'optionName' => 'aa',
+ 'isRequired' => false,
+ 'optionDesc' => NULL,
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+
+ function test_type() {
+ $this->assertEquals('array', gettype($this->json->decode($this->str1)), "loose type should be array");
+ $this->assertEquals('array', gettype($this->json->decode($this->str2)), "loose type should be array");
+ $this->assertEquals('array', gettype($this->json->decode($this->str3)), "loose type should be array");
+ }
+
+ function test_from_JSON() {
+ $this->assertEquals($this->arr1, $this->json->decode($this->str1), "simple compactly-nested array");
+ $this->assertEquals($this->arr2, $this->json->decode($this->str2), "simple compactly-nested array");
+ $this->assertEquals($this->arr3, $this->json->decode($this->str3), "complex compactly nested array");
+ $this->assertEquals($this->arr4, $this->json->decode($this->str4), "complex compactly nested array");
+ $this->assertEquals($this->arr5, $this->json->decode($this->str5), "super complex compactly nested array");
+ }
+
+ function _test_from_JSON() {
+ $super = '{"params":[{"options": {"old": {}, "new": {"0": {"elements": {"old": {}, "new": {"0": {"elementName": "aa", "isDefault": false, "elementRank": "0", "priceAdjust": "0", "partNumber": ""}}}, "optionName": "aa", "isRequired": false, "optionDesc": ""}}}}]}';
+ print("trying {$super}...\n");
+ print var_export($this->json->decode($super));
+ }
+}
+
+class JSON_Object_TestCase extends DokuWikiTest {
+
+ function setUp() {
+ parent::setUp();
+
+ $this->json_l = new JSON(JSON_LOOSE_TYPE);
+ $this->json_l->skipnative = true;
+ $this->json_s = new JSON();
+ $this->json_s->skipnative = true;
+
+ $this->obj_j = '{"a_string":"\"he\":llo}:{world","an_array":[1,2,3],"obj":{"a_number":123}}';
+
+ $this->obj1 = new stdClass();
+ $this->obj1->car1 = new stdClass();
+ $this->obj1->car1->color = 'tan';
+ $this->obj1->car1->model = 'sedan';
+ $this->obj1->car2 = new stdClass();
+ $this->obj1->car2->color = 'red';
+ $this->obj1->car2->model = 'sports';
+ $this->obj1_j = '{"car1":{"color":"tan","model":"sedan"},"car2":{"color":"red","model":"sports"}}';
+ $this->obj1_d = 'Object with nested objects';
+ }
+
+ function test_type() {
+ $this->assertEquals('object', gettype($this->json_s->decode($this->obj_j)), "checking whether decoded type is object");
+ $this->assertEquals('array', gettype($this->json_l->decode($this->obj_j)), "checking whether decoded type is array");
+ }
+
+ function test_to_JSON() {
+ $this->assertEquals($this->obj1_j, $this->json_s->encode($this->obj1), "object - strict: {$this->obj1_d}");
+ $this->assertEquals($this->obj1_j, $this->json_l->encode($this->obj1), "object - loose: {$this->obj1_d}");
+ }
+
+ function test_from_then_to_JSON() {
+ $this->assertEquals($this->obj_j, $this->json_s->encode($this->json_s->decode($this->obj_j)), "object case");
+ $this->assertEquals($this->obj_j, $this->json_l->encode($this->json_l->decode($this->obj_j)), "array case");
+ }
+}
+
+class JSON_Spaces_Comments_TestCase extends DokuWikiTest {
+
+ function setUp() {
+ parent::setUp();
+
+ $this->json = new JSON(JSON_LOOSE_TYPE);
+ $this->json->skipnative = true;
+
+ $this->obj_j = '{"a_string":"\"he\":llo}:{world","an_array":[1,2,3],"obj":{"a_number":123}}';
+
+ $this->obj_js = '{"a_string": "\"he\":llo}:{world",
+ "an_array":[1, 2, 3],
+ "obj": {"a_number":123}}';
+
+ $this->obj_jc1 = '{"a_string": "\"he\":llo}:{world",
+ // here is a comment, hoorah
+ "an_array":[1, 2, 3],
+ "obj": {"a_number":123}}';
+
+ $this->obj_jc2 = '/* this here is the sneetch */ "the sneetch"
+ // this has been the sneetch.';
+
+ $this->obj_jc3 = '{"a_string": "\"he\":llo}:{world",
+ /* here is a comment, hoorah */
+ "an_array":[1, 2, 3 /* and here is another */],
+ "obj": {"a_number":123}}';
+
+ $this->obj_jc4 = '{\'a_string\': "\"he\":llo}:{world",
+ /* here is a comment, hoorah */
+ \'an_array\':[1, 2, 3 /* and here is another */],
+ "obj": {"a_number":123}}';
+ }
+
+ function test_spaces() {
+ $this->assertEquals($this->json->decode($this->obj_j), $this->json->decode($this->obj_js), "checking whether notation with spaces works");
+ }
+
+ function test_comments() {
+ $this->assertEquals($this->json->decode($this->obj_j), $this->json->decode($this->obj_jc1), "checking whether notation with single line comments works");
+ $this->assertEquals('the sneetch', $this->json->decode($this->obj_jc2), "checking whether notation with multiline comments works");
+ $this->assertEquals($this->json->decode($this->obj_j), $this->json->decode($this->obj_jc3), "checking whether notation with multiline comments works");
+ $this->assertEquals($this->json->decode($this->obj_j), $this->json->decode($this->obj_jc4), "checking whether notation with single-quotes and multiline comments works");
+ }
+}
+
+class JSON_Empties_TestCase extends DokuWikiTest {
+
+ function setUp() {
+ parent::setUp();
+
+ $this->json_l = new JSON(JSON_LOOSE_TYPE);
+ $this->json_l->skipnative = true;
+ $this->json_l->skipnative = true;
+ $this->json_s = new JSON();
+ $this->json_s->skipnative = true;
+
+ $this->obj0_j = '{}';
+ $this->arr0_j = '[]';
+
+ $this->obj1_j = '{ }';
+ $this->arr1_j = '[ ]';
+
+ $this->obj2_j = '{ /* comment inside */ }';
+ $this->arr2_j = '[ /* comment inside */ ]';
+ }
+
+ function test_type() {
+ $this->assertEquals('array', gettype($this->json_l->decode($this->arr0_j)), "should be array");
+ $this->assertEquals('object', gettype($this->json_s->decode($this->obj0_j)), "should be object");
+
+ $this->assertEquals(0, count($this->json_l->decode($this->arr0_j)), "should be empty array");
+ $this->assertEquals(0, count(get_object_vars($this->json_s->decode($this->obj0_j))), "should be empty object");
+
+ $this->assertEquals('array', gettype($this->json_l->decode($this->arr1_j)), "should be array, even with space");
+ $this->assertEquals('object', gettype($this->json_s->decode($this->obj1_j)), "should be object, even with space");
+
+ $this->assertEquals(0, count($this->json_l->decode($this->arr1_j)), "should be empty array, even with space");
+ $this->assertEquals(0, count(get_object_vars($this->json_s->decode($this->obj1_j))), "should be empty object, even with space");
+
+ $this->assertEquals('array', gettype($this->json_l->decode($this->arr2_j)), "should be array, despite comment");
+ $this->assertEquals('object', gettype($this->json_s->decode($this->obj2_j)), "should be object, despite comment");
+
+ $this->assertEquals(0, count($this->json_l->decode($this->arr2_j)), "should be empty array, despite comment");
+ $this->assertEquals(0, count(get_object_vars($this->json_s->decode($this->obj2_j))), "should be empty object, despite commentt");
+ }
+}
+
+class JSON_UnquotedKeys_TestCase extends DokuWikiTest {
+
+ function setUp() {
+ parent::setUp();
+
+ $this->json = new JSON(JSON_LOOSE_TYPE);
+ $this->json->skipnative = true;
+
+ $this->arn = array(0=> array(0=> 'tan', 'model' => 'sedan'), 1 => array(0 => 'red', 'model' => 'sports'));
+ $this->arn_ja = '[{0:"tan","model":"sedan"},{"0":"red",model:"sports"}]';
+ $this->arn_d = 'associative array with unquoted keys, nested associative arrays, and some numeric keys thrown in';
+
+ $this->arrs = array (1 => 'one', 2 => 'two', 5 => 'fi"ve');
+ $this->arrs_jo = '{"1":"one",2:"two","5":\'fi"ve\'}';
+ $this->arrs_d = 'associative array with unquoted keys, single-quoted values, numeric keys which are not fully populated in a range of 0 to length-1';
+ }
+
+ function test_from_JSON() {
+ // ...unless the input array has some numeric indeces, in which case the behavior is to degrade to a regular array
+ $this->assertEquals($this->arn, $this->json->decode($this->arn_ja), "array case - strict: {$this->arn_d}");
+
+ // Test a sparsely populated numerically indexed associative array
+ $this->assertEquals($this->arrs, $this->json->decode($this->arrs_jo), "sparse numeric assoc array: {$this->arrs_d}");
+ }
+}
+
diff --git a/_test/cases/inc/mail_isvalid.test.php b/_test/tests/inc/mail_isvalid.test.php
index d8c88765e..25e6b1f7b 100644
--- a/_test/cases/inc/mail_isvalid.test.php
+++ b/_test/tests/inc/mail_isvalid.test.php
@@ -1,8 +1,6 @@
<?php
-// use no mbstring help here
-require_once DOKU_INC.'inc/mail.php';
-class mail_isvalid extends UnitTestCase {
+class mail_isvalid extends DokuWikiTest {
function test1(){
@@ -69,12 +67,11 @@ class mail_isvalid extends UnitTestCase {
foreach($tests as $test){
$info = 'Testing '.$test[0];
- $this->signal('failinfo',$info);
if($test[1]){
- $this->assertTrue((bool) mail_isvalid($test[0]));
+ $this->assertTrue((bool) mail_isvalid($test[0]), $info);
}else{
- $this->assertFalse((bool) mail_isvalid($test[0]));
+ $this->assertFalse((bool) mail_isvalid($test[0]), $info);
}
}
}
diff --git a/_test/cases/inc/mail_quoted_printable_encode.php b/_test/tests/inc/mail_quoted_printable_encode.test.php
index a5a36e35b..52ddf6228 100644
--- a/_test/cases/inc/mail_quoted_printable_encode.php
+++ b/_test/tests/inc/mail_quoted_printable_encode.test.php
@@ -1,43 +1,41 @@
<?php
-require_once DOKU_INC.'inc/mail.php';
-
-class mail_quotedprintable_encode extends UnitTestCase {
+class mail_quotedprintable_encode extends DokuWikiTest {
function test_simple(){
$in = 'hello';
$out = 'hello';
- $this->assertEqual(mail_quotedprintable_encode($in),$out);
+ $this->assertEquals(mail_quotedprintable_encode($in),$out);
}
function test_spaceend(){
$in = "hello \nhello";
$out = "hello=20\nhello";
- $this->assertEqual(mail_quotedprintable_encode($in),$out);
+ $this->assertEquals(mail_quotedprintable_encode($in),$out);
}
function test_german_utf8(){
$in = 'hello überlänge';
$out = 'hello =C3=BCberl=C3=A4nge';
- $this->assertEqual(mail_quotedprintable_encode($in),$out);
+ $this->assertEquals(mail_quotedprintable_encode($in),$out);
}
function test_wrap(){
$in = '123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789';
$out = "123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234=\n56789 123456789";
- $this->assertEqual(mail_quotedprintable_encode($in,74),$out);
+ $this->assertEquals(mail_quotedprintable_encode($in,74),$out);
}
function test_nowrap(){
$in = '123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789';
$out = '123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789';
- $this->assertEqual(mail_quotedprintable_encode($in,0),$out);
+ $this->assertEquals(mail_quotedprintable_encode($in,0),$out);
}
function test_russian_utf8(){
$in = 'Ваш пароль для системы Доку Вики';
$out = '=D0=92=D0=B0=D1=88 =D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8C =D0=B4=D0=BB=D1=8F =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B =D0=94=D0=BE=D0=BA=D1=83 =D0=92=D0=B8=D0=BA=D0=B8';
- $this->assertEqual(mail_quotedprintable_encode($in,0),$out);
+ $this->assertEquals(mail_quotedprintable_encode($in,0),$out);
}
}
diff --git a/_test/tests/inc/mailer.test.php b/_test/tests/inc/mailer.test.php
new file mode 100644
index 000000000..b2c74a257
--- /dev/null
+++ b/_test/tests/inc/mailer.test.php
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * Extends the mailer class to expose internal variables for testing
+ */
+class TestMailer extends Mailer {
+ public function prop($name){
+ return $this->$name;
+ }
+}
+
+class mailer_test extends DokuWikiTest {
+
+
+ function test_userheader(){
+ $mail = new TestMailer();
+ $headers = $mail->prop('headers');
+ $this->assertArrayNotHasKey('X-Dokuwiki-User',$headers);
+
+ $_SERVER['REMOTE_USER'] = 'andi';
+ $mail = new TestMailer();
+ $headers = $mail->prop('headers');
+ $this->assertArrayHasKey('X-Dokuwiki-User',$headers);
+ }
+
+ function test_setHeader(){
+ $mail = new TestMailer();
+
+ // check existance of default headers
+ $headers = $mail->prop('headers');
+ $this->assertArrayHasKey('X-Mailer',$headers);
+ $this->assertArrayHasKey('X-Dokuwiki-Title',$headers);
+ $this->assertArrayHasKey('X-Dokuwiki-Server',$headers);
+ $this->assertArrayHasKey('X-Auto-Response-Suppress',$headers);
+ $this->assertArrayHasKey('List-Id',$headers);
+
+ // set a bunch of test headers
+ $mail->setHeader('test-header','bla');
+ $mail->setHeader('to','A valid ASCII name <test@example.com>');
+ $mail->setHeader('from',"Thös ne\needs\x00serious cleaning$§%.");
+ $mail->setHeader('bad',"Thös ne\needs\x00serious cleaning$§%.",false);
+ $mail->setHeader("weird\n*+\x00foo.-_@bar?",'now clean');
+
+ // are they set?
+ $headers = $mail->prop('headers');
+ $this->assertArrayHasKey('Test-Header',$headers);
+ $this->assertEquals('bla',$headers['Test-Header']);
+ $this->assertArrayHasKey('To',$headers);
+ $this->assertEquals('A valid ASCII name <test@example.com>',$headers['To']);
+ $this->assertArrayHasKey('From',$headers);
+ $this->assertEquals('Ths neeedsserious cleaning.',$headers['From']);
+ $this->assertArrayHasKey('Bad',$headers);
+ $this->assertEquals("Thös ne\needs\x00serious cleaning$§%.",$headers['Bad']);
+ $this->assertArrayHasKey('Weird+foo.-_@bar',$headers);
+
+ // unset a header again
+ $mail->setHeader('test-header','');
+ $headers = $mail->prop('headers');
+ $this->assertArrayNotHasKey('Test-Header',$headers);
+ }
+
+ function test_simplemail(){
+ global $conf;
+ $conf['htmlmail'] = 0;
+ $mail = new TestMailer();
+ $mail->to('test@example.com');
+ $mail->setBody('A test mail in ASCII');
+
+ $dump = $mail->dump();
+ $this->assertNotRegexp('/Content-Type: multipart/',$dump);
+ $this->assertRegexp('#Content-Type: text/plain; charset=UTF-8#',$dump);
+ $this->assertRegexp('/'.base64_encode('A test mail in ASCII').'/',$dump);
+
+ $conf['htmlmail'] = 1;
+ }
+
+ function test_replacements(){
+ $mail = new TestMailer();
+
+ $replacements = array( '@DATE@','@BROWSER@','@IPADDRESS@','@HOSTNAME@',
+ '@TITLE@','@DOKUWIKIURL@','@USER@','@NAME@','@MAIL@');
+ $mail->setBody('A test mail in with replacements '.join(' ',$replacements));
+
+ $text = $mail->prop('text');
+ $html = $mail->prop('html');
+
+ foreach($replacements as $repl){
+ $this->assertNotRegexp("/$repl/",$text,"$repl replacement still in text");
+ $this->assertNotRegexp("/$repl/",$html,"$repl replacement still in html");
+ }
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/pageutils_clean_id.test.php b/_test/tests/inc/pageutils_clean_id.test.php
index 167229c7f..9c5781b24 100644
--- a/_test/cases/inc/pageutils_clean_id.test.php
+++ b/_test/tests/inc/pageutils_clean_id.test.php
@@ -1,8 +1,6 @@
<?php
-require_once DOKU_INC.'inc/utf8.php';
-require_once DOKU_INC.'inc/pageutils.php';
-class init_clean_id_test extends UnitTestCase {
+class init_clean_id_test extends DokuWikiTest {
function teardown() {
global $cache_cleanid;
@@ -50,7 +48,7 @@ class init_clean_id_test extends UnitTestCase {
$tests[] = array('page/page',false,'page_page');
foreach($tests as $test){
- $this->assertEqual(cleanID($test[0],$test[1]),$test[2]);
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
}
$conf['useslash'] = 1;
@@ -60,7 +58,7 @@ class init_clean_id_test extends UnitTestCase {
$this->teardown();
foreach($tests as $test){
- $this->assertEqual(cleanID($test[0],$test[1]),$test[2]);
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
}
}
@@ -77,7 +75,7 @@ class init_clean_id_test extends UnitTestCase {
$tests[] = array('pa%ge',false,'pa-ge');
foreach($tests as $test){
- $this->assertEqual(cleanID($test[0],$test[1]),$test[2]);
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
}
}
@@ -97,7 +95,7 @@ class init_clean_id_test extends UnitTestCase {
$tests[] = array('ښ侧化并곦ঝഈβ',false,'ښ侧化并곦ঝഈβ');
foreach($tests as $test){
- $this->assertEqual(cleanID($test[0],$test[1]),$test[2]);
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
}
}
@@ -117,7 +115,7 @@ class init_clean_id_test extends UnitTestCase {
$tests[] = array('ښ侧化并곦ঝഈβ',false,'ښ侧化并곦ঝഈβ');
foreach($tests as $test){
- $this->assertEqual(cleanID($test[0],$test[1]),$test[2]);
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
}
}
@@ -137,19 +135,19 @@ class init_clean_id_test extends UnitTestCase {
$tests[] = array('ښ侧化并곦ঝഈβ',true,'');
foreach($tests as $test){
- $this->assertEqual(cleanID($test[0],$test[1]),$test[2]);
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
}
$conf['deaccent'] = 1;
foreach($tests as $test){
- $this->assertEqual(cleanID($test[0],$test[1]),$test[2]);
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
}
$conf['deaccent'] = 2;
foreach($tests as $test){
- $this->assertEqual(cleanID($test[0],$test[1]),$test[2]);
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
}
}
diff --git a/_test/tests/inc/pageutils_findnearest.test.php b/_test/tests/inc/pageutils_findnearest.test.php
new file mode 100644
index 000000000..e129b5e58
--- /dev/null
+++ b/_test/tests/inc/pageutils_findnearest.test.php
@@ -0,0 +1,40 @@
+<?php
+
+class pageutils_findnearest_test extends DokuWikiTest {
+ function testNoSidebar() {
+ global $ID;
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals(false, $sidebar);
+ }
+
+ function testExistingSidebars() {
+ global $ID;
+
+ saveWikiText('sidebar', 'topsidebar-test', '');
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('sidebar', $sidebar);
+
+ $ID = 'foo';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('sidebar', $sidebar);
+
+ saveWikiText('foo:bar:sidebar', 'bottomsidebar-test', '');
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('foo:bar:sidebar', $sidebar);
+
+ $ID = 'foo:bar:test';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('foo:bar:sidebar', $sidebar);
+
+ $ID = 'foo';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('sidebar', $sidebar);
+ }
+
+}
diff --git a/_test/cases/inc/pageutils_getid.test.php b/_test/tests/inc/pageutils_getid.test.php
index 6eddeb5ea..0fcd58666 100644
--- a/_test/cases/inc/pageutils_getid.test.php
+++ b/_test/tests/inc/pageutils_getid.test.php
@@ -1,12 +1,10 @@
<?php
-require_once DOKU_INC.'inc/utf8.php';
-require_once DOKU_INC.'inc/pageutils.php';
-class init_getID_test extends UnitTestCase {
+class init_getID_test extends DokuWikiTest {
/**
* fetch media files with basedir and urlrewrite=2
- *
+ *
* data provided by Jan Decaluwe <jan@jandecaluwe.com>
*/
function test1(){
@@ -19,7 +17,7 @@ class init_getID_test extends UnitTestCase {
$_SERVER['SCRIPT_FILENAME'] = '/lib/exe/fetch.php';
$_SERVER['REQUEST_URI'] = '/lib/exe/fetch.php/myhdl-0.5dev1.tar.gz?id=snapshots&cache=cache';
- $this->assertEqual(getID('media'), 'myhdl-0.5dev1.tar.gz');
+ $this->assertEquals(getID('media'), 'myhdl-0.5dev1.tar.gz');
}
@@ -41,8 +39,8 @@ class init_getID_test extends UnitTestCase {
$_SERVER['PATH_INFO'] = '/wiki/discussion/button-dw.png';
$_SERVER['PATH_TRANSLATED'] = '/var/www/wiki/discussion/button-dw.png';
- $this->assertEqual(getID('media',true), 'wiki:discussion:button-dw.png');
- $this->assertEqual(getID('media',false), 'wiki/discussion/button-dw.png');
+ $this->assertEquals(getID('media',true), 'wiki:discussion:button-dw.png');
+ $this->assertEquals(getID('media',false), 'wiki/discussion/button-dw.png');
}
/**
@@ -61,7 +59,7 @@ class init_getID_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = '/var/www/wiki:dokuwiki';
$_SERVER['PHP_SELF'] = '/dokuwiki/doku.php/wiki:dokuwiki';
- $this->assertEqual(getID(), 'wiki:dokuwiki');
+ $this->assertEquals(getID(), 'wiki:dokuwiki');
}
/**
@@ -72,6 +70,8 @@ class init_getID_test extends UnitTestCase {
$conf['basedir'] = '';
$conf['userewrite'] = '2';
$conf['baseurl'] = '';
+ $conf['useslash'] = '1';
+
$_SERVER['DOCUMENT_ROOT'] = '/var/www/vhosts/example.com/htdocs';
$_SERVER['SCRIPT_FILENAME'] = '/var/www/vhosts/example.com/htdocs/doku.php';
$_SERVER['SCRIPT_NAME'] = '/doku.php';
@@ -80,7 +80,7 @@ class init_getID_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = '/var/www/vhosts/example.com/htdocs/doku.php';
$_SERVER['PHP_SELF'] = '/doku.php/wiki/dokuwiki';
- $this->assertEqual(getID(), 'wiki:dokuwiki');
+ $this->assertEquals(getID(), 'wiki:dokuwiki');
}
/**
@@ -99,7 +99,7 @@ class init_getID_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = '/var/www/index.html';
$_SERVER['PHP_SELF'] = '/dokuwiki/doku.php/';
- $this->assertEqual(getID(), cleanID($conf['start']));
+ $this->assertEquals(getID(), cleanID($conf['start']));
}
}
diff --git a/_test/cases/inc/pageutils_resolve_id.test.php b/_test/tests/inc/pageutils_resolve_id.test.php
index 9aa4ee8b7..23a2405d4 100644
--- a/_test/cases/inc/pageutils_resolve_id.test.php
+++ b/_test/tests/inc/pageutils_resolve_id.test.php
@@ -1,8 +1,6 @@
<?php
-require_once DOKU_INC.'inc/utf8.php';
-require_once DOKU_INC.'inc/pageutils.php';
-class init_resolve_id_test extends UnitTestCase {
+class init_resolve_id_test extends DokuWikiTest {
function test1(){
@@ -37,7 +35,7 @@ class init_resolve_id_test extends UnitTestCase {
$tests[] = array('lev1:lev2','..:..:lev3:..:page:....:...','page');
foreach($tests as $test){
- $this->assertEqual(resolve_id($test[0],$test[1]),$test[2]);
+ $this->assertEquals(resolve_id($test[0],$test[1]),$test[2]);
}
}
diff --git a/_test/cases/inc/pageutils_resolve_pageid.test.php b/_test/tests/inc/pageutils_resolve_pageid.test.php
index c65ed1866..41a441658 100644
--- a/_test/cases/inc/pageutils_resolve_pageid.test.php
+++ b/_test/tests/inc/pageutils_resolve_pageid.test.php
@@ -1,11 +1,6 @@
<?php
-require_once DOKU_INC.'inc/utf8.php';
-require_once DOKU_INC.'inc/pageutils.php';
-global $conf;
-if (!isset($conf['datadir'])) $conf['datadir'] = $conf['savedir'].'/pages';
-
-class init_resolve_pageid_test extends UnitTestCase {
+class init_resolve_pageid_test extends DokuWikiTest {
function test1(){
@@ -48,7 +43,6 @@ class init_resolve_pageid_test extends UnitTestCase {
$tests[] = array('foo','.:','foo:start');
$tests[] = array('','foo:','foo:start');
$tests[] = array('foo','foo:','foo:start');
- $tests[] = array('foo','playground:','playground:playground');
// empty $page
global $ID;
@@ -59,7 +53,7 @@ class init_resolve_pageid_test extends UnitTestCase {
$page = $test[1];
resolve_pageid($test[0],$page,$foo);
- $this->assertEqual($page,$test[2]);
+ $this->assertEquals($page,$test[2]);
}
}
@@ -69,7 +63,6 @@ class init_resolve_pageid_test extends UnitTestCase {
function test_resolve_pageid_empty_homepage() {
global $ID;
$ID = '';
-
global $conf;
$conf['start'] = 'someverystrangestartname';
@@ -78,7 +71,7 @@ class init_resolve_pageid_test extends UnitTestCase {
$exist = true;
resolve_pageid($ns, $page, $exist);
- $this->assertEqual($page, $conf['start']);
+ $this->assertEquals($page, $conf['start']);
}
}
diff --git a/_test/tests/inc/parser/lexer.test.php b/_test/tests/inc/parser/lexer.test.php
new file mode 100644
index 000000000..d0965a13e
--- /dev/null
+++ b/_test/tests/inc/parser/lexer.test.php
@@ -0,0 +1,531 @@
+<?php
+/**
+* @version $Id: lexer.todo.php,v 1.2 2005/03/25 21:00:22 harryf Exp $
+* @package Doku
+* @subpackage Tests
+*/
+
+/**
+* Includes
+*/
+require_once DOKU_INC . 'inc/parser/lexer.php';
+
+/**
+* @package Doku
+* @subpackage Tests
+*/
+class TestOfLexerParallelRegex extends DokuWikiTest {
+
+ function testNoPatterns() {
+ $regex = new Doku_LexerParallelRegex(false);
+ $this->assertFalse($regex->match("Hello", $match));
+ $this->assertEquals($match, "");
+ }
+ function testNoSubject() {
+ $regex = new Doku_LexerParallelRegex(false);
+ $regex->addPattern(".*");
+ $this->assertTrue($regex->match("", $match));
+ $this->assertEquals($match, "");
+ }
+ function testMatchAll() {
+ $regex = new Doku_LexerParallelRegex(false);
+ $regex->addPattern(".*");
+ $this->assertTrue($regex->match("Hello", $match));
+ $this->assertEquals($match, "Hello");
+ }
+ function testCaseSensitive() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("abc");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEquals($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEquals($match, "abc");
+ }
+ function testCaseInsensitive() {
+ $regex = new Doku_LexerParallelRegex(false);
+ $regex->addPattern("abc");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEquals($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEquals($match, "ABC");
+ }
+ function testMatchMultiple() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("abc");
+ $regex->addPattern("ABC");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEquals($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEquals($match, "ABC");
+ $this->assertFalse($regex->match("Hello", $match));
+ }
+ function testPatternLabels() {
+ $regex = new Doku_LexerParallelRegex(false);
+ $regex->addPattern("abc", "letter");
+ $regex->addPattern("123", "number");
+ $this->assertEquals($regex->match("abcdef", $match), "letter");
+ $this->assertEquals($match, "abc");
+ $this->assertEquals($regex->match("0123456789", $match), "number");
+ $this->assertEquals($match, "123");
+ }
+ function testMatchMultipleWithLookaheadNot() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("abc");
+ $regex->addPattern("ABC");
+ $regex->addPattern("a(?!\n).{1}");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEquals($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEquals($match, "ABC");
+ $this->assertTrue($regex->match("a\nab", $match));
+ $this->assertEquals($match, "ab");
+ $this->assertFalse($regex->match("Hello", $match));
+ }
+ function testMatchSetOptionCaseless() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("a(?i)b(?i)c");
+ $this->assertTrue($regex->match("aBc", $match));
+ $this->assertEquals($match, "aBc");
+ }
+ function testMatchSetOptionUngreedy() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("(?U)\w+");
+ $this->assertTrue($regex->match("aaaaaa", $match));
+ $this->assertEquals($match, "a");
+ }
+ function testMatchLookaheadEqual() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("\w(?=c)");
+ $this->assertTrue($regex->match("xbyczd", $match));
+ $this->assertEquals($match, "y");
+ }
+ function testMatchLookaheadNot() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("\w(?!b|c)");
+ $this->assertTrue($regex->match("xbyczd", $match));
+ $this->assertEquals($match, "b");
+ }
+ function testMatchLookbehindEqual() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("(?<=c)\w");
+ $this->assertTrue($regex->match("xbyczd", $match));
+ $this->assertEquals($match, "z");
+ }
+ function testMatchLookbehindNot() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("(?<!\A|x|b)\w");
+ $this->assertTrue($regex->match("xbyczd", $match));
+ $this->assertEquals($match, "c");
+ }
+}
+
+
+class TestOfLexerStateStack extends DokuWikiTest {
+ function testStartState() {
+ $stack = new Doku_LexerStateStack("one");
+ $this->assertEquals($stack->getCurrent(), "one");
+ }
+ function testExhaustion() {
+ $stack = new Doku_LexerStateStack("one");
+ $this->assertFalse($stack->leave());
+ }
+ function testStateMoves() {
+ $stack = new Doku_LexerStateStack("one");
+ $stack->enter("two");
+ $this->assertEquals($stack->getCurrent(), "two");
+ $stack->enter("three");
+ $this->assertEquals($stack->getCurrent(), "three");
+ $this->assertTrue($stack->leave());
+ $this->assertEquals($stack->getCurrent(), "two");
+ $stack->enter("third");
+ $this->assertEquals($stack->getCurrent(), "third");
+ $this->assertTrue($stack->leave());
+ $this->assertTrue($stack->leave());
+ $this->assertEquals($stack->getCurrent(), "one");
+ }
+}
+
+class TestParser {
+ function TestParser() {
+ }
+ function accept() {
+ }
+ function a() {
+ }
+ function b() {
+ }
+}
+
+class TestOfLexer extends DokuWikiTest {
+ function testNoPatterns() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->never())->method('accept');
+ $lexer = new Doku_Lexer($handler);
+ $this->assertFalse($lexer->parse("abcdef"));
+ }
+ function testEmptyPage() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->never())->method('accept');
+ $lexer = new Doku_Lexer($handler);
+ $lexer->addPattern("a+");
+ $this->assertTrue($lexer->parse(""));
+ }
+ function testSinglePattern() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('accept')
+ ->with("aaa", DOKU_LEXER_MATCHED, 0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('accept')
+ ->with("x", DOKU_LEXER_UNMATCHED, 3)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('accept')
+ ->with("a", DOKU_LEXER_MATCHED, 4)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('accept')
+ ->with("yyy", DOKU_LEXER_UNMATCHED, 5)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('accept')
+ ->with("a", DOKU_LEXER_MATCHED, 8)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('accept')
+ ->with("x", DOKU_LEXER_UNMATCHED, 9)->will($this->returnValue(true));
+ $handler->expects($this->at(6))->method('accept')
+ ->with("aaa", DOKU_LEXER_MATCHED, 10)->will($this->returnValue(true));
+ $handler->expects($this->at(7))->method('accept')
+ ->with("z", DOKU_LEXER_UNMATCHED, 13)->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler);
+ $lexer->addPattern("a+");
+ $this->assertTrue($lexer->parse("aaaxayyyaxaaaz"));
+ }
+ function testMultiplePattern() {
+ $handler = $this->getMock('TestParser', array('accept'));
+ $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x");
+ $positions = array(0, 1, 2, 3, 5, 6, 7, 8, 14, 15);
+ for ($i = 0; $i < count($target); $i++) {
+ $handler->expects($this->at($i))->method('accept')
+ ->with($target[$i], $this->anything(), $positions[$i])->will($this->returnValue(true));
+ }
+ $lexer = new Doku_Lexer($handler);
+ $lexer->addPattern("a+");
+ $lexer->addPattern("b+");
+ $this->assertTrue($lexer->parse("ababbxbaxxxxxxax"));
+ }
+}
+
+class TestOfLexerModes extends DokuWikiTest {
+ function testIsolatedPattern() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("a", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,1)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,2)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('a')
+ ->with("bxb", DOKU_LEXER_UNMATCHED,4)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('a')
+ ->with("aaa", DOKU_LEXER_MATCHED,7)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('a')
+ ->with("x", DOKU_LEXER_UNMATCHED,10)->will($this->returnValue(true));
+ $handler->expects($this->at(6))->method('a')
+ ->with("aaaa", DOKU_LEXER_MATCHED,11)->will($this->returnValue(true));
+ $handler->expects($this->at(7))->method('a')
+ ->with("x", DOKU_LEXER_UNMATCHED,15)->will($this->returnValue(true));
+ $lexer = new Doku_Lexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addPattern("b+", "b");
+ $this->assertTrue($lexer->parse("abaabxbaaaxaaaax"));
+ }
+ function testModeChange() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("a", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,1)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,2)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,4)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('a')
+ ->with("aaa", DOKU_LEXER_MATCHED,5)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('b')
+ ->with(":", DOKU_LEXER_ENTER,8)->will($this->returnValue(true));
+ $handler->expects($this->at(6))->method('b')
+ ->with("a", DOKU_LEXER_UNMATCHED,9)->will($this->returnValue(true));
+ $handler->expects($this->at(7))->method('b')
+ ->with("b", DOKU_LEXER_MATCHED, 10)->will($this->returnValue(true));
+ $handler->expects($this->at(8))->method('b')
+ ->with("a", DOKU_LEXER_UNMATCHED,11)->will($this->returnValue(true));
+ $handler->expects($this->at(9))->method('b')
+ ->with("bb", DOKU_LEXER_MATCHED,12)->will($this->returnValue(true));
+ $handler->expects($this->at(10))->method('b')
+ ->with("a", DOKU_LEXER_UNMATCHED,14)->will($this->returnValue(true));
+ $handler->expects($this->at(11))->method('b')
+ ->with("bbb", DOKU_LEXER_MATCHED,15)->will($this->returnValue(true));
+ $handler->expects($this->at(12))->method('b')
+ ->with("a", DOKU_LEXER_UNMATCHED,18)->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addEntryPattern(":", "a", "b");
+ $lexer->addPattern("b+", "b");
+ $this->assertTrue($lexer->parse("abaabaaa:ababbabbba"));
+ }
+ function testNesting() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,2)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,3)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,5)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('b')
+ ->with("(", DOKU_LEXER_ENTER,6)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('b')
+ ->with("bb", DOKU_LEXER_MATCHED,7)->will($this->returnValue(true));
+ $handler->expects($this->at(6))->method('b')
+ ->with("a", DOKU_LEXER_UNMATCHED,9)->will($this->returnValue(true));
+ $handler->expects($this->at(7))->method('b')
+ ->with("bb", DOKU_LEXER_MATCHED,10)->will($this->returnValue(true));
+ $handler->expects($this->at(8))->method('b')
+ ->with(")", DOKU_LEXER_EXIT,12)->will($this->returnValue(true));
+ $handler->expects($this->at(9))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,13)->will($this->returnValue(true));
+ $handler->expects($this->at(10))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,15)->will($this->returnValue(true));
+
+
+ $lexer = new Doku_Lexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addEntryPattern("(", "a", "b");
+ $lexer->addPattern("b+", "b");
+ $lexer->addExitPattern(")", "b");
+ $this->assertTrue($lexer->parse("aabaab(bbabb)aab"));
+ }
+ function testSingular() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('b')
+ ->with("b", DOKU_LEXER_SPECIAL,2)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,3)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('a')
+ ->with("xx", DOKU_LEXER_UNMATCHED,5)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('b')
+ ->with("bbb", DOKU_LEXER_SPECIAL,7)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('a')
+ ->with("xx", DOKU_LEXER_UNMATCHED,10)->will($this->returnValue(true));
+ $lexer = new Doku_Lexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addSpecialPattern("b+", "a", "b");
+ $this->assertTrue($lexer->parse("aabaaxxbbbxx"));
+ }
+ function testUnwindTooFar() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('a')
+ ->with(")", DOKU_LEXER_EXIT,2)->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addExitPattern(")", "a");
+ $this->assertFalse($lexer->parse("aa)aa"));
+ }
+}
+
+class TestOfLexerHandlers extends DokuWikiTest {
+ function testModeMapping() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('a')
+ ->with("(", DOKU_LEXER_ENTER,2)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('a')
+ ->with("bb", DOKU_LEXER_MATCHED,3)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('a')
+ ->with("a", DOKU_LEXER_UNMATCHED,5)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('a')
+ ->with("bb", DOKU_LEXER_MATCHED,6)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('a')
+ ->with(")", DOKU_LEXER_EXIT,8)->will($this->returnValue(true));
+ $handler->expects($this->at(6))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,9)->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "mode_a");
+ $lexer->addPattern("a+", "mode_a");
+ $lexer->addEntryPattern("(", "mode_a", "mode_b");
+ $lexer->addPattern("b+", "mode_b");
+ $lexer->addExitPattern(")", "mode_b");
+ $lexer->mapHandler("mode_a", "a");
+ $lexer->mapHandler("mode_b", "a");
+ $this->assertTrue($lexer->parse("aa(bbabb)b"));
+ }
+}
+
+class TestParserByteIndex {
+
+ function TestParserByteIndex() {}
+
+ function ignore() {}
+
+ function caught() {}
+}
+
+class TestOfLexerByteIndices extends DokuWikiTest {
+
+ function testIndex() {
+ $doc = "aaa<file>bcd</file>eee";
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('caught')
+ ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('caught')
+ ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('caught')
+ ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('caught')
+ ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('caught')
+ ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "ignore");
+ $lexer->addEntryPattern("<file>", "ignore", "caught");
+ $lexer->addExitPattern("</file>", "caught");
+ $lexer->addSpecialPattern('b','caught','special');
+ $lexer->mapHandler('special','caught');
+ $lexer->addPattern('c','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+ function testIndexLookaheadEqual() {
+ $doc = "aaa<file>bcd</file>eee";
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('caught')
+ ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('caught')
+ ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('caught')
+ ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('caught')
+ ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('caught')
+ ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "ignore");
+ $lexer->addEntryPattern('<file>(?=.*</file>)', "ignore", "caught");
+ $lexer->addExitPattern("</file>", "caught");
+ $lexer->addSpecialPattern('b','caught','special');
+ $lexer->mapHandler('special','caught');
+ $lexer->addPattern('c','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+ function testIndexLookaheadNotEqual() {
+ $doc = "aaa<file>bcd</file>eee";
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('caught')
+ ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('caught')
+ ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('caught')
+ ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('caught')
+ ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('caught')
+ ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "ignore");
+ $lexer->addEntryPattern('<file>(?!foo)', "ignore", "caught");
+ $lexer->addExitPattern("</file>", "caught");
+ $lexer->addSpecialPattern('b','caught','special');
+ $lexer->mapHandler('special','caught');
+ $lexer->addPattern('c','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+ function testIndexLookbehindEqual() {
+ $doc = "aaa<file>bcd</file>eee";
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('caught')
+ ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('caught')
+ ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('caught')
+ ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('caught')
+ ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('caught')
+ ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "ignore");
+ $lexer->addEntryPattern('<file>', "ignore", "caught");
+ $lexer->addExitPattern("(?<=d)</file>", "caught");
+ $lexer->addSpecialPattern('b','caught','special');
+ $lexer->mapHandler('special','caught');
+ $lexer->addPattern('c','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+ function testIndexLookbehindNotEqual() {
+ $doc = "aaa<file>bcd</file>eee";
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('caught')
+ ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('caught')
+ ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('caught')
+ ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('caught')
+ ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('caught')
+ ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, 'ignore');
+ $lexer->addEntryPattern('<file>', 'ignore', 'caught');
+ $lexer->addExitPattern('(?<!c)</file>', 'caught');
+ $lexer->addSpecialPattern('b','caught','special');
+ $lexer->mapHandler('special','caught');
+ $lexer->addPattern('c','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+ /**
+ * This test is primarily to ensure the correct match is chosen
+ * when there are non-captured elements in the pattern.
+ */
+ function testIndexSelectCorrectMatch() {
+ $doc = "ALL FOOLS ARE FOO";
+ $pattern = '\bFOO\b';
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+
+ $matches = array();
+ preg_match('/'.$pattern.'/',$doc,$matches,PREG_OFFSET_CAPTURE);
+
+ $handler->expects($this->once())->method('caught')
+ ->with("FOO", DOKU_LEXER_SPECIAL, $matches[0][1])->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "ignore");
+ $lexer->addSpecialPattern($pattern,'ignore','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+}
+
+?>
diff --git a/_test/tests/inc/parser/parser.inc.php b/_test/tests/inc/parser/parser.inc.php
new file mode 100644
index 000000000..e9efef0d3
--- /dev/null
+++ b/_test/tests/inc/parser/parser.inc.php
@@ -0,0 +1,29 @@
+<?php
+
+require_once DOKU_INC . 'inc/parser/parser.php';
+require_once DOKU_INC . 'inc/parser/handler.php';
+
+abstract class TestOfDoku_Parser extends PHPUnit_Framework_TestCase {
+
+ var $P;
+ var $H;
+
+ function setup() {
+ $this->P = new Doku_Parser();
+ $this->H = new Doku_Handler();
+ $this->P->Handler = & $this->H;
+ }
+
+ function tearDown() {
+ unset($this->P);
+ unset($this->H);
+ }
+}
+
+function stripByteIndex($call) {
+ unset($call[2]);
+ if ($call[0] == "nest") {
+ $call[1][0] = array_map('stripByteIndex',$call[1][0]);
+ }
+ return $call;
+}
diff --git a/_test/cases/inc/parser/parser_eol.test.php b/_test/tests/inc/parser/parser_eol.test.php
index 692882c6c..6264f8b55 100644
--- a/_test/cases/inc/parser/parser_eol.test.php
+++ b/_test/tests/inc/parser/parser_eol.test.php
@@ -3,10 +3,6 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
- function TestOfDoku_Parser_Eol() {
- $this->UnitTestCase('TestOfDoku_Parser_Eol');
- }
-
function testEol() {
$this->P->addMode('eol',new Doku_Parser_Mode_Eol());
$this->P->parse("Foo\nBar");
@@ -17,7 +13,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testEolMultiple() {
@@ -33,9 +29,9 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testWinEol() {
$this->P->addMode('eol',new Doku_Parser_Mode_Eol());
$this->P->parse("Foo\r\nBar");
@@ -46,9 +42,9 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testLinebreak() {
$this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
$this->P->parse('Foo\\\\ Bar');
@@ -61,14 +57,14 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testLinebreakPlusEol() {
$this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
$this->P->addMode('eol',new Doku_Parser_Mode_Eol());
$this->P->parse('Foo\\\\'."\n\n".'Bar');
-
+
$calls = array (
array('document_start',array()),
array('p_open',array()),
@@ -80,9 +76,9 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testLinebreakInvalid() {
$this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
$this->P->parse('Foo\\\\Bar');
@@ -93,7 +89,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parser/parser_footnote.test.php b/_test/tests/inc/parser/parser_footnote.test.php
index e3571d8e7..f3b5ddf56 100644
--- a/_test/cases/inc/parser/parser_footnote.test.php
+++ b/_test/tests/inc/parser/parser_footnote.test.php
@@ -3,10 +3,6 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
- function TestOfDoku_Parser_Footnote() {
- $this->UnitTestCase('TestOfDoku_Parser_Footnote');
- }
-
function setup() {
parent::setup();
$this->P->addMode('footnote',new Doku_Parser_Mode_Footnote());
@@ -27,7 +23,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testNotAFootnote() {
@@ -39,7 +35,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteLinefeed() {
@@ -58,7 +54,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteNested() {
@@ -76,7 +72,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteEol() {
@@ -95,7 +91,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteStrong() {
@@ -118,7 +114,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteHr() {
@@ -139,7 +135,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteCode() {
@@ -160,7 +156,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnotePreformatted() {
@@ -181,7 +177,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnotePreformattedEol() {
@@ -204,7 +200,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteUnformatted() {
@@ -225,7 +221,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteNotHeader() {
@@ -244,7 +240,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteTable() {
@@ -290,7 +286,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteList() {
@@ -332,7 +328,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteQuote() {
@@ -361,7 +357,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testFootnoteNesting() {
@@ -386,7 +382,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parser/parser_headers.test.php b/_test/tests/inc/parser/parser_headers.test.php
index 688bac2eb..a1bf7d2ba 100644
--- a/_test/cases/inc/parser/parser_headers.test.php
+++ b/_test/tests/inc/parser/parser_headers.test.php
@@ -3,10 +3,6 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
- function TestOfDoku_Parser_Headers() {
- $this->UnitTestCase('TestOfDoku_Parser_Headers');
- }
-
function testHeader1() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->parse("abc \n ====== Header ====== \n def");
@@ -23,9 +19,9 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testHeader2() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->parse("abc \n ===== Header ===== \n def");
@@ -42,9 +38,9 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testHeader3() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->parse("abc \n ==== Header ==== \n def");
@@ -61,9 +57,9 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testHeader4() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->parse("abc \n === Header === \n def");
@@ -80,9 +76,9 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testHeader5() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->parse("abc \n == Header == \n def");
@@ -99,7 +95,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testHeader2UnevenSmaller() {
@@ -118,9 +114,9 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testHeader2UnevenBigger() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->parse("abc \n ===== Header =========== \n def");
@@ -137,9 +133,9 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testHeaderLarge() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->parse("abc \n ======= Header ======= \n def");
@@ -156,9 +152,9 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testHeaderSmall() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->parse("abc \n= Header =\n def");
@@ -169,10 +165,10 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
-
+
+
function testHeader1Mixed() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->parse("abc \n====== == Header == ======\n def");
@@ -189,7 +185,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testHeader5Mixed() {
@@ -208,9 +204,9 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
function testHeaderMultiline() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->parse("abc \n== ====== Header\n ====== ==\n def");
@@ -227,15 +223,15 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
# function testNoToc() {
# $this->P->addMode('notoc',new Doku_Parser_Mode_NoToc());
# $this->P->parse('abc ~~NOTOC~~ def');
# $this->assertFalse($this->H->meta['toc']);
# }
-
+
function testHeader1Eol() {
$this->P->addMode('header',new Doku_Parser_Mode_Header());
$this->P->addMode('eol',new Doku_Parser_Mode_Eol());
@@ -253,8 +249,8 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
-
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+
}
function testHeaderMulti2() {
@@ -279,8 +275,8 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array())
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
-
+
}
diff --git a/_test/cases/inc/parser/parser_i18n.test.php b/_test/tests/inc/parser/parser_i18n.test.php
index 27ec3c78b..096f2e227 100644
--- a/_test/cases/inc/parser/parser_i18n.test.php
+++ b/_test/tests/inc/parser/parser_i18n.test.php
@@ -3,10 +3,6 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_i18n extends TestOfDoku_Parser {
- function TestOfDoku_Parser_i18n() {
- $this->UnitTestCase('TestOfDoku_Parser_i18n');
- }
-
function testFormatting() {
$formats = array (
'strong', 'emphasis', 'underline', 'monospace',
@@ -51,7 +47,7 @@ class TestOfDoku_Parser_i18n extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testHeader() {
@@ -70,7 +66,7 @@ class TestOfDoku_Parser_i18n extends TestOfDoku_Parser {
array('section_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testTable() {
@@ -114,7 +110,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testAcronym() {
@@ -130,7 +126,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testInterwiki() {
@@ -145,7 +141,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testInternalLink() {
@@ -160,7 +156,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parser/parser_links.test.php b/_test/tests/inc/parser/parser_links.test.php
index 53871e110..529efac6e 100644
--- a/_test/cases/inc/parser/parser_links.test.php
+++ b/_test/tests/inc/parser/parser_links.test.php
@@ -3,11 +3,6 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
- function TestOfDoku_Parser_Links() {
- $this->UnitTestCase('TestOfDoku_Parser_Links');
- }
-
-
function testExternalLinkSimple() {
$this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
$this->P->parse("Foo http://www.google.com Bar");
@@ -20,7 +15,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testExternalLinkCase() {
@@ -35,7 +30,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testExternalIPv4() {
@@ -50,7 +45,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testExternalIPv6() {
@@ -65,7 +60,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testExternalMulti(){
@@ -95,8 +90,6 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
$source = "[[$link|$title]]";
$name = $title;
}
- $this->signal('failinfo',$source);
-
$this->setup();
$this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
$this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
@@ -110,7 +103,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls), $calls, $source);
$this->teardown();
}
}
@@ -128,7 +121,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testExternalWWWLink() {
@@ -143,7 +136,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testExternalFTPLink() {
@@ -158,7 +151,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testEmail() {
$this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
@@ -172,7 +165,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testEmailRFC2822() {
@@ -187,7 +180,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testEmailCase() {
@@ -202,7 +195,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
@@ -218,7 +211,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testInternalLinkNoChar() {
@@ -233,7 +226,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testInternalLinkNamespaceNoTitle() {
@@ -248,7 +241,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testInternalLinkNamespace() {
@@ -263,7 +256,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testInternalLinkSectionRef() {
@@ -278,7 +271,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testExternalInInternalLink() {
@@ -293,7 +286,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testInterwikiLink() {
@@ -308,7 +301,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testInterwikiLinkCase() {
@@ -323,7 +316,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testInterwikiPedia() {
@@ -338,7 +331,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testCamelCase() {
@@ -353,7 +346,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testFileLink() {
@@ -368,7 +361,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testFileLinkInternal() {
@@ -383,7 +376,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testWindowsShareLink() {
@@ -398,7 +391,22 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testWindowsShareLinkHyphen() {
+ $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink());
+ $this->P->parse('Foo \\\server\share-hyphen Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('windowssharelink',array('\\\server\share-hyphen',NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testWindowsShareLinkInternal() {
@@ -413,7 +421,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaInternal() {
@@ -428,7 +436,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaInternalLinkOnly() {
@@ -443,7 +451,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaNotImage() {
@@ -458,7 +466,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaInternalLAlign() {
@@ -473,7 +481,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaInternalRAlign() {
@@ -488,7 +496,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaInternalCenter() {
@@ -503,7 +511,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaInternalParams() {
@@ -518,7 +526,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaInternalTitle() {
@@ -533,7 +541,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaExternal() {
@@ -548,7 +556,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaExternalParams() {
@@ -563,7 +571,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaExternalTitle() {
@@ -579,7 +587,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaInInternalLink() {
@@ -606,7 +614,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaNoImageInInternalLink() {
@@ -633,7 +641,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testMediaInEmailLink() {
@@ -660,7 +668,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testNestedMedia() {
@@ -676,7 +684,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parser/parser_lists.test.php b/_test/tests/inc/parser/parser_lists.test.php
index 6e61da1a1..e4ef1f83e 100644
--- a/_test/cases/inc/parser/parser_lists.test.php
+++ b/_test/tests/inc/parser/parser_lists.test.php
@@ -3,10 +3,6 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
- function TestOfDoku_Parser_Lists() {
- $this->UnitTestCase('TestOfDoku_Parser_Lists');
- }
-
function testUnorderedList() {
$this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
$this->P->parse('
@@ -37,7 +33,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
array('listu_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testOrderedList() {
@@ -70,7 +66,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
array('listo_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
@@ -104,7 +100,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
array('listo_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testUnorderedListWinEOL() {
@@ -133,7 +129,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
array('listu_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testOrderedListWinEOL() {
@@ -162,7 +158,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
array('listo_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testNotAList() {
@@ -175,7 +171,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testUnorderedListParagraph() {
@@ -215,7 +211,7 @@ Bar');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
// This is really a failing test - formatting able to spread across list items
@@ -250,7 +246,7 @@ Bar');
array('listu_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
// This is really a failing test - unformatted able to spread across list items
@@ -281,7 +277,7 @@ Bar');
array('listu_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testUnorderedListLinebreak() {
@@ -317,7 +313,7 @@ Bar');
array('listu_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testUnorderedListLinebreak2() {
@@ -344,7 +340,7 @@ Bar');
array('listu_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testUnorderedListFootnote() {
@@ -391,7 +387,7 @@ Bar');
array('document_end',array())
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parser/parser_preformatted.test.php b/_test/tests/inc/parser/parser_preformatted.test.php
index 7a00f3599..f7a01a7e5 100644
--- a/_test/cases/inc/parser/parser_preformatted.test.php
+++ b/_test/tests/inc/parser/parser_preformatted.test.php
@@ -3,10 +3,6 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
- function TestOfDoku_Parser_Preformatted() {
- $this->UnitTestCase('TestOfDoku_Parser_Preformatted');
- }
-
function testFile() {
$this->P->addMode('file',new Doku_Parser_Mode_File());
$this->P->parse('Foo <file>testing</file> Bar');
@@ -22,7 +18,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testCode() {
@@ -39,7 +35,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testCodeWhitespace() {
@@ -56,7 +52,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testCodeLang() {
@@ -73,7 +69,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testPreformatted() {
@@ -90,7 +86,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testPreformattedWinEOL() {
@@ -107,7 +103,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testPreformattedTab() {
@@ -124,7 +120,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testPreformattedTabWinEOL() {
@@ -141,7 +137,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testPreformattedList() {
@@ -173,7 +169,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
// test for php
@@ -190,7 +186,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
// test with for HTML
@@ -207,7 +203,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
@@ -229,7 +225,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parser/parser_quote.test.php b/_test/tests/inc/parser/parser_quote.test.php
index ebc5da604..ae14671c1 100644
--- a/_test/cases/inc/parser/parser_quote.test.php
+++ b/_test/tests/inc/parser/parser_quote.test.php
@@ -3,10 +3,6 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
- function TestOfDoku_Parser_Quote() {
- $this->UnitTestCase('TestOfDoku_Parser_Quote');
- }
-
function testQuote() {
$this->P->addMode('quote',new Doku_Parser_Mode_Quote());
$this->P->parse("abc\n> def\n>>ghi\nklm");
@@ -25,11 +21,11 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
array('cdata',array("klm")),
array('p_close',array()),
array('document_end',array()),
-
+
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
function testQuoteWinCr() {
$this->P->addMode('quote',new Doku_Parser_Mode_Quote());
$this->P->parse("abc\r\n> def\r\n>>ghi\r\nklm");
@@ -48,11 +44,11 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
array('cdata',array("klm")),
array('p_close',array()),
array('document_end',array()),
-
+
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
function testQuoteMinumumContext() {
$this->P->addMode('quote',new Doku_Parser_Mode_Quote());
$this->P->parse("\n> def\n>>ghi\n ");
@@ -65,11 +61,11 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
array('quote_close',array()),
array('quote_close',array()),
array('document_end',array()),
-
+
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
function testQuoteEol() {
$this->P->addMode('quote',new Doku_Parser_Mode_Quote());
$this->P->addMode('eol',new Doku_Parser_Mode_Eol());
@@ -89,9 +85,9 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
array('cdata',array("klm")),
array('p_close',array()),
array('document_end',array()),
-
+
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parser/parser_quotes.test.php b/_test/tests/inc/parser/parser_quotes.test.php
index 77e323799..b2dae1039 100644
--- a/_test/cases/inc/parser/parser_quotes.test.php
+++ b/_test/tests/inc/parser/parser_quotes.test.php
@@ -9,10 +9,6 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
$conf['typography'] = 2;
}
- function TestOfDoku_Parser_Quotes() {
- $this->UnitTestCase('TestOfDoku_Parser_Quotes');
- }
-
function testSingleQuoteOpening() {
$this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
$this->P->parse("Foo 'hello Bar");
@@ -27,7 +23,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testSingleQuoteOpeningSpecial() {
@@ -44,7 +40,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testSingleQuoteClosing() {
@@ -61,7 +57,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testSingleQuoteClosingSpecial() {
@@ -78,7 +74,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testSingleQuotes() {
@@ -97,7 +93,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testApostrophe() {
@@ -114,7 +110,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
@@ -134,7 +130,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testDoubleQuoteOpening() {
@@ -151,7 +147,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testDoubleQuoteOpeningSpecial() {
@@ -168,7 +164,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testDoubleQuoteClosing() {
@@ -185,7 +181,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testDoubleQuoteClosingSpecial() {
@@ -202,7 +198,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testDoubleQuotes() {
@@ -221,7 +217,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testDoubleQuotesSpecial() {
@@ -240,7 +236,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testAllQuotes() {
@@ -266,7 +262,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parser/parser_replacements.test.php b/_test/tests/inc/parser/parser_replacements.test.php
index d277560c7..f0367dac0 100644
--- a/_test/cases/inc/parser/parser_replacements.test.php
+++ b/_test/tests/inc/parser/parser_replacements.test.php
@@ -3,11 +3,6 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
- function TestOfDoku_Parser_Replacements() {
- $this->UnitTestCase('TestOfDoku_Parser_Replacements');
- }
-
-
function testSingleAcronym() {
$this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOOBAR')));
$this->P->parse('abc FOOBAR xyz');
@@ -22,7 +17,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testAlmostAnAcronym() {
@@ -37,7 +32,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testPickAcronymCorrectly() {
@@ -54,7 +49,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testMultipleAcronyms() {
@@ -73,7 +68,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
@@ -97,7 +92,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testMultipleAcronymsWithSubset2() {
@@ -120,7 +115,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testSingleSmileyFail() {
@@ -135,7 +130,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testSingleSmiley() {
@@ -152,7 +147,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testMultipleSmileysFail() {
@@ -167,7 +162,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testMultipleSmileys() {
@@ -186,7 +181,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testBackslashSmileyFail() {
@@ -202,7 +197,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testBackslashSmiley() {
@@ -220,7 +215,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testSingleWordblock() {
@@ -237,7 +232,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testWordblockCase() {
@@ -254,7 +249,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testMultipleWordblock() {
@@ -273,7 +268,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testSingleEntity() {
@@ -290,7 +285,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testMultipleEntities() {
@@ -309,7 +304,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testMultiplyEntity() {
@@ -326,7 +321,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testMultiplyEntityHex() {
@@ -342,7 +337,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testHR() {
@@ -360,7 +355,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testHREol() {
@@ -378,7 +373,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parser/parser_table.test.php b/_test/tests/inc/parser/parser_table.test.php
index 12898860c..96789c38c 100644
--- a/_test/cases/inc/parser/parser_table.test.php
+++ b/_test/tests/inc/parser/parser_table.test.php
@@ -3,10 +3,6 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Table extends TestOfDoku_Parser {
- function TestOfDoku_Parser_Table() {
- $this->UnitTestCase('TestOfDoku_Parser_Table');
- }
-
function testTable() {
$this->P->addMode('table',new Doku_Parser_Mode_Table());
$this->P->parse('
@@ -48,7 +44,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testTableWinEOL() {
@@ -88,7 +84,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testEmptyTable() {
@@ -113,7 +109,7 @@ def');
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testTableHeaders() {
@@ -147,7 +143,7 @@ def');
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
@@ -182,7 +178,7 @@ def');
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testCellSpan() {
@@ -224,7 +220,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testCellRowSpan() {
@@ -272,7 +268,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testCellAlignmentFormatting() {
@@ -311,7 +307,7 @@ def');
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
@@ -357,7 +353,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
// This is really a failing test - formatting able to spread across cols
@@ -412,7 +408,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
// This is really a failing test - unformatted able to spread across cols
@@ -463,7 +459,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
function testTableLinebreak() {
@@ -511,7 +507,7 @@ def');
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
// This is really a failing test - footnote able to spread across cols
@@ -570,7 +566,7 @@ def');
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parser/parser_unformatted.test.php b/_test/tests/inc/parser/parser_unformatted.test.php
index dd69564b4..f20ba5e8b 100644
--- a/_test/cases/inc/parser/parser_unformatted.test.php
+++ b/_test/tests/inc/parser/parser_unformatted.test.php
@@ -2,11 +2,7 @@
require_once 'parser.inc.php';
class TestOfDoku_Parser_Unformatted extends TestOfDoku_Parser {
-
- function TestOfDoku_Parser_Unformatted() {
- $this->UnitTestCase('TestOfDoku_Parser_Unformatted');
- }
-
+
function testNowiki() {
$this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
$this->P->parse("Foo <nowiki>testing</nowiki> Bar");
@@ -20,10 +16,10 @@ class TestOfDoku_Parser_Unformatted extends TestOfDoku_Parser {
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
-
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+
}
-
+
function testDoublePercent() {
$this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
$this->P->parse("Foo %%testing%% Bar");
@@ -36,7 +32,7 @@ class TestOfDoku_Parser_Unformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('document_end',array()),
);
- $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
}
}
diff --git a/_test/cases/inc/parserutils_set_metadata_during_rendering.test.php b/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php
index 8319da298..0683848f1 100644
--- a/_test/cases/inc/parserutils_set_metadata_during_rendering.test.php
+++ b/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php
@@ -1,8 +1,6 @@
<?php
-require_once DOKU_INC.'inc/init.php';
-
-class parserutils_set_metadata_during_rendering_test extends UnitTestCase {
+class parserutils_set_metadata_during_rendering_test extends DokuWikiTest {
// the id used for this test case
private $id;
// if the test case is currently running
@@ -35,15 +33,15 @@ class parserutils_set_metadata_during_rendering_test extends UnitTestCase {
$plugin_controller = $this->plugin_controller;
// assert that all three calls to p_set_metadata have been successful
- $this->assertEqual($newMeta['test_before_set'], 'test');
- $this->assertEqual($newMeta['test_after_set'], 'test');
- $this->assertEqual($newMeta['test_during_rendering'], 'test');
+ $this->assertEquals($newMeta['test_before_set'], 'test');
+ $this->assertEquals($newMeta['test_after_set'], 'test');
+ $this->assertEquals($newMeta['test_during_rendering'], 'test');
// clean up
$this->active = false;
// make sure the saved metadata is the one that has been rendered
- $this->assertEqual($newMeta, p_get_metadata($this->id));
+ $this->assertEquals($newMeta, p_get_metadata($this->id));
saveWikiText($this->id, '', 'Test data remove');
}
@@ -55,7 +53,7 @@ class parserutils_set_metadata_during_rendering_test extends UnitTestCase {
$key = array_pop(array_keys($meta));
$this->assertTrue(is_string($meta[$key])); // ensure we really have a key
// ensure that the metadata property hasn't been set previously
- $this->assertNotEqual($meta[$key], p_get_metadata($this->id, $key));
+ $this->assertNotEquals($meta[$key], p_get_metadata($this->id, $key));
}
}
@@ -71,7 +69,7 @@ class parserutils_set_metadata_during_rendering_test extends UnitTestCase {
$key = 'test_during_rendering';
p_set_metadata($this->id, array($key => 'test'), false, true);
// ensure that the metadata property hasn't been set previously
- $this->assertNotEqual($key, p_get_metadata($this->id, $key));
+ $this->assertNotEquals($key, p_get_metadata($this->id, $key));
}
}
diff --git a/_test/tests/inc/remote.test.php b/_test/tests/inc/remote.test.php
new file mode 100644
index 000000000..49152d8db
--- /dev/null
+++ b/_test/tests/inc/remote.test.php
@@ -0,0 +1,330 @@
+<?php
+
+class MockAuth extends auth_basic {
+ function isCaseSensitive() { return true; }
+}
+
+class RemoteAPICoreTest {
+
+ function __getRemoteInfo() {
+ return array(
+ 'wiki.stringTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'string',
+ 'doc' => 'Test method',
+ 'name' => 'stringTestMethod',
+ ), 'wiki.intTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'int',
+ 'doc' => 'Test method',
+ 'name' => 'intTestMethod',
+ ), 'wiki.floatTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'float',
+ 'doc' => 'Test method',
+ 'name' => 'floatTestMethod',
+ ), 'wiki.dateTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'date',
+ 'doc' => 'Test method',
+ 'name' => 'dateTestMethod',
+ ), 'wiki.fileTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'file',
+ 'doc' => 'Test method',
+ 'name' => 'fileTestMethod',
+ ), 'wiki.voidTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'void',
+ 'doc' => 'Test method',
+ 'name' => 'voidTestMethod',
+ ), 'wiki.oneStringArgMethod' => array(
+ 'args' => array('string'),
+ 'return' => 'string',
+ 'doc' => 'Test method',
+ 'name' => 'oneStringArgMethod',
+ ), 'wiki.twoArgMethod' => array(
+ 'args' => array('string', 'int'),
+ 'return' => 'array',
+ 'doc' => 'Test method',
+ 'name' => 'twoArgMethod',
+ ), 'wiki.twoArgWithDefaultArg' => array(
+ 'args' => array('string', 'string'),
+ 'return' => 'string',
+ 'doc' => 'Test method',
+ 'name' => 'twoArgWithDefaultArg',
+ ), 'wiki.publicCall' => array(
+ 'args' => array(),
+ 'return' => 'boolean',
+ 'doc' => 'testing for public access',
+ 'name' => 'publicCall',
+ 'public' => 1
+ )
+ );
+ }
+ function stringTestMethod() { return 'success'; }
+ function intTestMethod() { return 42; }
+ function floatTestMethod() { return 3.14159265; }
+ function dateTestMethod() { return 2623452346; }
+ function fileTestMethod() { return 'file content'; }
+ function voidTestMethod() { return null; }
+ function oneStringArgMethod($arg) {return $arg; }
+ function twoArgMethod($string, $int) { return array($string, $int); }
+ function twoArgWithDefaultArg($string1, $string2 = 'default') { return array($string1, $string2); }
+ function publicCall() {return true;}
+
+}
+
+class remote_plugin_testplugin extends DokuWiki_Remote_Plugin {
+ function _getMethods() {
+ return array(
+ 'method1' => array(
+ 'args' => array(),
+ 'return' => 'void'
+ ), 'methodString' => array(
+ 'args' => array(),
+ 'return' => 'string'
+ ), 'method2' => array(
+ 'args' => array('string', 'int'),
+ 'return' => 'array',
+ 'name' => 'method2',
+ ), 'method2ext' => array(
+ 'args' => array('string', 'int', 'bool'),
+ 'return' => 'array',
+ 'name' => 'method2',
+ ), 'publicCall' => array(
+ 'args' => array(),
+ 'return' => 'boolean',
+ 'doc' => 'testing for public access',
+ 'name' => 'publicCall',
+ 'public' => 1
+ )
+ );
+ }
+
+ function method1() { return null; }
+ function methodString() { return 'success'; }
+ function method2($str, $int, $bool = false) { return array($str, $int, $bool); }
+ function publicCall() {return true;}
+
+}
+
+
+class remote_test extends DokuWikiTest {
+
+ var $originalConf;
+ var $userinfo;
+
+ var $remote;
+
+ function setUp() {
+ global $plugin_controller;
+ global $conf;
+ global $USERINFO;
+ global $auth;
+
+ parent::setUp();
+
+ $pluginManager = $this->getMock('Doku_Plugin_Controller');
+ $pluginManager->expects($this->any())->method('getList')->will($this->returnValue(array('testplugin')));
+ $pluginManager->expects($this->any())->method('load')->will($this->returnValue(new remote_plugin_testplugin()));
+
+ $plugin_controller = $pluginManager;
+
+ $this->originalConf = $conf;
+ $conf['remote'] = 1;
+ $conf['remoteuser'] = '!!not set!!';
+ $conf['useacl'] = 0;
+
+ $this->userinfo = $USERINFO;
+ $this->remote = new RemoteAPI();
+
+ $auth = new MockAuth();
+ }
+
+ function tearDown() {
+ global $conf;
+ global $USERINFO;
+ $conf = $this->originalConf;
+ $USERINFO = $this->userinfo;
+
+ }
+
+ function test_pluginMethods() {
+ $methods = $this->remote->getPluginMethods();
+ $actual = array_keys($methods);
+ sort($actual);
+ $expect = array('plugin.testplugin.method1', 'plugin.testplugin.method2', 'plugin.testplugin.methodString', 'plugin.testplugin.method2ext', 'plugin.testplugin.publicCall');
+ sort($expect);
+ $this->assertEquals($expect,$actual);
+ }
+
+ function test_hasAccessSuccess() {
+ $this->assertTrue($this->remote->hasAccess());
+ }
+
+ function test_hasAccessFail() {
+ global $conf;
+ $conf['remote'] = 0;
+ $this->assertFalse($this->remote->hasAccess());
+ }
+
+ function test_hasAccessFailAcl() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $this->assertFalse($this->remote->hasAccess());
+ }
+
+ function test_hasAccessSuccessAclEmptyRemoteUser() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $conf['remoteuser'] = '';
+
+ $this->assertTrue($this->remote->hasAccess());
+ }
+
+ function test_hasAccessSuccessAcl() {
+ global $conf;
+ global $USERINFO;
+ $conf['useacl'] = 1;
+ $conf['remoteuser'] = '@grp,@grp2';
+ $USERINFO['grps'] = array('grp');
+ $this->assertTrue($this->remote->hasAccess());
+ }
+
+ function test_hasAccessFailAcl2() {
+ global $conf;
+ global $USERINFO;
+ $conf['useacl'] = 1;
+ $conf['remoteuser'] = '@grp';
+ $USERINFO['grps'] = array('grp1');
+
+ $this->assertFalse($this->remote->hasAccess());
+ }
+
+
+ function test_forceAccessSuccess() {
+ global $conf;
+ $conf['remote'] = 1;
+ $this->remote->forceAccess(); // no exception should occur
+ }
+
+ /**
+ * @expectedException RemoteException
+ */
+ function test_forceAccessFail() {
+ global $conf;
+ $conf['remote'] = 0;
+ $this->remote->forceAccess();
+ }
+
+ function test_generalCoreFunctionWithoutArguments() {
+ global $conf;
+ $conf['remote'] = 1;
+ $remoteApi = new RemoteApi();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+ $this->assertEquals($remoteApi->call('wiki.stringTestMethod'), 'success');
+ $this->assertEquals($remoteApi->call('wiki.intTestMethod'), 42);
+ $this->assertEquals($remoteApi->call('wiki.floatTestMethod'), 3.14159265);
+ $this->assertEquals($remoteApi->call('wiki.dateTestMethod'), 2623452346);
+ $this->assertEquals($remoteApi->call('wiki.fileTestMethod'), 'file content');
+ $this->assertEquals($remoteApi->call('wiki.voidTestMethod'), null);
+ }
+
+ /**
+ * @expectedException RemoteException
+ */
+ function test_generalCoreFunctionOnArgumentMismatch() {
+ global $conf;
+ $conf['remote'] = 1;
+ $remoteApi = new RemoteApi();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+ $remoteApi->call('wiki.voidTestMethod', array('something'));
+ }
+
+ function test_generalCoreFunctionWithArguments() {
+ global $conf;
+ $conf['remote'] = 1;
+
+ $remoteApi = new RemoteApi();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+ $this->assertEquals($remoteApi->call('wiki.oneStringArgMethod', array('string')), 'string');
+ $this->assertEquals($remoteApi->call('wiki.twoArgMethod', array('string', 1)), array('string' , 1));
+ $this->assertEquals($remoteApi->call('wiki.twoArgWithDefaultArg', array('string')), array('string', 'default'));
+ $this->assertEquals($remoteApi->call('wiki.twoArgWithDefaultArg', array('string', 'another')), array('string', 'another'));
+ }
+
+ function test_pluginCallMethods() {
+ global $conf;
+ $conf['remote'] = 1;
+
+ $remoteApi = new RemoteApi();
+ $this->assertEquals($remoteApi->call('plugin.testplugin.method1'), null);
+ $this->assertEquals($remoteApi->call('plugin.testplugin.method2', array('string', 7)), array('string', 7, false));
+ $this->assertEquals($remoteApi->call('plugin.testplugin.method2ext', array('string', 7, true)), array('string', 7, true));
+ $this->assertEquals($remoteApi->call('plugin.testplugin.methodString'), 'success');
+ }
+
+ /**
+ * @expectedException RemoteException
+ */
+ function test_notExistingCall() {
+ global $conf;
+ $conf['remote'] = 1;
+
+ $remoteApi = new RemoteApi();
+ $remoteApi->call('dose not exist');
+ }
+
+ function test_publicCallCore() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $remoteApi = new RemoteApi();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+ $this->assertTrue($remoteApi->call('wiki.publicCall'));
+ }
+
+ function test_publicCallPlugin() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $remoteApi = new RemoteApi();
+ $this->assertTrue($remoteApi->call('plugin.testplugin.publicCall'));
+ }
+
+ /**
+ * @expectedException RemoteAccessDeniedException
+ */
+ function test_publicCallCoreDeny() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $remoteApi = new RemoteApi();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+ $remoteApi->call('wiki.stringTestMethod');
+ }
+
+ /**
+ * @expectedException RemoteAccessDeniedException
+ */
+ function test_publicCallPluginDeny() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $remoteApi = new RemoteApi();
+ $remoteApi->call('plugin.testplugin.methodString');
+ }
+
+ function test_pluginCallCustomPath() {
+ global $EVENT_HANDLER;
+ $EVENT_HANDLER->register_hook('RPC_CALL_ADD', 'BEFORE', $this, 'pluginCallCustomPathRegister');
+
+ $remoteApi = new RemoteAPI();
+ $result = $remoteApi->call('custom.path');
+ $this->assertEquals($result, 'success');
+ }
+
+ function pluginCallCustomPathRegister(&$event, $param) {
+ $event->data['custom.path'] = array('testplugin', 'methodString');
+ }
+}
diff --git a/_test/cases/inc/safefn.test.php b/_test/tests/inc/safefn.test.php
index 1227e5578..175b72dfc 100644
--- a/_test/cases/inc/safefn.test.php
+++ b/_test/tests/inc/safefn.test.php
@@ -1,10 +1,8 @@
<?php
// use no mbstring help here
if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
-require_once DOKU_INC.'inc/utf8.php';
-require_once DOKU_INC.'inc/SafeFN.class.php';
-class safeFN_test extends UnitTestCase {
+class safeFN_test extends DokuWikiTest {
function test1(){
@@ -30,17 +28,17 @@ class safeFN_test extends UnitTestCase {
foreach($tests as $test){
list($utf8,$safe) = $test;
- $this->assertEqual(SafeFN::encode($utf8),$safe);
- $this->assertEqual(SafeFN::decode($safe),$utf8);
+ $this->assertEquals(SafeFN::encode($utf8),$safe);
+ $this->assertEquals(SafeFN::decode($safe),$utf8);
}
}
-
+
function test2(){
$tests[] = array('совместимая','%td%ta%sy%t8%t1%td%te%t4%t8%sw%tr');
foreach($tests as $test){
list($utf8,$safe) = $test;
- $this->assertEqual(SafeFN::decode($safe),$utf8);
+ $this->assertEquals(SafeFN::decode($safe),$utf8);
}
}
diff --git a/_test/tests/inc/search/data/ns1/ns3/page3.txt b/_test/tests/inc/search/data/ns1/ns3/page3.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/tests/inc/search/data/ns1/ns3/page3.txt
diff --git a/_test/tests/inc/search/data/ns1/page1.txt b/_test/tests/inc/search/data/ns1/page1.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/tests/inc/search/data/ns1/page1.txt
diff --git a/_test/tests/inc/search/data/ns1/page2.txt b/_test/tests/inc/search/data/ns1/page2.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/tests/inc/search/data/ns1/page2.txt
diff --git a/_test/tests/inc/search/data/ns2/nopage.ext b/_test/tests/inc/search/data/ns2/nopage.ext
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/tests/inc/search/data/ns2/nopage.ext
diff --git a/_test/tests/inc/search/data/ns2/page1.txt b/_test/tests/inc/search/data/ns2/page1.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/tests/inc/search/data/ns2/page1.txt
diff --git a/_test/cases/inc/search/search.test.php b/_test/tests/inc/search/search.test.php
index a6f15e9b6..33cc80e74 100644
--- a/_test/cases/inc/search/search.test.php
+++ b/_test/tests/inc/search/search.test.php
@@ -1,7 +1,6 @@
<?php
-require_once DOKU_INC.'inc/search.php';
-class search_test extends UnitTestCase {
+class search_test extends DokuWikiTest {
function strip_index_data($entry) {
$n_entry = array();
foreach(array('id', 'type', 'level', 'open') as $k) {
@@ -14,7 +13,7 @@ class search_test extends UnitTestCase {
$data = array();
search($data, dirname(__FILE__) . '/data', 'search_index',
array('ns' => 'ns2'));
- $this->assertEqual(array_map(array($this, 'strip_index_data'), $data),
+ $this->assertEquals(array_map(array($this, 'strip_index_data'), $data),
array(
array(
'id' => 'ns1',
@@ -35,7 +34,7 @@ class search_test extends UnitTestCase {
$data = array();
search($data, dirname(__FILE__) . '/data', 'search_index',
array('ns' => 'ns1/ns3'));
- $this->assertEqual(array_map(array($this, 'strip_index_data'), $data),
+ $this->assertEquals(array_map(array($this, 'strip_index_data'), $data),
array(
array(
'id' => 'ns1',
@@ -76,7 +75,7 @@ class search_test extends UnitTestCase {
$data = array();
search($data, dirname(__FILE__) . '/data', 'search_index',
array('ns' => 'ns1/ns3', 'nofiles' => true));
- $this->assertEqual(array_map(array($this, 'strip_index_data'), $data),
+ $this->assertEquals(array_map(array($this, 'strip_index_data'), $data),
array(
array(
'id' => 'ns1',
diff --git a/_test/tests/inc/subscription_set.test.php b/_test/tests/inc/subscription_set.test.php
new file mode 100644
index 000000000..5c0a6c816
--- /dev/null
+++ b/_test/tests/inc/subscription_set.test.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Tests the subscription set function
+ */
+class subscription_set_test extends DokuWikiTest {
+ /**
+ * Tests, if overwriting subscriptions works even when subscriptions for the same
+ * user exist for two nested namespaces, this is a test for the bug described in FS#2580
+ */
+ function test_overwrite() {
+ subscription_set('admin', ':', 'digest', '123456789');
+ subscription_set('admin', ':wiki:', 'digest', '123456789');
+ subscription_set('admin', ':', 'digest', '1234', true);
+ subscription_set('admin', ':wiki:', 'digest', '1234', true);
+ $subscriptions = subscription_find(':wiki:', array('user' => 'admin'));
+ $this->assertCount(1, $subscriptions[':'], 'More than one subscription saved for the root namespace even though the old one should have been overwritten.');
+ $this->assertCount(1, $subscriptions[':wiki:'], 'More than one subscription saved for the wiki namespace even though the old one should have been overwritten.');
+ $this->assertCount(2, $subscriptions, 'Didn\'t find the expected two subscriptions');
+ }
+}
diff --git a/_test/tests/inc/template_sidebar.test.php b/_test/tests/inc/template_sidebar.test.php
new file mode 100644
index 000000000..56153894a
--- /dev/null
+++ b/_test/tests/inc/template_sidebar.test.php
@@ -0,0 +1,40 @@
+<?php
+
+class template_sidebar_test extends DokuWikiTest {
+ function testNoSidebar() {
+ global $ID;
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = tpl_sidebar(false);
+ $this->assertEquals('',$sidebar);
+ }
+
+ function testExistingSidebars() {
+ global $ID;
+
+ saveWikiText('sidebar', 'topsidebar-test', '');
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = tpl_sidebar(false);
+ $this->assertTrue(strpos($sidebar, 'topsidebar-test') > 0);
+
+ $ID = 'foo';
+ $sidebar = tpl_sidebar(false);
+ $this->assertTrue(strpos($sidebar, 'topsidebar-test') > 0);
+
+ saveWikiText('foo:bar:sidebar', 'bottomsidebar-test', '');
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = tpl_sidebar(false);
+ $this->assertTrue(strpos($sidebar, 'bottomsidebar-test') > 0);
+
+ $ID = 'foo:bar:test';
+ $sidebar = tpl_sidebar(false);
+ $this->assertTrue(strpos($sidebar, 'bottomsidebar-test') > 0);
+
+ $ID = 'foo';
+ $sidebar = tpl_sidebar(false);
+ $this->assertTrue(strpos($sidebar, 'topsidebar-test') > 0);
+ }
+
+}
diff --git a/_test/tests/inc/utf8_basename.test.php b/_test/tests/inc/utf8_basename.test.php
new file mode 100644
index 000000000..1544e9915
--- /dev/null
+++ b/_test/tests/inc/utf8_basename.test.php
@@ -0,0 +1,91 @@
+<?php
+
+class utf8_basename_test extends DokuWikiTest {
+
+ function test1(){
+ $data = array(
+ array('/this/foo/bar.test.png', '', 'bar.test.png'),
+ array('\\this\\foo\\bar.test.png', '', 'bar.test.png'),
+ array('/this\\foo/bar.test.png', '', 'bar.test.png'),
+ array('/this/foo\\bar.test.png', '', 'bar.test.png'),
+
+ array('/this/ДокуВики/bar.test.png', '', 'bar.test.png'),
+ array('\\this\\ДокуВики\\bar.test.png', '', 'bar.test.png'),
+ array('/this\\ДокуВики/bar.test.png', '', 'bar.test.png'),
+ array('/this/ДокуВики\\bar.test.png', '', 'bar.test.png'),
+
+ array('/this/foo/ДокуВики.test.png', '', 'ДокуВики.test.png'),
+ array('\\this\\foo\\ДокуВики.test.png', '', 'ДокуВики.test.png'),
+ array('/this\\foo/ДокуВики.test.png', '', 'ДокуВики.test.png'),
+ array('/this/foo\\ДокуВики.test.png', '', 'ДокуВики.test.png'),
+
+ array('/this/foo/bar.test.png', '.png', 'bar.test'),
+ array('\\this\\foo\\bar.test.png', '.png', 'bar.test'),
+ array('/this\\foo/bar.test.png', '.png', 'bar.test'),
+ array('/this/foo\\bar.test.png', '.png', 'bar.test'),
+
+ array('/this/ДокуВики/bar.test.png', '.png', 'bar.test'),
+ array('\\this\\ДокуВики\\bar.test.png', '.png', 'bar.test'),
+ array('/this\\ДокуВики/bar.test.png', '.png', 'bar.test'),
+ array('/this/ДокуВики\\bar.test.png', '.png', 'bar.test'),
+
+ array('/this/foo/ДокуВики.test.png', '.png', 'ДокуВики.test'),
+ array('\\this\\foo\\ДокуВики.test.png', '.png', 'ДокуВики.test'),
+ array('/this\\foo/ДокуВики.test.png', '.png', 'ДокуВики.test'),
+ array('/this/foo\\ДокуВики.test.png', '.png', 'ДокуВики.test'),
+
+ array('/this/foo/bar.test.png', '.foo', 'bar.test.png'),
+ array('\\this\\foo\\bar.test.png', '.foo', 'bar.test.png'),
+ array('/this\\foo/bar.test.png', '.foo', 'bar.test.png'),
+ array('/this/foo\\bar.test.png', '.foo', 'bar.test.png'),
+
+ array('/this/ДокуВики/bar.test.png', '.foo', 'bar.test.png'),
+ array('\\this\\ДокуВики\\bar.test.png', '.foo', 'bar.test.png'),
+ array('/this\\ДокуВики/bar.test.png', '.foo', 'bar.test.png'),
+ array('/this/ДокуВики\\bar.test.png', '.foo', 'bar.test.png'),
+
+ array('/this/foo/ДокуВики.test.png', '.foo', 'ДокуВики.test.png'),
+ array('\\this\\foo\\ДокуВики.test.png', '.foo', 'ДокуВики.test.png'),
+ array('/this\\foo/ДокуВики.test.png', '.foo', 'ДокуВики.test.png'),
+ array('/this/foo\\ДокуВики.test.png', '.foo', 'ДокуВики.test.png'),
+
+
+ array('/this/foo/ДокуВики.test.Вик', '.foo', 'ДокуВики.test.Вик'),
+ array('\\this\\foo\\ДокуВики.test.Вик', '.foo', 'ДокуВики.test.Вик'),
+ array('/this\\foo/ДокуВики.test.Вик', '.foo', 'ДокуВики.test.Вик'),
+ array('/this/foo\\ДокуВики.test.Вик', '.foo', 'ДокуВики.test.Вик'),
+
+ array('/this/foo/ДокуВики.test.Вик', '.Вик', 'ДокуВики.test'),
+ array('\\this\\foo\\ДокуВики.test.Вик', '.Вик', 'ДокуВики.test'),
+ array('/this\\foo/ДокуВики.test.Вик', '.Вик', 'ДокуВики.test'),
+ array('/this/foo\\ДокуВики.test.Вик', '.Вик', 'ДокуВики.test'),
+
+ array('bar.test.png', '', 'bar.test.png'),
+ array('bar.test.png', '.png', 'bar.test'),
+
+ array('/bar.test.png', '', 'bar.test.png'),
+ array('/bar.test.png', '.png', 'bar.test'),
+ array('\\bar.test.png', '', 'bar.test.png'),
+ array('\\bar.test.png', '.png', 'bar.test'),
+ array('\\/bar.test.png', '', 'bar.test.png'),
+ array('\\/bar.test.png', '.png', 'bar.test'),
+ array('/\\bar.test.png', '', 'bar.test.png'),
+ array('/\\bar.test.png', '.png', 'bar.test'),
+
+ // PHP's basename does this too:
+ array('foo/', '', 'foo'),
+ array('foo\\', '', 'foo'),
+ array('foo\\/', '', 'foo'),
+ array('foo/\\', '', 'foo'),
+ array('foo.png/', '.png', 'foo'),
+ array('foo.png\\', '.png', 'foo'),
+ array('foo.png\\/', '.png', 'foo'),
+ array('foo.png/\\', '.png', 'foo'),
+ );
+
+ foreach($data as $test){
+ $this->assertEquals($test[2], utf8_basename($test[0], $test[1]), "input: ('".$test[0]."', '".$test[1]."')");
+ }
+ }
+
+} \ No newline at end of file
diff --git a/_test/cases/inc/utf8_correctidx.test.php b/_test/tests/inc/utf8_correctidx.test.php
index 20f6ba3a3..a704fd0e8 100644
--- a/_test/cases/inc/utf8_correctidx.test.php
+++ b/_test/tests/inc/utf8_correctidx.test.php
@@ -1,9 +1,8 @@
<?php
// use no mbstring help here
if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
-require_once DOKU_INC.'inc/utf8.php';
-class utf8_correctidx_test extends UnitTestCase {
+class utf8_correctidx_test extends DokuWikiTest {
function test_singlebyte(){
@@ -16,7 +15,7 @@ class utf8_correctidx_test extends UnitTestCase {
$tests[] = array('aaживπά우리をあöä',1,true,1);
foreach($tests as $test){
- $this->assertEqual(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
}
}
@@ -34,7 +33,7 @@ class utf8_correctidx_test extends UnitTestCase {
$tests[] = array('aaживπά우리をあöä',4,true,4);
foreach($tests as $test){
- $this->assertEqual(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
}
}
@@ -54,7 +53,7 @@ class utf8_correctidx_test extends UnitTestCase {
$tests[] = array('aaживπά우리をあöä',13,true,13);
foreach($tests as $test){
- $this->assertEqual(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
}
}
@@ -70,7 +69,7 @@ class utf8_correctidx_test extends UnitTestCase {
$tests[] = array('aaживπά우리をあöä',128,true,29);
foreach($tests as $test){
- $this->assertEqual(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
}
}
diff --git a/_test/cases/inc/utf8_html.test.php b/_test/tests/inc/utf8_html.test.php
index 3e6d35bc7..bdebd9d45 100644
--- a/_test/cases/inc/utf8_html.test.php
+++ b/_test/tests/inc/utf8_html.test.php
@@ -1,70 +1,68 @@
<?php
-require_once DOKU_INC.'inc/utf8.php';
-
// use no mbstring help here
if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
-class utf8_html_test extends UnitTestCase {
+class utf8_html_test extends DokuWikiTest {
function test_from_1byte(){
$in = 'a';
$out = 'a';
- $this->assertEqual(utf8_tohtml($in),$out);
+ $this->assertEquals(utf8_tohtml($in),$out);
}
function test_from_2byte(){
$in = "\xc3\xbc";
$out = '&#252;';
- $this->assertEqual(utf8_tohtml($in),$out);
+ $this->assertEquals(utf8_tohtml($in),$out);
}
function test_from_3byte(){
$in = "\xe2\x99\x8a";
$out = '&#x264a;';
- $this->assertEqual(utf8_tohtml($in),$out);
+ $this->assertEquals(utf8_tohtml($in),$out);
}
function test_from_4byte(){
$in = "\xf4\x80\x80\x81";
$out = '&#x100001;';
- $this->assertEqual(utf8_tohtml($in),$out);
+ $this->assertEquals(utf8_tohtml($in),$out);
}
function test_to_1byte(){
$out = 'a';
$in = 'a';
- $this->assertEqual(utf8_unhtml($in),$out);
+ $this->assertEquals(utf8_unhtml($in),$out);
}
function test_to_2byte(){
$out = "\xc3\xbc";
$in = '&#252;';
- $this->assertEqual(utf8_unhtml($in),$out);
+ $this->assertEquals(utf8_unhtml($in),$out);
}
function test_to_3byte(){
$out = "\xe2\x99\x8a";
$in = '&#x264a;';
- $this->assertEqual(utf8_unhtml($in),$out);
+ $this->assertEquals(utf8_unhtml($in),$out);
}
function test_to_4byte(){
$out = "\xf4\x80\x80\x81";
$in = '&#x100001;';
- $this->assertEqual(utf8_unhtml($in),$out);
+ $this->assertEquals(utf8_unhtml($in),$out);
}
function test_without_entities(){
$out = '&amp;#38;&amp;#38;';
$in = '&amp;#38;&#38;amp;#38;';
- $this->assertEqual(utf8_unhtml($in),$out);
+ $this->assertEquals(utf8_unhtml($in),$out);
}
function test_with_entities(){
$out = '&#38;&amp;#38;';
$in = '&amp;#38;&#38;amp;#38;';
- $this->assertEqual(utf8_unhtml($in,HTML_ENTITIES),$out);
+ $this->assertEquals(utf8_unhtml($in,HTML_ENTITIES),$out);
}
}
diff --git a/_test/cases/inc/utf8_kanaromaji.txt b/_test/tests/inc/utf8_kanaromaji.txt
index d6bf51e95..d6bf51e95 100644
--- a/_test/cases/inc/utf8_kanaromaji.txt
+++ b/_test/tests/inc/utf8_kanaromaji.txt
diff --git a/_test/cases/inc/utf8_romanize.test.php b/_test/tests/inc/utf8_romanize.test.php
index 950c8842a..d08346faa 100644
--- a/_test/cases/inc/utf8_romanize.test.php
+++ b/_test/tests/inc/utf8_romanize.test.php
@@ -1,9 +1,11 @@
<?php
// use no mbstring help here
if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
-require_once DOKU_INC.'inc/utf8.php';
-class utf8_romanize_test extends UnitTestCase {
+/**
+ * @group slow
+ */
+class utf8_romanize_test extends PHPUnit_Framework_TestCase {
/**
* Check Japanese romanization
@@ -17,8 +19,7 @@ class utf8_romanize_test extends UnitTestCase {
list($jap,$rom) = explode(';',trim($test));
$chk = utf8_romanize($jap);
- #if($chk != $rom) echo "$jap\t->\t$chk\t!=\t$rom\t($line)\n";
- $this->assertEqual($chk,$rom);
+ $this->assertEquals($rom,$chk,"$jap\t->\t$chk\t!=\t$rom\t($line)");
$line++;
}
}
@@ -30,7 +31,7 @@ class utf8_romanize_test extends UnitTestCase {
* @author Andreas Gohr <andi@splitbrain.org>
*/
function test_deaccented(){
- $this->assertEqual("a A a A a o O",utf8_romanize("å Å ä Ä ä ö Ö"));
+ $this->assertEquals("a A a A a o O",utf8_romanize("å Å ä Ä ä ö Ö"));
}
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/utf8_stripspecials.test.php b/_test/tests/inc/utf8_stripspecials.test.php
index 481f47650..c9dc3205f 100644
--- a/_test/cases/inc/utf8_stripspecials.test.php
+++ b/_test/tests/inc/utf8_stripspecials.test.php
@@ -1,9 +1,8 @@
<?php
// use no mbstring help here
if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
-require_once DOKU_INC.'inc/utf8.php';
-class utf8_stripspecials extends UnitTestCase {
+class utf8_stripspecials extends DokuWikiTest {
function test1(){
@@ -20,7 +19,7 @@ class utf8_stripspecials extends UnitTestCase {
$tests[] = array('string with nbsps','_','\*','string_with_nbsps');
foreach($tests as $test){
- $this->assertEqual(utf8_stripspecials($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(utf8_stripspecials($test[0],$test[1],$test[2]),$test[3]);
}
}
diff --git a/_test/cases/inc/utf8_substr.test.php b/_test/tests/inc/utf8_substr.test.php
index 2806d34f1..758e8c9d4 100644
--- a/_test/cases/inc/utf8_substr.test.php
+++ b/_test/tests/inc/utf8_substr.test.php
@@ -1,9 +1,8 @@
<?php
// use no mbstring help here
if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
-require_once DOKU_INC.'inc/utf8.php';
-class utf8_substr_test extends UnitTestCase {
+class utf8_substr_test extends DokuWikiTest {
function test1(){
@@ -22,7 +21,7 @@ class utf8_substr_test extends UnitTestCase {
$tests[] = array('живπά우리をあöä',-6,-2,'우리をあ');
foreach($tests as $test){
- $this->assertEqual(utf8_substr($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(utf8_substr($test[0],$test[1],$test[2]),$test[3]);
}
}
@@ -35,7 +34,7 @@ class utf8_substr_test extends UnitTestCase {
$tests[] = array($str,0,66002,$str);
foreach($tests as $test){
- $this->assertEqual(utf8_substr($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(utf8_substr($test[0],$test[1],$test[2]),$test[3]);
}
}
diff --git a/_test/cases/inc/utf8_unicode.test.php b/_test/tests/inc/utf8_unicode.test.php
index 424f47d11..fde8c5d02 100644
--- a/_test/cases/inc/utf8_unicode.test.php
+++ b/_test/tests/inc/utf8_unicode.test.php
@@ -1,58 +1,56 @@
<?php
-require_once DOKU_INC.'inc/utf8.php';
-
// use no mbstring help here
if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
-class utf8_unicode_test extends UnitTestCase {
+class utf8_unicode_test extends DokuWikiTest {
function test_from_1byte(){
$in = 'a';
$out = array(97);
- $this->assertEqual(utf8_to_unicode($in),$out);
+ $this->assertEquals(utf8_to_unicode($in),$out);
}
function test_from_2byte(){
$in = "\xc3\xbc";
$out = array(252);
- $this->assertEqual(utf8_to_unicode($in),$out);
+ $this->assertEquals(utf8_to_unicode($in),$out);
}
function test_from_3byte(){
$in = "\xe2\x99\x8a";
$out = array(9802);
- $this->assertEqual(utf8_to_unicode($in),$out);
+ $this->assertEquals(utf8_to_unicode($in),$out);
}
function test_from_4byte(){
$in = "\xf4\x80\x80\x81";
$out = array(1048577);
- $this->assertEqual(utf8_to_unicode($in),$out);
+ $this->assertEquals(utf8_to_unicode($in),$out);
}
function test_to_1byte(){
$out = 'a';
$in = array(97);
- $this->assertEqual(unicode_to_utf8($in),$out);
+ $this->assertEquals(unicode_to_utf8($in),$out);
}
function test_to_2byte(){
$out = "\xc3\xbc";
$in = array(252);
- $this->assertEqual(unicode_to_utf8($in),$out);
+ $this->assertEquals(unicode_to_utf8($in),$out);
}
function test_to_3byte(){
$out = "\xe2\x99\x8a";
$in = array(9802);
- $this->assertEqual(unicode_to_utf8($in),$out);
+ $this->assertEquals(unicode_to_utf8($in),$out);
}
function test_to_4byte(){
$out = "\xf4\x80\x80\x81";
$in = array(1048577);
- $this->assertEqual(unicode_to_utf8($in),$out);
+ $this->assertEquals(unicode_to_utf8($in),$out);
}
}
diff --git a/_test/cases/inc/utf8_utf16be.test.php b/_test/tests/inc/utf8_utf16be.test.php
index d8b8746f2..6a12a01fd 100644
--- a/_test/cases/inc/utf8_utf16be.test.php
+++ b/_test/tests/inc/utf8_utf16be.test.php
@@ -1,11 +1,9 @@
<?php
-require_once DOKU_INC.'inc/utf8.php';
-
// use no mbstring help here
if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
-class utf8_utf16be_test extends UnitTestCase {
+class utf8_utf16be_test extends DokuWikiTest {
// some chars from various code regions
var $utf8 = '鈩ℵŁöx';
var $utf16 = "\x92\x29\x21\x35\x1\x41\x0\xf6\x0\x78";
@@ -14,14 +12,14 @@ class utf8_utf16be_test extends UnitTestCase {
* Convert from UTF-8 to UTF-16BE
*/
function test_to16be(){
- $this->assertEqual(utf8_to_utf16be($this->utf8), $this->utf16);
+ $this->assertEquals(utf8_to_utf16be($this->utf8), $this->utf16);
}
/**
* Convert from UTF-16BE to UTF-8
*/
function test_from16be(){
- $this->assertEqual(utf16be_to_utf8($this->utf16),$this->utf8);
+ $this->assertEquals(utf16be_to_utf8($this->utf16),$this->utf8);
}
}
diff --git a/_test/cases/lib/exe/css_css_compress.test.php b/_test/tests/lib/exe/css_css_compress.test.php
index 527071bbe..a7c87b6a7 100644
--- a/_test/cases/lib/exe/css_css_compress.test.php
+++ b/_test/tests/lib/exe/css_css_compress.test.php
@@ -2,8 +2,7 @@
require_once DOKU_INC.'lib/exe/css.php';
-
-class css_css_compress_test extends UnitTestCase {
+class css_css_compress_test extends DokuWikiTest {
function test_mlcom1(){
$text = '/**
@@ -11,33 +10,33 @@ class css_css_compress_test extends UnitTestCase {
* line *test*
* check
*/';
- $this->assertEqual(css_compress($text), '');
+ $this->assertEquals(css_compress($text), '');
}
function test_mlcom2(){
$text = '#comment/* */ {
color: lime;
}';
- $this->assertEqual(css_compress($text), '#comment/* */{color:lime;}');
+ $this->assertEquals(css_compress($text), '#comment/* */{color:lime;}');
}
function test_slcom1(){
$text = '// this is a comment';
- $this->assertEqual(css_compress($text), '');
+ $this->assertEquals(css_compress($text), '');
}
function test_slcom2(){
$text = '#foo {
color: lime; // another comment
}';
- $this->assertEqual(css_compress($text), '#foo{color:lime;}');
+ $this->assertEquals(css_compress($text), '#foo{color:lime;}');
}
function test_slcom3(){
$text = '#foo {
background-image: url(http://foo.bar/baz.jpg);
}';
- $this->assertEqual(css_compress($text), '#foo{background-image:url(http://foo.bar/baz.jpg);}');
+ $this->assertEquals(css_compress($text), '#foo{background-image:url(http://foo.bar/baz.jpg);}');
}
function test_hack(){
@@ -45,7 +44,7 @@ class css_css_compress_test extends UnitTestCase {
/* \\*/
display: inline;
/* */';
- $this->assertEqual(css_compress($text), '/* \\*/display:inline;/* */');
+ $this->assertEquals(css_compress($text), '/* \\*/display:inline;/* */');
}
function test_hack2(){
@@ -55,12 +54,12 @@ class css_css_compress_test extends UnitTestCase {
height: 450px;
}
/**/';
- $this->assertEqual(css_compress($text), '/*\\*/* html .page{height:450px;}/**/');
+ $this->assertEquals(css_compress($text), '/*\\*/* html .page{height:450px;}/**/');
}
function test_nl1(){
$text = "a{left:20px;\ntop:20px}";
- $this->assertEqual(css_compress($text), 'a{left:20px;top:20px}');
+ $this->assertEquals(css_compress($text), 'a{left:20px;top:20px}');
}
}
diff --git a/_test/cases/lib/exe/css_css_loadfile.test.php b/_test/tests/lib/exe/css_css_loadfile.test.php
index a444d0086..c89b69b2c 100644
--- a/_test/cases/lib/exe/css_css_loadfile.test.php
+++ b/_test/tests/lib/exe/css_css_loadfile.test.php
@@ -2,15 +2,14 @@
require_once DOKU_INC.'lib/exe/css.php';
-class css_css_loadfile_test extends UnitTestCase {
+class css_css_loadfile_test extends DokuWikiTest {
public function setUp() {
$this->file = tempnam('/tmp', 'css');
- parent::setUp();
}
private function csstest($input, $output = null, $location = 'http://www.example.com/') {
io_saveFile($this->file, $input);
- $this->assertEqual(css_loadfile($this->file, $location), (is_null($output) ? $input : $output));
+ $this->assertEquals(css_loadfile($this->file, $location), (is_null($output) ? $input : $output));
}
public function test_url_relative() {
@@ -50,7 +49,6 @@ class css_css_loadfile_test extends UnitTestCase {
public function tearDown() {
unlink($this->file);
unset($this->file);
- parent::tearDown();
}
}
diff --git a/_test/cases/lib/exe/js_js_compress.test.php b/_test/tests/lib/exe/js_js_compress.test.php
index 4702d35d3..b1ae2a84f 100644
--- a/_test/cases/lib/exe/js_js_compress.test.php
+++ b/_test/tests/lib/exe/js_js_compress.test.php
@@ -2,8 +2,7 @@
require_once DOKU_INC.'lib/exe/js.php';
-
-class js_js_compress_test extends UnitTestCase {
+class js_js_compress_test extends DokuWikiTest {
function test_mlcom1(){
$text = '/**
@@ -11,104 +10,139 @@ class js_js_compress_test extends UnitTestCase {
* line *test*
* check
*/';
- $this->assertEqual(js_compress($text), '');
+ $this->assertEquals(js_compress($text), '');
}
function test_mlcom2(){
$text = 'var foo=6;/* another comment */';
- $this->assertEqual(js_compress($text), 'var foo=6;');
+ $this->assertEquals(js_compress($text), 'var foo=6;');
}
function test_mlcomcond(){
$text = '/*@if (@_win32)';
- $this->assertEqual(js_compress($text), '/*@if(@_win32)');
+ $this->assertEquals(js_compress($text), '/*@if(@_win32)');
}
function test_slcom1(){
$text = '// an comment';
- $this->assertEqual(js_compress($text), '');
+ $this->assertEquals(js_compress($text), '');
}
function test_slcom2(){
$text = 'var foo=6;// another comment ';
- $this->assertEqual(js_compress($text), 'var foo=6;');
+ $this->assertEquals(js_compress($text), 'var foo=6;');
}
function test_slcom3(){
$text = 'var foo=6;// another comment / or something with // comments ';
- $this->assertEqual(js_compress($text), 'var foo=6;');
+ $this->assertEquals(js_compress($text), 'var foo=6;');
}
function test_regex1(){
$text = 'foo.split( /[a-Z\/]*/ );';
- $this->assertEqual(js_compress($text), 'foo.split(/[a-Z\/]*/);');
+ $this->assertEquals(js_compress($text), 'foo.split(/[a-Z\/]*/);');
}
function test_regex_in_array(){
$text = '[/"/ , /"/ , /"/]';
- $this->assertEqual(js_compress($text), '[/"/,/"/,/"/]');
+ $this->assertEquals(js_compress($text), '[/"/,/"/,/"/]');
}
function test_regex_in_hash(){
$text = '{ a : /"/ }';
- $this->assertEqual(js_compress($text), '{a:/"/}');
+ $this->assertEquals(js_compress($text), '{a:/"/}');
}
function test_regex_preceded_by_spaces_caracters(){
$text = "text.replace( \t \r\n /\"/ , ".'"//" )';
- $this->assertEqual(js_compress($text), 'text.replace(/"/,"//")');
+ $this->assertEquals(js_compress($text), 'text.replace(/"/,"//")');
}
function test_dquot1(){
$text = 'var foo="Now what \\" \'do we//get /*here*/ ?";';
- $this->assertEqual(js_compress($text), $text);
+ $this->assertEquals(js_compress($text), $text);
}
function test_dquot2(){
$text = 'var foo="Now what \\\\\\" \'do we//get /*here*/ ?";';
- $this->assertEqual(js_compress($text), $text);
+ $this->assertEquals(js_compress($text), $text);
}
function test_dquotrunaway(){
$text = 'var foo="Now where does it end';
- $this->assertEqual(js_compress($text), $text);
+ $this->assertEquals(js_compress($text), $text);
}
function test_squot1(){
$text = "var foo='Now what \\' \"do we//get /*here*/ ?';";
- $this->assertEqual(js_compress($text), $text);
+ $this->assertEquals(js_compress($text), $text);
}
function test_squotrunaway(){
$text = "var foo='Now where does it end";
- $this->assertEqual(js_compress($text), $text);
+ $this->assertEquals(js_compress($text), $text);
}
function test_nl1(){
$text = "var foo=6;\nvar baz=7;";
- $this->assertEqual(js_compress($text), 'var foo=6;var baz=7;');
+ $this->assertEquals(js_compress($text), 'var foo=6;var baz=7;');
}
function test_lws1(){
$text = " \t var foo=6;";
- $this->assertEqual(js_compress($text), 'var foo=6;');
+ $this->assertEquals(js_compress($text), 'var foo=6;');
}
function test_tws1(){
$text = "var foo=6; \t ";
- $this->assertEqual(js_compress($text), 'var foo=6;');
+ $this->assertEquals(js_compress($text), 'var foo=6;');
}
function test_shortcond(){
$text = "var foo = (baz) ? 'bar' : 'bla';";
- $this->assertEqual(js_compress($text), "var foo=(baz)?'bar':'bla';");
+ $this->assertEquals(js_compress($text), "var foo=(baz)?'bar':'bla';");
}
function test_complexminified(){
$text = 'if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class=\'test e\'></div><div class=\'test\'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;foo="text/*";bla="*/"';
- $this->assertEqual(js_compress($text),$text);
+ $this->assertEquals(js_compress($text),$text);
+ }
+
+ function test_multilinestring(){
+ $text = 'var foo = "this is a \\'."\n".'multiline string";';
+ $this->assertEquals('var foo="this is a multiline string";',js_compress($text));
+
+ $text = "var foo = 'this is a \\\nmultiline string';";
+ $this->assertEquals("var foo='this is a multiline string';",js_compress($text));
+ }
+
+ function test_nocompress(){
+ $text = <<<EOF
+var meh = 'test' ;
+
+/* BEGIN NOCOMPRESS */
+
+
+var foo = 'test' ;
+
+var bar = 'test' ;
+
+
+/* END NOCOMPRESS */
+
+var moh = 'test' ;
+EOF;
+ $out = <<<EOF
+var meh='test';
+var foo = 'test' ;
+
+var bar = 'test' ;
+var moh='test';
+EOF;
+
+ $this->assertEquals($out, js_compress($text));
}
/**
@@ -119,9 +153,8 @@ class js_js_compress_test extends UnitTestCase {
foreach($files as $file){
$info = "Using file $file";
- $this->signal('failinfo',$info);
- $this->assertEqual(js_compress(file_get_contents($file)),
- file_get_contents(substr($file,0,-5).'out.js'));
+ $this->assertEquals(js_compress(file_get_contents($file)),
+ file_get_contents(substr($file,0,-5).'out.js'), $info);
};
}
}
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-in.js
index 771dc1640..771dc1640 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-out.js
index 7d6a5346e..7d6a5346e 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-in.js
index a59f1b774..a59f1b774 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-out.js
index caa2fdca2..caa2fdca2 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes1-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-in.js
index 845c59bdf..845c59bdf 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes1-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes1-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-out.js
index b2696cb98..b2696cb98 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes1-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes2-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-in.js
index 0459a4891..0459a4891 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes2-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes2-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-out.js
index 21b6a410e..21b6a410e 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentInSingleQuotes2-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentMultiline-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentMultiline-in.js
index b9d16a7bd..b9d16a7bd 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentMultiline-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentMultiline-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentMultiline-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentMultiline-out.js
index 8eed2e57a..8eed2e57a 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentMultiline-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentMultiline-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentSingleLine-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-in.js
index 302d7160b..302d7160b 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentSingleLine-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-CommentSingleLine-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-out.js
index 8eed2e57a..8eed2e57a 100644
--- a/_test/cases/lib/exe/js_js_compress/test-CommentSingleLine-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-IfThenElseBraces-in.js b/_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-in.js
index afc824762..afc824762 100644
--- a/_test/cases/lib/exe/js_js_compress/test-IfThenElseBraces-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-IfThenElseBraces-out.js b/_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-out.js
index 2a982a98e..2a982a98e 100644
--- a/_test/cases/lib/exe/js_js_compress/test-IfThenElseBraces-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-IfThenElseNoBraces-in.js b/_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-in.js
index 79d10775e..79d10775e 100644
--- a/_test/cases/lib/exe/js_js_compress/test-IfThenElseNoBraces-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-IfThenElseNoBraces-out.js b/_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-out.js
index b087c42fc..b087c42fc 100644
--- a/_test/cases/lib/exe/js_js_compress/test-IfThenElseNoBraces-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-RegexpBackslash-in.js b/_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-in.js
index 503e07283..503e07283 100644
--- a/_test/cases/lib/exe/js_js_compress/test-RegexpBackslash-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-RegexpBackslash-out.js b/_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-out.js
index e5c83770c..e5c83770c 100644
--- a/_test/cases/lib/exe/js_js_compress/test-RegexpBackslash-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-RegexpSimple-in.js b/_test/tests/lib/exe/js_js_compress/test-RegexpSimple-in.js
index 2741e74c2..2741e74c2 100644
--- a/_test/cases/lib/exe/js_js_compress/test-RegexpSimple-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpSimple-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-RegexpSimple-out.js b/_test/tests/lib/exe/js_js_compress/test-RegexpSimple-out.js
index bb530b0a1..bb530b0a1 100644
--- a/_test/cases/lib/exe/js_js_compress/test-RegexpSimple-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpSimple-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-in.js b/_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-in.js
index c7dbdba3d..c7dbdba3d 100644
--- a/_test/cases/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-out.js b/_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-out.js
index 5c2db510b..5c2db510b 100644
--- a/_test/cases/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-RegexpString-in.js b/_test/tests/lib/exe/js_js_compress/test-RegexpString-in.js
index debb983e5..debb983e5 100644
--- a/_test/cases/lib/exe/js_js_compress/test-RegexpString-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpString-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-RegexpString-out.js b/_test/tests/lib/exe/js_js_compress/test-RegexpString-out.js
index 92ffc7d47..92ffc7d47 100644
--- a/_test/cases/lib/exe/js_js_compress/test-RegexpString-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpString-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StatementDoWhile-in.js b/_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-in.js
index 0c84c66ec..0c84c66ec 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StatementDoWhile-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StatementDoWhile-out.js b/_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-out.js
index 593e9a664..593e9a664 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StatementDoWhile-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StatementForIn-in.js b/_test/tests/lib/exe/js_js_compress/test-StatementForIn-in.js
index 1b0aeb6ff..1b0aeb6ff 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StatementForIn-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementForIn-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StatementForIn-out.js b/_test/tests/lib/exe/js_js_compress/test-StatementForIn-out.js
index 95c85871e..95c85871e 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StatementForIn-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementForIn-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StatementNew-in.js b/_test/tests/lib/exe/js_js_compress/test-StatementNew-in.js
index 61f357f34..61f357f34 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StatementNew-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementNew-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StatementNew-out.js b/_test/tests/lib/exe/js_js_compress/test-StatementNew-out.js
index 0d4ff7f58..0d4ff7f58 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StatementNew-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementNew-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StatementSwitchCase-in.js b/_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-in.js
index 39ffc1239..39ffc1239 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StatementSwitchCase-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StatementSwitchCase-out.js b/_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-out.js
index e51c07371..e51c07371 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StatementSwitchCase-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StringDoubleQuotes-in.js b/_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-in.js
index 57fe13b90..57fe13b90 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StringDoubleQuotes-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StringDoubleQuotes-out.js b/_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-out.js
index 9f91fc83d..9f91fc83d 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StringDoubleQuotes-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-out.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StringSingleQuotes-in.js b/_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-in.js
index bb5f9951a..bb5f9951a 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StringSingleQuotes-in.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-in.js
diff --git a/_test/cases/lib/exe/js_js_compress/test-StringSingleQuotes-out.js b/_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-out.js
index f38b26544..f38b26544 100644
--- a/_test/cases/lib/exe/js_js_compress/test-StringSingleQuotes-out.js
+++ b/_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-out.js
diff --git a/_test/tests/test/basic.test.php b/_test/tests/test/basic.test.php
new file mode 100644
index 000000000..a0ea48a3a
--- /dev/null
+++ b/_test/tests/test/basic.test.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsBasicTest extends DokuWikiTest {
+ /**
+ * Execute the simplest possible request and expect
+ * a dokuwiki page which obviously has the word "DokuWiki"
+ * in it somewhere.
+ */
+ function testSimpleRun() {
+ $request = new TestRequest();
+
+ $response = $request->execute();
+
+ $this->assertTrue(
+ strpos($response->getContent(), 'DokuWiki') >= 0,
+ 'DokuWiki was not a word in the output'
+ );
+ }
+
+ function testPost() {
+ $request = new TestRequest();
+
+ $input = array(
+ 'string' => 'A string',
+ 'array' => array(1, 2, 3),
+ 'id' => 'wiki:dokuwiki'
+ );
+
+ $response = $request->post($input);
+
+ // server var check
+ $this->assertEquals('POST',$request->getServer('REQUEST_METHOD'));
+ $this->assertEquals('',$request->getServer('QUERY_STRING'));
+ $this->assertEquals('/doku.php',$request->getServer('REQUEST_URI'));
+
+ // variable setup check
+ $this->assertEquals('A string', $request->getPost('string'));
+ $this->assertEquals(array(1, 2, 3), $request->getPost('array'));
+ $this->assertEquals('wiki:dokuwiki', $request->getPost('id'));
+
+ // output check
+ $this->assertTrue(strpos($response->getContent(), 'Andreas Gohr') >= 0);
+ }
+
+ function testPostGet() {
+ $request = new TestRequest();
+
+ $input = array(
+ 'string' => 'A string',
+ 'array' => array(1, 2, 3),
+ );
+
+ $response = $request->post($input,'/doku.php?id=wiki:dokuwiki');
+
+ // server var check
+ $this->assertEquals('POST',$request->getServer('REQUEST_METHOD'));
+ $this->assertEquals('?id=wiki:dokuwiki',$request->getServer('QUERY_STRING'));
+ $this->assertEquals('/doku.php?id=wiki:dokuwiki',$request->getServer('REQUEST_URI'));
+
+ // variable setup check
+ $this->assertEquals('A string', $request->getPost('string'));
+ $this->assertEquals(array(1, 2, 3), $request->getPost('array'));
+ $this->assertEquals('wiki:dokuwiki', $request->getGet('id'));
+
+ // output check
+ $this->assertTrue(strpos($response->getContent(), 'Andreas Gohr') >= 0);
+ }
+
+ function testGet() {
+ $request = new TestRequest();
+
+ $input = array(
+ 'string' => 'A string',
+ 'array' => array(1, 2, 3),
+ 'test' => 'bar'
+ );
+
+ $response = $request->get($input,'/doku.php?id=wiki:dokuwiki&test=foo');
+
+ // server var check
+ $this->assertEquals('GET',$request->getServer('REQUEST_METHOD'));
+ $this->assertEquals(
+ '?id=wiki:dokuwiki&test=bar&string=A+string&array[0]=1&array[1]=2&array[2]=3',
+ $request->getServer('QUERY_STRING')
+ );
+ $this->assertEquals(
+ '/doku.php?id=wiki:dokuwiki&test=bar&string=A+string&array[0]=1&array[1]=2&array[2]=3',
+ $request->getServer('REQUEST_URI')
+ );
+
+ // variable setup check
+ $this->assertEquals('A string', $request->getGet('string'));
+ $this->assertEquals(array(1, 2, 3), $request->getGet('array'));
+ $this->assertEquals('wiki:dokuwiki', $request->getGet('id'));
+ $this->assertEquals('bar', $request->getGet('test'));
+
+ // output check
+ $this->assertTrue(strpos($response->getContent(), 'Andreas Gohr') >= 0);
+ }
+
+
+}
diff --git a/_test/tests/test/globals.test.php b/_test/tests/test/globals.test.php
new file mode 100644
index 000000000..180fd0d0d
--- /dev/null
+++ b/_test/tests/test/globals.test.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsGlobalsTest extends DokuWikiTest {
+
+ /**
+ * every request should be with its own variables
+ */
+ function testFirstRun() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $request->setServer('testvar', true);
+
+ $self = $this;
+ $EVENT_HANDLER->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', null,
+ function() use ($self) {
+ $self->assertTrue($_SERVER['testvar'], 'Server variable not set correctly: testvar');
+ $self->assertEquals('87.142.120.6', $_SERVER['REMOTE_ADDR'], 'Server variable not set correctly: REMOTE_ADDR');
+ $_SERVER['tmpvar'] = true;
+ }
+ );
+
+ $request->execute();
+ }
+
+ /**
+ * @depends testFirstRun
+ */
+ function testSecondRun() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $request->setServer('testvar', false);
+
+ $self = $this;
+ $EVENT_HANDLER->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', null,
+ function() use ($self) {
+ $self->assertFalse($_SERVER['testvar'], 'Server variable not set correctly: testvar');
+ $self->assertEquals('87.142.120.6', $_SERVER['REMOTE_ADDR'], 'Server variable not set correctly: REMOTE_ADDR');
+ $self->assertFalse(isset($_SERVER['tmpvar']));
+ }
+ );
+
+ $request->execute();
+ }
+}
diff --git a/_test/tests/test/hooks.test.php b/_test/tests/test/hooks.test.php
new file mode 100644
index 000000000..621b9f9b8
--- /dev/null
+++ b/_test/tests/test/hooks.test.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsHooksTest extends DokuWikiTest {
+
+ function testHookTriggering() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $hookTriggered = false;
+
+ $EVENT_HANDLER->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', null,
+ function() use (&$hookTriggered) {
+ $hookTriggered = true;
+ }
+ );
+
+ $request->execute();
+
+ $this->assertTrue($hookTriggered, 'Hook was not triggered as expected!');
+ }
+}
diff --git a/_test/tests/test/phpquery.test.php b/_test/tests/test/phpquery.test.php
new file mode 100644
index 000000000..188d834cb
--- /dev/null
+++ b/_test/tests/test/phpquery.test.php
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsPHPQueryTest extends DokuWikiTest {
+ /**
+ * Execute the simplest possible request and check the
+ * meta generator tag is set to "DokuWiki"
+ */
+ function testSimpleRun() {
+ $request = new TestRequest();
+
+ $response = $request->execute();
+
+ $this->assertEquals('DokuWiki', $response->queryHTML('meta[name="generator"]')->attr('content') );
+ }
+}
diff --git a/_test/tests/test/plugins.test.php b/_test/tests/test/plugins.test.php
new file mode 100644
index 000000000..ac6d1ee45
--- /dev/null
+++ b/_test/tests/test/plugins.test.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsPluginsTest extends DokuWikiTest {
+
+ function setUp() {
+ $this->pluginsEnabled = array(
+ 'testing'
+ );
+
+ parent::setUp();
+ }
+
+ function testTestingPluginEnabled() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $hookTriggered = false;
+
+ $EVENT_HANDLER->register_hook('TESTING_PLUGIN_INSTALLED', 'AFTER', null,
+ function() use (&$hookTriggered) {
+ $hookTriggered = true;
+ }
+ );
+
+ $request->execute();
+
+ $this->assertTrue($hookTriggered, 'Testing plugin did not trigger!');
+ }
+}
diff --git a/_test/tests/test/plugins_defaults.test.php b/_test/tests/test/plugins_defaults.test.php
new file mode 100644
index 000000000..953960bb7
--- /dev/null
+++ b/_test/tests/test/plugins_defaults.test.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsPluginsDefaultTest extends DokuWikiTest {
+
+ function testTestingPluginDisabledDefault() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $hookTriggered = false;
+
+ $EVENT_HANDLER->register_hook('TESTING_PLUGIN_INSTALLED', 'AFTER', null,
+ function() use (&$hookTriggered) {
+ $hookTriggered = true;
+ }
+ );
+
+ $request->execute();
+
+ $this->assertFalse($hookTriggered, 'Testing plugin did trigger!');
+ }
+}
diff --git a/_test/tests/test/reset.test.php b/_test/tests/test/reset.test.php
new file mode 100644
index 000000000..39c43cd3b
--- /dev/null
+++ b/_test/tests/test/reset.test.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsScopeTest extends DokuWikiTest {
+
+ public $triggered = false;
+
+ function testFirstRun(){
+ global $conf;
+ $conf['foo'] = 'bar';
+
+ global $EVENT_HANDLER;
+ $self = $this;
+ $EVENT_HANDLER->register_hook('DOKUWIKI_STARTED', 'AFTER', null,
+ function() use ($self) {
+ $self->triggered = true;
+ }
+ );
+ $request = new TestRequest();
+ $request->execute();
+ $this->assertTrue($this->triggered);
+ }
+
+ /**
+ * @depends testFirstRun
+ */
+ function testSecondRun(){
+ global $conf;
+ $this->assertFalse(isset($conf['foo']), 'conf setting');
+
+ $request = new TestRequest();
+ $request->execute();
+
+ $this->assertFalse($this->triggered, 'trigger');
+ }
+}
diff --git a/_test/tests/test/scope.test.php b/_test/tests/test/scope.test.php
new file mode 100644
index 000000000..8c4ad9cf8
--- /dev/null
+++ b/_test/tests/test/scope.test.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsResetTest extends DokuWikiTest {
+ /**
+ * It should be possible to have two test cases within one test class.
+ */
+ function testFirstRun() {
+ $request = new TestRequest();
+ $response = $request->execute();
+ $this->assertTrue(
+ strpos($response->getContent(), 'DokuWiki') >= 0,
+ 'DokuWiki was not a word in the output'
+ );
+ }
+
+ /**
+ * @depends testFirstRun
+ */
+ function testSecondRun() {
+ $request = new TestRequest();
+ $response = $request->execute();
+ $this->assertTrue(
+ strpos($response->getContent(), 'DokuWiki') >= 0,
+ 'DokuWiki was not a word in the output'
+ );
+ }
+
+ /**
+ * two requests within the same test case should be possible
+ */
+ function testMultipleRequests() {
+ $request = new TestRequest();
+ $response = $request->execute();
+ $this->assertTrue(
+ strpos($response->getContent(), 'DokuWiki') >= 0,
+ 'DokuWiki was not a word in the output'
+ );
+
+ $request = new TestRequest();
+ $response = $request->execute();
+ $this->assertTrue(
+ strpos($response->getContent(), 'DokuWiki') >= 0,
+ 'DokuWiki was not a word in the output'
+ );
+ }
+}
diff --git a/_test/webtest-stripper.sh b/_test/webtest-stripper.sh
deleted file mode 100755
index f7991cc0b..000000000
--- a/_test/webtest-stripper.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/sh
-################################################################################
-# Quick script to make simpletest web test fail output more legible
-#
-# Run the web test group from the command line w/ the command:
-#
-# $ ./runtests.php -g [GROUP] 2> tmp
-#
-# redirecting the error messages to the file tmp
-#
-# Then run this command on the tmp file
-#
-# $ ./webtest-stripper.sh tmp
-#
-################################################################################
-
-usage="Usage: ${0} [WEB_TEST_OUTPUT_FILE]";
-
-if [ -z "$1" ]; then
- echo $usage;
- exit 1;
-elif [ ! -f "$1" ]; then
- echo "${1} is not a file!";
- echo $usage;
- exit 1;
-fi
-
-sed -e 's/\\n/\
-/g' "${1}" |\
-sed -e 's/\\//g' |\
-sed -e 's/FAIL.*Pattern \[\#\^/EXPECTED:\
-/g' |\
-sed -e 's/\$#i\].*string \[/\
-\
-GOT:\
-/g' |\
-sed -e 's/\]$/\
-----------------------------------------------------------------\
-/g'
-
-exit 0 \ No newline at end of file
diff --git a/bin/dwpage.php b/bin/dwpage.php
index 211bc5a9e..bc9c0f6bb 100755
--- a/bin/dwpage.php
+++ b/bin/dwpage.php
@@ -241,7 +241,7 @@ switch ( $OPTS->arg(0) ) {
$TARGET_FN = $OPTS->arg(2);
if ( empty($TARGET_FN) ) {
- $TARGET_FN = getcwd().'/'.basename($WIKI_FN);
+ $TARGET_FN = getcwd().'/'.utf8_basename($WIKI_FN);
}
if ( !file_exists(dirname($TARGET_FN)) ) {
diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php
index 41f0fd566..cbd42115d 100644
--- a/conf/dokuwiki.php
+++ b/conf/dokuwiki.php
@@ -7,37 +7,40 @@
*
* This is a piece of PHP code so PHP syntax applies!
*
- * For help with the configuration see http://www.dokuwiki.org/config
+ * For help with the configuration and a more detailed explanation of the various options
+ * see http://www.dokuwiki.org/config
*/
-/* Datastorage and Permissions */
-
-$conf['fmode'] = 0644; //set file creation mode
-$conf['dmode'] = 0755; //set directory creation mode
+/* Basic Settings */
+$conf['title'] = 'DokuWiki'; //what to show in the title
+$conf['start'] = 'start'; //name of start page
$conf['lang'] = 'en'; //your language
+$conf['template'] = 'dokuwiki'; //see lib/tpl directory
+$conf['tagline'] = ''; //tagline in header (if template supports it)
+$conf['sidebar'] = 'sidebar'; //name of sidebar in root namespace (if template supports it)
+$conf['license'] = 'cc-by-nc-sa'; //see conf/license.php
+$conf['savedir'] = './data'; //where to store all the files
$conf['basedir'] = ''; //absolute dir from serveroot - blank for autodetection
$conf['baseurl'] = ''; //URL to server including protocol - blank for autodetect
-$conf['cookiedir'] = ''; //Cookie path. Leave blank for using baseurl.
-$conf['savedir'] = './data'; //where to store all the files
+$conf['cookiedir'] = ''; //path to use in cookies - blank for basedir
+$conf['dmode'] = 0755; //set directory creation mode
+$conf['fmode'] = 0644; //set file creation mode
$conf['allowdebug'] = 0; //allow debug output, enable if needed 0|1
-$conf['mediarevisions'] = 1; //enable/disable media revisions
-
-/* Display Options */
-$conf['start'] = 'start'; //name of start page
-$conf['title'] = 'DokuWiki'; //what to show in the title
-$conf['template'] = 'default'; //see lib/tpl directory
-$conf['license'] = 'cc-by-nc-sa'; //see conf/license.php
-$conf['fullpath'] = 0; //show full path of the document or relative to datadir only? 0|1
+/* Display Settings */
$conf['recent'] = 20; //how many entries to show in recent
+$conf['recent_days'] = 7; //How many days of recent changes to keep. (days)
$conf['breadcrumbs'] = 10; //how many recent visited pages to show
$conf['youarehere'] = 0; //show "You are here" navigation? 0|1
+$conf['fullpath'] = 0; //show full path of the document or relative to datadir only? 0|1
$conf['typography'] = 1; //smartquote conversion 0=off, 1=doublequotes, 2=all quotes
-$conf['htmlok'] = 0; //may raw HTML be embedded? This may break layout and XHTML validity 0|1
-$conf['phpok'] = 0; //may PHP code be embedded? Never do this on the internet! 0|1
$conf['dformat'] = '%Y/%m/%d %H:%M'; //dateformat accepted by PHPs strftime() function
-$conf['signature'] = ' --- //[[@MAIL@|@NAME@]] @DATE@//'; //signature see wiki:config for details
+$conf['signature'] = ' --- //[[@MAIL@|@NAME@]] @DATE@//'; //signature see wiki page for details
+$conf['showuseras'] = 'loginname'; // 'loginname' users login name
+ // 'username' users full name
+ // 'email' e-mail address (will be obfuscated as per mailguard)
+ // 'email_link' e-mail address as a mailto: link (obfuscated)
$conf['toptoclevel'] = 1; //Level starting with and below to include in AutoTOC (max. 5)
$conf['tocminheads'] = 3; //Minimum amount of headlines that determines if a TOC is built
$conf['maxtoclevel'] = 3; //Up to which level include into AutoTOC (max. 5)
@@ -45,27 +48,10 @@ $conf['maxseclevel'] = 3; //Up to which level create editable se
$conf['camelcase'] = 0; //Use CamelCase for linking? (I don't like it) 0|1
$conf['deaccent'] = 1; //deaccented chars in pagenames (1) or romanize (2) or keep (0)?
$conf['useheading'] = 0; //use the first heading in a page as its name
-$conf['refcheck'] = 1; //check for references before deleting media files
-$conf['refshow'] = 0; //how many references should be shown, 5 is a good value
-$conf['showuseras'] = 'loginname'; // 'loginname' users login name
- // 'username' users full name
- // 'email' e-mail address (will be obfuscated as per mailguard)
- // 'email_link' e-mail address as a mailto: link (obfuscated)
-
-/* Antispam Features */
-
-$conf['usewordblock']= 1; //block spam based on words? 0|1
-$conf['indexdelay'] = 60*60*24*5; //allow indexing after this time (seconds) default is 5 days
-$conf['relnofollow'] = 1; //use rel="nofollow" for external links?
-$conf['mailguard'] = 'hex'; //obfuscate email addresses against spam harvesters?
- //valid entries are:
- // 'visible' - replace @ with [at], . with [dot] and - with [dash]
- // 'hex' - use hex entities to encode the mail address
- // 'none' - do not obfuscate addresses
-$conf['iexssprotect']= 1; // check for JavaScript and HTML in uploaded files 0|1
-
-/* Authentication Options - read http://www.splitbrain.org/dokuwiki/wiki:acl */
+$conf['sneaky_index']= 0; //check for namespace read permission in index view (0|1) (1 might cause unexpected behavior)
+$conf['hidepages'] = ''; //Regexp for pages to be skipped from RSS, Search and Recent Changes
+/* Authentication Settings */
$conf['useacl'] = 0; //Use Access Control Lists to restrict access?
$conf['autopasswd'] = 1; //autogenerate passwords and email them to user
$conf['authtype'] = 'plain'; //which authentication backend should be used
@@ -74,45 +60,59 @@ $conf['defaultgroup']= 'user'; //Default groups new Users are added to
$conf['superuser'] = '!!not set!!'; //The admin can be user or @group or comma separated list user1,@group1,user2
$conf['manager'] = '!!not set!!'; //The manager can be user or @group or comma separated list user1,@group1,user2
$conf['profileconfirm'] = 1; //Require current password to confirm changes to user profile
+$conf['rememberme'] = 1; //Enable/disable remember me on login
$conf['disableactions'] = ''; //comma separated list of actions to disable
-$conf['sneaky_index'] = 0; //check for namespace read permission in index view (0|1) (1 might cause unexpected behavior)
$conf['auth_security_timeout'] = 900; //time (seconds) auth data is considered valid, set to 0 to recheck on every page view
$conf['securecookie'] = 1; //never send HTTPS cookies via HTTP
+$conf['remote'] = 0; //Enable/disable remote interfaces
+$conf['remoteuser'] = '!!not set !!'; //user/groups that have access to remote interface (comma separated)
-$conf['xmlrpc'] = 0; //Enable/disable XML-RPC interface
-$conf['xmlrpcuser'] = '!!not set!!'; //Restrict XML-RPC access to this groups/users
-
-/* Advanced Options */
-
-$conf['updatecheck'] = 1; //automatically check for new releases?
-$conf['userewrite'] = 0; //this makes nice URLs: 0: off 1: .htaccess 2: internal
-$conf['useslash'] = 0; //use slash instead of colon? only when rewrite is on
+/* Antispam Features */
+$conf['usewordblock']= 1; //block spam based on words? 0|1
+$conf['relnofollow'] = 1; //use rel="nofollow" for external links?
+$conf['indexdelay'] = 60*60*24*5; //allow indexing after this time (seconds) default is 5 days
+$conf['mailguard'] = 'hex'; //obfuscate email addresses against spam harvesters?
+ //valid entries are:
+ // 'visible' - replace @ with [at], . with [dot] and - with [dash]
+ // 'hex' - use hex entities to encode the mail address
+ // 'none' - do not obfuscate addresses
+$conf['iexssprotect']= 1; // check for JavaScript and HTML in uploaded files 0|1
+
+/* Editing Settings */
$conf['usedraft'] = 1; //automatically save a draft while editing (0|1)
-$conf['sepchar'] = '_'; //word separator character in page names; may be a
- // letter, a digit, '_', '-', or '.'.
-$conf['canonical'] = 0; //Should all URLs use full canonical http://... style?
-$conf['fnencode'] = 'url'; //encode filenames (url|safe|utf-8)
-$conf['autoplural'] = 0; //try (non)plural form of nonexisting files?
-$conf['compression'] = 'gz'; //compress old revisions: (0: off) ('gz': gnuzip) ('bz2': bzip)
- // bz2 generates smaller files, but needs more cpu-power
-$conf['cachetime'] = 60*60*24; //maximum age for cachefile in seconds (defaults to a day)
+$conf['htmlok'] = 0; //may raw HTML be embedded? This may break layout and XHTML validity 0|1
+$conf['phpok'] = 0; //may PHP code be embedded? Never do this on the internet! 0|1
$conf['locktime'] = 15*60; //maximum age for lockfiles (defaults to 15 minutes)
-$conf['fetchsize'] = 0; //maximum size (bytes) fetch.php may download from extern, disabled by default
-$conf['notify'] = ''; //send change info to this email (leave blank for nobody)
-$conf['registernotify'] = ''; //send info about newly registered users to this email (leave blank for nobody)
-$conf['mailfrom'] = ''; //use this email when sending mails
-$conf['mailprefix'] = ''; //use this as prefix of outgoing mails
-$conf['gzip_output'] = 0; //use gzip content encodeing for the output xhtml (if allowed by browser)
+$conf['cachetime'] = 60*60*24; //maximum age for cachefile in seconds (defaults to a day)
+
+/* Link Settings */
+// Set target to use when creating links - leave empty for same window
+$conf['target']['wiki'] = '';
+$conf['target']['interwiki'] = '';
+$conf['target']['extern'] = '';
+$conf['target']['media'] = '';
+$conf['target']['windows'] = '';
+
+/* Media Settings */
+$conf['mediarevisions'] = 1; //enable/disable media revisions
+$conf['refcheck'] = 1; //check for references before deleting media files
+$conf['refshow'] = 0; //how many references should be shown, 5 is a good value
$conf['gdlib'] = 2; //the GDlib version (0, 1 or 2) 2 tries to autodetect
$conf['im_convert'] = ''; //path to ImageMagicks convert (will be used instead of GD)
$conf['jpg_quality'] = '70'; //quality of compression when scaling jpg images (0-100)
+$conf['fetchsize'] = 0; //maximum size (bytes) fetch.php may download from extern, disabled by default
+
+/* Notification Settings */
$conf['subscribers'] = 0; //enable change notice subscription support
$conf['subscribe_time'] = 24*60*60; //Time after which digests / lists are sent (in sec, default 1 day)
//Should be smaller than the time specified in recent_days
-$conf['compress'] = 1; //Strip whitespaces and comments from Styles and JavaScript? 1|0
-$conf['cssdatauri'] = 0; //Maximum byte size of small images to embed into CSS, won't work on IE<8
-$conf['hidepages'] = ''; //Regexp for pages to be skipped from RSS, Search and Recent Changes
-$conf['send404'] = 0; //Send a HTTP 404 status for non existing pages?
+$conf['notify'] = ''; //send change info to this email (leave blank for nobody)
+$conf['registernotify'] = ''; //send info about newly registered users to this email (leave blank for nobody)
+$conf['mailfrom'] = ''; //use this email when sending mails
+$conf['mailprefix'] = ''; //use this as prefix of outgoing mails
+$conf['htmlmail'] = 1; //send HTML multipart mails
+
+/* Syndication Settings */
$conf['sitemap'] = 0; //Create a google sitemap? How often? In days.
$conf['rss_type'] = 'rss1'; //type of RSS feed to provide, by default:
// 'rss' - RSS 0.91
@@ -125,41 +125,53 @@ $conf['rss_linkto'] = 'diff'; //what page RSS entries link to:
// 'page' - the revised page itself
// 'rev' - page showing all revisions
// 'current' - most recent revision of page
-$conf['rss_content'] = 'abstract'; // what to put in the items by default?
+$conf['rss_content'] = 'abstract'; //what to put in the items by default?
// 'abstract' - plain text, first paragraph or so
// 'diff' - plain text unified diff wrapped in <pre> tags
// 'htmldiff' - diff as HTML table
// 'html' - the full page rendered in XHTML
+$conf['rss_media'] = 'both'; //what should be listed?
+ // 'both' - page and media changes
+ // 'pages' - page changes only
+ // 'media' - media changes only
$conf['rss_update'] = 5*60; //Update the RSS feed every n seconds (defaults to 5 minutes)
-$conf['recent_days'] = 7; //How many days of recent changes to keep. (days)
$conf['rss_show_summary'] = 1; //Add revision summary to title? 0|1
+
+/* Advanced Settings */
+$conf['updatecheck'] = 1; //automatically check for new releases?
+$conf['userewrite'] = 0; //this makes nice URLs: 0: off 1: .htaccess 2: internal
+$conf['useslash'] = 0; //use slash instead of colon? only when rewrite is on
+$conf['sepchar'] = '_'; //word separator character in page names; may be a
+ // letter, a digit, '_', '-', or '.'.
+$conf['canonical'] = 0; //Should all URLs use full canonical http://... style?
+$conf['fnencode'] = 'url'; //encode filenames (url|safe|utf-8)
+$conf['autoplural'] = 0; //try (non)plural form of nonexisting files?
+$conf['compression'] = 'gz'; //compress old revisions: (0: off) ('gz': gnuzip) ('bz2': bzip)
+ // bz2 generates smaller files, but needs more cpu-power
+$conf['gzip_output'] = 0; //use gzip content encodeing for the output xhtml (if allowed by browser)
+$conf['compress'] = 1; //Strip whitespaces and comments from Styles and JavaScript? 1|0
+$conf['cssdatauri'] = 0; //Maximum byte size of small images to embed into CSS, won't work on IE<8
+$conf['send404'] = 0; //Send a HTTP 404 status for non existing pages?
$conf['broken_iua'] = 0; //Platform with broken ignore_user_abort (IIS+CGI) 0|1
$conf['xsendfile'] = 0; //Use X-Sendfile (1 = lighttpd, 2 = standard)
$conf['renderer_xhtml'] = 'xhtml'; //renderer to use for main page generation
-$conf['rememberme'] = 1; //Enable/disable remember me on login
+$conf['readdircache'] = 0; //time cache in second for the readdir operation, 0 to deactivate.
-//Set target to use when creating links - leave empty for same window
-$conf['target']['wiki'] = '';
-$conf['target']['interwiki'] = '';
-$conf['target']['extern'] = '';
-$conf['target']['media'] = '';
-$conf['target']['windows'] = '';
-
-//Proxy setup - if your Server needs a proxy to access the web set these
+/* Network Settings */
+$conf['dnslookups'] = 1; //disable to disallow IP to hostname lookups
+// Proxy setup - if your Server needs a proxy to access the web set these
$conf['proxy']['host'] = '';
$conf['proxy']['port'] = '';
$conf['proxy']['user'] = '';
$conf['proxy']['pass'] = '';
$conf['proxy']['ssl'] = 0;
$conf['proxy']['except'] = '';
-
-/* Safemode Hack */
-
-$conf['safemodehack'] = 0; //read http://www.dokuwiki.org/config:safemodehack !
+// Safemode Hack - read http://www.dokuwiki.org/config:safemodehack !
+$conf['safemodehack'] = 0;
$conf['ftp']['host'] = 'localhost';
$conf['ftp']['port'] = '21';
$conf['ftp']['user'] = 'user';
$conf['ftp']['pass'] = 'password';
$conf['ftp']['root'] = '/home/user/htdocs';
-$conf['readdircache'] = 0; //time cache in second for the readdir opération, 0 to deactivate.
+
diff --git a/conf/mime.conf b/conf/mime.conf
index 24529b06c..381b93f86 100644
--- a/conf/mime.conf
+++ b/conf/mime.conf
@@ -7,6 +7,7 @@ jpg image/jpeg
jpeg image/jpeg
gif image/gif
png image/png
+ico image/vnd.microsoft.icon
swf application/x-shockwave-flash
mp3 audio/mpeg
diff --git a/conf/plugins.php b/conf/plugins.php
new file mode 100644
index 000000000..b2c79970d
--- /dev/null
+++ b/conf/plugins.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * This file configures the default states of available plugins. All settings in
+ * the plugins.*.php files will override those here.
+ */
+$plugins['testing'] = 0;
diff --git a/conf/users.auth.php.dist b/conf/users.auth.php.dist
index 6576eeb5f..df3c78482 100644
--- a/conf/users.auth.php.dist
+++ b/conf/users.auth.php.dist
@@ -6,5 +6,5 @@
#
# Format:
#
-# user:MD5password:Real Name:email:groups,comma,seperated
+# login:passwordhash:Real Name:email:groups,comma,seperated
diff --git a/data/_dummy b/data/_dummy
index 37ed18a63..e69de29bb 100644
--- a/data/_dummy
+++ b/data/_dummy
@@ -1 +0,0 @@
-data directory
diff --git a/data/deleted.files b/data/deleted.files
index d034e1d5b..e13ecd35c 100644
--- a/data/deleted.files
+++ b/data/deleted.files
@@ -4,6 +4,23 @@
# A copy of this list is maintained at
# http://www.dokuwiki.org/install:upgrade#files_to_remove
+# removed in 2012-09-10
+lib/images/arrow_down.gif
+lib/images/arrow_up.gif
+lib/images/at.gif
+lib/images/close.png
+lib/images/del.png
+lib/images/edit.gif
+lib/images/icon-file.png
+lib/images/icon-thumb.png
+lib/images/interwiki/skype.png
+lib/images/list-minus.gif
+lib/images/list-plus.gif
+lib/images/pencil.png
+lib/plugins/acl/rtl.css
+lib/plugins/config/rtl.css
+lib/plugins/plugin/rtl.css
+
# removed in 2011-11-10
lib/_fla/.htaccess
lib/_fla/MultipleUpload.as
diff --git a/data/pages/wiki/syntax.txt b/data/pages/wiki/syntax.txt
index b03435787..55bbabab2 100644
--- a/data/pages/wiki/syntax.txt
+++ b/data/pages/wiki/syntax.txt
@@ -1,6 +1,6 @@
====== Formatting Syntax ======
-[[doku>DokuWiki]] supports some simple markup language, which tries to make the datafiles to be as readable as possible. This page contains all possible syntax you may use when editing the pages. Simply have a look at the source of this page by pressing the //Edit this page// button at the top or bottom of the page. If you want to try something, just use the [[playground:playground|playground]] page. The simpler markup is easily accessible via [[doku>toolbar|quickbuttons]], too.
+[[doku>DokuWiki]] supports some simple markup language, which tries to make the datafiles to be as readable as possible. This page contains all possible syntax you may use when editing the pages. Simply have a look at the source of this page by pressing "Edit this page". If you want to try something, just use the [[playground:playground|playground]] page. The simpler markup is easily accessible via [[doku>toolbar|quickbuttons]], too.
===== Basic Text Formatting =====
@@ -368,7 +368,7 @@ Those blocks were created by this source:
==== Syntax Highlighting ====
-[[wiki:DokuWiki]] can highlight sourcecode, which makes it easier to read. It uses the [[http://qbnz.com/highlighter/|GeSHi]] Generic Syntax Highlighter -- so any language supported by GeSHi is supported. The syntax is the same like in the code and file blocks in the previous section, but this time the name of the used language is inserted inside the tag. Eg. ''<nowiki><code java></nowiki>'' or ''<nowiki><file java></nowiki>''.
+[[wiki:DokuWiki]] can highlight sourcecode, which makes it easier to read. It uses the [[http://qbnz.com/highlighter/|GeSHi]] Generic Syntax Highlighter -- so any language supported by GeSHi is supported. The syntax uses the same code and file blocks described in the previous section, but this time the name of the language syntax to be highlighted is included inside the tag, e.g. ''<nowiki><code java></nowiki>'' or ''<nowiki><file java></nowiki>''.
<code java>
/**
@@ -382,11 +382,11 @@ class HelloWorldApp {
}
</code>
-The following language strings are currently recognized: //4cs, abap, actionscript-french, actionscript, actionscript3, ada, apache, applescript, asm, asp, autoconf, autohotkey, autoit, avisynth, awk, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, cpp, cpp-qt, csharp, css, cuesheet, d, dcs, delphi, diff, div, dos, dot, ecmascript, eiffel, email, erlang, fo, fortran, freebasic, fsharp, gambas, genero, genie, gdb, glsl, gml, gnuplot, groovy, gettext, gwbasic, haskell, hicest, hq9plus, html, icon, idl, ini, inno, intercal, io, j, java5, java, javascript, jquery, kixtart, klonec, klonecpp, latex, lisp, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, modula2, modula3, mmix, mpasm, mxml, mysql, newlisp, nsis, oberon2, objc, ocaml-brief, ocaml, oobas, oracle8, oracle11, oxygene, oz, pascal, pcre, perl, perl6, per, pf, php-brief, php, pike, pic16, pixelbender, plsql, postgresql, povray, powerbuilder, powershell, progress, prolog, properties, providex, purebasic, python, q, qbasic, rails, rebol, reg, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, vala, vbnet, vb, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, winbatch, whois, xbasic, xml, xorg_conf, xpp, z80//
+The following language strings are currently recognized: //4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript-french, actionscript, actionscript3, ada, algol68, apache, applescript, asm, asp, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcs, delphi, diff, div, dos, dot, e, epc, ecmascript, eiffel, email, erlang, euphoria, f1, falcon, fo, fortran, freebasic, fsharp, gambas, genero, genie, gdb, glsl, gml, gnuplot, go, groovy, gettext, gwbasic, haskell, hicest, hq9plus, html, html5, icon, idl, ini, inno, intercal, io, j, java5, java, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, modula2, modula3, mmix, mpasm, mxml, mysql, newlisp, nsis, oberon2, objc, objeck, ocaml-brief, ocaml, oobas, oracle8, oracle11, oxygene, oz, pascal, pcre, perl, perl6, per, pf, php-brief, php, pike, pic16, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, python, q, qbasic, rails, rebol, reg, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, uscript, vala, vbnet, vb, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, winbatch, whois, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic//
==== Downloadable Code Blocks ====
-When you use the ''%%<code>%%'' or ''%%<file>%%'' syntax as above, you might want to make the shown code available for download as well. You can to this by specifying a file name after language code like this:
+When you use the ''%%<code>%%'' or ''%%<file>%%'' syntax as above, you might want to make the shown code available for download as well. You can do this by specifying a file name after language code like this:
<code>
<file php myexample.php>
diff --git a/doku.php b/doku.php
index e23757298..ac80772e3 100644
--- a/doku.php
+++ b/doku.php
@@ -4,20 +4,22 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @global Input $INPUT
*/
// update message version
-$updateVersion = 35;
+$updateVersion = 37;
// xdebug_start_profiling();
-if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
+if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/');
-if (isset($_SERVER['HTTP_X_DOKUWIKI_DO'])){
+if(isset($_SERVER['HTTP_X_DOKUWIKI_DO'])) {
$ACT = trim(strtolower($_SERVER['HTTP_X_DOKUWIKI_DO']));
-} elseif (!empty($_REQUEST['idx'])) {
+} elseif(!empty($_REQUEST['idx'])) {
$ACT = 'index';
-} elseif (isset($_REQUEST['do'])) {
+} elseif(isset($_REQUEST['do'])) {
$ACT = $_REQUEST['do'];
} else {
$ACT = 'show';
@@ -27,29 +29,23 @@ if (isset($_SERVER['HTTP_X_DOKUWIKI_DO'])){
require_once(DOKU_INC.'inc/init.php');
//import variables
-$_REQUEST['id'] = str_replace("\xC2\xAD",'',$_REQUEST['id']); //soft-hyphen
-$QUERY = trim($_REQUEST['id']);
-$ID = getID();
-
-// deprecated 2011-01-14
-$NS = getNS($ID);
-
-$REV = $_REQUEST['rev'];
-$IDX = $_REQUEST['idx'];
-$DATE = $_REQUEST['date'];
-$RANGE = $_REQUEST['range'];
-$HIGH = $_REQUEST['s'];
+$_REQUEST['id'] = str_replace("\xC2\xAD", '', $INPUT->str('id')); //soft-hyphen
+$QUERY = trim($INPUT->str('id'));
+$ID = getID();
+
+$REV = $INPUT->int('rev');
+$IDX = $INPUT->str('idx');
+$DATE = $INPUT->int('date');
+$RANGE = $INPUT->str('range');
+$HIGH = $INPUT->param('s');
if(empty($HIGH)) $HIGH = getGoogleQuery();
-if (isset($_POST['wikitext'])) {
- $TEXT = cleanText($_POST['wikitext']);
+if($INPUT->post->has('wikitext')) {
+ $TEXT = cleanText($INPUT->post->str('wikitext'));
}
-$PRE = cleanText(substr($_POST['prefix'], 0, -1));
-$SUF = cleanText($_POST['suffix']);
-$SUM = $_REQUEST['summary'];
-
-//sanitize revision
-$REV = preg_replace('/[^0-9]/','',$REV);
+$PRE = cleanText(substr($INPUT->post->str('prefix'), 0, -1));
+$SUF = cleanText($INPUT->post->str('suffix'));
+$SUM = $INPUT->post->str('summary');
//make infos about the selected page available
$INFO = pageinfo();
@@ -58,28 +54,28 @@ $INFO = pageinfo();
$JSINFO['id'] = $ID;
$JSINFO['namespace'] = (string) $INFO['namespace'];
-
// handle debugging
-if($conf['allowdebug'] && $ACT == 'debug'){
+if($conf['allowdebug'] && $ACT == 'debug') {
html_debug();
exit;
}
//send 404 for missing pages if configured or ID has special meaning to bots
if(!$INFO['exists'] &&
- ($conf['send404'] || preg_match('/^(robots\.txt|sitemap\.xml(\.gz)?|favicon\.ico|crossdomain\.xml)$/',$ID)) &&
- ($ACT == 'show' || (!is_array($ACT) && substr($ACT,0,7) == 'export_')) ){
+ ($conf['send404'] || preg_match('/^(robots\.txt|sitemap\.xml(\.gz)?|favicon\.ico|crossdomain\.xml)$/', $ID)) &&
+ ($ACT == 'show' || (!is_array($ACT) && substr($ACT, 0, 7) == 'export_'))
+) {
header('HTTP/1.0 404 Not Found');
}
//prepare breadcrumbs (initialize a static var)
-if ($conf['breadcrumbs']) breadcrumbs();
+if($conf['breadcrumbs']) breadcrumbs();
// check upstream
checkUpdateMessages();
$tmp = array(); // No event data
-trigger_event('DOKUWIKI_STARTED',$tmp);
+trigger_event('DOKUWIKI_STARTED', $tmp);
//close session
session_write_close();
diff --git a/feed.php b/feed.php
index 298777eb9..9e5c5c6b5 100644
--- a/feed.php
+++ b/feed.php
@@ -4,9 +4,12 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @global array $conf
+ * @global Input $INPUT
*/
-if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
+if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/');
require_once(DOKU_INC.'inc/init.php');
//close session
@@ -17,14 +20,14 @@ $opt = rss_parseOptions();
// the feed is dynamic - we need a cache for each combo
// (but most people just use the default feed so it's still effective)
-$cache = getCacheName(join('',array_values($opt)).$_SERVER['REMOTE_USER'],'.feed');
-$key = join('', array_values($opt)) . $_SERVER['REMOTE_USER'];
+$cache = getCacheName(join('', array_values($opt)).$_SERVER['REMOTE_USER'], '.feed');
+$key = join('', array_values($opt)).$_SERVER['REMOTE_USER'];
$cache = new cache($key, '.feed');
// prepare cache depends
$depends['files'] = getConfigFiles('main');
$depends['age'] = $conf['rss_update'];
-$depends['purge'] = isset($_REQUEST['purge']);
+$depends['purge'] = $INPUT->bool('purge');
// check cacheage and deliver if nothing has changed since last
// time or the update interval has not passed, also handles conditional requests
@@ -39,34 +42,36 @@ if($cache->useCache($depends)) {
exit;
} else {
http_conditionalRequest(time());
- }
+}
// create new feed
-$rss = new DokuWikiFeedCreator();
-$rss->title = $conf['title'].(($opt['namespace']) ? ' '.$opt['namespace'] : '');
-$rss->link = DOKU_URL;
+$rss = new DokuWikiFeedCreator();
+$rss->title = $conf['title'].(($opt['namespace']) ? ' '.$opt['namespace'] : '');
+$rss->link = DOKU_URL;
$rss->syndicationURL = DOKU_URL.'feed.php';
$rss->cssStyleSheet = DOKU_URL.'lib/exe/css.php?s=feed';
-$image = new FeedImage();
+$image = new FeedImage();
$image->title = $conf['title'];
-$image->url = tpl_getFavicon(true);
-$image->link = DOKU_URL;
-$rss->image = $image;
-
-$data = null;
-$modes = array('list' => 'rssListNamespace',
- 'search' => 'rssSearch',
- 'recent' => 'rssRecentChanges');
-if (isset($modes[$opt['feed_mode']])) {
+$image->url = tpl_getMediaFile(array(':wiki:favicon.ico', ':favicon.ico', 'images/favicon.ico'), true);
+$image->link = DOKU_URL;
+$rss->image = $image;
+
+$data = null;
+$modes = array(
+ 'list' => 'rssListNamespace',
+ 'search' => 'rssSearch',
+ 'recent' => 'rssRecentChanges'
+);
+if(isset($modes[$opt['feed_mode']])) {
$data = $modes[$opt['feed_mode']]($opt);
} else {
$eventData = array(
'opt' => &$opt,
'data' => &$data,
);
- $event = new Doku_Event('FEED_MODE_UNKNOWN', $eventData);
- if ($event->advise_before(true)) {
+ $event = new Doku_Event('FEED_MODE_UNKNOWN', $eventData);
+ if($event->advise_before(true)) {
echo sprintf('<error>Unknown feed mode %s</error>', hsc($opt['feed_mode']));
exit;
}
@@ -74,7 +79,7 @@ if (isset($modes[$opt['feed_mode']])) {
}
rss_buildItems($rss, $data, $opt);
-$feed = $rss->createFeed($opt['feed_type'],'utf-8');
+$feed = $rss->createFeed($opt['feed_type'], 'utf-8');
// save cachefile
$cache->storeCache($feed);
@@ -89,51 +94,55 @@ print $feed;
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rss_parseOptions(){
+function rss_parseOptions() {
global $conf;
+ global $INPUT;
$opt = array();
foreach(array(
- // Basic feed properties
- // Plugins may probably want to add new values to these
- // properties for implementing own feeds
-
- // One of: list, search, recent
- 'feed_mode' => array('mode', 'recent'),
- // One of: diff, page, rev, current
- 'link_to' => array('linkto', $conf['rss_linkto']),
- // One of: abstract, diff, htmldiff, html
- 'item_content' => array('content', $conf['rss_content']),
-
- // Special feed properties
- // These are only used by certain feed_modes
-
- // String, used for feed title, in list and rc mode
- 'namespace' => array('ns', null),
- // Positive integer, only used in rc mode
- 'items' => array('num', $conf['recent']),
- // Boolean, only used in rc mode
- 'show_minor' => array('minor', false),
- // String, only used in search mode
- 'search_query' => array('q', null),
+ // Basic feed properties
+ // Plugins may probably want to add new values to these
+ // properties for implementing own feeds
+
+ // One of: list, search, recent
+ 'feed_mode' => array('str', 'mode', 'recent'),
+ // One of: diff, page, rev, current
+ 'link_to' => array('str', 'linkto', $conf['rss_linkto']),
+ // One of: abstract, diff, htmldiff, html
+ 'item_content' => array('str', 'content', $conf['rss_content']),
+
+ // Special feed properties
+ // These are only used by certain feed_modes
+
+ // String, used for feed title, in list and rc mode
+ 'namespace' => array('str', 'ns', null),
+ // Positive integer, only used in rc mode
+ 'items' => array('int', 'num', $conf['recent']),
+ // Boolean, only used in rc mode
+ 'show_minor' => array('bool', 'minor', false),
+ // String, only used in search mode
+ 'search_query' => array('str', 'q', null),
// One of: pages, media, both
- 'content_type' => array('view', 'both')
+ 'content_type' => array('str', 'view', $conf['rss_media'])
- ) as $name => $val) {
- $opt[$name] = (isset($_REQUEST[$val[0]]) && !empty($_REQUEST[$val[0]]))
- ? $_REQUEST[$val[0]] : $val[1];
+ ) as $name => $val) {
+ $opt[$name] = $INPUT->$val[0]($val[1], $val[2], true);
}
- $opt['items'] = max(0, (int) $opt['items']);
- $opt['show_minor'] = (bool) $opt['show_minor'];
+ $opt['items'] = max(0, (int) $opt['items']);
+ $opt['show_minor'] = (bool) $opt['show_minor'];
- $opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
+ $opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
- $type = valid_input_set('type', array('rss','rss2','atom','atom1','rss1',
- 'default' => $conf['rss_type']),
- $_REQUEST);
- switch ($type){
+ $type = valid_input_set(
+ 'type', array(
+ 'rss', 'rss2', 'atom', 'atom1', 'rss1',
+ 'default' => $conf['rss_type']
+ ),
+ $_REQUEST
+ );
+ switch($type) {
case 'rss':
$opt['feed_type'] = 'RSS0.91';
$opt['mime_type'] = 'text/xml';
@@ -166,117 +175,138 @@ function rss_parseOptions(){
* Add recent changed pages to a feed object
*
* @author Andreas Gohr <andi@splitbrain.org>
- * @param object $rss - the FeedCreator Object
- * @param array $data - the items to add
- * @param array $opt - the feed options
+ * @param FeedCreator $rss the FeedCreator Object
+ * @param array $data the items to add
+ * @param array $opt the feed options
*/
-function rss_buildItems(&$rss,&$data,$opt){
+function rss_buildItems(&$rss, &$data, $opt) {
global $conf;
global $lang;
+ /* @var auth_basic $auth */
global $auth;
$eventData = array(
- 'rss' => &$rss,
+ 'rss' => &$rss,
'data' => &$data,
- 'opt' => &$opt,
+ 'opt' => &$opt,
);
- $event = new Doku_Event('FEED_DATA_PROCESS', $eventData);
- if ($event->advise_before(false)){
- foreach($data as $ditem){
- if(!is_array($ditem)){
+ $event = new Doku_Event('FEED_DATA_PROCESS', $eventData);
+ if($event->advise_before(false)) {
+ foreach($data as $ditem) {
+ if(!is_array($ditem)) {
// not an array? then only a list of IDs was given
- $ditem = array( 'id' => $ditem );
+ $ditem = array('id' => $ditem);
}
$item = new FeedItem();
$id = $ditem['id'];
if(!$ditem['media']) {
$meta = p_get_metadata($id);
+ } else {
+ $meta = array();
}
// add date
- if($ditem['date']){
+ if($ditem['date']) {
$date = $ditem['date'];
- }elseif($meta['date']['modified']){
+ } elseif($meta['date']['modified']) {
$date = $meta['date']['modified'];
- }else{
+ } else if ($ditem['media']) {
+ $date = @filemtime(mediaFN($id));
+ } else {
$date = @filemtime(wikiFN($id));
}
- if($date) $item->date = date('r',$date);
+ if($date) $item->date = date('r', $date);
// add title
- if($conf['useheading'] && $meta['title']){
+ if($conf['useheading'] && $meta['title']) {
$item->title = $meta['title'];
- }else{
+ } else {
$item->title = $ditem['id'];
}
- if($conf['rss_show_summary'] && !empty($ditem['sum'])){
+ if($conf['rss_show_summary'] && !empty($ditem['sum'])) {
$item->title .= ' - '.strip_tags($ditem['sum']);
}
// add item link
- switch ($opt['link_to']){
+ switch($opt['link_to']) {
case 'page':
- if ($ditem['media']) {
- $item->link = media_managerURL(array('image' => $id,
- 'ns' => getNS($id),
- 'rev' => $date), '&', true);
+ if($ditem['media']) {
+ $item->link = media_managerURL(
+ array(
+ 'image' => $id,
+ 'ns' => getNS($id),
+ 'rev' => $date
+ ), '&', true
+ );
} else {
- $item->link = wl($id,'rev='.$date,true,'&', true);
+ $item->link = wl($id, 'rev='.$date, true, '&', true);
}
break;
case 'rev':
- if ($ditem['media']) {
- $item->link = media_managerURL(array('image' => $id,
- 'ns' => getNS($id),
- 'rev' => $date,
- 'tab_details' => 'history'), '&', true);
+ if($ditem['media']) {
+ $item->link = media_managerURL(
+ array(
+ 'image' => $id,
+ 'ns' => getNS($id),
+ 'rev' => $date,
+ 'tab_details' => 'history'
+ ), '&', true
+ );
} else {
- $item->link = wl($id,'do=revisions&rev='.$date,true,'&');
+ $item->link = wl($id, 'do=revisions&rev='.$date, true, '&');
}
break;
case 'current':
- if ($ditem['media']) {
- $item->link = media_managerURL(array('image' => $id,
- 'ns' => getNS($id)), '&', true);
+ if($ditem['media']) {
+ $item->link = media_managerURL(
+ array(
+ 'image' => $id,
+ 'ns' => getNS($id)
+ ), '&', true
+ );
} else {
- $item->link = wl($id, '', true,'&');
+ $item->link = wl($id, '', true, '&');
}
break;
case 'diff':
default:
- if ($ditem['media']) {
- $item->link = media_managerURL(array('image' => $id,
- 'ns' => getNS($id),
- 'rev' => $date,
- 'tab_details' => 'history',
- 'mediado' => 'diff'), '&', true);
+ if($ditem['media']) {
+ $item->link = media_managerURL(
+ array(
+ 'image' => $id,
+ 'ns' => getNS($id),
+ 'rev' => $date,
+ 'tab_details' => 'history',
+ 'mediado' => 'diff'
+ ), '&', true
+ );
} else {
- $item->link = wl($id,'rev='.$date.'&do=diff',true,'&');
+ $item->link = wl($id, 'rev='.$date.'&do=diff', true, '&');
}
}
// add item content
- switch ($opt['item_content']){
+ switch($opt['item_content']) {
case 'diff':
case 'htmldiff':
- if ($ditem['media']) {
- $revs = getRevisions($id, 0, 1, 8192, true);
- $rev = $revs[0];
+ if($ditem['media']) {
+ $revs = getRevisions($id, 0, 1, 8192, true);
+ $rev = $revs[0];
$src_r = '';
$src_l = '';
- if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) {
- $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
+ if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) {
+ $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
$src_r = ml($id, $more);
}
- if ($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)){
- $more = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1];
+ if($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)) {
+ $more = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1];
$src_l = ml($id, $more);
}
$content = '';
- if ($src_r) {
- $content = '<table>';
+ if($src_r) {
+ $content = '<table>';
$content .= '<tr><th width="50%">'.$rev.'</th>';
$content .= '<th width="50%">'.$lang['current'].'</th></tr>';
$content .= '<tr align="center"><td><img src="'.$src_l.'" alt="" /></td><td>';
@@ -287,57 +317,61 @@ function rss_buildItems(&$rss,&$data,$opt){
} else {
require_once(DOKU_INC.'inc/DifferenceEngine.php');
$revs = getRevisions($id, 0, 1);
- $rev = $revs[0];
-
- if($rev){
- $df = new Diff(explode("\n",htmlspecialchars(rawWiki($id,$rev))),
- explode("\n",htmlspecialchars(rawWiki($id,''))));
- }else{
- $df = new Diff(array(''),
- explode("\n",htmlspecialchars(rawWiki($id,''))));
+ $rev = $revs[0];
+
+ if($rev) {
+ $df = new Diff(explode("\n", htmlspecialchars(rawWiki($id, $rev))),
+ explode("\n", htmlspecialchars(rawWiki($id, ''))));
+ } else {
+ $df = new Diff(array(''),
+ explode("\n", htmlspecialchars(rawWiki($id, ''))));
}
- if($opt['item_content'] == 'htmldiff'){
- $tdf = new TableDiffFormatter();
- $content = '<table>';
+ if($opt['item_content'] == 'htmldiff') {
+ $tdf = new TableDiffFormatter();
+ $content = '<table>';
$content .= '<tr><th colspan="2" width="50%">'.$rev.'</th>';
$content .= '<th colspan="2" width="50%">'.$lang['current'].'</th></tr>';
$content .= $tdf->format($df);
$content .= '</table>';
- }else{
- $udf = new UnifiedDiffFormatter();
+ } else {
+ $udf = new UnifiedDiffFormatter();
$content = "<pre>\n".$udf->format($df)."\n</pre>";
}
}
break;
case 'html':
- if ($ditem['media']) {
- if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
- $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
- $src = ml($id, $more);
+ if($ditem['media']) {
+ if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
+ $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
+ $src = ml($id, $more);
$content = '<img src="'.$src.'" alt="'.$id.'" />';
} else {
$content = '';
}
} else {
- $content = p_wiki_xhtml($id,$date,false);
+ $content = p_wiki_xhtml($id, $date, false);
// no TOC in feeds
- $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s','',$content);
+ $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s', '', $content);
+
+ // add alignment for images
+ $content = preg_replace('/(<img .*?class="medialeft")/s', '\\1 align="left"', $content);
+ $content = preg_replace('/(<img .*?class="mediaright")/s', '\\1 align="right"', $content);
// make URLs work when canonical is not set, regexp instead of rerendering!
- if(!$conf['canonical']){
- $base = preg_quote(DOKU_REL,'/');
- $content = preg_replace('/(<a href|<img src)="('.$base.')/s','$1="'.DOKU_URL,$content);
+ if(!$conf['canonical']) {
+ $base = preg_quote(DOKU_REL, '/');
+ $content = preg_replace('/(<a href|<img src)="('.$base.')/s', '$1="'.DOKU_URL, $content);
}
}
break;
case 'abstract':
default:
- if ($ditem['media']) {
- if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
- $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
- $src = ml($id, $more);
+ if($ditem['media']) {
+ if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
+ $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
+ $src = ml($id, $more);
$content = '<img src="'.$src.'" alt="'.$id.'" />';
} else {
$content = '';
@@ -350,12 +384,12 @@ function rss_buildItems(&$rss,&$data,$opt){
// add user
# FIXME should the user be pulled from metadata as well?
- $user = @$ditem['user']; // the @ spares time repeating lookup
+ $user = @$ditem['user']; // the @ spares time repeating lookup
$item->author = '';
- if($user && $conf['useacl'] && $auth){
+ if($user && $conf['useacl'] && $auth) {
$userInfo = $auth->getUserData($user);
- if ($userInfo){
- switch ($conf['showuseras']){
+ if($userInfo) {
+ switch($conf['showuseras']) {
case 'username':
$item->author = $userInfo['name'];
break;
@@ -366,35 +400,37 @@ function rss_buildItems(&$rss,&$data,$opt){
} else {
$item->author = $user;
}
- if($userInfo && !$opt['guardmail']){
+ if($userInfo && !$opt['guardmail']) {
$item->authorEmail = $userInfo['mail'];
- }else{
+ } else {
//cannot obfuscate because some RSS readers may check validity
$item->authorEmail = $user.'@'.$ditem['ip'];
}
- }elseif($user){
+ } elseif($user) {
// this happens when no ACL but some Apache auth is used
$item->author = $user;
$item->authorEmail = $user.'@'.$ditem['ip'];
- }else{
+ } else {
$item->authorEmail = 'anonymous@'.$ditem['ip'];
}
// add category
if(isset($meta['subject'])) {
$item->category = $meta['subject'];
- }else{
+ } else {
$cat = getNS($id);
if($cat) $item->category = $cat;
}
// finally add the item to the feed object, after handing it to registered plugins
- $evdata = array('item' => &$item,
- 'opt' => &$opt,
- 'ditem' => &$ditem,
- 'rss' => &$rss);
- $evt = new Doku_Event('FEED_ITEM_ADD', $evdata);
- if ($evt->advise_before()){
+ $evdata = array(
+ 'item' => &$item,
+ 'opt' => &$opt,
+ 'ditem' => &$ditem,
+ 'rss' => &$rss
+ );
+ $evt = new Doku_Event('FEED_ITEM_ADD', $evdata);
+ if($evt->advise_before()) {
$rss->addItem($item);
}
$evt->advise_after(); // for completeness
@@ -403,20 +439,19 @@ function rss_buildItems(&$rss,&$data,$opt){
$event->advise_after();
}
-
/**
* Add recent changed pages to the feed object
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rssRecentChanges($opt){
+function rssRecentChanges($opt) {
global $conf;
$flags = RECENTS_SKIP_DELETED;
if(!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS;
if($opt['content_type'] == 'media' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_CHANGES;
if($opt['content_type'] == 'both' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_PAGES_MIXED;
- $recents = getRecents(0,$opt['items'],$opt['namespace'],$flags);
+ $recents = getRecents(0, $opt['items'], $opt['namespace'], $flags);
return $recents;
}
@@ -425,16 +460,16 @@ function rssRecentChanges($opt){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rssListNamespace($opt){
+function rssListNamespace($opt) {
require_once(DOKU_INC.'inc/search.php');
global $conf;
- $ns=':'.cleanID($opt['namespace']);
- $ns=str_replace(':','/',$ns);
+ $ns = ':'.cleanID($opt['namespace']);
+ $ns = str_replace(':', '/', $ns);
$data = array();
sort($data);
- search($data,$conf['datadir'],'search_list','',$ns);
+ search($data, $conf['datadir'], 'search_list', '', $ns);
return $data;
}
@@ -444,11 +479,11 @@ function rssListNamespace($opt){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rssSearch($opt){
- if(!$opt['search_query']) return;
+function rssSearch($opt) {
+ if(!$opt['search_query']) return array();
require_once(DOKU_INC.'inc/fulltext.php');
- $data = ft_pageSearch($opt['search_query'],$poswords);
+ $data = ft_pageSearch($opt['search_query'], $poswords);
$data = array_keys($data);
return $data;
diff --git a/inc/DifferenceEngine.php b/inc/DifferenceEngine.php
index 6e1d07382..1b68cf6d3 100644
--- a/inc/DifferenceEngine.php
+++ b/inc/DifferenceEngine.php
@@ -29,7 +29,7 @@ class _DiffOp {
class _DiffOp_Copy extends _DiffOp {
var $type = 'copy';
-
+
function __construct($orig, $closing = false) {
if (!is_array($closing))
$closing = $orig;
@@ -44,7 +44,7 @@ class _DiffOp_Copy extends _DiffOp {
class _DiffOp_Delete extends _DiffOp {
var $type = 'delete';
-
+
function __construct($lines) {
$this->orig = $lines;
$this->closing = false;
@@ -57,7 +57,7 @@ class _DiffOp_Delete extends _DiffOp {
class _DiffOp_Add extends _DiffOp {
var $type = 'add';
-
+
function __construct($lines) {
$this->closing = $lines;
$this->orig = false;
@@ -70,7 +70,7 @@ class _DiffOp_Add extends _DiffOp {
class _DiffOp_Change extends _DiffOp {
var $type = 'change';
-
+
function __construct($orig, $closing) {
$this->orig = $orig;
$this->closing = $closing;
@@ -818,6 +818,39 @@ class DiffFormatter {
}
}
+/**
+ * Utilityclass for styling HTML formatted diffs
+ *
+ * Depends on global var $DIFF_INLINESTYLES, if true some minimal predefined
+ * inline styles are used. Useful for HTML mails and RSS feeds
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class HTMLDiff {
+ /**
+ * Holds the style names and basic CSS
+ */
+ static public $styles = array(
+ 'diff-addedline' => 'background-color: #ddffdd;',
+ 'diff-deletedline' => 'background-color: #ffdddd;',
+ 'diff-context' => 'background-color: #f5f5f5;',
+ 'diff-mark' => 'color: #ff0000;',
+ );
+
+ /**
+ * Return a class or style parameter
+ */
+ static function css($classname){
+ global $DIFF_INLINESTYLES;
+
+ if($DIFF_INLINESTYLES){
+ if(!isset(self::$styles[$classname])) return '';
+ return 'style="'.self::$styles[$classname].'"';
+ }else{
+ return 'class="'.$classname.'"';
+ }
+ }
+}
/**
* Additions by Axel Boldt follow, partly taken from diff.php, phpwiki-1.3.3
@@ -838,11 +871,11 @@ class _HWLDF_WordAccumulator {
function _flushGroup($new_tag) {
if ($this->_group !== '') {
if ($this->_tag == 'mark')
- $this->_line .= '<strong>'.$this->_group.'</strong>';
+ $this->_line .= '<strong '.HTMLDiff::css('diff-mark').'>'.$this->_group.'</strong>';
elseif ($this->_tag == 'add')
- $this->_line .= '<span class="diff-addedline">'.$this->_group.'</span>';
+ $this->_line .= '<span '.HTMLDiff::css('diff-addedline').'>'.$this->_group.'</span>';
elseif ($this->_tag == 'del')
- $this->_line .= '<span class="diff-deletedline"><del>'.$this->_group.'</del></span>';
+ $this->_line .= '<span '.HTMLDiff::css('diff-deletedline').'><del>'.$this->_group.'</del></span>';
else
$this->_line .= $this->_group;
}
@@ -924,7 +957,7 @@ class WordLevelDiff extends MappedDiff {
}
class InlineWordLevelDiff extends MappedDiff {
-
+
function __construct($orig_lines, $closing_lines) {
list ($orig_words, $orig_stripped) = $this->_split($orig_lines);
list ($closing_words, $closing_stripped) = $this->_split($closing_lines);
@@ -1006,8 +1039,8 @@ class TableDiffFormatter extends DiffFormatter {
// Preserve whitespaces by converting some to non-breaking spaces.
// Do not convert all of them to allow word-wrap.
$val = parent::format($diff);
- $val = str_replace(' ','&nbsp; ', $val);
- $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&nbsp;', $val);
+ $val = str_replace(' ','&#160; ', $val);
+ $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&#160;', $val);
return $val;
}
@@ -1020,8 +1053,8 @@ class TableDiffFormatter extends DiffFormatter {
global $lang;
$l1 = $lang['line'].' '.$xbeg;
$l2 = $lang['line'].' '.$ybeg;
- $r = '<tr><td class="diff-blockheader" colspan="2">'.$l1.":</td>\n".
- '<td class="diff-blockheader" colspan="2">'.$l2.":</td>\n".
+ $r = '<tr><td '.HTMLDiff::css('diff-blockheader').' colspan="2">'.$l1.":</td>\n".
+ '<td '.HTMLDiff::css('diff-blockheader').' colspan="2">'.$l2.":</td>\n".
"</tr>\n";
return $r;
}
@@ -1037,19 +1070,19 @@ class TableDiffFormatter extends DiffFormatter {
}
function addedLine($line) {
- return '<td>+</td><td class="diff-addedline">' . $line.'</td>';
+ return '<td>+</td><td '.HTMLDiff::css('diff-addedline').'>' . $line.'</td>';
}
function deletedLine($line) {
- return '<td>-</td><td class="diff-deletedline">' . $line.'</td>';
+ return '<td>-</td><td '.HTMLDiff::css('diff-deletedline').'>' . $line.'</td>';
}
function emptyLine() {
- return '<td colspan="2">&nbsp;</td>';
+ return '<td colspan="2">&#160;</td>';
}
function contextLine($line) {
- return '<td> </td><td class="diff-context">'.$line.'</td>';
+ return '<td> </td><td '.HTMLDiff::css('diff-context').'>'.$line.'</td>';
}
function _added($lines) {
@@ -1099,8 +1132,8 @@ class InlineDiffFormatter extends DiffFormatter {
// Preserve whitespaces by converting some to non-breaking spaces.
// Do not convert all of them to allow word-wrap.
$val = parent::format($diff);
- $val = str_replace(' ','&nbsp; ', $val);
- $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&nbsp;', $val);
+ $val = str_replace(' ','&#160; ', $val);
+ $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&#160;', $val);
return $val;
}
@@ -1115,9 +1148,9 @@ class InlineDiffFormatter extends DiffFormatter {
$xbeg .= "," . $xlen;
if ($ylen != 1)
$ybeg .= "," . $ylen;
- $r = '<tr><td colspan="'.$this->colspan.'" class="diff-blockheader">@@ '.$lang['line']." -$xbeg +$ybeg @@";
- $r .= ' <span class="diff-deletedline"><del>'.$lang['deleted'].'</del></span>';
- $r .= ' <span class="diff-addedline">'.$lang['created'].'</span>';
+ $r = '<tr><td colspan="'.$this->colspan.'" '.HTMLDiff::css('diff-blockheader').'>@@ '.$lang['line']." -$xbeg +$ybeg @@";
+ $r .= ' <span '.HTMLDiff::css('diff-deletedline').'><del>'.$lang['deleted'].'</del></span>';
+ $r .= ' <span '.HTMLDiff::css('diff-addedline').'>'.$lang['created'].'</span>';
$r .= "</td></tr>\n";
return $r;
}
@@ -1134,19 +1167,19 @@ class InlineDiffFormatter extends DiffFormatter {
function _added($lines) {
foreach ($lines as $line) {
- print('<tr><td colspan="'.$this->colspan.'" class="diff-addedline">'. $line . "</td></tr>\n");
+ print('<tr><td colspan="'.$this->colspan.'" '.HTMLDiff::css('diff-addedline').'>'. $line . "</td></tr>\n");
}
}
function _deleted($lines) {
foreach ($lines as $line) {
- print('<tr><td colspan="'.$this->colspan.'" class="diff-deletedline"><del>' . $line . "</del></td></tr>\n");
+ print('<tr><td colspan="'.$this->colspan.'" '.HTMLDiff::css('diff-deletedline').'><del>' . $line . "</del></td></tr>\n");
}
}
function _context($lines) {
foreach ($lines as $line) {
- print('<tr><td colspan="'.$this->colspan.'" class="diff-context">'.$line."</td></tr>\n");
+ print('<tr><td colspan="'.$this->colspan.'" '.HTMLDiff::css('diff-context').'>'.$line."</td></tr>\n");
}
}
diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php
index 641950348..a25846c31 100644
--- a/inc/HTTPClient.php
+++ b/inc/HTTPClient.php
@@ -22,11 +22,11 @@ class DokuHTTPClient extends HTTPClient {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function DokuHTTPClient(){
+ function __construct(){
global $conf;
// call parent constructor
- $this->HTTPClient();
+ parent::__construct();
// set some values from the config
$this->proxy_host = $conf['proxy']['host'];
@@ -61,6 +61,8 @@ class DokuHTTPClient extends HTTPClient {
}
+class HTTPClientException extends Exception { }
+
/**
* This class implements a basic HTTP client
*
@@ -121,7 +123,7 @@ class HTTPClient {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function HTTPClient(){
+ function __construct(){
$this->agent = 'Mozilla/4.0 (compatible; DokuWiki HTTP Client; '.PHP_OS.')';
$this->timeout = 15;
$this->cookies = array();
@@ -227,7 +229,7 @@ class HTTPClient {
$path = $uri['path'];
if(empty($path)) $path = '/';
if(!empty($uri['query'])) $path .= '?'.$uri['query'];
- if(isset($uri['port']) && !empty($uri['port'])) $port = $uri['port'];
+ if(!empty($uri['port'])) $port = $uri['port'];
if(isset($uri['user'])) $this->user = $uri['user'];
if(isset($uri['pass'])) $this->pass = $uri['pass'];
@@ -249,7 +251,7 @@ class HTTPClient {
// prepare headers
$headers = $this->headers;
$headers['Host'] = $uri['host'];
- if($uri['port']) $headers['Host'].= ':'.$uri['port'];
+ if(!empty($uri['port'])) $headers['Host'].= ':'.$uri['port'];
$headers['User-Agent'] = $this->agent;
$headers['Referer'] = $this->referer;
if ($this->keep_alive) {
@@ -279,16 +281,13 @@ class HTTPClient {
$headers['Proxy-Authorization'] = 'Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass);
}
- // stop time
- $start = time();
-
// already connected?
$connectionId = $this->_uniqueConnectionId($server,$port);
- $this->_debug('connection pool', $this->connections);
+ $this->_debug('connection pool', self::$connections);
$socket = null;
- if (isset($this->connections[$connectionId])) {
+ if (isset(self::$connections[$connectionId])) {
$this->_debug('reusing connection', $connectionId);
- $socket = $this->connections[$connectionId];
+ $socket = self::$connections[$connectionId];
}
if (is_null($socket) || feof($socket)) {
$this->_debug('opening connection', $connectionId);
@@ -302,222 +301,161 @@ class HTTPClient {
// keep alive?
if ($this->keep_alive) {
- $this->connections[$connectionId] = $socket;
+ self::$connections[$connectionId] = $socket;
} else {
- unset($this->connections[$connectionId]);
- }
- }
-
- //set blocking
- stream_set_blocking($socket,1);
-
- // build request
- $request = "$method $request_url HTTP/".$this->http.HTTP_NL;
- $request .= $this->_buildHeaders($headers);
- $request .= $this->_getCookies();
- $request .= HTTP_NL;
- $request .= $data;
-
- $this->_debug('request',$request);
-
- // select parameters
- $sel_r = null;
- $sel_w = array($socket);
- $sel_e = null;
-
- // send request
- $towrite = strlen($request);
- $written = 0;
- while($written < $towrite){
- // check timeout
- if(time()-$start > $this->timeout){
- $this->status = -100;
- $this->error = sprintf('Timeout while sending request (%.3fs)',$this->_time() - $this->start);
- unset($this->connections[$connectionId]);
- return false;
- }
-
- // wait for stream ready or timeout (1sec)
- if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
- usleep(1000);
- continue;
- }
-
- // write to stream
- $ret = fwrite($socket, substr($request,$written,4096));
- if($ret === false){
- $this->status = -100;
- $this->error = 'Failed writing to socket';
- unset($this->connections[$connectionId]);
- return false;
+ unset(self::$connections[$connectionId]);
}
- $written += $ret;
}
- // continue non-blocking
- stream_set_blocking($socket,0);
-
- // read headers from socket
- $r_headers = '';
- do{
- if(time()-$start > $this->timeout){
- $this->status = -100;
- $this->error = sprintf('Timeout while reading headers (%.3fs)',$this->_time() - $this->start);
- unset($this->connections[$connectionId]);
- return false;
- }
- if(feof($socket)){
- $this->error = 'Premature End of File (socket)';
- unset($this->connections[$connectionId]);
- return false;
- }
- usleep(1000);
- $r_headers .= fgets($socket,1024);
- }while(!preg_match('/\r?\n\r?\n$/',$r_headers));
-
- $this->_debug('response headers',$r_headers);
-
- // check if expected body size exceeds allowance
- if($this->max_bodysize && preg_match('/\r?\nContent-Length:\s*(\d+)\r?\n/i',$r_headers,$match)){
- if($match[1] > $this->max_bodysize){
- $this->error = 'Reported content length exceeds allowed response size';
- if ($this->max_bodysize_abort)
- unset($this->connections[$connectionId]);
- return false;
+ try {
+ //set non-blocking
+ stream_set_blocking($socket, false);
+
+ // build request
+ $request = "$method $request_url HTTP/".$this->http.HTTP_NL;
+ $request .= $this->_buildHeaders($headers);
+ $request .= $this->_getCookies();
+ $request .= HTTP_NL;
+ $request .= $data;
+
+ $this->_debug('request',$request);
+ $this->_sendData($socket, $request, 'request');
+
+ // read headers from socket
+ $r_headers = '';
+ do{
+ $r_line = $this->_readLine($socket, 'headers');
+ $r_headers .= $r_line;
+ }while($r_line != "\r\n" && $r_line != "\n");
+
+ $this->_debug('response headers',$r_headers);
+
+ // check if expected body size exceeds allowance
+ if($this->max_bodysize && preg_match('/\r?\nContent-Length:\s*(\d+)\r?\n/i',$r_headers,$match)){
+ if($match[1] > $this->max_bodysize){
+ if ($this->max_bodysize_abort)
+ throw new HTTPClientException('Reported content length exceeds allowed response size');
+ else
+ $this->error = 'Reported content length exceeds allowed response size';
+ }
}
- }
- // get Status
- if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m)) {
- $this->error = 'Server returned bad answer';
- unset($this->connections[$connectionId]);
- return false;
- }
- $this->status = $m[2];
-
- // handle headers and cookies
- $this->resp_headers = $this->_parseHeaders($r_headers);
- if(isset($this->resp_headers['set-cookie'])){
- foreach ((array) $this->resp_headers['set-cookie'] as $cookie){
- list($cookie) = explode(';',$cookie,2);
- list($key,$val) = explode('=',$cookie,2);
- $key = trim($key);
- if($val == 'deleted'){
- if(isset($this->cookies[$key])){
- unset($this->cookies[$key]);
+ // get Status
+ if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m))
+ throw new HTTPClientException('Server returned bad answer');
+
+ $this->status = $m[2];
+
+ // handle headers and cookies
+ $this->resp_headers = $this->_parseHeaders($r_headers);
+ if(isset($this->resp_headers['set-cookie'])){
+ foreach ((array) $this->resp_headers['set-cookie'] as $cookie){
+ list($cookie) = explode(';',$cookie,2);
+ list($key,$val) = explode('=',$cookie,2);
+ $key = trim($key);
+ if($val == 'deleted'){
+ if(isset($this->cookies[$key])){
+ unset($this->cookies[$key]);
+ }
+ }elseif($key){
+ $this->cookies[$key] = $val;
}
- }elseif($key){
- $this->cookies[$key] = $val;
}
}
- }
-
- $this->_debug('Object headers',$this->resp_headers);
- // check server status code to follow redirect
- if($this->status == 301 || $this->status == 302 ){
- // close the connection because we don't handle content retrieval here
- // that's the easiest way to clean up the connection
- fclose($socket);
- unset($this->connections[$connectionId]);
+ $this->_debug('Object headers',$this->resp_headers);
- if (empty($this->resp_headers['location'])){
- $this->error = 'Redirect but no Location Header found';
- return false;
- }elseif($this->redirect_count == $this->max_redirect){
- $this->error = 'Maximum number of redirects exceeded';
- return false;
- }else{
- $this->redirect_count++;
- $this->referer = $url;
- // handle non-RFC-compliant relative redirects
- if (!preg_match('/^http/i', $this->resp_headers['location'])){
- if($this->resp_headers['location'][0] != '/'){
- $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
- dirname($uri['path']).'/'.$this->resp_headers['location'];
- }else{
- $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
- $this->resp_headers['location'];
+ // check server status code to follow redirect
+ if($this->status == 301 || $this->status == 302 ){
+ if (empty($this->resp_headers['location'])){
+ throw new HTTPClientException('Redirect but no Location Header found');
+ }elseif($this->redirect_count == $this->max_redirect){
+ throw new HTTPClientException('Maximum number of redirects exceeded');
+ }else{
+ // close the connection because we don't handle content retrieval here
+ // that's the easiest way to clean up the connection
+ fclose($socket);
+ unset(self::$connections[$connectionId]);
+
+ $this->redirect_count++;
+ $this->referer = $url;
+ // handle non-RFC-compliant relative redirects
+ if (!preg_match('/^http/i', $this->resp_headers['location'])){
+ if($this->resp_headers['location'][0] != '/'){
+ $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
+ dirname($uri['path']).'/'.$this->resp_headers['location'];
+ }else{
+ $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
+ $this->resp_headers['location'];
+ }
}
+ // perform redirected request, always via GET (required by RFC)
+ return $this->sendRequest($this->resp_headers['location'],array(),'GET');
}
- // perform redirected request, always via GET (required by RFC)
- return $this->sendRequest($this->resp_headers['location'],array(),'GET');
}
- }
- // check if headers are as expected
- if($this->header_regexp && !preg_match($this->header_regexp,$r_headers)){
- $this->error = 'The received headers did not match the given regexp';
- unset($this->connections[$connectionId]);
- return false;
- }
+ // check if headers are as expected
+ if($this->header_regexp && !preg_match($this->header_regexp,$r_headers))
+ throw new HTTPClientException('The received headers did not match the given regexp');
- //read body (with chunked encoding if needed)
- $r_body = '';
- if(preg_match('/transfer\-(en)?coding:\s*chunked\r\n/i',$r_headers)){
- do {
- unset($chunk_size);
+ //read body (with chunked encoding if needed)
+ $r_body = '';
+ if((isset($this->resp_headers['transfer-encoding']) && $this->resp_headers['transfer-encoding'] == 'chunked')
+ || (isset($this->resp_headers['transfer-coding']) && $this->resp_headers['transfer-coding'] == 'chunked')){
+ $abort = false;
do {
- if(feof($socket)){
- $this->error = 'Premature End of File (socket)';
- unset($this->connections[$connectionId]);
- return false;
+ $chunk_size = '';
+ while (preg_match('/^[a-zA-Z0-9]?$/',$byte=$this->_readData($socket,1,'chunk'))){
+ // read chunksize until \r
+ $chunk_size .= $byte;
+ if (strlen($chunk_size) > 128) // set an abritrary limit on the size of chunks
+ throw new HTTPClientException('Allowed response size exceeded');
}
- if(time()-$start > $this->timeout){
- $this->status = -100;
- $this->error = sprintf('Timeout while reading chunk (%.3fs)',$this->_time() - $this->start);
- unset($this->connections[$connectionId]);
- return false;
+ $this->_readLine($socket, 'chunk'); // readtrailing \n
+ $chunk_size = hexdec($chunk_size);
+
+ if($this->max_bodysize && $chunk_size+strlen($r_body) > $this->max_bodysize){
+ if ($this->max_bodysize_abort)
+ throw new HTTPClientException('Allowed response size exceeded');
+ $this->error = 'Allowed response size exceeded';
+ $chunk_size = $this->max_bodysize - strlen($r_body);
+ $abort = true;
}
- $byte = fread($socket,1);
- $chunk_size .= $byte;
- } while (preg_match('/[a-zA-Z0-9]/',$byte)); // read chunksize including \r
-
- $byte = fread($socket,1); // readtrailing \n
- $chunk_size = hexdec($chunk_size);
- if ($chunk_size) {
- $this_chunk = fread($socket,$chunk_size);
- $r_body .= $this_chunk;
- $byte = fread($socket,2); // read trailing \r\n
- }
- if($this->max_bodysize && strlen($r_body) > $this->max_bodysize){
- $this->error = 'Allowed response size exceeded';
- if ($this->max_bodysize_abort){
- unset($this->connections[$connectionId]);
- return false;
- } else {
- break;
+ if ($chunk_size > 0) {
+ $r_body .= $this->_readData($socket, $chunk_size, 'chunk');
+ $byte = $this->_readData($socket, 2, 'chunk'); // read trailing \r\n
}
- }
- } while ($chunk_size);
- }else{
- // read entire socket
- while (!feof($socket)) {
- if(time()-$start > $this->timeout){
- $this->status = -100;
- $this->error = sprintf('Timeout while reading response (%.3fs)',$this->_time() - $this->start);
- unset($this->connections[$connectionId]);
- return false;
- }
- $r_body .= fread($socket,4096);
- $r_size = strlen($r_body);
- if($this->max_bodysize && $r_size > $this->max_bodysize){
- $this->error = 'Allowed response size exceeded';
+ } while ($chunk_size && !$abort);
+ }elseif($this->max_bodysize){
+ // read just over the max_bodysize
+ $r_body = $this->_readData($socket, $this->max_bodysize+1, 'response', true);
+ if(strlen($r_body) > $this->max_bodysize){
if ($this->max_bodysize_abort) {
- unset($this->connections[$connectionId]);
- return false;
+ throw new HTTPClientException('Allowed response size exceeded');
} else {
- break;
+ $this->error = 'Allowed response size exceeded';
}
}
- if(isset($this->resp_headers['content-length']) &&
- !isset($this->resp_headers['transfer-encoding']) &&
- $this->resp_headers['content-length'] == $r_size){
- // we read the content-length, finish here
- break;
+ }elseif(isset($this->resp_headers['content-length']) &&
+ !isset($this->resp_headers['transfer-encoding'])){
+ // read up to the content-length
+ $r_body = $this->_readData($socket, $this->resp_headers['content-length'], 'response', true);
+ }else{
+ // read entire socket
+ $r_size = 0;
+ while (!feof($socket)) {
+ $r_body .= $this->_readData($socket, 4096, 'response', true);
}
}
+
+ } catch (HTTPClientException $err) {
+ $this->error = $err->getMessage();
+ if ($err->getCode())
+ $this->status = $err->getCode();
+ unset(self::$connections[$connectionId]);
+ fclose($socket);
+ return false;
}
if (!$this->keep_alive ||
@@ -525,7 +463,7 @@ class HTTPClient {
// close socket
$status = socket_get_status($socket);
fclose($socket);
- unset($this->connections[$connectionId]);
+ unset(self::$connections[$connectionId]);
}
// decode gzip if needed
@@ -547,6 +485,126 @@ class HTTPClient {
}
/**
+ * Safely write data to a socket
+ *
+ * @param handle $socket An open socket handle
+ * @param string $data The data to write
+ * @param string $message Description of what is being read
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ function _sendData($socket, $data, $message) {
+ // select parameters
+ $sel_r = null;
+ $sel_w = array($socket);
+ $sel_e = null;
+
+ // send request
+ $towrite = strlen($data);
+ $written = 0;
+ while($written < $towrite){
+ // check timeout
+ $time_used = $this->_time() - $this->start;
+ if($time_used > $this->timeout)
+ throw new HTTPClientException(sprintf('Timeout while sending %s (%.3fs)',$message, $time_used), -100);
+ if(feof($socket))
+ throw new HTTPClientException("Socket disconnected while writing $message");
+
+ // wait for stream ready or timeout
+ self::selecttimeout($this->timeout - $time_used, $sec, $usec);
+ if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
+ // write to stream
+ $nbytes = fwrite($socket, substr($data,$written,4096));
+ if($nbytes === false)
+ throw new HTTPClientException("Failed writing to socket while sending $message", -100);
+ $written += $nbytes;
+ }
+ }
+ }
+
+ /**
+ * Safely read data from a socket
+ *
+ * Reads up to a given number of bytes or throws an exception if the
+ * response times out or ends prematurely.
+ *
+ * @param handle $socket An open socket handle in non-blocking mode
+ * @param int $nbytes Number of bytes to read
+ * @param string $message Description of what is being read
+ * @param bool $ignore_eof End-of-file is not an error if this is set
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ function _readData($socket, $nbytes, $message, $ignore_eof = false) {
+ // select parameters
+ $sel_r = array($socket);
+ $sel_w = null;
+ $sel_e = null;
+
+ $r_data = '';
+ // Does not return immediately so timeout and eof can be checked
+ if ($nbytes < 0) $nbytes = 0;
+ $to_read = $nbytes;
+ do {
+ $time_used = $this->_time() - $this->start;
+ if ($time_used > $this->timeout)
+ throw new HTTPClientException(
+ sprintf('Timeout while reading %s (%.3fs)', $message, $time_used),
+ -100);
+ if(feof($socket)) {
+ if(!$ignore_eof)
+ throw new HTTPClientException("Premature End of File (socket) while reading $message");
+ break;
+ }
+
+ if ($to_read > 0) {
+ // wait for stream ready or timeout
+ self::selecttimeout($this->timeout - $time_used, $sec, $usec);
+ if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
+ $bytes = fread($socket, $to_read);
+ if($bytes === false)
+ throw new HTTPClientException("Failed reading from socket while reading $message", -100);
+ $r_data .= $bytes;
+ $to_read -= strlen($bytes);
+ }
+ }
+ } while ($to_read > 0 && strlen($r_data) < $nbytes);
+ return $r_data;
+ }
+
+ /**
+ * Safely read a \n-terminated line from a socket
+ *
+ * Always returns a complete line, including the terminating \n.
+ *
+ * @param handle $socket An open socket handle in non-blocking mode
+ * @param string $message Description of what is being read
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ function _readLine($socket, $message) {
+ // select parameters
+ $sel_r = array($socket);
+ $sel_w = null;
+ $sel_e = null;
+
+ $r_data = '';
+ do {
+ $time_used = $this->_time() - $this->start;
+ if ($time_used > $this->timeout)
+ throw new HTTPClientException(
+ sprintf('Timeout while reading %s (%.3fs)', $message, $time_used),
+ -100);
+ if(feof($socket))
+ throw new HTTPClientException("Premature End of File (socket) while reading $message");
+
+ // wait for stream ready or timeout
+ self::selecttimeout($this->timeout - $time_used, $sec, $usec);
+ if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
+ $r_data = fgets($socket, 1024);
+ }
+ } while (!preg_match('/\n$/',$r_data));
+ return $r_data;
+ }
+
+ /**
* print debug info
*
* @author Andreas Gohr <andi@splitbrain.org>
@@ -566,12 +624,20 @@ class HTTPClient {
/**
* Return current timestamp in microsecond resolution
*/
- function _time(){
+ static function _time(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
/**
+ * Calculate seconds and microseconds
+ */
+ static function selecttimeout($time, &$sec, &$usec){
+ $sec = floor($time);
+ $usec = (int)(($time - $sec) * 1000000);
+ }
+
+ /**
* convert given header string to Header array
*
* All Keys are lowercased.
@@ -580,13 +646,14 @@ class HTTPClient {
*/
function _parseHeaders($string){
$headers = array();
- if (!preg_match_all('/^\s*([\w-]+)\s*:\s*([\S \t]+)\s*$/m', $string,
- $matches, PREG_SET_ORDER)) {
- return $headers;
- }
- foreach($matches as $match){
- list(, $key, $val) = $match;
+ $lines = explode("\n",$string);
+ array_shift($lines); //skip first line (status)
+ foreach($lines as $line){
+ @list($key, $val) = explode(':',$line,2);
+ $key = trim($key);
+ $val = trim($val);
$key = strtolower($key);
+ if(!$key) continue;
if(isset($headers[$key])){
if(is_array($headers[$key])){
$headers[$key][] = $val;
diff --git a/inc/IXR_Library.php b/inc/IXR_Library.php
index c8255e6d9..979dc4d16 100644
--- a/inc/IXR_Library.php
+++ b/inc/IXR_Library.php
@@ -302,11 +302,12 @@ class IXR_Server {
}
function serve($data = false) {
if (!$data) {
- global $HTTP_RAW_POST_DATA;
- if (!$HTTP_RAW_POST_DATA) {
+
+ $postData = trim(http_get_raw_post_data());
+ if (!$postData) {
die('XML-RPC server accepts POST requests only.');
}
- $data = $HTTP_RAW_POST_DATA;
+ $data = $postData;
}
$this->message = new IXR_Message($data);
if (!$this->message->parse()) {
@@ -439,7 +440,7 @@ EOD;
$method = $call['methodName'];
$params = $call['params'];
if ($method == 'system.multicall') {
- $result = new IXR_Error(-32600, 'Recursive calls to system.multicall are forbidden');
+ $result = new IXR_Error(-32800, 'Recursive calls to system.multicall are forbidden');
} else {
$result = $this->call($method, $params);
}
@@ -501,7 +502,7 @@ class IXR_Client extends DokuHTTPClient {
var $xmlerror = false;
function IXR_Client($server, $path = false, $port = 80) {
- $this->DokuHTTPClient();
+ parent::__construct();
if (!$path) {
// Assume we have been given a URL instead
$this->posturl = $server;
diff --git a/inc/Input.class.php b/inc/Input.class.php
new file mode 100644
index 000000000..35aecdb45
--- /dev/null
+++ b/inc/Input.class.php
@@ -0,0 +1,263 @@
+<?php
+
+/**
+ * Encapsulates access to the $_REQUEST array, making sure used parameters are initialized and
+ * have the correct type.
+ *
+ * All function access the $_REQUEST array by default, if you want to access $_POST or $_GET
+ * explicitly use the $post and $get members.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class Input {
+
+ /** @var PostInput Access $_POST parameters */
+ public $post;
+ /** @var GetInput Access $_GET parameters */
+ public $get;
+
+ protected $access;
+
+ /**
+ * Intilizes the Input class and it subcomponents
+ */
+ function __construct() {
+ $this->access = &$_REQUEST;
+ $this->post = new PostInput();
+ $this->get = new GetInput();
+ }
+
+ /**
+ * Check if a parameter was set
+ *
+ * Basically a wrapper around isset. When called on the $post and $get subclasses,
+ * the parameter is set to $_POST or $_GET and to $_REQUEST
+ *
+ * @see isset
+ * @param string $name Parameter name
+ * @return bool
+ */
+ public function has($name) {
+ return isset($this->access[$name]);
+ }
+
+ /**
+ * Remove a parameter from the superglobals
+ *
+ * Basically a wrapper around unset. When NOT called on the $post and $get subclasses,
+ * the parameter will also be removed from $_POST or $_GET
+ *
+ * @see isset
+ * @param string $name Parameter name
+ * @return bool
+ */
+ public function remove($name) {
+ if(isset($this->access[$name])) {
+ unset($this->access[$name]);
+ }
+ // also remove from sub classes
+ if(isset($this->post) && isset($_POST[$name])) {
+ unset($_POST[$name]);
+ }
+ if(isset($this->get) && isset($_GET[$name])) {
+ unset($_GET[$name]);
+ }
+ }
+
+ /**
+ * Access a request parameter without any type conversion
+ *
+ * @param string $name Parameter name
+ * @param mixed $default Default to return if parameter isn't set
+ * @param bool $nonempty Return $default if parameter is set but empty()
+ * @return mixed
+ */
+ public function param($name, $default = null, $nonempty = false) {
+ if(!isset($this->access[$name])) return $default;
+ if($nonempty && empty($this->access[$name])) return $default;
+ return $this->access[$name];
+ }
+
+ /**
+ * Sets a parameter
+ *
+ * @param string $name Parameter name
+ * @param mixed $value Value to set
+ */
+ public function set($name, $value) {
+ $this->access[$name] = $value;
+ }
+
+ /**
+ * Get a reference to a request parameter
+ *
+ * This avoids copying data in memory, when the parameter is not set it will be created
+ * and intialized with the given $default value before a reference is returned
+ *
+ * @param string $name Parameter name
+ * @param mixed $default If parameter is not set, initialize with this value
+ * @param bool $nonempty Init with $default if parameter is set but empty()
+ * @return &mixed
+ */
+ public function &ref($name, $default = '', $nonempty = false) {
+ if(!isset($this->access[$name]) || ($nonempty && empty($this->access[$name]))) {
+ $this->set($name, $default);
+ }
+
+ return $this->access[$name];
+ }
+
+ /**
+ * Access a request parameter as int
+ *
+ * @param string $name Parameter name
+ * @param mixed $default Default to return if parameter isn't set or is an array
+ * @param bool $nonempty Return $default if parameter is set but empty()
+ * @return int
+ */
+ public function int($name, $default = 0, $nonempty = false) {
+ if(!isset($this->access[$name])) return $default;
+ if(is_array($this->access[$name])) return $default;
+ if($this->access[$name] === '') return $default;
+ if($nonempty && empty($this->access[$name])) return $default;
+
+ return (int) $this->access[$name];
+ }
+
+ /**
+ * Access a request parameter as string
+ *
+ * @param string $name Parameter name
+ * @param mixed $default Default to return if parameter isn't set or is an array
+ * @param bool $nonempty Return $default if parameter is set but empty()
+ * @return string
+ */
+ public function str($name, $default = '', $nonempty = false) {
+ if(!isset($this->access[$name])) return $default;
+ if(is_array($this->access[$name])) return $default;
+ if($nonempty && empty($this->access[$name])) return $default;
+
+ return (string) $this->access[$name];
+ }
+
+ /**
+ * Access a request parameter as bool
+ *
+ * Note: $nonempty is here for interface consistency and makes not much sense for booleans
+ *
+ * @param string $name Parameter name
+ * @param mixed $default Default to return if parameter isn't set
+ * @param bool $nonempty Return $default if parameter is set but empty()
+ * @return bool
+ */
+ public function bool($name, $default = false, $nonempty = false) {
+ if(!isset($this->access[$name])) return $default;
+ if(is_array($this->access[$name])) return $default;
+ if($this->access[$name] === '') return $default;
+ if($nonempty && empty($this->access[$name])) return $default;
+
+ return (bool) $this->access[$name];
+ }
+
+ /**
+ * Access a request parameter as array
+ *
+ * @param string $name Parameter name
+ * @param mixed $default Default to return if parameter isn't set
+ * @param bool $nonempty Return $default if parameter is set but empty()
+ * @return array
+ */
+ public function arr($name, $default = array(), $nonempty = false) {
+ if(!isset($this->access[$name])) return $default;
+ if(!is_array($this->access[$name])) return $default;
+ if($nonempty && empty($this->access[$name])) return $default;
+
+ return (array) $this->access[$name];
+ }
+
+ /**
+ * Create a simple key from an array key
+ *
+ * This is useful to access keys where the information is given as an array key or as a single array value.
+ * For example when the information was submitted as the name of a submit button.
+ *
+ * This function directly changes the access array.
+ *
+ * Eg. $_REQUEST['do']['save']='Speichern' becomes $_REQUEST['do'] = 'save'
+ *
+ * This function returns the $INPUT object itself for easy chaining
+ *
+ * @param $name
+ * @return Input
+ */
+ public function extract($name){
+ if(!isset($this->access[$name])) return $this;
+ if(!is_array($this->access[$name])) return $this;
+ $keys = array_keys($this->access[$name]);
+ if(!$keys){
+ // this was an empty array
+ $this->remove($name);
+ return $this;
+ }
+ // get the first key
+ $value = array_shift($keys);
+ if($value === 0){
+ // we had a numeric array, assume the value is not in the key
+ $value = array_shift($this->access[$name]);
+ }
+
+ $this->set($name, $value);
+ return $this;
+ }
+}
+
+/**
+ * Internal class used for $_POST access in Input class
+ */
+class PostInput extends Input {
+ protected $access;
+
+ /**
+ * Initialize the $access array, remove subclass members
+ */
+ function __construct() {
+ $this->access = &$_POST;
+ }
+
+ /**
+ * Sets a parameter in $_POST and $_REQUEST
+ *
+ * @param string $name Parameter name
+ * @param mixed $value Value to set
+ */
+ public function set($name, $value) {
+ parent::set($name, $value);
+ $_REQUEST[$name] = $value;
+ }
+}
+
+/**
+ * Internal class used for $_GET access in Input class
+
+ */
+class GetInput extends Input {
+ protected $access;
+
+ /**
+ * Initialize the $access array, remove subclass members
+ */
+ function __construct() {
+ $this->access = &$_GET;
+ }
+
+ /**
+ * Sets a parameter in $_GET and $_REQUEST
+ *
+ * @param string $name Parameter name
+ * @param mixed $value Value to set
+ */
+ public function set($name, $value) {
+ parent::set($name, $value);
+ $_REQUEST[$name] = $value;
+ }
+}
diff --git a/inc/JSON.php b/inc/JSON.php
index 2dea44003..7f89005ff 100644
--- a/inc/JSON.php
+++ b/inc/JSON.php
@@ -47,8 +47,6 @@
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
- * @category
- * @package
* @author Michal Migurski <mike-json@teczno.com>
* @author Matt Knapp <mdknapp[at]gmail[dot]com>
* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
@@ -97,19 +95,6 @@ define('JSON_STRICT_TYPE', 11);
/**
* Converts to and from JSON format.
- *
- * @category
- * @package
- * @author Michal Migurski <mike-json@teczno.com>
- * @author Matt Knapp <mdknapp[at]gmail[dot]com>
- * @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
- * @copyright 2005 Michal Migurski
- * @license http://www.php.net/license/3_0.txt PHP License 3.0
- * @version
- * @link
- * @see
- * @since
- * @deprecated
*/
class JSON {
@@ -151,7 +136,9 @@ class JSON {
* @access public
*/
function encode($var) {
- if (function_exists('json_encode')) return json_encode($var);
+ if (!$this->skipnative && function_exists('json_encode')){
+ return json_encode($var);
+ }
switch (gettype($var)) {
case 'boolean':
return $var ? 'true' : 'false';
@@ -582,17 +569,17 @@ class JSON {
}
- } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) &&
- in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
+ } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != JSON_IN_STR)) {
// found a quote, and we are not inside a string
array_push($stk, array('what' => JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
//print("Found start of string at {$c}\n");
} elseif (($chrs{$c} == $top['delim']) &&
($top['what'] == JSON_IN_STR) &&
- (($chrs{$c - 1} != "\\") ||
- ($chrs{$c - 1} == "\\" && $chrs{$c - 2} == "\\"))) {
+ ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) {
// found a quote, we're in a string, and it's not escaped
+ // we know that it's not escaped becase there is _not_ an
+ // odd number of backslashes at the end of the string so far
array_pop($stk);
//print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
diff --git a/inc/JpegMeta.php b/inc/JpegMeta.php
index 5c043fb6b..ba6a2b5bb 100644
--- a/inc/JpegMeta.php
+++ b/inc/JpegMeta.php
@@ -1209,7 +1209,7 @@ class JpegMeta {
function _parseFileInfo() {
if (file_exists($this->_fileName) && is_file($this->_fileName)) {
$this->_info['file'] = array();
- $this->_info['file']['Name'] = basename($this->_fileName);
+ $this->_info['file']['Name'] = utf8_decodeFN(utf8_basename($this->_fileName));
$this->_info['file']['Path'] = fullpath($this->_fileName);
$this->_info['file']['Size'] = filesize($this->_fileName);
if ($this->_info['file']['Size'] < 1024) {
@@ -1300,7 +1300,7 @@ class JpegMeta {
}
} else {
$this->_info['file'] = array();
- $this->_info['file']['Name'] = basename($this->_fileName);
+ $this->_info['file']['Name'] = utf8_basename($this->_fileName);
$this->_info['file']['Url'] = $this->_fileName;
}
@@ -2972,7 +2972,7 @@ class JpegMeta {
elseif ($c == 62)
$ascii .= '&gt;';
elseif ($c == 32)
- $ascii .= '&nbsp;';
+ $ascii .= '&#160;';
elseif ($c > 32)
$ascii .= chr($c);
else
diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php
new file mode 100644
index 000000000..cbd1eb0a9
--- /dev/null
+++ b/inc/Mailer.class.php
@@ -0,0 +1,658 @@
+<?php
+/**
+ * A class to build and send multi part mails (with HTML content and embedded
+ * attachments). All mails are assumed to be in UTF-8 encoding.
+ *
+ * Attachments are handled in memory so this shouldn't be used to send huge
+ * files, but then again mail shouldn't be used to send huge files either.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+// end of line for mail lines - RFC822 says CRLF but postfix (and other MTAs?)
+// think different
+if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL', "\n");
+#define('MAILHEADER_ASCIIONLY',1);
+
+/**
+ * Mail Handling
+ */
+class Mailer {
+
+ protected $headers = array();
+ protected $attach = array();
+ protected $html = '';
+ protected $text = '';
+
+ protected $boundary = '';
+ protected $partid = '';
+ protected $sendparam = null;
+
+ /** @var EmailAddressValidator */
+ protected $validator = null;
+ protected $allowhtml = true;
+
+ /**
+ * Constructor
+ *
+ * Initializes the boundary strings and part counters
+ */
+ public function __construct() {
+ global $conf;
+
+ $server = parse_url(DOKU_URL, PHP_URL_HOST);
+
+ $this->partid = md5(uniqid(rand(), true)).'@'.$server;
+ $this->boundary = '----------'.md5(uniqid(rand(), true));
+
+ $listid = join('.', array_reverse(explode('/', DOKU_BASE))).$server;
+ $listid = strtolower(trim($listid, '.'));
+
+ $this->allowhtml = (bool)$conf['htmlmail'];
+
+ // add some default headers for mailfiltering FS#2247
+ $this->setHeader('X-Mailer', 'DokuWiki '.getVersion());
+ $this->setHeader('X-DokuWiki-User', $_SERVER['REMOTE_USER']);
+ $this->setHeader('X-DokuWiki-Title', $conf['title']);
+ $this->setHeader('X-DokuWiki-Server', $server);
+ $this->setHeader('X-Auto-Response-Suppress', 'OOF');
+ $this->setHeader('List-Id', $conf['title'].' <'.$listid.'>');
+ }
+
+ /**
+ * Attach a file
+ *
+ * @param string $path Path to the file to attach
+ * @param string $mime Mimetype of the attached file
+ * @param string $name The filename to use
+ * @param string $embed Unique key to reference this file from the HTML part
+ */
+ public function attachFile($path, $mime, $name = '', $embed = '') {
+ if(!$name) {
+ $name = utf8_basename($path);
+ }
+
+ $this->attach[] = array(
+ 'data' => file_get_contents($path),
+ 'mime' => $mime,
+ 'name' => $name,
+ 'embed' => $embed
+ );
+ }
+
+ /**
+ * Attach a file
+ *
+ * @param string $data The file contents to attach
+ * @param string $mime Mimetype of the attached file
+ * @param string $name The filename to use
+ * @param string $embed Unique key to reference this file from the HTML part
+ */
+ public function attachContent($data, $mime, $name = '', $embed = '') {
+ if(!$name) {
+ list(, $ext) = explode('/', $mime);
+ $name = count($this->attach).".$ext";
+ }
+
+ $this->attach[] = array(
+ 'data' => $data,
+ 'mime' => $mime,
+ 'name' => $name,
+ 'embed' => $embed
+ );
+ }
+
+ /**
+ * Callback function to automatically embed images referenced in HTML templates
+ */
+ protected function autoembed_cb($matches) {
+ static $embeds = 0;
+ $embeds++;
+
+ // get file and mime type
+ $media = cleanID($matches[1]);
+ list(, $mime) = mimetype($media);
+ $file = mediaFN($media);
+ if(!file_exists($file)) return $matches[0]; //bad reference, keep as is
+
+ // attach it and set placeholder
+ $this->attachFile($file, $mime, '', 'autoembed'.$embeds);
+ return '%%autoembed'.$embeds.'%%';
+ }
+
+ /**
+ * Add an arbitrary header to the mail
+ *
+ * If an empy value is passed, the header is removed
+ *
+ * @param string $header the header name (no trailing colon!)
+ * @param string $value the value of the header
+ * @param bool $clean remove all non-ASCII chars and line feeds?
+ */
+ public function setHeader($header, $value, $clean = true) {
+ $header = str_replace(' ', '-', ucwords(strtolower(str_replace('-', ' ', $header)))); // streamline casing
+ if($clean) {
+ $header = preg_replace('/[^a-zA-Z0-9_ \-\.\+\@]+/', '', $header);
+ $value = preg_replace('/[^a-zA-Z0-9_ \-\.\+\@<>]+/', '', $value);
+ }
+
+ // empty value deletes
+ $value = trim($value);
+ if($value === '') {
+ if(isset($this->headers[$header])) unset($this->headers[$header]);
+ } else {
+ $this->headers[$header] = $value;
+ }
+ }
+
+ /**
+ * Set additional parameters to be passed to sendmail
+ *
+ * Whatever is set here is directly passed to PHP's mail() command as last
+ * parameter. Depending on the PHP setup this might break mailing alltogether
+ */
+ public function setParameters($param) {
+ $this->sendparam = $param;
+ }
+
+ /**
+ * Set the text and HTML body and apply replacements
+ *
+ * This function applies a whole bunch of default replacements in addition
+ * to the ones specidifed as parameters
+ *
+ * If you pass the HTML part or HTML replacements yourself you have to make
+ * sure you encode all HTML special chars correctly
+ *
+ * @param string $text plain text body
+ * @param array $textrep replacements to apply on the text part
+ * @param array $htmlrep replacements to apply on the HTML part, leave null to use $textrep
+ * @param array $html the HTML body, leave null to create it from $text
+ * @param bool $wrap wrap the HTML in the default header/Footer
+ */
+ public function setBody($text, $textrep = null, $htmlrep = null, $html = null, $wrap = true) {
+ global $INFO;
+ global $conf;
+ $htmlrep = (array)$htmlrep;
+ $textrep = (array)$textrep;
+
+ // create HTML from text if not given
+ if(is_null($html)) {
+ $html = $text;
+ $html = hsc($html);
+ $html = preg_replace('/^-----*$/m', '<hr >', $html);
+ $html = nl2br($html);
+ }
+ if($wrap) {
+ $wrap = rawLocale('mailwrap', 'html');
+ $html = preg_replace('/\n-- <br \/>.*$/s', '', $html); //strip signature
+ $html = str_replace('@HTMLBODY@', $html, $wrap);
+ }
+
+ // copy over all replacements missing for HTML (autolink URLs)
+ foreach($textrep as $key => $value) {
+ if(isset($htmlrep[$key])) continue;
+ if(preg_match('/^https?:\/\//i', $value)) {
+ $htmlrep[$key] = '<a href="'.hsc($value).'">'.hsc($value).'</a>';
+ } else {
+ $htmlrep[$key] = hsc($value);
+ }
+ }
+
+ // embed media from templates
+ $html = preg_replace_callback(
+ '/@MEDIA\(([^\)]+)\)@/',
+ array($this, 'autoembed_cb'), $html
+ );
+
+ // prepare default replacements
+ $ip = clientIP();
+ $cip = gethostsbyaddrs($ip);
+ $trep = array(
+ 'DATE' => dformat(),
+ 'BROWSER' => $_SERVER['HTTP_USER_AGENT'],
+ 'IPADDRESS' => $ip,
+ 'HOSTNAME' => $cip,
+ 'TITLE' => $conf['title'],
+ 'DOKUWIKIURL' => DOKU_URL,
+ 'USER' => $_SERVER['REMOTE_USER'],
+ 'NAME' => $INFO['userinfo']['name'],
+ 'MAIL' => $INFO['userinfo']['mail'],
+ );
+ $trep = array_merge($trep, (array)$textrep);
+ $hrep = array(
+ 'DATE' => '<i>'.hsc(dformat()).'</i>',
+ 'BROWSER' => hsc($_SERVER['HTTP_USER_AGENT']),
+ 'IPADDRESS' => '<code>'.hsc($ip).'</code>',
+ 'HOSTNAME' => '<code>'.hsc($cip).'</code>',
+ 'TITLE' => hsc($conf['title']),
+ 'DOKUWIKIURL' => '<a href="'.DOKU_URL.'">'.DOKU_URL.'</a>',
+ 'USER' => hsc($_SERVER['REMOTE_USER']),
+ 'NAME' => hsc($INFO['userinfo']['name']),
+ 'MAIL' => '<a href="mailto:"'.hsc($INFO['userinfo']['mail']).'">'.
+ hsc($INFO['userinfo']['mail']).'</a>',
+ );
+ $hrep = array_merge($hrep, (array)$htmlrep);
+
+ // Apply replacements
+ foreach($trep as $key => $substitution) {
+ $text = str_replace('@'.strtoupper($key).'@', $substitution, $text);
+ }
+ foreach($hrep as $key => $substitution) {
+ $html = str_replace('@'.strtoupper($key).'@', $substitution, $html);
+ }
+
+ $this->setHTML($html);
+ $this->setText($text);
+ }
+
+ /**
+ * Set the HTML part of the mail
+ *
+ * Placeholders can be used to reference embedded attachments
+ *
+ * You probably want to use setBody() instead
+ */
+ public function setHTML($html) {
+ $this->html = $html;
+ }
+
+ /**
+ * Set the plain text part of the mail
+ *
+ * You probably want to use setBody() instead
+ */
+ public function setText($text) {
+ $this->text = $text;
+ }
+
+ /**
+ * Add the To: recipients
+ *
+ * @see setAddress
+ * @param string $address Multiple adresses separated by commas
+ */
+ public function to($address) {
+ $this->setHeader('To', $address, false);
+ }
+
+ /**
+ * Add the Cc: recipients
+ *
+ * @see setAddress
+ * @param string $address Multiple adresses separated by commas
+ */
+ public function cc($address) {
+ $this->setHeader('Cc', $address, false);
+ }
+
+ /**
+ * Add the Bcc: recipients
+ *
+ * @see setAddress
+ * @param string $address Multiple adresses separated by commas
+ */
+ public function bcc($address) {
+ $this->setHeader('Bcc', $address, false);
+ }
+
+ /**
+ * Add the From: address
+ *
+ * This is set to $conf['mailfrom'] when not specified so you shouldn't need
+ * to call this function
+ *
+ * @see setAddress
+ * @param string $address from address
+ */
+ public function from($address) {
+ $this->setHeader('From', $address, false);
+ }
+
+ /**
+ * Add the mail's Subject: header
+ *
+ * @param string $subject the mail subject
+ */
+ public function subject($subject) {
+ $this->headers['Subject'] = $subject;
+ }
+
+ /**
+ * Sets an email address header with correct encoding
+ *
+ * Unicode characters will be deaccented and encoded base64
+ * for headers. Addresses may not contain Non-ASCII data!
+ *
+ * Example:
+ * setAddress("föö <foo@bar.com>, me@somewhere.com","TBcc");
+ *
+ * @param string $address Multiple adresses separated by commas
+ * @return bool|string the prepared header (can contain multiple lines)
+ */
+ public function cleanAddress($address) {
+ // No named recipients for To: in Windows (see FS#652)
+ $names = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? false : true;
+
+ $address = preg_replace('/[\r\n\0]+/', ' ', $address); // remove attack vectors
+
+ $headers = '';
+ $parts = explode(',', $address);
+ foreach($parts as $part) {
+ $part = trim($part);
+
+ // parse address
+ if(preg_match('#(.*?)<(.*?)>#', $part, $matches)) {
+ $text = trim($matches[1]);
+ $addr = $matches[2];
+ } else {
+ $addr = $part;
+ }
+ // skip empty ones
+ if(empty($addr)) {
+ continue;
+ }
+
+ // FIXME: is there a way to encode the localpart of a emailaddress?
+ if(!utf8_isASCII($addr)) {
+ msg(htmlspecialchars("E-Mail address <$addr> is not ASCII"), -1);
+ continue;
+ }
+
+ if(is_null($this->validator)) {
+ $this->validator = new EmailAddressValidator();
+ $this->validator->allowLocalAddresses = true;
+ }
+ if(!$this->validator->check_email_address($addr)) {
+ msg(htmlspecialchars("E-Mail address <$addr> is not valid"), -1);
+ continue;
+ }
+
+ // text was given
+ if(!empty($text) && $names) {
+ // add address quotes
+ $addr = "<$addr>";
+
+ if(defined('MAILHEADER_ASCIIONLY')) {
+ $text = utf8_deaccent($text);
+ $text = utf8_strip($text);
+ }
+
+ if(!utf8_isASCII($text)) {
+ $text = '=?UTF-8?B?'.base64_encode($text).'?=';
+ }
+ } else {
+ $text = '';
+ }
+
+ // add to header comma seperated
+ if($headers != '') {
+ $headers .= ', ';
+ }
+ $headers .= $text.' '.$addr;
+ }
+
+ if(empty($headers)) return false;
+
+ return $headers;
+ }
+
+
+ /**
+ * Prepare the mime multiparts for all attachments
+ *
+ * Replaces placeholders in the HTML with the correct CIDs
+ */
+ protected function prepareAttachments() {
+ $mime = '';
+ $part = 1;
+ // embedded attachments
+ foreach($this->attach as $media) {
+ // create content id
+ $cid = 'part'.$part.'.'.$this->partid;
+
+ // replace wildcards
+ if($media['embed']) {
+ $this->html = str_replace('%%'.$media['embed'].'%%', 'cid:'.$cid, $this->html);
+ }
+
+ $mime .= '--'.$this->boundary.MAILHEADER_EOL;
+ $mime .= 'Content-Type: '.$media['mime'].';'.MAILHEADER_EOL;
+ $mime .= 'Content-Transfer-Encoding: base64'.MAILHEADER_EOL;
+ $mime .= "Content-ID: <$cid>".MAILHEADER_EOL;
+ if($media['embed']) {
+ $mime .= 'Content-Disposition: inline; filename="'.$media['name'].'"'.MAILHEADER_EOL;
+ } else {
+ $mime .= 'Content-Disposition: attachment; filename="'.$media['name'].'"'.MAILHEADER_EOL;
+ }
+ $mime .= MAILHEADER_EOL; //end of headers
+ $mime .= chunk_split(base64_encode($media['data']), 74, MAILHEADER_EOL);
+
+ $part++;
+ }
+ return $mime;
+ }
+
+ /**
+ * Build the body and handles multi part mails
+ *
+ * Needs to be called before prepareHeaders!
+ *
+ * @return string the prepared mail body, false on errors
+ */
+ protected function prepareBody() {
+
+ // no HTML mails allowed? remove HTML body
+ if(!$this->allowhtml) {
+ $this->html = '';
+ }
+
+ // check for body
+ if(!$this->text && !$this->html) {
+ return false;
+ }
+
+ // add general headers
+ $this->headers['MIME-Version'] = '1.0';
+
+ $body = '';
+
+ if(!$this->html && !count($this->attach)) { // we can send a simple single part message
+ $this->headers['Content-Type'] = 'text/plain; charset=UTF-8';
+ $this->headers['Content-Transfer-Encoding'] = 'base64';
+ $body .= chunk_split(base64_encode($this->text), 74, MAILHEADER_EOL);
+ } else { // multi part it is
+ $body .= "This is a multi-part message in MIME format.".MAILHEADER_EOL;
+
+ // prepare the attachments
+ $attachments = $this->prepareAttachments();
+
+ // do we have alternative text content?
+ if($this->text && $this->html) {
+ $this->headers['Content-Type'] = 'multipart/alternative;'.MAILHEADER_EOL.
+ ' boundary="'.$this->boundary.'XX"';
+ $body .= '--'.$this->boundary.'XX'.MAILHEADER_EOL;
+ $body .= 'Content-Type: text/plain; charset=UTF-8'.MAILHEADER_EOL;
+ $body .= 'Content-Transfer-Encoding: base64'.MAILHEADER_EOL;
+ $body .= MAILHEADER_EOL;
+ $body .= chunk_split(base64_encode($this->text), 74, MAILHEADER_EOL);
+ $body .= '--'.$this->boundary.'XX'.MAILHEADER_EOL;
+ $body .= 'Content-Type: multipart/related;'.MAILHEADER_EOL.
+ ' boundary="'.$this->boundary.'"'.MAILHEADER_EOL;
+ $body .= MAILHEADER_EOL;
+ }
+
+ $body .= '--'.$this->boundary.MAILHEADER_EOL;
+ $body .= 'Content-Type: text/html; charset=UTF-8'.MAILHEADER_EOL;
+ $body .= 'Content-Transfer-Encoding: base64'.MAILHEADER_EOL;
+ $body .= MAILHEADER_EOL;
+ $body .= chunk_split(base64_encode($this->html), 74, MAILHEADER_EOL);
+ $body .= MAILHEADER_EOL;
+ $body .= $attachments;
+ $body .= '--'.$this->boundary.'--'.MAILHEADER_EOL;
+
+ // close open multipart/alternative boundary
+ if($this->text && $this->html) {
+ $body .= '--'.$this->boundary.'XX--'.MAILHEADER_EOL;
+ }
+ }
+
+ return $body;
+ }
+
+ /**
+ * Cleanup and encode the headers array
+ */
+ protected function cleanHeaders() {
+ global $conf;
+
+ // clean up addresses
+ if(empty($this->headers['From'])) $this->from($conf['mailfrom']);
+ $addrs = array('To', 'From', 'Cc', 'Bcc');
+ foreach($addrs as $addr) {
+ if(isset($this->headers[$addr])) {
+ $this->headers[$addr] = $this->cleanAddress($this->headers[$addr]);
+ }
+ }
+
+ if(isset($this->headers['Subject'])) {
+ // add prefix to subject
+ if(empty($conf['mailprefix'])) {
+ if(utf8_strlen($conf['title']) < 20) {
+ $prefix = '['.$conf['title'].']';
+ } else {
+ $prefix = '['.utf8_substr($conf['title'], 0, 20).'...]';
+ }
+ } else {
+ $prefix = '['.$conf['mailprefix'].']';
+ }
+ $len = strlen($prefix);
+ if(substr($this->headers['Subject'], 0, $len) != $prefix) {
+ $this->headers['Subject'] = $prefix.' '.$this->headers['Subject'];
+ }
+
+ // encode subject
+ if(defined('MAILHEADER_ASCIIONLY')) {
+ $this->headers['Subject'] = utf8_deaccent($this->headers['Subject']);
+ $this->headers['Subject'] = utf8_strip($this->headers['Subject']);
+ }
+ if(!utf8_isASCII($this->headers['Subject'])) {
+ $this->headers['Subject'] = '=?UTF-8?B?'.base64_encode($this->headers['Subject']).'?=';
+ }
+ }
+
+ // wrap headers
+ foreach($this->headers as $key => $val) {
+ $this->headers[$key] = wordwrap($val, 78, MAILHEADER_EOL.' ');
+ }
+ }
+
+ /**
+ * Create a string from the headers array
+ *
+ * @returns string the headers
+ */
+ protected function prepareHeaders() {
+ $headers = '';
+ foreach($this->headers as $key => $val) {
+ $headers .= "$key: $val".MAILHEADER_EOL;
+ }
+ return $headers;
+ }
+
+ /**
+ * return a full email with all headers
+ *
+ * This is mainly intended for debugging and testing but could also be
+ * used for MHT exports
+ *
+ * @return string the mail, false on errors
+ */
+ public function dump() {
+ $this->cleanHeaders();
+ $body = $this->prepareBody();
+ if($body === false) return false;
+ $headers = $this->prepareHeaders();
+
+ return $headers.MAILHEADER_EOL.$body;
+ }
+
+ /**
+ * Send the mail
+ *
+ * Call this after all data was set
+ *
+ * @triggers MAIL_MESSAGE_SEND
+ * @return bool true if the mail was successfully passed to the MTA
+ */
+ public function send() {
+ $success = false;
+
+ // prepare hook data
+ $data = array(
+ // pass the whole mail class to plugin
+ 'mail' => $this,
+ // pass references for backward compatibility
+ 'to' => &$this->headers['To'],
+ 'cc' => &$this->headers['Cc'],
+ 'bcc' => &$this->headers['Bcc'],
+ 'from' => &$this->headers['From'],
+ 'subject' => &$this->headers['Subject'],
+ 'body' => &$this->text,
+ 'params' => &$this->sendparam,
+ 'headers' => '', // plugins shouldn't use this
+ // signal if we mailed successfully to AFTER event
+ 'success' => &$success,
+ );
+
+ // do our thing if BEFORE hook approves
+ $evt = new Doku_Event('MAIL_MESSAGE_SEND', $data);
+ if($evt->advise_before(true)) {
+ // clean up before using the headers
+ $this->cleanHeaders();
+
+ // any recipients?
+ if(trim($this->headers['To']) === '' &&
+ trim($this->headers['Cc']) === '' &&
+ trim($this->headers['Bcc']) === ''
+ ) return false;
+
+ // The To: header is special
+ if(isset($this->headers['To'])) {
+ $to = $this->headers['To'];
+ unset($this->headers['To']);
+ } else {
+ $to = '';
+ }
+
+ // so is the subject
+ if(isset($this->headers['Subject'])) {
+ $subject = $this->headers['Subject'];
+ unset($this->headers['Subject']);
+ } else {
+ $subject = '';
+ }
+
+ // make the body
+ $body = $this->prepareBody();
+ if($body === false) return false;
+
+ // cook the headers
+ $headers = $this->prepareHeaders();
+ // add any headers set by legacy plugins
+ if(trim($data['headers'])) {
+ $headers .= MAILHEADER_EOL.trim($data['headers']);
+ }
+
+ // send the thing
+ if(is_null($this->sendparam)) {
+ $success = @mail($to, $subject, $body, $headers);
+ } else {
+ $success = @mail($to, $subject, $body, $headers, $this->sendparam);
+ }
+ }
+ // any AFTER actions?
+ $evt->advise_after();
+ return $success;
+ }
+}
diff --git a/inc/PassHash.class.php b/inc/PassHash.class.php
index 31493c022..13be479cc 100644
--- a/inc/PassHash.class.php
+++ b/inc/PassHash.class.php
@@ -16,59 +16,67 @@ class PassHash {
* match true is is returned else false
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param $clear string Clear-Text password
+ * @param $hash string Hash to compare against
* @return bool
*/
- function verify_hash($clear,$hash){
- $method='';
- $salt='';
- $magic='';
+ function verify_hash($clear, $hash) {
+ $method = '';
+ $salt = '';
+ $magic = '';
//determine the used method and salt
$len = strlen($hash);
- if(preg_match('/^\$1\$([^\$]{0,8})\$/',$hash,$m)){
+ if(preg_match('/^\$1\$([^\$]{0,8})\$/', $hash, $m)) {
$method = 'smd5';
$salt = $m[1];
$magic = '1';
- }elseif(preg_match('/^\$apr1\$([^\$]{0,8})\$/',$hash,$m)){
+ } elseif(preg_match('/^\$apr1\$([^\$]{0,8})\$/', $hash, $m)) {
$method = 'apr1';
$salt = $m[1];
$magic = 'apr1';
- }elseif(preg_match('/^\$P\$(.{31})$/',$hash,$m)){
+ } elseif(preg_match('/^\$P\$(.{31})$/', $hash, $m)) {
$method = 'pmd5';
$salt = $m[1];
$magic = 'P';
- }elseif(preg_match('/^\$H\$(.{31})$/',$hash,$m)){
+ } elseif(preg_match('/^\$H\$(.{31})$/', $hash, $m)) {
$method = 'pmd5';
$salt = $m[1];
$magic = 'H';
- }elseif(preg_match('/^sha1\$(.{5})\$/',$hash,$m)){
+ } elseif(preg_match('/^sha1\$(.{5})\$/', $hash, $m)) {
$method = 'djangosha1';
$salt = $m[1];
- }elseif(preg_match('/^md5\$(.{5})\$/',$hash,$m)){
+ } elseif(preg_match('/^md5\$(.{5})\$/', $hash, $m)) {
$method = 'djangomd5';
$salt = $m[1];
- }elseif(substr($hash,0,6) == '{SSHA}'){
+ } elseif(preg_match('/^\$2a\$(.{2})\$/', $hash, $m)) {
+ $method = 'bcrypt';
+ $salt = $hash;
+ } elseif(substr($hash, 0, 6) == '{SSHA}') {
$method = 'ssha';
- $salt = substr(base64_decode(substr($hash, 6)),20);
- }elseif($len == 32){
+ $salt = substr(base64_decode(substr($hash, 6)), 20);
+ } elseif(substr($hash, 0, 6) == '{SMD5}') {
+ $method = 'lsmd5';
+ $salt = substr(base64_decode(substr($hash, 6)), 16);
+ } elseif($len == 32) {
$method = 'md5';
- }elseif($len == 40){
+ } elseif($len == 40) {
$method = 'sha1';
- }elseif($len == 16){
+ } elseif($len == 16) {
$method = 'mysql';
- }elseif($len == 41 && $hash[0] == '*'){
+ } elseif($len == 41 && $hash[0] == '*') {
$method = 'my411';
- }elseif($len == 34){
+ } elseif($len == 34) {
$method = 'kmd5';
$salt = $hash;
- }else{
+ } else {
$method = 'crypt';
- $salt = substr($hash,0,2);
+ $salt = substr($hash, 0, 2);
}
//crypt and compare
$call = 'hash_'.$method;
- if($this->$call($clear,$salt,$magic) === $hash){
+ if($this->$call($clear, $salt, $magic) === $hash) {
return true;
}
return false;
@@ -77,12 +85,15 @@ class PassHash {
/**
* Create a random salt
*
- * @param int $len - The length of the salt
+ * @param int $len The length of the salt
+ * @return string
*/
- public function gen_salt($len=32){
+ public function gen_salt($len = 32) {
$salt = '';
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
- for($i=0;$i<$len;$i++) $salt .= $chars[mt_rand(0,61)];
+ for($i = 0; $i < $len; $i++) {
+ $salt .= $chars[mt_rand(0, 61)];
+ }
return $salt;
}
@@ -92,12 +103,12 @@ class PassHash {
* If $salt is not null, the value is kept, but the lenght restriction is
* applied.
*
- * @param stringref $salt - The salt, pass null if you want one generated
- * @param int $len - The length of the salt
+ * @param string &$salt The salt, pass null if you want one generated
+ * @param int $len The length of the salt
*/
- public function init_salt(&$salt,$len=32){
+ public function init_salt(&$salt, $len = 32) {
if(is_null($salt)) $salt = $this->gen_salt($len);
- if(strlen($salt) > $len) $salt = substr($salt,0,$len);
+ if(strlen($salt) > $len) $salt = substr($salt, 0, $len);
}
// Password hashing methods follow below
@@ -114,23 +125,38 @@ class PassHash {
* @author Andreas Gohr <andi@splitbrain.org>
* @author <mikey_nich at hotmail dot com>
* @link http://de.php.net/manual/en/function.crypt.php#73619
- * @param string $clear - the clear text to hash
- * @param string $salt - the salt to use, null for random
- * @param string $magic - the hash identifier (apr1 or 1)
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @return string Hashed password
*/
- public function hash_smd5($clear, $salt=null){
- $this->init_salt($salt,8);
+ public function hash_smd5($clear, $salt = null) {
+ $this->init_salt($salt, 8);
- if(defined('CRYPT_MD5') && CRYPT_MD5){
- return crypt($clear,'$1$'.$salt.'$');
- }else{
+ if(defined('CRYPT_MD5') && CRYPT_MD5 && $salt !== '') {
+ return crypt($clear, '$1$'.$salt.'$');
+ } else {
// Fall back to PHP-only implementation
return $this->hash_apr1($clear, $salt, '1');
}
}
/**
+ * Password hashing method 'lsmd5'
+ *
+ * Uses salted MD5 hashs. Salt is 8 bytes long.
+ *
+ * This is the format used by LDAP.
+ *
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @return string Hashed password
+ */
+ public function hash_lsmd5($clear, $salt = null) {
+ $this->init_salt($salt, 8);
+ return "{SMD5}".base64_encode(md5($clear.$salt, true).$salt);
+ }
+
+ /**
* Password hashing method 'apr1'
*
* Uses salted MD5 hashs. Salt is 8 bytes long.
@@ -139,17 +165,17 @@ class PassHash {
*
* @author <mikey_nich at hotmail dot com>
* @link http://de.php.net/manual/en/function.crypt.php#73619
- * @param string $clear - the clear text to hash
- * @param string $salt - the salt to use, null for random
- * @param string $magic - the hash identifier (apr1 or 1)
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @param string $magic The hash identifier (apr1 or 1)
+ * @return string Hashed password
*/
- public function hash_apr1($clear, $salt=null, $magic='apr1'){
- $this->init_salt($salt,8);
+ public function hash_apr1($clear, $salt = null, $magic = 'apr1') {
+ $this->init_salt($salt, 8);
- $len = strlen($clear);
+ $len = strlen($clear);
$text = $clear.'$'.$magic.'$'.$salt;
- $bin = pack("H32", md5($clear.$salt.$clear));
+ $bin = pack("H32", md5($clear.$salt.$clear));
for($i = $len; $i > 0; $i -= 16) {
$text .= substr($bin, 0, min(16, $i));
}
@@ -159,22 +185,24 @@ class PassHash {
$bin = pack("H32", md5($text));
for($i = 0; $i < 1000; $i++) {
$new = ($i & 1) ? $clear : $bin;
- if ($i % 3) $new .= $salt;
- if ($i % 7) $new .= $clear;
+ if($i % 3) $new .= $salt;
+ if($i % 7) $new .= $clear;
$new .= ($i & 1) ? $bin : $clear;
$bin = pack("H32", md5($new));
}
$tmp = '';
- for ($i = 0; $i < 5; $i++) {
+ for($i = 0; $i < 5; $i++) {
$k = $i + 6;
$j = $i + 12;
- if ($j == 16) $j = 5;
+ if($j == 16) $j = 5;
$tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
}
$tmp = chr(0).chr(0).$bin[11].$tmp;
- $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
- "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
+ $tmp = strtr(
+ strrev(substr(base64_encode($tmp), 2)),
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ );
return '$'.$magic.'$'.$salt.'$'.$tmp;
}
@@ -183,10 +211,10 @@ class PassHash {
*
* Uses MD5 hashs.
*
- * @param string $clear - the clear text to hash
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @return string Hashed password
*/
- public function hash_md5($clear){
+ public function hash_md5($clear) {
return md5($clear);
}
@@ -195,10 +223,10 @@ class PassHash {
*
* Uses SHA1 hashs.
*
- * @param string $clear - the clear text to hash
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @return string Hashed password
*/
- public function hash_sha1($clear){
+ public function hash_sha1($clear) {
return sha1($clear);
}
@@ -207,12 +235,12 @@ class PassHash {
*
* Uses salted SHA1 hashs. Salt is 4 bytes long.
*
- * @param string $clear - the clear text to hash
- * @param string $salt - the salt to use, null for random
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @return string Hashed password
*/
- public function hash_ssha($clear, $salt=null){
- $this->init_salt($salt,4);
+ public function hash_ssha($clear, $salt = null) {
+ $this->init_salt($salt, 4);
return '{SSHA}'.base64_encode(pack("H*", sha1($clear.$salt)).$salt);
}
@@ -221,13 +249,13 @@ class PassHash {
*
* Uses salted crypt hashs. Salt is 2 bytes long.
*
- * @param string $clear - the clear text to hash
- * @param string $salt - the salt to use, null for random
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @return string Hashed password
*/
- public function hash_crypt($clear, $salt=null){
- $this->init_salt($salt,2);
- return crypt($clear,$salt);
+ public function hash_crypt($clear, $salt = null) {
+ $this->init_salt($salt, 2);
+ return crypt($clear, $salt);
}
/**
@@ -237,16 +265,16 @@ class PassHash {
*
* @link http://www.php.net/mysql
* @author <soren at byu dot edu>
- * @param string $clear - the clear text to hash
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @return string Hashed password
*/
- public function hash_mysql($clear){
- $nr=0x50305735;
- $nr2=0x12345671;
- $add=7;
+ public function hash_mysql($clear) {
+ $nr = 0x50305735;
+ $nr2 = 0x12345671;
+ $add = 7;
$charArr = preg_split("//", $clear);
- foreach ($charArr as $char) {
- if (($char == '') || ($char == ' ') || ($char == '\t')) continue;
+ foreach($charArr as $char) {
+ if(($char == '') || ($char == ' ') || ($char == '\t')) continue;
$charVal = ord($char);
$nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8);
$nr2 += ($nr2 << 8) ^ $nr;
@@ -260,10 +288,10 @@ class PassHash {
*
* Uses SHA1 hashs. This method is used by MySQL 4.11 and above
*
- * @param string $clear - the clear text to hash
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @return string Hashed password
*/
- public function hash_my411($clear){
+ public function hash_my411($clear) {
return '*'.sha1(pack("H*", sha1($clear)));
}
@@ -275,16 +303,16 @@ class PassHash {
* Salt is 2 bytes long, but stored at position 16, so you need to pass at
* least 18 bytes. You can pass the crypted hash as salt.
*
- * @param string $clear - the clear text to hash
- * @param string $salt - the salt to use, null for random
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @return string Hashed password
*/
- public function hash_kmd5($clear, $salt=null){
+ public function hash_kmd5($clear, $salt = null) {
$this->init_salt($salt);
- $key = substr($salt, 16, 2);
- $hash1 = strtolower(md5($key . md5($clear)));
- $hash2 = substr($hash1, 0, 16) . $key . substr($hash1, 16);
+ $key = substr($salt, 16, 2);
+ $hash1 = strtolower(md5($key.md5($clear)));
+ $hash2 = substr($hash1, 0, 16).$key.substr($hash1, 16);
return $hash2;
}
@@ -294,48 +322,60 @@ class PassHash {
* Uses salted MD5 hashs. Salt is 1+8 bytes long, 1st byte is the
* iteration count when given, for null salts $compute is used.
*
- * @param string $clear - the clear text to hash
- * @param string $salt - the salt to use, null for random
- * @param string $magic - the hash identifier (P or H)
- * @param int $compute - the iteration count for new passwords
- * @returns string - hashed password
+ * The actual iteration count is the given count squared, maximum is
+ * 30 (-> 1073741824). If a higher one is given, the function throws
+ * an exception.
+ *
+ * @link http://www.openwall.com/phpass/
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @param string $magic The hash identifier (P or H)
+ * @param int $compute The iteration count for new passwords
+ * @throws Exception
+ * @return string Hashed password
*/
- public function hash_pmd5($clear, $salt=null, $magic='P',$compute=8){
+ public function hash_pmd5($clear, $salt = null, $magic = 'P', $compute = 8) {
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
- if(is_null($salt)){
+ if(is_null($salt)) {
$this->init_salt($salt);
$salt = $itoa64[$compute].$salt; // prefix iteration count
}
$iterc = $salt[0]; // pos 0 of salt is iteration count
- $iter = strpos($itoa64,$iterc);
+ $iter = strpos($itoa64, $iterc);
+
+ if($iter > 30) {
+ throw new Exception("Too high iteration count ($iter) in ".
+ __CLASS__.'::'.__FUNCTION__);
+ }
+
$iter = 1 << $iter;
- $salt = substr($salt,1,8);
+ $salt = substr($salt, 1, 8);
// iterate
- $hash = md5($salt . $clear, true);
+ $hash = md5($salt.$clear, true);
do {
- $hash = md5($hash . $clear, true);
- } while (--$iter);
+ $hash = md5($hash.$clear, true);
+ } while(--$iter);
// encode
$output = '';
- $count = 16;
- $i = 0;
+ $count = 16;
+ $i = 0;
do {
$value = ord($hash[$i++]);
$output .= $itoa64[$value & 0x3f];
- if ($i < $count)
+ if($i < $count)
$value |= ord($hash[$i]) << 8;
$output .= $itoa64[($value >> 6) & 0x3f];
- if ($i++ >= $count)
+ if($i++ >= $count)
break;
- if ($i < $count)
+ if($i < $count)
$value |= ord($hash[$i]) << 16;
$output .= $itoa64[($value >> 12) & 0x3f];
- if ($i++ >= $count)
+ if($i++ >= $count)
break;
$output .= $itoa64[($value >> 18) & 0x3f];
- } while ($i < $count);
+ } while($i < $count);
return '$'.$magic.'$'.$iterc.$salt.$output;
}
@@ -343,7 +383,7 @@ class PassHash {
/**
* Alias for hash_pmd5
*/
- public function hash_hmd5($clear, $salt=null, $magic='H', $compute=8){
+ public function hash_hmd5($clear, $salt = null, $magic = 'H', $compute = 8) {
return $this->hash_pmd5($clear, $salt, $magic, $compute);
}
@@ -354,12 +394,12 @@ class PassHash {
* This is used by the Django Python framework
*
* @link http://docs.djangoproject.com/en/dev/topics/auth/#passwords
- * @param string $clear - the clear text to hash
- * @param string $salt - the salt to use, null for random
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @return string Hashed password
*/
- public function hash_djangosha1($clear, $salt=null){
- $this->init_salt($salt,5);
+ public function hash_djangosha1($clear, $salt = null) {
+ $this->init_salt($salt, 5);
return 'sha1$'.$salt.'$'.sha1($salt.$clear);
}
@@ -370,13 +410,44 @@ class PassHash {
* This is used by the Django Python framework
*
* @link http://docs.djangoproject.com/en/dev/topics/auth/#passwords
- * @param string $clear - the clear text to hash
- * @param string $salt - the salt to use, null for random
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @return string Hashed password
*/
- public function hash_djangomd5($clear, $salt=null){
- $this->init_salt($salt,5);
+ public function hash_djangomd5($clear, $salt = null) {
+ $this->init_salt($salt, 5);
return 'md5$'.$salt.'$'.md5($salt.$clear);
}
+ /**
+ * Passwordhashing method 'bcrypt'
+ *
+ * Uses a modified blowfish algorithm called eksblowfish
+ * This method works on PHP 5.3+ only and will throw an exception
+ * if the needed crypt support isn't available
+ *
+ * A full hash should be given as salt (starting with $a2$) or this
+ * will break. When no salt is given, the iteration count can be set
+ * through the $compute variable.
+ *
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @param int $compute The iteration count (between 4 and 31)
+ * @throws Exception
+ * @return string Hashed password
+ */
+ public function hash_bcrypt($clear, $salt = null, $compute = 8) {
+ if(!defined('CRYPT_BLOWFISH') || CRYPT_BLOWFISH != 1) {
+ throw new Exception('This PHP installation has no bcrypt support');
+ }
+
+ if(is_null($salt)) {
+ if($compute < 4 || $compute > 31) $compute = 8;
+ $salt = '$2a$'.str_pad($compute, 2, '0', STR_PAD_LEFT).'$'.
+ $this->gen_salt(22);
+ }
+
+ return crypt($clear, $salt);
+ }
+
}
diff --git a/inc/RemoteAPICore.php b/inc/RemoteAPICore.php
new file mode 100644
index 000000000..36c518881
--- /dev/null
+++ b/inc/RemoteAPICore.php
@@ -0,0 +1,777 @@
+<?php
+
+/**
+ * Increased whenever the API is changed
+ */
+define('DOKU_API_VERSION', 7);
+
+class RemoteAPICore {
+
+ private $api;
+
+ public function __construct(RemoteAPI $api) {
+ $this->api = $api;
+ }
+
+ function __getRemoteInfo() {
+ return array(
+ 'dokuwiki.getVersion' => array(
+ 'args' => array(),
+ 'return' => 'string',
+ 'doc' => 'Returns the running DokuWiki version.'
+ ), 'dokuwiki.login' => array(
+ 'args' => array('string', 'string'),
+ 'return' => 'int',
+ 'doc' => 'Tries to login with the given credentials and sets auth cookies.',
+ 'public' => '1'
+ ), 'dokuwiki.getPagelist' => array(
+ 'args' => array('string', 'array'),
+ 'return' => 'array',
+ 'doc' => 'List all pages within the given namespace.',
+ 'name' => 'readNamespace'
+ ), 'dokuwiki.search' => array(
+ 'args' => array('string'),
+ 'return' => 'array',
+ 'doc' => 'Perform a fulltext search and return a list of matching pages'
+ ), 'dokuwiki.getTime' => array(
+ 'args' => array(),
+ 'return' => 'int',
+ 'doc' => 'Returns the current time at the remote wiki server as Unix timestamp.',
+ ), 'dokuwiki.setLocks' => array(
+ 'args' => array('array'),
+ 'return' => 'array',
+ 'doc' => 'Lock or unlock pages.'
+ ), 'dokuwiki.getTitle' => array(
+ 'args' => array(),
+ 'return' => 'string',
+ 'doc' => 'Returns the wiki title.',
+ 'public' => '1'
+ ), 'dokuwiki.appendPage' => array(
+ 'args' => array('string', 'string', 'array'),
+ 'return' => 'int',
+ 'doc' => 'Append text to a wiki page.'
+ ), 'wiki.getPage' => array(
+ 'args' => array('string'),
+ 'return' => 'string',
+ 'doc' => 'Get the raw Wiki text of page, latest version.',
+ 'name' => 'rawPage',
+ ), 'wiki.getPageVersion' => array(
+ 'args' => array('string', 'int'),
+ 'name' => 'rawPage',
+ 'return' => 'string',
+ 'doc' => 'Return a raw wiki page'
+ ), 'wiki.getPageHTML' => array(
+ 'args' => array('string'),
+ 'return' => 'string',
+ 'doc' => 'Return page in rendered HTML, latest version.',
+ 'name' => 'htmlPage'
+ ), 'wiki.getPageHTMLVersion' => array(
+ 'args' => array('string', 'int'),
+ 'return' => 'string',
+ 'doc' => 'Return page in rendered HTML.',
+ 'name' => 'htmlPage'
+ ), 'wiki.getAllPages' => array(
+ 'args' => array(),
+ 'return' => 'array',
+ 'doc' => 'Returns a list of all pages. The result is an array of utf8 pagenames.',
+ 'name' => 'listPages'
+ ), 'wiki.getAttachments' => array(
+ 'args' => array('string', 'array'),
+ 'return' => 'array',
+ 'doc' => 'Returns a list of all media files.',
+ 'name' => 'listAttachments'
+ ), 'wiki.getBackLinks' => array(
+ 'args' => array('string'),
+ 'return' => 'array',
+ 'doc' => 'Returns the pages that link to this page.',
+ 'name' => 'listBackLinks'
+ ), 'wiki.getPageInfo' => array(
+ 'args' => array('string'),
+ 'return' => 'array',
+ 'doc' => 'Returns a struct with infos about the page.',
+ 'name' => 'pageInfo'
+ ), 'wiki.getPageInfoVersion' => array(
+ 'args' => array('string', 'int'),
+ 'return' => 'array',
+ 'doc' => 'Returns a struct with infos about the page.',
+ 'name' => 'pageInfo'
+ ), 'wiki.getPageVersions' => array(
+ 'args' => array('string', 'int'),
+ 'return' => 'array',
+ 'doc' => 'Returns the available revisions of the page.',
+ 'name' => 'pageVersions'
+ ), 'wiki.putPage' => array(
+ 'args' => array('string', 'string', 'array'),
+ 'return' => 'int',
+ 'doc' => 'Saves a wiki page.'
+ ), 'wiki.listLinks' => array(
+ 'args' => array('string'),
+ 'return' => 'array',
+ 'doc' => 'Lists all links contained in a wiki page.'
+ ), 'wiki.getRecentChanges' => array(
+ 'args' => array('int'),
+ 'return' => 'array',
+ 'Returns a struct about all recent changes since given timestamp.'
+ ), 'wiki.getRecentMediaChanges' => array(
+ 'args' => array('int'),
+ 'return' => 'array',
+ 'Returns a struct about all recent media changes since given timestamp.'
+ ), 'wiki.aclCheck' => array(
+ 'args' => array('string'),
+ 'return' => 'int',
+ 'doc' => 'Returns the permissions of a given wiki page.'
+ ), 'wiki.putAttachment' => array(
+ 'args' => array('string', 'file', 'array'),
+ 'return' => 'array',
+ 'doc' => 'Upload a file to the wiki.'
+ ), 'wiki.deleteAttachment' => array(
+ 'args' => array('string'),
+ 'return' => 'int',
+ 'doc' => 'Delete a file from the wiki.'
+ ), 'wiki.getAttachment' => array(
+ 'args' => array('string'),
+ 'doc' => 'Return a media file',
+ 'return' => 'file',
+ 'name' => 'getAttachment',
+ ), 'wiki.getAttachmentInfo' => array(
+ 'args' => array('string'),
+ 'return' => 'array',
+ 'doc' => 'Returns a struct with infos about the attachment.'
+ ), 'dokuwiki.getXMLRPCAPIVersion' => array(
+ 'args' => array(),
+ 'name' => 'getAPIVersion',
+ 'return' => 'int',
+ 'doc' => 'Returns the XMLRPC API version.',
+ 'public' => '1',
+ ), 'wiki.getRPCVersionSupported' => array(
+ 'args' => array(),
+ 'name' => 'wiki_RPCVersion',
+ 'return' => 'int',
+ 'doc' => 'Returns 2 with the supported RPC API version.',
+ 'public' => '1'
+ ),
+
+ );
+ }
+
+ function getVersion() {
+ return getVersion();
+ }
+
+ function getTime() {
+ return time();
+ }
+
+ /**
+ * Return a raw wiki page
+ * @param string $id wiki page id
+ * @param string $rev revision number of the page
+ * @return page text.
+ */
+ function rawPage($id,$rev=''){
+ $id = $this->resolvePageId($id);
+ if(auth_quickaclcheck($id) < AUTH_READ){
+ throw new RemoteAccessDeniedException('You are not allowed to read this file', 111);
+ }
+ $text = rawWiki($id,$rev);
+ if(!$text) {
+ return pageTemplate($id);
+ } else {
+ return $text;
+ }
+ }
+
+ /**
+ * Return a media file
+ *
+ * @author Gina Haeussge <osd@foosel.net>
+ * @param string $id file id
+ * @return media file
+ */
+ function getAttachment($id){
+ $id = cleanID($id);
+ if (auth_quickaclcheck(getNS($id).':*') < AUTH_READ) {
+ throw new RemoteAccessDeniedException('You are not allowed to read this file', 211);
+ }
+
+ $file = mediaFN($id);
+ if (!@ file_exists($file)) {
+ throw new RemoteException('The requested file does not exist', 221);
+ }
+
+ $data = io_readFile($file, false);
+ return $this->api->toFile($data);
+ }
+
+ /**
+ * Return info about a media file
+ *
+ * @author Gina Haeussge <osd@foosel.net>
+ */
+ function getAttachmentInfo($id){
+ $id = cleanID($id);
+ $info = array(
+ 'lastModified' => $this->api->toDate(0),
+ 'size' => 0,
+ );
+
+ $file = mediaFN($id);
+ if ((auth_quickaclcheck(getNS($id).':*') >= AUTH_READ) && file_exists($file)){
+ $info['lastModified'] = $this->api->toDate(filemtime($file));
+ $info['size'] = filesize($file);
+ }
+
+ return $info;
+ }
+
+ /**
+ * Return a wiki page rendered to html
+ */
+ function htmlPage($id,$rev=''){
+ $id = $this->resolvePageId($id);
+ if(auth_quickaclcheck($id) < AUTH_READ){
+ throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+ }
+ return p_wiki_xhtml($id,$rev,false);
+ }
+
+ /**
+ * List all pages - we use the indexer list here
+ */
+ function listPages(){
+ $list = array();
+ $pages = idx_get_indexer()->getPages();
+ $pages = array_filter(array_filter($pages,'isVisiblePage'),'page_exists');
+
+ foreach(array_keys($pages) as $idx) {
+ $perm = auth_quickaclcheck($pages[$idx]);
+ if($perm < AUTH_READ) {
+ continue;
+ }
+ $page = array();
+ $page['id'] = trim($pages[$idx]);
+ $page['perms'] = $perm;
+ $page['size'] = @filesize(wikiFN($pages[$idx]));
+ $page['lastModified'] = $this->api->toDate(@filemtime(wikiFN($pages[$idx])));
+ $list[] = $page;
+ }
+
+ return $list;
+ }
+
+ /**
+ * List all pages in the given namespace (and below)
+ */
+ function readNamespace($ns,$opts){
+ global $conf;
+
+ if(!is_array($opts)) $opts=array();
+
+ $ns = cleanID($ns);
+ $dir = utf8_encodeFN(str_replace(':', '/', $ns));
+ $data = array();
+ $opts['skipacl'] = 0; // no ACL skipping for XMLRPC
+ search($data, $conf['datadir'], 'search_allpages', $opts, $dir);
+ return $data;
+ }
+
+ /**
+ * List all pages in the given namespace (and below)
+ */
+ function search($query){
+ $regex = '';
+ $data = ft_pageSearch($query,$regex);
+ $pages = array();
+
+ // prepare additional data
+ $idx = 0;
+ foreach($data as $id => $score){
+ $file = wikiFN($id);
+
+ if($idx < FT_SNIPPET_NUMBER){
+ $snippet = ft_snippet($id,$regex);
+ $idx++;
+ }else{
+ $snippet = '';
+ }
+
+ $pages[] = array(
+ 'id' => $id,
+ 'score' => intval($score),
+ 'rev' => filemtime($file),
+ 'mtime' => filemtime($file),
+ 'size' => filesize($file),
+ 'snippet' => $snippet,
+ 'title' => useHeading('navigation') ? p_get_first_heading($id) : $id
+ );
+ }
+ return $pages;
+ }
+
+ /**
+ * Returns the wiki title.
+ */
+ function getTitle(){
+ global $conf;
+ return $conf['title'];
+ }
+
+ /**
+ * List all media files.
+ *
+ * Available options are 'recursive' for also including the subnamespaces
+ * in the listing, and 'pattern' for filtering the returned files against
+ * a regular expression matching their name.
+ *
+ * @author Gina Haeussge <osd@foosel.net>
+ */
+ function listAttachments($ns, $options = array()) {
+ global $conf;
+
+ $ns = cleanID($ns);
+
+ if (!is_array($options)) $options = array();
+ $options['skipacl'] = 0; // no ACL skipping for XMLRPC
+
+
+ if(auth_quickaclcheck($ns.':*') >= AUTH_READ) {
+ $dir = utf8_encodeFN(str_replace(':', '/', $ns));
+
+ $data = array();
+ search($data, $conf['mediadir'], 'search_media', $options, $dir);
+ $len = count($data);
+ if(!$len) return array();
+
+ for($i=0; $i<$len; $i++) {
+ unset($data[$i]['meta']);
+ $data[$i]['lastModified'] = $this->api->toDate($data[$i]['mtime']);
+ }
+ return $data;
+ } else {
+ throw new RemoteAccessDeniedException('You are not allowed to list media files.', 215);
+ }
+ }
+
+ /**
+ * Return a list of backlinks
+ */
+ function listBackLinks($id){
+ return ft_backlinks($this->resolvePageId($id));
+ }
+
+ /**
+ * Return some basic data about a page
+ */
+ function pageInfo($id,$rev=''){
+ $id = $this->resolvePageId($id);
+ if(auth_quickaclcheck($id) < AUTH_READ){
+ throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+ }
+ $file = wikiFN($id,$rev);
+ $time = @filemtime($file);
+ if(!$time){
+ throw new RemoteException(10, 'The requested page does not exist', 121);
+ }
+
+ $info = getRevisionInfo($id, $time, 1024);
+
+ $data = array(
+ 'name' => $id,
+ 'lastModified' => $this->api->toDate($time),
+ 'author' => (($info['user']) ? $info['user'] : $info['ip']),
+ 'version' => $time
+ );
+
+ return ($data);
+ }
+
+ /**
+ * Save a wiki page
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ */
+ function putPage($id, $text, $params) {
+ global $TEXT;
+ global $lang;
+
+ $id = $this->resolvePageId($id);
+ $TEXT = cleanText($text);
+ $sum = $params['sum'];
+ $minor = $params['minor'];
+
+ if(empty($id)) {
+ throw new RemoteException('Empty page ID', 131);
+ }
+
+ if(!page_exists($id) && trim($TEXT) == '' ) {
+ throw new RemoteException('Refusing to write an empty new wiki page', 132);
+ }
+
+ if(auth_quickaclcheck($id) < AUTH_EDIT) {
+ throw new RemoteAccessDeniedException('You are not allowed to edit this page', 112);
+ }
+
+ // Check, if page is locked
+ if(checklock($id)) {
+ throw new RemoteException('The page is currently locked', 133);
+ }
+
+ // SPAM check
+ if(checkwordblock()) {
+ throw new RemoteException('Positive wordblock check', 134);
+ }
+
+ // autoset summary on new pages
+ if(!page_exists($id) && empty($sum)) {
+ $sum = $lang['created'];
+ }
+
+ // autoset summary on deleted pages
+ if(page_exists($id) && empty($TEXT) && empty($sum)) {
+ $sum = $lang['deleted'];
+ }
+
+ lock($id);
+
+ saveWikiText($id,$TEXT,$sum,$minor);
+
+ unlock($id);
+
+ // run the indexer if page wasn't indexed yet
+ idx_addPage($id);
+
+ return 0;
+ }
+
+ /**
+ * Appends text to a wiki page.
+ */
+ function appendPage($id, $text, $params) {
+ $currentpage = $this->rawPage($id);
+ if (!is_string($currentpage)) {
+ return $currentpage;
+ }
+ return $this->putPage($id, $currentpage.$text, $params);
+ }
+
+ /**
+ * Uploads a file to the wiki.
+ *
+ * Michael Klier <chi@chimeric.de>
+ */
+ function putAttachment($id, $file, $params) {
+ $id = cleanID($id);
+ $auth = auth_quickaclcheck(getNS($id).':*');
+
+ if(!isset($id)) {
+ throw new RemoteException('Filename not given.', 231);
+ }
+
+ global $conf;
+
+ $ftmp = $conf['tmpdir'] . '/' . md5($id.clientIP());
+
+ // save temporary file
+ @unlink($ftmp);
+ io_saveFile($ftmp, $file);
+
+ $res = media_save(array('name' => $ftmp), $id, $params['ow'], $auth, 'rename');
+ if (is_array($res)) {
+ throw new RemoteException($res[0], -$res[1]);
+ } else {
+ return $res;
+ }
+ }
+
+ /**
+ * Deletes a file from the wiki.
+ *
+ * @author Gina Haeussge <osd@foosel.net>
+ */
+ function deleteAttachment($id){
+ $id = cleanID($id);
+ $auth = auth_quickaclcheck(getNS($id).':*');
+ $res = media_delete($id, $auth);
+ if ($res & DOKU_MEDIA_DELETED) {
+ return 0;
+ } elseif ($res & DOKU_MEDIA_NOT_AUTH) {
+ throw new RemoteAccessDeniedException('You don\'t have permissions to delete files.', 212);
+ } elseif ($res & DOKU_MEDIA_INUSE) {
+ throw new RemoteException('File is still referenced', 232);
+ } else {
+ throw new RemoteException('Could not delete file', 233);
+ }
+ }
+
+ /**
+ * Returns the permissions of a given wiki page
+ */
+ function aclCheck($id) {
+ $id = $this->resolvePageId($id);
+ return auth_quickaclcheck($id);
+ }
+
+ /**
+ * Lists all links contained in a wiki page
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ */
+ function listLinks($id) {
+ $id = $this->resolvePageId($id);
+ if(auth_quickaclcheck($id) < AUTH_READ){
+ throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+ }
+ $links = array();
+
+ // resolve page instructions
+ $ins = p_cached_instructions(wikiFN($id));
+
+ // instantiate new Renderer - needed for interwiki links
+ include(DOKU_INC.'inc/parser/xhtml.php');
+ $Renderer = new Doku_Renderer_xhtml();
+ $Renderer->interwiki = getInterwiki();
+
+ // parse parse instructions
+ foreach($ins as $in) {
+ $link = array();
+ switch($in[0]) {
+ case 'internallink':
+ $link['type'] = 'local';
+ $link['page'] = $in[1][0];
+ $link['href'] = wl($in[1][0]);
+ array_push($links,$link);
+ break;
+ case 'externallink':
+ $link['type'] = 'extern';
+ $link['page'] = $in[1][0];
+ $link['href'] = $in[1][0];
+ array_push($links,$link);
+ break;
+ case 'interwikilink':
+ $url = $Renderer->_resolveInterWiki($in[1][2],$in[1][3]);
+ $link['type'] = 'extern';
+ $link['page'] = $url;
+ $link['href'] = $url;
+ array_push($links,$link);
+ break;
+ }
+ }
+
+ return ($links);
+ }
+
+ /**
+ * Returns a list of recent changes since give timestamp
+ *
+ * @author Michael Hamann <michael@content-space.de>
+ * @author Michael Klier <chi@chimeric.de>
+ */
+ function getRecentChanges($timestamp) {
+ if(strlen($timestamp) != 10) {
+ throw new RemoteException('The provided value is not a valid timestamp', 311);
+ }
+
+ $recents = getRecentsSince($timestamp);
+
+ $changes = array();
+
+ foreach ($recents as $recent) {
+ $change = array();
+ $change['name'] = $recent['id'];
+ $change['lastModified'] = $this->api->toDate($recent['date']);
+ $change['author'] = $recent['user'];
+ $change['version'] = $recent['date'];
+ $change['perms'] = $recent['perms'];
+ $change['size'] = @filesize(wikiFN($recent['id']));
+ array_push($changes, $change);
+ }
+
+ if (!empty($changes)) {
+ return $changes;
+ } else {
+ // in case we still have nothing at this point
+ return new RemoteException('There are no changes in the specified timeframe', 321);
+ }
+ }
+
+ /**
+ * Returns a list of recent media changes since give timestamp
+ *
+ * @author Michael Hamann <michael@content-space.de>
+ * @author Michael Klier <chi@chimeric.de>
+ */
+ function getRecentMediaChanges($timestamp) {
+ if(strlen($timestamp) != 10)
+ throw new RemoteException('The provided value is not a valid timestamp', 311);
+
+ $recents = getRecentsSince($timestamp, null, '', RECENTS_MEDIA_CHANGES);
+
+ $changes = array();
+
+ foreach ($recents as $recent) {
+ $change = array();
+ $change['name'] = $recent['id'];
+ $change['lastModified'] = $this->api->toDate($recent['date']);
+ $change['author'] = $recent['user'];
+ $change['version'] = $recent['date'];
+ $change['perms'] = $recent['perms'];
+ $change['size'] = @filesize(mediaFN($recent['id']));
+ array_push($changes, $change);
+ }
+
+ if (!empty($changes)) {
+ return $changes;
+ } else {
+ // in case we still have nothing at this point
+ throw new RemoteException('There are no changes in the specified timeframe', 321);
+ }
+ }
+
+ /**
+ * Returns a list of available revisions of a given wiki page
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ */
+ function pageVersions($id, $first) {
+ $id = $this->resolvePageId($id);
+ if(auth_quickaclcheck($id) < AUTH_READ) {
+ throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+ }
+ global $conf;
+
+ $versions = array();
+
+ if(empty($id)) {
+ throw new RemoteException('Empty page ID', 131);
+ }
+
+ $revisions = getRevisions($id, $first, $conf['recent']+1);
+
+ if(count($revisions)==0 && $first!=0) {
+ $first=0;
+ $revisions = getRevisions($id, $first, $conf['recent']+1);
+ }
+
+ if(count($revisions)>0 && $first==0) {
+ array_unshift($revisions, ''); // include current revision
+ array_pop($revisions); // remove extra log entry
+ }
+
+ if(count($revisions) > $conf['recent']) {
+ array_pop($revisions); // remove extra log entry
+ }
+
+ if(!empty($revisions)) {
+ foreach($revisions as $rev) {
+ $file = wikiFN($id,$rev);
+ $time = @filemtime($file);
+ // we check if the page actually exists, if this is not the
+ // case this can lead to less pages being returned than
+ // specified via $conf['recent']
+ if($time){
+ $info = getRevisionInfo($id, $time, 1024);
+ if(!empty($info)) {
+ $data['user'] = $info['user'];
+ $data['ip'] = $info['ip'];
+ $data['type'] = $info['type'];
+ $data['sum'] = $info['sum'];
+ $data['modified'] = $this->api->toDate($info['date']);
+ $data['version'] = $info['date'];
+ array_push($versions, $data);
+ }
+ }
+ }
+ return $versions;
+ } else {
+ return array();
+ }
+ }
+
+ /**
+ * The version of Wiki RPC API supported
+ */
+ function wiki_RPCVersion(){
+ return 2;
+ }
+
+
+ /**
+ * Locks or unlocks a given batch of pages
+ *
+ * Give an associative array with two keys: lock and unlock. Both should contain a
+ * list of pages to lock or unlock
+ *
+ * Returns an associative array with the keys locked, lockfail, unlocked and
+ * unlockfail, each containing lists of pages.
+ */
+ function setLocks($set){
+ $locked = array();
+ $lockfail = array();
+ $unlocked = array();
+ $unlockfail = array();
+
+ foreach((array) $set['lock'] as $id){
+ $id = $this->resolvePageId($id);
+ if(auth_quickaclcheck($id) < AUTH_EDIT || checklock($id)){
+ $lockfail[] = $id;
+ }else{
+ lock($id);
+ $locked[] = $id;
+ }
+ }
+
+ foreach((array) $set['unlock'] as $id){
+ $id = $this->resolvePageId($id);
+ if(auth_quickaclcheck($id) < AUTH_EDIT || !unlock($id)){
+ $unlockfail[] = $id;
+ }else{
+ $unlocked[] = $id;
+ }
+ }
+
+ return array(
+ 'locked' => $locked,
+ 'lockfail' => $lockfail,
+ 'unlocked' => $unlocked,
+ 'unlockfail' => $unlockfail,
+ );
+ }
+
+ function getAPIVersion(){
+ return DOKU_API_VERSION;
+ }
+
+ function login($user,$pass){
+ global $conf;
+ global $auth;
+ if(!$conf['useacl']) return 0;
+ if(!$auth) return 0;
+
+ @session_start(); // reopen session for login
+ if($auth->canDo('external')){
+ $ok = $auth->trustExternal($user,$pass,false);
+ }else{
+ $evdata = array(
+ 'user' => $user,
+ 'password' => $pass,
+ 'sticky' => false,
+ 'silent' => true,
+ );
+ $ok = trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
+ }
+ session_write_close(); // we're done with the session
+
+ return $ok;
+ }
+
+ private function resolvePageId($id) {
+ $id = cleanID($id);
+ if(empty($id)) {
+ global $conf;
+ $id = cleanID($conf['start']);
+ }
+ return $id;
+ }
+
+}
+
diff --git a/inc/SafeFN.class.php b/inc/SafeFN.class.php
index 43b19e9ab..ab05b9eae 100644
--- a/inc/SafeFN.class.php
+++ b/inc/SafeFN.class.php
@@ -1,17 +1,17 @@
<?php
/**
- * Class to safely store UTF-8 in a Filename
+ * Class to safely store UTF-8 in a Filename
*
- * Encodes a utf8 string using only the following characters 0-9a-z_.-%
- * characters 0-9a-z in the original string are preserved, "plain".
- * all other characters are represented in a substring that starts
- * with '%' are "converted".
- * The transition from converted substrings to plain characters is
- * marked with a '.'
+ * Encodes a utf8 string using only the following characters 0-9a-z_.-%
+ * characters 0-9a-z in the original string are preserved, "plain".
+ * all other characters are represented in a substring that starts
+ * with '%' are "converted".
+ * The transition from converted substrings to plain characters is
+ * marked with a '.'
*
- * @author Christopher Smith
- * @date 2010-04-02
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @date 2010-04-02
*/
class SafeFN {
@@ -133,14 +133,15 @@ class SafeFN {
$converted = false;
foreach ($split as $sub) {
+ $len = strlen($sub);
if ($sub[0] != self::$pre_indicator) {
// plain (unconverted) characters, optionally starting with a post_indicator
// set initial value to skip any post_indicator
- for ($i=($converted?1:0); $i < strlen($sub); $i++) {
+ for ($i=($converted?1:0); $i < $len; $i++) {
$unicode[] = ord($sub[$i]);
}
$converted = false;
- } else if (strlen($sub)==1) {
+ } else if ($len==1) {
// a pre_indicator character in the real data
$unicode[] = ord($sub);
$converted = true;
diff --git a/inc/Sitemapper.php b/inc/Sitemapper.php
index bbe1caf26..bf89a311c 100644
--- a/inc/Sitemapper.php
+++ b/inc/Sitemapper.php
@@ -10,7 +10,7 @@ if(!defined('DOKU_INC')) die('meh.');
/**
* A class for building sitemaps and pinging search engines with the sitemap URL.
- *
+ *
* @author Michael Hamann
*/
class Sitemapper {
@@ -25,7 +25,7 @@ class Sitemapper {
* @link https://www.google.com/webmasters/sitemaps/docs/en/about.html
* @link http://www.sitemaps.org/
*/
- public function generate(){
+ public static function generate(){
global $conf;
if($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) return false;
@@ -39,11 +39,11 @@ class Sitemapper {
if(@filesize($sitemap) &&
@filemtime($sitemap) > (time()-($conf['sitemap']*86400))){ // 60*60*24=86400
- dbglog('Sitemapper::generate(): Sitemap up to date'); // FIXME: only in debug mode
+ dbglog('Sitemapper::generate(): Sitemap up to date');
return false;
}
- dbglog("Sitemapper::generate(): using $sitemap"); // FIXME: Only in debug mode
+ dbglog("Sitemapper::generate(): using $sitemap");
$pages = idx_get_indexer()->getPages();
dbglog('Sitemapper::generate(): creating sitemap using '.count($pages).' pages');
@@ -55,7 +55,7 @@ class Sitemapper {
if(isHiddenPage($id)) continue;
if(auth_aclcheck($id,'','') < AUTH_READ) continue;
$item = SitemapItem::createFromID($id);
- if ($item !== NULL)
+ if ($item !== null)
$items[] = $item;
}
@@ -63,25 +63,26 @@ class Sitemapper {
$event = new Doku_Event('SITEMAP_GENERATE', $eventData);
if ($event->advise_before(true)) {
//save the new sitemap
- $result = io_saveFile($sitemap, Sitemapper::getXML($items));
+ $event->result = io_saveFile($sitemap, Sitemapper::getXML($items));
}
$event->advise_after();
- return $result;
+ return $event->result;
}
/**
* Builds the sitemap XML string from the given array auf SitemapItems.
- *
+ *
* @param $items array The SitemapItems that shall be included in the sitemap.
* @return string The sitemap XML.
* @author Michael Hamann
*/
- private function getXML($items) {
+ private static function getXML($items) {
ob_start();
echo '<?xml version="1.0" encoding="UTF-8"?>'.NL;
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'.NL;
foreach ($items as $item) {
+ /** @var SitemapItem $item */
echo $item->toXML();
}
echo '</urlset>'.NL;
@@ -92,15 +93,15 @@ class Sitemapper {
/**
* Helper function for getting the path to the sitemap file.
- *
- * @return The path to the sitemap file.
+ *
+ * @return string The path to the sitemap file.
* @author Michael Hamann
*/
- public function getFilePath() {
+ public static function getFilePath() {
global $conf;
$sitemap = $conf['cachedir'].'/sitemap.xml';
- if($conf['compression'] === 'bz2' || $conf['compression'] === 'gz'){
+ if (self::sitemapIsCompressed()) {
$sitemap .= '.gz';
}
@@ -108,12 +109,22 @@ class Sitemapper {
}
/**
- * Pings search engines with the sitemap url. Plugins can add or remove
+ * Helper function for checking if the sitemap is compressed
+ *
+ * @return bool If the sitemap file is compressed
+ */
+ public static function sitemapIsCompressed() {
+ global $conf;
+ return $conf['compression'] === 'bz2' || $conf['compression'] === 'gz';
+ }
+
+ /**
+ * Pings search engines with the sitemap url. Plugins can add or remove
* urls to ping using the SITEMAP_PING event.
- *
+ *
* @author Michael Hamann
*/
- public function pingSearchEngines() {
+ public static function pingSearchEngines() {
//ping search engines...
$http = new DokuHTTPClient();
$http->timeout = 8;
@@ -145,7 +156,7 @@ class Sitemapper {
/**
* An item of a sitemap.
- *
+ *
* @author Michael Hamann
*/
class SitemapItem {
@@ -156,7 +167,7 @@ class SitemapItem {
/**
* Create a new item.
- *
+ *
* @param $url string The url of the item
* @param $lastmod int Timestamp of the last modification
* @param $changefreq string How frequently the item is likely to change. Valid values: always, hourly, daily, weekly, monthly, yearly, never.
@@ -171,31 +182,31 @@ class SitemapItem {
/**
* Helper function for creating an item for a wikipage id.
- *
+ *
* @param $id string A wikipage id.
* @param $changefreq string How frequently the item is likely to change. Valid values: always, hourly, daily, weekly, monthly, yearly, never.
* @param $priority float|string The priority of the item relative to other URLs on your site. Valid values range from 0.0 to 1.0.
- * @return The sitemap item.
+ * @return SitemapItem The sitemap item.
*/
public static function createFromID($id, $changefreq = null, $priority = null) {
$id = trim($id);
$date = @filemtime(wikiFN($id));
- if(!$date) return NULL;
+ if(!$date) return null;
return new SitemapItem(wl($id, '', true), $date, $changefreq, $priority);
}
/**
* Get the XML representation of the sitemap item.
- *
- * @return The XML representation.
+ *
+ * @return string The XML representation.
*/
public function toXML() {
$result = ' <url>'.NL
.' <loc>'.hsc($this->url).'</loc>'.NL
.' <lastmod>'.date_iso8601($this->lastmod).'</lastmod>'.NL;
- if ($this->changefreq !== NULL)
+ if ($this->changefreq !== null)
$result .= ' <changefreq>'.hsc($this->changefreq).'</changefreq>'.NL;
- if ($this->priority !== NULL)
+ if ($this->priority !== null)
$result .= ' <priority>'.hsc($this->priority).'</priority>'.NL;
$result .= ' </url>'.NL;
return $result;
diff --git a/inc/TarLib.class.php b/inc/TarLib.class.php
index 12418c48d..126604cd1 100644
--- a/inc/TarLib.class.php
+++ b/inc/TarLib.class.php
@@ -108,7 +108,7 @@ class TarLib {
* represent the GZIP or BZIP compression level. 1 produce fast compression,
* and 9 produce smaller files. See the RFC 1952 for more infos.
*/
- function tarlib($p_filen = TarLib::ARCHIVE_DYNAMIC , $p_comptype = TarLib::COMPRESS_AUTO, $p_complevel = 9) {
+ function __construct($p_filen = TarLib::ARCHIVE_DYNAMIC , $p_comptype = TarLib::COMPRESS_AUTO, $p_complevel = 9) {
$this->_initerror = 0;
$this->_nomf = $p_filen;
$flag=0;
@@ -127,7 +127,7 @@ class TarLib {
}
switch($p_comptype) {
- case TarLib::COMPRESS_GZIP:
+ case TarLib::COMPRESS_GZIP:
if(!extension_loaded('zlib')) $this->_initerror = -1;
$this->_comptype = TarLib::COMPRESS_GZIP;
break;
@@ -261,14 +261,14 @@ class TarLib {
function sendClient($name = '', $archive = '', $headers = true) {
if(!$name && !$this->_nomf) return -9;
if(!$archive && !$this->_memdat) return -10;
- if(!$name) $name = basename($this->_nomf);
+ if(!$name) $name = utf8_basename($this->_nomf);
if($archive){ if(!file_exists($archive)) return -11; }
else $decoded = $this->getDynamicArchive();
if($headers) {
header('Content-Type: application/x-gtar');
- header('Content-Disposition: attachment; filename='.basename($name));
+ header('Content-Disposition: attachment; filename='.utf8_basename($name));
header('Accept-Ranges: bytes');
header('Content-Length: '.($archive ? filesize($archive) : strlen($decoded)));
}
diff --git a/inc/ZipLib.class.php b/inc/ZipLib.class.php
index cf89a40a4..918d38579 100644
--- a/inc/ZipLib.class.php
+++ b/inc/ZipLib.class.php
@@ -52,8 +52,8 @@ class ZipLib {
$fn = $files[$i];
if(!in_Array(dirname($fn[0]),$this->dirs))
$this->add_Dir(dirname($fn[0]));
- if(basename($fn[0]))
- $ret[basename($fn[0])]=$this->add_File($fn[1],$fn[0],$compact);
+ if(utf8_basename($fn[0]))
+ $ret[utf8_basename($fn[0])]=$this->add_File($fn[1],$fn[0],$compact);
}
return $ret;
}
diff --git a/inc/actions.php b/inc/actions.php
index 4a2e200ae..f65b47451 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -20,6 +20,7 @@ function act_dispatch(){
global $ID;
global $INFO;
global $QUERY;
+ global $INPUT;
global $lang;
global $conf;
@@ -30,7 +31,7 @@ function act_dispatch(){
if ($evt->advise_before()) {
//sanitize $ACT
- $ACT = act_clean($ACT);
+ $ACT = act_validate($ACT);
//check if searchword was given - else just show
$s = cleanID($QUERY);
@@ -63,11 +64,11 @@ function act_dispatch(){
//sitemap
if ($ACT == 'sitemap'){
- $ACT = act_sitemap($ACT);
+ act_sitemap($ACT);
}
//register
- if($ACT == 'register' && $_POST['save'] && register()){
+ if($ACT == 'register' && $INPUT->post->bool('save') && register()){
$ACT = 'login';
}
@@ -131,14 +132,15 @@ function act_dispatch(){
//handle admin tasks
if($ACT == 'admin'){
// retrieve admin plugin name from $_REQUEST['page']
- if (!empty($_REQUEST['page'])) {
+ if (($page = $INPUT->str('page', '', true)) != '') {
$pluginlist = plugin_list('admin');
- if (in_array($_REQUEST['page'], $pluginlist)) {
+ if (in_array($page, $pluginlist)) {
// attempt to load the plugin
- if ($plugin =& plugin_load('admin',$_REQUEST['page']) !== null){
+ if ($plugin =& plugin_load('admin',$page) !== null){
+ /** @var DokuWiki_Admin_Plugin $plugin */
if($plugin->forAdminOnly() && !$INFO['isadmin']){
// a manager tried to load a plugin that's for admins only
- unset($_REQUEST['page']);
+ $INPUT->remove('page');
msg('For admins only',-1);
}else{
$plugin->handle();
@@ -176,6 +178,11 @@ function act_dispatch(){
// in function tpl_content()
}
+/**
+ * Send the given headers using header()
+ *
+ * @param array $headers The headers that shall be sent
+ */
function act_sendheaders($headers) {
foreach ($headers as $hdr) header($hdr);
}
@@ -183,15 +190,9 @@ function act_sendheaders($headers) {
/**
* Sanitize the action command
*
- * Add all allowed commands here.
- *
* @author Andreas Gohr <andi@splitbrain.org>
*/
function act_clean($act){
- global $lang;
- global $conf;
- global $INFO;
-
// check if the action was given as array key
if(is_array($act)){
list($act) = array_keys($act);
@@ -205,6 +206,21 @@ function act_clean($act){
if($act == 'export_htmlbody') $act = 'export_xhtmlbody';
if($act === '') $act = 'show';
+ return $act;
+}
+
+/**
+ * Sanitize and validate action commands.
+ *
+ * Add all allowed commands here.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function act_validate($act) {
+ global $conf;
+ global $INFO;
+
+ $act = act_clean($act);
// check if action is disabled
if(!actionOK($act)){
@@ -300,13 +316,14 @@ function act_draftdel($act){
function act_draftsave($act){
global $INFO;
global $ID;
+ global $INPUT;
global $conf;
- if($conf['usedraft'] && $_POST['wikitext']){
+ if($conf['usedraft'] && $INPUT->post->has('wikitext')) {
$draft = array('id' => $ID,
- 'prefix' => substr($_POST['prefix'], 0, -1),
- 'text' => $_POST['wikitext'],
- 'suffix' => $_POST['suffix'],
- 'date' => (int) $_POST['date'],
+ 'prefix' => substr($INPUT->post->str('prefix'), 0, -1),
+ 'text' => $INPUT->post->str('wikitext'),
+ 'suffix' => $INPUT->post->str('suffix'),
+ 'date' => $INPUT->post->int('date'),
'client' => $INFO['client'],
);
$cname = getCacheName($draft['client'].$ID,'.draft');
@@ -335,6 +352,7 @@ function act_save($act){
global $SUM;
global $lang;
global $INFO;
+ global $INPUT;
//spam check
if(checkwordblock()) {
@@ -346,7 +364,7 @@ function act_save($act){
return 'conflict';
//save it
- saveWikiText($ID,con($PRE,$TEXT,$SUF,1),$SUM,$_REQUEST['minor']); //use pretty mode for con
+ saveWikiText($ID,con($PRE,$TEXT,$SUF,1),$SUM,$INPUT->bool('minor')); //use pretty mode for con
//unlock it
unlock($ID);
@@ -380,7 +398,7 @@ function act_revert($act){
if($REV){
$text = rawWiki($ID,$REV);
if(!$text) return 'show'; //something went wrong
- $sum = $lang['restored'];
+ $sum = sprintf($lang['restored'], dformat($REV));
}
// spam check
@@ -425,6 +443,11 @@ function act_redirect($id,$preact){
trigger_event('ACTION_SHOW_REDIRECT',$opts,'act_redirect_execute');
}
+/**
+ * Execute the redirect
+ *
+ * @param array $opts id and fragment for the redirect
+ */
function act_redirect_execute($opts){
$go = wl($opts['id'],'',true);
if(isset($opts['fragment'])) $go .= '#'.$opts['fragment'];
@@ -498,7 +521,7 @@ function act_edit($act){
//set summary default
if(!$SUM){
if($REV){
- $SUM = $lang['restored'];
+ $SUM = sprintf($lang['restored'], dformat($REV));
}elseif(!$INFO['exists']){
$SUM = $lang['created'];
}
@@ -506,7 +529,7 @@ function act_edit($act){
// Use the date of the newest revision, not of the revision we edit
// This is used for conflict detection
- if(!$DATE) $DATE = $INFO['meta']['date']['modified'];
+ if(!$DATE) $DATE = @filemtime(wikiFN($ID));
//check if locked by anyone - if not lock for my self
//do not lock when the user can't edit anyway
@@ -556,12 +579,10 @@ function act_export($act){
$output = rawWiki($ID,$REV);
break;
case 'xhtml':
- $pre .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' . DOKU_LF;
- $pre .= ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' . DOKU_LF;
- $pre .= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="'.$conf['lang'].'"' . DOKU_LF;
- $pre .= ' lang="'.$conf['lang'].'" dir="'.$lang['direction'].'">' . DOKU_LF;
+ $pre .= '<!DOCTYPE html>' . DOKU_LF;
+ $pre .= '<html lang="'.$conf['lang'].'" dir="'.$lang['direction'].'">' . DOKU_LF;
$pre .= '<head>' . DOKU_LF;
- $pre .= ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' . DOKU_LF;
+ $pre .= ' <meta charset="utf-8" />' . DOKU_LF;
$pre .= ' <title>'.$ID.'</title>' . DOKU_LF;
// get metaheaders
@@ -627,7 +648,7 @@ function act_sitemap($act) {
}
$sitemap = Sitemapper::getFilePath();
- if(strrchr($sitemap, '.') === '.gz'){
+ if (Sitemapper::sitemapIsCompressed()) {
$mime = 'application/x-gzip';
}else{
$mime = 'application/xml; charset=utf-8';
@@ -641,7 +662,7 @@ function act_sitemap($act) {
if (is_readable($sitemap)) {
// Send headers
header('Content-Type: '.$mime);
- header('Content-Disposition: attachment; filename='.basename($sitemap));
+ header('Content-Disposition: attachment; filename='.utf8_basename($sitemap));
http_conditionalRequest(filemtime($sitemap));
@@ -669,6 +690,7 @@ function act_subscription($act){
global $lang;
global $INFO;
global $ID;
+ global $INPUT;
// subcriptions work for logged in users only
if(!$_SERVER['REMOTE_USER']) return 'show';
@@ -676,8 +698,8 @@ function act_subscription($act){
// get and preprocess data.
$params = array();
foreach(array('target', 'style', 'action') as $param) {
- if (isset($_REQUEST["sub_$param"])) {
- $params[$param] = $_REQUEST["sub_$param"];
+ if ($INPUT->has("sub_$param")) {
+ $params[$param] = $INPUT->str("sub_$param");
}
}
diff --git a/inc/adLDAP.php b/inc/adLDAP.php
deleted file mode 100644
index a64096b85..000000000
--- a/inc/adLDAP.php
+++ /dev/null
@@ -1,2422 +0,0 @@
-<?php
-/**
- * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
- * Version 3.3.2
- *
- * PHP Version 5 with SSL and LDAP support
- *
- * Written by Scott Barnett, Richard Hyland
- * email: scott@wiggumworld.com, adldap@richardhyland.com
- * http://adldap.sourceforge.net/
- *
- * Copyright (c) 2006-2010 Scott Barnett, Richard Hyland
- *
- * We'd appreciate any improvements or additions to be submitted back
- * to benefit the entire community :)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * @category ToolsAndUtilities
- * @package adLDAP
- * @author Scott Barnett, Richard Hyland
- * @copyright (c) 2006-2010 Scott Barnett, Richard Hyland
- * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
- * @revision $Revision: 91 $
- * @version 3.3.2
- * @link http://adldap.sourceforge.net/
- */
-
-/**
- * Define the different types of account in AD
- */
-define ('ADLDAP_NORMAL_ACCOUNT', 805306368);
-define ('ADLDAP_WORKSTATION_TRUST', 805306369);
-define ('ADLDAP_INTERDOMAIN_TRUST', 805306370);
-define ('ADLDAP_SECURITY_GLOBAL_GROUP', 268435456);
-define ('ADLDAP_DISTRIBUTION_GROUP', 268435457);
-define ('ADLDAP_SECURITY_LOCAL_GROUP', 536870912);
-define ('ADLDAP_DISTRIBUTION_LOCAL_GROUP', 536870913);
-define ('ADLDAP_FOLDER', 'OU');
-define ('ADLDAP_CONTAINER', 'CN');
-
-/**
-* Main adLDAP class
-*
-* Can be initialised using $adldap = new adLDAP();
-*
-* Something to keep in mind is that Active Directory is a permissions
-* based directory. If you bind as a domain user, you can't fetch as
-* much information on other users as you could as a domain admin.
-*
-* Before asking questions, please read the Documentation at
-* http://adldap.sourceforge.net/wiki/doku.php?id=api
-*/
-class adLDAP {
- /**
- * The account suffix for your domain, can be set when the class is invoked
- *
- * @var string
- */
- protected $_account_suffix = "@mydomain.local";
-
- /**
- * The base dn for your domain
- *
- * @var string
- */
- protected $_base_dn = "DC=mydomain,DC=local";
-
- /**
- * Array of domain controllers. Specifiy multiple controllers if you
- * would like the class to balance the LDAP queries amongst multiple servers
- *
- * @var array
- */
- protected $_domain_controllers = array ("dc01.mydomain.local");
-
- /**
- * Optional account with higher privileges for searching
- * This should be set to a domain admin account
- *
- * @var string
- * @var string
- */
- protected $_ad_username=NULL;
- protected $_ad_password=NULL;
-
- /**
- * AD does not return the primary group. http://support.microsoft.com/?kbid=321360
- * This tweak will resolve the real primary group.
- * Setting to false will fudge "Domain Users" and is much faster. Keep in mind though that if
- * someone's primary group is NOT domain users, this is obviously going to mess up the results
- *
- * @var bool
- */
- protected $_real_primarygroup=true;
-
- /**
- * Use SSL (LDAPS), your server needs to be setup, please see
- * http://adldap.sourceforge.net/wiki/doku.php?id=ldap_over_ssl
- *
- * @var bool
- */
- protected $_use_ssl=false;
-
- /**
- * Use TLS
- * If you wish to use TLS you should ensure that $_use_ssl is set to false and vice-versa
- *
- * @var bool
- */
- protected $_use_tls=false;
-
- /**
- * When querying group memberships, do it recursively
- * eg. User Fred is a member of Group A, which is a member of Group B, which is a member of Group C
- * user_ingroup("Fred","C") will returns true with this option turned on, false if turned off
- *
- * @var bool
- */
- protected $_recursive_groups=true;
-
- // You should not need to edit anything below this line
- //******************************************************************************************
-
- /**
- * Connection and bind default variables
- *
- * @var mixed
- * @var mixed
- */
- protected $_conn;
- protected $_bind;
-
- /**
- * Getters and Setters
- */
-
- /**
- * Set the account suffix
- *
- * @param string $_account_suffix
- * @return void
- */
- public function set_account_suffix($_account_suffix)
- {
- $this->_account_suffix = $_account_suffix;
- }
-
- /**
- * Get the account suffix
- *
- * @return string
- */
- public function get_account_suffix()
- {
- return $this->_account_suffix;
- }
-
- /**
- * Set the domain controllers array
- *
- * @param array $_domain_controllers
- * @return void
- */
- public function set_domain_controllers(array $_domain_controllers)
- {
- $this->_domain_controllers = $_domain_controllers;
- }
-
- /**
- * Get the list of domain controllers
- *
- * @return void
- */
- public function get_domain_controllers()
- {
- return $this->_domain_controllers;
- }
-
- /**
- * Set the username of an account with higher priviledges
- *
- * @param string $_ad_username
- * @return void
- */
- public function set_ad_username($_ad_username)
- {
- $this->_ad_username = $_ad_username;
- }
-
- /**
- * Get the username of the account with higher priviledges
- *
- * This will throw an exception for security reasons
- */
- public function get_ad_username()
- {
- throw new adLDAPException('For security reasons you cannot access the domain administrator account details');
- }
-
- /**
- * Set the password of an account with higher priviledges
- *
- * @param string $_ad_password
- * @return void
- */
- public function set_ad_password($_ad_password)
- {
- $this->_ad_password = $_ad_password;
- }
-
- /**
- * Get the password of the account with higher priviledges
- *
- * This will throw an exception for security reasons
- */
- public function get_ad_password()
- {
- throw new adLDAPException('For security reasons you cannot access the domain administrator account details');
- }
-
- /**
- * Set whether to detect the true primary group
- *
- * @param bool $_real_primary_group
- * @return void
- */
- public function set_real_primarygroup($_real_primarygroup)
- {
- $this->_real_primarygroup = $_real_primarygroup;
- }
-
- /**
- * Get the real primary group setting
- *
- * @return bool
- */
- public function get_real_primarygroup()
- {
- return $this->_real_primarygroup;
- }
-
- /**
- * Set whether to use SSL
- *
- * @param bool $_use_ssl
- * @return void
- */
- public function set_use_ssl($_use_ssl)
- {
- $this->_use_ssl = $_use_ssl;
- }
-
- /**
- * Get the SSL setting
- *
- * @return bool
- */
- public function get_use_ssl()
- {
- return $this->_use_ssl;
- }
-
- /**
- * Set whether to use TLS
- *
- * @param bool $_use_tls
- * @return void
- */
- public function set_use_tls($_use_tls)
- {
- $this->_use_tls = $_use_tls;
- }
-
- /**
- * Get the TLS setting
- *
- * @return bool
- */
- public function get_use_tls()
- {
- return $this->_use_tls;
- }
-
- /**
- * Set whether to lookup recursive groups
- *
- * @param bool $_recursive_groups
- * @return void
- */
- public function set_recursive_groups($_recursive_groups)
- {
- $this->_recursive_groups = $_recursive_groups;
- }
-
- /**
- * Get the recursive groups setting
- *
- * @return bool
- */
- public function get_recursive_groups()
- {
- return $this->_recursive_groups;
- }
-
- /**
- * Default Constructor
- *
- * Tries to bind to the AD domain over LDAP or LDAPs
- *
- * @param array $options Array of options to pass to the constructor
- * @throws Exception - if unable to bind to Domain Controller
- * @return bool
- */
- function __construct($options=array()){
- // You can specifically overide any of the default configuration options setup above
- if (count($options)>0){
- if (array_key_exists("account_suffix",$options)){ $this->_account_suffix=$options["account_suffix"]; }
- if (array_key_exists("base_dn",$options)){ $this->_base_dn=$options["base_dn"]; }
- if (array_key_exists("domain_controllers",$options)){ $this->_domain_controllers=$options["domain_controllers"]; }
- if (array_key_exists("ad_username",$options)){ $this->_ad_username=$options["ad_username"]; }
- if (array_key_exists("ad_password",$options)){ $this->_ad_password=$options["ad_password"]; }
- if (array_key_exists("real_primarygroup",$options)){ $this->_real_primarygroup=$options["real_primarygroup"]; }
- if (array_key_exists("use_ssl",$options)){ $this->_use_ssl=$options["use_ssl"]; }
- if (array_key_exists("use_tls",$options)){ $this->_use_tls=$options["use_tls"]; }
- if (array_key_exists("recursive_groups",$options)){ $this->_recursive_groups=$options["recursive_groups"]; }
- }
-
- if ($this->ldap_supported() === false) {
- throw new adLDAPException('No LDAP support for PHP. See: http://www.php.net/ldap');
- }
-
- return $this->connect();
- }
-
- /**
- * Default Destructor
- *
- * Closes the LDAP connection
- *
- * @return void
- */
- function __destruct(){ $this->close(); }
-
- /**
- * Connects and Binds to the Domain Controller
- *
- * @return bool
- */
- public function connect() {
- // Connect to the AD/LDAP server as the username/password
- $dc=$this->random_controller();
- if ($this->_use_ssl){
- $this->_conn = ldap_connect("ldaps://".$dc, 636);
- } else {
- $this->_conn = ldap_connect($dc);
- }
-
- // Set some ldap options for talking to AD
- ldap_set_option($this->_conn, LDAP_OPT_PROTOCOL_VERSION, 3);
- ldap_set_option($this->_conn, LDAP_OPT_REFERRALS, 0);
-
- if ($this->_use_tls) {
- ldap_start_tls($this->_conn);
- }
-
- // Bind as a domain admin if they've set it up
- if ($this->_ad_username!=NULL && $this->_ad_password!=NULL){
- $this->_bind = @ldap_bind($this->_conn,$this->_ad_username.$this->_account_suffix,$this->_ad_password);
- if (!$this->_bind){
- if ($this->_use_ssl && !$this->_use_tls){
- // If you have problems troubleshooting, remove the @ character from the ldap_bind command above to get the actual error message
- throw new adLDAPException('Bind to Active Directory failed. Either the LDAPs connection failed or the login credentials are incorrect. AD said: ' . $this->get_last_error());
- } else {
- throw new adLDAPException('Bind to Active Directory failed. Check the login credentials and/or server details. AD said: ' . $this->get_last_error());
- }
- }
- }
-
- if ($this->_base_dn == NULL) {
- $this->_base_dn = $this->find_base_dn();
- }
-
- return (true);
- }
-
- /**
- * Closes the LDAP connection
- *
- * @return void
- */
- public function close() {
- ldap_close ($this->_conn);
- }
-
- /**
- * Validate a user's login credentials
- *
- * @param string $username A user's AD username
- * @param string $password A user's AD password
- * @param bool optional $prevent_rebind
- * @return bool
- */
- public function authenticate($username, $password, $prevent_rebind = false) {
- // Prevent null binding
- if ($username === NULL || $password === NULL) { return false; }
- if (empty($username) || empty($password)) { return false; }
-
- // Bind as the user
- $ret = true;
- $this->_bind = @ldap_bind($this->_conn, $username . $this->_account_suffix, $password);
- if (!$this->_bind){ $ret = false; }
-
- // Cnce we've checked their details, kick back into admin mode if we have it
- if ($this->_ad_username !== NULL && !$prevent_rebind) {
- $this->_bind = @ldap_bind($this->_conn, $this->_ad_username . $this->_account_suffix , $this->_ad_password);
- if (!$this->_bind){
- // This should never happen in theory
- throw new adLDAPException('Rebind to Active Directory failed. AD said: ' . $this->get_last_error());
- }
- }
-
- return $ret;
- }
-
- //*****************************************************************************************************************
- // GROUP FUNCTIONS
-
- /**
- * Add a group to a group
- *
- * @param string $parent The parent group name
- * @param string $child The child group name
- * @return bool
- */
- public function group_add_group($parent,$child){
-
- // Find the parent group's dn
- $parent_group=$this->group_info($parent,array("cn"));
- if ($parent_group[0]["dn"]===NULL){ return (false); }
- $parent_dn=$parent_group[0]["dn"];
-
- // Find the child group's dn
- $child_group=$this->group_info($child,array("cn"));
- if ($child_group[0]["dn"]===NULL){ return (false); }
- $child_dn=$child_group[0]["dn"];
-
- $add=array();
- $add["member"] = $child_dn;
-
- $result=@ldap_mod_add($this->_conn,$parent_dn,$add);
- if ($result==false){ return (false); }
- return (true);
- }
-
- /**
- * Add a user to a group
- *
- * @param string $group The group to add the user to
- * @param string $user The user to add to the group
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function group_add_user($group,$user,$isGUID=false){
- // Adding a user is a bit fiddly, we need to get the full DN of the user
- // and add it using the full DN of the group
-
- // Find the user's dn
- $user_dn=$this->user_dn($user,$isGUID);
- if ($user_dn===false){ return (false); }
-
- // Find the group's dn
- $group_info=$this->group_info($group,array("cn"));
- if ($group_info[0]["dn"]===NULL){ return (false); }
- $group_dn=$group_info[0]["dn"];
-
- $add=array();
- $add["member"] = $user_dn;
-
- $result=@ldap_mod_add($this->_conn,$group_dn,$add);
- if ($result==false){ return (false); }
- return (true);
- }
-
- /**
- * Add a contact to a group
- *
- * @param string $group The group to add the contact to
- * @param string $contact_dn The DN of the contact to add
- * @return bool
- */
- public function group_add_contact($group,$contact_dn){
- // To add a contact we take the contact's DN
- // and add it using the full DN of the group
-
- // Find the group's dn
- $group_info=$this->group_info($group,array("cn"));
- if ($group_info[0]["dn"]===NULL){ return (false); }
- $group_dn=$group_info[0]["dn"];
-
- $add=array();
- $add["member"] = $contact_dn;
-
- $result=@ldap_mod_add($this->_conn,$group_dn,$add);
- if ($result==false){ return (false); }
- return (true);
- }
-
- /**
- * Create a group
- *
- * @param array $attributes Default attributes of the group
- * @return bool
- */
- public function group_create($attributes){
- if (!is_array($attributes)){ return ("Attributes must be an array"); }
- if (!array_key_exists("group_name",$attributes)){ return ("Missing compulsory field [group_name]"); }
- if (!array_key_exists("container",$attributes)){ return ("Missing compulsory field [container]"); }
- if (!array_key_exists("description",$attributes)){ return ("Missing compulsory field [description]"); }
- if (!is_array($attributes["container"])){ return ("Container attribute must be an array."); }
- $attributes["container"]=array_reverse($attributes["container"]);
-
- //$member_array = array();
- //$member_array[0] = "cn=user1,cn=Users,dc=yourdomain,dc=com";
- //$member_array[1] = "cn=administrator,cn=Users,dc=yourdomain,dc=com";
-
- $add=array();
- $add["cn"] = $attributes["group_name"];
- $add["samaccountname"] = $attributes["group_name"];
- $add["objectClass"] = "Group";
- $add["description"] = $attributes["description"];
- //$add["member"] = $member_array; UNTESTED
-
- $container="OU=".implode(",OU=",$attributes["container"]);
- $result=ldap_add($this->_conn,"CN=".$add["cn"].", ".$container.",".$this->_base_dn,$add);
- if ($result!=true){ return (false); }
-
- return (true);
- }
-
- /**
- * Remove a group from a group
- *
- * @param string $parent The parent group name
- * @param string $child The child group name
- * @return bool
- */
- public function group_del_group($parent,$child){
-
- // Find the parent dn
- $parent_group=$this->group_info($parent,array("cn"));
- if ($parent_group[0]["dn"]===NULL){ return (false); }
- $parent_dn=$parent_group[0]["dn"];
-
- // Find the child dn
- $child_group=$this->group_info($child,array("cn"));
- if ($child_group[0]["dn"]===NULL){ return (false); }
- $child_dn=$child_group[0]["dn"];
-
- $del=array();
- $del["member"] = $child_dn;
-
- $result=@ldap_mod_del($this->_conn,$parent_dn,$del);
- if ($result==false){ return (false); }
- return (true);
- }
-
- /**
- * Remove a user from a group
- *
- * @param string $group The group to remove a user from
- * @param string $user The AD user to remove from the group
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function group_del_user($group,$user,$isGUID=false){
-
- // Find the parent dn
- $group_info=$this->group_info($group,array("cn"));
- if ($group_info[0]["dn"]===NULL){ return (false); }
- $group_dn=$group_info[0]["dn"];
-
- // Find the users dn
- $user_dn=$this->user_dn($user,$isGUID);
- if ($user_dn===false){ return (false); }
-
- $del=array();
- $del["member"] = $user_dn;
-
- $result=@ldap_mod_del($this->_conn,$group_dn,$del);
- if ($result==false){ return (false); }
- return (true);
- }
-
- /**
- * Remove a contact from a group
- *
- * @param string $group The group to remove a user from
- * @param string $contact_dn The DN of a contact to remove from the group
- * @return bool
- */
- public function group_del_contact($group,$contact_dn){
-
- // Find the parent dn
- $group_info=$this->group_info($group,array("cn"));
- if ($group_info[0]["dn"]===NULL){ return (false); }
- $group_dn=$group_info[0]["dn"];
-
- $del=array();
- $del["member"] = $contact_dn;
-
- $result=@ldap_mod_del($this->_conn,$group_dn,$del);
- if ($result==false){ return (false); }
- return (true);
- }
-
- /**
- * Return a list of groups in a group
- *
- * @param string $group The group to query
- * @param bool $recursive Recursively get groups
- * @return array
- */
- public function groups_in_group($group, $recursive = NULL){
- if (!$this->_bind){ return (false); }
- if ($recursive===NULL){ $recursive=$this->_recursive_groups; } // Use the default option if they haven't set it
-
- // Search the directory for the members of a group
- $info=$this->group_info($group,array("member","cn"));
- $groups=$info[0]["member"];
- if (!is_array($groups)) {
- return (false);
- }
-
- $group_array=array();
-
- for ($i=0; $i<$groups["count"]; $i++){
- $filter="(&(objectCategory=group)(distinguishedName=".$this->ldap_slashes($groups[$i])."))";
- $fields = array("samaccountname", "distinguishedname", "objectClass");
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
-
- // not a person, look for a group
- if ($entries['count'] == 0 && $recursive == true) {
- $filter="(&(objectCategory=group)(distinguishedName=".$this->ldap_slashes($groups[$i])."))";
- $fields = array("distinguishedname");
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
- if (!isset($entries[0]['distinguishedname'][0])) {
- continue;
- }
- $sub_groups = $this->groups_in_group($entries[0]['distinguishedname'][0], $recursive);
- if (is_array($sub_groups)) {
- $group_array = array_merge($group_array, $sub_groups);
- $group_array = array_unique($group_array);
- }
- continue;
- }
-
- $group_array[] = $entries[0]['distinguishedname'][0];
- }
- return ($group_array);
- }
-
- /**
- * Return a list of members in a group
- *
- * @param string $group The group to query
- * @param bool $recursive Recursively get group members
- * @return array
- */
- public function group_members($group, $recursive = NULL){
- if (!$this->_bind){ return (false); }
- if ($recursive===NULL){ $recursive=$this->_recursive_groups; } // Use the default option if they haven't set it
- // Search the directory for the members of a group
- $info=$this->group_info($group,array("member","cn"));
- $users=$info[0]["member"];
- if (!is_array($users)) {
- return (false);
- }
-
- $user_array=array();
-
- for ($i=0; $i<$users["count"]; $i++){
- $filter="(&(objectCategory=person)(distinguishedName=".$this->ldap_slashes($users[$i])."))";
- $fields = array("samaccountname", "distinguishedname", "objectClass");
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
-
- // not a person, look for a group
- if ($entries['count'] == 0 && $recursive == true) {
- $filter="(&(objectCategory=group)(distinguishedName=".$this->ldap_slashes($users[$i])."))";
- $fields = array("samaccountname");
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
- if (!isset($entries[0]['samaccountname'][0])) {
- continue;
- }
- $sub_users = $this->group_members($entries[0]['samaccountname'][0], $recursive);
- if (is_array($sub_users)) {
- $user_array = array_merge($user_array, $sub_users);
- $user_array = array_unique($user_array);
- }
- continue;
- }
-
- if ($entries[0]['samaccountname'][0] === NULL && $entries[0]['distinguishedname'][0] !== NULL) {
- $user_array[] = $entries[0]['distinguishedname'][0];
- }
- elseif ($entries[0]['samaccountname'][0] !== NULL) {
- $user_array[] = $entries[0]['samaccountname'][0];
- }
- }
- return ($user_array);
- }
-
- /**
- * Group Information. Returns an array of information about a group.
- * The group name is case sensitive
- *
- * @param string $group_name The group name to retrieve info about
- * @param array $fields Fields to retrieve
- * @return array
- */
- public function group_info($group_name,$fields=NULL){
- if ($group_name===NULL){ return (false); }
- if (!$this->_bind){ return (false); }
-
- if (stristr($group_name, '+')) {
- $group_name=stripslashes($group_name);
- }
-
- $filter="(&(objectCategory=group)(name=".$this->ldap_slashes($group_name)."))";
- //echo ($filter."!!!<br>");
- if ($fields===NULL){ $fields=array("member","memberof","cn","description","distinguishedname","objectcategory","samaccountname"); }
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
- //print_r($entries);
- return ($entries);
- }
-
- /**
- * Return a complete list of "groups in groups"
- *
- * @param string $group The group to get the list from
- * @return array
- */
- public function recursive_groups($group){
- if ($group===NULL){ return (false); }
-
- $ret_groups=array();
-
- $groups=$this->group_info($group,array("memberof"));
- if (isset($groups[0]["memberof"]) && is_array($groups[0]["memberof"])) {
- $groups=$groups[0]["memberof"];
-
- if ($groups){
- $group_names=$this->nice_names($groups);
- $ret_groups=array_merge($ret_groups,$group_names); //final groups to return
-
- foreach ($group_names as $id => $group_name){
- $child_groups=$this->recursive_groups($group_name);
- $ret_groups=array_merge($ret_groups,$child_groups);
- }
- }
- }
-
- return ($ret_groups);
- }
-
- /**
- * Returns a complete list of the groups in AD based on a SAM Account Type
- *
- * @param string $samaccounttype The account type to return
- * @param bool $include_desc Whether to return a description
- * @param string $search Search parameters
- * @param bool $sorted Whether to sort the results
- * @return array
- */
- public function search_groups($samaccounttype = ADLDAP_SECURITY_GLOBAL_GROUP, $include_desc = false, $search = "*", $sorted = true) {
- if (!$this->_bind){ return (false); }
-
- $filter = '(&(objectCategory=group)';
- if ($samaccounttype !== null) {
- $filter .= '(samaccounttype='. $samaccounttype .')';
- }
- $filter .= '(cn='.$search.'))';
- // Perform the search and grab all their details
- $fields=array("samaccountname","description");
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
-
- $groups_array = array();
- for ($i=0; $i<$entries["count"]; $i++){
- if ($include_desc && strlen($entries[$i]["description"][0]) > 0 ){
- $groups_array[ $entries[$i]["samaccountname"][0] ] = $entries[$i]["description"][0];
- } elseif ($include_desc){
- $groups_array[ $entries[$i]["samaccountname"][0] ] = $entries[$i]["samaccountname"][0];
- } else {
- array_push($groups_array, $entries[$i]["samaccountname"][0]);
- }
- }
- if( $sorted ){ asort($groups_array); }
- return ($groups_array);
- }
-
- /**
- * Returns a complete list of all groups in AD
- *
- * @param bool $include_desc Whether to return a description
- * @param string $search Search parameters
- * @param bool $sorted Whether to sort the results
- * @return array
- */
- public function all_groups($include_desc = false, $search = "*", $sorted = true){
- $groups_array = $this->search_groups(null, $include_desc, $search, $sorted);
- return ($groups_array);
- }
-
- /**
- * Returns a complete list of security groups in AD
- *
- * @param bool $include_desc Whether to return a description
- * @param string $search Search parameters
- * @param bool $sorted Whether to sort the results
- * @return array
- */
- public function all_security_groups($include_desc = false, $search = "*", $sorted = true){
- $groups_array = $this->search_groups(ADLDAP_SECURITY_GLOBAL_GROUP, $include_desc, $search, $sorted);
- return ($groups_array);
- }
-
- /**
- * Returns a complete list of distribution lists in AD
- *
- * @param bool $include_desc Whether to return a description
- * @param string $search Search parameters
- * @param bool $sorted Whether to sort the results
- * @return array
- */
- public function all_distribution_groups($include_desc = false, $search = "*", $sorted = true){
- $groups_array = $this->search_groups(ADLDAP_DISTRIBUTION_GROUP, $include_desc, $search, $sorted);
- return ($groups_array);
- }
-
- //*****************************************************************************************************************
- // USER FUNCTIONS
-
- /**
- * Create a user
- *
- * If you specify a password here, this can only be performed over SSL
- *
- * @param array $attributes The attributes to set to the user account
- * @return bool
- */
- public function user_create($attributes){
- // Check for compulsory fields
- if (!array_key_exists("username",$attributes)){ return ("Missing compulsory field [username]"); }
- if (!array_key_exists("firstname",$attributes)){ return ("Missing compulsory field [firstname]"); }
- if (!array_key_exists("surname",$attributes)){ return ("Missing compulsory field [surname]"); }
- if (!array_key_exists("email",$attributes)){ return ("Missing compulsory field [email]"); }
- if (!array_key_exists("container",$attributes)){ return ("Missing compulsory field [container]"); }
- if (!is_array($attributes["container"])){ return ("Container attribute must be an array."); }
-
- if (array_key_exists("password",$attributes) && (!$this->_use_ssl && !$this->_use_tls)){
- throw new adLDAPException('SSL must be configured on your webserver and enabled in the class to set passwords.');
- }
-
- if (!array_key_exists("display_name",$attributes)){ $attributes["display_name"]=$attributes["firstname"]." ".$attributes["surname"]; }
-
- // Translate the schema
- $add=$this->adldap_schema($attributes);
-
- // Additional stuff only used for adding accounts
- $add["cn"][0]=$attributes["display_name"];
- $add["samaccountname"][0]=$attributes["username"];
- $add["objectclass"][0]="top";
- $add["objectclass"][1]="person";
- $add["objectclass"][2]="organizationalPerson";
- $add["objectclass"][3]="user"; //person?
- //$add["name"][0]=$attributes["firstname"]." ".$attributes["surname"];
-
- // Set the account control attribute
- $control_options=array("NORMAL_ACCOUNT");
- if (!$attributes["enabled"]){ $control_options[]="ACCOUNTDISABLE"; }
- $add["userAccountControl"][0]=$this->account_control($control_options);
- //echo ("<pre>"); print_r($add);
-
- // Determine the container
- $attributes["container"]=array_reverse($attributes["container"]);
- $container="OU=".implode(",OU=",$attributes["container"]);
-
- // Add the entry
- $result=@ldap_add($this->_conn, "CN=".$add["cn"][0].", ".$container.",".$this->_base_dn, $add);
- if ($result!=true){ return (false); }
-
- return (true);
- }
-
- /**
- * Delete a user account
- *
- * @param string $username The username to delete (please be careful here!)
- * @param bool $isGUID Is the username a GUID or a samAccountName
- * @return array
- */
- public function user_delete($username,$isGUID=false) {
- $userinfo = $this->user_info($username, array("*"),$isGUID);
- $dn = $userinfo[0]['distinguishedname'][0];
- $result=$this->dn_delete($dn);
- if ($result!=true){ return (false); }
- return (true);
- }
-
- /**
- * Groups the user is a member of
- *
- * @param string $username The username to query
- * @param bool $recursive Recursive list of groups
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return array
- */
- public function user_groups($username,$recursive=NULL,$isGUID=false){
- if ($username===NULL){ return (false); }
- if ($recursive===NULL){ $recursive=$this->_recursive_groups; } // Use the default option if they haven't set it
- if (!$this->_bind){ return (false); }
-
- // Search the directory for their information
- $info=@$this->user_info($username,array("memberof","primarygroupid"),$isGUID);
- $groups=$this->nice_names($info[0]["memberof"]); // Presuming the entry returned is our guy (unique usernames)
-
- if ($recursive === true){
- foreach ($groups as $id => $group_name){
- $extra_groups=$this->recursive_groups($group_name);
- $groups=array_merge($groups,$extra_groups);
- }
- }
-
- return ($groups);
- }
-
- /**
- * Find information about the users
- *
- * @param string $username The username to query
- * @param array $fields Array of parameters to query
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return array
- */
- public function user_info($username,$fields=NULL,$isGUID=false){
- if ($username===NULL){ return (false); }
- if (!$this->_bind){ return (false); }
-
- if ($isGUID === true) {
- $username = $this->strguid2hex($username);
- $filter="objectguid=".$username;
- }
- else if (strstr($username, "@")) {
- $filter="userPrincipalName=".$username;
- }
- else {
- $filter="samaccountname=".$username;
- }
- $filter = "(&(objectCategory=person)({$filter}))";
- if ($fields===NULL){ $fields=array("samaccountname","mail","memberof","department","displayname","telephonenumber","primarygroupid","objectsid"); }
- if (!in_array("objectsid",$fields)){
- $fields[] = "objectsid";
- }
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
-
- if (isset($entries[0])) {
- if ($entries[0]['count'] >= 1) {
- if (in_array("memberof", $fields)) {
- // AD does not return the primary group in the ldap query, we may need to fudge it
- if ($this->_real_primarygroup && isset($entries[0]["primarygroupid"][0]) && isset($entries[0]["objectsid"][0])){
- //$entries[0]["memberof"][]=$this->group_cn($entries[0]["primarygroupid"][0]);
- $entries[0]["memberof"][]=$this->get_primary_group($entries[0]["primarygroupid"][0], $entries[0]["objectsid"][0]);
- } else {
- $entries[0]["memberof"][]="CN=Domain Users,CN=Users,".$this->_base_dn;
- }
- $entries[0]["memberof"]["count"]++;
- }
- }
- return $entries;
- }
- return false;
- }
-
- /**
- * Determine if a user is in a specific group
- *
- * @param string $username The username to query
- * @param string $group The name of the group to check against
- * @param bool $recursive Check groups recursively
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function user_ingroup($username,$group,$recursive=NULL,$isGUID=false){
- if ($username===NULL){ return (false); }
- if ($group===NULL){ return (false); }
- if (!$this->_bind){ return (false); }
- if ($recursive===NULL){ $recursive=$this->_recursive_groups; } // Use the default option if they haven't set it
-
- // Get a list of the groups
- $groups=$this->user_groups($username,$recursive,$isGUID);
-
- // Return true if the specified group is in the group list
- if (in_array($group,$groups)){ return (true); }
-
- return (false);
- }
-
- /**
- * Determine a user's password expiry date
- *
- * @param string $username The username to query
- * @param book $isGUID Is the username passed a GUID or a samAccountName
- * @requires bcmath http://www.php.net/manual/en/book.bc.php
- * @return array
- */
- public function user_password_expiry($username,$isGUID=false) {
- if ($username===NULL){ return ("Missing compulsory field [username]"); }
- if (!$this->_bind){ return (false); }
- if (!function_exists('bcmod')) { return ("Missing function support [bcmod] http://www.php.net/manual/en/book.bc.php"); };
-
- $userinfo = $this->user_info($username, array("pwdlastset", "useraccountcontrol"), $isGUID);
- $pwdlastset = $userinfo[0]['pwdlastset'][0];
- $status = array();
-
- if ($userinfo[0]['useraccountcontrol'][0] == '66048') {
- // Password does not expire
- return "Does not expire";
- }
- if ($pwdlastset === '0') {
- // Password has already expired
- return "Password has expired";
- }
-
- // Password expiry in AD can be calculated from TWO values:
- // - User's own pwdLastSet attribute: stores the last time the password was changed
- // - Domain's maxPwdAge attribute: how long passwords last in the domain
- //
- // Although Microsoft chose to use a different base and unit for time measurements.
- // This function will convert them to Unix timestamps
- $sr = ldap_read($this->_conn, $this->_base_dn, 'objectclass=*', array('maxPwdAge'));
- if (!$sr) {
- return false;
- }
- $info = ldap_get_entries($this->_conn, $sr);
- $maxpwdage = $info[0]['maxpwdage'][0];
-
-
- // See MSDN: http://msdn.microsoft.com/en-us/library/ms974598.aspx
- //
- // pwdLastSet contains the number of 100 nanosecond intervals since January 1, 1601 (UTC),
- // stored in a 64 bit integer.
- //
- // The number of seconds between this date and Unix epoch is 11644473600.
- //
- // maxPwdAge is stored as a large integer that represents the number of 100 nanosecond
- // intervals from the time the password was set before the password expires.
- //
- // We also need to scale this to seconds but also this value is a _negative_ quantity!
- //
- // If the low 32 bits of maxPwdAge are equal to 0 passwords do not expire
- //
- // Unfortunately the maths involved are too big for PHP integers, so I've had to require
- // BCMath functions to work with arbitrary precision numbers.
- if (bcmod($maxpwdage, 4294967296) === '0') {
- return "Domain does not expire passwords";
- }
-
- // Add maxpwdage and pwdlastset and we get password expiration time in Microsoft's
- // time units. Because maxpwd age is negative we need to subtract it.
- $pwdexpire = bcsub($pwdlastset, $maxpwdage);
-
- // Convert MS's time to Unix time
- $status['expiryts'] = bcsub(bcdiv($pwdexpire, '10000000'), '11644473600');
- $status['expiryformat'] = date('Y-m-d H:i:s', bcsub(bcdiv($pwdexpire, '10000000'), '11644473600'));
-
- return $status;
- }
-
- /**
- * Modify a user
- *
- * @param string $username The username to query
- * @param array $attributes The attributes to modify. Note if you set the enabled attribute you must not specify any other attributes
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function user_modify($username,$attributes,$isGUID=false){
- if ($username===NULL){ return ("Missing compulsory field [username]"); }
- if (array_key_exists("password",$attributes) && !$this->_use_ssl){
- throw new adLDAPException('SSL must be configured on your webserver and enabled in the class to set passwords.');
- }
-
- // Find the dn of the user
- $user_dn=$this->user_dn($username,$isGUID);
- if ($user_dn===false){ return (false); }
-
- // Translate the update to the LDAP schema
- $mod=$this->adldap_schema($attributes);
-
- // Check to see if this is an enabled status update
- if (!$mod && !array_key_exists("enabled", $attributes)){ return (false); }
-
- // Set the account control attribute (only if specified)
- if (array_key_exists("enabled",$attributes)){
- if ($attributes["enabled"]){ $control_options=array("NORMAL_ACCOUNT"); }
- else { $control_options=array("NORMAL_ACCOUNT","ACCOUNTDISABLE"); }
- $mod["userAccountControl"][0]=$this->account_control($control_options);
- }
-
- // Do the update
- $result=@ldap_modify($this->_conn,$user_dn,$mod);
- if ($result==false){ return (false); }
-
- return (true);
- }
-
- /**
- * Disable a user account
- *
- * @param string $username The username to disable
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function user_disable($username,$isGUID=false){
- if ($username===NULL){ return ("Missing compulsory field [username]"); }
- $attributes=array("enabled"=>0);
- $result = $this->user_modify($username, $attributes, $isGUID);
- if ($result==false){ return (false); }
-
- return (true);
- }
-
- /**
- * Enable a user account
- *
- * @param string $username The username to enable
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function user_enable($username,$isGUID=false){
- if ($username===NULL){ return ("Missing compulsory field [username]"); }
- $attributes=array("enabled"=>1);
- $result = $this->user_modify($username, $attributes, $isGUID);
- if ($result==false){ return (false); }
-
- return (true);
- }
-
- /**
- * Set the password of a user - This must be performed over SSL
- *
- * @param string $username The username to modify
- * @param string $password The new password
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function user_password($username,$password,$isGUID=false){
- if ($username===NULL){ return (false); }
- if ($password===NULL){ return (false); }
- if (!$this->_bind){ return (false); }
- if (!$this->_use_ssl && !$this->_use_tls){
- throw new adLDAPException('SSL must be configured on your webserver and enabled in the class to set passwords.');
- }
-
- $user_dn=$this->user_dn($username,$isGUID);
- if ($user_dn===false){ return (false); }
-
- $add=array();
- $add["unicodePwd"][0]=$this->encode_password($password);
-
- $result=@ldap_mod_replace($this->_conn,$user_dn,$add);
- if ($result==false){
- $err = ldap_errno($this->_conn);
- if($err){
- $msg = 'Error '.$err.': '.ldap_err2str($err).'.';
- if($err == 53) $msg .= ' Your password might not match the password policy.';
- throw new adLDAPException($msg);
- }else{
- return false;
- }
- }
-
- return (true);
- }
-
- /**
- * Return a list of all users in AD
- *
- * @param bool $include_desc Return a description of the user
- * @param string $search Search parameter
- * @param bool $sorted Sort the user accounts
- * @return array
- */
- public function all_users($include_desc = false, $search = "*", $sorted = true){
- if (!$this->_bind){ return (false); }
-
- // Perform the search and grab all their details
- $filter = "(&(objectClass=user)(samaccounttype=". ADLDAP_NORMAL_ACCOUNT .")(objectCategory=person)(cn=".$search."))";
- $fields=array("samaccountname","displayname");
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
-
- $users_array = array();
- for ($i=0; $i<$entries["count"]; $i++){
- if ($include_desc && strlen($entries[$i]["displayname"][0])>0){
- $users_array[ $entries[$i]["samaccountname"][0] ] = $entries[$i]["displayname"][0];
- } elseif ($include_desc){
- $users_array[ $entries[$i]["samaccountname"][0] ] = $entries[$i]["samaccountname"][0];
- } else {
- array_push($users_array, $entries[$i]["samaccountname"][0]);
- }
- }
- if ($sorted){ asort($users_array); }
- return ($users_array);
- }
-
- /**
- * Converts a username (samAccountName) to a GUID
- *
- * @param string $username The username to query
- * @return string
- */
- public function username2guid($username) {
- if (!$this->_bind){ return (false); }
- if ($username === null){ return ("Missing compulsory field [username]"); }
-
- $filter = "samaccountname=" . $username;
- $fields = array("objectGUID");
- $sr = @ldap_search($this->_conn, $this->_base_dn, $filter, $fields);
- if (ldap_count_entries($this->_conn, $sr) > 0) {
- $entry = @ldap_first_entry($this->_conn, $sr);
- $guid = @ldap_get_values_len($this->_conn, $entry, 'objectGUID');
- $strGUID = $this->binary2text($guid[0]);
- return ($strGUID);
- }
- else {
- return (false);
- }
- }
-
- /**
- * Move a user account to a different OU
- *
- * @param string $username The username to move (please be careful here!)
- * @param array $container The container or containers to move the user to (please be careful here!).
- * accepts containers in 1. parent 2. child order
- * @return array
- */
- public function user_move($username, $container) {
- if (!$this->_bind){ return (false); }
- if ($username === null){ return ("Missing compulsory field [username]"); }
- if ($container === null){ return ("Missing compulsory field [container]"); }
- if (!is_array($container)){ return ("Container must be an array"); }
-
- $userinfo = $this->user_info($username, array("*"));
- $dn = $userinfo[0]['distinguishedname'][0];
- $newrdn = "cn=" . $username;
- $container = array_reverse($container);
- $newcontainer = "ou=" . implode(",ou=",$container);
- $newbasedn = strtolower($newcontainer) . "," . $this->_base_dn;
- $result=@ldap_rename($this->_conn,$dn,$newrdn,$newbasedn,true);
- if ($result !== true) {
- return (false);
- }
- return (true);
- }
-
- //*****************************************************************************************************************
- // CONTACT FUNCTIONS
- // * Still work to do in this area, and new functions to write
-
- /**
- * Create a contact
- *
- * @param array $attributes The attributes to set to the contact
- * @return bool
- */
- public function contact_create($attributes){
- // Check for compulsory fields
- if (!array_key_exists("display_name",$attributes)){ return ("Missing compulsory field [display_name]"); }
- if (!array_key_exists("email",$attributes)){ return ("Missing compulsory field [email]"); }
- if (!array_key_exists("container",$attributes)){ return ("Missing compulsory field [container]"); }
- if (!is_array($attributes["container"])){ return ("Container attribute must be an array."); }
-
- // Translate the schema
- $add=$this->adldap_schema($attributes);
-
- // Additional stuff only used for adding contacts
- $add["cn"][0]=$attributes["display_name"];
- $add["objectclass"][0]="top";
- $add["objectclass"][1]="person";
- $add["objectclass"][2]="organizationalPerson";
- $add["objectclass"][3]="contact";
- if (!isset($attributes['exchange_hidefromlists'])) {
- $add["msExchHideFromAddressLists"][0]="TRUE";
- }
-
- // Determine the container
- $attributes["container"]=array_reverse($attributes["container"]);
- $container="OU=".implode(",OU=",$attributes["container"]);
-
- // Add the entry
- $result=@ldap_add($this->_conn, "CN=".$add["cn"][0].", ".$container.",".$this->_base_dn, $add);
- if ($result!=true){ return (false); }
-
- return (true);
- }
-
- /**
- * Determine the list of groups a contact is a member of
- *
- * @param string $distinguisedname The full DN of a contact
- * @param bool $recursive Recursively check groups
- * @return array
- */
- public function contact_groups($distinguishedname,$recursive=NULL){
- if ($distinguishedname===NULL){ return (false); }
- if ($recursive===NULL){ $recursive=$this->_recursive_groups; } //use the default option if they haven't set it
- if (!$this->_bind){ return (false); }
-
- // Search the directory for their information
- $info=@$this->contact_info($distinguishedname,array("memberof","primarygroupid"));
- $groups=$this->nice_names($info[0]["memberof"]); //presuming the entry returned is our contact
-
- if ($recursive === true){
- foreach ($groups as $id => $group_name){
- $extra_groups=$this->recursive_groups($group_name);
- $groups=array_merge($groups,$extra_groups);
- }
- }
-
- return ($groups);
- }
-
- /**
- * Get contact information
- *
- * @param string $distinguisedname The full DN of a contact
- * @param array $fields Attributes to be returned
- * @return array
- */
- public function contact_info($distinguishedname,$fields=NULL){
- if ($distinguishedname===NULL){ return (false); }
- if (!$this->_bind){ return (false); }
-
- $filter="distinguishedName=".$distinguishedname;
- if ($fields===NULL){ $fields=array("distinguishedname","mail","memberof","department","displayname","telephonenumber","primarygroupid","objectsid"); }
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
-
- if ($entries[0]['count'] >= 1) {
- // AD does not return the primary group in the ldap query, we may need to fudge it
- if ($this->_real_primarygroup && isset($entries[0]["primarygroupid"][0]) && isset($entries[0]["primarygroupid"][0])){
- //$entries[0]["memberof"][]=$this->group_cn($entries[0]["primarygroupid"][0]);
- $entries[0]["memberof"][]=$this->get_primary_group($entries[0]["primarygroupid"][0], $entries[0]["objectsid"][0]);
- } else {
- $entries[0]["memberof"][]="CN=Domain Users,CN=Users,".$this->_base_dn;
- }
- }
-
- $entries[0]["memberof"]["count"]++;
- return ($entries);
- }
-
- /**
- * Determine if a contact is a member of a group
- *
- * @param string $distinguisedname The full DN of a contact
- * @param string $group The group name to query
- * @param bool $recursive Recursively check groups
- * @return bool
- */
- public function contact_ingroup($distinguisedname,$group,$recursive=NULL){
- if ($distinguisedname===NULL){ return (false); }
- if ($group===NULL){ return (false); }
- if (!$this->_bind){ return (false); }
- if ($recursive===NULL){ $recursive=$this->_recursive_groups; } //use the default option if they haven't set it
-
- // Get a list of the groups
- $groups=$this->contact_groups($distinguisedname,array("memberof"),$recursive);
-
- // Return true if the specified group is in the group list
- if (in_array($group,$groups)){ return (true); }
-
- return (false);
- }
-
- /**
- * Modify a contact
- *
- * @param string $distinguishedname The contact to query
- * @param array $attributes The attributes to modify. Note if you set the enabled attribute you must not specify any other attributes
- * @return bool
- */
- public function contact_modify($distinguishedname,$attributes){
- if ($distinguishedname===NULL){ return ("Missing compulsory field [distinguishedname]"); }
-
- // Translate the update to the LDAP schema
- $mod=$this->adldap_schema($attributes);
-
- // Check to see if this is an enabled status update
- if (!$mod){ return (false); }
-
- // Do the update
- $result=ldap_modify($this->_conn,$distinguishedname,$mod);
- if ($result==false){ return (false); }
-
- return (true);
- }
-
- /**
- * Delete a contact
- *
- * @param string $distinguishedname The contact dn to delete (please be careful here!)
- * @return array
- */
- public function contact_delete($distinguishedname) {
- $result = $this->dn_delete($distinguishedname);
- if ($result!=true){ return (false); }
- return (true);
- }
-
- /**
- * Return a list of all contacts
- *
- * @param bool $include_desc Include a description of a contact
- * @param string $search The search parameters
- * @param bool $sorted Whether to sort the results
- * @return array
- */
- public function all_contacts($include_desc = false, $search = "*", $sorted = true){
- if (!$this->_bind){ return (false); }
-
- // Perform the search and grab all their details
- $filter = "(&(objectClass=contact)(cn=".$search."))";
- $fields=array("displayname","distinguishedname");
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
-
- $users_array = array();
- for ($i=0; $i<$entries["count"]; $i++){
- if ($include_desc && strlen($entries[$i]["displayname"][0])>0){
- $users_array[ $entries[$i]["distinguishedname"][0] ] = $entries[$i]["displayname"][0];
- } elseif ($include_desc){
- $users_array[ $entries[$i]["distinguishedname"][0] ] = $entries[$i]["distinguishedname"][0];
- } else {
- array_push($users_array, $entries[$i]["distinguishedname"][0]);
- }
- }
- if ($sorted){ asort($users_array); }
- return ($users_array);
- }
-
- //*****************************************************************************************************************
- // FOLDER FUNCTIONS
-
- /**
- * Returns a folder listing for a specific OU
- * See http://adldap.sourceforge.net/wiki/doku.php?id=api_folder_functions
- *
- * @param array $folder_name An array to the OU you wish to list.
- * If set to NULL will list the root, strongly recommended to set
- * $recursive to false in that instance!
- * @param string $dn_type The type of record to list. This can be ADLDAP_FOLDER or ADLDAP_CONTAINER.
- * @param bool $recursive Recursively search sub folders
- * @param bool $type Specify a type of object to search for
- * @return array
- */
- public function folder_list($folder_name = NULL, $dn_type = ADLDAP_FOLDER, $recursive = NULL, $type = NULL) {
- if ($recursive===NULL){ $recursive=$this->_recursive_groups; } //use the default option if they haven't set it
- if (!$this->_bind){ return (false); }
-
- $filter = '(&';
- if ($type !== NULL) {
- switch ($type) {
- case 'contact':
- $filter .= '(objectClass=contact)';
- break;
- case 'computer':
- $filter .= '(objectClass=computer)';
- break;
- case 'group':
- $filter .= '(objectClass=group)';
- break;
- case 'folder':
- $filter .= '(objectClass=organizationalUnit)';
- break;
- case 'container':
- $filter .= '(objectClass=container)';
- break;
- case 'domain':
- $filter .= '(objectClass=builtinDomain)';
- break;
- default:
- $filter .= '(objectClass=user)';
- break;
- }
- }
- else {
- $filter .= '(objectClass=*)';
- }
- // If the folder name is null then we will search the root level of AD
- // This requires us to not have an OU= part, just the base_dn
- $searchou = $this->_base_dn;
- if (is_array($folder_name)) {
- $ou = $dn_type . "=".implode("," . $dn_type . "=",$folder_name);
- $filter .= '(!(distinguishedname=' . $ou . ',' . $this->_base_dn . ')))';
- $searchou = $ou . ',' . $this->_base_dn;
- }
- else {
- $filter .= '(!(distinguishedname=' . $this->_base_dn . ')))';
- }
-
- if ($recursive === true) {
- $sr=ldap_search($this->_conn, $searchou, $filter, array('objectclass', 'distinguishedname', 'samaccountname'));
- $entries = @ldap_get_entries($this->_conn, $sr);
- if (is_array($entries)) {
- return $entries;
- }
- }
- else {
- $sr=ldap_list($this->_conn, $searchou, $filter, array('objectclass', 'distinguishedname', 'samaccountname'));
- $entries = @ldap_get_entries($this->_conn, $sr);
- if (is_array($entries)) {
- return $entries;
- }
- }
-
- return false;
- }
-
- //*****************************************************************************************************************
- // COMPUTER FUNCTIONS
-
- /**
- * Get information about a specific computer
- *
- * @param string $computer_name The name of the computer
- * @param array $fields Attributes to return
- * @return array
- */
- public function computer_info($computer_name,$fields=NULL){
- if ($computer_name===NULL){ return (false); }
- if (!$this->_bind){ return (false); }
-
- $filter="(&(objectClass=computer)(cn=".$computer_name."))";
- if ($fields===NULL){ $fields=array("memberof","cn","displayname","dnshostname","distinguishedname","objectcategory","operatingsystem","operatingsystemservicepack","operatingsystemversion"); }
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
-
- return ($entries);
- }
-
- /**
- * Check if a computer is in a group
- *
- * @param string $computer_name The name of the computer
- * @param string $group The group to check
- * @param bool $recursive Whether to check recursively
- * @return array
- */
- public function computer_ingroup($computer_name,$group,$recursive=NULL){
- if ($computer_name===NULL){ return (false); }
- if ($group===NULL){ return (false); }
- if (!$this->_bind){ return (false); }
- if ($recursive===NULL){ $recursive=$this->_recursive_groups; } // use the default option if they haven't set it
-
- //get a list of the groups
- $groups=$this->computer_groups($computer_name,array("memberof"),$recursive);
-
- //return true if the specified group is in the group list
- if (in_array($group,$groups)){ return (true); }
-
- return (false);
- }
-
- /**
- * Get the groups a computer is in
- *
- * @param string $computer_name The name of the computer
- * @param bool $recursive Whether to check recursively
- * @return array
- */
- public function computer_groups($computer_name,$recursive=NULL){
- if ($computer_name===NULL){ return (false); }
- if ($recursive===NULL){ $recursive=$this->_recursive_groups; } //use the default option if they haven't set it
- if (!$this->_bind){ return (false); }
-
- //search the directory for their information
- $info=@$this->computer_info($computer_name,array("memberof","primarygroupid"));
- $groups=$this->nice_names($info[0]["memberof"]); //presuming the entry returned is our guy (unique usernames)
-
- if ($recursive === true){
- foreach ($groups as $id => $group_name){
- $extra_groups=$this->recursive_groups($group_name);
- $groups=array_merge($groups,$extra_groups);
- }
- }
-
- return ($groups);
- }
-
- //************************************************************************************************************
- // ORGANIZATIONAL UNIT FUNCTIONS
-
- /**
- * Create an organizational unit
- *
- * @param array $attributes Default attributes of the ou
- * @return bool
- */
- public function ou_create($attributes){
- if (!is_array($attributes)){ return ("Attributes must be an array"); }
- if (!array_key_exists("ou_name",$attributes)){ return ("Missing compulsory field [ou_name]"); }
- if (!array_key_exists("container",$attributes)){ return ("Missing compulsory field [container]"); }
- if (!is_array($attributes["container"])){ return ("Container attribute must be an array."); }
- $attributes["container"]=array_reverse($attributes["container"]);
-
- $add=array();
- $add["objectClass"] = "organizationalUnit";
-
- $container="OU=".implode(",OU=",$attributes["container"]);
- $result=ldap_add($this->_conn,"CN=".$add["cn"].", ".$container.",".$this->_base_dn,$add);
- if ($result!=true){ return (false); }
-
- return (true);
- }
-
- //************************************************************************************************************
- // EXCHANGE FUNCTIONS
-
- /**
- * Create an Exchange account
- *
- * @param string $username The username of the user to add the Exchange account to
- * @param array $storagegroup The mailbox, Exchange Storage Group, for the user account, this must be a full CN
- * If the storage group has a different base_dn to the adLDAP configuration, set it using $base_dn
- * @param string $emailaddress The primary email address to add to this user
- * @param string $mailnickname The mail nick name. If mail nickname is blank, the username will be used
- * @param bool $usedefaults Indicates whether the store should use the default quota, rather than the per-mailbox quota.
- * @param string $base_dn Specify an alternative base_dn for the Exchange storage group
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function exchange_create_mailbox($username, $storagegroup, $emailaddress, $mailnickname=NULL, $usedefaults=TRUE, $base_dn=NULL, $isGUID=false){
- if ($username===NULL){ return ("Missing compulsory field [username]"); }
- if ($storagegroup===NULL){ return ("Missing compulsory array [storagegroup]"); }
- if (!is_array($storagegroup)){ return ("[storagegroup] must be an array"); }
- if ($emailaddress===NULL){ return ("Missing compulsory field [emailaddress]"); }
-
- if ($base_dn===NULL) {
- $base_dn = $this->_base_dn;
- }
-
- $container="CN=".implode(",CN=",$storagegroup);
-
- if ($mailnickname===NULL) { $mailnickname=$username; }
- $mdbUseDefaults = $this->bool2str($usedefaults);
-
- $attributes = array(
- 'exchange_homemdb'=>$container.",".$base_dn,
- 'exchange_proxyaddress'=>'SMTP:' . $emailaddress,
- 'exchange_mailnickname'=>$mailnickname,
- 'exchange_usedefaults'=>$mdbUseDefaults
- );
- $result = $this->user_modify($username,$attributes,$isGUID);
- if ($result==false){ return (false); }
- return (true);
- }
-
- /**
- * Add an X400 address to Exchange
- * See http://tools.ietf.org/html/rfc1685 for more information.
- * An X400 Address looks similar to this X400:c=US;a= ;p=Domain;o=Organization;s=Doe;g=John;
- *
- * @param string $username The username of the user to add the X400 to to
- * @param string $country Country
- * @param string $admd Administration Management Domain
- * @param string $pdmd Private Management Domain (often your AD domain)
- * @param string $org Organization
- * @param string $surname Surname
- * @param string $givenName Given name
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function exchange_add_X400($username, $country, $admd, $pdmd, $org, $surname, $givenname, $isGUID=false) {
- if ($username===NULL){ return ("Missing compulsory field [username]"); }
-
- $proxyvalue = 'X400:';
-
- // Find the dn of the user
- $user=$this->user_info($username,array("cn","proxyaddresses"), $isGUID);
- if ($user[0]["dn"]===NULL){ return (false); }
- $user_dn=$user[0]["dn"];
-
- // We do not have to demote an email address from the default so we can just add the new proxy address
- $attributes['exchange_proxyaddress'] = $proxyvalue . 'c=' . $country . ';a=' . $admd . ';p=' . $pdmd . ';o=' . $org . ';s=' . $surname . ';g=' . $givenname . ';';
-
- // Translate the update to the LDAP schema
- $add=$this->adldap_schema($attributes);
-
- if (!$add){ return (false); }
-
- // Do the update
- // Take out the @ to see any errors, usually this error might occur because the address already
- // exists in the list of proxyAddresses
- $result=@ldap_mod_add($this->_conn,$user_dn,$add);
- if ($result==false){ return (false); }
-
- return (true);
- }
-
- /**
- * Add an address to Exchange
- *
- * @param string $username The username of the user to add the Exchange account to
- * @param string $emailaddress The email address to add to this user
- * @param bool $default Make this email address the default address, this is a bit more intensive as we have to demote any existing default addresses
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function exchange_add_address($username, $emailaddress, $default=FALSE, $isGUID=false) {
- if ($username===NULL){ return ("Missing compulsory field [username]"); }
- if ($emailaddress===NULL) { return ("Missing compulsory fields [emailaddress]"); }
-
- $proxyvalue = 'smtp:';
- if ($default === true) {
- $proxyvalue = 'SMTP:';
- }
-
- // Find the dn of the user
- $user=$this->user_info($username,array("cn","proxyaddresses"),$isGUID);
- if ($user[0]["dn"]===NULL){ return (false); }
- $user_dn=$user[0]["dn"];
-
- // We need to scan existing proxy addresses and demote the default one
- if (is_array($user[0]["proxyaddresses"]) && $default===true) {
- $modaddresses = array();
- for ($i=0;$i<sizeof($user[0]['proxyaddresses']);$i++) {
- if (strstr($user[0]['proxyaddresses'][$i], 'SMTP:') !== false) {
- $user[0]['proxyaddresses'][$i] = str_replace('SMTP:', 'smtp:', $user[0]['proxyaddresses'][$i]);
- }
- if ($user[0]['proxyaddresses'][$i] != '') {
- $modaddresses['proxyAddresses'][$i] = $user[0]['proxyaddresses'][$i];
- }
- }
- $modaddresses['proxyAddresses'][(sizeof($user[0]['proxyaddresses'])-1)] = 'SMTP:' . $emailaddress;
-
- $result=@ldap_mod_replace($this->_conn,$user_dn,$modaddresses);
- if ($result==false){ return (false); }
-
- return (true);
- }
- else {
- // We do not have to demote an email address from the default so we can just add the new proxy address
- $attributes['exchange_proxyaddress'] = $proxyvalue . $emailaddress;
-
- // Translate the update to the LDAP schema
- $add=$this->adldap_schema($attributes);
-
- if (!$add){ return (false); }
-
- // Do the update
- // Take out the @ to see any errors, usually this error might occur because the address already
- // exists in the list of proxyAddresses
- $result=@ldap_mod_add($this->_conn,$user_dn,$add);
- if ($result==false){ return (false); }
-
- return (true);
- }
- }
-
- /**
- * Remove an address to Exchange
- * If you remove a default address the account will no longer have a default,
- * we recommend changing the default address first
- *
- * @param string $username The username of the user to add the Exchange account to
- * @param string $emailaddress The email address to add to this user
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function exchange_del_address($username, $emailaddress, $isGUID=false) {
- if ($username===NULL){ return ("Missing compulsory field [username]"); }
- if ($emailaddress===NULL) { return ("Missing compulsory fields [emailaddress]"); }
-
- // Find the dn of the user
- $user=$this->user_info($username,array("cn","proxyaddresses"),$isGUID);
- if ($user[0]["dn"]===NULL){ return (false); }
- $user_dn=$user[0]["dn"];
-
- if (is_array($user[0]["proxyaddresses"])) {
- $mod = array();
- for ($i=0;$i<sizeof($user[0]['proxyaddresses']);$i++) {
- if (strstr($user[0]['proxyaddresses'][$i], 'SMTP:') !== false && $user[0]['proxyaddresses'][$i] == 'SMTP:' . $emailaddress) {
- $mod['proxyAddresses'][0] = 'SMTP:' . $emailaddress;
- }
- elseif (strstr($user[0]['proxyaddresses'][$i], 'smtp:') !== false && $user[0]['proxyaddresses'][$i] == 'smtp:' . $emailaddress) {
- $mod['proxyAddresses'][0] = 'smtp:' . $emailaddress;
- }
- }
-
- $result=@ldap_mod_del($this->_conn,$user_dn,$mod);
- if ($result==false){ return (false); }
-
- return (true);
- }
- else {
- return (false);
- }
- }
- /**
- * Change the default address
- *
- * @param string $username The username of the user to add the Exchange account to
- * @param string $emailaddress The email address to make default
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return bool
- */
- public function exchange_primary_address($username, $emailaddress, $isGUID=false) {
- if ($username===NULL){ return ("Missing compulsory field [username]"); }
- if ($emailaddress===NULL) { return ("Missing compulsory fields [emailaddress]"); }
-
- // Find the dn of the user
- $user=$this->user_info($username,array("cn","proxyaddresses"), $isGUID);
- if ($user[0]["dn"]===NULL){ return (false); }
- $user_dn=$user[0]["dn"];
-
- if (is_array($user[0]["proxyaddresses"])) {
- $modaddresses = array();
- for ($i=0;$i<sizeof($user[0]['proxyaddresses']);$i++) {
- if (strstr($user[0]['proxyaddresses'][$i], 'SMTP:') !== false) {
- $user[0]['proxyaddresses'][$i] = str_replace('SMTP:', 'smtp:', $user[0]['proxyaddresses'][$i]);
- }
- if ($user[0]['proxyaddresses'][$i] == 'smtp:' . $emailaddress) {
- $user[0]['proxyaddresses'][$i] = str_replace('smtp:', 'SMTP:', $user[0]['proxyaddresses'][$i]);
- }
- if ($user[0]['proxyaddresses'][$i] != '') {
- $modaddresses['proxyAddresses'][$i] = $user[0]['proxyaddresses'][$i];
- }
- }
-
- $result=@ldap_mod_replace($this->_conn,$user_dn,$modaddresses);
- if ($result==false){ return (false); }
-
- return (true);
- }
-
- }
-
- /**
- * Mail enable a contact
- * Allows email to be sent to them through Exchange
- *
- * @param string $distinguishedname The contact to mail enable
- * @param string $emailaddress The email address to allow emails to be sent through
- * @param string $mailnickname The mailnickname for the contact in Exchange. If NULL this will be set to the display name
- * @return bool
- */
- public function exchange_contact_mailenable($distinguishedname, $emailaddress, $mailnickname=NULL){
- if ($distinguishedname===NULL){ return ("Missing compulsory field [distinguishedname]"); }
- if ($emailaddress===NULL){ return ("Missing compulsory field [emailaddress]"); }
-
- if ($mailnickname !== NULL) {
- // Find the dn of the user
- $user=$this->contact_info($distinguishedname,array("cn","displayname"));
- if ($user[0]["displayname"]===NULL){ return (false); }
- $mailnickname = $user[0]['displayname'][0];
- }
-
- $attributes = array("email"=>$emailaddress,"contact_email"=>"SMTP:" . $emailaddress,"exchange_proxyaddress"=>"SMTP:" . $emailaddress,"exchange_mailnickname"=>$mailnickname);
-
- // Translate the update to the LDAP schema
- $mod=$this->adldap_schema($attributes);
-
- // Check to see if this is an enabled status update
- if (!$mod){ return (false); }
-
- // Do the update
- $result=ldap_modify($this->_conn,$distinguishedname,$mod);
- if ($result==false){ return (false); }
-
- return (true);
- }
-
- /**
- * Returns a list of Exchange Servers in the ConfigurationNamingContext of the domain
- *
- * @param array $attributes An array of the AD attributes you wish to return
- * @return array
- */
- public function exchange_servers($attributes = array('cn','distinguishedname','serialnumber')) {
- if (!$this->_bind){ return (false); }
-
- $configurationNamingContext = $this->get_root_dse(array('configurationnamingcontext'));
- $sr = @ldap_search($this->_conn,$configurationNamingContext[0]['configurationnamingcontext'][0],'(&(objectCategory=msExchExchangeServer))',$attributes);
- $entries = @ldap_get_entries($this->_conn, $sr);
- return $entries;
- }
-
- /**
- * Returns a list of Storage Groups in Exchange for a given mail server
- *
- * @param string $exchangeServer The full DN of an Exchange server. You can use exchange_servers() to find the DN for your server
- * @param array $attributes An array of the AD attributes you wish to return
- * @param bool $recursive If enabled this will automatically query the databases within a storage group
- * @return array
- */
- public function exchange_storage_groups($exchangeServer, $attributes = array('cn','distinguishedname'), $recursive = NULL) {
- if (!$this->_bind){ return (false); }
- if ($exchangeServer===NULL){ return ("Missing compulsory field [exchangeServer]"); }
- if ($recursive===NULL){ $recursive=$this->_recursive_groups; }
-
- $filter = '(&(objectCategory=msExchStorageGroup))';
- $sr=@ldap_search($this->_conn, $exchangeServer, $filter, $attributes);
- $entries = @ldap_get_entries($this->_conn, $sr);
-
- if ($recursive === true) {
- for ($i=0; $i<$entries['count']; $i++) {
- $entries[$i]['msexchprivatemdb'] = $this->exchange_storage_databases($entries[$i]['distinguishedname'][0]);
- }
- }
-
- return $entries;
- }
-
- /**
- * Returns a list of Databases within any given storage group in Exchange for a given mail server
- *
- * @param string $storageGroup The full DN of an Storage Group. You can use exchange_storage_groups() to find the DN
- * @param array $attributes An array of the AD attributes you wish to return
- * @return array
- */
- public function exchange_storage_databases($storageGroup, $attributes = array('cn','distinguishedname','displayname')) {
- if (!$this->_bind){ return (false); }
- if ($storageGroup===NULL){ return ("Missing compulsory field [storageGroup]"); }
-
- $filter = '(&(objectCategory=msExchPrivateMDB))';
- $sr=@ldap_search($this->_conn, $storageGroup, $filter, $attributes);
- $entries = @ldap_get_entries($this->_conn, $sr);
- return $entries;
- }
-
- //************************************************************************************************************
- // SERVER FUNCTIONS
-
- /**
- * Find the Base DN of your domain controller
- *
- * @return string
- */
- public function find_base_dn() {
- $namingContext = $this->get_root_dse(array('defaultnamingcontext'));
- return $namingContext[0]['defaultnamingcontext'][0];
- }
-
- /**
- * Get the RootDSE properties from a domain controller
- *
- * @param array $attributes The attributes you wish to query e.g. defaultnamingcontext
- * @return array
- */
- public function get_root_dse($attributes = array("*", "+")) {
- if (!$this->_bind){ return (false); }
-
- $sr = @ldap_read($this->_conn, NULL, 'objectClass=*', $attributes);
- $entries = @ldap_get_entries($this->_conn, $sr);
- return $entries;
- }
-
- //************************************************************************************************************
- // UTILITY FUNCTIONS (Many of these functions are protected and can only be called from within the class)
-
- /**
- * Get last error from Active Directory
- *
- * This function gets the last message from Active Directory
- * This may indeed be a 'Success' message but if you get an unknown error
- * it might be worth calling this function to see what errors were raised
- *
- * return string
- */
- public function get_last_error() {
- return @ldap_error($this->_conn);
- }
-
- /**
- * Detect LDAP support in php
- *
- * @return bool
- */
- protected function ldap_supported() {
- if (!function_exists('ldap_connect')) {
- return (false);
- }
- return (true);
- }
-
- /**
- * Schema
- *
- * @param array $attributes Attributes to be queried
- * @return array
- */
- protected function adldap_schema($attributes){
-
- // LDAP doesn't like NULL attributes, only set them if they have values
- // If you wish to remove an attribute you should set it to a space
- // TO DO: Adapt user_modify to use ldap_mod_delete to remove a NULL attribute
- $mod=array();
-
- // Check every attribute to see if it contains 8bit characters and then UTF8 encode them
- array_walk($attributes, array($this, 'encode8bit'));
-
- if ($attributes["address_city"]){ $mod["l"][0]=$attributes["address_city"]; }
- if ($attributes["address_code"]){ $mod["postalCode"][0]=$attributes["address_code"]; }
- //if ($attributes["address_country"]){ $mod["countryCode"][0]=$attributes["address_country"]; } // use country codes?
- if ($attributes["address_country"]){ $mod["c"][0]=$attributes["address_country"]; }
- if ($attributes["address_pobox"]){ $mod["postOfficeBox"][0]=$attributes["address_pobox"]; }
- if ($attributes["address_state"]){ $mod["st"][0]=$attributes["address_state"]; }
- if ($attributes["address_street"]){ $mod["streetAddress"][0]=$attributes["address_street"]; }
- if ($attributes["company"]){ $mod["company"][0]=$attributes["company"]; }
- if ($attributes["change_password"]){ $mod["pwdLastSet"][0]=0; }
- if ($attributes["department"]){ $mod["department"][0]=$attributes["department"]; }
- if ($attributes["description"]){ $mod["description"][0]=$attributes["description"]; }
- if ($attributes["display_name"]){ $mod["displayName"][0]=$attributes["display_name"]; }
- if ($attributes["email"]){ $mod["mail"][0]=$attributes["email"]; }
- if ($attributes["expires"]){ $mod["accountExpires"][0]=$attributes["expires"]; } //unix epoch format?
- if ($attributes["firstname"]){ $mod["givenName"][0]=$attributes["firstname"]; }
- if ($attributes["home_directory"]){ $mod["homeDirectory"][0]=$attributes["home_directory"]; }
- if ($attributes["home_drive"]){ $mod["homeDrive"][0]=$attributes["home_drive"]; }
- if ($attributes["initials"]){ $mod["initials"][0]=$attributes["initials"]; }
- if ($attributes["logon_name"]){ $mod["userPrincipalName"][0]=$attributes["logon_name"]; }
- if ($attributes["manager"]){ $mod["manager"][0]=$attributes["manager"]; } //UNTESTED ***Use DistinguishedName***
- if ($attributes["office"]){ $mod["physicalDeliveryOfficeName"][0]=$attributes["office"]; }
- if ($attributes["password"]){ $mod["unicodePwd"][0]=$this->encode_password($attributes["password"]); }
- if ($attributes["profile_path"]){ $mod["profilepath"][0]=$attributes["profile_path"]; }
- if ($attributes["script_path"]){ $mod["scriptPath"][0]=$attributes["script_path"]; }
- if ($attributes["surname"]){ $mod["sn"][0]=$attributes["surname"]; }
- if ($attributes["title"]){ $mod["title"][0]=$attributes["title"]; }
- if ($attributes["telephone"]){ $mod["telephoneNumber"][0]=$attributes["telephone"]; }
- if ($attributes["mobile"]){ $mod["mobile"][0]=$attributes["mobile"]; }
- if ($attributes["pager"]){ $mod["pager"][0]=$attributes["pager"]; }
- if ($attributes["ipphone"]){ $mod["ipphone"][0]=$attributes["ipphone"]; }
- if ($attributes["web_page"]){ $mod["wWWHomePage"][0]=$attributes["web_page"]; }
- if ($attributes["fax"]){ $mod["facsimileTelephoneNumber"][0]=$attributes["fax"]; }
- if ($attributes["enabled"]){ $mod["userAccountControl"][0]=$attributes["enabled"]; }
-
- // Distribution List specific schema
- if ($attributes["group_sendpermission"]){ $mod["dlMemSubmitPerms"][0]=$attributes["group_sendpermission"]; }
- if ($attributes["group_rejectpermission"]){ $mod["dlMemRejectPerms"][0]=$attributes["group_rejectpermission"]; }
-
- // Exchange Schema
- if ($attributes["exchange_homemdb"]){ $mod["homeMDB"][0]=$attributes["exchange_homemdb"]; }
- if ($attributes["exchange_mailnickname"]){ $mod["mailNickname"][0]=$attributes["exchange_mailnickname"]; }
- if ($attributes["exchange_proxyaddress"]){ $mod["proxyAddresses"][0]=$attributes["exchange_proxyaddress"]; }
- if ($attributes["exchange_usedefaults"]){ $mod["mDBUseDefaults"][0]=$attributes["exchange_usedefaults"]; }
- if ($attributes["exchange_policyexclude"]){ $mod["msExchPoliciesExcluded"][0]=$attributes["exchange_policyexclude"]; }
- if ($attributes["exchange_policyinclude"]){ $mod["msExchPoliciesIncluded"][0]=$attributes["exchange_policyinclude"]; }
- if ($attributes["exchange_addressbook"]){ $mod["showInAddressBook"][0]=$attributes["exchange_addressbook"]; }
-
- // This schema is designed for contacts
- if ($attributes["exchange_hidefromlists"]){ $mod["msExchHideFromAddressLists"][0]=$attributes["exchange_hidefromlists"]; }
- if ($attributes["contact_email"]){ $mod["targetAddress"][0]=$attributes["contact_email"]; }
-
- //echo ("<pre>"); print_r($mod);
- /*
- // modifying a name is a bit fiddly
- if ($attributes["firstname"] && $attributes["surname"]){
- $mod["cn"][0]=$attributes["firstname"]." ".$attributes["surname"];
- $mod["displayname"][0]=$attributes["firstname"]." ".$attributes["surname"];
- $mod["name"][0]=$attributes["firstname"]." ".$attributes["surname"];
- }
- */
-
- if (count($mod)==0){ return (false); }
- return ($mod);
- }
-
- /**
- * Coping with AD not returning the primary group
- * http://support.microsoft.com/?kbid=321360
- *
- * For some reason it's not possible to search on primarygrouptoken=XXX
- * If someone can show otherwise, I'd like to know about it :)
- * this way is resource intensive and generally a pain in the @#%^
- *
- * @deprecated deprecated since version 3.1, see get get_primary_group
- * @param string $gid Group ID
- * @return string
- */
- protected function group_cn($gid){
- if ($gid===NULL){ return (false); }
- $r=false;
-
- $filter="(&(objectCategory=group)(samaccounttype=". ADLDAP_SECURITY_GLOBAL_GROUP ."))";
- $fields=array("primarygrouptoken","samaccountname","distinguishedname");
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
-
- for ($i=0; $i<$entries["count"]; $i++){
- if ($entries[$i]["primarygrouptoken"][0]==$gid){
- $r=$entries[$i]["distinguishedname"][0];
- $i=$entries["count"];
- }
- }
-
- return ($r);
- }
-
- /**
- * Coping with AD not returning the primary group
- * http://support.microsoft.com/?kbid=321360
- *
- * This is a re-write based on code submitted by Bruce which prevents the
- * need to search each security group to find the true primary group
- *
- * @param string $gid Group ID
- * @param string $usersid User's Object SID
- * @return string
- */
- protected function get_primary_group($gid, $usersid){
- if ($gid===NULL || $usersid===NULL){ return (false); }
- $r=false;
-
- $gsid = substr_replace($usersid,pack('V',$gid),strlen($usersid)-4,4);
- $filter='(objectsid='.$this->getTextSID($gsid).')';
- $fields=array("samaccountname","distinguishedname");
- $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
- $entries = ldap_get_entries($this->_conn, $sr);
-
- return $entries[0]['distinguishedname'][0];
- }
-
- /**
- * Convert a binary SID to a text SID
- *
- * @param string $binsid A Binary SID
- * @return string
- */
- protected function getTextSID($binsid) {
- $hex_sid = bin2hex($binsid);
- $rev = hexdec(substr($hex_sid, 0, 2));
- $subcount = hexdec(substr($hex_sid, 2, 2));
- $auth = hexdec(substr($hex_sid, 4, 12));
- $result = "$rev-$auth";
-
- for ($x=0;$x < $subcount; $x++) {
- $subauth[$x] =
- hexdec($this->little_endian(substr($hex_sid, 16 + ($x * 8), 8)));
- $result .= "-" . $subauth[$x];
- }
-
- // Cheat by tacking on the S-
- return 'S-' . $result;
- }
-
- /**
- * Converts a little-endian hex number to one that hexdec() can convert
- *
- * @param string $hex A hex code
- * @return string
- */
- protected function little_endian($hex) {
- $result = '';
- for ($x = strlen($hex) - 2; $x >= 0; $x = $x - 2) {
- $result .= substr($hex, $x, 2);
- }
- return $result;
- }
-
- /**
- * Converts a binary attribute to a string
- *
- * @param string $bin A binary LDAP attribute
- * @return string
- */
- protected function binary2text($bin) {
- $hex_guid = bin2hex($bin);
- $hex_guid_to_guid_str = '';
- for($k = 1; $k <= 4; ++$k) {
- $hex_guid_to_guid_str .= substr($hex_guid, 8 - 2 * $k, 2);
- }
- $hex_guid_to_guid_str .= '-';
- for($k = 1; $k <= 2; ++$k) {
- $hex_guid_to_guid_str .= substr($hex_guid, 12 - 2 * $k, 2);
- }
- $hex_guid_to_guid_str .= '-';
- for($k = 1; $k <= 2; ++$k) {
- $hex_guid_to_guid_str .= substr($hex_guid, 16 - 2 * $k, 2);
- }
- $hex_guid_to_guid_str .= '-' . substr($hex_guid, 16, 4);
- $hex_guid_to_guid_str .= '-' . substr($hex_guid, 20);
- return strtoupper($hex_guid_to_guid_str);
- }
-
- /**
- * Converts a binary GUID to a string GUID
- *
- * @param string $binaryGuid The binary GUID attribute to convert
- * @return string
- */
- public function decodeGuid($binaryGuid) {
- if ($binaryGuid === null){ return ("Missing compulsory field [binaryGuid]"); }
-
- $strGUID = $this->binary2text($binaryGuid);
- return ($strGUID);
- }
-
- /**
- * Converts a string GUID to a hexdecimal value so it can be queried
- *
- * @param string $strGUID A string representation of a GUID
- * @return string
- */
- protected function strguid2hex($strGUID) {
- $strGUID = str_replace('-', '', $strGUID);
-
- $octet_str = '\\' . substr($strGUID, 6, 2);
- $octet_str .= '\\' . substr($strGUID, 4, 2);
- $octet_str .= '\\' . substr($strGUID, 2, 2);
- $octet_str .= '\\' . substr($strGUID, 0, 2);
- $octet_str .= '\\' . substr($strGUID, 10, 2);
- $octet_str .= '\\' . substr($strGUID, 8, 2);
- $octet_str .= '\\' . substr($strGUID, 14, 2);
- $octet_str .= '\\' . substr($strGUID, 12, 2);
- //$octet_str .= '\\' . substr($strGUID, 16, strlen($strGUID));
- for ($i=16; $i<=(strlen($strGUID)-2); $i++) {
- if (($i % 2) == 0) {
- $octet_str .= '\\' . substr($strGUID, $i, 2);
- }
- }
-
- return $octet_str;
- }
-
- /**
- * Obtain the user's distinguished name based on their userid
- *
- *
- * @param string $username The username
- * @param bool $isGUID Is the username passed a GUID or a samAccountName
- * @return string
- */
- protected function user_dn($username,$isGUID=false){
- $user=$this->user_info($username,array("cn"),$isGUID);
- if ($user[0]["dn"]===NULL){ return (false); }
- $user_dn=$user[0]["dn"];
- return ($user_dn);
- }
-
- /**
- * Encode a password for transmission over LDAP
- *
- * @param string $password The password to encode
- * @return string
- */
- protected function encode_password($password){
- $password="\"".$password."\"";
- $encoded="";
- for ($i=0; $i <strlen($password); $i++){ $encoded.="{$password{$i}}\000"; }
- return ($encoded);
- }
-
- /**
- * Escape strings for the use in LDAP filters
- *
- * DEVELOPERS SHOULD BE DOING PROPER FILTERING IF THEY'RE ACCEPTING USER INPUT
- * Ported from Perl's Net::LDAP::Util escape_filter_value
- *
- * @param string $str The string the parse
- * @author Port by Andreas Gohr <andi@splitbrain.org>
- * @return string
- */
- protected function ldap_slashes($str){
- return preg_replace('/([\x00-\x1F\*\(\)\\\\])/e',
- '"\\\\\".join("",unpack("H2","$1"))',
- $str);
- }
-
- /**
- * Select a random domain controller from your domain controller array
- *
- * @return string
- */
- protected function random_controller(){
- mt_srand(doubleval(microtime()) * 100000000); // For older PHP versions
- return ($this->_domain_controllers[array_rand($this->_domain_controllers)]);
- }
-
- /**
- * Account control options
- *
- * @param array $options The options to convert to int
- * @return int
- */
- protected function account_control($options){
- $val=0;
-
- if (is_array($options)){
- if (in_array("SCRIPT",$options)){ $val=$val+1; }
- if (in_array("ACCOUNTDISABLE",$options)){ $val=$val+2; }
- if (in_array("HOMEDIR_REQUIRED",$options)){ $val=$val+8; }
- if (in_array("LOCKOUT",$options)){ $val=$val+16; }
- if (in_array("PASSWD_NOTREQD",$options)){ $val=$val+32; }
- //PASSWD_CANT_CHANGE Note You cannot assign this permission by directly modifying the UserAccountControl attribute.
- //For information about how to set the permission programmatically, see the "Property flag descriptions" section.
- if (in_array("ENCRYPTED_TEXT_PWD_ALLOWED",$options)){ $val=$val+128; }
- if (in_array("TEMP_DUPLICATE_ACCOUNT",$options)){ $val=$val+256; }
- if (in_array("NORMAL_ACCOUNT",$options)){ $val=$val+512; }
- if (in_array("INTERDOMAIN_TRUST_ACCOUNT",$options)){ $val=$val+2048; }
- if (in_array("WORKSTATION_TRUST_ACCOUNT",$options)){ $val=$val+4096; }
- if (in_array("SERVER_TRUST_ACCOUNT",$options)){ $val=$val+8192; }
- if (in_array("DONT_EXPIRE_PASSWORD",$options)){ $val=$val+65536; }
- if (in_array("MNS_LOGON_ACCOUNT",$options)){ $val=$val+131072; }
- if (in_array("SMARTCARD_REQUIRED",$options)){ $val=$val+262144; }
- if (in_array("TRUSTED_FOR_DELEGATION",$options)){ $val=$val+524288; }
- if (in_array("NOT_DELEGATED",$options)){ $val=$val+1048576; }
- if (in_array("USE_DES_KEY_ONLY",$options)){ $val=$val+2097152; }
- if (in_array("DONT_REQ_PREAUTH",$options)){ $val=$val+4194304; }
- if (in_array("PASSWORD_EXPIRED",$options)){ $val=$val+8388608; }
- if (in_array("TRUSTED_TO_AUTH_FOR_DELEGATION",$options)){ $val=$val+16777216; }
- }
- return ($val);
- }
-
- /**
- * Take an LDAP query and return the nice names, without all the LDAP prefixes (eg. CN, DN)
- *
- * @param array $groups
- * @return array
- */
- protected function nice_names($groups){
-
- $group_array=array();
- for ($i=0; $i<$groups["count"]; $i++){ // For each group
- $line=$groups[$i];
-
- if (strlen($line)>0){
- // More presumptions, they're all prefixed with CN=
- // so we ditch the first three characters and the group
- // name goes up to the first comma
- $bits=explode(",",$line);
- $group_array[]=substr($bits[0],3,(strlen($bits[0])-3));
- }
- }
- return ($group_array);
- }
-
- /**
- * Delete a distinguished name from Active Directory
- * You should never need to call this yourself, just use the wrapper functions user_delete and contact_delete
- *
- * @param string $dn The distinguished name to delete
- * @return bool
- */
- protected function dn_delete($dn){
- $result=ldap_delete($this->_conn, $dn);
- if ($result!=true){ return (false); }
- return (true);
- }
-
- /**
- * Convert a boolean value to a string
- * You should never need to call this yourself
- *
- * @param bool $bool Boolean value
- * @return string
- */
- protected function bool2str($bool) {
- return ($bool) ? 'TRUE' : 'FALSE';
- }
-
- /**
- * Convert 8bit characters e.g. accented characters to UTF8 encoded characters
- */
- protected function encode8bit(&$item, $key) {
- $encode = false;
- if (is_string($item)) {
- for ($i=0; $i<strlen($item); $i++) {
- if (ord($item[$i]) >> 7) {
- $encode = true;
- }
- }
- }
- if ($encode === true && $key != 'password') {
- $item = utf8_encode($item);
- }
- }
-}
-
-/**
-* adLDAP Exception Handler
-*
-* Exceptions of this type are thrown on bind failure or when SSL is required but not configured
-* Example:
-* try {
-* $adldap = new adLDAP();
-* }
-* catch (adLDAPException $e) {
-* echo $e;
-* exit();
-* }
-*/
-class adLDAPException extends Exception {}
-
-?>
diff --git a/inc/adLDAP/adLDAP.php b/inc/adLDAP/adLDAP.php
new file mode 100644
index 000000000..a8f33b47e
--- /dev/null
+++ b/inc/adLDAP/adLDAP.php
@@ -0,0 +1,951 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 169 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+ */
+
+/**
+* Main adLDAP class
+*
+* Can be initialised using $adldap = new adLDAP();
+*
+* Something to keep in mind is that Active Directory is a permissions
+* based directory. If you bind as a domain user, you can't fetch as
+* much information on other users as you could as a domain admin.
+*
+* Before asking questions, please read the Documentation at
+* http://adldap.sourceforge.net/wiki/doku.php?id=api
+*/
+require_once(dirname(__FILE__) . '/collections/adLDAPCollection.php');
+require_once(dirname(__FILE__) . '/classes/adLDAPGroups.php');
+require_once(dirname(__FILE__) . '/classes/adLDAPUsers.php');
+require_once(dirname(__FILE__) . '/classes/adLDAPFolders.php');
+require_once(dirname(__FILE__) . '/classes/adLDAPUtils.php');
+require_once(dirname(__FILE__) . '/classes/adLDAPContacts.php');
+require_once(dirname(__FILE__) . '/classes/adLDAPExchange.php');
+require_once(dirname(__FILE__) . '/classes/adLDAPComputers.php');
+
+class adLDAP {
+
+ /**
+ * Define the different types of account in AD
+ */
+ const ADLDAP_NORMAL_ACCOUNT = 805306368;
+ const ADLDAP_WORKSTATION_TRUST = 805306369;
+ const ADLDAP_INTERDOMAIN_TRUST = 805306370;
+ const ADLDAP_SECURITY_GLOBAL_GROUP = 268435456;
+ const ADLDAP_DISTRIBUTION_GROUP = 268435457;
+ const ADLDAP_SECURITY_LOCAL_GROUP = 536870912;
+ const ADLDAP_DISTRIBUTION_LOCAL_GROUP = 536870913;
+ const ADLDAP_FOLDER = 'OU';
+ const ADLDAP_CONTAINER = 'CN';
+
+ /**
+ * The default port for LDAP non-SSL connections
+ */
+ const ADLDAP_LDAP_PORT = '389';
+ /**
+ * The default port for LDAPS SSL connections
+ */
+ const ADLDAP_LDAPS_PORT = '636';
+
+ /**
+ * The account suffix for your domain, can be set when the class is invoked
+ *
+ * @var string
+ */
+ protected $accountSuffix = "@mydomain.local";
+
+ /**
+ * The base dn for your domain
+ *
+ * If this is set to null then adLDAP will attempt to obtain this automatically from the rootDSE
+ *
+ * @var string
+ */
+ protected $baseDn = "DC=mydomain,DC=local";
+
+ /**
+ * Port used to talk to the domain controllers.
+ *
+ * @var int
+ */
+ protected $adPort = self::ADLDAP_LDAP_PORT;
+
+ /**
+ * Array of domain controllers. Specifiy multiple controllers if you
+ * would like the class to balance the LDAP queries amongst multiple servers
+ *
+ * @var array
+ */
+ protected $domainControllers = array("dc01.mydomain.local");
+
+ /**
+ * Optional account with higher privileges for searching
+ * This should be set to a domain admin account
+ *
+ * @var string
+ * @var string
+ */
+ protected $adminUsername = NULL;
+ protected $adminPassword = NULL;
+
+ /**
+ * AD does not return the primary group. http://support.microsoft.com/?kbid=321360
+ * This tweak will resolve the real primary group.
+ * Setting to false will fudge "Domain Users" and is much faster. Keep in mind though that if
+ * someone's primary group is NOT domain users, this is obviously going to mess up the results
+ *
+ * @var bool
+ */
+ protected $realPrimaryGroup = true;
+
+ /**
+ * Use SSL (LDAPS), your server needs to be setup, please see
+ * http://adldap.sourceforge.net/wiki/doku.php?id=ldap_over_ssl
+ *
+ * @var bool
+ */
+ protected $useSSL = false;
+
+ /**
+ * Use TLS
+ * If you wish to use TLS you should ensure that $useSSL is set to false and vice-versa
+ *
+ * @var bool
+ */
+ protected $useTLS = false;
+
+ /**
+ * Use SSO
+ * To indicate to adLDAP to reuse password set by the brower through NTLM or Kerberos
+ *
+ * @var bool
+ */
+ protected $useSSO = false;
+
+ /**
+ * When querying group memberships, do it recursively
+ * eg. User Fred is a member of Group A, which is a member of Group B, which is a member of Group C
+ * user_ingroup("Fred","C") will returns true with this option turned on, false if turned off
+ *
+ * @var bool
+ */
+ protected $recursiveGroups = true;
+
+ // You should not need to edit anything below this line
+ //******************************************************************************************
+
+ /**
+ * Connection and bind default variables
+ *
+ * @var mixed
+ * @var mixed
+ */
+ protected $ldapConnection;
+ protected $ldapBind;
+
+ /**
+ * Get the active LDAP Connection
+ *
+ * @return resource
+ */
+ public function getLdapConnection() {
+ if ($this->ldapConnection) {
+ return $this->ldapConnection;
+ }
+ return false;
+ }
+
+ /**
+ * Get the bind status
+ *
+ * @return bool
+ */
+ public function getLdapBind() {
+ return $this->ldapBind;
+ }
+
+ /**
+ * Get the current base DN
+ *
+ * @return string
+ */
+ public function getBaseDn() {
+ return $this->baseDn;
+ }
+
+ /**
+ * The group class
+ *
+ * @var adLDAPGroups
+ */
+ protected $groupClass;
+
+ /**
+ * Get the group class interface
+ *
+ * @return adLDAPGroups
+ */
+ public function group() {
+ if (!$this->groupClass) {
+ $this->groupClass = new adLDAPGroups($this);
+ }
+ return $this->groupClass;
+ }
+
+ /**
+ * The user class
+ *
+ * @var adLDAPUsers
+ */
+ protected $userClass;
+
+ /**
+ * Get the userclass interface
+ *
+ * @return adLDAPUsers
+ */
+ public function user() {
+ if (!$this->userClass) {
+ $this->userClass = new adLDAPUsers($this);
+ }
+ return $this->userClass;
+ }
+
+ /**
+ * The folders class
+ *
+ * @var adLDAPFolders
+ */
+ protected $folderClass;
+
+ /**
+ * Get the folder class interface
+ *
+ * @return adLDAPFolders
+ */
+ public function folder() {
+ if (!$this->folderClass) {
+ $this->folderClass = new adLDAPFolders($this);
+ }
+ return $this->folderClass;
+ }
+
+ /**
+ * The utils class
+ *
+ * @var adLDAPUtils
+ */
+ protected $utilClass;
+
+ /**
+ * Get the utils class interface
+ *
+ * @return adLDAPUtils
+ */
+ public function utilities() {
+ if (!$this->utilClass) {
+ $this->utilClass = new adLDAPUtils($this);
+ }
+ return $this->utilClass;
+ }
+
+ /**
+ * The contacts class
+ *
+ * @var adLDAPContacts
+ */
+ protected $contactClass;
+
+ /**
+ * Get the contacts class interface
+ *
+ * @return adLDAPContacts
+ */
+ public function contact() {
+ if (!$this->contactClass) {
+ $this->contactClass = new adLDAPContacts($this);
+ }
+ return $this->contactClass;
+ }
+
+ /**
+ * The exchange class
+ *
+ * @var adLDAPExchange
+ */
+ protected $exchangeClass;
+
+ /**
+ * Get the exchange class interface
+ *
+ * @return adLDAPExchange
+ */
+ public function exchange() {
+ if (!$this->exchangeClass) {
+ $this->exchangeClass = new adLDAPExchange($this);
+ }
+ return $this->exchangeClass;
+ }
+
+ /**
+ * The computers class
+ *
+ * @var adLDAPComputers
+ */
+ protected $computersClass;
+
+ /**
+ * Get the computers class interface
+ *
+ * @return adLDAPComputers
+ */
+ public function computer() {
+ if (!$this->computerClass) {
+ $this->computerClass = new adLDAPComputers($this);
+ }
+ return $this->computerClass;
+ }
+
+ /**
+ * Getters and Setters
+ */
+
+ /**
+ * Set the account suffix
+ *
+ * @param string $accountSuffix
+ * @return void
+ */
+ public function setAccountSuffix($accountSuffix)
+ {
+ $this->accountSuffix = $accountSuffix;
+ }
+
+ /**
+ * Get the account suffix
+ *
+ * @return string
+ */
+ public function getAccountSuffix()
+ {
+ return $this->accountSuffix;
+ }
+
+ /**
+ * Set the domain controllers array
+ *
+ * @param array $domainControllers
+ * @return void
+ */
+ public function setDomainControllers(array $domainControllers)
+ {
+ $this->domainControllers = $domainControllers;
+ }
+
+ /**
+ * Get the list of domain controllers
+ *
+ * @return void
+ */
+ public function getDomainControllers()
+ {
+ return $this->domainControllers;
+ }
+
+ /**
+ * Sets the port number your domain controller communicates over
+ *
+ * @param int $adPort
+ */
+ public function setPort($adPort)
+ {
+ $this->adPort = $adPort;
+ }
+
+ /**
+ * Gets the port number your domain controller communicates over
+ *
+ * @return int
+ */
+ public function getPort()
+ {
+ return $this->adPort;
+ }
+
+ /**
+ * Set the username of an account with higher priviledges
+ *
+ * @param string $adminUsername
+ * @return void
+ */
+ public function setAdminUsername($adminUsername)
+ {
+ $this->adminUsername = $adminUsername;
+ }
+
+ /**
+ * Get the username of the account with higher priviledges
+ *
+ * This will throw an exception for security reasons
+ */
+ public function getAdminUsername()
+ {
+ throw new adLDAPException('For security reasons you cannot access the domain administrator account details');
+ }
+
+ /**
+ * Set the password of an account with higher priviledges
+ *
+ * @param string $adminPassword
+ * @return void
+ */
+ public function setAdminPassword($adminPassword)
+ {
+ $this->adminPassword = $adminPassword;
+ }
+
+ /**
+ * Get the password of the account with higher priviledges
+ *
+ * This will throw an exception for security reasons
+ */
+ public function getAdminPassword()
+ {
+ throw new adLDAPException('For security reasons you cannot access the domain administrator account details');
+ }
+
+ /**
+ * Set whether to detect the true primary group
+ *
+ * @param bool $realPrimaryGroup
+ * @return void
+ */
+ public function setRealPrimaryGroup($realPrimaryGroup)
+ {
+ $this->realPrimaryGroup = $realPrimaryGroup;
+ }
+
+ /**
+ * Get the real primary group setting
+ *
+ * @return bool
+ */
+ public function getRealPrimaryGroup()
+ {
+ return $this->realPrimaryGroup;
+ }
+
+ /**
+ * Set whether to use SSL
+ *
+ * @param bool $useSSL
+ * @return void
+ */
+ public function setUseSSL($useSSL)
+ {
+ $this->useSSL = $useSSL;
+ // Set the default port correctly
+ if($this->useSSL) {
+ $this->setPort(self::ADLDAP_LDAPS_PORT);
+ }
+ else {
+ $this->setPort(self::ADLDAP_LDAP_PORT);
+ }
+ }
+
+ /**
+ * Get the SSL setting
+ *
+ * @return bool
+ */
+ public function getUseSSL()
+ {
+ return $this->useSSL;
+ }
+
+ /**
+ * Set whether to use TLS
+ *
+ * @param bool $useTLS
+ * @return void
+ */
+ public function setUseTLS($useTLS)
+ {
+ $this->useTLS = $useTLS;
+ }
+
+ /**
+ * Get the TLS setting
+ *
+ * @return bool
+ */
+ public function getUseTLS()
+ {
+ return $this->useTLS;
+ }
+
+ /**
+ * Set whether to use SSO
+ * Requires ldap_sasl_bind support. Be sure --with-ldap-sasl is used when configuring PHP otherwise this function will be undefined.
+ *
+ * @param bool $useSSO
+ * @return void
+ */
+ public function setUseSSO($useSSO)
+ {
+ if ($useSSO === true && !$this->ldapSaslSupported()) {
+ throw new adLDAPException('No LDAP SASL support for PHP. See: http://www.php.net/ldap_sasl_bind');
+ }
+ $this->useSSO = $useSSO;
+ }
+
+ /**
+ * Get the SSO setting
+ *
+ * @return bool
+ */
+ public function getUseSSO()
+ {
+ return $this->useSSO;
+ }
+
+ /**
+ * Set whether to lookup recursive groups
+ *
+ * @param bool $recursiveGroups
+ * @return void
+ */
+ public function setRecursiveGroups($recursiveGroups)
+ {
+ $this->recursiveGroups = $recursiveGroups;
+ }
+
+ /**
+ * Get the recursive groups setting
+ *
+ * @return bool
+ */
+ public function getRecursiveGroups()
+ {
+ return $this->recursiveGroups;
+ }
+
+ /**
+ * Default Constructor
+ *
+ * Tries to bind to the AD domain over LDAP or LDAPs
+ *
+ * @param array $options Array of options to pass to the constructor
+ * @throws Exception - if unable to bind to Domain Controller
+ * @return bool
+ */
+ function __construct($options = array()) {
+ // You can specifically overide any of the default configuration options setup above
+ if (count($options) > 0) {
+ if (array_key_exists("account_suffix",$options)){ $this->accountSuffix = $options["account_suffix"]; }
+ if (array_key_exists("base_dn",$options)){ $this->baseDn = $options["base_dn"]; }
+ if (array_key_exists("domain_controllers",$options)){
+ if (!is_array($options["domain_controllers"])) {
+ throw new adLDAPException('[domain_controllers] option must be an array');
+ }
+ $this->domainControllers = $options["domain_controllers"];
+ }
+ if (array_key_exists("admin_username",$options)){ $this->adminUsername = $options["admin_username"]; }
+ if (array_key_exists("admin_password",$options)){ $this->adminPassword = $options["admin_password"]; }
+ if (array_key_exists("real_primarygroup",$options)){ $this->realPrimaryGroup = $options["real_primarygroup"]; }
+ if (array_key_exists("use_ssl",$options)){ $this->setUseSSL($options["use_ssl"]); }
+ if (array_key_exists("use_tls",$options)){ $this->useTLS = $options["use_tls"]; }
+ if (array_key_exists("recursive_groups",$options)){ $this->recursiveGroups = $options["recursive_groups"]; }
+ if (array_key_exists("ad_port",$options)){ $this->setPort($options["ad_port"]); }
+ if (array_key_exists("sso",$options)) {
+ $this->setUseSSO($options["sso"]);
+ if (!$this->ldapSaslSupported()) {
+ $this->setUseSSO(false);
+ }
+ }
+ }
+
+ if ($this->ldapSupported() === false) {
+ throw new adLDAPException('No LDAP support for PHP. See: http://www.php.net/ldap');
+ }
+
+ return $this->connect();
+ }
+
+ /**
+ * Default Destructor
+ *
+ * Closes the LDAP connection
+ *
+ * @return void
+ */
+ function __destruct() {
+ $this->close();
+ }
+
+ /**
+ * Connects and Binds to the Domain Controller
+ *
+ * @return bool
+ */
+ public function connect()
+ {
+ // Connect to the AD/LDAP server as the username/password
+ $domainController = $this->randomController();
+ if ($this->useSSL) {
+ $this->ldapConnection = ldap_connect("ldaps://" . $domainController, $this->adPort);
+ } else {
+ $this->ldapConnection = ldap_connect($domainController, $this->adPort);
+ }
+
+ // Set some ldap options for talking to AD
+ ldap_set_option($this->ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3);
+ ldap_set_option($this->ldapConnection, LDAP_OPT_REFERRALS, 0);
+
+ if ($this->useTLS) {
+ ldap_start_tls($this->ldapConnection);
+ }
+
+ // Bind as a domain admin if they've set it up
+ if ($this->adminUsername !== NULL && $this->adminPassword !== NULL) {
+ $this->ldapBind = @ldap_bind($this->ldapConnection, $this->adminUsername . $this->accountSuffix, $this->adminPassword);
+ if (!$this->ldapBind) {
+ if ($this->useSSL && !$this->useTLS) {
+ // If you have problems troubleshooting, remove the @ character from the ldapldapBind command above to get the actual error message
+ throw new adLDAPException('Bind to Active Directory failed. Either the LDAPs connection failed or the login credentials are incorrect. AD said: ' . $this->getLastError());
+ }
+ else {
+ throw new adLDAPException('Bind to Active Directory failed. Check the login credentials and/or server details. AD said: ' . $this->getLastError());
+ }
+ }
+ }
+ if ($this->useSSO && $_SERVER['REMOTE_USER'] && $this->adminUsername === null && $_SERVER['KRB5CCNAME']) {
+ putenv("KRB5CCNAME=" . $_SERVER['KRB5CCNAME']);
+ $this->ldapBind = @ldap_sasl_bind($this->ldapConnection, NULL, NULL, "GSSAPI");
+ if (!$this->ldapBind){
+ throw new adLDAPException('Rebind to Active Directory failed. AD said: ' . $this->getLastError());
+ }
+ else {
+ return true;
+ }
+ }
+
+
+ if ($this->baseDn == NULL) {
+ $this->baseDn = $this->findBaseDn();
+ }
+
+ return true;
+ }
+
+ /**
+ * Closes the LDAP connection
+ *
+ * @return void
+ */
+ public function close() {
+ if ($this->ldapConnection) {
+ @ldap_close($this->ldapConnection);
+ }
+ }
+
+ /**
+ * Validate a user's login credentials
+ *
+ * @param string $username A user's AD username
+ * @param string $password A user's AD password
+ * @param bool optional $preventRebind
+ * @return bool
+ */
+ public function authenticate($username, $password, $preventRebind = false) {
+ // Prevent null binding
+ if ($username === NULL || $password === NULL) { return false; }
+ if (empty($username) || empty($password)) { return false; }
+
+ // Allow binding over SSO for Kerberos
+ if ($this->useSSO && $_SERVER['REMOTE_USER'] && $_SERVER['REMOTE_USER'] == $username && $this->adminUsername === NULL && $_SERVER['KRB5CCNAME']) {
+ putenv("KRB5CCNAME=" . $_SERVER['KRB5CCNAME']);
+ $this->ldapBind = @ldap_sasl_bind($this->ldapConnection, NULL, NULL, "GSSAPI");
+ if (!$this->ldapBind) {
+ throw new adLDAPException('Rebind to Active Directory failed. AD said: ' . $this->getLastError());
+ }
+ else {
+ return true;
+ }
+ }
+
+ // Bind as the user
+ $ret = true;
+ $this->ldapBind = @ldap_bind($this->ldapConnection, $username . $this->accountSuffix, $password);
+ if (!$this->ldapBind){
+ $ret = false;
+ }
+
+ // Cnce we've checked their details, kick back into admin mode if we have it
+ if ($this->adminUsername !== NULL && !$preventRebind) {
+ $this->ldapBind = @ldap_bind($this->ldapConnection, $this->adminUsername . $this->accountSuffix , $this->adminPassword);
+ if (!$this->ldapBind){
+ // This should never happen in theory
+ throw new adLDAPException('Rebind to Active Directory failed. AD said: ' . $this->getLastError());
+ }
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Find the Base DN of your domain controller
+ *
+ * @return string
+ */
+ public function findBaseDn()
+ {
+ $namingContext = $this->getRootDse(array('defaultnamingcontext'));
+ return $namingContext[0]['defaultnamingcontext'][0];
+ }
+
+ /**
+ * Get the RootDSE properties from a domain controller
+ *
+ * @param array $attributes The attributes you wish to query e.g. defaultnamingcontext
+ * @return array
+ */
+ public function getRootDse($attributes = array("*", "+")) {
+ if (!$this->ldapBind){ return (false); }
+
+ $sr = @ldap_read($this->ldapConnection, NULL, 'objectClass=*', $attributes);
+ $entries = @ldap_get_entries($this->ldapConnection, $sr);
+ return $entries;
+ }
+
+ /**
+ * Get last error from Active Directory
+ *
+ * This function gets the last message from Active Directory
+ * This may indeed be a 'Success' message but if you get an unknown error
+ * it might be worth calling this function to see what errors were raised
+ *
+ * return string
+ */
+ public function getLastError() {
+ return @ldap_error($this->ldapConnection);
+ }
+
+ /**
+ * Detect LDAP support in php
+ *
+ * @return bool
+ */
+ protected function ldapSupported()
+ {
+ if (!function_exists('ldap_connect')) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Detect ldap_sasl_bind support in PHP
+ *
+ * @return bool
+ */
+ protected function ldapSaslSupported()
+ {
+ if (!function_exists('ldap_sasl_bind')) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Schema
+ *
+ * @param array $attributes Attributes to be queried
+ * @return array
+ */
+ public function adldap_schema($attributes){
+
+ // LDAP doesn't like NULL attributes, only set them if they have values
+ // If you wish to remove an attribute you should set it to a space
+ // TO DO: Adapt user_modify to use ldap_mod_delete to remove a NULL attribute
+ $mod=array();
+
+ // Check every attribute to see if it contains 8bit characters and then UTF8 encode them
+ array_walk($attributes, array($this, 'encode8bit'));
+
+ if ($attributes["address_city"]){ $mod["l"][0]=$attributes["address_city"]; }
+ if ($attributes["address_code"]){ $mod["postalCode"][0]=$attributes["address_code"]; }
+ //if ($attributes["address_country"]){ $mod["countryCode"][0]=$attributes["address_country"]; } // use country codes?
+ if ($attributes["address_country"]){ $mod["c"][0]=$attributes["address_country"]; }
+ if ($attributes["address_pobox"]){ $mod["postOfficeBox"][0]=$attributes["address_pobox"]; }
+ if ($attributes["address_state"]){ $mod["st"][0]=$attributes["address_state"]; }
+ if ($attributes["address_street"]){ $mod["streetAddress"][0]=$attributes["address_street"]; }
+ if ($attributes["company"]){ $mod["company"][0]=$attributes["company"]; }
+ if ($attributes["change_password"]){ $mod["pwdLastSet"][0]=0; }
+ if ($attributes["department"]){ $mod["department"][0]=$attributes["department"]; }
+ if ($attributes["description"]){ $mod["description"][0]=$attributes["description"]; }
+ if ($attributes["display_name"]){ $mod["displayName"][0]=$attributes["display_name"]; }
+ if ($attributes["email"]){ $mod["mail"][0]=$attributes["email"]; }
+ if ($attributes["expires"]){ $mod["accountExpires"][0]=$attributes["expires"]; } //unix epoch format?
+ if ($attributes["firstname"]){ $mod["givenName"][0]=$attributes["firstname"]; }
+ if ($attributes["home_directory"]){ $mod["homeDirectory"][0]=$attributes["home_directory"]; }
+ if ($attributes["home_drive"]){ $mod["homeDrive"][0]=$attributes["home_drive"]; }
+ if ($attributes["initials"]){ $mod["initials"][0]=$attributes["initials"]; }
+ if ($attributes["logon_name"]){ $mod["userPrincipalName"][0]=$attributes["logon_name"]; }
+ if ($attributes["manager"]){ $mod["manager"][0]=$attributes["manager"]; } //UNTESTED ***Use DistinguishedName***
+ if ($attributes["office"]){ $mod["physicalDeliveryOfficeName"][0]=$attributes["office"]; }
+ if ($attributes["password"]){ $mod["unicodePwd"][0]=$this->user()->encodePassword($attributes["password"]); }
+ if ($attributes["profile_path"]){ $mod["profilepath"][0]=$attributes["profile_path"]; }
+ if ($attributes["script_path"]){ $mod["scriptPath"][0]=$attributes["script_path"]; }
+ if ($attributes["surname"]){ $mod["sn"][0]=$attributes["surname"]; }
+ if ($attributes["title"]){ $mod["title"][0]=$attributes["title"]; }
+ if ($attributes["telephone"]){ $mod["telephoneNumber"][0]=$attributes["telephone"]; }
+ if ($attributes["mobile"]){ $mod["mobile"][0]=$attributes["mobile"]; }
+ if ($attributes["pager"]){ $mod["pager"][0]=$attributes["pager"]; }
+ if ($attributes["ipphone"]){ $mod["ipphone"][0]=$attributes["ipphone"]; }
+ if ($attributes["web_page"]){ $mod["wWWHomePage"][0]=$attributes["web_page"]; }
+ if ($attributes["fax"]){ $mod["facsimileTelephoneNumber"][0]=$attributes["fax"]; }
+ if ($attributes["enabled"]){ $mod["userAccountControl"][0]=$attributes["enabled"]; }
+ if ($attributes["homephone"]){ $mod["homephone"][0]=$attributes["homephone"]; }
+
+ // Distribution List specific schema
+ if ($attributes["group_sendpermission"]){ $mod["dlMemSubmitPerms"][0]=$attributes["group_sendpermission"]; }
+ if ($attributes["group_rejectpermission"]){ $mod["dlMemRejectPerms"][0]=$attributes["group_rejectpermission"]; }
+
+ // Exchange Schema
+ if ($attributes["exchange_homemdb"]){ $mod["homeMDB"][0]=$attributes["exchange_homemdb"]; }
+ if ($attributes["exchange_mailnickname"]){ $mod["mailNickname"][0]=$attributes["exchange_mailnickname"]; }
+ if ($attributes["exchange_proxyaddress"]){ $mod["proxyAddresses"][0]=$attributes["exchange_proxyaddress"]; }
+ if ($attributes["exchange_usedefaults"]){ $mod["mDBUseDefaults"][0]=$attributes["exchange_usedefaults"]; }
+ if ($attributes["exchange_policyexclude"]){ $mod["msExchPoliciesExcluded"][0]=$attributes["exchange_policyexclude"]; }
+ if ($attributes["exchange_policyinclude"]){ $mod["msExchPoliciesIncluded"][0]=$attributes["exchange_policyinclude"]; }
+ if ($attributes["exchange_addressbook"]){ $mod["showInAddressBook"][0]=$attributes["exchange_addressbook"]; }
+ if ($attributes["exchange_altrecipient"]){ $mod["altRecipient"][0]=$attributes["exchange_altrecipient"]; }
+ if ($attributes["exchange_deliverandredirect"]){ $mod["deliverAndRedirect"][0]=$attributes["exchange_deliverandredirect"]; }
+
+ // This schema is designed for contacts
+ if ($attributes["exchange_hidefromlists"]){ $mod["msExchHideFromAddressLists"][0]=$attributes["exchange_hidefromlists"]; }
+ if ($attributes["contact_email"]){ $mod["targetAddress"][0]=$attributes["contact_email"]; }
+
+ //echo ("<pre>"); print_r($mod);
+ /*
+ // modifying a name is a bit fiddly
+ if ($attributes["firstname"] && $attributes["surname"]){
+ $mod["cn"][0]=$attributes["firstname"]." ".$attributes["surname"];
+ $mod["displayname"][0]=$attributes["firstname"]." ".$attributes["surname"];
+ $mod["name"][0]=$attributes["firstname"]." ".$attributes["surname"];
+ }
+ */
+
+ if (count($mod)==0){ return (false); }
+ return ($mod);
+ }
+
+ /**
+ * Convert 8bit characters e.g. accented characters to UTF8 encoded characters
+ */
+ protected function encode8Bit(&$item, $key) {
+ $encode = false;
+ if (is_string($item)) {
+ for ($i=0; $i<strlen($item); $i++) {
+ if (ord($item[$i]) >> 7) {
+ $encode = true;
+ }
+ }
+ }
+ if ($encode === true && $key != 'password') {
+ $item = utf8_encode($item);
+ }
+ }
+
+ /**
+ * Select a random domain controller from your domain controller array
+ *
+ * @return string
+ */
+ protected function randomController()
+ {
+ mt_srand(doubleval(microtime()) * 100000000); // For older PHP versions
+ /*if (sizeof($this->domainControllers) > 1) {
+ $adController = $this->domainControllers[array_rand($this->domainControllers)];
+ // Test if the controller is responding to pings
+ $ping = $this->pingController($adController);
+ if ($ping === false) {
+ // Find the current key in the domain controllers array
+ $key = array_search($adController, $this->domainControllers);
+ // Remove it so that we don't end up in a recursive loop
+ unset($this->domainControllers[$key]);
+ // Select a new controller
+ return $this->randomController();
+ }
+ else {
+ return ($adController);
+ }
+ } */
+ return $this->domainControllers[array_rand($this->domainControllers)];
+ }
+
+ /**
+ * Test basic connectivity to controller
+ *
+ * @return bool
+ */
+ protected function pingController($host) {
+ $port = $this->adPort;
+ fsockopen($host, $port, $errno, $errstr, 10);
+ if ($errno > 0) {
+ return false;
+ }
+ return true;
+ }
+
+}
+
+/**
+* adLDAP Exception Handler
+*
+* Exceptions of this type are thrown on bind failure or when SSL is required but not configured
+* Example:
+* try {
+* $adldap = new adLDAP();
+* }
+* catch (adLDAPException $e) {
+* echo $e;
+* exit();
+* }
+*/
+class adLDAPException extends Exception {}
+
+?> \ No newline at end of file
diff --git a/inc/adLDAP/classes/adLDAPComputers.php b/inc/adLDAP/classes/adLDAPComputers.php
new file mode 100644
index 000000000..71b24a04f
--- /dev/null
+++ b/inc/adLDAP/classes/adLDAPComputers.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage Computers
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+ */
+require_once(dirname(__FILE__) . '/../adLDAP.php');
+require_once(dirname(__FILE__) . '/../collections/adLDAPComputerCollection.php');
+
+/**
+* COMPUTER MANAGEMENT FUNCTIONS
+*/
+class adLDAPComputers {
+
+ /**
+ * The current adLDAP connection via dependency injection
+ *
+ * @var adLDAP
+ */
+ protected $adldap;
+
+ public function __construct(adLDAP $adldap) {
+ $this->adldap = $adldap;
+ }
+
+ /**
+ * Get information about a specific computer. Returned in a raw array format from AD
+ *
+ * @param string $computerName The name of the computer
+ * @param array $fields Attributes to return
+ * @return array
+ */
+ public function info($computerName, $fields = NULL)
+ {
+ if ($computerName === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ $filter = "(&(objectClass=computer)(cn=" . $computerName . "))";
+ if ($fields === NULL) {
+ $fields = array("memberof","cn","displayname","dnshostname","distinguishedname","objectcategory","operatingsystem","operatingsystemservicepack","operatingsystemversion");
+ }
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ return $entries;
+ }
+
+ /**
+ * Find information about the computers. Returned in a raw array format from AD
+ *
+ * @param string $computerName The name of the computer
+ * @param array $fields Array of parameters to query
+ * @return mixed
+ */
+ public function infoCollection($computerName, $fields = NULL)
+ {
+ if ($computerName === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ $info = $this->info($computerName, $fields);
+
+ if ($info !== false) {
+ $collection = new adLDAPComputerCollection($info, $this->adldap);
+ return $collection;
+ }
+ return false;
+ }
+
+ /**
+ * Check if a computer is in a group
+ *
+ * @param string $computerName The name of the computer
+ * @param string $group The group to check
+ * @param bool $recursive Whether to check recursively
+ * @return array
+ */
+ public function inGroup($computerName, $group, $recursive = NULL)
+ {
+ if ($computerName === NULL) { return false; }
+ if ($group === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+ if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } // use the default option if they haven't set it
+
+ //get a list of the groups
+ $groups = $this->groups($computerName, array("memberof"), $recursive);
+
+ //return true if the specified group is in the group list
+ if (in_array($group, $groups)){
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Get the groups a computer is in
+ *
+ * @param string $computerName The name of the computer
+ * @param bool $recursive Whether to check recursively
+ * @return array
+ */
+ public function groups($computerName, $recursive = NULL)
+ {
+ if ($computerName === NULL) { return false; }
+ if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } //use the default option if they haven't set it
+ if (!$this->adldap->getLdapBind()){ return false; }
+
+ //search the directory for their information
+ $info = @$this->info($computerName, array("memberof", "primarygroupid"));
+ $groups = $this->adldap->utilities()->niceNames($info[0]["memberof"]); //presuming the entry returned is our guy (unique usernames)
+
+ if ($recursive === true) {
+ foreach ($groups as $id => $groupName){
+ $extraGroups = $this->adldap->group()->recursiveGroups($groupName);
+ $groups = array_merge($groups, $extraGroups);
+ }
+ }
+
+ return $groups;
+ }
+
+}
+?> \ No newline at end of file
diff --git a/inc/adLDAP/classes/adLDAPContacts.php b/inc/adLDAP/classes/adLDAPContacts.php
new file mode 100644
index 000000000..addd3e5f0
--- /dev/null
+++ b/inc/adLDAP/classes/adLDAPContacts.php
@@ -0,0 +1,294 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage Contacts
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+ */
+
+require_once(dirname(__FILE__) . '/../adLDAP.php');
+require_once(dirname(__FILE__) . '/../collections/adLDAPContactCollection.php');
+
+class adLDAPContacts {
+ /**
+ * The current adLDAP connection via dependency injection
+ *
+ * @var adLDAP
+ */
+ protected $adldap;
+
+ public function __construct(adLDAP $adldap) {
+ $this->adldap = $adldap;
+ }
+
+ //*****************************************************************************************************************
+ // CONTACT FUNCTIONS
+ // * Still work to do in this area, and new functions to write
+
+ /**
+ * Create a contact
+ *
+ * @param array $attributes The attributes to set to the contact
+ * @return bool
+ */
+ public function create($attributes)
+ {
+ // Check for compulsory fields
+ if (!array_key_exists("display_name", $attributes)) { return "Missing compulsory field [display_name]"; }
+ if (!array_key_exists("email", $attributes)) { return "Missing compulsory field [email]"; }
+ if (!array_key_exists("container", $attributes)) { return "Missing compulsory field [container]"; }
+ if (!is_array($attributes["container"])) { return "Container attribute must be an array."; }
+
+ // Translate the schema
+ $add = $this->adldap->adldap_schema($attributes);
+
+ // Additional stuff only used for adding contacts
+ $add["cn"][0] = $attributes["display_name"];
+ $add["objectclass"][0] = "top";
+ $add["objectclass"][1] = "person";
+ $add["objectclass"][2] = "organizationalPerson";
+ $add["objectclass"][3] = "contact";
+ if (!isset($attributes['exchange_hidefromlists'])) {
+ $add["msExchHideFromAddressLists"][0] = "TRUE";
+ }
+
+ // Determine the container
+ $attributes["container"] = array_reverse($attributes["container"]);
+ $container= "OU=" . implode(",OU=", $attributes["container"]);
+
+ // Add the entry
+ $result = @ldap_add($this->adldap->getLdapConnection(), "CN=" . $this->adldap->utilities()->escapeCharacters($add["cn"][0]) . ", " . $container . "," . $this->adldap->getBaseDn(), $add);
+ if ($result != true) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Determine the list of groups a contact is a member of
+ *
+ * @param string $distinguisedname The full DN of a contact
+ * @param bool $recursive Recursively check groups
+ * @return array
+ */
+ public function groups($distinguishedName, $recursive = NULL)
+ {
+ if ($distinguishedName === NULL) { return false; }
+ if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } //use the default option if they haven't set it
+ if (!$this->adldap->getLdapBind()){ return false; }
+
+ // Search the directory for their information
+ $info = @$this->info($distinguishedName, array("memberof", "primarygroupid"));
+ $groups = $this->adldap->utilities()->niceNames($info[0]["memberof"]); //presuming the entry returned is our contact
+
+ if ($recursive === true){
+ foreach ($groups as $id => $groupName){
+ $extraGroups = $this->adldap->group()->recursiveGroups($groupName);
+ $groups = array_merge($groups, $extraGroups);
+ }
+ }
+
+ return $groups;
+ }
+
+ /**
+ * Get contact information. Returned in a raw array format from AD
+ *
+ * @param string $distinguisedname The full DN of a contact
+ * @param array $fields Attributes to be returned
+ * @return array
+ */
+ public function info($distinguishedName, $fields = NULL)
+ {
+ if ($distinguishedName === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ $filter = "distinguishedName=" . $distinguishedName;
+ if ($fields === NULL) {
+ $fields = array("distinguishedname", "mail", "memberof", "department", "displayname", "telephonenumber", "primarygroupid", "objectsid");
+ }
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ if ($entries[0]['count'] >= 1) {
+ // AD does not return the primary group in the ldap query, we may need to fudge it
+ if ($this->adldap->getRealPrimaryGroup() && isset($entries[0]["primarygroupid"][0]) && isset($entries[0]["primarygroupid"][0])){
+ //$entries[0]["memberof"][]=$this->group_cn($entries[0]["primarygroupid"][0]);
+ $entries[0]["memberof"][] = $this->adldap->group()->getPrimaryGroup($entries[0]["primarygroupid"][0], $entries[0]["objectsid"][0]);
+ } else {
+ $entries[0]["memberof"][] = "CN=Domain Users,CN=Users," . $this->adldap->getBaseDn();
+ }
+ }
+
+ $entries[0]["memberof"]["count"]++;
+ return $entries;
+ }
+
+ /**
+ * Find information about the contacts. Returned in a raw array format from AD
+ *
+ * @param string $distinguishedName The full DN of a contact
+ * @param array $fields Array of parameters to query
+ * @return mixed
+ */
+ public function infoCollection($distinguishedName, $fields = NULL)
+ {
+ if ($distinguishedName === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ $info = $this->info($distinguishedName, $fields);
+
+ if ($info !== false) {
+ $collection = new adLDAPContactCollection($info, $this->adldap);
+ return $collection;
+ }
+ return false;
+ }
+
+ /**
+ * Determine if a contact is a member of a group
+ *
+ * @param string $distinguisedName The full DN of a contact
+ * @param string $group The group name to query
+ * @param bool $recursive Recursively check groups
+ * @return bool
+ */
+ public function inGroup($distinguisedName, $group, $recursive = NULL)
+ {
+ if ($distinguisedName === NULL) { return false; }
+ if ($group === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+ if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } //use the default option if they haven't set it
+
+ // Get a list of the groups
+ $groups = $this->groups($distinguisedName, array("memberof"), $recursive);
+
+ // Return true if the specified group is in the group list
+ if (in_array($group, $groups)){
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Modify a contact
+ *
+ * @param string $distinguishedName The contact to query
+ * @param array $attributes The attributes to modify. Note if you set the enabled attribute you must not specify any other attributes
+ * @return bool
+ */
+ public function modify($distinguishedName, $attributes) {
+ if ($distinguishedName === NULL) { return "Missing compulsory field [distinguishedname]"; }
+
+ // Translate the update to the LDAP schema
+ $mod = $this->adldap->adldap_schema($attributes);
+
+ // Check to see if this is an enabled status update
+ if (!$mod) {
+ return false;
+ }
+
+ // Do the update
+ $result = ldap_modify($this->adldap->getLdapConnection(), $distinguishedName, $mod);
+ if ($result == false) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Delete a contact
+ *
+ * @param string $distinguishedName The contact dn to delete (please be careful here!)
+ * @return array
+ */
+ public function delete($distinguishedName)
+ {
+ $result = $this->folder()->delete($distinguishedName);
+ if ($result != true) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Return a list of all contacts
+ *
+ * @param bool $includeDescription Include a description of a contact
+ * @param string $search The search parameters
+ * @param bool $sorted Whether to sort the results
+ * @return array
+ */
+ public function all($includeDescription = false, $search = "*", $sorted = true) {
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ // Perform the search and grab all their details
+ $filter = "(&(objectClass=contact)(cn=" . $search . "))";
+ $fields = array("displayname","distinguishedname");
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ $usersArray = array();
+ for ($i=0; $i<$entries["count"]; $i++){
+ if ($includeDescription && strlen($entries[$i]["displayname"][0])>0){
+ $usersArray[$entries[$i]["distinguishedname"][0]] = $entries[$i]["displayname"][0];
+ } elseif ($includeDescription){
+ $usersArray[$entries[$i]["distinguishedname"][0]] = $entries[$i]["distinguishedname"][0];
+ } else {
+ array_push($usersArray, $entries[$i]["distinguishedname"][0]);
+ }
+ }
+ if ($sorted) {
+ asort($usersArray);
+ }
+ return $usersArray;
+ }
+
+ /**
+ * Mail enable a contact
+ * Allows email to be sent to them through Exchange
+ *
+ * @param string $distinguishedname The contact to mail enable
+ * @param string $emailaddress The email address to allow emails to be sent through
+ * @param string $mailnickname The mailnickname for the contact in Exchange. If NULL this will be set to the display name
+ * @return bool
+ */
+ public function contactMailEnable($distinguishedName, $emailAddress, $mailNickname = NULL){
+ return $this->adldap->exchange()->contactMailEnable($distinguishedName, $emailAddress, $mailNickname);
+ }
+
+
+}
+?>
diff --git a/inc/adLDAP/classes/adLDAPExchange.php b/inc/adLDAP/classes/adLDAPExchange.php
new file mode 100644
index 000000000..dd0c6de05
--- /dev/null
+++ b/inc/adLDAP/classes/adLDAPExchange.php
@@ -0,0 +1,390 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage Exchange
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+ */
+require_once(dirname(__FILE__) . '/../adLDAP.php');
+
+/**
+* MICROSOFT EXCHANGE FUNCTIONS
+*/
+class adLDAPExchange {
+ /**
+ * The current adLDAP connection via dependency injection
+ *
+ * @var adLDAP
+ */
+ protected $adldap;
+
+ public function __construct(adLDAP $adldap) {
+ $this->adldap = $adldap;
+ }
+
+ /**
+ * Create an Exchange account
+ *
+ * @param string $username The username of the user to add the Exchange account to
+ * @param array $storageGroup The mailbox, Exchange Storage Group, for the user account, this must be a full CN
+ * If the storage group has a different base_dn to the adLDAP configuration, set it using $base_dn
+ * @param string $emailAddress The primary email address to add to this user
+ * @param string $mailNickname The mail nick name. If mail nickname is blank, the username will be used
+ * @param bool $mdbUseDefaults Indicates whether the store should use the default quota, rather than the per-mailbox quota.
+ * @param string $baseDn Specify an alternative base_dn for the Exchange storage group
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function createMailbox($username, $storageGroup, $emailAddress, $mailNickname=NULL, $useDefaults=TRUE, $baseDn=NULL, $isGUID=false)
+ {
+ if ($username === NULL){ return "Missing compulsory field [username]"; }
+ if ($storageGroup === NULL) { return "Missing compulsory array [storagegroup]"; }
+ if (!is_array($storageGroup)) { return "[storagegroup] must be an array"; }
+ if ($emailAddress === NULL) { return "Missing compulsory field [emailAddress]"; }
+
+ if ($baseDn === NULL) {
+ $baseDn = $this->adldap->getBaseDn();
+ }
+
+ $container = "CN=" . implode(",CN=", $storageGroup);
+
+ if ($mailNickname === NULL) {
+ $mailNickname = $username;
+ }
+ $mdbUseDefaults = $this->adldap->utilities()->boolToString($useDefaults);
+
+ $attributes = array(
+ 'exchange_homemdb'=>$container.",".$baseDn,
+ 'exchange_proxyaddress'=>'SMTP:' . $emailAddress,
+ 'exchange_mailnickname'=>$mailNickname,
+ 'exchange_usedefaults'=>$mdbUseDefaults
+ );
+ $result = $this->adldap->user()->modify($username, $attributes, $isGUID);
+ if ($result == false) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Add an X400 address to Exchange
+ * See http://tools.ietf.org/html/rfc1685 for more information.
+ * An X400 Address looks similar to this X400:c=US;a= ;p=Domain;o=Organization;s=Doe;g=John;
+ *
+ * @param string $username The username of the user to add the X400 to to
+ * @param string $country Country
+ * @param string $admd Administration Management Domain
+ * @param string $pdmd Private Management Domain (often your AD domain)
+ * @param string $org Organization
+ * @param string $surname Surname
+ * @param string $givenName Given name
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function addX400($username, $country, $admd, $pdmd, $org, $surname, $givenName, $isGUID=false)
+ {
+ if ($username === NULL){ return "Missing compulsory field [username]"; }
+
+ $proxyValue = 'X400:';
+
+ // Find the dn of the user
+ $user = $this->adldap->user()->info($username, array("cn","proxyaddresses"), $isGUID);
+ if ($user[0]["dn"] === NULL) { return false; }
+ $userDn = $user[0]["dn"];
+
+ // We do not have to demote an email address from the default so we can just add the new proxy address
+ $attributes['exchange_proxyaddress'] = $proxyValue . 'c=' . $country . ';a=' . $admd . ';p=' . $pdmd . ';o=' . $org . ';s=' . $surname . ';g=' . $givenName . ';';
+
+ // Translate the update to the LDAP schema
+ $add = $this->adldap->adldap_schema($attributes);
+
+ if (!$add) { return false; }
+
+ // Do the update
+ // Take out the @ to see any errors, usually this error might occur because the address already
+ // exists in the list of proxyAddresses
+ $result = @ldap_mod_add($this->adldap->getLdapConnection(), $userDn, $add);
+ if ($result == false) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Add an address to Exchange
+ *
+ * @param string $username The username of the user to add the Exchange account to
+ * @param string $emailAddress The email address to add to this user
+ * @param bool $default Make this email address the default address, this is a bit more intensive as we have to demote any existing default addresses
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function addAddress($username, $emailAddress, $default = FALSE, $isGUID = false)
+ {
+ if ($username === NULL) { return "Missing compulsory field [username]"; }
+ if ($emailAddress === NULL) { return "Missing compulsory fields [emailAddress]"; }
+
+ $proxyValue = 'smtp:';
+ if ($default === true) {
+ $proxyValue = 'SMTP:';
+ }
+
+ // Find the dn of the user
+ $user = $this->adldap->user()->info($username, array("cn","proxyaddresses"), $isGUID);
+ if ($user[0]["dn"] === NULL){ return false; }
+ $userDn = $user[0]["dn"];
+
+ // We need to scan existing proxy addresses and demote the default one
+ if (is_array($user[0]["proxyaddresses"]) && $default === true) {
+ $modAddresses = array();
+ for ($i=0;$i<sizeof($user[0]['proxyaddresses']);$i++) {
+ if (strstr($user[0]['proxyaddresses'][$i], 'SMTP:') !== false) {
+ $user[0]['proxyaddresses'][$i] = str_replace('SMTP:', 'smtp:', $user[0]['proxyaddresses'][$i]);
+ }
+ if ($user[0]['proxyaddresses'][$i] != '') {
+ $modAddresses['proxyAddresses'][$i] = $user[0]['proxyaddresses'][$i];
+ }
+ }
+ $modAddresses['proxyAddresses'][(sizeof($user[0]['proxyaddresses'])-1)] = 'SMTP:' . $emailAddress;
+
+ $result = @ldap_mod_replace($this->adldap->getLdapConnection(), $userDn, $modAddresses);
+ if ($result == false) {
+ return false;
+ }
+
+ return true;
+ }
+ else {
+ // We do not have to demote an email address from the default so we can just add the new proxy address
+ $attributes['exchange_proxyaddress'] = $proxyValue . $emailAddress;
+
+ // Translate the update to the LDAP schema
+ $add = $this->adldap->adldap_schema($attributes);
+
+ if (!$add) {
+ return false;
+ }
+
+ // Do the update
+ // Take out the @ to see any errors, usually this error might occur because the address already
+ // exists in the list of proxyAddresses
+ $result = @ldap_mod_add($this->adldap->getLdapConnection(), $userDn,$add);
+ if ($result == false) {
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ /**
+ * Remove an address to Exchange
+ * If you remove a default address the account will no longer have a default,
+ * we recommend changing the default address first
+ *
+ * @param string $username The username of the user to add the Exchange account to
+ * @param string $emailAddress The email address to add to this user
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function deleteAddress($username, $emailAddress, $isGUID=false)
+ {
+ if ($username === NULL) { return "Missing compulsory field [username]"; }
+ if ($emailAddress === NULL) { return "Missing compulsory fields [emailAddress]"; }
+
+ // Find the dn of the user
+ $user = $this->adldap->user()->info($username, array("cn","proxyaddresses"), $isGUID);
+ if ($user[0]["dn"] === NULL) { return false; }
+ $userDn = $user[0]["dn"];
+
+ if (is_array($user[0]["proxyaddresses"])) {
+ $mod = array();
+ for ($i=0;$i<sizeof($user[0]['proxyaddresses']);$i++) {
+ if (strstr($user[0]['proxyaddresses'][$i], 'SMTP:') !== false && $user[0]['proxyaddresses'][$i] == 'SMTP:' . $emailAddress) {
+ $mod['proxyAddresses'][0] = 'SMTP:' . $emailAddress;
+ }
+ elseif (strstr($user[0]['proxyaddresses'][$i], 'smtp:') !== false && $user[0]['proxyaddresses'][$i] == 'smtp:' . $emailAddress) {
+ $mod['proxyAddresses'][0] = 'smtp:' . $emailAddress;
+ }
+ }
+
+ $result = @ldap_mod_del($this->adldap->getLdapConnection(), $userDn,$mod);
+ if ($result == false) {
+ return false;
+ }
+
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+ /**
+ * Change the default address
+ *
+ * @param string $username The username of the user to add the Exchange account to
+ * @param string $emailAddress The email address to make default
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function primaryAddress($username, $emailAddress, $isGUID = false)
+ {
+ if ($username === NULL) { return "Missing compulsory field [username]"; }
+ if ($emailAddress === NULL) { return "Missing compulsory fields [emailAddress]"; }
+
+ // Find the dn of the user
+ $user = $this->adldap->user()->info($username, array("cn","proxyaddresses"), $isGUID);
+ if ($user[0]["dn"] === NULL){ return false; }
+ $userDn = $user[0]["dn"];
+
+ if (is_array($user[0]["proxyaddresses"])) {
+ $modAddresses = array();
+ for ($i=0;$i<sizeof($user[0]['proxyaddresses']);$i++) {
+ if (strstr($user[0]['proxyaddresses'][$i], 'SMTP:') !== false) {
+ $user[0]['proxyaddresses'][$i] = str_replace('SMTP:', 'smtp:', $user[0]['proxyaddresses'][$i]);
+ }
+ if ($user[0]['proxyaddresses'][$i] == 'smtp:' . $emailAddress) {
+ $user[0]['proxyaddresses'][$i] = str_replace('smtp:', 'SMTP:', $user[0]['proxyaddresses'][$i]);
+ }
+ if ($user[0]['proxyaddresses'][$i] != '') {
+ $modAddresses['proxyAddresses'][$i] = $user[0]['proxyaddresses'][$i];
+ }
+ }
+
+ $result = @ldap_mod_replace($this->adldap->getLdapConnection(), $userDn, $modAddresses);
+ if ($result == false) {
+ return false;
+ }
+
+ return true;
+ }
+
+ }
+
+ /**
+ * Mail enable a contact
+ * Allows email to be sent to them through Exchange
+ *
+ * @param string $distinguishedName The contact to mail enable
+ * @param string $emailAddress The email address to allow emails to be sent through
+ * @param string $mailNickname The mailnickname for the contact in Exchange. If NULL this will be set to the display name
+ * @return bool
+ */
+ public function contactMailEnable($distinguishedName, $emailAddress, $mailNickname = NULL)
+ {
+ if ($distinguishedName === NULL) { return "Missing compulsory field [distinguishedName]"; }
+ if ($emailAddress === NULL) { return "Missing compulsory field [emailAddress]"; }
+
+ if ($mailNickname !== NULL) {
+ // Find the dn of the user
+ $user = $this->adldap->contact()->info($distinguishedName, array("cn","displayname"));
+ if ($user[0]["displayname"] === NULL) { return false; }
+ $mailNickname = $user[0]['displayname'][0];
+ }
+
+ $attributes = array("email"=>$emailAddress,"contact_email"=>"SMTP:" . $emailAddress,"exchange_proxyaddress"=>"SMTP:" . $emailAddress,"exchange_mailnickname" => $mailNickname);
+
+ // Translate the update to the LDAP schema
+ $mod = $this->adldap->adldap_schema($attributes);
+
+ // Check to see if this is an enabled status update
+ if (!$mod) { return false; }
+
+ // Do the update
+ $result = ldap_modify($this->adldap->getLdapConnection(), $distinguishedName, $mod);
+ if ($result == false) { return false; }
+
+ return true;
+ }
+
+ /**
+ * Returns a list of Exchange Servers in the ConfigurationNamingContext of the domain
+ *
+ * @param array $attributes An array of the AD attributes you wish to return
+ * @return array
+ */
+ public function servers($attributes = array('cn','distinguishedname','serialnumber'))
+ {
+ if (!$this->adldap->getLdapBind()){ return false; }
+
+ $configurationNamingContext = $this->adldap->getRootDse(array('configurationnamingcontext'));
+ $sr = @ldap_search($this->adldap->getLdapConnection(), $configurationNamingContext[0]['configurationnamingcontext'][0],'(&(objectCategory=msExchExchangeServer))', $attributes);
+ $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+ return $entries;
+ }
+
+ /**
+ * Returns a list of Storage Groups in Exchange for a given mail server
+ *
+ * @param string $exchangeServer The full DN of an Exchange server. You can use exchange_servers() to find the DN for your server
+ * @param array $attributes An array of the AD attributes you wish to return
+ * @param bool $recursive If enabled this will automatically query the databases within a storage group
+ * @return array
+ */
+ public function storageGroups($exchangeServer, $attributes = array('cn','distinguishedname'), $recursive = NULL)
+ {
+ if (!$this->adldap->getLdapBind()){ return false; }
+ if ($exchangeServer === NULL) { return "Missing compulsory field [exchangeServer]"; }
+ if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); }
+
+ $filter = '(&(objectCategory=msExchStorageGroup))';
+ $sr = @ldap_search($this->adldap->getLdapConnection(), $exchangeServer, $filter, $attributes);
+ $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ if ($recursive === true) {
+ for ($i=0; $i<$entries['count']; $i++) {
+ $entries[$i]['msexchprivatemdb'] = $this->storageDatabases($entries[$i]['distinguishedname'][0]);
+ }
+ }
+
+ return $entries;
+ }
+
+ /**
+ * Returns a list of Databases within any given storage group in Exchange for a given mail server
+ *
+ * @param string $storageGroup The full DN of an Storage Group. You can use exchange_storage_groups() to find the DN
+ * @param array $attributes An array of the AD attributes you wish to return
+ * @return array
+ */
+ public function storageDatabases($storageGroup, $attributes = array('cn','distinguishedname','displayname')) {
+ if (!$this->adldap->getLdapBind()){ return false; }
+ if ($storageGroup === NULL) { return "Missing compulsory field [storageGroup]"; }
+
+ $filter = '(&(objectCategory=msExchPrivateMDB))';
+ $sr = @ldap_search($this->adldap->getLdapConnection(), $storageGroup, $filter, $attributes);
+ $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+ return $entries;
+ }
+}
+?> \ No newline at end of file
diff --git a/inc/adLDAP/classes/adLDAPFolders.php b/inc/adLDAP/classes/adLDAPFolders.php
new file mode 100644
index 000000000..55120152d
--- /dev/null
+++ b/inc/adLDAP/classes/adLDAPFolders.php
@@ -0,0 +1,179 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage Folders
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+ */
+require_once(dirname(__FILE__) . '/../adLDAP.php');
+
+/**
+* FOLDER / OU MANAGEMENT FUNCTIONS
+*/
+class adLDAPFolders {
+ /**
+ * The current adLDAP connection via dependency injection
+ *
+ * @var adLDAP
+ */
+ protected $adldap;
+
+ public function __construct(adLDAP $adldap) {
+ $this->adldap = $adldap;
+ }
+
+ /**
+ * Delete a distinguished name from Active Directory
+ * You should never need to call this yourself, just use the wrapper functions user_delete and contact_delete
+ *
+ * @param string $dn The distinguished name to delete
+ * @return bool
+ */
+ public function delete($dn){
+ $result = ldap_delete($this->adldap->getLdapConnection(), $dn);
+ if ($result != true) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Returns a folder listing for a specific OU
+ * See http://adldap.sourceforge.net/wiki/doku.php?id=api_folder_functions
+ *
+ * @param array $folderName An array to the OU you wish to list.
+ * If set to NULL will list the root, strongly recommended to set
+ * $recursive to false in that instance!
+ * @param string $dnType The type of record to list. This can be ADLDAP_FOLDER or ADLDAP_CONTAINER.
+ * @param bool $recursive Recursively search sub folders
+ * @param bool $type Specify a type of object to search for
+ * @return array
+ */
+ public function listing($folderName = NULL, $dnType = adLDAP::ADLDAP_FOLDER, $recursive = NULL, $type = NULL)
+ {
+ if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } //use the default option if they haven't set it
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ $filter = '(&';
+ if ($type !== NULL) {
+ switch ($type) {
+ case 'contact':
+ $filter .= '(objectClass=contact)';
+ break;
+ case 'computer':
+ $filter .= '(objectClass=computer)';
+ break;
+ case 'group':
+ $filter .= '(objectClass=group)';
+ break;
+ case 'folder':
+ $filter .= '(objectClass=organizationalUnit)';
+ break;
+ case 'container':
+ $filter .= '(objectClass=container)';
+ break;
+ case 'domain':
+ $filter .= '(objectClass=builtinDomain)';
+ break;
+ default:
+ $filter .= '(objectClass=user)';
+ break;
+ }
+ }
+ else {
+ $filter .= '(objectClass=*)';
+ }
+ // If the folder name is null then we will search the root level of AD
+ // This requires us to not have an OU= part, just the base_dn
+ $searchOu = $this->adldap->getBaseDn();
+ if (is_array($folderName)) {
+ $ou = $dnType . "=" . implode("," . $dnType . "=", $folderName);
+ $filter .= '(!(distinguishedname=' . $ou . ',' . $this->adldap->getBaseDn() . ')))';
+ $searchOu = $ou . ',' . $this->adldap->getBaseDn();
+ }
+ else {
+ $filter .= '(!(distinguishedname=' . $this->adldap->getBaseDn() . ')))';
+ }
+
+ if ($recursive === true) {
+ $sr = ldap_search($this->adldap->getLdapConnection(), $searchOu, $filter, array('objectclass', 'distinguishedname', 'samaccountname'));
+ $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+ if (is_array($entries)) {
+ return $entries;
+ }
+ }
+ else {
+ $sr = ldap_list($this->adldap->getLdapConnection(), $searchOu, $filter, array('objectclass', 'distinguishedname', 'samaccountname'));
+ $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+ if (is_array($entries)) {
+ return $entries;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Create an organizational unit
+ *
+ * @param array $attributes Default attributes of the ou
+ * @return bool
+ */
+ public function create($attributes)
+ {
+ if (!is_array($attributes)){ return "Attributes must be an array"; }
+ if (!is_array($attributes["container"])) { return "Container attribute must be an array."; }
+ if (!array_key_exists("ou_name",$attributes)) { return "Missing compulsory field [ou_name]"; }
+ if (!array_key_exists("container",$attributes)) { return "Missing compulsory field [container]"; }
+
+ $attributes["container"] = array_reverse($attributes["container"]);
+
+ $add=array();
+ $add["objectClass"] = "organizationalUnit";
+ $add["OU"] = $attributes['ou_name'];
+ $containers = "";
+ if (count($attributes['container']) > 0) {
+ $containers = "OU=" . implode(",OU=", $attributes["container"]) . ",";
+ }
+
+ $containers = "OU=" . implode(",OU=", $attributes["container"]);
+ $result = ldap_add($this->adldap->getLdapConnection(), "OU=" . $add["OU"] . ", " . $containers . $this->adldap->getBaseDn(), $add);
+ if ($result != true) {
+ return false;
+ }
+
+ return true;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/inc/adLDAP/classes/adLDAPGroups.php b/inc/adLDAP/classes/adLDAPGroups.php
new file mode 100644
index 000000000..05e4cc93b
--- /dev/null
+++ b/inc/adLDAP/classes/adLDAPGroups.php
@@ -0,0 +1,631 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage Groups
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+ */
+require_once(dirname(__FILE__) . '/../adLDAP.php');
+require_once(dirname(__FILE__) . '/../collections/adLDAPGroupCollection.php');
+
+/**
+* GROUP FUNCTIONS
+*/
+class adLDAPGroups {
+ /**
+ * The current adLDAP connection via dependency injection
+ *
+ * @var adLDAP
+ */
+ protected $adldap;
+
+ public function __construct(adLDAP $adldap) {
+ $this->adldap = $adldap;
+ }
+
+ /**
+ * Add a group to a group
+ *
+ * @param string $parent The parent group name
+ * @param string $child The child group name
+ * @return bool
+ */
+ public function addGroup($parent,$child){
+
+ // Find the parent group's dn
+ $parentGroup = $this->ginfo($parent, array("cn"));
+ if ($parentGroup[0]["dn"] === NULL){
+ return false;
+ }
+ $parentDn = $parentGroup[0]["dn"];
+
+ // Find the child group's dn
+ $childGroup = $this->info($child, array("cn"));
+ if ($childGroup[0]["dn"] === NULL){
+ return false;
+ }
+ $childDn = $childGroup[0]["dn"];
+
+ $add = array();
+ $add["member"] = $childDn;
+
+ $result = @ldap_mod_add($this->adldap->getLdapConnection(), $parentDn, $add);
+ if ($result == false) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Add a user to a group
+ *
+ * @param string $group The group to add the user to
+ * @param string $user The user to add to the group
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function addUser($group, $user, $isGUID = false)
+ {
+ // Adding a user is a bit fiddly, we need to get the full DN of the user
+ // and add it using the full DN of the group
+
+ // Find the user's dn
+ $userDn = $this->adldap->user()->dn($user, $isGUID);
+ if ($userDn === false) {
+ return false;
+ }
+
+ // Find the group's dn
+ $groupInfo = $this->info($group, array("cn"));
+ if ($groupInfo[0]["dn"] === NULL) {
+ return false;
+ }
+ $groupDn = $groupInfo[0]["dn"];
+
+ $add = array();
+ $add["member"] = $userDn;
+
+ $result = @ldap_mod_add($this->adldap->getLdapConnection(), $groupDn, $add);
+ if ($result == false) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Add a contact to a group
+ *
+ * @param string $group The group to add the contact to
+ * @param string $contactDn The DN of the contact to add
+ * @return bool
+ */
+ public function addContact($group, $contactDn)
+ {
+ // To add a contact we take the contact's DN
+ // and add it using the full DN of the group
+
+ // Find the group's dn
+ $groupInfo = $this->info($group, array("cn"));
+ if ($groupInfo[0]["dn"] === NULL) {
+ return false;
+ }
+ $groupDn = $groupInfo[0]["dn"];
+
+ $add = array();
+ $add["member"] = $contactDn;
+
+ $result = @ldap_mod_add($this->adldap->getLdapConnection(), $groupDn, $add);
+ if ($result == false) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Create a group
+ *
+ * @param array $attributes Default attributes of the group
+ * @return bool
+ */
+ public function create($attributes)
+ {
+ if (!is_array($attributes)){ return "Attributes must be an array"; }
+ if (!array_key_exists("group_name", $attributes)){ return "Missing compulsory field [group_name]"; }
+ if (!array_key_exists("container", $attributes)){ return "Missing compulsory field [container]"; }
+ if (!array_key_exists("description", $attributes)){ return "Missing compulsory field [description]"; }
+ if (!is_array($attributes["container"])){ return "Container attribute must be an array."; }
+ $attributes["container"] = array_reverse($attributes["container"]);
+
+ //$member_array = array();
+ //$member_array[0] = "cn=user1,cn=Users,dc=yourdomain,dc=com";
+ //$member_array[1] = "cn=administrator,cn=Users,dc=yourdomain,dc=com";
+
+ $add = array();
+ $add["cn"] = $attributes["group_name"];
+ $add["samaccountname"] = $attributes["group_name"];
+ $add["objectClass"] = "Group";
+ $add["description"] = $attributes["description"];
+ //$add["member"] = $member_array; UNTESTED
+
+ $container = "OU=" . implode(",OU=", $attributes["container"]);
+ $result = ldap_add($this->adldap->getLdapConnection(), "CN=" . $add["cn"] . ", " . $container . "," . $this->adldap->getBaseDn(), $add);
+ if ($result != true) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Delete a group account
+ *
+ * @param string $group The group to delete (please be careful here!)
+ *
+ * @return array
+ */
+ public function delete($group) {
+ if (!$this->adldap->getLdapBind()){ return false; }
+ if ($group === null){ return "Missing compulsory field [group]"; }
+
+ $groupInfo = $this->info($group, array("*"));
+ $dn = $groupInfo[0]['distinguishedname'][0];
+ $result = $this->adldap->folder()->delete($dn);
+ if ($result !== true) {
+ return false;
+ } return true;
+ }
+
+ /**
+ * Remove a group from a group
+ *
+ * @param string $parent The parent group name
+ * @param string $child The child group name
+ * @return bool
+ */
+ public function removeGroup($parent , $child)
+ {
+
+ // Find the parent dn
+ $parentGroup = $this->info($parent, array("cn"));
+ if ($parentGroup[0]["dn"] === NULL) {
+ return false;
+ }
+ $parentDn = $parentGroup[0]["dn"];
+
+ // Find the child dn
+ $childGroup = $this->info($child, array("cn"));
+ if ($childGroup[0]["dn"] === NULL) {
+ return false;
+ }
+ $childDn = $childGroup[0]["dn"];
+
+ $del = array();
+ $del["member"] = $childDn;
+
+ $result = @ldap_mod_del($this->adldap->getLdapConnection(), $parentDn, $del);
+ if ($result == false) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Remove a user from a group
+ *
+ * @param string $group The group to remove a user from
+ * @param string $user The AD user to remove from the group
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function removeUser($group, $user, $isGUID = false)
+ {
+
+ // Find the parent dn
+ $groupInfo = $this->info($group, array("cn"));
+ if ($groupInfo[0]["dn"] === NULL){
+ return false;
+ }
+ $groupDn = $groupInfo[0]["dn"];
+
+ // Find the users dn
+ $userDn = $this->adldap->user()->dn($user, $isGUID);
+ if ($userDn === false) {
+ return false;
+ }
+
+ $del = array();
+ $del["member"] = $userDn;
+
+ $result = @ldap_mod_del($this->adldap->getLdapConnection(), $groupDn, $del);
+ if ($result == false) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Remove a contact from a group
+ *
+ * @param string $group The group to remove a user from
+ * @param string $contactDn The DN of a contact to remove from the group
+ * @return bool
+ */
+ public function removeContact($group, $contactDn)
+ {
+
+ // Find the parent dn
+ $groupInfo = $this->info($group, array("cn"));
+ if ($groupInfo[0]["dn"] === NULL) {
+ return false;
+ }
+ $groupDn = $groupInfo[0]["dn"];
+
+ $del = array();
+ $del["member"] = $contactDn;
+
+ $result = @ldap_mod_del($this->adldap->getLdapConnection(), $groupDn, $del);
+ if ($result == false) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Return a list of groups in a group
+ *
+ * @param string $group The group to query
+ * @param bool $recursive Recursively get groups
+ * @return array
+ */
+ public function inGroup($group, $recursive = NULL)
+ {
+ if (!$this->adldap->getLdapBind()){ return false; }
+ if ($recursive === NULL){ $recursive = $this->adldap->getRecursiveGroups(); } // Use the default option if they haven't set it
+
+ // Search the directory for the members of a group
+ $info = $this->info($group, array("member","cn"));
+ $groups = $info[0]["member"];
+ if (!is_array($groups)) {
+ return false;
+ }
+
+ $groupArray = array();
+
+ for ($i=0; $i<$groups["count"]; $i++){
+ $filter = "(&(objectCategory=group)(distinguishedName=" . $this->adldap->utilities()->ldapSlashes($groups[$i]) . "))";
+ $fields = array("samaccountname", "distinguishedname", "objectClass");
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ // not a person, look for a group
+ if ($entries['count'] == 0 && $recursive == true) {
+ $filter = "(&(objectCategory=group)(distinguishedName=" . $this->adldap->utilities()->ldapSlashes($groups[$i]) . "))";
+ $fields = array("distinguishedname");
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+ if (!isset($entries[0]['distinguishedname'][0])) {
+ continue;
+ }
+ $subGroups = $this->inGroup($entries[0]['distinguishedname'][0], $recursive);
+ if (is_array($subGroups)) {
+ $groupArray = array_merge($groupArray, $subGroups);
+ $groupArray = array_unique($groupArray);
+ }
+ continue;
+ }
+
+ $groupArray[] = $entries[0]['distinguishedname'][0];
+ }
+ return $groupArray;
+ }
+
+ /**
+ * Return a list of members in a group
+ *
+ * @param string $group The group to query
+ * @param bool $recursive Recursively get group members
+ * @return array
+ */
+ public function members($group, $recursive = NULL)
+ {
+ if (!$this->adldap->getLdapBind()){ return false; }
+ if ($recursive === NULL){ $recursive = $this->adldap->getRecursiveGroups(); } // Use the default option if they haven't set it
+ // Search the directory for the members of a group
+ $info = $this->info($group, array("member","cn"));
+ $users = $info[0]["member"];
+ if (!is_array($users)) {
+ return false;
+ }
+
+ $userArray = array();
+
+ for ($i=0; $i<$users["count"]; $i++){
+ $filter = "(&(objectCategory=person)(distinguishedName=" . $this->adldap->utilities()->ldapSlashes($users[$i]) . "))";
+ $fields = array("samaccountname", "distinguishedname", "objectClass");
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ // not a person, look for a group
+ if ($entries['count'] == 0 && $recursive == true) {
+ $filter = "(&(objectCategory=group)(distinguishedName=" . $this->adldap->utilities()->ldapSlashes($users[$i]) . "))";
+ $fields = array("samaccountname");
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+ if (!isset($entries[0]['samaccountname'][0])) {
+ continue;
+ }
+ $subUsers = $this->members($entries[0]['samaccountname'][0], $recursive);
+ if (is_array($subUsers)) {
+ $userArray = array_merge($userArray, $subUsers);
+ $userArray = array_unique($userArray);
+ }
+ continue;
+ }
+ else if ($entries['count'] == 0) {
+ continue;
+ }
+
+ if ((!isset($entries[0]['samaccountname'][0]) || $entries[0]['samaccountname'][0] === NULL) && $entries[0]['distinguishedname'][0] !== NULL) {
+ $userArray[] = $entries[0]['distinguishedname'][0];
+ }
+ else if ($entries[0]['samaccountname'][0] !== NULL) {
+ $userArray[] = $entries[0]['samaccountname'][0];
+ }
+ }
+ return $userArray;
+ }
+
+ /**
+ * Group Information. Returns an array of raw information about a group.
+ * The group name is case sensitive
+ *
+ * @param string $groupName The group name to retrieve info about
+ * @param array $fields Fields to retrieve
+ * @return array
+ */
+ public function info($groupName, $fields = NULL)
+ {
+ if ($groupName === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ if (stristr($groupName, '+')) {
+ $groupName = stripslashes($groupName);
+ }
+
+ $filter = "(&(objectCategory=group)(name=" . $this->adldap->utilities()->ldapSlashes($groupName) . "))";
+ if ($fields === NULL) {
+ $fields = array("member","memberof","cn","description","distinguishedname","objectcategory","samaccountname");
+ }
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ return $entries;
+ }
+
+ /**
+ * Group Information. Returns an collection
+ * The group name is case sensitive
+ *
+ * @param string $groupName The group name to retrieve info about
+ * @param array $fields Fields to retrieve
+ * @return adLDAPGroupCollection
+ */
+ public function infoCollection($groupName, $fields = NULL)
+ {
+ if ($groupName === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ $info = $this->info($groupName, $fields);
+ if ($info !== false) {
+ $collection = new adLDAPGroupCollection($info, $this->adldap);
+ return $collection;
+ }
+ return false;
+ }
+
+ /**
+ * Return a complete list of "groups in groups"
+ *
+ * @param string $group The group to get the list from
+ * @return array
+ */
+ public function recursiveGroups($group)
+ {
+ if ($group === NULL) { return false; }
+
+ $stack = array();
+ $processed = array();
+ $retGroups = array();
+
+ array_push($stack, $group); // Initial Group to Start with
+ while (count($stack) > 0) {
+ $parent = array_pop($stack);
+ array_push($processed, $parent);
+
+ $info = $this->info($parent, array("memberof"));
+
+ if (isset($info[0]["memberof"]) && is_array($info[0]["memberof"])) {
+ $groups = $info[0]["memberof"];
+ if ($groups) {
+ $groupNames = $this->adldap->utilities()->niceNames($groups);
+ $retGroups = array_merge($retGroups, $groupNames); //final groups to return
+ foreach ($groupNames as $id => $groupName) {
+ if (!in_array($groupName, $processed)) {
+ array_push($stack, $groupName);
+ }
+ }
+ }
+ }
+ }
+
+ return $retGroups;
+ }
+
+ /**
+ * Returns a complete list of the groups in AD based on a SAM Account Type
+ *
+ * @param string $sAMAaccountType The account type to return
+ * @param bool $includeDescription Whether to return a description
+ * @param string $search Search parameters
+ * @param bool $sorted Whether to sort the results
+ * @return array
+ */
+ public function search($sAMAaccountType = adLDAP::ADLDAP_SECURITY_GLOBAL_GROUP, $includeDescription = false, $search = "*", $sorted = true) {
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ $filter = '(&(objectCategory=group)';
+ if ($sAMAaccountType !== null) {
+ $filter .= '(samaccounttype='. $sAMAaccountType .')';
+ }
+ $filter .= '(cn=' . $search . '))';
+ // Perform the search and grab all their details
+ $fields = array("samaccountname", "description");
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ $groupsArray = array();
+ for ($i=0; $i<$entries["count"]; $i++){
+ if ($includeDescription && strlen($entries[$i]["description"][0]) > 0 ) {
+ $groupsArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["description"][0];
+ }
+ else if ($includeDescription){
+ $groupsArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["samaccountname"][0];
+ }
+ else {
+ array_push($groupsArray, $entries[$i]["samaccountname"][0]);
+ }
+ }
+ if ($sorted) {
+ asort($groupsArray);
+ }
+ return $groupsArray;
+ }
+
+ /**
+ * Returns a complete list of all groups in AD
+ *
+ * @param bool $includeDescription Whether to return a description
+ * @param string $search Search parameters
+ * @param bool $sorted Whether to sort the results
+ * @return array
+ */
+ public function all($includeDescription = false, $search = "*", $sorted = true){
+ $groupsArray = $this->search(null, $includeDescription, $search, $sorted);
+ return $groupsArray;
+ }
+
+ /**
+ * Returns a complete list of security groups in AD
+ *
+ * @param bool $includeDescription Whether to return a description
+ * @param string $search Search parameters
+ * @param bool $sorted Whether to sort the results
+ * @return array
+ */
+ public function allSecurity($includeDescription = false, $search = "*", $sorted = true){
+ $groupsArray = $this->search(adLDAP::ADLDAP_SECURITY_GLOBAL_GROUP, $includeDescription, $search, $sorted);
+ return $groupsArray;
+ }
+
+ /**
+ * Returns a complete list of distribution lists in AD
+ *
+ * @param bool $includeDescription Whether to return a description
+ * @param string $search Search parameters
+ * @param bool $sorted Whether to sort the results
+ * @return array
+ */
+ public function allDistribution($includeDescription = false, $search = "*", $sorted = true){
+ $groupsArray = $this->search(adLDAP::ADLDAP_DISTRIBUTION_GROUP, $includeDescription, $search, $sorted);
+ return $groupsArray;
+ }
+
+ /**
+ * Coping with AD not returning the primary group
+ * http://support.microsoft.com/?kbid=321360
+ *
+ * This is a re-write based on code submitted by Bruce which prevents the
+ * need to search each security group to find the true primary group
+ *
+ * @param string $gid Group ID
+ * @param string $usersid User's Object SID
+ * @return mixed
+ */
+ public function getPrimaryGroup($gid, $usersid)
+ {
+ if ($gid === NULL || $usersid === NULL) { return false; }
+ $sr = false;
+
+ $gsid = substr_replace($usersid, pack('V',$gid), strlen($usersid)-4,4);
+ $filter = '(objectsid=' . $this->adldap->utilities()->getTextSID($gsid).')';
+ $fields = array("samaccountname","distinguishedname");
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ if (isset($entries[0]['distinguishedname'][0])) {
+ return $entries[0]['distinguishedname'][0];
+ }
+ return false;
+ }
+
+ /**
+ * Coping with AD not returning the primary group
+ * http://support.microsoft.com/?kbid=321360
+ *
+ * For some reason it's not possible to search on primarygrouptoken=XXX
+ * If someone can show otherwise, I'd like to know about it :)
+ * this way is resource intensive and generally a pain in the @#%^
+ *
+ * @deprecated deprecated since version 3.1, see get get_primary_group
+ * @param string $gid Group ID
+ * @return string
+ */
+ public function cn($gid){
+ if ($gid === NULL) { return false; }
+ $sr = false;
+ $r = '';
+
+ $filter = "(&(objectCategory=group)(samaccounttype=" . adLDAP::ADLDAP_SECURITY_GLOBAL_GROUP . "))";
+ $fields = array("primarygrouptoken", "samaccountname", "distinguishedname");
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ for ($i=0; $i<$entries["count"]; $i++){
+ if ($entries[$i]["primarygrouptoken"][0] == $gid) {
+ $r = $entries[$i]["distinguishedname"][0];
+ $i = $entries["count"];
+ }
+ }
+
+ return $r;
+ }
+}
+?>
diff --git a/inc/adLDAP/classes/adLDAPUsers.php b/inc/adLDAP/classes/adLDAPUsers.php
new file mode 100644
index 000000000..96a93b512
--- /dev/null
+++ b/inc/adLDAP/classes/adLDAPUsers.php
@@ -0,0 +1,682 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage User
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+ */
+require_once(dirname(__FILE__) . '/../adLDAP.php');
+require_once(dirname(__FILE__) . '/../collections/adLDAPUserCollection.php');
+
+/**
+* USER FUNCTIONS
+*/
+class adLDAPUsers {
+ /**
+ * The current adLDAP connection via dependency injection
+ *
+ * @var adLDAP
+ */
+ protected $adldap;
+
+ public function __construct(adLDAP $adldap) {
+ $this->adldap = $adldap;
+ }
+
+ /**
+ * Validate a user's login credentials
+ *
+ * @param string $username A user's AD username
+ * @param string $password A user's AD password
+ * @param bool optional $prevent_rebind
+ * @return bool
+ */
+ public function authenticate($username, $password, $preventRebind = false) {
+ return $this->adldap->authenticate($username, $password, $preventRebind);
+ }
+
+ /**
+ * Create a user
+ *
+ * If you specify a password here, this can only be performed over SSL
+ *
+ * @param array $attributes The attributes to set to the user account
+ * @return bool
+ */
+ public function create($attributes)
+ {
+ // Check for compulsory fields
+ if (!array_key_exists("username", $attributes)){ return "Missing compulsory field [username]"; }
+ if (!array_key_exists("firstname", $attributes)){ return "Missing compulsory field [firstname]"; }
+ if (!array_key_exists("surname", $attributes)){ return "Missing compulsory field [surname]"; }
+ if (!array_key_exists("email", $attributes)){ return "Missing compulsory field [email]"; }
+ if (!array_key_exists("container", $attributes)){ return "Missing compulsory field [container]"; }
+ if (!is_array($attributes["container"])){ return "Container attribute must be an array."; }
+
+ if (array_key_exists("password",$attributes) && (!$this->adldap->getUseSSL() && !$this->adldap->getUseTLS())){
+ throw new adLDAPException('SSL must be configured on your webserver and enabled in the class to set passwords.');
+ }
+
+ if (!array_key_exists("display_name", $attributes)) {
+ $attributes["display_name"] = $attributes["firstname"] . " " . $attributes["surname"];
+ }
+
+ // Translate the schema
+ $add = $this->adldap->adldap_schema($attributes);
+
+ // Additional stuff only used for adding accounts
+ $add["cn"][0] = $attributes["display_name"];
+ $add["samaccountname"][0] = $attributes["username"];
+ $add["objectclass"][0] = "top";
+ $add["objectclass"][1] = "person";
+ $add["objectclass"][2] = "organizationalPerson";
+ $add["objectclass"][3] = "user"; //person?
+ //$add["name"][0]=$attributes["firstname"]." ".$attributes["surname"];
+
+ // Set the account control attribute
+ $control_options = array("NORMAL_ACCOUNT");
+ if (!$attributes["enabled"]) {
+ $control_options[] = "ACCOUNTDISABLE";
+ }
+ $add["userAccountControl"][0] = $this->accountControl($control_options);
+
+ // Determine the container
+ $attributes["container"] = array_reverse($attributes["container"]);
+ $container = "OU=" . implode(", OU=",$attributes["container"]);
+
+ // Add the entry
+ $result = @ldap_add($this->adldap->getLdapConnection(), "CN=" . $add["cn"][0] . ", " . $container . "," . $this->adldap->getBaseDn(), $add);
+ if ($result != true) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Account control options
+ *
+ * @param array $options The options to convert to int
+ * @return int
+ */
+ protected function accountControl($options)
+ {
+ $val=0;
+
+ if (is_array($options)) {
+ if (in_array("SCRIPT",$options)){ $val=$val+1; }
+ if (in_array("ACCOUNTDISABLE",$options)){ $val=$val+2; }
+ if (in_array("HOMEDIR_REQUIRED",$options)){ $val=$val+8; }
+ if (in_array("LOCKOUT",$options)){ $val=$val+16; }
+ if (in_array("PASSWD_NOTREQD",$options)){ $val=$val+32; }
+ //PASSWD_CANT_CHANGE Note You cannot assign this permission by directly modifying the UserAccountControl attribute.
+ //For information about how to set the permission programmatically, see the "Property flag descriptions" section.
+ if (in_array("ENCRYPTED_TEXT_PWD_ALLOWED",$options)){ $val=$val+128; }
+ if (in_array("TEMP_DUPLICATE_ACCOUNT",$options)){ $val=$val+256; }
+ if (in_array("NORMAL_ACCOUNT",$options)){ $val=$val+512; }
+ if (in_array("INTERDOMAIN_TRUST_ACCOUNT",$options)){ $val=$val+2048; }
+ if (in_array("WORKSTATION_TRUST_ACCOUNT",$options)){ $val=$val+4096; }
+ if (in_array("SERVER_TRUST_ACCOUNT",$options)){ $val=$val+8192; }
+ if (in_array("DONT_EXPIRE_PASSWORD",$options)){ $val=$val+65536; }
+ if (in_array("MNS_LOGON_ACCOUNT",$options)){ $val=$val+131072; }
+ if (in_array("SMARTCARD_REQUIRED",$options)){ $val=$val+262144; }
+ if (in_array("TRUSTED_FOR_DELEGATION",$options)){ $val=$val+524288; }
+ if (in_array("NOT_DELEGATED",$options)){ $val=$val+1048576; }
+ if (in_array("USE_DES_KEY_ONLY",$options)){ $val=$val+2097152; }
+ if (in_array("DONT_REQ_PREAUTH",$options)){ $val=$val+4194304; }
+ if (in_array("PASSWORD_EXPIRED",$options)){ $val=$val+8388608; }
+ if (in_array("TRUSTED_TO_AUTH_FOR_DELEGATION",$options)){ $val=$val+16777216; }
+ }
+ return $val;
+ }
+
+ /**
+ * Delete a user account
+ *
+ * @param string $username The username to delete (please be careful here!)
+ * @param bool $isGUID Is the username a GUID or a samAccountName
+ * @return array
+ */
+ public function delete($username, $isGUID = false)
+ {
+ $userinfo = $this->info($username, array("*"), $isGUID);
+ $dn = $userinfo[0]['distinguishedname'][0];
+ $result = $this->adldap->folder()->delete($dn);
+ if ($result != true) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Groups the user is a member of
+ *
+ * @param string $username The username to query
+ * @param bool $recursive Recursive list of groups
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return array
+ */
+ public function groups($username, $recursive = NULL, $isGUID = false)
+ {
+ if ($username === NULL) { return false; }
+ if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } // Use the default option if they haven't set it
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ // Search the directory for their information
+ $info = @$this->info($username, array("memberof", "primarygroupid"), $isGUID);
+ $groups = $this->adldap->utilities()->niceNames($info[0]["memberof"]); // Presuming the entry returned is our guy (unique usernames)
+
+ if ($recursive === true){
+ foreach ($groups as $id => $groupName){
+ $extraGroups = $this->adldap->group()->recursiveGroups($groupName);
+ $groups = array_merge($groups, $extraGroups);
+ }
+ }
+
+ return $groups;
+ }
+
+ /**
+ * Find information about the users. Returned in a raw array format from AD
+ *
+ * @param string $username The username to query
+ * @param array $fields Array of parameters to query
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return array
+ */
+ public function info($username, $fields = NULL, $isGUID = false)
+ {
+ if ($username === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ if ($isGUID === true) {
+ $username = $this->adldap->utilities()->strGuidToHex($username);
+ $filter = "objectguid=" . $username;
+ }
+ else if (strstr($username, "@")) {
+ $filter = "userPrincipalName=" . $username;
+ }
+ else {
+ $filter = "samaccountname=" . $username;
+ }
+ $filter = "(&(objectCategory=person)({$filter}))";
+ if ($fields === NULL) {
+ $fields = array("samaccountname","mail","memberof","department","displayname","telephonenumber","primarygroupid","objectsid");
+ }
+ if (!in_array("objectsid", $fields)) {
+ $fields[] = "objectsid";
+ }
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ if (isset($entries[0])) {
+ if ($entries[0]['count'] >= 1) {
+ if (in_array("memberof", $fields)) {
+ // AD does not return the primary group in the ldap query, we may need to fudge it
+ if ($this->adldap->getRealPrimaryGroup() && isset($entries[0]["primarygroupid"][0]) && isset($entries[0]["objectsid"][0])){
+ //$entries[0]["memberof"][]=$this->group_cn($entries[0]["primarygroupid"][0]);
+ $entries[0]["memberof"][] = $this->adldap->group()->getPrimaryGroup($entries[0]["primarygroupid"][0], $entries[0]["objectsid"][0]);
+ } else {
+ $entries[0]["memberof"][] = "CN=Domain Users,CN=Users," . $this->adldap->getBaseDn();
+ }
+ if (!isset($entries[0]["memberof"]["count"])) {
+ $entries[0]["memberof"]["count"] = 0;
+ }
+ $entries[0]["memberof"]["count"]++;
+ }
+ }
+
+ return $entries;
+ }
+ return false;
+ }
+
+ /**
+ * Find information about the users. Returned in a raw array format from AD
+ *
+ * @param string $username The username to query
+ * @param array $fields Array of parameters to query
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return mixed
+ */
+ public function infoCollection($username, $fields = NULL, $isGUID = false)
+ {
+ if ($username === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ $info = $this->info($username, $fields, $isGUID);
+
+ if ($info !== false) {
+ $collection = new adLDAPUserCollection($info, $this->adldap);
+ return $collection;
+ }
+ return false;
+ }
+
+ /**
+ * Determine if a user is in a specific group
+ *
+ * @param string $username The username to query
+ * @param string $group The name of the group to check against
+ * @param bool $recursive Check groups recursively
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function inGroup($username, $group, $recursive = NULL, $isGUID = false)
+ {
+ if ($username === NULL) { return false; }
+ if ($group === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+ if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } // Use the default option if they haven't set it
+
+ // Get a list of the groups
+ $groups = $this->groups($username, $recursive, $isGUID);
+
+ // Return true if the specified group is in the group list
+ if (in_array($group, $groups)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Determine a user's password expiry date
+ *
+ * @param string $username The username to query
+ * @param book $isGUID Is the username passed a GUID or a samAccountName
+ * @requires bcmath http://www.php.net/manual/en/book.bc.php
+ * @return array
+ */
+ public function passwordExpiry($username, $isGUID = false)
+ {
+ if ($username === NULL) { return "Missing compulsory field [username]"; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+ if (!function_exists('bcmod')) { throw new adLDAPException("Missing function support [bcmod] http://www.php.net/manual/en/book.bc.php"); };
+
+ $userInfo = $this->info($username, array("pwdlastset", "useraccountcontrol"), $isGUID);
+ $pwdLastSet = $userInfo[0]['pwdlastset'][0];
+ $status = array();
+
+ if ($userInfo[0]['useraccountcontrol'][0] == '66048') {
+ // Password does not expire
+ return "Does not expire";
+ }
+ if ($pwdLastSet === '0') {
+ // Password has already expired
+ return "Password has expired";
+ }
+
+ // Password expiry in AD can be calculated from TWO values:
+ // - User's own pwdLastSet attribute: stores the last time the password was changed
+ // - Domain's maxPwdAge attribute: how long passwords last in the domain
+ //
+ // Although Microsoft chose to use a different base and unit for time measurements.
+ // This function will convert them to Unix timestamps
+ $sr = ldap_read($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), 'objectclass=*', array('maxPwdAge'));
+ if (!$sr) {
+ return false;
+ }
+ $info = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+ $maxPwdAge = $info[0]['maxpwdage'][0];
+
+
+ // See MSDN: http://msdn.microsoft.com/en-us/library/ms974598.aspx
+ //
+ // pwdLastSet contains the number of 100 nanosecond intervals since January 1, 1601 (UTC),
+ // stored in a 64 bit integer.
+ //
+ // The number of seconds between this date and Unix epoch is 11644473600.
+ //
+ // maxPwdAge is stored as a large integer that represents the number of 100 nanosecond
+ // intervals from the time the password was set before the password expires.
+ //
+ // We also need to scale this to seconds but also this value is a _negative_ quantity!
+ //
+ // If the low 32 bits of maxPwdAge are equal to 0 passwords do not expire
+ //
+ // Unfortunately the maths involved are too big for PHP integers, so I've had to require
+ // BCMath functions to work with arbitrary precision numbers.
+ if (bcmod($maxPwdAge, 4294967296) === '0') {
+ return "Domain does not expire passwords";
+ }
+
+ // Add maxpwdage and pwdlastset and we get password expiration time in Microsoft's
+ // time units. Because maxpwd age is negative we need to subtract it.
+ $pwdExpire = bcsub($pwdLastSet, $maxPwdAge);
+
+ // Convert MS's time to Unix time
+ $status['expiryts'] = bcsub(bcdiv($pwdExpire, '10000000'), '11644473600');
+ $status['expiryformat'] = date('Y-m-d H:i:s', bcsub(bcdiv($pwdExpire, '10000000'), '11644473600'));
+
+ return $status;
+ }
+
+ /**
+ * Modify a user
+ *
+ * @param string $username The username to query
+ * @param array $attributes The attributes to modify. Note if you set the enabled attribute you must not specify any other attributes
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function modify($username, $attributes, $isGUID = false)
+ {
+ if ($username === NULL) { return "Missing compulsory field [username]"; }
+ if (array_key_exists("password", $attributes) && !$this->adldap->getUseSSL() && !$this->adldap->getUseTLS()) {
+ throw new adLDAPException('SSL/TLS must be configured on your webserver and enabled in the class to set passwords.');
+ }
+
+ // Find the dn of the user
+ $userDn = $this->dn($username, $isGUID);
+ if ($userDn === false) {
+ return false;
+ }
+
+ // Translate the update to the LDAP schema
+ $mod = $this->adldap->adldap_schema($attributes);
+
+ // Check to see if this is an enabled status update
+ if (!$mod && !array_key_exists("enabled", $attributes)){
+ return false;
+ }
+
+ // Set the account control attribute (only if specified)
+ if (array_key_exists("enabled", $attributes)){
+ if ($attributes["enabled"]){
+ $controlOptions = array("NORMAL_ACCOUNT");
+ }
+ else {
+ $controlOptions = array("NORMAL_ACCOUNT", "ACCOUNTDISABLE");
+ }
+ $mod["userAccountControl"][0] = $this->accountControl($controlOptions);
+ }
+
+ // Do the update
+ $result = @ldap_modify($this->adldap->getLdapConnection(), $userDn, $mod);
+ if ($result == false) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Disable a user account
+ *
+ * @param string $username The username to disable
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function disable($username, $isGUID = false)
+ {
+ if ($username === NULL) { return "Missing compulsory field [username]"; }
+ $attributes = array("enabled" => 0);
+ $result = $this->modify($username, $attributes, $isGUID);
+ if ($result == false) { return false; }
+
+ return true;
+ }
+
+ /**
+ * Enable a user account
+ *
+ * @param string $username The username to enable
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function enable($username, $isGUID = false)
+ {
+ if ($username === NULL) { return "Missing compulsory field [username]"; }
+ $attributes = array("enabled" => 1);
+ $result = $this->modify($username, $attributes, $isGUID);
+ if ($result == false) { return false; }
+
+ return true;
+ }
+
+ /**
+ * Set the password of a user - This must be performed over SSL
+ *
+ * @param string $username The username to modify
+ * @param string $password The new password
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return bool
+ */
+ public function password($username, $password, $isGUID = false)
+ {
+ if ($username === NULL) { return false; }
+ if ($password === NULL) { return false; }
+ if (!$this->adldap->getLdapBind()) { return false; }
+ if (!$this->adldap->getUseSSL() && !$this->adldap->getUseTLS()) {
+ throw new adLDAPException('SSL must be configured on your webserver and enabled in the class to set passwords.');
+ }
+
+ $userDn = $this->dn($username, $isGUID);
+ if ($userDn === false) {
+ return false;
+ }
+
+ $add=array();
+ $add["unicodePwd"][0] = $this->encodePassword($password);
+
+ $result = @ldap_mod_replace($this->adldap->getLdapConnection(), $userDn, $add);
+ if ($result === false){
+ $err = ldap_errno($this->adldap->getLdapConnection());
+ if ($err) {
+ $msg = 'Error ' . $err . ': ' . ldap_err2str($err) . '.';
+ if($err == 53) {
+ $msg .= ' Your password might not match the password policy.';
+ }
+ throw new adLDAPException($msg);
+ }
+ else {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Encode a password for transmission over LDAP
+ *
+ * @param string $password The password to encode
+ * @return string
+ */
+ public function encodePassword($password)
+ {
+ $password="\"".$password."\"";
+ $encoded="";
+ for ($i=0; $i <strlen($password); $i++){ $encoded.="{$password{$i}}\000"; }
+ return $encoded;
+ }
+
+ /**
+ * Obtain the user's distinguished name based on their userid
+ *
+ *
+ * @param string $username The username
+ * @param bool $isGUID Is the username passed a GUID or a samAccountName
+ * @return string
+ */
+ public function dn($username, $isGUID=false)
+ {
+ $user = $this->info($username, array("cn"), $isGUID);
+ if ($user[0]["dn"] === NULL) {
+ return false;
+ }
+ $userDn = $user[0]["dn"];
+ return $userDn;
+ }
+
+ /**
+ * Return a list of all users in AD
+ *
+ * @param bool $includeDescription Return a description of the user
+ * @param string $search Search parameter
+ * @param bool $sorted Sort the user accounts
+ * @return array
+ */
+ public function all($includeDescription = false, $search = "*", $sorted = true)
+ {
+ if (!$this->adldap->getLdapBind()) { return false; }
+
+ // Perform the search and grab all their details
+ $filter = "(&(objectClass=user)(samaccounttype=" . adLDAP::ADLDAP_NORMAL_ACCOUNT .")(objectCategory=person)(cn=" . $search . "))";
+ $fields = array("samaccountname","displayname");
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ $usersArray = array();
+ for ($i=0; $i<$entries["count"]; $i++){
+ if ($includeDescription && strlen($entries[$i]["displayname"][0])>0){
+ $usersArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["displayname"][0];
+ } elseif ($includeDescription){
+ $usersArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["samaccountname"][0];
+ } else {
+ array_push($usersArray, $entries[$i]["samaccountname"][0]);
+ }
+ }
+ if ($sorted) {
+ asort($usersArray);
+ }
+ return $usersArray;
+ }
+
+ /**
+ * Converts a username (samAccountName) to a GUID
+ *
+ * @param string $username The username to query
+ * @return string
+ */
+ public function usernameToGuid($username)
+ {
+ if (!$this->adldap->getLdapBind()){ return false; }
+ if ($username === null){ return "Missing compulsory field [username]"; }
+
+ $filter = "samaccountname=" . $username;
+ $fields = array("objectGUID");
+ $sr = @ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ if (ldap_count_entries($this->adldap->getLdapConnection(), $sr) > 0) {
+ $entry = @ldap_first_entry($this->adldap->getLdapConnection(), $sr);
+ $guid = @ldap_get_values_len($this->adldap->getLdapConnection(), $entry, 'objectGUID');
+ $strGUID = $this->adldap->utilities()->binaryToText($guid[0]);
+ return $strGUID;
+ }
+ return false;
+ }
+
+ /**
+ * Return a list of all users in AD that have a specific value in a field
+ *
+ * @param bool $includeDescription Return a description of the user
+ * @param string $searchField Field to search search for
+ * @param string $searchFilter Value to search for in the specified field
+ * @param bool $sorted Sort the user accounts
+ * @return array
+ */
+ public function find($includeDescription = false, $searchField = false, $searchFilter = false, $sorted = true){
+ if (!$this->adldap->getLdapBind()){ return false; }
+
+ // Perform the search and grab all their details
+ $searchParams = "";
+ if ($searchField) {
+ $searchParams = "(" . $searchField . "=" . $searchFilter . ")";
+ }
+ $filter = "(&(objectClass=user)(samaccounttype=" . adLDAP::ADLDAP_NORMAL_ACCOUNT .")(objectCategory=person)" . $searchParams . ")";
+ $fields = array("samaccountname","displayname");
+ $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
+ $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
+
+ $usersArray = array();
+ for ($i=0; $i < $entries["count"]; $i++) {
+ if ($includeDescription && strlen($entries[$i]["displayname"][0]) > 0) {
+ $usersArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["displayname"][0];
+ }
+ else if ($includeDescription) {
+ $usersArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["samaccountname"][0];
+ }
+ else {
+ array_push($usersArray, $entries[$i]["samaccountname"][0]);
+ }
+ }
+ if ($sorted){
+ asort($usersArray);
+ }
+ return ($usersArray);
+ }
+
+ /**
+ * Move a user account to a different OU
+ *
+ * @param string $username The username to move (please be careful here!)
+ * @param array $container The container or containers to move the user to (please be careful here!).
+ * accepts containers in 1. parent 2. child order
+ * @return array
+ */
+ public function move($username, $container)
+ {
+ if (!$this->adldap->getLdapBind()) { return false; }
+ if ($username === null) { return "Missing compulsory field [username]"; }
+ if ($container === null) { return "Missing compulsory field [container]"; }
+ if (!is_array($container)) { return "Container must be an array"; }
+
+ $userInfo = $this->info($username, array("*"));
+ $dn = $userInfo[0]['distinguishedname'][0];
+ $newRDn = "cn=" . $username;
+ $container = array_reverse($container);
+ $newContainer = "ou=" . implode(",ou=",$container);
+ $newBaseDn = strtolower($newContainer) . "," . $this->adldap->getBaseDn();
+ $result = @ldap_rename($this->adldap->getLdapConnection(), $dn, $newRDn, $newBaseDn, true);
+ if ($result !== true) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Get the last logon time of any user as a Unix timestamp
+ *
+ * @param string $username
+ * @return long $unixTimestamp
+ */
+ public function getLastLogon($username) {
+ if (!$this->adldap->getLdapBind()) { return false; }
+ if ($username === null) { return "Missing compulsory field [username]"; }
+ $userInfo = $this->info($username, array("lastLogonTimestamp"));
+ $lastLogon = adLDAPUtils::convertWindowsTimeToUnixTime($userInfo[0]['lastLogonTimestamp'][0]);
+ return $lastLogon;
+ }
+
+}
+?>
diff --git a/inc/adLDAP/classes/adLDAPUtils.php b/inc/adLDAP/classes/adLDAPUtils.php
new file mode 100644
index 000000000..f039a4290
--- /dev/null
+++ b/inc/adLDAP/classes/adLDAPUtils.php
@@ -0,0 +1,264 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage Utils
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+ */
+require_once(dirname(__FILE__) . '/../adLDAP.php');
+
+/**
+* UTILITY FUNCTIONS
+*/
+class adLDAPUtils {
+ const ADLDAP_VERSION = '4.0.4';
+
+ /**
+ * The current adLDAP connection via dependency injection
+ *
+ * @var adLDAP
+ */
+ protected $adldap;
+
+ public function __construct(adLDAP $adldap) {
+ $this->adldap = $adldap;
+ }
+
+
+ /**
+ * Take an LDAP query and return the nice names, without all the LDAP prefixes (eg. CN, DN)
+ *
+ * @param array $groups
+ * @return array
+ */
+ public function niceNames($groups)
+ {
+
+ $groupArray = array();
+ for ($i=0; $i<$groups["count"]; $i++){ // For each group
+ $line = $groups[$i];
+
+ if (strlen($line)>0) {
+ // More presumptions, they're all prefixed with CN=
+ // so we ditch the first three characters and the group
+ // name goes up to the first comma
+ $bits=explode(",", $line);
+ $groupArray[] = substr($bits[0], 3, (strlen($bits[0])-3));
+ }
+ }
+ return $groupArray;
+ }
+
+ /**
+ * Escape characters for use in an ldap_create function
+ *
+ * @param string $str
+ * @return string
+ */
+ public function escapeCharacters($str) {
+ $str = str_replace(",", "\,", $str);
+ return $str;
+ }
+
+ /**
+ * Escape strings for the use in LDAP filters
+ *
+ * DEVELOPERS SHOULD BE DOING PROPER FILTERING IF THEY'RE ACCEPTING USER INPUT
+ * Ported from Perl's Net::LDAP::Util escape_filter_value
+ *
+ * @param string $str The string the parse
+ * @author Port by Andreas Gohr <andi@splitbrain.org>
+ * @return string
+ */
+ public function ldapSlashes($str){
+ return preg_replace('/([\x00-\x1F\*\(\)\\\\])/e',
+ '"\\\\\".join("",unpack("H2","$1"))',
+ $str);
+ }
+
+ /**
+ * Converts a string GUID to a hexdecimal value so it can be queried
+ *
+ * @param string $strGUID A string representation of a GUID
+ * @return string
+ */
+ public function strGuidToHex($strGUID)
+ {
+ $strGUID = str_replace('-', '', $strGUID);
+
+ $octet_str = '\\' . substr($strGUID, 6, 2);
+ $octet_str .= '\\' . substr($strGUID, 4, 2);
+ $octet_str .= '\\' . substr($strGUID, 2, 2);
+ $octet_str .= '\\' . substr($strGUID, 0, 2);
+ $octet_str .= '\\' . substr($strGUID, 10, 2);
+ $octet_str .= '\\' . substr($strGUID, 8, 2);
+ $octet_str .= '\\' . substr($strGUID, 14, 2);
+ $octet_str .= '\\' . substr($strGUID, 12, 2);
+ //$octet_str .= '\\' . substr($strGUID, 16, strlen($strGUID));
+ for ($i=16; $i<=(strlen($strGUID)-2); $i++) {
+ if (($i % 2) == 0) {
+ $octet_str .= '\\' . substr($strGUID, $i, 2);
+ }
+ }
+
+ return $octet_str;
+ }
+
+ /**
+ * Convert a binary SID to a text SID
+ *
+ * @param string $binsid A Binary SID
+ * @return string
+ */
+ public function getTextSID($binsid) {
+ $hex_sid = bin2hex($binsid);
+ $rev = hexdec(substr($hex_sid, 0, 2));
+ $subcount = hexdec(substr($hex_sid, 2, 2));
+ $auth = hexdec(substr($hex_sid, 4, 12));
+ $result = "$rev-$auth";
+
+ for ($x=0;$x < $subcount; $x++) {
+ $subauth[$x] =
+ hexdec($this->littleEndian(substr($hex_sid, 16 + ($x * 8), 8)));
+ $result .= "-" . $subauth[$x];
+ }
+
+ // Cheat by tacking on the S-
+ return 'S-' . $result;
+ }
+
+ /**
+ * Converts a little-endian hex number to one that hexdec() can convert
+ *
+ * @param string $hex A hex code
+ * @return string
+ */
+ public function littleEndian($hex)
+ {
+ $result = '';
+ for ($x = strlen($hex) - 2; $x >= 0; $x = $x - 2) {
+ $result .= substr($hex, $x, 2);
+ }
+ return $result;
+ }
+
+ /**
+ * Converts a binary attribute to a string
+ *
+ * @param string $bin A binary LDAP attribute
+ * @return string
+ */
+ public function binaryToText($bin)
+ {
+ $hex_guid = bin2hex($bin);
+ $hex_guid_to_guid_str = '';
+ for($k = 1; $k <= 4; ++$k) {
+ $hex_guid_to_guid_str .= substr($hex_guid, 8 - 2 * $k, 2);
+ }
+ $hex_guid_to_guid_str .= '-';
+ for($k = 1; $k <= 2; ++$k) {
+ $hex_guid_to_guid_str .= substr($hex_guid, 12 - 2 * $k, 2);
+ }
+ $hex_guid_to_guid_str .= '-';
+ for($k = 1; $k <= 2; ++$k) {
+ $hex_guid_to_guid_str .= substr($hex_guid, 16 - 2 * $k, 2);
+ }
+ $hex_guid_to_guid_str .= '-' . substr($hex_guid, 16, 4);
+ $hex_guid_to_guid_str .= '-' . substr($hex_guid, 20);
+ return strtoupper($hex_guid_to_guid_str);
+ }
+
+ /**
+ * Converts a binary GUID to a string GUID
+ *
+ * @param string $binaryGuid The binary GUID attribute to convert
+ * @return string
+ */
+ public function decodeGuid($binaryGuid)
+ {
+ if ($binaryGuid === null){ return "Missing compulsory field [binaryGuid]"; }
+
+ $strGUID = $this->binaryToText($binaryGuid);
+ return $strGUID;
+ }
+
+ /**
+ * Convert a boolean value to a string
+ * You should never need to call this yourself
+ *
+ * @param bool $bool Boolean value
+ * @return string
+ */
+ public function boolToStr($bool)
+ {
+ return ($bool) ? 'TRUE' : 'FALSE';
+ }
+
+ /**
+ * Convert 8bit characters e.g. accented characters to UTF8 encoded characters
+ */
+ public function encode8Bit(&$item, $key) {
+ $encode = false;
+ if (is_string($item)) {
+ for ($i=0; $i<strlen($item); $i++) {
+ if (ord($item[$i]) >> 7) {
+ $encode = true;
+ }
+ }
+ }
+ if ($encode === true && $key != 'password') {
+ $item = utf8_encode($item);
+ }
+ }
+
+ /**
+ * Get the current class version number
+ *
+ * @return string
+ */
+ public function getVersion() {
+ return self::ADLDAP_VERSION;
+ }
+
+ /**
+ * Round a Windows timestamp down to seconds and remove the seconds between 1601-01-01 and 1970-01-01
+ *
+ * @param long $windowsTime
+ * @return long $unixTime
+ */
+ public static function convertWindowsTimeToUnixTime($windowsTime) {
+ $unixTime = round($windowsTime / 10000000) - 11644477200;
+ return $unixTime;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/inc/adLDAP/collections/adLDAPCollection.php b/inc/adLDAP/collections/adLDAPCollection.php
new file mode 100644
index 000000000..c0a2eb2fa
--- /dev/null
+++ b/inc/adLDAP/collections/adLDAPCollection.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage Collection
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+*/
+
+abstract class adLDAPCollection
+{
+ /**
+ * The current adLDAP connection via dependency injection
+ *
+ * @var adLDAP
+ */
+ protected $adldap;
+
+ /**
+ * The current object being modifed / called
+ *
+ * @var mixed
+ */
+ protected $currentObject;
+
+ /**
+ * The raw info array from Active Directory
+ *
+ * @var array
+ */
+ protected $info;
+
+ public function __construct($info, adLDAP $adldap)
+ {
+ $this->setInfo($info);
+ $this->adldap = $adldap;
+ }
+
+ /**
+ * Set the raw info array from Active Directory
+ *
+ * @param array $info
+ */
+ public function setInfo(array $info)
+ {
+ if ($this->info && sizeof($info) >= 1) {
+ unset($this->info);
+ }
+ $this->info = $info;
+ }
+
+ /**
+ * Magic get method to retrieve data from the raw array in a formatted way
+ *
+ * @param string $attribute
+ * @return mixed
+ */
+ public function __get($attribute)
+ {
+ if (isset($this->info[0]) && is_array($this->info[0])) {
+ foreach ($this->info[0] as $keyAttr => $valueAttr) {
+ if (strtolower($keyAttr) == strtolower($attribute)) {
+ if ($this->info[0][strtolower($attribute)]['count'] == 1) {
+ return $this->info[0][strtolower($attribute)][0];
+ }
+ else {
+ $array = array();
+ foreach ($this->info[0][strtolower($attribute)] as $key => $value) {
+ if ((string)$key != 'count') {
+ $array[$key] = $value;
+ }
+ }
+ return $array;
+ }
+ }
+ }
+ }
+ else {
+ return NULL;
+ }
+ }
+
+ /**
+ * Magic set method to update an attribute
+ *
+ * @param string $attribute
+ * @param string $value
+ * @return bool
+ */
+ abstract public function __set($attribute, $value);
+
+ /**
+ * Magic isset method to check for the existence of an attribute
+ *
+ * @param string $attribute
+ * @return bool
+ */
+ public function __isset($attribute) {
+ if (isset($this->info[0]) && is_array($this->info[0])) {
+ foreach ($this->info[0] as $keyAttr => $valueAttr) {
+ if (strtolower($keyAttr) == strtolower($attribute)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
+?>
diff --git a/inc/adLDAP/collections/adLDAPComputerCollection.php b/inc/adLDAP/collections/adLDAPComputerCollection.php
new file mode 100644
index 000000000..4f11d8f41
--- /dev/null
+++ b/inc/adLDAP/collections/adLDAPComputerCollection.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage ComputerCollection
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+*/
+
+class adLDAPComputerCollection extends adLDAPCollection
+{
+
+ public function __set($attribute, $value)
+ {
+
+ }
+}
+?>
diff --git a/inc/adLDAP/collections/adLDAPContactCollection.php b/inc/adLDAP/collections/adLDAPContactCollection.php
new file mode 100644
index 000000000..d42fe6d4c
--- /dev/null
+++ b/inc/adLDAP/collections/adLDAPContactCollection.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage ContactCollection
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+*/
+
+class adLDAPContactCollection extends adLDAPCollection
+{
+
+ public function __set($attribute, $value)
+ {
+
+ }
+}
+?>
diff --git a/inc/adLDAP/collections/adLDAPGroupCollection.php b/inc/adLDAP/collections/adLDAPGroupCollection.php
new file mode 100644
index 000000000..cff12fc20
--- /dev/null
+++ b/inc/adLDAP/collections/adLDAPGroupCollection.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage GroupCollection
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+*/
+
+class adLDAPGroupCollection extends adLDAPCollection
+{
+
+ public function __set($attribute, $value)
+ {
+
+ }
+}
+?>
diff --git a/inc/adLDAP/collections/adLDAPUserCollection.php b/inc/adLDAP/collections/adLDAPUserCollection.php
new file mode 100644
index 000000000..801d90296
--- /dev/null
+++ b/inc/adLDAP/collections/adLDAPUserCollection.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
+ * Version 4.0.4
+ *
+ * PHP Version 5 with SSL and LDAP support
+ *
+ * Written by Scott Barnett, Richard Hyland
+ * email: scott@wiggumworld.com, adldap@richardhyland.com
+ * http://adldap.sourceforge.net/
+ *
+ * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ *
+ * We'd appreciate any improvements or additions to be submitted back
+ * to benefit the entire community :)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * @category ToolsAndUtilities
+ * @package adLDAP
+ * @subpackage UserCollection
+ * @author Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
+ * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
+ * @revision $Revision: 97 $
+ * @version 4.0.4
+ * @link http://adldap.sourceforge.net/
+*/
+
+class adLDAPUserCollection extends adLDAPCollection
+{
+
+ public function __set($attribute, $value)
+ {
+
+ }
+}
+?>
diff --git a/inc/auth.php b/inc/auth.php
index aac7a2fca..25b9e4632 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -12,13 +12,13 @@
if(!defined('DOKU_INC')) die('meh.');
// some ACL level defines
-define('AUTH_NONE',0);
-define('AUTH_READ',1);
-define('AUTH_EDIT',2);
-define('AUTH_CREATE',4);
-define('AUTH_UPLOAD',8);
-define('AUTH_DELETE',16);
-define('AUTH_ADMIN',255);
+define('AUTH_NONE', 0);
+define('AUTH_READ', 1);
+define('AUTH_EDIT', 2);
+define('AUTH_CREATE', 4);
+define('AUTH_UPLOAD', 8);
+define('AUTH_DELETE', 16);
+define('AUTH_ADMIN', 255);
/**
* Initialize the auth system.
@@ -29,10 +29,15 @@ define('AUTH_ADMIN',255);
*
* @todo backend loading maybe should be handled by the class autoloader
* @todo maybe split into multiple functions at the XXX marked positions
+ * @triggers AUTH_LOGIN_CHECK
+ * @return bool
*/
-function auth_setup(){
+function auth_setup() {
global $conf;
+ /* @var DokuWiki_Auth_Plugin $auth */
global $auth;
+ /* @var Input $INPUT */
+ global $INPUT;
global $AUTH_ACL;
global $lang;
global $config_cascade;
@@ -42,7 +47,6 @@ function auth_setup(){
if(!$conf['useacl']) return false;
// try to load auth backend from plugins
- $plugins = $plugin_controller->getList('auth');
foreach ($plugin_controller->getList('auth') as $plugin) {
if ($conf['authtype'] === $plugin) {
$auth = $plugin_controller->load('auth', $plugin);
@@ -50,7 +54,7 @@ function auth_setup(){
}
}
- if(!$auth) return;
+ if(!$auth) return false;
if ($auth && $auth->success == false) {
// degrade to unauthenticated user
@@ -60,11 +64,8 @@ function auth_setup(){
}
// do the login either by cookie or provided credentials XXX
- if (!isset($_REQUEST['u'])) $_REQUEST['u'] = '';
- if (!isset($_REQUEST['p'])) $_REQUEST['p'] = '';
- if (!isset($_REQUEST['r'])) $_REQUEST['r'] = '';
- $_REQUEST['http_credentials'] = false;
- if (!$conf['rememberme']) $_REQUEST['r'] = false;
+ $INPUT->set('http_credentials', false);
+ if(!$conf['rememberme']) $INPUT->set('r', false);
// handle renamed HTTP_AUTHORIZATION variable (can happen when a fix like
// the one presented at
@@ -73,76 +74,95 @@ function auth_setup(){
if(isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']))
$_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
// streamline HTTP auth credentials (IIS/rewrite -> mod_php)
- if(isset($_SERVER['HTTP_AUTHORIZATION'])){
- list($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']) =
+ if(isset($_SERVER['HTTP_AUTHORIZATION'])) {
+ list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
}
// if no credentials were given try to use HTTP auth (for SSO)
- if(empty($_REQUEST['u']) && empty($_COOKIE[DOKU_COOKIE]) && !empty($_SERVER['PHP_AUTH_USER'])){
- $_REQUEST['u'] = $_SERVER['PHP_AUTH_USER'];
- $_REQUEST['p'] = $_SERVER['PHP_AUTH_PW'];
- $_REQUEST['http_credentials'] = true;
+ if(!$INPUT->str('u') && empty($_COOKIE[DOKU_COOKIE]) && !empty($_SERVER['PHP_AUTH_USER'])) {
+ $INPUT->set('u', $_SERVER['PHP_AUTH_USER']);
+ $INPUT->set('p', $_SERVER['PHP_AUTH_PW']);
+ $INPUT->set('http_credentials', true);
}
// apply cleaning
- if (true === $auth->success)
- {
+ if (true === $auth->success) {
$_REQUEST['u'] = $auth->cleanUser($_REQUEST['u']);
}
- if(isset($_REQUEST['authtok'])){
+ if($INPUT->str('authtok')) {
// when an authentication token is given, trust the session
- auth_validateToken($_REQUEST['authtok']);
- }elseif(!is_null($auth) && $auth->canDo('external')){
+ auth_validateToken($INPUT->str('authtok'));
+ } elseif(!is_null($auth) && $auth->canDo('external')) {
// external trust mechanism in place
- $auth->trustExternal($_REQUEST['u'],$_REQUEST['p'],$_REQUEST['r']);
- }else{
+ $auth->trustExternal($INPUT->str('u'), $INPUT->str('p'), $INPUT->bool('r'));
+ } else {
$evdata = array(
- 'user' => $_REQUEST['u'],
- 'password' => $_REQUEST['p'],
- 'sticky' => $_REQUEST['r'],
- 'silent' => $_REQUEST['http_credentials'],
- );
+ 'user' => $INPUT->str('u'),
+ 'password' => $INPUT->str('p'),
+ 'sticky' => $INPUT->bool('r'),
+ 'silent' => $INPUT->bool('http_credentials')
+ );
trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
}
//load ACL into a global array XXX
$AUTH_ACL = auth_loadACL();
+
+ return true;
}
/**
* Loads the ACL setup and handle user wildcards
*
* @author Andreas Gohr <andi@splitbrain.org>
- * @returns array
+ * @return array
*/
-function auth_loadACL(){
+function auth_loadACL() {
global $config_cascade;
+ global $USERINFO;
if(!is_readable($config_cascade['acl']['default'])) return array();
$acl = file($config_cascade['acl']['default']);
//support user wildcard
- if(isset($_SERVER['REMOTE_USER'])){
- $len = count($acl);
- for($i=0; $i<$len; $i++){
- if($acl[$i]{0} == '#') continue;
- list($id,$rest) = preg_split('/\s+/',$acl[$i],2);
+ $out = array();
+ foreach($acl as $line) {
+ $line = trim($line);
+ if($line{0} == '#') continue;
+ list($id,$rest) = preg_split('/\s+/',$line,2);
+
+ if(strstr($line, '%GROUP%')){
+ foreach((array) $USERINFO['grps'] as $grp){
+ $nid = str_replace('%GROUP%',cleanID($grp),$id);
+ $nrest = str_replace('%GROUP%','@'.auth_nameencode($grp),$rest);
+ $out[] = "$nid\t$nrest";
+ }
+ } else {
$id = str_replace('%USER%',cleanID($_SERVER['REMOTE_USER']),$id);
$rest = str_replace('%USER%',auth_nameencode($_SERVER['REMOTE_USER']),$rest);
- $acl[$i] = "$id\t$rest";
+ $out[] = "$id\t$rest";
}
}
- return $acl;
+
+ return $out;
}
+/**
+ * Event hook callback for AUTH_LOGIN_CHECK
+ *
+ * @param $evdata
+ * @return bool
+ */
function auth_login_wrapper($evdata) {
- return auth_login($evdata['user'],
- $evdata['password'],
- $evdata['sticky'],
- $evdata['silent']);
+ return auth_login(
+ $evdata['user'],
+ $evdata['password'],
+ $evdata['sticky'],
+ $evdata['silent']
+ );
}
/**
@@ -174,53 +194,56 @@ function auth_login_wrapper($evdata) {
* @param bool $silent Don't show error on bad auth
* @return bool true on successful auth
*/
-function auth_login($user,$pass,$sticky=false,$silent=false){
+function auth_login($user, $pass, $sticky = false, $silent = false) {
global $USERINFO;
global $conf;
global $lang;
+ /* @var auth_basic $auth */
global $auth;
+
$sticky ? $sticky = true : $sticky = false; //sanity check
- if (!$auth) return false;
+ if(!$auth) return false;
- if(!empty($user)){
+ if(!empty($user)) {
//usual login
- if ($auth->checkPass($user,$pass)){
+ if($auth->checkPass($user, $pass)) {
// make logininfo globally available
$_SERVER['REMOTE_USER'] = $user;
- $secret = auth_cookiesalt(!$sticky); //bind non-sticky to session
- auth_setCookie($user,PMA_blowfish_encrypt($pass,$secret),$sticky);
+ $secret = auth_cookiesalt(!$sticky); //bind non-sticky to session
+ auth_setCookie($user, PMA_blowfish_encrypt($pass, $secret), $sticky);
return true;
- }else{
+ } else {
//invalid credentials - log off
- if(!$silent) msg($lang['badlogin'],-1);
+ if(!$silent) msg($lang['badlogin'], -1);
auth_logoff();
return false;
}
- }else{
+ } else {
// read cookie information
- list($user,$sticky,$pass) = auth_getCookie();
- if($user && $pass){
+ list($user, $sticky, $pass) = auth_getCookie();
+ if($user && $pass) {
// we got a cookie - see if we can trust it
// get session info
$session = $_SESSION[DOKU_COOKIE]['auth'];
if(isset($session) &&
- $auth->useSessionCache($user) &&
- ($session['time'] >= time()-$conf['auth_security_timeout']) &&
- ($session['user'] == $user) &&
- ($session['pass'] == sha1($pass)) && //still crypted
- ($session['buid'] == auth_browseruid()) ){
+ $auth->useSessionCache($user) &&
+ ($session['time'] >= time() - $conf['auth_security_timeout']) &&
+ ($session['user'] == $user) &&
+ ($session['pass'] == sha1($pass)) && //still crypted
+ ($session['buid'] == auth_browseruid())
+ ) {
// he has session, cookie and browser right - let him in
$_SERVER['REMOTE_USER'] = $user;
- $USERINFO = $session['info']; //FIXME move all references to session
+ $USERINFO = $session['info']; //FIXME move all references to session
return true;
}
// no we don't trust it yet - recheck pass but silent
$secret = auth_cookiesalt(!$sticky); //bind non-sticky to session
- $pass = PMA_blowfish_decrypt($pass,$secret);
- return auth_login($user,$pass,$sticky,true);
+ $pass = PMA_blowfish_decrypt($pass, $secret);
+ return auth_login($user, $pass, $sticky, true);
}
}
//just to be sure
@@ -238,8 +261,8 @@ function auth_login($user,$pass,$sticky=false,$silent=false){
* @param string $token The authentication token
* @return boolean true (or will exit on failure)
*/
-function auth_validateToken($token){
- if(!$token || $token != $_SESSION[DOKU_COOKIE]['auth']['token']){
+function auth_validateToken($token) {
+ if(!$token || $token != $_SESSION[DOKU_COOKIE]['auth']['token']) {
// bad token
header("HTTP/1.0 401 Unauthorized");
print 'Invalid auth token - maybe the session timed out';
@@ -249,7 +272,7 @@ function auth_validateToken($token){
// still here? trust the session data
global $USERINFO;
$_SERVER['REMOTE_USER'] = $_SESSION[DOKU_COOKIE]['auth']['user'];
- $USERINFO = $_SESSION[DOKU_COOKIE]['auth']['info'];
+ $USERINFO = $_SESSION[DOKU_COOKIE]['auth']['info'];
return true;
}
@@ -261,7 +284,7 @@ function auth_validateToken($token){
* @author Andreas Gohr <andi@splitbrain.org>
* @return string The auth token
*/
-function auth_createToken(){
+function auth_createToken() {
$token = md5(mt_rand());
@session_start(); // reopen the session if needed
$_SESSION[DOKU_COOKIE]['auth']['token'] = $token;
@@ -280,14 +303,14 @@ function auth_createToken(){
*
* @return string a MD5 sum of various browser headers
*/
-function auth_browseruid(){
- $ip = clientIP(true);
- $uid = '';
+function auth_browseruid() {
+ $ip = clientIP(true);
+ $uid = '';
$uid .= $_SERVER['HTTP_USER_AGENT'];
$uid .= $_SERVER['HTTP_ACCEPT_ENCODING'];
$uid .= $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$uid .= $_SERVER['HTTP_ACCEPT_CHARSET'];
- $uid .= substr($ip,0,strpos($ip,'.'));
+ $uid .= substr($ip, 0, strpos($ip, '.'));
return md5($uid);
}
@@ -303,15 +326,15 @@ function auth_browseruid(){
* @param bool $addsession if true, the sessionid is added to the salt
* @return string
*/
-function auth_cookiesalt($addsession=false){
+function auth_cookiesalt($addsession = false) {
global $conf;
$file = $conf['metadir'].'/_htcookiesalt';
$salt = io_readFile($file);
- if(empty($salt)){
- $salt = uniqid(rand(),true);
- io_saveFile($file,$salt);
+ if(empty($salt)) {
+ $salt = uniqid(rand(), true);
+ io_saveFile($file, $salt);
}
- if($addsession){
+ if($addsession) {
$salt .= session_id();
}
return $salt;
@@ -326,10 +349,10 @@ function auth_cookiesalt($addsession=false){
* @author Andreas Gohr <andi@splitbrain.org>
* @param bool $keepbc - when true, the breadcrumb data is not cleared
*/
-function auth_logoff($keepbc=false){
+function auth_logoff($keepbc = false) {
global $conf;
global $USERINFO;
- global $INFO, $ID;
+ /* @var auth_basic $auth */
global $auth;
// make sure the session is writable (it usually is)
@@ -345,13 +368,13 @@ function auth_logoff($keepbc=false){
unset($_SESSION[DOKU_COOKIE]['bc']);
if(isset($_SERVER['REMOTE_USER']))
unset($_SERVER['REMOTE_USER']);
- $USERINFO=null; //FIXME
+ $USERINFO = null; //FIXME
$cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
- if (version_compare(PHP_VERSION, '5.2.0', '>')) {
- setcookie(DOKU_COOKIE,'',time()-600000,$cookieDir,'',($conf['securecookie'] && is_ssl()),true);
- }else{
- setcookie(DOKU_COOKIE,'',time()-600000,$cookieDir,'',($conf['securecookie'] && is_ssl()));
+ if(version_compare(PHP_VERSION, '5.2.0', '>')) {
+ setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
+ } else {
+ setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()));
}
if($auth) $auth->logOff();
@@ -367,32 +390,34 @@ function auth_logoff($keepbc=false){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @see auth_isadmin
- * @param string user - Username
- * @param array groups - List of groups the user is in
- * @param bool adminonly - when true checks if user is admin
+ * @param string $user Username
+ * @param array $groups List of groups the user is in
+ * @param bool $adminonly when true checks if user is admin
+ * @return bool
*/
-function auth_ismanager($user=null,$groups=null,$adminonly=false){
+function auth_ismanager($user = null, $groups = null, $adminonly = false) {
global $conf;
global $USERINFO;
+ /* @var auth_basic $auth */
global $auth;
- if (!$auth) return false;
+ if(!$auth) return false;
if(is_null($user)) {
- if (!isset($_SERVER['REMOTE_USER'])) {
+ if(!isset($_SERVER['REMOTE_USER'])) {
return false;
} else {
$user = $_SERVER['REMOTE_USER'];
}
}
- if(is_null($groups)){
+ if(is_null($groups)) {
$groups = (array) $USERINFO['grps'];
}
// check superuser match
- if(auth_isMember($conf['superuser'],$user, $groups)) return true;
+ if(auth_isMember($conf['superuser'], $user, $groups)) return true;
if($adminonly) return false;
// check managers
- if(auth_isMember($conf['manager'],$user, $groups)) return true;
+ if(auth_isMember($conf['manager'], $user, $groups)) return true;
return false;
}
@@ -405,13 +430,15 @@ function auth_ismanager($user=null,$groups=null,$adminonly=false){
* The info is available through $INFO['isadmin'], too
*
* @author Andreas Gohr <andi@splitbrain.org>
- * @see auth_ismanager
+ * @see auth_ismanager()
+ * @param string $user Username
+ * @param array $groups List of groups the user is in
+ * @return bool
*/
-function auth_isadmin($user=null,$groups=null){
- return auth_ismanager($user,$groups,true);
+function auth_isadmin($user = null, $groups = null) {
+ return auth_ismanager($user, $groups, true);
}
-
/**
* Match a user and his groups against a comma separated list of
* users and groups to determine membership status
@@ -421,33 +448,34 @@ function auth_isadmin($user=null,$groups=null){
* @param $memberlist string commaseparated list of allowed users and groups
* @param $user string user to match against
* @param $groups array groups the user is member of
- * @returns bool true for membership acknowledged
+ * @return bool true for membership acknowledged
*/
-function auth_isMember($memberlist,$user,array $groups){
+function auth_isMember($memberlist, $user, array $groups) {
+ /* @var auth_basic $auth */
global $auth;
- if (!$auth) return false;
+ if(!$auth) return false;
// clean user and groups
- if(!$auth->isCaseSensitive()){
- $user = utf8_strtolower($user);
- $groups = array_map('utf8_strtolower',$groups);
+ if(!$auth->isCaseSensitive()) {
+ $user = utf8_strtolower($user);
+ $groups = array_map('utf8_strtolower', $groups);
}
- $user = $auth->cleanUser($user);
- $groups = array_map(array($auth,'cleanGroup'),$groups);
+ $user = $auth->cleanUser($user);
+ $groups = array_map(array($auth, 'cleanGroup'), $groups);
// extract the memberlist
- $members = explode(',',$memberlist);
- $members = array_map('trim',$members);
+ $members = explode(',', $memberlist);
+ $members = array_map('trim', $members);
$members = array_unique($members);
$members = array_filter($members);
// compare cleaned values
- foreach($members as $member){
+ foreach($members as $member) {
if(!$auth->isCaseSensitive()) $member = utf8_strtolower($member);
- if($member[0] == '@'){
- $member = $auth->cleanGroup(substr($member,1));
+ if($member[0] == '@') {
+ $member = $auth->cleanGroup(substr($member, 1));
if(in_array($member, $groups)) return true;
- }else{
+ } else {
$member = $auth->cleanUser($member);
if($member == $user) return true;
}
@@ -467,12 +495,12 @@ function auth_isMember($memberlist,$user,array $groups){
* @param string $id page ID (needs to be resolved and cleaned)
* @return int permission level
*/
-function auth_quickaclcheck($id){
+function auth_quickaclcheck($id) {
global $conf;
global $USERINFO;
# if no ACL is used always return upload rights
if(!$conf['useacl']) return AUTH_UPLOAD;
- return auth_aclcheck($id,$_SERVER['REMOTE_USER'],$USERINFO['grps']);
+ return auth_aclcheck($id, $_SERVER['REMOTE_USER'], $USERINFO['grps']);
}
/**
@@ -481,108 +509,114 @@ function auth_quickaclcheck($id){
*
* @author Andreas Gohr <andi@splitbrain.org>
*
- * @param string $id page ID (needs to be resolved and cleaned)
- * @param string $user Username
- * @param array $groups Array of groups the user is in
+ * @param string $id page ID (needs to be resolved and cleaned)
+ * @param string $user Username
+ * @param array|null $groups Array of groups the user is in
* @return int permission level
*/
-function auth_aclcheck($id,$user,$groups){
+function auth_aclcheck($id, $user, $groups) {
global $conf;
global $AUTH_ACL;
+ /* @var auth_basic $auth */
global $auth;
// if no ACL is used always return upload rights
if(!$conf['useacl']) return AUTH_UPLOAD;
- if (!$auth) return AUTH_NONE;
+ if(!$auth) return AUTH_NONE;
//make sure groups is an array
if(!is_array($groups)) $groups = array();
//if user is superuser or in superusergroup return 255 (acl_admin)
- if(auth_isadmin($user,$groups)) { return AUTH_ADMIN; }
+ if(auth_isadmin($user, $groups)) {
+ return AUTH_ADMIN;
+ }
$ci = '';
if(!$auth->isCaseSensitive()) $ci = 'ui';
- $user = $auth->cleanUser($user);
- $groups = array_map(array($auth,'cleanGroup'),(array)$groups);
- $user = auth_nameencode($user);
+ $user = $auth->cleanUser($user);
+ $groups = array_map(array($auth, 'cleanGroup'), (array) $groups);
+ $user = auth_nameencode($user);
//prepend groups with @ and nameencode
$cnt = count($groups);
- for($i=0; $i<$cnt; $i++){
+ for($i = 0; $i < $cnt; $i++) {
$groups[$i] = '@'.auth_nameencode($groups[$i]);
}
- $ns = getNS($id);
- $perm = -1;
+ $ns = getNS($id);
+ $perm = -1;
- if($user || count($groups)){
+ if($user || count($groups)) {
//add ALL group
$groups[] = '@ALL';
//add User
if($user) $groups[] = $user;
- //build regexp
- $regexp = join('|',$groups);
- }else{
- $regexp = '@ALL';
+ } else {
+ $groups[] = '@ALL';
}
//check exact match first
- $matches = preg_grep('/^'.preg_quote($id,'/').'\s+('.$regexp.')\s+/'.$ci,$AUTH_ACL);
- if(count($matches)){
- foreach($matches as $match){
- $match = preg_replace('/#.*$/','',$match); //ignore comments
- $acl = preg_split('/\s+/',$match);
+ $matches = preg_grep('/^'.preg_quote($id, '/').'\s+(\S+)\s+/'.$ci, $AUTH_ACL);
+ if(count($matches)) {
+ foreach($matches as $match) {
+ $match = preg_replace('/#.*$/', '', $match); //ignore comments
+ $acl = preg_split('/\s+/', $match);
+ if(!in_array($acl[1], $groups)) {
+ continue;
+ }
if($acl[2] > AUTH_DELETE) $acl[2] = AUTH_DELETE; //no admins in the ACL!
- if($acl[2] > $perm){
+ if($acl[2] > $perm) {
$perm = $acl[2];
}
}
- if($perm > -1){
+ if($perm > -1) {
//we had a match - return it
return $perm;
}
}
//still here? do the namespace checks
- if($ns){
+ if($ns) {
$path = $ns.':*';
- }else{
+ } else {
$path = '*'; //root document
}
- do{
- $matches = preg_grep('/^'.preg_quote($path,'/').'\s+('.$regexp.')\s+/'.$ci,$AUTH_ACL);
- if(count($matches)){
- foreach($matches as $match){
- $match = preg_replace('/#.*$/','',$match); //ignore comments
- $acl = preg_split('/\s+/',$match);
+ do {
+ $matches = preg_grep('/^'.preg_quote($path, '/').'\s+(\S+)\s+/'.$ci, $AUTH_ACL);
+ if(count($matches)) {
+ foreach($matches as $match) {
+ $match = preg_replace('/#.*$/', '', $match); //ignore comments
+ $acl = preg_split('/\s+/', $match);
+ if(!in_array($acl[1], $groups)) {
+ continue;
+ }
if($acl[2] > AUTH_DELETE) $acl[2] = AUTH_DELETE; //no admins in the ACL!
- if($acl[2] > $perm){
+ if($acl[2] > $perm) {
$perm = $acl[2];
}
}
//we had a match - return it
- return $perm;
+ if($perm != -1) {
+ return $perm;
+ }
}
-
//get next higher namespace
- $ns = getNS($ns);
+ $ns = getNS($ns);
- if($path != '*'){
+ if($path != '*') {
$path = $ns.':*';
if($path == ':*') $path = '*';
- }else{
+ } else {
//we did this already
//looks like there is something wrong with the ACL
//break here
msg('No ACL setup yet! Denying access to everyone.');
return AUTH_NONE;
}
- }while(1); //this should never loop endless
-
- //still here? return no permissions
+ } while(1); //this should never loop endless
return AUTH_NONE;
}
@@ -599,21 +633,26 @@ function auth_aclcheck($id,$user,$groups){
* @author Andreas Gohr <gohr@cosmocode.de>
* @see rawurldecode()
*/
-function auth_nameencode($name,$skip_group=false){
+function auth_nameencode($name, $skip_group = false) {
global $cache_authname;
$cache =& $cache_authname;
$name = (string) $name;
// never encode wildcard FS#1955
if($name == '%USER%') return $name;
+ if($name == '%GROUP%') return $name;
- if (!isset($cache[$name][$skip_group])) {
- if($skip_group && $name{0} =='@'){
- $cache[$name][$skip_group] = '@'.preg_replace('/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/e',
- "'%'.dechex(ord(substr('\\1',-1)))",substr($name,1));
- }else{
- $cache[$name][$skip_group] = preg_replace('/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/e',
- "'%'.dechex(ord(substr('\\1',-1)))",$name);
+ if(!isset($cache[$name][$skip_group])) {
+ if($skip_group && $name{0} == '@') {
+ $cache[$name][$skip_group] = '@'.preg_replace(
+ '/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/e',
+ "'%'.dechex(ord(substr('\\1',-1)))", substr($name, 1)
+ );
+ } else {
+ $cache[$name][$skip_group] = preg_replace(
+ '/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/e',
+ "'%'.dechex(ord(substr('\\1',-1)))", $name
+ );
}
}
@@ -628,20 +667,20 @@ function auth_nameencode($name,$skip_group=false){
*
* @return string pronouncable password
*/
-function auth_pwgen(){
+function auth_pwgen() {
$pw = '';
$c = 'bcdfghjklmnprstvwz'; //consonants except hard to speak ones
- $v = 'aeiou'; //vowels
- $a = $c.$v; //both
+ $v = 'aeiou'; //vowels
+ $a = $c.$v; //both
//use two syllables...
- for($i=0;$i < 2; $i++){
- $pw .= $c[rand(0, strlen($c)-1)];
- $pw .= $v[rand(0, strlen($v)-1)];
- $pw .= $a[rand(0, strlen($a)-1)];
+ for($i = 0; $i < 2; $i++) {
+ $pw .= $c[rand(0, strlen($c) - 1)];
+ $pw .= $v[rand(0, strlen($v) - 1)];
+ $pw .= $a[rand(0, strlen($a) - 1)];
}
//... and add a nice number
- $pw .= rand(10,99);
+ $pw .= rand(10, 99);
return $pw;
}
@@ -650,38 +689,33 @@ function auth_pwgen(){
* Sends a password to the given user
*
* @author Andreas Gohr <andi@splitbrain.org>
- *
+ * @param string $user Login name of the user
+ * @param string $password The new password in clear text
* @return bool true on success
*/
-function auth_sendPassword($user,$password){
- global $conf;
+function auth_sendPassword($user, $password) {
global $lang;
+ /* @var auth_basic $auth */
global $auth;
- if (!$auth) return false;
+ if(!$auth) return false;
- $hdrs = '';
$user = $auth->cleanUser($user);
$userinfo = $auth->getUserData($user);
if(!$userinfo['mail']) return false;
$text = rawLocale('password');
- $text = str_replace('@DOKUWIKIURL@',DOKU_URL,$text);
- $text = str_replace('@FULLNAME@',$userinfo['name'],$text);
- $text = str_replace('@LOGIN@',$user,$text);
- $text = str_replace('@PASSWORD@',$password,$text);
- $text = str_replace('@TITLE@',$conf['title'],$text);
-
- if(empty($conf['mailprefix'])) {
- $subject = $lang['regpwmail'];
- } else {
- $subject = '['.$conf['mailprefix'].'] '.$lang['regpwmail'];
- }
-
- return mail_send($userinfo['name'].' <'.$userinfo['mail'].'>',
- $subject,
- $text,
- $conf['mailfrom']);
+ $trep = array(
+ 'FULLNAME' => $userinfo['name'],
+ 'LOGIN' => $user,
+ 'PASSWORD' => $password
+ );
+
+ $mail = new Mailer();
+ $mail->to($userinfo['name'].' <'.$userinfo['mail'].'>');
+ $mail->subject($lang['regpwmail']);
+ $mail->setBody($text, $trep);
+ return $mail->send();
}
/**
@@ -690,76 +724,72 @@ function auth_sendPassword($user,$password){
* This registers a new user - Data is read directly from $_POST
*
* @author Andreas Gohr <andi@splitbrain.org>
- *
* @return bool true on success, false on any error
*/
-function register(){
+function register() {
global $lang;
global $conf;
+ /* @var auth_basic $auth */
global $auth;
+ global $INPUT;
- if(!$_POST['save']) return false;
+ if(!$INPUT->post->bool('save')) return false;
if(!actionOK('register')) return false;
- //clean username
- $_POST['login'] = trim($auth->cleanUser($_POST['login']));
-
- //clean fullname and email
- $_POST['fullname'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/','',$_POST['fullname']));
- $_POST['email'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/','',$_POST['email']));
+ // gather input
+ $login = trim($auth->cleanUser($INPUT->post->str('login')));
+ $fullname = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $INPUT->post->str('fullname')));
+ $email = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $INPUT->post->str('email')));
+ $pass = $INPUT->post->str('pass');
+ $passchk = $INPUT->post->str('passchk');
- if( empty($_POST['login']) ||
- empty($_POST['fullname']) ||
- empty($_POST['email']) ){
- msg($lang['regmissing'],-1);
+ if(empty($login) || empty($fullname) || empty($email)) {
+ msg($lang['regmissing'], -1);
return false;
}
- if ($conf['autopasswd']) {
- $pass = auth_pwgen(); // automatically generate password
- } elseif (empty($_POST['pass']) ||
- empty($_POST['passchk'])) {
- msg($lang['regmissing'], -1); // complain about missing passwords
+ if($conf['autopasswd']) {
+ $pass = auth_pwgen(); // automatically generate password
+ } elseif(empty($pass) || empty($passchk)) {
+ msg($lang['regmissing'], -1); // complain about missing passwords
return false;
- } elseif ($_POST['pass'] != $_POST['passchk']) {
- msg($lang['regbadpass'], -1); // complain about misspelled passwords
+ } elseif($pass != $passchk) {
+ msg($lang['regbadpass'], -1); // complain about misspelled passwords
return false;
- } else {
- $pass = $_POST['pass']; // accept checked and valid password
}
//check mail
- if(!mail_isvalid($_POST['email'])){
- msg($lang['regbadmail'],-1);
+ if(!mail_isvalid($email)) {
+ msg($lang['regbadmail'], -1);
return false;
}
//okay try to create the user
- if(!$auth->triggerUserMod('create', array($_POST['login'],$pass,$_POST['fullname'],$_POST['email']))){
- msg($lang['reguexists'],-1);
+ if(!$auth->triggerUserMod('create', array($login, $pass, $fullname, $email))) {
+ msg($lang['reguexists'], -1);
return false;
}
// create substitutions for use in notification email
$substitutions = array(
- 'NEWUSER' => $_POST['login'],
- 'NEWNAME' => $_POST['fullname'],
- 'NEWEMAIL' => $_POST['email'],
- );
-
- if (!$conf['autopasswd']) {
- msg($lang['regsuccess2'],1);
- notify('', 'register', '', $_POST['login'], false, $substitutions);
+ 'NEWUSER' => $login,
+ 'NEWNAME' => $fullname,
+ 'NEWEMAIL' => $email,
+ );
+
+ if(!$conf['autopasswd']) {
+ msg($lang['regsuccess2'], 1);
+ notify('', 'register', '', $login, false, $substitutions);
return true;
}
// autogenerated password? then send him the password
- if (auth_sendPassword($_POST['login'],$pass)){
- msg($lang['regsuccess'],1);
- notify('', 'register', '', $_POST['login'], false, $substitutions);
+ if(auth_sendPassword($login, $pass)) {
+ msg($lang['regsuccess'], 1);
+ notify('', 'register', '', $login, false, $substitutions);
return true;
- }else{
- msg($lang['regmailfail'],-1);
+ } else {
+ msg($lang['regmailfail'], -1);
return false;
}
}
@@ -771,63 +801,78 @@ function register(){
*/
function updateprofile() {
global $conf;
- global $INFO;
global $lang;
+ /* @var auth_basic $auth */
global $auth;
+ /* @var Input $INPUT */
+ global $INPUT;
- if(empty($_POST['save'])) return false;
+ if(!$INPUT->post->bool('save')) return false;
if(!checkSecurityToken()) return false;
if(!actionOK('profile')) {
- msg($lang['profna'],-1);
+ msg($lang['profna'], -1);
return false;
}
- if ($_POST['newpass'] != $_POST['passchk']) {
- msg($lang['regbadpass'], -1); // complain about misspelled passwords
+ $changes = array();
+ $changes['pass'] = $INPUT->post->str('newpass');
+ $changes['name'] = $INPUT->post->str('fullname');
+ $changes['mail'] = $INPUT->post->str('email');
+
+ // check misspelled passwords
+ if($changes['pass'] != $INPUT->post->str('passchk')) {
+ msg($lang['regbadpass'], -1);
return false;
}
- //clean fullname and email
- $_POST['fullname'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/','',$_POST['fullname']));
- $_POST['email'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/','',$_POST['email']));
+ // clean fullname and email
+ $changes['name'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $changes['name']));
+ $changes['mail'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $changes['mail']));
- if ((empty($_POST['fullname']) && $auth->canDo('modName')) ||
- (empty($_POST['email']) && $auth->canDo('modMail'))) {
- msg($lang['profnoempty'],-1);
+ // no empty name and email (except the backend doesn't support them)
+ if((empty($changes['name']) && $auth->canDo('modName')) ||
+ (empty($changes['mail']) && $auth->canDo('modMail'))
+ ) {
+ msg($lang['profnoempty'], -1);
return false;
}
-
- if (!mail_isvalid($_POST['email']) && $auth->canDo('modMail')){
- msg($lang['regbadmail'],-1);
+ if(!mail_isvalid($changes['mail']) && $auth->canDo('modMail')) {
+ msg($lang['regbadmail'], -1);
return false;
}
- if ($_POST['fullname'] != $INFO['userinfo']['name'] && $auth->canDo('modName')) $changes['name'] = $_POST['fullname'];
- if ($_POST['email'] != $INFO['userinfo']['mail'] && $auth->canDo('modMail')) $changes['mail'] = $_POST['email'];
- if (!empty($_POST['newpass']) && $auth->canDo('modPass')) $changes['pass'] = $_POST['newpass'];
+ $changes = array_filter($changes);
- if (!count($changes)) {
+ // check for unavailable capabilities
+ if(!$auth->canDo('modName')) unset($changes['name']);
+ if(!$auth->canDo('modMail')) unset($changes['mail']);
+ if(!$auth->canDo('modPass')) unset($changes['pass']);
+
+ // anything to do?
+ if(!count($changes)) {
msg($lang['profnochange'], -1);
return false;
}
- if ($conf['profileconfirm']) {
- if (!$auth->checkPass($_SERVER['REMOTE_USER'], $_POST['oldpass'])) {
- msg($lang['badlogin'],-1);
+ if($conf['profileconfirm']) {
+ if(!$auth->checkPass($_SERVER['REMOTE_USER'], $INPUT->post->str('oldpass'))) {
+ msg($lang['badlogin'], -1);
return false;
}
}
- if ($result = $auth->triggerUserMod('modify', array($_SERVER['REMOTE_USER'], $changes))) {
+ if($result = $auth->triggerUserMod('modify', array($_SERVER['REMOTE_USER'], $changes))) {
// update cookie and session with the changed data
- if ($changes['pass']){
- list($user,$sticky,$pass) = auth_getCookie();
- $pass = PMA_blowfish_encrypt($changes['pass'],auth_cookiesalt(!$sticky));
- auth_setCookie($_SERVER['REMOTE_USER'],$pass,(bool)$sticky);
+ if($changes['pass']) {
+ list( /*user*/, $sticky, /*pass*/) = auth_getCookie();
+ $pass = PMA_blowfish_encrypt($changes['pass'], auth_cookiesalt(!$sticky));
+ auth_setCookie($_SERVER['REMOTE_USER'], $pass, (bool) $sticky);
}
return true;
}
+
+ return false;
}
/**
@@ -844,57 +889,89 @@ function updateprofile() {
*
* @return bool true on success, false on any error
*/
-function act_resendpwd(){
+function act_resendpwd() {
global $lang;
global $conf;
+ /* @var auth_basic $auth */
global $auth;
+ /* @var Input $INPUT */
+ global $INPUT;
if(!actionOK('resendpwd')) {
- msg($lang['resendna'],-1);
+ msg($lang['resendna'], -1);
return false;
}
- $token = preg_replace('/[^a-f0-9]+/','',$_REQUEST['pwauth']);
+ $token = preg_replace('/[^a-f0-9]+/', '', $INPUT->str('pwauth'));
- if($token){
- // we're in token phase
+ if($token) {
+ // we're in token phase - get user info from token
$tfile = $conf['cachedir'].'/'.$token{0}.'/'.$token.'.pwauth';
- if(!@file_exists($tfile)){
- msg($lang['resendpwdbadauth'],-1);
+ if(!@file_exists($tfile)) {
+ msg($lang['resendpwdbadauth'], -1);
+ $INPUT->remove('pwauth');
return false;
}
- $user = io_readfile($tfile);
- @unlink($tfile);
+ // token is only valid for 3 days
+ if((time() - filemtime($tfile)) > (3 * 60 * 60 * 24)) {
+ msg($lang['resendpwdbadauth'], -1);
+ $INPUT->remove('pwauth');
+ @unlink($tfile);
+ return false;
+ }
+
+ $user = io_readfile($tfile);
$userinfo = $auth->getUserData($user);
if(!$userinfo['mail']) {
msg($lang['resendpwdnouser'], -1);
return false;
}
- $pass = auth_pwgen();
- if (!$auth->triggerUserMod('modify', array($user,array('pass' => $pass)))) {
- msg('error modifying user data',-1);
- return false;
- }
+ if(!$conf['autopasswd']) { // we let the user choose a password
+ $pass = $INPUT->str('pass');
- if (auth_sendPassword($user,$pass)) {
- msg($lang['resendpwdsuccess'],1);
- } else {
- msg($lang['regmailfail'],-1);
+ // password given correctly?
+ if(!$pass) return false;
+ if($pass != $INPUT->str('passchk')) {
+ msg($lang['regbadpass'], -1);
+ return false;
+ }
+
+ // change it
+ if(!$auth->triggerUserMod('modify', array($user, array('pass' => $pass)))) {
+ msg('error modifying user data', -1);
+ return false;
+ }
+
+ } else { // autogenerate the password and send by mail
+
+ $pass = auth_pwgen();
+ if(!$auth->triggerUserMod('modify', array($user, array('pass' => $pass)))) {
+ msg('error modifying user data', -1);
+ return false;
+ }
+
+ if(auth_sendPassword($user, $pass)) {
+ msg($lang['resendpwdsuccess'], 1);
+ } else {
+ msg($lang['regmailfail'], -1);
+ }
}
+
+ @unlink($tfile);
return true;
} else {
// we're in request phase
- if(!$_POST['save']) return false;
+ if(!$INPUT->post->bool('save')) return false;
- if (empty($_POST['login'])) {
+ if(!$INPUT->post->str('login')) {
msg($lang['resendpwdmissing'], -1);
return false;
} else {
- $user = trim($auth->cleanUser($_POST['login']));
+ $user = trim($auth->cleanUser($INPUT->post->str('login')));
}
$userinfo = $auth->getUserData($user);
@@ -906,35 +983,29 @@ function act_resendpwd(){
// generate auth token
$token = md5(auth_cookiesalt().$user); //secret but user based
$tfile = $conf['cachedir'].'/'.$token{0}.'/'.$token.'.pwauth';
- $url = wl('',array('do'=>'resendpwd','pwauth'=>$token),true,'&');
+ $url = wl('', array('do'=> 'resendpwd', 'pwauth'=> $token), true, '&');
- io_saveFile($tfile,$user);
+ io_saveFile($tfile, $user);
$text = rawLocale('pwconfirm');
- $text = str_replace('@DOKUWIKIURL@',DOKU_URL,$text);
- $text = str_replace('@FULLNAME@',$userinfo['name'],$text);
- $text = str_replace('@LOGIN@',$user,$text);
- $text = str_replace('@TITLE@',$conf['title'],$text);
- $text = str_replace('@CONFIRM@',$url,$text);
-
- if(empty($conf['mailprefix'])) {
- $subject = $lang['regpwmail'];
+ $trep = array(
+ 'FULLNAME' => $userinfo['name'],
+ 'LOGIN' => $user,
+ 'CONFIRM' => $url
+ );
+
+ $mail = new Mailer();
+ $mail->to($userinfo['name'].' <'.$userinfo['mail'].'>');
+ $mail->subject($lang['regpwmail']);
+ $mail->setBody($text, $trep);
+ if($mail->send()) {
+ msg($lang['resendpwdconfirm'], 1);
} else {
- $subject = '['.$conf['mailprefix'].'] '.$lang['regpwmail'];
- }
-
- if(mail_send($userinfo['name'].' <'.$userinfo['mail'].'>',
- $subject,
- $text,
- $conf['mailfrom'])){
- msg($lang['resendpwdconfirm'],1);
- }else{
- msg($lang['regmailfail'],-1);
+ msg($lang['regmailfail'], -1);
}
return true;
}
-
- return false; // never reached
+ // never reached
}
/**
@@ -944,32 +1015,37 @@ function act_resendpwd(){
* is chosen.
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $clear The clear text password
+ * @param string $method The hashing method
+ * @param string $salt A salt, null for random
* @return string The crypted password
*/
-function auth_cryptPassword($clear,$method='',$salt=null){
+function auth_cryptPassword($clear, $method = '', $salt = null) {
global $conf;
if(empty($method)) $method = $conf['passcrypt'];
- $pass = new PassHash();
- $call = 'hash_'.$method;
+ $pass = new PassHash();
+ $call = 'hash_'.$method;
- if(!method_exists($pass,$call)){
- msg("Unsupported crypt method $method",-1);
+ if(!method_exists($pass, $call)) {
+ msg("Unsupported crypt method $method", -1);
return false;
}
- return $pass->$call($clear,$salt);
+ return $pass->$call($clear, $salt);
}
/**
* Verifies a cleartext password against a crypted hash
*
- * @author Andreas Gohr <andi@splitbrain.org>
- * @return bool
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $clear The clear text password
+ * @param string $crypt The hash to compare with
+ * @return bool true if both match
*/
-function auth_verifyPassword($clear,$crypt){
+function auth_verifyPassword($clear, $crypt) {
$pass = new PassHash();
- return $pass->verify_hash($clear,$crypt);
+ return $pass->verify_hash($clear, $crypt);
}
/**
@@ -978,23 +1054,25 @@ function auth_verifyPassword($clear,$crypt){
* @param string $user username
* @param string $pass encrypted password
* @param bool $sticky whether or not the cookie will last beyond the session
+ * @return bool
*/
-function auth_setCookie($user,$pass,$sticky) {
+function auth_setCookie($user, $pass, $sticky) {
global $conf;
+ /* @var auth_basic $auth */
global $auth;
global $USERINFO;
- if (!$auth) return false;
+ if(!$auth) return false;
$USERINFO = $auth->getUserData($user);
// set cookie
- $cookie = base64_encode($user).'|'.((int) $sticky).'|'.base64_encode($pass);
+ $cookie = base64_encode($user).'|'.((int) $sticky).'|'.base64_encode($pass);
$cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
- $time = $sticky ? (time()+60*60*24*365) : 0; //one year
- if (version_compare(PHP_VERSION, '5.2.0', '>')) {
- setcookie(DOKU_COOKIE,$cookie,$time,$cookieDir,'',($conf['securecookie'] && is_ssl()),true);
- }else{
- setcookie(DOKU_COOKIE,$cookie,$time,$cookieDir,'',($conf['securecookie'] && is_ssl()));
+ $time = $sticky ? (time() + 60 * 60 * 24 * 365) : 0; //one year
+ if(version_compare(PHP_VERSION, '5.2.0', '>')) {
+ setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
+ } else {
+ setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()));
}
// set session
$_SESSION[DOKU_COOKIE]['auth']['user'] = $user;
@@ -1002,6 +1080,8 @@ function auth_setCookie($user,$pass,$sticky) {
$_SESSION[DOKU_COOKIE]['auth']['buid'] = auth_browseruid();
$_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO;
$_SESSION[DOKU_COOKIE]['auth']['time'] = time();
+
+ return true;
}
/**
@@ -1009,15 +1089,15 @@ function auth_setCookie($user,$pass,$sticky) {
*
* @returns array
*/
-function auth_getCookie(){
- if (!isset($_COOKIE[DOKU_COOKIE])) {
+function auth_getCookie() {
+ if(!isset($_COOKIE[DOKU_COOKIE])) {
return array(null, null, null);
}
- list($user,$sticky,$pass) = explode('|',$_COOKIE[DOKU_COOKIE],3);
+ list($user, $sticky, $pass) = explode('|', $_COOKIE[DOKU_COOKIE], 3);
$sticky = (bool) $sticky;
$pass = base64_decode($pass);
$user = base64_decode($user);
- return array($user,$sticky,$pass);
+ return array($user, $sticky, $pass);
}
//Setup VIM: ex: et ts=2 :
diff --git a/inc/cache.php b/inc/cache.php
index ff78e37ae..5eac94934 100644
--- a/inc/cache.php
+++ b/inc/cache.php
@@ -69,7 +69,7 @@ class cache {
if (!empty($this->depends['files'])) {
foreach ($this->depends['files'] as $file) {
- if ($this->_time < @filemtime($file)) return false; // cache older than files it depends on?
+ if ($this->_time <= @filemtime($file)) return false; // cache older than files it depends on?
}
}
@@ -84,7 +84,8 @@ class cache {
* it should only overwrite a dependency when the new value is more stringent than the old
*/
function _addDependencies() {
- if (isset($_REQUEST['purge'])) $this->depends['purge'] = true; // purge requested
+ global $INPUT;
+ if ($INPUT->has('purge')) $this->depends['purge'] = true; // purge requested
}
/**
@@ -206,6 +207,8 @@ class cache_renderer extends cache_parser {
return true;
}
+ if ($this->_time < @filemtime(metaFN($this->page,'.meta'))) return false; // meta cache older than file it depends on?
+
// check current link existence is consistent with cache version
// first check the purgefile
// - if the cache is more recent than the purgefile we know no links can have been updated
@@ -238,9 +241,6 @@ class cache_renderer extends cache_parser {
// page implies metadata and possibly some other dependencies
if (isset($this->page)) {
- $metafile = metaFN($this->page,'.meta');
- $files[] = $metafile; // ... the page's own metadata
-
$valid = p_get_metadata($this->page, 'date valid'); // for xhtml this will render the metadata if needed
if (!empty($valid['age'])) {
$this->depends['age'] = isset($this->depends['age']) ?
diff --git a/inc/changelog.php b/inc/changelog.php
index 60f9b8657..688aebfd6 100644
--- a/inc/changelog.php
+++ b/inc/changelog.php
@@ -157,7 +157,8 @@ function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='',
* @param int $first number of first entry returned (for paginating
* @param int $num return $num entries
* @param string $ns restrict to given namespace
- * @param bool $flags see above
+ * @param int $flags see above
+ * @return array recently changed files
*
* @author Ben Coburn <btcoburn@silicodon.net>
* @author Kate Arzamastseva <pshns@ukr.net>
@@ -177,6 +178,8 @@ function getRecents($first,$num,$ns='',$flags=0){
$lines = @file($conf['changelog']);
}
$lines_position = count($lines)-1;
+ $media_lines_position = 0;
+ $media_lines = array();
if ($flags & RECENTS_MEDIA_PAGES_MIXED) {
$media_lines = @file($conf['media_changelog']);
@@ -188,7 +191,7 @@ function getRecents($first,$num,$ns='',$flags=0){
// handle lines
while ($lines_position >= 0 || (($flags & RECENTS_MEDIA_PAGES_MIXED) && $media_lines_position >=0)) {
if (empty($rec) && $lines_position >= 0) {
- $rec = _handleRecent(@$lines[$lines_position], $ns, $flags & ~RECENTS_MEDIA_CHANGES, $seen);
+ $rec = _handleRecent(@$lines[$lines_position], $ns, $flags, $seen);
if (!$rec) {
$lines_position --;
continue;
@@ -197,8 +200,8 @@ function getRecents($first,$num,$ns='',$flags=0){
if (($flags & RECENTS_MEDIA_PAGES_MIXED) && empty($media_rec) && $media_lines_position >= 0) {
$media_rec = _handleRecent(@$media_lines[$media_lines_position], $ns, $flags | RECENTS_MEDIA_CHANGES, $seen);
if (!$media_rec) {
- $media_lines_position --;
- continue;
+ $media_lines_position --;
+ continue;
}
}
if (($flags & RECENTS_MEDIA_PAGES_MIXED) && @$media_rec['date'] >= @$rec['date']) {
@@ -236,7 +239,8 @@ function getRecents($first,$num,$ns='',$flags=0){
* @param int $from date of the oldest entry to return
* @param int $to date of the newest entry to return (for pagination, optional)
* @param string $ns restrict to given namespace (optional)
- * @param bool $flags see above (optional)
+ * @param int $flags see above (optional)
+ * @return array of files
*
* @author Michael Hamann <michael@content-space.de>
* @author Ben Coburn <btcoburn@silicodon.net>
@@ -320,8 +324,10 @@ function _handleRecent($line,$ns,$flags,&$seen){
if ($recent['perms'] < AUTH_READ) return false;
// check existance
- $fn = (($flags & RECENTS_MEDIA_CHANGES) ? mediaFN($recent['id']) : wikiFN($recent['id']));
- if((!@file_exists($fn)) && ($flags & RECENTS_SKIP_DELETED)) return false;
+ if($flags & RECENTS_SKIP_DELETED){
+ $fn = (($flags & RECENTS_MEDIA_CHANGES) ? mediaFN($recent['id']) : wikiFN($recent['id']));
+ if(!@file_exists($fn)) return false;
+ }
return $recent;
}
diff --git a/inc/cliopts.php b/inc/cliopts.php
index 588f0bc6d..9cea686a2 100644
--- a/inc/cliopts.php
+++ b/inc/cliopts.php
@@ -6,7 +6,7 @@
*
* Copyright (c) 1997-2004 The PHP Group
*
- * LICENSE: This source file is subject to the New BSD license that is
+ * LICENSE: This source file is subject to the New BSD license that is
* available through the world-wide-web at the following URI:
* http://www.opensource.org/licenses/bsd-license.php. If you did not receive
* a copy of the New BSD License and are unable to obtain it through the web,
@@ -297,9 +297,8 @@ class Doku_Cli_Opts {
* @access private
* @return bool
*/
- function _isShortOpt($arg)
- {
- return strlen($arg) == 2 && $arg[0] == '-'
+ function _isShortOpt($arg){
+ return strlen($arg) == 2 && $arg[0] == '-'
&& preg_match('/[a-zA-Z]/', $arg[1]);
}
@@ -311,8 +310,7 @@ class Doku_Cli_Opts {
* @access private
* @return bool
*/
- function _isLongOpt($arg)
- {
+ function _isLongOpt($arg){
return strlen($arg) > 2 && $arg[0] == '-' && $arg[1] == '-' &&
preg_match('/[a-zA-Z]+$/', substr($arg, 2));
}
diff --git a/inc/common.php b/inc/common.php
index 0c769c50d..20baed6c0 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -11,11 +11,11 @@ if(!defined('DOKU_INC')) die('meh.');
/**
* These constants are used with the recents function
*/
-define('RECENTS_SKIP_DELETED',2);
-define('RECENTS_SKIP_MINORS',4);
-define('RECENTS_SKIP_SUBSPACES',8);
-define('RECENTS_MEDIA_CHANGES',16);
-define('RECENTS_MEDIA_PAGES_MIXED',32);
+define('RECENTS_SKIP_DELETED', 2);
+define('RECENTS_SKIP_MINORS', 4);
+define('RECENTS_SKIP_SUBSPACES', 8);
+define('RECENTS_MEDIA_CHANGES', 16);
+define('RECENTS_MEDIA_PAGES_MIXED', 32);
/**
* Wrapper around htmlspecialchars()
@@ -23,7 +23,7 @@ define('RECENTS_MEDIA_PAGES_MIXED',32);
* @author Andreas Gohr <andi@splitbrain.org>
* @see htmlspecialchars()
*/
-function hsc($string){
+function hsc($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
@@ -34,7 +34,7 @@ function hsc($string){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function ptln($string,$indent=0){
+function ptln($string, $indent = 0) {
echo str_repeat(' ', $indent)."$string\n";
}
@@ -43,8 +43,8 @@ function ptln($string,$indent=0){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function stripctl($string){
- return preg_replace('/[\x00-\x1F]+/s','',$string);
+function stripctl($string) {
+ return preg_replace('/[\x00-\x1F]+/s', '', $string);
}
/**
@@ -55,19 +55,20 @@ function stripctl($string){
* @link http://christ1an.blogspot.com/2007/04/preventing-csrf-efficiently.html
* @return string
*/
-function getSecurityToken(){
+function getSecurityToken() {
return md5(auth_cookiesalt().session_id().$_SERVER['REMOTE_USER']);
}
/**
* Check the secret CSRF token
*/
-function checkSecurityToken($token=null){
+function checkSecurityToken($token = null) {
+ global $INPUT;
if(!$_SERVER['REMOTE_USER']) return true; // no logged in user, no need for a check
- if(is_null($token)) $token = $_REQUEST['sectok'];
- if(getSecurityToken() != $token){
- msg('Security Token did not match. Possible CSRF attack.',-1);
+ if(is_null($token)) $token = $INPUT->str('sectok');
+ if(getSecurityToken() != $token) {
+ msg('Security Token did not match. Possible CSRF attack.', -1);
return false;
}
return true;
@@ -78,13 +79,10 @@ function checkSecurityToken($token=null){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function formSecurityToken($print=true){
+function formSecurityToken($print = true) {
$ret = '<div class="no"><input type="hidden" name="sectok" value="'.getSecurityToken().'" /></div>'."\n";
- if($print){
- echo $ret;
- }else{
- return $ret;
- }
+ if($print) echo $ret;
+ return $ret;
}
/**
@@ -93,7 +91,7 @@ function formSecurityToken($print=true){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function pageinfo(){
+function pageinfo() {
global $ID;
global $REV;
global $RANGE;
@@ -102,32 +100,32 @@ function pageinfo(){
// include ID & REV not redundant, as some parts of DokuWiki may temporarily change $ID, e.g. p_wiki_xhtml
// FIXME ... perhaps it would be better to ensure the temporary changes weren't necessary
- $info['id'] = $ID;
+ $info['id'] = $ID;
$info['rev'] = $REV;
// set info about manager/admin status.
$info['isadmin'] = false;
$info['ismanager'] = false;
- if(isset($_SERVER['REMOTE_USER'])){
- $info['userinfo'] = $USERINFO;
- $info['perm'] = auth_quickaclcheck($ID);
- $info['subscribed'] = get_info_subscribed();
- $info['client'] = $_SERVER['REMOTE_USER'];
+ if(isset($_SERVER['REMOTE_USER'])) {
+ $info['userinfo'] = $USERINFO;
+ $info['perm'] = auth_quickaclcheck($ID);
+ $info['subscribed'] = get_info_subscribed();
+ $info['client'] = $_SERVER['REMOTE_USER'];
- if($info['perm'] == AUTH_ADMIN){
+ if($info['perm'] == AUTH_ADMIN) {
$info['isadmin'] = true;
$info['ismanager'] = true;
- }elseif(auth_ismanager()){
+ } elseif(auth_ismanager()) {
$info['ismanager'] = true;
}
// if some outside auth were used only REMOTE_USER is set
- if(!$info['userinfo']['name']){
+ if(!$info['userinfo']['name']) {
$info['userinfo']['name'] = $_SERVER['REMOTE_USER'];
}
- }else{
- $info['perm'] = auth_aclcheck($ID,'',null);
+ } else {
+ $info['perm'] = auth_aclcheck($ID, '', null);
$info['subscribed'] = false;
$info['client'] = clientIP(true);
}
@@ -136,76 +134,76 @@ function pageinfo(){
$info['locked'] = checklock($ID);
$info['filepath'] = fullpath(wikiFN($ID));
$info['exists'] = @file_exists($info['filepath']);
- if($REV){
+ if($REV) {
//check if current revision was meant
- if($info['exists'] && (@filemtime($info['filepath'])==$REV)){
+ if($info['exists'] && (@filemtime($info['filepath']) == $REV)) {
$REV = '';
- }elseif($RANGE){
+ } elseif($RANGE) {
//section editing does not work with old revisions!
$REV = '';
$RANGE = '';
- msg($lang['nosecedit'],0);
- }else{
+ msg($lang['nosecedit'], 0);
+ } else {
//really use old revision
- $info['filepath'] = fullpath(wikiFN($ID,$REV));
+ $info['filepath'] = fullpath(wikiFN($ID, $REV));
$info['exists'] = @file_exists($info['filepath']);
}
}
$info['rev'] = $REV;
- if($info['exists']){
+ if($info['exists']) {
$info['writable'] = (is_writable($info['filepath']) &&
- ($info['perm'] >= AUTH_EDIT));
- }else{
+ ($info['perm'] >= AUTH_EDIT));
+ } else {
$info['writable'] = ($info['perm'] >= AUTH_CREATE);
}
- $info['editable'] = ($info['writable'] && empty($info['locked']));
- $info['lastmod'] = @filemtime($info['filepath']);
+ $info['editable'] = ($info['writable'] && empty($info['locked']));
+ $info['lastmod'] = @filemtime($info['filepath']);
//load page meta data
$info['meta'] = p_get_metadata($ID);
//who's the editor
- if($REV){
+ if($REV) {
$revinfo = getRevisionInfo($ID, $REV, 1024);
- }else{
- if (is_array($info['meta']['last_change'])) {
+ } else {
+ if(is_array($info['meta']['last_change'])) {
$revinfo = $info['meta']['last_change'];
} else {
$revinfo = getRevisionInfo($ID, $info['lastmod'], 1024);
// cache most recent changelog line in metadata if missing and still valid
- if ($revinfo!==false) {
+ if($revinfo !== false) {
$info['meta']['last_change'] = $revinfo;
p_set_metadata($ID, array('last_change' => $revinfo));
}
}
}
//and check for an external edit
- if($revinfo!==false && $revinfo['date']!=$info['lastmod']){
+ if($revinfo !== false && $revinfo['date'] != $info['lastmod']) {
// cached changelog line no longer valid
- $revinfo = false;
+ $revinfo = false;
$info['meta']['last_change'] = $revinfo;
p_set_metadata($ID, array('last_change' => $revinfo));
}
- $info['ip'] = $revinfo['ip'];
- $info['user'] = $revinfo['user'];
- $info['sum'] = $revinfo['sum'];
+ $info['ip'] = $revinfo['ip'];
+ $info['user'] = $revinfo['user'];
+ $info['sum'] = $revinfo['sum'];
// See also $INFO['meta']['last_change'] which is the most recent log line for page $ID.
// Use $INFO['meta']['last_change']['type']===DOKU_CHANGE_TYPE_MINOR_EDIT in place of $info['minor'].
- if($revinfo['user']){
+ if($revinfo['user']) {
$info['editor'] = $revinfo['user'];
- }else{
+ } else {
$info['editor'] = $revinfo['ip'];
}
// draft
- $draft = getCacheName($info['client'].$ID,'.draft');
- if(@file_exists($draft)){
- if(@filemtime($draft) < @filemtime(wikiFN($ID))){
+ $draft = getCacheName($info['client'].$ID, '.draft');
+ if(@file_exists($draft)) {
+ if(@filemtime($draft) < @filemtime(wikiFN($ID))) {
// remove stale draft
@unlink($draft);
- }else{
+ } else {
$info['draft'] = $draft;
}
}
@@ -221,14 +219,14 @@ function pageinfo(){
*
* @author Andreas Gohr
*/
-function buildURLparams($params, $sep='&amp;'){
+function buildURLparams($params, $sep = '&amp;') {
$url = '';
$amp = false;
- foreach($params as $key => $val){
+ foreach($params as $key => $val) {
if($amp) $url .= $sep;
$url .= rawurlencode($key).'=';
- $url .= rawurlencode((string)$val);
+ $url .= rawurlencode((string) $val);
$amp = true;
}
return $url;
@@ -241,29 +239,28 @@ function buildURLparams($params, $sep='&amp;'){
*
* @author Andreas Gohr
*/
-function buildAttributes($params,$skipempty=false){
- $url = '';
+function buildAttributes($params, $skipempty = false) {
+ $url = '';
$white = false;
- foreach($params as $key => $val){
+ foreach($params as $key => $val) {
if($key{0} == '_') continue;
if($val === '' && $skipempty) continue;
if($white) $url .= ' ';
$url .= $key.'="';
- $url .= htmlspecialchars ($val);
+ $url .= htmlspecialchars($val);
$url .= '"';
$white = true;
}
return $url;
}
-
/**
* This builds the breadcrumb trail and returns it as array
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function breadcrumbs(){
+function breadcrumbs() {
// we prepare the breadcrumbs early for quick session closing
static $crumbs = null;
if($crumbs != null) return $crumbs;
@@ -276,30 +273,30 @@ function breadcrumbs(){
$crumbs = isset($_SESSION[DOKU_COOKIE]['bc']) ? $_SESSION[DOKU_COOKIE]['bc'] : array();
//we only save on show and existing wiki documents
$file = wikiFN($ID);
- if($ACT != 'show' || !@file_exists($file)){
+ if($ACT != 'show' || !@file_exists($file)) {
$_SESSION[DOKU_COOKIE]['bc'] = $crumbs;
return $crumbs;
}
// page names
$name = noNSorNS($ID);
- if (useHeading('navigation')) {
+ if(useHeading('navigation')) {
// get page title
- $title = p_get_first_heading($ID,METADATA_RENDER_USING_SIMPLE_CACHE);
- if ($title) {
+ $title = p_get_first_heading($ID, METADATA_RENDER_USING_SIMPLE_CACHE);
+ if($title) {
$name = $title;
}
}
//remove ID from array
- if (isset($crumbs[$ID])) {
+ if(isset($crumbs[$ID])) {
unset($crumbs[$ID]);
}
//add to array
$crumbs[$ID] = $name;
//reduce size
- while(count($crumbs) > $conf['breadcrumbs']){
+ while(count($crumbs) > $conf['breadcrumbs']) {
array_shift($crumbs);
}
//save to session
@@ -318,18 +315,19 @@ function breadcrumbs(){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function idfilter($id,$ue=true){
+function idfilter($id, $ue = true) {
global $conf;
- if ($conf['useslash'] && $conf['userewrite']){
- $id = strtr($id,':','/');
- }elseif (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' &&
- $conf['userewrite']) {
- $id = strtr($id,':',';');
- }
- if($ue){
+ if($conf['useslash'] && $conf['userewrite']) {
+ $id = strtr($id, ':', '/');
+ } elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' &&
+ $conf['userewrite']
+ ) {
+ $id = strtr($id, ':', ';');
+ }
+ if($ue) {
$id = rawurlencode($id);
- $id = str_replace('%3A',':',$id); //keep as colon
- $id = str_replace('%2F','/',$id); //keep as slash
+ $id = str_replace('%3A', ':', $id); //keep as colon
+ $id = str_replace('%2F', '/', $id); //keep as slash
}
return $id;
}
@@ -342,33 +340,35 @@ function idfilter($id,$ue=true){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function wl($id='',$more='',$abs=false,$sep='&amp;'){
+function wl($id = '', $urlParameters = '', $absolute = false, $separator = '&amp;') {
global $conf;
- if(is_array($more)){
- $more = buildURLparams($more,$sep);
- }else{
- $more = str_replace(',',$sep,$more);
+ if(is_array($urlParameters)) {
+ $urlParameters = buildURLparams($urlParameters, $separator);
+ } else {
+ $urlParameters = str_replace(',', $separator, $urlParameters);
}
-
- $id = idfilter($id);
- if($abs){
+ if($id === '') {
+ $id = $conf['start'];
+ }
+ $id = idfilter($id);
+ if($absolute) {
$xlink = DOKU_URL;
- }else{
+ } else {
$xlink = DOKU_BASE;
}
- if($conf['userewrite'] == 2){
+ if($conf['userewrite'] == 2) {
$xlink .= DOKU_SCRIPT.'/'.$id;
- if($more) $xlink .= '?'.$more;
- }elseif($conf['userewrite']){
+ if($urlParameters) $xlink .= '?'.$urlParameters;
+ } elseif($conf['userewrite']) {
$xlink .= $id;
- if($more) $xlink .= '?'.$more;
- }elseif($id){
+ if($urlParameters) $xlink .= '?'.$urlParameters;
+ } elseif($id) {
$xlink .= DOKU_SCRIPT.'?id='.$id;
- if($more) $xlink .= $sep.$more;
- }else{
+ if($urlParameters) $xlink .= $separator.$urlParameters;
+ } else {
$xlink .= DOKU_SCRIPT;
- if($more) $xlink .= '?'.$more;
+ if($urlParameters) $xlink .= '?'.$urlParameters;
}
return $xlink;
@@ -381,29 +381,29 @@ function wl($id='',$more='',$abs=false,$sep='&amp;'){
*
* @author Ben Coburn <btcoburn@silicodon.net>
*/
-function exportlink($id='',$format='raw',$more='',$abs=false,$sep='&amp;'){
+function exportlink($id = '', $format = 'raw', $more = '', $abs = false, $sep = '&amp;') {
global $conf;
- if(is_array($more)){
- $more = buildURLparams($more,$sep);
- }else{
- $more = str_replace(',',$sep,$more);
+ if(is_array($more)) {
+ $more = buildURLparams($more, $sep);
+ } else {
+ $more = str_replace(',', $sep, $more);
}
$format = rawurlencode($format);
- $id = idfilter($id);
- if($abs){
+ $id = idfilter($id);
+ if($abs) {
$xlink = DOKU_URL;
- }else{
+ } else {
$xlink = DOKU_BASE;
}
- if($conf['userewrite'] == 2){
+ if($conf['userewrite'] == 2) {
$xlink .= DOKU_SCRIPT.'/'.$id.'?do=export_'.$format;
if($more) $xlink .= $sep.$more;
- }elseif($conf['userewrite'] == 1){
+ } elseif($conf['userewrite'] == 1) {
$xlink .= '_export/'.$format.'/'.$id;
if($more) $xlink .= '?'.$more;
- }else{
+ } else {
$xlink .= DOKU_SCRIPT.'?do=export_'.$format.$sep.'id='.$id;
if($more) $xlink .= $sep.$more;
}
@@ -419,42 +419,43 @@ function exportlink($id='',$format='raw',$more='',$abs=false,$sep='&amp;'){
* The $more parameter should always be given as array, the function then
* will strip default parameters to produce even cleaner URLs
*
- * @param string $id - the media file id or URL
- * @param mixed $more - string or array with additional parameters
- * @param boolean $direct - link to detail page if false
- * @param string $sep - URL parameter separator
- * @param boolean $abs - Create an absolute URL
+ * @param string $id the media file id or URL
+ * @param mixed $more string or array with additional parameters
+ * @param bool $direct link to detail page if false
+ * @param string $sep URL parameter separator
+ * @param bool $abs Create an absolute URL
+ * @return string
*/
-function ml($id='',$more='',$direct=true,$sep='&amp;',$abs=false){
+function ml($id = '', $more = '', $direct = true, $sep = '&amp;', $abs = false) {
global $conf;
- if(is_array($more)){
+ if(is_array($more)) {
// strip defaults for shorter URLs
if(isset($more['cache']) && $more['cache'] == 'cache') unset($more['cache']);
if(!$more['w']) unset($more['w']);
if(!$more['h']) unset($more['h']);
if(isset($more['id']) && $direct) unset($more['id']);
- $more = buildURLparams($more,$sep);
- }else{
- $more = str_replace('cache=cache','',$more); //skip default
- $more = str_replace(',,',',',$more);
- $more = str_replace(',',$sep,$more);
+ $more = buildURLparams($more, $sep);
+ } else {
+ $more = str_replace('cache=cache', '', $more); //skip default
+ $more = str_replace(',,', ',', $more);
+ $more = str_replace(',', $sep, $more);
}
- if($abs){
+ if($abs) {
$xlink = DOKU_URL;
- }else{
+ } else {
$xlink = DOKU_BASE;
}
// external URLs are always direct without rewriting
- if(preg_match('#^(https?|ftp)://#i',$id)){
+ if(preg_match('#^(https?|ftp)://#i', $id)) {
$xlink .= 'lib/exe/fetch.php';
// add hash:
- $xlink .= '?hash='.substr(md5(auth_cookiesalt().$id),0,6);
- if($more){
+ $xlink .= '?hash='.substr(md5(auth_cookiesalt().$id), 0, 6);
+ if($more) {
$xlink .= $sep.$more;
$xlink .= $sep.'media='.rawurlencode($id);
- }else{
+ } else {
$xlink .= $sep.'media='.rawurlencode($id);
}
return $xlink;
@@ -463,29 +464,29 @@ function ml($id='',$more='',$direct=true,$sep='&amp;',$abs=false){
$id = idfilter($id);
// decide on scriptname
- if($direct){
- if($conf['userewrite'] == 1){
+ if($direct) {
+ if($conf['userewrite'] == 1) {
$script = '_media';
- }else{
+ } else {
$script = 'lib/exe/fetch.php';
}
- }else{
- if($conf['userewrite'] == 1){
+ } else {
+ if($conf['userewrite'] == 1) {
$script = '_detail';
- }else{
+ } else {
$script = 'lib/exe/detail.php';
}
}
// build URL based on rewrite mode
- if($conf['userewrite']){
+ if($conf['userewrite']) {
$xlink .= $script.'/'.$id;
if($more) $xlink .= '?'.$more;
- }else{
- if($more){
+ } else {
+ if($more) {
$xlink .= $script.'?'.$more;
$xlink .= $sep.'media='.$id;
- }else{
+ } else {
$xlink .= $script.'?media='.$id;
}
}
@@ -493,15 +494,14 @@ function ml($id='',$more='',$direct=true,$sep='&amp;',$abs=false){
return $xlink;
}
-
-
/**
- * Just builds a link to a script
+ * Returns the URL to the DokuWiki base script
+ *
+ * Consider using wl() instead, unless you absoutely need the doku.php endpoint
*
- * @todo maybe obsolete
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function script($script='doku.php'){
+function script() {
return DOKU_BASE.DOKU_SCRIPT;
}
@@ -529,7 +529,7 @@ function script($script='doku.php'){
* @param string $text - optional text to check, if not given the globals are used
* @return bool - true if a spam word was found
*/
-function checkwordblock($text=''){
+function checkwordblock($text = '') {
global $TEXT;
global $PRE;
global $SUF;
@@ -541,32 +541,32 @@ function checkwordblock($text=''){
if(!$text) $text = "$PRE $TEXT $SUF";
// we prepare the text a tiny bit to prevent spammers circumventing URL checks
- $text = preg_replace('!(\b)(www\.[\w.:?\-;,]+?\.[\w.:?\-;,]+?[\w/\#~:.?+=&%@\!\-.:?\-;,]+?)([.:?\-;,]*[^\w/\#~:.?+=&%@\!\-.:?\-;,])!i','\1http://\2 \2\3',$text);
+ $text = preg_replace('!(\b)(www\.[\w.:?\-;,]+?\.[\w.:?\-;,]+?[\w/\#~:.?+=&%@\!\-.:?\-;,]+?)([.:?\-;,]*[^\w/\#~:.?+=&%@\!\-.:?\-;,])!i', '\1http://\2 \2\3', $text);
$wordblocks = getWordblocks();
// how many lines to read at once (to work around some PCRE limits)
- if(version_compare(phpversion(),'4.3.0','<')){
+ if(version_compare(phpversion(), '4.3.0', '<')) {
// old versions of PCRE define a maximum of parenthesises even if no
// backreferences are used - the maximum is 99
// this is very bad performancewise and may even be too high still
$chunksize = 40;
- }else{
+ } else {
// read file in chunks of 200 - this should work around the
// MAX_PATTERN_SIZE in modern PCRE
$chunksize = 200;
}
- while($blocks = array_splice($wordblocks,0,$chunksize)){
+ while($blocks = array_splice($wordblocks, 0, $chunksize)) {
$re = array();
// build regexp from blocks
- foreach($blocks as $block){
- $block = preg_replace('/#.*$/','',$block);
+ foreach($blocks as $block) {
+ $block = preg_replace('/#.*$/', '', $block);
$block = trim($block);
if(empty($block)) continue;
- $re[] = $block;
+ $re[] = $block;
}
- if(count($re) && preg_match('#('.join('|',$re).')#si',$text,$matches)) {
+ if(count($re) && preg_match('#('.join('|', $re).')#si', $text, $matches)) {
// prepare event data
- $data['matches'] = $matches;
+ $data['matches'] = $matches;
$data['userinfo']['ip'] = $_SERVER['REMOTE_ADDR'];
if($_SERVER['REMOTE_USER']) {
$data['userinfo']['user'] = $_SERVER['REMOTE_USER'];
@@ -590,42 +590,43 @@ function checkwordblock($text=''){
* a routable public address, prefering the ones suplied in the X
* headers
*
- * @param boolean $single If set only a single IP is returned
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param boolean $single If set only a single IP is returned
+ * @return string
*/
-function clientIP($single=false){
- $ip = array();
+function clientIP($single = false) {
+ $ip = array();
$ip[] = $_SERVER['REMOTE_ADDR'];
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
- $ip = array_merge($ip,explode(',',str_replace(' ','',$_SERVER['HTTP_X_FORWARDED_FOR'])));
+ $ip = array_merge($ip, explode(',', str_replace(' ', '', $_SERVER['HTTP_X_FORWARDED_FOR'])));
if(!empty($_SERVER['HTTP_X_REAL_IP']))
- $ip = array_merge($ip,explode(',',str_replace(' ','',$_SERVER['HTTP_X_REAL_IP'])));
+ $ip = array_merge($ip, explode(',', str_replace(' ', '', $_SERVER['HTTP_X_REAL_IP'])));
// some IPv4/v6 regexps borrowed from Feyd
// see: http://forums.devnetwork.net/viewtopic.php?f=38&t=53479
- $dec_octet = '(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[0-9])';
- $hex_digit = '[A-Fa-f0-9]';
- $h16 = "{$hex_digit}{1,4}";
+ $dec_octet = '(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[0-9])';
+ $hex_digit = '[A-Fa-f0-9]';
+ $h16 = "{$hex_digit}{1,4}";
$IPv4Address = "$dec_octet\\.$dec_octet\\.$dec_octet\\.$dec_octet";
- $ls32 = "(?:$h16:$h16|$IPv4Address)";
+ $ls32 = "(?:$h16:$h16|$IPv4Address)";
$IPv6Address =
"(?:(?:{$IPv4Address})|(?:".
- "(?:$h16:){6}$ls32" .
- "|::(?:$h16:){5}$ls32" .
- "|(?:$h16)?::(?:$h16:){4}$ls32" .
- "|(?:(?:$h16:){0,1}$h16)?::(?:$h16:){3}$ls32" .
- "|(?:(?:$h16:){0,2}$h16)?::(?:$h16:){2}$ls32" .
- "|(?:(?:$h16:){0,3}$h16)?::(?:$h16:){1}$ls32" .
- "|(?:(?:$h16:){0,4}$h16)?::$ls32" .
- "|(?:(?:$h16:){0,5}$h16)?::$h16" .
- "|(?:(?:$h16:){0,6}$h16)?::" .
- ")(?:\\/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))?)";
+ "(?:$h16:){6}$ls32".
+ "|::(?:$h16:){5}$ls32".
+ "|(?:$h16)?::(?:$h16:){4}$ls32".
+ "|(?:(?:$h16:){0,1}$h16)?::(?:$h16:){3}$ls32".
+ "|(?:(?:$h16:){0,2}$h16)?::(?:$h16:){2}$ls32".
+ "|(?:(?:$h16:){0,3}$h16)?::(?:$h16:){1}$ls32".
+ "|(?:(?:$h16:){0,4}$h16)?::$ls32".
+ "|(?:(?:$h16:){0,5}$h16)?::$h16".
+ "|(?:(?:$h16:){0,6}$h16)?::".
+ ")(?:\\/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))?)";
// remove any non-IP stuff
- $cnt = count($ip);
+ $cnt = count($ip);
$match = array();
- for($i=0; $i<$cnt; $i++){
- if(preg_match("/^$IPv4Address$/",$ip[$i],$match) || preg_match("/^$IPv6Address$/",$ip[$i],$match)) {
+ for($i = 0; $i < $cnt; $i++) {
+ if(preg_match("/^$IPv4Address$/", $ip[$i], $match) || preg_match("/^$IPv6Address$/", $ip[$i], $match)) {
$ip[$i] = $match[0];
} else {
$ip[$i] = '';
@@ -635,14 +636,14 @@ function clientIP($single=false){
$ip = array_values(array_unique($ip));
if(!$ip[0]) $ip[0] = '0.0.0.0'; // for some strange reason we don't have a IP
- if(!$single) return join(',',$ip);
+ if(!$single) return join(',', $ip);
// decide which IP to use, trying to avoid local addresses
$ip = array_reverse($ip);
- foreach($ip as $i){
- if(preg_match('/^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/',$i)){
+ foreach($ip as $i) {
+ if(preg_match('/^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/', $i)) {
continue;
- }else{
+ } else {
return $i;
}
}
@@ -657,37 +658,42 @@ function clientIP($single=false){
*
* @link http://www.brainhandles.com/2007/10/15/detecting-mobile-browsers/#code
*/
-function clientismobile(){
+function clientismobile() {
if(isset($_SERVER['HTTP_X_WAP_PROFILE'])) return true;
- if(preg_match('/wap\.|\.wap/i',$_SERVER['HTTP_ACCEPT'])) return true;
+ if(preg_match('/wap\.|\.wap/i', $_SERVER['HTTP_ACCEPT'])) return true;
if(!isset($_SERVER['HTTP_USER_AGENT'])) return false;
$uamatches = 'midp|j2me|avantg|docomo|novarra|palmos|palmsource|240x320|opwv|chtml|pda|windows ce|mmp\/|blackberry|mib\/|symbian|wireless|nokia|hand|mobi|phone|cdm|up\.b|audio|SIE\-|SEC\-|samsung|HTC|mot\-|mitsu|sagem|sony|alcatel|lg|erics|vx|NEC|philips|mmm|xx|panasonic|sharp|wap|sch|rover|pocket|benq|java|pt|pg|vox|amoi|bird|compal|kg|voda|sany|kdd|dbt|sendo|sgh|gradi|jb|\d\d\di|moto';
- if(preg_match("/$uamatches/i",$_SERVER['HTTP_USER_AGENT'])) return true;
+ if(preg_match("/$uamatches/i", $_SERVER['HTTP_USER_AGENT'])) return true;
return false;
}
-
/**
* Convert one or more comma separated IPs to hostnames
*
+ * If $conf['dnslookups'] is disabled it simply returns the input string
+ *
* @author Glen Harris <astfgl@iamnota.org>
- * @returns a comma separated list of hostnames
+ * @param string $ips comma separated list of IP addresses
+ * @return string a comma separated list of hostnames
*/
-function gethostsbyaddrs($ips){
+function gethostsbyaddrs($ips) {
+ global $conf;
+ if(!$conf['dnslookups']) return $ips;
+
$hosts = array();
- $ips = explode(',',$ips);
+ $ips = explode(',', $ips);
if(is_array($ips)) {
- foreach($ips as $ip){
+ foreach($ips as $ip) {
$hosts[] = gethostbyaddr(trim($ip));
}
- return join(',',$hosts);
+ return join(',', $hosts);
} else {
return gethostbyaddr(trim($ips));
}
@@ -700,7 +706,7 @@ function gethostsbyaddrs($ips){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function checklock($id){
+function checklock($id) {
global $conf;
$lock = wikiLockFN($id);
@@ -708,14 +714,14 @@ function checklock($id){
if(!@file_exists($lock)) return false;
//lockfile expired
- if((time() - filemtime($lock)) > $conf['locktime']){
+ if((time() - filemtime($lock)) > $conf['locktime']) {
@unlink($lock);
return false;
}
//my own lock
- list($ip,$session) = explode("\n",io_readFile($lock));
- if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()){
+ list($ip, $session) = explode("\n", io_readFile($lock));
+ if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()) {
return false;
}
@@ -727,18 +733,18 @@ function checklock($id){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function lock($id){
+function lock($id) {
global $conf;
- if($conf['locktime'] == 0){
+ if($conf['locktime'] == 0) {
return;
}
$lock = wikiLockFN($id);
- if($_SERVER['REMOTE_USER']){
- io_saveFile($lock,$_SERVER['REMOTE_USER']);
- }else{
- io_saveFile($lock,clientIP()."\n".session_id());
+ if($_SERVER['REMOTE_USER']) {
+ io_saveFile($lock, $_SERVER['REMOTE_USER']);
+ } else {
+ io_saveFile($lock, clientIP()."\n".session_id());
}
}
@@ -746,13 +752,14 @@ function lock($id){
* Unlock a page if it was locked by the user
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $id page id to unlock
* @return bool true if a lock was removed
*/
-function unlock($id){
+function unlock($id) {
$lock = wikiLockFN($id);
- if(@file_exists($lock)){
- list($ip,$session) = explode("\n",io_readFile($lock));
- if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()){
+ if(@file_exists($lock)) {
+ list($ip, $session) = explode("\n", io_readFile($lock));
+ if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()) {
@unlink($lock);
return true;
}
@@ -766,8 +773,8 @@ function unlock($id){
* @see formText() for 2crlf conversion
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function cleanText($text){
- $text = preg_replace("/(\015\012)|(\015)/","\012",$text);
+function cleanText($text) {
+ $text = preg_replace("/(\015\012)|(\015)/", "\012", $text);
return $text;
}
@@ -779,8 +786,8 @@ function cleanText($text){
* @see cleanText() for 2unix conversion
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function formText($text){
- $text = str_replace("\012","\015\012",$text);
+function formText($text) {
+ $text = str_replace("\012", "\015\012", $text);
return htmlspecialchars($text);
}
@@ -789,8 +796,8 @@ function formText($text){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rawLocale($id){
- return io_readFile(localeFN($id));
+function rawLocale($id, $ext = 'txt') {
+ return io_readFile(localeFN($id, $ext));
}
/**
@@ -798,7 +805,7 @@ function rawLocale($id){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rawWiki($id,$rev=''){
+function rawWiki($id, $rev = '') {
return io_readWikiPage(wikiFN($id, $rev), $id, $rev);
}
@@ -808,34 +815,33 @@ function rawWiki($id,$rev=''){
* @triggers COMMON_PAGETPL_LOAD
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function pageTemplate($id){
+function pageTemplate($id) {
global $conf;
- if (is_array($id)) $id = $id[0];
+ if(is_array($id)) $id = $id[0];
// prepare initial event data
$data = array(
- 'id' => $id, // the id of the page to be created
- 'tpl' => '', // the text used as template
- 'tplfile' => '', // the file above text was/should be loaded from
- 'doreplace' => true // should wildcard replacements be done on the text?
+ 'id' => $id, // the id of the page to be created
+ 'tpl' => '', // the text used as template
+ 'tplfile' => '', // the file above text was/should be loaded from
+ 'doreplace' => true // should wildcard replacements be done on the text?
);
- $evt = new Doku_Event('COMMON_PAGETPL_LOAD',$data);
- if($evt->advise_before(true)){
+ $evt = new Doku_Event('COMMON_PAGETPL_LOAD', $data);
+ if($evt->advise_before(true)) {
// the before event might have loaded the content already
- if(empty($data['tpl'])){
+ if(empty($data['tpl'])) {
// if the before event did not set a template file, try to find one
- if(empty($data['tplfile'])){
+ if(empty($data['tplfile'])) {
$path = dirname(wikiFN($id));
- $tpl = '';
- if(@file_exists($path.'/_template.txt')){
+ if(@file_exists($path.'/_template.txt')) {
$data['tplfile'] = $path.'/_template.txt';
- }else{
+ } else {
// search upper namespaces for templates
- $len = strlen(rtrim($conf['datadir'],'/'));
- while (strlen($path) >= $len){
- if(@file_exists($path.'/__template.txt')){
+ $len = strlen(rtrim($conf['datadir'], '/'));
+ while(strlen($path) >= $len) {
+ if(@file_exists($path.'/__template.txt')) {
$data['tplfile'] = $path.'/__template.txt';
break;
}
@@ -861,6 +867,12 @@ function pageTemplate($id){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function parsePageTemplate(&$data) {
+ /**
+ * @var string $id the id of the page to be created
+ * @var string $tpl the text used as template
+ * @var string $tplfile the file above text was/should be loaded from
+ * @var bool $doreplace should wildcard replacements be done on the text?
+ */
extract($data);
global $USERINFO;
@@ -870,39 +882,41 @@ function parsePageTemplate(&$data) {
$file = noNS($id);
$page = strtr($file, $conf['sepchar'], ' ');
- $tpl = str_replace(array(
- '@ID@',
- '@NS@',
- '@FILE@',
- '@!FILE@',
- '@!FILE!@',
- '@PAGE@',
- '@!PAGE@',
- '@!!PAGE@',
- '@!PAGE!@',
- '@USER@',
- '@NAME@',
- '@MAIL@',
- '@DATE@',
- ),
- array(
- $id,
- getNS($id),
- $file,
- utf8_ucfirst($file),
- utf8_strtoupper($file),
- $page,
- utf8_ucfirst($page),
- utf8_ucwords($page),
- utf8_strtoupper($page),
- $_SERVER['REMOTE_USER'],
- $USERINFO['name'],
- $USERINFO['mail'],
- $conf['dformat'],
- ), $tpl);
+ $tpl = str_replace(
+ array(
+ '@ID@',
+ '@NS@',
+ '@FILE@',
+ '@!FILE@',
+ '@!FILE!@',
+ '@PAGE@',
+ '@!PAGE@',
+ '@!!PAGE@',
+ '@!PAGE!@',
+ '@USER@',
+ '@NAME@',
+ '@MAIL@',
+ '@DATE@',
+ ),
+ array(
+ $id,
+ getNS($id),
+ $file,
+ utf8_ucfirst($file),
+ utf8_strtoupper($file),
+ $page,
+ utf8_ucfirst($page),
+ utf8_ucwords($page),
+ utf8_strtoupper($page),
+ $_SERVER['REMOTE_USER'],
+ $USERINFO['name'],
+ $USERINFO['mail'],
+ $conf['dformat'],
+ ), $tpl
+ );
// we need the callback to work around strftime's char limit
- $tpl = preg_replace_callback('/%./',create_function('$m','return strftime($m[0]);'),$tpl);
+ $tpl = preg_replace_callback('/%./', create_function('$m', 'return strftime($m[0]);'), $tpl);
$data['tpl'] = $tpl;
return $tpl;
}
@@ -917,17 +931,17 @@ function parsePageTemplate(&$data) {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rawWikiSlices($range,$id,$rev=''){
+function rawWikiSlices($range, $id, $rev = '') {
$text = io_readWikiPage(wikiFN($id, $rev), $id, $rev);
// Parse range
- list($from,$to) = explode('-',$range,2);
+ list($from, $to) = explode('-', $range, 2);
// Make range zero-based, use defaults if marker is missing
$from = !$from ? 0 : ($from - 1);
$to = !$to ? strlen($text) : ($to - 1);
$slices[0] = substr($text, 0, $from);
- $slices[1] = substr($text, $from, $to-$from);
+ $slices[1] = substr($text, $from, $to - $from);
$slices[2] = substr($text, $to);
return $slices;
}
@@ -941,14 +955,16 @@ function rawWikiSlices($range,$id,$rev=''){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function con($pre,$text,$suf,$pretty=false){
- if($pretty){
- if ($pre !== '' && substr($pre, -1) !== "\n" &&
- substr($text, 0, 1) !== "\n") {
+function con($pre, $text, $suf, $pretty = false) {
+ if($pretty) {
+ if($pre !== '' && substr($pre, -1) !== "\n" &&
+ substr($text, 0, 1) !== "\n"
+ ) {
$pre .= "\n";
}
- if ($suf !== '' && substr($text, -1) !== "\n" &&
- substr($suf, 0, 1) !== "\n") {
+ if($suf !== '' && substr($text, -1) !== "\n" &&
+ substr($suf, 0, 1) !== "\n"
+ ) {
$text .= "\n";
}
}
@@ -963,7 +979,7 @@ function con($pre,$text,$suf,$pretty=false){
* @author Andreas Gohr <andi@splitbrain.org>
* @author Ben Coburn <btcoburn@silicodon.net>
*/
-function saveWikiText($id,$text,$summary,$minor=false){
+function saveWikiText($id, $text, $summary, $minor = false) {
/* Note to developers:
This code is subtle and delicate. Test the behavior of
the attic and changelog with dokuwiki and external edits
@@ -974,31 +990,31 @@ function saveWikiText($id,$text,$summary,$minor=false){
global $lang;
global $REV;
// ignore if no changes were made
- if($text == rawWiki($id,'')){
+ if($text == rawWiki($id, '')) {
return;
}
- $file = wikiFN($id);
- $old = @filemtime($file); // from page
- $wasRemoved = (trim($text) == ''); // check for empty or whitespace only
- $wasCreated = !@file_exists($file);
- $wasReverted = ($REV==true);
- $newRev = false;
- $oldRev = getRevisions($id, -1, 1, 1024); // from changelog
- $oldRev = (int)(empty($oldRev)?0:$oldRev[0]);
- if(!@file_exists(wikiFN($id, $old)) && @file_exists($file) && $old>=$oldRev) {
+ $file = wikiFN($id);
+ $old = @filemtime($file); // from page
+ $wasRemoved = (trim($text) == ''); // check for empty or whitespace only
+ $wasCreated = !@file_exists($file);
+ $wasReverted = ($REV == true);
+ $newRev = false;
+ $oldRev = getRevisions($id, -1, 1, 1024); // from changelog
+ $oldRev = (int) (empty($oldRev) ? 0 : $oldRev[0]);
+ if(!@file_exists(wikiFN($id, $old)) && @file_exists($file) && $old >= $oldRev) {
// add old revision to the attic if missing
saveOldRevision($id);
// add a changelog entry if this edit came from outside dokuwiki
- if ($old>$oldRev) {
- addLogEntry($old, $id, DOKU_CHANGE_TYPE_EDIT, $lang['external_edit'], '', array('ExternalEdit'=>true));
+ if($old > $oldRev) {
+ addLogEntry($old, $id, DOKU_CHANGE_TYPE_EDIT, $lang['external_edit'], '', array('ExternalEdit'=> true));
// remove soon to be stale instructions
$cache = new cache_instructions($id, $file);
$cache->removeCache();
}
}
- if ($wasRemoved){
+ if($wasRemoved) {
// Send "update" event with empty data, so plugins can react to page deletion
$data = array(array($file, '', false), getNS($id), noNS($id), false);
trigger_event('IO_WIKIPAGE_WRITE', $data);
@@ -1017,37 +1033,40 @@ function saveWikiText($id,$text,$summary,$minor=false){
// remove empty namespaces
io_sweepNS($id, 'datadir');
io_sweepNS($id, 'mediadir');
- }else{
+ } else {
// save file (namespace dir is created in io_writeWikiPage)
io_writeWikiPage($file, $text, $id);
// pre-save the revision, to keep the attic in sync
$newRev = saveOldRevision($id);
- $del = false;
+ $del = false;
}
// select changelog line type
$extra = '';
- $type = DOKU_CHANGE_TYPE_EDIT;
- if ($wasReverted) {
- $type = DOKU_CHANGE_TYPE_REVERT;
+ $type = DOKU_CHANGE_TYPE_EDIT;
+ if($wasReverted) {
+ $type = DOKU_CHANGE_TYPE_REVERT;
$extra = $REV;
- }
- else if ($wasCreated) { $type = DOKU_CHANGE_TYPE_CREATE; }
- else if ($wasRemoved) { $type = DOKU_CHANGE_TYPE_DELETE; }
- else if ($minor && $conf['useacl'] && $_SERVER['REMOTE_USER']) { $type = DOKU_CHANGE_TYPE_MINOR_EDIT; } //minor edits only for logged in users
+ } else if($wasCreated) {
+ $type = DOKU_CHANGE_TYPE_CREATE;
+ } else if($wasRemoved) {
+ $type = DOKU_CHANGE_TYPE_DELETE;
+ } else if($minor && $conf['useacl'] && $_SERVER['REMOTE_USER']) {
+ $type = DOKU_CHANGE_TYPE_MINOR_EDIT;
+ } //minor edits only for logged in users
addLogEntry($newRev, $id, $type, $summary, $extra);
// send notify mails
- notify($id,'admin',$old,$summary,$minor);
- notify($id,'subscribers',$old,$summary,$minor);
+ notify($id, 'admin', $old, $summary, $minor);
+ notify($id, 'subscribers', $old, $summary, $minor);
// update the purgefile (timestamp of the last time anything within the wiki was changed)
- io_saveFile($conf['cachedir'].'/purgefile',time());
+ io_saveFile($conf['cachedir'].'/purgefile', time());
// if useheading is enabled, purge the cache of all linking pages
- if(useHeading('content')){
+ if(useHeading('content')) {
$pages = ft_backlinks($id);
- foreach ($pages as $page) {
+ foreach($pages as $page) {
$cache = new cache_renderer($page, wikiFN($page), 'xhtml');
$cache->removeCache();
}
@@ -1060,12 +1079,12 @@ function saveWikiText($id,$text,$summary,$minor=false){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function saveOldRevision($id){
+function saveOldRevision($id) {
global $conf;
$oldf = wikiFN($id);
if(!@file_exists($oldf)) return '';
$date = filemtime($oldf);
- $newf = wikiFN($id,$date);
+ $newf = wikiFN($id, $date);
io_writeWikiPage($newf, rawWiki($id), $id, $date);
return $date;
}
@@ -1073,88 +1092,101 @@ function saveOldRevision($id){
/**
* Sends a notify mail on page change or registration
*
- * @param string $id The changed page
- * @param string $who Who to notify (admin|subscribers|register)
- * @param int $rev Old page revision
- * @param string $summary What changed
- * @param boolean $minor Is this a minor edit?
- * @param array $replace Additional string substitutions, @KEY@ to be replaced by value
+ * @param string $id The changed page
+ * @param string $who Who to notify (admin|subscribers|register)
+ * @param int|string $rev Old page revision
+ * @param string $summary What changed
+ * @param boolean $minor Is this a minor edit?
+ * @param array $replace Additional string substitutions, @KEY@ to be replaced by value
*
+ * @return bool
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function notify($id,$who,$rev='',$summary='',$minor=false,$replace=array()){
+function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = array()) {
global $lang;
global $conf;
global $INFO;
+ global $DIFF_INLINESTYLES;
- // decide if there is something to do
- if($who == 'admin'){
- if(empty($conf['notify'])) return; //notify enabled?
+ // decide if there is something to do, eg. whom to mail
+ if($who == 'admin') {
+ if(empty($conf['notify'])) return false; //notify enabled?
$text = rawLocale('mailtext');
$to = $conf['notify'];
$bcc = '';
- }elseif($who == 'subscribers'){
- if(!$conf['subscribers']) return; //subscribers enabled?
- if($conf['useacl'] && $_SERVER['REMOTE_USER'] && $minor) return; //skip minors
+ } elseif($who == 'subscribers') {
+ if(!$conf['subscribers']) return false; //subscribers enabled?
+ if($conf['useacl'] && $_SERVER['REMOTE_USER'] && $minor) return false; //skip minors
$data = array('id' => $id, 'addresslist' => '', 'self' => false);
- trigger_event('COMMON_NOTIFY_ADDRESSLIST', $data,
- 'subscription_addresslist');
+ trigger_event(
+ 'COMMON_NOTIFY_ADDRESSLIST', $data,
+ 'subscription_addresslist'
+ );
$bcc = $data['addresslist'];
- if(empty($bcc)) return;
+ if(empty($bcc)) return false;
$to = '';
$text = rawLocale('subscr_single');
- }elseif($who == 'register'){
- if(empty($conf['registernotify'])) return;
+ } elseif($who == 'register') {
+ if(empty($conf['registernotify'])) return false;
$text = rawLocale('registermail');
$to = $conf['registernotify'];
$bcc = '';
- }else{
- return; //just to be safe
+ } else {
+ return false; //just to be safe
}
- $ip = clientIP();
- $text = str_replace('@DATE@',dformat(),$text);
- $text = str_replace('@BROWSER@',$_SERVER['HTTP_USER_AGENT'],$text);
- $text = str_replace('@IPADDRESS@',$ip,$text);
- $text = str_replace('@HOSTNAME@',gethostsbyaddrs($ip),$text);
- $text = str_replace('@NEWPAGE@',wl($id,'',true,'&'),$text);
- $text = str_replace('@PAGE@',$id,$text);
- $text = str_replace('@TITLE@',$conf['title'],$text);
- $text = str_replace('@DOKUWIKIURL@',DOKU_URL,$text);
- $text = str_replace('@SUMMARY@',$summary,$text);
- $text = str_replace('@USER@',$_SERVER['REMOTE_USER'],$text);
- $text = str_replace('@NAME@',$INFO['userinfo']['name'],$text);
- $text = str_replace('@MAIL@',$INFO['userinfo']['mail'],$text);
-
- foreach ($replace as $key => $substitution) {
- $text = str_replace('@'.strtoupper($key).'@',$substitution, $text);
- }
+ // prepare replacements (keys not set in hrep will be taken from trep)
+ $trep = array(
+ 'NEWPAGE' => wl($id, '', true, '&'),
+ 'PAGE' => $id,
+ 'SUMMARY' => $summary
+ );
+ $trep = array_merge($trep, $replace);
+ $hrep = array();
- if($who == 'register'){
+ // prepare content
+ if($who == 'register') {
$subject = $lang['mail_new_user'].' '.$summary;
- }elseif($rev){
- $subject = $lang['mail_changed'].' '.$id;
- $text = str_replace('@OLDPAGE@',wl($id,"rev=$rev",true,'&'),$text);
- $df = new Diff(explode("\n",rawWiki($id,$rev)),
- explode("\n",rawWiki($id)));
- $dformat = new UnifiedDiffFormatter();
- $diff = $dformat->format($df);
- }else{
- $subject=$lang['mail_newpage'].' '.$id;
- $text = str_replace('@OLDPAGE@','none',$text);
- $diff = rawWiki($id);
- }
- $text = str_replace('@DIFF@',$diff,$text);
- if(empty($conf['mailprefix'])) {
- if(utf8_strlen($conf['title']) < 20) {
- $subject = '['.$conf['title'].'] '.$subject;
- }else{
- $subject = '['.utf8_substr($conf['title'], 0, 20).'...] '.$subject;
- }
- }else{
- $subject = '['.$conf['mailprefix'].'] '.$subject;
- }
- mail_send($to,$subject,$text,$conf['mailfrom'],'',$bcc);
+ } elseif($rev) {
+ $subject = $lang['mail_changed'].' '.$id;
+ $trep['OLDPAGE'] = wl($id, "rev=$rev", true, '&');
+ $old_content = rawWiki($id, $rev);
+ $new_content = rawWiki($id);
+ $df = new Diff(explode("\n", $old_content),
+ explode("\n", $new_content));
+ $dformat = new UnifiedDiffFormatter();
+ $tdiff = $dformat->format($df);
+
+ $DIFF_INLINESTYLES = true;
+ $hdf = new Diff(explode("\n", hsc($old_content)),
+ explode("\n", hsc($new_content)));
+ $dformat = new InlineDiffFormatter();
+ $hdiff = $dformat->format($hdf);
+ $hdiff = '<table>'.$hdiff.'</table>';
+ $DIFF_INLINESTYLES = false;
+ } else {
+ $subject = $lang['mail_newpage'].' '.$id;
+ $trep['OLDPAGE'] = '---';
+ $tdiff = rawWiki($id);
+ $hdiff = nl2br(hsc($tdiff));
+ }
+ $trep['DIFF'] = $tdiff;
+ $hrep['DIFF'] = $hdiff;
+
+ // send mail
+ $mail = new Mailer();
+ $mail->to($to);
+ $mail->bcc($bcc);
+ $mail->subject($subject);
+ $mail->setBody($text, $trep, $hrep);
+ if($who == 'subscribers') {
+ $mail->setHeader(
+ 'List-Unsubscribe',
+ '<'.wl($id, array('do'=> 'subscribe'), true, '&').'>',
+ false
+ );
+ }
+ return $mail->send();
}
/**
@@ -1163,32 +1195,34 @@ function notify($id,$who,$rev='',$summary='',$minor=false,$replace=array()){
* @author Andreas Gohr <andi@splitbrain.org>
* @author Todd Augsburger <todd@rollerorgans.com>
*/
-function getGoogleQuery(){
- if (!isset($_SERVER['HTTP_REFERER'])) {
+function getGoogleQuery() {
+ if(!isset($_SERVER['HTTP_REFERER'])) {
return '';
}
$url = parse_url($_SERVER['HTTP_REFERER']);
- $query = array();
+ // only handle common SEs
+ if(!preg_match('/(google|bing|yahoo|ask|duckduckgo|babylon|aol|yandex)/',$url['host'])) return '';
+ $query = array();
// temporary workaround against PHP bug #49733
// see http://bugs.php.net/bug.php?id=49733
if(UTF8_MBSTRING) $enc = mb_internal_encoding();
- parse_str($url['query'],$query);
+ parse_str($url['query'], $query);
if(UTF8_MBSTRING) mb_internal_encoding($enc);
$q = '';
- if(isset($query['q']))
- $q = $query['q']; // google, live/msn, aol, ask, altavista, alltheweb, gigablast
- elseif(isset($query['p']))
- $q = $query['p']; // yahoo
- elseif(isset($query['query']))
- $q = $query['query']; // lycos, netscape, clusty, hotbot
- elseif(preg_match("#a9\.com#i",$url['host'])) // a9
- $q = urldecode(ltrim($url['path'],'/'));
-
- if($q === '') return '';
- $q = preg_split('/[\s\'"\\\\`()\]\[?:!\.{};,#+*<>\\/]+/',$q,-1,PREG_SPLIT_NO_EMPTY);
+ if(isset($query['q'])){
+ $q = $query['q'];
+ }elseif(isset($query['p'])){
+ $q = $query['p'];
+ }elseif(isset($query['query'])){
+ $q = $query['query'];
+ }
+ $q = trim($q);
+
+ if(!$q) return '';
+ $q = preg_split('/[\s\'"\\\\`()\]\[?:!\.{};,#+*<>\\/]+/', $q, -1, PREG_SPLIT_NO_EMPTY);
return $q;
}
@@ -1198,19 +1232,19 @@ function getGoogleQuery(){
* @deprecated No longer used
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function setCorrectLocale(){
+function setCorrectLocale() {
global $conf;
global $lang;
$enc = strtoupper($lang['encoding']);
- foreach ($lang['locales'] as $loc){
+ foreach($lang['locales'] as $loc) {
//try locale
- if(@setlocale(LC_ALL,$loc)) return;
+ if(@setlocale(LC_ALL, $loc)) return;
//try loceale with encoding
- if(@setlocale(LC_ALL,"$loc.$enc")) return;
+ if(@setlocale(LC_ALL, "$loc.$enc")) return;
}
//still here? try to set from environment
- @setlocale(LC_ALL,"");
+ @setlocale(LC_ALL, "");
}
/**
@@ -1222,17 +1256,17 @@ function setCorrectLocale(){
* @author Aidan Lister <aidan@php.net>
* @version 1.0.0
*/
-function filesize_h($size, $dec = 1){
+function filesize_h($size, $dec = 1) {
$sizes = array('B', 'KB', 'MB', 'GB');
$count = count($sizes);
- $i = 0;
+ $i = 0;
- while ($size >= 1024 && ($i < $count - 1)) {
+ while($size >= 1024 && ($i < $count - 1)) {
$size /= 1024;
$i++;
}
- return round($size, $dec) . ' ' . $sizes[$i];
+ return round($size, $dec).' '.$sizes[$i];
}
/**
@@ -1240,27 +1274,27 @@ function filesize_h($size, $dec = 1){
*
* @author Andreas Gohr <gohr@cosmocode.de>
*/
-function datetime_h($dt){
+function datetime_h($dt) {
global $lang;
$ago = time() - $dt;
- if($ago > 24*60*60*30*12*2){
- return sprintf($lang['years'], round($ago/(24*60*60*30*12)));
+ if($ago > 24 * 60 * 60 * 30 * 12 * 2) {
+ return sprintf($lang['years'], round($ago / (24 * 60 * 60 * 30 * 12)));
}
- if($ago > 24*60*60*30*2){
- return sprintf($lang['months'], round($ago/(24*60*60*30)));
+ if($ago > 24 * 60 * 60 * 30 * 2) {
+ return sprintf($lang['months'], round($ago / (24 * 60 * 60 * 30)));
}
- if($ago > 24*60*60*7*2){
- return sprintf($lang['weeks'], round($ago/(24*60*60*7)));
+ if($ago > 24 * 60 * 60 * 7 * 2) {
+ return sprintf($lang['weeks'], round($ago / (24 * 60 * 60 * 7)));
}
- if($ago > 24*60*60*2){
- return sprintf($lang['days'], round($ago/(24*60*60)));
+ if($ago > 24 * 60 * 60 * 2) {
+ return sprintf($lang['days'], round($ago / (24 * 60 * 60)));
}
- if($ago > 60*60*2){
- return sprintf($lang['hours'], round($ago/(60*60)));
+ if($ago > 60 * 60 * 2) {
+ return sprintf($lang['hours'], round($ago / (60 * 60)));
}
- if($ago > 60*2){
- return sprintf($lang['minutes'], round($ago/(60)));
+ if($ago > 60 * 2) {
+ return sprintf($lang['minutes'], round($ago / (60)));
}
return sprintf($lang['seconds'], $ago);
}
@@ -1274,15 +1308,15 @@ function datetime_h($dt){
* @see datetime_h
* @author Andreas Gohr <gohr@cosmocode.de>
*/
-function dformat($dt=null,$format=''){
+function dformat($dt = null, $format = '') {
global $conf;
if(is_null($dt)) $dt = time();
$dt = (int) $dt;
if(!$format) $format = $conf['dformat'];
- $format = str_replace('%f',datetime_h($dt),$format);
- return strftime($format,$dt);
+ $format = str_replace('%f', datetime_h($dt), $format);
+ return strftime($format, $dt);
}
/**
@@ -1290,14 +1324,15 @@ function dformat($dt=null,$format=''){
*
* @author <ungu at terong dot com>
* @link http://www.php.net/manual/en/function.date.php#54072
+ * @param int $int_date: current date in UNIX timestamp
+ * @return string
*/
function date_iso8601($int_date) {
- //$int_date: current date in UNIX timestamp
- $date_mod = date('Y-m-d\TH:i:s', $int_date);
- $pre_timezone = date('O', $int_date);
- $time_zone = substr($pre_timezone, 0, 3).":".substr($pre_timezone, 3, 2);
- $date_mod .= $time_zone;
- return $date_mod;
+ $date_mod = date('Y-m-d\TH:i:s', $int_date);
+ $pre_timezone = date('O', $int_date);
+ $time_zone = substr($pre_timezone, 0, 3).":".substr($pre_timezone, 3, 2);
+ $date_mod .= $time_zone;
+ return $date_mod;
}
/**
@@ -1309,16 +1344,16 @@ function date_iso8601($int_date) {
function obfuscate($email) {
global $conf;
- switch ($conf['mailguard']) {
+ switch($conf['mailguard']) {
case 'visible' :
$obfuscate = array('@' => ' [at] ', '.' => ' [dot] ', '-' => ' [dash] ');
return strtr($email, $obfuscate);
case 'hex' :
$encode = '';
- $len = strlen($email);
- for ($x=0; $x < $len; $x++){
- $encode .= '&#x' . bin2hex($email{$x}).';';
+ $len = strlen($email);
+ for($x = 0; $x < $len; $x++) {
+ $encode .= '&#x'.bin2hex($email{$x}).';';
}
return $encode;
@@ -1333,8 +1368,8 @@ function obfuscate($email) {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function unslash($string,$char="'"){
- return str_replace('\\'.$char,$char,$string);
+function unslash($string, $char = "'") {
+ return str_replace('\\'.$char, $char, $string);
}
/**
@@ -1343,10 +1378,10 @@ function unslash($string,$char="'"){
* @author <gilthans dot NO dot SPAM at gmail dot com>
* @link http://de3.php.net/manual/en/ini.core.php#79564
*/
-function php_to_byte($v){
- $l = substr($v, -1);
+function php_to_byte($v) {
+ $l = substr($v, -1);
$ret = substr($v, 0, -1);
- switch(strtoupper($l)){
+ switch(strtoupper($l)) {
case 'P':
$ret *= 1024;
case 'T':
@@ -1357,10 +1392,10 @@ function php_to_byte($v){
$ret *= 1024;
case 'K':
$ret *= 1024;
- break;
+ break;
default;
$ret *= 10;
- break;
+ break;
}
return $ret;
}
@@ -1368,8 +1403,8 @@ function php_to_byte($v){
/**
* Wrapper around preg_quote adding the default delimiter
*/
-function preg_quote_cb($string){
- return preg_quote($string,'/');
+function preg_quote_cb($string) {
+ return preg_quote($string, '/');
}
/**
@@ -1385,14 +1420,15 @@ function preg_quote_cb($string){
* @param int $max maximum chars you want for the whole string
* @param int $min minimum number of chars to have left for middle shortening
* @param string $char the shortening character to use
+ * @return string
*/
-function shorten($keep,$short,$max,$min=9,$char='…'){
+function shorten($keep, $short, $max, $min = 9, $char = '…') {
$max = $max - utf8_strlen($keep);
if($max < $min) return $keep;
$len = utf8_strlen($short);
if($len <= $max) return $keep.$short;
- $half = floor($max/2);
- return $keep.utf8_substr($short,0,$half-1).$char.utf8_substr($short,$len-$half);
+ $half = floor($max / 2);
+ return $keep.utf8_substr($short, 0, $half - 1).$char.utf8_substr($short, $len - $half);
}
/**
@@ -1401,11 +1437,11 @@ function shorten($keep,$short,$max,$min=9,$char='…'){
*
* @author Andy Webber <dokuwiki AT andywebber DOT com>
*/
-function editorinfo($username){
+function editorinfo($username) {
global $conf;
global $auth;
- switch($conf['showuseras']){
+ switch($conf['showuseras']) {
case 'username':
case 'email':
case 'email_link':
@@ -1416,13 +1452,13 @@ function editorinfo($username){
}
if(isset($info) && $info) {
- switch($conf['showuseras']){
+ switch($conf['showuseras']) {
case 'username':
return hsc($info['name']);
case 'email':
return obfuscate($info['mail']);
case 'email_link':
- $mail=obfuscate($info['mail']);
+ $mail = obfuscate($info['mail']);
return '<a href="mailto:'.$mail.'">'.$mail.'</a>';
default:
return hsc($username);
@@ -1438,20 +1474,21 @@ function editorinfo($username){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @param string $type - type of image 'badge' or 'button'
+ * @return string
*/
-function license_img($type){
+function license_img($type) {
global $license;
global $conf;
if(!$conf['license']) return '';
if(!is_array($license[$conf['license']])) return '';
- $lic = $license[$conf['license']];
- $try = array();
+ $lic = $license[$conf['license']];
+ $try = array();
$try[] = 'lib/images/license/'.$type.'/'.$conf['license'].'.png';
$try[] = 'lib/images/license/'.$type.'/'.$conf['license'].'.gif';
- if(substr($conf['license'],0,3) == 'cc-'){
+ if(substr($conf['license'], 0, 3) == 'cc-') {
$try[] = 'lib/images/license/'.$type.'/cc.png';
}
- foreach($try as $src){
+ foreach($try as $src) {
if(@file_exists(DOKU_INC.$src)) return $src;
}
return '';
@@ -1463,12 +1500,15 @@ function license_img($type){
* If the memory_get_usage() function is not available the
* function just assumes $bytes of already allocated memory
*
- * @param int $mem Size of memory you want to allocate in bytes
- * @param int $used already allocated memory (see above)
* @author Filip Oscadal <webmaster@illusionsoftworks.cz>
* @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param int $mem Size of memory you want to allocate in bytes
+ * @param int $bytes
+ * @internal param int $used already allocated memory (see above)
+ * @return bool
*/
-function is_mem_available($mem,$bytes=1048576){
+function is_mem_available($mem, $bytes = 1048576) {
$limit = trim(ini_get('memory_limit'));
if(empty($limit)) return true; // no limit set!
@@ -1476,13 +1516,13 @@ function is_mem_available($mem,$bytes=1048576){
$limit = php_to_byte($limit);
// get used memory if possible
- if(function_exists('memory_get_usage')){
+ if(function_exists('memory_get_usage')) {
$used = memory_get_usage();
- }else{
+ } else {
$used = $bytes;
}
- if($used+$mem > $limit){
+ if($used + $mem > $limit) {
return false;
}
@@ -1497,10 +1537,10 @@ function is_mem_available($mem,$bytes=1048576){
* @link http://support.microsoft.com/kb/q176113/
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function send_redirect($url){
+function send_redirect($url) {
//are there any undisplayed messages? keep them in session for display
global $MSG;
- if (isset($MSG) && count($MSG) && !defined('NOSESSION')){
+ if(isset($MSG) && count($MSG) && !defined('NOSESSION')) {
//reopen session, store data and close session again
@session_start();
$_SESSION[DOKU_COOKIE]['msg'] = $MSG;
@@ -1511,22 +1551,23 @@ function send_redirect($url){
// work around IE bug
// http://www.ianhoar.com/2008/11/16/internet-explorer-6-and-redirected-anchor-links/
- list($url,$hash) = explode('#',$url);
- if($hash){
- if(strpos($url,'?')){
+ list($url, $hash) = explode('#', $url);
+ if($hash) {
+ if(strpos($url, '?')) {
$url = $url.'&#'.$hash;
- }else{
+ } else {
$url = $url.'?&#'.$hash;
}
}
// check if running on IIS < 6 with CGI-PHP
- if( isset($_SERVER['SERVER_SOFTWARE']) && isset($_SERVER['GATEWAY_INTERFACE']) &&
- (strpos($_SERVER['GATEWAY_INTERFACE'],'CGI') !== false) &&
+ if(isset($_SERVER['SERVER_SOFTWARE']) && isset($_SERVER['GATEWAY_INTERFACE']) &&
+ (strpos($_SERVER['GATEWAY_INTERFACE'], 'CGI') !== false) &&
(preg_match('|^Microsoft-IIS/(\d)\.\d$|', trim($_SERVER['SERVER_SOFTWARE']), $matches)) &&
- $matches[1] < 6 ){
+ $matches[1] < 6
+ ) {
header('Refresh: 0;url='.$url);
- }else{
+ } else {
header('Location: '.$url);
}
exit;
@@ -1546,24 +1587,30 @@ function send_redirect($url){
* or $_GET)
* @param string $exc The text of the raised exception
*
+ * @throws Exception
+ * @return mixed
* @author Adrian Lang <lang@cosmocode.de>
*/
function valid_input_set($param, $valid_values, $array, $exc = '') {
- if (isset($array[$param]) && in_array($array[$param], $valid_values)) {
+ if(isset($array[$param]) && in_array($array[$param], $valid_values)) {
return $array[$param];
- } elseif (isset($valid_values['default'])) {
+ } elseif(isset($valid_values['default'])) {
return $valid_values['default'];
} else {
throw new Exception($exc);
}
}
+/**
+ * Read a preference from the DokuWiki cookie
+ */
function get_doku_pref($pref, $default) {
- if (strpos($_COOKIE['DOKU_PREFS'], $pref) !== false) {
+ if(strpos($_COOKIE['DOKU_PREFS'], $pref) !== false) {
$parts = explode('#', $_COOKIE['DOKU_PREFS']);
- for ($i = 0; $i < count($parts); $i+=2){
- if ($parts[$i] == $pref) {
- return $parts[$i+1];
+ $cnt = count($parts);
+ for($i = 0; $i < $cnt; $i += 2) {
+ if($parts[$i] == $pref) {
+ return $parts[$i + 1];
}
}
}
diff --git a/inc/config_cascade.php b/inc/config_cascade.php
index 443114f52..e1ab0eead 100644
--- a/inc/config_cascade.php
+++ b/inc/config_cascade.php
@@ -50,6 +50,8 @@ $config_cascade = array_merge(
),
'userstyle' => array(
'screen' => DOKU_CONF.'userstyle.css',
+ // @deprecated 2012-04-09: rtl will cease to be a mode of its own,
+ // please use "[dir=rtl]" in any css file in all, screen or print mode instead
'rtl' => DOKU_CONF.'userrtl.css',
'print' => DOKU_CONF.'userprint.css',
'feed' => DOKU_CONF.'userfeed.css',
@@ -64,8 +66,9 @@ $config_cascade = array_merge(
'plainauth.users' => array(
'default' => DOKU_CONF.'users.auth.php',
),
-
+
'plugins' => array(
+ 'default' => array(DOKU_CONF.'plugins.php'),
'local' => array(DOKU_CONF.'plugins.local.php'),
'protected' => array(
DOKU_CONF.'plugins.required.php',
diff --git a/inc/confutils.php b/inc/confutils.php
index 29ead1e9f..404cc6050 100644
--- a/inc/confutils.php
+++ b/inc/confutils.php
@@ -115,7 +115,11 @@ function getWordblocks() {
return $wordblocks;
}
-
+/**
+ * Gets the list of configured schemes
+ *
+ * @return array the schemes
+ */
function getSchemes() {
static $schemes = null;
if ( !$schemes ) {
@@ -139,6 +143,9 @@ function getSchemes() {
*/
function linesToHash($lines, $lower=false) {
$conf = array();
+ // remove BOM
+ if (isset($lines[0]) && substr($lines[0],0,3) == pack('CCC',0xef,0xbb,0xbf))
+ $lines[0] = substr($lines[0],3);
foreach ( $lines as $line ) {
//ignore comments (except escaped ones)
$line = preg_replace('/(?<![&\\\\])#.*$/','',$line);
@@ -182,7 +189,7 @@ function confToHash($file,$lower=false) {
*
* @param string $type the configuration settings to be read, must correspond to a key/array in $config_cascade
* @param callback $fn the function used to process the configuration file into an array
- * @param array $param optional additional params to pass to the callback
+ * @param array $params optional additional params to pass to the callback
* @return array configuration values
*/
function retrieveConfig($type,$fn,$params=null) {
@@ -236,6 +243,7 @@ function actionOK($action){
static $disabled = null;
if(is_null($disabled)){
global $conf;
+ /** @var auth_basic $auth */
global $auth;
// prepare disabled actions array and handle legacy options
@@ -272,7 +280,7 @@ function actionOK($action){
*
* @param string $linktype 'content'|'navigation', content applies to links in wiki text
* navigation applies to all other links
- * @returns boolean true if headings should be used for $linktype, false otherwise
+ * @return boolean true if headings should be used for $linktype, false otherwise
*/
function useHeading($linktype) {
static $useHeading = null;
diff --git a/inc/events.php b/inc/events.php
index 621cb64c1..4e81f85c8 100644
--- a/inc/events.php
+++ b/inc/events.php
@@ -149,8 +149,8 @@ class Doku_Event_Handler {
* @param $method (function) event handler function
* @param $param (mixed) data passed to the event handler
*/
- function register_hook($event, $advise, &$obj, $method, $param=null) {
- $this->_hooks[$event.'_'.$advise][] = array(&$obj, $method, $param);
+ function register_hook($event, $advise, $obj, $method, $param=null) {
+ $this->_hooks[$event.'_'.$advise][] = array($obj, $method, $param);
}
function process_event(&$event,$advise='') {
@@ -158,8 +158,7 @@ class Doku_Event_Handler {
$evt_name = $event->name . ($advise ? '_'.$advise : '_BEFORE');
if (!empty($this->_hooks[$evt_name])) {
- $hook = reset($this->_hooks[$evt_name]);
- do {
+ foreach ($this->_hooks[$evt_name] as $hook) {
// list($obj, $method, $param) = $hook;
$obj =& $hook[0];
$method = $hook[1];
@@ -171,7 +170,8 @@ class Doku_Event_Handler {
$obj->$method($event, $param);
}
- } while ($event->_continue && $hook = next($this->_hooks[$evt_name]));
+ if (!$event->_continue) break;
+ }
}
}
}
diff --git a/inc/farm.php b/inc/farm.php
new file mode 100644
index 000000000..af1035707
--- /dev/null
+++ b/inc/farm.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * This overwrites DOKU_CONF. Each animal gets its own configuration and data directory.
+ * This can be used together with preload.php. See preload.php.dist for an example setup.
+ * For more information see http://www.dokuwiki.org/farms.
+ *
+ * The farm directory (constant DOKU_FARMDIR) can be any directory and needs to be set.
+ * Animals are direct subdirectories of the farm directory.
+ * There are two different approaches:
+ * * An .htaccess based setup can use any animal directory name:
+ * http://example.org/<path_to_farm>/subdir/ will need the subdirectory '$farm/subdir/'.
+ * * A virtual host based setup needs animal directory names which have to reflect
+ * the domain name: If an animal resides in http://www.example.org:8080/mysite/test/,
+ * directories that will match range from '$farm/8080.www.example.org.mysite.test/'
+ * to a simple '$farm/domain/'.
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ * @author Michael Klier <chi@chimeric.de>
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @author virtual host part of farm_confpath() based on conf_path() from Drupal.org's /includes/bootstrap.inc
+ * (see http://cvs.drupal.org/viewvc/drupal/drupal/includes/bootstrap.inc?view=markup)
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+*/
+
+// DOKU_FARMDIR needs to be set in preload.php, here the fallback is the same as DOKU_INC would be (if it was set already)
+if(!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', fullpath(dirname(__FILE__).'/../').'/');
+if(!defined('DOKU_CONF')) define('DOKU_CONF', farm_confpath(DOKU_FARMDIR));
+if(!defined('DOKU_FARM')) define('DOKU_FARM', false);
+
+
+/**
+ * Find the appropriate configuration directory.
+ *
+ * If the .htaccess based setup is used, the configuration directory can be
+ * any subdirectory of the farm directory.
+ *
+ * Otherwise try finding a matching configuration directory by stripping the
+ * website's hostname from left to right and pathname from right to left. The
+ * first configuration file found will be used; the remaining will ignored.
+ * If no configuration file is found, return the default confdir './conf'.
+ */
+function farm_confpath($farm) {
+
+ // htaccess based or cli
+ // cli usage example: animal=your_animal bin/indexer.php
+ if(isset($_REQUEST['animal']) || ('cli' == php_sapi_name() && isset($_SERVER['animal']))) {
+ $mode = isset($_REQUEST['animal']) ? 'htaccess' : 'cli';
+ $animal = $mode == 'htaccess' ? $_REQUEST['animal'] : $_SERVER['animal'];
+ // check that $animal is a string and just a directory name and not a path
+ if (!is_string($animal) || strpbrk($animal, '\\/') !== false)
+ nice_die('Sorry! Invalid animal name!');
+ if(!is_dir($farm.'/'.$animal))
+ nice_die("Sorry! This Wiki doesn't exist!");
+ if(!defined('DOKU_FARM')) define('DOKU_FARM', $mode);
+ return $farm.'/'.$animal.'/conf/';
+ }
+
+ // virtual host based
+ $uri = explode('/', $_SERVER['SCRIPT_NAME'] ? $_SERVER['SCRIPT_NAME'] : $_SERVER['SCRIPT_FILENAME']);
+ $server = explode('.', implode('.', array_reverse(explode(':', rtrim($_SERVER['HTTP_HOST'], '.')))));
+ for ($i = count($uri) - 1; $i > 0; $i--) {
+ for ($j = count($server); $j > 0; $j--) {
+ $dir = implode('.', array_slice($server, -$j)) . implode('.', array_slice($uri, 0, $i));
+ if(is_dir("$farm/$dir/conf/")) {
+ if(!defined('DOKU_FARM')) define('DOKU_FARM', 'virtual');
+ return "$farm/$dir/conf/";
+ }
+ }
+ }
+
+ // default conf directory in farm
+ if(is_dir("$farm/default/conf/")) {
+ if(!defined('DOKU_FARM')) define('DOKU_FARM', 'default');
+ return "$farm/default/conf/";
+ }
+ // farmer
+ return DOKU_INC.'conf/';
+}
+
+/* Use default config files and local animal config files */
+$config_cascade = array(
+ 'main' => array(
+ 'default' => array(DOKU_INC.'conf/dokuwiki.php'),
+ 'local' => array(DOKU_CONF.'local.php'),
+ 'protected' => array(DOKU_CONF.'local.protected.php'),
+ ),
+ 'acronyms' => array(
+ 'default' => array(DOKU_INC.'conf/acronyms.conf'),
+ 'local' => array(DOKU_CONF.'acronyms.local.conf'),
+ ),
+ 'entities' => array(
+ 'default' => array(DOKU_INC.'conf/entities.conf'),
+ 'local' => array(DOKU_CONF.'entities.local.conf'),
+ ),
+ 'interwiki' => array(
+ 'default' => array(DOKU_INC.'conf/interwiki.conf'),
+ 'local' => array(DOKU_CONF.'interwiki.local.conf'),
+ ),
+ 'license' => array(
+ 'default' => array(DOKU_INC.'conf/license.php'),
+ 'local' => array(DOKU_CONF.'license.local.php'),
+ ),
+ 'mediameta' => array(
+ 'default' => array(DOKU_INC.'conf/mediameta.php'),
+ 'local' => array(DOKU_CONF.'mediameta.local.php'),
+ ),
+ 'mime' => array(
+ 'default' => array(DOKU_INC.'conf/mime.conf'),
+ 'local' => array(DOKU_CONF.'mime.local.conf'),
+ ),
+ 'scheme' => array(
+ 'default' => array(DOKU_INC.'conf/scheme.conf'),
+ 'local' => array(DOKU_CONF.'scheme.local.conf'),
+ ),
+ 'smileys' => array(
+ 'default' => array(DOKU_INC.'conf/smileys.conf'),
+ 'local' => array(DOKU_CONF.'smileys.local.conf'),
+ ),
+ 'wordblock' => array(
+ 'default' => array(DOKU_INC.'conf/wordblock.conf'),
+ 'local' => array(DOKU_CONF.'wordblock.local.conf'),
+ ),
+ 'acl' => array(
+ 'default' => DOKU_CONF.'acl.auth.php',
+ ),
+ 'plainauth.users' => array(
+ 'default' => DOKU_CONF.'users.auth.php',
+ ),
+ 'plugins' => array( // needed since Angua
+ 'default' => array(DOKU_INC.'conf/plugins.php'),
+ 'local' => array(DOKU_CONF.'plugins.local.php'),
+ 'protected' => array(
+ DOKU_INC.'conf/plugins.required.php',
+ DOKU_CONF.'plugins.protected.php',
+ ),
+ ),
+ 'userstyle' => array(
+ 'default' => DOKU_CONF.'userstyle.css', // 'default' was renamed to 'screen' on 2011-02-26, so will be deprecated in the next version
+ 'screen' => DOKU_CONF.'userstyle.css',
+ 'rtl' => DOKU_CONF.'userrtl.css', // deprecated since version after 2012-04-09
+ 'print' => DOKU_CONF.'userprint.css',
+ 'feed' => DOKU_CONF.'userfeed.css',
+ 'all' => DOKU_CONF.'userall.css',
+ ),
+ 'userscript' => array(
+ 'default' => DOKU_CONF.'userscript.js'
+ ),
+);
diff --git a/inc/feedcreator.class.php b/inc/feedcreator.class.php
index 435add6ac..ea8cc7b15 100644
--- a/inc/feedcreator.class.php
+++ b/inc/feedcreator.class.php
@@ -597,8 +597,8 @@ class FeedCreator extends HtmlDescribable {
// HTTP redirect, some feed readers' simple HTTP implementations don't follow it
//Header("Location: ".$filename);
- header("Content-Type: ".$this->contentType."; charset=".$this->encoding."; filename=".basename($filename));
- header("Content-Disposition: inline; filename=".basename($filename));
+ header("Content-Type: ".$this->contentType."; charset=".$this->encoding."; filename=".utf8_basename($filename));
+ header("Content-Disposition: inline; filename=".utf8_basename($filename));
readfile($filename, "r");
die();
}
diff --git a/inc/form.php b/inc/form.php
index e74c52c5d..bdf520a2e 100644
--- a/inc/form.php
+++ b/inc/form.php
@@ -295,8 +295,9 @@ class Doku_Form {
*/
function addRadioSet($name, $entries) {
- $value = (isset($_POST[$name]) && isset($entries[$_POST[$name]])) ?
- $_POST[$name] : key($entries);
+ global $INPUT;
+ $value = (array_key_exists($INPUT->post->str($name), $entries)) ?
+ $INPUT->str($name) : key($entries);
foreach($entries as $val => $cap) {
$data = ($value === $val) ? array('checked' => 'checked') : array();
$this->addElement(form_makeRadioField($name, $val, $cap, '', '', $data));
diff --git a/inc/fulltext.php b/inc/fulltext.php
index 620237296..eab8850dc 100644
--- a/inc/fulltext.php
+++ b/inc/fulltext.php
@@ -394,17 +394,24 @@ function ft_snippet_re_preprocess($term) {
return $term;
}
+ // unicode word boundaries
+ // see http://stackoverflow.com/a/2449017/172068
+ $BL = '(?<!\pL)';
+ $BR = '(?!\pL)';
+
if(substr($term,0,2) == '\\*'){
$term = substr($term,2);
}else{
- $term = '\b'.$term;
+ $term = $BL.$term;
}
if(substr($term,-2,2) == '\\*'){
$term = substr($term,0,-2);
}else{
- $term = $term.'\b';
+ $term = $term.$BR;
}
+
+ if($term == $BL || $term == $BR || $term == $BL.$BR) $term = '';
return $term;
}
diff --git a/inc/geshi.php b/inc/geshi.php
index 31d2da49f..aedc64f84 100644
--- a/inc/geshi.php
+++ b/inc/geshi.php
@@ -41,7 +41,7 @@
//
/** The version of this GeSHi file */
-define('GESHI_VERSION', '1.0.8.8');
+define('GESHI_VERSION', '1.0.8.10');
// Define the root directory for the GeSHi code tree
if (!defined('GESHI_ROOT')) {
@@ -209,12 +209,16 @@ define('GESHI_NUMBER_BIN_PREFIX_0B', 64); //0b[01]+
define('GESHI_NUMBER_OCT_PREFIX', 256); //0[0-7]+
/** Number format to highlight octal numbers with a prefix 0o (logtalk) */
define('GESHI_NUMBER_OCT_PREFIX_0O', 512); //0[0-7]+
+/** Number format to highlight octal numbers with a leading @ (Used in HiSofts Devpac series). */
+define('GESHI_NUMBER_OCT_PREFIX_AT', 1024); //@[0-7]+
/** Number format to highlight octal numbers with a suffix of o */
-define('GESHI_NUMBER_OCT_SUFFIX', 1024); //[0-7]+[oO]
+define('GESHI_NUMBER_OCT_SUFFIX', 2048); //[0-7]+[oO]
/** Number format to highlight hex numbers with a prefix 0x */
define('GESHI_NUMBER_HEX_PREFIX', 4096); //0x[0-9a-fA-F]+
+/** Number format to highlight hex numbers with a prefix $ */
+define('GESHI_NUMBER_HEX_PREFIX_DOLLAR', 8192); //$[0-9a-fA-F]+
/** Number format to highlight hex numbers with a suffix of h */
-define('GESHI_NUMBER_HEX_SUFFIX', 8192); //[0-9][0-9a-fA-F]*h
+define('GESHI_NUMBER_HEX_SUFFIX', 16384); //[0-9][0-9a-fA-F]*h
/** Number format to highlight floating-point numbers without support for scientific notation */
define('GESHI_NUMBER_FLT_NONSCI', 65536); //\d+\.\d+
/** Number format to highlight floating-point numbers without support for scientific notation */
@@ -732,6 +736,88 @@ class GeSHi {
}
/**
+ * Get supported langs or an associative array lang=>full_name.
+ * @param boolean $longnames
+ * @return array
+ */
+ function get_supported_languages($full_names=false)
+ {
+ // return array
+ $back = array();
+
+ // we walk the lang root
+ $dir = dir($this->language_path);
+
+ // foreach entry
+ while (false !== ($entry = $dir->read()))
+ {
+ $full_path = $this->language_path.$entry;
+
+ // Skip all dirs
+ if (is_dir($full_path)) {
+ continue;
+ }
+
+ // we only want lang.php files
+ if (!preg_match('/^([^.]+)\.php$/', $entry, $matches)) {
+ continue;
+ }
+
+ // Raw lang name is here
+ $langname = $matches[1];
+
+ // We want the fullname too?
+ if ($full_names === true)
+ {
+ if (false !== ($fullname = $this->get_language_fullname($langname)))
+ {
+ $back[$langname] = $fullname; // we go associative
+ }
+ }
+ else
+ {
+ // just store raw langname
+ $back[] = $langname;
+ }
+ }
+
+ $dir->close();
+
+ return $back;
+ }
+
+ /**
+ * Get full_name for a lang or false.
+ * @param string $language short langname (html4strict for example)
+ * @return mixed
+ */
+ function get_language_fullname($language)
+ {
+ //Clean up the language name to prevent malicious code injection
+ $language = preg_replace('#[^a-zA-Z0-9\-_]#', '', $language);
+
+ $language = strtolower($language);
+
+ // get fullpath-filename for a langname
+ $fullpath = $this->language_path.$language.'.php';
+
+ // we need to get contents :S
+ if (false === ($data = file_get_contents($fullpath))) {
+ $this->error = sprintf('Geshi::get_lang_fullname() Unknown Language: %s', $language);
+ return false;
+ }
+
+ // match the langname
+ if (!preg_match('/\'LANG_NAME\'\s*=>\s*\'((?:[^\']|\\\')+)\'/', $data, $matches)) {
+ $this->error = sprintf('Geshi::get_lang_fullname(%s): Regex can not detect language', $language);
+ return false;
+ }
+
+ // return fullname for langname
+ return stripcslashes($matches[1]);
+ }
+
+ /**
* Sets the type of header to be used.
*
* If GESHI_HEADER_DIV is used, the code is surrounded in a "div".This
@@ -1353,6 +1439,10 @@ class GeSHi {
function get_language_name_from_extension( $extension, $lookup = array() ) {
if ( !is_array($lookup) || empty($lookup)) {
$lookup = array(
+ '6502acme' => array( 'a', 's', 'asm', 'inc' ),
+ '6502tasm' => array( 'a', 's', 'asm', 'inc' ),
+ '6502kickass' => array( 'a', 's', 'asm', 'inc' ),
+ '68000devpac' => array( 'a', 's', 'asm', 'inc' ),
'abap' => array('abap'),
'actionscript' => array('as'),
'ada' => array('a', 'ada', 'adb', 'ads'),
@@ -1971,7 +2061,7 @@ class GeSHi {
//All this formats are matched case-insensitively!
static $numbers_format = array(
GESHI_NUMBER_INT_BASIC =>
- '(?:(?<![0-9a-z_\.%])|(?<=\.\.))(?<![\d\.]e[+\-])([1-9]\d*?|0)(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ '(?:(?<![0-9a-z_\.%$@])|(?<=\.\.))(?<![\d\.]e[+\-])([1-9]\d*?|0)(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
GESHI_NUMBER_INT_CSTYLE =>
'(?<![0-9a-z_\.%])(?<![\d\.]e[+\-])([1-9]\d*?|0)l(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
GESHI_NUMBER_BIN_SUFFIX =>
@@ -1984,10 +2074,14 @@ class GeSHi {
'(?<![0-9a-z_\.])(?<![\d\.]e[+\-])0[0-7]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
GESHI_NUMBER_OCT_PREFIX_0O =>
'(?<![0-9a-z_\.%])(?<![\d\.]e[+\-])0o[0-7]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_OCT_PREFIX_AT =>
+ '(?<![0-9a-z_\.%])(?<![\d\.]e[+\-])\@[0-7]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
GESHI_NUMBER_OCT_SUFFIX =>
'(?<![0-9a-z_\.])(?<![\d\.]e[+\-])[0-7]+?o(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
GESHI_NUMBER_HEX_PREFIX =>
'(?<![0-9a-z_\.])(?<![\d\.]e[+\-])0x[0-9a-fA-F]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])\$[0-9a-fA-F]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
GESHI_NUMBER_HEX_SUFFIX =>
'(?<![0-9a-z_\.])(?<![\d\.]e[+\-])\d[0-9a-fA-F]*?[hH](?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
GESHI_NUMBER_FLT_NONSCI =>
@@ -2021,6 +2115,10 @@ class GeSHi {
$this->language_data['NUMBERS_RXCACHE'][$key] =
"/(?<!<\|\/)(?<!<\|!REG3XP)(?<!<\|\/NUM!)(?<!\d\/>)($regexp)(?!(?:<DOT>|(?>[^\<]))+>)(?![^<]*>)(?!\|>)(?!\/>)/i"; //
}
+
+ if(!isset($this->language_data['PARSER_CONTROL']['NUMBERS']['PRECHECK_RX'])) {
+ $this->language_data['PARSER_CONTROL']['NUMBERS']['PRECHECK_RX'] = '#\d#';
+ }
}
$this->parse_cache_built = true;
@@ -3241,7 +3339,7 @@ class GeSHi {
$stuff_to_parse = ' ' . $this->hsc($stuff_to_parse);
// Highlight keywords
- $disallowed_before = "(?<![a-zA-Z0-9\$_\|\#;>|^&";
+ $disallowed_before = "(?<![a-zA-Z0-9\$_\|\#|^&";
$disallowed_after = "(?![a-zA-Z0-9_\|%\\-&;";
if ($this->lexic_permissions['STRINGS']) {
$quotemarks = preg_quote(implode($this->language_data['QUOTEMARKS']), '/');
@@ -3299,7 +3397,7 @@ class GeSHi {
// Basically, we don't put the styles in yet because then the styles themselves will
// get highlighted if the language has a CSS keyword in it (like CSS, for example ;))
$stuff_to_parse = preg_replace_callback(
- "/$disallowed_before_local({$keywordset})(?!\<DOT\>(?:htm|php))$disallowed_after_local/$modifiers",
+ "/$disallowed_before_local({$keywordset})(?!\<DOT\>(?:htm|php|aspx?))$disallowed_after_local/$modifiers",
array($this, 'handle_keyword_replace'),
$stuff_to_parse
);
@@ -3346,7 +3444,8 @@ class GeSHi {
// Highlight numbers. As of 1.0.8 we support different types of numbers
$numbers_found = false;
- if ($this->lexic_permissions['NUMBERS'] && preg_match('#\d#', $stuff_to_parse )) {
+
+ if ($this->lexic_permissions['NUMBERS'] && preg_match($this->language_data['PARSER_CONTROL']['NUMBERS']['PRECHECK_RX'], $stuff_to_parse )) {
$numbers_found = true;
//For each of the formats ...
@@ -4465,7 +4564,7 @@ class GeSHi {
* @access private
*/
function optimize_regexp_list($list, $regexp_delimiter = '/') {
- $regex_chars = array('.', '\\', '+', '*', '?', '[', '^', ']', '$',
+ $regex_chars = array('.', '\\', '+', '-', '*', '?', '[', '^', ']', '$',
'(', ')', '{', '}', '=', '!', '<', '>', '|', ':', $regexp_delimiter);
sort($list);
$regexp_list = array('');
diff --git a/inc/geshi/4cs.php b/inc/geshi/4cs.php
index 48b671f4a..5209c51e8 100644
--- a/inc/geshi/4cs.php
+++ b/inc/geshi/4cs.php
@@ -4,7 +4,7 @@
* ------
* Author: Jason Curl (jason.curl@continental-corporation.com)
* Copyright: (c) 2009 Jason Curl
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/09/05
*
* 4CS language file for GeSHi.
diff --git a/inc/geshi/6502acme.php b/inc/geshi/6502acme.php
new file mode 100644
index 000000000..203e04dfa
--- /dev/null
+++ b/inc/geshi/6502acme.php
@@ -0,0 +1,230 @@
+<?php
+/*************************************************************************************
+ * 6502acme.php
+ * -------
+ * Author: Warren Willmey
+ * Copyright: (c) 2010 Warren Willmey.
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/05/26
+ *
+ * MOS 6502 (more specifically 6510) ACME Cross Assembler 0.93 by Marco Baye language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/22
+ * - First Release
+ *
+ * TODO (updated 2010/07/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'MOS 6502 (6510) ACME Cross Assembler format',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* 6502/6510 Opcodes. */
+ 1 => array(
+ 'adc', 'and', 'asl', 'bcc', 'bcs', 'beq', 'bit', 'bmi',
+ 'bne', 'bpl', 'brk', 'bvc', 'bvs', 'clc', 'cld', 'cli',
+ 'clv', 'cmp', 'cpx', 'cpy', 'dec', 'dex', 'dey', 'eor',
+ 'inc', 'inx', 'iny', 'jmp', 'jsr', 'lda', 'ldx', 'ldy',
+ 'lsr', 'nop', 'ora', 'pha', 'php', 'pla', 'plp', 'rol',
+ 'ror', 'rti', 'rts', 'sbc', 'sec', 'sed', 'sei', 'sta',
+ 'stx', 'sty', 'tax', 'tay', 'tsx', 'txa', 'txs', 'tya',
+ ),
+ /* Index Registers, yes the 6502 has other registers by they are only
+ * accessable by specific opcodes. The 65816 also has access to the stack pointer S. */
+ 2 => array(
+ 'x', 'y', 's'
+ ),
+ /* Directives or "pseudo opcodes" as defined by ACME 0.93 file AllPOs.txt. */
+ 3 => array(
+ '!8', '!08', '!by', '!byte',
+ '!16', '!wo', '!word',
+ '!24', '!32',
+ '!fi', '!fill',
+ '!align',
+ '!ct', '!convtab',
+ '!tx', '!text',
+ '!pet',
+ '!raw',
+ '!scrxor',
+ '!to',
+ '!source',
+ '!bin', '!binary',
+ '!zn', '!zone',
+ '!sl',
+ '!svl',
+ '!sal',
+ '!if', '!ifdef',
+ '!for',
+ '!set',
+ '!do', 'while', 'until',
+ '!eof', '!endoffile',
+ '!warn', '!error', '!serious',
+ '!macro',
+// , '*=' // Not a valid keyword (uses both * and = signs) moved to symbols instead.
+ '!initmem',
+ '!pseudopc',
+ '!cpu',
+ '!al', '!as', '!rl', '!rs',
+ ),
+
+ /* 6502/6510 undocumented opcodes (often referred to as illegal instructions).
+ * These are present in the 6502/6510 but NOT in the newer CMOS revisions of the 65C02 or 65816.
+ * As they are undocumented instructions there are no "official" names for them, there are also
+ * several more that mainly perform various forms of crash and are not supported by ACME 0.93.
+ */
+ 4 => array(
+ 'anc', 'arr', 'asr', 'dcp', 'dop', 'isc', 'jam', 'lax',
+ 'rla', 'rra', 'sax', 'sbx', 'slo', 'sre', 'top',
+ ),
+ /* 65c02 instructions, MOS added a few (much needed) instructions in the CMOS version of the 6502, but stupidly removed the undocumented/illegal opcodes.
+ * ACME 0.93 does not support the rmb0-7 and smb0-7 instructions (they are currently rem'ed out). */
+ 5 => array(
+ 'bra', 'phx', 'phy', 'plx', 'ply', 'stz', 'trb', 'tsb'
+ ),
+ /* 65816 instructions. */
+ 6 => array(
+ 'brl', 'cop', 'jml', 'jsl', 'mvn', 'mvp', 'pea', 'pei',
+ 'per', 'phb', 'phd', 'phk', 'plb', 'pld', 'rep', 'rtl',
+ 'sep', 'tcd', 'tcs', 'tdc', 'tsc', 'txy', 'tyx', 'wdm',
+ 'xba', 'xce',
+ ),
+ /* Deprecated directives or "pseudo opcodes" as defined by ACME 0.93 file AllPOs.txt. */
+ 7 => array(
+ '!cbm',
+ '!sz', '!subzone',
+ '!realpc',
+ ),
+ /* Math functions, some are aliases for the symbols. */
+ 8 => array(
+ 'not', 'div', 'mod', 'xor', 'or', 'sin', 'cos', 'tan',
+ 'arcsin', 'arccos', 'arctan', 'int', 'float',
+
+ ),
+
+ ),
+ 'SYMBOLS' => array(
+// '[', ']', '(', ')', '{', '}', // These are already defined by GeSHi as BRACKETS.
+ '*=', '#', '!', '^', '-', '*', '/',
+ '%', '+', '-', '<<', '>>', '>>>',
+ '<', '>', '^', '<=', '<', '>=', '>', '!=',
+ '=', '&', '|', '<>',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00f; font-weight:bold;',
+ 2 => 'color: #00f; font-weight:bold;',
+ 3 => 'color: #080; font-weight:bold;',
+ 4 => 'color: #f00; font-weight:bold;',
+ 5 => 'color: #80f; font-weight:bold;',
+ 6 => 'color: #f08; font-weight:bold;',
+ 7 => 'color: #a04; font-weight:bold; font-style: italic;',
+ 8 => 'color: #000;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #999; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'NUMBERS' => array(
+ GESHI_NUMBER_INT_BASIC => 'color: #f00;',
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR => 'color: #f00;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #f00;',
+ GESHI_NUMBER_BIN_PREFIX_PERCENT => 'color: #f00;',
+ GESHI_NUMBER_FLT_NONSCI => 'color: #f00;',
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #f00;'
+ , 1 => 'color: #933;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_BIN_PREFIX_PERCENT,
+ // AMCE Octal format not support and gets picked up as Decimal unfortunately.
+ 'REGEXPS' => array(
+ //ACME .# Binary number format. e.g. %..##..##..##
+ 0 => '\%[\.\#]{1,64}',
+ //ACME Local Labels
+ 1 => '\.[_a-zA-Z][_a-zA-Z0-9]*',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'NUMBERS' => array(
+ 'PRECHECK_RX' => '/[\da-fA-F\.\$\%]/'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/6502kickass.php b/inc/geshi/6502kickass.php
new file mode 100644
index 000000000..804282629
--- /dev/null
+++ b/inc/geshi/6502kickass.php
@@ -0,0 +1,241 @@
+<?php
+/*************************************************************************************
+ * 6502kickass.php
+ * -------
+ * Author: Warren Willmey
+ * Copyright: (c) 2010 Warren Willmey.
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/07
+ *
+ * MOS 6502 (6510) Kick Assembler 3.13 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/22
+ * - First Release
+ *
+ * TODO (updated 2010/07/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'MOS 6502 (6510) Kick Assembler format',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* 6502/6510 Opcodes including undocumented opcodes as Kick Assembler 3.13 does not make a distinction - they are ALL valid. */
+ 1 => array(
+ 'adc', 'ahx', 'alr', 'anc', 'anc2', 'and', 'arr', 'asl',
+ 'axs', 'bcc', 'bcs', 'beq', 'bit', 'bmi', 'bne', 'bpl',
+ 'brk', 'bvc', 'bvs', 'clc', 'cld', 'cli', 'clv', 'cmp',
+ 'cpx', 'cpy', 'dcp', 'dec', 'dex', 'dey', 'eor', 'inc',
+ 'inx', 'iny', 'isc', 'jmp', 'jsr', 'las', 'lax', 'lda',
+ 'ldx', 'ldy', 'lsr', 'nop', 'ora', 'pha', 'php', 'pla',
+ 'plp', 'rla', 'rol', 'ror', 'rra', 'rti', 'rts', 'sax',
+ 'sbc', 'sbc2', 'sec', 'sed', 'sei', 'shx', 'shy', 'slo',
+ 'sre', 'sta', 'stx', 'sty', 'tas', 'tax', 'tay', 'tsx',
+ 'txa', 'txs', 'tya', 'xaa',
+ ),
+ /* DTV additional Opcodes. */
+ 2 => array(
+ 'bra', 'sac', 'sir'
+ ),
+ /* Index Registers, yes the 6502 has other registers by they are only
+ * accessable by specific opcodes. */
+ 3 => array(
+ 'x', 'y'
+ ),
+ /* Directives. */
+ 4 => array(
+ '.pc', '.pseudopc', 'virtual', '.align', '.byte', '.word', '.text', '.fill',
+ '.import source', '.import binary', '.import c64', '.import text', '.import', '.print', '.printnow',
+ '.error', '.var', '.eval', '.const', '.eval const', '.enum', '.label', '.define', '.struct',
+ 'if', '.for', '.macro', '.function', '.return', '.pseudocommand', '.namespace', '.filenamespace',
+ '.assert', '.asserterror',
+ ),
+ /* Kick Assembler 3.13 Functions/Operators. */
+ 5 => array(
+ 'size', 'charAt', 'substring', 'asNumber', 'asBoolean', 'toIntString', 'toBinaryString', 'toOctalString',
+ 'toHexString', 'lock', // String functions/operators.
+ 'get', 'set', 'add', 'remove', 'shuffle', // List functions.
+ 'put', 'keys', // Hashtable functions.
+ 'getType', 'getValue', 'CmdArgument', // Pseudo Commands functions.
+ 'asmCommandSize', // Opcode Constants functions.
+ 'LoadBinary', 'getSize',
+ 'LoadSid', 'getData',
+ 'LoadPicture', 'width', 'height', 'getPixel', 'getSinglecolorByte', 'getMulticolorByte',
+ 'createFile', 'writeln',
+ 'cmdLineVars',
+ 'getX', 'getY', 'getZ', // Vector functions.
+ 'RotationMatrix', 'ScaleMatrix', 'MoveMatrix', 'PerspectiveMatrix', // Matrix functions.
+
+ ),
+
+ /* Kick Assembler 3.13 Math Functions. */
+ 6 => array(
+ 'abs', 'acos', 'asin', 'atan', 'atan2', 'cbrt', 'ceil', 'cos', 'cosh',
+ 'exp', 'expm1', 'floor', 'hypot', 'IEEEremainder', 'log', 'log10',
+ 'log1p', 'max', 'min', 'pow', 'mod', 'random', 'round', 'signum',
+ 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'toDegrees', 'toRadians',
+ ),
+
+ /* Kick Assembler 3.13 Objects/Data Types. */
+ 7 => array(
+ 'List', // List() Object.
+ 'Hashtable', // Hashtable() Object.
+ 'Vector', // Vector() Object.
+ 'Matrix', // Matrix() Object.
+ ),
+
+ /* Kick Assembler 3.13 Constants. */
+ 8 => array(
+ 'PI', 'E', // Math Constants.
+ 'AT_ABSOLUTE' , 'AT_ABSOLUTEX' , 'AT_ABSOLUTEY' , 'AT_IMMEDIATE', // Pseudo Commands Constants.
+ 'AT_INDIRECT' , 'AT_IZEROPAGEX' , 'AT_IZEROPAGEY' , 'AT_NONE',
+ 'BLACK', 'WHITE', 'RED', 'CYAN', 'PURPLE', 'GREEN', 'BLUE', // Colour Constants.
+ 'YELLOW', 'ORANGE', 'BROWN', 'LIGHT_RED', 'DARK_GRAY', 'GRAY',
+ 'LIGHT_GREEN', 'LIGHT_BLUE', 'LIGHT_GRAY',
+ 'C64FILE', // Template Tag names.
+ 'BF_C64FILE', 'BF_BITMAP_SINGLECOLOR', 'BF_KOALA' , 'BF_FLI', // Binary format constant
+ ),
+
+ ),
+ 'SYMBOLS' => array(
+// '[', ']', '(', ')', '{', '}', // These are already defined by GeSHi as BRACKETS.
+ '-', '+', '-', '*', '/', '>', '<', '<<', '>>', '&', '|', '^', '=', '==',
+ '!=', '>=', '<=', '!', '&&', '||', '#',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00f; font-weight:bold;',
+ 2 => 'color: #00f; font-weight:bold;',
+ 3 => 'color: #00f; font-weight:bold;',
+ 4 => 'color: #080; font-weight:bold;',
+ 5 => 'color: #80f; font-weight:bold;',
+ 6 => 'color: #f08; font-weight:bold;',
+ 7 => 'color: #a04; font-weight:bold; font-style: italic;',
+ 8 => 'color: #f08; font-weight:bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #999; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'NUMBERS' => array(
+ GESHI_NUMBER_INT_BASIC => 'color: #f00;',
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR => 'color: #f00;',
+ GESHI_NUMBER_BIN_PREFIX_PERCENT => 'color: #f00;',
+ GESHI_NUMBER_FLT_NONSCI => 'color: #f00;',
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #933;',
+ 1 => 'color: #933;',
+ 2 => 'color: #933;',
+ 3 => 'color: #00f; font-weight:bold;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR |
+ GESHI_NUMBER_BIN_PREFIX_PERCENT,
+ // AMCE Octal format not support and gets picked up as Decimal unfortunately.
+ 'REGEXPS' => array(
+ //Labels end with a collon.
+ 0 => '[!]{0,1}[_a-zA-Z][_a-zA-Z0-9]*\:',
+ //Multi Labels (local labels) references start with ! and end with + or - for forward/backward reference.
+ 1 => '![_a-zA-Z][_a-zA-Z0-9]*[+-]',
+ //Macros start with a colon :Macro.
+ 2 => ':[_a-zA-Z][_a-zA-Z0-9]*',
+ // Opcode Constants, such as LDA_IMM, STA_IZPY are basically all 6502 opcodes
+ // in UPPER case followed by _underscore_ and the ADDRESS MODE.
+ // As you might imagine that is rather a lot ( 78 supported Opcodes * 12 Addressing modes = 936 variations)
+ // So I thought it better and easier to maintain as a regular expression.
+ // NOTE: The order of the Address Modes must be maintained or it wont work properly (eg. place ZP first and find out!)
+ 3 => '[A-Z]{3}[2]?_(?:IMM|IND|IZPX|IZPY|ZPX|ZPY|ABSX|ABSY|REL|ABS|ZP)',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'NUMBERS' => array(
+ 'PRECHECK_RX' => '/[\da-fA-F\.\$\%]/'
+ ),
+ 'KEYWORDS' => array(
+ 5 => array (
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\;>|^&'\"])"
+ ),
+ 6 => array (
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\;>|^&'\"])"
+ ),
+ 8 => array (
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\;>|^&'\"])"
+ )
+ )
+ ),
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/6502tasm.php b/inc/geshi/6502tasm.php
new file mode 100644
index 000000000..86aa479df
--- /dev/null
+++ b/inc/geshi/6502tasm.php
@@ -0,0 +1,189 @@
+<?php
+/*************************************************************************************
+ * 6502tasm.php
+ * -------
+ * Author: Warren Willmey
+ * Copyright: (c) 2010 Warren Willmey.
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/02
+ *
+ * MOS 6502 (6510) TASM/64TASS (64TASS being the super set of TASM) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/22
+ * - First Release
+ *
+ * TODO (updated 2010/07/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'MOS 6502 (6510) TASM/64TASS 1.46 Assembler format',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* 6502/6510 Opcodes. */
+ 1 => array(
+ 'adc', 'and', 'asl', 'bcc', 'bcs', 'beq', 'bit', 'bmi',
+ 'bne', 'bpl', 'brk', 'bvc', 'bvs', 'clc', 'cld', 'cli',
+ 'clv', 'cmp', 'cpx', 'cpy', 'dec', 'dex', 'dey', 'eor',
+ 'inc', 'inx', 'iny', 'jmp', 'jsr', 'lda', 'ldx', 'ldy',
+ 'lsr', 'nop', 'ora', 'pha', 'php', 'pla', 'plp', 'rol',
+ 'ror', 'rti', 'rts', 'sbc', 'sec', 'sed', 'sei', 'sta',
+ 'stx', 'sty', 'tax', 'tay', 'tsx', 'txa', 'txs', 'tya',
+ ),
+ /* Index Registers, yes the 6502 has other registers by they are only
+ * accessable by specific opcodes. The 65816 also has access to the stack pointer S. */
+ 2 => array(
+ 'x', 'y', 's'
+ ),
+ /* Directives. */
+ 3 => array(
+ '.al', '.align', '.as', '.assert', '.binary', '.byte', '.cerror', '.char',
+ '.comment', '.cpu', '.cwarn', '.databank', '.dpage', '.else', '.elsif',
+ '.enc', '.endc', '.endif', '.endm', '.endp', '.error', '.fi', '.fill',
+ '.for', '.here', '.if', '.ifeq', '.ifmi', '.ifne', '.ifpl',
+ '.include', '.int', '.logical', '.long', '.macro', '.next', '.null', '.offs',
+ '.page', '.pend', '.proc', '.rept', '.rta', '.shift', '.text', '.warn', '.word',
+ '.xl', '.xs',
+// , '*=' // Not a valid keyword (uses both * and = signs) moved to symbols instead.
+ ),
+
+ /* 6502/6510 undocumented opcodes (often referred to as illegal instructions).
+ * These are present in the 6502/6510 but NOT in the newer CMOS revisions of the 65C02 or 65816.
+ * As they are undocumented instructions there are no "official" names for them, these are the names
+ * used by 64TASS V1.46.
+ */
+ 4 => array(
+ 'ahx', 'alr', 'anc', 'ane', 'arr', 'asr', 'axs', 'dcm',
+ 'dcp', 'ins', 'isb', 'isc', 'jam', 'lae', 'las', 'lax',
+ 'lds', 'lxa', 'rla', 'rra', 'sax', 'sbx', 'sha', 'shs',
+ 'shx', 'shy', 'slo', 'sre', 'tas', 'xaa',
+ ),
+ /* 65c02 instructions, MOS added a few (much needed) instructions in the
+ * CMOS version of the 6502, but stupidly removed the undocumented/illegal opcodes. */
+ 5 => array(
+ 'bra', 'dea', 'gra', 'ina', 'phx', 'phy', 'plx', 'ply',
+ 'stz', 'trb', 'tsb',
+ ),
+ /* 65816 instructions. */
+ 6 => array(
+ 'brl', 'cop', 'jml', 'jsl', 'mvn', 'mvp', 'pea', 'pei',
+ 'per', 'phb', 'phd', 'phk', 'plb', 'pld', 'rep', 'rtl',
+ 'sep', 'stp', 'swa', 'tad', 'tcd', 'tcs', 'tda',
+ 'tdc', 'tsa', 'tsc', 'txy', 'tyx', 'wai', 'xba', 'xce',
+ ),
+ /* Deprecated directives (or yet to be implemented). */
+ 7 => array(
+ '.global', '.check'
+ ),
+ ),
+ 'SYMBOLS' => array(
+// '[', ']', '(', ')', '{', '}', // These are already defined by GeSHi as BRACKETS.
+ '*=', '#', '<', '>', '`', '=', '<', '>',
+ '!=', '>=', '<=', '+', '-', '*', '/', '//', '|',
+ '^', '&', '<<', '>>', '-', '~', '!',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00f; font-weight:bold;',
+ 2 => 'color: #00f; font-weight:bold;',
+ 3 => 'color: #080; font-weight:bold;',
+ 4 => 'color: #f00; font-weight:bold;',
+ 5 => 'color: #80f; font-weight:bold;',
+ 6 => 'color: #f08; font-weight:bold;',
+ 7 => 'color: #a04; font-weight:bold; font-style: italic;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #999; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'NUMBERS' => array(
+ GESHI_NUMBER_INT_BASIC => 'color: #f00;',
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR => 'color: #f00;',
+ GESHI_NUMBER_BIN_PREFIX_PERCENT => 'color: #f00;',
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR |
+ GESHI_NUMBER_BIN_PREFIX_PERCENT,
+ // AMCE Octal format not support and gets picked up as Decimal unfortunately.
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'NUMBERS' => array(
+ 'PRECHECK_RX' => '/[\da-fA-F\.\$\%]/'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/68000devpac.php b/inc/geshi/68000devpac.php
new file mode 100644
index 000000000..f46387ae9
--- /dev/null
+++ b/inc/geshi/68000devpac.php
@@ -0,0 +1,168 @@
+<?php
+/*************************************************************************************
+ * 68000devpac.php
+ * -------
+ * Author: Warren Willmey
+ * Copyright: (c) 2010 Warren Willmey.
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/09
+ *
+ * Motorola 68000 - HiSoft Devpac ST 2 Assembler language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/22
+ * - First Release
+ *
+ * TODO (updated 2010/07/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Motorola 68000 - HiSoft Devpac ST 2 Assembler format',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* Directives. */
+ 1 => array(
+ 'end', 'include', 'incbin', 'opt', 'even', 'cnop', 'dc.b', 'dc.w',
+ 'dc.l', 'ds.b', 'ds.w', 'ds.l', 'dcb.b', 'dcb.w', 'dcb.l',
+ 'fail', 'output', '__g2', 'rept', 'endr', 'list', 'nolist', 'plen',
+ 'llen', 'ttl', 'subttl', 'spc', 'page', 'listchar', 'format',
+ 'equ', 'equr', 'set', 'reg', 'rs.b', 'rs.w', 'rs.l', 'rsreset',
+ 'rsset', '__rs', 'ifeq', 'ifne', 'ifgt', 'ifge', 'iflt', 'ifle', 'endc',
+ 'ifd', 'ifnd', 'ifc', 'ifnc', 'elseif', 'iif', 'macro', 'endm', 'mexit',
+ 'narg', '\@', 'section', 'text', 'data', 'bss', 'xdef', 'xref', 'org',
+ 'offset', '__lk', 'comment',
+ ),
+ /* 68000 Opcodes. */
+ 2 => array(
+ 'abcd', 'add', 'adda', 'addi', 'addq', 'addx', 'and', 'andi',
+ 'asl', 'asr', 'bcc', 'bchg', 'bclr', 'bcs', 'beq', 'bge',
+ 'bgt', 'bhi', 'ble', 'bls', 'blt', 'bmi', 'bne', 'bpl',
+ 'bra', 'bset', 'bsr', 'btst', 'bvc', 'bvs', 'chk', 'clr',
+ 'cmp', 'cmpa', 'cmpi', 'cmpm', 'dbcc', 'dbcs', 'dbeq', 'dbf',
+ 'dbge', 'dbgt', 'dbhi', 'dble', 'dbls', 'dblt', 'dbmi', 'dbne',
+ 'dbpl', 'dbra', 'dbt', 'dbvc', 'dbvs', 'divs', 'divu', 'eor',
+ 'eori', 'exg', 'ext','illegal','jmp', 'jsr', 'lea', 'link',
+ 'lsl', 'lsr', 'move','movea','movem','movep','moveq', 'muls',
+ 'mulu', 'nbcd', 'neg', 'negx', 'nop', 'not', 'or', 'ori',
+ 'pea', 'reset', 'rol', 'ror', 'roxl', 'roxr', 'rte', 'rtr',
+ 'rts', 'sbcd', 'scc', 'scs', 'seq', 'sf', 'sge', 'sgt',
+ 'shi', 'sle', 'sls', 'slt', 'smi', 'sne', 'spl', 'st',
+ 'stop', 'sub', 'suba', 'subi', 'subq', 'subx', 'svc', 'svs',
+ 'swap', 'tas', 'trap','trapv', 'tst', 'unlk',
+ ),
+ /* oprand sizes. */
+ 3 => array(
+ 'b', 'w', 'l' , 's'
+ ),
+ /* 68000 Registers. */
+ 4 => array(
+ 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7',
+ 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'sp', 'usp', 'ssp',
+ 'pc', 'ccr', 'sr',
+ ),
+ ),
+ 'SYMBOLS' => array(
+// '[', ']', '(', ')', '{', '}', // These are already defined by GeSHi as BRACKETS.
+ '+', '-', '~', '<<', '>>', '&',
+ '!', '^', '*', '/', '=', '<', '>',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #f08; font-weight:bold;',
+ 2 => 'color: #00f; font-weight:bold;',
+ 3 => 'color: #00f; font-weight:bold;',
+ 4 => 'color: #080; font-weight:bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #999; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'NUMBERS' => array(
+ GESHI_NUMBER_INT_BASIC => 'color: #f00;',
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR => 'color: #f00;',
+ GESHI_NUMBER_BIN_PREFIX_PERCENT => 'color: #f00;',
+ GESHI_NUMBER_OCT_PREFIX_AT => 'color: #f00;',
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #933;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR |
+ GESHI_NUMBER_OCT_PREFIX_AT |
+ GESHI_NUMBER_BIN_PREFIX_PERCENT,
+ 'REGEXPS' => array(
+ //Labels may end in a colon.
+ 0 => '(?<=\A\x20|\r|\n|^)[\._a-zA-Z][\._a-zA-Z0-9]*[\:]?[\s]'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'NUMBERS' => array(
+ 'PRECHECK_RX' => '/[\da-fA-F\.\$\%\@]/'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/abap.php b/inc/geshi/abap.php
index 942d2397e..5acd261c6 100644
--- a/inc/geshi/abap.php
+++ b/inc/geshi/abap.php
@@ -7,7 +7,7 @@
* - Sandra Rossi (sandra.rossi@gmail.com)
* - Jacob Laursen (jlu@kmd.dk)
* Copyright: (c) 2007 Andres Picazo
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/04
*
* ABAP language file for GeSHi.
diff --git a/inc/geshi/actionscript.php b/inc/geshi/actionscript.php
index 41d66edd2..08e5b49ac 100644
--- a/inc/geshi/actionscript.php
+++ b/inc/geshi/actionscript.php
@@ -4,7 +4,7 @@
* ----------------
* Author: Steffen Krause (Steffen.krause@muse.de)
* Copyright: (c) 2004 Steffen Krause, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/20
*
* Actionscript language file for GeSHi.
diff --git a/inc/geshi/actionscript3.php b/inc/geshi/actionscript3.php
index 4aab929dc..189d714b3 100644
--- a/inc/geshi/actionscript3.php
+++ b/inc/geshi/actionscript3.php
@@ -4,7 +4,7 @@
* ----------------
* Author: Jordi Boggiano (j.boggiano@seld.be)
* Copyright: (c) 2007 Jordi Boggiano (http://www.seld.be/), Benny Baumann (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/11/26
*
* ActionScript3 language file for GeSHi.
@@ -60,7 +60,7 @@ $language_data = array (
'COMMENT_MULTI' => array('/*' => '*/'),
'COMMENT_REGEXP' => array(
//Regular expressions
- 2 => "/(?<=[\\s^])(s|tr|y)\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/(?:\\\\.|(?!\n)[^\\/\\\\])*\\/[msixpogcde]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])(m|q[qrwx]?)?\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/[msixpogc]*(?=[\\s$\\.\\,\\;\\)])/iU",
+ 2 => "/(?<=[\\s^])(s|tr|y)\\/(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])+(?<!\s)\\/(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])*(?<!\s)\\/[msixpogcde]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])(m|q[qrwx]?)?\\/(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])+(?<!\s)\\/[msixpogc]*(?=[\\s$\\.\\,\\;\\)])/iU",
),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array("'", '"'),
@@ -72,7 +72,7 @@ $language_data = array (
'private', 'null', 'new', 'is', 'internal', 'instanceof', 'in',
'import', 'if', 'get', 'for', 'false', 'else', 'each', 'do',
'delete', 'default', 'continue', 'catch', 'case', 'break', 'as',
- 'extends'
+ 'extends', 'override'
),
2 => array(
'var'
diff --git a/inc/geshi/ada.php b/inc/geshi/ada.php
index c6b0597bb..c4ef2c395 100644
--- a/inc/geshi/ada.php
+++ b/inc/geshi/ada.php
@@ -4,7 +4,7 @@
* -------
* Author: Tux (tux@inmail.cz)
* Copyright: (c) 2004 Tux (http://tux.a4.cz/), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/07/29
*
* Ada language file for GeSHi.
diff --git a/inc/geshi/algol68.php b/inc/geshi/algol68.php
new file mode 100644
index 000000000..5b1e5aa7f
--- /dev/null
+++ b/inc/geshi/algol68.php
@@ -0,0 +1,329 @@
+<?php
+/*************************************************************************************
+ * algol68.php
+ * --------
+ * Author: Neville Dempsey (NevilleD.sourceforge@sgr-a.net)
+ * Copyright: (c) 2010 Neville Dempsey (https://sourceforge.net/projects/algol68/files/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/04/24
+ *
+ * ALGOL 68 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/04/24 (1.0.8.8.0)
+ * - First Release - machine generated by http://rosettacode.org/geshi/
+ * 2010/05/24 (1.0.8.8.1)
+ * - #2324 - converted comment detection to RegEx
+ * 2010/06/16 (1.0.8.8.2)
+ * - separate symbols from keywords - quick fix
+ * 2010/06/16 (1.0.8.8.3)
+ * - reverse length order symbols
+ * - Add RegEx for BITS and REAL literals (INT to do)
+ * - recognise LONG and SHORT prefixes to literals
+ * 2010/07/23 (1.0.8.8.4)
+ * - fix errors detected by langcheck.php, eg rm tab, fix indenting, rm duplicate keywords, fix symbols as keywords etc
+ * - removed bulk of local variables from name space.
+ * - unfolded arrays
+ *
+ * TODO (updated yyyy/mm/dd)
+ * -------------------------
+ * - Use "Parser Control" to fix KEYWORD parsing, eg: (INT minus one= -1; print(ABSminus one))
+ * - Parse $FORMATS$ more fully - if possible.
+ * - Pull reserved words from the source of A68G and A68RS
+ * - Pull stdlib PROC/OP/MODE symbols from the soruce of A68G and A68RS
+ * - Pull PROC/OP/MODE extensions from the soruce of A68G and A68RS
+ * - Use RegEx to detect extended precision PROC names, eg 'long long sin' etc
+ * - Use RegEx to detect white space std PROC names, eg 'new line'
+ * - Use RegEx to detect white space ext PROC names, eg 'cgs speed of light'
+ * - Use RegEx to detect BOLD symbols, eg userdefined MODEs and OPs
+ * - Add REgEx for INT literals - Adding INT breaks formatting...
+ * - Adding PIPE as a key word breaks formatting of "|" symbols!!
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+if(!function_exists('geshi_langfile_algol68_vars')) {
+ function geshi_langfile_algol68_vars(){
+ $pre='(?<![0-9a-z_\.])';
+ $post='?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)';
+ $post=""; # assuming the RegEx is greedy #
+
+ $_="\s*";
+
+ $srad="Rr"; $rrad="[".$srad."]"; # either one digit, OR opt-space in digits #
+ $sbin="0-1"; $rbin="[".$sbin."]"; $_bin=$rbin."(?:[".$sbin."\s]*".$rbin."|)";
+ $snib="0-3"; $rnib="[".$snib."]"; $_nib=$rnib."(?:[".$snib."\s]*".$rnib."|)";
+ $soct="0-7"; $roct="[".$soct."]"; $_oct=$roct."(?:[".$soct."\s]*".$roct."|)";
+ $sdec="0-9"; $rdec="[".$sdec."]"; $_dec=$rdec."(?:[".$sdec."\s]*".$rdec."|)";
+ $shex="0-9A-Fa-f"; $rhex="[".$shex."]"; $_hex=$rhex."(?:[".$shex."\s]*".$rhex."|)";
+
+ # Define BITS: #
+ $prebits=$pre; $postbits=$post;
+ $bl="2".$_.$rrad.$_.$_bin;
+ $bl=$bl."|"."2".$_.$rrad.$_.$_bin;
+ $bl=$bl."|"."4".$_.$rrad.$_.$_nib;
+ $bl=$bl."|"."8".$_.$rrad.$_.$_oct;
+ $bl=$bl."|"."1".$_."0".$_.$rrad.$_.$_dec;
+ $bl=$bl."|"."1".$_."6".$_.$rrad.$_.$_hex;
+
+ # Define INT: #
+ $preint=$pre; $postint=$post;
+ # for some reason ".0 e - 2" is not recognised, but ".0 e + 2" IS!
+ # work around: remove spaces between sign and digits! Maybe because
+ # of the Unary '-' Operator
+ $sign_="(?:-|\-|[-]|[\-]|\+|)"; # attempts #
+
+ $sign_="(?:-\s*|\+\s*|)"; # n.b. sign is followed by white space #
+
+ $_int=$sign_.$_dec;
+ $il= $_int; # +_9 #
+
+ $GESHI_NUMBER_INT_BASIC='(?:(?<![0-9a-z_\.%])|(?<=\.\.))(?<![\d\.]e[+\-])([1-9]\d*?|0)(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)';
+
+ # Define REAL: #
+ $prereal=$pre; $postreal=$post;
+ $sexp="Ee\\\\"; $_exp="(?:⏨|[".$sexp."])".$_.$_int;
+ $_decimal="[.]".$_.$_dec;
+
+ # Add permitted permutations of various parts #
+ $rl= $_int.$_.$_decimal.$_.$_exp; # +_9_._9_e_+_9 #
+ $rl=$rl."|".$_int.$_."[.]".$_.$_exp; # +_9_.___e_+_9 #
+ $rl=$rl."|".$_int.$_.$_exp; # +_9_____e_+_9 #
+ $rl=$rl."|".$sign_.$_decimal.$_.$_exp; # +___._9_e_+_9 #
+
+ $rl=$rl."|".$_int.$_.$_decimal; # +_9_._9 #
+ $rl=$rl."|".$sign_.$_decimal; # +___._9 #
+
+ # The following line damaged formatting...
+ #$rl=$rl."|".$_int; # +_9 #
+
+ # Apparently Algol68 does not support '2.', c.f. Algol 68G
+ #$rl=$rl."|".$_int.$_."[.]"; # +_9_. #
+
+ # Literal prefixes are overridden by KEYWORDS :-(
+ $LONGS="(?:(?:(LONG\s+)*|(SHORT\s+))*|)";
+
+ return array(
+ "BITS" => $prebits.$LONGS."(?:".$bl.")".$postbits,
+ "INT" => $preint.$LONGS."(?:".$il.")".$postint,
+ "REAL" => $prereal.$LONGS."(?:".$rl.")".$postreal,
+
+ "BOLD" => 'color: #b1b100; font-weight: bold;',
+ "ITALIC" => 'color: #b1b100;', # procedures traditionally italic #
+ "NONSTD" => 'color: #FF0000; font-weight: bold;', # RED #
+ "COMMENT" => 'color: #666666; font-style: italic;'
+ );
+ }
+}
+$a68=geshi_langfile_algol68_vars();
+
+$language_data = array(
+ 'LANG_NAME' => 'ALGOL 68',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(
+ '¢' => '¢',
+ '£' => '£',
+ '#' => '#',
+ ),
+ 'COMMENT_REGEXP' => array(
+ 1 => '/\bCO((?:MMENT)?)\b.*?\bCO\\1\b/i',
+ 2 => '/\bPR((?:AGMAT)?)\b.*?\bPR\\1\b/i',
+ 3 => '/\bQUOTE\b.*?\bQUOTE\b/i'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '"',
+ 'NUMBERS' => GESHI_NUMBER_HEX_SUFFIX, # Warning: Feature!! #
+# GESHI_NUMBER_HEX_SUFFIX, # Attempt ignore default #
+ 'KEYWORDS' => array(
+# Extensions
+ 1 => array('KEEP', 'FINISH', 'USE', 'SYSPROCS', 'IOSTATE', 'USING', 'ENVIRON', 'PROGRAM', 'CONTEXT'),
+# 2 => array('CASE', 'IN', 'OUSE', 'IN', 'OUT', 'ESAC', '(', '|', '|:', ')', 'FOR', 'FROM', 'TO', 'BY', 'WHILE', 'DO', 'OD', 'IF', 'THEN', 'ELIF', 'THEN', 'ELSE', 'FI', 'PAR', 'BEGIN', 'EXIT', 'END', 'GO', 'GOTO', 'FORALL', 'UPTO', 'DOWNTO', 'FOREACH', 'ASSERT'), #
+ 2 => array('CASE', 'IN', 'OUSE', /* 'IN',*/ 'OUT', 'ESAC', 'PAR', 'BEGIN', 'EXIT', 'END', 'GO TO', 'GOTO', 'FOR', 'FROM', 'TO', 'BY', 'WHILE', 'DO', 'OD', 'IF', 'THEN', 'ELIF', /* 'THEN',*/ 'ELSE', 'FI' ),
+ 3 => array('BITS', 'BOOL', 'BYTES', 'CHAR', 'COMPL', 'INT', 'REAL', 'SEMA', 'STRING', 'VOID'),
+ 4 => array('MODE', 'OP', 'PRIO', 'PROC', 'FLEX', 'HEAP', 'LOC', 'REF', 'LONG', 'SHORT', 'EITHER'),
+# Extensions or deprecated keywords
+# 'PIPE': keyword somehow interferes with the internal operation of GeSHi
+ 5 => array('FORALL', 'UPTO', 'DOWNTO', 'FOREACH', 'ASSERT', 'CTB', 'CT', 'CTAB', 'COMPLEX', 'VECTOR', 'SOUND' /*, 'PIPE'*/),
+ 6 => array('CHANNEL', 'FILE', 'FORMAT', 'STRUCT', 'UNION', 'OF'),
+# '(', '|', '|:', ')', #
+# 7 => array('OF', 'AT', '@', 'IS', ':=:', 'ISNT', ':/=:', ':≠:', 'CTB', 'CT', '::', 'CTAB', '::=', 'TRUE', 'FALSE', 'EMPTY', 'NIL', '○', 'SKIP', '~'),
+ 7 => array('AT', 'IS', 'ISNT', 'TRUE', 'FALSE', 'EMPTY', 'NIL', 'SKIP'),
+ 8 => array('NOT', 'UP', 'DOWN', 'LWB', 'UPB', /* '-',*/ 'ABS', 'ARG', 'BIN', 'ENTIER', 'LENG', 'LEVEL', 'ODD', 'REPR', 'ROUND', 'SHORTEN', 'CONJ', 'SIGN'),
+# OPERATORS ordered roughtly by PRIORITY #
+# 9 => array('¬', '↑', '↓', '⌊', '⌈', '~', '⎩', '⎧'),
+# 10 => array('+*', 'I', '+×', '⊥', '!', '⏨'),
+ 10 => array('I'),
+# 11 => array('SHL', 'SHR', '**', 'UP', 'DOWN', 'LWB', 'UPB', '↑', '↓', '⌊', '⌈', '⎩', '⎧'),
+ 11 => array('SHL', 'SHR', /*'UP', 'DOWN', 'LWB', 'UPB'*/),
+# 12 => array('*', '/', '%', 'OVER', '%*', 'MOD', 'ELEM', '×', '÷', '÷×', '÷*', '%×', '□', '÷:'),
+ 12 => array('OVER', 'MOD', 'ELEM'),
+# 13 => array('-', '+'),
+# 14 => array('<', 'LT', '<=', 'LE', '>=', 'GE', '>', 'GT', '≤', '≥'),
+ 14 => array('LT', 'LE', 'GE', 'GT'),
+# 15 => array('=', 'EQ', '/=', 'NE', '≠', '~='),
+ 15 => array('EQ', 'NE'),
+# 16 => array('&', 'AND', '∧', 'OR', '∨', '/\\', '\\/'),
+ 16 => array('AND', 'OR'),
+ 17 => array('MINUSAB', 'PLUSAB', 'TIMESAB', 'DIVAB', 'OVERAB', 'MODAB', 'PLUSTO'),
+# 18 => array('-:=', '+:=', '*:=', '/:=', '%:=', '%*:=', '+=:', '×:=', '÷:=', '÷×:=', '÷*:=', '%×:=', '÷::=', 'MINUS', 'PLUS', 'DIV', 'MOD', 'PRUS'),
+# Extensions or deprecated keywords
+ 18 => array('MINUS', 'PLUS', 'DIV', /* 'MOD',*/ 'PRUS', 'IS NOT'),
+# Extensions or deprecated keywords
+ 19 => array('THEF', 'ANDF', 'ORF', 'ANDTH', 'OREL', 'ANDTHEN', 'ORELSE'),
+# Built in procedures - from standard prelude #
+ 20 => array('int lengths', 'intlengths', 'int shorths', 'intshorths', 'max int', 'maxint', 'real lengths', 'reallengths', 'real shorths', 'realshorths', 'bits lengths', 'bitslengths', 'bits shorths', 'bitsshorths', 'bytes lengths', 'byteslengths', 'bytes shorths', 'bytesshorths', 'max abs char', 'maxabschar', 'int width', 'intwidth', 'long int width', 'longintwidth', 'long long int width', 'longlongintwidth', 'real width', 'realwidth', 'long real width', 'longrealwidth', 'long long real width', 'longlongrealwidth', 'exp width', 'expwidth', 'long exp width', 'longexpwidth', 'long long exp width', 'longlongexpwidth', 'bits width', 'bitswidth', 'long bits width', 'longbitswidth', 'long long bits width', 'longlongbitswidth', 'bytes width', 'byteswidth', 'long bytes width', 'longbyteswidth', 'max real', 'maxreal', 'small real', 'smallreal', 'long max int', 'longmaxint', 'long long max int', 'longlongmaxint', 'long max real', 'longmaxreal', 'long small real', 'longsmallreal', 'long long max real', 'longlongmaxreal', 'long long small real', 'longlongsmallreal', 'long max bits', 'longmaxbits', 'long long max bits', 'longlongmaxbits', 'null character', 'nullcharacter', 'blank', 'flip', 'flop', 'error char', 'errorchar', 'exp char', 'expchar', 'newline char', 'newlinechar', 'formfeed char', 'formfeedchar', 'tab char', 'tabchar'),
+ 21 => array('stand in channel', 'standinchannel', 'stand out channel', 'standoutchannel', 'stand back channel', 'standbackchannel', 'stand draw channel', 'standdrawchannel', 'stand error channel', 'standerrorchannel'),
+ 22 => array('put possible', 'putpossible', 'get possible', 'getpossible', 'bin possible', 'binpossible', 'set possible', 'setpossible', 'reset possible', 'resetpossible', 'reidf possible', 'reidfpossible', 'draw possible', 'drawpossible', 'compressible', 'on logical file end', 'onlogicalfileend', 'on physical file end', 'onphysicalfileend', 'on line end', 'onlineend', 'on page end', 'onpageend', 'on format end', 'onformatend', 'on value error', 'onvalueerror', 'on open error', 'onopenerror', 'on transput error', 'ontransputerror', 'on format error', 'onformaterror', 'open', 'establish', 'create', 'associate', 'close', 'lock', 'scratch', 'space', 'new line', 'newline', 'print', 'write f', 'writef', 'print f', 'printf', 'write bin', 'writebin', 'print bin', 'printbin', 'read f', 'readf', 'read bin', 'readbin', 'put f', 'putf', 'get f', 'getf', 'make term', 'maketerm', 'make device', 'makedevice', 'idf', 'term', 'read int', 'readint', 'read long int', 'readlongint', 'read long long int', 'readlonglongint', 'read real', 'readreal', 'read long real', 'readlongreal', 'read long long real', 'readlonglongreal', 'read complex', 'readcomplex', 'read long complex', 'readlongcomplex', 'read long long complex', 'readlonglongcomplex', 'read bool', 'readbool', 'read bits', 'readbits', 'read long bits', 'readlongbits', 'read long long bits', 'readlonglongbits', 'read char', 'readchar', 'read string', 'readstring', 'print int', 'printint', 'print long int', 'printlongint', 'print long long int', 'printlonglongint', 'print real', 'printreal', 'print long real', 'printlongreal', 'print long long real', 'printlonglongreal', 'print complex', 'printcomplex', 'print long complex', 'printlongcomplex', 'print long long complex', 'printlonglongcomplex', 'print bool', 'printbool', 'print bits', 'printbits', 'print long bits', 'printlongbits', 'print long long bits', 'printlonglongbits', 'print char', 'printchar', 'print string', 'printstring', 'whole', 'fixed', 'float'),
+ 23 => array('pi', 'long pi', 'longpi', 'long long pi', 'longlongpi'),
+ 24 => array('sqrt', 'curt', 'cbrt', 'exp', 'ln', 'log', 'sin', 'arc sin', 'arcsin', 'cos', 'arc cos', 'arccos', 'tan', 'arc tan', 'arctan', 'long sqrt', 'longsqrt', 'long curt', 'longcurt', 'long cbrt', 'longcbrt', 'long exp', 'longexp', 'long ln', 'longln', 'long log', 'longlog', 'long sin', 'longsin', 'long arc sin', 'longarcsin', 'long cos', 'longcos', 'long arc cos', 'longarccos', 'long tan', 'longtan', 'long arc tan', 'longarctan', 'long long sqrt', 'longlongsqrt', 'long long curt', 'longlongcurt', 'long long cbrt', 'longlongcbrt', 'long long exp', 'longlongexp', 'long long ln', 'longlongln', 'long long log', 'longlonglog', 'long long sin', 'longlongsin', 'long long arc sin', 'longlongarcsin', 'long long cos', 'longlongcos', 'long long arc cos', 'longlongarccos', 'long long tan', 'longlongtan', 'long long arc tan', 'longlongarctan'),
+ 25 => array('first random', 'firstrandom', 'next random', 'nextrandom', 'long next random', 'longnextrandom', 'long long next random', 'longlongnextrandom'),
+ 26 => array('real', 'bits pack', 'bitspack', 'long bits pack', 'longbitspack', 'long long bits pack', 'longlongbitspack', 'bytes pack', 'bytespack', 'long bytes pack', 'longbytespack', 'char in string', 'charinstring', 'last char in string', 'lastcharinstring', 'string in string', 'stringinstring'),
+ 27 => array('utc time', 'utctime', 'local time', 'localtime', 'argc', 'argv', 'get env', 'getenv', 'reset errno', 'reseterrno', 'errno', 'strerror'),
+ 28 => array('sinh', 'long sinh', 'longsinh', 'long long sinh', 'longlongsinh', 'arc sinh', 'arcsinh', 'long arc sinh', 'longarcsinh', 'long long arc sinh', 'longlongarcsinh', 'cosh', 'long cosh', 'longcosh', 'long long cosh', 'longlongcosh', 'arc cosh', 'arccosh', 'long arc cosh', 'longarccosh', 'long long arc cosh', 'longlongarccosh', 'tanh', 'long tanh', 'longtanh', 'long long tanh', 'longlongtanh', 'arc tanh', 'arctanh', 'long arc tanh', 'longarctanh', 'long long arc tanh', 'longlongarctanh', 'arc tan2', 'arctan2', 'long arc tan2', 'longarctan2', 'long long arc tan2', 'longlongarctan2'),
+ 29 => array('complex sqrt', 'complexsqrt', 'long complex sqrt', 'longcomplexsqrt', 'long long complex sqrt', 'longlongcomplexsqrt', 'complex exp', 'complexexp', 'long complex exp', 'longcomplexexp', 'long long complex exp', 'longlongcomplexexp', 'complex ln', 'complexln', 'long complex ln', 'longcomplexln', 'long long complex ln', 'longlongcomplexln', 'complex sin', 'complexsin', 'long complex sin', 'longcomplexsin', 'long long complex sin', 'longlongcomplexsin', 'complex arc sin', 'complexarcsin', 'long complex arc sin', 'longcomplexarcsin', 'long long complex arc sin', 'longlongcomplexarcsin', 'complex cos', 'complexcos', 'long complex cos', 'longcomplexcos', 'long long complex cos', 'longlongcomplexcos', 'complex arc cos', 'complexarccos', 'long complex arc cos', 'longcomplexarccos', 'long long complex arc cos', 'longlongcomplexarccos', 'complex tan', 'complextan', 'long complex tan', 'longcomplextan', 'long long complex tan', 'longlongcomplextan', 'complex arc tan', 'complexarctan', 'long complex arc tan', 'longcomplexarctan', 'long long complex arc tan', 'longlongcomplexarctan', 'complex sinh', 'complexsinh', 'complex arc sinh', 'complexarcsinh', 'complex cosh', 'complexcosh', 'complex arc cosh', 'complexarccosh', 'complex tanh', 'complextanh', 'complex arc tanh', 'complexarctanh')
+ ),
+ 'SYMBOLS' => array(
+ 1 => array( /* reverse length sorted... */ '÷×:=', '%×:=', ':≠:', '÷*:=', '÷::=', '%*:=', ':/=:', '×:=', '÷:=', '÷×', '%:=', '%×', '*:=', '+:=', '+=:', '+×', '-:=', '/:=', '::=', ':=:', '÷*', '÷:', '↑', '↓', '∧', '∨', '≠', '≤', '≥', '⊥', '⌈', '⌊', '⎧', '⎩', /* '⏨', */ '□', '○', '%*', '**', '+*', '/=', '::', '/\\', '\\/', '<=', '>=', '|:', '~=', '¬', '×', '÷', '!', '%', '&', '(', ')', '*', '+', ',', '-', '/', ':', ';', '<', '=', '>', '?', '@', '[', ']', '^', '{', '|', '}', '~')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+# 9 => true,
+ 10 => true,
+ 11 => true,
+ 12 => true,
+# 13 => true,
+ 14 => true,
+ 15 => true,
+ 16 => true,
+ 17 => true,
+ 18 => true,
+ 19 => true,
+ 20 => true,
+ 21 => true,
+ 22 => true,
+ 23 => true,
+ 24 => true,
+ 25 => true,
+ 26 => true,
+ 27 => true,
+ 28 => true,
+ 29 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => $a68['NONSTD'], 2 => $a68['BOLD'], 3 => $a68['BOLD'], 4 => $a68['BOLD'],
+ 5 => $a68['NONSTD'], 6 => $a68['BOLD'], 7 => $a68['BOLD'], 8 => $a68['BOLD'],
+ /* 9 => $a68['BOLD'],*/ 10 => $a68['BOLD'], 11 => $a68['BOLD'], 12 => $a68['BOLD'],
+ /* 13 => $a68['BOLD'],*/ 14 => $a68['BOLD'], 15 => $a68['BOLD'], 16 => $a68['BOLD'], 17 => $a68['BOLD'],
+ 18 => $a68['NONSTD'], 19 => $a68['NONSTD'],
+ 20 => $a68['ITALIC'], 21 => $a68['ITALIC'], 22 => $a68['ITALIC'], 23 => $a68['ITALIC'],
+ 24 => $a68['ITALIC'], 25 => $a68['ITALIC'], 26 => $a68['ITALIC'], 27 => $a68['ITALIC'],
+ 28 => $a68['ITALIC'], 29 => $a68['ITALIC']
+ ),
+ 'COMMENTS' => array(
+ 1 => $a68['COMMENT'], 2 => $a68['COMMENT'], 3 => $a68['COMMENT'], /* 4 => $a68['COMMENT'],
+ 5 => $a68['COMMENT'],*/ 'MULTI' => $a68['COMMENT']
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;',
+ 1 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #cc66cc;', # BITS #
+ 1 => 'color: #cc66cc;', # REAL #
+ /* 2 => 'color: #cc66cc;', # INT # */
+ ),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+# 9 => '',
+ 10 => '',
+ 11 => '',
+ 12 => '',
+# 13 => '',
+ 14 => '',
+ 15 => '',
+ 16 => '',
+ 17 => '',
+ 18 => '',
+ 19 => '',
+ 20 => '',
+ 21 => '',
+ 22 => '',
+ 23 => '',
+ 24 => '',
+ 25 => '',
+ 26 => '',
+ 27 => '',
+ 28 => '',
+ 29 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 0 => '→',
+ 1 => 'OF'
+ ),
+ 'REGEXPS' => array(
+ 0 => $a68['BITS'],
+ 1 => $a68['REAL']
+ # 2 => $a68['INT'], # Breaks formatting for some reason #
+ # 2 => $GESHI_NUMBER_INT_BASIC # Also breaks formatting #
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+unset($a68);
+?> \ No newline at end of file
diff --git a/inc/geshi/apache.php b/inc/geshi/apache.php
index 34704eb22..c944443c7 100644
--- a/inc/geshi/apache.php
+++ b/inc/geshi/apache.php
@@ -4,7 +4,7 @@
* ----------
* Author: Tux (tux@inmail.cz)
* Copyright: (c) 2004 Tux (http://tux.a4.cz/), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/29/07
*
* Apache language file for GeSHi.
@@ -344,6 +344,9 @@ $language_data = array (
//mod_unique_id.c
+ //mod_upload_progress
+ 'ReportUploads', 'TrackUploads', 'UploadProgressSharedMemorySize',
+
//mod_userdir.c
'UserDir',
diff --git a/inc/geshi/applescript.php b/inc/geshi/applescript.php
index 9e214f2e1..603fa4a3e 100644
--- a/inc/geshi/applescript.php
+++ b/inc/geshi/applescript.php
@@ -4,7 +4,7 @@
* --------
* Author: Stephan Klimek (http://www.initware.org)
* Copyright: Stephan Klimek (http://www.initware.org)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/07/20
*
* AppleScript language file for GeSHi.
diff --git a/inc/geshi/apt_sources.php b/inc/geshi/apt_sources.php
index f4cf9ae3f..9f1ed045e 100644
--- a/inc/geshi/apt_sources.php
+++ b/inc/geshi/apt_sources.php
@@ -4,7 +4,7 @@
* ----------
* Author: Milian Wolff (mail@milianw.de)
* Copyright: (c) 2008 Milian Wolff (http://milianw.de)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/06/17
*
* Apt sources.list language file for GeSHi.
@@ -55,7 +55,7 @@ $language_data = array (
'stable/updates',
//Debian
'buzz', 'rex', 'bo', 'hamm', 'slink', 'potato', 'woody', 'sarge',
- 'etch', 'lenny', 'sid',
+ 'etch', 'lenny', 'wheezy', 'sid',
//Ubuntu
'warty', 'warty-updates', 'warty-security', 'warty-proposed', 'warty-backports',
'hoary', 'hoary-updates', 'hoary-security', 'hoary-proposed', 'hoary-backports',
@@ -65,7 +65,11 @@ $language_data = array (
'feisty', 'feisty-updates', 'feisty-security', 'feisty-proposed', 'feisty-backports',
'gutsy', 'gutsy-updates', 'gutsy-security', 'gutsy-proposed', 'gutsy-backports',
'hardy', 'hardy-updates', 'hardy-security', 'hardy-proposed', 'hardy-backports',
- 'intrepid', 'intrepid-updates', 'intrepid-security', 'intrepid-proposed', 'intrepid-backports'
+ 'intrepid', 'intrepid-updates', 'intrepid-security', 'intrepid-proposed', 'intrepid-backports',
+ 'jaunty', 'jaunty-updates', 'jaunty-security', 'jaunty-proposed', 'jaunty-backports',
+ 'karmic', 'karmic-updates', 'karmic-security', 'karmic-proposed', 'karmic-backports',
+ 'lucid', 'lucid-updates', 'lucid-security', 'lucid-proposed', 'lucid-backports',
+ 'maverick', 'maverick-updates', 'maverick-security', 'maverick-proposed', 'maverick-backports'
),
3 => array(
'main', 'restricted', 'preview', 'contrib', 'non-free',
@@ -141,4 +145,4 @@ $language_data = array (
'TAB_WIDTH' => 4
);
-?>
+?> \ No newline at end of file
diff --git a/inc/geshi/arm.php b/inc/geshi/arm.php
new file mode 100644
index 000000000..8e3c0a37e
--- /dev/null
+++ b/inc/geshi/arm.php
@@ -0,0 +1,3318 @@
+<?php
+/*************************************************************************************
+ * arm.php
+ * -------
+ * Author: Marat Dukhan (mdukhan3.at.gatech.dot.edu)
+ * Copyright: (c) Marat Dukhan (mdukhan3.at.gatech.dot.edu)
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/10/06
+ *
+ * ARM Assembler language file for GeSHi.
+ * Based on the following documents:
+ * - "ARM Architecture Reference Manual: ARMv7-A and ARMv7-R edition"
+ * - "Intel XScale Technology: Intel Wireless MMX2 Coprocessor",
+ * Revision 1.5, July 2006
+ *
+ * CHANGES
+ * -------
+ * 2011/10/06
+ * - First Release (supported UAL syntax for up to ARMv7 A/R, VFPv3, NEON, WMMX/WMMX2)
+ *
+ * TODO (updated 2011/10/06)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ARM ASSEMBLER',
+ 'COMMENT_SINGLE' => array(
+ 1 => ';'
+ ),
+ 'COMMENT_MULTI' => array(),
+ //Line address prefix suppression
+ 'COMMENT_REGEXP' => array(
+ 2 => "/^(?:[0-9a-f]{0,4}:)?[0-9a-f]{4}(?:[0-9a-f]{4})?/mi"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* Unconditional Data Processing Instructions */
+ 1 => array(
+ /* Data Processing: Unconditional Addition & Subtraction */
+ 'adc.w','adcal.w',
+ 'adc','adcal',
+ 'add.w','addal.w',
+ 'add','addal',
+ 'addw','addwal',
+ 'rsb.w','rsbal.w',
+ 'rsb','rsbal',
+ 'rsc','rscal',
+ 'sbc.w','sbcal.w',
+ 'sbc','sbcal',
+ 'sub.w','subal.w',
+ 'sub','subal',
+ 'neg.w','negal.w',
+ 'neg','negal',
+ 'adr.w','adral.w',
+ 'adr','adral',
+ /* Data Processing: Unconditional Logical */
+ 'and.w','andal.w',
+ 'and','andal',
+ 'bic.w','bical.w',
+ 'bic','bical',
+ 'orr.w','orral.w',
+ 'orr','orral',
+ 'orn.w','ornal.w',
+ 'orn','ornal',
+ 'eor.w','eoral.w',
+ 'eor','eoral',
+ 'mov.w','moval.w',
+ 'mov','moval',
+ 'movw','movwal',
+ 'movt','movtal',
+ 'cpy','cpyal',
+ 'mvn.w','mvnal.w',
+ 'mvn','mvnal',
+ /* Data Processing: Unconditional Shifts and Rotates */
+ 'asr.w','asral.w',
+ 'asr','asral',
+ 'lsl.w','lslal.w',
+ 'lsl','lslal',
+ 'lsr.w','lsral.w',
+ 'lsr','lsral',
+ 'ror.w','roral.w',
+ 'ror','roral',
+ 'rrx','rrxal',
+ /* Data Processing: Unconditional Word Multiply and Multiply-Add */
+ 'mul','mulal',
+ 'mla','mlaal',
+ 'mls','mlsal',
+ 'smull','smullal',
+ 'muls','mulsal',
+ 'umull','umullal',
+ 'smlal','smlalal',
+ 'umlal','umlalal',
+ /* Data Processing: Unconditional Halfword Multiply and Multiply-Add (ARMv5TE) */
+ 'smulbb','smulbbal',
+ 'smulbt','smulbtal',
+ 'smultb','smultbal',
+ 'smultt','smulttal',
+ 'smulwb','smulwbal',
+ 'smulwt','smulwtal',
+ 'smlalbb','smlalbbal',
+ 'smlalbt','smlalbtal',
+ 'smlaltb','smlaltbal',
+ 'smlaltt','smlalttal',
+ 'smlabb','smlabbal',
+ 'smlabt','smlabtal',
+ 'smlatb','smlatbal',
+ 'smlatt','smlattal',
+ 'smlawb','smlawbal',
+ 'smlawt','smlawtal',
+ /* Data Processing: Unconditional Bit Operations */
+ 'ubfx','ubfxal',
+ 'sbfx','sbfxal',
+ 'bfc','bfcal',
+ 'bfi','bfial',
+ 'clz','clzal',
+ /* Data Processing: Unconditional Divide (ARMv7-R) */
+ 'sdiv','sdival',
+ 'udiv','udival'
+ ),
+ /* Conditional Data Processing Instructions */
+ 2 => array(
+ /* Data Processing: Conditional Addition & Subtraction */
+ 'adceq.w','adcne.w','adccs.w','adchs.w','adccc.w','adclo.w','adcmi.w','adcpl.w','adcvs.w','adcvc.w','adchi.w','adcls.w','adcge.w','adclt.w','adcgt.w','adcle.w',
+ 'adceq','adcne','adccs','adchs','adccc','adclo','adcmi','adcpl','adcvs','adcvc','adchi','adcls','adcge','adclt','adcgt','adcle',
+ 'addeq.w','addne.w','addcs.w','addhs.w','addcc.w','addlo.w','addmi.w','addpl.w','addvs.w','addvc.w','addhi.w','addls.w','addge.w','addlt.w','addgt.w','addle.w',
+ 'addeq','addne','addcs','addhs','addcc','addlo','addmi','addpl','addvs','addvc','addhi','addls','addge','addlt','addgt','addle',
+ 'addweq','addwne','addwcs','addwhs','addwcc','addwlo','addwmi','addwpl','addwvs','addwvc','addwhi','addwls','addwge','addwlt','addwgt','addwle',
+ 'rsbeq.w','rsbne.w','rsbcs.w','rsbhs.w','rsbcc.w','rsblo.w','rsbmi.w','rsbpl.w','rsbvs.w','rsbvc.w','rsbhi.w','rsbls.w','rsbge.w','rsblt.w','rsbgt.w','rsble.w',
+ 'rsbeq','rsbne','rsbcs','rsbhs','rsbcc','rsblo','rsbmi','rsbpl','rsbvs','rsbvc','rsbhi','rsbls','rsbge','rsblt','rsbgt','rsble',
+ 'rsceq','rscne','rsccs','rschs','rsccc','rsclo','rscmi','rscpl','rscvs','rscvc','rschi','rscls','rscge','rsclt','rscgt','rscle',
+ 'sbceq.w','sbcne.w','sbccs.w','sbchs.w','sbccc.w','sbclo.w','sbcmi.w','sbcpl.w','sbcvs.w','sbcvc.w','sbchi.w','sbcls.w','sbcge.w','sbclt.w','sbcgt.w','sbcle.w',
+ 'sbceq','sbcne','sbccs','sbchs','sbccc','sbclo','sbcmi','sbcpl','sbcvs','sbcvc','sbchi','sbcls','sbcge','sbclt','sbcgt','sbcle',
+ 'subeq.w','subne.w','subcs.w','subhs.w','subcc.w','sublo.w','submi.w','subpl.w','subvs.w','subvc.w','subhi.w','subls.w','subge.w','sublt.w','subgt.w','suble.w',
+ 'subeq','subne','subcs','subhs','subcc','sublo','submi','subpl','subvs','subvc','subhi','subls','subge','sublt','subgt','suble',
+ 'negeq.w','negne.w','negcs.w','neghs.w','negcc.w','neglo.w','negmi.w','negpl.w','negvs.w','negvc.w','neghi.w','negls.w','negge.w','neglt.w','neggt.w','negle.w',
+ 'negeq','negne','negcs','neghs','negcc','neglo','negmi','negpl','negvs','negvc','neghi','negls','negge','neglt','neggt','negle',
+ 'adreq.w','adrne.w','adrcs.w','adrhs.w','adrcc.w','adrlo.w','adrmi.w','adrpl.w','adrvs.w','adrvc.w','adrhi.w','adrls.w','adrge.w','adrlt.w','adrgt.w','adrle.w',
+ 'adreq','adrne','adrcs','adrhs','adrcc','adrlo','adrmi','adrpl','adrvs','adrvc','adrhi','adrls','adrge','adrlt','adrgt','adrle',
+ /* Data Processing: Conditional Logical */
+ 'andeq.w','andne.w','andcs.w','andhs.w','andcc.w','andlo.w','andmi.w','andpl.w','andvs.w','andvc.w','andhi.w','andls.w','andge.w','andlt.w','andgt.w','andle.w',
+ 'andeq','andne','andcs','andhs','andcc','andlo','andmi','andpl','andvs','andvc','andhi','andls','andge','andlt','andgt','andle',
+ 'biceq.w','bicne.w','biccs.w','bichs.w','biccc.w','biclo.w','bicmi.w','bicpl.w','bicvs.w','bicvc.w','bichi.w','bicls.w','bicge.w','biclt.w','bicgt.w','bicle.w',
+ 'biceq','bicne','biccs','bichs','biccc','biclo','bicmi','bicpl','bicvs','bicvc','bichi','bicls','bicge','biclt','bicgt','bicle',
+ 'orreq.w','orrne.w','orrcs.w','orrhs.w','orrcc.w','orrlo.w','orrmi.w','orrpl.w','orrvs.w','orrvc.w','orrhi.w','orrls.w','orrge.w','orrlt.w','orrgt.w','orrle.w',
+ 'orreq','orrne','orrcs','orrhs','orrcc','orrlo','orrmi','orrpl','orrvs','orrvc','orrhi','orrls','orrge','orrlt','orrgt','orrle',
+ 'orneq.w','ornne.w','orncs.w','ornhs.w','orncc.w','ornlo.w','ornmi.w','ornpl.w','ornvs.w','ornvc.w','ornhi.w','ornls.w','ornge.w','ornlt.w','orngt.w','ornle.w',
+ 'orneq','ornne','orncs','ornhs','orncc','ornlo','ornmi','ornpl','ornvs','ornvc','ornhi','ornls','ornge','ornlt','orngt','ornle',
+ 'eoreq.w','eorne.w','eorcs.w','eorhs.w','eorcc.w','eorlo.w','eormi.w','eorpl.w','eorvs.w','eorvc.w','eorhi.w','eorls.w','eorge.w','eorlt.w','eorgt.w','eorle.w',
+ 'eoreq','eorne','eorcs','eorhs','eorcc','eorlo','eormi','eorpl','eorvs','eorvc','eorhi','eorls','eorge','eorlt','eorgt','eorle',
+ 'moveq.w','movne.w','movcs.w','movhs.w','movcc.w','movlo.w','movmi.w','movpl.w','movvs.w','movvc.w','movhi.w','movls.w','movge.w','movlt.w','movgt.w','movle.w',
+ 'moveq','movne','movcs','movhs','movcc','movlo','movmi','movpl','movvs','movvc','movhi','movls','movge','movlt','movgt','movle',
+ 'movweq','movwne','movwcs','movwhs','movwcc','movwlo','movwmi','movwpl','movwvs','movwvc','movwhi','movwls','movwge','movwlt','movwgt','movwle',
+ 'movteq','movtne','movtcs','movths','movtcc','movtlo','movtmi','movtpl','movtvs','movtvc','movthi','movtls','movtge','movtlt','movtgt','movtle',
+ 'cpyeq','cpyne','cpycs','cpyhs','cpycc','cpylo','cpymi','cpypl','cpyvs','cpyvc','cpyhi','cpyls','cpyge','cpylt','cpygt','cpyle',
+ 'mvneq.w','mvnne.w','mvncs.w','mvnhs.w','mvncc.w','mvnlo.w','mvnmi.w','mvnpl.w','mvnvs.w','mvnvc.w','mvnhi.w','mvnls.w','mvnge.w','mvnlt.w','mvngt.w','mvnle.w',
+ 'mvneq','mvnne','mvncs','mvnhs','mvncc','mvnlo','mvnmi','mvnpl','mvnvs','mvnvc','mvnhi','mvnls','mvnge','mvnlt','mvngt','mvnle',
+ /* Data Processing: Conditional Shifts and Rotates */
+ 'asreq.w','asrne.w','asrcs.w','asrhs.w','asrcc.w','asrlo.w','asrmi.w','asrpl.w','asrvs.w','asrvc.w','asrhi.w','asrls.w','asrge.w','asrlt.w','asrgt.w','asrle.w',
+ 'asreq','asrne','asrcs','asrhs','asrcc','asrlo','asrmi','asrpl','asrvs','asrvc','asrhi','asrls','asrge','asrlt','asrgt','asrle',
+ 'lsleq.w','lslne.w','lslcs.w','lslhs.w','lslcc.w','lsllo.w','lslmi.w','lslpl.w','lslvs.w','lslvc.w','lslhi.w','lslls.w','lslge.w','lsllt.w','lslgt.w','lslle.w',
+ 'lsleq','lslne','lslcs','lslhs','lslcc','lsllo','lslmi','lslpl','lslvs','lslvc','lslhi','lslls','lslge','lsllt','lslgt','lslle',
+ 'lsreq.w','lsrne.w','lsrcs.w','lsrhs.w','lsrcc.w','lsrlo.w','lsrmi.w','lsrpl.w','lsrvs.w','lsrvc.w','lsrhi.w','lsrls.w','lsrge.w','lsrlt.w','lsrgt.w','lsrle.w',
+ 'lsreq','lsrne','lsrcs','lsrhs','lsrcc','lsrlo','lsrmi','lsrpl','lsrvs','lsrvc','lsrhi','lsrls','lsrge','lsrlt','lsrgt','lsrle',
+ 'roreq.w','rorne.w','rorcs.w','rorhs.w','rorcc.w','rorlo.w','rormi.w','rorpl.w','rorvs.w','rorvc.w','rorhi.w','rorls.w','rorge.w','rorlt.w','rorgt.w','rorle.w',
+ 'roreq','rorne','rorcs','rorhs','rorcc','rorlo','rormi','rorpl','rorvs','rorvc','rorhi','rorls','rorge','rorlt','rorgt','rorle',
+ 'rrxeq','rrxne','rrxcs','rrxhs','rrxcc','rrxlo','rrxmi','rrxpl','rrxvs','rrxvc','rrxhi','rrxls','rrxge','rrxlt','rrxgt','rrxle',
+ /* Data Processing: Conditional Word Multiply and Multiply-Add */
+ 'muleq','mulne','mulcs','mulhs','mulcc','mullo','mulmi','mulpl','mulvs','mulvc','mulhi','mulls','mulge','mullt','mulgt','mulle',
+ 'mlaeq','mlane','mlacs','mlahs','mlacc','mlalo','mlami','mlapl','mlavs','mlavc','mlahi','mlals','mlage','mlalt','mlagt','mlale',
+ 'mlseq','mlsne','mlscs','mlshs','mlscc','mlslo','mlsmi','mlspl','mlsvs','mlsvc','mlshi','mlsls','mlsge','mlslt','mlsgt','mlsle',
+ 'smulleq','smullne','smullcs','smullhs','smullcc','smulllo','smullmi','smullpl','smullvs','smullvc','smullhi','smullls','smullge','smulllt','smullgt','smullle',
+ 'mulseq','mulsne','mulscs','mulshs','mulscc','mulslo','mulsmi','mulspl','mulsvs','mulsvc','mulshi','mulsls','mulsge','mulslt','mulsgt','mulsle',
+ 'umulleq','umullne','umullcs','umullhs','umullcc','umulllo','umullmi','umullpl','umullvs','umullvc','umullhi','umullls','umullge','umulllt','umullgt','umullle',
+ 'smlaleq','smlalne','smlalcs','smlalhs','smlalcc','smlallo','smlalmi','smlalpl','smlalvs','smlalvc','smlalhi','smlalls','smlalge','smlallt','smlalgt','smlalle',
+ 'umlaleq','umlalne','umlalcs','umlalhs','umlalcc','umlallo','umlalmi','umlalpl','umlalvs','umlalvc','umlalhi','umlalls','umlalge','umlallt','umlalgt','umlalle',
+ /* Data Processing: Conditional Halfword Multiply and Multiply-Add (ARMv5TE) */
+ 'smulbbeq','smulbbne','smulbbcs','smulbbhs','smulbbcc','smulbblo','smulbbmi','smulbbpl','smulbbvs','smulbbvc','smulbbhi','smulbbls','smulbbge','smulbblt','smulbbgt','smulbble',
+ 'smulbteq','smulbtne','smulbtcs','smulbths','smulbtcc','smulbtlo','smulbtmi','smulbtpl','smulbtvs','smulbtvc','smulbthi','smulbtls','smulbtge','smulbtlt','smulbtgt','smulbtle',
+ 'smultbeq','smultbne','smultbcs','smultbhs','smultbcc','smultblo','smultbmi','smultbpl','smultbvs','smultbvc','smultbhi','smultbls','smultbge','smultblt','smultbgt','smultble',
+ 'smultteq','smulttne','smulttcs','smultths','smulttcc','smulttlo','smulttmi','smulttpl','smulttvs','smulttvc','smultthi','smulttls','smulttge','smulttlt','smulttgt','smulttle',
+ 'smulwbeq','smulwbne','smulwbcs','smulwbhs','smulwbcc','smulwblo','smulwbmi','smulwbpl','smulwbvs','smulwbvc','smulwbhi','smulwbls','smulwbge','smulwblt','smulwbgt','smulwble',
+ 'smulwteq','smulwtne','smulwtcs','smulwths','smulwtcc','smulwtlo','smulwtmi','smulwtpl','smulwtvs','smulwtvc','smulwthi','smulwtls','smulwtge','smulwtlt','smulwtgt','smulwtle',
+ 'smlalbbeq','smlalbbne','smlalbbcs','smlalbbhs','smlalbbcc','smlalbblo','smlalbbmi','smlalbbpl','smlalbbvs','smlalbbvc','smlalbbhi','smlalbbls','smlalbbge','smlalbblt','smlalbbgt','smlalbble',
+ 'smlalbteq','smlalbtne','smlalbtcs','smlalbths','smlalbtcc','smlalbtlo','smlalbtmi','smlalbtpl','smlalbtvs','smlalbtvc','smlalbthi','smlalbtls','smlalbtge','smlalbtlt','smlalbtgt','smlalbtle',
+ 'smlaltbeq','smlaltbne','smlaltbcs','smlaltbhs','smlaltbcc','smlaltblo','smlaltbmi','smlaltbpl','smlaltbvs','smlaltbvc','smlaltbhi','smlaltbls','smlaltbge','smlaltblt','smlaltbgt','smlaltble',
+ 'smlaltteq','smlalttne','smlalttcs','smlaltths','smlalttcc','smlalttlo','smlalttmi','smlalttpl','smlalttvs','smlalttvc','smlaltthi','smlalttls','smlalttge','smlalttlt','smlalttgt','smlalttle',
+ 'smlabbeq','smlabbne','smlabbcs','smlabbhs','smlabbcc','smlabblo','smlabbmi','smlabbpl','smlabbvs','smlabbvc','smlabbhi','smlabbls','smlabbge','smlabblt','smlabbgt','smlabble',
+ 'smlabteq','smlabtne','smlabtcs','smlabths','smlabtcc','smlabtlo','smlabtmi','smlabtpl','smlabtvs','smlabtvc','smlabthi','smlabtls','smlabtge','smlabtlt','smlabtgt','smlabtle',
+ 'smlatbeq','smlatbne','smlatbcs','smlatbhs','smlatbcc','smlatblo','smlatbmi','smlatbpl','smlatbvs','smlatbvc','smlatbhi','smlatbls','smlatbge','smlatblt','smlatbgt','smlatble',
+ 'smlatteq','smlattne','smlattcs','smlatths','smlattcc','smlattlo','smlattmi','smlattpl','smlattvs','smlattvc','smlatthi','smlattls','smlattge','smlattlt','smlattgt','smlattle',
+ 'smlawbeq','smlawbne','smlawbcs','smlawbhs','smlawbcc','smlawblo','smlawbmi','smlawbpl','smlawbvs','smlawbvc','smlawbhi','smlawbls','smlawbge','smlawblt','smlawbgt','smlawble',
+ 'smlawteq','smlawtne','smlawtcs','smlawths','smlawtcc','smlawtlo','smlawtmi','smlawtpl','smlawtvs','smlawtvc','smlawthi','smlawtls','smlawtge','smlawtlt','smlawtgt','smlawtle',
+ /* Data Processing: Conditional Bit Operations */
+ 'ubfxeq','ubfxne','ubfxcs','ubfxhs','ubfxcc','ubfxlo','ubfxmi','ubfxpl','ubfxvs','ubfxvc','ubfxhi','ubfxls','ubfxge','ubfxlt','ubfxgt','ubfxle',
+ 'sbfxeq','sbfxne','sbfxcs','sbfxhs','sbfxcc','sbfxlo','sbfxmi','sbfxpl','sbfxvs','sbfxvc','sbfxhi','sbfxls','sbfxge','sbfxlt','sbfxgt','sbfxle',
+ 'bfceq','bfcne','bfccs','bfchs','bfccc','bfclo','bfcmi','bfcpl','bfcvs','bfcvc','bfchi','bfcls','bfcge','bfclt','bfcgt','bfcle',
+ 'bfieq','bfine','bfics','bfihs','bficc','bfilo','bfimi','bfipl','bfivs','bfivc','bfihi','bfils','bfige','bfilt','bfigt','bfile',
+ 'clzeq','clzne','clzcs','clzhs','clzcc','clzlo','clzmi','clzpl','clzvs','clzvc','clzhi','clzls','clzge','clzlt','clzgt','clzle',
+ /* ARMv7-R: Conditional Divide */
+ 'sdiveq','sdivne','sdivcs','sdivhs','sdivcc','sdivlo','sdivmi','sdivpl','sdivvs','sdivvc','sdivhi','sdivls','sdivge','sdivlt','sdivgt','sdivle',
+ 'udiveq','udivne','udivcs','udivhs','udivcc','udivlo','udivmi','udivpl','udivvs','udivvc','udivhi','udivls','udivge','udivlt','udivgt','udivle'
+ ),
+ /* Unconditional Memory Access */
+ 3 => array(
+ /* Memory Access: Unconditional Memory Loads and Prefetches */
+ 'ldm.w','ldmal.w',
+ 'ldm','ldmal',
+ 'ldmda','ldmdaal',
+ 'ldmdb','ldmdbal',
+ 'ldmib','ldmibal',
+ 'ldmia','ldmiaal',
+ 'ldmea','ldmeaal',
+ 'ldmed','ldmedal',
+ 'ldmfa','ldmfaal',
+ 'ldmfd','ldmfdal',
+ 'ldrd','ldrdal',
+ 'ldr.w','ldral.w',
+ 'ldr','ldral',
+ 'ldrh.w','ldrhal.w',
+ 'ldrh','ldrhal',
+ 'ldrb.w','ldrbal.w',
+ 'ldrb','ldrbal',
+ 'ldrsh.w','ldrshal.w',
+ 'ldrsh','ldrshal',
+ 'ldrsb.w','ldrsbal.w',
+ 'ldrsb','ldrsbal',
+ 'ldrt','ldrtal',
+ 'ldrht','ldrhtal',
+ 'ldrbt','ldrbtal',
+ 'ldrsht','ldrshtal',
+ 'ldrsbt','ldrsbtal',
+ 'pop.w','popal.w',
+ 'pop','popal',
+ 'pld','pldal',
+ 'pldw','pldwal',
+ 'pli','plial',
+ /* Memory Access: Unconditional Memory Stores */
+ 'stm.w','stmal.w',
+ 'stm','stmal',
+ 'stmda','stmdaal',
+ 'stmdb','stmdbal',
+ 'stmib','stmibal',
+ 'stmia','stmiaal',
+ 'stmea','stmeaal',
+ 'stmed','stmedal',
+ 'stdfa','stdfaal',
+ 'stdfd','stdfdal',
+ 'strd','strdal',
+ 'str.w','stral.w',
+ 'str','stral',
+ 'strh.w','strhal.w',
+ 'strh','strhal',
+ 'strb.w','strbal.w',
+ 'strb','strbal',
+ 'strt','strtal',
+ 'strht','strhtal',
+ 'strbt','strbtal',
+ 'push.w','pushal.w',
+ 'push','pushal'
+ ),
+ /* Conditional Memory Access */
+ 4 => array(
+ /* Memory Access: Conditional Memory Loads and Prefetches */
+ 'ldmeq.w','ldmne.w','ldmcs.w','ldmhs.w','ldmcc.w','ldmlo.w','ldmmi.w','ldmpl.w','ldmvs.w','ldmvc.w','ldmhi.w','ldmls.w','ldmge.w','ldmlt.w','ldmgt.w','ldmle.w',
+ 'ldmeq','ldmne','ldmcs','ldmhs','ldmcc','ldmlo','ldmmi','ldmpl','ldmvs','ldmvc','ldmhi','ldmls','ldmge','ldmlt','ldmgt','ldmle',
+ 'ldmdaeq','ldmdane','ldmdacs','ldmdahs','ldmdacc','ldmdalo','ldmdami','ldmdapl','ldmdavs','ldmdavc','ldmdahi','ldmdals','ldmdage','ldmdalt','ldmdagt','ldmdale',
+ 'ldmdbeq','ldmdbne','ldmdbcs','ldmdbhs','ldmdbcc','ldmdblo','ldmdbmi','ldmdbpl','ldmdbvs','ldmdbvc','ldmdbhi','ldmdbls','ldmdbge','ldmdblt','ldmdbgt','ldmdble',
+ 'ldmibeq','ldmibne','ldmibcs','ldmibhs','ldmibcc','ldmiblo','ldmibmi','ldmibpl','ldmibvs','ldmibvc','ldmibhi','ldmibls','ldmibge','ldmiblt','ldmibgt','ldmible',
+ 'ldmiaeq','ldmiane','ldmiacs','ldmiahs','ldmiacc','ldmialo','ldmiami','ldmiapl','ldmiavs','ldmiavc','ldmiahi','ldmials','ldmiage','ldmialt','ldmiagt','ldmiale',
+ 'ldmeaeq','ldmeane','ldmeacs','ldmeahs','ldmeacc','ldmealo','ldmeami','ldmeapl','ldmeavs','ldmeavc','ldmeahi','ldmeals','ldmeage','ldmealt','ldmeagt','ldmeale',
+ 'ldmedeq','ldmedne','ldmedcs','ldmedhs','ldmedcc','ldmedlo','ldmedmi','ldmedpl','ldmedvs','ldmedvc','ldmedhi','ldmedls','ldmedge','ldmedlt','ldmedgt','ldmedle',
+ 'ldmfaeq','ldmfane','ldmfacs','ldmfahs','ldmfacc','ldmfalo','ldmfami','ldmfapl','ldmfavs','ldmfavc','ldmfahi','ldmfals','ldmfage','ldmfalt','ldmfagt','ldmfale',
+ 'ldmfdeq','ldmfdne','ldmfdcs','ldmfdhs','ldmfdcc','ldmfdlo','ldmfdmi','ldmfdpl','ldmfdvs','ldmfdvc','ldmfdhi','ldmfdls','ldmfdge','ldmfdlt','ldmfdgt','ldmfdle',
+ 'ldrdeq','ldrdne','ldrdcs','ldrdhs','ldrdcc','ldrdlo','ldrdmi','ldrdpl','ldrdvs','ldrdvc','ldrdhi','ldrdls','ldrdge','ldrdlt','ldrdgt','ldrdle',
+ 'ldreq.w','ldrne.w','ldrcs.w','ldrhs.w','ldrcc.w','ldrlo.w','ldrmi.w','ldrpl.w','ldrvs.w','ldrvc.w','ldrhi.w','ldrls.w','ldrge.w','ldrlt.w','ldrgt.w','ldrle.w',
+ 'ldreq','ldrne','ldrcs','ldrhs','ldrcc','ldrlo','ldrmi','ldrpl','ldrvs','ldrvc','ldrhi','ldrls','ldrge','ldrlt','ldrgt','ldrle',
+ 'ldrheq.w','ldrhne.w','ldrhcs.w','ldrhhs.w','ldrhcc.w','ldrhlo.w','ldrhmi.w','ldrhpl.w','ldrhvs.w','ldrhvc.w','ldrhhi.w','ldrhls.w','ldrhge.w','ldrhlt.w','ldrhgt.w','ldrhle.w',
+ 'ldrheq','ldrhne','ldrhcs','ldrhhs','ldrhcc','ldrhlo','ldrhmi','ldrhpl','ldrhvs','ldrhvc','ldrhhi','ldrhls','ldrhge','ldrhlt','ldrhgt','ldrhle',
+ 'ldrbeq.w','ldrbne.w','ldrbcs.w','ldrbhs.w','ldrbcc.w','ldrblo.w','ldrbmi.w','ldrbpl.w','ldrbvs.w','ldrbvc.w','ldrbhi.w','ldrbls.w','ldrbge.w','ldrblt.w','ldrbgt.w','ldrble.w',
+ 'ldrbeq','ldrbne','ldrbcs','ldrbhs','ldrbcc','ldrblo','ldrbmi','ldrbpl','ldrbvs','ldrbvc','ldrbhi','ldrbls','ldrbge','ldrblt','ldrbgt','ldrble',
+ 'ldrsheq.w','ldrshne.w','ldrshcs.w','ldrshhs.w','ldrshcc.w','ldrshlo.w','ldrshmi.w','ldrshpl.w','ldrshvs.w','ldrshvc.w','ldrshhi.w','ldrshls.w','ldrshge.w','ldrshlt.w','ldrshgt.w','ldrshle.w',
+ 'ldrsheq','ldrshne','ldrshcs','ldrshhs','ldrshcc','ldrshlo','ldrshmi','ldrshpl','ldrshvs','ldrshvc','ldrshhi','ldrshls','ldrshge','ldrshlt','ldrshgt','ldrshle',
+ 'ldrsbeq.w','ldrsbne.w','ldrsbcs.w','ldrsbhs.w','ldrsbcc.w','ldrsblo.w','ldrsbmi.w','ldrsbpl.w','ldrsbvs.w','ldrsbvc.w','ldrsbhi.w','ldrsbls.w','ldrsbge.w','ldrsblt.w','ldrsbgt.w','ldrsble.w',
+ 'ldrsbeq','ldrsbne','ldrsbcs','ldrsbhs','ldrsbcc','ldrsblo','ldrsbmi','ldrsbpl','ldrsbvs','ldrsbvc','ldrsbhi','ldrsbls','ldrsbge','ldrsblt','ldrsbgt','ldrsble',
+ 'ldrteq','ldrtne','ldrtcs','ldrths','ldrtcc','ldrtlo','ldrtmi','ldrtpl','ldrtvs','ldrtvc','ldrthi','ldrtls','ldrtge','ldrtlt','ldrtgt','ldrtle',
+ 'ldrhteq','ldrhtne','ldrhtcs','ldrhths','ldrhtcc','ldrhtlo','ldrhtmi','ldrhtpl','ldrhtvs','ldrhtvc','ldrhthi','ldrhtls','ldrhtge','ldrhtlt','ldrhtgt','ldrhtle',
+ 'ldrbteq','ldrbtne','ldrbtcs','ldrbths','ldrbtcc','ldrbtlo','ldrbtmi','ldrbtpl','ldrbtvs','ldrbtvc','ldrbthi','ldrbtls','ldrbtge','ldrbtlt','ldrbtgt','ldrbtle',
+ 'ldrshteq','ldrshtne','ldrshtcs','ldrshths','ldrshtcc','ldrshtlo','ldrshtmi','ldrshtpl','ldrshtvs','ldrshtvc','ldrshthi','ldrshtls','ldrshtge','ldrshtlt','ldrshtgt','ldrshtle',
+ 'ldrsbteq','ldrsbtne','ldrsbtcs','ldrsbths','ldrsbtcc','ldrsbtlo','ldrsbtmi','ldrsbtpl','ldrsbtvs','ldrsbtvc','ldrsbthi','ldrsbtls','ldrsbtge','ldrsbtlt','ldrsbtgt','ldrsbtle',
+ 'popeq.w','popne.w','popcs.w','pophs.w','popcc.w','poplo.w','popmi.w','poppl.w','popvs.w','popvc.w','pophi.w','popls.w','popge.w','poplt.w','popgt.w','pople.w',
+ 'popeq','popne','popcs','pophs','popcc','poplo','popmi','poppl','popvs','popvc','pophi','popls','popge','poplt','popgt','pople',
+ 'pldeq','pldne','pldcs','pldhs','pldcc','pldlo','pldmi','pldpl','pldvs','pldvc','pldhi','pldls','pldge','pldlt','pldgt','pldle',
+ 'pldweq','pldwne','pldwcs','pldwhs','pldwcc','pldwlo','pldwmi','pldwpl','pldwvs','pldwvc','pldwhi','pldwls','pldwge','pldwlt','pldwgt','pldwle',
+ 'plieq','pline','plics','plihs','plicc','plilo','plimi','plipl','plivs','plivc','plihi','plils','plige','plilt','pligt','plile',
+ /* Memory Access: Conditional Memory Stores */
+ 'stmeq.w','stmne.w','stmcs.w','stmhs.w','stmcc.w','stmlo.w','stmmi.w','stmpl.w','stmvs.w','stmvc.w','stmhi.w','stmls.w','stmge.w','stmlt.w','stmgt.w','stmle.w',
+ 'stmeq','stmne','stmcs','stmhs','stmcc','stmlo','stmmi','stmpl','stmvs','stmvc','stmhi','stmls','stmge','stmlt','stmgt','stmle',
+ 'stmdaeq','stmdane','stmdacs','stmdahs','stmdacc','stmdalo','stmdami','stmdapl','stmdavs','stmdavc','stmdahi','stmdals','stmdage','stmdalt','stmdagt','stmdale',
+ 'stmdbeq','stmdbne','stmdbcs','stmdbhs','stmdbcc','stmdblo','stmdbmi','stmdbpl','stmdbvs','stmdbvc','stmdbhi','stmdbls','stmdbge','stmdblt','stmdbgt','stmdble',
+ 'stmibeq','stmibne','stmibcs','stmibhs','stmibcc','stmiblo','stmibmi','stmibpl','stmibvs','stmibvc','stmibhi','stmibls','stmibge','stmiblt','stmibgt','stmible',
+ 'stmiaeq','stmiane','stmiacs','stmiahs','stmiacc','stmialo','stmiami','stmiapl','stmiavs','stmiavc','stmiahi','stmials','stmiage','stmialt','stmiagt','stmiale',
+ 'stmeaeq','stmeane','stmeacs','stmeahs','stmeacc','stmealo','stmeami','stmeapl','stmeavs','stmeavc','stmeahi','stmeals','stmeage','stmealt','stmeagt','stmeale',
+ 'stmedeq','stmedne','stmedcs','stmedhs','stmedcc','stmedlo','stmedmi','stmedpl','stmedvs','stmedvc','stmedhi','stmedls','stmedge','stmedlt','stmedgt','stmedle',
+ 'stdfaeq','stdfane','stdfacs','stdfahs','stdfacc','stdfalo','stdfami','stdfapl','stdfavs','stdfavc','stdfahi','stdfals','stdfage','stdfalt','stdfagt','stdfale',
+ 'stdfdeq','stdfdne','stdfdcs','stdfdhs','stdfdcc','stdfdlo','stdfdmi','stdfdpl','stdfdvs','stdfdvc','stdfdhi','stdfdls','stdfdge','stdfdlt','stdfdgt','stdfdle',
+ 'strdeq','strdne','strdcs','strdhs','strdcc','strdlo','strdmi','strdpl','strdvs','strdvc','strdhi','strdls','strdge','strdlt','strdgt','strdle',
+ 'streq.w','strne.w','strcs.w','strhs.w','strcc.w','strlo.w','strmi.w','strpl.w','strvs.w','strvc.w','strhi.w','strls.w','strge.w','strlt.w','strgt.w','strle.w',
+ 'streq','strne','strcs','strhs','strcc','strlo','strmi','strpl','strvs','strvc','strhi','strls','strge','strlt','strgt','strle',
+ 'strheq.w','strhne.w','strhcs.w','strhhs.w','strhcc.w','strhlo.w','strhmi.w','strhpl.w','strhvs.w','strhvc.w','strhhi.w','strhls.w','strhge.w','strhlt.w','strhgt.w','strhle.w',
+ 'strheq','strhne','strhcs','strhhs','strhcc','strhlo','strhmi','strhpl','strhvs','strhvc','strhhi','strhls','strhge','strhlt','strhgt','strhle',
+ 'strbeq.w','strbne.w','strbcs.w','strbhs.w','strbcc.w','strblo.w','strbmi.w','strbpl.w','strbvs.w','strbvc.w','strbhi.w','strbls.w','strbge.w','strblt.w','strbgt.w','strble.w',
+ 'strbeq','strbne','strbcs','strbhs','strbcc','strblo','strbmi','strbpl','strbvs','strbvc','strbhi','strbls','strbge','strblt','strbgt','strble',
+ 'strteq','strtne','strtcs','strths','strtcc','strtlo','strtmi','strtpl','strtvs','strtvc','strthi','strtls','strtge','strtlt','strtgt','strtle',
+ 'strhteq','strhtne','strhtcs','strhths','strhtcc','strhtlo','strhtmi','strhtpl','strhtvs','strhtvc','strhthi','strhtls','strhtge','strhtlt','strhtgt','strhtle',
+ 'strbteq','strbtne','strbtcs','strbths','strbtcc','strbtlo','strbtmi','strbtpl','strbtvs','strbtvc','strbthi','strbtls','strbtge','strbtlt','strbtgt','strbtle',
+ 'pusheq.w','pushne.w','pushcs.w','pushhs.w','pushcc.w','pushlo.w','pushmi.w','pushpl.w','pushvs.w','pushvc.w','pushhi.w','pushls.w','pushge.w','pushlt.w','pushgt.w','pushle.w',
+ 'pusheq','pushne','pushcs','pushhs','pushcc','pushlo','pushmi','pushpl','pushvs','pushvc','pushhi','pushls','pushge','pushlt','pushgt','pushle'
+ ),
+ /* Unconditional Flags-Affecting Instructions */
+ 5 => array(
+ /* Set Flags: Unconditional Addition and Subtraction */
+ 'adds.w','addsal.w',
+ 'adds','addsal',
+ 'subs.w','subsal.w',
+ 'subs','subsal',
+ 'rsbs.w','rsbsal.w',
+ 'rsbs','rsbsal',
+ 'negs.w','negsal.w',
+ 'negs','negsal',
+ 'adcs.w','adcsal.w',
+ 'adcs','adcsal',
+ 'sbcs.w','sbcsal.w',
+ 'sbcs','sbcsal',
+ 'rscs','rscsal',
+ 'cmp.w','cmpal.w',
+ 'cmp','cmpal',
+ 'cmn.w','cmnal.w',
+ 'cmn','cmnal',
+ /* Set Flags: Unconditional Logical */
+ 'ands.w','andsal.w',
+ 'ands','andsal',
+ 'bics.w','bicsal.w',
+ 'bics','bicsal',
+ 'orrs.w','orrsal.w',
+ 'orrs','orrsal',
+ 'orns.w','ornsal.w',
+ 'orns','ornsal',
+ 'eors.w','eorsal.w',
+ 'eors','eorsal',
+ 'mvns.w','mvnsal.w',
+ 'mvns','mvnsal',
+ 'movs.w','movsal.w',
+ 'movs','movsal',
+ 'teq','teqal',
+ 'tst.w','tstal.w',
+ 'tst','tstal',
+ 'mrs','mrsal',
+ 'msr','msral',
+ /* Set Flags: Unconditional Shifts and Rotates */
+ 'asrs.w','asrsal.w',
+ 'asrs','asrsal',
+ 'lsls.w','lslsal.w',
+ 'lsls','lslsal',
+ 'lsrs.w','lsrsal.w',
+ 'lsrs','lsrsal',
+ 'rors.w','rorsal.w',
+ 'rors','rorsal',
+ 'rrxs','rrxsal',
+ /* Set Flags: Unconditional Multiply and Multiply-Add */
+ 'mlas','mlasal',
+ 'smulls','smullsal',
+ 'umulls','umullsal',
+ 'smlals','smlalsal',
+ 'umlals','umlalsal'
+ ),
+ /* Conditional Flags-Affecting Instructions */
+ 6 => array(
+ /* Set Flags: Conditional Addition and Subtraction */
+ 'addseq.w','addsne.w','addscs.w','addshs.w','addscc.w','addslo.w','addsmi.w','addspl.w','addsvs.w','addsvc.w','addshi.w','addsls.w','addsge.w','addslt.w','addsgt.w','addsle.w',
+ 'addseq','addsne','addscs','addshs','addscc','addslo','addsmi','addspl','addsvs','addsvc','addshi','addsls','addsge','addslt','addsgt','addsle',
+ 'subseq.w','subsne.w','subscs.w','subshs.w','subscc.w','subslo.w','subsmi.w','subspl.w','subsvs.w','subsvc.w','subshi.w','subsls.w','subsge.w','subslt.w','subsgt.w','subsle.w',
+ 'subseq','subsne','subscs','subshs','subscc','subslo','subsmi','subspl','subsvs','subsvc','subshi','subsls','subsge','subslt','subsgt','subsle',
+ 'rsbseq.w','rsbsne.w','rsbscs.w','rsbshs.w','rsbscc.w','rsbslo.w','rsbsmi.w','rsbspl.w','rsbsvs.w','rsbsvc.w','rsbshi.w','rsbsls.w','rsbsge.w','rsbslt.w','rsbsgt.w','rsbsle.w',
+ 'rsbseq','rsbsne','rsbscs','rsbshs','rsbscc','rsbslo','rsbsmi','rsbspl','rsbsvs','rsbsvc','rsbshi','rsbsls','rsbsge','rsbslt','rsbsgt','rsbsle',
+ 'negseq.w','negsne.w','negscs.w','negshs.w','negscc.w','negslo.w','negsmi.w','negspl.w','negsvs.w','negsvc.w','negshi.w','negsls.w','negsge.w','negslt.w','negsgt.w','negsle.w',
+ 'negseq','negsne','negscs','negshs','negscc','negslo','negsmi','negspl','negsvs','negsvc','negshi','negsls','negsge','negslt','negsgt','negsle',
+ 'adcseq.w','adcsne.w','adcscs.w','adcshs.w','adcscc.w','adcslo.w','adcsmi.w','adcspl.w','adcsvs.w','adcsvc.w','adcshi.w','adcsls.w','adcsge.w','adcslt.w','adcsgt.w','adcsle.w',
+ 'adcseq','adcsne','adcscs','adcshs','adcscc','adcslo','adcsmi','adcspl','adcsvs','adcsvc','adcshi','adcsls','adcsge','adcslt','adcsgt','adcsle',
+ 'sbcseq.w','sbcsne.w','sbcscs.w','sbcshs.w','sbcscc.w','sbcslo.w','sbcsmi.w','sbcspl.w','sbcsvs.w','sbcsvc.w','sbcshi.w','sbcsls.w','sbcsge.w','sbcslt.w','sbcsgt.w','sbcsle.w',
+ 'sbcseq','sbcsne','sbcscs','sbcshs','sbcscc','sbcslo','sbcsmi','sbcspl','sbcsvs','sbcsvc','sbcshi','sbcsls','sbcsge','sbcslt','sbcsgt','sbcsle',
+ 'rscseq','rscsne','rscscs','rscshs','rscscc','rscslo','rscsmi','rscspl','rscsvs','rscsvc','rscshi','rscsls','rscsge','rscslt','rscsgt','rscsle',
+ 'cmpeq.w','cmpne.w','cmpcs.w','cmphs.w','cmpcc.w','cmplo.w','cmpmi.w','cmppl.w','cmpvs.w','cmpvc.w','cmphi.w','cmpls.w','cmpge.w','cmplt.w','cmpgt.w','cmple.w',
+ 'cmpeq','cmpne','cmpcs','cmphs','cmpcc','cmplo','cmpmi','cmppl','cmpvs','cmpvc','cmphi','cmpls','cmpge','cmplt','cmpgt','cmple',
+ 'cmneq.w','cmnne.w','cmncs.w','cmnhs.w','cmncc.w','cmnlo.w','cmnmi.w','cmnpl.w','cmnvs.w','cmnvc.w','cmnhi.w','cmnls.w','cmnge.w','cmnlt.w','cmngt.w','cmnle.w',
+ 'cmneq','cmnne','cmncs','cmnhs','cmncc','cmnlo','cmnmi','cmnpl','cmnvs','cmnvc','cmnhi','cmnls','cmnge','cmnlt','cmngt','cmnle',
+ /* Set Flags: Conditional Logical */
+ 'andseq.w','andsne.w','andscs.w','andshs.w','andscc.w','andslo.w','andsmi.w','andspl.w','andsvs.w','andsvc.w','andshi.w','andsls.w','andsge.w','andslt.w','andsgt.w','andsle.w',
+ 'andseq','andsne','andscs','andshs','andscc','andslo','andsmi','andspl','andsvs','andsvc','andshi','andsls','andsge','andslt','andsgt','andsle',
+ 'bicseq.w','bicsne.w','bicscs.w','bicshs.w','bicscc.w','bicslo.w','bicsmi.w','bicspl.w','bicsvs.w','bicsvc.w','bicshi.w','bicsls.w','bicsge.w','bicslt.w','bicsgt.w','bicsle.w',
+ 'bicseq','bicsne','bicscs','bicshs','bicscc','bicslo','bicsmi','bicspl','bicsvs','bicsvc','bicshi','bicsls','bicsge','bicslt','bicsgt','bicsle',
+ 'orrseq.w','orrsne.w','orrscs.w','orrshs.w','orrscc.w','orrslo.w','orrsmi.w','orrspl.w','orrsvs.w','orrsvc.w','orrshi.w','orrsls.w','orrsge.w','orrslt.w','orrsgt.w','orrsle.w',
+ 'orrseq','orrsne','orrscs','orrshs','orrscc','orrslo','orrsmi','orrspl','orrsvs','orrsvc','orrshi','orrsls','orrsge','orrslt','orrsgt','orrsle',
+ 'ornseq.w','ornsne.w','ornscs.w','ornshs.w','ornscc.w','ornslo.w','ornsmi.w','ornspl.w','ornsvs.w','ornsvc.w','ornshi.w','ornsls.w','ornsge.w','ornslt.w','ornsgt.w','ornsle.w',
+ 'ornseq','ornsne','ornscs','ornshs','ornscc','ornslo','ornsmi','ornspl','ornsvs','ornsvc','ornshi','ornsls','ornsge','ornslt','ornsgt','ornsle',
+ 'eorseq.w','eorsne.w','eorscs.w','eorshs.w','eorscc.w','eorslo.w','eorsmi.w','eorspl.w','eorsvs.w','eorsvc.w','eorshi.w','eorsls.w','eorsge.w','eorslt.w','eorsgt.w','eorsle.w',
+ 'eorseq','eorsne','eorscs','eorshs','eorscc','eorslo','eorsmi','eorspl','eorsvs','eorsvc','eorshi','eorsls','eorsge','eorslt','eorsgt','eorsle',
+ 'mvnseq.w','mvnsne.w','mvnscs.w','mvnshs.w','mvnscc.w','mvnslo.w','mvnsmi.w','mvnspl.w','mvnsvs.w','mvnsvc.w','mvnshi.w','mvnsls.w','mvnsge.w','mvnslt.w','mvnsgt.w','mvnsle.w',
+ 'mvnseq','mvnsne','mvnscs','mvnshs','mvnscc','mvnslo','mvnsmi','mvnspl','mvnsvs','mvnsvc','mvnshi','mvnsls','mvnsge','mvnslt','mvnsgt','mvnsle',
+ 'movseq.w','movsne.w','movscs.w','movshs.w','movscc.w','movslo.w','movsmi.w','movspl.w','movsvs.w','movsvc.w','movshi.w','movsls.w','movsge.w','movslt.w','movsgt.w','movsle.w',
+ 'movseq','movsne','movscs','movshs','movscc','movslo','movsmi','movspl','movsvs','movsvc','movshi','movsls','movsge','movslt','movsgt','movsle',
+ 'teqeq','teqne','teqcs','teqhs','teqcc','teqlo','teqmi','teqpl','teqvs','teqvc','teqhi','teqls','teqge','teqlt','teqgt','teqle',
+ 'tsteq.w','tstne.w','tstcs.w','tsths.w','tstcc.w','tstlo.w','tstmi.w','tstpl.w','tstvs.w','tstvc.w','tsthi.w','tstls.w','tstge.w','tstlt.w','tstgt.w','tstle.w',
+ 'tsteq','tstne','tstcs','tsths','tstcc','tstlo','tstmi','tstpl','tstvs','tstvc','tsthi','tstls','tstge','tstlt','tstgt','tstle',
+ 'mrseq','mrsne','mrscs','mrshs','mrscc','mrslo','mrsmi','mrspl','mrsvs','mrsvc','mrshi','mrsls','mrsge','mrslt','mrsgt','mrsle',
+ 'msreq','msrne','msrcs','msrhs','msrcc','msrlo','msrmi','msrpl','msrvs','msrvc','msrhi','msrls','msrge','msrlt','msrgt','msrle',
+ /* Set Flags: Conditional Shifts and Rotates */
+ 'asrseq.w','asrsne.w','asrscs.w','asrshs.w','asrscc.w','asrslo.w','asrsmi.w','asrspl.w','asrsvs.w','asrsvc.w','asrshi.w','asrsls.w','asrsge.w','asrslt.w','asrsgt.w','asrsle.w',
+ 'asrseq','asrsne','asrscs','asrshs','asrscc','asrslo','asrsmi','asrspl','asrsvs','asrsvc','asrshi','asrsls','asrsge','asrslt','asrsgt','asrsle',
+ 'lslseq.w','lslsne.w','lslscs.w','lslshs.w','lslscc.w','lslslo.w','lslsmi.w','lslspl.w','lslsvs.w','lslsvc.w','lslshi.w','lslsls.w','lslsge.w','lslslt.w','lslsgt.w','lslsle.w',
+ 'lslseq','lslsne','lslscs','lslshs','lslscc','lslslo','lslsmi','lslspl','lslsvs','lslsvc','lslshi','lslsls','lslsge','lslslt','lslsgt','lslsle',
+ 'lsrseq.w','lsrsne.w','lsrscs.w','lsrshs.w','lsrscc.w','lsrslo.w','lsrsmi.w','lsrspl.w','lsrsvs.w','lsrsvc.w','lsrshi.w','lsrsls.w','lsrsge.w','lsrslt.w','lsrsgt.w','lsrsle.w',
+ 'lsrseq','lsrsne','lsrscs','lsrshs','lsrscc','lsrslo','lsrsmi','lsrspl','lsrsvs','lsrsvc','lsrshi','lsrsls','lsrsge','lsrslt','lsrsgt','lsrsle',
+ 'rorseq.w','rorsne.w','rorscs.w','rorshs.w','rorscc.w','rorslo.w','rorsmi.w','rorspl.w','rorsvs.w','rorsvc.w','rorshi.w','rorsls.w','rorsge.w','rorslt.w','rorsgt.w','rorsle.w',
+ 'rorseq','rorsne','rorscs','rorshs','rorscc','rorslo','rorsmi','rorspl','rorsvs','rorsvc','rorshi','rorsls','rorsge','rorslt','rorsgt','rorsle',
+ 'rrxseq','rrxsne','rrxscs','rrxshs','rrxscc','rrxslo','rrxsmi','rrxspl','rrxsvs','rrxsvc','rrxshi','rrxsls','rrxsge','rrxslt','rrxsgt','rrxsle',
+ /* Set Flags: Conditional Multiply and Multiply-Add */
+ 'mlaseq','mlasne','mlascs','mlashs','mlascc','mlaslo','mlasmi','mlaspl','mlasvs','mlasvc','mlashi','mlasls','mlasge','mlaslt','mlasgt','mlasle',
+ 'smullseq','smullsne','smullscs','smullshs','smullscc','smullslo','smullsmi','smullspl','smullsvs','smullsvc','smullshi','smullsls','smullsge','smullslt','smullsgt','smullsle',
+ 'umullseq','umullsne','umullscs','umullshs','umullscc','umullslo','umullsmi','umullspl','umullsvs','umullsvc','umullshi','umullsls','umullsge','umullslt','umullsgt','umullsle',
+ 'smlalseq','smlalsne','smlalscs','smlalshs','smlalscc','smlalslo','smlalsmi','smlalspl','smlalsvs','smlalsvc','smlalshi','smlalsls','smlalsge','smlalslt','smlalsgt','smlalsle',
+ 'umlalseq','umlalsne','umlalscs','umlalshs','umlalscc','umlalslo','umlalsmi','umlalspl','umlalsvs','umlalsvc','umlalshi','umlalsls','umlalsge','umlalslt','umlalsgt','umlalsle'
+ ),
+ /* Unconditional Flow Control Instructions */
+ 7 => array(
+ /* Flow Control: Unconditional Branch and If-Then-Else */
+ 'b.w','bal.w',
+ 'b','bal',
+ 'bl','blal',
+ 'bx','bxal',
+ 'blx','blxal',
+ 'bxj','bxjal',
+ 'cbnz',
+ 'cbz',
+ 'tbb','tbbal',
+ 'tbh','tbhal',
+ 'it',
+ 'itt',
+ 'ite',
+ 'ittt',
+ 'itet',
+ 'itte',
+ 'itee',
+ 'itttt',
+ 'itett',
+ 'ittet',
+ 'iteet',
+ 'ittte',
+ 'itete',
+ 'ittee',
+ 'iteee'
+ ),
+ /* Conditional Flow Control Instructions */
+ 8 => array(
+ /* Flow Control: Conditional Branch and If-Then-Else */
+ 'beq.w','bne.w','bcs.w','bhs.w','bcc.w','blo.w','bmi.w','bpl.w','bvs.w','bvc.w','bhi.w','bls.w','bge.w','blt.w','bgt.w','ble.w',
+ 'beq','bne','bcs','bhs','bcc','blo','bmi','bpl','bvs','bvc','bhi','bls','bge','blt','bgt','ble',
+ 'bleq','blne','blcs','blhs','blcc','bllo','blmi','blpl','blvs','blvc','blhi','blls','blge','bllt','blgt','blle',
+ 'bxeq','bxne','bxcs','bxhs','bxcc','bxlo','bxmi','bxpl','bxvs','bxvc','bxhi','bxls','bxge','bxlt','bxgt','bxle',
+ 'blxeq','blxne','blxcs','blxhs','blxcc','blxlo','blxmi','blxpl','blxvs','blxvc','blxhi','blxls','blxge','blxlt','blxgt','blxle',
+ 'bxjeq','bxjne','bxjcs','bxjhs','bxjcc','bxjlo','bxjmi','bxjpl','bxjvs','bxjvc','bxjhi','bxjls','bxjge','bxjlt','bxjgt','bxjle',
+ 'tbbeq','tbbne','tbbcs','tbbhs','tbbcc','tbblo','tbbmi','tbbpl','tbbvs','tbbvc','tbbhi','tbbls','tbbge','tbblt','tbbgt','tbble',
+ 'tbheq','tbhne','tbhcs','tbhhs','tbhcc','tbhlo','tbhmi','tbhpl','tbhvs','tbhvc','tbhhi','tbhls','tbhge','tbhlt','tbhgt','tbhle'
+ ),
+ /* Unconditional Syncronization Instructions */
+ 9 => array(
+ /* Synchronization: Unconditional Loads, Stores and Barriers */
+ 'ldrexd','ldrexdal',
+ 'ldrex','ldrexal',
+ 'ldrexh','ldrexhal',
+ 'ldrexb','ldrexbal',
+ 'strexd','strexdal',
+ 'strex','strexal',
+ 'strexh','strexhal',
+ 'strexb','strexbal',
+ 'clrex','clrexal',
+ 'swp','swpal',
+ 'swpb','swpbal',
+ 'dbc','dbcal',
+ 'dsb','dsbal',
+ 'isb','isbal',
+ 'yield.w','yieldal.w',
+ 'yield','yieldal',
+ 'nop.w','nopal.w',
+ 'nop','nopal'
+ ),
+ /* Conditional Syncronization Instructions */
+ 10 => array(
+ /* Synchronization: Conditional Loads, Stores and Barriers */
+ 'ldrexdeq','ldrexdne','ldrexdcs','ldrexdhs','ldrexdcc','ldrexdlo','ldrexdmi','ldrexdpl','ldrexdvs','ldrexdvc','ldrexdhi','ldrexdls','ldrexdge','ldrexdlt','ldrexdgt','ldrexdle',
+ 'ldrexeq','ldrexne','ldrexcs','ldrexhs','ldrexcc','ldrexlo','ldrexmi','ldrexpl','ldrexvs','ldrexvc','ldrexhi','ldrexls','ldrexge','ldrexlt','ldrexgt','ldrexle',
+ 'ldrexheq','ldrexhne','ldrexhcs','ldrexhhs','ldrexhcc','ldrexhlo','ldrexhmi','ldrexhpl','ldrexhvs','ldrexhvc','ldrexhhi','ldrexhls','ldrexhge','ldrexhlt','ldrexhgt','ldrexhle',
+ 'ldrexbeq','ldrexbne','ldrexbcs','ldrexbhs','ldrexbcc','ldrexblo','ldrexbmi','ldrexbpl','ldrexbvs','ldrexbvc','ldrexbhi','ldrexbls','ldrexbge','ldrexblt','ldrexbgt','ldrexble',
+ 'strexdeq','strexdne','strexdcs','strexdhs','strexdcc','strexdlo','strexdmi','strexdpl','strexdvs','strexdvc','strexdhi','strexdls','strexdge','strexdlt','strexdgt','strexdle',
+ 'strexeq','strexne','strexcs','strexhs','strexcc','strexlo','strexmi','strexpl','strexvs','strexvc','strexhi','strexls','strexge','strexlt','strexgt','strexle',
+ 'strexheq','strexhne','strexhcs','strexhhs','strexhcc','strexhlo','strexhmi','strexhpl','strexhvs','strexhvc','strexhhi','strexhls','strexhge','strexhlt','strexhgt','strexhle',
+ 'strexbeq','strexbne','strexbcs','strexbhs','strexbcc','strexblo','strexbmi','strexbpl','strexbvs','strexbvc','strexbhi','strexbls','strexbge','strexblt','strexbgt','strexble',
+ 'clrexeq','clrexne','clrexcs','clrexhs','clrexcc','clrexlo','clrexmi','clrexpl','clrexvs','clrexvc','clrexhi','clrexls','clrexge','clrexlt','clrexgt','clrexle',
+ 'swpeq','swpne','swpcs','swphs','swpcc','swplo','swpmi','swppl','swpvs','swpvc','swphi','swpls','swpge','swplt','swpgt','swple',
+ 'swpbeq','swpbne','swpbcs','swpbhs','swpbcc','swpblo','swpbmi','swpbpl','swpbvs','swpbvc','swpbhi','swpbls','swpbge','swpblt','swpbgt','swpble',
+ 'dbceq','dbcne','dbccs','dbchs','dbccc','dbclo','dbcmi','dbcpl','dbcvs','dbcvc','dbchi','dbcls','dbcge','dbclt','dbcgt','dbcle',
+ 'dsbeq','dsbne','dsbcs','dsbhs','dsbcc','dsblo','dsbmi','dsbpl','dsbvs','dsbvc','dsbhi','dsbls','dsbge','dsblt','dsbgt','dsble',
+ 'isbeq','isbne','isbcs','isbhs','isbcc','isblo','isbmi','isbpl','isbvs','isbvc','isbhi','isbls','isbge','isblt','isbgt','isble',
+ 'yieldeq.w','yieldne.w','yieldcs.w','yieldhs.w','yieldcc.w','yieldlo.w','yieldmi.w','yieldpl.w','yieldvs.w','yieldvc.w','yieldhi.w','yieldls.w','yieldge.w','yieldlt.w','yieldgt.w','yieldle.w',
+ 'yieldeq','yieldne','yieldcs','yieldhs','yieldcc','yieldlo','yieldmi','yieldpl','yieldvs','yieldvc','yieldhi','yieldls','yieldge','yieldlt','yieldgt','yieldle',
+ 'nopeq.w','nopne.w','nopcs.w','nophs.w','nopcc.w','noplo.w','nopmi.w','noppl.w','nopvs.w','nopvc.w','nophi.w','nopls.w','nopge.w','noplt.w','nopgt.w','nople.w',
+ 'nopeq','nopne','nopcs','nophs','nopcc','noplo','nopmi','noppl','nopvs','nopvc','nophi','nopls','nopge','noplt','nopgt','nople'
+ ),
+ /* Unconditional ARMv6 SIMD */
+ 11 => array(
+ /* ARMv6 SIMD: Unconditional Addition, Subtraction & Saturation */
+ 'sadd16','sadd16al',
+ 'sadd8','sadd8al',
+ 'uadd16','uadd16al',
+ 'uadd8','uadd8al',
+ 'ssub16','ssub16al',
+ 'ssub8','ssub8al',
+ 'usub16','usub16al',
+ 'usub8','usub8al',
+ 'sasx','sasxal',
+ 'ssax','ssaxal',
+ 'uasx','uasxal',
+ 'usax','usaxal',
+ 'usad8','usad8al',
+ 'usada8','usada8al',
+ /* ARMv6 SIMD: Unconditional Halving Addition & Subtraction */
+ 'shadd16','shadd16al',
+ 'shadd8','shadd8al',
+ 'uhadd16','uhadd16al',
+ 'uhadd8','uhadd8al',
+ 'shsub16','shsub16al',
+ 'shsub8','shsub8al',
+ 'uhsub16','uhsub16al',
+ 'uhsub8','uhsub8al',
+ 'shasx','shasxal',
+ 'shsax','shsaxal',
+ 'uhasx','uhasxal',
+ 'uhsax','uhsaxal',
+ /* ARMv6 SIMD: Unconditional Saturating Operations */
+ 'qadd','qaddal',
+ 'qadd16','qadd16al',
+ 'qadd8','qadd8al',
+ 'uqadd16','uqadd16al',
+ 'uqadd8','uqadd8al',
+ 'qsub','qsubal',
+ 'qsub16','qsub16al',
+ 'qsub8','qsub8al',
+ 'uqsub16','uqsub16al',
+ 'uqsub8','uqsub8al',
+ 'qasx','qasxal',
+ 'qsax','qsaxal',
+ 'uqasx','uqasxal',
+ 'uqsax','uqsaxal',
+ 'qdadd','qdaddal',
+ 'qdsub','qdsubal',
+ 'ssat','ssatal',
+ 'ssat16','ssat16al',
+ 'usat','usatal',
+ 'usat16','usat16al',
+ /* ARMv6 SIMD: Unconditional Permutation and Combine Operations */
+ 'sxtah','sxtahal',
+ 'sxtab','sxtabal',
+ 'sxtab16','sxtab16al',
+ 'uxtah','uxtahal',
+ 'uxtab','uxtabal',
+ 'uxtab16','uxtab16al',
+ 'sxth.w','sxthal.w',
+ 'sxth','sxthal',
+ 'sxtb.w','sxtbal.w',
+ 'sxtb','sxtbal',
+ 'sxtb16','sxtb16al',
+ 'uxth.w','uxthal.w',
+ 'uxth','uxthal',
+ 'uxtb.w','uxtbal.w',
+ 'uxtb','uxtbal',
+ 'uxtb16','uxtb16al',
+ 'pkhbt','pkhbtal',
+ 'pkhtb','pkhtbal',
+ 'rbit','rbital',
+ 'rev.w','reval.w',
+ 'rev','reval',
+ 'rev16.w','rev16al.w',
+ 'rev16','rev16al',
+ 'revsh.w','revshal.w',
+ 'revsh','revshal',
+ 'sel','selal',
+ /* ARMv6 SIMD: Unconditional Multiply and Multiply-Add */
+ 'smlad','smladal',
+ 'smladx','smladxal',
+ 'smlsd','smlsdal',
+ 'smlsdx','smlsdxal',
+ 'smlald','smlaldal',
+ 'smlaldx','smlaldxal',
+ 'smlsld','smlsldal',
+ 'smlsldx','smlsldxal',
+ 'smmul','smmulal',
+ 'smmulr','smmulral',
+ 'smmla','smmlaal',
+ 'smmlar','smmlaral',
+ 'smmls','smmlsal',
+ 'smmlsr','smmlsral',
+ 'smuad','smuadal',
+ 'smuadx','smuadxal',
+ 'smusd','smusdal',
+ 'smusdx','smusdxal',
+ 'umaal','umaalal'
+ ),
+ /* Conditional ARMv6 SIMD */
+ 12 => array(
+ /* ARMv6 SIMD: Conditional Addition, Subtraction & Saturation */
+ 'sadd16eq','sadd16ne','sadd16cs','sadd16hs','sadd16cc','sadd16lo','sadd16mi','sadd16pl','sadd16vs','sadd16vc','sadd16hi','sadd16ls','sadd16ge','sadd16lt','sadd16gt','sadd16le',
+ 'sadd8eq','sadd8ne','sadd8cs','sadd8hs','sadd8cc','sadd8lo','sadd8mi','sadd8pl','sadd8vs','sadd8vc','sadd8hi','sadd8ls','sadd8ge','sadd8lt','sadd8gt','sadd8le',
+ 'uadd16eq','uadd16ne','uadd16cs','uadd16hs','uadd16cc','uadd16lo','uadd16mi','uadd16pl','uadd16vs','uadd16vc','uadd16hi','uadd16ls','uadd16ge','uadd16lt','uadd16gt','uadd16le',
+ 'uadd8eq','uadd8ne','uadd8cs','uadd8hs','uadd8cc','uadd8lo','uadd8mi','uadd8pl','uadd8vs','uadd8vc','uadd8hi','uadd8ls','uadd8ge','uadd8lt','uadd8gt','uadd8le',
+ 'ssub16eq','ssub16ne','ssub16cs','ssub16hs','ssub16cc','ssub16lo','ssub16mi','ssub16pl','ssub16vs','ssub16vc','ssub16hi','ssub16ls','ssub16ge','ssub16lt','ssub16gt','ssub16le',
+ 'ssub8eq','ssub8ne','ssub8cs','ssub8hs','ssub8cc','ssub8lo','ssub8mi','ssub8pl','ssub8vs','ssub8vc','ssub8hi','ssub8ls','ssub8ge','ssub8lt','ssub8gt','ssub8le',
+ 'usub16eq','usub16ne','usub16cs','usub16hs','usub16cc','usub16lo','usub16mi','usub16pl','usub16vs','usub16vc','usub16hi','usub16ls','usub16ge','usub16lt','usub16gt','usub16le',
+ 'usub8eq','usub8ne','usub8cs','usub8hs','usub8cc','usub8lo','usub8mi','usub8pl','usub8vs','usub8vc','usub8hi','usub8ls','usub8ge','usub8lt','usub8gt','usub8le',
+ 'sasxeq','sasxne','sasxcs','sasxhs','sasxcc','sasxlo','sasxmi','sasxpl','sasxvs','sasxvc','sasxhi','sasxls','sasxge','sasxlt','sasxgt','sasxle',
+ 'ssaxeq','ssaxne','ssaxcs','ssaxhs','ssaxcc','ssaxlo','ssaxmi','ssaxpl','ssaxvs','ssaxvc','ssaxhi','ssaxls','ssaxge','ssaxlt','ssaxgt','ssaxle',
+ 'uasxeq','uasxne','uasxcs','uasxhs','uasxcc','uasxlo','uasxmi','uasxpl','uasxvs','uasxvc','uasxhi','uasxls','uasxge','uasxlt','uasxgt','uasxle',
+ 'usaxeq','usaxne','usaxcs','usaxhs','usaxcc','usaxlo','usaxmi','usaxpl','usaxvs','usaxvc','usaxhi','usaxls','usaxge','usaxlt','usaxgt','usaxle',
+ 'usad8eq','usad8ne','usad8cs','usad8hs','usad8cc','usad8lo','usad8mi','usad8pl','usad8vs','usad8vc','usad8hi','usad8ls','usad8ge','usad8lt','usad8gt','usad8le',
+ 'usada8eq','usada8ne','usada8cs','usada8hs','usada8cc','usada8lo','usada8mi','usada8pl','usada8vs','usada8vc','usada8hi','usada8ls','usada8ge','usada8lt','usada8gt','usada8le',
+ /* ARMv6 SIMD: Conditional Halving Addition & Subtraction */
+ 'shadd16eq','shadd16ne','shadd16cs','shadd16hs','shadd16cc','shadd16lo','shadd16mi','shadd16pl','shadd16vs','shadd16vc','shadd16hi','shadd16ls','shadd16ge','shadd16lt','shadd16gt','shadd16le',
+ 'shadd8eq','shadd8ne','shadd8cs','shadd8hs','shadd8cc','shadd8lo','shadd8mi','shadd8pl','shadd8vs','shadd8vc','shadd8hi','shadd8ls','shadd8ge','shadd8lt','shadd8gt','shadd8le',
+ 'uhadd16eq','uhadd16ne','uhadd16cs','uhadd16hs','uhadd16cc','uhadd16lo','uhadd16mi','uhadd16pl','uhadd16vs','uhadd16vc','uhadd16hi','uhadd16ls','uhadd16ge','uhadd16lt','uhadd16gt','uhadd16le',
+ 'uhadd8eq','uhadd8ne','uhadd8cs','uhadd8hs','uhadd8cc','uhadd8lo','uhadd8mi','uhadd8pl','uhadd8vs','uhadd8vc','uhadd8hi','uhadd8ls','uhadd8ge','uhadd8lt','uhadd8gt','uhadd8le',
+ 'shsub16eq','shsub16ne','shsub16cs','shsub16hs','shsub16cc','shsub16lo','shsub16mi','shsub16pl','shsub16vs','shsub16vc','shsub16hi','shsub16ls','shsub16ge','shsub16lt','shsub16gt','shsub16le',
+ 'shsub8eq','shsub8ne','shsub8cs','shsub8hs','shsub8cc','shsub8lo','shsub8mi','shsub8pl','shsub8vs','shsub8vc','shsub8hi','shsub8ls','shsub8ge','shsub8lt','shsub8gt','shsub8le',
+ 'uhsub16eq','uhsub16ne','uhsub16cs','uhsub16hs','uhsub16cc','uhsub16lo','uhsub16mi','uhsub16pl','uhsub16vs','uhsub16vc','uhsub16hi','uhsub16ls','uhsub16ge','uhsub16lt','uhsub16gt','uhsub16le',
+ 'uhsub8eq','uhsub8ne','uhsub8cs','uhsub8hs','uhsub8cc','uhsub8lo','uhsub8mi','uhsub8pl','uhsub8vs','uhsub8vc','uhsub8hi','uhsub8ls','uhsub8ge','uhsub8lt','uhsub8gt','uhsub8le',
+ 'shasxeq','shasxne','shasxcs','shasxhs','shasxcc','shasxlo','shasxmi','shasxpl','shasxvs','shasxvc','shasxhi','shasxls','shasxge','shasxlt','shasxgt','shasxle',
+ 'shsaxeq','shsaxne','shsaxcs','shsaxhs','shsaxcc','shsaxlo','shsaxmi','shsaxpl','shsaxvs','shsaxvc','shsaxhi','shsaxls','shsaxge','shsaxlt','shsaxgt','shsaxle',
+ 'uhasxeq','uhasxne','uhasxcs','uhasxhs','uhasxcc','uhasxlo','uhasxmi','uhasxpl','uhasxvs','uhasxvc','uhasxhi','uhasxls','uhasxge','uhasxlt','uhasxgt','uhasxle',
+ 'uhsaxeq','uhsaxne','uhsaxcs','uhsaxhs','uhsaxcc','uhsaxlo','uhsaxmi','uhsaxpl','uhsaxvs','uhsaxvc','uhsaxhi','uhsaxls','uhsaxge','uhsaxlt','uhsaxgt','uhsaxle',
+ /* ARMv6 SIMD: Conditional Saturating Operations */
+ 'qaddeq','qaddne','qaddcs','qaddhs','qaddcc','qaddlo','qaddmi','qaddpl','qaddvs','qaddvc','qaddhi','qaddls','qaddge','qaddlt','qaddgt','qaddle',
+ 'qadd16eq','qadd16ne','qadd16cs','qadd16hs','qadd16cc','qadd16lo','qadd16mi','qadd16pl','qadd16vs','qadd16vc','qadd16hi','qadd16ls','qadd16ge','qadd16lt','qadd16gt','qadd16le',
+ 'qadd8eq','qadd8ne','qadd8cs','qadd8hs','qadd8cc','qadd8lo','qadd8mi','qadd8pl','qadd8vs','qadd8vc','qadd8hi','qadd8ls','qadd8ge','qadd8lt','qadd8gt','qadd8le',
+ 'uqadd16eq','uqadd16ne','uqadd16cs','uqadd16hs','uqadd16cc','uqadd16lo','uqadd16mi','uqadd16pl','uqadd16vs','uqadd16vc','uqadd16hi','uqadd16ls','uqadd16ge','uqadd16lt','uqadd16gt','uqadd16le',
+ 'uqadd8eq','uqadd8ne','uqadd8cs','uqadd8hs','uqadd8cc','uqadd8lo','uqadd8mi','uqadd8pl','uqadd8vs','uqadd8vc','uqadd8hi','uqadd8ls','uqadd8ge','uqadd8lt','uqadd8gt','uqadd8le',
+ 'qsubeq','qsubne','qsubcs','qsubhs','qsubcc','qsublo','qsubmi','qsubpl','qsubvs','qsubvc','qsubhi','qsubls','qsubge','qsublt','qsubgt','qsuble',
+ 'qsub16eq','qsub16ne','qsub16cs','qsub16hs','qsub16cc','qsub16lo','qsub16mi','qsub16pl','qsub16vs','qsub16vc','qsub16hi','qsub16ls','qsub16ge','qsub16lt','qsub16gt','qsub16le',
+ 'qsub8eq','qsub8ne','qsub8cs','qsub8hs','qsub8cc','qsub8lo','qsub8mi','qsub8pl','qsub8vs','qsub8vc','qsub8hi','qsub8ls','qsub8ge','qsub8lt','qsub8gt','qsub8le',
+ 'uqsub16eq','uqsub16ne','uqsub16cs','uqsub16hs','uqsub16cc','uqsub16lo','uqsub16mi','uqsub16pl','uqsub16vs','uqsub16vc','uqsub16hi','uqsub16ls','uqsub16ge','uqsub16lt','uqsub16gt','uqsub16le',
+ 'uqsub8eq','uqsub8ne','uqsub8cs','uqsub8hs','uqsub8cc','uqsub8lo','uqsub8mi','uqsub8pl','uqsub8vs','uqsub8vc','uqsub8hi','uqsub8ls','uqsub8ge','uqsub8lt','uqsub8gt','uqsub8le',
+ 'qasxeq','qasxne','qasxcs','qasxhs','qasxcc','qasxlo','qasxmi','qasxpl','qasxvs','qasxvc','qasxhi','qasxls','qasxge','qasxlt','qasxgt','qasxle',
+ 'qsaxeq','qsaxne','qsaxcs','qsaxhs','qsaxcc','qsaxlo','qsaxmi','qsaxpl','qsaxvs','qsaxvc','qsaxhi','qsaxls','qsaxge','qsaxlt','qsaxgt','qsaxle',
+ 'uqasxeq','uqasxne','uqasxcs','uqasxhs','uqasxcc','uqasxlo','uqasxmi','uqasxpl','uqasxvs','uqasxvc','uqasxhi','uqasxls','uqasxge','uqasxlt','uqasxgt','uqasxle',
+ 'uqsaxeq','uqsaxne','uqsaxcs','uqsaxhs','uqsaxcc','uqsaxlo','uqsaxmi','uqsaxpl','uqsaxvs','uqsaxvc','uqsaxhi','uqsaxls','uqsaxge','uqsaxlt','uqsaxgt','uqsaxle',
+ 'qdaddeq','qdaddne','qdaddcs','qdaddhs','qdaddcc','qdaddlo','qdaddmi','qdaddpl','qdaddvs','qdaddvc','qdaddhi','qdaddls','qdaddge','qdaddlt','qdaddgt','qdaddle',
+ 'qdsubeq','qdsubne','qdsubcs','qdsubhs','qdsubcc','qdsublo','qdsubmi','qdsubpl','qdsubvs','qdsubvc','qdsubhi','qdsubls','qdsubge','qdsublt','qdsubgt','qdsuble',
+ 'ssateq','ssatne','ssatcs','ssaths','ssatcc','ssatlo','ssatmi','ssatpl','ssatvs','ssatvc','ssathi','ssatls','ssatge','ssatlt','ssatgt','ssatle',
+ 'ssat16eq','ssat16ne','ssat16cs','ssat16hs','ssat16cc','ssat16lo','ssat16mi','ssat16pl','ssat16vs','ssat16vc','ssat16hi','ssat16ls','ssat16ge','ssat16lt','ssat16gt','ssat16le',
+ 'usateq','usatne','usatcs','usaths','usatcc','usatlo','usatmi','usatpl','usatvs','usatvc','usathi','usatls','usatge','usatlt','usatgt','usatle',
+ 'usat16eq','usat16ne','usat16cs','usat16hs','usat16cc','usat16lo','usat16mi','usat16pl','usat16vs','usat16vc','usat16hi','usat16ls','usat16ge','usat16lt','usat16gt','usat16le',
+ /* ARMv6 SIMD: Conditional Permutation and Combine Operations */
+ 'sxtaheq','sxtahne','sxtahcs','sxtahhs','sxtahcc','sxtahlo','sxtahmi','sxtahpl','sxtahvs','sxtahvc','sxtahhi','sxtahls','sxtahge','sxtahlt','sxtahgt','sxtahle',
+ 'sxtabeq','sxtabne','sxtabcs','sxtabhs','sxtabcc','sxtablo','sxtabmi','sxtabpl','sxtabvs','sxtabvc','sxtabhi','sxtabls','sxtabge','sxtablt','sxtabgt','sxtable',
+ 'sxtab16eq','sxtab16ne','sxtab16cs','sxtab16hs','sxtab16cc','sxtab16lo','sxtab16mi','sxtab16pl','sxtab16vs','sxtab16vc','sxtab16hi','sxtab16ls','sxtab16ge','sxtab16lt','sxtab16gt','sxtab16le',
+ 'uxtaheq','uxtahne','uxtahcs','uxtahhs','uxtahcc','uxtahlo','uxtahmi','uxtahpl','uxtahvs','uxtahvc','uxtahhi','uxtahls','uxtahge','uxtahlt','uxtahgt','uxtahle',
+ 'uxtabeq','uxtabne','uxtabcs','uxtabhs','uxtabcc','uxtablo','uxtabmi','uxtabpl','uxtabvs','uxtabvc','uxtabhi','uxtabls','uxtabge','uxtablt','uxtabgt','uxtable',
+ 'uxtab16eq','uxtab16ne','uxtab16cs','uxtab16hs','uxtab16cc','uxtab16lo','uxtab16mi','uxtab16pl','uxtab16vs','uxtab16vc','uxtab16hi','uxtab16ls','uxtab16ge','uxtab16lt','uxtab16gt','uxtab16le',
+ 'sxtheq.w','sxthne.w','sxthcs.w','sxthhs.w','sxthcc.w','sxthlo.w','sxthmi.w','sxthpl.w','sxthvs.w','sxthvc.w','sxthhi.w','sxthls.w','sxthge.w','sxthlt.w','sxthgt.w','sxthle.w',
+ 'sxtheq','sxthne','sxthcs','sxthhs','sxthcc','sxthlo','sxthmi','sxthpl','sxthvs','sxthvc','sxthhi','sxthls','sxthge','sxthlt','sxthgt','sxthle',
+ 'sxtbeq.w','sxtbne.w','sxtbcs.w','sxtbhs.w','sxtbcc.w','sxtblo.w','sxtbmi.w','sxtbpl.w','sxtbvs.w','sxtbvc.w','sxtbhi.w','sxtbls.w','sxtbge.w','sxtblt.w','sxtbgt.w','sxtble.w',
+ 'sxtbeq','sxtbne','sxtbcs','sxtbhs','sxtbcc','sxtblo','sxtbmi','sxtbpl','sxtbvs','sxtbvc','sxtbhi','sxtbls','sxtbge','sxtblt','sxtbgt','sxtble',
+ 'sxtb16eq','sxtb16ne','sxtb16cs','sxtb16hs','sxtb16cc','sxtb16lo','sxtb16mi','sxtb16pl','sxtb16vs','sxtb16vc','sxtb16hi','sxtb16ls','sxtb16ge','sxtb16lt','sxtb16gt','sxtb16le',
+ 'uxtheq.w','uxthne.w','uxthcs.w','uxthhs.w','uxthcc.w','uxthlo.w','uxthmi.w','uxthpl.w','uxthvs.w','uxthvc.w','uxthhi.w','uxthls.w','uxthge.w','uxthlt.w','uxthgt.w','uxthle.w',
+ 'uxtheq','uxthne','uxthcs','uxthhs','uxthcc','uxthlo','uxthmi','uxthpl','uxthvs','uxthvc','uxthhi','uxthls','uxthge','uxthlt','uxthgt','uxthle',
+ 'uxtbeq.w','uxtbne.w','uxtbcs.w','uxtbhs.w','uxtbcc.w','uxtblo.w','uxtbmi.w','uxtbpl.w','uxtbvs.w','uxtbvc.w','uxtbhi.w','uxtbls.w','uxtbge.w','uxtblt.w','uxtbgt.w','uxtble.w',
+ 'uxtbeq','uxtbne','uxtbcs','uxtbhs','uxtbcc','uxtblo','uxtbmi','uxtbpl','uxtbvs','uxtbvc','uxtbhi','uxtbls','uxtbge','uxtblt','uxtbgt','uxtble',
+ 'uxtb16eq','uxtb16ne','uxtb16cs','uxtb16hs','uxtb16cc','uxtb16lo','uxtb16mi','uxtb16pl','uxtb16vs','uxtb16vc','uxtb16hi','uxtb16ls','uxtb16ge','uxtb16lt','uxtb16gt','uxtb16le',
+ 'pkhbteq','pkhbtne','pkhbtcs','pkhbths','pkhbtcc','pkhbtlo','pkhbtmi','pkhbtpl','pkhbtvs','pkhbtvc','pkhbthi','pkhbtls','pkhbtge','pkhbtlt','pkhbtgt','pkhbtle',
+ 'pkhtbeq','pkhtbne','pkhtbcs','pkhtbhs','pkhtbcc','pkhtblo','pkhtbmi','pkhtbpl','pkhtbvs','pkhtbvc','pkhtbhi','pkhtbls','pkhtbge','pkhtblt','pkhtbgt','pkhtble',
+ 'rbiteq','rbitne','rbitcs','rbiths','rbitcc','rbitlo','rbitmi','rbitpl','rbitvs','rbitvc','rbithi','rbitls','rbitge','rbitlt','rbitgt','rbitle',
+ 'reveq.w','revne.w','revcs.w','revhs.w','revcc.w','revlo.w','revmi.w','revpl.w','revvs.w','revvc.w','revhi.w','revls.w','revge.w','revlt.w','revgt.w','revle.w',
+ 'reveq','revne','revcs','revhs','revcc','revlo','revmi','revpl','revvs','revvc','revhi','revls','revge','revlt','revgt','revle',
+ 'rev16eq.w','rev16ne.w','rev16cs.w','rev16hs.w','rev16cc.w','rev16lo.w','rev16mi.w','rev16pl.w','rev16vs.w','rev16vc.w','rev16hi.w','rev16ls.w','rev16ge.w','rev16lt.w','rev16gt.w','rev16le.w',
+ 'rev16eq','rev16ne','rev16cs','rev16hs','rev16cc','rev16lo','rev16mi','rev16pl','rev16vs','rev16vc','rev16hi','rev16ls','rev16ge','rev16lt','rev16gt','rev16le',
+ 'revsheq.w','revshne.w','revshcs.w','revshhs.w','revshcc.w','revshlo.w','revshmi.w','revshpl.w','revshvs.w','revshvc.w','revshhi.w','revshls.w','revshge.w','revshlt.w','revshgt.w','revshle.w',
+ 'revsheq','revshne','revshcs','revshhs','revshcc','revshlo','revshmi','revshpl','revshvs','revshvc','revshhi','revshls','revshge','revshlt','revshgt','revshle',
+ 'seleq','selne','selcs','selhs','selcc','sello','selmi','selpl','selvs','selvc','selhi','sells','selge','sellt','selgt','selle',
+ /* ARMv6 SIMD: Conditional Multiply and Multiply-Add */
+ 'smladeq','smladne','smladcs','smladhs','smladcc','smladlo','smladmi','smladpl','smladvs','smladvc','smladhi','smladls','smladge','smladlt','smladgt','smladle',
+ 'smladxeq','smladxne','smladxcs','smladxhs','smladxcc','smladxlo','smladxmi','smladxpl','smladxvs','smladxvc','smladxhi','smladxls','smladxge','smladxlt','smladxgt','smladxle',
+ 'smlsdeq','smlsdne','smlsdcs','smlsdhs','smlsdcc','smlsdlo','smlsdmi','smlsdpl','smlsdvs','smlsdvc','smlsdhi','smlsdls','smlsdge','smlsdlt','smlsdgt','smlsdle',
+ 'smlsdxeq','smlsdxne','smlsdxcs','smlsdxhs','smlsdxcc','smlsdxlo','smlsdxmi','smlsdxpl','smlsdxvs','smlsdxvc','smlsdxhi','smlsdxls','smlsdxge','smlsdxlt','smlsdxgt','smlsdxle',
+ 'smlaldeq','smlaldne','smlaldcs','smlaldhs','smlaldcc','smlaldlo','smlaldmi','smlaldpl','smlaldvs','smlaldvc','smlaldhi','smlaldls','smlaldge','smlaldlt','smlaldgt','smlaldle',
+ 'smlaldxeq','smlaldxne','smlaldxcs','smlaldxhs','smlaldxcc','smlaldxlo','smlaldxmi','smlaldxpl','smlaldxvs','smlaldxvc','smlaldxhi','smlaldxls','smlaldxge','smlaldxlt','smlaldxgt','smlaldxle',
+ 'smlsldeq','smlsldne','smlsldcs','smlsldhs','smlsldcc','smlsldlo','smlsldmi','smlsldpl','smlsldvs','smlsldvc','smlsldhi','smlsldls','smlsldge','smlsldlt','smlsldgt','smlsldle',
+ 'smlsldxeq','smlsldxne','smlsldxcs','smlsldxhs','smlsldxcc','smlsldxlo','smlsldxmi','smlsldxpl','smlsldxvs','smlsldxvc','smlsldxhi','smlsldxls','smlsldxge','smlsldxlt','smlsldxgt','smlsldxle',
+ 'smmuleq','smmulne','smmulcs','smmulhs','smmulcc','smmullo','smmulmi','smmulpl','smmulvs','smmulvc','smmulhi','smmulls','smmulge','smmullt','smmulgt','smmulle',
+ 'smmulreq','smmulrne','smmulrcs','smmulrhs','smmulrcc','smmulrlo','smmulrmi','smmulrpl','smmulrvs','smmulrvc','smmulrhi','smmulrls','smmulrge','smmulrlt','smmulrgt','smmulrle',
+ 'smmlaeq','smmlane','smmlacs','smmlahs','smmlacc','smmlalo','smmlami','smmlapl','smmlavs','smmlavc','smmlahi','smmlals','smmlage','smmlalt','smmlagt','smmlale',
+ 'smmlareq','smmlarne','smmlarcs','smmlarhs','smmlarcc','smmlarlo','smmlarmi','smmlarpl','smmlarvs','smmlarvc','smmlarhi','smmlarls','smmlarge','smmlarlt','smmlargt','smmlarle',
+ 'smmlseq','smmlsne','smmlscs','smmlshs','smmlscc','smmlslo','smmlsmi','smmlspl','smmlsvs','smmlsvc','smmlshi','smmlsls','smmlsge','smmlslt','smmlsgt','smmlsle',
+ 'smmlsreq','smmlsrne','smmlsrcs','smmlsrhs','smmlsrcc','smmlsrlo','smmlsrmi','smmlsrpl','smmlsrvs','smmlsrvc','smmlsrhi','smmlsrls','smmlsrge','smmlsrlt','smmlsrgt','smmlsrle',
+ 'smuadeq','smuadne','smuadcs','smuadhs','smuadcc','smuadlo','smuadmi','smuadpl','smuadvs','smuadvc','smuadhi','smuadls','smuadge','smuadlt','smuadgt','smuadle',
+ 'smuadxeq','smuadxne','smuadxcs','smuadxhs','smuadxcc','smuadxlo','smuadxmi','smuadxpl','smuadxvs','smuadxvc','smuadxhi','smuadxls','smuadxge','smuadxlt','smuadxgt','smuadxle',
+ 'smusdeq','smusdne','smusdcs','smusdhs','smusdcc','smusdlo','smusdmi','smusdpl','smusdvs','smusdvc','smusdhi','smusdls','smusdge','smusdlt','smusdgt','smusdle',
+ 'smusdxeq','smusdxne','smusdxcs','smusdxhs','smusdxcc','smusdxlo','smusdxmi','smusdxpl','smusdxvs','smusdxvc','smusdxhi','smusdxls','smusdxge','smusdxlt','smusdxgt','smusdxle',
+ 'umaaleq','umaalne','umaalcs','umaalhs','umaalcc','umaallo','umaalmi','umaalpl','umaalvs','umaalvc','umaalhi','umaalls','umaalge','umaallt','umaalgt','umaalle'
+ ),
+ /* Unconditional Coprocessor Instructions */
+ 13 => array(
+ /* Data Processing: Unconditional Coprocessor Instructions */
+ 'cdp','cdpal',
+ 'cdp2','cdp2al',
+ 'ldc','ldcal',
+ 'ldcl','ldclal',
+ 'ldc2','ldc2al',
+ 'ldc2l','ldc2lal',
+ 'stc','stcal',
+ 'stcl','stclal',
+ 'stc2','stc2al',
+ 'stc2l','stc2lal',
+ 'mcr','mcral',
+ 'mcr2','mcr2al',
+ 'mcrr','mcrral',
+ 'mcrr2','mcrr2al',
+ 'mrc','mrcal',
+ 'mrc2','mrc2al',
+ 'mrrc','mrrcal',
+ 'mrrc2','mrrc2al'
+ ),
+ /* Conditional Coprocessor Instructions */
+ 14 => array(
+ /* Data Processing: Conditional Coprocessor Instructions */
+ 'cdpeq','cdpne','cdpcs','cdphs','cdpcc','cdplo','cdpmi','cdppl','cdpvs','cdpvc','cdphi','cdpls','cdpge','cdplt','cdpgt','cdple',
+ 'cdp2eq','cdp2ne','cdp2cs','cdp2hs','cdp2cc','cdp2lo','cdp2mi','cdp2pl','cdp2vs','cdp2vc','cdp2hi','cdp2ls','cdp2ge','cdp2lt','cdp2gt','cdp2le',
+ 'ldceq','ldcne','ldccs','ldchs','ldccc','ldclo','ldcmi','ldcpl','ldcvs','ldcvc','ldchi','ldcls','ldcge','ldclt','ldcgt','ldcle',
+ 'ldcleq','ldclne','ldclcs','ldclhs','ldclcc','ldcllo','ldclmi','ldclpl','ldclvs','ldclvc','ldclhi','ldclls','ldclge','ldcllt','ldclgt','ldclle',
+ 'ldc2eq','ldc2ne','ldc2cs','ldc2hs','ldc2cc','ldc2lo','ldc2mi','ldc2pl','ldc2vs','ldc2vc','ldc2hi','ldc2ls','ldc2ge','ldc2lt','ldc2gt','ldc2le',
+ 'ldc2leq','ldc2lne','ldc2lcs','ldc2lhs','ldc2lcc','ldc2llo','ldc2lmi','ldc2lpl','ldc2lvs','ldc2lvc','ldc2lhi','ldc2lls','ldc2lge','ldc2llt','ldc2lgt','ldc2lle',
+ 'stceq','stcne','stccs','stchs','stccc','stclo','stcmi','stcpl','stcvs','stcvc','stchi','stcls','stcge','stclt','stcgt','stcle',
+ 'stcleq','stclne','stclcs','stclhs','stclcc','stcllo','stclmi','stclpl','stclvs','stclvc','stclhi','stclls','stclge','stcllt','stclgt','stclle',
+ 'stc2eq','stc2ne','stc2cs','stc2hs','stc2cc','stc2lo','stc2mi','stc2pl','stc2vs','stc2vc','stc2hi','stc2ls','stc2ge','stc2lt','stc2gt','stc2le',
+ 'stc2leq','stc2lne','stc2lcs','stc2lhs','stc2lcc','stc2llo','stc2lmi','stc2lpl','stc2lvs','stc2lvc','stc2lhi','stc2lls','stc2lge','stc2llt','stc2lgt','stc2lle',
+ 'mcreq','mcrne','mcrcs','mcrhs','mcrcc','mcrlo','mcrmi','mcrpl','mcrvs','mcrvc','mcrhi','mcrls','mcrge','mcrlt','mcrgt','mcrle',
+ 'mcr2eq','mcr2ne','mcr2cs','mcr2hs','mcr2cc','mcr2lo','mcr2mi','mcr2pl','mcr2vs','mcr2vc','mcr2hi','mcr2ls','mcr2ge','mcr2lt','mcr2gt','mcr2le',
+ 'mcrreq','mcrrne','mcrrcs','mcrrhs','mcrrcc','mcrrlo','mcrrmi','mcrrpl','mcrrvs','mcrrvc','mcrrhi','mcrrls','mcrrge','mcrrlt','mcrrgt','mcrrle',
+ 'mcrr2eq','mcrr2ne','mcrr2cs','mcrr2hs','mcrr2cc','mcrr2lo','mcrr2mi','mcrr2pl','mcrr2vs','mcrr2vc','mcrr2hi','mcrr2ls','mcrr2ge','mcrr2lt','mcrr2gt','mcrr2le',
+ 'mrceq','mrcne','mrccs','mrchs','mrccc','mrclo','mrcmi','mrcpl','mrcvs','mrcvc','mrchi','mrcls','mrcge','mrclt','mrcgt','mrcle',
+ 'mrc2eq','mrc2ne','mrc2cs','mrc2hs','mrc2cc','mrc2lo','mrc2mi','mrc2pl','mrc2vs','mrc2vc','mrc2hi','mrc2ls','mrc2ge','mrc2lt','mrc2gt','mrc2le',
+ 'mrrceq','mrrcne','mrrccs','mrrchs','mrrccc','mrrclo','mrrcmi','mrrcpl','mrrcvs','mrrcvc','mrrchi','mrrcls','mrrcge','mrrclt','mrrcgt','mrrcle',
+ 'mrrc2eq','mrrc2ne','mrrc2cs','mrrc2hs','mrrc2cc','mrrc2lo','mrrc2mi','mrrc2pl','mrrc2vs','mrrc2vc','mrrc2hi','mrrc2ls','mrrc2ge','mrrc2lt','mrrc2gt','mrrc2le'
+ ),
+ /* Unconditional System Instructions */
+ 15 => array(
+ /* System: Unconditional Debug and State-Change Instructions */
+ 'bkpt',
+ 'dbg','dbgal',
+ 'setend',
+ 'svc','svcal',
+ 'sev.w','seval.w',
+ 'sev','seval',
+ 'wfe.w','wfeal.w',
+ 'wfe','wfeal',
+ 'wfi.w','wfial.w',
+ 'wfi','wfial',
+ /* System: Unconditional ThumbEE Instructions */
+ 'enterx',
+ 'leavex',
+ 'chka.n','chkaal.n',
+ 'chka','chkaal',
+ 'hb.n','hbal.n',
+ 'hb','hbal',
+ 'hbl.n','hblal.n',
+ 'hbl','hblal',
+ 'hblp.n','hblpal.n',
+ 'hblp','hblpal',
+ 'hbp.n','hbpal.n',
+ 'hbp','hbpal',
+ /* System: Unconditional Privileged Instructions */
+ 'cpsie.n',
+ 'cpsie.w',
+ 'cpsie',
+ 'cpsid.n',
+ 'cpsid.w',
+ 'cpsid',
+ 'smc','smcal',
+ 'rfeda','rfedaal',
+ 'rfedb','rfedbal',
+ 'rfeia','rfeiaal',
+ 'rfeib','rfeibal',
+ 'srsda','srsdaal',
+ 'srsdb','srsdbal',
+ 'srsia','srsiaal',
+ 'srsib','srsibal'
+ ),
+ /* Conditional System Instructions */
+ 16 => array(
+ /* System: Conditional Debug and State-Change Instructions */
+ 'dbgeq','dbgne','dbgcs','dbghs','dbgcc','dbglo','dbgmi','dbgpl','dbgvs','dbgvc','dbghi','dbgls','dbgge','dbglt','dbggt','dbgle',
+ 'svceq','svcne','svccs','svchs','svccc','svclo','svcmi','svcpl','svcvs','svcvc','svchi','svcls','svcge','svclt','svcgt','svcle',
+ 'seveq.w','sevne.w','sevcs.w','sevhs.w','sevcc.w','sevlo.w','sevmi.w','sevpl.w','sevvs.w','sevvc.w','sevhi.w','sevls.w','sevge.w','sevlt.w','sevgt.w','sevle.w',
+ 'seveq','sevne','sevcs','sevhs','sevcc','sevlo','sevmi','sevpl','sevvs','sevvc','sevhi','sevls','sevge','sevlt','sevgt','sevle',
+ 'wfeeq.w','wfene.w','wfecs.w','wfehs.w','wfecc.w','wfelo.w','wfemi.w','wfepl.w','wfevs.w','wfevc.w','wfehi.w','wfels.w','wfege.w','wfelt.w','wfegt.w','wfele.w',
+ 'wfeeq','wfene','wfecs','wfehs','wfecc','wfelo','wfemi','wfepl','wfevs','wfevc','wfehi','wfels','wfege','wfelt','wfegt','wfele',
+ 'wfieq.w','wfine.w','wfics.w','wfihs.w','wficc.w','wfilo.w','wfimi.w','wfipl.w','wfivs.w','wfivc.w','wfihi.w','wfils.w','wfige.w','wfilt.w','wfigt.w','wfile.w',
+ 'wfieq','wfine','wfics','wfihs','wficc','wfilo','wfimi','wfipl','wfivs','wfivc','wfihi','wfils','wfige','wfilt','wfigt','wfile',
+ /* System: Conditional ThumbEE Instructions */
+ 'chkaeq.n','chkane.n','chkacs.n','chkahs.n','chkacc.n','chkalo.n','chkami.n','chkapl.n','chkavs.n','chkavc.n','chkahi.n','chkals.n','chkage.n','chkalt.n','chkagt.n','chkale.n',
+ 'chkaeq','chkane','chkacs','chkahs','chkacc','chkalo','chkami','chkapl','chkavs','chkavc','chkahi','chkals','chkage','chkalt','chkagt','chkale',
+ 'hbeq.n','hbne.n','hbcs.n','hbhs.n','hbcc.n','hblo.n','hbmi.n','hbpl.n','hbvs.n','hbvc.n','hbhi.n','hbls.n','hbge.n','hblt.n','hbgt.n','hble.n',
+ 'hbeq','hbne','hbcs','hbhs','hbcc','hblo','hbmi','hbpl','hbvs','hbvc','hbhi','hbls','hbge','hblt','hbgt','hble',
+ 'hbleq.n','hblne.n','hblcs.n','hblhs.n','hblcc.n','hbllo.n','hblmi.n','hblpl.n','hblvs.n','hblvc.n','hblhi.n','hblls.n','hblge.n','hbllt.n','hblgt.n','hblle.n',
+ 'hbleq','hblne','hblcs','hblhs','hblcc','hbllo','hblmi','hblpl','hblvs','hblvc','hblhi','hblls','hblge','hbllt','hblgt','hblle',
+ 'hblpeq.n','hblpne.n','hblpcs.n','hblphs.n','hblpcc.n','hblplo.n','hblpmi.n','hblppl.n','hblpvs.n','hblpvc.n','hblphi.n','hblpls.n','hblpge.n','hblplt.n','hblpgt.n','hblple.n',
+ 'hblpeq','hblpne','hblpcs','hblphs','hblpcc','hblplo','hblpmi','hblppl','hblpvs','hblpvc','hblphi','hblpls','hblpge','hblplt','hblpgt','hblple',
+ 'hbpeq.n','hbpne.n','hbpcs.n','hbphs.n','hbpcc.n','hbplo.n','hbpmi.n','hbppl.n','hbpvs.n','hbpvc.n','hbphi.n','hbpls.n','hbpge.n','hbplt.n','hbpgt.n','hbple.n',
+ 'hbpeq','hbpne','hbpcs','hbphs','hbpcc','hbplo','hbpmi','hbppl','hbpvs','hbpvc','hbphi','hbpls','hbpge','hbplt','hbpgt','hbple',
+ /* System: Conditional Privileged Instructions */
+ 'smceq','smcne','smccs','smchs','smccc','smclo','smcmi','smcpl','smcvs','smcvc','smchi','smcls','smcge','smclt','smcgt','smcle',
+ 'rfedaeq','rfedane','rfedacs','rfedahs','rfedacc','rfedalo','rfedami','rfedapl','rfedavs','rfedavc','rfedahi','rfedals','rfedage','rfedalt','rfedagt','rfedale',
+ 'rfedbeq','rfedbne','rfedbcs','rfedbhs','rfedbcc','rfedblo','rfedbmi','rfedbpl','rfedbvs','rfedbvc','rfedbhi','rfedbls','rfedbge','rfedblt','rfedbgt','rfedble',
+ 'rfeiaeq','rfeiane','rfeiacs','rfeiahs','rfeiacc','rfeialo','rfeiami','rfeiapl','rfeiavs','rfeiavc','rfeiahi','rfeials','rfeiage','rfeialt','rfeiagt','rfeiale',
+ 'rfeibeq','rfeibne','rfeibcs','rfeibhs','rfeibcc','rfeiblo','rfeibmi','rfeibpl','rfeibvs','rfeibvc','rfeibhi','rfeibls','rfeibge','rfeiblt','rfeibgt','rfeible',
+ 'srsdaeq','srsdane','srsdacs','srsdahs','srsdacc','srsdalo','srsdami','srsdapl','srsdavs','srsdavc','srsdahi','srsdals','srsdage','srsdalt','srsdagt','srsdale',
+ 'srsdbeq','srsdbne','srsdbcs','srsdbhs','srsdbcc','srsdblo','srsdbmi','srsdbpl','srsdbvs','srsdbvc','srsdbhi','srsdbls','srsdbge','srsdblt','srsdbgt','srsdble',
+ 'srsiaeq','srsiane','srsiacs','srsiahs','srsiacc','srsialo','srsiami','srsiapl','srsiavs','srsiavc','srsiahi','srsials','srsiage','srsialt','srsiagt','srsiale',
+ 'srsibeq','srsibne','srsibcs','srsibhs','srsibcc','srsiblo','srsibmi','srsibpl','srsibvs','srsibvc','srsibhi','srsibls','srsibge','srsiblt','srsibgt','srsible'
+ ),
+ /* Unconditional WMMX/WMMX2 instructions */
+ 17 => array(
+ /* Unconditional WMMX/WMMX2 SIMD Instructions */
+ 'tandcb','tandcbal',
+ 'tandch','tandchal',
+ 'tandcw','tandcwal',
+ 'tbcstb','tbcstbal',
+ 'tbcsth','tbcsthal',
+ 'tbcstw','tbcstwal',
+ 'textrcb','textrcbal',
+ 'textrch','textrchal',
+ 'textrcw','textrcwal',
+ 'textrmsb','textrmsbal',
+ 'textrmsh','textrmshal',
+ 'textrmsw','textrmswal',
+ 'textrmub','textrmubal',
+ 'textrmuh','textrmuhal',
+ 'textrmuw','textrmuwal',
+ 'tinsrb','tinsrbal',
+ 'tinsrh','tinsrhal',
+ 'tinsrw','tinsrwal',
+ 'tmcr','tmcral',
+ 'tmcrr','tmcrral',
+ 'tmia','tmiaal',
+ 'tmiaph','tmiaphal',
+ 'tmiabb','tmiabbal',
+ 'tmiabt','tmiabtal',
+ 'tmiatb','tmiatbal',
+ 'tmiatt','tmiattal',
+ 'tmovmskb','tmovmskbal',
+ 'tmovmskh','tmovmskhal',
+ 'tmovmskw','tmovmskwal',
+ 'tmrc','tmrcal',
+ 'tmrrc','tmrrcal',
+ 'torcb','torcbal',
+ 'torch','torchal',
+ 'torcw','torcwal',
+ 'torvscb','torvscbal',
+ 'torvsch','torvschal',
+ 'torvscw','torvscwal',
+ 'wabsb','wabsbal',
+ 'wabsh','wabshal',
+ 'wabsw','wabswal',
+ 'wabsdiffb','wabsdiffbal',
+ 'wabsdiffh','wabsdiffhal',
+ 'wabsdiffw','wabsdiffwal',
+ 'waccb','waccbal',
+ 'wacch','wacchal',
+ 'waccw','waccwal',
+ 'waddb','waddbal',
+ 'waddh','waddhal',
+ 'waddw','waddwal',
+ 'waddbc','waddbcal',
+ 'waddhc','waddhcal',
+ 'waddwc','waddwcal',
+ 'waddbss','waddbssal',
+ 'waddhss','waddhssal',
+ 'waddwss','waddwssal',
+ 'waddbus','waddbusal',
+ 'waddhus','waddhusal',
+ 'waddwus','waddwusal',
+ 'waddsubhx','waddsubhxal',
+ 'waligni','walignial',
+ 'walignr0','walignr0al',
+ 'walignr1','walignr1al',
+ 'walignr2','walignr2al',
+ 'walignr3','walignr3al',
+ 'wand','wandal',
+ 'wandn','wandnal',
+ 'wavg2b','wavg2bal',
+ 'wavg2h','wavg2hal',
+ 'wavg2br','wavg2bral',
+ 'wavg2hr','wavg2hral',
+ 'wavg4','wavg4al',
+ 'wavg4r','wavg4ral',
+ 'wcmpeqb','wcmpeqbal',
+ 'wcmpeqh','wcmpeqhal',
+ 'wcmpeqw','wcmpeqwal',
+ 'wcmpgtsb','wcmpgtsbal',
+ 'wcmpgtsh','wcmpgtshal',
+ 'wcmpgtsw','wcmpgtswal',
+ 'wcmpgtub','wcmpgtubal',
+ 'wcmpgtuh','wcmpgtuhal',
+ 'wcmpgtuw','wcmpgtuwal',
+ 'wldrb','wldrbal',
+ 'wldrh','wldrhal',
+ 'wldrw','wldrwal',
+ 'wldrd','wldrdal',
+ 'wmacs','wmacsal',
+ 'wmacu','wmacual',
+ 'wmacsz','wmacszal',
+ 'wmacuz','wmacuzal',
+ 'wmadds','wmaddsal',
+ 'wmaddu','wmaddual',
+ 'wmaddsx','wmaddsxal',
+ 'wmaddux','wmadduxal',
+ 'wmaddsn','wmaddsnal',
+ 'wmaddun','wmaddunal',
+ 'wmaxsb','wmaxsbal',
+ 'wmaxsh','wmaxshal',
+ 'wmaxsw','wmaxswal',
+ 'wmaxub','wmaxubal',
+ 'wmaxuh','wmaxuhal',
+ 'wmaxuw','wmaxuwal',
+ 'wmerge','wmergeal',
+ 'wmiabb','wmiabbal',
+ 'wmiabt','wmiabtal',
+ 'wmiatb','wmiatbal',
+ 'wmiatt','wmiattal',
+ 'wmiabbn','wmiabbnal',
+ 'wmiabtn','wmiabtnal',
+ 'wmiatbn','wmiatbnal',
+ 'wmiattn','wmiattnal',
+ 'wmiawbb','wmiawbbal',
+ 'wmiawbt','wmiawbtal',
+ 'wmiawtb','wmiawtbal',
+ 'wmiawtt','wmiawttal',
+ 'wmiawbbn','wmiawbbnal',
+ 'wmiawbtn','wmiawbtnal',
+ 'wmiawtbn','wmiawtbnal',
+ 'wmiawttn','wmiawttnal',
+ 'wminsb','wminsbal',
+ 'wminsh','wminshal',
+ 'wminsw','wminswal',
+ 'wminub','wminubal',
+ 'wminuh','wminuhal',
+ 'wminuw','wminuwal',
+ 'wmov','wmoval',
+ 'wmulsm','wmulsmal',
+ 'wmulsl','wmulslal',
+ 'wmulum','wmulumal',
+ 'wmulul','wmululal',
+ 'wmulsmr','wmulsmral',
+ 'wmulslr','wmulslral',
+ 'wmulumr','wmulumral',
+ 'wmululr','wmululral',
+ 'wmulwum','wmulwumal',
+ 'wmulwsm','wmulwsmal',
+ 'wmulwl','wmulwlal',
+ 'wmulwumr','wmulwumral',
+ 'wmulwsmr','wmulwsmral',
+ 'wor','woral',
+ 'wpackhss','wpackhssal',
+ 'wpackwss','wpackwssal',
+ 'wpackdss','wpackdssal',
+ 'wpackhus','wpackhusal',
+ 'wpackwus','wpackwusal',
+ 'wpackdus','wpackdusal',
+ 'wqmiabb','wqmiabbal',
+ 'wqmiabt','wqmiabtal',
+ 'wqmiatb','wqmiatbal',
+ 'wqmiatt','wqmiattal',
+ 'wqmiabbn','wqmiabbnal',
+ 'wqmiabtn','wqmiabtnal',
+ 'wqmiatbn','wqmiatbnal',
+ 'wqmiattn','wqmiattnal',
+ 'wqmulm','wqmulmal',
+ 'wqmulmr','wqmulmral',
+ 'wqmulwm','wqmulwmal',
+ 'wqmulwmr','wqmulwmral',
+ 'wrorh','wrorhal',
+ 'wrorw','wrorwal',
+ 'wrord','wrordal',
+ 'wrorhg','wrorhgal',
+ 'wrorwg','wrorwgal',
+ 'wrordg','wrordgal',
+ 'wsadb','wsadbal',
+ 'wsadh','wsadhal',
+ 'wsadbz','wsadbzal',
+ 'wsadhz','wsadhzal',
+ 'wshufh','wshufhal',
+ 'wsllh','wsllhal',
+ 'wsllw','wsllwal',
+ 'wslld','wslldal',
+ 'wsllhg','wsllhgal',
+ 'wsllwg','wsllwgal',
+ 'wslldg','wslldgal',
+ 'wsrah','wsrahal',
+ 'wsraw','wsrawal',
+ 'wsrad','wsradal',
+ 'wsrahg','wsrahgal',
+ 'wsrawg','wsrawgal',
+ 'wsradg','wsradgal',
+ 'wsrlh','wsrlhal',
+ 'wsrlw','wsrlwal',
+ 'wsrld','wsrldal',
+ 'wsrlhg','wsrlhgal',
+ 'wsrlwg','wsrlwgal',
+ 'wsrldg','wsrldgal',
+ 'wstrb','wstrbal',
+ 'wstrh','wstrhal',
+ 'wstrw','wstrwal',
+ 'wstrd','wstrdal',
+ 'wsubb','wsubbal',
+ 'wsubh','wsubhal',
+ 'wsubw','wsubwal',
+ 'wsubbss','wsubbssal',
+ 'wsubhss','wsubhssal',
+ 'wsubwss','wsubwssal',
+ 'wsubbus','wsubbusal',
+ 'wsubhus','wsubhusal',
+ 'wsubwus','wsubwusal',
+ 'wsubaddhx','wsubaddhxal',
+ 'wunpckehsb','wunpckehsbal',
+ 'wunpckehsh','wunpckehshal',
+ 'wunpckehsw','wunpckehswal',
+ 'wunpckehub','wunpckehubal',
+ 'wunpckehuh','wunpckehuhal',
+ 'wunpckehuw','wunpckehuwal',
+ 'wunpckihb','wunpckihbal',
+ 'wunpckihh','wunpckihhal',
+ 'wunpckihw','wunpckihwal',
+ 'wunpckelsb','wunpckelsbal',
+ 'wunpckelsh','wunpckelshal',
+ 'wunpckelsw','wunpckelswal',
+ 'wunpckelub','wunpckelubal',
+ 'wunpckeluh','wunpckeluhal',
+ 'wunpckeluw','wunpckeluwal',
+ 'wunpckilb','wunpckilbal',
+ 'wunpckilh','wunpckilhal',
+ 'wunpckilw','wunpckilwal',
+ 'wxor','wxoral',
+ 'wzero','wzeroal'
+ ),
+ /* Conditional WMMX/WMMX2 SIMD Instructions */
+ 18 => array(
+ /* Conditional WMMX/WMMX2 SIMD Instructions */
+ 'tandcbeq','tandcbne','tandcbcs','tandcbhs','tandcbcc','tandcblo','tandcbmi','tandcbpl','tandcbvs','tandcbvc','tandcbhi','tandcbls','tandcbge','tandcblt','tandcbgt','tandcble',
+ 'tandcheq','tandchne','tandchcs','tandchhs','tandchcc','tandchlo','tandchmi','tandchpl','tandchvs','tandchvc','tandchhi','tandchls','tandchge','tandchlt','tandchgt','tandchle',
+ 'tandcweq','tandcwne','tandcwcs','tandcwhs','tandcwcc','tandcwlo','tandcwmi','tandcwpl','tandcwvs','tandcwvc','tandcwhi','tandcwls','tandcwge','tandcwlt','tandcwgt','tandcwle',
+ 'tbcstbeq','tbcstbne','tbcstbcs','tbcstbhs','tbcstbcc','tbcstblo','tbcstbmi','tbcstbpl','tbcstbvs','tbcstbvc','tbcstbhi','tbcstbls','tbcstbge','tbcstblt','tbcstbgt','tbcstble',
+ 'tbcstheq','tbcsthne','tbcsthcs','tbcsthhs','tbcsthcc','tbcsthlo','tbcsthmi','tbcsthpl','tbcsthvs','tbcsthvc','tbcsthhi','tbcsthls','tbcsthge','tbcsthlt','tbcsthgt','tbcsthle',
+ 'tbcstweq','tbcstwne','tbcstwcs','tbcstwhs','tbcstwcc','tbcstwlo','tbcstwmi','tbcstwpl','tbcstwvs','tbcstwvc','tbcstwhi','tbcstwls','tbcstwge','tbcstwlt','tbcstwgt','tbcstwle',
+ 'textrcbeq','textrcbne','textrcbcs','textrcbhs','textrcbcc','textrcblo','textrcbmi','textrcbpl','textrcbvs','textrcbvc','textrcbhi','textrcbls','textrcbge','textrcblt','textrcbgt','textrcble',
+ 'textrcheq','textrchne','textrchcs','textrchhs','textrchcc','textrchlo','textrchmi','textrchpl','textrchvs','textrchvc','textrchhi','textrchls','textrchge','textrchlt','textrchgt','textrchle',
+ 'textrcweq','textrcwne','textrcwcs','textrcwhs','textrcwcc','textrcwlo','textrcwmi','textrcwpl','textrcwvs','textrcwvc','textrcwhi','textrcwls','textrcwge','textrcwlt','textrcwgt','textrcwle',
+ 'textrmsbeq','textrmsbne','textrmsbcs','textrmsbhs','textrmsbcc','textrmsblo','textrmsbmi','textrmsbpl','textrmsbvs','textrmsbvc','textrmsbhi','textrmsbls','textrmsbge','textrmsblt','textrmsbgt','textrmsble',
+ 'textrmsheq','textrmshne','textrmshcs','textrmshhs','textrmshcc','textrmshlo','textrmshmi','textrmshpl','textrmshvs','textrmshvc','textrmshhi','textrmshls','textrmshge','textrmshlt','textrmshgt','textrmshle',
+ 'textrmsweq','textrmswne','textrmswcs','textrmswhs','textrmswcc','textrmswlo','textrmswmi','textrmswpl','textrmswvs','textrmswvc','textrmswhi','textrmswls','textrmswge','textrmswlt','textrmswgt','textrmswle',
+ 'textrmubeq','textrmubne','textrmubcs','textrmubhs','textrmubcc','textrmublo','textrmubmi','textrmubpl','textrmubvs','textrmubvc','textrmubhi','textrmubls','textrmubge','textrmublt','textrmubgt','textrmuble',
+ 'textrmuheq','textrmuhne','textrmuhcs','textrmuhhs','textrmuhcc','textrmuhlo','textrmuhmi','textrmuhpl','textrmuhvs','textrmuhvc','textrmuhhi','textrmuhls','textrmuhge','textrmuhlt','textrmuhgt','textrmuhle',
+ 'textrmuweq','textrmuwne','textrmuwcs','textrmuwhs','textrmuwcc','textrmuwlo','textrmuwmi','textrmuwpl','textrmuwvs','textrmuwvc','textrmuwhi','textrmuwls','textrmuwge','textrmuwlt','textrmuwgt','textrmuwle',
+ 'tinsrbeq','tinsrbne','tinsrbcs','tinsrbhs','tinsrbcc','tinsrblo','tinsrbmi','tinsrbpl','tinsrbvs','tinsrbvc','tinsrbhi','tinsrbls','tinsrbge','tinsrblt','tinsrbgt','tinsrble',
+ 'tinsrheq','tinsrhne','tinsrhcs','tinsrhhs','tinsrhcc','tinsrhlo','tinsrhmi','tinsrhpl','tinsrhvs','tinsrhvc','tinsrhhi','tinsrhls','tinsrhge','tinsrhlt','tinsrhgt','tinsrhle',
+ 'tinsrweq','tinsrwne','tinsrwcs','tinsrwhs','tinsrwcc','tinsrwlo','tinsrwmi','tinsrwpl','tinsrwvs','tinsrwvc','tinsrwhi','tinsrwls','tinsrwge','tinsrwlt','tinsrwgt','tinsrwle',
+ 'tmcreq','tmcrne','tmcrcs','tmcrhs','tmcrcc','tmcrlo','tmcrmi','tmcrpl','tmcrvs','tmcrvc','tmcrhi','tmcrls','tmcrge','tmcrlt','tmcrgt','tmcrle',
+ 'tmcrreq','tmcrrne','tmcrrcs','tmcrrhs','tmcrrcc','tmcrrlo','tmcrrmi','tmcrrpl','tmcrrvs','tmcrrvc','tmcrrhi','tmcrrls','tmcrrge','tmcrrlt','tmcrrgt','tmcrrle',
+ 'tmiaeq','tmiane','tmiacs','tmiahs','tmiacc','tmialo','tmiami','tmiapl','tmiavs','tmiavc','tmiahi','tmials','tmiage','tmialt','tmiagt','tmiale',
+ 'tmiapheq','tmiaphne','tmiaphcs','tmiaphhs','tmiaphcc','tmiaphlo','tmiaphmi','tmiaphpl','tmiaphvs','tmiaphvc','tmiaphhi','tmiaphls','tmiaphge','tmiaphlt','tmiaphgt','tmiaphle',
+ 'tmiabbeq','tmiabbne','tmiabbcs','tmiabbhs','tmiabbcc','tmiabblo','tmiabbmi','tmiabbpl','tmiabbvs','tmiabbvc','tmiabbhi','tmiabbls','tmiabbge','tmiabblt','tmiabbgt','tmiabble',
+ 'tmiabteq','tmiabtne','tmiabtcs','tmiabths','tmiabtcc','tmiabtlo','tmiabtmi','tmiabtpl','tmiabtvs','tmiabtvc','tmiabthi','tmiabtls','tmiabtge','tmiabtlt','tmiabtgt','tmiabtle',
+ 'tmiatbeq','tmiatbne','tmiatbcs','tmiatbhs','tmiatbcc','tmiatblo','tmiatbmi','tmiatbpl','tmiatbvs','tmiatbvc','tmiatbhi','tmiatbls','tmiatbge','tmiatblt','tmiatbgt','tmiatble',
+ 'tmiatteq','tmiattne','tmiattcs','tmiatths','tmiattcc','tmiattlo','tmiattmi','tmiattpl','tmiattvs','tmiattvc','tmiatthi','tmiattls','tmiattge','tmiattlt','tmiattgt','tmiattle',
+ 'tmovmskbeq','tmovmskbne','tmovmskbcs','tmovmskbhs','tmovmskbcc','tmovmskblo','tmovmskbmi','tmovmskbpl','tmovmskbvs','tmovmskbvc','tmovmskbhi','tmovmskbls','tmovmskbge','tmovmskblt','tmovmskbgt','tmovmskble',
+ 'tmovmskheq','tmovmskhne','tmovmskhcs','tmovmskhhs','tmovmskhcc','tmovmskhlo','tmovmskhmi','tmovmskhpl','tmovmskhvs','tmovmskhvc','tmovmskhhi','tmovmskhls','tmovmskhge','tmovmskhlt','tmovmskhgt','tmovmskhle',
+ 'tmovmskweq','tmovmskwne','tmovmskwcs','tmovmskwhs','tmovmskwcc','tmovmskwlo','tmovmskwmi','tmovmskwpl','tmovmskwvs','tmovmskwvc','tmovmskwhi','tmovmskwls','tmovmskwge','tmovmskwlt','tmovmskwgt','tmovmskwle',
+ 'tmrceq','tmrcne','tmrccs','tmrchs','tmrccc','tmrclo','tmrcmi','tmrcpl','tmrcvs','tmrcvc','tmrchi','tmrcls','tmrcge','tmrclt','tmrcgt','tmrcle',
+ 'tmrrceq','tmrrcne','tmrrccs','tmrrchs','tmrrccc','tmrrclo','tmrrcmi','tmrrcpl','tmrrcvs','tmrrcvc','tmrrchi','tmrrcls','tmrrcge','tmrrclt','tmrrcgt','tmrrcle',
+ 'torcbeq','torcbne','torcbcs','torcbhs','torcbcc','torcblo','torcbmi','torcbpl','torcbvs','torcbvc','torcbhi','torcbls','torcbge','torcblt','torcbgt','torcble',
+ 'torcheq','torchne','torchcs','torchhs','torchcc','torchlo','torchmi','torchpl','torchvs','torchvc','torchhi','torchls','torchge','torchlt','torchgt','torchle',
+ 'torcweq','torcwne','torcwcs','torcwhs','torcwcc','torcwlo','torcwmi','torcwpl','torcwvs','torcwvc','torcwhi','torcwls','torcwge','torcwlt','torcwgt','torcwle',
+ 'torvscbeq','torvscbne','torvscbcs','torvscbhs','torvscbcc','torvscblo','torvscbmi','torvscbpl','torvscbvs','torvscbvc','torvscbhi','torvscbls','torvscbge','torvscblt','torvscbgt','torvscble',
+ 'torvscheq','torvschne','torvschcs','torvschhs','torvschcc','torvschlo','torvschmi','torvschpl','torvschvs','torvschvc','torvschhi','torvschls','torvschge','torvschlt','torvschgt','torvschle',
+ 'torvscweq','torvscwne','torvscwcs','torvscwhs','torvscwcc','torvscwlo','torvscwmi','torvscwpl','torvscwvs','torvscwvc','torvscwhi','torvscwls','torvscwge','torvscwlt','torvscwgt','torvscwle',
+ 'wabsbeq','wabsbne','wabsbcs','wabsbhs','wabsbcc','wabsblo','wabsbmi','wabsbpl','wabsbvs','wabsbvc','wabsbhi','wabsbls','wabsbge','wabsblt','wabsbgt','wabsble',
+ 'wabsheq','wabshne','wabshcs','wabshhs','wabshcc','wabshlo','wabshmi','wabshpl','wabshvs','wabshvc','wabshhi','wabshls','wabshge','wabshlt','wabshgt','wabshle',
+ 'wabsweq','wabswne','wabswcs','wabswhs','wabswcc','wabswlo','wabswmi','wabswpl','wabswvs','wabswvc','wabswhi','wabswls','wabswge','wabswlt','wabswgt','wabswle',
+ 'wabsdiffbeq','wabsdiffbne','wabsdiffbcs','wabsdiffbhs','wabsdiffbcc','wabsdiffblo','wabsdiffbmi','wabsdiffbpl','wabsdiffbvs','wabsdiffbvc','wabsdiffbhi','wabsdiffbls','wabsdiffbge','wabsdiffblt','wabsdiffbgt','wabsdiffble',
+ 'wabsdiffheq','wabsdiffhne','wabsdiffhcs','wabsdiffhhs','wabsdiffhcc','wabsdiffhlo','wabsdiffhmi','wabsdiffhpl','wabsdiffhvs','wabsdiffhvc','wabsdiffhhi','wabsdiffhls','wabsdiffhge','wabsdiffhlt','wabsdiffhgt','wabsdiffhle',
+ 'wabsdiffweq','wabsdiffwne','wabsdiffwcs','wabsdiffwhs','wabsdiffwcc','wabsdiffwlo','wabsdiffwmi','wabsdiffwpl','wabsdiffwvs','wabsdiffwvc','wabsdiffwhi','wabsdiffwls','wabsdiffwge','wabsdiffwlt','wabsdiffwgt','wabsdiffwle',
+ 'waccbeq','waccbne','waccbcs','waccbhs','waccbcc','waccblo','waccbmi','waccbpl','waccbvs','waccbvc','waccbhi','waccbls','waccbge','waccblt','waccbgt','waccble',
+ 'waccheq','wacchne','wacchcs','wacchhs','wacchcc','wacchlo','wacchmi','wacchpl','wacchvs','wacchvc','wacchhi','wacchls','wacchge','wacchlt','wacchgt','wacchle',
+ 'waccweq','waccwne','waccwcs','waccwhs','waccwcc','waccwlo','waccwmi','waccwpl','waccwvs','waccwvc','waccwhi','waccwls','waccwge','waccwlt','waccwgt','waccwle',
+ 'waddbeq','waddbne','waddbcs','waddbhs','waddbcc','waddblo','waddbmi','waddbpl','waddbvs','waddbvc','waddbhi','waddbls','waddbge','waddblt','waddbgt','waddble',
+ 'waddheq','waddhne','waddhcs','waddhhs','waddhcc','waddhlo','waddhmi','waddhpl','waddhvs','waddhvc','waddhhi','waddhls','waddhge','waddhlt','waddhgt','waddhle',
+ 'waddweq','waddwne','waddwcs','waddwhs','waddwcc','waddwlo','waddwmi','waddwpl','waddwvs','waddwvc','waddwhi','waddwls','waddwge','waddwlt','waddwgt','waddwle',
+ 'waddbceq','waddbcne','waddbccs','waddbchs','waddbccc','waddbclo','waddbcmi','waddbcpl','waddbcvs','waddbcvc','waddbchi','waddbcls','waddbcge','waddbclt','waddbcgt','waddbcle',
+ 'waddhceq','waddhcne','waddhccs','waddhchs','waddhccc','waddhclo','waddhcmi','waddhcpl','waddhcvs','waddhcvc','waddhchi','waddhcls','waddhcge','waddhclt','waddhcgt','waddhcle',
+ 'waddwceq','waddwcne','waddwccs','waddwchs','waddwccc','waddwclo','waddwcmi','waddwcpl','waddwcvs','waddwcvc','waddwchi','waddwcls','waddwcge','waddwclt','waddwcgt','waddwcle',
+ 'waddbsseq','waddbssne','waddbsscs','waddbsshs','waddbsscc','waddbsslo','waddbssmi','waddbsspl','waddbssvs','waddbssvc','waddbsshi','waddbssls','waddbssge','waddbsslt','waddbssgt','waddbssle',
+ 'waddhsseq','waddhssne','waddhsscs','waddhsshs','waddhsscc','waddhsslo','waddhssmi','waddhsspl','waddhssvs','waddhssvc','waddhsshi','waddhssls','waddhssge','waddhsslt','waddhssgt','waddhssle',
+ 'waddwsseq','waddwssne','waddwsscs','waddwsshs','waddwsscc','waddwsslo','waddwssmi','waddwsspl','waddwssvs','waddwssvc','waddwsshi','waddwssls','waddwssge','waddwsslt','waddwssgt','waddwssle',
+ 'waddbuseq','waddbusne','waddbuscs','waddbushs','waddbuscc','waddbuslo','waddbusmi','waddbuspl','waddbusvs','waddbusvc','waddbushi','waddbusls','waddbusge','waddbuslt','waddbusgt','waddbusle',
+ 'waddhuseq','waddhusne','waddhuscs','waddhushs','waddhuscc','waddhuslo','waddhusmi','waddhuspl','waddhusvs','waddhusvc','waddhushi','waddhusls','waddhusge','waddhuslt','waddhusgt','waddhusle',
+ 'waddwuseq','waddwusne','waddwuscs','waddwushs','waddwuscc','waddwuslo','waddwusmi','waddwuspl','waddwusvs','waddwusvc','waddwushi','waddwusls','waddwusge','waddwuslt','waddwusgt','waddwusle',
+ 'waddsubhxeq','waddsubhxne','waddsubhxcs','waddsubhxhs','waddsubhxcc','waddsubhxlo','waddsubhxmi','waddsubhxpl','waddsubhxvs','waddsubhxvc','waddsubhxhi','waddsubhxls','waddsubhxge','waddsubhxlt','waddsubhxgt','waddsubhxle',
+ 'walignieq','walignine','walignics','walignihs','walignicc','walignilo','walignimi','walignipl','walignivs','walignivc','walignihi','walignils','walignige','walignilt','walignigt','walignile',
+ 'walignr0eq','walignr0ne','walignr0cs','walignr0hs','walignr0cc','walignr0lo','walignr0mi','walignr0pl','walignr0vs','walignr0vc','walignr0hi','walignr0ls','walignr0ge','walignr0lt','walignr0gt','walignr0le',
+ 'walignr1eq','walignr1ne','walignr1cs','walignr1hs','walignr1cc','walignr1lo','walignr1mi','walignr1pl','walignr1vs','walignr1vc','walignr1hi','walignr1ls','walignr1ge','walignr1lt','walignr1gt','walignr1le',
+ 'walignr2eq','walignr2ne','walignr2cs','walignr2hs','walignr2cc','walignr2lo','walignr2mi','walignr2pl','walignr2vs','walignr2vc','walignr2hi','walignr2ls','walignr2ge','walignr2lt','walignr2gt','walignr2le',
+ 'walignr3eq','walignr3ne','walignr3cs','walignr3hs','walignr3cc','walignr3lo','walignr3mi','walignr3pl','walignr3vs','walignr3vc','walignr3hi','walignr3ls','walignr3ge','walignr3lt','walignr3gt','walignr3le',
+ 'wandeq','wandne','wandcs','wandhs','wandcc','wandlo','wandmi','wandpl','wandvs','wandvc','wandhi','wandls','wandge','wandlt','wandgt','wandle',
+ 'wandneq','wandnne','wandncs','wandnhs','wandncc','wandnlo','wandnmi','wandnpl','wandnvs','wandnvc','wandnhi','wandnls','wandnge','wandnlt','wandngt','wandnle',
+ 'wavg2beq','wavg2bne','wavg2bcs','wavg2bhs','wavg2bcc','wavg2blo','wavg2bmi','wavg2bpl','wavg2bvs','wavg2bvc','wavg2bhi','wavg2bls','wavg2bge','wavg2blt','wavg2bgt','wavg2ble',
+ 'wavg2heq','wavg2hne','wavg2hcs','wavg2hhs','wavg2hcc','wavg2hlo','wavg2hmi','wavg2hpl','wavg2hvs','wavg2hvc','wavg2hhi','wavg2hls','wavg2hge','wavg2hlt','wavg2hgt','wavg2hle',
+ 'wavg2breq','wavg2brne','wavg2brcs','wavg2brhs','wavg2brcc','wavg2brlo','wavg2brmi','wavg2brpl','wavg2brvs','wavg2brvc','wavg2brhi','wavg2brls','wavg2brge','wavg2brlt','wavg2brgt','wavg2brle',
+ 'wavg2hreq','wavg2hrne','wavg2hrcs','wavg2hrhs','wavg2hrcc','wavg2hrlo','wavg2hrmi','wavg2hrpl','wavg2hrvs','wavg2hrvc','wavg2hrhi','wavg2hrls','wavg2hrge','wavg2hrlt','wavg2hrgt','wavg2hrle',
+ 'wavg4eq','wavg4ne','wavg4cs','wavg4hs','wavg4cc','wavg4lo','wavg4mi','wavg4pl','wavg4vs','wavg4vc','wavg4hi','wavg4ls','wavg4ge','wavg4lt','wavg4gt','wavg4le',
+ 'wavg4req','wavg4rne','wavg4rcs','wavg4rhs','wavg4rcc','wavg4rlo','wavg4rmi','wavg4rpl','wavg4rvs','wavg4rvc','wavg4rhi','wavg4rls','wavg4rge','wavg4rlt','wavg4rgt','wavg4rle',
+ 'wcmpeqbeq','wcmpeqbne','wcmpeqbcs','wcmpeqbhs','wcmpeqbcc','wcmpeqblo','wcmpeqbmi','wcmpeqbpl','wcmpeqbvs','wcmpeqbvc','wcmpeqbhi','wcmpeqbls','wcmpeqbge','wcmpeqblt','wcmpeqbgt','wcmpeqble',
+ 'wcmpeqheq','wcmpeqhne','wcmpeqhcs','wcmpeqhhs','wcmpeqhcc','wcmpeqhlo','wcmpeqhmi','wcmpeqhpl','wcmpeqhvs','wcmpeqhvc','wcmpeqhhi','wcmpeqhls','wcmpeqhge','wcmpeqhlt','wcmpeqhgt','wcmpeqhle',
+ 'wcmpeqweq','wcmpeqwne','wcmpeqwcs','wcmpeqwhs','wcmpeqwcc','wcmpeqwlo','wcmpeqwmi','wcmpeqwpl','wcmpeqwvs','wcmpeqwvc','wcmpeqwhi','wcmpeqwls','wcmpeqwge','wcmpeqwlt','wcmpeqwgt','wcmpeqwle',
+ 'wcmpgtsbeq','wcmpgtsbne','wcmpgtsbcs','wcmpgtsbhs','wcmpgtsbcc','wcmpgtsblo','wcmpgtsbmi','wcmpgtsbpl','wcmpgtsbvs','wcmpgtsbvc','wcmpgtsbhi','wcmpgtsbls','wcmpgtsbge','wcmpgtsblt','wcmpgtsbgt','wcmpgtsble',
+ 'wcmpgtsheq','wcmpgtshne','wcmpgtshcs','wcmpgtshhs','wcmpgtshcc','wcmpgtshlo','wcmpgtshmi','wcmpgtshpl','wcmpgtshvs','wcmpgtshvc','wcmpgtshhi','wcmpgtshls','wcmpgtshge','wcmpgtshlt','wcmpgtshgt','wcmpgtshle',
+ 'wcmpgtsweq','wcmpgtswne','wcmpgtswcs','wcmpgtswhs','wcmpgtswcc','wcmpgtswlo','wcmpgtswmi','wcmpgtswpl','wcmpgtswvs','wcmpgtswvc','wcmpgtswhi','wcmpgtswls','wcmpgtswge','wcmpgtswlt','wcmpgtswgt','wcmpgtswle',
+ 'wcmpgtubeq','wcmpgtubne','wcmpgtubcs','wcmpgtubhs','wcmpgtubcc','wcmpgtublo','wcmpgtubmi','wcmpgtubpl','wcmpgtubvs','wcmpgtubvc','wcmpgtubhi','wcmpgtubls','wcmpgtubge','wcmpgtublt','wcmpgtubgt','wcmpgtuble',
+ 'wcmpgtuheq','wcmpgtuhne','wcmpgtuhcs','wcmpgtuhhs','wcmpgtuhcc','wcmpgtuhlo','wcmpgtuhmi','wcmpgtuhpl','wcmpgtuhvs','wcmpgtuhvc','wcmpgtuhhi','wcmpgtuhls','wcmpgtuhge','wcmpgtuhlt','wcmpgtuhgt','wcmpgtuhle',
+ 'wcmpgtuweq','wcmpgtuwne','wcmpgtuwcs','wcmpgtuwhs','wcmpgtuwcc','wcmpgtuwlo','wcmpgtuwmi','wcmpgtuwpl','wcmpgtuwvs','wcmpgtuwvc','wcmpgtuwhi','wcmpgtuwls','wcmpgtuwge','wcmpgtuwlt','wcmpgtuwgt','wcmpgtuwle',
+ 'wldrbeq','wldrbne','wldrbcs','wldrbhs','wldrbcc','wldrblo','wldrbmi','wldrbpl','wldrbvs','wldrbvc','wldrbhi','wldrbls','wldrbge','wldrblt','wldrbgt','wldrble',
+ 'wldrheq','wldrhne','wldrhcs','wldrhhs','wldrhcc','wldrhlo','wldrhmi','wldrhpl','wldrhvs','wldrhvc','wldrhhi','wldrhls','wldrhge','wldrhlt','wldrhgt','wldrhle',
+ 'wldrweq','wldrwne','wldrwcs','wldrwhs','wldrwcc','wldrwlo','wldrwmi','wldrwpl','wldrwvs','wldrwvc','wldrwhi','wldrwls','wldrwge','wldrwlt','wldrwgt','wldrwle',
+ 'wldrdeq','wldrdne','wldrdcs','wldrdhs','wldrdcc','wldrdlo','wldrdmi','wldrdpl','wldrdvs','wldrdvc','wldrdhi','wldrdls','wldrdge','wldrdlt','wldrdgt','wldrdle',
+ 'wmacseq','wmacsne','wmacscs','wmacshs','wmacscc','wmacslo','wmacsmi','wmacspl','wmacsvs','wmacsvc','wmacshi','wmacsls','wmacsge','wmacslt','wmacsgt','wmacsle',
+ 'wmacueq','wmacune','wmacucs','wmacuhs','wmacucc','wmaculo','wmacumi','wmacupl','wmacuvs','wmacuvc','wmacuhi','wmaculs','wmacuge','wmacult','wmacugt','wmacule',
+ 'wmacszeq','wmacszne','wmacszcs','wmacszhs','wmacszcc','wmacszlo','wmacszmi','wmacszpl','wmacszvs','wmacszvc','wmacszhi','wmacszls','wmacszge','wmacszlt','wmacszgt','wmacszle',
+ 'wmacuzeq','wmacuzne','wmacuzcs','wmacuzhs','wmacuzcc','wmacuzlo','wmacuzmi','wmacuzpl','wmacuzvs','wmacuzvc','wmacuzhi','wmacuzls','wmacuzge','wmacuzlt','wmacuzgt','wmacuzle',
+ 'wmaddseq','wmaddsne','wmaddscs','wmaddshs','wmaddscc','wmaddslo','wmaddsmi','wmaddspl','wmaddsvs','wmaddsvc','wmaddshi','wmaddsls','wmaddsge','wmaddslt','wmaddsgt','wmaddsle',
+ 'wmaddueq','wmaddune','wmadducs','wmadduhs','wmadducc','wmaddulo','wmaddumi','wmaddupl','wmadduvs','wmadduvc','wmadduhi','wmadduls','wmadduge','wmaddult','wmaddugt','wmaddule',
+ 'wmaddsxeq','wmaddsxne','wmaddsxcs','wmaddsxhs','wmaddsxcc','wmaddsxlo','wmaddsxmi','wmaddsxpl','wmaddsxvs','wmaddsxvc','wmaddsxhi','wmaddsxls','wmaddsxge','wmaddsxlt','wmaddsxgt','wmaddsxle',
+ 'wmadduxeq','wmadduxne','wmadduxcs','wmadduxhs','wmadduxcc','wmadduxlo','wmadduxmi','wmadduxpl','wmadduxvs','wmadduxvc','wmadduxhi','wmadduxls','wmadduxge','wmadduxlt','wmadduxgt','wmadduxle',
+ 'wmaddsneq','wmaddsnne','wmaddsncs','wmaddsnhs','wmaddsncc','wmaddsnlo','wmaddsnmi','wmaddsnpl','wmaddsnvs','wmaddsnvc','wmaddsnhi','wmaddsnls','wmaddsnge','wmaddsnlt','wmaddsngt','wmaddsnle',
+ 'wmadduneq','wmaddunne','wmadduncs','wmaddunhs','wmadduncc','wmaddunlo','wmaddunmi','wmaddunpl','wmaddunvs','wmaddunvc','wmaddunhi','wmaddunls','wmaddunge','wmaddunlt','wmaddungt','wmaddunle',
+ 'wmaxsbeq','wmaxsbne','wmaxsbcs','wmaxsbhs','wmaxsbcc','wmaxsblo','wmaxsbmi','wmaxsbpl','wmaxsbvs','wmaxsbvc','wmaxsbhi','wmaxsbls','wmaxsbge','wmaxsblt','wmaxsbgt','wmaxsble',
+ 'wmaxsheq','wmaxshne','wmaxshcs','wmaxshhs','wmaxshcc','wmaxshlo','wmaxshmi','wmaxshpl','wmaxshvs','wmaxshvc','wmaxshhi','wmaxshls','wmaxshge','wmaxshlt','wmaxshgt','wmaxshle',
+ 'wmaxsweq','wmaxswne','wmaxswcs','wmaxswhs','wmaxswcc','wmaxswlo','wmaxswmi','wmaxswpl','wmaxswvs','wmaxswvc','wmaxswhi','wmaxswls','wmaxswge','wmaxswlt','wmaxswgt','wmaxswle',
+ 'wmaxubeq','wmaxubne','wmaxubcs','wmaxubhs','wmaxubcc','wmaxublo','wmaxubmi','wmaxubpl','wmaxubvs','wmaxubvc','wmaxubhi','wmaxubls','wmaxubge','wmaxublt','wmaxubgt','wmaxuble',
+ 'wmaxuheq','wmaxuhne','wmaxuhcs','wmaxuhhs','wmaxuhcc','wmaxuhlo','wmaxuhmi','wmaxuhpl','wmaxuhvs','wmaxuhvc','wmaxuhhi','wmaxuhls','wmaxuhge','wmaxuhlt','wmaxuhgt','wmaxuhle',
+ 'wmaxuweq','wmaxuwne','wmaxuwcs','wmaxuwhs','wmaxuwcc','wmaxuwlo','wmaxuwmi','wmaxuwpl','wmaxuwvs','wmaxuwvc','wmaxuwhi','wmaxuwls','wmaxuwge','wmaxuwlt','wmaxuwgt','wmaxuwle',
+ 'wmergeeq','wmergene','wmergecs','wmergehs','wmergecc','wmergelo','wmergemi','wmergepl','wmergevs','wmergevc','wmergehi','wmergels','wmergege','wmergelt','wmergegt','wmergele',
+ 'wmiabbeq','wmiabbne','wmiabbcs','wmiabbhs','wmiabbcc','wmiabblo','wmiabbmi','wmiabbpl','wmiabbvs','wmiabbvc','wmiabbhi','wmiabbls','wmiabbge','wmiabblt','wmiabbgt','wmiabble',
+ 'wmiabteq','wmiabtne','wmiabtcs','wmiabths','wmiabtcc','wmiabtlo','wmiabtmi','wmiabtpl','wmiabtvs','wmiabtvc','wmiabthi','wmiabtls','wmiabtge','wmiabtlt','wmiabtgt','wmiabtle',
+ 'wmiatbeq','wmiatbne','wmiatbcs','wmiatbhs','wmiatbcc','wmiatblo','wmiatbmi','wmiatbpl','wmiatbvs','wmiatbvc','wmiatbhi','wmiatbls','wmiatbge','wmiatblt','wmiatbgt','wmiatble',
+ 'wmiatteq','wmiattne','wmiattcs','wmiatths','wmiattcc','wmiattlo','wmiattmi','wmiattpl','wmiattvs','wmiattvc','wmiatthi','wmiattls','wmiattge','wmiattlt','wmiattgt','wmiattle',
+ 'wmiabbneq','wmiabbnne','wmiabbncs','wmiabbnhs','wmiabbncc','wmiabbnlo','wmiabbnmi','wmiabbnpl','wmiabbnvs','wmiabbnvc','wmiabbnhi','wmiabbnls','wmiabbnge','wmiabbnlt','wmiabbngt','wmiabbnle',
+ 'wmiabtneq','wmiabtnne','wmiabtncs','wmiabtnhs','wmiabtncc','wmiabtnlo','wmiabtnmi','wmiabtnpl','wmiabtnvs','wmiabtnvc','wmiabtnhi','wmiabtnls','wmiabtnge','wmiabtnlt','wmiabtngt','wmiabtnle',
+ 'wmiatbneq','wmiatbnne','wmiatbncs','wmiatbnhs','wmiatbncc','wmiatbnlo','wmiatbnmi','wmiatbnpl','wmiatbnvs','wmiatbnvc','wmiatbnhi','wmiatbnls','wmiatbnge','wmiatbnlt','wmiatbngt','wmiatbnle',
+ 'wmiattneq','wmiattnne','wmiattncs','wmiattnhs','wmiattncc','wmiattnlo','wmiattnmi','wmiattnpl','wmiattnvs','wmiattnvc','wmiattnhi','wmiattnls','wmiattnge','wmiattnlt','wmiattngt','wmiattnle',
+ 'wmiawbbeq','wmiawbbne','wmiawbbcs','wmiawbbhs','wmiawbbcc','wmiawbblo','wmiawbbmi','wmiawbbpl','wmiawbbvs','wmiawbbvc','wmiawbbhi','wmiawbbls','wmiawbbge','wmiawbblt','wmiawbbgt','wmiawbble',
+ 'wmiawbteq','wmiawbtne','wmiawbtcs','wmiawbths','wmiawbtcc','wmiawbtlo','wmiawbtmi','wmiawbtpl','wmiawbtvs','wmiawbtvc','wmiawbthi','wmiawbtls','wmiawbtge','wmiawbtlt','wmiawbtgt','wmiawbtle',
+ 'wmiawtbeq','wmiawtbne','wmiawtbcs','wmiawtbhs','wmiawtbcc','wmiawtblo','wmiawtbmi','wmiawtbpl','wmiawtbvs','wmiawtbvc','wmiawtbhi','wmiawtbls','wmiawtbge','wmiawtblt','wmiawtbgt','wmiawtble',
+ 'wmiawtteq','wmiawttne','wmiawttcs','wmiawtths','wmiawttcc','wmiawttlo','wmiawttmi','wmiawttpl','wmiawttvs','wmiawttvc','wmiawtthi','wmiawttls','wmiawttge','wmiawttlt','wmiawttgt','wmiawttle',
+ 'wmiawbbneq','wmiawbbnne','wmiawbbncs','wmiawbbnhs','wmiawbbncc','wmiawbbnlo','wmiawbbnmi','wmiawbbnpl','wmiawbbnvs','wmiawbbnvc','wmiawbbnhi','wmiawbbnls','wmiawbbnge','wmiawbbnlt','wmiawbbngt','wmiawbbnle',
+ 'wmiawbtneq','wmiawbtnne','wmiawbtncs','wmiawbtnhs','wmiawbtncc','wmiawbtnlo','wmiawbtnmi','wmiawbtnpl','wmiawbtnvs','wmiawbtnvc','wmiawbtnhi','wmiawbtnls','wmiawbtnge','wmiawbtnlt','wmiawbtngt','wmiawbtnle',
+ 'wmiawtbneq','wmiawtbnne','wmiawtbncs','wmiawtbnhs','wmiawtbncc','wmiawtbnlo','wmiawtbnmi','wmiawtbnpl','wmiawtbnvs','wmiawtbnvc','wmiawtbnhi','wmiawtbnls','wmiawtbnge','wmiawtbnlt','wmiawtbngt','wmiawtbnle',
+ 'wmiawttneq','wmiawttnne','wmiawttncs','wmiawttnhs','wmiawttncc','wmiawttnlo','wmiawttnmi','wmiawttnpl','wmiawttnvs','wmiawttnvc','wmiawttnhi','wmiawttnls','wmiawttnge','wmiawttnlt','wmiawttngt','wmiawttnle',
+ 'wminsbeq','wminsbne','wminsbcs','wminsbhs','wminsbcc','wminsblo','wminsbmi','wminsbpl','wminsbvs','wminsbvc','wminsbhi','wminsbls','wminsbge','wminsblt','wminsbgt','wminsble',
+ 'wminsheq','wminshne','wminshcs','wminshhs','wminshcc','wminshlo','wminshmi','wminshpl','wminshvs','wminshvc','wminshhi','wminshls','wminshge','wminshlt','wminshgt','wminshle',
+ 'wminsweq','wminswne','wminswcs','wminswhs','wminswcc','wminswlo','wminswmi','wminswpl','wminswvs','wminswvc','wminswhi','wminswls','wminswge','wminswlt','wminswgt','wminswle',
+ 'wminubeq','wminubne','wminubcs','wminubhs','wminubcc','wminublo','wminubmi','wminubpl','wminubvs','wminubvc','wminubhi','wminubls','wminubge','wminublt','wminubgt','wminuble',
+ 'wminuheq','wminuhne','wminuhcs','wminuhhs','wminuhcc','wminuhlo','wminuhmi','wminuhpl','wminuhvs','wminuhvc','wminuhhi','wminuhls','wminuhge','wminuhlt','wminuhgt','wminuhle',
+ 'wminuweq','wminuwne','wminuwcs','wminuwhs','wminuwcc','wminuwlo','wminuwmi','wminuwpl','wminuwvs','wminuwvc','wminuwhi','wminuwls','wminuwge','wminuwlt','wminuwgt','wminuwle',
+ 'wmoveq','wmovne','wmovcs','wmovhs','wmovcc','wmovlo','wmovmi','wmovpl','wmovvs','wmovvc','wmovhi','wmovls','wmovge','wmovlt','wmovgt','wmovle',
+ 'wmulsmeq','wmulsmne','wmulsmcs','wmulsmhs','wmulsmcc','wmulsmlo','wmulsmmi','wmulsmpl','wmulsmvs','wmulsmvc','wmulsmhi','wmulsmls','wmulsmge','wmulsmlt','wmulsmgt','wmulsmle',
+ 'wmulsleq','wmulslne','wmulslcs','wmulslhs','wmulslcc','wmulsllo','wmulslmi','wmulslpl','wmulslvs','wmulslvc','wmulslhi','wmulslls','wmulslge','wmulsllt','wmulslgt','wmulslle',
+ 'wmulumeq','wmulumne','wmulumcs','wmulumhs','wmulumcc','wmulumlo','wmulummi','wmulumpl','wmulumvs','wmulumvc','wmulumhi','wmulumls','wmulumge','wmulumlt','wmulumgt','wmulumle',
+ 'wmululeq','wmululne','wmululcs','wmululhs','wmululcc','wmulullo','wmululmi','wmululpl','wmululvs','wmululvc','wmululhi','wmululls','wmululge','wmulullt','wmululgt','wmululle',
+ 'wmulsmreq','wmulsmrne','wmulsmrcs','wmulsmrhs','wmulsmrcc','wmulsmrlo','wmulsmrmi','wmulsmrpl','wmulsmrvs','wmulsmrvc','wmulsmrhi','wmulsmrls','wmulsmrge','wmulsmrlt','wmulsmrgt','wmulsmrle',
+ 'wmulslreq','wmulslrne','wmulslrcs','wmulslrhs','wmulslrcc','wmulslrlo','wmulslrmi','wmulslrpl','wmulslrvs','wmulslrvc','wmulslrhi','wmulslrls','wmulslrge','wmulslrlt','wmulslrgt','wmulslrle',
+ 'wmulumreq','wmulumrne','wmulumrcs','wmulumrhs','wmulumrcc','wmulumrlo','wmulumrmi','wmulumrpl','wmulumrvs','wmulumrvc','wmulumrhi','wmulumrls','wmulumrge','wmulumrlt','wmulumrgt','wmulumrle',
+ 'wmululreq','wmululrne','wmululrcs','wmululrhs','wmululrcc','wmululrlo','wmululrmi','wmululrpl','wmululrvs','wmululrvc','wmululrhi','wmululrls','wmululrge','wmululrlt','wmululrgt','wmululrle',
+ 'wmulwumeq','wmulwumne','wmulwumcs','wmulwumhs','wmulwumcc','wmulwumlo','wmulwummi','wmulwumpl','wmulwumvs','wmulwumvc','wmulwumhi','wmulwumls','wmulwumge','wmulwumlt','wmulwumgt','wmulwumle',
+ 'wmulwsmeq','wmulwsmne','wmulwsmcs','wmulwsmhs','wmulwsmcc','wmulwsmlo','wmulwsmmi','wmulwsmpl','wmulwsmvs','wmulwsmvc','wmulwsmhi','wmulwsmls','wmulwsmge','wmulwsmlt','wmulwsmgt','wmulwsmle',
+ 'wmulwleq','wmulwlne','wmulwlcs','wmulwlhs','wmulwlcc','wmulwllo','wmulwlmi','wmulwlpl','wmulwlvs','wmulwlvc','wmulwlhi','wmulwlls','wmulwlge','wmulwllt','wmulwlgt','wmulwlle',
+ 'wmulwumreq','wmulwumrne','wmulwumrcs','wmulwumrhs','wmulwumrcc','wmulwumrlo','wmulwumrmi','wmulwumrpl','wmulwumrvs','wmulwumrvc','wmulwumrhi','wmulwumrls','wmulwumrge','wmulwumrlt','wmulwumrgt','wmulwumrle',
+ 'wmulwsmreq','wmulwsmrne','wmulwsmrcs','wmulwsmrhs','wmulwsmrcc','wmulwsmrlo','wmulwsmrmi','wmulwsmrpl','wmulwsmrvs','wmulwsmrvc','wmulwsmrhi','wmulwsmrls','wmulwsmrge','wmulwsmrlt','wmulwsmrgt','wmulwsmrle',
+ 'woreq','worne','worcs','worhs','worcc','worlo','wormi','worpl','worvs','worvc','worhi','worls','worge','worlt','worgt','worle',
+ 'wpackhsseq','wpackhssne','wpackhsscs','wpackhsshs','wpackhsscc','wpackhsslo','wpackhssmi','wpackhsspl','wpackhssvs','wpackhssvc','wpackhsshi','wpackhssls','wpackhssge','wpackhsslt','wpackhssgt','wpackhssle',
+ 'wpackwsseq','wpackwssne','wpackwsscs','wpackwsshs','wpackwsscc','wpackwsslo','wpackwssmi','wpackwsspl','wpackwssvs','wpackwssvc','wpackwsshi','wpackwssls','wpackwssge','wpackwsslt','wpackwssgt','wpackwssle',
+ 'wpackdsseq','wpackdssne','wpackdsscs','wpackdsshs','wpackdsscc','wpackdsslo','wpackdssmi','wpackdsspl','wpackdssvs','wpackdssvc','wpackdsshi','wpackdssls','wpackdssge','wpackdsslt','wpackdssgt','wpackdssle',
+ 'wpackhuseq','wpackhusne','wpackhuscs','wpackhushs','wpackhuscc','wpackhuslo','wpackhusmi','wpackhuspl','wpackhusvs','wpackhusvc','wpackhushi','wpackhusls','wpackhusge','wpackhuslt','wpackhusgt','wpackhusle',
+ 'wpackwuseq','wpackwusne','wpackwuscs','wpackwushs','wpackwuscc','wpackwuslo','wpackwusmi','wpackwuspl','wpackwusvs','wpackwusvc','wpackwushi','wpackwusls','wpackwusge','wpackwuslt','wpackwusgt','wpackwusle',
+ 'wpackduseq','wpackdusne','wpackduscs','wpackdushs','wpackduscc','wpackduslo','wpackdusmi','wpackduspl','wpackdusvs','wpackdusvc','wpackdushi','wpackdusls','wpackdusge','wpackduslt','wpackdusgt','wpackdusle',
+ 'wqmiabbeq','wqmiabbne','wqmiabbcs','wqmiabbhs','wqmiabbcc','wqmiabblo','wqmiabbmi','wqmiabbpl','wqmiabbvs','wqmiabbvc','wqmiabbhi','wqmiabbls','wqmiabbge','wqmiabblt','wqmiabbgt','wqmiabble',
+ 'wqmiabteq','wqmiabtne','wqmiabtcs','wqmiabths','wqmiabtcc','wqmiabtlo','wqmiabtmi','wqmiabtpl','wqmiabtvs','wqmiabtvc','wqmiabthi','wqmiabtls','wqmiabtge','wqmiabtlt','wqmiabtgt','wqmiabtle',
+ 'wqmiatbeq','wqmiatbne','wqmiatbcs','wqmiatbhs','wqmiatbcc','wqmiatblo','wqmiatbmi','wqmiatbpl','wqmiatbvs','wqmiatbvc','wqmiatbhi','wqmiatbls','wqmiatbge','wqmiatblt','wqmiatbgt','wqmiatble',
+ 'wqmiatteq','wqmiattne','wqmiattcs','wqmiatths','wqmiattcc','wqmiattlo','wqmiattmi','wqmiattpl','wqmiattvs','wqmiattvc','wqmiatthi','wqmiattls','wqmiattge','wqmiattlt','wqmiattgt','wqmiattle',
+ 'wqmiabbneq','wqmiabbnne','wqmiabbncs','wqmiabbnhs','wqmiabbncc','wqmiabbnlo','wqmiabbnmi','wqmiabbnpl','wqmiabbnvs','wqmiabbnvc','wqmiabbnhi','wqmiabbnls','wqmiabbnge','wqmiabbnlt','wqmiabbngt','wqmiabbnle',
+ 'wqmiabtneq','wqmiabtnne','wqmiabtncs','wqmiabtnhs','wqmiabtncc','wqmiabtnlo','wqmiabtnmi','wqmiabtnpl','wqmiabtnvs','wqmiabtnvc','wqmiabtnhi','wqmiabtnls','wqmiabtnge','wqmiabtnlt','wqmiabtngt','wqmiabtnle',
+ 'wqmiatbneq','wqmiatbnne','wqmiatbncs','wqmiatbnhs','wqmiatbncc','wqmiatbnlo','wqmiatbnmi','wqmiatbnpl','wqmiatbnvs','wqmiatbnvc','wqmiatbnhi','wqmiatbnls','wqmiatbnge','wqmiatbnlt','wqmiatbngt','wqmiatbnle',
+ 'wqmiattneq','wqmiattnne','wqmiattncs','wqmiattnhs','wqmiattncc','wqmiattnlo','wqmiattnmi','wqmiattnpl','wqmiattnvs','wqmiattnvc','wqmiattnhi','wqmiattnls','wqmiattnge','wqmiattnlt','wqmiattngt','wqmiattnle',
+ 'wqmulmeq','wqmulmne','wqmulmcs','wqmulmhs','wqmulmcc','wqmulmlo','wqmulmmi','wqmulmpl','wqmulmvs','wqmulmvc','wqmulmhi','wqmulmls','wqmulmge','wqmulmlt','wqmulmgt','wqmulmle',
+ 'wqmulmreq','wqmulmrne','wqmulmrcs','wqmulmrhs','wqmulmrcc','wqmulmrlo','wqmulmrmi','wqmulmrpl','wqmulmrvs','wqmulmrvc','wqmulmrhi','wqmulmrls','wqmulmrge','wqmulmrlt','wqmulmrgt','wqmulmrle',
+ 'wqmulwmeq','wqmulwmne','wqmulwmcs','wqmulwmhs','wqmulwmcc','wqmulwmlo','wqmulwmmi','wqmulwmpl','wqmulwmvs','wqmulwmvc','wqmulwmhi','wqmulwmls','wqmulwmge','wqmulwmlt','wqmulwmgt','wqmulwmle',
+ 'wqmulwmreq','wqmulwmrne','wqmulwmrcs','wqmulwmrhs','wqmulwmrcc','wqmulwmrlo','wqmulwmrmi','wqmulwmrpl','wqmulwmrvs','wqmulwmrvc','wqmulwmrhi','wqmulwmrls','wqmulwmrge','wqmulwmrlt','wqmulwmrgt','wqmulwmrle',
+ 'wrorheq','wrorhne','wrorhcs','wrorhhs','wrorhcc','wrorhlo','wrorhmi','wrorhpl','wrorhvs','wrorhvc','wrorhhi','wrorhls','wrorhge','wrorhlt','wrorhgt','wrorhle',
+ 'wrorweq','wrorwne','wrorwcs','wrorwhs','wrorwcc','wrorwlo','wrorwmi','wrorwpl','wrorwvs','wrorwvc','wrorwhi','wrorwls','wrorwge','wrorwlt','wrorwgt','wrorwle',
+ 'wrordeq','wrordne','wrordcs','wrordhs','wrordcc','wrordlo','wrordmi','wrordpl','wrordvs','wrordvc','wrordhi','wrordls','wrordge','wrordlt','wrordgt','wrordle',
+ 'wrorhgeq','wrorhgne','wrorhgcs','wrorhghs','wrorhgcc','wrorhglo','wrorhgmi','wrorhgpl','wrorhgvs','wrorhgvc','wrorhghi','wrorhgls','wrorhgge','wrorhglt','wrorhggt','wrorhgle',
+ 'wrorwgeq','wrorwgne','wrorwgcs','wrorwghs','wrorwgcc','wrorwglo','wrorwgmi','wrorwgpl','wrorwgvs','wrorwgvc','wrorwghi','wrorwgls','wrorwgge','wrorwglt','wrorwggt','wrorwgle',
+ 'wrordgeq','wrordgne','wrordgcs','wrordghs','wrordgcc','wrordglo','wrordgmi','wrordgpl','wrordgvs','wrordgvc','wrordghi','wrordgls','wrordgge','wrordglt','wrordggt','wrordgle',
+ 'wsadbeq','wsadbne','wsadbcs','wsadbhs','wsadbcc','wsadblo','wsadbmi','wsadbpl','wsadbvs','wsadbvc','wsadbhi','wsadbls','wsadbge','wsadblt','wsadbgt','wsadble',
+ 'wsadheq','wsadhne','wsadhcs','wsadhhs','wsadhcc','wsadhlo','wsadhmi','wsadhpl','wsadhvs','wsadhvc','wsadhhi','wsadhls','wsadhge','wsadhlt','wsadhgt','wsadhle',
+ 'wsadbzeq','wsadbzne','wsadbzcs','wsadbzhs','wsadbzcc','wsadbzlo','wsadbzmi','wsadbzpl','wsadbzvs','wsadbzvc','wsadbzhi','wsadbzls','wsadbzge','wsadbzlt','wsadbzgt','wsadbzle',
+ 'wsadhzeq','wsadhzne','wsadhzcs','wsadhzhs','wsadhzcc','wsadhzlo','wsadhzmi','wsadhzpl','wsadhzvs','wsadhzvc','wsadhzhi','wsadhzls','wsadhzge','wsadhzlt','wsadhzgt','wsadhzle',
+ 'wshufheq','wshufhne','wshufhcs','wshufhhs','wshufhcc','wshufhlo','wshufhmi','wshufhpl','wshufhvs','wshufhvc','wshufhhi','wshufhls','wshufhge','wshufhlt','wshufhgt','wshufhle',
+ 'wsllheq','wsllhne','wsllhcs','wsllhhs','wsllhcc','wsllhlo','wsllhmi','wsllhpl','wsllhvs','wsllhvc','wsllhhi','wsllhls','wsllhge','wsllhlt','wsllhgt','wsllhle',
+ 'wsllweq','wsllwne','wsllwcs','wsllwhs','wsllwcc','wsllwlo','wsllwmi','wsllwpl','wsllwvs','wsllwvc','wsllwhi','wsllwls','wsllwge','wsllwlt','wsllwgt','wsllwle',
+ 'wslldeq','wslldne','wslldcs','wslldhs','wslldcc','wslldlo','wslldmi','wslldpl','wslldvs','wslldvc','wslldhi','wslldls','wslldge','wslldlt','wslldgt','wslldle',
+ 'wsllhgeq','wsllhgne','wsllhgcs','wsllhghs','wsllhgcc','wsllhglo','wsllhgmi','wsllhgpl','wsllhgvs','wsllhgvc','wsllhghi','wsllhgls','wsllhgge','wsllhglt','wsllhggt','wsllhgle',
+ 'wsllwgeq','wsllwgne','wsllwgcs','wsllwghs','wsllwgcc','wsllwglo','wsllwgmi','wsllwgpl','wsllwgvs','wsllwgvc','wsllwghi','wsllwgls','wsllwgge','wsllwglt','wsllwggt','wsllwgle',
+ 'wslldgeq','wslldgne','wslldgcs','wslldghs','wslldgcc','wslldglo','wslldgmi','wslldgpl','wslldgvs','wslldgvc','wslldghi','wslldgls','wslldgge','wslldglt','wslldggt','wslldgle',
+ 'wsraheq','wsrahne','wsrahcs','wsrahhs','wsrahcc','wsrahlo','wsrahmi','wsrahpl','wsrahvs','wsrahvc','wsrahhi','wsrahls','wsrahge','wsrahlt','wsrahgt','wsrahle',
+ 'wsraweq','wsrawne','wsrawcs','wsrawhs','wsrawcc','wsrawlo','wsrawmi','wsrawpl','wsrawvs','wsrawvc','wsrawhi','wsrawls','wsrawge','wsrawlt','wsrawgt','wsrawle',
+ 'wsradeq','wsradne','wsradcs','wsradhs','wsradcc','wsradlo','wsradmi','wsradpl','wsradvs','wsradvc','wsradhi','wsradls','wsradge','wsradlt','wsradgt','wsradle',
+ 'wsrahgeq','wsrahgne','wsrahgcs','wsrahghs','wsrahgcc','wsrahglo','wsrahgmi','wsrahgpl','wsrahgvs','wsrahgvc','wsrahghi','wsrahgls','wsrahgge','wsrahglt','wsrahggt','wsrahgle',
+ 'wsrawgeq','wsrawgne','wsrawgcs','wsrawghs','wsrawgcc','wsrawglo','wsrawgmi','wsrawgpl','wsrawgvs','wsrawgvc','wsrawghi','wsrawgls','wsrawgge','wsrawglt','wsrawggt','wsrawgle',
+ 'wsradgeq','wsradgne','wsradgcs','wsradghs','wsradgcc','wsradglo','wsradgmi','wsradgpl','wsradgvs','wsradgvc','wsradghi','wsradgls','wsradgge','wsradglt','wsradggt','wsradgle',
+ 'wsrlheq','wsrlhne','wsrlhcs','wsrlhhs','wsrlhcc','wsrlhlo','wsrlhmi','wsrlhpl','wsrlhvs','wsrlhvc','wsrlhhi','wsrlhls','wsrlhge','wsrlhlt','wsrlhgt','wsrlhle',
+ 'wsrlweq','wsrlwne','wsrlwcs','wsrlwhs','wsrlwcc','wsrlwlo','wsrlwmi','wsrlwpl','wsrlwvs','wsrlwvc','wsrlwhi','wsrlwls','wsrlwge','wsrlwlt','wsrlwgt','wsrlwle',
+ 'wsrldeq','wsrldne','wsrldcs','wsrldhs','wsrldcc','wsrldlo','wsrldmi','wsrldpl','wsrldvs','wsrldvc','wsrldhi','wsrldls','wsrldge','wsrldlt','wsrldgt','wsrldle',
+ 'wsrlhgeq','wsrlhgne','wsrlhgcs','wsrlhghs','wsrlhgcc','wsrlhglo','wsrlhgmi','wsrlhgpl','wsrlhgvs','wsrlhgvc','wsrlhghi','wsrlhgls','wsrlhgge','wsrlhglt','wsrlhggt','wsrlhgle',
+ 'wsrlwgeq','wsrlwgne','wsrlwgcs','wsrlwghs','wsrlwgcc','wsrlwglo','wsrlwgmi','wsrlwgpl','wsrlwgvs','wsrlwgvc','wsrlwghi','wsrlwgls','wsrlwgge','wsrlwglt','wsrlwggt','wsrlwgle',
+ 'wsrldgeq','wsrldgne','wsrldgcs','wsrldghs','wsrldgcc','wsrldglo','wsrldgmi','wsrldgpl','wsrldgvs','wsrldgvc','wsrldghi','wsrldgls','wsrldgge','wsrldglt','wsrldggt','wsrldgle',
+ 'wstrbeq','wstrbne','wstrbcs','wstrbhs','wstrbcc','wstrblo','wstrbmi','wstrbpl','wstrbvs','wstrbvc','wstrbhi','wstrbls','wstrbge','wstrblt','wstrbgt','wstrble',
+ 'wstrheq','wstrhne','wstrhcs','wstrhhs','wstrhcc','wstrhlo','wstrhmi','wstrhpl','wstrhvs','wstrhvc','wstrhhi','wstrhls','wstrhge','wstrhlt','wstrhgt','wstrhle',
+ 'wstrweq','wstrwne','wstrwcs','wstrwhs','wstrwcc','wstrwlo','wstrwmi','wstrwpl','wstrwvs','wstrwvc','wstrwhi','wstrwls','wstrwge','wstrwlt','wstrwgt','wstrwle',
+ 'wstrdeq','wstrdne','wstrdcs','wstrdhs','wstrdcc','wstrdlo','wstrdmi','wstrdpl','wstrdvs','wstrdvc','wstrdhi','wstrdls','wstrdge','wstrdlt','wstrdgt','wstrdle',
+ 'wsubbeq','wsubbne','wsubbcs','wsubbhs','wsubbcc','wsubblo','wsubbmi','wsubbpl','wsubbvs','wsubbvc','wsubbhi','wsubbls','wsubbge','wsubblt','wsubbgt','wsubble',
+ 'wsubheq','wsubhne','wsubhcs','wsubhhs','wsubhcc','wsubhlo','wsubhmi','wsubhpl','wsubhvs','wsubhvc','wsubhhi','wsubhls','wsubhge','wsubhlt','wsubhgt','wsubhle',
+ 'wsubweq','wsubwne','wsubwcs','wsubwhs','wsubwcc','wsubwlo','wsubwmi','wsubwpl','wsubwvs','wsubwvc','wsubwhi','wsubwls','wsubwge','wsubwlt','wsubwgt','wsubwle',
+ 'wsubbsseq','wsubbssne','wsubbsscs','wsubbsshs','wsubbsscc','wsubbsslo','wsubbssmi','wsubbsspl','wsubbssvs','wsubbssvc','wsubbsshi','wsubbssls','wsubbssge','wsubbsslt','wsubbssgt','wsubbssle',
+ 'wsubhsseq','wsubhssne','wsubhsscs','wsubhsshs','wsubhsscc','wsubhsslo','wsubhssmi','wsubhsspl','wsubhssvs','wsubhssvc','wsubhsshi','wsubhssls','wsubhssge','wsubhsslt','wsubhssgt','wsubhssle',
+ 'wsubwsseq','wsubwssne','wsubwsscs','wsubwsshs','wsubwsscc','wsubwsslo','wsubwssmi','wsubwsspl','wsubwssvs','wsubwssvc','wsubwsshi','wsubwssls','wsubwssge','wsubwsslt','wsubwssgt','wsubwssle',
+ 'wsubbuseq','wsubbusne','wsubbuscs','wsubbushs','wsubbuscc','wsubbuslo','wsubbusmi','wsubbuspl','wsubbusvs','wsubbusvc','wsubbushi','wsubbusls','wsubbusge','wsubbuslt','wsubbusgt','wsubbusle',
+ 'wsubhuseq','wsubhusne','wsubhuscs','wsubhushs','wsubhuscc','wsubhuslo','wsubhusmi','wsubhuspl','wsubhusvs','wsubhusvc','wsubhushi','wsubhusls','wsubhusge','wsubhuslt','wsubhusgt','wsubhusle',
+ 'wsubwuseq','wsubwusne','wsubwuscs','wsubwushs','wsubwuscc','wsubwuslo','wsubwusmi','wsubwuspl','wsubwusvs','wsubwusvc','wsubwushi','wsubwusls','wsubwusge','wsubwuslt','wsubwusgt','wsubwusle',
+ 'wsubaddhxeq','wsubaddhxne','wsubaddhxcs','wsubaddhxhs','wsubaddhxcc','wsubaddhxlo','wsubaddhxmi','wsubaddhxpl','wsubaddhxvs','wsubaddhxvc','wsubaddhxhi','wsubaddhxls','wsubaddhxge','wsubaddhxlt','wsubaddhxgt','wsubaddhxle',
+ 'wunpckehsbeq','wunpckehsbne','wunpckehsbcs','wunpckehsbhs','wunpckehsbcc','wunpckehsblo','wunpckehsbmi','wunpckehsbpl','wunpckehsbvs','wunpckehsbvc','wunpckehsbhi','wunpckehsbls','wunpckehsbge','wunpckehsblt','wunpckehsbgt','wunpckehsble',
+ 'wunpckehsheq','wunpckehshne','wunpckehshcs','wunpckehshhs','wunpckehshcc','wunpckehshlo','wunpckehshmi','wunpckehshpl','wunpckehshvs','wunpckehshvc','wunpckehshhi','wunpckehshls','wunpckehshge','wunpckehshlt','wunpckehshgt','wunpckehshle',
+ 'wunpckehsweq','wunpckehswne','wunpckehswcs','wunpckehswhs','wunpckehswcc','wunpckehswlo','wunpckehswmi','wunpckehswpl','wunpckehswvs','wunpckehswvc','wunpckehswhi','wunpckehswls','wunpckehswge','wunpckehswlt','wunpckehswgt','wunpckehswle',
+ 'wunpckehubeq','wunpckehubne','wunpckehubcs','wunpckehubhs','wunpckehubcc','wunpckehublo','wunpckehubmi','wunpckehubpl','wunpckehubvs','wunpckehubvc','wunpckehubhi','wunpckehubls','wunpckehubge','wunpckehublt','wunpckehubgt','wunpckehuble',
+ 'wunpckehuheq','wunpckehuhne','wunpckehuhcs','wunpckehuhhs','wunpckehuhcc','wunpckehuhlo','wunpckehuhmi','wunpckehuhpl','wunpckehuhvs','wunpckehuhvc','wunpckehuhhi','wunpckehuhls','wunpckehuhge','wunpckehuhlt','wunpckehuhgt','wunpckehuhle',
+ 'wunpckehuweq','wunpckehuwne','wunpckehuwcs','wunpckehuwhs','wunpckehuwcc','wunpckehuwlo','wunpckehuwmi','wunpckehuwpl','wunpckehuwvs','wunpckehuwvc','wunpckehuwhi','wunpckehuwls','wunpckehuwge','wunpckehuwlt','wunpckehuwgt','wunpckehuwle',
+ 'wunpckihbeq','wunpckihbne','wunpckihbcs','wunpckihbhs','wunpckihbcc','wunpckihblo','wunpckihbmi','wunpckihbpl','wunpckihbvs','wunpckihbvc','wunpckihbhi','wunpckihbls','wunpckihbge','wunpckihblt','wunpckihbgt','wunpckihble',
+ 'wunpckihheq','wunpckihhne','wunpckihhcs','wunpckihhhs','wunpckihhcc','wunpckihhlo','wunpckihhmi','wunpckihhpl','wunpckihhvs','wunpckihhvc','wunpckihhhi','wunpckihhls','wunpckihhge','wunpckihhlt','wunpckihhgt','wunpckihhle',
+ 'wunpckihweq','wunpckihwne','wunpckihwcs','wunpckihwhs','wunpckihwcc','wunpckihwlo','wunpckihwmi','wunpckihwpl','wunpckihwvs','wunpckihwvc','wunpckihwhi','wunpckihwls','wunpckihwge','wunpckihwlt','wunpckihwgt','wunpckihwle',
+ 'wunpckelsbeq','wunpckelsbne','wunpckelsbcs','wunpckelsbhs','wunpckelsbcc','wunpckelsblo','wunpckelsbmi','wunpckelsbpl','wunpckelsbvs','wunpckelsbvc','wunpckelsbhi','wunpckelsbls','wunpckelsbge','wunpckelsblt','wunpckelsbgt','wunpckelsble',
+ 'wunpckelsheq','wunpckelshne','wunpckelshcs','wunpckelshhs','wunpckelshcc','wunpckelshlo','wunpckelshmi','wunpckelshpl','wunpckelshvs','wunpckelshvc','wunpckelshhi','wunpckelshls','wunpckelshge','wunpckelshlt','wunpckelshgt','wunpckelshle',
+ 'wunpckelsweq','wunpckelswne','wunpckelswcs','wunpckelswhs','wunpckelswcc','wunpckelswlo','wunpckelswmi','wunpckelswpl','wunpckelswvs','wunpckelswvc','wunpckelswhi','wunpckelswls','wunpckelswge','wunpckelswlt','wunpckelswgt','wunpckelswle',
+ 'wunpckelubeq','wunpckelubne','wunpckelubcs','wunpckelubhs','wunpckelubcc','wunpckelublo','wunpckelubmi','wunpckelubpl','wunpckelubvs','wunpckelubvc','wunpckelubhi','wunpckelubls','wunpckelubge','wunpckelublt','wunpckelubgt','wunpckeluble',
+ 'wunpckeluheq','wunpckeluhne','wunpckeluhcs','wunpckeluhhs','wunpckeluhcc','wunpckeluhlo','wunpckeluhmi','wunpckeluhpl','wunpckeluhvs','wunpckeluhvc','wunpckeluhhi','wunpckeluhls','wunpckeluhge','wunpckeluhlt','wunpckeluhgt','wunpckeluhle',
+ 'wunpckeluweq','wunpckeluwne','wunpckeluwcs','wunpckeluwhs','wunpckeluwcc','wunpckeluwlo','wunpckeluwmi','wunpckeluwpl','wunpckeluwvs','wunpckeluwvc','wunpckeluwhi','wunpckeluwls','wunpckeluwge','wunpckeluwlt','wunpckeluwgt','wunpckeluwle',
+ 'wunpckilbeq','wunpckilbne','wunpckilbcs','wunpckilbhs','wunpckilbcc','wunpckilblo','wunpckilbmi','wunpckilbpl','wunpckilbvs','wunpckilbvc','wunpckilbhi','wunpckilbls','wunpckilbge','wunpckilblt','wunpckilbgt','wunpckilble',
+ 'wunpckilheq','wunpckilhne','wunpckilhcs','wunpckilhhs','wunpckilhcc','wunpckilhlo','wunpckilhmi','wunpckilhpl','wunpckilhvs','wunpckilhvc','wunpckilhhi','wunpckilhls','wunpckilhge','wunpckilhlt','wunpckilhgt','wunpckilhle',
+ 'wunpckilweq','wunpckilwne','wunpckilwcs','wunpckilwhs','wunpckilwcc','wunpckilwlo','wunpckilwmi','wunpckilwpl','wunpckilwvs','wunpckilwvc','wunpckilwhi','wunpckilwls','wunpckilwge','wunpckilwlt','wunpckilwgt','wunpckilwle',
+ 'wxoreq','wxorne','wxorcs','wxorhs','wxorcc','wxorlo','wxormi','wxorpl','wxorvs','wxorvc','wxorhi','wxorls','wxorge','wxorlt','wxorgt','wxorle',
+ 'wzeroeq','wzerone','wzerocs','wzerohs','wzerocc','wzerolo','wzeromi','wzeropl','wzerovs','wzerovc','wzerohi','wzerols','wzeroge','wzerolt','wzerogt','wzerole'
+ ),
+ /* Unconditional VFPv3 & NEON SIMD Memory Access Instructions */
+ 19 => array(
+ /* Unconditional VFPv3 & NEON SIMD Memory Access: Loads */
+ 'vld.8','vldal.8',
+ 'vld.16','vldal.16',
+ 'vld.32','vldal.32',
+ 'vld.64','vldal.64',
+
+ 'vld1.8','vld1al.8',
+ 'vld1.16','vld1al.16',
+ 'vld1.32','vld1al.32',
+
+ 'vld2.8','vld2al.8',
+ 'vld2.16','vld2al.16',
+ 'vld2.32','vld2al.32',
+
+ 'vld3.8','vld3al.8',
+ 'vld3.16','vld3al.16',
+ 'vld3.32','vld3al.32',
+
+ 'vld4.8','vld4al.8',
+ 'vld4.16','vld4al.16',
+ 'vld4.32','vld4al.32',
+
+ 'vldm','vldmal',
+ 'vldm.32','vldmal.32',
+ 'vldm.64','vldmal.64',
+
+ 'vldmia','vldmiaal',
+ 'vldmia.32','vldmiaal.32',
+ 'vldmia.64','vldmiaal.64',
+
+ 'vldmdb','vldmdbal',
+ 'vldmdb.32','vldmdbal.32',
+ 'vldmdb.64','vldmdbal.64',
+
+ 'vldr','vldral',
+ 'vldr.32','vldral.32',
+ 'vldr.64','vldral.64',
+
+ 'vpop','vpopal',
+ 'vpop.32','vpopal.32',
+ 'vpop.64','vpopal.64',
+
+ /* Unconditional VFPv3 & NEON SIMD Memory Access: Stores */
+ 'vst1.8','vst1al.8',
+ 'vst1.16','vst1al.16',
+ 'vst1.32','vst1al.32',
+ 'vst1.64','vst1al.64',
+
+ 'vst2.8','vst2al.8',
+ 'vst2.16','vst2al.16',
+ 'vst2.32','vst2al.32',
+
+ 'vst3.8','vst3al.8',
+ 'vst3.16','vst3al.16',
+ 'vst3.32','vst3al.32',
+
+ 'vst4.8','vst4al.8',
+ 'vst4.16','vst4al.16',
+ 'vst4.32','vst4al.32',
+
+ 'vstm','vstmal',
+ 'vstm.32','vstmal.32',
+ 'vstm.64','vstmal.64',
+
+ 'vstmia','vstmiaal',
+ 'vstmia.32','vstmiaal.32',
+ 'vstmia.64','vstmiaal.64',
+
+ 'vstmdb','vstmdbal',
+ 'vstmdb.32','vstmdbal.32',
+ 'vstmdb.64','vstmdbal.64',
+
+ 'vstr','vstral',
+ 'vstr.32','vstral.32',
+ 'vstr.64','vstral.64',
+
+ 'vpush','vpushal',
+ 'vpush.32','vpushal.32',
+ 'vpush.64','vpushal.64'
+ ),
+ /* Unconditional NEON SIMD Logical Instructions */
+ 20 => array(
+ 'vand','vandal',
+ 'vand.i8','vandal.i8',
+ 'vand.i16','vandal.i16',
+ 'vand.i32','vandal.i32',
+ 'vand.i64','vandal.i64',
+ 'vand.s8','vandal.s8',
+ 'vand.s16','vandal.s16',
+ 'vand.s32','vandal.s32',
+ 'vand.s64','vandal.s64',
+ 'vand.u8','vandal.u8',
+ 'vand.u16','vandal.u16',
+ 'vand.u32','vandal.u32',
+ 'vand.u64','vandal.u64',
+ 'vand.f32','vandal.f32',
+ 'vand.f64','vandal.f64',
+
+ 'vbic','vbical',
+ 'vbic.i8','vbical.i8',
+ 'vbic.i16','vbical.i16',
+ 'vbic.i32','vbical.i32',
+ 'vbic.i64','vbical.i64',
+ 'vbic.s8','vbical.s8',
+ 'vbic.s16','vbical.s16',
+ 'vbic.s32','vbical.s32',
+ 'vbic.s64','vbical.s64',
+ 'vbic.u8','vbical.u8',
+ 'vbic.u16','vbical.u16',
+ 'vbic.u32','vbical.u32',
+ 'vbic.u64','vbical.u64',
+ 'vbic.f32','vbical.f32',
+ 'vbic.f64','vbical.f64',
+
+ 'vbif','vbifal',
+ 'vbif.i8','vbifal.i8',
+ 'vbif.i16','vbifal.i16',
+ 'vbif.i32','vbifal.i32',
+ 'vbif.i64','vbifal.i64',
+ 'vbif.s8','vbifal.s8',
+ 'vbif.s16','vbifal.s16',
+ 'vbif.s32','vbifal.s32',
+ 'vbif.s64','vbifal.s64',
+ 'vbif.u8','vbifal.u8',
+ 'vbif.u16','vbifal.u16',
+ 'vbif.u32','vbifal.u32',
+ 'vbif.u64','vbifal.u64',
+ 'vbif.f32','vbifal.f32',
+ 'vbif.f64','vbifal.f64',
+
+ 'vbit','vbital',
+ 'vbit.i8','vbital.i8',
+ 'vbit.i16','vbital.i16',
+ 'vbit.i32','vbital.i32',
+ 'vbit.i64','vbital.i64',
+ 'vbit.s8','vbital.s8',
+ 'vbit.s16','vbital.s16',
+ 'vbit.s32','vbital.s32',
+ 'vbit.s64','vbital.s64',
+ 'vbit.u8','vbital.u8',
+ 'vbit.u16','vbital.u16',
+ 'vbit.u32','vbital.u32',
+ 'vbit.u64','vbital.u64',
+ 'vbit.f32','vbital.f32',
+ 'vbit.f64','vbital.f64',
+
+ 'vbsl','vbslal',
+ 'vbsl.i8','vbslal.i8',
+ 'vbsl.i16','vbslal.i16',
+ 'vbsl.i32','vbslal.i32',
+ 'vbsl.i64','vbslal.i64',
+ 'vbsl.s8','vbslal.s8',
+ 'vbsl.s16','vbslal.s16',
+ 'vbsl.s32','vbslal.s32',
+ 'vbsl.s64','vbslal.s64',
+ 'vbsl.u8','vbslal.u8',
+ 'vbsl.u16','vbslal.u16',
+ 'vbsl.u32','vbslal.u32',
+ 'vbsl.u64','vbslal.u64',
+ 'vbsl.f32','vbslal.f32',
+ 'vbsl.f64','vbslal.f64',
+
+ 'veor','veoral',
+ 'veor.i8','veoral.i8',
+ 'veor.i16','veoral.i16',
+ 'veor.i32','veoral.i32',
+ 'veor.i64','veoral.i64',
+ 'veor.s8','veoral.s8',
+ 'veor.s16','veoral.s16',
+ 'veor.s32','veoral.s32',
+ 'veor.s64','veoral.s64',
+ 'veor.u8','veoral.u8',
+ 'veor.u16','veoral.u16',
+ 'veor.u32','veoral.u32',
+ 'veor.u64','veoral.u64',
+ 'veor.f32','veoral.f32',
+ 'veor.f64','veoral.f64',
+
+ 'vmov','vmoval',
+ 'vmov.8','vmoval.8',
+ 'vmov.16','vmoval.16',
+ 'vmov.32','vmoval.32',
+ 'vmov.i8','vmoval.i8',
+ 'vmov.i16','vmoval.i16',
+ 'vmov.i32','vmoval.i32',
+ 'vmov.i64','vmoval.i64',
+ 'vmov.f32','vmoval.f32',
+ 'vmov.f64','vmoval.f64',
+
+ 'vmvn','vmvnal',
+ 'vmvn.s8','vmvnal.s8',
+ 'vmvn.s16','vmvnal.s16',
+ 'vmvn.s32','vmvnal.s32',
+ 'vmvn.s64','vmvnal.s64',
+ 'vmvn.u8','vmvnal.u8',
+ 'vmvn.u16','vmvnal.u16',
+ 'vmvn.u32','vmvnal.u32',
+ 'vmvn.u64','vmvnal.u64',
+ 'vmvn.i8','vmvnal.i8',
+ 'vmvn.i16','vmvnal.i16',
+ 'vmvn.i32','vmvnal.i32',
+ 'vmvn.i64','vmvnal.i64',
+ 'vmvn.f32','vmvnal.f32',
+ 'vmvn.f64','vmvnal.f64',
+
+ 'vorn','vornal',
+ 'vorn.s8','vornal.s8',
+ 'vorn.s16','vornal.s16',
+ 'vorn.s32','vornal.s32',
+ 'vorn.s64','vornal.s64',
+ 'vorn.u8','vornal.u8',
+ 'vorn.u16','vornal.u16',
+ 'vorn.u32','vornal.u32',
+ 'vorn.u64','vornal.u64',
+ 'vorn.i8','vornal.i8',
+ 'vorn.i16','vornal.i16',
+ 'vorn.i32','vornal.i32',
+ 'vorn.i64','vornal.i64',
+ 'vorn.f32','vornal.f32',
+ 'vorn.f64','vornal.f64',
+
+ 'vorr','vorral',
+ 'vorr.s8','vorral.s8',
+ 'vorr.s16','vorral.s16',
+ 'vorr.s32','vorral.s32',
+ 'vorr.s64','vorral.s64',
+ 'vorr.u8','vorral.u8',
+ 'vorr.u16','vorral.u16',
+ 'vorr.u32','vorral.u32',
+ 'vorr.u64','vorral.u64',
+ 'vorr.i8','vorral.i8',
+ 'vorr.i16','vorral.i16',
+ 'vorr.i32','vorral.i32',
+ 'vorr.i64','vorral.i64',
+ 'vorr.f32','vorral.f32',
+ 'vorr.f64','vorral.f64',
+
+ 'vswp','vswpal',
+ 'vswp.s8','vswpal.s8',
+ 'vswp.s16','vswpal.s16',
+ 'vswp.s32','vswpal.s32',
+ 'vswp.s64','vswpal.s64',
+ 'vswp.u8','vswpal.u8',
+ 'vswp.u16','vswpal.u16',
+ 'vswp.u32','vswpal.u32',
+ 'vswp.u64','vswpal.u64',
+ 'vswp.i8','vswpal.i8',
+ 'vswp.i16','vswpal.i16',
+ 'vswp.i32','vswpal.i32',
+ 'vswp.i64','vswpal.i64',
+ 'vswp.f32','vswpal.f32',
+ 'vswp.f64','vswpal.f64'
+ ),
+ /* Unconditional NEON SIMD ARM Registers Interop Instructions */
+ 21 => array(
+ 'vmrs','vmrsal',
+ 'vmsr','vmsral'
+ ),
+ /* Unconditional NEON SIMD Bit/Byte-Level Instructions */
+ 22 => array(
+ 'vcnt.8','vcntal.8',
+ 'vdup.8','vdupal.8',
+
+ 'vdup.16','vdupal.16',
+ 'vdup.32','vdupal.32',
+
+ 'vext.8','vextal.8',
+ 'vext.16','vextal.16',
+
+ 'vext.32','vextal.32',
+ 'vext.64','vextal.64',
+
+ 'vrev16.8','vrev16al.8',
+ 'vrev32.8','vrev32al.8',
+ 'vrev32.16','vrev32al.16',
+ 'vrev64.8','vrev64al.8',
+ 'vrev64.16','vrev64al.16',
+ 'vrev64.32','vrev64al.32',
+
+ 'vsli.8','vslial.8',
+ 'vsli.16','vslial.16',
+ 'vsli.32','vslial.32',
+ 'vsli.64','vslial.64',
+
+ 'vsri.8','vsrial.8',
+ 'vsri.16','vsrial.16',
+ 'vsri.32','vsrial.32',
+ 'vsri.64','vsrial.64',
+
+ 'vtbl.8','vtblal.8',
+
+ 'vtbx','vtbxal',
+
+ 'vtrn.8','vtrnal.8',
+ 'vtrn.16','vtrnal.16',
+ 'vtrn.32','vtrnal.32',
+
+ 'vtst.8','vtstal.8',
+ 'vtst.16','vtstal.16',
+ 'vtst.32','vtstal.32',
+
+ 'vuzp.8','vuzpal.8',
+ 'vuzp.16','vuzpal.16',
+ 'vuzp.32','vuzpal.32',
+
+ 'vzip.8','vzipal.8',
+ 'vzip.16','vzipal.16',
+ 'vzip.32','vzipal.32',
+
+ 'vmull.p8','vmullal.p8'
+ ),
+ /* Unconditional NEON SIMD Universal Integer Instructions */
+ 23 => array(
+ 'vadd.i8','vaddal.i8',
+ 'vadd.i16','vaddal.i16',
+ 'vadd.i32','vaddal.i32',
+ 'vadd.i64','vaddal.i64',
+
+ 'vsub.i8','vsubal.i8',
+ 'vsub.i16','vsubal.i16',
+ 'vsub.i32','vsubal.i32',
+ 'vsub.i64','vsubal.i64',
+
+ 'vaddhn.i16','vaddhnal.i16',
+ 'vaddhn.i32','vaddhnal.i32',
+ 'vaddhn.i64','vaddhnal.i64',
+
+ 'vsubhn.i16','vsubhnal.i16',
+ 'vsubhn.i32','vsubhnal.i32',
+ 'vsubhn.i64','vsubhnal.i64',
+
+ 'vraddhn.i16','vraddhnal.i16',
+ 'vraddhn.i32','vraddhnal.i32',
+ 'vraddhn.i64','vraddhnal.i64',
+
+ 'vrsubhn.i16','vrsubhnal.i16',
+ 'vrsubhn.i32','vrsubhnal.i32',
+ 'vrsubhn.i64','vrsubhnal.i64',
+
+ 'vpadd.i8','vpaddal.i8',
+ 'vpadd.i16','vpaddal.i16',
+ 'vpadd.i32','vpaddal.i32',
+
+ 'vceq.i8','vceqal.i8',
+ 'vceq.i16','vceqal.i16',
+ 'vceq.i32','vceqal.i32',
+
+ 'vclz.i8','vclzal.i8',
+ 'vclz.i16','vclzal.i16',
+ 'vclz.i32','vclzal.i32',
+
+ 'vmovn.i16','vmovnal.i16',
+ 'vmovn.i32','vmovnal.i32',
+ 'vmovn.i64','vmovnal.i64',
+
+ 'vmla.s8','vmlaal.s8',
+ 'vmla.s16','vmlaal.s16',
+ 'vmla.s32','vmlaal.s32',
+ 'vmla.u8','vmlaal.u8',
+ 'vmla.u16','vmlaal.u16',
+ 'vmla.u32','vmlaal.u32',
+ 'vmla.i8','vmlaal.i8',
+ 'vmla.i16','vmlaal.i16',
+ 'vmla.i32','vmlaal.i32',
+
+ 'vmls.s8','vmlsal.s8',
+ 'vmls.s16','vmlsal.s16',
+ 'vmls.s32','vmlsal.s32',
+ 'vmls.u8','vmlsal.u8',
+ 'vmls.u16','vmlsal.u16',
+ 'vmls.u32','vmlsal.u32',
+ 'vmls.i8','vmlsal.i8',
+ 'vmls.i16','vmlsal.i16',
+ 'vmls.i32','vmlsal.i32',
+
+ 'vmul.s8','vmulal.s8',
+ 'vmul.s16','vmulal.s16',
+ 'vmul.s32','vmulal.s32',
+ 'vmul.u8','vmulal.u8',
+ 'vmul.u16','vmulal.u16',
+ 'vmul.u32','vmulal.u32',
+ 'vmul.i8','vmulal.i8',
+ 'vmul.i16','vmulal.i16',
+ 'vmul.i32','vmulal.i32',
+ 'vmul.p8','vmulal.p8',
+
+ 'vrshrn.i16','vrshrnal.i16',
+ 'vrshrn.i32','vrshrnal.i32',
+ 'vrshrn.i64','vrshrnal.i64',
+
+ 'vshrn.i16','vshrnal.i16',
+ 'vshrn.i32','vshrnal.i32',
+ 'vshrn.i64','vshrnal.i64',
+
+ 'vshl.i8','vshlal.i8',
+ 'vshl.i16','vshlal.i16',
+ 'vshl.i32','vshlal.i32',
+ 'vshl.i64','vshlal.i64',
+
+ 'vshll.i8','vshllal.i8',
+ 'vshll.i16','vshllal.i16',
+ 'vshll.i32','vshllal.i32'
+ ),
+ /* Unconditional NEON SIMD Signed Integer Instructions */
+ 24 => array(
+ 'vaba.s8','vabaal.s8',
+ 'vaba.s16','vabaal.s16',
+ 'vaba.s32','vabaal.s32',
+
+ 'vabal.s8','vabalal.s8',
+ 'vabal.s16','vabalal.s16',
+ 'vabal.s32','vabalal.s32',
+
+ 'vabd.s8','vabdal.s8',
+ 'vabd.s16','vabdal.s16',
+ 'vabd.s32','vabdal.s32',
+
+ 'vabs.s8','vabsal.s8',
+ 'vabs.s16','vabsal.s16',
+ 'vabs.s32','vabsal.s32',
+
+ 'vaddl.s8','vaddlal.s8',
+ 'vaddl.s16','vaddlal.s16',
+ 'vaddl.s32','vaddlal.s32',
+
+ 'vcge.s8','vcgeal.s8',
+ 'vcge.s16','vcgeal.s16',
+ 'vcge.s32','vcgeal.s32',
+
+ 'vcle.s8','vcleal.s8',
+ 'vcle.s16','vcleal.s16',
+ 'vcle.s32','vcleal.s32',
+
+ 'vcgt.s8','vcgtal.s8',
+ 'vcgt.s16','vcgtal.s16',
+ 'vcgt.s32','vcgtal.s32',
+
+ 'vclt.s8','vcltal.s8',
+ 'vclt.s16','vcltal.s16',
+ 'vclt.s32','vcltal.s32',
+
+ 'vcls.s8','vclsal.s8',
+ 'vcls.s16','vclsal.s16',
+ 'vcls.s32','vclsal.s32',
+
+ 'vaddw.s8','vaddwal.s8',
+ 'vaddw.s16','vaddwal.s16',
+ 'vaddw.s32','vaddwal.s32',
+
+ 'vhadd.s8','vhaddal.s8',
+ 'vhadd.s16','vhaddal.s16',
+ 'vhadd.s32','vhaddal.s32',
+
+ 'vhsub.s8','vhsubal.s8',
+ 'vhsub.s16','vhsubal.s16',
+ 'vhsub.s32','vhsubal.s32',
+
+ 'vmax.s8','vmaxal.s8',
+ 'vmax.s16','vmaxal.s16',
+ 'vmax.s32','vmaxal.s32',
+
+ 'vmin.s8','vminal.s8',
+ 'vmin.s16','vminal.s16',
+ 'vmin.s32','vminal.s32',
+
+ 'vmlal.s8','vmlalal.s8',
+ 'vmlal.s16','vmlalal.s16',
+ 'vmlal.s32','vmlalal.s32',
+
+ 'vmlsl.s8','vmlslal.s8',
+ 'vmlsl.s16','vmlslal.s16',
+ 'vmlsl.s32','vmlslal.s32',
+
+ 'vneg.s8','vnegal.s8',
+ 'vneg.s16','vnegal.s16',
+ 'vneg.s32','vnegal.s32',
+
+ 'vpadal.s8','vpadalal.s8',
+ 'vpadal.s16','vpadalal.s16',
+ 'vpadal.s32','vpadalal.s32',
+
+ 'vmovl.s8','vmovlal.s8',
+ 'vmovl.s16','vmovlal.s16',
+ 'vmovl.s32','vmovlal.s32',
+
+ 'vmull.s8','vmullal.s8',
+ 'vmull.s16','vmullal.s16',
+ 'vmull.s32','vmullal.s32',
+
+ 'vpaddl.s8','vpaddlal.s8',
+ 'vpaddl.s16','vpaddlal.s16',
+ 'vpaddl.s32','vpaddlal.s32',
+
+ 'vpmax.s8','vpmaxal.s8',
+ 'vpmax.s16','vpmaxal.s16',
+ 'vpmax.s32','vpmaxal.s32',
+
+ 'vpmin.s8','vpminal.s8',
+ 'vpmin.s16','vpminal.s16',
+ 'vpmin.s32','vpminal.s32',
+
+ 'vqabs.s8','vqabsal.s8',
+ 'vqabs.s16','vqabsal.s16',
+ 'vqabs.s32','vqabsal.s32',
+
+ 'vqadd.s8','vqaddal.s8',
+ 'vqadd.s16','vqaddal.s16',
+ 'vqadd.s32','vqaddal.s32',
+ 'vqadd.s64','vqaddal.s64',
+
+ 'vqdmlal.s16','vqdmlalal.s16',
+ 'vqdmlal.s32','vqdmlalal.s32',
+
+ 'vqdmlsl.s16','vqdmlslal.s16',
+ 'vqdmlsl.s32','vqdmlslal.s32',
+
+ 'vqdmulh.s16','vqdmulhal.s16',
+ 'vqdmulh.s32','vqdmulhal.s32',
+
+ 'vqdmull.s16','vqdmullal.s16',
+ 'vqdmull.s32','vqdmullal.s32',
+
+ 'vqmovn.s16','vqmovnal.s16',
+ 'vqmovn.s32','vqmovnal.s32',
+ 'vqmovn.s64','vqmovnal.s64',
+
+ 'vqmovun.s16','vqmovunal.s16',
+ 'vqmovun.s32','vqmovunal.s32',
+ 'vqmovun.s64','vqmovunal.s64',
+
+ 'vqneg.s8','vqnegal.s8',
+ 'vqneg.s16','vqnegal.s16',
+ 'vqneg.s32','vqnegal.s32',
+
+ 'vqrdmulh.s16','vqrdmulhal.s16',
+ 'vqrdmulh.s32','vqrdmulhal.s32',
+
+ 'vqrshl.s8','vqrshlal.s8',
+ 'vqrshl.s16','vqrshlal.s16',
+ 'vqrshl.s32','vqrshlal.s32',
+ 'vqrshl.s64','vqrshlal.s64',
+
+ 'vqrshrn.s16','vqrshrnal.s16',
+ 'vqrshrn.s32','vqrshrnal.s32',
+ 'vqrshrn.s64','vqrshrnal.s64',
+
+ 'vqrshrun.s16','vqrshrunal.s16',
+ 'vqrshrun.s32','vqrshrunal.s32',
+ 'vqrshrun.s64','vqrshrunal.s64',
+
+ 'vqshl.s8','vqshlal.s8',
+ 'vqshl.s16','vqshlal.s16',
+ 'vqshl.s32','vqshlal.s32',
+ 'vqshl.s64','vqshlal.s64',
+
+ 'vqshlu.s8','vqshlual.s8',
+ 'vqshlu.s16','vqshlual.s16',
+ 'vqshlu.s32','vqshlual.s32',
+ 'vqshlu.s64','vqshlual.s64',
+
+ 'vqshrn.s16','vqshrnal.s16',
+ 'vqshrn.s32','vqshrnal.s32',
+ 'vqshrn.s64','vqshrnal.s64',
+
+ 'vqshrun.s16','vqshrunal.s16',
+ 'vqshrun.s32','vqshrunal.s32',
+ 'vqshrun.s64','vqshrunal.s64',
+
+ 'vqsub.s8','vqsubal.s8',
+ 'vqsub.s16','vqsubal.s16',
+ 'vqsub.s32','vqsubal.s32',
+ 'vqsub.s64','vqsubal.s64',
+
+ 'vrhadd.s8','vrhaddal.s8',
+ 'vrhadd.s16','vrhaddal.s16',
+ 'vrhadd.s32','vrhaddal.s32',
+
+ 'vrshl.s8','vrshlal.s8',
+ 'vrshl.s16','vrshlal.s16',
+ 'vrshl.s32','vrshlal.s32',
+ 'vrshl.s64','vrshlal.s64',
+
+ 'vrshr.s8','vrshral.s8',
+ 'vrshr.s16','vrshral.s16',
+ 'vrshr.s32','vrshral.s32',
+ 'vrshr.s64','vrshral.s64',
+
+ 'vrsra.s8','vrsraal.s8',
+ 'vrsra.s16','vrsraal.s16',
+ 'vrsra.s32','vrsraal.s32',
+ 'vrsra.s64','vrsraal.s64',
+
+ 'vshl.s8','vshlal.s8',
+ 'vshl.s16','vshlal.s16',
+ 'vshl.s32','vshlal.s32',
+ 'vshl.s64','vshlal.s64',
+
+ 'vshll.s8','vshllal.s8',
+ 'vshll.s16','vshllal.s16',
+ 'vshll.s32','vshllal.s32',
+
+ 'vshr.s8','vshral.s8',
+ 'vshr.s16','vshral.s16',
+ 'vshr.s32','vshral.s32',
+ 'vshr.s64','vshral.s64',
+
+ 'vsra.s8','vsraal.s8',
+ 'vsra.s16','vsraal.s16',
+ 'vsra.s32','vsraal.s32',
+ 'vsra.s64','vsraal.s64',
+
+ 'vsubl.s8','vsublal.s8',
+ 'vsubl.s16','vsublal.s16',
+ 'vsubl.s32','vsublal.s32',
+
+ 'vsubh.s8','vsubhal.s8',
+ 'vsubh.s16','vsubhal.s16',
+ 'vsubh.s32','vsubhal.s32'
+ ),
+ /* Unconditional NEON SIMD Unsigned Integer Instructions */
+ 25 => array(
+ 'vaba.u8','vabaal.u8',
+ 'vaba.u16','vabaal.u16',
+ 'vaba.u32','vabaal.u32',
+
+ 'vabal.u8','vabalal.u8',
+ 'vabal.u16','vabalal.u16',
+ 'vabal.u32','vabalal.u32',
+
+ 'vabd.u8','vabdal.u8',
+ 'vabd.u16','vabdal.u16',
+ 'vabd.u32','vabdal.u32',
+
+ 'vaddl.u8','vaddlal.u8',
+ 'vaddl.u16','vaddlal.u16',
+ 'vaddl.u32','vaddlal.u32',
+
+ 'vsubl.u8','vsublal.u8',
+ 'vsubl.u16','vsublal.u16',
+ 'vsubl.u32','vsublal.u32',
+
+ 'vaddw.u8','vaddwal.u8',
+ 'vaddw.u16','vaddwal.u16',
+ 'vaddw.u32','vaddwal.u32',
+
+ 'vsubh.u8','vsubhal.u8',
+ 'vsubh.u16','vsubhal.u16',
+ 'vsubh.u32','vsubhal.u32',
+
+ 'vhadd.u8','vhaddal.u8',
+ 'vhadd.u16','vhaddal.u16',
+ 'vhadd.u32','vhaddal.u32',
+
+ 'vhsub.u8','vhsubal.u8',
+ 'vhsub.u16','vhsubal.u16',
+ 'vhsub.u32','vhsubal.u32',
+
+ 'vpadal.u8','vpadalal.u8',
+ 'vpadal.u16','vpadalal.u16',
+ 'vpadal.u32','vpadalal.u32',
+
+ 'vpaddl.u8','vpaddlal.u8',
+ 'vpaddl.u16','vpaddlal.u16',
+ 'vpaddl.u32','vpaddlal.u32',
+
+ 'vcge.u8','vcgeal.u8',
+ 'vcge.u16','vcgeal.u16',
+ 'vcge.u32','vcgeal.u32',
+
+ 'vcle.u8','vcleal.u8',
+ 'vcle.u16','vcleal.u16',
+ 'vcle.u32','vcleal.u32',
+
+ 'vcgt.u8','vcgtal.u8',
+ 'vcgt.u16','vcgtal.u16',
+ 'vcgt.u32','vcgtal.u32',
+
+ 'vclt.u8','vcltal.u8',
+ 'vclt.u16','vcltal.u16',
+ 'vclt.u32','vcltal.u32',
+
+ 'vmax.u8','vmaxal.u8',
+ 'vmax.u16','vmaxal.u16',
+ 'vmax.u32','vmaxal.u32',
+
+ 'vmin.u8','vminal.u8',
+ 'vmin.u16','vminal.u16',
+ 'vmin.u32','vminal.u32',
+
+ 'vmlal.u8','vmlalal.u8',
+ 'vmlal.u16','vmlalal.u16',
+ 'vmlal.u32','vmlalal.u32',
+
+ 'vmlsl.u8','vmlslal.u8',
+ 'vmlsl.u16','vmlslal.u16',
+ 'vmlsl.u32','vmlslal.u32',
+
+ 'vmull.u8','vmullal.u8',
+ 'vmull.u16','vmullal.u16',
+ 'vmull.u32','vmullal.u32',
+
+ 'vmovl.u8','vmovlal.u8',
+ 'vmovl.u16','vmovlal.u16',
+ 'vmovl.u32','vmovlal.u32',
+
+ 'vshl.u8','vshlal.u8',
+ 'vshl.u16','vshlal.u16',
+ 'vshl.u32','vshlal.u32',
+ 'vshl.u64','vshlal.u64',
+
+ 'vshll.u8','vshllal.u8',
+ 'vshll.u16','vshllal.u16',
+ 'vshll.u32','vshllal.u32',
+
+ 'vshr.u8','vshral.u8',
+ 'vshr.u16','vshral.u16',
+ 'vshr.u32','vshral.u32',
+ 'vshr.u64','vshral.u64',
+
+ 'vsra.u8','vsraal.u8',
+ 'vsra.u16','vsraal.u16',
+ 'vsra.u32','vsraal.u32',
+ 'vsra.u64','vsraal.u64',
+
+ 'vpmax.u8','vpmaxal.u8',
+ 'vpmax.u16','vpmaxal.u16',
+ 'vpmax.u32','vpmaxal.u32',
+
+ 'vpmin.u8','vpminal.u8',
+ 'vpmin.u16','vpminal.u16',
+ 'vpmin.u32','vpminal.u32',
+
+ 'vqadd.u8','vqaddal.u8',
+ 'vqadd.u16','vqaddal.u16',
+ 'vqadd.u32','vqaddal.u32',
+ 'vqadd.u64','vqaddal.u64',
+
+ 'vqsub.u8','vqsubal.u8',
+ 'vqsub.u16','vqsubal.u16',
+ 'vqsub.u32','vqsubal.u32',
+ 'vqsub.u64','vqsubal.u64',
+
+ 'vqmovn.u16','vqmovnal.u16',
+ 'vqmovn.u32','vqmovnal.u32',
+ 'vqmovn.u64','vqmovnal.u64',
+
+ 'vqshl.u8','vqshlal.u8',
+ 'vqshl.u16','vqshlal.u16',
+ 'vqshl.u32','vqshlal.u32',
+ 'vqshl.u64','vqshlal.u64',
+
+ 'vqshrn.u16','vqshrnal.u16',
+ 'vqshrn.u32','vqshrnal.u32',
+ 'vqshrn.u64','vqshrnal.u64',
+
+ 'vqrshl.u8','vqrshlal.u8',
+ 'vqrshl.u16','vqrshlal.u16',
+ 'vqrshl.u32','vqrshlal.u32',
+ 'vqrshl.u64','vqrshlal.u64',
+
+ 'vqrshrn.u16','vqrshrnal.u16',
+ 'vqrshrn.u32','vqrshrnal.u32',
+ 'vqrshrn.u64','vqrshrnal.u64',
+
+ 'vrhadd.u8','vrhaddal.u8',
+ 'vrhadd.u16','vrhaddal.u16',
+ 'vrhadd.u32','vrhaddal.u32',
+
+ 'vrshl.u8','vrshlal.u8',
+ 'vrshl.u16','vrshlal.u16',
+ 'vrshl.u32','vrshlal.u32',
+ 'vrshl.u64','vrshlal.u64',
+
+ 'vrshr.u8','vrshral.u8',
+ 'vrshr.u16','vrshral.u16',
+ 'vrshr.u32','vrshral.u32',
+ 'vrshr.u64','vrshral.u64',
+
+ 'vrsra.u8','vrsraal.u8',
+ 'vrsra.u16','vrsraal.u16',
+ 'vrsra.u32','vrsraal.u32',
+ 'vrsra.u64','vrsraal.u64'
+ ),
+ /* Unconditional VFPv3 & NEON SIMD Floating-Point Instructions */
+ 26 => array(
+ 'vabd.f32','vabdal.f32',
+
+ 'vabs.f32','vabsal.f32',
+ 'vabs.f64','vabsal.f64',
+
+ 'vacge.f32','vacgeal.f32',
+ 'vacgt.f32','vacgtal.f32',
+ 'vacle.f32','vacleal.f32',
+ 'vaclt.f32','vacltal.f32',
+
+ 'vadd.f32','vaddal.f32',
+ 'vadd.f64','vaddal.f64',
+
+ 'vceq.f32','vceqal.f32',
+ 'vcge.f32','vcgeal.f32',
+ 'vcle.f32','vcleal.f32',
+ 'vcgt.f32','vcgtal.f32',
+ 'vclt.f32','vcltal.f32',
+
+ 'vcmp.f32','vcmpal.f32',
+ 'vcmp.f64','vcmpal.f64',
+
+ 'vcmpe.f32','vcmpeal.f32',
+ 'vcmpe.f64','vcmpeal.f64',
+
+ 'vcvt.s16.f32','vcvtal.s16.f32',
+ 'vcvt.s16.f64','vcvtal.s16.f64',
+ 'vcvt.s32.f32','vcvtal.s32.f32',
+ 'vcvt.s32.f64','vcvtal.s32.f64',
+ 'vcvt.u16.f32','vcvtal.u16.f32',
+ 'vcvt.u16.f64','vcvtal.u16.f64',
+ 'vcvt.u32.f32','vcvtal.u32.f32',
+ 'vcvt.u32.f64','vcvtal.u32.f64',
+ 'vcvt.f16.f32','vcvtal.f16.f32',
+ 'vcvt.f32.s32','vcvtal.f32.s32',
+ 'vcvt.f32.u32','vcvtal.f32.u32',
+ 'vcvt.f32.f16','vcvtal.f32.f16',
+ 'vcvt.f32.f64','vcvtal.f32.f64',
+ 'vcvt.f64.s32','vcvtal.f64.s32',
+ 'vcvt.f64.u32','vcvtal.f64.u32',
+ 'vcvt.f64.f32','vcvtal.f64.f32',
+
+ 'vcvtr.s32.f32','vcvtral.s32.f32',
+ 'vcvtr.s32.f64','vcvtral.s32.f64',
+ 'vcvtr.u32.f32','vcvtral.u32.f32',
+ 'vcvtr.u32.f64','vcvtral.u32.f64',
+
+ 'vcvtb.f16.f32','vcvtbal.f16.f32',
+ 'vcvtb.f32.f16','vcvtbal.f32.f16',
+
+ 'vcvtt.f16.f32','vcvttal.f16.f32',
+ 'vcvtt.f32.f16','vcvttal.f32.f16',
+
+ 'vdiv.f32','vdival.f32',
+ 'vdiv.f64','vdival.f64',
+
+ 'vmax.f32','vmaxal.f32',
+ 'vmin.f32','vminal.f32',
+
+ 'vmla.f32','vmlaal.f32',
+ 'vmla.f64','vmlaal.f64',
+
+ 'vmls.f32','vmlsal.f32',
+ 'vmls.f64','vmlsal.f64',
+
+ 'vmul.f32','vmulal.f32',
+ 'vmul.f64','vmulal.f64',
+
+ 'vneg.f32','vnegal.f32',
+ 'vneg.f64','vnegal.f64',
+
+ 'vnmla.f32','vnmlaal.f32',
+ 'vnmla.f64','vnmlaal.f64',
+
+ 'vnmls.f32','vnmlsal.f32',
+ 'vnmls.f64','vnmlsal.f64',
+
+ 'vnmul.f64','vnmulal.f64',
+ 'vnmul.f32','vnmulal.f32',
+
+ 'vpadd.f32','vpaddal.f32',
+
+ 'vpmax.f32','vpmaxal.f32',
+ 'vpmin.f32','vpminal.f32',
+
+ 'vrecpe.u32','vrecpeal.u32',
+ 'vrecpe.f32','vrecpeal.f32',
+ 'vrecps.f32','vrecpsal.f32',
+
+ 'vrsqrte.u32','vrsqrteal.u32',
+ 'vrsqrte.f32','vrsqrteal.f32',
+ 'vrsqrts.f32','vrsqrtsal.f32',
+
+ 'vsqrt.f32','vsqrtal.f32',
+ 'vsqrt.f64','vsqrtal.f64',
+
+ 'vsub.f32','vsubal.f32',
+ 'vsub.f64','vsubal.f64'
+ ),
+ /* Conditional VFPv3 & NEON SIMD Memory Access Instructions */
+ 27 => array(
+ /* Conditional VFPv3 & NEON SIMD Memory Access: Loads */
+ 'vldeq.8','vldne.8','vldcs.8','vldhs.8','vldcc.8','vldlo.8','vldmi.8','vldpl.8','vldvs.8','vldvc.8','vldhi.8','vldls.8','vldge.8','vldlt.8','vldgt.8','vldle.8',
+ 'vldeq.16','vldne.16','vldcs.16','vldhs.16','vldcc.16','vldlo.16','vldmi.16','vldpl.16','vldvs.16','vldvc.16','vldhi.16','vldls.16','vldge.16','vldlt.16','vldgt.16','vldle.16',
+ 'vldeq.32','vldne.32','vldcs.32','vldhs.32','vldcc.32','vldlo.32','vldmi.32','vldpl.32','vldvs.32','vldvc.32','vldhi.32','vldls.32','vldge.32','vldlt.32','vldgt.32','vldle.32',
+ 'vldeq.64','vldne.64','vldcs.64','vldhs.64','vldcc.64','vldlo.64','vldmi.64','vldpl.64','vldvs.64','vldvc.64','vldhi.64','vldls.64','vldge.64','vldlt.64','vldgt.64','vldle.64',
+
+ 'vld1eq.8','vld1ne.8','vld1cs.8','vld1hs.8','vld1cc.8','vld1lo.8','vld1mi.8','vld1pl.8','vld1vs.8','vld1vc.8','vld1hi.8','vld1ls.8','vld1ge.8','vld1lt.8','vld1gt.8','vld1le.8',
+ 'vld1eq.16','vld1ne.16','vld1cs.16','vld1hs.16','vld1cc.16','vld1lo.16','vld1mi.16','vld1pl.16','vld1vs.16','vld1vc.16','vld1hi.16','vld1ls.16','vld1ge.16','vld1lt.16','vld1gt.16','vld1le.16',
+ 'vld1eq.32','vld1ne.32','vld1cs.32','vld1hs.32','vld1cc.32','vld1lo.32','vld1mi.32','vld1pl.32','vld1vs.32','vld1vc.32','vld1hi.32','vld1ls.32','vld1ge.32','vld1lt.32','vld1gt.32','vld1le.32',
+
+ 'vld2eq.8','vld2ne.8','vld2cs.8','vld2hs.8','vld2cc.8','vld2lo.8','vld2mi.8','vld2pl.8','vld2vs.8','vld2vc.8','vld2hi.8','vld2ls.8','vld2ge.8','vld2lt.8','vld2gt.8','vld2le.8',
+ 'vld2eq.16','vld2ne.16','vld2cs.16','vld2hs.16','vld2cc.16','vld2lo.16','vld2mi.16','vld2pl.16','vld2vs.16','vld2vc.16','vld2hi.16','vld2ls.16','vld2ge.16','vld2lt.16','vld2gt.16','vld2le.16',
+ 'vld2eq.32','vld2ne.32','vld2cs.32','vld2hs.32','vld2cc.32','vld2lo.32','vld2mi.32','vld2pl.32','vld2vs.32','vld2vc.32','vld2hi.32','vld2ls.32','vld2ge.32','vld2lt.32','vld2gt.32','vld2le.32',
+
+ 'vld3eq.8','vld3ne.8','vld3cs.8','vld3hs.8','vld3cc.8','vld3lo.8','vld3mi.8','vld3pl.8','vld3vs.8','vld3vc.8','vld3hi.8','vld3ls.8','vld3ge.8','vld3lt.8','vld3gt.8','vld3le.8',
+ 'vld3eq.16','vld3ne.16','vld3cs.16','vld3hs.16','vld3cc.16','vld3lo.16','vld3mi.16','vld3pl.16','vld3vs.16','vld3vc.16','vld3hi.16','vld3ls.16','vld3ge.16','vld3lt.16','vld3gt.16','vld3le.16',
+ 'vld3eq.32','vld3ne.32','vld3cs.32','vld3hs.32','vld3cc.32','vld3lo.32','vld3mi.32','vld3pl.32','vld3vs.32','vld3vc.32','vld3hi.32','vld3ls.32','vld3ge.32','vld3lt.32','vld3gt.32','vld3le.32',
+
+ 'vld4eq.8','vld4ne.8','vld4cs.8','vld4hs.8','vld4cc.8','vld4lo.8','vld4mi.8','vld4pl.8','vld4vs.8','vld4vc.8','vld4hi.8','vld4ls.8','vld4ge.8','vld4lt.8','vld4gt.8','vld4le.8',
+ 'vld4eq.16','vld4ne.16','vld4cs.16','vld4hs.16','vld4cc.16','vld4lo.16','vld4mi.16','vld4pl.16','vld4vs.16','vld4vc.16','vld4hi.16','vld4ls.16','vld4ge.16','vld4lt.16','vld4gt.16','vld4le.16',
+ 'vld4eq.32','vld4ne.32','vld4cs.32','vld4hs.32','vld4cc.32','vld4lo.32','vld4mi.32','vld4pl.32','vld4vs.32','vld4vc.32','vld4hi.32','vld4ls.32','vld4ge.32','vld4lt.32','vld4gt.32','vld4le.32',
+
+ 'vldmeq','vldmne','vldmcs','vldmhs','vldmcc','vldmlo','vldmmi','vldmpl','vldmvs','vldmvc','vldmhi','vldmls','vldmge','vldmlt','vldmgt','vldmle',
+ 'vldmeq.32','vldmne.32','vldmcs.32','vldmhs.32','vldmcc.32','vldmlo.32','vldmmi.32','vldmpl.32','vldmvs.32','vldmvc.32','vldmhi.32','vldmls.32','vldmge.32','vldmlt.32','vldmgt.32','vldmle.32',
+ 'vldmeq.64','vldmne.64','vldmcs.64','vldmhs.64','vldmcc.64','vldmlo.64','vldmmi.64','vldmpl.64','vldmvs.64','vldmvc.64','vldmhi.64','vldmls.64','vldmge.64','vldmlt.64','vldmgt.64','vldmle.64',
+
+ 'vldmiaeq','vldmiane','vldmiacs','vldmiahs','vldmiacc','vldmialo','vldmiami','vldmiapl','vldmiavs','vldmiavc','vldmiahi','vldmials','vldmiage','vldmialt','vldmiagt','vldmiale',
+ 'vldmiaeq.32','vldmiane.32','vldmiacs.32','vldmiahs.32','vldmiacc.32','vldmialo.32','vldmiami.32','vldmiapl.32','vldmiavs.32','vldmiavc.32','vldmiahi.32','vldmials.32','vldmiage.32','vldmialt.32','vldmiagt.32','vldmiale.32',
+ 'vldmiaeq.64','vldmiane.64','vldmiacs.64','vldmiahs.64','vldmiacc.64','vldmialo.64','vldmiami.64','vldmiapl.64','vldmiavs.64','vldmiavc.64','vldmiahi.64','vldmials.64','vldmiage.64','vldmialt.64','vldmiagt.64','vldmiale.64',
+
+ 'vldmdbeq','vldmdbne','vldmdbcs','vldmdbhs','vldmdbcc','vldmdblo','vldmdbmi','vldmdbpl','vldmdbvs','vldmdbvc','vldmdbhi','vldmdbls','vldmdbge','vldmdblt','vldmdbgt','vldmdble',
+ 'vldmdbeq.32','vldmdbne.32','vldmdbcs.32','vldmdbhs.32','vldmdbcc.32','vldmdblo.32','vldmdbmi.32','vldmdbpl.32','vldmdbvs.32','vldmdbvc.32','vldmdbhi.32','vldmdbls.32','vldmdbge.32','vldmdblt.32','vldmdbgt.32','vldmdble.32',
+ 'vldmdbeq.64','vldmdbne.64','vldmdbcs.64','vldmdbhs.64','vldmdbcc.64','vldmdblo.64','vldmdbmi.64','vldmdbpl.64','vldmdbvs.64','vldmdbvc.64','vldmdbhi.64','vldmdbls.64','vldmdbge.64','vldmdblt.64','vldmdbgt.64','vldmdble.64',
+
+ 'vldreq','vldrne','vldrcs','vldrhs','vldrcc','vldrlo','vldrmi','vldrpl','vldrvs','vldrvc','vldrhi','vldrls','vldrge','vldrlt','vldrgt','vldrle',
+ 'vldreq.32','vldrne.32','vldrcs.32','vldrhs.32','vldrcc.32','vldrlo.32','vldrmi.32','vldrpl.32','vldrvs.32','vldrvc.32','vldrhi.32','vldrls.32','vldrge.32','vldrlt.32','vldrgt.32','vldrle.32',
+ 'vldreq.64','vldrne.64','vldrcs.64','vldrhs.64','vldrcc.64','vldrlo.64','vldrmi.64','vldrpl.64','vldrvs.64','vldrvc.64','vldrhi.64','vldrls.64','vldrge.64','vldrlt.64','vldrgt.64','vldrle.64',
+
+ 'vpopeq','vpopne','vpopcs','vpophs','vpopcc','vpoplo','vpopmi','vpoppl','vpopvs','vpopvc','vpophi','vpopls','vpopge','vpoplt','vpopgt','vpople',
+ 'vpopeq.32','vpopne.32','vpopcs.32','vpophs.32','vpopcc.32','vpoplo.32','vpopmi.32','vpoppl.32','vpopvs.32','vpopvc.32','vpophi.32','vpopls.32','vpopge.32','vpoplt.32','vpopgt.32','vpople.32',
+ 'vpopeq.64','vpopne.64','vpopcs.64','vpophs.64','vpopcc.64','vpoplo.64','vpopmi.64','vpoppl.64','vpopvs.64','vpopvc.64','vpophi.64','vpopls.64','vpopge.64','vpoplt.64','vpopgt.64','vpople.64',
+
+ /* Conditional VFPv3 & NEON SIMD Memory Access: Stores */
+ 'vst1eq.8','vst1ne.8','vst1cs.8','vst1hs.8','vst1cc.8','vst1lo.8','vst1mi.8','vst1pl.8','vst1vs.8','vst1vc.8','vst1hi.8','vst1ls.8','vst1ge.8','vst1lt.8','vst1gt.8','vst1le.8',
+ 'vst1eq.16','vst1ne.16','vst1cs.16','vst1hs.16','vst1cc.16','vst1lo.16','vst1mi.16','vst1pl.16','vst1vs.16','vst1vc.16','vst1hi.16','vst1ls.16','vst1ge.16','vst1lt.16','vst1gt.16','vst1le.16',
+ 'vst1eq.32','vst1ne.32','vst1cs.32','vst1hs.32','vst1cc.32','vst1lo.32','vst1mi.32','vst1pl.32','vst1vs.32','vst1vc.32','vst1hi.32','vst1ls.32','vst1ge.32','vst1lt.32','vst1gt.32','vst1le.32',
+ 'vst1eq.64','vst1ne.64','vst1cs.64','vst1hs.64','vst1cc.64','vst1lo.64','vst1mi.64','vst1pl.64','vst1vs.64','vst1vc.64','vst1hi.64','vst1ls.64','vst1ge.64','vst1lt.64','vst1gt.64','vst1le.64',
+
+ 'vst2eq.8','vst2ne.8','vst2cs.8','vst2hs.8','vst2cc.8','vst2lo.8','vst2mi.8','vst2pl.8','vst2vs.8','vst2vc.8','vst2hi.8','vst2ls.8','vst2ge.8','vst2lt.8','vst2gt.8','vst2le.8',
+ 'vst2eq.16','vst2ne.16','vst2cs.16','vst2hs.16','vst2cc.16','vst2lo.16','vst2mi.16','vst2pl.16','vst2vs.16','vst2vc.16','vst2hi.16','vst2ls.16','vst2ge.16','vst2lt.16','vst2gt.16','vst2le.16',
+ 'vst2eq.32','vst2ne.32','vst2cs.32','vst2hs.32','vst2cc.32','vst2lo.32','vst2mi.32','vst2pl.32','vst2vs.32','vst2vc.32','vst2hi.32','vst2ls.32','vst2ge.32','vst2lt.32','vst2gt.32','vst2le.32',
+
+ 'vst3eq.8','vst3ne.8','vst3cs.8','vst3hs.8','vst3cc.8','vst3lo.8','vst3mi.8','vst3pl.8','vst3vs.8','vst3vc.8','vst3hi.8','vst3ls.8','vst3ge.8','vst3lt.8','vst3gt.8','vst3le.8',
+ 'vst3eq.16','vst3ne.16','vst3cs.16','vst3hs.16','vst3cc.16','vst3lo.16','vst3mi.16','vst3pl.16','vst3vs.16','vst3vc.16','vst3hi.16','vst3ls.16','vst3ge.16','vst3lt.16','vst3gt.16','vst3le.16',
+ 'vst3eq.32','vst3ne.32','vst3cs.32','vst3hs.32','vst3cc.32','vst3lo.32','vst3mi.32','vst3pl.32','vst3vs.32','vst3vc.32','vst3hi.32','vst3ls.32','vst3ge.32','vst3lt.32','vst3gt.32','vst3le.32',
+
+ 'vst4eq.8','vst4ne.8','vst4cs.8','vst4hs.8','vst4cc.8','vst4lo.8','vst4mi.8','vst4pl.8','vst4vs.8','vst4vc.8','vst4hi.8','vst4ls.8','vst4ge.8','vst4lt.8','vst4gt.8','vst4le.8',
+ 'vst4eq.16','vst4ne.16','vst4cs.16','vst4hs.16','vst4cc.16','vst4lo.16','vst4mi.16','vst4pl.16','vst4vs.16','vst4vc.16','vst4hi.16','vst4ls.16','vst4ge.16','vst4lt.16','vst4gt.16','vst4le.16',
+ 'vst4eq.32','vst4ne.32','vst4cs.32','vst4hs.32','vst4cc.32','vst4lo.32','vst4mi.32','vst4pl.32','vst4vs.32','vst4vc.32','vst4hi.32','vst4ls.32','vst4ge.32','vst4lt.32','vst4gt.32','vst4le.32',
+
+ 'vstmeq','vstmne','vstmcs','vstmhs','vstmcc','vstmlo','vstmmi','vstmpl','vstmvs','vstmvc','vstmhi','vstmls','vstmge','vstmlt','vstmgt','vstmle',
+ 'vstmeq.32','vstmne.32','vstmcs.32','vstmhs.32','vstmcc.32','vstmlo.32','vstmmi.32','vstmpl.32','vstmvs.32','vstmvc.32','vstmhi.32','vstmls.32','vstmge.32','vstmlt.32','vstmgt.32','vstmle.32',
+ 'vstmeq.64','vstmne.64','vstmcs.64','vstmhs.64','vstmcc.64','vstmlo.64','vstmmi.64','vstmpl.64','vstmvs.64','vstmvc.64','vstmhi.64','vstmls.64','vstmge.64','vstmlt.64','vstmgt.64','vstmle.64',
+
+ 'vstmiaeq','vstmiane','vstmiacs','vstmiahs','vstmiacc','vstmialo','vstmiami','vstmiapl','vstmiavs','vstmiavc','vstmiahi','vstmials','vstmiage','vstmialt','vstmiagt','vstmiale',
+ 'vstmiaeq.32','vstmiane.32','vstmiacs.32','vstmiahs.32','vstmiacc.32','vstmialo.32','vstmiami.32','vstmiapl.32','vstmiavs.32','vstmiavc.32','vstmiahi.32','vstmials.32','vstmiage.32','vstmialt.32','vstmiagt.32','vstmiale.32',
+ 'vstmiaeq.64','vstmiane.64','vstmiacs.64','vstmiahs.64','vstmiacc.64','vstmialo.64','vstmiami.64','vstmiapl.64','vstmiavs.64','vstmiavc.64','vstmiahi.64','vstmials.64','vstmiage.64','vstmialt.64','vstmiagt.64','vstmiale.64',
+
+ 'vstmdbeq','vstmdbne','vstmdbcs','vstmdbhs','vstmdbcc','vstmdblo','vstmdbmi','vstmdbpl','vstmdbvs','vstmdbvc','vstmdbhi','vstmdbls','vstmdbge','vstmdblt','vstmdbgt','vstmdble',
+ 'vstmdbeq.32','vstmdbne.32','vstmdbcs.32','vstmdbhs.32','vstmdbcc.32','vstmdblo.32','vstmdbmi.32','vstmdbpl.32','vstmdbvs.32','vstmdbvc.32','vstmdbhi.32','vstmdbls.32','vstmdbge.32','vstmdblt.32','vstmdbgt.32','vstmdble.32',
+ 'vstmdbeq.64','vstmdbne.64','vstmdbcs.64','vstmdbhs.64','vstmdbcc.64','vstmdblo.64','vstmdbmi.64','vstmdbpl.64','vstmdbvs.64','vstmdbvc.64','vstmdbhi.64','vstmdbls.64','vstmdbge.64','vstmdblt.64','vstmdbgt.64','vstmdble.64',
+
+ 'vstreq','vstrne','vstrcs','vstrhs','vstrcc','vstrlo','vstrmi','vstrpl','vstrvs','vstrvc','vstrhi','vstrls','vstrge','vstrlt','vstrgt','vstrle',
+ 'vstreq.32','vstrne.32','vstrcs.32','vstrhs.32','vstrcc.32','vstrlo.32','vstrmi.32','vstrpl.32','vstrvs.32','vstrvc.32','vstrhi.32','vstrls.32','vstrge.32','vstrlt.32','vstrgt.32','vstrle.32',
+ 'vstreq.64','vstrne.64','vstrcs.64','vstrhs.64','vstrcc.64','vstrlo.64','vstrmi.64','vstrpl.64','vstrvs.64','vstrvc.64','vstrhi.64','vstrls.64','vstrge.64','vstrlt.64','vstrgt.64','vstrle.64',
+
+ 'vpusheq','vpushne','vpushcs','vpushhs','vpushcc','vpushlo','vpushmi','vpushpl','vpushvs','vpushvc','vpushhi','vpushls','vpushge','vpushlt','vpushgt','vpushle',
+ 'vpusheq.32','vpushne.32','vpushcs.32','vpushhs.32','vpushcc.32','vpushlo.32','vpushmi.32','vpushpl.32','vpushvs.32','vpushvc.32','vpushhi.32','vpushls.32','vpushge.32','vpushlt.32','vpushgt.32','vpushle.32',
+ 'vpusheq.64','vpushne.64','vpushcs.64','vpushhs.64','vpushcc.64','vpushlo.64','vpushmi.64','vpushpl.64','vpushvs.64','vpushvc.64','vpushhi.64','vpushls.64','vpushge.64','vpushlt.64','vpushgt.64','vpushle.64'
+ ),
+ /* Conditional NEON SIMD Logical Instructions */
+ 28 => array(
+ 'vandeq','vandne','vandcs','vandhs','vandcc','vandlo','vandmi','vandpl','vandvs','vandvc','vandhi','vandls','vandge','vandlt','vandgt','vandle',
+ 'vandeq.i8','vandne.i8','vandcs.i8','vandhs.i8','vandcc.i8','vandlo.i8','vandmi.i8','vandpl.i8','vandvs.i8','vandvc.i8','vandhi.i8','vandls.i8','vandge.i8','vandlt.i8','vandgt.i8','vandle.i8',
+ 'vandeq.i16','vandne.i16','vandcs.i16','vandhs.i16','vandcc.i16','vandlo.i16','vandmi.i16','vandpl.i16','vandvs.i16','vandvc.i16','vandhi.i16','vandls.i16','vandge.i16','vandlt.i16','vandgt.i16','vandle.i16',
+ 'vandeq.i32','vandne.i32','vandcs.i32','vandhs.i32','vandcc.i32','vandlo.i32','vandmi.i32','vandpl.i32','vandvs.i32','vandvc.i32','vandhi.i32','vandls.i32','vandge.i32','vandlt.i32','vandgt.i32','vandle.i32',
+ 'vandeq.i64','vandne.i64','vandcs.i64','vandhs.i64','vandcc.i64','vandlo.i64','vandmi.i64','vandpl.i64','vandvs.i64','vandvc.i64','vandhi.i64','vandls.i64','vandge.i64','vandlt.i64','vandgt.i64','vandle.i64',
+ 'vandeq.s8','vandne.s8','vandcs.s8','vandhs.s8','vandcc.s8','vandlo.s8','vandmi.s8','vandpl.s8','vandvs.s8','vandvc.s8','vandhi.s8','vandls.s8','vandge.s8','vandlt.s8','vandgt.s8','vandle.s8',
+ 'vandeq.s16','vandne.s16','vandcs.s16','vandhs.s16','vandcc.s16','vandlo.s16','vandmi.s16','vandpl.s16','vandvs.s16','vandvc.s16','vandhi.s16','vandls.s16','vandge.s16','vandlt.s16','vandgt.s16','vandle.s16',
+ 'vandeq.s32','vandne.s32','vandcs.s32','vandhs.s32','vandcc.s32','vandlo.s32','vandmi.s32','vandpl.s32','vandvs.s32','vandvc.s32','vandhi.s32','vandls.s32','vandge.s32','vandlt.s32','vandgt.s32','vandle.s32',
+ 'vandeq.s64','vandne.s64','vandcs.s64','vandhs.s64','vandcc.s64','vandlo.s64','vandmi.s64','vandpl.s64','vandvs.s64','vandvc.s64','vandhi.s64','vandls.s64','vandge.s64','vandlt.s64','vandgt.s64','vandle.s64',
+ 'vandeq.u8','vandne.u8','vandcs.u8','vandhs.u8','vandcc.u8','vandlo.u8','vandmi.u8','vandpl.u8','vandvs.u8','vandvc.u8','vandhi.u8','vandls.u8','vandge.u8','vandlt.u8','vandgt.u8','vandle.u8',
+ 'vandeq.u16','vandne.u16','vandcs.u16','vandhs.u16','vandcc.u16','vandlo.u16','vandmi.u16','vandpl.u16','vandvs.u16','vandvc.u16','vandhi.u16','vandls.u16','vandge.u16','vandlt.u16','vandgt.u16','vandle.u16',
+ 'vandeq.u32','vandne.u32','vandcs.u32','vandhs.u32','vandcc.u32','vandlo.u32','vandmi.u32','vandpl.u32','vandvs.u32','vandvc.u32','vandhi.u32','vandls.u32','vandge.u32','vandlt.u32','vandgt.u32','vandle.u32',
+ 'vandeq.u64','vandne.u64','vandcs.u64','vandhs.u64','vandcc.u64','vandlo.u64','vandmi.u64','vandpl.u64','vandvs.u64','vandvc.u64','vandhi.u64','vandls.u64','vandge.u64','vandlt.u64','vandgt.u64','vandle.u64',
+ 'vandeq.f32','vandne.f32','vandcs.f32','vandhs.f32','vandcc.f32','vandlo.f32','vandmi.f32','vandpl.f32','vandvs.f32','vandvc.f32','vandhi.f32','vandls.f32','vandge.f32','vandlt.f32','vandgt.f32','vandle.f32',
+ 'vandeq.f64','vandne.f64','vandcs.f64','vandhs.f64','vandcc.f64','vandlo.f64','vandmi.f64','vandpl.f64','vandvs.f64','vandvc.f64','vandhi.f64','vandls.f64','vandge.f64','vandlt.f64','vandgt.f64','vandle.f64',
+
+ 'vbiceq','vbicne','vbiccs','vbichs','vbiccc','vbiclo','vbicmi','vbicpl','vbicvs','vbicvc','vbichi','vbicls','vbicge','vbiclt','vbicgt','vbicle',
+ 'vbiceq.i8','vbicne.i8','vbiccs.i8','vbichs.i8','vbiccc.i8','vbiclo.i8','vbicmi.i8','vbicpl.i8','vbicvs.i8','vbicvc.i8','vbichi.i8','vbicls.i8','vbicge.i8','vbiclt.i8','vbicgt.i8','vbicle.i8',
+ 'vbiceq.i16','vbicne.i16','vbiccs.i16','vbichs.i16','vbiccc.i16','vbiclo.i16','vbicmi.i16','vbicpl.i16','vbicvs.i16','vbicvc.i16','vbichi.i16','vbicls.i16','vbicge.i16','vbiclt.i16','vbicgt.i16','vbicle.i16',
+ 'vbiceq.i32','vbicne.i32','vbiccs.i32','vbichs.i32','vbiccc.i32','vbiclo.i32','vbicmi.i32','vbicpl.i32','vbicvs.i32','vbicvc.i32','vbichi.i32','vbicls.i32','vbicge.i32','vbiclt.i32','vbicgt.i32','vbicle.i32',
+ 'vbiceq.i64','vbicne.i64','vbiccs.i64','vbichs.i64','vbiccc.i64','vbiclo.i64','vbicmi.i64','vbicpl.i64','vbicvs.i64','vbicvc.i64','vbichi.i64','vbicls.i64','vbicge.i64','vbiclt.i64','vbicgt.i64','vbicle.i64',
+ 'vbiceq.s8','vbicne.s8','vbiccs.s8','vbichs.s8','vbiccc.s8','vbiclo.s8','vbicmi.s8','vbicpl.s8','vbicvs.s8','vbicvc.s8','vbichi.s8','vbicls.s8','vbicge.s8','vbiclt.s8','vbicgt.s8','vbicle.s8',
+ 'vbiceq.s16','vbicne.s16','vbiccs.s16','vbichs.s16','vbiccc.s16','vbiclo.s16','vbicmi.s16','vbicpl.s16','vbicvs.s16','vbicvc.s16','vbichi.s16','vbicls.s16','vbicge.s16','vbiclt.s16','vbicgt.s16','vbicle.s16',
+ 'vbiceq.s32','vbicne.s32','vbiccs.s32','vbichs.s32','vbiccc.s32','vbiclo.s32','vbicmi.s32','vbicpl.s32','vbicvs.s32','vbicvc.s32','vbichi.s32','vbicls.s32','vbicge.s32','vbiclt.s32','vbicgt.s32','vbicle.s32',
+ 'vbiceq.s64','vbicne.s64','vbiccs.s64','vbichs.s64','vbiccc.s64','vbiclo.s64','vbicmi.s64','vbicpl.s64','vbicvs.s64','vbicvc.s64','vbichi.s64','vbicls.s64','vbicge.s64','vbiclt.s64','vbicgt.s64','vbicle.s64',
+ 'vbiceq.u8','vbicne.u8','vbiccs.u8','vbichs.u8','vbiccc.u8','vbiclo.u8','vbicmi.u8','vbicpl.u8','vbicvs.u8','vbicvc.u8','vbichi.u8','vbicls.u8','vbicge.u8','vbiclt.u8','vbicgt.u8','vbicle.u8',
+ 'vbiceq.u16','vbicne.u16','vbiccs.u16','vbichs.u16','vbiccc.u16','vbiclo.u16','vbicmi.u16','vbicpl.u16','vbicvs.u16','vbicvc.u16','vbichi.u16','vbicls.u16','vbicge.u16','vbiclt.u16','vbicgt.u16','vbicle.u16',
+ 'vbiceq.u32','vbicne.u32','vbiccs.u32','vbichs.u32','vbiccc.u32','vbiclo.u32','vbicmi.u32','vbicpl.u32','vbicvs.u32','vbicvc.u32','vbichi.u32','vbicls.u32','vbicge.u32','vbiclt.u32','vbicgt.u32','vbicle.u32',
+ 'vbiceq.u64','vbicne.u64','vbiccs.u64','vbichs.u64','vbiccc.u64','vbiclo.u64','vbicmi.u64','vbicpl.u64','vbicvs.u64','vbicvc.u64','vbichi.u64','vbicls.u64','vbicge.u64','vbiclt.u64','vbicgt.u64','vbicle.u64',
+ 'vbiceq.f32','vbicne.f32','vbiccs.f32','vbichs.f32','vbiccc.f32','vbiclo.f32','vbicmi.f32','vbicpl.f32','vbicvs.f32','vbicvc.f32','vbichi.f32','vbicls.f32','vbicge.f32','vbiclt.f32','vbicgt.f32','vbicle.f32',
+ 'vbiceq.f64','vbicne.f64','vbiccs.f64','vbichs.f64','vbiccc.f64','vbiclo.f64','vbicmi.f64','vbicpl.f64','vbicvs.f64','vbicvc.f64','vbichi.f64','vbicls.f64','vbicge.f64','vbiclt.f64','vbicgt.f64','vbicle.f64',
+
+ 'vbifeq','vbifne','vbifcs','vbifhs','vbifcc','vbiflo','vbifmi','vbifpl','vbifvs','vbifvc','vbifhi','vbifls','vbifge','vbiflt','vbifgt','vbifle',
+ 'vbifeq.i8','vbifne.i8','vbifcs.i8','vbifhs.i8','vbifcc.i8','vbiflo.i8','vbifmi.i8','vbifpl.i8','vbifvs.i8','vbifvc.i8','vbifhi.i8','vbifls.i8','vbifge.i8','vbiflt.i8','vbifgt.i8','vbifle.i8',
+ 'vbifeq.i16','vbifne.i16','vbifcs.i16','vbifhs.i16','vbifcc.i16','vbiflo.i16','vbifmi.i16','vbifpl.i16','vbifvs.i16','vbifvc.i16','vbifhi.i16','vbifls.i16','vbifge.i16','vbiflt.i16','vbifgt.i16','vbifle.i16',
+ 'vbifeq.i32','vbifne.i32','vbifcs.i32','vbifhs.i32','vbifcc.i32','vbiflo.i32','vbifmi.i32','vbifpl.i32','vbifvs.i32','vbifvc.i32','vbifhi.i32','vbifls.i32','vbifge.i32','vbiflt.i32','vbifgt.i32','vbifle.i32',
+ 'vbifeq.i64','vbifne.i64','vbifcs.i64','vbifhs.i64','vbifcc.i64','vbiflo.i64','vbifmi.i64','vbifpl.i64','vbifvs.i64','vbifvc.i64','vbifhi.i64','vbifls.i64','vbifge.i64','vbiflt.i64','vbifgt.i64','vbifle.i64',
+ 'vbifeq.s8','vbifne.s8','vbifcs.s8','vbifhs.s8','vbifcc.s8','vbiflo.s8','vbifmi.s8','vbifpl.s8','vbifvs.s8','vbifvc.s8','vbifhi.s8','vbifls.s8','vbifge.s8','vbiflt.s8','vbifgt.s8','vbifle.s8',
+ 'vbifeq.s16','vbifne.s16','vbifcs.s16','vbifhs.s16','vbifcc.s16','vbiflo.s16','vbifmi.s16','vbifpl.s16','vbifvs.s16','vbifvc.s16','vbifhi.s16','vbifls.s16','vbifge.s16','vbiflt.s16','vbifgt.s16','vbifle.s16',
+ 'vbifeq.s32','vbifne.s32','vbifcs.s32','vbifhs.s32','vbifcc.s32','vbiflo.s32','vbifmi.s32','vbifpl.s32','vbifvs.s32','vbifvc.s32','vbifhi.s32','vbifls.s32','vbifge.s32','vbiflt.s32','vbifgt.s32','vbifle.s32',
+ 'vbifeq.s64','vbifne.s64','vbifcs.s64','vbifhs.s64','vbifcc.s64','vbiflo.s64','vbifmi.s64','vbifpl.s64','vbifvs.s64','vbifvc.s64','vbifhi.s64','vbifls.s64','vbifge.s64','vbiflt.s64','vbifgt.s64','vbifle.s64',
+ 'vbifeq.u8','vbifne.u8','vbifcs.u8','vbifhs.u8','vbifcc.u8','vbiflo.u8','vbifmi.u8','vbifpl.u8','vbifvs.u8','vbifvc.u8','vbifhi.u8','vbifls.u8','vbifge.u8','vbiflt.u8','vbifgt.u8','vbifle.u8',
+ 'vbifeq.u16','vbifne.u16','vbifcs.u16','vbifhs.u16','vbifcc.u16','vbiflo.u16','vbifmi.u16','vbifpl.u16','vbifvs.u16','vbifvc.u16','vbifhi.u16','vbifls.u16','vbifge.u16','vbiflt.u16','vbifgt.u16','vbifle.u16',
+ 'vbifeq.u32','vbifne.u32','vbifcs.u32','vbifhs.u32','vbifcc.u32','vbiflo.u32','vbifmi.u32','vbifpl.u32','vbifvs.u32','vbifvc.u32','vbifhi.u32','vbifls.u32','vbifge.u32','vbiflt.u32','vbifgt.u32','vbifle.u32',
+ 'vbifeq.u64','vbifne.u64','vbifcs.u64','vbifhs.u64','vbifcc.u64','vbiflo.u64','vbifmi.u64','vbifpl.u64','vbifvs.u64','vbifvc.u64','vbifhi.u64','vbifls.u64','vbifge.u64','vbiflt.u64','vbifgt.u64','vbifle.u64',
+ 'vbifeq.f32','vbifne.f32','vbifcs.f32','vbifhs.f32','vbifcc.f32','vbiflo.f32','vbifmi.f32','vbifpl.f32','vbifvs.f32','vbifvc.f32','vbifhi.f32','vbifls.f32','vbifge.f32','vbiflt.f32','vbifgt.f32','vbifle.f32',
+ 'vbifeq.f64','vbifne.f64','vbifcs.f64','vbifhs.f64','vbifcc.f64','vbiflo.f64','vbifmi.f64','vbifpl.f64','vbifvs.f64','vbifvc.f64','vbifhi.f64','vbifls.f64','vbifge.f64','vbiflt.f64','vbifgt.f64','vbifle.f64',
+
+ 'vbiteq','vbitne','vbitcs','vbiths','vbitcc','vbitlo','vbitmi','vbitpl','vbitvs','vbitvc','vbithi','vbitls','vbitge','vbitlt','vbitgt','vbitle',
+ 'vbiteq.i8','vbitne.i8','vbitcs.i8','vbiths.i8','vbitcc.i8','vbitlo.i8','vbitmi.i8','vbitpl.i8','vbitvs.i8','vbitvc.i8','vbithi.i8','vbitls.i8','vbitge.i8','vbitlt.i8','vbitgt.i8','vbitle.i8',
+ 'vbiteq.i16','vbitne.i16','vbitcs.i16','vbiths.i16','vbitcc.i16','vbitlo.i16','vbitmi.i16','vbitpl.i16','vbitvs.i16','vbitvc.i16','vbithi.i16','vbitls.i16','vbitge.i16','vbitlt.i16','vbitgt.i16','vbitle.i16',
+ 'vbiteq.i32','vbitne.i32','vbitcs.i32','vbiths.i32','vbitcc.i32','vbitlo.i32','vbitmi.i32','vbitpl.i32','vbitvs.i32','vbitvc.i32','vbithi.i32','vbitls.i32','vbitge.i32','vbitlt.i32','vbitgt.i32','vbitle.i32',
+ 'vbiteq.i64','vbitne.i64','vbitcs.i64','vbiths.i64','vbitcc.i64','vbitlo.i64','vbitmi.i64','vbitpl.i64','vbitvs.i64','vbitvc.i64','vbithi.i64','vbitls.i64','vbitge.i64','vbitlt.i64','vbitgt.i64','vbitle.i64',
+ 'vbiteq.s8','vbitne.s8','vbitcs.s8','vbiths.s8','vbitcc.s8','vbitlo.s8','vbitmi.s8','vbitpl.s8','vbitvs.s8','vbitvc.s8','vbithi.s8','vbitls.s8','vbitge.s8','vbitlt.s8','vbitgt.s8','vbitle.s8',
+ 'vbiteq.s16','vbitne.s16','vbitcs.s16','vbiths.s16','vbitcc.s16','vbitlo.s16','vbitmi.s16','vbitpl.s16','vbitvs.s16','vbitvc.s16','vbithi.s16','vbitls.s16','vbitge.s16','vbitlt.s16','vbitgt.s16','vbitle.s16',
+ 'vbiteq.s32','vbitne.s32','vbitcs.s32','vbiths.s32','vbitcc.s32','vbitlo.s32','vbitmi.s32','vbitpl.s32','vbitvs.s32','vbitvc.s32','vbithi.s32','vbitls.s32','vbitge.s32','vbitlt.s32','vbitgt.s32','vbitle.s32',
+ 'vbiteq.s64','vbitne.s64','vbitcs.s64','vbiths.s64','vbitcc.s64','vbitlo.s64','vbitmi.s64','vbitpl.s64','vbitvs.s64','vbitvc.s64','vbithi.s64','vbitls.s64','vbitge.s64','vbitlt.s64','vbitgt.s64','vbitle.s64',
+ 'vbiteq.u8','vbitne.u8','vbitcs.u8','vbiths.u8','vbitcc.u8','vbitlo.u8','vbitmi.u8','vbitpl.u8','vbitvs.u8','vbitvc.u8','vbithi.u8','vbitls.u8','vbitge.u8','vbitlt.u8','vbitgt.u8','vbitle.u8',
+ 'vbiteq.u16','vbitne.u16','vbitcs.u16','vbiths.u16','vbitcc.u16','vbitlo.u16','vbitmi.u16','vbitpl.u16','vbitvs.u16','vbitvc.u16','vbithi.u16','vbitls.u16','vbitge.u16','vbitlt.u16','vbitgt.u16','vbitle.u16',
+ 'vbiteq.u32','vbitne.u32','vbitcs.u32','vbiths.u32','vbitcc.u32','vbitlo.u32','vbitmi.u32','vbitpl.u32','vbitvs.u32','vbitvc.u32','vbithi.u32','vbitls.u32','vbitge.u32','vbitlt.u32','vbitgt.u32','vbitle.u32',
+ 'vbiteq.u64','vbitne.u64','vbitcs.u64','vbiths.u64','vbitcc.u64','vbitlo.u64','vbitmi.u64','vbitpl.u64','vbitvs.u64','vbitvc.u64','vbithi.u64','vbitls.u64','vbitge.u64','vbitlt.u64','vbitgt.u64','vbitle.u64',
+ 'vbiteq.f32','vbitne.f32','vbitcs.f32','vbiths.f32','vbitcc.f32','vbitlo.f32','vbitmi.f32','vbitpl.f32','vbitvs.f32','vbitvc.f32','vbithi.f32','vbitls.f32','vbitge.f32','vbitlt.f32','vbitgt.f32','vbitle.f32',
+ 'vbiteq.f64','vbitne.f64','vbitcs.f64','vbiths.f64','vbitcc.f64','vbitlo.f64','vbitmi.f64','vbitpl.f64','vbitvs.f64','vbitvc.f64','vbithi.f64','vbitls.f64','vbitge.f64','vbitlt.f64','vbitgt.f64','vbitle.f64',
+
+ 'vbsleq','vbslne','vbslcs','vbslhs','vbslcc','vbsllo','vbslmi','vbslpl','vbslvs','vbslvc','vbslhi','vbslls','vbslge','vbsllt','vbslgt','vbslle',
+ 'vbsleq.i8','vbslne.i8','vbslcs.i8','vbslhs.i8','vbslcc.i8','vbsllo.i8','vbslmi.i8','vbslpl.i8','vbslvs.i8','vbslvc.i8','vbslhi.i8','vbslls.i8','vbslge.i8','vbsllt.i8','vbslgt.i8','vbslle.i8',
+ 'vbsleq.i16','vbslne.i16','vbslcs.i16','vbslhs.i16','vbslcc.i16','vbsllo.i16','vbslmi.i16','vbslpl.i16','vbslvs.i16','vbslvc.i16','vbslhi.i16','vbslls.i16','vbslge.i16','vbsllt.i16','vbslgt.i16','vbslle.i16',
+ 'vbsleq.i32','vbslne.i32','vbslcs.i32','vbslhs.i32','vbslcc.i32','vbsllo.i32','vbslmi.i32','vbslpl.i32','vbslvs.i32','vbslvc.i32','vbslhi.i32','vbslls.i32','vbslge.i32','vbsllt.i32','vbslgt.i32','vbslle.i32',
+ 'vbsleq.i64','vbslne.i64','vbslcs.i64','vbslhs.i64','vbslcc.i64','vbsllo.i64','vbslmi.i64','vbslpl.i64','vbslvs.i64','vbslvc.i64','vbslhi.i64','vbslls.i64','vbslge.i64','vbsllt.i64','vbslgt.i64','vbslle.i64',
+ 'vbsleq.s8','vbslne.s8','vbslcs.s8','vbslhs.s8','vbslcc.s8','vbsllo.s8','vbslmi.s8','vbslpl.s8','vbslvs.s8','vbslvc.s8','vbslhi.s8','vbslls.s8','vbslge.s8','vbsllt.s8','vbslgt.s8','vbslle.s8',
+ 'vbsleq.s16','vbslne.s16','vbslcs.s16','vbslhs.s16','vbslcc.s16','vbsllo.s16','vbslmi.s16','vbslpl.s16','vbslvs.s16','vbslvc.s16','vbslhi.s16','vbslls.s16','vbslge.s16','vbsllt.s16','vbslgt.s16','vbslle.s16',
+ 'vbsleq.s32','vbslne.s32','vbslcs.s32','vbslhs.s32','vbslcc.s32','vbsllo.s32','vbslmi.s32','vbslpl.s32','vbslvs.s32','vbslvc.s32','vbslhi.s32','vbslls.s32','vbslge.s32','vbsllt.s32','vbslgt.s32','vbslle.s32',
+ 'vbsleq.s64','vbslne.s64','vbslcs.s64','vbslhs.s64','vbslcc.s64','vbsllo.s64','vbslmi.s64','vbslpl.s64','vbslvs.s64','vbslvc.s64','vbslhi.s64','vbslls.s64','vbslge.s64','vbsllt.s64','vbslgt.s64','vbslle.s64',
+ 'vbsleq.u8','vbslne.u8','vbslcs.u8','vbslhs.u8','vbslcc.u8','vbsllo.u8','vbslmi.u8','vbslpl.u8','vbslvs.u8','vbslvc.u8','vbslhi.u8','vbslls.u8','vbslge.u8','vbsllt.u8','vbslgt.u8','vbslle.u8',
+ 'vbsleq.u16','vbslne.u16','vbslcs.u16','vbslhs.u16','vbslcc.u16','vbsllo.u16','vbslmi.u16','vbslpl.u16','vbslvs.u16','vbslvc.u16','vbslhi.u16','vbslls.u16','vbslge.u16','vbsllt.u16','vbslgt.u16','vbslle.u16',
+ 'vbsleq.u32','vbslne.u32','vbslcs.u32','vbslhs.u32','vbslcc.u32','vbsllo.u32','vbslmi.u32','vbslpl.u32','vbslvs.u32','vbslvc.u32','vbslhi.u32','vbslls.u32','vbslge.u32','vbsllt.u32','vbslgt.u32','vbslle.u32',
+ 'vbsleq.u64','vbslne.u64','vbslcs.u64','vbslhs.u64','vbslcc.u64','vbsllo.u64','vbslmi.u64','vbslpl.u64','vbslvs.u64','vbslvc.u64','vbslhi.u64','vbslls.u64','vbslge.u64','vbsllt.u64','vbslgt.u64','vbslle.u64',
+ 'vbsleq.f32','vbslne.f32','vbslcs.f32','vbslhs.f32','vbslcc.f32','vbsllo.f32','vbslmi.f32','vbslpl.f32','vbslvs.f32','vbslvc.f32','vbslhi.f32','vbslls.f32','vbslge.f32','vbsllt.f32','vbslgt.f32','vbslle.f32',
+ 'vbsleq.f64','vbslne.f64','vbslcs.f64','vbslhs.f64','vbslcc.f64','vbsllo.f64','vbslmi.f64','vbslpl.f64','vbslvs.f64','vbslvc.f64','vbslhi.f64','vbslls.f64','vbslge.f64','vbsllt.f64','vbslgt.f64','vbslle.f64',
+
+ 'veoreq','veorne','veorcs','veorhs','veorcc','veorlo','veormi','veorpl','veorvs','veorvc','veorhi','veorls','veorge','veorlt','veorgt','veorle',
+ 'veoreq.i8','veorne.i8','veorcs.i8','veorhs.i8','veorcc.i8','veorlo.i8','veormi.i8','veorpl.i8','veorvs.i8','veorvc.i8','veorhi.i8','veorls.i8','veorge.i8','veorlt.i8','veorgt.i8','veorle.i8',
+ 'veoreq.i16','veorne.i16','veorcs.i16','veorhs.i16','veorcc.i16','veorlo.i16','veormi.i16','veorpl.i16','veorvs.i16','veorvc.i16','veorhi.i16','veorls.i16','veorge.i16','veorlt.i16','veorgt.i16','veorle.i16',
+ 'veoreq.i32','veorne.i32','veorcs.i32','veorhs.i32','veorcc.i32','veorlo.i32','veormi.i32','veorpl.i32','veorvs.i32','veorvc.i32','veorhi.i32','veorls.i32','veorge.i32','veorlt.i32','veorgt.i32','veorle.i32',
+ 'veoreq.i64','veorne.i64','veorcs.i64','veorhs.i64','veorcc.i64','veorlo.i64','veormi.i64','veorpl.i64','veorvs.i64','veorvc.i64','veorhi.i64','veorls.i64','veorge.i64','veorlt.i64','veorgt.i64','veorle.i64',
+ 'veoreq.s8','veorne.s8','veorcs.s8','veorhs.s8','veorcc.s8','veorlo.s8','veormi.s8','veorpl.s8','veorvs.s8','veorvc.s8','veorhi.s8','veorls.s8','veorge.s8','veorlt.s8','veorgt.s8','veorle.s8',
+ 'veoreq.s16','veorne.s16','veorcs.s16','veorhs.s16','veorcc.s16','veorlo.s16','veormi.s16','veorpl.s16','veorvs.s16','veorvc.s16','veorhi.s16','veorls.s16','veorge.s16','veorlt.s16','veorgt.s16','veorle.s16',
+ 'veoreq.s32','veorne.s32','veorcs.s32','veorhs.s32','veorcc.s32','veorlo.s32','veormi.s32','veorpl.s32','veorvs.s32','veorvc.s32','veorhi.s32','veorls.s32','veorge.s32','veorlt.s32','veorgt.s32','veorle.s32',
+ 'veoreq.s64','veorne.s64','veorcs.s64','veorhs.s64','veorcc.s64','veorlo.s64','veormi.s64','veorpl.s64','veorvs.s64','veorvc.s64','veorhi.s64','veorls.s64','veorge.s64','veorlt.s64','veorgt.s64','veorle.s64',
+ 'veoreq.u8','veorne.u8','veorcs.u8','veorhs.u8','veorcc.u8','veorlo.u8','veormi.u8','veorpl.u8','veorvs.u8','veorvc.u8','veorhi.u8','veorls.u8','veorge.u8','veorlt.u8','veorgt.u8','veorle.u8',
+ 'veoreq.u16','veorne.u16','veorcs.u16','veorhs.u16','veorcc.u16','veorlo.u16','veormi.u16','veorpl.u16','veorvs.u16','veorvc.u16','veorhi.u16','veorls.u16','veorge.u16','veorlt.u16','veorgt.u16','veorle.u16',
+ 'veoreq.u32','veorne.u32','veorcs.u32','veorhs.u32','veorcc.u32','veorlo.u32','veormi.u32','veorpl.u32','veorvs.u32','veorvc.u32','veorhi.u32','veorls.u32','veorge.u32','veorlt.u32','veorgt.u32','veorle.u32',
+ 'veoreq.u64','veorne.u64','veorcs.u64','veorhs.u64','veorcc.u64','veorlo.u64','veormi.u64','veorpl.u64','veorvs.u64','veorvc.u64','veorhi.u64','veorls.u64','veorge.u64','veorlt.u64','veorgt.u64','veorle.u64',
+ 'veoreq.f32','veorne.f32','veorcs.f32','veorhs.f32','veorcc.f32','veorlo.f32','veormi.f32','veorpl.f32','veorvs.f32','veorvc.f32','veorhi.f32','veorls.f32','veorge.f32','veorlt.f32','veorgt.f32','veorle.f32',
+ 'veoreq.f64','veorne.f64','veorcs.f64','veorhs.f64','veorcc.f64','veorlo.f64','veormi.f64','veorpl.f64','veorvs.f64','veorvc.f64','veorhi.f64','veorls.f64','veorge.f64','veorlt.f64','veorgt.f64','veorle.f64',
+
+ 'vmoveq','vmovne','vmovcs','vmovhs','vmovcc','vmovlo','vmovmi','vmovpl','vmovvs','vmovvc','vmovhi','vmovls','vmovge','vmovlt','vmovgt','vmovle',
+ 'vmoveq.8','vmovne.8','vmovcs.8','vmovhs.8','vmovcc.8','vmovlo.8','vmovmi.8','vmovpl.8','vmovvs.8','vmovvc.8','vmovhi.8','vmovls.8','vmovge.8','vmovlt.8','vmovgt.8','vmovle.8',
+ 'vmoveq.16','vmovne.16','vmovcs.16','vmovhs.16','vmovcc.16','vmovlo.16','vmovmi.16','vmovpl.16','vmovvs.16','vmovvc.16','vmovhi.16','vmovls.16','vmovge.16','vmovlt.16','vmovgt.16','vmovle.16',
+ 'vmoveq.32','vmovne.32','vmovcs.32','vmovhs.32','vmovcc.32','vmovlo.32','vmovmi.32','vmovpl.32','vmovvs.32','vmovvc.32','vmovhi.32','vmovls.32','vmovge.32','vmovlt.32','vmovgt.32','vmovle.32',
+ 'vmoveq.i8','vmovne.i8','vmovcs.i8','vmovhs.i8','vmovcc.i8','vmovlo.i8','vmovmi.i8','vmovpl.i8','vmovvs.i8','vmovvc.i8','vmovhi.i8','vmovls.i8','vmovge.i8','vmovlt.i8','vmovgt.i8','vmovle.i8',
+ 'vmoveq.i16','vmovne.i16','vmovcs.i16','vmovhs.i16','vmovcc.i16','vmovlo.i16','vmovmi.i16','vmovpl.i16','vmovvs.i16','vmovvc.i16','vmovhi.i16','vmovls.i16','vmovge.i16','vmovlt.i16','vmovgt.i16','vmovle.i16',
+ 'vmoveq.i32','vmovne.i32','vmovcs.i32','vmovhs.i32','vmovcc.i32','vmovlo.i32','vmovmi.i32','vmovpl.i32','vmovvs.i32','vmovvc.i32','vmovhi.i32','vmovls.i32','vmovge.i32','vmovlt.i32','vmovgt.i32','vmovle.i32',
+ 'vmoveq.i64','vmovne.i64','vmovcs.i64','vmovhs.i64','vmovcc.i64','vmovlo.i64','vmovmi.i64','vmovpl.i64','vmovvs.i64','vmovvc.i64','vmovhi.i64','vmovls.i64','vmovge.i64','vmovlt.i64','vmovgt.i64','vmovle.i64',
+ 'vmoveq.f32','vmovne.f32','vmovcs.f32','vmovhs.f32','vmovcc.f32','vmovlo.f32','vmovmi.f32','vmovpl.f32','vmovvs.f32','vmovvc.f32','vmovhi.f32','vmovls.f32','vmovge.f32','vmovlt.f32','vmovgt.f32','vmovle.f32',
+ 'vmoveq.f64','vmovne.f64','vmovcs.f64','vmovhs.f64','vmovcc.f64','vmovlo.f64','vmovmi.f64','vmovpl.f64','vmovvs.f64','vmovvc.f64','vmovhi.f64','vmovls.f64','vmovge.f64','vmovlt.f64','vmovgt.f64','vmovle.f64',
+
+ 'vmvneq','vmvnne','vmvncs','vmvnhs','vmvncc','vmvnlo','vmvnmi','vmvnpl','vmvnvs','vmvnvc','vmvnhi','vmvnls','vmvnge','vmvnlt','vmvngt','vmvnle',
+ 'vmvneq.s8','vmvnne.s8','vmvncs.s8','vmvnhs.s8','vmvncc.s8','vmvnlo.s8','vmvnmi.s8','vmvnpl.s8','vmvnvs.s8','vmvnvc.s8','vmvnhi.s8','vmvnls.s8','vmvnge.s8','vmvnlt.s8','vmvngt.s8','vmvnle.s8',
+ 'vmvneq.s16','vmvnne.s16','vmvncs.s16','vmvnhs.s16','vmvncc.s16','vmvnlo.s16','vmvnmi.s16','vmvnpl.s16','vmvnvs.s16','vmvnvc.s16','vmvnhi.s16','vmvnls.s16','vmvnge.s16','vmvnlt.s16','vmvngt.s16','vmvnle.s16',
+ 'vmvneq.s32','vmvnne.s32','vmvncs.s32','vmvnhs.s32','vmvncc.s32','vmvnlo.s32','vmvnmi.s32','vmvnpl.s32','vmvnvs.s32','vmvnvc.s32','vmvnhi.s32','vmvnls.s32','vmvnge.s32','vmvnlt.s32','vmvngt.s32','vmvnle.s32',
+ 'vmvneq.s64','vmvnne.s64','vmvncs.s64','vmvnhs.s64','vmvncc.s64','vmvnlo.s64','vmvnmi.s64','vmvnpl.s64','vmvnvs.s64','vmvnvc.s64','vmvnhi.s64','vmvnls.s64','vmvnge.s64','vmvnlt.s64','vmvngt.s64','vmvnle.s64',
+ 'vmvneq.u8','vmvnne.u8','vmvncs.u8','vmvnhs.u8','vmvncc.u8','vmvnlo.u8','vmvnmi.u8','vmvnpl.u8','vmvnvs.u8','vmvnvc.u8','vmvnhi.u8','vmvnls.u8','vmvnge.u8','vmvnlt.u8','vmvngt.u8','vmvnle.u8',
+ 'vmvneq.u16','vmvnne.u16','vmvncs.u16','vmvnhs.u16','vmvncc.u16','vmvnlo.u16','vmvnmi.u16','vmvnpl.u16','vmvnvs.u16','vmvnvc.u16','vmvnhi.u16','vmvnls.u16','vmvnge.u16','vmvnlt.u16','vmvngt.u16','vmvnle.u16',
+ 'vmvneq.u32','vmvnne.u32','vmvncs.u32','vmvnhs.u32','vmvncc.u32','vmvnlo.u32','vmvnmi.u32','vmvnpl.u32','vmvnvs.u32','vmvnvc.u32','vmvnhi.u32','vmvnls.u32','vmvnge.u32','vmvnlt.u32','vmvngt.u32','vmvnle.u32',
+ 'vmvneq.u64','vmvnne.u64','vmvncs.u64','vmvnhs.u64','vmvncc.u64','vmvnlo.u64','vmvnmi.u64','vmvnpl.u64','vmvnvs.u64','vmvnvc.u64','vmvnhi.u64','vmvnls.u64','vmvnge.u64','vmvnlt.u64','vmvngt.u64','vmvnle.u64',
+ 'vmvneq.i8','vmvnne.i8','vmvncs.i8','vmvnhs.i8','vmvncc.i8','vmvnlo.i8','vmvnmi.i8','vmvnpl.i8','vmvnvs.i8','vmvnvc.i8','vmvnhi.i8','vmvnls.i8','vmvnge.i8','vmvnlt.i8','vmvngt.i8','vmvnle.i8',
+ 'vmvneq.i16','vmvnne.i16','vmvncs.i16','vmvnhs.i16','vmvncc.i16','vmvnlo.i16','vmvnmi.i16','vmvnpl.i16','vmvnvs.i16','vmvnvc.i16','vmvnhi.i16','vmvnls.i16','vmvnge.i16','vmvnlt.i16','vmvngt.i16','vmvnle.i16',
+ 'vmvneq.i32','vmvnne.i32','vmvncs.i32','vmvnhs.i32','vmvncc.i32','vmvnlo.i32','vmvnmi.i32','vmvnpl.i32','vmvnvs.i32','vmvnvc.i32','vmvnhi.i32','vmvnls.i32','vmvnge.i32','vmvnlt.i32','vmvngt.i32','vmvnle.i32',
+ 'vmvneq.i64','vmvnne.i64','vmvncs.i64','vmvnhs.i64','vmvncc.i64','vmvnlo.i64','vmvnmi.i64','vmvnpl.i64','vmvnvs.i64','vmvnvc.i64','vmvnhi.i64','vmvnls.i64','vmvnge.i64','vmvnlt.i64','vmvngt.i64','vmvnle.i64',
+ 'vmvneq.f32','vmvnne.f32','vmvncs.f32','vmvnhs.f32','vmvncc.f32','vmvnlo.f32','vmvnmi.f32','vmvnpl.f32','vmvnvs.f32','vmvnvc.f32','vmvnhi.f32','vmvnls.f32','vmvnge.f32','vmvnlt.f32','vmvngt.f32','vmvnle.f32',
+ 'vmvneq.f64','vmvnne.f64','vmvncs.f64','vmvnhs.f64','vmvncc.f64','vmvnlo.f64','vmvnmi.f64','vmvnpl.f64','vmvnvs.f64','vmvnvc.f64','vmvnhi.f64','vmvnls.f64','vmvnge.f64','vmvnlt.f64','vmvngt.f64','vmvnle.f64',
+
+ 'vorneq','vornne','vorncs','vornhs','vorncc','vornlo','vornmi','vornpl','vornvs','vornvc','vornhi','vornls','vornge','vornlt','vorngt','vornle',
+ 'vorneq.s8','vornne.s8','vorncs.s8','vornhs.s8','vorncc.s8','vornlo.s8','vornmi.s8','vornpl.s8','vornvs.s8','vornvc.s8','vornhi.s8','vornls.s8','vornge.s8','vornlt.s8','vorngt.s8','vornle.s8',
+ 'vorneq.s16','vornne.s16','vorncs.s16','vornhs.s16','vorncc.s16','vornlo.s16','vornmi.s16','vornpl.s16','vornvs.s16','vornvc.s16','vornhi.s16','vornls.s16','vornge.s16','vornlt.s16','vorngt.s16','vornle.s16',
+ 'vorneq.s32','vornne.s32','vorncs.s32','vornhs.s32','vorncc.s32','vornlo.s32','vornmi.s32','vornpl.s32','vornvs.s32','vornvc.s32','vornhi.s32','vornls.s32','vornge.s32','vornlt.s32','vorngt.s32','vornle.s32',
+ 'vorneq.s64','vornne.s64','vorncs.s64','vornhs.s64','vorncc.s64','vornlo.s64','vornmi.s64','vornpl.s64','vornvs.s64','vornvc.s64','vornhi.s64','vornls.s64','vornge.s64','vornlt.s64','vorngt.s64','vornle.s64',
+ 'vorneq.u8','vornne.u8','vorncs.u8','vornhs.u8','vorncc.u8','vornlo.u8','vornmi.u8','vornpl.u8','vornvs.u8','vornvc.u8','vornhi.u8','vornls.u8','vornge.u8','vornlt.u8','vorngt.u8','vornle.u8',
+ 'vorneq.u16','vornne.u16','vorncs.u16','vornhs.u16','vorncc.u16','vornlo.u16','vornmi.u16','vornpl.u16','vornvs.u16','vornvc.u16','vornhi.u16','vornls.u16','vornge.u16','vornlt.u16','vorngt.u16','vornle.u16',
+ 'vorneq.u32','vornne.u32','vorncs.u32','vornhs.u32','vorncc.u32','vornlo.u32','vornmi.u32','vornpl.u32','vornvs.u32','vornvc.u32','vornhi.u32','vornls.u32','vornge.u32','vornlt.u32','vorngt.u32','vornle.u32',
+ 'vorneq.u64','vornne.u64','vorncs.u64','vornhs.u64','vorncc.u64','vornlo.u64','vornmi.u64','vornpl.u64','vornvs.u64','vornvc.u64','vornhi.u64','vornls.u64','vornge.u64','vornlt.u64','vorngt.u64','vornle.u64',
+ 'vorneq.i8','vornne.i8','vorncs.i8','vornhs.i8','vorncc.i8','vornlo.i8','vornmi.i8','vornpl.i8','vornvs.i8','vornvc.i8','vornhi.i8','vornls.i8','vornge.i8','vornlt.i8','vorngt.i8','vornle.i8',
+ 'vorneq.i16','vornne.i16','vorncs.i16','vornhs.i16','vorncc.i16','vornlo.i16','vornmi.i16','vornpl.i16','vornvs.i16','vornvc.i16','vornhi.i16','vornls.i16','vornge.i16','vornlt.i16','vorngt.i16','vornle.i16',
+ 'vorneq.i32','vornne.i32','vorncs.i32','vornhs.i32','vorncc.i32','vornlo.i32','vornmi.i32','vornpl.i32','vornvs.i32','vornvc.i32','vornhi.i32','vornls.i32','vornge.i32','vornlt.i32','vorngt.i32','vornle.i32',
+ 'vorneq.i64','vornne.i64','vorncs.i64','vornhs.i64','vorncc.i64','vornlo.i64','vornmi.i64','vornpl.i64','vornvs.i64','vornvc.i64','vornhi.i64','vornls.i64','vornge.i64','vornlt.i64','vorngt.i64','vornle.i64',
+ 'vorneq.f32','vornne.f32','vorncs.f32','vornhs.f32','vorncc.f32','vornlo.f32','vornmi.f32','vornpl.f32','vornvs.f32','vornvc.f32','vornhi.f32','vornls.f32','vornge.f32','vornlt.f32','vorngt.f32','vornle.f32',
+ 'vorneq.f64','vornne.f64','vorncs.f64','vornhs.f64','vorncc.f64','vornlo.f64','vornmi.f64','vornpl.f64','vornvs.f64','vornvc.f64','vornhi.f64','vornls.f64','vornge.f64','vornlt.f64','vorngt.f64','vornle.f64',
+
+ 'vorreq','vorrne','vorrcs','vorrhs','vorrcc','vorrlo','vorrmi','vorrpl','vorrvs','vorrvc','vorrhi','vorrls','vorrge','vorrlt','vorrgt','vorrle',
+ 'vorreq.s8','vorrne.s8','vorrcs.s8','vorrhs.s8','vorrcc.s8','vorrlo.s8','vorrmi.s8','vorrpl.s8','vorrvs.s8','vorrvc.s8','vorrhi.s8','vorrls.s8','vorrge.s8','vorrlt.s8','vorrgt.s8','vorrle.s8',
+ 'vorreq.s16','vorrne.s16','vorrcs.s16','vorrhs.s16','vorrcc.s16','vorrlo.s16','vorrmi.s16','vorrpl.s16','vorrvs.s16','vorrvc.s16','vorrhi.s16','vorrls.s16','vorrge.s16','vorrlt.s16','vorrgt.s16','vorrle.s16',
+ 'vorreq.s32','vorrne.s32','vorrcs.s32','vorrhs.s32','vorrcc.s32','vorrlo.s32','vorrmi.s32','vorrpl.s32','vorrvs.s32','vorrvc.s32','vorrhi.s32','vorrls.s32','vorrge.s32','vorrlt.s32','vorrgt.s32','vorrle.s32',
+ 'vorreq.s64','vorrne.s64','vorrcs.s64','vorrhs.s64','vorrcc.s64','vorrlo.s64','vorrmi.s64','vorrpl.s64','vorrvs.s64','vorrvc.s64','vorrhi.s64','vorrls.s64','vorrge.s64','vorrlt.s64','vorrgt.s64','vorrle.s64',
+ 'vorreq.u8','vorrne.u8','vorrcs.u8','vorrhs.u8','vorrcc.u8','vorrlo.u8','vorrmi.u8','vorrpl.u8','vorrvs.u8','vorrvc.u8','vorrhi.u8','vorrls.u8','vorrge.u8','vorrlt.u8','vorrgt.u8','vorrle.u8',
+ 'vorreq.u16','vorrne.u16','vorrcs.u16','vorrhs.u16','vorrcc.u16','vorrlo.u16','vorrmi.u16','vorrpl.u16','vorrvs.u16','vorrvc.u16','vorrhi.u16','vorrls.u16','vorrge.u16','vorrlt.u16','vorrgt.u16','vorrle.u16',
+ 'vorreq.u32','vorrne.u32','vorrcs.u32','vorrhs.u32','vorrcc.u32','vorrlo.u32','vorrmi.u32','vorrpl.u32','vorrvs.u32','vorrvc.u32','vorrhi.u32','vorrls.u32','vorrge.u32','vorrlt.u32','vorrgt.u32','vorrle.u32',
+ 'vorreq.u64','vorrne.u64','vorrcs.u64','vorrhs.u64','vorrcc.u64','vorrlo.u64','vorrmi.u64','vorrpl.u64','vorrvs.u64','vorrvc.u64','vorrhi.u64','vorrls.u64','vorrge.u64','vorrlt.u64','vorrgt.u64','vorrle.u64',
+ 'vorreq.i8','vorrne.i8','vorrcs.i8','vorrhs.i8','vorrcc.i8','vorrlo.i8','vorrmi.i8','vorrpl.i8','vorrvs.i8','vorrvc.i8','vorrhi.i8','vorrls.i8','vorrge.i8','vorrlt.i8','vorrgt.i8','vorrle.i8',
+ 'vorreq.i16','vorrne.i16','vorrcs.i16','vorrhs.i16','vorrcc.i16','vorrlo.i16','vorrmi.i16','vorrpl.i16','vorrvs.i16','vorrvc.i16','vorrhi.i16','vorrls.i16','vorrge.i16','vorrlt.i16','vorrgt.i16','vorrle.i16',
+ 'vorreq.i32','vorrne.i32','vorrcs.i32','vorrhs.i32','vorrcc.i32','vorrlo.i32','vorrmi.i32','vorrpl.i32','vorrvs.i32','vorrvc.i32','vorrhi.i32','vorrls.i32','vorrge.i32','vorrlt.i32','vorrgt.i32','vorrle.i32',
+ 'vorreq.i64','vorrne.i64','vorrcs.i64','vorrhs.i64','vorrcc.i64','vorrlo.i64','vorrmi.i64','vorrpl.i64','vorrvs.i64','vorrvc.i64','vorrhi.i64','vorrls.i64','vorrge.i64','vorrlt.i64','vorrgt.i64','vorrle.i64',
+ 'vorreq.f32','vorrne.f32','vorrcs.f32','vorrhs.f32','vorrcc.f32','vorrlo.f32','vorrmi.f32','vorrpl.f32','vorrvs.f32','vorrvc.f32','vorrhi.f32','vorrls.f32','vorrge.f32','vorrlt.f32','vorrgt.f32','vorrle.f32',
+ 'vorreq.f64','vorrne.f64','vorrcs.f64','vorrhs.f64','vorrcc.f64','vorrlo.f64','vorrmi.f64','vorrpl.f64','vorrvs.f64','vorrvc.f64','vorrhi.f64','vorrls.f64','vorrge.f64','vorrlt.f64','vorrgt.f64','vorrle.f64',
+
+ 'vswpeq','vswpne','vswpcs','vswphs','vswpcc','vswplo','vswpmi','vswppl','vswpvs','vswpvc','vswphi','vswpls','vswpge','vswplt','vswpgt','vswple',
+ 'vswpeq.s8','vswpne.s8','vswpcs.s8','vswphs.s8','vswpcc.s8','vswplo.s8','vswpmi.s8','vswppl.s8','vswpvs.s8','vswpvc.s8','vswphi.s8','vswpls.s8','vswpge.s8','vswplt.s8','vswpgt.s8','vswple.s8',
+ 'vswpeq.s16','vswpne.s16','vswpcs.s16','vswphs.s16','vswpcc.s16','vswplo.s16','vswpmi.s16','vswppl.s16','vswpvs.s16','vswpvc.s16','vswphi.s16','vswpls.s16','vswpge.s16','vswplt.s16','vswpgt.s16','vswple.s16',
+ 'vswpeq.s32','vswpne.s32','vswpcs.s32','vswphs.s32','vswpcc.s32','vswplo.s32','vswpmi.s32','vswppl.s32','vswpvs.s32','vswpvc.s32','vswphi.s32','vswpls.s32','vswpge.s32','vswplt.s32','vswpgt.s32','vswple.s32',
+ 'vswpeq.s64','vswpne.s64','vswpcs.s64','vswphs.s64','vswpcc.s64','vswplo.s64','vswpmi.s64','vswppl.s64','vswpvs.s64','vswpvc.s64','vswphi.s64','vswpls.s64','vswpge.s64','vswplt.s64','vswpgt.s64','vswple.s64',
+ 'vswpeq.u8','vswpne.u8','vswpcs.u8','vswphs.u8','vswpcc.u8','vswplo.u8','vswpmi.u8','vswppl.u8','vswpvs.u8','vswpvc.u8','vswphi.u8','vswpls.u8','vswpge.u8','vswplt.u8','vswpgt.u8','vswple.u8',
+ 'vswpeq.u16','vswpne.u16','vswpcs.u16','vswphs.u16','vswpcc.u16','vswplo.u16','vswpmi.u16','vswppl.u16','vswpvs.u16','vswpvc.u16','vswphi.u16','vswpls.u16','vswpge.u16','vswplt.u16','vswpgt.u16','vswple.u16',
+ 'vswpeq.u32','vswpne.u32','vswpcs.u32','vswphs.u32','vswpcc.u32','vswplo.u32','vswpmi.u32','vswppl.u32','vswpvs.u32','vswpvc.u32','vswphi.u32','vswpls.u32','vswpge.u32','vswplt.u32','vswpgt.u32','vswple.u32',
+ 'vswpeq.u64','vswpne.u64','vswpcs.u64','vswphs.u64','vswpcc.u64','vswplo.u64','vswpmi.u64','vswppl.u64','vswpvs.u64','vswpvc.u64','vswphi.u64','vswpls.u64','vswpge.u64','vswplt.u64','vswpgt.u64','vswple.u64',
+ 'vswpeq.i8','vswpne.i8','vswpcs.i8','vswphs.i8','vswpcc.i8','vswplo.i8','vswpmi.i8','vswppl.i8','vswpvs.i8','vswpvc.i8','vswphi.i8','vswpls.i8','vswpge.i8','vswplt.i8','vswpgt.i8','vswple.i8',
+ 'vswpeq.i16','vswpne.i16','vswpcs.i16','vswphs.i16','vswpcc.i16','vswplo.i16','vswpmi.i16','vswppl.i16','vswpvs.i16','vswpvc.i16','vswphi.i16','vswpls.i16','vswpge.i16','vswplt.i16','vswpgt.i16','vswple.i16',
+ 'vswpeq.i32','vswpne.i32','vswpcs.i32','vswphs.i32','vswpcc.i32','vswplo.i32','vswpmi.i32','vswppl.i32','vswpvs.i32','vswpvc.i32','vswphi.i32','vswpls.i32','vswpge.i32','vswplt.i32','vswpgt.i32','vswple.i32',
+ 'vswpeq.i64','vswpne.i64','vswpcs.i64','vswphs.i64','vswpcc.i64','vswplo.i64','vswpmi.i64','vswppl.i64','vswpvs.i64','vswpvc.i64','vswphi.i64','vswpls.i64','vswpge.i64','vswplt.i64','vswpgt.i64','vswple.i64',
+ 'vswpeq.f32','vswpne.f32','vswpcs.f32','vswphs.f32','vswpcc.f32','vswplo.f32','vswpmi.f32','vswppl.f32','vswpvs.f32','vswpvc.f32','vswphi.f32','vswpls.f32','vswpge.f32','vswplt.f32','vswpgt.f32','vswple.f32',
+ 'vswpeq.f64','vswpne.f64','vswpcs.f64','vswphs.f64','vswpcc.f64','vswplo.f64','vswpmi.f64','vswppl.f64','vswpvs.f64','vswpvc.f64','vswphi.f64','vswpls.f64','vswpge.f64','vswplt.f64','vswpgt.f64','vswple.f64'
+ ),
+ /* Conditional NEON SIMD ARM Registers Interop Instructions */
+ 29 => array(
+ 'vmrseq','vmrsne','vmrscs','vmrshs','vmrscc','vmrslo','vmrsmi','vmrspl','vmrsvs','vmrsvc','vmrshi','vmrsls','vmrsge','vmrslt','vmrsgt','vmrsle',
+ 'vmsreq','vmsrne','vmsrcs','vmsrhs','vmsrcc','vmsrlo','vmsrmi','vmsrpl','vmsrvs','vmsrvc','vmsrhi','vmsrls','vmsrge','vmsrlt','vmsrgt','vmsrle'
+ ),
+ /* Conditional NEON SIMD Bit/Byte-Level Instructions */
+ 30 => array(
+ 'vcnteq.8','vcntne.8','vcntcs.8','vcnths.8','vcntcc.8','vcntlo.8','vcntmi.8','vcntpl.8','vcntvs.8','vcntvc.8','vcnthi.8','vcntls.8','vcntge.8','vcntlt.8','vcntgt.8','vcntle.8',
+ 'vdupeq.8','vdupne.8','vdupcs.8','vduphs.8','vdupcc.8','vduplo.8','vdupmi.8','vduppl.8','vdupvs.8','vdupvc.8','vduphi.8','vdupls.8','vdupge.8','vduplt.8','vdupgt.8','vduple.8',
+
+ 'vdupeq.16','vdupne.16','vdupcs.16','vduphs.16','vdupcc.16','vduplo.16','vdupmi.16','vduppl.16','vdupvs.16','vdupvc.16','vduphi.16','vdupls.16','vdupge.16','vduplt.16','vdupgt.16','vduple.16',
+ 'vdupeq.32','vdupne.32','vdupcs.32','vduphs.32','vdupcc.32','vduplo.32','vdupmi.32','vduppl.32','vdupvs.32','vdupvc.32','vduphi.32','vdupls.32','vdupge.32','vduplt.32','vdupgt.32','vduple.32',
+
+ 'vexteq.8','vextne.8','vextcs.8','vexths.8','vextcc.8','vextlo.8','vextmi.8','vextpl.8','vextvs.8','vextvc.8','vexthi.8','vextls.8','vextge.8','vextlt.8','vextgt.8','vextle.8',
+ 'vexteq.16','vextne.16','vextcs.16','vexths.16','vextcc.16','vextlo.16','vextmi.16','vextpl.16','vextvs.16','vextvc.16','vexthi.16','vextls.16','vextge.16','vextlt.16','vextgt.16','vextle.16',
+
+ 'vexteq.32','vextne.32','vextcs.32','vexths.32','vextcc.32','vextlo.32','vextmi.32','vextpl.32','vextvs.32','vextvc.32','vexthi.32','vextls.32','vextge.32','vextlt.32','vextgt.32','vextle.32',
+ 'vexteq.64','vextne.64','vextcs.64','vexths.64','vextcc.64','vextlo.64','vextmi.64','vextpl.64','vextvs.64','vextvc.64','vexthi.64','vextls.64','vextge.64','vextlt.64','vextgt.64','vextle.64',
+
+ 'vrev16eq.8','vrev16ne.8','vrev16cs.8','vrev16hs.8','vrev16cc.8','vrev16lo.8','vrev16mi.8','vrev16pl.8','vrev16vs.8','vrev16vc.8','vrev16hi.8','vrev16ls.8','vrev16ge.8','vrev16lt.8','vrev16gt.8','vrev16le.8',
+ 'vrev32eq.8','vrev32ne.8','vrev32cs.8','vrev32hs.8','vrev32cc.8','vrev32lo.8','vrev32mi.8','vrev32pl.8','vrev32vs.8','vrev32vc.8','vrev32hi.8','vrev32ls.8','vrev32ge.8','vrev32lt.8','vrev32gt.8','vrev32le.8',
+ 'vrev32eq.16','vrev32ne.16','vrev32cs.16','vrev32hs.16','vrev32cc.16','vrev32lo.16','vrev32mi.16','vrev32pl.16','vrev32vs.16','vrev32vc.16','vrev32hi.16','vrev32ls.16','vrev32ge.16','vrev32lt.16','vrev32gt.16','vrev32le.16',
+ 'vrev64eq.8','vrev64ne.8','vrev64cs.8','vrev64hs.8','vrev64cc.8','vrev64lo.8','vrev64mi.8','vrev64pl.8','vrev64vs.8','vrev64vc.8','vrev64hi.8','vrev64ls.8','vrev64ge.8','vrev64lt.8','vrev64gt.8','vrev64le.8',
+ 'vrev64eq.16','vrev64ne.16','vrev64cs.16','vrev64hs.16','vrev64cc.16','vrev64lo.16','vrev64mi.16','vrev64pl.16','vrev64vs.16','vrev64vc.16','vrev64hi.16','vrev64ls.16','vrev64ge.16','vrev64lt.16','vrev64gt.16','vrev64le.16',
+ 'vrev64eq.32','vrev64ne.32','vrev64cs.32','vrev64hs.32','vrev64cc.32','vrev64lo.32','vrev64mi.32','vrev64pl.32','vrev64vs.32','vrev64vc.32','vrev64hi.32','vrev64ls.32','vrev64ge.32','vrev64lt.32','vrev64gt.32','vrev64le.32',
+
+ 'vslieq.8','vsline.8','vslics.8','vslihs.8','vslicc.8','vslilo.8','vslimi.8','vslipl.8','vslivs.8','vslivc.8','vslihi.8','vslils.8','vslige.8','vslilt.8','vsligt.8','vslile.8',
+ 'vslieq.16','vsline.16','vslics.16','vslihs.16','vslicc.16','vslilo.16','vslimi.16','vslipl.16','vslivs.16','vslivc.16','vslihi.16','vslils.16','vslige.16','vslilt.16','vsligt.16','vslile.16',
+ 'vslieq.32','vsline.32','vslics.32','vslihs.32','vslicc.32','vslilo.32','vslimi.32','vslipl.32','vslivs.32','vslivc.32','vslihi.32','vslils.32','vslige.32','vslilt.32','vsligt.32','vslile.32',
+ 'vslieq.64','vsline.64','vslics.64','vslihs.64','vslicc.64','vslilo.64','vslimi.64','vslipl.64','vslivs.64','vslivc.64','vslihi.64','vslils.64','vslige.64','vslilt.64','vsligt.64','vslile.64',
+
+ 'vsrieq.8','vsrine.8','vsrics.8','vsrihs.8','vsricc.8','vsrilo.8','vsrimi.8','vsripl.8','vsrivs.8','vsrivc.8','vsrihi.8','vsrils.8','vsrige.8','vsrilt.8','vsrigt.8','vsrile.8',
+ 'vsrieq.16','vsrine.16','vsrics.16','vsrihs.16','vsricc.16','vsrilo.16','vsrimi.16','vsripl.16','vsrivs.16','vsrivc.16','vsrihi.16','vsrils.16','vsrige.16','vsrilt.16','vsrigt.16','vsrile.16',
+ 'vsrieq.32','vsrine.32','vsrics.32','vsrihs.32','vsricc.32','vsrilo.32','vsrimi.32','vsripl.32','vsrivs.32','vsrivc.32','vsrihi.32','vsrils.32','vsrige.32','vsrilt.32','vsrigt.32','vsrile.32',
+ 'vsrieq.64','vsrine.64','vsrics.64','vsrihs.64','vsricc.64','vsrilo.64','vsrimi.64','vsripl.64','vsrivs.64','vsrivc.64','vsrihi.64','vsrils.64','vsrige.64','vsrilt.64','vsrigt.64','vsrile.64',
+
+ 'vtbleq.8','vtblne.8','vtblcs.8','vtblhs.8','vtblcc.8','vtbllo.8','vtblmi.8','vtblpl.8','vtblvs.8','vtblvc.8','vtblhi.8','vtblls.8','vtblge.8','vtbllt.8','vtblgt.8','vtblle.8',
+
+ 'vtbxeq','vtbxne','vtbxcs','vtbxhs','vtbxcc','vtbxlo','vtbxmi','vtbxpl','vtbxvs','vtbxvc','vtbxhi','vtbxls','vtbxge','vtbxlt','vtbxgt','vtbxle',
+
+ 'vtrneq.8','vtrnne.8','vtrncs.8','vtrnhs.8','vtrncc.8','vtrnlo.8','vtrnmi.8','vtrnpl.8','vtrnvs.8','vtrnvc.8','vtrnhi.8','vtrnls.8','vtrnge.8','vtrnlt.8','vtrngt.8','vtrnle.8',
+ 'vtrneq.16','vtrnne.16','vtrncs.16','vtrnhs.16','vtrncc.16','vtrnlo.16','vtrnmi.16','vtrnpl.16','vtrnvs.16','vtrnvc.16','vtrnhi.16','vtrnls.16','vtrnge.16','vtrnlt.16','vtrngt.16','vtrnle.16',
+ 'vtrneq.32','vtrnne.32','vtrncs.32','vtrnhs.32','vtrncc.32','vtrnlo.32','vtrnmi.32','vtrnpl.32','vtrnvs.32','vtrnvc.32','vtrnhi.32','vtrnls.32','vtrnge.32','vtrnlt.32','vtrngt.32','vtrnle.32',
+
+ 'vtsteq.8','vtstne.8','vtstcs.8','vtsths.8','vtstcc.8','vtstlo.8','vtstmi.8','vtstpl.8','vtstvs.8','vtstvc.8','vtsthi.8','vtstls.8','vtstge.8','vtstlt.8','vtstgt.8','vtstle.8',
+ 'vtsteq.16','vtstne.16','vtstcs.16','vtsths.16','vtstcc.16','vtstlo.16','vtstmi.16','vtstpl.16','vtstvs.16','vtstvc.16','vtsthi.16','vtstls.16','vtstge.16','vtstlt.16','vtstgt.16','vtstle.16',
+ 'vtsteq.32','vtstne.32','vtstcs.32','vtsths.32','vtstcc.32','vtstlo.32','vtstmi.32','vtstpl.32','vtstvs.32','vtstvc.32','vtsthi.32','vtstls.32','vtstge.32','vtstlt.32','vtstgt.32','vtstle.32',
+
+ 'vuzpeq.8','vuzpne.8','vuzpcs.8','vuzphs.8','vuzpcc.8','vuzplo.8','vuzpmi.8','vuzppl.8','vuzpvs.8','vuzpvc.8','vuzphi.8','vuzpls.8','vuzpge.8','vuzplt.8','vuzpgt.8','vuzple.8',
+ 'vuzpeq.16','vuzpne.16','vuzpcs.16','vuzphs.16','vuzpcc.16','vuzplo.16','vuzpmi.16','vuzppl.16','vuzpvs.16','vuzpvc.16','vuzphi.16','vuzpls.16','vuzpge.16','vuzplt.16','vuzpgt.16','vuzple.16',
+ 'vuzpeq.32','vuzpne.32','vuzpcs.32','vuzphs.32','vuzpcc.32','vuzplo.32','vuzpmi.32','vuzppl.32','vuzpvs.32','vuzpvc.32','vuzphi.32','vuzpls.32','vuzpge.32','vuzplt.32','vuzpgt.32','vuzple.32',
+
+ 'vzipeq.8','vzipne.8','vzipcs.8','vziphs.8','vzipcc.8','vziplo.8','vzipmi.8','vzippl.8','vzipvs.8','vzipvc.8','vziphi.8','vzipls.8','vzipge.8','vziplt.8','vzipgt.8','vziple.8',
+ 'vzipeq.16','vzipne.16','vzipcs.16','vziphs.16','vzipcc.16','vziplo.16','vzipmi.16','vzippl.16','vzipvs.16','vzipvc.16','vziphi.16','vzipls.16','vzipge.16','vziplt.16','vzipgt.16','vziple.16',
+ 'vzipeq.32','vzipne.32','vzipcs.32','vziphs.32','vzipcc.32','vziplo.32','vzipmi.32','vzippl.32','vzipvs.32','vzipvc.32','vziphi.32','vzipls.32','vzipge.32','vziplt.32','vzipgt.32','vziple.32',
+
+ 'vmulleq.p8','vmullne.p8','vmullcs.p8','vmullhs.p8','vmullcc.p8','vmulllo.p8','vmullmi.p8','vmullpl.p8','vmullvs.p8','vmullvc.p8','vmullhi.p8','vmullls.p8','vmullge.p8','vmulllt.p8','vmullgt.p8','vmullle.p8'
+ ),
+ /* Conditional NEON SIMD Universal Integer Instructions */
+ 31 => array(
+ 'vaddeq.i8','vaddne.i8','vaddcs.i8','vaddhs.i8','vaddcc.i8','vaddlo.i8','vaddmi.i8','vaddpl.i8','vaddvs.i8','vaddvc.i8','vaddhi.i8','vaddls.i8','vaddge.i8','vaddlt.i8','vaddgt.i8','vaddle.i8',
+ 'vaddeq.i16','vaddne.i16','vaddcs.i16','vaddhs.i16','vaddcc.i16','vaddlo.i16','vaddmi.i16','vaddpl.i16','vaddvs.i16','vaddvc.i16','vaddhi.i16','vaddls.i16','vaddge.i16','vaddlt.i16','vaddgt.i16','vaddle.i16',
+ 'vaddeq.i32','vaddne.i32','vaddcs.i32','vaddhs.i32','vaddcc.i32','vaddlo.i32','vaddmi.i32','vaddpl.i32','vaddvs.i32','vaddvc.i32','vaddhi.i32','vaddls.i32','vaddge.i32','vaddlt.i32','vaddgt.i32','vaddle.i32',
+ 'vaddeq.i64','vaddne.i64','vaddcs.i64','vaddhs.i64','vaddcc.i64','vaddlo.i64','vaddmi.i64','vaddpl.i64','vaddvs.i64','vaddvc.i64','vaddhi.i64','vaddls.i64','vaddge.i64','vaddlt.i64','vaddgt.i64','vaddle.i64',
+
+ 'vsubeq.i8','vsubne.i8','vsubcs.i8','vsubhs.i8','vsubcc.i8','vsublo.i8','vsubmi.i8','vsubpl.i8','vsubvs.i8','vsubvc.i8','vsubhi.i8','vsubls.i8','vsubge.i8','vsublt.i8','vsubgt.i8','vsuble.i8',
+ 'vsubeq.i16','vsubne.i16','vsubcs.i16','vsubhs.i16','vsubcc.i16','vsublo.i16','vsubmi.i16','vsubpl.i16','vsubvs.i16','vsubvc.i16','vsubhi.i16','vsubls.i16','vsubge.i16','vsublt.i16','vsubgt.i16','vsuble.i16',
+ 'vsubeq.i32','vsubne.i32','vsubcs.i32','vsubhs.i32','vsubcc.i32','vsublo.i32','vsubmi.i32','vsubpl.i32','vsubvs.i32','vsubvc.i32','vsubhi.i32','vsubls.i32','vsubge.i32','vsublt.i32','vsubgt.i32','vsuble.i32',
+ 'vsubeq.i64','vsubne.i64','vsubcs.i64','vsubhs.i64','vsubcc.i64','vsublo.i64','vsubmi.i64','vsubpl.i64','vsubvs.i64','vsubvc.i64','vsubhi.i64','vsubls.i64','vsubge.i64','vsublt.i64','vsubgt.i64','vsuble.i64',
+
+ 'vaddhneq.i16','vaddhnne.i16','vaddhncs.i16','vaddhnhs.i16','vaddhncc.i16','vaddhnlo.i16','vaddhnmi.i16','vaddhnpl.i16','vaddhnvs.i16','vaddhnvc.i16','vaddhnhi.i16','vaddhnls.i16','vaddhnge.i16','vaddhnlt.i16','vaddhngt.i16','vaddhnle.i16',
+ 'vaddhneq.i32','vaddhnne.i32','vaddhncs.i32','vaddhnhs.i32','vaddhncc.i32','vaddhnlo.i32','vaddhnmi.i32','vaddhnpl.i32','vaddhnvs.i32','vaddhnvc.i32','vaddhnhi.i32','vaddhnls.i32','vaddhnge.i32','vaddhnlt.i32','vaddhngt.i32','vaddhnle.i32',
+ 'vaddhneq.i64','vaddhnne.i64','vaddhncs.i64','vaddhnhs.i64','vaddhncc.i64','vaddhnlo.i64','vaddhnmi.i64','vaddhnpl.i64','vaddhnvs.i64','vaddhnvc.i64','vaddhnhi.i64','vaddhnls.i64','vaddhnge.i64','vaddhnlt.i64','vaddhngt.i64','vaddhnle.i64',
+
+ 'vsubhneq.i16','vsubhnne.i16','vsubhncs.i16','vsubhnhs.i16','vsubhncc.i16','vsubhnlo.i16','vsubhnmi.i16','vsubhnpl.i16','vsubhnvs.i16','vsubhnvc.i16','vsubhnhi.i16','vsubhnls.i16','vsubhnge.i16','vsubhnlt.i16','vsubhngt.i16','vsubhnle.i16',
+ 'vsubhneq.i32','vsubhnne.i32','vsubhncs.i32','vsubhnhs.i32','vsubhncc.i32','vsubhnlo.i32','vsubhnmi.i32','vsubhnpl.i32','vsubhnvs.i32','vsubhnvc.i32','vsubhnhi.i32','vsubhnls.i32','vsubhnge.i32','vsubhnlt.i32','vsubhngt.i32','vsubhnle.i32',
+ 'vsubhneq.i64','vsubhnne.i64','vsubhncs.i64','vsubhnhs.i64','vsubhncc.i64','vsubhnlo.i64','vsubhnmi.i64','vsubhnpl.i64','vsubhnvs.i64','vsubhnvc.i64','vsubhnhi.i64','vsubhnls.i64','vsubhnge.i64','vsubhnlt.i64','vsubhngt.i64','vsubhnle.i64',
+
+ 'vraddhneq.i16','vraddhnne.i16','vraddhncs.i16','vraddhnhs.i16','vraddhncc.i16','vraddhnlo.i16','vraddhnmi.i16','vraddhnpl.i16','vraddhnvs.i16','vraddhnvc.i16','vraddhnhi.i16','vraddhnls.i16','vraddhnge.i16','vraddhnlt.i16','vraddhngt.i16','vraddhnle.i16',
+ 'vraddhneq.i32','vraddhnne.i32','vraddhncs.i32','vraddhnhs.i32','vraddhncc.i32','vraddhnlo.i32','vraddhnmi.i32','vraddhnpl.i32','vraddhnvs.i32','vraddhnvc.i32','vraddhnhi.i32','vraddhnls.i32','vraddhnge.i32','vraddhnlt.i32','vraddhngt.i32','vraddhnle.i32',
+ 'vraddhneq.i64','vraddhnne.i64','vraddhncs.i64','vraddhnhs.i64','vraddhncc.i64','vraddhnlo.i64','vraddhnmi.i64','vraddhnpl.i64','vraddhnvs.i64','vraddhnvc.i64','vraddhnhi.i64','vraddhnls.i64','vraddhnge.i64','vraddhnlt.i64','vraddhngt.i64','vraddhnle.i64',
+
+ 'vrsubhneq.i16','vrsubhnne.i16','vrsubhncs.i16','vrsubhnhs.i16','vrsubhncc.i16','vrsubhnlo.i16','vrsubhnmi.i16','vrsubhnpl.i16','vrsubhnvs.i16','vrsubhnvc.i16','vrsubhnhi.i16','vrsubhnls.i16','vrsubhnge.i16','vrsubhnlt.i16','vrsubhngt.i16','vrsubhnle.i16',
+ 'vrsubhneq.i32','vrsubhnne.i32','vrsubhncs.i32','vrsubhnhs.i32','vrsubhncc.i32','vrsubhnlo.i32','vrsubhnmi.i32','vrsubhnpl.i32','vrsubhnvs.i32','vrsubhnvc.i32','vrsubhnhi.i32','vrsubhnls.i32','vrsubhnge.i32','vrsubhnlt.i32','vrsubhngt.i32','vrsubhnle.i32',
+ 'vrsubhneq.i64','vrsubhnne.i64','vrsubhncs.i64','vrsubhnhs.i64','vrsubhncc.i64','vrsubhnlo.i64','vrsubhnmi.i64','vrsubhnpl.i64','vrsubhnvs.i64','vrsubhnvc.i64','vrsubhnhi.i64','vrsubhnls.i64','vrsubhnge.i64','vrsubhnlt.i64','vrsubhngt.i64','vrsubhnle.i64',
+
+ 'vpaddeq.i8','vpaddne.i8','vpaddcs.i8','vpaddhs.i8','vpaddcc.i8','vpaddlo.i8','vpaddmi.i8','vpaddpl.i8','vpaddvs.i8','vpaddvc.i8','vpaddhi.i8','vpaddls.i8','vpaddge.i8','vpaddlt.i8','vpaddgt.i8','vpaddle.i8',
+ 'vpaddeq.i16','vpaddne.i16','vpaddcs.i16','vpaddhs.i16','vpaddcc.i16','vpaddlo.i16','vpaddmi.i16','vpaddpl.i16','vpaddvs.i16','vpaddvc.i16','vpaddhi.i16','vpaddls.i16','vpaddge.i16','vpaddlt.i16','vpaddgt.i16','vpaddle.i16',
+ 'vpaddeq.i32','vpaddne.i32','vpaddcs.i32','vpaddhs.i32','vpaddcc.i32','vpaddlo.i32','vpaddmi.i32','vpaddpl.i32','vpaddvs.i32','vpaddvc.i32','vpaddhi.i32','vpaddls.i32','vpaddge.i32','vpaddlt.i32','vpaddgt.i32','vpaddle.i32',
+
+ 'vceqeq.i8','vceqne.i8','vceqcs.i8','vceqhs.i8','vceqcc.i8','vceqlo.i8','vceqmi.i8','vceqpl.i8','vceqvs.i8','vceqvc.i8','vceqhi.i8','vceqls.i8','vceqge.i8','vceqlt.i8','vceqgt.i8','vceqle.i8',
+ 'vceqeq.i16','vceqne.i16','vceqcs.i16','vceqhs.i16','vceqcc.i16','vceqlo.i16','vceqmi.i16','vceqpl.i16','vceqvs.i16','vceqvc.i16','vceqhi.i16','vceqls.i16','vceqge.i16','vceqlt.i16','vceqgt.i16','vceqle.i16',
+ 'vceqeq.i32','vceqne.i32','vceqcs.i32','vceqhs.i32','vceqcc.i32','vceqlo.i32','vceqmi.i32','vceqpl.i32','vceqvs.i32','vceqvc.i32','vceqhi.i32','vceqls.i32','vceqge.i32','vceqlt.i32','vceqgt.i32','vceqle.i32',
+
+ 'vclzeq.i8','vclzne.i8','vclzcs.i8','vclzhs.i8','vclzcc.i8','vclzlo.i8','vclzmi.i8','vclzpl.i8','vclzvs.i8','vclzvc.i8','vclzhi.i8','vclzls.i8','vclzge.i8','vclzlt.i8','vclzgt.i8','vclzle.i8',
+ 'vclzeq.i16','vclzne.i16','vclzcs.i16','vclzhs.i16','vclzcc.i16','vclzlo.i16','vclzmi.i16','vclzpl.i16','vclzvs.i16','vclzvc.i16','vclzhi.i16','vclzls.i16','vclzge.i16','vclzlt.i16','vclzgt.i16','vclzle.i16',
+ 'vclzeq.i32','vclzne.i32','vclzcs.i32','vclzhs.i32','vclzcc.i32','vclzlo.i32','vclzmi.i32','vclzpl.i32','vclzvs.i32','vclzvc.i32','vclzhi.i32','vclzls.i32','vclzge.i32','vclzlt.i32','vclzgt.i32','vclzle.i32',
+
+ 'vmovneq.i16','vmovnne.i16','vmovncs.i16','vmovnhs.i16','vmovncc.i16','vmovnlo.i16','vmovnmi.i16','vmovnpl.i16','vmovnvs.i16','vmovnvc.i16','vmovnhi.i16','vmovnls.i16','vmovnge.i16','vmovnlt.i16','vmovngt.i16','vmovnle.i16',
+ 'vmovneq.i32','vmovnne.i32','vmovncs.i32','vmovnhs.i32','vmovncc.i32','vmovnlo.i32','vmovnmi.i32','vmovnpl.i32','vmovnvs.i32','vmovnvc.i32','vmovnhi.i32','vmovnls.i32','vmovnge.i32','vmovnlt.i32','vmovngt.i32','vmovnle.i32',
+ 'vmovneq.i64','vmovnne.i64','vmovncs.i64','vmovnhs.i64','vmovncc.i64','vmovnlo.i64','vmovnmi.i64','vmovnpl.i64','vmovnvs.i64','vmovnvc.i64','vmovnhi.i64','vmovnls.i64','vmovnge.i64','vmovnlt.i64','vmovngt.i64','vmovnle.i64',
+
+ 'vmlaeq.s8','vmlane.s8','vmlacs.s8','vmlahs.s8','vmlacc.s8','vmlalo.s8','vmlami.s8','vmlapl.s8','vmlavs.s8','vmlavc.s8','vmlahi.s8','vmlals.s8','vmlage.s8','vmlalt.s8','vmlagt.s8','vmlale.s8',
+ 'vmlaeq.s16','vmlane.s16','vmlacs.s16','vmlahs.s16','vmlacc.s16','vmlalo.s16','vmlami.s16','vmlapl.s16','vmlavs.s16','vmlavc.s16','vmlahi.s16','vmlals.s16','vmlage.s16','vmlalt.s16','vmlagt.s16','vmlale.s16',
+ 'vmlaeq.s32','vmlane.s32','vmlacs.s32','vmlahs.s32','vmlacc.s32','vmlalo.s32','vmlami.s32','vmlapl.s32','vmlavs.s32','vmlavc.s32','vmlahi.s32','vmlals.s32','vmlage.s32','vmlalt.s32','vmlagt.s32','vmlale.s32',
+ 'vmlaeq.u8','vmlane.u8','vmlacs.u8','vmlahs.u8','vmlacc.u8','vmlalo.u8','vmlami.u8','vmlapl.u8','vmlavs.u8','vmlavc.u8','vmlahi.u8','vmlals.u8','vmlage.u8','vmlalt.u8','vmlagt.u8','vmlale.u8',
+ 'vmlaeq.u16','vmlane.u16','vmlacs.u16','vmlahs.u16','vmlacc.u16','vmlalo.u16','vmlami.u16','vmlapl.u16','vmlavs.u16','vmlavc.u16','vmlahi.u16','vmlals.u16','vmlage.u16','vmlalt.u16','vmlagt.u16','vmlale.u16',
+ 'vmlaeq.u32','vmlane.u32','vmlacs.u32','vmlahs.u32','vmlacc.u32','vmlalo.u32','vmlami.u32','vmlapl.u32','vmlavs.u32','vmlavc.u32','vmlahi.u32','vmlals.u32','vmlage.u32','vmlalt.u32','vmlagt.u32','vmlale.u32',
+ 'vmlaeq.i8','vmlane.i8','vmlacs.i8','vmlahs.i8','vmlacc.i8','vmlalo.i8','vmlami.i8','vmlapl.i8','vmlavs.i8','vmlavc.i8','vmlahi.i8','vmlals.i8','vmlage.i8','vmlalt.i8','vmlagt.i8','vmlale.i8',
+ 'vmlaeq.i16','vmlane.i16','vmlacs.i16','vmlahs.i16','vmlacc.i16','vmlalo.i16','vmlami.i16','vmlapl.i16','vmlavs.i16','vmlavc.i16','vmlahi.i16','vmlals.i16','vmlage.i16','vmlalt.i16','vmlagt.i16','vmlale.i16',
+ 'vmlaeq.i32','vmlane.i32','vmlacs.i32','vmlahs.i32','vmlacc.i32','vmlalo.i32','vmlami.i32','vmlapl.i32','vmlavs.i32','vmlavc.i32','vmlahi.i32','vmlals.i32','vmlage.i32','vmlalt.i32','vmlagt.i32','vmlale.i32',
+
+ 'vmlseq.s8','vmlsne.s8','vmlscs.s8','vmlshs.s8','vmlscc.s8','vmlslo.s8','vmlsmi.s8','vmlspl.s8','vmlsvs.s8','vmlsvc.s8','vmlshi.s8','vmlsls.s8','vmlsge.s8','vmlslt.s8','vmlsgt.s8','vmlsle.s8',
+ 'vmlseq.s16','vmlsne.s16','vmlscs.s16','vmlshs.s16','vmlscc.s16','vmlslo.s16','vmlsmi.s16','vmlspl.s16','vmlsvs.s16','vmlsvc.s16','vmlshi.s16','vmlsls.s16','vmlsge.s16','vmlslt.s16','vmlsgt.s16','vmlsle.s16',
+ 'vmlseq.s32','vmlsne.s32','vmlscs.s32','vmlshs.s32','vmlscc.s32','vmlslo.s32','vmlsmi.s32','vmlspl.s32','vmlsvs.s32','vmlsvc.s32','vmlshi.s32','vmlsls.s32','vmlsge.s32','vmlslt.s32','vmlsgt.s32','vmlsle.s32',
+ 'vmlseq.u8','vmlsne.u8','vmlscs.u8','vmlshs.u8','vmlscc.u8','vmlslo.u8','vmlsmi.u8','vmlspl.u8','vmlsvs.u8','vmlsvc.u8','vmlshi.u8','vmlsls.u8','vmlsge.u8','vmlslt.u8','vmlsgt.u8','vmlsle.u8',
+ 'vmlseq.u16','vmlsne.u16','vmlscs.u16','vmlshs.u16','vmlscc.u16','vmlslo.u16','vmlsmi.u16','vmlspl.u16','vmlsvs.u16','vmlsvc.u16','vmlshi.u16','vmlsls.u16','vmlsge.u16','vmlslt.u16','vmlsgt.u16','vmlsle.u16',
+ 'vmlseq.u32','vmlsne.u32','vmlscs.u32','vmlshs.u32','vmlscc.u32','vmlslo.u32','vmlsmi.u32','vmlspl.u32','vmlsvs.u32','vmlsvc.u32','vmlshi.u32','vmlsls.u32','vmlsge.u32','vmlslt.u32','vmlsgt.u32','vmlsle.u32',
+ 'vmlseq.i8','vmlsne.i8','vmlscs.i8','vmlshs.i8','vmlscc.i8','vmlslo.i8','vmlsmi.i8','vmlspl.i8','vmlsvs.i8','vmlsvc.i8','vmlshi.i8','vmlsls.i8','vmlsge.i8','vmlslt.i8','vmlsgt.i8','vmlsle.i8',
+ 'vmlseq.i16','vmlsne.i16','vmlscs.i16','vmlshs.i16','vmlscc.i16','vmlslo.i16','vmlsmi.i16','vmlspl.i16','vmlsvs.i16','vmlsvc.i16','vmlshi.i16','vmlsls.i16','vmlsge.i16','vmlslt.i16','vmlsgt.i16','vmlsle.i16',
+ 'vmlseq.i32','vmlsne.i32','vmlscs.i32','vmlshs.i32','vmlscc.i32','vmlslo.i32','vmlsmi.i32','vmlspl.i32','vmlsvs.i32','vmlsvc.i32','vmlshi.i32','vmlsls.i32','vmlsge.i32','vmlslt.i32','vmlsgt.i32','vmlsle.i32',
+
+ 'vmuleq.s8','vmulne.s8','vmulcs.s8','vmulhs.s8','vmulcc.s8','vmullo.s8','vmulmi.s8','vmulpl.s8','vmulvs.s8','vmulvc.s8','vmulhi.s8','vmulls.s8','vmulge.s8','vmullt.s8','vmulgt.s8','vmulle.s8',
+ 'vmuleq.s16','vmulne.s16','vmulcs.s16','vmulhs.s16','vmulcc.s16','vmullo.s16','vmulmi.s16','vmulpl.s16','vmulvs.s16','vmulvc.s16','vmulhi.s16','vmulls.s16','vmulge.s16','vmullt.s16','vmulgt.s16','vmulle.s16',
+ 'vmuleq.s32','vmulne.s32','vmulcs.s32','vmulhs.s32','vmulcc.s32','vmullo.s32','vmulmi.s32','vmulpl.s32','vmulvs.s32','vmulvc.s32','vmulhi.s32','vmulls.s32','vmulge.s32','vmullt.s32','vmulgt.s32','vmulle.s32',
+ 'vmuleq.u8','vmulne.u8','vmulcs.u8','vmulhs.u8','vmulcc.u8','vmullo.u8','vmulmi.u8','vmulpl.u8','vmulvs.u8','vmulvc.u8','vmulhi.u8','vmulls.u8','vmulge.u8','vmullt.u8','vmulgt.u8','vmulle.u8',
+ 'vmuleq.u16','vmulne.u16','vmulcs.u16','vmulhs.u16','vmulcc.u16','vmullo.u16','vmulmi.u16','vmulpl.u16','vmulvs.u16','vmulvc.u16','vmulhi.u16','vmulls.u16','vmulge.u16','vmullt.u16','vmulgt.u16','vmulle.u16',
+ 'vmuleq.u32','vmulne.u32','vmulcs.u32','vmulhs.u32','vmulcc.u32','vmullo.u32','vmulmi.u32','vmulpl.u32','vmulvs.u32','vmulvc.u32','vmulhi.u32','vmulls.u32','vmulge.u32','vmullt.u32','vmulgt.u32','vmulle.u32',
+ 'vmuleq.i8','vmulne.i8','vmulcs.i8','vmulhs.i8','vmulcc.i8','vmullo.i8','vmulmi.i8','vmulpl.i8','vmulvs.i8','vmulvc.i8','vmulhi.i8','vmulls.i8','vmulge.i8','vmullt.i8','vmulgt.i8','vmulle.i8',
+ 'vmuleq.i16','vmulne.i16','vmulcs.i16','vmulhs.i16','vmulcc.i16','vmullo.i16','vmulmi.i16','vmulpl.i16','vmulvs.i16','vmulvc.i16','vmulhi.i16','vmulls.i16','vmulge.i16','vmullt.i16','vmulgt.i16','vmulle.i16',
+ 'vmuleq.i32','vmulne.i32','vmulcs.i32','vmulhs.i32','vmulcc.i32','vmullo.i32','vmulmi.i32','vmulpl.i32','vmulvs.i32','vmulvc.i32','vmulhi.i32','vmulls.i32','vmulge.i32','vmullt.i32','vmulgt.i32','vmulle.i32',
+ 'vmuleq.p8','vmulne.p8','vmulcs.p8','vmulhs.p8','vmulcc.p8','vmullo.p8','vmulmi.p8','vmulpl.p8','vmulvs.p8','vmulvc.p8','vmulhi.p8','vmulls.p8','vmulge.p8','vmullt.p8','vmulgt.p8','vmulle.p8',
+
+ 'vrshrneq.i16','vrshrnne.i16','vrshrncs.i16','vrshrnhs.i16','vrshrncc.i16','vrshrnlo.i16','vrshrnmi.i16','vrshrnpl.i16','vrshrnvs.i16','vrshrnvc.i16','vrshrnhi.i16','vrshrnls.i16','vrshrnge.i16','vrshrnlt.i16','vrshrngt.i16','vrshrnle.i16',
+ 'vrshrneq.i32','vrshrnne.i32','vrshrncs.i32','vrshrnhs.i32','vrshrncc.i32','vrshrnlo.i32','vrshrnmi.i32','vrshrnpl.i32','vrshrnvs.i32','vrshrnvc.i32','vrshrnhi.i32','vrshrnls.i32','vrshrnge.i32','vrshrnlt.i32','vrshrngt.i32','vrshrnle.i32',
+ 'vrshrneq.i64','vrshrnne.i64','vrshrncs.i64','vrshrnhs.i64','vrshrncc.i64','vrshrnlo.i64','vrshrnmi.i64','vrshrnpl.i64','vrshrnvs.i64','vrshrnvc.i64','vrshrnhi.i64','vrshrnls.i64','vrshrnge.i64','vrshrnlt.i64','vrshrngt.i64','vrshrnle.i64',
+
+ 'vshrneq.i16','vshrnne.i16','vshrncs.i16','vshrnhs.i16','vshrncc.i16','vshrnlo.i16','vshrnmi.i16','vshrnpl.i16','vshrnvs.i16','vshrnvc.i16','vshrnhi.i16','vshrnls.i16','vshrnge.i16','vshrnlt.i16','vshrngt.i16','vshrnle.i16',
+ 'vshrneq.i32','vshrnne.i32','vshrncs.i32','vshrnhs.i32','vshrncc.i32','vshrnlo.i32','vshrnmi.i32','vshrnpl.i32','vshrnvs.i32','vshrnvc.i32','vshrnhi.i32','vshrnls.i32','vshrnge.i32','vshrnlt.i32','vshrngt.i32','vshrnle.i32',
+ 'vshrneq.i64','vshrnne.i64','vshrncs.i64','vshrnhs.i64','vshrncc.i64','vshrnlo.i64','vshrnmi.i64','vshrnpl.i64','vshrnvs.i64','vshrnvc.i64','vshrnhi.i64','vshrnls.i64','vshrnge.i64','vshrnlt.i64','vshrngt.i64','vshrnle.i64',
+
+ 'vshleq.i8','vshlne.i8','vshlcs.i8','vshlhs.i8','vshlcc.i8','vshllo.i8','vshlmi.i8','vshlpl.i8','vshlvs.i8','vshlvc.i8','vshlhi.i8','vshlls.i8','vshlge.i8','vshllt.i8','vshlgt.i8','vshlle.i8',
+ 'vshleq.i16','vshlne.i16','vshlcs.i16','vshlhs.i16','vshlcc.i16','vshllo.i16','vshlmi.i16','vshlpl.i16','vshlvs.i16','vshlvc.i16','vshlhi.i16','vshlls.i16','vshlge.i16','vshllt.i16','vshlgt.i16','vshlle.i16',
+ 'vshleq.i32','vshlne.i32','vshlcs.i32','vshlhs.i32','vshlcc.i32','vshllo.i32','vshlmi.i32','vshlpl.i32','vshlvs.i32','vshlvc.i32','vshlhi.i32','vshlls.i32','vshlge.i32','vshllt.i32','vshlgt.i32','vshlle.i32',
+ 'vshleq.i64','vshlne.i64','vshlcs.i64','vshlhs.i64','vshlcc.i64','vshllo.i64','vshlmi.i64','vshlpl.i64','vshlvs.i64','vshlvc.i64','vshlhi.i64','vshlls.i64','vshlge.i64','vshllt.i64','vshlgt.i64','vshlle.i64',
+
+ 'vshlleq.i8','vshllne.i8','vshllcs.i8','vshllhs.i8','vshllcc.i8','vshlllo.i8','vshllmi.i8','vshllpl.i8','vshllvs.i8','vshllvc.i8','vshllhi.i8','vshllls.i8','vshllge.i8','vshlllt.i8','vshllgt.i8','vshllle.i8',
+ 'vshlleq.i16','vshllne.i16','vshllcs.i16','vshllhs.i16','vshllcc.i16','vshlllo.i16','vshllmi.i16','vshllpl.i16','vshllvs.i16','vshllvc.i16','vshllhi.i16','vshllls.i16','vshllge.i16','vshlllt.i16','vshllgt.i16','vshllle.i16',
+ 'vshlleq.i32','vshllne.i32','vshllcs.i32','vshllhs.i32','vshllcc.i32','vshlllo.i32','vshllmi.i32','vshllpl.i32','vshllvs.i32','vshllvc.i32','vshllhi.i32','vshllls.i32','vshllge.i32','vshlllt.i32','vshllgt.i32','vshllle.i32'
+ ),
+ /* Conditional NEON SIMD Signed Integer Instructions */
+ 32 => array(
+ 'vabaeq.s8','vabane.s8','vabacs.s8','vabahs.s8','vabacc.s8','vabalo.s8','vabami.s8','vabapl.s8','vabavs.s8','vabavc.s8','vabahi.s8','vabals.s8','vabage.s8','vabalt.s8','vabagt.s8','vabale.s8',
+ 'vabaeq.s16','vabane.s16','vabacs.s16','vabahs.s16','vabacc.s16','vabalo.s16','vabami.s16','vabapl.s16','vabavs.s16','vabavc.s16','vabahi.s16','vabals.s16','vabage.s16','vabalt.s16','vabagt.s16','vabale.s16',
+ 'vabaeq.s32','vabane.s32','vabacs.s32','vabahs.s32','vabacc.s32','vabalo.s32','vabami.s32','vabapl.s32','vabavs.s32','vabavc.s32','vabahi.s32','vabals.s32','vabage.s32','vabalt.s32','vabagt.s32','vabale.s32',
+
+ 'vabaleq.s8','vabalne.s8','vabalcs.s8','vabalhs.s8','vabalcc.s8','vaballo.s8','vabalmi.s8','vabalpl.s8','vabalvs.s8','vabalvc.s8','vabalhi.s8','vaballs.s8','vabalge.s8','vaballt.s8','vabalgt.s8','vaballe.s8',
+ 'vabaleq.s16','vabalne.s16','vabalcs.s16','vabalhs.s16','vabalcc.s16','vaballo.s16','vabalmi.s16','vabalpl.s16','vabalvs.s16','vabalvc.s16','vabalhi.s16','vaballs.s16','vabalge.s16','vaballt.s16','vabalgt.s16','vaballe.s16',
+ 'vabaleq.s32','vabalne.s32','vabalcs.s32','vabalhs.s32','vabalcc.s32','vaballo.s32','vabalmi.s32','vabalpl.s32','vabalvs.s32','vabalvc.s32','vabalhi.s32','vaballs.s32','vabalge.s32','vaballt.s32','vabalgt.s32','vaballe.s32',
+
+ 'vabdeq.s8','vabdne.s8','vabdcs.s8','vabdhs.s8','vabdcc.s8','vabdlo.s8','vabdmi.s8','vabdpl.s8','vabdvs.s8','vabdvc.s8','vabdhi.s8','vabdls.s8','vabdge.s8','vabdlt.s8','vabdgt.s8','vabdle.s8',
+ 'vabdeq.s16','vabdne.s16','vabdcs.s16','vabdhs.s16','vabdcc.s16','vabdlo.s16','vabdmi.s16','vabdpl.s16','vabdvs.s16','vabdvc.s16','vabdhi.s16','vabdls.s16','vabdge.s16','vabdlt.s16','vabdgt.s16','vabdle.s16',
+ 'vabdeq.s32','vabdne.s32','vabdcs.s32','vabdhs.s32','vabdcc.s32','vabdlo.s32','vabdmi.s32','vabdpl.s32','vabdvs.s32','vabdvc.s32','vabdhi.s32','vabdls.s32','vabdge.s32','vabdlt.s32','vabdgt.s32','vabdle.s32',
+
+ 'vabseq.s8','vabsne.s8','vabscs.s8','vabshs.s8','vabscc.s8','vabslo.s8','vabsmi.s8','vabspl.s8','vabsvs.s8','vabsvc.s8','vabshi.s8','vabsls.s8','vabsge.s8','vabslt.s8','vabsgt.s8','vabsle.s8',
+ 'vabseq.s16','vabsne.s16','vabscs.s16','vabshs.s16','vabscc.s16','vabslo.s16','vabsmi.s16','vabspl.s16','vabsvs.s16','vabsvc.s16','vabshi.s16','vabsls.s16','vabsge.s16','vabslt.s16','vabsgt.s16','vabsle.s16',
+ 'vabseq.s32','vabsne.s32','vabscs.s32','vabshs.s32','vabscc.s32','vabslo.s32','vabsmi.s32','vabspl.s32','vabsvs.s32','vabsvc.s32','vabshi.s32','vabsls.s32','vabsge.s32','vabslt.s32','vabsgt.s32','vabsle.s32',
+
+ 'vaddleq.s8','vaddlne.s8','vaddlcs.s8','vaddlhs.s8','vaddlcc.s8','vaddllo.s8','vaddlmi.s8','vaddlpl.s8','vaddlvs.s8','vaddlvc.s8','vaddlhi.s8','vaddlls.s8','vaddlge.s8','vaddllt.s8','vaddlgt.s8','vaddlle.s8',
+ 'vaddleq.s16','vaddlne.s16','vaddlcs.s16','vaddlhs.s16','vaddlcc.s16','vaddllo.s16','vaddlmi.s16','vaddlpl.s16','vaddlvs.s16','vaddlvc.s16','vaddlhi.s16','vaddlls.s16','vaddlge.s16','vaddllt.s16','vaddlgt.s16','vaddlle.s16',
+ 'vaddleq.s32','vaddlne.s32','vaddlcs.s32','vaddlhs.s32','vaddlcc.s32','vaddllo.s32','vaddlmi.s32','vaddlpl.s32','vaddlvs.s32','vaddlvc.s32','vaddlhi.s32','vaddlls.s32','vaddlge.s32','vaddllt.s32','vaddlgt.s32','vaddlle.s32',
+
+ 'vcgeeq.s8','vcgene.s8','vcgecs.s8','vcgehs.s8','vcgecc.s8','vcgelo.s8','vcgemi.s8','vcgepl.s8','vcgevs.s8','vcgevc.s8','vcgehi.s8','vcgels.s8','vcgege.s8','vcgelt.s8','vcgegt.s8','vcgele.s8',
+ 'vcgeeq.s16','vcgene.s16','vcgecs.s16','vcgehs.s16','vcgecc.s16','vcgelo.s16','vcgemi.s16','vcgepl.s16','vcgevs.s16','vcgevc.s16','vcgehi.s16','vcgels.s16','vcgege.s16','vcgelt.s16','vcgegt.s16','vcgele.s16',
+ 'vcgeeq.s32','vcgene.s32','vcgecs.s32','vcgehs.s32','vcgecc.s32','vcgelo.s32','vcgemi.s32','vcgepl.s32','vcgevs.s32','vcgevc.s32','vcgehi.s32','vcgels.s32','vcgege.s32','vcgelt.s32','vcgegt.s32','vcgele.s32',
+
+ 'vcleeq.s8','vclene.s8','vclecs.s8','vclehs.s8','vclecc.s8','vclelo.s8','vclemi.s8','vclepl.s8','vclevs.s8','vclevc.s8','vclehi.s8','vclels.s8','vclege.s8','vclelt.s8','vclegt.s8','vclele.s8',
+ 'vcleeq.s16','vclene.s16','vclecs.s16','vclehs.s16','vclecc.s16','vclelo.s16','vclemi.s16','vclepl.s16','vclevs.s16','vclevc.s16','vclehi.s16','vclels.s16','vclege.s16','vclelt.s16','vclegt.s16','vclele.s16',
+ 'vcleeq.s32','vclene.s32','vclecs.s32','vclehs.s32','vclecc.s32','vclelo.s32','vclemi.s32','vclepl.s32','vclevs.s32','vclevc.s32','vclehi.s32','vclels.s32','vclege.s32','vclelt.s32','vclegt.s32','vclele.s32',
+
+ 'vcgteq.s8','vcgtne.s8','vcgtcs.s8','vcgths.s8','vcgtcc.s8','vcgtlo.s8','vcgtmi.s8','vcgtpl.s8','vcgtvs.s8','vcgtvc.s8','vcgthi.s8','vcgtls.s8','vcgtge.s8','vcgtlt.s8','vcgtgt.s8','vcgtle.s8',
+ 'vcgteq.s16','vcgtne.s16','vcgtcs.s16','vcgths.s16','vcgtcc.s16','vcgtlo.s16','vcgtmi.s16','vcgtpl.s16','vcgtvs.s16','vcgtvc.s16','vcgthi.s16','vcgtls.s16','vcgtge.s16','vcgtlt.s16','vcgtgt.s16','vcgtle.s16',
+ 'vcgteq.s32','vcgtne.s32','vcgtcs.s32','vcgths.s32','vcgtcc.s32','vcgtlo.s32','vcgtmi.s32','vcgtpl.s32','vcgtvs.s32','vcgtvc.s32','vcgthi.s32','vcgtls.s32','vcgtge.s32','vcgtlt.s32','vcgtgt.s32','vcgtle.s32',
+
+ 'vclteq.s8','vcltne.s8','vcltcs.s8','vclths.s8','vcltcc.s8','vcltlo.s8','vcltmi.s8','vcltpl.s8','vcltvs.s8','vcltvc.s8','vclthi.s8','vcltls.s8','vcltge.s8','vcltlt.s8','vcltgt.s8','vcltle.s8',
+ 'vclteq.s16','vcltne.s16','vcltcs.s16','vclths.s16','vcltcc.s16','vcltlo.s16','vcltmi.s16','vcltpl.s16','vcltvs.s16','vcltvc.s16','vclthi.s16','vcltls.s16','vcltge.s16','vcltlt.s16','vcltgt.s16','vcltle.s16',
+ 'vclteq.s32','vcltne.s32','vcltcs.s32','vclths.s32','vcltcc.s32','vcltlo.s32','vcltmi.s32','vcltpl.s32','vcltvs.s32','vcltvc.s32','vclthi.s32','vcltls.s32','vcltge.s32','vcltlt.s32','vcltgt.s32','vcltle.s32',
+
+ 'vclseq.s8','vclsne.s8','vclscs.s8','vclshs.s8','vclscc.s8','vclslo.s8','vclsmi.s8','vclspl.s8','vclsvs.s8','vclsvc.s8','vclshi.s8','vclsls.s8','vclsge.s8','vclslt.s8','vclsgt.s8','vclsle.s8',
+ 'vclseq.s16','vclsne.s16','vclscs.s16','vclshs.s16','vclscc.s16','vclslo.s16','vclsmi.s16','vclspl.s16','vclsvs.s16','vclsvc.s16','vclshi.s16','vclsls.s16','vclsge.s16','vclslt.s16','vclsgt.s16','vclsle.s16',
+ 'vclseq.s32','vclsne.s32','vclscs.s32','vclshs.s32','vclscc.s32','vclslo.s32','vclsmi.s32','vclspl.s32','vclsvs.s32','vclsvc.s32','vclshi.s32','vclsls.s32','vclsge.s32','vclslt.s32','vclsgt.s32','vclsle.s32',
+
+ 'vaddweq.s8','vaddwne.s8','vaddwcs.s8','vaddwhs.s8','vaddwcc.s8','vaddwlo.s8','vaddwmi.s8','vaddwpl.s8','vaddwvs.s8','vaddwvc.s8','vaddwhi.s8','vaddwls.s8','vaddwge.s8','vaddwlt.s8','vaddwgt.s8','vaddwle.s8',
+ 'vaddweq.s16','vaddwne.s16','vaddwcs.s16','vaddwhs.s16','vaddwcc.s16','vaddwlo.s16','vaddwmi.s16','vaddwpl.s16','vaddwvs.s16','vaddwvc.s16','vaddwhi.s16','vaddwls.s16','vaddwge.s16','vaddwlt.s16','vaddwgt.s16','vaddwle.s16',
+ 'vaddweq.s32','vaddwne.s32','vaddwcs.s32','vaddwhs.s32','vaddwcc.s32','vaddwlo.s32','vaddwmi.s32','vaddwpl.s32','vaddwvs.s32','vaddwvc.s32','vaddwhi.s32','vaddwls.s32','vaddwge.s32','vaddwlt.s32','vaddwgt.s32','vaddwle.s32',
+
+ 'vhaddeq.s8','vhaddne.s8','vhaddcs.s8','vhaddhs.s8','vhaddcc.s8','vhaddlo.s8','vhaddmi.s8','vhaddpl.s8','vhaddvs.s8','vhaddvc.s8','vhaddhi.s8','vhaddls.s8','vhaddge.s8','vhaddlt.s8','vhaddgt.s8','vhaddle.s8',
+ 'vhaddeq.s16','vhaddne.s16','vhaddcs.s16','vhaddhs.s16','vhaddcc.s16','vhaddlo.s16','vhaddmi.s16','vhaddpl.s16','vhaddvs.s16','vhaddvc.s16','vhaddhi.s16','vhaddls.s16','vhaddge.s16','vhaddlt.s16','vhaddgt.s16','vhaddle.s16',
+ 'vhaddeq.s32','vhaddne.s32','vhaddcs.s32','vhaddhs.s32','vhaddcc.s32','vhaddlo.s32','vhaddmi.s32','vhaddpl.s32','vhaddvs.s32','vhaddvc.s32','vhaddhi.s32','vhaddls.s32','vhaddge.s32','vhaddlt.s32','vhaddgt.s32','vhaddle.s32',
+
+ 'vhsubeq.s8','vhsubne.s8','vhsubcs.s8','vhsubhs.s8','vhsubcc.s8','vhsublo.s8','vhsubmi.s8','vhsubpl.s8','vhsubvs.s8','vhsubvc.s8','vhsubhi.s8','vhsubls.s8','vhsubge.s8','vhsublt.s8','vhsubgt.s8','vhsuble.s8',
+ 'vhsubeq.s16','vhsubne.s16','vhsubcs.s16','vhsubhs.s16','vhsubcc.s16','vhsublo.s16','vhsubmi.s16','vhsubpl.s16','vhsubvs.s16','vhsubvc.s16','vhsubhi.s16','vhsubls.s16','vhsubge.s16','vhsublt.s16','vhsubgt.s16','vhsuble.s16',
+ 'vhsubeq.s32','vhsubne.s32','vhsubcs.s32','vhsubhs.s32','vhsubcc.s32','vhsublo.s32','vhsubmi.s32','vhsubpl.s32','vhsubvs.s32','vhsubvc.s32','vhsubhi.s32','vhsubls.s32','vhsubge.s32','vhsublt.s32','vhsubgt.s32','vhsuble.s32',
+
+ 'vmaxeq.s8','vmaxne.s8','vmaxcs.s8','vmaxhs.s8','vmaxcc.s8','vmaxlo.s8','vmaxmi.s8','vmaxpl.s8','vmaxvs.s8','vmaxvc.s8','vmaxhi.s8','vmaxls.s8','vmaxge.s8','vmaxlt.s8','vmaxgt.s8','vmaxle.s8',
+ 'vmaxeq.s16','vmaxne.s16','vmaxcs.s16','vmaxhs.s16','vmaxcc.s16','vmaxlo.s16','vmaxmi.s16','vmaxpl.s16','vmaxvs.s16','vmaxvc.s16','vmaxhi.s16','vmaxls.s16','vmaxge.s16','vmaxlt.s16','vmaxgt.s16','vmaxle.s16',
+ 'vmaxeq.s32','vmaxne.s32','vmaxcs.s32','vmaxhs.s32','vmaxcc.s32','vmaxlo.s32','vmaxmi.s32','vmaxpl.s32','vmaxvs.s32','vmaxvc.s32','vmaxhi.s32','vmaxls.s32','vmaxge.s32','vmaxlt.s32','vmaxgt.s32','vmaxle.s32',
+
+ 'vmineq.s8','vminne.s8','vmincs.s8','vminhs.s8','vmincc.s8','vminlo.s8','vminmi.s8','vminpl.s8','vminvs.s8','vminvc.s8','vminhi.s8','vminls.s8','vminge.s8','vminlt.s8','vmingt.s8','vminle.s8',
+ 'vmineq.s16','vminne.s16','vmincs.s16','vminhs.s16','vmincc.s16','vminlo.s16','vminmi.s16','vminpl.s16','vminvs.s16','vminvc.s16','vminhi.s16','vminls.s16','vminge.s16','vminlt.s16','vmingt.s16','vminle.s16',
+ 'vmineq.s32','vminne.s32','vmincs.s32','vminhs.s32','vmincc.s32','vminlo.s32','vminmi.s32','vminpl.s32','vminvs.s32','vminvc.s32','vminhi.s32','vminls.s32','vminge.s32','vminlt.s32','vmingt.s32','vminle.s32',
+
+ 'vmlaleq.s8','vmlalne.s8','vmlalcs.s8','vmlalhs.s8','vmlalcc.s8','vmlallo.s8','vmlalmi.s8','vmlalpl.s8','vmlalvs.s8','vmlalvc.s8','vmlalhi.s8','vmlalls.s8','vmlalge.s8','vmlallt.s8','vmlalgt.s8','vmlalle.s8',
+ 'vmlaleq.s16','vmlalne.s16','vmlalcs.s16','vmlalhs.s16','vmlalcc.s16','vmlallo.s16','vmlalmi.s16','vmlalpl.s16','vmlalvs.s16','vmlalvc.s16','vmlalhi.s16','vmlalls.s16','vmlalge.s16','vmlallt.s16','vmlalgt.s16','vmlalle.s16',
+ 'vmlaleq.s32','vmlalne.s32','vmlalcs.s32','vmlalhs.s32','vmlalcc.s32','vmlallo.s32','vmlalmi.s32','vmlalpl.s32','vmlalvs.s32','vmlalvc.s32','vmlalhi.s32','vmlalls.s32','vmlalge.s32','vmlallt.s32','vmlalgt.s32','vmlalle.s32',
+
+ 'vmlsleq.s8','vmlslne.s8','vmlslcs.s8','vmlslhs.s8','vmlslcc.s8','vmlsllo.s8','vmlslmi.s8','vmlslpl.s8','vmlslvs.s8','vmlslvc.s8','vmlslhi.s8','vmlslls.s8','vmlslge.s8','vmlsllt.s8','vmlslgt.s8','vmlslle.s8',
+ 'vmlsleq.s16','vmlslne.s16','vmlslcs.s16','vmlslhs.s16','vmlslcc.s16','vmlsllo.s16','vmlslmi.s16','vmlslpl.s16','vmlslvs.s16','vmlslvc.s16','vmlslhi.s16','vmlslls.s16','vmlslge.s16','vmlsllt.s16','vmlslgt.s16','vmlslle.s16',
+ 'vmlsleq.s32','vmlslne.s32','vmlslcs.s32','vmlslhs.s32','vmlslcc.s32','vmlsllo.s32','vmlslmi.s32','vmlslpl.s32','vmlslvs.s32','vmlslvc.s32','vmlslhi.s32','vmlslls.s32','vmlslge.s32','vmlsllt.s32','vmlslgt.s32','vmlslle.s32',
+
+ 'vnegeq.s8','vnegne.s8','vnegcs.s8','vneghs.s8','vnegcc.s8','vneglo.s8','vnegmi.s8','vnegpl.s8','vnegvs.s8','vnegvc.s8','vneghi.s8','vnegls.s8','vnegge.s8','vneglt.s8','vneggt.s8','vnegle.s8',
+ 'vnegeq.s16','vnegne.s16','vnegcs.s16','vneghs.s16','vnegcc.s16','vneglo.s16','vnegmi.s16','vnegpl.s16','vnegvs.s16','vnegvc.s16','vneghi.s16','vnegls.s16','vnegge.s16','vneglt.s16','vneggt.s16','vnegle.s16',
+ 'vnegeq.s32','vnegne.s32','vnegcs.s32','vneghs.s32','vnegcc.s32','vneglo.s32','vnegmi.s32','vnegpl.s32','vnegvs.s32','vnegvc.s32','vneghi.s32','vnegls.s32','vnegge.s32','vneglt.s32','vneggt.s32','vnegle.s32',
+
+ 'vpadaleq.s8','vpadalne.s8','vpadalcs.s8','vpadalhs.s8','vpadalcc.s8','vpadallo.s8','vpadalmi.s8','vpadalpl.s8','vpadalvs.s8','vpadalvc.s8','vpadalhi.s8','vpadalls.s8','vpadalge.s8','vpadallt.s8','vpadalgt.s8','vpadalle.s8',
+ 'vpadaleq.s16','vpadalne.s16','vpadalcs.s16','vpadalhs.s16','vpadalcc.s16','vpadallo.s16','vpadalmi.s16','vpadalpl.s16','vpadalvs.s16','vpadalvc.s16','vpadalhi.s16','vpadalls.s16','vpadalge.s16','vpadallt.s16','vpadalgt.s16','vpadalle.s16',
+ 'vpadaleq.s32','vpadalne.s32','vpadalcs.s32','vpadalhs.s32','vpadalcc.s32','vpadallo.s32','vpadalmi.s32','vpadalpl.s32','vpadalvs.s32','vpadalvc.s32','vpadalhi.s32','vpadalls.s32','vpadalge.s32','vpadallt.s32','vpadalgt.s32','vpadalle.s32',
+
+ 'vmovleq.s8','vmovlne.s8','vmovlcs.s8','vmovlhs.s8','vmovlcc.s8','vmovllo.s8','vmovlmi.s8','vmovlpl.s8','vmovlvs.s8','vmovlvc.s8','vmovlhi.s8','vmovlls.s8','vmovlge.s8','vmovllt.s8','vmovlgt.s8','vmovlle.s8',
+ 'vmovleq.s16','vmovlne.s16','vmovlcs.s16','vmovlhs.s16','vmovlcc.s16','vmovllo.s16','vmovlmi.s16','vmovlpl.s16','vmovlvs.s16','vmovlvc.s16','vmovlhi.s16','vmovlls.s16','vmovlge.s16','vmovllt.s16','vmovlgt.s16','vmovlle.s16',
+ 'vmovleq.s32','vmovlne.s32','vmovlcs.s32','vmovlhs.s32','vmovlcc.s32','vmovllo.s32','vmovlmi.s32','vmovlpl.s32','vmovlvs.s32','vmovlvc.s32','vmovlhi.s32','vmovlls.s32','vmovlge.s32','vmovllt.s32','vmovlgt.s32','vmovlle.s32',
+
+ 'vmulleq.s8','vmullne.s8','vmullcs.s8','vmullhs.s8','vmullcc.s8','vmulllo.s8','vmullmi.s8','vmullpl.s8','vmullvs.s8','vmullvc.s8','vmullhi.s8','vmullls.s8','vmullge.s8','vmulllt.s8','vmullgt.s8','vmullle.s8',
+ 'vmulleq.s16','vmullne.s16','vmullcs.s16','vmullhs.s16','vmullcc.s16','vmulllo.s16','vmullmi.s16','vmullpl.s16','vmullvs.s16','vmullvc.s16','vmullhi.s16','vmullls.s16','vmullge.s16','vmulllt.s16','vmullgt.s16','vmullle.s16',
+ 'vmulleq.s32','vmullne.s32','vmullcs.s32','vmullhs.s32','vmullcc.s32','vmulllo.s32','vmullmi.s32','vmullpl.s32','vmullvs.s32','vmullvc.s32','vmullhi.s32','vmullls.s32','vmullge.s32','vmulllt.s32','vmullgt.s32','vmullle.s32',
+
+ 'vpaddleq.s8','vpaddlne.s8','vpaddlcs.s8','vpaddlhs.s8','vpaddlcc.s8','vpaddllo.s8','vpaddlmi.s8','vpaddlpl.s8','vpaddlvs.s8','vpaddlvc.s8','vpaddlhi.s8','vpaddlls.s8','vpaddlge.s8','vpaddllt.s8','vpaddlgt.s8','vpaddlle.s8',
+ 'vpaddleq.s16','vpaddlne.s16','vpaddlcs.s16','vpaddlhs.s16','vpaddlcc.s16','vpaddllo.s16','vpaddlmi.s16','vpaddlpl.s16','vpaddlvs.s16','vpaddlvc.s16','vpaddlhi.s16','vpaddlls.s16','vpaddlge.s16','vpaddllt.s16','vpaddlgt.s16','vpaddlle.s16',
+ 'vpaddleq.s32','vpaddlne.s32','vpaddlcs.s32','vpaddlhs.s32','vpaddlcc.s32','vpaddllo.s32','vpaddlmi.s32','vpaddlpl.s32','vpaddlvs.s32','vpaddlvc.s32','vpaddlhi.s32','vpaddlls.s32','vpaddlge.s32','vpaddllt.s32','vpaddlgt.s32','vpaddlle.s32',
+
+ 'vpmaxeq.s8','vpmaxne.s8','vpmaxcs.s8','vpmaxhs.s8','vpmaxcc.s8','vpmaxlo.s8','vpmaxmi.s8','vpmaxpl.s8','vpmaxvs.s8','vpmaxvc.s8','vpmaxhi.s8','vpmaxls.s8','vpmaxge.s8','vpmaxlt.s8','vpmaxgt.s8','vpmaxle.s8',
+ 'vpmaxeq.s16','vpmaxne.s16','vpmaxcs.s16','vpmaxhs.s16','vpmaxcc.s16','vpmaxlo.s16','vpmaxmi.s16','vpmaxpl.s16','vpmaxvs.s16','vpmaxvc.s16','vpmaxhi.s16','vpmaxls.s16','vpmaxge.s16','vpmaxlt.s16','vpmaxgt.s16','vpmaxle.s16',
+ 'vpmaxeq.s32','vpmaxne.s32','vpmaxcs.s32','vpmaxhs.s32','vpmaxcc.s32','vpmaxlo.s32','vpmaxmi.s32','vpmaxpl.s32','vpmaxvs.s32','vpmaxvc.s32','vpmaxhi.s32','vpmaxls.s32','vpmaxge.s32','vpmaxlt.s32','vpmaxgt.s32','vpmaxle.s32',
+
+ 'vpmineq.s8','vpminne.s8','vpmincs.s8','vpminhs.s8','vpmincc.s8','vpminlo.s8','vpminmi.s8','vpminpl.s8','vpminvs.s8','vpminvc.s8','vpminhi.s8','vpminls.s8','vpminge.s8','vpminlt.s8','vpmingt.s8','vpminle.s8',
+ 'vpmineq.s16','vpminne.s16','vpmincs.s16','vpminhs.s16','vpmincc.s16','vpminlo.s16','vpminmi.s16','vpminpl.s16','vpminvs.s16','vpminvc.s16','vpminhi.s16','vpminls.s16','vpminge.s16','vpminlt.s16','vpmingt.s16','vpminle.s16',
+ 'vpmineq.s32','vpminne.s32','vpmincs.s32','vpminhs.s32','vpmincc.s32','vpminlo.s32','vpminmi.s32','vpminpl.s32','vpminvs.s32','vpminvc.s32','vpminhi.s32','vpminls.s32','vpminge.s32','vpminlt.s32','vpmingt.s32','vpminle.s32',
+
+ 'vqabseq.s8','vqabsne.s8','vqabscs.s8','vqabshs.s8','vqabscc.s8','vqabslo.s8','vqabsmi.s8','vqabspl.s8','vqabsvs.s8','vqabsvc.s8','vqabshi.s8','vqabsls.s8','vqabsge.s8','vqabslt.s8','vqabsgt.s8','vqabsle.s8',
+ 'vqabseq.s16','vqabsne.s16','vqabscs.s16','vqabshs.s16','vqabscc.s16','vqabslo.s16','vqabsmi.s16','vqabspl.s16','vqabsvs.s16','vqabsvc.s16','vqabshi.s16','vqabsls.s16','vqabsge.s16','vqabslt.s16','vqabsgt.s16','vqabsle.s16',
+ 'vqabseq.s32','vqabsne.s32','vqabscs.s32','vqabshs.s32','vqabscc.s32','vqabslo.s32','vqabsmi.s32','vqabspl.s32','vqabsvs.s32','vqabsvc.s32','vqabshi.s32','vqabsls.s32','vqabsge.s32','vqabslt.s32','vqabsgt.s32','vqabsle.s32',
+
+ 'vqaddeq.s8','vqaddne.s8','vqaddcs.s8','vqaddhs.s8','vqaddcc.s8','vqaddlo.s8','vqaddmi.s8','vqaddpl.s8','vqaddvs.s8','vqaddvc.s8','vqaddhi.s8','vqaddls.s8','vqaddge.s8','vqaddlt.s8','vqaddgt.s8','vqaddle.s8',
+ 'vqaddeq.s16','vqaddne.s16','vqaddcs.s16','vqaddhs.s16','vqaddcc.s16','vqaddlo.s16','vqaddmi.s16','vqaddpl.s16','vqaddvs.s16','vqaddvc.s16','vqaddhi.s16','vqaddls.s16','vqaddge.s16','vqaddlt.s16','vqaddgt.s16','vqaddle.s16',
+ 'vqaddeq.s32','vqaddne.s32','vqaddcs.s32','vqaddhs.s32','vqaddcc.s32','vqaddlo.s32','vqaddmi.s32','vqaddpl.s32','vqaddvs.s32','vqaddvc.s32','vqaddhi.s32','vqaddls.s32','vqaddge.s32','vqaddlt.s32','vqaddgt.s32','vqaddle.s32',
+ 'vqaddeq.s64','vqaddne.s64','vqaddcs.s64','vqaddhs.s64','vqaddcc.s64','vqaddlo.s64','vqaddmi.s64','vqaddpl.s64','vqaddvs.s64','vqaddvc.s64','vqaddhi.s64','vqaddls.s64','vqaddge.s64','vqaddlt.s64','vqaddgt.s64','vqaddle.s64',
+
+ 'vqdmlaleq.s16','vqdmlalne.s16','vqdmlalcs.s16','vqdmlalhs.s16','vqdmlalcc.s16','vqdmlallo.s16','vqdmlalmi.s16','vqdmlalpl.s16','vqdmlalvs.s16','vqdmlalvc.s16','vqdmlalhi.s16','vqdmlalls.s16','vqdmlalge.s16','vqdmlallt.s16','vqdmlalgt.s16','vqdmlalle.s16',
+ 'vqdmlaleq.s32','vqdmlalne.s32','vqdmlalcs.s32','vqdmlalhs.s32','vqdmlalcc.s32','vqdmlallo.s32','vqdmlalmi.s32','vqdmlalpl.s32','vqdmlalvs.s32','vqdmlalvc.s32','vqdmlalhi.s32','vqdmlalls.s32','vqdmlalge.s32','vqdmlallt.s32','vqdmlalgt.s32','vqdmlalle.s32',
+
+ 'vqdmlsleq.s16','vqdmlslne.s16','vqdmlslcs.s16','vqdmlslhs.s16','vqdmlslcc.s16','vqdmlsllo.s16','vqdmlslmi.s16','vqdmlslpl.s16','vqdmlslvs.s16','vqdmlslvc.s16','vqdmlslhi.s16','vqdmlslls.s16','vqdmlslge.s16','vqdmlsllt.s16','vqdmlslgt.s16','vqdmlslle.s16',
+ 'vqdmlsleq.s32','vqdmlslne.s32','vqdmlslcs.s32','vqdmlslhs.s32','vqdmlslcc.s32','vqdmlsllo.s32','vqdmlslmi.s32','vqdmlslpl.s32','vqdmlslvs.s32','vqdmlslvc.s32','vqdmlslhi.s32','vqdmlslls.s32','vqdmlslge.s32','vqdmlsllt.s32','vqdmlslgt.s32','vqdmlslle.s32',
+
+ 'vqdmulheq.s16','vqdmulhne.s16','vqdmulhcs.s16','vqdmulhhs.s16','vqdmulhcc.s16','vqdmulhlo.s16','vqdmulhmi.s16','vqdmulhpl.s16','vqdmulhvs.s16','vqdmulhvc.s16','vqdmulhhi.s16','vqdmulhls.s16','vqdmulhge.s16','vqdmulhlt.s16','vqdmulhgt.s16','vqdmulhle.s16',
+ 'vqdmulheq.s32','vqdmulhne.s32','vqdmulhcs.s32','vqdmulhhs.s32','vqdmulhcc.s32','vqdmulhlo.s32','vqdmulhmi.s32','vqdmulhpl.s32','vqdmulhvs.s32','vqdmulhvc.s32','vqdmulhhi.s32','vqdmulhls.s32','vqdmulhge.s32','vqdmulhlt.s32','vqdmulhgt.s32','vqdmulhle.s32',
+
+ 'vqdmulleq.s16','vqdmullne.s16','vqdmullcs.s16','vqdmullhs.s16','vqdmullcc.s16','vqdmulllo.s16','vqdmullmi.s16','vqdmullpl.s16','vqdmullvs.s16','vqdmullvc.s16','vqdmullhi.s16','vqdmullls.s16','vqdmullge.s16','vqdmulllt.s16','vqdmullgt.s16','vqdmullle.s16',
+ 'vqdmulleq.s32','vqdmullne.s32','vqdmullcs.s32','vqdmullhs.s32','vqdmullcc.s32','vqdmulllo.s32','vqdmullmi.s32','vqdmullpl.s32','vqdmullvs.s32','vqdmullvc.s32','vqdmullhi.s32','vqdmullls.s32','vqdmullge.s32','vqdmulllt.s32','vqdmullgt.s32','vqdmullle.s32',
+
+ 'vqmovneq.s16','vqmovnne.s16','vqmovncs.s16','vqmovnhs.s16','vqmovncc.s16','vqmovnlo.s16','vqmovnmi.s16','vqmovnpl.s16','vqmovnvs.s16','vqmovnvc.s16','vqmovnhi.s16','vqmovnls.s16','vqmovnge.s16','vqmovnlt.s16','vqmovngt.s16','vqmovnle.s16',
+ 'vqmovneq.s32','vqmovnne.s32','vqmovncs.s32','vqmovnhs.s32','vqmovncc.s32','vqmovnlo.s32','vqmovnmi.s32','vqmovnpl.s32','vqmovnvs.s32','vqmovnvc.s32','vqmovnhi.s32','vqmovnls.s32','vqmovnge.s32','vqmovnlt.s32','vqmovngt.s32','vqmovnle.s32',
+ 'vqmovneq.s64','vqmovnne.s64','vqmovncs.s64','vqmovnhs.s64','vqmovncc.s64','vqmovnlo.s64','vqmovnmi.s64','vqmovnpl.s64','vqmovnvs.s64','vqmovnvc.s64','vqmovnhi.s64','vqmovnls.s64','vqmovnge.s64','vqmovnlt.s64','vqmovngt.s64','vqmovnle.s64',
+
+ 'vqmovuneq.s16','vqmovunne.s16','vqmovuncs.s16','vqmovunhs.s16','vqmovuncc.s16','vqmovunlo.s16','vqmovunmi.s16','vqmovunpl.s16','vqmovunvs.s16','vqmovunvc.s16','vqmovunhi.s16','vqmovunls.s16','vqmovunge.s16','vqmovunlt.s16','vqmovungt.s16','vqmovunle.s16',
+ 'vqmovuneq.s32','vqmovunne.s32','vqmovuncs.s32','vqmovunhs.s32','vqmovuncc.s32','vqmovunlo.s32','vqmovunmi.s32','vqmovunpl.s32','vqmovunvs.s32','vqmovunvc.s32','vqmovunhi.s32','vqmovunls.s32','vqmovunge.s32','vqmovunlt.s32','vqmovungt.s32','vqmovunle.s32',
+ 'vqmovuneq.s64','vqmovunne.s64','vqmovuncs.s64','vqmovunhs.s64','vqmovuncc.s64','vqmovunlo.s64','vqmovunmi.s64','vqmovunpl.s64','vqmovunvs.s64','vqmovunvc.s64','vqmovunhi.s64','vqmovunls.s64','vqmovunge.s64','vqmovunlt.s64','vqmovungt.s64','vqmovunle.s64',
+
+ 'vqnegeq.s8','vqnegne.s8','vqnegcs.s8','vqneghs.s8','vqnegcc.s8','vqneglo.s8','vqnegmi.s8','vqnegpl.s8','vqnegvs.s8','vqnegvc.s8','vqneghi.s8','vqnegls.s8','vqnegge.s8','vqneglt.s8','vqneggt.s8','vqnegle.s8',
+ 'vqnegeq.s16','vqnegne.s16','vqnegcs.s16','vqneghs.s16','vqnegcc.s16','vqneglo.s16','vqnegmi.s16','vqnegpl.s16','vqnegvs.s16','vqnegvc.s16','vqneghi.s16','vqnegls.s16','vqnegge.s16','vqneglt.s16','vqneggt.s16','vqnegle.s16',
+ 'vqnegeq.s32','vqnegne.s32','vqnegcs.s32','vqneghs.s32','vqnegcc.s32','vqneglo.s32','vqnegmi.s32','vqnegpl.s32','vqnegvs.s32','vqnegvc.s32','vqneghi.s32','vqnegls.s32','vqnegge.s32','vqneglt.s32','vqneggt.s32','vqnegle.s32',
+
+ 'vqrdmulheq.s16','vqrdmulhne.s16','vqrdmulhcs.s16','vqrdmulhhs.s16','vqrdmulhcc.s16','vqrdmulhlo.s16','vqrdmulhmi.s16','vqrdmulhpl.s16','vqrdmulhvs.s16','vqrdmulhvc.s16','vqrdmulhhi.s16','vqrdmulhls.s16','vqrdmulhge.s16','vqrdmulhlt.s16','vqrdmulhgt.s16','vqrdmulhle.s16',
+ 'vqrdmulheq.s32','vqrdmulhne.s32','vqrdmulhcs.s32','vqrdmulhhs.s32','vqrdmulhcc.s32','vqrdmulhlo.s32','vqrdmulhmi.s32','vqrdmulhpl.s32','vqrdmulhvs.s32','vqrdmulhvc.s32','vqrdmulhhi.s32','vqrdmulhls.s32','vqrdmulhge.s32','vqrdmulhlt.s32','vqrdmulhgt.s32','vqrdmulhle.s32',
+
+ 'vqrshleq.s8','vqrshlne.s8','vqrshlcs.s8','vqrshlhs.s8','vqrshlcc.s8','vqrshllo.s8','vqrshlmi.s8','vqrshlpl.s8','vqrshlvs.s8','vqrshlvc.s8','vqrshlhi.s8','vqrshlls.s8','vqrshlge.s8','vqrshllt.s8','vqrshlgt.s8','vqrshlle.s8',
+ 'vqrshleq.s16','vqrshlne.s16','vqrshlcs.s16','vqrshlhs.s16','vqrshlcc.s16','vqrshllo.s16','vqrshlmi.s16','vqrshlpl.s16','vqrshlvs.s16','vqrshlvc.s16','vqrshlhi.s16','vqrshlls.s16','vqrshlge.s16','vqrshllt.s16','vqrshlgt.s16','vqrshlle.s16',
+ 'vqrshleq.s32','vqrshlne.s32','vqrshlcs.s32','vqrshlhs.s32','vqrshlcc.s32','vqrshllo.s32','vqrshlmi.s32','vqrshlpl.s32','vqrshlvs.s32','vqrshlvc.s32','vqrshlhi.s32','vqrshlls.s32','vqrshlge.s32','vqrshllt.s32','vqrshlgt.s32','vqrshlle.s32',
+ 'vqrshleq.s64','vqrshlne.s64','vqrshlcs.s64','vqrshlhs.s64','vqrshlcc.s64','vqrshllo.s64','vqrshlmi.s64','vqrshlpl.s64','vqrshlvs.s64','vqrshlvc.s64','vqrshlhi.s64','vqrshlls.s64','vqrshlge.s64','vqrshllt.s64','vqrshlgt.s64','vqrshlle.s64',
+
+ 'vqrshrneq.s16','vqrshrnne.s16','vqrshrncs.s16','vqrshrnhs.s16','vqrshrncc.s16','vqrshrnlo.s16','vqrshrnmi.s16','vqrshrnpl.s16','vqrshrnvs.s16','vqrshrnvc.s16','vqrshrnhi.s16','vqrshrnls.s16','vqrshrnge.s16','vqrshrnlt.s16','vqrshrngt.s16','vqrshrnle.s16',
+ 'vqrshrneq.s32','vqrshrnne.s32','vqrshrncs.s32','vqrshrnhs.s32','vqrshrncc.s32','vqrshrnlo.s32','vqrshrnmi.s32','vqrshrnpl.s32','vqrshrnvs.s32','vqrshrnvc.s32','vqrshrnhi.s32','vqrshrnls.s32','vqrshrnge.s32','vqrshrnlt.s32','vqrshrngt.s32','vqrshrnle.s32',
+ 'vqrshrneq.s64','vqrshrnne.s64','vqrshrncs.s64','vqrshrnhs.s64','vqrshrncc.s64','vqrshrnlo.s64','vqrshrnmi.s64','vqrshrnpl.s64','vqrshrnvs.s64','vqrshrnvc.s64','vqrshrnhi.s64','vqrshrnls.s64','vqrshrnge.s64','vqrshrnlt.s64','vqrshrngt.s64','vqrshrnle.s64',
+
+ 'vqrshruneq.s16','vqrshrunne.s16','vqrshruncs.s16','vqrshrunhs.s16','vqrshruncc.s16','vqrshrunlo.s16','vqrshrunmi.s16','vqrshrunpl.s16','vqrshrunvs.s16','vqrshrunvc.s16','vqrshrunhi.s16','vqrshrunls.s16','vqrshrunge.s16','vqrshrunlt.s16','vqrshrungt.s16','vqrshrunle.s16',
+ 'vqrshruneq.s32','vqrshrunne.s32','vqrshruncs.s32','vqrshrunhs.s32','vqrshruncc.s32','vqrshrunlo.s32','vqrshrunmi.s32','vqrshrunpl.s32','vqrshrunvs.s32','vqrshrunvc.s32','vqrshrunhi.s32','vqrshrunls.s32','vqrshrunge.s32','vqrshrunlt.s32','vqrshrungt.s32','vqrshrunle.s32',
+ 'vqrshruneq.s64','vqrshrunne.s64','vqrshruncs.s64','vqrshrunhs.s64','vqrshruncc.s64','vqrshrunlo.s64','vqrshrunmi.s64','vqrshrunpl.s64','vqrshrunvs.s64','vqrshrunvc.s64','vqrshrunhi.s64','vqrshrunls.s64','vqrshrunge.s64','vqrshrunlt.s64','vqrshrungt.s64','vqrshrunle.s64',
+
+ 'vqshleq.s8','vqshlne.s8','vqshlcs.s8','vqshlhs.s8','vqshlcc.s8','vqshllo.s8','vqshlmi.s8','vqshlpl.s8','vqshlvs.s8','vqshlvc.s8','vqshlhi.s8','vqshlls.s8','vqshlge.s8','vqshllt.s8','vqshlgt.s8','vqshlle.s8',
+ 'vqshleq.s16','vqshlne.s16','vqshlcs.s16','vqshlhs.s16','vqshlcc.s16','vqshllo.s16','vqshlmi.s16','vqshlpl.s16','vqshlvs.s16','vqshlvc.s16','vqshlhi.s16','vqshlls.s16','vqshlge.s16','vqshllt.s16','vqshlgt.s16','vqshlle.s16',
+ 'vqshleq.s32','vqshlne.s32','vqshlcs.s32','vqshlhs.s32','vqshlcc.s32','vqshllo.s32','vqshlmi.s32','vqshlpl.s32','vqshlvs.s32','vqshlvc.s32','vqshlhi.s32','vqshlls.s32','vqshlge.s32','vqshllt.s32','vqshlgt.s32','vqshlle.s32',
+ 'vqshleq.s64','vqshlne.s64','vqshlcs.s64','vqshlhs.s64','vqshlcc.s64','vqshllo.s64','vqshlmi.s64','vqshlpl.s64','vqshlvs.s64','vqshlvc.s64','vqshlhi.s64','vqshlls.s64','vqshlge.s64','vqshllt.s64','vqshlgt.s64','vqshlle.s64',
+
+ 'vqshlueq.s8','vqshlune.s8','vqshlucs.s8','vqshluhs.s8','vqshlucc.s8','vqshlulo.s8','vqshlumi.s8','vqshlupl.s8','vqshluvs.s8','vqshluvc.s8','vqshluhi.s8','vqshluls.s8','vqshluge.s8','vqshlult.s8','vqshlugt.s8','vqshlule.s8',
+ 'vqshlueq.s16','vqshlune.s16','vqshlucs.s16','vqshluhs.s16','vqshlucc.s16','vqshlulo.s16','vqshlumi.s16','vqshlupl.s16','vqshluvs.s16','vqshluvc.s16','vqshluhi.s16','vqshluls.s16','vqshluge.s16','vqshlult.s16','vqshlugt.s16','vqshlule.s16',
+ 'vqshlueq.s32','vqshlune.s32','vqshlucs.s32','vqshluhs.s32','vqshlucc.s32','vqshlulo.s32','vqshlumi.s32','vqshlupl.s32','vqshluvs.s32','vqshluvc.s32','vqshluhi.s32','vqshluls.s32','vqshluge.s32','vqshlult.s32','vqshlugt.s32','vqshlule.s32',
+ 'vqshlueq.s64','vqshlune.s64','vqshlucs.s64','vqshluhs.s64','vqshlucc.s64','vqshlulo.s64','vqshlumi.s64','vqshlupl.s64','vqshluvs.s64','vqshluvc.s64','vqshluhi.s64','vqshluls.s64','vqshluge.s64','vqshlult.s64','vqshlugt.s64','vqshlule.s64',
+
+ 'vqshrneq.s16','vqshrnne.s16','vqshrncs.s16','vqshrnhs.s16','vqshrncc.s16','vqshrnlo.s16','vqshrnmi.s16','vqshrnpl.s16','vqshrnvs.s16','vqshrnvc.s16','vqshrnhi.s16','vqshrnls.s16','vqshrnge.s16','vqshrnlt.s16','vqshrngt.s16','vqshrnle.s16',
+ 'vqshrneq.s32','vqshrnne.s32','vqshrncs.s32','vqshrnhs.s32','vqshrncc.s32','vqshrnlo.s32','vqshrnmi.s32','vqshrnpl.s32','vqshrnvs.s32','vqshrnvc.s32','vqshrnhi.s32','vqshrnls.s32','vqshrnge.s32','vqshrnlt.s32','vqshrngt.s32','vqshrnle.s32',
+ 'vqshrneq.s64','vqshrnne.s64','vqshrncs.s64','vqshrnhs.s64','vqshrncc.s64','vqshrnlo.s64','vqshrnmi.s64','vqshrnpl.s64','vqshrnvs.s64','vqshrnvc.s64','vqshrnhi.s64','vqshrnls.s64','vqshrnge.s64','vqshrnlt.s64','vqshrngt.s64','vqshrnle.s64',
+
+ 'vqshruneq.s16','vqshrunne.s16','vqshruncs.s16','vqshrunhs.s16','vqshruncc.s16','vqshrunlo.s16','vqshrunmi.s16','vqshrunpl.s16','vqshrunvs.s16','vqshrunvc.s16','vqshrunhi.s16','vqshrunls.s16','vqshrunge.s16','vqshrunlt.s16','vqshrungt.s16','vqshrunle.s16',
+ 'vqshruneq.s32','vqshrunne.s32','vqshruncs.s32','vqshrunhs.s32','vqshruncc.s32','vqshrunlo.s32','vqshrunmi.s32','vqshrunpl.s32','vqshrunvs.s32','vqshrunvc.s32','vqshrunhi.s32','vqshrunls.s32','vqshrunge.s32','vqshrunlt.s32','vqshrungt.s32','vqshrunle.s32',
+ 'vqshruneq.s64','vqshrunne.s64','vqshruncs.s64','vqshrunhs.s64','vqshruncc.s64','vqshrunlo.s64','vqshrunmi.s64','vqshrunpl.s64','vqshrunvs.s64','vqshrunvc.s64','vqshrunhi.s64','vqshrunls.s64','vqshrunge.s64','vqshrunlt.s64','vqshrungt.s64','vqshrunle.s64',
+
+ 'vqsubeq.s8','vqsubne.s8','vqsubcs.s8','vqsubhs.s8','vqsubcc.s8','vqsublo.s8','vqsubmi.s8','vqsubpl.s8','vqsubvs.s8','vqsubvc.s8','vqsubhi.s8','vqsubls.s8','vqsubge.s8','vqsublt.s8','vqsubgt.s8','vqsuble.s8',
+ 'vqsubeq.s16','vqsubne.s16','vqsubcs.s16','vqsubhs.s16','vqsubcc.s16','vqsublo.s16','vqsubmi.s16','vqsubpl.s16','vqsubvs.s16','vqsubvc.s16','vqsubhi.s16','vqsubls.s16','vqsubge.s16','vqsublt.s16','vqsubgt.s16','vqsuble.s16',
+ 'vqsubeq.s32','vqsubne.s32','vqsubcs.s32','vqsubhs.s32','vqsubcc.s32','vqsublo.s32','vqsubmi.s32','vqsubpl.s32','vqsubvs.s32','vqsubvc.s32','vqsubhi.s32','vqsubls.s32','vqsubge.s32','vqsublt.s32','vqsubgt.s32','vqsuble.s32',
+ 'vqsubeq.s64','vqsubne.s64','vqsubcs.s64','vqsubhs.s64','vqsubcc.s64','vqsublo.s64','vqsubmi.s64','vqsubpl.s64','vqsubvs.s64','vqsubvc.s64','vqsubhi.s64','vqsubls.s64','vqsubge.s64','vqsublt.s64','vqsubgt.s64','vqsuble.s64',
+
+ 'vrhaddeq.s8','vrhaddne.s8','vrhaddcs.s8','vrhaddhs.s8','vrhaddcc.s8','vrhaddlo.s8','vrhaddmi.s8','vrhaddpl.s8','vrhaddvs.s8','vrhaddvc.s8','vrhaddhi.s8','vrhaddls.s8','vrhaddge.s8','vrhaddlt.s8','vrhaddgt.s8','vrhaddle.s8',
+ 'vrhaddeq.s16','vrhaddne.s16','vrhaddcs.s16','vrhaddhs.s16','vrhaddcc.s16','vrhaddlo.s16','vrhaddmi.s16','vrhaddpl.s16','vrhaddvs.s16','vrhaddvc.s16','vrhaddhi.s16','vrhaddls.s16','vrhaddge.s16','vrhaddlt.s16','vrhaddgt.s16','vrhaddle.s16',
+ 'vrhaddeq.s32','vrhaddne.s32','vrhaddcs.s32','vrhaddhs.s32','vrhaddcc.s32','vrhaddlo.s32','vrhaddmi.s32','vrhaddpl.s32','vrhaddvs.s32','vrhaddvc.s32','vrhaddhi.s32','vrhaddls.s32','vrhaddge.s32','vrhaddlt.s32','vrhaddgt.s32','vrhaddle.s32',
+
+ 'vrshleq.s8','vrshlne.s8','vrshlcs.s8','vrshlhs.s8','vrshlcc.s8','vrshllo.s8','vrshlmi.s8','vrshlpl.s8','vrshlvs.s8','vrshlvc.s8','vrshlhi.s8','vrshlls.s8','vrshlge.s8','vrshllt.s8','vrshlgt.s8','vrshlle.s8',
+ 'vrshleq.s16','vrshlne.s16','vrshlcs.s16','vrshlhs.s16','vrshlcc.s16','vrshllo.s16','vrshlmi.s16','vrshlpl.s16','vrshlvs.s16','vrshlvc.s16','vrshlhi.s16','vrshlls.s16','vrshlge.s16','vrshllt.s16','vrshlgt.s16','vrshlle.s16',
+ 'vrshleq.s32','vrshlne.s32','vrshlcs.s32','vrshlhs.s32','vrshlcc.s32','vrshllo.s32','vrshlmi.s32','vrshlpl.s32','vrshlvs.s32','vrshlvc.s32','vrshlhi.s32','vrshlls.s32','vrshlge.s32','vrshllt.s32','vrshlgt.s32','vrshlle.s32',
+ 'vrshleq.s64','vrshlne.s64','vrshlcs.s64','vrshlhs.s64','vrshlcc.s64','vrshllo.s64','vrshlmi.s64','vrshlpl.s64','vrshlvs.s64','vrshlvc.s64','vrshlhi.s64','vrshlls.s64','vrshlge.s64','vrshllt.s64','vrshlgt.s64','vrshlle.s64',
+
+ 'vrshreq.s8','vrshrne.s8','vrshrcs.s8','vrshrhs.s8','vrshrcc.s8','vrshrlo.s8','vrshrmi.s8','vrshrpl.s8','vrshrvs.s8','vrshrvc.s8','vrshrhi.s8','vrshrls.s8','vrshrge.s8','vrshrlt.s8','vrshrgt.s8','vrshrle.s8',
+ 'vrshreq.s16','vrshrne.s16','vrshrcs.s16','vrshrhs.s16','vrshrcc.s16','vrshrlo.s16','vrshrmi.s16','vrshrpl.s16','vrshrvs.s16','vrshrvc.s16','vrshrhi.s16','vrshrls.s16','vrshrge.s16','vrshrlt.s16','vrshrgt.s16','vrshrle.s16',
+ 'vrshreq.s32','vrshrne.s32','vrshrcs.s32','vrshrhs.s32','vrshrcc.s32','vrshrlo.s32','vrshrmi.s32','vrshrpl.s32','vrshrvs.s32','vrshrvc.s32','vrshrhi.s32','vrshrls.s32','vrshrge.s32','vrshrlt.s32','vrshrgt.s32','vrshrle.s32',
+ 'vrshreq.s64','vrshrne.s64','vrshrcs.s64','vrshrhs.s64','vrshrcc.s64','vrshrlo.s64','vrshrmi.s64','vrshrpl.s64','vrshrvs.s64','vrshrvc.s64','vrshrhi.s64','vrshrls.s64','vrshrge.s64','vrshrlt.s64','vrshrgt.s64','vrshrle.s64',
+
+ 'vrsraeq.s8','vrsrane.s8','vrsracs.s8','vrsrahs.s8','vrsracc.s8','vrsralo.s8','vrsrami.s8','vrsrapl.s8','vrsravs.s8','vrsravc.s8','vrsrahi.s8','vrsrals.s8','vrsrage.s8','vrsralt.s8','vrsragt.s8','vrsrale.s8',
+ 'vrsraeq.s16','vrsrane.s16','vrsracs.s16','vrsrahs.s16','vrsracc.s16','vrsralo.s16','vrsrami.s16','vrsrapl.s16','vrsravs.s16','vrsravc.s16','vrsrahi.s16','vrsrals.s16','vrsrage.s16','vrsralt.s16','vrsragt.s16','vrsrale.s16',
+ 'vrsraeq.s32','vrsrane.s32','vrsracs.s32','vrsrahs.s32','vrsracc.s32','vrsralo.s32','vrsrami.s32','vrsrapl.s32','vrsravs.s32','vrsravc.s32','vrsrahi.s32','vrsrals.s32','vrsrage.s32','vrsralt.s32','vrsragt.s32','vrsrale.s32',
+ 'vrsraeq.s64','vrsrane.s64','vrsracs.s64','vrsrahs.s64','vrsracc.s64','vrsralo.s64','vrsrami.s64','vrsrapl.s64','vrsravs.s64','vrsravc.s64','vrsrahi.s64','vrsrals.s64','vrsrage.s64','vrsralt.s64','vrsragt.s64','vrsrale.s64',
+
+ 'vshleq.s8','vshlne.s8','vshlcs.s8','vshlhs.s8','vshlcc.s8','vshllo.s8','vshlmi.s8','vshlpl.s8','vshlvs.s8','vshlvc.s8','vshlhi.s8','vshlls.s8','vshlge.s8','vshllt.s8','vshlgt.s8','vshlle.s8',
+ 'vshleq.s16','vshlne.s16','vshlcs.s16','vshlhs.s16','vshlcc.s16','vshllo.s16','vshlmi.s16','vshlpl.s16','vshlvs.s16','vshlvc.s16','vshlhi.s16','vshlls.s16','vshlge.s16','vshllt.s16','vshlgt.s16','vshlle.s16',
+ 'vshleq.s32','vshlne.s32','vshlcs.s32','vshlhs.s32','vshlcc.s32','vshllo.s32','vshlmi.s32','vshlpl.s32','vshlvs.s32','vshlvc.s32','vshlhi.s32','vshlls.s32','vshlge.s32','vshllt.s32','vshlgt.s32','vshlle.s32',
+ 'vshleq.s64','vshlne.s64','vshlcs.s64','vshlhs.s64','vshlcc.s64','vshllo.s64','vshlmi.s64','vshlpl.s64','vshlvs.s64','vshlvc.s64','vshlhi.s64','vshlls.s64','vshlge.s64','vshllt.s64','vshlgt.s64','vshlle.s64',
+
+ 'vshlleq.s8','vshllne.s8','vshllcs.s8','vshllhs.s8','vshllcc.s8','vshlllo.s8','vshllmi.s8','vshllpl.s8','vshllvs.s8','vshllvc.s8','vshllhi.s8','vshllls.s8','vshllge.s8','vshlllt.s8','vshllgt.s8','vshllle.s8',
+ 'vshlleq.s16','vshllne.s16','vshllcs.s16','vshllhs.s16','vshllcc.s16','vshlllo.s16','vshllmi.s16','vshllpl.s16','vshllvs.s16','vshllvc.s16','vshllhi.s16','vshllls.s16','vshllge.s16','vshlllt.s16','vshllgt.s16','vshllle.s16',
+ 'vshlleq.s32','vshllne.s32','vshllcs.s32','vshllhs.s32','vshllcc.s32','vshlllo.s32','vshllmi.s32','vshllpl.s32','vshllvs.s32','vshllvc.s32','vshllhi.s32','vshllls.s32','vshllge.s32','vshlllt.s32','vshllgt.s32','vshllle.s32',
+
+ 'vshreq.s8','vshrne.s8','vshrcs.s8','vshrhs.s8','vshrcc.s8','vshrlo.s8','vshrmi.s8','vshrpl.s8','vshrvs.s8','vshrvc.s8','vshrhi.s8','vshrls.s8','vshrge.s8','vshrlt.s8','vshrgt.s8','vshrle.s8',
+ 'vshreq.s16','vshrne.s16','vshrcs.s16','vshrhs.s16','vshrcc.s16','vshrlo.s16','vshrmi.s16','vshrpl.s16','vshrvs.s16','vshrvc.s16','vshrhi.s16','vshrls.s16','vshrge.s16','vshrlt.s16','vshrgt.s16','vshrle.s16',
+ 'vshreq.s32','vshrne.s32','vshrcs.s32','vshrhs.s32','vshrcc.s32','vshrlo.s32','vshrmi.s32','vshrpl.s32','vshrvs.s32','vshrvc.s32','vshrhi.s32','vshrls.s32','vshrge.s32','vshrlt.s32','vshrgt.s32','vshrle.s32',
+ 'vshreq.s64','vshrne.s64','vshrcs.s64','vshrhs.s64','vshrcc.s64','vshrlo.s64','vshrmi.s64','vshrpl.s64','vshrvs.s64','vshrvc.s64','vshrhi.s64','vshrls.s64','vshrge.s64','vshrlt.s64','vshrgt.s64','vshrle.s64',
+
+ 'vsraeq.s8','vsrane.s8','vsracs.s8','vsrahs.s8','vsracc.s8','vsralo.s8','vsrami.s8','vsrapl.s8','vsravs.s8','vsravc.s8','vsrahi.s8','vsrals.s8','vsrage.s8','vsralt.s8','vsragt.s8','vsrale.s8',
+ 'vsraeq.s16','vsrane.s16','vsracs.s16','vsrahs.s16','vsracc.s16','vsralo.s16','vsrami.s16','vsrapl.s16','vsravs.s16','vsravc.s16','vsrahi.s16','vsrals.s16','vsrage.s16','vsralt.s16','vsragt.s16','vsrale.s16',
+ 'vsraeq.s32','vsrane.s32','vsracs.s32','vsrahs.s32','vsracc.s32','vsralo.s32','vsrami.s32','vsrapl.s32','vsravs.s32','vsravc.s32','vsrahi.s32','vsrals.s32','vsrage.s32','vsralt.s32','vsragt.s32','vsrale.s32',
+ 'vsraeq.s64','vsrane.s64','vsracs.s64','vsrahs.s64','vsracc.s64','vsralo.s64','vsrami.s64','vsrapl.s64','vsravs.s64','vsravc.s64','vsrahi.s64','vsrals.s64','vsrage.s64','vsralt.s64','vsragt.s64','vsrale.s64',
+
+ 'vsubleq.s8','vsublne.s8','vsublcs.s8','vsublhs.s8','vsublcc.s8','vsubllo.s8','vsublmi.s8','vsublpl.s8','vsublvs.s8','vsublvc.s8','vsublhi.s8','vsublls.s8','vsublge.s8','vsubllt.s8','vsublgt.s8','vsublle.s8',
+ 'vsubleq.s16','vsublne.s16','vsublcs.s16','vsublhs.s16','vsublcc.s16','vsubllo.s16','vsublmi.s16','vsublpl.s16','vsublvs.s16','vsublvc.s16','vsublhi.s16','vsublls.s16','vsublge.s16','vsubllt.s16','vsublgt.s16','vsublle.s16',
+ 'vsubleq.s32','vsublne.s32','vsublcs.s32','vsublhs.s32','vsublcc.s32','vsubllo.s32','vsublmi.s32','vsublpl.s32','vsublvs.s32','vsublvc.s32','vsublhi.s32','vsublls.s32','vsublge.s32','vsubllt.s32','vsublgt.s32','vsublle.s32',
+
+ 'vsubheq.s8','vsubhne.s8','vsubhcs.s8','vsubhhs.s8','vsubhcc.s8','vsubhlo.s8','vsubhmi.s8','vsubhpl.s8','vsubhvs.s8','vsubhvc.s8','vsubhhi.s8','vsubhls.s8','vsubhge.s8','vsubhlt.s8','vsubhgt.s8','vsubhle.s8',
+ 'vsubheq.s16','vsubhne.s16','vsubhcs.s16','vsubhhs.s16','vsubhcc.s16','vsubhlo.s16','vsubhmi.s16','vsubhpl.s16','vsubhvs.s16','vsubhvc.s16','vsubhhi.s16','vsubhls.s16','vsubhge.s16','vsubhlt.s16','vsubhgt.s16','vsubhle.s16',
+ 'vsubheq.s32','vsubhne.s32','vsubhcs.s32','vsubhhs.s32','vsubhcc.s32','vsubhlo.s32','vsubhmi.s32','vsubhpl.s32','vsubhvs.s32','vsubhvc.s32','vsubhhi.s32','vsubhls.s32','vsubhge.s32','vsubhlt.s32','vsubhgt.s32','vsubhle.s32'
+ ),
+ /* Conditional NEON SIMD Unsigned Integer Instructions */
+ 33 => array(
+ 'vabaeq.u8','vabane.u8','vabacs.u8','vabahs.u8','vabacc.u8','vabalo.u8','vabami.u8','vabapl.u8','vabavs.u8','vabavc.u8','vabahi.u8','vabals.u8','vabage.u8','vabalt.u8','vabagt.u8','vabale.u8',
+ 'vabaeq.u16','vabane.u16','vabacs.u16','vabahs.u16','vabacc.u16','vabalo.u16','vabami.u16','vabapl.u16','vabavs.u16','vabavc.u16','vabahi.u16','vabals.u16','vabage.u16','vabalt.u16','vabagt.u16','vabale.u16',
+ 'vabaeq.u32','vabane.u32','vabacs.u32','vabahs.u32','vabacc.u32','vabalo.u32','vabami.u32','vabapl.u32','vabavs.u32','vabavc.u32','vabahi.u32','vabals.u32','vabage.u32','vabalt.u32','vabagt.u32','vabale.u32',
+
+ 'vabaleq.u8','vabalne.u8','vabalcs.u8','vabalhs.u8','vabalcc.u8','vaballo.u8','vabalmi.u8','vabalpl.u8','vabalvs.u8','vabalvc.u8','vabalhi.u8','vaballs.u8','vabalge.u8','vaballt.u8','vabalgt.u8','vaballe.u8',
+ 'vabaleq.u16','vabalne.u16','vabalcs.u16','vabalhs.u16','vabalcc.u16','vaballo.u16','vabalmi.u16','vabalpl.u16','vabalvs.u16','vabalvc.u16','vabalhi.u16','vaballs.u16','vabalge.u16','vaballt.u16','vabalgt.u16','vaballe.u16',
+ 'vabaleq.u32','vabalne.u32','vabalcs.u32','vabalhs.u32','vabalcc.u32','vaballo.u32','vabalmi.u32','vabalpl.u32','vabalvs.u32','vabalvc.u32','vabalhi.u32','vaballs.u32','vabalge.u32','vaballt.u32','vabalgt.u32','vaballe.u32',
+
+ 'vabdeq.u8','vabdne.u8','vabdcs.u8','vabdhs.u8','vabdcc.u8','vabdlo.u8','vabdmi.u8','vabdpl.u8','vabdvs.u8','vabdvc.u8','vabdhi.u8','vabdls.u8','vabdge.u8','vabdlt.u8','vabdgt.u8','vabdle.u8',
+ 'vabdeq.u16','vabdne.u16','vabdcs.u16','vabdhs.u16','vabdcc.u16','vabdlo.u16','vabdmi.u16','vabdpl.u16','vabdvs.u16','vabdvc.u16','vabdhi.u16','vabdls.u16','vabdge.u16','vabdlt.u16','vabdgt.u16','vabdle.u16',
+ 'vabdeq.u32','vabdne.u32','vabdcs.u32','vabdhs.u32','vabdcc.u32','vabdlo.u32','vabdmi.u32','vabdpl.u32','vabdvs.u32','vabdvc.u32','vabdhi.u32','vabdls.u32','vabdge.u32','vabdlt.u32','vabdgt.u32','vabdle.u32',
+
+ 'vaddleq.u8','vaddlne.u8','vaddlcs.u8','vaddlhs.u8','vaddlcc.u8','vaddllo.u8','vaddlmi.u8','vaddlpl.u8','vaddlvs.u8','vaddlvc.u8','vaddlhi.u8','vaddlls.u8','vaddlge.u8','vaddllt.u8','vaddlgt.u8','vaddlle.u8',
+ 'vaddleq.u16','vaddlne.u16','vaddlcs.u16','vaddlhs.u16','vaddlcc.u16','vaddllo.u16','vaddlmi.u16','vaddlpl.u16','vaddlvs.u16','vaddlvc.u16','vaddlhi.u16','vaddlls.u16','vaddlge.u16','vaddllt.u16','vaddlgt.u16','vaddlle.u16',
+ 'vaddleq.u32','vaddlne.u32','vaddlcs.u32','vaddlhs.u32','vaddlcc.u32','vaddllo.u32','vaddlmi.u32','vaddlpl.u32','vaddlvs.u32','vaddlvc.u32','vaddlhi.u32','vaddlls.u32','vaddlge.u32','vaddllt.u32','vaddlgt.u32','vaddlle.u32',
+
+ 'vsubleq.u8','vsublne.u8','vsublcs.u8','vsublhs.u8','vsublcc.u8','vsubllo.u8','vsublmi.u8','vsublpl.u8','vsublvs.u8','vsublvc.u8','vsublhi.u8','vsublls.u8','vsublge.u8','vsubllt.u8','vsublgt.u8','vsublle.u8',
+ 'vsubleq.u16','vsublne.u16','vsublcs.u16','vsublhs.u16','vsublcc.u16','vsubllo.u16','vsublmi.u16','vsublpl.u16','vsublvs.u16','vsublvc.u16','vsublhi.u16','vsublls.u16','vsublge.u16','vsubllt.u16','vsublgt.u16','vsublle.u16',
+ 'vsubleq.u32','vsublne.u32','vsublcs.u32','vsublhs.u32','vsublcc.u32','vsubllo.u32','vsublmi.u32','vsublpl.u32','vsublvs.u32','vsublvc.u32','vsublhi.u32','vsublls.u32','vsublge.u32','vsubllt.u32','vsublgt.u32','vsublle.u32',
+
+ 'vaddweq.u8','vaddwne.u8','vaddwcs.u8','vaddwhs.u8','vaddwcc.u8','vaddwlo.u8','vaddwmi.u8','vaddwpl.u8','vaddwvs.u8','vaddwvc.u8','vaddwhi.u8','vaddwls.u8','vaddwge.u8','vaddwlt.u8','vaddwgt.u8','vaddwle.u8',
+ 'vaddweq.u16','vaddwne.u16','vaddwcs.u16','vaddwhs.u16','vaddwcc.u16','vaddwlo.u16','vaddwmi.u16','vaddwpl.u16','vaddwvs.u16','vaddwvc.u16','vaddwhi.u16','vaddwls.u16','vaddwge.u16','vaddwlt.u16','vaddwgt.u16','vaddwle.u16',
+ 'vaddweq.u32','vaddwne.u32','vaddwcs.u32','vaddwhs.u32','vaddwcc.u32','vaddwlo.u32','vaddwmi.u32','vaddwpl.u32','vaddwvs.u32','vaddwvc.u32','vaddwhi.u32','vaddwls.u32','vaddwge.u32','vaddwlt.u32','vaddwgt.u32','vaddwle.u32',
+
+ 'vsubheq.u8','vsubhne.u8','vsubhcs.u8','vsubhhs.u8','vsubhcc.u8','vsubhlo.u8','vsubhmi.u8','vsubhpl.u8','vsubhvs.u8','vsubhvc.u8','vsubhhi.u8','vsubhls.u8','vsubhge.u8','vsubhlt.u8','vsubhgt.u8','vsubhle.u8',
+ 'vsubheq.u16','vsubhne.u16','vsubhcs.u16','vsubhhs.u16','vsubhcc.u16','vsubhlo.u16','vsubhmi.u16','vsubhpl.u16','vsubhvs.u16','vsubhvc.u16','vsubhhi.u16','vsubhls.u16','vsubhge.u16','vsubhlt.u16','vsubhgt.u16','vsubhle.u16',
+ 'vsubheq.u32','vsubhne.u32','vsubhcs.u32','vsubhhs.u32','vsubhcc.u32','vsubhlo.u32','vsubhmi.u32','vsubhpl.u32','vsubhvs.u32','vsubhvc.u32','vsubhhi.u32','vsubhls.u32','vsubhge.u32','vsubhlt.u32','vsubhgt.u32','vsubhle.u32',
+
+ 'vhaddeq.u8','vhaddne.u8','vhaddcs.u8','vhaddhs.u8','vhaddcc.u8','vhaddlo.u8','vhaddmi.u8','vhaddpl.u8','vhaddvs.u8','vhaddvc.u8','vhaddhi.u8','vhaddls.u8','vhaddge.u8','vhaddlt.u8','vhaddgt.u8','vhaddle.u8',
+ 'vhaddeq.u16','vhaddne.u16','vhaddcs.u16','vhaddhs.u16','vhaddcc.u16','vhaddlo.u16','vhaddmi.u16','vhaddpl.u16','vhaddvs.u16','vhaddvc.u16','vhaddhi.u16','vhaddls.u16','vhaddge.u16','vhaddlt.u16','vhaddgt.u16','vhaddle.u16',
+ 'vhaddeq.u32','vhaddne.u32','vhaddcs.u32','vhaddhs.u32','vhaddcc.u32','vhaddlo.u32','vhaddmi.u32','vhaddpl.u32','vhaddvs.u32','vhaddvc.u32','vhaddhi.u32','vhaddls.u32','vhaddge.u32','vhaddlt.u32','vhaddgt.u32','vhaddle.u32',
+
+ 'vhsubeq.u8','vhsubne.u8','vhsubcs.u8','vhsubhs.u8','vhsubcc.u8','vhsublo.u8','vhsubmi.u8','vhsubpl.u8','vhsubvs.u8','vhsubvc.u8','vhsubhi.u8','vhsubls.u8','vhsubge.u8','vhsublt.u8','vhsubgt.u8','vhsuble.u8',
+ 'vhsubeq.u16','vhsubne.u16','vhsubcs.u16','vhsubhs.u16','vhsubcc.u16','vhsublo.u16','vhsubmi.u16','vhsubpl.u16','vhsubvs.u16','vhsubvc.u16','vhsubhi.u16','vhsubls.u16','vhsubge.u16','vhsublt.u16','vhsubgt.u16','vhsuble.u16',
+ 'vhsubeq.u32','vhsubne.u32','vhsubcs.u32','vhsubhs.u32','vhsubcc.u32','vhsublo.u32','vhsubmi.u32','vhsubpl.u32','vhsubvs.u32','vhsubvc.u32','vhsubhi.u32','vhsubls.u32','vhsubge.u32','vhsublt.u32','vhsubgt.u32','vhsuble.u32',
+
+ 'vpadaleq.u8','vpadalne.u8','vpadalcs.u8','vpadalhs.u8','vpadalcc.u8','vpadallo.u8','vpadalmi.u8','vpadalpl.u8','vpadalvs.u8','vpadalvc.u8','vpadalhi.u8','vpadalls.u8','vpadalge.u8','vpadallt.u8','vpadalgt.u8','vpadalle.u8',
+ 'vpadaleq.u16','vpadalne.u16','vpadalcs.u16','vpadalhs.u16','vpadalcc.u16','vpadallo.u16','vpadalmi.u16','vpadalpl.u16','vpadalvs.u16','vpadalvc.u16','vpadalhi.u16','vpadalls.u16','vpadalge.u16','vpadallt.u16','vpadalgt.u16','vpadalle.u16',
+ 'vpadaleq.u32','vpadalne.u32','vpadalcs.u32','vpadalhs.u32','vpadalcc.u32','vpadallo.u32','vpadalmi.u32','vpadalpl.u32','vpadalvs.u32','vpadalvc.u32','vpadalhi.u32','vpadalls.u32','vpadalge.u32','vpadallt.u32','vpadalgt.u32','vpadalle.u32',
+
+ 'vpaddleq.u8','vpaddlne.u8','vpaddlcs.u8','vpaddlhs.u8','vpaddlcc.u8','vpaddllo.u8','vpaddlmi.u8','vpaddlpl.u8','vpaddlvs.u8','vpaddlvc.u8','vpaddlhi.u8','vpaddlls.u8','vpaddlge.u8','vpaddllt.u8','vpaddlgt.u8','vpaddlle.u8',
+ 'vpaddleq.u16','vpaddlne.u16','vpaddlcs.u16','vpaddlhs.u16','vpaddlcc.u16','vpaddllo.u16','vpaddlmi.u16','vpaddlpl.u16','vpaddlvs.u16','vpaddlvc.u16','vpaddlhi.u16','vpaddlls.u16','vpaddlge.u16','vpaddllt.u16','vpaddlgt.u16','vpaddlle.u16',
+ 'vpaddleq.u32','vpaddlne.u32','vpaddlcs.u32','vpaddlhs.u32','vpaddlcc.u32','vpaddllo.u32','vpaddlmi.u32','vpaddlpl.u32','vpaddlvs.u32','vpaddlvc.u32','vpaddlhi.u32','vpaddlls.u32','vpaddlge.u32','vpaddllt.u32','vpaddlgt.u32','vpaddlle.u32',
+
+ 'vcgeeq.u8','vcgene.u8','vcgecs.u8','vcgehs.u8','vcgecc.u8','vcgelo.u8','vcgemi.u8','vcgepl.u8','vcgevs.u8','vcgevc.u8','vcgehi.u8','vcgels.u8','vcgege.u8','vcgelt.u8','vcgegt.u8','vcgele.u8',
+ 'vcgeeq.u16','vcgene.u16','vcgecs.u16','vcgehs.u16','vcgecc.u16','vcgelo.u16','vcgemi.u16','vcgepl.u16','vcgevs.u16','vcgevc.u16','vcgehi.u16','vcgels.u16','vcgege.u16','vcgelt.u16','vcgegt.u16','vcgele.u16',
+ 'vcgeeq.u32','vcgene.u32','vcgecs.u32','vcgehs.u32','vcgecc.u32','vcgelo.u32','vcgemi.u32','vcgepl.u32','vcgevs.u32','vcgevc.u32','vcgehi.u32','vcgels.u32','vcgege.u32','vcgelt.u32','vcgegt.u32','vcgele.u32',
+
+ 'vcleeq.u8','vclene.u8','vclecs.u8','vclehs.u8','vclecc.u8','vclelo.u8','vclemi.u8','vclepl.u8','vclevs.u8','vclevc.u8','vclehi.u8','vclels.u8','vclege.u8','vclelt.u8','vclegt.u8','vclele.u8',
+ 'vcleeq.u16','vclene.u16','vclecs.u16','vclehs.u16','vclecc.u16','vclelo.u16','vclemi.u16','vclepl.u16','vclevs.u16','vclevc.u16','vclehi.u16','vclels.u16','vclege.u16','vclelt.u16','vclegt.u16','vclele.u16',
+ 'vcleeq.u32','vclene.u32','vclecs.u32','vclehs.u32','vclecc.u32','vclelo.u32','vclemi.u32','vclepl.u32','vclevs.u32','vclevc.u32','vclehi.u32','vclels.u32','vclege.u32','vclelt.u32','vclegt.u32','vclele.u32',
+
+ 'vcgteq.u8','vcgtne.u8','vcgtcs.u8','vcgths.u8','vcgtcc.u8','vcgtlo.u8','vcgtmi.u8','vcgtpl.u8','vcgtvs.u8','vcgtvc.u8','vcgthi.u8','vcgtls.u8','vcgtge.u8','vcgtlt.u8','vcgtgt.u8','vcgtle.u8',
+ 'vcgteq.u16','vcgtne.u16','vcgtcs.u16','vcgths.u16','vcgtcc.u16','vcgtlo.u16','vcgtmi.u16','vcgtpl.u16','vcgtvs.u16','vcgtvc.u16','vcgthi.u16','vcgtls.u16','vcgtge.u16','vcgtlt.u16','vcgtgt.u16','vcgtle.u16',
+ 'vcgteq.u32','vcgtne.u32','vcgtcs.u32','vcgths.u32','vcgtcc.u32','vcgtlo.u32','vcgtmi.u32','vcgtpl.u32','vcgtvs.u32','vcgtvc.u32','vcgthi.u32','vcgtls.u32','vcgtge.u32','vcgtlt.u32','vcgtgt.u32','vcgtle.u32',
+
+ 'vclteq.u8','vcltne.u8','vcltcs.u8','vclths.u8','vcltcc.u8','vcltlo.u8','vcltmi.u8','vcltpl.u8','vcltvs.u8','vcltvc.u8','vclthi.u8','vcltls.u8','vcltge.u8','vcltlt.u8','vcltgt.u8','vcltle.u8',
+ 'vclteq.u16','vcltne.u16','vcltcs.u16','vclths.u16','vcltcc.u16','vcltlo.u16','vcltmi.u16','vcltpl.u16','vcltvs.u16','vcltvc.u16','vclthi.u16','vcltls.u16','vcltge.u16','vcltlt.u16','vcltgt.u16','vcltle.u16',
+ 'vclteq.u32','vcltne.u32','vcltcs.u32','vclths.u32','vcltcc.u32','vcltlo.u32','vcltmi.u32','vcltpl.u32','vcltvs.u32','vcltvc.u32','vclthi.u32','vcltls.u32','vcltge.u32','vcltlt.u32','vcltgt.u32','vcltle.u32',
+
+ 'vmaxeq.u8','vmaxne.u8','vmaxcs.u8','vmaxhs.u8','vmaxcc.u8','vmaxlo.u8','vmaxmi.u8','vmaxpl.u8','vmaxvs.u8','vmaxvc.u8','vmaxhi.u8','vmaxls.u8','vmaxge.u8','vmaxlt.u8','vmaxgt.u8','vmaxle.u8',
+ 'vmaxeq.u16','vmaxne.u16','vmaxcs.u16','vmaxhs.u16','vmaxcc.u16','vmaxlo.u16','vmaxmi.u16','vmaxpl.u16','vmaxvs.u16','vmaxvc.u16','vmaxhi.u16','vmaxls.u16','vmaxge.u16','vmaxlt.u16','vmaxgt.u16','vmaxle.u16',
+ 'vmaxeq.u32','vmaxne.u32','vmaxcs.u32','vmaxhs.u32','vmaxcc.u32','vmaxlo.u32','vmaxmi.u32','vmaxpl.u32','vmaxvs.u32','vmaxvc.u32','vmaxhi.u32','vmaxls.u32','vmaxge.u32','vmaxlt.u32','vmaxgt.u32','vmaxle.u32',
+
+ 'vmineq.u8','vminne.u8','vmincs.u8','vminhs.u8','vmincc.u8','vminlo.u8','vminmi.u8','vminpl.u8','vminvs.u8','vminvc.u8','vminhi.u8','vminls.u8','vminge.u8','vminlt.u8','vmingt.u8','vminle.u8',
+ 'vmineq.u16','vminne.u16','vmincs.u16','vminhs.u16','vmincc.u16','vminlo.u16','vminmi.u16','vminpl.u16','vminvs.u16','vminvc.u16','vminhi.u16','vminls.u16','vminge.u16','vminlt.u16','vmingt.u16','vminle.u16',
+ 'vmineq.u32','vminne.u32','vmincs.u32','vminhs.u32','vmincc.u32','vminlo.u32','vminmi.u32','vminpl.u32','vminvs.u32','vminvc.u32','vminhi.u32','vminls.u32','vminge.u32','vminlt.u32','vmingt.u32','vminle.u32',
+
+ 'vmlaleq.u8','vmlalne.u8','vmlalcs.u8','vmlalhs.u8','vmlalcc.u8','vmlallo.u8','vmlalmi.u8','vmlalpl.u8','vmlalvs.u8','vmlalvc.u8','vmlalhi.u8','vmlalls.u8','vmlalge.u8','vmlallt.u8','vmlalgt.u8','vmlalle.u8',
+ 'vmlaleq.u16','vmlalne.u16','vmlalcs.u16','vmlalhs.u16','vmlalcc.u16','vmlallo.u16','vmlalmi.u16','vmlalpl.u16','vmlalvs.u16','vmlalvc.u16','vmlalhi.u16','vmlalls.u16','vmlalge.u16','vmlallt.u16','vmlalgt.u16','vmlalle.u16',
+ 'vmlaleq.u32','vmlalne.u32','vmlalcs.u32','vmlalhs.u32','vmlalcc.u32','vmlallo.u32','vmlalmi.u32','vmlalpl.u32','vmlalvs.u32','vmlalvc.u32','vmlalhi.u32','vmlalls.u32','vmlalge.u32','vmlallt.u32','vmlalgt.u32','vmlalle.u32',
+
+ 'vmlsleq.u8','vmlslne.u8','vmlslcs.u8','vmlslhs.u8','vmlslcc.u8','vmlsllo.u8','vmlslmi.u8','vmlslpl.u8','vmlslvs.u8','vmlslvc.u8','vmlslhi.u8','vmlslls.u8','vmlslge.u8','vmlsllt.u8','vmlslgt.u8','vmlslle.u8',
+ 'vmlsleq.u16','vmlslne.u16','vmlslcs.u16','vmlslhs.u16','vmlslcc.u16','vmlsllo.u16','vmlslmi.u16','vmlslpl.u16','vmlslvs.u16','vmlslvc.u16','vmlslhi.u16','vmlslls.u16','vmlslge.u16','vmlsllt.u16','vmlslgt.u16','vmlslle.u16',
+ 'vmlsleq.u32','vmlslne.u32','vmlslcs.u32','vmlslhs.u32','vmlslcc.u32','vmlsllo.u32','vmlslmi.u32','vmlslpl.u32','vmlslvs.u32','vmlslvc.u32','vmlslhi.u32','vmlslls.u32','vmlslge.u32','vmlsllt.u32','vmlslgt.u32','vmlslle.u32',
+
+ 'vmulleq.u8','vmullne.u8','vmullcs.u8','vmullhs.u8','vmullcc.u8','vmulllo.u8','vmullmi.u8','vmullpl.u8','vmullvs.u8','vmullvc.u8','vmullhi.u8','vmullls.u8','vmullge.u8','vmulllt.u8','vmullgt.u8','vmullle.u8',
+ 'vmulleq.u16','vmullne.u16','vmullcs.u16','vmullhs.u16','vmullcc.u16','vmulllo.u16','vmullmi.u16','vmullpl.u16','vmullvs.u16','vmullvc.u16','vmullhi.u16','vmullls.u16','vmullge.u16','vmulllt.u16','vmullgt.u16','vmullle.u16',
+ 'vmulleq.u32','vmullne.u32','vmullcs.u32','vmullhs.u32','vmullcc.u32','vmulllo.u32','vmullmi.u32','vmullpl.u32','vmullvs.u32','vmullvc.u32','vmullhi.u32','vmullls.u32','vmullge.u32','vmulllt.u32','vmullgt.u32','vmullle.u32',
+
+ 'vmovleq.u8','vmovlne.u8','vmovlcs.u8','vmovlhs.u8','vmovlcc.u8','vmovllo.u8','vmovlmi.u8','vmovlpl.u8','vmovlvs.u8','vmovlvc.u8','vmovlhi.u8','vmovlls.u8','vmovlge.u8','vmovllt.u8','vmovlgt.u8','vmovlle.u8',
+ 'vmovleq.u16','vmovlne.u16','vmovlcs.u16','vmovlhs.u16','vmovlcc.u16','vmovllo.u16','vmovlmi.u16','vmovlpl.u16','vmovlvs.u16','vmovlvc.u16','vmovlhi.u16','vmovlls.u16','vmovlge.u16','vmovllt.u16','vmovlgt.u16','vmovlle.u16',
+ 'vmovleq.u32','vmovlne.u32','vmovlcs.u32','vmovlhs.u32','vmovlcc.u32','vmovllo.u32','vmovlmi.u32','vmovlpl.u32','vmovlvs.u32','vmovlvc.u32','vmovlhi.u32','vmovlls.u32','vmovlge.u32','vmovllt.u32','vmovlgt.u32','vmovlle.u32',
+
+ 'vshleq.u8','vshlne.u8','vshlcs.u8','vshlhs.u8','vshlcc.u8','vshllo.u8','vshlmi.u8','vshlpl.u8','vshlvs.u8','vshlvc.u8','vshlhi.u8','vshlls.u8','vshlge.u8','vshllt.u8','vshlgt.u8','vshlle.u8',
+ 'vshleq.u16','vshlne.u16','vshlcs.u16','vshlhs.u16','vshlcc.u16','vshllo.u16','vshlmi.u16','vshlpl.u16','vshlvs.u16','vshlvc.u16','vshlhi.u16','vshlls.u16','vshlge.u16','vshllt.u16','vshlgt.u16','vshlle.u16',
+ 'vshleq.u32','vshlne.u32','vshlcs.u32','vshlhs.u32','vshlcc.u32','vshllo.u32','vshlmi.u32','vshlpl.u32','vshlvs.u32','vshlvc.u32','vshlhi.u32','vshlls.u32','vshlge.u32','vshllt.u32','vshlgt.u32','vshlle.u32',
+ 'vshleq.u64','vshlne.u64','vshlcs.u64','vshlhs.u64','vshlcc.u64','vshllo.u64','vshlmi.u64','vshlpl.u64','vshlvs.u64','vshlvc.u64','vshlhi.u64','vshlls.u64','vshlge.u64','vshllt.u64','vshlgt.u64','vshlle.u64',
+
+ 'vshlleq.u8','vshllne.u8','vshllcs.u8','vshllhs.u8','vshllcc.u8','vshlllo.u8','vshllmi.u8','vshllpl.u8','vshllvs.u8','vshllvc.u8','vshllhi.u8','vshllls.u8','vshllge.u8','vshlllt.u8','vshllgt.u8','vshllle.u8',
+ 'vshlleq.u16','vshllne.u16','vshllcs.u16','vshllhs.u16','vshllcc.u16','vshlllo.u16','vshllmi.u16','vshllpl.u16','vshllvs.u16','vshllvc.u16','vshllhi.u16','vshllls.u16','vshllge.u16','vshlllt.u16','vshllgt.u16','vshllle.u16',
+ 'vshlleq.u32','vshllne.u32','vshllcs.u32','vshllhs.u32','vshllcc.u32','vshlllo.u32','vshllmi.u32','vshllpl.u32','vshllvs.u32','vshllvc.u32','vshllhi.u32','vshllls.u32','vshllge.u32','vshlllt.u32','vshllgt.u32','vshllle.u32',
+
+ 'vshreq.u8','vshrne.u8','vshrcs.u8','vshrhs.u8','vshrcc.u8','vshrlo.u8','vshrmi.u8','vshrpl.u8','vshrvs.u8','vshrvc.u8','vshrhi.u8','vshrls.u8','vshrge.u8','vshrlt.u8','vshrgt.u8','vshrle.u8',
+ 'vshreq.u16','vshrne.u16','vshrcs.u16','vshrhs.u16','vshrcc.u16','vshrlo.u16','vshrmi.u16','vshrpl.u16','vshrvs.u16','vshrvc.u16','vshrhi.u16','vshrls.u16','vshrge.u16','vshrlt.u16','vshrgt.u16','vshrle.u16',
+ 'vshreq.u32','vshrne.u32','vshrcs.u32','vshrhs.u32','vshrcc.u32','vshrlo.u32','vshrmi.u32','vshrpl.u32','vshrvs.u32','vshrvc.u32','vshrhi.u32','vshrls.u32','vshrge.u32','vshrlt.u32','vshrgt.u32','vshrle.u32',
+ 'vshreq.u64','vshrne.u64','vshrcs.u64','vshrhs.u64','vshrcc.u64','vshrlo.u64','vshrmi.u64','vshrpl.u64','vshrvs.u64','vshrvc.u64','vshrhi.u64','vshrls.u64','vshrge.u64','vshrlt.u64','vshrgt.u64','vshrle.u64',
+
+ 'vsraeq.u8','vsrane.u8','vsracs.u8','vsrahs.u8','vsracc.u8','vsralo.u8','vsrami.u8','vsrapl.u8','vsravs.u8','vsravc.u8','vsrahi.u8','vsrals.u8','vsrage.u8','vsralt.u8','vsragt.u8','vsrale.u8',
+ 'vsraeq.u16','vsrane.u16','vsracs.u16','vsrahs.u16','vsracc.u16','vsralo.u16','vsrami.u16','vsrapl.u16','vsravs.u16','vsravc.u16','vsrahi.u16','vsrals.u16','vsrage.u16','vsralt.u16','vsragt.u16','vsrale.u16',
+ 'vsraeq.u32','vsrane.u32','vsracs.u32','vsrahs.u32','vsracc.u32','vsralo.u32','vsrami.u32','vsrapl.u32','vsravs.u32','vsravc.u32','vsrahi.u32','vsrals.u32','vsrage.u32','vsralt.u32','vsragt.u32','vsrale.u32',
+ 'vsraeq.u64','vsrane.u64','vsracs.u64','vsrahs.u64','vsracc.u64','vsralo.u64','vsrami.u64','vsrapl.u64','vsravs.u64','vsravc.u64','vsrahi.u64','vsrals.u64','vsrage.u64','vsralt.u64','vsragt.u64','vsrale.u64',
+
+ 'vpmaxeq.u8','vpmaxne.u8','vpmaxcs.u8','vpmaxhs.u8','vpmaxcc.u8','vpmaxlo.u8','vpmaxmi.u8','vpmaxpl.u8','vpmaxvs.u8','vpmaxvc.u8','vpmaxhi.u8','vpmaxls.u8','vpmaxge.u8','vpmaxlt.u8','vpmaxgt.u8','vpmaxle.u8',
+ 'vpmaxeq.u16','vpmaxne.u16','vpmaxcs.u16','vpmaxhs.u16','vpmaxcc.u16','vpmaxlo.u16','vpmaxmi.u16','vpmaxpl.u16','vpmaxvs.u16','vpmaxvc.u16','vpmaxhi.u16','vpmaxls.u16','vpmaxge.u16','vpmaxlt.u16','vpmaxgt.u16','vpmaxle.u16',
+ 'vpmaxeq.u32','vpmaxne.u32','vpmaxcs.u32','vpmaxhs.u32','vpmaxcc.u32','vpmaxlo.u32','vpmaxmi.u32','vpmaxpl.u32','vpmaxvs.u32','vpmaxvc.u32','vpmaxhi.u32','vpmaxls.u32','vpmaxge.u32','vpmaxlt.u32','vpmaxgt.u32','vpmaxle.u32',
+
+ 'vpmineq.u8','vpminne.u8','vpmincs.u8','vpminhs.u8','vpmincc.u8','vpminlo.u8','vpminmi.u8','vpminpl.u8','vpminvs.u8','vpminvc.u8','vpminhi.u8','vpminls.u8','vpminge.u8','vpminlt.u8','vpmingt.u8','vpminle.u8',
+ 'vpmineq.u16','vpminne.u16','vpmincs.u16','vpminhs.u16','vpmincc.u16','vpminlo.u16','vpminmi.u16','vpminpl.u16','vpminvs.u16','vpminvc.u16','vpminhi.u16','vpminls.u16','vpminge.u16','vpminlt.u16','vpmingt.u16','vpminle.u16',
+ 'vpmineq.u32','vpminne.u32','vpmincs.u32','vpminhs.u32','vpmincc.u32','vpminlo.u32','vpminmi.u32','vpminpl.u32','vpminvs.u32','vpminvc.u32','vpminhi.u32','vpminls.u32','vpminge.u32','vpminlt.u32','vpmingt.u32','vpminle.u32',
+
+ 'vqaddeq.u8','vqaddne.u8','vqaddcs.u8','vqaddhs.u8','vqaddcc.u8','vqaddlo.u8','vqaddmi.u8','vqaddpl.u8','vqaddvs.u8','vqaddvc.u8','vqaddhi.u8','vqaddls.u8','vqaddge.u8','vqaddlt.u8','vqaddgt.u8','vqaddle.u8',
+ 'vqaddeq.u16','vqaddne.u16','vqaddcs.u16','vqaddhs.u16','vqaddcc.u16','vqaddlo.u16','vqaddmi.u16','vqaddpl.u16','vqaddvs.u16','vqaddvc.u16','vqaddhi.u16','vqaddls.u16','vqaddge.u16','vqaddlt.u16','vqaddgt.u16','vqaddle.u16',
+ 'vqaddeq.u32','vqaddne.u32','vqaddcs.u32','vqaddhs.u32','vqaddcc.u32','vqaddlo.u32','vqaddmi.u32','vqaddpl.u32','vqaddvs.u32','vqaddvc.u32','vqaddhi.u32','vqaddls.u32','vqaddge.u32','vqaddlt.u32','vqaddgt.u32','vqaddle.u32',
+ 'vqaddeq.u64','vqaddne.u64','vqaddcs.u64','vqaddhs.u64','vqaddcc.u64','vqaddlo.u64','vqaddmi.u64','vqaddpl.u64','vqaddvs.u64','vqaddvc.u64','vqaddhi.u64','vqaddls.u64','vqaddge.u64','vqaddlt.u64','vqaddgt.u64','vqaddle.u64',
+
+ 'vqsubeq.u8','vqsubne.u8','vqsubcs.u8','vqsubhs.u8','vqsubcc.u8','vqsublo.u8','vqsubmi.u8','vqsubpl.u8','vqsubvs.u8','vqsubvc.u8','vqsubhi.u8','vqsubls.u8','vqsubge.u8','vqsublt.u8','vqsubgt.u8','vqsuble.u8',
+ 'vqsubeq.u16','vqsubne.u16','vqsubcs.u16','vqsubhs.u16','vqsubcc.u16','vqsublo.u16','vqsubmi.u16','vqsubpl.u16','vqsubvs.u16','vqsubvc.u16','vqsubhi.u16','vqsubls.u16','vqsubge.u16','vqsublt.u16','vqsubgt.u16','vqsuble.u16',
+ 'vqsubeq.u32','vqsubne.u32','vqsubcs.u32','vqsubhs.u32','vqsubcc.u32','vqsublo.u32','vqsubmi.u32','vqsubpl.u32','vqsubvs.u32','vqsubvc.u32','vqsubhi.u32','vqsubls.u32','vqsubge.u32','vqsublt.u32','vqsubgt.u32','vqsuble.u32',
+ 'vqsubeq.u64','vqsubne.u64','vqsubcs.u64','vqsubhs.u64','vqsubcc.u64','vqsublo.u64','vqsubmi.u64','vqsubpl.u64','vqsubvs.u64','vqsubvc.u64','vqsubhi.u64','vqsubls.u64','vqsubge.u64','vqsublt.u64','vqsubgt.u64','vqsuble.u64',
+
+ 'vqmovneq.u16','vqmovnne.u16','vqmovncs.u16','vqmovnhs.u16','vqmovncc.u16','vqmovnlo.u16','vqmovnmi.u16','vqmovnpl.u16','vqmovnvs.u16','vqmovnvc.u16','vqmovnhi.u16','vqmovnls.u16','vqmovnge.u16','vqmovnlt.u16','vqmovngt.u16','vqmovnle.u16',
+ 'vqmovneq.u32','vqmovnne.u32','vqmovncs.u32','vqmovnhs.u32','vqmovncc.u32','vqmovnlo.u32','vqmovnmi.u32','vqmovnpl.u32','vqmovnvs.u32','vqmovnvc.u32','vqmovnhi.u32','vqmovnls.u32','vqmovnge.u32','vqmovnlt.u32','vqmovngt.u32','vqmovnle.u32',
+ 'vqmovneq.u64','vqmovnne.u64','vqmovncs.u64','vqmovnhs.u64','vqmovncc.u64','vqmovnlo.u64','vqmovnmi.u64','vqmovnpl.u64','vqmovnvs.u64','vqmovnvc.u64','vqmovnhi.u64','vqmovnls.u64','vqmovnge.u64','vqmovnlt.u64','vqmovngt.u64','vqmovnle.u64',
+
+ 'vqshleq.u8','vqshlne.u8','vqshlcs.u8','vqshlhs.u8','vqshlcc.u8','vqshllo.u8','vqshlmi.u8','vqshlpl.u8','vqshlvs.u8','vqshlvc.u8','vqshlhi.u8','vqshlls.u8','vqshlge.u8','vqshllt.u8','vqshlgt.u8','vqshlle.u8',
+ 'vqshleq.u16','vqshlne.u16','vqshlcs.u16','vqshlhs.u16','vqshlcc.u16','vqshllo.u16','vqshlmi.u16','vqshlpl.u16','vqshlvs.u16','vqshlvc.u16','vqshlhi.u16','vqshlls.u16','vqshlge.u16','vqshllt.u16','vqshlgt.u16','vqshlle.u16',
+ 'vqshleq.u32','vqshlne.u32','vqshlcs.u32','vqshlhs.u32','vqshlcc.u32','vqshllo.u32','vqshlmi.u32','vqshlpl.u32','vqshlvs.u32','vqshlvc.u32','vqshlhi.u32','vqshlls.u32','vqshlge.u32','vqshllt.u32','vqshlgt.u32','vqshlle.u32',
+ 'vqshleq.u64','vqshlne.u64','vqshlcs.u64','vqshlhs.u64','vqshlcc.u64','vqshllo.u64','vqshlmi.u64','vqshlpl.u64','vqshlvs.u64','vqshlvc.u64','vqshlhi.u64','vqshlls.u64','vqshlge.u64','vqshllt.u64','vqshlgt.u64','vqshlle.u64',
+
+ 'vqshrneq.u16','vqshrnne.u16','vqshrncs.u16','vqshrnhs.u16','vqshrncc.u16','vqshrnlo.u16','vqshrnmi.u16','vqshrnpl.u16','vqshrnvs.u16','vqshrnvc.u16','vqshrnhi.u16','vqshrnls.u16','vqshrnge.u16','vqshrnlt.u16','vqshrngt.u16','vqshrnle.u16',
+ 'vqshrneq.u32','vqshrnne.u32','vqshrncs.u32','vqshrnhs.u32','vqshrncc.u32','vqshrnlo.u32','vqshrnmi.u32','vqshrnpl.u32','vqshrnvs.u32','vqshrnvc.u32','vqshrnhi.u32','vqshrnls.u32','vqshrnge.u32','vqshrnlt.u32','vqshrngt.u32','vqshrnle.u32',
+ 'vqshrneq.u64','vqshrnne.u64','vqshrncs.u64','vqshrnhs.u64','vqshrncc.u64','vqshrnlo.u64','vqshrnmi.u64','vqshrnpl.u64','vqshrnvs.u64','vqshrnvc.u64','vqshrnhi.u64','vqshrnls.u64','vqshrnge.u64','vqshrnlt.u64','vqshrngt.u64','vqshrnle.u64',
+
+ 'vqrshleq.u8','vqrshlne.u8','vqrshlcs.u8','vqrshlhs.u8','vqrshlcc.u8','vqrshllo.u8','vqrshlmi.u8','vqrshlpl.u8','vqrshlvs.u8','vqrshlvc.u8','vqrshlhi.u8','vqrshlls.u8','vqrshlge.u8','vqrshllt.u8','vqrshlgt.u8','vqrshlle.u8',
+ 'vqrshleq.u16','vqrshlne.u16','vqrshlcs.u16','vqrshlhs.u16','vqrshlcc.u16','vqrshllo.u16','vqrshlmi.u16','vqrshlpl.u16','vqrshlvs.u16','vqrshlvc.u16','vqrshlhi.u16','vqrshlls.u16','vqrshlge.u16','vqrshllt.u16','vqrshlgt.u16','vqrshlle.u16',
+ 'vqrshleq.u32','vqrshlne.u32','vqrshlcs.u32','vqrshlhs.u32','vqrshlcc.u32','vqrshllo.u32','vqrshlmi.u32','vqrshlpl.u32','vqrshlvs.u32','vqrshlvc.u32','vqrshlhi.u32','vqrshlls.u32','vqrshlge.u32','vqrshllt.u32','vqrshlgt.u32','vqrshlle.u32',
+ 'vqrshleq.u64','vqrshlne.u64','vqrshlcs.u64','vqrshlhs.u64','vqrshlcc.u64','vqrshllo.u64','vqrshlmi.u64','vqrshlpl.u64','vqrshlvs.u64','vqrshlvc.u64','vqrshlhi.u64','vqrshlls.u64','vqrshlge.u64','vqrshllt.u64','vqrshlgt.u64','vqrshlle.u64',
+
+ 'vqrshrneq.u16','vqrshrnne.u16','vqrshrncs.u16','vqrshrnhs.u16','vqrshrncc.u16','vqrshrnlo.u16','vqrshrnmi.u16','vqrshrnpl.u16','vqrshrnvs.u16','vqrshrnvc.u16','vqrshrnhi.u16','vqrshrnls.u16','vqrshrnge.u16','vqrshrnlt.u16','vqrshrngt.u16','vqrshrnle.u16',
+ 'vqrshrneq.u32','vqrshrnne.u32','vqrshrncs.u32','vqrshrnhs.u32','vqrshrncc.u32','vqrshrnlo.u32','vqrshrnmi.u32','vqrshrnpl.u32','vqrshrnvs.u32','vqrshrnvc.u32','vqrshrnhi.u32','vqrshrnls.u32','vqrshrnge.u32','vqrshrnlt.u32','vqrshrngt.u32','vqrshrnle.u32',
+ 'vqrshrneq.u64','vqrshrnne.u64','vqrshrncs.u64','vqrshrnhs.u64','vqrshrncc.u64','vqrshrnlo.u64','vqrshrnmi.u64','vqrshrnpl.u64','vqrshrnvs.u64','vqrshrnvc.u64','vqrshrnhi.u64','vqrshrnls.u64','vqrshrnge.u64','vqrshrnlt.u64','vqrshrngt.u64','vqrshrnle.u64',
+
+ 'vrhaddeq.u8','vrhaddne.u8','vrhaddcs.u8','vrhaddhs.u8','vrhaddcc.u8','vrhaddlo.u8','vrhaddmi.u8','vrhaddpl.u8','vrhaddvs.u8','vrhaddvc.u8','vrhaddhi.u8','vrhaddls.u8','vrhaddge.u8','vrhaddlt.u8','vrhaddgt.u8','vrhaddle.u8',
+ 'vrhaddeq.u16','vrhaddne.u16','vrhaddcs.u16','vrhaddhs.u16','vrhaddcc.u16','vrhaddlo.u16','vrhaddmi.u16','vrhaddpl.u16','vrhaddvs.u16','vrhaddvc.u16','vrhaddhi.u16','vrhaddls.u16','vrhaddge.u16','vrhaddlt.u16','vrhaddgt.u16','vrhaddle.u16',
+ 'vrhaddeq.u32','vrhaddne.u32','vrhaddcs.u32','vrhaddhs.u32','vrhaddcc.u32','vrhaddlo.u32','vrhaddmi.u32','vrhaddpl.u32','vrhaddvs.u32','vrhaddvc.u32','vrhaddhi.u32','vrhaddls.u32','vrhaddge.u32','vrhaddlt.u32','vrhaddgt.u32','vrhaddle.u32',
+
+ 'vrshleq.u8','vrshlne.u8','vrshlcs.u8','vrshlhs.u8','vrshlcc.u8','vrshllo.u8','vrshlmi.u8','vrshlpl.u8','vrshlvs.u8','vrshlvc.u8','vrshlhi.u8','vrshlls.u8','vrshlge.u8','vrshllt.u8','vrshlgt.u8','vrshlle.u8',
+ 'vrshleq.u16','vrshlne.u16','vrshlcs.u16','vrshlhs.u16','vrshlcc.u16','vrshllo.u16','vrshlmi.u16','vrshlpl.u16','vrshlvs.u16','vrshlvc.u16','vrshlhi.u16','vrshlls.u16','vrshlge.u16','vrshllt.u16','vrshlgt.u16','vrshlle.u16',
+ 'vrshleq.u32','vrshlne.u32','vrshlcs.u32','vrshlhs.u32','vrshlcc.u32','vrshllo.u32','vrshlmi.u32','vrshlpl.u32','vrshlvs.u32','vrshlvc.u32','vrshlhi.u32','vrshlls.u32','vrshlge.u32','vrshllt.u32','vrshlgt.u32','vrshlle.u32',
+ 'vrshleq.u64','vrshlne.u64','vrshlcs.u64','vrshlhs.u64','vrshlcc.u64','vrshllo.u64','vrshlmi.u64','vrshlpl.u64','vrshlvs.u64','vrshlvc.u64','vrshlhi.u64','vrshlls.u64','vrshlge.u64','vrshllt.u64','vrshlgt.u64','vrshlle.u64',
+
+ 'vrshreq.u8','vrshrne.u8','vrshrcs.u8','vrshrhs.u8','vrshrcc.u8','vrshrlo.u8','vrshrmi.u8','vrshrpl.u8','vrshrvs.u8','vrshrvc.u8','vrshrhi.u8','vrshrls.u8','vrshrge.u8','vrshrlt.u8','vrshrgt.u8','vrshrle.u8',
+ 'vrshreq.u16','vrshrne.u16','vrshrcs.u16','vrshrhs.u16','vrshrcc.u16','vrshrlo.u16','vrshrmi.u16','vrshrpl.u16','vrshrvs.u16','vrshrvc.u16','vrshrhi.u16','vrshrls.u16','vrshrge.u16','vrshrlt.u16','vrshrgt.u16','vrshrle.u16',
+ 'vrshreq.u32','vrshrne.u32','vrshrcs.u32','vrshrhs.u32','vrshrcc.u32','vrshrlo.u32','vrshrmi.u32','vrshrpl.u32','vrshrvs.u32','vrshrvc.u32','vrshrhi.u32','vrshrls.u32','vrshrge.u32','vrshrlt.u32','vrshrgt.u32','vrshrle.u32',
+ 'vrshreq.u64','vrshrne.u64','vrshrcs.u64','vrshrhs.u64','vrshrcc.u64','vrshrlo.u64','vrshrmi.u64','vrshrpl.u64','vrshrvs.u64','vrshrvc.u64','vrshrhi.u64','vrshrls.u64','vrshrge.u64','vrshrlt.u64','vrshrgt.u64','vrshrle.u64',
+
+ 'vrsraeq.u8','vrsrane.u8','vrsracs.u8','vrsrahs.u8','vrsracc.u8','vrsralo.u8','vrsrami.u8','vrsrapl.u8','vrsravs.u8','vrsravc.u8','vrsrahi.u8','vrsrals.u8','vrsrage.u8','vrsralt.u8','vrsragt.u8','vrsrale.u8',
+ 'vrsraeq.u16','vrsrane.u16','vrsracs.u16','vrsrahs.u16','vrsracc.u16','vrsralo.u16','vrsrami.u16','vrsrapl.u16','vrsravs.u16','vrsravc.u16','vrsrahi.u16','vrsrals.u16','vrsrage.u16','vrsralt.u16','vrsragt.u16','vrsrale.u16',
+ 'vrsraeq.u32','vrsrane.u32','vrsracs.u32','vrsrahs.u32','vrsracc.u32','vrsralo.u32','vrsrami.u32','vrsrapl.u32','vrsravs.u32','vrsravc.u32','vrsrahi.u32','vrsrals.u32','vrsrage.u32','vrsralt.u32','vrsragt.u32','vrsrale.u32',
+ 'vrsraeq.u64','vrsrane.u64','vrsracs.u64','vrsrahs.u64','vrsracc.u64','vrsralo.u64','vrsrami.u64','vrsrapl.u64','vrsravs.u64','vrsravc.u64','vrsrahi.u64','vrsrals.u64','vrsrage.u64','vrsralt.u64','vrsragt.u64','vrsrale.u64',
+ ),
+ /* Conditional VFPv3 & NEON SIMD Floating-Point Instructions */
+ 34 => array(
+ 'vabdeq.f32','vabdne.f32','vabdcs.f32','vabdhs.f32','vabdcc.f32','vabdlo.f32','vabdmi.f32','vabdpl.f32','vabdvs.f32','vabdvc.f32','vabdhi.f32','vabdls.f32','vabdge.f32','vabdlt.f32','vabdgt.f32','vabdle.f32',
+
+ 'vabseq.f32','vabsne.f32','vabscs.f32','vabshs.f32','vabscc.f32','vabslo.f32','vabsmi.f32','vabspl.f32','vabsvs.f32','vabsvc.f32','vabshi.f32','vabsls.f32','vabsge.f32','vabslt.f32','vabsgt.f32','vabsle.f32',
+ 'vabseq.f64','vabsne.f64','vabscs.f64','vabshs.f64','vabscc.f64','vabslo.f64','vabsmi.f64','vabspl.f64','vabsvs.f64','vabsvc.f64','vabshi.f64','vabsls.f64','vabsge.f64','vabslt.f64','vabsgt.f64','vabsle.f64',
+
+ 'vacgeeq.f32','vacgene.f32','vacgecs.f32','vacgehs.f32','vacgecc.f32','vacgelo.f32','vacgemi.f32','vacgepl.f32','vacgevs.f32','vacgevc.f32','vacgehi.f32','vacgels.f32','vacgege.f32','vacgelt.f32','vacgegt.f32','vacgele.f32',
+ 'vacgteq.f32','vacgtne.f32','vacgtcs.f32','vacgths.f32','vacgtcc.f32','vacgtlo.f32','vacgtmi.f32','vacgtpl.f32','vacgtvs.f32','vacgtvc.f32','vacgthi.f32','vacgtls.f32','vacgtge.f32','vacgtlt.f32','vacgtgt.f32','vacgtle.f32',
+ 'vacleeq.f32','vaclene.f32','vaclecs.f32','vaclehs.f32','vaclecc.f32','vaclelo.f32','vaclemi.f32','vaclepl.f32','vaclevs.f32','vaclevc.f32','vaclehi.f32','vaclels.f32','vaclege.f32','vaclelt.f32','vaclegt.f32','vaclele.f32',
+ 'vaclteq.f32','vacltne.f32','vacltcs.f32','vaclths.f32','vacltcc.f32','vacltlo.f32','vacltmi.f32','vacltpl.f32','vacltvs.f32','vacltvc.f32','vaclthi.f32','vacltls.f32','vacltge.f32','vacltlt.f32','vacltgt.f32','vacltle.f32',
+
+ 'vaddeq.f32','vaddne.f32','vaddcs.f32','vaddhs.f32','vaddcc.f32','vaddlo.f32','vaddmi.f32','vaddpl.f32','vaddvs.f32','vaddvc.f32','vaddhi.f32','vaddls.f32','vaddge.f32','vaddlt.f32','vaddgt.f32','vaddle.f32',
+ 'vaddeq.f64','vaddne.f64','vaddcs.f64','vaddhs.f64','vaddcc.f64','vaddlo.f64','vaddmi.f64','vaddpl.f64','vaddvs.f64','vaddvc.f64','vaddhi.f64','vaddls.f64','vaddge.f64','vaddlt.f64','vaddgt.f64','vaddle.f64',
+
+ 'vceqeq.f32','vceqne.f32','vceqcs.f32','vceqhs.f32','vceqcc.f32','vceqlo.f32','vceqmi.f32','vceqpl.f32','vceqvs.f32','vceqvc.f32','vceqhi.f32','vceqls.f32','vceqge.f32','vceqlt.f32','vceqgt.f32','vceqle.f32',
+ 'vcgeeq.f32','vcgene.f32','vcgecs.f32','vcgehs.f32','vcgecc.f32','vcgelo.f32','vcgemi.f32','vcgepl.f32','vcgevs.f32','vcgevc.f32','vcgehi.f32','vcgels.f32','vcgege.f32','vcgelt.f32','vcgegt.f32','vcgele.f32',
+ 'vcleeq.f32','vclene.f32','vclecs.f32','vclehs.f32','vclecc.f32','vclelo.f32','vclemi.f32','vclepl.f32','vclevs.f32','vclevc.f32','vclehi.f32','vclels.f32','vclege.f32','vclelt.f32','vclegt.f32','vclele.f32',
+ 'vcgteq.f32','vcgtne.f32','vcgtcs.f32','vcgths.f32','vcgtcc.f32','vcgtlo.f32','vcgtmi.f32','vcgtpl.f32','vcgtvs.f32','vcgtvc.f32','vcgthi.f32','vcgtls.f32','vcgtge.f32','vcgtlt.f32','vcgtgt.f32','vcgtle.f32',
+ 'vclteq.f32','vcltne.f32','vcltcs.f32','vclths.f32','vcltcc.f32','vcltlo.f32','vcltmi.f32','vcltpl.f32','vcltvs.f32','vcltvc.f32','vclthi.f32','vcltls.f32','vcltge.f32','vcltlt.f32','vcltgt.f32','vcltle.f32',
+
+ 'vcmpeq.f32','vcmpne.f32','vcmpcs.f32','vcmphs.f32','vcmpcc.f32','vcmplo.f32','vcmpmi.f32','vcmppl.f32','vcmpvs.f32','vcmpvc.f32','vcmphi.f32','vcmpls.f32','vcmpge.f32','vcmplt.f32','vcmpgt.f32','vcmple.f32',
+ 'vcmpeq.f64','vcmpne.f64','vcmpcs.f64','vcmphs.f64','vcmpcc.f64','vcmplo.f64','vcmpmi.f64','vcmppl.f64','vcmpvs.f64','vcmpvc.f64','vcmphi.f64','vcmpls.f64','vcmpge.f64','vcmplt.f64','vcmpgt.f64','vcmple.f64',
+
+ 'vcmpeeq.f32','vcmpene.f32','vcmpecs.f32','vcmpehs.f32','vcmpecc.f32','vcmpelo.f32','vcmpemi.f32','vcmpepl.f32','vcmpevs.f32','vcmpevc.f32','vcmpehi.f32','vcmpels.f32','vcmpege.f32','vcmpelt.f32','vcmpegt.f32','vcmpele.f32',
+ 'vcmpeeq.f64','vcmpene.f64','vcmpecs.f64','vcmpehs.f64','vcmpecc.f64','vcmpelo.f64','vcmpemi.f64','vcmpepl.f64','vcmpevs.f64','vcmpevc.f64','vcmpehi.f64','vcmpels.f64','vcmpege.f64','vcmpelt.f64','vcmpegt.f64','vcmpele.f64',
+
+ 'vcvteq.s16.f32','vcvtne.s16.f32','vcvtcs.s16.f32','vcvths.s16.f32','vcvtcc.s16.f32','vcvtlo.s16.f32','vcvtmi.s16.f32','vcvtpl.s16.f32','vcvtvs.s16.f32','vcvtvc.s16.f32','vcvthi.s16.f32','vcvtls.s16.f32','vcvtge.s16.f32','vcvtlt.s16.f32','vcvtgt.s16.f32','vcvtle.s16.f32',
+ 'vcvteq.s16.f64','vcvtne.s16.f64','vcvtcs.s16.f64','vcvths.s16.f64','vcvtcc.s16.f64','vcvtlo.s16.f64','vcvtmi.s16.f64','vcvtpl.s16.f64','vcvtvs.s16.f64','vcvtvc.s16.f64','vcvthi.s16.f64','vcvtls.s16.f64','vcvtge.s16.f64','vcvtlt.s16.f64','vcvtgt.s16.f64','vcvtle.s16.f64',
+ 'vcvteq.s32.f32','vcvtne.s32.f32','vcvtcs.s32.f32','vcvths.s32.f32','vcvtcc.s32.f32','vcvtlo.s32.f32','vcvtmi.s32.f32','vcvtpl.s32.f32','vcvtvs.s32.f32','vcvtvc.s32.f32','vcvthi.s32.f32','vcvtls.s32.f32','vcvtge.s32.f32','vcvtlt.s32.f32','vcvtgt.s32.f32','vcvtle.s32.f32',
+ 'vcvteq.s32.f64','vcvtne.s32.f64','vcvtcs.s32.f64','vcvths.s32.f64','vcvtcc.s32.f64','vcvtlo.s32.f64','vcvtmi.s32.f64','vcvtpl.s32.f64','vcvtvs.s32.f64','vcvtvc.s32.f64','vcvthi.s32.f64','vcvtls.s32.f64','vcvtge.s32.f64','vcvtlt.s32.f64','vcvtgt.s32.f64','vcvtle.s32.f64',
+ 'vcvteq.u16.f32','vcvtne.u16.f32','vcvtcs.u16.f32','vcvths.u16.f32','vcvtcc.u16.f32','vcvtlo.u16.f32','vcvtmi.u16.f32','vcvtpl.u16.f32','vcvtvs.u16.f32','vcvtvc.u16.f32','vcvthi.u16.f32','vcvtls.u16.f32','vcvtge.u16.f32','vcvtlt.u16.f32','vcvtgt.u16.f32','vcvtle.u16.f32',
+ 'vcvteq.u16.f64','vcvtne.u16.f64','vcvtcs.u16.f64','vcvths.u16.f64','vcvtcc.u16.f64','vcvtlo.u16.f64','vcvtmi.u16.f64','vcvtpl.u16.f64','vcvtvs.u16.f64','vcvtvc.u16.f64','vcvthi.u16.f64','vcvtls.u16.f64','vcvtge.u16.f64','vcvtlt.u16.f64','vcvtgt.u16.f64','vcvtle.u16.f64',
+ 'vcvteq.u32.f32','vcvtne.u32.f32','vcvtcs.u32.f32','vcvths.u32.f32','vcvtcc.u32.f32','vcvtlo.u32.f32','vcvtmi.u32.f32','vcvtpl.u32.f32','vcvtvs.u32.f32','vcvtvc.u32.f32','vcvthi.u32.f32','vcvtls.u32.f32','vcvtge.u32.f32','vcvtlt.u32.f32','vcvtgt.u32.f32','vcvtle.u32.f32',
+ 'vcvteq.u32.f64','vcvtne.u32.f64','vcvtcs.u32.f64','vcvths.u32.f64','vcvtcc.u32.f64','vcvtlo.u32.f64','vcvtmi.u32.f64','vcvtpl.u32.f64','vcvtvs.u32.f64','vcvtvc.u32.f64','vcvthi.u32.f64','vcvtls.u32.f64','vcvtge.u32.f64','vcvtlt.u32.f64','vcvtgt.u32.f64','vcvtle.u32.f64',
+ 'vcvteq.f16.f32','vcvtne.f16.f32','vcvtcs.f16.f32','vcvths.f16.f32','vcvtcc.f16.f32','vcvtlo.f16.f32','vcvtmi.f16.f32','vcvtpl.f16.f32','vcvtvs.f16.f32','vcvtvc.f16.f32','vcvthi.f16.f32','vcvtls.f16.f32','vcvtge.f16.f32','vcvtlt.f16.f32','vcvtgt.f16.f32','vcvtle.f16.f32',
+ 'vcvteq.f32.s32','vcvtne.f32.s32','vcvtcs.f32.s32','vcvths.f32.s32','vcvtcc.f32.s32','vcvtlo.f32.s32','vcvtmi.f32.s32','vcvtpl.f32.s32','vcvtvs.f32.s32','vcvtvc.f32.s32','vcvthi.f32.s32','vcvtls.f32.s32','vcvtge.f32.s32','vcvtlt.f32.s32','vcvtgt.f32.s32','vcvtle.f32.s32',
+ 'vcvteq.f32.u32','vcvtne.f32.u32','vcvtcs.f32.u32','vcvths.f32.u32','vcvtcc.f32.u32','vcvtlo.f32.u32','vcvtmi.f32.u32','vcvtpl.f32.u32','vcvtvs.f32.u32','vcvtvc.f32.u32','vcvthi.f32.u32','vcvtls.f32.u32','vcvtge.f32.u32','vcvtlt.f32.u32','vcvtgt.f32.u32','vcvtle.f32.u32',
+ 'vcvteq.f32.f16','vcvtne.f32.f16','vcvtcs.f32.f16','vcvths.f32.f16','vcvtcc.f32.f16','vcvtlo.f32.f16','vcvtmi.f32.f16','vcvtpl.f32.f16','vcvtvs.f32.f16','vcvtvc.f32.f16','vcvthi.f32.f16','vcvtls.f32.f16','vcvtge.f32.f16','vcvtlt.f32.f16','vcvtgt.f32.f16','vcvtle.f32.f16',
+ 'vcvteq.f32.f64','vcvtne.f32.f64','vcvtcs.f32.f64','vcvths.f32.f64','vcvtcc.f32.f64','vcvtlo.f32.f64','vcvtmi.f32.f64','vcvtpl.f32.f64','vcvtvs.f32.f64','vcvtvc.f32.f64','vcvthi.f32.f64','vcvtls.f32.f64','vcvtge.f32.f64','vcvtlt.f32.f64','vcvtgt.f32.f64','vcvtle.f32.f64',
+ 'vcvteq.f64.s32','vcvtne.f64.s32','vcvtcs.f64.s32','vcvths.f64.s32','vcvtcc.f64.s32','vcvtlo.f64.s32','vcvtmi.f64.s32','vcvtpl.f64.s32','vcvtvs.f64.s32','vcvtvc.f64.s32','vcvthi.f64.s32','vcvtls.f64.s32','vcvtge.f64.s32','vcvtlt.f64.s32','vcvtgt.f64.s32','vcvtle.f64.s32',
+ 'vcvteq.f64.u32','vcvtne.f64.u32','vcvtcs.f64.u32','vcvths.f64.u32','vcvtcc.f64.u32','vcvtlo.f64.u32','vcvtmi.f64.u32','vcvtpl.f64.u32','vcvtvs.f64.u32','vcvtvc.f64.u32','vcvthi.f64.u32','vcvtls.f64.u32','vcvtge.f64.u32','vcvtlt.f64.u32','vcvtgt.f64.u32','vcvtle.f64.u32',
+ 'vcvteq.f64.f32','vcvtne.f64.f32','vcvtcs.f64.f32','vcvths.f64.f32','vcvtcc.f64.f32','vcvtlo.f64.f32','vcvtmi.f64.f32','vcvtpl.f64.f32','vcvtvs.f64.f32','vcvtvc.f64.f32','vcvthi.f64.f32','vcvtls.f64.f32','vcvtge.f64.f32','vcvtlt.f64.f32','vcvtgt.f64.f32','vcvtle.f64.f32',
+
+ 'vcvtreq.s32.f32','vcvtrne.s32.f32','vcvtrcs.s32.f32','vcvtrhs.s32.f32','vcvtrcc.s32.f32','vcvtrlo.s32.f32','vcvtrmi.s32.f32','vcvtrpl.s32.f32','vcvtrvs.s32.f32','vcvtrvc.s32.f32','vcvtrhi.s32.f32','vcvtrls.s32.f32','vcvtrge.s32.f32','vcvtrlt.s32.f32','vcvtrgt.s32.f32','vcvtrle.s32.f32',
+ 'vcvtreq.s32.f64','vcvtrne.s32.f64','vcvtrcs.s32.f64','vcvtrhs.s32.f64','vcvtrcc.s32.f64','vcvtrlo.s32.f64','vcvtrmi.s32.f64','vcvtrpl.s32.f64','vcvtrvs.s32.f64','vcvtrvc.s32.f64','vcvtrhi.s32.f64','vcvtrls.s32.f64','vcvtrge.s32.f64','vcvtrlt.s32.f64','vcvtrgt.s32.f64','vcvtrle.s32.f64',
+ 'vcvtreq.u32.f32','vcvtrne.u32.f32','vcvtrcs.u32.f32','vcvtrhs.u32.f32','vcvtrcc.u32.f32','vcvtrlo.u32.f32','vcvtrmi.u32.f32','vcvtrpl.u32.f32','vcvtrvs.u32.f32','vcvtrvc.u32.f32','vcvtrhi.u32.f32','vcvtrls.u32.f32','vcvtrge.u32.f32','vcvtrlt.u32.f32','vcvtrgt.u32.f32','vcvtrle.u32.f32',
+ 'vcvtreq.u32.f64','vcvtrne.u32.f64','vcvtrcs.u32.f64','vcvtrhs.u32.f64','vcvtrcc.u32.f64','vcvtrlo.u32.f64','vcvtrmi.u32.f64','vcvtrpl.u32.f64','vcvtrvs.u32.f64','vcvtrvc.u32.f64','vcvtrhi.u32.f64','vcvtrls.u32.f64','vcvtrge.u32.f64','vcvtrlt.u32.f64','vcvtrgt.u32.f64','vcvtrle.u32.f64',
+
+ 'vcvtbeq.f16.f32','vcvtbne.f16.f32','vcvtbcs.f16.f32','vcvtbhs.f16.f32','vcvtbcc.f16.f32','vcvtblo.f16.f32','vcvtbmi.f16.f32','vcvtbpl.f16.f32','vcvtbvs.f16.f32','vcvtbvc.f16.f32','vcvtbhi.f16.f32','vcvtbls.f16.f32','vcvtbge.f16.f32','vcvtblt.f16.f32','vcvtbgt.f16.f32','vcvtble.f16.f32',
+ 'vcvtbeq.f32.f16','vcvtbne.f32.f16','vcvtbcs.f32.f16','vcvtbhs.f32.f16','vcvtbcc.f32.f16','vcvtblo.f32.f16','vcvtbmi.f32.f16','vcvtbpl.f32.f16','vcvtbvs.f32.f16','vcvtbvc.f32.f16','vcvtbhi.f32.f16','vcvtbls.f32.f16','vcvtbge.f32.f16','vcvtblt.f32.f16','vcvtbgt.f32.f16','vcvtble.f32.f16',
+
+ 'vcvtteq.f16.f32','vcvttne.f16.f32','vcvttcs.f16.f32','vcvtths.f16.f32','vcvttcc.f16.f32','vcvttlo.f16.f32','vcvttmi.f16.f32','vcvttpl.f16.f32','vcvttvs.f16.f32','vcvttvc.f16.f32','vcvtthi.f16.f32','vcvttls.f16.f32','vcvttge.f16.f32','vcvttlt.f16.f32','vcvttgt.f16.f32','vcvttle.f16.f32',
+ 'vcvtteq.f32.f16','vcvttne.f32.f16','vcvttcs.f32.f16','vcvtths.f32.f16','vcvttcc.f32.f16','vcvttlo.f32.f16','vcvttmi.f32.f16','vcvttpl.f32.f16','vcvttvs.f32.f16','vcvttvc.f32.f16','vcvtthi.f32.f16','vcvttls.f32.f16','vcvttge.f32.f16','vcvttlt.f32.f16','vcvttgt.f32.f16','vcvttle.f32.f16',
+
+ 'vdiveq.f32','vdivne.f32','vdivcs.f32','vdivhs.f32','vdivcc.f32','vdivlo.f32','vdivmi.f32','vdivpl.f32','vdivvs.f32','vdivvc.f32','vdivhi.f32','vdivls.f32','vdivge.f32','vdivlt.f32','vdivgt.f32','vdivle.f32',
+ 'vdiveq.f64','vdivne.f64','vdivcs.f64','vdivhs.f64','vdivcc.f64','vdivlo.f64','vdivmi.f64','vdivpl.f64','vdivvs.f64','vdivvc.f64','vdivhi.f64','vdivls.f64','vdivge.f64','vdivlt.f64','vdivgt.f64','vdivle.f64',
+
+ 'vmaxeq.f32','vmaxne.f32','vmaxcs.f32','vmaxhs.f32','vmaxcc.f32','vmaxlo.f32','vmaxmi.f32','vmaxpl.f32','vmaxvs.f32','vmaxvc.f32','vmaxhi.f32','vmaxls.f32','vmaxge.f32','vmaxlt.f32','vmaxgt.f32','vmaxle.f32',
+ 'vmineq.f32','vminne.f32','vmincs.f32','vminhs.f32','vmincc.f32','vminlo.f32','vminmi.f32','vminpl.f32','vminvs.f32','vminvc.f32','vminhi.f32','vminls.f32','vminge.f32','vminlt.f32','vmingt.f32','vminle.f32',
+
+ 'vmlaeq.f32','vmlane.f32','vmlacs.f32','vmlahs.f32','vmlacc.f32','vmlalo.f32','vmlami.f32','vmlapl.f32','vmlavs.f32','vmlavc.f32','vmlahi.f32','vmlals.f32','vmlage.f32','vmlalt.f32','vmlagt.f32','vmlale.f32',
+ 'vmlaeq.f64','vmlane.f64','vmlacs.f64','vmlahs.f64','vmlacc.f64','vmlalo.f64','vmlami.f64','vmlapl.f64','vmlavs.f64','vmlavc.f64','vmlahi.f64','vmlals.f64','vmlage.f64','vmlalt.f64','vmlagt.f64','vmlale.f64',
+
+ 'vmlseq.f32','vmlsne.f32','vmlscs.f32','vmlshs.f32','vmlscc.f32','vmlslo.f32','vmlsmi.f32','vmlspl.f32','vmlsvs.f32','vmlsvc.f32','vmlshi.f32','vmlsls.f32','vmlsge.f32','vmlslt.f32','vmlsgt.f32','vmlsle.f32',
+ 'vmlseq.f64','vmlsne.f64','vmlscs.f64','vmlshs.f64','vmlscc.f64','vmlslo.f64','vmlsmi.f64','vmlspl.f64','vmlsvs.f64','vmlsvc.f64','vmlshi.f64','vmlsls.f64','vmlsge.f64','vmlslt.f64','vmlsgt.f64','vmlsle.f64',
+
+ 'vmuleq.f32','vmulne.f32','vmulcs.f32','vmulhs.f32','vmulcc.f32','vmullo.f32','vmulmi.f32','vmulpl.f32','vmulvs.f32','vmulvc.f32','vmulhi.f32','vmulls.f32','vmulge.f32','vmullt.f32','vmulgt.f32','vmulle.f32',
+ 'vmuleq.f64','vmulne.f64','vmulcs.f64','vmulhs.f64','vmulcc.f64','vmullo.f64','vmulmi.f64','vmulpl.f64','vmulvs.f64','vmulvc.f64','vmulhi.f64','vmulls.f64','vmulge.f64','vmullt.f64','vmulgt.f64','vmulle.f64',
+
+ 'vnegeq.f32','vnegne.f32','vnegcs.f32','vneghs.f32','vnegcc.f32','vneglo.f32','vnegmi.f32','vnegpl.f32','vnegvs.f32','vnegvc.f32','vneghi.f32','vnegls.f32','vnegge.f32','vneglt.f32','vneggt.f32','vnegle.f32',
+ 'vnegeq.f64','vnegne.f64','vnegcs.f64','vneghs.f64','vnegcc.f64','vneglo.f64','vnegmi.f64','vnegpl.f64','vnegvs.f64','vnegvc.f64','vneghi.f64','vnegls.f64','vnegge.f64','vneglt.f64','vneggt.f64','vnegle.f64',
+
+ 'vnmlaeq.f32','vnmlane.f32','vnmlacs.f32','vnmlahs.f32','vnmlacc.f32','vnmlalo.f32','vnmlami.f32','vnmlapl.f32','vnmlavs.f32','vnmlavc.f32','vnmlahi.f32','vnmlals.f32','vnmlage.f32','vnmlalt.f32','vnmlagt.f32','vnmlale.f32',
+ 'vnmlaeq.f64','vnmlane.f64','vnmlacs.f64','vnmlahs.f64','vnmlacc.f64','vnmlalo.f64','vnmlami.f64','vnmlapl.f64','vnmlavs.f64','vnmlavc.f64','vnmlahi.f64','vnmlals.f64','vnmlage.f64','vnmlalt.f64','vnmlagt.f64','vnmlale.f64',
+
+ 'vnmlseq.f32','vnmlsne.f32','vnmlscs.f32','vnmlshs.f32','vnmlscc.f32','vnmlslo.f32','vnmlsmi.f32','vnmlspl.f32','vnmlsvs.f32','vnmlsvc.f32','vnmlshi.f32','vnmlsls.f32','vnmlsge.f32','vnmlslt.f32','vnmlsgt.f32','vnmlsle.f32',
+ 'vnmlseq.f64','vnmlsne.f64','vnmlscs.f64','vnmlshs.f64','vnmlscc.f64','vnmlslo.f64','vnmlsmi.f64','vnmlspl.f64','vnmlsvs.f64','vnmlsvc.f64','vnmlshi.f64','vnmlsls.f64','vnmlsge.f64','vnmlslt.f64','vnmlsgt.f64','vnmlsle.f64',
+
+ 'vnmuleq.f64','vnmulne.f64','vnmulcs.f64','vnmulhs.f64','vnmulcc.f64','vnmullo.f64','vnmulmi.f64','vnmulpl.f64','vnmulvs.f64','vnmulvc.f64','vnmulhi.f64','vnmulls.f64','vnmulge.f64','vnmullt.f64','vnmulgt.f64','vnmulle.f64',
+ 'vnmuleq.f32','vnmulne.f32','vnmulcs.f32','vnmulhs.f32','vnmulcc.f32','vnmullo.f32','vnmulmi.f32','vnmulpl.f32','vnmulvs.f32','vnmulvc.f32','vnmulhi.f32','vnmulls.f32','vnmulge.f32','vnmullt.f32','vnmulgt.f32','vnmulle.f32',
+
+ 'vpaddeq.f32','vpaddne.f32','vpaddcs.f32','vpaddhs.f32','vpaddcc.f32','vpaddlo.f32','vpaddmi.f32','vpaddpl.f32','vpaddvs.f32','vpaddvc.f32','vpaddhi.f32','vpaddls.f32','vpaddge.f32','vpaddlt.f32','vpaddgt.f32','vpaddle.f32',
+
+ 'vpmaxeq.f32','vpmaxne.f32','vpmaxcs.f32','vpmaxhs.f32','vpmaxcc.f32','vpmaxlo.f32','vpmaxmi.f32','vpmaxpl.f32','vpmaxvs.f32','vpmaxvc.f32','vpmaxhi.f32','vpmaxls.f32','vpmaxge.f32','vpmaxlt.f32','vpmaxgt.f32','vpmaxle.f32',
+ 'vpmineq.f32','vpminne.f32','vpmincs.f32','vpminhs.f32','vpmincc.f32','vpminlo.f32','vpminmi.f32','vpminpl.f32','vpminvs.f32','vpminvc.f32','vpminhi.f32','vpminls.f32','vpminge.f32','vpminlt.f32','vpmingt.f32','vpminle.f32',
+
+ 'vrecpeeq.u32','vrecpene.u32','vrecpecs.u32','vrecpehs.u32','vrecpecc.u32','vrecpelo.u32','vrecpemi.u32','vrecpepl.u32','vrecpevs.u32','vrecpevc.u32','vrecpehi.u32','vrecpels.u32','vrecpege.u32','vrecpelt.u32','vrecpegt.u32','vrecpele.u32',
+ 'vrecpeeq.f32','vrecpene.f32','vrecpecs.f32','vrecpehs.f32','vrecpecc.f32','vrecpelo.f32','vrecpemi.f32','vrecpepl.f32','vrecpevs.f32','vrecpevc.f32','vrecpehi.f32','vrecpels.f32','vrecpege.f32','vrecpelt.f32','vrecpegt.f32','vrecpele.f32',
+ 'vrecpseq.f32','vrecpsne.f32','vrecpscs.f32','vrecpshs.f32','vrecpscc.f32','vrecpslo.f32','vrecpsmi.f32','vrecpspl.f32','vrecpsvs.f32','vrecpsvc.f32','vrecpshi.f32','vrecpsls.f32','vrecpsge.f32','vrecpslt.f32','vrecpsgt.f32','vrecpsle.f32',
+
+ 'vrsqrteeq.u32','vrsqrtene.u32','vrsqrtecs.u32','vrsqrtehs.u32','vrsqrtecc.u32','vrsqrtelo.u32','vrsqrtemi.u32','vrsqrtepl.u32','vrsqrtevs.u32','vrsqrtevc.u32','vrsqrtehi.u32','vrsqrtels.u32','vrsqrtege.u32','vrsqrtelt.u32','vrsqrtegt.u32','vrsqrtele.u32',
+ 'vrsqrteeq.f32','vrsqrtene.f32','vrsqrtecs.f32','vrsqrtehs.f32','vrsqrtecc.f32','vrsqrtelo.f32','vrsqrtemi.f32','vrsqrtepl.f32','vrsqrtevs.f32','vrsqrtevc.f32','vrsqrtehi.f32','vrsqrtels.f32','vrsqrtege.f32','vrsqrtelt.f32','vrsqrtegt.f32','vrsqrtele.f32',
+ 'vrsqrtseq.f32','vrsqrtsne.f32','vrsqrtscs.f32','vrsqrtshs.f32','vrsqrtscc.f32','vrsqrtslo.f32','vrsqrtsmi.f32','vrsqrtspl.f32','vrsqrtsvs.f32','vrsqrtsvc.f32','vrsqrtshi.f32','vrsqrtsls.f32','vrsqrtsge.f32','vrsqrtslt.f32','vrsqrtsgt.f32','vrsqrtsle.f32',
+
+ 'vsqrteq.f32','vsqrtne.f32','vsqrtcs.f32','vsqrths.f32','vsqrtcc.f32','vsqrtlo.f32','vsqrtmi.f32','vsqrtpl.f32','vsqrtvs.f32','vsqrtvc.f32','vsqrthi.f32','vsqrtls.f32','vsqrtge.f32','vsqrtlt.f32','vsqrtgt.f32','vsqrtle.f32',
+ 'vsqrteq.f64','vsqrtne.f64','vsqrtcs.f64','vsqrths.f64','vsqrtcc.f64','vsqrtlo.f64','vsqrtmi.f64','vsqrtpl.f64','vsqrtvs.f64','vsqrtvc.f64','vsqrthi.f64','vsqrtls.f64','vsqrtge.f64','vsqrtlt.f64','vsqrtgt.f64','vsqrtle.f64',
+
+ 'vsubeq.f32','vsubne.f32','vsubcs.f32','vsubhs.f32','vsubcc.f32','vsublo.f32','vsubmi.f32','vsubpl.f32','vsubvs.f32','vsubvc.f32','vsubhi.f32','vsubls.f32','vsubge.f32','vsublt.f32','vsubgt.f32','vsuble.f32',
+ 'vsubeq.f64','vsubne.f64','vsubcs.f64','vsubhs.f64','vsubcc.f64','vsublo.f64','vsubmi.f64','vsubpl.f64','vsubvs.f64','vsubvc.f64','vsubhi.f64','vsubls.f64','vsubge.f64','vsublt.f64','vsubgt.f64','vsuble.f64'
+ ),
+ /* Registers */
+ 35 => array(
+ /* General-Purpose Registers */
+ 'r0','r1','r2','r3','r4','r5','r6','r7',
+ 'r8','r9','r10','r11','r12','r13','r14','r15',
+ /* Scratch Registers */
+ 'a1','a2','a3','a4',
+ /* Variable Registers */
+ 'v1','v2','v3','v4','v5','v6','v7','v8',
+ /* Other Synonims for General-Purpose Registers */
+ 'sb','sl','fp','ip','sp','lr','pc',
+ /* WMMX Data Registers */
+ 'wr0','wr1','wr2','wr3','wr4','wr5','wr6','wr7',
+ 'wr8','wr9','wr10','wr11','wr12','wr13','wr14','wr15',
+ /* WMMX Control Registers */
+ 'wcid','wcon','wcssf','wcasf',
+ /* WMMX-Mapped General-Purpose Registers */
+ 'wcgr0','wcgr1','wcgr2','wcgr3',
+ /* VFPv3 Registers */
+ 's0','s1','s2','s3','s4','s5','s6','s7',
+ 's8','s9','s10','s11','s12','s13','s14','s15',
+ 's16','s17','s18','s19','s20','s21','s22','s23',
+ 's24','s25','s26','s27','s28','s29','s30','s31',
+ /* VFPv3/NEON Registers */
+ 'd0','d1','d2','d3','d4','d5','d6','d7',
+ 'd8','d9','d10','d11','d12','d13','d14','d15',
+ 'd16','d17','d18','d19','d20','d21','d22','d23',
+ 'd24','d25','d26','d27','d28','d29','d30','d31',
+ /* NEON Registers */
+ 'q0','q1','q2','q3','q4','q5','q6','q7',
+ 'q8','q9','q10','q11','q12','q13','q14','q15'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '(', ')',
+ '+', '-', '*', '/', '%',
+ '.', ',', ';', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ 9 => false,
+ 10 => false,
+ 11 => false,
+ 12 => false,
+ 13 => false,
+ 14 => false,
+ 15 => false,
+ 16 => false,
+ 17 => false,
+ 18 => false,
+ 19 => false,
+ 20 => false,
+ 21 => false,
+ 22 => false,
+ 23 => false,
+ 24 => false,
+ 25 => false,
+ 26 => false,
+ 27 => false,
+ 28 => false,
+ 29 => false,
+ 30 => false,
+ 31 => false,
+ 32 => false,
+ 33 => false,
+ 34 => false,
+ 35 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ /* Unconditional Data Processing Instructions */
+ 1 => 'color: #00007f; font-weight: normal; font-style: normal;',
+ /* Conditional Data Processing Instructions */
+ 2 => 'color: #00007f; font-weight: normal; font-style: italic;',
+ /* Unconditional Memory Access Instructions */
+ 3 => 'color: #00007f; font-weight: normal; font-style: normal;',
+ /* Conditional Memory Access Instructions */
+ 4 => 'color: #00007f; font-weight: normal; font-style: italic;',
+ /* Unconditional Flags Changing Instructions */
+ 5 => 'color: #00007f; font-weight: bold; font-style: normal;',
+ /* Conditional Flags Changing Instructions */
+ 6 => 'color: #00007f; font-weight: bold; font-style: italic;',
+ /* Unconditional Flow Control Instructions */
+ 7 => 'color: #0000ff; font-weight: normal; font-style: normal;',
+ /* Conditional Flow Control Instructions */
+ 8 => 'color: #0000ff; font-weight: normal; font-style: italic;',
+ /* Unconditional Syncronization Instructions */
+ 9 => 'color: #00007f; font-weight: normal; font-style: normal;',
+ /* Conditional Syncronization Instructions */
+ 10 => 'color: #00007f; font-weight: normal; font-style: italic;',
+ /* Unonditional ARMv6 SIMD */
+ 11 => 'color: #b00040; font-weight: normal; font-style: normal;',
+ /* Conditional ARMv6 SIMD */
+ 12 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional Coprocessor Instructions */
+ 13 => 'color: #00007f; font-weight: normal; font-style: normal;',
+ /* Conditional Coprocessor Instructions */
+ 14 => 'color: #00007f; font-weight: bold; font-style: italic;',
+ /* Unconditional System Instructions */
+ 15 => 'color: #00007f; font-weight: normal; font-style: normal;',
+ /* Conditional System Instructions */
+ 16 => 'color: #00007f; font-weight: bold; font-style: italic;',
+ /* Unconditional WMMX/WMMX2 SIMD Instructions */
+ 17 => 'color: #b00040; font-weight: normal; font-style: normal;',
+ /* Conditional WMMX/WMMX2 SIMD Instructions */
+ 18 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional VFPv3 & NEON SIMD Memory Access Instructions */
+ 19 => 'color: #b00040; font-weight: normal; font-style: normal;',
+ /* Unconditional NEON SIMD Logical Instructions */
+ 20 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional NEON SIMD ARM Registers Interop Instructions */
+ 21 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional NEON SIMD Bit/Byte-Level Instructions */
+ 22 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional NEON SIMD Universal Integer Instructions */
+ 23 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional NEON SIMD Signed Integer Instructions */
+ 24 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional NEON SIMD Unsigned Integer Instructions */
+ 25 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional VFPv3 & NEON SIMD Floating-Point Instructions */
+ 26 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional VFPv3 & NEON SIMD Memory Access Instructions */
+ 27 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD Logical Instructions */
+ 28 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD ARM Registers Interop Instructions */
+ 29 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD Bit/Byte-Level Instructions */
+ 30 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD Universal Integer Instructions */
+ 31 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD Signed Integer Instructions */
+ 32 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD Unsigned Integer Instructions */
+ 33 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional VFPv3 & NEON SIMD Floating-Point Instructions */
+ 34 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Registers */
+ 35 => 'color: #46aa03; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #adadad; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ 9 => '',
+ 10 => '',
+ 11 => '',
+ 12 => '',
+ 13 => '',
+ 14 => '',
+ 15 => '',
+ 16 => '',
+ 17 => '',
+ 18 => '',
+ 19 => '',
+ 20 => '',
+ 21 => '',
+ 22 => '',
+ 23 => '',
+ 24 => '',
+ 25 => '',
+ 26 => '',
+ 27 => '',
+ 28 => '',
+ 29 => '',
+ 30 => '',
+ 31 => '',
+ 32 => '',
+ 33 => '',
+ 34 => '',
+ 35 => ''
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_BIN_PREFIX_PERCENT |
+ GESHI_NUMBER_BIN_SUFFIX |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_HEX_SUFFIX |
+ GESHI_NUMBER_OCT_SUFFIX |
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#>|^])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_<\|%])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/asm.php b/inc/geshi/asm.php
index d54e24023..dd0a7ec50 100644
--- a/inc/geshi/asm.php
+++ b/inc/geshi/asm.php
@@ -3,15 +3,56 @@
* asm.php
* -------
* Author: Tux (tux@inmail.cz)
- * Copyright: (c) 2004 Tux (http://tux.a4.cz/), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Copyright: (c) 2004 Tux (http://tux.a4.cz/),
+ * 2004-2009 Nigel McNie (http://qbnz.com/highlighter),
+ * 2009-2011 Benny Baumann (http://qbnz.com/highlighter),
+ * 2011 Dennis Yurichev (dennis@conus.info),
+ * 2011 Marat Dukhan (mdukhan3.at.gatech.dot.edu)
+ * Release Version: 1.0.8.11
* Date Started: 2004/07/27
*
* x86 Assembler language file for GeSHi.
- * Words are from SciTe configuration file (based on NASM syntax)
+ * Based on the following documents:
+ * - "Intel64 and IA-32 Architectures Programmer's Reference Manual
+ * Volume 2 (2A & 2B): Instructions Set Reference, A-Z",
+ * Order Number 25383-039US, May 2011
+ * - "Intel Advanced Vector Extensions Programming Reference",
+ * Order Number 319433-011, June 2011
+ * - "AMD64 Architecture Programmer's Manual Volume 3:
+ * General-Purpose and System Instructions", Publication No. 24594,
+ * Revision 3.15, November 2009
+ * - "AMD64 Architecture Programmer's Manual Volume 4:
+ * 128-Bit and 256-Bit Media Instructions", Publication No. 26568,
+ * Revision 3.12, May 2011
+ * - "AMD64 Architecture Programmer's Manual Volume 5:
+ * 64-Bit Media and x87 Floating-Point Instructions",
+ * Publication No. 26569, Revision 3.11, December 2009
+ * - "AMD64 Technology Lightweight Profiling Specification",
+ * Publication No. 43724, Revision 3.08, August 2010
+ * - "Application Note 108: Cyrix Extended MMX Instruction Set"
+ * - "VIA Padlock Programming Guide", 3rd May 2005
+ * - http://en.wikipedia.org/wiki/X86_instruction_listings
+ * - NASM 2.10rc8 Online Documenation at
+ * http://www.nasm.us/xdoc/2.10rc8/html/nasmdoc0.html
+ * Color scheme is taken from SciTE. Previous versions of this file
+ * also used words from SciTE configuration file (based on NASM syntax)
*
* CHANGES
* -------
+ * 2011/10/07
+ * - Rearranged instructions and registers into groups
+ * - Updated to support the following extensions
+ * - CMOV, BMI1, BMI2, TBM, FSGSBASE
+ * - LZCNT, TZCNT, POPCNT, MOVBE, CRC32
+ * - MMX, MMX+, EMMX
+ * - 3dnow!, 3dnow!+, 3dnow! Geode, 3dnow! Prefetch
+ * - SSE, SSE2, SSE3, SSSE3, SSE4A, SSE4.1, SSE4.2
+ * - AVX, AVX2, XOP, FMA3, FMA4, CVT16
+ * - VMX, SVM
+ * - AES, PCLMULQDQ, Padlock, RDRAND
+ * - Updated NASM macros and directives
+ * 2010/07/01 (1.0.8.11)
+ * - Added MMX/SSE/new x86-64 registers, MMX/SSE (up to 4.2) instructions
* 2008/05/23 (1.0.7.22)
* - Added description of extra language features (SF#1970248)
* 2004/11/27 (1.0.2)
@@ -55,26 +96,71 @@ $language_data = array (
'QUOTEMARKS' => array("'", '"'),
'ESCAPE_CHAR' => '',
'KEYWORDS' => array(
- /*CPU*/
+ /* General-Purpose */
1 => array(
- 'aaa','aad','aam','aas','adc','add','and','call','cbw','clc','cld','cli','cmc','cmp',
- 'cmps','cmpsb','cmpsw','cwd','daa','das','dec','div','esc','hlt','idiv','imul','in','inc',
- 'int','into','iret','ja','jae','jb','jbe','jc','jcxz','je','jg','jge','jl','jle','jmp',
- 'jna','jnae','jnb','jnbe','jnc','jne','jng','jnge','jnl','jnle','jno','jnp','jns','jnz',
- 'jo','jp','jpe','jpo','js','jz','lahf','lds','lea','les','lods','lodsb','lodsw','loop',
- 'loope','loopew','loopne','loopnew','loopnz','loopnzw','loopw','loopz','loopzw','mov',
- 'movs','movsb','movsw','mul','neg','nop','not','or','out','pop','popf','push','pushf',
- 'rcl','rcr','ret','retf','retn','rol','ror','sahf','sal','sar','sbb','scas','scasb','scasw',
- 'shl','shr','stc','std','sti','stos','stosb','stosw','sub','test','wait','xchg','xlat',
- 'xlatb','xor','bound','enter','ins','insb','insw','leave','outs','outsb','outsw','popa','pusha','pushw',
- 'arpl','lar','lsl','sgdt','sidt','sldt','smsw','str','verr','verw','clts','lgdt','lidt','lldt','lmsw','ltr',
- 'bsf','bsr','bt','btc','btr','bts','cdq','cmpsd','cwde','insd','iretd','iretdf','iretf',
- 'jecxz','lfs','lgs','lodsd','loopd','looped','loopned','loopnzd','loopzd','lss','movsd',
- 'movsx','movzx','outsd','popad','popfd','pushad','pushd','pushfd','scasd','seta','setae',
- 'setb','setbe','setc','sete','setg','setge','setl','setle','setna','setnae','setnb','setnbe',
- 'setnc','setne','setng','setnge','setnl','setnle','setno','setnp','setns','setnz','seto','setp',
- 'setpe','setpo','sets','setz','shld','shrd','stosd','bswap','cmpxchg','invd','invlpg','wbinvd','xadd','lock',
- 'rep','repe','repne','repnz','repz'
+ /* BCD instructions */
+ 'aaa','aad','aam','aas','daa','das',
+ /* Control flow instructions */
+ 'ja','jae','jb','jbe','jc','je','jg','jge','jl','jle','jmp','jna',
+ 'jnae','jnb','jnbe','jnc','jne','jng','jnge','jnl','jnle','jno','jnp','jns','jnz',
+ 'jo','jp','jpe','jpo','js','jz','jcxz','jecxz','jrcxz','loop','loope','loopne',
+ 'call','ret','enter','leave','syscall','sysenter','int','into',
+ /* Predicate instructions */
+ 'seta','setae','setb','setbe','setc','sete','setg','setge','setl','setle','setna',
+ 'setnae','setnb','setnbe','setnc','setne','setng','setnge','setnl','setnle','setno',
+ 'setnp','setns','setnz','seto','setp','setpe','setpo','sets','setz','salc',
+ /* Conditional move instructions */
+ 'cmovo','cmovno','cmovb','cmovc','cmovnae','cmovae','cmovnb','cmovnc','cmove','cmovz',
+ 'cmovne','cmovnz','cmovbe','cmovna','cmova','cmovnbe','cmovs','cmovns','cmovp','cmovpe',
+ 'cmovnp','cmovpo','cmovl','cmovnge','cmovge','cmovnl','cmovle','cmovng','cmovg','cmovnle',
+ /* ALU instructions */
+ 'add','sub','adc','sbb','neg','cmp','inc','dec','and','or','xor','not','test',
+ 'shl','shr','sal','sar','shld','shrd','rol','ror','rcl','rcr',
+ 'cbw','cwd','cwde','cdq','cdqe','cqo','bsf','bsr','bt','btc','btr','bts',
+ 'idiv','imul','div','mul','bswap','nop',
+ /* Memory instructions */
+ 'lea','mov','movsx','movsxd','movzx','xlatb','bound','xchg','xadd','cmpxchg','cmpxchg8b','cmpxchg16b',
+ /* Stack instructions */
+ 'push','pop','pusha','popa','pushad','popad','pushf','popf','pushfd','popfd','pushfq','popfq',
+ /* EFLAGS manipulations instructions */
+ 'clc','cld','stc','std','cmc','lahf','sahf',
+ /* Prefix instructions */
+ 'lock','rep','repe','repz','repne','repnz',
+ /* String instructions */
+ 'cmps','cmpsb','cmpsw',/*'cmpsd',*/ 'cmpsq', /*CMPSD conflicts with the SSE2 instructions of the same name*/
+ 'movs','movsb','movsw',/*'movsd',*/ 'movsq', /*MOVSD conflicts with the SSE2 instructions of the same name*/
+ 'scas','scasb','scasw','scasd','scasq',
+ 'stos','stosb','stosw','stosd','stosq',
+ 'lods','lodsb','lodsw','lodsd','lodsq',
+ /* Information instructions */
+ 'cpuid','rdtsc','rdtscp','rdpmc','xgetbv',
+ 'sgdt','sidt','sldt','smsw','str','lar',
+ /* LWP instructions */
+ 'llwpcb','slwpcb','lwpval','lwpins',
+ /* Instructions from miscellaneous extensions */
+ 'crc32','popcnt','lzcnt','tzcnt','movbe','pclmulqdq','rdrand',
+ /* FSGSBASE instructions */
+ 'rdfsbase','rdgsbase','wrfsbase','wrgsbase',
+ /* BMI1 instructions */
+ 'andn','bextr','blsi','blsmk','blsr',
+ /* BMI2 instructions */
+ 'bzhi','mulx','pdep','pext','rorx','sarx','shlx','shrx',
+ /* TBM instructions */
+ 'blcfill','blci','blcic','blcmsk','blcs','blsfill','blsic','t1mskc','tzmsk',
+ /* Legacy instructions */
+ 'arpl','ud2','lds','les','lfs','lgs','lss','lsl','verr','verw',
+ /* Privileged instructions */
+ 'cli','sti','clts','hlt','rsm','in','insb','insw','insd',
+ 'out','outsb','outsw','outsd','clflush','invd','invlpg','invpcid','wbinvd',
+ 'iret','iretd','iretq','sysexit','sysret','lidt','lgdt','lldt','lmsw','ltr',
+ 'monitor','mwait','rdmsr','wrmsr','swapgs',
+ 'fxsave','fxsave64','fxrstor','fxrstor64',
+ 'xsave','xsaveopt','xrstor','xsetbv','getsec',
+ /* VMX instructions */
+ 'invept','invvpid','vmcall','vmclear','vmlaunch','vmresume',
+ 'vmptrld','vmptrst','vmread','vmwrite','vmxoff','vmxon',
+ /* SVM (AMD-V) instructions */
+ 'invlpga','skinit','clgi','stgi','vmload','vmsave','vmmcall','vmrun'
),
/*FPU*/
2 => array(
@@ -87,56 +173,350 @@ $language_data = array (
'fsavew','fscale','fsqrt','fst','fstcw','fstenv','fstenvw','fstp','fstsw','fsub','fsubp',
'fsubr','fsubrp','ftst','fwait','fxam','fxch','fxtract','fyl2x','fyl2xp1',
'fsetpm','fcos','fldenvd','fnsaved','fnstenvd','fprem1','frstord','fsaved','fsin','fsincos',
- 'fstenvd','fucom','fucomp','fucompp'
+ 'fstenvd','fucom','fucomp','fucompp','ffreep',
+ /* FCMOV instructions */
+ 'fcomi','fcomip','fucomi','fucomip',
+ 'fcmovb','fcmove','fcmovbe','fcmovu','fcmovnb','fcmovne','fcmovnbe','fcmovnu',
+ /* SSE3 instructions */
+ 'fisttp'
),
- /*registers*/
+ /*SIMD*/
3 => array(
- 'ah','al','ax','bh','bl','bp','bx','ch','cl','cr0','cr2','cr3','cs','cx','dh','di','dl',
- 'dr0','dr1','dr2','dr3','dr6','dr7','ds','dx','eax','ebp','ebx','ecx','edi','edx',
- 'es','esi','esp','fs','gs','si','sp','ss','st','tr3','tr4','tr5','tr6','tr7'
+ /* MMX instructions */
+ 'movd','movq',
+ 'paddb','paddw','paddd','paddsb','paddsw','paddusb','paddusw',
+ 'psubb','psubw','psubd','psubsb','psubsw','psubusb','psubusw',
+ 'pand','pandn','por','pxor',
+ 'pcmpeqb','pcmpeqd','pcmpeqw','pcmpgtb','pcmpgtd','pcmpgtw',
+ 'pmaddwd','pmulhw','pmullw',
+ 'psllw','pslld','psllq','psrlw','psrld','psrlq','psraw','psrad',
+ 'packuswb','packsswb','packssdw',
+ 'punpcklbw','punpcklwd','punpckldq','punpckhbw','punpckhwd','punpckhdq',
+ 'emms',
+ /* MMX+ instructions */
+ 'pavgb','pavgw',
+ 'pextrw','pinsrw','pmovmskb',
+ 'pmaxsw','pmaxub','pminsw','pminub',
+ 'pmulhuw','psadbw','pshufw',
+ 'prefetchnta','prefetcht0','prefetcht1','prefetcht2',
+ 'maskmovq','movntq','sfence',
+ /* EMMX instructions (only available on Cyrix MediaGXm) */
+ 'paddsiw','psubsiw',
+ /*'pmulhrw',*/'pmachriw','pmulhriw', /* PMULHRW conflicts with the 3dnow! instruction of the same name */
+ 'pmagw','pdistib','paveb',
+ 'pmvzb','pmvnzb','pmvlzb','pmvgezb',
+ /* 3dnow! instructions! */
+ 'pfacc','pfadd','pfsub','pfsubr','pfmul',
+ 'pfcmpeq','pfcmpge','pfcmpgt',
+ 'pfmax','pfmin',
+ 'pfrcp','pfrcpit1','pfrcpit2','pfrsqit1','pfrsqrt',
+ 'pi2fd','pf2id',
+ 'pavgusb','pmulhrw',
+ 'femms',
+ /* 3dnow!+ instructions */
+ 'pfnacc','pfpnacc','pi2fw','pf2iw','pswapd',
+ /* 3dnow! Geode instructions */
+ 'pfrsqrtv','pfrcpv',
+ /* 3dnow! Prefetch instructions */
+ 'prefetch','prefetchw',
+ /* SSE instructions */
+ 'addss','addps','subss','subps',
+ 'mulss','mulps','divss','divps','sqrtss','sqrtps',
+ 'rcpss','rcpps','rsqrtss','rsqrtps',
+ 'maxss','maxps','minss','minps',
+ 'cmpss','comiss','ucomiss','cmpps',
+ 'cmpeqss','cmpltss','cmpless','cmpunordss','cmpneqss','cmpnltss','cmpnless','cmpordss',
+ 'cmpeqps','cmpltps','cmpleps','cmpunordps','cmpneqps','cmpnltps','cmpnleps','cmpordps',
+ 'andnps','andps','orps','xorps',
+ 'cvtsi2ss','cvtss2si','cvttss2si',
+ 'cvtpi2ps','cvtps2pi','cvttps2pi',
+ 'movss','movlps','movhps','movlhps','movhlps','movaps','movups','movntps','movmskps',
+ 'shufps','unpckhps','unpcklps',
+ 'ldmxcsr','stmxcsr',
+ /* SSE2 instructions */
+ 'addpd','addsd','subpd','subsd',
+ 'mulsd','mulpd','divsd','divpd','sqrtsd','sqrtpd',
+ 'maxsd','maxpd','minsd','minpd',
+ 'cmpsd','comisd','ucomisd','cmppd',
+ 'cmpeqsd','cmpltsd','cmplesd','cmpunordsd','cmpneqsd','cmpnltsd','cmpnlesd','cmpordsd',
+ 'cmpeqpd','cmpltpd','cmplepd','cmpunordpd','cmpneqpd','cmpnltpd','cmpnlepd','cmpordpd',
+ 'andnpd','andpd','orpd','xorpd',
+ 'cvtsd2ss','cvtpd2ps','cvtss2sd','cvtps2pd',
+ 'cvtdq2ps','cvtps2dq','cvttps2dq',
+ 'cvtdq2pd','cvtpd2dq','cvttpd2dq',
+ 'cvtsi2sd','cvtsd2si','cvttsd2si',
+ 'cvtpi2pd','cvtpd2pi','cvttpd2pi',
+ 'movsd','movlpd','movhpd','movapd','movupd','movntpd','movmskpd',
+ 'shufpd','unpckhpd','unpcklpd',
+ 'movnti','movdqa','movdqu','movntdq','maskmovdqu',
+ 'movdq2q','movq2dq',
+ 'paddq','psubq','pmuludq',
+ 'pslldq','psrldq',
+ 'punpcklqdq','punpckhqdq',
+ 'pshufhw','pshuflw','pshufd',
+ 'lfence','mfence',
+ /* SSE3 instructions */
+ 'addsubps','addsubpd',
+ 'haddps','haddpd','hsubps','hsubpd',
+ 'movsldup','movshdup','movddup',
+ 'lddqu',
+ /* SSSE3 instructions */
+ 'psignb','psignw','psignd',
+ 'pabsb','pabsw','pabsd',
+ 'palignr','pshufb',
+ 'pmulhrsw','pmaddubsw',
+ 'phaddw','phaddd','phaddsw',
+ 'phsubw','phsubd','phsubsw',
+ /* SSE4A instructions */
+ 'extrq','insertq','movntsd','movntss',
+ /* SSE4.1 instructions */
+ 'mpsadbw','phminposuw',
+ 'pmuldq','pmulld',
+ 'dpps','dppd',
+ 'blendps','blendpd','blendvps','blendvpd','pblendvb','pblendw',
+ 'pmaxsb','pmaxuw','pmaxsd','pmaxud','pminsb','pminuw','pminsd','pminud',
+ 'roundps','roundss','roundpd','roundsd',
+ 'insertps','pinsrb','pinsrd','pinsrq',
+ 'extractps','pextrb','pextrd','pextrq',
+ 'pmovsxbw','pmovsxbd','pmovsxbq','pmovsxwd','pmovsxwq','pmovsxdq',
+ 'pmovzxbw','pmovzxbd','pmovzxbq','pmovzxwd','pmovzxwq','pmovzxdq',
+ 'ptest',
+ 'pcmpeqq',
+ 'packusdw',
+ 'movntdqa',
+ /* SSE4.2 instructions */
+ 'pcmpgtq',
+ 'pcmpestri','pcmpestrm','pcmpistri','pcmpistrm',
+ /* AES instructions */
+ 'aesenc','aesenclast','aesdec','aesdeclast','aeskeygenassist','aesimc',
+ /* VIA Padlock instructions */
+ 'xcryptcbc','xcryptcfb','xcryptctr','xcryptecb','xcryptofb',
+ 'xsha1','xsha256','montmul','xstore',
+ /* AVX instructions */
+ 'vaddss','vaddps','vaddsd','vaddpd','vsubss','vsubps','vsubsd','vsubpd',
+ 'vaddsubps','vaddsubpd',
+ 'vhaddps','vhaddpd','vhsubps','vhsubpd',
+ 'vmulss','vmulps','vmulsd','vmulpd',
+ 'vmaxss','vmaxps','vmaxsd','vmaxpd','vminss','vminps','vminsd','vminpd',
+ 'vandps','vandpd','vandnps','vandnpd','vorps','vorpd','vxorps','vxorpd',
+ 'vblendps','vblendpd','vblendvps','vblendvpd',
+ 'vcmpss','vcomiss','vucomiss','vcmpsd','vcomisd','vucomisd','vcmpps','vcmppd',
+ 'vcmpeqss','vcmpltss','vcmpless','vcmpunordss','vcmpneqss','vcmpnltss','vcmpnless','vcmpordss',
+ 'vcmpeq_uqss','vcmpngess','vcmpngtss','vcmpfalsess','vcmpneq_oqss','vcmpgess','vcmpgtss','vcmptruess',
+ 'vcmpeq_osss','vcmplt_oqss','vcmple_oqss','vcmpunord_sss','vcmpneq_usss','vcmpnlt_uqss','vcmpnle_uqss','vcmpord_sss',
+ 'vcmpeq_usss','vcmpnge_uqss','vcmpngt_uqss','vcmpfalse_osss','vcmpneq_osss','vcmpge_oqss','vcmpgt_oqss','vcmptrue_usss',
+ 'vcmpeqps','vcmpltps','vcmpleps','vcmpunordps','vcmpneqps','vcmpnltps','vcmpnleps','vcmpordps',
+ 'vcmpeq_uqps','vcmpngeps','vcmpngtps','vcmpfalseps','vcmpneq_oqps','vcmpgeps','vcmpgtps','vcmptrueps',
+ 'vcmpeq_osps','vcmplt_oqps','vcmple_oqps','vcmpunord_sps','vcmpneq_usps','vcmpnlt_uqps','vcmpnle_uqps','vcmpord_sps',
+ 'vcmpeq_usps','vcmpnge_uqps','vcmpngt_uqps','vcmpfalse_osps','vcmpneq_osps','vcmpge_oqps','vcmpgt_oqps','vcmptrue_usps',
+ 'vcmpeqsd','vcmpltsd','vcmplesd','vcmpunordsd','vcmpneqsd','vcmpnltsd','vcmpnlesd','vcmpordsd',
+ 'vcmpeq_uqsd','vcmpngesd','vcmpngtsd','vcmpfalsesd','vcmpneq_oqsd','vcmpgesd','vcmpgtsd','vcmptruesd',
+ 'vcmpeq_ossd','vcmplt_oqsd','vcmple_oqsd','vcmpunord_ssd','vcmpneq_ussd','vcmpnlt_uqsd','vcmpnle_uqsd','vcmpord_ssd',
+ 'vcmpeq_ussd','vcmpnge_uqsd','vcmpngt_uqsd','vcmpfalse_ossd','vcmpneq_ossd','vcmpge_oqsd','vcmpgt_oqsd','vcmptrue_ussd',
+ 'vcmpeqpd','vcmpltpd','vcmplepd','vcmpunordpd','vcmpneqpd','vcmpnltpd','vcmpnlepd','vcmpordpd',
+ 'vcmpeq_uqpd','vcmpngepd','vcmpngtpd','vcmpfalsepd','vcmpneq_oqpd','vcmpgepd','vcmpgtpd','vcmptruepd',
+ 'vcmpeq_ospd','vcmplt_oqpd','vcmple_oqpd','vcmpunord_spd','vcmpneq_uspd','vcmpnlt_uqpd','vcmpnle_uqpd','vcmpord_spd',
+ 'vcmpeq_uspd','vcmpnge_uqpd','vcmpngt_uqpd','vcmpfalse_ospd','vcmpneq_ospd','vcmpge_oqpd','vcmpgt_oqpd','vcmptrue_uspd',
+ 'vcvtsd2ss','vcvtpd2ps','vcvtss2sd','vcvtps2pd',
+ 'vcvtsi2ss','vcvtss2si','vcvttss2si',
+ 'vcvtpi2ps','vcvtps2pi','vcvttps2pi',
+ 'vcvtdq2ps','vcvtps2dq','vcvttps2dq',
+ 'vcvtdq2pd','vcvtpd2dq','vcvttpd2dq',
+ 'vcvtsi2sd','vcvtsd2si','vcvttsd2si',
+ 'vcvtpi2pd','vcvtpd2pi','vcvttpd2pi',
+ 'vdivss','vdivps','vdivsd','vdivpd','vsqrtss','vsqrtps','vsqrtsd','vsqrtpd',
+ 'vdpps','vdppd',
+ 'vmaskmovps','vmaskmovpd',
+ 'vmovss','vmovsd','vmovaps','vmovapd','vmovups','vmovupd','vmovntps','vmovntpd',
+ 'vmovhlps','vmovlhps','vmovlps','vmovlpd','vmovhps','vmovhpd',
+ 'vmovsldup','vmovshdup','vmovddup',
+ 'vmovmskps','vmovmskpd',
+ 'vroundss','vroundps','vroundsd','vroundpd',
+ 'vrcpss','vrcpps','vrsqrtss','vrsqrtps',
+ 'vunpcklps','vunpckhps','vunpcklpd','vunpckhpd',
+ 'vbroadcastss','vbroadcastsd','vbroadcastf128',
+ 'vextractps','vinsertps','vextractf128','vinsertf128',
+ 'vshufps','vshufpd','vpermilps','vpermilpd','vperm2f128',
+ 'vtestps','vtestpd',
+ 'vpaddb','vpaddusb','vpaddsb','vpaddw','vpaddusw','vpaddsw','vpaddd','vpaddq',
+ 'vpsubb','vpsubusb','vpsubsb','vpsubw','vpsubusw','vpsubsw','vpsubd','vpsubq',
+ 'vphaddw','vphaddsw','vphaddd','vphsubw','vphsubsw','vphsubd',
+ 'vpsllw','vpslld','vpsllq','vpsrlw','vpsrld','vpsrlq','vpsraw','vpsrad',
+ 'vpand','vpandn','vpor','vpxor',
+ 'vpblendwb','vpblendw',
+ 'vpsignb','vpsignw','vpsignd',
+ 'vpavgb','vpavgw',
+ 'vpabsb','vpabsw','vpabsd',
+ 'vmovd','vmovq','vmovdqa','vmovdqu','vlddqu','vmovntdq','vmovntdqa','vmaskmovdqu',
+ 'vpmovsxbw','vpmovsxbd','vpmovsxbq','vpmovsxwd','vpmovsxwq','vpmovsxdq',
+ 'vpmovzxbw','vpmovzxbd','vpmovzxbq','vpmovzxwd','vpmovzxwq','vpmovzxdq',
+ 'vpackuswb','vpacksswb','vpackusdw','vpackssdw',
+ 'vpcmpeqb','vpcmpeqw','vpcmpeqd','vpcmpeqq','vpcmpgtb','vpcmpgtw','vpcmpgtd','vpcmpgtq',
+ 'vpmaddubsw','vpmaddwd',
+ 'vpmullw','vpmulhuw','vpmulhw','vpmulhrsw','vpmulld','vpmuludq','vpmuldq',
+ 'vpmaxub','vpmaxsb','vpmaxuw','vpmaxsw','vpmaxud','vpmaxsd',
+ 'vpminub','vpminsb','vpminuw','vpminsw','vpminud','vpminsd',
+ 'vpmovmskb','vptest',
+ 'vpunpcklbw','vpunpcklwd','vpunpckldq','vpunpcklqdq',
+ 'vpunpckhbw','vpunpckhwd','vpunpckhdq','vpunpckhqdq',
+ 'vpslldq','vpsrldq','vpalignr',
+ 'vpshufb','vpshuflw','vpshufhw','vpshufd',
+ 'vpextrb','vpextrw','vpextrd','vpextrq','vpinsrb','vpinsrw','vpinsrd','vpinsrq',
+ 'vpsadbw','vmpsadbw','vphminposuw',
+ 'vpcmpestri','vpcmpestrm','vpcmpistri','vpcmpistrm',
+ 'vpclmulqdq','vaesenc','vaesenclast','vaesdec','vaesdeclast','vaeskeygenassist','vaesimc',
+ 'vldmxcsr','vstmxcsr','vzeroall','vzeroupper',
+ /* AVX2 instructions */
+ 'vbroadcasti128','vpbroadcastb','vpbroadcastw','vpbroadcastd','vpbroadcastq',
+ 'vpblendd',
+ 'vpermd','vpermq','vperm2i128',
+ 'vextracti128','vinserti128',
+ 'vpmaskmovd','vpmaskmovq',
+ 'vpsllvd','vpsllvq','vpsravd','vpsrlvd',
+ 'vpgatherdd','vpgatherqd','vgatherdq','vgatherqq',
+ 'vpermps','vpermpd',
+ 'vgatherdpd','vgatherqpd','vgatherdps','vgatherqps',
+ /* XOP instructions */
+ 'vfrczss','vfrczps','vfrczsd','vfrczpd',
+ 'vpermil2ps','vperlil2pd',
+ 'vpcomub','vpcomb','vpcomuw','vpcomw','vpcomud','vpcomd','vpcomuq','vpcomq',
+ 'vphaddubw','vphaddbw','vphaddubd','vphaddbd','vphaddubq','vphaddbq',
+ 'vphadduwd','vphaddwd','vphadduwq','vphaddwq','vphaddudq','vphadddq',
+ 'vphsubbw','vphsubwd','vphsubdq',
+ 'vpmacsdd','vpmacssdd','vpmacsdql','vpmacssdql','vpmacsdqh','vpmacssdqh',
+ 'vpmacsww','vpmacssww','vpmacswd','vpmacsswd',
+ 'vpmadcswd','vpmadcsswd',
+ 'vpcmov','vpperm',
+ 'vprotb','vprotw','vprotd','vprotq',
+ 'vpshab','vpshaw','vpshad','vpshaq',
+ 'vpshlb','vpshlw','vpshld','vpshlq',
+ /* CVT16 instructions */
+ 'vcvtph2ps','vcvtps2ph',
+ /* FMA4 instructions */
+ 'vfmaddss','vfmaddps','vfmaddsd','vfmaddpd',
+ 'vfmsubss','vfmsubps','vfmsubsd','vfmsubpd',
+ 'vnfmaddss','vnfmaddps','vnfmaddsd','vnfmaddpd',
+ 'vnfmsubss','vnfmsubps','vnfmsubsd','vnfmsubpd',
+ 'vfmaddsubps','vfmaddsubpd','vfmsubaddps','vfmsubaddpd',
+ /* FMA3 instructions */
+ 'vfmadd132ss','vfmadd213ss','vfmadd231ss',
+ 'vfmadd132ps','vfmadd213ps','vfmadd231ps',
+ 'vfmadd132sd','vfmadd213sd','vfmadd231sd',
+ 'vfmadd132pd','vfmadd213pd','vfmadd231pd',
+ 'vfmaddsub132ps','vfmaddsub213ps','vfmaddsub231ps',
+ 'vfmaddsub132pd','vfmaddsub213pd','vfmaddsub231pd',
+ 'vfmsubadd132ps','vfmsubadd213ps','vfmsubadd231ps',
+ 'vfmsubadd132pd','vfmsubadd213pd','vfmsubadd231pd',
+ 'vfmsub132ss','vfmsub213ss','vfmsub231ss',
+ 'vfmsub132ps','vfmsub213ps','vfmsub231ps',
+ 'vfmsub132sd','vfmsub213sd','vfmsub231sd',
+ 'vfmsub132pd','vfmsub213pd','vfmsub231pd',
+ 'vfnmadd132ss','vfnmadd213ss','vfnmadd231ss',
+ 'vfnmadd132ps','vfnmadd213ps','vfnmadd231ps',
+ 'vfnmadd132sd','vfnmadd213sd','vfnmadd231sd',
+ 'vfnmadd132pd','vfnmadd213pd','vfnmadd231pd',
+ 'vfnmsub132ss','vfnmsub213ss','vfnmsub231ss',
+ 'vfnmsub132ps','vfnmsub213ps','vfnmsub231ps',
+ 'vfnmsub132sd','vfnmsub213sd','vfnmsub231sd',
+ 'vfnmsub132pd','vfnmsub213pd','vfnmsub231pd'
),
- /*Directive*/
+ /*registers*/
4 => array(
- '186','286','286c','286p','287','386','386c','386p','387','486','486p',
- '8086','8087','alpha','break','code','const','continue','cref','data','data?',
- 'dosseg','else','elseif','endif','endw','err','err1','err2','errb',
- 'errdef','errdif','errdifi','erre','erridn','erridni','errnb','errndef',
- 'errnz','exit','fardata','fardata?','if','lall','lfcond','list','listall',
- 'listif','listmacro','listmacroall',' model','no87','nocref','nolist',
- 'nolistif','nolistmacro','radix','repeat','sall','seq','sfcond','stack',
- 'startup','tfcond','type','until','untilcxz','while','xall','xcref',
- 'xlist','alias','align','assume','catstr','comm','comment','db','dd','df','dq',
- 'dt','dup','dw','echo','elseif1','elseif2','elseifb','elseifdef','elseifdif',
- 'elseifdifi','elseife','elseifidn','elseifidni','elseifnb','elseifndef','end',
- 'endm','endp','ends','eq',' equ','even','exitm','extern','externdef','extrn','for',
- 'forc','ge','goto','group','high','highword','if1','if2','ifb','ifdef','ifdif',
- 'ifdifi','ife',' ifidn','ifidni','ifnb','ifndef','include','includelib','instr','invoke',
- 'irp','irpc','label','le','length','lengthof','local','low','lowword','lroffset',
- 'macro','mask','mod','msfloat','name','ne','offset','opattr','option','org','%out',
- 'page','popcontext','private','proc','proto','ptr','public','purge','pushcontext','record',
- 'rept','seg','segment','short','size','sizeof','sizestr','struc','struct',
- 'substr','subtitle','subttl','textequ','this','title','typedef','union','width',
- '.model', '.stack', '.code', '.data'
+ /* General-Purpose Registers */
+ 'al','ah','bl','bh','cl','ch','dl','dh','sil','dil','bpl','spl',
+ 'r8b','r9b','r10b','r11b','r12b','r13b','r14b','r15b',
+ 'ax','bx','cx','dx','si','di','bp','sp',
+ 'r8w','r9w','r10w','r11w','r12w','r13w','r14w','r15w',
+ 'eax','ebx','ecx','edx','esi','edi','ebp','esp',
+ 'r8d','r9d','r10d','r11d','r12d','r13d','r14d','r15d',
+ 'rax','rcx','rdx','rbx','rsp','rbp','rsi','rdi',
+ 'r8','r9','r10','r11','r12','r13','r14','r15',
+ /* Debug Registers */
+ 'dr0','dr1','dr2','dr3','dr6','dr7',
+ /* Control Registers */
+ 'cr0','cr2','cr3','cr4','cr8',
+ /* Test Registers (Supported on Intel 486 only) */
+ 'tr3','tr4','tr5','tr6','tr7',
+ /* Segment Registers */
+ 'cs','ds','es','fs','gs','ss',
+ /* FPU Registers */
+ 'st','st0','st1','st2','st3','st4','st5','st6','st7',
+ /* MMX Registers */
+ 'mm0','mm1','mm2','mm3','mm4','mm5','mm6','mm7',
+ /* SSE Registers */
+ 'xmm0','xmm1','xmm2','xmm3','xmm4','xmm5','xmm6','xmm7',
+ 'xmm8','xmm9','xmm10','xmm11','xmm12','xmm13','xmm14','xmm15',
+ /* AVX Registers */
+ 'ymm0','ymm1','ymm2','ymm3','ymm4','ymm5','ymm6','ymm7',
+ 'ymm8','ymm9','ymm10','ymm11','ymm12','ymm13','ymm14','ymm15'
),
- /*Operands*/
+ /*Directive*/
5 => array(
- '@b','@f','addr','basic','byte','c','carry?','dword',
- 'far','far16','fortran','fword','near','near16','overflow?','parity?','pascal','qword',
- 'real4',' real8','real10','sbyte','sdword','sign?','stdcall','sword','syscall','tbyte',
- 'vararg','word','zero?','flat','near32','far32',
- 'abs','all','assumes','at','casemap','common','compact',
- 'cpu','dotname','emulator','epilogue','error','export','expr16','expr32','farstack',
- 'forceframe','huge','language','large','listing','ljmp','loadds','m510','medium','memory',
- 'nearstack','nodotname','noemulator','nokeyword','noljmp','nom510','none','nonunique',
- 'nooldmacros','nooldstructs','noreadonly','noscoped','nosignextend','nothing',
- 'notpublic','oldmacros','oldstructs','os_dos','para','prologue',
- 'readonly','req','scoped','setif2','smallstack','tiny','use16','use32','uses'
+ 'db','dw','dd','dq','dt','do','dy',
+ 'resb','resw','resd','resq','rest','reso','resy','incbin','equ','times','safeseh',
+ '__utf16__','__utf32__',
+ 'default','cpu','float','start','imagebase','osabi',
+ '..start','..imagebase','..gotpc','..gotoff','..gottpoff','..got','..plt','..sym','..tlsie',
+ 'section','segment','__sect__','group','absolute',
+ '.bss','.comment','.data','.lbss','.ldata','.lrodata','.rdata','.rodata','.tbss','.tdata','.text',
+ 'alloc','bss','code','exec','data','noalloc','nobits','noexec','nowrite','progbits','rdata','tls','write',
+ 'private','public','common','stack','overlay','class',
+ 'extern','global','import','export',
+ '%define','%idefine','%xdefine','%ixdefine','%assign','%undef',
+ '%defstr','%idefstr','%deftok','%ideftok',
+ '%strcat','%strlen','%substr',
+ '%macro','%imacro','%rmacro','%exitmacro','%endmacro','%unmacro',
+ '%if','%ifn','%elif','%elifn','%else','%endif',
+ '%ifdef','%ifndef','%elifdef','%elifndef',
+ '%ifmacro','%ifnmacro','%elifmacro','%elifnmacro',
+ '%ifctx','%ifnctx','%elifctx','%elifnctx',
+ '%ifidn','%ifnidn','%elifidn','%elifnidn',
+ '%ifidni','%ifnidni','%elifidni','%elifnidni',
+ '%ifid','%ifnid','%elifid','%elifnid',
+ '%ifnum','%ifnnum','%elifnum','%elifnnum',
+ '%ifstr','%ifnstr','%elifstr','%elifnstr',
+ '%iftoken','%ifntoken','%eliftoken','%elifntoken',
+ '%ifempty','%ifnempty','%elifempty','%elifnempty',
+ '%ifenv','%ifnenv','%elifenv','%elifnenv',
+ '%rep','%exitrep','%endrep',
+ '%while','%exitwhile','%endwhile',
+ '%include','%pathsearch','%depend','%use',
+ '%push','%pop','%repl','%arg','%local','%stacksize','flat','flat64','large','small',
+ '%error','%warning','%fatal',
+ '%00','.nolist','%rotate','%line','%!','%final','%clear',
+ 'struc','endstruc','istruc','at','iend',
+ 'align','alignb','sectalign',
+ 'bits','use16','use32','use64',
+ '__nasm_major__','__nasm_minor__','__nasm_subminor__','___nasm_patchlevel__',
+ '__nasm_version_id__','__nasm_ver__',
+ '__file__','__line__','__pass__','__bits__','__output_format__',
+ '__date__','__time__','__date_num__','__time_num__','__posix_time__',
+ '__utc_date__','__utc_time__','__utc_date_num__','__utc_time_num__',
+ '__float_daz__','__float_round__','__float__',
+ /* Keywords from standard packages */
+ '__use_altreg__',
+ '__use_smartalign__','smartalign','__alignmode__',
+ '__use_fp__','__infinity__','__nan__','__qnan__','__snan__',
+ '__float8__','__float16__','__float32__','__float64__','__float80m__','__float80e__','__float128l__','__float128h__'
+ ),
+ /*Operands*/
+ 6 => array(
+ 'a16','a32','a64','o16','o32','o64','strict',
+ 'byte','word','dword','qword','tword','oword','yword','nosplit',
+ '%0','%1','%2','%3','%4','%5','%6','%7','%8','%9',
+ 'abs','rel',
+ 'seg','wrt'
)
),
'SYMBOLS' => array(
- '[', ']', '(', ')',
- '+', '-', '*', '/', '%',
- '.', ',', ';', ':'
+ 1 => array(
+ '[', ']', '(', ')',
+ '+', '-', '*', '/', '%',
+ '.', ',', ';', ':'
+ ),
+ 2 => array(
+ '$','$$','%+','%?','%??'
+ )
),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
@@ -144,19 +524,21 @@ $language_data = array (
2 => false,
3 => false,
4 => false,
- 5 => false
+ 5 => false,
+ 6 => false
),
'STYLES' => array(
'KEYWORDS' => array(
1 => 'color: #00007f; font-weight: bold;',
- 2 => 'color: #0000ff; font-weight: bold;',
- 3 => 'color: #00007f;',
- 4 => 'color: #000000; font-weight: bold;',
- 5 => 'color: #000000; font-weight: bold;'
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #b00040;',
+ 4 => 'color: #46aa03; font-weight: bold;',
+ 5 => 'color: #0000ff; font-weight: bold;',
+ 6 => 'color: #0000ff; font-weight: bold;'
),
'COMMENTS' => array(
1 => 'color: #666666; font-style: italic;',
- 2 => 'color: #adadad; font-style: italic;',
+ 2 => 'color: #adadad; font-style: italic;'
),
'ESCAPE_CHAR' => array(
0 => 'color: #000099; font-weight: bold;'
@@ -168,16 +550,15 @@ $language_data = array (
0 => 'color: #7f007f;'
),
'NUMBERS' => array(
- 0 => 'color: #0000ff;'
+ 0 => 'color: #ff0000;'
),
'METHODS' => array(
),
'SYMBOLS' => array(
- 0 => 'color: #339933;'
+ 1 => 'color: #339933;',
+ 2 => 'color: #0000ff; font-weight: bold;'
),
'REGEXPS' => array(
-// 0 => 'color: #0000ff;',
-// 1 => 'color: #0000ff;'
),
'SCRIPT' => array(
)
@@ -187,7 +568,8 @@ $language_data = array (
2 => '',
3 => '',
4 => '',
- 5 => ''
+ 5 => '',
+ 6 => ''
),
'NUMBERS' =>
GESHI_NUMBER_BIN_PREFIX_PERCENT |
@@ -203,10 +585,6 @@ $language_data = array (
'OBJECT_SPLITTERS' => array(
),
'REGEXPS' => array(
- //Hex numbers
-// 0 => /* */ "(?<=([\\s\\(\\)\\[\\],;.:+\\-\\/*]))(?:[0-9][0-9a-fA-F]{0,31}[hH]|0x[0-9a-fA-F]{1,32})(?=([\\s\\(\\)\\[\\],;.:+\\-\\/*]))",
- //Binary numbers
-// 1 => "(?<=([\\s\\(\\)\\[\\],;.:+\\-\\/*]))[01]{1,64}[bB](?=([\\s\\(\\)\\[\\],;.:+\\-\\/*]))"
),
'STRICT_MODE_APPLIES' => GESHI_NEVER,
'SCRIPT_DELIMITERS' => array(
@@ -222,4 +600,4 @@ $language_data = array (
)
);
-?>
+?> \ No newline at end of file
diff --git a/inc/geshi/asp.php b/inc/geshi/asp.php
index 4a9d6c8e2..0096a169c 100644
--- a/inc/geshi/asp.php
+++ b/inc/geshi/asp.php
@@ -4,7 +4,7 @@
* --------
* Author: Amit Gupta (http://blog.igeek.info/)
* Copyright: (c) 2004 Amit Gupta (http://blog.igeek.info/), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/13
*
* ASP language file for GeSHi.
diff --git a/inc/geshi/asymptote.php b/inc/geshi/asymptote.php
new file mode 100644
index 000000000..8683588e5
--- /dev/null
+++ b/inc/geshi/asymptote.php
@@ -0,0 +1,194 @@
+<?php
+/*************************************************************************************
+ * asymptote.php
+ * -------------
+ * Author: Manuel Yguel (manuel.yguel.robotics@gmail.com)
+ * Copyright: (c) 2012 Manuel Yguel (http://manuelyguel.eu)
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/05/24
+ *
+ * asymptote language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/05/24 (1.0.0.0)
+ * - First Release
+ *
+ * TODO (updated 2012/05/24)
+ * -------------------------
+ * * Split to several files - php4, php5 etc
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'asymptote',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\abfnrtv\'\"?\n]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'and','controls','tension','atleast','curl','if','else','while','for','do','return','break','continue','struct','typedef','new','access','import','unravel','from','include','quote','static','public','private','restricted','this','explicit','true','false','null','cycle','newframe','operator'
+ ),
+ 2 => array(
+ 'Braid','FitResult','Label','Legend','Segment','Solution','TreeNode','abscissa','arc','arrowhead','binarytree','binarytreeNode','block','bool','bool3','bounds','bqe','circle','conic','coord','coordsys','cputime','ellipse','file','filltype','frame','grid3','guide','horner','hsv','hyperbola','indexedTransform','int','inversion','key','light','line','linefit','marginT','marker','mass','object','pair','parabola','path','path3','pen','picture','point','position','projection','real','revolution','scaleT','scientific','segment','side','slice','solution','splitface','string','surface','tensionSpecifier','ticklocate','ticksgridT','tickvalues','transform','transformation','tree','triangle','trilinear','triple','vector','vertex','void'),
+ 3 => array(
+ 'AND','Arc','ArcArrow','ArcArrows','Arrow','Arrows','Automatic','AvantGarde','BBox','BWRainbow','BWRainbow2','Bar','Bars','BeginArcArrow','BeginArrow','BeginBar','BeginDotMargin','BeginMargin','BeginPenMargin','Blank','Bookman','Bottom','BottomTop','Bounds','Break','Broken','BrokenLog','CLZ','CTZ','Ceil','Circle','CircleBarIntervalMarker','Cos','Courier','CrossIntervalMarker','DOSendl','DOSnewl','DefaultFormat','DefaultLogFormat','Degrees','Dir','DotMargin','DotMargins','Dotted','Draw','Drawline','Embed','EndArcArrow','EndArrow','EndBar','EndDotMargin','EndMargin','EndPenMargin','Fill','FillDraw','Floor','Format','Full','Gaussian','Gaussrand','Gaussrandpair',
+ 'Gradient','Grayscale','Helvetica','Hermite','HookHead','InOutTicks','InTicks','Jn','Label','Landscape','Left','LeftRight','LeftTicks','Legend','Linear','Link','Log','LogFormat','Margin','Margins','Mark','MidArcArrow','MidArrow','NOT','NewCenturySchoolBook','NoBox','NoMargin','NoModifier','NoTicks','NoTicks3','NoZero','NoZeroFormat','None','OR','OmitFormat','OmitTick','OmitTickInterval','OmitTickIntervals','OutTicks','Ox','Oy','Palatino','PaletteTicks','Pen','PenMargin','PenMargins','Pentype','Portrait','RadialShade','RadialShadeDraw','Rainbow','Range','Relative','Right','RightTicks','Rotate','Round','SQR','Scale','ScaleX','ScaleY','ScaleZ','Seascape','Segment','Shift','Sin','Slant','Spline','StickIntervalMarker','Straight','Symbol','Tan','TeXify','Ticks','Ticks3','TildeIntervalMarker','TimesRoman','Top','TrueMargin','UnFill','UpsideDown','Wheel','X','XEquals','XOR','XY','XYEquals','XYZero','XYgrid','XZEquals','XZZero','XZero','XZgrid','Y','YEquals','YXgrid','YZ','YZEquals','YZZero','YZero','YZgrid','Yn','Z','ZX','ZXgrid','ZYgrid','ZapfChancery','ZapfDingbats','_begingroup3','_cputime','_draw','_eval','_image','_labelpath','_projection','_strokepath','_texpath','aCos','aSin','aTan','abort','abs','accel','acos','acosh','acot','acsc','activatequote','add',
+ 'addArrow','addMargins','addSaveFunction','addpenarc','addpenline','adjust','alias','align','all','altitude','angabscissa','angle','angpoint','animate','annotate','anticomplementary','antipedal','apply','approximate','arc','arcarrowsize','arccircle','arcdir','arcfromcenter','arcfromfocus','arclength','arcnodesnumber','arcpoint','arcsubtended','arcsubtendedcenter','arctime','arctopath','array','arrow','arrow2','arrowbase','arrowbasepoints','arrowsize','asec','asin','asinh','ask','assert','asy','asycode','asydir','asyfigure','asyfilecode','asyinclude','asywrite','atan','atan2','atanh','atbreakpoint','atexit','attach','attract','atupdate','autoformat','autoscale','autoscale3','axes','axes3','axialshade','axis','axiscoverage','azimuth','babel','background','bangles','bar','barmarksize','barsize','basealign','baseline','bbox','beep','begin','beginclip','begingroup','beginpoint','between','bevel','bezier','bezierP','bezierPP','bezierPPP','bezulate','bibliography','bibliographystyle','binarytree','binarytreeNode','binomial','binput','bins','bisector','bisectorpoint','bispline','blend','blockconnector','boutput','box','bqe','breakpoint','breakpoints','brick','buildRestoreDefaults','buildRestoreThunk','buildcycle','bulletcolor','byte','calculateScaling','canonical','canonicalcartesiansystem','cartesiansystem','case1','case2','case3','case4','cbrt','cd','ceil','center','centerToFocus',
+ 'centroid','cevian','change2','changecoordsys','checkSegment','checkconditionlength','checker','checkincreasing','checklengths','checkposition','checktriangle','choose','circle','circlebarframe','circlemarkradius','circlenodesnumber','circumcenter','circumcircle','clamped','clear','clip','clipdraw','close','cmyk','code','colatitude','collect','collinear','color','colorless','colors','colorspace','comma','compassmark','complement','complementary','concat','concurrent','cone','conic','conicnodesnumber','conictype','conj','connect','connected','connectedindex','containmentTree','contains','contour','contour3','contouredges','controlSpecifier','convert','coordinates','coordsys','copy','copyPairOrTriple','cos','cosh','cot','countIntersections','cputime','crop','cropcode','cross',
+ 'crossframe','crosshatch','crossmarksize','csc','cubicroots','curabscissa','curlSpecifier','curpoint','currentarrow','currentexitfunction','currentmomarrow','currentpolarconicroutine','curve','cut','cutafter','cutbefore','cyclic','cylinder','deactivatequote','debugger','deconstruct','defaultdir','defaultformat','defaultpen','defined','degenerate','degrees','delete','deletepreamble','determinant','diagonal','diamond','diffdiv','dir','dirSpecifier','dirtime','display','distance',
+ 'divisors','do_overpaint','dot','dotframe','dotsize','downcase','draw','drawAll','drawDoubleLine','drawFermion','drawGhost','drawGluon','drawMomArrow','drawPRCcylinder','drawPRCdisk','drawPRCsphere','drawPRCtube','drawPhoton','drawScalar','drawVertex','drawVertexBox','drawVertexBoxO','drawVertexBoxX','drawVertexO','drawVertexOX','drawVertexTriangle','drawVertexTriangleO','drawVertexX','drawarrow','drawarrow2','drawline','drawpixel','drawtick','duplicate','elle','ellipse','ellipsenodesnumber','embed','embed3','empty','enclose','end','endScript','endclip','endgroup','endgroup3','endl','endpoint','endpoints','eof','eol','equation','equations','erase','erasestep','erf','erfc','error','errorbar','errorbars','eval','excenter','excircle','exit','exitXasyMode','exitfunction','exp','expfactors','expi','expm1','exradius','extend','extension','extouch','fabs','factorial','fermat','fft','fhorner','figure','file','filecode','fill','filldraw','filloutside','fillrule','filltype','find','finite','finiteDifferenceJacobian','firstcut','firstframe','fit','fit2','fixedscaling','floor','flush','fmdefaults','fmod','focusToCenter','font','fontcommand','fontsize','foot','format','frac','frequency','fromCenter','fromFocus','fspline','functionshade','gamma','generate_random_backtrace','generateticks','gergonne','getc','getint','getpair','getreal','getstring','gettriple','gluon','gouraudshade','graph','graphic','gray','grestore','grid','grid3','gsave','halfbox','hatch','hdiffdiv','hermite','hex','histogram','history','hline','hprojection',
+ 'hsv','hyperbola','hyperbolanodesnumber','hyperlink','hypot','identity','image','incenter','incentral','incircle','increasing','incrementposition','indexedTransform','indexedfigure','initXasyMode','initdefaults','input','inradius','insert','inside','integrate','interactive','interior','interp','interpolate','intersect','intersection','intersectionpoint','intersectionpoints','intersections','intouch','inverse','inversion','invisible','is3D','isCCW','isDuplicate','isogonal','isogonalconjugate','isotomic','isotomicconjugate','isparabola','italic','item','jobname','key','kurtosis','kurtosisexcess','label','labelaxis','labelmargin','labelpath','labels','labeltick','labelx','labelx3','labely','labely3','labelz','labelz3','lastcut','latex','latitude','latticeshade','layer','layout','ldexp','leastsquares','legend','legenditem','length','lexorder','lift','light','limits','line','linear','linecap','lineinversion','linejoin','linemargin','lineskip','linetype','linewidth','link','list','lm_enorm','lm_evaluate_default','lm_lmdif','lm_lmpar','lm_minimize','lm_print_default','lm_print_quiet','lm_qrfac','lm_qrsolv','locale','locate',
+ 'locatefile','location','log','log10','log1p','logaxiscoverage','longitude','lookup','makeNode','makedraw','makepen','map','margin','markangle','markangleradius','markanglespace','markarc','marker','markinterval','marknodes','markrightangle','markuniform','mass','masscenter','massformat','math','max','max3','maxAfterTransform','maxbezier','maxbound','maxcoords','maxlength','maxratio','maxtimes','mean','medial','median','midpoint','min','min3','minAfterTransform','minbezier','minbound','minipage','minratio','mintimes','miterlimit','mktemp','momArrowPath','momarrowsize','monotonic','multifigure','nativeformat','natural','needshipout','newl','newpage','newslide','newton','newtree','nextframe','nextnormal','nextpage','nib','nodabscissa','none','norm','normalvideo','notaknot','nowarn','numberpage','nurb','object','offset','onpath','opacity','opposite','orientation','origin','orthic','orthocentercenter','outformat','outline','outname','outprefix','output','overloadedMessage','overwrite','pack','pad','pairs','palette','parabola','parabolanodesnumber','parallel','parallelogram','partialsum','path','path3','pattern','pause','pdf','pedal','periodic','perp','perpendicular','perpendicularmark','phantom','phi1','phi2','phi3','photon','piecewisestraight','point','polar','polarconicroutine','polargraph','polygon','postcontrol','postscript','pow10','ppoint','prc','prc0','precision','precontrol','prepend','printBytecode','print_random_addresses','project','projection','purge','pwhermite','quadrant','quadraticroots','quantize','quarticroots','quotient','radialshade','radians','radicalcenter','radicalline','radius','rand','randompath','rd','readline','realmult','realquarticroots','rectangle','rectangular','rectify','reflect','relabscissa','relative','relativedistance','reldir','relpoint','reltime','remainder','remark','removeDuplicates','rename','replace','report','resetdefaultpen','restore','restoredefaults','reverse','reversevideo','rf','rfind','rgb','rgba','rgbint','rms',
+ 'rotate','rotateO','rotation','round','roundbox','roundedpath','roundrectangle','same','samecoordsys','sameside','sample','save','savedefaults','saveline','scale','scale3','scaleO','scaleT','scaleless','scientific','search','searchindex','searchtree','sec','secondaryX','secondaryY','seconds','section','sector','seek','seekeof','segment','sequence','setcontour','setpens','sgn','sgnd','sharpangle','sharpdegrees','shift','shiftless','shipout','shipout3','show','side','simeq','simpson','sin','sinh','size','size3','skewness','skip','slant','sleep','slope','slopefield','solve','solveBVP','sort','sourceline','sphere','split','sqrt','square','srand','standardizecoordsys','startScript','stdev','step','stickframe','stickmarksize','stickmarkspace','stop','straight','straightness','string','stripdirectory','stripextension','stripfile','stripsuffix','strokepath','subdivide','subitem','subpath','substr','sum','surface','symmedial','symmedian','system',
+ 'tab','tableau','tan','tangent','tangential','tangents','tanh','tell','tensionSpecifier','tensorshade','tex','texcolor','texify','texpath','texpreamble','texreset','texshipout','texsize','textpath','thick','thin','tick','tickMax','tickMax3','tickMin','tickMin3','ticklabelshift','ticklocate','tildeframe','tildemarksize','tile','tiling','time','times','title','titlepage','topbox','transform','transformation','transpose','trembleFuzz','triangle','triangleAbc','triangleabc','triangulate','tricoef','tridiagonal','trilinear','trim','truepoint','tube','uncycle','unfill','uniform','unique','unit','unitrand','unitsize','unityroot','unstraighten','upcase','updatefunction','uperiodic','upscale','uptodate','usepackage','usersetting','usetypescript','usleep','value','variance','variancebiased','vbox','vector','vectorfield','verbatim','view','vline','vperiodic','vprojection','warn','warning','windingnumber','write','xaxis','xaxis3','xaxis3At','xaxisAt','xequals','xinput','xlimits','xoutput','xpart','xscale','xscaleO','xtick','xtick3','xtrans','yaxis','yaxis3','yaxis3At','yaxisAt','yequals','ylimits','ypart','yscale','yscaleO','ytick','ytick3','ytrans','zaxis3','zaxis3At','zero','zero3','zlimits','zpart','ztick','ztick3','ztrans'
+ ),
+ 4 => array(
+ 'AliceBlue','Align','Allow','AntiqueWhite','Apricot','Aqua','Aquamarine','Aspect','Azure','BeginPoint','Beige','Bisque','Bittersweet','Black','BlanchedAlmond','Blue','BlueGreen','BlueViolet','Both','Break','BrickRed','Brown','BurlyWood','BurntOrange','CCW','CW','CadetBlue','CarnationPink','Center','Centered','Cerulean','Chartreuse','Chocolate','Coeff','Coral','CornflowerBlue','Cornsilk','Crimson','Crop','Cyan','Dandelion','DarkBlue','DarkCyan','DarkGoldenrod','DarkGray','DarkGreen','DarkKhaki','DarkMagenta','DarkOliveGreen','DarkOrange','DarkOrchid','DarkRed','DarkSalmon','DarkSeaGreen','DarkSlateBlue','DarkSlateGray','DarkTurquoise','DarkViolet','DeepPink','DeepSkyBlue','DefaultHead','DimGray','DodgerBlue','Dotted','Down','Draw','E','ENE','EPS','ESE','E_Euler','E_PC','E_RK2','E_RK3BS','Emerald','EndPoint','Euler','Fill','FillDraw','FireBrick','FloralWhite','ForestGreen','Fuchsia','Gainsboro','GhostWhite','Gold','Goldenrod','Gray','Green','GreenYellow','Honeydew','HookHead','Horizontal','HotPink','I','IgnoreAspect','IndianRed','Indigo','Ivory','JOIN_IN','JOIN_OUT','JungleGreen','Khaki','LM_DWARF','LM_MACHEP','LM_SQRT_DWARF','LM_SQRT_GIANT','LM_USERTOL','Label','Lavender','LavenderBlush','LawnGreen','Left','LeftJustified','LeftSide','LemonChiffon','LightBlue','LightCoral','LightCyan','LightGoldenrodYellow',
+ 'LightGreen','LightGrey','LightPink','LightSalmon','LightSeaGreen','LightSkyBlue','LightSlateGray','LightSteelBlue','LightYellow','Lime','LimeGreen','Linear','Linen','Log','Logarithmic','Magenta','Mahogany','Mark','MarkFill','Maroon','Max','MediumAquamarine','MediumBlue','MediumOrchid','MediumPurple','MediumSeaGreen','MediumSlateBlue','MediumSpringGreen','MediumTurquoise','MediumVioletRed','Melon','MidPoint','MidnightBlue','Min','MintCream','MistyRose','Moccasin','Move','MoveQuiet','Mulberry','N','NE','NNE','NNW','NW','NavajoWhite','Navy','NavyBlue','NoAlign','NoCrop','NoFill','NoSide','OldLace','Olive','OliveDrab','OliveGreen','Orange','OrangeRed','Orchid','Ox','Oy','PC','PaleGoldenrod','PaleGreen','PaleTurquoise','PaleVioletRed','PapayaWhip','Peach','PeachPuff','Periwinkle','Peru','PineGreen','Pink','Plum','PowderBlue','ProcessBlue','Purple','RK2','RK3','RK3BS','RK4','RK5','RK5DP','RK5F','RawSienna','Red','RedOrange','RedViolet','Rhodamine','Right','RightJustified','RightSide','RosyBrown','RoyalBlue','RoyalPurple','RubineRed','S','SE','SSE','SSW','SW','SaddleBrown','Salmon','SandyBrown','SeaGreen','Seashell','Sepia','Sienna','Silver','SimpleHead','SkyBlue','SlateBlue','SlateGray','Snow','SpringGreen','SteelBlue','Suppress','SuppressQuiet','Tan','TeXHead','Teal','TealBlue','Thistle','Ticksize','Tomato',
+ 'Turquoise','UnFill','Up','VERSION','Value','Vertical','Violet','VioletRed','W','WNW','WSW','Wheat','White','WhiteSmoke','WildStrawberry','XYAlign','YAlign','Yellow','YellowGreen','YellowOrange','addpenarc','addpenline','align','allowstepping','angularsystem','animationdelay','appendsuffix','arcarrowangle','arcarrowfactor','arrow2sizelimit','arrowangle','arrowbarb','arrowdir','arrowfactor','arrowhookfactor','arrowlength','arrowsizelimit','arrowtexfactor','authorpen','axis','axiscoverage','axislabelfactor','background','backgroundcolor','backgroundpen','barfactor','barmarksizefactor','basealign','baselinetemplate','beveljoin','bigvertexpen','bigvertexsize','black','blue','bm','bottom','bp','brown','bullet','byfoci','byvertices','camerafactor','chartreuse','circlemarkradiusfactor','circlenodesnumberfactor','circleprecision','circlescale','cm','codefile','codepen','codeskip','colorPen','coloredNodes','coloredSegments',
+ 'conditionlength','conicnodesfactor','count','cputimeformat','crossmarksizefactor','currentcoordsys','currentlight','currentpatterns','currentpen','currentpicture','currentposition','currentprojection','curvilinearsystem','cuttings','cyan','darkblue','darkbrown','darkcyan','darkgray','darkgreen','darkgrey','darkmagenta','darkolive','darkred','dashdotted','dashed','datepen','dateskip','debuggerlines','debugging','deepblue','deepcyan','deepgray','deepgreen','deepgrey','deepmagenta','deepred','default','defaultControl','defaultS','defaultbackpen','defaultcoordsys','defaultexcursion','defaultfilename','defaultformat','defaultmassformat','defaultpen','diagnostics','differentlengths','dot','dotfactor','dotframe','dotted','doublelinepen','doublelinespacing','down','duplicateFuzz','edge','ellipsenodesnumberfactor','eps','epsgeo','epsilon','evenodd','expansionfactor','extendcap','exterior','fermionpen','figureborder','figuremattpen','file3','firstnode','firststep','foregroundcolor','fuchsia','fuzz','gapfactor','ghostpen','gluonamplitude','gluonpen','gluonratio','gray','green','grey','hatchepsilon','havepagenumber','heavyblue','heavycyan','heavygray','heavygreen','heavygrey','heavymagenta','heavyred','hline','hwratio','hyperbola','hyperbolanodesnumberfactor','identity4','ignore','inXasyMode','inch','inches','includegraphicscommand','inf','infinity','institutionpen','intMax','intMin','interior','invert','invisible','itempen','itemskip','itemstep','labelmargin','landscape','lastnode','left','legendhskip','legendlinelength',
+ 'legendmargin','legendmarkersize','legendmaxrelativewidth','legendvskip','lightblue','lightcyan','lightgray','lightgreen','lightgrey','lightmagenta','lightolive','lightred','lightyellow','line','linemargin','lm_infmsg','lm_shortmsg','longdashdotted','longdashed','magenta','magneticRadius','mantissaBits','markangleradius','markangleradiusfactor','markanglespace','markanglespacefactor','mediumblue','mediumcyan','mediumgray','mediumgreen','mediumgrey','mediummagenta','mediumred','mediumyellow','middle','minDistDefault','minblockheight','minblockwidth','mincirclediameter','minipagemargin','minipagewidth','minvertexangle','miterjoin','mm','momarrowfactor','momarrowlength','momarrowmargin','momarrowoffset','momarrowpen','monoPen','morepoints','nCircle','newbulletcolor','ngraph','nil','nmesh','nobasealign','nodeMarginDefault','nodesystem','nomarker','nopoint','noprimary','nullpath','nullpen','numarray','ocgindex','oldbulletcolor','olive','orange','origin','overpaint','page','pageheight','pagemargin','pagenumberalign','pagenumberpen','pagenumberposition','pagewidth','paleblue','palecyan','palegray','palegreen','palegrey',
+ 'palemagenta','palered','paleyellow','parabolanodesnumberfactor','perpfactor','phi','photonamplitude','photonpen','photonratio','pi','pink','plain','plain_bounds','plain_scaling','plus','preamblenodes','pt','purple','r3','r4a','r4b','randMax','realDigits','realEpsilon','realMax','realMin','red','relativesystem','reverse','right','roundcap','roundjoin','royalblue','salmon','saveFunctions','scalarpen','sequencereal','settings','shipped','signedtrailingzero','solid','springgreen','sqrtEpsilon','squarecap','squarepen','startposition','stdin','stdout','stepfactor','stepfraction','steppagenumberpen','stepping','stickframe','stickmarksizefactor','stickmarkspacefactor','swap','textpen','ticksize','tildeframe','tildemarksizefactor','tinv','titlealign','titlepagepen','titlepageposition','titlepen','titleskip','top','trailingzero','treeLevelStep','treeMinNodeWidth','treeNodeStep','trembleAngle','trembleFrequency','trembleRandom','undefined','unitcircle','unitsquare','up','urlpen','urlskip','version','vertexpen','vertexsize','viewportmargin','viewportsize','vline','white','wye','xformStack','yellow','ylabelwidth','zerotickfuzz','zerowinding'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '(', ')', '{', '}', '[', ']'
+ ),
+ 1 => array('<', '>','='),
+ 2 => array('+', '-', '*', '/', '%'),
+ 3 => array('!', '^', '&', '|'),
+ 4 => array('?', ':', ';'),
+ 5 => array('..')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #990000;',
+ 4 => 'color: #009900; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 2 => 'color: #339900;',
+ 'MULTI' => 'color: #ff0000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #660099; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #007788;',
+ 2 => 'color: #007788;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;',
+ 1 => 'color: #000080;',
+ 2 => 'color: #000040;',
+ 3 => 'color: #000040;',
+ 4 => 'color: #008080;',
+ 5 => 'color: #009080;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_\|%\\-])"
+ )
+ )
+);
+
+?>
diff --git a/inc/geshi/autoconf.php b/inc/geshi/autoconf.php
index 0883f9f54..7a0f1ee9c 100644
--- a/inc/geshi/autoconf.php
+++ b/inc/geshi/autoconf.php
@@ -4,7 +4,7 @@
* -----
* Author: Mihai Vasilian (grayasm@gmail.com)
* Copyright: (c) 2010 Mihai Vasilian
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/01/25
*
* autoconf language file for GeSHi.
diff --git a/inc/geshi/autohotkey.php b/inc/geshi/autohotkey.php
index 6a3528334..970684daf 100644
--- a/inc/geshi/autohotkey.php
+++ b/inc/geshi/autohotkey.php
@@ -4,7 +4,7 @@
* --------
* Author: Naveen Garg (naveen.garg@gmail.com)
* Copyright: (c) 2009 Naveen Garg and GeSHi
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/06/11
*
* Autohotkey language file for GeSHi.
diff --git a/inc/geshi/autoit.php b/inc/geshi/autoit.php
index c8ef4404b..ab401b4cd 100644
--- a/inc/geshi/autoit.php
+++ b/inc/geshi/autoit.php
@@ -4,7 +4,7 @@
* --------
* Author: big_daddy (robert.i.anthony@gmail.com)
* Copyright: (c) 2006 and to GESHi ;)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/01/26
*
* AutoIT language file for GeSHi.
diff --git a/inc/geshi/avisynth.php b/inc/geshi/avisynth.php
index f74f50c3a..88f662886 100644
--- a/inc/geshi/avisynth.php
+++ b/inc/geshi/avisynth.php
@@ -4,7 +4,7 @@
* --------
* Author: Ryan Jones (sciguyryan@gmail.com)
* Copyright: (c) 2008 Ryan Jones
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/10/08
*
* AviSynth language file for GeSHi.
diff --git a/inc/geshi/awk.php b/inc/geshi/awk.php
index 5d540315c..1ec239b70 100644
--- a/inc/geshi/awk.php
+++ b/inc/geshi/awk.php
@@ -4,7 +4,7 @@
* -------
* Author: George Pollard (porges@porg.es)
* Copyright: (c) 2009 George Pollard
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/01/28
*
* Awk language file for GeSHi.
diff --git a/inc/geshi/bascomavr.php b/inc/geshi/bascomavr.php
new file mode 100644
index 000000000..864f74e8d
--- /dev/null
+++ b/inc/geshi/bascomavr.php
@@ -0,0 +1,185 @@
+<?php
+/*************************************************************************************
+ * bascomavr.php
+ * ---------------------------------
+ * Author: aquaticus.info
+ * Copyright: (c) 2008 aquaticus.info
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/01/09
+ *
+ * BASCOM AVR language file for GeSHi.
+ *
+ * You can find the BASCOM AVR Website at (www.mcselec.com/bascom-avr.htm)
+ *
+ * CHANGES
+ * -------
+ * 2008/01/09 (1.0.8.10)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'BASCOM AVR',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ // Navy Blue Bold Keywords
+ '1WRESET' , '1WREAD' , '1WWRITE' , '1WSEARCHFIRST' , '1WSEARCHNEXT' ,'1WVERIFY' , '1WIRECOUNT',
+ 'CONFIG' , 'ACI' , 'ADC' , 'BCCARD' , 'CLOCK' , 'COM1' ,
+ 'COM2' , 'PS2EMU' , 'ATEMU' , 'I2CSLAVE' ,
+ 'INPUT', 'OUTPUT', 'GRAPHLCD' , 'KEYBOARD' , 'TIMER0' , 'TIMER1' ,
+ 'LCDBUS' , 'LCDMODE' , '1WIRE' , 'LCD' , 'SERIALOUT' ,
+ 'SERIALIN' , 'SPI' , 'LCDPIN' , 'SDA' , 'SCL' ,
+ 'WATCHDOG' , 'PORT' , 'COUNTER0', 'COUNTER1' , 'TCPIP' , 'TWISLAVE' ,
+ 'X10' , 'XRAM' , 'USB',
+ 'BCD' , 'GRAY2BIN' , 'BIN2GRAY' , 'BIN' , 'MAKEBCD' , 'MAKEDEC' , 'MAKEINT' , 'FORMAT' , 'FUSING' , 'BINVAL' ,
+ 'CRC8' , 'CRC16' , 'CRC16UNI' , 'CRC32' , 'HIGH' , 'HIGHW' , 'LOW',
+ 'DATE' , 'TIME' , 'DATE$' , 'TIME$' , 'DAYOFWEEK' , 'DAYOFYEAR' , 'SECOFDAY' , 'SECELAPSED' , 'SYSDAY' , 'SYSSEC' , 'SYSSECELAPSED',
+ 'WAIT' , 'WAITMS' , 'WAITUS' , 'DELAY',
+ 'BSAVE' , 'BLOAD' , 'GET' , 'VER' , 'DISKFREE' , 'DIR' , 'DriveReset' , 'DriveInit' , 'LINE' , 'INITFILESYSTEM' ,
+ 'EOF' , 'WRITE' , 'FLUSH' , 'FREEFILE' , 'FILEATTR' , 'FILEDATE' , 'FILETIME' , 'FILEDATETIME' , 'FILELEN' , 'SEEK' ,
+ 'KILL' , 'DriveGetIdentity' , 'DriveWriteSector' , 'DriveReadSector' , 'LOC' , 'LOF' , 'PUT' , 'OPEN' , 'CLOSE',
+ 'GLCDCMD' , 'GLCDDATA' , 'SETFONT' , 'PSET' , 'SHOWPIC' , 'SHOWPICE' , 'CIRCLE' , 'BOX',
+ 'I2CINIT' , 'I2CRECEIVE' , 'I2CSEND' , 'I2CSTART','I2CSTOP','I2CRBYTE','I2CWBYTE',
+ 'ALIAS' , 'BITWAIT' , 'TOGGLE' , 'RESET' , 'SET' , 'SHIFTIN' , 'SHIFTOUT' , 'DEBOUNCE' , 'PULSEIN' , 'PULSEOUT',
+ 'IDLE' , 'POWERDOWN' , 'POWERSAVE' , 'ON', 'INTERRUPT' , 'ENABLE' , 'DISABLE' , 'START' , 'VERSION' , 'CLOCKDIVISION' , 'CRYSTAL' , 'STOP',
+ 'ADR' , 'ADR2' , 'WRITEEEPROM' , 'CPEEK' , 'CPEEKH' , 'PEEK' , 'POKE' , 'OUT' , 'READEEPROM' , 'DATA' , 'INP' , 'READ' , 'RESTORE' , 'LOOKDOWN' , 'LOOKUP' , 'LOOKUPSTR' , 'LOAD' , 'LOADADR' , 'LOADLABEL' , 'LOADWORDADR' , 'MEMCOPY',
+ 'RC5SEND' , 'RC6SEND' , 'GETRC5' , 'SONYSEND',
+ 'BAUD' , 'BAUD1', 'BUFSPACE' , 'CLEAR', 'ECHO' , 'WAITKEY' , 'ISCHARWAITING' , 'INKEY' , 'INPUTBIN' , 'INPUTHEX' , 'PRINT', 'PRINT1','PRINT0', 'PRINTBIN' , 'SERIN' , 'SEROUT' , 'SPC' , 'MAKEMODBUS',
+ 'SPIIN' , 'SPIINIT' , 'SPIMOVE' , 'SPIOUT', 'SINGLE',
+ 'ASC' , 'UCASE' , 'LCASE' , 'TRIM' , 'SPLIT' , 'LTRIM' , 'INSTR' , 'SPACE' , 'RTRIM' , 'LEFT' , 'LEN' , 'MID' , 'RIGHT' , 'VAL' , 'STR' , 'CHR' , 'CHECKSUM' , 'HEX' , 'HEXVAL',
+ 'BASE64DEC' , 'BASE64ENC' , 'IP2STR' , 'UDPREAD' , 'UDPWRITE' , 'UDPWRITESTR' , 'TCPWRITE' , 'TCPWRITESTR' , 'TCPREAD' , 'GETDSTIP' , 'GETDSTPORT' , 'SOCKETSTAT' , 'SOCKETCONNECT' , 'SOCKETLISTEN' , 'GETSOCKET' , 'CLOSESOCKET' ,
+ 'SETTCP' , 'GETTCPREGS' , 'SETTCPREGS' , 'SETIPPROTOCOL' , 'TCPCHECKSUM',
+ 'HOME' , 'CURSOR' , 'UPPERLINE' , 'THIRDLINE' , 'INITLCD' , 'LOWERLINE' , 'LCDAT' , 'FOURTHLINE' , 'DISPLAY' , 'LCDCONTRAST' , 'LOCATE' , 'SHIFTCURSOR' , 'DEFLCDCHAR' , 'SHIFTLCD' , 'CLS',
+ 'ACOS' , 'ASIN' , 'ATN' , 'ATN2' , 'EXP' , 'RAD2DEG' , 'FRAC' , 'TAN' , 'TANH' , 'COS' , 'COSH' , 'LOG' , 'LOG10' , 'ROUND' , 'ABS' , 'INT' , 'MAX' , 'MIN' , 'SQR' , 'SGN' , 'POWER' , 'SIN' , 'SINH' , 'FIX' , 'INCR' , 'DECR' , 'DEG2RAD',
+ 'DBG' , 'DEBUG', 'DTMFOUT' , 'ENCODER' , 'GETADC' , 'GETKBD' , 'GETATKBD' , 'GETRC' , 'VALUE' , 'POPALL' , 'PS2MOUSEXY' , 'PUSHALL' ,
+ 'RETURN' , 'RND' , 'ROTATE' , 'SENDSCAN' , 'SENDSCANKBD' , 'SHIFT' , 'SOUND' , 'STCHECK' , 'SWAP' , 'VARPTR' , 'X10DETECT' , 'X10SEND' , 'READMAGCARD' , 'REM' , 'BITS' , 'BYVAL' , 'CALL' , 'READHITAG',
+ 'Buffered', 'Size', 'Dummy', 'Parity', 'None', 'Stopbits', 'Databits', 'Clockpol', 'Synchrone', 'Prescaler', 'Reference', 'int0', 'int1', 'Interrupts',
+ 'Auto', 'avcc', 'ack', 'nack', 'Pin', 'Db4', 'Db3', 'Db2', 'Db1', 'Db7', 'Db6', 'Db5', 'Db0', 'e', 'rs', 'twi',
+ ),
+ 2 => array(
+ // Red Lowercase Keywords
+ '$ASM' , '$BAUD' , '$BAUD1' , '$BGF' , '$BOOT' , '$CRYSTAL' , '$DATA' , '$DBG' , '$DEFAULT' , '$EEPLEAVE' , '$EEPROM' ,
+ '$EEPROMHEX' , '$EXTERNAL' , '$HWSTACK' , '$INC' , '$INCLUDE' , '$INITMICRO' , '$LCD' , '$LCDRS' , '$LCDPUTCTRL' ,
+ '$LCDPUTDATA' , '$LCDVFO' , '$LIB' , '$LOADER' , '$LOADERSIZE' , '$MAP' , '$NOCOMPILE' , '$NOINIT' , '$NORAMCLEAR' ,
+ '$PROG' , '$PROGRAMMER' , '$REGFILE' , '$RESOURCE' , '$ROMSTART', '$SERIALINPUT', '$SERIALINPUT1' , '$SERIALINPUT2LCD' ,
+ '$SERIALOUTPUT' , '$SERIALOUTPUT1' , '$SIM' , '$SWSTACK' , '$TIMEOUT' , '$TINY' , '$WAITSTATE' , '$XRAMSIZE' , '$XRAMSTART', '$XA',
+ '#IF' , '#ELSE' , '#ENDIF', '$framesize'
+ ),
+ 3 => array(
+ // Blue Lowercase Keywords
+ 'IF', 'THEN', 'ELSE', 'END', 'WHILE', 'WEND', 'DO', 'LOOP', 'SELECT', 'CASE', 'FOR', 'NEXT',
+ 'GOSUB' , 'GOTO' , 'LOCAL' , 'SUB' , 'DEFBIT', 'DEFBYTE', 'DEFINT', 'DEFWORD', 'DEFLNG', 'DEFSNG', 'DEFDBL',
+ 'CONST', 'DECLARE', 'FUNCTION', 'DIM', 'EXIT', 'LONG', 'INTEGER', 'BYTE', 'AS', 'STRING', 'WORD'
+ ),
+ 4 => array(
+ //light blue
+ 'PINA.0', 'PINA.1', 'PINA.2', 'PINA.3', 'PINA.4', 'PINA.5', 'PINA.6', 'PINA.7',
+ 'PINB.0', 'PINB.1', 'PINB.2', 'PINB.3', 'PINB.4', 'PINB.5', 'PINB.6', 'PINB.7',
+ 'PINC.0', 'PINC.1', 'PINC.2', 'PINC.3', 'PINC.4', 'PINC.5', 'PINC.6', 'PINC.7',
+ 'PIND.0', 'PIND.1', 'PIND.2', 'PIND.3', 'PIND.4', 'PIND.5', 'PIND.6', 'PIND.7',
+ 'PINE.0', 'PINE.1', 'PINE.2', 'PINE.3', 'PINE.4', 'PINE.5', 'PINE.6', 'PINE.7',
+ 'PINF.0', 'PINF.1', 'PINF.2', 'PINF.3', 'PINF.4', 'PINF.5', 'PINF.6', 'PINF.7',
+
+ 'PORTA.0', 'PORTA.1', 'PORTA.2', 'PORTA.3', 'PORTA.4', 'PORTA.5', 'PORTA.6', 'PORTA.7',
+ 'PORTB.0', 'PORTB.1', 'PORTB.2', 'PORTB.3', 'PORTB.4', 'PORTB.5', 'PORTB.6', 'PORTB.7',
+ 'PORTC.0', 'PORTC.1', 'PORTC.2', 'PORTC.3', 'PORTC.4', 'PORTC.5', 'PORTC.6', 'PORTC.7',
+ 'PORTD.0', 'PORTD.1', 'PORTD.2', 'PORTD.3', 'PORTD.4', 'PORTD.5', 'PORTD.6', 'PORTD.7',
+ 'PORTE.0', 'PORTE.1', 'PORTE.2', 'PORTE.3', 'PORTE.4', 'PORTE.5', 'PORTE.6', 'PORTE.7',
+ 'PORTF.0', 'PORTF.1', 'PORTF.2', 'PORTF.3', 'PORTF.4', 'PORTF.5', 'PORTF.6', 'PORTF.7',
+
+ 'DDRA.0', 'DDRA.1', 'DDRA.2', 'DDRA.3', 'DDRA.4', 'DDRA.5', 'DDRA.6', 'DDRA.7',
+ 'DDRB.0', 'DDRB.1', 'DDRB.2', 'DDRB.3', 'DDRB.4', 'DDRB.5', 'DDRB.6', 'DDRB.7',
+ 'DDRC.0', 'DDRC.1', 'DDRC.2', 'DDRC.3', 'DDRC.4', 'DDRC.5', 'DDRC.6', 'DDRC.7',
+ 'DDRD.0', 'DDRD.1', 'DDRD.2', 'DDRD.3', 'DDRD.4', 'DDRD.5', 'DDRD.6', 'DDRD.7',
+ 'DDRE.0', 'DDRE.1', 'DDRE.2', 'DDRE.3', 'DDRE.4', 'DDRE.5', 'DDRE.6', 'DDRE.7',
+ 'DDRF.0', 'DDRF.1', 'DDRF.2', 'DDRF.3', 'DDRF.4', 'DDRF.5', 'DDRF.6', 'DDRF.7',
+
+ 'DDRA','DDRB','DDRC','DDRD','DDRE','DDRF',
+ 'PORTA','PORTB','PORTC','PORTD','PORTE','PORTF',
+ 'PINA','PINB','PINC','PIND','PINE','PINF',
+ )
+ ),
+ 'SYMBOLS' => array(
+ '=', '<', '>', '>=', '<=', '+', '-', '*', '/', '%', '(', ')', '{', '}', '[', ']', ';', ':', '$', '&H'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080; font-weight: bold;',
+ 2 => 'color: #FF0000;',
+ 3 => 'color: #0000FF;',
+ 4 => 'color: #0080FF;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #657CC4; font-style: italic;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000080;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000080; font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #0000FF;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/bash.php b/inc/geshi/bash.php
index dad391c8a..c69f0054f 100644
--- a/inc/geshi/bash.php
+++ b/inc/geshi/bash.php
@@ -4,7 +4,7 @@
* --------
* Author: Andreas Gohr (andi@splitbrain.org)
* Copyright: (c) 2004 Andreas Gohr, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/20
*
* BASH language file for GeSHi.
@@ -65,7 +65,10 @@ $language_data = array (
//BASH-style Heredoc
2 => '/<<-?\s*?(\'?)([a-zA-Z0-9]+)\1\\n.*\\n\\2(?![a-zA-Z0-9])/siU',
//Escaped String Starters
- 3 => "/\\\\['\"]/siU"
+ 3 => "/\\\\['\"]/siU",
+ // Single-Line Shell usage: Hide the prompt at the beginning
+ /* 4 => "/\A(?!#!)\s*(?>[\w:@\\/\\-\\._~]*[$#]\s?)?(?=[^\n]+\n?\Z)|^(?!#!)(\w+@)?[\w\\-\\.]+(:~?)[\w\\/\\-\\._]*?[$#]\s?/ms" */
+ 4 => "/\A(?!#!)(?:(?>[\w:@\\/\\-\\._~]*)[$#]\s?)(?=(?>[^\n]+)\n?\Z)|^(?!#!)(?:\w+@)?(?>[\w\\-\\.]+)(?>:~?[\w\\/\\-\\._]*?)?[$#]\s?/sm"
),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array('"'),
@@ -90,10 +93,44 @@ $language_data = array (
'if', 'in', 'select', 'set', 'then', 'until', 'while', 'time'
),
2 => array(
- 'aclocal', 'aconnect', 'aplay', 'apm', 'apmsleep', 'apropos',
- 'apt-cache', 'apt-file', 'apt-get', 'apt-key', 'apt-src', 'aptitude',
- 'ar', 'arch', 'arecord', 'as', 'as86', 'ash', 'autoconf',
- 'autoheader', 'automake', 'awk',
+ 'aclocal', 'aconnect', 'apachectl', 'apache2ctl', 'aplay', 'apm',
+ 'apmsleep', 'apropos', 'apt-cache', 'apt-cdrom', 'apt-config',
+ 'apt-file', 'apt-ftparchive', 'apt-get', 'apt-key', 'apt-listbugs',
+ 'apt-listchanges', 'apt-mark', 'apt-mirror', 'apt-sortpkgs',
+ 'apt-src', 'apticron', 'aptitude', 'aptsh', 'apxs', 'apxs2', 'ar',
+ 'arch', 'arecord', 'as', 'as86', 'ash', 'autoconf', 'autoheader',
+ 'automake', 'awk',
+
+ 'apachectl start', 'apachectl stop', 'apachectl restart',
+ 'apachectl graceful', 'apachectl graceful-stop',
+ 'apachectl configtest', 'apachectl status', 'apachectl fullstatus',
+ 'apachectl help', 'apache2ctl start', 'apache2ctl stop',
+ 'apache2ctl restart', 'apache2ctl graceful',
+ 'apache2ctl graceful-stop', 'apache2ctl configtest',
+ 'apache2ctl status', 'apache2ctl fullstatus', 'apache2ctl help',
+
+ 'apt-cache add', 'apt-cache depends', 'apt-cache dotty',
+ 'apt-cache dump', 'apt-cache dumpavail', 'apt-cache gencaches',
+ 'apt-cache pkgnames', 'apt-cache policy', 'apt-cache rdepends',
+ 'apt-cache search', 'apt-cache show', 'apt-cache showauto',
+ 'apt-cache showpkg', 'apt-cache showsrc', 'apt-cache stats',
+ 'apt-cache unmet', 'apt-cache xvcg', 'apt-cdrom add',
+ 'apt-cdrom ident', 'apt-config dump', 'apt-config shell',
+ 'apt-file find', 'apt-file list', 'apt-file purge',
+ 'apt-file search', 'apt-file shot', 'apt-file update',
+ 'apt-get autoclean', 'apt-get autoremove', 'apt-get build-dep',
+ 'apt-get check', 'apt-get clean', 'apt-get dist-upgrade',
+ 'apt-get dselect-upgrade', 'apt-get install', 'apt-get markauto',
+ 'apt-get purge', 'apt-get remove', 'apt-get source',
+ 'apt-get unmarkauto', 'apt-get update', 'apt-get upgrade',
+ 'apt-key add', 'apt-key adv', 'apt-key del', 'apt-key export',
+ 'apt-key exportall', 'apt-key finger', 'apt-key list',
+ 'apt-key net-update', 'apt-key update', 'apt-listbugs apt',
+ 'apt-listbugs list', 'apt-listbugs rss', 'apt-src build',
+ 'apt-src clean', 'apt-src import', 'apt-src install',
+ 'apt-src list', 'apt-src location', 'apt-src name',
+ 'apt-src remove', 'apt-src update', 'apt-src upgrade',
+ 'apt-src version',
'basename', 'bash', 'bc', 'bison', 'bunzip2', 'bzcat',
'bzcmp', 'bzdiff', 'bzegrep', 'bzfgrep', 'bzgrep',
@@ -104,6 +141,14 @@ $language_data = array (
'chown', 'chroot', 'chsh', 'chvt', 'clear', 'cmp', 'comm', 'co',
'col', 'cp', 'cpio', 'cpp', 'csh', 'cut', 'cvs', 'cvs-pserver',
+ 'cvs add', 'cvs admin', 'cvs annotate', 'cvs checkout',
+ 'cvs commit', 'cvs diff', 'cvs edit', 'cvs editors', 'cvs export',
+ 'cvs history', 'cvs import', 'cvs init', 'cvs log', 'cvs login',
+ 'cvs logout', 'cvs ls', 'cvs pserver', 'cvs rannotate',
+ 'cvs rdiff', 'cvs release', 'cvs remove', 'cvs rlog', 'cvs rls',
+ 'cvs rtag', 'cvs server', 'cvs status', 'cvs tag', 'cvs unedit',
+ 'cvs update', 'cvs version', 'cvs watch', 'cvs watchers',
+
'dash', 'date', 'dc', 'dch', 'dcop', 'dd', 'ddate', 'ddd',
'deallocvt', 'debconf', 'defoma', 'depmod', 'df', 'dh',
'dialog', 'diff', 'diff3', 'dig', 'dir', 'dircolors', 'directomatic',
@@ -112,15 +157,55 @@ $language_data = array (
'ed', 'egrep', 'env', 'expr',
- 'false', 'fbset', 'ffmpeg', 'fgconsole','fgrep', 'file', 'find',
- 'flex', 'flex++', 'fmt', 'free', 'ftp', 'funzip', 'fuser',
+ 'false', 'fbset', 'fdisk', 'ffmpeg', 'fgconsole','fgrep', 'file',
+ 'find', 'flex', 'flex++', 'fmt', 'free', 'ftp', 'funzip', 'fuser',
'g++', 'gawk', 'gc','gcc', 'gdb', 'getent', 'getkeycodes',
'getopt', 'gettext', 'gettextize', 'gimp', 'gimp-remote',
'gimptool', 'gmake', 'gocr', 'grep', 'groups', 'gs', 'gunzip',
'gzexe', 'gzip',
- 'git', 'gitaction', 'git-add', 'git-add--interactive', 'git-am',
+ 'git', 'git add', 'git add--interactive', 'git am', 'git annotate',
+ 'git apply', 'git archive', 'git bisect', 'git bisect--helper',
+ 'git blame', 'git branch', 'git bundle', 'git cat-file',
+ 'git check-attr', 'git checkout', 'git checkout-index',
+ 'git check-ref-format', 'git cherry', 'git cherry-pick',
+ 'git clean', 'git clone', 'git commit', 'git commit-tree',
+ 'git config', 'git count-objects', 'git daemon', 'git describe',
+ 'git diff', 'git diff-files', 'git diff-index', 'git difftool',
+ 'git difftool--helper', 'git diff-tree', 'git fast-export',
+ 'git fast-import', 'git fetch', 'git fetch-pack',
+ 'git filter-branch', 'git fmt-merge-msg', 'git for-each-ref',
+ 'git format-patch', 'git fsck', 'git fsck-objects', 'git gc',
+ 'git get-tar-commit-id', 'git grep', 'git hash-object', 'git help',
+ 'git http-backend', 'git http-fetch', 'git http-push',
+ 'git imap-send', 'git index-pack', 'git init', 'git init-db',
+ 'git instaweb', 'git log', 'git lost-found', 'git ls-files',
+ 'git ls-remote', 'git ls-tree', 'git mailinfo', 'git mailsplit',
+ 'git merge', 'git merge-base', 'git merge-file', 'git merge-index',
+ 'git merge-octopus', 'git merge-one-file', 'git merge-ours',
+ 'git merge-recursive', 'git merge-resolve', 'git merge-subtree',
+ 'git mergetool', 'git merge-tree', 'git mktag', 'git mktree',
+ 'git mv', 'git name-rev', 'git notes', 'git pack-objects',
+ 'git pack-redundant', 'git pack-refs', 'git patch-id',
+ 'git peek-remote', 'git prune', 'git prune-packed', 'git pull',
+ 'git push', 'git quiltimport', 'git read-tree', 'git rebase',
+ 'git rebase--interactive', 'git receive-pack', 'git reflog',
+ 'git relink', 'git remote', 'git remote-ftp', 'git remote-ftps',
+ 'git remote-http', 'git remote-https', 'git remote-testgit',
+ 'git repack', 'git replace', 'git repo-config', 'git request-pull',
+ 'git rerere', 'git reset', 'git revert', 'git rev-list',
+ 'git rev-parse', 'git rm', 'git send-pack', 'git shell',
+ 'git shortlog', 'git show', 'git show-branch', 'git show-index',
+ 'git show-ref', 'git stage', 'git stash', 'git status',
+ 'git stripspace', 'git submodule', 'git symbolic-ref', 'git tag',
+ 'git tar-tree', 'git unpack-file', 'git unpack-objects',
+ 'git update-index', 'git update-ref', 'git update-server-info',
+ 'git upload-archive', 'git upload-pack', 'git var',
+ 'git verify-pack', 'git verify-tag', 'git web--browse',
+ 'git whatchanged', 'git write-tree',
+
+ 'gitaction', 'git-add', 'git-add--interactive', 'git-am',
'git-annotate', 'git-apply', 'git-archive', 'git-bisect',
'git-bisect--helper', 'git-blame', 'git-branch', 'git-bundle',
'git-cat-file', 'git-check-attr', 'git-checkout',
@@ -166,6 +251,9 @@ $language_data = array (
'id', 'ifconfig', 'ifdown', 'ifup', 'igawk', 'install',
+ 'ip', 'ip addr', 'ip addrlabel', 'ip link', 'ip maddr', 'ip mroute',
+ 'ip neigh', 'ip route', 'ip rule', 'ip tunnel', 'ip xfrm',
+
'join',
'kbd_mode','kbdrate', 'kdialog', 'kfile', 'kill', 'killall',
@@ -200,6 +288,20 @@ $language_data = array (
'svnadmin', 'svndumpfilter', 'svnlook', 'svnmerge', 'svnmucc',
'svnserve', 'svnshell', 'svnsync', 'svnversion', 'svnwrap', 'sync',
+ 'svn add', 'svn ann', 'svn annotate', 'svn blame', 'svn cat',
+ 'svn changelist', 'svn checkout', 'svn ci', 'svn cl', 'svn cleanup',
+ 'svn co', 'svn commit', 'svn copy', 'svn cp', 'svn del',
+ 'svn delete', 'svn di', 'svn diff', 'svn export', 'svn h',
+ 'svn help', 'svn import', 'svn info', 'svn list', 'svn lock',
+ 'svn log', 'svn ls', 'svn merge', 'svn mergeinfo', 'svn mkdir',
+ 'svn move', 'svn mv', 'svn pd', 'svn pdel', 'svn pe', 'svn pedit',
+ 'svn pg', 'svn pget', 'svn pl', 'svn plist', 'svn praise',
+ 'svn propdel', 'svn propedit', 'svn propget', 'svn proplist',
+ 'svn propset', 'svn ps', 'svn pset', 'svn remove', 'svn ren',
+ 'svn rename', 'svn resolve', 'svn resolved', 'svn revert', 'svn rm',
+ 'svn st', 'svn stat', 'svn status', 'svn sw', 'svn switch',
+ 'svn unlock', 'svn up', 'svn update',
+
'tac', 'tail', 'tar', 'tee', 'tempfile', 'touch', 'tr', 'tree',
'true',
@@ -216,7 +318,14 @@ $language_data = array (
'xargs', 'xhost', 'xmodmap', 'xset',
- 'yacc', 'yes', 'ypdomainname',
+ 'yacc', 'yes', 'ypdomainname', 'yum',
+
+ 'yum check-update', 'yum clean', 'yum deplist', 'yum erase',
+ 'yum groupinfo', 'yum groupinstall', 'yum grouplist',
+ 'yum groupremove', 'yum groupupdate', 'yum info', 'yum install',
+ 'yum list', 'yum localinstall', 'yum localupdate', 'yum makecache',
+ 'yum provides', 'yum remove', 'yum resolvedep', 'yum search',
+ 'yum shell', 'yum update', 'yum upgrade', 'yum whatprovides',
'zcat', 'zcmp', 'zdiff', 'zdump', 'zegrep', 'zfgrep', 'zforce',
'zgrep', 'zip', 'zipgrep', 'zipinfo', 'zless', 'zmore', 'znew',
@@ -252,7 +361,8 @@ $language_data = array (
0 => 'color: #666666; font-style: italic;',
1 => 'color: #800000;',
2 => 'color: #cc0000; font-style: italic;',
- 3 => 'color: #000000; font-weight: bold;'
+ 3 => 'color: #000000; font-weight: bold;',
+ 4 => 'color: #666666;'
),
'ESCAPE_CHAR' => array(
1 => 'color: #000099; font-weight: bold;',
@@ -318,10 +428,13 @@ $language_data = array (
'DISALLOWED_BEFORE' => '$'
),
'KEYWORDS' => array(
- 'DISALLOWED_BEFORE' => "(?<![\.\-a-zA-Z0-9_\$\#])",
- 'DISALLOWED_AFTER' => "(?![\.\-a-zA-Z0-9_%=\\/])"
+ 'DISALLOWED_BEFORE' => "(?<![\.\-a-zA-Z0-9_\$\#:])",
+ 'DISALLOWED_AFTER' => "(?![\.\-a-zA-Z0-9_%=\\/:])",
+ 2 => array(
+ 'SPACE_AS_WHITESPACE' => false
+ )
+ )
)
- )
);
?> \ No newline at end of file
diff --git a/inc/geshi/basic4gl.php b/inc/geshi/basic4gl.php
index 7ac869304..35c927406 100644
--- a/inc/geshi/basic4gl.php
+++ b/inc/geshi/basic4gl.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Matthew Webb (bmatthew1@blueyonder.co.uk)
* Copyright: (c) 2004 Matthew Webb (http://matthew-4gl.wikispaces.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/09/15
*
* Basic4GL language file for GeSHi.
diff --git a/inc/geshi/bf.php b/inc/geshi/bf.php
index ba44e6caf..c06ca5bf6 100644
--- a/inc/geshi/bf.php
+++ b/inc/geshi/bf.php
@@ -4,7 +4,7 @@
* ----------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/10/31
*
* Brainfuck language file for GeSHi.
@@ -63,7 +63,7 @@ $language_data = array (
1 => 'color: #666666; font-style: italic;'
),
'BRACKETS' => array(
- 0 => 'color: #66cc66;'
+ 0 => 'color: #660000;'
),
'STRINGS' => array(
0 => 'color: #ff0000;'
@@ -76,8 +76,8 @@ $language_data = array (
0 => 'color: #006600;',
1 => 'color: #660000;',
2 => 'color: #000066;',
- 3 => 'color: #660066;',
- 4 => 'color: #666600;'
+ 3 => 'color: #666600;',
+ 4 => 'color: #660066;'
),
'ESCAPE_CHAR' => array(
),
@@ -102,8 +102,9 @@ $language_data = array (
'PARSER_CONTROL' => array(
'ENABLE_FLAGS' => array(
'STRINGS' => GESHI_NEVER,
- 'NUMBERS' => GESHI_NEVER
- ),
+ 'NUMBERS' => GESHI_NEVER,
+ 'BRACKETS' => GESHI_NEVER
+ ),
'KEYWORDS' => array(
'DISALLOW_BEFORE' => '',
'DISALLOW_AFTER' => ''
@@ -111,4 +112,4 @@ $language_data = array (
)
);
-?>
+?> \ No newline at end of file
diff --git a/inc/geshi/bibtex.php b/inc/geshi/bibtex.php
index e47e0665c..51cb4cebd 100644
--- a/inc/geshi/bibtex.php
+++ b/inc/geshi/bibtex.php
@@ -4,7 +4,7 @@
* -----
* Author: Quinn Taylor (quinntaylor@mac.com)
* Copyright: (c) 2009 Quinn Taylor (quinntaylor@mac.com), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/04/29
*
* BibTeX language file for GeSHi.
diff --git a/inc/geshi/blitzbasic.php b/inc/geshi/blitzbasic.php
index e43ec4635..1d3c08d05 100644
--- a/inc/geshi/blitzbasic.php
+++ b/inc/geshi/blitzbasic.php
@@ -4,7 +4,7 @@
* --------------
* Author: P�draig O`Connel (info@moonsword.info)
* Copyright: (c) 2005 P�draig O`Connel (http://moonsword.info)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 16.10.2005
*
* BlitzBasic language file for GeSHi.
@@ -56,7 +56,7 @@ $language_data = array (
'ESCAPE_CHAR' => '',
'KEYWORDS' => array(
1 => array(
- 'If','EndIf','ElseIf','Else If','Else','While','Wend','Return','Next','Include','End Type','End Select','End If','End Function','End','Select',
+ 'If','EndIf','ElseIf','Else','While','Wend','Return','Next','Include','End Type','End Select','End If','End Function','End','Select',
'Type','Forever','For','Or','And','AppTitle','Case','Goto','Gosub','Step','Stop','Int','Last','False','Then','To','True','Until','Float',
'String','Before','Not'
),
diff --git a/inc/geshi/bnf.php b/inc/geshi/bnf.php
index f52df9cb8..ca15cf9eb 100644
--- a/inc/geshi/bnf.php
+++ b/inc/geshi/bnf.php
@@ -4,7 +4,7 @@
* --------
* Author: Rowan Rodrik van der Molen (rowan@bigsmoke.us)
* Copyright: (c) 2006 Rowan Rodrik van der Molen (http://www.bigsmoke.us/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/09/28
*
* BNF (Backus-Naur form) language file for GeSHi.
diff --git a/inc/geshi/boo.php b/inc/geshi/boo.php
index 09d4ee40e..b68d442f7 100644
--- a/inc/geshi/boo.php
+++ b/inc/geshi/boo.php
@@ -4,7 +4,7 @@
* --------
* Author: Marcus Griep (neoeinstein+GeSHi@gmail.com)
* Copyright: (c) 2007 Marcus Griep (http://www.xpdm.us)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/09/10
*
* Boo language file for GeSHi.
diff --git a/inc/geshi/c.php b/inc/geshi/c.php
index b0e2987d7..35d5b019d 100644
--- a/inc/geshi/c.php
+++ b/inc/geshi/c.php
@@ -7,7 +7,7 @@
* - Jack Lloyd (lloyd@randombit.net)
* - Michael Mol (mikemol@gmail.com)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/04
*
* C language file for GeSHi.
@@ -92,7 +92,85 @@ $language_data = array (
'null', 'false', 'break', 'true', 'function', 'enum', 'extern', 'inline'
),
3 => array(
- 'printf', 'cout'
+ // assert.h
+ 'assert',
+
+ //complex.h
+ 'cabs', 'cacos', 'cacosh', 'carg', 'casin', 'casinh', 'catan',
+ 'catanh', 'ccos', 'ccosh', 'cexp', 'cimag', 'cis', 'clog', 'conj',
+ 'cpow', 'cproj', 'creal', 'csin', 'csinh', 'csqrt', 'ctan', 'ctanh',
+
+ //ctype.h
+ 'digittoint', 'isalnum', 'isalpha', 'isascii', 'isblank', 'iscntrl',
+ 'isdigit', 'isgraph', 'islower', 'isprint', 'ispunct', 'isspace',
+ 'isupper', 'isxdigit', 'toascii', 'tolower', 'toupper',
+
+ //inttypes.h
+ 'imaxabs', 'imaxdiv', 'strtoimax', 'strtoumax', 'wcstoimax',
+ 'wcstoumax',
+
+ //locale.h
+ 'localeconv', 'setlocale',
+
+ //math.h
+ 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'exp',
+ 'fabs', 'floor', 'frexp', 'ldexp', 'log', 'log10', 'modf', 'pow',
+ 'sin', 'sinh', 'sqrt', 'tan', 'tanh',
+
+ //setjmp.h
+ 'longjmp', 'setjmp',
+
+ //signal.h
+ 'raise',
+
+ //stdarg.h
+ 'va_arg', 'va_copy', 'va_end', 'va_start',
+
+ //stddef.h
+ 'offsetof',
+
+ //stdio.h
+ 'clearerr', 'fclose', 'fdopen', 'feof', 'ferror', 'fflush', 'fgetc',
+ 'fgetpos', 'fgets', 'fopen', 'fprintf', 'fputc', 'fputchar',
+ 'fputs', 'fread', 'freopen', 'fscanf', 'fseek', 'fsetpos', 'ftell',
+ 'fwrite', 'getc', 'getch', 'getchar', 'gets', 'perror', 'printf',
+ 'putc', 'putchar', 'puts', 'remove', 'rename', 'rewind', 'scanf',
+ 'setbuf', 'setvbuf', 'snprintf', 'sprintf', 'sscanf', 'tmpfile',
+ 'tmpnam', 'ungetc', 'vfprintf', 'vfscanf', 'vprintf', 'vscanf',
+ 'vsprintf', 'vsscanf',
+
+ //stdlib.h
+ 'abort', 'abs', 'atexit', 'atof', 'atoi', 'atol', 'bsearch',
+ 'calloc', 'div', 'exit', 'free', 'getenv', 'itoa', 'labs', 'ldiv',
+ 'ltoa', 'malloc', 'qsort', 'rand', 'realloc', 'srand', 'strtod',
+ 'strtol', 'strtoul', 'system',
+
+ //string.h
+ 'memchr', 'memcmp', 'memcpy', 'memmove', 'memset', 'strcat',
+ 'strchr', 'strcmp', 'strcoll', 'strcpy', 'strcspn', 'strerror',
+ 'strlen', 'strncat', 'strncmp', 'strncpy', 'strpbrk', 'strrchr',
+ 'strspn', 'strstr', 'strtok', 'strxfrm',
+
+ //time.h
+ 'asctime', 'clock', 'ctime', 'difftime', 'gmtime', 'localtime',
+ 'mktime', 'strftime', 'time',
+
+ //wchar.h
+ 'btowc', 'fgetwc', 'fgetws', 'fputwc', 'fputws', 'fwide',
+ 'fwprintf', 'fwscanf', 'getwc', 'getwchar', 'mbrlen', 'mbrtowc',
+ 'mbsinit', 'mbsrtowcs', 'putwc', 'putwchar', 'swprintf', 'swscanf',
+ 'ungetwc', 'vfwprintf', 'vswprintf', 'vwprintf', 'wcrtomb',
+ 'wcscat', 'wcschr', 'wcscmp', 'wcscoll', 'wcscpy', 'wcscspn',
+ 'wcsftime', 'wcslen', 'wcsncat', 'wcsncmp', 'wcsncpy', 'wcspbrk',
+ 'wcsrchr', 'wcsrtombs', 'wcsspn', 'wcsstr', 'wcstod', 'wcstok',
+ 'wcstol', 'wcstoul', 'wcsxfrm', 'wctob', 'wmemchr', 'wmemcmp',
+ 'wmemcpy', 'wmemmove', 'wmemset', 'wprintf', 'wscanf',
+
+ //wctype.h
+ 'iswalnum', 'iswalpha', 'iswcntrl', 'iswctype', 'iswdigit',
+ 'iswgraph', 'iswlower', 'iswprint', 'iswpunct', 'iswspace',
+ 'iswupper', 'iswxdigit', 'towctrans', 'towlower', 'towupper',
+ 'wctrans', 'wctype'
),
4 => array(
'auto', 'char', 'const', 'double', 'float', 'int', 'long',
@@ -111,7 +189,8 @@ $language_data = array (
'int8_t', 'int16_t', 'int32_t', 'int64_t',
'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t',
- 'intmax_t', 'uintmax_t', 'intptr_t', 'uintptr_t'
+ 'intmax_t', 'uintmax_t', 'intptr_t', 'uintptr_t',
+ 'size_t', 'off_t'
),
),
'SYMBOLS' => array(
diff --git a/inc/geshi/c_loadrunner.php b/inc/geshi/c_loadrunner.php
new file mode 100644
index 000000000..42b3d7721
--- /dev/null
+++ b/inc/geshi/c_loadrunner.php
@@ -0,0 +1,323 @@
+<?php
+/*************************************************************************************
+ * c_loadrunner.php
+ * ---------------------------------
+ * Author: Stuart Moncrieff (stuart at myloadtest dot com)
+ * Copyright: (c) 2010 Stuart Moncrieff (http://www.myloadtest.com/loadrunner-syntax-highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010-07-25
+ *
+ * C (for LoadRunner) language file for GeSHi.
+ *
+ * Based on LoadRunner 9.52.
+ *
+ * CHANGES
+ * -------
+ * 2010-08-01 (1.0.8.9)
+ * - Added highlighting support for LoadRunner {parameters}.
+ * 2010-07-25 (1.0.8.8)
+ * - First Release. Syntax highlighting support for lr_, web_, and sapgui_ functions only.
+ *
+ * TODO (updated 2010-07-25)
+ * -------------------------
+ * - Add support for other vuser types: MMS, FTP, etc.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * ************************************************************************************/
+
+$language_data = array (
+ // The First Indices
+ 'LANG_NAME' => 'C (LoadRunner)',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ // Escape characters within strings (like \\) are not highlighted differently in LoadRunner, so
+ // I am using GeSHi escape characters (or regular expressions) to highlight LoadRunner {parameters}.
+ // LoadRunner {parameters} must begin with a letter and contain only alphanumeric characters and '_'
+ 'ESCAPE_REGEXP' => array(
+ 0 => "#\{[a-zA-Z]{1}[a-zA-Z_]{0,}\}#",
+ ),
+
+ // Keywords
+ 'KEYWORDS' => array(
+ // Keywords from http://en.wikipedia.org/wiki/C_syntax
+ 1 => array(
+ 'auto', 'break', 'case', 'char', 'const', 'continue', 'default',
+ 'do', 'double', 'else', 'enum', 'extern', 'float', 'for', 'goto',
+ 'if', 'inline', 'int', 'long', 'register', 'restrict', 'return',
+ 'short', 'signed', 'sizeof', 'static', 'struct', 'switch',
+ 'typedef', 'union', 'unsigned', 'void', 'volatile', 'while',
+ '_Bool', '_Complex', '_Imaginary'
+ ),
+ // C preprocessor directives from http://en.wikipedia.org/wiki/C_preprocessor
+ 2 => array(
+ '#define', '#if', '#ifdef', '#ifndef', '#include', '#else', '#elif', '#endif', '#pragma', '#undef'
+ ),
+ // Functions from lrun.h
+ 3 => array(
+ 'lr_start_transaction', 'lr_start_sub_transaction', 'lr_start_transaction_instance', 'lr_end_transaction',
+ 'lr_end_sub_transaction', 'lr_end_transaction_instance', 'lr_stop_transaction', 'lr_stop_transaction_instance',
+ 'lr_resume_transaction', 'lr_resume_transaction_instance', 'lr_wasted_time', 'lr_set_transaction', 'lr_user_data_point',
+ 'lr_user_data_point_instance', 'lr_user_data_point_ex', 'lr_user_data_point_instance_ex', 'lr_get_transaction_duration',
+ 'lr_get_trans_instance_duration', 'lr_get_transaction_think_time', 'lr_get_trans_instance_think_time',
+ 'lr_get_transaction_wasted_time', 'lr_get_trans_instance_wasted_time', 'lr_get_transaction_status',
+ 'lr_get_trans_instance_status', 'lr_set_transaction_status', 'lr_set_transaction_status_by_name',
+ 'lr_set_transaction_instance_status', 'lr_start_timer', 'lr_end_timer', 'lr_rendezvous', 'lr_rendezvous_ex',
+ 'lr_get_vuser_ip', 'lr_whoami', 'lr_get_host_name', 'lr_get_master_host_name', 'lr_get_attrib_long',
+ 'lr_get_attrib_string', 'lr_get_attrib_double', 'lr_paramarr_idx', 'lr_paramarr_random', 'lr_paramarr_len',
+ 'lr_param_unique', 'lr_param_sprintf', 'lr_load_dll', 'lr_continue_on_error', 'lr_decrypt', 'lr_abort', 'lr_exit',
+ 'lr_peek_events', 'lr_think_time', 'lr_debug_message', 'lr_log_message', 'lr_message', 'lr_error_message',
+ 'lr_output_message', 'lr_vuser_status_message', 'lr_fail_trans_with_error', 'lr_next_row', 'lr_advance_param',
+ 'lr_eval_string', 'lr_eval_string_ext', 'lr_eval_string_ext_free', 'lr_param_increment', 'lr_save_var',
+ 'lr_save_string', 'lr_save_int', 'lr_save_datetime', 'lr_save_searched_string', 'lr_set_debug_message',
+ 'lr_get_debug_message', 'lr_enable_ip_spoofing', 'lr_disable_ip_spoofing', 'lr_convert_string_encoding'
+ ),
+ // Constants from lrun.h
+ 4 => array(
+ 'DP_FLAGS_NO_LOG', 'DP_FLAGS_STANDARD_LOG', 'DP_FLAGS_EXTENDED_LOG', 'merc_timer_handle_t', 'LR_EXIT_VUSER',
+ 'LR_EXIT_ACTION_AND_CONTINUE', 'LR_EXIT_ITERATION_AND_CONTINUE', 'LR_EXIT_VUSER_AFTER_ITERATION',
+ 'LR_EXIT_VUSER_AFTER_ACTION', 'LR_EXIT_MAIN_ITERATION_AND_CONTINUE', 'LR_MSG_CLASS_DISABLE_LOG',
+ 'LR_MSG_CLASS_STANDARD_LOG', 'LR_MSG_CLASS_RETURNED_DATA', 'LR_MSG_CLASS_PARAMETERS', 'LR_MSG_CLASS_ADVANCED_TRACE',
+ 'LR_MSG_CLASS_EXTENDED_LOG', 'LR_MSG_CLASS_SENT_DATA', 'LR_MSG_CLASS_JIT_LOG_ON_ERROR', 'LR_SWITCH_OFF', 'LR_SWITCH_ON',
+ 'LR_SWITCH_DEFAULT', 'ONE_DAY', 'ONE_HOUR', 'ONE_MIN', 'DATE_NOW', 'TIME_NOW', 'LR_MSG_CLASS_BRIEF_LOG',
+ 'LR_MSG_CLASS_RESULT_DATA', 'LR_MSG_CLASS_FULL_TRACE', 'LR_MSG_CLASS_AUTO_LOG', 'LR_MSG_OFF', 'LR_MSG_ON',
+ 'LR_MSG_DEFAULT'
+ ),
+ // Functions from web_api.h
+ 5 => array(
+ 'web_reg_add_cookie', 'web_report_data_point', 'web_text_link', 'web_element', 'web_image_link', 'web_static_image',
+ 'web_image_submit', 'web_button', 'web_edit_field', 'web_radio_group', 'web_check_box', 'web_list', 'web_text_area',
+ 'web_map_area', 'web_eval_java_script', 'web_reg_dialog', 'web_reg_cross_step_download', 'web_browser',
+ 'web_set_rts_key', 'web_save_param_length', 'web_save_timestamp_param', 'web_load_cache', 'web_dump_cache',
+ 'web_add_cookie_ex'
+ ),
+ // Constants from web_api.h
+ 6 => array(
+ 'DESCRIPTION', 'ACTION', 'VERIFICATION', 'LR_NOT_FOUND', 'HTTP_INFO_TOTAL_REQUEST_STAT',
+ 'HTTP_INFO_TOTAL_RESPONSE_STAT', 'LRW_OPT_STOP_VUSER_ON_ERROR', 'LRW_OPT_DISPLAY_IMAGE_BODY'
+ ),
+ // Functions from as_web.h
+ 7 => array(
+ 'web_add_filter', 'web_add_auto_filter', 'web_add_auto_header', 'web_add_header', 'web_add_cookie',
+ 'web_cleanup_auto_headers', 'web_cleanup_cookies', 'web_concurrent_end', 'web_concurrent_start', 'web_create_html_param',
+ 'web_create_html_param_ex', 'web_custom_request', 'web_disable_keep_alive', 'web_enable_keep_alive', 'web_find',
+ 'web_get_int_property', 'web_image', 'web_image_check', 'web_link', 'web_global_verification', 'web_reg_find',
+ 'web_reg_save_param', 'web_convert_param', 'web_remove_auto_filter', 'web_remove_auto_header', 'web_revert_auto_header',
+ 'web_remove_cookie', 'web_save_header', 'web_set_certificate', 'web_set_certificate_ex', 'web_set_connections_limit',
+ 'web_set_max_html_param_len', 'web_set_max_retries', 'web_set_proxy', 'web_set_proxy_bypass', 'web_set_secure_proxy',
+ 'web_set_sockets_option', 'web_set_option', 'web_set_timeout', 'web_set_user', 'web_sjis_to_euc_param',
+ 'web_submit_data', 'web_submit_form', 'web_url', 'web_set_proxy_bypass_local', 'web_cache_cleanup',
+ 'web_create_html_query', 'web_create_radio_button_param', 'web_switch_net_layer'
+ ),
+ // Constants from as_web.h
+ 8 => array(
+ 'ENDFORM', 'LAST', 'ENDITEM', 'EXTRARES', 'ITEMDATA', 'STARTHIDDENS', 'ENDHIDDENS', 'CONNECT', 'RECEIVE', 'RESOLVE',
+ 'STEP', 'REQUEST', 'RESPONSE', 'STARTQUERY', 'ENDQUERY', 'INPROPS', 'OUTPROPS', 'ENDPROPS', 'RAW_BODY_START',
+ 'RAW_BODY_END', 'HTTP_INFO_RETURN_CODE', 'HTTP_INFO_DOWNLOAD_SIZE', 'HTTP_INFO_DOWNLOAD_TIME',
+ 'LRW_NET_SOCKET_OPT_LOAD_VERIFY_FILE', 'LRW_NET_SOCKET_OPT_DEFAULT_VERIFY_PATH', 'LRW_NET_SOCKET_OPT_SSL_VERSION',
+ 'LRW_NET_SOCKET_OPT_SSL_CIPHER_LIST', 'LRW_NET_SOCKET_OPT_SO_REUSE_ADDRESS', 'LRW_NET_SOCKET_OPT_USER_IP_ADDRESS',
+ 'LRW_NET_SOCKET_OPT_IP_ADDRESS_BY_INDEX', 'LRW_NET_SOCKET_OPT_HELP', 'LRW_NET_SOCKET_OPT_PRINT_USER_IP_ADDRESS_LIST',
+ 'LRW_OPT_HTML_CHAR_REF_BACKWARD_COMPATIBILITY', 'LRW_OPT_VALUE_YES', 'LRW_OPT_VALUE_NO'
+ ),
+ // Functions from as_sapgui.h
+ 9 => array(
+ 'sapgui_open_connection', 'sapgui_open_connection_ex', 'sapgui_logon', 'sapgui_create_session',
+ 'sapgui_create_new_session', 'sapgui_call_method', 'sapgui_call_method_ex', 'sapgui_set_property',
+ 'sapgui_get_property', 'sapgui_set_collection_property', 'sapgui_active_object_from_parent_method',
+ 'sapgui_active_object_from_parent_property', 'sapgui_call_method_of_active_object',
+ 'sapgui_call_method_of_active_object_ex', 'sapgui_set_property_of_active_object', 'sapgui_get_property_of_active_object',
+ 'sapgui_select_active_connection', 'sapgui_select_active_session', 'sapgui_select_active_window ',
+ 'sapgui_status_bar_get_text', 'sapgui_status_bar_get_param', 'sapgui_status_bar_get_type', 'sapgui_get_status_bar_text',
+ 'sapgui_get_active_window_title', 'sapgui_is_object_available', 'sapgui_is_tab_selected', 'sapgui_is_object_changeable',
+ 'sapgui_set_ok_code', 'sapgui_send_vkey', 'sapgui_resize_window', 'sapgui_window_resize', 'sapgui_window_maximize',
+ 'sapgui_window_close', 'sapgui_window_restore', 'sapgui_window_scroll_to_row', 'sapgui_press_button',
+ 'sapgui_select_radio_button', 'sapgui_set_password', 'sapgui_set_text', 'sapgui_select_menu', 'sapgui_select_tab',
+ 'sapgui_set_checkbox', 'sapgui_set_focus', 'sapgui_select_combobox_entry', 'sapgui_get_ok_code',
+ 'sapgui_is_radio_button_selected', 'sapgui_get_text', 'sapgui_is_checkbox_selected', 'sapgui_table_set_focus',
+ 'sapgui_table_press_button', 'sapgui_table_select_radio_button', 'sapgui_table_set_password', 'sapgui_table_set_text',
+ 'sapgui_table_set_checkbox', 'sapgui_table_select_combobox_entry', 'sapgui_table_set_row_selected',
+ 'sapgui_table_set_column_selected', 'sapgui_table_set_column_width', 'sapgui_table_reorder', 'sapgui_table_fill_data',
+ 'sapgui_table_get_text', 'sapgui_table_is_radio_button_selected', 'sapgui_table_is_checkbox_selected',
+ 'sapgui_table_is_row_selected', 'sapgui_table_is_column_selected', 'sapgui_table_get_column_width',
+ 'sapgui_grid_clear_selection', 'sapgui_grid_select_all', 'sapgui_grid_selection_changed',
+ 'sapgui_grid_press_column_header', 'sapgui_grid_select_cell', 'sapgui_grid_select_rows', 'sapgui_grid_select_column',
+ 'sapgui_grid_deselect_column', 'sapgui_grid_select_columns', 'sapgui_grid_select_cells', 'sapgui_grid_select_cell_row',
+ 'sapgui_grid_select_cell_column', 'sapgui_grid_set_column_order', 'sapgui_grid_set_column_width',
+ 'sapgui_grid_scroll_to_row', 'sapgui_grid_double_click', 'sapgui_grid_click', 'sapgui_grid_press_button',
+ 'sapgui_grid_press_total_row', 'sapgui_grid_set_cell_data', 'sapgui_grid_set_checkbox',
+ 'sapgui_grid_double_click_current_cell', 'sapgui_grid_click_current_cell', 'sapgui_grid_press_button_current_cell',
+ 'sapgui_grid_press_total_row_current_cell', 'sapgui_grid_press_F1', 'sapgui_grid_press_F4', 'sapgui_grid_press_ENTER',
+ 'sapgui_grid_press_toolbar_button', 'sapgui_grid_press_toolbar_context_button', 'sapgui_grid_open_context_menu',
+ 'sapgui_grid_select_context_menu', 'sapgui_grid_select_toolbar_menu', 'sapgui_grid_fill_data',
+ 'sapgui_grid_get_current_cell_row', 'sapgui_grid_get_current_cell_column', 'sapgui_grid_get_rows_count',
+ 'sapgui_grid_get_columns_count', 'sapgui_grid_get_cell_data', 'sapgui_grid_is_checkbox_selected',
+ 'sapgui_tree_scroll_to_node', 'sapgui_tree_set_hierarchy_header_width', 'sapgui_tree_set_selected_node',
+ 'sapgui_tree_double_click_node', 'sapgui_tree_press_key', 'sapgui_tree_press_button', 'sapgui_tree_set_checkbox',
+ 'sapgui_tree_double_click_item', 'sapgui_tree_click_link', 'sapgui_tree_open_default_context_menu',
+ 'sapgui_tree_open_node_context_menu', 'sapgui_tree_open_header_context_menu', 'sapgui_tree_open_item_context_menu',
+ 'sapgui_tree_select_context_menu', 'sapgui_tree_select_item', 'sapgui_tree_select_node', 'sapgui_tree_unselect_node',
+ 'sapgui_tree_unselect_all', 'sapgui_tree_select_column', 'sapgui_tree_unselect_column', 'sapgui_tree_set_column_order',
+ 'sapgui_tree_collapse_node', 'sapgui_tree_expand_node', 'sapgui_tree_scroll_to_item', 'sapgui_tree_set_column_width',
+ 'sapgui_tree_press_header', 'sapgui_tree_is_checkbox_selected', 'sapgui_tree_get_node_text', 'sapgui_tree_get_item_text',
+ 'sapgui_calendar_scroll_to_date', 'sapgui_calendar_focus_date', 'sapgui_calendar_select_interval',
+ 'sapgui_apogrid_select_all', 'sapgui_apogrid_clear_selection', 'sapgui_apogrid_select_cell',
+ 'sapgui_apogrid_deselect_cell', 'sapgui_apogrid_select_row', 'sapgui_apogrid_deselect_row',
+ 'sapgui_apogrid_select_column', 'sapgui_apogrid_deselect_column', 'sapgui_apogrid_scroll_to_row',
+ 'sapgui_apogrid_scroll_to_column', 'sapgui_apogrid_double_click', 'sapgui_apogrid_set_cell_data',
+ 'sapgui_apogrid_get_cell_data', 'sapgui_apogrid_is_cell_changeable', 'sapgui_apogrid_get_cell_format',
+ 'sapgui_apogrid_get_cell_tooltip', 'sapgui_apogrid_press_ENTER', 'sapgui_apogrid_open_cell_context_menu',
+ 'sapgui_apogrid_select_context_menu_item', 'sapgui_text_edit_scroll_to_line', 'sapgui_text_edit_set_selection_indexes',
+ 'sapgui_text_edit_set_unprotected_text_part', 'sapgui_text_edit_get_first_visible_line',
+ 'sapgui_text_edit_get_selection_index_start', 'sapgui_text_edit_get_selection_index_end',
+ 'sapgui_text_edit_get_number_of_unprotected_text_parts', 'sapgui_text_edit_double_click',
+ 'sapgui_text_edit_single_file_dropped', 'sapgui_text_edit_multiple_files_dropped', 'sapgui_text_edit_press_F1',
+ 'sapgui_text_edit_press_F4', 'sapgui_text_edit_open_context_menu', 'sapgui_text_edit_select_context_menu',
+ 'sapgui_text_edit_modified_status_changed', 'sapgui_htmlviewer_send_event', 'sapgui_htmlviewer_dom_get_property',
+ 'sapgui_toolbar_press_button', 'sapgui_toolbar_press_context_button', 'sapgui_toolbar_select_menu_item',
+ 'sapgui_toolbar_select_menu_item_by_text', 'sapgui_toolbar_select_context_menu_item',
+ 'sapgui_toolbar_select_context_menu_item_by_text'
+ ),
+ // Constants from as_sapgui.h
+ 10 => array(
+ 'BEGIN_OPTIONAL', 'END_OPTIONAL', 'al-keys', 'ENTER', 'HELP', 'F2', 'BACK', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9',
+ 'F10', 'F11', 'ESC', 'SHIFT_F1', 'SHIFT_F2', 'SHIFT_F3', 'SHIFT_F4', 'SHIFT_F5', 'SHIFT_F6', 'SHIFT_F7', 'SHIFT_F8',
+ 'SHIFT_F9', 'SHIFT_F10', 'SHIFT_F11', 'SHIFT_F12', 'CTRL_F1', 'CTRL_F2', 'CTRL_F3', 'CTRL_F4', 'CTRL_F5', 'CTRL_F6',
+ 'CTRL_F7', 'CTRL_F8', 'CTRL_F9', 'CTRL_F10', 'CTRL_F11', 'CTRL_F12', 'CTRL_SHIFT_F1', 'CTRL_SHIFT_F2', 'CTRL_SHIFT_F3',
+ 'CTRL_SHIFT_F4', 'CTRL_SHIFT_F5', 'CTRL_SHIFT_F6', 'CTRL_SHIFT_F7', 'CTRL_SHIFT_F8', 'CTRL_SHIFT_F9', 'CTRL_SHIFT_F10',
+ 'CTRL_SHIFT_F11', 'CTRL_SHIFT_F12', 'CANCEL', 'CTRL_F', 'CTRL_PAGE_UP', 'PAGE_UP', 'PAGE_DOWN', 'CTRL_PAGE_DOWN',
+ 'CTRL_G', 'CTRL_P'
+ ),
+ ),
+
+ // Symbols and Case Sensitivity
+ // Symbols from: http://en.wikipedia.org/wiki/C_syntax
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']',
+ '+', '-', '*', '/', '%',
+ '=', '<', '>', '!', '^', '&', '|', '?', ':', ';', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true, // Standard C reserved keywords
+ 2 => true, // C preprocessor directives
+ 3 => true, // Functions from lrun.h
+ 4 => true, // Constants from lrun.h
+ 5 => true, // Functions from web_api.h
+ 6 => true, // Constants from web_api.h
+ 7 => true, // Functions from as_web.h
+ 8 => true, // Constants from as_web.h
+ 9 => true, // Functions from as_sapgui.h
+ 10 => true, // Constants from as_sapgui.h
+ ),
+
+ // Styles
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ // Functions are brown, constants and reserved words are blue
+ 1 => 'color: #0000ff;', // Standard C reserved keywords
+ 2 => 'color: #0000ff;', // C preprocessor directives
+ 3 => 'color: #8a0000;', // Functions from lrun.h
+ 4 => 'color: #0000ff;', // Constants from lrun.h
+ 5 => 'color: #8a0000;', // Functions from web_api.h
+ 6 => 'color: #0000ff;', // Constants from web_api.h
+ 7 => 'color: #8a0000;', // Functions from as_web.h
+ 8 => 'color: #0000ff;', // Constants from as_web.h
+ 9 => 'color: #8a0000;', // Functions from as_sapgui.h
+ 10 => 'color: #0000ff;', // Constants from as_sapgui.h
+ ),
+ 'COMMENTS' => array(
+ // Comments are grey
+ 1 => 'color: #9b9b9b;',
+ 'MULTI' => 'color: #9b9b9b;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ // GeSHi cannot define a separate style for ESCAPE_REGEXP. The style for ESCAPE_CHAR also applies to ESCAPE_REGEXP.
+ // This is used for LoadRunner {parameters}
+ // {parameters} are pink
+ 0 => 'color: #c000c0;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ // Strings are green
+ 0 => 'color: #008080;'
+ ),
+ 'NUMBERS' => array(
+ // Numbers are green
+ 0 => 'color: #008080;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #008080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #008080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #008080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#008080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#008080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#008080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#008080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #000000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+
+ // URLs for Functions
+ 'URLS' => array(
+ 1 => '', // Standard C reserved keywords
+ 2 => '', // C preprocessor directives
+ 3 => '', // Functions from lrun.h
+ 4 => '', // Constants from lrun.h
+ 5 => '', // Functions from web_api.h
+ 6 => '', // Constants from web_api.h
+ 7 => '', // Functions from as_web.h
+ 8 => '', // Constants from as_web.h
+ 9 => '', // Functions from as_sapgui.h
+ 10 => '', // Constants from as_sapgui.h
+ ),
+
+ // Object Orientation
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+
+ // Regular Expressions
+ // Note that REGEXPS are not applied within strings.
+ 'REGEXPS' => array(
+ ),
+
+ // Contextual Highlighting and Strict Mode
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+
+ // Tabs
+ // Note that if you are using <pre> tags for your code, then the browser chooses how many spaces your tabs will translate to.
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/c_mac.php b/inc/geshi/c_mac.php
index 1a034ae08..41c21ce54 100644
--- a/inc/geshi/c_mac.php
+++ b/inc/geshi/c_mac.php
@@ -4,7 +4,7 @@
* ---------
* Author: M. Uli Kusterer (witness.of.teachtext@gmx.net)
* Copyright: (c) 2004 M. Uli Kusterer, Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/04
*
* C for Macs language file for GeSHi.
diff --git a/inc/geshi/caddcl.php b/inc/geshi/caddcl.php
index 74310d6d9..8b8b2f248 100644
--- a/inc/geshi/caddcl.php
+++ b/inc/geshi/caddcl.php
@@ -4,7 +4,7 @@
* ----------
* Author: Roberto Rossi (rsoftware@altervista.org)
* Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/30
*
* CAD DCL (Dialog Control Language) language file for GeSHi.
diff --git a/inc/geshi/cadlisp.php b/inc/geshi/cadlisp.php
index 9277e5192..3fa7ead09 100644
--- a/inc/geshi/cadlisp.php
+++ b/inc/geshi/cadlisp.php
@@ -4,7 +4,7 @@
* -----------
* Author: Roberto Rossi (rsoftware@altervista.org)
* Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/blog)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/30
*
* AutoCAD/IntelliCAD Lisp language file for GeSHi.
diff --git a/inc/geshi/cfdg.php b/inc/geshi/cfdg.php
index ee17fdf53..e40963f06 100644
--- a/inc/geshi/cfdg.php
+++ b/inc/geshi/cfdg.php
@@ -4,7 +4,7 @@
* --------
* Author: John Horigan <john@glyphic.com>
* Copyright: (c) 2006 John Horigan http://www.ozonehouse.com/john/
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/03/11
*
* CFDG language file for GeSHi.
diff --git a/inc/geshi/cfm.php b/inc/geshi/cfm.php
index dd508eec7..2d165bd68 100644
--- a/inc/geshi/cfm.php
+++ b/inc/geshi/cfm.php
@@ -4,7 +4,7 @@
* -------
* Author: Diego
* Copyright: (c) 2006 Diego
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/02/25
*
* ColdFusion language file for GeSHi.
diff --git a/inc/geshi/chaiscript.php b/inc/geshi/chaiscript.php
index e1baad4db..f9d0a8681 100644
--- a/inc/geshi/chaiscript.php
+++ b/inc/geshi/chaiscript.php
@@ -6,7 +6,7 @@
* Copyright: (c) 2010 Jason Turner (lefticus@gmail.com),
* (c) 2009 Jonathan Turner,
* (c) 2004 Ben Keen (ben.keen@gmail.com), Benny Baumann (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/07/03
*
* ChaiScript language file for GeSHi.
@@ -52,7 +52,7 @@ $language_data = array (
'ESCAPE_CHAR' => '\\',
'KEYWORDS' => array(
1 => array(
- 'break', 'else', 'else if', 'eval', 'for', 'if', 'return', 'while', 'try', 'catch', 'finally',
+ 'break', 'else', 'elseif', 'eval', 'for', 'if', 'return', 'while', 'try', 'catch', 'finally',
),
2 => array(
'def', 'false', 'fun', 'true', 'var', 'attr',
diff --git a/inc/geshi/cil.php b/inc/geshi/cil.php
index 142c7743a..9872e755f 100644
--- a/inc/geshi/cil.php
+++ b/inc/geshi/cil.php
@@ -4,7 +4,7 @@
* --------
* Author: Marcus Griep (neoeinstein+GeSHi@gmail.com)
* Copyright: (c) 2007 Marcus Griep (http://www.xpdm.us)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/10/24
*
* CIL (Common Intermediate Language) language file for GeSHi.
diff --git a/inc/geshi/clojure.php b/inc/geshi/clojure.php
index 4bcb9a3ae..0ad4e4ad7 100644
--- a/inc/geshi/clojure.php
+++ b/inc/geshi/clojure.php
@@ -4,7 +4,7 @@
* --------
* Author: Jess Johnson (jess@grok-code.com)
* Copyright: (c) 2009 Jess Johnson (http://grok-code.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/09/20
*
* Clojure language file for GeSHi.
diff --git a/inc/geshi/cmake.php b/inc/geshi/cmake.php
index ccd855b0b..67277aa9c 100644
--- a/inc/geshi/cmake.php
+++ b/inc/geshi/cmake.php
@@ -4,7 +4,7 @@
* -------
* Author: Daniel Nelson (danieln@eng.utah.edu)
* Copyright: (c) 2009 Daniel Nelson
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/04/06
*
* CMake language file for GeSHi.
diff --git a/inc/geshi/cobol.php b/inc/geshi/cobol.php
index c1220a06f..b07be48a1 100644
--- a/inc/geshi/cobol.php
+++ b/inc/geshi/cobol.php
@@ -4,7 +4,7 @@
* ----------
* Author: BenBE (BenBE@omorphia.org)
* Copyright: (c) 2007-2008 BenBE (http://www.omorphia.de/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/07/02
*
* COBOL language file for GeSHi.
diff --git a/inc/geshi/coffeescript.php b/inc/geshi/coffeescript.php
new file mode 100644
index 000000000..194aecd08
--- /dev/null
+++ b/inc/geshi/coffeescript.php
@@ -0,0 +1,146 @@
+<?php
+/*************************************************************************************
+ * coffeescript.php
+ * ----------
+ * Author: Trevor Burnham (trevorburnham@gmail.com)
+ * Copyright: (c) 2010 Trevor Burnham (http://iterative.ly)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/08
+ *
+ * CoffeeScript language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/06/08 (1.0.8.9)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'CoffeeScript',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array('###' => '###'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ //Longest quotemarks ALWAYS first
+ 'QUOTEMARKS' => array('"""', "'''", '"', "'"),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+
+ /*
+ ** Set 1: control keywords
+ */
+ 1 => array(
+ 'break', 'by', 'catch', 'continue', 'else', 'finally', 'for', 'in', 'of', 'if',
+ 'return', 'switch', 'then', 'throw', 'try', 'unless', 'when', 'while', 'until'
+ ),
+
+ /*
+ ** Set 2: logic keywords
+ */
+ 2 => array(
+ 'and', 'or', 'is', 'isnt', 'not'
+ ),
+
+ /*
+ ** Set 3: other keywords
+ */
+ 3 => array(
+ 'instanceof', 'new', 'delete', 'typeof',
+ 'class', 'super', 'this', 'extends'
+ ),
+
+ /*
+ ** Set 4: constants
+ */
+ 4 => array(
+ 'true', 'false', 'on', 'off', 'yes', 'no',
+ 'Infinity', 'NaN', 'undefined', 'null'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '*', '&', '|', '%', '!', ',', ';', '<', '>', '?', '`',
+ '+', '-', '*', '/', '->', '=>', '<<', '>>', '@', ':', '^'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #ff7700;font-weight:bold;',
+ 2 => 'color: #008000;',
+ 3 => 'color: #dc143c;',
+ 4 => 'color: #0000cd;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: black;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #483d8b;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff4500;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: black;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<script type="text/coffeescript">' => '</script>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/cpp-qt.php b/inc/geshi/cpp-qt.php
index 8523d16b7..36626c90d 100644
--- a/inc/geshi/cpp-qt.php
+++ b/inc/geshi/cpp-qt.php
@@ -4,10 +4,10 @@
* -------
* Author: Iulian M
* Copyright: (c) 2006 Iulian M
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/09/27
*
- * C++ (with QT extensions) language file for GeSHi.
+ * C++ (with Qt extensions) language file for GeSHi.
*
* CHANGES
* -------
@@ -41,7 +41,7 @@
************************************************************************************/
$language_data = array (
- 'LANG_NAME' => 'C++ (QT)',
+ 'LANG_NAME' => 'C++ (Qt)',
'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
'COMMENT_MULTI' => array('/*' => '*/'),
'COMMENT_REGEXP' => array(
@@ -55,7 +55,7 @@ $language_data = array (
'ESCAPE_CHAR' => '',
'ESCAPE_REGEXP' => array(
//Simple Single Char Escapes
- 1 => "#\\\\[\\\\abfnrtv\'\"?\n]#i",
+ 1 => "#\\\\[abfnrtv\\\'\"?\n]#i",
//Hexadecimal Char Specs
2 => "#\\\\x[\da-fA-F]{2}#",
//Hexadecimal Char Specs
diff --git a/inc/geshi/cpp.php b/inc/geshi/cpp.php
index 30f5a93f2..42ab311cc 100644
--- a/inc/geshi/cpp.php
+++ b/inc/geshi/cpp.php
@@ -7,7 +7,7 @@
* - M. Uli Kusterer (witness.of.teachtext@gmx.net)
* - Jack Lloyd (lloyd@randombit.net)
* Copyright: (c) 2004 Dennis Bayer, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/09/27
*
* C++ language file for GeSHi.
@@ -63,7 +63,7 @@ $language_data = array (
'ESCAPE_CHAR' => '',
'ESCAPE_REGEXP' => array(
//Simple Single Char Escapes
- 1 => "#\\\\[\\\\abfnrtv\'\"?\n]#i",
+ 1 => "#\\\\[abfnrtv\\\'\"?\n]#i",
//Hexadecimal Char Specs
2 => "#\\\\x[\da-fA-F]{2}#",
//Hexadecimal Char Specs
diff --git a/inc/geshi/csharp.php b/inc/geshi/csharp.php
index 6a9c3c2bd..26024e91a 100644
--- a/inc/geshi/csharp.php
+++ b/inc/geshi/csharp.php
@@ -5,13 +5,15 @@
* Author: Alan Juden (alan@judenware.org)
* Revised by: Michael Mol (mikemol@gmail.com)
* Copyright: (c) 2004 Alan Juden, Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/04
*
* C# language file for GeSHi.
*
* CHANGES
* -------
+ * 2012/06/18 (1.0.8.11)
+ * - Added missing keywords (Christian Stelzmann)
* 2009/04/03 (1.0.8.6)
* - Added missing keywords identified by Rosetta Code users.
* 2008/05/25 (1.0.7.22)
@@ -60,14 +62,15 @@ $language_data = array (
'ESCAPE_CHAR' => '\\',
'KEYWORDS' => array(
1 => array(
- 'as', 'auto', 'base', 'break', 'case', 'catch', 'const', 'continue',
+ 'abstract', 'add', 'as', 'base', 'break', 'by', 'case', 'catch', 'const', 'continue',
'default', 'do', 'else', 'event', 'explicit', 'extern', 'false',
- 'finally', 'fixed', 'for', 'foreach', 'from', 'goto', 'if',
- 'implicit', 'in', 'internal', 'lock', 'namespace', 'null',
+ 'finally', 'fixed', 'for', 'foreach', 'from', 'get', 'goto', 'group', 'if',
+ 'implicit', 'in', 'into', 'internal', 'join', 'lock', 'namespace', 'null',
'operator', 'out', 'override', 'params', 'partial', 'private',
- 'protected', 'public', 'readonly', 'ref', 'return', 'sealed',
- 'select', 'stackalloc', 'static', 'switch', 'this', 'throw', 'true',
- 'try', 'unsafe', 'using', 'virtual', 'where', 'while', 'yield'
+ 'protected', 'public', 'readonly', 'remove', 'ref', 'return', 'sealed',
+ 'select', 'set', 'stackalloc', 'static', 'switch', 'this', 'throw', 'true',
+ 'try', 'unsafe', 'using', 'var', 'value', 'virtual', 'volatile', 'where',
+ 'while', 'yield'
),
2 => array(
'#elif', '#endif', '#endregion', '#else', '#error', '#define', '#if',
@@ -78,7 +81,7 @@ $language_data = array (
),
4 => array(
'bool', 'byte', 'char', 'class', 'decimal', 'delegate', 'double',
- 'enum', 'float', 'int', 'interface', 'long', 'object', 'sbyte',
+ 'dynamic', 'enum', 'float', 'int', 'interface', 'long', 'object', 'sbyte',
'short', 'string', 'struct', 'uint', 'ulong', 'ushort', 'void'
),
5 => array(
diff --git a/inc/geshi/css.php b/inc/geshi/css.php
index 51f261486..d09bea7da 100644
--- a/inc/geshi/css.php
+++ b/inc/geshi/css.php
@@ -4,7 +4,7 @@
* -------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/18
*
* CSS language file for GeSHi.
@@ -58,12 +58,22 @@ $language_data = array (
),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array('"', "'"),
- 'ESCAPE_CHAR' => '\\',
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ //1 => "#\\\\[nfrtv\$\"\n\\\\]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\[\da-fA-F]{1,6}\s?#i",
+ //Unicode Char Specs
+ //3 => "#\\\\u[\da-fA-F]{1,8}#i",
+ ),
'KEYWORDS' => array(
1 => array(
'aqua', 'azimuth', 'background-attachment', 'background-color',
'background-image', 'background-position', 'background-repeat',
'background', 'black', 'blue', 'border-bottom-color',
+ 'border-radius', 'border-top-left-radius', 'border-top-right-radius',
+ 'border-bottom-right-radius', 'border-bottom-left-radius',
'border-bottom-style', 'border-bottom-width', 'border-left-color',
'border-left-style', 'border-left-width', 'border-right',
'border-right-color', 'border-right-style', 'border-right-width',
@@ -153,7 +163,10 @@ $language_data = array (
'MULTI' => 'color: #808080; font-style: italic;'
),
'ESCAPE_CHAR' => array(
- 0 => 'color: #000099; font-weight: bold;'
+ 0 => 'color: #000099; font-weight: bold;',
+ //1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #000099; font-weight: bold;'
+ //3 => 'color: #000099; font-weight: bold;'
),
'BRACKETS' => array(
0 => 'color: #00AA00;'
@@ -204,7 +217,8 @@ $language_data = array (
'TAB_WIDTH' => 4,
'PARSER_CONTROL' => array(
'KEYWORDS' => array(
- 'DISALLOWED_AFTER' => '(?![a-zA-Z0-9_\|%\\-&\.])'
+ 'DISALLOWED_AFTER' => '(?![\-a-zA-Z0-9_\|%\\-&\.])',
+ 'DISALLOWED_BEFORE' => '(?<![\-a-zA-Z0-9_\|%\\~&\.])'
)
)
);
diff --git a/inc/geshi/cuesheet.php b/inc/geshi/cuesheet.php
index 81c607c10..ebaca955f 100644
--- a/inc/geshi/cuesheet.php
+++ b/inc/geshi/cuesheet.php
@@ -4,7 +4,7 @@
* ----------
* Author: Benny Baumann (benbe@geshi.org)
* Copyright: (c) 2009 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/12/21
*
* Cuesheet language file for GeSHi.
diff --git a/inc/geshi/d.php b/inc/geshi/d.php
index 5ef349d52..7f3e9857a 100644
--- a/inc/geshi/d.php
+++ b/inc/geshi/d.php
@@ -3,14 +3,18 @@
* d.php
* -----
* Author: Thomas Kuehne (thomas@kuehne.cn)
+ * Contributors:
+ * - Jimmy Cao
* Copyright: (c) 2005 Thomas Kuehne (http://thomas.kuehne.cn/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/04/22
*
* D language file for GeSHi.
*
* CHANGES
* -------
+ * 2011/06/28 (0.0.3) (Jimmy Cao)
+ * - added D2 features
* 2005/04/22 (0.0.2)
* - added _d_* and sizeof/ptrdiff_t
* 2005/04/20 (0.0.1)
@@ -45,7 +49,7 @@
$language_data = array (
'LANG_NAME' => 'D',
'COMMENT_SINGLE' => array(2 => '///', 1 => '//'),
- 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_MULTI' => array('/*' => '*/', '/+' => '+/'),
'COMMENT_REGEXP' => array(
// doxygen comments
3 => '#/\*\*(?![\*\/]).*\*/#sU',
@@ -126,63 +130,39 @@ $language_data = array (
1 => array(
'break', 'case', 'continue', 'do', 'else',
'for', 'foreach', 'goto', 'if', 'return',
- 'switch', 'while'
+ 'switch', 'while', 'foreach_reverse'
),
2 => array(
'alias', 'asm', 'assert', 'body', 'cast',
'catch', 'default', 'delegate', 'delete',
'extern', 'false', 'finally', 'function',
- 'import', 'in', 'inout', 'interface',
- 'invariant', 'is', 'mixin', 'module', 'new',
+ 'import', 'in', 'inout',
+ 'invariant', 'is', 'lazy', 'mixin', 'module', 'new',
'null', 'out', 'pragma', 'ref', 'super', 'this',
- 'throw', 'true', 'try', 'typedef', 'typeid',
- 'typeof', 'union', 'with'
+ 'throw', 'true', 'try', 'typeid',
+ 'typeof', 'union', 'with', 'scope'
),
3 => array(
- 'ArrayBoundsError', 'AssertError',
'ClassInfo', 'Error', 'Exception',
- 'Interface', 'ModuleInfo', 'Object',
- 'OutOfMemoryException', 'SwitchError',
- 'TypeInfo', '_d_arrayappend',
- '_d_arrayappendb', '_d_arrayappendc',
- '_d_arrayappendcb', '_d_arraycast',
- '_d_arraycast_frombit', '_d_arraycat',
- '_d_arraycatb', '_d_arraycatn',
- '_d_arraycopy', '_d_arraycopybit',
- '_d_arraysetbit', '_d_arraysetbit2',
- '_d_arraysetlength', '_d_arraysetlengthb',
- '_d_callfinalizer',
- '_d_create_exception_object',
- '_d_criticalenter', '_d_criticalexit',
- '_d_delarray', '_d_delclass',
- '_d_delinterface', '_d_delmemory',
- '_d_dynamic_cast', '_d_exception',
- '_d_exception_filter', '_d_framehandler',
- '_d_interface_cast', '_d_interface_vtbl',
- '_d_invariant', '_d_isbaseof',
- '_d_isbaseof2', '_d_local_unwind',
- '_d_monitorenter', '_d_monitorexit',
- '_d_monitorrelease', '_d_monitor_epilog',
- '_d_monitor_handler', '_d_monitor_prolog',
- '_d_new', '_d_newarrayi', '_d_newbitarray',
- '_d_newclass', '_d_obj_cmp', '_d_obj_eq',
- '_d_OutOfMemory', '_d_switch_dstring',
- '_d_switch_string', '_d_switch_ustring',
- '_d_throw',
+ 'Interface', 'Object', 'IMonitor',
+ 'OffsetTypeInfo', 'Throwable',
+ 'TypeInfo_Class', 'TypeInfo', '__traits',
+ '__EOF__', '__FILE__', '__LINE__',
),
4 => array(
'abstract', 'align', 'auto', 'bit', 'bool',
- 'byte', 'cdouble', 'cent', 'cfloat', 'char',
- 'class', 'const', 'creal', 'dchar', 'debug',
+ 'byte', 'cdouble', 'cfloat', 'char',
+ 'class', 'const', 'creal', 'dchar', 'dstring', 'debug',
'deprecated', 'double', 'enum', 'export',
- 'final', 'float', 'idouble', 'ifloat', 'int',
- 'ireal', 'long', 'override', 'package',
- 'private', 'protected', 'ptrdiff_t',
- 'public', 'real', 'short', 'size_t',
- 'static', 'struct', 'synchronized',
+ 'final', 'float', 'idouble', 'ifloat', 'immutable', 'int',
+ 'interface', 'ireal', 'long', 'nothrow', 'override',
+ 'package', 'private', 'protected', 'ptrdiff_t',
+ 'public', 'real', 'short', 'shared', 'size_t',
+ 'static', 'string', 'struct', 'synchronized',
'template', 'ubyte', 'ucent', 'uint',
'ulong', 'unittest', 'ushort', 'version',
- 'void', 'volatile', 'wchar'
+ 'void', 'volatile', 'wchar', 'wstring',
+ '__gshared', '@disable', '@property', 'pure', 'safe'
)
),
'SYMBOLS' => array(
diff --git a/inc/geshi/dcl.php b/inc/geshi/dcl.php
new file mode 100644
index 000000000..db12a4c4e
--- /dev/null
+++ b/inc/geshi/dcl.php
@@ -0,0 +1,192 @@
+<?php
+/*************************************************************************************
+ * dcl.php
+ * --------
+ * Author: Petr Hendl (petr@hendl.cz)
+ * Copyright: (c) 2011 Petr Hendl http://hendl.cz/geshi/
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/02/17
+ *
+ * DCL language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011-02-17 (1.0.8.11)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'DCL',
+ 'COMMENT_SINGLE' => array('$!', '!'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ 2 => '/(?<=\$)\s*sql\s+.*?(?:quit|exit);?\s*?$/sim' // do not highlight inline sql
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'HARDESCAPE' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ 1 => "/''[a-zA-Z\\-_]+'/"
+ ),
+ 'KEYWORDS' => array(
+ 1 => array( // commands
+ 'ACCOUNTING', 'ALLOCATE', 'ANALYZE', 'APPEND', 'ASSIGN', 'ATTACH', 'BACKUP',
+ 'CALL', 'CANCEL', 'CHECKSUM', 'CLOSE', 'CONNECT', 'CONTINUE', 'CONVERT',
+ 'COPY', 'CREATE', 'DEALLOCATE', 'DEASSIGN', 'DEBUG', 'DECK',
+ 'DECRYPT', 'DEFINE', 'DELETE', 'DEPOSIT', 'DIFFERENCES', 'DIRECTORY',
+ 'DISABLE', 'AUTOSTART', 'DISCONNECT', 'DISMOUNT', 'DUMP', 'EDIT', 'ENABLE',
+ 'ENCRYPT', 'ENDSUBROUTINE', 'EOD', 'EOJ', 'EXAMINE', 'EXCHANGE',
+ 'EXIT', 'FONT', 'GOSUB', 'GOTO', 'HELP', 'IF', 'THEN', 'ELSE', 'ENDIF', 'INITIALIZE', 'INQUIRE',
+ 'INSTALL', 'JAVA', 'JOB', 'LIBRARY', 'LICENSE', 'LINK', 'LOGIN', 'LOGOUT',
+ 'MACRO', 'MAIL', 'MERGE', 'MESSAGE', 'MONITOR', 'MOUNT', 'NCS', 'ON', 'OPEN',
+ 'PASSWORD', 'PATCH', 'PHONE', 'PIPE', 'PPPD', 'PRINT', 'PRODUCT', 'PURGE',
+ 'READ', 'RECALL', 'RENAME', 'REPLY', 'REQUEST', 'RETURN', 'RMU', 'RUN', 'RUNOFF',
+ 'SEARCH', 'SET', 'SET AUDIT', 'SET BOOTBLOCK', 'SET BROADCAST',
+ 'SET CACHE', 'SET CARD_READER', 'SET CLUSTER', 'SET COMMAND', 'SET CONTROL',
+ 'SET CPU', 'SET DAY', 'SET DEFAULT', 'SET DEVICE', 'SET DIRECTORY',
+ 'SET DISPLAY', 'SET ENTRY', 'SET FILE', 'SET HOST', 'SET IMAGE', 'SET KEY',
+ 'SET LOGINS', 'SET MAGTAPE', 'SET MESSAGE', 'SET NETWORK', 'SET ON', 'SET OUTPUT_RATE',
+ 'SET PASSWORD', 'SET PREFERRED_PATH', 'SET PREFIX', 'SET PRINTER', 'SET PROCESS',
+ 'SET PROMPT', 'SET PROTECTION', 'SET QUEUE', 'SET RESTART_VALUE',
+ 'SET RIGHTS_LIST', 'SET RMS_DEFAULT', 'SET ROOT', 'SET SECURITY',
+ 'SET SERVER ACME_SERVER', 'SET SERVER REGISTRY_SERVER', 'SET SERVER SECURITY_SERVER',
+ 'SET SHADOW', 'SET SYMBOL', 'SET TERMINAL', 'SET TIME', 'SET VERIFY',
+ 'SET VOLUME', 'SET WORKING_SET', 'SHOW', 'SHOW AUDIT',
+ 'SHOW BROADCAST', 'SHOW CLUSTER', 'SHOW CPU', 'SHOW DEFAULT', 'SHOW DEVICES',
+ 'SHOW DISPLAY', 'SHOW ENTRY', 'SHOW ERROR', 'SHOW FASTPATH', 'SHOW IMAGE',
+ 'SHOW INTRUSION', 'SHOW KEY', 'SHOW LICENSE', 'SHOW LOGICAL', 'SHOW MEMORY',
+ 'SHOW NETWORK', 'SHOW PRINTER', 'SHOW PROCESS', 'SHOW PROTECTION', 'SHOW QUEUE',
+ 'SHOW QUOTA', 'SHOW RMS_DEFAULT', 'SHOW ROOT', 'SHOW SECURITY',
+ 'SHOW SERVER ACME_SERVER', 'SHOW SERVER REGISTRY_SERVER', 'SHOW SHADOW',
+ 'SHOW STATUS', 'SHOW SYMBOL', 'SHOW SYSTEM', 'SHOW TERMINAL', 'SHOW TIME',
+ 'SHOW TRANSLATION', 'SHOW USERS', 'SHOW WORKING_SET', 'SHOW ZONE', 'SORT',
+ 'SPAWN', 'START', 'STOP', 'SUBMIT', 'SUBROUTINE', 'SYNCHRONIZE', 'TYPE',
+ 'UNLOCK', 'VIEW', 'WAIT', 'WRITE', 'XAUTH'
+ ),
+ 2 => array( // lexical functions
+ 'F$CONTEXT', 'F$CSID', 'F$CUNITS', 'F$CVSI', 'F$CVTIME', 'F$CVUI',
+ 'F$DELTA_TIME', 'F$DEVICE', 'F$DIRECTORY', 'F$EDIT', 'F$ELEMENT',
+ 'F$ENVIRONMENT', 'F$EXTRACT', 'F$FAO', 'F$FID_TO_NAME', 'F$FILE_ATTRIBUTES',
+ 'F$GETDVI', 'F$GETENV', 'F$GETJPI', 'F$GETQUI', 'F$GETSYI', 'F$IDENTIFIER',
+ 'F$INTEGER', 'F$LENGTH', 'F$LICENSE', 'F$LOCATE', 'F$MATCH_WILD', 'F$MESSAGE',
+ 'F$MODE', 'F$MULTIPATH', 'F$PARSE', 'F$PID', 'F$PRIVILEGE', 'F$PROCESS',
+ 'F$SEARCH', 'F$SETPRV', 'F$STRING', 'F$TIME', 'F$TRNLNM', 'F$TYPE', 'F$UNIQUE',
+ 'F$USER', 'F$VERIFY'
+ ),
+ 3 => array( // special variables etc
+ 'sql$database', 'P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7', 'P8', 'P9',
+ '$status', '$severity', 'sys$login', 'sys$system',
+ 'sys$input', 'sys$output', 'sys$pipe'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '@', '&', '|', '<', '>', '-',
+ '.eqs.', '.eq.', '.lt.', '.lts.', '.gt.', '.gts.', '.ne.', '.nes.',
+ '.le.', '.ge.', '.ges.', '.les.',
+ '.EQS.', '.EQ.', '.LT.', '.LTS.', '.GT.', '.GTS.', '.NE.', '.NES.',
+ '.LE.', '.GE.', '.GES.', '.LES.',
+ '.and.', '.or.', '.not.',
+ '.AND.', '.OR.', '.NOT.',
+ '==', ':==', '=', ':='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #0066FF;',
+ 3 => 'color: #993300;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #666666; font-style: italic;',
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #9999FF; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #006666;',
+ 1 => 'color: #0099FF;',
+ 2 => 'color: red;',
+ 3 => 'color: #007800;',
+ 4 => 'color: #007800;',
+ 5 => 'color: #780078;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #7a0874; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0099FF;', // variables
+ 1 => 'color: #0000FF;', // qualifiers
+ 2 => 'color: #FF6600; font-weight: bold;' // labels
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // variables
+ 0 => "'[a-zA-Z_\\-$]+'",
+ // qualifiers and parameters
+ 1 => "(?:\/[a-zA-Z_\/]+)[\s=]",
+ // labels
+ 2 => '(?<=\$)\s*[a-zA-Z\-_]+:'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ ),
+ 'KEYWORDS' => array(
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/dcpu16.php b/inc/geshi/dcpu16.php
new file mode 100644
index 000000000..5fcb25e51
--- /dev/null
+++ b/inc/geshi/dcpu16.php
@@ -0,0 +1,131 @@
+<?php
+/*************************************************************************************
+ * dcpu16.php
+ * -------
+ * Author: Benny Baumann (BenBE@omorphia.de)
+ * Copyright: (c) 2007-2012 Benny Baumann (http://geshi.org/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/04/12
+ *
+ * DCPU/16 Assembly language file for GeSHi.
+ * Syntax definition based on http://0x10c.com/doc/dcpu-16.txt
+ *
+ * CHANGES
+ * -------
+ * 2012/04/12 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2012/04/12)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'DCPU-16 Assembly',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'NUMBERS' => GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_HEX_PREFIX,
+ 'KEYWORDS' => array(
+ /*CPU*/
+ 1 => array(
+ 'set','add','sub','mul','div','mod','shl','shr','and','bor','xor',
+ 'ife','ifn','ifg','ifb',
+ 'jsr'
+ ),
+ /*registers*/
+ 2 => array(
+ 'a','b','c','x','y','z','i','j',
+ 'pc','sp','o',
+ 'pop','peek','push' //Special cases with DCPU-16
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '+', '-', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000088; font-weight:bold;',
+ 2 => 'color: #0000ff;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000088;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #880000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ 2 => 'color: #993333;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://0x10c.com/doc/dcpu-16.txt',
+ 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Hex numbers
+ //0 => '0[0-9a-fA-F]{1,32}[hH]',
+ //Binary numbers
+ //1 => '\%[01]{1,64}|[01]{1,64}[bB]?(?![^<]*>)',
+ //Labels
+ 2 => '^:[_a-zA-Z][_a-zA-Z0-9]?(?=\s|$)'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#\/])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_\|%\\-])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/dcs.php b/inc/geshi/dcs.php
index 4762ed906..d32cfc5b9 100644
--- a/inc/geshi/dcs.php
+++ b/inc/geshi/dcs.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Stelio Passaris (GeSHi@stelio.net)
* Copyright: (c) 2009 Stelio Passaris (http://stelio.net/stiki/GeSHi)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/01/20
*
* DCS language file for GeSHi.
diff --git a/inc/geshi/delphi.php b/inc/geshi/delphi.php
index ff54af8f9..d5596e0cd 100644
--- a/inc/geshi/delphi.php
+++ b/inc/geshi/delphi.php
@@ -4,13 +4,17 @@
* ----------
* Author: J�rja Norbert (jnorbi@vipmail.hu), Benny Baumann (BenBE@omorphia.de)
* Copyright: (c) 2004 J�rja Norbert, Benny Baumann (BenBE@omorphia.de), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/07/26
*
* Delphi (Object Pascal) language file for GeSHi.
*
* CHANGES
* -------
+ * 2012/06/27 (1.0.8.11)
+ * - Added some keywords
+ * - fixed hex numbers and hex char literals (including WideChar)
+ * - Added support for FPC-Style generics
* 2008/05/23 (1.0.7.22)
* - Added description of extra language features (SF#1970248)
* 2005/11/19 (1.0.3)
@@ -51,27 +55,28 @@ $language_data = array (
'COMMENT_MULTI' => array('(*' => '*)', '{' => '}'),
//Compiler directives
'COMMENT_REGEXP' => array(2 => '/\\{\\$.*?}|\\(\\*\\$.*?\\*\\)/U'),
- 'CASE_KEYWORDS' => 0,
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array("'"),
'ESCAPE_CHAR' => '',
+
'KEYWORDS' => array(
1 => array(
'Abstract', 'And', 'Array', 'As', 'Asm', 'At', 'Begin', 'Case',
- 'Class', 'Const', 'Constructor', 'Contains', 'Destructor',
+ 'Class', 'Const', 'Constructor', 'Contains', 'Default', 'delayed', 'Destructor',
'DispInterface', 'Div', 'Do', 'DownTo', 'Else', 'End', 'Except',
- 'Export', 'Exports', 'External', 'File', 'Finalization', 'Finally',
- 'For', 'Function', 'Goto', 'If', 'Implementation', 'In', 'Inherited',
- 'Initialization', 'Inline', 'Interface', 'Is', 'Label', 'Library',
- 'Mod', 'Not', 'Object', 'Of', 'On', 'Or', 'Overload', 'Override',
+ 'Export', 'Exports', 'External', 'File', 'Finalization', 'Finally', 'For',
+ 'Function', 'Generic', 'Goto', 'If', 'Implementation', 'In', 'Inherited',
+ 'Initialization', 'Inline', 'Interface', 'Is', 'Label', 'Library', 'Message',
+ 'Mod', 'Nil', 'Not', 'Object', 'Of', 'On', 'Or', 'Overload', 'Override',
'Package', 'Packed', 'Private', 'Procedure', 'Program', 'Property',
- 'Protected', 'Public', 'Published', 'Raise', 'Record', 'Register',
- 'Repeat', 'Requires', 'Resourcestring', 'Set', 'Shl', 'Shr', 'Then',
- 'ThreadVar', 'To', 'Try', 'Type', 'Unit', 'Until', 'Uses', 'Var',
- 'Virtual', 'While', 'With', 'Xor', 'assembler', 'far',
+ 'Protected', 'Public', 'Published', 'Read', 'Raise', 'Record', 'Register',
+ 'Repeat', 'Requires', 'Resourcestring', 'Set', 'Shl', 'Shr', 'Specialize', 'Stored',
+ 'Then', 'ThreadVar', 'To', 'Try', 'Type', 'Unit', 'Until', 'Uses', 'Var',
+ 'Virtual', 'While', 'With', 'Write', 'Xor', 'assembler', 'far',
'near', 'pascal', 'cdecl', 'safecall', 'stdcall', 'varargs'
),
2 => array(
- 'nil', 'false', 'self', 'true', 'var', 'type', 'const'
+ 'false', 'self', 'true',
),
3 => array(
'Abs', 'AcquireExceptionObject', 'Addr', 'AnsiToUtf8', 'Append', 'ArcTan',
@@ -250,7 +255,7 @@ $language_data = array (
1 => 'color: #006600;'
),
'REGEXPS' => array(
- 0 => 'color: #9ac;',
+ 0 => 'color: #0000cc;',
1 => 'color: #ff0000;'
),
'SYMBOLS' => array(
@@ -274,16 +279,23 @@ $language_data = array (
),
'REGEXPS' => array(
//Hex numbers
- 0 => '\$[0-9a-fA-F]+',
+ 0 => '(?<!\#)\$[0-9a-fA-F]+(?!\w)',
//Characters
- 1 => '\#(?:\$[0-9a-fA-F]{1,2}|\d{1,3})'
+ 1 => '\#(?:\$[0-9a-fA-F]{1,4}|\d{1,5})'
),
'STRICT_MODE_APPLIES' => GESHI_NEVER,
'SCRIPT_DELIMITERS' => array(
),
'HIGHLIGHT_STRICT_BLOCK' => array(
),
- 'TAB_WIDTH' => 2
+ 'TAB_WIDTH' => 2,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 3 => array(
+ 'DISALLOWED_AFTER' => '(?=\s*[(;])'
+ )
+ )
+ )
);
-?> \ No newline at end of file
+?>
diff --git a/inc/geshi/diff.php b/inc/geshi/diff.php
index 5570406da..5b6817178 100644
--- a/inc/geshi/diff.php
+++ b/inc/geshi/diff.php
@@ -4,7 +4,7 @@
* --------
* Author: Conny Brunnkvist (conny@fuchsia.se), W. Tasin (tasin@fhm.edu)
* Copyright: (c) 2004 Fuchsia Open Source Solutions (http://www.fuchsia.se/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/12/29
*
* Diff-output language file for GeSHi.
diff --git a/inc/geshi/div.php b/inc/geshi/div.php
index 276e9e882..aa11795ac 100644
--- a/inc/geshi/div.php
+++ b/inc/geshi/div.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Gabriel Lorenzo (ermakina@gmail.com)
* Copyright: (c) 2005 Gabriel Lorenzo (http://ermakina.gazpachito.net)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/06/19
*
* DIV language file for GeSHi.
diff --git a/inc/geshi/dos.php b/inc/geshi/dos.php
index 9484d3766..36d99836b 100644
--- a/inc/geshi/dos.php
+++ b/inc/geshi/dos.php
@@ -4,7 +4,7 @@
* -------
* Author: Alessandro Staltari (staltari@geocities.com)
* Copyright: (c) 2005 Alessandro Staltari (http://www.geocities.com/SiliconValley/Vista/8155/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/07/05
*
* DOS language file for GeSHi.
@@ -66,7 +66,8 @@ $language_data = array (
//DOS comment lines
'COMMENT_REGEXP' => array(
1 => "/^\s*@?REM\b.*$/mi",
- 2 => "/^\s*::.*$/m"
+ 2 => "/^\s*::.*$/m",
+ 3 => "/\^./"
),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array(),
@@ -100,7 +101,7 @@ $language_data = array (
)
),
'SYMBOLS' => array(
- '(', ')', '@', '%'
+ '(', ')', '@', '%', '!', '|', '<', '>', '&'
),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
@@ -119,6 +120,7 @@ $language_data = array (
'COMMENTS' => array(
1 => 'color: #808080; font-style: italic;',
2 => 'color: #b100b1; font-style: italic;',
+ 3 => 'color: #33cc33;'
),
'ESCAPE_CHAR' => array(
0 => 'color: #ff0000; font-weight: bold;'
@@ -143,7 +145,8 @@ $language_data = array (
'REGEXPS' => array(
0 => 'color: #b100b1; font-weight: bold;',
1 => 'color: #448844;',
- 2 => 'color: #448888;'
+ 2 => 'color: #448888;',
+ 3 => 'color: #448888;'
)
),
'OOLANG' => false,
@@ -159,7 +162,7 @@ $language_data = array (
/* Label */
0 => array(
/* GESHI_SEARCH => '((?si:[@\s]+GOTO\s+|\s+:)[\s]*)((?<!\n)[^\s\n]*)',*/
- GESHI_SEARCH => '((?si:[@\s]+GOTO\s+|\s+:)[\s]*)((?<!\n)[^\n]*)',
+ GESHI_SEARCH => '((?si:[@\s]+GOTO\s+|\s+:)[\s]*)((?<!\n)[^\s\n]*)',
GESHI_REPLACE => '\\2',
GESHI_MODIFIERS => 'si',
GESHI_BEFORE => '\\1',
@@ -168,7 +171,7 @@ $language_data = array (
/* Variable assignement */
1 => array(
/* GESHI_SEARCH => '(SET[\s]+(?si:\/A[\s]+|\/P[\s]+|))([^=\s\n]+)([\s]*=)',*/
- GESHI_SEARCH => '(SET[\s]+(?si:\/A[\s]+|\/P[\s]+|))([^=\n]+)([\s]*=)',
+ GESHI_SEARCH => '(SET\s+(?si:\\/A\s+|\\/P\s+)?)([^=\n]+)(\s*=)',
GESHI_REPLACE => '\\2',
GESHI_MODIFIERS => 'si',
GESHI_BEFORE => '\\1',
@@ -177,6 +180,15 @@ $language_data = array (
/* Arguments or variable evaluation */
2 => array(
/* GESHI_SEARCH => '(%)([\d*]|[^%\s]*(?=%))((?<!%\d)%|)',*/
+ GESHI_SEARCH => '(!(?:!(?=[a-z0-9]))?)([\d*]|(?:~[adfnpstxz]*(?:$\w+:)?)?[a-z0-9](?!\w)|[^!>\n]*(?=!))((?<!%\d)%|)(?!!>)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'si',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ /* Arguments or variable evaluation */
+ 3 => array(
+/* GESHI_SEARCH => '(%)([\d*]|[^%\s]*(?=%))((?<!%\d)%|)',*/
GESHI_SEARCH => '(%(?:%(?=[a-z0-9]))?)([\d*]|(?:~[adfnpstxz]*(?:$\w+:)?)?[a-z0-9](?!\w)|[^%\n]*(?=%))((?<!%\d)%|)',
GESHI_REPLACE => '\\2',
GESHI_MODIFIERS => 'si',
@@ -191,7 +203,20 @@ $language_data = array (
),
'TAB_WIDTH' => 4,
'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER
+ ),
'KEYWORDS' => array(
+ 1 => array(
+ 'DISALLOWED_BEFORE' => '(?<![\w\-])'
+ ),
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<![\w\-])'
+ ),
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<![\w\-])'
+ ),
4 => array(
'DISALLOWED_BEFORE' => '(?<!\w)'
)
diff --git a/inc/geshi/dot.php b/inc/geshi/dot.php
index 04b6792d7..bdf240a1f 100644
--- a/inc/geshi/dot.php
+++ b/inc/geshi/dot.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Adrien Friggeri (adrien@friggeri.net)
* Copyright: (c) 2007 Adrien Friggeri (http://www.friggeri.net)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/05/30
*
* dot language file for GeSHi.
diff --git a/inc/geshi/e.php b/inc/geshi/e.php
new file mode 100644
index 000000000..319bee016
--- /dev/null
+++ b/inc/geshi/e.php
@@ -0,0 +1,208 @@
+<?php
+/*************************************************************************************
+ * e.php
+ * --------
+ * Author: Kevin Reid (kpreid@switchb.org)
+ * Copyright: (c) 2010 Kevin Reid (http://switchb.org/kpreid/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/04/16
+ *
+ * E language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010-04-21 (1.0.8.8)
+ * - Fixing langcheck-reported bugs.
+ * 2010-04-14 (0.1)
+ * - First Release
+ *
+ * TODO (updated 2010-04-21)
+ * -------------------------
+ * - Do something useful with the keyword groups. Since RC uses CSS classes named
+ * by the group numbers, either
+ * - change the numbering to match conventional uses by other languages,
+ * - or find or create some way to produce usefully named classes.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'E',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array('/**' => '*/'), // Note: This is method doc, not a general comment syntax.
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+
+ // FIXME: The escaping inside ` is actually doubling of any interior `, $, or @ -- backslash is NOT special
+ 'QUOTEMARKS' => array('\'', '"', '`'),
+ 'ESCAPE_CHAR' => '\\',
+
+ 'KEYWORDS' => array(
+ // builtin control structures
+ 1 => array(
+ 'accum', 'break', 'try', 'continue', 'if', 'while', 'for', 'switch'
+ ),
+
+ // control structures subsidiary keywords
+ 2 => array(
+ 'catch', 'else', 'finally', 'in', 'exit'
+ ),
+
+ // named operators
+ 3 => array(
+ 'fn', 'via'
+ ),
+
+ // variable/function/object definers
+ 4 => array(
+ 'def', 'bind', 'var'
+ ),
+
+ // object definition subsidiary keywords
+ 5 => array(
+ 'extends', 'as', 'implements', 'guards', 'match', 'to', 'method'
+ ),
+
+ // builtin nouns in safeEnv
+ 6 => array(
+ 'null', 'false', 'true', 'throw', '__loop', '__makeList',
+ '__makeMap', '__makeProtocolDesc', '__makeMessageDesc',
+ '__makeParamDesc', 'any', 'void', 'boolean', '__makeOrderedSpace',
+ 'ValueGuard', '__MatchContext', 'require', '__makeVerbFacet', 'NaN',
+ 'Infinity', '__identityFunc', '__makeInt', '__makeFinalSlot',
+ '__makeVarSlot', '__makeGuardedSlot', '__makeGuard', '__makeTwine',
+ '__makeSourceSpan', '__auditedBy', 'Guard', 'near', 'pbc',
+ 'PassByCopy', 'DeepPassByCopy', 'Data', 'Persistent', 'DeepFrozen',
+ 'int', 'float64', 'char', 'String', 'Twine', 'TextWriter', 'List',
+ 'Map', 'nullOk', 'Tuple', '__Portrayal', 'notNull', 'vow', 'rcvr',
+ 'SturdyRef', 'simple__quasiParser', 'twine__quasiParser',
+ 'rx__quasiParser', 'e__quasiParser', 'epatt__quasiParser',
+ 'sml__quasiParser', 'term__quasiParser', 'traceln', '__equalizer',
+ '__comparer', 'Ref', 'E', 'promiseAllFulfilled', 'EIO', 'help',
+ 'safeScope', '__eval', 'resource__uriGetter', 'type__uriGetter',
+ 'import__uriGetter', 'elib__uriGetter', 'elang__uriGetter',
+ 'opaque__uriGetter'
+ ),
+
+ // builtin nouns in privilegedEnv
+ 7 => array(
+ 'file__uriGetter', 'fileURL__uriGetter', 'jar__uriGetter',
+ 'http__uriGetter', 'ftp__uriGetter', 'gopher__uriGetter',
+ 'news__uriGetter', 'cap__uriGetter', 'makeCommand', 'stdout',
+ 'stderr', 'stdin', 'print', 'println', 'interp', 'entropy', 'timer',
+ 'introducer', 'identityMgr', 'makeSturdyRef', 'timeMachine',
+ 'unsafe__uriGetter', 'currentVat', 'rune', 'awt__uriGetter',
+ 'swing__uriGetter', 'JPanel__quasiParser', 'swt__uriGetter',
+ 'currentDisplay', 'swtGrid__quasiParser', 'swtGrid`',
+ 'privilegedScope'
+ ),
+
+ // reserved keywords
+ 8 => array(
+ 'abstract', 'an', 'assert', 'attribute', 'be', 'begin', 'behalf',
+ 'belief', 'believe', 'believes', 'case', 'class', 'const',
+ 'constructor', 'declare', 'default', 'define', 'defmacro',
+ 'delicate', 'deprecated', 'dispatch', 'do', 'encapsulate',
+ 'encapsulated', 'encapsulates', 'end', 'ensure', 'enum', 'eventual',
+ 'eventually', 'export', 'facet', 'forall', 'function', 'given',
+ 'hidden', 'hides', 'inline', 'is', 'know', 'knows', 'lambda', 'let',
+ 'methods', 'module', 'namespace', 'native', 'obeys', 'octet',
+ 'oneway', 'operator', 'package', 'private', 'protected', 'public',
+ 'raises', 'reliance', 'reliant', 'relies', 'rely', 'reveal', 'sake',
+ 'signed', 'static', 'struct', 'suchthat', 'supports', 'suspect',
+ 'suspects', 'synchronized', 'this', 'transient', 'truncatable',
+ 'typedef', 'unsigned', 'unum', 'uses', 'using', 'utf8', 'utf16',
+ 'virtual', 'volatile', 'wstring'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', '+', '-', '*', '/', '%', '=', '<', '>', '!', '^', '&', '|', '?', ':', ';', ','
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #b1b100;',
+ 3 => 'color: #b1b100;',
+ 4 => 'color: #b1b100;',
+ 5 => 'color: #b1b100;',
+ 6 => 'color: #b1b100;',
+ 7 => 'color: #b1b100;',
+ 8 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 2 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 3 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 4 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 5 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 6 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 7 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 8 => 'http://wiki.erights.org/wiki/{FNAME}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '<-',
+ 3 => '::'
+ ),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/ecmascript.php b/inc/geshi/ecmascript.php
index 3e61b57cb..69a55c9aa 100644
--- a/inc/geshi/ecmascript.php
+++ b/inc/geshi/ecmascript.php
@@ -4,7 +4,7 @@
* --------------
* Author: Michel Mariani (http://www.tonton-pixel.com/site/)
* Copyright: (c) 2010 Michel Mariani (http://www.tonton-pixel.com/site/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/01/08
*
* ECMAScript language file for GeSHi.
diff --git a/inc/geshi/eiffel.php b/inc/geshi/eiffel.php
index 89cef7965..baa13c319 100644
--- a/inc/geshi/eiffel.php
+++ b/inc/geshi/eiffel.php
@@ -4,7 +4,7 @@
* ----------
* Author: Zoran Simic (zsimic@axarosenberg.com)
* Copyright: (c) 2005 Zoran Simic
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/06/30
*
* Eiffel language file for GeSHi.
diff --git a/inc/geshi/email.php b/inc/geshi/email.php
index 91a104840..8a313d483 100644
--- a/inc/geshi/email.php
+++ b/inc/geshi/email.php
@@ -4,7 +4,7 @@
* ---------------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/10/19
*
* Email (mbox \ eml \ RFC format) language file for GeSHi.
@@ -51,14 +51,14 @@ $language_data = array (
'HTTP', 'SMTP', 'ASMTP', 'ESMTP'
),
2 => array(
- 'Authentication-Results','Content-Description','Content-Type',
+ 'Authentication-Results','Comment','Content-Description','Content-Type',
'Content-Disposition','Content-Transfer-Encoding','Delivered-To',
'Dkim-Signature','Domainkey-Signature','In-Reply-To','Message-Id',
'MIME-Version','OpenPGP','Received','Received-SPF','References',
- 'Resend-From','Resend-To','Return-Path','User-Agent'
+ 'Reply-To', 'Resend-From','Resend-To','Return-Path','User-Agent'
),
3 => array(
- 'Date','From','Subject','To',
+ 'Date','From','Sender','Subject','To','CC'
),
4 => array(
'by', 'for', 'from', 'id', 'with'
@@ -132,7 +132,7 @@ $language_data = array (
),
//Email-Adresses or Mail-IDs
2 => array(
- GESHI_SEARCH => "\b[\w\.\-]+@\w+(?:(?:\.\w+)*\.\w{2,4})?",
+ GESHI_SEARCH => "\b(?<!\\/)(?P<q>\"?)[\w\.\-]+\k<q>@(?!-)[\w\-]+(?<!-)(?:(?:\.(?!-)[\w\-]+(?<!-))*)?",
GESHI_REPLACE => "\\0",
GESHI_MODIFIERS => "mi",
GESHI_BEFORE => "",
@@ -152,7 +152,19 @@ $language_data = array (
4 => array(
GESHI_SEARCH => "(?<=\s)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=\s)|".
"(?<=\[)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=\])|".
- "(?<==)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=<)",
+ "(?<==)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=<)|".
+
+ "(?<=\s)(?:[a-f\d]{1,4}\:)+(?:[a-f\d]{0,4})?(?:\:[a-f\d]{1,4})+(?=\s)|".
+ "(?<=\[)(?:[a-f\d]{1,4}\:)+(?:[a-f\d]{0,4})?(?:\:[a-f\d]{1,4})+(?=\])|".
+ "(?<==)(?:[a-f\d]{1,4}\:)+(?:[a-f\d]{0,4})?(?:\:[a-f\d]{1,4})+(?=<)|".
+
+ "(?<=\s)\:(?:\:[a-f\d]{1,4})+(?=\s)|".
+ "(?<=\[)\:(?:\:[a-f\d]{1,4})+(?=\])|".
+ "(?<==)\:(?:\:[a-f\d]{1,4})+(?=<)|".
+
+ "(?<=\s)(?:[a-f\d]{1,4}\:)+\:(?=\s)|".
+ "(?<=\[)(?:[a-f\d]{1,4}\:)+\:(?=\])|".
+ "(?<==)(?:[a-f\d]{1,4}\:)+\:(?=<)",
GESHI_REPLACE => "\\0",
GESHI_MODIFIERS => "i",
GESHI_BEFORE => "",
@@ -178,7 +190,7 @@ $language_data = array (
),
'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
'SCRIPT_DELIMITERS' => array(
- 0 => "/(?P<start>^)[A-Z][a-zA-Z0-9\-]*\s*:\s*(?:.|(?=\n\s)\n)*(?P<end>$)/m"
+ 0 => "/(?P<start>^)[A-Za-z][a-zA-Z0-9\-]*\s*:\s*(?:.|(?=\n\s)\n)*(?P<end>$)/m"
),
'HIGHLIGHT_STRICT_BLOCK' => array(
0 => true,
diff --git a/inc/geshi/epc.php b/inc/geshi/epc.php
new file mode 100644
index 000000000..c575c0c63
--- /dev/null
+++ b/inc/geshi/epc.php
@@ -0,0 +1,154 @@
+<?php
+/*************************************************************************************
+ * epc.php
+ * --------
+ * Author: Thorsten Muehlfelder (muehlfelder@enertex.de)
+ * Copyright: (c) 2010 Enertex Bayern GmbH
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/08/26
+ *
+ * Enerscript language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/08/26 (1.0.8.10)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'EPC',
+ 'COMMENT_SINGLE' => array('//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //[Sections]
+ //1 => "/^\\[.*\\]/"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(
+ 0 => '"',
+ 1 => '$'
+ ),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'if', 'then', 'else', 'endif',
+ 'and', 'or', 'xor', 'hysteresis'
+ ),
+ 2 => array(
+ 'read', 'write', 'event',
+ 'gettime', 'settime', 'getdate', 'setdate', 'gettimedate', 'settimedate',
+ 'hour', 'minute', 'second', 'changehour', 'changeminute', 'changesecond',
+ 'date', 'month', 'day', 'dayofweek', 'sun', 'azimuth', 'elevation',
+ 'sunrisehour', 'sunriseminute', 'sunsethour', 'sunsetminute',
+ 'wtime', 'htime', 'mtime', 'stime',
+ 'cwtime', 'chtime', 'cmtime', 'cstime',
+ 'delay', 'after', 'cycle',
+ 'readflash', 'writeflash',
+ 'abs', 'acos', 'asin', 'atan', 'cos', 'ceil', 'average', 'exp', 'floor',
+ 'log', 'max', 'min', 'mod', 'pow', 'sqrt', 'sin', 'tan', 'change', 'convert',
+ 'eval', 'systemstart', 'random', 'comobject', 'sleep', 'scene', 'storescene', 'callscene',
+ 'find', 'stringcast', 'stringset', 'stringformat', 'split', 'size',
+ 'readrs232'. 'sendrs232', 'address', 'readknx',
+ 'readudp', 'sendudp', 'connecttcp', 'closetcp', 'readtcp', 'sendtcp',
+ 'resolve', 'sendmail',
+ 'button', 'webbutton', 'chart', 'webchart', 'webdisplay', 'getslider', 'pshifter', 'mpshifter',
+ 'getpslider', 'mbutton', 'mbbutton', 'mchart', 'mpchart', 'mpbutton', 'pdisplay', 'pchart',
+ 'pbutton', 'setslider', 'setpslider', 'slider', 'pslider', 'page', 'line', 'header',
+ 'footer', 'none', 'plink', 'link', 'frame', 'dframe'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '%', 'b01',
+ ),
+ 1 => array(
+ '+', '-', '==', '>=', '=<',
+ ),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #e63ec3;',
+ 2 => 'color: #e63ec3;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #0000ff;'
+ //1 => 'color: #ffa500;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 1 => 'color: #000099;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #8a0808;',
+ 1 => 'color: #6e6e6e;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0b610b;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #0b610b;',
+ 1 => 'color: #e63ec3;'
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #0b610b;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // Numbers, e.g. 255u08
+ 1 => "[0-9]*[subf][0136][12468]"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ 'DISALLOWED_BEFORE' => '$'
+ ),
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![\.\-a-zA-Z0-9_\$\#])",
+ 'DISALLOWED_AFTER' => "(?![\.\-a-zA-Z0-9_%=\\/])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/erlang.php b/inc/geshi/erlang.php
index d98de2f37..4b8d406b0 100644
--- a/inc/geshi/erlang.php
+++ b/inc/geshi/erlang.php
@@ -7,7 +7,7 @@
* - Uwe Dauernheim (uwe@dauernheim.net)
* - Dan Forest-Barbier (dan@twisted.in)
* Copyright: (c) 2008 Uwe Dauernheim (http://www.kreisquadratur.de/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008-09-27
*
* Erlang language file for GeSHi.
@@ -355,7 +355,7 @@ $language_data = array(
2 => ':'
),
'REGEXPS' => array(
- //Macro definitions
+ //�Macro definitions
0 => array(
GESHI_SEARCH => '(-define\s*\()([a-zA-Z0-9_]+)(\(|,)',
GESHI_REPLACE => '\2',
@@ -403,7 +403,7 @@ $language_data = array(
GESHI_BEFORE => '\1',
GESHI_AFTER => ''
),
- // ASCIIcodes
+ // ASCII�codes
6 => '(\$[a-zA-Z0-9_])',
// Records
7 => array(
@@ -423,8 +423,8 @@ $language_data = array(
'PARSER_CONTROL' => array(
'KEYWORDS' => array(
3 => array(
- 'DISALLOWED_BEFORE' => '',
- 'DISALLOWED_AFTER' => '(?=\s*\()'
+ 'DISALLOWED_BEFORE' => '(?<![\w])',
+ 'DISALLOWED_AFTER' => ''//'(?=\s*\()'
),
5 => array(
'DISALLOWED_BEFORE' => '(?<=\'|)',
diff --git a/inc/geshi/euphoria.php b/inc/geshi/euphoria.php
new file mode 100644
index 000000000..7bbf88460
--- /dev/null
+++ b/inc/geshi/euphoria.php
@@ -0,0 +1,140 @@
+<?php
+/*************************************************************************************
+ * euphoria.php
+ * ---------------------------------
+ * Author: Nicholas Koceja (nerketur@hotmail.com)
+ * Copyright: (c) 2010 Nicholas Koceja
+ * Release Version: 1.0.8.11
+ * Date Started: 11/24/2010
+ *
+ * Euphoria language file for GeSHi.
+ *
+ * Author's note: The colors are based off of the Euphoria Editor (ed.ex) colors.
+ * Also, I added comments in places so I could remember a few things about Euphoria.
+ *
+ *
+ * CHANGES
+ * -------
+ * <date-of-release> (1.0.8.9)
+ * - First Release
+ *
+ * TODO (updated <date-of-release>)
+ * -------------------------
+ * seperate the funtions from the procedures, and have a slight color change for each.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Euphoria',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array(), //Euphoria doesn't support multi-line comments
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array( // keywords
+ 'and', 'by', 'constant', 'do', 'else', 'elsif', 'end', 'exit',
+ 'for', 'function', 'global', 'if', 'include', 'not', 'or',
+ 'procedure', 'return', 'then', 'to', 'type', 'while', 'with',
+ 'without', 'xor'
+ ),
+ 2 => array( // built-ins
+ 'abort', 'and_bits', 'append', 'arctan', 'atom', 'c_func', 'call',
+ 'c_proc', 'call_func', 'call_proc', 'clear_screen', 'close', 'compare',
+ 'command_line', 'cos', 'date', 'equal', 'find', 'find_from', 'floor',
+ 'getc', 'getenv', 'gets', 'get_key', 'get_pixel', 'integer', 'length',
+ 'log', 'machine_func', 'machine_proc', 'match', 'match_from',
+ 'mem_copy', 'mem_set', 'not_bits', 'object', 'open', 'or_bits', 'peek',
+ 'peek4s', 'peek4u', 'pixel', 'platform', 'poke', 'poke4', 'position',
+ 'power', 'prepend', 'print', 'printf', 'profile', 'puts', 'rand',
+ 'remainder', 'repeat', 'routine_id', 'sequence', 'sin', 'sprintf',
+ 'sqrt', 'system', 'system_exec', 'tan', 'task_clock_stop',
+ 'task_clock_start', 'task_create', 'task_list', 'task_schedule',
+ 'task_self', 'task_status', 'task_suspend', 'task_yield', 'time',
+ 'trace', 'xor_bits'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '(', ')', '{', '}', '[', ']'
+ ),
+ 1 => array(
+ '+', '-', '*', '/', '=', '&', '^'
+ ),
+ 2 => array(
+ '&', '?', ','
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff; font-weight: bold;', // keywords
+ 2 => 'color: #cc33ff; font-weight: bold;', // builtins
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #ff0000; font-style: italic;',
+ 'MULTI' => '' // doesn't exist
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009900; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #999900; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #00cc00;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc33cc; font-style: italic'
+ ),
+ 'METHODS' => array( // Doesn't exist in Euphoria. Everything is a function =)
+ 0 => ''
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #999900;', // brackets
+ 1 => 'color: #333333;', // operators
+ 2 => 'color: #333333; font-style: bold' // print+concat
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array( // Never included in scripts.
+ )
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/f1.php b/inc/geshi/f1.php
new file mode 100644
index 000000000..7d7676085
--- /dev/null
+++ b/inc/geshi/f1.php
@@ -0,0 +1,151 @@
+<?php
+/*************************************************************************************
+ * f1.php
+ * -------
+ * Author: Juro Bystricky (juro@f1compiler.com)
+ * Copyright: K2 Software Corp.
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/07/06
+ *
+ * Formula One language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/06 (1.0.8.9)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ * - Add more RTL functions with URLs
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Formula One',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('{' => '}'),
+ 'COMMENT_REGEXP' => array(
+ //Nested Comments
+ 2 => "/(\{(?:\{.*\}|[^\{])*\})/m"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'",'"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\nrt\'\"?\n]#i",
+ //Hexadecimal Char Specs (Utf16 codes, Unicode versions only)
+ 2 => "#\\\\u[\da-fA-F]{4}#",
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE |
+ GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX_0O |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'pred','proc','subr','else','elsif','iff','if','then','false','true',
+ 'case','of','use','local','mod','end','list','file','all','one','max','min','rel',
+ 'external','Nil','_stdcall','_cdecl','_addressof','_pred','_file','_line'
+ ),
+ 2 => array(
+ 'Ascii','Bin','I','L','P','R','S','U'
+ ),
+ 3 => array(
+ 'Append','in','Dupl','Len','Print','_AllDifferent','_AllAscending',
+ '_AllDescending','_Ascending','_Descending'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']'),
+ 1 => array('<', '>','='),
+ 2 => array('+', '-', '*', '/'),
+ 3 => array('&', '|'),
+ 4 => array(':', ';')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #000080;',
+ 3 => 'color: #000080;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000; font-style: italic;',
+ 2 => 'color: #008000; font-style: italic;',
+ 'MULTI' => 'color: #008000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #009999; font-weight: bold;',
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #800000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;',
+ 1 => 'color: #000000;',
+ 2 => 'color: #000000;',
+ 3 => 'color: #000000;',
+ 4 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.f1compiler.com/f1helponline/f1_runtime_library.html#{FNAME}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/falcon.php b/inc/geshi/falcon.php
new file mode 100644
index 000000000..2111d9e8e
--- /dev/null
+++ b/inc/geshi/falcon.php
@@ -0,0 +1,218 @@
+<?php
+/*************************************************************************************
+ * falcon.php
+ * ---------------------------------
+ * Author: billykater (billykater+geshi@gmail.com)
+ * Copyright: (c) 2010 billykater (http://falconpl.org/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/07
+ *
+ * Falcon language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * <2010/8/1> (1.0.8.10)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Falcon',
+ 'COMMENT_SINGLE' => array( 1 => '//' ),
+ 'COMMENT_MULTI' => array( '/*' => '*/' ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array( "'", '"' ),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break','case','catch','class','const','continue','def','default',
+ 'dropping','elif','else','end','enum','for','forfirst','forlast',
+ 'formiddle','from','function','global','if','init','innerfunc',
+ 'launch','loop','object','raise','return','select','state','static',
+ 'switch','try','while'
+ ),
+ 2 => array(
+ 'false','nil','true',
+ ),
+ 3 => array(
+ 'and','as','eq','fself','in','not','notin','or','provides','self','to'
+ ),
+ 4 => array(
+ 'directive','export','import','load','macro'
+ ),
+ 5 => array(
+ 'ArrayType','BooleanType','ClassMethodType','ClassType','DictionaryType',
+ 'FunctionType','MemBufType','MethodType','NilType','NumericType','ObjectType',
+ 'RangeType','StringType','LBindType'
+ ),
+ 6 => array(
+ "CurrentTime","IOStream","InputStream","MemBufFromPtr","OutputStream",
+ "PageDict","ParseRFC2822","abs","acos","all",
+ "allp","any","anyp","argd","argv",
+ "arrayAdd","arrayBuffer","arrayCompact","arrayDel","arrayDelAll",
+ "arrayFill","arrayFind","arrayHead","arrayIns","arrayMerge",
+ "arrayNM","arrayRemove","arrayResize","arrayScan","arraySort",
+ "arrayTail","asin","assert","atan","atan2",
+ "attributes","baseClass","beginCritical","bless","brigade",
+ "broadcast","cascade","ceil","choice","chr",
+ "className","clone","combinations","compare","consume",
+ "cos","deg2rad","deoob","derivedFrom","describe",
+ "deserialize","dictBack","dictBest","dictClear","dictFill",
+ "dictFind","dictFront","dictGet","dictKeys","dictMerge",
+ "dictRemove","dictSet","dictValues","dirChange","dirCurrent",
+ "dirMake","dirMakeLink","dirReadLink","dirRemove","dolist",
+ "endCritical","epoch","eval","exit","exp",
+ "factorial","fileChgroup","fileChmod","fileChown","fileCopy",
+ "fileExt","fileMove","fileName","fileNameMerge","filePath",
+ "fileRemove","fileType","fileUnit","filter","fint",
+ "firstOf","floop","floor","fract","getAssert",
+ "getEnviron","getProperty","getSlot","getSystemEncoding","getenv",
+ "iff","include","input","inspect","int",
+ "isBound","isCallable","isoob","lbind","len",
+ "let","lit","log","map","max",
+ "metaclass","min","numeric","oob","ord",
+ "paramCount","paramIsRef","paramSet","parameter","passvp",
+ "permutations","pow","print","printl","properties",
+ "rad2deg","random","randomChoice","randomDice","randomGrab",
+ "randomPick","randomSeed","randomWalk","readURI","reduce",
+ "retract","round","seconds","serialize","set",
+ "setProperty","setenv","sin","sleep","stdErr",
+ "stdErrRaw","stdIn","stdInRaw","stdOut","stdOutRaw",
+ "strBack","strBackFind","strBackTrim","strBuffer","strCmpIgnoreCase",
+ "strEndsWith","strEscape","strEsq","strFill","strFind",
+ "strFromMemBuf","strFront","strFrontTrim","strLower","strMerge",
+ "strReplace","strReplicate","strSplit","strSplitTrimmed","strStartsWith",
+ "strToMemBuf","strTrim","strUnescape","strUnesq","strUpper",
+ "strWildcardMatch","subscribe","systemErrorDescription","tan","times",
+ "toString","transcodeFrom","transcodeTo","typeOf","unsetenv",
+ "unsubscribe","valof","vmFalconPath","vmIsMain","vmModuleName",
+ "vmModuleVersionInfo","vmSearchPath","vmSystemType","vmVersionInfo","vmVersionName",
+ "writeURI","xmap","yield","yieldOut"
+ ),
+ 7 => array(
+ "AccessError","Array","BOM","Base64","Class",
+ "ClassMethod","CloneError","CmdlineParser","CodeError","Continuation",
+ "Dictionary","Directory","Error","FileStat","Format",
+ "Function","GarbagePointer","GenericError","Integer","InterruptedError",
+ "IoError","Iterator","LateBinding","List","MathError",
+ "MemoryBuffer","MessageError","Method","Numeric","Object",
+ "ParamError","ParseError","Path","Range","Semaphore",
+ "Sequence","Set","Stream","String","StringStream",
+ "SyntaxError","Table","TableError","TimeStamp","TimeZone",
+ "Tokenizer","TypeError","URI","VMSlot"
+ ),
+ 8 => array(
+ "args","scriptName","scriptPath"
+ ),
+ 9 => array(
+ "GC"
+ ),
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => 'http://falconpl.org/project_docs/core/functions.html#typeOf',
+ 6 => 'http://falconpl.org/project_docs/core/functions.html#{FNAME}',
+ 7 => 'http://falconpl.org/project_docs/core/class_{FNAME}.html',
+ 8 => 'http://falconpl.org/project_docs/core/globals.html#{FNAME}',
+ 9 => 'http://falconpl.org/project_docs/core/object_{FNAME}.html)'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true
+ ),
+ 'SYMBOLS' => array(
+ '(',')','$','%','&','/','{','[',']','=','}','?','+','-','#','*','@',
+ '<','>','|',',',':',';','\\','^'
+ ),
+ 'REGEXPS' => array(
+ 0 => array(
+ GESHI_SEARCH => '(\[)([a-zA-Z_]|\c{C})(?:[a-zA-Z0-9_]|\p{C})*(\])',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3',
+
+ ),
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array( '<?' => '?>' )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080;font-weight:bold;',
+ 2 => 'color: #800000;font-weight:bold;',
+ 3 => 'color: #800000;font-weight:bold;',
+ 4 => 'color: #000080;font-weight:bold;',
+ 5 => 'color: #000000;font-weight:bold;',
+ 6 => 'font-weight:bold;',
+ 7 => 'font-weight:bold;',
+ 8 => 'font-weight:bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #29B900;',
+ 'MULTI' => 'color: #008080'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #800000'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #800000'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #000000'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #8B0513'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #FF00FF'
+ )
+ ),
+
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ '.'
+ )
+);
+?> \ No newline at end of file
diff --git a/inc/geshi/fo.php b/inc/geshi/fo.php
index 3a1d24021..ba4a59244 100644
--- a/inc/geshi/fo.php
+++ b/inc/geshi/fo.php
@@ -4,7 +4,7 @@
* --------
* Author: Tan-Vinh Nguyen (tvnguyen@web.de)
* Copyright: (c) 2009 Tan-Vinh Nguyen
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/03/23
*
* fo language file for GeSHi.
diff --git a/inc/geshi/fortran.php b/inc/geshi/fortran.php
index 6eac52ae0..c21ccd192 100644
--- a/inc/geshi/fortran.php
+++ b/inc/geshi/fortran.php
@@ -4,7 +4,7 @@
* -----------
* Author: Cedric Arrabie (cedric.arrabie@univ-pau.fr)
* Copyright: (C) 2006 Cetric Arrabie
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/04/22
*
* Fortran language file for GeSHi.
diff --git a/inc/geshi/freebasic.php b/inc/geshi/freebasic.php
index 35fc8ca6f..b23f39bc7 100644
--- a/inc/geshi/freebasic.php
+++ b/inc/geshi/freebasic.php
@@ -4,7 +4,7 @@
* -------------
* Author: Roberto Rossi
* Copyright: (c) 2005 Roberto Rossi (http://rsoftware.altervista.org)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/08/19
*
* FreeBasic (http://www.freebasic.net/) language file for GeSHi.
diff --git a/inc/geshi/freeswitch.php b/inc/geshi/freeswitch.php
new file mode 100644
index 000000000..c6fff2767
--- /dev/null
+++ b/inc/geshi/freeswitch.php
@@ -0,0 +1,168 @@
+<?php
+/*************************************************************************************
+ * freeswitch.php
+ * --------
+ * Author: James Rose (james.gs@stubbornroses.com)
+ * Copyright: (c) 2006 Christian Lescuyer http://xtian.goelette.info
+ * Release Version: 1.0.8.11n/a
+ * Date Started: 2011/11/18
+ *
+ * FreeSWITCH language file for GeSHi.
+ *
+ * This file is based on robots.php
+ *
+ * 2011/11/18 (1.0.0)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'FreeSWITCH',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(1 => "/^Comment:.*?$/m"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+// 1 => array(
+// 'Disallow', 'Request-rate', 'Robot-version',
+// 'Sitemap', 'User-agent', 'Visit-time'
+// )
+ ),
+ 'SYMBOLS' => array(
+// ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false
+ ),
+
+//order is important. regexes will overwrite most things....
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+// 1 => 'color: #FF0000; font-weight: bold;',//red
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+// 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+// 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+// 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+// 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: firebrick; font-weight: bold;',
+ 1 => 'color: cornflowerblue; font-weight: bold;',
+ 2 => 'color: goldenrod; font-weight: bold;',
+ 3 => 'color: green; font-weight: bold;',
+ 4 => 'color: dimgrey; font-style: italic;',
+ 5 => 'color: green; font-weight: bold;',
+ 6 => 'color: firebrick; font-weight: bold;',
+ 7 => 'color: indigo; font-weight: italic;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+// 1 => 'http://www.robotstxt.org/wc/norobots.html'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => array(
+ GESHI_SEARCH => '(^.*ERROR.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 1 => array(
+ GESHI_SEARCH => '(^.*NOTICE.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 2 => array(
+ GESHI_SEARCH => '(^.*DEBUG.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 3 => array(
+ GESHI_SEARCH => '(^.*INFO.*|.*info\(.*|^Channel.*|^Caller.*|^variable.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 4 => array(
+ GESHI_SEARCH => '(^Dialplan.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 5 => array(
+ GESHI_SEARCH => '(Regex\ \(PASS\))',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 6 => array(
+ GESHI_SEARCH => '(Regex\ \(FAIL\))',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 7 => array(
+ GESHI_SEARCH => '(\d{7,15})',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ )
+ ),
+
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/inc/geshi/fsharp.php b/inc/geshi/fsharp.php
index 56146958c..d85a7c757 100644
--- a/inc/geshi/fsharp.php
+++ b/inc/geshi/fsharp.php
@@ -4,7 +4,7 @@
* ----------
* Author: julien ortin (jo_spam-divers@yahoo.fr)
* Copyright: (c) 2009 julien ortin
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/09/20
*
* F# language file for GeSHi.
@@ -43,7 +43,8 @@
$language_data = array(
'LANG_NAME' => 'F#',
'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
- 'COMMENT_MULTI' => array('(*' => '*)', '/*' => '*/'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(3 => '/\(\*(?!\)).*?\*\)/s'),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array("'", '"'),
'HARDQUOTE' => array('@"', '"'),
@@ -153,7 +154,8 @@ $language_data = array(
'COMMENTS' => array(
'MULTI' => 'color: #5d478b; font-style: italic;', /* light purple */
1 => 'color: #5d478b; font-style: italic;',
- 2 => 'color: #5d478b; font-style: italic;' /* light purple */
+ 2 => 'color: #5d478b; font-style: italic;', /* light purple */
+ 3 => 'color: #5d478b; font-style: italic;' /* light purple */
),
'ESCAPE_CHAR' => array(
),
diff --git a/inc/geshi/gambas.php b/inc/geshi/gambas.php
index 0fc89bb59..352830ebb 100644
--- a/inc/geshi/gambas.php
+++ b/inc/geshi/gambas.php
@@ -5,7 +5,7 @@
* Author: Jesus Guardon (jguardon@telefonica.net)
* Copyright: (c) 2009 Jesus Guardon (http://gambas-es.org),
* Benny Baumann (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/20
*
* GAMBAS language file for GeSHi.
diff --git a/inc/geshi/gdb.php b/inc/geshi/gdb.php
index ed7ee2ffa..0a5e32c30 100644
--- a/inc/geshi/gdb.php
+++ b/inc/geshi/gdb.php
@@ -4,7 +4,7 @@
* --------
* Author: Milian Wolff (mail@milianw.de)
* Copyright: (c) 2009 Milian Wolff
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/06/24
*
* GDB language file for GeSHi.
@@ -43,7 +43,7 @@ $language_data = array (
'COMMENT_MULTI' => array(),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array('"'),
- 'ESCAPE_CHAR' => '',
+ 'ESCAPE_CHAR' => '\\',
'KEYWORDS' => array(
0 => array(
'Application',
@@ -54,8 +54,7 @@ $language_data = array (
'[KCrash Handler]',
),
),
- 'NUMBERS' =>
- GESHI_NUMBER_INT_BASIC,
+ 'NUMBERS' => false,
'SYMBOLS' => array(
),
'CASE_SENSITIVE' => array(
@@ -79,7 +78,6 @@ $language_data = array (
0 => 'color: #933;'
),
'NUMBERS' => array(
- 0 => 'color: #cc66cc;',
),
'METHODS' => array(
),
@@ -88,12 +86,14 @@ $language_data = array (
'REGEXPS' => array(
0 => 'color: #000066; font-weight:bold;',
1 => 'color: #006600;',
- 2 => 'color: #000066;',
- 3 => 'color: #0066FF; text-style:italic;',
- 4 => 'color: #80B5FF; text-style:italic;',
- 5 => 'color: #A3007D;',
- 6 => 'color: #FF00BF;',
- 7 => 'font-weight: bold;'
+ 2 => 'color: #B07E00;',
+ 3 => 'color: #0057AE; text-style:italic;',
+ 4 => 'color: #0057AE; text-style:italic;',
+ 5 => 'color: #442886;',
+ 6 => 'color: #442886; font-weight:bold;',
+ 7 => 'color: #FF0000; font-weight:bold;',
+ 8 => 'color: #006E26;',
+ 9 => 'color: #555;',
),
'SCRIPT' => array(
)
@@ -132,7 +132,7 @@ $language_data = array (
),
//Files with linenumbers
3 => array(
- GESHI_SEARCH => '(at )(.+)(:\d+\s*)$',
+ GESHI_SEARCH => '(at\s+)(.+)(:\d+\s*)$',
GESHI_REPLACE => '\\2',
GESHI_MODIFIERS => 'm',
GESHI_BEFORE => '\\1',
@@ -140,16 +140,14 @@ $language_data = array (
),
//Libs without linenumbers
4 => array(
- GESHI_SEARCH => '(from )(.+)(\s*)$',
+ GESHI_SEARCH => '(from\s+)(.+)(\s*)$',
GESHI_REPLACE => '\\2',
GESHI_MODIFIERS => 'm',
GESHI_BEFORE => '\\1',
GESHI_AFTER => '\\3'
),
- //Hex mem address
- 5 => '0x[a-f0-9]+',
//Line numbers
- 6 => array(
+ 5 => array(
GESHI_SEARCH => '(:)(\d+)(\s*)$',
GESHI_REPLACE => '\\2',
GESHI_MODIFIERS => 'm',
@@ -157,19 +155,44 @@ $language_data = array (
GESHI_AFTER => '\\3'
),
//Location
+ 6 => array(
+ GESHI_SEARCH => '(\s+)(in\s+)?([^ 0-9][^ ]*)([ \n]+\()',
+ GESHI_REPLACE => '\\3',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1\\2',
+ GESHI_AFTER => '\\4'
+ ),
+ // interesting parts: abort, qFatal, assertions, null ptrs, ...
7 => array(
- GESHI_SEARCH => '( in )([^ \(\)]+)( \()',
- GESHI_REPLACE => '\\2',
+ GESHI_SEARCH => '\b((?:\*__GI_)?(?:__assert_fail|abort)|qFatal|0x0)\b([^\.]|$)',
+ GESHI_REPLACE => '\\1',
GESHI_MODIFIERS => '',
- GESHI_BEFORE => '\\1',
- GESHI_AFTER => '\\3'
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '\\2'
+ ),
+ // Namespace / Classes
+ 8 => array(
+ GESHI_SEARCH => '\b(\w+)(::)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'U',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '\\2'
),
+ // make ptr adresses and <value optimized out> uninteresting
+ 9 => '\b(?:0x[a-f0-9]{2,}|value\s+optimized\s+out)\b'
),
'STRICT_MODE_APPLIES' => GESHI_NEVER,
'SCRIPT_DELIMITERS' => array(
),
'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => false
+ ),
)
);
+// kate: replace-tabs on; indent-width 4;
+
?>
diff --git a/inc/geshi/genero.php b/inc/geshi/genero.php
index a7ccf5fee..e1b20b3e8 100644
--- a/inc/geshi/genero.php
+++ b/inc/geshi/genero.php
@@ -4,7 +4,7 @@
* ----------
* Author: Lars Gersmann (lars.gersmann@gmail.com)
* Copyright: (c) 2007 Lars Gersmann, Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/07/01
*
* Genero (FOURJ's Genero 4GL) language file for GeSHi.
diff --git a/inc/geshi/genie.php b/inc/geshi/genie.php
index 66bea6dc7..db05ec062 100644
--- a/inc/geshi/genie.php
+++ b/inc/geshi/genie.php
@@ -4,7 +4,7 @@
* ----------
* Author: Nicolas Joseph (nicolas.joseph@valaide.org)
* Copyright: (c) 2009 Nicolas Joseph
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/04/29
*
* Genie language file for GeSHi.
diff --git a/inc/geshi/gettext.php b/inc/geshi/gettext.php
index e1c88e185..80b531c10 100644
--- a/inc/geshi/gettext.php
+++ b/inc/geshi/gettext.php
@@ -4,7 +4,7 @@
* --------
* Author: Milian Wolff (mail@milianw.de)
* Copyright: (c) 2008 Milian Wolff
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/05/25
*
* GNU Gettext .po/.pot language file for GeSHi.
diff --git a/inc/geshi/glsl.php b/inc/geshi/glsl.php
index f9a37ed07..3615cfe71 100644
--- a/inc/geshi/glsl.php
+++ b/inc/geshi/glsl.php
@@ -4,7 +4,7 @@
* -----
* Author: Benny Baumann (BenBE@omorphia.de)
* Copyright: (c) 2008 Benny Baumann (BenBE@omorphia.de)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/03/20
*
* glSlang language file for GeSHi.
diff --git a/inc/geshi/gml.php b/inc/geshi/gml.php
index 3f8a06c4f..999251b22 100644
--- a/inc/geshi/gml.php
+++ b/inc/geshi/gml.php
@@ -4,7 +4,7 @@
* --------
* Author: Jos� Jorge Enr�quez (jenriquez@users.sourceforge.net)
* Copyright: (c) 2005 Jos� Jorge Enr�quez Rodr�guez (http://www.zonamakers.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/06/21
*
* GML language file for GeSHi.
diff --git a/inc/geshi/gnuplot.php b/inc/geshi/gnuplot.php
index 980561d35..d8445eabb 100644
--- a/inc/geshi/gnuplot.php
+++ b/inc/geshi/gnuplot.php
@@ -4,7 +4,7 @@
* ----------
* Author: Milian Wolff (mail@milianw.de)
* Copyright: (c) 2008 Milian Wolff (http://milianw.de)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/07/07
*
* Gnuplot script language file for GeSHi.
diff --git a/inc/geshi/go.php b/inc/geshi/go.php
new file mode 100644
index 000000000..5b7a47db6
--- /dev/null
+++ b/inc/geshi/go.php
@@ -0,0 +1,375 @@
+<?php
+/*************************************************************************************
+ * go.php
+ * --------
+ * Author: Markus Jarderot (mizardx at gmail dot com)
+ * Copyright: (c) 2010 Markus Jarderot
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/05/20
+ *
+ * Go language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/05/20 (1.0.8.9)
+ * - First Release
+ *
+ * TODO (updated 2010/05/20)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Go',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ # Raw strings (escapes and linebreaks ignored)
+ 2 => "#`[^`]*`#"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'"),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ 1 => "#\\\\[abfnrtv\\\\\'\"]#",
+ 2 => "#\\\\[0-7]{3}#",
+ 3 => "#\\\\x[0-9a-fA-F]{2}#",
+ 4 => "#\\\\u[0-9a-fA-F]{4}#",
+ 5 => "#\\\\U[0-9a-fA-F]{8}#"
+ ),
+ 'NUMBERS' => array(
+ # integer literals (possibly imaginary)
+ 0 => '\b([1-9][0-9]*i?|0[0-7]*|0[xX][0-9a-f]+|0[0-9]*i)\b',
+ # real floating point literals
+ 1 => '\b((?:\d+\.\d*(?:[Ee][+-]?\d+\b)?|\.\d+(?:[Ee][+-]?\d+)?|\d+[Ee][+-]?\d+)?)\b',
+ # imaginary floating point literals
+ 2 => '\b((?:\d+\.\d*(?:[Ee][+-]?\d+)?|\.\d+(?:[Ee][+-]?\d+)?|\d+[Ee][+-]?\d+)?i)\b'
+ ),
+ 'KEYWORDS' => array(
+ # statements
+ 1 => array(
+ 'break', 'case', 'const', 'continue', 'default', 'defer', 'else',
+ 'fallthrough', 'for', 'go', 'goto', 'if', 'import', 'package',
+ 'range', 'return', 'select', 'switch', 'type', 'var'
+ ),
+ # literals
+ 2 => array(
+ 'nil', 'true', 'false'
+ ),
+ # built-in functions
+ 3 => array(
+ 'close', 'closed', 'len', 'cap', 'new', 'make', 'copy', 'cmplx',
+ 'real', 'imag', 'panic', 'recover', 'print', 'println'
+ ),
+ # built-in types
+ 4 => array(
+ 'chan', 'func', 'interface', 'map', 'struct', 'bool', 'uint8',
+ 'uint16', 'uint32', 'uint64', 'int8', 'int16', 'int32', 'int64',
+ 'float32', 'float64', 'complex64', 'complex128', 'byte', 'uint',
+ 'int', 'float', 'complex', 'uintptr', 'string'
+ ),
+ # library types
+ 5 => array(
+ 'aes.Cipher', 'aes.KeySizeError', 'ascii85.CorruptInputError', 'asn1.BitString',
+ 'asn1.RawValue', 'asn1.StructuralError', 'asn1.SyntaxError', 'ast.ChanDir',
+ 'ast.Comment', 'ast.CommentGroup', 'ast.Decl', 'ast.Expr', 'ast.Field',
+ 'ast.FieldList', 'ast.File', 'ast.Filter', 'ast.MergeMode', 'ast.Node',
+ 'ast.ObjKind', 'ast.Object', 'ast.Package', 'ast.Scope', 'ast.Stmt',
+ 'ast.Visitor', 'av.Color', 'av.Image', 'av.Window', 'base64.CorruptInputError',
+ 'base64.Encoding', 'big.Int', 'big.Word', 'bignum.Integer', 'bignum.Rational',
+ 'binary.ByteOrder', 'block.Cipher', 'block.EAXTagError', 'blowfish.Cipher',
+ 'blowfish.KeySizeError', 'bufio.BufSizeError', 'bufio.Error', 'bufio.ReadWriter',
+ 'bufio.Reader', 'bufio.Writer', 'bytes.Buffer', 'datafmt.Environment',
+ 'datafmt.Format', 'datafmt.Formatter', 'datafmt.FormatterMap', 'datafmt.State',
+ 'doc.Filter', 'doc.FuncDoc', 'doc.PackageDoc', 'doc.TypeDoc', 'doc.ValueDoc',
+ 'draw.Color', 'draw.Context', 'draw.Image', 'draw.Mouse', 'draw.Op',
+ 'draw.Point', 'draw.Rectangle', 'dwarf.AddrType', 'dwarf.ArrayType',
+ 'dwarf.Attr', 'dwarf.BasicType', 'dwarf.BoolType', 'dwarf.CharType',
+ 'dwarf.CommonType', 'dwarf.ComplexType', 'dwarf.Data', 'dwarf.DecodeError',
+ 'dwarf.DotDotDotType', 'dwarf.Entry', 'dwarf.EnumType', 'dwarf.EnumValue',
+ 'dwarf.Field', 'dwarf.FloatType', 'dwarf.FuncType', 'dwarf.IntType',
+ 'dwarf.Offset', 'dwarf.PtrType', 'dwarf.QualType', 'dwarf.Reader',
+ 'dwarf.StructField', 'dwarf.StructType', 'dwarf.Tag', 'dwarf.Type',
+ 'dwarf.TypedefType', 'dwarf.UcharType', 'dwarf.UintType', 'dwarf.VoidType',
+ 'elf.Class', 'elf.Data', 'elf.Dyn32', 'elf.Dyn64', 'elf.DynFlag', 'elf.DynTag',
+ 'elf.File', 'elf.FileHeader', 'elf.FormatError', 'elf.Header32', 'elf.Header64',
+ 'elf.Machine', 'elf.NType', 'elf.OSABI', 'elf.Prog', 'elf.Prog32', 'elf.Prog64',
+ 'elf.ProgFlag', 'elf.ProgHeader', 'elf.ProgType', 'elf.R_386', 'elf.R_ALPHA',
+ 'elf.R_ARM', 'elf.R_PPC', 'elf.R_SPARC', 'elf.R_X86_64', 'elf.Rel32',
+ 'elf.Rel64', 'elf.Rela32', 'elf.Rela64', 'elf.Section', 'elf.Section32',
+ 'elf.Section64', 'elf.SectionFlag', 'elf.SectionHeader', 'elf.SectionIndex',
+ 'elf.SectionType', 'elf.Sym32', 'elf.Sym64', 'elf.SymBind', 'elf.SymType',
+ 'elf.SymVis', 'elf.Symbol', 'elf.Type', 'elf.Version', 'eval.ArrayType',
+ 'eval.ArrayValue', 'eval.BoolValue', 'eval.BoundedType', 'eval.ChanType',
+ 'eval.Code', 'eval.Constant', 'eval.Def', 'eval.DivByZeroError',
+ 'eval.FloatValue', 'eval.Frame', 'eval.Func', 'eval.FuncDecl', 'eval.FuncType',
+ 'eval.FuncValue', 'eval.IMethod', 'eval.IdealFloatValue', 'eval.IdealIntValue',
+ 'eval.IndexError', 'eval.IntValue', 'eval.Interface', 'eval.InterfaceType',
+ 'eval.InterfaceValue', 'eval.KeyError', 'eval.Map', 'eval.MapType',
+ 'eval.MapValue', 'eval.Method', 'eval.MultiType', 'eval.NamedType',
+ 'eval.NegativeCapacityError', 'eval.NegativeLengthError', 'eval.NilPointerError',
+ 'eval.PtrType', 'eval.PtrValue', 'eval.RedefinitionError', 'eval.Scope',
+ 'eval.Slice', 'eval.SliceError', 'eval.SliceType', 'eval.SliceValue',
+ 'eval.StringValue', 'eval.StructField', 'eval.StructType', 'eval.StructValue',
+ 'eval.Thread', 'eval.Type', 'eval.UintValue', 'eval.Value', 'eval.Variable',
+ 'eval.World', 'exec.Cmd', 'expvar.Int', 'expvar.IntFunc', 'expvar.KeyValue',
+ 'expvar.Map', 'expvar.String', 'expvar.StringFunc', 'expvar.Var', 'flag.Flag',
+ 'flag.Value', 'flate.CorruptInputError', 'flate.InternalError',
+ 'flate.ReadError', 'flate.Reader', 'flate.WriteError', 'flate.WrongValueError',
+ 'fmt.Formatter', 'fmt.GoStringer', 'fmt.State', 'fmt.Stringer',
+ 'git85.CorruptInputError', 'gob.Decoder', 'gob.Encoder', 'gosym.DecodingError',
+ 'gosym.Func', 'gosym.LineTable', 'gosym.Obj', 'gosym.Sym', 'gosym.Table',
+ 'gosym.UnknownFileError', 'gosym.UnknownLineError', 'gzip.Deflater',
+ 'gzip.Header', 'gzip.Inflater', 'hash.Hash', 'hash.Hash32', 'hash.Hash64',
+ 'heap.Interface', 'hex.InvalidHexCharError', 'hex.OddLengthInputError',
+ 'http.ClientConn', 'http.Conn', 'http.Handler', 'http.HandlerFunc',
+ 'http.ProtocolError', 'http.Request', 'http.Response', 'http.ServeMux',
+ 'http.ServerConn', 'http.URL', 'http.URLError', 'http.URLEscapeError',
+ 'image.Alpha', 'image.AlphaColor', 'image.Color', 'image.ColorImage',
+ 'image.ColorModel', 'image.ColorModelFunc', 'image.Image', 'image.NRGBA',
+ 'image.NRGBA64', 'image.NRGBA64Color', 'image.NRGBAColor', 'image.Paletted',
+ 'image.RGBA', 'image.RGBA64', 'image.RGBA64Color', 'image.RGBAColor',
+ 'io.Closer', 'io.Error', 'io.PipeReader', 'io.PipeWriter', 'io.ReadByter',
+ 'io.ReadCloser', 'io.ReadSeeker', 'io.ReadWriteCloser', 'io.ReadWriteSeeker',
+ 'io.ReadWriter', 'io.Reader', 'io.ReaderAt', 'io.ReaderFrom', 'io.SectionReader',
+ 'io.Seeker', 'io.WriteCloser', 'io.WriteSeeker', 'io.Writer', 'io.WriterAt',
+ 'io.WriterTo', 'iterable.Func', 'iterable.Group', 'iterable.Grouper',
+ 'iterable.Injector', 'iterable.Iterable', 'jpeg.FormatError', 'jpeg.Reader',
+ 'jpeg.UnsupportedError', 'json.Decoder', 'json.Encoder',
+ 'json.InvalidUnmarshalError', 'json.Marshaler', 'json.MarshalerError',
+ 'json.SyntaxError', 'json.UnmarshalTypeError', 'json.Unmarshaler',
+ 'json.UnsupportedTypeError', 'list.Element', 'list.List', 'log.Logger',
+ 'macho.Cpu', 'macho.File', 'macho.FileHeader', 'macho.FormatError', 'macho.Load',
+ 'macho.LoadCmd', 'macho.Regs386', 'macho.RegsAMD64', 'macho.Section',
+ 'macho.Section32', 'macho.Section64', 'macho.SectionHeader', 'macho.Segment',
+ 'macho.Segment32', 'macho.Segment64', 'macho.SegmentHeader', 'macho.Thread',
+ 'macho.Type', 'net.Addr', 'net.AddrError', 'net.Conn', 'net.DNSConfigError',
+ 'net.DNSError', 'net.Error', 'net.InvalidAddrError', 'net.InvalidConnError',
+ 'net.Listener', 'net.OpError', 'net.PacketConn', 'net.TCPAddr', 'net.TCPConn',
+ 'net.TCPListener', 'net.UDPAddr', 'net.UDPConn', 'net.UnixAddr', 'net.UnixConn',
+ 'net.UnixListener', 'net.UnknownNetworkError', 'net.UnknownSocketError',
+ 'netchan.Dir', 'netchan.Exporter', 'netchan.Importer', 'nntp.Article',
+ 'nntp.Conn', 'nntp.Error', 'nntp.Group', 'nntp.ProtocolError', 'ogle.Arch',
+ 'ogle.ArchAlignedMultiple', 'ogle.ArchLSB', 'ogle.Breakpoint', 'ogle.Event',
+ 'ogle.EventAction', 'ogle.EventHandler', 'ogle.EventHook', 'ogle.FormatError',
+ 'ogle.Frame', 'ogle.Goroutine', 'ogle.GoroutineCreate', 'ogle.GoroutineExit',
+ 'ogle.NoCurrentGoroutine', 'ogle.NotOnStack', 'ogle.Process',
+ 'ogle.ProcessNotStopped', 'ogle.ReadOnlyError', 'ogle.RemoteMismatchError',
+ 'ogle.UnknownArchitecture', 'ogle.UnknownGoroutine', 'ogle.UsageError',
+ 'os.Errno', 'os.Error', 'os.ErrorString', 'os.File', 'os.FileInfo',
+ 'os.LinkError', 'os.PathError', 'os.SyscallError', 'os.Waitmsg', 'patch.Diff',
+ 'patch.File', 'patch.GitBinaryLiteral', 'patch.Op', 'patch.Set',
+ 'patch.SyntaxError', 'patch.TextChunk', 'patch.Verb', 'path.Visitor',
+ 'pdp1.HaltError', 'pdp1.LoopError', 'pdp1.Trapper', 'pdp1.UnknownInstrError',
+ 'pdp1.Word', 'pem.Block', 'png.FormatError', 'png.IDATDecodingError',
+ 'png.UnsupportedError', 'printer.Config', 'printer.HTMLTag', 'printer.Styler',
+ 'proc.Breakpoint', 'proc.Cause', 'proc.Process', 'proc.ProcessExited',
+ 'proc.Regs', 'proc.Signal', 'proc.Stopped', 'proc.Thread', 'proc.ThreadCreate',
+ 'proc.ThreadExit', 'proc.Word', 'quick.CheckEqualError', 'quick.CheckError',
+ 'quick.Config', 'quick.Generator', 'quick.SetupError', 'rand.Rand',
+ 'rand.Source', 'rand.Zipf', 'rc4.Cipher', 'rc4.KeySizeError',
+ 'reflect.ArrayOrSliceType', 'reflect.ArrayOrSliceValue', 'reflect.ArrayType',
+ 'reflect.ArrayValue', 'reflect.BoolType', 'reflect.BoolValue', 'reflect.ChanDir',
+ 'reflect.ChanType', 'reflect.ChanValue', 'reflect.Complex128Type',
+ 'reflect.Complex128Value', 'reflect.Complex64Type', 'reflect.Complex64Value',
+ 'reflect.ComplexType', 'reflect.ComplexValue', 'reflect.Float32Type',
+ 'reflect.Float32Value', 'reflect.Float64Type', 'reflect.Float64Value',
+ 'reflect.FloatType', 'reflect.FloatValue', 'reflect.FuncType',
+ 'reflect.FuncValue', 'reflect.Int16Type', 'reflect.Int16Value',
+ 'reflect.Int32Type', 'reflect.Int32Value', 'reflect.Int64Type',
+ 'reflect.Int64Value', 'reflect.Int8Type', 'reflect.Int8Value', 'reflect.IntType',
+ 'reflect.IntValue', 'reflect.InterfaceType', 'reflect.InterfaceValue',
+ 'reflect.MapType', 'reflect.MapValue', 'reflect.Method', 'reflect.PtrType',
+ 'reflect.PtrValue', 'reflect.SliceHeader', 'reflect.SliceType',
+ 'reflect.SliceValue', 'reflect.StringHeader', 'reflect.StringType',
+ 'reflect.StringValue', 'reflect.StructField', 'reflect.StructType',
+ 'reflect.StructValue', 'reflect.Type', 'reflect.Uint16Type',
+ 'reflect.Uint16Value', 'reflect.Uint32Type', 'reflect.Uint32Value',
+ 'reflect.Uint64Type', 'reflect.Uint64Value', 'reflect.Uint8Type',
+ 'reflect.Uint8Value', 'reflect.UintType', 'reflect.UintValue',
+ 'reflect.UintptrType', 'reflect.UintptrValue', 'reflect.UnsafePointerType',
+ 'reflect.UnsafePointerValue', 'reflect.Value', 'regexp.Error', 'regexp.Regexp',
+ 'ring.Ring', 'rpc.Call', 'rpc.Client', 'rpc.ClientCodec', 'rpc.InvalidRequest',
+ 'rpc.Request', 'rpc.Response', 'rpc.ServerCodec', 'rsa.DecryptionError',
+ 'rsa.MessageTooLongError', 'rsa.PKCS1v15Hash', 'rsa.PrivateKey', 'rsa.PublicKey',
+ 'rsa.VerificationError', 'runtime.ArrayType', 'runtime.BoolType',
+ 'runtime.ChanDir', 'runtime.ChanType', 'runtime.Complex128Type',
+ 'runtime.Complex64Type', 'runtime.ComplexType', 'runtime.Error',
+ 'runtime.Float32Type', 'runtime.Float64Type', 'runtime.FloatType',
+ 'runtime.Func', 'runtime.FuncType', 'runtime.Int16Type', 'runtime.Int32Type',
+ 'runtime.Int64Type', 'runtime.Int8Type', 'runtime.IntType',
+ 'runtime.InterfaceType', 'runtime.Itable', 'runtime.MapType',
+ 'runtime.MemProfileRecord', 'runtime.MemStatsType', 'runtime.PtrType',
+ 'runtime.SliceType', 'runtime.StringType', 'runtime.StructType', 'runtime.Type',
+ 'runtime.TypeAssertionError', 'runtime.Uint16Type', 'runtime.Uint32Type',
+ 'runtime.Uint64Type', 'runtime.Uint8Type', 'runtime.UintType',
+ 'runtime.UintptrType', 'runtime.UnsafePointerType', 'scanner.Error',
+ 'scanner.ErrorHandler', 'scanner.ErrorVector', 'scanner.Position',
+ 'scanner.Scanner', 'script.Close', 'script.Closed', 'script.Event',
+ 'script.ReceivedUnexpected', 'script.Recv', 'script.RecvMatch', 'script.Send',
+ 'script.SetupError', 'signal.Signal', 'signal.UnixSignal', 'sort.Interface',
+ 'srpc.Client', 'srpc.Errno', 'srpc.Handler', 'srpc.RPC', 'strconv.NumError',
+ 'strings.Reader', 'sync.Mutex', 'sync.RWMutex',
+ 'syscall.ByHandleFileInformation', 'syscall.Cmsghdr', 'syscall.Dirent',
+ 'syscall.EpollEvent', 'syscall.Fbootstraptransfer_t', 'syscall.FdSet',
+ 'syscall.Filetime', 'syscall.Flock_t', 'syscall.Fstore_t', 'syscall.Iovec',
+ 'syscall.Kevent_t', 'syscall.Linger', 'syscall.Log2phys_t', 'syscall.Msghdr',
+ 'syscall.Overlapped', 'syscall.PtraceRegs', 'syscall.Radvisory_t',
+ 'syscall.RawSockaddr', 'syscall.RawSockaddrAny', 'syscall.RawSockaddrInet4',
+ 'syscall.RawSockaddrInet6', 'syscall.RawSockaddrUnix', 'syscall.Rlimit',
+ 'syscall.Rusage', 'syscall.Sockaddr', 'syscall.SockaddrInet4',
+ 'syscall.SockaddrInet6', 'syscall.SockaddrUnix', 'syscall.Stat_t',
+ 'syscall.Statfs_t', 'syscall.Sysinfo_t', 'syscall.Time_t', 'syscall.Timespec',
+ 'syscall.Timeval', 'syscall.Timex', 'syscall.Tms', 'syscall.Ustat_t',
+ 'syscall.Utimbuf', 'syscall.Utsname', 'syscall.WaitStatus',
+ 'syscall.Win32finddata', 'syslog.Priority', 'syslog.Writer', 'tabwriter.Writer',
+ 'tar.Header', 'tar.Reader', 'tar.Writer', 'template.Error',
+ 'template.FormatterMap', 'template.Template', 'testing.Benchmark',
+ 'testing.Regexp', 'testing.Test', 'time.ParseError', 'time.Ticker', 'time.Time',
+ 'tls.CASet', 'tls.Certificate', 'tls.Config', 'tls.Conn', 'tls.ConnectionState',
+ 'tls.Listener', 'token.Position', 'token.Token', 'unicode.CaseRange',
+ 'unicode.Range', 'unsafe.ArbitraryType', 'vector.LessInterface',
+ 'websocket.Conn', 'websocket.Draft75Handler', 'websocket.Handler',
+ 'websocket.ProtocolError', 'websocket.WebSocketAddr', 'x509.Certificate',
+ 'x509.ConstraintViolationError', 'x509.KeyUsage', 'x509.Name',
+ 'x509.PublicKeyAlgorithm', 'x509.SignatureAlgorithm',
+ 'x509.UnhandledCriticalExtension', 'x509.UnsupportedAlgorithmError', 'xml.Attr',
+ 'xml.EndElement', 'xml.Name', 'xml.Parser', 'xml.ProcInst', 'xml.StartElement',
+ 'xml.SyntaxError', 'xml.Token', 'xml.UnmarshalError', 'xtea.Cipher',
+ 'xtea.KeySizeError'
+ )
+ ),
+ 'SYMBOLS' => array(
+ # delimiters
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', ',', ':', ';'
+ ),
+ # assignments
+ 2 => array(
+ '<<=', '!=', '%=', '&=', '&^=', '*=', '+=', '-=', '/=', ':=', '>>=',
+ '^=', '|=', '=', '++', '--'
+ ),
+ # operators
+ 3 => array(
+ '<=', '<', '==', '>', '>=', '&&', '!', '||', '&', '&^', '|', '^',
+ '>>', '<<', '*', '%', '+', '-', '.', '/', '<-'),
+ # vararg
+ 4 => array(
+ '...'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ # statements
+ 1 => 'color: #b1b100; font-weight: bold;',
+ # literals
+ 2 => 'color: #000000; font-weight: bold;',
+ # built-in functions
+ 3 => 'color: #000066;',
+ # built-in types
+ 4 => 'color: #993333;',
+ # library types
+ 5 => 'color: #003399;'
+ ),
+ 'COMMENTS' => array(
+ # single-line comments
+ 1 => 'color: #666666; font-style: italic;',
+ # raw strings
+ 2 => 'color: #0000ff;',
+ # multi-line comments
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ # simple escape
+ 1 => 'color: #000099; font-weight: bold;',
+ # octal escape
+ 2 => 'color: #000099;',
+ # hex escape
+ 3 => 'color: #000099;',
+ # unicode escape
+ 4 => 'color: #000099;',
+ # long unicode escape
+ 5 => 'color: #000099;'
+ ),
+ 'BRACKETS' => array(
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;',
+ 0 => 'color: #cc66cc;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ # delimiters
+ 1 => 'color: #339933;',
+ # assignments
+ 2 => 'color: #339933;',
+ # operators
+ 3 => 'color: #339933;',
+ # vararg (highlighted as a keyword)
+ 4 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ # If CSS classes are enabled, these would be highlighted as numbers (nu0)
+ # integer literals (possibly imaginary)
+ //0 => 'color: #cc66cc;',
+ # real floating point literals
+ //1 => 'color: #cc66cc;',
+ # imaginary floating point literals
+ //2 => 'color: #cc66cc;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => 'http://golang.org/search?q={FNAME}'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(1 => '.'),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER, # handled by symbols
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/groovy.php b/inc/geshi/groovy.php
index f2a2e9ab5..45290d2fc 100644
--- a/inc/geshi/groovy.php
+++ b/inc/geshi/groovy.php
@@ -4,7 +4,7 @@
* ----------
* Author: Ivan F. Villanueva B. (geshi_groovy@artificialidea.com)
* Copyright: (c) 2006 Ivan F. Villanueva B.(http://www.artificialidea.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/04/29
*
* Groovy language file for GeSHi.
@@ -983,15 +983,15 @@ $language_data = array (
)
),
'URLS' => array(
- 1 => 'http://www.google.de/search?q=site%3Adocs.codehaus.org/%20{FNAMEL}',
- 2 => 'http://www.google.de/search?q=site%3Adocs.codehaus.org/%20{FNAMEL}',
+ 1 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAMEL}',
+ 2 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAMEL}',
3 => 'http://www.google.de/search?as_q={FNAME}&amp;num=100&amp;hl=en&amp;as_occt=url&amp;as_sitesearch=java.sun.com%2Fj2se%2F1%2E5%2E0%2Fdocs%2Fapi%2F',
- 4 => 'http://www.google.de/search?q=site%3Adocs.codehaus.org/%20{FNAME}',
- 5 => 'http://www.google.de/search?q=site%3Adocs.codehaus.org/%20{FNAME}',
- 6 => 'http://www.google.de/search?q=site%3Adocs.codehaus.org/%20{FNAME}',
- 7 => 'http://www.google.de/search?q=site%3Adocs.codehaus.org/%20{FNAME}',
- 8 => 'http://www.google.de/search?q=site%3Adocs.codehaus.org/%20{FNAME}',
- 9 => 'http://www.google.de/search?q=site%3Adocs.codehaus.org/%20{FNAME}'
+ 4 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}',
+ 5 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}',
+ 6 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}',
+ 7 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}',
+ 8 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}',
+ 9 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}'
),
'OOLANG' => true,
'OBJECT_SPLITTERS' => array(
diff --git a/inc/geshi/gwbasic.php b/inc/geshi/gwbasic.php
index 7b2385de7..ecc16341d 100644
--- a/inc/geshi/gwbasic.php
+++ b/inc/geshi/gwbasic.php
@@ -4,7 +4,7 @@
* ----------
* Author: José Gabriel Moya Yangüela (josemoya@gmail.com)
* Copyright: (c) 2010 José Gabriel Moya Yangüela (http://doc.apagada.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/01/30
*
* GwBasic language file for GeSHi.
diff --git a/inc/geshi/haskell.php b/inc/geshi/haskell.php
index 4997a26c3..adae11168 100644
--- a/inc/geshi/haskell.php
+++ b/inc/geshi/haskell.php
@@ -4,7 +4,7 @@
* ----------
* Author: Jason Dagit (dagit@codersbase.com) based on ocaml.php by Flaie (fireflaie@gmail.com)
* Copyright: (c) 2005 Flaie, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/08/27
*
* Haskell language file for GeSHi.
@@ -46,8 +46,8 @@ $language_data = array (
3 => "/{-(?:(?R)|.)-}/s", //Nested Comments
),
'CASE_KEYWORDS' => 0,
- 'QUOTEMARKS' => array('"'),
- 'ESCAPE_CHAR' => "\\",
+ 'QUOTEMARKS' => array('"',"'"),
+ 'ESCAPE_CHAR' => '\\',
'KEYWORDS' => array(
/* main haskell keywords */
1 => array(
@@ -95,7 +95,7 @@ $language_data = array (
'product', 'concat', 'concatMap', 'maximum',
'minimum', 'scanl', 'scanl1', 'scanr', 'scanr1',
'iterate', 'repeat', 'cycle', 'take', 'drop',
- 'splitAt', 'teakWhile', 'dropWhile', 'span',
+ 'splitAt', 'takeWhile', 'dropWhile', 'span',
'break', 'elem', 'notElem', 'lookup', 'zip',
'zip3', 'zipWith', 'zipWith3', 'unzip', 'unzip3',
'lines', 'words', 'unlines',
diff --git a/inc/geshi/haxe.php b/inc/geshi/haxe.php
new file mode 100644
index 000000000..778637e2b
--- /dev/null
+++ b/inc/geshi/haxe.php
@@ -0,0 +1,161 @@
+<?php
+/*************************************************************************************
+ * haxe.php
+ * --------
+ * Author: Andy Li (andy@onthewings.net)
+ * John Liao (colorhook@gmail.com)
+ * Copyright: (c) 2012 onthewings (http://www.onthewings.net/)
+ * 2010 colorhook (http://colorhook.com/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/10/05
+ *
+ * Haxe language file for GeSHi.
+ * Haxe version: 2.10
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Haxe',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Import and Package directives (Basic Support only)
+ 2 => '/(?:(?<=import[\\n\\s])|(?<=using[\\n\\s])|(?<=package[\\n\\s]))[\\n\\s]*([a-zA-Z0-9_]+\\.)*([a-zA-Z0-9_]+|\*)(?=[\n\s;])/i',
+ // Haxe comments
+ 3 => '#/\*\*(?![\*\/]).*\*/#sU',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ //http://haxe.org/ref/keywords
+ 'break', 'callback', 'case', 'cast', 'catch', 'class', 'continue', 'default', 'do', 'dynamic',
+ 'else', 'enum', 'extends', 'extern', /*'false',*/ 'for', 'function', 'here', 'if',
+ 'implements', 'import', 'in', 'inline', 'interface', 'never', 'new', /*'null',*/ 'override',
+ 'package', 'private', 'public', 'return', 'static', 'super', 'switch', 'this', 'throw',
+ 'trace', /*'true',*/ 'try', 'typedef', 'untyped', 'using', 'var', 'while',
+ 'macro', '$type',
+ ),
+ 2 => array(
+ //primitive values
+ 'null', 'false', 'true',
+ ),
+ 3 => array(
+ //global types
+ 'Array', 'ArrayAccess', /*'Bool',*/ 'Class', 'Date', 'DateTools', 'Dynamic',
+ 'EReg', 'Enum', 'EnumValue', /*'Float',*/ 'Hash', /*'Int',*/ 'IntHash', 'IntIter',
+ 'Iterable', 'Iterator', 'Lambda', 'List', 'Math', 'Null', 'Reflect', 'Std',
+ /*'String',*/ 'StringBuf', 'StringTools', 'Sys', 'Type', /*'UInt',*/ 'ValueType',
+ /*'Void',*/ 'Xml', 'XmlType',
+ ),
+ 4 => array(
+ //primitive types
+ 'Void', 'Bool', 'Int', 'Float', 'UInt', 'String',
+ ),
+ 5 => array(
+ //compiler switches
+ "#if", "#elseif", "#else", "#end", "#error",
+ ),
+ ),
+ 'SYMBOLS' => array(
+ //http://haxe.org/manual/operators
+ '++', '--',
+ '%',
+ '*', '/',
+ '+', '-',
+ '<<', '>>', '>>>',
+ '|', '&', '^',
+ '==', '!=', '>', '>=', '<', '<=',
+ '...',
+ '&&',
+ '||',
+ '?', ':',
+ '=', '+=', '-=', '/=', '*=', '<<=', '>>=', '>>>=', '|=', '&=', '^=',
+ '(', ')', '[', ']', '{', '}', ';',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #6699cc; font-weight: bold;',
+ 2 => 'color: #000066; font-weight: bold;',
+ 3 => 'color: #03F; ',
+ 4 => 'color: #000033; font-weight: bold;',
+ 5 => 'color: #330000; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #006699;',
+ 3 => 'color: #008000; font-style: italic; font-weight: bold;',
+ 3 => 'color: #008000; font-style: italic; font-weight: bold;',
+ 'MULTI' => 'color: #666666; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;',
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #FF0000;',
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006633;',
+ 2 => 'color: #006633;',
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/hicest.php b/inc/geshi/hicest.php
index 6cb61f87c..78a2bc206 100644
--- a/inc/geshi/hicest.php
+++ b/inc/geshi/hicest.php
@@ -4,7 +4,7 @@
* --------
* Author: Georg Petrich (spt@hicest.com)
* Copyright: (c) 2010 Georg Petrich (http://www.HicEst.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/03/15
*
* HicEst language file for GeSHi.
diff --git a/inc/geshi/hq9plus.php b/inc/geshi/hq9plus.php
index 50a0f80c6..7ba1a73c1 100644
--- a/inc/geshi/hq9plus.php
+++ b/inc/geshi/hq9plus.php
@@ -4,7 +4,7 @@
* ----------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/10/31
*
* HQ9+ language file for GeSHi.
diff --git a/inc/geshi/html4strict.php b/inc/geshi/html4strict.php
index 301513e4e..97392fa84 100644
--- a/inc/geshi/html4strict.php
+++ b/inc/geshi/html4strict.php
@@ -4,7 +4,7 @@
* ---------------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/07/10
*
* HTML 4.01 strict language file for GeSHi.
@@ -58,42 +58,24 @@ $language_data = array (
'ESCAPE_CHAR' => '',
'KEYWORDS' => array(
2 => array(
- 'a', 'abbr', 'acronym', 'address', 'applet',
-
+ 'a', 'abbr', 'acronym', 'address', 'applet', 'area',
'base', 'basefont', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'b',
-
'caption', 'center', 'cite', 'code', 'colgroup', 'col',
-
'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt',
-
'em',
-
'fieldset', 'font', 'form', 'frame', 'frameset',
-
'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html',
-
'iframe', 'ilayer', 'img', 'input', 'ins', 'isindex', 'i',
-
'kbd',
-
'label', 'legend', 'link', 'li',
-
'map', 'meta',
-
'noframes', 'noscript',
-
'object', 'ol', 'optgroup', 'option',
-
'param', 'pre', 'p',
-
'q',
-
'samp', 'script', 'select', 'small', 'span', 'strike', 'strong', 'style', 'sub', 'sup', 's',
-
'table', 'tbody', 'td', 'textarea', 'text', 'tfoot', 'thead', 'th', 'title', 'tr', 'tt',
-
'ul', 'u',
-
'var',
),
3 => array(
@@ -151,6 +133,7 @@ $language_data = array (
0 => 'color: #66cc66;'
),
'SCRIPT' => array(
+ -2 => 'color: #404040;', // CDATA
-1 => 'color: #808080; font-style: italic;', // comments
0 => 'color: #00bbdd;',
1 => 'color: #ddbb00;',
@@ -170,6 +153,9 @@ $language_data = array (
),
'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
'SCRIPT_DELIMITERS' => array(
+ -2 => array(
+ '<![CDATA[' => ']]>'
+ ),
-1 => array(
'<!--' => '-->'
),
@@ -184,6 +170,7 @@ $language_data = array (
)
),
'HIGHLIGHT_STRICT_BLOCK' => array(
+ -2 => false,
-1 => false,
0 => false,
1 => false,
@@ -200,4 +187,4 @@ $language_data = array (
)
);
-?>
+?> \ No newline at end of file
diff --git a/inc/geshi/html5.php b/inc/geshi/html5.php
new file mode 100644
index 000000000..0d9755945
--- /dev/null
+++ b/inc/geshi/html5.php
@@ -0,0 +1,212 @@
+<?php
+/*************************************************************************************
+ * html5.php
+ * ---------------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/10
+ *
+ * HTML 5 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/12/28 (1.0.4)
+ * - Removed escape character for strings
+ * 2004/11/27 (1.0.3)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.2)
+ * - Added support for URLs
+ * 2004/08/05 (1.0.1)
+ * - Added INS and DEL
+ * - Removed the background colour from tags' styles
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * Check that only HTML4 strict attributes are highlighted
+ * * Eliminate empty tags that aren't allowed in HTML4 strict
+ * * Split to several files - html4trans, xhtml1 etc
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'HTML5',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'a', 'abbr', 'address', 'article', 'area', 'aside', 'audio',
+
+ 'base', 'bdo', 'blockquote', 'body', 'br', 'button', 'b',
+
+ 'caption', 'cite', 'code', 'colgroup', 'col', 'canvas', 'command', 'datalist', 'details',
+
+ 'dd', 'del', 'dfn', 'div', 'dl', 'dt',
+
+ 'em', 'embed',
+
+ 'fieldset', 'form', 'figcaption', 'figure', 'footer',
+
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html', 'header', 'hgroup',
+
+ 'iframe', 'ilayer', 'img', 'input', 'ins', 'isindex', 'i',
+
+ 'kbd', 'keygen',
+
+ 'label', 'legend', 'link', 'li',
+
+ 'map', 'meta', 'mark', 'meter',
+
+ 'noscript', 'nav',
+
+ 'object', 'ol', 'optgroup', 'option', 'output',
+
+ 'param', 'pre', 'p', 'progress',
+
+ 'q',
+
+ 'rp', 'rt', 'ruby',
+
+ 'samp', 'script', 'select', 'small', 'span', 'strong', 'style', 'sub', 'sup', 's', 'section', 'source', 'summary',
+
+ 'table', 'tbody', 'td', 'textarea', 'text', 'tfoot', 'thead', 'th', 'title', 'tr', 'time',
+
+ 'ul',
+
+ 'var', 'video',
+
+ 'wbr',
+ ),
+ 3 => array(
+ 'abbr', 'accept-charset', 'accept', 'accesskey', 'action', 'align', 'alink', 'alt', 'archive', 'axis', 'autocomplete', 'autofocus',
+ 'background', 'bgcolor', 'border',
+ 'cellpadding', 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'classid', 'clear', 'code', 'codebase', 'codetype', 'color', 'cols', 'colspan', 'compact', 'content', 'coords', 'contenteditable', 'contextmenu',
+ 'data', 'datetime', 'declare', 'defer', 'dir', 'disabled', 'draggable', 'dropzone',
+ 'enctype',
+ 'face', 'for', 'frame', 'frameborder', 'form', 'formaction', 'formenctype', 'formmethod', 'formnovalidate', 'formtarget',
+ 'headers', 'height', 'href', 'hreflang', 'hspace', 'http-equiv', 'hidden',
+ 'id', 'ismap',
+ 'label', 'lang', 'language', 'link', 'longdesc',
+ 'marginheight', 'marginwidth', 'maxlength', 'media', 'method', 'multiple', 'min', 'max',
+ 'name', 'nohref', 'noresize', 'noshade', 'nowrap', 'novalidate',
+ 'object', 'onblur', 'onchange', 'onclick', 'ondblclick', 'onfocus', 'onkeydown', 'onkeypress', 'onkeyup', 'onload', 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onselect', 'onsubmit', 'onunload', 'onafterprint', 'onbeforeprint', 'onbeforeonload', 'onerror', 'onhaschange', 'onmessage', 'onoffline', 'ononline', 'onpagehide', 'onpageshow', 'onpopstate', 'onredo', 'onresize', 'onstorage', 'onundo', 'oncontextmenu', 'onformchange', 'onforminput', 'oninput', 'oninvalid', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onmousewheel', 'onscroll', 'oncanplay', 'oncanplaythrough', 'ondurationchange', 'onemptied', 'onended', 'onloadeddata', 'onloadedmetadata', 'onloadstart', 'onpause', 'onplay', 'onplaying', 'onprogress', 'onratechange', 'onreadystatechange', 'onseeked', 'onseeking', 'onstalled', 'onsuspend', 'ontimeupdate', 'onvolumechange', 'onwaiting',
+ 'profile', 'prompt', 'pattern', 'placeholder',
+ 'readonly', 'rel', 'rev', 'rowspan', 'rows', 'rules', 'required',
+ 'scheme', 'scope', 'scrolling', 'selected', 'shape', 'size', 'span', 'src', 'standby', 'start', 'style', 'summary', 'spellcheck', 'step',
+ 'tabindex', 'target', 'text', 'title', 'type',
+ 'usemap',
+ 'valign', 'value', 'valuetype', 'version', 'vlink', 'vspace',
+ 'width'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '/', '='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ -2 => 'color: #404040;', // CDATA
+ -1 => 'color: #808080; font-style: italic;', // comments
+ 0 => 'color: #00bbdd;',
+ 1 => 'color: #ddbb00;',
+ 2 => 'color: #009900;'
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 2 => 'http://december.com/html/4/element/{FNAMEL}.html',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
+ 'SCRIPT_DELIMITERS' => array(
+ -2 => array(
+ '<![CDATA[' => ']]>'
+ ),
+ -1 => array(
+ '<!--' => '-->'
+ ),
+ 0 => array(
+ '<!DOCTYPE' => '>'
+ ),
+ 1 => array(
+ '&' => ';'
+ ),
+ 2 => array(
+ '<' => '>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ -2 => false,
+ -1 => false,
+ 0 => false,
+ 1 => false,
+ 2 => true
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&lt;|&lt;\/)',
+ 'DISALLOWED_AFTER' => '(?=\s|\/|&gt;)',
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/icon.php b/inc/geshi/icon.php
index 0712c21c3..06383ea5d 100644
--- a/inc/geshi/icon.php
+++ b/inc/geshi/icon.php
@@ -4,7 +4,7 @@
* --------
* Author: Matt Oates (mattoates@gmail.com)
* Copyright: (c) 2010 Matt Oates (http://mattoates.co.uk)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/04/24
*
* Icon language file for GeSHi.
diff --git a/inc/geshi/idl.php b/inc/geshi/idl.php
index d2d9a92fa..69bd14ff4 100644
--- a/inc/geshi/idl.php
+++ b/inc/geshi/idl.php
@@ -4,7 +4,7 @@
* -------
* Author: Cedric Bosdonnat (cedricbosdo@openoffice.org)
* Copyright: (c) 2006 Cedric Bosdonnat
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/08/20
*
* Unoidl language file for GeSHi.
diff --git a/inc/geshi/ini.php b/inc/geshi/ini.php
index e48cc045c..8e6ca76db 100644
--- a/inc/geshi/ini.php
+++ b/inc/geshi/ini.php
@@ -4,7 +4,7 @@
* --------
* Author: deguix (cevo_deguix@yahoo.com.br)
* Copyright: (c) 2005 deguix
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/03/27
*
* INI language file for GeSHi.
diff --git a/inc/geshi/inno.php b/inc/geshi/inno.php
index 9ec8cdfd9..1e2ee8bef 100644
--- a/inc/geshi/inno.php
+++ b/inc/geshi/inno.php
@@ -4,7 +4,7 @@
* ----------
* Author: Thomas Klingler (hotline@theratech.de) based on delphi.php from J�rja Norbert (jnorbi@vipmail.hu)
* Copyright: (c) 2004 J�rja Norbert, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/07/29
*
* Inno Script language inkl. Delphi (Object Pascal) language file for GeSHi.
diff --git a/inc/geshi/intercal.php b/inc/geshi/intercal.php
index cd800a8eb..3c81b81cc 100644
--- a/inc/geshi/intercal.php
+++ b/inc/geshi/intercal.php
@@ -4,7 +4,7 @@
* ----------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/10/31
*
* INTERCAL language file for GeSHi.
diff --git a/inc/geshi/io.php b/inc/geshi/io.php
index 94c278f03..51fad43a7 100644
--- a/inc/geshi/io.php
+++ b/inc/geshi/io.php
@@ -4,7 +4,7 @@
* -------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2006 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/09/23
*
* Io language file for GeSHi. Thanks to Johnathan Wright for the suggestion and help
diff --git a/inc/geshi/j.php b/inc/geshi/j.php
index 61154c7ef..5565bb499 100644
--- a/inc/geshi/j.php
+++ b/inc/geshi/j.php
@@ -4,13 +4,15 @@
* --------
* Author: Ric Sherlock (tikkanz@gmail.com)
* Copyright: (c) 2009 Ric Sherlock
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/11/10
*
* J language file for GeSHi.
*
* CHANGES
* -------
+ * 2010/07/18 (1.0.8.10)
+ * - Infinity and negative infinity recognized as numbers
* 2010/03/01 (1.0.8.8)
* - Add support for label_xyz. and goto_xyz.
* - Fix highlighting of for_i.
@@ -29,7 +31,6 @@
* 2009/11/12 (1.0.0)
* - First Release
*
- *
* TODO (updated 2010/01/27)
* -------------------------
* * combine keyword categories by using conditional regex statement in PARSER CONTROL?
@@ -53,7 +54,7 @@
*
************************************************************************************/
-$language_data = array (
+$language_data = array(
'LANG_NAME' => 'J',
'COMMENT_SINGLE' => array(),
'COMMENT_MULTI' => array(),
@@ -69,12 +70,7 @@ $language_data = array (
'HARDESCAPE' => array("'"),
'HARDCHAR' => "'",
'NUMBERS' => array(
- //Some instances of infinity are not correctly handled by GeSHi NUMBERS currently
- //There are two solutions labelled "infinity Method A" and "infinity Method B"
- //infinity Method B - requires following adjustment to line 3349 of geshi.php
- // preg_match('#\d#' becomes preg_match('#[\d_]#'
- 0 => '\b(?:_?\d+(?:\.\d+)?(?:x|[bejprx]_?[\da-z]+(?:\.[\da-z]+)?)?)(?![\w\.\:])', //infinity Method A
- //0 => '\b(?:_?\d+(?:\.\d+)?(?:x|[bejprx]_?[\da-z]+(?:\.[\da-z]+)?)?|__?)(?![\w\.\:])', //infinity Method B
+ 0 => '\b(?:_?\d+(?:\.\d+)?(?:x|[bejprx]_?[\da-z]+(?:\.[\da-z]+)?)?|__?)(?![\w\.\:])',
),
'KEYWORDS' => array(
//Control words
@@ -87,40 +83,6 @@ $language_data = array (
2 => array(
'm', 'n', 'u', 'v', 'x', 'y'
),
-/*
-Commented out for now due to conflicts with Lang Check
- //Primitives beginning with a symbol (except . or :)
- 6 => array(
- '=', '&lt;', '&lt;.', '&lt;:', //verbs
- '_:','&gt;', '&gt;.', '&gt;:',
- '+', '+.', '+:', '*', '*.', '*:', '-', '-.', '-:', '%', '%.', '%:',
- '^', '^.', '$', '$.', '$:', '~.', '~:', '\|', '|.', '|:',
- ',', ',.', ',:', ';', ';:', '#', '#.', '#:', '!', '/:', '\:',
- '[', '[:', ']', '{', '{.', '{:', '{::', '}.', '}:',
- '&quot;.', '&quot;:', '?', '?.',
- '~', '\/;', '\\', '/.', '\\.', '}', //adverbs
- '^:', ';.', '!.', '!:', //conj
- '&quot;', '`', '`:', '@', '@.', '@:',
- '&amp;', '&amp;.', '&amp;:', '&amp;.:',
- '_.', //nouns
- '=.', '=:', //other
- ),
- //Primitives beginning with a letter or number
- 7 => array(
- 'A.', 'c.', 'C.', 'e.', 'E.', //verbs
- 'i.', 'i:', 'I.', 'j.', 'L.', 'o.',
- 'p.', 'p..', 'p:', 'q:', 'r.', 's:', 'u:', 'x:',
- '_9:', '_8:', '_7:', '_6:', '_5:', '_4:', '_3:', '_2:', '_1:',
- '0:', '1:', '2:', '3:', '4:', '5:', '6:', '7:', '8:', '9:',
- 'b.', 'f.', 'M.', 't.', 't:', //adverbs
- 'd.', 'D.', 'D:', 'H.', 'L:', 'S:', 'T.', //conj
- 'a.', 'a:', //nouns
- ),
- //Primitives beginning with symbol . or :
- 8 => array(
- '..', '.:', '.', ':.', '::', ':', //conj
- ),
-*/
),
'SYMBOLS' => array(
//Punctuation
@@ -132,17 +94,17 @@ Commented out for now due to conflicts with Lang Check
GESHI_COMMENTS => false,
1 => true,
2 => true,
-// 6 => true,
-// 7 => true,
-// 8 => true,
+ //6 => true,
+ //7 => true,
+ //8 => true,
),
'STYLES' => array(
'KEYWORDS' => array(
1 => 'color: #0000ff; font-weight: bold;',
2 => 'color: #0000cc; font-weight: bold;',
-// 6 => 'color: #000000; font-weight: bold;',
-// 7 => 'color: #000000; font-weight: bold;',
-// 8 => 'color: #000000; font-weight: bold;',
+ //6 => 'color: #000000; font-weight: bold;',
+ //7 => 'color: #000000; font-weight: bold;',
+ //8 => 'color: #000000; font-weight: bold;',
),
'COMMENTS' => array(
1 => 'color: #666666; font-style: italic;',
@@ -171,7 +133,6 @@ Commented out for now due to conflicts with Lang Check
),
'REGEXPS' => array(
0 => 'color: #0000ff; font-weight: bold;', //for_xyz. - same as kw1
- 1 => 'color: #009999; font-weight: bold;' //infinity - same as nu0
),
'SCRIPT' => array(
)
@@ -179,16 +140,15 @@ Commented out for now due to conflicts with Lang Check
'URLS' => array(
1 => '', //'http://www.jsoftware.com/help/dictionary/ctrl.htm',
2 => '',
-// 6 => '', //'http://www.jsoftware.com/jwiki/Vocabulary',
-// 7 => '', //'http://www.jsoftware.com/jwiki/Vocabulary',
-// 8 => '', //'http://www.jsoftware.com/jwiki/Vocabulary',
+ //6 => '', //'http://www.jsoftware.com/jwiki/Vocabulary',
+ //7 => '', //'http://www.jsoftware.com/jwiki/Vocabulary',
+ //8 => '', //'http://www.jsoftware.com/jwiki/Vocabulary',
),
'OOLANG' => false,
'OBJECT_SPLITTERS' => array(
),
'REGEXPS' => array(
0 => '\b(for|goto|label)_[a-zA-Z]\w*\.', //for_xyz. - should be kw1
- 1 => '\b__?(?![\w\.\:])' //infinity - should be nu0
),
'STRICT_MODE_APPLIES' => GESHI_NEVER,
'SCRIPT_DELIMITERS' => array(
@@ -199,6 +159,9 @@ Commented out for now due to conflicts with Lang Check
'ENABLE_FLAGS' => array(
'BRACKETS' => GESHI_NEVER,
),
+ 'NUMBERS' => array(
+ 'PRECHECK_RX' => '#[\d_]#', // underscore is valid number
+ ),
'KEYWORDS' => array(
//Control words
2 => array(
@@ -224,4 +187,4 @@ Commented out for now due to conflicts with Lang Check
)
);
-?> \ No newline at end of file
+?>
diff --git a/inc/geshi/java.php b/inc/geshi/java.php
index 3269dffe2..652b8ddd3 100644
--- a/inc/geshi/java.php
+++ b/inc/geshi/java.php
@@ -4,7 +4,7 @@
* --------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/07/10
*
* Java language file for GeSHi.
@@ -964,7 +964,7 @@ $language_data = array (
'URLS' => array(
1 => '',
2 => '',
- 3 => 'http://www.google.com/search?hl=en&amp;q=allinurl%3A{FNAMEL}+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky',
+ 3 => 'http://www.google.com/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+{FNAMEL}',
4 => ''
),
'OOLANG' => true,
diff --git a/inc/geshi/java5.php b/inc/geshi/java5.php
index bc9af739a..af16bd1e6 100644
--- a/inc/geshi/java5.php
+++ b/inc/geshi/java5.php
@@ -4,7 +4,7 @@
* --------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/07/10
*
* Java language file for GeSHi.
@@ -850,169 +850,169 @@ $language_data = array (
2 => '',
3 => '',
4 => '',
- 5 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/applet/{FNAME}.html',
- 6 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/{FNAME}.html',
- 7 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/color/{FNAME}.html',
- 8 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/datatransfer/{FNAME}.html',
- 9 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/dnd/{FNAME}.html',
- 10 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/event/{FNAME}.html',
- 11 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/font/{FNAME}.html',
- 12 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/geom/{FNAME}.html',
- 13 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/im/{FNAME}.html',
- 14 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/im/spi/{FNAME}.html',
- 15 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/image/{FNAME}.html',
- 16 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/image/renderable/{FNAME}.html',
- 17 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/awt/print/{FNAME}.html',
- 18 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/beans/{FNAME}.html',
- 19 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/beans/beancontext/{FNAME}.html',
- 20 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/io/{FNAME}.html',
- 21 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/{FNAME}.html',
- 22 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/annotation/{FNAME}.html',
- 23 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/instrument/{FNAME}.html',
- 24 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/management/{FNAME}.html',
- 25 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/ref/{FNAME}.html',
- 26 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/lang/reflect/{FNAME}.html',
- 27 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/math/{FNAME}.html',
- 28 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/net/{FNAME}.html',
- 29 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/nio/{FNAME}.html',
- 30 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/nio/channels/{FNAME}.html',
- 31 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/nio/channels/spi/{FNAME}.html',
- 32 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/nio/charset/{FNAME}.html',
- 33 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/nio/charset/spi/{FNAME}.html',
- 34 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/rmi/{FNAME}.html',
- 35 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/rmi/activation/{FNAME}.html',
- 36 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/rmi/dgc/{FNAME}.html',
- 37 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/rmi/registry/{FNAME}.html',
- 38 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/rmi/server/{FNAME}.html',
- 39 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/security/{FNAME}.html',
- 40 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/security/acl/{FNAME}.html',
- 41 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/security/cert/{FNAME}.html',
- 42 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/security/interfaces/{FNAME}.html',
- 43 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/security/spec/{FNAME}.html',
- 44 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/sql/{FNAME}.html',
- 45 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/text/{FNAME}.html',
- 46 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/{FNAME}.html',
- 47 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/concurrent/{FNAME}.html',
- 48 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/concurrent/atomic/{FNAME}.html',
- 49 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/concurrent/locks/{FNAME}.html',
- 50 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/jar/{FNAME}.html',
- 51 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/logging/{FNAME}.html',
- 52 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/prefs/{FNAME}.html',
- 53 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/regex/{FNAME}.html',
- 54 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/java/util/zip/{FNAME}.html',
- 55 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/accessibility/{FNAME}.html',
- 56 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/activity/{FNAME}.html',
- 57 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/crypto/{FNAME}.html',
- 58 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/crypto/interfaces/{FNAME}.html',
- 59 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/crypto/spec/{FNAME}.html',
- 60 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/imageio/{FNAME}.html',
- 61 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/imageio/event/{FNAME}.html',
- 62 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/imageio/metadata/{FNAME}.html',
- 63 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/imageio/plugins/bmp/{FNAME}.html',
- 64 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/imageio/plugins/jpeg/{FNAME}.html',
- 65 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/imageio/spi/{FNAME}.html',
- 66 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/imageio/stream/{FNAME}.html',
- 67 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/management/{FNAME}.html',
- 68 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/management/loading/{FNAME}.html',
- 69 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/management/modelmbean/{FNAME}.html',
- 70 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/management/monitor/{FNAME}.html',
- 71 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/management/openmbean/{FNAME}.html',
- 72 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/management/relation/{FNAME}.html',
- 73 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/management/remote/{FNAME}.html',
- 74 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/management/remote/rmi/{FNAME}.html',
- 75 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/management/timer/{FNAME}.html',
- 76 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/naming/{FNAME}.html',
- 77 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/naming/directory/{FNAME}.html',
- 78 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/naming/event/{FNAME}.html',
- 79 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/naming/ldap/{FNAME}.html',
- 80 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/naming/spi/{FNAME}.html',
- 81 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/net/{FNAME}.html',
- 82 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/net/ssl/{FNAME}.html',
- 83 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/print/{FNAME}.html',
- 84 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/print/attribute/{FNAME}.html',
- 85 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/print/attribute/standard/{FNAME}.html',
- 86 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/print/event/{FNAME}.html',
- 87 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/rmi/{FNAME}.html',
- 88 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/rmi/CORBA/{FNAME}.html',
- 89 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/rmi/ssl/{FNAME}.html',
- 90 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/security/auth/{FNAME}.html',
- 91 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/security/auth/callback/{FNAME}.html',
- 92 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/security/auth/kerberos/{FNAME}.html',
- 93 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/security/auth/login/{FNAME}.html',
- 94 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/security/auth/spi/{FNAME}.html',
- 95 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/security/auth/x500/{FNAME}.html',
- 96 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/security/sasl/{FNAME}.html',
- 97 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/sound/midi/{FNAME}.html',
- 98 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/sound/midi/spi/{FNAME}.html',
- 99 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/sound/sampled/{FNAME}.html',
- 100 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/sound/sampled/spi/{FNAME}.html',
- 101 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/sql/{FNAME}.html',
- 102 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/sql/rowset/{FNAME}.html',
- 103 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/sql/rowset/serial/{FNAME}.html',
- 104 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/sql/rowset/spi/{FNAME}.html',
- 105 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/{FNAME}.html',
- 106 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/border/{FNAME}.html',
- 107 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/colorchooser/{FNAME}.html',
- 108 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/event/{FNAME}.html',
- 109 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/filechooser/{FNAME}.html',
- 110 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/plaf/{FNAME}.html',
- 111 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/plaf/basic/{FNAME}.html',
- 112 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/plaf/metal/{FNAME}.html',
- 113 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/plaf/multi/{FNAME}.html',
- 114 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/plaf/synth/{FNAME}.html',
- 115 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/table/{FNAME}.html',
- 116 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/text/{FNAME}.html',
- 117 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/text/html/{FNAME}.html',
- 118 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/text/html/parser/{FNAME}.html',
- 119 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/text/rtf/{FNAME}.html',
- 120 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/tree/{FNAME}.html',
- 121 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/swing/undo/{FNAME}.html',
- 122 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/transaction/{FNAME}.html',
- 123 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/transaction/xa/{FNAME}.html',
- 124 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/xml/{FNAME}.html',
- 125 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/xml/datatype/{FNAME}.html',
- 126 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/xml/namespace/{FNAME}.html',
- 127 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/xml/parsers/{FNAME}.html',
- 128 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/xml/transform/{FNAME}.html',
- 129 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/xml/transform/dom/{FNAME}.html',
- 130 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/xml/transform/sax/{FNAME}.html',
- 131 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/xml/transform/stream/{FNAME}.html',
- 132 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/xml/validation/{FNAME}.html',
- 133 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/javax/xml/xpath/{FNAME}.html',
- 134 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/ietf/jgss/{FNAME}.html',
- 135 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/CORBA/{FNAME}.html',
- 136 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/CORBA/DynAnyPackage/{FNAME}.html',
- 137 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/CORBA/TypeCodePackage/{FNAME}.html',
- 138 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/CORBA/portable/{FNAME}.html',
- 139 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/CosNaming/{FNAME}.html',
- 140 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/CosNaming/NamingContextExtPackage/{FNAME}.html',
- 141 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/CosNaming/NamingContextPackage/{FNAME}.html',
- 142 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/Dynamic/{FNAME}.html',
- 143 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/DynamicAny/{FNAME}.html',
- 144 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/DynamicAny/DynAnyFactoryPackage/{FNAME}.html',
- 145 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/DynamicAny/DynAnyPackage/{FNAME}.html',
- 146 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/IOP/{FNAME}.html',
- 147 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/IOP/CodecFactoryPackage/{FNAME}.html',
- 148 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/IOP/CodecPackage/{FNAME}.html',
- 149 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/Messaging/{FNAME}.html',
- 150 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/PortableInterceptor/{FNAME}.html',
- 151 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/PortableInterceptor/ORBInitInfoPackage/{FNAME}.html',
- 152 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/PortableServer/{FNAME}.html',
- 153 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/PortableServer/CurrentPackage/{FNAME}.html',
- 154 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/PortableServer/POAManagerPackage/{FNAME}.html',
- 155 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/PortableServer/POAPackage/{FNAME}.html',
- 156 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/PortableServer/ServantLocatorPackage/{FNAME}.html',
- 157 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/SendingContext/{FNAME}.html',
- 158 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/omg/stub/java/rmi/{FNAME}.html',
- 159 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/w3c/dom/{FNAME}.html',
- 160 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/w3c/dom/bootstrap/{FNAME}.html',
- 161 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/w3c/dom/events/{FNAME}.html',
- 162 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/w3c/dom/ls/{FNAME}.html',
- 163 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/xml/sax/{FNAME}.html',
- 164 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/xml/sax/ext/{FNAME}.html',
- 165 => 'http://java.sun.com/j2se/1%2E5%2E0/docs/api/org/xml/sax/helpers/{FNAME}.html',
+ 5 => 'http://docs.oracle.com/javase/7/docs/api/java/applet/{FNAME}.html',
+ 6 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/{FNAME}.html',
+ 7 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/color/{FNAME}.html',
+ 8 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/datatransfer/{FNAME}.html',
+ 9 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/dnd/{FNAME}.html',
+ 10 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/event/{FNAME}.html',
+ 11 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/font/{FNAME}.html',
+ 12 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/geom/{FNAME}.html',
+ 13 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/im/{FNAME}.html',
+ 14 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/im/spi/{FNAME}.html',
+ 15 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/image/{FNAME}.html',
+ 16 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/image/renderable/{FNAME}.html',
+ 17 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/print/{FNAME}.html',
+ 18 => 'http://docs.oracle.com/javase/7/docs/api/java/beans/{FNAME}.html',
+ 19 => 'http://docs.oracle.com/javase/7/docs/api/java/beans/beancontext/{FNAME}.html',
+ 20 => 'http://docs.oracle.com/javase/7/docs/api/java/io/{FNAME}.html',
+ 21 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/{FNAME}.html',
+ 22 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/{FNAME}.html',
+ 23 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/{FNAME}.html',
+ 24 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/management/{FNAME}.html',
+ 25 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/ref/{FNAME}.html',
+ 26 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/{FNAME}.html',
+ 27 => 'http://docs.oracle.com/javase/7/docs/api/java/math/{FNAME}.html',
+ 28 => 'http://docs.oracle.com/javase/7/docs/api/java/net/{FNAME}.html',
+ 29 => 'http://docs.oracle.com/javase/7/docs/api/java/nio/{FNAME}.html',
+ 30 => 'http://docs.oracle.com/javase/7/docs/api/java/nio/channels/{FNAME}.html',
+ 31 => 'http://docs.oracle.com/javase/7/docs/api/java/nio/channels/spi/{FNAME}.html',
+ 32 => 'http://docs.oracle.com/javase/7/docs/api/java/nio/charset/{FNAME}.html',
+ 33 => 'http://docs.oracle.com/javase/7/docs/api/java/nio/charset/spi/{FNAME}.html',
+ 34 => 'http://docs.oracle.com/javase/7/docs/api/java/rmi/{FNAME}.html',
+ 35 => 'http://docs.oracle.com/javase/7/docs/api/java/rmi/activation/{FNAME}.html',
+ 36 => 'http://docs.oracle.com/javase/7/docs/api/java/rmi/dgc/{FNAME}.html',
+ 37 => 'http://docs.oracle.com/javase/7/docs/api/java/rmi/registry/{FNAME}.html',
+ 38 => 'http://docs.oracle.com/javase/7/docs/api/java/rmi/server/{FNAME}.html',
+ 39 => 'http://docs.oracle.com/javase/7/docs/api/java/security/{FNAME}.html',
+ 40 => 'http://docs.oracle.com/javase/7/docs/api/java/security/acl/{FNAME}.html',
+ 41 => 'http://docs.oracle.com/javase/7/docs/api/java/security/cert/{FNAME}.html',
+ 42 => 'http://docs.oracle.com/javase/7/docs/api/java/security/interfaces/{FNAME}.html',
+ 43 => 'http://docs.oracle.com/javase/7/docs/api/java/security/spec/{FNAME}.html',
+ 44 => 'http://docs.oracle.com/javase/7/docs/api/java/sql/{FNAME}.html',
+ 45 => 'http://docs.oracle.com/javase/7/docs/api/java/text/{FNAME}.html',
+ 46 => 'http://docs.oracle.com/javase/7/docs/api/java/util/{FNAME}.html',
+ 47 => 'http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/{FNAME}.html',
+ 48 => 'http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/{FNAME}.html',
+ 49 => 'http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/{FNAME}.html',
+ 50 => 'http://docs.oracle.com/javase/7/docs/api/java/util/jar/{FNAME}.html',
+ 51 => 'http://docs.oracle.com/javase/7/docs/api/java/util/logging/{FNAME}.html',
+ 52 => 'http://docs.oracle.com/javase/7/docs/api/java/util/prefs/{FNAME}.html',
+ 53 => 'http://docs.oracle.com/javase/7/docs/api/java/util/regex/{FNAME}.html',
+ 54 => 'http://docs.oracle.com/javase/7/docs/api/java/util/zip/{FNAME}.html',
+ 55 => 'http://docs.oracle.com/javase/7/docs/api/javax/accessibility/{FNAME}.html',
+ 56 => 'http://docs.oracle.com/javase/7/docs/api/javax/activity/{FNAME}.html',
+ 57 => 'http://docs.oracle.com/javase/7/docs/api/javax/crypto/{FNAME}.html',
+ 58 => 'http://docs.oracle.com/javase/7/docs/api/javax/crypto/interfaces/{FNAME}.html',
+ 59 => 'http://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/{FNAME}.html',
+ 60 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/{FNAME}.html',
+ 61 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/event/{FNAME}.html',
+ 62 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/metadata/{FNAME}.html',
+ 63 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/plugins/bmp/{FNAME}.html',
+ 64 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/plugins/jpeg/{FNAME}.html',
+ 65 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/spi/{FNAME}.html',
+ 66 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/stream/{FNAME}.html',
+ 67 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/{FNAME}.html',
+ 68 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/loading/{FNAME}.html',
+ 69 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/modelmbean/{FNAME}.html',
+ 70 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/monitor/{FNAME}.html',
+ 71 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/openmbean/{FNAME}.html',
+ 72 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/relation/{FNAME}.html',
+ 73 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/remote/{FNAME}.html',
+ 74 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/remote/rmi/{FNAME}.html',
+ 75 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/timer/{FNAME}.html',
+ 76 => 'http://docs.oracle.com/javase/7/docs/api/javax/naming/{FNAME}.html',
+ 77 => 'http://docs.oracle.com/javase/7/docs/api/javax/naming/directory/{FNAME}.html',
+ 78 => 'http://docs.oracle.com/javase/7/docs/api/javax/naming/event/{FNAME}.html',
+ 79 => 'http://docs.oracle.com/javase/7/docs/api/javax/naming/ldap/{FNAME}.html',
+ 80 => 'http://docs.oracle.com/javase/7/docs/api/javax/naming/spi/{FNAME}.html',
+ 81 => 'http://docs.oracle.com/javase/7/docs/api/javax/net/{FNAME}.html',
+ 82 => 'http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/{FNAME}.html',
+ 83 => 'http://docs.oracle.com/javase/7/docs/api/javax/print/{FNAME}.html',
+ 84 => 'http://docs.oracle.com/javase/7/docs/api/javax/print/attribute/{FNAME}.html',
+ 85 => 'http://docs.oracle.com/javase/7/docs/api/javax/print/attribute/standard/{FNAME}.html',
+ 86 => 'http://docs.oracle.com/javase/7/docs/api/javax/print/event/{FNAME}.html',
+ 87 => 'http://docs.oracle.com/javase/7/docs/api/javax/rmi/{FNAME}.html',
+ 88 => 'http://docs.oracle.com/javase/7/docs/api/javax/rmi/CORBA/{FNAME}.html',
+ 89 => 'http://docs.oracle.com/javase/7/docs/api/javax/rmi/ssl/{FNAME}.html',
+ 90 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/{FNAME}.html',
+ 91 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/callback/{FNAME}.html',
+ 92 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/kerberos/{FNAME}.html',
+ 93 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/login/{FNAME}.html',
+ 94 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/spi/{FNAME}.html',
+ 95 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/x500/{FNAME}.html',
+ 96 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/sasl/{FNAME}.html',
+ 97 => 'http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/{FNAME}.html',
+ 98 => 'http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/spi/{FNAME}.html',
+ 99 => 'http://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/{FNAME}.html',
+ 100 => 'http://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/spi/{FNAME}.html',
+ 101 => 'http://docs.oracle.com/javase/7/docs/api/javax/sql/{FNAME}.html',
+ 102 => 'http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/{FNAME}.html',
+ 103 => 'http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/serial/{FNAME}.html',
+ 104 => 'http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/spi/{FNAME}.html',
+ 105 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/{FNAME}.html',
+ 106 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/border/{FNAME}.html',
+ 107 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/colorchooser/{FNAME}.html',
+ 108 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/event/{FNAME}.html',
+ 109 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/filechooser/{FNAME}.html',
+ 110 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/{FNAME}.html',
+ 111 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/basic/{FNAME}.html',
+ 112 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/metal/{FNAME}.html',
+ 113 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/multi/{FNAME}.html',
+ 114 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/synth/{FNAME}.html',
+ 115 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/table/{FNAME}.html',
+ 116 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/text/{FNAME}.html',
+ 117 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/text/html/{FNAME}.html',
+ 118 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/text/html/parser/{FNAME}.html',
+ 119 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/text/rtf/{FNAME}.html',
+ 120 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/{FNAME}.html',
+ 121 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/undo/{FNAME}.html',
+ 122 => 'http://docs.oracle.com/javase/7/docs/api/javax/transaction/{FNAME}.html',
+ 123 => 'http://docs.oracle.com/javase/7/docs/api/javax/transaction/xa/{FNAME}.html',
+ 124 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/{FNAME}.html',
+ 125 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/datatype/{FNAME}.html',
+ 126 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/namespace/{FNAME}.html',
+ 127 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/{FNAME}.html',
+ 128 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/{FNAME}.html',
+ 129 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/dom/{FNAME}.html',
+ 130 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/sax/{FNAME}.html',
+ 131 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/stream/{FNAME}.html',
+ 132 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/validation/{FNAME}.html',
+ 133 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/{FNAME}.html',
+ 134 => 'http://docs.oracle.com/javase/7/docs/api/org/ietf/jgss/{FNAME}.html',
+ 135 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/{FNAME}.html',
+ 136 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/DynAnyPackage/{FNAME}.html',
+ 137 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/TypeCodePackage/{FNAME}.html',
+ 138 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/portable/{FNAME}.html',
+ 139 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CosNaming/{FNAME}.html',
+ 140 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CosNaming/NamingContextExtPackage/{FNAME}.html',
+ 141 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CosNaming/NamingContextPackage/{FNAME}.html',
+ 142 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/Dynamic/{FNAME}.html',
+ 143 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/DynamicAny/{FNAME}.html',
+ 144 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/DynamicAny/DynAnyFactoryPackage/{FNAME}.html',
+ 145 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/DynamicAny/DynAnyPackage/{FNAME}.html',
+ 146 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/IOP/{FNAME}.html',
+ 147 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/IOP/CodecFactoryPackage/{FNAME}.html',
+ 148 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/IOP/CodecPackage/{FNAME}.html',
+ 149 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/Messaging/{FNAME}.html',
+ 150 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableInterceptor/{FNAME}.html',
+ 151 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableInterceptor/ORBInitInfoPackage/{FNAME}.html',
+ 152 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableServer/{FNAME}.html',
+ 153 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableServer/CurrentPackage/{FNAME}.html',
+ 154 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableServer/POAManagerPackage/{FNAME}.html',
+ 155 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableServer/POAPackage/{FNAME}.html',
+ 156 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableServer/ServantLocatorPackage/{FNAME}.html',
+ 157 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/SendingContext/{FNAME}.html',
+ 158 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/stub/java/rmi/{FNAME}.html',
+ 159 => 'http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/{FNAME}.html',
+ 160 => 'http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/bootstrap/{FNAME}.html',
+ 161 => 'http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/events/{FNAME}.html',
+ 162 => 'http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/ls/{FNAME}.html',
+ 163 => 'http://docs.oracle.com/javase/7/docs/api/org/xml/sax/{FNAME}.html',
+ 164 => 'http://docs.oracle.com/javase/7/docs/api/org/xml/sax/ext/{FNAME}.html',
+ 165 => 'http://docs.oracle.com/javase/7/docs/api/org/xml/sax/helpers/{FNAME}.html',
/* ambiguous class names (appear in more than one package) */
- 166 => 'http://www.google.com/search?sitesearch=java.sun.com&amp;q=allinurl%3Aj2se%2F1+5+0%2Fdocs%2Fapi+{FNAME}'
+ 166 => 'http://www.google.com/search?sitesearch=docs.oracle.com&amp;q=allinurl%3Ajavase+docs+api+{FNAME}'
),
'OOLANG' => true,
'OBJECT_SPLITTERS' => array(
@@ -1034,4 +1034,4 @@ $language_data = array (
)
);
-?> \ No newline at end of file
+?>
diff --git a/inc/geshi/javascript.php b/inc/geshi/javascript.php
index 429cdd653..b96d1b5b6 100644
--- a/inc/geshi/javascript.php
+++ b/inc/geshi/javascript.php
@@ -4,13 +4,15 @@
* --------------
* Author: Ben Keen (ben.keen@gmail.com)
* Copyright: (c) 2004 Ben Keen (ben.keen@gmail.com), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/20
*
* JavaScript language file for GeSHi.
*
* CHANGES
* -------
+ * 2012/06/27 (1.0.8.11)
+ * - Reordered Keyword Groups to reflect syntactical meaning of keywords
* 2008/05/23 (1.0.7.22)
* - Added description of extra language features (SF#1970248)
* 2004/11/27 (1.0.1)
@@ -45,30 +47,47 @@ $language_data = array (
'LANG_NAME' => 'Javascript',
'COMMENT_SINGLE' => array(1 => '//'),
'COMMENT_MULTI' => array('/*' => '*/'),
- //Regular Expressions
- 'COMMENT_REGEXP' => array(2 => "/(?<=[\\s^])s\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/[gimsu]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])m?\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/[gimsu]*(?=[\\s$\\.\\,\\;\\)])/iU"),
+ 'COMMENT_REGEXP' => array(
+ //Regular Expressions
+ 2 => "/(?<=[\\s^])(s|tr|y)\\/(?!\*)(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])+(?<!\s)\\/(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])*(?<!\s)\\/[msixpogcde]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])(m|q[qrwx]?)?\\/(?!\*)(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])+(?<!\s)\\/[msixpogc]*(?=[\\s$\\.\\,\\;\\)])/iU"
+ ),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array("'", '"'),
'ESCAPE_CHAR' => '\\',
'KEYWORDS' => array(
1 => array(
- 'as', 'break', 'case', 'catch', 'continue', 'decodeURI', 'delete', 'do',
- 'else', 'encodeURI', 'eval', 'finally', 'for', 'if', 'in', 'is', 'item',
- 'instanceof', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'void',
- 'while', 'write', 'with'
+ //reserved/keywords; also some non-reserved keywords
+ 'break','case','catch','const','continue',
+ 'default','delete','do',
+ 'else',
+ 'finally','for','function',
+ 'get','goto',
+ 'if','in','instanceof',
+ 'new',
+ 'prototype',
+ 'return',
+ 'set','static','switch',
+ 'this','throw','try','typeof',
+ 'var','void'
),
2 => array(
- 'class', 'const', 'default', 'debugger', 'export', 'extends', 'false',
- 'function', 'import', 'namespace', 'new', 'null', 'package', 'private',
- 'protected', 'public', 'super', 'true', 'use', 'var'
+ //reserved/non-keywords; metaconstants
+ 'false','null','true','undefined','NaN','Infinity'
),
3 => array(
- // common functions for Window object
- 'alert', 'back', 'blur', 'close', 'confirm', 'focus', 'forward', 'home',
- 'name', 'navigate', 'onblur', 'onerror', 'onfocus', 'onload', 'onmove',
- 'onresize', 'onunload', 'open', 'print', 'prompt', 'scroll', 'status',
- 'stop',
- )
+ //magic properties/functions
+ '__proto__','__defineGetter__','__defineSetter__','hasOwnProperty','hasProperty'
+ ),
+ 4 => array(
+ //type constructors
+ 'Object', 'Function', 'Date', 'Math', 'String', 'Number', 'Boolean', 'Array'
+ ),
+ 5 => array(
+ //reserved, but invalid in language
+ 'abstract','boolean','byte','char','class','debugger','double','enum','export','extends',
+ 'final','float','implements','import','int','interface','long','native',
+ 'short','super','synchronized','throws','transient','volatile'
+ ),
),
'SYMBOLS' => array(
'(', ')', '[', ']', '{', '}',
@@ -79,15 +98,18 @@ $language_data = array (
),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
- 1 => false,
- 2 => false,
- 3 => false
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
),
'STYLES' => array(
'KEYWORDS' => array(
1 => 'color: #000066; font-weight: bold;',
2 => 'color: #003366; font-weight: bold;',
- 3 => 'color: #000066;'
+ 3 => 'color: #000066;',
+ 5 => 'color: #FF0000;'
),
'COMMENTS' => array(
1 => 'color: #006600; font-style: italic;',
@@ -124,8 +146,10 @@ $language_data = array (
'URLS' => array(
1 => '',
2 => '',
- 3 => ''
- ),
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
'OOLANG' => true,
'OBJECT_SPLITTERS' => array(
1 => '.'
@@ -147,4 +171,4 @@ $language_data = array (
)
);
-?>
+?> \ No newline at end of file
diff --git a/inc/geshi/jquery.php b/inc/geshi/jquery.php
index 54e653ed1..a75320d5c 100644
--- a/inc/geshi/jquery.php
+++ b/inc/geshi/jquery.php
@@ -4,7 +4,7 @@
* --------------
* Author: Rob Loach (http://www.robloach.net)
* Copyright: (c) 2009 Rob Loach (http://www.robloach.net)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/07/20
*
* jQuery 1.3 language file for GeSHi.
diff --git a/inc/geshi/kixtart.php b/inc/geshi/kixtart.php
index 62cb54652..5b9091989 100644
--- a/inc/geshi/kixtart.php
+++ b/inc/geshi/kixtart.php
@@ -4,7 +4,7 @@
* --------
* Author: Riley McArdle (riley@glyff.net)
* Copyright: (c) 2007 Riley McArdle (http://www.glyff.net/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/08/31
*
* PHP language file for GeSHi.
diff --git a/inc/geshi/klonec.php b/inc/geshi/klonec.php
index e47e597ef..5f86e78dc 100644
--- a/inc/geshi/klonec.php
+++ b/inc/geshi/klonec.php
@@ -4,7 +4,7 @@
* --------
* Author: AUGER Mickael
* Copyright: Synchronic
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/04/16
*
* KLone with C language file for GeSHi.
diff --git a/inc/geshi/klonecpp.php b/inc/geshi/klonecpp.php
index 1a2d2082b..6564c6b7b 100644
--- a/inc/geshi/klonecpp.php
+++ b/inc/geshi/klonecpp.php
@@ -4,7 +4,7 @@
* --------
* Author: AUGER Mickael
* Copyright: Synchronic
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/04/16
*
* KLone with C++ language file for GeSHi.
diff --git a/inc/geshi/latex.php b/inc/geshi/latex.php
index 1ba3d409e..386a0b989 100644
--- a/inc/geshi/latex.php
+++ b/inc/geshi/latex.php
@@ -4,7 +4,7 @@
* -----
* Author: efi, Matthias Pospiech (matthias@pospiech.eu)
* Copyright: (c) 2006 efi, Matthias Pospiech (matthias@pospiech.eu), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/09/23
*
* LaTeX language file for GeSHi.
@@ -67,7 +67,7 @@ $language_data = array (
'colorbox','date','dedication','def','definecolor','documentclass',
'edef','else','email','emph','eqref','extratitle','fbox','fi',
'flushleft','flushright','footnote','frac','frontmatter',
- 'graphicspath','hfill','hline','hspace','huge','ifx','include',
+ 'graphicspath','hfil','hfill','hfilll','hline','hspace','huge','ifx','include',
'includegraphics','infty','input','int','item','itemsep',
'KOMAoption','KOMAoptions','label','LaTeX','left','let','limits',
'listfiles','listoffigures','listoftables','lowertitleback',
@@ -81,7 +81,7 @@ $language_data = array (
'table','tableofcontents','textbf','textcolor','textit',
'textnormal','textsuperscript','texttt','textwidth','thanks','title',
'titlehead','today','ttfamily','uppertitleback','urlstyle',
- 'usepackage','vspace'
+ 'usepackage','vfil','vfill','vfilll','vspace'
)
),
'SYMBOLS' => array(
@@ -185,7 +185,7 @@ $language_data = array (
8 => "\\\\(?:end|begin)(?=[^a-zA-Z])",
// {parameters}
9 => array(
- GESHI_SEARCH => "(?<=\\{)(?!<\|!REG3XP5!>).*(?=\\})",
+ GESHI_SEARCH => "(?<=\\{)(?!<\|!REG3XP5!>).*?(?=\\})",
GESHI_REPLACE => '\0',
GESHI_MODIFIERS => 'Us',
GESHI_BEFORE => '',
diff --git a/inc/geshi/lb.php b/inc/geshi/lb.php
new file mode 100644
index 000000000..6c2882894
--- /dev/null
+++ b/inc/geshi/lb.php
@@ -0,0 +1,162 @@
+<?php
+/*************************************************************************************
+ * lb.php
+ * --------
+ * Author: Chris Iverson (cj.no.one@gmail.com)
+ * Copyright: (c) 2010 Chris Iverson
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/07/18
+ *
+ * Liberty BASIC language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/22
+ * - First Release
+ *
+ * 2010/08/23
+ * - Added missing default variables
+ *
+ * TODO (updated 2010/07/20)
+ * -------------------------
+ * Prevent highlighting numbers in handle names(constants beginning with #)
+ * Allow number highlighting after a single period(e.g. .9 = 0.9, should be
+ * highlighted
+ * Prevent highlighting keywords within branch labels(within brackets)
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Liberty BASIC',
+ 'COMMENT_SINGLE' => array(1 => '\''),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'and', 'append', 'as', 'beep', 'bmpbutton', 'bmpsave', 'boolean',
+ 'button', 'byref', 'call', 'callback', 'calldll', 'callfn', 'case',
+ 'checkbox', 'close', 'cls', 'colordialog', 'combobox', 'confirm',
+ 'cursor', 'data', 'dialog', 'dim', 'dll', 'do', 'double', 'dump',
+ 'dword', 'else', 'end', 'error', 'exit', 'field', 'filedialog',
+ 'files', 'fontdialog', 'for', 'function', 'get', 'gettrim',
+ 'global', 'gosub', 'goto', 'graphicbox', 'graphics', 'groupbox',
+ 'if', 'input', 'kill', 'let', 'line', 'listbox', 'loadbmp',
+ 'locate', 'long', 'loop', 'lprint', 'mainwin', 'maphandle', 'menu',
+ 'mod', 'name', 'next', 'nomainwin', 'none', 'notice', 'on',
+ 'oncomerror', 'or', 'open', 'out', 'output', 'password', 'playmidi',
+ 'playwave', 'popupmenu', 'print', 'printerdialog', 'prompt', 'ptr',
+ 'put', 'radiobutton', 'random', 'randomize', 'read', 'readjoystick',
+ 'redim', 'rem', 'restore', 'resume', 'return', 'run', 'scan',
+ 'seek', 'select', 'short', 'sort', 'statictext', 'stop', 'stopmidi',
+ 'struct', 'stylebits', 'sub', 'text', 'textbox', 'texteditor',
+ 'then', 'timer', 'titlebar', 'to', 'trace', 'ulong', 'unloadbmp',
+ 'until', 'ushort', 'void', 'wait', 'window', 'wend', 'while',
+ 'word', 'xor'
+ ),
+ 2 => array(
+ 'abs', 'acs', 'asc', 'asn', 'atn', 'chr$', 'cos', 'date$',
+ 'dechex$', 'eof', 'eval', 'eval$', 'exp', 'hbmp', 'hexdec', 'hwnd',
+ 'inp', 'input$', 'inputto$', 'instr', 'int', 'left$', 'len', 'lof',
+ 'log', 'lower$', 'max', 'midipos', 'mid$', 'min', 'mkdir', 'not',
+ 'right$', 'rmdir', 'rnd', 'sin', 'space$', 'sqr', 'str$', 'tab',
+ 'tan', 'time$', 'trim$', 'txcount', 'upper$', 'using', 'val',
+ 'winstring', 'word$'
+ ),
+ 3 => array(
+ 'BackgroundColor$', 'Com', 'ComboboxColor$', 'ComError', 'ComErrorNumber',
+ 'CommandLine$', 'ComPortNumber', 'DefaultDir$',
+ 'DisplayHeight', 'DisplayWidth', 'Drives$', 'Err', 'Err$',
+ 'ForegroundColor$', 'Inkey$', 'Joy1x', 'Joy1y', 'Joy1z',
+ 'Joy1button1', 'Joy1button2', 'Joy2x', 'Joy2y', 'Joy2z',
+ 'Joy2button1', 'Joy2button2', 'ListboxColor$', 'MouseX', 'MouseY', 'Platform$',
+ 'PrintCollate', 'PrintCopies', 'PrinterFont$', 'PrinterName$', 'StartupDir$',
+ 'TextboxColor$', 'TexteditorColor$', 'Version$', 'WindowHeight',
+ 'WindowWidth', 'UpperLeftX', 'UpperLeftY'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '[', ']', '+', '-', '*', '/', '%', '=', '<', '>', ':', ',', '#'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #AD0080;',
+ 3 => 'color: #008080;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 2 => array(
+ //In LB, the second keyword list is a list of built-in functions,
+ //and their names should not be highlighted unless being used
+ //as a function name.
+ 'DISALLOWED_AFTER' => '(?=\s*\()'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/ldif.php b/inc/geshi/ldif.php
new file mode 100644
index 000000000..424818380
--- /dev/null
+++ b/inc/geshi/ldif.php
@@ -0,0 +1,116 @@
+<?php
+/*************************************************************************************
+ * ldif.php
+ * --------
+ * Author: Bruno Harbulot (Bruno.Harbulot@manchester.ac.uk)
+ * Copyright: (c) 2005 deguix, (c) 2010 Bruno Harbulot
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/03/01
+ *
+ * LDIF language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/03/01 (1.0.8.11)
+ * - First Release
+ * - Derived from ini.php (INI language), (c) 2005 deguix
+ *
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'LDIF',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => ''
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #933;'
+ ),
+ 'NUMBERS' => array(
+ 0 => ''
+ ),
+ 'METHODS' => array(
+ 0 => ''
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #000066; font-weight: bold;',
+ 1 => 'color: #FF0000;'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => array(
+ GESHI_SEARCH => '([a-zA-Z0-9_]+):(.+)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ':\\2'
+ ),
+ 1 => array(
+ // Evil hackery to get around GeSHi bug: <>" and ; are added so <span>s can be matched
+ // Explicit match on variable names because if a comment is before the first < of the span
+ // gets chewed up...
+ GESHI_SEARCH => '([<>";a-zA-Z0-9_]+):(.+)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1:',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/lisp.php b/inc/geshi/lisp.php
index a8f50691e..be823a405 100644
--- a/inc/geshi/lisp.php
+++ b/inc/geshi/lisp.php
@@ -4,7 +4,7 @@
* --------
* Author: Roberto Rossi (rsoftware@altervista.org)
* Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/30
*
* Generic Lisp language file for GeSHi.
diff --git a/inc/geshi/llvm.php b/inc/geshi/llvm.php
new file mode 100644
index 000000000..580099b52
--- /dev/null
+++ b/inc/geshi/llvm.php
@@ -0,0 +1,385 @@
+<?php
+/*************************************************************************************
+ * llvm.php
+ * --------
+ * Author: Benny Baumann (BenBE@geshi.org), Azriel Fasten (azriel.fasten@gmail.com)
+ * Copyright: (c) 2010 Benny Baumann (http://qbnz.com/highlighter/), Azriel Fasten (azriel.fasten@gmail.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/10/14
+ *
+ * LLVM language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/10/14 (1.0.8.10)
+ * - First Release
+ *
+ * TODO (updated 2010/10/14)
+ * -------------------------
+ * * Check if all links aren't broken
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'LLVM Intermediate Representation',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'HARDQUOTE' => array("\"", "\""),
+ 'HARDESCAPE' => array("\"", "\\"),
+ 'HARDCHAR' => "\\",
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ // 1 => "#\\\\[nfrtv\$\"\n\\\\]#i",
+ //Hexadecimal Char Specs
+ // 2 => "#\\\\x[\da-fA-F]{1,2}#i",
+ //Octal Char Specs
+ // 3 => "#\\\\[0-7]{1,3}#",
+ //String Parsing of Variable Names
+ // 4 => "#\\$[a-z0-9_]+(?:\\[[a-z0-9_]+\\]|->[a-z0-9_]+)?|(?:\\{\\$|\\$\\{)[a-z0-9_]+(?:\\[('?)[a-z0-9_]*\\1\\]|->[a-z0-9_]+)*\\}#i",
+ //Experimental extension supporting cascaded {${$var}} syntax
+ // 5 => "#\$[a-z0-9_]+(?:\[[a-z0-9_]+\]|->[a-z0-9_]+)?|(?:\{\$|\$\{)[a-z0-9_]+(?:\[('?)[a-z0-9_]*\\1\]|->[a-z0-9_]+)*\}|\{\$(?R)\}#i",
+ //Format String support in ""-Strings
+ // 6 => "#%(?:%|(?:\d+\\\\\\\$)?\\+?(?:\x20|0|'.)?-?(?:\d+|\\*)?(?:\.\d+)?[bcdefFosuxX])#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 0 => array(
+ 'to', 'nuw', 'nsw', 'align', 'inbounds', 'entry', 'return'
+ ),
+ //Terminator Instructions
+ 1 => array(
+ 'ret', 'br', 'switch', 'indirectbr', 'invoke', 'unwind', 'unreachable'
+ ),
+ //Binary Operations
+ 2 => array(
+ 'add', 'fadd', 'sub', 'fsub', 'mul', 'fmul', 'udiv', 'sdiv', 'fdiv', 'urem', 'frem', 'srem'
+ ),
+ //Bitwise Binary Operations
+ 3 => array(
+ 'shl', 'lshr', 'ashr', 'and', 'or', 'xor'
+ ),
+ //Vector Operations
+ 4 => array(
+ 'extractelement', 'insertelement', 'shufflevector'
+ ),
+ //Aggregate Operations
+ 5 => array(
+ 'extractvalue', 'insertvalue'
+ ),
+ //Memory Access and Addressing Operations
+ 6 => array(
+ 'alloca', 'load', 'store', 'getelementptr'
+ ),
+ //Conversion Operations
+ 7 => array(
+ 'trunc', 'zext', 'sext', 'fptrunc', 'fpext', 'fptoui', 'fptosi',
+ 'uitofp', 'sitofp', 'ptrtoint', 'inttoptr', 'bitcast'
+ ),
+ //Other Operations
+ 8 => array(
+ 'icmp', 'fcmp', 'phi', 'select', 'call', 'va_arg'
+ ),
+ //Linkage Types
+ 9 => array(
+ 'private', 'linker_private', 'linker_private_weak', 'linker_private_weak_def_auto',
+ 'internal', 'available_externally', 'linkonce', 'common', 'weak', 'appending',
+ 'extern_weak', 'linkonce_odr', 'weak_odr', 'externally visible', 'dllimport', 'dllexport',
+ ),
+ //Calling Conventions
+ 10 => array(
+ 'ccc', 'fastcc', 'coldcc', 'cc 10'
+ ),
+ //Named Types
+ 11 => array(
+ 'type'
+ ),
+ //Parameter Attributes
+ 12 => array(
+ 'zeroext', 'signext', 'inreg', 'byval', 'sret', 'noalias', 'nocapture', 'nest'
+ ),
+ //Function Attributes
+ 13 => array(
+ 'alignstack', 'alwaysinline', 'inlinehint', 'naked', 'noimplicitfloat', 'noinline', 'noredzone', 'noreturn',
+ 'nounwind', 'optsize', 'readnone', 'readonly', 'ssp', 'sspreq',
+ ),
+ //Module-Level Inline Assembly
+ 14 => array(
+ 'module asm'
+ ),
+ //Data Layout
+ 15 => array(
+ 'target datalayout'
+ ),
+ //Primitive Types
+ 16 => array(
+ 'x86mmx',
+ 'void',
+ 'label',
+ 'metadata',
+ 'opaque'
+ ),
+ //Floating Point Types
+ 17 => array(
+ 'float', 'double', 'fp128', 'x86_fp80', 'ppc_fp128',
+ ),
+ //Simple Constants
+ 18 => array(
+ 'false', 'true', 'null'
+ ),
+ //Global Variable and Function Addresses
+ 19 => array(
+ 'global', 'addrspace', 'constant', 'section'
+ ),
+ //Functions
+ 20 => array(
+ 'declare', 'define'
+ ),
+ //Complex Constants
+ 21 => array(
+ 'zeroinitializer'
+ ),
+ //Undefined Values
+ 22 => array(
+ 'undef'
+ ),
+ //Addresses of Basic Blocks
+ 23 => array(
+ 'blockaddress'
+ ),
+ //Visibility Styles
+ 24 => array(
+ 'default', 'hidden', 'protected'
+ ),
+ 25 => array(
+ 'volatile'
+ ),
+ 26 => array(
+ 'tail'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '(', ')', '[', ']', '{', '}',
+ '!', '@', '%', '&', '|', '/',
+ '<', '>',
+ '=', '-', '+', '*',
+ '.', ':', ',', ';'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true,
+ 10 => true,
+ 11 => true,
+ 12 => true,
+ 13 => true,
+ 14 => true,
+ 15 => true,
+ 16 => true,
+ 17 => true,
+ 18 => true,
+ 19 => true,
+ 20 => true,
+ 21 => true,
+ 22 => true,
+ 23 => true,
+ 24 => true,
+ 25 => true,
+ 26 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 0 => 'color: #209090;',
+ 1 => 'color: #0000F0;',
+ 2 => 'color: #00F000; font-weight: bold;',
+ 3 => 'color: #F00000;',
+ 4 => 'color: #00F0F0; font-weight: bold;',
+ 5 => 'color: #F000F0; font-weight: bold;',
+ 6 => 'color: #403020; font-weight: bold;',
+ 7 => 'color: #909090; font-weight: bold;',
+ 8 => 'color: #009090; font-weight: bold;',
+ 9 => 'color: #900090; font-weight: bold;',
+ 10 => 'color: #909000; font-weight: bold;',
+ 11 => 'color: #000090; font-weight: bold;',
+ 12 => 'color: #900000; font-weight: bold;',
+ 13 => 'color: #009000; font-weight: bold;',
+ 14 => 'color: #F0F090; font-weight: bold;',
+ 15 => 'color: #F090F0; font-weight: bold;',
+ 16 => 'color: #90F0F0; font-weight: bold;',
+ 17 => 'color: #9090F0; font-weight: bold;',
+ 18 => 'color: #90F090; font-weight: bold;',
+ 19 => 'color: #F09090; font-weight: bold;',
+ 20 => 'color: #4040F0; font-weight: bold;',
+ 21 => 'color: #40F040; font-weight: bold;',
+ 22 => 'color: #F04040; font-weight: bold;',
+ 23 => 'color: #F0F040; font-weight: bold;',
+ 24 => 'color: #F040F0; font-weight: bold;',
+ 25 => 'color: #40F0F0; font-weight: bold;',
+ 26 => 'color: #904040; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #006699; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold; font-style: italic;',
+ 6 => 'color: #009933; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;',
+ 'HARD' => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #004000;',
+ 2 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #007088;',
+ 1 => 'color: #007088;',
+ // 2 => 'color: #000088;',
+ 3 => 'color: #700088;',
+ 4 => 'color: #010088;',
+ // 5 => 'color: #610088;',
+ // 6 => 'color: #616088;',
+ // 7 => 'color: #616988;',
+ // 8 => 'color: #616908;',
+ 9 => 'color: #6109F8;',
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ )
+ ),
+ 'URLS' => array(
+ 0 => '',
+ 1 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 2 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 3 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 4 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 5 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 6 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 7 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 8 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 9 => 'http://llvm.org/docs/LangRef.html#linkage_{FNAME}',
+ 10 => 'http://llvm.org/docs/LangRef.html#callingconv',
+ 11 => 'http://llvm.org/docs/LangRef.html#namedtypes',
+ 12 => 'http://llvm.org/docs/LangRef.html#paramattrs',
+ 13 => 'http://llvm.org/docs/LangRef.html#fnattrs',
+ 14 => 'http://llvm.org/docs/LangRef.html#moduleasm',
+ 15 => 'http://llvm.org/docs/LangRef.html#datalayout',
+ 16 => 'http://llvm.org/docs/LangRef.html#t_{FNAME}',
+ 17 => 'http://llvm.org/docs/LangRef.html#t_floating',
+ 18 => 'http://llvm.org/docs/LangRef.html#simpleconstants',
+ 19 => 'http://llvm.org/docs/LangRef.html#globalvars',
+ 20 => 'http://llvm.org/docs/LangRef.html#functionstructure',
+ 21 => 'http://llvm.org/docs/LangRef.html#complexconstants',
+ 22 => 'http://llvm.org/docs/LangRef.html#undefvalues',
+ 23 => 'http://llvm.org/docs/LangRef.html#blockaddress',
+ 24 => 'http://llvm.org/docs/LangRef.html#visibility',
+ 25 => 'http://llvm.org/docs/LangRef.html#volatile',
+ 26 => 'http://llvm.org/docs/LangRef.html#i_call',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Variables
+ 0 => '%[-a-zA-Z$\._][-a-zA-Z$\._0-9]*',
+ //Labels
+ // 1 => '[-a-zA-Z$\._0-9]+:',
+ 1 => '(?<!\w)[\-\w\$\.]+:(?![^">]*<)',
+ //Strings
+ // 2 => '"[^"]+"',
+ //Unnamed variable slots
+ 3 => '%[-]?[0-9]+',
+ //Integer Types
+ 4 => array(
+ GESHI_SEARCH => '(?<!\w)i\d+(?!\w)',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '<a href="http://llvm.org/docs/LangRef.html#t_integer">',
+ GESHI_AFTER => '</a>'
+ ),
+ //Comments
+ // 5 => ';.*',
+ //Integer literals
+ // 6 => '\\b[-]?[0-9]+\\b',
+ //Floating point constants
+ // 7 => '\\b[-+]?[0-9]+\.[0-9]*\([eE][-+]?[0-9]+\)?\\b',
+ //Hex constants
+ // 8 => '\\b0x[0-9A-Fa-f]+\\b',
+ //Global variables
+ 9 => array(
+ GESHI_SEARCH => '@[-a-zA-Z$\._][-a-zA-Z$\._0-9]*',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '<a href="http://llvm.org/docs/LangRef.html#globalvars">',
+ GESHI_AFTER => '</a>'
+ ),
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'SCRIPT_DELIMITERS' => array(),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/locobasic.php b/inc/geshi/locobasic.php
index a3e22a7be..61c8a3c83 100644
--- a/inc/geshi/locobasic.php
+++ b/inc/geshi/locobasic.php
@@ -4,7 +4,7 @@
* -------------
* Author: Nacho Cabanes
* Copyright: (c) 2009 Nacho Cabanes (http://www.nachocabanes.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/03/22
*
* Locomotive Basic (Amstrad CPC series) language file for GeSHi.
diff --git a/inc/geshi/logtalk.php b/inc/geshi/logtalk.php
index fb77bd6d3..05734663e 100644
--- a/inc/geshi/logtalk.php
+++ b/inc/geshi/logtalk.php
@@ -4,14 +4,25 @@
* -----------
*
* Author: Paulo Moura (pmoura@logtalk.org)
- * Copyright: (c) 2009 Paulo Moura (http://logtalk.org/)
- * Release Version: 1.0.8.8
+ * Copyright: (c) 2009-2011 Paulo Moura (http://logtalk.org/)
+ * Release Version: 1.0.8.11
* Date Started: 2009/10/24
*
* Logtalk language file for GeSHi.
*
* CHANGES
* -------
+ * 2011/01/18 (1.1.4)
+ * - Added syntax coloring of ignore/1
+ * 2010/11/28 (1.1.3)
+ * - Added syntax coloring of conforms_to_protocol/2-3
+ * 2010/09/14 (1.1.2)
+ * - Added syntax coloring of coinductive/1
+ * 2010/06/23 (1.1.1)
+ * - Added syntax coloring of e/0 and pi/0
+ * - Added syntax coloring of ground/1, numbervars/3, keysort/2, and sort/2
+ * 2010/05/15 (1.1.0)
+ * - Added syntax coloring of callable/1 and compare/3
* 2009/10/28 (1.0.0)
* - First Release
*
@@ -76,7 +87,7 @@ $language_data = array(
// entity directives
'calls', 'initialization', 'op', 'uses',
// predicate directives
- 'alias', 'discontiguous', 'dynamic', 'mode', 'info', 'meta_predicate', 'multifile', 'synchronized',
+ 'alias', 'coinductive', 'discontiguous', 'dynamic', 'mode', 'info', 'meta_predicate', 'multifile', 'synchronized',
// module directives
'export', 'module', 'reexport', 'use_module'
),
@@ -111,7 +122,7 @@ $language_data = array(
'current_category', 'current_object', 'current_protocol',
'category_property', 'object_property', 'protocol_property',
// entity relations
- 'complements_object',
+ 'complements_object', 'conforms_to_protocol',
'extends_category', 'extends_object', 'extends_protocol',
'implements_protocol', 'imports_category',
'instantiates_class', 'specializes_class',
@@ -125,7 +136,7 @@ $language_data = array(
// database
'abolish', 'asserta', 'assertz', 'clause', 'retract', 'retractall',
// control
- 'call', 'catch', 'once', 'throw',
+ 'call', 'catch', 'ignore', 'once', 'throw',
// all solutions predicates
'bagof', 'findall', 'forall', 'setof',
// multi-threading meta-predicates
@@ -139,9 +150,11 @@ $language_data = array(
'number_chars', 'number_codes',
'char_code',
// term creation and decomposition
- 'arg', 'copy_term', 'functor',
+ 'arg', 'copy_term', 'functor', 'numbervars',
// term testing
- 'atom', 'atomic', 'compound', 'float', 'integer', 'nonvar', 'number', 'sub_atom', 'var',
+ 'atom', 'atomic', 'callable', 'compound', 'float', 'ground', 'integer', 'nonvar', 'number', 'sub_atom', 'var',
+ // term comparison
+ 'compare',
// stream selection and control
'current_input', 'current_output', 'set_input', 'set_output',
'open', 'close', 'flush_output', 'stream_property',
@@ -156,8 +169,10 @@ $language_data = array(
'write', 'writeq', 'write_canonical', 'write_term',
'read', 'read_term',
'char_conversion', 'current_char_conversion',
- //
- 'halt'
+ // hooks
+ 'halt',
+ // sorting
+ 'keysort', 'sort'
),
// Built-in predicates (no arguments)
5 => array(
@@ -180,7 +195,7 @@ $language_data = array(
),
// Evaluable functors (no arguments)
7 => array(
- 'mod', 'rem'
+ 'e', 'pi', 'mod', 'rem'
),
),
'SYMBOLS' => array(
diff --git a/inc/geshi/lolcode.php b/inc/geshi/lolcode.php
index a804913cc..ab6088b18 100644
--- a/inc/geshi/lolcode.php
+++ b/inc/geshi/lolcode.php
@@ -4,7 +4,7 @@
* ----------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/10/31
*
* LOLcode language file for GeSHi.
diff --git a/inc/geshi/lotusformulas.php b/inc/geshi/lotusformulas.php
index 862adbc82..12257d748 100644
--- a/inc/geshi/lotusformulas.php
+++ b/inc/geshi/lotusformulas.php
@@ -4,7 +4,7 @@
* ------------------------
* Author: Richard Civil (info@richardcivil.net)
* Copyright: (c) 2008 Richard Civil (info@richardcivil.net), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/04/12
*
* @Formula/@Command language file for GeSHi.
diff --git a/inc/geshi/lotusscript.php b/inc/geshi/lotusscript.php
index 1ef2f3eee..b8b65f206 100644
--- a/inc/geshi/lotusscript.php
+++ b/inc/geshi/lotusscript.php
@@ -4,7 +4,7 @@
* ------------------------
* Author: Richard Civil (info@richardcivil.net)
* Copyright: (c) 2008 Richard Civil (info@richardcivil.net), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/04/12
*
* LotusScript language file for GeSHi.
diff --git a/inc/geshi/lscript.php b/inc/geshi/lscript.php
index b7e313212..298af618c 100644
--- a/inc/geshi/lscript.php
+++ b/inc/geshi/lscript.php
@@ -4,7 +4,7 @@
* ---------
* Author: Arendedwinter (admin@arendedwinter.com)
* Copyright: (c) 2008 Beau McGuigan (http://www.arendedwinter.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 15/11/2008
*
* Lightwave Script language file for GeSHi.
diff --git a/inc/geshi/lsl2.php b/inc/geshi/lsl2.php
index e5f40969b..f80cf4f29 100644
--- a/inc/geshi/lsl2.php
+++ b/inc/geshi/lsl2.php
@@ -4,7 +4,7 @@
* --------
* Author: William Fry (william.fry@nyu.edu)
* Copyright: (c) 2009 William Fry
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/02/04
*
* Linden Scripting Language (LSL2) language file for GeSHi.
diff --git a/inc/geshi/lua.php b/inc/geshi/lua.php
index abeaa54ea..8a09ba20e 100644
--- a/inc/geshi/lua.php
+++ b/inc/geshi/lua.php
@@ -4,7 +4,7 @@
* -------
* Author: Roberto Rossi (rsoftware@altervista.org)
* Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/07/10
*
* LUA language file for GeSHi.
@@ -46,13 +46,29 @@ $language_data = array (
'LANG_NAME' => 'Lua',
'COMMENT_SINGLE' => array(1 => "--"),
'COMMENT_MULTI' => array('--[[' => ']]'),
+ 'COMMENT_REGEXP' => array(2 => '/\[(=*)\[.*?\]\1\]/s'),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array("'", '"'),
- 'ESCAPE_CHAR' => '\\',
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\abfnrtv\'\"]#i",
+ //Octal Char Specs
+ 2 => "#\\\\\\d{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_NONSCI | GESHI_NUMBER_FLT_NONSCI_F |
+ GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
'KEYWORDS' => array(
1 => array(
- 'and','break','do','else','elseif','end','false','for','function','if',
- 'in','local','nil','not','or','repeat','return','then','true','until','while',
+ 'break','do','else','elseif','end','for','function','if',
+ 'local','repeat','return','then','until','while'
+ ),
+ 2 => array(
+ 'and','in','not','or'
+ ),
+ 3 => array(
'_VERSION','assert','collectgarbage','dofile','error','gcinfo','loadfile','loadstring',
'print','tonumber','tostring','type','unpack',
'_ALERT','_ERRORMESSAGE','_INPUT','_PROMPT','_OUTPUT',
@@ -79,37 +95,57 @@ $language_data = array (
'os.clock','os.date','os.difftime','os.execute','os.exit','os.getenv','os.remove','os.rename',
'os.setlocale','os.time','os.tmpname',
'string','table','math','coroutine','io','os','debug'
+ ),
+ 4 => array(
+ 'nil', 'false', 'true'
+ ),
+ 5 => array(
+ 'Nil', 'Boolean', 'Number', 'String', 'Userdata', 'Thread', 'Table'
)
),
'SYMBOLS' => array(
- '(', ')', '{', '}', '!', '@', '%', '&', '*', '|', '/', '<', '>', '=', ';'
+ '+', '-', '*', '/', '%', '^', '#',
+ '==', '~=', '<=', '>=', '<', '>', '=',
+ '(', ')', '{', '}', '[', ']',
+ ';', ':', ',', '.', '..', '...'
),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
- 1 => true
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
),
'STYLES' => array(
'KEYWORDS' => array(
- 1 => 'color: #b1b100;'
+ 1 => 'color: #aa9900; font-weight: bold;',
+ 2 => 'color: #aa9900; font-weight: bold;',
+ 3 => 'color: #0000aa;',
+ 4 => 'color: #aa9900;',
+ 5 => 'color: #aa9900;'
),
'COMMENTS' => array(
1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #ff0000;',
'MULTI' => 'color: #808080; font-style: italic;'
),
'ESCAPE_CHAR' => array(
- 0 => 'color: #000099; font-weight: bold;'
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #000099; font-weight: bold;'
),
'BRACKETS' => array(
0 => 'color: #66cc66;'
),
'STRINGS' => array(
- 0 => 'color: #ff0000;'
+ 0 => 'color: #ff6666;'
),
'NUMBERS' => array(
0 => 'color: #cc66cc;'
),
'METHODS' => array(
- 0 => 'color: #b1b100;'
+ 0 => 'color: #aa9900;'
),
'SYMBOLS' => array(
0 => 'color: #66cc66;'
@@ -120,7 +156,11 @@ $language_data = array (
)
),
'URLS' => array(
- 1 => ''
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
),
'OOLANG' => false,
'OBJECT_SPLITTERS' => array(
diff --git a/inc/geshi/m68k.php b/inc/geshi/m68k.php
index 543b73c8b..98321577b 100644
--- a/inc/geshi/m68k.php
+++ b/inc/geshi/m68k.php
@@ -4,7 +4,7 @@
* --------
* Author: Benny Baumann (BenBE@omorphia.de)
* Copyright: (c) 2007 Benny Baumann (http://www.omorphia.de/), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/02/06
*
* Motorola 68000 Assembler language file for GeSHi.
diff --git a/inc/geshi/magiksf.php b/inc/geshi/magiksf.php
index f3da7fcf2..612e1603e 100644
--- a/inc/geshi/magiksf.php
+++ b/inc/geshi/magiksf.php
@@ -4,7 +4,7 @@
* --------
* Author: Sjoerd van Leent (svanleent@gmail.com)
* Copyright: (c) 2010 Sjoerd van Leent
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/02/15
*
* MagikSF language file for GeSHi.
diff --git a/inc/geshi/make.php b/inc/geshi/make.php
index 689552312..885fa1765 100644
--- a/inc/geshi/make.php
+++ b/inc/geshi/make.php
@@ -4,7 +4,7 @@
* --------
* Author: Neil Bird <phoenix@fnxweb.com>
* Copyright: (c) 2008 Neil Bird
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/08/26
*
* make language file for GeSHi.
diff --git a/inc/geshi/mapbasic.php b/inc/geshi/mapbasic.php
index 0025d4e22..8859c4831 100644
--- a/inc/geshi/mapbasic.php
+++ b/inc/geshi/mapbasic.php
@@ -4,7 +4,7 @@
* ------
* Author: Tomasz Berus (t.berus@gisodkuchni.pl)
* Copyright: (c) 2009 Tomasz Berus (http://sourceforge.net/projects/mbsyntax/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/11/25
*
* MapBasic language file for GeSHi.
diff --git a/inc/geshi/matlab.php b/inc/geshi/matlab.php
index 1f9c12b78..7cdd50e5e 100644
--- a/inc/geshi/matlab.php
+++ b/inc/geshi/matlab.php
@@ -4,7 +4,7 @@
* -----------
* Author: Florian Knorn (floz@gmx.de)
* Copyright: (c) 2004 Florian Knorn (http://www.florian-knorn.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/02/09
*
* Matlab M-file language file for GeSHi.
diff --git a/inc/geshi/mirc.php b/inc/geshi/mirc.php
index 1b7df83aa..fa2f307ee 100644
--- a/inc/geshi/mirc.php
+++ b/inc/geshi/mirc.php
@@ -4,7 +4,7 @@
* -----
* Author: Alberto 'Birckin' de Areba (Birckin@hotmail.com)
* Copyright: (c) 2006 Alberto de Areba
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/05/29
*
* mIRC Scripting language file for GeSHi.
diff --git a/inc/geshi/mmix.php b/inc/geshi/mmix.php
index 3e90dce29..60b6e28ce 100644
--- a/inc/geshi/mmix.php
+++ b/inc/geshi/mmix.php
@@ -4,7 +4,7 @@
* -------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2009 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/10/16
*
* MMIX Assembler language file for GeSHi.
@@ -41,13 +41,21 @@
$language_data = array (
'LANG_NAME' => 'MMIX',
- 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_SINGLE' => array(1 => ';', 2 => '%'),
'COMMENT_MULTI' => array(),
//Line address prefix suppression
- 'COMMENT_REGEXP' => array(2 => "/^\s*[0-9a-f]{12,16}+(?:\s+[0-9a-f]+(?:\.{3}[0-9a-f]{2,})?)?:/mi"),
+ 'COMMENT_REGEXP' => array(
+ 3 => "/^\s*(?!\s)[^\w].*$/m",
+ 4 => "/^\s*[0-9a-f]{12,16}+(?:\s+[0-9a-f]+(?:\.{3}[0-9a-f]{2,})?)?:/mi"
+ ),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array("'", '"'),
'ESCAPE_CHAR' => '',
+ 'NUMBERS' => array(
+ 1 => '(?<![\d\$#\w])[\da-fA-F]+(?!\w)',
+ 2 => '#[\da-fA-F]+',
+ 3 => '\$\d+'
+ ),
'KEYWORDS' => array(
/*CPU*/
1 => array(
@@ -57,54 +65,61 @@ $language_data = array (
'CSP','CSWAP','CSZ','DIV','DIVU','FADD','FCMP','FCMPE','FDIV',
'FEQL','FEQLE','FINT','FIX','FIXU','FLOT','FLOTU','FMUL','FREM',
'FSQRT','FSUB','FUN','FUNE','GET','GETA','GO','INCH','INCL','INCMH',
- 'INCML','JMP','LDB','LDBU','LDHT','LDO','LDOU','LDSF','LDT','LDTU',
- 'LDUNC','LDVTS','LDW','LDWU','MOR','MUL','MULU','MUX','MXOR','NAND',
- 'NEG','NEGU','NOR','NXOR','ODIF','OR','ORH','ORL','ORMH','ORML',
- 'ORN','PBEV','PBN','PBNN','PBNP','PBNZ','PBOD','PBP','PBZ','POP',
- 'PREGO','PRELD','PREST','PUSHGO','PUSHJ','PUT','RESUME','SADD',
+ 'INCML','JMP','LDA','LDB','LDBU','LDHT','LDO','LDOU','LDSF','LDT',
+ 'LDTU','LDUNC','LDVTS','LDW','LDWU','MOR','MUL','MULU','MUX','MXOR',
+ 'NAND','NEG','NEGU','NOR','NXOR','ODIF','OR','ORH','ORL','ORMH',
+ 'ORML','ORN','PBEV','PBN','PBNN','PBNP','PBNZ','PBOD','PBP','PBZ',
+ 'POP','PREGO','PRELD','PREST','PUSHGO','PUSHJ','PUT','RESUME','SADD',
'SAVE','SETH','SETL','SETMH','SETML','SFLOT','SFLOTU','SL','SLU',
'SR','SRU','STB','STBU','STCO','STHT','STO','STOU','STSF','STT',
'STTU','STUNC','STW','STWU','SUB','SUBU','SWYM','SYNC','SYNCD',
'SYNCID','TDIF','TRAP','TRIP','UNSAVE','WDIF','XOR','ZSEV','ZSN',
'ZSNN','ZSNP','ZSNZ','ZSOD','ZSP','ZSZ'
),
+ 2 => array(
+ 'BSPEC','BYTE','ESPEC','GREG','IS','LOC','LOCAL','OCTA',
+ 'PREFIX','SET','TETRA','WYDE'
+ ),
/*registers*/
3 => array(
'rA','rB','rC','rD','rE','rF','rG','rH','rI','rJ','rK','rL','rM',
'rN','rO','rP','rQ','rR','rS','rT','rU','rV','rW','rX','rY','rZ',
'rBB','rTT','rWW','rXX','rYY','rZZ'
),
- /*Directive*/
- 4 => array(
- ),
- /*Operands*/
- 5 => array(
- )
+// /*Directive*/
+// 4 => array(
+// ),
+// /*Operands*/
+// 5 => array(
+// )
),
'SYMBOLS' => array(
'[', ']', '(', ')',
'+', '-', '*', '/', '%',
- '.', ',', ';', ':'
+ '.', ',', ';', ':',
+ '<<','>>'
),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
1 => true,
2 => false,
3 => true,
- 4 => false,
- 5 => false
+// 4 => false,
+// 5 => false
),
'STYLES' => array(
'KEYWORDS' => array(
1 => 'color: #00007f; font-weight: bold;',
2 => 'color: #0000ff; font-weight: bold;',
3 => 'color: #00007f;',
- 4 => 'color: #000000; font-weight: bold;',
- 5 => 'color: #000000; font-weight: bold;'
+// 4 => 'color: #000000; font-weight: bold;',
+// 5 => 'color: #000000; font-weight: bold;'
),
'COMMENTS' => array(
1 => 'color: #666666; font-style: italic;',
- 2 => 'color: #adadad; font-style: italic;',
+ 2 => 'color: #666666; font-style: italic;',
+ 3 => 'color: #666666; font-style: italic;',
+ 4 => 'color: #adadad; font-style: italic;',
),
'ESCAPE_CHAR' => array(
0 => 'color: #000099; font-weight: bold;'
@@ -116,7 +131,10 @@ $language_data = array (
0 => 'color: #7f007f;'
),
'NUMBERS' => array(
- 0 => 'color: #0000ff;'
+ 0 => 'color: #0000ff;',
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #00007f;'
),
'METHODS' => array(
),
@@ -134,9 +152,10 @@ $language_data = array (
1 => '',
2 => '',
3 => '',
- 4 => '',
- 5 => ''
+// 4 => '',
+// 5 => ''
),
+/*
'NUMBERS' =>
GESHI_NUMBER_BIN_PREFIX_PERCENT |
GESHI_NUMBER_BIN_SUFFIX |
@@ -147,6 +166,7 @@ $language_data = array (
GESHI_NUMBER_FLT_NONSCI |
GESHI_NUMBER_FLT_NONSCI_F |
GESHI_NUMBER_FLT_SCI_ZERO,
+*/
'OOLANG' => false,
'OBJECT_SPLITTERS' => array(
),
diff --git a/inc/geshi/modula2.php b/inc/geshi/modula2.php
index 042e7404a..18508340b 100644
--- a/inc/geshi/modula2.php
+++ b/inc/geshi/modula2.php
@@ -4,7 +4,7 @@
* -----------
* Author: Benjamin Kowarsch (benjamin@modula2.net)
* Copyright: (c) 2009 Benjamin Kowarsch (benjamin@modula2.net)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/11/05
*
* Modula-2 language file for GeSHi.
diff --git a/inc/geshi/modula3.php b/inc/geshi/modula3.php
index ad827a3e6..ae08dcf97 100644
--- a/inc/geshi/modula3.php
+++ b/inc/geshi/modula3.php
@@ -4,7 +4,7 @@
* ----------
* Author: mbishop (mbishop@esoteriq.org)
* Copyright: (c) 2009 mbishop (mbishop@esoteriq.org)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/01/21
*
* Modula-3 language file for GeSHi.
@@ -50,7 +50,7 @@ $language_data = array (
'CONST', 'DIV', 'DO', 'ELSE', 'ELSIF', 'END', 'EVAL', 'EXCEPT', 'EXCEPTION',
'EXIT', 'EXPORTS', 'FINALLY', 'FOR', 'FROM', 'GENERIC', 'IF', 'IMPORT', 'IN',
'INTERFACE', 'LOCK', 'LOOP', 'METHODS', 'MOD', 'MODULE', 'NOT', 'OBJECT', 'OF',
- 'OR', 'OVERRIDE', 'PROCEDURE', 'RAISE', 'RAISES', 'READONLY', 'RECORD', 'REF',
+ 'OR', 'OVERRIDES', 'PROCEDURE', 'RAISE', 'RAISES', 'READONLY', 'RECORD', 'REF',
'REPEAT', 'RETURN', 'REVEAL', 'ROOT', 'SET', 'THEN', 'TO', 'TRY', 'TYPE', 'TYPECASE',
'UNSAFE', 'UNTIL', 'UNTRACED', 'VALUE', 'VAR', 'WHILE', 'WITH'
),
diff --git a/inc/geshi/mpasm.php b/inc/geshi/mpasm.php
index 59247ff69..f724a9414 100644
--- a/inc/geshi/mpasm.php
+++ b/inc/geshi/mpasm.php
@@ -4,7 +4,7 @@
* ---------
* Author: Bakalex (bakalex@gmail.com)
* Copyright: (c) 2004 Bakalex, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/12/6
*
* Microchip Assembler language file for GeSHi.
diff --git a/inc/geshi/mxml.php b/inc/geshi/mxml.php
index df4c9d50e..0cc8287a2 100644
--- a/inc/geshi/mxml.php
+++ b/inc/geshi/mxml.php
@@ -4,7 +4,7 @@
* -------
* Author: David Spurr
* Copyright: (c) 2007 David Spurr (http://www.defusion.org.uk/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/10/04
*
* MXML language file for GeSHi. Based on the XML file by Nigel McNie
diff --git a/inc/geshi/mysql.php b/inc/geshi/mysql.php
index ca171733f..507da2d09 100644
--- a/inc/geshi/mysql.php
+++ b/inc/geshi/mysql.php
@@ -4,7 +4,7 @@
* ---------
* Author: Marjolein Katsma (marjolein.is.back@gmail.com)
* Copyright: (c) 2008 Marjolein Katsma (http://blog.marjoleinkatsma.com/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008-12-12
*
* MySQL language file for GeSHi.
@@ -74,9 +74,9 @@ $language_data = array (
// category, or have multiple usage/meanings
'ACTION','ADD','AFTER','ALGORITHM','ALL','ALTER','ANALYZE','ANY',
'ASC','AS','BDB','BEGIN','BERKELEYDB','BINARY','BTREE','CALL',
- 'CASCADED','CASCADE','CHAIN','CHECK','COLUMNS','COLUMN','COMMENT',
- 'COMMIT','COMMITTED','CONSTRAINT','CONTAINS SQL','CONSISTENT',
- 'CONVERT','CREATE','CROSS','DATA','DATABASES',
+ 'CASCADED','CASCADE','CHAIN','CHANGE','CHECK','COLUMNS','COLUMN',
+ 'COMMENT','COMMIT','COMMITTED','CONSTRAINT','CONTAINS SQL',
+ 'CONSISTENT','CONVERT','CREATE','CROSS','DATA','DATABASES',
'DECLARE','DEFINER','DELAYED','DELETE','DESCRIBE','DESC',
'DETERMINISTIC','DISABLE','DISCARD','DISTINCTROW','DISTINCT','DO',
'DROP','DUMPFILE','DUPLICATE KEY','ENABLE','ENCLOSED BY','ENGINE',
@@ -90,10 +90,10 @@ $language_data = array (
'MASTER_SERVER_ID','MATCH','MERGE','MIDDLEINT','MODIFIES SQL DATA',
'MODIFY','MRG_MYISAM','NATURAL','NEXT','NO SQL','NO','ON',
'OPTIMIZE','OPTIONALLY','OPTION','ORDER BY','OUTER','OUTFILE','OUT',
- 'PARTIAL','PREV','PRIMARY KEY','PRIVILEGES','PROCEDURE','PURGE',
- 'QUICK','READS SQL DATA','READ','REFERENCES','RELEASE','RENAME',
- 'REPEATABLE','REQUIRE','RESTRICT','RETURNS','REVOKE',
- 'ROLLBACK','ROUTINE','RTREE','SAVEPOINT','SELECT',
+ 'PARTIAL','PARTITION','PREV','PRIMARY KEY','PRIVILEGES','PROCEDURE',
+ 'PURGE','QUICK','READS SQL DATA','READ','REFERENCES','RELEASE',
+ 'RENAME','REORGANIZE','REPEATABLE','REQUIRE','RESTRICT','RETURNS',
+ 'REVOKE','ROLLBACK','ROUTINE','RTREE','SAVEPOINT','SELECT',
'SERIALIZABLE','SESSION','SET','SHARE MODE','SHOW','SIMPLE',
'SNAPSHOT','SOME','SONAME','SQL SECURITY','SQL_BIG_RESULT',
'SQL_BUFFER_RESULT','SQL_CACHE','SQL_CALC_FOUND_ROWS',
@@ -391,15 +391,15 @@ $language_data = array (
)
),
'URLS' => array(
- 1 => 'http://search.mysql.com/search?site=refman-%35%31&amp;q={FNAME}',
- 2 => 'http://search.mysql.com/search?site=refman-%35%31&amp;q={FNAME}',
- 3 => 'http://search.mysql.com/search?site=refman-%35%31&amp;q={FNAME}',
- 4 => 'http://search.mysql.com/search?site=refman-%35%31&amp;q={FNAME}',
- 5 => 'http://search.mysql.com/search?site=refman-%35%31&amp;q={FNAME}',
- 6 => 'http://search.mysql.com/search?site=refman-%35%31&amp;q={FNAME}',
- 7 => 'http://search.mysql.com/search?site=refman-%35%31&amp;q={FNAME}',
- 8 => 'http://search.mysql.com/search?site=refman-%35%31&amp;q={FNAME}',
- 9 => 'http://search.mysql.com/search?site=refman-%35%31&amp;q={FNAME}',
+ 1 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 2 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 3 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 4 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 5 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 6 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 7 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 8 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 9 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
10 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/non-typed-operators.html',
11 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/non-typed-operators.html',
diff --git a/inc/geshi/nagios.php b/inc/geshi/nagios.php
new file mode 100644
index 000000000..32cbaef9e
--- /dev/null
+++ b/inc/geshi/nagios.php
@@ -0,0 +1,225 @@
+<?php
+/*************************************************************************************
+ * nagios.php
+ * --------
+ * Author: Albéric de Pertat <alberic@depertat.net>
+ * Copyright: (c) 2012 Albéric de Pertat (https://github.com/adepertat/geshi-nagios)
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/01/19
+ *
+ * Nagios language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/01/19 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2012/01/19)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Nagios',
+ 'COMMENT_SINGLE' => array(1 => ';', 2 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'HARDQUOTE' => array("'", "'"),
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\'',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'define'
+ ),
+ 2 => array(
+ 'command', 'contact', 'contactgroup', 'host', 'hostdependency',
+ 'hostescalation', 'hostextinfo', 'hostgroup', 'service',
+ 'servicedependency', 'serviceescalation',
+ 'serviceextinfo', 'servicegroup', 'timeperiod'
+ ),
+ 3 => array(
+ 'active_checks_enabled', 'passive_checks_enabled', 'alias',
+ 'display_name', 'host_name', 'address', 'hostgroups', 'parents',
+ 'hostgroup_members', 'members', 'service_description',
+ 'servicegroups', 'is_volatile', 'servicegroup_name',
+ 'servicegroup_members', 'contact_name', 'contactgroups', 'email',
+ 'pager', 'can_submit_commands', 'contactgroup_name',
+ 'contactgroup_members', 'host_notifications_enabled',
+ 'service_notifications_enabled', 'host_notification_period',
+ 'service_notification_period', 'host_notification_options',
+ 'service_notification_options', 'host_notification_commands',
+ 'service_notification_commands', 'check_command',
+ 'check_freshness', 'check_interval', 'check_period', 'contacts',
+ 'contact_groups', 'event_handler', 'event_handler_enabled',
+ 'flap_detection_enabled', 'flap_detection_options',
+ 'freshness_threshold', 'initial_state', 'low_flap_threshold',
+ 'high_flap_threshold', 'max_check_attempts',
+ 'notification_interval', 'first_notification_delay',
+ 'notification_period', 'notification_options',
+ 'notifications_enabled', 'stalking_options', 'notes', 'notes_url',
+ 'action_url', 'icon_image', 'icon_image_alt', 'vrml_image',
+ 'statusmap_image', '2d_coords', '3d_coords', 'obsess_over_host',
+ 'obsess_over_hostver_service', 'process_perf_data',
+ 'retain_status_information', 'retain_nonstatus_information',
+ 'retry_interval', 'register', 'use', 'name', 'timeperiod_name',
+ 'exclude', 'command_name', 'command_line', 'dependent_host_name',
+ 'dependent_hostgroup_name', 'dependent_service_description',
+ 'inherits_parent', 'execution_failure_criteria',
+ 'notification_failure_criteria', 'dependency_period',
+ 'first_notification', 'last_notification', 'escalation_period',
+ 'escalation_options'
+ ),
+ 4 => array(
+ 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday',
+ 'sunday', 'january', 'february', 'march', 'april', 'may', 'june',
+ 'july', 'august', 'september', 'october', 'november', 'december',
+ 'day'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '{', '}', ',', '+'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'font-weight:bold;color:#FFDCA8;',
+ 2 => 'font-weight:bold;color #FFA858;',
+ 3 => 'font-weight:bold;color:#00C0C0;',
+ 4 => 'font-weight:bold;color:#C0C0FF;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'font-weight:bold;color:#000000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => ''
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #AAAAAA; font-style: italic;',
+ 1 => 'color: #AAAAAA; font-style: italic;',
+ 2 => 'color: #AAAAAA; font-style: italic;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #660066;',
+ 'HARD' => 'color: #660066;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'font-weight:bold;color:#808080;',
+ 1 => 'font-weight:bold;color:#000080;',
+ 2 => 'font-weight:bold;color:red;',
+ 3 => 'font-weight:bold;color:#808000;',
+ 4 => 'font-weight:bold;color:blue;',
+ 5 => 'font-weight:bold;color:#C0FFC0;',
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ )
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '\\'
+ ),
+ 'REGEXPS' => array(
+ // Custom macros
+ 0 => array(
+ GESHI_SEARCH => '(\$[a-zA-Z_]+\$)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ // Custom macro definitions
+ 1 => array(
+ GESHI_SEARCH => '(\A|\s)(_[a-zA-Z_]+)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '',
+ ),
+ // $USERxx$
+ 2 => array(
+ GESHI_SEARCH => '(\$USER[0-9]+\$)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ // $ARGxx$
+ 3 => array(
+ GESHI_SEARCH => '(\$ARG[1-9]\$)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ // register 0
+ 4 => array(
+ GESHI_SEARCH => '(\bregister[\\x20\\t]+[01])',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ // use
+ 5 => array(
+ GESHI_SEARCH => '(use[\\x20\\t]+[^\\x20\\t]+)([\\x20\\t]*[$;#])',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '',
+ ),
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => false
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
+);
+
+?>
diff --git a/inc/geshi/netrexx.php b/inc/geshi/netrexx.php
new file mode 100644
index 000000000..14a2d23fd
--- /dev/null
+++ b/inc/geshi/netrexx.php
@@ -0,0 +1,163 @@
+<?php
+/*************************************************************************************
+ * netrexx.php
+ * ---------------------------------
+ * Author: Jon Wolfers (sahananda@windhorse.biz)
+ * Contributors:
+ * - Walter Pachl (pachl@chello.at)
+ * Copyright: (c) 2008 Jon Wolfers, (c) 2012 Walter Pachl
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/01/07
+ *
+ * NetRexx language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/07/29 (1.0.0)
+ * - tried to get it syntactically right
+ *
+ * TODO (updated 2012/07/29)
+ * -------------------------
+ * - Get it working on rosettacode.org
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'NetRexx',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'class', 'do', 'exit', 'if', 'import', 'iterate', 'leave',
+ 'loop', 'nop', 'numeric', 'package', 'parse', 'properties',
+ 'return', 'say', 'select', 'signal', 'trace'
+ ),
+ 2 => array(
+ 'abstract', 'adapter', 'all', 'ask', 'binary', 'case',
+ 'constant', 'dependent', 'deprecated', 'extends', 'final',
+ 'implements', 'inheritable', 'interface', 'label', 'methods',
+ 'native', 'off', 'private', 'protect', 'public', 'results',
+ 'returns', 'shared', 'signals', 'source', 'static',
+ 'transient', 'unused', 'uses', 'version', 'volatile'
+ ),
+ 3 => array(
+ 'catch', 'else', 'end', 'finally', 'otherwise', 'then', 'when'
+ ),
+ 4 => array(
+ 'rc', 'result', 'self', 'sigl', 'super'
+ ),
+ 5 => array(
+ 'placeholderforoorexxdirectives'
+ ),
+ 6 => array(
+ 'abbrev', 'abs', 'b2x', 'c2d', 'c2x', 'center', 'centre',
+ 'changestr', 'compare', 'copies', 'copyindexed', 'countstr',
+ 'd2c', 'd2x', 'datatype', 'delstr', 'delword', 'exists',
+ 'formword', 'hashcode', 'insert', 'lastpos', 'left', 'lower',
+ 'max', 'min', 'noteq', 'noteqs', 'opadd', 'opand', 'opcc',
+ 'opccblank', 'opdiv', 'opdivi', 'opeq', 'opeqs', 'opgt',
+ 'opgteq', 'opgteqs', 'opgts', 'oplt', 'oplteq', 'oplteqs',
+ 'oplts', 'opminus', 'opmult', 'opnot', 'opor', 'opplus',
+ 'oppow', 'oprem', 'opsub', 'opxor', 'overlay', 'pos position',
+ 'reverse', 'right', 'sequence', 'setdigits', 'setform',
+ 'sign', 'space', 'strip', 'substr', 'subword', 'toboolean',
+ 'tobyte', 'tochar', 'todouble', 'tofloat', 'toint', 'tolong',
+ 'toshort', 'tostring', 'translate', 'trunc', 'upper',
+ 'verify', 'word', 'wordindex', 'wordlength', 'wordpos',
+ 'words', 'x2b', 'x2c', 'x2d'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '<', '>', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':',
+ '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #ff0000; font-weight: bold;',
+ 3 => 'color: #00ff00; font-weight: bold;',
+ 4 => 'color: #0000ff; font-weight: bold;',
+ 5 => 'color: #880088; font-weight: bold;',
+ 6 => 'color: #888800; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 'MULTI' => 'color: #808080;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/inc/geshi/newlisp.php b/inc/geshi/newlisp.php
index 027e86588..0dc6c1619 100644
--- a/inc/geshi/newlisp.php
+++ b/inc/geshi/newlisp.php
@@ -4,7 +4,7 @@
* ----------
* Author: cormullion (cormullion@mac.com) Sept 2009
* Copyright: (c) 2009 Cormullion (http://unbalanced-parentheses.nfshost.com/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/09/30
*
* newLISP language file for GeSHi.
diff --git a/inc/geshi/nsis.php b/inc/geshi/nsis.php
index 5631a8389..35df9b4b8 100644
--- a/inc/geshi/nsis.php
+++ b/inc/geshi/nsis.php
@@ -4,7 +4,7 @@
* --------
* Author: deguix (cevo_deguix@yahoo.com.br), Tux (http://tux.a4.cz/)
* Copyright: (c) 2005 deguix, 2004 Tux (http://tux.a4.cz/), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/12/03
*
* Nullsoft Scriptable Install System language file for GeSHi.
diff --git a/inc/geshi/oberon2.php b/inc/geshi/oberon2.php
index 8339f3fb8..b43f81408 100644
--- a/inc/geshi/oberon2.php
+++ b/inc/geshi/oberon2.php
@@ -4,7 +4,7 @@
* ----------
* Author: mbishop (mbishop@esoteriq.org)
* Copyright: (c) 2009 mbishop (mbishop@esoteriq.org)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/02/10
*
* Oberon-2 language file for GeSHi.
diff --git a/inc/geshi/objc.php b/inc/geshi/objc.php
index 5a5c5940f..2f5162d76 100644
--- a/inc/geshi/objc.php
+++ b/inc/geshi/objc.php
@@ -5,7 +5,7 @@
* Author: M. Uli Kusterer (witness.of.teachtext@gmx.net)
* Contributors: Quinn Taylor (quinntaylor@mac.com)
* Copyright: (c) 2008 Quinn Taylor, 2004 M. Uli Kusterer, Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/04
*
* Objective-C language file for GeSHi.
diff --git a/inc/geshi/objeck.php b/inc/geshi/objeck.php
new file mode 100644
index 000000000..bf9dab564
--- /dev/null
+++ b/inc/geshi/objeck.php
@@ -0,0 +1,116 @@
+<?php
+/*************************************************************************************
+ * objeck.php
+ * --------
+ * Author: Randy Hollines (objeck@gmail.com)
+ * Copyright: (c) 2010 Randy Hollines (http://code.google.com/p/objeck-lang/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/07/01
+ *
+ * Objeck Programming Language language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/26 (1.0.8.10)
+ * - Added new and missing keywords and symbols: 'String', 'each', '+=', '-=', '*=' and '/='.
+ * 2010/07/01 (1.0.8.9)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Objeck Programming Language',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array('#~' => '~#'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'virtual', 'if', 'else', 'do', 'while', 'use', 'bundle', 'native',
+ 'static', 'public', 'private', 'class', 'function', 'method',
+ 'select', 'other', 'enum', 'for', 'each', 'label', 'return', 'from'
+ ),
+ 2 => array(
+ 'Byte', 'Int', 'Nil', 'Float', 'Char', 'Bool', 'String'
+ ),
+ 3 => array(
+ 'true', 'false'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', '+', '-', '*', '/', '%', '=', '<', '>', '&', '|', ':', ';', ',', '+=', '-=', '*=', '/=',
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #b1b100;',
+ 3 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '-&gt;'
+ ),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/ocaml-brief.php b/inc/geshi/ocaml-brief.php
index 2e2a82fb2..b518adf87 100644
--- a/inc/geshi/ocaml-brief.php
+++ b/inc/geshi/ocaml-brief.php
@@ -4,7 +4,7 @@
* ----------
* Author: Flaie (fireflaie@gmail.com)
* Copyright: (c) 2005 Flaie, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/08/27
*
* OCaml (Objective Caml) language file for GeSHi.
diff --git a/inc/geshi/ocaml.php b/inc/geshi/ocaml.php
index 46e6a22aa..ac6c29bcc 100644
--- a/inc/geshi/ocaml.php
+++ b/inc/geshi/ocaml.php
@@ -4,7 +4,7 @@
* ----------
* Author: Flaie (fireflaie@gmail.com)
* Copyright: (c) 2005 Flaie, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/08/27
*
* OCaml (Objective Caml) language file for GeSHi.
diff --git a/inc/geshi/octave.php b/inc/geshi/octave.php
new file mode 100644
index 000000000..ccffcd97a
--- /dev/null
+++ b/inc/geshi/octave.php
@@ -0,0 +1,515 @@
+<?php
+/*************************************************************************************
+ * octave.php
+ * -----------
+ * Author: Carnë Draug (carandraug+dev@gmail.com)
+ * Juan Pablo Carbajal (carbajal@ifi.uzh.ch)
+ * Copyright: (c) 2012 Carnë Draug
+ * (c) 2012 Juan Pablo Carbajal
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/05/22
+ *
+ * GNU Octave M-file language file for GeSHi.
+ *
+ * This file was heavily based on octave.lang from gtksourceview. If bugs are
+ * found and/or fixed on this file, please send them to the gtksourceview
+ * project or e-mail them to this file authors. Thanks in advance
+ *
+ * CHANGES
+ * -------
+ * 2012/05/22 (1.0.8.11)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'GNU Octave',
+ 'COMMENT_SINGLE' => array(1 => '#', 2 => '%'),
+ // we can't use COMMENT_MULTI since start and end of block comments need to
+ // be alone on the line (optionally, with whitespace). See COMMENT_REGEXP
+ 'COMMENT_MULTI' => array(),
+ // we can't use QUOTEMARKS, not even HARDQUOTE, see COMMENT_REGEXP
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'COMMENT_REGEXP' => array(
+ // Single quote strings: we can't use QUOTEMARKS here since new
+ // lines will break the string. Plus, single quote strings do not even
+ // allow for continuation markers, only double quote strings allow it.
+ // Also, to do not misdetect the transpose operator ' as the start of a
+ // string we assert to not follow a variable name (letters, digits and
+ // underscores) or a closing bracket (round, square or curly) or a dot
+ // (to form the array transpose operator ".'" ).
+ 3 => "/(?<![0-9a-zA-Z_\)\]}\.])'.*?'/",
+ // Double quote strings: we also can't use QUOTEMARKS here (see single
+ // line quotes). However, with double quote strings both \ and ... can
+ // be used to make multiline strings. Continuation markers can be
+ // followed by whitespace
+ 4 => '/"(.|(\.\.\.|\\\)(\s)*?\n)*?(?<!\\\)"/',
+ // Block comments: the ms modifiers treat strings as multiple lines (to
+ // be able to use ^ and $ instead of newline and thus support block
+ // comments on the first and last line of source) and make . also match
+ // a newline
+ 5 => "/^\s*?[%#]{\s*?$.*?^\s*?[%#]}\s*?$/ms",
+ // Packaging system: comes here so that pkg can also be used in the
+ // function form. The list of pkg commands is optional to the match so
+ // that at least pkg is highlighted if new commands are implemented
+ 6 => "/\bpkg(?!\s*\()\s+((un)?install|update|(un)?load|list|(global|local)_list|describe|prefix|(re)?build)?\b/",
+ // Function handles
+ 7 => "/@([a-z_][a-z1-9_]*)?/i",
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_OCT_PREFIX |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'KEYWORDS' => array(
+ // Data types
+ 1 => array(
+ 'cell', 'char', 'double', 'uint8', 'uint16', 'uint32', 'uint64',
+ 'int8','int16', 'int32', 'int64', 'logical', 'single', 'struct'
+ ),
+ // Storage type
+ 2 => array(
+ 'global', 'persistent', 'static'
+ ),
+ // Internal variable
+ 3 => array(
+ 'ans'
+ ),
+ // Reserved words
+ 4 => array(
+ 'break', 'case', 'catch', 'continue', 'do', 'else', 'elseif', 'end',
+ 'end_try_catch', 'end_unwind_protect', 'endfor', 'endfunction',
+ 'endif', 'endparfor', 'endswitch', 'endwhile', 'for', 'function',
+ 'if', 'otherwise', 'parfor', 'return',
+ 'switch', 'try', 'until', 'unwind_protect',
+ 'unwind_protect_cleanup', 'varargin', 'varargout', 'while'
+ ),
+ // Built in
+ 5 => array(
+ 'P_tmpdir', 'abs', 'acos', 'acosh',
+ 'add_input_event_hook', 'addlistener', 'addpath', 'addproperty',
+ 'all', 'allow_noninteger_range_as_index', 'and', 'angle', 'any',
+ 'arg', 'argnames', 'argv', 'asin', 'asinh', 'assignin', 'atan',
+ 'atan2', 'atanh', 'atexit', 'autoload', 'available_graphics_toolkits',
+ 'beep_on_error', 'bitand', 'bitmax', 'bitor', 'bitshift', 'bitxor',
+ 'builtin', 'canonicalize_file_name', 'cat', 'cbrt', 'cd', 'ceil',
+ 'cell2struct', 'cellstr', 'chdir', 'class', 'clc',
+ 'clear', 'columns', 'command_line_path', 'completion_append_char',
+ 'completion_matches', 'complex', 'confirm_recursive_rmdir', 'conj',
+ 'cos', 'cosh', 'cputime', 'crash_dumps_octave_core', 'ctranspose',
+ 'cumprod', 'cumsum', 'dbclear', 'dbcont', 'dbdown', 'dbnext',
+ 'dbquit', 'dbstack', 'dbstatus', 'dbstep', 'dbstop', 'dbtype', 'dbup',
+ 'dbwhere', 'debug_on_error', 'debug_on_interrupt', 'debug_on_warning',
+ 'default_save_options', 'dellistener', 'diag', 'diary', 'diff',
+ 'disp', 'do_braindead_shortcircuit_evaluation', 'do_string_escapes',
+ 'doc_cache_file', 'drawnow', 'dup2', 'echo',
+ 'echo_executing_commands', 'edit_history','eq', 'erf', 'erfc',
+ 'erfcx', 'erfinv', 'errno', 'errno_list', 'error', 'eval', 'evalin',
+ 'exec', 'exist', 'exit', 'exp', 'expm1', 'eye', 'fclear',
+ 'fclose', 'fcntl', 'fdisp', 'feof', 'ferror', 'feval', 'fflush',
+ 'fgetl', 'fgets', 'fieldnames', 'file_in_loadpath', 'file_in_path',
+ 'filemarker', 'filesep', 'find_dir_in_path', 'finite', 'fix',
+ 'fixed_point_format', 'floor', 'fmod', 'fnmatch', 'fopen', 'fork',
+ 'format', 'formula', 'fprintf', 'fputs', 'fread', 'freport',
+ 'frewind', 'fscanf', 'fseek', 'fskipl', 'ftell', 'full', 'func2str',
+ 'functions', 'fwrite', 'gamma', 'gammaln', 'ge', 'genpath', 'get',
+ 'get_help_text', 'get_help_text_from_file', 'getegid', 'getenv',
+ 'geteuid', 'getgid', 'gethostname', 'getpgrp', 'getpid', 'getppid',
+ 'getuid', 'glob', 'gt', 'history', 'history_control', 'history_file',
+ 'history_size', 'history_timestamp_format_string', 'home', 'horzcat',
+ 'hypot', 'ifelse', 'ignore_function_time_stamp', 'imag',
+ 'inferiorto', 'info_file', 'info_program', 'inline', 'input',
+ 'intmax', 'intmin', 'ipermute',
+ 'is_absolute_filename', 'is_dq_string', 'is_function_handle',
+ 'is_rooted_relative_filename', 'is_sq_string', 'isalnum', 'isalpha',
+ 'isargout', 'isascii', 'isbool', 'iscell', 'iscellstr', 'ischar',
+ 'iscntrl', 'iscomplex', 'isdebugmode', 'isdigit', 'isempty',
+ 'isfield', 'isfinite', 'isfloat', 'isglobal', 'isgraph', 'ishandle',
+ 'isieee', 'isindex', 'isinf', 'isinteger', 'iskeyword', 'islogical',
+ 'islower', 'ismatrix', 'ismethod', 'isna', 'isnan', 'isnull',
+ 'isnumeric', 'isobject', 'isprint', 'ispunct', 'isreal', 'issorted',
+ 'isspace', 'issparse', 'isstruct', 'isupper', 'isvarname', 'isxdigit',
+ 'kbhit', 'keyboard', 'kill', 'lasterr', 'lasterror', 'lastwarn',
+ 'ldivide', 'le', 'length', 'lgamma', 'link', 'linspace',
+ 'list_in_columns', 'load', 'loaded_graphics_toolkits', 'log', 'log10',
+ 'log1p', 'log2', 'lower', 'lstat', 'lt',
+ 'make_absolute_filename', 'makeinfo_program', 'max_recursion_depth',
+ 'merge', 'methods', 'mfilename', 'minus', 'mislocked',
+ 'missing_function_hook', 'mkdir', 'mkfifo', 'mkstemp', 'mldivide',
+ 'mlock', 'mod', 'more', 'mpower', 'mrdivide', 'mtimes', 'munlock',
+ 'nargin', 'nargout', 'native_float_format', 'ndims', 'ne',
+ 'nfields', 'nnz', 'norm', 'not', 'nth_element', 'numel', 'nzmax',
+ 'octave_config_info', 'octave_core_file_limit',
+ 'octave_core_file_name', 'octave_core_file_options',
+ 'octave_tmp_file_name', 'onCleanup', 'ones',
+ 'optimize_subsasgn_calls', 'or', 'output_max_field_width',
+ 'output_precision', 'page_output_immediately', 'page_screen_output',
+ 'path', 'pathsep', 'pause', 'pclose', 'permute', 'pipe', 'plus',
+ 'popen', 'popen2', 'power', 'print_empty_dimensions',
+ 'print_struct_array_contents', 'printf', 'prod',
+ 'program_invocation_name', 'program_name', 'putenv', 'puts', 'pwd',
+ 'quit', 'rats', 'rdivide', 're_read_readline_init_file',
+ 'read_readline_init_file', 'readdir', 'readlink', 'real', 'realmax',
+ 'realmin', 'register_graphics_toolkit', 'rehash', 'rem',
+ 'remove_input_event_hook', 'rename', 'repelems', 'reset', 'reshape',
+ 'resize', 'restoredefaultpath', 'rethrow', 'rmdir', 'rmfield',
+ 'rmpath', 'round', 'roundb', 'rows', 'run_history', 'save',
+ 'save_header_format_string', 'save_precision', 'saving_history',
+ 'scanf', 'set', 'setenv', 'sighup_dumps_octave_core', 'sign',
+ 'sigterm_dumps_octave_core', 'silent_functions', 'sin',
+ 'sinh', 'size', 'size_equal', 'sizemax', 'sizeof', 'sleep', 'sort',
+ 'source', 'spalloc', 'sparse', 'sparse_auto_mutate',
+ 'split_long_rows', 'sprintf', 'sqrt', 'squeeze', 'sscanf', 'stat',
+ 'stderr', 'stdin', 'stdout', 'str2func', 'strcmp', 'strcmpi',
+ 'string_fill_char', 'strncmp', 'strncmpi', 'struct2cell',
+ 'struct_levels_to_print', 'strvcat', 'subsasgn', 'subsref', 'sum',
+ 'sumsq', 'superiorto', 'suppress_verbose_help_message', 'symlink',
+ 'system', 'tan', 'tanh', 'terminal_size', 'tic', 'tilde_expand',
+ 'times', 'tmpfile', 'tmpnam', 'toascii', 'toc', 'tolower', 'toupper',
+ 'transpose', 'typeinfo',
+ 'umask', 'uminus', 'uname', 'undo_string_escapes', 'unlink',
+ 'uplus', 'upper', 'usage', 'usleep', 'vec', 'vectorize', 'vertcat',
+ 'waitfor', 'waitpid', 'warning', 'warranty', 'who', 'whos',
+ 'whos_line_format', 'yes_or_no', 'zeros'
+ ),
+ // Octave functions
+ 6 => array(
+ 'accumarray', 'accumdim', 'acosd', 'acot', 'acotd', 'acoth', 'acsc',
+ 'acscd', 'acsch', 'addpref', 'addtodate', 'allchild', 'amd',
+ 'ancestor', 'anova', 'arch_fit', 'arch_rnd', 'arch_test',
+ 'area', 'arma_rnd', 'asctime', 'asec', 'asecd', 'asech', 'asind',
+ 'assert', 'atand', 'autoreg_matrix', 'autumn',
+ 'axes', 'axis', 'balance', 'bar', 'barh', 'bartlett', 'bartlett_test',
+ 'base2dec', 'beep', 'bessel', 'besselj', 'beta', 'betacdf',
+ 'betainc', 'betainv', 'betaln', 'betapdf', 'betarnd', 'bicg',
+ 'bicgstab', 'bicubic', 'bin2dec', 'bincoeff', 'binocdf', 'binoinv',
+ 'binopdf', 'binornd', 'bitcmp', 'bitget', 'bitset', 'blackman',
+ 'blanks', 'blkdiag', 'bone', 'box', 'brighten', 'bsxfun',
+ 'bug_report', 'bunzip2', 'bzip2', 'calendar', 'cart2pol', 'cart2sph',
+ 'cast', 'cauchy_cdf', 'cauchy_inv', 'cauchy_pdf', 'cauchy_rnd',
+ 'caxis', 'ccolamd', 'cell2mat', 'celldisp', 'cellfun',
+ 'center', 'cgs', 'chi2cdf', 'chi2inv', 'chi2pdf', 'chi2rnd',
+ 'chisquare_test_homogeneity', 'chisquare_test_independence', 'chol',
+ 'chop', 'circshift', 'cla', 'clabel', 'clf', 'clock',
+ 'cloglog', 'close', 'closereq', 'colamd', 'colloc', 'colon',
+ 'colorbar', 'colormap', 'colperm', 'colstyle', 'comet', 'comet3',
+ 'comma', 'common_size', 'commutation_matrix', 'compan',
+ 'compare_versions', 'compass', 'computer', 'cond', 'condest',
+ 'contour', 'contour3', 'contourc', 'contourf', 'contrast', 'conv',
+ 'conv2', 'convhull', 'convhulln', 'cool', 'copper', 'copyfile',
+ 'cor_test', 'corr', 'cosd', 'cot', 'cotd', 'coth', 'cov',
+ 'cplxpair', 'cross', 'csc', 'cscd', 'csch', 'cstrcat',
+ 'csvread', 'csvwrite', 'ctime', 'cumtrapz', 'curl', 'cylinder',
+ 'daspect', 'daspk', 'dasrt', 'dassl', 'date', 'datenum', 'datestr',
+ 'datetick', 'datevec', 'dblquad', 'deal', 'deblank', 'debug',
+ 'dec2base', 'dec2bin', 'dec2hex', 'deconv', 'del2', 'delaunay',
+ 'delaunay3', 'delaunayn', 'delete', 'demo', 'det', 'detrend',
+ 'diffpara', 'diffuse', 'dir', 'discrete_cdf', 'discrete_inv',
+ 'discrete_pdf', 'discrete_rnd', 'display', 'divergence',
+ 'dlmread', 'dlmwrite', 'dmperm', 'doc', 'dos', 'dot', 'dsearch',
+ 'dsearchn', 'dump_prefs', 'duplication_matrix', 'durbinlevinson',
+ 'edit', 'eig', 'eigs', 'ellipsoid', 'empirical_cdf', 'empirical_inv',
+ 'empirical_pdf', 'empirical_rnd', 'eomday', 'errorbar',
+ 'etime', 'etreeplot', 'example', 'expcdf', 'expinv', 'expm', 'exppdf',
+ 'exprnd', 'ezcontour', 'ezcontourf', 'ezmesh', 'ezmeshc', 'ezplot',
+ 'ezplot3', 'ezpolar', 'ezsurf', 'ezsurfc', 'f_test_regression',
+ 'fact', 'factor', 'factorial', 'fail', 'fcdf', 'feather', 'fft',
+ 'fft2', 'fftconv', 'fftfilt', 'fftn', 'fftshift', 'fftw', 'figure',
+ 'fileattrib', 'fileparts', 'fileread', 'fill', 'filter', 'filter2',
+ 'find', 'findall', 'findobj', 'findstr', 'finv', 'flag', 'flipdim',
+ 'fliplr', 'flipud', 'fminbnd', 'fminunc', 'fpdf', 'fplot',
+ 'fractdiff', 'freqz', 'freqz_plot', 'frnd', 'fsolve',
+ 'fullfile', 'fzero', 'gamcdf', 'gaminv', 'gammainc',
+ 'gampdf', 'gamrnd', 'gca', 'gcbf', 'gcbo', 'gcd', 'gcf',
+ 'gen_doc_cache', 'genvarname', 'geocdf', 'geoinv', 'geopdf', 'geornd',
+ 'get_first_help_sentence', 'getappdata', 'getfield', 'getgrent',
+ 'getpref', 'getpwent', 'getrusage', 'ginput', 'givens', 'glpk',
+ 'gls', 'gmap40', 'gmres', 'gnuplot_binary', 'gplot',
+ 'gradient', 'graphics_toolkit', 'gray', 'gray2ind', 'grid',
+ 'griddata', 'griddata3', 'griddatan', 'gtext', 'guidata',
+ 'guihandles', 'gunzip', 'gzip', 'hadamard', 'hamming', 'hankel',
+ 'hanning', 'help', 'hess', 'hex2dec', 'hex2num', 'hggroup', 'hidden',
+ 'hilb', 'hist', 'histc', 'hold', 'hot', 'hotelling_test',
+ 'hotelling_test_2', 'housh', 'hsv', 'hsv2rgb', 'hurst', 'hygecdf',
+ 'hygeinv', 'hygepdf', 'hygernd', 'idivide', 'ifftshift', 'image',
+ 'imagesc', 'imfinfo', 'imread', 'imshow', 'imwrite', 'ind2gray',
+ 'ind2rgb', 'index', 'info', 'inpolygon', 'inputname', 'int2str',
+ 'interp1', 'interp1q', 'interp2', 'interp3', 'interpft', 'interpn',
+ 'intersect', 'inv', 'invhilb', 'iqr',
+ 'is_leap_year', 'is_valid_file_id',
+ 'isa', 'isappdata', 'iscolumn', 'isdefinite', 'isdeployed', 'isdir',
+ 'isequal', 'isequalwithequalnans', 'isfigure', 'ishermitian',
+ 'ishghandle', 'ishold', 'isletter', 'ismac', 'ismember', 'isocolors',
+ 'isonormals', 'isosurface', 'ispc', 'ispref', 'isprime', 'isprop',
+ 'isrow', 'isscalar', 'issquare', 'isstrprop', 'issymmetric',
+ 'isunix', 'isvector', 'jet', 'kendall', 'kolmogorov_smirnov_cdf',
+ 'kolmogorov_smirnov_test', 'kolmogorov_smirnov_test_2', 'kron',
+ 'kruskal_wallis_test', 'krylov', 'kurtosis', 'laplace_cdf',
+ 'laplace_inv', 'laplace_pdf', 'laplace_rnd', 'lcm', 'legend',
+ 'legendre', 'license', 'lin2mu', 'line', 'linkprop', 'list_primes',
+ 'loadaudio', 'loadobj', 'logistic_cdf', 'logistic_inv',
+ 'logistic_pdf', 'logistic_regression', 'logistic_rnd', 'logit',
+ 'loglog', 'loglogerr', 'logm', 'logncdf', 'logninv', 'lognpdf',
+ 'lognrnd', 'logspace', 'lookfor', 'lookup', 'ls', 'ls_command',
+ 'lsode', 'lsqnonneg', 'lu', 'luinc', 'magic', 'mahalanobis', 'manova',
+ 'mat2str', 'matlabroot', 'matrix_type', 'max', 'mcnemar_test',
+ 'md5sum', 'mean', 'meansq', 'median', 'menu', 'mesh', 'meshc',
+ 'meshgrid', 'meshz', 'mex', 'mexext', 'mgorth', 'mkoctfile', 'mkpp',
+ 'mode', 'moment', 'movefile', 'mpoles', 'mu2lin', 'namelengthmax',
+ 'nargchk', 'narginchk', 'nargoutchk', 'nbincdf', 'nbininv', 'nbinpdf',
+ 'nbinrnd', 'nchoosek', 'ndgrid', 'newplot', 'news', 'nextpow2',
+ 'nonzeros', 'normcdf', 'normest', 'norminv', 'normpdf', 'normrnd',
+ 'now', 'nproc', 'nthargout', 'nthroot', 'ntsc2rgb', 'null', 'num2str',
+ 'ocean', 'ols', 'onenormest', 'optimget', 'optimset', 'orderfields',
+ 'orient', 'orth', 'pack', 'paren', 'pareto', 'parseparams', 'pascal',
+ 'patch', 'pathdef', 'pbaspect', 'pcg', 'pchip', 'pcolor', 'pcr',
+ 'peaks', 'periodogram', 'perl', 'perms', 'pie', 'pie3',
+ 'pink', 'pinv', 'pkg', 'planerot', 'playaudio', 'plot', 'plot3',
+ 'plotmatrix', 'plotyy', 'poisscdf', 'poissinv', 'poisspdf',
+ 'poissrnd', 'pol2cart', 'polar', 'poly', 'polyaffine', 'polyarea',
+ 'polyder', 'polyfit', 'polygcd', 'polyint', 'polyout',
+ 'polyreduce', 'polyval', 'polyvalm', 'postpad', 'pow2', 'powerset',
+ 'ppder', 'ppint', 'ppjumps', 'ppplot', 'ppval', 'pqpnonneg',
+ 'prctile', 'prepad', 'primes', 'print', 'printAllBuiltins',
+ 'print_usage', 'prism', 'probit', 'profexplore', 'profile',
+ 'profshow', 'prop_test_2', 'python', 'qp', 'qqplot', 'qr', 'quad',
+ 'quadcc', 'quadgk', 'quadl', 'quadv', 'quantile', 'quiver', 'quiver3',
+ 'qz', 'qzhess', 'rainbow', 'rand', 'randi', 'range', 'rank', 'ranks',
+ 'rat', 'rcond', 'reallog', 'realpow', 'realsqrt', 'record',
+ 'rectangle', 'rectint', 'recycle', 'refresh', 'refreshdata', 'regexp',
+ 'regexptranslate', 'repmat', 'residue', 'rgb2hsv',
+ 'rgb2ind', 'rgb2ntsc', 'ribbon', 'rindex', 'rmappdata', 'rmpref',
+ 'roots', 'rose', 'rosser', 'rot90', 'rotdim', 'rref', 'run',
+ 'run_count', 'run_test', 'rundemos', 'runlength', 'runtests',
+ 'saveas', 'saveaudio', 'saveobj', 'savepath', 'scatter',
+ 'scatter3', 'schur', 'sec', 'secd', 'sech', 'semicolon', 'semilogx',
+ 'semilogxerr', 'semilogy', 'semilogyerr', 'setappdata', 'setaudio',
+ 'setdiff', 'setfield', 'setpref', 'setxor', 'shading',
+ 'shg', 'shift', 'shiftdim', 'sign_test', 'sinc', 'sind',
+ 'sinetone', 'sinewave', 'skewness', 'slice', 'sombrero', 'sortrows',
+ 'spaugment', 'spconvert', 'spdiags', 'spearman', 'spectral_adf',
+ 'spectral_xdf', 'specular', 'speed', 'spencer', 'speye', 'spfun',
+ 'sph2cart', 'sphere', 'spinmap', 'spline', 'spones', 'spparms',
+ 'sprand', 'sprandn', 'sprandsym', 'spring', 'spstats', 'spy', 'sqp',
+ 'sqrtm', 'stairs', 'statistics', 'std', 'stdnormal_cdf',
+ 'stdnormal_inv', 'stdnormal_pdf', 'stdnormal_rnd', 'stem', 'stem3',
+ 'stft', 'str2double', 'str2num', 'strcat', 'strchr',
+ 'strfind', 'strjust', 'strmatch', 'strread', 'strsplit', 'strtok',
+ 'strtrim', 'strtrunc', 'structfun', 'sub2ind',
+ 'subplot', 'subsindex', 'subspace', 'substr', 'substruct', 'summer',
+ 'surf', 'surface', 'surfc', 'surfl', 'surfnorm', 'svd', 'svds',
+ 'swapbytes', 'syl', 'symbfact', 'symrcm',
+ 'symvar', 'synthesis', 't_test', 't_test_2', 't_test_regression',
+ 'table', 'tand', 'tar', 'tcdf', 'tempdir', 'tempname', 'test', 'text',
+ 'textread', 'textscan', 'time', 'tinv', 'title', 'toeplitz', 'tpdf',
+ 'trace', 'trapz', 'treelayout', 'treeplot', 'tril', 'trimesh',
+ 'triplequad', 'triplot', 'trisurf', 'trnd', 'tsearch', 'tsearchn',
+ 'type', 'typecast', 'u_test', 'uicontextmenu', 'uicontrol',
+ 'uigetdir', 'uigetfile', 'uimenu', 'uipanel', 'uipushtool',
+ 'uiputfile', 'uiresume', 'uitoggletool', 'uitoolbar', 'uiwait',
+ 'unidcdf', 'unidinv', 'unidpdf', 'unidrnd', 'unifcdf', 'unifinv',
+ 'unifpdf', 'unifrnd', 'unimplemented', 'union', 'unique', 'unix',
+ 'unmkpp', 'unpack', 'untabify', 'untar', 'unwrap', 'unzip',
+ 'urlwrite', 'usejava', 'validatestring', 'vander', 'var',
+ 'var_test', 'vech', 'ver', 'version', 'view', 'voronoi', 'voronoin',
+ 'waitbar', 'waitforbuttonpress', 'warning_ids', 'wavread', 'wavwrite',
+ 'wblcdf', 'wblinv', 'wblpdf', 'wblrnd', 'weekday',
+ 'welch_test', 'what', 'which',
+ 'white', 'whitebg', 'wienrnd', 'wilcoxon_test', 'wilkinson', 'winter',
+ 'xlabel', 'xlim', 'xor', 'ylabel', 'ylim', 'yulewalker', 'z_test',
+ 'z_test_2', 'zip', 'zlabel', 'zlim', 'zscore', 'airy', 'arrayfun',
+ 'besselh', 'besseli', 'besselk', 'bessely', 'bitpack', 'bitunpack',
+ 'blkmm', 'cellindexmat', 'cellslices', 'chol2inv', 'choldelete',
+ 'cholinsert', 'cholinv', 'cholshift', 'cholupdate', 'convn',
+ 'csymamd', 'cummax', 'cummin', 'daspk_options', 'dasrt_options',
+ 'dassl_options', 'endgrent', 'endpwent', 'etree', 'getgrgid',
+ 'getgrnam', 'getpwnam', 'getpwuid', 'gmtime', 'gui_mode', 'ifft',
+ 'ifft2', 'ifftn', 'ind2sub', 'inverse', 'localtime', 'lsode_options',
+ 'luupdate', 'mat2cell', 'min', 'mktime', 'mouse_wheel_zoom',
+ 'num2cell', 'num2hex', 'qrdelete', 'qrinsert', 'qrshift', 'qrupdate',
+ 'quad_options', 'rande', 'randg', 'randn', 'randp', 'randperm',
+ 'regexpi', 'regexprep', 'rsf2csf', 'setgrent', 'setpwent', 'sprank',
+ 'strftime', 'strptime', 'strrep', 'svd_driver', 'symamd', 'triu',
+ 'urlread'
+ ),
+ // Private builtin
+ 7 => array(
+ '__accumarray_max__', '__accumarray_min__', '__accumarray_sum__',
+ '__accumdim_sum__', '__builtins__', '__calc_dimensions__',
+ '__current_scope__', '__display_tokens__', '__dump_symtab_info__',
+ '__end__', '__get__', '__go_axes__', '__go_axes_init__',
+ '__go_delete__', '__go_execute_callback__', '__go_figure__',
+ '__go_figure_handles__', '__go_handles__', '__go_hggroup__',
+ '__go_image__', '__go_line__', '__go_patch__', '__go_surface__',
+ '__go_text__', '__go_uicontextmenu__', '__go_uicontrol__',
+ '__go_uimenu__', '__go_uipanel__', '__go_uipushtool__',
+ '__go_uitoggletool__', '__go_uitoolbar__', '__gud_mode__',
+ '__image_pixel_size__', '__is_handle_visible__', '__isa_parent__',
+ '__keywords__', '__lexer_debug_flag__', '__list_functions__',
+ '__operators__', '__parent_classes__', '__parser_debug_flag__',
+ '__pathorig__', '__profiler_data__', '__profiler_enable__',
+ '__profiler_reset__', '__request_drawnow__', '__sort_rows_idx__',
+ '__token_count__', '__varval__', '__version_info__', '__which__'
+ ),
+ // Private Octave functions
+ 8 => array(
+ '__all_opts__', '__contourc__', '__delaunayn__', '__dispatch__',
+ '__dsearchn__', '__finish__', '__fltk_uigetfile__',
+ '__glpk__', '__gnuplot_drawnow__', '__init_fltk__',
+ '__init_gnuplot__', '__lin_interpn__', '__magick_read__',
+ '__makeinfo__', '__pchip_deriv__', '__plt_get_axis_arg__', '__qp__',
+ '__voronoi__', '__fltk_maxtime__', '__fltk_redraw__', '__ftp__',
+ '__ftp_ascii__', '__ftp_binary__', '__ftp_close__', '__ftp_cwd__',
+ '__ftp_delete__', '__ftp_dir__', '__ftp_mget__', '__ftp_mkdir__',
+ '__ftp_mode__', '__ftp_mput__', '__ftp_pwd__', '__ftp_rename__',
+ '__ftp_rmdir__', '__magick_finfo__', '__magick_format_list__',
+ '__magick_write__'
+ ),
+ // Builtin Global Variables
+ 9 => array(
+ 'EDITOR', 'EXEC_PATH', 'F_DUPFD', 'F_GETFD', 'F_GETFL', 'F_SETFD',
+ 'F_SETFL', 'IMAGE_PATH', 'OCTAVE_HOME',
+ 'OCTAVE_VERSION', 'O_APPEND', 'O_ASYNC', 'O_CREAT', 'O_EXCL',
+ 'O_NONBLOCK', 'O_RDONLY', 'O_RDWR', 'O_SYNC', 'O_TRUNC', 'O_WRONLY',
+ 'PAGER', 'PAGER_FLAGS', 'PS1', 'PS2', 'PS4', 'SEEK_CUR', 'SEEK_END',
+ 'SEEK_SET', 'SIG', 'S_ISBLK', 'S_ISCHR', 'S_ISDIR', 'S_ISFIFO',
+ 'S_ISLNK', 'S_ISREG', 'S_ISSOCK', 'WCONTINUE', 'WCOREDUMP',
+ 'WEXITSTATUS', 'WIFCONTINUED', 'WIFEXITED', 'WIFSIGNALED',
+ 'WIFSTOPPED', 'WNOHANG', 'WSTOPSIG', 'WTERMSIG', 'WUNTRACED'
+ ),
+ // Constant functions
+ 10 => array (
+ 'e', 'eps', 'inf', 'Inf', 'nan', 'NaN', 'NA', 'pi', 'i', 'I', 'j',
+ 'J', 'true', 'false'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ // Comparison & logical
+ 0 => array(
+ '!', '!=', '&', '&&','|', '||', '~', '~=',
+ '<', '<=', '==', '>', '>='
+ ),
+ // Aritmethical
+ 1 => array(
+ '*', '**', '+', '++', '-', '--', '/', "\\","'"
+ ),
+ // Elementwise arithmetical
+ 2 => array(
+ '.*', '.**','./', '.^', '^',".\\",".'"
+ ),
+ // Arithmetical & assignation
+ 3 => array(
+ '*=','+=','-=','/=','\=','**=','^=',
+ '.*=','.+=','.-=','./=','.\=','.**=','.^=','='
+ ),
+ // Indexer
+ 4 => array(
+ ':'
+ ),
+ // Delimiters
+ 5 => array(
+ ',', '...', ';'
+ ),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true,
+ 10 => true,
+ ),
+ 'URLS' => array(
+ 1 => 'http://octave.sourceforge.net/octave/function/{FNAME}.html',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => 'http://octave.sourceforge.net/octave/function/{FNAME}.html',
+ 6 => 'http://octave.sourceforge.net/octave/function/{FNAME}.html',
+ 7 => '',
+ 8 => '',
+ 9 => 'http://octave.sourceforge.net/octave/function/{FNAME}.html',
+ 10 => 'http://octave.sourceforge.net/octave/function/{FNAME}.html',
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ ),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'STYLES' => array(
+ 'COMMENTS' => array(
+ 1 => 'color: #0000FF; font-style: italic;', // single quote strings
+ 2 => 'color: #0000FF; font-style: italic;', // double quote strings
+ 3 => 'color: #FF00FF; font-style: italic;', // single quote strings
+ 4 => 'color: #FF00FF; font-style: italic;', // double quote strings
+ 5 => 'color: #0000FF; font-style: italic;', // block comments
+ 6 => 'color: #996600; font-weight:bold;', // packaging system
+ 7 => 'color: #006600; font-weight:bold;', // function handles
+ 'MULTI' => 'color: #0000FF; font-style: italic;',
+ ),
+ 'KEYWORDS' => array(
+ 1 => 'color: #2E8B57; font-weight:bold;', // Data types
+ 2 => 'color: #2E8B57;', // Storage type
+ 3 => 'color: #0000FF; font-weight:bold;', // Internal variable
+ 4 => 'color: #990000; font-weight:bold;', // Reserved words
+ 5 => 'color: #008A8C; font-weight:bold;', // Built-in
+ 6 => 'color: #008A8C;', // Octave functions
+ 9 => 'color: #000000; font-weight:bold;', // Builtin Global Variables
+ 10 => 'color: #008A8C; font-weight:bold;', // Constant functions
+ ),
+ 'ESCAPE_CHAR' => array(),
+ 'BRACKETS' => array(
+ 0 => 'color: #080;',
+ ),
+ 'STRINGS' => array(
+ // strings were specified on the COMMENT_REGEXP section
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ ),
+ 'METHODS' => array(),
+ 'SYMBOLS' => array(
+ 0 => 'color: #FF9696; font-weight:bold;', // Comparison & logical
+ 1 => 'color: #CC0000; font-weight:bold;', // Aritmethical
+ 2 => 'color: #993333; font-weight:bold;', // Elementwise arithmetical
+ 3 => 'color: #FF0000; font-weight:bold;', // Arithmetical & assignation
+ 4 => 'color: #33F;', // Indexer
+ 5 => 'color: #33F;', // Delimiters
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array(),
+ )
+);
+
+?>
diff --git a/inc/geshi/oobas.php b/inc/geshi/oobas.php
index 6f6e13fc2..ff75af65f 100644
--- a/inc/geshi/oobas.php
+++ b/inc/geshi/oobas.php
@@ -4,7 +4,7 @@
* ---------
* Author: Roberto Rossi (rsoftware@altervista.org)
* Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/30
*
* OpenOffice.org Basic language file for GeSHi.
diff --git a/inc/geshi/oorexx.php b/inc/geshi/oorexx.php
new file mode 100644
index 000000000..62c6cc463
--- /dev/null
+++ b/inc/geshi/oorexx.php
@@ -0,0 +1,171 @@
+<?php
+/*************************************************************************************
+ * oorexx.php
+ * ---------------------------------
+ * Author: Jon Wolfers (sahananda@windhorse.biz)
+ * Contributors:
+ * - Walter Pachl (pachl@chello.at)
+ * Copyright: (c) 2008 Jon Wolfers, (c) 2012 Walter Pachl
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/01/07
+ *
+ * ooRexx language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/07/29 (1.0.0)
+ * - tried to get it syntactically right
+ *
+ * TODO (updated 2012/07/29)
+ * -------------------------
+ * - Get it working on rosettacode.org
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ooRexx',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'address', 'arg', 'attribute', 'call', 'constant', 'do',
+ 'drop', 'exit', 'if',
+ 'interpret', 'iterate', 'leave', 'loop', 'nop', 'numeric',
+ 'parse', 'procedure', 'pull', 'push', 'queue',
+ 'raise', 'reply', 'return', 'say', 'select', 'signal',
+ 'use'
+ ),
+ 2 => array(
+ 'abstract', 'any', 'arguments', 'array', 'by',
+ 'continue', 'digits', 'engineering', 'error',
+ 'expose', 'external', 'failure', 'for', 'forever',
+ 'forward', 'get', 'guard', 'guarded', 'halt',
+ 'inherit', 'library', 'lostdigits', 'message',
+ 'metaclass', 'mixinclass', 'name', 'nomethod', 'nostring',
+ 'notready', 'novalue', 'off', 'on', 'options', 'over',
+ 'private', 'protected', 'public', 'scientific', 'set',
+ 'source', 'subclass', 'syntax', 'to', 'unguarded',
+ 'unprotected', 'until', 'user',
+ 'version', 'while', 'with'
+ ),
+ 3 => array(
+ 'else', 'end', 'otherwise', 'then', 'when'
+ ),
+ 4 => array(
+ 'rc', 'result', 'self', 'sigl', 'super'
+ ),
+ 5 => array(
+ '::attribute', '::class', '::constant', '::method',
+ '::optins', '::requires', '::routine'
+ ),
+ 6 => array(
+ 'abbrev', 'abs', 'beep', 'bitand', 'bitor',
+ 'bitxor', 'b2x', 'center', 'centre', 'changestr', 'charin',
+ 'charout', 'chars', 'compare', 'condition', 'copies',
+ 'countstr', 'c2d', 'c2x', 'datatype', 'date', 'delstr',
+ 'delword', 'directory', 'd2c', 'd2x', 'endlocal',
+ 'errortext', 'filespec', 'form', 'format', 'fuzz', 'insert',
+ 'lastpos', 'left', 'length', 'linein', 'lineout', 'lines',
+ 'lower', 'max', 'min', 'overlay', 'pos', 'qualify', 'queued',
+ 'random', 'reverse', 'right', 'rxfuncadd', 'rxfuncdrop',
+ 'rxfuncquery', 'rxqueue', 'setlocal', 'sign', 'sourceline',
+ 'space', 'stream', 'strip', 'substr', 'subword', 'symbol',
+ 'time', 'trace', 'translate', 'trunc', 'upper', 'userid',
+ 'value', 'var', 'verify', 'word', 'wordindex', 'wordlength',
+ 'wordpos', 'words', 'xrange', 'x2b', 'x2c', 'x2d'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '<', '>', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':',
+ '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #ff0000; font-weight: bold;',
+ 3 => 'color: #00ff00; font-weight: bold;',
+ 4 => 'color: #0000ff; font-weight: bold;',
+ 5 => 'color: #880088; font-weight: bold;',
+ 6 => 'color: #888800; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 'MULTI' => 'color: #808080;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/inc/geshi/oracle11.php b/inc/geshi/oracle11.php
index f57c3f044..16259e695 100644
--- a/inc/geshi/oracle11.php
+++ b/inc/geshi/oracle11.php
@@ -6,7 +6,7 @@
* Contributions:
* - Updated for 11i by Simon Redhead
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/04
*
* Oracle 11i language file for GeSHi.
diff --git a/inc/geshi/oracle8.php b/inc/geshi/oracle8.php
index e470e0dd4..145bda407 100644
--- a/inc/geshi/oracle8.php
+++ b/inc/geshi/oracle8.php
@@ -4,7 +4,7 @@
* -----------
* Author: Guy Wicks (Guy.Wicks@rbs.co.uk)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/04
*
* Oracle 8 language file for GeSHi.
diff --git a/inc/geshi/oxygene.php b/inc/geshi/oxygene.php
index 3af03bfc2..bc2ee6563 100644
--- a/inc/geshi/oxygene.php
+++ b/inc/geshi/oxygene.php
@@ -4,7 +4,7 @@
* ----------
* Author: Carlo Kok (ck@remobjects.com), J�rja Norbert (jnorbi@vipmail.hu), Benny Baumann (BenBE@omorphia.de)
* Copyright: (c) 2004 J�rja Norbert, Benny Baumann (BenBE@omorphia.de), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/01/11
*
* Delphi Prism (Oxygene) language file for GeSHi.
@@ -12,6 +12,8 @@
*
* CHANGES
* -------
+ * 2012/06/28 (1.0.8.11)
+ * - Added "write" keyword for properties
* 2010/01/11 (1.0.0)
* - First Release
*
@@ -66,7 +68,7 @@ $language_data = array (
'Implies', 'Select', 'Order', 'By', 'Desc', 'Asc', 'Group', 'Join', 'Take',
'Skip', 'Concat', 'Union', 'Reverse', 'Distinct', 'Into', 'Equals', 'params',
'sequence', 'index', 'notify', 'Parallel', 'create', 'array', 'Queryable', 'Aspect',
- 'volatile'
+ 'volatile', 'write'
),
3 => array(
'chr', 'ord', 'inc', 'dec', 'assert', 'iff', 'assigned','futureAssigned', 'length', 'low', 'high', 'typeOf', 'sizeOf', 'disposeAndNil', 'Coalesce', 'unquote'
diff --git a/inc/geshi/oz.php b/inc/geshi/oz.php
index cd594d4ca..d24561bf0 100644
--- a/inc/geshi/oz.php
+++ b/inc/geshi/oz.php
@@ -4,7 +4,7 @@
* --------
* Author: Wolfgang Meyer (Wolfgang.Meyer@gmx.net)
* Copyright: (c) 2010 Wolfgang Meyer
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/01/03
*
* Oz language file for GeSHi.
diff --git a/inc/geshi/parasail.php b/inc/geshi/parasail.php
new file mode 100644
index 000000000..864eba1e9
--- /dev/null
+++ b/inc/geshi/parasail.php
@@ -0,0 +1,133 @@
+<?php
+/*************************************************************************************
+ * parasail.php
+ * -------
+ * Author: T. Taft (taft@adacore.com)
+ * Copyright: (c) 2012 AdaCore (http://adacore.com/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/08/02
+ *
+ * ParaSail language file for GeSHi.
+ *
+ * Words are from SciTe configuration file
+ *
+ * CHANGES
+ * -------
+ * 2012/08/02 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2012/08/02)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ParaSail',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('{' => '}'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'all', 'block', 'case', 'continue', 'each',
+ 'else', 'elsif', 'exit', 'for',
+ 'forward', 'if', 'loop', 'return', 'reverse', 'some',
+ 'then', 'until', 'while', 'with'
+ ),
+ 2 => array(
+ 'abs', 'and','in', 'mod', 'not', 'null', 'or', 'rem', 'xor'
+ ),
+ 3 => array(
+ 'abstract', 'class',
+ 'concurrent', 'const',
+ 'end', 'extends', 'exports',
+ 'func', 'global', 'implements', 'import',
+ 'interface', 'is', 'lambda', 'locked',
+ 'new', 'of', 'op', 'optional',
+ 'private', 'queued', 'ref',
+ 'separate', 'type', 'var',
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #46aa03; font-weight:bold;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/parigp.php b/inc/geshi/parigp.php
new file mode 100644
index 000000000..c9c73095b
--- /dev/null
+++ b/inc/geshi/parigp.php
@@ -0,0 +1,277 @@
+<?php
+/*************************************************************************************
+ * parigp.php
+ * --------
+ * Author: Charles R Greathouse IV (charles@crg4.com)
+ * Copyright: 2011 Charles R Greathouse IV (http://math.crg4.com/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/05/11
+ *
+ * PARI/GP language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011/07/09 (1.0.8.11)
+ * - First Release
+ *
+ * TODO (updated 2011/07/09)
+ * -------------------------
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'PARI/GP',
+ 'COMMENT_SINGLE' => array(1 => '\\\\'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'NUMBERS' => array(
+ # Integers
+ 1 => GESHI_NUMBER_INT_BASIC,
+ # Reals
+ 2 => GESHI_NUMBER_FLT_SCI_ZERO
+ ),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'addprimes','bestappr','bezout','bezoutres','bigomega','binomial',
+ 'chinese','content','contfrac','contfracpnqn','core','coredisc',
+ 'dirdiv','direuler','dirmul','divisors','eulerphi','factor',
+ 'factorback','factorcantor','factorff','factorial','factorint',
+ 'factormod','ffgen','ffinit','fflog','fforder','ffprimroot',
+ 'fibonacci','gcd','hilbert','isfundamental','ispower','isprime',
+ 'ispseudoprime','issquare','issquarefree','kronecker','lcm',
+ 'moebius','nextprime','numbpart','numdiv','omega','partitions',
+ 'polrootsff','precprime','prime','primepi','primes','qfbclassno',
+ 'qfbcompraw','qfbhclassno','qfbnucomp','qfbnupow','qfbpowraw',
+ 'qfbprimeform','qfbred','qfbsolve','quadclassunit','quaddisc',
+ 'quadgen','quadhilbert','quadpoly','quadray','quadregulator',
+ 'quadunit','removeprimes','sigma','sqrtint','stirling',
+ 'sumdedekind','zncoppersmith','znlog','znorder','znprimroot',
+ 'znstar','Col','List','Mat','Mod','Pol','Polrev','Qfb','Ser','Set',
+ 'Str','Strchr','Strexpand','Strtex','Vec','Vecrev','Vecsmall',
+ 'binary','bitand','bitneg','bitnegimply','bitor','bittest','bitxor',
+ 'ceil','centerlift','component','conj','conjvec','denominator',
+ 'floor','frac','imag','length','lift','norm','norml2','numerator',
+ 'numtoperm','padicprec','permtonum','precision','random','real',
+ 'round','simplify','sizebyte','sizedigit','truncate','valuation',
+ 'variable','ellL1','elladd','ellak','ellan','ellanalyticrank',
+ 'ellap','ellbil','ellchangecurve','ellchangepoint','ellconvertname',
+ 'elldivpol','elleisnum','elleta','ellgenerators','ellglobalred',
+ 'ellgroup','ellheight','ellheightmatrix','ellidentify','ellinit',
+ 'ellisoncurve','ellj','elllocalred','elllog','elllseries',
+ 'ellminimalmodel','ellmodulareqn','ellorder','ellordinate',
+ 'ellpointtoz','ellpow','ellrootno','ellsearch','ellsigma','ellsub',
+ 'elltaniyama','elltatepairing','elltors','ellweilpairing','ellwp',
+ 'ellzeta','ellztopoint','bnfcertify','bnfcompress',
+ 'bnfdecodemodule','bnfinit','bnfisintnorm','bnfisnorm',
+ 'bnfisprincipal','bnfissunit','bnfisunit','bnfnarrow','bnfsignunit',
+ 'bnfsunit','bnrL1','bnrclassno','bnrclassnolist','bnrconductor',
+ 'bnrconductorofchar','bnrdisc','bnrdisclist','bnrinit',
+ 'bnrisconductor','bnrisprincipal','bnrrootnumber','bnrstark',
+ 'dirzetak','factornf','galoisexport','galoisfixedfield',
+ 'galoisgetpol','galoisidentify','galoisinit','galoisisabelian',
+ 'galoisisnormal','galoispermtopol','galoissubcyclo',
+ 'galoissubfields','galoissubgroups','idealadd','idealaddtoone',
+ 'idealappr','idealchinese','idealcoprime','idealdiv','idealfactor',
+ 'idealfactorback','idealfrobenius','idealhnf','idealintersect',
+ 'idealinv','ideallist','ideallistarch','ideallog','idealmin',
+ 'idealmul','idealnorm','idealpow','idealprimedec','idealramgroups',
+ 'idealred','idealstar','idealtwoelt','idealval','matalgtobasis',
+ 'matbasistoalg','modreverse','newtonpoly','nfalgtobasis','nfbasis',
+ 'nfbasistoalg','nfdetint','nfdisc','nfeltadd','nfeltdiv',
+ 'nfeltdiveuc','nfeltdivmodpr','nfeltdivrem','nfeltmod','nfeltmul',
+ 'nfeltmulmodpr','nfeltnorm','nfeltpow','nfeltpowmodpr',
+ 'nfeltreduce','nfeltreducemodpr','nfelttrace','nfeltval','nffactor',
+ 'nffactorback','nffactormod','nfgaloisapply','nfgaloisconj',
+ 'nfhilbert','nfhnf','nfhnfmod','nfinit','nfisideal','nfisincl',
+ 'nfisisom','nfkermodpr','nfmodprinit','nfnewprec','nfroots',
+ 'nfrootsof1','nfsnf','nfsolvemodpr','nfsubfields','polcompositum',
+ 'polgalois','polred','polredabs','polredord','poltschirnhaus',
+ 'rnfalgtobasis','rnfbasis','rnfbasistoalg','rnfcharpoly',
+ 'rnfconductor','rnfdedekind','rnfdet','rnfdisc','rnfeltabstorel',
+ 'rnfeltdown','rnfeltreltoabs','rnfeltup','rnfequation',
+ 'rnfhnfbasis','rnfidealabstorel','rnfidealdown','rnfidealhnf',
+ 'rnfidealmul','rnfidealnormabs','rnfidealnormrel',
+ 'rnfidealreltoabs','rnfidealtwoelt','rnfidealup','rnfinit',
+ 'rnfisabelian','rnfisfree','rnfisnorm','rnfisnorminit','rnfkummer',
+ 'rnflllgram','rnfnormgroup','rnfpolred','rnfpolredabs',
+ 'rnfpseudobasis','rnfsteinitz','subgrouplist','zetak','zetakinit',
+ 'plot','plotbox','plotclip','plotcolor','plotcopy','plotcursor',
+ 'plotdraw','ploth','plothraw','plothsizes','plotinit','plotkill',
+ 'plotlines','plotlinetype','plotmove','plotpoints','plotpointsize',
+ 'plotpointtype','plotrbox','plotrecth','plotrecthraw','plotrline',
+ 'plotrmove','plotrpoint','plotscale','plotstring','psdraw',
+ 'psploth','psplothraw','O','deriv','diffop','eval','factorpadic',
+ 'intformal','padicappr','padicfields','polchebyshev','polcoeff',
+ 'polcyclo','poldegree','poldisc','poldiscreduced','polhensellift',
+ 'polhermite','polinterpolate','polisirreducible','pollead',
+ 'pollegendre','polrecip','polresultant','polroots','polrootsmod',
+ 'polrootspadic','polsturm','polsubcyclo','polsylvestermatrix',
+ 'polsym','poltchebi','polzagier','serconvol','serlaplace',
+ 'serreverse','subst','substpol','substvec','taylor','thue',
+ 'thueinit','break','for','fordiv','forell','forprime','forstep',
+ 'forsubgroup','forvec','if','next','return','until','while',
+ 'Strprintf','addhelp','alarm','alias','allocatemem','apply',
+ 'default','error','extern','externstr','getheap','getrand',
+ 'getstack','gettime','global','input','install','kill','print1',
+ 'print','printf','printtex','quit','read','readvec','select',
+ 'setrand','system','trap','type','version','warning','whatnow',
+ 'write1','write','writebin','writetex','divrem','lex','max','min',
+ 'shift','shiftmul','sign','vecmax','vecmin','derivnum','intcirc',
+ 'intfouriercos','intfourierexp','intfouriersin','intfuncinit',
+ 'intlaplaceinv','intmellininv','intmellininvshort','intnum',
+ 'intnuminit','intnuminitgen','intnumromb','intnumstep','prod',
+ 'prodeuler','prodinf','solve','sum','sumalt','sumdiv','suminf',
+ 'sumnum','sumnumalt','sumnuminit','sumpos','Euler','I','Pi','abs',
+ 'acos','acosh','agm','arg','asin','asinh','atan','atanh','bernfrac',
+ 'bernreal','bernvec','besselh1','besselh2','besseli','besselj',
+ 'besseljh','besselk','besseln','cos','cosh','cotan','dilog','eint1',
+ 'erfc','eta','exp','gamma','gammah','hyperu','incgam','incgamc',
+ 'lngamma','log','polylog','psi','sin','sinh','sqr','sqrt','sqrtn',
+ 'tan','tanh','teichmuller','theta','thetanullk','weber','zeta',
+ 'algdep','charpoly','concat','lindep','listcreate','listinsert',
+ 'listkill','listpop','listput','listsort','matadjoint',
+ 'matcompanion','matdet','matdetint','matdiagonal','mateigen',
+ 'matfrobenius','mathess','mathilbert','mathnf','mathnfmod',
+ 'mathnfmodid','matid','matimage','matimagecompl','matindexrank',
+ 'matintersect','matinverseimage','matisdiagonal','matker',
+ 'matkerint','matmuldiagonal','matmultodiagonal','matpascal',
+ 'matrank','matrix','matrixqz','matsize','matsnf','matsolve',
+ 'matsolvemod','matsupplement','mattranspose','minpoly','qfgaussred',
+ 'qfjacobi','qflll','qflllgram','qfminim','qfperfection','qfrep',
+ 'qfsign','setintersect','setisset','setminus','setsearch','cmp',
+ 'setunion','trace','vecextract','vecsort','vector','vectorsmall',
+ 'vectorv','ellheegner'
+ ),
+
+ 2 => array(
+ 'void','bool','negbool','small','int',/*'real',*/'mp','var','lg','pol',
+ 'vecsmall','vec','list','str','genstr','gen','typ'
+ ),
+
+ 3 => array(
+ 'TeXstyle','breakloop','colors','compatible','datadir','debug',
+ 'debugfiles','debugmem','echo','factor_add_primes','factor_proven',
+ 'format','graphcolormap','graphcolors','help','histfile','histsize',
+ 'lines','linewrap',/*'log',*/'logfile','new_galois_format','output',
+ 'parisize','path','prettyprinter','primelimit','prompt_cont',
+ 'prompt','psfile','readline','realprecision','recover','secure',
+ 'seriesprecision',/*'simplify',*/'strictmatch','timer'
+ ),
+
+ 4 => array(
+ 'alarmer','archer','errpile','gdiver','impl','syntaxer','invmoder',
+ 'overflower','talker','typeer','user'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(',')','{','}','[',']','+','-','*','/','%','=','<','>','!','^','&','|','?',';',':',',','\\','\''
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #e07022;',
+ 3 => 'color: #00d2d2;',
+ 4 => 'color: #00d2d2;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000;',
+ 'MULTI' => 'color: #008000;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #111111; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #002222;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #800080;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #666666;',
+ 1 => 'color: #666666;',
+ 2 => 'color: #666666;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #e07022', # Should be the same as keyword group 2
+ 1 => 'color: #555555'
+ ),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ 0 => array( # types marked on variables
+ GESHI_SEARCH => '(?<!\\\\ )"(t_(?:INT|REAL|INTMOD|FRAC|FFELT|COMPLEX|PADIC|QUAD|POLMOD|POL|SER|RFRAC|QFR|QFI|VEC|COL|MAT|LIST|STR|VECSMALL|CLOSURE))"',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '"',
+ GESHI_AFTER => '"'
+ ),
+ 1 => array( # literal variables
+ GESHI_SEARCH => '(?<!\\\\)(\'[a-zA-Z][a-zA-Z0-9_]*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ 2 => array(
+ '[a-zA-Z][a-zA-Z0-9_]*:' => ''
+ ),
+ 3 => array(
+ 'default(' => ''
+ ),
+ 4 => array(
+ 'trap(' => ''
+ ),
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?>
diff --git a/inc/geshi/pascal.php b/inc/geshi/pascal.php
index 7ee5729a6..de5ca8717 100644
--- a/inc/geshi/pascal.php
+++ b/inc/geshi/pascal.php
@@ -4,7 +4,7 @@
* ----------
* Author: Tux (tux@inamil.cz)
* Copyright: (c) 2004 Tux (http://tux.a4.cz/), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/07/26
*
* Pascal language file for GeSHi.
@@ -50,12 +50,13 @@
$language_data = array (
'LANG_NAME' => 'Pascal',
'COMMENT_SINGLE' => array(1 => '//'),
- 'COMMENT_MULTI' => array('{' => '}','(*' => '*)'),
+ 'COMMENT_MULTI' => array('(*' => '*)', '{' => '}'),
+ //Compiler directives
+ 'COMMENT_REGEXP' => array(2 => '/\\{\\$.*?}|\\(\\*\\$.*?\\*\\)/U'),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
- 'QUOTEMARKS' => array('"'),
- 'HARDQUOTE' => array("'", "'"),
- 'HARDESCAPE' => array("''"),
- 'ESCAPE_CHAR' => '\\',
+ 'QUOTEMARKS' => array("'"),
+ 'ESCAPE_CHAR' => '',
+
'KEYWORDS' => array(
1 => array(
'absolute','asm','assembler','begin','break','case','catch','cdecl',
@@ -67,7 +68,7 @@ $language_data = array (
'or','overload','override','private','procedure','program',
'property','protected','public','published','raise','repeat',
'resourcestring','shl','shr','stdcall','stored','switch','then',
- 'to','try','type','unit','until','uses','var','while','xor'
+ 'to','try','type','unit','until','uses','var','while','with','xor'
),
2 => array(
'nil', 'false', 'true',
@@ -83,9 +84,6 @@ $language_data = array (
'record','set','shortint','smallint','string','union','word'
),
),
- 'SYMBOLS' => array(
- ',', ':', '=', '+', '-', '*', '/'
- ),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
1 => false,
@@ -93,6 +91,12 @@ $language_data = array (
3 => false,
4 => false,
),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']'),
+ 1 => array('.', ',', ':', ';'),
+ 2 => array('@', '^'),
+ 3 => array('=', '+', '-', '*', '/')
+ ),
'STYLES' => array(
'KEYWORDS' => array(
1 => 'color: #000000; font-weight: bold;',
@@ -101,30 +105,35 @@ $language_data = array (
4 => 'color: #000066; font-weight: bold;'
),
'COMMENTS' => array(
- 1 => 'color: #666666; font-style: italic;',
- 'MULTI' => 'color: #666666; font-style: italic;'
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #008000; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
),
'ESCAPE_CHAR' => array(
- 0 => 'color: #000099; font-weight: bold;',
- 'HARD' => 'color: #000099; font-weight: bold;'
+ 0 => 'color: #ff0000; font-weight: bold;'
),
'BRACKETS' => array(
0 => 'color: #009900;'
),
'STRINGS' => array(
0 => 'color: #ff0000;',
- 'HARD' => 'color: #ff0000;'
+ //'HARD' => 'color: #ff0000;'
),
'NUMBERS' => array(
0 => 'color: #cc66cc;'
),
'METHODS' => array(
- 1 => 'color: #0066ee;'
- ),
- 'SYMBOLS' => array(
- 0 => 'color: #339933;'
+ 1 => 'color: #006600;'
),
'REGEXPS' => array(
+ 0 => 'color: #0000cc;',
+ 1 => 'color: #ff0000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066;',
+ 1 => 'color: #000066;',
+ 2 => 'color: #000066;',
+ 3 => 'color: #000066;'
),
'SCRIPT' => array(
)
@@ -140,6 +149,10 @@ $language_data = array (
1 => '.'
),
'REGEXPS' => array(
+ //Hex numbers
+ 0 => '\$[0-9a-fA-F]+',
+ //Characters
+ 1 => '\#(?:\$[0-9a-fA-F]{1,2}|\d{1,3})'
),
'STRICT_MODE_APPLIES' => GESHI_NEVER,
'SCRIPT_DELIMITERS' => array(
@@ -149,4 +162,4 @@ $language_data = array (
'TAB_WIDTH' => 4
);
-?>
+?> \ No newline at end of file
diff --git a/inc/geshi/pcre.php b/inc/geshi/pcre.php
index a67cf2858..13a2e024d 100644
--- a/inc/geshi/pcre.php
+++ b/inc/geshi/pcre.php
@@ -4,7 +4,7 @@
* --------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2010 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/05/22
*
* PCRE language file for GeSHi.
diff --git a/inc/geshi/per.php b/inc/geshi/per.php
index b656c105e..c42ddb58a 100644
--- a/inc/geshi/per.php
+++ b/inc/geshi/per.php
@@ -4,7 +4,7 @@
* --------
* Author: Lars Gersmann (lars.gersmann@gmail.com)
* Copyright: (c) 2007 Lars Gersmann
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/06/03
*
* Per (forms) (FOURJ's Genero 4GL) language file for GeSHi.
diff --git a/inc/geshi/perl.php b/inc/geshi/perl.php
index 5d1c4320b..309ebd861 100644
--- a/inc/geshi/perl.php
+++ b/inc/geshi/perl.php
@@ -4,7 +4,7 @@
* --------
* Author: Andreas Gohr (andi@splitbrain.org), Ben Keen (ben.keen@gmail.com)
* Copyright: (c) 2004 Andreas Gohr, Ben Keen (http://www.benjaminkeen.org/), Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/20
*
* Perl language file for GeSHi.
diff --git a/inc/geshi/perl6.php b/inc/geshi/perl6.php
index 9ea20fc78..706eabcb5 100644
--- a/inc/geshi/perl6.php
+++ b/inc/geshi/perl6.php
@@ -4,7 +4,7 @@
* ---------
* Author: Kodi Arfer (kodiarfer {at} warpmail {period} net); forked from perl.php 1.0.8 by Andreas Gohr (andi@splitbrain.org), Ben Keen (ben.keen@gmail.com)
* Copyright: (c) 2009 Kodi Arfer, (c) 2004 Andreas Gohr, Ben Keen (http://www.benjaminkeen.org/), Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/11/07
*
* Perl 6 language file for GeSHi.
diff --git a/inc/geshi/pf.php b/inc/geshi/pf.php
index d59a609d5..818e11bcb 100644
--- a/inc/geshi/pf.php
+++ b/inc/geshi/pf.php
@@ -4,7 +4,7 @@
* --------
* Author: David Berard (david@nfrance.com)
* Copyright: (c) 2010 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/10/16
* Based on bash.php
*
diff --git a/inc/geshi/php-brief.php b/inc/geshi/php-brief.php
index c28d985f4..a4804b4da 100644
--- a/inc/geshi/php-brief.php
+++ b/inc/geshi/php-brief.php
@@ -4,7 +4,7 @@
* -------------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/02
*
* PHP (brief version) language file for GeSHi.
@@ -169,7 +169,7 @@ $language_data = array (
),
'REGEXPS' => array(
//Variables
- 0 => "[\\$]{1,2}[a-zA-Z_][a-zA-Z0-9_]*"
+ 0 => "[\\$]+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"
),
'STRICT_MODE_APPLIES' => GESHI_MAYBE,
'SCRIPT_DELIMITERS' => array(
diff --git a/inc/geshi/php.php b/inc/geshi/php.php
index ec6981134..2827457b1 100644
--- a/inc/geshi/php.php
+++ b/inc/geshi/php.php
@@ -4,7 +4,7 @@
* --------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/20
*
* PHP language file for GeSHi.
@@ -96,8 +96,9 @@ $language_data = array(
),
2 => array(
'&amp;new','&lt;/script&gt;','&lt;?php','&lt;script language',
- 'class','const','declare','extends','function','global','interface',
- 'namespace','new','private','protected','public','self','use','var'
+ 'abstract','class','const','declare','extends','function','global',
+ 'interface','namespace','new','private','protected','public','self',
+ 'use','var'
),
3 => array(
'abs','acos','acosh','addcslashes','addslashes','aggregate',
@@ -1061,7 +1062,7 @@ $language_data = array(
),
'REGEXPS' => array(
//Variables
- 0 => "[\\$]{1,2}[a-zA-Z_][a-zA-Z0-9_]*"
+ 0 => "[\\$]+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"
),
'STRICT_MODE_APPLIES' => GESHI_MAYBE,
'SCRIPT_DELIMITERS' => array(
@@ -1083,22 +1084,24 @@ $language_data = array(
"(?>'(?>[^'\\\\]|\\\\'|\\\\\\\|\\\\)*')|".
"(?>\"(?>[^\"\\\\]|\\\\\"|\\\\\\\\|\\\\)*\")|".
"(?>\\/\\*(?>[^\\*]|(?!\\*\\/)\\*)*\\*\\/)|".
- "\\/\\/(?>.*?$)|".
+ "\\/\\/(?>.*?(?:\\?>|$))|".
+ "#(?>.*?(?:\\?>|$))|".
"\\/(?=[^*\\/])|".
"<(?!<<)|".
"<<<(?P<phpdoc>\w+)\s.*?\s\k<phpdoc>".
- ")*(?P<end>\\?>|\Z)/sm",
+ ")*?(?P<end>\\?>|\Z)/sm",
5 => "/(?P<start><%)(?:".
"(?>[^\"'%\\/<]+)|".
"%(?!>)|".
"(?>'(?>[^'\\\\]|\\\\'|\\\\\\\|\\\\)*')|".
"(?>\"(?>[^\\\"\\\\]|\\\\\"|\\\\\\\\|\\\\)*\")|".
"(?>\\/\\*(?>[^\\*]|(?!\\*\\/)\\*)*\\*\\/)|".
- "\\/\\/(?>.*?$)|".
+ "\\/\\/(?>.*?(?:%>|$))|".
+ "#(?>.*?(?:%>|$))|".
"\\/(?=[^*\\/])|".
"<(?!<<)|".
"<<<(?P<phpdoc>\w+)\s.*?\s\k<phpdoc>".
- ")*(?P<end>%>)/sm",
+ ")*?(?P<end>%>|\Z)/sm",
),
'HIGHLIGHT_STRICT_BLOCK' => array(
0 => true,
@@ -1111,4 +1114,4 @@ $language_data = array(
'TAB_WIDTH' => 4
);
-?> \ No newline at end of file
+?>
diff --git a/inc/geshi/pic16.php b/inc/geshi/pic16.php
index 626a768b0..46d7ac94d 100644
--- a/inc/geshi/pic16.php
+++ b/inc/geshi/pic16.php
@@ -4,7 +4,7 @@
* -------
* Author: Phil Mattison (mattison@ohmikron.com)
* Copyright: (c) 2008 Ohmikron Corp. (http://www.ohmikron.com/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/07/30
*
* PIC16 Assembler language file for GeSHi.
diff --git a/inc/geshi/pike.php b/inc/geshi/pike.php
index 2b860ccd6..743f711b1 100644
--- a/inc/geshi/pike.php
+++ b/inc/geshi/pike.php
@@ -4,7 +4,7 @@
* --------
* Author: Rick E. (codeblock@eighthbit.net)
* Copyright: (c) 2009 Rick E.
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/12/10
*
* Pike language file for GeSHi.
diff --git a/inc/geshi/pixelbender.php b/inc/geshi/pixelbender.php
index 82c64ae52..7b29ee6c3 100644
--- a/inc/geshi/pixelbender.php
+++ b/inc/geshi/pixelbender.php
@@ -4,7 +4,7 @@
* ----------------
* Author: Richard Olsson (r@richardolsson.se)
* Copyright: (c) 2008 Richard Olsson (richardolsson.se)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/11/16
*
* Pixel Bender 1.0 language file for GeSHi.
diff --git a/inc/geshi/pli.php b/inc/geshi/pli.php
new file mode 100644
index 000000000..c29985140
--- /dev/null
+++ b/inc/geshi/pli.php
@@ -0,0 +1,200 @@
+<?php
+/*************************************************************************************
+ * pli.php
+ * --------
+ * Author: Robert AH Prins (robert@prino.org)
+ * Copyright: (c) 2011 Robert AH Prins (http://hitchwiki.org/en/User:Prino)
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/02/09
+ *
+ * PL/I language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011/02/09 (1.0.8.10)
+ * - First Release - machine(ish) generated by http://rosettacode.org/geshi/
+ *
+ * TODO (updated 2011/02/09)
+ * -------------------------
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'PL/I',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '\''),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'abnormal', 'abs', 'acos', 'acosf', 'add', 'addbuff', 'addr',
+ 'addrdata', 'alias', 'aligned', 'all', 'alloc', 'allocate',
+ 'allocation', 'allocn', 'allocsize', 'any', 'anycondition', 'area',
+ 'ascii', 'asin', 'asinf', 'asm', 'asmtdli', 'assembler',
+ 'assignable', 'atan', 'atand', 'atanf', 'atanh', 'attach',
+ 'attention', 'attn', 'auto', 'automatic', 'availablearea',
+ 'backwards', 'based', 'begin', 'bigendian', 'bin', 'binary',
+ 'binaryvalue', 'bind', 'binvalue', 'bit', 'bitloc', 'bitlocation',
+ 'bkwd', 'blksize', 'bool', 'buf', 'buffered', 'buffers', 'bufnd',
+ 'bufni', 'bufoff', 'bufsp', 'builtin', 'bx', 'by', 'byaddr', 'byte',
+ 'byvalue', 'b4', 'call', 'cast', 'cds', 'ceil', 'center',
+ 'centerleft', 'centerright', 'centre', 'centreleft', 'centreright',
+ 'char', 'character', 'charg', 'chargraphic', 'charval', 'check',
+ 'checkstg', 'close', 'cmpat', 'cobol', 'col', 'collate', 'column',
+ 'comment', 'compare', 'compiledate', 'compiletime', 'completion',
+ 'complex', 'cond', 'condition', 'conjg', 'conn', 'connected',
+ 'consecutive', 'controlled', 'conv', 'conversion', 'copy', 'cos',
+ 'cosd', 'cosf', 'cosh', 'count', 'counter', 'cpln', 'cplx', 'cs',
+ 'cstg', 'ctl', 'ctlasa', 'ctl360', 'currentsize', 'currentstorage',
+ 'data', 'datafield', 'date', 'datetime', 'days', 'daystodate',
+ 'daystosecs', 'db', 'dcl', 'dec', 'decimal', 'declare', 'def',
+ 'default', 'define', 'defined', 'delay', 'delete', 'descriptor',
+ 'descriptors', 'detach', 'dft', 'dim', 'dimacross', 'dimension',
+ 'direct', 'display', 'divide', 'do', 'downthru', 'edit', 'else',
+ 'empty', 'end', 'endfile', 'endpage', 'entry', 'entryaddr', 'env',
+ 'environment', 'epsilon', 'erf', 'erfc', 'error', 'event', 'excl',
+ 'exclusive', 'exit', 'exp', 'expf', 'exponent', 'exports', 'ext',
+ 'external', 'fb', 'fbs', 'fetch', 'file', 'fileddint', 'fileddtest',
+ 'fileddword', 'fileid', 'fileopen', 'fileread', 'fileseek',
+ 'filetell', 'filewrite', 'finish', 'first', 'fixed', 'fixedbin',
+ 'fixeddec', 'fixedoverflow', 'float', 'floatbin', 'floatdec',
+ 'floor', 'flush', 'fofl', 'format', 'fortran', 'free', 'from',
+ 'fromalien', 'fs', 'gamma', 'generic', 'genkey', 'get', 'getenv',
+ 'go', 'goto', 'graphic', 'gx', 'handle', 'hbound', 'hex', 'hexadec',
+ 'heximage', 'high', 'huge', 'iand', 'ieee', 'ieor', 'if', 'ignore',
+ 'imag', 'in', 'index', 'indexarea', 'indexed', 'init', 'initial',
+ 'inline', 'inonly', 'inot', 'inout', 'input', 'int', 'inter',
+ 'internal', 'into', 'invalidop', 'ior', 'irred', 'irreducible',
+ 'isfinite', 'isigned', 'isinf', 'isll', 'ismain', 'isnan',
+ 'isnormal', 'isrl', 'iszero', 'iunsigned', 'key', 'keyed',
+ 'keyfrom', 'keylength', 'keyloc', 'keyto', 'label', 'last',
+ 'lbound', 'leave', 'left', 'length', 'like', 'limited', 'line',
+ 'lineno', 'linesize', 'linkage', 'list', 'littleendian', 'loc',
+ 'locate', 'location', 'log', 'logf', 'loggamma', 'log10', 'log10f',
+ 'log2', 'low', 'lowercase', 'lower2', 'maccol', 'maclmar',
+ 'macname', 'macrmar', 'main', 'max', 'maxexp', 'maxlength',
+ 'memconvert', 'memcu12', 'memcu14', 'memcu21', 'memcu24', 'memcu41',
+ 'memcu42', 'memindex', 'memsearch', 'memsearchr', 'memverify',
+ 'memverifyr', 'min', 'minexp', 'mod', 'mpstr', 'multiply', 'name',
+ 'native', 'ncp', 'new', 'nocharg', 'nochargraphic', 'nocheck',
+ 'nocmpat', 'noconv', 'noconversion', 'nodescriptor', 'noexecops',
+ 'nofixedoverflow', 'nofofl', 'noinline', 'nolock', 'nomap',
+ 'nomapin', 'nomapout', 'nonasgn', 'nonassignable', 'nonconnected',
+ 'nonnative', 'noofl', 'nooverflow', 'norescan', 'normal', 'nosize',
+ 'nostrg', 'nostringrange', 'nostringsize', 'nostrz', 'nosubrg',
+ 'nosubscriptrange', 'noufl', 'nounderflow', 'nowrite', 'nozdiv',
+ 'nozerodivide', 'null', 'offset', 'offsetadd', 'offsetdiff',
+ 'offsetsubtract', 'offsetvalue', 'ofl', 'omitted', 'on', 'onarea',
+ 'onchar', 'oncode', 'oncondcond', 'oncondid', 'oncount', 'onfile',
+ 'ongsource', 'onkey', 'online', 'onloc', 'onoffset', 'onsource',
+ 'onsubcode', 'onwchar', 'onwsource', 'open', 'optional', 'options',
+ 'order', 'ordinal', 'ordinalname', 'ordinalpred', 'ordinalsucc',
+ 'other', 'otherwise', 'outonly', 'output', 'overflow', 'package',
+ 'packagename', 'page', 'pageno', 'pagesize', 'parameter', 'parmset',
+ 'password', 'pending', 'pic', 'picspec', 'picture', 'places',
+ 'pliascii', 'plicanc', 'plickpt', 'plidelete', 'plidump',
+ 'pliebcdic', 'plifill', 'plifree', 'plimove', 'pliover', 'plirest',
+ 'pliretc', 'pliretv', 'plisaxa', 'plisaxb', 'plisaxc', 'plisaxd',
+ 'plisrta', 'plisrtb', 'plisrtc', 'plisrtd', 'plitdli', 'plitran11',
+ 'plitran12', 'plitran21', 'plitran22', 'pointer', 'pointeradd',
+ 'pointerdiff', 'pointersubtract', 'pointervalue', 'poly', 'pos',
+ 'position', 'prec', 'precision', 'pred', 'present', 'print',
+ 'priority', 'proc', 'procedure', 'procedurename', 'procname',
+ 'prod', 'ptr', 'ptradd', 'ptrdiff', 'ptrsubtract', 'ptrvalue',
+ 'put', 'putenv', 'quote', 'radix', 'raise2', 'random', 'range',
+ 'rank', 'read', 'real', 'record', 'recsize', 'recursive', 'red',
+ 'reducible', 'reentrant', 'refer', 'regional', 'reg12', 'release',
+ 'rem', 'reorder', 'repattern', 'repeat', 'replaceby2', 'reply',
+ 'reread', 'rescan', 'reserved', 'reserves', 'resignal', 'respec',
+ 'retcode', 'return', 'returns', 'reuse', 'reverse', 'revert',
+ 'rewrite', 'right', 'round', 'rounddec', 'samekey', 'scalarvarying',
+ 'scale', 'search', 'searchr', 'secs', 'secstodate', 'secstodays',
+ 'select', 'seql', 'sequential', 'serialize4', 'set', 'sign',
+ 'signal', 'signed', 'sin', 'sind', 'sinf', 'sinh', 'sis', 'size',
+ 'skip', 'snap', 'sourcefile', 'sourceline', 'sqrt', 'sqrtf',
+ 'stackaddr', 'statement', 'static', 'status', 'stg', 'stmt', 'stop',
+ 'storage', 'stream', 'strg', 'string', 'stringrange', 'stringsize',
+ 'structure', 'strz', 'subrg', 'subscriptrange', 'substr',
+ 'subtract', 'succ', 'sum', 'suppress', 'sysin', 'sysnull',
+ 'sysparm', 'sysprint', 'system', 'sysversion', 'tally', 'tan',
+ 'tand', 'tanf', 'tanh', 'task', 'then', 'thread', 'threadid',
+ 'time', 'tiny', 'title', 'to', 'total', 'tpk', 'tpm', 'transient',
+ 'translate', 'transmit', 'trim', 'trkofl', 'trunc', 'type', 'ufl',
+ 'ulength', 'ulength16', 'ulength8', 'unal', 'unaligned',
+ 'unallocated', 'unbuf', 'unbuffered', 'undefinedfile', 'underflow',
+ 'undf', 'unlock', 'unsigned', 'unspec', 'until', 'update', 'upos',
+ 'uppercase', 'upthru', 'usubstr', 'usurrogate', 'uvalid', 'uwidth',
+ 'valid', 'validdate', 'value', 'var', 'varglist', 'vargsize',
+ 'variable', 'varying', 'varyingz', 'vb', 'vbs', 'verify', 'verifyr',
+ 'vs', 'vsam', 'wait', 'wchar', 'wcharval', 'weekday', 'when',
+ 'whigh', 'while', 'widechar', 'wlow', 'write', 'xmlchar', 'y4date',
+ 'y4julian', 'y4year', 'zdiv', 'zerodivide'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '+', '-', '*', '/', '=', '<', '>', '&', '^', '|', ':', '(', ')', ';', ','
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(1 => ''),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(1 => '.'),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/plsql.php b/inc/geshi/plsql.php
index e0145362c..09f90a225 100644
--- a/inc/geshi/plsql.php
+++ b/inc/geshi/plsql.php
@@ -4,7 +4,7 @@
* -------
* Author: Victor Engmark <victor.engmark@gmail.com>
* Copyright: (c) 2006 Victor Engmark (http://l0b0.net/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/10/26
*
* Oracle 9.2 PL/SQL language file for GeSHi.
diff --git a/inc/geshi/postgresql.php b/inc/geshi/postgresql.php
index 7f89fe2a4..662fdd760 100644
--- a/inc/geshi/postgresql.php
+++ b/inc/geshi/postgresql.php
@@ -5,7 +5,7 @@
* Author: Christophe Chauvet (christophe_at_kryskool_dot_org)
* Contributors: Leif Biberg Kristensen <leif_at_solumslekt_dot_org> 2010-05-03
* Copyright: (c) 2007 Christophe Chauvet (http://kryskool.org/), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/07/20
*
* PostgreSQL language file for GeSHi.
diff --git a/inc/geshi/povray.php b/inc/geshi/povray.php
index c987a013e..c0ce35ca1 100644
--- a/inc/geshi/povray.php
+++ b/inc/geshi/povray.php
@@ -4,7 +4,7 @@
* --------
* Author: Carl Fürstenberg (azatoth@gmail.com)
* Copyright: © 2007 Carl Fürstenberg
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/07/11
*
* Povray language file for GeSHi.
diff --git a/inc/geshi/powerbuilder.php b/inc/geshi/powerbuilder.php
index ef86c242c..d3fcf615f 100644
--- a/inc/geshi/powerbuilder.php
+++ b/inc/geshi/powerbuilder.php
@@ -4,7 +4,7 @@
* ------
* Author: Doug Porter (powerbuilder.geshi@gmail.com)
* Copyright: (c) 2009 Doug Porter
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/07/13
*
* PowerBuilder (PowerScript) language file for GeSHi.
diff --git a/inc/geshi/powershell.php b/inc/geshi/powershell.php
index c90538809..bd78d7392 100644
--- a/inc/geshi/powershell.php
+++ b/inc/geshi/powershell.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Frode Aarebrot (frode@aarebrot.net)
* Copyright: (c) 2008 Frode Aarebrot (http://www.aarebrot.net)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/06/20
*
* PowerShell language file for GeSHi.
diff --git a/inc/geshi/proftpd.php b/inc/geshi/proftpd.php
new file mode 100644
index 000000000..330db4b27
--- /dev/null
+++ b/inc/geshi/proftpd.php
@@ -0,0 +1,374 @@
+<?php
+/*************************************************************************************
+ * proftpd.php
+ * ----------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2010 Benny Baumann (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/01/25
+ *
+ * ProFTPd language file for GeSHi.
+ * Words are scraped from their documentation
+ *
+ * CHANGES
+ * -------
+ * 2004/08/05 (1.0.8.10)
+ * - First Release
+ *
+ * TODO (updated 2011/01/25)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ProFTPd configuration',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ /*keywords*/
+ 1 => array(
+ //mod_auth
+ 'AccessDenyMsg', 'AccessGrantMsg', 'AnonRejectePasswords',
+ 'AnonRequirePassword', 'AuthAliasOnly', 'AuthUsingAlias',
+ 'CreateHome', 'DefaultChdir', 'DefaultRoot', 'GroupPassword',
+ 'LoginPasswordPrompt', 'MaxClients', 'MaxClientsPerClass',
+ 'MaxClientsPerHost', 'MaxClientsPerUser', 'MaxConnectionsPerHost',
+ 'MaxHostsPerUser', 'MaxLoginAttempts', 'RequireValidShell',
+ 'RootLogin', 'RootRevoke', 'TimeoutLogin', 'TimeoutSession',
+ 'UseFtpUsers', 'UserAlias', 'UserDirRoot', 'UserPassword',
+
+ //mod_auth_file
+ 'AuthGroupFile', 'AuthUserFile',
+
+ //mod_auth_pam
+ 'AuthPAM', 'AuthPAMConfig',
+
+ //mod_auth_unix
+ 'PersistentPasswd',
+
+ //mod_ban
+ 'BanControlsACLs', 'BanEngine', 'BanLog', 'BanMessage', 'BanOnEvent',
+ 'BanTable',
+
+ //mod_cap
+ 'CapabilitiesEngine', 'CapabilitiesSet',
+
+ //mod_core
+ 'Allow', 'AllowAll', 'AllowClass', 'AllowFilter',
+ 'AllowForeignAddress', 'AllowGroup', 'AllowOverride',
+ 'AllowRetrieveRestart', 'AllowStoreRestart', 'AllowUser',
+ 'AnonymousGroup', 'AuthOrder', 'Bind', 'CDPath', 'Class', 'Classes',
+ 'CommandBufferSize', 'DebugLevel', 'DefaultAddress',
+ 'DefaultServer', 'DefaultTransferMode', 'DeferWelcome', 'Define',
+ 'Deny', 'DenyAll', 'DenyClass', 'DenyFilter', 'DenyGroup',
+ 'DenyUser', 'DisplayChdir', 'DisplayConnect', 'DisplayFirstChdir',
+ 'DisplayGoAway', 'DisplayLogin', 'DisplayQuit', 'From', 'Group',
+ 'GroupOwner', 'HideFiles', 'HideGroup', 'HideNoAccess', 'HideUser',
+ 'IdentLookups', 'IgnoreHidden', 'Include', 'MasqueradeAddress',
+ 'MaxConnectionRate', 'MaxInstances', 'MultilineRFC2228', 'Order',
+ 'PassivePorts', 'PathAllowFilter', 'PathDenyFilter', 'PidFile',
+ 'Port', 'RLimitCPU', 'RLimitMemory', 'RLimitOpenFiles', 'Satisfy',
+ 'ScoreboardFile', 'ServerAdmin', 'ServerIdent', 'ServerName',
+ 'ServerType', 'SetEnv', 'SocketBindTight', 'SocketOptions',
+ 'SyslogFacility', 'SyslogLevel', 'tcpBackLog', 'tcpNoDelay',
+ 'TimeoutIdle', 'TimeoutLinger', 'TimesGMT', 'TransferLog', 'Umask',
+ 'UnsetEnv', 'UseIPv6', 'User', 'UseReverseDNS', 'UserOwner',
+ 'UseUTF8', 'WtmpLog',
+
+ //mod_ctrls_admin
+ 'AdminControlsACLs', 'AdminControlsEngine',
+
+ //mod_delay
+ 'DelayEngine', 'DelayTable',
+
+ //mod_dynmasq
+ 'DynMasqRefresh',
+
+ //mod_exec
+ 'ExecBeforeCommand', 'ExecEngine', 'ExecEnviron', 'ExecLog',
+ 'ExecOnCommand', 'ExecOnConnect', 'ExecOnError', 'ExecOnEvent',
+ 'ExecOnExit', 'ExecOnRestart', 'ExecOptions', 'ExecTimeout',
+
+ //mod_ldap
+ 'LDAPAliasDereference', 'LDAPAttr', 'LDAPAuthBinds',
+ 'LDAPDefaultAuthScheme', 'LDAPDefaultGID', 'LDAPDefaultUID',
+ 'LDAPDNInfo', 'LDAPDoAuth', 'LDAPDoGIDLookups',
+ 'LDAPDoQuotaLookups', 'LDAPDoUIDLookups',
+ 'LDAPForceGeneratedHomedir', 'LDAPForceHomedirOnDemand',
+ 'LDAPGenerateHomedir', 'LDAPGenerateHomedirPrefix',
+ 'LDAPGenerateHomedirPrefixNoUsername', 'LDAPHomedirOnDemand',
+ 'LDAPHomedirOnDemandPrefix', 'LDAPHomedirOnDemandPrefixNoUsername',
+ 'LDAPHomedirOnDemandSuffix', 'LDAPNegativeCache',
+ 'LDAPProtocolVersion', 'LDAPQueryTimeout', 'LDAPSearchScope',
+ 'LDAPServer',
+
+ //mod_load
+ 'MaxLoad',
+
+ //mod_log
+ 'AllowLogSymlinks', 'ExtendedLog', 'LogFormat', 'ServerLog',
+ 'SystemLog',
+
+ //mod_ls'
+ 'DirFakeGroup', 'DirFakeMode', 'DirFakeUser', 'ListOptions',
+ 'ShowSymlinks', 'UseGlobbing',
+
+ //mod_quotatab
+ 'QuotaDirectoryTally', 'QuotaDisplayUnits', 'QuotaEngine',
+ 'QuotaExcludeFilter', 'QuotaLimitTable', 'QuotaLock', 'QuotaLog',
+ 'QuotaOptions', 'QuotaShowQuotas', 'QuotaTallyTable',
+
+ //mod_quotatab_file
+
+ //mod_quotatab_ldap
+
+ //mod_quotatab_sql
+
+ //mod_radius
+ 'RadiusAcctServer', 'RadiusAuthServer', 'RadiusEngine',
+ 'RadiusGroupInfo', 'RadiusLog', 'RadiusNASIdentifier',
+ 'RadiusQuotaInfo', 'RadiusRealm', 'RadiusUserInfo', 'RadiusVendor',
+
+ //mod_ratio
+ 'AnonRatio', 'ByteRatioErrMsg', 'CwdRatioMsg', 'FileRatioErrMsg',
+ 'GroupRatio', 'HostRatio', 'LeechRatioMsg', 'RatioFile', 'Ratios',
+ 'RatioTempFile', 'SaveRatios', 'UserRatio',
+
+ //mod_readme
+ 'DisplayReadme',
+
+ //mod_rewrite
+ 'RewriteCondition', 'RewriteEngine', 'RewriteLock', 'RewriteLog',
+ 'RewriteMap', 'RewriteRule',
+
+ //mod_sftp
+ 'SFTPAcceptEnv', 'SFTPAuthMethods', 'SFTPAuthorizedHostKeys',
+ 'SFTPAuthorizedUserKeys', 'SFTPCiphers', 'SFTPClientMatch',
+ 'SFTPCompression', 'SFTPCryptoDevice', 'SFTPDHParamFile',
+ 'SFTPDigests', 'SFTPDisplayBanner', 'SFTPEngine', 'SFTPExtensions',
+ 'SFTPHostKey', 'SFTPKeyBlacklist', 'SFTPKeyExchanges', 'SFTPLog',
+ 'SFTPMaxChannels', 'SFTPOptions', 'SFTPPassPhraseProvider',
+ 'SFTPRekey', 'SFTPTrafficPolicy',
+
+ //mod_sftp_pam
+ 'SFTPPAMEngine', 'SFTPPAMOptions', 'SFTPPAMServiceName',
+
+ //mod_sftp_sql
+
+ //mod_shaper
+ 'ShaperAll', 'ShaperControlsACLs', 'ShaperEngine', 'ShaperLog',
+ 'ShaperSession', 'ShaperTable',
+
+ //mod_sql
+ 'SQLAuthenticate', 'SQLAuthTypes', 'SQLBackend', 'SQLConnectInfo',
+ 'SQLDefaultGID', 'SQLDefaultHomedir', 'SQLDefaultUID', 'SQLEngine',
+ 'SQLGroupInfo', 'SQLGroupWhereClause', 'SQLHomedirOnDemand',
+ 'SQLLog', 'SQLLogFile', 'SQLMinID', 'SQLMinUserGID',
+ 'SQLMinUserUID', 'SQLNamedQuery', 'SQLNegativeCache', 'SQLOptions',
+ 'SQLRatios', 'SQLRatioStats', 'SQLShowInfo', 'SQLUserInfo',
+ 'SQLUserWhereClause',
+
+ //mod_sql_passwd
+ 'SQLPasswordEncoding', 'SQLPasswordEngine', 'SQLPasswordSaltFile',
+ 'SQLPasswordUserSalt',
+
+ //mod_tls
+ 'TLSCACertificateFile', 'TLSCACertificatePath',
+ 'TLSCARevocationFile', 'TLSCARevocationPath',
+ 'TLSCertificateChainFile', 'TLSCipherSuite', 'TLSControlsACLs',
+ 'TLSCryptoDevice', 'TLSDHParamFile', 'TLSDSACertificateFile',
+ 'TLSDSACertificateKeyFile', 'TLSEngine', 'TLSLog', 'TLSOptions',
+ 'TLSPKCS12File', 'TLSPassPhraseProvider', 'TLSProtocol',
+ 'TLSRandomSeed', 'TLSRenegotiate', 'TLSRequired',
+ 'TLSRSACertificateFile', 'TLSRSACertificateKeyFile',
+ 'TLSSessionCache', 'TLSTimeoutHandshake', 'TLSVerifyClient',
+ 'TLSVerifyDepth', 'TLSVerifyOrder',
+
+ //mod_tls_shmcache
+
+ //mod_unique_id
+ 'UniqueIDEngine',
+
+ //mod_wrap
+ 'TCPAccessFiles', 'TCPAccessSyslogLevels', 'TCPGroupAccessFiles',
+ 'TCPServiceName', 'TCPUserAccessFiles',
+
+ //mod_wrap2
+ 'WrapAllowMsg', 'WrapDenyMsg', 'WrapEngine', 'WrapGroupTables',
+ 'WrapLog', 'WrapServiceName', 'WrapTables', 'WrapUserTables',
+
+ //mod_wrap2_file
+
+ //mod_wrap2_sql
+
+ //mod_xfer
+ 'AllowOverwrite', 'DeleteAbortedStores', 'DisplayFileTransfer',
+ 'HiddenStor', 'HiddenStores', 'MaxRetrieveFileSize',
+ 'MaxStoreFileSize', 'StoreUniquePrefix', 'TimeoutNoTransfer',
+ 'TimeoutStalled', 'TransferRate', 'UseSendfile',
+
+ //unknown
+ 'ScoreboardPath', 'ScoreboardScrub'
+ ),
+ /*keywords 3*/
+ 3 => array(
+ //mod_core
+ 'Anonymous',
+ 'Class',
+ 'Directory',
+ 'IfDefine',
+ 'IfModule',
+ 'Limit',
+ 'VirtualHost',
+
+ //mod_ifsession
+ 'IfClass', 'IfGroup', 'IfUser',
+
+ //mod_version
+ 'IfVersion'
+ ),
+ /*permissions*/
+ 4 => array(
+ //mod_core
+ 'ALL',
+ 'CDUP',
+ 'CMD',
+ 'CWD',
+ 'DELE',
+ 'DIRS',
+ 'LOGIN',
+ 'MKD',
+ 'READ',
+ 'RETR',
+ 'RMD',
+ 'RNFR',
+ 'RNTO',
+ 'STOR',
+ 'WRITE',
+ 'XCWD',
+ 'XMKD',
+ 'XRMD',
+
+ //mod_copy
+ 'SITE_CPFR', 'SITE_CPTO',
+
+ //mod_quotatab
+ 'SITE_QUOTA',
+
+ //mod_site
+ 'SITE_HELP', 'SITE_CHMOD', 'SITE_CHGRP',
+
+ //mod_site_misc
+ 'SITE_MKDIR', 'SITE_RMDIR', 'SITE_SYMLINK', 'SITE_UTIME',
+ ),
+ /*keywords 2*/
+ 2 => array(
+ 'all','on','off','yes','no',
+ 'standalone', 'inetd',
+ 'default', 'auth', 'write',
+ 'internet', 'local', 'limit', 'ip',
+ 'from'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '+', '-'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #000000; font-weight:bold;',
+ 4 => 'color: #000080; font-weight:bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.google.com/search?hl=en&amp;q={FNAMEL}+site:www.proftpd.org+inurl:docs&amp;btnI=I%27m%20Feeling%20Lucky',
+ 2 => '',
+ 3 => 'http://www.google.com/search?hl=en&amp;q={FNAMEL}+site:www.proftpd.org+inurl:docs&amp;btnI=I%27m%20Feeling%20Lucky',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ 'SYMBOLS' => GESHI_NEVER
+ ),
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\s)(?<!=)',
+ 'DISALLOWED_AFTER' => '(?!\+)(?!\w)',
+ ),
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&lt;|&lt;\/)',
+ 'DISALLOWED_AFTER' => '(?=\s|\/|&gt;)',
+ ),
+ 4 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\s)(?<!=)',
+ 'DISALLOWED_AFTER' => '(?!\+)(?=\/|(?:\s+\w+)*\s*&gt;)',
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/progress.php b/inc/geshi/progress.php
index 90c3bf0fa..79900261b 100644
--- a/inc/geshi/progress.php
+++ b/inc/geshi/progress.php
@@ -4,7 +4,7 @@
* --------
* Author: Marco Aurelio de Pasqual (marcop@hdi.com.br)
* Copyright: (c) 2008 Marco Aurelio de Pasqual, Benny Baumann (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/07/11
*
* Progress language file for GeSHi.
diff --git a/inc/geshi/prolog.php b/inc/geshi/prolog.php
index 4dd01ff7e..a106a4e4e 100644
--- a/inc/geshi/prolog.php
+++ b/inc/geshi/prolog.php
@@ -4,7 +4,7 @@
* --------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/10/02
*
* Prolog language file for GeSHi.
diff --git a/inc/geshi/properties.php b/inc/geshi/properties.php
index 9fc8b8da4..e1317b227 100644
--- a/inc/geshi/properties.php
+++ b/inc/geshi/properties.php
@@ -4,7 +4,7 @@
* --------
* Author: Edy Hinzen
* Copyright: (c) 2009 Edy Hinzen
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/04/03
*
* Property language file for GeSHi.
diff --git a/inc/geshi/providex.php b/inc/geshi/providex.php
index 0352ac2a1..1e735bd0f 100644
--- a/inc/geshi/providex.php
+++ b/inc/geshi/providex.php
@@ -4,7 +4,7 @@
* ----------
* Author: Jeff Wilder (jeff@coastallogix.com)
* Copyright: (c) 2008 Coastal Logix (http://www.coastallogix.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/10/18
*
* ProvideX language file for GeSHi.
diff --git a/inc/geshi/purebasic.php b/inc/geshi/purebasic.php
index b24986f57..d78ffe97b 100644
--- a/inc/geshi/purebasic.php
+++ b/inc/geshi/purebasic.php
@@ -4,7 +4,7 @@
* -------
* Author: GuShH
* Copyright: (c) 2009 Gustavo Julio Fiorenza
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 13/06/2009
*
* PureBasic language file for GeSHi.
diff --git a/inc/geshi/pycon.php b/inc/geshi/pycon.php
new file mode 100644
index 000000000..ac2b34d07
--- /dev/null
+++ b/inc/geshi/pycon.php
@@ -0,0 +1,64 @@
+<?php
+/*************************************************************************************
+ * python.php
+ * ----------
+ * Author: Roberto Rossi (rsoftware@altervista.org)
+ * Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/30
+ *
+ * Python language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/12/18
+ * - Added missing functions and keywords. Also added two new Python 3.0 types. SF#2441839
+ * 2005/05/26
+ * - Modifications by Tim (tim@skreak.com): added more keyword categories, tweaked colors
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/08/30 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+//This
+require(dirname(__FILE__).'/python.php');
+
+$language_data['LANG_NAME'] = 'Python (console mode)';
+
+$language_data['STRICT_MODE_APPLIES'] = GESHI_ALWAYS;
+$language_data['SCRIPT_DELIMITERS'][-1] = '/^(>>>).*?$(?:\n\.\.\..*?$)*($)/m';
+$language_data['HIGHLIGHT_STRICT_BLOCK'][-1] = true;
+
+$language_data['STYLES']['SCRIPT'][-1] = 'color: #222222;';
+
+if(!isset($language_data['COMMENT_REGEXP'])) {
+ $language_data['COMMENT_REGEXP'] = array();
+}
+
+$language_data['COMMENT_REGEXP'][-1] = '/(?:^|\A\s)(?:>>>|\.\.\.)/m';
+$language_data['STYLES']['COMMENTS'][-1] = 'color: #444444;';
+
+?> \ No newline at end of file
diff --git a/inc/geshi/pys60.php b/inc/geshi/pys60.php
new file mode 100644
index 000000000..59c67fac7
--- /dev/null
+++ b/inc/geshi/pys60.php
@@ -0,0 +1,273 @@
+<?php
+/**************************************************************************************
+ * pys60.php
+ * ----------
+ * Author: Sohan Basak (ronnie.basak96 @gmail.com)
+ * Copyright: (c) 2012 Sohan Basak (http://tothepower.tk), Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/05/03
+ *
+ * Python for S60 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * No Changes Till Date
+ *
+ * The python.php file is extended to pys60.php with required modifications
+ *
+ * NOTES
+ *
+ * -I have kept the ":" in Reserved chars, so that it gets highlighted differently than brackets and/or symbols
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Python for S60',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'", '"""',"'''",'""','""'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+
+ /*
+ ** Set 1: reserved words
+ ** http://python.org/doc/current/ref/keywords.html
+ */
+ 1 => array(
+ 'and', 'del', 'for', 'is', 'raise', 'assert', 'elif', 'from', 'lambda', 'return', 'break',
+ 'else', 'global', 'not', 'try', 'class', 'except', 'if', 'or', 'while', 'continue', 'exec',
+ 'import', 'pass', 'yield', 'def', 'finally', 'in', 'print', "<<", ">>", "as"
+ ),
+
+ /*
+ ** Set 2: builtins
+ ** http://python.org/doc/current/lib/built-in-funcs.html
+ */
+ 2 => array(
+ '__import__', 'abs', 'basestring', 'bool', 'callable', 'chr', 'classmethod', 'cmp',
+ 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile',
+ 'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help',
+ 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list', 'locals',
+ 'long', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'range',
+ 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
+ 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode',
+ 'vars', 'xrange', 'zip',
+ // Built-in constants: http://python.org/doc/current/lib/node35.html
+ 'False', 'True', 'None', 'NotImplemented', 'Ellipsis',
+ // Built-in Exceptions: http://python.org/doc/current/lib/module-exceptions.html
+ 'Exception', 'StandardError', 'ArithmeticError', 'LookupError', 'EnvironmentError',
+ 'AssertionError', 'AttributeError', 'EOFError', 'FloatingPointError', 'IOError',
+ 'ImportError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'MemoryError', 'NameError',
+ 'NotImplementedError', 'OSError', 'OverflowError', 'ReferenceError', 'RuntimeError',
+ 'StopIteration', 'SyntaxError', 'SystemError', 'SystemExit', 'TypeError',
+ 'UnboundlocalError', 'UnicodeError', 'UnicodeEncodeError', 'UnicodeDecodeError',
+ 'UnicodeTranslateError', 'ValueError', 'WindowsError', 'ZeroDivisionError', 'Warning',
+ 'UserWarning', 'DeprecationWarning', 'PendingDeprecationWarning', 'SyntaxWarning',
+ 'RuntimeWarning', 'FutureWarning',
+ //Symbian Errors
+ "SymbianError", "KernelError",
+ // self: this is a common python convention (but not a reserved word)
+ 'self'
+ ),
+
+ /*
+ ** Set 3: standard library
+ ** http://python.org/doc/current/lib/modindex.html
+ */
+ 3 => array(
+ '__builtin__', '__future__', '__main__', '_winreg', 'aifc', 'AL', 'al', 'anydbm',
+ 'array', 'asynchat', 'asyncore', 'atexit', 'audioop', 'base64', 'BaseHTTPServer',
+ 'Bastion', 'binascii', 'binhex', 'bisect', 'bsddb', 'bz2', 'calendar', 'cd', 'cgi',
+ 'CGIHTTPServer', 'cgitb', 'chunk', 'cmath', 'cmd', 'code', 'codecs', 'codeop',
+ 'collections', 'colorsys', 'commands', 'compileall', 'compiler',
+ 'ConfigParser', 'Cookie', 'cookielib', 'copy', 'copy_reg', 'cPickle', 'crypt',
+ 'cStringIO', 'csv', 'curses', 'datetime', 'dbhash', 'dbm', 'decimal', 'DEVICE',
+ 'difflib', 'dircache', 'dis', 'distutils', 'dl', 'doctest', 'DocXMLRPCServer', 'dumbdbm',
+ 'dummy_thread', 'dummy_threading', 'email', 'encodings', 'errno', 'exceptions', 'fcntl',
+ 'filecmp', 'fileinput', 'FL', 'fl', 'flp', 'fm', 'fnmatch', 'formatter', 'fpectl',
+ 'fpformat', 'ftplib', 'gc', 'gdbm', 'getopt', 'getpass', 'gettext', 'GL', 'gl', 'glob',
+ 'gopherlib', 'grp', 'gzip', 'heapq', 'hmac', 'hotshot', 'htmlentitydefs', 'htmllib',
+ 'HTMLParser', 'httplib', 'imageop', 'imaplib', 'imgfile', 'imghdr', 'imp', 'inspect',
+ 'itertools', 'jpeg', 'keyword', 'linecache', 'locale', 'logging', 'mailbox', 'mailcap',
+ 'marshal', 'math', 'md5', 'mhlib', 'mimetools', 'mimetypes', 'MimeWriter', 'mimify',
+ 'mmap', 'msvcrt', 'multifile', 'mutex', 'netrc', 'new', 'nis', 'nntplib', 'operator',
+ 'optparse', 'os', 'ossaudiodev', 'parser', 'pdb', 'pickle', 'pickletools', 'pipes',
+ 'pkgutil', 'platform', 'popen2', 'poplib', 'posix', 'posixfile', 'pprint', 'profile',
+ 'pstats', 'pty', 'pwd', 'py_compile', 'pyclbr', 'pydoc', 'Queue', 'quopri', 'random',
+ 're', 'readline', 'resource', 'rexec', 'rgbimg', 'rlcompleter',
+ 'robotparser', 'sched', 'ScrolledText', 'select', 'sets', 'sgmllib', 'sha', 'shelve',
+ 'shlex', 'shutil', 'signal', 'SimpleHTTPServer', 'SimpleXMLRPCServer', 'site', 'smtpd',
+ 'smtplib', 'sndhdr', 'socket', 'SocketServer', 'stat', 'statcache', 'statvfs', 'string',
+ 'StringIO', 'stringprep', 'struct', 'subprocess', 'sunau', 'SUNAUDIODEV', 'sunaudiodev',
+ 'symbol', 'sys', 'syslog', 'tabnanny', 'tarfile', 'telnetlib', 'tempfile', 'termios',
+ 'test', 'textwrap', 'thread', 'threading', 'time', 'timeit', 'Tix', 'Tkinter', 'token',
+ 'tokenize', 'traceback', 'tty', 'turtle', 'types', 'unicodedata', 'unittest', 'urllib2',
+ 'urllib', 'urlparse', 'user', 'UserDict', 'UserList', 'UserString', 'uu', 'warnings',
+ 'wave', 'weakref', 'webbrowser', 'whichdb', 'whrandom', 'winsound', 'xdrlib', 'xml',
+ 'xmllib', 'xmlrpclib', 'zipfile', 'zipimport', 'zlib', "os.path", "sys.path",
+
+ //PythonS60 Standard Library
+ //http://pys60.garage.maemo.org/doc/s60/
+ //These are the standard modules in the archive
+
+ "appuifw", "globalui","e32", "telephone", "aosocket", "btsocket",
+ "sysinfo","camera","graphics","keycapture","key_codes","topwindow", "gles",
+ "glcanvas","sensor", "audio","messaging", "inbox","location","positioning",
+ "contacts", "e32calendar", "e32db","e32dbm","logs","scriptext",
+ "series60_console",
+
+ //These are external but very often usable modules
+
+ "appuifw2","ArchetypeUI","elementtree","lightblue",
+ "activaprofile","Adjustor","akntextutils","aosocketnativenew",
+ "appreciation","applicationmanager","appswitch","atextit","bt_teror","btconsole",
+ "btswitch","cElementTree","cenrep","cerealizer","cl_gui","clipboard",
+ "clipboard_CHN","debugger","decompile2",
+ "dir_iter","download","easydb","ECenrep","Edit_find","efeature","elocation","envy",
+ "EProfile","erestart","error","esyagent","Execwap","exprofile","fastcamera",
+ "feature","fgimage","filebrowser","firmware","fold","fonts","fraction","FTP",
+ "ftplibnew","fy_manager","fy_menu","gles_utils","gps_location","hack",
+ "HTML2TXT","iapconnect","icon_image","image_decoder",
+ "ini","interactive_console","inting","key_modifiers","key_tricks","keypress",
+ "landmarks","lite_fm","locationacq","locationrequestor",
+ "logo","markupbase","mbm","mbm2","minidb","miniinfo","MISC",
+ "misty","Msg","ntpath","odict","Paintbox","pathinfo","pexif","pickcolor",
+ "powlite_fm","powlite_fm2","powlite_fm3","powlite_fme","prgbar","prodb",
+ "profileengine","progressbar","progressbartw","progressnotes",
+ "ProgressBarTW2","proshivka","py_upload","pyConnection","PyFileMan",
+ "pykeylock","PyPyc","pyqq","pys60crypto","pys60usb","rfc822",
+ "RUSOS","scmk","scrollpage","SISFIELDS","SISFIELD","sisfile",
+ "SISINFO","sisreader","Sistools","smidi","smsreject","speechy","sre_compile",
+ "sre_constants","sre_parse","sre","sysagent","syslang","TextMan",
+ "textrenderer","TextWrap","topwind","tsocket","uikludge","uikludges","uitricks",
+ "walkfile","wallpaper","wfm_lite",
+ "wif_keys","wif","window","wlanmgmt","wlantools","wt_color","wt_requesters",
+ "zhkey",
+
+ //These are recent additions
+ "miffile"
+ ),
+
+ /*
+ ** Set 4: special methods
+ ** http://python.org/doc/current/ref/specialnames.html
+ */
+ 4 => array(
+ ///*
+ //// Iterator types: http://python.org/doc/current/lib/typeiter.html
+ //'__iter__', 'next',
+ //// String types: http://python.org/doc/current/lib/string-methods.html
+ //'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs',
+ //'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle',
+ //'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 'rfind', 'rindex', 'rjust',
+ //'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
+ //'translate', 'upper', 'zfill',
+ // */
+
+ // Basic customization: http://python.org/doc/current/ref/customization.html
+ '__new__', '__init__', '__del__', '__repr__', '__str__',
+ '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__cmp__', '__rcmp__',
+ '__hash__', '__nonzero__', '__unicode__', '__dict__',
+ // Attribute access: http://python.org/doc/current/ref/attribute-access.html
+ '__setattr__', '__delattr__', '__getattr__', '__getattribute__', '__get__', '__set__',
+ '__delete__', '__slots__',
+ // Class creation, callable objects
+ '__metaclass__', '__call__',
+ // Container types: http://python.org/doc/current/ref/sequence-types.html
+ '__len__', '__getitem__', '__setitem__', '__delitem__', '__iter__', '__contains__',
+ '__getslice__', '__setslice__', '__delslice__',
+ // Numeric types: http://python.org/doc/current/ref/numeric-types.html
+ '__abs__','__add__','__and__','__coerce__','__div__','__divmod__','__float__',
+ '__hex__','__iadd__','__isub__','__imod__','__idiv__','__ipow__','__iand__',
+ '__ior__','__ixor__', '__ilshift__','__irshift__','__invert__','__int__',
+ '__long__','__lshift__',
+ '__mod__','__mul__','__neg__','__oct__','__or__','__pos__','__pow__',
+ '__radd__','__rdiv__','__rdivmod__','__rmod__','__rpow__','__rlshift__','__rrshift__',
+ '__rshift__','__rsub__','__rmul__','__rand__','__rxor__','__ror__',
+ '__sub__','__xor__'
+ )
+
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '*', '&', '%', '!', ';', '<', '>', '?', '`'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #006000;font-weight:bold;', // Reserved
+ 2 => 'color: #800950;font-size:105%', // Built-ins + self
+ 3 => 'color: #003399;font-size:106%', // Standard lib
+ 4 => 'color: #0000cd;' // Special methods
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style:italic;font-size:92%',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #930; font-weight: bold;font-size:105%'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: maroon;font-size:102%;padding:2px'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #666;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #2356F8;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: navy;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66ccFF;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/inc/geshi/python.php b/inc/geshi/python.php
index 1be7e2953..ec9b17e6f 100644
--- a/inc/geshi/python.php
+++ b/inc/geshi/python.php
@@ -4,7 +4,7 @@
* ----------
* Author: Roberto Rossi (rsoftware@altervista.org)
* Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/30
*
* Python language file for GeSHi.
@@ -49,8 +49,13 @@ $language_data = array (
'COMMENT_MULTI' => array(),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
//Longest quotemarks ALWAYS first
- 'QUOTEMARKS' => array('"""', '"', "'"),
+ 'QUOTEMARKS' => array('"""', "'''", '"', "'"),
'ESCAPE_CHAR' => '\\',
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX_0O | GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_NONSCI | GESHI_NUMBER_FLT_NONSCI_F |
+ GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
'KEYWORDS' => array(
/*
@@ -60,7 +65,7 @@ $language_data = array (
1 => array(
'and', 'del', 'for', 'is', 'raise', 'assert', 'elif', 'from', 'lambda', 'return', 'break',
'else', 'global', 'not', 'try', 'class', 'except', 'if', 'or', 'while', 'continue', 'exec',
- 'import', 'pass', 'yield', 'def', 'finally', 'in', 'print', 'with', 'as'
+ 'import', 'pass', 'yield', 'def', 'finally', 'in', 'print', 'with', 'as', 'nonlocal'
),
/*
@@ -172,7 +177,9 @@ $language_data = array (
)
),
'SYMBOLS' => array(
- '(', ')', '[', ']', '{', '}', '*', '&', '%', '!', ';', '<', '>', '?', '`'
+ '<', '>', '=', '!', '<=', '>=', //·comparison·operators
+ '~', '@', //·unary·operators
+ ';', ',' //·statement·separator
),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
@@ -234,4 +241,4 @@ $language_data = array (
)
);
-?>
+?> \ No newline at end of file
diff --git a/inc/geshi/q.php b/inc/geshi/q.php
index 9629ded4a..ade9928d0 100644
--- a/inc/geshi/q.php
+++ b/inc/geshi/q.php
@@ -4,7 +4,7 @@
* -----
* Author: Ian Roddis (ian.roddis@proteanmind.net)
* Copyright: (c) 2008 Ian Roddis (http://proteanmind.net)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/01/21
*
* q/kdb+ language file for GeSHi.
diff --git a/inc/geshi/qbasic.php b/inc/geshi/qbasic.php
index da4372258..3345e3c69 100644
--- a/inc/geshi/qbasic.php
+++ b/inc/geshi/qbasic.php
@@ -4,7 +4,7 @@
* ----------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/20
*
* QBasic/QuickBASIC language file for GeSHi.
@@ -62,6 +62,10 @@ $language_data = array (
'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
'QUOTEMARKS' => array('"'),
'ESCAPE_CHAR' => '',
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT |
+ GESHI_NUMBER_FLT_SCI_ZERO,
'KEYWORDS' => array(
1 => array(
'DO', 'LOOP', 'WHILE', 'WEND', 'THEN', 'ELSE', 'ELSEIF', 'IF',
diff --git a/inc/geshi/rails.php b/inc/geshi/rails.php
index 64d83ea16..65ddee884 100644
--- a/inc/geshi/rails.php
+++ b/inc/geshi/rails.php
@@ -4,7 +4,7 @@
* ---------
* Author: Moises Deniz
* Copyright: (c) 2005 Moises Deniz
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/03/21
*
* Ruby (with Ruby on Rails Framework) language file for GeSHi.
diff --git a/inc/geshi/rebol.php b/inc/geshi/rebol.php
index a3889eec9..ea86c21cd 100644
--- a/inc/geshi/rebol.php
+++ b/inc/geshi/rebol.php
@@ -4,7 +4,7 @@
* --------
* Author: Lecanu Guillaume (Guillaume@LyA.fr)
* Copyright: (c) 2004-2005 Lecanu Guillaume (Guillaume@LyA.fr)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/12/22
*
* Rebol language file for GeSHi.
diff --git a/inc/geshi/reg.php b/inc/geshi/reg.php
index bb2e845f3..157b2bd24 100644
--- a/inc/geshi/reg.php
+++ b/inc/geshi/reg.php
@@ -4,7 +4,7 @@
* -------
* Author: Sean Hanna (smokingrope@gmail.com)
* Copyright: (c) 2006 Sean Hanna
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 03/15/2006
*
* Microsoft Registry Editor language file for GeSHi.
diff --git a/inc/geshi/rexx.php b/inc/geshi/rexx.php
new file mode 100644
index 000000000..b3cb93229
--- /dev/null
+++ b/inc/geshi/rexx.php
@@ -0,0 +1,162 @@
+<?php
+/*************************************************************************************
+ * rexx.php
+ * ---------------------------------
+ * Author: Jon Wolfers (sahananda@windhorse.biz)
+ * Contributors:
+ * - Walter Pachl (pachl@chello.at)
+ * Copyright: (c) 2008 Jon Wolfers, (c) 2012 Walter Pachl
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/01/07
+ *
+ * Rexx language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/07/29 (1.0.0)
+ * - tried to get it syntactically right
+ *
+ * TODO (updated 2012/07/29)
+ * -------------------------
+ * - Get it working on rosettacode.org
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'rexx',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'address', 'arg', 'attribute', 'call', 'constant', 'do',
+ 'drop', 'exit', 'forward', 'if',
+ 'interpret', 'iterate', 'leave', 'loop', 'nop', 'numeric',
+ 'options', 'parse', 'procedure', 'pull', 'push', 'queue',
+ 'raise', 'return', 'say', 'select', 'signal', 'trace'
+ ),
+ 2 => array(
+ 'by', 'digits', 'engineering', 'error', 'expose',
+ 'failure', 'for', 'forever', 'form', 'fuzz', 'halt',
+ 'name', 'novalue', 'off', 'on', 'over', 'scientific', 'source',
+ 'syntax', 'to', 'until', 'upper', 'version',
+ 'while', 'with'
+ ),
+ 3 => array(
+ 'else', 'end', 'otherwise', 'then', 'when'
+ ),
+ 4 => array(
+ 'rc', 'result', 'sigl'
+ ),
+ 5 => array(
+ 'placeholderforoorexxdirectives'
+ ),
+ 6 => array(
+ 'abbrev', 'abs', 'beep', 'bitand', 'bitor',
+ 'bitxor', 'b2x', 'center', 'centre', 'changestr', 'charin',
+ 'charout', 'chars', 'compare', 'condition', 'copies',
+ 'countstr', 'c2d', 'c2x', 'datatype', 'date', 'delstr',
+ 'delword', 'directory', 'd2c', 'd2x', 'endlocal',
+ 'errortext', 'filespec', 'format', 'insert',
+ 'lastpos', 'left', 'length', 'linein', 'lineout', 'lines',
+ 'lower', 'max', 'min', 'overlay', 'pos', 'queued', 'random',
+ 'reverse', 'right', 'rxfuncadd', 'rxfuncdrop', 'rxfuncquery',
+ 'rxqueue', 'setlocal', 'sign', 'sourceline', 'space',
+ 'stream', 'strip', 'substr', 'subword', 'symbol', 'time',
+ 'translate', 'trunc', 'userid', 'value',
+ 'var', 'verify', 'word', 'wordindex', 'wordlength', 'wordpos',
+ 'words', 'xrange', 'x2b', 'x2c', 'x2d'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '<', '>', '=', '+', '-', '*', '**', '/', '|', '%', '^', '&', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #ff0000; font-weight: bold;',
+ 3 => 'color: #00ff00; font-weight: bold;',
+ 4 => 'color: #0000ff; font-weight: bold;',
+ 5 => 'color: #880088; font-weight: bold;',
+ 6 => 'color: #888800; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 'MULTI' => 'color: #808080;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/inc/geshi/robots.php b/inc/geshi/robots.php
index baf286b7f..0b75f7111 100644
--- a/inc/geshi/robots.php
+++ b/inc/geshi/robots.php
@@ -4,7 +4,7 @@
* --------
* Author: Christian Lescuyer (cl@goelette.net)
* Copyright: (c) 2006 Christian Lescuyer http://xtian.goelette.info
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/02/17
*
* robots.txt language file for GeSHi.
diff --git a/inc/geshi/rpmspec.php b/inc/geshi/rpmspec.php
index 96dc9556f..fd6a561f8 100644
--- a/inc/geshi/rpmspec.php
+++ b/inc/geshi/rpmspec.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Paul Grinberg (gri6507 TA unity-linux TOD org)
* Copyright: (c) 2010 Paul Grinberg
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/04/27
*
* RPM Spec language file for GeSHi.
diff --git a/inc/geshi/rsplus.php b/inc/geshi/rsplus.php
index b73f5ea77..e8a4e722b 100644
--- a/inc/geshi/rsplus.php
+++ b/inc/geshi/rsplus.php
@@ -5,8 +5,9 @@
* Author: Ron Fredericks (ronf@LectureMaker.com)
* Contributors:
* - Benilton Carvalho (beniltoncarvalho@gmail.com)
+ * - Fernando Henrique Ferraz Pereira da Rosa (mentus@gmail.com)
* Copyright: (c) 2009 Ron Fredericks (http://www.LectureMaker.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/03/28
*
* R language file for GeSHi.
@@ -440,18 +441,17 @@ $language_data = array (
0 => 'color:#A020F0;'
),
'SCRIPT' => array(
- 0 => ''
- )
+ 0 => '' )
),
'URLS' => array(
1 => '',
- 2 => 'http://astrostatistics.psu.edu/su07/R/html/graphics/html/{FNAME}.html', // http://sekhon.berkeley.edu/library/graphics/html/{FNAME}.html
- 3 => 'http://astrostatistics.psu.edu/su07/R/html/stats/html/Normal.html', // http://sekhon.berkeley.edu/library/stats/html/Normal.html
- 4 => 'http://astrostatistics.psu.edu/su07/R/html/stats/html/{FNAME}.html', // http://sekhon.berkeley.edu/library/stats/html/{FNAME}.html
- 5 => 'http://astrostatistics.psu.edu/su07/R/html/stats/html/summary.lm.html', // http://sekhon.berkeley.edu/library/stats/html/summary.lm.html
- 6 => 'http://astrostatistics.psu.edu/su07/R/html/base/html/Log.html', // http://sekhon.berkeley.edu/library/base/html/Log.html
- 7 => '',
- 8 => ''
+ 2 => 'http://stat.ethz.ch/R-manual/R-devel/library/base/html/{FNAME}.html', // Base Package
+ 3 => 'http://stat.ethz.ch/R-manual/R-devel/library/datasets/html/{FNAME}.html', // Datasets
+ 4 => 'http://stat.ethz.ch/R-manual/R-devel/library/graphics/html/{FNAME}.html', // Graphics Package
+ 5 => 'http://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/{FNAME}.html', // grDevices
+ 6 => 'http://stat.ethz.ch/R-manual/R-devel/library/methods/html/{FNAME}.html', // methods
+ 7 => 'http://stat.ethz.ch/R-manual/R-devel/library/stats/html/{FNAME}.html', // stats
+ 8 => 'http://stat.ethz.ch/R-manual/R-devel/library/utils/html/{FNAME}.html' // utils
),
'OOLANG' => true,
'OBJECT_SPLITTERS' => array(
diff --git a/inc/geshi/ruby.php b/inc/geshi/ruby.php
index 47ecbb2e2..f6eb1b1e3 100644
--- a/inc/geshi/ruby.php
+++ b/inc/geshi/ruby.php
@@ -4,7 +4,7 @@
* --------
* Author: Moises Deniz
* Copyright: (c) 2007 Moises Deniz
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/03/21
*
* Ruby language file for GeSHi.
diff --git a/inc/geshi/sas.php b/inc/geshi/sas.php
index c4d426fa0..dbf95a14e 100644
--- a/inc/geshi/sas.php
+++ b/inc/geshi/sas.php
@@ -4,7 +4,7 @@
* -------
* Author: Galen Johnson (solitaryr@gmail.com)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/12/27
*
* SAS language file for GeSHi. Based on the sas vim file.
@@ -44,7 +44,7 @@
$language_data = array (
'LANG_NAME' => 'SAS',
'COMMENT_SINGLE' => array(),
- 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_MULTI' => array('/*' => '*/', '*' => ';'),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array("'", '"'),
'ESCAPE_CHAR' => '\\',
@@ -287,4 +287,4 @@ $language_data = array (
)
);
-?>
+?> \ No newline at end of file
diff --git a/inc/geshi/scala.php b/inc/geshi/scala.php
index 202c06c83..405f59de0 100644
--- a/inc/geshi/scala.php
+++ b/inc/geshi/scala.php
@@ -4,7 +4,7 @@
* ----------
* Author: Franco Lombardo (franco@francolombardo.net)
* Copyright: (c) 2008 Franco Lombardo, Benny Baumann
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/02/08
*
* Scala language file for GeSHi.
@@ -41,9 +41,20 @@ $language_data = array (
'LANG_NAME' => 'Scala',
'COMMENT_SINGLE' => array(1 => '//'),
'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(2 => "/\\'(?!\w\\'|\\\\)\w+(?=\s)/"),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
- 'QUOTEMARKS' => array("'", '"'),
+ 'QUOTEMARKS' => array("'",'"'),
'ESCAPE_CHAR' => '\\',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[nfrtv\$\"\n\\\\]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{1,2}#i",
+ //Hexadecimal Char Specs (unicode)
+ 3 => "#\\\\u[\da-fA-F]{1,4}#",
+ //Hexadecimal Char Specs (Extended Unicode)
+ 4 => "#\\\\U[\da-fA-F]{1,8}#",
+ ),
'KEYWORDS' => array(
1 => array(
'abstract', 'case', 'catch', 'class', 'def',
@@ -75,11 +86,16 @@ $language_data = array (
2 => 'color: #9999cc; font-weight: bold;',
),
'COMMENTS' => array(
- 1=> 'color: #008000; font-style: italic;',
+ 1 => 'color: #008000; font-style: italic;',
+ 2 => 'color: #CC66FF;',
'MULTI' => 'color: #00ff00; font-style: italic;'
),
'ESCAPE_CHAR' => array(
- 0 => 'color: #0000ff; font-weight: bold;'
+ 0 => 'color: #6666ff; font-weight: bold;',
+ 1 => 'color: #6666ff; font-weight: bold;',
+ 2 => 'color: #5555ff; font-weight: bold;',
+ 3 => 'color: #4444ff; font-weight: bold;',
+ 4 => 'color: #3333ff; font-weight: bold;'
),
'BRACKETS' => array(
0 => 'color: #F78811;'
@@ -119,4 +135,4 @@ $language_data = array (
)
);
-?>
+?> \ No newline at end of file
diff --git a/inc/geshi/scheme.php b/inc/geshi/scheme.php
index 2e2430bff..a84b90809 100644
--- a/inc/geshi/scheme.php
+++ b/inc/geshi/scheme.php
@@ -4,7 +4,7 @@
* ----------
* Author: Jon Raphaelson (jonraphaelson@gmail.com)
* Copyright: (c) 2005 Jon Raphaelson, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/30
*
* Scheme language file for GeSHi.
diff --git a/inc/geshi/scilab.php b/inc/geshi/scilab.php
index d1ff6fc16..f011497dd 100644
--- a/inc/geshi/scilab.php
+++ b/inc/geshi/scilab.php
@@ -4,7 +4,7 @@
* --------
* Author: Christophe David (geshi@christophedavid.org)
* Copyright: (c) 2008 Christophe David (geshi@christophedavid.org)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/08/04
*
* SciLab language file for GeSHi.
diff --git a/inc/geshi/sdlbasic.php b/inc/geshi/sdlbasic.php
index 876dc09a6..381161fdf 100644
--- a/inc/geshi/sdlbasic.php
+++ b/inc/geshi/sdlbasic.php
@@ -4,7 +4,7 @@
* ------------
* Author: Roberto Rossi
* Copyright: (c) 2005 Roberto Rossi (http://rsoftware.altervista.org)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/08/19
*
* sdlBasic (http://sdlbasic.sf.net) language file for GeSHi.
diff --git a/inc/geshi/smalltalk.php b/inc/geshi/smalltalk.php
index b475ad711..5b61badaf 100644
--- a/inc/geshi/smalltalk.php
+++ b/inc/geshi/smalltalk.php
@@ -4,7 +4,7 @@
* --------
* Author: Bananeweizen (Bananeweizen@gmx.de)
* Copyright: (c) 2005 Bananeweizen (www.bananeweizen.de)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/03/27
*
* Smalltalk language file for GeSHi.
diff --git a/inc/geshi/smarty.php b/inc/geshi/smarty.php
index 7f4489289..86e9d44c0 100644
--- a/inc/geshi/smarty.php
+++ b/inc/geshi/smarty.php
@@ -4,7 +4,7 @@
* ----------
* Author: Alan Juden (alan@judenware.org)
* Copyright: (c) 2004 Alan Juden, Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/07/10
*
* Smarty template language file for GeSHi.
diff --git a/inc/geshi/spark.php b/inc/geshi/spark.php
new file mode 100644
index 000000000..0284a1a47
--- /dev/null
+++ b/inc/geshi/spark.php
@@ -0,0 +1,132 @@
+<?php
+/*************************************************************************************
+ * ada.php
+ * -------
+ * Author: Phil Thornley (tux@inmail.cz)
+ * Copyright: (c) 2004 Phil Thornley (http://www.sparksure.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/08/22
+ *
+ * SPARK language file for GeSHi.
+ *
+ * Created by modifying Ada file version 1.0.2
+ * Words are from SciTe configuration file
+ *
+ * CHANGES
+ * -------
+ * 2010/08/28 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2010/08/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'SPARK',
+ 'COMMENT_SINGLE' => array(1 => '--', 2 => '--#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'begin', 'declare', 'do', 'else', 'elsif', 'exception', 'for', 'if',
+ 'is', 'loop', 'while', 'then', 'end', 'select', 'case', 'until',
+ 'goto', 'return'
+ ),
+ 2 => array(
+ 'abs', 'and', 'at', 'mod', 'not', 'or', 'rem', 'xor'
+ ),
+ 3 => array(
+ 'abort', 'abstract', 'accept', 'access', 'aliased', 'all', 'array',
+ 'body', 'constant', 'delay', 'delta', 'digits', 'entry', 'exit',
+ 'function', 'generic', 'in', 'interface', 'limited', 'new', 'null',
+ 'of', 'others', 'out', 'overriding', 'package', 'pragma', 'private',
+ 'procedure', 'protected', 'raise', 'range', 'record', 'renames',
+ 'requeue', 'reverse', 'separate', 'subtype', 'synchronized',
+ 'tagged', 'task', 'terminate', 'type', 'use', 'when', 'with'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #46aa03; font-weight:bold;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ 2 => 'color: #adadad; font-style: italic; font-weight: bold;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/sparql.php b/inc/geshi/sparql.php
new file mode 100644
index 000000000..282165a01
--- /dev/null
+++ b/inc/geshi/sparql.php
@@ -0,0 +1,155 @@
+<?php
+/*************************************************************************************
+ * sparql.php
+ * -------
+ * Author: Karima Rafes (karima.rafes@bordercloud.com)
+ * Copyright: (c) 2011 Bourdercloud.com
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/11/05
+ *
+ * SPARQL language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011/11/05 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'SPARQL',
+ 'COMMENT_SINGLE' => array('#'),
+ 'COMMENT_MULTI' => array('/*' => '*/' ),
+ 'COMMENT_REGEXP' => array(
+ //IRI (it's not a comment ;)
+ 1 => "/<[^> ]*>/i"
+ ),
+ 'CASE_KEYWORDS' => 1,
+ 'QUOTEMARKS' => array("'", '"', '`'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'BASE','PREFIX','SELECT','DISTINCT','REDUCED','CONSTRUCT','DESCRIBE','ASK','FROM',
+ 'NAMED','WHERE','ORDER','BY','ASC','DESC','LIMIT','OFFSET','OPTIONAL','GRAPH',
+ 'UNION','FILTER','STR','LANG','LANGMATCHES','DATATYPE','BOUND','SAMETERM',
+ 'ISIRI','ISURI','ISBLANK',
+ 'ISLITERAL','REGEX','SUBSTR','TRUE',
+ 'FALSE','LOAD','CLEAR',
+ 'DROP','ADD','MOVE','COPY',
+ 'CREATE','DELETE','INSERT',
+ 'USING','SILENT','DEFAULT','ALL',
+ 'DATA','WITH','INTO','TO',
+ 'AS','GROUP','HAVING','UNDEF',
+ 'BINDINGS','SERVICE','BIND','MINUS_KEYWORD',
+ 'IRI','URI', 'BNODE',
+ 'RAND','ABS','CEIL','FLOOR','ROUND',
+ 'CONCAT','STRLEN',
+ 'UCASE','LCASE','ENCODE_FOR_URI',
+ 'CONTAINS','STRSTARTS',
+ 'STRENDS','STRBEFORE',
+ 'STRAFTER','REPLACE',
+ 'YEAR','MONTH',
+ 'DAY','HOURS',
+ 'MINUTES','SECONDS',
+ 'TIMEZONE','TZ',
+ 'NOW','MD5',
+ 'SHA1','SHA224',
+ 'SHA256','SHA384',
+ 'SHA512','COALESCE',
+ 'IF','STRLANG','STRDT',
+ 'ISNUMERIC','COUNT',
+ 'SUM','MIN',
+ 'MAX','AVG','SAMPLE',
+ 'GROUP_CONCAT ','NOT',
+ 'IN','EXISTS','SEPARATOR'
+ )
+ ),
+ 'REGEXPS' => array(
+ //Variables without braces
+ 1 => "\\?[a-zA-Z_][a-zA-Z0-9_]*",
+ //prefix
+ 2 => "[a-zA-Z_.\\-0-9]*:",
+ //tag lang
+ 3 => "@[^ .)}]*",
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '{', '}' , '.', ';'
+ ),
+ 1 => array(
+ '^^',
+ '<=','>=','!=','=','<','>','|',
+ '&&','||',
+ '(',')','[', ']',
+ '+','-','*','!','/'
+ ),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #993333; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #808080; font-style: italic;',
+ 1 => 'color: #000078;',
+ //2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF63C3;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #0000FF;',
+ 1 => 'color: #FF8000; font-weight: bold;'
+ ),
+ 'SCRIPT' => array(),
+ 'REGEXPS' => array(
+ 1 => 'color: #007800;',
+ 2 => 'color: #780078;',
+ 3 => 'color: #005078;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/sql.php b/inc/geshi/sql.php
index 9e45e850d..4d08a51fe 100644
--- a/inc/geshi/sql.php
+++ b/inc/geshi/sql.php
@@ -3,14 +3,18 @@
* sql.php
* -------
* Author: Nigel McNie (nigel@geshi.org)
+ * Contributors:
+ * - Jürgen Thomas (Juergen.Thomas@vs-polis.de)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/04
*
* SQL language file for GeSHi.
*
* CHANGES
* -------
+ * 2010/07/19 (1.0.8.9)
+ * - Added many more keywords
* 2008/05/23 (1.0.7.22)
* - Added additional symbols for highlighting
* 2004/11/27 (1.0.3)
@@ -58,30 +62,51 @@ $language_data = array (
'ESCAPE_CHAR' => '\\',
'KEYWORDS' => array(
1 => array(
- 'ADD', 'ALL', 'ALTER', 'AND', 'AS', 'ASC',
- 'AUTO_INCREMENT', 'BETWEEN', 'BINARY', 'BOOLEAN',
- 'BOTH', 'BY', 'CHANGE', 'CHECK', 'COLUMN', 'COLUMNS',
- 'CREATE', 'CROSS', 'DATA', 'DATABASE', 'DATABASES',
- 'DEFAULT', 'DELAYED', 'DELETE', 'DESC', 'DESCRIBE',
- 'DISTINCT', 'DROP', 'ENCLOSED', 'ESCAPED', 'EXISTS',
- 'EXPLAIN', 'FIELD', 'FIELDS', 'FLUSH', 'FOR',
- 'FOREIGN', 'FROM', 'FULL', 'FUNCTION', 'GRANT',
- 'GROUP', 'HAVING', 'IDENTIFIED', 'IF', 'IGNORE',
- 'IN', 'INDEX', 'INFILE', 'INNER', 'INSERT', 'INTO',
- 'IS', 'JOIN', 'KEY', 'KEYS', 'KILL', 'LANGUAGE',
- 'LEADING', 'LEFT', 'LIKE', 'LIMIT', 'LINES', 'LOAD',
- 'LOCAL', 'LOCK', 'LOW_PRIORITY', 'MODIFY', 'NATURAL',
- 'NEXTVAL', 'NOT', 'NULL', 'ON', 'OPTIMIZE', 'OPTION',
- 'OPTIONALLY', 'OR', 'ORDER', 'OUTER', 'OUTFILE',
- 'PRIMARY', 'PROCEDURAL', 'PROCEEDURE', 'READ',
- 'REFERENCES', 'REGEXP', 'RENAME', 'REPLACE',
- 'RETURN', 'REVOKE', 'RIGHT', 'RLIKE', 'SELECT',
- 'SET', 'SETVAL', 'SHOW', 'SONAME', 'STATUS',
- 'STRAIGHT_JOIN', 'TABLE', 'TABLES', 'TEMINATED',
- 'TEMPORARY', 'TO', 'TRAILING', 'TRIGGER', 'TRUNCATE',
- 'TRUSTED', 'UNION', 'UNIQUE', 'UNLOCK', 'UNSIGNED',
- 'UPDATE', 'USE', 'USING', 'VALUES', 'VARIABLES',
- 'VIEW', 'WHERE', 'WITH', 'WRITE', 'XOR', 'ZEROFILL'
+ 'ADD', 'ALL', 'ALTER', 'AND', 'AS', 'ASC', 'AUTO_INCREMENT',
+ 'BEFORE', 'BEGIN', 'BETWEEN', 'BIGINT', 'BINARY', 'BLOB', 'BOOLEAN', 'BOTH', 'BY',
+ 'CALL', 'CASE', 'CAST', 'CEIL', 'CEILING', 'CHANGE', 'CHAR', 'CHAR_LENGTH', 'CHARACTER',
+ 'CHARACTER_LENGTH', 'CHECK', 'CLOB', 'COALESCE', 'COLLATE', 'COLUMN', 'COLUMNS',
+ 'CONNECT', 'CONSTRAINT', 'CONVERT', 'COUNT', 'CREATE', 'CROSS', 'CURRENT',
+ 'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER',
+ 'DATA', 'DATABASE', 'DATABASES', 'DATE', 'DAY', 'DEC', 'DECIMAL', 'DECLARE',
+ 'DEFAULT', 'DELAYED', 'DELETE', 'DESC', 'DESCRIBE', 'DISTINCT', 'DOUBLE',
+ 'DOMAIN', 'DROP',
+ 'ELSE', 'ENCLOSED', 'END', 'ESCAPED', 'EXCEPT', 'EXEC', 'EXECUTE', 'EXISTS', 'EXP',
+ 'EXPLAIN', 'EXTRACT',
+ 'FALSE', 'FIELD', 'FIELDS', 'FILTER', 'FIRST', 'FLOAT', 'FLOOR', 'FLUSH', 'FOR',
+ 'FOREIGN', 'FROM', 'FULL', 'FUNCTION',
+ 'GET', 'GROUP', 'GROUPING', 'GO', 'GOTO', 'GRANT', 'GRANTED',
+ 'HAVING', 'HOUR',
+ 'IDENTIFIED', 'IDENTITY', 'IF', 'IGNORE', 'IN', 'INCREMENT', 'INDEX', 'INFILE', 'INNER',
+ 'INOUT', 'INPUT', 'INSERT', 'INT', 'INTEGER', 'INTERSECT', 'INTERSECTION', 'INTERVAL',
+ 'INTO', 'IS',
+ 'JOIN',
+ 'KEY', 'KEYS', 'KILL',
+ 'LANGUAGE', 'LARGE', 'LAST', 'LEADING', 'LEFT', 'LENGTH', 'LIKE', 'LIMIT', 'LINES', 'LOAD',
+ 'LOCAL', 'LOCK', 'LOW_PRIORITY', 'LOWER',
+ 'MATCH', 'MAX', 'MERGE', 'MIN', 'MINUTE', 'MOD', 'MODIFIES', 'MODIFY', 'MONTH',
+ 'NATIONAL', 'NATURAL', 'NCHAR', 'NEW', 'NEXT', 'NEXTVAL', 'NONE', 'NOT',
+ 'NULL', 'NULLABLE', 'NULLIF', 'NULLS', 'NUMBER', 'NUMERIC',
+ 'OF', 'OLD', 'ON', 'ONLY', 'OPEN', 'OPTIMIZE', 'OPTION',
+ 'OPTIONALLY', 'OR', 'ORDER', 'OUT', 'OUTER', 'OUTFILE', 'OVER',
+ 'POSITION', 'POWER', 'PRECISION', 'PREPARE', 'PRIMARY', 'PROCEDURAL', 'PROCEDURE',
+ 'READ', 'REAL', 'REF', 'REFERENCES', 'REFERENCING', 'REGEXP', 'RENAME', 'REPLACE',
+ 'RESULT', 'RETURN', 'RETURNS', 'REVOKE', 'RIGHT', 'RLIKE', 'ROLLBACK', 'ROW',
+ 'ROW_NUMBER', 'ROWS', 'RESTRICT', 'ROLE', 'ROUTINE', 'ROW_COUNT',
+ 'SAVEPOINT', 'SEARCH', 'SECOND', 'SECTION', 'SELECT', 'SELF', 'SEQUENCE',
+ 'SESSION', 'SET', 'SETVAL', 'SHOW', 'SIMILAR', 'SIZE', 'SMALLINT', 'SOME',
+ 'SONAME', 'SOURCE', 'SPACE', 'SQL', 'SQRT', 'START', 'STATUS',
+ 'STRAIGHT_JOIN', 'STRUCTURE', 'STYLE', 'SUBSTRING', 'SUM',
+ 'TABLE', 'TABLE_NAME', 'TABLES', 'TERMINATED', 'TEMPORARY', 'THEN', 'TIME',
+ 'TIMESTAMP', 'TO', 'TRAILING', 'TRANSACTION', 'TRIGGER', 'TRIM', 'TRUE', 'TRUNCATE',
+ 'TRUSTED', 'TYPE',
+ 'UNDER', 'UNION', 'UNIQUE', 'UNKNOWN', 'UNLOCK', 'UNSIGNED',
+ 'UPDATE', 'UPPER', 'USE', 'USER', 'USING',
+ 'VALUE', 'VALUES', 'VARCHAR', 'VARIABLES', 'VARYING', 'VIEW',
+ 'WHEN', 'WHERE', 'WITH', 'WITHIN', 'WITHOUT', 'WORK', 'WRITE',
+ 'XOR',
+ 'YEAR',
+ 'ZEROFILL'
)
),
'SYMBOLS' => array(
diff --git a/inc/geshi/stonescript.php b/inc/geshi/stonescript.php
new file mode 100644
index 000000000..2844e885e
--- /dev/null
+++ b/inc/geshi/stonescript.php
@@ -0,0 +1,307 @@
+<?php
+/*************************************************************************************
+ * stonescript.php
+ * --------
+ * Author: Archimmersion ( based on ruby.php by Moises Deniz )
+ * Copyright: (c) 2011 Archimmersion ( http://www.archimmersion.com )
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/03/30
+ *
+ * StoneScript language file for GeSHi.
+ *
+ * StonesCript is a Lua based script language for the ShiVa3D game engine ( http://www.stonetrip.com )
+ *
+ * More information can be found at http://www.stonetrip.com/developer/doc/api/introduction
+ *
+ * CHANGES
+ * -------
+ * 2011/04/18 (1.0.8.11)
+ * - Initial release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'StoneScript',
+ 'COMMENT_SINGLE' => array(1 => "--"),
+ 'COMMENT_MULTI' => array("--[[" => "]]"),
+ 'COMMENT_REGEXP' => array(
+ 4 => '/<<\s*?(\w+)\\n.*?\\n\\1(?![a-zA-Z0-9])/si',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '`','\''),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ // Blue - General Keywords
+ 1 => array(
+ 'and', 'begin', 'break', 'do', 'else', 'elseif', 'end',
+ 'for', 'if', 'in', 'while', 'next', 'not', 'or', 'redo',
+ 'then', 'unless', 'until', 'when', 'false', 'nil', 'self',
+ 'true', 'local', 'this', 'return',
+ ),
+ // Dark Blue - Main API names
+ 2 => array(
+ 'animation', 'application', 'cache', 'camera', 'debug',
+ 'dynamics', 'group', 'hashtable', 'hud', 'input', 'light',
+ 'log', 'math', 'mesh', 'microphone', 'music', 'navigation',
+ 'network', 'object', 'pixelmap', 'projector', 'scene',
+ 'sensor', 'server', 'session', 'sfx', 'shape', 'sound',
+ 'string', 'system', 'table', 'user', 'video', 'xml',
+ // Plugin API names
+ 'plasma', 'watersim',
+ 'winDirectories',
+ 'ActionSheet', 'Alert', 'Mail', 'Picker', 'StatusBar',
+ ),
+ // Constants
+ // Can be commented out if performance is crucial -> then these keywords will appear in a slightly lighter color
+ 3 => array(
+ //Animation
+ 'kPlaybackModeLoop', 'kPlaybackModeLoopMirrored', 'kPlaybackModeLoopReversed',
+ 'kPlaybackModeOnce', 'kPlaybackModeOnceReversed',
+ //Application - Environment
+ 'kStatusLoading', 'kStatusReady', 'kStatusSaving', // 'kStatusNone'
+ //Application - Options
+ 'kOptionAudioMasterVolume', 'kOptionAutomaticVirtualKeyboard', 'kOptionDynamicShadowsBufferCount',
+ 'kOptionDynamicShadowsBufferSize', 'kOptionDynamicShadowsConstantSampling', 'kOptionDynamicShadowsPCFSampleCount',
+ 'kOptionDynamicShadowsQuality', 'kOptionDynamicShadowsScreenSpaceBlur', 'kOptionFullscreen',
+ 'kOptionFullscreenHeight', 'kOptionFullscreenWidth', 'kOptionHardwareOcclusion',
+ 'kOptionMaxEventBouncesPerFrame', 'kOptionNetworkStreams', 'kOptionNetworkStreamsUseBrowser',
+ 'kOptionPrioritizeEventBounces', 'kOptionRenderingEnabled', 'kOptionShadersQuality',
+ 'kOptionSwapInterval', 'kOptionTerrainsQuality', 'kOptionTexturesAnisotropyLevel',
+ 'kOptionTexturesMipmapBias', 'kOptionTexturesQuality', 'kOptionViewportRotation',
+ //Application - Resource Types
+ 'kResourceTypeAnimBank', 'kResourceTypeFont', 'kResourceTypeHUD',
+ 'kResourceTypeMaterial', 'kResourceTypeMesh', 'kResourceTypeParticle',
+ 'kResourceTypePixelMap', 'kResourceTypeSoundBank', 'kResourceTypeTexture',
+ 'kResourceTypeTextureClip', 'kResourceTypeTrail',
+ //Cache
+ 'kPropertyHeight', 'kPropertySize', 'kPropertyWidth',
+ //Dynamics
+ 'kAxisX', 'kAxisY', 'kAxisZ',
+ 'kTypeBox', 'kTypeCapsule', 'kTypeSphere',
+ //HUD
+ 'kAddressingModeClamp', 'kAddressingModeRepeat', 'kAlignCenter', 'kAlignJustify','kAlignLeft', 'kAlignRight',
+ 'kAlignTop', 'kBlendModeAdd', 'kBlendModeDefault', 'kBlendModeModulate', 'kCaseFixed', 'kCaseVariable',
+ 'kCommandTypeCallAction', 'kCommandTypeCopyCheckStateToRegister', 'kCommandTypeCopyEditTextToRegister',
+ 'kCommandTypeCopyListItemTextToRegister', 'kCommandTypeCopyListLastSelectedItemToRegister',
+ 'kCommandTypeCopyProgressValueToRegister', 'kCommandTypeCopySliderValueToRegister', 'kCommandTypeCopyTagToRegister',
+ 'kCommandTypeEnterModalMode', 'kCommandTypeInterpolateBackgroundColor', 'kCommandTypeInterpolateBorderColor',
+ 'kCommandTypeInterpolateForegroundColor', 'kCommandTypeInterpolateHeight', 'kCommandTypeInterpolateOpacity',
+ 'kCommandTypeInterpolatePosition', 'kCommandTypeInterpolateProgressValue', 'kCommandTypeInterpolateRotation',
+ 'kCommandTypeInterpolateSize', 'kCommandTypeInterpolateWidth', 'kCommandTypeLeaveModalMode',
+ 'kCommandTypeMatchScreenSpaceBottomLeftCorner', 'kCommandTypeMatchScreenSpaceBottomRightCorner',
+ 'kCommandTypeMatchScreenSpaceCenter', 'kCommandTypeMatchScreenSpaceHeight', 'kCommandTypeMatchScreenSpaceTopLeftCorner',
+ 'kCommandTypeMatchScreenSpaceTopRightCorner', 'kCommandTypeMatchScreenSpaceWidth', 'kCommandTypePauseMovie',
+ 'kCommandTypePauseSound', 'kCommandTypePauseTimer', 'kCommandTypePlayMovie', 'kCommandTypePlaySound',
+ 'kCommandTypePlaySoundLoop', 'kCommandTypeResumeSound', 'kCommandTypeSendEventToUser', 'kCommandTypeSetActive',
+ 'kCommandTypeSetBackgroundColor', 'kCommandTypeSetBackgroundImage', 'kCommandTypeSetBackgroundImageUVOffset',
+ 'kCommandTypeSetBackgroundImageUVScale', 'kCommandTypeSetBorderColor', 'kCommandTypeSetButtonText',
+ 'kCommandTypeSetCheckState', 'kCommandTypeSetCheckText', 'kCommandTypeSetCursorPosition', 'kCommandTypeSetCursorVisible',
+ 'kCommandTypeSetEditText', 'kCommandTypeSetFocus', 'kCommandTypeSetForegroundColor', 'kCommandTypeSetHeight',
+ 'kCommandTypeSetLabelText', 'kCommandTypeSetOpacity', 'kCommandTypeSetPosition', 'kCommandTypeSetRotation',
+ 'kCommandTypeSetSize', 'kCommandTypeSetVisible', 'kCommandTypeSetWidth', 'kCommandTypeSleep', 'kCommandTypeStartTimer',
+ 'kCommandTypeStopAction', 'kCommandTypeStopMovie', 'kCommandTypeStopSound', 'kCommandTypeStopTimer',
+ 'kComponentTypeButton', 'kComponentTypeCheck', 'kComponentTypeContainer', 'kComponentTypeEdit', 'kComponentTypeLabel',
+ 'kComponentTypeList', 'kComponentTypeMovie', 'kComponentTypePicture', 'kComponentTypePixelMap', 'kComponentTypeProgress',
+ 'kComponentTypeRenderMap', 'kComponentTypeSlider', 'kCursorShapeCross', 'kCursorShapeDefault', 'kCursorShapeHandPointing',
+ 'kCursorShapeIBeam', 'kCursorShapeNone', 'kCursorShapeWaiting', 'kDirectionLeftToRight', 'kDirectionRightToLeft',
+ 'kEncodingASCII', 'kEncodingUTF8', 'kEventTypeGainFocus', 'kEventTypeLooseFocus', 'kEventTypeMouseEnter',
+ 'kEventTypeMouseLeave', 'kFillModeSolid', 'kInterpolatorTypeLinear', 'kInterpolatorTypePower2', 'kInterpolatorTypePower3',
+ 'kInterpolatorTypePower4', 'kInterpolatorTypeRoot2', 'kInterpolatorTypeRoot3', 'kInterpolatorTypeRoot4',
+ 'kInterpolatorTypeSpring1', 'kInterpolatorTypeSpring2', 'kInterpolatorTypeSpring3', 'kInterpolatorTypeSpring4',
+ 'kInterpolatorTypeSpring5', 'kInterpolatorTypeSpring6',
+ 'kOriginBottom', 'kOriginBottomLeft', 'kOriginBottomRight', 'kOriginCenter', 'kOriginLeft', 'kOriginRight',
+ 'kOriginTop', 'kOriginTopLeft', 'kOriginTopRight', 'kProgressTypeBottomToTop', 'kProgressTypeLeftToRight',
+ 'kProgressTypeRightToLeft', 'kProgressTypeTopToBottom', 'kRuntimeValueCallArgument0', 'kRuntimeValueCallArgument1',
+ 'kRuntimeValueCallArgument2', 'kRuntimeValueCallArgument3', 'kRuntimeValueCurrentUser', 'kRuntimeValueCurrentUserMainCamera',
+ 'kRuntimeValueRegister0', 'kRuntimeValueRegister1', 'kRuntimeValueRegister2', 'kRuntimeValueRegister3',
+ 'kShapeTypeEllipsoid', 'kShapeTypeRectangle', 'kShapeTypeRoundRectangle', 'kSliderTypeBottomToTop',
+ 'kSliderTypeLeftToRight', 'kSliderTypeRightToLeft', 'kSliderTypeTopToBottom', 'kWaveTypeConstant',
+ 'kWaveTypeSawtooth', 'kWaveTypeSawtoothInv', 'kWaveTypeSinus', 'kWaveTypeSinusNoise', 'kWaveTypeSquare', 'kWaveTypeTriangle',
+ //Input
+ 'kJoypadTypeIPhone', 'kJoypadTypeNone', 'kJoypadTypePhone', 'kJoypadTypeStandard', 'kJoypadTypeWiimote',
+ 'kKey0', 'kKey1', 'kKey2', 'kKey3', 'kKey4', 'kKey5', 'kKey6', 'kKey7', 'kKey8', 'kKey9', 'kKeyA', 'kKeyB',
+ 'kKeyBackspace', 'kKeyC', 'kKeyD', 'kKeyDelete', 'kKeyDown', 'kKeyE', 'kKeyEnd', 'kKeyEscape', 'kKeyF',
+ 'kKeyF1', 'kKeyF10', 'kKeyF11', 'kKeyF12', 'kKeyF2', 'kKeyF3', 'kKeyF4', 'kKeyF5', 'kKeyF6', 'kKeyF7',
+ 'kKeyF8', 'kKeyF9', 'kKeyG', 'kKeyH', 'kKeyHome', 'kKeyI', 'kKeyInsert', 'kKeyJ', 'kKeyK', 'kKeyL',
+ 'kKeyLAlt', 'kKeyLControl', 'kKeyLeft', 'kKeyLShift', 'kKeyM', 'kKeyN', 'kKeyO', 'kKeyP', 'kKeyPageDown',
+ 'kKeyPageUp', 'kKeyQ', 'kKeyR', 'kKeyRAlt', 'kKeyRControl', 'kKeyReturn', 'kKeyRight', 'kKeyRShift',
+ 'kKeyS', 'kKeySpace', 'kKeyT', 'kKeyTab', 'kKeyU', 'kKeyUp', 'kKeyV', 'kKeyW', 'kKeyX', 'kKeyY',
+ 'kKeyZ', 'kJoypadButtonPSPCircle', 'kJoypadButtonPSPCross', 'kJoypadButtonPSPDown', 'kJoypadButtonPSPL',
+ 'kJoypadButtonPSPLeft', 'kJoypadButtonPSPR', 'kJoypadButtonPSPRight', 'kJoypadButtonPSPSelect',
+ 'kJoypadButtonPSPSquare', 'kJoypadButtonPSPStart', 'kJoypadButtonPSPTriangle', 'kJoypadButtonPSPUp',
+ 'kJoypadTypePSP', 'kJoypadButtonWiimoteA', 'kJoypadButtonWiimoteB', 'kJoypadButtonWiimoteC',
+ 'kJoypadButtonWiimoteDown', 'kJoypadButtonWiimoteHome', 'kJoypadButtonWiimoteLeft',
+ 'kJoypadButtonWiimoteMinus', 'kJoypadButtonWiimoteOne', 'kJoypadButtonWiimotePlus',
+ 'kJoypadButtonWiimoteRight', 'kJoypadButtonWiimoteTwo', 'kJoypadButtonWiimoteUp', 'kJoypadButtonWiimoteZ',
+ //Light
+ 'kTypeDirectional', 'kTypePoint',
+ //Math
+ 'kEpsilon', 'kInfinity', 'kPi',
+ //Mesh
+ 'kLockModeRead', 'kLockModeWrite', 'kLockReadWrite',
+ //Network
+ 'kBluetoothServerPort', 'kDefaultServerPort', 'kStatusAuthenticated', 'kStatusSearchFinished', // 'kStatusNone', 'kStatusPending',
+ //Object
+ 'kControllerTypeAI', 'kControllerTypeAnimation', 'kControllerTypeAny', 'kControllerTypeDynamics',
+ 'kControllerTypeNavigation', 'kControllerTypeSound', 'kGlobalSpace', 'kLocalSpace', 'kParentSpace',
+ 'kTransformOptionInheritsParentRotation', 'kTransformOptionInheritsParentScale', 'kTransformOptionInheritsParentTranslation',
+ 'kTransformOptionTranslationAffectedByParentRotation', 'kTransformOptionTranslationAffectedByParentScale', 'kTypeCamera',
+ 'kTypeCollider', 'kTypeDummy', 'kTypeGroup', 'kTypeLight', 'kTypeOccluder', 'kTypeProjector', 'kTypeReflector',
+ 'kTypeSensor', 'kTypeSfx', 'kTypeShape',
+ //Pixelmap
+ 'kBlendModeDecal', 'kBlendModeReplace', 'kFillModeBrush', 'kFillModeNone', 'kPenModeBrush', // 'kFillModeSolid',
+ 'kPenModeNone', 'kPenModeSolid',
+ //Projector
+ 'kMapTypeMovie', 'kMapTypePixelMap', 'kMapTypeRenderMap', 'kMapTypeTexture', 'kMapTypeTextureClip',
+ //Scene
+ 'kFilteringModeBilinear', 'kFilteringModeNearest', 'kFilteringModeTrilinear', // 'kAddressingModeClamp', 'kAddressingModeRepeat',
+ 'kSkyBoxFaceBack', 'kSkyBoxFaceBottom', 'kSkyBoxFaceFront', 'kSkyBoxFaceLeft', 'kSkyBoxFaceRight', 'kSkyBoxFaceTop',
+ //Sensor
+ 'kShapeTypeBox', 'kShapeTypeSphere',
+ //Server
+ 'kStatusConnected', 'kStatusNone', 'kStatusPending',
+ //Session - duplicate keywords
+ //'kStatusConnected', 'kStatusNone', 'kStatusPending',
+ //Shape
+ 'kMapTypeUnknown', 'kCurveTypeBezier', 'kCurveTypeBSpline', 'kCurveTypeCatmullRom', 'kCurveTypePolyLine',
+ // 'kMapTypeMovie', 'kMapTypePixelMap', 'kMapTypeRenderMap', 'kMapTypeTexture', 'kMapTypeTextureClip',
+
+ //System
+ 'kOSType3DS', 'kOSTypeBada', 'kOSTypeBrew', 'kOSTypePalm', 'kOSTypePS3',
+ 'kClientTypeEditor', 'kClientTypeEmbedded', 'kClientTypeStandalone',
+ 'kGPUCapabilityBloomFilterSupport', 'kGPUCapabilityContrastFilterSupport', 'kGPUCapabilityDepthBlurFilterSupport',
+ 'kGPUCapabilityDistortionFilterSupport', 'kGPUCapabilityDynamicShadowsSupport', 'kGPUCapabilityHardwareOcclusionSupport',
+ 'kGPUCapabilityHardwareRenderingSupport', 'kGPUCapabilityMonochromeFilterSupport', 'kGPUCapabilityMotionBlurFilterSupport',
+ 'kGPUCapabilityPixelShaderSupport', 'kGPUCapabilityVelocityBlurFilterSupport', 'kGPUCapabilityVertexShaderSupport',
+ 'kLanguageAlbanian', 'kLanguageArabic', 'kLanguageBulgarian', 'kLanguageCatalan', 'kLanguageCzech', 'kLanguageDanish',
+ 'kLanguageDutch', 'kLanguageEnglish', 'kLanguageFinnish', 'kLanguageFrench', 'kLanguageGerman', 'kLanguageGreek',
+ 'kLanguageHebrew', 'kLanguageHungarian', 'kLanguageIcelandic', 'kLanguageItalian', 'kLanguageJapanese', 'kLanguageKorean',
+ 'kLanguageNorwegian', 'kLanguagePolish', 'kLanguagePortuguese', 'kLanguageRomanian', 'kLanguageRussian',
+ 'kLanguageSerboCroatian', 'kLanguageSlovak', 'kLanguageSpanish', 'kLanguageSwedish', 'kLanguageThai',
+ 'kLanguageTurkish', 'kLanguageUnknown', 'kLanguageUrdu', 'kOSTypeAndroid', 'kOSTypeAngstrom', 'kOSTypeIPhone',
+ 'kOSTypeLinux', 'kOSTypeMac', 'kOSTypePSP', 'kOSTypeSymbian', 'kOSTypeWii', 'kOSTypeWindows', 'kOSTypeWindowsCE',
+ ),
+ // Not used yet
+ 4 => array(
+ 'dummycommand',
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '%', '&', '*', '|', '/', '<', '>',
+ '+', '-', '=>', '<<'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color:#0000FF; font-weight:bold;',
+ 2 => 'color:#000088; font-weight:bold;',
+ 3 => 'color:#C088C0; font-weight:bold;',
+ 4 => 'color:#00FEFE; font-weight:bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color:#008000; font-style:italic;',
+ 4 => 'color: #cc0000; font-style: italic;',
+ 'MULTI' => 'color:#008000; font-style:italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color:#000099;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color:#000000; font-weight:bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color:#888800;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color:#AA0000;'
+ ),
+ // names after "."
+ 'METHODS' => array(
+ 1 => 'color:#FF00FF; font-weight:bold;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color:#000000; font-weight:bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color:#ff6633; font-weight:bold;',
+ 1 => 'color:#0066ff; font-weight:bold;',
+ 2 => 'color:#6666ff; font-weight:bold;',
+ 3 => 'color:#ff3333; font-weight:bold;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ 0 => array(//Variables
+ GESHI_SEARCH => "([[:space:]])(\\$[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 1 => array(//Arrays
+ GESHI_SEARCH => "([[:space:]])(@[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 2 => "([A-Z][a-zA-Z0-9_]*::)+[A-Z][a-zA-Z0-9_]*",//Static OOP symbols
+ 3 => array(
+ GESHI_SEARCH => "([[:space:]]|\[|\()(:[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<%' => '%>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ ),
+ 'TAB_WIDTH' => 2
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/systemverilog.php b/inc/geshi/systemverilog.php
index 19405c097..f2ba92b19 100644
--- a/inc/geshi/systemverilog.php
+++ b/inc/geshi/systemverilog.php
@@ -4,7 +4,7 @@
* -------
* Author: Sean O'Boyle
* Copyright: (C) 2008 IntelligentDV
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/06/25
*
* SystemVerilog IEEE 1800-2009(draft8) language file for GeSHi.
@@ -52,9 +52,9 @@
* Project: SyntaxFiles
*
* File: systemverilog.php
- * $LastChangedBy: seanoboyle $
- * $LastChangedDate: 2009-07-22 22:20:25 -0700 (Wed, 22 Jul 2009) $
- * $LastChangedRevision: 17 $
+ * $LastChangedBy: benbe $
+ * $LastChangedDate: 2012-08-18 01:56:20 +0200 (Sa, 18. Aug 2012) $
+ * $LastChangedRevision: 2542 $
*
************************************************************************/
diff --git a/inc/geshi/tcl.php b/inc/geshi/tcl.php
index 2a07ccd46..4dd7be87b 100644
--- a/inc/geshi/tcl.php
+++ b/inc/geshi/tcl.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Reid van Melle (rvanmelle@gmail.com)
* Copyright: (c) 2004 Reid van Melle (sorry@nowhere)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/05/05
*
* TCL/iTCL language file for GeSHi.
diff --git a/inc/geshi/teraterm.php b/inc/geshi/teraterm.php
index 443bf7b4c..f125642d5 100644
--- a/inc/geshi/teraterm.php
+++ b/inc/geshi/teraterm.php
@@ -4,23 +4,29 @@
* --------
* Author: Boris Maisuradze (boris at logmett.com)
* Copyright: (c) 2008 Boris Maisuradze (http://logmett.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/09/26
*
* Tera Term Macro language file for GeSHi.
*
*
- * This version of ttl.php was created for Tera Term 4.60 and LogMeTT 2.9.4.
+ * This version of teraterm.php was created for Tera Term 4.62 and LogMeTT 2.9.4.
* Newer versions of these application can contain additional Macro commands
- * and/or keywords that are not listed here. The latest release of ttl.php
+ * and/or keywords that are not listed here. The latest release of teraterm.php
* can be downloaded from Download section of LogMeTT.com
*
* CHANGES
* -------
- * 2008/09/26 (1.0.8)
+ * 2008/09/26 (1.0.0)
* - First Release for Tera Term 4.60 and below.
+ * 2009/03/22 (1.1.0)
+ * - First Release for Tera Term 4.62 and below.
+ * 2009/04/25 (1.1.1)
+ * - Second Release for Tera Term 4.62 and below.
+ * 2010/09/12 (1.1.2)
+ * - Second Release for Tera Term 4.67, LogMeTT 2.97, TTLEditor 1.2.1 and below.
*
- * TODO (updated 2008/09/26)
+ * TODO (updated 2010/09/12)
* -------------------------
* *
*
@@ -57,27 +63,29 @@ $language_data = array (
'Beep',
'BplusRecv',
'BplusSend',
- 'Break', // (version 4.53 or later)
+ 'Break',
'Call',
- 'CallMenu', // (version 4.56 or later)
+ 'CallMenu',
'ChangeDir',
'ClearScreen',
- 'Clipb2Var', //(version 4.46 or later)
+ 'Clipb2Var',
'ClosesBox',
'CloseTT',
'Code2Str',
'Connect',
- 'CRC32', // (version 4.60 or later)
- 'CRC32File', // (version 4.60 or later)
- 'CygConnect', // (version 4.57 or later)
+ 'CRC32',
+ 'CRC32File',
+ 'CygConnect',
'DelPassword',
'Disconnect',
- 'Do', // (version 4.56 or later)
+ 'DispStr',
+ 'Do',
'Else',
+ 'ElseIf',
'EnableKeyb',
'End',
'EndIf',
- 'EndUntil', // (version 4.56 or later)
+ 'EndUntil',
'EndWhile',
'Exec',
'ExecCmnd',
@@ -88,32 +96,37 @@ $language_data = array (
'FileCreate',
'FileDelete',
'FileMarkPtr',
- 'FilenameBox', //(version 4.54 or later)
+ 'FileNameBox',
'FileOpen',
'FileRead',
- 'FileReadln', // (version 4.48 or later)
+ 'FileReadln',
'FileRename',
'FileSearch',
'FileSeek',
'FileSeekBack',
+ 'FileStat',
'FileStrSeek',
'FileStrSeek2',
+ 'FileTruncate',
'FileWrite',
- 'FileWriteln',
- 'FindOperations',
+ 'FileWriteLn',
+ 'FindClose',
+ 'FindFirst',
+ 'FindNext',
'FlushRecv',
- 'ForNext',
+ 'For',
'GetDate',
- 'GetDir', //(version 4.46 or later)
+ 'GetDir',
'GetEnv',
+ 'GetHostname',
'GetPassword',
'GetTime',
'GetTitle',
- 'GetVer', //(version 4.58 or later)
+ 'GetTTDir',
+ 'Getver',
'GoTo',
'If',
- 'IfDefined', // (version 4.46 or later)
- 'IfThenElseIf',
+ 'IfDefined',
'Include',
'InputBox',
'Int2Str',
@@ -121,73 +134,91 @@ $language_data = array (
'KmtGet',
'KmtRecv',
'KmtSend',
- 'LoadKeyMap',
+ 'LoadKeymap',
'LogClose',
'LogOpen',
'LogPause',
'LogStart',
'LogWrite',
- 'Loop', // (version 4.56 or later)
+ 'Loop',
'MakePath',
'MessageBox',
- 'MPause', // (version 4.27 or later)
+ 'MPause',
+ 'Next',
'PasswordBox',
'Pause',
- 'QuickvanRecv',
- 'QuickvanSend',
- 'Random', //(version 4.27 or later)
- 'Recvln',
+ 'QuickVANRecv',
+ 'QuickVANSend',
+ 'Random',
+ 'RecvLn',
'RestoreSetup',
'Return',
- 'RotateLeft', //(version 4.54 or later)
- 'RotateRight', //(version 4.54 or later)
- 'ScpRecv', // (version 4.57 or later)
- 'ScpSend', // (version 4.57 or later)
+ 'RotateLeft',
+ 'RotateRight',
+ 'ScpRecv',
+ 'ScpSend',
'Send',
'SendBreak',
+ 'SendBroadcast',
'SendFile',
- 'SendKcode',
- 'Sendln',
- 'SetBaud', // (version 4.58 or later)
+ 'SendKCode',
+ 'SendLn',
+ 'SendLnBroadcast',
+ 'SendMulticast',
+ 'SetBaud',
'SetDate',
+ 'SetDebug',
'SetDir',
'SetDlgPos',
- 'SetDTR', // (version 4.59 or later)
- 'SetRTS', // (version 4.59 or later)
- 'SetEnv', // (version 4.54 or later)
+ 'SetDTR',
'SetEcho',
+ 'SetEnv',
'SetExitCode',
+ 'SetMulticastName',
+ 'SetRTS',
'SetSync',
'SetTime',
'SetTitle',
'Show',
'ShowTT',
- 'Sprintf', // (version 4.52 or later)
+ 'SPrintF',
+ 'SPrintF2',
'StatusBox',
'Str2Code',
'Str2Int',
'StrCompare',
'StrConcat',
'StrCopy',
+ 'StrInsert',
+ 'StrJoin',
'StrLen',
- 'StrMatch', // (version 4.59 or later)
+ 'StrMatch',
+ 'StrRemove',
+ 'StrReplace',
'StrScan',
- 'Testlink',
+ 'StrSpecial',
+ 'StrSplit',
+ 'StrTrim',
+ 'TestLink',
'Then',
- 'ToLower', //(version 4.53 or later)
- 'ToUpper', //(version 4.53 or later)
- 'Unlink',
- 'Until', // (version 4.56 or later)
- 'Var2Clipb', //(version 4.46 or later)
+ 'ToLower',
+ 'ToUpper',
+ 'UnLink',
+ 'Until',
+ 'Var2Clipb',
'Wait',
+ 'Wait4All',
'WaitEvent',
- 'Waitln',
+ 'WaitLn',
+ 'WaitN',
'WaitRecv',
- 'WaitRegex', // (version 4.21 or later)
+ 'WaitRegEx',
'While',
'XmodemRecv',
'XmodemSend',
'YesNoBox',
+ 'YmodemRecv',
+ 'YmodemSend',
'ZmodemRecv',
'ZmodemSend'
),
@@ -204,6 +235,7 @@ $language_data = array (
'groupmatchstr9',
'inputstr',
'matchstr',
+ 'mtimeout',
'param2',
'param3',
'param4',
@@ -225,11 +257,14 @@ $language_data = array (
'$[6]',
'$[7]',
'$[8]',
+ '$[9]',
+ '$branch$',
+ '$computername$',
'$connection$',
'$email$',
'$logdir$',
'$logfilename$',
- '$logit$',
+ '$lttfilename$',
'$mobile$',
'$name$',
'$pager$',
@@ -239,7 +274,7 @@ $language_data = array (
'$ttdir$',
'$user$',
'$windir$',
- ),
+ ),
/* Keyword Symbols */
4 => array(
'and',
@@ -249,9 +284,11 @@ $language_data = array (
)
),
'SYMBOLS' => array(
- '(', ')', '[', ']',
- '~', '!', '+', '-', '*', '/', '%', '>>', '<<', '<<<', '>>>', '&', '^', '|',
- '<>', '<=', '>=', '=', '==', '<>', '!=', '&&', '||'
+ '(', ')', '[', ']', '{', '}',
+ '+', '-', '*', '/', '%',
+ '!', '&', '|', '^',
+ '<', '>', '=',
+ '?', ':', ';',
),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
@@ -314,4 +351,4 @@ $language_data = array (
'TAB_WIDTH' => 4
);
-?>
+?> \ No newline at end of file
diff --git a/inc/geshi/text.php b/inc/geshi/text.php
index 66f459293..87fb7110c 100644
--- a/inc/geshi/text.php
+++ b/inc/geshi/text.php
@@ -4,7 +4,7 @@
* --------
* Author: Sean Hanna (smokingrope@gmail.com)
* Copyright: (c) 2006 Sean Hanna
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 04/23/2006
*
* Standard Text File (No Syntax Highlighting).
diff --git a/inc/geshi/thinbasic.php b/inc/geshi/thinbasic.php
index 693c698d6..f54959e16 100644
--- a/inc/geshi/thinbasic.php
+++ b/inc/geshi/thinbasic.php
@@ -4,7 +4,7 @@
* ------
* Author: Eros Olmi (eros.olmi@thinbasic.com)
* Copyright: (c) 2006 Eros Olmi (http://www.thinbasic.com), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/05/12
*
* thinBasic language file for GeSHi.
diff --git a/inc/geshi/tsql.php b/inc/geshi/tsql.php
index b915b087d..b4bf6bdad 100644
--- a/inc/geshi/tsql.php
+++ b/inc/geshi/tsql.php
@@ -4,7 +4,7 @@
* --------
* Author: Duncan Lock (dunc@dflock.co.uk)
* Copyright: (c) 2006 Duncan Lock (http://dflock.co.uk/), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/11/22
*
* T-SQL language file for GeSHi.
@@ -55,7 +55,7 @@ $language_data = array (
// Keywords
'ABSOLUTE', 'ACTION', 'ADD', 'ADMIN', 'AFTER', 'AGGREGATE', 'ALIAS', 'ALLOCATE', 'ALTER', 'ARE', 'ARRAY', 'AS',
'ASC', 'ASSERTION', 'AT', 'AUTHORIZATION', 'BACKUP', 'BEFORE', 'BEGIN', 'BINARY', 'BIT', 'BLOB', 'BOOLEAN', 'BOTH', 'BREADTH',
- 'BREAK', 'BROWSE', 'BULK', 'BY', 'CALL', 'CASCADE', 'CASCADED', 'CASE', 'CAST', 'CATALOG', 'CHAR', 'CHARACTER', 'CHECK', 'CHECKPOINT',
+ 'BREAK', 'BROWSE', 'BULK', 'BY', 'CALL', 'CASCADE', 'CASCADED', 'CASE', 'CAST', 'CATALOG', 'CATCH', 'CHAR', 'CHARACTER', 'CHECK', 'CHECKPOINT',
'CLASS', 'CLOB', 'CLOSE', 'CLUSTERED', 'COALESCE', 'COLLATE', 'COLLATION', 'COLUMN', 'COMMIT', 'COMPLETION', 'COMPUTE', 'CONNECT',
'CONNECTION', 'CONSTRAINT', 'CONSTRAINTS', 'CONSTRUCTOR', 'CONTAINS', 'CONTAINSTABLE', 'CONTINUE', 'CONVERT', 'CORRESPONDING', 'CREATE',
'CUBE', 'CURRENT', 'CURRENT_DATE', 'CURRENT_PATH', 'CURRENT_ROLE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER',
@@ -79,7 +79,7 @@ $language_data = array (
'SEQUENCE', 'SESSION', 'SESSION_USER', 'SET', 'SETS', 'SETUSER', 'SHUTDOWN', 'SIZE', 'SMALLINT', 'SPACE', 'SPECIFIC',
'SPECIFICTYPE', 'SQL', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING', 'START', 'STATE', 'STATEMENT', 'STATIC', 'STATISTICS', 'STRUCTURE',
'SYSTEM_USER', 'TABLE', 'TEMPORARY', 'TERMINATE', 'TEXTSIZE', 'THAN', 'THEN', 'TIME', 'TIMESTAMP', 'TIMEZONE_HOUR', 'TIMEZONE_MINUTE',
- 'TO', 'TOP', 'TRAILING', 'TRAN', 'TRANSACTION', 'TRANSLATION', 'TREAT', 'TRIGGER', 'TRUE', 'TRUNCATE', 'TSEQUAL', 'UNDER', 'UNION',
+ 'TO', 'TOP', 'TRAILING', 'TRAN', 'TRANSACTION', 'TRANSLATION', 'TREAT', 'TRIGGER', 'TRUE', 'TRUNCATE', 'TRY', 'TSEQUAL', 'UNDER', 'UNION',
'UNIQUE', 'UNKNOWN', 'UNNEST', 'UPDATE', 'UPDATETEXT', 'USAGE', 'USE', 'USER', 'USING', 'VALUE', 'VALUES', 'VARCHAR', 'VARIABLE',
'VARYING', 'VIEW', 'WAITFOR', 'WHEN', 'WHENEVER', 'WHERE', 'WHILE', 'WITH', 'WITHOUT', 'WORK', 'WRITE', 'WRITETEXT', 'YEAR', 'ZONE',
'UNCOMMITTED', 'NOCOUNT',
diff --git a/inc/geshi/typoscript.php b/inc/geshi/typoscript.php
index 525271428..6751aaa8d 100644
--- a/inc/geshi/typoscript.php
+++ b/inc/geshi/typoscript.php
@@ -4,7 +4,7 @@
* --------
* Author: Jan-Philipp Halle (typo3@jphalle.de)
* Copyright: (c) 2005 Jan-Philipp Halle (http://www.jphalle.de/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/07/29
*
* TypoScript language file for GeSHi.
@@ -218,6 +218,15 @@ $language_data = array (
'OBJECT_SPLITTERS' => array(
),
'REGEXPS' => array(
+ // xhtml tag
+ 2 => array(
+ GESHI_SEARCH => '(&lt;)([a-zA-Z\\/][^\\/\\|]*?)(&gt;)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 's',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+
// Constant
0 => array(
GESHI_SEARCH => '(\{)(\$[a-zA-Z_\.]+[a-zA-Z0-9_\.]*)(\})',
@@ -236,15 +245,6 @@ $language_data = array (
GESHI_AFTER => '\\2'
),
- // xhtml tag
- 2 => array(
- GESHI_SEARCH => '(&lt;[a-zA-Z\!\/].*?&gt;)',
- GESHI_REPLACE => '\\1',
- GESHI_MODIFIERS => 's',
- GESHI_BEFORE => '',
- GESHI_AFTER => ''
- ),
-
// extension keys / tables: (static|user|ttx|tx|tt|fe)_something[_something]
3 => array(
GESHI_SEARCH => '(plugin\.|[^\.]\b)((?:static|user|ttx|tx|tt|fe)(?:_[0-9A-Za-z_]+?)\b)',
diff --git a/inc/geshi/unicon.php b/inc/geshi/unicon.php
index edad62df3..6fe62d0fb 100644
--- a/inc/geshi/unicon.php
+++ b/inc/geshi/unicon.php
@@ -4,7 +4,7 @@
* --------
* Author: Matt Oates (mattoates@gmail.com)
* Copyright: (c) 2010 Matt Oates (http://mattoates.co.uk)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2010/04/20
*
* Unicon the Unified Extended Dialect of Icon language file for GeSHi.
diff --git a/inc/geshi/upc.php b/inc/geshi/upc.php
new file mode 100644
index 000000000..e05303228
--- /dev/null
+++ b/inc/geshi/upc.php
@@ -0,0 +1,270 @@
+<?php
+/*************************************************************************************
+ * upc.php
+ * -----
+ * Author: Viraj Sinha (viraj@indent.com)
+ * Contributors:
+ * - Nigel McNie (nigel@geshi.org)
+ * - Jack Lloyd (lloyd@randombit.net)
+ * - Michael Mol (mikemol@gmail.com)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * UPC language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011/06/14 (1.0.8.11)
+ * - This file is a revision of c.php with UPC keywords added
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'UPC',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\abfnrtv\'\"?\n]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'if', 'return', 'while', 'case', 'continue', 'default',
+ 'do', 'else', 'for', 'switch', 'goto',
+
+ 'upc_forall', 'upc_barrier', 'upc_notify', 'upc_wait', 'upc_fence'
+ ),
+ 2 => array(
+ 'null', 'false', 'break', 'true', 'function', 'enum', 'extern', 'inline'
+ ),
+ 3 => array(
+ // assert.h
+ 'assert',
+
+ //complex.h
+ 'cabs', 'cacos', 'cacosh', 'carg', 'casin', 'casinh', 'catan',
+ 'catanh', 'ccos', 'ccosh', 'cexp', 'cimag', 'cis', 'clog', 'conj',
+ 'cpow', 'cproj', 'creal', 'csin', 'csinh', 'csqrt', 'ctan', 'ctanh',
+
+ //ctype.h
+ 'digittoint', 'isalnum', 'isalpha', 'isascii', 'isblank', 'iscntrl',
+ 'isdigit', 'isgraph', 'islower', 'isprint', 'ispunct', 'isspace',
+ 'isupper', 'isxdigit', 'toascii', 'tolower', 'toupper',
+
+ //inttypes.h
+ 'imaxabs', 'imaxdiv', 'strtoimax', 'strtoumax', 'wcstoimax',
+ 'wcstoumax',
+
+ //locale.h
+ 'localeconv', 'setlocale',
+
+ //math.h
+ 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'exp',
+ 'fabs', 'floor', 'frexp', 'ldexp', 'log', 'log10', 'modf', 'pow',
+ 'sin', 'sinh', 'sqrt', 'tan', 'tanh',
+
+ //setjmp.h
+ 'longjmp', 'setjmp',
+
+ //signal.h
+ 'raise',
+
+ //stdarg.h
+ 'va_arg', 'va_copy', 'va_end', 'va_start',
+
+ //stddef.h
+ 'offsetof',
+
+ //stdio.h
+ 'clearerr', 'fclose', 'fdopen', 'feof', 'ferror', 'fflush', 'fgetc',
+ 'fgetpos', 'fgets', 'fopen', 'fprintf', 'fputc', 'fputchar',
+ 'fputs', 'fread', 'freopen', 'fscanf', 'fseek', 'fsetpos', 'ftell',
+ 'fwrite', 'getc', 'getch', 'getchar', 'gets', 'perror', 'printf',
+ 'putc', 'putchar', 'puts', 'remove', 'rename', 'rewind', 'scanf',
+ 'setbuf', 'setvbuf', 'snprintf', 'sprintf', 'sscanf', 'tmpfile',
+ 'tmpnam', 'ungetc', 'vfprintf', 'vfscanf', 'vprintf', 'vscanf',
+ 'vsprintf', 'vsscanf',
+
+ //stdlib.h
+ 'abort', 'abs', 'atexit', 'atof', 'atoi', 'atol', 'bsearch',
+ 'calloc', 'div', 'exit', 'free', 'getenv', 'itoa', 'labs', 'ldiv',
+ 'ltoa', 'malloc', 'qsort', 'rand', 'realloc', 'srand', 'strtod',
+ 'strtol', 'strtoul', 'system',
+
+ //string.h
+ 'memchr', 'memcmp', 'memcpy', 'memmove', 'memset', 'strcat',
+ 'strchr', 'strcmp', 'strcoll', 'strcpy', 'strcspn', 'strerror',
+ 'strlen', 'strncat', 'strncmp', 'strncpy', 'strpbrk', 'strrchr',
+ 'strspn', 'strstr', 'strtok', 'strxfrm',
+
+ //time.h
+ 'asctime', 'clock', 'ctime', 'difftime', 'gmtime', 'localtime',
+ 'mktime', 'strftime', 'time',
+
+ //wchar.h
+ 'btowc', 'fgetwc', 'fgetws', 'fputwc', 'fputws', 'fwide',
+ 'fwprintf', 'fwscanf', 'getwc', 'getwchar', 'mbrlen', 'mbrtowc',
+ 'mbsinit', 'mbsrtowcs', 'putwc', 'putwchar', 'swprintf', 'swscanf',
+ 'ungetwc', 'vfwprintf', 'vswprintf', 'vwprintf', 'wcrtomb',
+ 'wcscat', 'wcschr', 'wcscmp', 'wcscoll', 'wcscpy', 'wcscspn',
+ 'wcsftime', 'wcslen', 'wcsncat', 'wcsncmp', 'wcsncpy', 'wcspbrk',
+ 'wcsrchr', 'wcsrtombs', 'wcsspn', 'wcsstr', 'wcstod', 'wcstok',
+ 'wcstol', 'wcstoul', 'wcsxfrm', 'wctob', 'wmemchr', 'wmemcmp',
+ 'wmemcpy', 'wmemmove', 'wmemset', 'wprintf', 'wscanf',
+
+ //wctype.h
+ 'iswalnum', 'iswalpha', 'iswcntrl', 'iswctype', 'iswdigit',
+ 'iswgraph', 'iswlower', 'iswprint', 'iswpunct', 'iswspace',
+ 'iswupper', 'iswxdigit', 'towctrans', 'towlower', 'towupper',
+ 'wctrans', 'wctype'
+ ),
+ 4 => array(
+ 'auto', 'char', 'const', 'double', 'float', 'int', 'long',
+ 'register', 'short', 'signed', 'sizeof', 'static', 'struct',
+ 'typedef', 'union', 'unsigned', 'void', 'volatile', 'wchar_t',
+
+ 'int8', 'int16', 'int32', 'int64',
+ 'uint8', 'uint16', 'uint32', 'uint64',
+
+ 'int_fast8_t', 'int_fast16_t', 'int_fast32_t', 'int_fast64_t',
+ 'uint_fast8_t', 'uint_fast16_t', 'uint_fast32_t', 'uint_fast64_t',
+
+ 'int_least8_t', 'int_least16_t', 'int_least32_t', 'int_least64_t',
+ 'uint_least8_t', 'uint_least16_t', 'uint_least32_t', 'uint_least64_t',
+
+ 'int8_t', 'int16_t', 'int32_t', 'int64_t',
+ 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t',
+
+ 'intmax_t', 'uintmax_t', 'intptr_t', 'uintptr_t',
+ 'size_t', 'off_t',
+
+ 'upc_lock_t', 'shared', 'strict', 'relaxed', 'upc_blocksizeof',
+ 'upc_localsizeof', 'upc_elemsizeof'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']',
+ '+', '-', '*', '/', '%',
+ '=', '<', '>',
+ '!', '^', '&', '|',
+ '?', ':',
+ ';', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #993333;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #339933;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #660099; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.opengroup.org/onlinepubs/009695399/functions/{FNAMEL}.html',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/urbi.php b/inc/geshi/urbi.php
new file mode 100644
index 000000000..a7353ea8b
--- /dev/null
+++ b/inc/geshi/urbi.php
@@ -0,0 +1,200 @@
+<?php
+/*************************************************************************************
+ * urbi.php
+ * -------
+ * Author: Alexandre Morgand (morgand.alexandre@gmail.com)
+ * Copyright: (c) 2011 Morgand (http://gostai.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/09/10
+ *
+ * Urbi language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Urbi',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ // Urbi warning.
+ 3 => "#\[[0-9a-f]{8}:warning\].*#",
+ // Urbi message from echo.
+ 4 => '#\[[0-9a-f]{8}\] \*\*\*.*#',
+ // Urbi error message.
+ 6 => '#\[[0-9a-f]{8}:error\].*#',
+ // Urbi system message.
+ 5 => '#\[00.*\].*#',
+ // Nested comment. Max depth 4.
+ 7 => '#\/\*(.|\n)*\/\*(.|\n)*\*\/(.|\n)*\*\/#',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(
+ 0 => '"',
+ 1 => '\'',
+ ),
+ // For Urbi, disable escape char is better.
+ 'ESCAPE_CHAR' => '\\',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[abfnrtv\\\'\"?\n]#",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#",
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ // Condition keywords.
+ 1 => array(
+ 'at', 'at;', 'at|', 'at&', 'at,', 'break', 'call', 'case', 'catch', 'continue',
+ 'do', 'else', 'every', 'every&', 'every,', 'every;', 'every|', 'for', 'for&',
+ 'for,', 'for;', 'foreach', 'for|', 'freezeif', 'goto', 'if', 'in', 'loop',
+ 'loop&', 'loop,', 'loop;', 'loop|', 'or_eq', 'stopif', 'switch', 'try',
+ 'waituntil', 'when', 'whenever', 'while', 'while&', 'while,', 'while;',
+ 'while|', 'throw', 'onleave', 'watch', 'return', 'and_eq', 'default', 'finally',
+ 'timeout', 'xor_eq'
+ ),
+ // Type.
+ 2 => array(
+ 'virtual', 'using', 'namespace', 'inline', 'protected', 'private', 'public',
+ 'typename', 'typeid', 'class', 'const_cast', 'dynamic_cast', 'friend',
+ 'template', 'enum', 'static_cast', 'reinterpret_cast', 'mutable', 'explicit'
+ ),
+ // Standard function.
+ 3 => array(
+ 'this', 'sizeof', 'delete', 'assert', 'isdef', 'compl', 'detach',
+ 'disown', '__HERE__', 'asm'
+ ),
+ // Type.
+ 4 => array(
+ 'char', 'const', 'double', 'int', 'long', 'typedef', 'union',
+ 'unsigned', 'var', 'short', 'wchar_t', 'volatile', 'signed', 'bool',
+ 'float', 'struct', 'auto', 'register', 'static', 'extern', 'function',
+ 'export', 'external', 'internal', 'closure', 'BIN'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '{', '}', '[', ']'),
+ 1 => array('<', '>','=', '!=', '==', '==='),
+ 2 => array('+', '-', '*', '/', '%', 'bitand', 'bitor', 'xor'),
+ 3 => array('!', '^', '&', '|'),
+ 4 => array('?', ':', ';')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #0000dd;',
+ 4 => 'color: #0000ff;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 2 => 'color: #339900;',
+ 3 => 'color: #d46b0f;',
+ 4 => 'color: #20b537;',
+ 5 => 'color: #73776f;',
+ 6 => 'color: #a71616;',
+ 7 => 'color: #666666;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #ff0000;',
+ 1 => 'color: #ff0000;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #7a0874; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ 1 => 'color: #007788;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #007788;',
+ 2 => 'color: #007788;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;',
+ 1 => 'color: #0000f8;',
+ 2 => 'color: #000040;',
+ 3 => 'color: #000040; font-weight: bold;',
+ 4 => 'color: #008080;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000dd',
+ 1 => 'color: #0000dd;',
+ 2 => 'color: #0000dd;',
+ 3 => 'color: #0000dd;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::',
+ // FIXME: add -> splitter.
+ ),
+ 'REGEXPS' => array(
+ 0 => '0x[0-9a-fA-F]([0-9a-fA-F_]*[0-9a-fA-F])*',
+ 1 => '[0-9]([0-9_]*[0-9])*(e|E)(-|\+)?[0-9]([0-9_]*[0-9])*',
+ 2 => '[0-9]([0-9_]*[0-9])*(min|s|ms|h|d)',
+ 3 => '[0-9]+_([0-9_])*[0-9]',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+);
+
+?>
diff --git a/inc/geshi/uscript.php b/inc/geshi/uscript.php
new file mode 100644
index 000000000..58cdb8d9e
--- /dev/null
+++ b/inc/geshi/uscript.php
@@ -0,0 +1,299 @@
+<?php
+/*************************************************************************************
+ * uscript.php
+ * ---------------------------------
+ * Author: pospi (pospi@spadgos.com)
+ * Copyright: (c) 2007 pospi (http://pospi.spadgos.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/05/21
+ *
+ * UnrealScript language file for GeSHi.
+ *
+ * Comments:
+ * * Main purpose at this time is for Unreal Engine 2 / 2.5
+ * * Mostly taken from UltraEdit unrealScript wordfile.
+ *
+ * CHANGES
+ * -------
+ * 2007/05/21 (1.0.8.10)
+ * - First Release
+ *
+ * TODO (updated 2007/05/21)
+ * -------------------------
+ * * Update to feature any UE3 classes / keywords when UT3 comes out
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Unreal Script',
+ 'COMMENT_SINGLE' => array(
+ 1 => '//',
+ 2 => '#'
+ ),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array( //declaration keywords
+ 'simulated', 'state', 'class', 'function', 'event', 'var', 'local',
+ 'ignores', 'globalconfig', 'config', 'abstract', 'nativereplication', 'native',
+ 'auto', 'coerce', 'const', 'default',
+ 'defaultproperties',
+ 'enum', 'extends', 'expands', 'final', 'guid', 'latent', 'localized',
+ 'new', 'noexport', 'operator', 'preoperator', 'optional', 'out',
+ 'private', 'public', 'protected', 'reliable', 'replication',
+ 'singular', 'static', 'struct', 'transient', 'unreliable',
+ 'hidedropdown', 'cacheexempt', 'exec', 'delegate', 'import', 'placeable', 'exportstructs'
+ ),
+ 2 => array( //control flow keywords
+ 'for', 'while', 'do', 'if', 'else', 'switch', 'case', 'return', 'break', 'continue',
+ 'begin', 'loop', 'assert',
+ 'foreach', 'AllActors', 'DynamicActors', 'ChildActors', 'BasedActors', 'TouchingActors',
+ 'TraceActors', 'RadiusActors', 'VisibleActors', 'CollidingActors', 'VisibleCollidingActors'
+ ),
+ 3 => array( //global (object) functions
+ 'log', 'warn', 'rot', 'vect', 'Rand', 'Min', 'Max', 'Clamp', 'Abs', 'Sin', 'ASin',
+ 'Cos', 'ACos', 'Tan', 'ATan', 'Exp', 'Loge', 'Sqrt', 'Square', 'FRand', 'FMin', 'FMax', 'FClamp',
+ 'Lerp', 'Smerp', 'Ceil', 'Round', 'VSize', 'Normal', 'Invert', 'VRand', 'MirrorVectorByNormal',
+ 'GetAxes', 'GetUnAxes', 'RotRand', 'OrthoRotation', 'Normalize', 'ClockwiseFrom',
+ 'Len', 'InStr', 'Mid', 'Left', 'Right', 'Caps', 'Chr', 'Asc', 'Locs',
+ 'Divide', 'Split', 'StrCmp', 'Repl', 'Eval',
+ 'InterpCurveEval', 'InterpCurveGetOutputRange', 'InterpCurveGetInputDomain',
+ 'QuatProduct', 'QuatInvert', 'QuatRotateVector', 'QuatFindBetween', 'QuatFromAxisAndAngle',
+ 'QuatFromRotator', 'QuatToRotator', 'QuatSlerp',
+ 'Localize', 'GotoState', 'IsInState', 'GetStateName',
+ 'ClassIsChildOf', 'IsA', 'Enable', 'Disable',
+ 'GetPropertyText', 'SetPropertyText', 'GetEnum', 'DynamicLoadObject', 'FindObject',
+ 'SaveConfig', 'ClearConfig', 'StaticSaveConfig', 'ResetConfig', 'StaticClearConfig',
+ 'GetPerObjectNames', 'RandRange', 'StopWatch', 'IsOnConsole', 'IsSoaking',
+ 'PlatformIsMacOS', 'PlatformIsUnix', 'PlatformIsWindows', 'PlatformIs64Bit',
+ 'BeginState', 'EndState', 'Created', 'AllObjects', 'GetReferencers', 'GetItemName',
+ 'ReplaceText', 'EatStr'
+ ),
+ 4 => array( //common almost-global (actor) functions
+ 'ClientMessage', 'ConsoleCommand', 'CopyObjectToClipboard', 'TextToSpeech',
+ 'Error', 'Sleep', 'SetCollision', 'SetCollisionSize', 'SetDrawScale', 'SetDrawScale3D',
+ 'SetStaticMesh', 'SetDrawType', 'Move', 'SetLocation', 'SetRotation',
+ 'SetRelativeLocation', 'SetRelativeRotation', 'MoveSmooth', 'AutonomousPhysics',
+ 'SetBase', 'SetOwner', 'IsJoinedTo', 'GetMeshName', 'PlayAnim', 'LoopAnim', 'TweenAnim',
+ 'IsAnimating', 'FinishAnim', 'HasAnim', 'StopAnimating', 'FreezeFrameAt', 'SetAnimFrame',
+ 'IsTweening', 'AnimStopLooping', 'AnimEnd', 'LinkSkelAnim', 'LinkMesh', 'BoneRefresh',
+ 'GetBoneCoords', 'GetBoneRotation', 'GetRootLocation', 'GetRootRotation', 'AttachToBone',
+ 'DetachFromBone', 'SetBoneScale', 'UpdateURL', 'GetURLOption', 'SetPhysics', 'KAddImpulse',
+ 'KImpact', 'KApplyForce', 'Clock', 'UnClock', 'Destroyed', 'GainedChild', 'LostChild',
+ 'Tick', 'PostNetReceive', 'ClientTrigger', 'Trigger', 'UnTrigger', 'BeginEvent', 'EndEvent',
+ 'Timer', 'HitWall', 'Falling', 'Landed', 'ZoneChange', 'PhysicsVolumeChange', 'Touch',
+ 'PostTouch', 'UnTouch', 'Bump', 'BaseChange', 'Attach', 'Detach', 'SpecialHandling',
+ 'EncroachingOn', 'EncroachedBy', 'RanInto', 'FinishedInterpolation', 'EndedRotation',
+ 'UsedBy', 'FellOutOfWorld', 'KilledBy', 'TakeDamage', 'HealDamage', 'Trace', 'FastTrace',
+ 'TraceThisActor', 'spawn', 'Destroy', 'TornOff', 'SetTimer', 'PlaySound', 'PlayOwnedSound',
+ 'GetSoundDuration', 'MakeNoise', 'BeginPlay', 'GetAllInt', 'RenderOverlays', 'RenderTexture',
+ 'PreBeginPlay', 'PostBeginPlay', 'PostNetBeginPlay', 'HurtRadius', 'Reset', 'Crash'
+ ),
+ 5 => array( //data types
+ 'none', 'null',
+ 'float', 'int', 'bool', 'byte', 'char', 'double', 'iterator', 'name', 'string', //primitive
+ 'plane', 'rotator', 'vector', 'spline', 'coords', 'Quat', 'Range', 'RangeVector', //structs
+ 'Scale', 'Color', 'Box', 'IntBox', 'FloatBox', 'BoundingVolume', 'Matrix', 'InterpCurvePoint',
+ 'InterpCurve', 'CompressedPosition', 'TMultiMap', 'PointRegion',
+ 'KRigidBodyState', 'KSimParams', 'AnimRep', 'FireProperties',
+ 'lodmesh', 'skeletalmesh', 'mesh', 'StaticMesh', 'MeshInstance', //3d resources
+ 'sound', //sound resources
+ 'material', 'texture', 'combiner', 'modifier', 'ColorModifier', 'FinalBlend', //2d resources
+ 'MaterialSequence', 'MaterialSwitch', 'OpacityModifier', 'TexModifier', 'TexEnvMap',
+ 'TexCoordSource', 'TexMatrix', 'TexOscillator', 'TexPanner', 'TexRotator', 'TexScaler',
+ 'RenderedMaterial', 'BitmapMaterial', 'ScriptedTexture', 'ShadowBitmapMaterial', 'Cubemap',
+ 'FractalTexture', 'FireTexture', 'IceTexture', 'WaterTexture', 'FluidTexture', 'WaveTexture',
+ 'WetTexture', 'ConstantMaterial', 'ConstantColor', 'FadeColor', 'ParticleMaterial',
+ 'ProjectorMaterial', 'Shader', 'TerrainMaterial', 'VertexColor'
+ ),
+ 6 => array( //misc keywords
+ 'false', 'true', 'self', 'super', 'MaxInt', 'Pi'
+ ),
+ 7 => array( //common actor enums & variables
+ 'DT_None', 'DT_Sprite', 'DT_Mesh', 'DT_Brush', 'DT_RopeSprite',
+ 'DT_VerticalSprite', 'DT_TerraForm', 'DT_SpriteAnimOnce', 'DT_StaticMesh', 'DT_DrawType',
+ 'DT_Particle', 'DT_AntiPortal', 'DT_FluidSurface',
+ 'PHYS_None', 'PHYS_Walking', 'PHYS_Falling', 'PHYS_Swimming', 'PHYS_Flying',
+ 'PHYS_Rotating', 'PHYS_Projectile', 'PHYS_Interpolating', 'PHYS_MovingBrush', 'PHYS_Spider',
+ 'PHYS_Trailer', 'PHYS_Ladder', 'PHYS_RootMotion', 'PHYS_Karma', 'PHYS_KarmaRagDoll',
+ 'PHYS_Hovering', 'PHYS_CinMotion',
+ 'ROLE_None', 'ROLE_DumbProxy', 'ROLE_SimulatedProxy',
+ 'ROLE_AutonomousProxy', 'ROLE_Authority',
+ 'STY_None', 'STY_Normal', 'STY_Masked', 'STY_Translucent', 'STY_Modulated', 'STY_Alpha',
+ 'STY_Additive', 'STY_Subtractive', 'STY_Particle', 'STY_AlphaZ',
+ 'OCCLUSION_None', 'OCCLUSION_BSP', 'OCCLUSION_Default', 'OCCLUSION_StaticMeshes',
+ 'SLOT_None', 'SLOT_Misc', 'SLOT_Pain', 'SLOT_Interact', 'SLOT_Ambient', 'SLOT_Talk',
+ 'SLOT_Interface', 'MTRAN_None', 'MTRAN_Instant', 'MTRAN_Segue', 'MTRAN_Fade',
+ 'MTRAN_FastFade', 'MTRAN_SlowFade',
+
+ 'DrawType', 'Physics', 'Owner', 'Base', 'Level', 'Game', 'Instigator', 'RemoteRole', 'Role',
+ 'LifeSpan', 'Tag', 'Event', 'Location', 'Rotation', 'Velocity', 'Acceleration',
+ 'RelativeLocation', 'RelativeRotation', 'DrawScale', 'DrawScale3D', 'Skins', 'Style',
+ 'SoundVolume', 'SoundPitch', 'SoundRadius', 'TransientSoundVolume', 'TransientSoundRadius',
+ 'CollisionRadius', 'CollisionHeight', 'Mass', 'Buoyancy', 'RotationRate', 'DesiredRotation'
+ ),
+ 8 => array( //common non-actor uscript classes
+ 'Object',
+ 'CacheManager', 'CameraEffect', 'Canvas', 'CheatManager', 'Commandlet', 'DecoText', 'GUI',
+ 'InteractionMaster', 'Interactions', 'Interaction', 'KarmaParamsCollision', 'KarmaParamsRBFull',
+ 'KarmaParamsSkel', 'KarmaParams', 'LevelSummary', 'Locale', 'Manifest', 'MaterialFactory',
+ 'MeshObject', 'ObjectPool', 'Pallete',
+ 'ParticleEmitter', 'MeshEmitter', 'BeamEmitter', 'SpriteEmitter', 'SparkEmitter', 'TrailEmitter',
+ 'Player', 'PlayerInput', 'PlayInfo', 'ReachSpec', 'Resource', 'LatentScriptedAction', 'ScriptedAction',
+ 'speciesType', 'StreamBase', 'Stream', 'EditorEngine', 'Engine', 'Time', 'WeaponFire',
+ 'WebApplication', 'WebRequest', 'WebResponse', 'WebSkin', 'xPawnGibGroup', 'xPawnSoundGroup',
+ 'xUtil'
+ ),
+ 9 => array( //common actor-based uscript classes
+ 'Actor',
+ 'Controller', 'AIController', 'ScriptedController', 'Bot', 'xBot',
+ 'PlayerController', 'UnrealPlayer', 'xPlayer',
+ 'DamageType', 'WeaponDamageType', 'Effects', 'Emitter', 'NetworkEmitter',
+ 'Gib', 'HUD', 'HudBase', 'Info', 'FluidSurfaceInfo', 'Combo',
+ 'GameInfo', 'UnrealMPGameInfo', 'DeathMatch', 'TeamGame', 'CTFGame',
+ 'xCTFGame', 'xBombingRun', 'xDoubleDom', 'xTeamGame',
+ 'ASGameInfo', 'Invasion', 'ONSOnslaughtGame', 'xDeathmatch',
+ 'Mutator', 'Inventory', 'Ammunition', 'KeyInventory', 'Powerups', 'Armor', 'Weapon',
+ 'InventoryAttachment', 'WeaponAttachment',
+ 'KActor', 'KConstraint', 'KBSJoint', 'KCarWheelJoint', 'KConeLimit', 'KHinge', 'KTire',
+ 'KVehicleFactory', 'Keypoint', 'AIScript', 'ScriptedSequence', 'ScriptedTrigger',
+ 'AmbientSound', 'Light', 'SpotLight', 'SunLight', 'TriggerLight',
+ 'MeshEffect', 'NavigationPoint', 'GameObjective', 'DestroyableObjective',
+ 'PathNode', 'FlyingPathNode', 'RoadPathNode', 'InventorySpot', 'PlayerStart',
+ 'Pawn', 'Vehicle', 'UnrealPawn', 'xPawn', 'Monster', 'ASVehicle', 'KVehicle', 'KCar',
+ 'ONSWeaponPawn', 'SVehicle', 'ONSVehicle', 'ONSChopperCraft', 'ONSHoverCraft',
+ 'ONSPlaneCraft', 'ONSTreadCraft', 'ONSWheeledCraft',
+ 'Pickup', 'Ammo', 'UTAmmoPickup', 'ArmorPickup', 'KeyPickup', 'TournamentPickup',
+ 'Projectile', 'Projector', 'DynamicProjector', 'ShadowProjector', 'xScorch',
+ 'xEmitter', 'xPickupBase', 'xProcMesh', 'xWeatherEffect', 'PhysicsVolume', 'Volume'
+ ),
+ 10 => array( //symbol-like operators
+ 'dot','cross'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '+','-','=','/','*','-','%','>','<','&','^','!','|','`','(',')','[',']','{','}',
+ '<<','>>','$','@'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ 9 => false,
+ 10 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #0000FF;',
+ 3 => 'color: #0066AA;',
+ 4 => 'color: #0088FF;',
+ 5 => 'color: #E000E0;',
+ 6 => 'color: #900000;',
+ 7 => 'color: #888800;',
+ 8 => 'color: #AA6600;',
+ 9 => 'color: #FF8800;',
+ 10 => 'color: #0000FF;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008080; font-style: italic;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 'MULTI' => 'color: #008080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #999999;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #669966;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #E000E0;',
+ 1 => 'color: #E000E0;'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => 'http://wiki.beyondunreal.com/wiki?search={FNAME}',
+ 9 => 'http://wiki.beyondunreal.com/wiki?search={FNAME}',
+ 10 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array('.'),
+ 'REGEXPS' => array( //handle template-style variable definitions
+ 0 => array(
+ GESHI_SEARCH => '(class\s*)<(\s*(\w+)\s*)>',
+ GESHI_REPLACE => "\${1}",
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => "< \${3} >"
+ ),
+ 1 => array(
+ GESHI_SEARCH => '(array\s*)<(\s*(\w+)\s*)>',
+ GESHI_REPLACE => "\${1}",
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => "< \${3} >"
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 10 => array(
+ 'DISALLOWED_BEFORE' => '(?<!<)(?=DOT>)'
+ )
+ )
+ )
+);
+
+?>
diff --git a/inc/geshi/vala.php b/inc/geshi/vala.php
index 334398a87..acac57e2a 100644
--- a/inc/geshi/vala.php
+++ b/inc/geshi/vala.php
@@ -4,7 +4,7 @@
* ----------
* Author: Nicolas Joseph (nicolas.joseph@valaide.org)
* Copyright: (c) 2009 Nicolas Joseph
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/04/29
*
* Vala language file for GeSHi.
diff --git a/inc/geshi/vb.php b/inc/geshi/vb.php
index f24d86505..528e7cd45 100644
--- a/inc/geshi/vb.php
+++ b/inc/geshi/vb.php
@@ -5,7 +5,7 @@
* Author: Roberto Rossi (rsoftware@altervista.org)
* Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org),
* Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/08/30
*
* Visual Basic language file for GeSHi.
diff --git a/inc/geshi/vbnet.php b/inc/geshi/vbnet.php
index f74775214..758df9893 100644
--- a/inc/geshi/vbnet.php
+++ b/inc/geshi/vbnet.php
@@ -4,7 +4,7 @@
* ---------
* Author: Alan Juden (alan@judenware.org)
* Copyright: (c) 2004 Alan Juden, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/06/04
*
* VB.NET language file for GeSHi.
@@ -45,60 +45,46 @@ $language_data = array (
'QUOTEMARKS' => array('"'),
'ESCAPE_CHAR' => '',
'KEYWORDS' => array(
+ //Keywords
1 => array(
- '3DDKSHADOW', '3DHIGHLIGHT', '3DLIGHT', 'ABORT', 'ABORTRETRYIGNORE', 'ACTIVEBORDER',
- 'ACTIVETITLEBAR', 'ALIAS', 'APPLICATIONMODAL', 'APPLICATIONWORKSPACE', 'ARCHIVE',
- 'BACK', 'BINARYCOMPARE', 'BLACK', 'BLUE', 'BUTTONFACE', 'BUTTONSHADOW', 'BUTTONTEXT',
- 'CANCEL', 'CDROM', 'CR', 'CRITICAL', 'CRLF', 'CYAN', 'DEFAULT', 'DEFAULTBUTTON1',
- 'DEFAULTBUTTON2', 'DEFAULTBUTTON3', 'DESKTOP', 'DIRECTORY', 'EXCLAMATION', 'FALSE',
- 'FIXED', 'FORAPPENDING', 'FORMFEED', 'FORREADING', 'FORWRITING', 'FROMUNICODE',
- 'GRAYTEXT', 'GREEN', 'HIDDEN', 'HIDE', 'HIGHLIGHT', 'HIGHLIGHTTEXT', 'HIRAGANA',
- 'IGNORE', 'INACTIVEBORDER', 'INACTIVECAPTIONTEXT', 'INACTIVETITLEBAR', 'INFOBACKGROUND',
- 'INFORMATION', 'INFOTEXT', 'KATAKANALF', 'LOWERCASE', 'MAGENTA', 'MAXIMIZEDFOCUS',
- 'MENUBAR', 'MENUTEXT', 'METHOD', 'MINIMIZEDFOCUS', 'MINIMIZEDNOFOCUS', 'MSGBOXRIGHT',
- 'MSGBOXRTLREADING', 'MSGBOXSETFOREGROUND', 'NARROW', 'NEWLINE', 'NO', 'NORMAL',
- 'NORMALFOCUS', 'NORMALNOFOCUS', 'NULLSTRING', 'OBJECTERROR', 'OK', 'OKCANCEL', 'OKONLY',
- 'PROPERCASE', 'QUESTION', 'RAMDISK', 'READONLY', 'RED', 'REMOTE', 'REMOVABLE', 'RETRY',
- 'RETRYCANCEL', 'SCROLLBARS', 'SYSTEMFOLDER', 'SYSTEMMODAL', 'TEMPORARYFOLDER',
- 'TEXTCOMPARE', 'TITLEBARTEXT', 'TRUE', 'UNICODE', 'UNKNOWN', 'UPPERCASE', 'VERTICALTAB',
- 'VOLUME', 'WHITE', 'WIDE', 'WIN16', 'WIN32', 'WINDOWBACKGROUND', 'WINDOWFRAME',
- 'WINDOWSFOLDER', 'WINDOWTEXT', 'YELLOW', 'YES', 'YESNO', 'YESNOCANCEL'
- ),
+ 'AddHandler', 'AddressOf', 'Alias', 'And', 'AndAlso', 'As', 'ByRef', 'ByVal',
+ 'Call', 'Case', 'Catch', 'Char', 'Class', 'Const', 'Continue',
+ 'Declare', 'Default',
+ 'Delegate', 'Dim', 'DirectCast', 'Do', 'Each', 'Else', 'ElseIf', 'End', 'EndIf',
+ 'Enum', 'Erase', 'Error', 'Event', 'Exit', 'False', 'Finally', 'For', 'Friend', 'Function',
+ 'Get', 'GetType', 'GetXMLNamespace', 'Global', 'GoSub', 'GoTo', 'Handles', 'If', 'Implements',
+ 'Imports', 'In', 'Inherits', 'Interface', 'Is', 'IsNot', 'Let', 'Lib', 'Like', 'Loop', 'Me',
+ 'Mod', 'Module', 'Module Statement', 'MustInherit', 'MustOverride', 'MyBase', 'MyClass', 'Namespace',
+ 'Narrowing', 'New', 'Next', 'Not', 'Nothing', 'NotInheritable', 'NotOverridable', 'Of', 'On',
+ 'Operator', 'Option', 'Optional', 'Or', 'OrElse', 'Out', 'Overloads', 'Overridable', 'Overrides',
+ 'ParamArray', 'Partial', 'Private', 'Property', 'Protected', 'Public', 'RaiseEvent', 'ReadOnly', 'ReDim',
+ 'REM', 'RemoveHandler', 'Resume', 'Return', 'Select','Set', 'Shadows', 'Shared', 'Static', 'Step',
+ 'Stop', 'Structure', 'Sub', 'SyncLock', 'Then', 'Throw', 'To', 'True', 'Try', 'TryCast', 'TypeOf',
+ 'Using', 'Wend', 'When', 'While', 'Widening', 'With', 'WithEvents', 'WriteOnly', 'Xor'
+ ),
+ //Data Types
2 => array(
- 'AndAlso', 'As', 'ADDHANDLER', 'ASSEMBLY', 'AUTO', 'Binary', 'ByRef', 'ByVal', 'BEGINEPILOGUE',
- 'Else', 'ElseIf', 'Empty', 'Error', 'ENDPROLOGUE', 'EXTERNALSOURCE', 'ENVIRON', 'For',
- 'Friend', 'Func', 'GET', 'HANDLES', 'Input', 'Is', 'IsNot', 'Len', 'Lock', 'Me', 'Mid', 'MUSTINHERIT', 'MustOverride',
- 'MYBASE', 'MYCLASS', 'New', 'Next', 'Nothing', 'Null', 'NOTINHERITABLE',
- 'NOTOVERRIDABLE', 'Of', 'OFF', 'On', 'Option', 'Optional', 'Overloads', 'OVERRIDABLE', 'Overrides', 'ParamArray', 'Predicate',
- 'Print', 'Private', 'Property', 'Public', 'Resume', 'Return', 'Seek', 'Static', 'Step',
- 'String', 'SHELL', 'SENDKEYS', 'SET', 'Shared', 'Then', 'Time', 'To', 'THROW', 'WithEvents'
+ 'Boolean', 'Byte', 'Date', 'Decimal', 'Double', 'Integer', 'Long', 'Object',
+ 'SByte', 'Short', 'Single', 'String', 'UInteger', 'ULong', 'UShort'
),
+ //Compiler Directives
3 => array(
- 'COLLECTION', 'DEBUG', 'DICTIONARY', 'DRIVE', 'DRIVES', 'ERR', 'FILE', 'FILES',
- 'FILESYSTEMOBJECT', 'FOLDER', 'FOLDERS', 'TEXTSTREAM'
+ '#Const', '#Else', '#ElseIf', '#End', '#If'
),
+ //Constants
4 => array(
- 'BOOLEAN', 'BYTE', 'DATE', 'DECIMIAL', 'DOUBLE', 'INTEGER', 'LONG', 'OBJECT',
- 'SINGLE STRING'
+ 'CBool', 'CByte', 'CChar', 'CChr', 'CDate', 'CDbl', 'CDec','CInt', 'CLng', 'CLng8', 'CObj', 'CSByte', 'CShort',
+ 'CSng', 'CStr', 'CType', 'CUInt', 'CULng', 'CUShort'
),
+ //Linq
5 => array(
- 'ADDRESSOF', 'AND', 'BITAND', 'BITNOT', 'BITOR', 'BITXOR',
- 'GETTYPE', 'LIKE', 'MOD', 'NOT', 'ORXOR'
- ),
- 6 => array(
- 'APPACTIVATE', 'BEEP', 'CALL', 'CHDIR', 'CHDRIVE', 'CLASS', 'CASE', 'CATCH', 'CONST',
- 'DECLARE', 'DELEGATE', 'DELETESETTING', 'DIM', 'DO', 'DOEVENTS', 'END', 'ENUM',
- 'EVENT', 'EXIT', 'EACH', 'FUNCTION', 'FINALLY', 'IF', 'IMPORTS', 'INHERITS',
- 'INTERFACE', 'IMPLEMENTS', 'KILL', 'LOOP', 'NAMESPACE', 'OPEN', 'PUT',
- 'RAISEEVENT', 'RANDOMIZE', 'REDIM', 'REM', 'RESET', 'SAVESETTING', 'SELECT',
- 'SETATTR', 'STOP', 'SUB', 'SYNCLOCK', 'STRUCTURE', 'SHADOWS', 'SWITCH',
- 'TRY', 'WIDTH', 'WITH', 'WRITE', 'WHILE'
+ 'By','From','Group','Where'
),
+ //Built-in functions
7 => array(
- 'ABS', 'ARRAY', 'ASC', 'ASCB', 'ASCW', 'CALLBYNAME', 'CBOOL', 'CBYTE', 'CCHAR',
- 'CCHR', 'CDATE', 'CDBL', 'CDEC', 'CHOOSE', 'CHR', 'CHR$', 'CHRB', 'CHRB$', 'CHRW',
- 'CINT', 'CLNG', 'CLNG8', 'CLOSE', 'COBJ', 'COMMAND', 'COMMAND$', 'CONVERSION',
- 'COS', 'CREATEOBJECT', 'CSHORT', 'CSTR', 'CURDIR', 'CTYPE', 'CVDATE', 'DATEADD',
+ 'ABS', 'ARRAY', 'ASC', 'ASCB', 'ASCW', 'CALLBYNAME', 'CHOOSE', 'CHR', 'CHR$', 'CHRB', 'CHRB$', 'CHRW',
+ 'CLOSE', 'COMMAND', 'COMMAND$', 'CONVERSION',
+ 'COS', 'CREATEOBJECT', 'CURDIR', 'CVDATE', 'DATEADD',
'DATEDIFF', 'DATEPART', 'DATESERIAL', 'DATEVALUE', 'DAY', 'DDB', 'DIR', 'DIR$',
'EOF', 'ERROR$', 'EXP', 'FILEATTR', 'FILECOPY', 'FILEDATATIME', 'FILELEN', 'FILTER',
'FIX', 'FORMAT', 'FORMAT$', 'FORMATCURRENCY', 'FORMATDATETIME', 'FORMATNUMBER',
@@ -115,16 +101,10 @@ $language_data = array (
'TIMER', 'TIMESERIAL', 'TIMEVALUE', 'TODAY', 'TRIM', 'TRIM$', 'TYPENAME', 'UBOUND',
'UCASE', 'UCASE$', 'VAL', 'WEEKDAY', 'WEEKDAYNAME', 'YEAR'
),
- 8 => array(
- 'ANY', 'ATN', 'CALENDAR', 'CIRCLE', 'CURRENCY', 'DEFBOOL', 'DEFBYTE', 'DEFCUR',
- 'DEFDATE', 'DEFDBL', 'DEFDEC', 'DEFINT', 'DEFLNG', 'DEFOBJ', 'DEFSNG', 'DEFSTR',
- 'DEFVAR', 'EQV', 'GOSUB', 'IMP', 'INITIALIZE', 'ISMISSING', 'LET', 'LINE', 'LSET',
- 'RSET', 'SGN', 'SQR', 'TERMINATE', 'VARIANT', 'VARTYPE', 'WEND'
- ),
),
'SYMBOLS' => array(
- '&', '&=', '*', '*=', '+', '+=', '-', '-=', '//', '/', '/=', '=', '\\', '\\=',
- '^', '^='
+ '+', '-', '*', '?', '=', '/', '%', '&', '>', '<', '^', '!',
+ '(', ')', '{', '}', '.'
),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
@@ -133,24 +113,20 @@ $language_data = array (
3 => false,
4 => false,
5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
+ 7 => false
),
'STYLES' => array(
'KEYWORDS' => array(
- 1 => 'color: #0600FF;', //Constants
- 2 => 'color: #FF8000;', //Keywords
- 3 => 'color: #008000;', //Data Types
- 4 => 'color: #FF0000;', //Objects
- 5 => 'color: #804040;', //Operators
- 6 => 'color: #0600FF;', //Statements
- 7 => 'color: #0600FF;', //Functions
- 8 => 'color: #0600FF;' //Deprecated
+ 1 => 'color: #0000FF; font-weight: bold;', //Keywords
+ 2 => 'color: #6a5acd;', //primitive Data Types
+ 3 => 'color: #6a5acd; font-weight: bold;', //preprocessor-commands
+ 4 => 'color: #cd6a5a;', //Constants
+ 5 => 'color: #cd6a5a; font-weight: bold;', //LinQ
+ 7 => 'color: #000066;', //Built-in functions
),
'COMMENTS' => array(
- 1 => 'color: #008080; font-style: italic;',
- 'MULTI' => 'color: #008080; font-style: italic;'
+ 1 => 'color: #008000; font-style: italic;',
+ 'MULTI' => 'color: #008000; font-style: italic;'
),
'ESCAPE_CHAR' => array(
0 => 'color: #008080; font-weight: bold;'
@@ -159,16 +135,16 @@ $language_data = array (
0 => 'color: #000000;'
),
'STRINGS' => array(
- 0 => 'color: #808080;'
+ 0 => 'color: #a52a2a; back-color: #fffacd;'
),
'NUMBERS' => array(
- 0 => 'color: #FF0000;'
+ 0 => 'color: #a52a2a; back-color: #fffacd;'
),
'METHODS' => array(
- 1 => 'color: #0000FF;'
+ 1 => 'color: #000000;'
),
'SYMBOLS' => array(
- 0 => 'color: #008000;'
+ 0 => 'color: #000000;'
),
'REGEXPS' => array(
),
@@ -181,9 +157,7 @@ $language_data = array (
3 => 'http://www.google.com/search?q={FNAMEU}+site:msdn.microsoft.com',
4 => '',
5 => '',
- 6 => '',
- 7 => '',
- 8 => ''
+ 7 => 'http://www.google.com/search?q={FNAMEU}+site:msdn.microsoft.com'
),
'OOLANG' => true,
'OBJECT_SPLITTERS' => array(
@@ -195,6 +169,13 @@ $language_data = array (
'SCRIPT_DELIMITERS' => array(
),
'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 7 => array(
+ 'DISALLOWED_AFTER' => '(?!\w)(?=\s*\()'
+ )
+ )
)
);
diff --git a/inc/geshi/vedit.php b/inc/geshi/vedit.php
new file mode 100644
index 000000000..19b2bdb21
--- /dev/null
+++ b/inc/geshi/vedit.php
@@ -0,0 +1,103 @@
+<?php
+/*************************************************************************************
+ * vedit.php
+ * --------
+ * Author: Pauli Lindgren (pauli0212@yahoo.com)
+ * Copyright: (c) 2009 Pauli Lindgren (http://koti.mbnet.fi/pkl/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/12/16
+ *
+ * Vedit macro language language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/12/16 (1.0.8.11)
+ * - First Release
+ *
+ * TODO (updated 2009/12/16)
+ * -------------------------
+ * - Add keyword groups 2, 3 and 4.
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Vedit macro language',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '\''),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break', 'breakout', 'break_out', 'continue', 'do', 'else', 'for',
+ 'goto', 'if', 'repeat', 'return', 'while'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', '+', '-', '*', '/', '%',
+ '=', '<', '>', '!', '^', '&', '|', '?', ':', ';', ','
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(1 => ''),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/verilog.php b/inc/geshi/verilog.php
index 14c1d7172..2bf66d1c0 100644
--- a/inc/geshi/verilog.php
+++ b/inc/geshi/verilog.php
@@ -4,7 +4,7 @@
* -----------
* Author: G�nter Dannoritzer <dannoritzer@web.de>
* Copyright: (C) 2008 Guenter Dannoritzer
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/05/28
*
* Verilog language file for GeSHi.
@@ -53,7 +53,7 @@ $language_data = array (
'casex', 'casez', 'cmos', 'deassign', 'default', 'defparam',
'disable', 'edge', 'else', 'end', 'endcase', 'endfunction',
'endmodule', 'endprimitive', 'endspecify', 'endtable', 'endtask',
- 'event', 'for', 'force', 'forever', 'function', 'highz0',
+ 'event', 'fork', 'for', 'force', 'forever', 'function', 'highz0',
'highz1', 'if', 'ifnone', 'initial', 'inout', 'input', 'integer',
'join', 'large', 'macromodule', 'medium', 'module', 'nand',
'negedge', 'nmos', 'nor', 'not', 'notif0', 'notif1', 'or',
diff --git a/inc/geshi/vhdl.php b/inc/geshi/vhdl.php
index 6856933c7..a8f37e676 100644
--- a/inc/geshi/vhdl.php
+++ b/inc/geshi/vhdl.php
@@ -3,14 +3,21 @@
* vhdl.php
* --------
* Author: Alexander 'E-Razor' Krause (admin@erazor-zone.de)
+ * Contributors:
+ * - Kevin Thibedeau (kevinpt@yahoo.com)
* Copyright: (c) 2005 Alexander Krause
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/06/15
*
* VHDL (VHSICADL, very high speed integrated circuit HDL) language file for GeSHi.
*
* CHANGES
* -------
+ * 2012/4/30 (1.0.8.10)
+ * - Reworked to support new features of VHDL-2008.
+ * - Changes include: multi-line comments, all new keywords, PSL keywords and metacomments,
+ * - based literals, attribute highlighting, preprocessor macros (from PSL), and other small
+ * - improvements.
* 2008/05/23 (1.0.7.22)
* - Added description of extra language features (SF#1970248)
* - Optimized regexp group 0 somewhat
@@ -43,56 +50,80 @@
$language_data = array (
'LANG_NAME' => 'VHDL',
'COMMENT_SINGLE' => array(1 => '--'),
- 'COMMENT_MULTI' => array('%' => '%'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ // PSL adds C-preprocessor support
+ 1 => '/(?<=\s)#(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ // PSL metacomments (single-line only for now)
+ 2 => '/--\s*@?psl(?:.)*?;$/m',
+ ),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
'QUOTEMARKS' => array('"'),
'ESCAPE_CHAR' => '',
'KEYWORDS' => array(
/*keywords*/
1 => array(
- 'access','after','alias','all','assert','attribute','architecture','begin',
- 'block','body','buffer','bus','case','component','configuration','constant',
- 'disconnect','downto','else','elsif','end','entity','exit','file','for',
+ 'access','after','alias','all','attribute','architecture','array','begin',
+ 'block','body','buffer','bus','case','case?','component','configuration','constant','context',
+ 'disconnect','downto','else','elsif','end','entity','exit','file','for','force',
'function','generate','generic','group','guarded','if','impure','in',
'inertial','inout','is','label','library','linkage','literal','loop',
'map','new','next','null','of','on','open','others','out','package',
- 'port','postponed','procedure','process','pure','range','record','register',
- 'reject','report','return','select','severity','signal','shared','subtype',
+ 'port','postponed','procedure','process','protected','pure','range','record','register',
+ 'reject','release','report','return','select','severity','shared','signal','subtype',
'then','to','transport','type','unaffected','units','until','use','variable',
- 'wait','when','while','with','note','warning','error','failure','and',
- 'or','xor','not','nor','used','memory','segments','dff','dffe','help_id',
- 'mod','info','latch','rising_edge','falling_edge'
- ),
- /*types*/
+ 'wait','when','while','with'
+ ),
+ /*types and standard libs*/
2 => array(
- 'bit','bit_vector','character','boolean','integer','real','time','string',
+ 'bit','bit_vector','character','boolean','integer','real','time','delay_length','string',
'severity_level','positive','natural','signed','unsigned','line','text',
- 'std_logic','std_logic_vector','std_ulogic','std_ulogic_vector','qsim_state',
- 'qsim_state_vector','qsim_12state','qsim_12state_vector','qsim_strength',
- 'mux_bit','mux_vector','reg_bit','reg_vector','wor_bit','wor_vector',
- 'work','ieee','std_logic_signed','std_logic_1164','std_logic_arith',
- 'numeric_std'
-
- ),
+ 'std_logic','std_logic_vector','std_ulogic','std_ulogic_vector',
+ 'sfixed','ufixed','float','float32','float64','float128',
+ 'work','ieee','std_logic_1164','math_real','math_complex','textio',
+ 'numeric_std','numeric_std_signed','numeric_std_unsigned','numeric_bit'
+ ),
/*operators*/
- ),
+ 3 => array(
+ 'abs','and','mod','nor','not','or','rem','rol','ror','sla','sll','sra','srl','xnor','xor'
+ ),
+ /*psl*/
+ 4 => array(
+ 'assert','assume','assume_guarantee','clock','const','countones','cover','default',
+ 'endpoint','fairness','fell','forall','inf','inherit','isunknown','onehot','onehot0','property',
+ 'prev','restrict','restrict_guarantee','rose','sequence','stable','strong','union','vmode','vprop','vunit'
+ ),
+ /*psl operators*/
+ 5 => array(
+ 'abort','always','before','before!','before!_','before_','eventually!','never',
+ 'next!','next_a','next_a!','next_e','next_e!','next_event','next_event!','next_event_a','next_event_a!',
+ 'next_event_e','next_event_e!','until!','until!_','until_','within'
+ )
+ ),
'SYMBOLS' => array(
'[', ']', '(', ')',
';',':',
- '<','>','=','<=',':=','=>','=='
+ '<','>','=','+','-','*','/','&','|','?'
),
'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
1 => false,
- 2 => false
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false
),
'STYLES' => array(
'KEYWORDS' => array(
1 => 'color: #000080; font-weight: bold;',
- 2 => 'color: #0000ff;'
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #000080; font-weight: bold;',
+ 5 => 'color: #000066;'
),
'COMMENTS' => array(
1 => 'color: #008000; font-style: italic;',
+ 2 => 'color: #ff0000; font-weight: bold;',
'MULTI' => 'color: #008000; font-style: italic;'
),
'ESCAPE_CHAR' => array(
@@ -114,25 +145,33 @@ $language_data = array (
),
'REGEXPS' => array(
0 => 'color: #ff0000;',
- 1 => 'color: #ff0000;'
+ //1 => 'color: #ff0000;',
+ 2 => 'color: #ee82ee;'
),
'SCRIPT' => array(
)
),
'URLS' => array(
1 => '',
- 2 => ''
- ),
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
'OOLANG' => false,
'OBJECT_SPLITTERS' => array(
),
'REGEXPS' => array(
- //Hex numbers and scientific notation for numbers
- 0 => '(\b0x[0-9a-fA-F]+|\b\d[0-9a-fA-F]+[hH])|'.
- '(\b\d+?(\.\d+?)?E[+\-]?\d+)|(\bns)|'.
- "('[0-9a-zA-Z]+(?!'))",
- //Number characters?
- 1 => "\b(''\d'')"
+ //Based literals, scientific notation, and time units
+ 0 => '(\b\d+#[[:xdigit:]_]+#)|'.
+ '(\b[\d_]+(\.[\d_]+)?[eE][+\-]?[\d_]+)|'.
+ '(\b(hr|min|sec|ms|us|ns|ps|fs)\b)',
+ //Character literals
+ /* GeSHi won't match this pattern for some reason and QUOTEMARKS
+ * can't be used because it interferes with attribute parsing */
+ /*1 => "\b'.'\b",*/
+ //Attributes
+ 2 => "'\w+(?!')"
),
'STRICT_MODE_APPLIES' => GESHI_NEVER,
'SCRIPT_DELIMITERS' => array(
diff --git a/inc/geshi/vim.php b/inc/geshi/vim.php
index f4f93ad2e..fe7e5e006 100644
--- a/inc/geshi/vim.php
+++ b/inc/geshi/vim.php
@@ -6,7 +6,7 @@
* Contributors:
* - Laurent Peuch (psycojoker@gmail.com)
* Copyright: (c) 2008 Swaroop C H (http://www.swaroopch.com)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/10/19
*
* Vim scripting language file for GeSHi.
diff --git a/inc/geshi/visualfoxpro.php b/inc/geshi/visualfoxpro.php
index 7d804257f..123a3db41 100644
--- a/inc/geshi/visualfoxpro.php
+++ b/inc/geshi/visualfoxpro.php
@@ -4,7 +4,7 @@
* ----------------
* Author: Roberto Armellin (r.armellin@tin.it)
* Copyright: (c) 2004 Roberto Armellin, Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/09/17
*
* Visual FoxPro language file for GeSHi.
diff --git a/inc/geshi/visualprolog.php b/inc/geshi/visualprolog.php
index 5afd7de8d..d36f1c67a 100644
--- a/inc/geshi/visualprolog.php
+++ b/inc/geshi/visualprolog.php
@@ -4,7 +4,7 @@
* ----------
* Author: Thomas Linder Puls (puls@pdc.dk)
* Copyright: (c) 2008 Thomas Linder Puls (puls@pdc.dk)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/11/20
*
* Visual Prolog language file for GeSHi.
diff --git a/inc/geshi/whitespace.php b/inc/geshi/whitespace.php
index c47775d44..58f396376 100644
--- a/inc/geshi/whitespace.php
+++ b/inc/geshi/whitespace.php
@@ -4,7 +4,7 @@
* ----------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2009/10/31
*
* Whitespace language file for GeSHi.
diff --git a/inc/geshi/whois.php b/inc/geshi/whois.php
index 9b4b24179..a89e4731d 100644
--- a/inc/geshi/whois.php
+++ b/inc/geshi/whois.php
@@ -4,7 +4,7 @@
* --------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/09/14
*
* Whois response (RPSL format) language file for GeSHi.
diff --git a/inc/geshi/winbatch.php b/inc/geshi/winbatch.php
index 949e61c14..3599a027c 100644
--- a/inc/geshi/winbatch.php
+++ b/inc/geshi/winbatch.php
@@ -4,7 +4,7 @@
* ------------
* Author: Craig Storey (storey.craig@gmail.com)
* Copyright: (c) 2004 Craig Storey (craig.xcottawa.ca)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2006/05/19
*
* WinBatch language file for GeSHi.
diff --git a/inc/geshi/xbasic.php b/inc/geshi/xbasic.php
index a2d85a6df..2edede364 100644
--- a/inc/geshi/xbasic.php
+++ b/inc/geshi/xbasic.php
@@ -4,9 +4,8 @@
* ----------
* Author: Jos Gabriel Moya Yangela (josemoya@gmail.com)
* Copyright: (c) 2005 Jos Gabriel Moya Yangela (http://aprenderadesaprender.6te.net)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2005/11/23
- * Last Modified: $Date: 2010/01/30 00:42:00 $
*
* XBasic language file for GeSHi.
*
diff --git a/inc/geshi/xml.php b/inc/geshi/xml.php
index efd3e6c33..6354e457b 100644
--- a/inc/geshi/xml.php
+++ b/inc/geshi/xml.php
@@ -4,7 +4,7 @@
* -------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2004/09/01
*
* XML language file for GeSHi. Based on the idea/file by Christian Weiske
diff --git a/inc/geshi/xorg_conf.php b/inc/geshi/xorg_conf.php
index 5cde8e171..99edc6652 100644
--- a/inc/geshi/xorg_conf.php
+++ b/inc/geshi/xorg_conf.php
@@ -4,7 +4,7 @@
* ----------
* Author: Milian Wolff (mail@milianw.de)
* Copyright: (c) 2008 Milian Wolff (http://milianw.de)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2008/06/18
*
* xorg.conf language file for GeSHi.
diff --git a/inc/geshi/xpp.php b/inc/geshi/xpp.php
index 216c46eaf..a06e27794 100644
--- a/inc/geshi/xpp.php
+++ b/inc/geshi/xpp.php
@@ -4,7 +4,7 @@
* -------
* Author: Simon Butcher (simon@butcher.name)
* Copyright: (c) 2007 Simon Butcher (http://simon.butcher.name/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/02/27
*
* Axapta/Dynamics Ax X++ language file for GeSHi.
diff --git a/inc/geshi/yaml.php b/inc/geshi/yaml.php
new file mode 100644
index 000000000..a2974eb57
--- /dev/null
+++ b/inc/geshi/yaml.php
@@ -0,0 +1,150 @@
+<?php
+/*************************************************************************************
+ * yaml.php
+ * --------
+ * Author: Josh Ventura (JoshV10@gmail.com)
+ * Copyright: (c) 2010 Josh Ventura
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/12/14
+ *
+ * YAML language file for GeSHi.
+ *
+ * YAML gets hairy sometimes. If anything needs fixed, drop me an email and
+ * I'll probably spit up on it. This is, in general, not a long format.
+ *
+ * CHANGES
+ * ---------
+ * 2010/12/14
+ * - Started project in rage over GML support but not YAML support. WTFH?
+ * 2010/12/15
+ * - Submitted to Ben.
+ *
+ * TODO (not updated since release)
+ * ----------------------------------
+ * - Field testing and necessary corrections: this grammar file is usable, but not
+ * completely accurate. There are, in fact, multiple cases in which it will mess
+ * up, and some of it may need moved around. It is the most temperamental parser
+ * I have ever associated my name with. Points of interest follow:
+ * * Improvised support for | and >: since PHP offers no variable-width lookbehind,
+ * these blocks will still be highlighted even when commented out. As it happens,
+ * any line ending with | or > could result in the unintentional highlighting of
+ * all remaining lines in the file, just because I couldn't check for this regex
+ * as a lookbehind: '/:(\s+)(!!(\w+)(\s+))?/'
+ * If there is a workaround for that, it needs implemented.
+ * * I may be missing some operators. I deliberately omitted inline array notation
+ * as, in general, it's ugly and tends to conflict with plain-text. Ensuring all
+ * highlighted list delimiters are not plain text would be as simple as checking
+ * that they follow a colon directly. Alas, without variable-length lookbehinds,
+ * if there is a way to do so in GeSHi I am unaware of it.
+ * * I kind of whored the comment regexp array. It seemed like a safe bet, so it's
+ * where I crammed everything. Some of it may need moved elsewhere for neatness.
+ * * The !!typename highlight needs not to interfere with ": |" and ": >": Pairing
+ * key: !!type | value is perfectly legal, but again due to lookbehind issues, I
+ * can't add a case for that. Also, it is likely that multiple spaces can be put
+ * between the colon and pipe symbol, which would also break it.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'YAML',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ //Keys
+ 'COMMENT_REGEXP' => array( // ENTRY ZERO SHOULD CHECK FOR (\n(\s*)([^#%]+?):(\s+)(!!(\w+)(\s+))?) AS A LOOKBEHIND, BUT IT CAN'T.
+ 0 => '/(?<=\s[\|>]\n)(\s+)(.*)((?=[\n$])(([\n^](\1(.*)|(?=[\n$])))*)|$)/', // Pipe blocks and > blocks.
+ 1 => '/#(.*)/', // Blue # comments
+ 2 => '/%(.*)/', // Red % comments
+ 3 => '/(^|\n)([^#%^\n]+?)(?=: )/', // Key-value names
+ 4 => '/(^|\n)([^#%^\n]+?)(?=:\n)/',// Key-group names
+ 5 => '/(?<=^---)(\s*)!(\S+)/', // Comments after ---
+ 6 => '/(?<=: )(\s*)\&(\S+)/', // References
+ 7 => '/(?<=: )(\s*)\*(\S+)/', // Dereferences
+ 8 => '/!!(\w+)/', // Types
+ //9 => '/(?<=\n)(\s*)-(?!-)/', // List items: This needs to search within comments 3 and 4, but I don't know how.
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'all','any','none', "yes", "no"
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 1 => array('---', '...'),
+ 2 => array(': ', ">\n", "|\n", '<<:', ":\n") // It'd be nice if I could specify that the colon must
+ // follow comment 3 or 4 to be considered, and the > and |
+ // must follow such a colon.
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #303050;background-color: #F5F5F5',
+ 1 => 'color: blue;',
+ 2 => 'font-weight: bold; color: red;',
+ 3 => 'color: green;',
+ 4 => 'color: #007F45;',
+ 5 => 'color: #7f7fFF;',
+ 6 => 'color: #FF7000;',
+ 7 => 'color: #FF45C0;',
+ 8 => 'font-weight: bold; color: #005F5F;',
+ //9 => 'font-weight: bold; color: #000000;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #CF00CF;'
+ ),
+ 'NUMBERS' => array(
+ // 0 => 'color: #33f;' // Don't highlight numbers, really...
+ ),
+ 'METHODS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: cyan;',
+ 2 => 'font-weight: bold; color: brown;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(1 => ''),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array( ),
+ 'REGEXPS' => array( ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array( ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array( )
+);
+
+?> \ No newline at end of file
diff --git a/inc/geshi/z80.php b/inc/geshi/z80.php
index f28593cd2..47326bb21 100644
--- a/inc/geshi/z80.php
+++ b/inc/geshi/z80.php
@@ -4,7 +4,7 @@
* -------
* Author: Benny Baumann (BenBE@omorphia.de)
* Copyright: (c) 2007-2008 Benny Baumann (http://www.omorphia.de/)
- * Release Version: 1.0.8.8
+ * Release Version: 1.0.8.11
* Date Started: 2007/02/06
*
* ZiLOG Z80 Assembler language file for GeSHi.
diff --git a/inc/geshi/zxbasic.php b/inc/geshi/zxbasic.php
new file mode 100644
index 000000000..b1de472b5
--- /dev/null
+++ b/inc/geshi/zxbasic.php
@@ -0,0 +1,150 @@
+<?php
+/*************************************************************************************
+ * zxbasic.php
+ * -------------
+ * Author: Jose Rodriguez (a.k.a. Boriel)
+ * Based on Copyright: (c) 2005 Roberto Rossi (http://rsoftware.altervista.org) Freebasic template
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/19
+ *
+ * ZXBasic language file for GeSHi.
+ *
+ * More details at http://www.zxbasic.net/
+ *
+ * CHANGES
+ * -------
+ * 2010/06/19 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2007/02/06)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ZXBasic',
+ 'COMMENT_SINGLE' => array(
+ 1 => "'",
+ 2 => '#',
+ 3 => 'REM'
+ ),
+ 'COMMENT_MULTI' => array("/'" => "'/"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER, //GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ "ASM", "BEEP", "BOLD", "BORDER", "BRIGHT", "ByRef", "ByVal", "CAST",
+ "CIRCLE", "CLS", "CONST", "CONTINUE", "DECLARE", "DIM", "DO",
+ "DRAW", "ELSE", "ELSEIF", "END", "EXIT", "FastCall", "FLASH", "FOR",
+ "FUNCTION", "GOTO", "GOSUB", "GO", "IF", "INK", "INVERSE", "ITALIC",
+ "LET", "LOAD", "LOOP", "NEXT", "OVER", "PAPER", "PAUSE", "PI",
+ "PLOT", "POKE", "PRINT", "RANDOMIZE", "REM", "RETURN", "SAVE",
+ "StdCall", "Sub", "THEN", "TO", "UNTIL", "VERIFY", "WEND", "WHILE",
+ ),
+
+ // types
+ 2 => array(
+ 'byte', 'ubyte', 'integer', 'uinteger', 'long', 'ulong', 'fixed',
+ 'float', 'string'
+ ),
+
+ // Functions
+ 3 => array(
+ "ABS", "ACS", "ASN", "ATN", "CHR", "CODE", "COS", "CSRLIN", "EXP",
+ "HEX", "HEX16", "INKEY", "INT", "LEN", "LN", "PEEK", "POS", "RND",
+ "SCREEN$", "SGN", "SIN", "SQR", "STR", "TAN", "VAL",
+ ),
+
+ // Operators and modifiers
+ 4 => array(
+ "AT", "AS", "AND", "MOD", "NOT", "OR", "SHL", "SHR", "STEP", "XOR"
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080; font-weight: bold;', // Commands
+ 2 => 'color: #800080; font-weight: bold;', // Types
+ 3 => 'color: #006000; font-weight: bold;', // Functions
+ 4 => 'color: #801010; font-weight: bold;' // Operators and Modifiers
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #339933;',
+ 3 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'BRACKETS' => array(
+ //0 => 'color: #66cc66;'
+ 0 => 'color: #007676;'
+ ),
+ 'STRINGS' => array(
+ //0 => 'color: #ff0000;'
+ 0 => 'color: #A00000; font-style: italic;'
+ ),
+ 'NUMBERS' => array(
+ //0 => 'color: #cc66cc;'
+ 0 => 'color: #b05103;'// font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/inc/html.php b/inc/html.php
index 1a2d7daef..f4e6af663 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -13,6 +13,10 @@ if(!defined('NL')) define('NL',"\n");
* Convenience function to quickly build a wikilink
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $id id of the target page
+ * @param string $name the name of the link, i.e. the text that is displayed
+ * @param string|array $search search string(s) that shall be highlighted in the target page
+ * @return string the HTML code of the link
*/
function html_wikilink($id,$name=null,$search=''){
static $xhtml_renderer = null;
@@ -46,6 +50,7 @@ function html_login(){
global $lang;
global $conf;
global $ID;
+ global $INPUT;
print p_locale_xhtml('login');
print '<div class="centeralign">'.NL;
@@ -53,7 +58,7 @@ function html_login(){
$form->startFieldset($lang['btn_login']);
$form->addHidden('id', $ID);
$form->addHidden('do', 'login');
- $form->addElement(form_makeTextField('u', ((!$_REQUEST['http_credentials']) ? $_REQUEST['u'] : ''), $lang['user'], 'focus__this', 'block'));
+ $form->addElement(form_makeTextField('u', ((!$INPUT->bool('http_credentials')) ? $INPUT->str('u') : ''), $lang['user'], 'focus__this', 'block'));
$form->addElement(form_makePasswordField('p', $lang['pass'], '', 'block'));
if($conf['rememberme']) {
$form->addElement(form_makeCheckboxField('r', '1', $lang['remember'], 'remember__me', 'simple'));
@@ -120,7 +125,7 @@ function html_secedit_get_button($data) {
global $ID;
global $INFO;
- if (!isset($data['name']) || $data['name'] === '') return;
+ if (!isset($data['name']) || $data['name'] === '') return '';
$name = $data['name'];
unset($data['name']);
@@ -145,7 +150,6 @@ function html_secedit_get_button($data) {
function html_topbtn(){
global $lang;
- $ret = '';
$ret = '<a class="nolink" href="#dokuwiki__top"><input type="button" class="button" value="'.$lang['btn_top'].'" onclick="window.scrollTo(0, 0)" title="'.$lang['btn_top'].'" /></a>';
return $ret;
@@ -165,7 +169,6 @@ function html_btn($name,$id,$akey,$params,$method='get',$tooltip='',$label=false
$label = $lang['btn_'.$name];
$ret = '';
- $tip = '';
//filter id (without urlencoding)
$id = idfilter($id,false);
@@ -229,12 +232,12 @@ function html_show($txt=null){
//PreviewHeader
echo '<br id="scroll__here" />';
echo p_locale_xhtml('preview');
- echo '<div class="preview">';
+ echo '<div class="preview"><div class="pad">';
$html = html_secedit(p_render('xhtml',p_get_instructions($txt),$info),$secedit);
if($INFO['prependTOC']) $html = tpl_toc(true).$html;
echo $html;
echo '<div class="clearer"></div>';
- echo '</div>';
+ echo '</div></div>';
}else{
if ($REV) print p_locale_xhtml('showrev');
@@ -255,7 +258,6 @@ function html_draft(){
global $INFO;
global $ID;
global $lang;
- global $conf;
$draft = unserialize(io_readFile($INFO['draft'],false));
$text = cleanText(con($draft['prefix'],$draft['text'],$draft['suffix'],true));
@@ -280,8 +282,11 @@ function html_draft(){
* @author Harry Fuecks <hfuecks@gmail.com>
*/
function html_hilight($html,$phrases){
- $phrases = array_filter((array) $phrases);
- $regex = join('|',array_map('ft_snippet_re_preprocess', array_map('preg_quote_cb',$phrases)));
+ $phrases = (array) $phrases;
+ $phrases = array_map('preg_quote_cb', $phrases);
+ $phrases = array_map('ft_snippet_re_preprocess', $phrases);
+ $phrases = array_filter($phrases);
+ $regex = join('|',$phrases);
if ($regex === '') return $html;
if (!utf8_check($regex)) return $html;
@@ -308,9 +313,7 @@ function html_hilight_callback($m) {
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_search(){
- global $conf;
global $QUERY;
- global $ID;
global $lang;
$intro = p_locale_xhtml('searchpage');
@@ -323,16 +326,14 @@ function html_search(){
flush();
//show progressbar
- print '<div class="centeralign" id="dw__loading">'.NL;
- print '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'.NL;
+ print '<div id="dw__loading">'.NL;
+ print '<script type="text/javascript">/*<![CDATA[*/'.NL;
print 'showLoadBar();'.NL;
- print '//--><!]]></script>'.NL;
- print '<br /></div>'.NL;
+ print '/*!]]>*/</script>'.NL;
+ print '</div>'.NL;
flush();
//do quick pagesearch
- $data = array();
-
$data = ft_pageLookup($QUERY,true,useHeading('navigation'));
if(count($data)){
print '<div class="search_quickresult">';
@@ -363,28 +364,32 @@ function html_search(){
//do fulltext search
$data = ft_pageSearch($QUERY,$regex);
if(count($data)){
+ print '<dl class="search_results">';
$num = 1;
foreach($data as $id => $cnt){
- print '<div class="search_result">';
+ print '<dt>';
print html_wikilink(':'.$id,useHeading('navigation')?null:$id,$regex);
if($cnt !== 0){
- print ': <span class="search_cnt">'.$cnt.' '.$lang['hits'].'</span><br />';
+ print ': '.$cnt.' '.$lang['hits'].'';
+ }
+ print '</dt>';
+ if($cnt !== 0){
if($num < FT_SNIPPET_NUMBER){ // create snippets for the first number of matches only
- print '<div class="search_snippet">'.ft_snippet($id,$regex).'</div>';
+ print '<dd>'.ft_snippet($id,$regex).'</dd>';
}
$num++;
}
- print '</div>';
flush();
}
+ print '</dl>';
}else{
print '<div class="nothing">'.$lang['nothingfound'].'</div>';
}
//hide progressbar
- print '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'.NL;
+ print '<script type="text/javascript">/*<![CDATA[*/'.NL;
print 'hideLoadBar("dw__loading");'.NL;
- print '//--><!]]></script>'.NL;
+ print '/*!]]>*/</script>'.NL;
flush();
}
@@ -449,7 +454,7 @@ function html_revisions($first=0, $media_id = false){
if (!$media_id) print p_locale_xhtml('revisions');
- $params = array('id' => 'page__revisions');
+ $params = array('id' => 'page__revisions', 'class' => 'changes');
if ($media_id) $params['action'] = media_managerURL(array('image' => $media_id), '&');
$form = new Doku_Form($params);
@@ -458,6 +463,9 @@ function html_revisions($first=0, $media_id = false){
if (!$media_id) $exists = $INFO['exists'];
else $exists = @file_exists(mediaFN($id));
+ $display_name = (!$media_id && useHeading('navigation')) ? hsc(p_get_first_heading($id)) : $id;
+ if (!$display_name) $display_name = $id;
+
if($exists && $first==0){
if (!$media_id && isset($INFO['meta']) && isset($INFO['meta']['last_change']) && $INFO['meta']['last_change']['type']===DOKU_CHANGE_TYPE_MINOR_EDIT)
$form->addElement(form_makeOpenTag('li', array('class' => 'minor')));
@@ -480,14 +488,14 @@ function html_revisions($first=0, $media_id = false){
$form->addElement(form_makeOpenTag('a', array(
'class' => 'wikilink1',
'href' => $href)));
- $form->addElement($id);
+ $form->addElement($display_name);
$form->addElement(form_makeCloseTag('a'));
if ($media_id) $form->addElement(form_makeOpenTag('div'));
if (!$media_id) {
$form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
- $form->addElement(' &ndash; ');
+ $form->addElement(' – ');
$form->addElement(htmlspecialchars($INFO['sum']));
$form->addElement(form_makeCloseTag('span'));
}
@@ -555,18 +563,18 @@ function html_revisions($first=0, $media_id = false){
if (!$media_id) $href = wl($id,"rev=$rev",false,'&');
else $href = media_managerURL(array('image' => $id, 'tab_details' => 'view', 'rev' => $rev), '&');
$form->addElement(form_makeOpenTag('a', array('href' => $href, 'class' => 'wikilink1')));
- $form->addElement($id);
+ $form->addElement($display_name);
$form->addElement(form_makeCloseTag('a'));
}else{
$form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />');
- $form->addElement($id);
+ $form->addElement($display_name);
}
if ($media_id) $form->addElement(form_makeOpenTag('div'));
if ($info['sum']) {
$form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
- if (!$media_id) $form->addElement(' &ndash; ');
+ if (!$media_id) $form->addElement(' – ');
$form->addElement(htmlspecialchars($info['sum']));
$form->addElement(form_makeCloseTag('span'));
}
@@ -664,12 +672,13 @@ function html_recent($first=0, $show_changes='both'){
if (getNS($ID) != '')
print '<div class="level1"><p>' . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) . '</p></div>';
- $form = new Doku_Form(array('id' => 'dw__recent', 'method' => 'GET'));
+ $form = new Doku_Form(array('id' => 'dw__recent', 'method' => 'GET', 'class' => 'changes'));
$form->addHidden('sectok', null);
$form->addHidden('do', 'recent');
$form->addHidden('id', $ID);
if ($conf['mediarevisions']) {
+ $form->addElement('<div class="changeType">');
$form->addElement(form_makeListboxField(
'show_changes',
array(
@@ -682,6 +691,7 @@ function html_recent($first=0, $show_changes='both'){
array('class'=>'quickselect')));
$form->addElement(form_makeButton('submit', 'recent', $lang['btn_apply']));
+ $form->addElement('</div>');
}
$form->addElement(form_makeOpenTag('ul'));
@@ -699,13 +709,16 @@ function html_recent($first=0, $show_changes='both'){
$form->addElement(media_printicon($recent['id']));
} else {
$icon = DOKU_BASE.'lib/images/fileicons/file.png';
- $form->addElement('<img src="'.$icon.'" alt="'.$filename.'" class="icon" />');
+ $form->addElement('<img src="'.$icon.'" alt="'.$recent['id'].'" class="icon" />');
}
$form->addElement(form_makeOpenTag('span', array('class' => 'date')));
$form->addElement($date);
$form->addElement(form_makeCloseTag('span'));
+ $diff = false;
+ $href = '';
+
if ($recent['media']) {
$diff = (count(getRevisions($recent['id'], 0, 1, 8192, true)) && @file_exists(mediaFN($recent['id'])));
if ($diff) {
@@ -756,7 +769,7 @@ function html_recent($first=0, $show_changes='both'){
$form->addElement(html_wikilink(':'.$recent['id'],useHeading('navigation')?null:$recent['id']));
}
$form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
- $form->addElement(' &ndash; '.htmlspecialchars($recent['sum']));
+ $form->addElement(' – '.htmlspecialchars($recent['sum']));
$form->addElement(form_makeCloseTag('span'));
$form->addElement(form_makeOpenTag('span', array('class' => 'user')));
@@ -815,7 +828,6 @@ function html_recent($first=0, $show_changes='both'){
function html_index($ns){
global $conf;
global $ID;
- $dir = $conf['datadir'];
$ns = cleanID($ns);
#fixme use appropriate function
if(empty($ns)){
@@ -851,7 +863,8 @@ function html_list_index($item){
$ret .= $base;
$ret .= '</strong></a>';
}else{
- $ret .= html_wikilink(':'.$item['id']);
+ // default is noNSorNS($id), but we want noNS($id) when useheading is off FS#2605
+ $ret .= html_wikilink(':'.$item['id'], useHeading('navigation') ? null : noNS($item['id']));
}
return $ret;
}
@@ -965,7 +978,6 @@ function html_buildlist($data,$class,$func,$lifunc='html_li_default',$forcewrapp
*/
function html_backlinks(){
global $ID;
- global $conf;
global $lang;
print p_locale_xhtml('backlinks');
@@ -985,6 +997,14 @@ function html_backlinks(){
}
}
+/**
+ * Get header of diff HTML
+ * @param string $l_rev Left revisions
+ * @param string $r_rev Right revision
+ * @param string $id Page id, if null $ID is used
+ * @param bool $media If it is for media files
+ * @return array HTML snippets for diff header
+ */
function html_diff_head($l_rev, $r_rev, $id = null, $media = false) {
global $lang;
if ($id === null) {
@@ -1060,15 +1080,16 @@ function html_diff_head($l_rev, $r_rev, $id = null, $media = false) {
*
* @author Andreas Gohr <andi@splitbrain.org>
* @param string $text - compare with this text with most current version
- * @param bool $intr - display the intro text
+ * @param bool $intro - display the intro text
+ * @param string $type type of the diff (inline or sidebyside)
*/
function html_diff($text='',$intro=true,$type=null){
global $ID;
global $REV;
global $lang;
- global $conf;
+ global $INPUT;
- if(!$type) $type = $_REQUEST['difftype'];
+ if(!$type) $type = $INPUT->str('difftype');
if($type != 'inline') $type = 'sidebyside';
// we're trying to be clever here, revisions to compare can be either
@@ -1076,16 +1097,17 @@ function html_diff($text='',$intro=true,$type=null){
// array in rev2.
$rev1 = $REV;
- if(is_array($_REQUEST['rev2'])){
- $rev1 = (int) $_REQUEST['rev2'][0];
- $rev2 = (int) $_REQUEST['rev2'][1];
+ $rev2 = $INPUT->ref('rev2');
+ if(is_array($rev2)){
+ $rev1 = (int) $rev2[0];
+ $rev2 = (int) $rev2[1];
if(!$rev1){
$rev1 = $rev2;
unset($rev2);
}
}else{
- $rev2 = (int) $_REQUEST['rev2'];
+ $rev2 = $INPUT->int('rev2');
}
$r_minor = '';
@@ -1102,7 +1124,7 @@ function html_diff($text='',$intro=true,$type=null){
$r_text = cleanText($text);
$r_head = $lang['yours'];
}else{
- if($rev1 && $rev2){ // two specific revisions wanted
+ if($rev1 && isset($rev2) && $rev2){ // two specific revisions wanted
// make sure order is correct (older on the left)
if($rev1 < $rev2){
$l_rev = $rev1;
@@ -1141,8 +1163,6 @@ function html_diff($text='',$intro=true,$type=null){
$tdf = new TableDiffFormatter();
}
-
-
if($intro) print p_locale_xhtml('diff');
if (!$text) {
@@ -1165,7 +1185,6 @@ function html_diff($text='',$intro=true,$type=null){
$form->addElement(form_makeButton('submit', 'diff','Go'));
$form->printForm();
-
$diffurl = wl($ID, array(
'do' => 'diff',
'rev2[0]' => $l_rev,
@@ -1176,6 +1195,7 @@ function html_diff($text='',$intro=true,$type=null){
ptln('</div>');
}
?>
+ <div class="table">
<table class="diff diff_<?php echo $type?>">
<tr>
<th colspan="2" <?php echo $l_minor?>>
@@ -1187,6 +1207,7 @@ function html_diff($text='',$intro=true,$type=null){
</tr>
<?php echo $tdf->format($df)?>
</table>
+ </div>
<?php
}
@@ -1217,6 +1238,7 @@ function html_conflict($text,$summary){
*/
function html_msgarea(){
global $MSG, $MSG_shown;
+ /** @var array $MSG */
// store if the global $MSG has already been shown and thus HTML output has been started
$MSG_shown = true;
@@ -1243,7 +1265,7 @@ function html_msgarea(){
function html_register(){
global $lang;
global $conf;
- global $ID;
+ global $INPUT;
print p_locale_xhtml('register');
print '<div class="centeralign">'.NL;
@@ -1251,13 +1273,13 @@ function html_register(){
$form->startFieldset($lang['btn_register']);
$form->addHidden('do', 'register');
$form->addHidden('save', '1');
- $form->addElement(form_makeTextField('login', $_POST['login'], $lang['user'], '', 'block', array('size'=>'50')));
+ $form->addElement(form_makeTextField('login', $INPUT->post->str('login'), $lang['user'], '', 'block', array('size'=>'50')));
if (!$conf['autopasswd']) {
$form->addElement(form_makePasswordField('pass', $lang['pass'], '', 'block', array('size'=>'50')));
$form->addElement(form_makePasswordField('passchk', $lang['passchk'], '', 'block', array('size'=>'50')));
}
- $form->addElement(form_makeTextField('fullname', $_POST['fullname'], $lang['fullname'], '', 'block', array('size'=>'50')));
- $form->addElement(form_makeTextField('email', $_POST['email'], $lang['email'], '', 'block', array('size'=>'50')));
+ $form->addElement(form_makeTextField('fullname', $INPUT->post->str('fullname'), $lang['fullname'], '', 'block', array('size'=>'50')));
+ $form->addElement(form_makeTextField('email', $INPUT->post->str('email'), $lang['email'], '', 'block', array('size'=>'50')));
$form->addElement(form_makeButton('submit', '', $lang['btn_register']));
$form->endFieldset();
html_form('register', $form);
@@ -1274,26 +1296,27 @@ function html_register(){
function html_updateprofile(){
global $lang;
global $conf;
- global $ID;
+ global $INPUT;
global $INFO;
+ /** @var auth_basic $auth */
global $auth;
print p_locale_xhtml('updateprofile');
- if (empty($_POST['fullname'])) $_POST['fullname'] = $INFO['userinfo']['name'];
- if (empty($_POST['email'])) $_POST['email'] = $INFO['userinfo']['mail'];
+ $fullname = $INPUT->post->str('fullname', $INFO['userinfo']['name'], true);
+ $email = $INPUT->post->str('email', $INFO['userinfo']['mail'], true);
print '<div class="centeralign">'.NL;
$form = new Doku_Form(array('id' => 'dw__register'));
$form->startFieldset($lang['profile']);
$form->addHidden('do', 'profile');
$form->addHidden('save', '1');
- $form->addElement(form_makeTextField('fullname', $_SERVER['REMOTE_USER'], $lang['user'], '', 'block', array('size'=>'50', 'disabled'=>'disabled')));
+ $form->addElement(form_makeTextField('login', $_SERVER['REMOTE_USER'], $lang['user'], '', 'block', array('size'=>'50', 'disabled'=>'disabled')));
$attr = array('size'=>'50');
if (!$auth->canDo('modName')) $attr['disabled'] = 'disabled';
- $form->addElement(form_makeTextField('fullname', $_POST['fullname'], $lang['fullname'], '', 'block', $attr));
+ $form->addElement(form_makeTextField('fullname', $fullname, $lang['fullname'], '', 'block', $attr));
$attr = array('size'=>'50');
if (!$auth->canDo('modMail')) $attr['disabled'] = 'disabled';
- $form->addElement(form_makeTextField('email', $_POST['email'], $lang['email'], '', 'block', $attr));
+ $form->addElement(form_makeTextField('email', $email, $lang['email'], '', 'block', $attr));
$form->addElement(form_makeTag('br'));
if ($auth->canDo('modPass')) {
$form->addElement(form_makePasswordField('newpass', $lang['newpass'], '', 'block', array('size'=>'50')));
@@ -1318,6 +1341,7 @@ function html_updateprofile(){
* @triggers HTML_EDITFORM_OUTPUT
*/
function html_edit(){
+ global $INPUT;
global $ID;
global $REV;
global $DATE;
@@ -1330,8 +1354,8 @@ function html_edit(){
global $TEXT;
global $RANGE;
- if (isset($_REQUEST['changecheck'])) {
- $check = $_REQUEST['changecheck'];
+ if ($INPUT->has('changecheck')) {
+ $check = $INPUT->str('changecheck');
} elseif(!$INFO['exists']){
// $TEXT has been loaded from page template
$check = md5('');
@@ -1366,8 +1390,8 @@ function html_edit(){
$data = array('form' => $form,
'wr' => $wr,
'media_manager' => true,
- 'target' => (isset($_REQUEST['target']) && $wr &&
- $RANGE !== '') ? $_REQUEST['target'] : 'section',
+ 'target' => ($INPUT->has('target') && $wr &&
+ $RANGE !== '') ? $INPUT->str('target') : 'section',
'intro_locale' => $include);
if ($data['target'] !== 'section') {
@@ -1382,7 +1406,7 @@ function html_edit(){
}
$form->addHidden('target', $data['target']);
- $form->addElement(form_makeOpenTag('div', array('id'=>'wiki__editbar')));
+ $form->addElement(form_makeOpenTag('div', array('id'=>'wiki__editbar', 'class'=>'editBar')));
$form->addElement(form_makeOpenTag('div', array('id'=>'size__ctl')));
$form->addElement(form_makeCloseTag('div'));
if ($wr) {
@@ -1410,17 +1434,16 @@ function html_edit(){
if ($wr) {
// sets changed to true when previewed
- echo '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'. NL;
+ echo '<script type="text/javascript">/*<![CDATA[*/'. NL;
echo 'textChanged = ' . ($mod ? 'true' : 'false');
- echo '//--><!]]></script>' . NL;
+ echo '/*!]]>*/</script>' . NL;
} ?>
- <div style="width:99%;">
+ <div class="editBox">
<div class="toolbar">
- <div id="draft__status"><?php if(!empty($INFO['draft'])) echo $lang['draftdate'].' '.dformat();?></div>
- <div id="tool__bar"><?php if ($wr && $data['media_manager']){?><a href="<?php echo DOKU_BASE?>lib/exe/mediamanager.php?ns=<?php echo $INFO['namespace']?>"
- target="_blank"><?php echo $lang['mediaselect'] ?></a><?php }?></div>
-
+ <div id="draft__status"><?php if(!empty($INFO['draft'])) echo $lang['draftdate'].' '.dformat();?></div>
+ <div id="tool__bar"><?php if ($wr && $data['media_manager']){?><a href="<?php echo DOKU_BASE?>lib/exe/mediamanager.php?ns=<?php echo $INFO['namespace']?>"
+ target="_blank"><?php echo $lang['mediaselect'] ?></a><?php }?></div>
</div>
<?php
@@ -1437,7 +1460,7 @@ function html_edit_form($param) {
global $TEXT;
if ($param['target'] !== 'section') {
- msg('No editor for edit target ' . $param['target'] . ' found.', -1);
+ msg('No editor for edit target ' . hsc($param['target']) . ' found.', -1);
}
$attr = array('tabindex'=>'1');
@@ -1454,6 +1477,7 @@ function html_edit_form($param) {
function html_minoredit(){
global $conf;
global $lang;
+ global $INPUT;
// minor edits are for logged in users only
if(!$conf['useacl'] || !$_SERVER['REMOTE_USER']){
return false;
@@ -1461,7 +1485,7 @@ function html_minoredit(){
$p = array();
$p['tabindex'] = 3;
- if(!empty($_REQUEST['minor'])) $p['checked']='checked';
+ if($INPUT->bool('minor')) $p['checked']='checked';
return form_makeCheckboxField('minor', '1', $lang['minoredit'], 'minoredit', 'nowrap', $p);
}
@@ -1473,6 +1497,7 @@ function html_minoredit(){
function html_debug(){
global $conf;
global $lang;
+ /** @var auth_basic $auth */
global $auth;
global $INFO;
@@ -1557,14 +1582,15 @@ function html_debug(){
function html_admin(){
global $ID;
global $INFO;
- global $lang;
global $conf;
+ /** @var auth_basic $auth */
global $auth;
// build menu of admin functions from the plugins that handle them
$pluginlist = plugin_list('admin');
$menu = array();
foreach ($pluginlist as $p) {
+ /** @var DokuWiki_Admin_Plugin $obj */
if($obj =& plugin_load('admin',$p) === null) continue;
// check permissions
@@ -1661,26 +1687,46 @@ function html_admin(){
* Form to request a new password for an existing account
*
* @author Benoit Chesneau <benoit@bchesneau.info>
+ * @author Andreas Gohr <gohr@cosmocode.de>
*/
function html_resendpwd() {
global $lang;
global $conf;
- global $ID;
+ global $INPUT;
- print p_locale_xhtml('resendpwd');
- print '<div class="centeralign">'.NL;
- $form = new Doku_Form(array('id' => 'dw__resendpwd'));
- $form->startFieldset($lang['resendpwd']);
- $form->addHidden('do', 'resendpwd');
- $form->addHidden('save', '1');
- $form->addElement(form_makeTag('br'));
- $form->addElement(form_makeTextField('login', $_POST['login'], $lang['user'], '', 'block'));
- $form->addElement(form_makeTag('br'));
- $form->addElement(form_makeTag('br'));
- $form->addElement(form_makeButton('submit', '', $lang['btn_resendpwd']));
- $form->endFieldset();
- html_form('resendpwd', $form);
- print '</div>'.NL;
+ $token = preg_replace('/[^a-f0-9]+/','',$INPUT->str('pwauth'));
+
+ if(!$conf['autopasswd'] && $token){
+ print p_locale_xhtml('resetpwd');
+ print '<div class="centeralign">'.NL;
+ $form = new Doku_Form(array('id' => 'dw__resendpwd'));
+ $form->startFieldset($lang['btn_resendpwd']);
+ $form->addHidden('token', $token);
+ $form->addHidden('do', 'resendpwd');
+
+ $form->addElement(form_makePasswordField('pass', $lang['pass'], '', 'block', array('size'=>'50')));
+ $form->addElement(form_makePasswordField('passchk', $lang['passchk'], '', 'block', array('size'=>'50')));
+
+ $form->addElement(form_makeButton('submit', '', $lang['btn_resendpwd']));
+ $form->endFieldset();
+ html_form('resendpwd', $form);
+ print '</div>'.NL;
+ }else{
+ print p_locale_xhtml('resendpwd');
+ print '<div class="centeralign">'.NL;
+ $form = new Doku_Form(array('id' => 'dw__resendpwd'));
+ $form->startFieldset($lang['resendpwd']);
+ $form->addHidden('do', 'resendpwd');
+ $form->addHidden('save', '1');
+ $form->addElement(form_makeTag('br'));
+ $form->addElement(form_makeTextField('login', $INPUT->post->str('login'), $lang['user'], '', 'block'));
+ $form->addElement(form_makeTag('br'));
+ $form->addElement(form_makeTag('br'));
+ $form->addElement(form_makeButton('submit', '', $lang['btn_resendpwd']));
+ $form->endFieldset();
+ html_form('resendpwd', $form);
+ print '</div>'.NL;
+ }
}
/**
@@ -1692,11 +1738,11 @@ function html_TOC($toc){
if(!count($toc)) return '';
global $lang;
$out = '<!-- TOC START -->'.DOKU_LF;
- $out .= '<div class="toc">'.DOKU_LF;
- $out .= '<div class="tocheader toctoggle" id="toc__header">';
+ $out .= '<div id="dw__toc">'.DOKU_LF;
+ $out .= '<h3 class="toggle">';
$out .= $lang['toc'];
- $out .= '</div>'.DOKU_LF;
- $out .= '<div id="toc__inside">'.DOKU_LF;
+ $out .= '</h3>'.DOKU_LF;
+ $out .= '<div>'.DOKU_LF;
$out .= html_buildlist($toc,'toc','html_list_toc','html_li_default',true);
$out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF;
$out .= '<!-- TOC END -->'.DOKU_LF;
@@ -1713,8 +1759,7 @@ function html_list_toc($item){
$link = $item['link'];
}
- return '<span class="li"><a href="'.$link.'" class="toc">'.
- hsc($item['title']).'</a></span>';
+ return '<a href="'.$link.'">'.hsc($item['title']).'</a>';
}
/**
@@ -1726,9 +1771,9 @@ function html_list_toc($item){
* @param string $text - what to display in the TOC
* @param int $level - nesting level
* @param string $hash - is prepended to the given $link, set blank if you want full links
+ * @return array the toc item
*/
function html_mktocitem($link, $text, $level, $hash='#'){
- global $conf;
return array( 'link' => $hash.$link,
'title' => $text,
'type' => 'ul',
@@ -1740,6 +1785,8 @@ function html_mktocitem($link, $text, $level, $hash='#'){
* Triggers an event with the form name: HTML_{$name}FORM_OUTPUT
*
* @author Tom N Harris <tnharris@whoopdedo.org>
+ * @param string $name The name of the form
+ * @param Doku_Form $form The form
*/
function html_form($name, &$form) {
// Safety check in case the caller forgets.
@@ -1750,6 +1797,7 @@ function html_form($name, &$form) {
/**
* Form print function.
* Just calls printForm() on the data object.
+ * @param Doku_Form $data The form
*/
function html_form_output($data) {
$data->printForm();
@@ -1776,7 +1824,7 @@ function html_form_output($data) {
* @param array $flashvars - parameters to be passed in the flashvar parameter
* @param array $atts - additional attributes for the <object> tag
* @param string $alt - alternative content (is NOT automatically escaped!)
- * @returns string - the XHTML markup
+ * @return string - the XHTML markup
*/
function html_flashobject($swf,$width,$height,$params=null,$flashvars=null,$atts=null,$alt=''){
global $lang;
@@ -1832,6 +1880,12 @@ function html_flashobject($swf,$width,$height,$params=null,$flashvars=null,$atts
return $out;
}
+/**
+ * Prints HTML code for the given tab structure
+ *
+ * @param array $tabs tab structure
+ * @param string $current_tab the current tab id
+ */
function html_tabs($tabs, $current_tab = null) {
echo '<ul class="tabs">'.NL;
diff --git a/inc/httputils.php b/inc/httputils.php
index 0ad97a9a1..4ba287eb5 100644
--- a/inc/httputils.php
+++ b/inc/httputils.php
@@ -15,7 +15,7 @@ define('HTTP_CHUNK_SIZE',16*1024);
*
* @author Simon Willison <swillison@gmail.com>
* @link http://simonwillison.net/2003/Apr/23/conditionalGet/
- * @param timestamp $timestamp lastmodified time of the cache file
+ * @param int $timestamp lastmodified time of the cache file
* @returns void or exits with previously header() commands executed
*/
function http_conditionalRequest($timestamp){
@@ -249,3 +249,11 @@ function http_cached_finish($file, $content) {
print $content;
}
}
+
+function http_get_raw_post_data() {
+ static $postData = null;
+ if ($postData === null) {
+ $postData = file_get_contents('php://input');
+ }
+ return $postData;
+}
diff --git a/inc/indexer.php b/inc/indexer.php
index 9d8d6f99b..f22aee3a0 100644
--- a/inc/indexer.php
+++ b/inc/indexer.php
@@ -65,7 +65,6 @@ define('IDX_ASIAN', '(?:'.IDX_ASIAN1.'|'.IDX_ASIAN2.'|'.IDX_ASIAN3.')');
function idx_get_version(){
static $indexer_version = null;
if ($indexer_version == null) {
- global $conf;
$version = INDEXER_VERSION;
// DokuWiki version is included for the convenience of plugins
@@ -192,7 +191,6 @@ class Doku_Indexer {
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
protected function getPageWords($text) {
- global $conf;
$tokens = $this->tokenizer($text);
$tokens = array_count_values($tokens); // count the frequency of each token
@@ -291,7 +289,6 @@ class Doku_Indexer {
$val_idx = array();
}
-
foreach ($values as $val) {
$val = (string)$val;
if ($val !== "") {
@@ -351,7 +348,7 @@ class Doku_Indexer {
return "locked";
// load known documents
- $pid = $this->getIndexKey('page', '', $page);
+ $pid = $this->addIndexKey('page', '', $page);
if ($pid === false) {
$this->unlock();
return false;
@@ -389,6 +386,7 @@ class Doku_Indexer {
$val_idx = explode(':', $this->getIndexKey($metaname.'_p', '', $pid));
$meta_idx = $this->getIndex($metaname.'_i', '');
foreach ($val_idx as $id) {
+ if ($id === '') continue;
$meta_idx[$id] = $this->updateTuple($meta_idx[$id], $pid, 0);
}
$this->saveIndex($metaname.'_i', '', $meta_idx);
@@ -415,8 +413,6 @@ class Doku_Indexer {
* @author Andreas Gohr <andi@splitbrain.org>
*/
public function tokenizer($text, $wc=false) {
- global $conf;
- $words = array();
$wc = ($wc) ? '' : '\*';
$stopwords =& idx_get_stopwords();
@@ -467,8 +463,8 @@ class Doku_Indexer {
* in the returned list is an array with the page names as keys and the
* number of times that token appears on the page as value.
*
- * @param arrayref $tokens list of words to search for
- * @return array list of page names with usage counts
+ * @param array $tokens list of words to search for
+ * @return array list of page names with usage counts
* @author Tom N Harris <tnharris@whoopdedo.org>
* @author Andreas Gohr <andi@splitbrain.org>
*/
@@ -619,9 +615,9 @@ class Doku_Indexer {
* The $result parameter can be used to merge the index locations with
* the appropriate query term.
*
- * @param arrayref $words The query terms.
- * @param arrayref $result Set to word => array("length*id" ...)
- * @return array Set to length => array(id ...)
+ * @param array $words The query terms.
+ * @param array $result Set to word => array("length*id" ...)
+ * @return array Set to length => array(id ...)
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
protected function getIndexWords(&$words, &$result) {
@@ -732,7 +728,7 @@ class Doku_Indexer {
*
* @param int $min bottom frequency threshold
* @param int $max upper frequency limit. No limit if $max<$min
- * @param int $length minimum length of words to count
+ * @param int $minlen minimum length of words to count
* @param string $key metadata key to list. Uses the fulltext index if not given
* @return array list of words as the keys and frequency as values
* @author Tom N Harris <tnharris@whoopdedo.org>
@@ -759,13 +755,15 @@ class Doku_Indexer {
$val_idx = array();
foreach ($index as $wid => $line) {
$freq = $this->countTuples($line);
- if ($freq >= $min && (!$max || $freq <= $max) && strlen($val) >= $minlen)
+ if ($freq >= $min && (!$max || $freq <= $max))
$val_idx[$wid] = $freq;
}
if (!empty($val_idx)) {
$words = $this->getIndex($metaname.'_w', '');
- foreach ($val_idx as $wid => $freq)
- $result[$words[$wid]] = $freq;
+ foreach ($val_idx as $wid => $freq) {
+ if (strlen($words[$wid]) >= $minlen)
+ $result[$words[$wid]] = $freq;
+ }
}
}
else {
@@ -854,7 +852,8 @@ class Doku_Indexer {
*
* @param string $idx name of the index
* @param string $suffix subpart identifier
- * @param arrayref $linex list of lines without LF
+ * @param array $lines list of lines without LF
+ * @return bool If saving succeeded
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
protected function saveIndex($idx, $suffix, &$lines) {
@@ -904,6 +903,7 @@ class Doku_Indexer {
* @param string $suffix subpart identifier
* @param int $id the line number
* @param string $line line to write
+ * @return bool If saving succeeded
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
protected function saveIndexKey($idx, $suffix, $id, $line) {
@@ -963,6 +963,11 @@ class Doku_Indexer {
return $id;
}
+ /**
+ * @param string $idx The index file which should be added to the key.
+ * @param string $suffix The suffix of the file
+ * @param bool $delete Unused
+ */
protected function cacheIndexDir($idx, $suffix, $delete=false) {
global $conf;
if ($idx == 'i')
@@ -1031,7 +1036,7 @@ class Doku_Indexer {
$fh = @fopen($cachename.'.tmp', 'w');
if (!$fh) {
trigger_error("Failed to write index cache", E_USER_ERROR);
- return;
+ return $lengths;
}
@fwrite($fh, implode("\n", $lengths));
@fclose($fh);
@@ -1131,7 +1136,7 @@ class Doku_Indexer {
/**
* Create an instance of the indexer.
*
- * @return object a Doku_Indexer
+ * @return Doku_Indexer a Doku_Indexer
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function idx_get_indexer() {
@@ -1174,18 +1179,8 @@ function & idx_get_stopwords() {
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function idx_addPage($page, $verbose=false, $force=false) {
- // check if indexing needed
$idxtag = metaFN($page,'.indexed');
- if(!$force && @file_exists($idxtag)){
- if(trim(io_readFile($idxtag)) == idx_get_version()){
- $last = @filemtime($idxtag);
- if($last > @filemtime(wikiFN($page))){
- if ($verbose) print("Indexer: index for $page up to date".DOKU_LF);
- return false;
- }
- }
- }
-
+ // check if page was deleted but is still in the index
if (!page_exists($page)) {
if (!@file_exists($idxtag)) {
if ($verbose) print("Indexer: $page does not exist, ignoring".DOKU_LF);
@@ -1200,6 +1195,18 @@ function idx_addPage($page, $verbose=false, $force=false) {
@unlink($idxtag);
return $result;
}
+
+ // check if indexing needed
+ if(!$force && @file_exists($idxtag)){
+ if(trim(io_readFile($idxtag)) == idx_get_version()){
+ $last = @filemtime($idxtag);
+ if($last > @filemtime(wikiFN($page))){
+ if ($verbose) print("Indexer: index for $page up to date".DOKU_LF);
+ return false;
+ }
+ }
+ }
+
$indexenabled = p_get_metadata($page, 'internal index', METADATA_RENDER_UNLIMITED);
if ($indexenabled === false) {
$result = false;
@@ -1263,8 +1270,8 @@ function idx_addPage($page, $verbose=false, $force=false) {
* Important: No ACL checking is done here! All results are
* returned, regardless of permissions
*
- * @param arrayref $words list of words to search for
- * @return array list of pages found, associated with the search terms
+ * @param array $words list of words to search for
+ * @return array list of pages found, associated with the search terms
*/
function idx_lookup(&$words) {
$Indexer = idx_get_indexer();
diff --git a/inc/infoutils.php b/inc/infoutils.php
index 2b8486906..7ceeae8f1 100644
--- a/inc/infoutils.php
+++ b/inc/infoutils.php
@@ -25,11 +25,14 @@ function checkUpdateMessages(){
// check if new messages needs to be fetched
if($lm < time()-(60*60*24) || $lm < @filemtime(DOKU_INC.DOKU_SCRIPT)){
+ dbglog("checkUpdatesMessages(): downloading messages.txt");
$http = new DokuHTTPClient();
$http->timeout = 8;
$data = $http->get(DOKU_MESSAGEURL.$updateVersion);
io_saveFile($cf,$data);
+ @touch($cf);
}else{
+ dbglog("checkUpdatesMessages(): messages.txt up to date");
$data = io_readFile($cf);
}
@@ -145,36 +148,6 @@ function check(){
}
}
- if(is_writable($conf['datadir'])){
- msg('Datadir is writable',1);
- }else{
- msg('Datadir is not writable',-1);
- }
-
- if(is_writable($conf['olddir'])){
- msg('Attic is writable',1);
- }else{
- msg('Attic is not writable',-1);
- }
-
- if(is_writable($conf['mediadir'])){
- msg('Mediadir is writable',1);
- }else{
- msg('Mediadir is not writable',-1);
- }
-
- if(is_writable($conf['cachedir'])){
- msg('Cachedir is writable',1);
- }else{
- msg('Cachedir is not writable',-1);
- }
-
- if(is_writable($conf['lockdir'])){
- msg('Lockdir is writable',1);
- }else{
- msg('Lockdir is not writable',-1);
- }
-
if(is_writable(DOKU_CONF)){
msg('conf directory is writable',1);
}else{
@@ -203,6 +176,16 @@ function check(){
msg('mb_string extension not available - PHP only replacements will be used',0);
}
+ $loc = setlocale(LC_ALL, 0);
+ if(!$loc){
+ msg('No valid locale is set for your PHP setup. You should fix this',-1);
+ }elseif(stripos($loc,'utf') === false){
+ msg('Your locale <code>'.hsc($loc).'</code> seems not to be a UTF-8 locale, you should fix this if you encounter problems.',0);
+ }else{
+ msg('Valid locale '.hsc($loc).' found.', 1);
+ }
+
+
if($conf['allowdebug']){
msg('Debugging support is enabled. If you don\'t need it you should set $conf[\'allowdebug\'] = 0',-1);
}else{
@@ -230,22 +213,6 @@ function check(){
msg('The current page is not writable by you',0);
}
- $check = wl('','',true).'data/_dummy';
- $http = new DokuHTTPClient();
- $http->timeout = 6;
- $res = $http->get($check);
- if(strpos($res,'data directory') !== false){
- msg('It seems like the data directory is accessible from the web.
- Make sure this directory is properly protected
- (See <a href="http://www.dokuwiki.org/security">security</a>)',-1);
- }elseif($http->status == 404 || $http->status == 403){
- msg('The data directory seems to be properly protected',1);
- }else{
- msg('Failed to check if the data directory is accessible from the web.
- Make sure this directory is properly protected
- (See <a href="http://www.dokuwiki.org/security">security</a>)',-1);
- }
-
// Check for corrupted search index
$lengths = idx_listIndexLengths();
$index_corrupted = false;
@@ -301,7 +268,7 @@ function msg($message,$lvl=0,$line='',$file=''){
$errors[1] = 'success';
$errors[2] = 'notify';
- if($line || $file) $message.=' ['.basename($file).':'.$line.']';
+ if($line || $file) $message.=' ['.utf8_basename($file).':'.$line.']';
if(!isset($MSG)) $MSG = array();
$MSG[]=array('lvl' => $errors[$lvl], 'msg' => $message);
diff --git a/inc/init.php b/inc/init.php
index 1d3588942..30eb1b251 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -3,7 +3,9 @@
* Initialize some defaults needed for DokuWiki
*/
-// start timing Dokuwiki execution
+/**
+ * timing Dokuwiki execution
+ */
function delta_time($start=0) {
return microtime(true)-((float)$start);
}
@@ -30,8 +32,8 @@ if (!defined('DOKU_E_LEVEL') && @file_exists(DOKU_CONF.'report_e_all')) {
define('DOKU_E_LEVEL', E_ALL);
}
if (!defined('DOKU_E_LEVEL')) {
- if(defined('E_DEPRECATED')){ // since php 5.3
- error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
+ if(defined('E_DEPRECATED')){ // since php 5.3, since php 5.4 E_STRICT is part of E_ALL
+ error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT);
}else{
error_reporting(E_ALL ^ E_NOTICE);
}
@@ -69,16 +71,6 @@ foreach (array('default','local','protected') as $config_group) {
}
}
-//prepare language array
-global $lang;
-$lang = array();
-
-//load the language files
-require_once(DOKU_INC.'inc/lang/en/lang.php');
-if ( $conf['lang'] && $conf['lang'] != 'en' ) {
- require_once(DOKU_INC.'inc/lang/'.$conf['lang'].'/lang.php');
-}
-
//prepare license array()
global $license;
$license = array();
@@ -118,11 +110,11 @@ if (!defined('DOKU_COOKIE')) define('DOKU_COOKIE', 'DW'.md5(DOKU_REL.(($conf['se
// define main script
if(!defined('DOKU_SCRIPT')) define('DOKU_SCRIPT','doku.php');
-// define Template baseURL
+// DEPRECATED, use tpl_basedir() instead
if(!defined('DOKU_TPL')) define('DOKU_TPL',
DOKU_BASE.'lib/tpl/'.$conf['template'].'/');
-// define real Template directory
+// DEPRECATED, use tpl_incdir() instead
if(!defined('DOKU_TPLINC')) define('DOKU_TPLINC',
DOKU_INC.'lib/tpl/'.$conf['template'].'/');
@@ -137,9 +129,13 @@ if(!defined('DOKU_TPLINC')) define('DOKU_TPLINC',
// enable gzip compression if supported
$conf['gzip_output'] &= (strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') !== false);
+global $ACT;
if ($conf['gzip_output'] &&
!defined('DOKU_DISABLE_GZIP_OUTPUT') &&
- function_exists('ob_gzhandler')) {
+ function_exists('ob_gzhandler') &&
+ // Disable compression when a (compressed) sitemap might be delivered
+ // See https://bugs.dokuwiki.org/index.php?do=details&task_id=2576
+ $ACT != 'sitemap') {
ob_start('ob_gzhandler');
}
@@ -170,7 +166,7 @@ if (get_magic_quotes_gpc() && !defined('MAGIC_QUOTES_STRIPPED')) {
@ini_set('magic_quotes_gpc', 0);
define('MAGIC_QUOTES_STRIPPED',1);
}
-@set_magic_quotes_runtime(0);
+if(function_exists('set_magic_quotes_runtime')) @set_magic_quotes_runtime(0);
@ini_set('magic_quotes_sybase',0);
// don't let cookies ever interfere with request vars
@@ -200,13 +196,17 @@ init_paths();
init_files();
// setup plugin controller class (can be overwritten in preload.php)
-$plugin_types = array('auth', 'admin','syntax','action','renderer', 'helper');
+$plugin_types = array('auth', 'admin','syntax','action','renderer', 'helper','remote');
global $plugin_controller_class, $plugin_controller;
if (empty($plugin_controller_class)) $plugin_controller_class = 'Doku_Plugin_Controller';
// load libraries
require_once(DOKU_INC.'inc/load.php');
+// input handle class
+global $INPUT;
+$INPUT = new Input();
+
// initialize plugin controller
$plugin_controller = new $plugin_controller_class();
@@ -214,6 +214,10 @@ $plugin_controller = new $plugin_controller_class();
global $EVENT_HANDLER;
$EVENT_HANDLER = new Doku_Event_Handler();
+$local = $conf['lang'];
+trigger_event('INIT_LANG_LOAD', $local, 'init_lang', true);
+
+
// setup authentication system
if (!defined('NOSESSION')) {
auth_setup();
@@ -239,10 +243,11 @@ function init_paths(){
'lockdir' => 'locks',
'tmpdir' => 'tmp');
- foreach($paths as $c => $p){
- if(empty($conf[$c])) $conf[$c] = $conf['savedir'].'/'.$p;
- $conf[$c] = init_path($conf[$c]);
- if(empty($conf[$c])) nice_die("The $c ('$p') does not exist, isn't accessible or writable.
+ foreach($paths as $c => $p) {
+ $path = empty($conf[$c]) ? $conf['savedir'].'/'.$p : $conf[$c];
+ $conf[$c] = init_path($path);
+ if(empty($conf[$c]))
+ nice_die("The $c ('$p') at $path is not found, isn't accessible or writable.
You should check your config and permission settings.
Or maybe you want to <a href=\"install.php\">run the
installer</a>?");
@@ -256,8 +261,22 @@ function init_paths(){
$conf['media_changelog'] = $conf['metadir'].'/_media.changes';
}
+function init_lang($langCode) {
+ //prepare language array
+ global $lang;
+ $lang = array();
+
+ //load the language files
+ require_once(DOKU_INC.'inc/lang/en/lang.php');
+ if ($langCode && $langCode != 'en') {
+ if (file_exists(DOKU_INC."inc/lang/$langCode/lang.php")) {
+ require_once(DOKU_INC."inc/lang/$langCode/lang.php");
+ }
+ }
+}
+
/**
- * Checks the existance of certain files and creates them if missing.
+ * Checks the existence of certain files and creates them if missing.
*/
function init_files(){
global $conf;
@@ -299,12 +318,12 @@ function init_files(){
* Returns absolute path
*
* This tries the given path first, then checks in DOKU_INC.
- * Check for accessability on directories as well.
+ * Check for accessibility on directories as well.
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function init_path($path){
- // check existance
+ // check existence
$p = fullpath($path);
if(!@file_exists($p)){
$p = fullpath(DOKU_INC.$path);
@@ -482,8 +501,7 @@ function is_ssl(){
*/
function nice_die($msg){
echo<<<EOT
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
+<!DOCTYPE html>
<html>
<head><title>DokuWiki Setup Error</title></head>
<body style="font-family: Arial, sans-serif">
@@ -552,7 +570,7 @@ function fullpath($path,$exists=false){
}
$finalpath = $root.implode('/', $newpath);
- // check for existance when needed (except when unit testing)
+ // check for existence when needed (except when unit testing)
if($exists && !defined('DOKU_UNITTEST') && !@file_exists($finalpath)) {
return false;
}
diff --git a/inc/io.php b/inc/io.php
index 034ac650e..b4da7d635 100644
--- a/inc/io.php
+++ b/inc/io.php
@@ -18,8 +18,8 @@ if(!defined('DOKU_INC')) die('meh.');
*
* @todo use safemode hack
* @param string $id - a pageid, the namespace of that id will be tried to deleted
- * @param string $basadir - the config name of the type to delete (datadir or mediadir usally)
- * @returns bool - true if at least one namespace was deleted
+ * @param string $basedir - the config name of the type to delete (datadir or mediadir usally)
+ * @return bool - true if at least one namespace was deleted
* @author Andreas Gohr <andi@splitbrain.org>
* @author Ben Coburn <btcoburn@silicodon.net>
*/
@@ -63,7 +63,7 @@ function io_sweepNS($id,$basedir='datadir'){
*/
function io_readWikiPage($file, $id, $rev=false) {
if (empty($rev)) { $rev = false; }
- $data = array(array($file, false), getNS($id), noNS($id), $rev);
+ $data = array(array($file, true), getNS($id), noNS($id), $rev);
return trigger_event('IO_WIKIPAGE_READ', $data, '_io_readWikiPage_action', false);
}
@@ -113,6 +113,7 @@ function io_readFile($file,$clean=true){
function bzfile($file){
$bz = bzopen($file,"r");
+ $str = '';
while (!feof($bz)){
//8192 seems to be the maximum buffersize?
$str = $str . bzread($bz,8192);
@@ -477,15 +478,15 @@ function io_download($url,$file,$useAttachment=false,$defaultName='',$maxSize=20
$data = $http->get($url);
if(!$data) return false;
+ $name = '';
if ($useAttachment) {
- $name = '';
if (isset($http->resp_headers['content-disposition'])) {
$content_disposition = $http->resp_headers['content-disposition'];
$match=array();
if (is_string($content_disposition) &&
preg_match('/attachment;\s*filename\s*=\s*"([^"]*)"/i', $content_disposition, $match)) {
- $name = basename($match[1]);
+ $name = utf8_basename($match[1]);
}
}
@@ -578,8 +579,8 @@ function io_exec($cmd, $input, &$output){
* @param string $file The file to search
* @param string $pattern PCRE pattern
* @param int $max How many lines to return (0 for all)
- * @param bool $baxkref When true returns array with backreferences instead of lines
- * @return matching lines or backref, false on error
+ * @param bool $backref When true returns array with backreferences instead of lines
+ * @return array matching lines or backref, false on error
*/
function io_grep($file,$pattern,$max=0,$backref=false){
$fh = @fopen($file,'r');
diff --git a/inc/lang/af/lang.php b/inc/lang/af/lang.php
index 6665196f4..6de891a63 100644
--- a/inc/lang/af/lang.php
+++ b/inc/lang/af/lang.php
@@ -25,7 +25,6 @@ $lang['btn_back'] = 'Terug';
$lang['btn_backlink'] = 'Wat skakel hierheen';
$lang['btn_subscribe'] = 'Hou bladsy dop';
$lang['btn_unsubscribe'] = 'Verwyder van bladsy dophoulys';
-$lang['btn_resendpwd'] = 'E-pos nuwe wagwoord';
$lang['btn_register'] = 'Skep gerus \'n rekening';
$lang['loggedinas'] = 'Ingeteken as';
$lang['user'] = 'Gebruikernaam';
@@ -43,7 +42,6 @@ $lang['regsuccess2'] = 'Rekening geskep';
$lang['regbadpass'] = 'Die ingetikte wagwoorde is nie dieselfde nie.';
$lang['regpwmail'] = 'Jo DokuWiki wagwoord';
$lang['profnoempty'] = 'Jy moet \'n name en a e-posadres in sit';
-$lang['resendpwd'] = 'Stuir vir a niwe wagwoord';
$lang['resendpwdmissing'] = 'Jammer, jy moet ales in fil';
$lang['resendpwdconfirm'] = '\'n Bevestigingpos is gestuur na die gekose e-posadres.';
$lang['resendpwdsuccess'] = 'Jou nuive wagwoord was deur e-pos gesteur';
@@ -71,5 +69,3 @@ $lang['img_date'] = 'Datem';
$lang['img_camera'] = 'Camera';
$lang['i_wikiname'] = 'Wiki Naam';
$lang['i_funcna'] = 'PHP funksie <code>%s</code> is nie beskibaar nie. Miskien is dit af gehaal.';
-$lang['mu_toobig'] = 'te groet';
-$lang['mu_done'] = 'klaar';
diff --git a/inc/lang/ar/install.html b/inc/lang/ar/install.html
index 1daf507c5..3ef23aee2 100644
--- a/inc/lang/ar/install.html
+++ b/inc/lang/ar/install.html
@@ -4,9 +4,9 @@
<p>دوكو ويكي تستخدم ملفات عادية لتخزين الصفحات و المعلومات المرتبطة بها (مثل. الصور , وفهارس البحث, والنسخ القديمة, إلخ). لكي تعمل بنجاح دوكو ويكي <strong>يجب</strong> ان يكون لديها اذن بالكتابة على المجلدات التي تحوي هذه الملفات. هذا المثبت غير قادر على اعداد اذونات المجلدات. عادة يجب عمل هذا مباشرة باستخدام أمر في محث الاوامر أو إن كنت تستخدم استضافة، عن طريقة FTP في لوحة تحكم الاستضافة (مثل. cPanel).</p>
<p>سيُعد هذا المثبت اعدادات دوكو ويكي ل
-<acronym title="قائمة التحكم بالوصول">ACL</acronym>, الذي سيسمح للمدير بالولوج و الوصول لقائمة إدارة دوكو ويكي لتثبيت الإضافات، وإدارة المستخدمين، و التحكم بالوصول لصفحات الويكي، وتعديل الاعدادات.
+<abbr title="قائمة التحكم بالوصول">ACL</abbr>, الذي سيسمح للمدير بالولوج و الوصول لقائمة إدارة دوكو ويكي لتثبيت الإضافات، وإدارة المستخدمين، و التحكم بالوصول لصفحات الويكي، وتعديل الاعدادات.
ليس مطلوبا لأجل عمل دوكو ويكي, لكنه سيجعل دوكو ويكي أسهل على المدير.</p>
-<p>المستخدمين الخبراء و المستخدمين مع متطلبات خاصة عليهم استخدام هذا الرابط لتفاصيل تتعلق ب
+<p>المستخدمين الخبراء و المستخدمين مع متطلبات خاصة عليهم استخدام هذا الرابط لتفاصيل تتعلق ب
<a href="http://dokuwiki.org/install">توجيهات التثبيت</a>
و <a href="http://dokuwiki.org/config">ضبط الإعدادات</a>.</p> \ No newline at end of file
diff --git a/inc/lang/ar/lang.php b/inc/lang/ar/lang.php
index 02a62fe94..8f34936f3 100644
--- a/inc/lang/ar/lang.php
+++ b/inc/lang/ar/lang.php
@@ -42,12 +42,14 @@ $lang['btn_backtomedia'] = 'ارجع إلى اختيار ملف الوسا
$lang['btn_subscribe'] = 'ادر الاشتراكات';
$lang['btn_profile'] = 'حدث الملف الشخصي';
$lang['btn_reset'] = 'صفّر';
-$lang['btn_resendpwd'] = 'ارسل كلمة سر جديدة';
+$lang['btn_resendpwd'] = 'اضبط كلمة سر جديدة';
$lang['btn_draft'] = 'حرر المسودة';
$lang['btn_recover'] = 'استرجع المسودة';
$lang['btn_draftdel'] = 'احذف المسوّدة';
$lang['btn_revert'] = 'استعد';
$lang['btn_register'] = 'سجّل';
+$lang['btn_apply'] = 'طبق';
+$lang['btn_media'] = 'مدير الوسائط';
$lang['loggedinas'] = 'داخل باسم';
$lang['user'] = 'اسم المستخدم';
$lang['pass'] = 'كلمة السر';
@@ -77,7 +79,7 @@ $lang['profnoempty'] = 'غير مسموح باسم مستخدم أو
$lang['profchanged'] = 'حُدث الملف الشخصي للمستخدم بنجاح.';
$lang['pwdforget'] = 'أنسيت كلمة السر؟ احصل على واحدة جديدة';
$lang['resendna'] = 'هذه الويكي لا تدعم إعادة إرسال كلمة المرور.';
-$lang['resendpwd'] = 'إرسال كلمة مرور';
+$lang['resendpwd'] = 'اضبط كلمة سر جديدة لـ';
$lang['resendpwdmissing'] = 'عذراّ، يجب أن تملأ كل الحقول.';
$lang['resendpwdnouser'] = 'عذراً، لم نجد المستخدم هذا في قاعدة بياناتنا.';
$lang['resendpwdbadauth'] = 'عذراً، رمز التفعيل هذا غير صحيح. نأكد من استخدامك كامل وصلة التأكيد.';
@@ -92,7 +94,7 @@ $lang['txt_filename'] = 'رفع كـ (اختياري)';
$lang['txt_overwrt'] = 'اكتب على ملف موجود';
$lang['lockedby'] = 'مقفلة حاليا لـ';
$lang['lockexpire'] = 'ينتهي القفل في';
-$lang['js']['willexpire'] = 'سينتهي قفل تحرير هذه الصفحه خلال دقيقة.\nلتجنب التعارض استخدم زر المعاينة لتصفير مؤقت القفل.';
+$lang['js']['willexpire'] = 'سينتهي قفل تحرير هذه الصفحه خلال دقيقة.\nلتجنب التعارض استخدم زر المعاينة لتصفير مؤقت القفل.';
$lang['js']['notsavedyet'] = 'التعديلات غير المحفوظة ستفقد.';
$lang['js']['searchmedia'] = 'ابحث عن ملفات';
$lang['js']['keepopen'] = 'أبقي النافذة مفتوحة أثناء الاختيار';
@@ -123,6 +125,17 @@ $lang['js']['nosmblinks'] = 'الروابط لمجلدات مشاركة و
$lang['js']['linkwiz'] = 'مرشد الروابط';
$lang['js']['linkto'] = 'الرابط إلى :';
$lang['js']['del_confirm'] = 'هل حقاً تريد حذف البنود المختارة؟';
+$lang['js']['restore_confirm'] = 'أمتأكد من استرجاع هذه النسخة؟';
+$lang['js']['media_diff'] = 'عرض الفروق:';
+$lang['js']['media_diff_both'] = 'جنبا إلى جنب';
+$lang['js']['media_diff_opacity'] = 'Shine-through';
+$lang['js']['media_diff_portions'] = 'Swipe';
+$lang['js']['media_select'] = 'اختر ملفا...';
+$lang['js']['media_upload_btn'] = 'ارفع';
+$lang['js']['media_done_btn'] = 'تم';
+$lang['js']['media_drop'] = 'اسقط الملف هنا لرفعه';
+$lang['js']['media_cancel'] = 'أزل';
+$lang['js']['media_overwrt'] = 'أكتب فوق الملفات الموجودة';
$lang['rssfailed'] = 'خطأ ما حدث أثناء جلب ملف التغذية:';
$lang['nothingfound'] = 'لا يوجد شيء';
$lang['mediaselect'] = 'ملفات الوسائط';
@@ -172,11 +185,20 @@ $lang['external_edit'] = 'تحرير خارجي';
$lang['summary'] = 'ملخص التحرير';
$lang['noflash'] = 'تحتاج إلى<a href="http://www.adobe.com/products/flashplayer/">ملحق فلاش أدوبي</a> لعرض هذا المحتوى.';
$lang['download'] = 'نزل Snippet';
+$lang['tools'] = 'أدوات';
+$lang['user_tools'] = 'أدوات المستخدم';
+$lang['site_tools'] = 'أدوات الموقع';
+$lang['page_tools'] = 'أدوات الصفحة';
+$lang['skip_to_content'] = 'تجاوز إلى المحتوى';
$lang['mail_newpage'] = 'إضافة صفحة:';
$lang['mail_changed'] = 'تعديل صفحة:';
$lang['mail_subscribe_list'] = 'صفحات غيرت في النطاق:';
$lang['mail_new_user'] = 'مشترك جديد:';
$lang['mail_upload'] = 'رفع ملف:';
+$lang['changes_type'] = 'أظهر تغييرات الـ';
+$lang['pages_changes'] = 'صفحات';
+$lang['media_changes'] = 'ملفات الوسائط';
+$lang['both_changes'] = 'كلا من الصفحات وملفات الوسائط';
$lang['qb_bold'] = 'نص عريض';
$lang['qb_italic'] = 'نص مائل';
$lang['qb_underl'] = 'نص مسطر';
@@ -217,6 +239,9 @@ $lang['img_copyr'] = 'حقوق النسخ';
$lang['img_format'] = 'الهيئة';
$lang['img_camera'] = 'الكمرا';
$lang['img_keywords'] = 'كلمات مفتاحية';
+$lang['img_width'] = 'العرض';
+$lang['img_height'] = 'الإرتفاع';
+$lang['img_manager'] = 'اعرض في مدير الوسائط';
$lang['subscr_subscribe_success'] = 'اضيف %s لقائمة اشتراك %s';
$lang['subscr_subscribe_error'] = 'خطأ في إضافة %s لقائمة اشتراك %s';
$lang['subscr_subscribe_noaddress'] = 'ليس هناك عنوان مرتبط بولوجك، لا يمكن اضافتك لقائمة الاشتراك';
@@ -235,6 +260,7 @@ $lang['subscr_style_digest'] = 'بريد ملخص عن تغييرات كل ص
$lang['subscr_style_list'] = 'قائمة بالصفحات المتغيرة منذ آخر بريد';
$lang['authmodfailed'] = 'إعدادات تصريح فاسدة، يرجى مراسلة المدير.';
$lang['authtempfail'] = 'تصريح المشترك غير متوفر مؤقتاً، إن استمرت هذه الحالة يرجى مراسلة المدير';
+$lang['authpwdexpire'] = 'ستنتهي صلاحية كلمة السر في %d . عليك بتغييرها سريعا.';
$lang['i_chooselang'] = 'اختر لغتك';
$lang['i_installer'] = 'برنامج تنصيب دوكو ويكي';
$lang['i_wikiname'] = 'اسم الويكي';
@@ -266,21 +292,6 @@ $lang['i_pol1'] = 'ويكي عامة؛ أي القراءة للج
$lang['i_pol2'] = 'ويكي مغلقة؛ أي القراءة والكتابة والتحميل للمشتركين المسجلين فقط';
$lang['i_retry'] = 'إعادة المحاولة';
$lang['i_license'] = 'اختر الرخصة التي تريد وضع المحتوى تحتها:';
-$lang['mu_intro'] = 'هنا يمكنك رفع ملفات متعددة في وقت واحد. انقر على زر استعرض لاضافتهم إلى الطابور. انقر ارفع عند الانتهاء.';
-$lang['mu_gridname'] = 'اسم الملف';
-$lang['mu_gridsize'] = 'الحجم';
-$lang['mu_gridstat'] = 'الحالة';
-$lang['mu_namespace'] = 'نطاق';
-$lang['mu_browse'] = 'استعرض';
-$lang['mu_toobig'] = 'كبير جدا';
-$lang['mu_ready'] = 'جاهز للرفع';
-$lang['mu_done'] = 'اكتمل';
-$lang['mu_fail'] = 'فشل';
-$lang['mu_authfail'] = 'انتهت الجلسة';
-$lang['mu_progress'] = 'رُفع @PCT@% ';
-$lang['mu_filetypes'] = 'انواع الملفات المسموحة';
-$lang['mu_info'] = 'تم رفع الملفات';
-$lang['mu_lasterr'] = 'آخر خطأ:';
$lang['recent_global'] = 'انت تراقب حاليا التغييرات داخل نطاق <b>%s</b>. يمكنك أيضا <a href="%s">عرض أحدث تغييرات الويكي كلها</a>.';
$lang['years'] = '%d سنة مضت';
$lang['months'] = '%d شهرا مضى';
@@ -290,3 +301,26 @@ $lang['hours'] = '%d ساعة مضت';
$lang['minutes'] = '%d دقيقة مضت';
$lang['seconds'] = '%d ثانية مضت';
$lang['wordblock'] = 'لم تحفظ تغييراتك لاحتوائها على نص ممنوع )غثاء(';
+$lang['media_uploadtab'] = 'ارفع';
+$lang['media_searchtab'] = 'ابحث';
+$lang['media_file'] = 'ملف';
+$lang['media_viewtab'] = 'عرض';
+$lang['media_edittab'] = 'تحرير';
+$lang['media_historytab'] = 'التاريخ';
+$lang['media_list_thumbs'] = 'المصغرات';
+$lang['media_list_rows'] = 'صفوف';
+$lang['media_sort_name'] = 'الاسم';
+$lang['media_sort_date'] = 'التاريخ';
+$lang['media_namespaces'] = 'اختر نطاقا';
+$lang['media_files'] = 'الملفات في %s';
+$lang['media_upload'] = 'ارفع إلى %s';
+$lang['media_search'] = 'ابحث في %s';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s في %s';
+$lang['media_edit'] = 'حرر %s';
+$lang['media_history'] = 'تاريخ %s';
+$lang['media_meta_edited'] = 'عُدلت الميتاداتا';
+$lang['media_perm_read'] = 'عفوا، لست مخولا بقراءة الملفات.';
+$lang['media_perm_upload'] = 'عفوا، لست مخولا برفع الملفات.';
+$lang['media_update'] = 'ارفع إصدارا أحدث';
+$lang['media_restore'] = 'استرجع هذه النسخة';
diff --git a/inc/lang/ar/resetpwd.txt b/inc/lang/ar/resetpwd.txt
new file mode 100644
index 000000000..2bbd4a21a
--- /dev/null
+++ b/inc/lang/ar/resetpwd.txt
@@ -0,0 +1,3 @@
+====== اضبط كلمة سر جديدة ======
+
+أدخل كلمة سر جديدة لحسابك في هذه الويكي.
diff --git a/inc/lang/az/install.html b/inc/lang/az/install.html
index d41511438..d8382b195 100644
--- a/inc/lang/az/install.html
+++ b/inc/lang/az/install.html
@@ -2,6 +2,6 @@
<p>Səhifələri və əlavə məlumatları (məsələn, şəkillər, axtarış indeksi, səhifələrin əvvəlki versiyaları, və sairə) saxlamaq üçün DokuWiki adi fayllardan istifadə edir. DokuWiki-nin uğurlu işləməsi üçün bu faylların yerləşən qovluqa yazı imkanı vacib <strong>lazımdır</strong>. Bu quraşdırma proqramı sistemin qovluqlarına olan haqları dəyişə bilmir. Çox vaxt bu birbaşa shell-dən, və ya, əgər Siz hostinq-dən istifadə edirsinizsə, FTP vasitəsi ya idarəetmə paneli vasitəsi (məsələn, cPanel) ilə edilir.</p>
-<p>Quraşdırma proqramı sizin DokuWiki-nizdə haqlar kontrolu siyahısını (<acronym title="access control list">ACL</acronym>) quracaq. Bu, sistemə girdikdən sonra, administratora xüsusi menü vasitəsi ilə plugin-ləri quraşdırmaq, istifadiçiləri və səhifələrə giriş haqlarını idarəetmək, və həmçinin sistemin konfiqurasiyasını quraşdırmağa imkan verəcək. Haqlar kontrolu siyahısı DokuWiki-yə mütləq lazım deyil, amma o Sizə DokuWiki-nin idarəetməsini asanlaşdırır.</p>
+<p>Quraşdırma proqramı sizin DokuWiki-nizdə haqlar kontrolu siyahısını (<abbr title="access control list">ACL</abbr>) quracaq. Bu, sistemə girdikdən sonra, administratora xüsusi menü vasitəsi ilə plugin-ləri quraşdırmaq, istifadiçiləri və səhifələrə giriş haqlarını idarəetmək, və həmçinin sistemin konfiqurasiyasını quraşdırmağa imkan verəcək. Haqlar kontrolu siyahısı DokuWiki-yə mütləq lazım deyil, amma o Sizə DokuWiki-nin idarəetməsini asanlaşdırır.</p>
<p>Təcrübəli istifadəçilər və xüsusi tələbləri olan istifadəçilərə əlavə məlumat üçün <a href="http://dokuwiki.org/install">quraşdırılma prosesi</a> və <a href="http://dokuwiki.org/config">konfiqurasiya parametrləri</a> link-lərinə muraciyət etməsk tövsiyyə olunur.</p>
diff --git a/inc/lang/az/lang.php b/inc/lang/az/lang.php
index 13ba7b3c3..fff6f34b7 100644
--- a/inc/lang/az/lang.php
+++ b/inc/lang/az/lang.php
@@ -40,7 +40,6 @@ $lang['btn_subscribe'] = 'Abunə ol (bütün dəyişiklər)';
$lang['btn_unsubscribe'] = 'Abunəlikdən çıx (bütün dəyişiklər)';
$lang['btn_profile'] = 'Profil';
$lang['btn_reset'] = 'Boşalt';
-$lang['btn_resendpwd'] = 'Yeni şifrəni göndər';
$lang['btn_draft'] = 'Qaralamada düzəliş etmək';
$lang['btn_recover'] = 'Qaralamanı qaytar';
$lang['btn_draftdel'] = 'Qaralamanı sil';
@@ -75,7 +74,6 @@ $lang['profnoempty'] = 'istifadəci adı və e-mail ünvanı boş ola
$lang['profchanged'] = 'İstifadəçi profili uğurla yeniləndi.';
$lang['pwdforget'] = 'Şifrəni yaddan çıxartmısız? Buyurun yenisini əldə edin';
$lang['resendna'] = 'Bu wiki şifrəni yenidən göndərməyi dəstəkləmir.';
-$lang['resendpwd'] = 'Yeni şifrəni göndər:';
$lang['resendpwdmissing'] = 'Formanın bütün xanəlırini doldurun.';
$lang['resendpwdnouser'] = 'Verilənlər bazasında bu ad ilə istifadəçi tapılmadı.';
$lang['resendpwdbadauth'] = 'Ativləşdirmə kodu səhvdir. Link-i tam olaraq köçürdüyünüzü yoxlayın. ';
@@ -217,21 +215,6 @@ $lang['i_pol0'] = 'Tam açıq wiki (oxumaq, yazmaq, fayl yükləm
$lang['i_pol1'] = 'Acıq wiki (oxumaq hamıya olar, yazmaq və fayl yükləmək ancaq üzv olan istifadəçilərə olar)';
$lang['i_pol2'] = 'Bağlı wiki (uxumaq, yazmaq və yükləmək ancaq üzv olan istifadəçilərə olar)';
$lang['i_retry'] = 'Cəhdi təkrarla';
-$lang['mu_intro'] = 'Burda siz bir neçə faylı birdən yükləyə bilərsiniz. Fayl əlavə etmək üçün "fayl seç" düyməsini sıxın. Sonda "yüklə" düyməsini sıxın.';
-$lang['mu_gridname'] = 'Faylın adı';
-$lang['mu_gridsize'] = 'Həcmi';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Namespace';
-$lang['mu_browse'] = 'Fayl seç';
-$lang['mu_toobig'] = 'çox böyükdür';
-$lang['mu_ready'] = 'yükləməyə hazırdı';
-$lang['mu_done'] = 'başa çatdı';
-$lang['mu_fail'] = 'xəta baş verdi';
-$lang['mu_authfail'] = 'sessiyanın vaxtı bitdi';
-$lang['mu_progress'] = '@PCT@% yükləndi';
-$lang['mu_filetypes'] = 'İçazə olan fayl növləri';
-$lang['mu_info'] = 'fayllar yükləndi.';
-$lang['mu_lasterr'] = 'Son xəta:';
$lang['recent_global'] = '<b>%s</b> namespace-də baş vermiş dəyışıklərə baxırsınız. Siz həmçinin <a href="%s">wiki-də bu yaxında baş vermiş bütün dəyişiklərə</a> baxa bilərsiniz.';
$lang['years'] = '%d il əvvəl';
$lang['months'] = '%d ay əvvəl';
diff --git a/inc/lang/bg/install.html b/inc/lang/bg/install.html
index 44f02f4c2..8763e4df6 100644
--- a/inc/lang/bg/install.html
+++ b/inc/lang/bg/install.html
@@ -1,15 +1,15 @@
<p>Страницата помага при инсталиране за първи път и настройване на
-<a href="http://dokuwiki.org">Dokuwiki</a>. Повече информация
+<a href="http://dokuwiki.org">Dokuwiki</a>. Повече информация
за инсталатора ще намерите в <a href="http://dokuwiki.org/installer">документацията му</a>.</p>
<p>Dokuwiki ползва обикновени файлове за съхраняване на страниците и информацията свързана с тях (примерно картинки, търсения, стари версии, и др.).
-За да функционира нормално DokuWiki
+За да функционира нормално DokuWiki
<strong>трябва</strong> да има право за писане в директориите, които съдържат тези
-файлове. Инсталаторът не може да настройва правата на директориите.
+файлове. Инсталаторът не може да настройва правата на директориите.
Вие трябва да направите това директно от командният ред или ако ползвате хостинг през FTP или контролния панела на хоста (примерно cPanel).</p>
<p>Инсталаторът ще настрои вашата DokuWiki конфигурация на
-<acronym title="списъка за достъп">ACL</acronym>, което ще позволи на администратора да се впише и ползва администраторското меню в DokuWiki за инсталиране на приставки, контрол на потребителите, управление на достъпа до страниците и промяна на останалите настройки. Това не е необходимо за функционирането на DokuWiki, но прави администрирането по-лесно.</p>
+<abbr title="списъка за достъп">ACL</abbr>, което ще позволи на администратора да се впише и ползва администраторското меню в DokuWiki за инсталиране на приставки, контрол на потребителите, управление на достъпа до страниците и промяна на останалите настройки. Това не е необходимо за функционирането на DokuWiki, но прави администрирането по-лесно.</p>
<p>Опитните потребители и потребителите със специални изисквания към настройките имат на разположение допълнителна информация относно <a href="http://dokuwiki.org/install">инсталирането</a>
и <a href="http://dokuwiki.org/config">настройването</a>.</p>
diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php
index 1c6c90703..3c6c17211 100644
--- a/inc/lang/bg/lang.php
+++ b/inc/lang/bg/lang.php
@@ -9,11 +9,12 @@
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
-$lang['doublequoteopening'] = '“';
-$lang['doublequoteclosing'] = '”';
-$lang['singlequoteopening'] = '‘';
-$lang['singlequoteclosing'] = '’';
-$lang['apostrophe'] = '’';
+$lang['doublequoteopening'] = '"'; //&ldquo;
+$lang['doublequoteclosing'] = '"'; //&rdquo;
+$lang['singlequoteopening'] = '‘'; //&lsquo;
+$lang['singlequoteclosing'] = '’'; //&rsquo;
+$lang['apostrophe'] = '’'; //&rsquo;
+
$lang['btn_edit'] = 'Редактиране';
$lang['btn_source'] = 'Преглед на кода';
$lang['btn_show'] = 'Преглед на страницата';
@@ -41,14 +42,15 @@ $lang['btn_backtomedia'] = 'Назад към избора на файл';
$lang['btn_subscribe'] = 'Абонаменти';
$lang['btn_profile'] = 'Профил';
$lang['btn_reset'] = 'Изчистване';
-$lang['btn_resendpwd'] = 'Пращане на нова парола';
-$lang['btn_draft'] = 'Редактиране на чернова';
-$lang['btn_recover'] = 'Възстановяване на чернова';
-$lang['btn_draftdel'] = 'Изтриване на чернова';
+$lang['btn_resendpwd'] = 'Задаване на нова парола';
+$lang['btn_draft'] = 'Редактиране на черновата';
+$lang['btn_recover'] = 'Възстановяване на черновата';
+$lang['btn_draftdel'] = 'Изтриване на черновата';
$lang['btn_revert'] = 'Възстановяване';
$lang['btn_register'] = 'Регистриране';
$lang['btn_apply'] = 'Прилагане';
$lang['btn_media'] = 'Диспечер на файлове';
+
$lang['loggedinas'] = 'Вписани сте като';
$lang['user'] = 'Потребител';
$lang['pass'] = 'Парола';
@@ -60,9 +62,10 @@ $lang['fullname'] = 'Истинско име';
$lang['email'] = 'Електронна поща';
$lang['profile'] = 'Потребителски профил';
$lang['badlogin'] = 'Грешно потребителско име или парола.';
-$lang['minoredit'] = 'Незначителни промени';
-$lang['draftdate'] = 'Черновата е автоматично записана на';
+$lang['minoredit'] = 'Промените са незначителни';
+$lang['draftdate'] = 'Черновата е автоматично записана на'; // full dformat date will be added
$lang['nosecedit'] = 'Страницата бе междувременно променена, презареждане на страницата поради неактуална информация.';
+
$lang['regmissing'] = 'Моля, попълнете всички полета.';
$lang['reguexists'] = 'Вече съществува потребител с избраното име.';
$lang['regsuccess'] = 'Потребителят е създаден, а паролата е пратена по електронната поща.';
@@ -72,27 +75,33 @@ $lang['regbadmail'] = 'Въведеният адрес изглежд
$lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново.';
$lang['regpwmail'] = 'Паролата ви за DokuWiki';
$lang['reghere'] = 'Все още нямате профил? Направете си';
+
$lang['profna'] = 'Wiki-то не поддържа промяна на профила';
$lang['profnochange'] = 'Няма промени.';
$lang['profnoempty'] = 'Въвеждането на име и ел. поща е задължително';
$lang['profchanged'] = 'Потребителският профил е обновен успешно.';
+
$lang['pwdforget'] = 'Забравили сте паролата си? Получете нова';
$lang['resendna'] = 'Wiki-то не поддържа повторно пращане на паролата.';
-$lang['resendpwd'] = 'Изпращане на нова парола за';
+$lang['resendpwd'] = 'Задаване на нова парола за';
$lang['resendpwdmissing'] = 'Моля, попълнете всички полета.';
$lang['resendpwdnouser'] = 'Потребителят не е намерен в базата от данни.';
$lang['resendpwdbadauth'] = 'Кодът за потвърждение е невалиден. Проверете дали сте използвали целия линк за потвърждение.';
$lang['resendpwdconfirm'] = 'Линк за потвърждение е пратен по електронната поща.';
$lang['resendpwdsuccess'] = 'Новата ви паролата е пратена по електронната поща.';
+
$lang['license'] = 'Ако не е посочено друго, съдържанието на Wiki-то е лицензирано под следния лиценз:';
-$lang['licenseok'] = 'Бележка: Редактирайки страницата, вие се съгласявате да лицензирате промените (които сте направили) под следния лиценз:';
+$lang['licenseok'] = 'Бележка: Редактирайки страницата, Вие се съгласявате да лицензирате промените (които сте направили) под следния лиценз:';
+
$lang['searchmedia'] = 'Търсене на файл: ';
$lang['searchmedia_in'] = 'Търсене в %s';
$lang['txt_upload'] = 'Изберете файл за качване';
$lang['txt_filename'] = 'Качи като (незадължително)';
$lang['txt_overwrt'] = 'Презапиши съществуващите файлове';
+$lang['maxuploadsize'] = 'Макс. размер за отделните файлове е %s.';
$lang['lockedby'] = 'В момента е заключена от';
$lang['lockexpire'] = 'Ще бъде отключена на';
+
$lang['js']['willexpire'] = 'Страницата ще бъде отключена за редактиране след минута.\nЗа предотвратяване на конфликти, ползвайте бутона "Преглед", за рестартиране на брояча за заключване.';
$lang['js']['notsavedyet'] = 'Незаписаните промени ще бъдат загубени. Желаете ли да продължите?';
$lang['js']['searchmedia'] = 'Търсене на файлове';
@@ -119,8 +128,7 @@ $lang['js']['medialeft'] = 'Подреди изображението от
$lang['js']['mediaright'] = 'Подреди изображението отдясно.';
$lang['js']['mediacenter'] = 'Подреди изображението по средата.';
$lang['js']['medianoalign'] = 'Без подреждане.';
-$lang['js']['nosmblinks'] = 'Връзките към Windows shares работят само под Internet Explorer.
-Можете да копирате и поставите връзката.';
+$lang['js']['nosmblinks'] = 'Връзките към Windows shares работят само под Internet Explorer.<br />Можете да копирате и поставите връзката.';
$lang['js']['linkwiz'] = 'Помощник за препратки';
$lang['js']['linkto'] = 'Препратка към: ';
$lang['js']['del_confirm'] = 'Да бъдат ли изтрити избраните елементи?';
@@ -135,8 +143,10 @@ $lang['js']['media_done_btn'] = 'Готово';
$lang['js']['media_drop'] = 'Влачете и пуснете файливе тук, за да бъдат качени';
$lang['js']['media_cancel'] = 'премахване';
$lang['js']['media_overwrt'] = 'Презапиши съществуващите файлове';
+
$lang['rssfailed'] = 'Възникна грешка при получаването на емисията: ';
$lang['nothingfound'] = 'Нищо не е открито.';
+
$lang['mediaselect'] = 'Файлове';
$lang['fileupload'] = 'Качване на файлове';
$lang['uploadsucc'] = 'Качването е успешно';
@@ -152,7 +162,7 @@ $lang['deletefail'] = '"%s" не може да бъде изтрит
$lang['mediainuse'] = 'Файлът "%s" не бе изтрит - все още се ползва.';
$lang['namespaces'] = 'Именни пространства';
$lang['mediafiles'] = 'Налични файлове в';
-$lang['accessdenied'] = 'Нямате разрешение да преглеждате страницата.';
+$lang['accessdenied'] = 'Нямате необходимите права за преглеждане на страницата.';
$lang['mediausage'] = 'Ползвайте следния синтаксис, за да упоменете файла:';
$lang['mediaview'] = 'Преглед на оригиналния файл';
$lang['mediaroot'] = 'root';
@@ -161,6 +171,7 @@ $lang['mediaextchange'] = 'Разширението на файла е с
$lang['reference'] = 'Връзки за';
$lang['ref_inuse'] = 'Файлът не може да бъде изтрит, защото все още се ползва от следните страници:';
$lang['ref_hidden'] = 'Някои връзки са към страници, които нямате права да четете';
+
$lang['hits'] = 'Съвпадения';
$lang['quickhits'] = 'Съвпадащи имена на страници';
$lang['toc'] = 'Съдържание';
@@ -184,15 +195,23 @@ $lang['external_edit'] = 'външна редакция';
$lang['summary'] = 'Обобщение';
$lang['noflash'] = 'Необходим е <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> за изобразяване на съдържанието.';
$lang['download'] = 'Изтегляне на фрагмент';
+$lang['tools'] = 'Инструменти';
+$lang['user_tools'] = 'Инструменти за потребители';
+$lang['site_tools'] = 'Инструменти за сайта';
+$lang['page_tools'] = 'Инструменти за страници';
+$lang['skip_to_content'] = 'към съдържанието';
+
$lang['mail_newpage'] = 'добавена страница: ';
$lang['mail_changed'] = 'променена страница: ';
$lang['mail_subscribe_list'] = 'променени страници в именно пространство: ';
$lang['mail_new_user'] = 'нов потребител: ';
$lang['mail_upload'] = 'качен файл: ';
+
$lang['changes_type'] = 'Преглед на променените';
$lang['pages_changes'] = 'Страници';
$lang['media_changes'] = 'Файлове';
$lang['both_changes'] = 'Страници и файлове';
+
$lang['qb_bold'] = 'Удебелен текст';
$lang['qb_italic'] = 'Курсив текст';
$lang['qb_underl'] = 'Подчертан текст';
@@ -217,8 +236,11 @@ $lang['qb_media'] = 'Добавяне на изображения
$lang['qb_sig'] = 'Вмъкване на подпис';
$lang['qb_smileys'] = 'Усмивчици';
$lang['qb_chars'] = 'Специални знаци';
+
$lang['upperns'] = 'към майчиното именно пространство';
+
$lang['admin_register'] = 'Добавяне на нов потребител';
+
$lang['metaedit'] = 'Редактиране на метаданни';
$lang['metasaveerr'] = 'Записването на метаданните се провали';
$lang['metasaveok'] = 'Метаданните са запазени успешно';
@@ -236,6 +258,7 @@ $lang['img_keywords'] = 'Ключови думи';
$lang['img_width'] = 'Ширина';
$lang['img_height'] = 'Височина';
$lang['img_manager'] = 'Преглед в диспечера на файлове';
+
$lang['subscr_subscribe_success'] = '%s е добавен към списъка с абониралите се за %s';
$lang['subscr_subscribe_error'] = 'Грешка при добавянето на %s към списъка с абониралите се за %s';
$lang['subscr_subscribe_noaddress'] = 'Добавянето ви към списъка с абонати не е възможно поради липсата на свързан адрес (на ел. поща) с профила ви.';
@@ -243,6 +266,7 @@ $lang['subscr_unsubscribe_success'] = '%s е премахнат от списъ
$lang['subscr_unsubscribe_error'] = 'Грешка при премахването на %s от списъка с абониралите се за %s';
$lang['subscr_already_subscribed'] = '%s е вече абониран за %s';
$lang['subscr_not_subscribed'] = '%s не е абониран за %s';
+// Manage page for subscriptions
$lang['subscr_m_not_subscribed'] = 'Не сте абониран за текущата страницата или именно пространство.';
$lang['subscr_m_new_header'] = 'Добави абонамент';
$lang['subscr_m_current_header'] = 'Текущи абонаменти';
@@ -252,15 +276,21 @@ $lang['subscr_m_receive'] = 'Получаване';
$lang['subscr_style_every'] = 'на ел. писмо при всяка промяна';
$lang['subscr_style_digest'] = 'на ел. писмо с обобщение на промените във всяка страница (всеки %.2f дни)';
$lang['subscr_style_list'] = 'на списък с променените страници от последното ел. писмо (всеки %.2f дни)';
+
+/* auth.class language support */
$lang['authmodfailed'] = 'Лоша настройки за удостоверяване. Моля, уведомете администратора на Wiki страницата.';
$lang['authtempfail'] = 'Удостоверяването на потребители не е възможно за момента. Ако продължи дълго, моля уведомете администратора на Wiki страницата.';
+$lang['authpwdexpire'] = 'Срока на паролата ви ще изтече след %d дни. Препорачително е да я смените по-скоро.';
+
+/* installer strings */
$lang['i_chooselang'] = 'Изберете вашия изик';
$lang['i_installer'] = 'Инсталатор на DokuWiki';
$lang['i_wikiname'] = 'Име на Wiki-то';
$lang['i_enableacl'] = 'Ползване на списък за достъп (ACL) [препоръчително]';
$lang['i_superuser'] = 'Супер потребител';
$lang['i_problems'] = 'Открити са проблеми, които възпрепятстват инсталирането. Ще можете да продължите след като отстраните долуизброените проблеми.';
-$lang['i_modified'] = 'Поради мерки за сигурност инсталаторът работи само с нови и непроменени инсталационни файлове. Трябва да разархивирате отново файловете от сваления архив или да се посъветвате с <a href="http://dokuwiki.org/install">Инструкциите за инсталиране на Dokuwiki</a>.';
+$lang['i_modified'] = 'Поради мерки за сигурност инсталаторът работи само с нови и непроменени инсталационни файлове.
+ Трябва да разархивирате отново файловете от сваления архив или да се посъветвате с <a href="http://dokuwiki.org/install">Инструкциите за инсталиране на Dokuwiki</a>.';
$lang['i_funcna'] = 'PHP функцията <code>%s</code> не е достъпна. Може би е забранена от доставчика на хостинг.';
$lang['i_phpver'] = 'Инсталираната версия <code>%s</code> на PHP е по-стара от необходимата <code>%s</code>. Актуализирайте PHP инсталацията.';
$lang['i_permfail'] = '<code>%s</code> не е достъпна за писане от DokuWiki. Трябва да промените правата за достъп до директорията!';
@@ -269,29 +299,16 @@ $lang['i_writeerr'] = '<code>%s</code> не можа да бъде с
$lang['i_badhash'] = 'Файлът dokuwiki.php не може да бъде разпознат или е променен (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - непозволена или празна стойност';
$lang['i_success'] = 'Настройването приключи успешно. Вече можете да изтриете файла install.php. Продължете към <a href="doku.php">Вашето ново DokuWiki</a>.';
-$lang['i_failure'] = 'Възникнаха грешки при записването на файловете с настройки. Вероятно ще се наложи да ги поправите ръчно, за да можете да ползвате <a href="doku.php">Вашето ново DokuWiki</a>.';
+
+$lang['i_failure'] = 'Възникнаха грешки при записването на файловете с настройки. Вероятно ще се наложи да ги поправите ръчно,
+ за да можете да ползвате <a href="doku.php">Вашето ново DokuWiki</a>.';
$lang['i_policy'] = 'Първоначална политика за достъп';
$lang['i_pol0'] = 'Отворено Wiki (всеки може да чете, пише и качва)';
$lang['i_pol1'] = 'Публично Wiki (всеки може да чете, само регистрирани пишат и качват)';
$lang['i_pol2'] = 'Затворено Wiki (само регистрирани четат, пишат и качват)';
$lang['i_retry'] = 'Повторен опит';
$lang['i_license'] = 'Моля, изберете лиценз под който желаете да публикувате съдържанието:';
-$lang['mu_intro'] = 'От тук можете да качите няколко файла наведнъж. Натиснете бутона "Избиране", изберете файлове и натиснете "Качване".
-';
-$lang['mu_gridname'] = 'Име на файла';
-$lang['mu_gridsize'] = 'Големина';
-$lang['mu_gridstat'] = 'Състояние';
-$lang['mu_namespace'] = 'Именно пространство';
-$lang['mu_browse'] = 'Избиране';
-$lang['mu_toobig'] = 'прекалено голям';
-$lang['mu_ready'] = 'готов за качване';
-$lang['mu_done'] = 'качен';
-$lang['mu_fail'] = 'неуспешно качване';
-$lang['mu_authfail'] = 'приключила сесия';
-$lang['mu_progress'] = '@PCT@% качен';
-$lang['mu_filetypes'] = 'Позволени файлови разширения';
-$lang['mu_info'] = 'качени файла.';
-$lang['mu_lasterr'] = 'Последна грешка:';
+
$lang['recent_global'] = 'В момента преглеждате промените в именно пространство <b>%s</b>. Може да прегледате и <a href="%s">промените в цялото Wiki</a>.';
$lang['years'] = 'преди %d години';
$lang['months'] = 'преди %d месеца';
@@ -300,7 +317,9 @@ $lang['days'] = 'преди %d дни';
$lang['hours'] = 'преди %d часа';
$lang['minutes'] = 'преди %d минути';
$lang['seconds'] = 'преди %d секунди';
-$lang['wordblock'] = 'Направените от вас промени не са съхранени, защото съдържат забранен текст (SPAM).';
+
+$lang['wordblock'] = 'Направените от Вас промени не са съхранени, защото съдържат забранен текст (SPAM).';
+
$lang['media_uploadtab'] = 'Качване';
$lang['media_searchtab'] = 'Търсене';
$lang['media_file'] = 'Файл';
@@ -324,4 +343,5 @@ $lang['media_perm_read'] = 'За съжаление нямате дост
$lang['media_perm_upload'] = 'За съжаление нямате достатъчно права, за да можете да качите файла.';
$lang['media_update'] = 'Качване на нова версия';
$lang['media_restore'] = 'Възстановяване на тази версия';
-$lang['plugin_install_err'] = 'Неправилно инсталирана приставка. Моля, преименувайте директорията \'%s\' на \'%s\'.';
+
+//Setup VIM: ex: et ts=2 :
diff --git a/inc/lang/bg/mailtext.txt b/inc/lang/bg/mailtext.txt
index ad0024a8d..a5f0cbd92 100644
--- a/inc/lang/bg/mailtext.txt
+++ b/inc/lang/bg/mailtext.txt
@@ -1,4 +1,4 @@
-Страница във DokuWiki е добавена или променена. Ето детайлите:
+Страница в DokuWiki е добавена или променена. Ето детайлите:
Дата : @DATE@
Браузър : @BROWSER@
diff --git a/inc/lang/bg/mailwrap.html b/inc/lang/bg/mailwrap.html
new file mode 100644
index 000000000..26b0a1e6a
--- /dev/null
+++ b/inc/lang/bg/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@.</small>
+</body>
+</html>
diff --git a/inc/lang/bg/resetpwd.txt b/inc/lang/bg/resetpwd.txt
new file mode 100644
index 000000000..caa4adfdc
--- /dev/null
+++ b/inc/lang/bg/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Задаване на нова парола ======
+
+Моля, въведете нова парола за вашия акаунт в Wiki страницата.
+
diff --git a/inc/lang/ca-valencia/install.html b/inc/lang/ca-valencia/install.html
index eb77cd648..49cd4260f 100644
--- a/inc/lang/ca-valencia/install.html
+++ b/inc/lang/ca-valencia/install.html
@@ -1,10 +1,10 @@
<p>Esta pàgina l'ajudarà en la primera instalació i configuració de <a href="http://dokuwiki.org">Dokuwiki</a>. N'hi ha més informació de l'instalador disponible en la
<a href="http://dokuwiki.org/installer">pàgina de documentació</a>.</p>
-<p>DokuWiki utilisa archius corrents per a l'almagasenament de les pàgines del wiki i atra informació associada ad estes pàgines (p. e. imàgens, índexs de busca, versions antigues, etc.). Per a que DokuWiki funcione correctament
+<p>DokuWiki utilisa archius corrents per a l'almagasenament de les pàgines del wiki i atra informació associada ad estes pàgines (p. e. imàgens, índexs de busca, versions antigues, etc.). Per a que DokuWiki funcione correctament
<strong>deu</strong> tindre accés d'escritura als directoris que contenen estos archius. Est instalador no pot ajustar els permissos del directori. Normalment haurà de fer-ho directament en una consola de del sistema o, si utilisa un hostage, per FTP o en el panel de control (p. e. cPanel).</p>
-<p>Est instalador configurarà <acronym title="access control list">ACL</acronym> en el seu DokuWiki, que al mateix temps permet l'accés de l'administrador i l'accés al menú d'administració de DokuWiki per a instalar plúgins, gestionar usuaris, gestionar els accessos a les pàgines del wiki i la modificació dels ajusts de configuració. No és necessari per a que DokuWiki funcione, pero farà més fàcil la seua administració.</p>
+<p>Est instalador configurarà <abbr title="access control list">ACL</abbr> en el seu DokuWiki, que al mateix temps permet l'accés de l'administrador i l'accés al menú d'administració de DokuWiki per a instalar plúgins, gestionar usuaris, gestionar els accessos a les pàgines del wiki i la modificació dels ajusts de configuració. No és necessari per a que DokuWiki funcione, pero farà més fàcil la seua administració.</p>
<p>Els usuaris experimentats o en necessitats especials de configuració deuen utilisar estos vínculs per a informació referent a
<a href="http://dokuwiki.org/install">instruccions d'instalació</a>
diff --git a/inc/lang/ca-valencia/lang.php b/inc/lang/ca-valencia/lang.php
index eac9fc8d1..e299f6427 100644
--- a/inc/lang/ca-valencia/lang.php
+++ b/inc/lang/ca-valencia/lang.php
@@ -41,7 +41,6 @@ $lang['btn_subscribe'] = 'Subscriure\'s a la pàgina';
$lang['btn_unsubscribe'] = 'Desubscriure\'s de la pàgina';
$lang['btn_profile'] = 'Actualisar perfil';
$lang['btn_reset'] = 'Reiniciar';
-$lang['btn_resendpwd'] = 'Enviar contrasenya nova';
$lang['btn_draft'] = 'Editar borrador';
$lang['btn_recover'] = 'Recuperar borrador';
$lang['btn_draftdel'] = 'Borrar borrador';
@@ -76,7 +75,6 @@ $lang['profnoempty'] = 'No es permet deixar el nom o la direcció de c
$lang['profchanged'] = 'Perfil de l\'usuari actualisat.';
$lang['pwdforget'] = '¿Ha oblidat la contrasenya? Demane\'n una nova';
$lang['resendna'] = 'Este wiki no permet reenviar la contrasenya.';
-$lang['resendpwd'] = 'Enviar contrasenya nova per a';
$lang['resendpwdmissing'] = 'Disculpe, pero deu omplir tots els camps.';
$lang['resendpwdnouser'] = 'Disculpe, pero no trobem ad est usuari en la base de senyes.';
$lang['resendpwdbadauth'] = 'Disculpe, pero este còdic d\'autenticació no es vàlit. Verifique que haja utilisat el víncul de confirmació sancer.';
@@ -221,21 +219,6 @@ $lang['i_pol0'] = 'Wiki obert (llegir, escriure i enviar tots)';
$lang['i_pol1'] = 'Wiki públic (llegir tots, escriure i enviar només usuaris registrats)';
$lang['i_pol2'] = 'Wiki tancat (llegir, escriure i enviar només usuaris registrats)';
$lang['i_retry'] = 'Reintentar';
-$lang['mu_intro'] = 'Des d\'ací pot enviar diversos archius d\'una volta. Pulse el botó d\'examinar per a afegir-los a la coa. Pulse enviar quan ho tinga.';
-$lang['mu_gridname'] = 'Nom d\'archiu';
-$lang['mu_gridsize'] = 'Tamany';
-$lang['mu_gridstat'] = 'Estat';
-$lang['mu_namespace'] = 'Espai de noms';
-$lang['mu_browse'] = 'Examinar';
-$lang['mu_toobig'] = 'massa gran';
-$lang['mu_ready'] = 'preparat per a enviar';
-$lang['mu_done'] = 'complet';
-$lang['mu_fail'] = 'fallit';
-$lang['mu_authfail'] = 'la sessió ha vençut';
-$lang['mu_progress'] = '@PCT@% enviat';
-$lang['mu_filetypes'] = 'Classes d\'archiu permeses';
-$lang['mu_info'] = 'archius enviats.';
-$lang['mu_lasterr'] = 'Últim erro:';
$lang['recent_global'] = 'Està veent els canvis dins de l\'espai de noms <b>%s</b>. També pot <a href="%s">vore els canvis recents en el wiki sancer</a>.';
$lang['years'] = 'fa %d anys';
$lang['months'] = 'fa %d mesos';
diff --git a/inc/lang/ca/install.html b/inc/lang/ca/install.html
index e7c8f0b57..363e598d2 100644
--- a/inc/lang/ca/install.html
+++ b/inc/lang/ca/install.html
@@ -2,7 +2,7 @@
<p>DokuWiki utilitza fitxers normals per a emmagatzemar les pàgines wiki i la informació associada a aquestes pàgines (p. ex. imatges, índexs de cerca, revisions anteriors, etc.). Per tal de funcionar correctament DokuWiki <strong>necessita</strong> tenir accés d'escriptura als directoris que contenen aquests fitxers. Aquest instal·lador no pot configurar els permisos del directori. Normalment això cal fer-ho directament en la línia d'ordres o, si esteu utilitzant un hostatge, mitjançant FTP o el tauler de control del vostre hostatge (p. ex. cPanel).</p>
-<p>Aquest instal·lador configurarà el vostre DokuWiki per a <acronym title="access control list">ACL</acronym>, cosa que, al seu torn, permet l'accés de l'administrador al menú d'administració, on pot instal·lar connectors, gestionar usuaris, gestionar l'accés a les pàgines wiki i modificar els paràmetres de configuració. No és un requisit per al funcionament de DokuWiki, però el fa més fàcil d'administrar.</p>
+<p>Aquest instal·lador configurarà el vostre DokuWiki per a <abbr title="access control list">ACL</abbr>, cosa que, al seu torn, permet l'accés de l'administrador al menú d'administració, on pot instal·lar connectors, gestionar usuaris, gestionar l'accés a les pàgines wiki i modificar els paràmetres de configuració. No és un requisit per al funcionament de DokuWiki, però el fa més fàcil d'administrar.</p>
<p>Els usuaris experts o els que tinguin requeriments específics poden utilitzar els enllaços següents per a obtenir més detalls sobre <a href="http://dokuwiki.org/install">instruccions d'instal·lació</a>
i <a href="http://dokuwiki.org/config">paràmetres de configuració</a>.</p> \ No newline at end of file
diff --git a/inc/lang/ca/lang.php b/inc/lang/ca/lang.php
index 7094df5b4..3a1412617 100644
--- a/inc/lang/ca/lang.php
+++ b/inc/lang/ca/lang.php
@@ -41,7 +41,6 @@ $lang['btn_subscribe'] = 'Subscripció a canvis d\'aquesta pàgina';
$lang['btn_unsubscribe'] = 'Cancel·la subscripció a pàgina';
$lang['btn_profile'] = 'Actualització del perfil';
$lang['btn_reset'] = 'Reinicia';
-$lang['btn_resendpwd'] = 'Envia nova contrasenya';
$lang['btn_draft'] = 'Edita esborrany';
$lang['btn_recover'] = 'Recupera esborrany';
$lang['btn_draftdel'] = 'Suprimeix esborrany';
@@ -76,7 +75,6 @@ $lang['profnoempty'] = 'No es pot deixar en blanc el nom o l\'adreça
$lang['profchanged'] = 'El perfil d\'usuari s\'ha actualitzat correctament.';
$lang['pwdforget'] = 'Heu oblidat la contrasenya? Podeu obtenir-ne una de nova.';
$lang['resendna'] = 'Aquest wiki no permet tornar a enviar la contrasenya.';
-$lang['resendpwd'] = 'Enviament d\'una nova contrasenya per a';
$lang['resendpwdmissing'] = 'Heu d\'emplenar tots els camps.';
$lang['resendpwdnouser'] = 'No s\'ha pogut trobar aquest usuari a la base de dades.';
$lang['resendpwdbadauth'] = 'Aquest codi d\'autenticació no és vàlid. Assegureu-vos d\'utilitzar l\'enllaç de confirmació complet.';
@@ -217,21 +215,6 @@ $lang['i_pol0'] = 'Wiki obert (tothom pot llegir, escriure i penj
$lang['i_pol1'] = 'Wiki públic (tothom pot llegir, els usuaris registrats poden escriure i penjar fitxers)';
$lang['i_pol2'] = 'Wiki tancat (només els usuaris registrats poden llegir, escriure i penjar fitxers)';
$lang['i_retry'] = 'Reintenta';
-$lang['mu_intro'] = 'Aquí podeu penjar múltiples fitxers d\'una vegada. Feu clic en el botó Explora per afegir els fitxers a la cua. Després, premeu Penja.';
-$lang['mu_gridname'] = 'Nom del fitxer';
-$lang['mu_gridsize'] = 'Mida';
-$lang['mu_gridstat'] = 'Estat';
-$lang['mu_namespace'] = 'Espai';
-$lang['mu_browse'] = 'Explora';
-$lang['mu_toobig'] = 'massa gran';
-$lang['mu_ready'] = 'llest per a penjar';
-$lang['mu_done'] = 'complet';
-$lang['mu_fail'] = 'error';
-$lang['mu_authfail'] = 'la sessió ha vençut';
-$lang['mu_progress'] = 'càrrega @PCT@%';
-$lang['mu_filetypes'] = 'Tipus de fitxer permesos';
-$lang['mu_info'] = 'fitxers penjats.';
-$lang['mu_lasterr'] = 'Darrer error:';
$lang['recent_global'] = 'Esteu veient els canvis recents de l\'espai <strong>%s</strong>. També podeu veure els <a href="%s">canvis recents de tot el wiki</a>.';
$lang['years'] = 'fa %d anys';
$lang['months'] = 'fa %d mesos';
diff --git a/inc/lang/cs/install.html b/inc/lang/cs/install.html
index 726d7c31f..043e92431 100644
--- a/inc/lang/cs/install.html
+++ b/inc/lang/cs/install.html
@@ -10,7 +10,7 @@ tyto soubory. Tento instalátor není schopen sám nastavit přístupová práva
a adresářům. To se obyčejně dělá přímo v shellu nebo, používáte-li hosting, přes
FTP nebo ovládací panel vašeho hostingu (např. cPanel).</p>
-<p>Tento instalátor nastaví <acronym title="access control list">ACL</acronym>
+<p>Tento instalátor nastaví <abbr title="access control list">ACL</abbr>
(přístupová práva uživatelů) pro vaši DokuWiki, což umožní správci přihlásit
se do administrační části DokuWiki a tam instalovat pluginy, spravovat uživatele,
nastavovat přístup k wiki stránkám a měnit další nastavení wiki. Není to
diff --git a/inc/lang/cs/lang.php b/inc/lang/cs/lang.php
index c6eb7be49..a53da327a 100644
--- a/inc/lang/cs/lang.php
+++ b/inc/lang/cs/lang.php
@@ -11,6 +11,7 @@
* @author Lefty <lefty@multihost.cz>
* @author Vojta Beran <xmamut@email.cz>
* @author zbynek.krivka@seznam.cz
+ * @author Bohumir Zamecnik <bohumir.zamecnik@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -46,7 +47,7 @@ $lang['btn_backtomedia'] = 'Zpět do Výběru dokumentu';
$lang['btn_subscribe'] = 'Odebírat emailem změny stránky';
$lang['btn_profile'] = 'Upravit profil';
$lang['btn_reset'] = 'Reset';
-$lang['btn_resendpwd'] = 'Zaslat nové heslo';
+$lang['btn_resendpwd'] = 'Nastavit nové heslo';
$lang['btn_draft'] = 'Upravit koncept';
$lang['btn_recover'] = 'Obnovit koncept';
$lang['btn_draftdel'] = 'Vymazat koncept';
@@ -83,7 +84,7 @@ $lang['profnoempty'] = 'Nelze zadat prázdné jméno nebo mailová adr
$lang['profchanged'] = 'Uživatelský profil změněn.';
$lang['pwdforget'] = 'Zapomněli jste heslo? Nechte si zaslat nové';
$lang['resendna'] = 'Tato wiki neumožňuje zasílání nových hesel.';
-$lang['resendpwd'] = 'Odeslat nové heslo pro uživatele';
+$lang['resendpwd'] = 'Nastavit nové heslo pro';
$lang['resendpwdmissing'] = 'Musíte vyplnit všechny položky.';
$lang['resendpwdnouser'] = 'Bohužel takový uživatel v systému není.';
$lang['resendpwdbadauth'] = 'Autorizační kód není platný. Zadali jste opravdu celý odkaz na potvrzovací stránku?';
@@ -96,6 +97,7 @@ $lang['searchmedia_in'] = 'Hledat v %s';
$lang['txt_upload'] = 'Vyberte soubor jako přílohu';
$lang['txt_filename'] = 'Wiki jméno (volitelné)';
$lang['txt_overwrt'] = 'Přepsat existující soubor';
+$lang['maxuploadsize'] = 'Max. velikost souboru %s';
$lang['lockedby'] = 'Právě zamknuto:';
$lang['lockexpire'] = 'Zámek vyprší:';
$lang['js']['willexpire'] = 'Váš zámek pro editaci za chvíli vyprší.\nAbyste předešli konfliktům, stiskněte tlačítko Náhled a zámek se prodlouží.';
@@ -190,6 +192,11 @@ $lang['external_edit'] = 'upraveno mimo DokuWiki';
$lang['summary'] = 'Komentář k úpravám';
$lang['noflash'] = 'Pro přehrání obsahu potřebujete <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
$lang['download'] = 'Stáhnout snippet';
+$lang['tools'] = 'Nástroje';
+$lang['user_tools'] = 'Uživatelské nástroje';
+$lang['site_tools'] = 'Nástroje pro tento web';
+$lang['page_tools'] = 'Nástroje pro stránku';
+$lang['skip_to_content'] = 'jít k obsahu';
$lang['mail_newpage'] = 'nová stránka:';
$lang['mail_changed'] = 'změna stránky:';
$lang['mail_subscribe_list'] = 'stránky změněné ve jmenném prostoru:';
@@ -260,6 +267,7 @@ $lang['subscr_style_digest'] = 'souhrnný email změn pro každou stránku (ka
$lang['subscr_style_list'] = 'seznam změněných stránek od posledního emailu (každé %.2f dny/dní)';
$lang['authmodfailed'] = 'Autentizace uživatelů je špatně nastavena. Informujte prosím správce této wiki.';
$lang['authtempfail'] = 'Autentizace uživatelů je dočasně nedostupná. Pokud tento problém přetrvává, informujte prosím správce této wiki.';
+$lang['authpwdexpire'] = 'Platnost vašeho hesla vyprší za %d dní, měli byste ho změnit co nejdříve.';
$lang['i_chooselang'] = 'Vyberte si jazyk';
$lang['i_installer'] = 'Instalace DokuWiki';
$lang['i_wikiname'] = 'Název wiki';
@@ -282,21 +290,6 @@ $lang['i_pol1'] = 'Veřejná wiki (čtení pro všechny, zápis a
$lang['i_pol2'] = 'Uzavřená wiki (čtení, zápis a upload pouze pro registrované uživatele)';
$lang['i_retry'] = 'Zkusit znovu';
$lang['i_license'] = 'Vyberte prosím licenci obsahu:';
-$lang['mu_intro'] = 'Zde můžete načíst více souborů najednou. Pro přidání souborů do fronty stiskněte tlačítko "Procházet". Až budete hotovi, stiskněte "Načíst".';
-$lang['mu_gridname'] = 'Název souboru';
-$lang['mu_gridsize'] = 'Velikost';
-$lang['mu_gridstat'] = 'Stav';
-$lang['mu_namespace'] = 'Jmenný prostor';
-$lang['mu_browse'] = 'Procházet';
-$lang['mu_toobig'] = 'příliš velké';
-$lang['mu_ready'] = 'připraveno k načtení';
-$lang['mu_done'] = 'hotovo';
-$lang['mu_fail'] = 'selhalo';
-$lang['mu_authfail'] = 'vypršela session';
-$lang['mu_progress'] = '@PCT@% načten';
-$lang['mu_filetypes'] = 'Povolené typy souborů';
-$lang['mu_info'] = 'soubory načteny.';
-$lang['mu_lasterr'] = 'Poslední chyba:';
$lang['recent_global'] = 'Právě si prohlížíte změny ve jmenném prostoru <b>%s</b>. Také si můžete <a href="%s">zobrazit změny v celé wiki</a>.';
$lang['years'] = 'před %d roky';
$lang['months'] = 'před %d měsíci';
@@ -329,4 +322,3 @@ $lang['media_perm_read'] = 'Bohužel, nemáte práva číst soubory.';
$lang['media_perm_upload'] = 'Bohužel, nemáte práva nahrávat soubory.';
$lang['media_update'] = 'Nahrát novou verzi';
$lang['media_restore'] = 'Obnovit tuto verzi';
-$lang['plugin_install_err'] = 'Plugin je špatně nainstalován. Přejmenujte adresář pluginu \'%s\' na \'%s\'.';
diff --git a/inc/lang/cs/mailwrap.html b/inc/lang/cs/mailwrap.html
new file mode 100644
index 000000000..dacd38d57
--- /dev/null
+++ b/inc/lang/cs/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ </head>
+ <body>
+
+ @HTMLBODY@
+
+ <br /><hr />
+ <small>Tento mail byl vygenerován systémem DokuWiki na adrese @DOKUWIKIURL@.</small>
+ </body>
+ </html> \ No newline at end of file
diff --git a/inc/lang/cs/resetpwd.txt b/inc/lang/cs/resetpwd.txt
new file mode 100644
index 000000000..9aa449cb6
--- /dev/null
+++ b/inc/lang/cs/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Nastavení nového hesla ======
+
+Zadejte prosím nové heslo pro váš účet. \ No newline at end of file
diff --git a/inc/lang/cs/subscr_digest.txt b/inc/lang/cs/subscr_digest.txt
index 57b7240c5..1b1770965 100644
--- a/inc/lang/cs/subscr_digest.txt
+++ b/inc/lang/cs/subscr_digest.txt
@@ -12,7 +12,7 @@ Nová revize: @NEWPAGE@
Pro odhlášení z odebírání změn na této webové stránce
se prosím příhlašte do wiki na adrese
-@DOKUWIKIURL@,pak navštivte
+@DOKUWIKIURL@, pak navštivte
@SUBSCRIBE@
a odhlaště se z odebírání změn na stránce či
ve jmenném prostoru.
diff --git a/inc/lang/cs/subscr_list.txt b/inc/lang/cs/subscr_list.txt
index 82683c57f..f85be8a9f 100644
--- a/inc/lang/cs/subscr_list.txt
+++ b/inc/lang/cs/subscr_list.txt
@@ -9,7 +9,7 @@ Zde jsou:
Pro odhlášení z odebírání změn
se prosím příhlašte do wiki na adrese
-@DOKUWIKIURL@,pak navštivte
+@DOKUWIKIURL@, pak navštivte
@SUBSCRIBE@
a odhlaště se z odebírání změn na stránce či
ve jmenném prostoru.
diff --git a/inc/lang/cs/subscr_single.txt b/inc/lang/cs/subscr_single.txt
index c0089c1b7..1ee33da09 100644
--- a/inc/lang/cs/subscr_single.txt
+++ b/inc/lang/cs/subscr_single.txt
@@ -15,7 +15,7 @@ Nová revize: @NEWPAGE@
Pro odhlášení z odebírání změn na této webové stránce
se prosím příhlašte do wiki na adrese
-@DOKUWIKIURL@,pak navštivte
+@DOKUWIKIURL@, pak navštivte
@SUBSCRIBE@
a odhlaště se z odebírání změn na stránce či
ve jmenném prostoru.
diff --git a/inc/lang/da/install.html b/inc/lang/da/install.html
index 5c53c5546..3cc13f8e2 100644
--- a/inc/lang/da/install.html
+++ b/inc/lang/da/install.html
@@ -1,24 +1,24 @@
-<p>Denne side hjælper til første-gangs installation og konfiguration af
-<a href="http://dokuwiki.org">Dokuwiki</a>. Mere information om denne
+<p>Denne side hjælper til første-gangs installation og konfiguration af
+<a href="http://dokuwiki.org">Dokuwiki</a>. Mere information om denne
installer er tilgængelig på dens egen
<a href="http://dokuwiki.org/installer">dokumentations side</a>.</p>
-<p>DokuWiki bruger almindelige filer til at gemme wiki sider og anden
-information relaterende til disse sider (f.eks. billeder, søge indeks, gamle
-udgaver, osv). For at fungerer optimalt <strong>skal</strong> DokuWiki have
-skrive adgang til mapperne der holder disse filer. Denne installer er ikke
-istand til at opsætte mappe tilladelser. Det skal normalt udføres direkte i en
-kommando shell eller hvis du bruger hosting, gennem FTP eller dit hostings
+<p>DokuWiki bruger almindelige filer til at gemme wiki sider og anden
+information relaterende til disse sider (f.eks. billeder, søge indeks, gamle
+udgaver, osv). For at fungerer optimalt <strong>skal</strong> DokuWiki have
+skrive adgang til mapperne der holder disse filer. Denne installer er ikke
+istand til at opsætte mappe tilladelser. Det skal normalt udføres direkte i en
+kommando shell eller hvis du bruger hosting, gennem FTP eller dit hostings
kontrol panel (f.eks. cPanel).</p>
-<p>Denne installer vil opsætte din DokuWiki konfiguration for
-<acronym title="access control list">ACL</acronym>, hvilket tillader
-administrator login og adgang til DokuWiki's adminstrative menu til
-installation af udvidelser, håndtering af brugere, håndtering af adgang til wiki
-sider og ændring af konfigurations indstillinger. Det er ikke et krav for at
+<p>Denne installer vil opsætte din DokuWiki konfiguration for
+<abbr title="access control list">ACL</abbr>, hvilket tillader
+administrator login og adgang til DokuWiki's adminstrative menu til
+installation af udvidelser, håndtering af brugere, håndtering af adgang til wiki
+sider og ændring af konfigurations indstillinger. Det er ikke et krav for at
DokuWiki kan fungere, men det vil gøre DokuWiki lettere at administre.</p>
-<p>Erfarne brugere og brugere med specielle opsætningskrav burde bruge disse
-henvisninger for detaljer vedrørende
+<p>Erfarne brugere og brugere med specielle opsætningskrav burde bruge disse
+henvisninger for detaljer vedrørende
<a href="http://dokuwiki.org/install">installations instruktioner</a>
og <a href="http://dokuwiki.org/config">konfigurations indstillinger</a>.</p>
diff --git a/inc/lang/da/lang.php b/inc/lang/da/lang.php
index 0b6961921..ee8de1bb8 100644
--- a/inc/lang/da/lang.php
+++ b/inc/lang/da/lang.php
@@ -13,6 +13,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -48,12 +49,14 @@ $lang['btn_backtomedia'] = 'Tilbage til valg af mediefil';
$lang['btn_subscribe'] = 'Abonnér på ændringer';
$lang['btn_profile'] = 'Opdatér profil';
$lang['btn_reset'] = 'Nulstil';
-$lang['btn_resendpwd'] = 'Send ny adgangskode';
+$lang['btn_resendpwd'] = 'Vælg ny adgangskode';
$lang['btn_draft'] = 'Redigér kladde';
$lang['btn_recover'] = 'Gendan kladde';
$lang['btn_draftdel'] = 'Slet kladde';
$lang['btn_revert'] = 'Reetablér';
$lang['btn_register'] = 'Registrér';
+$lang['btn_apply'] = 'Anvend';
+$lang['btn_media'] = 'Media Manager';
$lang['loggedinas'] = 'Logget ind som';
$lang['user'] = 'Brugernavn';
$lang['pass'] = 'Adgangskode';
@@ -83,7 +86,7 @@ $lang['profnoempty'] = 'Tomt navn eller e-mail adresse er ikke tilladt
$lang['profchanged'] = 'Brugerprofil opdateret korrekt.';
$lang['pwdforget'] = 'Har du glemt dit adgangskode? Få et nyt';
$lang['resendna'] = 'Denne wiki understøtter ikke udsendelse af nyt adgangskode.';
-$lang['resendpwd'] = 'Send nyt adgangskode for';
+$lang['resendpwd'] = 'Vælg ny adgangskode for';
$lang['resendpwdmissing'] = 'Du skal udfylde alle felter.';
$lang['resendpwdnouser'] = 'Vi kan ikke finde denne bruger i vores database.';
$lang['resendpwdbadauth'] = 'Beklager, denne autoriseringskode er ikke gyldig. Kontroller venligst at du benyttede det fulde link til bekræftelse.';
@@ -96,9 +99,10 @@ $lang['searchmedia_in'] = 'Søg i %s';
$lang['txt_upload'] = 'Vælg den fil der skal overføres';
$lang['txt_filename'] = 'Indtast wikinavn (valgfrit)';
$lang['txt_overwrt'] = 'Overskriv eksisterende fil';
+$lang['maxuploadsize'] = 'Upload max. %s pr. fil.';
$lang['lockedby'] = 'Midlertidig låst af';
$lang['lockexpire'] = 'Lås udløber kl.';
-$lang['js']['willexpire'] = 'Din lås på dette dokument udløber om et minut.\nTryk på Forhåndsvisning-knappen for at undgå konflikter.';
+$lang['js']['willexpire'] = 'Din lås på dette dokument udløber om et minut.\nTryk på Forhåndsvisning-knappen for at undgå konflikter.';
$lang['js']['notsavedyet'] = 'Ugemte ændringer vil blive mistet
Fortsæt alligevel?';
$lang['js']['searchmedia'] = 'Søg efter filer';
@@ -130,6 +134,16 @@ Du kan stadig kopiere og indsætte linket.';
$lang['js']['linkwiz'] = 'guiden til henvisninger';
$lang['js']['linkto'] = 'Henvise til:';
$lang['js']['del_confirm'] = 'Slet valgte post(er)?';
+$lang['js']['restore_confirm'] = 'Vil du virkeligt genskabe denne version?';
+$lang['js']['media_diff'] = 'Vis forskelle:';
+$lang['js']['media_diff_both'] = 'Side ved Side';
+$lang['js']['media_diff_opacity'] = 'Skin-igennem';
+$lang['js']['media_select'] = 'Vælg filer...';
+$lang['js']['media_upload_btn'] = 'Upload';
+$lang['js']['media_done_btn'] = 'Færdig';
+$lang['js']['media_drop'] = 'Drop filer her for at uploade';
+$lang['js']['media_cancel'] = 'fjern';
+$lang['js']['media_overwrt'] = 'Overskriv eksisterende filer';
$lang['rssfailed'] = 'Der opstod en fejl ved indhentning af: ';
$lang['nothingfound'] = 'Søgningen gav intet resultat.';
$lang['mediaselect'] = 'Vælg mediefil';
@@ -164,6 +178,9 @@ $lang['yours'] = 'Din version';
$lang['diff'] = 'Vis forskelle i forhold til den nuværende udgave';
$lang['diff2'] = 'Vis forskelle i forhold til de valgte revisioner';
$lang['difflink'] = 'Link til denne sammenlinings vising';
+$lang['diff_type'] = 'Vis forskelle:';
+$lang['diff_inline'] = 'Indeni';
+$lang['diff_side'] = 'Side ved Side';
$lang['line'] = 'Linje';
$lang['breadcrumb'] = 'Sti';
$lang['youarehere'] = 'Du er her';
@@ -176,11 +193,20 @@ $lang['external_edit'] = 'ekstern redigering';
$lang['summary'] = 'Redigerings resumé';
$lang['noflash'] = 'Den <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> er nødvendig til at vise denne indehold.';
$lang['download'] = 'Hente kodestykke';
+$lang['tools'] = 'Værktøjer';
+$lang['user_tools'] = 'Brugerværktøjer';
+$lang['site_tools'] = 'Webstedsværktøjer';
+$lang['page_tools'] = 'Sideværktøjer';
+$lang['skip_to_content'] = 'hop til indhold';
$lang['mail_newpage'] = 'dokument tilføjet:';
$lang['mail_changed'] = 'dokument ændret:';
$lang['mail_subscribe_list'] = 'sider ændret i navnerum';
$lang['mail_new_user'] = 'Ny bruger';
$lang['mail_upload'] = 'fil overføret:';
+$lang['changes_type'] = 'Vis ændringer af';
+$lang['pages_changes'] = 'Sider';
+$lang['media_changes'] = 'Media filer';
+$lang['both_changes'] = 'Både sider og media filer';
$lang['qb_bold'] = 'Fed';
$lang['qb_italic'] = 'Kursiv';
$lang['qb_underl'] = 'Understregning';
@@ -221,6 +247,9 @@ $lang['img_copyr'] = 'Ophavsret';
$lang['img_format'] = 'Format';
$lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Emneord';
+$lang['img_width'] = 'Bredde';
+$lang['img_height'] = 'Højde';
+$lang['img_manager'] = 'Vis i Media Manager';
$lang['subscr_subscribe_success'] = 'Tilføjede %s til abonnement listen for %s';
$lang['subscr_subscribe_error'] = 'Fejl ved tilføjelse af %s til abonnement listen for %s';
$lang['subscr_subscribe_noaddress'] = 'Der er ikke nogen addresse forbundet til din bruger, så du kan ikke blive tilføjet til abonnement listen';
@@ -235,9 +264,11 @@ $lang['subscr_m_unsubscribe'] = 'Fjern abonnement';
$lang['subscr_m_subscribe'] = 'Abonér';
$lang['subscr_m_receive'] = 'Modtag';
$lang['subscr_style_every'] = 'email på hver ændring';
+$lang['subscr_style_digest'] = 'opsummeringsmail med ændringer for hver side (hver %.2f dage)';
$lang['subscr_style_list'] = 'list af ændrede sider siden sidste email (hver %.2f dage)';
$lang['authmodfailed'] = 'Fejl i brugervalideringens konfiguration. Kontakt venligst wikiens administrator.';
$lang['authtempfail'] = 'Brugervalidering er midlertidigt ude af drift. Hvis dette er vedvarende, kontakt venligst wikiens administrator.';
+$lang['authpwdexpire'] = 'Din adgangskode vil udløbe om %d dage, du bør ændre det snart.';
$lang['i_chooselang'] = 'Vælg dit sprog';
$lang['i_installer'] = 'DokuWiki Installer';
$lang['i_wikiname'] = 'Wiki Navn';
@@ -262,21 +293,6 @@ $lang['i_pol1'] = 'Offentlig Wiki (alle kan læse, kun registrere
$lang['i_pol2'] = 'Lukket Wiki (kun for registerede brugere kan læse, skrive og overføre)';
$lang['i_retry'] = 'Forsøg igen';
$lang['i_license'] = 'Vælg venligst licensen du vil tilføje dit indhold under:';
-$lang['mu_intro'] = 'Her kan du overføre flere filer af gangen. Klik på gennemse for at tilføje dem til køen. Tryk på overføre knappen når du er klar.';
-$lang['mu_gridname'] = 'Filnavn';
-$lang['mu_gridsize'] = 'Størrelse';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Navnerum';
-$lang['mu_browse'] = 'gennemse';
-$lang['mu_toobig'] = 'for stor';
-$lang['mu_ready'] = 'klar til overføre';
-$lang['mu_done'] = 'færdig';
-$lang['mu_fail'] = 'fejlede';
-$lang['mu_authfail'] = 'session udløb';
-$lang['mu_progress'] = '@PCT@% upload';
-$lang['mu_filetypes'] = 'Tilladte filtyper';
-$lang['mu_info'] = 'filer var overføret.';
-$lang['mu_lasterr'] = 'Sidste fejl:';
$lang['recent_global'] = 'Du ser lige nu ændringerne i <b>%s</b> navnerummet. Du kan også <a href="%s">se de sidste ændringer for hele wiki siden </a>';
$lang['years'] = '%d år siden';
$lang['months'] = '%d måned siden';
@@ -286,3 +302,26 @@ $lang['hours'] = '%d timer siden';
$lang['minutes'] = '%d minutter siden';
$lang['seconds'] = '%d sekunder siden';
$lang['wordblock'] = 'Din ændring blev ikke gemt da den indeholder blokeret tekst (spam).';
+$lang['media_uploadtab'] = 'Upload';
+$lang['media_searchtab'] = 'Søg';
+$lang['media_file'] = 'Fil';
+$lang['media_viewtab'] = 'Vis';
+$lang['media_edittab'] = 'Rediger';
+$lang['media_historytab'] = 'Historie';
+$lang['media_list_thumbs'] = 'Thumbnails';
+$lang['media_list_rows'] = 'Rækker';
+$lang['media_sort_name'] = 'Navn';
+$lang['media_sort_date'] = 'Dato';
+$lang['media_namespaces'] = 'Vælg navneområde';
+$lang['media_files'] = 'Filer i %s';
+$lang['media_upload'] = 'Upload til %s';
+$lang['media_search'] = 'Søg i %s';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s ved %s';
+$lang['media_edit'] = 'Rediger %s';
+$lang['media_history'] = 'Historie for %s';
+$lang['media_meta_edited'] = 'metadata redigered';
+$lang['media_perm_read'] = 'Du har ikke nok rettigheder til at læse filer.';
+$lang['media_perm_upload'] = 'Du har ikke nok rettigheder til at uploade filer.';
+$lang['media_update'] = 'Upload ny version';
+$lang['media_restore'] = 'Genskab denne version';
diff --git a/inc/lang/da/mailwrap.html b/inc/lang/da/mailwrap.html
new file mode 100644
index 000000000..0eb2e0bce
--- /dev/null
+++ b/inc/lang/da/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Denne mail blev sendt af DokuWiki på @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/da/resetpwd.txt b/inc/lang/da/resetpwd.txt
new file mode 100644
index 000000000..e0823db17
--- /dev/null
+++ b/inc/lang/da/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Vælg ny adgangskode ======
+
+Indtast venligst en ny adgangskode for din konto på denne wiki. \ No newline at end of file
diff --git a/inc/lang/da/subscr_digest.txt b/inc/lang/da/subscr_digest.txt
new file mode 100644
index 000000000..0aa19ac07
--- /dev/null
+++ b/inc/lang/da/subscr_digest.txt
@@ -0,0 +1,20 @@
+Hej,
+
+Siden @PAGE@ i @TITLE@ wikien er blevet ændret.
+Her er ændringerne:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Gammel Revision: @OLDPAGE@
+Ny Revision: @NEWPAGE@
+
+For at stoppe notifikationer om sideændringer, login på wikien på
+@DOKUWIKIURL@ og besøg så
+@SUBSCRIBE@
+for at afmelde side og/eller navneområde ændringer.
+
+--
+Denne mail blev sendt af DokuWiki på
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/da/subscr_list.txt b/inc/lang/da/subscr_list.txt
new file mode 100644
index 000000000..02a34d255
--- /dev/null
+++ b/inc/lang/da/subscr_list.txt
@@ -0,0 +1,17 @@
+Hej,
+
+Sider i navneområdet @PAGE@ i @TITLE@ wikien er blevet ændret.
+Her er de ændrede sider:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+For at stoppe notifikationer om sideændringer, login på wikien på
+@DOKUWIKIURL@ og besøg så
+@SUBSCRIBE@
+for at afmelde side og/eller navneområde ændringer.
+
+--
+Denne mail blev sendt af DokuWiki på
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/de-informal/install.html b/inc/lang/de-informal/install.html
index dd91c7a78..55239e6db 100644
--- a/inc/lang/de-informal/install.html
+++ b/inc/lang/de-informal/install.html
@@ -12,7 +12,7 @@ manuell auf einer Kommando-Shell oder, falls du DokuWiki bei einem Fremdanbieter
hostest, über FTP oder ein entsprechendes Werkzeug (z.B. cPanel) durchführen.</p>
<p>Dieses Skript hilft dir beim ersten Einrichten des Zugangsschutzes
-(<acronym title="access control list">ACL</acronym>) von DokuWiki, welcher eine
+(<abbr title="access control list">ACL</abbr>) von DokuWiki, welcher eine
Administratoranmeldung und damit Zugang zum Administrationsmenü ermöglicht.
Dort kannst du dann weitere Tätigkeiten wie das Installieren von Plugins, das
Verwalten von Nutzern und das Ändern von Konfigurationseinstellungen durchführen.
diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php
index 3779d6fb3..0558a2a56 100644
--- a/inc/lang/de-informal/lang.php
+++ b/inc/lang/de-informal/lang.php
@@ -16,7 +16,7 @@
* @author Alexander Fischer <tbanus@os-forge.net>
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
- * @author Matthias Schulte <mailinglist@lupo49.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
* @author Christian Wichmann <nospam@zone0.de>
* @author Pierre Corell <info@joomla-praxis.de>
*/
@@ -54,7 +54,7 @@ $lang['btn_backtomedia'] = 'Zurück zur Dateiauswahl';
$lang['btn_subscribe'] = 'Aboverwaltung';
$lang['btn_profile'] = 'Benutzerprofil';
$lang['btn_reset'] = 'Zurücksetzen';
-$lang['btn_resendpwd'] = 'Sende neues Passwort';
+$lang['btn_resendpwd'] = 'Setze neues Passwort';
$lang['btn_draft'] = 'Entwurf bearbeiten';
$lang['btn_recover'] = 'Entwurf wiederherstellen';
$lang['btn_draftdel'] = 'Entwurf löschen';
@@ -91,7 +91,7 @@ $lang['profnoempty'] = 'Es muss ein Name oder eine E-Mail Adresse ange
$lang['profchanged'] = 'Benutzerprofil erfolgreich geändert.';
$lang['pwdforget'] = 'Passwort vergessen? Fordere ein neues an';
$lang['resendna'] = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
-$lang['resendpwd'] = 'Neues Passwort senden für';
+$lang['resendpwd'] = 'Neues Passwort setzen für';
$lang['resendpwdmissing'] = 'Es tut mir Leid, aber du musst alle Felder ausfüllen.';
$lang['resendpwdnouser'] = 'Es tut mir Leid, aber der Benutzer existiert nicht in unserer Datenbank.';
$lang['resendpwdbadauth'] = 'Es tut mir Leid, aber dieser Authentifizierungscode ist ungültig. Stelle sicher, dass du den kompletten Bestätigungslink verwendet haben.';
@@ -104,6 +104,7 @@ $lang['searchmedia_in'] = 'Suche in %s';
$lang['txt_upload'] = 'Datei zum Hochladen auswählen';
$lang['txt_filename'] = 'Hochladen als (optional)';
$lang['txt_overwrt'] = 'Bestehende Datei überschreiben';
+$lang['maxuploadsize'] = 'Max. %s pro Datei-Upload.';
$lang['lockedby'] = 'Momentan gesperrt von';
$lang['lockexpire'] = 'Sperre läuft ab am';
$lang['js']['willexpire'] = 'Die Sperre zur Bearbeitung dieser Seite läuft in einer Minute ab.\nUm Bearbeitungskonflikte zu vermeiden, solltest du sie durch einen Klick auf den Vorschau-Knopf verlängern.';
@@ -168,7 +169,7 @@ $lang['accessdenied'] = 'Du hast keinen Zugriff auf diese Seite';
$lang['mediausage'] = 'Syntax zum Verwenden dieser Datei:';
$lang['mediaview'] = 'Originaldatei öffnen';
$lang['mediaroot'] = 'Wurzel';
-$lang['mediaupload'] = 'Lade hier eine Datei in den momentanen Namensraum hoch. Um Unterordner zu erstellen, stelle diese dem Dateinamen im Feld "Hochladen als" durch Doppelpunkt getrennt voran.';
+$lang['mediaupload'] = 'Lade hier eine Datei in den momentanen Namensraum hoch. Um Unterordner zu erstellen, stelle diese dem Dateinamen durch Doppelpunkt getrennt voran, nachdem Du die Datei ausgewählt hast.';
$lang['mediaextchange'] = 'Dateiendung vom .%s nach .%s geändert!';
$lang['reference'] = 'Verwendung von';
$lang['ref_inuse'] = 'Diese Datei kann nicht gelöscht werden, da sie noch von folgenden Seiten benutzt wird:';
@@ -191,11 +192,16 @@ $lang['lastmod'] = 'Zuletzt geändert';
$lang['by'] = 'von';
$lang['deleted'] = 'gelöscht';
$lang['created'] = 'angelegt';
-$lang['restored'] = 'alte Version wiederhergestellt';
+$lang['restored'] = 'alte Version wiederhergestellt (%s)';
$lang['external_edit'] = 'Externe Bearbeitung';
$lang['summary'] = 'Zusammenfassung';
$lang['noflash'] = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Inhalt anzuzeigen.';
$lang['download'] = 'Download-Teil';
+$lang['tools'] = 'Werkzeuge';
+$lang['user_tools'] = 'Benutzer-Werkzeuge';
+$lang['site_tools'] = 'Webseiten-Werkzeuge';
+$lang['page_tools'] = 'Seiten-Werkzeuge';
+$lang['skip_to_content'] = 'zum Inhalt springen';
$lang['mail_newpage'] = 'Neue Seite:';
$lang['mail_changed'] = 'Seite geändert:';
$lang['mail_subscribe_list'] = 'Seite hat sich im Namespace geändert:';
@@ -248,13 +254,13 @@ $lang['img_keywords'] = 'Schlagwörter';
$lang['img_width'] = 'Breite';
$lang['img_height'] = 'Höhe';
$lang['img_manager'] = 'Im Medien-Manager anzeigen';
-$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementenliste von %s hinzugefügt';
-$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementenliste von %s';
+$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementliste von %s hinzugefügt';
+$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementliste von %s';
$lang['subscr_subscribe_noaddress'] = 'In deinem Account ist keine E-Mail-Adresse hinterlegt. Dadurch kann die Seite nicht abonniert werden';
-$lang['subscr_unsubscribe_success'] = 'Die Seite %s wurde von der Abonnementenliste von %s entfernt';
-$lang['subscr_unsubscribe_error'] = 'Fehler beim Entfernen von %s von der Abonnementenliste von %s';
-$lang['subscr_already_subscribed'] = '%s ist bereits auf der Abonnementenliste von %s';
-$lang['subscr_not_subscribed'] = '%s ist nicht auf der Abonnementenliste von %s';
+$lang['subscr_unsubscribe_success'] = 'Die Seite %s wurde von der Abonnementliste von %s entfernt';
+$lang['subscr_unsubscribe_error'] = 'Fehler beim Entfernen von %s von der Abonnementliste von %s';
+$lang['subscr_already_subscribed'] = '%s ist bereits auf der Abonnementliste von %s';
+$lang['subscr_not_subscribed'] = '%s ist nicht auf der Abonnementliste von %s';
$lang['subscr_m_not_subscribed'] = 'Du hast kein Abonnement von dieser Seite oder dem Namensraum.';
$lang['subscr_m_new_header'] = 'Abonnementen hinzufügen';
$lang['subscr_m_current_header'] = 'Aktive Abonnements';
@@ -266,6 +272,7 @@ $lang['subscr_style_digest'] = 'E-Mail mit zusammengefasster Übersicht der Se
$lang['subscr_style_list'] = 'Auflistung aller geänderten Seiten seit der letzten E-Mail (alle %.2f Tage)';
$lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wende dich an den Admin.';
$lang['authtempfail'] = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wende dich an den Admin.';
+$lang['authpwdexpire'] = 'Dein Passwort läuft in %d Tag(en) ab, du solltest es es bald ändern.';
$lang['i_chooselang'] = 'Wähle deine Sprache';
$lang['i_installer'] = 'DokuWiki-Installation';
$lang['i_wikiname'] = 'Wiki-Name';
@@ -288,21 +295,6 @@ $lang['i_pol1'] = 'Öffentliches Wiki (lesen für alle, schreiben
$lang['i_pol2'] = 'Geschlossenes Wiki (lesen, schreiben, hochladen nur für registrierte Nutzer)';
$lang['i_retry'] = 'Wiederholen';
$lang['i_license'] = 'Bitte wähle die Lizenz aus unter der die Wiki-Inhalte veröffentlicht werden sollen:';
-$lang['mu_intro'] = 'In diesem Bereich kannst du mehrere Dateien gleichzeitig hochladen. Benutze die Schaltfläche "Durchsuchen", um sie der Warteschlange zuzufügen. Betätige die Schaltfläche "Hochladen", um die Übertragung zu starten.';
-$lang['mu_gridname'] = 'Dateiname';
-$lang['mu_gridsize'] = 'Größe';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Namensraum';
-$lang['mu_browse'] = 'Durchsuchen';
-$lang['mu_toobig'] = 'zu groß';
-$lang['mu_ready'] = 'bereit zum Hochladen';
-$lang['mu_done'] = 'fertig';
-$lang['mu_fail'] = 'gescheitert';
-$lang['mu_authfail'] = 'Sitzung abgelaufen';
-$lang['mu_progress'] = '@PCT@% hochgeladen';
-$lang['mu_filetypes'] = 'Erlaubte Dateitypen';
-$lang['mu_info'] = 'Dateien hochgeladen.';
-$lang['mu_lasterr'] = 'Letzter Fehler:';
$lang['recent_global'] = 'Im Moment siehst du die Änderungen im Namensraum <b>%s</b>. Du kannst auch <a href="%s">die Änderungen im gesamten Wiki sehen</a>.';
$lang['years'] = 'vor %d Jahren';
$lang['months'] = 'vor %d Monaten';
@@ -335,4 +327,3 @@ $lang['media_perm_read'] = 'Du besitzt nicht die notwendigen Berechtigunge
$lang['media_perm_upload'] = 'Du besitzt nicht die notwendigen Berechtigungen um Dateien hochzuladen.';
$lang['media_update'] = 'Neue Version hochladen';
$lang['media_restore'] = 'Diese Version wiederherstellen';
-$lang['plugin_install_err'] = 'Plugin nicht korrekt installiert. Plugin-Verzeichnis von \'%s\' nach \'%s\' umbenennen.';
diff --git a/inc/lang/de-informal/mailwrap.html b/inc/lang/de-informal/mailwrap.html
new file mode 100644
index 000000000..420fdf83e
--- /dev/null
+++ b/inc/lang/de-informal/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Diese Mail kommt vom DokuWiki auf @DOKUWIKIURL@.</small>
+</body>
+</html>
diff --git a/inc/lang/de-informal/resetpwd.txt b/inc/lang/de-informal/resetpwd.txt
new file mode 100644
index 000000000..8423bd801
--- /dev/null
+++ b/inc/lang/de-informal/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Neues Passwort setzen ======
+
+Bitte gib ein neues Passwort für deinen Wiki-Zugang ein.
+
diff --git a/inc/lang/de/install.html b/inc/lang/de/install.html
index 15fd1c36b..599eb983b 100644
--- a/inc/lang/de/install.html
+++ b/inc/lang/de/install.html
@@ -12,7 +12,7 @@ manuell auf einer Kommando-Shell oder, falls Sie DokuWiki bei einem Fremdanbiete
hosten, über FTP oder ein entsprechendes Werkzeug (z.B. cPanel) durchführen.</p>
<p>Dieses Skript hilft Ihnen beim ersten Einrichten des Zugangsschutzes
-(<acronym title="access control list">ACL</acronym>) von DokuWiki, welcher eine
+(<abbr title="access control list">ACL</abbr>) von DokuWiki, welcher eine
Administratoranmeldung und damit Zugang zum Administrationsmenu ermöglicht.
Dort können Sie dann weitere Tätigkeiten wie das Installieren von Plugins, das
Verwalten von Nutzern und das Ändern von Konfigurationseinstellungen durchführen.
diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php
index 3bd326c84..410022a3d 100644
--- a/inc/lang/de/lang.php
+++ b/inc/lang/de/lang.php
@@ -56,7 +56,7 @@ $lang['btn_backtomedia'] = 'Zurück zur Dateiauswahl';
$lang['btn_subscribe'] = 'Aboverwaltung';
$lang['btn_profile'] = 'Benutzerprofil';
$lang['btn_reset'] = 'Zurücksetzen';
-$lang['btn_resendpwd'] = 'Sende neues Passwort';
+$lang['btn_resendpwd'] = 'Setze neues Passwort';
$lang['btn_draft'] = 'Entwurf bearbeiten';
$lang['btn_recover'] = 'Entwurf wiederherstellen';
$lang['btn_draftdel'] = 'Entwurf löschen';
@@ -93,7 +93,7 @@ $lang['profnoempty'] = 'Es muss ein Name und eine E-Mail-Adresse angeg
$lang['profchanged'] = 'Benutzerprofil erfolgreich geändert.';
$lang['pwdforget'] = 'Passwort vergessen? Fordere ein neues an';
$lang['resendna'] = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
-$lang['resendpwd'] = 'Neues Passwort senden für';
+$lang['resendpwd'] = 'Neues Passwort setzen für';
$lang['resendpwdmissing'] = 'Es tut mir Leid, aber Sie müssen alle Felder ausfüllen.';
$lang['resendpwdnouser'] = 'Es tut mir Leid, aber der Benutzer existiert nicht in unserer Datenbank.';
$lang['resendpwdbadauth'] = 'Es tut mir Leid, aber dieser Authentifizierungscode ist ungültig. Stellen Sie sicher, dass Sie den kompletten Bestätigungslink verwendet haben.';
@@ -106,6 +106,7 @@ $lang['searchmedia_in'] = 'Suche in %s';
$lang['txt_upload'] = 'Datei zum Hochladen auswählen';
$lang['txt_filename'] = 'Hochladen als (optional)';
$lang['txt_overwrt'] = 'Bestehende Datei überschreiben';
+$lang['maxuploadsize'] = 'Max. %s pro Datei-Upload.';
$lang['lockedby'] = 'Momentan gesperrt von';
$lang['lockexpire'] = 'Sperre läuft ab am';
$lang['js']['willexpire'] = 'Die Sperre zur Bearbeitung dieser Seite läuft in einer Minute ab.\nUm Bearbeitungskonflikte zu vermeiden, sollten Sie sie durch einen Klick auf den Vorschau-Knopf verlängern.';
@@ -170,7 +171,7 @@ $lang['accessdenied'] = 'Es ist Ihnen nicht gestattet, diese Seite zu s
$lang['mediausage'] = 'Syntax zum Verwenden dieser Datei:';
$lang['mediaview'] = 'Originaldatei öffnen';
$lang['mediaroot'] = 'Wurzel';
-$lang['mediaupload'] = 'Laden Sie hier eine Datei in den momentanen Namensraum hoch. Um Unterordner zu erstellen, stellen Sie diese dem Dateinamen im Feld "Hochladen als" durch Doppelpunkt getrennt voran.';
+$lang['mediaupload'] = 'Laden Sie hier eine Datei in den momentanen Namensraum hoch. Um Unterordner zu erstellen, stellen Sie diese dem Dateinamen durch Doppelpunkt getrennt voran, nachdem Sie die Datei ausgewählt haben.';
$lang['mediaextchange'] = 'Dateiendung vom .%s nach .%s geändert!';
$lang['reference'] = 'Verwendung von';
$lang['ref_inuse'] = 'Diese Datei kann nicht gelöscht werden, da sie noch von folgenden Seiten benutzt wird:';
@@ -193,11 +194,16 @@ $lang['lastmod'] = 'Zuletzt geändert';
$lang['by'] = 'von';
$lang['deleted'] = 'gelöscht';
$lang['created'] = 'angelegt';
-$lang['restored'] = 'alte Version wieder hergestellt';
+$lang['restored'] = 'alte Version wieder hergestellt (%s)';
$lang['external_edit'] = 'Externe Bearbeitung';
$lang['summary'] = 'Zusammenfassung';
$lang['noflash'] = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Inhalt anzuzeigen.';
$lang['download'] = 'Schnipsel herunterladen';
+$lang['tools'] = 'Werkzeuge';
+$lang['user_tools'] = 'Benutzer-Werkzeuge';
+$lang['site_tools'] = 'Webseiten-Werkzeuge';
+$lang['page_tools'] = 'Seiten-Werkzeuge';
+$lang['skip_to_content'] = 'zum Inhalt springen';
$lang['mail_newpage'] = 'Neue Seite:';
$lang['mail_changed'] = 'Seite geändert:';
$lang['mail_subscribe_list'] = 'Geänderte Seiten im Namensraum:';
@@ -268,6 +274,7 @@ $lang['subscr_style_digest'] = 'Zusammenfassung der Änderungen für jede ver
$lang['subscr_style_list'] = 'Liste der geänderten Seiten (Alle %.2f Tage)';
$lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wenden Sie sich an den Systembetreuer.';
$lang['authtempfail'] = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wenden Sie sich an den Systembetreuer.';
+$lang['authpwdexpire'] = 'Ihr Passwort läuft in %d Tag(en) ab, Sie sollten es bald ändern.';
$lang['i_chooselang'] = 'Wählen Sie Ihre Sprache';
$lang['i_installer'] = 'DokuWiki Installation';
$lang['i_wikiname'] = 'Wiki-Name';
@@ -290,21 +297,6 @@ $lang['i_pol1'] = 'Öffentliches Wiki (lesen für alle, schreiben
$lang['i_pol2'] = 'Geschlossenes Wiki (lesen, schreiben, hochladen nur für registrierte Nutzer)';
$lang['i_retry'] = 'Wiederholen';
$lang['i_license'] = 'Bitte wählen Sie die Lizenz, unter die Sie Ihre Inhalte stellen möchten:';
-$lang['mu_intro'] = 'In diesem Bereich können Sie mehrere Dateien gleichzeitig hochladen. Benutzen Sie die Schaltfläche "Durchsuchen" um sie der Warteschlange zuzufügen. Betätigen Sie die Schaltfläche "Hochladen" um die Übertragung zu starten.';
-$lang['mu_gridname'] = 'Dateiname';
-$lang['mu_gridsize'] = 'Größe';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Namensraum';
-$lang['mu_browse'] = 'Durchsuchen';
-$lang['mu_toobig'] = 'zu groß';
-$lang['mu_ready'] = 'bereit zum Hochladen';
-$lang['mu_done'] = 'fertig';
-$lang['mu_fail'] = 'gescheitert';
-$lang['mu_authfail'] = 'Sitzung abgelaufen';
-$lang['mu_progress'] = '@PCT@% hochgeladen';
-$lang['mu_filetypes'] = 'Erlaubte Dateitypen';
-$lang['mu_info'] = 'Dateien hochgeladen!';
-$lang['mu_lasterr'] = 'Letzter Fehler:';
$lang['recent_global'] = 'Im Moment sehen Sie die Änderungen im Namensraum <b>%s</b>. Sie können auch <a href="%s">die Änderungen im gesamten Wiki sehen</a>.';
$lang['years'] = 'vor %d Jahren';
$lang['months'] = 'vor %d Monaten';
@@ -337,4 +329,3 @@ $lang['media_perm_read'] = 'Sie besitzen nicht die notwendigen Berechtigun
$lang['media_perm_upload'] = 'Sie besitzen nicht die notwendigen Berechtigungen um Dateien hochzuladen.';
$lang['media_update'] = 'Neue Version hochladen';
$lang['media_restore'] = 'Diese Version wiederherstellen';
-$lang['plugin_install_err'] = 'Plugin nicht korrekt installiert. Plugin-Verzeichnis von \'%s\' nach \'%s\' umbenennen.';
diff --git a/inc/lang/de/mailwrap.html b/inc/lang/de/mailwrap.html
new file mode 100644
index 000000000..420fdf83e
--- /dev/null
+++ b/inc/lang/de/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Diese Mail kommt vom DokuWiki auf @DOKUWIKIURL@.</small>
+</body>
+</html>
diff --git a/inc/lang/de/resetpwd.txt b/inc/lang/de/resetpwd.txt
new file mode 100644
index 000000000..a0a55c67a
--- /dev/null
+++ b/inc/lang/de/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Neues Passwort setzen ======
+
+Bitte geben Sie ein neues Passwort für Ihren Wiki-Zugang ein.
+
diff --git a/inc/lang/el/install.html b/inc/lang/el/install.html
index 9487de7c7..c99a02f33 100644
--- a/inc/lang/el/install.html
+++ b/inc/lang/el/install.html
@@ -1,26 +1,26 @@
<p>Αυτή η σελίδα περιέχει πληροφορίες που βοηθούν στην αρχική εγκατάσταση και
-ρύθμιση της εφαρμογής <a href="http://www.dokuwiki.org/el:dokuwiki">Dokuwiki</a>.
+ρύθμιση της εφαρμογής <a href="http://www.dokuwiki.org/el:dokuwiki">Dokuwiki</a>.
Περισσότερες πληροφορίες υπάρχουν στη <a href="http://www.dokuwiki.org/el:installer">
σελίδα τεκμηρίωσης</a> του οδηγού εγκατάστασης.</p>
-<p>Η εφαρμογή DokuWiki χρησιμοποιεί απλά αρχεία για να αποθηκεύει τις σελίδες
-wiki καθώς και πληροφορίες που σχετίζονται με αυτές (π.χ. εικόνες, καταλόγους
-αναζήτησης, παλαιότερες εκδόσεις σελίδων, κλπ). Για να λειτουργεί σωστά η εφαρμογή
-DokuWiki <strong>πρέπει</strong> να έχει δικαιώματα εγγραφής στους φακέλους που
-φιλοξενούν αυτά τα αρχεία. Ο οδηγός εγκατάστασης δεν έχει την δυνατότητα να
-παραχωρήσει αυτά τα δικαιώματα εγγραφής στους σχετικούς φακέλους. Ο κανονικός
-τρόπος για να γίνει αυτό είναι είτε απευθείας σε περιβάλλον γραμμής εντολών ή,
-εάν δεν έχετε τέτοια πρόσβαση, μέσω FTP ή του πίνακα ελέγχου του περιβάλλοντος
+<p>Η εφαρμογή DokuWiki χρησιμοποιεί απλά αρχεία για να αποθηκεύει τις σελίδες
+wiki καθώς και πληροφορίες που σχετίζονται με αυτές (π.χ. εικόνες, καταλόγους
+αναζήτησης, παλαιότερες εκδόσεις σελίδων, κλπ). Για να λειτουργεί σωστά η εφαρμογή
+DokuWiki <strong>πρέπει</strong> να έχει δικαιώματα εγγραφής στους φακέλους που
+φιλοξενούν αυτά τα αρχεία. Ο οδηγός εγκατάστασης δεν έχει την δυνατότητα να
+παραχωρήσει αυτά τα δικαιώματα εγγραφής στους σχετικούς φακέλους. Ο κανονικός
+τρόπος για να γίνει αυτό είναι είτε απευθείας σε περιβάλλον γραμμής εντολών ή,
+εάν δεν έχετε τέτοια πρόσβαση, μέσω FTP ή του πίνακα ελέγχου του περιβάλλοντος
φιλοξενίας (π.χ. cPanel).</p>
-<p>Ο οδηγός εγκατάστασης θα ρυθμίσει την εφαρμογή DokuWiki ώστε να χρησιμοποιεί
-<acronym title="access control list">ACL</acronym>, με τρόπο ώστε ο διαχειριστής
-να έχει δυνατότητα εισόδου και πρόσβαση στο μενού διαχείρισης της εφαρμογής για
-εγκατάσταση επεκτάσεων, διαχείριση χρηστών, διαχείριση δικαιωμάτων πρόσβασης στις
-διάφορες σελίδες και αλλαγή των ρυθμίσεων. Αυτό δεν είναι απαραίτητο για να
+<p>Ο οδηγός εγκατάστασης θα ρυθμίσει την εφαρμογή DokuWiki ώστε να χρησιμοποιεί
+<abbr title="access control list">ACL</abbr>, με τρόπο ώστε ο διαχειριστής
+να έχει δυνατότητα εισόδου και πρόσβαση στο μενού διαχείρισης της εφαρμογής για
+εγκατάσταση επεκτάσεων, διαχείριση χρηστών, διαχείριση δικαιωμάτων πρόσβασης στις
+διάφορες σελίδες και αλλαγή των ρυθμίσεων. Αυτό δεν είναι απαραίτητο για να
λειτουργήσει η εφαρμογή, αλλά κάνει την διαχείρισή της ευκολότερη.</p>
-<p>Οι έμπειροι χρήστες και οι χρήστες με ειδικές απαιτήσεις μπορούν να επισκεφθούν
+<p>Οι έμπειροι χρήστες και οι χρήστες με ειδικές απαιτήσεις μπορούν να επισκεφθούν
τις σελίδες που περιέχουν λεπτομερείς <a href="http://dokuwiki.org/install">
-οδηγίες εγκατάστασης</a> και <a href="http://dokuwiki.org/config">πληροφορίες
+οδηγίες εγκατάστασης</a> και <a href="http://dokuwiki.org/config">πληροφορίες
για τις ρυθμίσεις</a>.</p> \ No newline at end of file
diff --git a/inc/lang/el/lang.php b/inc/lang/el/lang.php
index 4c334c1de..443a5061d 100644
--- a/inc/lang/el/lang.php
+++ b/inc/lang/el/lang.php
@@ -43,7 +43,6 @@ $lang['btn_backtomedia'] = 'Επιστροφή στην επιλογή α
$lang['btn_subscribe'] = 'Εγγραφή σε λήψη ενημερώσεων σελίδας';
$lang['btn_profile'] = 'Επεξεργασία προφίλ';
$lang['btn_reset'] = 'Ακύρωση';
-$lang['btn_resendpwd'] = 'Αποστολή νέου κωδικού';
$lang['btn_draft'] = 'Επεξεργασία αυτόματα αποθηκευμένης σελίδας';
$lang['btn_recover'] = 'Επαναφορά αυτόματα αποθηκευμένης σελίδας';
$lang['btn_draftdel'] = 'Διαγραφή αυτόματα αποθηκευμένης σελίδας';
@@ -80,7 +79,6 @@ $lang['profnoempty'] = 'Δεν επιτρέπεται κενό όνο
$lang['profchanged'] = 'Το προφίλ χρήστη τροποποιήθηκε επιτυχώς.';
$lang['pwdforget'] = 'Ξεχάσατε το κωδικό σας; Αποκτήστε νέο.';
$lang['resendna'] = 'Αυτό το wiki δεν υποστηρίζει την εκ\' νέου αποστολή κωδικών.';
-$lang['resendpwd'] = 'Αποστολή νέων κωδικών για τον χρήστη';
$lang['resendpwdmissing'] = 'Πρέπει να συμπληρώσετε όλα τα πεδία.';
$lang['resendpwdnouser'] = 'Αυτός ο χρήστης δεν υπάρχει στα αρχεία μας.';
$lang['resendpwdbadauth'] = 'Αυτός ο κωδικός ενεργοποίησης δεν είναι έγκυρος.';
@@ -280,21 +278,6 @@ $lang['i_pol1'] = 'Δημόσιο Wiki (όλοι μπορούν
$lang['i_pol2'] = 'Κλειστό Wiki (μόνο οι εγγεγραμμένοι χρήστες μπορούν να διαβάσουν ή να δημιουργήσουν/τροποποιήσουν σελίδες και να μεταφορτώσουν αρχεία)';
$lang['i_retry'] = 'Νέα προσπάθεια';
$lang['i_license'] = 'Παρακαλώ επιλέξτε την άδεια που θα χρησιμοποιήσετε για την διάθεση του περιεχομένου σας:';
-$lang['mu_intro'] = 'Εδώ μπορείτε να φορτώσετε ταυτόχρονα πολλαπλά αρχεία. Πατήστε στο κουμπί προεπισκόπησης για να τα προσθέσετε στη λίστα. Πατήστε στο κουμπί μεταφόρτωσης όταν έχετε τελειώσει.';
-$lang['mu_gridname'] = 'Όνομα αρχείου';
-$lang['mu_gridsize'] = 'Μέγεθος';
-$lang['mu_gridstat'] = 'Κατάσταση';
-$lang['mu_namespace'] = 'Φάκελος';
-$lang['mu_browse'] = 'Επισκόπηση';
-$lang['mu_toobig'] = 'υπερβολικά μεγάλο';
-$lang['mu_ready'] = 'έτοιμο για φόρτωση';
-$lang['mu_done'] = 'ολοκληρώθηκε';
-$lang['mu_fail'] = 'απέτυχε';
-$lang['mu_authfail'] = 'η συνεδρία έληξε';
-$lang['mu_progress'] = 'φορτώθηκε @PCT@%';
-$lang['mu_filetypes'] = 'Επιτρεπτοί τύποι αρχείων';
-$lang['mu_info'] = 'τα αρχεία ανέβηκαν.';
-$lang['mu_lasterr'] = 'Τελευταίο σφάλμα:';
$lang['recent_global'] = 'Βλέπετε τις αλλαγές εντός του φακέλου <b>%s</b>. Μπορείτε επίσης να <a href="%s">δείτε τις πρόσφατες αλλαγές σε όλο το wiki</a>.';
$lang['years'] = 'πριν %d χρόνια';
$lang['months'] = 'πριν %d μήνες';
@@ -323,4 +306,3 @@ $lang['media_perm_read'] = 'Συγνώμη, δεν έχετε επαρκή
$lang['media_perm_upload'] = 'Συγνώμη, δεν έχετε επαρκή διακαιώματα για να φορτώσετε αυτά τα αρχεία.';
$lang['media_update'] = 'Φόρτωση νέας έκδοσης';
$lang['media_restore'] = 'Επαναφορά αυτή της έκδοσης';
-$lang['plugin_install_err'] = 'Η επέκταση δεν εγκαταστήθηκε σωστά. Μετονομασία φακέλου επεκτάσεων από \'%s\' σε \'%s\'.';
diff --git a/inc/lang/en/install.html b/inc/lang/en/install.html
index 0f94839a6..df2b69935 100644
--- a/inc/lang/en/install.html
+++ b/inc/lang/en/install.html
@@ -12,7 +12,7 @@ normally needs to be done directly on a command shell or if you are using hostin
through FTP or your hosting control panel (e.g. cPanel).</p>
<p>This installer will setup your DokuWiki configuration for
-<acronym title="access control list">ACL</acronym>, which in turn allows administrator
+<abbr title="access control list">ACL</abbr>, which in turn allows administrator
login and access to DokuWiki's admin menu for installing plugins, managing
users, managing access to wiki pages and alteration of configuration settings.
It isn't required for DokuWiki to operate, however it will make Dokuwiki easier
diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php
index 89a7c4d40..0e5a9ac3c 100644
--- a/inc/lang/en/lang.php
+++ b/inc/lang/en/lang.php
@@ -43,7 +43,7 @@ $lang['btn_backtomedia'] = 'Back to Mediafile Selection';
$lang['btn_subscribe'] = 'Manage Subscriptions';
$lang['btn_profile'] = 'Update Profile';
$lang['btn_reset'] = 'Reset';
-$lang['btn_resendpwd'] = 'Send new password';
+$lang['btn_resendpwd'] = 'Set new password';
$lang['btn_draft'] = 'Edit draft';
$lang['btn_recover'] = 'Recover draft';
$lang['btn_draftdel'] = 'Delete draft';
@@ -84,7 +84,7 @@ $lang['profchanged'] = 'User profile successfully updated.';
$lang['pwdforget'] = 'Forgotten your password? Get a new one';
$lang['resendna'] = 'This wiki does not support password resending.';
-$lang['resendpwd'] = 'Send new password for';
+$lang['resendpwd'] = 'Set new password for';
$lang['resendpwdmissing'] = 'Sorry, you must fill in all fields.';
$lang['resendpwdnouser'] = 'Sorry, we can\'t find this user in our database.';
$lang['resendpwdbadauth'] = 'Sorry, this auth code is not valid. Make sure you used the complete confirmation link.';
@@ -99,6 +99,7 @@ $lang['searchmedia_in'] = 'Search in %s';
$lang['txt_upload'] = 'Select file to upload';
$lang['txt_filename'] = 'Upload as (optional)';
$lang['txt_overwrt'] = 'Overwrite existing file';
+$lang['maxuploadsize'] = 'Upload max. %s per file.';
$lang['lockedby'] = 'Currently locked by';
$lang['lockexpire'] = 'Lock expires at';
@@ -166,7 +167,7 @@ $lang['accessdenied'] = 'You are not allowed to view this page.';
$lang['mediausage'] = 'Use the following syntax to reference this file:';
$lang['mediaview'] = 'View original file';
$lang['mediaroot'] = 'root';
-$lang['mediaupload'] = 'Upload a file to the current namespace here. To create subnamespaces, prepend them to your "Upload as" filename separated by colons. Files also can be selected by drag and drop.';
+$lang['mediaupload'] = 'Upload a file to the current namespace here. To create subnamespaces, prepend them to your filename separated by colons after you selected the files. Files can also be selected by drag and drop.';
$lang['mediaextchange'] = 'Filextension changed from .%s to .%s!';
$lang['reference'] = 'References for';
$lang['ref_inuse'] = 'The file can\'t be deleted, because it\'s still used by the following pages:';
@@ -190,11 +191,17 @@ $lang['lastmod'] = 'Last modified';
$lang['by'] = 'by';
$lang['deleted'] = 'removed';
$lang['created'] = 'created';
-$lang['restored'] = 'old revision restored';
+$lang['restored'] = 'old revision restored (%s)';
$lang['external_edit'] = 'external edit';
$lang['summary'] = 'Edit summary';
$lang['noflash'] = 'The <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> is needed to display this content.';
$lang['download'] = 'Download Snippet';
+$lang['tools'] = 'Tools';
+$lang['user_tools'] = 'User Tools';
+$lang['site_tools'] = 'Site Tools';
+$lang['page_tools'] = 'Page Tools';
+$lang['skip_to_content'] = 'skip to content';
+$lang['sidebar'] = 'Sidebar';
$lang['mail_newpage'] = 'page added:';
$lang['mail_changed'] = 'page changed:';
@@ -275,6 +282,7 @@ $lang['subscr_style_list'] = 'list of changed pages since last email (e
/* auth.class language support */
$lang['authmodfailed'] = 'Bad user authentication configuration. Please inform your Wiki Admin.';
$lang['authtempfail'] = 'User authentication is temporarily unavailable. If this situation persists, please inform your Wiki Admin.';
+$lang['authpwdexpire'] = 'Your password will expire in %d days, you should change it soon.';
/* installer strings */
$lang['i_chooselang'] = 'Choose your language';
@@ -304,22 +312,6 @@ $lang['i_pol2'] = 'Closed Wiki (read, write, upload for registere
$lang['i_retry'] = 'Retry';
$lang['i_license'] = 'Please choose the license you want to put your content under:';
-$lang['mu_intro'] = 'Here you can upload multiple files at once. Click the browse button to add them to the queue. Press upload when done.';
-$lang['mu_gridname'] = 'Filename';
-$lang['mu_gridsize'] = 'Size';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Namespace';
-$lang['mu_browse'] = 'Browse';
-$lang['mu_toobig'] = 'too big';
-$lang['mu_ready'] = 'ready for upload';
-$lang['mu_done'] = 'complete';
-$lang['mu_fail'] = 'failed';
-$lang['mu_authfail'] = 'session expired';
-$lang['mu_progress'] = '@PCT@% uploaded';
-$lang['mu_filetypes'] = 'Allowed Filetypes';
-$lang['mu_info'] = 'files uploaded.';
-$lang['mu_lasterr'] = 'Last error:';
-
$lang['recent_global'] = 'You\'re currently watching the changes inside the <b>%s</b> namespace. You can also <a href="%s">view the recent changes of the whole wiki</a>.';
$lang['years'] = '%d years ago';
$lang['months'] = '%d months ago';
@@ -355,6 +347,4 @@ $lang['media_perm_upload'] = 'Sorry, you don\'t have enough rights to upload
$lang['media_update'] = 'Upload new version';
$lang['media_restore'] = 'Restore this version';
-$lang['plugin_install_err'] = "Plugin installed incorrectly. Rename plugin directory '%s' to '%s'.";
-
//Setup VIM: ex: et ts=2 :
diff --git a/inc/lang/en/mailwrap.html b/inc/lang/en/mailwrap.html
new file mode 100644
index 000000000..f9f80fd80
--- /dev/null
+++ b/inc/lang/en/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>This mail was generated by DokuWiki at @DOKUWIKIURL@.</small>
+</body>
+</html>
diff --git a/inc/lang/en/newpage.txt b/inc/lang/en/newpage.txt
index 848d4df09..e78b534a0 100644
--- a/inc/lang/en/newpage.txt
+++ b/inc/lang/en/newpage.txt
@@ -1,4 +1,4 @@
====== This topic does not exist yet ======
-You've followed a link to a topic that doesn't exist yet. If permissions allow, you may create it by using the ''Create this page'' button.
+You've followed a link to a topic that doesn't exist yet. If permissions allow, you may create it by clicking on "Create this page".
diff --git a/inc/lang/en/norev.txt b/inc/lang/en/norev.txt
index 0b21bf3f0..27c336be7 100644
--- a/inc/lang/en/norev.txt
+++ b/inc/lang/en/norev.txt
@@ -1,4 +1,4 @@
====== No such revision ======
-The specified revision doesn't exist. Use the ''Old revisions'' button for a list of old revisions of this document.
+The specified revision doesn't exist. Click on "Old revisions" for a list of old revisions of this document.
diff --git a/inc/lang/en/resetpwd.txt b/inc/lang/en/resetpwd.txt
new file mode 100644
index 000000000..993b48765
--- /dev/null
+++ b/inc/lang/en/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Set new password ======
+
+Please enter a new password for your account in this wiki.
+
diff --git a/inc/lang/en/searchpage.txt b/inc/lang/en/searchpage.txt
index e357d6cdd..50578db3f 100644
--- a/inc/lang/en/searchpage.txt
+++ b/inc/lang/en/searchpage.txt
@@ -1,5 +1,5 @@
====== Search ======
-You can find the results of your search below. If you didn't find what you were looking for, you can create or edit the page named after your query with the appropriate button.
+You can find the results of your search below. If you didn't find what you were looking for, you can create or edit the page named after your query with the appropriate tool.
===== Results =====
diff --git a/inc/lang/en/subscr_digest.txt b/inc/lang/en/subscr_digest.txt
index fac8564bd..35011b6e6 100644
--- a/inc/lang/en/subscr_digest.txt
+++ b/inc/lang/en/subscr_digest.txt
@@ -15,6 +15,6 @@ To cancel the page notifications, log into the wiki at
@SUBSCRIBE@
and unsubscribe page and/or namespace changes.
---
+--
This mail was generated by DokuWiki at
@DOKUWIKIURL@
diff --git a/inc/lang/en/subscr_list.txt b/inc/lang/en/subscr_list.txt
index efe27d866..4c38b9326 100644
--- a/inc/lang/en/subscr_list.txt
+++ b/inc/lang/en/subscr_list.txt
@@ -12,6 +12,6 @@ To cancel the page notifications, log into the wiki at
@SUBSCRIBE@
and unsubscribe page and/or namespace changes.
---
+--
This mail was generated by DokuWiki at
@DOKUWIKIURL@
diff --git a/inc/lang/en/subscr_single.txt b/inc/lang/en/subscr_single.txt
index f2abe6d77..673c4c32a 100644
--- a/inc/lang/en/subscr_single.txt
+++ b/inc/lang/en/subscr_single.txt
@@ -18,6 +18,6 @@ To cancel the page notifications, log into the wiki at
@NEWPAGE@
and unsubscribe page and/or namespace changes.
---
+--
This mail was generated by DokuWiki at
@DOKUWIKIURL@
diff --git a/inc/lang/eo/conflict.txt b/inc/lang/eo/conflict.txt
index 603af39e1..cd0192942 100644
--- a/inc/lang/eo/conflict.txt
+++ b/inc/lang/eo/conflict.txt
@@ -1,5 +1,5 @@
====== Pli nova versio ekzistas ======
-Ekzistas pli nova versio de la dokumento. Tio okazas kiam iu alia uzanto ŝanĝigis enhavon de la dokumento dum vi redaktis ĝin.
+Ekzistas pli nova versio de la dokumento. Tio okazas kiam iu alia uzanto ŝanĝis enhavon de la dokumento dum vi redaktis ĝin.
-Atente esploru distingojn kaj decidu kiun version vi tenigos. Se vi premos '&quot;Konservi'&quot;, do via versio estos konservita. Presonte butonon '&quot;Rezigni&quot; vi tenos la kurantan version.
+Atente esploru distingojn kaj decidu kiun version vi tenos. Se vi premos '"Konservi'", do via versio estos konservita. Presonte butonon '"Rezigni" vi tenos la kurantan version.
diff --git a/inc/lang/eo/denied.txt b/inc/lang/eo/denied.txt
index b35fe0412..3cd6c76bf 100644
--- a/inc/lang/eo/denied.txt
+++ b/inc/lang/eo/denied.txt
@@ -1,4 +1,4 @@
====== Aliro malpermesita ======
-Vi ne havas sufiĉe da rajtoj por rigardi ĉi tiujn paĝojn. Eble vi forgesis identiĝi.
+Vi ne havas sufiĉajn rajtojn rigardi ĉi tiujn paĝojn. Eble vi forgesis identiĝi.
diff --git a/inc/lang/eo/diff.txt b/inc/lang/eo/diff.txt
index ac5474ef1..5829a7db1 100644
--- a/inc/lang/eo/diff.txt
+++ b/inc/lang/eo/diff.txt
@@ -1,4 +1,4 @@
====== Diferencoj ======
-Ĉi tie vi povas ekvidi diferencojn inter la aktuala versio kaj la elektita revizio de la paĝo.
+Ĉi tie vi povas vidi diferencojn inter la aktuala versio kaj la elektita revizio de la paĝo.
diff --git a/inc/lang/eo/draft.txt b/inc/lang/eo/draft.txt
index fa43ecb74..32ddc83f6 100644
--- a/inc/lang/eo/draft.txt
+++ b/inc/lang/eo/draft.txt
@@ -1,5 +1,5 @@
-====== Skiza dosiero estis trovata ======
+====== Skiza dosiero troviĝis ======
-Via lasta sekcio de redakto en tiu ĉi paĝo ne estis korekte kompletita. DokuWiki aŭtomate konservis skizon dum vi laboris, kiun vi nun povas uzi por daŭrigi vian redaktadon. Sube vi povas vidi la datenaron, kiu estis konservata el via lasta sekcio.
+Via lasta sekcio de redakto en tiu ĉi paĝo ne korekte kompletiĝis. DokuWiki aŭtomate konservis skizon dum vi laboris, kiun vi nun povas uzi por daŭrigi vian redaktadon. Sube vi povas vidi la datumaron, kiu konserviĝis el via lasta sekcio.
Bonvolu decidi ĉu vi volas //restarigi// vian perditan redakton, //forigi// la aŭtomate konservitan skizon aŭ //rezigni// pri la redakta procezo.
diff --git a/inc/lang/eo/edit.txt b/inc/lang/eo/edit.txt
index 9239c7fe6..29b3382c5 100644
--- a/inc/lang/eo/edit.txt
+++ b/inc/lang/eo/edit.txt
@@ -1 +1 @@
-Redaktu paĝon kaj poste premu butonon titolitan '&quot;Konservi'&quot;. Bonvolu tralegi la [[vikio:sintakso|vikian sintakson]] por kompreni kiel vi povas krei paĝojn. Bonvolu redakti nur se vi planas **plibonigi** la enhavon de la paĝo. Se vi volas nur testi ion, do bonvolu uzi specialan paĝon: [[vikio:ludejo|ludejo]].
+Redaktu paĝon kaj poste premu butonon titolitan '"Konservi'". Bonvolu tralegi la [[wiki:syntax|vikian sintakson]] por kompreni kiel vi povas krei paĝojn. Bonvolu redakti nur se vi planas **plibonigi** la enhavon de la paĝo. Se vi volas nur testi ion, bonvolu uzi specialan paĝon: [[wiki:playground|ludejo]].
diff --git a/inc/lang/eo/editrev.txt b/inc/lang/eo/editrev.txt
index 4bab50b93..1640baa91 100644
--- a/inc/lang/eo/editrev.txt
+++ b/inc/lang/eo/editrev.txt
@@ -1,2 +1,2 @@
-**Vi laboras kun malnova revizio de la dokumento!** Se vi konservos ĝin, tiel kreiĝos nova kuranta versio kun la sama enhavo.
+**Vi laboras kun malnova revizio de la dokumento!** Se vi konservos ĝin, kreiĝos nova kuranta versio kun la sama enhavo.
----
diff --git a/inc/lang/eo/index.txt b/inc/lang/eo/index.txt
index 4ef720cb2..ac1f32cba 100644
--- a/inc/lang/eo/index.txt
+++ b/inc/lang/eo/index.txt
@@ -1,3 +1,3 @@
====== Enhavo ======
-Tio ĉi estas indekso pri ĉiuj disponeblaj paĝoj ordigitaj laŭ [[doku&gt;namespaces|nomspacoj]]. \ No newline at end of file
+Tio ĉi estas indekso pri ĉiuj disponeblaj paĝoj ordigitaj laŭ [[doku>namespaces|nomspacoj]].
diff --git a/inc/lang/eo/install.html b/inc/lang/eo/install.html
index 9f43ae82e..0fb94e4a9 100644
--- a/inc/lang/eo/install.html
+++ b/inc/lang/eo/install.html
@@ -1,9 +1,9 @@
-&lt;p&gt;Tiu ĉi paĝo helpas en la unua instalo kaj agordado de &lt;a href=&quot;http://dokuwiki.org&quot;&gt;DokuWiki&lt;/a&gt;. Pli da informo pri tiu instalilo estas disponebla en ĝia propra &lt;a href=&quot;http://dokuwiki.org/installer&quot;&gt;dokumentada paĝo&lt;/a&gt;.&lt;/p&gt;
+<p>Tiu ĉi paĝo helpas en la unua instalo kaj agordado de <a href="http://dokuwiki.org">DokuWiki</a>. Pli da informo pri tiu instalilo disponeblas en ĝia propra <a href="http://dokuwiki.org/installer">dokumentada paĝo</a>.</p>
-&lt;p&gt;DokuWiki uzas ordinarajn dosierojn por konservi vikiajn paĝojn kaj aliajn informojn asociitaj al tiuj paĝoj (ekz. bildoj, serĉindeksoj, malnovaj revizioj, ktp). Por bone funkcii, DokuWiki &lt;strong&gt;devas&lt;/strong&gt; havi registran rajton sur la subdosierujoj, kiuj entenas tiujn dosierojn. Tiu ĉi instalilo ne kapablas difini permes-atributojn de dosierujoj. Ordinare, tio devas esti senpere farita de iu komando en konzolo aŭ, se vi abonas retprovizanton, per FTP aŭ kontrola panelo de tiu retprovidanto (ekz. cPanel).</p>
+<p>DokuWiki uzas ordinarajn dosierojn por konservi vikiajn paĝojn kaj aliajn informojn asociitaj al tiuj paĝoj (ekz. bildoj, serĉindeksoj, malnovaj revizioj, ktp). Por bone funkcii, DokuWiki <strong>devas</strong> havi registran rajton sur la subdosierujoj, kiuj entenas tiujn dosierojn. Tiu ĉi instalilo ne kapablas difini permes-atributojn de dosierujoj. Ordinare, tio devas esti senpere farita de iu komando en konzolo aŭ, se vi abonas retprovizanton, per FTP aŭ kontrola panelo de tiu retprovidanto (ekz. cPanel).</p>
-&lt;p&gt;Tiu ĉi instalilo difinos vian DokuWiki-an agordadon por &lt;acronym title=&quot;alir-kontrola listo&quot;&gt;ACL&lt;/acronym&gt;, kiu ebligas al administranto identiĝi kaj aliri taŭgan interfacon por instali kromaĵojn, administri uzantojn kaj alireblon al vikipaĝoj, kaj difini agordojn ĝeneralajn.
-Ĝi ne estas nepra por ke DokuWiki funkciu, tamen ĝi multe faciligos administradon.&lt;/p&gt;
+<p>Tiu ĉi instalilo difinos vian DokuWiki-an agordadon por <abbr title="alir-kontrola listo">ACL</abbr>, kiu ebligas al administranto identiĝi kaj aliri taŭgan interfacon por instali kromaĵojn, administri uzantojn kaj alireblon al vikipaĝoj, kaj difini agordojn ĝeneralajn.
+Ĝi ne estas nepra por ke DokuWiki funkciu, tamen ĝi multe faciligos administradon.</p>
-&lt;p&gt;Spertuloj aŭ uzantoj kiuj bezonas specialajn agordrimedojn devus uzi tiujn ligilojn por havi pli detalojn pri &lt;a href=&quot;http://dokuwiki.org/install&quot;&gt;instaladaj instrukcioj&lt;/a&gt;
-kaj &lt;a href=&quot;http://dokuwiki.org/config&quot;&gt;agordadaj difinoj&lt;/a&gt;.&lt;/p&gt; \ No newline at end of file
+<p>Spertuloj aŭ uzantoj kiuj bezonas specialajn agordrimedojn uzu tiujn ligilojn por havi pli detalojn pri <a href="http://dokuwiki.org/install">instaladaj instrukcioj</a>
+kaj <a href="http://dokuwiki.org/config">agordadaj difinoj</a>.</p>
diff --git a/inc/lang/eo/lang.php b/inc/lang/eo/lang.php
index 01772726f..5a0b0245f 100644
--- a/inc/lang/eo/lang.php
+++ b/inc/lang/eo/lang.php
@@ -9,7 +9,7 @@
* @author Felipe Castro <fefcas@gmail.com>
* @author Robert Bogenschneider <robog@gmx.de>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Robert BOGENSCHNEIDER <bogi@UEA.org>
+ * @author Robert Bogenschneider <bogi@uea.org>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -69,39 +69,40 @@ $lang['draftdate'] = 'Lasta konservo de la skizo:';
$lang['nosecedit'] = 'La paĝo ŝanĝiĝis intertempe, sekcio-informo estis malĝisdata, tial la tuta paĝo estas reŝargita.';
$lang['regmissing'] = 'Pardonu, vi devas plenigi ĉiujn kampojn.';
$lang['reguexists'] = 'Pardonu, ĉi tiu uzanto-nomo jam ekzistas.';
-$lang['regsuccess'] = 'La uzanto estas kreita kaj la pasvorto estis elsendita per retpoŝto.';
-$lang['regsuccess2'] = 'La uzanto estas kreita.';
+$lang['regsuccess'] = 'La uzanto kreiĝis kaj la pasvorto sendiĝis per retpoŝto.';
+$lang['regsuccess2'] = 'La uzanto kreiĝis.';
$lang['regmailfail'] = 'Ŝajne okazis eraro dum elsendo de la pasvorto. Bonvolu informi administranton pri tio!';
-$lang['regbadmail'] = 'Entajpita retpoŝta adreso ne ŝajnas valida. Se vi pensas, ke tio estas eraro, kontaktu la administranton.';
+$lang['regbadmail'] = 'Entajpita retpoŝta adreso ŝajnas ne valida. Se vi pensas, ke tio estas eraro, kontaktu la administranton.';
$lang['regbadpass'] = 'La du pasvortoj ne samas, bonvolu provi refoje.';
$lang['regpwmail'] = 'Via DokuWiki-pasvorto';
$lang['reghere'] = 'Se vi ne havas konton, vi povas akiri ĝin';
$lang['profna'] = 'Tiu ĉi vikio ne ebligas modifon en la profiloj.';
$lang['profnochange'] = 'Neniu ŝanĝo, nenio farinda.';
-$lang['profnoempty'] = 'Malplena nomo aŭ retadreso ne estas permesataj.';
-$lang['profchanged'] = 'La profilo de la uzanto estas sukcese ĝisdatigita.';
+$lang['profnoempty'] = 'Malplena nomo aŭ retadreso ne estas permesata.';
+$lang['profchanged'] = 'La profilo de la uzanto sukcese ĝisdatiĝis.';
$lang['pwdforget'] = 'Ĉu vi forgesis vian pasvorton? Prenu novan';
$lang['resendna'] = 'Tiu ĉi vikio ne ebligas resendon de la pasvortoj.';
$lang['resendpwd'] = 'Sendi novan pasvorton al';
$lang['resendpwdmissing'] = 'Pardonu, vi devas plenigi ĉiujn kampojn.';
-$lang['resendpwdnouser'] = 'Pardonu, ni ne trovas tiun uzanton en nia datenbazo.';
+$lang['resendpwdnouser'] = 'Pardonu, tiu uzanto ne troveblas en nia datumbazo.';
$lang['resendpwdbadauth'] = 'Pardonu, tiu aŭtentiga kodo ne validas. Certiĝu, ke vi uzis la kompletan konfirmigan ligilon.';
-$lang['resendpwdconfirm'] = 'Konfirmiga ligilo estas sendita per retpoŝto.';
-$lang['resendpwdsuccess'] = 'Via nova pasvorto estas sendita per retpoŝto.';
+$lang['resendpwdconfirm'] = 'Konfirmiga ligilo sendiĝis per retpoŝto.';
+$lang['resendpwdsuccess'] = 'Via nova pasvorto sendiĝis per retpoŝto.';
$lang['license'] = 'Krom kie rekte indikite, enhavo de tiu ĉi vikio estas publikigita laŭ la jena permesilo:';
$lang['licenseok'] = 'Rimarku: redaktante tiun ĉi paĝon vi konsentas publikigi vian enhavon laŭ la jena permesilo:';
$lang['searchmedia'] = 'Serĉi dosiernomon:';
$lang['searchmedia_in'] = 'Serĉi en %s';
-$lang['txt_upload'] = 'Elektu dosieron por alŝuto';
+$lang['txt_upload'] = 'Elektu dosieron por alŝuti';
$lang['txt_filename'] = 'Alŝuti kiel (laŭvole)';
$lang['txt_overwrt'] = 'Anstataŭigi ekzistantan dosieron';
+$lang['maxuploadsize'] = 'Alŝuto maks. %s po dosiero.';
$lang['lockedby'] = 'Nune ŝlosita de';
$lang['lockexpire'] = 'Ŝlosado ĉesos en';
-$lang['js']['willexpire'] = 'Vi povos redakti ĉi tiun paĝon post unu minuto.\nSe vi volas nuligi tempkontrolon de la ŝlosado, do premu butonon "Antaŭrigardi".';
+$lang['js']['willexpire'] = 'Vi povos redakti ĉi tiun paĝon post unu minuto.\nSe vi volas nuligi tempokontrolon de la ŝlosado, premu la butonon "Antaŭrigardi".';
$lang['js']['notsavedyet'] = 'Ne konservitaj modifoj perdiĝos.
Ĉu vi certe volas daŭrigi la procezon?';
$lang['js']['searchmedia'] = 'Serĉi dosierojn';
-$lang['js']['keepopen'] = 'Tenu la fenestron malfermata dum elekto';
+$lang['js']['keepopen'] = 'Tenu la fenestron malferma dum elekto';
$lang['js']['hidedetails'] = 'Kaŝi detalojn';
$lang['js']['mediatitle'] = 'Ligilaj agordoj';
$lang['js']['mediadisplay'] = 'Ligila tipo';
@@ -124,10 +125,10 @@ $lang['js']['medialeft'] = 'Meti la bildon maldekstren.';
$lang['js']['mediaright'] = 'Meti la bildon dekstren.';
$lang['js']['mediacenter'] = 'Meti la bildon mezen.';
$lang['js']['medianoalign'] = 'Ne uzi poziciigon.';
-$lang['js']['nosmblinks'] = 'Tio ĉi nur funkcias en la Vindozaĉa "Microsoft Internet Explorer".\nVi ankoraŭ povas kopii kaj almeti la ligilon.';
+$lang['js']['nosmblinks'] = 'Tio ĉi nur funkcias en "Microsoft Internet Explorer".\nVi ankoraŭ povas kopii kaj almeti la ligilon.';
$lang['js']['linkwiz'] = 'Ligil-Asistanto';
$lang['js']['linkto'] = 'Ligilo al:';
-$lang['js']['del_confirm'] = 'Ĉu vere forigi elektitajn ero(j)n?';
+$lang['js']['del_confirm'] = 'Ĉu vere forigi elektita(j)n ero(j)n?';
$lang['js']['restore_confirm'] = 'Ĉu vere restarigi ĉi tiun version?';
$lang['js']['media_diff'] = 'Rigardu la diferencojn:';
$lang['js']['media_diff_both'] = 'Flankon apud flanko';
@@ -143,27 +144,27 @@ $lang['rssfailed'] = 'Okazis eraro dum ricevado de la novaĵ-fluo: '
$lang['nothingfound'] = 'Ankoraŭ nenio troviĝas tie ĉi.';
$lang['mediaselect'] = 'Elekto de aŭdvidaĵa dosiero';
$lang['fileupload'] = 'Alŝuto de aŭdvidaĵa dosiero';
-$lang['uploadsucc'] = 'Alŝuto estis sukcesa';
-$lang['uploadfail'] = 'Alŝuto estis malsukcesa. Eble ĉu estas problemoj pro permes-atributoj?';
+$lang['uploadsucc'] = 'Alŝuto sukcesis';
+$lang['uploadfail'] = 'Alŝuto malsukcesis. Ĉu eble estas problemoj pro permes-atributoj?';
$lang['uploadwrong'] = 'Rifuzita alŝuto. Tiu ĉi dosiersufikso estas malpermesata!';
$lang['uploadexist'] = 'La dosiero jam ekzistas. Nenio estas farita.';
$lang['uploadbadcontent'] = 'La alŝutita enhavo ne kongruas al la sufikso %s.';
-$lang['uploadspam'] = 'La alŝutaĵo estis blokita de kontraŭspama vortlisto.';
-$lang['uploadxss'] = 'La alŝutajo estis blokita pro ebla malica enhavo.';
+$lang['uploadspam'] = 'La alŝutaĵo blokiĝis de kontraŭspama vortlisto.';
+$lang['uploadxss'] = 'La alŝutajo blokiĝis pro ebla malica enhavo.';
$lang['uploadsize'] = 'La alŝutita dosiero estis tro granda. (maks. %s)';
-$lang['deletesucc'] = 'La dosiero "%s" estas forigita.';
+$lang['deletesucc'] = 'La dosiero "%s" forigiĝis.';
$lang['deletefail'] = '"%s" ne povis esti forigita - kontrolu permes-atributojn.';
-$lang['mediainuse'] = 'La dosiero "%s" ne estis forigita - ĝi ankoraŭ estas uzata.';
+$lang['mediainuse'] = 'La dosiero "%s" ne forigiĝis - ĝi ankoraŭ estas uzata.';
$lang['namespaces'] = 'Nomspacoj';
$lang['mediafiles'] = 'Disponeblaj dosieroj';
$lang['accessdenied'] = 'Vi ne rajtas vidi tiun paĝon.';
-$lang['mediausage'] = 'Uzu la jenan sintakson por referenci tiun ĉi dosieron:';
+$lang['mediausage'] = 'Uzu jenan sintakson por referenci tiun ĉi dosieron:';
$lang['mediaview'] = 'Rigardi originalan dosieron';
$lang['mediaroot'] = 'ĉefo (root)';
-$lang['mediaupload'] = 'Alŝutu dosieron al la kuranta nomspaco tien ĉi. Por krei subnomspacojn, antaŭmetu ilin al via "Alŝuti kiel" dosiernomo, apartigante per dupunktoj (:).';
+$lang['mediaupload'] = 'Alŝutu dosieron al la kuranta nomspaco tien ĉi. Por krei subnomspacojn, antaŭmetu ilin al via "Alŝuti kiel" dosiernomo, disigigante per dupunktoj (:).';
$lang['mediaextchange'] = 'La dosiersufikso ŝanĝis de .%s al .%s!';
$lang['reference'] = 'Referencoj por';
-$lang['ref_inuse'] = 'La dosiero ne povas esti forigita, ĉar ĝi ankoraŭ estas uzata de la jenaj paĝoj:';
+$lang['ref_inuse'] = 'La dosiero ne povas esti forigita, ĉar ĝi ankoraŭ estas uzata de jenaj paĝoj:';
$lang['ref_hidden'] = 'Kelkaj referencoj estas en paĝoj, kiujn vi ne rajtas legi';
$lang['hits'] = 'Trafoj';
$lang['quickhits'] = 'Trafoj trovitaj en paĝnomoj';
@@ -186,8 +187,14 @@ $lang['created'] = 'kreita';
$lang['restored'] = 'malnova revizio restarigita';
$lang['external_edit'] = 'ekstera redakto';
$lang['summary'] = 'Bulteno de ŝanĝoj';
-$lang['noflash'] = 'La <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> estas bezonata por montrigi tiun ĉi enhavon.';
+$lang['noflash'] = 'La <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> necesas por montri tiun ĉi enhavon.';
$lang['download'] = 'Elŝuti eltiraĵon';
+$lang['tools'] = 'Iloj';
+$lang['user_tools'] = 'Uzantaj iloj';
+$lang['site_tools'] = 'Retejaj iloj';
+$lang['page_tools'] = 'Paĝaj iloj';
+$lang['skip_to_content'] = 'al la enhavo';
+$lang['sidebar'] = 'Flanka strio';
$lang['mail_newpage'] = 'paĝo aldonita:';
$lang['mail_changed'] = 'paĝo modifita:';
$lang['mail_subscribe_list'] = 'ŝanĝitaj paĝoj en nomspaco:';
@@ -223,10 +230,10 @@ $lang['qb_smileys'] = 'Ridetuloj';
$lang['qb_chars'] = 'Specialaj signaĵoj';
$lang['upperns'] = 'saltu al la parenca nomspaco';
$lang['admin_register'] = 'Aldoni novan uzanton';
-$lang['metaedit'] = 'Redakti metadatenaron';
-$lang['metasaveerr'] = 'La konservo de metadatenaro malsukcesis';
-$lang['metasaveok'] = 'La metadatenaro estis konservita';
-$lang['img_backto'] = 'Retroiri al';
+$lang['metaedit'] = 'Redakti metadatumaron';
+$lang['metasaveerr'] = 'La konservo de metadatumaro malsukcesis';
+$lang['metasaveok'] = 'La metadatumaro konserviĝis';
+$lang['img_backto'] = 'Iri reen al';
$lang['img_title'] = 'Titolo';
$lang['img_caption'] = 'Priskribo';
$lang['img_date'] = 'Dato';
@@ -239,7 +246,7 @@ $lang['img_camera'] = 'Kamerao';
$lang['img_keywords'] = 'Ŝlosilvortoj';
$lang['img_width'] = 'Larĝeco';
$lang['img_height'] = 'Alteco';
-$lang['img_manager'] = 'Rigardi en media-administrilo';
+$lang['img_manager'] = 'Rigardi en aŭdvidaĵ-administrilo';
$lang['subscr_subscribe_success'] = 'Aldonis %s al la abonlisto por %s';
$lang['subscr_subscribe_error'] = 'Eraro dum aldono de %s al la abonlisto por %s';
$lang['subscr_subscribe_noaddress'] = 'Ne estas adreso ligita al via ensaluto, ne eblas aldoni vin al la abonlisto';
@@ -258,6 +265,7 @@ $lang['subscr_style_digest'] = 'resuma retpoŝtaĵo de ŝanĝoj por ĉiu paĝo
$lang['subscr_style_list'] = 'listo de ŝanĝitaj paĝoj ekde la lasta retpoŝtaĵo (je %.2f tagoj)';
$lang['authmodfailed'] = 'Malbona agordo por identigi la uzanton. Bonvolu informi la administranton de la vikio.';
$lang['authtempfail'] = 'La identigo de via uzantonomo estas intertempe maldisponebla. Se tiu ĉi situacio daŭros, bonvolu informi la adminstranton de la vikio.';
+$lang['authpwdexpire'] = 'Via pasvorto malvalidos post %d tagoj, prefere ŝanĝu ĝin baldaũ.';
$lang['i_chooselang'] = 'Elektu vian lingvon';
$lang['i_installer'] = 'Instalilo de DokuWiki';
$lang['i_wikiname'] = 'Nomo de la vikio';
@@ -273,7 +281,7 @@ $lang['i_confexists'] = '<code>%s</code> jam ekzistas';
$lang['i_writeerr'] = 'Ne eblas krei "<code>%s</code>". Vi bezonas kontroli la permesojn de la dosier(uj)oj kaj mem krej la dosieron.';
$lang['i_badhash'] = 'dokuwiki.php ne estas rekonebla aŭ ĝi estas modifita (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - malvalida aŭ malplena valoro';
-$lang['i_success'] = 'La agordado estas sukcese kompletita. Vi povas forigi la dosieron nun. Pluiru al <a href="doku.php">via nova DokuWiki</a>.';
+$lang['i_success'] = 'La agordado sukcese kompletiĝis. Vi povas forigi la dosieron nun. Pluiru al <a href="doku.php">via nova DokuWiki</a>.';
$lang['i_failure'] = 'Kelkaj eraroj okazis dum la konservo de la agordaj dosieroj. Vi devas senpere korekti ilin antaŭ ol vi povos uzi <a href="doku.php">vian novan DokuWiki-on</a>. ';
$lang['i_policy'] = 'Komenca ACL-a agordo';
$lang['i_pol0'] = 'Malferma Vikio (legi, skribi, alŝuti povas ĉiuj)';
@@ -281,21 +289,6 @@ $lang['i_pol1'] = 'Publika Vikio (legi povas ĉiuj, skribi kaj al
$lang['i_pol2'] = 'Ferma Vikio (legi, skribi, alŝuti nur povas registritaj uzantoj)';
$lang['i_retry'] = 'Reprovi';
$lang['i_license'] = 'Bonvolu elekti la permesilon, sub kiun vi volas meti vian enhavon:';
-$lang['mu_intro'] = 'Ĉi tie vi povas alŝuti plurajn dosierojn multope. Klaku la esplor-butonon por aldoni ilin al la vico. Premu alŝuti kiam prete.';
-$lang['mu_gridname'] = 'Dosiernomo';
-$lang['mu_gridsize'] = 'Grandeco';
-$lang['mu_gridstat'] = 'Stato';
-$lang['mu_namespace'] = 'Nomspaco';
-$lang['mu_browse'] = 'Esplori';
-$lang['mu_toobig'] = 'tro granda';
-$lang['mu_ready'] = 'preta por alŝuti';
-$lang['mu_done'] = 'plenumite';
-$lang['mu_fail'] = 'malsukcesinte';
-$lang['mu_authfail'] = 'sekcio tro longdaŭris';
-$lang['mu_progress'] = '@PCT@% alŝutite';
-$lang['mu_filetypes'] = 'Permesitaj dosiertipoj';
-$lang['mu_info'] = 'alŝutitaj dosieroj.';
-$lang['mu_lasterr'] = 'Lasta eraro:';
$lang['recent_global'] = 'Vi nun rigardas la ŝanĝojn ene de la nomspaco <b>%s</b>. Vi povas ankaŭ <a href="%s">vidi la freŝajn ŝanĝojn de la tuta vikio</a>.';
$lang['years'] = 'antaŭ %d jaroj';
$lang['months'] = 'antaŭ %d monatoj';
@@ -304,7 +297,7 @@ $lang['days'] = 'antaŭ %d tagoj';
$lang['hours'] = 'antaŭ %d horoj';
$lang['minutes'] = 'antaŭ %d minutoj';
$lang['seconds'] = 'antaŭ %d sekundoj';
-$lang['wordblock'] = 'Via ŝanĝo ne estis savita, ĉar ĝi enhavas blokitan tekston (spamon).';
+$lang['wordblock'] = 'Via ŝanĝo ne konserviĝis, ĉar ĝi enhavas blokitan tekston (spamon).';
$lang['media_uploadtab'] = 'Alŝuto';
$lang['media_searchtab'] = 'Serĉo';
$lang['media_file'] = 'Dosiero';
diff --git a/inc/lang/eo/locked.txt b/inc/lang/eo/locked.txt
index 68963da75..abdc05916 100644
--- a/inc/lang/eo/locked.txt
+++ b/inc/lang/eo/locked.txt
@@ -1,3 +1,3 @@
====== La paĝo estas ŝlosita ======
-Tiu ĉi paĝo nun estas blokita pro redaktado de iu alia uzanto. Bonvole atendu ke ŝi/li finu redakti aŭ ke la ŝlosada tempolimo finiĝu.
+Tiu ĉi paĝo nun blokiĝis pro redaktado de iu alia uzanto. Bonvolu atendi ke ŝi/li finu redakti aŭ ke la ŝlosada tempolimo finiĝu.
diff --git a/inc/lang/eo/mailtext.txt b/inc/lang/eo/mailtext.txt
index b2cb3b49d..2765301ea 100644
--- a/inc/lang/eo/mailtext.txt
+++ b/inc/lang/eo/mailtext.txt
@@ -1,4 +1,4 @@
-Paĝo en via DokuVikio estis ŝanĝita aŭ aldonita. Jen detaloj:
+Paĝo en via DokuVikio ŝanĝiĝis aŭ aldoniĝis. Jen detaloj:
Dato: @DATE@
Foliumilo: @BROWSER@
@@ -7,10 +7,9 @@ RetNodo: @HOSTNAME@
Antaŭa revizio: @OLDPAGE@
Nova revizio: @NEWPAGE@
Bulteno de ŝanĝoj: @SUMMARY@
-Uzulo: @USER@
+Uzanto: @USER@
@DIFF@
--
-Tiu ĉi mesaĝo estis kreita de DokuWiki, kiu lokiĝas tie:
-@DOKUWIKIURL@ \ No newline at end of file
+Tiu ĉi mesaĝo kreiĝis de DokuWiki, kiu lokiĝas ĉe @DOKUWIKIURL@
diff --git a/inc/lang/eo/mailwrap.html b/inc/lang/eo/mailwrap.html
new file mode 100644
index 000000000..9e92a00f7
--- /dev/null
+++ b/inc/lang/eo/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Tiu retpoŝtaĵo venas de DokuWiki ĉe @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/eo/newpage.txt b/inc/lang/eo/newpage.txt
index 486f61f5a..53ab6209d 100644
--- a/inc/lang/eo/newpage.txt
+++ b/inc/lang/eo/newpage.txt
@@ -1,4 +1,4 @@
====== Ĉi tiu paĝo ankoraŭ ne ekzistas ======
-Vi sekvis ligilon, kiu kondukas al artikolo ankoraŭ ne ekzistanta. Se vi rajtas, tiel vi povas krei tiun ĉi paĝon ekpremante la butonon &quot;Krei paĝon&quot;.
+Vi sekvis ligilon, kiu kondukas al artikolo ankoraŭ ne ekzistanta. Se vi rajtas, tiam vi povas krei tiun ĉi paĝon premante la butonon "Krei paĝon".
diff --git a/inc/lang/eo/norev.txt b/inc/lang/eo/norev.txt
index dc44d194b..e951a551b 100644
--- a/inc/lang/eo/norev.txt
+++ b/inc/lang/eo/norev.txt
@@ -1,3 +1,3 @@
====== Tiu revizio ne ekzistas ======
-La elektita revizio ne ekzistas. Premu butonon &quot;Malnovaj revizioj&quot; por vidi liston de malnovaj revizioj de la dokumento. \ No newline at end of file
+La elektita revizio ne ekzistas. Premu butonon "Malnovaj revizioj" por vidi liston de malnovaj revizioj de la dokumento.
diff --git a/inc/lang/eo/password.txt b/inc/lang/eo/password.txt
index ef744059e..6dc42a9de 100644
--- a/inc/lang/eo/password.txt
+++ b/inc/lang/eo/password.txt
@@ -1,10 +1,9 @@
-Saluton @FULLNAME@!
+Saluton, @FULLNAME@!
-Jen via uzantodatenoj por @TITLE@ ĉe @DOKUWIKIURL@
+Jen viaj uzantodatumoj por @TITLE@ ĉe @DOKUWIKIURL@
Ensalutnomo: @LOGIN@
Pasvorto: @PASSWORD@
--
-Tiu ĉi mesaĝo estis kreita de DokuWiki ĉe
-@DOKUWIKIURL@
+Tiu ĉi mesaĝo kreiĝis de DokuWiki ĉe @DOKUWIKIURL@
diff --git a/inc/lang/eo/preview.txt b/inc/lang/eo/preview.txt
index ac2e75d00..b3faef69e 100644
--- a/inc/lang/eo/preview.txt
+++ b/inc/lang/eo/preview.txt
@@ -1,3 +1,3 @@
====== Antaŭrigardo ======
-Tiu ĉi estas antaŭrigardo de redaktita teksto. Memoru: ĝi ankoraŭ **ne estas konservita**! \ No newline at end of file
+Tiu ĉi estas antaŭrigardo de redaktita teksto. Memoru: ĝi ankoraŭ **ne konserviĝis**!
diff --git a/inc/lang/eo/pwconfirm.txt b/inc/lang/eo/pwconfirm.txt
index f227752b1..5abc3d13e 100644
--- a/inc/lang/eo/pwconfirm.txt
+++ b/inc/lang/eo/pwconfirm.txt
@@ -1,14 +1,13 @@
-Saluton @FULLNAME@!
+Saluton, @FULLNAME@!
Iu petis novan pasvorton por via @TITLE@
ensalutnomo ĉe @DOKUWIKIURL@
-Se ne estas vi, kiu petis tion, do preterlasu tiun ĉi mesaĝon.
+Se ne vi petis tion, ignoru tiun ĉi mesaĝon.
-Por konfirmi, ke la peto estis vere via, bonvolu musklaki la jenan ligilon.
+Por konfirmi, ke la peto estis vere via, bonvolu musklaki jenan ligilon:
@CONFIRM@
--
-Tiu ĉi mesaĝo estis kreita de DokuWiki ĉe
-@DOKUWIKIURL@ \ No newline at end of file
+Tiu ĉi mesaĝo kreiĝis de DokuWiki ĉe @DOKUWIKIURL@
diff --git a/inc/lang/eo/read.txt b/inc/lang/eo/read.txt
index 734eb1654..b8c642f43 100644
--- a/inc/lang/eo/read.txt
+++ b/inc/lang/eo/read.txt
@@ -1,2 +1,2 @@
-Tiu ĉi paĝo estas disponigata nur por legado (vi ne povas redakti ĝin). Sciigu administranton, se vi opinias ke tio estas ne ĝusta malpermeso.
+Tiu ĉi paĝo disponiĝas nur por legado (vi ne povas redakti ĝin). Sciigu administranton, se vi opinias ke tio estas falsa malpermeso.
diff --git a/inc/lang/eo/recent.txt b/inc/lang/eo/recent.txt
index ffd9936e2..2454ea630 100644
--- a/inc/lang/eo/recent.txt
+++ b/inc/lang/eo/recent.txt
@@ -1,3 +1,3 @@
====== Freŝaj Ŝanĝoj ======
-La jenaj paĝoj estis ŝanĝitaj antaŭ nelonga tempo. \ No newline at end of file
+Jenaj paĝoj ŝanĝiĝis antaŭ nelonge:
diff --git a/inc/lang/eo/register.txt b/inc/lang/eo/register.txt
index 57d5ca1f4..10b303d3b 100644
--- a/inc/lang/eo/register.txt
+++ b/inc/lang/eo/register.txt
@@ -1,4 +1,4 @@
====== Registriĝi ======
-Entajpu necesajn informojn por enregistriĝi. Certiĝu ke via retpoŝta adreso estas vera ĉar ni sendos al ĝi vian pasvorton.
+Entajpu necesajn informojn por enregistriĝi. Certiĝu ke via retpoŝta adreso estas vera, ĉar ni sendos al ĝi vian pasvorton.
diff --git a/inc/lang/eo/registermail.txt b/inc/lang/eo/registermail.txt
index 8b9ea8501..9ef6013c0 100644
--- a/inc/lang/eo/registermail.txt
+++ b/inc/lang/eo/registermail.txt
@@ -1,4 +1,4 @@
-Nova uzanto estis registrata. Jen la detaloj:
+Nova uzanto registriĝis. Jen la detaloj:
Uzantonomo: @NEWUSER@
Kompleta nomo: @NEWNAME@
@@ -10,5 +10,4 @@ IP-Adreso: @IPADDRESS@
Provizanto: @HOSTNAME@
--
-Tiu ĉi mesaĝo estis kreita de DokuWiki ĉe
-@DOKUWIKIURL@ \ No newline at end of file
+Tiu ĉi mesaĝo kreiĝis de DokuWiki ĉe @DOKUWIKIURL@
diff --git a/inc/lang/eo/resendpwd.txt b/inc/lang/eo/resendpwd.txt
index 57b4b0408..556477a07 100644
--- a/inc/lang/eo/resendpwd.txt
+++ b/inc/lang/eo/resendpwd.txt
@@ -1,3 +1,3 @@
====== Sendi novan pasvorton ======
-Bonvolu meti vian uzantonomon en la suban formularon petante novan pasvorton por via aliĝo en tiu ĉi vikio. Konfirma ligilo estos sendata al via registrita retadreso.
+Bonvolu meti vian uzantonomon en la suban formularon petante novan pasvorton por via aliĝo en tiu ĉi vikio. Konfirma ligilo sendaiĝos al via registrita retadreso.
diff --git a/inc/lang/eo/resetpwd.txt b/inc/lang/eo/resetpwd.txt
new file mode 100644
index 000000000..442a7ac4e
--- /dev/null
+++ b/inc/lang/eo/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Difini novan pasvorton ======
+
+
+Bonvolu indiki novan pasvorton por via konto en tiu ĉi vikio. \ No newline at end of file
diff --git a/inc/lang/eo/showrev.txt b/inc/lang/eo/showrev.txt
index e3a8a1747..3ece4f2fb 100644
--- a/inc/lang/eo/showrev.txt
+++ b/inc/lang/eo/showrev.txt
@@ -1,2 +1,2 @@
-**Tiu estas malnova revizio de la dokumento**. Klaku sur titolo por ricevi kurantan version.
+**Tiu estas malnova revizio de la dokumento**. Klaku sur titolon por ricevi kurantan version.
----
diff --git a/inc/lang/eo/stopwords.txt b/inc/lang/eo/stopwords.txt
index 38757ae04..d27c569a2 100644
--- a/inc/lang/eo/stopwords.txt
+++ b/inc/lang/eo/stopwords.txt
@@ -1,6 +1,6 @@
# Jen listo de vortoj, kiujn la indeksilo ignoras, unu vorton po linio
# Kiam vi modifas la dosieron, estu certa ke vi uzas UNIX-stilajn linifinaĵojn (unuopa novlinio)
-# Ne enmetu vortojn malpli longajn ol 3 literoj - tiuj ĉiukaze estas ignorataj
+# Ne enmetu vortojn malpli longajn ol 3 literoj - tiuj ĉiukaze ignoriĝas
pri
estas
kaj
@@ -17,4 +17,4 @@ kio
kiam
kie
kiu
-www \ No newline at end of file
+www
diff --git a/inc/lang/eo/subscr_digest.txt b/inc/lang/eo/subscr_digest.txt
index d6bc69887..42fc79ad1 100644
--- a/inc/lang/eo/subscr_digest.txt
+++ b/inc/lang/eo/subscr_digest.txt
@@ -16,5 +16,4 @@ Por nuligi la paĝinformojn, ensalutu la vikion ĉe
kaj malabonu la paĝajn kaj/aŭ nomspacajn ŝanĝojn.
--
-Tiu retpoŝtaĵo kreiĝis de DokuWiki ĉe
-@DOKUWIKIURL@ \ No newline at end of file
+Tiu retpoŝtaĵo kreiĝis de DokuWiki ĉe @DOKUWIKIURL@
diff --git a/inc/lang/eo/subscr_list.txt b/inc/lang/eo/subscr_list.txt
index 175e3f3d2..1957e85e0 100644
--- a/inc/lang/eo/subscr_list.txt
+++ b/inc/lang/eo/subscr_list.txt
@@ -13,5 +13,4 @@ Por nuligi la paĝinformojn, ensalutu la vikion ĉe
kaj malabonu la paĝajn kaj/aŭ nomspacajn ŝanĝojn.
--
-Tiu retpoŝtaĵo kreiĝis de DokuWiki ĉe
-@DOKUWIKIURL@ \ No newline at end of file
+Tiu retpoŝtaĵo kreiĝis de DokuWiki ĉe @DOKUWIKIURL@
diff --git a/inc/lang/eo/subscr_single.txt b/inc/lang/eo/subscr_single.txt
index d51c5ca15..431fd0251 100644
--- a/inc/lang/eo/subscr_single.txt
+++ b/inc/lang/eo/subscr_single.txt
@@ -19,5 +19,4 @@ Por nuligi la paĝinformojn, ensalutu la vikion ĉe
kaj malabonu la paĝajn kaj/aŭ nomspacajn ŝanĝojn.
--
-Tiu retpoŝtaĵo kreiĝis de DokuWiki ĉe
-@DOKUWIKIURL@ \ No newline at end of file
+Tiu retpoŝtaĵo kreiĝis de DokuWiki ĉe @DOKUWIKIURL@
diff --git a/inc/lang/eo/updateprofile.txt b/inc/lang/eo/updateprofile.txt
index a3de0c840..4b52ff20a 100644
--- a/inc/lang/eo/updateprofile.txt
+++ b/inc/lang/eo/updateprofile.txt
@@ -1,3 +1,3 @@
====== Ĝisdatigi vian profilon ======
-Vi nur bezonas kompletigi tiujn kampojn, kiujn vi deziras ŝanĝi. Vi ne povas ŝanĝi vian uzantonomon. \ No newline at end of file
+Vi nur kompletigu tiujn kampojn, kiujn vi deziras ŝanĝi. Vi ne povas ŝanĝi vian uzantonomon.
diff --git a/inc/lang/eo/uploadmail.txt b/inc/lang/eo/uploadmail.txt
index e7c327a60..1cb48ade6 100644
--- a/inc/lang/eo/uploadmail.txt
+++ b/inc/lang/eo/uploadmail.txt
@@ -1,4 +1,4 @@
-Dosiero estis alŝutita al via DokuVikio. Jen detaloj:
+Dosiero alŝutiĝis al via DokuVikio. Jen detaloj:
Dosiero: @MEDIA@
Dato: @DATE@
@@ -10,5 +10,4 @@ Dosier-tipo: @MIME@
Uzanto: @USER@
--
-Tiu ĉi mesaĝo estis kreita de DokuWiki ĉe
-@DOKUWIKIURL@ \ No newline at end of file
+Tiu ĉi mesaĝo kreiĝis de DokuWiki ĉe @DOKUWIKIURL@
diff --git a/inc/lang/es/install.html b/inc/lang/es/install.html
index c16d4c47c..94680bbba 100644
--- a/inc/lang/es/install.html
+++ b/inc/lang/es/install.html
@@ -1,12 +1,12 @@
-<p>Esta página lo asiste en la primera vez que instala y configura
+<p>Esta página lo asiste en la primera vez que instala y configura
<a href="http://dokuwiki.org">Dokuwiki</a>.
-Más información sobre este instalador está disponible en la
+Más información sobre este instalador está disponible en la
<a href="http://dokuwiki.org/installer">página de documentación</a>.
</p>
<p>DokuWiki usa ficheros comunes para el almacenamiento de las páginas del wiki y otra información asociada a esas páginas (por ejemplo, imágenes, índices de archivos, revisiones viejas, etc). Para funcionar correctamente DokuWiki <strong>debe</strong> tener permisos de escritura en los directorios que contienen esos ficheros. Este instalador no es capaz de establecer permisos en directorios. Normalmente eso debe ser hecho a través de una consola de comandos o si usted usa servicios de hosting a través de FTP o el panel de control brindado por su hosting (e.g. cPanel).</p>
-<p>Este instalador configurará una <acronym title="lista de control de acceso">ACL</acronym>, que a su vez permite el acceso al administrador y acceso a los menúes de administración para instalación
+<p>Este instalador configurará una <abbr title="lista de control de acceso">ACL</abbr>, que a su vez permite el acceso al administrador y acceso a los menúes de administración para instalación
de plugins, administración de usuarios, administración de permisos para las páginas wiki y modificación de la configuración. A pesar que no es necesario para que DokuWiki funcione, hará que sea más fácil la administración.</p>
<p>Usuarios experimentados o usuarios con requerimientos especiales deben usar estos enlaces para detalles concernientes a
diff --git a/inc/lang/es/lang.php b/inc/lang/es/lang.php
index 5164c3243..95b1af43e 100644
--- a/inc/lang/es/lang.php
+++ b/inc/lang/es/lang.php
@@ -26,6 +26,7 @@
* @author emezeta <emezeta@infoprimo.com>
* @author Oscar Ciudad <oscar@jacho.net>
* @author Ruben Figols <ruben.figols@gmail.com>
+ * @author Gerardo Zamudio <gerardo@gerardozamudio.net>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -56,12 +57,12 @@ $lang['btn_admin'] = 'Administrar';
$lang['btn_update'] = 'Actualizar';
$lang['btn_delete'] = 'Borrar';
$lang['btn_back'] = 'Atrás';
-$lang['btn_backlink'] = 'Enlaces anteriores';
+$lang['btn_backlink'] = 'Enlaces a esta página';
$lang['btn_backtomedia'] = 'Volver a la selección de archivos multimedia';
$lang['btn_subscribe'] = 'Suscribirse a cambios de la página';
$lang['btn_profile'] = 'Actualizar perfil';
$lang['btn_reset'] = 'Restablecer';
-$lang['btn_resendpwd'] = 'Enviar nueva contraseña';
+$lang['btn_resendpwd'] = 'Establecer nueva contraseña';
$lang['btn_draft'] = 'Editar borrador';
$lang['btn_recover'] = 'Recuperar borrador';
$lang['btn_draftdel'] = 'Eliminar borrador';
@@ -98,7 +99,7 @@ $lang['profnoempty'] = 'No se permite que el nombre o la dirección de
$lang['profchanged'] = 'Se actualizó correctamente el perfil del usuario.';
$lang['pwdforget'] = '¿Has olvidado tu contraseña? Consigue una nueva';
$lang['resendna'] = 'Este wiki no brinda la posibilidad de reenvío de contraseña.';
-$lang['resendpwd'] = 'Enviar una nueva contraseña para';
+$lang['resendpwd'] = 'Establecer nueva contraseña para';
$lang['resendpwdmissing'] = 'Lo siento, debes completar todos los campos.';
$lang['resendpwdnouser'] = 'Lo siento, no se encuentra este usuario en nuestra base de datos.';
$lang['resendpwdbadauth'] = 'Lo siento, este código de autenticación no es válido. Asegúrate de haber usado el enlace de confirmación entero.';
@@ -111,6 +112,7 @@ $lang['searchmedia_in'] = 'Buscar en %s';
$lang['txt_upload'] = 'Selecciona el archivo a subir';
$lang['txt_filename'] = 'Subir como (opcional)';
$lang['txt_overwrt'] = 'Sobreescribir archivo existente';
+$lang['maxuploadsize'] = 'Peso máximo de %s por archivo';
$lang['lockedby'] = 'Actualmente bloqueado por';
$lang['lockexpire'] = 'El bloqueo expira en';
$lang['js']['willexpire'] = 'El bloqueo para la edición de esta página expira en un minuto.\nPAra prevenir conflictos uso el botón Previsualizar para restaurar el contador de bloqueo.';
@@ -205,6 +207,12 @@ $lang['external_edit'] = 'editor externo';
$lang['summary'] = 'Resumen de la edición';
$lang['noflash'] = 'Para mostrar este contenido es necesario el <a href="http://www.adobe.com/products/flashplayer/">Plugin Adobe Flash</a>.';
$lang['download'] = 'Descargar trozo de código fuente';
+$lang['tools'] = 'Herramientas';
+$lang['user_tools'] = 'Herramientas de usuario';
+$lang['site_tools'] = 'Herramientas del sitio';
+$lang['page_tools'] = 'Herramientas de la página';
+$lang['skip_to_content'] = 'Saltar a contenido';
+$lang['sidebar'] = 'Barra lateral';
$lang['mail_newpage'] = 'página añadida:';
$lang['mail_changed'] = 'página cambiada:';
$lang['mail_subscribe_list'] = 'páginas cambiadas en el espacio de nombre:';
@@ -275,6 +283,7 @@ $lang['subscr_style_digest'] = 'recopilar correo de cambios por cada página';
$lang['subscr_style_list'] = 'lista de páginas con cambios desde el último correo';
$lang['authmodfailed'] = 'Está mal configurada la autenticación de usuarios. Por favor, avisa al administrador del wiki.';
$lang['authtempfail'] = 'La autenticación de usuarios no está disponible temporalmente. Si esta situación persiste, por favor avisa al administrador del wiki.';
+$lang['authpwdexpire'] = 'Su contraseña caducara en %d días, debería cambiarla lo antes posible';
$lang['i_chooselang'] = 'Elija su idioma';
$lang['i_installer'] = 'Instalador de DokuWiki';
$lang['i_wikiname'] = 'Nombre del wiki';
@@ -282,9 +291,9 @@ $lang['i_enableacl'] = 'Habilitar ACL (recomendado) (ACL: lista de con
$lang['i_superuser'] = 'Super-usuario';
$lang['i_problems'] = 'El instalador encontró algunos problemas, se muestran abajo. No se puede continuar la instalación hasta que usted no los corrija.';
$lang['i_modified'] = 'Por razones de seguridad este script sólo funcionará con una instalación nueva y no modificada de Dokuwiki. Usted debe extraer nuevamente los ficheros del paquete bajado, o bien consultar las <a href="http://dokuwiki.org/install">instrucciones de instalación de Dokuwiki</a> completas.';
-$lang['i_funcna'] = 'La función de PHP <code>%s</code> no está disponible. Tal vez su proveedor de hosting la ha deshabilitado por alguna razón?';
+$lang['i_funcna'] = 'La función de PHP <code>%s</code> no está disponible. ¿Tal vez su proveedor de hosting la ha deshabilitado por alguna razón?';
$lang['i_phpver'] = 'Su versión de PHP <code>%s</code> es menor que la necesaria <code>%s</code>. Es necesario que actualice su instalación de PHP.';
-$lang['i_permfail'] = 'DokuWili no puede escribir <code>%s</code>. Es necesario establecer correctamente los permisos de este directorio!';
+$lang['i_permfail'] = 'DokuWili no puede escribir <code>%s</code>. ¡Es necesario establecer correctamente los permisos de este directorio!';
$lang['i_confexists'] = '<code>%s</code> ya existe';
$lang['i_writeerr'] = 'Imposible crear <code>%s</code>. Se necesita que usted controle los permisos del fichero/directorio y que cree el fichero manualmente.';
$lang['i_badhash'] = 'dokuwiki.php no reconocido o modificado (hash=<code>%s</code>)';
@@ -297,21 +306,6 @@ $lang['i_pol1'] = 'Wiki público (leer para todos, escribir y sub
$lang['i_pol2'] = 'Wiki cerrado (leer, escribir y subir archivos para usuarios registrados únicamente)';
$lang['i_retry'] = 'Reintentar';
$lang['i_license'] = 'Por favor escoja una licencia bajo la que publicar su contenido:';
-$lang['mu_intro'] = 'Puedes subir varios archivos a la vez desde aquí. Pulsa el botón del navegador para agregarlos a la cola. Pulsa "subir archivo" para proceder.';
-$lang['mu_gridname'] = 'Nombre de archivo';
-$lang['mu_gridsize'] = 'Tamaño';
-$lang['mu_gridstat'] = 'Estado';
-$lang['mu_namespace'] = 'Espacio de nombres';
-$lang['mu_browse'] = 'Buscar';
-$lang['mu_toobig'] = 'demasiado grande';
-$lang['mu_ready'] = 'listo para subir';
-$lang['mu_done'] = 'completado';
-$lang['mu_fail'] = 'falló';
-$lang['mu_authfail'] = 'la sesión caducó';
-$lang['mu_progress'] = '@PCT@% transferido';
-$lang['mu_filetypes'] = 'Tipos de archivos permitidos';
-$lang['mu_info'] = 'Archivos subidos:';
-$lang['mu_lasterr'] = 'Último error:';
$lang['recent_global'] = 'Actualmente estás viendo los cambios dentro del namespace <b>%s</b>. También puedes <a href="%s">ver los cambios recientes en el wiki completo</a>.';
$lang['years'] = '%d años atrás';
$lang['months'] = '%d meses atrás';
@@ -344,4 +338,3 @@ $lang['media_perm_read'] = 'Disculpa, no tienes los permisos necesarios pa
$lang['media_perm_upload'] = 'Disculpa, no tienes los permisos necesarios para cargar ficheros.';
$lang['media_update'] = 'Actualizar nueva versión';
$lang['media_restore'] = 'Restaurar esta versión';
-$lang['plugin_install_err'] = 'Plugin instalado incorrectamente. Renombra el directorio de plugins \'%s\' to \'%s\'.';
diff --git a/inc/lang/es/mailwrap.html b/inc/lang/es/mailwrap.html
new file mode 100644
index 000000000..3cf255f79
--- /dev/null
+++ b/inc/lang/es/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Este correo ha sido generado por DokuWiki desde @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/es/resetpwd.txt b/inc/lang/es/resetpwd.txt
new file mode 100644
index 000000000..6fade9598
--- /dev/null
+++ b/inc/lang/es/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Establecer nueva contraseña ======
+
+Favor de introducir una nueva contraseña para su cuenta en este wiki \ No newline at end of file
diff --git a/inc/lang/et/lang.php b/inc/lang/et/lang.php
index 6cd2f437d..5e5caa1c8 100644
--- a/inc/lang/et/lang.php
+++ b/inc/lang/et/lang.php
@@ -43,7 +43,6 @@ $lang['btn_backtomedia'] = 'Tagasi faili valikusse';
$lang['btn_subscribe'] = 'Jälgi seda lehte (teated meilile)';
$lang['btn_profile'] = 'Minu info';
$lang['btn_reset'] = 'Taasta';
-$lang['btn_resendpwd'] = 'Saada uus parool';
$lang['btn_draft'] = 'Toimeta mustandit';
$lang['btn_recover'] = 'Taata mustand';
$lang['btn_draftdel'] = 'Kustuta mustand';
@@ -79,7 +78,6 @@ $lang['profnoempty'] = 'Tühi nimi ega meiliaadress pole lubatud.';
$lang['profchanged'] = 'Kasutaja info edukalt muudetud';
$lang['pwdforget'] = 'Unustasid parooli? Tee uus';
$lang['resendna'] = 'See wiki ei toeta parooli taassaatmist.';
-$lang['resendpwd'] = 'Saada uus parool';
$lang['resendpwdmissing'] = 'Khmm... Sa pead täitma kõik väljad.';
$lang['resendpwdnouser'] = 'Aga sellist kasutajat ei ole.';
$lang['resendpwdbadauth'] = 'See autentimiskood ei ole õige. Kontrolli, et kopeerisid terve lingi.';
@@ -232,12 +230,3 @@ $lang['i_pol0'] = 'Avatud (lugemine, kirjutamine ja üleslaadimin
$lang['i_pol1'] = 'Avalikuks lugemiseks (lugeda saavad kõik, kirjutada ja üles laadida vaid registreeritud kasutajad)';
$lang['i_pol2'] = 'Suletud (kõik õigused, kaasaarvatud lugemine on lubatud vaid registreeritud kasutajatele)';
$lang['i_retry'] = 'Proovi uuesti';
-$lang['mu_gridname'] = 'Failinimi';
-$lang['mu_gridsize'] = 'Suurus';
-$lang['mu_gridstat'] = 'Staatus';
-$lang['mu_browse'] = 'Sirvi';
-$lang['mu_toobig'] = 'liiga suur';
-$lang['mu_ready'] = 'valmis üleslaadimiseks';
-$lang['mu_done'] = 'valmis';
-$lang['mu_fail'] = 'ebaõnnestus';
-$lang['mu_lasterr'] = 'Viimane viga:';
diff --git a/inc/lang/eu/install.html b/inc/lang/eu/install.html
index 81f1efd95..ce2eeb364 100644
--- a/inc/lang/eu/install.html
+++ b/inc/lang/eu/install.html
@@ -2,8 +2,8 @@
<p>DokuWikik fitxategi arruntak erabiltzen ditu wiki orriak eta orri horiekin erlazionatutako informazioa (adb. irudiak, bilaketa indizeak, azken berrikuspenak, etab.) gordetzeko. Modu egokian funtziona dezan, DokuWikik idazketa baimena <strong>behar</strong> du fitxategi horiek gordetzen dituzten direktorioetan. Instalatzaile hau ez da gai direktorio baimenak ezartzeko. Hori normalean komando bidez egin beharra dago, edo hosting bat erabiliz gero, FTP bidez edo hosting-aren kontrol panel bidez (adb. cPanel).</p>
-<p>Instalatzaile honek zure DokiWikiren konfigurazioa ezarriko du
-<acronym title="atzipen kontrol lista">AKL</acronym>rentzat, zeinak administratzaileei ahalbidetzen dien saioa hasi eta DokuWikiren administrazio menua atzitzea plugin-ak instalatu, erabiltzaileak kudeatu, wiki orrietara atzipenak kudeatu eta konfigurazio aukerak aldatzeko. Hau ez da beharrezkoa DokuWikirentzat funtziona ahal dezan, baina DokuWiki administratzeko errazagoa egingo du.</p>
+<p>Instalatzaile honek zure DokiWikiren konfigurazioa ezarriko du
+<abbr title="atzipen kontrol lista">AKL</abbr>rentzat, zeinak administratzaileei ahalbidetzen dien saioa hasi eta DokuWikiren administrazio menua atzitzea plugin-ak instalatu, erabiltzaileak kudeatu, wiki orrietara atzipenak kudeatu eta konfigurazio aukerak aldatzeko. Hau ez da beharrezkoa DokuWikirentzat funtziona ahal dezan, baina DokuWiki administratzeko errazagoa egingo du.</p>
-<p>Esperientziadun erabiltzaileek edo ezarpen behar bereziak dituzten erabiltzaileek honako estekak erabili beharko lituzkete xehetasun gehiago lortzeko
+<p>Esperientziadun erabiltzaileek edo ezarpen behar bereziak dituzten erabiltzaileek honako estekak erabili beharko lituzkete xehetasun gehiago lortzeko
<a href="http://dokuwiki.org/install">instalazio azalpenen</a> inguruan eta <a href="http://dokuwiki.org/config">konfigurazio ezarpenen</a> inguruan.</p> \ No newline at end of file
diff --git a/inc/lang/eu/lang.php b/inc/lang/eu/lang.php
index d02f281c3..f7a517fe4 100644
--- a/inc/lang/eu/lang.php
+++ b/inc/lang/eu/lang.php
@@ -40,7 +40,6 @@ $lang['btn_backtomedia'] = 'Atzera Multimedia Fitxategiaren Aukeraketara';
$lang['btn_subscribe'] = 'Harpidetu Orri Aldaketetara';
$lang['btn_profile'] = 'Eguneratu Profila ';
$lang['btn_reset'] = 'Aldaketak Desegin';
-$lang['btn_resendpwd'] = 'Pasahitz berria bidali';
$lang['btn_draft'] = 'Editatu zirriborroa';
$lang['btn_recover'] = 'Berreskuratu zirriborroa';
$lang['btn_draftdel'] = 'Ezabatu zirriborroa';
@@ -75,7 +74,6 @@ $lang['profnoempty'] = 'Izen edota e-posta hutsa ez dago onartua.';
$lang['profchanged'] = 'Erabiltzaile profila arrakastaz eguneratua.';
$lang['pwdforget'] = 'Pasahitza ahaztu duzu? Eskuratu berri bat';
$lang['resendna'] = 'Wiki honek ez du pasahitz berbidalketa onartzen.';
-$lang['resendpwd'] = 'Bidali pasahitz berria honentzat:';
$lang['resendpwdmissing'] = 'Barkatu, eremu guztiak bete behar dituzu.';
$lang['resendpwdnouser'] = 'Barkatu, ez dugu erabiltzaile hori datu-basean aurkitzen';
$lang['resendpwdbadauth'] = 'Barkatu, kautotze kodea ez da baliozkoa. Ziurtatu baieztapen esteka osoa erabili duzula.';
@@ -256,21 +254,6 @@ $lang['i_pol1'] = 'Wiki Publikoa (irakurri edonorentzat, idatzi e
$lang['i_pol2'] = 'Wiki Itxia (irakurri, idatzi, fitxategiak igo erregistratutako erabiltzaileentzat soilik)';
$lang['i_retry'] = 'Berriz saiatu';
$lang['i_license'] = 'Mesedez, aukeratu zein lizentzipean ezarri nahi duzun zure edukia:';
-$lang['mu_intro'] = 'Hemen hainbat fitxategi aldi berean igo ditzakezu. Egin klik nabigazio botoian hauek ilarara gehitzeko. Sakatu igo botoia prest egotean.';
-$lang['mu_gridname'] = 'Fitxategi izena';
-$lang['mu_gridsize'] = 'Tamaina';
-$lang['mu_gridstat'] = 'Egoera';
-$lang['mu_namespace'] = 'Izen-espazioa';
-$lang['mu_browse'] = 'Nabigatu';
-$lang['mu_toobig'] = 'handiegia';
-$lang['mu_ready'] = 'igotzeko prest';
-$lang['mu_done'] = 'amaitua';
-$lang['mu_fail'] = 'hutsegitea';
-$lang['mu_authfail'] = 'saioa iraungita';
-$lang['mu_progress'] = '@PCT@% igota';
-$lang['mu_filetypes'] = 'Onartutako Fitxategi Motak';
-$lang['mu_info'] = 'igotako fitxategiak.';
-$lang['mu_lasterr'] = 'Azken errorea;';
$lang['recent_global'] = 'Une honetan <b>%s</b> izen-espazioaren barneko aldaketak ikusten ari zara.<a href="%s"> Wiki osoaren azken aldaketak</a> ere ikusi ditzakezu.';
$lang['years'] = 'duela %d urte';
$lang['months'] = 'duela %d hilabete';
diff --git a/inc/lang/fa/install.html b/inc/lang/fa/install.html
index b76e9443f..7960f9cc8 100644
--- a/inc/lang/fa/install.html
+++ b/inc/lang/fa/install.html
@@ -4,7 +4,7 @@
<p>DokuWiki از فایل‌های معمولی برای ذخیره‌ی صفحات ویکی و اطلاعات مربوط به آن‌ها استفاده می‌کند (مثل تصاویر، فهرست‌های جستجو، نگارش‌های پیشین و غیره). برای نصب موفقیت آمیز DokuWiki
<strong>باید</strong> دسترسی نوشتن برای شاخه‌های این فایل‌ها داشته باشید. این کار باید توسط دستورات خط فرمان و یا دسترسی FTP و یا از طریق کنترل پنل خدمات میزبانی‌تون انجام شود. </p>
-<p>این برنامه <acronym title="access control list">دسترسی‌ها</acronym>ی DokuWiki را برای شما تنظیم خواهد کرد،
+<p>این برنامه دسترسی‌های DokuWiki را برای شما تنظیم خواهد کرد،
به این معنی که مدیر سیستم می‌تواند به صفحه‌ی مدیران وارد شود، افزونه نصب کنید، کاربران را مدیریت کند، دسترسی به صفحات ویکی را مدیریت کند و یا تنظیمات را تغییر دهد.</p>
<p>برای اطلاعات بیشتر در مورد نصب می‌توانید از این پیوند‌ها استفاده کنید
diff --git a/inc/lang/fa/lang.php b/inc/lang/fa/lang.php
index ac14ce07a..33a89a631 100644
--- a/inc/lang/fa/lang.php
+++ b/inc/lang/fa/lang.php
@@ -12,6 +12,7 @@
* @author Mohsen Firoozmandan <info@mambolearn.com>
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'rtl';
@@ -47,12 +48,14 @@ $lang['btn_backtomedia'] = 'بازگشت به انتخاب فایل';
$lang['btn_subscribe'] = 'عضویت در تغییرات صفحه';
$lang['btn_profile'] = 'به روز رسانی پروفایل';
$lang['btn_reset'] = 'بازنشاندن';
-$lang['btn_resendpwd'] = 'یک گذرواژه‌ی جدید برای شما فرستاده شود';
+$lang['btn_resendpwd'] = 'تعیین کلمه عبور جدید';
$lang['btn_draft'] = 'ویرایش پیش‌نویس';
$lang['btn_recover'] = 'بازیابی پیش‌نویس';
$lang['btn_draftdel'] = 'حذف پیش‌نویس';
$lang['btn_revert'] = 'بازیابی';
$lang['btn_register'] = 'یک حساب جدید بسازید';
+$lang['btn_apply'] = 'اعمال کن';
+$lang['btn_media'] = 'مدیریت محتوای چند رسانه ای';
$lang['loggedinas'] = 'به عنوان کاربر روبرو وارد شده‌اید:';
$lang['user'] = 'نام کاربری:';
$lang['pass'] = 'گذرواژه‌ی شما';
@@ -82,7 +85,7 @@ $lang['profnoempty'] = 'نام و آدرس ایمیل باید پر ش
$lang['profchanged'] = 'پروفایل کاربر با موفقیت به روز شد';
$lang['pwdforget'] = 'گذرواژه‌ی خود را فراموش کرده‌اید؟ جدید دریافت کنید';
$lang['resendna'] = 'این ویکی ارسال مجدد گذرواژه را پشتیبانی نمی‌کند';
-$lang['resendpwd'] = 'گذرواژه‌ی جدید ارسال شد';
+$lang['resendpwd'] = 'تعیین کلمه عبور جدید برای ';
$lang['resendpwdmissing'] = 'متاسفم، شما باید تمام قسمت‌ها را پر کنید';
$lang['resendpwdnouser'] = 'متاسفم، ما نتوانستیم این نام کاربری را در بانک خود پیدا کنیم';
$lang['resendpwdbadauth'] = 'متاسفم، کد شناسایی معتبر نیست. از صحت لینک تاییدیه اطمینان حاصل کنید.';
@@ -95,9 +98,10 @@ $lang['searchmedia_in'] = 'جستجو در %s';
$lang['txt_upload'] = 'فایل را برای ارسال انتخاب کنید';
$lang['txt_filename'] = 'ارسال به صورت (اختیاری)';
$lang['txt_overwrt'] = 'بر روی فایل موجود بنویس';
+$lang['maxuploadsize'] = 'حداکثر %s برای هر فایل مجاز است.';
$lang['lockedby'] = 'در حال حاضر قفل شده است';
$lang['lockexpire'] = 'قفل منقضی شده است';
-$lang['js']['willexpire'] = 'حالت قفل شما مدتی است منقضی شده است \n برای جلوگیری از تداخل دکمه‌ی پیش‌نمایش را برای صفر شدن ساعت قفل بزنید.';
+$lang['js']['willexpire'] = 'حالت قفل شما مدتی است منقضی شده است \n برای جلوگیری از تداخل دکمه‌ی پیش‌نمایش را برای صفر شدن ساعت قفل بزنید.';
$lang['js']['notsavedyet'] = 'تغییرات ذخیره شده از بین خواهد رفت.
می‌خواهید ادامه دهید؟';
$lang['js']['searchmedia'] = 'جستجو برای فایل';
@@ -129,6 +133,17 @@ $lang['js']['nosmblinks'] = 'پیوند به Windows share فقط در ای
$lang['js']['linkwiz'] = 'ویزارد پیوند';
$lang['js']['linkto'] = 'پیوند به:';
$lang['js']['del_confirm'] = 'واقعن تصمیم به حذف این موارد دارید؟';
+$lang['js']['restore_confirm'] = 'آیا مطمئن هستید که می خواهید این نسخه را بازیابی کنید؟';
+$lang['js']['media_diff'] = 'تفاوت ها را ببینید : ';
+$lang['js']['media_diff_both'] = 'پهلو به پهلو';
+$lang['js']['media_diff_opacity'] = 'درخشش از';
+$lang['js']['media_diff_portions'] = 'کش رفتن';
+$lang['js']['media_select'] = 'انتخاب فایل -یا فایلها- ...';
+$lang['js']['media_upload_btn'] = 'آپلود';
+$lang['js']['media_done_btn'] = 'انجام شد';
+$lang['js']['media_drop'] = 'فایل ها را در اینجا قرار دهید تا آپلود شود';
+$lang['js']['media_cancel'] = 'حذف';
+$lang['js']['media_overwrt'] = 'جاینوشت فایل های موجود';
$lang['rssfailed'] = 'بروز خطا در هنگام واکشی';
$lang['nothingfound'] = 'چیزی پیدا نشد';
$lang['mediaselect'] = 'فایل‌ها';
@@ -178,11 +193,20 @@ $lang['external_edit'] = 'ویرایش خارجی';
$lang['summary'] = 'پیش‌نمایش';
$lang['noflash'] = 'برای نمایش محتویات <a href="http://www.adobe.com/products/flashplayer/">افزونه‌ی فلش</a> مورد نیاز است.';
$lang['download'] = 'دیافت فایل منقطع گردید';
+$lang['tools'] = 'ابزار';
+$lang['user_tools'] = 'ابزار کاربر';
+$lang['site_tools'] = 'ابزار سایت';
+$lang['page_tools'] = 'ابزار صفحه';
+$lang['skip_to_content'] = 'پرش به محتوا';
$lang['mail_newpage'] = 'صفحه اضافه شد:';
$lang['mail_changed'] = 'صفحه تغییر داده شد:';
$lang['mail_subscribe_list'] = 'صفحات تغییر داده شده در فضای‌نام';
$lang['mail_new_user'] = 'کاربر جدید:';
$lang['mail_upload'] = 'فایل ارسال شده:';
+$lang['changes_type'] = 'دیدن تغییرات';
+$lang['pages_changes'] = 'صفحات';
+$lang['media_changes'] = 'فایلهای چند رسانه ای';
+$lang['both_changes'] = 'صفحات و فایل های چند رسانه ای هر دو';
$lang['qb_bold'] = 'متن پُررنگ';
$lang['qb_italic'] = 'متن ایتالیک';
$lang['qb_underl'] = 'متن زیرخط‌دار';
@@ -223,6 +247,9 @@ $lang['img_copyr'] = 'دارنده‌ی حق تکثیر';
$lang['img_format'] = 'فرمت';
$lang['img_camera'] = 'دوربین';
$lang['img_keywords'] = 'واژه‌های کلیدی';
+$lang['img_width'] = 'عرض';
+$lang['img_height'] = 'ارتفاع';
+$lang['img_manager'] = 'دیدن در مدیریت محتوای چند رسانه ای';
$lang['subscr_subscribe_success'] = '%s به لیست آبونه %s افزوده شد';
$lang['subscr_subscribe_error'] = 'اشکال در افزودن %s به لیست آبونه %s';
$lang['subscr_subscribe_noaddress'] = 'هیچ آدرسی برای این عضویت اضافه نشده است، شما نمی‌توانید به لیست آبونه اضافه شوید';
@@ -241,6 +268,7 @@ $lang['subscr_style_digest'] = 'ارسال ایمیل‌های فشرده بر
$lang['subscr_style_list'] = 'لیست صفحات تغییر داده شده از آخرین رای‌نامه';
$lang['authmodfailed'] = 'اشکال در نوع معتبرسازی کاربران، مدیر ویکی را باخبر سازید.';
$lang['authtempfail'] = 'معتبرسازی کابران موقتن مسدود می‌باشد. اگر این حالت پایدار بود، مدیر ویکی را باخبر سازید.';
+$lang['authpwdexpire'] = 'کلمه عبور شما در %d روز منقضی خواهد شد ، شما باید آن را زود تغییر دهید';
$lang['i_chooselang'] = 'انتخاب زبان';
$lang['i_installer'] = 'نصب کننده‌ی Dokuwiki';
$lang['i_wikiname'] = 'نام ویکی';
@@ -263,21 +291,6 @@ $lang['i_pol1'] = 'ویکی عمومی (همه می‌توانن
$lang['i_pol2'] = 'ویکی بسته (فقط کاربران ثبت شده می‌توانند بخوانند، بنویسند و فایل ارسال کنند)';
$lang['i_retry'] = 'تلاش مجدد';
$lang['i_license'] = 'لطفن مجوز این محتوا را وارد کنید:';
-$lang['mu_intro'] = 'شما می‌توانید چندین فایل را با یک حرکت ارسال کنید. روی دکمه‌ی «بچر» کلیک کنید و فایل‌ها را به صف ارسال اضافه نمایید. سپس دکمه‌ی «ارسال» را فشار دهید. ';
-$lang['mu_gridname'] = 'نام فایل';
-$lang['mu_gridsize'] = 'اندازه';
-$lang['mu_gridstat'] = 'وضعیت';
-$lang['mu_namespace'] = 'فضای‌نام';
-$lang['mu_browse'] = 'بچر';
-$lang['mu_toobig'] = 'خیلی بزرگ';
-$lang['mu_ready'] = 'آماده‌ی ارسال';
-$lang['mu_done'] = 'کامل';
-$lang['mu_fail'] = 'شکست خورد';
-$lang['mu_authfail'] = 'سشن به پایان رسید';
-$lang['mu_progress'] = '@PCT@% ارسال شد';
-$lang['mu_filetypes'] = 'توسعه‌های مجاز';
-$lang['mu_info'] = 'فایل ارسال گردید';
-$lang['mu_lasterr'] = 'آخرین خطا:';
$lang['recent_global'] = 'شما هم‌اکنون تغییرات فضای‌نام <b>%s</b> را مشاهده می‌کنید. شما هم‌چنین می‌توانید <a href="%s">تغییرات اخیر در کل ویکی را مشاهده نمایید</a>.';
$lang['years'] = '%d سال پیش';
$lang['months'] = '%d ماه پیش';
@@ -287,3 +300,26 @@ $lang['hours'] = '%d ساعت پیش';
$lang['minutes'] = '%d دقیقه‌ی پیش';
$lang['seconds'] = '%d ثانیه‌ی پیش';
$lang['wordblock'] = 'تغییرات شما به دلیل داشتن محتوای مشکوک (مثل اسپم) ذخیره نشد.';
+$lang['media_uploadtab'] = 'آپلود';
+$lang['media_searchtab'] = 'جستجو';
+$lang['media_file'] = 'فایل';
+$lang['media_viewtab'] = 'دیدن';
+$lang['media_edittab'] = 'ویرایش';
+$lang['media_historytab'] = 'تاریخچه';
+$lang['media_list_thumbs'] = 'ریز عکسها';
+$lang['media_list_rows'] = 'سطرها';
+$lang['media_sort_name'] = 'ستون ها';
+$lang['media_sort_date'] = 'تاریخ';
+$lang['media_namespaces'] = 'انتخاب فضای نام';
+$lang['media_files'] = 'فایل در %s';
+$lang['media_upload'] = 'آپلود به %s';
+$lang['media_search'] = 'جستجو در %s';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s در %s';
+$lang['media_edit'] = '%s ویرایش';
+$lang['media_history'] = 'تاریخچه %s';
+$lang['media_meta_edited'] = 'فرا داده ها ویرایش شدند.';
+$lang['media_perm_read'] = 'متاسفانه ، شما حق خواندن این فایل ها را ندارید.';
+$lang['media_perm_upload'] = 'متاسفانه ، شما حق آپلود این فایل ها را ندارید.';
+$lang['media_update'] = 'آپلود نسخه جدید';
+$lang['media_restore'] = 'بازیابی این نسخه';
diff --git a/inc/lang/fa/mailwrap.html b/inc/lang/fa/mailwrap.html
new file mode 100644
index 000000000..c313c0bf6
--- /dev/null
+++ b/inc/lang/fa/mailwrap.html
@@ -0,0 +1,14 @@
+ <html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>This mail was generated by DokuWiki at @DOKUWIKIURL@.</small>
+<small> این ایمیل توسط DokuWiki at @DOKUWIKIURL@ تولید شده است. </small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/fa/resetpwd.txt b/inc/lang/fa/resetpwd.txt
new file mode 100644
index 000000000..6a1355eba
--- /dev/null
+++ b/inc/lang/fa/resetpwd.txt
@@ -0,0 +1,3 @@
+====== تعیین کلمه عبور جدید ======
+
+لطفاً یک کلمه عبور جدید برای حساب کاربری خود در این ویکی ایجاد کنید. \ No newline at end of file
diff --git a/inc/lang/fi/install.html b/inc/lang/fi/install.html
index 8d20e045c..1b43455b5 100644
--- a/inc/lang/fi/install.html
+++ b/inc/lang/fi/install.html
@@ -1,21 +1,21 @@
-<p>Tämä sivu avustaa <a href="http://dokuwiki.org">Dokuwikin</a> ensiasennuksessa ja
- asetuksissa. Lisätietoa asennusohjelmasta löytyy ohjelman
+<p>Tämä sivu avustaa <a href="http://dokuwiki.org">Dokuwikin</a> ensiasennuksessa ja
+ asetuksissa. Lisätietoa asennusohjelmasta löytyy ohjelman
<a href="http://dokuwiki.org/installer">dokumentaatiosta</a>.</p>
-<p>DokuWiki käyttää tavallisia tiedostoja wiki-sivujen, sekä muiden niihin liittyvien
- tietojen kuten kuvien, hakuindeksien, versionhallinnan jne. tallentamiseen. Toimiakseen
- oikein DokuWikillä <strong>täytyy</strong> olla kirjoitusoikeus niihin hakemistoihin joissa nämä
- tiedostot sijaitsevat. Asennusohjelma ei pysty asettamaan näitä oikeuksia. Tämä täytyy
- useimmiten tehdä suoraan komentoriviltä tai muulla, esimerkiksi
- internet-palveluntarjoajan määrittämällä tavalla, kuten FTP -ohjelmalla tai erillisen
+<p>DokuWiki käyttää tavallisia tiedostoja wiki-sivujen, sekä muiden niihin liittyvien
+ tietojen kuten kuvien, hakuindeksien, versionhallinnan jne. tallentamiseen. Toimiakseen
+ oikein DokuWikillä <strong>täytyy</strong> olla kirjoitusoikeus niihin hakemistoihin joissa nämä
+ tiedostot sijaitsevat. Asennusohjelma ei pysty asettamaan näitä oikeuksia. Tämä täytyy
+ useimmiten tehdä suoraan komentoriviltä tai muulla, esimerkiksi
+ internet-palveluntarjoajan määrittämällä tavalla, kuten FTP -ohjelmalla tai erillisen
asetusvalikon kautta. (cPanel).</p>
-<p>Asennusohjelma määrittelee DokuWikin <acronym title="käyttöoikeudet">käyttöoikeudet (ACL)</acronym>,
- jotka mahdollistavat ylläpitäjän sisäänkirjautumisen ja pääsyn DokuWikin ylläpito -valikkoon,
- josta voidaan asentaa plugineja, hallita käyttäjätietoja, wiki-sivujen luku- ja
- kirjoitusoikeuksia sekä muita asetuksia. Käyttöoikeuksien käyttäminen ei ole pakollista,
+<p>Asennusohjelma määrittelee DokuWikin käyttöoikeudet (<abbr title="access control list">ACL</abbr>),
+ jotka mahdollistavat ylläpitäjän sisäänkirjautumisen ja pääsyn DokuWikin ylläpito -valikkoon,
+ josta voidaan asentaa plugineja, hallita käyttäjätietoja, wiki-sivujen luku- ja
+ kirjoitusoikeuksia sekä muita asetuksia. Käyttöoikeuksien käyttäminen ei ole pakollista,
mutta se helpottaa DokuWikin ylläpitämistä.</p>
-<p>Kokeneille käyttäjille tai käyttäjille joilla on erityisvaatimuksia asennukselle
- löytyy lisätietoa <a href="http://dokuwiki.org/install">asennuksesta</a> sekä
+<p>Kokeneille käyttäjille tai käyttäjille joilla on erityisvaatimuksia asennukselle
+ löytyy lisätietoa <a href="http://dokuwiki.org/install">asennuksesta</a> sekä
<a href="http://dokuwiki.org/config">asetuksista</a>.</p>
diff --git a/inc/lang/fi/lang.php b/inc/lang/fi/lang.php
index 3477f15a3..4f5f6f1a2 100644
--- a/inc/lang/fi/lang.php
+++ b/inc/lang/fi/lang.php
@@ -43,7 +43,7 @@ $lang['btn_backtomedia'] = 'Takaisin mediatiedostojen valintaan';
$lang['btn_subscribe'] = 'Tilaa muutokset';
$lang['btn_profile'] = 'Päivitä profiili';
$lang['btn_reset'] = 'Tyhjennä';
-$lang['btn_resendpwd'] = 'Lähetä uusi salasana';
+$lang['btn_resendpwd'] = 'Aseta uusi salasana';
$lang['btn_draft'] = 'Muokkaa luonnosta';
$lang['btn_recover'] = 'Palauta luonnos';
$lang['btn_draftdel'] = 'Poista luonnos';
@@ -80,7 +80,7 @@ $lang['profnoempty'] = 'Tyhjä nimi tai sähköpostiosoite ei ole sall
$lang['profchanged'] = 'Käyttäjän profiilin päivitys onnistui.';
$lang['pwdforget'] = 'Unohtuiko salasana? Hanki uusi';
$lang['resendna'] = 'Tämä wiki ei tue salasanan uudelleenlähettämistä.';
-$lang['resendpwd'] = 'Lähetä uusi salasana käyttäjälle';
+$lang['resendpwd'] = 'Aseta uusisalasana';
$lang['resendpwdmissing'] = 'Kaikki kentät on täytettävä.';
$lang['resendpwdnouser'] = 'Käyttäjää ei löydy tietokannastamme.';
$lang['resendpwdbadauth'] = 'Tunnistuskoodi on virheellinen. Varmista, että käytit koko varmistuslinkkiä.';
@@ -93,6 +93,7 @@ $lang['searchmedia_in'] = 'Etsi kohteesta %s';
$lang['txt_upload'] = 'Valitse tiedosto lähetettäväksi';
$lang['txt_filename'] = 'Lähetä nimellä (valinnainen)';
$lang['txt_overwrt'] = 'Ylikirjoita olemassa oleva';
+$lang['maxuploadsize'] = 'Palvelimelle siirto max. %s / tiedosto.';
$lang['lockedby'] = 'Tällä hetkellä tiedoston on lukinnut';
$lang['lockexpire'] = 'Lukitus päättyy';
$lang['js']['willexpire'] = 'Lukituksesi tämän sivun muokkaukseen päättyy minuutin kuluttua.\nRistiriitojen välttämiseksi paina esikatselu-nappia nollataksesi lukitusajan.';
@@ -187,6 +188,12 @@ $lang['external_edit'] = 'ulkoinen muokkaus';
$lang['summary'] = 'Yhteenveto muokkauksesta';
$lang['noflash'] = 'Tarvitset <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash-liitännäisen</a> nähdäksesi tämän sisällön.';
$lang['download'] = 'Lataa palanen';
+$lang['tools'] = 'Työkalut';
+$lang['user_tools'] = 'Käyttäjän työkalut';
+$lang['site_tools'] = 'Sivuston työkalut';
+$lang['page_tools'] = 'Sivutyökalut';
+$lang['skip_to_content'] = 'Siirry sisältöön';
+$lang['sidebar'] = 'Sivupalkki';
$lang['mail_newpage'] = 'sivu lisätty:';
$lang['mail_changed'] = 'sivu muutettu:';
$lang['mail_subscribe_list'] = 'muuttuneet sivut nimiavaruudessa:';
@@ -257,6 +264,7 @@ $lang['subscr_style_digest'] = 'yhteenveto-sähköposti joka sivusta (joka %.2
$lang['subscr_style_list'] = 'lista muuttuneista sivuista edellisen sähköpostin jälkeen (joka %.2f. päivä)';
$lang['authmodfailed'] = 'Käyttäjien autentikoinnin asetukset ovat virheelliset. Ilmoita asiasta wikin ylläpitäjälle.';
$lang['authtempfail'] = 'Käyttäjien autentikointi ei tällä hetkellä onnistu. Jos ongelma jatkuu, ota yhteyttä wikin ylläpitäjään.';
+$lang['authpwdexpire'] = 'Salasanasi vanhenee %d pv:n päästä, vaihda salasanasi pikaisesti.';
$lang['i_chooselang'] = 'Valitse kieli';
$lang['i_installer'] = 'DokuWikin asentaja';
$lang['i_wikiname'] = 'Wikin nimi';
@@ -279,21 +287,6 @@ $lang['i_pol1'] = 'Julkinen Wiki (luku kaikilla, kirjoitus ja tie
$lang['i_pol2'] = 'Suljettu Wiki (luku, kirjoitus ja tiedostojen lähetys vain rekisteröityneillä käyttäjillä)';
$lang['i_retry'] = 'Yritä uudelleen';
$lang['i_license'] = 'Valitse lisenssi, jonka alle haluat sisältösi laittaa:';
-$lang['mu_intro'] = 'Täällä voit lähettää useampia tiedostoja kerralla. Klikkaa Selaa-nappia lisätäksesi ne jonoon. Paina lähetä, kun olet valmis.';
-$lang['mu_gridname'] = 'Tiedoston nimi';
-$lang['mu_gridsize'] = 'Koko';
-$lang['mu_gridstat'] = 'Tilanne';
-$lang['mu_namespace'] = 'Nimiavaruus';
-$lang['mu_browse'] = 'Selaa';
-$lang['mu_toobig'] = 'liian iso';
-$lang['mu_ready'] = 'valmis lähetettäväksi';
-$lang['mu_done'] = 'valmis';
-$lang['mu_fail'] = 'epäonnistui';
-$lang['mu_authfail'] = 'istunto on vanhentunut';
-$lang['mu_progress'] = '@PCT@% lähetetty';
-$lang['mu_filetypes'] = 'Sallitut tyypit';
-$lang['mu_info'] = 'tiedostoa ladattu.';
-$lang['mu_lasterr'] = 'Edellinen virhe:';
$lang['recent_global'] = 'Seuraat tällä hetkellä muutoksia nimiavaruuden <b>%s</b> sisällä. Voit myös <a href="%s">katsoa muutoksia koko wikissä</a>';
$lang['years'] = '%d vuotta sitten';
$lang['months'] = '%d kuukautta sitten';
@@ -326,4 +319,3 @@ $lang['media_perm_read'] = 'Anteeksi. Sinulla ei ole riittävästi oikeuks
$lang['media_perm_upload'] = 'Anteeksi. Sinulla ei ole riittävästi oikeuksia lähettääksesi tiedostoja.';
$lang['media_update'] = 'Lähetä uusi versio';
$lang['media_restore'] = 'Palauta tämä versio';
-$lang['plugin_install_err'] = 'Liitännäinen asentui virheellisesti. Nimeä liitännäisen hakemisto \'%s\' -> \'%s\'';
diff --git a/inc/lang/fi/mailwrap.html b/inc/lang/fi/mailwrap.html
new file mode 100644
index 000000000..6ff63c04e
--- /dev/null
+++ b/inc/lang/fi/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Tämä viesti on tehty DokuWiki:ssä @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/fi/resetpwd.txt b/inc/lang/fi/resetpwd.txt
new file mode 100644
index 000000000..c6780949a
--- /dev/null
+++ b/inc/lang/fi/resetpwd.txt
@@ -0,0 +1,3 @@
+===== Aseta salasana =====
+
+Anna uusi salasanasi tässä wikissä. \ No newline at end of file
diff --git a/inc/lang/fo/lang.php b/inc/lang/fo/lang.php
index 4cb895f72..14ec8c56b 100644
--- a/inc/lang/fo/lang.php
+++ b/inc/lang/fo/lang.php
@@ -40,7 +40,6 @@ $lang['btn_backtomedia'] = 'Aftur til val av miðlafílu';
$lang['btn_subscribe'] = 'Tilmelda broytingar';
$lang['btn_profile'] = 'Dagføra vangamynd';
$lang['btn_reset'] = 'Nullstilla';
-$lang['btn_resendpwd'] = 'Send nýtt loyniorð';
$lang['btn_draft'] = 'Broyt kladdu';
$lang['btn_recover'] = 'Endurbygg kladdu';
$lang['btn_draftdel'] = 'Sletta';
@@ -75,7 +74,6 @@ $lang['profnoempty'] = 'Tómt navn ella t-post adressa er ikki loyvt.'
$lang['profchanged'] = 'Brúkara vangamynd dagført rætt.';
$lang['pwdforget'] = 'Gloymt títt loyniorð? Fá eitt nýtt';
$lang['resendna'] = 'Tað er ikki møguligt at fá sent nýtt loyniorð við hesu wiki.';
-$lang['resendpwd'] = 'Send nýtt loyniorð til';
$lang['resendpwdmissing'] = 'Tú skal filla út øll økir.';
$lang['resendpwdnouser'] = 'Vit kunna ikki finna hendan brúkara í okkara dátagrunni.';
$lang['resendpwdbadauth'] = 'Hald til góðar, hendan góðkenningar kodan er ikki gildug. Kanna eftir at tú nýtti tað fulfíggjaðu góðkenningarleinkjuna';
diff --git a/inc/lang/fr/install.html b/inc/lang/fr/install.html
index b057becfe..91c9f2edf 100644
--- a/inc/lang/fr/install.html
+++ b/inc/lang/fr/install.html
@@ -1,13 +1,13 @@
-<p>Cette page vous assiste dans la premi&egrave;re installation et la
+<p>Cette page vous assiste dans la première installation et la
configuration de <a href="http://dokuwiki.org">DokuWiki</a>.
-Pour plus d'information sur cet installeur, reportez-vous &agrave; sa
+Pour plus d'information sur cet installeur, reportez-vous à sa
<a href="http://dokuwiki.org/installer">page de
documentation</a>.</p>
<p>DokuWiki utilise des fichiers textes ordinaires pour stocker les pages du
-wiki et les autres informations associ&eacute;es &agrave; ces pages
-(tel que images, index de recherche, anciennes r&eacute;visions, etc.). Pour fonctionner correctement, DokuWiki <strong>doit</strong> avoir acc&egrave;s en &eacute;criture aux diff&eacute;rents r&eacute;pertoires qui contiennent ces fichiers. L'installeur n'est pas capable de modifier les permissions sur les r&eacute;pertoires. Ceci doit &ecirc;tre effectu&eacute; directement sur la ligne de commande de votre shell, ou, si vous &ecirc;tes h&eacute;berg&eacute;, <em>via</em> FTP ou votre panneau de contr&ocirc;le (tel que cPanel).</p>
+wiki et les autres informations associées à ces pages
+(tel que images, index de recherche, anciennes révisions, etc.). Pour fonctionner correctement, DokuWiki <strong>doit</strong> avoir accès en écriture aux différents répertoires qui contiennent ces fichiers. L'installeur n'est pas capable de modifier les permissions sur les répertoires. Ceci doit être effectué directement sur la ligne de commande de votre shell, ou, si vous êtes hébergé, <em>via</em> FTP ou votre panneau de contrôle (tel que cPanel).</p>
-<p>Cet installeur va param&eacute;trer votre configuration de DokuWiki pour des <acronym title="Access Control List - Liste de contrôle d'acc&egrave;s">ACL</acronym>, qui permettront l'acc&egrave;s &agrave; un identifiant administrateur et l'acc&egrave;s au menu d'administration de DokuWiki pour l'ajout de modules externes (greffons), la gestion d'utilisateurs, la gestion de l'acc&egrave;s aux pages du wiki et les modifications des param&egrave;tres de configuration. Il n'est pas n&eacute;cessaire au fonctionnement de DokuWiki, n&eacute;anmoins il facilite l'administration de DokuWiki.</p>
+<p>Cet installeur va paramétrer votre configuration de DokuWiki pour des <abbr title="Access Control List - Liste de contrôle d'accès">ACL</abbr>, qui permettront l'accès à un identifiant administrateur et l'accès au menu d'administration de DokuWiki pour l'ajout de modules externes (greffons), la gestion d'utilisateurs, la gestion de l'accès aux pages du wiki et les modifications des paramètres de configuration. Il n'est pas nécessaire au fonctionnement de DokuWiki, néanmoins il facilite l'administration de DokuWiki.</p>
-<p>Les utilisateurs exp&eacute;riment&eacute;s ou ceux n&eacute;cessitant des param&eacute;trages particuliers devraient se reporter aux liens suivants pour les d&eacute;tails concernant les <a href="http://dokuwiki.org/install">instructions d'installation</a> et les <a href="http://dokuwiki.org/config">param&egrave;tres de configuration</a>.</p>
+<p>Les utilisateurs expérimentés ou ceux nécessitant des paramétrages particuliers devraient se reporter aux liens suivants pour les détails concernant les <a href="http://dokuwiki.org/install">instructions d'installation</a> et les <a href="http://dokuwiki.org/config">paramètres de configuration</a>.</p>
diff --git a/inc/lang/fr/lang.php b/inc/lang/fr/lang.php
index f92ea92d9..c4080bc50 100644
--- a/inc/lang/fr/lang.php
+++ b/inc/lang/fr/lang.php
@@ -23,6 +23,8 @@
* @author Johan Guilbaud <guilbaud.johan@gmail.com>
* @author schplurtz@laposte.net
* @author skimpax@gmail.com
+ * @author Yannick Aure <yannick.aure@gmail.com>
+ * @author Olivier DUVAL <zorky00@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -58,7 +60,7 @@ $lang['btn_backtomedia'] = 'Retour à la sélection du fichier média';
$lang['btn_subscribe'] = 'S\'abonner à la page';
$lang['btn_profile'] = 'Mettre à jour le profil';
$lang['btn_reset'] = 'Réinitialiser';
-$lang['btn_resendpwd'] = 'Envoyer le mot de passe';
+$lang['btn_resendpwd'] = 'Définir un nouveau mot de passe';
$lang['btn_draft'] = 'Modifier le brouillon';
$lang['btn_recover'] = 'Récupérer le brouillon';
$lang['btn_draftdel'] = 'Effacer le brouillon';
@@ -95,7 +97,7 @@ $lang['profnoempty'] = 'Un nom ou une adresse de courriel vide n\'est
$lang['profchanged'] = 'Mise à jour du profil réussie.';
$lang['pwdforget'] = 'Mot de passe oublié ? Faites-vous envoyer votre mot de passe ';
$lang['resendna'] = 'Ce wiki ne permet pas le renvoi de mot de passe.';
-$lang['resendpwd'] = 'Renvoyer le mot de passe de';
+$lang['resendpwd'] = 'Définir un nouveau mot de passe pour';
$lang['resendpwdmissing'] = 'Désolé, vous devez remplir tous les champs.';
$lang['resendpwdnouser'] = 'Désolé, cet utilisateur est introuvable dans notre base.';
$lang['resendpwdbadauth'] = 'Désolé, ce code d\'authentification est invalide. Assurez-vous d\'avoir utilisé le lien de confirmation.';
@@ -108,6 +110,7 @@ $lang['searchmedia_in'] = 'Chercher dans %s';
$lang['txt_upload'] = 'Sélectionnez un fichier à envoyer ';
$lang['txt_filename'] = 'Donnez un « wikiname » (optionnel) ';
$lang['txt_overwrt'] = 'Écraser le fichier cible';
+$lang['maxuploadsize'] = 'Téléverser max. %s par fichier';
$lang['lockedby'] = 'Actuellement bloqué par';
$lang['lockexpire'] = 'Le blocage expire à';
$lang['js']['willexpire'] = 'Votre verrouillage pour la modification de cette page expire dans une minute.\nPour éviter les conflits, utilisez le bouton « Aperçu » pour réinitialiser le minuteur.';
@@ -200,6 +203,11 @@ $lang['external_edit'] = 'modification externe';
$lang['summary'] = 'Résumé';
$lang['noflash'] = 'Le greffon <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash</a> est nécessaire pour afficher ce contenu.';
$lang['download'] = 'Télécharger un extrait';
+$lang['tools'] = 'Outils';
+$lang['user_tools'] = 'Outils d\'utilisateurs';
+$lang['site_tools'] = 'Outils du Site';
+$lang['page_tools'] = 'Outils de la Page';
+$lang['skip_to_content'] = 'Aller au contenu';
$lang['mail_newpage'] = 'page ajoutée :';
$lang['mail_changed'] = 'page modifiée :';
$lang['mail_subscribe_list'] = 'pages modifiées dans la catégorie :';
@@ -270,6 +278,7 @@ $lang['subscr_style_digest'] = 'Courriel, tous les %.2f jours, résumant les m
$lang['subscr_style_list'] = 'Liste des pages modifiées depuis le dernier courriel (tous les %.2f jours)';
$lang['authmodfailed'] = 'Mauvais paramétrage de l\'authentification. Merci d\'informer l\'administrateur du Wiki.';
$lang['authtempfail'] = 'L\'authentification est temporairement indisponible. Si cela perdure, merci d\'informer l\'administrateur du Wiki.';
+$lang['authpwdexpire'] = 'Votre mot de passe expirera dans %d jours, vous devriez le changer bientôt.';
$lang['i_chooselang'] = 'Choisissez votre langue';
$lang['i_installer'] = 'Installeur DokuWiki';
$lang['i_wikiname'] = 'Nom du wiki';
@@ -292,21 +301,6 @@ $lang['i_pol1'] = 'Wiki public (lecture pour tout le monde, écri
$lang['i_pol2'] = 'Wiki fermé (lecture, écriture, envoi de fichiers pour les utilisateurs enregistrés uniquement)';
$lang['i_retry'] = 'Réessayer';
$lang['i_license'] = 'Veuillez choisir la licence sous laquelle placer votre contenu :';
-$lang['mu_intro'] = 'Ici vous pouvez envoyer plusieurs fichiers en même temps. Cliquez sur le bouton parcourir pour les ajouter. Cliquez sur envoyer lorsque c\'est prêt. ';
-$lang['mu_gridname'] = 'Nom du fichier';
-$lang['mu_gridsize'] = 'Taille';
-$lang['mu_gridstat'] = 'État';
-$lang['mu_namespace'] = 'Catégorie';
-$lang['mu_browse'] = 'Parcourir';
-$lang['mu_toobig'] = 'Trop gros';
-$lang['mu_ready'] = 'Prêt à envoyer';
-$lang['mu_done'] = 'Terminé';
-$lang['mu_fail'] = 'Échoué';
-$lang['mu_authfail'] = 'Session expirée';
-$lang['mu_progress'] = '@PCT@% envoyé';
-$lang['mu_filetypes'] = 'Types de fichiers acceptés';
-$lang['mu_info'] = 'fichiers envoyés.';
-$lang['mu_lasterr'] = 'Dernière erreur : ';
$lang['recent_global'] = 'Vous êtes actuellement en train de regarder les modifications au sein de la catégorie <strong>%s</strong>. Vous pouvez aussi <a href="%s">voir les récentes modifications sur tout le wiki</a>.';
$lang['years'] = 'il y a %d ans';
$lang['months'] = 'il y a %d mois';
@@ -339,4 +333,3 @@ $lang['media_perm_read'] = 'Désolé, vous n\'avez pas les droits pour lir
$lang['media_perm_upload'] = 'Désolé, vous n\'avez pas les droits pour télécharger des fichiers.';
$lang['media_update'] = 'Télécharger une nouvelle version';
$lang['media_restore'] = 'Restaurer cette version';
-$lang['plugin_install_err'] = 'Extension mal installée. Renommez le dossier de l\'extension \'%s\' en \'%s\'.';
diff --git a/inc/lang/fr/mailtext.txt b/inc/lang/fr/mailtext.txt
index add3b2779..3c2d53292 100644
--- a/inc/lang/fr/mailtext.txt
+++ b/inc/lang/fr/mailtext.txt
@@ -7,7 +7,6 @@ Adresse IP : @IPADDRESS@
Nom d'hôte : @HOSTNAME@
Ancienne révision : @OLDPAGE@
Nouvelle révision : @NEWPAGE@
-Différences : @OLDPAGE@&do=diff
Résumé : @SUMMARY@
Utilisateur : @USER@
diff --git a/inc/lang/fr/mailwrap.html b/inc/lang/fr/mailwrap.html
new file mode 100644
index 000000000..2b674196b
--- /dev/null
+++ b/inc/lang/fr/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Ce courriel a été automatiquement généré par DokuWiki à l'adresse @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/fr/resetpwd.txt b/inc/lang/fr/resetpwd.txt
new file mode 100644
index 000000000..7b1990ca0
--- /dev/null
+++ b/inc/lang/fr/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Définir un nouveau mot de passe ======
+
+Merci d'entrer un nouveau mot de passe pour votre compte sur ce wiki. \ No newline at end of file
diff --git a/inc/lang/gl/install.html b/inc/lang/gl/install.html
index ca26f7961..fdaaa175a 100644
--- a/inc/lang/gl/install.html
+++ b/inc/lang/gl/install.html
@@ -4,16 +4,16 @@ verbo deste instalador está dispoñible na súa propia
<a href="http://dokuwiki.org/installer">páxina de documentación</a>.</p>
<p>O DokuWiki emprega arquivos normais para a almacenaxe das páxinas do wiki
-e outra información asociada coas mesmas (p.e. imaxes, índices de procura,
+e outra información asociada coas mesmas (p.e. imaxes, índices de procura,
revisións antigas, etc). Por iso, para poder operar correctamente, o DokuWiki
<strong>precisa</strong> ter acceso de escritura aos directorios que conteñen
eses arquivos. Este instalador non é quen de configurar os permisos dos directorios.
-Isto debe facerse normalmente de xeito directo na liña de comandos ou, se estás a
+Isto debe facerse normalmente de xeito directo na liña de comandos ou, se estás a
usar unha hospedaxe, a través do FTP ou do panel de control da túa hospedaxe (p.e.
o cPanel).</p>
<p>Este instalador configurará o teu DokuWiki para o uso da
-<acronym title="access control list">ACL</acronym>, o cal permitirá ao administrador
+<abbr title="access control list">ACL</abbr>, o cal permitirá ao administrador
iniciar sesión e acceder ao menú de administración do DokuWiki para instalar extensións,
xestionar usuarios e accesos ás páxinas do wiki, ademais de modificar a configuración.
Non é imprescindíbel para o funcionamento do DokuWiki, porén, fai moito máis doada a
diff --git a/inc/lang/gl/lang.php b/inc/lang/gl/lang.php
index 01938b3a0..23bd9a741 100644
--- a/inc/lang/gl/lang.php
+++ b/inc/lang/gl/lang.php
@@ -4,6 +4,7 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Medúlio <medulio@ciberirmandade.org>
+ * @author Oscar M. Lage <r0sk10@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -39,12 +40,13 @@ $lang['btn_backtomedia'] = 'Volver á Selección de Arquivos-Media';
$lang['btn_subscribe'] = 'Avísame dos trocos na páxina';
$lang['btn_profile'] = 'Actualizar Perfil';
$lang['btn_reset'] = 'Reiniciar';
-$lang['btn_resendpwd'] = 'Envíame un novo contrasinal';
$lang['btn_draft'] = 'Editar borrador';
$lang['btn_recover'] = 'Recuperar borrador';
$lang['btn_draftdel'] = 'Eliminar borrador';
$lang['btn_revert'] = 'Restaurar';
$lang['btn_register'] = 'Rexístrate';
+$lang['btn_apply'] = 'Aplicar';
+$lang['btn_media'] = 'Xestor de Arquivos-Media';
$lang['loggedinas'] = 'Iniciaches sesión como';
$lang['user'] = 'Nome de Usuario';
$lang['pass'] = 'Contrasinal';
@@ -74,7 +76,6 @@ $lang['profnoempty'] = 'Non se permite un nome ou un enderezo de corre
$lang['profchanged'] = 'Perfil de usuario actualizado correctamente.';
$lang['pwdforget'] = 'Esqueceches o teu contrasinal? Consegue un novo';
$lang['resendna'] = 'Este wiki non permite o reenvío de contrasinais.';
-$lang['resendpwd'] = 'Enviar novo contrasinal para';
$lang['resendpwdmissing'] = 'Sentímolo, tes que cubrir todos os campos.';
$lang['resendpwdnouser'] = 'Sentímolo, non atopamos este usuario no noso banco de datos.';
$lang['resendpwdbadauth'] = 'Sentímolo, mais este código de autorización non é válido. Asegúrate de que usaches a ligazón completa de confirmación.';
@@ -89,25 +90,9 @@ $lang['txt_filename'] = 'Subir como (opcional)';
$lang['txt_overwrt'] = 'Sobrescribir arquivo existente';
$lang['lockedby'] = 'Bloqueado actualmente por';
$lang['lockexpire'] = 'O bloqueo remata o';
-$lang['js']['willexpire'] = 'O teu bloqueo para editares esta páxina vai caducar nun minuto.\nPara de evitar conflitos, emprega o botón de previsualización para reiniciares o contador do tempo de bloqueo.';
-$lang['js']['notsavedyet'] = "Perderanse os trocos non gardados.\nEstá certo de quereres continuar?";
-$lang['rssfailed'] = 'Houbo un erro ao tentar obter esta corrente RSS: ';
-$lang['nothingfound'] = 'Non se atopou nada.';
-$lang['mediaselect'] = 'Arquivos-Media';
-$lang['fileupload'] = 'Subida de Arquivos-Media';
-$lang['uploadsucc'] = 'Subida correcta';
-$lang['uploadfail'] = 'Erra na subida. Pode que sexa un problema de permisos?';
-$lang['uploadwrong'] = 'Subida denegada. Esta extensión de arquivo non está permitida!';
-$lang['uploadexist'] = 'Xa existe o arquivo. Non se fixo nada.';
-$lang['uploadbadcontent'] = 'O contido subido non concorda coa extensión do arquivo %s.';
-$lang['uploadspam'] = 'A subida foi bloqueada pola lista negra de correo-lixo.';
-$lang['uploadxss'] = 'A subida foi bloqueada por un posíbel contido malicioso.';
-$lang['uploadsize'] = 'O arquivo subido é grande de máis. (máx. %s)';
-$lang['deletesucc'] = 'O arquivo "%s" foi eliminado.';
-$lang['deletefail'] = '"%s" non puido ser eliminado - comproba os permisos.';
-$lang['mediainuse'] = 'O arquivo "%s" non foi eliminado - aínda está en uso.';
-$lang['namespaces'] = 'Nomes de espazos';
-$lang['mediafiles'] = 'Arquivos dispoñíbeis en';
+$lang['js']['willexpire'] = 'O teu bloqueo para editares esta páxina vai caducar nun minuto.\nPara de evitar conflitos, emprega o botón de previsualización para reiniciares o contador do tempo de bloqueo.';
+$lang['js']['notsavedyet'] = 'Perderanse os trocos non gardados.
+Está certo de quereres continuar?';
$lang['js']['searchmedia'] = 'Procurar ficheiros';
$lang['js']['keepopen'] = 'Manter a fiestra aberta na selección';
$lang['js']['hidedetails'] = 'Agochar Pormenores';
@@ -137,6 +122,35 @@ Sempre podes copiar e colar a ligazón.';
$lang['js']['linkwiz'] = 'Asistente de ligazóns';
$lang['js']['linkto'] = 'Ligazón para:';
$lang['js']['del_confirm'] = 'Estás certo de quereres eliminar os elementos seleccionados?';
+$lang['js']['restore_confirm'] = 'Realmente desexas restaurar esta versión?';
+$lang['js']['media_diff'] = 'Ver as diferencias:';
+$lang['js']['media_diff_both'] = 'Cara a Cara';
+$lang['js']['media_diff_opacity'] = 'Opacidade';
+$lang['js']['media_diff_portions'] = 'Porcións';
+$lang['js']['media_select'] = 'Selecciona arquivos...';
+$lang['js']['media_upload_btn'] = 'Subir';
+$lang['js']['media_done_btn'] = 'Feito';
+$lang['js']['media_drop'] = 'Solta aquí os arquivos a subir';
+$lang['js']['media_cancel'] = 'eliminar';
+$lang['js']['media_overwrt'] = 'Sobreescribir os arquivos existentes';
+$lang['rssfailed'] = 'Houbo un erro ao tentar obter esta corrente RSS: ';
+$lang['nothingfound'] = 'Non se atopou nada.';
+$lang['mediaselect'] = 'Arquivos-Media';
+$lang['fileupload'] = 'Subida de Arquivos-Media';
+$lang['uploadsucc'] = 'Subida correcta';
+$lang['uploadfail'] = 'Erra na subida. Pode que sexa un problema de permisos?';
+$lang['uploadwrong'] = 'Subida denegada. Esta extensión de arquivo non está permitida!';
+$lang['uploadexist'] = 'Xa existe o arquivo. Non se fixo nada.';
+$lang['uploadbadcontent'] = 'O contido subido non concorda coa extensión do arquivo %s.';
+$lang['uploadspam'] = 'A subida foi bloqueada pola lista negra de correo-lixo.';
+$lang['uploadxss'] = 'A subida foi bloqueada por un posíbel contido malicioso.';
+$lang['uploadsize'] = 'O arquivo subido é grande de máis. (máx. %s)';
+$lang['deletesucc'] = 'O arquivo "%s" foi eliminado.';
+$lang['deletefail'] = '"%s" non puido ser eliminado - comproba os permisos.';
+$lang['mediainuse'] = 'O arquivo "%s" non foi eliminado - aínda está en uso.';
+$lang['namespaces'] = 'Nomes de espazos';
+$lang['mediafiles'] = 'Arquivos dispoñíbeis en';
+$lang['accessdenied'] = 'Non tes permitido ver esta páxina.';
$lang['mediausage'] = 'Emprega a seguinte sintaxe para inserires unha referencia a este arquivo:';
$lang['mediaview'] = 'Ver arquivo orixinal';
$lang['mediaroot'] = 'raigaña';
@@ -152,6 +166,10 @@ $lang['current'] = 'actual';
$lang['yours'] = 'A túa Versión';
$lang['diff'] = 'Amosar diferenzas coa versión actual';
$lang['diff2'] = 'Amosar diferenzas entre as revisións seleccionadas';
+$lang['difflink'] = 'Enlazar a esta vista de comparación';
+$lang['diff_type'] = 'Ver diferenzas:';
+$lang['diff_inline'] = 'Por liña';
+$lang['diff_side'] = 'Cara a Cara';
$lang['line'] = 'Liña';
$lang['breadcrumb'] = 'Trazado';
$lang['youarehere'] = 'Estás aquí';
@@ -169,6 +187,10 @@ $lang['mail_changed'] = 'páxina mudada:';
$lang['mail_subscribe_list'] = 'páxinas mudadas en nome de espazo:';
$lang['mail_new_user'] = 'Novo usuario:';
$lang['mail_upload'] = 'arquivo subido:';
+$lang['changes_type'] = 'Ver cambios';
+$lang['pages_changes'] = 'Páxinas';
+$lang['media_changes'] = 'Arquivos-Media';
+$lang['both_changes'] = 'Ambos, páxinas e arquivos-media';
$lang['qb_bold'] = 'Texto Resaltado';
$lang['qb_italic'] = 'Texto en Cursiva';
$lang['qb_underl'] = 'Texto Subliñado';
@@ -209,6 +231,9 @@ $lang['img_copyr'] = 'Copyright';
$lang['img_format'] = 'Formato';
$lang['img_camera'] = 'Cámara';
$lang['img_keywords'] = 'Verbas chave';
+$lang['img_width'] = 'Ancho';
+$lang['img_height'] = 'Alto';
+$lang['img_manager'] = 'Ver no xestor de arquivos-media';
$lang['subscr_subscribe_success'] = 'Engadido %s á lista de subscrición para %s';
$lang['subscr_subscribe_error'] = 'Erro ao tentar engadir %s á lista de subscrición para %s';
$lang['subscr_subscribe_noaddress'] = 'Non hai enderezos asociados co teu inicio de sesión, non é posíbel engadirte á lista de subscrición';
@@ -252,21 +277,7 @@ $lang['i_pol0'] = 'Wiki Aberto (lectura, escritura, subida de arq
$lang['i_pol1'] = 'Wiki Público (lectura para todas as persoas, escritura e subida de arquivos para usuarios rexistrados)';
$lang['i_pol2'] = 'Wiki Fechado (lectura, escritura, subida de arquivos só para usuarios rexistrados)';
$lang['i_retry'] = 'Tentar de novo';
-$lang['mu_intro'] = 'Aquí podes subir varios arquivos de vez. Preme o botón Navegar para engadilos á cola. Preme en Subir cando remates.';
-$lang['mu_gridname'] = 'Nome de Arquivo';
-$lang['mu_gridsize'] = 'Tamaño';
-$lang['mu_gridstat'] = 'Estado';
-$lang['mu_namespace'] = 'Nome de Espazo';
-$lang['mu_browse'] = 'Navegar';
-$lang['mu_toobig'] = 'grande de máis';
-$lang['mu_ready'] = 'disposto para subir';
-$lang['mu_done'] = 'feito';
-$lang['mu_fail'] = 'fallou';
-$lang['mu_authfail'] = 'sesión expirada';
-$lang['mu_progress'] = '@PCT@% subido';
-$lang['mu_filetypes'] = 'Tipos de arquivo Permitidos';
-$lang['mu_info'] = 'arquivos subidos.';
-$lang['mu_lasterr'] = 'Último erro:';
+$lang['i_license'] = 'Por favor escolla a licenza para o contido:';
$lang['recent_global'] = 'Agora mesmo estás a ver os trocos no nome de espazo <b>%s</b>. Tamén podes <a href="%s">ver os trocos recentes no Wiki enteiro</a>.';
$lang['years'] = 'hai %d anos';
$lang['months'] = 'hai %d meses';
@@ -275,3 +286,27 @@ $lang['days'] = 'hai %d días';
$lang['hours'] = 'hai %d horas';
$lang['minutes'] = 'hai %d minutos';
$lang['seconds'] = 'hai %d segundos';
+$lang['wordblock'] = 'Non se gardaron os cambios porque conteñen texto bloqueado (spam).';
+$lang['media_uploadtab'] = 'Subir';
+$lang['media_searchtab'] = 'Buscar';
+$lang['media_file'] = 'Arquivo';
+$lang['media_viewtab'] = 'Ver';
+$lang['media_edittab'] = 'Editar';
+$lang['media_historytab'] = 'Histórico';
+$lang['media_list_thumbs'] = 'Miniaturas';
+$lang['media_list_rows'] = 'Filas';
+$lang['media_sort_name'] = 'Nome';
+$lang['media_sort_date'] = 'Data';
+$lang['media_namespaces'] = 'Escolla espazo';
+$lang['media_files'] = 'Arquivos en %s';
+$lang['media_upload'] = 'Subir a %s';
+$lang['media_search'] = 'Buscar en %s';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s en %s';
+$lang['media_edit'] = 'Editar %s';
+$lang['media_history'] = 'Historia de %s';
+$lang['media_meta_edited'] = 'datos meta editados';
+$lang['media_perm_read'] = 'Sentímolo, non tes permisos suficientes para ler arquivos.';
+$lang['media_perm_upload'] = 'Sentímolo, non tes permisos suficientes para subir arquivos.';
+$lang['media_update'] = 'Subir nova versión';
+$lang['media_restore'] = 'Restaurar esta versión';
diff --git a/inc/lang/he/install.html b/inc/lang/he/install.html
index 3832fb5fb..e2cc179cf 100644
--- a/inc/lang/he/install.html
+++ b/inc/lang/he/install.html
@@ -1,12 +1,12 @@
<p>דף זה מסייע בהליכי ההתקנה וההגדרה הראשוניים של
-<a href="http://dokuwiki.org">Dokuwiki</a>. מידע נוסף על תכנית התקנה זו זמין בדף
+<a href="http://dokuwiki.org">Dokuwiki</a>. מידע נוסף על תכנית התקנה זו זמין בדף
<a href="http://dokuwiki.org/installer">התיעוד שלו</a>.</p>
<p>DokuWiki עושה שימוש בקבצים רגילים לשמירת דפי ויקי ומידע נוסף הקשור לדפים אלו (לדוגמה: תמונות, רשימות חיפוש, גרסאות קודמות וכו׳).
-לצורך תפקוד תקין DokuWiki <strong>חייב</strong> גישה לכתיבה לתיקיות המכילות קבצים אלו. תכנית התקנה זו אינה יכולה להגדיר הרשאות לתיקיות.
+לצורך תפקוד תקין DokuWiki <strong>חייב</strong> גישה לכתיבה לתיקיות המכילות קבצים אלו. תכנית התקנה זו אינה יכולה להגדיר הרשאות לתיקיות.
פעולה זו צריכה בד״כ להתבצע ישירות משורת הפקודה או במקרה שנעשה שימוש בשרת מארח דרך FTP או מנשק הניהול של המארח (cPanell לדוגמה).</p>
-<p>מתקין זה יגדיר את תצורת ה־<acronym title="access control list">ACL</acronym> ב-DokuWiki שלך
+<p>מתקין זה יגדיר את תצורת ה־<abbr title="access control list">ACL</abbr> ב-DokuWiki שלך
, זה בתורו מאפשר גישת מנהל לתפריט הניהול של DokuWiki כדי להתקין הרחבות, לנהל משתמשים, לנהל גישות לדפי ויקי ושינויים בהגדרות התצורה.
אין הוא הכרחי לתפקוד DokuWiki אך הוא יהפוך את Dokuwiki לפשוט יותר לניהול.</p>
diff --git a/inc/lang/he/lang.php b/inc/lang/he/lang.php
index f295e44a9..00eb4549b 100644
--- a/inc/lang/he/lang.php
+++ b/inc/lang/he/lang.php
@@ -45,7 +45,6 @@ $lang['btn_backtomedia'] = 'חזרה לבחירת קובץ מדיה';
$lang['btn_subscribe'] = 'מעקב אחרי שינוים';
$lang['btn_profile'] = 'עדכון הפרופיל';
$lang['btn_reset'] = 'איפוס';
-$lang['btn_resendpwd'] = 'שליחת ססמה חדשה';
$lang['btn_draft'] = 'עריכת טיוטה';
$lang['btn_recover'] = 'שחזור טיוטה';
$lang['btn_draftdel'] = 'מחיקת טיוטה';
@@ -80,7 +79,6 @@ $lang['profnoempty'] = 'השם וכתובת הדוא״ל לא יכול
$lang['profchanged'] = 'הפרופיל עודכן בהצלחה';
$lang['pwdforget'] = 'שכחת את הססמה שלך? ניתן לקבל חדשה';
$lang['resendna'] = 'הוויקי הזה אינו תומך בחידוש ססמה';
-$lang['resendpwd'] = 'שליחת ססמה חדשה עבור';
$lang['resendpwdmissing'] = 'עליך למלא את כל השדות, עמך הסליחה.';
$lang['resendpwdnouser'] = 'משתמש בשם זה לא נמצא במסד הנתונים, עמך הסליחה.';
$lang['resendpwdbadauth'] = 'קוד אימות זה אינו תקף. יש לוודא כי נעשה שימוש בקישור האימות המלא, עמך הסליחה.';
@@ -259,21 +257,6 @@ $lang['i_pol1'] = ' ויקי ציבורי (קריאה לכולם,
$lang['i_pol2'] = 'ויקי סגור (קריאה, כתיבה והעלאה למשתמשים רשומים בלבד)';
$lang['i_retry'] = 'ניסיון נוסף';
$lang['i_license'] = 'נא לבחור את הרישיון שיחול על התוכן שבוויקי שלך:';
-$lang['mu_intro'] = 'דרך כאן ניתן להעלות מספר קבצים בבת אחת. יש ללחוץ על לחצן החיפוש להוסיף אותם למחסנית. ניתן ללחוץ על העלאה לסיום.';
-$lang['mu_gridname'] = 'שם הקובץ';
-$lang['mu_gridsize'] = 'גודל';
-$lang['mu_gridstat'] = 'מצב';
-$lang['mu_namespace'] = 'מרחב שם';
-$lang['mu_browse'] = 'חיפוש';
-$lang['mu_toobig'] = 'גדול מדי';
-$lang['mu_ready'] = 'בהמתנה להעלאה';
-$lang['mu_done'] = 'הסתיים';
-$lang['mu_fail'] = 'נכשל';
-$lang['mu_authfail'] = 'תוקף ההפעלה פג';
-$lang['mu_progress'] = '@PCT@% הועלה';
-$lang['mu_filetypes'] = 'סוגי קבצים מורשים';
-$lang['mu_info'] = 'הקבצים הועלו';
-$lang['mu_lasterr'] = 'שגיאה אחרונה:';
$lang['recent_global'] = 'נכון לעכשיו מתנהל על ידיך מעקב אחר מרחב השם <b>%s</b>. כמו כן, באפשרותך <a href="%s">לצפות בשינויים האחרונים בוויקי כולו</a>.';
$lang['years'] = 'לפני %d שנים';
$lang['months'] = 'לפני %d חודשים';
diff --git a/inc/lang/hi/lang.php b/inc/lang/hi/lang.php
index 00e5589d8..893457066 100644
--- a/inc/lang/hi/lang.php
+++ b/inc/lang/hi/lang.php
@@ -59,7 +59,6 @@ $lang['regpwmail'] = 'आपकी डोकुविकी का
$lang['reghere'] = 'आपके पास अभी तक कोई खाता नहीं है? बस एक लें |';
$lang['profna'] = 'यह विकी प्रोफ़ाइल संशोधन का समर्थन नहीं करता |';
$lang['profnochange'] = 'कोई परिवर्तन नहीं, कुछ नहीं करना |';
-$lang['resendpwd'] = 'नवगुप्तशब्द भेजें';
$lang['resendpwdmissing'] = 'छमा करें, आपको सारे रिक्त स्थान भरने पड़ेंगे |';
$lang['resendpwdsuccess'] = 'आपका नवगुप्तशब्द ईमेल द्वारा सम्प्रेषित कर दिया गया है |';
$lang['txt_upload'] = 'अपलोड करने के लिए फ़ाइल चुनें';
@@ -116,10 +115,3 @@ $lang['i_installer'] = 'डोकुविकी इंस्टॉल
$lang['i_wikiname'] = 'विकी का नाम';
$lang['i_superuser'] = 'महाउपयोगकर्ता';
$lang['i_retry'] = 'पुनःप्रयास';
-$lang['mu_gridsize'] = 'आकार';
-$lang['mu_gridstat'] = 'स्थिति';
-$lang['mu_browse'] = 'ब्राउज़';
-$lang['mu_toobig'] = 'बहुत बड़ा';
-$lang['mu_ready'] = 'अपलोड करने के लिए तैयार';
-$lang['mu_done'] = 'पूर्ण';
-$lang['mu_fail'] = 'असफल';
diff --git a/inc/lang/hr/lang.php b/inc/lang/hr/lang.php
index ef10d7720..a0438d915 100644
--- a/inc/lang/hr/lang.php
+++ b/inc/lang/hr/lang.php
@@ -42,7 +42,6 @@ $lang['btn_backtomedia'] = 'Povratak na Mediafile izbornik';
$lang['btn_subscribe'] = 'Pretplati se na promjene dokumenta';
$lang['btn_profile'] = 'Ažuriraj profil';
$lang['btn_reset'] = 'Poništi promjene';
-$lang['btn_resendpwd'] = 'Pošalji novu lozinku';
$lang['btn_draft'] = 'Uredi nacrt dokumenta';
$lang['btn_recover'] = 'Vrati prijašnji nacrt dokumenta';
$lang['btn_draftdel'] = 'Obriši nacrt dokumenta';
@@ -77,7 +76,6 @@ $lang['profnoempty'] = 'Prazno korisničko ime ili email nisu dopušte
$lang['profchanged'] = 'Korisnički profil je uspješno izmijenjen.';
$lang['pwdforget'] = 'Izgubili ste lozinku? Zatražite novu';
$lang['resendna'] = 'Ovaj wiki ne podržava ponovno slanje lozinke emailom.';
-$lang['resendpwd'] = 'Poslati novu lozinku za';
$lang['resendpwdmissing'] = 'Ispunite sva polja.';
$lang['resendpwdnouser'] = 'Nije moguće pronaći korisnika.';
$lang['resendpwdbadauth'] = 'Neispravan autorizacijski kod. Provjerite da li ste koristili potpun potvrdni link.';
@@ -257,21 +255,6 @@ $lang['i_pol1'] = 'Javni Wiki (čitanje za sve, pisanje i učitav
$lang['i_pol2'] = 'Zatvoreni Wiki (čitanje, pisanje, učitavanje samo za registrirane korisnike)';
$lang['i_retry'] = 'Pokušaj ponovo';
$lang['i_license'] = 'Molim odaberite licencu pod kojom želite postavljati vaš sadržaj:';
-$lang['mu_intro'] = 'Ovdje možeš učitati više datoteka odjednom. Klikni gumb pregled te ih dodajte u red. Pritisnite učitaj kad ste gotovi.';
-$lang['mu_gridname'] = 'Naziv datoteke';
-$lang['mu_gridsize'] = 'Veličina';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Imenski prostor';
-$lang['mu_browse'] = 'Pregled';
-$lang['mu_toobig'] = 'prevelik';
-$lang['mu_ready'] = 'spremno za učitavanje';
-$lang['mu_done'] = 'gotovo';
-$lang['mu_fail'] = 'nije uspio';
-$lang['mu_authfail'] = 'sjednica istekla';
-$lang['mu_progress'] = '@PCT@% učitan';
-$lang['mu_filetypes'] = 'Dozvoljeni tipovi datoteka';
-$lang['mu_info'] = 'datoteke učitane.';
-$lang['mu_lasterr'] = 'Posljednja greška:';
$lang['recent_global'] = 'Trenutno gledate promjene unutar <b>%s</b> imenskog prostora. Također možete <a href="%s">vidjeti zadnje promjene cijelog wiki-a</a>';
$lang['years'] = '%d godina prije';
$lang['months'] = '%d mjeseci prije';
diff --git a/inc/lang/hu/install.html b/inc/lang/hu/install.html
index 1676e9364..a7d681667 100644
--- a/inc/lang/hu/install.html
+++ b/inc/lang/hu/install.html
@@ -1,5 +1,5 @@
<p>Ez az oldal segít a <a href="http://dokuwiki.org">DokuWiki</a> kezdeti
-beállításában és a konfigurálásban. További információ
+beállításában és a konfigurálásban. További információ
<a href="http://dokuwiki.org/installer">ezen az oldalon</a>
található.</p>
@@ -14,7 +14,7 @@ vagy a tárhelyszolgáltató által rendelkezésre bocsátott beállítóeszköz
(pl. cPanel) segítségével.</p>
<p>A Beállító Varázsló felkészíti ezt a DokuWikit a hozzáférési listák
-(<acronym title="access control list">ACL</acronym>-ek) használatára. Így
+(<abbr title="access control list">ACL</abbr>-ek) használatára. Így
a Wiki-gazda felhasználóval hozzáférünk az admin menühöz, mellyel
bővítményeket telepíthetünk, felhasználókat és hozzáférési jogokat
kezelhetünk, valamint változtathatunk a konfigurációs beállításokon.
diff --git a/inc/lang/hu/lang.php b/inc/lang/hu/lang.php
index 23419a2bd..671b225f2 100644
--- a/inc/lang/hu/lang.php
+++ b/inc/lang/hu/lang.php
@@ -45,7 +45,6 @@ $lang['btn_backtomedia'] = 'Vissza a médiafájlok kezeléséhez';
$lang['btn_subscribe'] = 'Oldalváltozások-hírlevél feliratkozás';
$lang['btn_profile'] = 'Személyes beállítások';
$lang['btn_reset'] = 'Alaphelyzet';
-$lang['btn_resendpwd'] = 'Új jelszó küldése';
$lang['btn_draft'] = 'Piszkozat szerkesztése';
$lang['btn_recover'] = 'Piszkozat folytatása';
$lang['btn_draftdel'] = 'Piszkozat törlése';
@@ -80,7 +79,6 @@ $lang['profnoempty'] = 'A név és e-mail mező nem maradhat üresen!'
$lang['profchanged'] = 'A személyes beállítások változtatása megtörtént.';
$lang['pwdforget'] = 'Elfelejtetted a jelszavad? Itt kérhetsz újat';
$lang['resendna'] = 'Ez a wiki nem támogatja a jelszó újraküldést.';
-$lang['resendpwd'] = 'Új jelszó kiküldése ennek a felhasználónak';
$lang['resendpwdmissing'] = 'Sajnáljuk, az összes mezőt ki kell töltened.';
$lang['resendpwdnouser'] = 'Sajnáljuk, ilyen azonosítójú felhasználónk nem létezik.';
$lang['resendpwdbadauth'] = 'Sajnáljuk, ez a megerősítő kód nem helyes. Biztos, hogy a teljes megerősítés linket beírtad pontosan?';
@@ -262,21 +260,6 @@ $lang['i_pol1'] = 'Publikus Wiki (mindenki olvashatja, de csak re
$lang['i_pol2'] = 'Zárt Wiki (csak regisztrált felhasználók olvashatják, írhatják és tölthetnek fel fájlokat)';
$lang['i_retry'] = 'Újra';
$lang['i_license'] = 'Kérlek válassz licenszt a feltöltött tartalomhoz:';
-$lang['mu_intro'] = 'Itt több fájlt is fel tudsz tölteni egyszerre. Kattints a "Kiválaszt" gombra és add hozzá a listához. Nyomd meg a Feltöltés gombot, amikor elkészültél.';
-$lang['mu_gridname'] = 'Fájlnév';
-$lang['mu_gridsize'] = 'Méret';
-$lang['mu_gridstat'] = 'Állapot';
-$lang['mu_namespace'] = 'Névtér';
-$lang['mu_browse'] = 'Kiválaszt';
-$lang['mu_toobig'] = 'túl nagy';
-$lang['mu_ready'] = 'feltöltésre kész';
-$lang['mu_done'] = 'kész';
-$lang['mu_fail'] = 'hibás';
-$lang['mu_authfail'] = 'session lejárt';
-$lang['mu_progress'] = '@PCT@% feltöltve';
-$lang['mu_filetypes'] = 'Megengedett fájltípusok';
-$lang['mu_info'] = 'Fájlok feltöltve.';
-$lang['mu_lasterr'] = 'Utolsó hiba:';
$lang['recent_global'] = 'Jelenleg csak a <b>%s</b> névtér friss változásai látszanak. Megtekinthetők <a href="%s">a teljes wiki friss változásai</a> is.';
$lang['years'] = '%d évvel ezelőtt';
$lang['months'] = '%d hónappal ezelőtt';
diff --git a/inc/lang/ia/install.html b/inc/lang/ia/install.html
index 01b6f43b5..3b48bfd34 100644
--- a/inc/lang/ia/install.html
+++ b/inc/lang/ia/install.html
@@ -6,7 +6,7 @@
<strong>debe</strong> haber accesso de scriptura al directorios que contine iste files. Iste installator non es capabile de configurar le permissiones de directorios. Isto normalmente debe esser facite directemente con le linea de commandos, o si tu usa un albergo web, via FTP o via le pannello de controlo de tu albergo (p.ex. cPanel).</p>
<p>Iste installator configurara tu installation de DokuWiki pro
-<acronym title="listas de controlo de accesso">ACL</acronym>, lo que permitte crear contos administrator, e forni accesso al menu administrative de DokuWiki pro installar plug-ins, gerer usatores, gerer accesso a paginas wiki e alterar configurationes. Isto non es necessari pro le functionamento de DokuWiki, nonobstante, illo rendera DokuWiki plus facile de administrar.</p>
+<abbr title="listas de controlo de accesso">ACL</abbr>, lo que permitte crear contos administrator, e forni accesso al menu administrative de DokuWiki pro installar plug-ins, gerer usatores, gerer accesso a paginas wiki e alterar configurationes. Isto non es necessari pro le functionamento de DokuWiki, nonobstante, illo rendera DokuWiki plus facile de administrar.</p>
<p>Le usatores experte o con exigentias special pro le installation deberea usar iste ligamines pro detalios concernente le
<a href="http://dokuwiki.org/install">instructiones de installation</a>
diff --git a/inc/lang/ia/lang.php b/inc/lang/ia/lang.php
index 8398f29f0..d7be1eff3 100644
--- a/inc/lang/ia/lang.php
+++ b/inc/lang/ia/lang.php
@@ -45,7 +45,6 @@ $lang['btn_backtomedia'] = 'Retornar al selection de files multimedia';
$lang['btn_subscribe'] = 'Gerer subscriptiones';
$lang['btn_profile'] = 'Actualisar profilo';
$lang['btn_reset'] = 'Reinitialisar';
-$lang['btn_resendpwd'] = 'Inviar nove contrasigno';
$lang['btn_draft'] = 'Modificar version provisori';
$lang['btn_recover'] = 'Recuperar version provisori';
$lang['btn_draftdel'] = 'Deler version provisori';
@@ -80,7 +79,6 @@ $lang['profnoempty'] = 'Un nomine o adresse de e-mail vacue non es per
$lang['profchanged'] = 'Actualisation del profilo de usator succedite.';
$lang['pwdforget'] = 'Contrasigno oblidate? Obtene un altere';
$lang['resendna'] = 'Iste wiki non supporta le invio de un nove contrasigno.';
-$lang['resendpwd'] = 'Inviar nove contrasigno pro';
$lang['resendpwdmissing'] = 'Es necessari completar tote le campos.';
$lang['resendpwdnouser'] = 'Iste usator non ha essite trovate in le base de datos.';
$lang['resendpwdbadauth'] = 'Iste codice de authentication non es valide. Assecura te que tu ha usate le ligamine de confirmation complete.';
@@ -257,21 +255,6 @@ $lang['i_pol0'] = 'Wiki aperte (lectura, scriptura, incargamento
$lang['i_pol1'] = 'Wiki public (lectura pro omnes, scriptura e incargamento pro usatores registrate)';
$lang['i_pol2'] = 'Wiki claudite (lectura, scriptura e incargamento solmente pro usatores registrate)';
$lang['i_retry'] = 'Reprobar';
-$lang['mu_intro'] = 'Hic tu pote incargar plure files insimul. Clicca super le button Navigar pro adder los al cauda. Preme Incargar quando tu ha finite.';
-$lang['mu_gridname'] = 'Nomine de file';
-$lang['mu_gridsize'] = 'Dimension';
-$lang['mu_gridstat'] = 'Stato';
-$lang['mu_namespace'] = 'Spatio de nomines';
-$lang['mu_browse'] = 'Navigar';
-$lang['mu_toobig'] = 'troppo grande';
-$lang['mu_ready'] = 'preste pro incargamento';
-$lang['mu_done'] = 'complete';
-$lang['mu_fail'] = 'fallite';
-$lang['mu_authfail'] = 'session expirate';
-$lang['mu_progress'] = '@PCT@% incargate';
-$lang['mu_filetypes'] = 'Typos de file permittite';
-$lang['mu_info'] = 'files incargate.';
-$lang['mu_lasterr'] = 'Ultime error:';
$lang['recent_global'] = 'Tu observa actualmente le modificationes intra le spatio de nomines <b>%s</b>. Tu pote etiam <a href="%s">vider le modificationes recente de tote le wiki</a>.';
$lang['years'] = '%d annos retro';
$lang['months'] = '%d menses retro';
diff --git a/inc/lang/id-ni/lang.php b/inc/lang/id-ni/lang.php
index 9c04f0259..1a4d03498 100644
--- a/inc/lang/id-ni/lang.php
+++ b/inc/lang/id-ni/lang.php
@@ -38,7 +38,6 @@ $lang['btn_backlink'] = 'Link fangawuli';
$lang['btn_backtomedia'] = 'Angawuli ba filianö Mediafile';
$lang['btn_profile'] = 'Famohouni pörofile';
$lang['btn_reset'] = 'Fawu\'a';
-$lang['btn_resendpwd'] = 'Fa\'ohe\'ö kode sibohou';
$lang['btn_draft'] = 'Fawu\'a wanura';
$lang['btn_draftdel'] = 'Heta zura';
$lang['btn_register'] = 'Fasura\'ö';
@@ -69,7 +68,6 @@ $lang['profnoempty'] = 'Lö tetehegö na lö hadöi töi ma imele.';
$lang['profchanged'] = 'Pörofile zangoguna\'ö no tebohouni.';
$lang['pwdforget'] = 'Hadia olifu\'ö kode? Fuli halö kode';
$lang['resendna'] = 'Lö tetehegi ba wiki da\'a wama\'ohe\'ö kode dua kali.';
-$lang['resendpwd'] = 'Tefa\'ohe\'ö kode sibahou khö';
$lang['resendpwdmissing'] = 'Bologö dödöu, si lö tola lö\'ö öfo\'ösi fefu nahia si tohöna.';
$lang['resendpwdnouser'] = 'Bologö dödöu, lö masöndra zangoguna da\'a ba database.';
$lang['resendpwdconfirm'] = 'No tefaohe\'ö link famaduhu\'ö ba imele.';
diff --git a/inc/lang/id/install.html b/inc/lang/id/install.html
index 9a9a8f1e9..4e288b334 100644
--- a/inc/lang/id/install.html
+++ b/inc/lang/id/install.html
@@ -1,25 +1,25 @@
<p>Halaman ini membatu Anda dalam proses instalasi dan konfigurasi pertama kali
untuk <a href="http://dokuwiki.org">Dokuwiki</a>. Informasi lebih lanjut
-tentang alat instalasi ini tersedia dalam
+tentang alat instalasi ini tersedia dalam
<a href="http://dokuwiki.org/installer">halaman dokumentasi</a> sendiri.</p>
-<p>DokuWIki menggunakan berkas biasa sebagai media penyimpanan halaman wiki
-dan informasi lainnya yang berhubungan dengan halaman tersebut (contoh: gambar,
-indeks pencarian, revisi lama, dll). Agar bisa menggunakannya DokuWiki
+<p>DokuWIki menggunakan berkas biasa sebagai media penyimpanan halaman wiki
+dan informasi lainnya yang berhubungan dengan halaman tersebut (contoh: gambar,
+indeks pencarian, revisi lama, dll). Agar bisa menggunakannya DokuWiki
<strong>harus</strong> memiliki hak akses tulis pada direktori yang menyimpan
berkas-berkas tersebut. Alat instalasi ini tidak dapat melakukan perubahan
konfigurasi hak akses pada direktori. Biasanya harus menggunakan command shell
atau jika Anda pengguna layanan hosting, melalui FTP atau control panel layanan
hosting Anda (misalnya: cPanel). </p>
-<p>Alat instalasi ini akan mengatur konfigurasi DokuWiki Anda untuk
-<acronym title="access control list">ACL</acronym>, yang selanjutnya akan
-memperbolehkan administrator untuk login dan mengakses menu Admin DokuWiki
-untuk menginstal plugin, mengatur pengguna (user), mengatur hak akses ke
+<p>Alat instalasi ini akan mengatur konfigurasi DokuWiki Anda untuk
+<abbr title="access control list">ACL</abbr>, yang selanjutnya akan
+memperbolehkan administrator untuk login dan mengakses menu Admin DokuWiki
+untuk menginstal plugin, mengatur pengguna (user), mengatur hak akses ke
halaman wiki dan perubahan konfigurasi. Ini tidak diawajibkan dalam pengoperasian
DokuWiki, tetapi dapat membuat DokuWiki lebih mudah untuk dipelihara.</p>
<p>Pengguna berpengalaman atau pengguna dengan kebutuhan instalasi khusus silahkan
melihat link <a href="http://dokuwiki.org/install">Panduan Instalasi</a>
-and <a href="http://dokuwiki.org/config">Konfigurasi WIki</a>.
+and <a href="http://dokuwiki.org/config">Konfigurasi WIki</a>.
untuk hal-hal yang berhubungan dengan instalasi dan konfigurasi.</p>
diff --git a/inc/lang/id/lang.php b/inc/lang/id/lang.php
index e8026acee..2302d4f6f 100644
--- a/inc/lang/id/lang.php
+++ b/inc/lang/id/lang.php
@@ -42,7 +42,6 @@ $lang['btn_subscribe'] = 'Ikuti Perubahan';
$lang['btn_unsubscribe'] = 'Berhenti Ikuti Perubahan';
$lang['btn_profile'] = 'Ubah Profil';
$lang['btn_reset'] = 'Reset';
-$lang['btn_resendpwd'] = 'Kirim password baru';
$lang['btn_draft'] = 'Edit draft';
$lang['btn_draftdel'] = 'Hapus draft';
$lang['btn_register'] = 'Daftar';
@@ -74,7 +73,6 @@ $lang['profnoempty'] = 'Mohon mengisikan nama atau alamat email.';
$lang['profchanged'] = 'Profil User berhasil diubah.';
$lang['pwdforget'] = 'Lupa Password? Dapatkan yang baru';
$lang['resendna'] = 'Wiki ini tidak mendukung pengiriman ulang password.';
-$lang['resendpwd'] = 'Kirim password baru untuk';
$lang['resendpwdmissing'] = 'Maaf, Anda harus mengisikan semua field.';
$lang['resendpwdnouser'] = 'Maaf, user ini tidak ditemukan.';
$lang['resendpwdbadauth'] = 'Maaf, kode autentikasi tidak valid. Pastikan Anda menggunakan keseluruhan link konfirmasi.';
@@ -197,14 +195,3 @@ $lang['i_pol0'] = 'Wiki Terbuka (baca, tulis, upload untuk semua
$lang['i_pol1'] = 'Wiki Publik (baca untuk semua orang, tulis dan upload untuk pengguna terdaftar)';
$lang['i_pol2'] = 'Wiki Privat (baca, tulis dan upload hanya untuk pengguna terdaftar)';
$lang['i_retry'] = 'Coba Lagi';
-$lang['mu_gridname'] = 'Nama file';
-$lang['mu_gridsize'] = 'Ukuran';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Namaspace';
-$lang['mu_browse'] = 'Jelajah';
-$lang['mu_ready'] = 'Siap untuk uplod';
-$lang['mu_done'] = 'Selesai';
-$lang['mu_fail'] = 'Gagal';
-$lang['mu_authfail'] = 'sesi habis';
-$lang['mu_progress'] = '@PCT@% uploaded';
-$lang['mu_filetypes'] = 'Izinkan tipe file';
diff --git a/inc/lang/is/lang.php b/inc/lang/is/lang.php
index 0e281e58d..be20da6b3 100644
--- a/inc/lang/is/lang.php
+++ b/inc/lang/is/lang.php
@@ -47,7 +47,6 @@ $lang['btn_subscribe'] = 'Vakta';
$lang['btn_unsubscribe'] = 'Afvakta';
$lang['btn_profile'] = 'Uppfæra notanda';
$lang['btn_reset'] = 'Endurstilla';
-$lang['btn_resendpwd'] = 'Senda nýtt aðgangsorð með tölvupósti';
$lang['btn_draft'] = 'Breyta uppkasti';
$lang['btn_recover'] = 'Endurheimta uppkast';
$lang['btn_draftdel'] = 'Eyða uppkasti';
@@ -82,7 +81,6 @@ $lang['profnoempty'] = 'Það er ekki leyfilegt að skilja nafn og pó
$lang['profchanged'] = 'Notendaupplýsingum breytt';
$lang['pwdforget'] = 'Gleymt aðgangsorð? Fáðu nýtt';
$lang['resendna'] = 'Þessi wiki styður ekki endursendingar aðgangsorðs';
-$lang['resendpwd'] = 'Senda nýtt aðgangsorð fyrir';
$lang['resendpwdmissing'] = 'Afsakið, þú verður að út eyðublaðið allt';
$lang['resendpwdnouser'] = 'Afsakið, notandi finnst ekki.';
$lang['resendpwdbadauth'] = 'Afsakið, þessi sannvottunorð er ekki gild. Gakktu úr skugga um að þú notaðir að ljúka staðfesting hlekkur.';
@@ -185,10 +183,3 @@ $lang['img_format'] = 'Forsnið';
$lang['img_camera'] = 'Myndavél';
$lang['img_keywords'] = 'Lykilorðir';
$lang['i_retry'] = 'Reyna aftur';
-$lang['mu_gridsize'] = 'Stærð';
-$lang['mu_toobig'] = 'of stór';
-$lang['mu_ready'] = 'tilbúin til upphleðslu';
-$lang['mu_done'] = 'lokið';
-$lang['mu_fail'] = 'mistókst';
-$lang['mu_info'] = 'Skrár innhlaðnar.';
-$lang['mu_lasterr'] = 'Síðasta villa:';
diff --git a/inc/lang/it/install.html b/inc/lang/it/install.html
index 3454fbc3e..9d0e57ff8 100644
--- a/inc/lang/it/install.html
+++ b/inc/lang/it/install.html
@@ -3,7 +3,7 @@
procedura di installazione sono reperibili nella
<a href="http://dokuwiki.org/installer">pagina di documentazione</a>.</p>
-<p>DokuWiki utilizza dei normali file per la memorizzazione delle pagine del wiki e
+<p>DokuWiki utilizza dei normali file per la memorizzazione delle pagine del wiki e
delle altre informazioni associate a tali pagine (es. immagini, indici per la ricerca, vecchie
revisioni, ecc.). Per poter operare correttamente DokuWiki
<strong>deve</strong> accedere in scrittura alle directory che contengono tali
@@ -12,7 +12,7 @@ deve normalmente essere fatto direttamente da linea di comando oppure, se stai u
attraverso FTP o dal pannello di controllo del servizio di hosting (es. cPanel).</p>
<p>Questa procedura di installazione imposterà la configurazione di DokuWiki per l'uso di
-<acronym title="lista controllo accessi">ACL</acronym>, che consente all'amministratore di
+<abbr title="lista controllo accessi">ACL</abbr>, che consente all'amministratore di
collegarsi e accedere al menu di amministrazione di DokuWiki per installare plugin, gestire
utenti, gestire gli accessi alle pagine wiki e modificare le impostazioni del wiki.
Non è necessario per il funzionamento di DokuWiki, ma renderà Dokuwiki più facile
diff --git a/inc/lang/it/lang.php b/inc/lang/it/lang.php
index ebbe983de..a415f2a2c 100644
--- a/inc/lang/it/lang.php
+++ b/inc/lang/it/lang.php
@@ -13,6 +13,8 @@
* @author Matteo Carnevali <rekstorm@gmail.com>
* @author Osman Tekin <osman.tekin93@hotmail.it>
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
+ * @author snarchio@gmail.com
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -48,12 +50,14 @@ $lang['btn_backtomedia'] = 'Torna alla selezione file';
$lang['btn_subscribe'] = 'Sottoscrivi modifiche';
$lang['btn_profile'] = 'Aggiorna profilo';
$lang['btn_reset'] = 'Annulla';
-$lang['btn_resendpwd'] = 'Invia nuova password';
+$lang['btn_resendpwd'] = 'Imposta nuova password';
$lang['btn_draft'] = 'Modifica bozza';
$lang['btn_recover'] = 'Ripristina bozza';
$lang['btn_draftdel'] = 'Elimina bozza';
$lang['btn_revert'] = 'Ripristina';
$lang['btn_register'] = 'Registrazione';
+$lang['btn_apply'] = 'Applica';
+$lang['btn_media'] = 'Gestore Media';
$lang['loggedinas'] = 'Collegato come';
$lang['user'] = 'Nome utente';
$lang['pass'] = 'Password';
@@ -83,7 +87,7 @@ $lang['profnoempty'] = 'Nome o indirizzo email vuoti non sono consenti
$lang['profchanged'] = 'Aggiornamento del profilo utente riuscito.';
$lang['pwdforget'] = 'Hai dimenticato la password? Richiedine una nuova';
$lang['resendna'] = 'Questo wiki non supporta l\'invio di nuove password.';
-$lang['resendpwd'] = 'Invia nuova password per';
+$lang['resendpwd'] = 'Imposta nuova password per';
$lang['resendpwdmissing'] = 'Devi riempire tutti i campi.';
$lang['resendpwdnouser'] = 'Impossibile trovare questo utente nel database.';
$lang['resendpwdbadauth'] = 'Spiacenti, questo codice di autorizzazione non è valido. Assicurati di aver usato il link completo di conferma.';
@@ -96,9 +100,10 @@ $lang['searchmedia_in'] = 'Cerca in %s';
$lang['txt_upload'] = 'Seleziona un file da caricare';
$lang['txt_filename'] = 'Carica come (opzionale)';
$lang['txt_overwrt'] = 'Sovrascrivi file esistente';
+$lang['maxuploadsize'] = 'Upload max. %s per ogni file.';
$lang['lockedby'] = 'Attualmente bloccato da';
$lang['lockexpire'] = 'Il blocco scade alle';
-$lang['js']['willexpire'] = 'Il tuo blocco su questa pagina scadrà tra circa un minuto.\nPer evitare incongruenze usa il pulsante di anteprima per prolungare il periodo di blocco.';
+$lang['js']['willexpire'] = 'Il tuo blocco su questa pagina scadrà tra circa un minuto.\nPer evitare incongruenze usa il pulsante di anteprima per prolungare il periodo di blocco.';
$lang['js']['notsavedyet'] = 'Le modifiche non salvate andranno perse.';
$lang['js']['searchmedia'] = 'Cerca file';
$lang['js']['keepopen'] = 'Tieni la finestra aperta durante la selezione';
@@ -129,6 +134,15 @@ $lang['js']['nosmblinks'] = 'I collegamenti con le risorse condivise di Win
$lang['js']['linkwiz'] = 'Collegamento guidato';
$lang['js']['linkto'] = 'Collega a:';
$lang['js']['del_confirm'] = 'Eliminare veramente questa voce?';
+$lang['js']['restore_confirm'] = 'Vuoi davvero ripristinare questa versione?';
+$lang['js']['media_diff'] = 'Guarda le differenze:';
+$lang['js']['media_diff_both'] = 'Fianco a Fianco';
+$lang['js']['media_select'] = 'Seleziona files..';
+$lang['js']['media_upload_btn'] = 'Upload';
+$lang['js']['media_done_btn'] = 'Fatto';
+$lang['js']['media_drop'] = 'Sgancia i files qui per caricarli';
+$lang['js']['media_cancel'] = 'rimuovi';
+$lang['js']['media_overwrt'] = 'Sovrascrivi i file esistenti';
$lang['rssfailed'] = 'Si è verificato un errore cercando questo feed: ';
$lang['nothingfound'] = 'Nessun risultato trovato.';
$lang['mediaselect'] = 'Selezione dei file';
@@ -163,6 +177,9 @@ $lang['yours'] = 'la tua versione';
$lang['diff'] = 'differenze con la versione attuale';
$lang['diff2'] = 'differenze tra le versioni selezionate';
$lang['difflink'] = 'Link a questa pagina di confronto';
+$lang['diff_type'] = 'Guarda le differenze:';
+$lang['diff_inline'] = 'In linea';
+$lang['diff_side'] = 'Fianco a Fianco';
$lang['line'] = 'Linea';
$lang['breadcrumb'] = 'Traccia';
$lang['youarehere'] = 'Ti trovi qui';
@@ -175,11 +192,20 @@ $lang['external_edit'] = 'modifica esterna';
$lang['summary'] = 'Oggetto della modifica';
$lang['noflash'] = 'E\' necessario <a href="http://www.adobe.com/products/flashplayer/">il plugin Adobe Flash</a> per visualizzare questo contenuto.';
$lang['download'] = 'Scarica lo "snippet"';
+$lang['tools'] = 'Strumenti';
+$lang['user_tools'] = 'Strumenti Utente';
+$lang['site_tools'] = 'Strumenti Sito';
+$lang['page_tools'] = 'Strumenti Pagina';
+$lang['skip_to_content'] = 'salta al contenuto';
+$lang['sidebar'] = 'Barra laterale';
$lang['mail_newpage'] = 'pagina aggiunta:';
$lang['mail_changed'] = 'pagina modificata:';
$lang['mail_subscribe_list'] = 'pagine modificate nella categoria:';
$lang['mail_new_user'] = 'nuovo utente:';
$lang['mail_upload'] = 'file caricato:';
+$lang['changes_type'] = 'Guarda cambiamenti di';
+$lang['pages_changes'] = 'Pagine';
+$lang['both_changes'] = 'Sia pagine che media files';
$lang['qb_bold'] = 'Grassetto';
$lang['qb_italic'] = 'Corsivo';
$lang['qb_underl'] = 'Sottolineato';
@@ -220,6 +246,9 @@ $lang['img_copyr'] = 'Copyright';
$lang['img_format'] = 'Formato';
$lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Parole chiave';
+$lang['img_width'] = 'Larghezza';
+$lang['img_height'] = 'Altezza';
+$lang['img_manager'] = 'Guarda nel gestore media';
$lang['subscr_subscribe_success'] = 'Aggiunto %s alla lista di sottoscrizioni %s';
$lang['subscr_subscribe_error'] = 'Impossibile aggiungere %s alla lista di sottoscrizioni %s';
$lang['subscr_subscribe_noaddress'] = 'Non esiste alcun indirizzo associato al tuo account, non puoi essere aggiunto alla lista di sottoscrizioni';
@@ -238,6 +267,7 @@ $lang['subscr_style_digest'] = 'email riassuntiva delle modifiche di ogni pagi
$lang['subscr_style_list'] = 'elenco delle pagine modificate dall\'ultima email';
$lang['authmodfailed'] = 'La configurazione dell\'autenticazione non è corretta. Informa l\'amministratore di questo wiki.';
$lang['authtempfail'] = 'L\'autenticazione è temporaneamente non disponibile. Se questa situazione persiste, informa l\'amministratore di questo wiki.';
+$lang['authpwdexpire'] = 'La tua password scadrà in %d giorni, dovresti cambiarla quanto prima.';
$lang['i_chooselang'] = 'Scegli la lingua';
$lang['i_installer'] = 'Installazione di DokuWiki';
$lang['i_wikiname'] = 'Nome Wiki';
@@ -262,21 +292,6 @@ $lang['i_pol1'] = 'Wiki Pubblico (lettura per tutti, scrittura e
$lang['i_pol2'] = 'Wiki Chiuso (lettura, scrittura, caricamento file solamente per gli utenti registrati)';
$lang['i_retry'] = 'Riprova';
$lang['i_license'] = 'Per favore scegli la licenza sotto cui vuoi rilasciare il contenuto:';
-$lang['mu_intro'] = 'Qui si possono caricare più di un file alla volta. Scegliere "Sfoglia..." per aggiungere file alla coda. Alla fine, fai click su "Invia file".';
-$lang['mu_gridname'] = 'Nome file';
-$lang['mu_gridsize'] = 'Dimensione';
-$lang['mu_gridstat'] = 'Stato';
-$lang['mu_namespace'] = 'Categoria';
-$lang['mu_browse'] = 'Sfoglia';
-$lang['mu_toobig'] = 'troppo grande';
-$lang['mu_ready'] = 'pronto per caricare';
-$lang['mu_done'] = 'completo';
-$lang['mu_fail'] = 'fallito';
-$lang['mu_authfail'] = 'sessione scaduta';
-$lang['mu_progress'] = '@PCT@% caricato';
-$lang['mu_filetypes'] = 'Tipi di file permessi';
-$lang['mu_info'] = 'file caricati.';
-$lang['mu_lasterr'] = 'Ultimo errore:';
$lang['recent_global'] = 'Stai attualmente vedendo le modifiche effettuate nell\'area <b>%s</b>. Puoi anche <a href="%s">vedere le modifiche recenti dell\'intero wiki</a>.';
$lang['years'] = '%d anni fa';
$lang['months'] = '%d mesi fa';
@@ -286,3 +301,24 @@ $lang['hours'] = '%d ore fa';
$lang['minutes'] = '%d minuti fa';
$lang['seconds'] = '%d secondi fa';
$lang['wordblock'] = 'La modifica non è stata salvata perché contiene testo bloccato (spam).';
+$lang['media_uploadtab'] = 'Upload';
+$lang['media_searchtab'] = 'Cerca';
+$lang['media_file'] = 'File';
+$lang['media_viewtab'] = 'Guarda';
+$lang['media_edittab'] = 'Modifica';
+$lang['media_historytab'] = 'Storia';
+$lang['media_list_thumbs'] = 'Miniatura';
+$lang['media_list_rows'] = 'Righe';
+$lang['media_sort_name'] = 'Nome';
+$lang['media_sort_date'] = 'Data';
+$lang['media_namespaces'] = 'Scegli il namespace';
+$lang['media_files'] = 'File in %s';
+$lang['media_upload'] = 'Upload al %s';
+$lang['media_search'] = 'Cerca in %s';
+$lang['media_view'] = '%s';
+$lang['media_edit'] = 'Modifica %s';
+$lang['media_history'] = 'Storia di %s';
+$lang['media_perm_read'] = 'Spiacente, non hai abbastanza privilegi per leggere i files.';
+$lang['media_perm_upload'] = 'Spiacente, non hai abbastanza privilegi per caricare files.';
+$lang['media_update'] = 'Carica nuova versione';
+$lang['media_restore'] = 'Ripristina questa versione';
diff --git a/inc/lang/it/mailwrap.html b/inc/lang/it/mailwrap.html
new file mode 100644
index 000000000..24a2bc8a9
--- /dev/null
+++ b/inc/lang/it/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Questa email è stata generata da DokuWiki presso @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/it/resetpwd.txt b/inc/lang/it/resetpwd.txt
new file mode 100644
index 000000000..450dd8301
--- /dev/null
+++ b/inc/lang/it/resetpwd.txt
@@ -0,0 +1 @@
+Inserisci perfavore una nuova password per il tuo account su questo wiki. \ No newline at end of file
diff --git a/inc/lang/ja/install.html b/inc/lang/ja/install.html
index 7439d27e1..3a1d0d409 100644
--- a/inc/lang/ja/install.html
+++ b/inc/lang/ja/install.html
@@ -7,7 +7,7 @@
ホスティングサービスを利用している場合はそのコントロールパネルもしくはFTPを通して、権限の変更を行ってください。</p>
<p>DokuWikiは、プラグイン、ユーザー、Wikiページへのアクセス制限、設定の変更を管理する機能を有しており、
-その機能を有効にするために必要な <acronym title="access control list">ACL</acronym> の設定が、このインストーラーによって行われます。
+その機能を有効にするために必要な <abbr title="access control list">ACL</abbr> の設定が、このインストーラーによって行われます。
この管理機能は、DokuWikiを使用する上で必要ではありませんが、DokuWikiの管理を簡単にしてくれます。</p>
<p>従来のバージョンを使用しているユーザーや特別なセットアップが必要な場合は、次のリンク先を参考にして下さい
diff --git a/inc/lang/ja/lang.php b/inc/lang/ja/lang.php
index 15c1e7dd6..791ef9a6e 100644
--- a/inc/lang/ja/lang.php
+++ b/inc/lang/ja/lang.php
@@ -7,6 +7,7 @@
* @author Ikuo Obataya <i.obataya@gmail.com>
* @author Daniel Dupriest <kououken@gmail.com>
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ * @author Taisuke Shimamoto <dentostar@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -42,7 +43,7 @@ $lang['btn_backtomedia'] = 'メディアファイル選択に戻る';
$lang['btn_subscribe'] = '変更履歴配信の登録';
$lang['btn_profile'] = 'ユーザー情報の更新';
$lang['btn_reset'] = 'リセット';
-$lang['btn_resendpwd'] = 'パスワード再発行';
+$lang['btn_resendpwd'] = '新しいパスワードをセット';
$lang['btn_draft'] = 'ドラフトを編集';
$lang['btn_recover'] = 'ドラフトを復元';
$lang['btn_draftdel'] = 'ドラフトを削除';
@@ -79,7 +80,7 @@ $lang['profnoempty'] = 'ユーザー名とメールアドレスを入
$lang['profchanged'] = 'ユーザー情報は更新されました。';
$lang['pwdforget'] = 'パスワードをお忘れですか?パスワード再発行';
$lang['resendna'] = 'パスワードの再発行は出来ません。';
-$lang['resendpwd'] = '新しいパスワードを送信します:';
+$lang['resendpwd'] = '新しいパスワードをセット';
$lang['resendpwdmissing'] = '全ての項目を入力して下さい。';
$lang['resendpwdnouser'] = '入力されたユーザーが見つかりませんでした。';
$lang['resendpwdbadauth'] = '申し訳ありません。この確認コードは有効ではありません。メール内に記載されたリンクを確認してください。';
@@ -185,6 +186,11 @@ $lang['external_edit'] = '外部編集';
$lang['summary'] = '編集の概要';
$lang['noflash'] = 'この内容を表示するためには <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> が必要です。';
$lang['download'] = 'この部分をダウンロード';
+$lang['tools'] = 'ツール';
+$lang['user_tools'] = 'ユーザ用ツール';
+$lang['site_tools'] = 'サイト用ツール';
+$lang['page_tools'] = 'ページ用ツール';
+$lang['skip_to_content'] = '内容へ移動';
$lang['mail_newpage'] = '文書の追加:';
$lang['mail_changed'] = '文書の変更:';
$lang['mail_subscribe_list'] = '名前空間内でページが変更:';
@@ -255,6 +261,7 @@ $lang['subscr_style_digest'] = 'それぞれのページへの変更の要約
$lang['subscr_style_list'] = '前回のメールから変更されたページをリスト(%.2f 日毎)';
$lang['authmodfailed'] = 'ユーザー認証の設定が正しくありません。Wikiの管理者に連絡して下さい。';
$lang['authtempfail'] = 'ユーザー認証が一時的に使用できなくなっています。この状態が続いているようであれば、Wikiの管理者に連絡して下さい。';
+$lang['authpwdexpire'] = 'あなたのパスワードは、あと%d日で有効期限が切れます。パスワードを変更してください。';
$lang['i_chooselang'] = '使用言語を選択してください';
$lang['i_installer'] = 'DokuWiki インストーラー';
$lang['i_wikiname'] = 'Wiki名';
@@ -279,21 +286,6 @@ $lang['i_pol1'] = 'パブリック Wiki(閲覧は全ての人
$lang['i_pol2'] = 'クローズド Wiki (登録ユーザーにのみ使用を許可)';
$lang['i_retry'] = '再試行';
$lang['i_license'] = 'あなたが作成したコンテンツが属するライセンスを選択してください:';
-$lang['mu_intro'] = '複数のファイルを一度にアップロードできます。ブラウズボタンをクリックしてファイルを追加してください。追加したら、アップロードボタンをクリックしてください。';
-$lang['mu_gridname'] = 'ファイル名';
-$lang['mu_gridsize'] = 'サイズ';
-$lang['mu_gridstat'] = 'ステータス';
-$lang['mu_namespace'] = '名前空間';
-$lang['mu_browse'] = 'ブラウズ';
-$lang['mu_toobig'] = '大きすぎます';
-$lang['mu_ready'] = 'アップロードできます';
-$lang['mu_done'] = '完了';
-$lang['mu_fail'] = '失敗';
-$lang['mu_authfail'] = 'セッション期限切れ';
-$lang['mu_progress'] = '@PCT@% アップロード完了';
-$lang['mu_filetypes'] = '使用できるファイル形式';
-$lang['mu_info'] = 'ファイルアップロード完了';
-$lang['mu_lasterr'] = '直近のエラー:';
$lang['recent_global'] = '現在、<b>%s</b> 名前空間内の変更点を閲覧中です。<a href="%s">Wiki全体の最近の変更点を確認する</a>ことも可能です。';
$lang['years'] = '%d年前';
$lang['months'] = '%dカ月前';
@@ -326,4 +318,3 @@ $lang['media_perm_read'] = 'ファイルを閲覧する権限がありま
$lang['media_perm_upload'] = 'ファイルをアップロードする権限がありません。';
$lang['media_update'] = '新しいバージョンをアップロード';
$lang['media_restore'] = 'このバージョンを復元';
-$lang['plugin_install_err'] = 'プラグインが正しくインストールされませんでした。プラグインのディレクトリ名を \'%s\' から \'%s\' に変更してください。';
diff --git a/inc/lang/ja/resetpwd.txt b/inc/lang/ja/resetpwd.txt
new file mode 100644
index 000000000..a414af991
--- /dev/null
+++ b/inc/lang/ja/resetpwd.txt
@@ -0,0 +1,3 @@
+====== 新しいパスワードをセット ======
+
+このWikiでの、あなたのアカウント用の新しいパスワードを入力して下さい \ No newline at end of file
diff --git a/inc/lang/kk/lang.php b/inc/lang/kk/lang.php
index 9738ae51c..3ff5ae455 100644
--- a/inc/lang/kk/lang.php
+++ b/inc/lang/kk/lang.php
@@ -38,7 +38,6 @@ $lang['btn_backtomedia'] = 'Медиафайлды таңдауға қай
$lang['btn_subscribe'] = 'Жазылуларды басқару';
$lang['btn_profile'] = 'Профильді жаңарту';
$lang['btn_reset'] = 'Түсіру';
-$lang['btn_resendpwd'] = 'Жаңа құпиясөзді жіберу';
$lang['btn_draft'] = 'Шимайды өңдеу';
$lang['btn_recover'] = 'Шимайды қайтару';
$lang['btn_draftdel'] = 'Шимайды өшіру';
@@ -73,7 +72,6 @@ $lang['profnoempty'] = 'Бос есім не email рұқсат еті
$lang['profchanged'] = 'Пайдаланушы профилі сәтті жаңартылған.';
$lang['pwdforget'] = 'Құпиясөзіңізді ұмыттыңызба? Жаңадан біреуін алыңыз';
$lang['resendna'] = 'Бұл wiki құпиясөзді қайта жіберуді қолдамайды.';
-$lang['resendpwd'] = 'Келесіге жаңа құпиясөзді жіберу ';
$lang['resendpwdmissing'] = 'Кешіріңіз, барлық тармақтары толтыруыңыз керек.';
$lang['resendpwdnouser'] = 'Кешіріңіз, бұл пайдаланушыны дерекқорымызда тапқан жоқпыз.';
$lang['resendpwdbadauth'] = 'Кешіріңіз, бұл түпнұсқалық коды бұрыс. Толық растау сілтемені пайдалануыңызды тексеріңіз.';
diff --git a/inc/lang/km/lang.php b/inc/lang/km/lang.php
index 68587e90f..6a5fa223f 100644
--- a/inc/lang/km/lang.php
+++ b/inc/lang/km/lang.php
@@ -39,7 +39,6 @@ $lang['btn_subscribe'] = 'ដាក់ដំណឹងផ្លស់ប្ត
$lang['btn_unsubscribe'] = 'ដកដំណឹងផ្លស់ប្តូរ';
$lang['btn_profile'] = 'កែប្រវត្តិរូប';
$lang['btn_reset'] = 'កមណត់ឡើងរិញ';
-$lang['btn_resendpwd'] = 'ផ្ញើពាក្សសម្ងាត់';
$lang['btn_draft'] = 'កែគំរោង';
$lang['btn_recover'] = 'ស្រោះគំរោងឡើង';
$lang['btn_draftdel'] = 'លុបគំរោង';
@@ -76,7 +75,6 @@ $lang['profchanged'] = 'ប្រវត្តិរូបអ្នកប្រ
$lang['pwdforget'] = 'ភ្លិចពាក្សសម្ងាត់ យកមួយទាត។';
$lang['resendna'] = 'វីគីនេះមិនឧបរំផ្ញើពាក្សសម្ងាតម្ដងទៀតទេ។';
-$lang['resendpwd'] = 'ផ្ញើពាក្សសម្ងាតឲ្យ';
$lang['resendpwdmissing'] = 'សុំអាទោស​ អ្នកត្រវបំពេញវាល។';
$lang['resendpwdnouser'] = 'សុំអាទោស​ យាងរកអ្នកប្រើមិនឃើងទេ។';
$lang['resendpwdbadauth'] = 'សុំអាទោស​ រហស្សលេខអនុញ្ញាតពំអាចប្រើបានទេ។ ខ្សែបន្ត';
diff --git a/inc/lang/ko/admin.txt b/inc/lang/ko/admin.txt
index 7dd0f58b3..c61db1a42 100644
--- a/inc/lang/ko/admin.txt
+++ b/inc/lang/ko/admin.txt
@@ -1,4 +1,3 @@
====== 관리 작업 ======
-DokuWiki에서 사용가능한 관리 작업 목록을 아래에서 찾을 수 있습니다.
-
+DokuWiki에서 사용 가능한 관리 작업 목록을 아래에서 찾을 수 있습니다. \ No newline at end of file
diff --git a/inc/lang/ko/backlinks.txt b/inc/lang/ko/backlinks.txt
index 1711945e4..ce77ca5a7 100644
--- a/inc/lang/ko/backlinks.txt
+++ b/inc/lang/ko/backlinks.txt
@@ -1,4 +1,3 @@
-====== 백링크 ======
-
-현재 페이지로 백링크되는 페이지 목록입니다.
+====== 가리키는 링크 ======
+현재 문서를 가리키는 링크가 있는 문서 목록입니다.
diff --git a/inc/lang/ko/conflict.txt b/inc/lang/ko/conflict.txt
index 529296359..43988a62b 100644
--- a/inc/lang/ko/conflict.txt
+++ b/inc/lang/ko/conflict.txt
@@ -1,6 +1,5 @@
====== 새 버전 있음 ======
-편집하신 문서의 새 버전이 있습니다. 당신이 편집하고 있는 동안 다른 사람이 동일한 파일을 편집하였을 경우 이런 일이 생길 수 있습니다.
-
-아래의 차이점을 면밀히 검토하시고, 어떤 버전을 저장하실지 결정하십시오. **저장**을 선택하시면, 당신의 버전이 저장됩니다. **취소** 를 선택하시면 현재 버전이 유지됩니다.
+편집한 문서의 새 버전이 있습니다. 당신이 편집하고 있는 동안 다른 사람이 같은 파일을 편집하였을 경우 이런 일이 생길 수 있습니다.
+아래의 차이를 철저하게 검토하고 어떤 버전을 저장하실지 결정하십시오. **저장**을 선택하면, 당신의 버전이 저장됩니다. **취소**를 선택하면 현재 버전이 유지됩니다. \ No newline at end of file
diff --git a/inc/lang/ko/denied.txt b/inc/lang/ko/denied.txt
index 316a660c0..f384a0a8c 100644
--- a/inc/lang/ko/denied.txt
+++ b/inc/lang/ko/denied.txt
@@ -1,4 +1,3 @@
====== 권한 거절 ======
-계속할 수 있는 권한이 없습니다. 로그인하십시오.
-
+계속할 수 있는 권한이 없습니다. 로그인하십시오. \ No newline at end of file
diff --git a/inc/lang/ko/diff.txt b/inc/lang/ko/diff.txt
index 8cfb1da43..76b488d90 100644
--- a/inc/lang/ko/diff.txt
+++ b/inc/lang/ko/diff.txt
@@ -1,5 +1,3 @@
-====== 차이점 ======
-
-이 페이지의 선택한 이전 버전과 현재 버전 사이의 차이점을 보여줍니다.
-
+====== 차이 ======
+이 문서의 선택한 이전 버전과 현재 버전 사이의 차이를 보여줍니다. \ No newline at end of file
diff --git a/inc/lang/ko/draft.txt b/inc/lang/ko/draft.txt
index 3df8a5e86..861834e5d 100644
--- a/inc/lang/ko/draft.txt
+++ b/inc/lang/ko/draft.txt
@@ -1,6 +1,5 @@
-====== 문서 초안이 있습니다. ======
+====== 문서 초안 있음 ======
-이 페이지의 마지막 편집 세션은 정상적으로 끝나지 않았습니다. DokuWiki는 작업 도중 자동으로 저장된 문서 초안을 사용하여 편집을 계속 할 수 있습니다. 마지막 세션동안 저장된 문서 초안을 아래에서 볼 수 있습니다.
-
-확실하게 비정상적으로 종료된 세션을 //복구//할지 여부를 결정하고, 자동으로 저장되었던 초안을 //삭제//하거나 편집 과정을 취소하기 바랍니다.
+이 문서의 마지막 편집 세션은 정상적으로 끝나지 않았습니다. DokuWiki는 작업 도중 자동으로 저장된 문서 초안을 사용하여 편집을 계속 할 수 있습니다. 마지막 세션 동안 저장된 문서 초안을 아래에서 볼 수 있습니다.
+비정상적으로 끝난 편집 세션을 **복구**할지 여부를 결정하고, 자동으로 저장되었던 초안을 **삭제**하거나 편집 과정을 **취소**하기 바랍니다. \ No newline at end of file
diff --git a/inc/lang/ko/edit.txt b/inc/lang/ko/edit.txt
index 9b59524f7..f52326a33 100644
--- a/inc/lang/ko/edit.txt
+++ b/inc/lang/ko/edit.txt
@@ -1,2 +1 @@
-페이지를 편집하고 **저장**을 누르십시오. 위키 구문은 [[wiki:syntax]] 혹은 [[wiki:ko_syntax|(한글) 구문]]을 참고하십시오. 이 페이지를 **더 낫게 만들 자신이 있을** 때에만 편집하십시오. 실험을 하고 싶을 때에는, 먼저 [[playground:playground|연습장]] 에 가서 연습해 보십시오.
-
+문서를 편집하고 **저장**을 누르세요. 위키 구문은 [[wiki:syntax]] 또는 [[wiki:ko_syntax|(한국어) 구문]]을 참고하세요. 이 문서를 **더 좋게 만들 자신이 있을 때**에만 편집하세요. 연습을 하고 싶다면 먼저 [[playground:playground|연습장]]에 가서 연습하세요.
diff --git a/inc/lang/ko/editrev.txt b/inc/lang/ko/editrev.txt
index 2715448d3..136eef733 100644
--- a/inc/lang/ko/editrev.txt
+++ b/inc/lang/ko/editrev.txt
@@ -1,2 +1,2 @@
-**문서의 이전 버전을 선택하였습니다!** 저장할 경우 이 자료의 새 버전을 만듭니다.
+**문서의 이전 버전을 선택하였습니다!** 저장할 경우 이 데이터로 새 버전을 만듭니다.
---- \ No newline at end of file
diff --git a/inc/lang/ko/index.txt b/inc/lang/ko/index.txt
index 7ca9488e0..24eb9450c 100644
--- a/inc/lang/ko/index.txt
+++ b/inc/lang/ko/index.txt
@@ -1,4 +1,3 @@
-====== Index ======
-
-이 페이지는 [[doku>namespaces|네임스페이스]] 에서 정렬한 모든 페이지의 목록입니다.
+====== 사이트맵 ======
+이 페이지는 [[doku>namespaces|이름공간]]에서 정렬한 모든 문서의 목록입니다. \ No newline at end of file
diff --git a/inc/lang/ko/install.html b/inc/lang/ko/install.html
index 6b1bfaf75..f73b91294 100644
--- a/inc/lang/ko/install.html
+++ b/inc/lang/ko/install.html
@@ -1,17 +1,15 @@
<p>이 페이지는 <a href="http://dokuwiki.org">Dokuwiki</a> 설치와 환경 설정을 도와줍니다.
-. 설치 과정에 대한 더 자세한 정보는 <a href="http://dokuwiki.org/ko:install">한글 설치문서</a>와
-<a href="http://dokuwiki.org/install">영문 설치문서</a>를 참고하기 바랍니다.
-</p>
+설치 과정에 대한 더 자세한 정보는 <a href="http://dokuwiki.org/ko:install">(한국어) 설치 문서</a>와
+<a href="http://dokuwiki.org/install">(영어) 설치 문서</a>를 참고하기 바랍니다.</p>
-<p>DokuWiki는 위키 페이지와 페이지와 관련된 정보(그림,색인, 이전 버전 문서 등등)를 저장하기 위해 일반적인 텍스트 파일들을 사용합니다. 정상적으로 DokuWiki를 사용하려면 이 파일들을 담고 있는 디렉토리들에 대한 쓰기 권한을 가지고 있어야 합니다.
-현재 설치 과정 중에는 디렉토리 권한 설정이 불가능합니다. 보통 직접 쉘 명령어를 사용하거나, 호스팅을 사용한다면 FTP나 호스팅 제어판(예. CPanel)을 사용해서 설정해야 합니다.</p>
+<p>DokuWiki는 위키 문서와 문서와 관련된 정보(예를 들어 그림, 검색 색인, 이전 버전 문서)를 저장하기 위해 일반적인 텍스트 파일을 사용합니다. 정상적으로 DokuWiki를 사용하려면 이 파일을 담고 있는 디렉토리에 대한 쓰기 권한을 가지고 있어야 합니다.
+현재 설치 과정 중에는 디렉토리 권한 설정이 불가능합니다. 보통 직접 쉘 명령어를 사용하거나, 호스팅을 사용한다면 FTP나 호스팅 제어판(예를 들어 CPanel)을 사용해서 설정해야 합니다.</p>
-<p>현재 설치 과정중에 관리자로 로그인 후 DokuWiki의 관리 메뉴(플러그인 설치, 사용자 관리, 위키 페이지 접근 권한 관리, 옵션 설정)를 가능하게 <acronym title="접근 제어 목록">ACL</acronym>에 대한 환경 설정을 수행합니다.
-이 것은 DokuWiki가 동작하는데 필요한 사항은 아니지만, 어찌되었든 더 쉽게 관리자가 관리할 수 있도록 해줍니다.</p>
+<p>현재 설치 과정중에 관리자로 로그인 후 DokuWiki의 관리 메뉴(플러그인 설치, 사용자 관리, 위키 문서 접근 권한 관리, 옵션 설정)를 가능하게 <acronym title="접근 제어 목록">ACL</acronym>에 대한 환경 설정을 수행합니다.
+이 것은 DokuWiki가 동작하는데 필요한 사항은 아니지만, 어쨌든 더 쉽게 관리자가 관리할 수 있도록 해줍니다.</p>
-<p>숙련된 사용자들이나 특별한 설치 과정이 필요한 경우에 다음 링크들을 참조하기 바랍니다:
-<a href="http://dokuwiki.org/ko:install">설치 과정(한글)</a>
-과 <a href="http://dokuwiki.org/ko:config">환경 설정(한글),</a>
-<a href="http://dokuwiki.org/install">설치 과정(영문)</a>
-과 <a href="http://dokuwiki.org/config">환경 설정(영문)</a>
-</p>
+<p>숙련된 사용자나 특별한 설치 과정이 필요한 경우에 다음 링크를 참고하기 바랍니다:
+<a href="http://dokuwiki.org/ko:install">설치 과정 (한국어)</a>
+과 <a href="http://dokuwiki.org/ko:config">환경 설정 (한국어),</a>
+<a href="http://dokuwiki.org/install">설치 과정 (영어)</a>
+과 <a href="http://dokuwiki.org/config">환경 설정 (영어)</a></p>
diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php
index 91825c797..64507fa81 100644
--- a/inc/lang/ko/lang.php
+++ b/inc/lang/ko/lang.php
@@ -8,6 +8,8 @@
* @author dongnak@gmail.com
* @author Song Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
+ * @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -16,21 +18,21 @@ $lang['doublequoteclosing'] = '”';
$lang['singlequoteopening'] = '‘';
$lang['singlequoteclosing'] = '’';
$lang['apostrophe'] = '’';
-$lang['btn_edit'] = '페이지 편집';
-$lang['btn_source'] = '소스 보기';
-$lang['btn_show'] = '페이지 보기';
-$lang['btn_create'] = '페이지 만들기';
+$lang['btn_edit'] = '문서 편집';
+$lang['btn_source'] = '내용 보기';
+$lang['btn_show'] = '문서 보기';
+$lang['btn_create'] = '문서 만들기';
$lang['btn_search'] = '찾기';
$lang['btn_save'] = '저장';
-$lang['btn_preview'] = '미리보기';
-$lang['btn_top'] = '맨위로';
+$lang['btn_preview'] = '미리 보기';
+$lang['btn_top'] = '맨 위로';
$lang['btn_newer'] = '<< 최근';
$lang['btn_older'] = '이전 >>';
-$lang['btn_revs'] = '이전 버전들';
-$lang['btn_recent'] = '최근 변경 목록';
-$lang['btn_upload'] = '업로드';
+$lang['btn_revs'] = '이전 버전';
+$lang['btn_recent'] = '최근 바뀜';
+$lang['btn_upload'] = '올리기';
$lang['btn_cancel'] = '취소';
-$lang['btn_index'] = '색인';
+$lang['btn_index'] = '사이트맵';
$lang['btn_secedit'] = '편집';
$lang['btn_login'] = '로그인';
$lang['btn_logout'] = '로그아웃';
@@ -38,67 +40,69 @@ $lang['btn_admin'] = '관리';
$lang['btn_update'] = '변경';
$lang['btn_delete'] = '삭제';
$lang['btn_back'] = '뒤로';
-$lang['btn_backlink'] = '이전 링크';
+$lang['btn_backlink'] = '가리키는 링크';
$lang['btn_backtomedia'] = '미디어 파일 선택으로 돌아가기';
-$lang['btn_subscribe'] = '구독 신청';
-$lang['btn_profile'] = '개인정보 변경';
+$lang['btn_subscribe'] = '구독 관리';
+$lang['btn_profile'] = '개인 정보 변경';
$lang['btn_reset'] = '초기화';
-$lang['btn_resendpwd'] = '새 패스워드 보내기';
-$lang['btn_draft'] = '문서초안 편집';
-$lang['btn_recover'] = '문서초안 복구';
-$lang['btn_draftdel'] = '문서초안 삭제';
+$lang['btn_resendpwd'] = '새 비밀번호 설정';
+$lang['btn_draft'] = '문서 초안 편집';
+$lang['btn_recover'] = '문서 초안 복구';
+$lang['btn_draftdel'] = '문서 초안 삭제';
$lang['btn_revert'] = '복원';
$lang['btn_register'] = '등록';
+$lang['btn_apply'] = '적용';
+$lang['btn_media'] = '미디어 관리';
$lang['loggedinas'] = '다음 사용자로 로그인';
-$lang['user'] = '사용자';
-$lang['pass'] = '패스워드';
-$lang['newpass'] = '새로운 패스워드';
-$lang['oldpass'] = '현재 패스워드 확인';
-$lang['passchk'] = '패스워드 다시 확인';
+$lang['user'] = '사용자 이름';
+$lang['pass'] = '비밀번호';
+$lang['newpass'] = '새 비밀번호';
+$lang['oldpass'] = '현재 비밀번호 확인';
+$lang['passchk'] = '비밀번호 다시 확인';
$lang['remember'] = '기억하기';
$lang['fullname'] = '실제 이름';
$lang['email'] = '이메일';
$lang['profile'] = '개인 정보';
-$lang['badlogin'] = '잘못된 사용자 이름이거나 패스워드입니다.';
-$lang['minoredit'] = '일부 내용 변경';
-$lang['draftdate'] = '문서 초안 자동저장 시간';
-$lang['nosecedit'] = '페이지가 수정되어 섹션정보가 달라져 페이지 전부를 다시 읽습니다.';
+$lang['badlogin'] = '잘못된 사용자 이름이거나 비밀번호입니다.';
+$lang['minoredit'] = '사소한 바뀜';
+$lang['draftdate'] = '문서 초안 자동 저장 시간';
+$lang['nosecedit'] = '문서가 수정되어 세션 정보의 유효 시간이 지나 문서 전부를 다시 읽습니다.';
$lang['regmissing'] = '모든 항목을 입력해야 합니다.';
$lang['reguexists'] = '같은 이름을 사용하는 사용자가 있습니다.';
-$lang['regsuccess'] = '사용자를 만들었습니다. 패스워드는 이메일로 보냈습니다.';
+$lang['regsuccess'] = '사용자를 만들었으며 비밀번호는 이메일로 보냈습니다.';
$lang['regsuccess2'] = '사용자를 만들었습니다.';
-$lang['regmailfail'] = '패스워드를 이메일로 전송할 때 오류가 발생했습니다. 관리자에게 문의하기 바랍니다!';
-$lang['regbadmail'] = '이메일 주소가 틀렸습니다. - 오류라고 생각되면 관리자에게 문의하기 바랍니다.';
-$lang['regbadpass'] = '새로운 패스워드들이 일치하지 않습니다. 다시 입력하기 바랍니다.';
-$lang['regpwmail'] = 'DokuWiki 패스워드';
-$lang['reghere'] = '아직 등록하지 않았다면 등록하기 바랍니다.';
-$lang['profna'] = '이 위키는 개인 정보 수정을 허용하지 않습니다.';
-$lang['profnochange'] = '변경사항이 없습니다.';
+$lang['regmailfail'] = '비밀번호를 이메일로 전송할 때 오류가 발생했습니다. 관리자에게 문의하기 바랍니다!';
+$lang['regbadmail'] = '이메일 주소가 잘못됐습니다 - 오류라고 생각하면 관리자에게 문의하기 바랍니다.';
+$lang['regbadpass'] = '새 비밀번호가 일치하지 않습니다. 다시 입력하기 바랍니다.';
+$lang['regpwmail'] = 'DokuWiki 비밀번호';
+$lang['reghere'] = '계정이 없나요? 계정을 등록할 수 있습니다';
+$lang['profna'] = '이 위키는 개인 정보 수정을 허용하지 않습니다';
+$lang['profnochange'] = '바뀐 사항이 없습니다.';
$lang['profnoempty'] = '이름이나 이메일 주소가 비었습니다.';
-$lang['profchanged'] = '개인정보 변경이 성공했습니다.';
-$lang['pwdforget'] = '패스워드를 잊어버린 경우 새로 발급받을 수 있습니다.';
-$lang['resendna'] = '이 위키는 패스워드 재발급을 지원하지 않습니다.';
-$lang['resendpwd'] = '새로운 패스워드를 보냅니다.';
-$lang['resendpwdmissing'] = '새로운 패스워드를 입력해야햡니다.';
-$lang['resendpwdnouser'] = '등록된 사용자가 아닙니다. 다시 확인 바랍니다.';
-$lang['resendpwdbadauth'] = '인증 코드가 틀립니다. 잘못된 링크인지 확인 바랍니다.';
+$lang['profchanged'] = '개인 정보가 성공적으로 바뀌었습니다.';
+$lang['pwdforget'] = '비밀번호를 잊으셨나요? 새로 발급받을 수 있습니다';
+$lang['resendna'] = '이 위키는 비밀번호 재발급을 지원하지 않습니다.';
+$lang['resendpwd'] = '다음으로 새 비밀번호 전송';
+$lang['resendpwdmissing'] = '모든 비밀번호를 입력해야 합니다.';
+$lang['resendpwdnouser'] = '등록된 사용자가 아닙니다.';
+$lang['resendpwdbadauth'] = '인증 코드가 잘못됐습니다. 잘못된 링크인지 확인 바랍니다.';
$lang['resendpwdconfirm'] = '확인 링크를 이메일로 보냈습니다.';
-$lang['resendpwdsuccess'] = '새로운 패스워드는 이메일로 보내드립니다.';
-$lang['license'] = '이 위키의 내용은 다음의 라이센스에 따릅니다 :';
-$lang['licenseok'] = '주의 : 이 페이지를 수정한다는 다음의 라이센스에 동의함을 의미합니다 :';
-$lang['searchmedia'] = '파일이름 찾기:';
-$lang['searchmedia_in'] = ' %s에서 검색';
-$lang['txt_upload'] = '업로드 파일을 선택합니다.';
-$lang['txt_filename'] = '업로드 파일 이름을 입력합니다.(선택 사항)';
-$lang['txt_overwrt'] = '새로운 파일로 이전 파일을 교체합니다.';
-$lang['lockedby'] = '현재 잠금 사용자';
+$lang['resendpwdsuccess'] = '새로운 비밀번호를 이메일로 보냈습니다.';
+$lang['license'] = '별도로 라이선스를 알리지 않을 경우, 이 위키의 내용은 다음의 라이선스에 따릅니다:';
+$lang['licenseok'] = '참고: 이 문서를 편집할 경우 다음의 라이선스에 동의함을 의미합니다:';
+$lang['searchmedia'] = '파일 이름 찾기:';
+$lang['searchmedia_in'] = '%s에서 찾기';
+$lang['txt_upload'] = '올릴 파일 선택';
+$lang['txt_filename'] = '올릴 파일 이름 입력 (선택 사항)';
+$lang['txt_overwrt'] = '이전 파일을 새로운 파일로 덮어쓰기';
+$lang['maxuploadsize'] = '최대 올리기 용량. 파일당 %s';
+$lang['lockedby'] = '현재 잠겨진 사용자';
$lang['lockexpire'] = '잠금 해제 시간';
-$lang['js']['willexpire'] = '잠시 후 편집 잠금이 해제됩니다.\n편집 충돌을 피하려면 미리보기를 눌러 잠금 시간을 다시 설정하기 바랍니다.';
-$lang['js']['notsavedyet'] = '저장하지 않은 변경은 지워집니다.
-계속하시겠습니까?';
+$lang['js']['willexpire'] = '잠시 후 편집 잠금이 해제됩니다.\n편집 충돌을 피하려면 미리 보기를 눌러 잠금 시간을 다시 설정하기 바랍니다.';
+$lang['js']['notsavedyet'] = '저장하지 않은 바뀜이 지워집니다.';
$lang['js']['searchmedia'] = '파일 찾기';
-$lang['js']['keepopen'] = '선택할 때 윈도우를 열어놓으시기 바랍니다.';
-$lang['js']['hidedetails'] = '자세한 정보 감추기';
+$lang['js']['keepopen'] = '선택할 때 창을 열어놓기';
+$lang['js']['hidedetails'] = '자세한 정보 숨기기';
$lang['js']['mediatitle'] = '링크 설정';
$lang['js']['mediadisplay'] = '링크 형태';
$lang['js']['mediaalign'] = '배치';
@@ -106,62 +110,72 @@ $lang['js']['mediasize'] = '그림 크기';
$lang['js']['mediatarget'] = '링크 목표';
$lang['js']['mediaclose'] = '닫기';
$lang['js']['mediainsert'] = '삽입';
-$lang['js']['mediadisplayimg'] = '그림보기';
+$lang['js']['mediadisplayimg'] = '그림을 보여줍니다.';
$lang['js']['mediadisplaylnk'] = '링크만 보여줍니다.';
$lang['js']['mediasmall'] = '작게';
$lang['js']['mediamedium'] = '중간';
$lang['js']['medialarge'] = '크게';
$lang['js']['mediaoriginal'] = '원본';
-$lang['js']['medialnk'] = '세부정보페이지로 링크';
+$lang['js']['medialnk'] = '자세한 정보 문서로 링크';
$lang['js']['mediadirect'] = '원본으로 직접 링크';
-$lang['js']['medianolnk'] = '링크 없슴';
+$lang['js']['medianolnk'] = '링크 없음';
$lang['js']['medianolink'] = '그림을 링크하지 않음';
$lang['js']['medialeft'] = '왼쪽 배치';
$lang['js']['mediaright'] = '오른쪽 배치';
-$lang['js']['mediacenter'] = '중앙 배치';
-$lang['js']['medianoalign'] = '배치 없슴';
-$lang['js']['nosmblinks'] = '윈도우 공유 파일과의 연결은 MS 인터넷 익스플로러에서만 동작합니다.
-그러나 링크를 복사하거나 붙여넣기를 할 수 있습니다.';
+$lang['js']['mediacenter'] = '가운데 배치';
+$lang['js']['medianoalign'] = '배치 없음';
+$lang['js']['nosmblinks'] = '윈도우 공유 파일과의 연결은 마이크로소프트 인터넷 익스플로러에서만 동작합니다.\n그러나 링크를 복사하거나 붙여넣기를 할 수 있습니다.';
$lang['js']['linkwiz'] = '링크 마법사';
$lang['js']['linkto'] = '다음으로 연결:';
-$lang['js']['del_confirm'] = '정말로 선택된 항목(들)을 삭제하시겠습니까?';
-$lang['rssfailed'] = 'feed 가져오기 실패: ';
+$lang['js']['del_confirm'] = '정말 선택된 항목을 삭제하겠습니까?';
+$lang['js']['restore_confirm'] = '정말 이 버전으로 되돌리겠습니까?';
+$lang['js']['media_diff'] = '차이 보기:';
+$lang['js']['media_diff_both'] = '나란히 보기';
+$lang['js']['media_diff_opacity'] = '겹쳐 보기';
+$lang['js']['media_diff_portions'] = '쪼개 보기';
+$lang['js']['media_select'] = '파일 선택…';
+$lang['js']['media_upload_btn'] = '올리기';
+$lang['js']['media_done_btn'] = '완료';
+$lang['js']['media_drop'] = '올릴 파일을 끌어넣으세요';
+$lang['js']['media_cancel'] = '삭제';
+$lang['js']['media_overwrt'] = '이미 있는 파일 덮어쓰기';
+$lang['rssfailed'] = '이 피드를 가져오는 동안 오류 발생:';
$lang['nothingfound'] = '아무 것도 없습니다.';
$lang['mediaselect'] = '미디어 파일 선택';
-$lang['fileupload'] = '미디어 파일 업로드';
-$lang['uploadsucc'] = '업로드 성공';
-$lang['uploadfail'] = '업로드 실패. 잘못된 권한 때문일지도 모릅니다.';
-$lang['uploadwrong'] = '업로드 거부. 금지된 확장자입니다!';
-$lang['uploadexist'] = '이미 파일이 존재합니다.';
-$lang['uploadbadcontent'] = '업로드된 파일이 파일 확장자 %s와 일치하지 않습니다.';
-$lang['uploadspam'] = '스팸 차단기가 업로드를 취소하였습니다.';
-$lang['uploadxss'] = '악성 코드의 가능성이 있어 업로드를 취소하였습니다.';
-$lang['uploadsize'] = '업로드한 파일이 너무 큽니다. (최대 %s)';
+$lang['fileupload'] = '미디어 파일 올리기';
+$lang['uploadsucc'] = '올리기 성공';
+$lang['uploadfail'] = '올리기 실패. 잘못된 권한 때문일지도 모릅니다.';
+$lang['uploadwrong'] = '올리기 거부. 금지된 확장자입니다!';
+$lang['uploadexist'] = '파일이 이미 존재합니다.';
+$lang['uploadbadcontent'] = '올린 파일이 %s 파일 확장자와 일치하지 않습니다.';
+$lang['uploadspam'] = '스팸 차단 목록이 올리기를 취소했습니다.';
+$lang['uploadxss'] = '악성 코드의 가능성이 있어 올리기를 취소했습니다.';
+$lang['uploadsize'] = '올린 파일이 너무 큽니다. (최대 %s)';
$lang['deletesucc'] = '"%s" 파일이 삭제되었습니다.';
-$lang['deletefail'] = '"%s" 파일을 삭제할 수 없습니다. - 삭제 권한이 있는지 확인하기 바랍니다.';
-$lang['mediainuse'] = '"%s" 파일을 삭제할 수 없습니다. - 아직 사용 중입니다.';
-$lang['namespaces'] = '네임스페이스';
+$lang['deletefail'] = '"%s" 파일을 삭제할 수 없습니다 - 삭제 권한이 있는지 확인하기 바랍니다.';
+$lang['mediainuse'] = '"%s" 파일을 삭제할 수 없습니다 - 아직 사용 중입니다.';
+$lang['namespaces'] = '이름공간';
$lang['mediafiles'] = '사용 가능한 파일 목록';
-$lang['accessdenied'] = '이 페이지를 볼 권한이 없습니다.';
-$lang['mediausage'] = '이 파일을 참조하려면 다음 문법을 사용하기 바랍니다:';
+$lang['accessdenied'] = '이 문서를 볼 권한이 없습니다.';
+$lang['mediausage'] = '이 파일을 참고하려면 다음 문법을 사용하기 바랍니다:';
$lang['mediaview'] = '원본 파일 보기';
-$lang['mediaroot'] = '루트(root)';
-$lang['mediaupload'] = '파일을 현재 네임스페이스로 업로드합니다. 하위 네임스페이스를 만들려면 파일 이름 앞에 콜론(:)으로 구분되는 이름을 붙이면 됩니다.';
-$lang['mediaextchange'] = '파일 확장자가 .%s에서 .%s으로 변경됐습니다!';
-$lang['reference'] = '참조';
-$lang['ref_inuse'] = '다음 페이지들에서 아직 사용 중이므로 파일을 삭제할 수 없습니다:';
-$lang['ref_hidden'] = '페이지들의 몇몇 참조는 읽을 수 있는 권한이 없습니다.';
-$lang['hits'] = '히트 수';
-$lang['quickhits'] = '일치하는 페이지 이름';
+$lang['mediaroot'] = '루트 (root)';
+$lang['mediaupload'] = '파일을 현재 이름공간으로 올립니다. 하위 이름공간으로 만들려면 선택한 파일 이름 앞에 콜론(:)으로 구분되는 이름을 붙이면 됩니다. 파일을 드래그 앤 드롭하여 선택할 수 있습니다.';
+$lang['mediaextchange'] = '파일 확장자가 .%s에서 .%s(으)로 바뀌었습니다!';
+$lang['reference'] = '참고';
+$lang['ref_inuse'] = '다음 문서에서 아직 사용 중이므로 파일을 삭제할 수 없습니다:';
+$lang['ref_hidden'] = '문서의 일부 참고는 읽을 수 있는 권한이 없습니다';
+$lang['hits'] = '조회 수';
+$lang['quickhits'] = '일치하는 문서 이름';
$lang['toc'] = '목차';
$lang['current'] = '현재';
$lang['yours'] = '버전';
$lang['diff'] = '현재 버전과의 차이 보기';
-$lang['diff2'] = '선택된 버전들 간 차이 보기';
+$lang['diff2'] = '선택한 버전 간 차이 보기';
$lang['difflink'] = '차이 보기로 연결';
-$lang['diff_type'] = '버전간 차이 표시:';
+$lang['diff_type'] = '버전간 차이 보기:';
$lang['diff_inline'] = '인라인 방식';
-$lang['diff_side'] = '다중창 방식';
+$lang['diff_side'] = '다중 창 방식';
$lang['line'] = '줄';
$lang['breadcrumb'] = '추적';
$lang['youarehere'] = '현재 위치';
@@ -169,45 +183,55 @@ $lang['lastmod'] = '마지막 수정';
$lang['by'] = '작성자';
$lang['deleted'] = '삭제';
$lang['created'] = '새로 만듦';
-$lang['restored'] = '옛 버전 복구';
+$lang['restored'] = '이전 버전 복구 (%s)';
$lang['external_edit'] = '외부 편집기';
$lang['summary'] = '편집 요약';
-$lang['noflash'] = '이 컨텐츠를 표시하기 위해서 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>이 필요합니다.';
+$lang['noflash'] = '이 콘텐츠를 표시하기 위해서 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash 플러그인</a>이 필요합니다.';
$lang['download'] = '조각 다운로드';
-$lang['mail_newpage'] = '페이지 추가:';
-$lang['mail_changed'] = '페이지 변경:';
-$lang['mail_subscribe_list'] = '네임스페이스에서 변경된 페이지:';
+$lang['tools'] = '도구';
+$lang['user_tools'] = '사용자 도구';
+$lang['site_tools'] = '사이트 도구';
+$lang['page_tools'] = '문서 도구';
+$lang['skip_to_content'] = '콘텐츠 넘기기';
+$lang['sidebar'] = '사이드바';
+$lang['mail_newpage'] = '문서 추가:';
+$lang['mail_changed'] = '문서 바뀜:';
+$lang['mail_subscribe_list'] = '이름공간에서 바뀐 문서:';
$lang['mail_new_user'] = '새로운 사용자:';
$lang['mail_upload'] = '파일 첨부:';
-$lang['qb_bold'] = '굵은 글';
-$lang['qb_italic'] = '이탤릭체 글';
-$lang['qb_underl'] = '밑줄 그어진 글';
-$lang['qb_code'] = '코드로 표시된 글';
-$lang['qb_strike'] = '취소 표시된 글';
-$lang['qb_h1'] = '1단계 헤드라인';
-$lang['qb_h2'] = '2단계 헤드라인';
-$lang['qb_h3'] = '3단계 헤드라인';
-$lang['qb_h4'] = '4단계 헤드라인';
-$lang['qb_h5'] = '5단계 헤드라인';
-$lang['qb_h'] = '표제';
-$lang['qb_hs'] = '표제 선택';
-$lang['qb_hplus'] = '상위 표제';
-$lang['qb_hminus'] = '하위 표제';
-$lang['qb_hequal'] = '동급 표제';
+$lang['changes_type'] = '차이 보기';
+$lang['pages_changes'] = '문서';
+$lang['media_changes'] = '미디어 파일';
+$lang['both_changes'] = '미디어 파일과 문서 모두';
+$lang['qb_bold'] = '굵은 글씨';
+$lang['qb_italic'] = '기울인 글씨';
+$lang['qb_underl'] = '밑줄 그어진 글씨';
+$lang['qb_code'] = '코드 글씨';
+$lang['qb_strike'] = '취소선 글씨';
+$lang['qb_h1'] = '1단계 문단 제목';
+$lang['qb_h2'] = '2단계 문단 제목';
+$lang['qb_h3'] = '3단계 문단 제목';
+$lang['qb_h4'] = '4단계 문단 제목';
+$lang['qb_h5'] = '5단계 문단 제목';
+$lang['qb_h'] = '문단 제목';
+$lang['qb_hs'] = '문단 제목 선택';
+$lang['qb_hplus'] = '상위 문단 제목';
+$lang['qb_hminus'] = '하위 문단 제목';
+$lang['qb_hequal'] = '동급 문단 제목';
$lang['qb_link'] = '내부 링크';
$lang['qb_extlink'] = '외부 링크';
-$lang['qb_hr'] = '수평선';
-$lang['qb_ol'] = '숫자 목록';
-$lang['qb_ul'] = '목록';
-$lang['qb_media'] = '이미지와 기타 파일 추가';
-$lang['qb_sig'] = '서명 추가';
+$lang['qb_hr'] = '가로줄';
+$lang['qb_ol'] = '순서 있는 목록';
+$lang['qb_ul'] = '순서 없는 목록';
+$lang['qb_media'] = '그림과 기타 파일 추가';
+$lang['qb_sig'] = '서명 넣기';
$lang['qb_smileys'] = '이모티콘';
-$lang['qb_chars'] = '특수문자';
-$lang['upperns'] = '상위 네임스페이스로 이동';
-$lang['admin_register'] = '새로운 사용자 추가';
-$lang['metaedit'] = '메타 데이타를 편집합니다.';
-$lang['metasaveerr'] = '메타 데이타 쓰기가 실패했습니다.';
-$lang['metasaveok'] = '메타 데이타가 저장되었습니다.';
+$lang['qb_chars'] = '특수 문자';
+$lang['upperns'] = '상위 이름공간으로 이동';
+$lang['admin_register'] = '새 사용자 추가';
+$lang['metaedit'] = '메타 데이터 편집';
+$lang['metasaveerr'] = '메타 데이터 쓰기 실패';
+$lang['metasaveok'] = '메타 데이타 저장됨';
$lang['img_backto'] = '뒤로';
$lang['img_title'] = '이름';
$lang['img_caption'] = '설명';
@@ -219,70 +243,80 @@ $lang['img_copyr'] = '저작권';
$lang['img_format'] = '포맷';
$lang['img_camera'] = '카메라';
$lang['img_keywords'] = '키워드';
-$lang['subscr_subscribe_success'] = '%s을(를) 구독목록 %s에 추가하였습니다';
-$lang['subscr_subscribe_error'] = '%s을(를) 구독목록 %s에 추가하는데 실패했습니다';
-$lang['subscr_subscribe_noaddress'] = '등록된 주소가 없기 때문에 구독목록에 등록되지 않았습니다';
-$lang['subscr_unsubscribe_success'] = '%s을(를) 구독목록 %s에서 제거하였습니다';
-$lang['subscr_unsubscribe_error'] = '%s을(를) 구독목록 %s에서 제거하는데 실패했습니다';
+$lang['img_width'] = '너비';
+$lang['img_height'] = '높이';
+$lang['img_manager'] = '미디어 관리자에서 보기';
+$lang['subscr_subscribe_success'] = '%s을(를) 구독 목록 %s에 추가하였습니다';
+$lang['subscr_subscribe_error'] = '%s을(를) 구독 목록 %s에 추가하는데 실패했습니다';
+$lang['subscr_subscribe_noaddress'] = '등록된 주소가 없기 때문에 구독 목록에 등록되지 않았습니다';
+$lang['subscr_unsubscribe_success'] = '%s을(를) 구독 목록 %s에서 삭제하였습니다';
+$lang['subscr_unsubscribe_error'] = '%s을(를) 구독 목록 %s에서 삭제하는데 실패했습니다';
$lang['subscr_already_subscribed'] = '%s은(는) 이미 %s에 구독되고 있습니다';
$lang['subscr_not_subscribed'] = '%s은(는) 이미 %s에 구독되어 있지 않습니다';
-$lang['subscr_m_not_subscribed'] = '현재의 페이지나 네임스페이스에 구독등록이 되어있지 않습니다.';
+$lang['subscr_m_not_subscribed'] = '현재의 문서나 이름공간에 구독 등록이 되어있지 않습니다.';
$lang['subscr_m_new_header'] = '구독 추가';
-$lang['subscr_m_current_header'] = '현재 구독중인 것들';
+$lang['subscr_m_current_header'] = '현재 구독 중인 것';
$lang['subscr_m_unsubscribe'] = '구독 취소';
$lang['subscr_m_subscribe'] = '구독';
$lang['subscr_m_receive'] = '받기';
-$lang['subscr_style_every'] = '모든 변화를 이메일로 받기';
-$lang['subscr_style_digest'] = '각 페이지의 변화를 요약 (매 %.2f 일 마다)';
-$lang['subscr_style_list'] = '마지막 이메일 이후 변화된 페이지의 목록 (매 %.2f 일 마다)';
+$lang['subscr_style_every'] = '모든 바뀜을 이메일로 받기';
+$lang['subscr_style_digest'] = '각 문서의 바뀜을 요약 (매 %.2f일 마다)';
+$lang['subscr_style_list'] = '마지막 이메일 이후 바뀐 문서의 목록 (매 %.2f일 마다)';
$lang['authmodfailed'] = '잘못된 사용자 인증 설정입니다. 관리자에게 문의하기 바랍니다.';
$lang['authtempfail'] = '사용자 인증이 일시적으로 불가능합니다. 만일 계속해서 문제가 발생하면 관리자에게 문의하기 바랍니다.';
-$lang['i_chooselang'] = '사용하는 언어를 선택합니다.';
+$lang['authpwdexpire'] = '현재 비밀번호를 설정한지 %d일이 지났습니다. 새로 설정해주시기 바랍니다.';
+$lang['i_chooselang'] = '사용할 언어를 선택하세요';
$lang['i_installer'] = 'DokuWiki 설치';
$lang['i_wikiname'] = '위키 이름';
-$lang['i_enableacl'] = 'ACL기능 사용(권장 사항)';
+$lang['i_enableacl'] = 'ACL 기능 사용 (권장)';
$lang['i_superuser'] = '슈퍼 유저';
$lang['i_problems'] = '설치 중 아래와 같은 문제가 발생했습니다. 문제를 해결한 후 설치를 계속하기 바랍니다.';
-$lang['i_modified'] = '보안 상의 이유로 아래 스크립트는 수정되지 않은 새 Dokuwiki설치에서만 동작됩니다.
-다운로드된 압축 패키지를 다시 설치하거나 <a href="http://dokuwiki.org/install"> DokuWiki 설치 과정</a>을 참고해서 설치하기 바랍니다.';
-$lang['i_funcna'] = 'PHP함수 <code>%s</code> 사용이 불가능합니다. 호스트 제공자가 어떤 이유에서인지 막아 놓았을지 모릅니다.';
-$lang['i_phpver'] = 'PHP <code>%s</code>버전은 필요한 <code>%s</code>버전보다 오래되었습니다.PHP를 업그레이드할 필요가 있습니다.';
+$lang['i_modified'] = '보안 상의 이유로 이 스크립트는 수정되지 않은 새 Dokuwiki 설치에서만 동작됩니다.
+다운로드한 압축 패키지를 다시 설치하거나 <a href="http://dokuwiki.org/install">DokuWiki 설치 과정</a>을 참고해서 설치하기 바랍니다.';
+$lang['i_funcna'] = '<code>%s</code> PHP 함수의 사용이 불가능합니다. 호스트 제공자가 어떤 이유에서인지 막아 놓았을지 모릅니다.';
+$lang['i_phpver'] = 'PHP <code>%s</code> 버전은 필요한 <code>%s</code> 버전보다 오래되었습니다. PHP를 업그레이드할 필요가 있습니다.';
$lang['i_permfail'] = 'DokuWiki는 <code>%s</code>에 쓰기 가능 권한이 없습니다. 먼저 이 디렉토리에 쓰기 권한이 설정되어야 합니다!';
-$lang['i_confexists'] = '<code>%s</code>는 이미 존재합니다.';
-$lang['i_writeerr'] = '<code>%s</code>을 만들 수 없습니다. 먼저 디렉토리/파일 권한을 확인하고 파일을 수동으로 만들기 바랍니다.';
-$lang['i_badhash'] = 'dokuwiki.php를 인식할 수 없거나 원본 파일이 아닙니다. (hash=<code>%s</code>)';
+$lang['i_confexists'] = '<code>%s</code>(은)는 이미 존재합니다.';
+$lang['i_writeerr'] = '<code>%s</code>(을)를 만들 수 없습니다. 먼저 디렉토리/파일 권한을 확인하고 파일을 수동으로 만들기 바랍니다.';
+$lang['i_badhash'] = 'dokuwiki.php를 인식할 수 없거나 원본 파일이 아닙니다. (해시=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - 유효하지 않거나 빈 값입니다.';
-$lang['i_success'] = '환경 설정이 성공적으로 끝났습니다. install.php를 지워도 상관없습니다.
- <a href="doku.php">새로운 DokuWiki</a>.';
-$lang['i_failure'] = '환경 설정 파일에 쓰는 도중 에러가 발생했습니다.
-새로운 <a href="doku.php"> DokuWiki</a>를 사용하기 전에 수동으로 문제를 해결할 필요가 있습니다.';
+$lang['i_success'] = '환경 설정이 성공적으로 끝났습니다. 지금 install.php를 지워도 상관없습니다. <a href="doku.php">새 DokuWiki</a>로 들어갑니다.';
+$lang['i_failure'] = '환경 설정 파일에 쓰는 도중에 오류가 발생했습니다. <a href="doku.php">새 DokuWiki</a>를 사용하기 전에 수동으로 문제를 해결할 필요가 있습니다.';
$lang['i_policy'] = '초기 ACL 정책';
-$lang['i_pol0'] = '개방형 위키 (누구나 읽기/쓰기/업로드가 가능합니다.)';
-$lang['i_pol1'] = '공개형 위키 (누구나 읽을 수 있지만, 등록된 사용자만 쓰기/업로드가 가능합니다.)';
-$lang['i_pol2'] = '폐쇄형 위키 (등록된 사용자만 읽기/쓰기/업로드가 가능합니다.)';
+$lang['i_pol0'] = '열린 위키 (누구나 읽기, 쓰기, 올리기가 가능합니다.)';
+$lang['i_pol1'] = '공개 위키 (누구나 읽을 수 있지만, 등록된 사용자만 쓰기와 올리기가 가능합니다.)';
+$lang['i_pol2'] = '닫힌 위키 (등록된 사용자만 읽기, 쓰기, 업로드가 가능합니다.)';
$lang['i_retry'] = '다시 시도';
-$lang['i_license'] = '내용의 배포를 위한 라이센스를 선택하세요.';
-$lang['mu_intro'] = '여러 파일을 한번에 업로드할 수 있습니다. 파일 목록에 추가하려면 "찾기" 버튼을 클릭합니다. 파일 목록 추가 작업이 끝나면 "업로드" 버튼을 클릭하기 바랍니다. ';
-$lang['mu_gridname'] = '파일명';
-$lang['mu_gridsize'] = '크기';
-$lang['mu_gridstat'] = '상태';
-$lang['mu_namespace'] = '네임스페이스';
-$lang['mu_browse'] = '찾기';
-$lang['mu_toobig'] = '업로드 가능 크기를 초과했습니다.';
-$lang['mu_ready'] = '업로드가 가능합니다.';
-$lang['mu_done'] = '업로드가 완료되었습니다.';
-$lang['mu_fail'] = '업로드가 실패했습니다.';
-$lang['mu_authfail'] = '세션 기간이 종료되었습니다.';
-$lang['mu_progress'] = '@PCT@% 업로드되었습니다.';
-$lang['mu_filetypes'] = '허용된 파일타입';
-$lang['mu_info'] = '업로드 되었습니다.';
-$lang['mu_lasterr'] = '마지막 에러:';
-$lang['recent_global'] = '<b>%s</b> 네임스페이스를 구독중입니다. <a href="%s">전체위키 변경사항 </a>도 보실수 있습니다.';
-$lang['years'] = '%d 년 전';
-$lang['months'] = '%d 개월 전';
-$lang['weeks'] = '%d 주 전';
-$lang['days'] = '%d 일 전';
-$lang['hours'] = '%d 시간 전';
-$lang['minutes'] = '%d 분 전';
-$lang['seconds'] = '%d 초 전';
+$lang['i_license'] = '내용을 배포하기 위한 라이선스를 선택하세요:';
+$lang['recent_global'] = '<b>%s</b> 이름공간을 구독 중입니다. <a href="%s">전체 위키의 최근 바뀜도 볼 수</a> 있습니다.';
+$lang['years'] = '%d년 전';
+$lang['months'] = '%d개월 전';
+$lang['weeks'] = '%d주 전';
+$lang['days'] = '%d일 전';
+$lang['hours'] = '%d시간 전';
+$lang['minutes'] = '%d분 전';
+$lang['seconds'] = '%d초 전';
$lang['wordblock'] = '스팸 문구를 포함하고 있어서 저장되지 않았습니다.';
+$lang['media_uploadtab'] = '올리기';
+$lang['media_searchtab'] = '찾기';
+$lang['media_file'] = '파일';
+$lang['media_viewtab'] = '보기';
+$lang['media_edittab'] = '수정';
+$lang['media_historytab'] = '역사';
+$lang['media_list_thumbs'] = '섬네일';
+$lang['media_list_rows'] = '목록';
+$lang['media_sort_name'] = '이름';
+$lang['media_sort_date'] = '날짜';
+$lang['media_namespaces'] = '이름공간 선택';
+$lang['media_files'] = '%s의 파일';
+$lang['media_upload'] = '%s에 올리기';
+$lang['media_search'] = '%s 찾기';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s의 %s';
+$lang['media_edit'] = '%s 수정';
+$lang['media_history'] = '%s 변경 내력';
+$lang['media_meta_edited'] = '메타데이터가 수정됨';
+$lang['media_perm_read'] = '이 파일을 읽을 권한이 없습니다.';
+$lang['media_perm_upload'] = '파일을 올릴 권한이 없습니다.';
+$lang['media_update'] = '새 버전 올리기';
+$lang['media_restore'] = '이 버전으로 되돌리기';
diff --git a/inc/lang/ko/locked.txt b/inc/lang/ko/locked.txt
index 24525fc46..176a792d6 100644
--- a/inc/lang/ko/locked.txt
+++ b/inc/lang/ko/locked.txt
@@ -1,3 +1,3 @@
-====== 페이지 잠금 ======
+====== 문서 잠금 ======
-다른 사용자가 이 페이지 편집을 위해 잠금을 실행하였습니다. 해당 사용자가 편집을 끝내거나 잠금이 해제될 때까지 기다리십시오.
+다른 사용자가 이 문서를 편집하기 위해 잠금을 실행하였습니다. 해당 사용자가 편집을 끝내거나 잠금이 해제될 때까지 기다리십시오. \ No newline at end of file
diff --git a/inc/lang/ko/login.txt b/inc/lang/ko/login.txt
index 1aae449df..160b899d3 100644
--- a/inc/lang/ko/login.txt
+++ b/inc/lang/ko/login.txt
@@ -1,4 +1,3 @@
====== 로그인 ======
-로그인하지 않았습니다! 아래에서 로그인하십시오. 로그인하려면 쿠키를 받도록 설정하여야 합니다.
-
+로그인하지 않았습니다! 아래에서 로그인하세요. 로그인하려면 쿠키를 받도록 설정하여야 합니다. \ No newline at end of file
diff --git a/inc/lang/ko/mailtext.txt b/inc/lang/ko/mailtext.txt
index 5c496435e..219fe6e0b 100644
--- a/inc/lang/ko/mailtext.txt
+++ b/inc/lang/ko/mailtext.txt
@@ -1,17 +1,16 @@
-DokuWiki 페이지가 수정 혹은 추가되었습니다. 상세한 정보는 다음과 같습니다.
+DokuWiki 문서가 추가 또는 변경되었습니다. 자세한 정보는 다음과 같습니다:
-날짜 : @DATE@
-브라우저 : @BROWSER@
-IP 주소 : @IPADDRESS@
-호스트명 : @HOSTNAME@
-옛날버전 : @OLDPAGE@
-새버전 : @NEWPAGE@
-편집 요약 : @SUMMARY@
-사용자 : @USER@
+날짜 : @DATE@
+브라우저 : @BROWSER@
+IP 주소 : @IPADDRESS@
+호스트 이름 : @HOSTNAME@
+이전 버전 : @OLDPAGE@
+새 버전 : @NEWPAGE@
+편집 요약 : @SUMMARY@
+사용자 : @USER@
@DIFF@
---
-이 메일은 @DOKUWIKIURL@ 의 DokuWiki 가 생성한
-이메일입니다.
+--
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/mailwrap.html b/inc/lang/ko/mailwrap.html
new file mode 100644
index 000000000..885730428
--- /dev/null
+++ b/inc/lang/ko/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ </head>
+ <body>
+
+ @HTMLBODY@
+
+ <br /><hr />
+ <small>@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.</small>
+ </body>
+ </html> \ No newline at end of file
diff --git a/inc/lang/ko/newpage.txt b/inc/lang/ko/newpage.txt
index f8380bd84..87ac969d2 100644
--- a/inc/lang/ko/newpage.txt
+++ b/inc/lang/ko/newpage.txt
@@ -1,3 +1,3 @@
-====== 이 토픽은 아직 없습니다 ======
+====== 이 주제는 아직 없습니다 ======
-아직 없는 토픽 링크를 따라오셨습니다. **페이지 만들기** 버튼을 이용하여 새로 만들 수 있습니다.
+아직 없는 주제에 대한 링크를 따라왔습니다. **문서 만들기** 버튼을 이용하여 새로 만들 수 있습니다. \ No newline at end of file
diff --git a/inc/lang/ko/norev.txt b/inc/lang/ko/norev.txt
index e1b4093b4..6758ce4ec 100644
--- a/inc/lang/ko/norev.txt
+++ b/inc/lang/ko/norev.txt
@@ -1,3 +1,3 @@
====== 지정한 버전 없음 ======
-지정한 버전이 없습니다. **과거 버전** 버튼을 사용하여 이 문서의 버전 목록을 보십시오.
+지정한 버전이 존재하지 않습니다. **이전 버전** 버튼을 사용하여 이 문서의 이전 버전 목록을 보세요. \ No newline at end of file
diff --git a/inc/lang/ko/password.txt b/inc/lang/ko/password.txt
index e0a22c59a..02b23d17c 100644
--- a/inc/lang/ko/password.txt
+++ b/inc/lang/ko/password.txt
@@ -1,10 +1,9 @@
-안녕하세요, @FULLNAME@!
+@FULLNAME@ 안녕하세요!
-@DOKUWIKIURL@ 의 @TITLE@ 의 사용자 정보입니다.
+@DOKUWIKIURL@의 @TITLE@의 사용자 정보입니다.
-사용자명 : @LOGIN@
-패스워드 : @PASSWORD@
+사용자 이름 : @LOGIN@
+비밀번호 : @PASSWORD@
--
-이 이메일은 @DOKUWIKIURL@ 의 DokuWiki 가
-생성한 것입니다.
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/preview.txt b/inc/lang/ko/preview.txt
index 8bcc6a1eb..6563874ee 100644
--- a/inc/lang/ko/preview.txt
+++ b/inc/lang/ko/preview.txt
@@ -1,4 +1,3 @@
-====== 미리보기 ======
-
-이것은 입력하신 내용이 어떻게 보일지 미리보기하는 곳입니다. 아직은 **저장되지 않았다**는 점을 기억하십시오.
+====== 미리 보기 ======
+이것은 입력한 내용이 어떻게 보일지 미리 보여줍니다. 아직 **저장되지 않았다**는 점을 기억해두십시오! \ No newline at end of file
diff --git a/inc/lang/ko/pwconfirm.txt b/inc/lang/ko/pwconfirm.txt
index c022a52a9..1920f4a20 100644
--- a/inc/lang/ko/pwconfirm.txt
+++ b/inc/lang/ko/pwconfirm.txt
@@ -1,11 +1,13 @@
-안녕하세요. @FULLNAME@!
+@FULLNAME@ 안녕하세요!
-@DOKUWIKIURL@에 작성하신 @TITLE@을 보려면 새 패스워드가 필요하다는 요청을 누군가 받았다고 합니다.
+누군가가 @DOKUWIKIURL@에 @TITLE@에 대해
+새 비밀번호가 필요하다고 요청했습니다.
-새로운 패스워드를 요청한 적이 없다면 이 이메일을 무시해버리세요.
+새로운 비밀번호 요청한 적이 없다면 이 이메일을 무시해버리세요.
-@CONFIRM@에서 정말로 본인이 그런 요청을 했었는지 확인해 보기 바랍니다.
+정말로 당신이 그러한 요청을 했는지 다음 링크에서 확인하기 바랍니다.
---
+@CONFIRM@
-@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
+--
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/read.txt b/inc/lang/ko/read.txt
index 6b5d7b3db..9b2ec822f 100644
--- a/inc/lang/ko/read.txt
+++ b/inc/lang/ko/read.txt
@@ -1,2 +1,2 @@
-이 페이지는 읽기 전용입니다. 소스를 볼 수는 있지만, 수정할 수는 없습니다. 연습은 [[public:playground|연습장]]에서 하십시오. 문제가 있다고 생각하시면 관리자에게 문의하십시오.
+이 문서는 읽기 전용입니다. 내용을 볼 수는 있지만, 수정할 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하십시오.
diff --git a/inc/lang/ko/recent.txt b/inc/lang/ko/recent.txt
index f693c4bf1..f2ffb8c6f 100644
--- a/inc/lang/ko/recent.txt
+++ b/inc/lang/ko/recent.txt
@@ -1,5 +1,3 @@
-====== 최근 변경 ======
-
-아래의 페이지는 최근에 변경된 것입니다.
-
+====== 최근 바뀜 ======
+아래의 문서는 최근에 바뀐 것입니다. \ No newline at end of file
diff --git a/inc/lang/ko/register.txt b/inc/lang/ko/register.txt
index 24105efeb..6509bed91 100644
--- a/inc/lang/ko/register.txt
+++ b/inc/lang/ko/register.txt
@@ -1,4 +1,3 @@
====== 새 사용자 등록 ======
-이 위키에 새 계정을 만들려면 아래의 모든 내용을 입력하세요. **제대로 된 이메일 주소**를 사용하세요. 암호를 입력하는 곳이 없다면 암호는 이 이메일로 보내집니다. 사용자명은 올바른 [[doku>pagename|pagename]] 이어야 합니다.
-
+이 위키에 새 계정을 만드려면 아래의 모든 내용을 입력하세요. **올바른 이메일 주소**를 사용하세요. 비밀번호를 입력하는 곳이 없다면 비밀번호는 이 이메일로 보내집니다. 사용자 이름은 올바른 [[doku>pagename|pagename]]이어야 합니다. \ No newline at end of file
diff --git a/inc/lang/ko/registermail.txt b/inc/lang/ko/registermail.txt
index 4b1aa20a5..d06f93047 100644
--- a/inc/lang/ko/registermail.txt
+++ b/inc/lang/ko/registermail.txt
@@ -1,14 +1,13 @@
-새로운 사용자가 등록되었습니다:
+새 사용자가 등록되었습니다:
-사용자 이름 : @NEWUSER@
+사용자 이름 : @NEWUSER@
사용자 실제 이름 : @NEWNAME@
-이메일 : @NEWEMAIL@
+이메일 : @NEWEMAIL@
-날짜 : @DATE@
-브라우저 : @BROWSER@
-IP주소 : @IPADDRESS@
-호스트 이름 : @HOSTNAME@
+날짜 : @DATE@
+브라우저 : @BROWSER@
+IP 주소 : @IPADDRESS@
+호스트 이름 : @HOSTNAME@
--
-
@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
diff --git a/inc/lang/ko/resendpwd.txt b/inc/lang/ko/resendpwd.txt
index b06163e92..0ad46eb1e 100644
--- a/inc/lang/ko/resendpwd.txt
+++ b/inc/lang/ko/resendpwd.txt
@@ -1,4 +1,3 @@
-====== 새로운 패스워드 전송 ======
-
-이 위키 계정에 대한 새 패스워드를 요구하기 위해 아래 폼에서 사용자 이름을 입력하세요. 확인 링크는 새로 등록된 이메일 주소로 발송됩니다.
+====== 새로운 비밀번호 전송 ======
+이 위키 계정에 대한 새 비밀번호를 요구하기 위해 아래 양식에서 사용자 이름을 입력하세요. 확인 링크는 새로 등록한 이메일 주소로 발송됩니다. \ No newline at end of file
diff --git a/inc/lang/ko/resetpwd.txt b/inc/lang/ko/resetpwd.txt
new file mode 100644
index 000000000..ed909456f
--- /dev/null
+++ b/inc/lang/ko/resetpwd.txt
@@ -0,0 +1,3 @@
+====== 새 비밀번호 설정 ======
+
+이 위키 계정의 새 비밀번호를 입력하세요. \ No newline at end of file
diff --git a/inc/lang/ko/revisions.txt b/inc/lang/ko/revisions.txt
index 12d11894d..64733d86d 100644
--- a/inc/lang/ko/revisions.txt
+++ b/inc/lang/ko/revisions.txt
@@ -1,4 +1,3 @@
====== 이전 버전 ======
-이 문서의 옛날 버전은 다음과 같습니다. 이전 버전으로 돌아가려면, 아래에서 선택한 다음, **페이지 편집**을 클릭한 아후 저장하십시오.
-
+이 문서의 이전 버전은 다음과 같습니다. 이전 버전으로 돌아가려면, 아래에서 선택한 다음 **문서 편집**을 클릭하고 나서 저장하세요. \ No newline at end of file
diff --git a/inc/lang/ko/searchpage.txt b/inc/lang/ko/searchpage.txt
index 198d9a428..2e8502b13 100644
--- a/inc/lang/ko/searchpage.txt
+++ b/inc/lang/ko/searchpage.txt
@@ -1,5 +1,5 @@
====== 찾기 ======
-찾기 결과를 아래에서 볼 수 있습니다. 만일 원하는 것을 찾지 못하였다면, **페이지 편집** 버튼을 이용하여 질의 내용과 같은 이름의 페이지를 만들 수 있습니다.
+아래에서 찾기 결과를 볼 수 있습니다. 만일 원하는 것을 찾지 못하였다면, **문서 만들기**나 **문서 편집** 버튼을 사용하여 쿼리 내용과 같은 이름의 문서를 만들거나 편집할 수 있습니다.
-===== 결과 =====
+===== 결과 ===== \ No newline at end of file
diff --git a/inc/lang/ko/stopwords.txt b/inc/lang/ko/stopwords.txt
index bdb41deba..4b5551ce5 100644
--- a/inc/lang/ko/stopwords.txt
+++ b/inc/lang/ko/stopwords.txt
@@ -1,9 +1,11 @@
-# 색인이 만들어 지지 않는 단어 목록입니다.(한줄에 한단어)
-# 이 파일을 편집한다면 UNIX줄 종료문자를 사용해야합니다.(단일 개행문자)
-# 3문자이하 단어는 자동으로 무시되므로 3문자보다 짧은 단어는 포함시킬 필요가 없습니다.
+# 색인이 만들어지지 않는 단어 목록입니다. (한줄에 한 단어)
+# 이 파일을 편집한다면 UNIX 줄 종료 문자를 사용해야합니다.(단일 개행 문자)
+# 3문자 이하 단어는 자동으로 무시되므로 3문자보다 짧은 단어는 포함시킬 필요가 없습니다.
# http://www.ranks.nl/stopwords/을 기준으로 만들어진 목록입니다.
about
are
+as
+an
and
you
your
@@ -13,10 +15,18 @@ com
for
from
into
+if
+in
+is
+it
how
+of
+on
+or
that
the
this
+to
was
what
when
@@ -26,4 +36,4 @@ will
with
und
the
-www
+www \ No newline at end of file
diff --git a/inc/lang/ko/subscr_digest.txt b/inc/lang/ko/subscr_digest.txt
index 2e9c87848..13459428f 100644
--- a/inc/lang/ko/subscr_digest.txt
+++ b/inc/lang/ko/subscr_digest.txt
@@ -1,18 +1,18 @@
안녕하세요!
-@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다.
-
-변경사항은 다음과 같습니다:
+@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다.
+바뀐 점은 다음과 같습니다:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-옛날 것: @OLDPAGE@
-새 것: @NEWPAGE@
+이전 버전 : @OLDPAGE@
+새 버전 : @NEWPAGE@
+
-이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤
-@SUBSCRIBE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요.
+이 문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
+@SUBSCRIBE@ 문서를 방문하여 문서나 이름공간의 구독을 취소하세요.
--
@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/subscr_form.txt b/inc/lang/ko/subscr_form.txt
index 31470f372..ed380ccee 100644
--- a/inc/lang/ko/subscr_form.txt
+++ b/inc/lang/ko/subscr_form.txt
@@ -1,3 +1,3 @@
====== 구독 관리 ======
-이 페이지는 현재의 페이지와 네임스페이스의 구독을 관리할 수있도록 해줍니다. \ No newline at end of file
+이 페이지는 현재의 문서와 이름공간의 구독을 관리할 수 있도록 해줍니다. \ No newline at end of file
diff --git a/inc/lang/ko/subscr_list.txt b/inc/lang/ko/subscr_list.txt
index 2661a6a15..68adf0de9 100644
--- a/inc/lang/ko/subscr_list.txt
+++ b/inc/lang/ko/subscr_list.txt
@@ -1,15 +1,14 @@
안녕하세요!
-@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다.
-
-변경사항은 다음과 같습니다:
+@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다.
+바뀐 점은 다음과 같습니다:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤
-@SUBSCRIBE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요.
+이 문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
+@SUBSCRIBE@ 문서를 방문하여 문서나 이름공간의 구독을 취소하세요.
--
@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/subscr_single.txt b/inc/lang/ko/subscr_single.txt
index 1aa4d7efa..6bd1885e6 100644
--- a/inc/lang/ko/subscr_single.txt
+++ b/inc/lang/ko/subscr_single.txt
@@ -1,8 +1,7 @@
안녕하세요!
-@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다.
-
-변경사항은 다음과 같습니다:
+@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다.
+바뀐 점은 다음과 같습니다:
--------------------------------------------------------
@DIFF@
@@ -11,11 +10,11 @@
날짜 : @DATE@
사용자 : @USER@
편집 요약 : @SUMMARY@
-구 버전 : @OLDPAGE@
+이전 버전 : @OLDPAGE@
새 버전 : @NEWPAGE@
-이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤 t
-@NEWPAGE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요.
+이 문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
+@NEWPAGE@ 문서를 방문하여 문서나 이름공간의 구독을 취소하세요.
--
@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/updateprofile.txt b/inc/lang/ko/updateprofile.txt
index 5ea331c05..ebf19d8ab 100644
--- a/inc/lang/ko/updateprofile.txt
+++ b/inc/lang/ko/updateprofile.txt
@@ -1,5 +1,3 @@
====== 개인 정보 수정 ======
-변경하고 싶은 항목을 입력하기 바랍니다. 사용자 이름은 바꾸고 싶지 않겠지요?
-
-
+바꾸고 싶은 항목을 입력하기 바랍니다. 사용자 이름은 바꿀 수 없습니다. \ No newline at end of file
diff --git a/inc/lang/ko/uploadmail.txt b/inc/lang/ko/uploadmail.txt
index 46c66a66b..675c0bd3f 100644
--- a/inc/lang/ko/uploadmail.txt
+++ b/inc/lang/ko/uploadmail.txt
@@ -1,15 +1,14 @@
-DokuWiki가 파일을 업로드하였습니다.
+DokuWiki가 파일을 올렸습니다. 자세한 정보는 다음과 같습니다:
-자세한 정보:
-
-파일 : @MEDIA@
-날짜 : @DATE@
-웹 브라우저 : @BROWSER@
-IP 주소 : @IPADDRESS@
-호스트명 : @HOSTNAME@
-크기 : @SIZE@
-파일 종류 : @MIME@
-사용자 : @USER@
+파일 : @MEDIA@
+이전 버전 : @OLD@
+날짜 : @DATE@
+브라우저 : @BROWSER@
+IP 주소 : @IPADDRESS@
+호스트 이름 : @HOSTNAME@
+크기 : @SIZE@
+MIME 종류 : @MIME@
+사용자 : @USER@
--
-이 메일은 @DOKUWIKIURL@의 DokuWiki가 생성한 메일입니다. \ No newline at end of file
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/la/install.html b/inc/lang/la/install.html
index c06f3ac2c..e041df958 100644
--- a/inc/lang/la/install.html
+++ b/inc/lang/la/install.html
@@ -1,8 +1,8 @@
-<p>Haec pagina te adiuuat in <a href="http://dokuwiki.org">Dokuuiki</a> conformando. Maiores res in
+<p>Haec pagina te adiuuat in <a href="http://dokuwiki.org">Dokuuiki</a> conformando. Maiores res in
<a href="http://dokuwiki.org/installer">hac pagina</a> sunt.</p>
<p>DokuWiki documenta ut omnes paginas uicis et omnia (ut imagines, indices, ueteres formas) quae ad easdem pertinent colligat. Vt bene operet DokuWiki omnes facultates scrini habere <strong>debes</strong>. Hoc instrumentum facultates eligere non potest, his facultatibus locatori spati interretis quaeras uel FTP intrumento uel aliis rebus (ut cPanel) uteraris.</p>
-<p>Hoc intrumentum optiones primae DokuWiki <acronym title="index custodiae ,aditus">ICA</acronym>, quos rectori situs inire et indicem, ut addenda optiones uicis et alia administrare possit uidere licet. Hoc instrumentum non necessarium DokuWiki ut feliciter operet, sed melius administrare adiuuat.</p>
+<p>Hoc intrumentum optiones primae DokuWiki <abbr title="index custodiae, aditus">ICA</abbr>, quos rectori situs inire et indicem, ut addenda optiones uicis et alia administrare possit uidere licet. Hoc instrumentum non necessarium DokuWiki ut feliciter operet, sed melius administrare adiuuat.</p>
<p>Periti uel qui certa quaesita habet paginas <a href="http://dokuwiki.org/install">rationis conformandum uicem</a> et <a href="http://dokuwiki.org/config">optionum conformationis</a> uidere possunt.</p> \ No newline at end of file
diff --git a/inc/lang/la/lang.php b/inc/lang/la/lang.php
index e8d79a997..3970f453a 100644
--- a/inc/lang/la/lang.php
+++ b/inc/lang/la/lang.php
@@ -44,7 +44,6 @@ $lang['btn_backtomedia'] = 'Ad media redire';
$lang['btn_subscribe'] = 'Custodire';
$lang['btn_profile'] = 'Tabellam nouare';
$lang['btn_reset'] = 'Abrogare';
-$lang['btn_resendpwd'] = 'Tesseram nouam cursu interretiali petere';
$lang['btn_draft'] = 'Propositum recensere';
$lang['btn_recover'] = 'Propositum reficere';
$lang['btn_draftdel'] = 'Propositum delere';
@@ -79,7 +78,6 @@ $lang['profnoempty'] = 'Omnes campi complendi sunt.';
$lang['profchanged'] = 'Tabella Sodalis feliciter nouatur';
$lang['pwdforget'] = 'Tesseram amisistine? Nouam petere';
$lang['resendna'] = 'Tesseram non mutare potest.';
-$lang['resendpwd'] = 'Tesseram mitte';
$lang['resendpwdmissing'] = 'Omnes campi complendi sunt.';
$lang['resendpwdnouser'] = 'In tabellis Sodalium nomen non inuentum est.';
$lang['resendpwdbadauth'] = 'Tesseram non legitima est.';
@@ -256,21 +254,6 @@ $lang['i_pol1'] = 'Publicus uicis (omnes legere, Sodales scribere
$lang['i_pol2'] = 'Clausus uicis (Soli Sodales legere scribere et onerare poccunt)';
$lang['i_retry'] = 'Rursum temptas';
$lang['i_license'] = 'Elige facultatem sub qua tuus uicis est:';
-$lang['mu_intro'] = 'Plura documenta uno tempore onerare potes.';
-$lang['mu_gridname'] = 'Documenti nomen';
-$lang['mu_gridsize'] = 'Pondus';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Genus';
-$lang['mu_browse'] = 'Euoluere';
-$lang['mu_toobig'] = 'Ponderosius';
-$lang['mu_ready'] = 'Aptus ad onerandum';
-$lang['mu_done'] = 'Perfectum';
-$lang['mu_fail'] = 'Error';
-$lang['mu_authfail'] = 'Sessio exit';
-$lang['mu_progress'] = '@PCT@% oneratum';
-$lang['mu_filetypes'] = 'Genera documenti apta facere';
-$lang['mu_info'] = 'Documenta onerare';
-$lang['mu_lasterr'] = 'Extremus error:';
$lang['recent_global'] = 'Mutatione in hoc genere uides. Recentiores mutationes quoque uidere <a href="%s">potes</a>';
$lang['years'] = 'ab annis %d';
$lang['months'] = 'a mensibus %d';
diff --git a/inc/lang/lb/lang.php b/inc/lang/lb/lang.php
index 00692f48e..e6409b7ff 100644
--- a/inc/lang/lb/lang.php
+++ b/inc/lang/lb/lang.php
@@ -37,7 +37,6 @@ $lang['btn_backlink'] = 'Linker zeréck';
$lang['btn_backtomedia'] = 'Zeréck bei d\'Auswiel vun de Mediadateien';
$lang['btn_profile'] = 'Profil aktualiséieren';
$lang['btn_reset'] = 'Zerécksetzen';
-$lang['btn_resendpwd'] = 'Nei Passwuert schécken';
$lang['btn_draft'] = 'Entworf änneren';
$lang['btn_recover'] = 'Entworf zeréckhuelen';
$lang['btn_draftdel'] = 'Entworf läschen';
@@ -71,7 +70,6 @@ $lang['profnoempty'] = 'En eidele Numm oder Emailadress ass net erlaab
$lang['profchanged'] = 'Benotzerprofil erfollegräicht aktualiséiert.';
$lang['pwdforget'] = 'Passwuert vergiess? Fro der e Neit';
$lang['resendna'] = 'Dëse Wiki ënnerstëtzt net d\'Neiverschécke vu Passwieder.';
-$lang['resendpwd'] = 'Nei Passwuert schécke fir';
$lang['resendpwdmissing'] = 'Du muss all Felder ausfëllen.';
$lang['resendpwdnouser'] = 'Kann dëse Benotzer net an der Datebank fannen.';
$lang['resendpwdbadauth'] = 'Den "Auth"-Code ass ongëlteg. Kuck no obs de dee ganze Konfirmationslink benotzt hues.';
@@ -189,21 +187,6 @@ $lang['i_pol0'] = 'Oppene Wiki (liese, schreiwen an eroplueden fi
$lang['i_pol1'] = 'Ëffentleche Wiki (liesen fir jidfereen, schreiwen an eroplueden fir registréiert Benotzer)';
$lang['i_pol2'] = 'Zouene Wiki (liesen, schreiwen, eroplueden nëmme fir registréiert Benotzer)';
$lang['i_retry'] = 'Nach eng Kéier probéieren';
-$lang['mu_intro'] = 'Hei kanns de méi Dateie mateneen eroplueden. Klick op den Duerchsiche-Knäppchen fir se an d\'Schlaang ze setzen. Dréck op Eroplueden wanns de fäerdeg bass.';
-$lang['mu_gridname'] = 'Dateinumm';
-$lang['mu_gridsize'] = 'Gréisst';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Namespace';
-$lang['mu_browse'] = 'Duerchsichen';
-$lang['mu_toobig'] = 'ze grouss';
-$lang['mu_ready'] = 'prett fir eropzelueden';
-$lang['mu_done'] = 'fäerdeg';
-$lang['mu_fail'] = 'feelgeschloen';
-$lang['mu_authfail'] = 'Sessioun ofgelaf';
-$lang['mu_progress'] = '@PCT@% eropgelueden';
-$lang['mu_filetypes'] = 'Erlaabten Dateitypen';
-$lang['mu_info'] = 'Dateien eropgelueden.';
-$lang['mu_lasterr'] = 'Leschte Feeler:';
$lang['recent_global'] = 'Du kucks am Moment d\'Ännerungen innerhalb vum <b>%s</b> Namespace. Du kanns och <a href="%s">d\'Kierzilech Ännerungen vum ganze Wiki kucken</a>.';
$lang['years'] = 'virun %d Joer';
$lang['months'] = 'virun %d Méint';
diff --git a/inc/lang/lt/lang.php b/inc/lang/lt/lang.php
index d14a0695a..13ff8c305 100644
--- a/inc/lang/lt/lang.php
+++ b/inc/lang/lt/lang.php
@@ -43,7 +43,6 @@ $lang['btn_subscribe'] = 'Užsisakyti keitimų prenumeratą';
$lang['btn_unsubscribe'] = 'Atsisakyti keitimų prenumeratos';
$lang['btn_profile'] = 'Atnaujinti profilį';
$lang['btn_reset'] = 'Atstata';
-$lang['btn_resendpwd'] = 'Išsiųsti naują slaptažodį';
$lang['btn_draft'] = 'Redaguoti juodraštį';
$lang['btn_recover'] = 'Atkurti juodraštį';
$lang['btn_draftdel'] = 'Šalinti juodraštį';
@@ -77,7 +76,6 @@ $lang['profnoempty'] = 'Tuščias vardo arba el. pašto adreso laukas
$lang['profchanged'] = 'Vartotojo profilis sėkmingai atnaujintas.';
$lang['pwdforget'] = 'Pamiršote slaptažodį? Gaukite naują';
$lang['resendna'] = 'Ši vikisvetainė neleidžia persiųsti slaptažodžių.';
-$lang['resendpwd'] = 'Atsiųsti naują slaptažodį';
$lang['resendpwdmissing'] = 'Jūs turite užpildyti visus laukus.';
$lang['resendpwdnouser'] = 'Tokio vartotojo nėra duomenų bazėje.';
$lang['resendpwdbadauth'] = 'Atsiprašome, bet šis tapatybės nustatymo kodas netinkamas. Įsitikinkite, kad panaudojote pilną patvirtinimo nuorodą.';
@@ -190,14 +188,3 @@ $lang['i_wikiname'] = 'Wiki vardas';
$lang['i_enableacl'] = 'Įjungti ACL (rekomenduojama)';
$lang['i_superuser'] = 'Supervartotojas';
$lang['i_problems'] = 'Instaliavimo metu buvo klaidų, kurios pateiktos žemiau. Tęsti negalima, kol nebus pašalintos priežastys.';
-$lang['mu_gridname'] = 'Failo vardas';
-$lang['mu_gridsize'] = 'Dydis';
-$lang['mu_gridstat'] = 'Statusas';
-$lang['mu_namespace'] = 'Vardų sritis';
-$lang['mu_browse'] = 'Browse';
-$lang['mu_toobig'] = 'perdidelis';
-$lang['mu_ready'] = 'paruošta įkrovimui';
-$lang['mu_done'] = 'užbaigta';
-$lang['mu_fail'] = 'nepavyko';
-$lang['mu_authfail'] = 'sesija nutraukta';
-$lang['mu_filetypes'] = 'Leidžiami failų tipai';
diff --git a/inc/lang/lv/install.html b/inc/lang/lv/install.html
index 9967d2edd..26dd8d782 100644
--- a/inc/lang/lv/install.html
+++ b/inc/lang/lv/install.html
@@ -1,12 +1,12 @@
-<p>Šī lapa palīdz <a href="http://dokuwiki.org">Dokuwiki</a>pirmajā instalācijā un konfigurēšanā.
+<p>Šī lapa palīdz <a href="http://dokuwiki.org">Dokuwiki</a>pirmajā instalācijā un konfigurēšanā.
Vairāk par instalatoru var lasīt tā
<a href="http://dokuwiki.org/installer">documentācijas lapā</a>.</p>
-
+
<p>DokuWiki lapu un ar to saistīto datu (piem.: attēlu, meklēšanas indeksu, veco versiju utt.) glabāšanai lieto parastus failus. Lai Dokuwiki veiksmīgi darbotos <strong>vajag</strong> rakstīšanas tiesības direktorijās, kur šie faili glabājas. Instalators tiesības nomainīt nespēj. Tas parasti jums jāizdara komandrindā vai ar FTP vadības paneli (piem. cPanel).</p>
-
-<p>Instalators konfigurēs DokuWiki <acronym title="access control list">ACL</acronym> lietošanai, kas ļauj administratoram ielogoties un piekļūt DokuWiki administrēšanas izvēlnei, lai instalētu moduļus, pārvaldītu lietotājus, notiektu piekļuves tiesības Wiki lapām un mainītu DokuWiki konfigurāciju.
+
+<p>Instalators konfigurēs DokuWiki <abbr title="access control list">ACL</abbr> lietošanai, kas ļauj administratoram ielogoties un piekļūt DokuWiki administrēšanas izvēlnei, lai instalētu moduļus, pārvaldītu lietotājus, notiektu piekļuves tiesības Wiki lapām un mainītu DokuWiki konfigurāciju.
Tas nav vajadzīgs, lai DokuWiki darbotos, bet ar to var vieglāk administrēt.</p>
-
-<p>Pieredzējušiem lietotājiem ar īpašām prasībām jāmeklē sīkākas ziņas
+
+<p>Pieredzējušiem lietotājiem ar īpašām prasībām jāmeklē sīkākas ziņas
<a href="http://dokuwiki.org/install">uzstādīšanas instrukcijā</a>
un <a href="http://dokuwiki.org/config">konfigurēšanas padomos</a>.</p> \ No newline at end of file
diff --git a/inc/lang/lv/lang.php b/inc/lang/lv/lang.php
index 37a0bf6a9..cc17b17fe 100644
--- a/inc/lang/lv/lang.php
+++ b/inc/lang/lv/lang.php
@@ -39,7 +39,6 @@ $lang['btn_backtomedia'] = 'Atpakaļ uz mēdiju failu izvēli';
$lang['btn_subscribe'] = 'Abonēt izmaiņu paziņojumus';
$lang['btn_profile'] = 'Labot savu profilu';
$lang['btn_reset'] = 'Atsaukt izmaiņas';
-$lang['btn_resendpwd'] = 'Nosūtīt jaunu paroli';
$lang['btn_draft'] = 'Labot melnrakstu';
$lang['btn_recover'] = 'Atjaunot melnrakstu';
$lang['btn_draftdel'] = 'Dzēst melnrakstu';
@@ -76,7 +75,6 @@ $lang['profnoempty'] = 'Bez vārda vai e-pasta adreses nevar.';
$lang['profchanged'] = 'Profils veiksmīgi izlabots.';
$lang['pwdforget'] = 'Aizmirsi paroli? Saņem jaunu';
$lang['resendna'] = 'Paroļu izsūtīšanu nepiedāvāju.';
-$lang['resendpwd'] = 'Nosūtīt jaunu paroli lietotājam';
$lang['resendpwdmissing'] = 'Atvaino, jāizpilda visas ailes.';
$lang['resendpwdnouser'] = 'Atvaino, tāda lietotāja nav.';
$lang['resendpwdbadauth'] = 'Atvaino, šis autorizācijas kods nav derīgs. Pārliecinies, ka lietoji pilnu apstiprināšanas adresi.';
@@ -274,21 +272,6 @@ $lang['i_pol1'] = 'Publisks Wiki (lasa ikviens, raksta un augšup
$lang['i_pol2'] = 'Slēgts Wiki (raksta, lasa un augšupielādē tikai reģistrēti lietotāji)';
$lang['i_retry'] = 'Atkārtot';
$lang['i_license'] = 'Ar kādu licenci saturs tiks publicēts:';
-$lang['mu_intro'] = 'Šeit var augšupielādēt uzreiz vairāku failus. Uzklikšķini Pārlūkot pogai, lai tos ieliktu rindā. Nospied Augšupielādēt, kad rinda sastādīta.';
-$lang['mu_gridname'] = 'Faila vārds';
-$lang['mu_gridsize'] = 'Izmērs';
-$lang['mu_gridstat'] = 'Statuss';
-$lang['mu_namespace'] = 'Nodaļa';
-$lang['mu_browse'] = 'Pārlūkot';
-$lang['mu_toobig'] = 'par lielu';
-$lang['mu_ready'] = 'gatavs augšupielādei';
-$lang['mu_done'] = 'pabeigts';
-$lang['mu_fail'] = 'neizdevās';
-$lang['mu_authfail'] = 'sesijas laiks iztecējis';
-$lang['mu_progress'] = '@PCT@% augšupielādēts';
-$lang['mu_filetypes'] = 'Atļautie failu tipi';
-$lang['mu_info'] = 'faili ir augšupielādēti.';
-$lang['mu_lasterr'] = 'Pēdējā ķļūda.';
$lang['recent_global'] = 'Tu skati izmaiņas nodaļā <b>%s</b>. Ir iespējams <a href="%s">skatīt jaunākos grozījums visā viki</a>. ';
$lang['years'] = 'pirms %d gadiem';
$lang['months'] = 'pirms %d mēnešiem';
@@ -321,4 +304,3 @@ $lang['media_perm_read'] = 'Atvainojiet, jums nav tiesību skatīt failus.
$lang['media_perm_upload'] = 'Atvainojiet, jums nav tiesību augšupielādēt. ';
$lang['media_update'] = 'Augšupielādēt jaunu versiju';
$lang['media_restore'] = 'Atjaunot šo versiju';
-$lang['plugin_install_err'] = 'Modulis aplami instalēts. Pārdēvē moduļa direktoriju %s par %s.';
diff --git a/inc/lang/mk/lang.php b/inc/lang/mk/lang.php
index ca4a746cd..62400063c 100644
--- a/inc/lang/mk/lang.php
+++ b/inc/lang/mk/lang.php
@@ -42,7 +42,6 @@ $lang['btn_backtomedia'] = 'Назад до изборот за медиа
$lang['btn_subscribe'] = 'Менаџирај претплати';
$lang['btn_profile'] = 'Ажурирај профил';
$lang['btn_reset'] = 'Ресет';
-$lang['btn_resendpwd'] = 'Испрати нов пасворд';
$lang['btn_draft'] = 'Уреди скица';
$lang['btn_recover'] = 'Поврати скица';
$lang['btn_draftdel'] = 'Избриши скица';
@@ -77,7 +76,6 @@ $lang['profnoempty'] = 'Празно име или адреса за
$lang['profchanged'] = 'Корисничкиот профил е успешно ажуриран.';
$lang['pwdforget'] = 'Ја заборавивте лозинката? Добијте нова';
$lang['resendna'] = 'Ова вики не поддржува повторно испраќање на лозинка.';
-$lang['resendpwd'] = 'Испрати нова лозинка за';
$lang['resendpwdmissing'] = 'Жалам, морате да ги пополните сите полиња.';
$lang['resendpwdnouser'] = 'Жалам, таков корисник не постои во нашата база со податоци.';
$lang['resendpwdbadauth'] = 'Жалам, овај код за валидација не е валиден. Проверете повторно дали ја искористивте целосната врска за потврда.';
@@ -223,20 +221,6 @@ $lang['i_pol0'] = 'Отвори вики (читај, запиш
$lang['i_pol1'] = 'Јавно вики (читај за сите, запиши и качи за регистрирани корисници)';
$lang['i_pol2'] = 'Затворено вики (читај, запиши, качи само за регистрирани корисници)';
$lang['i_retry'] = 'Пробај повторно';
-$lang['mu_intro'] = 'Овде можете да прикачите повеќе датотеки од еднаш. Кликнете на копчето за пребарување за да ги додадете во редица. Притиснете на качи кога е готово.';
-$lang['mu_gridname'] = 'Име на датотека';
-$lang['mu_gridsize'] = 'Големина';
-$lang['mu_gridstat'] = 'Состојба';
-$lang['mu_browse'] = 'Пребарај';
-$lang['mu_toobig'] = 'премногу голема';
-$lang['mu_ready'] = 'спремна за качување';
-$lang['mu_done'] = 'комплетно';
-$lang['mu_fail'] = 'неуспешно';
-$lang['mu_authfail'] = 'сесијата истече';
-$lang['mu_progress'] = '@PCT@% качено';
-$lang['mu_filetypes'] = 'Дозволено типови на датотеки';
-$lang['mu_info'] = 'качени датотеки.';
-$lang['mu_lasterr'] = 'Последна грешка: ';
$lang['years'] = 'пред %d години';
$lang['months'] = 'пред %d месеци';
$lang['weeks'] = 'пред %d недели';
diff --git a/inc/lang/mr/install.html b/inc/lang/mr/install.html
index ddbf8245b..9696c78dd 100644
--- a/inc/lang/mr/install.html
+++ b/inc/lang/mr/install.html
@@ -1,9 +1,9 @@
-<p>हे पान <a href="http://dokuwiki.org">डॉक्युविकि</a> च्या पहिल्या इन्स्टॉलेशन आणि कॉन्फिगरेशन साठी मदत करतं. या इंस्टॉलर विषयी जास्ती माहिती त्याच्या
+<p>हे पान <a href="http://dokuwiki.org">डॉक्युविकि</a> च्या पहिल्या इन्स्टॉलेशन आणि कॉन्फिगरेशन साठी मदत करतं. या इंस्टॉलर विषयी जास्ती माहिती त्याच्या
<a href="http://dokuwiki.org/installer">माहितीसंग्रह पानावर</a> उपलब्ध आहे.</p>
<p> डॉक्युविकि विकी पाने व सम्बंधित माहिती ( उदा. फोटो , शोध सूची, जुन्या आवृत्ती ई.) साठवण्यासाठी सामान्य फाइलचा उपयोग करतं. डॉक्युविकिने नीट काम करण्यासाठी डॉक्युविकिला या फाइल जिथे साठवल्या आहेत त्या डिरेक्टरीमधे लेखनाचे हक्क ( write access ) असणे <strong>अत्यावश्यक</strong> आहे. या इंस्टॉलरला डिरेक्टरीचे हक्क सेट करता येत नाहीत. ते थेट तुमच्या शेल मधून सेट करावे लागतात, किंवा तुम्ही व्यावसायिक होस्टिंग वापरत असाल तर FTP वापरून अथवा तुमच्या होस्टिंग कंट्रोल पॅनल ( उदा. cPanel वगैरे ) मधून सेट करावे लागतात.</p>
-<p>हा इंस्टॉलर तुमच्या डॉक्युविकिचे <acronym title="access control list">ACL</acronym> कॉन्फिगरेशन ठरवेल, ज्याद्वारे तुम्हाला व्यवस्थापकीय लॉगिन, डॉक्युविकिच्या व्यवस्थापन मेनू मधे प्लगिनचे इन्स्टॉलेशन, सदस्यांची व्यवस्था, विकी पानांवरील हक्क, कॉन्फिगरेशन बदलणे ई. साठी प्रवेशाचे हक्क वगैरे बदल करता येतील. ही व्यवस्था डॉक्युविकि वापरण्यासाठी आवश्यक नाही पण वापरल्यास डॉक्युविकिचे व्यवस्थापन अधिक सुरळित होइल.</p>
+<p>हा इंस्टॉलर तुमच्या डॉक्युविकिचे <abbr title="access control list">ACL</abbr> कॉन्फिगरेशन ठरवेल, ज्याद्वारे तुम्हाला व्यवस्थापकीय लॉगिन, डॉक्युविकिच्या व्यवस्थापन मेनू मधे प्लगिनचे इन्स्टॉलेशन, सदस्यांची व्यवस्था, विकी पानांवरील हक्क, कॉन्फिगरेशन बदलणे ई. साठी प्रवेशाचे हक्क वगैरे बदल करता येतील. ही व्यवस्था डॉक्युविकि वापरण्यासाठी आवश्यक नाही पण वापरल्यास डॉक्युविकिचे व्यवस्थापन अधिक सुरळित होइल.</p>
<p>अनुभवी सदस्य किंवा ज्याना काही ख़ास गरजा असतील त्यानी खालील लिंक्स वापराव्यात :
<a href="http://dokuwiki.org/install">इन्स्टॉलेशनविषयी सूचना</a>
diff --git a/inc/lang/mr/lang.php b/inc/lang/mr/lang.php
index 63fda3e5a..32781e6d4 100644
--- a/inc/lang/mr/lang.php
+++ b/inc/lang/mr/lang.php
@@ -44,14 +44,16 @@ $lang['btn_back'] = 'मागॆ';
$lang['btn_backlink'] = 'येथे काय जोडले आहे';
$lang['btn_backtomedia'] = 'परत माध्यम फाइल निवडीकड़े';
$lang['btn_subscribe'] = 'पृष्ठाच्या बदलांची पुरवणी (फीड) लावा ';
-$lang['btn_unsubscribe'] = 'पृष्ठाच्या बदलांची पुरवणी (फीड) बंद करा';
$lang['btn_profile'] = 'प्रोफाइल अद्ययावत करा';
$lang['btn_reset'] = 'रिसेट';
-$lang['btn_resendpwd'] = 'कृपया परवलीचा नवीन शब्द माझ्या इमेल पत्त्यावर पाठविणे.';
+$lang['btn_resendpwd'] = 'नवीन पासवर्ड';
$lang['btn_draft'] = 'प्रत संपादन';
$lang['btn_recover'] = 'प्रत परत मिळवा';
$lang['btn_draftdel'] = 'प्रत रद्द';
+$lang['btn_revert'] = 'पुनर्स्थापन';
$lang['btn_register'] = 'नोंदणी';
+$lang['btn_apply'] = 'लागू';
+$lang['btn_media'] = 'मिडिया व्यवस्थापक';
$lang['loggedinas'] = 'लॉगिन नाव';
$lang['user'] = 'वापरकर्ता';
$lang['pass'] = 'परवलीचा शब्द';
@@ -82,20 +84,58 @@ $lang['profchanged'] = 'सदस्याची प्रोफाइ
$lang['pwdforget'] = 'परवलीचा शब्द विसरला आहे का? नविन मागवा.';
$lang['resendna'] = 'ह्या विकी मधे परवलीचा शब्द परत पाथाव्न्याची सुविधा नाही.';
$lang['resendpwd'] = 'नविन परवली इच्छुक';
-$lang['resendpwdmissing'] = 'कृपया सर्व रकाने भरा.';
+$lang['resendpwdmissing'] = 'माफ करा, पण सर्व जागा भरल्या पाहिजेत.';
$lang['resendpwdnouser'] = 'माफ़ करा, हा सदस्य आमच्या माहितिसंग्रहात सापडला नाही.';
$lang['resendpwdbadauth'] = 'माफ़ करा, हा अधिकार कोड बरोबर नाही. कृपया आपण पूर्ण शिकामोर्तबाची लिंक वापरल्याची खात्री करा.';
$lang['resendpwdconfirm'] = 'शिक्कामोर्तबाची लिंक ईमेल द्वारा पाठवली आहे.';
$lang['resendpwdsuccess'] = 'शिक्कामोर्तबाची लिंक ईमेल द्वारा पाठवली आहे.';
$lang['license'] = 'विशिष्ठ नोंद केलि नसल्यास ह्या विकी वरील सर्व मजकूर खालील लायसन्स मधे मोडतो : ';
$lang['licenseok'] = 'नोंद : हे पृष्ठ संपादित केल्यास तुम्ही तुमचे योगदान खालील लायसन्स अंतर्गत येइल : ';
+$lang['searchmedia'] = 'फाईल शोधा:';
+$lang['searchmedia_in'] = '%s मधे शोधा';
$lang['txt_upload'] = 'अपलोड करण्याची फाइल निवडा';
$lang['txt_filename'] = 'अपलोड उर्फ़ ( वैकल्पिक )';
$lang['txt_overwrt'] = 'अस्तित्वात असलेल्या फाइलवरच सुरक्षित करा.';
$lang['lockedby'] = 'सध्या लॉक करणारा :';
$lang['lockexpire'] = 'सध्या लॉक करणारा :';
-$lang['js']['willexpire'] = 'हे पृष्ठ संपादित करण्यासाठी मिळालेले लॉक एखाद्या मिनिटात संपणार आहे.\n चुका होऊ नयेत म्हणुन कृपया प्रीव्यू बटन दाबुन लॉक ची वेळ पुन्हा चालू करा.';
-$lang['js']['notsavedyet'] = "सुरक्षित न केलेले बदल नष्ट होतील. नक्की करू का ?";
+$lang['js']['willexpire'] = 'हे पृष्ठ संपादित करण्यासाठी मिळालेले लॉक एखाद्या मिनिटात संपणार आहे.\n चुका होऊ नयेत म्हणुन कृपया प्रीव्यू बटन दाबुन लॉक ची वेळ पुन्हा चालू करा.';
+$lang['js']['notsavedyet'] = 'सुरक्षित न केलेले बदल नष्ट होतील. नक्की करू का ?';
+$lang['js']['searchmedia'] = 'फाईल्ससाठी शोधा';
+$lang['js']['keepopen'] = 'निवड केल्यावर विण्डो उघडी ठेवा';
+$lang['js']['hidedetails'] = 'सविस्तर मजकूर लपवा';
+$lang['js']['mediatitle'] = 'लिंक सेटिंग';
+$lang['js']['mediadisplay'] = 'लिंकचा प्रकार';
+$lang['js']['mediaalign'] = 'जुळवणी';
+$lang['js']['mediasize'] = 'प्रतिमेचा आकार';
+$lang['js']['mediatarget'] = 'लिंकचे लक्ष्य';
+$lang['js']['mediaclose'] = 'बंद';
+$lang['js']['mediadisplayimg'] = 'प्रतिमा दाखवा.';
+$lang['js']['mediadisplaylnk'] = 'फक्त लिंक दाखवा.';
+$lang['js']['mediasmall'] = 'लहान आवृत्ती';
+$lang['js']['mediamedium'] = 'माध्यम आवृत्ती';
+$lang['js']['medialarge'] = 'मोठी आवृत्ती';
+$lang['js']['mediaoriginal'] = 'मूळ आवृत्ती';
+$lang['js']['medialnk'] = 'सविस्तर माहितीकडेची लिंक';
+$lang['js']['mediadirect'] = 'मूळ मजकुराकडे थेट लिंक';
+$lang['js']['medianolnk'] = 'लिंक नको';
+$lang['js']['medianolink'] = 'प्रतिमा लिंक करू नका';
+$lang['js']['medialeft'] = 'प्रतिमा डाव्या बाजूला जुळवून घ्या.';
+$lang['js']['mediaright'] = 'प्रतिमा उजव्या बाजूला जुळवून घ्या.';
+$lang['js']['mediacenter'] = 'प्रतिमा मध्यभागी जुळवून घ्या.';
+$lang['js']['medianoalign'] = 'जुळवाजुळव वापरू नका.';
+$lang['js']['nosmblinks'] = 'विन्डोज़ शेअर ला लिंक केल्यास ते फक्त मायक्रोसॉफ़्ट इन्टरनेट एक्स्प्लोरर वरच चालते. तरी तुम्ही लिंक कॉपी करू शकता.';
+$lang['js']['linkwiz'] = 'लिंक जादूगार';
+$lang['js']['linkto'] = 'याला लिंक करा:';
+$lang['js']['del_confirm'] = 'निवडलेल्या गोष्टी नक्की नष्ट करू का ?';
+$lang['js']['restore_confirm'] = 'हि आवृत्ती खरोखर पुनर्स्थापित करू का?';
+$lang['js']['media_diff'] = 'फरक बघू:';
+$lang['js']['media_diff_both'] = 'बाजूबाजूला';
+$lang['js']['media_diff_portions'] = 'स्वाईप';
+$lang['js']['media_select'] = 'फाईल निवड...';
+$lang['js']['media_upload_btn'] = 'अपलोड';
+$lang['js']['media_done_btn'] = 'झालं';
+$lang['js']['media_drop'] = 'अपलोड करण्यासाठी इथे फाईल टाका';
+$lang['js']['media_cancel'] = 'काढा';
$lang['rssfailed'] = 'ही पुरवणी आणण्यात काही चूक झाली:';
$lang['nothingfound'] = 'काही सापडला नाही.';
$lang['mediaselect'] = 'दृकश्राव्य फाइल';
@@ -113,9 +153,7 @@ $lang['deletefail'] = '%s ही फाइल नष्ट करू
$lang['mediainuse'] = '%s ही फाइल नष्ट केली नाही - ती अजुन वापरात आहे.';
$lang['namespaces'] = 'नेमस्पेस';
$lang['mediafiles'] = 'मध्ये उपलब्ध असलेल्या फाइल';
-$lang['js']['keepopen'] = 'निवड केल्यावर विण्डो उघडी ठेवा';
-$lang['js']['hidedetails'] = 'सविस्तर मजकूर लपवा';
-$lang['js']['nosmblinks'] = 'विन्डोज़ शेअर ला लिंक केल्यास ते फक्त मायक्रोसॉफ़्ट इन्टरनेट एक्स्प्लोरर वरच चालते. तरी तुम्ही लिंक कॉपी करू शकता.';
+$lang['accessdenied'] = 'तुम्हाला हे पान बघायची परवानगी नाही.';
$lang['mediausage'] = 'ह्या फाइलचा संदर्भ देण्यासाठी खालील सिन्टॅक्स वापरा :';
$lang['mediaview'] = 'मूळ फाइल बघू ';
$lang['mediaroot'] = 'रूट';
@@ -131,6 +169,10 @@ $lang['current'] = 'चालू';
$lang['yours'] = 'तुमची आवृत्ति';
$lang['diff'] = 'सध्याच्या आवृत्तिंशी फरक दाखवा';
$lang['diff2'] = 'निवडलेल्या आवृत्तिंमधील फरक दाखवा';
+$lang['difflink'] = 'ह्या तुलना दृष्टीकोनाला लिंक करा';
+$lang['diff_type'] = 'फरक बघू:';
+$lang['diff_inline'] = 'एका ओळीत';
+$lang['diff_side'] = 'बाजूबाजूला';
$lang['line'] = 'ओळ';
$lang['breadcrumb'] = 'मागमूस';
$lang['youarehere'] = 'तुम्ही इथे आहात';
@@ -142,10 +184,21 @@ $lang['restored'] = 'जुनी आवृत्ति पुन
$lang['external_edit'] = 'बाहेरून संपादित';
$lang['summary'] = 'सारांश बदला';
$lang['noflash'] = 'ही माहिती दाखवण्यासाठी <a href="http://www.adobe.com/products/flashplayer/">अडोब फ्लॅश प्लेअर</a> ची गरज आहे.';
+$lang['download'] = 'तुकडा डाउनलोड करा';
+$lang['tools'] = 'साधने';
+$lang['user_tools'] = 'युजरची साधने';
+$lang['site_tools'] = 'साईटची साधने';
+$lang['page_tools'] = 'पानाची साधने';
+$lang['skip_to_content'] = 'सरळ मजकुराकडे ';
$lang['mail_newpage'] = 'पृष्ठ जोडले : ';
$lang['mail_changed'] = 'पृष्ठ बदलले : ';
+$lang['mail_subscribe_list'] = 'ह्या नेमस्पेस नाढे बदललेली पाने:';
$lang['mail_new_user'] = 'नवीन सदस्य : ';
$lang['mail_upload'] = 'फाइल अपलोड केली : ';
+$lang['changes_type'] = 'ह्याचे बदल बघू';
+$lang['pages_changes'] = 'पाने';
+$lang['media_changes'] = 'मिडिया फाईल';
+$lang['both_changes'] = 'पाने आणि मिडिया फाईल दोन्ही';
$lang['qb_bold'] = 'ठळक मजकूर';
$lang['qb_italic'] = 'तिरका मजकूर';
$lang['qb_underl'] = 'अधोरेखित मजकूर';
@@ -156,6 +209,11 @@ $lang['qb_h2'] = 'दुसर्या पातळीचे
$lang['qb_h3'] = 'तिसर्या पातळीचे शीर्षक';
$lang['qb_h4'] = 'चवथ्या पातळीचे शीर्षक';
$lang['qb_h5'] = 'पाचव्या पातळीचे शीर्षक';
+$lang['qb_h'] = 'शीर्षक';
+$lang['qb_hs'] = 'शीर्षक निवड';
+$lang['qb_hplus'] = 'उंच शीर्षक';
+$lang['qb_hminus'] = 'खालचं शीर्षक';
+$lang['qb_hequal'] = 'समान लेवलचे शीर्षक';
$lang['qb_link'] = 'अंतर्गत लिंक';
$lang['qb_extlink'] = 'बाह्य लिंक';
$lang['qb_hr'] = 'आडवी पट्टी';
@@ -165,7 +223,7 @@ $lang['qb_media'] = 'प्रतिमा आणि इतर फ
$lang['qb_sig'] = 'स्वाक्षरी टाका';
$lang['qb_smileys'] = 'स्माइली';
$lang['qb_chars'] = 'ख़ास चिन्ह';
-$lang['js']['del_confirm'] = 'निवडलेल्या गोष्टी नक्की नष्ट करू का ?';
+$lang['upperns'] = 'ह्यावरच्या नेमस्पेसकडे उडी मारा';
$lang['admin_register'] = 'नवीन सदस्य';
$lang['metaedit'] = 'मेटाडेटा बदला';
$lang['metasaveerr'] = 'मेटाडेटा सुरक्षित झाला नाही';
@@ -181,11 +239,9 @@ $lang['img_copyr'] = 'कॉपीराइट';
$lang['img_format'] = 'प्रकार';
$lang['img_camera'] = 'कॅमेरा';
$lang['img_keywords'] = 'मुख्य शब्द';
-$lang['subscribe_success'] = '%s ला %s च्या पुरवणिसाठि नोंदवले';
-$lang['subscribe_error'] = '%s ला %s च्या पुरवणिसाठि नोंदवताना चूक झाली';
-$lang['subscribe_noaddress'] = 'तुमच्या लॉगिनशी सम्बंधित कुठलाही पत्ता नाही , त्यामुळे पुरवणिसाठि नोंद केली जाऊ शकत नाही';
-$lang['unsubscribe_success'] = '%s ला %s च्या पुरवणी यादी मधून काढून टाकले';
-$lang['unsubscribe_error'] = '%s ला %s च्या पुरवणी यादी मधून काढून टाकण्यात चूक झाली';
+$lang['img_width'] = 'रुंदी';
+$lang['img_height'] = 'उंची';
+$lang['img_manager'] = 'मिडिया व्यवस्थापकात बघू';
$lang['authmodfailed'] = 'सदस्य अधिकृत करण्याची व्यवस्था चुकीची आहे. कृपया तुमच्या विकीच्या व्यवस्थापकाशी सम्पर्क साधा.';
$lang['authtempfail'] = 'सदस्य अधिकृत करण्याची सुविधा सध्या चालू नाही. सतत हा मजकूर दिसल्यास कृपया तुमच्या विकीच्या व्यवस्थापकाशी सम्पर्क साधा.';
$lang['i_chooselang'] = 'तुमची भाषा निवडा';
@@ -209,17 +265,4 @@ $lang['i_pol0'] = 'मुक्त विकी ( सर्वा
$lang['i_pol1'] = 'सार्वजनिक विकी ( सर्वांना वाचण्याची मुभा , लेखन व अपलोडची परवानगी फक्त नोंदणीकृत सदस्यांना )';
$lang['i_pol2'] = 'बंदिस्त विकी ( वाचन , लेखन व अपलोडची परवानगी फक्त नोंदणीकृत सदस्यांना ) ';
$lang['i_retry'] = 'पुन्हा प्रयत्न';
-$lang['mu_intro'] = 'इथे तुम्ही एकापेक्षा अधिक फाइल अपलोड करू शकता. ब्राउझ च्या बटणावर क्लिक करून त्याना लिस्ट मधे टाका. सगळ्या टाकुन झाल्यावर अपलोड च्या बटणावर क्लिक करा.';
-$lang['mu_gridname'] = 'फाइल नाम';
-$lang['mu_gridsize'] = 'साइज';
-$lang['mu_gridstat'] = 'स्थिति';
-$lang['mu_namespace'] = 'नेमस्पेस';
-$lang['mu_browse'] = 'ब्राउझ';
-$lang['mu_toobig'] = 'अति मोठे';
-$lang['mu_ready'] = 'अपलोडसाठी तयार';
-$lang['mu_done'] = 'पूर्ण';
-$lang['mu_fail'] = 'अयशस्वी';
-$lang['mu_authfail'] = 'सेशन संपला';
-$lang['mu_progress'] = '@PCT@% अपलोड झाले';
-$lang['mu_filetypes'] = 'मान्य फाइल टाइप';
$lang['recent_global'] = 'तुम्ही सध्या <b>%s</b> या नेमस्पेस मधील बदल पाहात आहात.तुम्ही <a href="%s">पूर्ण विकी मधले बदल </a> सुद्धा पाहू शकता.';
diff --git a/inc/lang/ne/lang.php b/inc/lang/ne/lang.php
index 97e2dde5c..82ca389f7 100644
--- a/inc/lang/ne/lang.php
+++ b/inc/lang/ne/lang.php
@@ -40,7 +40,6 @@ $lang['btn_subscribe'] = 'पृष्ठ परिवर्तन ग
$lang['btn_unsubscribe'] = 'पृष्ठ परिवर्तन अग्राह्य गर्नुहोस्';
$lang['btn_profile'] = 'प्रोफाइल अध्यावधिक गर्नुहोस् ';
$lang['btn_reset'] = 'पूर्वरुपमा फर्काउनुहोस';
-$lang['btn_resendpwd'] = 'नयाँ प्रवेश शव्द(पासवर्ड) पठाउनुहोस् ';
$lang['btn_draft'] = ' ड्राफ्ट सम्पादन गर्नुहोस् ';
$lang['btn_recover'] = 'पहिलेको ड्राफ्ट हासिल गर्नुहोस ';
$lang['btn_draftdel'] = ' ड्राफ्ट मेटाउनुहोस् ';
@@ -75,7 +74,6 @@ $lang['profchanged'] = 'प्रयोगकर्ताको प्
$lang['pwdforget'] = 'आफ्नो पासवर्ड भुल्नु भयो ? नयाँ हासिल गर्नुहोस् ';
$lang['resendna'] = 'यो विकिबाट प्रवेशशव्द पठाउन समर्थित छैन ।';
$lang['resendpwd'] = 'नयाँ प्रवेशशव्द पठाउनुहोस् ';
-$lang['resendpwdmissing'] = 'माफ गर्नुहोस् , तपाईले सबै ठाउ भर्नुपर्छ। ';
$lang['resendpwdnouser'] = 'माफ गर्नुहोस्, हाम्रो डेटावेसमा यो प्रयोगकर्ता भेटिएन ।';
$lang['resendpwdbadauth'] = 'माफ गर्नुहोस् , यो अनुमति चिन्ह गलत छ। तपाईले पूरै जानकारी लिङ्क प्रयोग गर्नु पर्नेछ। ';
$lang['resendpwdconfirm'] = 'तपाईको इमेलमा कन्फरमेशन लिङ्क पठाइएको छ। ';
@@ -200,17 +198,4 @@ $lang['i_pol0'] = 'खुल्ला विकि (पठन,
$lang['i_pol1'] = 'Public विकि (पठन सवैका लागि,लेखन र अपलोड दर्ता गरिएका प्रयपगकर्ताका लागि ) ';
$lang['i_pol2'] = 'बन्द विकि (पठन , लेखन, अपलोड ) दर्ता भएका प्रयोगकर्ताका लागि मात्र ।';
$lang['i_retry'] = 'पुन: प्रयास गर्नुहोस् ';
-$lang['mu_intro'] = 'तपाईले धेरै वटा फाइलहरु एकै पटक अपलोड गर्न सक्नुहुन्छ । browse थिच्नुहोस् अनि सुचीमा थप्नुहोस् । सकिएपछि अपलोड थिछ्चुहोस् ।';
-$lang['mu_gridname'] = 'फाइलनाम ';
-$lang['mu_gridsize'] = 'आकार';
-$lang['mu_gridstat'] = 'स्थिति';
-$lang['mu_namespace'] = 'नेमस्पेस';
-$lang['mu_browse'] = 'Browse';
-$lang['mu_toobig'] = 'धेरै ठूलो';
-$lang['mu_ready'] = 'अपलोडको लागि तयार';
-$lang['mu_done'] = 'पूरा';
-$lang['mu_fail'] = 'असफल';
-$lang['mu_authfail'] = 'सत्र सकियो ';
-$lang['mu_progress'] = '@PCT@% अपलोड भयो ';
-$lang['mu_filetypes'] = 'समर्थित फाइल प्रकार';
$lang['recent_global'] = 'तपाई अहिले <b>%s</b> नेमस्पेस भित्र भएका परिवर्तन हेर्दैहुनुहुन्छ। तपाई <a href="%s">पुरै विकिमा भएको परिवर्तन हेर्न सक्नुहुन्छ</a>.';
diff --git a/inc/lang/nl/edit.txt b/inc/lang/nl/edit.txt
index e539050bc..9718d0900 100644
--- a/inc/lang/nl/edit.txt
+++ b/inc/lang/nl/edit.txt
@@ -1 +1 @@
-Pas de pagina aan en klik op ''Opslaan''. Zie [[wiki:syntax]] voor de Wiki syntax. Pas de pagina allen aan als hij **verbeterd** kan worden. Als je iets wilt uitproberen kun je spelen in de [[playground:playground|zandbak]].
+Pas de pagina aan en klik op ''Opslaan''. Zie [[wiki:syntax]] voor de Wiki-syntax. Pas de pagina allen aan als hij **verbeterd** kan worden. Als je iets wilt uitproberen kun je spelen in de [[playground:playground|zandbak]].
diff --git a/inc/lang/nl/index.txt b/inc/lang/nl/index.txt
index 288957ed4..ad7122ba0 100644
--- a/inc/lang/nl/index.txt
+++ b/inc/lang/nl/index.txt
@@ -1,4 +1,4 @@
====== Index ======
-Dit is een index van alle beschikbare pagina's gesorteerd op [[doku>wiki:namespaces|namespaces]].
+Dit is een index van alle beschikbare pagina's gesorteerd op [[doku>namespaces|namespaces]].
diff --git a/inc/lang/nl/install.html b/inc/lang/nl/install.html
index 8ddec7aab..a65325826 100644
--- a/inc/lang/nl/install.html
+++ b/inc/lang/nl/install.html
@@ -1,14 +1,14 @@
-<p>Deze pagina helpt u bij de eerste installatie en configuratie van <a href="http://wiki.splitbrain.org">Dokuwiki</a>.
-Meer informatie over deze installer is beschikbaar op zijn eigen <a href="http://wiki.splitbrain.org/wiki:installer">documentatiepagina</a>.</p>
+<p>Deze pagina helpt u bij de eerste installatie en configuratie van <a href="http://dokuwiki.org">Dokuwiki</a>.
+Meer informatie over deze installer is beschikbaar op zijn eigen <a href="http://dokuwiki.org/installer">documentatiepagina</a>.</p>
<p>DokuWiki gebruikt platte tekstbestanden voor het opslaan van wikipagina's en andere informatie die bij deze pagina's horen (bijvoorbeeld plaatjes, zoek-indexen, oude revisies enz.). Om goed te kunnen functioneren, <strong>moet</strong>
DokuWiki schrijftoegang hebben tot de directories die deze bestanden bevatten.
De installer kan zelf deze toegangspermissies niet regelen. Dit moet normaal gesproken direct in de command shell worden ingevoerd, of in het geval van hosting via FTP of via uw hosting control panel (bijvoorbeeld cPanel).</p>
-<p>Deze installer zal uw DokuWiki configureren voor <acronym title="access control list">ACL</acronym>,
+<p>Deze installer zal uw DokuWiki configureren voor <abbr title="access control list">ACL</abbr>,
wat de beheerder in staat stelt in te loggen en toegang te verkrijgen tot het beheersdeel van de DokuWiki voor het installeren van plugins, beheren van gebruikers, toegangsrechten tot wiki pagina's en veranderen van configuratie-instellingen.
Het is niet noodzakelijk voor DokuWiki om te functioneren maar het maakt het een stuk makkelijker om Dokuwiki te beheren.</p>
<p>Ervaren gebruikers of gebruikers die een aangepaste configuratie nodig hebben kunnen voor details terecht op de volgende pagina's:
-<a href="http://wiki.splitbrain.org/wiki:install">installatie-instructies</a>
-en <a href="http://wiki.splitbrain.org/wiki:config">configuratie-instellingen</a>.</p>
+<a href="http://dokuwiki.org/install">installatie-instructies</a>
+en <a href="http://dokuwiki.org/config">configuratie-instellingen</a>.</p>
diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php
index 542b99c93..fdc0c075a 100644
--- a/inc/lang/nl/lang.php
+++ b/inc/lang/nl/lang.php
@@ -16,6 +16,7 @@
* @author Timon Van Overveldt <timonvo@gmail.com>
* @author Jeroen
* @author Ricardo Guijt <ricardoguijt@gmail.com>
+ * @author Gerrit <klapinklapin@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -51,14 +52,14 @@ $lang['btn_backtomedia'] = 'Terug naar Bestandsselectie';
$lang['btn_subscribe'] = 'Inschrijven wijzigingen';
$lang['btn_profile'] = 'Profiel aanpassen';
$lang['btn_reset'] = 'Wissen';
-$lang['btn_resendpwd'] = 'Stuur een nieuw wachtwoord';
+$lang['btn_resendpwd'] = 'Nieuw wachtwoord bepalen';
$lang['btn_draft'] = 'Bewerk concept';
$lang['btn_recover'] = 'Herstel concept';
$lang['btn_draftdel'] = 'Verwijder concept';
$lang['btn_revert'] = 'Herstellen';
$lang['btn_register'] = 'Registreren';
$lang['btn_apply'] = 'Toepassen';
-$lang['btn_media'] = 'Media beheerder';
+$lang['btn_media'] = 'Mediabeheerder';
$lang['loggedinas'] = 'Ingelogd als';
$lang['user'] = 'Gebruikersnaam';
$lang['pass'] = 'Wachtwoord';
@@ -88,7 +89,7 @@ $lang['profnoempty'] = 'Een lege gebruikersnaam of e-mailadres is niet
$lang['profchanged'] = 'Gebruikersprofiel succesvol aangepast';
$lang['pwdforget'] = 'Je wachtwoord vergeten? Vraag een nieuw wachtwoord aan';
$lang['resendna'] = 'Deze wiki ondersteunt het verzenden van wachtwoorden niet';
-$lang['resendpwd'] = 'Stuur een nieuw wachtwoord voor';
+$lang['resendpwd'] = 'Nieuw wachtwoord bepalen voor';
$lang['resendpwdmissing'] = 'Sorry, je moet alle velden invullen.';
$lang['resendpwdnouser'] = 'Sorry, we kunnen deze gebruikersnaam niet vinden in onze database.';
$lang['resendpwdbadauth'] = 'Sorry, deze authentiecatiecode is niet geldig. Controleer of je de volledige bevestigings-link hebt gebruikt.';
@@ -101,6 +102,7 @@ $lang['searchmedia_in'] = 'Zoek in %s';
$lang['txt_upload'] = 'Selecteer een bestand om te uploaden';
$lang['txt_filename'] = 'Vul nieuwe naam in (optioneel)';
$lang['txt_overwrt'] = 'Overschrijf bestaand bestand';
+$lang['maxuploadsize'] = 'Max %s per bestand';
$lang['lockedby'] = 'Momenteel in gebruik door';
$lang['lockexpire'] = 'Exclusief gebruiksrecht vervalt op';
$lang['js']['willexpire'] = 'Je exclusieve gebruiksrecht voor het aanpassen van deze pagina verloopt over een minuut.\nKlik op de Voorbeeld-knop om het exclusieve gebruiksrecht te verlengen.';
@@ -195,6 +197,12 @@ $lang['external_edit'] = 'Externe bewerking';
$lang['summary'] = 'Samenvatting wijziging';
$lang['noflash'] = 'De <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> is vereist om de pagina te kunnen weergeven.';
$lang['download'] = 'Download fragment';
+$lang['tools'] = 'Hulpmiddelen';
+$lang['user_tools'] = 'Gebruikershulpmiddelen';
+$lang['site_tools'] = 'Site-hulpmiddelen';
+$lang['page_tools'] = 'Paginahulpmiddelen';
+$lang['skip_to_content'] = 'spring naar tekst';
+$lang['sidebar'] = 'Zijbalk';
$lang['mail_newpage'] = 'pagina toegevoegd:';
$lang['mail_changed'] = 'pagina aangepast:';
$lang['mail_subscribe_list'] = 'Pagina\'s veranderd in namespace:';
@@ -202,8 +210,8 @@ $lang['mail_new_user'] = 'nieuwe gebruiker:';
$lang['mail_upload'] = 'bestand geüpload:';
$lang['changes_type'] = 'Bekijk wijzigingen van';
$lang['pages_changes'] = 'Pagina\'s';
-$lang['media_changes'] = 'Media bestanden';
-$lang['both_changes'] = 'Zowel pagina\'s als media bestanden';
+$lang['media_changes'] = 'Mediabestanden';
+$lang['both_changes'] = 'Zowel pagina\'s als mediabestanden';
$lang['qb_bold'] = 'Vette tekst';
$lang['qb_italic'] = 'Cursieve tekst';
$lang['qb_underl'] = 'Onderstreepte tekst';
@@ -246,7 +254,7 @@ $lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Trefwoorden';
$lang['img_width'] = 'Breedte';
$lang['img_height'] = 'Hoogte';
-$lang['img_manager'] = 'In media beheerder bekijken';
+$lang['img_manager'] = 'In mediabeheerder bekijken';
$lang['subscr_subscribe_success'] = '%s is ingeschreven voor %s';
$lang['subscr_subscribe_error'] = 'Fout bij inschrijven van %s voor %s';
$lang['subscr_subscribe_noaddress'] = 'Er is geen emailadres geassocieerd met uw account, u kunt daardoor niet worden ingeschreven.';
@@ -265,13 +273,14 @@ $lang['subscr_style_digest'] = 'Samenvattings-email met wijzigingen per pagina
$lang['subscr_style_list'] = 'Lijst van veranderde pagina\'s sinds laatste email (elke %.2f dagen)';
$lang['authmodfailed'] = 'Ongeldige gebruikersauthenticatie-configuratie. Informeer de wikibeheerder.';
$lang['authtempfail'] = 'Gebruikersauthenticatie is tijdelijk niet beschikbaar. Als deze situatie zich blijft voordoen, informeer dan de wikibeheerder.';
+$lang['authpwdexpire'] = 'Je wachtwoord verloopt in %d dagen, je moet het binnenkort veranderen';
$lang['i_chooselang'] = 'Kies je taal';
$lang['i_installer'] = 'DokuWiki Installer';
$lang['i_wikiname'] = 'Wikinaam';
$lang['i_enableacl'] = 'ACLs inschakelen (aanbevolen)';
$lang['i_superuser'] = 'Superuser';
$lang['i_problems'] = 'De installer vond problemen, hieronder aangegeven. Verhelp deze voor je doorgaat.';
-$lang['i_modified'] = 'Uit veiligheidsoverwegingen werkt dit script alleen met nieuwe en onveranderde DokuWiki-installaties. Pak de bestanden opnieuw uit of raadpleeg de <a href="http://wiki.splitbrain.org/wiki:install">Dokuwiki installatie-instructies</a>';
+$lang['i_modified'] = 'Uit veiligheidsoverwegingen werkt dit script alleen met nieuwe en onveranderde DokuWiki-installaties. Pak de bestanden opnieuw uit of raadpleeg de <a href="http://dokuwiki.org/install">Dokuwiki installatie-instructies</a>';
$lang['i_funcna'] = 'PHP functie <code>%s</code> is niet beschikbaar. Wellicht heeft je hosting provider deze uitgeschakeld?';
$lang['i_phpver'] = 'PHP-versie <code>%s</code> is lager dan de vereiste <code>%s</code>. Upgrade PHP.';
$lang['i_permfail'] = '<code>%s</code> is niet schrijfbaar voor DokuWiki. Pas de permissie-instellingen van deze directory aan.';
@@ -287,21 +296,6 @@ $lang['i_pol1'] = 'Publieke wiki (lezen voor iedereen, schrijven
$lang['i_pol2'] = 'Besloten wiki (lezen, schrijven en uploaden alleen voor geregistreerde gebruikers)';
$lang['i_retry'] = 'Opnieuw';
$lang['i_license'] = 'Kies a.u.b. een licentie die u voor uw inhoud wilt gebruiken:';
-$lang['mu_intro'] = 'Hiier kun je meerdere bestanden tegelijk uploaden. Klik de blader-knop om ze aan de lijst toe te voegen. Klik Upload als je klaar bent.';
-$lang['mu_gridname'] = 'Bestandsnaam';
-$lang['mu_gridsize'] = 'Grootte';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Namespace';
-$lang['mu_browse'] = 'Blader';
-$lang['mu_toobig'] = 'te groot';
-$lang['mu_ready'] = 'Klaar om te uploaden';
-$lang['mu_done'] = 'klaar';
-$lang['mu_fail'] = 'mislukt';
-$lang['mu_authfail'] = 'sessie beëindigd';
-$lang['mu_progress'] = '@PCT@% geüpload';
-$lang['mu_filetypes'] = 'Toegestane bestandstypes';
-$lang['mu_info'] = 'bestanden geüpload.';
-$lang['mu_lasterr'] = 'Laatste foutmelding:';
$lang['recent_global'] = 'Je bekijkt momenteel de wijzigingen binnen de <b>%s</b> namespace. Je kunt ook de <a href="%s">recente wijzigingen van de hele wiki</a> bekijken.';
$lang['years'] = '%d jaar geleden';
$lang['months'] = '%d maand geleden';
@@ -321,7 +315,7 @@ $lang['media_list_thumbs'] = 'Miniatuurweergaven';
$lang['media_list_rows'] = 'Regels';
$lang['media_sort_name'] = 'Naam';
$lang['media_sort_date'] = 'Datum';
-$lang['media_namespaces'] = 'Kies naamruimte';
+$lang['media_namespaces'] = 'Kies namespace';
$lang['media_files'] = 'Bestanden in %s';
$lang['media_upload'] = 'Upload naar %s';
$lang['media_search'] = 'Zoeken in %s';
@@ -334,4 +328,3 @@ $lang['media_perm_read'] = 'Sorry, u heeft niet voldoende rechten om besta
$lang['media_perm_upload'] = 'Sorry, u heeft niet voldoende rechten om bestanden te uploaden.';
$lang['media_update'] = 'Upload nieuwe versie';
$lang['media_restore'] = 'Deze versie terugzetten';
-$lang['plugin_install_err'] = 'Plugin is juist geinstalleerd. Hernoem plugin map \'%s\' naar \'%s\'.';
diff --git a/inc/lang/nl/mailwrap.html b/inc/lang/nl/mailwrap.html
new file mode 100644
index 000000000..2ffe19a88
--- /dev/null
+++ b/inc/lang/nl/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ </head>
+ <body>
+
+ @HTMLBODY@
+
+ <br /><hr />
+ <small>Deze mail is gegenereerd door DokuWiki op @DOKUWIKIURL@.</small>
+ </body>
+ </html> \ No newline at end of file
diff --git a/inc/lang/nl/register.txt b/inc/lang/nl/register.txt
index 338edcca3..fc31860da 100644
--- a/inc/lang/nl/register.txt
+++ b/inc/lang/nl/register.txt
@@ -1,4 +1,4 @@
====== Registreer als nieuwe gebruiker ======
-Vul alle informatie hieronder in om een nieuw account voor deze wiki aan te maken. Zorg dat je een **geldig e-mailadres** opgeeft - als je je wachtwoord hier niet in kunt vullen wordt het naar dit adres verzonden. De gebruikersnaam moet een geldige [[doku>wiki:pagename|pagename]] zijn.
+Vul alle informatie hieronder in om een nieuw account voor deze wiki aan te maken. Zorg dat je een **geldig e-mailadres** opgeeft - als je je wachtwoord hier niet in kunt vullen wordt het naar dit adres verzonden. De gebruikersnaam moet een geldige [[doku>pagename|paginanaam]] zijn.
diff --git a/inc/lang/nl/resetpwd.txt b/inc/lang/nl/resetpwd.txt
new file mode 100644
index 000000000..345e30725
--- /dev/null
+++ b/inc/lang/nl/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Een nieuw wachtwoord instellen ======
+
+Vul alstublieft een nieuw wachtwoord in voor jouw account in deze wiki. \ No newline at end of file
diff --git a/inc/lang/nl/subscr_digest.txt b/inc/lang/nl/subscr_digest.txt
index 0e6c2c5ba..9f0fe878c 100644
--- a/inc/lang/nl/subscr_digest.txt
+++ b/inc/lang/nl/subscr_digest.txt
@@ -9,7 +9,7 @@ De pagina @PAGE@ in de @TITLE@ wiki is veranderd. Hier zijn de wijzigingen:
Vorige revisie: @OLDPAGE@
Nieuwe revisie: @NEWPAGE@
-Om het verzenden van deze wijzigingsberichtente te stoppen, logt u in op het wiki op @DOKUWIKIURL@ en navigeert u naar @SUBSCRIBE@. Vervolgens kunt u zich voor elke gewenste pagina of namespace uitschrijven.
+Om het verzenden van deze wijzigingsberichten te stoppen, logt u in op de wiki op @DOKUWIKIURL@ en bezoekt u @SUBSCRIBE@. Vervolgens kunt u zich voor elke gewenste pagina of namespace uitschrijven.
--
Deze email is gegenereerd door DokuWiki op @DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/nl/subscr_single.txt b/inc/lang/nl/subscr_single.txt
index 3e74bce17..1cd0c85d4 100644
--- a/inc/lang/nl/subscr_single.txt
+++ b/inc/lang/nl/subscr_single.txt
@@ -1,6 +1,7 @@
Halllo!
-De pagina @PAGE@ in de @TITLE@ wiki is veranderd. Hier zijn de wijzigingen:
+De pagina @PAGE@ in de @TITLE@ wiki is veranderd.
+Hier zijn de wijzigingen:
--------------------------------------------------------
@DIFF@
@@ -12,7 +13,7 @@ Wijzigingssamenvatting: @SUMMARY@
Vorige revisie: @OLDPAGE@
Nieuwe revisie: @NEWPAGE@
-Om het verzenden van deze wijzigingsberichtente te stoppen, logt u in op het wiki op @DOKUWIKIURL@ en navigeert u naar @SUBSCRIBE@. Vervolgens kunt u zich voor elke gewenste pagina of namespace uitschrijven.
+Om het verzenden van deze wijzigingsberichten te stoppen, logt u in op het wiki op @DOKUWIKIURL@ en navigeert u naar @NEWPAGE@. Vervolgens kunt u "Inschrijvingen wijzigen" gebruiken om inschrijvingen te stoppen.
--
Deze email is gegenereerd door DokuWiki op @DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/nl/uploadmail.txt b/inc/lang/nl/uploadmail.txt
index 1816400d7..59920ae3d 100644
--- a/inc/lang/nl/uploadmail.txt
+++ b/inc/lang/nl/uploadmail.txt
@@ -1,6 +1,7 @@
Er is een bestand geüpload naar uw DokuWiki. Hier zijn de details;
Bestand : @MEDIA@
+Oude revisie: @OLD@
Datum : @DATE@
Browser : @BROWSER@
IP-adres : @IPADDRESS@
diff --git a/inc/lang/no/install.html b/inc/lang/no/install.html
index 541445494..ef3ee2ea6 100644
--- a/inc/lang/no/install.html
+++ b/inc/lang/no/install.html
@@ -12,7 +12,7 @@ gjøres direkte fra et kommandoskall, eller om du bruker en leverandør,
via FTP eller ditt kontrollpanel på tjener (f.eks. cPanel).</p>
<p>Denne installasjonen vil sette opp din DokuWiki-konfigurasjon for
-<acronym title="access control list">ACL</acronym>, som igjen tillater administrator
+<abbr title="access control list">ACL</abbr>, som igjen tillater administrator
innlogging og tilgang til DokuWikiens administratormeny for installasjon av tillegg,
brukerbehandling, adgangskontrollbehandling til wikisider og endring av konfigurasjon.
Det er ikke påkrevd for at DokuWiki skal virke, men det vil gjøre Dokuwiki enklere å
diff --git a/inc/lang/no/lang.php b/inc/lang/no/lang.php
index 76b59d9b8..cc3d34aed 100644
--- a/inc/lang/no/lang.php
+++ b/inc/lang/no/lang.php
@@ -53,7 +53,6 @@ $lang['btn_backtomedia'] = 'Tilbake til valg av mediafil';
$lang['btn_subscribe'] = 'Abonnér på endringer';
$lang['btn_profile'] = 'Oppdater profil';
$lang['btn_reset'] = 'Tilbakestill';
-$lang['btn_resendpwd'] = 'Send nytt passord';
$lang['btn_draft'] = 'Rediger kladd';
$lang['btn_recover'] = 'Gjennvinn kladd';
$lang['btn_draftdel'] = 'Slett kladd';
@@ -90,7 +89,6 @@ $lang['profnoempty'] = 'Tomt navn- eller e-postfelt er ikke tillatt.';
$lang['profchanged'] = 'Brukerprofilen ble vellykket oppdatert.';
$lang['pwdforget'] = 'Glemt passordet ditt? Få deg et nytt';
$lang['resendna'] = 'Denne wikien støtter ikke nyutsending av passord.';
-$lang['resendpwd'] = 'Send nytt passord for';
$lang['resendpwdmissing'] = 'Beklager, du må fylle inn alle felt.';
$lang['resendpwdnouser'] = 'Beklager, vi kan ikke finne denne brukeren i vår database.';
$lang['resendpwdbadauth'] = 'Beklager, denne autorisasjonskoden er ikke gyldig. Sjekk at du brukte hele bekreftelseslenken.';
@@ -293,21 +291,6 @@ $lang['i_pol1'] = 'Offentlig Wiki (les for alle, skriving og oppl
$lang['i_pol2'] = 'Lukket Wiki (les, skriv og opplasting bare for registrerte brukere)';
$lang['i_retry'] = 'Prøv igjen';
$lang['i_license'] = 'Velg lisens som du vil legge ut innholdet under:';
-$lang['mu_intro'] = 'Her kan du laste opp flere filer samtidig. Klikk på utforsk-knappen for å legge dem til i køen. Klikk på "last opp" når du er ferdig med å velge filene. ';
-$lang['mu_gridname'] = 'Filnavn';
-$lang['mu_gridsize'] = 'Størrelse';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Navnerom';
-$lang['mu_browse'] = 'Utforsk';
-$lang['mu_toobig'] = 'for stor';
-$lang['mu_ready'] = 'klar for opplasting';
-$lang['mu_done'] = 'ferdig';
-$lang['mu_fail'] = 'feilet';
-$lang['mu_authfail'] = 'sesjonen har utløpt';
-$lang['mu_progress'] = '@PCT@% lastet opp';
-$lang['mu_filetypes'] = 'Tillatte filtyper';
-$lang['mu_info'] = 'filer lastet opp.';
-$lang['mu_lasterr'] = 'Siste feilen:';
$lang['recent_global'] = 'Du ser nå på endringene i navnerommet <b>%s</b>. Du kan også<a href="%s">se på nylig foretatte endringer for hele wikien</a>.';
$lang['years'] = '%d år siden';
$lang['months'] = '%d måneder siden';
@@ -340,4 +323,3 @@ $lang['media_perm_read'] = 'Beklager, du har ikke tilgang til å lese file
$lang['media_perm_upload'] = 'Beklager, du har ikke tilgang til å laste opp filer.';
$lang['media_update'] = 'Last opp ny versjon';
$lang['media_restore'] = 'Gjenopprett denne versjonen';
-$lang['plugin_install_err'] = 'Tillegget ble feil installert. Skift navn på mappen \'%s\' til \'%s\'.';
diff --git a/inc/lang/pl/install.html b/inc/lang/pl/install.html
index f1d48c1ad..01405e6c0 100644
--- a/inc/lang/pl/install.html
+++ b/inc/lang/pl/install.html
@@ -5,19 +5,19 @@ Więcej informacji o instalatorze znajdziesz w
<p>DokuWiki używa zwykłych plików do przechowywania zawartości stron oraz wszelkich
innych informacji takich jak obrazki, poprzednie wersje strony, itp.
-Żeby DokuWiki mogło poprawnie działać <strong>musisz</strong>
+Żeby DokuWiki mogło poprawnie działać <strong>musisz</strong>
nadać prawo zapisu do katalogu zawierającego te pliki. Instalator nie może wykonać
-tych czynności. Musisz zrobić to za pomocą polecenia powłoki, klienta FTP
+tych czynności. Musisz zrobić to za pomocą polecenia powłoki, klienta FTP
lub panelu kontrolnego Twojego dostawcy usług serwerowych.</p>
<p>Instalator pomoże Ci w konfiguracji uprawnień
-<acronym title="access control list">ACL</acronym>,
+<abbr title="access control list">ACL</abbr>,
które z kolei umożliwią Ci założenie konta administratora oraz umożliwią dostęp
do czynności administracyjnych takich jak instalowanie wtyczek, zarządzanie kontami,
zarządzania uprawnieniami do stron oraz konfiguracji wiki. Użycie tego instalatora
nie jest konieczne, jego celem jest tylko ułatwienie administracji DokuWiki.</p>
<p>Zaawansowani użytkownicy lub użytkownicy mający specjalne wymagania powinni
-zapoznać się z
+zapoznać się z
<a href="http://dokuwiki.org/install">instrukcją instalacji</a>
oraz <a href="http://dokuwiki.org/config">instrukcją konfiguracji</a>.</p>
diff --git a/inc/lang/pl/lang.php b/inc/lang/pl/lang.php
index 98536033c..2f448d291 100644
--- a/inc/lang/pl/lang.php
+++ b/inc/lang/pl/lang.php
@@ -13,6 +13,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -48,7 +49,7 @@ $lang['btn_backtomedia'] = 'Powrót do wyboru pliku';
$lang['btn_subscribe'] = 'Subskrybuj zmiany';
$lang['btn_profile'] = 'Aktualizuj profil';
$lang['btn_reset'] = 'Resetuj';
-$lang['btn_resendpwd'] = 'Prześlij nowe hasło';
+$lang['btn_resendpwd'] = 'Podaj nowe hasło';
$lang['btn_draft'] = 'Edytuj szkic';
$lang['btn_recover'] = 'Przywróć szkic';
$lang['btn_draftdel'] = 'Usuń szkic';
@@ -85,7 +86,7 @@ $lang['profnoempty'] = 'Pusta nazwa lub adres e-mail nie dozwolone.';
$lang['profchanged'] = 'Zaktualizowano profil użytkownika.';
$lang['pwdforget'] = 'Nie pamiętasz hasła? Zdobądź nowe!';
$lang['resendna'] = 'To wiki nie pozwala na powtórne przesyłanie hasła.';
-$lang['resendpwd'] = 'Prześlij nowe hasło dla';
+$lang['resendpwd'] = 'Podaj nowe hasło dla';
$lang['resendpwdmissing'] = 'Wypełnij wszystkie pola.';
$lang['resendpwdnouser'] = 'Nie można znaleźć tego użytkownika w bazie danych.';
$lang['resendpwdbadauth'] = 'Błędny kod autoryzacji! Upewnij się, że użyłeś(aś) właściwego odnośnika.';
@@ -98,6 +99,7 @@ $lang['searchmedia_in'] = 'Szukaj w %s';
$lang['txt_upload'] = 'Wybierz plik do wysłania';
$lang['txt_filename'] = 'Nazwa pliku (opcjonalnie)';
$lang['txt_overwrt'] = 'Nadpisać istniejący plik?';
+$lang['maxuploadsize'] = 'Maksymalny rozmiar wysyłanych danych wynosi %s dla jednego pliku.';
$lang['lockedby'] = 'Aktualnie zablokowane przez';
$lang['lockexpire'] = 'Blokada wygasa';
$lang['js']['willexpire'] = 'Twoja blokada edycji tej strony wygaśnie w ciągu minuty. \nW celu uniknięcia konfliktów użyj przycisku podglądu aby odnowić blokadę.';
@@ -135,6 +137,8 @@ $lang['js']['del_confirm'] = 'Czy na pewno usunąć?';
$lang['js']['restore_confirm'] = 'Naprawdę przywrócić tą wersję?';
$lang['js']['media_diff'] = 'Pokaż różnice:';
$lang['js']['media_diff_both'] = 'Obok siebie';
+$lang['js']['media_diff_opacity'] = 'Przezroczystość';
+$lang['js']['media_diff_portions'] = 'Przesunięcie';
$lang['js']['media_select'] = 'Wybierz pliki...';
$lang['js']['media_upload_btn'] = 'Przesłanie plików';
$lang['js']['media_done_btn'] = 'Zrobione';
@@ -190,6 +194,11 @@ $lang['external_edit'] = 'edycja zewnętrzna';
$lang['summary'] = 'Opis zmian';
$lang['noflash'] = 'Plugin <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> jest niezbędny do obejrzenia tej zawartości.';
$lang['download'] = 'Pobierz zrzut';
+$lang['tools'] = 'Narzędzia';
+$lang['user_tools'] = 'Narzędzia użytkownika';
+$lang['site_tools'] = 'Narzędzia witryny';
+$lang['page_tools'] = 'Narzędzia strony';
+$lang['skip_to_content'] = 'przejście do zawartości';
$lang['mail_newpage'] = 'Strona dodana:';
$lang['mail_changed'] = 'Strona zmieniona:';
$lang['mail_subscribe_list'] = 'Zmienione strony w katalogu:';
@@ -260,6 +269,7 @@ $lang['subscr_style_digest'] = 'email ze streszczeniem zmian dla każdej ze st
$lang['subscr_style_list'] = 'lista zmienionych stron od czasu ostatniego emaila';
$lang['authmodfailed'] = 'Błąd uwierzytelnienia. Powiadom administratora tego wiki.';
$lang['authtempfail'] = 'Uwierzytelnienie użytkownika jest w tej chwili niemożliwe. Jeśli ta sytuacja się powtórzy, powiadom administratora tego wiki.';
+$lang['authpwdexpire'] = 'Twoje hasło wygaśnie za %d dni. Należy je zmienić w krótkim czasie.';
$lang['i_chooselang'] = 'Wybierz język';
$lang['i_installer'] = 'Instalator DokuWiki';
$lang['i_wikiname'] = 'Nazwa Wiki';
@@ -283,21 +293,6 @@ $lang['i_pol1'] = 'Publiczne Wiki (odczyt dla wszystkich, zapis i
$lang['i_pol2'] = 'Zamknięte Wiki (odczyt, zapis i dodawanie plików tylko dla zarejestrowanych użytkowników)';
$lang['i_retry'] = 'Spróbuj ponownie';
$lang['i_license'] = 'Wybierz licencję, na warunkach której chcesz udostępniać treści:';
-$lang['mu_intro'] = 'Możesz tutaj wysłać wiele plików na raz. Kliknij przycisk "Przeglądaj" aby dodać je do kolejki. Kliknij "Wyślij" gdy skończysz.';
-$lang['mu_gridname'] = 'Nazwa pliku';
-$lang['mu_gridsize'] = 'Rozmiar';
-$lang['mu_gridstat'] = 'Stan';
-$lang['mu_namespace'] = 'Katalog';
-$lang['mu_browse'] = 'Przeglądaj';
-$lang['mu_toobig'] = 'za duży';
-$lang['mu_ready'] = 'gotowy do wysłania';
-$lang['mu_done'] = 'zakończono';
-$lang['mu_fail'] = 'nie powiodło się';
-$lang['mu_authfail'] = 'sesja wygasła';
-$lang['mu_progress'] = '@PCT@% wysłano';
-$lang['mu_filetypes'] = 'Dozwolone typy plików';
-$lang['mu_info'] = 'wysłanych plików.';
-$lang['mu_lasterr'] = 'Ostatni błąd:';
$lang['recent_global'] = 'W tej chwili przeglądasz zmiany w katalogu <b>%s</b>. Możesz przejrzeć także <a href="%s">zmiany w całym wiki</a>.';
$lang['years'] = '%d lat temu';
$lang['months'] = '%d miesięcy temu';
@@ -330,4 +325,3 @@ $lang['media_perm_read'] = 'Przepraszamy, nie masz wystarczających uprawn
$lang['media_perm_upload'] = 'Przepraszamy, nie masz wystarczających uprawnień do przesyłania plików.';
$lang['media_update'] = 'Prześlij nową wersję';
$lang['media_restore'] = 'Odtwórz tą wersję';
-$lang['plugin_install_err'] = 'Wtyczka zainstalowana nieprawidłowo. Zmień nazwę katalogu wtyczki \'%s\' na \'%s\'.';
diff --git a/inc/lang/pl/mailwrap.html b/inc/lang/pl/mailwrap.html
new file mode 100644
index 000000000..61772866e
--- /dev/null
+++ b/inc/lang/pl/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Ta wiadomość została wygenerowana przez DokuWiki na @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/pl/resetpwd.txt b/inc/lang/pl/resetpwd.txt
new file mode 100644
index 000000000..64d2d7d47
--- /dev/null
+++ b/inc/lang/pl/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Ustalenie nowego hasła ======
+
+Podaj, proszę, nowe hasło do Twojego konta w tym wiki. \ No newline at end of file
diff --git a/inc/lang/pt-br/install.html b/inc/lang/pt-br/install.html
index b915f0701..d1b786939 100644
--- a/inc/lang/pt-br/install.html
+++ b/inc/lang/pt-br/install.html
@@ -2,6 +2,6 @@
<p>O DokuWiki utiliza arquivos em texto simples para o armazenamento das páginas wiki e de outras informações associadas a essas páginas (ex.: imagens, índices de pesquisa, revisões antigas, etc.). Para que o DokuWiki funcione corretamente, ele <strong>precisa</strong> ter permissão de escrita aos diretórios onde esses arquivos ficarão armazenados. Esse instalador não tem capacidade de configurar as permissões de diretório. Isso normalmente é feito usando-se a linha de comando ou através do FTP ou do painel de controle da sua hospedagem (ex.: cPanel).</p>
-<p>O instalador irá definir as configurações da <acronym title="access control list (lista de controle de acessos)">ACL</acronym> do seu DokuWiki, o que permitirá a autenticação do administrador e o acesso ao menu de administração do sistema. Esse menu é utilizado para instalar plug-ins, alterar as configurações do ambiente e gerenciar usuários e acessos às páginas do wiki. Isso não é necessário para o funcionamento do DokuWiki, mas irá torna sua administração mais simples.</p>
+<p>O instalador irá definir as configurações da <abbr title="access control list (lista de controle de acessos)">ACL</abbr> do seu DokuWiki, o que permitirá a autenticação do administrador e o acesso ao menu de administração do sistema. Esse menu é utilizado para instalar plug-ins, alterar as configurações do ambiente e gerenciar usuários e acessos às páginas do wiki. Isso não é necessário para o funcionamento do DokuWiki, mas irá torna sua administração mais simples.</p>
<p>Usuários experientes ou que necessitem efetuar configurações especiais devem utilizar os seguintes links, com instruções detalhadas da <a href="http://dokuwiki.org/install">instalação</a> e da <a href="http://dokuwiki.org/config">configuração</a>.</p> \ No newline at end of file
diff --git a/inc/lang/pt-br/lang.php b/inc/lang/pt-br/lang.php
index 373590b76..d6dc8f96b 100644
--- a/inc/lang/pt-br/lang.php
+++ b/inc/lang/pt-br/lang.php
@@ -54,7 +54,6 @@ $lang['btn_backtomedia'] = 'Voltar à seleção do arquivo de mídia';
$lang['btn_subscribe'] = 'Monitorar alterações';
$lang['btn_profile'] = 'Atualizar o perfil';
$lang['btn_reset'] = 'Limpar';
-$lang['btn_resendpwd'] = 'Envie-me uma nova senha';
$lang['btn_draft'] = 'Editar o rascunho';
$lang['btn_recover'] = 'Recuperar o rascunho';
$lang['btn_draftdel'] = 'Excluir o rascunho';
@@ -89,7 +88,6 @@ $lang['profnoempty'] = 'Não são permitidos nomes ou endereços de e-
$lang['profchanged'] = 'O perfil do usuário foi atualizado com sucesso.';
$lang['pwdforget'] = 'Esqueceu sua senha? Solicite outra';
$lang['resendna'] = 'Esse wiki não tem suporte para o reenvio de senhas.';
-$lang['resendpwd'] = 'Enviar a nova senha para';
$lang['resendpwdmissing'] = 'Desculpe, você deve preencher todos os campos.';
$lang['resendpwdnouser'] = 'Desculpe, não foi possível encontrar esse usuário no nosso banco de dados.';
$lang['resendpwdbadauth'] = 'Desculpe, esse código de autorização é inválido. Certifique-se de que você usou o link de confirmação inteiro.';
@@ -271,21 +269,6 @@ $lang['i_pol1'] = 'Wiki público (leitura por todos, escrita e en
$lang['i_pol2'] = 'Wiki fechado (leitura, escrita e envio de arquivos somente por usuários registrados)';
$lang['i_retry'] = 'Tentar novamente';
$lang['i_license'] = 'Por favor escolha a licença que voce deseja utilizar para seu conteúdo:';
-$lang['mu_intro'] = 'Aqui você pode enviar vários arquivos de uma só vez. Clique no botão de navegação e adicione-os à fila. Pressione Enviar quando estiver pronto.';
-$lang['mu_gridname'] = 'Nome do arquivo';
-$lang['mu_gridsize'] = 'Tamanho';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Espaço de nomes';
-$lang['mu_browse'] = 'Navegar';
-$lang['mu_toobig'] = 'muito grande';
-$lang['mu_ready'] = 'pronto para enviar';
-$lang['mu_done'] = 'completo';
-$lang['mu_fail'] = 'falhou';
-$lang['mu_authfail'] = 'a sessão expirou';
-$lang['mu_progress'] = '@PCT@% enviado';
-$lang['mu_filetypes'] = 'Tipos de arquivo permitidos';
-$lang['mu_info'] = 'arquivos enviados.';
-$lang['mu_lasterr'] = 'Erro mais recente:';
$lang['recent_global'] = 'Você está observando as alterações dentro do espaço de nomes <b>%s</b>. Também é possível ver as <a href="%s">modificações recentes no wiki inteiro</a>.';
$lang['years'] = '%d anos atrás';
$lang['months'] = '%d meses atrás';
diff --git a/inc/lang/pt/install.html b/inc/lang/pt/install.html
index a2fd5c7c6..69227bd4e 100644
--- a/inc/lang/pt/install.html
+++ b/inc/lang/pt/install.html
@@ -3,6 +3,6 @@
<p>O DokuWiki usa ficheiros normais para armazenar as páginas Wiki e outras informações associadas a essas páginas (i.e. imagens, índices de pesquisa, revisões antigas, etc.). O DokuWiki para poder funcionar correctamente <strong>requer</strong> permissões de escrita às pastas que contêm esses ficheiros. Este "assistente" não é capaz de configurar essas permissões. Isso tem que ser feito via linha de comandos, FTP ou Painel de Controlo do serviço de alojamento (i.e. cPanel).</p>
<p>Este "assistente" vai configurar o DokuWiki com
-<acronym title="access control list">ACL</acronym>, que por sua vez permite ao administrador entrar em sessão e aceder ao menu de Administração do DokuWiki para poder instalar plugins, gerir utilizadores e seus perfis, gerir acesso às páginas e à própria configuração do DokuWiki. Não é necessário para que o DokuWiki funcione, mas facilita a sua administração.</p>
+<abbr title="access control list">ACL</abbr>, que por sua vez permite ao administrador entrar em sessão e aceder ao menu de Administração do DokuWiki para poder instalar plugins, gerir utilizadores e seus perfis, gerir acesso às páginas e à própria configuração do DokuWiki. Não é necessário para que o DokuWiki funcione, mas facilita a sua administração.</p>
<p>Utilizadores experiente ou com requisitos especiais devem seguir estes links, que detalham mais em pormenor a<a href="http://dokuwiki.org/install">instalação</a> e <a href="http://dokuwiki.org/config">configuração</a> do DokuWiki.</p> \ No newline at end of file
diff --git a/inc/lang/pt/lang.php b/inc/lang/pt/lang.php
index 2fa8a1ab4..af388985c 100644
--- a/inc/lang/pt/lang.php
+++ b/inc/lang/pt/lang.php
@@ -45,7 +45,6 @@ $lang['btn_backtomedia'] = 'Voltar à Selecção de Media';
$lang['btn_subscribe'] = 'Subscrever Alterações';
$lang['btn_profile'] = 'Actualizar Perfil';
$lang['btn_reset'] = 'Limpar';
-$lang['btn_resendpwd'] = 'Enviar nova senha';
$lang['btn_draft'] = 'Editar rascunho';
$lang['btn_recover'] = 'Recuperar rascunho';
$lang['btn_draftdel'] = 'Apagar rascunho';
@@ -86,7 +85,6 @@ $lang['profchanged'] = 'Perfil do utilizador actualizado com sucesso.'
$lang['pwdforget'] = 'Esqueceu a sua senha? Pedir nova senha';
$lang['resendna'] = 'Este wiki não suporta reenvio de senhas.';
-$lang['resendpwd'] = 'Enviar nova senha para';
$lang['resendpwdmissing'] = 'É preciso preencher todos os campos.';
$lang['resendpwdnouser'] = 'Não foi possível encontrar este utilizador.';
$lang['resendpwdbadauth'] = 'O código de autenticação não é válido. Por favor, assegure-se de que o link de confirmação está completo.';
@@ -278,21 +276,6 @@ $lang['i_pol1'] = 'Wiki Público (ler para todos, escrever e carr
$lang['i_pol2'] = 'Wiki Fechado (ler, escrever e carregar somente para utilizadores inscritos)';
$lang['i_retry'] = 'Repetir';
$lang['i_license'] = 'Por favor escolha a licença sob a qual quer colocar o seu conteúdo:';
-$lang['mu_intro'] = 'Aqui podes enviar múltiplos ficheiros de uma vez. Clique no botão de navegação para adicioná-los na fila. Premir upload quando pronto.';
-$lang['mu_gridname'] = 'Nome do ficheiro';
-$lang['mu_gridsize'] = 'Tamanho';
-$lang['mu_gridstat'] = 'Estado';
-$lang['mu_namespace'] = 'Espaço de Nomes';
-$lang['mu_browse'] = 'Navegar';
-$lang['mu_toobig'] = 'demasiado grande';
-$lang['mu_ready'] = 'pronto para upload';
-$lang['mu_done'] = 'completo';
-$lang['mu_fail'] = 'falhou';
-$lang['mu_authfail'] = 'sessão expirada';
-$lang['mu_progress'] = '@PCT@% transferido';
-$lang['mu_filetypes'] = 'Tipos de Ficheiros Permitidos';
-$lang['mu_info'] = 'Ficheiros carregados.';
-$lang['mu_lasterr'] = 'Último erro:';
$lang['recent_global'] = 'Você está a observar as alterações dentro do espaço de nomes <b>%s</b>. Também é possível ver as <a href="%s">modificações recentes no wiki inteiro</a>.';
$lang['years'] = '%d anos atrás';
$lang['months'] = '%d meses atrás';
@@ -334,4 +317,3 @@ $lang['js']['media_drop'] = 'Largue ficheiros aqui para enviar';
$lang['js']['media_cancel'] = 'remover';
$lang['js']['media_overwrt'] = 'Escrever por cima de ficheiros existentes';
-$lang['plugin_install_err'] = "Plugin instalado incorrectamente. Renomeie a pasta do plugin de '%s' para '%s'.";
diff --git a/inc/lang/ro/install.html b/inc/lang/ro/install.html
index 56cf3873b..bfa4f496f 100644
--- a/inc/lang/ro/install.html
+++ b/inc/lang/ro/install.html
@@ -1,9 +1,9 @@
<p>Această pagină oferă asistenţă la instalarea pentru prima dată a <a href="http://dokuwiki.org">Dokuwiki</a>. Mai multe informaţii privind această instalare găsiţi pe <a href="http://dokuwiki.org/installer">pagina de documentaţie</a>.</p>
-<p>DokuWiki foloseşte fişiere obişnuite pentru stocarea paginilor wiki şi a informaţilor asociate acestor pagini (de ex. imagini, indecşi de căutare, versiuni vechi, etc). Pentru a lucra cu succes, DokuWiki <strong>trebuie</strong> să aibă drepturi de scriere în directoarele ce conţin aceste fişiere.
+<p>DokuWiki foloseşte fişiere obişnuite pentru stocarea paginilor wiki şi a informaţilor asociate acestor pagini (de ex. imagini, indecşi de căutare, versiuni vechi, etc). Pentru a lucra cu succes, DokuWiki <strong>trebuie</strong> să aibă drepturi de scriere în directoarele ce conţin aceste fişiere.
Acest script de instalare nu poate seta drepturile directoarelor. De regulă, aceasta se face direct, în linie de comandă, sau în cazul găzduirii, prin FTP sau prin panoul de control al gazdei (de ex. cPanel).</p>
-<p>Acest script de instalare va configura DokuWiki pentru <acronym title="access control list">ACL</acronym>, care permite logarea administratorului şi accesul la meniul de administrare pentru instalarea plugin-urilor, gestiunea utilizatorilor, a accesului la paginile wiki şi modificarea setărilor de configurare.
+<p>Acest script de instalare va configura DokuWiki pentru <abbr title="access control list">ACL</abbr>, care permite logarea administratorului şi accesul la meniul de administrare pentru instalarea plugin-urilor, gestiunea utilizatorilor, a accesului la paginile wiki şi modificarea setărilor de configurare.
Nu este necesar pentru ca DokuWiki să funcţioneze, însă face mai uşoară administrarea DokuWiki.</p>
<p>Utilizatorii experimentaţi sau utilizatorii ce au nevoie de setări speciale ar putea folosi această legătură privind<a href="http://dokuwiki.org/install">instrucţiunile de instalare</a> şi <a href="http://dokuwiki.org/config">setările de configurare</a>.</p>
diff --git a/inc/lang/ro/lang.php b/inc/lang/ro/lang.php
index 91f8ebb97..0c7e02605 100644
--- a/inc/lang/ro/lang.php
+++ b/inc/lang/ro/lang.php
@@ -8,6 +8,8 @@
* @author Emanuel-Emeric Andrași <n30@mandrivausers.ro>
* @author Emanuel-Emeric Andraşi <em.andrasi@mandrivausers.ro>
* @author Marius OLAR <olarmariusalex@gmail.com>
+ * @author Marius Olar <olarmariusalex@yahoo.com>
+ * @author Emanuel-Emeric Andrași <em.andrasi@mandrivausers.ro>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -43,7 +45,7 @@ $lang['btn_backtomedia'] = 'Înapoi la Selecţia Mediafile';
$lang['btn_subscribe'] = 'Subscrie Modificarea Paginii';
$lang['btn_profile'] = 'Actualizează Profil';
$lang['btn_reset'] = 'Resetează';
-$lang['btn_resendpwd'] = 'Trimite parola nouă';
+$lang['btn_resendpwd'] = 'Setează o parolă nouă';
$lang['btn_draft'] = 'Editează schiţă';
$lang['btn_recover'] = 'Recuperează schiţă';
$lang['btn_draftdel'] = 'Şterge schiţă';
@@ -80,7 +82,7 @@ $lang['profnoempty'] = 'Nu sunt admise numele sau adresa de email neco
$lang['profchanged'] = 'Profilul de utilizator a fost actualizat succes.';
$lang['pwdforget'] = 'Parola uitată? Luaţi una nouă';
$lang['resendna'] = 'Această wiki nu suportă retrimiterea parolei.';
-$lang['resendpwd'] = 'Trimite parola nouă pentru';
+$lang['resendpwd'] = 'Setează o parolă nouă pentru';
$lang['resendpwdmissing'] = 'Ne pare rău, trebuie completate toate câmpurile.';
$lang['resendpwdnouser'] = 'Ne pare rău, acest utilizator nu poate fi găsit în baza de date.';
$lang['resendpwdbadauth'] = 'Ne pare rău, acest cod de autorizare nu este corect. Verificaţi dacă aţi folosit tot link-ul de confirmare.';
@@ -187,6 +189,11 @@ $lang['external_edit'] = 'editare externă';
$lang['summary'] = 'Editează sumarul';
$lang['noflash'] = 'Plugin-ul <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> este necesar pentru afişarea corectă a conţinutului.';
$lang['download'] = 'Bloc descărcări';
+$lang['tools'] = 'Unelte';
+$lang['user_tools'] = 'Unelte utilizator';
+$lang['site_tools'] = 'Unelte Site';
+$lang['page_tools'] = 'Unelte Pagină';
+$lang['skip_to_content'] = 'sari la conținut';
$lang['mail_newpage'] = 'pagina adăugată:';
$lang['mail_changed'] = 'page schimbată:';
$lang['mail_subscribe_list'] = 'pagini modificate în spaţiul de nume:';
@@ -257,6 +264,7 @@ $lang['subscr_style_digest'] = 'digerează email la schimbări pentru fiecare
$lang['subscr_style_list'] = 'lista paginilor schimbate de la ultimul email (la fiecare %.2f zile)';
$lang['authmodfailed'] = 'Configuraţia autentificării utilizatorului este eronată. Anunţaţi Wiki Admin-ul.';
$lang['authtempfail'] = 'Autentificarea utilizatorului este temporar indisponibilă. Anunţaţi Wiki Admin-ul.';
+$lang['authpwdexpire'] = 'Parola vă va expira în %d zile, ar trebui să o schimbați curând.';
$lang['i_chooselang'] = 'Alegeţi limba';
$lang['i_installer'] = 'DokuWiki Installer';
$lang['i_wikiname'] = 'Numele Wiki';
@@ -280,21 +288,6 @@ $lang['i_pol1'] = 'Wiki Deschisă (citeste oricine, scrie şi în
$lang['i_pol2'] = 'Wiki Închisă (citeşte, scrie şi încarcă doar utilizatorul înregistrat)';
$lang['i_retry'] = 'Încearcă din nou';
$lang['i_license'] = 'Vă rugăm alegeţi licenţa sub care doriţi să vă licenţiaţi materialul:';
-$lang['mu_intro'] = 'Aici poţi încărca mai multe fişiere simultan. Apasă butonul Răsfoieşte pentru a le adăuga. Apasă Încarcă când ai terminat.';
-$lang['mu_gridname'] = 'Numele fişierului';
-$lang['mu_gridsize'] = 'Mărime';
-$lang['mu_gridstat'] = 'Stare';
-$lang['mu_namespace'] = 'Spaţiu de nume';
-$lang['mu_browse'] = 'Răsfoieşte';
-$lang['mu_toobig'] = 'prea mare';
-$lang['mu_ready'] = 'pregătit pentru încărcare';
-$lang['mu_done'] = 'complet';
-$lang['mu_fail'] = 'eşuat';
-$lang['mu_authfail'] = 'sesiunea a expirat';
-$lang['mu_progress'] = '@PCT@% încărcat';
-$lang['mu_filetypes'] = 'Tipuri de fişiere permise';
-$lang['mu_info'] = 'fişiere încărcate';
-$lang['mu_lasterr'] = 'Ultima eroare:';
$lang['recent_global'] = 'Acum vizualizaţi modificările în interiorul numelui de spaţiu <b>%s</b>. De asemenea puteţi <a href="%s">vizualiza modificările recente ale întregului wiki</a>.';
$lang['years'] = 'acum %d ani';
$lang['months'] = 'acum %d luni';
@@ -327,4 +320,3 @@ $lang['media_perm_read'] = 'Ne pare rău, dar nu aveți suficiente dreptur
$lang['media_perm_upload'] = 'Ne pare rău, dar nu aveți suficiente drepturi pentru a putea încărca fișiere.';
$lang['media_update'] = 'Încarcă noua versiune';
$lang['media_restore'] = 'Restaurează această versiune';
-$lang['plugin_install_err'] = 'Modul instalat greșit. Redenumește directorul modulului \'%s\' în \'%s\'.';
diff --git a/inc/lang/ro/resetpwd.txt b/inc/lang/ro/resetpwd.txt
new file mode 100644
index 000000000..2eb8052f1
--- /dev/null
+++ b/inc/lang/ro/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Setează parolă nouă ======
+
+Vă rugăm să introduceți o nouă parolă pentru contul dvs. pe acest wiki. \ No newline at end of file
diff --git a/inc/lang/ru/install.html b/inc/lang/ru/install.html
index b830b06c0..c1c58faa0 100644
--- a/inc/lang/ru/install.html
+++ b/inc/lang/ru/install.html
@@ -2,6 +2,6 @@
<p>«ДокуВики» использует обычные файлы для хранения страниц и дополнительной информации (например, изображений, поискового индекса, предыдущих версий страницы, и т. д.). Для успешной работы «ДокуВики» <strong>необходим</strong> доступ на запись к директориям с этими файлами. Данная программа установки не может самостоятельно изменять системные права доступа к директориям. Обычно это делается напрямую из командной строки (shell), или, если вы используете удалённый хостинг, через FTP или панель управления своего хостинга (например, cPanel).</p>
-<p>Программа установки включит использование списков контроля доступа (<acronym title="access control list">ACL</acronym>) в вашей «ДокуВики». Это позволит администратору, после авторизации в «ДокуВики», использовать специальное меню для установки плагинов, управления пользователями и доступом к страницам вики, а также для настройки конфигурационных параметров. Списки контроля доступа не обязательны для работы «ДокуВики», однако они позволяют упростить управление вашей «ДокуВики».</p>
+<p>Программа установки включит использование списков контроля доступа (<abbr title="access control list">ACL</abbr>) в вашей «ДокуВики». Это позволит администратору, после авторизации в «ДокуВики», использовать специальное меню для установки плагинов, управления пользователями и доступом к страницам вики, а также для настройки конфигурационных параметров. Списки контроля доступа не обязательны для работы «ДокуВики», однако они позволяют упростить управление вашей «ДокуВики».</p>
<p>Опытным пользователям и пользователям со специальными требованиями к установке рекомендуется обратиться по следующим ссылкам для уточнения подробностей <a href="http://www.dokuwiki.org/install">процесса установки</a> и <a href="http://www.dokuwiki.org/config">параметров конфигурации</a>.</p>
diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php
index eda838451..800b1a1b2 100644
--- a/inc/lang/ru/lang.php
+++ b/inc/lang/ru/lang.php
@@ -19,15 +19,15 @@
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
* @author Ladyko Andrey <fylh@succexy.spb.ru>
* @author Eugene <windy.wanderer@gmail.com>
+ * @author Johnny Utah <pcpa@cyberpunk.su>
*/
$lang['encoding'] = ' utf-8';
$lang['direction'] = 'ltr';
-$lang['doublequoteopening'] = '«'; //&ldquo;
-$lang['doublequoteclosing'] = '»'; //&rdquo;
-$lang['singlequoteopening'] = '„'; //&lsquo;
-$lang['singlequoteclosing'] = '“'; //&rsquo;
-$lang['apostrophe'] = '’'; //&rsquo;
-
+$lang['doublequoteopening'] = '«';
+$lang['doublequoteclosing'] = '»';
+$lang['singlequoteopening'] = '„';
+$lang['singlequoteclosing'] = '“';
+$lang['apostrophe'] = '’';
$lang['btn_edit'] = 'Править страницу';
$lang['btn_source'] = 'Показать исходный текст';
$lang['btn_show'] = 'Показать страницу';
@@ -55,7 +55,7 @@ $lang['btn_backtomedia'] = 'Вернуться к выбору медиа
$lang['btn_subscribe'] = 'Подписаться (все правки)';
$lang['btn_profile'] = 'Профиль';
$lang['btn_reset'] = 'Сброс';
-$lang['btn_resendpwd'] = 'Выслать новый пароль';
+$lang['btn_resendpwd'] = 'Установить новый пароль';
$lang['btn_draft'] = 'Править черновик';
$lang['btn_recover'] = 'Восстановить черновик';
$lang['btn_draftdel'] = 'Удалить черновик';
@@ -63,7 +63,6 @@ $lang['btn_revert'] = 'Восстановить';
$lang['btn_register'] = 'Зарегистрироваться';
$lang['btn_apply'] = 'Применить';
$lang['btn_media'] = 'Media Manager';
-
$lang['loggedinas'] = 'Зашли как';
$lang['user'] = 'Логин';
$lang['pass'] = 'Пароль';
@@ -78,7 +77,6 @@ $lang['badlogin'] = 'Извините, неверное имя по
$lang['minoredit'] = 'Небольшие изменения';
$lang['draftdate'] = 'Черновик сохранён';
$lang['nosecedit'] = 'За это время страница была изменена и информация о секции устарела. Загружена полная версия страницы.';
-
$lang['regmissing'] = 'Извините, вам следует заполнить все поля.';
$lang['reguexists'] = 'Извините, пользователь с таким логином уже существует.';
$lang['regsuccess'] = 'Пользователь создан, пароль выслан на адрес электронной почты.';
@@ -88,32 +86,29 @@ $lang['regbadmail'] = 'Данный вами адрес электр
$lang['regbadpass'] = 'Два введённых пароля не идентичны. Пожалуйста, попробуйте ещё раз.';
$lang['regpwmail'] = 'Ваш пароль для системы «ДокуВики»';
$lang['reghere'] = 'У вас ещё нет аккаунта? Зарегистрируйтесь';
-
$lang['profna'] = 'Данная вики не поддерживает изменение профиля';
$lang['profnochange'] = 'Изменений не было внесено, профиль не обновлён.';
$lang['profnoempty'] = 'Логин и адрес электронной почты не могут быть пустыми.';
$lang['profchanged'] = 'Профиль пользователя успешно обновлён.';
-
$lang['pwdforget'] = 'Забыли пароль? Получите новый';
$lang['resendna'] = 'Данная вики не поддерживает повторную отправку пароля.';
-$lang['resendpwd'] = 'Выслать пароль для';
+$lang['resendpwd'] = 'Установить новый пароль для';
$lang['resendpwdmissing'] = 'Вы должны заполнить все поля формы.';
$lang['resendpwdnouser'] = 'Пользователь с таким логином не обнаружен в нашей базе данных.';
$lang['resendpwdbadauth'] = 'Извините, неверный код авторизации. Убедитесь, что вы полностью скопировали ссылку. ';
$lang['resendpwdconfirm'] = 'Ссылка для подтверждения пароля была выслана по электронной почте. ';
$lang['resendpwdsuccess'] = 'Ваш новый пароль был выслан по электронной почте.';
-
$lang['license'] = 'За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:';
$lang['licenseok'] = 'Примечание: редактируя эту страницу, вы соглашаетесь на использование своего вклада на условиях следующей лицензии:';
-
$lang['searchmedia'] = 'Поиск по имени файла:';
$lang['searchmedia_in'] = 'Поиск в %s';
$lang['txt_upload'] = 'Выберите файл для загрузки';
$lang['txt_filename'] = 'Введите имя файла в вики (необязательно)';
$lang['txt_overwrt'] = 'Перезаписать существующий файл';
+$lang['maxuploadsize'] = 'Максимальный размер загружаемого файла %s';
$lang['lockedby'] = 'В данный момент заблокирован';
$lang['lockexpire'] = 'Блокировка истекает в';
-$lang['js']['willexpire'] = 'Ваша блокировка редактирования этой страницы истекает в течение минуты.\nЧтобы избежать конфликтов и сбросить таймер блокировки, нажмите кнопку просмотра.';
+$lang['js']['willexpire'] = 'Ваша блокировка этой страницы на редактирование истекает в течении минуты.\nЧтобы предотвратить конфликты используйте кнопку "Просмотр" для сброса таймера блокировки.';
$lang['js']['notsavedyet'] = 'Несохранённые изменения будут потеряны. Вы действительно хотите продолжить?';
$lang['js']['searchmedia'] = 'Поиск файлов';
$lang['js']['keepopen'] = 'Не закрывать окно после выбора';
@@ -143,22 +138,19 @@ $lang['js']['nosmblinks'] = 'Ссылка на сетевые катало
$lang['js']['linkwiz'] = 'Мастер ссылок';
$lang['js']['linkto'] = 'Ссылка на:';
$lang['js']['del_confirm'] = 'Вы на самом деле желаете удалить выбранное?';
-$lang['js']['willexpire'] = 'Ваша блокировка этой страницы на редактирование истекает в течении минуты.\nЧтобы предотвратить конфликты используйте кнопку "Просмотр" для сброса таймера блокировки.';
-$lang['js']['restore_confirm'] = 'Действительно восстановить эту версию?';
-$lang['js']['media_diff'] = 'Просмотр отличий:';
-$lang['js']['media_diff_both'] = 'Рядом';
-$lang['js']['media_diff_opacity'] = 'Наложением';
+$lang['js']['restore_confirm'] = 'Действительно восстановить эту версию?';
+$lang['js']['media_diff'] = 'Просмотр отличий:';
+$lang['js']['media_diff_both'] = 'Рядом';
+$lang['js']['media_diff_opacity'] = 'Наложением';
$lang['js']['media_diff_portions'] = 'Частями';
-$lang['js']['media_select'] = 'Выбрать файлы…';
-$lang['js']['media_upload_btn'] = 'Загрузить';
-$lang['js']['media_done_btn'] = 'Готово';
-$lang['js']['media_drop'] = 'Переместите файлы сюда для загрузки';
-$lang['js']['media_cancel'] = 'отменить';
-$lang['js']['media_overwrt'] = 'Перезаписать существующие файлы';
-
+$lang['js']['media_select'] = 'Выбрать файлы…';
+$lang['js']['media_upload_btn'] = 'Загрузить';
+$lang['js']['media_done_btn'] = 'Готово';
+$lang['js']['media_drop'] = 'Переместите файлы сюда для загрузки';
+$lang['js']['media_cancel'] = 'отменить';
+$lang['js']['media_overwrt'] = 'Перезаписать существующие файлы';
$lang['rssfailed'] = 'Произошла ошибка при получении следующей новостной ленты: ';
$lang['nothingfound'] = 'Ничего не найдено.';
-
$lang['mediaselect'] = 'Выбор медиафайла';
$lang['fileupload'] = 'Загрузка медиафайла';
$lang['uploadsucc'] = 'Загрузка произведена успешно';
@@ -183,7 +175,6 @@ $lang['mediaextchange'] = 'Расширение изменилось: с
$lang['reference'] = 'Ссылки для';
$lang['ref_inuse'] = 'Этот файл не может быть удалён, так как он используется на следующих страницах:';
$lang['ref_hidden'] = 'Некоторые ссылки находятся на страницах, на чтение которых у вас нет прав доступа';
-
$lang['hits'] = 'соответствий';
$lang['quickhits'] = 'Соответствия в названиях страниц';
$lang['toc'] = 'Содержание';
@@ -207,18 +198,20 @@ $lang['external_edit'] = 'внешнее изменение';
$lang['summary'] = 'Сводка изменений';
$lang['noflash'] = 'Для просмотра этого содержимого требуется <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
$lang['download'] = 'Скачать код';
-
+$lang['tools'] = 'Инструменты';
+$lang['user_tools'] = 'Инструменты пользователя';
+$lang['site_tools'] = 'Инструменты сайта';
+$lang['page_tools'] = 'Инструменты страницы';
+$lang['skip_to_content'] = 'Перейти к содержанию';
$lang['mail_newpage'] = 'страница добавлена:';
$lang['mail_changed'] = 'страница изменена:';
$lang['mail_subscribe_list'] = 'изменились страницы в пространстве имён:';
$lang['mail_new_user'] = 'новый пользователь:';
$lang['mail_upload'] = 'файл закачан:';
-
$lang['changes_type'] = 'Посмотреть изменения';
$lang['pages_changes'] = 'Страниц';
$lang['media_changes'] = 'Медиа файлов';
$lang['both_changes'] = 'И страниц и медиа файлов';
-
$lang['qb_bold'] = 'Полужирный';
$lang['qb_italic'] = 'Курсив';
$lang['qb_underl'] = 'Подчёркнутый';
@@ -243,11 +236,8 @@ $lang['qb_media'] = 'Добавить изображения или
$lang['qb_sig'] = 'Вставить подпись';
$lang['qb_smileys'] = 'Смайлики';
$lang['qb_chars'] = 'Специальные символы';
-
$lang['upperns'] = 'Перейти в родительское пространство имён';
-
$lang['admin_register'] = 'Добавить пользователя';
-
$lang['metaedit'] = 'Править метаданные';
$lang['metasaveerr'] = 'Ошибка записи метаданных';
$lang['metasaveok'] = 'Метаданные сохранены';
@@ -265,30 +255,25 @@ $lang['img_keywords'] = 'Ключевые слова';
$lang['img_width'] = 'Ширина';
$lang['img_height'] = 'Высота';
$lang['img_manager'] = 'Просмотр в media manager';
-
-$lang['subscr_subscribe_success'] = 'Добавлен %s в подписку на %s';
-$lang['subscr_subscribe_error'] = 'Невозможно добавить %s в подписку на %s';
+$lang['subscr_subscribe_success'] = 'Добавлен %s в подписку на %s';
+$lang['subscr_subscribe_error'] = 'Невозможно добавить %s в подписку на %s';
$lang['subscr_subscribe_noaddress'] = 'Нет адреса электронной почты, сопоставленного с вашей учётной записью. Вы не можете подписаться на рассылку';
$lang['subscr_unsubscribe_success'] = 'Удалён %s из подписки на %s';
-$lang['subscr_unsubscribe_error'] = 'Ошибка удаления %s из подписки на %s';
-$lang['subscr_already_subscribed'] = '%s уже подписан на %s';
-$lang['subscr_not_subscribed'] = '%s не подписан на %s';
-// Manage page for subscriptions
-$lang['subscr_m_not_subscribed'] = 'Вы не подписаны на текущую страницу или пространство имён.';
-$lang['subscr_m_new_header'] = 'Добавить подписку';
-$lang['subscr_m_current_header'] = 'Текущие подписки';
-$lang['subscr_m_unsubscribe'] = 'Отменить подписку';
-$lang['subscr_m_subscribe'] = 'Подписаться';
-$lang['subscr_m_receive'] = 'Получить';
-$lang['subscr_style_every'] = 'уведомлять о каждом изменении';
-$lang['subscr_style_digest'] = 'сводка изменений по каждой странице';
-$lang['subscr_style_list'] = 'перечислять изменившиеся страницы с прошлого уведомления';
-
-/* auth.class language support */
+$lang['subscr_unsubscribe_error'] = 'Ошибка удаления %s из подписки на %s';
+$lang['subscr_already_subscribed'] = '%s уже подписан на %s';
+$lang['subscr_not_subscribed'] = '%s не подписан на %s';
+$lang['subscr_m_not_subscribed'] = 'Вы не подписаны на текущую страницу или пространство имён.';
+$lang['subscr_m_new_header'] = 'Добавить подписку';
+$lang['subscr_m_current_header'] = 'Текущие подписки';
+$lang['subscr_m_unsubscribe'] = 'Отменить подписку';
+$lang['subscr_m_subscribe'] = 'Подписаться';
+$lang['subscr_m_receive'] = 'Получить';
+$lang['subscr_style_every'] = 'уведомлять о каждом изменении';
+$lang['subscr_style_digest'] = 'сводка изменений по каждой странице';
+$lang['subscr_style_list'] = 'перечислять изменившиеся страницы с прошлого уведомления';
$lang['authmodfailed'] = 'Неправильная конфигурация аутентификации пользователя. Пожалуйста, сообщите об этом своему администратору вики.';
$lang['authtempfail'] = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом своему администратору вики.';
-
-/* installer strings */
+$lang['authpwdexpire'] = 'Действие вашего пароля истекает через %d дней. Вы должны изменить его как можно скорее';
$lang['i_chooselang'] = 'Выберите свой язык/Choose your language';
$lang['i_installer'] = 'Установка «ДокуВики»';
$lang['i_wikiname'] = 'Название вики';
@@ -314,23 +299,6 @@ $lang['i_pol1'] = 'Общедоступная вики (чтен
$lang['i_pol2'] = 'Закрытая вики (чтение, запись и загрузка файлов только для зарегистрированных пользователей)';
$lang['i_retry'] = 'Повторить попытку';
$lang['i_license'] = 'Пожалуйста, выберите тип лицензии для своей вики:';
-
-$lang['mu_intro'] = 'Здесь вы можете загрузить несколько файлов сразу. Кликните на «обзор», чтобы добавить их в список. Нажмите «загрузить», когда будете готовы.';
-$lang['mu_gridname'] = 'Имя файла';
-$lang['mu_gridsize'] = 'Размер';
-$lang['mu_gridstat'] = 'Статус';
-$lang['mu_namespace'] = 'Пространство имён';
-$lang['mu_browse'] = 'Обзор';
-$lang['mu_toobig'] = 'слишком большой';
-$lang['mu_ready'] = 'готово к загрузке';
-$lang['mu_done'] = 'завершено';
-$lang['mu_fail'] = 'провалено';
-$lang['mu_authfail'] = 'истекло время сессии';
-$lang['mu_progress'] = '@PCT@% загружено';
-$lang['mu_filetypes'] = 'Допустимые типы файлов';
-$lang['mu_info'] = 'файлов загружено.';
-$lang['mu_lasterr'] = 'Последняя ошибка:';
-
$lang['recent_global'] = 'Вы просматриваете изменения в пространстве имён <b>%s</b>. Вы можете также <a href="%s">просмотреть недавние изменения во всей вики</a>.';
$lang['years'] = '%d лет назад';
$lang['months'] = '%d месяц(ев) назад';
@@ -339,24 +307,28 @@ $lang['days'] = '%d дней назад';
$lang['hours'] = '%d час(ов) назад';
$lang['minutes'] = '%d минут назад';
$lang['seconds'] = '%d секунд назад';
-
$lang['wordblock'] = 'Ваши изменения не сохранены, поскольку они содержат блокируемые слова (спам).';
-
$lang['media_uploadtab'] = 'Загрузка';
$lang['media_searchtab'] = 'Поиск';
+$lang['media_file'] = 'Файл';
$lang['media_viewtab'] = 'Просмотр';
$lang['media_edittab'] = 'Правка';
$lang['media_historytab'] = 'История';
+$lang['media_list_thumbs'] = 'Миниатюры';
+$lang['media_list_rows'] = 'Строки';
$lang['media_sort_name'] = 'Сортировка по имени';
$lang['media_sort_date'] = 'Сортировка по дате';
+$lang['media_namespaces'] = 'Выберите каталог';
+$lang['media_files'] = 'Файлы в %s';
$lang['media_upload'] = 'Загрузка в пространство имён <strong>%s</strong>.';
$lang['media_search'] = 'Поиск в пространстве имён <strong>%s</strong>.';
$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s в %s
+';
$lang['media_edit'] = 'Правка %s';
+$lang['media_history'] = 'История %s';
$lang['media_meta_edited'] = 'метаданные изменены';
$lang['media_perm_read'] = 'Извините, у Вас недостаточно прав для чтения файлов.';
$lang['media_perm_upload'] = 'Извините, у Вас недостаточно прав для загрузки файлов.';
$lang['media_update'] = 'Загрузить новую версию';
$lang['media_restore'] = 'Восстановить эту версию';
-
-$lang['plugin_install_err'] = "Плагин установлен некорректно. Переименуйте папку плагина из '%s' в '%s'.";
diff --git a/inc/lang/ru/resetpwd.txt b/inc/lang/ru/resetpwd.txt
new file mode 100644
index 000000000..81a46a7d3
--- /dev/null
+++ b/inc/lang/ru/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Установка нового пароля ======
+
+Пожалуйста введите новый пароль для вашей учетной записи для этой вики.
diff --git a/inc/lang/sk/install.html b/inc/lang/sk/install.html
index e31d7457c..86cc6cc06 100644
--- a/inc/lang/sk/install.html
+++ b/inc/lang/sk/install.html
@@ -1,20 +1,20 @@
-<p>Táto stránka sprevádza prvou inštaláciou a konfiguráciou
-<a href="http://dokuwiki.org">Dokuwiki</a>. Viac informácií o tomto inštalátore je dostupných na jeho
+<p>Táto stránka sprevádza prvou inštaláciou a konfiguráciou
+<a href="http://dokuwiki.org">Dokuwiki</a>. Viac informácií o tomto inštalátore je dostupných na jeho
<a href="http://dokuwiki.org/installer">dokumentačnej stránke</a>.</p>
-<p>DokuWiki používa bežné súbory pre ukladanie wiki stránok a iných informácií
-priradených k týmto stránkam (napr. obrázkov, vyhľadávacích indexov, starých
-revízií). Ak chcete úspešne narábať s DokuWiki, <strong>musí</strong>
-mať práva pre zápis do adresárov, kde sa ukladajú tieto súbory. Tento inštalátor
-nie je schopný nastaviť prístupové práva pre adresáre. Je potrebné to urobiť
-priamo cez príkazový riadok alebo, ak využívate webhosting, cez FTP alebo vaše
+<p>DokuWiki používa bežné súbory pre ukladanie wiki stránok a iných informácií
+priradených k týmto stránkam (napr. obrázkov, vyhľadávacích indexov, starých
+revízií). Ak chcete úspešne narábať s DokuWiki, <strong>musí</strong>
+mať práva pre zápis do adresárov, kde sa ukladajú tieto súbory. Tento inštalátor
+nie je schopný nastaviť prístupové práva pre adresáre. Je potrebné to urobiť
+priamo cez príkazový riadok alebo, ak využívate webhosting, cez FTP alebo vaše
webhostingové administračné rozhranie.</p>
-<p>Tento inštalátor nastaví <acronym title="access control list - zoznam prístupových práv">ACL</acronym>
-konfiguráciu vašej Dokuwiki. Umožňuje vytvoriť administrátorské konto
+<p>Tento inštalátor nastaví <abbr title="access control list - zoznam prístupových práv">ACL</abbr>
+konfiguráciu vašej Dokuwiki. Umožňuje vytvoriť administrátorské konto
s prístupom do administračného menu s možnosťou inštalácie pluginov, správy
-užívateľov, správy prístupových práv k wiki stránkam a zmeny konfiguračných
-nastavení. Nie je nevyhnutné pre používanie Dokuwiki, ale umožňuje to ľahšie
+užívateľov, správy prístupových práv k wiki stránkam a zmeny konfiguračných
+nastavení. Nie je nevyhnutné pre používanie Dokuwiki, ale umožňuje to ľahšie
spravovať Dokuwiki.</p>
<p>Skúsení užívatelia alebo užívatelia so špeciálnymi požiadavkami môžu použiť
diff --git a/inc/lang/sk/lang.php b/inc/lang/sk/lang.php
index c0d45da58..1407474ec 100644
--- a/inc/lang/sk/lang.php
+++ b/inc/lang/sk/lang.php
@@ -38,11 +38,11 @@ $lang['btn_update'] = 'Aktualizovať';
$lang['btn_delete'] = 'Zmazať';
$lang['btn_back'] = 'Späť';
$lang['btn_backlink'] = 'Spätné odkazy';
-$lang['btn_backtomedia'] = 'Späť na výber média';
+$lang['btn_backtomedia'] = 'Späť na výber súboru';
$lang['btn_subscribe'] = 'Sledovať zmeny';
$lang['btn_profile'] = 'Aktualizovať profil';
$lang['btn_reset'] = 'Zrušiť';
-$lang['btn_resendpwd'] = 'Poslať nové heslo';
+$lang['btn_resendpwd'] = 'Nastaviť nové heslo';
$lang['btn_draft'] = 'Upraviť koncept';
$lang['btn_recover'] = 'Obnoviť koncept';
$lang['btn_draftdel'] = 'Zmazať koncept';
@@ -79,7 +79,7 @@ $lang['profnoempty'] = 'Prázdne meno alebo mailová adresa nie sú po
$lang['profchanged'] = 'Užívateľský účet úspešne zmenený.';
$lang['pwdforget'] = 'Zabudli ste heslo? Získajte nové!';
$lang['resendna'] = 'Táto wiki nepodporuje opätovné zasielanie hesla.';
-$lang['resendpwd'] = 'Pošli nové heslo pre';
+$lang['resendpwd'] = 'Nastaviť nové heslo pre';
$lang['resendpwdmissing'] = 'Prepáčte, musíte vyplniť všetky polia.';
$lang['resendpwdnouser'] = 'Prepáčte, nemôžeme nájsť zadaného užívateľa v databáze.';
$lang['resendpwdbadauth'] = 'Prepáčte, tento autorizačný kód nie je platný. Uistite sa, či ste použili celý autorizačný odkaz.';
@@ -92,6 +92,7 @@ $lang['searchmedia_in'] = 'Hľadať v %s';
$lang['txt_upload'] = 'Vyberte súbor ako prílohu';
$lang['txt_filename'] = 'Uložiť ako (voliteľné)';
$lang['txt_overwrt'] = 'Prepísať existujúci súbor';
+$lang['maxuploadsize'] = 'Obmedzenie max. %s na súbor.';
$lang['lockedby'] = 'Práve zamknuté:';
$lang['lockexpire'] = 'Zámok stratí platnosť:';
$lang['js']['willexpire'] = 'Váš zámok pre editáciu za chvíľu stratí platnosť.\nAby ste predišli konfliktom, stlačte tlačítko Náhľad a zámok sa predĺži.';
@@ -139,8 +140,8 @@ $lang['js']['media_cancel'] = 'odstrániť';
$lang['js']['media_overwrt'] = 'Prepísať existujúce súbory';
$lang['rssfailed'] = 'Nastala chyba pri vytváraní tohto RSS: ';
$lang['nothingfound'] = 'Nič nenájdené.';
-$lang['mediaselect'] = 'Výber dokumentu';
-$lang['fileupload'] = 'Nahrávanie dokumentu';
+$lang['mediaselect'] = 'Výber súboru';
+$lang['fileupload'] = 'Nahrávanie súboru';
$lang['uploadsucc'] = 'Prenos prebehol v poriadku';
$lang['uploadfail'] = 'Chyba pri nahrávaní. Možno kvôli zle nastaveným právam?';
$lang['uploadwrong'] = 'Prenos súboru s takouto príponou nie je dovolený.';
@@ -186,6 +187,12 @@ $lang['external_edit'] = 'externá úprava';
$lang['summary'] = 'Komentár k úpravám';
$lang['noflash'] = 'Pre zobrazenie tohto obsahu potrebujete <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>.';
$lang['download'] = 'Stiahnuť';
+$lang['tools'] = 'Nástroje';
+$lang['user_tools'] = 'Nástroje používateľa';
+$lang['site_tools'] = 'Nástoje správy stránok';
+$lang['page_tools'] = 'Nástoje stránky';
+$lang['skip_to_content'] = 'skok na obsah';
+$lang['sidebar'] = 'Bočný panel';
$lang['mail_newpage'] = 'stránka pridaná:';
$lang['mail_changed'] = 'stránka zmenená:';
$lang['mail_subscribe_list'] = 'stránky zmenené v mennom priestore:';
@@ -193,7 +200,7 @@ $lang['mail_new_user'] = 'nový užívateľ:';
$lang['mail_upload'] = 'nahraný súbor:';
$lang['changes_type'] = 'Prehľad zmien';
$lang['pages_changes'] = 'Stránok';
-$lang['media_changes'] = 'Média súborov';
+$lang['media_changes'] = 'Súbory';
$lang['both_changes'] = 'Stránok spolu s média súbormi';
$lang['qb_bold'] = 'Tučné';
$lang['qb_italic'] = 'Kurzíva';
@@ -256,6 +263,7 @@ $lang['subscr_style_digest'] = 'email so zhrnutím zmien pre každú stránku
$lang['subscr_style_list'] = 'zoznam zmenených stránok od posledného emailu (perióda %.2f dňa)';
$lang['authmodfailed'] = 'Užívateľská autentifikácia nie je možná. Prosím informujte správcu systému.';
$lang['authtempfail'] = 'Užívateľská autentifikácia je dočasne nedostupná. Ak táto situácia pretrváva, prosím informujte správcu systému.';
+$lang['authpwdexpire'] = 'Platnosť hesla vyprší za %d dní, mali by ste ho zmeniť čo najskôr.';
$lang['i_chooselang'] = 'Zvoľte váš jazyk';
$lang['i_installer'] = 'DokuWiki inštalátor';
$lang['i_wikiname'] = 'Názov Wiki';
@@ -278,21 +286,6 @@ $lang['i_pol1'] = 'Verejná Wiki (čítanie pre každého, zápis
$lang['i_pol2'] = 'Uzatvorená Wiki (čítanie, zápis a nahrávanie len pre registrovaných užívateľov)';
$lang['i_retry'] = 'Skúsiť znovu';
$lang['i_license'] = 'Vyberte licenciu, pod ktorou chcete uložiť váš obsah:';
-$lang['mu_intro'] = 'Na tomto mieste môžete nahrávať viac súborov súčasne. Tlačidlom Prehľadávať pridáte súbory do zoznamu. Tlačidlom Nahrať vykonáte prenos súborov.';
-$lang['mu_gridname'] = 'Názov súboru';
-$lang['mu_gridsize'] = 'Veľkosť';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Menný priestor';
-$lang['mu_browse'] = 'Prehľadávať';
-$lang['mu_toobig'] = 'príliš veľký';
-$lang['mu_ready'] = 'pripravený na nahratie';
-$lang['mu_done'] = 'dokončený';
-$lang['mu_fail'] = 'neúspešný';
-$lang['mu_authfail'] = 'spojenie stratilo platnosť';
-$lang['mu_progress'] = '@PCT@% nahraných';
-$lang['mu_filetypes'] = 'Povolené typy súborov';
-$lang['mu_info'] = 'nahraných súborov.';
-$lang['mu_lasterr'] = 'Posledná chyba:';
$lang['recent_global'] = 'Práve prehliadate zmeny v mennom priestore <b>%s</b>. Môžete si tiež pozrieť <a href="%s">aktuálne zmeny celej wiki</a>.';
$lang['years'] = 'pred %d rokmi';
$lang['months'] = 'pred %d mesiacmi';
diff --git a/inc/lang/sk/mailwrap.html b/inc/lang/sk/mailwrap.html
new file mode 100644
index 000000000..2e42515fb
--- /dev/null
+++ b/inc/lang/sk/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Táto správa bola zaslaná DokuWiki @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/sk/resetpwd.txt b/inc/lang/sk/resetpwd.txt
new file mode 100644
index 000000000..a4df4a545
--- /dev/null
+++ b/inc/lang/sk/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Nastavenie nového hesla ======
+
+Prosím zadajte nové heslo vášho účtu v tejto wiki.
diff --git a/inc/lang/sl/install.html b/inc/lang/sl/install.html
index 6fb6bead3..a00833405 100644
--- a/inc/lang/sl/install.html
+++ b/inc/lang/sl/install.html
@@ -11,7 +11,7 @@ narediti v ukazni lupini ali pa, če spletišče Wiki gostuje na zunanjih
strežnikih, preko nadzornika FTP povezave (npr. cPanel).</p>
<p>Z namestilnikom lahko spremenite nastavitve dostopa sistema Dokuwiki
-<acronym title="access control list">ACL</acronym>, ki omogoča skrbniško prijavo in dostop do upravljanja z vstavki,
+<abbr title="access control list">ACL</abbr>, ki omogoča skrbniško prijavo in dostop do upravljanja z vstavki,
uporabniki, dovoljenji dostopa uporabnikov do določenih strani in do nekaterih
nastavitev. Za delovanje sistema ACL ni bistven, vendar pa močno vpliva na
enostavnost upravljanja strani in nastavitev.</p>
diff --git a/inc/lang/sl/lang.php b/inc/lang/sl/lang.php
index 9acf13504..3a4dbd22e 100644
--- a/inc/lang/sl/lang.php
+++ b/inc/lang/sl/lang.php
@@ -43,11 +43,13 @@ $lang['btn_backtomedia'] = 'Nazaj na izbiro predstavnih datotek';
$lang['btn_subscribe'] = 'Urejanje naročnin';
$lang['btn_profile'] = 'Posodobi profil';
$lang['btn_reset'] = 'Ponastavi';
-$lang['btn_resendpwd'] = 'Pošlji novo geslo';
$lang['btn_draft'] = 'Uredi osnutek';
$lang['btn_recover'] = 'Obnovi osnutek';
$lang['btn_draftdel'] = 'Izbriši osnutek';
$lang['btn_revert'] = 'Povrni';
+$lang['btn_register'] = 'Prijava';
+$lang['btn_apply'] = 'Uveljavi';
+$lang['btn_media'] = 'Urejevalnik predstavnih vsebin';
$lang['loggedinas'] = 'Prijava kot';
$lang['user'] = 'Uporabniško ime';
$lang['pass'] = 'Geslo';
@@ -57,7 +59,6 @@ $lang['passchk'] = 'Ponovi novo geslo';
$lang['remember'] = 'Zapomni si me';
$lang['fullname'] = 'Pravo ime';
$lang['email'] = 'Elektronski naslov';
-$lang['register'] = 'Vpis računa';
$lang['profile'] = 'Uporabniški profil';
$lang['badlogin'] = 'Uporabniško ime ali geslo je napačno.';
$lang['minoredit'] = 'Manjše spremembe';
@@ -72,13 +73,12 @@ $lang['regbadmail'] = 'Videti je, da je naveden elektronski naslov ne
$lang['regbadpass'] = 'Gesli nista enaki. Poskusite znova.';
$lang['regpwmail'] = 'Geslo za DokuWiki';
$lang['reghere'] = 'Nimate še računa? Vpišite se za nov račun.';
-$lang['profna'] = 'Wiki ne podpira spreminjanja profila.';
+$lang['profna'] = 'DokuWiki ne podpira spreminjanja profila.';
$lang['profnochange'] = 'Brez sprememb.';
$lang['profnoempty'] = 'Prazno polje elektronskega naslova ali imena ni dovoljeno.';
$lang['profchanged'] = 'Uporabniški profil je uspešno posodobljen.';
$lang['pwdforget'] = 'Ali ste pozabili geslo? Pridobite si novo geslo.';
-$lang['resendna'] = 'Wiki ne podpira možnosti ponovnega pošiljanja gesel.';
-$lang['resendpwd'] = 'Pošlji novo geslo za';
+$lang['resendna'] = 'DokuWiki ne podpira možnosti ponovnega pošiljanja gesel.';
$lang['resendpwdmissing'] = 'Izpolniti je treba vsa polja.';
$lang['resendpwdnouser'] = 'Podanega uporabniškega imena v podatkovni zbirki ni mogoče najti.';
$lang['resendpwdbadauth'] = 'Koda za overitev ni prava. Prepričajte se, da ste uporabili celotno povezavo za potrditev.';
@@ -93,7 +93,7 @@ $lang['txt_filename'] = 'Pošlji z imenom (izborno)';
$lang['txt_overwrt'] = 'Prepiši obstoječo datoteko';
$lang['lockedby'] = 'Trenutno je zaklenjeno s strani';
$lang['lockexpire'] = 'Zaklep preteče ob';
-$lang['js']['willexpire'] = 'Zaklep za urejevanje bo pretekel čez eno minuto.\nV izogib sporom, uporabite predogled, da se merilnik časa za zaklep ponastavi.';
+$lang['js']['willexpire'] = 'Zaklep za urejevanje bo pretekel čez eno minuto.\nV izogib sporom, uporabite predogled, da se merilnik časa za zaklep ponastavi.';
$lang['js']['notsavedyet'] = 'Neshranjene spremembe bodo izgubljene.';
$lang['js']['searchmedia'] = 'Poišči datoteke';
$lang['js']['keepopen'] = 'Od izbiri ohrani okno odprto';
@@ -123,6 +123,16 @@ $lang['js']['nosmblinks'] = 'Povezovanje do souporabnih datotek sistema Win
$lang['js']['linkwiz'] = 'Čarovnik za povezave';
$lang['js']['linkto'] = 'Poveži na:';
$lang['js']['del_confirm'] = 'Ali naj se res izbrišejo izbrani predmeti?';
+$lang['js']['restore_confirm'] = 'Ali naj se koda obnovi na to različico?';
+$lang['js']['media_diff'] = 'Razlike:';
+$lang['js']['media_diff_both'] = 'Eno ob drugem';
+$lang['js']['media_diff_opacity'] = 'Prosojno';
+$lang['js']['media_select'] = 'Izbor datotek ...';
+$lang['js']['media_upload_btn'] = 'Naloži';
+$lang['js']['media_done_btn'] = 'Končano';
+$lang['js']['media_drop'] = 'Spusti datoteke za nalaganje.';
+$lang['js']['media_cancel'] = 'odstrani';
+$lang['js']['media_overwrt'] = 'Prepiši obstoječe datoteke';
$lang['rssfailed'] = 'Prišlo je do napake med pridobivanjem vira: ';
$lang['nothingfound'] = 'Ni najdenih predmetov.';
$lang['mediaselect'] = 'Predstavne datoteke';
@@ -157,6 +167,9 @@ $lang['yours'] = 'Vaša različica';
$lang['diff'] = 'Pokaži razlike s trenutno različico';
$lang['diff2'] = 'Pokaži razlike med izbranimi različicami.';
$lang['difflink'] = 'Poveži s tem pogledom primerjave.';
+$lang['diff_type'] = 'Razlike:';
+$lang['diff_inline'] = 'V besedilu';
+$lang['diff_side'] = 'Eno ob drugem';
$lang['line'] = 'Vrstica';
$lang['breadcrumb'] = 'Sled';
$lang['youarehere'] = 'Trenutno dejavna stran';
@@ -169,11 +182,20 @@ $lang['external_edit'] = 'urejanje v zunanjem urejevalniku';
$lang['summary'] = 'Povzetek urejanja';
$lang['noflash'] = 'Za prikaz vsebine je treba namestiti <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
$lang['download'] = 'Naloži izrezek';
+$lang['tools'] = 'Orodja';
+$lang['user_tools'] = 'Uporabniška orodja';
+$lang['site_tools'] = 'Orodja spletišča';
+$lang['page_tools'] = 'Orodja strani';
+$lang['skip_to_content'] = 'preskoči na vsebino';
$lang['mail_newpage'] = '[DokuWiki] stran dodana:';
$lang['mail_changed'] = '[DokuWiki] stran spremenjena:';
$lang['mail_subscribe_list'] = 'strani s spremenjenim imenom:';
$lang['mail_new_user'] = 'nov uporabnik:';
$lang['mail_upload'] = 'naložena datoteka:';
+$lang['changes_type'] = 'Poglej spremembe';
+$lang['pages_changes'] = 'Strani';
+$lang['media_changes'] = 'Predstavne datoteke';
+$lang['both_changes'] = 'Strani in predstavne datoteke';
$lang['qb_bold'] = 'Krepko besedilo';
$lang['qb_italic'] = 'Ležeče besedilo';
$lang['qb_underl'] = 'Podčrtano besedilo';
@@ -214,6 +236,9 @@ $lang['img_copyr'] = 'Avtorska pravica';
$lang['img_format'] = 'Zapis';
$lang['img_camera'] = 'Fotoaparat';
$lang['img_keywords'] = 'Ključne besede';
+$lang['img_width'] = 'Širina';
+$lang['img_height'] = 'Višina';
+$lang['img_manager'] = 'Poglej v urejevalniku predstavnih vsebin';
$lang['subscr_subscribe_success'] = 'Uporabniški račun %s je dodan na seznam naročnin na %s';
$lang['subscr_subscribe_error'] = 'Napaka med dodajanjem %s na seznam naročnin na %s';
$lang['subscr_subscribe_noaddress'] = 'S trenutnimi prijavnimi podatki ni povezanega elektronskega naslova, zato uporabniškega računa ni mogoče dodati na seznam naročnikov.';
@@ -254,21 +279,6 @@ $lang['i_pol1'] = 'Javni Wiki (branje za vse, zapis in nalaganje
$lang['i_pol2'] = 'Zaprt Wiki (berejo in urejajo lahko le prijavljeni uporabniki)';
$lang['i_retry'] = 'Ponovni poskus';
$lang['i_license'] = 'Izbor dovoljenja objave vsebine:';
-$lang['mu_intro'] = 'Naložiti je mogoče več datotek hkrati. S klikom na gumb "Prebrskaj", jih je mogoče dodati v vrsto. S klikom na povezavo "naloži" bodo datoteke poslane na strežnik.';
-$lang['mu_gridname'] = 'Ime datoteke';
-$lang['mu_gridsize'] = 'Velikost';
-$lang['mu_gridstat'] = 'Stanje';
-$lang['mu_namespace'] = 'Imenski prostor';
-$lang['mu_browse'] = 'Prebrskaj';
-$lang['mu_toobig'] = 'prevelika datoteka';
-$lang['mu_ready'] = 'pripravljena na pošiljanje';
-$lang['mu_done'] = 'končano';
-$lang['mu_fail'] = 'ni uspelo';
-$lang['mu_authfail'] = 'seja je potekla';
-$lang['mu_progress'] = '@PCT@% je poslano';
-$lang['mu_filetypes'] = 'Dovoljene vrste datotek';
-$lang['mu_info'] = 'poslanih datotek.';
-$lang['mu_lasterr'] = 'Zadnja napaka:';
$lang['recent_global'] = 'Trenutno so prikazane spremembe znotraj imenskega prostora <b>%s</b>. Mogoče si je ogledati tudi spremembe <a href="%s">celotnega sistema Wiki</a>.';
$lang['years'] = '%d let nazaj';
$lang['months'] = '%d mesecev nazaj';
@@ -278,3 +288,26 @@ $lang['hours'] = '%d ur nazaj';
$lang['minutes'] = '%d minut nazaj';
$lang['seconds'] = '%d sekund nazaj';
$lang['wordblock'] = 'Spremembe niso shranjene, ker je v vsebini navedeno neželeno besedilo (spam).';
+$lang['media_uploadtab'] = 'Naloži';
+$lang['media_searchtab'] = 'Poišči';
+$lang['media_file'] = 'Datoteka';
+$lang['media_viewtab'] = 'Pogled';
+$lang['media_edittab'] = 'Uredi';
+$lang['media_historytab'] = 'Zgodovina';
+$lang['media_list_thumbs'] = 'Sličice';
+$lang['media_list_rows'] = 'Vrstice';
+$lang['media_sort_name'] = 'Ime';
+$lang['media_sort_date'] = 'Datum';
+$lang['media_namespaces'] = 'Izbor imenskega prostora';
+$lang['media_files'] = 'Datoteke v %s';
+$lang['media_upload'] = 'Naloži v %s';
+$lang['media_search'] = 'Poišči v %s';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s pri %s';
+$lang['media_edit'] = 'Uredi %s';
+$lang['media_history'] = 'Zgodovina %s';
+$lang['media_meta_edited'] = 'metapodatki so urejeni';
+$lang['media_perm_read'] = 'Ni ustreznih dovoljenj za branje datotek.';
+$lang['media_perm_upload'] = 'Ni ustreznih dovoljenj za nalaganje datotek.';
+$lang['media_update'] = 'Naloži novo različico';
+$lang['media_restore'] = 'Obnovi to različico';
diff --git a/inc/lang/sl/locked.txt b/inc/lang/sl/locked.txt
index d51e940b7..cc693d3fa 100644
--- a/inc/lang/sl/locked.txt
+++ b/inc/lang/sl/locked.txt
@@ -1,3 +1,3 @@
====== Stran je zaklenjena ======
-Stran je zaklenjenjena za urejanje. Počakati je treba, da zaklep strani poteče.
+Stran je zaklenjena za urejanje. Počakati je treba, da zaklep strani poteče.
diff --git a/inc/lang/sl/stopwords.txt b/inc/lang/sl/stopwords.txt
index 5d61539e7..8eed2daa6 100644
--- a/inc/lang/sl/stopwords.txt
+++ b/inc/lang/sl/stopwords.txt
@@ -1,7 +1,7 @@
# To je seznam besed, ki jih ustvarjalnik kazala prezre. Seznam je sestavljen iz
-# besede, ki so zapisane vsaka v svoji vrstici. Datoteka mora biti zapisana s konnim
-# UNIX znakom vrstice. Besede kraje od treh znakov so iz kazala izloene samodejno
-# zaradi preglednosti. Seznam se s bo s asom spreminjal in dopolnjeval.
+# besede, ki so zapisane vsaka v svoji vrstici. Datoteka mora biti zapisana s končnim
+# UNIX znakom vrstice. Besede krajše od treh znakov so iz kazala izločene samodejno
+# zaradi preglednosti. Seznam se s bo s časom spreminjal in dopolnjeval.
moja
moje
moji
diff --git a/inc/lang/sq/install.html b/inc/lang/sq/install.html
index f9f69f473..bad30b1bc 100644
--- a/inc/lang/sq/install.html
+++ b/inc/lang/sq/install.html
@@ -3,6 +3,6 @@
<p>Dokuwiki përdor skedarë të zakonshëm për ruajtjen e faqeve wiki dhe informacioneve të tjera të lidhura me ato faqe (psh imazhe, indekse kërkimi, rishikime të vjetra etj). Në mënyrë që të funksionojë me sukses DokuWiki <strong>duhet</strong> të ketë akses shkrimi mbi direktoritë që mbajnë këto skedarë. Ky installer nuk është në gjendje të vendosë leje mbi direktoritë. Kjo normalisht duhet bërë drejtpërdrejt nga një command shell ose nëse jeni duke përdorur hostimin, nëpërmjet FTP ose panelit të kontrollit të hostit (psh cPanel).</p>
<p>Ky installer do të instalojë konfigurimin e DokuWiki-t tuaj
-për <acronym title="access control list">ACL</acronym>, që në këmbim lejon hyrje si administrator dhe akses të menusë së administrimit të DokuWiki-t për të instaluar plugin-e, menaxhuar përdoruesit, menaxhuar akses në faqet wiki dhe ndryshim të konfigurimeve. Nuk është e domosdoshme për DokuWiki-n të funksionojë, megjithatë do ta bëjë DokuWiki-n më të lehtë për tu administruar.</p>
+për <abbr title="access control list">ACL</abbr>, që në këmbim lejon hyrje si administrator dhe akses të menusë së administrimit të DokuWiki-t për të instaluar plugin-e, menaxhuar përdoruesit, menaxhuar akses në faqet wiki dhe ndryshim të konfigurimeve. Nuk është e domosdoshme për DokuWiki-n të funksionojë, megjithatë do ta bëjë DokuWiki-n më të lehtë për tu administruar.</p>
<p>Përduruesit me përvojë ose përdoruesit me kërkesa speciale për instalim duhet të përdorin këto linke për detaje mbi <a href="http://dokuwiki.org/install">instruksionet e instalimit</a> dhe <a href="http://dokuwiki.org/config">konfigurimeve</a>.</p> \ No newline at end of file
diff --git a/inc/lang/sq/lang.php b/inc/lang/sq/lang.php
index 87d0f30b5..0e56b89d9 100644
--- a/inc/lang/sq/lang.php
+++ b/inc/lang/sq/lang.php
@@ -44,7 +44,6 @@ $lang['btn_backtomedia'] = 'Mbrapa tek Përzgjedhja e Media-ve';
$lang['btn_subscribe'] = 'Menaxho Abonimet';
$lang['btn_profile'] = 'Përditëso Profilin';
$lang['btn_reset'] = 'Rivendos';
-$lang['btn_resendpwd'] = 'Dërgo fjalëkalim të ri';
$lang['btn_draft'] = 'Redakto skicën';
$lang['btn_recover'] = 'Rekupero skicën';
$lang['btn_draftdel'] = 'Fshi skicën';
@@ -79,7 +78,6 @@ $lang['profnoempty'] = 'Një emër bosh ose adresë email-i bosh nuk l
$lang['profchanged'] = 'Profili i përdoruesit u përditësua me sukses.';
$lang['pwdforget'] = 'E harruat fjalëkalimin? Merni një të ri';
$lang['resendna'] = 'Ky wiki nuk e lejon ridërgimin e fjalëkalimeve.';
-$lang['resendpwd'] = 'Dërgo një fjalëkalim të ri për';
$lang['resendpwdmissing'] = 'Na vjen keq, duhet t\'i plotësoni të gjitha fushat.';
$lang['resendpwdnouser'] = 'Na vjen keq, nuk mund ta gjejmë këtë përdorues në bazën tonë të të dhënave.';
$lang['resendpwdbadauth'] = 'Na vjen keq, ky kod autorizimi nuk është i vlefshëm. Sigurohuni që përdoret linkun e plotë të konfirmimit.';
@@ -232,21 +230,6 @@ $lang['i_pol0'] = 'Wiki i Hapur (lexim, shkrim, ngarkim për këd
$lang['i_pol1'] = 'Wiki Publike (lexim për këdo, shkrim dhe ngarkim për përdoruesit e regjistruar)';
$lang['i_pol2'] = 'Wiki e Mbyllur (lexim, shkrim, ngarkim vetëm për përdoruesit e regjistruar)';
$lang['i_retry'] = 'Provo Përsëri';
-$lang['mu_intro'] = 'Këtu mund të ngarkoni disa skedarë njëkohësisht. Klikoni butonin e shfletuesit për t\'i shtuar ata në radhë. Klikoni Ngarko kur të keni mbaruar.';
-$lang['mu_gridname'] = 'Emri Skedari';
-$lang['mu_gridsize'] = 'Madhësia';
-$lang['mu_gridstat'] = 'Statusi';
-$lang['mu_namespace'] = 'Hapësira Emrit';
-$lang['mu_browse'] = 'Shfleto';
-$lang['mu_toobig'] = 'shumë i/e madhe';
-$lang['mu_ready'] = 'gati për ngarkim';
-$lang['mu_done'] = 'përfundoi';
-$lang['mu_fail'] = 'dështoi';
-$lang['mu_authfail'] = 'sesioni skadoi';
-$lang['mu_progress'] = '@PCT@% u ngarkua';
-$lang['mu_filetypes'] = 'Tipet e Skedarëve të Lejuar';
-$lang['mu_info'] = 'skedarët e ngarkuar';
-$lang['mu_lasterr'] = 'Gabimi i fundit:';
$lang['recent_global'] = 'Momentalisht jeni duke parë ndryshimet brenda hapësirës së emrit <b>%s</b>. Gjithashtu mund <a href="%s">të shihni ndryshimet më të fundit në të gjithë wiki-n</a>.';
$lang['years'] = '%d vite më parë';
$lang['months'] = '%d muaj më parë';
diff --git a/inc/lang/sr/install.html b/inc/lang/sr/install.html
index b9ab35c71..c6c70dfea 100644
--- a/inc/lang/sr/install.html
+++ b/inc/lang/sr/install.html
@@ -1,12 +1,12 @@
-<p>Ова страница ће вам помоћи у инсталацији и подешавању <a href="http://dokuwiki.org">Dokuwiki-ја</a>. Више информација о инсталацији можете пронаћи у
+<p>Ова страница ће вам помоћи у инсталацији и подешавању <a href="http://dokuwiki.org">Dokuwiki-ја</a>. Више информација о инсталацији можете пронаћи у
<a href="http://dokuwiki.org/installer">документацији</a>.</p>
-<p>DokuWiki користи обичне датотеке за складиштење вики страница и осталих информација везаних за странице (слике, индекс претраге, старе преправке, итд.).
+<p>DokuWiki користи обичне датотеке за складиштење вики страница и осталих информација везаних за странице (слике, индекс претраге, старе преправке, итд.).
Да би радио како треба DokuWiki као апликација <strong>мора</strong> имати могућност писања под фасциклама у којима се налазе ове датотеке. Овај програм за инсталацију нема могућност постављања дозвола за фасцикле. То се обично ради директно из командне линије или ако користите изнајмњени сервер, помоћу ФТПа или кроз Контролни панел (нпр. cPanel).</p>
<p>Овај програм за инсталацију DokuWiki-а ће поставити подешавања за
-<acronym title="access control list">Права приступа</acronym>, које ће омогућити пријјављивање као администратор и приступ менију за инсталацију додатака, управљање корисницима, управљање приступом ка страницама и алтернатвна подешавања. Није неопходно да би DokuWiki радио, али ће вам олакшати администрацију.</p>
+Права приступа, које ће омогућити пријјављивање као администратор и приступ менију за инсталацију додатака, управљање корисницима, управљање приступом ка страницама и алтернатвна подешавања. Није неопходно да би DokuWiki радио, али ће вам олакшати администрацију.</p>
-<p>Искуснији корисници и корисници са посебним захтевима би требало да погледају следеће линкове са детаљним упутствима о
+<p>Искуснији корисници и корисници са посебним захтевима би требало да погледају следеће линкове са детаљним упутствима о
<a href="http://dokuwiki.org/install">инструкцијама за инсталацију</a>
и <a href="http://dokuwiki.org/config">подешавањима</a>.</p> \ No newline at end of file
diff --git a/inc/lang/sr/lang.php b/inc/lang/sr/lang.php
index 22bcf4e33..a53f14ac9 100644
--- a/inc/lang/sr/lang.php
+++ b/inc/lang/sr/lang.php
@@ -41,7 +41,6 @@ $lang['btn_backtomedia'] = 'Врати се на избор медијск
$lang['btn_subscribe'] = 'Пријави се на измене';
$lang['btn_profile'] = 'Ажурирај профил';
$lang['btn_reset'] = 'Поништи';
-$lang['btn_resendpwd'] = 'Пошаљи нову лозинку';
$lang['btn_draft'] = 'Измени нацрт';
$lang['btn_recover'] = 'Опорави нацрт';
$lang['btn_draftdel'] = 'Обриши нацрт';
@@ -76,7 +75,6 @@ $lang['profnoempty'] = 'Није дозвољено оставити
$lang['profchanged'] = 'Кориснички профил је ажуриран.';
$lang['pwdforget'] = 'Заборавили сте лозинку? Направите нову';
$lang['resendna'] = 'Овај вики не дозвољава слање лозинки.';
-$lang['resendpwd'] = 'Пошаљи нову лозинку за';
$lang['resendpwdmissing'] = 'Жао ми је, сва поља морају бити попуњена.';
$lang['resendpwdnouser'] = 'Жао ми је, овај корисник не постоји у нашој бази.';
$lang['resendpwdbadauth'] = 'Жао ми је, потврдни код није исправан. Проверите да ли сте користили комплетан потврдни линк.';
@@ -254,21 +252,6 @@ $lang['i_pol1'] = 'Јавни вики (читање за све,
$lang['i_pol2'] = 'Затворени вики (читање, писање и слање датотека само за регистроване кориснике)';
$lang['i_retry'] = 'Понови';
$lang['i_license'] = 'Молимо вас, одаберите лиценцу под коју желите да ставите свој садржај:';
-$lang['mu_intro'] = 'Одавде можете послати више датотека одједном. Кликните на дугме Тражи да бисте додали датотеке на листу. Када завршите са одабирањем кликните на Пошаљи.';
-$lang['mu_gridname'] = 'Назив датотеке';
-$lang['mu_gridsize'] = 'Величина';
-$lang['mu_gridstat'] = 'Статус';
-$lang['mu_namespace'] = 'Именски простор';
-$lang['mu_browse'] = 'Тражи';
-$lang['mu_toobig'] = 'превелико';
-$lang['mu_ready'] = 'спремно за слање';
-$lang['mu_done'] = 'завршено';
-$lang['mu_fail'] = 'није успело';
-$lang['mu_authfail'] = 'сесија је истекла';
-$lang['mu_progress'] = '@PCT@% послато';
-$lang['mu_filetypes'] = 'Дозвољени типови датотека';
-$lang['mu_info'] = 'Фајлови послати';
-$lang['mu_lasterr'] = 'Последња грешка:';
$lang['recent_global'] = 'Тренутно пратите промене у именском простору <b>%s</b>. Такође, можете пратити <a href="%s">прмене на целом викију</a>.';
$lang['years'] = 'Пре %d година';
$lang['months'] = 'Пре %d месеци';
diff --git a/inc/lang/sv/install.html b/inc/lang/sv/install.html
index 11e2eea49..a6b3ade92 100644
--- a/inc/lang/sv/install.html
+++ b/inc/lang/sv/install.html
@@ -1,11 +1,11 @@
<p>Denna sida hjälper dig med nyinstallation och inställningar för
-<a href="http://dokuwiki.org">Dokuwiki</a>. Mer information om
-installationsprogrammet finns på dess egen
+<a href="http://dokuwiki.org">Dokuwiki</a>. Mer information om
+installationsprogrammet finns på dess egen
<a href="http://dokuwiki.org/installer">dokumentationssida</a>.</p>
<p>DokuWiki använder vanliga filer för att lagra wikisidor och annan
information som här till sidorna (till exempel bilder, sökindex, gamla
-versioner, etc). För att kunna fungera
+versioner, etc). För att kunna fungera
<strong>måste</strong> DokuWiki ha skrivrättigheter i de kataloger där
filerna ligger. Detta installationsprogram kan inte ändra rättigheter
på kataloger. Det måste normalt göras direkt på en kommandorad, eller
@@ -13,7 +13,7 @@ om du använder ett webbhotell, via FTP eller din leverantörs kontrollpanel
(till exempel cPanel).</p>
<p>Detta installationsprogram anpassar inställningarna i din DokuWiki för
-<acronym title="access control list">ACL</acronym> (behörighetslista), vilket i sin tur gör att
+<abbr title="access control list">ACL</abbr> (behörighetslista), vilket i sin tur gör att
administratören kan logga in och komma åt DokuWikis administrationsmenu för
att installera insticksmoduler, hantera användare, hantera behörighet till
wikisidor och ändra inställningar. ACL är inget krav för att DokuWiki ska
diff --git a/inc/lang/sv/lang.php b/inc/lang/sv/lang.php
index 943509fed..0c8f3276d 100644
--- a/inc/lang/sv/lang.php
+++ b/inc/lang/sv/lang.php
@@ -52,7 +52,6 @@ $lang['btn_backtomedia'] = 'Tillbaka till val av Mediafil';
$lang['btn_subscribe'] = 'Prenumerera på ändringar';
$lang['btn_profile'] = 'Uppdatera profil';
$lang['btn_reset'] = 'Återställ';
-$lang['btn_resendpwd'] = 'Skicka nytt lösenord';
$lang['btn_draft'] = 'Redigera utkast';
$lang['btn_recover'] = 'Återskapa utkast';
$lang['btn_draftdel'] = 'Radera utkast';
@@ -87,7 +86,6 @@ $lang['profnoempty'] = 'Namn och e-postadress måste fyllas i.';
$lang['profchanged'] = 'Användarprofilen uppdaterad.';
$lang['pwdforget'] = 'Glömt ditt lösenord? Ordna ett nytt';
$lang['resendna'] = 'Den här wikin stödjer inte utskick av lösenord.';
-$lang['resendpwd'] = 'Skicka nytt lösenord för';
$lang['resendpwdmissing'] = 'Du måste fylla i alla fält.';
$lang['resendpwdnouser'] = 'Den här användaren hittas inte i databasen.';
$lang['resendpwdbadauth'] = 'Den här verifieringskoden är inte giltig. Kontrollera att du använde hela verifieringslänken.';
@@ -256,21 +254,6 @@ $lang['i_pol0'] = 'Öppen wiki (alla får läsa, skriva och ladda
$lang['i_pol1'] = 'Publik wiki (alla får läsa, registrerade användare för skriva och ladda upp filer)';
$lang['i_pol2'] = 'Sluten wiki (endast registrerade användare får läsa, skriva och ladda upp filer)';
$lang['i_retry'] = 'Försök igen';
-$lang['mu_intro'] = 'Här kan du ladda upp flera filer på en gång. Klicka på bläddra-knappen för att lägga till dem i kön. Tryck på ladda upp när du är klar.';
-$lang['mu_gridname'] = 'Filnamn';
-$lang['mu_gridsize'] = 'Storlek';
-$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Namnrymd';
-$lang['mu_browse'] = 'Bläddra';
-$lang['mu_toobig'] = 'för stor';
-$lang['mu_ready'] = 'redo att ladda upp';
-$lang['mu_done'] = 'komplett';
-$lang['mu_fail'] = 'misslyckades';
-$lang['mu_authfail'] = 'sessionen över tid';
-$lang['mu_progress'] = '@PCT@% uppladdade';
-$lang['mu_filetypes'] = 'Tillåtna filtyper';
-$lang['mu_info'] = 'filerna uppladdade.';
-$lang['mu_lasterr'] = 'Senaste fel:';
$lang['recent_global'] = 'Du bevakar ändringar i namnrymden <b>%s</b>. Du kan också titta på <a href="%s">senaste ändringar för hela wikin</a>.';
$lang['years'] = '%d år sedan';
$lang['months'] = '%d månader sedan';
diff --git a/inc/lang/th/lang.php b/inc/lang/th/lang.php
index 0d0613961..c9d526436 100644
--- a/inc/lang/th/lang.php
+++ b/inc/lang/th/lang.php
@@ -48,7 +48,6 @@ $lang['btn_subscribe'] = 'เฝ้าดู';
$lang['btn_unsubscribe'] = 'เลิกเฝ้าดู';
$lang['btn_profile'] = 'แก้ข้อมูลผู้ใช้';
$lang['btn_reset'] = 'เริ่มใหม่';
-$lang['btn_resendpwd'] = 'ลืมรหัส ส่งให้ใหม่ทางอีเมล';
$lang['btn_draft'] = 'แก้ไขเอกสารฉบับร่าง';
$lang['btn_recover'] = 'กู้คืนเอกสารฉบับร่าง';
$lang['btn_draftdel'] = 'ลบเอกสารฉบับร่าง';
@@ -83,7 +82,6 @@ $lang['profnoempty'] = 'ไม่อนุญาติให้เว
$lang['profchanged'] = 'ปรับปรุงข้อมูลส่วนตัวผู้ใช้สำเร็จ';
$lang['pwdforget'] = 'ลืมรหัสผ่านหรือ? เอาอันใหม่สิ';
$lang['resendna'] = 'วิกินี้ไม่รองรับการส่งรหัสผ่านซ้ำ';
-$lang['resendpwd'] = 'ส่งรหัสผ่านใหม่ให้กับ';
$lang['resendpwdmissing'] = 'ขออภัย, คุณต้องกรอกทุกช่อง';
$lang['resendpwdnouser'] = 'ขออภัย, เราไม่พบผู้ใช้คนนี้ในฐานข้อมูลของเรา';
$lang['resendpwdbadauth'] = 'ขออภัย, รหัสนี้ยังใช้ไม่ได้ กรุณาตรวจสอบว่าคุณกดลิ้งค์ยืนยันแล้ว';
@@ -221,21 +219,6 @@ $lang['i_pol0'] = 'วิกิเปิดกว้าง (ใ
$lang['i_pol1'] = 'วิกิสาธารณะ (ทุกคนอ่านได้, เขียน และ อัพโหลดเฉพาะผู้ใช้ที่ลงทะเบียนแล้ว)';
$lang['i_pol2'] = 'วิกิภายใน (อ่าน, เขียน, อัพโหลด สำหรับผู้ใช้ที่ลงทะเบียนแล้วเท่านั้น)';
$lang['i_retry'] = 'ลองใหม่';
-$lang['mu_intro'] = 'ที่นี่คุณสามารถอัพโหลดหลายๆไฟล์ได้พร้อมๆกัน คลิ๊กปุ่มบราวซ์เพื่อเพิ่มมันเข้าไปในคิว กดปุ่มอัพโหลดเมื่อเสร็จแล้ว';
-$lang['mu_gridname'] = 'ชื่อไฟล์';
-$lang['mu_gridsize'] = 'ขนาด';
-$lang['mu_gridstat'] = 'สถานะ';
-$lang['mu_namespace'] = 'เนมสเปซ';
-$lang['mu_browse'] = 'เรียกดู';
-$lang['mu_toobig'] = 'ใหญ่ไป';
-$lang['mu_ready'] = 'พร้อมอัปโหลด';
-$lang['mu_done'] = 'เสร็จสิ้น';
-$lang['mu_fail'] = 'ล้มเหลว';
-$lang['mu_authfail'] = 'วาระหมดอายุ';
-$lang['mu_progress'] = '@PCT@% อัปโหลดแล้ว';
-$lang['mu_filetypes'] = 'ชนิดแฟ้มที่อนุญาต';
-$lang['mu_info'] = 'แฟ้มอัปโหลดแล้ว';
-$lang['mu_lasterr'] = 'ผิดพลาดล่าสุด:';
$lang['years'] = '%d ปีก่อน';
$lang['months'] = '%d เดือนก่อน';
$lang['weeks'] = '%d สัปดาห์ก่อน';
diff --git a/inc/lang/tr/install.html b/inc/lang/tr/install.html
index d479ca4e8..de82d729e 100644
--- a/inc/lang/tr/install.html
+++ b/inc/lang/tr/install.html
@@ -2,7 +2,7 @@
<p>DokuWiki wiki sayfalarını ve wiki sayfalarına ilişkin verileri (resimler, arama indeksi, geçmiş sürümler) dosyalarda tutar. DokuWikiyi sorunsuz olarak kullanmak için bu dosyaların bulunduğu dizinlere <strong>mutlaka</strong> yazma izniniz olması gereklidir. Bu kurulum betiği yazma izinlerini ayarlayamamaktadır. İzinleri shell, FTP veya kontrol paneliniz (CPanel, Plesk vs.) aracılığı ile düzenleyebilirsiniz.</p>
-<p>Kurulum betiği <acronym title="access control list">ACL</acronym>'yi otomatik olarak ayarlamaktadır. Böylece yönetici izinleri belirlenip, DokuWiki kullanımı kolaylaştırılmaktadır.</p>
+<p>Kurulum betiği <abbr title="access control list">ACL</abbr>'yi otomatik olarak ayarlamaktadır. Böylece yönetici izinleri belirlenip, DokuWiki kullanımı kolaylaştırılmaktadır.</p>
-<p>Deneyimli kullanıcılar <a href="http://dokuwiki.org/install">bu sayfayı </a>
+<p>Deneyimli kullanıcılar <a href="http://dokuwiki.org/install">bu sayfayı </a>
edebilir ve <a href="http://dokuwiki.org/config">bu sayfa yardımıyla</a> yapılandırma hakkında ekstra bilgi sahibi olabilir.</p> \ No newline at end of file
diff --git a/inc/lang/tr/lang.php b/inc/lang/tr/lang.php
index 94b1c951a..77518ac36 100644
--- a/inc/lang/tr/lang.php
+++ b/inc/lang/tr/lang.php
@@ -43,7 +43,6 @@ $lang['btn_backtomedia'] = 'Çokluortam dosyası seçimine dön';
$lang['btn_subscribe'] = 'Sayfa Değişikliklerini Bildir';
$lang['btn_profile'] = 'Kullanıcı Bilgilerini Güncelle';
$lang['btn_reset'] = 'Sıfırla';
-$lang['btn_resendpwd'] = 'Yeni parola gönder';
$lang['btn_draft'] = 'Taslağı düzenle';
$lang['btn_recover'] = 'Taslağı geri yükle';
$lang['btn_draftdel'] = 'Taslağı sil';
@@ -78,7 +77,6 @@ $lang['profnoempty'] = 'Boş isim veya e-posta adresine izin verilmiyo
$lang['profchanged'] = 'Kullanıcı bilgileri başarıyla değiştirildi.';
$lang['pwdforget'] = 'Parolanızı mı unuttunuz? Yeni bir parola alın';
$lang['resendna'] = 'Bu wiki parolayı tekrar göndermeyi desteklememektedir.';
-$lang['resendpwd'] = 'Yeni parolayı gönder:';
$lang['resendpwdmissing'] = 'Üzgünüz, tüm alanları doldurmalısınız.';
$lang['resendpwdnouser'] = 'Üzgünüz, veritabanımızda bu kullanıcıyı bulamadık.';
$lang['resendpwdbadauth'] = 'Üzgünüz, bu doğrulama kodu doğru değil. Doğrulama linkini tam olarak kullandığınıza emin olun.';
@@ -234,17 +232,4 @@ $lang['i_pol0'] = 'Tamamen Açık Wiki (herkes okuyabilir, yazabi
$lang['i_pol1'] = 'Açık Wiki (herkes okuyabilir, ancak sadece üye olanlar yazabilir ve dosya yükleyebilir)';
$lang['i_pol2'] = 'Kapalı Wiki (sadece üye olanlar okuyabilir, yazabilir ve dosya yükleyebilir)';
$lang['i_retry'] = 'Tekrar Dene';
-$lang['mu_intro'] = 'Burada birden fazla dosyayı bir seferde yükleyebilirsiniz. Sıraya eklemek için Gözat butonuna tıklayın. Bitince yükleye tıklayın';
-$lang['mu_gridname'] = 'Dosya Adı';
-$lang['mu_gridsize'] = 'Boyutu';
-$lang['mu_gridstat'] = 'Durumu';
-$lang['mu_namespace'] = 'Namespace';
-$lang['mu_browse'] = 'Gözat';
-$lang['mu_toobig'] = 'çok büyük';
-$lang['mu_ready'] = 'yüklenmeye hazır';
-$lang['mu_done'] = 'tamamlandı';
-$lang['mu_fail'] = 'başarısız';
-$lang['mu_authfail'] = 'oturum zaman aşımına uğradı';
-$lang['mu_progress'] = '@PCT@% yüklendi';
-$lang['mu_filetypes'] = 'İzin verilen Dosya Türleri';
$lang['recent_global'] = '<b>%s</b> namespace\'i içerisinde yapılan değişiklikleri görüntülemektesiniz. Wiki\'deki tüm değişiklikleri de <a href="%s">bu adresten</a> görebilirsiniz. ';
diff --git a/inc/lang/uk/install.html b/inc/lang/uk/install.html
index 084da8662..a28042741 100644
--- a/inc/lang/uk/install.html
+++ b/inc/lang/uk/install.html
@@ -1,21 +1,21 @@
-<p>Ця сторінка допомагає при першій установці та настройці <a href="http://dokuwiki.org">ДокуВікі</a>.
+<p>Ця сторінка допомагає при першій установці та налаштуванні <a href="http://dokuwiki.org">ДокуВікі</a>.
Більше інформації про програму установки можна знайти на <a href="http://dokuwiki.org/installer">сторінці документації</a>.</p>
<p>ДокуВікі використовую звичайні файли для зберігання сторінок вікі та іншої інформації,
щодо цих сторінок (наприклад, зображень, індексів пошуку, старих ревізій та ін.). Для
успішного функціонування ДокуВікі <strong>має</strong> мати права на запис для папок, що
-містять ці файли. Ця програма установки не може змінювати права доступу. Звичайно це
+містять ці файли. Ця програма установки не може змінювати права доступу. Звичайно це
робиться за допомогою інтерпретатора shell, або, якщо ви використовуєте хостинг,
за допомогою FTP або панелі управління хостингом (наприклад cPanel).</p>
-<p>Ця програма установки налаштує вашу ДокуВікі для використання
-<acronym title="список контролю доступу">ACL</acronym>, що, в свою чергу,
+<p>Ця програма установки налаштує вашу ДокуВікі для використання
+<abbr title="список контролю доступу">ACL</abbr>, що, в свою чергу,
дозволить адміністратору входити до адміністративного меню для установки доданків,
керування користувачами, керування правами доступу до сторінок Вікі та змін параметрів
конфігурації. Це не є обов'язковим для роботи ДокуВікі, але зробить життя адміністратора
значно легшим.</p>
-<p>Досвідчені користувачі, або користувачі, що мають особливі вимоги до налагодження, мають
+<p>Досвідчені користувачі, або користувачі, що мають особливі вимоги до налагодження, мають
використовувати ці посилання для детальної інформації, щодо
<a href="http://dokuwiki.org/install">інструкцій з установки</a>
та <a href="http://dokuwiki.org/config">параметрів конфігурації</a>.</p>
diff --git a/inc/lang/uk/lang.php b/inc/lang/uk/lang.php
index 22d61c9bf..b06cb9158 100644
--- a/inc/lang/uk/lang.php
+++ b/inc/lang/uk/lang.php
@@ -28,7 +28,7 @@ $lang['btn_top'] = 'Повернутися наверх';
$lang['btn_newer'] = '<< більш нові';
$lang['btn_older'] = 'більш старі >>';
$lang['btn_revs'] = 'Старі ревізії';
-$lang['btn_recent'] = 'Недавні зміни';
+$lang['btn_recent'] = 'Останні зміни';
$lang['btn_upload'] = 'Завантажити';
$lang['btn_cancel'] = 'Скасувати';
$lang['btn_index'] = 'Зміст';
@@ -37,19 +37,19 @@ $lang['btn_login'] = 'Увійти';
$lang['btn_logout'] = 'Вийти';
$lang['btn_admin'] = 'Керування';
$lang['btn_update'] = 'Оновити';
-$lang['btn_delete'] = 'Знищити';
+$lang['btn_delete'] = 'Видалити';
$lang['btn_back'] = 'Назад';
$lang['btn_backlink'] = 'Посилання сюди';
$lang['btn_backtomedia'] = 'Назад до вибору медіа-файлу';
$lang['btn_subscribe'] = 'Підписатися';
$lang['btn_profile'] = 'Оновити профіль';
$lang['btn_reset'] = 'Очистити';
-$lang['btn_resendpwd'] = 'Надіслати новий пароль';
$lang['btn_draft'] = 'Редагувати чернетку';
$lang['btn_recover'] = 'Відновити чернетку';
$lang['btn_draftdel'] = 'Знищити чернетку';
$lang['btn_revert'] = 'Відновити';
$lang['btn_register'] = 'Реєстрація';
+$lang['btn_apply'] = 'Застосувати';
$lang['loggedinas'] = 'Ви';
$lang['user'] = 'Користувач';
$lang['pass'] = 'Пароль';
@@ -79,7 +79,6 @@ $lang['profnoempty'] = 'Ім’я або e-mail не можуть бу
$lang['profchanged'] = 'Профіль успішно змінено.';
$lang['pwdforget'] = 'Забули пароль? Отримайте новий';
$lang['resendna'] = 'Ця Вікі не підтримує повторне відправлення пароля.';
-$lang['resendpwd'] = 'Надіслати пароль для';
$lang['resendpwdmissing'] = 'Необхідно заповнити усі поля.';
$lang['resendpwdnouser'] = 'Такий користувач не існує.';
$lang['resendpwdbadauth'] = 'Код автентифікації невірний. Перевірте, чи ви використали повне посилання для підтвердження.';
@@ -94,7 +93,7 @@ $lang['txt_filename'] = 'Завантажити як (не обов\'я
$lang['txt_overwrt'] = 'Перезаписати існуючий файл';
$lang['lockedby'] = 'Заблоковано';
$lang['lockexpire'] = 'Блокування завершується в';
-$lang['js']['willexpire'] = 'Блокування редагування цієї сторінки закінчується через хвилину.\n Щоб уникнути конфліктів використовуйте кнопку перегляду для продовження блокування.';
+$lang['js']['willexpire'] = 'Блокування редагування цієї сторінки закінчується через хвилину.\n Щоб уникнути конфліктів використовуйте кнопку перегляду для продовження блокування.';
$lang['js']['notsavedyet'] = 'Незбережені зміни будуть втрачені.
Дійсно продовжити?';
$lang['js']['searchmedia'] = 'Шукати файли';
@@ -236,7 +235,7 @@ $lang['subscr_m_receive'] = 'Отримувати';
$lang['subscr_style_every'] = 'повідомляти на пошту про кожну зміну';
$lang['subscr_style_digest'] = 'лист з дайджестом для зміни кожної сторінки (кожні %.2f днів)';
$lang['subscr_style_list'] = 'список змінених сторінок від часу отримання останнього листа (кожні %.2f днів)';
-$lang['authmodfailed'] = 'Неправильна настройка автентифікації користувача. Будь ласка, повідомте про це адміністратора.';
+$lang['authmodfailed'] = 'Неправильні налаштування автентифікації користувача. Будь ласка, повідомте про це адміністратора.';
$lang['authtempfail'] = 'Автентифікація користувача тимчасово не доступна. Якщо це буде продовжуватись, будь ласка, повідомте адміністратора.';
$lang['i_chooselang'] = 'Виберіть мову';
$lang['i_installer'] = 'Програма установки ДокуВікі';
@@ -253,7 +252,7 @@ $lang['i_confexists'] = '<code>%s</code> вже існує';
$lang['i_writeerr'] = 'Неможливо створити <code>%s</code>. Необхідно перевірити права доступа для файлу/папки та створити файл вручну.';
$lang['i_badhash'] = 'Невпізнаний або модифікований dokuwiki.php (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - невірне або пусте значення.';
-$lang['i_success'] = 'Настройку завершено. Ми можете знищити файл install.php.
+$lang['i_success'] = 'Налаштування завершено. Ви можете знищити файл install.php.
Перейдіть до <a href="doku.php">вашої нової ДокуВікі</a>';
$lang['i_failure'] = 'При збереженні файлу конфігурації виникли помилки. Можливо вам доведеться виправити їх самостійно
до початку використання <a href="doku.php">вашої нової ДокуВікі</a>.';
@@ -263,21 +262,6 @@ $lang['i_pol1'] = 'Публічна Вікі (читання дл
$lang['i_pol2'] = 'Закрита Вікі (читання, запис та завантаження тільки для зареєстрованих користувачів)';
$lang['i_retry'] = 'Повторити';
$lang['i_license'] = 'Будь ласка, виберіть тип ліцензії, під якою Ві бажаєте опублікувати матеріал:';
-$lang['mu_intro'] = 'Тут ви можете завантажити одночасно кілька файлів. Натисніть кнопку "Вибрати", щоб додати файли в чергу. Після закінчення натисніть кнопку "Завантажити"';
-$lang['mu_gridname'] = 'Ім’я файлу';
-$lang['mu_gridsize'] = 'Розмір';
-$lang['mu_gridstat'] = 'Статус';
-$lang['mu_namespace'] = 'Простір імен';
-$lang['mu_browse'] = 'Вибрати';
-$lang['mu_toobig'] = 'надто великий';
-$lang['mu_ready'] = 'готовий до завантаження';
-$lang['mu_done'] = 'закінчено';
-$lang['mu_fail'] = 'невдале';
-$lang['mu_authfail'] = 'закінчено термін дії сесії';
-$lang['mu_progress'] = 'Завантаження @PCT@%';
-$lang['mu_filetypes'] = 'Дозволені типи файлів';
-$lang['mu_info'] = 'Файли завантажено';
-$lang['mu_lasterr'] = 'Остання помилка:';
$lang['recent_global'] = 'Ви переглядаєте зміни в межах простору імен <b>%s</b>. Також можна <a href="%s">переглянути зміни в межах усієї Вікі</a>.';
$lang['years'] = '%d років тому';
$lang['months'] = '%d місяців тому';
diff --git a/inc/lang/vi/backlinks.txt b/inc/lang/vi/backlinks.txt
index 231ab5d8c..eee624d96 100644
--- a/inc/lang/vi/backlinks.txt
+++ b/inc/lang/vi/backlinks.txt
@@ -1,3 +1,3 @@
-====== Nối về trước ======
+====== Liên kết đến trang vừa xem ======
-Đây là danh sách các trang hình như đã nối vào trang này.
+Đây là danh sách các trang có liên kết đến trang vừa xem.
diff --git a/inc/lang/vi/conflict.txt b/inc/lang/vi/conflict.txt
index 0df1ddbe4..646dcbc45 100644
--- a/inc/lang/vi/conflict.txt
+++ b/inc/lang/vi/conflict.txt
@@ -2,4 +2,4 @@
Trang bạn đang biên soạn có một phiên bản mới hơn. Việc này xảy ra khi một bạn đổi trang ấy khi bạn đang biên soạn trang này.
-Xem kỹ những thay đổi dưới đây, rồi quyết định giữ phiên bản nào. Nếu chọn ''bảo lưu'', phiên bản của bạn được giữ lại. Bấm ''huỷ'' để giữ phiên bản kia.
+Xem kỹ những thay đổi dưới đây, rồi quyết định giữ phiên bản nào. Nếu chọn ''Lưu'', phiên bản của bạn được giữ lại. Bấm ''huỷ'' để giữ phiên bản kia.
diff --git a/inc/lang/vi/denied.txt b/inc/lang/vi/denied.txt
index e70ed5d5f..35acaeb62 100644
--- a/inc/lang/vi/denied.txt
+++ b/inc/lang/vi/denied.txt
@@ -1,3 +1,3 @@
====== Không được phép vào ======
-Rất tiếc là bạn không được phép để tiếp tục. Bạn quen đăng nhập hay sao?
+Rất tiếc là bạn không được phép để tiếp tục. Bạn quên đăng nhập hay sao?
diff --git a/inc/lang/vi/edit.txt b/inc/lang/vi/edit.txt
index b00316a7c..1c16f903c 100644
--- a/inc/lang/vi/edit.txt
+++ b/inc/lang/vi/edit.txt
@@ -1 +1 @@
-Biên soạn trang này và bấm ''Bảo lưu''. Xem [[wiki:syntax]] về cú pháp của Wiki. Xin bạn biên soạn trang này nếu bạn có thể **cải tiến** nó. Nếu bạn muốn thí nghiệm, bạn có thể tập những bước đầu ở [[playground:playground]].
+Biên soạn trang này và bấm ''Lưu''. Xem [[wiki:syntax:vi|cú pháp của Wiki]] để biết cách soạn thảo. Xin bạn biên soạn trang này nếu bạn có thể **cải tiến** nó. Nếu bạn muốn thử nghiệm, bạn có thể thử ở [[playground:playground| chỗ thử]].
diff --git a/inc/lang/vi/editrev.txt b/inc/lang/vi/editrev.txt
index 076466c06..8a2031c4d 100644
--- a/inc/lang/vi/editrev.txt
+++ b/inc/lang/vi/editrev.txt
@@ -1,2 +1,2 @@
-**Bạn đã nạp một phiên bản cũ của văn kiện!** Nếu bảo lưu, bạn sẽ tạo phiên bản với dữ kiện này.
+**Bạn đã nạp một phiên bản cũ của văn bản!** Nếu lưu nó, bạn sẽ tạo phiên bản mới với dữ kiện này.
----
diff --git a/inc/lang/vi/lang.php b/inc/lang/vi/lang.php
index 361e51e84..99c4d47e4 100644
--- a/inc/lang/vi/lang.php
+++ b/inc/lang/vi/lang.php
@@ -5,8 +5,16 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author James Do <jdo@myrealbox.com>
*/
-$lang['encoding'] = 'utf-8';
-$lang['direction'] = 'ltr';
+
+
+
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['doublequoteopening'] = '“'; //&ldquo;
+$lang['doublequoteclosing'] = '”'; //&rdquo;
+$lang['singlequoteopening'] = '‘'; //&lsquo;
+$lang['singlequoteclosing'] = '’'; //&rsquo;
+$lang['apostrophe'] = '’'; //&rsquo;
$lang['btn_edit'] = 'Biên soạn trang này';
$lang['btn_source'] = 'Xem mã nguồn';
@@ -16,6 +24,8 @@ $lang['btn_search'] = 'Tìm';
$lang['btn_save'] = 'Lưu';
$lang['btn_preview']= 'Duyệt trước';
$lang['btn_top'] = 'Trở lên trên';
+$lang['btn_newer'] = '<< mới hơn';
+$lang['btn_older'] = 'cũ hơn >>';
$lang['btn_revs'] = 'Các phiên bản cũ';
$lang['btn_recent'] = 'Thay đổi gần đây';
$lang['btn_upload'] = 'Tải lên';
@@ -27,41 +37,126 @@ $lang['btn_logout'] = 'Thoát';
$lang['btn_admin'] = 'Quản lý';
$lang['btn_update'] = 'Cập nhật';
$lang['btn_delete'] = 'Xoá';
+$lang['btn_back'] = 'Quay lại';
+$lang['btn_backlink'] = "Liên kết tới đây";
+$lang['btn_profile'] = 'Cập nhật hồ sơ';
+$lang['btn_reset'] = 'Làm lại';
+$lang['btn_resendpwd'] = 'Gửi mật khẩu mới';
+$lang['btn_draft'] = 'Sửa bản nháp';
+$lang['btn_recover'] = 'Phục hồi bản nháp';
+$lang['btn_draftdel'] = 'Xóa bản nháp';
+$lang['btn_revert'] = 'Phục hồi';
$lang['btn_register'] = 'Đăng ký';
+$lang['btn_apply'] = 'Chấp nhận';
+$lang['btn_media'] = 'Quản lý tệp tin';
$lang['loggedinas'] = 'Username đang dùng';
$lang['user'] = 'Username';
-$lang['pass'] = 'Password';
+$lang['pass'] = 'Mật khẩu';
+$lang['newpass'] = 'Mật khẩu mới';
+$lang['oldpass'] = 'Nhập lại mật khẩu hiện tại';
+$lang['passchk'] = 'lần nữa';
$lang['remember'] = 'Lưu username/password lại';
$lang['fullname'] = 'Họ và tên';
$lang['email'] = 'E-Mail';
+$lang['profile'] = 'Hồ sơ thành viên';
$lang['badlogin'] = 'Username hoặc password không đúng.';
+$lang['minoredit'] = 'Minor Changes';
+$lang['draftdate'] = 'Bản nháp được tự động lưu lúc'; // full dformat date will be added
+$lang['nosecedit'] = 'Các trang web đã được thay đổi trong khi chờ đợi, phần thông tin quá hạn đã được thay thế bằng trang đầy đủ.';
$lang['regmissing'] = 'Bạn cần điền vào tất cả các trường';
$lang['reguexists'] = 'Bạn khác đã dùng username này rồi.';
$lang['regsuccess'] = 'Đã tạo username, và đã gởi password.';
+$lang['regsuccess2'] = 'Thành viên vừa được tạo.';
$lang['regmailfail']= 'Không gởi password được. Xin bạn liên hệ với người quản lý.';
$lang['regbadmail'] = 'Email hình như không đúng. Xin bạn liên hệ với người quản lý.';
+$lang['regbadpass'] = 'Hai mật khẩu đưa ra là không giống nhau, xin vui lòng thử lại.';
$lang['regpwmail'] = 'Password DokuWiki của bạn là';
-$lang['reghere'] = 'Xin bạn đăng ký username nếu chưa có.';
+$lang['reghere'] = 'Xin bạn đăng ký username nếu chưa có';
+
+$lang['profna'] = 'Wiki này không hỗ trợ sửa đổi hồ sơ cá nhân';
+$lang['profnochange'] = 'Không có thay đổi, không có gì để làm.';
+$lang['profnoempty'] = 'Không được để trống tên hoặc địa chỉ email.';
+$lang['profchanged'] = 'Cập nhật hồ sơ thành viên thành công.';
+$lang['pwdforget'] = 'Bạn quên mật khẩu? Tạo lại mật khẩu mới';
+$lang['resendna'] = 'Wiki này không hỗ trợ gửi lại mật khẩu.';
+$lang['resendpwd'] = 'Gửi mật khẩu mới cho';
+$lang['resendpwdmissing'] = 'Xin lỗi, bạn phải điền vào tất cả các trường.';
+$lang['resendpwdnouser'] = 'Xin lỗi, chúng tôi không thể tìm thấy thành viên này trong cơ sở dữ liệu của chúng tôi.';
+$lang['resendpwdbadauth'] = 'Xin lỗi, mã này xác thực không hợp lệ. Hãy chắc chắn rằng bạn sử dụng liên kết xác nhận đầy đủ.';
+$lang['resendpwdconfirm'] = 'Một liên kết xác nhận đã được gửi bằng email.';
+$lang['resendpwdsuccess'] = 'Mật khẩu mới của bạn đã được gửi bằng email.';
+
+$lang['license'] = 'Trừ khi có ghi chú khác, nội dung trên wiki này được cấp phép theo giấy phép sau đây:';
+$lang['licenseok'] = 'Lưu ý: Bằng cách chỉnh sửa trang này, bạn đồng ý cấp giấy phép nội dung của bạn theo giấy phép sau:';
+
+$lang['searchmedia'] = 'Tìm tên file:';
+$lang['searchmedia_in'] = 'Tìm ở %s';
$lang['txt_upload'] = 'Chọn tệp để tải lên';
$lang['txt_filename'] = 'Điền wikiname (tuỳ ý)';
+$lang['txt_overwrt'] = 'Ghi đè file trùng';
$lang['lockedby'] = 'Đang khoá bởi';
-$lang['lockexpire'] = 'Khoá sẽ hết hạn vào lúc';
-$lang['js']['willexpire'] = 'Khoá của bạn để biên soạn trang này sẽ hết hạn trong vòng 1 phút.\nĐể tránh xung đột, bạn nên bấm nút xem trước để lập lại thời gian khoá';
+$lang['lockexpire'] = 'Sẽ được mở khóa vào lúc';
+$lang['js']['willexpire'] = 'Trong một phút nữa bài viết sẽ được mở khóa để cho phép người khác chỉnh sửa.\nĐể tránh xung đột, bạn nên bấm nút Duyệt trước để lập lại thời gian khoá bài';
$lang['js']['notsavedyet'] = "Hiện có những thay đổi chưa được bảo lưu, và sẽ mất.\nBạn thật sự muốn tiếp tục?";
-$lang['rssfailed'] = 'Rút nguồn này gặp phải lỗi';
+$lang['js']['searchmedia'] = 'Tìm kiếm tập tin';
+$lang['js']['keepopen'] = 'Giữ cửa sổ đang mở trên lựa chọn';
+$lang['js']['hidedetails'] = 'Ẩn thông tin chi tiết';
+$lang['js']['mediatitle'] = 'Thiết lập liên kết';
+$lang['js']['mediadisplay'] = 'Kiểu liên kết';
+$lang['js']['mediaalign'] = 'Sắp hàng';
+$lang['js']['mediasize'] = 'Cỡ ảnh';
+$lang['js']['mediatarget'] = 'Đích của liên kết';
+$lang['js']['mediaclose'] = 'Đóng';
+$lang['js']['mediainsert'] = 'Chèn';
+$lang['js']['mediadisplayimg'] = 'Hiển thị ảnh.';
+$lang['js']['mediadisplaylnk'] = 'Chỉ hiển thị liên kết.';
+$lang['js']['mediasmall'] = 'Nhỏ';
+$lang['js']['mediamedium'] = 'Vừa';
+$lang['js']['medialarge'] = 'To';
+$lang['js']['mediaoriginal'] = 'Kích cỡ gốc';
+$lang['js']['medialnk'] = 'Liên kết tới trang chi tiết';
+$lang['js']['mediadirect'] = 'Liên kết trực tiếp tới ảnh gốc';
+$lang['js']['medianolnk'] = 'Không liên kết';
+$lang['js']['medianolink'] = 'Không liên kết tới ảnh';
+$lang['js']['medialeft'] = 'Căn ảnh sang trái.';
+$lang['js']['mediaright'] = 'Căn ảnh sang phải.';
+$lang['js']['mediacenter'] = 'Cản ảnh ra giữa.';
+$lang['js']['medianoalign'] = 'Không căn.';
+$lang['js']['nosmblinks'] = "Nối với các Windows shares chỉ có hiệu lực với Microsoft Internet Explorer.\nBạn vẫn có thể sao và chép các mốc nối.";
+$lang['js']['linkwiz'] = 'Hộp thoại liên kết';
+$lang['js']['linkto'] = 'Liên kết tới:';
+$lang['js']['del_confirm']= 'Xoá mục này?';
+$lang['js']['restore_confirm'] = 'Sẵn sàng phục hồi phiên bản này?';
+$lang['js']['media_diff'] = 'So sánh:';
+$lang['js']['media_select'] = 'Chọn nhiều file…';
+$lang['js']['media_upload_btn'] = 'Tải lên';
+$lang['js']['media_done_btn'] = 'Xong';
+$lang['js']['media_drop'] = 'Kéo các file vào đây để tải lên';
+$lang['js']['media_overwrt'] = 'Ghi đè các file trùng';
+
+$lang['rssfailed'] = 'Nguồn này gặp phải lỗi';
$lang['nothingfound']= 'Không tìm được gì';
-$lang['mediaselect'] = 'Chọn tệp media';
+$lang['mediaselect'] = 'Xem';
$lang['fileupload'] = 'Tải lên tệp media';
$lang['uploadsucc'] = 'Tải lên thành công';
-$lang['uploadfail'] = 'Tải lên thất bại. Có thể vì không đủ phép?';
+$lang['uploadfail'] = 'Tải lên thất bại. Có thể vì không đủ quyền?';
$lang['uploadwrong'] = 'Tải lên bị từ chối. Cấm tải loại tệp này';
-$lang['namespaces'] = 'Đề tài';
+$lang['uploadexist'] = 'Tệp tin bị trùng. Chưa có gì xảy ra.';
+$lang['namespaces'] = 'Thư mục';
$lang['mediafiles'] = 'Tệp có sẵn ở';
+$lang['accessdenied'] = 'Bạn không được phép xem trang này.';
+$lang['mediausage'] = 'Sử dụng cú pháp sau đây để dẫn đến tập tin này:';
+$lang['mediaview'] = 'Xem tệp gốc';
+$lang['mediaroot'] = 'thư mục gốc';
+$lang['mediaupload'] = 'Tải một tập tin lên thư mục hiện tại ở đây. Để tạo thư mục con, thêm nó vào trước tên tập tin của bạn, phân cách bằng dấu hai chấm sau khi bạn chọn các tập tin. File còn có thể được lựa chọn bằng cách kéo và thả.';
+$lang['mediaextchange'] = 'Phần mở rộng thay đổi từ .%s thành .%s!';
+$lang['ref_inuse'] = 'Không thể xóa tập tin vì nó đang được sử dụng cho các trang sau:';
+$lang['ref_hidden'] = 'Một số tài liệu sử dụng cho trang này bạn không được cấp phép truy cập.';
$lang['hits'] = 'Trùng';
$lang['quickhits'] = 'Trang trùng hợp';
@@ -69,24 +164,36 @@ $lang['toc'] = 'Nội dung';
$lang['current'] = 'hiện tại';
$lang['yours'] = 'Phiên bản hiện tại';
$lang['diff'] = 'cho xem khác biệt với phiên bản hiện tại';
+$lang['diff2'] = 'Sự khác biệt giữa các bản được lựa chọn';
+$lang['difflink'] = 'Liên kết để xem bản so sánh này';
+$lang['diff_type'] = 'Xem sự khác biệt:';
+$lang['diff_inline'] = 'Nội tuyến';
+$lang['diff_side'] = 'Xếp cạnh nhau';
$lang['line'] = 'Dòng';
$lang['breadcrumb'] = 'Trang đã xem';
+$lang['youarehere'] = 'Bạn đang ở đây';
$lang['lastmod'] = 'Thời điểm thay đổi';
$lang['by'] = 'do';
$lang['deleted'] = 'bị xoá';
$lang['created'] = 'được tạo ra';
$lang['restored'] = 'phiên bản cũ đã được khôi phục';
+$lang['external_edit'] = 'external edit';
$lang['summary'] = 'Tóm tắt biên soạn';
+$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> cần được cài để có thể xem nội dung này.';
$lang['mail_newpage'] = 'Trang được thêm:';
$lang['mail_changed'] = 'Trang thay đổi:';
-$lang['js']['nosmblinks'] = "Nối với các Windows shares chỉ có hiệu lực với Microsoft Internet Explorer.\nBạn vẫn có thể sao và chép các mốc nối.";
+$lang['changes_type'] = 'Xem thay đổi của';
+$lang['pages_changes'] = 'Trang';
+$lang['media_changes'] = 'Tệp media';
+$lang['both_changes'] = 'Cả trang và các tập tin media';
$lang['qb_bold'] = 'Chữ đậm';
$lang['qb_italic'] = 'Chữ nghiêng';
$lang['qb_underl'] = 'Chữ gạch dưới';
$lang['qb_code'] = 'Chữ mã nguồn';
+$lang['qb_strike'] = 'Strike-through Text';
$lang['qb_h1'] = 'Đầu đề cấp 1';
$lang['qb_h2'] = 'Đầu đề cấp 2';
$lang['qb_h3'] = 'Đầu đề cấp 3';
@@ -100,7 +207,60 @@ $lang['qb_ul'] = 'Điểm trong danh sách không đánh số';
$lang['qb_media'] = 'Thêm ảnh và tệp khác';
$lang['qb_sig'] = 'Đặt chữ ký';
-$lang['js']['del_confirm']= 'Xoá mục này?';
+$lang['metaedit'] = 'Sửa Metadata';
+$lang['metasaveerr'] = 'Thất bại khi viết metadata';
+$lang['metasaveok'] = 'Metadata đã được lưu';
+$lang['img_backto'] = 'Quay lại';
+$lang['img_title'] = 'Tiêu đề';
+$lang['img_caption'] = 'Ghi chú';
+$lang['img_date'] = 'Ngày';
+$lang['img_fname'] = 'Tên file';
+$lang['img_fsize'] = 'Kích cỡ';
+$lang['img_artist'] = 'Người chụp';
+$lang['img_copyr'] = 'Bản quyền';
+$lang['img_format'] = 'Định dạng';
+$lang['img_camera'] = 'Camera';
+$lang['img_keywords'] = 'Từ khóa';
+$lang['img_width'] = 'Rộng';
+$lang['img_height'] = 'Cao';
+$lang['img_manager'] = 'Xem trong trình quản lý tệp media';
+
+/* installer strings */
+$lang['i_chooselang'] = 'Chọn ngôn ngữ';
+$lang['i_retry'] = 'Thử lại';
+
+$lang['years'] = 'cách đây %d năm';
+$lang['months'] = 'cách đây %d tháng';
+$lang['weeks'] = 'cách đây %d tuần';
+$lang['days'] = 'cách đây %d ngày';
+$lang['hours'] = 'cách đây %d giờ';
+$lang['minutes'] = 'cách đây %d phút';
+$lang['seconds'] = 'cách đây %d giây';
+
+$lang['wordblock'] = 'Thay đổi của bạn đã không được lưu lại bởi vì nó có chứa văn bản bị chặn (spam).';
+$lang['media_uploadtab'] = 'Tải lên';
+$lang['media_searchtab'] = 'Tìm';
+$lang['media_file'] = 'Tệp';
+$lang['media_viewtab'] = 'Xem';
+$lang['media_edittab'] = 'Sửa';
+$lang['media_historytab'] = 'Lịch sử';
+$lang['media_list_thumbs'] = 'Ảnh thu nhỏ';
+$lang['media_list_rows'] = 'Dòng';
+$lang['media_sort_name'] = 'Tên';
+$lang['media_sort_date'] = 'Ngày';
+$lang['media_namespaces'] = 'Chọn thư mục';
+$lang['media_files'] = 'Các tệp trong %s';
+$lang['media_upload'] = 'Tải lên %s';
+$lang['media_search'] = 'Tìm ở %s';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s ở %s';
+$lang['media_edit'] = 'Sửa %s';
+$lang['media_history'] = 'Lịch sử của %s';
+$lang['media_meta_edited'] = 'đã sửa metadata';
+$lang['media_perm_read'] = 'Sorry, bạn không đủ quyền truy cập.';
+$lang['media_perm_upload'] = 'Xin lỗi, bạn không đủ quyền để upload file lên.';
+$lang['media_update'] = 'Tải lên phiên bản mới';
+$lang['media_restore'] = 'Phục hồi phiên bản này';
//Setup VIM: ex: et ts=2 :
diff --git a/inc/lang/vi/login.txt b/inc/lang/vi/login.txt
index 4265a79df..71a8b1a01 100644
--- a/inc/lang/vi/login.txt
+++ b/inc/lang/vi/login.txt
@@ -1,3 +1,3 @@
====== Đăng nhập ======
-Hiện bạn chưa đăng nhập! Điền vào những chi tiết chứng minh ở phía dưới. Máy của bạn cần đặt chế độ nhận cookies để đăng nhập.
+Hiện bạn chưa đăng nhập! Hãy khai báo thông tin đăng nhập vào ô ở phía dưới. Máy của bạn cần đặt chế độ nhận cookies để đăng nhập.
diff --git a/inc/lang/vi/mailtext.txt b/inc/lang/vi/mailtext.txt
index 3fcdf5595..836e02d24 100644
--- a/inc/lang/vi/mailtext.txt
+++ b/inc/lang/vi/mailtext.txt
@@ -12,5 +12,5 @@ User : @USER@
@DIFF@
--
-This mail was generated by DokuWiki at
+Điện thư này tạo bởi DokuWiki ở
@DOKUWIKIURL@
diff --git a/inc/lang/vi/newpage.txt b/inc/lang/vi/newpage.txt
index b03bb5224..93f474b18 100644
--- a/inc/lang/vi/newpage.txt
+++ b/inc/lang/vi/newpage.txt
@@ -1,3 +1,3 @@
====== Chưa có đề tài này ======
-Bạn vừa nối vào một đề tài chưa có. Bạn có tạo đề tài này bằng cách bấm vào nút ''Tạo trang này''.
+Bạn kết nối vào một đề tài chưa có. Bạn có tạo đề tài này bằng cách bấm vào nút ''Tạo trang này'' ở góc trên, bên trái cửa sổ này. Nếu bạn không thấy nút này, thay vào đó là nút ''Xem mã nguồn'' chứng tỏ bạn không có quyền biên tập trang này, hãy đăng nhập thử xem bạn có quyền biên tập trang không. Nếu bạn nghĩ đây là một lỗi, hãy báo cho người quản trị.
diff --git a/inc/lang/vi/norev.txt b/inc/lang/vi/norev.txt
index 0fa27d898..224bd1db0 100644
--- a/inc/lang/vi/norev.txt
+++ b/inc/lang/vi/norev.txt
@@ -1,3 +1,3 @@
====== Phiên bản chưa có ======
-Chưa có phiên bản được chỉ định. Xin bấm nút ''Phiên bản cũ'' để xem danh sách các phiên bản của văn kiện này.
+Chưa có phiên bản được chỉ định. Xin bấm nút ''Phiên bản cũ'' để xem danh sách các phiên bản của văn bản này.
diff --git a/inc/lang/vi/password.txt b/inc/lang/vi/password.txt
index 589bbf067..798a20d33 100644
--- a/inc/lang/vi/password.txt
+++ b/inc/lang/vi/password.txt
@@ -6,4 +6,4 @@ Username: @LOGIN@
Password: @PASSWORD@
--
-Điện thư này xuất phát từ DokuWiki tại @DOKUWIKIURL@.
+Điện thư này xuất phát từ @DOKUWIKIURL@.
diff --git a/inc/lang/vi/preview.txt b/inc/lang/vi/preview.txt
index 81069a2c4..f02a25142 100644
--- a/inc/lang/vi/preview.txt
+++ b/inc/lang/vi/preview.txt
@@ -1,3 +1,3 @@
====== Xem trước ======
-Văn kiện của bạn sẽ thể hiện như sau. Nên nhớ: Văn kiện này **chưa được bảo lưu**!
+Văn bản của bạn sẽ thể hiện như sau. Nên nhớ: Văn bản này **chưa được lưu**!
diff --git a/inc/lang/vi/read.txt b/inc/lang/vi/read.txt
index ffeffc7bf..eec69966b 100644
--- a/inc/lang/vi/read.txt
+++ b/inc/lang/vi/read.txt
@@ -1 +1 @@
-Trang này chỉ được đọc thôi. Bạn có thể xem mã nguồn, nhưng không được thay đổi. Xin bạn hỏi người quản lý nếu không đúng.
+Trang này chỉ được đọc thôi. Bạn có thể xem mã nguồn, nhưng không được thay đổi. Hãy báo lại người quản lý nếu hệ thống hoạt động không đúng.
diff --git a/inc/lang/vi/revisions.txt b/inc/lang/vi/revisions.txt
index 943e3fff1..b9e9779ee 100644
--- a/inc/lang/vi/revisions.txt
+++ b/inc/lang/vi/revisions.txt
@@ -1,3 +1,3 @@
====== Phiên bản cũ ======
-Sau đây là các phiên bản cũ của văn kiện này. Để quây về một phiên bản cũ, chọn ở phía dưới, bấm vào ''Biên soạn trang này'' để bảo lưu.
+Sau đây là các phiên bản cũ của văn bản này. Để quay về một phiên bản cũ, bạn hãy chọn nó từ danh sách dưới đây, sau đó bấm vào nút ''Phục hồi'' hoặc nhấp nút ''Biên soạn trang này'' và lưu nó lại.
diff --git a/inc/lang/vi/searchpage.txt b/inc/lang/vi/searchpage.txt
index 821ca9f7b..7ded7a808 100644
--- a/inc/lang/vi/searchpage.txt
+++ b/inc/lang/vi/searchpage.txt
@@ -1,5 +1,5 @@
====== Tìm ======
-Sau đây là kết quả của câu hỏi của bạn. Nếu bạn không thấy được những gì bạn đang tìm, bạn có thể một trang mới, cùng tên câu hỏi của bạn, bằng cách bấm vào nút ''Biên soạn trang này''.
+Sau đây là kết quả mà bạn đã tìm. Nếu bạn không thấy được những gì bạn đang tìm, bạn có thể tạo một trang mới bằng cách bấm vào nút ''Biên soạn trang này'', khi đó bạn sẽ có 1 trang mới với tên trang chính là tuwfw khóa bạn đã tìm kiếm.
===== Kết quả =====
diff --git a/inc/lang/zh-tw/admin.txt b/inc/lang/zh-tw/admin.txt
index 3cc10335d..5916e7106 100644
--- a/inc/lang/zh-tw/admin.txt
+++ b/inc/lang/zh-tw/admin.txt
@@ -1,4 +1,3 @@
====== 管理選單 ======
-以下為 DokuWiki 的管理設定
-
+以下為 DokuWiki 的管理設定。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/diff.txt b/inc/lang/zh-tw/diff.txt
index b2b662ec3..17fad7ba0 100644
--- a/inc/lang/zh-tw/diff.txt
+++ b/inc/lang/zh-tw/diff.txt
@@ -1,4 +1,3 @@
====== 差異處 ======
-這裡顯示二個版本的差異處。
-
+這裏顯示二個版本的差異處。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/index.txt b/inc/lang/zh-tw/index.txt
index 11ec223d9..bba277041 100644
--- a/inc/lang/zh-tw/index.txt
+++ b/inc/lang/zh-tw/index.txt
@@ -1,3 +1,3 @@
====== 站台地圖 ======
-這個站台地圖列出了所有允許的頁面,依 [[doku>namespaces|命名空間]] 排序。
+這個站台地圖列出了所有允許的頁面,依 [[doku>namespaces|分類空間]] 排序。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/install.html b/inc/lang/zh-tw/install.html
index 88af0b394..2a8b1aac3 100644
--- a/inc/lang/zh-tw/install.html
+++ b/inc/lang/zh-tw/install.html
@@ -1,8 +1,8 @@
-<p>本頁面旨在幫助您完成第一次安装和配置 <a href="http://dokuwiki.org">Dokuwiki</a>。關於安裝工具的更多訊息請參閱 <a href="http://dokuwiki.org/installer">官方文檔頁面</a>。</p>
+<p>本頁面旨在幫助您完成第一次安装和設定 <a href="http://dokuwiki.org">Dokuwiki</a>。關於安裝工具的更多訊息請參閱 <a href="http://dokuwiki.org/installer">官方文檔頁面</a>。</p>
<p>DokuWiki 使用普通檔案儲存維基頁面以及與頁面相關的訊息(例如:圖像,搜尋索引,修訂記錄等)。為了正常運作,DokuWiki <strong>必須</strong> 擁有針對那些路徑和檔案的寫入權限。本安裝工具無法設定目錄權限,這通常要透過命令行、FTP 或您主機上的控制台(如cPanel)進行。</p>
-<p>本安裝工具將設定您的 DokuWiki 用於 <acronym title="訪問控制列表">ACL</acronym> 的配置檔,它能讓管理員登入並使用「管理」功能來安裝插件、管理用户、管理訪問權限和其他配置設定。它並不是 DokuWiki 正常運作所必須,但安裝之後將更方便管理。</p>
+<p>本安裝工具將設定您的 DokuWiki 用於 <abbr title="訪問控制列表">ACL</abbr> 的設定檔,它能讓管理員登入並使用「管理」功能來安裝插件、管理用户、管理訪問權限和其他設定設定。它並不是 DokuWiki 正常運作所必須,但安裝之後將更方便管理。</p>
<p>有經驗的用戶或有特殊需求的用戶請參閱更詳細的 <a href="http://dokuwiki.org/install">安裝指南</a>
-和 <a href="http://dokuwiki.org/config">配置設定</a>。</p> \ No newline at end of file
+和 <a href="http://dokuwiki.org/config">設定</a>。</p> \ No newline at end of file
diff --git a/inc/lang/zh-tw/lang.php b/inc/lang/zh-tw/lang.php
index a144767f4..2cceb4012 100644
--- a/inc/lang/zh-tw/lang.php
+++ b/inc/lang/zh-tw/lang.php
@@ -10,6 +10,7 @@
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
* @author Danny Lin
* @author Shuo-Ting Jian <shoting@gmail.com>
+ * @author syaoranhinata@gmail.com
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -45,7 +46,7 @@ $lang['btn_backtomedia'] = '重新選擇圖檔';
$lang['btn_subscribe'] = '訂閱更動通知';
$lang['btn_profile'] = '更新個人資料';
$lang['btn_reset'] = '資料重設';
-$lang['btn_resendpwd'] = '寄新密碼';
+$lang['btn_resendpwd'] = '設定新密碼';
$lang['btn_draft'] = '編輯草稿';
$lang['btn_recover'] = '復原草稿';
$lang['btn_draftdel'] = '捨棄草稿';
@@ -61,40 +62,41 @@ $lang['oldpass'] = '目前密碼';
$lang['passchk'] = '確認密碼';
$lang['remember'] = '記住帳號密碼';
$lang['fullname'] = '真實姓名';
-$lang['email'] = 'E-Mail';
+$lang['email'] = '電郵';
$lang['profile'] = '使用者個人資料';
-$lang['badlogin'] = '很抱歉,您的使用者名稱或密碼可能有錯誤';
+$lang['badlogin'] = '很抱歉,您的使用者名稱或密碼可能有錯誤。';
$lang['minoredit'] = '小修改';
$lang['draftdate'] = '草稿已自動存檔於';
$lang['nosecedit'] = '頁面在這之間已被修改,過時的區段資料已載入全頁取代。';
-$lang['regmissing'] = '很抱歉,所有欄位都要填寫';
-$lang['reguexists'] = '很抱歉,本帳號已被註冊';
+$lang['regmissing'] = '很抱歉,所有欄位都要填寫。';
+$lang['reguexists'] = '很抱歉,本帳號已被註冊。';
$lang['regsuccess'] = '使用者已建立,密碼已寄發至該 email。';
-$lang['regsuccess2'] = '使用者已建立';
+$lang['regsuccess2'] = '使用者已建立。';
$lang['regmailfail'] = '寄出密碼信似乎發生錯誤,請跟管理員聯絡!';
$lang['regbadmail'] = '您輸入的 email 似乎不對,如果您認為是正確的,請與管理員聯絡。';
$lang['regbadpass'] = '兩次輸入的密碼不一致,請再試一次。';
$lang['regpwmail'] = '您的 DokuWiki 帳號密碼';
$lang['reghere'] = '您還沒有帳號嗎?註冊一個吧。';
-$lang['profna'] = '本維基不開放修改個人資料';
-$lang['profnochange'] = '未做任何變更';
-$lang['profnoempty'] = '帳號或 email 地址不可空白!';
-$lang['profchanged'] = '個人資料已成功更新囉。';
+$lang['profna'] = '本維基不開放修改個人資料。';
+$lang['profnochange'] = '未做任何變更。';
+$lang['profnoempty'] = '帳號或電郵地址不可空白!';
+$lang['profchanged'] = '個人資料已成功更新。';
$lang['pwdforget'] = '忘記密碼了?索取新密碼!';
-$lang['resendna'] = '本維基不開放重寄密碼';
-$lang['resendpwd'] = '寄新密碼給';
+$lang['resendna'] = '本維基不開放重寄密碼。';
+$lang['resendpwd'] = '設定新密碼供';
$lang['resendpwdmissing'] = '抱歉,您必須填寫所有欄位。';
-$lang['resendpwdnouser'] = '抱歉,資料庫內找不到這個使用者';
+$lang['resendpwdnouser'] = '抱歉,資料庫內找不到這個使用者。';
$lang['resendpwdbadauth'] = '抱歉,認證碼無效。請確認您使用了完整的確認連結。';
$lang['resendpwdconfirm'] = '確認連結已通過郵件發送給您了。';
$lang['resendpwdsuccess'] = '您的新密碼已寄出。';
$lang['license'] = '若未特別註明,此維基上的內容都是採用以下授權方式:';
$lang['licenseok'] = '注意:編輯此頁面表示您已同意以下的授權方式:';
$lang['searchmedia'] = '搜尋檔名:';
-$lang['searchmedia_in'] = '在 %s 裡搜尋';
+$lang['searchmedia_in'] = '在 %s 裏搜尋';
$lang['txt_upload'] = '請選擇要上傳的檔案';
$lang['txt_filename'] = '請輸入要存在維基內的檔案名稱 (非必要)';
$lang['txt_overwrt'] = '是否要覆蓋原有檔案';
+$lang['maxuploadsize'] = '每個上傳檔案不可大於 %s 。';
$lang['lockedby'] = '目前已被下列人員鎖定';
$lang['lockexpire'] = '預計解除鎖定於';
$lang['js']['willexpire'] = '本頁的編輯鎖定將在一分鐘內到期。要避免發生衝突,請按「預覽」鍵重設鎖定計時。';
@@ -124,12 +126,12 @@ $lang['js']['mediaright'] = '圖像靠右對齊';
$lang['js']['mediacenter'] = '圖像置中對齊';
$lang['js']['medianoalign'] = '不對齊';
$lang['js']['nosmblinks'] = '只有在 Microsoft IE 下才能執行「連結到 Windows shares」。
-不過您仍可複製及貼上這個連結';
+不過您仍可複製及貼上這個連結。';
$lang['js']['linkwiz'] = '建立連結精靈';
$lang['js']['linkto'] = '連結至:';
$lang['js']['del_confirm'] = '確定刪除選取的項目?';
$lang['js']['restore_confirm'] = '確定還原到這個版本?';
-$lang['js']['media_diff'] = '檢視差異:';
+$lang['js']['media_diff'] = '檢視差異:';
$lang['js']['media_diff_both'] = '並排';
$lang['js']['media_diff_opacity'] = '重疊';
$lang['js']['media_diff_portions'] = '滑動';
@@ -147,21 +149,21 @@ $lang['uploadsucc'] = '上傳成功';
$lang['uploadfail'] = '上傳失敗。似乎是權限錯誤?';
$lang['uploadwrong'] = '拒絕上傳。這個副檔名被禁止了!';
$lang['uploadexist'] = '檔案已存在,未處理。';
-$lang['uploadbadcontent'] = '上傳檔案的內容不符合 %s 檔的副檔名';
+$lang['uploadbadcontent'] = '上傳檔案的內容不符合 %s 檔的副檔名。';
$lang['uploadspam'] = '這次的上傳被垃圾訊息黑名單阻檔了。';
$lang['uploadxss'] = '這次的上傳因可能的惡意的內容而被阻檔。';
$lang['uploadsize'] = '上傳的檔案太大了 (最大:%s)';
$lang['deletesucc'] = '檔案 "%s" 已刪除。';
$lang['deletefail'] = '檔案 "%s" 無法刪除,請檢查權限定。';
$lang['mediainuse'] = '檔案 "%s" 未刪除,因為它正被使用。';
-$lang['namespaces'] = '命名空間';
+$lang['namespaces'] = '分類空間';
$lang['mediafiles'] = '可用的檔案有';
-$lang['accessdenied'] = '您不被允許檢視此頁面';
-$lang['mediausage'] = '使用以下的語法來連結此檔案:';
+$lang['accessdenied'] = '您不可以檢視此頁面。';
+$lang['mediausage'] = '使用以下的語法來連結此檔案:';
$lang['mediaview'] = '檢視原始檔案';
$lang['mediaroot'] = 'root';
-$lang['mediaupload'] = '上傳檔案至目前的命名空間。要建立次級命名空間,將其名稱加在「上傳並重命名為」檔案名的前面,並用英文冒號隔開';
-$lang['mediaextchange'] = '檔案類型已由 .%s 變更為 .%s !';
+$lang['mediaupload'] = '上傳檔案至目前的分類空間。要建立子分類空間,將其名稱加在「上傳並重命名為」檔案名的前面,並用英文冒號隔開。';
+$lang['mediaextchange'] = '檔案類型已由 .%s 變更為 .%s !';
$lang['reference'] = '引用到本頁的,合計有';
$lang['ref_inuse'] = '此檔案無法刪除,因為它正被以下頁面使用:';
$lang['ref_hidden'] = '一些參考內容位於您沒有讀取權限的頁面中';
@@ -188,11 +190,17 @@ $lang['external_edit'] = '外部編輯';
$lang['summary'] = '編輯摘要';
$lang['noflash'] = '顯示此內容需要 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
$lang['download'] = '下載程式碼片段';
-$lang['mail_newpage'] = '增加的頁面:';
-$lang['mail_changed'] = '變更的頁面:';
-$lang['mail_subscribe_list'] = '命名空間中更動的頁面:';
-$lang['mail_new_user'] = '新使用者:';
-$lang['mail_upload'] = '已上傳檔案:';
+$lang['tools'] = '工具';
+$lang['user_tools'] = '用戶工具';
+$lang['site_tools'] = '網站工具';
+$lang['page_tools'] = '頁面工具';
+$lang['skip_to_content'] = '跳至內容';
+$lang['sidebar'] = '側欄';
+$lang['mail_newpage'] = '增加的頁面:';
+$lang['mail_changed'] = '變更的頁面:';
+$lang['mail_subscribe_list'] = '分類空間中更動的頁面:';
+$lang['mail_new_user'] = '新使用者:';
+$lang['mail_upload'] = '已上傳檔案:';
$lang['changes_type'] = '檢視最近更新類型';
$lang['pages_changes'] = '頁面';
$lang['media_changes'] = '多媒體檔案';
@@ -221,7 +229,7 @@ $lang['qb_media'] = '加入圖片或檔案';
$lang['qb_sig'] = '插入簽名';
$lang['qb_smileys'] = '表情符號';
$lang['qb_chars'] = '特殊字元';
-$lang['upperns'] = '前往父層命名空間';
+$lang['upperns'] = '前往父分類空間';
$lang['admin_register'] = '新增使用者';
$lang['metaedit'] = '編輯後設資料';
$lang['metasaveerr'] = '後設資料寫入失敗';
@@ -247,7 +255,7 @@ $lang['subscr_unsubscribe_success'] = '已將 %s 移除自 %s 的訂閱列表';
$lang['subscr_unsubscribe_error'] = '將 %s 移除自 %s 的訂閱列表時發生錯誤';
$lang['subscr_already_subscribed'] = '%s 已經被 %s 訂閱了';
$lang['subscr_not_subscribed'] = '%s 尚未被 %s 訂閱';
-$lang['subscr_m_not_subscribed'] = '您尚未訂閱目前的頁面或命名空間。';
+$lang['subscr_m_not_subscribed'] = '您尚未訂閱目前的頁面或分類空間。';
$lang['subscr_m_new_header'] = '加入訂閱';
$lang['subscr_m_current_header'] = '目前訂閱';
$lang['subscr_m_unsubscribe'] = '取消訂閱';
@@ -258,6 +266,7 @@ $lang['subscr_style_digest'] = '對每個頁面發送更改的摘要信件 (
$lang['subscr_style_list'] = '自上次發信以來更改的頁面的列表 (每 %.2f 天)';
$lang['authmodfailed'] = '帳號認證的設定不正確,請通知該維基管理員。';
$lang['authtempfail'] = '帳號認證目前暫不提供,若本狀況持續發生的話,請通知該維基管理員。';
+$lang['authpwdexpire'] = '您的密碼將在 %d 天內到期,請馬上更換新密碼。';
$lang['i_chooselang'] = '選擇您的語系';
$lang['i_installer'] = 'DokuWiki 安裝工具';
$lang['i_wikiname'] = '維基名稱';
@@ -282,22 +291,7 @@ $lang['i_pol1'] = '公開的維基 (任何人可讀取,註冊
$lang['i_pol2'] = '封閉的維基 (只有註冊使用者可讀取、寫入、上傳)';
$lang['i_retry'] = '重試';
$lang['i_license'] = '請選擇您想要的內容發布許可協議:';
-$lang['mu_intro'] = '您可以在這裡一次上傳多個檔案。按下瀏覽按鈕加入檔案,然後按上傳按鈕開始上傳。';
-$lang['mu_gridname'] = '檔案名稱';
-$lang['mu_gridsize'] = '檔案大小';
-$lang['mu_gridstat'] = '狀態';
-$lang['mu_namespace'] = '命名空間';
-$lang['mu_browse'] = '瀏覽';
-$lang['mu_toobig'] = '太大';
-$lang['mu_ready'] = '準備上傳';
-$lang['mu_done'] = '完成';
-$lang['mu_fail'] = '失敗';
-$lang['mu_authfail'] = '作業階段逾時';
-$lang['mu_progress'] = '@PCT@% 已上傳';
-$lang['mu_filetypes'] = '接受的檔案類型';
-$lang['mu_info'] = '檔案已上傳。';
-$lang['mu_lasterr'] = '最新一筆錯誤紀錄:';
-$lang['recent_global'] = '您正在閱讀命名空間: <b>%s</b> 中的變更。您亦可觀看整個維基的<a href="%s">最近更新</a>。';
+$lang['recent_global'] = '您正在閱讀分類空間: <b>%s</b> 中的變更。您亦可觀看整個維基的<a href="%s">最近更新</a>。';
$lang['years'] = '%d 年前';
$lang['months'] = '%d 個月前';
$lang['weeks'] = '%d 週前';
@@ -316,7 +310,7 @@ $lang['media_list_thumbs'] = '縮圖';
$lang['media_list_rows'] = '列表';
$lang['media_sort_name'] = '名稱';
$lang['media_sort_date'] = '日期';
-$lang['media_namespaces'] = '選擇命名空間';
+$lang['media_namespaces'] = '選擇分類空間';
$lang['media_files'] = '在 %s 中的檔案';
$lang['media_upload'] = '上傳至 %s';
$lang['media_search'] = '在 %s 中搜尋';
@@ -325,8 +319,7 @@ $lang['media_viewold'] = '%s 在 %s';
$lang['media_edit'] = '編輯 %s';
$lang['media_history'] = '%s 的歷史紀錄';
$lang['media_meta_edited'] = '元資料已編輯';
-$lang['media_perm_read'] = '抱歉,您沒有足夠權限讀取檔案';
+$lang['media_perm_read'] = '抱歉,您沒有足夠權限讀取檔案。';
$lang['media_perm_upload'] = '抱歉,您沒有足夠權限上傳檔案。';
$lang['media_update'] = '上傳新的版本';
$lang['media_restore'] = '還原這個版本';
-$lang['plugin_install_err'] = '插件安裝錯誤。將插件目錄 "%s" 重新命名為 "%s"';
diff --git a/inc/lang/zh-tw/mailwrap.html b/inc/lang/zh-tw/mailwrap.html
new file mode 100644
index 000000000..9cd5faacd
--- /dev/null
+++ b/inc/lang/zh-tw/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>這郵件由DokuWiki at @DOKUWIKIURL@. 生成</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/zh-tw/resetpwd.txt b/inc/lang/zh-tw/resetpwd.txt
new file mode 100644
index 000000000..f760335af
--- /dev/null
+++ b/inc/lang/zh-tw/resetpwd.txt
@@ -0,0 +1,3 @@
+====== 設定新密碼 ======
+
+請為您的帳戶輸入新密碼。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/subscr_digest.txt b/inc/lang/zh-tw/subscr_digest.txt
index a26e73050..a0f2be73e 100644
--- a/inc/lang/zh-tw/subscr_digest.txt
+++ b/inc/lang/zh-tw/subscr_digest.txt
@@ -12,8 +12,8 @@
要取消頁面提醒,請登入維基 @DOKUWIKIURL@
然後拜訪 @SUBSCRIBE@
-並取消訂閱頁面或命名空間的更改。
+並取消訂閱頁面或分類空間的更改。
--
本信件由以下 DokuWiki 站台產生:
-@DOKUWIKIURL@
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/zh-tw/subscr_form.txt b/inc/lang/zh-tw/subscr_form.txt
index 0ad675cc8..394d4cbad 100644
--- a/inc/lang/zh-tw/subscr_form.txt
+++ b/inc/lang/zh-tw/subscr_form.txt
@@ -1,3 +1,3 @@
====== 訂閱管理 ======
-這個頁面允許您管理在目前頁面和命名空間的訂閱。 \ No newline at end of file
+這個頁面允許您管理在目前頁面和分類空間的訂閱。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/subscr_list.txt b/inc/lang/zh-tw/subscr_list.txt
index 2a1b26c6e..078eae63e 100644
--- a/inc/lang/zh-tw/subscr_list.txt
+++ b/inc/lang/zh-tw/subscr_list.txt
@@ -1,6 +1,6 @@
您好!
-維基 @TITLE@ 的 @PAGE@ 命名空間的頁面已更改。
+維基 @TITLE@ 的 @PAGE@ 分類空間的頁面已更改。
更改內容如下:
--------------------------------------------------------
@@ -9,8 +9,8 @@
要取消頁面提醒,請登入維基 @DOKUWIKIURL@
然後拜訪 @SUBSCRIBE@
-並取消訂閱頁面或命名空間的更改。
+並取消訂閱頁面或分類空間的更改。
--
本信件由以下 DokuWiki 站台產生:
-@DOKUWIKIURL@
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/zh-tw/subscr_single.txt b/inc/lang/zh-tw/subscr_single.txt
index f3c623c5c..5128140d0 100644
--- a/inc/lang/zh-tw/subscr_single.txt
+++ b/inc/lang/zh-tw/subscr_single.txt
@@ -15,8 +15,8 @@
要取消頁面提醒,請登入維基 @DOKUWIKIURL@
然後拜訪 @NEWPAGE@
-並取消訂閱頁面或命名空間的更改。
+並取消訂閱頁面或分類空間的更改。
--
本信件由以下 DokuWiki 站台產生:
-@DOKUWIKIURL@
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/zh/install.html b/inc/lang/zh/install.html
index 8c7a93c19..448f6bda7 100644
--- a/inc/lang/zh/install.html
+++ b/inc/lang/zh/install.html
@@ -2,7 +2,7 @@
<p>DokuWiki 使用普通的文件保存维基页面和其他与这些页面挂钩的信息(例如:图像,搜索索引,修订记录等)。为了能正常运行,DokuWiki <strong>必须</strong> 拥有针对那些路径和文件的写权限。本安装工具不能用于设置这些权限。对权限的操作通常通过命令行或使用您的网络服务提供商的 FTP 或控制面板(例如 cPanel)进行操作。</p>
-<p>本安装工具将设置您的 DokuWiki 配置 <acronym title="访问控制列表">ACL</acronym>,它能让管理员登录并使用“管理”功能来安装插件,管理用户,管理访问权限和其他配置设置。它并不是 DokuWiki 正常运行所必须的,但安装之后它将更方便您的管理。</p>
+<p>本安装工具将设置您的 DokuWiki 配置 <abbr title="访问控制列表">ACL</abbr>,它能让管理员登录并使用“管理”功能来安装插件,管理用户,管理访问权限和其他配置设置。它并不是 DokuWiki 正常运行所必须的,但安装之后它将更方便您的管理。</p>
<p>有经验的用户或有特殊需求的用户请参阅更详细的 <a href="http://dokuwiki.org/install">安装指南</a>
和 <a href="http://dokuwiki.org/config">配置设置</a>。</p>
diff --git a/inc/lang/zh/lang.php b/inc/lang/zh/lang.php
index 95d1bc2c5..b21a74ed5 100644
--- a/inc/lang/zh/lang.php
+++ b/inc/lang/zh/lang.php
@@ -50,7 +50,7 @@ $lang['btn_backtomedia'] = '返回到媒体文件选择工具';
$lang['btn_subscribe'] = '订阅本页更改';
$lang['btn_profile'] = '更新个人信息';
$lang['btn_reset'] = '重设';
-$lang['btn_resendpwd'] = '发送新密码';
+$lang['btn_resendpwd'] = '设置新密码';
$lang['btn_draft'] = '编辑草稿';
$lang['btn_recover'] = '恢复草稿';
$lang['btn_draftdel'] = '删除草稿';
@@ -87,7 +87,7 @@ $lang['profnoempty'] = '不允许使用空的用户名或邮件地址
$lang['profchanged'] = '用户信息更新成功。';
$lang['pwdforget'] = '忘记密码?立即获取新密码';
$lang['resendna'] = '本维基不支持二次发送密码。';
-$lang['resendpwd'] = '发送新密码给';
+$lang['resendpwd'] = '设置新密码用于';
$lang['resendpwdmissing'] = '对不起,您必须填写所有的区域。';
$lang['resendpwdnouser'] = '对不起,在我们的用户数据中找不到该用户。';
$lang['resendpwdbadauth'] = '对不起,该认证码错误。请使用完整的确认链接。';
@@ -100,6 +100,7 @@ $lang['searchmedia_in'] = '在%s中查找';
$lang['txt_upload'] = '选择要上传的文件';
$lang['txt_filename'] = '上传并重命名为(可选)';
$lang['txt_overwrt'] = '覆盖已存在的同名文件';
+$lang['maxuploadsize'] = '上传限制。每个文件 %s';
$lang['lockedby'] = '目前已被下列人员锁定';
$lang['lockexpire'] = '预计锁定解除于';
$lang['js']['willexpire'] = '您对本页的独有编辑权将于一分钟之后解除。\n为了防止与其他人的编辑冲突,请使用预览按钮重设计时器。';
@@ -189,11 +190,17 @@ $lang['lastmod'] = '最后更改';
$lang['by'] = '由';
$lang['deleted'] = '移除';
$lang['created'] = '创建';
-$lang['restored'] = '已恢复为旧版';
+$lang['restored'] = '已恢复为旧版 (%s)';
$lang['external_edit'] = '外部编辑';
$lang['summary'] = '编辑摘要';
$lang['noflash'] = '需要 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash 插件</a> 来播放本内容。 ';
$lang['download'] = '下载片段';
+$lang['tools'] = '工具';
+$lang['user_tools'] = '用户工具';
+$lang['site_tools'] = '站点工具';
+$lang['page_tools'] = '页面工具';
+$lang['skip_to_content'] = '跳至内容';
+$lang['sidebar'] = '侧边栏';
$lang['mail_newpage'] = '添加页面:';
$lang['mail_changed'] = '更改页面:';
$lang['mail_subscribe_list'] = '命名空间中改变的页面:';
@@ -264,6 +271,7 @@ $lang['subscr_style_digest'] = '对每个页面发送更改的摘要邮件(
$lang['subscr_style_list'] = '自上封邮件以来更改的页面的列表(每 %.2f 天)';
$lang['authmodfailed'] = '错误的用户认证设置。请通知维基管理员。';
$lang['authtempfail'] = '用户认证暂时无法使用。如果该状态一直存在,请通知维基管理员。';
+$lang['authpwdexpire'] = '您的密码将在 %d 天内过期,请尽快更改';
$lang['i_chooselang'] = '选择您的语言';
$lang['i_installer'] = 'DokuWiki 安装工具';
$lang['i_wikiname'] = '维基名称';
@@ -290,21 +298,6 @@ $lang['i_pol1'] = '公共的维基(任何人都有读的权限
$lang['i_pol2'] = '关闭的维基(只有注册用户才有读、写、上传的权限)';
$lang['i_retry'] = '重试';
$lang['i_license'] = '请选择您希望的内容发布许可协议:';
-$lang['mu_intro'] = '您可以在此一次上传多个文件。点按浏览按钮添加文件到上传队列中,先好后按上传钮。';
-$lang['mu_gridname'] = '文件名';
-$lang['mu_gridsize'] = '大小';
-$lang['mu_gridstat'] = '状态';
-$lang['mu_namespace'] = '名称空间';
-$lang['mu_browse'] = '浏览';
-$lang['mu_toobig'] = '过大';
-$lang['mu_ready'] = '准备好上传';
-$lang['mu_done'] = '完成';
-$lang['mu_fail'] = '失败';
-$lang['mu_authfail'] = '会话过期';
-$lang['mu_progress'] = '@PCT@% 上传完成';
-$lang['mu_filetypes'] = '允许的文件类型';
-$lang['mu_info'] = '文件已上传。';
-$lang['mu_lasterr'] = '最后一个错误:';
$lang['recent_global'] = '您当前看到的是<b>%s</b> 名称空间的变动。你还可以在<a href="%s">查看整个维基的近期变动</a>。';
$lang['years'] = '%d年前';
$lang['months'] = '%d月前';
@@ -328,8 +321,8 @@ $lang['media_namespaces'] = '选择命名空间';
$lang['media_files'] = '在 %s 中的文件';
$lang['media_upload'] = '上传到 <strong>%s</strong> 命名空间。';
$lang['media_search'] = '在 <strong>%s</strong> 命名空间中搜索。';
-$lang['media_view'] = '%s 在 %s';
-$lang['media_viewold'] = '%s ';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s 在 %s';
$lang['media_edit'] = '编辑 %s';
$lang['media_history'] = '%s 的历史纪录';
$lang['media_meta_edited'] = '元数据已编辑';
@@ -337,4 +330,3 @@ $lang['media_perm_read'] = '抱歉,您没有足够权限读取这些文
$lang['media_perm_upload'] = '抱歉,您没有足够权限来上传文件。';
$lang['media_update'] = '上传新版本';
$lang['media_restore'] = '恢复这个版本';
-$lang['plugin_install_err'] = '插件安装不正确。重命名插件目录“%s”为“%s”。';
diff --git a/inc/lang/zh/mailwrap.html b/inc/lang/zh/mailwrap.html
new file mode 100644
index 000000000..0f00d95b1
--- /dev/null
+++ b/inc/lang/zh/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>本邮件由位于 @DOKUWIKIURL@ 的 Dokuwiki 自动创建。</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/zh/resetpwd.txt b/inc/lang/zh/resetpwd.txt
new file mode 100644
index 000000000..a9d59fdd3
--- /dev/null
+++ b/inc/lang/zh/resetpwd.txt
@@ -0,0 +1,3 @@
+====== 设置新密码 ======
+
+请为您在本维基上的账户设置一个新密码。 \ No newline at end of file
diff --git a/inc/load.php b/inc/load.php
index 138118a2a..fbbf020fd 100644
--- a/inc/load.php
+++ b/inc/load.php
@@ -49,6 +49,7 @@ function load_autoload($name){
static $classes = null;
if(is_null($classes)) $classes = array(
'DokuHTTPClient' => DOKU_INC.'inc/HTTPClient.php',
+ 'HTTPClient' => DOKU_INC.'inc/HTTPClient.php',
'JSON' => DOKU_INC.'inc/JSON.php',
'adLDAP' => DOKU_INC.'inc/adLDAP.php',
'Diff' => DOKU_INC.'inc/DifferenceEngine.php',
@@ -61,6 +62,7 @@ function load_autoload($name){
'Doku_Event' => DOKU_INC.'inc/events.php',
'Doku_Event_Handler' => DOKU_INC.'inc/events.php',
'EmailAddressValidator' => DOKU_INC.'inc/EmailAddressValidator.php',
+ 'Input' => DOKU_INC.'inc/Input.class.php',
'JpegMeta' => DOKU_INC.'inc/JpegMeta.php',
'SimplePie' => DOKU_INC.'inc/SimplePie.php',
'FeedParser' => DOKU_INC.'inc/FeedParser.php',
@@ -76,10 +78,14 @@ function load_autoload($name){
'SafeFN' => DOKU_INC.'inc/SafeFN.class.php',
'Sitemapper' => DOKU_INC.'inc/Sitemapper.php',
'PassHash' => DOKU_INC.'inc/PassHash.class.php',
+ 'Mailer' => DOKU_INC.'inc/Mailer.class.php',
+ 'RemoteAPI' => DOKU_INC.'inc/remote.php',
+ 'RemoteAPICore' => DOKU_INC.'inc/RemoteAPICore.php',
'DokuWiki_Action_Plugin' => DOKU_PLUGIN.'action.php',
'DokuWiki_Admin_Plugin' => DOKU_PLUGIN.'admin.php',
'DokuWiki_Syntax_Plugin' => DOKU_PLUGIN.'syntax.php',
+ 'DokuWiki_Remote_Plugin' => DOKU_PLUGIN.'remote.php',
'DokuWiki_Auth_Plugin' => DOKU_PLUGIN.'auth.php',
);
@@ -90,13 +96,14 @@ function load_autoload($name){
}
// Plugin loading
- if(preg_match('/^(auth|helper|syntax|action|admin|renderer)_plugin_([^_]+)(?:_([^_]+))?$/',
+ if(preg_match('/^(auth|helper|syntax|action|admin|renderer|remote)_plugin_('.DOKU_PLUGIN_NAME_REGEX.')(?:_([^_]+))?$/',
$name, $m)) {
- //try to load the wanted plugin file
- // include, but be silent. Maybe some other autoloader has an idea
- // how to load this class.
+ // try to load the wanted plugin file
$c = ((count($m) === 4) ? "/{$m[3]}" : '');
- @include DOKU_PLUGIN . "{$m[2]}/{$m[1]}$c.php";
+ $plg = DOKU_PLUGIN . "{$m[2]}/{$m[1]}$c.php";
+ if(@file_exists($plg)){
+ include_once DOKU_PLUGIN . "{$m[2]}/{$m[1]}$c.php";
+ }
return;
}
}
diff --git a/inc/mail.php b/inc/mail.php
index 01b2895e1..d0ea651bf 100644
--- a/inc/mail.php
+++ b/inc/mail.php
@@ -32,20 +32,25 @@ if (!defined('PREG_PATTERN_VALID_EMAIL')) define('PREG_PATTERN_VALID_EMAIL', '['
/**
* Prepare mailfrom replacement patterns
*
+ * Also prepares a mailfromnobody config that contains an autoconstructed address
+ * if the mailfrom one is userdependent and this might not be wanted (subscriptions)
+ *
* @author Andreas Gohr <andi@splitbrain.org>
*/
function mail_setup(){
global $conf;
global $USERINFO;
- $replace = array();
+ // auto constructed address
+ $host = @parse_url(DOKU_URL,PHP_URL_HOST);
+ if(!$host) $host = 'example.com';
+ $noreply = 'noreply@'.$host;
+ $replace = array();
if(!empty($USERINFO['mail'])){
$replace['@MAIL@'] = $USERINFO['mail'];
}else{
- $host = @parse_url(DOKU_URL,PHP_URL_HOST);
- if(!$host) $host = 'example.com';
- $replace['@MAIL@'] = 'noreply@'.$host;
+ $replace['@MAIL@'] = $noreply;
}
if(!empty($_SERVER['REMOTE_USER'])){
@@ -60,9 +65,18 @@ function mail_setup(){
$replace['@NAME@'] = '';
}
- $conf['mailfrom'] = str_replace(array_keys($replace),
- array_values($replace),
- $conf['mailfrom']);
+ // apply replacements
+ $from = str_replace(array_keys($replace),
+ array_values($replace),
+ $conf['mailfrom']);
+
+ // any replacements done? set different mailfromnone
+ if($from != $conf['mailfrom']){
+ $conf['mailfromnobody'] = $noreply;
+ }else{
+ $conf['mailfromnobody'] = $from;
+ }
+ $conf['mailfrom'] = $from;
}
/**
@@ -106,7 +120,7 @@ function _mail_send_action($data) {
// discard mail request if no recipients are available
if(trim($to) === '' && trim($cc) === '' && trim($bcc) === '') return false;
-
+
// end additional code to support event ... original mail_send() code from here
if(defined('MAILHEADER_ASCIIONLY')){
@@ -208,9 +222,9 @@ function mail_encode_address($string,$header='',$names=true){
if(!utf8_isASCII($text)){
// put the quotes outside as in =?UTF-8?Q?"Elan Ruusam=C3=A4e"?= vs "=?UTF-8?Q?Elan Ruusam=C3=A4e?="
if (preg_match('/^"(.+)"$/', $text, $matches)) {
- $text = '"=?UTF-8?Q?'.mail_quotedprintable_encode($matches[1], 0).'?="';
+ $text = '"=?UTF-8?Q?'.mail_quotedprintable_encode($matches[1], 0).'?="';
} else {
- $text = '=?UTF-8?Q?'.mail_quotedprintable_encode($text, 0).'?=';
+ $text = '=?UTF-8?Q?'.mail_quotedprintable_encode($text, 0).'?=';
}
// additionally the space character should be encoded as =20 (or each
// word QP encoded separately).
diff --git a/inc/media.php b/inc/media.php
index af4647ecb..6335bf210 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -175,10 +175,10 @@ define('DOKU_MEDIA_EMPTY_NS', 8);
*
* @author Andreas Gohr <andi@splitbrain.org>
* @return int One of: 0,
- DOKU_MEDIA_DELETED,
- DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS,
- DOKU_MEDIA_NOT_AUTH,
- DOKU_MEDIA_INUSE
+ * DOKU_MEDIA_DELETED,
+ * DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS,
+ * DOKU_MEDIA_NOT_AUTH,
+ * DOKU_MEDIA_INUSE
*/
function media_delete($id,$auth){
global $lang;
@@ -189,7 +189,7 @@ function media_delete($id,$auth){
// trigger an event - MEDIA_DELETE_FILE
$data['id'] = $id;
- $data['name'] = basename($file);
+ $data['name'] = utf8_basename($file);
$data['path'] = $file;
$data['size'] = (@file_exists($file)) ? filesize($file) : 0;
@@ -226,26 +226,29 @@ function media_delete($id,$auth){
*/
function media_upload_xhr($ns,$auth){
if(!checkSecurityToken()) return false;
+ global $INPUT;
- $id = $_GET['qqfile'];
+ $id = $INPUT->get->str('qqfile');
list($ext,$mime,$dl) = mimetype($id);
$input = fopen("php://input", "r");
- $temp = tmpfile();
- $realSize = stream_copy_to_stream($input, $temp);
- fclose($input);
- if ($realSize != (int)$_SERVER["CONTENT_LENGTH"]) return false;
if (!($tmp = io_mktmpdir())) return false;
$path = $tmp.'/'.md5($id);
$target = fopen($path, "w");
- fseek($temp, 0, SEEK_SET);
- stream_copy_to_stream($temp, $target);
+ $realSize = stream_copy_to_stream($input, $target);
fclose($target);
+ fclose($input);
+ if ($realSize != (int)$_SERVER["CONTENT_LENGTH"]){
+ unlink($target);
+ unlink($path);
+ return false;
+ }
+
$res = media_save(
array('name' => $path,
'mime' => $mime,
'ext' => $ext),
$ns.':'.$id,
- (($_REQUEST['ow'] == 'checked') ? true : false),
+ (($INPUT->get->str('ow') == 'checked') ? true : false),
$auth,
'copy'
);
@@ -268,9 +271,10 @@ function media_upload_xhr($ns,$auth){
function media_upload($ns,$auth,$file=false){
if(!checkSecurityToken()) return false;
global $lang;
+ global $INPUT;
// get file and id
- $id = $_POST['mediaid'];
+ $id = $INPUT->post->str('mediaid');
if (!$file) $file = $_FILES['upload'];
if(empty($id)) $id = $file['name'];
@@ -292,7 +296,7 @@ function media_upload($ns,$auth,$file=false){
$res = media_save(array('name' => $file['tmp_name'],
'mime' => $imime,
'ext' => $iext), $ns.':'.$id,
- $_REQUEST['ow'], $auth, 'move_uploaded_file');
+ $INPUT->post->bool('ow'), $auth, 'copy_uploaded_file');
if (is_array($res)) {
msg($res[0], $res[1]);
return false;
@@ -301,6 +305,23 @@ function media_upload($ns,$auth,$file=false){
}
/**
+ * An alternative to move_uploaded_file that copies
+ *
+ * Using copy, makes sure any setgid bits on the media directory are honored
+ *
+ * @see move_uploaded_file()
+ * @param string $from
+ * @param string $to
+ * @return bool
+ */
+function copy_uploaded_file($from, $to){
+ if(!is_uploaded_file($from)) return false;
+ $ok = copy($from, $to);
+ @unlink($from);
+ return $ok;
+}
+
+/**
* This generates an action event and delegates to _media_upload_action().
* Action plugins are allowed to pre/postprocess the uploaded file.
* (The triggered event is preventable.)
@@ -418,7 +439,7 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'mov
media_notify($id,$fn,$imime,$old);
// add a log entry to the media changelog
if ($REV){
- addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_REVERT, $lang['restored'], $REV);
+ addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_REVERT, sprintf($lang['restored'], dformat($REV)), $REV);
} elseif ($overwrite) {
addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT);
} else {
@@ -514,6 +535,7 @@ function media_contentcheck($file,$mime){
* Send a notify mail on uploads
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @fixme this should embed thumbnails of images in HTML version
*/
function media_notify($id,$file,$mime,$old_rev=false){
global $lang;
@@ -521,31 +543,24 @@ function media_notify($id,$file,$mime,$old_rev=false){
global $INFO;
if(empty($conf['notify'])) return; //notify enabled?
- $ip = clientIP();
-
$text = rawLocale('uploadmail');
- $text = str_replace('@DATE@',dformat(),$text);
- $text = str_replace('@BROWSER@',$_SERVER['HTTP_USER_AGENT'],$text);
- $text = str_replace('@IPADDRESS@',$ip,$text);
- $text = str_replace('@HOSTNAME@',gethostsbyaddrs($ip),$text);
- $text = str_replace('@DOKUWIKIURL@',DOKU_URL,$text);
- $text = str_replace('@USER@',$_SERVER['REMOTE_USER'],$text);
- $text = str_replace('@MIME@',$mime,$text);
- $text = str_replace('@MEDIA@',ml($id,'',true,'&',true),$text);
- $text = str_replace('@SIZE@',filesize_h(filesize($file)),$text);
- if ($old_rev && $conf['mediarevisions']) {
- $text = str_replace('@OLD@', ml($id, "rev=$old_rev", true, '&', true), $text);
- } else {
- $text = str_replace('@OLD@', '', $text);
- }
+ $trep = array(
+ 'MIME' => $mime,
+ 'MEDIA' => ml($id,'',true,'&',true),
+ 'SIZE' => filesize_h(filesize($file)),
+ );
- if(empty($conf['mailprefix'])) {
- $subject = '['.$conf['title'].'] '.$lang['mail_upload'].' '.$id;
+ if ($old_rev && $conf['mediarevisions']) {
+ $trep['OLD'] = ml($id, "rev=$old_rev", true, '&', true);
} else {
- $subject = '['.$conf['mailprefix'].'] '.$lang['mail_upload'].' '.$id;
+ $trep['OLD'] = '---';
}
- mail_send($conf['notify'],$subject,$text,$conf['mailfrom']);
+ $mail = new Mailer();
+ $mail->to($conf['notify']);
+ $mail->subject($lang['mail_upload'].' '.$id);
+ $mail->setBody($text,$trep);
+ return $mail->send();
}
/**
@@ -645,7 +660,10 @@ function media_tabs_details($image, $selected_tab = ''){
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_tab_files_options(){
- global $lang, $NS;
+ global $lang;
+ global $NS;
+ global $INPUT;
+ global $ID;
$form = new Doku_Form(array('class' => 'options', 'method' => 'get',
'action' => wl($ID)));
$media_manager_params = media_managerURL(array(), '', false, true);
@@ -653,8 +671,8 @@ function media_tab_files_options(){
$form->addHidden($pKey, $pVal);
}
$form->addHidden('sectok', null);
- if (isset($_REQUEST['q'])) {
- $form->addHidden('q', $_REQUEST['q']);
+ if ($INPUT->has('q')) {
+ $form->addHidden('q', $INPUT->str('q'));
}
$form->addElement('<ul>'.NL);
foreach(array('list' => array('listType', array('thumbs', 'rows')),
@@ -698,9 +716,10 @@ function _media_get_list_type() {
}
function _media_get_display_param($param, $values) {
- if (isset($_REQUEST[$param]) && in_array($_REQUEST[$param], $values)) {
+ global $INPUT;
+ if (in_array($INPUT->str($param), $values)) {
// FIXME: Set cookie
- return $_REQUEST[$param];
+ return $INPUT->str($param);
} else {
$val = get_doku_pref($param, $values['default']);
if (!in_array($val, $values)) {
@@ -750,14 +769,14 @@ function media_tab_upload($ns,$auth=null,$jump='') {
*/
function media_tab_search($ns,$auth=null) {
global $lang;
+ global $INPUT;
- $do = $_REQUEST['mediado'];
- $query = $_REQUEST['q'];
- if (!$query) $query = '';
+ $do = $INPUT->str('mediado');
+ $query = $INPUT->str('q');
echo '<div class="search">'.NL;
media_searchform($ns, $query, true);
- if ($do == 'searchlist') {
+ if ($do == 'searchlist' || $query) {
media_searchlist($query,$ns,$auth,true,_media_get_sort_type());
}
echo '</div>'.NL;
@@ -805,14 +824,16 @@ function media_tab_edit($image, $ns, $auth=null) {
*/
function media_tab_history($image, $ns, $auth=null) {
global $lang;
+ global $INPUT;
+
if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*");
- $do = $_REQUEST['mediado'];
+ $do = $INPUT->str('mediado');
if ($auth >= AUTH_READ && $image) {
if ($do == 'diff'){
media_diff($image, $ns, $auth);
} else {
- $first = isset($_REQUEST['first']) ? intval($_REQUEST['first']) : 0;
+ $first = $INPUT->int('first');
html_revisions($first, $image);
}
} else {
@@ -830,6 +851,7 @@ function media_preview($image, $auth, $rev=false, $meta=false) {
$size = media_image_preview_size($image, $rev, $meta);
if ($size) {
+ global $lang;
echo '<div class="image">';
$more = array();
@@ -843,7 +865,10 @@ function media_preview($image, $auth, $rev=false, $meta=false) {
$more['w'] = $size[0];
$more['h'] = $size[1];
$src = ml($image, $more);
+
+ echo '<a href="'.$src.'" target="_blank" title="'.$lang['mediaview'].'">';
echo '<img src="'.$src.'" alt="" style="max-width: '.$size[0].'px;" />';
+ echo '</a>';
echo '</div>'.NL;
}
@@ -1002,21 +1027,23 @@ function media_details($image, $auth, $rev=false, $meta=false) {
function media_diff($image, $ns, $auth, $fromajax = false) {
global $lang;
global $conf;
+ global $INPUT;
if ($auth < AUTH_READ || !$image || !$conf['mediarevisions']) return '';
- $rev1 = (int) $_REQUEST['rev'];
+ $rev1 = $INPUT->int('rev');
- if(is_array($_REQUEST['rev2'])){
- $rev1 = (int) $_REQUEST['rev2'][0];
- $rev2 = (int) $_REQUEST['rev2'][1];
+ $rev2 = $INPUT->ref('rev2');
+ if(is_array($rev2)){
+ $rev1 = (int) $rev2[0];
+ $rev2 = (int) $rev2[1];
if(!$rev1){
$rev1 = $rev2;
unset($rev2);
}
}else{
- $rev2 = (int) $_REQUEST['rev2'];
+ $rev2 = $INPUT->int('rev2');
}
if ($rev1 && !file_exists(mediaFN($image, $rev1))) $rev1 = false;
@@ -1071,7 +1098,9 @@ function _media_file_diff($data) {
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){
- global $lang, $config_cascade;
+ global $lang;
+ global $config_cascade;
+ global $INPUT;
$l_meta = new JpegMeta(mediaFN($image, $l_rev));
$r_meta = new JpegMeta(mediaFN($image, $r_rev));
@@ -1082,7 +1111,7 @@ function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){
$r_size = media_image_preview_size($image, $r_rev, $r_meta);
$is_img = ($l_size && $r_size && ($l_size[0] >= 30 || $r_size[0] >= 30));
- $difftype = $_REQUEST['difftype'];
+ $difftype = $INPUT->str('difftype');
if (!$fromajax) {
$form = new Doku_Form(array(
@@ -1110,6 +1139,7 @@ function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){
list($l_head, $r_head) = html_diff_head($l_rev, $r_rev, $image, true);
?>
+ <div class="table">
<table>
<tr>
<th><?php echo $l_head; ?></th>
@@ -1177,6 +1207,7 @@ function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){
echo '</tr>'.NL;
echo '</table>'.NL;
+ echo '</div>'.NL;
if ($is_img && !$fromajax) echo '</div>';
}
@@ -1350,11 +1381,11 @@ function media_printfile($item,$auth,$jump,$display_namespace=false){
$info .= filesize_h($item['size']);
// output
- echo '<div class="'.$zebra.'"'.$jump.'>'.NL;
+ echo '<div class="'.$zebra.'"'.$jump.' title="'.hsc($item['id']).'">'.NL;
if (!$display_namespace) {
- echo '<a name="h_:'.$item['id'].'" class="'.$class.'">'.hsc($file).'</a> ';
+ echo '<a id="h_:'.$item['id'].'" class="'.$class.'">'.hsc($file).'</a> ';
} else {
- echo '<a name="h_:'.$item['id'].'" class="'.$class.'">'.hsc($item['id']).'</a><br/>';
+ echo '<a id="h_:'.$item['id'].'" class="'.$class.'">'.hsc($item['id']).'</a><br/>';
}
echo '<span class="info">('.$info.')</span>'.NL;
@@ -1411,14 +1442,14 @@ function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false
$file = utf8_decodeFN($item['file']);
// output
- echo '<li><dl>'.NL;
+ echo '<li><dl title="'.hsc($item['id']).'">'.NL;
echo '<dt>';
if($item['isimg']) {
media_printimgdetail($item, true);
} else {
- echo '<a name="d_:'.$item['id'].'" class="image" title="'.$item['id'].'" href="'.
+ echo '<a id="d_:'.$item['id'].'" class="image" title="'.$item['id'].'" href="'.
media_managerURL(array('image' => hsc($item['id']), 'ns' => getNS($item['id']),
'tab_details' => 'view')).'">';
echo media_printicon($item['id']);
@@ -1431,7 +1462,7 @@ function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false
$name = hsc($item['id']);
}
echo '<dd class="name"><a href="'.media_managerURL(array('image' => hsc($item['id']), 'ns' => getNS($item['id']),
- 'tab_details' => 'view')).'" name="h_:'.$item['id'].'">'.$name.'</a></dd>'.NL;
+ 'tab_details' => 'view')).'" id="h_:'.$item['id'].'">'.$name.'</a></dd>'.NL;
if($item['isimg']){
$size = '';
@@ -1440,7 +1471,7 @@ function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false
$size .= (int) $item['meta']->getField('File.Height');
echo '<dd class="size">'.$size.'</dd>'.NL;
} else {
- echo '<dd class="size">&nbsp;</dd>'.NL;
+ echo '<dd class="size">&#160;</dd>'.NL;
}
$date = dformat($item['mtime']);
echo '<dd class="date">'.$date.'</dd>'.NL;
@@ -1479,7 +1510,7 @@ function media_printimgdetail($item, $fullscreen=false){
// output
if ($fullscreen) {
- echo '<a name="l_:'.$item['id'].'" class="image thumb" href="'.
+ echo '<a id="l_:'.$item['id'].'" class="image thumb" href="'.
media_managerURL(array('image' => hsc($item['id']), 'ns' => getNS($item['id']), 'tab_details' => 'view')).'">';
echo '<img src="'.$src.'" '.$att.' />';
echo '</a>';
@@ -1489,7 +1520,7 @@ function media_printimgdetail($item, $fullscreen=false){
echo '<div class="detail">';
echo '<div class="thumb">';
- echo '<a name="d_:'.$item['id'].'" class="select">';
+ echo '<a id="d_:'.$item['id'].'" class="select">';
echo '<img src="'.$src.'" '.$att.' />';
echo '</a>';
echo '</div>';
@@ -1525,11 +1556,12 @@ function media_printimgdetail($item, $fullscreen=false){
function media_managerURL($params=false, $amp='&amp;', $abs=false, $params_array=false) {
global $conf;
global $ID;
+ global $INPUT;
$gets = array('do' => 'media');
$media_manager_params = array('tab_files', 'tab_details', 'image', 'ns', 'list', 'sort');
foreach ($media_manager_params as $x) {
- if (isset($_REQUEST[$x])) $gets[$x] = $_REQUEST[$x];
+ if ($INPUT->has($x)) $gets[$x] = $INPUT->str($x);
}
if ($params) {
@@ -1553,7 +1585,9 @@ function media_managerURL($params=false, $amp='&amp;', $abs=false, $params_array
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_uploadform($ns, $auth, $fullscreen = false){
- global $lang, $conf;
+ global $lang;
+ global $conf;
+ global $INPUT;
if($auth < AUTH_UPLOAD) {
echo '<div class="nothing">'.$lang['media_perm_upload'].'</div>'.NL;
@@ -1563,9 +1597,9 @@ function media_uploadform($ns, $auth, $fullscreen = false){
$update = false;
$id = '';
- if ($auth >= $auth_ow && $fullscreen && $_REQUEST['mediado'] == 'update') {
+ if ($auth >= $auth_ow && $fullscreen && $INPUT->str('mediado') == 'update') {
$update = true;
- $id = cleanID($_REQUEST['image']);
+ $id = cleanID($INPUT->str('image'));
}
// The default HTML upload form
@@ -1600,7 +1634,35 @@ function media_uploadform($ns, $auth, $fullscreen = false){
echo NL.'<div id="mediamanager__uploader">'.NL;
html_form('upload', $form);
+
echo '</div>'.NL;
+
+ echo '<p class="maxsize">';
+ printf($lang['maxuploadsize'],filesize_h(media_getuploadsize()));
+ echo '</p>'.NL;
+
+}
+
+/**
+ * Returns the size uploaded files may have
+ *
+ * This uses a conservative approach using the lowest number found
+ * in any of the limiting ini settings
+ *
+ * @returns int size in bytes
+ */
+function media_getuploadsize(){
+ $okay = 0;
+
+ $post = (int) php_to_byte(@ini_get('post_max_size'));
+ $suho = (int) php_to_byte(@ini_get('suhosin.post.max_value_length'));
+ $upld = (int) php_to_byte(@ini_get('upload_max_filesize'));
+
+ if($post && ($post < $okay || $okay == 0)) $okay = $post;
+ if($suho && ($suho < $okay || $okay == 0)) $okay = $suho;
+ if($upld && ($upld < $okay || $okay == 0)) $okay = $upld;
+
+ return $okay;
}
/**
@@ -1667,12 +1729,13 @@ function media_nstree($ns){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function media_nstree_item($item){
+ global $INPUT;
$pos = strrpos($item['id'], ':');
$label = substr($item['id'], $pos > 0 ? $pos + 1 : 0);
if(!$item['label']) $item['label'] = $label;
$ret = '';
- if (!($_REQUEST['do'] == 'media'))
+ if (!($INPUT->str('do') == 'media'))
$ret .= '<a href="'.DOKU_BASE.'lib/exe/mediamanager.php?ns='.idfilter($item['id']).'" class="idx_dir">';
else $ret .= '<a href="'.media_managerURL(array('ns' => idfilter($item['id'], false), 'tab_files' => 'files'))
.'" class="idx_dir">';
@@ -1693,7 +1756,7 @@ function media_nstree_li($item){
if($item['open']){
$class .= ' open';
$img = DOKU_BASE.'lib/images/minus.gif';
- $alt = '&minus;';
+ $alt = '−';
}else{
$class .= ' closed';
$img = DOKU_BASE.'lib/images/plus.gif';
diff --git a/inc/pageutils.php b/inc/pageutils.php
index 151fa5987..55cc081a1 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -19,9 +19,10 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
function getID($param='id',$clean=true){
+ global $INPUT;
global $conf;
- $id = isset($_REQUEST[$param]) ? $_REQUEST[$param] : null;
+ $id = $INPUT->str($param);
//construct page id from request URI
if(empty($id) && $conf['userewrite'] == 2){
@@ -34,7 +35,7 @@ function getID($param='id',$clean=true){
if($param != 'id') {
$relpath = 'lib/exe/';
}
- $script = $conf['basedir'].$relpath.basename($_SERVER['SCRIPT_FILENAME']);
+ $script = $conf['basedir'].$relpath.utf8_basename($_SERVER['SCRIPT_FILENAME']);
}elseif($_SERVER['PATH_INFO']){
$request = $_SERVER['PATH_INFO'];
@@ -198,7 +199,8 @@ function noNSorNS($id) {
* Creates a XHTML valid linkid from a given headline title
*
* @param string $title The headline title
- * @param array $check Existing IDs (title => number)
+ * @param array|bool $check Existing IDs (title => number)
+ * @return string the title
* @author Andreas Gohr <andi@splitbrain.org>
*/
function sectionID($title,&$check) {
@@ -213,9 +215,9 @@ function sectionID($title,&$check) {
if(is_array($check)){
// make sure tiles are unique
if (!array_key_exists ($title,$check)) {
- $check[$title] = 0;
+ $check[$title] = 0;
} else {
- $title .= ++ $check[$title];
+ $title .= ++ $check[$title];
}
}
@@ -347,27 +349,29 @@ function mediaFN($id, $rev=''){
if(empty($rev)){
$fn = $conf['mediadir'].'/'.utf8_encodeFN($id);
}else{
- $ext = mimetype($id);
- $name = substr($id,0, -1*strlen($ext[0])-1);
+ $ext = mimetype($id);
+ $name = substr($id,0, -1*strlen($ext[0])-1);
$fn = $conf['mediaolddir'].'/'.utf8_encodeFN($name .'.'.( (int) $rev ).'.'.$ext[0]);
}
return $fn;
}
/**
- * Returns the full filepath to a localized textfile if local
+ * Returns the full filepath to a localized file if local
* version isn't found the english one is returned
*
+ * @param string $id The id of the local file
+ * @param string $ext The file extension (usually txt)
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function localeFN($id){
+function localeFN($id,$ext='txt'){
global $conf;
- $file = DOKU_CONF.'/lang/'.$conf['lang'].'/'.$id.'.txt';
+ $file = DOKU_CONF.'/lang/'.$conf['lang'].'/'.$id.'.'.$ext;
if(!@file_exists($file)){
- $file = DOKU_INC.'inc/lang/'.$conf['lang'].'/'.$id.'.txt';
+ $file = DOKU_INC.'inc/lang/'.$conf['lang'].'/'.$id.'.'.$ext;
if(!@file_exists($file)){
//fall back to english
- $file = DOKU_INC.'inc/lang/en/'.$id.'.txt';
+ $file = DOKU_INC.'inc/lang/en/'.$id.'.'.$ext;
}
}
return $file;
@@ -620,3 +624,27 @@ function utf8_decodeFN($file){
return urldecode($file);
}
+/**
+ * Find a page in the current namespace (determined from $ID) or any
+ * higher namespace
+ *
+ * Used for sidebars, but can be used other stuff as well
+ *
+ * @todo add event hook
+ * @param string $page the pagename you're looking for
+ * @return string|false the full page id of the found page, false if any
+ */
+function page_findnearest($page){
+ global $ID;
+
+ $ns = $ID;
+ do {
+ $ns = getNS($ns);
+ $pageid = ltrim("$ns:$page",':');
+ if(page_exists($pageid)){
+ return $pageid;
+ }
+ } while($ns);
+
+ return false;
+}
diff --git a/inc/parser/code.php b/inc/parser/code.php
index 4d94dcf4e..21fb0dc3c 100644
--- a/inc/parser/code.php
+++ b/inc/parser/code.php
@@ -16,11 +16,12 @@ class Doku_Renderer_code extends Doku_Renderer {
* When the correct block was found it exits the script.
*/
function code($text, $language = NULL, $filename='' ) {
+ global $INPUT;
if(!$language) $language = 'txt';
if(!$filename) $filename = 'snippet.'.$language;
- $filename = basename($filename);
+ $filename = utf8_basename($filename);
- if($this->_codeblock == $_REQUEST['codeblock']){
+ if($this->_codeblock == $INPUT->str('codeblock')){
header("Content-Type: text/plain; charset=utf-8");
header("Content-Disposition: attachment; filename=$filename");
header("X-Robots-Tag: noindex");
diff --git a/inc/parser/metadata.php b/inc/parser/metadata.php
index 136c37531..8bfdc3b9c 100644
--- a/inc/parser/metadata.php
+++ b/inc/parser/metadata.php
@@ -455,16 +455,16 @@ class Doku_Renderer_metadata extends Doku_Renderer {
global $conf;
$isImage = false;
- if (is_null($title)){
+ if (is_array($title)){
+ if($title['title']) return '['.$title['title'].']';
+ } else if (is_null($title) || trim($title)==''){
if (useHeading('content') && $id){
$heading = p_get_first_heading($id,METADATA_DONT_RENDER);
if ($heading) return $heading;
}
return $default;
- } else if (is_string($title)){
+ } else {
return $title;
- } else if (is_array($title)){
- if($title['title']) return '['.$title['title'].']';
}
}
diff --git a/inc/parser/parser.php b/inc/parser/parser.php
index 68d4e4569..915899f53 100644
--- a/inc/parser/parser.php
+++ b/inc/parser/parser.php
@@ -52,6 +52,9 @@ class Doku_Parser {
var $Handler;
+ /**
+ * @var Doku_Lexer $Lexer
+ */
var $Lexer;
var $modes = array();
@@ -59,11 +62,11 @@ class Doku_Parser {
var $connected = false;
function addBaseMode(& $BaseMode) {
- $this->modes['base'] = & $BaseMode;
+ $this->modes['base'] =& $BaseMode;
if ( !$this->Lexer ) {
$this->Lexer = new Doku_Lexer($this->Handler,'base', true);
}
- $this->modes['base']->Lexer = & $this->Lexer;
+ $this->modes['base']->Lexer =& $this->Lexer;
}
/**
@@ -75,7 +78,7 @@ class Doku_Parser {
$this->addBaseMode(new Doku_Parser_Mode_base());
}
$Mode->Lexer = & $this->Lexer;
- $this->modes[$name] = & $Mode;
+ $this->modes[$name] =& $Mode;
}
function connectModes() {
@@ -134,6 +137,9 @@ class Doku_Parser {
*/
class Doku_Parser_Mode {
+ /**
+ * @var Doku_Lexer $Lexer
+ */
var $Lexer;
var $allowedModes = array();
@@ -929,7 +935,7 @@ class Doku_Parser_Mode_windowssharelink extends Doku_Parser_Mode {
var $pattern;
function preConnect() {
- $this->pattern = "\\\\\\\\\w+?(?:\\\\[\w$]+)+";
+ $this->pattern = "\\\\\\\\\w+?(?:\\\\[\w-$]+)+";
}
function connectTo($mode) {
diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php
index 7002fd0cb..0923e6896 100644
--- a/inc/parser/renderer.php
+++ b/inc/parser/renderer.php
@@ -20,6 +20,8 @@ class Doku_Renderer extends DokuWiki_Plugin {
'toc' => true, // render the TOC?
);
+ var $doc = '';
+
// keep some config options
var $acronyms = array();
var $smileys = array();
@@ -75,7 +77,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
foreach ( $instructions as $instruction ) {
// execute the callback against ourself
if (method_exists($this,$instruction[0])) {
- call_user_func_array(array($this, $instruction[0]),$instruction[1]);
+ call_user_func_array(array($this, $instruction[0]), $instruction[1] ? $instruction[1] : array());
}
}
}
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index bfa22d066..b4e78a530 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -29,7 +29,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
var $doc = ''; // will contain the whole document
var $toc = array(); // will contain the Table of Contents
- private $sectionedits = array(); // A stack of section edit data
+ var $sectionedits = array(); // A stack of section edit data
var $headers = array();
var $footnotes = array();
@@ -109,7 +109,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
// open the footnote and set the anchor and backlink
$this->doc .= '<div class="fn">';
- $this->doc .= '<sup><a href="#fnt__'.$id.'" id="fn__'.$id.'" name="fn__'.$id.'" class="fn_bot">';
+ $this->doc .= '<sup><a href="#fnt__'.$id.'" id="fn__'.$id.'" class="fn_bot">';
$this->doc .= $id.')</a></sup> '.DOKU_LF;
// get any other footnotes that use the same markup
@@ -118,7 +118,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
if (count($alt)) {
foreach ($alt as $ref) {
// set anchor and backlink for the other footnotes
- $this->doc .= ', <sup><a href="#fnt__'.($ref+1).'" id="fn__'.($ref+1).'" name="fn__'.($ref+1).'" class="fn_bot">';
+ $this->doc .= ', <sup><a href="#fnt__'.($ref+1).'" id="fn__'.($ref+1).'" class="fn_bot">';
$this->doc .= ($ref+1).')</a></sup> '.DOKU_LF;
}
}
@@ -181,9 +181,9 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
if ($level <= $conf['maxseclevel']) {
$this->doc .= ' class="' . $this->startSectionEdit($pos, 'section', $text) . '"';
}
- $this->doc .= '><a name="'.$hid.'" id="'.$hid.'">';
+ $this->doc .= ' id="'.$hid.'">';
$this->doc .= $this->_xmlEntities($text);
- $this->doc .= "</a></h$level>".DOKU_LF;
+ $this->doc .= "</h$level>".DOKU_LF;
}
function section_open($level) {
@@ -316,7 +316,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
}
// output the footnote reference and link
- $this->doc .= '<sup><a href="#fn__'.$id.'" name="fnt__'.$id.'" id="fnt__'.$id.'" class="fn_top">'.$id.')</a></sup>';
+ $this->doc .= '<sup><a href="#fn__'.$id.'" id="fnt__'.$id.'" class="fn_top">'.$id.')</a></sup>';
}
function listu_open() {
@@ -358,6 +358,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Execute PHP code if allowed
*
+ * @param string $text PHP code that is either executed or printed
* @param string $wrapper html element to wrap result if $conf['phpok'] is okff
*
* @author Andreas Gohr <andi@splitbrain.org>
@@ -382,6 +383,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Insert HTML if allowed
*
+ * @param string $text html text
* @param string $wrapper html element to wrap result if $conf['htmlok'] is okff
*
* @author Andreas Gohr <andi@splitbrain.org>
@@ -471,8 +473,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$title = $this->_xmlEntities($this->acronyms[$acronym]);
- $this->doc .= '<acronym title="'.$title
- .'">'.$this->_xmlEntities($acronym).'</acronym>';
+ $this->doc .= '<abbr title="'.$title
+ .'">'.$this->_xmlEntities($acronym).'</abbr>';
} else {
$this->doc .= $this->_xmlEntities($acronym);
@@ -483,7 +485,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
if ( array_key_exists($smiley, $this->smileys) ) {
$title = $this->_xmlEntities($this->smileys[$smiley]);
$this->doc .= '<img src="'.DOKU_BASE.'lib/images/smileys/'.$this->smileys[$smiley].
- '" class="middle" alt="'.
+ '" class="icon" alt="'.
$this->_xmlEntities($smiley).'" />';
} else {
$this->doc .= $this->_xmlEntities($smiley);
@@ -549,7 +551,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
global $ID;
$name = $this->_getLinkTitle($name, $hash, $isImage);
$hash = $this->_headerToLink($hash);
- $title = $ID.' &crarr;';
+ $title = $ID.' ↵';
$this->doc .= '<a href="#'.$hash.'" title="'.$title.'" class="wikilink1">';
$this->doc .= $name;
$this->doc .= '</a>';
@@ -566,6 +568,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
function internallink($id, $name = NULL, $search=NULL,$returnonly=false,$linktype='content') {
global $conf;
global $ID;
+ global $INFO;
$params = '';
$parts = explode('?', $id, 2);
@@ -610,7 +613,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$link['pre'] = '';
$link['suf'] = '';
// highlight link to current page
- if ($id == $ID) {
+ if ($id == $INFO['id']) {
$link['pre'] = '<span class="curid">';
$link['suf'] = '</span>';
}
@@ -1066,7 +1069,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
// return the title of the picture
if (!$title) {
// just show the sourcename
- $title = $this->_xmlEntities(basename(noNS($src)));
+ $title = $this->_xmlEntities(utf8_basename(noNS($src)));
}
return $title;
}
@@ -1074,10 +1077,6 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$ret .= '<img src="'.ml($src,array('w'=>$width,'h'=>$height,'cache'=>$cache)).'"';
$ret .= ' class="media'.$align.'"';
- // make left/right alignment for no-CSS view work (feeds)
- if($align == 'right') $ret .= ' align="right"';
- if($align == 'left') $ret .= ' align="left"';
-
if ($title) {
$ret .= ' title="' . $title . '"';
$ret .= ' alt="' . $title .'"';
@@ -1099,7 +1098,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
// return the title of the flash
if (!$title) {
// just show the sourcename
- $title = basename(noNS($src));
+ $title = utf8_basename(noNS($src));
}
return $this->_xmlEntities($title);
}
@@ -1118,7 +1117,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$ret .= $this->_xmlEntities($title);
}else{
// just show the sourcename
- $ret .= $this->_xmlEntities(basename(noNS($src)));
+ $ret .= $this->_xmlEntities(utf8_basename(noNS($src)));
}
return $ret;
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 9384929bf..3dbfc726f 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -92,14 +92,18 @@ function p_wiki_xhtml($id, $rev='', $excuse=true){
* If $excuse is true an explanation is returned if the file
* wasn't found
*
- * @param string wiki page id
- * @param reference populated with page title from heading or page id
+ * @param string $id wiki page id
+ * @param string $title populated with page title from heading or page id
+ * @param string $rev revision string
+ * @param bool $excuse if an excuse shall be renderer when no content is found
+ * @return string xhtml code
* @deprecated
* @author Harry Fuecks <hfuecks@gmail.com>
*/
function p_wiki_xhtml_summary($id, &$title, $rev='', $excuse=true){
$file = wikiFN($id,$rev);
$ret = '';
+ $ins = null;
//ensure $id is in global $ID (needed for parsing)
global $ID;
@@ -206,13 +210,12 @@ function p_cached_output($file, $format='xhtml', $id='') {
* @author Andreas Gohr <andi@splitbrain.org>
*/
function p_cached_instructions($file,$cacheonly=false,$id='') {
- global $conf;
static $run = null;
if(is_null($run)) $run = array();
$cache = new cache_instructions($id, $file);
- if ($cacheonly || $cache->useCache() || isset($run[$file])) {
+ if ($cacheonly || $cache->useCache() || (isset($run[$file]) && !defined('DOKU_UNITTEST'))) {
return $cache->retrieveCache();
} else if (@file_exists($file)) {
// no cache - do some work
@@ -311,15 +314,18 @@ function p_get_metadata($id, $key='', $render=METADATA_RENDER_USING_CACHE){
}
}
if ($do_render) {
- ++$render_count;
- $rendered_pages[$id] = true;
+ if (!defined('DOKU_UNITTEST')) {
+ ++$render_count;
+ $rendered_pages[$id] = true;
+ }
$old_meta = $meta;
$meta = p_render_metadata($id, $meta);
// only update the file when the metadata has been changed
if ($meta == $old_meta || p_save_metadata($id, $meta)) {
// store a timestamp in order to make sure that the cachefile is touched
+ // this timestamp is also stored when the meta data is still the same
$cachefile->storeCache(time());
- } elseif ($meta != $old_meta) {
+ } else {
msg('Unable to save metadata file. Hint: disk full; file permissions; safe_mode setting.',-1);
}
}
@@ -380,9 +386,18 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){
if ($key == 'relation'){
foreach ($value as $subkey => $subvalue){
- $meta['current'][$key][$subkey] = !empty($meta['current'][$key][$subkey]) ? array_merge($meta['current'][$key][$subkey], $subvalue) : $subvalue;
- if ($persistent)
- $meta['persistent'][$key][$subkey] = !empty($meta['persistent'][$key][$subkey]) ? array_merge($meta['persistent'][$key][$subkey], $subvalue) : $subvalue;
+ if(isset($meta['current'][$key][$subkey]) && is_array($meta['current'][$key][$subkey])) {
+ $meta['current'][$key][$subkey] = array_merge($meta['current'][$key][$subkey], (array)$subvalue);
+ } else {
+ $meta['current'][$key][$subkey] = $subvalue;
+ }
+ if($persistent) {
+ if(isset($meta['persistent'][$key][$subkey]) && is_array($meta['persistent'][$key][$subkey])) {
+ $meta['persistent'][$key][$subkey] = array_merge($meta['persistent'][$key][$subkey], (array)$subvalue);
+ } else {
+ $meta['persistent'][$key][$subkey] = $subvalue;
+ }
+ }
}
// be careful with some senisitive arrays of $meta
@@ -390,10 +405,10 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){
// these keys, must have subkeys - a legitimate value must be an array
if (is_array($value)) {
- $meta['current'][$key] = !empty($meta['current'][$key]) ? array_merge($meta['current'][$key],$value) : $value;
+ $meta['current'][$key] = !empty($meta['current'][$key]) ? array_merge((array)$meta['current'][$key],$value) : $value;
if ($persistent) {
- $meta['persistent'][$key] = !empty($meta['persistent'][$key]) ? array_merge($meta['persistent'][$key],$value) : $value;
+ $meta['persistent'][$key] = !empty($meta['persistent'][$key]) ? array_merge((array)$meta['persistent'][$key],$value) : $value;
}
}
@@ -546,7 +561,7 @@ function p_get_parsermodes(){
//reuse old data
static $modes = null;
- if($modes != null){
+ if($modes != null && !defined('DOKU_UNITTEST')){
return $modes;
}
@@ -563,6 +578,7 @@ function p_get_parsermodes(){
global $PARSER_MODES;
$obj = null;
foreach($pluginlist as $p){
+ /** @var DokuWiki_Syntax_Plugin $obj */
if(!$obj =& plugin_load('syntax',$p)) continue; //attempt to load plugin into $obj
$PARSER_MODES[$obj->getType()][] = "plugin_$p"; //register mode type
//add to modes
@@ -661,7 +677,9 @@ function p_render($mode,$instructions,&$info){
// Loop through the instructions
foreach ( $instructions as $instruction ) {
// Execute the callback against the Renderer
- call_user_func_array(array(&$Renderer, $instruction[0]),$instruction[1]);
+ if(method_exists($Renderer, $instruction[0])){
+ call_user_func_array(array(&$Renderer, $instruction[0]), $instruction[1] ? $instruction[1] : array());
+ }
}
//set info array
@@ -673,7 +691,12 @@ function p_render($mode,$instructions,&$info){
return $Renderer->doc;
}
+/**
+ * @param $mode string Mode of the renderer to get
+ * @return null|Doku_Renderer The renderer
+ */
function & p_get_renderer($mode) {
+ /** @var Doku_Plugin_Controller $plugin_controller */
global $conf, $plugin_controller;
$rname = !empty($conf['renderer_'.$mode]) ? $conf['renderer_'.$mode] : $mode;
@@ -701,7 +724,7 @@ function & p_get_renderer($mode) {
$Renderer =& $plugin_controller->load('renderer',$rname);
}
- if(is_null($Renderer)){
+ if(!isset($Renderer) || is_null($Renderer)){
msg("No renderer '$rname' found for mode '$mode'",-1);
return null;
}
@@ -721,6 +744,7 @@ function & p_get_renderer($mode) {
* METADATA_RENDER_USING_CACHE,
* METADATA_RENDER_UNLIMITED
*
+ * @return string|null The first heading
* @author Andreas Gohr <andi@splitbrain.org>
* @author Michael Hamann <michael@content-space.de>
*/
@@ -735,11 +759,12 @@ function p_get_first_heading($id, $render=METADATA_RENDER_USING_SIMPLE_CACHE){
* @param string $language language to provide highlighting
* @param string $wrapper html element to wrap the returned highlighted text
*
+ * @return string xhtml code
* @author Christopher Smith <chris@jalakai.co.uk>
* @author Andreas Gohr <andi@splitbrain.org>
*/
function p_xhtml_cached_geshi($code, $language, $wrapper='pre') {
- global $conf, $config_cascade;
+ global $conf, $config_cascade, $INPUT;
$language = strtolower($language);
// remove any leading or trailing blank lines
@@ -747,7 +772,7 @@ function p_xhtml_cached_geshi($code, $language, $wrapper='pre') {
$cache = getCacheName($language.$code,".code");
$ctime = @filemtime($cache);
- if($ctime && !$_REQUEST['purge'] &&
+ if($ctime && !$INPUT->bool('purge') &&
$ctime > filemtime(DOKU_INC.'inc/geshi.php') && // geshi changed
$ctime > @filemtime(DOKU_INC.'inc/geshi/'.$language.'.php') && // language syntax definition changed
$ctime > filemtime(reset($config_cascade['main']['default']))){ // dokuwiki changed
diff --git a/inc/plugin.php b/inc/plugin.php
index ec94433b6..d2fe3818d 100644
--- a/inc/plugin.php
+++ b/inc/plugin.php
@@ -66,7 +66,7 @@ class DokuWiki_Plugin {
* to try to minimise unnecessary loading of the strings when the plugin doesn't require them
* e.g. when info plugin is querying plugins for information about themselves.
*
- * @param $id id of the string to be retrieved
+ * @param string $id id of the string to be retrieved
* @return string string in appropriate language or english if not available
*/
function getLang($id) {
diff --git a/inc/plugincontroller.class.php b/inc/plugincontroller.class.php
index 734331c94..0b4041a77 100644
--- a/inc/plugincontroller.class.php
+++ b/inc/plugincontroller.class.php
@@ -70,7 +70,6 @@ class Doku_Plugin_Controller {
//we keep all loaded plugins available in global scope for reuse
global $DOKU_PLUGINS;
- global $lang;
list($plugin,$component) = $this->_splitName($name);
@@ -97,7 +96,10 @@ class Doku_Plugin_Controller {
$dir = $this->get_directory($plugin);
$inf = confToHash(DOKU_PLUGIN."$dir/plugin.info.txt");
if($inf['base'] && $inf['base'] != $plugin){
- msg(sprintf($lang['plugin_install_err'],hsc($plugin),hsc($inf['base'])),-1);
+ msg(sprintf("Plugin installed incorrectly. Rename plugin directory '%s' to '%s'.", hsc($plugin), hsc($inf['base'])), -1);
+ } elseif (preg_match('/^'.DOKU_PLUGIN_NAME_REGEX.'$/', $plugin) !== 1) {
+ msg(sprintf("Plugin name '%s' is not a valid plugin name, only the characters a-z and 0-9 are allowed. ".
+ 'Maybe the plugin has been installed in the wrong directory?', hsc($plugin)), -1);
}
return null;
}
@@ -137,6 +139,7 @@ class Doku_Plugin_Controller {
// the plugin was disabled by rc2009-01-26
// disabling mechanism was changed back very soon again
// to keep everything simple we just skip the plugin completely
+ continue;
} elseif (@file_exists(DOKU_PLUGIN.$plugin.'/disabled')) {
// treat this as a default disabled plugin(over-rideable by the plugin manager)
// deprecated 2011-09-10 (usage of disabled files)
@@ -168,7 +171,7 @@ class Doku_Plugin_Controller {
$plugins = array();
foreach($files as $file) {
if(file_exists($file)) {
- @include_once($file);
+ include_once($file);
}
}
return $plugins;
diff --git a/inc/pluginutils.php b/inc/pluginutils.php
index 53cfedf82..7c37d4f7f 100644
--- a/inc/pluginutils.php
+++ b/inc/pluginutils.php
@@ -8,6 +8,8 @@
// plugin related constants
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
+// note that only [a-z0-9]+ is officially supported, this is only to support plugins that don't follow these conventions, too
+if(!defined('DOKU_PLUGIN_NAME_REGEX')) define('DOKU_PLUGIN_NAME_REGEX', '[a-zA-Z0-9\x7f-\xff]+');
/**
* Original plugin functions, remain for backwards compatibility
diff --git a/inc/preload.php.dist b/inc/preload.php.dist
new file mode 100644
index 000000000..7acda0e3d
--- /dev/null
+++ b/inc/preload.php.dist
@@ -0,0 +1,17 @@
+<?php
+/**
+ * This is an example for a farm setup. Simply copy this file to preload.php and
+ * uncomment what you need. See http://www.dokuwiki.org/farms for more information.
+ * You can also use preload.php for other things than farming, e.g. for moving
+ * local configuration files out of the main ./conf directory.
+ */
+
+// set this to your farm directory
+//if(!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', '/var/www/farm');
+
+// include this after DOKU_FARMDIR if you want to use farms
+//include(fullpath(dirname(__FILE__)).'/farm.php');
+
+// you can overwrite the $config_cascade to your liking
+//$config_cascade = array(
+//);
diff --git a/inc/remote.php b/inc/remote.php
new file mode 100644
index 000000000..2ef28afd2
--- /dev/null
+++ b/inc/remote.php
@@ -0,0 +1,253 @@
+<?php
+
+if (!defined('DOKU_INC')) die();
+
+class RemoteException extends Exception {}
+class RemoteAccessDeniedException extends RemoteException {}
+
+/**
+ * This class provides information about remote access to the wiki.
+ *
+ * == Types of methods ==
+ * There are two types of remote methods. The first is the core methods.
+ * These are always available and provided by dokuwiki.
+ * The other is plugin methods. These are provided by remote plugins.
+ *
+ * == Information structure ==
+ * The information about methods will be given in an array with the following structure:
+ * array(
+ * 'method.remoteName' => array(
+ * 'args' => array(
+ * 'type eg. string|int|...|date|file',
+ * )
+ * 'name' => 'method name in class',
+ * 'return' => 'type',
+ * 'public' => 1/0 - method bypass default group check (used by login)
+ * ['doc' = 'method documentation'],
+ * )
+ * )
+ *
+ * plugin names are formed the following:
+ * core methods begin by a 'dokuwiki' or 'wiki' followed by a . and the method name itself.
+ * i.e.: dokuwiki.version or wiki.getPage
+ *
+ * plugin methods are formed like 'plugin.<plugin name>.<method name>'.
+ * i.e.: plugin.clock.getTime or plugin.clock_gmt.getTime
+ *
+ * @throws RemoteException
+ */
+class RemoteAPI {
+
+ /**
+ * @var RemoteAPICore
+ */
+ private $coreMethods = null;
+
+ /**
+ * @var array remote methods provided by dokuwiki plugins - will be filled lazy via
+ * {@see RemoteAPI#getPluginMethods}
+ */
+ private $pluginMethods = null;
+
+ /**
+ * @var array contains custom calls to the api. Plugins can use the XML_CALL_REGISTER event.
+ * The data inside is 'custom.call.something' => array('plugin name', 'remote method name')
+ *
+ * The remote method name is the same as in the remote name returned by _getMethods().
+ */
+ private $pluginCustomCalls = null;
+
+ private $dateTransformation;
+ private $fileTransformation;
+
+ public function __construct() {
+ $this->dateTransformation = array($this, 'dummyTransformation');
+ $this->fileTransformation = array($this, 'dummyTransformation');
+ }
+
+ /**
+ * Get all available methods with remote access.
+ *
+ * @return array with information to all available methods
+ */
+ public function getMethods() {
+ return array_merge($this->getCoreMethods(), $this->getPluginMethods());
+ }
+
+ /**
+ * call a method via remote api.
+ *
+ * @param string $method name of the method to call.
+ * @param array $args arguments to pass to the given method
+ * @return mixed result of method call, must be a primitive type.
+ */
+ public function call($method, $args = array()) {
+ if ($args === null) {
+ $args = array();
+ }
+ list($type, $pluginName, $call) = explode('.', $method, 3);
+ if ($type === 'plugin') {
+ return $this->callPlugin($pluginName, $method, $args);
+ }
+ if ($this->coreMethodExist($method)) {
+ return $this->callCoreMethod($method, $args);
+ }
+ return $this->callCustomCallPlugin($method, $args);
+ }
+
+ private function coreMethodExist($name) {
+ $coreMethods = $this->getCoreMethods();
+ return array_key_exists($name, $coreMethods);
+ }
+
+ private function callCustomCallPlugin($method, $args) {
+ $customCalls = $this->getCustomCallPlugins();
+ if (!array_key_exists($method, $customCalls)) {
+ throw new RemoteException('Method does not exist', -32603);
+ }
+ $customCall = $customCalls[$method];
+ return $this->callPlugin($customCall[0], $customCall[1], $args);
+ }
+
+ private function getCustomCallPlugins() {
+ if ($this->pluginCustomCalls === null) {
+ $data = array();
+ trigger_event('RPC_CALL_ADD', $data);
+ $this->pluginCustomCalls = $data;
+ }
+ return $this->pluginCustomCalls;
+ }
+
+ private function callPlugin($pluginName, $method, $args) {
+ $plugin = plugin_load('remote', $pluginName);
+ $methods = $this->getPluginMethods();
+ if (!$plugin) {
+ throw new RemoteException('Method does not exist', -32603);
+ }
+ $this->checkAccess($methods[$method]);
+ $name = $this->getMethodName($methods, $method);
+ return call_user_func_array(array($plugin, $name), $args);
+ }
+
+ private function callCoreMethod($method, $args) {
+ $coreMethods = $this->getCoreMethods();
+ $this->checkAccess($coreMethods[$method]);
+ if (!isset($coreMethods[$method])) {
+ throw new RemoteException('Method does not exist', -32603);
+ }
+ $this->checkArgumentLength($coreMethods[$method], $args);
+ return call_user_func_array(array($this->coreMethods, $this->getMethodName($coreMethods, $method)), $args);
+ }
+
+ private function checkAccess($methodMeta) {
+ if (!isset($methodMeta['public'])) {
+ $this->forceAccess();
+ } else{
+ if ($methodMeta['public'] == '0') {
+ $this->forceAccess();
+ }
+ }
+ }
+
+ private function checkArgumentLength($method, $args) {
+ if (count($method['args']) < count($args)) {
+ throw new RemoteException('Method does not exist - wrong parameter count.', -32603);
+ }
+ }
+
+ private function getMethodName($methodMeta, $method) {
+ if (isset($methodMeta[$method]['name'])) {
+ return $methodMeta[$method]['name'];
+ }
+ $method = explode('.', $method);
+ return $method[count($method)-1];
+ }
+
+ /**
+ * @return bool true if the current user has access to remote api.
+ */
+ public function hasAccess() {
+ global $conf;
+ global $USERINFO;
+ if (!$conf['remote']) {
+ return false;
+ }
+ if(!$conf['useacl']) {
+ return true;
+ }
+ if(trim($conf['remoteuser']) == '') {
+ return true;
+ }
+
+ return auth_isMember($conf['remoteuser'], $_SERVER['REMOTE_USER'], (array) $USERINFO['grps']);
+ }
+
+ /**
+ * @throws RemoteException On denied access.
+ * @return void
+ */
+ public function forceAccess() {
+ if (!$this->hasAccess()) {
+ throw new RemoteAccessDeniedException('server error. not authorized to call method', -32604);
+ }
+ }
+
+ /**
+ * @return array all plugin methods.
+ */
+ public function getPluginMethods() {
+ if ($this->pluginMethods === null) {
+ $this->pluginMethods = array();
+ $plugins = plugin_list('remote');
+
+ foreach ($plugins as $pluginName) {
+ $plugin = plugin_load('remote', $pluginName);
+ if (!is_subclass_of($plugin, 'DokuWiki_Remote_Plugin')) {
+ throw new RemoteException("Plugin $pluginName does not implement DokuWiki_Remote_Plugin");
+ }
+
+ $methods = $plugin->_getMethods();
+ foreach ($methods as $method => $meta) {
+ $this->pluginMethods["plugin.$pluginName.$method"] = $meta;
+ }
+ }
+ }
+ return $this->pluginMethods;
+ }
+
+ /**
+ * @param RemoteAPICore $apiCore this parameter is used for testing. Here you can pass a non-default RemoteAPICore
+ * instance. (for mocking)
+ * @return array all core methods.
+ */
+ public function getCoreMethods($apiCore = null) {
+ if ($this->coreMethods === null) {
+ if ($apiCore === null) {
+ $this->coreMethods = new RemoteAPICore($this);
+ } else {
+ $this->coreMethods = $apiCore;
+ }
+ }
+ return $this->coreMethods->__getRemoteInfo();
+ }
+
+ public function toFile($data) {
+ return call_user_func($this->fileTransformation, $data);
+ }
+
+ public function toDate($data) {
+ return call_user_func($this->dateTransformation, $data);
+ }
+
+ public function dummyTransformation($data) {
+ return $data;
+ }
+
+ public function setDateTransformation($dateTransformation) {
+ $this->dateTransformation = $dateTransformation;
+ }
+
+ public function setFileTransformation($fileTransformation) {
+ $this->fileTransformation = $fileTransformation;
+ }
+}
diff --git a/inc/search.php b/inc/search.php
index a26ae4808..a02b86b34 100644
--- a/inc/search.php
+++ b/inc/search.php
@@ -171,7 +171,7 @@ function search_media(&$data,$base,$file,$type,$lvl,$opts){
return false;
}
- $info['file'] = basename($file);
+ $info['file'] = utf8_basename($file);
$info['size'] = filesize($base.'/'.$file);
$info['mtime'] = filemtime($base.'/'.$file);
$info['writable'] = is_writable($base.'/'.$file);
@@ -589,7 +589,7 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){
$item['open'] = $return;
if($opts['meta']){
- $item['file'] = basename($file);
+ $item['file'] = utf8_basename($file);
$item['size'] = filesize($base.'/'.$file);
$item['mtime'] = filemtime($base.'/'.$file);
$item['rev'] = $item['mtime'];
diff --git a/inc/subscription.php b/inc/subscription.php
index c94f17ad0..6b201c266 100644
--- a/inc/subscription.php
+++ b/inc/subscription.php
@@ -20,10 +20,11 @@
* Get the name of the metafile tracking subscriptions to target page or
* namespace
*
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
* @param string $id The target page or namespace, specified by id; Namespaces
* are identified by appending a colon.
- *
- * @author Adrian Lang <lang@cosmocode.de>
+ * @return string
*/
function subscription_filename($id) {
$meta_fname = '.mlist';
@@ -39,16 +40,23 @@ function subscription_filename($id) {
/**
* Lock subscription info for an ID
*
+ * @author Adrian Lang <lang@cosmocode.de>
* @param string $id The target page or namespace, specified by id; Namespaces
* are identified by appending a colon.
- *
- * @author Adrian Lang <lang@cosmocode.de>
+ * @return string
*/
function subscription_lock_filename ($id){
global $conf;
return $conf['lockdir'].'/_subscr_' . md5($id) . '.lock';
}
+/**
+ * Creates a lock file for writing subscription data
+ *
+ * @todo add lock time parameter to io_lock() and use this instead
+ * @param $id
+ * @return bool
+ */
function subscription_lock($id) {
global $conf;
$lock = subscription_lock_filename($id);
@@ -70,10 +78,10 @@ function subscription_lock($id) {
/**
* Unlock subscription info for an ID
*
+ * @author Adrian Lang <lang@cosmocode.de>
* @param string $id The target page or namespace, specified by id; Namespaces
* are identified by appending a colon.
- *
- * @author Adrian Lang <lang@cosmocode.de>
+ * @return bool
*/
function subscription_unlock($id) {
$lockf = subscription_lock_filename($id);
@@ -92,6 +100,8 @@ function subscription_unlock($id) {
* returned if a subscription should be deleted but the user is not subscribed
* and the subscription meta file exists.
*
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
* @param string $user The subscriber or unsubscriber
* @param string $page The target object (page or namespace), specified by
* id; Namespaces are identified by a trailing colon.
@@ -99,8 +109,7 @@ function subscription_unlock($id) {
* “every”, “digest”, and “list”.
* @param string $data An optional data blob
* @param bool $overwrite Whether an existing subscription may be overwritten
- *
- * @author Adrian Lang <lang@cosmocode.de>
+ * @return bool
*/
function subscription_set($user, $page, $style, $data = null,
$overwrite = false) {
@@ -123,7 +132,7 @@ function subscription_set($user, $page, $style, $data = null,
// Delete subscription if one exists and $overwrite is true. If $overwrite
// is false, fail.
$subs = subscription_find($page, array('user' => $user));
- if (count($subs) > 0 && array_pop(array_keys($subs)) === $page) {
+ if (count($subs) > 0 && isset($subs[$page])) {
if (!$overwrite) {
msg(sprintf($lang['subscr_already_subscribed'], $user,
prettyprint_id($page)), -1);
@@ -149,12 +158,12 @@ function subscription_set($user, $page, $style, $data = null,
* This function searches all relevant subscription files for a page or
* namespace.
*
- * @param string $page The target object’s (namespace or page) id
- * @param array $pre A hash of predefined values
- *
+ * @author Adrian Lang <lang@cosmocode.de>
* @see function subscription_regex for $pre documentation
*
- * @author Adrian Lang <lang@cosmocode.de>
+ * @param string $page The target object’s (namespace or page) id
+ * @param array $pre A hash of predefined values
+ * @return array
*/
function subscription_find($page, $pre) {
// Construct list of files which may contain relevant subscriptions.
@@ -231,13 +240,15 @@ function get_info_subscribed() {
/**
* Construct a regular expression parsing a subscription definition line
*
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
* @param array $pre A hash of predefined values; “user”, “style”, and
* “data” may be set to limit the results to
* subscriptions matching these parameters. If
* “escaped” is true, these fields are inserted into the
* regular expression without escaping.
*
- * @author Adrian Lang <lang@cosmocode.de>
+ * @return string complete regexp including delimiters
*/
function subscription_regex($pre = array()) {
if (!isset($pre['escaped']) || $pre['escaped'] === false) {
@@ -258,15 +269,18 @@ function subscription_regex($pre = array()) {
*
* This is the default action for COMMON_NOTIFY_ADDRESSLIST.
*
+ * @author Steven Danz <steven-danz@kc.rr.com>
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ * @todo this does NOT return a string but uses a reference to write back, either fix function or docs
* @param array $data Containing $id (the page id), $self (whether the author
* should be notified, $addresslist (current email address
* list)
- *
- * @author Steven Danz <steven-danz@kc.rr.com>
- * @author Adrian Lang <lang@cosmocode.de>
+ * @return string
*/
function subscription_addresslist(&$data){
global $conf;
+ /** @var auth_basic $auth */
global $auth;
$id = $data['id'];
@@ -303,11 +317,11 @@ function subscription_addresslist(&$data){
*
* Sends a digest mail showing a bunch of changes.
*
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
* @param string $subscriber_mail The target mail address
* @param array $id The ID
* @param int $lastupdate Time of the last notification
- *
- * @author Adrian Lang <lang@cosmocode.de>
*/
function subscription_send_digest($subscriber_mail, $id, $lastupdate) {
$n = 0;
@@ -339,11 +353,11 @@ function subscription_send_digest($subscriber_mail, $id, $lastupdate) {
*
* Sends a list mail showing a list of changed pages.
*
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
* @param string $subscriber_mail The target mail address
* @param array $ids Array of ids
* @param string $ns_id The id of the namespace
- *
- * @author Adrian Lang <lang@cosmocode.de>
*/
function subscription_send_list($subscriber_mail, $ids, $ns_id) {
if (count($ids) === 0) return;
@@ -365,6 +379,8 @@ function subscription_send_list($subscriber_mail, $ids, $ns_id) {
/**
* Helper function for sending a mail
*
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
* @param string $subscriber_mail The target mail address
* @param array $replaces Predefined parameters used to parse the
* template
@@ -372,23 +388,27 @@ function subscription_send_list($subscriber_mail, $ids, $ns_id) {
* prefix “mail_”)
* @param string $id The page or namespace id
* @param string $template The name of the mail template
- *
- * @author Adrian Lang <lang@cosmocode.de>
+ * @return bool
*/
function subscription_send($subscriber_mail, $replaces, $subject, $id, $template) {
+ global $lang;
global $conf;
$text = rawLocale($template);
- $replaces = array_merge($replaces, array('TITLE' => $conf['title'],
- 'DOKUWIKIURL' => DOKU_URL,
- 'PAGE' => $id));
+ $trep = array_merge($replaces, array('PAGE' => $id));
+ $hrep = $trep;
+ $hrep['DIFF'] = nl2br(htmlspecialchars($hrep['DIFF']));
- foreach ($replaces as $key => $substitution) {
- $text = str_replace('@'.strtoupper($key).'@', $substitution, $text);
- }
-
- global $lang;
$subject = $lang['mail_' . $subject] . ' ' . $id;
- mail_send('', '['.$conf['title'].'] '. $subject, $text,
- $conf['mailfrom'], '', $subscriber_mail);
+ $mail = new Mailer();
+ $mail->bcc($subscriber_mail);
+ $mail->subject($subject);
+ $mail->setBody($text,$trep,$hrep);
+ $mail->from($conf['mailfromnobody']);
+ $mail->setHeader(
+ 'List-Unsubscribe',
+ '<'.wl($id,array('do'=>'subscribe'),true,'&').'>',
+ false
+ );
+ return $mail->send();
}
diff --git a/inc/template.php b/inc/template.php
index c70e407d6..2dc58b36d 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -9,18 +9,48 @@
if(!defined('DOKU_INC')) die('meh.');
/**
- * Returns the path to the given template, uses
- * default one if the custom version doesn't exist.
+ * Access a template file
+ *
+ * Returns the path to the given file inside the current template, uses
+ * default template if the custom version doesn't exist.
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $file
+ * @return string
*/
-function template($tpl){
+function template($file) {
global $conf;
- if(@is_readable(DOKU_INC.'lib/tpl/'.$conf['template'].'/'.$tpl))
- return DOKU_INC.'lib/tpl/'.$conf['template'].'/'.$tpl;
+ if(@is_readable(DOKU_INC.'lib/tpl/'.$conf['template'].'/'.$file))
+ return DOKU_INC.'lib/tpl/'.$conf['template'].'/'.$file;
+
+ return DOKU_INC.'lib/tpl/dokuwiki/'.$file;
+}
- return DOKU_INC.'lib/tpl/default/'.$tpl;
+/**
+ * Convenience function to access template dir from local FS
+ *
+ * This replaces the deprecated DOKU_TPLINC constant
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @return string
+ */
+function tpl_incdir() {
+ global $conf;
+ return DOKU_INC.'lib/tpl/'.$conf['template'].'/';
+}
+
+/**
+ * Convenience function to access template dir from web
+ *
+ * This replaces the deprecated DOKU_TPL constant
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @return string
+ */
+function tpl_basedir() {
+ global $conf;
+ return DOKU_BASE.'lib/tpl/'.$conf['template'].'/';
}
/**
@@ -34,32 +64,43 @@ function template($tpl){
* handled by this function. ACL stuff is not done here either.
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @triggers TPL_ACT_RENDER
+ * @triggers TPL_CONTENT_DISPLAY
+ * @param bool $prependTOC should the TOC be displayed here?
+ * @return bool true if any output
*/
-function tpl_content($prependTOC=true) {
+function tpl_content($prependTOC = true) {
global $ACT;
global $INFO;
$INFO['prependTOC'] = $prependTOC;
ob_start();
- trigger_event('TPL_ACT_RENDER',$ACT,'tpl_content_core');
+ trigger_event('TPL_ACT_RENDER', $ACT, 'tpl_content_core');
$html_output = ob_get_clean();
- trigger_event('TPL_CONTENT_DISPLAY',$html_output,'ptln');
+ trigger_event('TPL_CONTENT_DISPLAY', $html_output, 'ptln');
return !empty($html_output);
}
-function tpl_content_core(){
+/**
+ * Default Action of TPL_ACT_RENDER
+ *
+ * @return bool
+ */
+function tpl_content_core() {
global $ACT;
global $TEXT;
global $PRE;
global $SUF;
global $SUM;
global $IDX;
+ global $INPUT;
- switch($ACT){
+ switch($ACT) {
case 'show':
html_show();
break;
+ /** @noinspection PhpMissingBreakStatementInspection */
case 'locked':
html_locked();
case 'edit':
@@ -77,20 +118,13 @@ function tpl_content_core(){
html_search();
break;
case 'revisions':
- $first = isset($_REQUEST['first']) ? intval($_REQUEST['first']) : 0;
- html_revisions($first);
+ html_revisions($INPUT->int('first'));
break;
case 'diff':
html_diff();
break;
case 'recent':
- if (is_array($_REQUEST['first'])) {
- $_REQUEST['first'] = array_keys($_REQUEST['first']);
- $_REQUEST['first'] = $_REQUEST['first'][0];
- }
- $first = is_numeric($_REQUEST['first']) ? intval($_REQUEST['first']) : 0;
- $show_changes = $_REQUEST['show_changes'];
- html_recent($first, $show_changes);
+ html_recent($INPUT->extract('first')->int('first'), $INPUT->str('show_changes'));
break;
case 'index':
html_index($IDX); #FIXME can this be pulled from globals? is it sanitized correctly?
@@ -99,8 +133,8 @@ function tpl_content_core(){
html_backlinks();
break;
case 'conflict':
- html_conflict(con($PRE,$TEXT,$SUF),$SUM);
- html_diff(con($PRE,$TEXT,$SUF),false);
+ html_conflict(con($PRE, $TEXT, $SUF), $SUM);
+ html_diff(con($PRE, $TEXT, $SUF), false);
break;
case 'login':
html_login();
@@ -127,9 +161,9 @@ function tpl_content_core(){
tpl_media();
break;
default:
- $evt = new Doku_Event('TPL_ACT_UNKNOWN',$ACT);
- if ($evt->advise_before())
- msg("Failed to handle command: ".hsc($ACT),-1);
+ $evt = new Doku_Event('TPL_ACT_UNKNOWN', $ACT);
+ if($evt->advise_before())
+ msg("Failed to handle command: ".hsc($ACT), -1);
$evt->advise_after();
unset($evt);
return false;
@@ -144,43 +178,47 @@ function tpl_content_core(){
* a false argument
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param bool $return Should the TOC be returned instead to be printed?
+ * @return string
*/
-function tpl_toc($return=false){
+function tpl_toc($return = false) {
global $TOC;
global $ACT;
global $ID;
global $REV;
global $INFO;
global $conf;
+ global $INPUT;
$toc = array();
- if(is_array($TOC)){
+ if(is_array($TOC)) {
// if a TOC was prepared in global scope, always use it
$toc = $TOC;
- }elseif(($ACT == 'show' || substr($ACT,0,6) == 'export') && !$REV && $INFO['exists']){
+ } elseif(($ACT == 'show' || substr($ACT, 0, 6) == 'export') && !$REV && $INFO['exists']) {
// get TOC from metadata, render if neccessary
$meta = p_get_metadata($ID, false, METADATA_RENDER_USING_CACHE);
- if(isset($meta['internal']['toc'])){
+ if(isset($meta['internal']['toc'])) {
$tocok = $meta['internal']['toc'];
- }else{
+ } else {
$tocok = true;
}
- $toc = $meta['description']['tableofcontents'];
- if(!$tocok || !is_array($toc) || !$conf['tocminheads'] || count($toc) < $conf['tocminheads']){
+ $toc = $meta['description']['tableofcontents'];
+ if(!$tocok || !is_array($toc) || !$conf['tocminheads'] || count($toc) < $conf['tocminheads']) {
$toc = array();
}
- }elseif($ACT == 'admin'){
+ } elseif($ACT == 'admin') {
// try to load admin plugin TOC FIXME: duplicates code from tpl_admin
$plugin = null;
- if (!empty($_REQUEST['page'])) {
+ $class = $INPUT->str('page');
+ if(!empty($class)) {
$pluginlist = plugin_list('admin');
- if (in_array($_REQUEST['page'], $pluginlist)) {
+ if(in_array($class, $pluginlist)) {
// attempt to load the plugin
- $plugin =& plugin_load('admin',$_REQUEST['page']);
+ /** @var $plugin DokuWiki_Admin_Plugin */
+ $plugin =& plugin_load('admin', $class);
}
}
- if ( ($plugin !== null) &&
- (!$plugin->forAdminOnly() || $INFO['isadmin']) ){
+ if( ($plugin !== null) && (!$plugin->forAdminOnly() || $INFO['isadmin']) ) {
$toc = $plugin->getTOC();
$TOC = $toc; // avoid later rebuild
}
@@ -190,6 +228,7 @@ function tpl_toc($return=false){
$html = html_TOC($toc);
if($return) return $html;
echo $html;
+ return '';
}
/**
@@ -197,26 +236,28 @@ function tpl_toc($return=false){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_admin(){
+function tpl_admin() {
global $INFO;
global $TOC;
+ global $INPUT;
$plugin = null;
- if (!empty($_REQUEST['page'])) {
+ $class = $INPUT->str('page');
+ if(!empty($class)) {
$pluginlist = plugin_list('admin');
- if (in_array($_REQUEST['page'], $pluginlist)) {
-
+ if(in_array($class, $pluginlist)) {
// attempt to load the plugin
- $plugin =& plugin_load('admin',$_REQUEST['page']);
+ /** @var $plugin DokuWiki_Admin_Plugin */
+ $plugin =& plugin_load('admin', $class);
}
}
- if ($plugin !== null){
+ if($plugin !== null) {
if(!is_array($TOC)) $TOC = $plugin->getTOC(); //if TOC wasn't requested yet
if($INFO['prependTOC']) tpl_toc();
$plugin->html();
- }else{
+ } else {
html_admin();
}
return true;
@@ -227,11 +268,12 @@ function tpl_admin(){
*
* This has to go into the head section of your template.
*
- * @triggers TPL_METAHEADER_OUTPUT
- * @param boolean $alt Should feeds and alternative format links be added?
* @author Andreas Gohr <andi@splitbrain.org>
+ * @triggers TPL_METAHEADER_OUTPUT
+ * @param bool $alt Should feeds and alternative format links be added?
+ * @return bool
*/
-function tpl_metaheaders($alt=true){
+function tpl_metaheaders($alt = true) {
global $ID;
global $REV;
global $INFO;
@@ -240,13 +282,12 @@ function tpl_metaheaders($alt=true){
global $QUERY;
global $lang;
global $conf;
- $it=2;
// prepare the head array
$head = array();
// prepare seed for js and css
- $tseed = 0;
+ $tseed = 0;
$depends = getConfigFiles('main');
foreach($depends as $f) {
$time = @filemtime($f);
@@ -254,103 +295,119 @@ function tpl_metaheaders($alt=true){
}
// the usual stuff
- $head['meta'][] = array( 'name'=>'generator', 'content'=>'DokuWiki');
- $head['link'][] = array( 'rel'=>'search', 'type'=>'application/opensearchdescription+xml',
- 'href'=>DOKU_BASE.'lib/exe/opensearch.php', 'title'=>$conf['title'] );
- $head['link'][] = array( 'rel'=>'start', 'href'=>DOKU_BASE );
- if(actionOK('index')){
- $head['link'][] = array( 'rel'=>'contents', 'href'=> wl($ID,'do=index',false,'&'),
- 'title'=>$lang['btn_index'] );
+ $head['meta'][] = array('name'=> 'generator', 'content'=> 'DokuWiki');
+ $head['link'][] = array(
+ 'rel' => 'search', 'type'=> 'application/opensearchdescription+xml',
+ 'href'=> DOKU_BASE.'lib/exe/opensearch.php', 'title'=> $conf['title']
+ );
+ $head['link'][] = array('rel'=> 'start', 'href'=> DOKU_BASE);
+ if(actionOK('index')) {
+ $head['link'][] = array(
+ 'rel' => 'contents', 'href'=> wl($ID, 'do=index', false, '&'),
+ 'title'=> $lang['btn_index']
+ );
}
- if($alt){
- $head['link'][] = array( 'rel'=>'alternate', 'type'=>'application/rss+xml',
- 'title'=>'Recent Changes', 'href'=>DOKU_BASE.'feed.php');
- $head['link'][] = array( 'rel'=>'alternate', 'type'=>'application/rss+xml',
- 'title'=>'Current Namespace',
- 'href'=>DOKU_BASE.'feed.php?mode=list&ns='.$INFO['namespace']);
- if(($ACT == 'show' || $ACT == 'search') && $INFO['writable']){
- $head['link'][] = array( 'rel'=>'edit',
- 'title'=>$lang['btn_edit'],
- 'href'=> wl($ID,'do=edit',false,'&'));
+ if($alt) {
+ $head['link'][] = array(
+ 'rel' => 'alternate', 'type'=> 'application/rss+xml',
+ 'title'=> 'Recent Changes', 'href'=> DOKU_BASE.'feed.php'
+ );
+ $head['link'][] = array(
+ 'rel' => 'alternate', 'type'=> 'application/rss+xml',
+ 'title'=> 'Current Namespace',
+ 'href' => DOKU_BASE.'feed.php?mode=list&ns='.$INFO['namespace']
+ );
+ if(($ACT == 'show' || $ACT == 'search') && $INFO['writable']) {
+ $head['link'][] = array(
+ 'rel' => 'edit',
+ 'title'=> $lang['btn_edit'],
+ 'href' => wl($ID, 'do=edit', false, '&')
+ );
}
- if($ACT == 'search'){
- $head['link'][] = array( 'rel'=>'alternate', 'type'=>'application/rss+xml',
- 'title'=>'Search Result',
- 'href'=>DOKU_BASE.'feed.php?mode=search&q='.$QUERY);
+ if($ACT == 'search') {
+ $head['link'][] = array(
+ 'rel' => 'alternate', 'type'=> 'application/rss+xml',
+ 'title'=> 'Search Result',
+ 'href' => DOKU_BASE.'feed.php?mode=search&q='.$QUERY
+ );
}
- if(actionOK('export_xhtml')){
- $head['link'][] = array( 'rel'=>'alternate', 'type'=>'text/html', 'title'=>'Plain HTML',
- 'href'=>exportlink($ID, 'xhtml', '', false, '&'));
+ if(actionOK('export_xhtml')) {
+ $head['link'][] = array(
+ 'rel' => 'alternate', 'type'=> 'text/html', 'title'=> 'Plain HTML',
+ 'href'=> exportlink($ID, 'xhtml', '', false, '&')
+ );
}
- if(actionOK('export_raw')){
- $head['link'][] = array( 'rel'=>'alternate', 'type'=>'text/plain', 'title'=>'Wiki Markup',
- 'href'=>exportlink($ID, 'raw', '', false, '&'));
+ if(actionOK('export_raw')) {
+ $head['link'][] = array(
+ 'rel' => 'alternate', 'type'=> 'text/plain', 'title'=> 'Wiki Markup',
+ 'href'=> exportlink($ID, 'raw', '', false, '&')
+ );
}
}
// setup robot tags apropriate for different modes
- if( ($ACT=='show' || $ACT=='export_xhtml') && !$REV){
- if($INFO['exists']){
+ if(($ACT == 'show' || $ACT == 'export_xhtml') && !$REV) {
+ if($INFO['exists']) {
//delay indexing:
- if((time() - $INFO['lastmod']) >= $conf['indexdelay']){
- $head['meta'][] = array( 'name'=>'robots', 'content'=>'index,follow');
- }else{
- $head['meta'][] = array( 'name'=>'robots', 'content'=>'noindex,nofollow');
+ if((time() - $INFO['lastmod']) >= $conf['indexdelay']) {
+ $head['meta'][] = array('name'=> 'robots', 'content'=> 'index,follow');
+ } else {
+ $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,nofollow');
}
- $head['link'][] = array( 'rel'=>'canonical', 'href'=>wl($ID,'',true,'&') );
- }else{
- $head['meta'][] = array( 'name'=>'robots', 'content'=>'noindex,follow');
+ $head['link'][] = array('rel'=> 'canonical', 'href'=> wl($ID, '', true, '&'));
+ } else {
+ $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,follow');
}
- }elseif(defined('DOKU_MEDIADETAIL')){
- $head['meta'][] = array( 'name'=>'robots', 'content'=>'index,follow');
- }else{
- $head['meta'][] = array( 'name'=>'robots', 'content'=>'noindex,nofollow');
+ } elseif(defined('DOKU_MEDIADETAIL')) {
+ $head['meta'][] = array('name'=> 'robots', 'content'=> 'index,follow');
+ } else {
+ $head['meta'][] = array('name'=> 'robots', 'content'=> 'noindex,nofollow');
}
// set metadata
- if($ACT == 'show' || $ACT=='export_xhtml'){
+ if($ACT == 'show' || $ACT == 'export_xhtml') {
// date of modification
- if($REV){
- $head['meta'][] = array( 'name'=>'date', 'content'=>date('Y-m-d\TH:i:sO',$REV));
- }else{
- $head['meta'][] = array( 'name'=>'date', 'content'=>date('Y-m-d\TH:i:sO',$INFO['lastmod']));
+ if($REV) {
+ $head['meta'][] = array('name'=> 'date', 'content'=> date('Y-m-d\TH:i:sO', $REV));
+ } else {
+ $head['meta'][] = array('name'=> 'date', 'content'=> date('Y-m-d\TH:i:sO', $INFO['lastmod']));
}
// keywords (explicit or implicit)
- if(!empty($INFO['meta']['subject'])){
- $head['meta'][] = array( 'name'=>'keywords', 'content'=>join(',',$INFO['meta']['subject']));
- }else{
- $head['meta'][] = array( 'name'=>'keywords', 'content'=>str_replace(':',',',$ID));
+ if(!empty($INFO['meta']['subject'])) {
+ $head['meta'][] = array('name'=> 'keywords', 'content'=> join(',', $INFO['meta']['subject']));
+ } else {
+ $head['meta'][] = array('name'=> 'keywords', 'content'=> str_replace(':', ',', $ID));
}
}
// load stylesheets
- $head['link'][] = array('rel'=>'stylesheet', 'media'=>'screen', 'type'=>'text/css',
- 'href'=>DOKU_BASE.'lib/exe/css.php?t='.$conf['template'].'&tseed='.$tseed);
- $head['link'][] = array('rel'=>'stylesheet', 'media'=>'all', 'type'=>'text/css',
- 'href'=>DOKU_BASE.'lib/exe/css.php?s=all&t='.$conf['template'].'&tseed='.$tseed);
- $head['link'][] = array('rel'=>'stylesheet', 'media'=>'print', 'type'=>'text/css',
- 'href'=>DOKU_BASE.'lib/exe/css.php?s=print&t='.$conf['template'].'&tseed='.$tseed);
+ $head['link'][] = array(
+ 'rel' => 'stylesheet', 'type'=> 'text/css',
+ 'href'=> DOKU_BASE.'lib/exe/css.php?t='.$conf['template'].'&tseed='.$tseed
+ );
// make $INFO and other vars available to JavaScripts
- $json = new JSON();
+ $json = new JSON();
$script = "var NS='".$INFO['namespace']."';";
- if($conf['useacl'] && $_SERVER['REMOTE_USER']){
+ if($conf['useacl'] && $_SERVER['REMOTE_USER']) {
$script .= "var SIG='".toolbar_signature()."';";
}
$script .= 'var JSINFO = '.$json->encode($JSINFO).';';
- $head['script'][] = array( 'type'=>'text/javascript', '_data'=> $script);
+ $head['script'][] = array('type'=> 'text/javascript', '_data'=> $script);
// load external javascript
- $head['script'][] = array( 'type'=>'text/javascript', 'charset'=>'utf-8', '_data'=>'',
- 'src'=>DOKU_BASE.'lib/exe/js.php'.'?tseed='.$tseed);
+ $head['script'][] = array(
+ 'type'=> 'text/javascript', 'charset'=> 'utf-8', '_data'=> '',
+ 'src' => DOKU_BASE.'lib/exe/js.php'.'?tseed='.$tseed
+ );
// trigger event here
- trigger_event('TPL_METAHEADER_OUTPUT',$head,'_tpl_metaheaders_action',true);
+ trigger_event('TPL_METAHEADER_OUTPUT', $head, '_tpl_metaheaders_action', true);
return true;
}
@@ -366,18 +423,18 @@ function tpl_metaheaders($alt=true){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function _tpl_metaheaders_action($data){
- foreach($data as $tag => $inst){
- foreach($inst as $attr){
- echo '<',$tag,' ',buildAttributes($attr);
- if(isset($attr['_data']) || $tag == 'script'){
+function _tpl_metaheaders_action($data) {
+ foreach($data as $tag => $inst) {
+ foreach($inst as $attr) {
+ echo '<', $tag, ' ', buildAttributes($attr);
+ if(isset($attr['_data']) || $tag == 'script') {
if($tag == 'script' && $attr['_data'])
- $attr['_data'] = "<!--//--><![CDATA[//><!--\n".
+ $attr['_data'] = "/*<![CDATA[*/".
$attr['_data'].
- "\n//--><!]]>";
+ "\n/*!]]>*/";
- echo '>',$attr['_data'],'</',$tag,'>';
- }else{
+ echo '>', $attr['_data'], '</', $tag, '>';
+ } else {
echo '/>';
}
echo "\n";
@@ -392,11 +449,11 @@ function _tpl_metaheaders_action($data){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_link($url,$name,$more='',$return=false){
+function tpl_link($url, $name, $more = '', $return = false) {
$out = '<a href="'.$url.'" ';
- if ($more) $out .= ' '.$more;
+ if($more) $out .= ' '.$more;
$out .= ">$name</a>";
- if ($return) return $out;
+ if($return) return $out;
print $out;
return true;
}
@@ -408,8 +465,8 @@ function tpl_link($url,$name,$more='',$return=false){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_pagelink($id,$name=null){
- print html_wikilink($id,$name);
+function tpl_pagelink($id, $name = null) {
+ print html_wikilink($id, $name);
return true;
}
@@ -421,14 +478,13 @@ function tpl_pagelink($id,$name=null){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_getparent($id){
- global $conf;
+function tpl_getparent($id) {
$parent = getNS($id).':';
- resolve_pageid('',$parent,$exists);
+ resolve_pageid('', $parent, $exists);
if($parent == $id) {
- $pos = strrpos (getNS($id),':');
- $parent = substr($parent,0,$pos).':';
- resolve_pageid('',$parent,$exists);
+ $pos = strrpos(getNS($id), ':');
+ $parent = substr($parent, 0, $pos).':';
+ resolve_pageid('', $parent, $exists);
if($parent == $id) return false;
}
return $parent;
@@ -440,21 +496,27 @@ function tpl_getparent($id){
* @author Adrian Lang <mail@adrianlang.de>
* @see tpl_get_action
*/
-function tpl_button($type,$return=false){
+function tpl_button($type, $return = false) {
$data = tpl_get_action($type);
- if ($data === false) {
+ if($data === false) {
return false;
- } elseif (!is_array($data)) {
+ } elseif(!is_array($data)) {
$out = sprintf($data, 'button');
} else {
+ /**
+ * @var string $accesskey
+ * @var string $id
+ * @var string $method
+ * @var array $params
+ */
extract($data);
- if ($id === '#dokuwiki__top') {
+ if($id === '#dokuwiki__top') {
$out = html_topbtn();
} else {
$out = html_btn($type, $id, $accesskey, $params, $method);
}
}
- if ($return) return $out;
+ if($return) return $out;
echo $out;
return true;
}
@@ -465,32 +527,40 @@ function tpl_button($type,$return=false){
* @author Adrian Lang <mail@adrianlang.de>
* @see tpl_get_action
*/
-function tpl_actionlink($type,$pre='',$suf='',$inner='',$return=false){
+function tpl_actionlink($type, $pre = '', $suf = '', $inner = '', $return = false) {
global $lang;
$data = tpl_get_action($type);
- if ($data === false) {
+ if($data === false) {
return false;
- } elseif (!is_array($data)) {
+ } elseif(!is_array($data)) {
$out = sprintf($data, 'link');
} else {
+ /**
+ * @var string $accesskey
+ * @var string $id
+ * @var string $method
+ * @var array $params
+ */
extract($data);
- if (strpos($id, '#') === 0) {
+ if(strpos($id, '#') === 0) {
$linktarget = $id;
} else {
$linktarget = wl($id, $params);
}
- $caption = $lang['btn_' . $type];
- $akey = $addTitle = '';
- if($accesskey){
- $akey = 'accesskey="'.$accesskey.'" ';
+ $caption = $lang['btn_'.$type];
+ $akey = $addTitle = '';
+ if($accesskey) {
+ $akey = 'accesskey="'.$accesskey.'" ';
$addTitle = ' ['.strtoupper($accesskey).']';
}
- $out = tpl_link($linktarget, $pre.(($inner)?$inner:$caption).$suf,
- 'class="action ' . $type . '" ' .
- $akey . 'rel="nofollow" ' .
- 'title="' . hsc($caption).$addTitle . '"', 1);
+ $out = tpl_link(
+ $linktarget, $pre.(($inner) ? $inner : $caption).$suf,
+ 'class="action '.$type.'" '.
+ $akey.'rel="nofollow" '.
+ 'title="'.hsc($caption).$addTitle.'"', 1
+ );
}
- if ($return) return $out;
+ if($return) return $out;
echo $out;
return true;
}
@@ -515,53 +585,53 @@ function tpl_actionlink($type,$pre='',$suf='',$inner='',$return=false){
* @author Andreas Gohr <andi@splitbrain.org>
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
* @author Adrian Lang <mail@adrianlang.de>
+ * @param string $type
+ * @return array|bool|string
*/
function tpl_get_action($type) {
global $ID;
global $INFO;
global $REV;
global $ACT;
- global $conf;
- global $auth;
// check disabled actions and fix the badly named ones
- if($type == 'history') $type='revisions';
+ if($type == 'history') $type = 'revisions';
if(!actionOK($type)) return false;
$accesskey = null;
$id = $ID;
$method = 'get';
$params = array('do' => $type);
- switch($type){
+ switch($type) {
case 'edit':
// most complicated type - we need to decide on current action
- if($ACT == 'show' || $ACT == 'search'){
+ if($ACT == 'show' || $ACT == 'search') {
$method = 'post';
- if($INFO['writable']){
+ if($INFO['writable']) {
$accesskey = 'e';
if(!empty($INFO['draft'])) {
- $type = 'draft';
+ $type = 'draft';
$params['do'] = 'draft';
} else {
$params['rev'] = $REV;
- if(!$INFO['exists']){
- $type = 'create';
+ if(!$INFO['exists']) {
+ $type = 'create';
}
}
- }else{
+ } else {
if(!actionOK('source')) return false; //pseudo action
$params['rev'] = $REV;
- $type = 'source';
- $accesskey = 'v';
+ $type = 'source';
+ $accesskey = 'v';
}
- }else{
- $params = '';
- $type = 'show';
+ } else {
+ $params = array();
+ $type = 'show';
$accesskey = 'v';
}
break;
case 'revisions':
- $type = 'revs';
+ $type = 'revs';
$accesskey = 'o';
break;
case 'recent':
@@ -571,41 +641,41 @@ function tpl_get_action($type) {
$accesskey = 'x';
break;
case 'top':
- $accesskey = 'x';
- $params = '';
- $id = '#dokuwiki__top';
+ $accesskey = 't';
+ $params = array();
+ $id = '#dokuwiki__top';
break;
case 'back':
$parent = tpl_getparent($ID);
- if (!$parent) {
+ if(!$parent) {
return false;
}
- $id = $parent;
- $params = '';
+ $id = $parent;
+ $params = array();
$accesskey = 'b';
break;
case 'login':
$params['sectok'] = getSecurityToken();
- if(isset($_SERVER['REMOTE_USER'])){
- if (!actionOK('logout')) {
+ if(isset($_SERVER['REMOTE_USER'])) {
+ if(!actionOK('logout')) {
return false;
}
$params['do'] = 'logout';
- $type = 'logout';
+ $type = 'logout';
}
break;
case 'register':
- if($_SERVER['REMOTE_USER']){
+ if($_SERVER['REMOTE_USER']) {
return false;
}
break;
case 'resendpwd':
- if($_SERVER['REMOTE_USER']){
+ if($_SERVER['REMOTE_USER']) {
return false;
}
break;
case 'admin':
- if(!$INFO['ismanager']){
+ if(!$INFO['ismanager']) {
return false;
}
break;
@@ -613,21 +683,22 @@ function tpl_get_action($type) {
if(!$INFO['ismanager'] || !$REV || !$INFO['writable']) {
return false;
}
- $params['rev'] = $REV;
+ $params['rev'] = $REV;
$params['sectok'] = getSecurityToken();
break;
+ /** @noinspection PhpMissingBreakStatementInspection */
case 'subscription':
- $type = 'subscribe';
+ $type = 'subscribe';
$params['do'] = 'subscribe';
case 'subscribe':
- if(!$_SERVER['REMOTE_USER']){
+ if(!$_SERVER['REMOTE_USER']) {
return false;
}
break;
case 'backlink':
break;
case 'profile':
- if(!isset($_SERVER['REMOTE_USER'])){
+ if(!isset($_SERVER['REMOTE_USER'])) {
return false;
}
break;
@@ -644,14 +715,25 @@ function tpl_get_action($type) {
* Wrapper around tpl_button() and tpl_actionlink()
*
* @author Anika Henke <anika@selfthinker.org>
+ * @param
+ * @param bool $link link or form button?
+ * @param bool $wrapper HTML element wrapper
+ * @param bool $return return or print
+ * @param string $pre prefix for links
+ * @param string $suf suffix for links
+ * @param string $inner inner HTML for links
+ * @return bool|string
*/
-function tpl_action($type,$link=0,$wrapper=false,$return=false,$pre='',$suf='',$inner='') {
+function tpl_action($type, $link = false, $wrapper = false, $return = false, $pre = '', $suf = '', $inner = '') {
$out = '';
- if ($link) $out .= tpl_actionlink($type,$pre,$suf,$inner,1);
- else $out .= tpl_button($type,1);
- if ($out && $wrapper) $out = "<$wrapper>$out</$wrapper>";
+ if($link) {
+ $out .= tpl_actionlink($type, $pre, $suf, $inner, 1);
+ } else {
+ $out .= tpl_button($type, 1);
+ }
+ if($out && $wrapper) $out = "<$wrapper>$out</$wrapper>";
- if ($return) return $out;
+ if($return) return $out;
print $out;
return $out ? true : false;
}
@@ -667,14 +749,17 @@ function tpl_action($type,$link=0,$wrapper=false,$return=false,$pre='',$suf='',$
* autocompletion feature (MSIE and Firefox)
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param bool $ajax
+ * @param bool $autocomplete
+ * @return bool
*/
-function tpl_searchform($ajax=true,$autocomplete=true){
+function tpl_searchform($ajax = true, $autocomplete = true) {
global $lang;
global $ACT;
global $QUERY;
// don't print the search form if search action has been disabled
- if (!actionOk('search')) return false;
+ if(!actionOk('search')) return false;
print '<form action="'.wl().'" accept-charset="utf-8" class="search" id="dw__search" method="get"><div class="no">';
print '<input type="hidden" name="do" value="search" />';
@@ -692,8 +777,10 @@ function tpl_searchform($ajax=true,$autocomplete=true){
* Print the breadcrumbs trace
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $sep Separator between entries
+ * @return bool
*/
-function tpl_breadcrumbs($sep='&bull;'){
+function tpl_breadcrumbs($sep = '•') {
global $lang;
global $conf;
@@ -704,7 +791,7 @@ function tpl_breadcrumbs($sep='&bull;'){
//reverse crumborder in right-to-left mode, add RLM character to fix heb/eng display mixups
if($lang['direction'] == 'rtl') {
- $crumbs = array_reverse($crumbs,true);
+ $crumbs = array_reverse($crumbs, true);
$crumbs_sep = ' &#8207;<span class="bcsep">'.$sep.'</span>&#8207; ';
} else {
$crumbs_sep = ' <span class="bcsep">'.$sep.'</span> ';
@@ -713,13 +800,13 @@ function tpl_breadcrumbs($sep='&bull;'){
//render crumbs, highlight the last one
print '<span class="bchead">'.$lang['breadcrumb'].':</span>';
$last = count($crumbs);
- $i = 0;
- foreach ($crumbs as $id => $name){
+ $i = 0;
+ foreach($crumbs as $id => $name) {
$i++;
echo $crumbs_sep;
- if ($i == $last) print '<span class="curid">';
- tpl_link(wl($id),hsc($name),'class="breadcrumbs" title="'.$id.'"');
- if ($i == $last) print '</span>';
+ if($i == $last) print '<span class="curid">';
+ tpl_link(wl($id), hsc($name), 'class="breadcrumbs" title="'.$id.'"');
+ if($i == $last) print '</span>';
}
return true;
}
@@ -735,8 +822,10 @@ function tpl_breadcrumbs($sep='&bull;'){
* @author Sean Coates <sean@caedmon.net>
* @author <fredrik@averpil.com>
* @todo May behave strangely in RTL languages
+ * @param string $sep Separator between entries
+ * @return bool
*/
-function tpl_youarehere($sep=' &raquo; '){
+function tpl_youarehere($sep = ' » ') {
global $conf;
global $ID;
global $lang;
@@ -754,10 +843,10 @@ function tpl_youarehere($sep=' &raquo; '){
// print intermediate namespace links
$part = '';
- for($i=0; $i<$count - 1; $i++){
+ for($i = 0; $i < $count - 1; $i++) {
$part .= $parts[$i].':';
$page = $part;
- if ($page == $conf['start']) continue; // Skip startpage
+ if($page == $conf['start']) continue; // Skip startpage
// output
echo $sep;
@@ -765,10 +854,10 @@ function tpl_youarehere($sep=' &raquo; '){
}
// print current page, skipping start page, skipping for namespace index
- resolve_pageid('',$page,$exists);
- if(isset($page) && $page==$part.$parts[$i]) return;
+ resolve_pageid('', $page, $exists);
+ if(isset($page) && $page == $part.$parts[$i]) return true;
$page = $part.$parts[$i];
- if($page == $conf['start']) return;
+ if($page == $conf['start']) return true;
echo $sep;
tpl_pagelink($page);
return true;
@@ -781,11 +870,12 @@ function tpl_youarehere($sep=' &raquo; '){
* Could be enhanced with a profile link in future?
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @return bool
*/
-function tpl_userinfo(){
+function tpl_userinfo() {
global $lang;
global $INFO;
- if(isset($_SERVER['REMOTE_USER'])){
+ if(isset($_SERVER['REMOTE_USER'])) {
print $lang['loggedinas'].': '.hsc($INFO['userinfo']['name']).' ('.hsc($_SERVER['REMOTE_USER']).')';
return true;
}
@@ -796,51 +886,55 @@ function tpl_userinfo(){
* Print some info about the current page
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param bool $ret return content instead of printing it
+ * @return bool|string
*/
-function tpl_pageinfo($ret=false){
+function tpl_pageinfo($ret = false) {
global $conf;
global $lang;
global $INFO;
global $ID;
// return if we are not allowed to view the page
- if (!auth_quickaclcheck($ID)) { return false; }
+ if(!auth_quickaclcheck($ID)) {
+ return false;
+ }
// prepare date and path
$fn = $INFO['filepath'];
- if(!$conf['fullpath']){
- if($INFO['rev']){
- $fn = str_replace(fullpath($conf['olddir']).'/','',$fn);
- }else{
- $fn = str_replace(fullpath($conf['datadir']).'/','',$fn);
+ if(!$conf['fullpath']) {
+ if($INFO['rev']) {
+ $fn = str_replace(fullpath($conf['olddir']).'/', '', $fn);
+ } else {
+ $fn = str_replace(fullpath($conf['datadir']).'/', '', $fn);
}
}
- $fn = utf8_decodeFN($fn);
+ $fn = utf8_decodeFN($fn);
$date = dformat($INFO['lastmod']);
// print it
- if($INFO['exists']){
+ if($INFO['exists']) {
$out = '';
$out .= $fn;
- $out .= ' &middot; ';
+ $out .= ' · ';
$out .= $lang['lastmod'];
$out .= ': ';
$out .= $date;
- if($INFO['editor']){
+ if($INFO['editor']) {
$out .= ' '.$lang['by'].' ';
$out .= editorinfo($INFO['editor']);
- }else{
+ } else {
$out .= ' ('.$lang['external_edit'].')';
}
- if($INFO['locked']){
- $out .= ' &middot; ';
+ if($INFO['locked']) {
+ $out .= ' · ';
$out .= $lang['lockedby'];
$out .= ': ';
$out .= editorinfo($INFO['locked']);
}
- if($ret){
+ if($ret) {
return $out;
- }else{
+ } else {
echo $out;
return true;
}
@@ -855,21 +949,23 @@ function tpl_pageinfo($ret=false){
* the given ID is used.
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $id page id
+ * @param bool $ret return content instead of printing
+ * @return bool|string
*/
-function tpl_pagetitle($id=null, $ret=false){
- global $conf;
- if(is_null($id)){
+function tpl_pagetitle($id = null, $ret = false) {
+ if(is_null($id)) {
global $ID;
$id = $ID;
}
$name = $id;
- if (useHeading('navigation')) {
+ if(useHeading('navigation')) {
$title = p_get_first_heading($id);
- if ($title) $name = $title;
+ if($title) $name = $title;
}
- if ($ret) {
+ if($ret) {
return hsc($name);
} else {
print hsc($name);
@@ -890,8 +986,12 @@ function tpl_pagetitle($id=null, $ret=false){
* Only allowed in: detail.php
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param array $tags tags to try
+ * @param string $alt alternative output if no data was found
+ * @param null $src the image src, uses global $SRC if not given
+ * @return string
*/
-function tpl_img_getTag($tags,$alt='',$src=null){
+function tpl_img_getTag($tags, $alt = '', $src = null) {
// Init Exif Reader
global $SRC;
@@ -910,69 +1010,76 @@ function tpl_img_getTag($tags,$alt='',$src=null){
*
* Only allowed in: detail.php
*
+ * @triggers TPL_IMG_DISPLAY
* @param $maxwidth int - maximal width of the image
* @param $maxheight int - maximal height of the image
* @param $link bool - link to the orginal size?
* @param $params array - additional image attributes
+ * @return mixed Result of TPL_IMG_DISPLAY
*/
-function tpl_img($maxwidth=0,$maxheight=0,$link=true,$params=null){
+function tpl_img($maxwidth = 0, $maxheight = 0, $link = true, $params = null) {
global $IMG;
+ global $INPUT;
$w = tpl_img_getTag('File.Width');
$h = tpl_img_getTag('File.Height');
//resize to given max values
$ratio = 1;
- if($w >= $h){
- if($maxwidth && $w >= $maxwidth){
- $ratio = $maxwidth/$w;
- }elseif($maxheight && $h > $maxheight){
- $ratio = $maxheight/$h;
+ if($w >= $h) {
+ if($maxwidth && $w >= $maxwidth) {
+ $ratio = $maxwidth / $w;
+ } elseif($maxheight && $h > $maxheight) {
+ $ratio = $maxheight / $h;
}
- }else{
- if($maxheight && $h >= $maxheight){
- $ratio = $maxheight/$h;
- }elseif($maxwidth && $w > $maxwidth){
- $ratio = $maxwidth/$w;
+ } else {
+ if($maxheight && $h >= $maxheight) {
+ $ratio = $maxheight / $h;
+ } elseif($maxwidth && $w > $maxwidth) {
+ $ratio = $maxwidth / $w;
}
}
- if($ratio){
- $w = floor($ratio*$w);
- $h = floor($ratio*$h);
+ if($ratio) {
+ $w = floor($ratio * $w);
+ $h = floor($ratio * $h);
}
//prepare URLs
- $url=ml($IMG,array('cache'=>$_REQUEST['cache']),true,'&');
- $src=ml($IMG,array('cache'=>$_REQUEST['cache'],'w'=>$w,'h'=>$h),true,'&');
+ $url = ml($IMG, array('cache'=> $INPUT->str('cache')), true, '&');
+ $src = ml($IMG, array('cache'=> $INPUT->str('cache'), 'w'=> $w, 'h'=> $h), true, '&');
//prepare attributes
- $alt=tpl_img_getTag('Simple.Title');
- if(is_null($params)){
+ $alt = tpl_img_getTag('Simple.Title');
+ if(is_null($params)) {
$p = array();
- }else{
+ } else {
$p = $params;
}
- if($w) $p['width'] = $w;
+ if($w) $p['width'] = $w;
if($h) $p['height'] = $h;
- $p['class'] = 'img_detail';
- if($alt){
+ $p['class'] = 'img_detail';
+ if($alt) {
$p['alt'] = $alt;
$p['title'] = $alt;
- }else{
+ } else {
$p['alt'] = '';
}
$p['src'] = $src;
- $data = array('url'=>($link?$url:null), 'params'=>$p);
- return trigger_event('TPL_IMG_DISPLAY',$data,'_tpl_img_action',true);
+ $data = array('url'=> ($link ? $url : null), 'params'=> $p);
+ return trigger_event('TPL_IMG_DISPLAY', $data, '_tpl_img_action', true);
}
/**
* Default action for TPL_IMG_DISPLAY
+ *
+ * @param array $data
+ * @return bool
*/
-function _tpl_img_action($data, $param=NULL) {
+function _tpl_img_action($data) {
+ global $lang;
$p = buildAttributes($data['params']);
- if($data['url']) print '<a href="'.hsc($data['url']).'">';
+ if($data['url']) print '<a href="'.hsc($data['url']).'" title="'.$lang['mediaview'].'">';
print '<img '.$p.'/>';
if($data['url']) print '</a>';
return true;
@@ -983,40 +1090,42 @@ function _tpl_img_action($data, $param=NULL) {
*
* Should be called somewhere at the very end of the main.php
* template
+ *
+ * @return bool
*/
-function tpl_indexerWebBug(){
+function tpl_indexerWebBug() {
global $ID;
- global $INFO;
- if(!$INFO['exists']) return false;
- $p = array();
+ $p = array();
$p['src'] = DOKU_BASE.'lib/exe/indexer.php?id='.rawurlencode($ID).
'&'.time();
$p['width'] = 2; //no more 1x1 px image because we live in times of ad blockers...
$p['height'] = 1;
$p['alt'] = '';
- $att = buildAttributes($p);
+ $att = buildAttributes($p);
print "<img $att />";
return true;
}
-// configuration methods
/**
* tpl_getConf($id)
*
* use this function to access template configuration variables
+ *
+ * @param string $id
+ * @return string
*/
-function tpl_getConf($id){
+function tpl_getConf($id) {
global $conf;
static $tpl_configloaded = false;
$tpl = $conf['template'];
- if (!$tpl_configloaded){
+ if(!$tpl_configloaded) {
$tconf = tpl_loadConfig();
- if ($tconf !== false){
- foreach ($tconf as $key => $value){
- if (isset($conf['tpl'][$tpl][$key])) continue;
+ if($tconf !== false) {
+ foreach($tconf as $key => $value) {
+ if(isset($conf['tpl'][$tpl][$key])) continue;
$conf['tpl'][$tpl][$key] = $value;
}
$tpl_configloaded = true;
@@ -1028,15 +1137,18 @@ function tpl_getConf($id){
/**
* tpl_loadConfig()
+ *
* reads all template configuration variables
* this function is automatically called by tpl_getConf()
+ *
+ * @return array
*/
-function tpl_loadConfig(){
+function tpl_loadConfig() {
- $file = DOKU_TPLINC.'/conf/default.php';
+ $file = tpl_incdir().'/conf/default.php';
$conf = array();
- if (!@file_exists($file)) return false;
+ if(!@file_exists($file)) return false;
// load default config file
include($file);
@@ -1050,18 +1162,18 @@ function tpl_loadConfig(){
*
* use this function to access template language variables
*/
-function tpl_getLang($id){
+function tpl_getLang($id) {
static $lang = array();
- if (count($lang) === 0){
- $path = DOKU_TPLINC.'lang/';
+ if(count($lang) === 0) {
+ $path = tpl_incdir().'lang/';
$lang = array();
- global $conf; // definitely don't invoke "global $lang"
+ global $conf; // definitely don't invoke "global $lang"
// don't include once
@include($path.'en/lang.php');
- if ($conf['lang'] != 'en') @include($path.$conf['lang'].'/lang.php');
+ if($conf['lang'] != 'en') @include($path.$conf['lang'].'/lang.php');
}
return $lang[$id];
@@ -1080,44 +1192,41 @@ function tpl_getLang($id){
* @param bool $fromajax - set true when calling this function via ajax
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_mediaContent($fromajax=false){
+function tpl_mediaContent($fromajax = false) {
global $IMG;
global $AUTH;
global $INUSE;
global $NS;
global $JUMPTO;
+ global $INPUT;
- if(is_array($_REQUEST['do'])){
- $do = array_shift(array_keys($_REQUEST['do']));
- }else{
- $do = $_REQUEST['do'];
- }
- if(in_array($do,array('save','cancel'))) $do = '';
+ $do = $INPUT->extract('do')->str('do');
+ if(in_array($do, array('save', 'cancel'))) $do = '';
- if(!$do){
- if($_REQUEST['edit']){
+ if(!$do) {
+ if($INPUT->bool('edit')) {
$do = 'metaform';
- }elseif(is_array($INUSE)){
+ } elseif(is_array($INUSE)) {
$do = 'filesinuse';
- }else{
+ } else {
$do = 'filelist';
}
}
// output the content pane, wrapped in an event.
if(!$fromajax) ptln('<div id="media__content">');
- $data = array( 'do' => $do);
- $evt = new Doku_Event('MEDIAMANAGER_CONTENT_OUTPUT', $data);
- if ($evt->advise_before()) {
+ $data = array('do' => $do);
+ $evt = new Doku_Event('MEDIAMANAGER_CONTENT_OUTPUT', $data);
+ if($evt->advise_before()) {
$do = $data['do'];
- if($do == 'filesinuse'){
- media_filesinuse($INUSE,$IMG);
- }elseif($do == 'filelist'){
- media_filelist($NS,$AUTH,$JUMPTO);
- }elseif($do == 'searchlist'){
- media_searchlist($_REQUEST['q'],$NS,$AUTH);
- }else{
- msg('Unknown action '.hsc($do),-1);
+ if($do == 'filesinuse') {
+ media_filesinuse($INUSE, $IMG);
+ } elseif($do == 'filelist') {
+ media_filelist($NS, $AUTH, $JUMPTO);
+ } elseif($do == 'searchlist') {
+ media_searchlist($INPUT->str('q'), $NS, $AUTH);
+ } else {
+ msg('Unknown action '.hsc($do), -1);
}
}
$evt->advise_after();
@@ -1133,37 +1242,38 @@ function tpl_mediaContent($fromajax=false){
*
* @author Kate Arzamastseva <pshns@ukr.net>
*/
-function tpl_mediaFileList(){
+function tpl_mediaFileList() {
global $AUTH;
global $NS;
global $JUMPTO;
global $lang;
+ global $INPUT;
- $opened_tab = $_REQUEST['tab_files'];
- if (!$opened_tab || !in_array($opened_tab, array('files', 'upload', 'search'))) $opened_tab = 'files';
- if ($_REQUEST['mediado'] == 'update') $opened_tab = 'upload';
+ $opened_tab = $INPUT->str('tab_files');
+ if(!$opened_tab || !in_array($opened_tab, array('files', 'upload', 'search'))) $opened_tab = 'files';
+ if($INPUT->str('mediado') == 'update') $opened_tab = 'upload';
- echo '<h2 class="a11y">' . $lang['mediaselect'] . '</h2>'.NL;
+ echo '<h2 class="a11y">'.$lang['mediaselect'].'</h2>'.NL;
media_tabs_files($opened_tab);
echo '<div class="panelHeader">'.NL;
echo '<h3>';
$tabTitle = ($NS) ? $NS : '['.$lang['mediaroot'].']';
- printf($lang['media_' . $opened_tab], '<strong>'.$tabTitle.'</strong>');
+ printf($lang['media_'.$opened_tab], '<strong>'.hsc($tabTitle).'</strong>');
echo '</h3>'.NL;
- if ($opened_tab === 'search' || $opened_tab === 'files') {
+ if($opened_tab === 'search' || $opened_tab === 'files') {
media_tab_files_options();
}
echo '</div>'.NL;
echo '<div class="panelContent">'.NL;
- if ($opened_tab == 'files') {
- media_tab_files($NS,$AUTH,$JUMPTO);
- } elseif ($opened_tab == 'upload') {
- media_tab_upload($NS,$AUTH,$JUMPTO);
- } elseif ($opened_tab == 'search') {
- media_tab_search($NS,$AUTH);
+ if($opened_tab == 'files') {
+ media_tab_files($NS, $AUTH, $JUMPTO);
+ } elseif($opened_tab == 'upload') {
+ media_tab_upload($NS, $AUTH, $JUMPTO);
+ } elseif($opened_tab == 'search') {
+ media_tab_search($NS, $AUTH);
}
echo '</div>'.NL;
}
@@ -1176,54 +1286,55 @@ function tpl_mediaFileList(){
*
* @author Kate Arzamastseva <pshns@ukr.net>
*/
-function tpl_mediaFileDetails($image, $rev){
- global $AUTH, $NS, $conf, $DEL, $lang;
+function tpl_mediaFileDetails($image, $rev) {
+ global $AUTH, $NS, $conf, $DEL, $lang, $INPUT;
$removed = (!file_exists(mediaFN($image)) && file_exists(mediaMetaFN($image, '.changes')) && $conf['mediarevisions']);
- if (!$image || (!file_exists(mediaFN($image)) && !$removed) || $DEL) return '';
- if ($rev && !file_exists(mediaFN($image, $rev))) $rev = false;
- if (isset($NS) && getNS($image) != $NS) return '';
- $do = $_REQUEST['mediado'];
+ if(!$image || (!file_exists(mediaFN($image)) && !$removed) || $DEL) return;
+ if($rev && !file_exists(mediaFN($image, $rev))) $rev = false;
+ if(isset($NS) && getNS($image) != $NS) return;
+ $do = $INPUT->str('mediado');
- $opened_tab = $_REQUEST['tab_details'];
+ $opened_tab = $INPUT->str('tab_details');
$tab_array = array('view');
- list($ext, $mime) = mimetype($image);
- if ($mime == 'image/jpeg') {
+ list(, $mime) = mimetype($image);
+ if($mime == 'image/jpeg') {
$tab_array[] = 'edit';
}
- if ($conf['mediarevisions']) {
+ if($conf['mediarevisions']) {
$tab_array[] = 'history';
}
- if (!$opened_tab || !in_array($opened_tab, $tab_array)) $opened_tab = 'view';
- if ($_REQUEST['edit']) $opened_tab = 'edit';
- if ($do == 'restore') $opened_tab = 'view';
+ if(!$opened_tab || !in_array($opened_tab, $tab_array)) $opened_tab = 'view';
+ if($INPUT->bool('edit')) $opened_tab = 'edit';
+ if($do == 'restore') $opened_tab = 'view';
media_tabs_details($image, $opened_tab);
echo '<div class="panelHeader"><h3>';
- list($ext,$mime,$dl) = mimetype($image,false);
- $class = preg_replace('/[^_\-a-z0-9]+/i','_',$ext);
- $class = 'select mediafile mf_'.$class;
- $tabTitle = '<strong class="'.$class.'">'.$image.'</strong>';
- if ($opened_tab === 'view' && $rev) {
+ list($ext) = mimetype($image, false);
+ $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext);
+ $class = 'select mediafile mf_'.$class;
+ $tabTitle = '<strong><a href="'.ml($image).'" class="'.$class.'" title="'.$lang['mediaview'].'">'.$image.'</a>'.'</strong>';
+ if($opened_tab === 'view' && $rev) {
printf($lang['media_viewold'], $tabTitle, dformat($rev));
} else {
- printf($lang['media_' . $opened_tab], $tabTitle);
+ printf($lang['media_'.$opened_tab], $tabTitle);
}
+
echo '</h3></div>'.NL;
echo '<div class="panelContent">'.NL;
- if ($opened_tab == 'view') {
+ if($opened_tab == 'view') {
media_tab_view($image, $NS, $AUTH, $rev);
- } elseif ($opened_tab == 'edit' && !$removed) {
+ } elseif($opened_tab == 'edit' && !$removed) {
media_tab_edit($image, $NS, $AUTH);
- } elseif ($opened_tab == 'history' && $conf['mediarevisions']) {
- media_tab_history($image,$NS,$AUTH);
+ } elseif($opened_tab == 'history' && $conf['mediarevisions']) {
+ media_tab_history($image, $NS, $AUTH);
}
echo '</div>'.NL;
@@ -1236,14 +1347,13 @@ function tpl_mediaFileDetails($image, $rev){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_mediaTree(){
+function tpl_mediaTree() {
global $NS;
ptln('<div id="media__tree">');
media_nstree($NS);
ptln('</div>');
}
-
/**
* Print a dropdown menu with all DokuWiki actions
*
@@ -1251,61 +1361,65 @@ function tpl_mediaTree(){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_actiondropdown($empty='',$button='&gt;'){
+function tpl_actiondropdown($empty = '', $button = '&gt;') {
global $ID;
- global $INFO;
global $REV;
- global $ACT;
- global $conf;
global $lang;
- global $auth;
- echo '<form action="' . DOKU_SCRIPT . '" method="post" accept-charset="utf-8">';
+ echo '<form action="'.DOKU_SCRIPT.'" method="post" accept-charset="utf-8">';
+ echo '<div class="no">';
echo '<input type="hidden" name="id" value="'.$ID.'" />';
if($REV) echo '<input type="hidden" name="rev" value="'.$REV.'" />';
echo '<input type="hidden" name="sectok" value="'.getSecurityToken().'" />';
- echo '<select name="do" class="edit quickselect">';
+ echo '<select name="do" class="edit quickselect" title="'.$lang['tools'].'">';
echo '<option value="">'.$empty.'</option>';
- echo '<optgroup label=" &mdash; ">';
- $act = tpl_get_action('edit');
- if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+ echo '<optgroup label="'.$lang['page_tools'].'">';
+ $act = tpl_get_action('edit');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+
+ $act = tpl_get_action('revert');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
- $act = tpl_get_action('revisions');
- if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+ $act = tpl_get_action('revisions');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
- $act = tpl_get_action('revert');
- if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+ $act = tpl_get_action('backlink');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
- $act = tpl_get_action('backlink');
- if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+ $act = tpl_get_action('subscribe');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
echo '</optgroup>';
- echo '<optgroup label=" &mdash; ">';
- $act = tpl_get_action('recent');
- if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+ echo '<optgroup label="'.$lang['site_tools'].'">';
+ $act = tpl_get_action('recent');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
- $act = tpl_get_action('index');
- if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+ $act = tpl_get_action('media');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+
+ $act = tpl_get_action('index');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
echo '</optgroup>';
- echo '<optgroup label=" &mdash; ">';
- $act = tpl_get_action('login');
- if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+ echo '<optgroup label="'.$lang['user_tools'].'">';
+ $act = tpl_get_action('login');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
- $act = tpl_get_action('profile');
- if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+ $act = tpl_get_action('register');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
- $act = tpl_get_action('subscribe');
- if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+ $act = tpl_get_action('profile');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
- $act = tpl_get_action('admin');
- if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
+ $act = tpl_get_action('admin');
+ if($act) echo '<option value="'.$act['params']['do'].'">'.$lang['btn_'.$act['type']].'</option>';
echo '</optgroup>';
echo '</select>';
echo '<input type="submit" value="'.$button.'" />';
+ echo '</div>';
echo '</form>';
}
@@ -1313,53 +1427,72 @@ function tpl_actiondropdown($empty='',$button='&gt;'){
* Print a informational line about the used license
*
* @author Andreas Gohr <andi@splitbrain.org>
- * @param string $img - print image? (|button|badge)
- * @param bool $return - when true don't print, but return HTML
+ * @param string $img print image? (|button|badge)
+ * @param bool $imgonly skip the textual description?
+ * @param bool $return when true don't print, but return HTML
+ * @param bool $wrap wrap in div with class="license"?
+ * @return string
*/
-function tpl_license($img='badge',$imgonly=false,$return=false){
+function tpl_license($img = 'badge', $imgonly = false, $return = false, $wrap = true) {
global $license;
global $conf;
global $lang;
if(!$conf['license']) return '';
if(!is_array($license[$conf['license']])) return '';
- $lic = $license[$conf['license']];
+ $lic = $license[$conf['license']];
+ $target = ($conf['target']['extern']) ? ' target="'.$conf['target']['extern'].'"' : '';
- $out = '<div class="license">';
- if($img){
+ $out = '';
+ if($wrap) $out .= '<div class="license">';
+ if($img) {
$src = license_img($img);
- if($src){
- $out .= '<a href="'.$lic['url'].'" rel="license"';
- if($conf['target']['extern']) $out .= ' target="'.$conf['target']['extern'].'"';
- $out .= '><img src="'.DOKU_BASE.$src.'" class="medialeft lic'.$img.'" alt="'.$lic['name'].'" /></a> ';
+ if($src) {
+ $out .= '<a href="'.$lic['url'].'" rel="license"'.$target;
+ $out .= '><img src="'.DOKU_BASE.$src.'" alt="'.$lic['name'].'" /></a>';
+ if(!$imgonly) $out .= ' ';
}
}
if(!$imgonly) {
- $out .= $lang['license'];
- $out .= ' <a href="'.$lic['url'].'" rel="license" class="urlextern"';
- if($conf['target']['extern']) $out .= ' target="'.$conf['target']['extern'].'"';
+ $out .= $lang['license'].' ';
+ $out .= '<a href="'.$lic['url'].'" rel="license" class="urlextern"'.$target;
$out .= '>'.$lic['name'].'</a>';
}
- $out .= '</div>';
+ if($wrap) $out .= '</div>';
if($return) return $out;
echo $out;
+ return '';
}
-
/**
* Includes the rendered XHTML of a given page
*
* This function is useful to populate sidebars or similar features in a
* template
*/
-function tpl_include_page($pageid,$print=true){
+function tpl_include_page($pageid, $print = true) {
global $ID;
- $oldid = $ID;
- $html = p_wiki_xhtml($pageid,'',false);
- $ID = $oldid;
+ global $TOC;
+ $oldid = $ID;
+ $oldtoc = $TOC;
+ $html = p_wiki_xhtml($pageid, '', false);
+ $ID = $oldid;
+ $TOC = $oldtoc;
if(!$print) return $html;
echo $html;
+ return $html;
+}
+
+/**
+ * Include the sidebar, will check current namespaces first
+ */
+function tpl_sidebar($print = true) {
+ global $conf;
+
+ $sidebar = page_findnearest($conf['sidebar']);
+ if($sidebar) return tpl_include_page($sidebar, $print);
+ return '';
}
/**
@@ -1372,18 +1505,18 @@ function tpl_subscribe() {
global $ID;
global $lang;
global $conf;
- $stime_days = $conf['subscribe_time']/60/60/24;
+ $stime_days = $conf['subscribe_time'] / 60 / 60 / 24;
echo p_locale_xhtml('subscr_form');
- echo '<h2>' . $lang['subscr_m_current_header'] . '</h2>';
+ echo '<h2>'.$lang['subscr_m_current_header'].'</h2>';
echo '<div class="level2">';
- if ($INFO['subscribed'] === false) {
- echo '<p>' . $lang['subscr_m_not_subscribed'] . '</p>';
+ if($INFO['subscribed'] === false) {
+ echo '<p>'.$lang['subscr_m_not_subscribed'].'</p>';
} else {
echo '<ul>';
foreach($INFO['subscribed'] as $sub) {
echo '<li><div class="li">';
- if ($sub['target'] !== $ID) {
+ if($sub['target'] !== $ID) {
echo '<code class="ns">'.hsc(prettyprint_id($sub['target'])).'</code>';
} else {
echo '<code class="page">'.hsc(prettyprint_id($sub['target'])).'</code>';
@@ -1392,32 +1525,36 @@ function tpl_subscribe() {
if(!$sstl) $sstl = hsc($sub['style']);
echo ' ('.$sstl.') ';
- echo '<a href="' . wl($ID,
- array('do'=>'subscribe',
- 'sub_target'=>$sub['target'],
- 'sub_style'=>$sub['style'],
- 'sub_action'=>'unsubscribe',
- 'sectok' => getSecurityToken())) .
- '" class="unsubscribe">'.$lang['subscr_m_unsubscribe'] .
- '</a></div></li>';
+ echo '<a href="'.wl(
+ $ID,
+ array(
+ 'do' => 'subscribe',
+ 'sub_target'=> $sub['target'],
+ 'sub_style' => $sub['style'],
+ 'sub_action'=> 'unsubscribe',
+ 'sectok' => getSecurityToken()
+ )
+ ).
+ '" class="unsubscribe">'.$lang['subscr_m_unsubscribe'].
+ '</a></div></li>';
}
echo '</ul>';
}
echo '</div>';
// Add new subscription form
- echo '<h2>' . $lang['subscr_m_new_header'] . '</h2>';
+ echo '<h2>'.$lang['subscr_m_new_header'].'</h2>';
echo '<div class="level2">';
- $ns = getNS($ID).':';
+ $ns = getNS($ID).':';
$targets = array(
- $ID => '<code class="page">'.prettyprint_id($ID).'</code>',
- $ns => '<code class="ns">'.prettyprint_id($ns).'</code>',
- );
- $styles = array(
- 'every' => $lang['subscr_style_every'],
- 'digest' => sprintf($lang['subscr_style_digest'], $stime_days),
- 'list' => sprintf($lang['subscr_style_list'], $stime_days),
- );
+ $ID => '<code class="page">'.prettyprint_id($ID).'</code>',
+ $ns => '<code class="ns">'.prettyprint_id($ns).'</code>',
+ );
+ $styles = array(
+ 'every' => $lang['subscr_style_every'],
+ 'digest' => sprintf($lang['subscr_style_digest'], $stime_days),
+ 'list' => sprintf($lang['subscr_style_list'], $stime_days),
+ );
$form = new Doku_Form(array('id' => 'subscribe__form'));
$form->startFieldset($lang['subscr_m_subscribe']);
@@ -1440,52 +1577,129 @@ function tpl_subscribe() {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_flush(){
+function tpl_flush() {
ob_flush();
flush();
}
+/**
+ * Tries to find a ressource file in the given locations.
+ *
+ * If a given location starts with a colon it is assumed to be a media
+ * file, otherwise it is assumed to be relative to the current template
+ *
+ * @param array $search locations to look at
+ * @param bool $abs if to use absolute URL
+ * @param array &$imginfo filled with getimagesize()
+ * @return string
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function tpl_getMediaFile($search, $abs = false, &$imginfo = null) {
+ $img = '';
+ $file = '';
+ $ismedia = false;
+ // loop through candidates until a match was found:
+ foreach($search as $img) {
+ if(substr($img, 0, 1) == ':') {
+ $file = mediaFN($img);
+ $ismedia = true;
+ } else {
+ $file = tpl_incdir().$img;
+ $ismedia = false;
+ }
+
+ if(file_exists($file)) break;
+ }
+
+ // fetch image data if requested
+ if(!is_null($imginfo)) {
+ $imginfo = getimagesize($file);
+ }
+
+ // build URL
+ if($ismedia) {
+ $url = ml($img, '', true, '', $abs);
+ } else {
+ $url = tpl_basedir().$img;
+ if($abs) $url = DOKU_URL.substr($url, strlen(DOKU_REL));
+ }
+
+ return $url;
+}
/**
- * Returns icon from data/media root directory if it exists, otherwise
- * the one in the template's image directory.
+ * PHP include a file
+ *
+ * either from the conf directory if it exists, otherwise use
+ * file in the template's root directory.
+ *
+ * The function honours config cascade settings and looks for the given
+ * file next to the ´main´ config files, in the order protected, local,
+ * default.
+ *
+ * Note: no escaping or sanity checking is done here. Never pass user input
+ * to this function!
*
- * @param bool $abs - if to use absolute URL
- * @param string $fileName - file name of icon
* @author Anika Henke <anika@selfthinker.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_getFavicon($abs=false, $fileName='favicon.ico') {
- if (file_exists(mediaFN($fileName))) {
- return ml($fileName, '', true, '', $abs);
+function tpl_includeFile($file) {
+ global $config_cascade;
+ foreach(array('protected', 'local', 'default') as $config_group) {
+ if(empty($config_cascade['main'][$config_group])) continue;
+ foreach($config_cascade['main'][$config_group] as $conf_file) {
+ $dir = dirname($conf_file);
+ if(file_exists("$dir/$file")) {
+ include("$dir/$file");
+ return;
+ }
+ }
}
- if($abs) {
- return DOKU_URL.substr(DOKU_TPL.'images/'.$fileName, strlen(DOKU_REL));
+ // still here? try the template dir
+ $file = tpl_incdir().$file;
+ if(file_exists($file)) {
+ include($file);
}
- return DOKU_TPL.'images/'.$fileName;
+}
+
+/**
+ * Returns icon from data/media root directory if it exists, otherwise
+ * the one in the template's image directory.
+ *
+ * @deprecated Use tpl_getMediaFile() instead
+ * @author Anika Henke <anika@selfthinker.org>
+ */
+function tpl_getFavicon($abs = false, $fileName = 'favicon.ico') {
+ $look = array(":wiki:$fileName", ":$fileName", "images/$fileName");
+ return tpl_getMediaFile($look, $abs);
}
/**
* Returns <link> tag for various icon types (favicon|mobile|generic)
*
- * @param array $types - list of icon types to display (favicon|mobile|generic)
* @author Anika Henke <anika@selfthinker.org>
+ * @param array $types - list of icon types to display (favicon|mobile|generic)
+ * @return string
*/
-function tpl_favicon($types=array('favicon')) {
+function tpl_favicon($types = array('favicon')) {
$return = '';
- foreach ($types as $type) {
+ foreach($types as $type) {
switch($type) {
case 'favicon':
- $return .= '<link rel="shortcut icon" href="'.tpl_getFavicon().'" />'.NL;
+ $look = array(':wiki:favicon.ico', ':favicon.ico', 'images/favicon.ico');
+ $return .= '<link rel="shortcut icon" href="'.tpl_getMediaFile($look).'" />'.NL;
break;
case 'mobile':
- $return .= '<link rel="apple-touch-icon" href="'.tpl_getFavicon(false, 'apple-touch-icon.png').'" />'.NL;
+ $look = array(':wiki:apple-touch-icon.png', ':apple-touch-icon.png', 'images/apple-touch-icon.ico');
+ $return .= '<link rel="apple-touch-icon" href="'.tpl_getMediaFile($look).'" />'.NL;
break;
case 'generic':
// ideal world solution, which doesn't work in any browser yet
- $return .= '<link rel="icon" href="'.tpl_getFavicon(false, 'icon.svg').'" type="image/svg+xml" />'.NL;
+ $look = array(':wiki:favicon.svg', ':favicon.svg', 'images/favicon.svg');
+ $return .= '<link rel="icon" href="'.tpl_getMediaFile($look).'" type="image/svg+xml" />'.NL;
break;
}
}
@@ -1499,14 +1713,15 @@ function tpl_favicon($types=array('favicon')) {
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function tpl_media() {
- global $DEL, $NS, $IMG, $AUTH, $JUMPTO, $REV, $lang, $fullscreen, $conf;
+ global $NS, $IMG, $JUMPTO, $REV, $lang, $fullscreen, $INPUT;
$fullscreen = true;
require_once DOKU_INC.'lib/exe/mediamanager.php';
- if ($_REQUEST['image']) $image = cleanID($_REQUEST['image']);
- if (isset($IMG)) $image = $IMG;
- if (isset($JUMPTO)) $image = $JUMPTO;
- if (isset($REV) && !$JUMPTO) $rev = $REV;
+ $rev = '';
+ $image = cleanID($INPUT->str('image'));
+ if(isset($IMG)) $image = $IMG;
+ if(isset($JUMPTO)) $image = $JUMPTO;
+ if(isset($REV) && !$JUMPTO) $rev = $REV;
echo '<div id="mediamanager__page">'.NL;
echo '<h1>'.$lang['btn_media'].'</h1>'.NL;
diff --git a/inc/toolbar.php b/inc/toolbar.php
index 02172510e..b588d4477 100644
--- a/inc/toolbar.php
+++ b/inc/toolbar.php
@@ -243,7 +243,7 @@ function toolbar_signature(){
global $INFO;
$sig = $conf['signature'];
- $sig = strftime($sig);
+ $sig = dformat(null,$sig);
$sig = str_replace('@USER@',$_SERVER['REMOTE_USER'],$sig);
$sig = str_replace('@NAME@',$INFO['userinfo']['name'],$sig);
$sig = str_replace('@MAIL@',$INFO['userinfo']['mail'],$sig);
diff --git a/inc/utf8.php b/inc/utf8.php
index 9d0d17f78..6fab8502c 100644
--- a/inc/utf8.php
+++ b/inc/utf8.php
@@ -78,6 +78,32 @@ if(!function_exists('utf8_check')){
}
}
+if(!function_exists('utf8_basename')){
+ /**
+ * A locale independent basename() implementation
+ *
+ * works around a bug in PHP's basename() implementation
+ *
+ * @see basename()
+ * @link https://bugs.php.net/bug.php?id=37738
+ * @param string $path A path
+ * @param string $suffix If the name component ends in suffix this will also be cut off
+ * @return string
+ */
+ function utf8_basename($path, $suffix=''){
+ $path = trim($path,'\\/');
+ $rpos = max(strrpos($path, '/'), strrpos($path, '\\'));
+ if($rpos) $path = substr($path, $rpos+1);
+
+ $suflen = strlen($suffix);
+ if($suflen && (substr($path, -$suflen) == $suffix)){
+ $path = substr($path, 0, -$suflen);
+ }
+
+ return $path;
+ }
+}
+
if(!function_exists('utf8_strlen')){
/**
* Unicode aware replacement for strlen()
@@ -103,9 +129,9 @@ if(!function_exists('utf8_substr')){
*
* @author Harry Fuecks <hfuecks@gmail.com>
* @author Chris Smith <chris@jalakai.co.uk>
- * @param string
- * @param integer number of UTF-8 characters offset (from left)
- * @param integer (optional) length in UTF-8 characters from offset
+ * @param string $str
+ * @param int $offset number of UTF-8 characters offset (from left)
+ * @param int $length (optional) length in UTF-8 characters from offset
* @return mixed string or false if failure
*/
function utf8_substr($str, $offset, $length = null) {
@@ -221,6 +247,8 @@ if(!function_exists('utf8_ltrim')){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @see ltrim()
+ * @param string $str
+ * @param string $charlist
* @return string
*/
function utf8_ltrim($str,$charlist=''){
@@ -239,6 +267,8 @@ if(!function_exists('utf8_rtrim')){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @see rtrim()
+ * @param string $str
+ * @param string $charlist
* @return string
*/
function utf8_rtrim($str,$charlist=''){
@@ -257,6 +287,8 @@ if(!function_exists('utf8_trim')){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @see trim()
+ * @param string $str
+ * @param string $charlist
* @return string
*/
function utf8_trim($str,$charlist='') {
@@ -348,7 +380,7 @@ if(!function_exists('utf8_ucwords')){
* You don't need to call this yourself
*
* @author Harry Fuecks
- * @param array of matches corresponding to a single word
+ * @param array $matches matches corresponding to a single word
* @return string with first char of the word in uppercase
* @see utf8_ucwords
* @see utf8_strtoupper
@@ -408,9 +440,9 @@ if(!function_exists('utf8_stripspecials')){
* @param string $string The UTF8 string to strip of special chars
* @param string $repl Replace special with this string
* @param string $additional Additional chars to strip (used in regexp char class)
+ * @return string
*/
function utf8_stripspecials($string,$repl='',$additional=''){
- global $UTF8_SPECIAL_CHARS;
global $UTF8_SPECIAL_CHARS2;
static $specials = null;
@@ -493,7 +525,7 @@ if(!function_exists('utf8_unhtml')){
* @author Tom N Harris <tnharris@whoopdedo.org>
* @param string $str UTF-8 encoded string
* @param boolean $entities Flag controlling decoding of named entities.
- * @return UTF-8 encoded string with numeric (and named) entities replaced.
+ * @return string UTF-8 encoded string with numeric (and named) entities replaced.
*/
function utf8_unhtml($str, $entities=null) {
static $decoder = null;
@@ -509,6 +541,12 @@ if(!function_exists('utf8_unhtml')){
}
if(!function_exists('utf8_decode_numeric')){
+ /**
+ * Decodes numeric HTML entities to their correct UTF-8 characters
+ *
+ * @param $ent string A numeric entity
+ * @return string
+ */
function utf8_decode_numeric($ent) {
switch ($ent[2]) {
case 'X':
@@ -524,16 +562,37 @@ if(!function_exists('utf8_decode_numeric')){
}
if(!class_exists('utf8_entity_decoder')){
+ /**
+ * Encapsulate HTML entity decoding tables
+ */
class utf8_entity_decoder {
var $table;
- function utf8_entity_decoder() {
+
+ /**
+ * Initializes the decoding tables
+ */
+ function __construct() {
$table = get_html_translation_table(HTML_ENTITIES);
$table = array_flip($table);
$this->table = array_map(array(&$this,'makeutf8'), $table);
}
+
+ /**
+ * Wrapper aorund unicode_to_utf8()
+ *
+ * @param $c string
+ * @return mixed
+ */
function makeutf8($c) {
return unicode_to_utf8(array(ord($c)));
}
+
+ /**
+ * Decodes any HTML entity to it's correct UTF-8 char equivalent
+ *
+ * @param $ent string An entity
+ * @return string
+ */
function decode($ent) {
if ($ent[1] == '#') {
return utf8_decode_numeric($ent);
@@ -562,8 +621,8 @@ if(!function_exists('utf8_to_unicode')){
*
* @author <hsivonen@iki.fi>
* @author Harry Fuecks <hfuecks@gmail.com>
- * @param string UTF-8 encoded string
- * @param boolean Check for invalid sequences?
+ * @param string $str UTF-8 encoded string
+ * @param boolean $strict Check for invalid sequences?
* @return mixed array of unicode code points or false if UTF-8 invalid
* @see unicode_to_utf8
* @link http://hsivonen.iki.fi/php-utf8/
@@ -735,8 +794,8 @@ if(!function_exists('unicode_to_utf8')){
* output buffering to concatenate the UTF-8 string (faster) as well as
* reference the array by it's keys
*
- * @param array of unicode code points representing a string
- * @param boolean Check for invalid sequences?
+ * @param array $arr of unicode code points representing a string
+ * @param boolean $strict Check for invalid sequences?
* @return mixed UTF-8 string or false if array contains invalid code points
* @author <hsivonen@iki.fi>
* @author Harry Fuecks <hfuecks@gmail.com>
@@ -855,8 +914,8 @@ if(!function_exists('utf8_bad_replace')){
*
* @author Harry Fuecks <hfuecks@gmail.com>
* @see http://www.w3.org/International/questions/qa-forms-utf-8
- * @param string to search
- * @param string to replace bad bytes with (defaults to '?') - use ASCII
+ * @param string $str to search
+ * @param string $replace to replace bad bytes with (defaults to '?') - use ASCII
* @return string
*/
function utf8_bad_replace($str, $replace = '') {
@@ -1000,7 +1059,7 @@ if(!UTF8_MBSTRING){
/**
* UTF-8 Case lookup table
*
- * This lookuptable defines the lower case letters to their correspponding
+ * This lookuptable defines the lower case letters to their corresponding
* upper case letter in UTF-8
*
* @author Andreas Gohr <andi@splitbrain.org>
diff --git a/install.php b/install.php
index 2f600c925..d954e20ed 100644
--- a/install.php
+++ b/install.php
@@ -9,6 +9,8 @@ if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
if(!defined('DOKU_CONF')) define('DOKU_CONF',DOKU_INC.'conf/');
if(!defined('DOKU_LOCAL')) define('DOKU_LOCAL',DOKU_INC.'conf/');
+require_once(DOKU_INC.'inc/PassHash.class.php');
+
// check for error reporting override or set error reporting to sane values
if (!defined('DOKU_E_LEVEL')) { error_reporting(E_ALL ^ E_NOTICE); }
else { error_reporting(DOKU_E_LEVEL); }
@@ -22,13 +24,15 @@ if (get_magic_quotes_gpc() && !defined('MAGIC_QUOTES_STRIPPED')) {
@ini_set('magic_quotes_gpc', 0);
define('MAGIC_QUOTES_STRIPPED',1);
}
-@set_magic_quotes_runtime(0);
+if (function_exists('set_magic_quotes_runtime')) @set_magic_quotes_runtime(0);
@ini_set('magic_quotes_sybase',0);
// language strings
require_once(DOKU_INC.'inc/lang/en/lang.php');
-$LC = preg_replace('/[^a-z\-]+/','',$_REQUEST['l']);
-if(!$LC) $LC = 'en';
+if(isset($_REQUEST['l']) && !is_array($_REQUEST['l'])) {
+ $LC = preg_replace('/[^a-z\-]+/','',$_REQUEST['l']);
+}
+if(empty($LC)) $LC = 'en';
if($LC && $LC != 'en' ) {
require_once(DOKU_INC.'inc/lang/'.$LC.'/lang.php');
}
@@ -49,19 +53,18 @@ $dokuwiki_hash = array(
'2010-11-07' => '7921d48195f4db21b8ead6d9bea801b8',
'2011-05-25' => '4241865472edb6fa14a1227721008072',
'2011-11-10' => 'b46ff19a7587966ac4df61cbab1b8b31',
+ '2012-01-25' => '72c083c73608fc43c586901fd5dabb74',
+ '2012-09-10' => 'eb0b3fc90056fbc12bac6f49f7764df3'
);
-
// begin output
header('Content-Type: text/html; charset=utf-8');
?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $LC?>"
- lang="<?php echo $LC?>" dir="<?php echo $lang['direction']?>">
+<!DOCTYPE html>
+<html lang="<?php echo $LC?>" dir="<?php echo $lang['direction']?>">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta charset="utf-8" />
<title><?php echo $lang['i_installer']?></title>
<style type="text/css">
body { width: 90%; margin: 0 auto; font: 84% Verdana, Helvetica, Arial, sans-serif; }
@@ -73,7 +76,7 @@ header('Content-Type: text/html; charset=utf-8');
select.text, input.text { width: 30em; margin: 0 0.5em; }
a {text-decoration: none}
</style>
- <script type="text/javascript" language="javascript">
+ <script type="text/javascript">
function acltoggle(){
var cb = document.getElementById('acl');
var fs = document.getElementById('acldep');
@@ -93,7 +96,7 @@ header('Content-Type: text/html; charset=utf-8');
</head>
<body style="">
<h1 style="float:left">
- <img src="lib/exe/fetch.php?media=wiki:dokuwiki-128.png&w=64"
+ <img src="lib/exe/fetch.php?media=wiki:dokuwiki-128.png&amp;w=64"
style="vertical-align: middle;" alt="" />
<?php echo $lang['i_installer']?>
</h1>
@@ -127,17 +130,16 @@ header('Content-Type: text/html; charset=utf-8');
}elseif(!check_configs()){
echo '<p>'.$lang['i_modified'].'</p>';
print_errors();
- }elseif($_REQUEST['submit']){
- if(!check_data($_REQUEST['d'])){
- print_errors();
- print_form($_REQUEST['d']);
- }elseif(!store_data($_REQUEST['d'])){
+ }elseif(check_data($_REQUEST['d'])){
+ // check_data has sanitized all input parameters
+ if(!store_data($_REQUEST['d'])){
echo '<p>'.$lang['i_failure'].'</p>';
print_errors();
}else{
echo '<p>'.$lang['i_success'].'</p>';
}
}else{
+ print_errors();
print_form($_REQUEST['d']);
}
?>
@@ -176,7 +178,7 @@ function print_form($d){
<fieldset style="margin-top: 1em;">
<label for="acl">
- <input type="checkbox" name="d[acl]" id="acl" <?php echo(($d['acl'] ? 'checked="checked"' : ''));?> />
+ <input type="checkbox" name="d[acl]" id="acl" <?php echo(($d['acl'] ? ' checked="checked"' : ''));?> />
<?php echo $lang['i_enableacl']?></label>
<fieldset id="acldep">
@@ -209,11 +211,11 @@ function print_form($d){
<p><?php echo $lang['i_license']?></p>
<?php
array_unshift($license,array('name' => 'None', 'url'=>''));
- if(!isset($d['license'])) $d['license'] = 'cc-by-sa';
+ if(empty($d['license'])) $d['license'] = 'cc-by-sa';
foreach($license as $key => $lic){
echo '<label for="lic_'.$key.'">';
echo '<input type="radio" name="d[license]" value="'.htmlspecialchars($key).'" id="lic_'.$key.'"'.
- (($d['license'] == $key)?'checked="checked"':'').'>';
+ (($d['license'] == $key)?' checked="checked"':'').'>';
echo htmlspecialchars($lic['name']);
if($lic['url']) echo ' <a href="'.$lic['url'].'" target="_blank"><sup>[?]</sup></a>';
echo '</label>';
@@ -248,41 +250,65 @@ function print_retry() {
* @author Andreas Gohr
*/
function check_data(&$d){
+ static $form_default = array(
+ 'title' => '',
+ 'acl' => '1',
+ 'superuser' => '',
+ 'fullname' => '',
+ 'email' => '',
+ 'password' => '',
+ 'confirm' => '',
+ 'policy' => '0',
+ 'license' => 'cc-by-sa'
+ );
global $lang;
global $error;
+ if(!is_array($d)) $d = array();
+ foreach($d as $k => $v) {
+ if(is_array($v))
+ unset($d[$k]);
+ else
+ $d[$k] = (string)$v;
+ }
+
//autolowercase the username
- $d['superuser'] = strtolower($d['superuser']);
+ $d['superuser'] = isset($d['superuser']) ? strtolower($d['superuser']) : "";
- $ok = true;
+ $ok = false;
- // check input
- if(empty($d['title'])){
- $error[] = sprintf($lang['i_badval'],$lang['i_wikiname']);
- $ok = false;
- }
- if($d['acl']){
- if(!preg_match('/^[a-z0-9_]+$/',$d['superuser'])){
- $error[] = sprintf($lang['i_badval'],$lang['i_superuser']);
- $ok = false;
- }
- if(empty($d['password'])){
- $error[] = sprintf($lang['i_badval'],$lang['pass']);
- $ok = false;
- }
- if($d['confirm'] != $d['password']){
- $error[] = sprintf($lang['i_badval'],$lang['passchk']);
- $ok = false;
- }
- if(empty($d['fullname']) || strstr($d['fullname'],':')){
- $error[] = sprintf($lang['i_badval'],$lang['fullname']);
+ if(isset($_REQUEST['submit'])) {
+ $ok = true;
+
+ // check input
+ if(empty($d['title'])){
+ $error[] = sprintf($lang['i_badval'],$lang['i_wikiname']);
$ok = false;
}
- if(empty($d['email']) || strstr($d['email'],':') || !strstr($d['email'],'@')){
- $error[] = sprintf($lang['i_badval'],$lang['email']);
- $ok = false;
+ if(isset($d['acl'])){
+ if(!preg_match('/^[a-z0-9_]+$/',$d['superuser'])){
+ $error[] = sprintf($lang['i_badval'],$lang['i_superuser']);
+ $ok = false;
+ }
+ if(empty($d['password'])){
+ $error[] = sprintf($lang['i_badval'],$lang['pass']);
+ $ok = false;
+ }
+ elseif(!isset($d['confirm']) || $d['confirm'] != $d['password']){
+ $error[] = sprintf($lang['i_badval'],$lang['passchk']);
+ $ok = false;
+ }
+ if(empty($d['fullname']) || strstr($d['fullname'],':')){
+ $error[] = sprintf($lang['i_badval'],$lang['fullname']);
+ $ok = false;
+ }
+ if(empty($d['email']) || strstr($d['email'],':') || !strstr($d['email'],'@')){
+ $error[] = sprintf($lang['i_badval'],$lang['email']);
+ $ok = false;
+ }
}
}
+ $d = array_merge($form_default, $d);
return $ok;
}
@@ -317,9 +343,13 @@ EOT;
$ok = $ok && fileWrite(DOKU_LOCAL.'local.php',$output);
if ($d['acl']) {
+ // hash the password
+ $phash = new PassHash();
+ $pass = $phash->hash_smd5($d['password']);
+
// create users.auth.php
- // --- user:MD5password:Real Name:email:groups,comma,seperated
- $output = join(":",array($d['superuser'], md5($d['password']), $d['fullname'], $d['email'], 'admin,user'));
+ // --- user:SMD5password:Real Name:email:groups,comma,seperated
+ $output = join(":",array($d['superuser'], $pass, $d['fullname'], $d['email'], 'admin,user'));
$output = @file_get_contents(DOKU_CONF.'users.auth.php.dist')."\n$output\n";
$ok = $ok && fileWrite(DOKU_LOCAL.'users.auth.php', $output);
@@ -399,7 +429,7 @@ function check_configs(){
// configs shouldn't exist
foreach ($config_files as $file) {
- if (@file_exists($file)) {
+ if (@file_exists($file) && filesize($file)) {
$file = str_replace($_SERVER['DOCUMENT_ROOT'],'{DOCUMENT_ROOT}/', $file);
$error[] = sprintf($lang['i_confexists'],$file);
$ok = false;
@@ -419,16 +449,18 @@ function check_permissions(){
global $lang;
$dirs = array(
- 'conf' => DOKU_LOCAL,
- 'data' => DOKU_INC.'data',
- 'pages' => DOKU_INC.'data/pages',
- 'attic' => DOKU_INC.'data/attic',
- 'media' => DOKU_INC.'data/media',
- 'meta' => DOKU_INC.'data/meta',
- 'cache' => DOKU_INC.'data/cache',
- 'locks' => DOKU_INC.'data/locks',
- 'index' => DOKU_INC.'data/index',
- 'tmp' => DOKU_INC.'data/tmp'
+ 'conf' => DOKU_LOCAL,
+ 'data' => DOKU_INC.'data',
+ 'pages' => DOKU_INC.'data/pages',
+ 'attic' => DOKU_INC.'data/attic',
+ 'media' => DOKU_INC.'data/media',
+ 'media_attic' => DOKU_INC.'data/media_attic',
+ 'media_meta' => DOKU_INC.'data/media_meta',
+ 'meta' => DOKU_INC.'data/meta',
+ 'cache' => DOKU_INC.'data/cache',
+ 'locks' => DOKU_INC.'data/locks',
+ 'index' => DOKU_INC.'data/index',
+ 'tmp' => DOKU_INC.'data/tmp'
);
$ok = true;
@@ -457,13 +489,13 @@ function check_functions(){
$ok = false;
}
- $funcs = explode(' ','addslashes basename call_user_func chmod copy fgets '.
+ $funcs = explode(' ','addslashes call_user_func chmod copy fgets '.
'file file_exists fseek flush filesize ftell fopen '.
'glob header ignore_user_abort ini_get mail mkdir '.
'ob_start opendir parse_ini_file readfile realpath '.
'rename rmdir serialize session_start unlink usleep '.
'preg_replace file_get_contents htmlspecialchars_decode '.
- 'spl_autoload_register');
+ 'spl_autoload_register stream_select fsockopen');
if (!function_exists('mb_substr')) {
$funcs[] = 'utf8_encode';
@@ -521,11 +553,13 @@ function langsel(){
*/
function print_errors(){
global $error;
- echo '<ul>';
- foreach ($error as $err){
- echo "<li>$err</li>";
+ if(!empty($error)) {
+ echo '<ul>';
+ foreach ($error as $err){
+ echo "<li>$err</li>";
+ }
+ echo '</ul>';
}
- echo '</ul>';
}
/**
diff --git a/lib/exe/ajax.php b/lib/exe/ajax.php
index 46d835187..9989269cf 100644
--- a/lib/exe/ajax.php
+++ b/lib/exe/ajax.php
@@ -6,11 +6,6 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-//fix for Opera XMLHttpRequests
-if(!count($_POST) && !empty($HTTP_RAW_POST_DATA)){
- parse_str($HTTP_RAW_POST_DATA, $_POST);
-}
-
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
require_once(DOKU_INC.'inc/init.php');
//close session
@@ -18,12 +13,11 @@ session_write_close();
header('Content-Type: text/html; charset=utf-8');
-
//call the requested function
-if(isset($_POST['call'])){
- $call = $_POST['call'];
-}else if(isset($_GET['call'])){
- $call = $_GET['call'];
+if($INPUT->post->has('call')){
+ $call = $INPUT->post->str('call');
+}else if($INPUT->get->has('call')){
+ $call = $INPUT->get->str('call');
}else{
exit;
}
@@ -49,9 +43,10 @@ if(function_exists($callfn)){
function ajax_qsearch(){
global $conf;
global $lang;
+ global $INPUT;
- $query = $_POST['q'];
- if(empty($query)) $query = $_GET['q'];
+ $query = $INPUT->post->str('q');
+ if(empty($query)) $query = $INPUT->get->str('q');
if(empty($query)) return;
$query = urldecode($query);
@@ -87,9 +82,10 @@ function ajax_qsearch(){
function ajax_suggestions() {
global $conf;
global $lang;
+ global $INPUT;
- $query = cleanID($_POST['q']);
- if(empty($query)) $query = cleanID($_GET['q']);
+ $query = cleanID($INPUT->post->str('q'));
+ if(empty($query)) $query = cleanID($INPUT->get->str('q'));
if(empty($query)) return;
$data = array();
@@ -127,8 +123,9 @@ function ajax_lock(){
global $lang;
global $ID;
global $INFO;
+ global $INPUT;
- $ID = cleanID($_POST['id']);
+ $ID = cleanID($INPUT->post->str('id'));
if(empty($ID)) return;
$INFO = pageinfo();
@@ -143,15 +140,15 @@ function ajax_lock(){
echo 1;
}
- if($conf['usedraft'] && $_POST['wikitext']){
+ if($conf['usedraft'] && $INPUT->post->str('wikitext')){
$client = $_SERVER['REMOTE_USER'];
if(!$client) $client = clientIP(true);
$draft = array('id' => $ID,
- 'prefix' => substr($_POST['prefix'], 0, -1),
- 'text' => $_POST['wikitext'],
- 'suffix' => $_POST['suffix'],
- 'date' => (int) $_POST['date'],
+ 'prefix' => substr($INPUT->post->str('prefix'), 0, -1),
+ 'text' => $INPUT->post->str('wikitext'),
+ 'suffix' => $INPUT->post->str('suffix'),
+ 'date' => $INPUT->post->int('date'),
'client' => $client,
);
$cname = getCacheName($draft['client'].$ID,'.draft');
@@ -168,7 +165,8 @@ function ajax_lock(){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function ajax_draftdel(){
- $id = cleanID($_REQUEST['id']);
+ global $INPUT;
+ $id = cleanID($INPUT->str('id'));
if(empty($id)) return;
$client = $_SERVER['REMOTE_USER'];
@@ -185,9 +183,10 @@ function ajax_draftdel(){
*/
function ajax_medians(){
global $conf;
+ global $INPUT;
// wanted namespace
- $ns = cleanID($_POST['ns']);
+ $ns = cleanID($INPUT->post->str('ns'));
$dir = utf8_encodeFN(str_replace(':','/',$ns));
$lvl = count(explode(':',$ns));
@@ -208,9 +207,10 @@ function ajax_medians(){
function ajax_medialist(){
global $conf;
global $NS;
+ global $INPUT;
- $NS = $_POST['ns'];
- if ($_POST['do'] == 'media') {
+ $NS = cleanID($INPUT->post->str('ns'));
+ if ($INPUT->post->str('do') == 'media') {
tpl_mediaFileList();
} else {
tpl_mediaContent(true);
@@ -224,11 +224,11 @@ function ajax_medialist(){
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function ajax_mediadetails(){
- global $DEL, $NS, $IMG, $AUTH, $JUMPTO, $REV, $lang, $fullscreen, $conf;
+ global $DEL, $NS, $IMG, $AUTH, $JUMPTO, $REV, $lang, $fullscreen, $conf, $INPUT;
$fullscreen = true;
require_once(DOKU_INC.'lib/exe/mediamanager.php');
- if ($_REQUEST['image']) $image = cleanID($_REQUEST['image']);
+ if ($INPUT->has('image')) $image = cleanID($INPUT->str('image'));
if (isset($IMG)) $image = $IMG;
if (isset($JUMPTO)) $image = $JUMPTO;
if (isset($REV) && !$JUMPTO) $rev = $REV;
@@ -243,25 +243,26 @@ function ajax_mediadetails(){
*/
function ajax_mediadiff(){
global $NS;
+ global $INPUT;
- if ($_REQUEST['image']) $image = cleanID($_REQUEST['image']);
- $NS = $_POST['ns'];
- $auth = auth_quickaclcheck("$ns:*");
+ if ($INPUT->has('image')) $image = cleanID($INPUT->str('image'));
+ $NS = $INPUT->post->str('ns');
+ $auth = auth_quickaclcheck("$NS:*");
media_diff($image, $NS, $auth, true);
}
function ajax_mediaupload(){
- global $NS, $MSG;
+ global $NS, $MSG, $INPUT;
if ($_FILES['qqfile']['tmp_name']) {
- $id = ((empty($_POST['mediaid'])) ? $_FILES['qqfile']['name'] : $_POST['mediaid']);
- } elseif (isset($_GET['qqfile'])) {
- $id = $_GET['qqfile'];
+ $id = $INPUT->post->str('mediaid', $_FILES['qqfile']['name']);
+ } elseif ($INPUT->get->has('qqfile')) {
+ $id = $INPUT->get->str('qqfile');
}
$id = cleanID($id);
- $NS = $_REQUEST['ns'];
+ $NS = $INPUT->str('ns');
$ns = $NS.':'.getNS($id);
$AUTH = auth_quickaclcheck("$ns:*");
@@ -270,7 +271,7 @@ function ajax_mediaupload(){
if ($_FILES['qqfile']['error']) unset($_FILES['qqfile']);
if ($_FILES['qqfile']['tmp_name']) $res = media_upload($NS, $AUTH, $_FILES['qqfile']);
- if (isset($_GET['qqfile'])) $res = media_upload_xhr($NS, $AUTH);
+ if ($INPUT->get->has('qqfile')) $res = media_upload_xhr($NS, $AUTH);
if ($res) $result = array('success' => true,
'link' => media_managerURL(array('ns' => $ns, 'image' => $NS.':'.$id), '&'),
@@ -314,9 +315,10 @@ function dir_delete($path) {
*/
function ajax_index(){
global $conf;
+ global $INPUT;
// wanted namespace
- $ns = cleanID($_POST['idx']);
+ $ns = cleanID($INPUT->post->str('idx'));
$dir = utf8_encodeFN(str_replace(':','/',$ns));
$lvl = count(explode(':',$ns));
@@ -337,8 +339,9 @@ function ajax_index(){
function ajax_linkwiz(){
global $conf;
global $lang;
+ global $INPUT;
- $q = ltrim(trim($_POST['q']),':');
+ $q = ltrim(trim($INPUT->post->str('q')),':');
$id = noNS($q);
$ns = getNS($q);
diff --git a/lib/exe/css.php b/lib/exe/css.php
index d54e2e46c..8899ff193 100644
--- a/lib/exe/css.php
+++ b/lib/exe/css.php
@@ -9,6 +9,7 @@
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
if(!defined('NOSESSION')) define('NOSESSION',true); // we do not use a session or authentication here (better caching)
if(!defined('DOKU_DISABLE_GZIP_OUTPUT')) define('DOKU_DISABLE_GZIP_OUTPUT',1); // we gzip ourself here
+if(!defined('NL')) define('NL',"\n");
require_once(DOKU_INC.'inc/init.php');
// Main (don't run when UNIT test)
@@ -29,24 +30,27 @@ function css_out(){
global $conf;
global $lang;
global $config_cascade;
-
- $mediatype = 'screen';
- if (isset($_REQUEST['s']) &&
- in_array($_REQUEST['s'], array('all', 'print', 'feed'))) {
- $mediatype = $_REQUEST['s'];
+ global $INPUT;
+
+ if ($INPUT->str('s') == 'feed') {
+ $mediatypes = array('feed');
+ $type = 'feed';
+ } else {
+ $mediatypes = array('screen', 'all', 'print');
+ $type = '';
}
- $tpl = trim(preg_replace('/[^\w-]+/','',$_REQUEST['t']));
+ $tpl = trim(preg_replace('/[^\w-]+/','',$INPUT->str('t')));
if($tpl){
$tplinc = DOKU_INC.'lib/tpl/'.$tpl.'/';
$tpldir = DOKU_BASE.'lib/tpl/'.$tpl.'/';
}else{
- $tplinc = DOKU_TPLINC;
- $tpldir = DOKU_TPL;
+ $tplinc = tpl_incdir();
+ $tpldir = tpl_basedir();
}
// The generated script depends on some dynamic options
- $cache = new cache('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].DOKU_BASE.$tplinc.$mediatype,'.css');
+ $cache = new cache('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].DOKU_BASE.$tplinc.$type,'.css');
// load template styles
$tplstyles = array();
@@ -57,57 +61,87 @@ function css_out(){
}
}
- // Array of needed files and their web locations, the latter ones
- // are needed to fix relative paths in the stylesheets
- $files = array();
- // load core styles
- $files[DOKU_INC.'lib/styles/'.$mediatype.'.css'] = DOKU_BASE.'lib/styles/';
- // load jQuery-UI theme
- $files[DOKU_INC.'lib/scripts/jquery/jquery-ui-theme/smoothness.css'] = DOKU_BASE.'lib/scripts/jquery/jquery-ui-theme/';
- // load plugin styles
- $files = array_merge($files, css_pluginstyles($mediatype));
- // load template styles
- if (isset($tplstyles[$mediatype])) {
- $files = array_merge($files, $tplstyles[$mediatype]);
- }
// if old 'default' userstyle setting exists, make it 'screen' userstyle for backwards compatibility
if (isset($config_cascade['userstyle']['default'])) {
$config_cascade['userstyle']['screen'] = $config_cascade['userstyle']['default'];
}
- // load user styles
- if(isset($config_cascade['userstyle'][$mediatype])){
- $files[$config_cascade['userstyle'][$mediatype]] = DOKU_BASE;
- }
- // load rtl styles
- // @todo: this currently adds the rtl styles only to the 'screen' media type
- // but 'print' and 'all' should also be supported
- if ($mediatype=='screen') {
- if($lang['direction'] == 'rtl'){
- if (isset($tplstyles['rtl'])) $files = array_merge($files, $tplstyles['rtl']);
- }
- }
- $cache_files = array_merge(array_keys($files), getConfigFiles('main'));
+ // Array of needed files and their web locations, the latter ones
+ // are needed to fix relative paths in the stylesheets
+ $files = array();
+
+ $cache_files = getConfigFiles('main');
$cache_files[] = $tplinc.'style.ini';
$cache_files[] = __FILE__;
+ foreach($mediatypes as $mediatype) {
+ $files[$mediatype] = array();
+ // load core styles
+ $files[$mediatype][DOKU_INC.'lib/styles/'.$mediatype.'.css'] = DOKU_BASE.'lib/styles/';
+ // load jQuery-UI theme
+ if ($mediatype == 'screen') {
+ $files[$mediatype][DOKU_INC.'lib/scripts/jquery/jquery-ui-theme/smoothness.css'] = DOKU_BASE.'lib/scripts/jquery/jquery-ui-theme/';
+ }
+ // load plugin styles
+ $files[$mediatype] = array_merge($files[$mediatype], css_pluginstyles($mediatype));
+ // load template styles
+ if (isset($tplstyles[$mediatype])) {
+ $files[$mediatype] = array_merge($files[$mediatype], $tplstyles[$mediatype]);
+ }
+ // load user styles
+ if(isset($config_cascade['userstyle'][$mediatype])){
+ $files[$mediatype][$config_cascade['userstyle'][$mediatype]] = DOKU_BASE;
+ }
+ // load rtl styles
+ // note: this adds the rtl styles only to the 'screen' media type
+ // @deprecated 2012-04-09: rtl will cease to be a mode of its own,
+ // please use "[dir=rtl]" in any css file in all, screen or print mode instead
+ if ($mediatype=='screen') {
+ if($lang['direction'] == 'rtl'){
+ if (isset($tplstyles['rtl'])) $files[$mediatype] = array_merge($files[$mediatype], $tplstyles['rtl']);
+ if (isset($config_cascade['userstyle']['rtl'])) $files[$mediatype][$config_cascade['userstyle']['rtl']] = DOKU_BASE;
+ }
+ }
+
+ $cache_files = array_merge($cache_files, array_keys($files[$mediatype]));
+ }
+
// check cache age & handle conditional request
// This may exit if a cache can be used
http_cached($cache->cache,
$cache->useCache(array('files' => $cache_files)));
- // start output buffering and build the stylesheet
+ // start output buffering
ob_start();
- // print the default classes for interwiki links and file downloads
- css_interwiki();
- css_filetypes();
+ // build the stylesheet
+ foreach ($mediatypes as $mediatype) {
- // load files
- foreach($files as $file => $location){
- print css_loadfile($file, $location);
- }
+ // print the default classes for interwiki links and file downloads
+ if ($mediatype == 'screen') {
+ css_interwiki();
+ css_filetypes();
+ }
+ // load files
+ $css_content = '';
+ foreach($files[$mediatype] as $file => $location){
+ $css_content .= css_loadfile($file, $location);
+ }
+ switch ($mediatype) {
+ case 'screen':
+ print NL.'@media screen { /* START screen styles */'.NL.$css_content.NL.'} /* /@media END screen styles */'.NL;
+ break;
+ case 'print':
+ print NL.'@media print { /* START print styles */'.NL.$css_content.NL.'} /* /@media END print styles */'.NL;
+ break;
+ case 'all':
+ case 'feed':
+ default:
+ print NL.'/* START rest styles */ '.NL.$css_content.NL.'/* END rest styles */'.NL;
+ break;
+ }
+ }
// end output buffering and get contents
$css = ob_get_contents();
ob_end_clean();
@@ -275,6 +309,8 @@ function css_pluginstyles($mediatype='screen'){
if ($mediatype=='screen') {
$list[DOKU_PLUGIN."$p/style.css"] = DOKU_BASE."lib/plugins/$p/";
}
+ // @deprecated 2012-04-09: rtl will cease to be a mode of its own,
+ // please use "[dir=rtl]" in any css file in all, screen or print mode instead
if($lang['direction'] == 'rtl'){
$list[DOKU_PLUGIN."$p/rtl.css"] = DOKU_BASE."lib/plugins/$p/";
}
diff --git a/lib/exe/detail.php b/lib/exe/detail.php
index 35186f5dd..e597db3a2 100644
--- a/lib/exe/detail.php
+++ b/lib/exe/detail.php
@@ -2,13 +2,14 @@
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
define('DOKU_MEDIADETAIL',1);
require_once(DOKU_INC.'inc/init.php');
+trigger_event('DETAIL_STARTED', $tmp=array());
//close session
session_write_close();
$IMG = getID('media');
-$ID = cleanID($_REQUEST['id']);
+$ID = cleanID($INPUT->str('id'));
-if($conf['allowdebug'] && $_REQUEST['debug']){
+if($conf['allowdebug'] && $INPUT->has('debug')){
print '<pre>';
foreach(explode(' ','basedir userewrite baseurl useslash') as $x){
print '$'."conf['$x'] = '".$conf[$x]."';\n";
diff --git a/lib/exe/fetch.php b/lib/exe/fetch.php
index 143d40f22..e8f189256 100644
--- a/lib/exe/fetch.php
+++ b/lib/exe/fetch.php
@@ -17,10 +17,10 @@
//get input
$MEDIA = stripctl(getID('media',false)); // no cleaning except control chars - maybe external
- $CACHE = calc_cache($_REQUEST['cache']);
- $WIDTH = (int) $_REQUEST['w'];
- $HEIGHT = (int) $_REQUEST['h'];
- $REV = (int) @$_REQUEST['rev'];
+ $CACHE = calc_cache($INPUT->str('cache'));
+ $WIDTH = $INPUT->int('w');
+ $HEIGHT = $INPUT->int('h');
+ $REV = &$INPUT->ref('rev');
//sanitize revision
$REV = preg_replace('/[^0-9]/','',$REV);
@@ -122,9 +122,9 @@ function sendFile($file,$mime,$dl,$cache){
//download or display?
if($dl){
- header('Content-Disposition: attachment; filename="'.basename($file).'";');
+ header('Content-Disposition: attachment; filename="'.utf8_basename($file).'";');
}else{
- header('Content-Disposition: inline; filename="'.basename($file).'";');
+ header('Content-Disposition: inline; filename="'.utf8_basename($file).'";');
}
//use x-sendfile header to pass the delivery to compatible webservers
@@ -152,12 +152,12 @@ function sendFile($file,$mime,$dl,$cache){
* @returns array(STATUS, STATUSMESSAGE)
*/
function checkFileStatus(&$media, &$file, $rev='') {
- global $MIME, $EXT, $CACHE;
+ global $MIME, $EXT, $CACHE, $INPUT;
//media to local file
if(preg_match('#^(https?)://#i',$media)){
//check hash
- if(substr(md5(auth_cookiesalt().$media),0,6) != $_REQUEST['hash']){
+ if(substr(md5(auth_cookiesalt().$media),0,6) != $INPUT->str('hash')){
return array( 412, 'Precondition Failed');
}
//handle external images
diff --git a/lib/exe/index.html b/lib/exe/index.html
index d614603ac..977f90e10 100644
--- a/lib/exe/index.html
+++ b/lib/exe/index.html
@@ -1,6 +1,5 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
+<!DOCTYPE html>
+<html>
<head>
<meta http-equiv="refresh" content="0; URL=../../" />
<meta name="robots" content="noindex" />
diff --git a/lib/exe/indexer.php b/lib/exe/indexer.php
index 95e2af05b..1ccede923 100644
--- a/lib/exe/indexer.php
+++ b/lib/exe/indexer.php
@@ -20,10 +20,10 @@ if(!$defer){
sendGIF(); // send gif
}
-$ID = cleanID($_REQUEST['id']);
+$ID = cleanID($INPUT->str('id'));
// Catch any possible output (e.g. errors)
-$output = isset($_REQUEST['debug']) && $conf['allowdebug'];
+$output = $INPUT->has('debug') && $conf['allowdebug'];
if(!$output) ob_start();
// run one of the jobs
@@ -55,6 +55,8 @@ exit;
function runTrimRecentChanges($media_changes = false) {
global $conf;
+ echo "runTrimRecentChanges($media_changes): started".NL;
+
$fn = ($media_changes ? $conf['media_changelog'] : $conf['changelog']);
// Trim the Recent Changes
@@ -70,6 +72,7 @@ function runTrimRecentChanges($media_changes = false) {
if (count($lines)<=$conf['recent']) {
// nothing to trim
io_unlock($fn);
+ echo "runTrimRecentChanges($media_changes): finished".NL;
return false;
}
@@ -91,6 +94,7 @@ function runTrimRecentChanges($media_changes = false) {
// nothing to trim
@unlink($fn.'_tmp');
io_unlock($fn);
+ echo "runTrimRecentChanges($media_changes): finished".NL;
return false;
}
@@ -114,10 +118,12 @@ function runTrimRecentChanges($media_changes = false) {
} else {
io_unlock($fn);
}
+ echo "runTrimRecentChanges($media_changes): finished".NL;
return true;
}
// nothing done
+ echo "runTrimRecentChanges($media_changes): finished".NL;
return false;
}
@@ -160,14 +166,16 @@ function runSitemapper(){
* @author Adrian Lang <lang@cosmocode.de>
*/
function sendDigest() {
- echo 'sendDigest(): start'.NL;
+ echo 'sendDigest(): started'.NL;
global $ID;
global $conf;
if (!$conf['subscribers']) {
- return;
+ echo 'sendDigest(): disabled'.NL;
+ return false;
}
$subscriptions = subscription_find($ID, array('style' => '(digest|list)',
'escaped' => true));
+ /** @var auth_basic $auth */
global $auth;
global $lang;
global $conf;
@@ -243,6 +251,8 @@ function sendDigest() {
// restore current user info
$USERINFO = $olduinfo;
$_SERVER['REMOTE_USER'] = $olduser;
+ echo 'sendDigest(): finished'.NL;
+ return true;
}
/**
@@ -252,7 +262,8 @@ function sendDigest() {
* @author Harry Fuecks <fuecks@gmail.com>
*/
function sendGIF(){
- if(isset($_REQUEST['debug'])){
+ global $INPUT;
+ if($INPUT->has('debug')){
header('Content-Type: text/plain');
return;
}
diff --git a/lib/exe/js.php b/lib/exe/js.php
index b7f2fd222..42979eeed 100644
--- a/lib/exe/js.php
+++ b/lib/exe/js.php
@@ -32,8 +32,8 @@ function js_out(){
global $config_cascade;
// The generated script depends on some dynamic options
- $cache = new cache('scripts'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],
- '.js');
+ $cache = new cache('scripts'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.js');
+ $cache->_event = 'JS_CACHE_USE';
// load minified version for some files
$min = $conf['compress'] ? '.min' : '';
@@ -65,7 +65,7 @@ function js_out(){
# disabled for FS#1958 DOKU_INC.'lib/scripts/hotkeys.js',
DOKU_INC.'lib/scripts/behaviour.js',
DOKU_INC.'lib/scripts/page.js',
- DOKU_TPLINC.'script.js',
+ tpl_incdir().'script.js',
);
// add possible plugin scripts and userscript
@@ -79,15 +79,15 @@ function js_out(){
// check cache age & handle conditional request
// This may exit if a cache can be used
- http_cached($cache->cache,
- $cache->useCache(array('files' => $cache_files)));
+ $cache_ok = $cache->useCache(array('files' => $cache_files));
+ http_cached($cache->cache, $cache_ok);
// start output buffering and build the script
ob_start();
// add some global variables
print "var DOKU_BASE = '".DOKU_BASE."';";
- print "var DOKU_TPL = '".DOKU_TPL."';";
+ print "var DOKU_TPL = '".tpl_basedir()."';";
// FIXME: Move those to JSINFO
print "var DOKU_UHN = ".((int) useHeading('navigation')).";";
print "var DOKU_UHC = ".((int) useHeading('content')).";";
@@ -102,8 +102,12 @@ function js_out(){
// load files
foreach($files as $file){
+ $ismin = (substr($file,-7) == '.min.js');
+
echo "\n\n/* XXXXXXXXXX begin of ".str_replace(DOKU_INC, '', $file) ." XXXXXXXXXX */\n\n";
+ if($ismin) echo "\n/* BEGIN NOCOMPRESS */\n";
js_load($file);
+ if($ismin) echo "\n/* END NOCOMPRESS */\n";
echo "\n\n/* XXXXXXXXXX end of " . str_replace(DOKU_INC, '', $file) . " XXXXXXXXXX */\n\n";
}
@@ -143,7 +147,7 @@ function js_load($file){
// is it a include_once?
if($match[1]){
- $base = basename($ifile);
+ $base = utf8_basename($ifile);
if($loaded[$base]) continue;
$loaded[$base] = true;
}
@@ -262,7 +266,18 @@ function js_compress($s){
if($ch == '/' && $s{$i+1} == '*' && $s{$i+2} != '@'){
$endC = strpos($s,'*/',$i+2);
if($endC === false) trigger_error('Found invalid /*..*/ comment', E_USER_ERROR);
- $i = $endC + 2;
+
+ // check if this is a NOCOMPRESS comment
+ if(substr($s, $i, $endC+2-$i) == '/* BEGIN NOCOMPRESS */'){
+ $endNC = strpos($s, '/* END NOCOMPRESS */', $endC+2);
+ if($endNC === false) trigger_error('Found invalid NOCOMPRESS comment', E_USER_ERROR);
+
+ // verbatim copy contents, trimming but putting it on its own line
+ $result .= "\n".trim(substr($s, $i + 22, $endNC - ($i + 22)))."\n"; // BEGIN comment = 22 chars
+ $i = $endNC + 20; // END comment = 20 chars
+ }else{
+ $i = $endC + 2;
+ }
continue;
}
@@ -286,10 +301,8 @@ function js_compress($s){
// now move forward and find the end of it
$j = 1;
while($s{$i+$j} != '/'){
- while( ($s{$i+$j} != '\\') && ($s{$i+$j} != '/')){
- $j = $j + 1;
- }
if($s{$i+$j} == '\\') $j = $j + 2;
+ else $j++;
}
$result .= substr($s,$i,$j+1);
$i = $i + $j + 1;
@@ -307,7 +320,10 @@ function js_compress($s){
$j += 1;
}
}
- $result .= substr($s,$i,$j+1);
+ $string = substr($s,$i,$j+1);
+ // remove multiline markers:
+ $string = str_replace("\\\n",'',$string);
+ $result .= $string;
$i = $i + $j + 1;
continue;
}
@@ -322,7 +338,10 @@ function js_compress($s){
$j += 1;
}
}
- $result .= substr($s,$i,$j+1);
+ $string = substr($s,$i,$j+1);
+ // remove multiline markers:
+ $string = str_replace("\\\n",'',$string);
+ $result .= $string;
$i = $i + $j + 1;
continue;
}
diff --git a/lib/exe/mediamanager.php b/lib/exe/mediamanager.php
index 5f09fe1f8..04dd178cc 100644
--- a/lib/exe/mediamanager.php
+++ b/lib/exe/mediamanager.php
@@ -10,25 +10,25 @@
trigger_event('MEDIAMANAGER_STARTED',$tmp=array());
session_write_close(); //close session
+ global $INPUT;
// handle passed message
- if($_REQUEST['msg1']) msg(hsc($_REQUEST['msg1']),1);
- if($_REQUEST['err']) msg(hsc($_REQUEST['err']),-1);
+ if($INPUT->str('msg1')) msg(hsc($INPUT->str('msg1')),1);
+ if($INPUT->str('err')) msg(hsc($INPUT->str('err')),-1);
// get namespace to display (either direct or from deletion order)
- if($_REQUEST['delete']){
- $DEL = cleanID($_REQUEST['delete']);
+ if($INPUT->str('delete')){
+ $DEL = cleanID($INPUT->str('delete'));
$IMG = $DEL;
$NS = getNS($DEL);
- }elseif($_REQUEST['edit']){
- $IMG = cleanID($_REQUEST['edit']);
+ }elseif($INPUT->str('edit')){
+ $IMG = cleanID($INPUT->str('edit'));
$NS = getNS($IMG);
- }elseif($_REQUEST['img']){
- $IMG = cleanID($_REQUEST['img']);
+ }elseif($INPUT->str('img')){
+ $IMG = cleanID($INPUT->str('img'));
$NS = getNS($IMG);
}else{
- $NS = $_REQUEST['ns'];
- $NS = cleanID($NS);
+ $NS = cleanID($INPUT->str('ns'));
}
// check auth
@@ -76,18 +76,18 @@
}
// handle meta saving
- if($IMG && @array_key_exists('save', $_REQUEST['do'])){
- $JUMPTO = media_metasave($IMG,$AUTH,$_REQUEST['meta']);
+ if($IMG && @array_key_exists('save', $INPUT->arr('do'))){
+ $JUMPTO = media_metasave($IMG,$AUTH,$INPUT->arr('meta'));
}
- if($IMG && ($_REQUEST['mediado'] == 'save' || @array_key_exists('save', $_REQUEST['mediado']))) {
- $JUMPTO = media_metasave($IMG,$AUTH,$_REQUEST['meta']);
+ if($IMG && ($INPUT->str('mediado') == 'save' || @array_key_exists('save', $INPUT->arr('mediado')))) {
+ $JUMPTO = media_metasave($IMG,$AUTH,$INPUT->arr('meta'));
}
- if ($_REQUEST['rev'] && $conf['mediarevisions']) $REV = (int) $_REQUEST['rev'];
+ if ($INPUT->int('rev') && $conf['mediarevisions']) $REV = $INPUT->int('rev');
- if($_REQUEST['mediado'] == 'restore' && $conf['mediarevisions']){
- $JUMPTO = media_restore($_REQUEST['image'], $REV, $AUTH);
+ if($INPUT->str('mediado') == 'restore' && $conf['mediarevisions']){
+ $JUMPTO = media_restore($INPUT->str('image'), $REV, $AUTH);
}
// handle deletion
@@ -101,7 +101,7 @@
if ($res & DOKU_MEDIA_EMPTY_NS && !$fullscreen) {
// current namespace was removed. redirecting to root ns passing msg along
send_redirect(DOKU_URL.'lib/exe/mediamanager.php?msg1='.
- rawurlencode($msg).'&edid='.$_REQUEST['edid']);
+ rawurlencode($msg).'&edid='.$INPUT->str('edid'));
}
msg($msg,1);
} elseif ($res & DOKU_MEDIA_INUSE) {
diff --git a/lib/exe/opensearch.php b/lib/exe/opensearch.php
index 03a1632c4..73939c347 100644
--- a/lib/exe/opensearch.php
+++ b/lib/exe/opensearch.php
@@ -16,9 +16,9 @@ require_once(DOKU_INC.'inc/init.php');
// try to be clever about the favicon location
if(file_exists(DOKU_INC.'favicon.ico')){
$ico = DOKU_URL.'favicon.ico';
-}elseif(file_exists(DOKU_TPLINC.'images/favicon.ico')){
+}elseif(file_exists(tpl_incdir().'images/favicon.ico')){
$ico = DOKU_URL.'lib/tpl/'.$conf['template'].'/images/favicon.ico';
-}elseif(file_exists(DOKU_TPLINC.'favicon.ico')){
+}elseif(file_exists(tpl_incdir().'favicon.ico')){
$ico = DOKU_URL.'lib/tpl/'.$conf['template'].'/favicon.ico';
}else{
$ico = DOKU_URL.'lib/tpl/default/images/favicon.ico';
diff --git a/lib/exe/xmlrpc.php b/lib/exe/xmlrpc.php
index 95775188f..5e6c197d0 100644
--- a/lib/exe/xmlrpc.php
+++ b/lib/exe/xmlrpc.php
@@ -1,886 +1,52 @@
<?php
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
-// fix when '< ?xml' isn't on the very first line
-if(isset($HTTP_RAW_POST_DATA)) $HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);
-
-/**
- * Increased whenever the API is changed
- */
-define('DOKU_XMLRPC_API_VERSION', 6);
-
require_once(DOKU_INC.'inc/init.php');
session_write_close(); //close session
-if(!$conf['xmlrpc']) die('XML-RPC server not enabled.');
+if(!$conf['remote']) die('XML-RPC server not enabled.');
/**
* Contains needed wrapper functions and registers all available
* XMLRPC functions.
*/
-class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
- var $methods = array();
- var $public_methods = array();
-
- /**
- * Checks if the current user is allowed to execute non anonymous methods
- */
- function checkAuth(){
- global $conf;
- global $USERINFO;
-
- if(!$conf['useacl']) return true; //no ACL - then no checks
- if(trim($conf['xmlrpcuser']) == '') return true; //no restrictions
-
- return auth_isMember($conf['xmlrpcuser'],$_SERVER['REMOTE_USER'],(array) $USERINFO['grps']);
- }
+class dokuwiki_xmlrpc_server extends IXR_Server {
+ var $remote;
/**
- * Adds a callback, extends parent method
- *
- * add another parameter to define if anonymous access to
- * this method should be granted.
+ * Constructor. Register methods and run Server
*/
- function addCallback($method, $callback, $args, $help, $public=false){
- if($public) $this->public_methods[] = $method;
- return parent::addCallback($method, $callback, $args, $help);
+ function dokuwiki_xmlrpc_server(){
+ $this->remote = new RemoteAPI();
+ $this->remote->setDateTransformation(array($this, 'toDate'));
+ $this->remote->setFileTransformation(array($this, 'toFile'));
+ $this->IXR_Server();
}
- /**
- * Execute a call, extends parent method
- *
- * Checks for authentication first
- */
function call($methodname, $args){
- if(!in_array($methodname,$this->public_methods) && !$this->checkAuth()){
+ try {
+ $result = $this->remote->call($methodname, $args);
+ return $result;
+ } catch (RemoteAccessDeniedException $e) {
if (!isset($_SERVER['REMOTE_USER'])) {
header('HTTP/1.1 401 Unauthorized');
+ return new IXR_Error(-32603, "server error. not authorized to call method $methodname");
} else {
header('HTTP/1.1 403 Forbidden');
+ return new IXR_Error(-32604, "server error. forbidden to call the method $methodname");
}
- return new IXR_Error(-32603, 'server error. not authorized to call method "'.$methodname.'".');
- }
- return parent::call($methodname, $args);
- }
-
- /**
- * Constructor. Register methods and run Server
- */
- function dokuwiki_xmlrpc_server(){
- $this->IXR_IntrospectionServer();
-
- /* DokuWiki's own methods */
- $this->addCallback(
- 'dokuwiki.getXMLRPCAPIVersion',
- 'this:getAPIVersion',
- array('integer'),
- 'Returns the XMLRPC API version.',
- true
- );
-
- $this->addCallback(
- 'dokuwiki.getVersion',
- 'getVersion',
- array('string'),
- 'Returns the running DokuWiki version.',
- true
- );
-
- $this->addCallback(
- 'dokuwiki.login',
- 'this:login',
- array('integer','string','string'),
- 'Tries to login with the given credentials and sets auth cookies.',
- true
- );
-
- $this->addCallback(
- 'dokuwiki.getPagelist',
- 'this:readNamespace',
- array('struct','string','struct'),
- 'List all pages within the given namespace.'
- );
-
- $this->addCallback(
- 'dokuwiki.search',
- 'this:search',
- array('struct','string'),
- 'Perform a fulltext search and return a list of matching pages'
- );
-
- $this->addCallback(
- 'dokuwiki.getTime',
- 'time',
- array('int'),
- 'Return the current time at the wiki server.'
- );
-
- $this->addCallback(
- 'dokuwiki.setLocks',
- 'this:setLocks',
- array('struct','struct'),
- 'Lock or unlock pages.'
- );
-
-
- $this->addCallback(
- 'dokuwiki.getTitle',
- 'this:getTitle',
- array('string'),
- 'Returns the wiki title.',
- true
- );
-
- $this->addCallback(
- 'dokuwiki.appendPage',
- 'this:appendPage',
- array('int', 'string', 'string', 'struct'),
- 'Append text to a wiki page.'
- );
-
- /* Wiki API v2 http://www.jspwiki.org/wiki/WikiRPCInterface2 */
- $this->addCallback(
- 'wiki.getRPCVersionSupported',
- 'this:wiki_RPCVersion',
- array('int'),
- 'Returns 2 with the supported RPC API version.',
- true
- );
- $this->addCallback(
- 'wiki.getPage',
- 'this:rawPage',
- array('string','string'),
- 'Get the raw Wiki text of page, latest version.'
- );
- $this->addCallback(
- 'wiki.getPageVersion',
- 'this:rawPage',
- array('string','string','int'),
- 'Get the raw Wiki text of page.'
- );
- $this->addCallback(
- 'wiki.getPageHTML',
- 'this:htmlPage',
- array('string','string'),
- 'Return page in rendered HTML, latest version.'
- );
- $this->addCallback(
- 'wiki.getPageHTMLVersion',
- 'this:htmlPage',
- array('string','string','int'),
- 'Return page in rendered HTML.'
- );
- $this->addCallback(
- 'wiki.getAllPages',
- 'this:listPages',
- array('struct'),
- 'Returns a list of all pages. The result is an array of utf8 pagenames.'
- );
- $this->addCallback(
- 'wiki.getAttachments',
- 'this:listAttachments',
- array('struct', 'string', 'struct'),
- 'Returns a list of all media files.'
- );
- $this->addCallback(
- 'wiki.getBackLinks',
- 'this:listBackLinks',
- array('struct','string'),
- 'Returns the pages that link to this page.'
- );
- $this->addCallback(
- 'wiki.getPageInfo',
- 'this:pageInfo',
- array('struct','string'),
- 'Returns a struct with infos about the page.'
- );
- $this->addCallback(
- 'wiki.getPageInfoVersion',
- 'this:pageInfo',
- array('struct','string','int'),
- 'Returns a struct with infos about the page.'
- );
- $this->addCallback(
- 'wiki.getPageVersions',
- 'this:pageVersions',
- array('struct','string','int'),
- 'Returns the available revisions of the page.'
- );
- $this->addCallback(
- 'wiki.putPage',
- 'this:putPage',
- array('int', 'string', 'string', 'struct'),
- 'Saves a wiki page.'
- );
- $this->addCallback(
- 'wiki.listLinks',
- 'this:listLinks',
- array('struct','string'),
- 'Lists all links contained in a wiki page.'
- );
- $this->addCallback(
- 'wiki.getRecentChanges',
- 'this:getRecentChanges',
- array('struct','int'),
- 'Returns a struct about all recent changes since given timestamp.'
- );
- $this->addCallback(
- 'wiki.getRecentMediaChanges',
- 'this:getRecentMediaChanges',
- array('struct','int'),
- 'Returns a struct about all recent media changes since given timestamp.'
- );
- $this->addCallback(
- 'wiki.aclCheck',
- 'this:aclCheck',
- array('int', 'string'),
- 'Returns the permissions of a given wiki page.'
- );
- $this->addCallback(
- 'wiki.putAttachment',
- 'this:putAttachment',
- array('struct', 'string', 'base64', 'struct'),
- 'Upload a file to the wiki.'
- );
- $this->addCallback(
- 'wiki.deleteAttachment',
- 'this:deleteAttachment',
- array('int', 'string'),
- 'Delete a file from the wiki.'
- );
- $this->addCallback(
- 'wiki.getAttachment',
- 'this:getAttachment',
- array('base64', 'string'),
- 'Download a file from the wiki.'
- );
- $this->addCallback(
- 'wiki.getAttachmentInfo',
- 'this:getAttachmentInfo',
- array('struct', 'string'),
- 'Returns a struct with infos about the attachment.'
- );
-
- /**
- * Trigger XMLRPC_CALLBACK_REGISTER, action plugins can use this event
- * to extend the XMLRPC interface and register their own callbacks.
- *
- * Event data:
- * The XMLRPC server object:
- *
- * $event->data->addCallback() - register a callback, the second
- * paramter has to be of the form "plugin:<pluginname>:<plugin
- * method>"
- *
- * $event->data->callbacks - an array which holds all awaylable
- * callbacks
- */
- trigger_event('XMLRPC_CALLBACK_REGISTER', $this);
-
- $this->serve();
- }
-
- /**
- * Return a raw wiki page
- */
- function rawPage($id,$rev=''){
- $id = cleanID($id);
- if(auth_quickaclcheck($id) < AUTH_READ){
- return new IXR_Error(1, 'You are not allowed to read this page');
- }
- $text = rawWiki($id,$rev);
- if(!$text) {
- return pageTemplate($id);
- } else {
- return $text;
- }
- }
-
- /**
- * Return a media file encoded in base64
- *
- * @author Gina Haeussge <osd@foosel.net>
- */
- function getAttachment($id){
- $id = cleanID($id);
- if (auth_quickaclcheck(getNS($id).':*') < AUTH_READ)
- return new IXR_Error(1, 'You are not allowed to read this file');
-
- $file = mediaFN($id);
- if (!@ file_exists($file))
- return new IXR_Error(1, 'The requested file does not exist');
-
- $data = io_readFile($file, false);
- $base64 = base64_encode($data);
- return $base64;
- }
-
- /**
- * Return info about a media file
- *
- * @author Gina Haeussge <osd@foosel.net>
- */
- function getAttachmentInfo($id){
- $id = cleanID($id);
- $info = array(
- 'lastModified' => 0,
- 'size' => 0,
- );
-
- $file = mediaFN($id);
- if ((auth_quickaclcheck(getNS($id).':*') >= AUTH_READ) && file_exists($file)){
- $info['lastModified'] = new IXR_Date(filemtime($file));
- $info['size'] = filesize($file);
- }
-
- return $info;
- }
-
- /**
- * Return a wiki page rendered to html
- */
- function htmlPage($id,$rev=''){
- $id = cleanID($id);
- if(auth_quickaclcheck($id) < AUTH_READ){
- return new IXR_Error(1, 'You are not allowed to read this page');
- }
- return p_wiki_xhtml($id,$rev,false);
- }
-
- /**
- * List all pages - we use the indexer list here
- */
- function listPages(){
- $list = array();
- $pages = idx_get_indexer()->getPages();
- $pages = array_filter(array_filter($pages,'isVisiblePage'),'page_exists');
-
- foreach(array_keys($pages) as $idx) {
- $perm = auth_quickaclcheck($pages[$idx]);
- if($perm < AUTH_READ) {
- continue;
- }
- $page = array();
- $page['id'] = trim($pages[$idx]);
- $page['perms'] = $perm;
- $page['size'] = @filesize(wikiFN($pages[$idx]));
- $page['lastModified'] = new IXR_Date(@filemtime(wikiFN($pages[$idx])));
- $list[] = $page;
- }
-
- return $list;
- }
-
- /**
- * List all pages in the given namespace (and below)
- */
- function readNamespace($ns,$opts){
- global $conf;
-
- if(!is_array($opts)) $opts=array();
-
- $ns = cleanID($ns);
- $dir = utf8_encodeFN(str_replace(':', '/', $ns));
- $data = array();
- $opts['skipacl'] = 0; // no ACL skipping for XMLRPC
- search($data, $conf['datadir'], 'search_allpages', $opts, $dir);
- return $data;
- }
-
- /**
- * List all pages in the given namespace (and below)
- */
- function search($query){
- require_once(DOKU_INC.'inc/fulltext.php');
-
- $regex = '';
- $data = ft_pageSearch($query,$regex);
- $pages = array();
-
- // prepare additional data
- $idx = 0;
- foreach($data as $id => $score){
- $file = wikiFN($id);
-
- if($idx < FT_SNIPPET_NUMBER){
- $snippet = ft_snippet($id,$regex);
- $idx++;
- }else{
- $snippet = '';
- }
-
- $pages[] = array(
- 'id' => $id,
- 'score' => intval($score),
- 'rev' => filemtime($file),
- 'mtime' => filemtime($file),
- 'size' => filesize($file),
- 'snippet' => $snippet,
- );
- }
- return $pages;
- }
-
- /**
- * Returns the wiki title.
- */
- function getTitle(){
- global $conf;
- return $conf['title'];
- }
-
- /**
- * List all media files.
- *
- * Available options are 'recursive' for also including the subnamespaces
- * in the listing, and 'pattern' for filtering the returned files against
- * a regular expression matching their name.
- *
- * @author Gina Haeussge <osd@foosel.net>
- */
- function listAttachments($ns, $options = array()) {
- global $conf;
- global $lang;
-
- $ns = cleanID($ns);
-
- if (!is_array($options)) $options = array();
- $options['skipacl'] = 0; // no ACL skipping for XMLRPC
-
-
- if(auth_quickaclcheck($ns.':*') >= AUTH_READ) {
- $dir = utf8_encodeFN(str_replace(':', '/', $ns));
-
- $data = array();
- search($data, $conf['mediadir'], 'search_media', $options, $dir);
- $len = count($data);
- if(!$len) return array();
-
- for($i=0; $i<$len; $i++) {
- unset($data[$i]['meta']);
- $data[$i]['lastModified'] = new IXR_Date($data[$i]['mtime']);
- }
- return $data;
- } else {
- return new IXR_Error(1, 'You are not allowed to list media files.');
- }
- }
-
- /**
- * Return a list of backlinks
- */
- function listBackLinks($id){
- return ft_backlinks(cleanID($id));
- }
-
- /**
- * Return some basic data about a page
- */
- function pageInfo($id,$rev=''){
- $id = cleanID($id);
- if(auth_quickaclcheck($id) < AUTH_READ){
- return new IXR_Error(1, 'You are not allowed to read this page');
- }
- $file = wikiFN($id,$rev);
- $time = @filemtime($file);
- if(!$time){
- return new IXR_Error(10, 'The requested page does not exist');
- }
-
- $info = getRevisionInfo($id, $time, 1024);
-
- $data = array(
- 'name' => $id,
- 'lastModified' => new IXR_Date($time),
- 'author' => (($info['user']) ? $info['user'] : $info['ip']),
- 'version' => $time
- );
-
- return ($data);
- }
-
- /**
- * Save a wiki page
- *
- * @author Michael Klier <chi@chimeric.de>
- */
- function putPage($id, $text, $params) {
- global $TEXT;
- global $lang;
- global $conf;
-
- $id = cleanID($id);
- $TEXT = cleanText($text);
- $sum = $params['sum'];
- $minor = $params['minor'];
-
- if(empty($id))
- return new IXR_Error(1, 'Empty page ID');
-
- if(!page_exists($id) && trim($TEXT) == '' ) {
- return new IXR_ERROR(1, 'Refusing to write an empty new wiki page');
- }
-
- if(auth_quickaclcheck($id) < AUTH_EDIT)
- return new IXR_Error(1, 'You are not allowed to edit this page');
-
- // Check, if page is locked
- if(checklock($id))
- return new IXR_Error(1, 'The page is currently locked');
-
- // SPAM check
- if(checkwordblock())
- return new IXR_Error(1, 'Positive wordblock check');
-
- // autoset summary on new pages
- if(!page_exists($id) && empty($sum)) {
- $sum = $lang['created'];
- }
-
- // autoset summary on deleted pages
- if(page_exists($id) && empty($TEXT) && empty($sum)) {
- $sum = $lang['deleted'];
- }
-
- lock($id);
-
- saveWikiText($id,$TEXT,$sum,$minor);
-
- unlock($id);
-
- // run the indexer if page wasn't indexed yet
- idx_addPage($id);
-
- return 0;
- }
-
- /**
- * Appends text to a wiki page.
- */
- function appendPage($id, $text, $params) {
- $currentpage = $this->rawPage($id);
- if (!is_string($currentpage)) {
- return $currentpage;
- }
- return $this->putPage($id, $currentpage.$text, $params);
- }
-
- /**
- * Uploads a file to the wiki.
- *
- * Michael Klier <chi@chimeric.de>
- */
- function putAttachment($id, $file, $params) {
- $id = cleanID($id);
- $auth = auth_quickaclcheck(getNS($id).':*');
-
- if(!isset($id)) {
- return new IXR_ERROR(1, 'Filename not given.');
- }
-
- global $conf;
-
- $ftmp = $conf['tmpdir'] . '/' . md5($id.clientIP());
-
- // save temporary file
- @unlink($ftmp);
- if (preg_match('/^[A-Za-z0-9\+\/]*={0,2}$/', $file) === 1) {
- // DEPRECATED: Double-decode file if it still looks like base64
- // after first decoding (which is done by the library)
- $file = base64_decode($file);
- }
- io_saveFile($ftmp, $file);
-
- $res = media_save(array('name' => $ftmp), $id, $params['ow'], $auth, 'rename');
- if (is_array($res)) {
- return new IXR_ERROR(-$res[1], $res[0]);
- } else {
- return $res;
- }
- }
-
- /**
- * Deletes a file from the wiki.
- *
- * @author Gina Haeussge <osd@foosel.net>
- */
- function deleteAttachment($id){
- $id = cleanID($id);
- $auth = auth_quickaclcheck(getNS($id).':*');
- $res = media_delete($id, $auth);
- if ($res & DOKU_MEDIA_DELETED) {
- return 0;
- } elseif ($res & DOKU_MEDIA_NOT_AUTH) {
- return new IXR_ERROR(1, "You don't have permissions to delete files.");
- } elseif ($res & DOKU_MEDIA_INUSE) {
- return new IXR_ERROR(1, 'File is still referenced');
- } else {
- return new IXR_ERROR(1, 'Could not delete file');
- }
- }
-
- /**
- * Returns the permissions of a given wiki page
- */
- function aclCheck($id) {
- $id = cleanID($id);
- return auth_quickaclcheck($id);
- }
-
- /**
- * Lists all links contained in a wiki page
- *
- * @author Michael Klier <chi@chimeric.de>
- */
- function listLinks($id) {
- $id = cleanID($id);
- if(auth_quickaclcheck($id) < AUTH_READ){
- return new IXR_Error(1, 'You are not allowed to read this page');
- }
- $links = array();
-
- // resolve page instructions
- $ins = p_cached_instructions(wikiFN($id));
-
- // instantiate new Renderer - needed for interwiki links
- include(DOKU_INC.'inc/parser/xhtml.php');
- $Renderer = new Doku_Renderer_xhtml();
- $Renderer->interwiki = getInterwiki();
-
- // parse parse instructions
- foreach($ins as $in) {
- $link = array();
- switch($in[0]) {
- case 'internallink':
- $link['type'] = 'local';
- $link['page'] = $in[1][0];
- $link['href'] = wl($in[1][0]);
- array_push($links,$link);
- break;
- case 'externallink':
- $link['type'] = 'extern';
- $link['page'] = $in[1][0];
- $link['href'] = $in[1][0];
- array_push($links,$link);
- break;
- case 'interwikilink':
- $url = $Renderer->_resolveInterWiki($in[1][2],$in[1][3]);
- $link['type'] = 'extern';
- $link['page'] = $url;
- $link['href'] = $url;
- array_push($links,$link);
- break;
- }
- }
-
- return ($links);
- }
-
- /**
- * Returns a list of recent changes since give timestamp
- *
- * @author Michael Hamann <michael@content-space.de>
- * @author Michael Klier <chi@chimeric.de>
- */
- function getRecentChanges($timestamp) {
- if(strlen($timestamp) != 10)
- return new IXR_Error(20, 'The provided value is not a valid timestamp');
-
- $recents = getRecentsSince($timestamp);
-
- $changes = array();
-
- foreach ($recents as $recent) {
- $change = array();
- $change['name'] = $recent['id'];
- $change['lastModified'] = new IXR_Date($recent['date']);
- $change['author'] = $recent['user'];
- $change['version'] = $recent['date'];
- $change['perms'] = $recent['perms'];
- $change['size'] = @filesize(wikiFN($recent['id']));
- array_push($changes, $change);
- }
-
- if (!empty($changes)) {
- return $changes;
- } else {
- // in case we still have nothing at this point
- return new IXR_Error(30, 'There are no changes in the specified timeframe');
- }
- }
-
- /**
- * Returns a list of recent media changes since give timestamp
- *
- * @author Michael Hamann <michael@content-space.de>
- * @author Michael Klier <chi@chimeric.de>
- */
- function getRecentMediaChanges($timestamp) {
- if(strlen($timestamp) != 10)
- return new IXR_Error(20, 'The provided value is not a valid timestamp');
-
- $recents = getRecentsSince($timestamp, null, '', RECENTS_MEDIA_CHANGES);
-
- $changes = array();
-
- foreach ($recents as $recent) {
- $change = array();
- $change['name'] = $recent['id'];
- $change['lastModified'] = new IXR_Date($recent['date']);
- $change['author'] = $recent['user'];
- $change['version'] = $recent['date'];
- $change['perms'] = $recent['perms'];
- $change['size'] = @filesize(mediaFN($recent['id']));
- array_push($changes, $change);
- }
-
- if (!empty($changes)) {
- return $changes;
- } else {
- // in case we still have nothing at this point
- return new IXR_Error(30, 'There are no changes in the specified timeframe');
- }
- }
-
- /**
- * Returns a list of available revisions of a given wiki page
- *
- * @author Michael Klier <chi@chimeric.de>
- */
- function pageVersions($id, $first) {
- $id = cleanID($id);
- if(auth_quickaclcheck($id) < AUTH_READ){
- return new IXR_Error(1, 'You are not allowed to read this page');
- }
- global $conf;
-
- $versions = array();
-
- if(empty($id))
- return new IXR_Error(1, 'Empty page ID');
-
- $revisions = getRevisions($id, $first, $conf['recent']+1);
-
- if(count($revisions)==0 && $first!=0) {
- $first=0;
- $revisions = getRevisions($id, $first, $conf['recent']+1);
- }
-
- if(count($revisions)>0 && $first==0) {
- array_unshift($revisions, ''); // include current revision
- array_pop($revisions); // remove extra log entry
- }
-
- $hasNext = false;
- if(count($revisions)>$conf['recent']) {
- $hasNext = true;
- array_pop($revisions); // remove extra log entry
- }
-
- if(!empty($revisions)) {
- foreach($revisions as $rev) {
- $file = wikiFN($id,$rev);
- $time = @filemtime($file);
- // we check if the page actually exists, if this is not the
- // case this can lead to less pages being returned than
- // specified via $conf['recent']
- if($time){
- $info = getRevisionInfo($id, $time, 1024);
- if(!empty($info)) {
- $data['user'] = $info['user'];
- $data['ip'] = $info['ip'];
- $data['type'] = $info['type'];
- $data['sum'] = $info['sum'];
- $data['modified'] = new IXR_Date($info['date']);
- $data['version'] = $info['date'];
- array_push($versions, $data);
- }
- }
- }
- return $versions;
- } else {
- return array();
- }
- }
-
- /**
- * The version of Wiki RPC API supported
- */
- function wiki_RPCVersion(){
- return 2;
- }
-
-
- /**
- * Locks or unlocks a given batch of pages
- *
- * Give an associative array with two keys: lock and unlock. Both should contain a
- * list of pages to lock or unlock
- *
- * Returns an associative array with the keys locked, lockfail, unlocked and
- * unlockfail, each containing lists of pages.
- */
- function setLocks($set){
- $locked = array();
- $lockfail = array();
- $unlocked = array();
- $unlockfail = array();
-
- foreach((array) $set['lock'] as $id){
- $id = cleanID($id);
- if(auth_quickaclcheck($id) < AUTH_EDIT || checklock($id)){
- $lockfail[] = $id;
- }else{
- lock($id);
- $locked[] = $id;
- }
- }
-
- foreach((array) $set['unlock'] as $id){
- $id = cleanID($id);
- if(auth_quickaclcheck($id) < AUTH_EDIT || !unlock($id)){
- $unlockfail[] = $id;
- }else{
- $unlocked[] = $id;
- }
+ } catch (RemoteException $e) {
+ return new IXR_Error($e->getCode(), $e->getMessage());
}
-
- return array(
- 'locked' => $locked,
- 'lockfail' => $lockfail,
- 'unlocked' => $unlocked,
- 'unlockfail' => $unlockfail,
- );
}
- function getAPIVersion(){
- return DOKU_XMLRPC_API_VERSION;
+ function toDate($data) {
+ return new IXR_Date($data);
}
- function login($user,$pass){
- global $conf;
- global $auth;
- if(!$conf['useacl']) return 0;
- if(!$auth) return 0;
-
- @session_start(); // reopen session for login
- if($auth->canDo('external')){
- $ok = $auth->trustExternal($user,$pass,false);
- }else{
- $evdata = array(
- 'user' => $user,
- 'password' => $pass,
- 'sticky' => false,
- 'silent' => true,
- );
- $ok = trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
- }
- session_write_close(); // we're done with the session
-
- return $ok;
+ function toFile($data) {
+ return new IXR_Base64($data);
}
-
-
}
$server = new dokuwiki_xmlrpc_server();
diff --git a/lib/images/arrow_down.gif b/lib/images/arrow_down.gif
deleted file mode 100644
index ff13b9585..000000000
--- a/lib/images/arrow_down.gif
+++ /dev/null
Binary files differ
diff --git a/lib/images/arrow_up.gif b/lib/images/arrow_up.gif
deleted file mode 100644
index d491c18db..000000000
--- a/lib/images/arrow_up.gif
+++ /dev/null
Binary files differ
diff --git a/lib/images/at.gif b/lib/images/at.gif
deleted file mode 100644
index 8bdf40d54..000000000
--- a/lib/images/at.gif
+++ /dev/null
Binary files differ
diff --git a/lib/images/close.png b/lib/images/close.png
deleted file mode 100644
index 4ccef0603..000000000
--- a/lib/images/close.png
+++ /dev/null
Binary files differ
diff --git a/lib/images/del.png b/lib/images/del.png
deleted file mode 100644
index e59ded55f..000000000
--- a/lib/images/del.png
+++ /dev/null
Binary files differ
diff --git a/lib/images/edit.gif b/lib/images/edit.gif
deleted file mode 100644
index a2a23de7b..000000000
--- a/lib/images/edit.gif
+++ /dev/null
Binary files differ
diff --git a/lib/images/fileicons/ico.png b/lib/images/fileicons/ico.png
new file mode 100644
index 000000000..1d9dd562a
--- /dev/null
+++ b/lib/images/fileicons/ico.png
Binary files differ
diff --git a/lib/images/fileicons/index.php b/lib/images/fileicons/index.php
index c1e64fe2a..f90e7e6f0 100644
--- a/lib/images/fileicons/index.php
+++ b/lib/images/fileicons/index.php
@@ -1,7 +1,5 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
- lang="en" dir="ltr">
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
<head>
<title>filetype icons</title>
diff --git a/lib/images/icon-file.png b/lib/images/icon-file.png
deleted file mode 100644
index d350c8c31..000000000
--- a/lib/images/icon-file.png
+++ /dev/null
Binary files differ
diff --git a/lib/images/icon-thumb.png b/lib/images/icon-thumb.png
deleted file mode 100644
index ccc7a101d..000000000
--- a/lib/images/icon-thumb.png
+++ /dev/null
Binary files differ
diff --git a/lib/images/index.html b/lib/images/index.html
index d614603ac..977f90e10 100644
--- a/lib/images/index.html
+++ b/lib/images/index.html
@@ -1,6 +1,5 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
+<!DOCTYPE html>
+<html>
<head>
<meta http-equiv="refresh" content="0; URL=../../" />
<meta name="robots" content="noindex" />
diff --git a/lib/images/interwiki/amazon.de.gif b/lib/images/interwiki/amazon.de.gif
index 6e36a051a..a0d2cd4cb 100644
--- a/lib/images/interwiki/amazon.de.gif
+++ b/lib/images/interwiki/amazon.de.gif
Binary files differ
diff --git a/lib/images/interwiki/amazon.gif b/lib/images/interwiki/amazon.gif
index 6e36a051a..a0d2cd4cb 100644
--- a/lib/images/interwiki/amazon.gif
+++ b/lib/images/interwiki/amazon.gif
Binary files differ
diff --git a/lib/images/interwiki/amazon.uk.gif b/lib/images/interwiki/amazon.uk.gif
index 6e36a051a..a0d2cd4cb 100644
--- a/lib/images/interwiki/amazon.uk.gif
+++ b/lib/images/interwiki/amazon.uk.gif
Binary files differ
diff --git a/lib/images/interwiki/callto.gif b/lib/images/interwiki/callto.gif
index f6d424554..60158c565 100644
--- a/lib/images/interwiki/callto.gif
+++ b/lib/images/interwiki/callto.gif
Binary files differ
diff --git a/lib/images/interwiki/paypal.gif b/lib/images/interwiki/paypal.gif
index 1d2834062..a2dc89431 100644
--- a/lib/images/interwiki/paypal.gif
+++ b/lib/images/interwiki/paypal.gif
Binary files differ
diff --git a/lib/images/interwiki/skype.gif b/lib/images/interwiki/skype.gif
new file mode 100644
index 000000000..2c900a8b2
--- /dev/null
+++ b/lib/images/interwiki/skype.gif
Binary files differ
diff --git a/lib/images/interwiki/skype.png b/lib/images/interwiki/skype.png
deleted file mode 100644
index c70216702..000000000
--- a/lib/images/interwiki/skype.png
+++ /dev/null
Binary files differ
diff --git a/lib/images/list-minus.gif b/lib/images/list-minus.gif
deleted file mode 100644
index 36902f159..000000000
--- a/lib/images/list-minus.gif
+++ /dev/null
Binary files differ
diff --git a/lib/images/list-plus.gif b/lib/images/list-plus.gif
deleted file mode 100644
index adc3fac8a..000000000
--- a/lib/images/list-plus.gif
+++ /dev/null
Binary files differ
diff --git a/lib/images/pencil.png b/lib/images/pencil.png
deleted file mode 100644
index 78142b61e..000000000
--- a/lib/images/pencil.png
+++ /dev/null
Binary files differ
diff --git a/lib/images/resizecol.png b/lib/images/resizecol.png
new file mode 100644
index 000000000..b5aeec004
--- /dev/null
+++ b/lib/images/resizecol.png
Binary files differ
diff --git a/lib/index.html b/lib/index.html
index 8cb33512e..885c954a4 100644
--- a/lib/index.html
+++ b/lib/index.html
@@ -1,6 +1,5 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
+<!DOCTYPE html>
+<html>
<head>
<meta http-equiv="refresh" content="0; URL=../" />
<meta name="robots" content="noindex" />
diff --git a/lib/plugins/acl/admin.php b/lib/plugins/acl/admin.php
index a6b0624bc..1197892f2 100644
--- a/lib/plugins/acl/admin.php
+++ b/lib/plugins/acl/admin.php
@@ -56,22 +56,23 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
global $ID;
global $auth;
global $config_cascade;
+ global $INPUT;
// fresh 1:1 copy without replacements
$AUTH_ACL = file($config_cascade['acl']['default']);
// namespace given?
- if($_REQUEST['ns'] == '*'){
+ if($INPUT->str('ns') == '*'){
$this->ns = '*';
}else{
- $this->ns = cleanID($_REQUEST['ns']);
+ $this->ns = cleanID($INPUT->str('ns'));
}
- if ($_REQUEST['current_ns']) {
- $this->current_item = array('id' => cleanID($_REQUEST['current_ns']), 'type' => 'd');
- } elseif ($_REQUEST['current_id']) {
- $this->current_item = array('id' => cleanID($_REQUEST['current_id']), 'type' => 'f');
+ if ($INPUT->str('current_ns')) {
+ $this->current_item = array('id' => cleanID($INPUT->str('current_ns')), 'type' => 'd');
+ } elseif ($INPUT->str('current_id')) {
+ $this->current_item = array('id' => cleanID($INPUT->str('current_id')), 'type' => 'f');
} elseif ($this->ns) {
$this->current_item = array('id' => $this->ns, 'type' => 'd');
} else {
@@ -79,24 +80,25 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
}
// user or group choosen?
- $who = trim($_REQUEST['acl_w']);
- if($_REQUEST['acl_t'] == '__g__' && $who){
+ $who = trim($INPUT->str('acl_w'));
+ if($INPUT->str('acl_t') == '__g__' && $who){
$this->who = '@'.ltrim($auth->cleanGroup($who),'@');
- }elseif($_REQUEST['acl_t'] == '__u__' && $who){
+ }elseif($INPUT->str('acl_t') == '__u__' && $who){
$this->who = ltrim($who,'@');
- if($this->who != '%USER%'){ #keep wildcard as is
+ if($this->who != '%USER%' && $this->who != '%GROUP%'){ #keep wildcard as is
$this->who = $auth->cleanUser($this->who);
}
- }elseif($_REQUEST['acl_t'] &&
- $_REQUEST['acl_t'] != '__u__' &&
- $_REQUEST['acl_t'] != '__g__'){
- $this->who = $_REQUEST['acl_t'];
+ }elseif($INPUT->str('acl_t') &&
+ $INPUT->str('acl_t') != '__u__' &&
+ $INPUT->str('acl_t') != '__g__'){
+ $this->who = $INPUT->str('acl_t');
}elseif($who){
$this->who = $who;
}
// handle modifications
- if(isset($_REQUEST['cmd']) && checkSecurityToken()){
+ if($INPUT->has('cmd') && checkSecurityToken()){
+ $cmd = $INPUT->extract('cmd')->str('cmd');
// scope for modifications
if($this->ns){
@@ -109,19 +111,21 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
$scope = $ID;
}
- if(isset($_REQUEST['cmd']['save']) && $scope && $this->who && isset($_REQUEST['acl'])){
+ if($cmd == 'save' && $scope && $this->who && $INPUT->has('acl')){
// handle additions or single modifications
$this->_acl_del($scope, $this->who);
- $this->_acl_add($scope, $this->who, (int) $_REQUEST['acl']);
- }elseif(isset($_REQUEST['cmd']['del']) && $scope && $this->who){
+ $this->_acl_add($scope, $this->who, $INPUT->int('acl'));
+ }elseif($cmd == 'del' && $scope && $this->who){
// handle single deletions
$this->_acl_del($scope, $this->who);
- }elseif(isset($_REQUEST['cmd']['update'])){
+ }elseif($cmd == 'update'){
+ $acl = $INPUT->arr('acl');
+
// handle update of the whole file
- foreach((array) $_REQUEST['del'] as $where => $names){
+ foreach($INPUT->arr('del') as $where => $names){
// remove all rules marked for deletion
foreach($names as $who)
- unset($_REQUEST['acl'][$where][$who]);
+ unset($acl[$where][$who]);
}
// prepare lines
$lines = array();
@@ -134,13 +138,13 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
}
}
// re-add all rules
- foreach((array) $_REQUEST['acl'] as $where => $opt){
+ foreach($acl as $where => $opt){
foreach($opt as $who => $perm){
if ($who[0]=='@') {
if ($who!='@ALL') {
$who = '@'.ltrim($auth->cleanGroup($who),'@');
}
- } elseif ($who != '%USER%'){ #keep wildcard as is
+ } elseif ($who != '%USER%' && $who != '%GROUP%'){ #keep wildcard as is
$who = $auth->cleanUser($who);
}
$who = auth_nameencode($who,true);
@@ -191,7 +195,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
echo '</div>'.NL;
echo '<div class="footnotes"><div class="fn">'.NL;
- echo '<sup><a id="fn__1" class="fn_bot" name="fn__1" href="#fnt__1">1)</a></sup>'.NL;
+ echo '<sup><a id="fn__1" class="fn_bot" href="#fnt__1">1)</a></sup>'.NL;
echo $this->getLang('p_include');
echo '</div></div>';
@@ -507,7 +511,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
if($item['type']=='d'){
if($item['open']){
$img = DOKU_BASE.'lib/images/minus.gif';
- $alt = '&minus;';
+ $alt = '−';
}else{
$img = DOKU_BASE.'lib/images/plus.gif';
$alt = '+';
@@ -597,11 +601,12 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
echo '<input type="hidden" name="do" value="admin" />'.NL;
echo '<input type="hidden" name="page" value="acl" />'.NL;
echo '<input type="hidden" name="sectok" value="'.getSecurityToken().'" />'.NL;
+ echo '<div class="table">';
echo '<table class="inline">';
echo '<tr>';
echo '<th>'.$this->getLang('where').'</th>';
echo '<th>'.$this->getLang('who').'</th>';
- echo '<th>'.$this->getLang('perm').'<sup><a id="fnt__1" class="fn_top" name="fnt__1" href="#fn__1">1)</a></sup></th>';
+ echo '<th>'.$this->getLang('perm').'<sup><a id="fnt__1" class="fn_top" href="#fn__1">1)</a></sup></th>';
echo '<th>'.$lang['btn_delete'].'</th>';
echo '</tr>';
foreach($this->acl as $where => $set){
@@ -629,7 +634,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
echo $this->_html_checkboxes($perm,$ispage,'acl['.$where.']['.$who.']');
echo '</td>';
- echo '<td align="center">';
+ echo '<td class="check">';
echo '<input type="checkbox" name="del['.hsc($where).'][]" value="'.hsc($who).'" />';
echo '</td>';
echo '</tr>';
@@ -637,11 +642,12 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
}
echo '<tr>';
- echo '<th align="right" colspan="4">';
+ echo '<th class="action" colspan="4">';
echo '<input type="submit" value="'.$lang['btn_update'].'" name="cmd[update]" class="button" />';
echo '</th>';
echo '</tr>';
echo '</table>';
+ echo '</div>';
echo '</div></form>'.NL;
}
@@ -744,8 +750,8 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
}
//build code
- $ret .= '<label for="pbox'.$label.'" title="'.$this->getLang('acl_perm'.$perm).'"'.$class.'>';
- $ret .= '<input '.buildAttributes($atts).' />&nbsp;';
+ $ret .= '<label for="pbox'.$label.'"'.$class.'>';
+ $ret .= '<input '.buildAttributes($atts).' />&#160;';
$ret .= $this->getLang('acl_perm'.$perm);
$ret .= '</label>'.NL;
}
@@ -781,7 +787,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
echo ' <option value="__g__" class="aclgroup"'.$gsel.'>'.$this->getLang('acl_group').':</option>'.NL;
echo ' <option value="__u__" class="acluser"'.$usel.'>'.$this->getLang('acl_user').':</option>'.NL;
if (!empty($this->specials)) {
- echo ' <optgroup label="&nbsp;">'.NL;
+ echo ' <optgroup label="&#160;">'.NL;
foreach($this->specials as $ug){
if($ug == $this->who){
$sel = ' selected="selected"';
@@ -799,7 +805,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
echo ' </optgroup>'.NL;
}
if (!empty($this->usersgroups)) {
- echo ' <optgroup label="&nbsp;">'.NL;
+ echo ' <optgroup label="&#160;">'.NL;
foreach($this->usersgroups as $ug){
if($ug == $this->who){
$sel = ' selected="selected"';
diff --git a/lib/plugins/acl/ajax.php b/lib/plugins/acl/ajax.php
index 71a2eb03a..10e18af97 100644
--- a/lib/plugins/acl/ajax.php
+++ b/lib/plugins/acl/ajax.php
@@ -6,35 +6,39 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-//fix for Opera XMLHttpRequests
-if(!count($_POST) && !empty($HTTP_RAW_POST_DATA)){
- parse_str($HTTP_RAW_POST_DATA, $_POST);
-}
-
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../../');
require_once(DOKU_INC.'inc/init.php');
//close session
session_write_close();
+global $conf;
+global $ID;
+global $INPUT;
+
+//fix for Opera XMLHttpRequests
+$postData = http_get_raw_post_data();
+if(!count($_POST) && !empty($postData)){
+ parse_str($postData, $_POST);
+}
+
if(!auth_isadmin()) die('for admins only');
if(!checkSecurityToken()) die('CRSF Attack');
$ID = getID();
+/** @var $acl admin_plugin_acl */
$acl = plugin_load('admin','acl');
$acl->handle();
-$ajax = $_REQUEST['ajax'];
+$ajax = $INPUT->str('ajax');
header('Content-Type: text/html; charset=utf-8');
if($ajax == 'info'){
$acl->_html_info();
}elseif($ajax == 'tree'){
- global $conf;
- global $ID;
$dir = $conf['datadir'];
- $ns = $_REQUEST['ns'];
+ $ns = $INPUT->str('ns');
if($ns == '*'){
$ns ='';
}
diff --git a/lib/plugins/acl/lang/bg/lang.php b/lib/plugins/acl/lang/bg/lang.php
index e260be918..95201750e 100644
--- a/lib/plugins/acl/lang/bg/lang.php
+++ b/lib/plugins/acl/lang/bg/lang.php
@@ -20,9 +20,9 @@ $lang['p_group_id'] = 'Членовете на групата <b clas
$lang['p_group_ns'] = 'Членовете на групата <b class="aclgroup">%s</b> в момента имат следните права за именното пространство <b class="aclns">%s</b>: <i>%s</i>.';
$lang['p_choose_id'] = 'Моля, <b>въведете потребител или група</b> в полето отгоре, за да видите или промените правата за страницата <b class="aclpage">%s</b>.';
$lang['p_choose_ns'] = 'Моля, <b>въведете потребител или група</b> в полето отгоре, за да видите или промените правата за именното пространство <b class="aclns">%s</b>.';
-$lang['p_inherited'] = 'Бележка: Тези разрешения не са зададени директно, а са наследени от други групи или именни пространства.';
+$lang['p_inherited'] = 'Бележка: Тези права не са зададени директно, а са наследени от други групи или именни пространства.';
$lang['p_isadmin'] = 'Бележка: Избраната група или потребител има всички права, защото е определен за супер потребител.';
-$lang['p_include'] = 'Висши права включват по-нисшите такива. Правата за създаване, качване и изтриване са приложими само за именни пространства, но не за страници.';
+$lang['p_include'] = 'Висшите права включват по-нисши такива. Правата за създаване, качване и изтриване са приложими само за именни пространства, но не за страници.';
$lang['current'] = 'Текущи ACL права';
$lang['where'] = 'Страница/Именно пространство';
$lang['who'] = 'Потребител/Група';
@@ -34,4 +34,4 @@ $lang['acl_perm4'] = 'Създаване';
$lang['acl_perm8'] = 'Качване';
$lang['acl_perm16'] = 'Изтриване';
$lang['acl_new'] = 'Добавяне на право';
-$lang['acl_mod'] = 'Промяна на записа';
+$lang['acl_mod'] = 'Промяна на правата';
diff --git a/lib/plugins/acl/lang/cs/lang.php b/lib/plugins/acl/lang/cs/lang.php
index cc1d97023..a1dce0369 100644
--- a/lib/plugins/acl/lang/cs/lang.php
+++ b/lib/plugins/acl/lang/cs/lang.php
@@ -10,6 +10,7 @@
* @author Lefty <lefty@multihost.cz>
* @author Vojta Beran <xmamut@email.cz>
* @author zbynek.krivka@seznam.cz
+ * @author Bohumir Zamecnik <bohumir.zamecnik@gmail.com>
*/
$lang['admin_acl'] = 'Správa přístupových práv';
$lang['acl_group'] = 'Skupina';
diff --git a/lib/plugins/acl/lang/da/lang.php b/lib/plugins/acl/lang/da/lang.php
index f82098dee..4a9d11448 100644
--- a/lib/plugins/acl/lang/da/lang.php
+++ b/lib/plugins/acl/lang/da/lang.php
@@ -13,6 +13,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['admin_acl'] = 'Rettighedsadministration';
$lang['acl_group'] = 'Gruppe';
diff --git a/lib/plugins/acl/lang/de-informal/lang.php b/lib/plugins/acl/lang/de-informal/lang.php
index 3f4b08c2a..05f7df037 100644
--- a/lib/plugins/acl/lang/de-informal/lang.php
+++ b/lib/plugins/acl/lang/de-informal/lang.php
@@ -5,11 +5,11 @@
* @author Alexander Fischer <tbanus@os-forge.net>
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
- * @author Matthias Schulte <post@lupo49.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
* @author Christian Wichmann <nospam@zone0.de>
* @author Pierre Corell <info@joomla-praxis.de>
*/
-$lang['admin_acl'] = 'Zugriffskontrollsystem Management';
+$lang['admin_acl'] = 'Zugangsverwaltung';
$lang['acl_group'] = 'Gruppe';
$lang['acl_user'] = 'Benutzer';
$lang['acl_perms'] = 'Rechte für';
diff --git a/lib/plugins/acl/lang/eo/help.txt b/lib/plugins/acl/lang/eo/help.txt
index cc3f63e5a..488e84a1b 100644
--- a/lib/plugins/acl/lang/eo/help.txt
+++ b/lib/plugins/acl/lang/eo/help.txt
@@ -6,6 +6,6 @@ La maldekstra panelo montras ĉiujn disponeblajn nomspacojn kaj paĝojn.
La suba agordilo permesas al vi rigardi kaj modifi la rajtojn de elektita uzanto aŭ grupo.
-En la suba tabelo ĉiuj aktuale difinitaj alirkontrolaj reguloj estas montritaj. Vi povas uzi ĝin por rapide forigi aŭ ŝanĝi multoblajn regulojn.
+En la suba tabelo ĉiuj aktuale difinitaj alirkontrolaj reguloj estas montrataj. Vi povas uzi ĝin por rapide forigi aŭ ŝanĝi multoblajn regulojn.
-Legado de la [[doku&gt;acl|oficiala dokumentaro pri ACL]] povus helpi vin bone kompreni kiel alirkontrolo funkcias en DokuWiki. \ No newline at end of file
+Legi la [[doku>acl|oficialan dokumentaron pri ACL]] povus helpi vin bone kompreni kiel alirkontrolo funkcias en DokuWiki.
diff --git a/lib/plugins/acl/lang/eo/lang.php b/lib/plugins/acl/lang/eo/lang.php
index 72ce576ee..de75c2dd7 100644
--- a/lib/plugins/acl/lang/eo/lang.php
+++ b/lib/plugins/acl/lang/eo/lang.php
@@ -1,6 +1,6 @@
<?php
/**
- * Esperantolanguage file
+ * Esperanto language file
*
* @author Felipe Castro <fefcas@uol.com.br>
* @author Felipo Kastro <fefcas@gmail.com>
@@ -8,9 +8,7 @@
* @author Robert Bogenschneider <robog@gmx.de>
* @author Erik Pedersen <erik pedersen@shaw.ca>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Robert Bogenschneider <robog@GMX.de>
- * @author Robert BOGENSCHNEIDER <robog@gmx.de>
- * @author Robert BOGENSCHNEIDER <bogi@UEA.org>
+ * @author Robert Bogenschneider <bogi@uea.org>
*/
$lang['admin_acl'] = 'Administrado de Alirkontrola Listo (ACL)';
$lang['acl_group'] = 'Grupo';
@@ -19,13 +17,13 @@ $lang['acl_perms'] = 'Rajtoj por';
$lang['page'] = 'Paĝo';
$lang['namespace'] = 'Nomspaco';
$lang['btn_select'] = 'Elekti';
-$lang['p_user_id'] = 'Uzanto &lt;b class=&quot;acluser&quot;&gt;%s&lt;/b&gt; aktuale havas la jenajn rajtojn en la paĝo &lt;b class=&quot;aclpage&quot;&gt;%s&lt;/b&gt;: &lt;i&gt;%s&lt;/i&gt;.';
-$lang['p_user_ns'] = 'Uzanto &lt;b class=&quot;acluser&quot;&gt;%s&lt;/b&gt; aktuale havas la jenajn rajtojn en la nomspaco &lt;b class=&quot;aclns&quot;&gt;%s&lt;/b&gt;: &lt;i&gt;%s&lt;/i&gt;.';
-$lang['p_group_id'] = 'Anoj de la grupo &lt;b class=&quot;aclgroup&quot;&gt;%s&lt;/b&gt; aktuale havas la jenajn rajtojn en la paĝo &lt;b class=&quot;aclpage&quot;&gt;%s&lt;/b&gt;: &lt;i&gt;%s&lt;/i&gt;.';
-$lang['p_group_ns'] = 'Anoj de la grupo &lt;b class=&quot;aclgroup&quot;&gt;%s&lt;/b&gt; aktuale havas la jenajn rajtojn en la nomspaco &lt;b class=&quot;aclns&quot;&gt;%s&lt;/b&gt;: &lt;i&gt;%s&lt;/i&gt;.';
-$lang['p_choose_id'] = 'Bonvolu &lt;b&gt;enmeti uzanton aŭ grupon&lt;/b&gt; en la suba agordilo por rigardi aŭ redakti la aron da rajtoj por la paĝo &lt;b class=&quot;aclpage&quot;&gt;%s&lt;/b&gt;.';
-$lang['p_choose_ns'] = 'Bonvolu &lt;b&gt;enmeti uzanton aŭ grupon&lt;/b&gt; en la suba agordilo por rigardi aŭ redakti la aron da rajtoj por la nomspaco &lt;b class=&quot;aclns&quot;&gt;%s&lt;/b&gt;.';
-$lang['p_inherited'] = 'Rimarko: tiuj rajtoj ne estis rekte difinitaj, sed ili estis hereditaj el aliaj pli superaj grupoj aŭ nomspacoj.';
+$lang['p_user_id'] = 'Uzanto <b class="acluser">%s</b> aktuale havas la jenajn rajtojn en la paĝo <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_user_ns'] = 'Uzanto <b class="acluser">%s</b> aktuale havas la jenajn rajtojn en la nomspaco <b class="aclns">%s</b>: <i>%s</i>.';
+$lang['p_group_id'] = 'Anoj de la grupo <b class="aclgroup">%s</b> aktuale havas la jenajn rajtojn en la paĝo <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_group_ns'] = 'Anoj de la grupo <b class="aclgroup">%s</b> aktuale havas la jenajn rajtojn en la nomspaco <b class="aclns">%s</b>: <i>%s</i>.';
+$lang['p_choose_id'] = 'Bonvolu <b>enmeti uzanton aŭ grupon</b> en la suban agordilon por rigardi aŭ redakti la aron da rajtoj por la paĝo <b class="aclpage">%s</b>.';
+$lang['p_choose_ns'] = 'Bonvolu <b>enmeti uzanton aŭ grupon</b> en la suban agordilon por rigardi aŭ redakti la aron da rajtoj por la nomspaco <b class="aclns">%s</b>.';
+$lang['p_inherited'] = 'Rimarko: tiuj rajtoj ne estas rekte difinitaj, sed ili herediĝas el aliaj pli supraj grupoj aŭ nomspacoj.';
$lang['p_isadmin'] = 'Rimarko: la elektita grupo aŭ uzanto ĉiam havas plenan rajtaron ĉar ĝi estas difinita kiel superuzanto.';
$lang['p_include'] = 'Plialtaj permesoj inkluzivas malpli altajn. La permesoj por Krei, Alŝuti kaj Forigi nur aplikeblas al nomspacoj, ne al paĝoj.';
$lang['current'] = 'Aktuala regularo ACL';
@@ -38,5 +36,5 @@ $lang['acl_perm2'] = 'Redakti';
$lang['acl_perm4'] = 'Krei';
$lang['acl_perm8'] = 'Alŝuti';
$lang['acl_perm16'] = 'Forigi';
-$lang['acl_new'] = 'Aldoni novan Enmetaĵon';
-$lang['acl_mod'] = 'Modifi Enmetaĵon';
+$lang['acl_new'] = 'Aldoni novan enmetaĵon';
+$lang['acl_mod'] = 'Modifi enmetaĵon';
diff --git a/lib/plugins/acl/lang/es/lang.php b/lib/plugins/acl/lang/es/lang.php
index ee50a7530..8aed3c504 100644
--- a/lib/plugins/acl/lang/es/lang.php
+++ b/lib/plugins/acl/lang/es/lang.php
@@ -22,6 +22,7 @@
* @author emezeta <emezeta@infoprimo.com>
* @author Oscar Ciudad <oscar@jacho.net>
* @author Ruben Figols <ruben.figols@gmail.com>
+ * @author Gerardo Zamudio <gerardo@gerardozamudio.net>
*/
$lang['admin_acl'] = 'Administración de lista de control de acceso';
$lang['acl_group'] = 'Grupo';
diff --git a/lib/plugins/acl/lang/fa/lang.php b/lib/plugins/acl/lang/fa/lang.php
index ed576c271..8b7d72f51 100644
--- a/lib/plugins/acl/lang/fa/lang.php
+++ b/lib/plugins/acl/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['admin_acl'] = 'مدیریت کنترل دسترسی‌ها';
$lang['acl_group'] = 'گروه';
diff --git a/lib/plugins/acl/lang/fr/lang.php b/lib/plugins/acl/lang/fr/lang.php
index a33a52bf0..b1b3188be 100644
--- a/lib/plugins/acl/lang/fr/lang.php
+++ b/lib/plugins/acl/lang/fr/lang.php
@@ -22,6 +22,8 @@
* @author Johan Guilbaud <guilbaud.johan@gmail.com>
* @author schplurtz@laposte.net
* @author skimpax@gmail.com
+ * @author Yannick Aure <yannick.aure@gmail.com>
+ * @author Olivier DUVAL <zorky00@gmail.com>
*/
$lang['admin_acl'] = 'Gestion de la liste des contrôles d\'accès (ACL)';
$lang['acl_group'] = 'Groupe';
diff --git a/lib/plugins/acl/lang/gl/lang.php b/lib/plugins/acl/lang/gl/lang.php
index 774bf207a..db57598e6 100644
--- a/lib/plugins/acl/lang/gl/lang.php
+++ b/lib/plugins/acl/lang/gl/lang.php
@@ -3,6 +3,7 @@
* Galicianlanguage file
*
* @author Medúlio <medulio@ciberirmandade.org>
+ * @author Oscar M. Lage <r0sk10@gmail.com>
*/
$lang['admin_acl'] = 'Xestión da Lista de Control de Acceso (ACL)';
$lang['acl_group'] = 'Grupo';
diff --git a/lib/plugins/acl/lang/it/lang.php b/lib/plugins/acl/lang/it/lang.php
index f789b979f..07e86697d 100644
--- a/lib/plugins/acl/lang/it/lang.php
+++ b/lib/plugins/acl/lang/it/lang.php
@@ -13,6 +13,8 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
+ * @author snarchio@gmail.com
*/
$lang['admin_acl'] = 'Gestione Lista Controllo Accessi (ACL)';
$lang['acl_group'] = 'Gruppo';
diff --git a/lib/plugins/acl/lang/ja/lang.php b/lib/plugins/acl/lang/ja/lang.php
index 831fd2d5c..5bebb58a9 100644
--- a/lib/plugins/acl/lang/ja/lang.php
+++ b/lib/plugins/acl/lang/ja/lang.php
@@ -8,6 +8,7 @@
* @author Ikuo Obataya <i.obataya@gmail.com>
* @author Daniel Dupriest <kououken@gmail.com>
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ * @author Taisuke Shimamoto <dentostar@gmail.com>
*/
$lang['admin_acl'] = 'アクセスコントロール管理';
$lang['acl_group'] = 'グループ';
diff --git a/lib/plugins/acl/lang/ko/help.txt b/lib/plugins/acl/lang/ko/help.txt
index 516198ee5..377636682 100644
--- a/lib/plugins/acl/lang/ko/help.txt
+++ b/lib/plugins/acl/lang/ko/help.txt
@@ -1,11 +1,11 @@
=== 도움말: ===
-현재 페이지에서 위키 네임스페이스와 페이지에 대한 접근 권한을 추가하거나 삭제할 수 있습니다.
+현재 문서에서 위키 이름공간과 문서에 대한 접근 권한을 추가하거나 삭제할 수 있습니다.
-왼쪽 영역을 선택가능한 네임스페이스들과 페이지 목록을 보여줍니다.
+왼쪽 영역에는 선택 가능한 이름공간과 문서 목록을 보여줍니다.
-위쪽 입력 양식에서 선택된 사용자와 그룹의 접근 권한을 보거나 변경할 수 있습니다.
+위쪽 입력 양식에서 선택된 사용자와 그룹의 접근 권한을 보거나 바꿀 수 있습니다.
-아래 테이블에서 현재 설정된 모든 접근 제어 규칙들을 볼 수 있으며, 즉시 여러 규칙들을 삭제하거나 변경할 수 있습니다.
+아래 테이블에서 현재 설정된 모든 접근 제어 규칙을 볼 수 있으며, 즉시 여러 규칙을 삭제하거나 바꿀 수 있습니다.
-DokuWiki에서 접근 제어가 어떻게 동작되는지 알려면 [[doku>acl|official documentation on ACL]] 읽기 바랍니다. \ No newline at end of file
+DokuWiki에서 접근 제어가 어떻게 동작되는지 알아보려면 [[doku>acl|ACL 공식 문서]]를 읽어보기 바랍니다. \ No newline at end of file
diff --git a/lib/plugins/acl/lang/ko/lang.php b/lib/plugins/acl/lang/ko/lang.php
index 6f4e991cb..c8e1ce5cc 100644
--- a/lib/plugins/acl/lang/ko/lang.php
+++ b/lib/plugins/acl/lang/ko/lang.php
@@ -11,32 +11,34 @@
* @author Song Younghwan <purluno@gmail.com>
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
+ * @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['admin_acl'] = '접근 제어 목록 관리';
$lang['acl_group'] = '그룹';
$lang['acl_user'] = '사용자';
$lang['acl_perms'] = '권한';
-$lang['page'] = '페이지';
-$lang['namespace'] = '네임스페이스';
+$lang['page'] = '문서';
+$lang['namespace'] = '이름공간';
$lang['btn_select'] = '선택';
-$lang['p_user_id'] = '사용자 <b class="acluser">%s</b>는 현재 <b class="aclpage">%s</b>: <i>%s</i> 페이지 접근이 가능합니다.';
-$lang['p_user_ns'] = '사용자 <b class="acluser">%s</b>는 현재 <b class="aclns">%s</b>: <i>%s</i> 네임스페이스 접근이 가능합니다.';
-$lang['p_group_id'] = '그룹 <b class="aclgroup">%s</b> 사용자는 현재 <b class="aclpage">%s</b>: <i>%s</i> 페이지 접근이 가능합니다.';
-$lang['p_group_ns'] = '그룹 <b class="aclgroup">%s</b> 사용자는 현재 <b class="aclns">%s</b>: <i>%s</i> 네임스페이스 접근이 가능합니다.';
-$lang['p_choose_id'] = '<b class="aclpage">%s</b> 페이지 접근 권한을 보거나 변경하려면 <b>사용자</b>나 <b>그룹</b>을 위 양식에 입력하기 바랍니다.';
-$lang['p_choose_ns'] = '<b class="aclns">%s</b> 네임스페이스 접근 권한을 보거나 변경하려면 <b>사용자</b>나 <b>그룹</b>을 위 양식에 입력하기 바랍니다.';
-$lang['p_inherited'] = '주의: 권한이 명시적으로 설정되지 않았으므로 다른 그룹들이나 상위 네임스페이스로 부터 가져왔습니다.';
-$lang['p_isadmin'] = '주의: 슈퍼유저로 설정되어 있으므로 선택된 그룹이나 사용자는 언제나 모든 접근 권한을 가집니다.';
-$lang['p_include'] = '더 높은 접근권한은 하위를 포함합니다. 페이지가 아닌 네임스페이스에는 생성, 업로드, 삭제 권한만 적용됩니다.';
-$lang['current'] = '현 ACL 규칙';
-$lang['where'] = '페이지/네임스페이스';
+$lang['p_user_id'] = '<b class="acluser">%s</b> 사용자는 현재 <b class="aclpage">%s</b>: <i>%s</i> 문서 접근이 가능합니다.';
+$lang['p_user_ns'] = '<b class="acluser">%s</b> 사용자는 현재 <b class="aclns">%s</b>: <i>%s</i> 이름공간 접근이 가능합니다.';
+$lang['p_group_id'] = '<b class="aclgroup">%s</b> 그룹 구성원은 현재 <b class="aclpage">%s</b>: <i>%s</i> 문서 접근이 가능합니다.';
+$lang['p_group_ns'] = '<b class="aclgroup">%s</b> 그룹 구성원은 현재 <b class="aclns">%s</b>: <i>%s</i> 이름공간 접근이 가능합니다.';
+$lang['p_choose_id'] = '<b class="aclpage">%s</b> 문서 접근 권한을 보거나 바꾸려면 <b>사용자</b>나 <b>그룹</b>을 위 양식에 입력하기 바랍니다.';
+$lang['p_choose_ns'] = '<b class="aclns">%s</b> 이름공간 접근 권한을 보거나 바꾸려면 <b>사용자</b>나 <b>그룹</b>을 위 양식에 입력하기 바랍니다.';
+$lang['p_inherited'] = '참고: 권한이 명시적으로 설정되지 않았으므로 다른 그룹이나 상위 이름공간으로부터 가져왔습니다.';
+$lang['p_isadmin'] = '참고: 슈퍼유저로 설정되어 있으므로 선택된 그룹이나 사용자는 언제나 모든 접근 권한을 가집니다.';
+$lang['p_include'] = '더 높은 접근 권한은 하위를 포함합니다. 문서가 아닌 이름공간에는 만들기, 올리기, 삭제 권한만 적용됩니다.';
+$lang['current'] = '현재 ACL 규칙';
+$lang['where'] = '문서/이름공간';
$lang['who'] = '사용자/그룹';
$lang['perm'] = '접근 권한';
$lang['acl_perm0'] = '없음';
$lang['acl_perm1'] = '읽기';
-$lang['acl_perm2'] = '수정';
-$lang['acl_perm4'] = '생성';
-$lang['acl_perm8'] = '업로드';
+$lang['acl_perm2'] = '편집';
+$lang['acl_perm4'] = '만들기';
+$lang['acl_perm8'] = '올리기';
$lang['acl_perm16'] = '삭제';
$lang['acl_new'] = '새 항목 추가';
$lang['acl_mod'] = '선택 항목 변경';
diff --git a/lib/plugins/acl/lang/nl/lang.php b/lib/plugins/acl/lang/nl/lang.php
index cb0765505..567eb46dc 100644
--- a/lib/plugins/acl/lang/nl/lang.php
+++ b/lib/plugins/acl/lang/nl/lang.php
@@ -18,6 +18,7 @@
* @author Timon Van Overveldt <timonvo@gmail.com>
* @author Jeroen
* @author Ricardo Guijt <ricardoguijt@gmail.com>
+ * @author Gerrit <klapinklapin@gmail.com>
*/
$lang['admin_acl'] = 'Toegangsrechten';
$lang['acl_group'] = 'Groep';
diff --git a/lib/plugins/acl/lang/pl/lang.php b/lib/plugins/acl/lang/pl/lang.php
index 1b10b5232..bef2d2615 100644
--- a/lib/plugins/acl/lang/pl/lang.php
+++ b/lib/plugins/acl/lang/pl/lang.php
@@ -13,6 +13,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['admin_acl'] = 'Zarządzanie uprawnieniami';
$lang['acl_group'] = 'Grupa';
diff --git a/lib/plugins/acl/lang/ro/lang.php b/lib/plugins/acl/lang/ro/lang.php
index 0c13d7223..4d093216b 100644
--- a/lib/plugins/acl/lang/ro/lang.php
+++ b/lib/plugins/acl/lang/ro/lang.php
@@ -9,6 +9,8 @@
* @author Emanuel-Emeric Andraşi <em.andrasi@mandrivausers.ro>
* @author Emanuel-Emeric Andrasi <em.andrasi@mandrivausers.ro>
* @author Marius OLAR <olarmariusalex@gmail.com>
+ * @author Marius Olar <olarmariusalex@yahoo.com>
+ * @author Emanuel-Emeric Andrași <em.andrasi@mandrivausers.ro>
*/
$lang['admin_acl'] = 'Managementul Listei de Control a Accesului';
$lang['acl_group'] = 'Grup';
diff --git a/lib/plugins/acl/lang/ru/lang.php b/lib/plugins/acl/lang/ru/lang.php
index 6d04dde21..15ba78ef6 100644
--- a/lib/plugins/acl/lang/ru/lang.php
+++ b/lib/plugins/acl/lang/ru/lang.php
@@ -15,6 +15,7 @@
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
* @author Ladyko Andrey <fylh@succexy.spb.ru>
* @author Eugene <windy.wanderer@gmail.com>
+ * @author Johnny Utah <pcpa@cyberpunk.su>
*/
$lang['admin_acl'] = 'Управление списками контроля доступа';
$lang['acl_group'] = 'Группа';
diff --git a/lib/plugins/acl/lang/sl/help.txt b/lib/plugins/acl/lang/sl/help.txt
index eada41c29..ff096ae0e 100644
--- a/lib/plugins/acl/lang/sl/help.txt
+++ b/lib/plugins/acl/lang/sl/help.txt
@@ -1,11 +1,11 @@
-=== Hitra pomo ===
+=== Hitra pomoč ===
-Na tej strani je mogoe dodajati, odstranjevati in spreminjati dovoljenja za delo z wiki stranmi in imenskimi prostori.
+Na tej strani je mogoče dodajati, odstranjevati in spreminjati dovoljenja za delo z wiki stranmi in imenskimi prostori.
Na veli strani so izpisani vsi imenski prostori in strani.
-Na obrazcu zgoraj je mogoe pregledovati in spreminjati dovoljenja za izbranega uporabnika ali skupino.
+Na obrazcu zgoraj je mogoče pregledovati in spreminjati dovoljenja za izbranega uporabnika ali skupino.
-V preglednici spodaj so prikazana vsa pravila nadzora. Ta je mogoe hitro spreminjati ali brisati.
+V preglednici spodaj so prikazana vsa pravila nadzora. Ta je mogoče hitro spreminjati ali brisati.
-Ve podrobnosti o delovanju nadzora dostopa sistema DokuWiki je mogoe najti v [[doku>acl|uradni dokumentaciji ACL]].
+Več podrobnosti o delovanju nadzora dostopa sistema DokuWiki je mogoče najti v [[doku>acl|uradni dokumentaciji ACL]].
diff --git a/lib/plugins/acl/lang/sl/lang.php b/lib/plugins/acl/lang/sl/lang.php
index 3fb391570..44e45e491 100644
--- a/lib/plugins/acl/lang/sl/lang.php
+++ b/lib/plugins/acl/lang/sl/lang.php
@@ -5,7 +5,7 @@
* @author Dejan Levec <webphp@gmail.com>
* @author Boštjan Seničar <senicar@gmail.com>
* @author Gregor Skumavc (grega.skumavc@gmail.com)
- * @author Matej Urbančič (mateju@svn.gnome.org)
+ * @author Matej Urbančič (mateju@svn.gnome.org)
*/
$lang['admin_acl'] = 'Upravljanje dostopa';
$lang['acl_group'] = 'Skupina';
diff --git a/lib/plugins/acl/lang/vi/help.txt b/lib/plugins/acl/lang/vi/help.txt
new file mode 100644
index 000000000..23e258678
--- /dev/null
+++ b/lib/plugins/acl/lang/vi/help.txt
@@ -0,0 +1,12 @@
+=== Trợ giúp nhanh: ===
+
+Trang này giúp bạn thêm hoặc xóa quyền được cấp cho 1 thư mục hoặc trang wiki của bạn.
+
+Của sổ bên trái hiển thị tất cả các thư mục và trang văn bản.
+
+Khung trên đây cho phép bạn xem và sửa quyền của một nhóm hoặc thành viên đã chọn.
+
+Bảng bên dưới hiển thị tất cả các quyền được cấp. Bạn có thể sửa hoặc hóa các quyền đó một cách nhanh chóng.
+
+Đọc [[doku>acl|tài liệu chính thức về ACL]] sẽ giúp bạn hiểu hơn về cách phân quyền ở DokuWiki.
+
diff --git a/lib/plugins/acl/lang/vi/lang.php b/lib/plugins/acl/lang/vi/lang.php
index 6237f79ba..ddf764dca 100644
--- a/lib/plugins/acl/lang/vi/lang.php
+++ b/lib/plugins/acl/lang/vi/lang.php
@@ -3,19 +3,42 @@
* vietnamese language file
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author James Do <jdo@myrealbox.com>
+ * @author NukeViet <admin@nukeviet.vn>
*/
-$lang['admin_acl'] = 'Quản lý phép truy nhật {Access Control List}';
+$lang['admin_acl'] = 'Quản lý danh sách quyền truy cập';
$lang['acl_group'] = 'Nhóm';
-$lang['acl_user'] = 'Người';
-$lang['acl_perms'] = 'Phép truy nhập cho';
+$lang['acl_user'] = 'Thành viên';
+$lang['acl_perms'] = 'Cấp phép cho';
$lang['page'] = 'Trang';
-$lang['namespace'] = 'Không gian tên';
+$lang['namespace'] = 'Thư mục';
+$lang['btn_select'] = 'Chọn';
+
+$lang['p_user_id'] = 'Thành viên <b class="acluser">%s</b> hiện tại được cấp phép cho trang <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_user_ns'] = 'Thành viên <b class="acluser">%s</b> hiện tại được cấp phép cho thư mục <b class="aclns">%s</b>: <i>%s</i>.';
+$lang['p_group_id'] = 'Thành viên trong nhóm <b class="aclgroup">%s</b> hiện tại được cấp phép cho trang <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_group_ns'] = 'Thành viên trong nhóm <b class="aclgroup">%s</b> hiện tại được cấp phép cho thư mục <b class="aclns">%s</b>: <i>%s</i>.';
+
+$lang['p_choose_id'] = 'Hãy <b>nhập tên thành viên hoặc nhóm</b> vào ô trên đây để xem hoặc sửa quyền đã thiết đặt cho trang <b class="aclpage">%s</b>.';
+$lang['p_choose_ns'] = 'Hãy <b>nhập tên thành viên hoặc nhóm</b> vào ô trên đây để xem hoặc sửa quyền đã thiết đặt cho thư mục <b class="aclns">%s</b>.';
+
+
+$lang['p_inherited'] = 'Ghi chú: Có những quyền không được thể hiện ở đây nhưng nó được cấp phép từ những nhóm hoặc thư mục cấp cao.';
+$lang['p_isadmin'] = 'Ghi chú: Nhóm hoặc thành viên này luôn được cấp đủ quyền vì họ là Quản trị tối cao';
+$lang['p_include'] = 'Một số quyền thấp được thể hiện ở mức cao hơn. Quyền tạo, tải lên và xóa chỉ dành cho thư mục, không dành cho trang.';
+
+$lang['current'] = 'Danh sách quyền truy cập hiện tại';
+$lang['where'] = 'Trang/Thư mục';
+$lang['who'] = 'Thành viên/Nhóm';
+$lang['perm'] = 'Quyền';
+
+$lang['acl_perm0'] = 'Không';
$lang['acl_perm1'] = 'Đọc';
-$lang['acl_perm2'] = 'Biên soạn';
+$lang['acl_perm2'] = 'Sửa';
$lang['acl_perm4'] = 'Tạo';
$lang['acl_perm8'] = 'Tải lên';
+$lang['acl_perm16'] = 'Xóa';
$lang['acl_new'] = 'Thêm mục mới';
+$lang['acl_mod'] = 'Sửa';
//Setup VIM: ex: et ts=2 :
diff --git a/lib/plugins/acl/lang/zh-tw/help.txt b/lib/plugins/acl/lang/zh-tw/help.txt
index bc1bddb00..d5d031059 100644
--- a/lib/plugins/acl/lang/zh-tw/help.txt
+++ b/lib/plugins/acl/lang/zh-tw/help.txt
@@ -1,12 +1,11 @@
=== 快速指南: ===
-你可以用這個頁面為維基中的命名空間或頁面增加或移除權限。
+你可以用這個頁面為維基中的分類空間或頁面增加或移除權限。
-左方面板顯示了所有命名空間和頁面。
+左方面板顯示了所有分類空間和頁面。
上方表格允許你觀看及修改選取的使用者或群組的權限。
下方表格顯示了目前所有的存取控制表 (ACL),你可以用它快速刪除或更改多項規則。
閱讀 [[doku>acl|official documentation on ACL]] 可以幫助你完整地了解 DokuWiki 存取控制的運作。
-
diff --git a/lib/plugins/acl/lang/zh-tw/lang.php b/lib/plugins/acl/lang/zh-tw/lang.php
index 085537864..ff115df18 100644
--- a/lib/plugins/acl/lang/zh-tw/lang.php
+++ b/lib/plugins/acl/lang/zh-tw/lang.php
@@ -11,25 +11,26 @@
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
* @author Danny Lin <danny0838@pchome.com.tw>
* @author Shuo-Ting Jian <shoting@gmail.com>
+ * @author syaoranhinata@gmail.com
*/
$lang['admin_acl'] = '管理存取控制表 (ACL)';
$lang['acl_group'] = '群組';
$lang['acl_user'] = '使用者';
$lang['acl_perms'] = '設定權限於';
$lang['page'] = '頁面';
-$lang['namespace'] = '命名空間';
+$lang['namespace'] = '分類空間';
$lang['btn_select'] = '選擇';
$lang['p_user_id'] = '使用者 <b class="acluser">%s</b> 目前在頁面 <b class="aclpage">%s</b> 擁有以下權限:<i>%s</i>。';
-$lang['p_user_ns'] = '使用者 <b class=\"acluser\">%s</b> 目前在命名空間 <b class=\"aclns\">%s</b> 擁有以下權限:<i>%s</i>。';
+$lang['p_user_ns'] = '使用者 <b class=\"acluser\">%s</b> 目前在分類空間 <b class=\"aclns\">%s</b> 擁有以下權限:<i>%s</i>。';
$lang['p_group_id'] = '群組 <b class="aclgroup">%s</b> 的成員目前在頁面 <b class="aclpage">%s</b> 擁有以下權限:<i>%s</i>。';
-$lang['p_group_ns'] = '群組 <b class=\"aclgroup\">%s</b> 的成員目前在命名空間 <b class=\"aclns\">%s</b> 擁有以下權限:<i>%s</i>。';
+$lang['p_group_ns'] = '群組 <b class=\"aclgroup\">%s</b> 的成員目前在分類空間 <b class=\"aclns\">%s</b> 擁有以下權限:<i>%s</i>。';
$lang['p_choose_id'] = '請在上方表格<b>輸入使用者或群組</b>以檢視或編輯頁面 <b class="aclpage">%s</b> 的權限設定。';
-$lang['p_choose_ns'] = '請在上方表格<b>輸入使用者或群組</b>以檢視或編輯命名空間 <b class=\"aclns\">%s</b> 的權限設定。';
-$lang['p_inherited'] = '注意:這些權限並未明確指定,而是從群組或上層的命名空間繼承而來。';
+$lang['p_choose_ns'] = '請在上方表格<b>輸入使用者或群組</b>以檢視或編輯分類空間 <b class=\"aclns\">%s</b> 的權限設定。';
+$lang['p_inherited'] = '注意:這些權限並未明確指定,而是從群組或上層的分類空間繼承而來。';
$lang['p_isadmin'] = '注意:選取的群組或使用者擁有完整權限,因為它被設定為超級使用者。';
-$lang['p_include'] = '較高的權限亦包含了較低的權限。新增、上傳與刪除權限只能設定在命名空間,不能設定在頁面。';
+$lang['p_include'] = '較高的權限亦包含了較低的權限。新增、上傳與刪除權限只能設定在分類空間,不能設定在頁面。';
$lang['current'] = '目前的存取控制規則';
-$lang['where'] = '頁面/命名空間';
+$lang['where'] = '頁面/分類空間';
$lang['who'] = '使用者/群組';
$lang['perm'] = '權限';
$lang['acl_perm0'] = '無';
diff --git a/lib/plugins/acl/plugin.info.txt b/lib/plugins/acl/plugin.info.txt
index f108a2390..42babd71c 100644
--- a/lib/plugins/acl/plugin.info.txt
+++ b/lib/plugins/acl/plugin.info.txt
@@ -1,6 +1,7 @@
+base acl
author Andreas Gohr
email andi@splitbrain.org
-date 2011-04-16
+date 2012-09-06
name ACL Manager
desc Manage Page Access Control Lists
url http://dokuwiki.org/plugin:acl
diff --git a/lib/plugins/acl/rtl.css b/lib/plugins/acl/rtl.css
deleted file mode 100644
index e79abe596..000000000
--- a/lib/plugins/acl/rtl.css
+++ /dev/null
@@ -1,40 +0,0 @@
-div#acl_manager div#acl__tree {
- float: right;
- text-align: right;
-}
-
-div#acl_manager div#acl__tree li {
- padding-left: 0em;
- padding-right: 1em;
-}
-
-div#acl_manager div#acl__tree ul img {
- margin-left: 0.25em;
- margin-right: 0em;
-}
-
-
-div#acl_manager div#acl__detail {
- float: left;
-}
-
-div#acl_manager .aclgroup {
- background: transparent url(pix/group.png) right 1px no-repeat;
- padding: 1px 18px 1px 0px;
-}
-
-div#acl_manager .acluser {
- background: transparent url(pix/user.png) right 1px no-repeat;
- padding: 1px 18px 1px 0px;
-}
-
-div#acl_manager .aclpage {
- background: transparent url(pix/page.png) right 1px no-repeat;
- padding: 1px 18px 1px 0px;
-}
-
-div#acl_manager .aclns {
- background: transparent url(pix/ns.png) right 1px no-repeat;
- padding: 1px 18px 1px 0px;
-}
-
diff --git a/lib/plugins/acl/style.css b/lib/plugins/acl/style.css
index b7154aa78..f4277c341 100644
--- a/lib/plugins/acl/style.css
+++ b/lib/plugins/acl/style.css
@@ -8,6 +8,10 @@ div#acl_manager div#acl__tree {
border: 1px solid __border__;
text-align: left;
}
+[dir=rtl] div#acl_manager div#acl__tree {
+ float: right;
+ text-align: right;
+}
div#acl_manager div#acl__tree a.cur {
background-color: __highlight__;
@@ -24,11 +28,19 @@ div#acl_manager div#acl__tree li {
padding-left: 1em;
list-style-image: none;
}
+[dir=rtl] div#acl_manager div#acl__tree li {
+ padding-left: 0em;
+ padding-right: 1em;
+}
div#acl_manager div#acl__tree ul img {
margin-right: 0.25em;
cursor: pointer;
}
+[dir=rtl] div#acl_manager div#acl__tree ul img {
+ margin-left: 0.25em;
+ margin-right: 0em;
+}
div#acl_manager div#acl__detail {
width: 73%;
@@ -36,6 +48,9 @@ div#acl_manager div#acl__detail {
float: right;
overflow: auto;
}
+[dir=rtl] div#acl_manager div#acl__detail {
+ float: left;
+}
div#acl_manager div#acl__detail fieldset {
width: 90%;
@@ -52,25 +67,53 @@ div#acl_manager table.inline {
margin: 0;
}
+#acl_manager table .check {
+ text-align: center;
+}
+
+#acl_manager table .action {
+ text-align: right;
+}
+
div#acl_manager .aclgroup {
background: transparent url(pix/group.png) 0px 1px no-repeat;
padding: 1px 0px 1px 18px;
}
+[dir=rtl] div#acl_manager .aclgroup {
+ background: transparent url(pix/group.png) right 1px no-repeat;
+ padding: 1px 18px 1px 0px;
+ display: inline-block; /* needed for IE7 */
+}
div#acl_manager .acluser {
background: transparent url(pix/user.png) 0px 1px no-repeat;
padding: 1px 0px 1px 18px;
}
+[dir=rtl] div#acl_manager .acluser {
+ background: transparent url(pix/user.png) right 1px no-repeat;
+ padding: 1px 18px 1px 0px;
+ display: inline-block; /* needed for IE7 */
+}
div#acl_manager .aclpage {
background: transparent url(pix/page.png) 0px 1px no-repeat;
padding: 1px 0px 1px 18px;
}
+[dir=rtl] div#acl_manager .aclpage {
+ background: transparent url(pix/page.png) right 1px no-repeat;
+ padding: 1px 18px 1px 0px;
+ display: inline-block; /* needed for IE7 */
+}
div#acl_manager .aclns {
background: transparent url(pix/ns.png) 0px 1px no-repeat;
padding: 1px 0px 1px 18px;
}
+[dir=rtl] div#acl_manager .aclns {
+ background: transparent url(pix/ns.png) right 1px no-repeat;
+ padding: 1px 18px 1px 0px;
+ display: inline-block; /* needed for IE7 */
+}
div#acl_manager label.disabled {
color: __text_neu__!important;
diff --git a/lib/plugins/auth.php b/lib/plugins/auth.php
index 59631143f..637435252 100644
--- a/lib/plugins/auth.php
+++ b/lib/plugins/auth.php
@@ -2,411 +2,405 @@
/**
* Auth Plugin Prototype
*
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Jan Schumann <js@jschumann-it.com>
- */
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-/**
- * auth/basic.class.php
- *
* foundation authorisation class
* all auth classes should inherit from this class
*
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Chris Smith <chris@jalakai.co.uk>
* @author Jan Schumann <js@jschumann-it.com>
- */
-class DokuWiki_Auth_Plugin extends DokuWiki_Plugin {
- var $success = true;
+ */
+// must be run within Dokuwiki
+if(!defined('DOKU_INC')) die();
+class DokuWiki_Auth_Plugin extends DokuWiki_Plugin {
+ var $success = true;
- /**
- * Posible things an auth backend module may be able to
- * do. The things a backend can do need to be set to true
- * in the constructor.
- */
- var $cando = array (
- 'addUser' => false, // can Users be created?
- 'delUser' => false, // can Users be deleted?
- 'modLogin' => false, // can login names be changed?
- 'modPass' => false, // can passwords be changed?
- 'modName' => false, // can real names be changed?
- 'modMail' => false, // can emails be changed?
- 'modGroups' => false, // can groups be changed?
- 'getUsers' => false, // can a (filtered) list of users be retrieved?
- 'getUserCount'=> false, // can the number of users be retrieved?
- 'getGroups' => false, // can a list of available groups be retrieved?
- 'external' => false, // does the module do external auth checking?
- 'logout' => true, // can the user logout again? (eg. not possible with HTTP auth)
- );
+ /**
+ * Posible things an auth backend module may be able to
+ * do. The things a backend can do need to be set to true
+ * in the constructor.
+ */
+ var $cando = array (
+ 'addUser' => false, // can Users be created?
+ 'delUser' => false, // can Users be deleted?
+ 'modLogin' => false, // can login names be changed?
+ 'modPass' => false, // can passwords be changed?
+ 'modName' => false, // can real names be changed?
+ 'modMail' => false, // can emails be changed?
+ 'modGroups' => false, // can groups be changed?
+ 'getUsers' => false, // can a (filtered) list of users be retrieved?
+ 'getUserCount'=> false, // can the number of users be retrieved?
+ 'getGroups' => false, // can a list of available groups be retrieved?
+ 'external' => false, // does the module do external auth checking?
+ 'logout' => true, // can the user logout again? (eg. not possible with HTTP auth)
+ );
+ /**
+ * Constructor.
+ *
+ * Carry out sanity checks to ensure the object is
+ * able to operate. Set capabilities in $this->cando
+ * array here
+ *
+ * Set $this->success to false if checks fail
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ */
+ function __construct() {
+ // the base class constructor does nothing, derived class
+ // constructors do the real work
+ }
- /**
- * Constructor.
- *
- * Carry out sanity checks to ensure the object is
- * able to operate. Set capabilities in $this->cando
- * array here
- *
- * Set $this->success to false if checks fail
- *
- * @author Christopher Smith <chris@jalakai.co.uk>
- */
- function auth_basic() {
- // the base class constructor does nothing, derived class
- // constructors do the real work
- }
+ /**
+ * Capability check. [ DO NOT OVERRIDE ]
+ *
+ * Checks the capabilities set in the $this->cando array and
+ * some pseudo capabilities (shortcutting access to multiple
+ * ones)
+ *
+ * ususal capabilities start with lowercase letter
+ * shortcut capabilities start with uppercase letter
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @return bool
+ */
+ function canDo($cap) {
+ switch($cap){
+ case 'Profile':
+ // can at least one of the user's properties be changed?
+ return ( $this->cando['modPass'] ||
+ $this->cando['modName'] ||
+ $this->cando['modMail'] );
+ break;
+ case 'UserMod':
+ // can at least anything be changed?
+ return ( $this->cando['modPass'] ||
+ $this->cando['modName'] ||
+ $this->cando['modMail'] ||
+ $this->cando['modLogin'] ||
+ $this->cando['modGroups'] ||
+ $this->cando['modMail'] );
+ break;
+ default:
+ // print a helping message for developers
+ if(!isset($this->cando[$cap])){
+ msg("Check for unknown capability '$cap' - Do you use an outdated Plugin?",-1);
+ }
+ return $this->cando[$cap];
+ }
+ }
- /**
- * Capability check. [ DO NOT OVERRIDE ]
- *
- * Checks the capabilities set in the $this->cando array and
- * some pseudo capabilities (shortcutting access to multiple
- * ones)
- *
- * ususal capabilities start with lowercase letter
- * shortcut capabilities start with uppercase letter
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @return bool
- */
- function canDo($cap) {
- switch($cap){
- case 'Profile':
- // can at least one of the user's properties be changed?
- return ( $this->cando['modPass'] ||
- $this->cando['modName'] ||
- $this->cando['modMail'] );
- break;
- case 'UserMod':
- // can at least anything be changed?
- return ( $this->cando['modPass'] ||
- $this->cando['modName'] ||
- $this->cando['modMail'] ||
- $this->cando['modLogin'] ||
- $this->cando['modGroups'] ||
- $this->cando['modMail'] );
- break;
- default:
- // print a helping message for developers
- if(!isset($this->cando[$cap])){
- msg("Check for unknown capability '$cap' - Do you use an outdated Plugin?",-1);
+ /**
+ * Trigger the AUTH_USERDATA_CHANGE event and call the modification function. [ DO NOT OVERRIDE ]
+ *
+ * You should use this function instead of calling createUser, modifyUser or
+ * deleteUsers directly. The event handlers can prevent the modification, for
+ * example for enforcing a user name schema.
+ *
+ * @author Gabriel Birke <birke@d-scribe.de>
+ * @param string $type Modification type ('create', 'modify', 'delete')
+ * @param array $params Parameters for the createUser, modifyUser or deleteUsers method. The content of this array depends on the modification type
+ * @return mixed Result from the modification function or false if an event handler has canceled the action
+ */
+ function triggerUserMod($type, $params) {
+ $validTypes = array(
+ 'create' => 'createUser',
+ 'modify' => 'modifyUser',
+ 'delete' => 'deleteUsers'
+ );
+ if(empty($validTypes[$type]))
+ return false;
+ $eventdata = array('type' => $type, 'params' => $params, 'modification_result' => null);
+ $evt = new Doku_Event('AUTH_USER_CHANGE', $eventdata);
+ if ($evt->advise_before(true)) {
+ $result = call_user_func_array(array($this, $validTypes[$type]), $params);
+ $evt->data['modification_result'] = $result;
}
- return $this->cando[$cap];
+ $evt->advise_after();
+ unset($evt);
+ return $result;
}
- }
- /**
- * Trigger the AUTH_USERDATA_CHANGE event and call the modification function. [ DO NOT OVERRIDE ]
- *
- * You should use this function instead of calling createUser, modifyUser or
- * deleteUsers directly. The event handlers can prevent the modification, for
- * example for enforcing a user name schema.
- *
- * @author Gabriel Birke <birke@d-scribe.de>
- * @param string $type Modification type ('create', 'modify', 'delete')
- * @param array $params Parameters for the createUser, modifyUser or deleteUsers method. The content of this array depends on the modification type
- * @return mixed Result from the modification function or false if an event handler has canceled the action
- */
- function triggerUserMod($type, $params)
- {
- $validTypes = array(
- 'create' => 'createUser',
- 'modify' => 'modifyUser',
- 'delete' => 'deleteUsers'
- );
- if(empty($validTypes[$type]))
- return false;
- $eventdata = array('type' => $type, 'params' => $params, 'modification_result' => null);
- $evt = new Doku_Event('AUTH_USER_CHANGE', $eventdata);
- if ($evt->advise_before(true)) {
- $result = call_user_func_array(array($this, $validTypes[$type]), $params);
- $evt->data['modification_result'] = $result;
+ /**
+ * Log off the current user [ OPTIONAL ]
+ *
+ * Is run in addition to the ususal logoff method. Should
+ * only be needed when trustExternal is implemented.
+ *
+ * @see auth_logoff()
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function logOff(){
}
- $evt->advise_after();
- unset($evt);
- return $result;
- }
- /**
- * Log off the current user [ OPTIONAL ]
- *
- * Is run in addition to the ususal logoff method. Should
- * only be needed when trustExternal is implemented.
- *
- * @see auth_logoff()
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- function logOff(){
- }
+ /**
+ * Do all authentication [ OPTIONAL ]
+ *
+ * Set $this->cando['external'] = true when implemented
+ *
+ * If this function is implemented it will be used to
+ * authenticate a user - all other DokuWiki internals
+ * will not be used for authenticating, thus
+ * implementing the checkPass() function is not needed
+ * anymore.
+ *
+ * The function can be used to authenticate against third
+ * party cookies or Apache auth mechanisms and replaces
+ * the auth_login() function
+ *
+ * The function will be called with or without a set
+ * username. If the Username is given it was called
+ * from the login form and the given credentials might
+ * need to be checked. If no username was given it
+ * the function needs to check if the user is logged in
+ * by other means (cookie, environment).
+ *
+ * The function needs to set some globals needed by
+ * DokuWiki like auth_login() does.
+ *
+ * @see auth_login()
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $user Username
+ * @param string $pass Cleartext Password
+ * @param bool $sticky Cookie should not expire
+ * @return bool true on successful auth
+ */
+ function trustExternal($user,$pass,$sticky=false){
+ /* some example:
- /**
- * Do all authentication [ OPTIONAL ]
- *
- * Set $this->cando['external'] = true when implemented
- *
- * If this function is implemented it will be used to
- * authenticate a user - all other DokuWiki internals
- * will not be used for authenticating, thus
- * implementing the checkPass() function is not needed
- * anymore.
- *
- * The function can be used to authenticate against third
- * party cookies or Apache auth mechanisms and replaces
- * the auth_login() function
- *
- * The function will be called with or without a set
- * username. If the Username is given it was called
- * from the login form and the given credentials might
- * need to be checked. If no username was given it
- * the function needs to check if the user is logged in
- * by other means (cookie, environment).
- *
- * The function needs to set some globals needed by
- * DokuWiki like auth_login() does.
- *
- * @see auth_login()
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string $user Username
- * @param string $pass Cleartext Password
- * @param bool $sticky Cookie should not expire
- * @return bool true on successful auth
- */
- function trustExternal($user,$pass,$sticky=false){
-# // some example:
-#
-# global $USERINFO;
-# global $conf;
-# $sticky ? $sticky = true : $sticky = false; //sanity check
-#
-# // do the checking here
-#
-# // set the globals if authed
-# $USERINFO['name'] = 'FIXME';
-# $USERINFO['mail'] = 'FIXME';
-# $USERINFO['grps'] = array('FIXME');
-# $_SERVER['REMOTE_USER'] = $user;
-# $_SESSION[DOKU_COOKIE]['auth']['user'] = $user;
-# $_SESSION[DOKU_COOKIE]['auth']['pass'] = $pass;
-# $_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO;
-# return true;
- }
+ global $USERINFO;
+ global $conf;
+ $sticky ? $sticky = true : $sticky = false; //sanity check
- /**
- * Check user+password [ MUST BE OVERRIDDEN ]
- *
- * Checks if the given user exists and the given
- * plaintext password is correct
- *
- * May be ommited if trustExternal is used.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @return bool
- */
- function checkPass($user,$pass){
- msg("no valid authorisation system in use", -1);
- return false;
- }
+ // do the checking here
- /**
- * Return user info [ MUST BE OVERRIDDEN ]
- *
- * Returns info about the given user needs to contain
- * at least these fields:
- *
- * name string full name of the user
- * mail string email addres of the user
- * grps array list of groups the user is in
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @return array containing user data or false
- */
- function getUserData($user) {
- if(!$this->cando['external']) msg("no valid authorisation system in use", -1);
- return false;
- }
+ // set the globals if authed
+ $USERINFO['name'] = 'FIXME';
+ $USERINFO['mail'] = 'FIXME';
+ $USERINFO['grps'] = array('FIXME');
+ $_SERVER['REMOTE_USER'] = $user;
+ $_SESSION[DOKU_COOKIE]['auth']['user'] = $user;
+ $_SESSION[DOKU_COOKIE]['auth']['pass'] = $pass;
+ $_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO;
+ return true;
- /**
- * Create a new User [implement only where required/possible]
- *
- * Returns false if the user already exists, null when an error
- * occurred and true if everything went well.
- *
- * The new user HAS TO be added to the default group by this
- * function!
- *
- * Set addUser capability when implemented
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- function createUser($user,$pass,$name,$mail,$grps=null){
- msg("authorisation method does not allow creation of new users", -1);
- return null;
- }
+ */
+ }
- /**
- * Modify user data [implement only where required/possible]
- *
- * Set the mod* capabilities according to the implemented features
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- * @param $user nick of the user to be changed
- * @param $changes array of field/value pairs to be changed (password will be clear text)
- * @return bool
- */
- function modifyUser($user, $changes) {
- msg("authorisation method does not allow modifying of user data", -1);
- return false;
- }
+ /**
+ * Check user+password [ MUST BE OVERRIDDEN ]
+ *
+ * Checks if the given user exists and the given
+ * plaintext password is correct
+ *
+ * May be ommited if trustExternal is used.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @return bool
+ */
+ function checkPass($user,$pass){
+ msg("no valid authorisation system in use", -1);
+ return false;
+ }
- /**
- * Delete one or more users [implement only where required/possible]
- *
- * Set delUser capability when implemented
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- * @param array $users
- * @return int number of users deleted
- */
- function deleteUsers($users) {
- msg("authorisation method does not allow deleting of users", -1);
- return false;
- }
+ /**
+ * Return user info [ MUST BE OVERRIDDEN ]
+ *
+ * Returns info about the given user needs to contain
+ * at least these fields:
+ *
+ * name string full name of the user
+ * mail string email addres of the user
+ * grps array list of groups the user is in
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @return array containing user data or false
+ */
+ function getUserData($user) {
+ if(!$this->cando['external']) msg("no valid authorisation system in use", -1);
+ return false;
+ }
- /**
- * Return a count of the number of user which meet $filter criteria
- * [should be implemented whenever retrieveUsers is implemented]
- *
- * Set getUserCount capability when implemented
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- */
- function getUserCount($filter=array()) {
- msg("authorisation method does not provide user counts", -1);
- return 0;
- }
+ /**
+ * Create a new User [implement only where required/possible]
+ *
+ * Returns false if the user already exists, null when an error
+ * occurred and true if everything went well.
+ *
+ * The new user HAS TO be added to the default group by this
+ * function!
+ *
+ * Set addUser capability when implemented
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function createUser($user,$pass,$name,$mail,$grps=null){
+ msg("authorisation method does not allow creation of new users", -1);
+ return null;
+ }
- /**
- * Bulk retrieval of user data [implement only where required/possible]
- *
- * Set getUsers capability when implemented
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- * @param start index of first user to be returned
- * @param limit max number of users to be returned
- * @param filter array of field/pattern pairs, null for no filter
- * @return array of userinfo (refer getUserData for internal userinfo details)
- */
- function retrieveUsers($start=0,$limit=-1,$filter=null) {
- msg("authorisation method does not support mass retrieval of user data", -1);
- return array();
- }
+ /**
+ * Modify user data [implement only where required/possible]
+ *
+ * Set the mod* capabilities according to the implemented features
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @param $user nick of the user to be changed
+ * @param $changes array of field/value pairs to be changed (password will be clear text)
+ * @return bool
+ */
+ function modifyUser($user, $changes) {
+ msg("authorisation method does not allow modifying of user data", -1);
+ return false;
+ }
- /**
- * Define a group [implement only where required/possible]
- *
- * Set addGroup capability when implemented
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- * @return bool
- */
- function addGroup($group) {
- msg("authorisation method does not support independent group creation", -1);
- return false;
- }
+ /**
+ * Delete one or more users [implement only where required/possible]
+ *
+ * Set delUser capability when implemented
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @param array $users
+ * @return int number of users deleted
+ */
+ function deleteUsers($users) {
+ msg("authorisation method does not allow deleting of users", -1);
+ return false;
+ }
- /**
- * Retrieve groups [implement only where required/possible]
- *
- * Set getGroups capability when implemented
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- * @return array
- */
- function retrieveGroups($start=0,$limit=0) {
- msg("authorisation method does not support group list retrieval", -1);
- return array();
- }
+ /**
+ * Return a count of the number of user which meet $filter criteria
+ * [should be implemented whenever retrieveUsers is implemented]
+ *
+ * Set getUserCount capability when implemented
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ */
+ function getUserCount($filter=array()) {
+ msg("authorisation method does not provide user counts", -1);
+ return 0;
+ }
- /**
- * Return case sensitivity of the backend [OPTIONAL]
- *
- * When your backend is caseinsensitive (eg. you can login with USER and
- * user) then you need to overwrite this method and return false
- */
- function isCaseSensitive(){
- return true;
- }
+ /**
+ * Bulk retrieval of user data [implement only where required/possible]
+ *
+ * Set getUsers capability when implemented
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @param start index of first user to be returned
+ * @param limit max number of users to be returned
+ * @param filter array of field/pattern pairs, null for no filter
+ * @return array of userinfo (refer getUserData for internal userinfo details)
+ */
+ function retrieveUsers($start=0,$limit=-1,$filter=null) {
+ msg("authorisation method does not support mass retrieval of user data", -1);
+ return array();
+ }
- /**
- * Sanitize a given username [OPTIONAL]
- *
- * This function is applied to any user name that is given to
- * the backend and should also be applied to any user name within
- * the backend before returning it somewhere.
- *
- * This should be used to enforce username restrictions.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @param string $user - username
- * @param string - the cleaned username
- */
- function cleanUser($user){
- return $user;
- }
+ /**
+ * Define a group [implement only where required/possible]
+ *
+ * Set addGroup capability when implemented
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @return bool
+ */
+ function addGroup($group) {
+ msg("authorisation method does not support independent group creation", -1);
+ return false;
+ }
- /**
- * Sanitize a given groupname [OPTIONAL]
- *
- * This function is applied to any groupname that is given to
- * the backend and should also be applied to any groupname within
- * the backend before returning it somewhere.
- *
- * This should be used to enforce groupname restrictions.
- *
- * Groupnames are to be passed without a leading '@' here.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @param string $group - groupname
- * @param string - the cleaned groupname
- */
- function cleanGroup($group){
- return $group;
- }
+ /**
+ * Retrieve groups [implement only where required/possible]
+ *
+ * Set getGroups capability when implemented
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @return array
+ */
+ function retrieveGroups($start=0,$limit=0) {
+ msg("authorisation method does not support group list retrieval", -1);
+ return array();
+ }
+ /**
+ * Return case sensitivity of the backend [OPTIONAL]
+ *
+ * When your backend is caseinsensitive (eg. you can login with USER and
+ * user) then you need to overwrite this method and return false
+ */
+ function isCaseSensitive(){
+ return true;
+ }
- /**
- * Check Session Cache validity [implement only where required/possible]
- *
- * DokuWiki caches user info in the user's session for the timespan defined
- * in $conf['auth_security_timeout'].
- *
- * This makes sure slow authentication backends do not slow down DokuWiki.
- * This also means that changes to the user database will not be reflected
- * on currently logged in users.
- *
- * To accommodate for this, the user manager plugin will touch a reference
- * file whenever a change is submitted. This function compares the filetime
- * of this reference file with the time stored in the session.
- *
- * This reference file mechanism does not reflect changes done directly in
- * the backend's database through other means than the user manager plugin.
- *
- * Fast backends might want to return always false, to force rechecks on
- * each page load. Others might want to use their own checking here. If
- * unsure, do not override.
- *
- * @param string $user - The username
- * @author Andreas Gohr <andi@splitbrain.org>
- * @return bool
- */
- function useSessionCache($user){
- global $conf;
- return ($_SESSION[DOKU_COOKIE]['auth']['time'] >= @filemtime($conf['cachedir'].'/sessionpurge'));
- }
+ /**
+ * Sanitize a given username [OPTIONAL]
+ *
+ * This function is applied to any user name that is given to
+ * the backend and should also be applied to any user name within
+ * the backend before returning it somewhere.
+ *
+ * This should be used to enforce username restrictions.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $user - username
+ * @param string - the cleaned username
+ */
+ function cleanUser($user){
+ return $user;
+ }
+
+ /**
+ * Sanitize a given groupname [OPTIONAL]
+ *
+ * This function is applied to any groupname that is given to
+ * the backend and should also be applied to any groupname within
+ * the backend before returning it somewhere.
+ *
+ * This should be used to enforce groupname restrictions.
+ *
+ * Groupnames are to be passed without a leading '@' here.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $group - groupname
+ * @param string - the cleaned groupname
+ */
+ function cleanGroup($group){
+ return $group;
+ }
+
+
+ /**
+ * Check Session Cache validity [implement only where required/possible]
+ *
+ * DokuWiki caches user info in the user's session for the timespan defined
+ * in $conf['auth_security_timeout'].
+ *
+ * This makes sure slow authentication backends do not slow down DokuWiki.
+ * This also means that changes to the user database will not be reflected
+ * on currently logged in users.
+ *
+ * To accommodate for this, the user manager plugin will touch a reference
+ * file whenever a change is submitted. This function compares the filetime
+ * of this reference file with the time stored in the session.
+ *
+ * This reference file mechanism does not reflect changes done directly in
+ * the backend's database through other means than the user manager plugin.
+ *
+ * Fast backends might want to return always false, to force rechecks on
+ * each page load. Others might want to use their own checking here. If
+ * unsure, do not override.
+ *
+ * @param string $user - The username
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @return bool
+ */
+ function useSessionCache($user){
+ global $conf;
+ return ($_SESSION[DOKU_COOKIE]['auth']['time'] >= @filemtime($conf['cachedir'].'/sessionpurge'));
+ }
/**
diff --git a/lib/plugins/authad/auth.php b/lib/plugins/authad/auth.php
index 70d3cfb8c..35c19f471 100644
--- a/lib/plugins/authad/auth.php
+++ b/lib/plugins/authad/auth.php
@@ -1,10 +1,4 @@
<?php
-/**
- * Plugin auth provider
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Jan Schumann <js@schumann-it.com>
- */
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
@@ -25,94 +19,101 @@ require_once(DOKU_INC.'inc/adLDAP.php');
* $conf['authtype'] = 'authad';
* $conf['passcrypt'] = 'ssha';
*
- * $conf['plugin']['authad']['account_suffix'] = '@my.domain.org';
- * $conf['plugin']['authad']['base_dn'] = 'DC=my,DC=domain,DC=org';
- * $conf['plugin']['authad']['domain_controllers'] = 'srv1.domain.org,srv2.domain.org';
+ * $conf['auth']['ad']['account_suffix'] = '
+ *
+ * @my.domain.org';
+ * $conf['auth']['ad']['base_dn'] = 'DC=my,DC=domain,DC=org';
+ * $conf['auth']['ad']['domain_controllers'] = 'srv1.domain.org,srv2.domain.org';
*
* //optional:
- * $conf['plugin']['authad']['sso'] = 1;
- * $conf['plugin']['authad']['ad_username'] = 'root';
- * $conf['plugin']['authad']['ad_password'] = 'pass';
- * $conf['plugin']['authad']['real_primarygroup'] = 1;
- * $conf['plugin']['authad']['use_ssl'] = 1;
- * $conf['plugin']['authad']['use_tls'] = 1;
- * $conf['plugin']['authad']['debug'] = 1;
+ * $conf['auth']['ad']['sso'] = 1;
+ * $conf['auth']['ad']['ad_username'] = 'root';
+ * $conf['auth']['ad']['ad_password'] = 'pass';
+ * $conf['auth']['ad']['real_primarygroup'] = 1;
+ * $conf['auth']['ad']['use_ssl'] = 1;
+ * $conf['auth']['ad']['use_tls'] = 1;
+ * $conf['auth']['ad']['debug'] = 1;
+ * // warn user about expiring password this many days in advance:
+ * $conf['auth']['ad']['expirywarn'] = 5;
*
* // get additional information to the userinfo array
* // add a list of comma separated ldap contact fields.
* $conf['plugin']['authad']['additional'] = 'field1,field2';
*
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author James Van Lommel <jamesvl@gmail.com>
- * @link http://www.nosq.com/blog/2005/08/ldap-activedirectory-and-dokuwiki/
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Jan Schumann <js@schumann-it.com>
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author James Van Lommel <jamesvl@gmail.com>
+ * @link http://www.nosq.com/blog/2005/08/ldap-activedirectory-and-dokuwiki/
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Jan Schumann <js@schumann-it.com>
*/
-class auth_plugin_authad extends DokuWiki_Auth_Plugin
-{
- var $cnf = null;
- var $opts = null;
- var $adldap = null;
- var $users = null;
+
+require_once(DOKU_INC.'inc/adLDAP/adLDAP.php');
+
+class auth_plugin_authad extends DokuWiki_Auth_Plugin {
+ /**
+ * @var array copy of the auth backend configuration
+ */
+ protected $cnf = array();
+ /**
+ * @var array hold connection data for a specific AD domain
+ */
+ protected $opts = array();
+ /**
+ * @var array open connections for each AD domain, as adLDAP objects
+ */
+ protected $adldap = array();
+
+ /**
+ * @var bool message state
+ */
+ protected $msgshown = false;
+
+ /**
+ * @var array user listing cache
+ */
+ protected $users = array();
+
+ /**
+ * @var array filter patterns for listing users
+ */
+ protected $_pattern = array();
/**
* Constructor
*/
- function auth_plugin_authad() {
+ public function __construct() {
global $conf;
$this->cnf = $conf['auth']['ad'];
-
// additional information fields
- if (isset($this->cnf['additional'])) {
+ if(isset($this->cnf['additional'])) {
$this->cnf['additional'] = str_replace(' ', '', $this->cnf['additional']);
$this->cnf['additional'] = explode(',', $this->cnf['additional']);
} else $this->cnf['additional'] = array();
// ldap extension is needed
- if (!function_exists('ldap_connect')) {
- if ($this->cnf['debug'])
- msg("AD Auth: PHP LDAP extension not found.",-1);
+ if(!function_exists('ldap_connect')) {
+ if($this->cnf['debug'])
+ msg("AD Auth: PHP LDAP extension not found.", -1);
$this->success = false;
return;
}
// Prepare SSO
- if($_SERVER['REMOTE_USER'] && $this->cnf['sso']){
- // remove possible NTLM domain
- list($dom,$usr) = explode('\\',$_SERVER['REMOTE_USER'],2);
- if(!$usr) $usr = $dom;
-
- // remove possible Kerberos domain
- list($usr,$dom) = explode('@',$usr);
-
- $dom = strtolower($dom);
- $_SERVER['REMOTE_USER'] = $usr;
-
- // we need to simulate a login
- if(empty($_COOKIE[DOKU_COOKIE])){
- $_REQUEST['u'] = $_SERVER['REMOTE_USER'];
- $_REQUEST['p'] = 'sso_only';
- }
+ if(!utf8_check($_SERVER['REMOTE_USER'])) {
+ $_SERVER['REMOTE_USER'] = utf8_encode($_SERVER['REMOTE_USER']);
}
+ if($_SERVER['REMOTE_USER'] && $this->cnf['sso']) {
+ $_SERVER['REMOTE_USER'] = $this->cleanUser($_SERVER['REMOTE_USER']);
- // prepare adLDAP standard configuration
- $this->opts = $this->cnf;
-
- // add possible domain specific configuration
- if($dom && is_array($this->cnf[$dom])) foreach($this->cnf[$dom] as $key => $val){
- $this->opts[$key] = $val;
+ // we need to simulate a login
+ if(empty($_COOKIE[DOKU_COOKIE])) {
+ $_REQUEST['u'] = $_SERVER['REMOTE_USER'];
+ $_REQUEST['p'] = 'sso_only';
+ }
}
- // handle multiple AD servers
- $this->opts['domain_controllers'] = explode(',',$this->opts['domain_controllers']);
- $this->opts['domain_controllers'] = array_map('trim',$this->opts['domain_controllers']);
- $this->opts['domain_controllers'] = array_filter($this->opts['domain_controllers']);
-
- // we can change the password if SSL is set
- if($this->opts['use_ssl'] || $this->opts['use_tls']){
- $this->cando['modPass'] = true;
- }
+ // other can do's are changed in $this->_loadServerConfig() base on domain setup
$this->cando['modName'] = true;
$this->cando['modMail'] = true;
}
@@ -125,15 +126,20 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin
* to the LDAP server
*
* @author James Van Lommel <james@nosq.com>
+ * @param string $user
+ * @param string $pass
* @return bool
*/
- function checkPass($user, $pass){
+ public function checkPass($user, $pass) {
if($_SERVER['REMOTE_USER'] &&
- $_SERVER['REMOTE_USER'] == $user &&
- $this->cnf['sso']) return true;
+ $_SERVER['REMOTE_USER'] == $user &&
+ $this->cnf['sso']
+ ) return true;
- if(!$this->_init()) return false;
- return $this->adldap->authenticate($user, $pass);
+ $adldap = $this->_adldap($this->_userDomain($user));
+ if(!$adldap) return false;
+
+ return $adldap->authenticate($this->_userName($user), $pass);
}
/**
@@ -142,57 +148,103 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin
* Returns info about the given user needs to contain
* at least these fields:
*
- * name string full name of the user
- * mail string email address of the user
- * grps array list of groups the user is in
+ * name string full name of the user
+ * mail string email address of the user
+ * grps array list of groups the user is in
*
- * This LDAP specific function returns the following
+ * This AD specific function returns the following
* addional fields:
*
- * dn string distinguished name (DN)
- * uid string Posix User ID
+ * dn string distinguished name (DN)
+ * uid string samaccountname
+ * lastpwd int timestamp of the date when the password was set
+ * expires true if the password expires
+ * expiresin int seconds until the password expires
+ * any fields specified in the 'additional' config option
*
* @author James Van Lommel <james@nosq.com>
+ * @param string $user
+ * @return array
*/
- function getUserData($user){
+ public function getUserData($user) {
global $conf;
- if(!$this->_init()) return false;
+ global $lang;
+ global $ID;
+ $adldap = $this->_adldap($this->_userDomain($user));
+ if(!$adldap) return false;
+
+ if($user == '') return array();
- $fields = array('mail','displayname','samaccountname');
+ $fields = array('mail', 'displayname', 'samaccountname', 'lastpwd', 'pwdlastset', 'useraccountcontrol');
// add additional fields to read
$fields = array_merge($fields, $this->cnf['additional']);
$fields = array_unique($fields);
//get info for given user
- $result = $this->adldap->user_info($user, $fields);
+ $result = $this->adldap->user()->info($this->_userName($user), $fields);
+ if($result == false){
+ return array();
+ }
+
//general user info
$info['name'] = $result[0]['displayname'][0];
$info['mail'] = $result[0]['mail'][0];
$info['uid'] = $result[0]['samaccountname'][0];
$info['dn'] = $result[0]['dn'];
+ //last password set (Windows counts from January 1st 1601)
+ $info['lastpwd'] = $result[0]['pwdlastset'][0] / 10000000 - 11644473600;
+ //will it expire?
+ $info['expires'] = !($result[0]['useraccountcontrol'][0] & 0x10000); //ADS_UF_DONT_EXPIRE_PASSWD
// additional information
- foreach ($this->cnf['additional'] as $field) {
- if (isset($result[0][strtolower($field)])) {
+ foreach($this->cnf['additional'] as $field) {
+ if(isset($result[0][strtolower($field)])) {
$info[$field] = $result[0][strtolower($field)][0];
}
}
// handle ActiveDirectory memberOf
- $info['grps'] = $this->adldap->user_groups($user,(bool) $this->opts['recursive_groups']);
+ $info['grps'] = $this->adldap->user()->groups($this->_userName($user),(bool) $this->opts['recursive_groups']);
- if (is_array($info['grps'])) {
- foreach ($info['grps'] as $ndx => $group) {
+ if(is_array($info['grps'])) {
+ foreach($info['grps'] as $ndx => $group) {
$info['grps'][$ndx] = $this->cleanGroup($group);
}
}
// always add the default group to the list of groups
- if(!is_array($info['grps']) || !in_array($conf['defaultgroup'],$info['grps'])){
+ if(!is_array($info['grps']) || !in_array($conf['defaultgroup'], $info['grps'])) {
$info['grps'][] = $conf['defaultgroup'];
}
+ // add the user's domain to the groups
+ $domain = $this->_userDomain($user);
+ if($domain && !in_array("domain-$domain", (array) $info['grps'])) {
+ $info['grps'][] = $this->cleanGroup("domain-$domain");
+ }
+
+ // check expiry time
+ if($info['expires'] && $this->cnf['expirywarn']){
+ $timeleft = $this->adldap->user()->passwordExpiry($user); // returns unixtime
+ $timeleft = round($timeleft/(24*60*60));
+ $info['expiresin'] = $timeleft;
+
+ // if this is the current user, warn him (once per request only)
+ if(($_SERVER['REMOTE_USER'] == $user) &&
+ ($timeleft <= $this->cnf['expirywarn']) &&
+ !$this->msgshown
+ ) {
+ $msg = sprintf($lang['authpwdexpire'], $timeleft);
+ if($this->canDo('modPass')) {
+ $url = wl($ID, array('do'=> 'profile'));
+ $msg .= ' <a href="'.$url.'">'.$lang['btn_profile'].'</a>';
+ }
+ msg($msg);
+ $this->msgshown = true;
+ }
+ }
+
return $info;
}
@@ -202,25 +254,56 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin
* Removes backslashes ('\'), pound signs ('#'), and converts spaces to underscores.
*
* @author James Van Lommel (jamesvl@gmail.com)
+ * @param string $group
+ * @return string
*/
- function cleanGroup($name) {
- $sName = str_replace('\\', '', $name);
- $sName = str_replace('#', '', $sName);
- $sName = preg_replace('[\s]', '_', $sName);
- return $sName;
+ public function cleanGroup($group) {
+ $group = str_replace('\\', '', $group);
+ $group = str_replace('#', '', $group);
+ $group = preg_replace('[\s]', '_', $group);
+ $group = utf8_strtolower(trim($group));
+ return $group;
}
/**
* Sanitize user names
+ *
+ * Normalizes domain parts, does not modify the user name itself (unlike cleanGroup)
+ *
+ * @author Andreas Gohr <gohr@cosmocode.de>
+ * @param string $user
+ * @return string
*/
- function cleanUser($name) {
- return $this->cleanGroup($name);
+ public function cleanUser($user) {
+ $domain = '';
+
+ // get NTLM or Kerberos domain part
+ list($dom, $user) = explode('\\', $user, 2);
+ if(!$user) $user = $dom;
+ if($dom) $domain = $dom;
+ list($user, $dom) = explode('@', $user, 2);
+ if($dom) $domain = $dom;
+
+ // clean up both
+ $domain = utf8_strtolower(trim($domain));
+ $user = utf8_strtolower(trim($user));
+
+ // is this a known, valid domain? if not discard
+ if(!is_array($this->cnf[$domain])) {
+ $domain = '';
+ }
+
+ // reattach domain
+ if($domain) $user = "$user@$domain";
+ return $user;
}
/**
* Most values in LDAP are case-insensitive
+ *
+ * @return bool
*/
- function isCaseSensitive(){
+ public function isCaseSensitive() {
return false;
}
@@ -228,36 +311,37 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin
* Bulk retrieval of user data
*
* @author Dominik Eckelmann <dokuwiki@cosmocode.de>
- * @param start index of first user to be returned
- * @param limit max number of users to be returned
- * @param filter array of field/pattern pairs, null for no filter
- * @return array of userinfo (refer getUserData for internal userinfo details)
+ * @param int $start index of first user to be returned
+ * @param int $limit max number of users to be returned
+ * @param array $filter array of field/pattern pairs, null for no filter
+ * @return array userinfo (refer getUserData for internal userinfo details)
*/
- function retrieveUsers($start=0,$limit=-1,$filter=array()) {
- if(!$this->_init()) return false;
+ public function retrieveUsers($start = 0, $limit = -1, $filter = array()) {
+ $adldap = $this->_adldap(null);
+ if(!$adldap) return false;
- if ($this->users === null) {
+ if($this->users === null) {
//get info for given user
- $result = $this->adldap->all_users();
+ $result = $this->adldap->user()->all();
if (!$result) return array();
$this->users = array_fill_keys($result, false);
}
- $i = 0;
+ $i = 0;
$count = 0;
$this->_constructPattern($filter);
$result = array();
- foreach ($this->users as $user => &$info) {
- if ($i++ < $start) {
+ foreach($this->users as $user => &$info) {
+ if($i++ < $start) {
continue;
}
- if ($info === false) {
+ if($info === false) {
$info = $this->getUserData($user);
}
- if ($this->_filter($user, $info)) {
+ if($this->_filter($user, $info)) {
$result[$user] = $info;
- if (($limit >= 0) && (++$count >= $limit)) break;
+ if(($limit >= 0) && (++$count >= $limit)) break;
}
}
return $result;
@@ -266,39 +350,41 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin
/**
* Modify user data
*
- * @param $user nick of the user to be changed
- * @param $changes array of field/value pairs to be changed
+ * @param string $user nick of the user to be changed
+ * @param array $changes array of field/value pairs to be changed
* @return bool
- */
- function modifyUser($user, $changes) {
+ */
+ public function modifyUser($user, $changes) {
$return = true;
+ $adldap = $this->_adldap($this->_userDomain($user));
+ if(!$adldap) return false;
// password changing
- if(isset($changes['pass'])){
+ if(isset($changes['pass'])) {
try {
- $return = $this->adldap->user_password($user,$changes['pass']);
+ $return = $this->adldap->user()->password($this->_userName($user),$changes['pass']);
} catch (adLDAPException $e) {
if ($this->cnf['debug']) msg('AD Auth: '.$e->getMessage(), -1);
$return = false;
}
- if(!$return) msg('AD Auth: failed to change the password. Maybe the password policy was not met?',-1);
+ if(!$return) msg('AD Auth: failed to change the password. Maybe the password policy was not met?', -1);
}
// changing user data
$adchanges = array();
- if(isset($changes['name'])){
+ if(isset($changes['name'])) {
// get first and last name
- $parts = explode(' ',$changes['name']);
- $adchanges['surname'] = array_pop($parts);
- $adchanges['firstname'] = join(' ',$parts);
+ $parts = explode(' ', $changes['name']);
+ $adchanges['surname'] = array_pop($parts);
+ $adchanges['firstname'] = join(' ', $parts);
$adchanges['display_name'] = $changes['name'];
}
- if(isset($changes['mail'])){
+ if(isset($changes['mail'])) {
$adchanges['email'] = $changes['mail'];
}
- if(count($adchanges)){
+ if(count($adchanges)) {
try {
- $return = $return & $this->adldap->user_modify($user,$adchanges);
+ $return = $return & $this->adldap->user()->modify($this->_userName($user),$adchanges);
} catch (adLDAPException $e) {
if ($this->cnf['debug']) msg('AD Auth: '.$e->getMessage(), -1);
$return = false;
@@ -310,50 +396,129 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin
/**
* Initialize the AdLDAP library and connect to the server
+ *
+ * When you pass null as domain, it will reuse any existing domain.
+ * Eg. the one of the logged in user. It falls back to the default
+ * domain if no current one is available.
+ *
+ * @param string|null $domain The AD domain to use
+ * @return adLDAP|bool true if a connection was established
*/
- function _init(){
- if(!is_null($this->adldap)) return true;
+ protected function _adldap($domain) {
+ if(is_null($domain) && is_array($this->opts)) {
+ $domain = $this->opts['domain'];
+ }
+
+ $this->opts = $this->_loadServerConfig((string) $domain);
+ if(isset($this->adldap[$domain])) return $this->adldap[$domain];
// connect
try {
- $this->adldap = new adLDAP($this->opts);
- if (isset($this->opts['ad_username']) && isset($this->opts['ad_password'])) {
- $this->canDo['getUsers'] = true;
- }
- return true;
- } catch (adLDAPException $e) {
- if ($this->cnf['debug']) {
+ $this->adldap[$domain] = new adLDAP($this->opts);
+ return $this->adldap[$domain];
+ } catch(adLDAPException $e) {
+ if($this->cnf['debug']) {
msg('AD Auth: '.$e->getMessage(), -1);
}
- $this->success = false;
- $this->adldap = null;
+ $this->success = false;
+ $this->adldap[$domain] = null;
}
return false;
}
/**
- * return 1 if $user + $info match $filter criteria, 0 otherwise
+ * Get the domain part from a user
+ *
+ * @param $user
+ * @return string
+ */
+ public function _userDomain($user) {
+ list(, $domain) = explode('@', $user, 2);
+ return $domain;
+ }
+
+ /**
+ * Get the user part from a user
+ *
+ * @param $user
+ * @return string
+ */
+ public function _userName($user) {
+ list($name) = explode('@', $user, 2);
+ return $name;
+ }
+
+ /**
+ * Fetch the configuration for the given AD domain
+ *
+ * @param string $domain current AD domain
+ * @return array
+ */
+ protected function _loadServerConfig($domain) {
+ // prepare adLDAP standard configuration
+ $opts = $this->cnf;
+
+ $opts['domain'] = $domain;
+
+ // add possible domain specific configuration
+ if($domain && is_array($this->cnf[$domain])) foreach($this->cnf[$domain] as $key => $val) {
+ $opts[$key] = $val;
+ }
+
+ // handle multiple AD servers
+ $opts['domain_controllers'] = explode(',', $opts['domain_controllers']);
+ $opts['domain_controllers'] = array_map('trim', $opts['domain_controllers']);
+ $opts['domain_controllers'] = array_filter($opts['domain_controllers']);
+
+ // we can change the password if SSL is set
+ if($opts['use_ssl'] || $opts['use_tls']) {
+ $this->cando['modPass'] = true;
+ } else {
+ $this->cando['modPass'] = false;
+ }
+
+ if(isset($opts['ad_username']) && isset($opts['ad_password'])) {
+ $this->cando['getUsers'] = true;
+ } else {
+ $this->cando['getUsers'] = true;
+ }
+
+ return $opts;
+ }
+
+ /**
+ * Check provided user and userinfo for matching patterns
+ *
+ * The patterns are set up with $this->_constructPattern()
*
- * @author Chris Smith <chris@jalakai.co.uk>
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @param string $user
+ * @param array $info
+ * @return bool
*/
- function _filter($user, $info) {
- foreach ($this->_pattern as $item => $pattern) {
- if ($item == 'user') {
- if (!preg_match($pattern, $user)) return 0;
- } else if ($item == 'grps') {
- if (!count(preg_grep($pattern, $info['grps']))) return 0;
+ protected function _filter($user, $info) {
+ foreach($this->_pattern as $item => $pattern) {
+ if($item == 'user') {
+ if(!preg_match($pattern, $user)) return false;
+ } else if($item == 'grps') {
+ if(!count(preg_grep($pattern, $info['grps']))) return false;
} else {
- if (!preg_match($pattern, $info[$item])) return 0;
+ if(!preg_match($pattern, $info[$item])) return false;
}
}
- return 1;
+ return true;
}
- function _constructPattern($filter) {
+ /**
+ * Create a pattern for $this->_filter()
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @param array $filter
+ */
+ protected function _constructPattern($filter) {
$this->_pattern = array();
- foreach ($filter as $item => $pattern) {
-// $this->_pattern[$item] = '/'.preg_quote($pattern,"/").'/i'; // don't allow regex characters
- $this->_pattern[$item] = '/'.str_replace('/','\/',$pattern).'/i'; // allow regex characters
+ foreach($filter as $item => $pattern) {
+ $this->_pattern[$item] = '/'.str_replace('/', '\/', $pattern).'/i'; // allow regex characters
}
}
-} \ No newline at end of file
+}
diff --git a/lib/plugins/authldap/auth.php b/lib/plugins/authldap/auth.php
index 723685f94..721abb48e 100644
--- a/lib/plugins/authldap/auth.php
+++ b/lib/plugins/authldap/auth.php
@@ -1,10 +1,4 @@
<?php
-/**
- * Plugin auth provider
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Jan Schumann <js@schumann-it.com>
- */
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
@@ -16,8 +10,7 @@ if(!defined('DOKU_INC')) die();
* @author Chris Smith <chris@jalakaic.co.uk>
* @author Jan Schumann <js@schumann-it.com>
*/
-class auth_plugin_authldap extends DokuWiki_Auth_Plugin
-{
+class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
var $cnf = null;
var $con = null;
var $bound = 0; // 0: anonymous, 1: user, 2: superuser
@@ -25,7 +18,7 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin
/**
* Constructor
*/
- function auth_plugin_authldap(){
+ function __construct(){
global $conf;
$this->cnf = $conf['auth']['ldap'];
@@ -317,8 +310,6 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin
}
}
return $result;
-
-
}
/**
@@ -370,7 +361,6 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin
function _constructPattern($filter) {
$this->_pattern = array();
foreach ($filter as $item => $pattern) {
-// $this->_pattern[$item] = '/'.preg_quote($pattern,"/").'/i'; // don't allow regex characters
$this->_pattern[$item] = '/'.str_replace('/','\/',$pattern).'/i'; // allow regex characters
}
}
@@ -400,49 +390,75 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin
$this->bound = 0;
$port = ($this->cnf['port']) ? $this->cnf['port'] : 389;
- $this->con = @ldap_connect($this->cnf['server'],$port);
- if(!$this->con){
- msg("LDAP: couldn't connect to LDAP server",-1);
- return false;
- }
+ $bound = false;
+ $servers = explode(',', $this->cnf['server']);
+ foreach ($servers as $server) {
+ $server = trim($server);
+ $this->con = @ldap_connect($server, $port);
+ if (!$this->con) {
+ continue;
+ }
- //set protocol version and dependend options
- if($this->cnf['version']){
- if(!@ldap_set_option($this->con, LDAP_OPT_PROTOCOL_VERSION,
- $this->cnf['version'])){
- msg('Setting LDAP Protocol version '.$this->cnf['version'].' failed',-1);
- if($this->cnf['debug'])
- msg('LDAP version set: '.htmlspecialchars(ldap_error($this->con)),0,__LINE__,__FILE__);
- }else{
- //use TLS (needs version 3)
- if($this->cnf['starttls']) {
- if (!@ldap_start_tls($this->con)){
- msg('Starting TLS failed',-1);
- if($this->cnf['debug'])
- msg('LDAP TLS set: '.htmlspecialchars(ldap_error($this->con)),0,__LINE__,__FILE__);
+ /*
+ * When OpenLDAP 2.x.x is used, ldap_connect() will always return a resource as it does
+ * not actually connect but just initializes the connecting parameters. The actual
+ * connect happens with the next calls to ldap_* funcs, usually with ldap_bind().
+ *
+ * So we should try to bind to server in order to check its availability.
+ */
+
+ //set protocol version and dependend options
+ if($this->cnf['version']){
+ if(!@ldap_set_option($this->con, LDAP_OPT_PROTOCOL_VERSION,
+ $this->cnf['version'])){
+ msg('Setting LDAP Protocol version '.$this->cnf['version'].' failed',-1);
+ if($this->cnf['debug'])
+ msg('LDAP version set: '.htmlspecialchars(ldap_error($this->con)),0,__LINE__,__FILE__);
+ }else{
+ //use TLS (needs version 3)
+ if($this->cnf['starttls']) {
+ if (!@ldap_start_tls($this->con)){
+ msg('Starting TLS failed',-1);
+ if($this->cnf['debug'])
+ msg('LDAP TLS set: '.htmlspecialchars(ldap_error($this->con)),0,__LINE__,__FILE__);
+ }
}
- }
- // needs version 3
- if(isset($this->cnf['referrals'])) {
- if(!@ldap_set_option($this->con, LDAP_OPT_REFERRALS,
- $this->cnf['referrals'])){
- msg('Setting LDAP referrals to off failed',-1);
- if($this->cnf['debug'])
- msg('LDAP referal set: '.htmlspecialchars(ldap_error($this->con)),0,__LINE__,__FILE__);
+ // needs version 3
+ if(isset($this->cnf['referrals'])) {
+ if(!@ldap_set_option($this->con, LDAP_OPT_REFERRALS,
+ $this->cnf['referrals'])){
+ msg('Setting LDAP referrals to off failed',-1);
+ if($this->cnf['debug'])
+ msg('LDAP referal set: '.htmlspecialchars(ldap_error($this->con)),0,__LINE__,__FILE__);
+ }
}
}
}
- }
- //set deref mode
- if($this->cnf['deref']){
- if(!@ldap_set_option($this->con, LDAP_OPT_DEREF, $this->cnf['deref'])){
- msg('Setting LDAP Deref mode '.$this->cnf['deref'].' failed',-1);
- if($this->cnf['debug'])
- msg('LDAP deref set: '.htmlspecialchars(ldap_error($this->con)),0,__LINE__,__FILE__);
+ //set deref mode
+ if($this->cnf['deref']){
+ if(!@ldap_set_option($this->con, LDAP_OPT_DEREF, $this->cnf['deref'])){
+ msg('Setting LDAP Deref mode '.$this->cnf['deref'].' failed',-1);
+ if($this->cnf['debug'])
+ msg('LDAP deref set: '.htmlspecialchars(ldap_error($this->con)),0,__LINE__,__FILE__);
+ }
+ }
+ /* As of PHP 5.3.0 we can set timeout to speedup skipping of invalid servers */
+ if (defined('LDAP_OPT_NETWORK_TIMEOUT')) {
+ ldap_set_option($this->con, LDAP_OPT_NETWORK_TIMEOUT, 1);
}
+ $bound = @ldap_bind($this->con);
+ if ($bound) {
+ break;
+ }
+ }
+
+ if(!$bound) {
+ msg("LDAP: couldn't connect to LDAP server",-1);
+ return false;
}
+
$this->canDo['getUsers'] = true;
return true;
}
@@ -468,4 +484,4 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin
$attrsonly, $sizelimit, $timelimit, $deref);
}
}
-} \ No newline at end of file
+}
diff --git a/lib/plugins/authmysql/auth.php b/lib/plugins/authmysql/auth.php
index 9150d3939..8a8f9a488 100644
--- a/lib/plugins/authmysql/auth.php
+++ b/lib/plugins/authmysql/auth.php
@@ -1,10 +1,4 @@
<?php
-/**
- * Plugin auth provider
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Jan Schumann <js@schumann-it.com>
- */
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
@@ -17,8 +11,7 @@ if(!defined('DOKU_INC')) die();
* @author Matthias Grimm <matthias.grimmm@sourceforge.net>
* @author Jan Schumann <js@schumann-it.com>
*/
-class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
-{
+class auth_plugin_authmysql extends DokuWiki_Auth_Plugin {
var $dbcon = 0;
var $dbver = 0; // database version
var $dbrev = 0; // database revision
@@ -34,65 +27,74 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
*
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
- function auth_plugin_authmysql() {
- global $conf;
- $this->cnf = $conf['auth']['mysql'];
-
- if (method_exists($this, 'auth_basic'))
- parent::auth_basic();
-
- if(!function_exists('mysql_connect')) {
- if ($this->cnf['debug'])
- msg("MySQL err: PHP MySQL extension not found.",-1,__LINE__,__FILE__);
- $this->success = false;
- return;
- }
-
- // default to UTF-8, you rarely want something else
- if(!isset($this->cnf['charset'])) $this->cnf['charset'] = 'utf8';
-
- $this->defaultgroup = $conf['defaultgroup'];
-
- // set capabilities based upon config strings set
- if (empty($this->cnf['server']) || empty($this->cnf['user']) ||
- !isset($this->cnf['password']) || empty($this->cnf['database'])){
- if ($this->cnf['debug'])
- msg("MySQL err: insufficient configuration.",-1,__LINE__,__FILE__);
- $this->success = false;
- return;
- }
-
- $this->cando['addUser'] = $this->_chkcnf(array('getUserInfo',
- 'getGroups',
- 'addUser',
- 'getUserID',
- 'getGroupID',
- 'addGroup',
- 'addUserGroup'),true);
- $this->cando['delUser'] = $this->_chkcnf(array('getUserID',
- 'delUser',
- 'delUserRefs'),true);
- $this->cando['modLogin'] = $this->_chkcnf(array('getUserID',
- 'updateUser',
- 'UpdateTarget'),true);
- $this->cando['modPass'] = $this->cando['modLogin'];
- $this->cando['modName'] = $this->cando['modLogin'];
- $this->cando['modMail'] = $this->cando['modLogin'];
- $this->cando['modGroups'] = $this->_chkcnf(array('getUserID',
- 'getGroups',
- 'getGroupID',
- 'addGroup',
- 'addUserGroup',
- 'delGroup',
- 'getGroupID',
- 'delUserGroup'),true);
- /* getGroups is not yet supported
- $this->cando['getGroups'] = $this->_chkcnf(array('getGroups',
- 'getGroupID'),false); */
- $this->cando['getUsers'] = $this->_chkcnf(array('getUsers',
- 'getUserInfo',
- 'getGroups'),false);
- $this->cando['getUserCount'] = $this->_chkcnf(array('getUsers'),false);
+ function __construct() {
+ global $conf;
+ $this->cnf = $conf['auth']['mysql'];
+
+ if (method_exists($this, 'auth_basic')){
+ parent::__construct();
+ }
+
+ if(!function_exists('mysql_connect')) {
+ if ($this->cnf['debug']){
+ msg("MySQL err: PHP MySQL extension not found.",-1,__LINE__,__FILE__);
+ }
+ $this->success = false;
+ return;
+ }
+
+ // default to UTF-8, you rarely want something else
+ if(!isset($this->cnf['charset'])) $this->cnf['charset'] = 'utf8';
+
+ $this->defaultgroup = $conf['defaultgroup'];
+
+ // set capabilities based upon config strings set
+ if (empty($this->cnf['server']) || empty($this->cnf['user']) ||
+ !isset($this->cnf['password']) || empty($this->cnf['database'])){
+
+ if ($this->cnf['debug']){
+ msg("MySQL err: insufficient configuration.",-1,__LINE__,__FILE__);
+ }
+ $this->success = false;
+ return;
+ }
+
+ $this->cando['addUser'] = $this->_chkcnf(array(
+ 'getUserInfo',
+ 'getGroups',
+ 'addUser',
+ 'getUserID',
+ 'getGroupID',
+ 'addGroup',
+ 'addUserGroup'),true);
+ $this->cando['delUser'] = $this->_chkcnf(array(
+ 'getUserID',
+ 'delUser',
+ 'delUserRefs'),true);
+ $this->cando['modLogin'] = $this->_chkcnf(array(
+ 'getUserID',
+ 'updateUser',
+ 'UpdateTarget'),true);
+ $this->cando['modPass'] = $this->cando['modLogin'];
+ $this->cando['modName'] = $this->cando['modLogin'];
+ $this->cando['modMail'] = $this->cando['modLogin'];
+ $this->cando['modGroups'] = $this->_chkcnf(array(
+ 'getUserID',
+ 'getGroups',
+ 'getGroupID',
+ 'addGroup',
+ 'addUserGroup',
+ 'delGroup',
+ 'getGroupID',
+ 'delUserGroup'),true);
+ /* getGroups is not yet supported
+ $this->cando['getGroups'] = $this->_chkcnf(array('getGroups',
+ 'getGroupID'),false); */
+ $this->cando['getUsers'] = $this->_chkcnf(array(
+ 'getUsers',
+ 'getUserInfo',
+ 'getGroups'),false);
+ $this->cando['getUserCount'] = $this->_chkcnf(array('getUsers'),false);
}
/**
@@ -102,17 +104,17 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @return bool
*/
function _chkcnf($keys, $wop=false){
- foreach ($keys as $key){
- if (empty($this->cnf[$key])) return false;
- }
+ foreach ($keys as $key){
+ if (empty($this->cnf[$key])) return false;
+ }
- /* write operation and lock array filled with tables names? */
- if ($wop && (!is_array($this->cnf['TablesToLock']) ||
- !count($this->cnf['TablesToLock']))){
- return false;
- }
+ /* write operation and lock array filled with tables names? */
+ if ($wop && (!is_array($this->cnf['TablesToLock']) ||
+ !count($this->cnf['TablesToLock']))){
+ return false;
+ }
- return true;
+ return true;
}
/**
@@ -131,23 +133,23 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function checkPass($user,$pass){
- $rc = false;
-
- if($this->_openDB()) {
- $sql = str_replace('%{user}',$this->_escape($user),$this->cnf['checkPass']);
- $sql = str_replace('%{pass}',$this->_escape($pass),$sql);
- $sql = str_replace('%{dgroup}',$this->_escape($this->defaultgroup),$sql);
- $result = $this->_queryDB($sql);
-
- if($result !== false && count($result) == 1) {
- if($this->cnf['forwardClearPass'] == 1)
- $rc = true;
- else
- $rc = auth_verifyPassword($pass,$result[0]['pass']);
+ $rc = false;
+
+ if($this->_openDB()) {
+ $sql = str_replace('%{user}',$this->_escape($user),$this->cnf['checkPass']);
+ $sql = str_replace('%{pass}',$this->_escape($pass),$sql);
+ $sql = str_replace('%{dgroup}',$this->_escape($this->defaultgroup),$sql);
+ $result = $this->_queryDB($sql);
+
+ if($result !== false && count($result) == 1) {
+ if($this->cnf['forwardClearPass'] == 1)
+ $rc = true;
+ else
+ $rc = auth_verifyPassword($pass,$result[0]['pass']);
+ }
+ $this->_closeDB();
}
- $this->_closeDB();
- }
- return $rc;
+ return $rc;
}
/**
@@ -165,14 +167,14 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function getUserData($user){
- if($this->_openDB()) {
- $this->_lockTables("READ");
- $info = $this->_getUserInfo($user);
- $this->_unlockTables();
- $this->_closeDB();
- } else
- $info = false;
- return $info;
+ if($this->_openDB()) {
+ $this->_lockTables("READ");
+ $info = $this->_getUserInfo($user);
+ $this->_unlockTables();
+ $this->_closeDB();
+ } else
+ $info = false;
+ return $info;
}
/**
@@ -195,22 +197,22 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function createUser($user,$pwd,$name,$mail,$grps=null){
- if($this->_openDB()) {
- if (($info = $this->_getUserInfo($user)) !== false)
- return false; // user already exists
-
- // set defaultgroup if no groups were given
- if ($grps == null)
- $grps = array($this->defaultgroup);
-
- $this->_lockTables("WRITE");
- $pwd = $this->cnf['forwardClearPass'] ? $pwd : auth_cryptPassword($pwd);
- $rc = $this->_addUser($user,$pwd,$name,$mail,$grps);
- $this->_unlockTables();
- $this->_closeDB();
- if ($rc) return true;
- }
- return null; // return error
+ if($this->_openDB()) {
+ if (($info = $this->_getUserInfo($user)) !== false)
+ return false; // user already exists
+
+ // set defaultgroup if no groups were given
+ if ($grps == null)
+ $grps = array($this->defaultgroup);
+
+ $this->_lockTables("WRITE");
+ $pwd = $this->cnf['forwardClearPass'] ? $pwd : auth_cryptPassword($pwd);
+ $rc = $this->_addUser($user,$pwd,$name,$mail,$grps);
+ $this->_unlockTables();
+ $this->_closeDB();
+ if ($rc) return true;
+ }
+ return null; // return error
}
/**
@@ -242,36 +244,36 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function modifyUser($user, $changes) {
- $rc = false;
+ $rc = false;
- if (!is_array($changes) || !count($changes))
- return true; // nothing to change
+ if (!is_array($changes) || !count($changes))
+ return true; // nothing to change
- if($this->_openDB()) {
- $this->_lockTables("WRITE");
+ if($this->_openDB()) {
+ $this->_lockTables("WRITE");
- if (($uid = $this->_getUserID($user))) {
- $rc = $this->_updateUserInfo($changes, $uid);
+ if (($uid = $this->_getUserID($user))) {
+ $rc = $this->_updateUserInfo($changes, $uid);
- if ($rc && isset($changes['grps']) && $this->cando['modGroups']) {
- $groups = $this->_getGroups($user);
- $grpadd = array_diff($changes['grps'], $groups);
- $grpdel = array_diff($groups, $changes['grps']);
+ if ($rc && isset($changes['grps']) && $this->cando['modGroups']) {
+ $groups = $this->_getGroups($user);
+ $grpadd = array_diff($changes['grps'], $groups);
+ $grpdel = array_diff($groups, $changes['grps']);
- foreach($grpadd as $group)
- if (($this->_addUserToGroup($user, $group, 1)) == false)
- $rc = false;
+ foreach($grpadd as $group)
+ if (($this->_addUserToGroup($user, $group, 1)) == false)
+ $rc = false;
- foreach($grpdel as $group)
- if (($this->_delUserFromGroup($user, $group)) == false)
- $rc = false;
- }
- }
+ foreach($grpdel as $group)
+ if (($this->_delUserFromGroup($user, $group)) == false)
+ $rc = false;
+ }
+ }
- $this->_unlockTables();
- $this->_closeDB();
- }
- return $rc;
+ $this->_unlockTables();
+ $this->_closeDB();
+ }
+ return $rc;
}
/**
@@ -286,20 +288,20 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function deleteUsers($users) {
- $count = 0;
-
- if($this->_openDB()) {
- if (is_array($users) && count($users)) {
- $this->_lockTables("WRITE");
- foreach ($users as $user) {
- if ($this->_delUser($user))
- $count++;
- }
- $this->_unlockTables();
- }
- $this->_closeDB();
- }
- return $count;
+ $count = 0;
+
+ if($this->_openDB()) {
+ if (is_array($users) && count($users)) {
+ $this->_lockTables("WRITE");
+ foreach ($users as $user) {
+ if ($this->_delUser($user))
+ $count++;
+ }
+ $this->_unlockTables();
+ }
+ $this->_closeDB();
+ }
+ return $count;
}
/**
@@ -313,23 +315,23 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function getUserCount($filter=array()) {
- $rc = 0;
-
- if($this->_openDB()) {
- $sql = $this->_createSQLFilter($this->cnf['getUsers'], $filter);
-
- if ($this->dbver >= 4) {
- $sql = substr($sql, 6); /* remove 'SELECT' or 'select' */
- $sql = "SELECT SQL_CALC_FOUND_ROWS".$sql." LIMIT 1";
- $this->_queryDB($sql);
- $result = $this->_queryDB("SELECT FOUND_ROWS()");
- $rc = $result[0]['FOUND_ROWS()'];
- } else if (($result = $this->_queryDB($sql)))
- $rc = count($result);
-
- $this->_closeDB();
- }
- return $rc;
+ $rc = 0;
+
+ if($this->_openDB()) {
+ $sql = $this->_createSQLFilter($this->cnf['getUsers'], $filter);
+
+ if ($this->dbver >= 4) {
+ $sql = substr($sql, 6); /* remove 'SELECT' or 'select' */
+ $sql = "SELECT SQL_CALC_FOUND_ROWS".$sql." LIMIT 1";
+ $this->_queryDB($sql);
+ $result = $this->_queryDB("SELECT FOUND_ROWS()");
+ $rc = $result[0]['FOUND_ROWS()'];
+ } else if (($result = $this->_queryDB($sql)))
+ $rc = count($result);
+
+ $this->_closeDB();
+ }
+ return $rc;
}
/**
@@ -343,24 +345,24 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function retrieveUsers($first=0,$limit=10,$filter=array()) {
- $out = array();
-
- if($this->_openDB()) {
- $this->_lockTables("READ");
- $sql = $this->_createSQLFilter($this->cnf['getUsers'], $filter);
- $sql .= " ".$this->cnf['SortOrder']." LIMIT $first, $limit";
- $result = $this->_queryDB($sql);
+ $out = array();
+
+ if($this->_openDB()) {
+ $this->_lockTables("READ");
+ $sql = $this->_createSQLFilter($this->cnf['getUsers'], $filter);
+ $sql .= " ".$this->cnf['SortOrder']." LIMIT $first, $limit";
+ $result = $this->_queryDB($sql);
+
+ if (!empty($result)) {
+ foreach ($result as $user)
+ if (($info = $this->_getUserInfo($user['user'])))
+ $out[$user['user']] = $info;
+ }
- if (!empty($result)) {
- foreach ($result as $user)
- if (($info = $this->_getUserInfo($user['user'])))
- $out[$user['user']] = $info;
+ $this->_unlockTables();
+ $this->_closeDB();
}
-
- $this->_unlockTables();
- $this->_closeDB();
- }
- return $out;
+ return $out;
}
/**
@@ -373,15 +375,15 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function joinGroup($user, $group) {
- $rc = false;
-
- if ($this->_openDB()) {
- $this->_lockTables("WRITE");
- $rc = $this->_addUserToGroup($user, $group);
- $this->_unlockTables();
- $this->_closeDB();
- }
- return $rc;
+ $rc = false;
+
+ if ($this->_openDB()) {
+ $this->_lockTables("WRITE");
+ $rc = $this->_addUserToGroup($user, $group);
+ $this->_unlockTables();
+ $this->_closeDB();
+ }
+ return $rc;
}
/**
@@ -394,16 +396,16 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function leaveGroup($user, $group) {
- $rc = false;
-
- if ($this->_openDB()) {
- $this->_lockTables("WRITE");
- $uid = $this->_getUserID($user);
- $rc = $this->_delUserFromGroup($user, $group);
- $this->_unlockTables();
- $this->_closeDB();
- }
- return $rc;
+ $rc = false;
+
+ if ($this->_openDB()) {
+ $this->_lockTables("WRITE");
+ $uid = $this->_getUserID($user);
+ $rc = $this->_delUserFromGroup($user, $group);
+ $this->_unlockTables();
+ $this->_closeDB();
+ }
+ return $rc;
}
/**
@@ -431,36 +433,36 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _addUserToGroup($user, $group, $force=0) {
- $newgroup = 0;
-
- if (($this->dbcon) && ($user)) {
- $gid = $this->_getGroupID($group);
- if (!$gid) {
- if ($force) { // create missing groups
- $sql = str_replace('%{group}',$this->_escape($group),$this->cnf['addGroup']);
- $gid = $this->_modifyDB($sql);
- $newgroup = 1; // group newly created
- }
- if (!$gid) return false; // group didn't exist and can't be created
- }
-
- $sql = $this->cnf['addUserGroup'];
- if(strpos($sql,'%{uid}') !== false){
- $uid = $this->_getUserID($user);
- $sql = str_replace('%{uid}', $this->_escape($uid),$sql);
- }
- $sql = str_replace('%{user}', $this->_escape($user),$sql);
- $sql = str_replace('%{gid}', $this->_escape($gid),$sql);
- $sql = str_replace('%{group}',$this->_escape($group),$sql);
- if ($this->_modifyDB($sql) !== false) return true;
+ $newgroup = 0;
+
+ if (($this->dbcon) && ($user)) {
+ $gid = $this->_getGroupID($group);
+ if (!$gid) {
+ if ($force) { // create missing groups
+ $sql = str_replace('%{group}',$this->_escape($group),$this->cnf['addGroup']);
+ $gid = $this->_modifyDB($sql);
+ $newgroup = 1; // group newly created
+ }
+ if (!$gid) return false; // group didn't exist and can't be created
+ }
- if ($newgroup) { // remove previously created group on error
- $sql = str_replace('%{gid}', $this->_escape($gid),$this->cnf['delGroup']);
- $sql = str_replace('%{group}',$this->_escape($group),$sql);
- $this->_modifyDB($sql);
+ $sql = $this->cnf['addUserGroup'];
+ if(strpos($sql,'%{uid}') !== false){
+ $uid = $this->_getUserID($user);
+ $sql = str_replace('%{uid}', $this->_escape($uid),$sql);
+ }
+ $sql = str_replace('%{user}', $this->_escape($user),$sql);
+ $sql = str_replace('%{gid}', $this->_escape($gid),$sql);
+ $sql = str_replace('%{group}',$this->_escape($group),$sql);
+ if ($this->_modifyDB($sql) !== false) return true;
+
+ if ($newgroup) { // remove previously created group on error
+ $sql = str_replace('%{gid}', $this->_escape($gid),$this->cnf['delGroup']);
+ $sql = str_replace('%{group}',$this->_escape($group),$sql);
+ $this->_modifyDB($sql);
+ }
}
- }
- return false;
+ return false;
}
/**
@@ -473,24 +475,23 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _delUserFromGroup($user, $group) {
- $rc = false;
+ $rc = false;
-
- if (($this->dbcon) && ($user)) {
- $sql = $this->cnf['delUserGroup'];
- if(strpos($sql,'%{uid}') !== false){
- $uid = $this->_getUserID($user);
- $sql = str_replace('%{uid}', $this->_escape($uid),$sql);
- }
- $gid = $this->_getGroupID($group);
- if ($gid) {
- $sql = str_replace('%{user}', $this->_escape($user),$sql);
- $sql = str_replace('%{gid}', $this->_escape($gid),$sql);
- $sql = str_replace('%{group}',$this->_escape($group),$sql);
- $rc = $this->_modifyDB($sql) == 0 ? true : false;
+ if (($this->dbcon) && ($user)) {
+ $sql = $this->cnf['delUserGroup'];
+ if(strpos($sql,'%{uid}') !== false){
+ $uid = $this->_getUserID($user);
+ $sql = str_replace('%{uid}', $this->_escape($uid),$sql);
+ }
+ $gid = $this->_getGroupID($group);
+ if ($gid) {
+ $sql = str_replace('%{user}', $this->_escape($user),$sql);
+ $sql = str_replace('%{gid}', $this->_escape($gid),$sql);
+ $sql = str_replace('%{group}',$this->_escape($group),$sql);
+ $rc = $this->_modifyDB($sql) == 0 ? true : false;
+ }
}
- }
- return $rc;
+ return $rc;
}
/**
@@ -507,19 +508,19 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _getGroups($user) {
- $groups = array();
+ $groups = array();
- if($this->dbcon) {
- $sql = str_replace('%{user}',$this->_escape($user),$this->cnf['getGroups']);
- $result = $this->_queryDB($sql);
+ if($this->dbcon) {
+ $sql = str_replace('%{user}',$this->_escape($user),$this->cnf['getGroups']);
+ $result = $this->_queryDB($sql);
- if($result !== false && count($result)) {
- foreach($result as $row)
- $groups[] = $row['group'];
+ if($result !== false && count($result)) {
+ foreach($result as $row)
+ $groups[] = $row['group'];
+ }
+ return $groups;
}
- return $groups;
- }
- return false;
+ return false;
}
/**
@@ -535,12 +536,12 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _getUserID($user) {
- if($this->dbcon) {
- $sql = str_replace('%{user}',$this->_escape($user),$this->cnf['getUserID']);
- $result = $this->_queryDB($sql);
- return $result === false ? false : $result[0]['id'];
- }
- return false;
+ if($this->dbcon) {
+ $sql = str_replace('%{user}',$this->_escape($user),$this->cnf['getUserID']);
+ $result = $this->_queryDB($sql);
+ return $result === false ? false : $result[0]['id'];
+ }
+ return false;
}
/**
@@ -562,33 +563,33 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _addUser($user,$pwd,$name,$mail,$grps){
- if($this->dbcon && is_array($grps)) {
- $sql = str_replace('%{user}', $this->_escape($user),$this->cnf['addUser']);
- $sql = str_replace('%{pass}', $this->_escape($pwd),$sql);
- $sql = str_replace('%{name}', $this->_escape($name),$sql);
- $sql = str_replace('%{email}',$this->_escape($mail),$sql);
- $uid = $this->_modifyDB($sql);
-
- if ($uid) {
- foreach($grps as $group) {
- $gid = $this->_addUserToGroup($user, $group, 1);
- if ($gid === false) break;
- }
-
- if ($gid) return true;
- else {
- /* remove the new user and all group relations if a group can't
- * be assigned. Newly created groups will remain in the database
- * and won't be removed. This might create orphaned groups but
- * is not a big issue so we ignore this problem here.
- */
- $this->_delUser($user);
- if ($this->cnf['debug'])
- msg ("MySQL err: Adding user '$user' to group '$group' failed.",-1,__LINE__,__FILE__);
- }
+ if($this->dbcon && is_array($grps)) {
+ $sql = str_replace('%{user}', $this->_escape($user),$this->cnf['addUser']);
+ $sql = str_replace('%{pass}', $this->_escape($pwd),$sql);
+ $sql = str_replace('%{name}', $this->_escape($name),$sql);
+ $sql = str_replace('%{email}',$this->_escape($mail),$sql);
+ $uid = $this->_modifyDB($sql);
+
+ if ($uid) {
+ foreach($grps as $group) {
+ $gid = $this->_addUserToGroup($user, $group, 1);
+ if ($gid === false) break;
+ }
+
+ if ($gid) return true;
+ else {
+ /* remove the new user and all group relations if a group can't
+ * be assigned. Newly created groups will remain in the database
+ * and won't be removed. This might create orphaned groups but
+ * is not a big issue so we ignore this problem here.
+ */
+ $this->_delUser($user);
+ if ($this->cnf['debug'])
+ msg ("MySQL err: Adding user '$user' to group '$group' failed.",-1,__LINE__,__FILE__);
+ }
+ }
}
- }
- return false;
+ return false;
}
/**
@@ -604,18 +605,18 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _delUser($user) {
- if($this->dbcon) {
- $uid = $this->_getUserID($user);
- if ($uid) {
- $sql = str_replace('%{uid}',$this->_escape($uid),$this->cnf['delUserRefs']);
- $this->_modifyDB($sql);
- $sql = str_replace('%{uid}',$this->_escape($uid),$this->cnf['delUser']);
- $sql = str_replace('%{user}', $this->_escape($user),$sql);
- $this->_modifyDB($sql);
- return true;
- }
- }
- return false;
+ if($this->dbcon) {
+ $uid = $this->_getUserID($user);
+ if ($uid) {
+ $sql = str_replace('%{uid}',$this->_escape($uid),$this->cnf['delUserRefs']);
+ $this->_modifyDB($sql);
+ $sql = str_replace('%{uid}',$this->_escape($uid),$this->cnf['delUser']);
+ $sql = str_replace('%{user}', $this->_escape($user),$sql);
+ $this->_modifyDB($sql);
+ return true;
+ }
+ }
+ return false;
}
/**
@@ -632,14 +633,14 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _getUserInfo($user){
- $sql = str_replace('%{user}',$this->_escape($user),$this->cnf['getUserInfo']);
- $result = $this->_queryDB($sql);
- if($result !== false && count($result)) {
- $info = $result[0];
- $info['grps'] = $this->_getGroups($user);
- return $info;
- }
- return false;
+ $sql = str_replace('%{user}',$this->_escape($user),$this->cnf['getUserInfo']);
+ $result = $this->_queryDB($sql);
+ if($result !== false && count($result)) {
+ $info = $result[0];
+ $info['grps'] = $this->_getGroups($user);
+ return $info;
+ }
+ return false;
}
/**
@@ -662,43 +663,43 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _updateUserInfo($changes, $uid) {
- $sql = $this->cnf['updateUser']." ";
- $cnt = 0;
- $err = 0;
-
- if($this->dbcon) {
- foreach ($changes as $item => $value) {
- if ($item == 'user') {
- if (($this->_getUserID($changes['user']))) {
- $err = 1; /* new username already exists */
- break; /* abort update */
+ $sql = $this->cnf['updateUser']." ";
+ $cnt = 0;
+ $err = 0;
+
+ if($this->dbcon) {
+ foreach ($changes as $item => $value) {
+ if ($item == 'user') {
+ if (($this->_getUserID($changes['user']))) {
+ $err = 1; /* new username already exists */
+ break; /* abort update */
+ }
+ if ($cnt++ > 0) $sql .= ", ";
+ $sql .= str_replace('%{user}',$value,$this->cnf['UpdateLogin']);
+ } else if ($item == 'name') {
+ if ($cnt++ > 0) $sql .= ", ";
+ $sql .= str_replace('%{name}',$value,$this->cnf['UpdateName']);
+ } else if ($item == 'pass') {
+ if (!$this->cnf['forwardClearPass'])
+ $value = auth_cryptPassword($value);
+ if ($cnt++ > 0) $sql .= ", ";
+ $sql .= str_replace('%{pass}',$value,$this->cnf['UpdatePass']);
+ } else if ($item == 'mail') {
+ if ($cnt++ > 0) $sql .= ", ";
+ $sql .= str_replace('%{email}',$value,$this->cnf['UpdateEmail']);
+ }
+ }
+
+ if ($err == 0) {
+ if ($cnt > 0) {
+ $sql .= " ".str_replace('%{uid}', $uid, $this->cnf['UpdateTarget']);
+ if(get_class($this) == 'auth_mysql') $sql .= " LIMIT 1"; //some PgSQL inheritance comp.
+ $this->_modifyDB($sql);
+ }
+ return true;
}
- if ($cnt++ > 0) $sql .= ", ";
- $sql .= str_replace('%{user}',$value,$this->cnf['UpdateLogin']);
- } else if ($item == 'name') {
- if ($cnt++ > 0) $sql .= ", ";
- $sql .= str_replace('%{name}',$value,$this->cnf['UpdateName']);
- } else if ($item == 'pass') {
- if (!$this->cnf['forwardClearPass'])
- $value = auth_cryptPassword($value);
- if ($cnt++ > 0) $sql .= ", ";
- $sql .= str_replace('%{pass}',$value,$this->cnf['UpdatePass']);
- } else if ($item == 'mail') {
- if ($cnt++ > 0) $sql .= ", ";
- $sql .= str_replace('%{email}',$value,$this->cnf['UpdateEmail']);
- }
- }
-
- if ($err == 0) {
- if ($cnt > 0) {
- $sql .= " ".str_replace('%{uid}', $uid, $this->cnf['UpdateTarget']);
- if(get_class($this) == 'auth_mysql') $sql .= " LIMIT 1"; //some PgSQL inheritance comp.
- $this->_modifyDB($sql);
- }
- return true;
- }
- }
- return false;
+ }
+ return false;
}
/**
@@ -714,12 +715,12 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _getGroupID($group) {
- if($this->dbcon) {
- $sql = str_replace('%{group}',$this->_escape($group),$this->cnf['getGroupID']);
- $result = $this->_queryDB($sql);
- return $result === false ? false : $result[0]['id'];
- }
- return false;
+ if($this->dbcon) {
+ $sql = str_replace('%{group}',$this->_escape($group),$this->cnf['getGroupID']);
+ $result = $this->_queryDB($sql);
+ return $result === false ? false : $result[0]['id'];
+ }
+ return false;
}
/**
@@ -732,32 +733,32 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _openDB() {
- if (!$this->dbcon) {
- $con = @mysql_connect ($this->cnf['server'], $this->cnf['user'], $this->cnf['password']);
- if ($con) {
- if ((mysql_select_db($this->cnf['database'], $con))) {
- if ((preg_match("/^(\d+)\.(\d+)\.(\d+).*/", mysql_get_server_info ($con), $result)) == 1) {
- $this->dbver = $result[1];
- $this->dbrev = $result[2];
- $this->dbsub = $result[3];
- }
- $this->dbcon = $con;
- if(!empty($this->cnf['charset'])){
- mysql_query('SET CHARACTER SET "' . $this->cnf['charset'] . '"', $con);
- }
- return true; // connection and database successfully opened
- } else {
- mysql_close ($con);
- if ($this->cnf['debug'])
- msg("MySQL err: No access to database {$this->cnf['database']}.",-1,__LINE__,__FILE__);
- }
- } else if ($this->cnf['debug'])
- msg ("MySQL err: Connection to {$this->cnf['user']}@{$this->cnf['server']} not possible.",
- -1,__LINE__,__FILE__);
-
- return false; // connection failed
- }
- return true; // connection already open
+ if (!$this->dbcon) {
+ $con = @mysql_connect ($this->cnf['server'], $this->cnf['user'], $this->cnf['password']);
+ if ($con) {
+ if ((mysql_select_db($this->cnf['database'], $con))) {
+ if ((preg_match("/^(\d+)\.(\d+)\.(\d+).*/", mysql_get_server_info ($con), $result)) == 1) {
+ $this->dbver = $result[1];
+ $this->dbrev = $result[2];
+ $this->dbsub = $result[3];
+ }
+ $this->dbcon = $con;
+ if(!empty($this->cnf['charset'])){
+ mysql_query('SET CHARACTER SET "' . $this->cnf['charset'] . '"', $con);
+ }
+ return true; // connection and database successfully opened
+ } else {
+ mysql_close ($con);
+ if ($this->cnf['debug'])
+ msg("MySQL err: No access to database {$this->cnf['database']}.",-1,__LINE__,__FILE__);
+ }
+ } else if ($this->cnf['debug'])
+ msg ("MySQL err: Connection to {$this->cnf['user']}@{$this->cnf['server']} not possible.",
+ -1,__LINE__,__FILE__);
+
+ return false; // connection failed
+ }
+ return true; // connection already open
}
/**
@@ -766,10 +767,10 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _closeDB() {
- if ($this->dbcon) {
- mysql_close ($this->dbcon);
- $this->dbcon = 0;
- }
+ if ($this->dbcon) {
+ mysql_close ($this->dbcon);
+ $this->dbcon = 0;
+ }
}
/**
@@ -785,23 +786,23 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _queryDB($query) {
- if($this->cnf['debug'] >= 2){
- msg('MySQL query: '.hsc($query),0,__LINE__,__FILE__);
- }
-
- $resultarray = array();
- if ($this->dbcon) {
- $result = @mysql_query($query,$this->dbcon);
- if ($result) {
- while (($t = mysql_fetch_assoc($result)) !== false)
- $resultarray[]=$t;
- mysql_free_result ($result);
- return $resultarray;
- }
- if ($this->cnf['debug'])
- msg('MySQL err: '.mysql_error($this->dbcon),-1,__LINE__,__FILE__);
- }
- return false;
+ if($this->cnf['debug'] >= 2){
+ msg('MySQL query: '.hsc($query),0,__LINE__,__FILE__);
+ }
+
+ $resultarray = array();
+ if ($this->dbcon) {
+ $result = @mysql_query($query,$this->dbcon);
+ if ($result) {
+ while (($t = mysql_fetch_assoc($result)) !== false)
+ $resultarray[]=$t;
+ mysql_free_result ($result);
+ return $resultarray;
+ }
+ if ($this->cnf['debug'])
+ msg('MySQL err: '.mysql_error($this->dbcon),-1,__LINE__,__FILE__);
+ }
+ return false;
}
/**
@@ -816,16 +817,16 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _modifyDB($query) {
- if ($this->dbcon) {
- $result = @mysql_query($query,$this->dbcon);
- if ($result) {
- $rc = mysql_insert_id($this->dbcon); //give back ID on insert
- if ($rc !== false) return $rc;
- }
- if ($this->cnf['debug'])
- msg('MySQL err: '.mysql_error($this->dbcon),-1,__LINE__,__FILE__);
- }
- return false;
+ if ($this->dbcon) {
+ $result = @mysql_query($query,$this->dbcon);
+ if ($result) {
+ $rc = mysql_insert_id($this->dbcon); //give back ID on insert
+ if ($rc !== false) return $rc;
+ }
+ if ($this->cnf['debug'])
+ msg('MySQL err: '.mysql_error($this->dbcon),-1,__LINE__,__FILE__);
+ }
+ return false;
}
/**
@@ -847,21 +848,21 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _lockTables($mode) {
- if ($this->dbcon) {
- if (is_array($this->cnf['TablesToLock']) && !empty($this->cnf['TablesToLock'])) {
- if ($mode == "READ" || $mode == "WRITE") {
- $sql = "LOCK TABLES ";
- $cnt = 0;
- foreach ($this->cnf['TablesToLock'] as $table) {
- if ($cnt++ != 0) $sql .= ", ";
- $sql .= "$table $mode";
+ if ($this->dbcon) {
+ if (is_array($this->cnf['TablesToLock']) && !empty($this->cnf['TablesToLock'])) {
+ if ($mode == "READ" || $mode == "WRITE") {
+ $sql = "LOCK TABLES ";
+ $cnt = 0;
+ foreach ($this->cnf['TablesToLock'] as $table) {
+ if ($cnt++ != 0) $sql .= ", ";
+ $sql .= "$table $mode";
+ }
+ $this->_modifyDB($sql);
+ return true;
+ }
}
- $this->_modifyDB($sql);
- return true;
- }
}
- }
- return false;
+ return false;
}
/**
@@ -871,11 +872,11 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _unlockTables() {
- if ($this->dbcon) {
- $this->_modifyDB("UNLOCK TABLES");
- return true;
- }
- return false;
+ if ($this->dbcon) {
+ $this->_modifyDB("UNLOCK TABLES");
+ return true;
+ }
+ return false;
}
/**
@@ -891,38 +892,38 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*/
function _createSQLFilter($sql, $filter) {
- $SQLfilter = "";
- $cnt = 0;
-
- if ($this->dbcon) {
- foreach ($filter as $item => $pattern) {
- $tmp = '%'.$this->_escape($pattern).'%';
- if ($item == 'user') {
- if ($cnt++ > 0) $SQLfilter .= " AND ";
- $SQLfilter .= str_replace('%{user}',$tmp,$this->cnf['FilterLogin']);
- } else if ($item == 'name') {
- if ($cnt++ > 0) $SQLfilter .= " AND ";
- $SQLfilter .= str_replace('%{name}',$tmp,$this->cnf['FilterName']);
- } else if ($item == 'mail') {
- if ($cnt++ > 0) $SQLfilter .= " AND ";
- $SQLfilter .= str_replace('%{email}',$tmp,$this->cnf['FilterEmail']);
- } else if ($item == 'grps') {
- if ($cnt++ > 0) $SQLfilter .= " AND ";
- $SQLfilter .= str_replace('%{group}',$tmp,$this->cnf['FilterGroup']);
- }
- }
-
- // we have to check SQLfilter here and must not use $cnt because if
- // any of cnf['Filter????'] is not defined, a malformed SQL string
- // would be generated.
-
- if (strlen($SQLfilter)) {
- $glue = strpos(strtolower($sql),"where") ? " AND " : " WHERE ";
- $sql = $sql.$glue.$SQLfilter;
- }
- }
-
- return $sql;
+ $SQLfilter = "";
+ $cnt = 0;
+
+ if ($this->dbcon) {
+ foreach ($filter as $item => $pattern) {
+ $tmp = '%'.$this->_escape($pattern).'%';
+ if ($item == 'user') {
+ if ($cnt++ > 0) $SQLfilter .= " AND ";
+ $SQLfilter .= str_replace('%{user}',$tmp,$this->cnf['FilterLogin']);
+ } else if ($item == 'name') {
+ if ($cnt++ > 0) $SQLfilter .= " AND ";
+ $SQLfilter .= str_replace('%{name}',$tmp,$this->cnf['FilterName']);
+ } else if ($item == 'mail') {
+ if ($cnt++ > 0) $SQLfilter .= " AND ";
+ $SQLfilter .= str_replace('%{email}',$tmp,$this->cnf['FilterEmail']);
+ } else if ($item == 'grps') {
+ if ($cnt++ > 0) $SQLfilter .= " AND ";
+ $SQLfilter .= str_replace('%{group}',$tmp,$this->cnf['FilterGroup']);
+ }
+ }
+
+ // we have to check SQLfilter here and must not use $cnt because if
+ // any of cnf['Filter????'] is not defined, a malformed SQL string
+ // would be generated.
+
+ if (strlen($SQLfilter)) {
+ $glue = strpos(strtolower($sql),"where") ? " AND " : " WHERE ";
+ $sql = $sql.$glue.$SQLfilter;
+ }
+ }
+
+ return $sql;
}
/**
@@ -933,14 +934,14 @@ class auth_plugin_authmysql extends DokuWiki_Auth_Plugin
* @param boolean $like Escape wildcard chars as well?
*/
function _escape($string,$like=false){
- if($this->dbcon){
- $string = mysql_real_escape_string($string, $this->dbcon);
- }else{
- $string = addslashes($string);
- }
- if($like){
- $string = addcslashes($string,'%_');
- }
- return $string;
+ if($this->dbcon){
+ $string = mysql_real_escape_string($string, $this->dbcon);
+ }else{
+ $string = addslashes($string);
+ }
+ if($like){
+ $string = addcslashes($string,'%_');
+ }
+ return $string;
}
-} \ No newline at end of file
+}
diff --git a/lib/plugins/authplain/auth.php b/lib/plugins/authplain/auth.php
index 4be0e0c19..570d029ff 100644
--- a/lib/plugins/authplain/auth.php
+++ b/lib/plugins/authplain/auth.php
@@ -1,10 +1,4 @@
<?php
-/**
- * Plugin auth provider
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Jan Schumann <js@schumann-it.com>
- */
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
@@ -16,8 +10,7 @@ if(!defined('DOKU_INC')) die();
* @author Chris Smith <chris@jalakai.co.uk>
* @author Jan Schumann <js@schumann-it.com>
*/
-class auth_plugin_authplain extends DokuWiki_Auth_Plugin
-{
+class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
var $users = null;
var $_pattern = array();
@@ -29,24 +22,24 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin
*
* @author Christopher Smith <chris@jalakai.co.uk>
*/
- function auth_plugin_authplain() {
- global $config_cascade;
-
- if (!@is_readable($config_cascade['plainauth.users']['default'])){
- $this->success = false;
- }else{
- if(@is_writable($config_cascade['plainauth.users']['default'])){
- $this->cando['addUser'] = true;
- $this->cando['delUser'] = true;
- $this->cando['modLogin'] = true;
- $this->cando['modPass'] = true;
- $this->cando['modName'] = true;
- $this->cando['modMail'] = true;
- $this->cando['modGroups'] = true;
+ function __construct() {
+ global $config_cascade;
+
+ if (!@is_readable($config_cascade['plainauth.users']['default'])){
+ $this->success = false;
+ }else{
+ if(@is_writable($config_cascade['plainauth.users']['default'])){
+ $this->cando['addUser'] = true;
+ $this->cando['delUser'] = true;
+ $this->cando['modLogin'] = true;
+ $this->cando['modPass'] = true;
+ $this->cando['modName'] = true;
+ $this->cando['modMail'] = true;
+ $this->cando['modGroups'] = true;
+ }
+ $this->cando['getUsers'] = true;
+ $this->cando['getUserCount'] = true;
}
- $this->cando['getUsers'] = true;
- $this->cando['getUserCount'] = true;
- }
}
/**
@@ -60,10 +53,10 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin
*/
function checkPass($user,$pass){
- $userinfo = $this->getUserData($user);
- if ($userinfo === false) return false;
+ $userinfo = $this->getUserData($user);
+ if ($userinfo === false) return false;
- return auth_verifyPassword($pass,$this->users[$user]['pass']);
+ return auth_verifyPassword($pass,$this->users[$user]['pass']);
}
/**
@@ -80,8 +73,8 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin
*/
function getUserData($user){
- if($this->users === null) $this->_loadUserData();
- return isset($this->users[$user]) ? $this->users[$user] : false;
+ if($this->users === null) $this->_loadUserData();
+ return isset($this->users[$user]) ? $this->users[$user] : false;
}
/**
@@ -97,29 +90,29 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin
* @author Chris Smith <chris@jalakai.co.uk>
*/
function createUser($user,$pwd,$name,$mail,$grps=null){
- global $conf;
- global $config_cascade;
+ global $conf;
+ global $config_cascade;
- // user mustn't already exist
- if ($this->getUserData($user) !== false) return false;
+ // user mustn't already exist
+ if ($this->getUserData($user) !== false) return false;
- $pass = auth_cryptPassword($pwd);
+ $pass = auth_cryptPassword($pwd);
- // set default group if no groups specified
- if (!is_array($grps)) $grps = array($conf['defaultgroup']);
+ // set default group if no groups specified
+ if (!is_array($grps)) $grps = array($conf['defaultgroup']);
- // prepare user line
- $groups = join(',',$grps);
- $userline = join(':',array($user,$pass,$name,$mail,$groups))."\n";
+ // prepare user line
+ $groups = join(',',$grps);
+ $userline = join(':',array($user,$pass,$name,$mail,$groups))."\n";
- if (io_saveFile($config_cascade['plainauth.users']['default'],$userline,true)) {
- $this->users[$user] = compact('pass','name','mail','grps');
- return $pwd;
- }
+ if (io_saveFile($config_cascade['plainauth.users']['default'],$userline,true)) {
+ $this->users[$user] = compact('pass','name','mail','grps');
+ return $pwd;
+ }
- msg('The '.$config_cascade['plainauth.users']['default'].
- ' file is not writable. Please inform the Wiki-Admin',-1);
- return null;
+ msg('The '.$config_cascade['plainauth.users']['default'].
+ ' file is not writable. Please inform the Wiki-Admin',-1);
+ return null;
}
/**
@@ -131,78 +124,78 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin
* @return bool
*/
function modifyUser($user, $changes) {
- global $conf;
- global $ACT;
- global $INFO;
- global $config_cascade;
-
- // sanity checks, user must already exist and there must be something to change
- if (($userinfo = $this->getUserData($user)) === false) return false;
- if (!is_array($changes) || !count($changes)) return true;
-
- // update userinfo with new data, remembering to encrypt any password
- $newuser = $user;
- foreach ($changes as $field => $value) {
- if ($field == 'user') {
- $newuser = $value;
- continue;
+ global $conf;
+ global $ACT;
+ global $INFO;
+ global $config_cascade;
+
+ // sanity checks, user must already exist and there must be something to change
+ if (($userinfo = $this->getUserData($user)) === false) return false;
+ if (!is_array($changes) || !count($changes)) return true;
+
+ // update userinfo with new data, remembering to encrypt any password
+ $newuser = $user;
+ foreach ($changes as $field => $value) {
+ if ($field == 'user') {
+ $newuser = $value;
+ continue;
+ }
+ if ($field == 'pass') $value = auth_cryptPassword($value);
+ $userinfo[$field] = $value;
+ }
+
+ $groups = join(',',$userinfo['grps']);
+ $userline = join(':',array($newuser, $userinfo['pass'], $userinfo['name'], $userinfo['mail'], $groups))."\n";
+
+ if (!$this->deleteUsers(array($user))) {
+ msg('Unable to modify user data. Please inform the Wiki-Admin',-1);
+ return false;
+ }
+
+ if (!io_saveFile($config_cascade['plainauth.users']['default'],$userline,true)) {
+ msg('There was an error modifying your user data. You should register again.',-1);
+ // FIXME, user has been deleted but not recreated, should force a logout and redirect to login page
+ $ACT == 'register';
+ return false;
}
- if ($field == 'pass') $value = auth_cryptPassword($value);
- $userinfo[$field] = $value;
- }
-
- $groups = join(',',$userinfo['grps']);
- $userline = join(':',array($newuser, $userinfo['pass'], $userinfo['name'], $userinfo['mail'], $groups))."\n";
-
- if (!$this->deleteUsers(array($user))) {
- msg('Unable to modify user data. Please inform the Wiki-Admin',-1);
- return false;
- }
-
- if (!io_saveFile($config_cascade['plainauth.users']['default'],$userline,true)) {
- msg('There was an error modifying your user data. You should register again.',-1);
- // FIXME, user has been deleted but not recreated, should force a logout and redirect to login page
- $ACT == 'register';
- return false;
- }
-
- $this->users[$newuser] = $userinfo;
- return true;
+
+ $this->users[$newuser] = $userinfo;
+ return true;
}
/**
- * Remove one or more users from the list of registered users
+ * Remove one or more users from the list of registered users
*
- * @author Christopher Smith <chris@jalakai.co.uk>
- * @param array $users array of users to be deleted
- * @return int the number of users deleted
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @param array $users array of users to be deleted
+ * @return int the number of users deleted
*/
function deleteUsers($users) {
- global $config_cascade;
+ global $config_cascade;
- if (!is_array($users) || empty($users)) return 0;
+ if (!is_array($users) || empty($users)) return 0;
- if ($this->users === null) $this->_loadUserData();
+ if ($this->users === null) $this->_loadUserData();
- $deleted = array();
- foreach ($users as $user) {
- if (isset($this->users[$user])) $deleted[] = preg_quote($user,'/');
- }
+ $deleted = array();
+ foreach ($users as $user) {
+ if (isset($this->users[$user])) $deleted[] = preg_quote($user,'/');
+ }
- if (empty($deleted)) return 0;
+ if (empty($deleted)) return 0;
- $pattern = '/^('.join('|',$deleted).'):/';
+ $pattern = '/^('.join('|',$deleted).'):/';
- if (io_deleteFromFile($config_cascade['plainauth.users']['default'],$pattern,true)) {
- foreach ($deleted as $user) unset($this->users[$user]);
- return count($deleted);
- }
+ if (io_deleteFromFile($config_cascade['plainauth.users']['default'],$pattern,true)) {
+ foreach ($deleted as $user) unset($this->users[$user]);
+ return count($deleted);
+ }
- // problem deleting, reload the user list and count the difference
- $count = count($this->users);
- $this->_loadUserData();
- $count -= count($this->users);
- return $count;
+ // problem deleting, reload the user list and count the difference
+ $count = count($this->users);
+ $this->_loadUserData();
+ $count -= count($this->users);
+ return $count;
}
/**
@@ -212,18 +205,18 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin
*/
function getUserCount($filter=array()) {
- if($this->users === null) $this->_loadUserData();
+ if($this->users === null) $this->_loadUserData();
- if (!count($filter)) return count($this->users);
+ if (!count($filter)) return count($this->users);
- $count = 0;
- $this->_constructPattern($filter);
+ $count = 0;
+ $this->_constructPattern($filter);
- foreach ($this->users as $user => $info) {
- $count += $this->_filter($user, $info);
- }
+ foreach ($this->users as $user => $info) {
+ $count += $this->_filter($user, $info);
+ }
- return $count;
+ return $count;
}
/**
@@ -237,27 +230,27 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin
*/
function retrieveUsers($start=0,$limit=0,$filter=array()) {
- if ($this->users === null) $this->_loadUserData();
+ if ($this->users === null) $this->_loadUserData();
- ksort($this->users);
+ ksort($this->users);
- $i = 0;
- $count = 0;
- $out = array();
- $this->_constructPattern($filter);
+ $i = 0;
+ $count = 0;
+ $out = array();
+ $this->_constructPattern($filter);
- foreach ($this->users as $user => $info) {
- if ($this->_filter($user, $info)) {
- if ($i >= $start) {
- $out[$user] = $info;
- $count++;
- if (($limit > 0) && ($count >= $limit)) break;
- }
- $i++;
+ foreach ($this->users as $user => $info) {
+ if ($this->_filter($user, $info)) {
+ if ($i >= $start) {
+ $out[$user] = $info;
+ $count++;
+ if (($limit > 0) && ($count >= $limit)) break;
+ }
+ $i++;
+ }
}
- }
- return $out;
+ return $out;
}
/**
@@ -284,26 +277,26 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin
* @author Andreas Gohr <andi@splitbrain.org>
*/
function _loadUserData(){
- global $config_cascade;
+ global $config_cascade;
- $this->users = array();
+ $this->users = array();
- if(!@file_exists($config_cascade['plainauth.users']['default'])) return;
+ if(!@file_exists($config_cascade['plainauth.users']['default'])) return;
- $lines = file($config_cascade['plainauth.users']['default']);
- foreach($lines as $line){
- $line = preg_replace('/#.*$/','',$line); //ignore comments
- $line = trim($line);
- if(empty($line)) continue;
+ $lines = file($config_cascade['plainauth.users']['default']);
+ foreach($lines as $line){
+ $line = preg_replace('/#.*$/','',$line); //ignore comments
+ $line = trim($line);
+ if(empty($line)) continue;
- $row = explode(":",$line,5);
- $groups = array_values(array_filter(explode(",",$row[4])));
+ $row = explode(":",$line,5);
+ $groups = array_values(array_filter(explode(",",$row[4])));
- $this->users[$row[0]]['pass'] = $row[1];
- $this->users[$row[0]]['name'] = urldecode($row[2]);
- $this->users[$row[0]]['mail'] = $row[3];
- $this->users[$row[0]]['grps'] = $groups;
- }
+ $this->users[$row[0]]['pass'] = $row[1];
+ $this->users[$row[0]]['name'] = urldecode($row[2]);
+ $this->users[$row[0]]['mail'] = $row[3];
+ $this->users[$row[0]]['grps'] = $groups;
+ }
}
/**
@@ -326,10 +319,10 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin
}
function _constructPattern($filter) {
- $this->_pattern = array();
- foreach ($filter as $item => $pattern) {
-// $this->_pattern[$item] = '/'.preg_quote($pattern,"/").'/i'; // don't allow regex characters
- $this->_pattern[$item] = '/'.str_replace('/','\/',$pattern).'/i'; // allow regex characters
- }
- }
+ $this->_pattern = array();
+ foreach ($filter as $item => $pattern) {
+ // $this->_pattern[$item] = '/'.preg_quote($pattern,"/").'/i'; // don't allow regex characters
+ $this->_pattern[$item] = '/'.str_replace('/','\/',$pattern).'/i'; // allow regex characters
+ }
+ }
} \ No newline at end of file
diff --git a/lib/plugins/config/admin.php b/lib/plugins/config/admin.php
index 64906171d..0d314d2e6 100644
--- a/lib/plugins/config/admin.php
+++ b/lib/plugins/config/admin.php
@@ -38,10 +38,10 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
* handle user request
*/
function handle() {
- global $ID;
+ global $ID, $INPUT;
if (!$this->_restore_session()) return $this->_close_session();
- if (!isset($_REQUEST['save']) || ($_REQUEST['save'] != 1)) return $this->_close_session();
+ if ($INPUT->int('save') != 1) return $this->_close_session();
if (!checkSecurityToken()) return $this->_close_session();
if (is_null($this->_config)) { $this->_config = new configuration($this->_file); }
@@ -49,7 +49,7 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
// don't go any further if the configuration is locked
if ($this->_config->_locked) return $this->_close_session();
- $this->_input = $_REQUEST['config'];
+ $this->_input = $INPUT->arr('config');
while (list($key) = each($this->_config->setting)) {
$input = isset($this->_input[$key]) ? $this->_input[$key] : NULL;
@@ -118,6 +118,7 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
// config setting group
if ($in_fieldset) {
ptln(' </table>');
+ ptln(' </div>');
ptln(' </fieldset>');
} else {
$in_fieldset = true;
@@ -131,6 +132,7 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
}
ptln(' <fieldset id="'.$setting->_key.'">');
ptln(' <legend>'.$setting->prompt($this).'</legend>');
+ ptln(' <div class="table">');
ptln(' <table class="inline">');
} else {
// config settings
@@ -151,6 +153,7 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
}
ptln(' </table>');
+ ptln(' </div>');
if ($in_fieldset) {
ptln(' </fieldset>');
}
@@ -161,6 +164,7 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
usort($undefined_settings, '_setting_natural_comparison');
$this->_print_h1('undefined_settings', $this->getLang('_header_undefined'));
ptln('<fieldset>');
+ ptln('<div class="table">');
ptln('<table class="inline">');
$undefined_setting_match = array();
foreach($undefined_settings as $setting) {
@@ -175,6 +179,7 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
ptln(' </tr>');
}
ptln('</table>');
+ ptln('</div>');
ptln('</fieldset>');
}
@@ -270,10 +275,10 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
// the same for the active template
$tpl = $conf['template'];
- if (@file_exists(DOKU_TPLINC.$enlangfile)){
+ if (@file_exists(tpl_incdir().$enlangfile)){
$lang = array();
- @include(DOKU_TPLINC.$enlangfile);
- if ($conf['lang'] != 'en') @include(DOKU_TPLINC.$langfile);
+ @include(tpl_incdir().$enlangfile);
+ if ($conf['lang'] != 'en') @include(tpl_incdir().$langfile);
foreach ($lang as $key => $value){
$this->lang['tpl'.CM_KEYMARKER.$tpl.CM_KEYMARKER.$key] = $value;
}
@@ -346,7 +351,7 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
}
function _print_h1($id, $text) {
- ptln('<h1><a name="'.$id.'" id="'.$id.'">'.$text.'</a></h1>');
+ ptln('<h1 id="'.$id.'">'.$text.'</h1>');
}
diff --git a/lib/plugins/config/lang/ar/lang.php b/lib/plugins/config/lang/ar/lang.php
index 63d258485..2e55446ec 100644
--- a/lib/plugins/config/lang/ar/lang.php
+++ b/lib/plugins/config/lang/ar/lang.php
@@ -41,9 +41,13 @@ $lang['lang'] = 'لغة الواجهة';
$lang['basedir'] = 'مسار الخادوم (مثال. <code>/dokuwiki/</code>) اترك فارغا للاكتشاف التلقائي.';
$lang['baseurl'] = 'عنوان الخادوم (مثال. <code>http://www.yourserver.com</code>). اترك فارغا للاكتشاف التلقائي.';
$lang['savedir'] = 'دليل حفظ البيانات';
+$lang['cookiedir'] = 'مسار الكعكات. اترك فارغا لاستخدام baseurl.';
$lang['start'] = 'اسم صفحة البداية';
$lang['title'] = 'عنوان الويكي';
$lang['template'] = 'القالب';
+$lang['tagline'] = 'Tagline (في حال دعم القالب له)
+';
+$lang['sidebar'] = 'اسم صفحة الشريط الجانبي (في حال دعم القالب له). تركه فارغا يعطل الشريط الجانبي.';
$lang['license'] = 'تحت أي رخصة تريد اصدار المحتوى؟';
$lang['fullpath'] = 'اظهر المحتوى الكامل للصفحات في ';
$lang['recent'] = 'أحدث التغييرات';
@@ -64,6 +68,7 @@ $lang['useheading'] = 'استخدم اول ترويسة كأسم لل
$lang['refcheck'] = 'التحقق من مرجع الوسائط';
$lang['refshow'] = 'عدد مراجع الوسائط لتعرض';
$lang['allowdebug'] = 'مكّن التنقيح <b>عطّلها إن لم تكن بحاجلة لها!</b>';
+$lang['mediarevisions'] = 'تفعيل إصدارات الوسائط؟';
$lang['usewordblock'] = 'احجز الغثاء بناء على قائمة كلمات';
$lang['indexdelay'] = 'التأخير قبل الفهرسة (ثوان)';
$lang['relnofollow'] = 'استخدم rel="nofollow" للروابط الخارجية';
@@ -86,8 +91,8 @@ $lang['disableactions_other'] = 'اجراءات أخرى (مفصولة بالف
$lang['sneaky_index'] = 'افتراضيا، ستعرض دوكو ويكي كل اسماء النطاقات في عرض الفهرس. تفعيل هذا الخيار سيخفي مالا يملك المستخدم صلاحية قراءته. قد يؤدي هذا إلى اخفاء نطاقات فرعية متاحة. وقد يؤدي لجعل صفحة الفهرس معطلة في بعض اعدادات ACL.';
$lang['auth_security_timeout'] = 'زمن انتهاء أمان المواثقة (ثوان)';
$lang['securecookie'] = 'هل يفرض على كعكات التصفح المعدة عبر HTTPS ان ترسل فقط عبر HTTPS من قبل المتصفح؟ عطل هذا إن كان الولوج للويكي مؤمنا فقط عبر SSL لكن تصفح الويكي غير مؤمن.';
-$lang['xmlrpc'] = 'مكّن/عطل واجهة XML-RPC.';
-$lang['xmlrpcuser'] = 'احصر الوصول لـ XML-RPC بمستخدمين أو مجموعات مفصولة بالفاصلة هنا. اتركها فارغة لتمكين الوصول للجميع.';
+$lang['remote'] = 'مكّن نظام API البعيد. يسمح هذا لبرامج أخرى بالوصول للويكي عبر XML-RPC أو آليات أخرى.';
+$lang['remoteuser'] = 'احصر الوصول البعيد ل API لمستخدمين ومجموعات يفصل بينها بالفاصلة هنا. اترك فارغا لتمكين الجميع.';
$lang['updatecheck'] = 'تحقق من التحديثات و تنبيهات الأمان؟ دوكو ويكي ستحتاج للاتصال ب update.dokuwiki.org لأجل ذلك';
$lang['userewrite'] = 'استعمل عناوين URLs جميلة';
$lang['useslash'] = 'استخدم الشرطة كفاصل النطاق في العناوين';
@@ -111,10 +116,13 @@ $lang['jpg_quality'] = 'دقة ضغط JPG (0-100)';
$lang['subscribers'] = 'مكن دعم اشتراك الصفحة';
$lang['subscribe_time'] = 'المهلة بعد ارسال قوائم الاشتراكات والملخصات (ثوان); هذا يجب أن يكون أقل من الوقت المخصص في أيام أحدث التغييرات.';
$lang['compress'] = 'رُص مخرجات CSS و جافا سكربت';
+$lang['cssdatauri'] = 'الحجم بالبايتات للصور المذكورة في CSS التي ستُضمن في صفحة-التنسيق لخفض طلبات HTTP. لن تعمل هذه التقنية في IE 7 أو أقل! <code>400</code> إلى <code>600</code> بايت تعد قيمة جيدة. اضبط إلى <code>0</code> لتعطلها.';
$lang['hidepages'] = 'أخف الصفحات المنطبق عليها (تعابير شرطية)';
$lang['send404'] = 'ارسل "HTTP 404/Page Not Found" للصفحات غير الموجودة';
$lang['sitemap'] = 'ولد خرائط موقع جوجل (أيام)';
+$lang['broken_iua'] = 'هل الوظيفة ignore_user_abort معطلة على جهازك؟ قد يؤدي ذلك لتعطيل فهرسة البحث. IIS+PHP/CGI تعرف بأنها لاتعمل. أنظر <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">العلة 852</a> لمزيد من المعلومات.';
$lang['xsendfile'] = 'استخدم ترويسة X-Sendfile لتمكين خادم الوب من تقديم ملفات ثابتة؟ يجب أن يكون خادم الوب داعما له.';
+$lang['renderer_xhtml'] = 'المحرك ليستخدم لمخرجات الويكي الأساسية وفق (xhtml).';
$lang['renderer__core'] = '%s (نواة دوكو ويكي)';
$lang['renderer__plugin'] = '%s (ملحق)';
$lang['rememberme'] = 'اسمح بكعكات الدخول الدائم (تذكرني)';
@@ -124,6 +132,7 @@ $lang['rss_content'] = 'مالذي يعرض في عناصر تلقيم
$lang['rss_update'] = 'تحديث تلقيم XML (ثوان)';
$lang['recent_days'] = 'مدة إبقاء أحدث التغييرات (ايام)';
$lang['rss_show_summary'] = 'تلقيم XML يظهر ملخصا في العنوان';
+$lang['rss_media'] = 'مانوع التغييرات التي ستدرج في تغذية XML؟';
$lang['target____wiki'] = 'النافذة الهدف للروابط الداخلية';
$lang['target____interwiki'] = 'النافذة الهدف للروابط الممرة interwiki';
$lang['target____extern'] = 'النافذة الهدف للروابط الخارجية';
diff --git a/lib/plugins/config/lang/bg/lang.php b/lib/plugins/config/lang/bg/lang.php
index ff03fd9e2..43c961bfc 100644
--- a/lib/plugins/config/lang/bg/lang.php
+++ b/lib/plugins/config/lang/bg/lang.php
@@ -7,184 +7,260 @@
* @author Viktor Usunov <usun0v@mail.bg>
* @author Kiril <neohidra@gmail.com>
*/
-$lang['menu'] = 'Настройки';
-$lang['error'] = 'Обновяването на настройките не е възможно, поради невалидна стойност, моля, прегледайте промените си и пробвайте отново.
-<br />Неверните стойности ще бъдат обградени с червена рамка.';
-$lang['updated'] = 'Обновяването на настройките е успешно.';
-$lang['nochoice'] = '(няма друг възможен избор)';
-$lang['locked'] = 'Обновяването на файла с настройките не е възможно, ако това не е нарочно, проверете,<br /> дали името на локалния файл с настройки и правата са верни.';
-$lang['danger'] = 'Внимание: промяна на опцията може да направи wiki-то и менюто за настройване недостъпни.';
-$lang['warning'] = 'Предупреждение: промяна на опцията може предизвика нежелани последици.';
-$lang['security'] = 'Предупреждение: промяна на опцията може да представлява риск за сигурността.';
-$lang['_configuration_manager'] = 'Диспечер на настройките';
-$lang['_header_dokuwiki'] = 'Настройки на DokuWiki';
-$lang['_header_plugin'] = 'Настройки на приставки';
-$lang['_header_template'] = 'Настройки на шаблони';
-$lang['_header_undefined'] = 'Неопределени настройки';
-$lang['_basic'] = 'Основни настройки';
-$lang['_display'] = 'Настройки за изобразяване';
-$lang['_authentication'] = 'Настройки за удостоверяване';
-$lang['_anti_spam'] = 'Настройки за борба със SPAM-ма';
-$lang['_editing'] = 'Настройки за редактиране';
-$lang['_links'] = 'Настройки на препратките';
-$lang['_media'] = 'Настройки на медията';
-$lang['_advanced'] = 'Допълнителни настройки';
-$lang['_network'] = 'Мрежови настройки';
-$lang['_plugin_sufix'] = ' - настройки на приставката';
-$lang['_template_sufix'] = ' - настройки на шаблона';
+
+// for admin plugins, the menu prompt to be displayed in the admin menu
+// if set here, the plugin doesn't need to override the getMenuText() method
+$lang['menu'] = 'Настройки';
+
+$lang['error'] = 'Обновяването на настройките не е възможно, поради невалидна стойност, моля, прегледайте промените си и пробвайте отново.
+ <br />Неверните стойности ще бъдат обградени с червена рамка.';
+$lang['updated'] = 'Обновяването на настройките е успешно.';
+$lang['nochoice'] = '(няма друг възможен избор)';
+$lang['locked'] = 'Обновяването на файла с настройките не е възможно, ако това не е нарочно, проверете,<br />
+ дали името на локалния файл с настройки и правата са верни.';
+
+$lang['danger'] = 'Внимание: промяна на опцията може да направи Wiki-то и менюто за настройване недостъпни.';
+$lang['warning'] = 'Предупреждение: промяна на опцията може предизвика нежелани последици.';
+$lang['security'] = 'Предупреждение: промяна на опцията може да представлява риск за сигурността.';
+
+/* --- Config Setting Headers --- */
+$lang['_configuration_manager'] = 'Диспечер на настройките'; //same as heading in intro.txt
+$lang['_header_dokuwiki'] = 'Настройки на DokuWiki';
+$lang['_header_plugin'] = 'Настройки на приставки';
+$lang['_header_template'] = 'Настройки на шаблона';
+$lang['_header_undefined'] = 'Неопределени настройки';
+
+/* --- Config Setting Groups --- */
+$lang['_basic'] = 'Основни настройки';
+$lang['_display'] = 'Настройки за изобразяване';
+$lang['_authentication'] = 'Настройки за удостоверяване';
+$lang['_anti_spam'] = 'Настройки за борба със SPAM-ма';
+$lang['_editing'] = 'Настройки за редактиране';
+$lang['_links'] = 'Настройки на препратките';
+$lang['_media'] = 'Настройки на медията';
+$lang['_notifications'] = 'Настройки за известяване';
+$lang['_syndication'] = 'Настройки на RSS емисиите';
+$lang['_advanced'] = 'Допълнителни настройки';
+$lang['_network'] = 'Мрежови настройки';
+// The settings group name for plugins and templates can be set with
+// plugin_settings_name and template_settings_name respectively. If one
+// of these lang properties is not set, the group name will be generated
+// from the plugin or template name and the localized suffix.
+$lang['_plugin_sufix'] = ' (приставка)';
+$lang['_template_sufix'] = ' (шаблон)';
+
+/* --- Undefined Setting Messages --- */
$lang['_msg_setting_undefined'] = 'Няма метаданни за настройките.';
$lang['_msg_setting_no_class'] = 'Няма клас настройки.';
$lang['_msg_setting_no_default'] = 'Няма стандартна стойност.';
-$lang['fmode'] = 'Режим (права) за създаване на файлове';
-$lang['dmode'] = 'Режим (права) за създаване на директории';
-$lang['lang'] = 'Език';
-$lang['basedir'] = 'Главна директория (напр. <code>/dokuwiki/</code>). Оставете празно, за да бъде засечена автоматично.';
-$lang['baseurl'] = 'URL адрес (напр. <code>http://www.yourserver.com</code>). Оставете празно, за да бъде засечен автоматично.';
-$lang['savedir'] = 'Директория за записване на данните';
-$lang['cookiedir'] = 'Път за бисквитките. Оставите ли полето празно ще се ползва горния URL адрес.';
-$lang['start'] = 'Име на началната страница';
-$lang['title'] = 'Име на Wiki-то';
-$lang['template'] = 'Шаблон';
-$lang['license'] = 'Под какъв лиценз да бъде публикувано съдържанието?';
-$lang['fullpath'] = 'Показване на пълния път до страниците в долния колонтитул.';
-$lang['recent'] = 'Скорошни промени';
-$lang['breadcrumbs'] = 'Брой на следите';
-$lang['youarehere'] = 'Йерархични следи';
-$lang['typography'] = 'Замяна на последователност от символи с типографски еквивалент';
-$lang['htmlok'] = 'Разрешаване вграждането на HTML код';
-$lang['phpok'] = 'Разрешаване вграждането на PHP код';
-$lang['dformat'] = 'Формат на датата (виж. <a href="http://www.php.net/strftime">strftime</a> функцията на PHP)';
-$lang['signature'] = 'Подпис';
-$lang['toptoclevel'] = 'Главно ниво (заглавие) за съдържанието';
-$lang['tocminheads'] = 'Минимален брой заглавия, определящ дали да бъде създадено съдържание';
-$lang['maxtoclevel'] = 'Максимален брой нива (заглавия) за включване в съдържанието';
-$lang['maxseclevel'] = 'Максимален брой нива предоставяни за самостоятелно редактиране';
-$lang['camelcase'] = 'Ползване на CamelCase за линкове';
-$lang['deaccent'] = 'Почистване имената на страниците (на файловете)';
-$lang['useheading'] = 'Ползване на първото заглавие за име на страница';
-$lang['refcheck'] = 'Проверка за препратка към медия, преди да бъде изтрита';
-$lang['refshow'] = 'Брой на показваните медийни препратки';
-$lang['allowdebug'] = 'Включване на режи debug - <b>изключете, ако не е нужен!</b>';
-$lang['usewordblock'] = 'Блокиране на SPAM въз основа на на списък от думи';
-$lang['indexdelay'] = 'Забавяне преди индексиране (сек)';
-$lang['relnofollow'] = 'Ползване на rel="nofollow" за външни препратки';
-$lang['mailguard'] = 'Промяна на адресите на ел. поща (във форма непозволяваща пращането на SPAM)';
-$lang['iexssprotect'] = 'Проверяване на качените файлове за вероятен зловреден JavaScript и HTML код';
-$lang['showuseras'] = 'Какво да се показва за потребителя, който последно е променил страницата';
-$lang['useacl'] = 'Ползване на списъци за достъп';
-$lang['autopasswd'] = 'Автоматично генериране на пароли, на нови потребители и пращане по пощата';
-$lang['authtype'] = 'Метод за удостоверяване';
-$lang['passcrypt'] = 'Метод за криптиране на паролите';
-$lang['defaultgroup'] = 'Стандартна група';
-$lang['superuser'] = 'Супер потребител - група, потребител или списък със стойности разделени чрез запетая (user1,@group1,user2) с пълен достъп до всички страници и функции без значение от настройките на списъците за достъп (ACL)';
-$lang['manager'] = 'Управител - група, потребител или списък със стойности разделени чрез запетая (user1,@group1,user2) с достъп до определени управленски функции ';
-$lang['profileconfirm'] = 'Потвърждаване на промени в профила с парола';
-$lang['disableactions'] = 'Изключване функции на DokuWiki';
-$lang['disableactions_check'] = 'Проверка';
+
+/* -------------------- Config Options --------------------------- */
+
+/* Basic Settings */
+$lang['title'] = 'Заглавие за Wiki-то, тоест името';
+$lang['start'] = 'Име на началната страница';
+$lang['lang'] = 'Език на интерфейса';
+$lang['template'] = 'Шаблон (определя вида на страниците)';
+$lang['tagline'] = 'Подзаглавие - изобразява се под името на Wiki-то (ако се поддържа от шаблона)';
+$lang['sidebar'] = 'Име на страницата за страничната лента (ако се поддържа от шаблона). Оставите ли полето празно лентата ще бъде изключена';
+$lang['license'] = 'Под какъв лиценз да бъде публикувано съдържанието?';
+$lang['savedir'] = 'Директория за записване на данните';
+$lang['basedir'] = 'Главна директория (напр. <code>/dokuwiki/</code>). Оставете празно, за да бъде засечена автоматично.';
+$lang['baseurl'] = 'URL адрес (напр. <code>http://www.yourserver.com</code>). Оставете празно, за да бъде засечен автоматично.';
+$lang['cookiedir'] = 'Път за бисквитките. Оставите ли полето празно ще се ползва горния URL адрес.';
+$lang['dmode'] = 'Режим (права) за създаване на директории';
+$lang['fmode'] = 'Режим (права) за създаване на файлове';
+$lang['allowdebug'] = 'Включване на режи debug - <b>изключете, ако не е нужен!</b>';
+
+/* Display Settings */
+$lang['recent'] = 'Скорошни промени - брой еленти на страница';
+$lang['recent_days'] = 'Колко от скорошните промени да се пазят (дни)';
+$lang['breadcrumbs'] = 'Брой на следите. За изключване на функцията задайте 0.';
+$lang['youarehere'] = 'Йерархични следи (в този случай можете да изключите горната опция)';
+$lang['fullpath'] = 'Показване на пълния път до страниците в долния колонтитул.';
+$lang['typography'] = 'Замяна на последователност от символи с типографски еквивалент';
+$lang['dformat'] = 'Формат на датата (виж. <a href="http://www.php.net/strftime">strftime</a> функцията на PHP)';
+$lang['signature'] = 'Подпис - какво да внася бутона "Вмъкване на подпис" от редактора';
+$lang['showuseras'] = 'Какво да се показва за потребителя, който последно е променил дадена страницата';
+$lang['toptoclevel'] = 'Главно ниво (заглавие) за съдържанието';
+$lang['tocminheads'] = 'Минимален брой заглавия, определящ дали да бъде създадено съдържание';
+$lang['maxtoclevel'] = 'Максимален брой нива (заглавия) за включване в съдържанието';
+$lang['maxseclevel'] = 'Максимален брой нива предоставяни за самостоятелно редактиране';
+$lang['camelcase'] = 'Ползване на CamelCase за линкове';
+$lang['deaccent'] = 'Почистване имената на страниците (на файловете)';
+$lang['useheading'] = 'Ползване на първото заглавие за име на страница';
+$lang['sneaky_index'] = 'Стандартно DokuWiki ще показва всички именни пространства в индекса. Опцията скрива тези, за които потребителят няма права за четене. Това може да доведе и до скриване на иначе достъпни подименни пространства. С определени настройки на списъците за контрол на достъпа (ACL) може да направи индекса неизползваем. ';
+$lang['hidepages'] = 'Скриване на страниците съвпадащи с този регулярен израз(regular expressions)';
+
+/* Authentication Settings */
+$lang['useacl'] = 'Ползване на списъци за достъп';
+$lang['autopasswd'] = 'Автоматично генериране на пароли, на нови потребители и пращане по пощата';
+$lang['authtype'] = 'Метод за удостоверяване';
+$lang['passcrypt'] = 'Метод за криптиране на паролите';
+$lang['defaultgroup']= 'Стандартна група';
+$lang['superuser'] = 'Супер потребител - група, потребител или списък със стойности разделени чрез запетая (user1,@group1,user2) с пълен достъп до всички страници и функции без значение от настройките на списъците за достъп (ACL)';
+$lang['manager'] = 'Управител - група, потребител или списък със стойности разделени чрез запетая (user1,@group1,user2) с достъп до определени управленски функции ';
+$lang['profileconfirm'] = 'Потвърждаване на промени в профила с парола';
+$lang['rememberme'] = 'Ползване на постоянни бисквитки за вписване (за функцията "Запомни ме")';
+$lang['disableactions'] = 'Изключване функции на DokuWiki';
+$lang['disableactions_check'] = 'Проверка';
$lang['disableactions_subscription'] = 'Абониране/Отписване';
$lang['disableactions_wikicode'] = 'Преглед на кода/Експортиране на оригинална версия';
-$lang['disableactions_other'] = 'Други действия (разделени със запетая)';
-$lang['sneaky_index'] = 'Стандартно DokuWiki ще показва всички именни пространства в индекса. Опцията скрива тези, за които потребителят няма права за четене. Това може да доведе и до скриване на иначе достъпни подименни пространства. С определени настройки на списъците за контрол на достъпа (ACL) може да направи индекса неизползваем. ';
+$lang['disableactions_other'] = 'Други действия (разделени със запетая)';
$lang['auth_security_timeout'] = 'Автоматично проверяване на удостоверяването всеки (сек)';
-$lang['securecookie'] = 'Да се изпращат ли бисквитките зададени чрез HTTPS, само чрез HTTPS от браузъра? Изключете опцията, когато SSL се ползва само за вписване, а четенето е без SSL.
-';
-$lang['xmlrpc'] = 'Включване/Изключване на интерфейса XML-RPC.';
-$lang['xmlrpcuser'] = 'Ограничаване на XML-RPC достъпа до отделени със запетая групи или потребители. Оставете празно, за да даде достъп на всеки.';
-$lang['updatecheck'] = 'Проверяване за за нови версии и предупреждения за сигурността? Необходимо е Dokiwiki да може да се свързва със update.dokuwiki.org за тази функционалност.';
-$lang['userewrite'] = 'Ползване на nice URL адреси';
-$lang['useslash'] = 'Ползване на наклонена черта за разделител на именните пространства в URL';
-$lang['usedraft'] = 'Автоматично запазване на чернова по време на редактиране';
-$lang['sepchar'] = 'Разделител между думите в имената на страници';
-$lang['canonical'] = 'Ползване на напълно уеднаквени URL адреси (абсолютни адреси - http://server/path)';
-$lang['fnencode'] = 'Метод за кодиране на не-ASCII именуваните файлове.';
-$lang['autoplural'] = 'Проверяване за множествено число в препратките';
-$lang['compression'] = 'Метод за компресия на attic файлове';
-$lang['cachetime'] = 'Макс. период за съхраняване на кеша (сек)';
-$lang['locktime'] = 'Макс. период за съхраняване на заключените файлове (сек)';
-$lang['fetchsize'] = 'Максимален размер (байтове), който fetch.php може да сваля';
-$lang['notify'] = 'Пращане на съобщения за промени по страниците на следната eл. поща';
-$lang['registernotify'] = 'Пращане на информация за нови потребители на следната ел. поща';
-$lang['mailfrom'] = 'Ел. поща, която да се ползва за автоматично изпращане на ел. писма';
-$lang['mailprefix'] = 'Представка за темите (поле subject) на автоматично изпращаните ел. писма';
-$lang['gzip_output'] = 'Кодиране на съдържанието с gzip за xhtml';
-$lang['gdlib'] = 'Версия на GD Lib';
-$lang['im_convert'] = 'Път до инструмента за трансформация на ImageMagick';
-$lang['jpg_quality'] = 'Качество на JPG компресията (0-100)';
-$lang['subscribers'] = 'Включване на поддръжката за абониране към страници';
-$lang['subscribe_time'] = 'Време след което абонаментните списъци и обобщения се изпращат (сек); Трябва да е по-малко от времето определено в recent_days.';
-$lang['compress'] = 'Компактен CSS и javascript изглед';
-$lang['cssdatauri'] = 'Максимален размер, в байтове, до който изображенията посочени в .CSS файл ще бъдат вграждани в стила (stylesheet), за да се намали броя на HTTP заявките. Техниката не работи за версиите на IE преди 8! Препоръчителни стойности: <code>400</code> до <code>600</code> байта. Въведете <code>0</code> за изключване.';
-$lang['hidepages'] = 'Скриване на съвпадащите страници (regular expressions)';
-$lang['send404'] = 'Пращане на "HTTP 404/Page Not Found" за несъществуващи страници';
-$lang['sitemap'] = 'Генериране на Google sitemap (дни)';
-$lang['broken_iua'] = 'Отметнете, ако ignore_user_abort функцията не работи. Може да попречи на търсенето в страниците. Знае се, че комбинацията IIS+PHP/CGI е лоша. Вижте <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Грешка 852</a> за повече информация.';
-$lang['xsendfile'] = 'Ползване на Х-Sendfile header, за да може уебсървъра да дава статични файлове? Вашият уебсървър трябва да го поддържа.';
-$lang['renderer_xhtml'] = 'Представяне на основните изходни данни (xhtml) от wiki-то с';
-$lang['renderer__core'] = '%s (ядрото на DokuWiki)';
-$lang['renderer__plugin'] = '%s (приставка)';
-$lang['rememberme'] = 'Ползване на постоянни бисквитки за вписване (за функцията "Запомни ме")';
-$lang['rss_type'] = 'Тип на XML емисията';
-$lang['rss_linkto'] = 'XML емисията препраща към';
-$lang['rss_content'] = 'Какво да показват елементите на XML емисията?';
-$lang['rss_update'] = 'Интервал на актуализиране на XML емисията (сек)';
-$lang['recent_days'] = 'Колко от скорошните промени да се пазят (дни)';
-$lang['rss_show_summary'] = 'Показване на обобщение в заглавието на XML емисията';
-$lang['target____wiki'] = 'Прозорец за вътрешни препратки';
-$lang['target____interwiki'] = 'Прозорец за препратки в wiki-то';
-$lang['target____extern'] = 'Прозорец за външни препратки';
-$lang['target____media'] = 'Прозорец за медийни препратки';
-$lang['target____windows'] = 'Прозорец за препратки към Windows';
-$lang['proxy____host'] = 'Име на прокси сървър';
-$lang['proxy____port'] = 'Порт за проксито';
-$lang['proxy____user'] = 'Потребител за проксито';
-$lang['proxy____pass'] = 'Парола за проксито';
-$lang['proxy____ssl'] = 'Ползване на SSL при свързване с проксито';
-$lang['proxy____except'] = 'Регулярен израз определящ за кои URL адреси да не се ползва прокси сървър.';
-$lang['safemodehack'] = 'Ползване на хака safemode';
-$lang['ftp____host'] = 'FTP сървър за хака safemode';
-$lang['ftp____port'] = 'FTP порт за хака safemode';
-$lang['ftp____user'] = 'FTP потребител за хака safemode';
-$lang['ftp____pass'] = 'FTP парола за хака safemode';
-$lang['ftp____root'] = 'FTP главна директория за хака safemode';
-$lang['license_o_'] = 'Нищо не е избрано';
-$lang['typography_o_0'] = 'без';
-$lang['typography_o_1'] = 'с изключение на единични кавички';
-$lang['typography_o_2'] = 'включително единични кавички (не винаги работи)';
-$lang['userewrite_o_0'] = 'без';
-$lang['userewrite_o_1'] = 'файлът .htaccess';
-$lang['userewrite_o_2'] = 'вътрешно от DokuWiki ';
-$lang['deaccent_o_0'] = 'изключено';
-$lang['deaccent_o_1'] = 'премахване на акценти';
-$lang['deaccent_o_2'] = 'транслитерация';
-$lang['gdlib_o_0'] = 'GD Lib не е достъпна';
-$lang['gdlib_o_1'] = 'Версия 1.x';
-$lang['gdlib_o_2'] = 'Автоматично разпознаване';
-$lang['rss_type_o_rss'] = 'RSS версия 0.91';
-$lang['rss_type_o_rss1'] = 'RSS версия 1.0';
-$lang['rss_type_o_rss2'] = 'RSS версия 2.0';
-$lang['rss_type_o_atom'] = 'Atom версия 0.3';
-$lang['rss_type_o_atom1'] = 'Atom версия 1.0';
+$lang['securecookie'] = 'Да се изпращат ли бисквитките зададени чрез HTTPS, само чрез HTTPS от браузъра? Изключете опцията, когато SSL се ползва само за вписване, а четенето е без SSL.';
+$lang['remote'] = 'Включване на системата за отдалечен API достъп. Това ще позволи на приложения да се свързват с DokuWiki чрез XML-RPC или друг механизъм.';
+$lang['remoteuser'] = 'Ограничаване на отдалечения API достъп - активиране само за следните групи и потребители (отделени със запетая). Ако оставите полето празно всеки ще има достъп достъп.';
+
+/* Anti-Spam Settings */
+$lang['usewordblock'] = 'Блокиране на SPAM въз основа на на списък от думи';
+$lang['relnofollow'] = 'Ползване на rel="nofollow" за външни препратки';
+$lang['indexdelay'] = 'Забавяне преди индексиране (сек)';
+$lang['mailguard'] = 'Промяна на адресите на ел. поща (във форма непозволяваща пращането на SPAM)';
+$lang['iexssprotect'] = 'Проверяване на качените файлове за вероятен зловреден JavaScript и HTML код';
+
+/* Editing Settings */
+$lang['usedraft'] = 'Автоматично запазване на чернова по време на редактиране';
+$lang['htmlok'] = 'Разрешаване вграждането на HTML код';
+$lang['phpok'] = 'Разрешаване вграждането на PHP код';
+$lang['locktime'] = 'Макс. период за съхраняване на заключените файлове (сек)';
+$lang['cachetime'] = 'Макс. период за съхраняване на кеша (сек)';
+
+/* Link settings */
+$lang['target____wiki'] = 'Прозорец за вътрешни препратки';
+$lang['target____interwiki'] = 'Прозорец за препратки към други Wiki сайтове';
+$lang['target____extern'] = 'Прозорец за външни препратки';
+$lang['target____media'] = 'Прозорец за медийни препратки';
+$lang['target____windows'] = 'Прозорец за препратки към Windows';
+
+/* Media Settings */
+$lang['mediarevisions'] = 'Да се пазят ли стари версии на качените файлове (Mediarevisions)?';
+$lang['refcheck'] = 'Проверка за препратка към медия, преди да бъде изтрита';
+$lang['refshow'] = 'Брой на показваните медийни препратки';
+$lang['gdlib'] = 'Версия на GD Lib';
+$lang['im_convert'] = 'Път до инструмента за трансформация на ImageMagick';
+$lang['jpg_quality'] = 'Качество на JPG компресията (0-100)';
+$lang['fetchsize'] = 'Максимален размер (байтове), който fetch.php може да сваля';
+
+/* Notification Settings */
+$lang['subscribers'] = 'Включване на поддръжката за абониране към страници';
+$lang['subscribe_time'] = 'Време след което абонаментните списъци и обобщения се изпращат (сек); Трябва да е по-малко от времето определено в recent_days.';
+$lang['notify'] = 'Пращане на съобщения за промени по страниците на следната eл. поща';
+$lang['registernotify'] = 'Пращане на информация за нови потребители на следната ел. поща';
+$lang['mailfrom'] = 'Ел. поща, която да се ползва за автоматично изпращане на ел. писма';
+$lang['mailprefix'] = 'Представка за темите (поле subject) на автоматично изпращаните ел. писма';
+$lang['htmlmail'] = 'Изпращане на по-добре изглеждащи, но по-големи по-размер HTML ел. писма. Изключете ако желаете писмата да се изпращат като чист текст.';
+
+/* Syndication Settings */
+$lang['sitemap'] = 'Генериране на Google sitemap (дни)';
+$lang['rss_type'] = 'Тип на XML емисията';
+$lang['rss_linkto'] = 'XML емисията препраща към';
+$lang['rss_content'] = 'Какво да показват елементите на XML емисията?';
+$lang['rss_update'] = 'Интервал на актуализиране на XML емисията (сек)';
+$lang['rss_show_summary'] = 'Показване на обобщение в заглавието на XML емисията';
+$lang['rss_media'] = 'Кой тип промени да се включват в XML мисията?';
+
+/* Advanced Options */
+$lang['updatecheck'] = 'Проверяване за за нови версии и предупреждения за сигурността? Необходимо е Dokiwiki да може да се свързва със update.dokuwiki.org за тази функционалност.';
+$lang['userewrite'] = 'Ползване на nice URL адреси';
+$lang['useslash'] = 'Ползване на наклонена черта за разделител на именните пространства в URL';
+$lang['sepchar'] = 'Разделител между думите в имената на страници';
+$lang['canonical'] = 'Ползване на напълно уеднаквени URL адреси (абсолютни адреси - http://server/path)';
+$lang['fnencode'] = 'Метод за кодиране на не-ASCII именуваните файлове.';
+$lang['autoplural'] = 'Проверяване за множествено число в препратките';
+$lang['compression'] = 'Метод за компресия на attic файлове';
+$lang['gzip_output'] = 'Кодиране на съдържанието с gzip за xhtml';
+$lang['compress'] = 'Компактен CSS и javascript изглед';
+$lang['cssdatauri'] = 'Максимален размер, в байтове, до който изображенията посочени в .CSS файл ще бъдат вграждани в стила (stylesheet), за да се намали броя на HTTP заявките. Техниката не работи за версиите на IE преди 8! Препоръчителни стойности: <code>400</code> до <code>600</code> байта. Въведете <code>0</code> за изключване.';
+$lang['send404'] = 'Пращане на "HTTP 404/Page Not Found" за несъществуващи страници';
+$lang['broken_iua'] = 'Отметнете, ако ignore_user_abort функцията не работи. Може да попречи на търсенето в страниците. Знае се, че комбинацията IIS+PHP/CGI е лоша. Вижте <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Грешка 852</a> за повече информация.';
+$lang['xsendfile'] = 'Ползване на Х-Sendfile header, за да може уебсървъра да дава статични файлове? Вашият уебсървър трябва да го поддържа.';
+$lang['renderer_xhtml'] = 'Представяне на основните изходни данни (xhtml) от Wiki-то с';
+$lang['renderer__core'] = '%s (ядрото на DokuWiki)';
+$lang['renderer__plugin'] = '%s (приставка)';
+
+/* Network Options */
+$lang['dnslookups'] = 'DokuWiki ще търси имената на хостовете, на отдалечени IP адреси, от които потребители редактират страници. НЕ е желателно да ползвате опцията ако имате бавен или неработещ DNS сървър.';
+
+/* Proxy Options */
+$lang['proxy____host'] = 'Име на прокси сървър';
+$lang['proxy____port'] = 'Порт за проксито';
+$lang['proxy____user'] = 'Потребител за проксито';
+$lang['proxy____pass'] = 'Парола за проксито';
+$lang['proxy____ssl'] = 'Ползване на SSL при свързване с проксито';
+$lang['proxy____except'] = 'Регулярен израз определящ за кои URL адреси да не се ползва прокси сървър.';
+
+/* Safemode Hack */
+$lang['safemodehack'] = 'Ползване на хака safemode';
+$lang['ftp____host'] = 'FTP сървър за хака safemode';
+$lang['ftp____port'] = 'FTP порт за хака safemode';
+$lang['ftp____user'] = 'FTP потребител за хака safemode';
+$lang['ftp____pass'] = 'FTP парола за хака safemode';
+$lang['ftp____root'] = 'FTP главна директория за хака safemode';
+
+/* License Options */
+$lang['license_o_'] = 'Нищо не е избрано';
+
+/* typography options */
+$lang['typography_o_0'] = 'без';
+$lang['typography_o_1'] = 'с изключение на единични кавички';
+$lang['typography_o_2'] = 'включително единични кавички (не винаги работи)';
+
+/* userewrite options */
+$lang['userewrite_o_0'] = 'без';
+$lang['userewrite_o_1'] = 'файлът .htaccess';
+$lang['userewrite_o_2'] = 'вътрешно от DokuWiki ';
+
+/* deaccent options */
+$lang['deaccent_o_0'] = 'изключено';
+$lang['deaccent_o_1'] = 'премахване на акценти';
+$lang['deaccent_o_2'] = 'транслитерация';
+
+/* gdlib options */
+$lang['gdlib_o_0'] = 'GD Lib не е достъпна';
+$lang['gdlib_o_1'] = 'Версия 1.x';
+$lang['gdlib_o_2'] = 'Автоматично разпознаване';
+
+/* rss_type options */
+$lang['rss_type_o_rss'] = 'RSS версия 0.91';
+$lang['rss_type_o_rss1'] = 'RSS версия 1.0';
+$lang['rss_type_o_rss2'] = 'RSS версия 2.0';
+$lang['rss_type_o_atom'] = 'Atom версия 0.3';
+$lang['rss_type_o_atom1'] = 'Atom версия 1.0';
+
+/* rss_content options */
$lang['rss_content_o_abstract'] = 'Извлечение';
-$lang['rss_content_o_diff'] = 'Обединени разлики';
+$lang['rss_content_o_diff'] = 'Обединени разлики';
$lang['rss_content_o_htmldiff'] = 'Таблица с разликите в HTML формат';
-$lang['rss_content_o_html'] = 'Цялото съдържание на HTML страницата';
+$lang['rss_content_o_html'] = 'Цялото съдържание на HTML страницата';
+
+/* rss_linkto options */
$lang['rss_linkto_o_diff'] = 'изглед на разликите';
$lang['rss_linkto_o_page'] = 'променената страница';
$lang['rss_linkto_o_rev'] = 'списък на версиите';
$lang['rss_linkto_o_current'] = 'текущата страница';
-$lang['compression_o_0'] = 'без';
-$lang['compression_o_gz'] = 'gzip';
-$lang['compression_o_bz2'] = 'bz2';
-$lang['xsendfile_o_0'] = 'не използвайте';
-$lang['xsendfile_o_1'] = 'Специфичен lighttpd header (преди версия 1.5)';
-$lang['xsendfile_o_2'] = 'Стандартен X-Sendfile header';
-$lang['xsendfile_o_3'] = 'Специфичен Nginx X-Accel-Redirect header за пренасочване';
-$lang['showuseras_o_loginname'] = 'Име за вписване';
-$lang['showuseras_o_username'] = 'Пълно потребителско име';
-$lang['showuseras_o_email'] = 'Ел, поща (променени според настройките на mailguard)';
+
+/* compression options */
+$lang['compression_o_0'] = 'без';
+$lang['compression_o_gz'] = 'gzip';
+$lang['compression_o_bz2'] = 'bz2';
+
+/* xsendfile header */
+$lang['xsendfile_o_0'] = 'без';
+$lang['xsendfile_o_1'] = 'Специфичен lighttpd header (преди версия 1.5)';
+$lang['xsendfile_o_2'] = 'Стандартен X-Sendfile header';
+$lang['xsendfile_o_3'] = 'Специфичен Nginx X-Accel-Redirect header за пренасочване';
+
+/* Display user info */
+$lang['showuseras_o_loginname'] = 'Име за вписване';
+$lang['showuseras_o_username'] = 'Пълно потребителско име';
+$lang['showuseras_o_email'] = 'Ел, поща (променени според настройките на mailguard)';
$lang['showuseras_o_email_link'] = 'Ел. поща под формата на връзка тип mailto:';
-$lang['useheading_o_0'] = 'Никога';
+
+/* useheading options */
+$lang['useheading_o_0'] = 'Никога';
$lang['useheading_o_navigation'] = 'Само за навигация';
-$lang['useheading_o_content'] = 'Само за съдържанието на Wiki-то';
-$lang['useheading_o_1'] = 'Винаги';
-$lang['readdircache'] = 'Максимален период за съхраняване кеша на readdir (сек)';
+$lang['useheading_o_content'] = 'Само за съдържанието на Wiki-то';
+$lang['useheading_o_1'] = 'Винаги';
+
+$lang['readdircache'] = 'Максимален период за съхраняване кеша на readdir (сек)';
diff --git a/lib/plugins/config/lang/ca-valencia/lang.php b/lib/plugins/config/lang/ca-valencia/lang.php
index 76f11a4a5..4a8c10895 100644
--- a/lib/plugins/config/lang/ca-valencia/lang.php
+++ b/lib/plugins/config/lang/ca-valencia/lang.php
@@ -86,8 +86,6 @@ $lang['disableactions_other'] = 'Atres accions (separades per comes)';
$lang['sneaky_index'] = 'Normalment, DokuWiki mostra tots els espais de noms en la vista d\'índex. Activant esta opció s\'ocultaran aquells per als que l\'usuari no tinga permís de llectura. Açò pot ocultar subespais accessibles i inutilisar l\'índex per a certes configuracions del ACL.';
$lang['auth_security_timeout'] = 'Temps de seguritat màxim per a l\'autenticació (segons)';
$lang['securecookie'] = '¿El navegador deuria enviar per HTTPS només les galletes que s\'han generat per HTTPS? Desactive esta opció quan utilise SSL només en la pàgina d\'inici de sessió.';
-$lang['xmlrpc'] = 'Activar/desactivar interfaç XML-RPC.';
-$lang['xmlrpcuser'] = 'Restringir l\'accés XML-RPC a la llista d\'usuaris i grups separada per comes definida ací. Deixar buit per a donar accés a tots.';
$lang['updatecheck'] = '¿Buscar actualisacions i advertències de seguritat? DokuWiki necessita conectar a update.dokuwiki.org per ad açò.';
$lang['userewrite'] = 'Utilisar URL millorades';
$lang['useslash'] = 'Utilisar \'/\' per a separar espais de noms en les URL';
diff --git a/lib/plugins/config/lang/ca/lang.php b/lib/plugins/config/lang/ca/lang.php
index 1a2a22881..84680450a 100644
--- a/lib/plugins/config/lang/ca/lang.php
+++ b/lib/plugins/config/lang/ca/lang.php
@@ -86,8 +86,6 @@ $lang['disableactions_other'] = 'Altres accions (separades per comes)';
$lang['sneaky_index'] = 'Per defecte, DokuWiki mostrarà tots els espai en la visualització d\'índex. Si activeu aquest paràmetre, s\'ocultaran aquells espais en els quals l\'usuari no té accés de lectura. Això pot fer que s\'ocultin subespais que sí que són accessibles. En algunes configuracions ACL pot fer que l\'índex resulti inutilitzable.';
$lang['auth_security_timeout'] = 'Temps d\'espera de seguretat en l\'autenticació (segons)';
$lang['securecookie'] = 'Les galetes que s\'han creat via HTTPS, només s\'han d\'enviar des del navegador per HTTPS? Inhabiliteu aquesta opció si només l\'inici de sessió del wiki es fa amb SSL i la navegació del wiki es fa sense seguretat.';
-$lang['xmlrpc'] = 'Habilita/inhabilita la interfície XML-RPC';
-$lang['xmlrpcuser'] = 'Restringeix l\'accés per XML-RPC als usuaris o grups següents, separats per comes. Deixeu aquest camp en blanc per donar accés a tothom.';
$lang['updatecheck'] = 'Comprova actualitzacions i avisos de seguretat. DokuWiki necessitarà contactar amb update.dokuwiki.org per utilitzar aquesta característica.';
$lang['userewrite'] = 'Utilitza URL nets';
$lang['useslash'] = 'Utilitza la barra / com a separador d\'espais en els URL';
diff --git a/lib/plugins/config/lang/cs/lang.php b/lib/plugins/config/lang/cs/lang.php
index bf87e99d5..d2ec5035a 100644
--- a/lib/plugins/config/lang/cs/lang.php
+++ b/lib/plugins/config/lang/cs/lang.php
@@ -10,6 +10,7 @@
* @author Lefty <lefty@multihost.cz>
* @author Vojta Beran <xmamut@email.cz>
* @author zbynek.krivka@seznam.cz
+ * @author Bohumir Zamecnik <bohumir.zamecnik@gmail.com>
*/
$lang['menu'] = 'Správa nastavení';
$lang['error'] = 'Nastavení nebyla změněna kvůli alespoň jedné neplatné položce,
@@ -42,26 +43,27 @@ $lang['_template_sufix'] = 'Nastavení šablon';
$lang['_msg_setting_undefined'] = 'Chybí metadata položky.';
$lang['_msg_setting_no_class'] = 'Chybí třída položky.';
$lang['_msg_setting_no_default'] = 'Chybí výchozí hodnota položky.';
-$lang['fmode'] = 'Přístupová práva pro vytváření souborů';
-$lang['dmode'] = 'Přístupová práva pro vytváření adresářů';
+$lang['title'] = 'Název celé wiki';
+$lang['start'] = 'Název úvodní stránky';
$lang['lang'] = 'Jazyk';
+$lang['template'] = 'Šablona';
+$lang['license'] = 'Pod jakou licencí má být tento obsah publikován?';
+$lang['savedir'] = 'Adresář pro ukládání dat';
$lang['basedir'] = 'Kořenový adresář (např. <code>/dokuwiki/</code>). Pro autodetekci nechte prázdné.';
$lang['baseurl'] = 'Kořenové URL (např. <code>http://www.yourserver.com</code>). Pro autodetekci nechte prázdné.';
-$lang['savedir'] = 'Adresář pro ukládání dat';
$lang['cookiedir'] = 'Cesta pro cookie. Není-li vyplněno, použije se kořenové URL.';
-$lang['start'] = 'Název úvodní stránky';
-$lang['title'] = 'Název celé wiki';
-$lang['template'] = 'Šablona';
-$lang['license'] = 'Pod jakou licencí má být tento obsah publikován?';
-$lang['fullpath'] = 'Ukazovat plnou cestu ke stránkám v patičce';
+$lang['dmode'] = 'Přístupová práva pro vytváření adresářů';
+$lang['fmode'] = 'Přístupová práva pro vytváření souborů';
+$lang['allowdebug'] = 'Povolit debugování. <b>Vypněte, pokud to nepotřebujete!</b>';
$lang['recent'] = 'Nedávné změny';
+$lang['recent_days'] = 'Jak staré nedávných změny uchovávat (ve dnech)';
$lang['breadcrumbs'] = 'Počet odkazů na navštívené stránky';
$lang['youarehere'] = 'Hierarchická "drobečková" navigace';
+$lang['fullpath'] = 'Ukazovat plnou cestu ke stránkám v patičce';
$lang['typography'] = 'Provádět typografické nahrazování';
-$lang['htmlok'] = 'Povolit vložené HTML';
-$lang['phpok'] = 'Povolit vložené PHP';
$lang['dformat'] = 'Formát data (viz PHP funkci <a href="http://www.php.net/strftime">strftime</a>)';
$lang['signature'] = 'Podpis';
+$lang['showuseras'] = 'Co se má přesně zobrazit, když se ukazuje uživatel, který naposledy editoval stránku';
$lang['toptoclevel'] = 'Nejvyšší úroveň, kterou začít automaticky generovaný obsah';
$lang['tocminheads'] = 'Nejnižší počet hlavních nadpisů, aby se vygeneroval obsah';
$lang['maxtoclevel'] = 'Maximální počet úrovní v automaticky generovaném obsahu';
@@ -69,15 +71,13 @@ $lang['maxseclevel'] = 'Nejnižší úroveň pro editaci i po sekcích
$lang['camelcase'] = 'Používat CamelCase v odkazech';
$lang['deaccent'] = 'Čistit názvy stránek';
$lang['useheading'] = 'Používat první nadpis jako název stránky';
-$lang['refcheck'] = 'Kontrolovat odkazy na média (před vymazáním)';
-$lang['refshow'] = 'Počet zobrazených odkazů na média';
-$lang['allowdebug'] = 'Povolit debugování. <b>Vypněte, pokud to nepotřebujete!</b>';
-$lang['usewordblock'] = 'Blokovat spam za použití seznamu známých spamových slov';
-$lang['indexdelay'] = 'Časová prodleva před indexací (v sekundách)';
-$lang['relnofollow'] = 'Používat rel="nofollow" na externí odkazy';
-$lang['mailguard'] = 'Metoda "zamaskování" emailových adres';
-$lang['iexssprotect'] = 'Zkontrolovat nahrané soubory vůči možnému škodlivému JavaScriptu či HTML';
-$lang['showuseras'] = 'Co se má přesně zobrazit, když se ukazuje uživatel, který naposledy editoval stránku';
+$lang['sneaky_index'] = 'Ve výchozím nastavení DokuWiki zobrazuje v indexu všechny
+jmenné prostory. Zapnutím této volby se skryjí ty jmenné prostory,
+k nimž uživatel nemá právo pro čtení, což může ale způsobit, že
+vnořené jmenné prostory, k nimž právo má, budou přesto skryty.
+To může mít za následek, že index bude při některých
+nastaveních ACL nepoužitelný.';
+$lang['hidepages'] = 'Skrýt stránky odpovídající vzoru (regulární výrazy)';
$lang['useacl'] = 'Používat přístupová práva (ACL)';
$lang['autopasswd'] = 'Generovat hesla automaticky';
$lang['authtype'] = 'Metoda autentizace';
@@ -86,65 +86,65 @@ $lang['defaultgroup'] = 'Výchozí skupina';
$lang['superuser'] = 'Superuživatel - skupina nebo uživatel s plnými právy pro přístup ke všem stránkách bez ohledu na nastavení ACL';
$lang['manager'] = 'Manažer - skupina nebo uživatel s přístupem k některým správcovským funkcím';
$lang['profileconfirm'] = 'Potvrdit změny v profilu zadáním hesla';
+$lang['rememberme'] = 'Povolit trvaté přihlašovací cookies (zapamatuj si mě)';
$lang['disableactions'] = 'Vypnout DokuWiki akce';
$lang['disableactions_check'] = 'Zkontrolovat';
$lang['disableactions_subscription'] = 'Přihlásit se/Odhlásit se ze seznamu pro odběr změn';
$lang['disableactions_wikicode'] = 'Prohlížet zdrojové kódy/Export wiki textu';
$lang['disableactions_other'] = 'Další akce (oddělené čárkou)';
-$lang['sneaky_index'] = 'Ve výchozím nastavení DokuWiki zobrazuje v indexu všechny
-jmenné prostory. Zapnutím této volby se skryjí ty jmenné prostory,
-k nimž uživatel nemá právo pro čtení, což může ale způsobit, že
-vnořené jmenné prostory, k nimž právo má, budou přesto skryty.
-To může mít za následek, že index bude při některých
-nastaveních ACL nepoužitelný.';
$lang['auth_security_timeout'] = 'Časový limit pro autentikaci (v sekundách)';
$lang['securecookie'] = 'Má prohlížeč posílat cookies nastavené přes HTTPS opět jen přes HTTPS? Vypněte tuto volbu, pokud chcete, aby bylo pomocí SSL zabezpečeno pouze přihlašování do wiki, ale obsah budete prohlížet nezabezpečeně.';
-$lang['xmlrpc'] = 'Povolit/Zakázat rozhraní XML-RPC.';
-$lang['xmlrpcuser'] = 'Omezit přístup pomocí XML-RPC pouze na zde zadané skupiny či uživatele (oddělené čárkami). Necháte-li pole prázdné, dáte přístup komukoliv.';
+$lang['usewordblock'] = 'Blokovat spam za použití seznamu známých spamových slov';
+$lang['relnofollow'] = 'Používat rel="nofollow" na externí odkazy';
+$lang['indexdelay'] = 'Časová prodleva před indexací (v sekundách)';
+$lang['mailguard'] = 'Metoda "zamaskování" emailových adres';
+$lang['iexssprotect'] = 'Zkontrolovat nahrané soubory vůči možnému škodlivému JavaScriptu či HTML';
+$lang['usedraft'] = 'Během editace ukládat koncept automaticky';
+$lang['htmlok'] = 'Povolit vložené HTML';
+$lang['phpok'] = 'Povolit vložené PHP';
+$lang['locktime'] = 'Maximální životnost zámkových souborů (v sekundách)';
+$lang['cachetime'] = 'Maximální životnost cache (v sekundách)';
+$lang['target____wiki'] = 'Cílové okno pro interní odkazy';
+$lang['target____interwiki'] = 'Cílové okno pro interwiki odkazy';
+$lang['target____extern'] = 'Cílové okno pro externí odkazy';
+$lang['target____media'] = 'Cílové okno pro odkazy na média';
+$lang['target____windows'] = 'Cílové okno pro odkazy na windows sdílení';
+$lang['refcheck'] = 'Kontrolovat odkazy na média (před vymazáním)';
+$lang['refshow'] = 'Počet zobrazených odkazů na média';
+$lang['gdlib'] = 'Verze GD knihovny';
+$lang['im_convert'] = 'Cesta k nástroji convert z balíku ImageMagick';
+$lang['jpg_quality'] = 'Kvalita komprese JPEG (0-100)';
+$lang['fetchsize'] = 'Maximální velikost souboru (v bajtech), co ještě fetch.php bude stahovat z externích zdrojů';
+$lang['subscribers'] = 'Možnost přihlásit se k odběru novinek stránky';
+$lang['subscribe_time'] = 'Časový interval v sekundách, ve kterém jsou posílány změny a souhrny změn. Interval by neměl být kratší než čas uvedený v recent_days.';
+$lang['notify'] = 'Posílat oznámení o změnách na následující emailovou adresu';
+$lang['registernotify'] = 'Posílat informace o nově registrovaných uživatelích na tuto mailovou adresu';
+$lang['mailfrom'] = 'E-mailová adresa, která se bude používat pro automatické maily';
+$lang['mailprefix'] = 'Předpona předmětu e-mailu, která se bude používat pro automatické maily';
+$lang['sitemap'] = 'Generovat Google sitemap (interval ve dnech)';
+$lang['rss_type'] = 'Typ XML kanálu';
+$lang['rss_linkto'] = 'XML kanál odkazuje na';
+$lang['rss_content'] = 'Co zobrazovat v položkách XML kanálu?';
+$lang['rss_update'] = 'Interval aktualizace XML kanálu (v sekundách)';
+$lang['rss_show_summary'] = 'XML kanál ukazuje souhrn v titulku';
$lang['updatecheck'] = 'Kontrolovat aktualizace a bezpečnostní varování? DokuWiki potřebuje pro tuto funkci přístup k update.dokuwiki.org';
$lang['userewrite'] = 'Používat "pěkná" URL';
$lang['useslash'] = 'Používat lomítko jako oddělovač jmenných prostorů v URL';
-$lang['usedraft'] = 'Během editace ukládat koncept automaticky';
$lang['sepchar'] = 'Znak pro oddělování slov v názvech stránek';
$lang['canonical'] = 'Používat plně kanonická URL';
$lang['fnencode'] = 'Metoda pro kódování ne-ASCII názvů souborů';
$lang['autoplural'] = 'Kontrolovat plurálové tvary v odkazech';
$lang['compression'] = 'Metoda komprese pro staré verze';
-$lang['cachetime'] = 'Maximální životnost cache (v sekundách)';
-$lang['locktime'] = 'Maximální životnost zámkových souborů (v sekundách)';
-$lang['fetchsize'] = 'Maximální velikost souboru (v bajtech), co ještě fetch.php bude stahovat z externích zdrojů';
-$lang['notify'] = 'Posílat oznámení o změnách na následující emailovou adresu';
-$lang['registernotify'] = 'Posílat informace o nově registrovaných uživatelích na tuto mailovou adresu';
-$lang['mailfrom'] = 'E-mailová adresa, která se bude používat pro automatické maily';
-$lang['mailprefix'] = 'Předpona předmětu e-mailu, která se bude používat pro automatické maily';
$lang['gzip_output'] = 'Používat pro xhtml Content-Encoding gzip';
-$lang['gdlib'] = 'Verze GD knihovny';
-$lang['im_convert'] = 'Cesta k nástroji convert z balíku ImageMagick';
-$lang['jpg_quality'] = 'Kvalita komprese JPEG (0-100)';
-$lang['subscribers'] = 'Možnost přihlásit se k odběru novinek stránky';
-$lang['subscribe_time'] = 'Časový interval v sekundách, ve kterém jsou posílány změny a souhrny změn. Interval by neměl být kratší než čas uvedený v recent_days.';
$lang['compress'] = 'Zahustit CSS a JavaScript výstup';
$lang['cssdatauri'] = 'Velikost [v bajtech] obrázků odkazovaných v CSS souborech, které budou pro ušetření HTTP požadavku vestavěny do stylu. Tato technika nefunguje v IE 7 a starším. Doporučená hodnota je mezi <code>400</code> a <code>600</code> bajty. Pro vypnutí nastavte na <code>0</code>.';
-$lang['hidepages'] = 'Skrýt stránky odpovídající vzoru (regulární výrazy)';
$lang['send404'] = 'Posílat "HTTP 404/Page Not Found" pro neexistují stránky';
-$lang['sitemap'] = 'Generovat Google sitemap (interval ve dnech)';
$lang['broken_iua'] = 'Je na vašem systému funkce ignore_user_abort porouchaná? To může způsobovat nefunkčnost vyhledávacího indexu. O kombinaci IIS+PHP/CGI je známo, že nefunguje správně. Viz <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> pro více informací.';
$lang['xsendfile'] = 'Používat X-Sendfile hlavničky pro download statických souborů z webserveru? Je však požadována podpora této funkce na straně Vašeho webserveru.';
$lang['renderer_xhtml'] = 'Vykreslovací jádro pro hlavní (xhtml) výstup wiki';
$lang['renderer__core'] = '%s (jádro DokuWiki)';
$lang['renderer__plugin'] = '%s (plugin)';
-$lang['rememberme'] = 'Povolit trvaté přihlašovací cookies (zapamatuj si mě)';
-$lang['rss_type'] = 'Typ XML kanálu';
-$lang['rss_linkto'] = 'XML kanál odkazuje na';
-$lang['rss_content'] = 'Co zobrazovat v položkách XML kanálu?';
-$lang['rss_update'] = 'Interval aktualizace XML kanálu (v sekundách)';
-$lang['recent_days'] = 'Jak staré nedávných změny uchovávat (ve dnech)';
-$lang['rss_show_summary'] = 'XML kanál ukazuje souhrn v titulku';
-$lang['target____wiki'] = 'Cílové okno pro interní odkazy';
-$lang['target____interwiki'] = 'Cílové okno pro interwiki odkazy';
-$lang['target____extern'] = 'Cílové okno pro externí odkazy';
-$lang['target____media'] = 'Cílové okno pro odkazy na média';
-$lang['target____windows'] = 'Cílové okno pro odkazy na windows sdílení';
+$lang['dnslookups'] = 'DokuWiki zjišťuje DNS jména pro vzdálené IP adresy uživatelů, kteří editují stránky. Pokud máte pomalý, nebo nefunkční DNS server, nebo nepotřebujete tuto funkci, tak tuto volbu zrušte.';
$lang['proxy____host'] = 'Název proxy serveru';
$lang['proxy____port'] = 'Proxy port';
$lang['proxy____user'] = 'Proxy uživatelské jméno';
diff --git a/lib/plugins/config/lang/da/lang.php b/lib/plugins/config/lang/da/lang.php
index a4c0bba75..239a4986f 100644
--- a/lib/plugins/config/lang/da/lang.php
+++ b/lib/plugins/config/lang/da/lang.php
@@ -11,6 +11,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['menu'] = 'Opsætningsindstillinger';
$lang['error'] = 'Indstillingerne blev ikke opdateret på grund af en ugyldig værdi, Gennemse venligst dine ændringer og gem dem igen.
@@ -34,6 +35,7 @@ $lang['_anti_spam'] = 'Trafikkontrolsindstillinger';
$lang['_editing'] = 'Redigeringsindstillinger';
$lang['_links'] = 'Henvisningsindstillinger';
$lang['_media'] = 'Medieindstillinger';
+$lang['_notifications'] = 'Notificeringsindstillinger';
$lang['_advanced'] = 'Avancerede indstillinger';
$lang['_network'] = 'Netværksindstillinger';
$lang['_plugin_sufix'] = 'Udvidelsesindstillinger';
@@ -41,25 +43,29 @@ $lang['_template_sufix'] = 'Skabelonindstillinger';
$lang['_msg_setting_undefined'] = 'Ingen indstillingsmetadata.';
$lang['_msg_setting_no_class'] = 'Ingen indstillingsklasse.';
$lang['_msg_setting_no_default'] = 'Ingen standardværdi.';
-$lang['fmode'] = 'Filoprettelsestilstand';
-$lang['dmode'] = 'Katalogoprettelsestilstand';
-$lang['lang'] = 'Sprog';
-$lang['basedir'] = 'Grundkatalog';
-$lang['baseurl'] = 'Grundadresse';
-$lang['savedir'] = 'Katalog til opbevaring af data';
-$lang['start'] = 'Startsidens navn';
$lang['title'] = 'Wiki titel';
+$lang['start'] = 'Startsidens navn';
+$lang['lang'] = 'Sprog';
$lang['template'] = 'Skabelon';
+$lang['tagline'] = 'Tagline (hvis templaten understøtter det)';
+$lang['sidebar'] = 'Sidebar side navne (hvis templaten understøtter det).';
$lang['license'] = 'Under hvilken licens skal dit indhold frigives?';
-$lang['fullpath'] = 'Vis den fulde sti til siderne i bundlinjen';
+$lang['savedir'] = 'Katalog til opbevaring af data';
+$lang['basedir'] = 'Grundkatalog';
+$lang['baseurl'] = 'Grundadresse';
+$lang['cookiedir'] = 'Cookie sti. Hvis tom, bruges baseurl.';
+$lang['dmode'] = 'Katalogoprettelsestilstand';
+$lang['fmode'] = 'Filoprettelsestilstand';
+$lang['allowdebug'] = 'Tillad fejlretning <b>slå fra hvis unødvendig!</b>';
$lang['recent'] = 'Nylige ændringer';
+$lang['recent_days'] = 'Hvor mange nye ændringer der skal beholdes (dage)';
$lang['breadcrumbs'] = 'Stilængde';
$lang['youarehere'] = 'Hierarkisk sti';
+$lang['fullpath'] = 'Vis den fulde sti til siderne i bundlinjen';
$lang['typography'] = 'Typografiske erstatninger';
-$lang['htmlok'] = 'Tillad indlejret HTML';
-$lang['phpok'] = 'Tillad indlejret PHP';
$lang['dformat'] = 'Datoformat (se PHP\'s <a href="http://www.php.net/strftime">strftime</a>-funktion)';
$lang['signature'] = 'Underskrift';
+$lang['showuseras'] = 'Hvad skal vises når den sidste bruger, der har ændret siden, fremstilles';
$lang['toptoclevel'] = 'Øverste niveau for indholdsfortegnelse';
$lang['tocminheads'] = 'Mindste antal overskrifter for at danne Indholdsfortegnelsen';
$lang['maxtoclevel'] = 'Højeste niveau for indholdsfortegnelse';
@@ -67,15 +73,8 @@ $lang['maxseclevel'] = 'Højeste niveau for redigering af sektioner';
$lang['camelcase'] = 'Brug KamelKasse til henvisninger';
$lang['deaccent'] = 'Pæne sidenavne';
$lang['useheading'] = 'Brug første overskrift til sidenavne';
-$lang['refcheck'] = 'Mediehenvisningerkontrol';
-$lang['refshow'] = 'Antal viste mediehenvisninger';
-$lang['allowdebug'] = 'Tillad fejlretning <b>slå fra hvis unødvendig!</b>';
-$lang['usewordblock'] = 'Hindr uønsket brug med en ordliste';
-$lang['indexdelay'] = 'Tidsforsinkelse før katalogisering (sek.)';
-$lang['relnofollow'] = 'Brug rel="nofollow" til udadgående henvisninger';
-$lang['mailguard'] = 'Slør elektroniske adresser';
-$lang['iexssprotect'] = 'Gennemse oplagte filer for mulig skadelig JavaScript- eller HTML-kode.';
-$lang['showuseras'] = 'Hvad skal vises når den sidste bruger, der har ændret siden, fremstilles';
+$lang['sneaky_index'] = 'DokuWiki vil som standard vise alle navnerum i indholdsfortegnelsen. Ved at slå denne valgmulighed til vil skjule de navnerum, hvor brugeren ikke har læsetilladelse. Dette kan føre til, at tilgængelige undernavnerum bliver skjult. Ligeledes kan det også gøre indholdsfortegnelsen ubrugelig med visse ACL-opsætninger.';
+$lang['hidepages'] = 'Skjul lignende sider (almindelige udtryk)';
$lang['useacl'] = 'Benyt adgangskontrollister';
$lang['autopasswd'] = 'Generer adgangskoder automatisk';
$lang['authtype'] = 'Bekræftelsesgrundlag';
@@ -84,58 +83,68 @@ $lang['defaultgroup'] = 'Standardgruppe';
$lang['superuser'] = 'Superbruger';
$lang['manager'] = 'Bestyrer - en gruppe eller bruger med adgang til bestemte styrende funktioner';
$lang['profileconfirm'] = 'Bekræft profilændringer med kodeord';
+$lang['rememberme'] = 'Tillad varige datafiler for brugernavne (husk mig)';
$lang['disableactions'] = 'Slå DokuWiki-muligheder fra';
$lang['disableactions_check'] = 'Tjek';
$lang['disableactions_subscription'] = 'Tliføj/Fjern opskrivning';
$lang['disableactions_wikicode'] = 'Vis kilde/Eksporter grundkode';
$lang['disableactions_other'] = 'Andre muligheder (kommasepareret)';
-$lang['sneaky_index'] = 'DokuWiki vil som standard vise alle navnerum i indholdsfortegnelsen. Ved at slå denne valgmulighed til vil skjule de navnerum, hvor brugeren ikke har læsetilladelse. Dette kan føre til, at tilgængelige undernavnerum bliver skjult. Ligeledes kan det også gøre indholdsfortegnelsen ubrugelig med visse ACL-opsætninger.';
$lang['auth_security_timeout'] = 'Tidsudløb for bekræftelse (sekunder)';
$lang['securecookie'] = 'Skal datafiler skabt af HTTPS kun sendes af HTTPS gennem browseren? Slå denne valgmulighed fra hvis kun brugen af din wiki er SSL-beskyttet, mens den almindelige tilgang udefra ikke er sikret.';
-$lang['xmlrpc'] = 'Slå XML-RPC-grænseflade til/fra.';
-$lang['xmlrpcuser'] = 'Begræns XML-RPC-adgang til de nævnte og med komma adskilte grupper eller brugere. Lad den stå tom for at give alle adgang.';
+$lang['remote'] = 'Aktivér fjern APIet. Dette tillader andre programmer at tilgå wikien via XML-RPC eller andre mekanismer.';
+$lang['remoteuser'] = 'Begræns fjern API adgang til den kommaseparerede liste af grupper eller brugere angivet her. Efterlad tom for at give adgang til alle.';
+$lang['usewordblock'] = 'Hindr uønsket brug med en ordliste';
+$lang['relnofollow'] = 'Brug rel="nofollow" til udadgående henvisninger';
+$lang['indexdelay'] = 'Tidsforsinkelse før katalogisering (sek.)';
+$lang['mailguard'] = 'Slør elektroniske adresser';
+$lang['iexssprotect'] = 'Gennemse oplagte filer for mulig skadelig JavaScript- eller HTML-kode.';
+$lang['usedraft'] = 'Gem automatisk en kladde under redigering';
+$lang['htmlok'] = 'Tillad indlejret HTML';
+$lang['phpok'] = 'Tillad indlejret PHP';
+$lang['locktime'] = 'Længste levetid for låsefiler (sek)';
+$lang['cachetime'] = 'Længste levetid for "cache" (sek)';
+$lang['target____wiki'] = 'Målvindue for indre henvisninger';
+$lang['target____interwiki'] = 'Målvindue for egne wikihenvisninger ';
+$lang['target____extern'] = 'Målvindue for udadgående henvisninger';
+$lang['target____media'] = 'Målvindue for mediehenvisninger';
+$lang['target____windows'] = 'Målvindue til Windows-henvisninger';
+$lang['mediarevisions'] = 'Akvtivér media udgaver?';
+$lang['refcheck'] = 'Mediehenvisningerkontrol';
+$lang['refshow'] = 'Antal viste mediehenvisninger';
+$lang['gdlib'] = 'Udgave af GD Lib';
+$lang['im_convert'] = 'Sti til ImageMagick\'s omdannerværktøj';
+$lang['jpg_quality'] = 'JPG komprimeringskvalitet (0-100)';
+$lang['fetchsize'] = 'Største antal (bytes) fetch.php må hente udefra';
+$lang['subscribers'] = 'Slå understøttelse af abonnement på sider til';
+$lang['subscribe_time'] = 'Tid der går før abonnementlister og nyhedsbreve er sendt (i sekunder). Denne værdi skal være mindre end den tid specificeret under recent_days.';
+$lang['notify'] = 'Send ændringsmeddelelser til denne e-adresse';
+$lang['registernotify'] = 'Send info om nyoprettede brugere til denne e-adresse';
+$lang['mailfrom'] = 'E-adresse til brug for automatiske meddelelser';
+$lang['mailprefix'] = 'Præfiks på email subject for automastiske mails. Efterlad blank for at bruge wiki titlen.';
+$lang['htmlmail'] = 'Send pænere, men større HTML multipart mails. Deaktivér for at sende rene tekst mails.';
+$lang['sitemap'] = 'Generer Google-"sitemap" (dage)';
+$lang['rss_type'] = 'Type af XML-liste';
+$lang['rss_linkto'] = 'XML-liste henviser til';
+$lang['rss_content'] = 'Hvad skal der vises i XML-listepunkteren?';
+$lang['rss_update'] = 'XML-listens opdateringsinterval (sek)';
+$lang['rss_show_summary'] = 'XML-liste vis referat i overskriften';
+$lang['rss_media'] = 'Hvilke ændringer skal vises i XML listen?';
$lang['updatecheck'] = 'Kig efter opdateringer og sikkerhedsadvarsler? DokuWiki er nødt til at kontakte update.dokuwiki.org for at tilgå denne funktion.';
$lang['userewrite'] = 'Brug pæne netadresser';
$lang['useslash'] = 'Brug skråstreg som navnerumsdeler i netadresser';
-$lang['usedraft'] = 'Gem automatisk en kladde under redigering';
$lang['sepchar'] = 'Orddelingstegn til sidenavne';
$lang['canonical'] = 'Benyt fuldt kanoniske netadresser';
$lang['fnencode'] = 'Metode for indkodning af ikke ASCII filnavne';
$lang['autoplural'] = 'Tjek for flertalsendelser i henvisninger';
$lang['compression'] = 'Pakningsmetode for attic-filer';
-$lang['cachetime'] = 'Længste levetid for "cache" (sek)';
-$lang['locktime'] = 'Længste levetid for låsefiler (sek)';
-$lang['fetchsize'] = 'Største antal (bytes) fetch.php må hente udefra';
-$lang['notify'] = 'Send ændringsmeddelelser til denne e-adresse';
-$lang['registernotify'] = 'Send info om nyoprettede brugere til denne e-adresse';
-$lang['mailfrom'] = 'E-adresse til brug for automatiske meddelelser';
$lang['gzip_output'] = 'Benyt gzip-Content-Encoding (indholdskryptering) til XHTML';
-$lang['gdlib'] = 'Udgave af GD Lib';
-$lang['im_convert'] = 'Sti til ImageMagick\'s omdannerværktøj';
-$lang['jpg_quality'] = 'JPG komprimeringskvalitet (0-100)';
-$lang['subscribers'] = 'Slå understøttelse af abonnement på sider til';
-$lang['subscribe_time'] = 'Tid der går før abonnementlister og nyhedsbreve er sendt (i sekunder). Denne værdi skal være mindre end den tid specificeret under recent_days.';
$lang['compress'] = 'Komprimer CSS- og JavaScript-filer';
-$lang['hidepages'] = 'Skjul lignende sider (almindelige udtryk)';
$lang['send404'] = 'Send "HTTP 404/Page Not Found" for ikke-eksisterende sider';
-$lang['sitemap'] = 'Generer Google-"sitemap" (dage)';
$lang['broken_iua'] = 'Er funktionen "ignore_user_abort" uvirksom på dit system? Dette kunne forårsage en ikke virkende søgeoversigt. IIS+PHP/CGI er kendt for ikke at virke. Se <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Fejl 852</a> for flere oplysninger.';
$lang['xsendfile'] = 'Brug hovedfilen til X-Sendfile for at få netserveren til at sende statiske filer? Din netserver skal understøtte dette for at bruge det.';
$lang['renderer_xhtml'] = 'Udskriver der skal bruges til størstedelen af wiki-udskriften (XHTML)';
$lang['renderer__core'] = '%s (dokuwiki-kerne)';
$lang['renderer__plugin'] = '%s (udvidelse)';
-$lang['rememberme'] = 'Tillad varige datafiler for brugernavne (husk mig)';
-$lang['rss_type'] = 'Type af XML-liste';
-$lang['rss_linkto'] = 'XML-liste henviser til';
-$lang['rss_content'] = 'Hvad skal der vises i XML-listepunkteren?';
-$lang['rss_update'] = 'XML-listens opdateringsinterval (sek)';
-$lang['recent_days'] = 'Hvor mange nye ændringer der skal beholdes (dage)';
-$lang['rss_show_summary'] = 'XML-liste vis referat i overskriften';
-$lang['target____wiki'] = 'Målvindue for indre henvisninger';
-$lang['target____interwiki'] = 'Målvindue for egne wikihenvisninger ';
-$lang['target____extern'] = 'Målvindue for udadgående henvisninger';
-$lang['target____media'] = 'Målvindue for mediehenvisninger';
-$lang['target____windows'] = 'Målvindue til Windows-henvisninger';
$lang['proxy____host'] = 'Proxy-servernavn';
$lang['proxy____port'] = 'Proxy-port';
$lang['proxy____user'] = 'Proxy-brugernavn';
diff --git a/lib/plugins/config/lang/de-informal/intro.txt b/lib/plugins/config/lang/de-informal/intro.txt
index 7ac1b47d9..df9845ebc 100644
--- a/lib/plugins/config/lang/de-informal/intro.txt
+++ b/lib/plugins/config/lang/de-informal/intro.txt
@@ -1,4 +1,4 @@
-===== Einstellungs-Manager =====
+===== Konfigurations-Manager =====
Benutze diese Seite zur Kontrolle der Einstellungen deiner DokuWiki-Installation. Für Hilfe zu individuellen Einstellungen gehe zu [[doku>config]]. Für mehr Details über diese Erweiterungen siehe [[doku>plugin:config]].
diff --git a/lib/plugins/config/lang/de-informal/lang.php b/lib/plugins/config/lang/de-informal/lang.php
index 1a66c4a8e..d86c2d809 100644
--- a/lib/plugins/config/lang/de-informal/lang.php
+++ b/lib/plugins/config/lang/de-informal/lang.php
@@ -5,7 +5,7 @@
* @author Alexander Fischer <tbanus@os-forge.net>
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
- * @author Matthias Schulte <post@lupo49.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
* @author Christian Wichmann <nospam@zone0.de>
* @author Pierre Corell <info@joomla-praxis.de>
*/
@@ -29,6 +29,8 @@ $lang['_anti_spam'] = 'Anti-Spam-Einstellungen';
$lang['_editing'] = 'Bearbeitungseinstellungen';
$lang['_links'] = 'Link-Einstellungen';
$lang['_media'] = 'Media-Einstellungen';
+$lang['_notifications'] = 'Benachrichtigungs-Konfiguration';
+$lang['_syndication'] = 'Syndication-Konfiguration (RSS)';
$lang['_advanced'] = 'erweiterte Einstellungen';
$lang['_network'] = 'Netzwerk-Einstellungen';
$lang['_plugin_sufix'] = 'Plugin-Einstellungen';
@@ -46,6 +48,8 @@ $lang['cookiedir'] = 'Cookie Pfad. Leer lassen, um die Standard-Url
$lang['start'] = 'Name der Startseite';
$lang['title'] = 'Wiki Titel';
$lang['template'] = 'Vorlage';
+$lang['tagline'] = 'Tag-Linie (nur, wenn vom Template unterstützt)';
+$lang['sidebar'] = 'Name der Sidebar-Seite (nur, wenn vom Template unterstützt)), ein leeres Feld deaktiviert die Sidebar';
$lang['license'] = 'Unter welcher Lizenz sollte Ihr Inhalt veröffentlicht werden?';
$lang['fullpath'] = 'Zeige vollen Pfad der Datei in Fußzeile an';
$lang['recent'] = 'letzte Änderungen';
@@ -89,8 +93,8 @@ $lang['disableactions_other'] = 'Weitere Aktionen (durch Komma getrennt)';
$lang['sneaky_index'] = 'Standardmäßig zeigt DokuWiki alle Namensräume in der Indexansicht an. Bei Aktivierung dieser Einstellung werden alle Namensräume versteckt, in welchen der Benutzer keine Leserechte hat. Dies könnte dazu führen, dass lesbare Unternamensräume versteckt werden. Dies kann die Indexansicht bei bestimmten Zugangskontrolleinstellungen unbenutzbar machen.';
$lang['auth_security_timeout'] = 'Zeitüberschreitung bei der Authentifizierung (Sekunden)';
$lang['securecookie'] = 'Sollen Cookies, die via HTTPS gesetzt wurden nur per HTTPS versendet werden? Deaktiviere diese Option, wenn nur der Login deines Wikis mit SSL gesichert ist, aber das Betrachten des Wikis ungesichert geschieht.';
-$lang['xmlrpc'] = 'Aktiviere/Deaktiviere die XML-RPC-Schnittstelle';
-$lang['xmlrpcuser'] = 'XML-RPC-Zugriff auf folgende Gruppen oder Benutzer (kommasepariert) beschränken. Wenn du dieses Feld leer lässt, wir der Zugriff jedem gewährt.';
+$lang['remote'] = 'Aktiviert den externen API-Zugang. Diese Option erlaubt es externen Anwendungen von außen auf die XML-RPC-Schnittstelle oder anderweitigen Schnittstellen zuzugreifen.';
+$lang['remoteuser'] = 'Zugriff auf die externen Schnittstellen durch kommaseparierte Angabe von Benutzern oder Gruppen einschränken. Ein leeres Feld erlaubt Zugriff für jeden.';
$lang['updatecheck'] = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit update.dokuwiki.org verbinden.';
$lang['userewrite'] = 'Benutze schöne URLs';
$lang['useslash'] = 'Benutze Schrägstrich als Namensraumtrenner in URLs';
@@ -107,6 +111,7 @@ $lang['notify'] = 'Sende Änderungsbenachrichtigungen an diese E-
$lang['registernotify'] = 'Sende Information bei neu registrierten Benutzern an diese E-Mail-Adresse.';
$lang['mailfrom'] = 'Absenderadresse für automatisch erzeugte E-Mails';
$lang['mailprefix'] = 'Präfix für E-Mail-Betreff beim automatischen Versand von Benachrichtigungen';
+$lang['htmlmail'] = 'Versendet optisch angenehmere, aber größere E-Mails im HTML-Format (multipart). Deaktivieren, um Text-Mails zu versenden.';
$lang['gzip_output'] = 'Seiten mit gzip komprimiert ausliefern';
$lang['gdlib'] = 'GD Lib Version';
$lang['im_convert'] = 'Pfad zu ImageMagicks-Konvertierwerkzeug';
@@ -130,11 +135,13 @@ $lang['rss_content'] = 'Was soll in XML-Feedinhalten angezeigt werden?
$lang['rss_update'] = 'Aktualisierungsintervall für XML-Feeds (Sekunden)';
$lang['recent_days'] = 'Wie viele Änderungen sollen vorgehalten werden? (Tage)';
$lang['rss_show_summary'] = 'Bearbeitungs-Zusammenfassung im XML-Feed anzeigen';
+$lang['rss_media'] = 'Welche Änderungen sollen im XML-Feed angezeigt werden?';
$lang['target____wiki'] = 'Zielfenstername für interne Links';
$lang['target____interwiki'] = 'Zielfenstername für InterWiki-Links';
$lang['target____extern'] = 'Zielfenstername für externe Links';
$lang['target____media'] = 'Zielfenstername für Medienlinks';
$lang['target____windows'] = 'Zielfenstername für Windows-Freigaben-Links';
+$lang['dnslookups'] = 'DokuWiki löst die IP-Adressen von Benutzern zu deren Hostnamen auf. Wenn du einen langsamen, unbrauchbaren DNS-Server verwendest oder die Funktion nicht benötigst, dann sollte diese Option deaktivert sein.';
$lang['proxy____host'] = 'Proxyadresse';
$lang['proxy____port'] = 'Proxyport';
$lang['proxy____user'] = 'Benutzername für den Proxy';
diff --git a/lib/plugins/config/lang/de/intro.txt b/lib/plugins/config/lang/de/intro.txt
index efb807738..b79b5f871 100644
--- a/lib/plugins/config/lang/de/intro.txt
+++ b/lib/plugins/config/lang/de/intro.txt
@@ -1,4 +1,4 @@
-====== Konfiguration ======
+====== Konfigurations-Manager ======
Dieses Plugin hilft Ihnen bei der Konfiguration von DokuWiki. Hilfe zu den einzelnen Einstellungen finden Sie unter [[doku>config]]. Mehr Information zu diesem Plugin ist unter [[doku>plugin:config]] erhältlich.
diff --git a/lib/plugins/config/lang/de/lang.php b/lib/plugins/config/lang/de/lang.php
index a9a275349..bcbc061a3 100644
--- a/lib/plugins/config/lang/de/lang.php
+++ b/lib/plugins/config/lang/de/lang.php
@@ -11,12 +11,12 @@
* @author Arne Pelka <mail@arnepelka.de>
* @author Dirk Einecke <dirk@dirkeinecke.de>
* @author Blitzi94@gmx.de
- * @author Robert Bogenschneider <robog@GMX.de>
* @author Robert Bogenschneider <robog@gmx.de>
* @author Niels Lange <niels@boldencursief.nl>
* @author Christian Wichmann <nospam@zone0.de>
* @author Paul Lachewsky <kaeptn.haddock@gmail.com>
* @author Pierre Corell <info@joomla-praxis.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
*/
$lang['menu'] = 'Konfiguration';
$lang['error'] = 'Die Einstellungen wurden wegen einer fehlerhaften Eingabe nicht gespeichert.
@@ -40,6 +40,8 @@ $lang['_anti_spam'] = 'Anti-Spam-Konfiguration';
$lang['_editing'] = 'Bearbeitungs-Konfiguration';
$lang['_links'] = 'Link-Konfiguration';
$lang['_media'] = 'Medien-Konfiguration';
+$lang['_notifications'] = 'Benachrichtigungs-Konfiguration';
+$lang['_syndication'] = 'Syndication-Konfiguration (RSS)';
$lang['_advanced'] = 'Erweiterte Konfiguration';
$lang['_network'] = 'Netzwerk-Konfiguration';
$lang['_plugin_sufix'] = 'Plugin-Konfiguration';
@@ -57,6 +59,8 @@ $lang['cookiedir'] = 'Cookiepfad. Frei lassen, um den gleichen Pfad
$lang['start'] = 'Startseitenname';
$lang['title'] = 'Titel des Wikis';
$lang['template'] = 'Designvorlage (Template)';
+$lang['tagline'] = 'Tag-Linie (nur, wenn vom Template unterstützt)';
+$lang['sidebar'] = 'Name der Sidebar-Seite (nur, wenn vom Template unterstützt)), ein leeres Feld deaktiviert die Sidebar';
$lang['license'] = 'Unter welcher Lizenz sollen Ihre Inhalte veröffentlicht werden?';
$lang['fullpath'] = 'Den kompletten Dateipfad im Footer anzeigen';
$lang['recent'] = 'Anzahl der Einträge in der Änderungsliste';
@@ -100,8 +104,8 @@ $lang['disableactions_other'] = 'Andere Aktionen (durch Komma getrennt)';
$lang['sneaky_index'] = 'Standardmäßig zeigt DokuWiki alle Namensräume in der Übersicht. Wenn diese Option aktiviert wird, werden alle Namensräume, für die der Benutzer keine Lese-Rechte hat, nicht angezeigt. Dies kann unter Umständen dazu führen, das lesbare Unter-Namensräume nicht angezeigt werden und macht die Übersicht evtl. unbrauchbar in Kombination mit bestimmten ACL Einstellungen.';
$lang['auth_security_timeout'] = 'Authentifikations-Timeout (Sekunden)';
$lang['securecookie'] = 'Sollen Cookies, die via HTTPS gesetzt wurden nur per HTTPS versendet werden? Deaktivieren Sie diese Option, wenn nur der Login Ihres Wikis mit SSL gesichert ist, aber das Betrachten des Wikis ungesichert geschieht.';
-$lang['xmlrpc'] = 'XML-RPC-Zugriff erlauben.';
-$lang['xmlrpcuser'] = 'XML-RPC-Zugriff auf folgende Gruppen oder Benutzer (kommasepariert) beschränken. Wenn Sie dieses Feld leer lassen, wir der Zugriff jedem gewährt.';
+$lang['remote'] = 'Aktiviert den externen API-Zugang. Diese Option erlaubt es externen Anwendungen von außen auf die XML-RPC-Schnittstelle oder anderweitigen Schnittstellen zuzugreifen.';
+$lang['remoteuser'] = 'Zugriff auf die externen Schnittstellen durch kommaseparierte Angabe von Benutzern oder Gruppen einschränken. Ein leeres Feld erlaubt Zugriff für jeden.';
$lang['updatecheck'] = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit update.dokuwiki.org verbinden.';
$lang['userewrite'] = 'URL rewriting';
$lang['useslash'] = 'Schrägstrich (/) als Namensraumtrenner in URLs verwenden';
@@ -118,6 +122,7 @@ $lang['notify'] = 'Änderungsmitteilungen an diese E-Mail-Adresse
$lang['registernotify'] = 'Information über neu registrierte Nutzer an diese E-Mail-Adresse senden';
$lang['mailfrom'] = 'Absender-E-Mail-Adresse für automatische Mails';
$lang['mailprefix'] = 'Präfix für E-Mail-Betreff beim automatischen Versand von Benachrichtigungen';
+$lang['htmlmail'] = 'Versendet optisch angenehmere, aber größere E-Mails im HTML-Format (multipart). Deaktivieren, um Text-Mails zu versenden.';
$lang['gzip_output'] = 'Seiten mit gzip komprimiert ausliefern';
$lang['gdlib'] = 'GD Lib Version';
$lang['im_convert'] = 'Pfad zu ImageMagicks-Konvertierwerkzeug';
@@ -141,11 +146,13 @@ $lang['rss_content'] = 'Welche Inhalte sollen im XML-Feed dargestellt
$lang['rss_update'] = 'XML-Feed Aktualisierungsintervall (Sekunden)';
$lang['recent_days'] = 'Wieviele letzte Änderungen sollen einsehbar bleiben? (Tage)';
$lang['rss_show_summary'] = 'Bearbeitungs-Zusammenfassung im XML-Feed anzeigen';
+$lang['rss_media'] = 'Welche Änderungen sollen im XML-Feed angezeigt werden?';
$lang['target____wiki'] = 'Zielfenster für interne Links (target Attribut)';
$lang['target____interwiki'] = 'Zielfenster für InterWiki-Links (target Attribut)';
$lang['target____extern'] = 'Zielfenster für Externe Links (target Attribut)';
$lang['target____media'] = 'Zielfenster für (Bild-)Dateien (target Attribut)';
$lang['target____windows'] = 'Zielfenster für Windows Freigaben (target Attribut)';
+$lang['dnslookups'] = 'DokuWiki löst die IP-Adressen von Benutzern zu deren Hostnamen auf. Wenn du einen langsamen, unbrauchbaren DNS-Server verwendest oder die Funktion nicht benötigst, dann sollte diese Option deaktivert sein.';
$lang['proxy____host'] = 'Proxy-Server';
$lang['proxy____port'] = 'Proxy-Port';
$lang['proxy____user'] = 'Proxy Nutzername';
diff --git a/lib/plugins/config/lang/el/lang.php b/lib/plugins/config/lang/el/lang.php
index 9f5d121de..093212664 100644
--- a/lib/plugins/config/lang/el/lang.php
+++ b/lib/plugins/config/lang/el/lang.php
@@ -93,8 +93,6 @@ $lang['disableactions_other'] = 'Άλλες λειτουργίες (διαχω
$lang['sneaky_index'] = 'Εξ ορισμού, η εφαρμογή DokuWiki δείχνει όλους τους φακέλους στην προβολή Καταλόγου. Ενεργοποιώντας αυτή την επιλογή, δεν θα εμφανίζονται οι φάκελοι για τους οποίους ο χρήστης δεν έχει δικαιώματα ανάγνωσης αλλά και οι υπο-φάκελοί τους ανεξαρτήτως δικαιωμάτων πρόσβασης.';
$lang['auth_security_timeout'] = 'Διάρκεια χρόνου για ασφάλεια πιστοποίησης (δευτερόλεπτα)';
$lang['securecookie'] = 'Τα cookies που έχουν οριστεί μέσω HTTPS πρέπει επίσης να αποστέλλονται μόνο μέσω HTTPS από τον φυλλομετρητή? Απενεργοποιήστε αυτή την επιλογή όταν μόνο η είσοδος στο wiki σας διασφαλίζεται μέσω SSL αλλά η περιήγηση γίνεται και χωρίς αυτό.';
-$lang['xmlrpc'] = 'Ενεργοποίηση/Απενεργοποίηση της διασύνδεσης XML-RPC ';
-$lang['xmlrpcuser'] = 'Περιορισμός XML-RPC πρόσβασης στις ομάδες η τους χρήστες (διαχωριζόμενοι με κόμμα). Αφήστε το κενό για πρόσβαση από όλους.';
$lang['updatecheck'] = 'Έλεγχος για ύπαρξη νέων εκδόσεων και ενημερώσεων ασφαλείας της εφαρμογής? Απαιτείται η σύνδεση με το update.dokuwiki.org για να λειτουργήσει σωστά αυτή η επιλογή.';
$lang['userewrite'] = 'Χρήση ωραίων URLs';
$lang['useslash'] = 'Χρήση slash σαν διαχωριστικό φακέλων στα URLs';
@@ -118,7 +116,7 @@ $lang['jpg_quality'] = 'Ποιότητα συμπίεσης JPG (0-100
$lang['subscribers'] = 'Να επιτρέπεται η εγγραφή στην ενημέρωση αλλαγών σελίδας';
$lang['subscribe_time'] = 'Χρόνος μετά τον οποίο οι λίστες ειδοποιήσεων και τα συνοπτικά θα αποστέλλονται (δευτερόλεπτα). Αυτό θα πρέπει να είναι μικρότερο από τον χρόνο που έχει η ρύθμιση recent_days.';
$lang['compress'] = 'Συμπίεση αρχείων CSS και javascript';
-$lang['cssdatauri'] = 'Το μέγεθος σε bytes στο οποίο οι εικόνες που αναφέρονται σε CSS αρχεία θα πρέπει να είναι ενσωματωμένες για τη μείωση των απαιτήσεων μιας κεφαλίδας αίτησης HTTP . Αυτή η τεχνική δεν θα λειτουργήσει σε IE <8! <code> 400 </ code> με <code> 600 </ code> bytes είναι μια καλή τιμή. Ορίστε την τιμή <code> 0 </ code> για να το απενεργοποιήσετε.';
+$lang['cssdatauri'] = 'Το μέγεθος σε bytes στο οποίο οι εικόνες που αναφέρονται σε CSS αρχεία θα πρέπει να είναι ενσωματωμένες για τη μείωση των απαιτήσεων μιας κεφαλίδας αίτησης HTTP . Αυτή η τεχνική δεν θα λειτουργήσει σε IE <8! <code> 400 </code> με <code> 600 </code> bytes είναι μια καλή τιμή. Ορίστε την τιμή <code> 0 </code> για να το απενεργοποιήσετε.';
$lang['hidepages'] = 'Φίλτρο απόκρυψης σελίδων (regular expressions)';
$lang['send404'] = 'Αποστολή "HTTP 404/Page Not Found" για σελίδες που δεν υπάρχουν';
$lang['sitemap'] = 'Δημιουργία Google sitemap (ημέρες)';
diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php
index a075d7cc2..83c843b3a 100644
--- a/lib/plugins/config/lang/en/lang.php
+++ b/lib/plugins/config/lang/en/lang.php
@@ -36,6 +36,8 @@ $lang['_anti_spam'] = 'Anti-Spam Settings';
$lang['_editing'] = 'Editing Settings';
$lang['_links'] = 'Link Settings';
$lang['_media'] = 'Media Settings';
+$lang['_notifications'] = 'Notification Settings';
+$lang['_syndication'] = 'Syndication Settings';
$lang['_advanced'] = 'Advanced Settings';
$lang['_network'] = 'Network Settings';
// The settings group name for plugins and templates can be set with
@@ -52,113 +54,131 @@ $lang['_msg_setting_no_default'] = 'No default value.';
/* -------------------- Config Options --------------------------- */
-$lang['fmode'] = 'File creation mode';
-$lang['dmode'] = 'Directory creation mode';
+/* Basic Settings */
+$lang['title'] = 'Wiki title aka. your wiki\'s name';
+$lang['start'] = 'Page name to use as the starting point for each namespace';
$lang['lang'] = 'Interface language';
+$lang['template'] = 'Template aka. the design of the wiki.';
+$lang['tagline'] = 'Tagline (if template supports it)';
+$lang['sidebar'] = 'Sidebar page name (if template supports it), empty field disables the sidebar';
+$lang['license'] = 'Under which license should your content be released?';
+$lang['savedir'] = 'Directory for saving data';
$lang['basedir'] = 'Server path (eg. <code>/dokuwiki/</code>). Leave blank for autodetection.';
$lang['baseurl'] = 'Server URL (eg. <code>http://www.yourserver.com</code>). Leave blank for autodetection.';
-$lang['savedir'] = 'Directory for saving data';
$lang['cookiedir'] = 'Cookie path. Leave blank for using baseurl.';
-$lang['start'] = 'Start page name';
-$lang['title'] = 'Wiki title';
-$lang['template'] = 'Template';
-$lang['license'] = 'Under which license should your content be released?';
+$lang['dmode'] = 'Directory creation mode';
+$lang['fmode'] = 'File creation mode';
+$lang['allowdebug'] = 'Allow debug <b>disable if not needed!</b>';
+
+/* Display Settings */
+$lang['recent'] = 'Number of entries per page in the recent changes';
+$lang['recent_days'] = 'How many recent changes to keep (days)';
+$lang['breadcrumbs'] = 'Number of "trace" breadcrumbs. Set to 0 to disable.';
+$lang['youarehere'] = 'Use hierarchical breadcrumbs (you probably want to disable the above option then)';
$lang['fullpath'] = 'Reveal full path of pages in the footer';
-$lang['recent'] = 'Recent changes';
-$lang['breadcrumbs'] = 'Number of breadcrumbs';
-$lang['youarehere'] = 'Hierarchical breadcrumbs';
$lang['typography'] = 'Do typographical replacements';
-$lang['htmlok'] = 'Allow embedded HTML';
-$lang['phpok'] = 'Allow embedded PHP';
$lang['dformat'] = 'Date format (see PHP\'s <a href="http://www.php.net/strftime">strftime</a> function)';
-$lang['signature'] = 'Signature';
+$lang['signature'] = 'What to insert with the signature button in the editor';
+$lang['showuseras'] = 'What to display when showing the user that last edited a page';
$lang['toptoclevel'] = 'Top level for table of contents';
$lang['tocminheads'] = 'Minimum amount of headlines that determines whether the TOC is built';
$lang['maxtoclevel'] = 'Maximum level for table of contents';
$lang['maxseclevel'] = 'Maximum section edit level';
$lang['camelcase'] = 'Use CamelCase for links';
-$lang['deaccent'] = 'Clean pagenames';
+$lang['deaccent'] = 'How to clean pagenames';
$lang['useheading'] = 'Use first heading for pagenames';
-$lang['refcheck'] = 'Media reference check';
-$lang['refshow'] = 'Number of media references to show';
-$lang['allowdebug'] = 'Allow debug <b>disable if not needed!</b>';
-$lang['mediarevisions'] = 'Enable Mediarevisions?';
-
-$lang['usewordblock']= 'Block spam based on wordlist';
-$lang['indexdelay'] = 'Time delay before indexing (sec)';
-$lang['relnofollow'] = 'Use rel="nofollow" on external links';
-$lang['mailguard'] = 'Obfuscate email addresses';
-$lang['iexssprotect']= 'Check uploaded files for possibly malicious JavaScript or HTML code';
-$lang['showuseras'] = 'What to display when showing the user that last edited a page';
+$lang['sneaky_index'] = 'By default, DokuWiki will show all namespaces in the sitemap. Enabling this option will hide those where the user doesn\'t have read permissions. This might result in hiding of accessable subnamespaces which may make the index unusable with certain ACL setups.';
+$lang['hidepages'] = 'Hide pages matching this regular expressions from search, the sitemap and other automatic indexes';
-/* Authentication Options */
+/* Authentication Settings */
$lang['useacl'] = 'Use access control lists';
$lang['autopasswd'] = 'Autogenerate passwords';
$lang['authtype'] = 'Authentication backend';
$lang['passcrypt'] = 'Password encryption method';
-$lang['defaultgroup']= 'Default group';
+$lang['defaultgroup']= 'Default group, all new users will be placed in this group';
$lang['superuser'] = 'Superuser - group, user or comma separated list user1,@group1,user2 with full access to all pages and functions regardless of the ACL settings';
$lang['manager'] = 'Manager - group, user or comma separated list user1,@group1,user2 with access to certain management functions';
$lang['profileconfirm'] = 'Confirm profile changes with password';
+$lang['rememberme'] = 'Allow permanent login cookies (remember me)';
$lang['disableactions'] = 'Disable DokuWiki actions';
$lang['disableactions_check'] = 'Check';
$lang['disableactions_subscription'] = 'Subscribe/Unsubscribe';
$lang['disableactions_wikicode'] = 'View source/Export Raw';
$lang['disableactions_other'] = 'Other actions (comma separated)';
-$lang['sneaky_index'] = 'By default, DokuWiki will show all namespaces in the index view. Enabling this option will hide those where the user doesn\'t have read permissions. This might result in hiding of accessable subnamespaces. This may make the index unusable with certain ACL setups.';
$lang['auth_security_timeout'] = 'Authentication Security Timeout (seconds)';
$lang['securecookie'] = 'Should cookies set via HTTPS only be sent via HTTPS by the browser? Disable this option when only the login of your wiki is secured with SSL but browsing the wiki is done unsecured.';
-$lang['xmlrpc'] = 'Enable/disable XML-RPC interface.';
-$lang['xmlrpcuser'] = 'Restrict XML-RPC access to the comma separated groups or users given here. Leave empty to give access to everyone.';
+$lang['remote'] = 'Enable the remote API system. This allows other applications to access the wiki via XML-RPC or other mechanisms.';
+$lang['remoteuser'] = 'Restrict remote API access to the comma separated groups or users given here. Leave empty to give access to everyone.';
+
+/* Anti-Spam Settings */
+$lang['usewordblock']= 'Block spam based on wordlist';
+$lang['relnofollow'] = 'Use rel="nofollow" on external links';
+$lang['indexdelay'] = 'Time delay before indexing (sec)';
+$lang['mailguard'] = 'Obfuscate email addresses';
+$lang['iexssprotect']= 'Check uploaded files for possibly malicious JavaScript or HTML code';
+
+/* Editing Settings */
+$lang['usedraft'] = 'Automatically save a draft while editing';
+$lang['htmlok'] = 'Allow embedded HTML';
+$lang['phpok'] = 'Allow embedded PHP';
+$lang['locktime'] = 'Maximum age for lock files (sec)';
+$lang['cachetime'] = 'Maximum age for cache (sec)';
+
+/* Link settings */
+$lang['target____wiki'] = 'Target window for internal links';
+$lang['target____interwiki'] = 'Target window for interwiki links';
+$lang['target____extern'] = 'Target window for external links';
+$lang['target____media'] = 'Target window for media links';
+$lang['target____windows'] = 'Target window for windows links';
+
+/* Media Settings */
+$lang['mediarevisions'] = 'Enable Mediarevisions?';
+$lang['refcheck'] = 'Check if a media file is still in use before deleting it';
+$lang['refshow'] = 'Number of media references to show when the above setting is enabled';
+$lang['gdlib'] = 'GD Lib version';
+$lang['im_convert'] = 'Path to ImageMagick\'s convert tool';
+$lang['jpg_quality'] = 'JPG compression quality (0-100)';
+$lang['fetchsize'] = 'Maximum size (bytes) fetch.php may download from external URLs, eg. to cache and resize external images.';
+
+/* Notification Settings */
+$lang['subscribers'] = 'Allow users to subscribe to page changes by email';
+$lang['subscribe_time'] = 'Time after which subscription lists and digests are sent (sec); This should be smaller than the time specified in recent_days.';
+$lang['notify'] = 'Always send change notifications to this email address';
+$lang['registernotify'] = 'Always send info on newly registered users to this email address';
+$lang['mailfrom'] = 'Sender email address to use for automatic mails';
+$lang['mailprefix'] = 'Email subject prefix to use for automatic mails. Leave blank to use the wiki title';
+$lang['htmlmail'] = 'Send better looking, but larger in size HTML multipart emails. Disable for plain text only mails.';
+
+/* Syndication Settings */
+$lang['sitemap'] = 'Generate Google sitemap this often (in days). 0 to disable';
+$lang['rss_type'] = 'XML feed type';
+$lang['rss_linkto'] = 'XML feed links to';
+$lang['rss_content'] = 'What to display in the XML feed items?';
+$lang['rss_update'] = 'XML feed update interval (sec)';
+$lang['rss_show_summary'] = 'XML feed show summary in title';
+$lang['rss_media'] = 'What kind of changes should be listed in the XML feed?';
/* Advanced Options */
$lang['updatecheck'] = 'Check for updates and security warnings? DokuWiki needs to contact update.dokuwiki.org for this feature.';
$lang['userewrite'] = 'Use nice URLs';
$lang['useslash'] = 'Use slash as namespace separator in URLs';
-$lang['usedraft'] = 'Automatically save a draft while editing';
$lang['sepchar'] = 'Page name word separator';
$lang['canonical'] = 'Use fully canonical URLs';
$lang['fnencode'] = 'Method for encoding non-ASCII filenames.';
$lang['autoplural'] = 'Check for plural forms in links';
$lang['compression'] = 'Compression method for attic files';
-$lang['cachetime'] = 'Maximum age for cache (sec)';
-$lang['locktime'] = 'Maximum age for lock files (sec)';
-$lang['fetchsize'] = 'Maximum size (bytes) fetch.php may download from extern';
-$lang['notify'] = 'Send change notifications to this email address';
-$lang['registernotify'] = 'Send info on newly registered users to this email address';
-$lang['mailfrom'] = 'Email address to use for automatic mails';
-$lang['mailprefix'] = 'Email subject prefix to use for automatic mails';
$lang['gzip_output'] = 'Use gzip Content-Encoding for xhtml';
-$lang['gdlib'] = 'GD Lib version';
-$lang['im_convert'] = 'Path to ImageMagick\'s convert tool';
-$lang['jpg_quality'] = 'JPG compression quality (0-100)';
-$lang['subscribers'] = 'Enable page subscription support';
-$lang['subscribe_time'] = 'Time after which subscription lists and digests are sent (sec); This should be smaller than the time specified in recent_days.';
$lang['compress'] = 'Compact CSS and javascript output';
$lang['cssdatauri'] = 'Size in bytes up to which images referenced in CSS files should be embedded right into the stylesheet to reduce HTTP request header overhead. This technique won\'t work in IE 7 and below! <code>400</code> to <code>600</code> bytes is a good value. Set <code>0</code> to disable.';
-$lang['hidepages'] = 'Hide matching pages (regular expressions)';
$lang['send404'] = 'Send "HTTP 404/Page Not Found" for non existing pages';
-$lang['sitemap'] = 'Generate Google sitemap (days)';
-$lang['broken_iua'] = 'Is the ignore_user_abort function broken on your system? This could cause a non working search index. IIS+PHP/CGI is known to be broken. See <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> for more info.';
+$lang['broken_iua'] = 'Is the ignore_user_abort function broken on your system? This could cause a non working search index. IIS+PHP/CGI is known to be broken. See <a href="http://bugs.dokuwiki.org/?do=details&amp;task_id=852">Bug 852</a> for more info.';
$lang['xsendfile'] = 'Use the X-Sendfile header to let the webserver deliver static files? Your webserver needs to support this.';
$lang['renderer_xhtml'] = 'Renderer to use for main (xhtml) wiki output';
$lang['renderer__core'] = '%s (dokuwiki core)';
$lang['renderer__plugin'] = '%s (plugin)';
-$lang['rememberme'] = 'Allow permanent login cookies (remember me)';
-
-$lang['rss_type'] = 'XML feed type';
-$lang['rss_linkto'] = 'XML feed links to';
-$lang['rss_content'] = 'What to display in the XML feed items?';
-$lang['rss_update'] = 'XML feed update interval (sec)';
-$lang['recent_days'] = 'How many recent changes to keep (days)';
-$lang['rss_show_summary'] = 'XML feed show summary in title';
-/* Target options */
-$lang['target____wiki'] = 'Target window for internal links';
-$lang['target____interwiki'] = 'Target window for interwiki links';
-$lang['target____extern'] = 'Target window for external links';
-$lang['target____media'] = 'Target window for media links';
-$lang['target____windows'] = 'Target window for windows links';
+/* Network Options */
+$lang['dnslookups'] = 'DokuWiki will lookup hostnames for remote IP addresses of users editing pages. If you have a slow or non working DNS server or don\'t want this feature, disable this option';
/* Proxy Options */
$lang['proxy____host'] = 'Proxy servername';
@@ -176,6 +196,7 @@ $lang['ftp____user'] = 'FTP user name for safemode hack';
$lang['ftp____pass'] = 'FTP password for safemode hack';
$lang['ftp____root'] = 'FTP root directory for safemode hack';
+/* License Options */
$lang['license_o_'] = 'None chosen';
/* typography options */
diff --git a/lib/plugins/config/lang/eo/intro.txt b/lib/plugins/config/lang/eo/intro.txt
index c717d9a4d..5ed2f0ecb 100644
--- a/lib/plugins/config/lang/eo/intro.txt
+++ b/lib/plugins/config/lang/eo/intro.txt
@@ -1,7 +1,7 @@
====== Administrilo de Agordoj ======
-Uzu tiun ĉi paĝon por kontroli la difinojn de via DokuWiki-instalo. Por helpo pri specifaj difinoj aliru al [[doku&gt;config]]. Por pli detaloj pri tiu ĉi kromaĵo, vidu [[doku&gt;plugin:config]].
+Uzu tiun ĉi paĝon por kontroli la difinojn de via DokuWiki-instalo. Por helpo pri specifaj difinoj aliru al [[doku>config]]. Por pli detaloj pri tiu ĉi kromaĵo, vidu [[doku>plugin:config]].
-Difinoj montrataj kun hela ruĝa fono estas protektitaj kaj ne povas esti modifataj per tiu ĉi kromaĵo. Difinoj kun blua fono estas aprioraj valoroj kaj difinoj montrataj kun blanka fono estis iam difinataj por tiu ĉi specifa instalo. Ambaŭ blua kaj blanka difinoj povas esti modifataj.
+Difinoj montrataj kun helruĝa fono estas protektitaj kaj ne povas esti modifataj per tiu ĉi kromaĵo. Difinoj kun blua fono estas aprioraj valoroj kaj difinoj montrataj kun blanka fono iam difiniĝis por tiu ĉi specifa instalo. Ambaŭ blua kaj blanka difinoj povas esti modifataj.
Memoru premi la butonon **Registri** antaŭ ol eliri tiun ĉi paĝon, male viaj modifoj perdiĝus.
diff --git a/lib/plugins/config/lang/eo/lang.php b/lib/plugins/config/lang/eo/lang.php
index b0411ec14..36f865c28 100644
--- a/lib/plugins/config/lang/eo/lang.php
+++ b/lib/plugins/config/lang/eo/lang.php
@@ -9,17 +9,15 @@
* @author Robert Bogenschneider <robog@gmx.de>
* @author Erik Pedersen <erik pedersen@shaw.ca>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Robert Bogenschneider <robog@GMX.de>
- * @author Robert BOGENSCHNEIDER <robog@gmx.de>
- * @author Robert BOGENSCHNEIDER <bogi@UEA.org>
+ * @author Robert Bogenschneider <bogi@uea.org>
*/
$lang['menu'] = 'Agordaj Difinoj';
$lang['error'] = 'La difinoj ne estas ĝisdatigitaj pro malvalida valoro: bonvolu revizii viajn ŝanĝojn kaj resubmeti ilin.
-&lt;br /&gt;La malkorekta(j) valoro(j) estas ĉirkaŭita(j) de ruĝa kadro.';
-$lang['updated'] = 'La difinoj estis sukcese ĝisdatigitaj.';
+<br />La malkorekta(j) valoro(j) estas ĉirkaŭita(j) de ruĝa kadro.';
+$lang['updated'] = 'La difinoj sukcese ĝisdatiĝis.';
$lang['nochoice'] = '(neniu alia elekto disponeblas)';
-$lang['locked'] = 'La difin-dosiero ne povas esti ĝisdatigita; se tio ne estas intenca, &lt;br /&gt; certiĝu, ke la dosieroj de lokaj difinoj havas korektajn nomojn kaj permesojn.';
-$lang['danger'] = 'Danĝero: ŝanĝo tiun opcion povus igi vian vikion kaj la agordan menuon neatingebla.';
+$lang['locked'] = 'La difin-dosiero ne povas esti ĝisdatigita; se tio ne estas intenca, <br /> certiĝu, ke la dosieroj de lokaj difinoj havas korektajn nomojn kaj permesojn.';
+$lang['danger'] = 'Danĝero: ŝanĝi tiun opcion povus igi vian vikion kaj la agordan menuon neatingebla.';
$lang['warning'] = 'Averto: ŝanĝi tiun opcion povus rezulti en neatendita konduto.';
$lang['security'] = 'Sekureca averto: ŝanĝi tiun opcion povus krei sekurecan riskon.';
$lang['_configuration_manager'] = 'Administrilo de agordoj';
@@ -34,117 +32,125 @@ $lang['_anti_spam'] = 'Kontraŭ-spamaj difinoj';
$lang['_editing'] = 'Difinoj por redakto';
$lang['_links'] = 'Difinoj por ligiloj';
$lang['_media'] = 'Difinoj por aŭdvidaĵoj';
+$lang['_notifications'] = 'Sciigaj agordoj';
+$lang['_syndication'] = 'Kunhavigaj agordoj';
$lang['_advanced'] = 'Fakaj difinoj';
$lang['_network'] = 'Difinoj por reto';
$lang['_plugin_sufix'] = 'Difinoj por kromaĵoj';
$lang['_template_sufix'] = 'Difinoj por ŝablonoj';
-$lang['_msg_setting_undefined'] = 'Neniu difinanta metadatenaro.';
+$lang['_msg_setting_undefined'] = 'Neniu difinanta metadatumaro.';
$lang['_msg_setting_no_class'] = 'Neniu difinanta klaso.';
$lang['_msg_setting_no_default'] = 'Neniu apriora valoro.';
-$lang['fmode'] = 'Reĝimo de dosiero-kreado';
-$lang['dmode'] = 'Reĝimo de dosierujo-kreado';
+$lang['title'] = 'Titolo de la vikio';
+$lang['start'] = 'Nomo de la hejmpaĝo';
$lang['lang'] = 'Lingvo';
+$lang['template'] = 'Ŝablono';
+$lang['tagline'] = 'Moto (se la ŝablono antaûvidas tion)';
+$lang['sidebar'] = 'Nomo de la flanka paĝo (se la ŝablono antaûvidas tion), malplena kampo malebligas la flankan paĝon';
+$lang['license'] = 'Laŭ kiu permesilo via enhavo devus esti publikigita?';
+$lang['savedir'] = 'Dosierujo por konservi datumaron';
$lang['basedir'] = 'Baza dosierujo';
$lang['baseurl'] = 'Baza URL';
-$lang['savedir'] = 'Dosierujo por konservi datenaron';
$lang['cookiedir'] = 'Kuketopado. Lasu malplena por uzi baseurl.';
-$lang['start'] = 'Nomo de la hejmpaĝo';
-$lang['title'] = 'Titolo de la vikio';
-$lang['template'] = 'Ŝablono';
-$lang['license'] = 'Laŭ kiu permesilo via enhavo devus esti publikigita?';
-$lang['fullpath'] = 'Montri la kompletan padon de la paĝoj en la piedlinio';
+$lang['dmode'] = 'Reĝimo de dosierujo-kreado';
+$lang['fmode'] = 'Reĝimo de dosiero-kreado';
+$lang['allowdebug'] = 'Ebligi kodumpurigadon <b>malebligu se ne necese!<;/b>';
$lang['recent'] = 'Freŝaj ŝanĝoj';
+$lang['recent_days'] = 'Kiom da freŝaj ŝanĝoj por teni (tagoj)';
$lang['breadcrumbs'] = 'Nombro da paderoj';
$lang['youarehere'] = 'Hierarkiaj paderoj';
+$lang['fullpath'] = 'Montri la kompletan padon de la paĝoj en la piedlinio';
$lang['typography'] = 'Fari tipografiajn anstataŭigojn';
-$lang['htmlok'] = 'Ebligi enmeton de HTML-aĵoj';
-$lang['phpok'] = 'Ebligi enmeton de PHP-aĵoj';
-$lang['dformat'] = 'Formato de datoj (vidu la PHP-an funkcion &lt;a href=&quot;http://www.php.net/strftime&quot;&gt;strftime&lt;/a&gt;)';
+$lang['dformat'] = 'Formato de datoj (vidu la PHP-an funkcion <a href="http://www.php.net/strftime">strftime</a>)';
$lang['signature'] = 'Subskribo';
+$lang['showuseras'] = 'Kiel indiki la lastan redaktinton';
$lang['toptoclevel'] = 'Supera nivelo por la enhavtabelo';
-$lang['tocminheads'] = 'Minimuma kvanto da ĉeftitoloj, kiu difinas ĉu la TOC estas kreita.';
+$lang['tocminheads'] = 'Minimuma kvanto da ĉeftitoloj, kiu difinas ĉu la TOC estas kreata.';
$lang['maxtoclevel'] = 'Maksimuma nivelo por la enhavtabelo';
$lang['maxseclevel'] = 'Maksimuma nivelo por redakti sekciojn';
$lang['camelcase'] = 'Uzi KamelUsklecon por ligiloj';
$lang['deaccent'] = 'Netaj paĝnomoj';
$lang['useheading'] = 'Uzi unuan titolon por paĝnomoj';
-$lang['refcheck'] = 'Kontrolo por referencoj al aŭdvidaĵoj';
-$lang['refshow'] = 'Nombro da referencoj al aŭdvidaĵoj por montri';
-$lang['allowdebug'] = 'Ebligi kodumpurigadon &lt;b&gt;malebligu se ne necese!&lt;/b&gt;';
-$lang['usewordblock'] = 'Bloki spamon surbaze de vortlisto';
-$lang['indexdelay'] = 'Prokrasto antaŭ ol indeksi (en sekundoj)';
-$lang['relnofollow'] = 'Uzi rel=&quot;nofollow&quot; kun eksteraj ligiloj';
-$lang['mailguard'] = 'Nebuligi retadresojn';
-$lang['iexssprotect'] = 'Ekzameni elŝutaĵojn kontraŭ eblaj malicaj ĴavaSkripto aŭ HTML-a kodumaĵo';
-$lang['showuseras'] = 'Kion montrigi dum indiko al la uzanto kiu laste redaktis paĝon.';
+$lang['sneaky_index'] = 'Apriore, DokuWiki montras ĉiujn nomspacojn en la indeksa modo. Ebligi tiun ĉi elekteblon kaŝus tion, kion la uzanto ne rajtas legi laŭ ACL. Tio povus rezulti ankaŭan kaŝon de alireblaj subnomspacoj. Tiel la indekso estus neuzebla por kelkaj agordoj de ACL.';
+$lang['hidepages'] = 'Kaŝi kongruantajn paĝojn (laŭ regulaj esprimoj)';
$lang['useacl'] = 'Uzi alirkontrolajn listojn';
$lang['autopasswd'] = 'Aŭtomate krei pasvortojn';
$lang['authtype'] = 'Tipo de identiĝo';
$lang['passcrypt'] = 'Metodo por ĉifri pasvortojn';
$lang['defaultgroup'] = 'Antaŭdifinita grupo';
-$lang['superuser'] = 'Superanto - grupo, uzanto aŭ listo (apartite per komoj), kiu plene alireblas al ĉiuj paĝoj kaj funkcioj, sendepende de la reguloj ACL';
+$lang['superuser'] = 'Superanto - grupo, uzanto aŭ listo (disigita per komoj), kiu plene alireblas al ĉiuj paĝoj kaj funkcioj, sendepende de la reguloj ACL';
$lang['manager'] = 'Administranto - grupo, uzanto aŭ listo (apartite per komoj), kiu havas alirpermeson al kelkaj administraj funkcioj';
$lang['profileconfirm'] = 'Konfirmi ŝanĝojn en la trajtaro per pasvorto';
+$lang['rememberme'] = 'Permesi longdaŭran ensalutajn kuketojn (rememoru min)';
$lang['disableactions'] = 'Malebligi DokuWiki-ajn agojn';
$lang['disableactions_check'] = 'Kontroli';
$lang['disableactions_subscription'] = 'Aliĝi/Malaliĝi';
-$lang['disableactions_wikicode'] = 'Rigardi vikitekston/Eksporti krudaĵon';
-$lang['disableactions_other'] = 'Aliaj agoj (apartite per komoj)';
-$lang['sneaky_index'] = 'Apriore, DokuWiki montras ĉiujn nomspacojn en la indeksa modo. Ebligi tiun ĉi elekteblon kaŝus tion, kion la uzanto ne rajtas legi laŭ ACL. Tio povus rezulti ankaŭan kaŝon de alireblaj subnomspacoj. Kaj tiel la indekso estus neuzebla por kelkaj agordoj de ACL.';
-$lang['auth_security_timeout'] = 'Sekureca Templimo por aŭtentigo (sekundoj)';
-$lang['securecookie'] = 'Ĉu kuketoj difinitaj per HTTPS nur estu senditaj de la foliumilo per HTTPS? Malebligu tiun ĉi opcion kiam nur la ensaluto al via vikio estas sekurigita per SSL, sed foliumado de la vikio estas farita malsekure.';
-$lang['xmlrpc'] = 'Ebligi/malebligi la interfacon XML-RPC.';
-$lang['xmlrpcuser'] = 'Permesi XML-RPC-an aliron al certaj grupoj aŭ uzantoj, bonvolu meti iliajn komoseparitajn nomojn tie ĉi. Alirebli de ĉiu, ĝin lasu malplena.';
-$lang['updatecheck'] = 'Ĉu kontroli aktualigojn kaj sekurecajn avizojn? DokuWiki bezonas kontakti update.dokuwiki.org por tiu ĉi trajto.';
-$lang['userewrite'] = 'Uzi netajn URL-ojn';
-$lang['useslash'] = 'Uzi frakcistrekon kiel apartigsignaĵo por nomspacoj en URL-oj';
+$lang['disableactions_wikicode'] = 'Rigardi vikitekston/Eksporti fontotekston';
+$lang['disableactions_other'] = 'Aliaj agoj (disigita per komoj)';
+$lang['auth_security_timeout'] = 'Sekureca tempolimo por aŭtentigo (sekundoj)';
+$lang['securecookie'] = 'Ĉu kuketoj difinitaj per HTTPS sendiĝu de la foliumilo nur per HTTPS? Malebligu tiun ĉi opcion kiam nur la ensaluto al via vikio estas sekurigita per SSL, sed foliumado de la vikio estas farita malsekure.';
+$lang['remote'] = 'Ebligu la traretan API-sistemon. Tio ebligas al aliaj aplikaĵoj aliri la vikion pere de XML-RPC aũ aliaj mekanismoj.';
+$lang['remoteuser'] = 'Limigi traretan API-aliron al la komodisigitaj grupoj aũ uzantoj indikitaj jene. Lasu malplena por ebligi aliron al ĉiu ajn.';
+$lang['usewordblock'] = 'Bloki spamon surbaze de vortlisto';
+$lang['relnofollow'] = 'Uzi rel="nofollow" kun eksteraj ligiloj';
+$lang['indexdelay'] = 'Prokrasto antaŭ ol indeksi (en sekundoj)';
+$lang['mailguard'] = 'Nebuligi retadresojn';
+$lang['iexssprotect'] = 'Ekzameni elŝutaĵojn kontraŭ eblaj malicaj ĴavaSkripto aŭ HTML-a kodumaĵo';
$lang['usedraft'] = 'Aŭtomate konservi skizon dum redaktado';
-$lang['sepchar'] = 'Apartigsignaĵo de vortoj en paĝnomoj';
-$lang['canonical'] = 'Uzi tute evidentajn URL-ojn';
-$lang['fnencode'] = 'Kodiga metodo por ne-ASCII-aj dosiernomoj.';
-$lang['autoplural'] = 'Kontroli pluralajn formojn en ligiloj';
-$lang['compression'] = 'Kompaktigmetodo por arkivaj dosieroj';
-$lang['cachetime'] = 'Maksimuma aĝo por provizmemoro (sek.)';
+$lang['htmlok'] = 'Ebligi enmeton de HTML-aĵoj';
+$lang['phpok'] = 'Ebligi enmeton de PHP-aĵoj';
$lang['locktime'] = 'Maksimuma aĝo por serurdosieroj (sek.)';
-$lang['fetchsize'] = 'Maksimuma grandeco (bitokoj), kiun fetch.php rajtas elŝuti el ekstere';
-$lang['notify'] = 'Sendi avizojn pri ŝanĝoj al tiu ĉi retadreso';
-$lang['registernotify'] = 'Sendi informon pri ĵusaj aliĝintoj al tiu ĉi retadreso';
-$lang['mailfrom'] = 'Retadreso uzota por aŭtomataj retmesaĝoj ';
-$lang['mailprefix'] = 'Retpoŝta temo-prefikso por uzi en aŭtomataj mesaĝoj';
-$lang['gzip_output'] = 'Uzi gzip-an enhav-enkodigon por XHTML';
+$lang['cachetime'] = 'Maksimuma aĝo por provizmemoro (sek.)';
+$lang['target____wiki'] = 'Parametro "target" (celo) por internaj ligiloj';
+$lang['target____interwiki'] = 'Parametro "target" (celo) por intervikiaj ligiloj';
+$lang['target____extern'] = 'Parametro "target" (celo) por eksteraj ligiloj';
+$lang['target____media'] = 'Parametro "target" (celo) por aŭdvidaĵaj ligiloj';
+$lang['target____windows'] = 'Parametro "target" (celo) por Vindozaj ligiloj';
+$lang['mediarevisions'] = 'Ĉu ebligi reviziadon de aŭdvidaĵoj?';
+$lang['refcheck'] = 'Kontrolo por referencoj al aŭdvidaĵoj';
+$lang['refshow'] = 'Nombro da referencoj al aŭdvidaĵoj por montri';
$lang['gdlib'] = 'Versio de GD-Lib';
$lang['im_convert'] = 'Pado al la konvertilo de ImageMagick';
$lang['jpg_quality'] = 'Kompaktiga kvalito de JPG (0-100)';
+$lang['fetchsize'] = 'Maksimuma grandeco (bitokoj), kiun fetch.php rajtas elŝuti el ekstere';
$lang['subscribers'] = 'Ebligi subtenon de avizoj pri ŝanĝoj sur paĝoj';
$lang['subscribe_time'] = 'Tempo, post kiu abonlistoj kaj kolektaĵoj sendiĝas (sek); Tio estu pli malgranda ol la tempo indikita en recent_days.';
-$lang['compress'] = 'Kompaktigi CSS-ajn kaj ĵavaskriptajn elmetojn';
-$lang['cssdatauri'] = 'Grandeco en bitokoj, ĝis kiom en CSS-dosieroj referencitaj bildoj estu enmetataj rekte en la stilfolion por malgrandigi vanan HTTP-kapan trafikon. Tiu tekniko ne funkcias en IE 7 aŭ pli frua!
-&lt;code&gt;400&lt;/code&gt; ĝis &lt;code&gt;600&lt;/code&gt; bitokoj estas bona grandeco. Indiku &lt;code&gt;0&lt;/code&gt; por malebligi enmeton.';
-$lang['hidepages'] = 'Kaŝi kongruantajn paĝojn (laŭ regulaj esprimoj)';
-$lang['send404'] = 'Sendi la mesaĝon &quot;HTTP 404/Paĝo ne trovita&quot; por ne ekzistantaj paĝoj';
-$lang['sitemap'] = 'Krei Guglan paĝarmapon &quot;sitemap&quot; (po kiom tagoj)';
-$lang['broken_iua'] = 'Ĉu la funkcio &quot;ignore_user_abort&quot; difektas en via sistemo? Tio povus misfunkciigi la serĉindekson. IIS+PHP/CGI estas konata kiel fuŝaĵo. Vidu &lt;a href=&quot;http://bugs.splitbrain.org/?do=details&amp;task_id=852&quot;&gt;Cimon 852&lt;/a&gt; por pli da informoj.';
-$lang['xsendfile'] = 'Ĉu uzi la kaplinion X-Sendfile por ebligi al la retservilo liveri fiksajn dosierojn? Via retservilo bezonus subteni tion.';
-$lang['renderer_xhtml'] = 'Prezentilo por la ĉefa vikia rezulto (xhtml)';
-$lang['renderer__core'] = '%s (DokuWiki-a kerno)';
-$lang['renderer__plugin'] = '%s (kromaĵo)';
-$lang['rememberme'] = 'Permesi longdaŭran ensalutajn kuketojn (rememoru min)';
+$lang['notify'] = 'Sendi avizojn pri ŝanĝoj al tiu ĉi retadreso';
+$lang['registernotify'] = 'Sendi informon pri ĵusaj aliĝintoj al tiu ĉi retadreso';
+$lang['mailfrom'] = 'Retadreso uzota por aŭtomataj retmesaĝoj ';
+$lang['mailprefix'] = 'Retpoŝta temo-prefikso por uzi en aŭtomataj mesaĝoj';
+$lang['htmlmail'] = 'Sendi pli bele aspektajn, sed pli grandajn plurpartajn HTML-retpoŝtaĵojn. Malebligu por ricevi pure tekstajn mesaĝojn.';
+$lang['sitemap'] = 'Krei Guglan paĝarmapon "sitemap" (po kiom tagoj)';
$lang['rss_type'] = 'XML-a tipo de novaĵ-fluo';
$lang['rss_linkto'] = 'La novaĵ-fluo de XML ligiĝas al';
$lang['rss_content'] = 'Kion montri en la XML-aj novaĵ-flueroj?';
$lang['rss_update'] = 'Intertempo por ĝisdatigi XML-an novaĵ-fluon (sek.)';
-$lang['recent_days'] = 'Kiom da freŝaj ŝanĝoj por teni (tagoj)';
$lang['rss_show_summary'] = 'XML-a novaĵ-fluo montras resumon en la titolo';
-$lang['target____wiki'] = 'Parametro &quot;target&quot; (celo) por internaj ligiloj';
-$lang['target____interwiki'] = 'Parametro &quot;target&quot; (celo) por intervikiaj ligiloj';
-$lang['target____extern'] = 'Parametro &quot;target&quot; (celo) por eksteraj ligiloj';
-$lang['target____media'] = 'Parametro &quot;target&quot; (celo) por aŭdvidaĵaj ligiloj';
-$lang['target____windows'] = 'Parametro &quot;target&quot; (celo) por Vindozaj ligiloj';
-$lang['proxy____host'] = 'Retservilnomo de la &quot;Proxy&quot;';
-$lang['proxy____port'] = 'Pordo ĉe la &quot;Proxy&quot;';
-$lang['proxy____user'] = 'Uzantonomo ĉe la &quot;Proxy&quot;';
-$lang['proxy____pass'] = 'Pasvorto ĉe la &quot;Proxy&quot;';
-$lang['proxy____ssl'] = 'Uzi SSL por konekti al la &quot;Proxy&quot;';
+$lang['rss_media'] = 'Kiaj ŝangoj estu montrataj en la XML-fluo?';
+$lang['updatecheck'] = 'Ĉu kontroli aktualigojn kaj sekurecajn avizojn? DokuWiki bezonas kontakti update.dokuwiki.org por tiu ĉi trajto.';
+$lang['userewrite'] = 'Uzi netajn URL-ojn';
+$lang['useslash'] = 'Uzi frakcistrekon kiel disigsignaĵon por nomspacoj en URL-oj';
+$lang['sepchar'] = 'Disigsignaĵo de vortoj en paĝnomoj';
+$lang['canonical'] = 'Uzi tute evidentajn URL-ojn';
+$lang['fnencode'] = 'Kodiga metodo por ne-ASCII-aj dosiernomoj.';
+$lang['autoplural'] = 'Kontroli pluralajn formojn en ligiloj';
+$lang['compression'] = 'Kompaktigmetodo por arkivaj dosieroj';
+$lang['gzip_output'] = 'Uzi gzip-an enhav-enkodigon por XHTML';
+$lang['compress'] = 'Kompaktigi CSS-ajn kaj ĵavaskriptajn elmetojn';
+$lang['cssdatauri'] = 'Grandeco en bitokoj, ĝis kiom en CSS-dosieroj referencitaj bildoj enmetiĝu rekte en la stilfolion por malgrandigi vanan HTTP-kapan trafikon. Tiu tekniko ne funkcias en IE 7 aŭ pli frua!
+<code>400</code> ĝis <code>600</code> bitokoj estas bona grandeco. Indiku <code>0</code> por malebligi enmeton.';
+$lang['send404'] = 'Sendi la mesaĝon "HTTP 404/Paĝo ne trovita" por ne ekzistantaj paĝoj';
+$lang['broken_iua'] = 'Ĉu la funkcio "ignore_user_abort" difektas en via sistemo? Tio povus misfunkciigi la serĉindekson. IIS+PHP/CGI estas konata kiel fuŝaĵo. Vidu <a href="http://bugs.splitbrain.org/?do=details&task_id=852&">Cimon 852</a> por pli da informoj.';
+$lang['xsendfile'] = 'Ĉu uzi la kaplinion X-Sendfile por ebligi al la retservilo liveri fiksajn dosierojn? Via retservilo subtenu tion.';
+$lang['renderer_xhtml'] = 'Prezentilo por la ĉefa vikia rezulto (xhtml)';
+$lang['renderer__core'] = '%s (DokuWiki-a kerno)';
+$lang['renderer__plugin'] = '%s (kromaĵo)';
+$lang['dnslookups'] = 'DokuWiki rigardos servilajn nomojn por paĝmodifoj tra fremdaj IP-adresoj. Se vi havas malrapidan aũ nefunkciantan DNS-servilon aũ malŝatas tiun trajton, malebligu tiun opcion';
+$lang['proxy____host'] = 'Retservilnomo de la "Proxy"';
+$lang['proxy____port'] = 'Pordo ĉe la "Proxy"';
+$lang['proxy____user'] = 'Uzantonomo ĉe la "Proxy"';
+$lang['proxy____pass'] = 'Pasvorto ĉe la "Proxy"';
+$lang['proxy____ssl'] = 'Uzi SSL por konekti al la "Proxy"';
$lang['proxy____except'] = 'Regula esprimo por URL-oj, kiujn la servilo preterrigardu.';
$lang['safemodehack'] = 'Ebligi sekuran modon';
$lang['ftp____host'] = 'FTP-a servilo por sekura modo';
@@ -152,7 +158,7 @@ $lang['ftp____port'] = 'FTP-a pordo por sekura modo';
$lang['ftp____user'] = 'FTP-a uzantonomo por sekura modo';
$lang['ftp____pass'] = 'FTP-a pasvorto por sekura modo';
$lang['ftp____root'] = 'FTP-a superuzanta (root) subdosierujo por sekura modo';
-$lang['license_o_'] = 'Nenio elektite';
+$lang['license_o_'] = 'Nenio elektita';
$lang['typography_o_0'] = 'nenio';
$lang['typography_o_1'] = 'Nur duoblaj citiloj';
$lang['typography_o_2'] = 'Ĉiaj citiloj (eble ne ĉiam funkcios)';
@@ -171,8 +177,8 @@ $lang['rss_type_o_rss2'] = 'RSS 2.0';
$lang['rss_type_o_atom'] = 'Atom 0.3';
$lang['rss_type_o_atom1'] = 'Atom 1.0';
$lang['rss_content_o_abstract'] = 'Resumo';
-$lang['rss_content_o_diff'] = 'Unuigita &quot;Diff&quot;';
-$lang['rss_content_o_htmldiff'] = '&quot;Diff&quot;-tabelo formatita laŭ HTML';
+$lang['rss_content_o_diff'] = 'Unuigita "Diff"';
+$lang['rss_content_o_htmldiff'] = '"Diff"-tabelo formatita laŭ HTML';
$lang['rss_content_o_html'] = 'Enhavo laŭ kompleta HTML-paĝo';
$lang['rss_linkto_o_diff'] = 'diferenca rigardo';
$lang['rss_linkto_o_page'] = 'la reviziita paĝo';
@@ -182,12 +188,12 @@ $lang['compression_o_0'] = 'nenio';
$lang['compression_o_gz'] = 'gzip';
$lang['compression_o_bz2'] = 'bz2';
$lang['xsendfile_o_0'] = 'ne uzi';
-$lang['xsendfile_o_1'] = 'Propra kaplinio &quot;lighttpd&quot; (antaŭ versio 1.5)';
+$lang['xsendfile_o_1'] = 'Propra kaplinio "lighttpd" (antaŭ versio 1.5)';
$lang['xsendfile_o_2'] = 'Ordinara kaplinio X-Sendfile';
$lang['xsendfile_o_3'] = 'Propra kaplinio Nginx X-Accel-Redirect';
$lang['showuseras_o_loginname'] = 'Ensalut-nomo';
$lang['showuseras_o_username'] = 'Kompleta nomo de uzanto';
-$lang['showuseras_o_email'] = 'Retadreso de uzanto (sekur-montrita laŭ agordo de mailguard)';
+$lang['showuseras_o_email'] = 'Retadreso de uzanto (sekur-montrita laŭ agordo de nebuligo)';
$lang['showuseras_o_email_link'] = 'Retadreso de uzanto kiel mailto:-ligilo';
$lang['useheading_o_0'] = 'Neniam';
$lang['useheading_o_navigation'] = 'Nur foliumado';
diff --git a/lib/plugins/config/lang/es/lang.php b/lib/plugins/config/lang/es/lang.php
index 1189a6781..b940f13cd 100644
--- a/lib/plugins/config/lang/es/lang.php
+++ b/lib/plugins/config/lang/es/lang.php
@@ -22,6 +22,7 @@
* @author emezeta <emezeta@infoprimo.com>
* @author Oscar Ciudad <oscar@jacho.net>
* @author Ruben Figols <ruben.figols@gmail.com>
+ * @author Gerardo Zamudio <gerardo@gerardozamudio.net>
*/
$lang['menu'] = 'Parámetros de configuración';
$lang['error'] = 'Los parámetros no han sido actualizados a causa de un valor inválido, por favor revise los cambios y re-envíe el formulario. <br /> Los valores incorrectos se mostrarán con un marco rojo alrededor.';
@@ -43,6 +44,8 @@ $lang['_anti_spam'] = 'Parámetros Anti-Spam';
$lang['_editing'] = 'Parámetros de Edición';
$lang['_links'] = 'Parámetros de Enlaces';
$lang['_media'] = 'Parámetros de Medios';
+$lang['_notifications'] = 'Configuración de notificaciones';
+$lang['_syndication'] = 'Configuración de sindicación';
$lang['_advanced'] = 'Parámetros Avanzados';
$lang['_network'] = 'Parámetros de Red';
$lang['_plugin_sufix'] = 'Parámetros de Plugins';
@@ -50,26 +53,29 @@ $lang['_template_sufix'] = 'Parámetros de Plantillas';
$lang['_msg_setting_undefined'] = 'Sin parámetros de metadata.';
$lang['_msg_setting_no_class'] = 'Sin clase establecida.';
$lang['_msg_setting_no_default'] = 'Sin valor por defecto.';
-$lang['fmode'] = 'Modo de creación de ficheros';
-$lang['dmode'] = 'Modo de creación de directorios';
+$lang['title'] = 'Título del wiki';
+$lang['start'] = 'Nombre de la página inicial';
$lang['lang'] = 'Idioma';
+$lang['template'] = 'Plantilla';
+$lang['tagline'] = 'Lema (si la plantilla lo soporta)';
+$lang['sidebar'] = 'Nombre de la barra lateral (si la plantilla lo soporta), un campo vacío la desactiva';
+$lang['license'] = '¿Bajo qué licencia será liberado tu contenido?';
+$lang['savedir'] = 'Directorio para guardar los datos';
$lang['basedir'] = 'Directorio de base';
$lang['baseurl'] = 'URL de base';
-$lang['savedir'] = 'Directorio para guardar los datos';
$lang['cookiedir'] = 'Ruta para las Cookie. Dejar en blanco para usar la ruta básica.';
-$lang['start'] = 'Nombre de la página inicial';
-$lang['title'] = 'Título del wiki';
-$lang['template'] = 'Plantilla';
-$lang['license'] = '¿Bajo qué licencia será liberado tu contenido?';
-$lang['fullpath'] = 'Mostrar ruta completa en el pie de página';
+$lang['dmode'] = 'Modo de creación de directorios';
+$lang['fmode'] = 'Modo de creación de ficheros';
+$lang['allowdebug'] = 'Permitir debug <b>deshabilítelo si no lo necesita!</b>';
$lang['recent'] = 'Cambios recientes';
+$lang['recent_days'] = 'Cuántos cambios recientes mantener (días)';
$lang['breadcrumbs'] = 'Número de pasos de traza';
$lang['youarehere'] = 'Traza jerárquica';
+$lang['fullpath'] = 'Mostrar ruta completa en el pie de página';
$lang['typography'] = 'Realizar reemplazos tipográficos';
-$lang['htmlok'] = 'Permitir HTML embebido';
-$lang['phpok'] = 'Permitir PHP embebido';
$lang['dformat'] = 'Formato de fecha (ver la función de PHP <a href="http://www.php.net/strftime">strftime</a>)';
$lang['signature'] = 'Firma';
+$lang['showuseras'] = 'Qué ver al mostrar el último usuario que editó una página';
$lang['toptoclevel'] = 'Nivel superior para la tabla de contenidos';
$lang['tocminheads'] = 'La cantidad mínima de titulares que determina si el TOC es construido';
$lang['maxtoclevel'] = 'Máximo nivel para la tabla de contenidos';
@@ -77,15 +83,8 @@ $lang['maxseclevel'] = 'Máximo nivel para edición de sección';
$lang['camelcase'] = 'Usar CamelCase para enlaces';
$lang['deaccent'] = 'Nombres de páginas "limpios"';
$lang['useheading'] = 'Usar el primer encabezado para nombres de páginas';
-$lang['refcheck'] = 'Control de referencia a medios';
-$lang['refshow'] = 'Número de referencias a medios a mostrar';
-$lang['allowdebug'] = 'Permitir debug <b>deshabilítelo si no lo necesita!</b>';
-$lang['usewordblock'] = 'Bloquear spam usando una lista de palabras';
-$lang['indexdelay'] = 'Intervalo de tiempo antes de indexar (segundos)';
-$lang['relnofollow'] = 'Usar rel="nofollow" en enlaces externos';
-$lang['mailguard'] = 'Ofuscar direcciones de correo electrónico';
-$lang['iexssprotect'] = 'Comprobar posible código malicioso (JavaScript ó HTML) en archivos subidos';
-$lang['showuseras'] = 'Qué ver al mostrar el último usuario que editó una página';
+$lang['sneaky_index'] = 'Por defecto, DokuWiki mostrará todos los namespaces en el index. Habilitando esta opción los ocultará si el usuario no tiene permisos de lectura. Los sub-namespaces pueden resultar inaccesibles. El index puede hacerse poco usable dependiendo de las configuraciones ACL.';
+$lang['hidepages'] = 'Ocultar páginas con coincidencias (expresiones regulares)';
$lang['useacl'] = 'Usar listas de control de acceso (ACL)';
$lang['autopasswd'] = 'Autogenerar contraseñas';
$lang['authtype'] = 'Método de Autenticación';
@@ -94,60 +93,70 @@ $lang['defaultgroup'] = 'Grupo por defecto';
$lang['superuser'] = 'Super-usuario - grupo ó usuario con acceso total a todas las páginas y funciones, configuraciones ACL';
$lang['manager'] = 'Manager - grupo o usuario con acceso a ciertas tareas de mantenimiento';
$lang['profileconfirm'] = 'Confirmar cambios en perfil con contraseña';
+$lang['rememberme'] = 'Permitir cookies para acceso permanente (recordarme)';
$lang['disableactions'] = 'Deshabilitar acciones DokuWiki';
$lang['disableactions_check'] = 'Controlar';
$lang['disableactions_subscription'] = 'Suscribirse/Cancelar suscripción';
$lang['disableactions_wikicode'] = 'Ver la fuente/Exportar en formato raw';
$lang['disableactions_other'] = 'Otras acciones (separadas por coma)';
-$lang['sneaky_index'] = 'Por defecto, DokuWiki mostrará todos los namespaces en el index. Habilitando esta opción los ocultará si el usuario no tiene permisos de lectura. Los sub-namespaces pueden resultar inaccesibles. El index puede hacerse poco usable dependiendo de las configuraciones ACL.';
$lang['auth_security_timeout'] = 'Tiempo de Autenticación (en segundos), por motivos de seguridad';
$lang['securecookie'] = 'Las cookies establecidas por HTTPS, ¿el naveagdor solo puede enviarlas por HTTPS? Inhabilite esta opción cuando solo se asegure con SSL la entrada, pero no la navegación de su wiki.';
-$lang['xmlrpc'] = 'Habilitar/Deshabilitar interfaz XML-RPC';
-$lang['xmlrpcuser'] = 'Restringir el acceso XML-RPC a los grupos o usuarios separados por coma mencionados aquí. Dejar en blanco para dar acceso a todo el mundo. ';
+$lang['remote'] = 'Activar el sistema API remoto. Esto permite a otras aplicaciones acceder al wiki a traves de XML-RPC u otros mecanismos.';
+$lang['remoteuser'] = 'Restringir el acceso remoto por API a los grupos o usuarios separados por comas que se dan aquí. Dejar en blanco para dar acceso a todo el mundo.';
+$lang['usewordblock'] = 'Bloquear spam usando una lista de palabras';
+$lang['relnofollow'] = 'Usar rel="nofollow" en enlaces externos';
+$lang['indexdelay'] = 'Intervalo de tiempo antes de indexar (segundos)';
+$lang['mailguard'] = 'Ofuscar direcciones de correo electrónico';
+$lang['iexssprotect'] = 'Comprobar posible código malicioso (JavaScript ó HTML) en archivos subidos';
+$lang['usedraft'] = 'Guardar automáticamente un borrador mientras se edita';
+$lang['htmlok'] = 'Permitir HTML embebido';
+$lang['phpok'] = 'Permitir PHP embebido';
+$lang['locktime'] = 'Edad máxima para archivos de bloqueo (segundos)';
+$lang['cachetime'] = 'Edad máxima para caché (segundos)';
+$lang['target____wiki'] = 'Ventana para enlaces internos';
+$lang['target____interwiki'] = 'Ventana para enlaces interwikis';
+$lang['target____extern'] = 'Ventana para enlaces externos';
+$lang['target____media'] = 'Ventana para enlaces a medios';
+$lang['target____windows'] = 'Ventana para enlaces a ventanas';
+$lang['mediarevisions'] = '¿Habilitar Mediarevisions?';
+$lang['refcheck'] = 'Control de referencia a medios';
+$lang['refshow'] = 'Número de referencias a medios a mostrar';
+$lang['gdlib'] = 'Versión de GD Lib';
+$lang['im_convert'] = 'Ruta a la herramienta de conversión de ImageMagick';
+$lang['jpg_quality'] = 'Calidad de compresión de JPG (0-100)';
+$lang['fetchsize'] = 'Tamaño máximo (bytes) que fetch.php puede descargar de sitios externos';
+$lang['subscribers'] = 'Habilitar soporte para suscripción a páginas';
+$lang['subscribe_time'] = 'Tiempo después que alguna lista de suscripción fue enviada (seg); Debe ser menor que el tiempo especificado en días recientes.';
+$lang['notify'] = 'Enviar notificación de cambios a esta dirección de correo electrónico';
+$lang['registernotify'] = 'Enviar información cuando se registran nuevos usuarios a esta dirección de correo electrónico';
+$lang['mailfrom'] = 'Dirección de correo electrónico para emails automáticos';
+$lang['mailprefix'] = 'Asunto por defecto que se utilizará en mails automáticos.';
+$lang['htmlmail'] = 'Enviar correos electronicos en HTML con mejor aspecto pero mayor peso. Desactivar para enviar correos electronicos en texto plano.';
+$lang['sitemap'] = 'Generar sitemap de Google (días)';
+$lang['rss_type'] = 'Tipo de resumen (feed) XML';
+$lang['rss_linkto'] = 'Feed XML enlaza a';
+$lang['rss_content'] = '¿Qué mostrar en los items del archivo XML?';
+$lang['rss_update'] = 'Intervalo de actualización de feed XML (segundos)';
+$lang['rss_show_summary'] = 'Feed XML muestra el resumen en el título';
+$lang['rss_media'] = '¿Qué tipo de cambios deberían aparecer en el feed XML?';
$lang['updatecheck'] = '¿Comprobar actualizaciones y advertencias de seguridad? Esta característica requiere que DokuWiki se conecte a update.dokuwiki.org.';
$lang['userewrite'] = 'Usar URLs bonitas';
$lang['useslash'] = 'Usar barra (/) como separador de espacios de nombres en las URLs';
-$lang['usedraft'] = 'Guardar automáticamente un borrador mientras se edita';
$lang['sepchar'] = 'Separador de palabras en nombres de páginas';
$lang['canonical'] = 'Usar URLs totalmente canónicas';
$lang['fnencode'] = 'Método para codificar nombres de archivo no-ASCII.';
$lang['autoplural'] = 'Controlar plurales en enlaces';
$lang['compression'] = 'Método de compresión para archivos en el ático';
-$lang['cachetime'] = 'Edad máxima para caché (segundos)';
-$lang['locktime'] = 'Edad máxima para archivos de bloqueo (segundos)';
-$lang['fetchsize'] = 'Tamaño máximo (bytes) que fetch.php puede descargar de sitios externos';
-$lang['notify'] = 'Enviar notificación de cambios a esta dirección de correo electrónico';
-$lang['registernotify'] = 'Enviar información cuando se registran nuevos usuarios a esta dirección de correo electrónico';
-$lang['mailfrom'] = 'Dirección de correo electrónico para emails automáticos';
-$lang['mailprefix'] = 'Asunto por defecto que se utilizará en mails automáticos.';
$lang['gzip_output'] = 'Usar gzip Content-Encoding para xhtml';
-$lang['gdlib'] = 'Versión de GD Lib';
-$lang['im_convert'] = 'Ruta a la herramienta de conversión de ImageMagick';
-$lang['jpg_quality'] = 'Calidad de compresión de JPG (0-100)';
-$lang['subscribers'] = 'Habilitar soporte para suscripción a páginas';
-$lang['subscribe_time'] = 'Tiempo después que alguna lista de suscripción fue enviada (seg); Debe ser menor que el tiempo especificado en días recientes.';
$lang['compress'] = 'Compactar la salida de CSS y javascript';
$lang['cssdatauri'] = 'Tamaño en bytes hasta el cual las imágenes referenciadas en archivos CSS deberían ir incrustadas en la hoja de estilos para reducir el número de cabeceras de petición HTTP. ¡Esta técnica no funcionará en IE < 8! De <code>400</code> a <code>600</code> bytes es un valor adecuado. Establezca <code>0</code> para deshabilitarlo.';
-$lang['hidepages'] = 'Ocultar páginas con coincidencias (expresiones regulares)';
$lang['send404'] = 'Enviar "HTTP 404/Page Not Found" para páginas no existentes';
-$lang['sitemap'] = 'Generar sitemap de Google (días)';
$lang['broken_iua'] = '¿Se ha roto (broken) la función ignore_user_abort en su sistema? Esto puede causar que no funcione el index de búsqueda. Se sabe que IIS+PHP/CGI está roto. Vea <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a>para más información.';
-$lang['xsendfile'] = 'Utilice el X-Sendfile header para permitirle sl servidor web enviar archivos estáticos? Su servidor web necesita tener la capacidad para hacerlo.';
+$lang['xsendfile'] = '¿Utilizar la cabecera X-Sendfile para permitirle al servidor web enviar archivos estáticos? Su servidor web necesita tener la capacidad para hacerlo.';
$lang['renderer_xhtml'] = 'Visualizador a usar para salida (xhtml) principal del wiki';
$lang['renderer__core'] = '%s (núcleo dokuwiki)';
$lang['renderer__plugin'] = '%s (plugin)';
-$lang['rememberme'] = 'Permitir cookies para acceso permanente (recordarme)';
-$lang['rss_type'] = 'Tipo de resumen (feed) XML';
-$lang['rss_linkto'] = 'Feed XML enlaza a';
-$lang['rss_content'] = 'Que mostrar en los itemes del archivo XML?';
-$lang['rss_update'] = 'Intervalo de actualización de feed XML (segundos)';
-$lang['recent_days'] = 'Cuántos cambios recientes mantener (días)';
-$lang['rss_show_summary'] = 'Feed XML muestra el resumen en el título';
-$lang['target____wiki'] = 'Ventana para enlaces internos';
-$lang['target____interwiki'] = 'Ventana para enlaces interwikis';
-$lang['target____extern'] = 'Ventana para enlaces externos';
-$lang['target____media'] = 'Ventana para enlaces a medios';
-$lang['target____windows'] = 'Ventana para enlaces a ventanas';
+$lang['dnslookups'] = 'DokuWiki buscara los hostnames para usuarios editando las páginas con IP remota. Si usted tiene un servidor DNS bastante lento o que no funcione, favor de desactivar esta opción.';
$lang['proxy____host'] = 'Nombre del servidor Proxy';
$lang['proxy____port'] = 'Puerto del servidor Proxy';
$lang['proxy____user'] = 'Nombre de usuario para el servidor Proxy';
diff --git a/lib/plugins/config/lang/eu/lang.php b/lib/plugins/config/lang/eu/lang.php
index 9d001d494..97addbb50 100644
--- a/lib/plugins/config/lang/eu/lang.php
+++ b/lib/plugins/config/lang/eu/lang.php
@@ -83,8 +83,6 @@ $lang['disableactions_other'] = 'Beste ekintzak (komaz bereiztuak)';
$lang['sneaky_index'] = 'Lehenespenez, DokuWiki-k izen-espazio guztiak indize bistan erakutsiko ditu. Aukera hau gaituta, erabiltzaieak irakurtzeko baimenik ez dituen izen-espazioak ezkutatuko dira. Honek atzigarriak diren azpi izen-espazioak ezkutatzen ditu. Agian honek indizea erabili ezin ahal izatea eragingo du AKL ezarpen batzuetan.';
$lang['auth_security_timeout'] = 'Kautotze Segurtasun Denbora-Muga (segunduak)';
$lang['securecookie'] = 'HTTPS bidez ezarritako cookie-ak HTTPS bidez bakarrik bidali beharko lituzke nabigatzaileak? Ezgaitu aukera hau bakarrik saio hasierak SSL bidezko segurtasuna badu baina wiki-areb nabigazioa modu ez seguruan egiten bada. ';
-$lang['xmlrpc'] = 'Gaitu/ezgaitu XML-RPC interfazea.';
-$lang['xmlrpcuser'] = 'XML-RPC atzipena mugatu hemen emandako komaz bereiztutako talde eta erabiltzaileei. Utzi hutsik atzipena guztiei emateko.';
$lang['updatecheck'] = 'Konprobatu eguneratze eta segurtasun oharrak? DokuWiki-k honetarako update.dokuwiki.org kontaktatu behar du.';
$lang['userewrite'] = 'Erabili URL politak';
$lang['useslash'] = 'Erabili barra (/) izen-espazio banatzaile moduan URLetan';
diff --git a/lib/plugins/config/lang/fa/lang.php b/lib/plugins/config/lang/fa/lang.php
index 42cc3ed05..ba00d5a2d 100644
--- a/lib/plugins/config/lang/fa/lang.php
+++ b/lib/plugins/config/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['menu'] = 'تنظیمات پیکر‌بندی';
$lang['error'] = 'به دلیل ایراد در مقادیر وارد شده، تنظیمات اعمال نشد، خواهشمندیم تغییرات را مجددن کنترل نمایید و دوباره ارسال کنید.<br/> مقادیر مشکل‌دار با کادر قرمز مشخص شده‌اند.';
@@ -28,6 +29,8 @@ $lang['_anti_spam'] = 'تنظیمات ضد-اسپم';
$lang['_editing'] = 'تنظیمات ویرایش';
$lang['_links'] = 'تنظیمات پیوند';
$lang['_media'] = 'تنظیمات رسانه‌ها (فایل‌ها)';
+$lang['_notifications'] = 'تنظیمات آگاه سازی';
+$lang['_syndication'] = 'تنظیمات پیوند';
$lang['_advanced'] = 'تنظیمات پیشرفته';
$lang['_network'] = 'تنظیمات شبکه';
$lang['_plugin_sufix'] = 'تنظیمات افزونه';
@@ -35,25 +38,29 @@ $lang['_template_sufix'] = 'تنظیمات قالب';
$lang['_msg_setting_undefined'] = 'داده‌نمایی برای تنظیمات وجود ندارد';
$lang['_msg_setting_no_class'] = 'هیچ دسته‌ای برای تنظیمات وجود ندارد.';
$lang['_msg_setting_no_default'] = 'بدون مقدار پیش‌فرض';
-$lang['fmode'] = 'دسترسی پیش‌فرض فایل‌ها در زمان ایجاد';
-$lang['dmode'] = 'زبان';
-$lang['lang'] = 'زبان';
-$lang['basedir'] = 'شاخه‌ی اصلی';
-$lang['baseurl'] = 'آدرس اصلی';
-$lang['savedir'] = 'شاخه‌ی ذخیره‌سازی داده‌ها';
-$lang['start'] = 'نام صفحه‌ی آغازین';
$lang['title'] = 'عنوان ویکی';
+$lang['start'] = 'نام صفحه‌ی آغازین';
+$lang['lang'] = 'زبان';
$lang['template'] = 'قالب';
+$lang['tagline'] = 'خط تگ (اگر قالب از آن پشتیبانی می کند)';
+$lang['sidebar'] = 'نام نوار صفحه کناری (اگر قالب از آن پشتیبانی می کند) ، فیلد خالی نوار کناری غیر فعال خواهد کرد.';
$lang['license'] = 'لایسنس مطالب ویکی';
-$lang['fullpath'] = 'نمایش دادن مسیر کامل صفحات در پایین صفحه';
+$lang['savedir'] = 'شاخه‌ی ذخیره‌سازی داده‌ها';
+$lang['basedir'] = 'شاخه‌ی اصلی';
+$lang['baseurl'] = 'آدرس اصلی';
+$lang['cookiedir'] = 'مسیر کوکی ها. برای استفاده از آدرس پایه ، آن را خالی بگذارید.';
+$lang['dmode'] = 'زبان';
+$lang['fmode'] = 'دسترسی پیش‌فرض فایل‌ها در زمان ایجاد';
+$lang['allowdebug'] = 'امکان کرم‌زدایی (debug) <b>اگر نیازی ندارید، غیرفعال کنید</b>';
$lang['recent'] = 'تغییرات اخیر';
+$lang['recent_days'] = 'چند تغییر در خوراک نمایش داده شود به روز';
$lang['breadcrumbs'] = 'تعداد ردپاها';
$lang['youarehere'] = 'ردپای درختی';
+$lang['fullpath'] = 'نمایش دادن مسیر کامل صفحات در پایین صفحه';
$lang['typography'] = 'جای‌گزاری متن‌ها انجام شود';
-$lang['htmlok'] = 'امکان افزودن HTML باشد';
-$lang['phpok'] = 'امکان افزودن PHP باشد';
$lang['dformat'] = 'فرمت تاریخ (راهنمای تابع <a href="http://www.php.net/strftime">strftime</a> را مشاهده کنید)';
$lang['signature'] = 'امضا';
+$lang['showuseras'] = 'چگونه آخرین کاربر ویرایش کننده، یک صفحه نمایش داده شود';
$lang['toptoclevel'] = 'بیشترین عمق برای «فهرست مطالب»';
$lang['tocminheads'] = 'حداقل مقدار عنوان‌های یک صفحه، برای تشخیص این‌که «فهرست مطالب» (TOC) ایجاد شود';
$lang['maxtoclevel'] = 'حداکثر عمق «فهرست مطالب»';
@@ -61,15 +68,8 @@ $lang['maxseclevel'] = 'بیش‌ترین سطح ویرایش بخش
$lang['camelcase'] = 'از «حالت شتری» (CamelCase) برای پیوندها استفاده شود';
$lang['deaccent'] = 'تمیز کردن نام صفحات';
$lang['useheading'] = 'استفاده از اولین عنوان برای نام صفحه';
-$lang['refcheck'] = 'بررسی کردن مرجع رسانه‌ها';
-$lang['refshow'] = 'تعداد مراجعی که برای یک رسانه نمایش داده شود';
-$lang['allowdebug'] = 'امکان کرم‌زدایی (debug) <b>اگر نیازی ندارید، غیرفعال کنید</b>';
-$lang['usewordblock'] = 'اسپم‌ها را براساس لیست کلمات مسدود کن';
-$lang['indexdelay'] = 'مقدار تاخیر پیش از فهرست‌بندی (ثانیه)';
-$lang['relnofollow'] = 'از «rel=nofollow» در پیوندهای خروجی استفاده شود';
-$lang['mailguard'] = 'مبهم کردن آدرس‌های ایمیل';
-$lang['iexssprotect'] = 'بررسی کردن فایل‌های ارسال شده را برای کدهای HTML یا JavaScript مخرب';
-$lang['showuseras'] = 'چگونه آخرین کاربر ویرایش کننده، یک صفحه نمایش داده شود';
+$lang['sneaky_index'] = 'به طور پیش‌فرض، DokuWiki در فهرست تمامی فضای‌نام‌ها را نمایش می‌دهد. فعال کردن این گزینه، مواردی را که کاربر حق خواندنشان را ندارد مخفی می‌کند. این گزینه ممکن است باعث دیده نشدن زیرفضای‌نام‌هایی شود که دسترسی خواندن به آن‌ها وجود دارد. و ممکن است باعث شود که فهرست در حالاتی از دسترسی‌ها، غیرقابل استفاده شود.';
+$lang['hidepages'] = 'مخفی کردن صفحات با فرمت زیر (از عبارات منظم استفاده شود)';
$lang['useacl'] = 'استفاده از مدیریت دسترسی‌ها';
$lang['autopasswd'] = 'ایجاد خودکار گذرواژه‌ها';
$lang['authtype'] = 'روش معتبرسازی';
@@ -78,59 +78,71 @@ $lang['defaultgroup'] = 'گروه پیش‌فرض';
$lang['superuser'] = 'کاربر اصلی - گروه، کاربر یا لیستی که توسط ویرگول جدا شده از کاربرها و گروه‌ها (مثل user1,@group1,user2) با دسترسی کامل به همه‌ی صفحات و امکانات سیستم، فارغ از دسترسی‌های آن کاربر.';
$lang['manager'] = 'مدیر - گروه، کاربر یا لیستی که توسط ویرگول جدا شده از کاربرها و گروه‌ها (مثل user1,@group1,user2) با دسترسی‌های خاص به بخش‌های متفاوت';
$lang['profileconfirm'] = 'تغییرات پروفایل با وارد کردن گذرواژه تایید شود';
+$lang['rememberme'] = 'امکان ورود دایم، توسط کوکی، وجود داشته باشد (مرا به خاطر بسپار)';
$lang['disableactions'] = 'غیرفعال کردن فعالیت‌های DokuWiki';
$lang['disableactions_check'] = 'بررسی';
$lang['disableactions_subscription'] = 'عضویت/عدم عضویت';
$lang['disableactions_wikicode'] = 'نمایش سورس/برون‌بری خام';
$lang['disableactions_other'] = 'فعالیت‌های دیگر (با ویرگول انگلیسی «,» از هم جدا کنید)';
-$lang['sneaky_index'] = 'به طور پیش‌فرض، DokuWiki در فهرست تمامی فضای‌نام‌ها را نمایش می‌دهد. فعال کردن این گزینه، مواردی را که کاربر حق خواندنشان را ندارد مخفی می‌کند. این گزینه ممکن است باعث دیده نشدن زیرفضای‌نام‌هایی شود که دسترسی خواندن به آن‌ها وجود دارد. و ممکن است باعث شود که فهرست در حالاتی از دسترسی‌ها، غیرقابل استفاده شود.';
$lang['auth_security_timeout'] = 'زمان انقضای معتبرسازی به ثانیه';
$lang['securecookie'] = 'آیا کوکی‌ها باید با قرارداد HTTPS ارسال شوند؟ این گزینه را زمانی که فقط صفحه‌ی ورود ویکی‌تان با SSL امن شده است، اما ویکی را ناامن مرور می‌کنید، غیرفعال نمایید.';
-$lang['xmlrpc'] = 'فعال/غیرفعال کردن XML-RPC';
-$lang['xmlrpcuser'] = 'محمدود کردن دسترسی به XML-RPC توسط گروه های جدا شده توسط ویرگول ویا اعضای داده شده در اینجا. این مکان را خالی بگزارید تا به همه دسترسی داده شود.';
+$lang['remote'] = 'سیستم API راه دور را فعال کنید . این به سایر کاربردها اجازه می دهد که به ویکی از طریق XML-RPC یا سایر مکانیزم ها دسترسی داشته باشند.';
+$lang['remoteuser'] = 'محدود کردن دسترسی API راه دور به گروه های جدا شده با ویرگول یا کاربران داده شده در این جا. برای دادن دسترسی به همه این فیلد را خالی بگذارید.';
+$lang['usewordblock'] = 'اسپم‌ها را براساس لیست کلمات مسدود کن';
+$lang['relnofollow'] = 'از «rel=nofollow» در پیوندهای خروجی استفاده شود';
+$lang['indexdelay'] = 'مقدار تاخیر پیش از فهرست‌بندی (ثانیه)';
+$lang['mailguard'] = 'مبهم کردن آدرس‌های ایمیل';
+$lang['iexssprotect'] = 'بررسی کردن فایل‌های ارسال شده را برای کدهای HTML یا JavaScript مخرب';
+$lang['usedraft'] = 'ایجاد خودکار چرک‌نویس در زمان نگارش';
+$lang['htmlok'] = 'امکان افزودن HTML باشد';
+$lang['phpok'] = 'امکان افزودن PHP باشد';
+$lang['locktime'] = 'بیشینه‌ی زمان قفل شدن فایل‌ها به ثانیه';
+$lang['cachetime'] = 'بیشینه‌ی زمان حافظه‌ی موقت (cache) به ثانیه';
+$lang['target____wiki'] = 'پنجره‌ی هدف در پیوند‌های داخلی';
+$lang['target____interwiki'] = 'پنجره‌ی هدف در پیوند‌های داخل ویکی';
+$lang['target____extern'] = 'پنجره‌ی هدف در پیوند‌های خارجی';
+$lang['target____media'] = 'پنجره‌ی هدف در پیوند‌های رسانه‌ها';
+$lang['target____windows'] = 'پنجره‌ی هدف در پیوند‌های پنجره‌ای';
+$lang['mediarevisions'] = 'تجدید نظر رسانه ، فعال؟';
+$lang['refcheck'] = 'بررسی کردن مرجع رسانه‌ها';
+$lang['refshow'] = 'تعداد مراجعی که برای یک رسانه نمایش داده شود';
+$lang['gdlib'] = 'نگارش کتاب‌خانه‌ی GD';
+$lang['im_convert'] = 'مسیر ابزار convert از برنامه‌ی ImageMagick';
+$lang['jpg_quality'] = 'کیفیت فشرده سازی JPEG (از 0 تا 100)';
+$lang['fetchsize'] = 'بیشینه‌ی حجمی که فایل fetch.php می‌تواند دریافت کند (به بایت)';
+$lang['subscribers'] = 'توانایی عضویت در صفحات باشد';
+$lang['subscribe_time'] = 'زمان مورد نیاز برای ارسال خبر نامه ها (ثانیه); این مقدار می بایست کمتر زمانی باشد که در recent_days تعریف شده است.';
+$lang['notify'] = 'تغییرات به این ایمیل ارسال شود';
+$lang['registernotify'] = 'اطلاعات کاربران تازه وارد به این ایمیل ارسال شود';
+$lang['mailfrom'] = 'آدرس ایمیلی که برای ایمیل‌های خودکار استفاده می‌شود';
+$lang['mailprefix'] = 'پیشوند تیتر ایمیل (جهت ایمیل های خودکار)';
+$lang['htmlmail'] = 'فرستادن با ظاهر بهتر ، امّا با اندازه بیشتر در ایمیل های چند قسمتی HTML.
+برای استفاده از ایمیل متنی ، غیر فعال کنید.';
+$lang['sitemap'] = 'تولید کردن نقشه‌ی سایت توسط گوگل (روز)';
+$lang['rss_type'] = 'نوع خوراک';
+$lang['rss_linkto'] = 'خوراک به کجا لینک شود';
+$lang['rss_content'] = 'چه چیزی در تکه‌های خوراک نمایش داده شود؟';
+$lang['rss_update'] = 'زمان به روز رسانی خوراک به ثانیه';
+$lang['rss_show_summary'] = 'خوراک مختصری از مطلب را در عنوان نمایش دهد';
+$lang['rss_media'] = 'چه نوع تغییراتی باید در خوراک XML لیست شود؟';
$lang['updatecheck'] = 'هشدارهای به روز رسانی و امنیتی بررسی شود؟ برای این‌کار DokuWiki با سرور update.dokuwiki.org تماس خواهد گرفت.';
$lang['userewrite'] = 'از زیباکننده‌ی آدرس‌ها استفاده شود';
$lang['useslash'] = 'از اسلش «/» برای جداکننده‌ی آدرس فضای‌نام‌ها استفاده شود';
-$lang['usedraft'] = 'ایجاد خودکار چرک‌نویس در زمان نگارش';
$lang['sepchar'] = 'کلمه‌ی جداکننده‌ی نام صفحات';
$lang['canonical'] = 'استفاده از آدرس‌های استاندارد';
$lang['fnencode'] = 'روش تغییر نام فایل‌هایی با فرمتی غیر از اسکی';
$lang['autoplural'] = 'بررسی جمع بودن در پیوندها';
$lang['compression'] = 'روش فشرده‌سازی برای فایل‌های خُرد';
-$lang['cachetime'] = 'بیشینه‌ی زمان حافظه‌ی موقت (cache) به ثانیه';
-$lang['locktime'] = 'بیشینه‌ی زمان قفل شدن فایل‌ها به ثانیه';
-$lang['fetchsize'] = 'بیشینه‌ی حجمی که فایل fetch.php می‌تواند دریافت کند (به بایت)';
-$lang['notify'] = 'تغییرات به این ایمیل ارسال شود';
-$lang['registernotify'] = 'اطلاعات کاربران تازه وارد به این ایمیل ارسال شود';
-$lang['mailfrom'] = 'آدرس ایمیلی که برای ایمیل‌های خودکار استفاده می‌شود';
-$lang['mailprefix'] = 'پیشوند تیتر ایمیل (جهت ایمیل های خودکار)';
$lang['gzip_output'] = 'استفاده از gzip برای xhtmlها';
-$lang['gdlib'] = 'نگارش کتاب‌خانه‌ی GD';
-$lang['im_convert'] = 'مسیر ابزار convert از برنامه‌ی ImageMagick';
-$lang['jpg_quality'] = 'کیفیت فشرده سازی JPEG (از 0 تا 100)';
-$lang['subscribers'] = 'توانایی عضویت در صفحات باشد';
-$lang['subscribe_time'] = 'زمان مورد نیاز برای ارسال خبر نامه ها (ثانیه); این مقدار می بایست کمتر زمانی باشد که در recent_days تعریف شده است.';
$lang['compress'] = 'فشرده‌سازی کد‌های CSS و JavaScript';
-$lang['hidepages'] = 'مخفی کردن صفحات با فرمت زیر (از عبارات منظم استفاده شود)';
+$lang['cssdatauri'] = 'اندازه بایت هایی که تصاویر ارجاع شده به فایل های CSS باید به درستی درون stylesheet جایگذاری شود تا سربار سرایند درخواست HTTP را کاهش دهد. این روش در IE 7 و پایین تر کار نمی کند! مقادیر <code>400</code> تا <code>600</code> بایت مقدار خوبی است. برای غیر فعال کردن <code>0</code> قرار دهید.';
$lang['send404'] = 'ارسال «HTTP 404/Page Not Found» برای صفحاتی که وجود ندارند';
-$lang['sitemap'] = 'تولید کردن نقشه‌ی سایت توسط گوگل (روز)';
$lang['broken_iua'] = 'آیا تابع ignore_user_about در ویکی شما کار نمی‌کند؟ ممکن است فهرست جستجوی شما کار نکند. IIS به همراه PHP/CGI باعث خراب شدن این گزینه می‌شود. برای اطلاعات بیشتر <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">باگ ۸۵۲</a> را مشاهده کنید.';
$lang['xsendfile'] = 'استفاده از هدر X-Sendfile، تا به وب‌سرور توانایی ارسال فایل‌های ثابت را بدهد. وب‌سرور شما باید این مورد را پشتیبانی کند.';
$lang['renderer_xhtml'] = 'مفسری که برای خروجی اصلی ویکی استفاده شود';
$lang['renderer__core'] = '%s (هسته‌ی dokuwiki)';
$lang['renderer__plugin'] = '%s (افزونه)';
-$lang['rememberme'] = 'امکان ورود دایم، توسط کوکی، وجود داشته باشد (مرا به خاطر بسپار)';
-$lang['rss_type'] = 'نوع خوراک';
-$lang['rss_linkto'] = 'خوراک به کجا لینک شود';
-$lang['rss_content'] = 'چه چیزی در تکه‌های خوراک نمایش داده شود؟';
-$lang['rss_update'] = 'زمان به روز رسانی خوراک به ثانیه';
-$lang['recent_days'] = 'چند تغییر در خوراک نمایش داده شود به روز';
-$lang['rss_show_summary'] = 'خوراک مختصری از مطلب را در عنوان نمایش دهد';
-$lang['target____wiki'] = 'پنجره‌ی هدف در پیوند‌های داخلی';
-$lang['target____interwiki'] = 'پنجره‌ی هدف در پیوند‌های داخل ویکی';
-$lang['target____extern'] = 'پنجره‌ی هدف در پیوند‌های خارجی';
-$lang['target____media'] = 'پنجره‌ی هدف در پیوند‌های رسانه‌ها';
-$lang['target____windows'] = 'پنجره‌ی هدف در پیوند‌های پنجره‌ای';
+$lang['dnslookups'] = 'DokuWiki نام هاست ها را برای آدرسهای IP یِ صفحات ویرایشی کاربران ، جستجو می کند. اگر یک سرور DNS کند یا نا کارامد دارید یا این ویژگی را نمی خواهید ، این گزینه را غیر فعال کنید.';
$lang['proxy____host'] = 'آدرس سرور پروکسی';
$lang['proxy____port'] = 'پورت پروکسی';
$lang['proxy____user'] = 'نام کاربری پروکسی';
diff --git a/lib/plugins/config/lang/fi/lang.php b/lib/plugins/config/lang/fi/lang.php
index 9598a0d93..f3c57d10e 100644
--- a/lib/plugins/config/lang/fi/lang.php
+++ b/lib/plugins/config/lang/fi/lang.php
@@ -29,6 +29,7 @@ $lang['_anti_spam'] = 'Anti-Spam asetukset';
$lang['_editing'] = 'Sivumuokkauksen asetukset';
$lang['_links'] = 'Linkkien asetukset';
$lang['_media'] = 'Media-asetukset';
+$lang['_notifications'] = 'Ilmoitus-asetukset';
$lang['_advanced'] = 'Lisäasetukset';
$lang['_network'] = 'Verkkoasetukset';
$lang['_plugin_sufix'] = 'liitännäisen asetukset';
@@ -36,26 +37,29 @@ $lang['_template_sufix'] = 'Sivumallin asetukset';
$lang['_msg_setting_undefined'] = 'Ei asetusten metadataa.';
$lang['_msg_setting_no_class'] = 'Ei asetusluokkaa.';
$lang['_msg_setting_no_default'] = 'Ei oletusarvoa';
-$lang['fmode'] = 'Tiedoston luontioikeudet';
-$lang['dmode'] = 'Hakemiston luontioikeudet';
+$lang['title'] = 'Wikin nimi';
+$lang['start'] = 'Alkusivun nimi';
$lang['lang'] = 'Kieli';
+$lang['template'] = 'Sivumalli';
+$lang['tagline'] = 'Apuotsikko - slogan sivustonimen yhteysteen (jos template käyttää)';
+$lang['sidebar'] = 'Sivupalkin sivunimi (jos template tukee sitä), tyhjä arvo poistaa sivupalkin';
+$lang['license'] = 'Millä lisenssillä sisältö pitäisi julkaista?';
+$lang['savedir'] = 'Hakemisto tietojen tallennukseen.';
$lang['basedir'] = 'Perushakemisto';
$lang['baseurl'] = 'Perus URL';
-$lang['savedir'] = 'Hakemisto tietojen tallennukseen.';
$lang['cookiedir'] = 'Cookien path. Jätä tyhjäksi käyttääksesi baseurl arvoa';
-$lang['start'] = 'Alkusivun nimi';
-$lang['title'] = 'Wikin nimi';
-$lang['template'] = 'Sivumalli';
-$lang['license'] = 'Millä lisenssillä sisältö pitäisi julkaista?';
-$lang['fullpath'] = 'Näytä sivun koko polku sivun alareunassa';
+$lang['dmode'] = 'Hakemiston luontioikeudet';
+$lang['fmode'] = 'Tiedoston luontioikeudet';
+$lang['allowdebug'] = 'Salli debuggaus <b>pois, jos ei tarvita!</b>';
$lang['recent'] = 'Viime muutokset';
+$lang['recent_days'] = 'Montako edellistä muutosta säilytetään (päiviä)';
$lang['breadcrumbs'] = 'Leivänmurujen määrä';
$lang['youarehere'] = 'Hierarkkiset leivänmurut';
+$lang['fullpath'] = 'Näytä sivun koko polku sivun alareunassa';
$lang['typography'] = 'Tee typografiset korvaukset';
-$lang['htmlok'] = 'Salli upotettu HTML';
-$lang['phpok'] = 'Salli upotettu PHP';
$lang['dformat'] = 'Päivämäärän muoto (katso PHPn <a href="http://www.php.net/strftime">strftime</a> funktiota)';
$lang['signature'] = 'Allekirjoitus';
+$lang['showuseras'] = 'Mitä näytetään, kun kerrotaan viimeisen editoijan tiedot';
$lang['toptoclevel'] = 'Ylätason sisällysluettelo';
$lang['tocminheads'] = 'Pienin otsikkorivien määrä, jotta sisällysluettelo tehdään';
$lang['maxtoclevel'] = 'Sisällysluettelon suurin syvyys';
@@ -63,15 +67,8 @@ $lang['maxseclevel'] = 'Kappale-editoinnin suurin syvyys.';
$lang['camelcase'] = 'Käytä CamelCase linkkejä';
$lang['deaccent'] = 'Siivoa sivun nimet';
$lang['useheading'] = 'Käytä ensimmäistä otsikkoriviä sivun nimenä.';
-$lang['refcheck'] = 'Mediaviitteen tarkistus';
-$lang['refshow'] = 'Montako mediaviitettä näytetään';
-$lang['allowdebug'] = 'Salli debuggaus <b>pois, jos ei tarvita!</b>';
-$lang['usewordblock'] = 'Estä spam sanalistan avulla';
-$lang['indexdelay'] = 'Aikaraja indeksoinnille (sek)';
-$lang['relnofollow'] = 'Käytä rel="nofollow" ulkoisille linkeille';
-$lang['mailguard'] = 'Häivytä email osoite';
-$lang['iexssprotect'] = 'Tarkista lähetetyt tiedostot pahojen javascript- ja html-koodien varalta';
-$lang['showuseras'] = 'Mitä näytetään, kun kerrotaan viimeisen editoijan tiedot';
+$lang['sneaky_index'] = 'Oletuksena DokuWiki näyttää kaikki nimiavaruudet index-näkymäsä. Tämä asetus piilottaa ne, joihin käyttäjällä ei ole lukuoikeuksia. Tämä voi piilottaa joitakin sallittuja alinimiavaruuksia. Tästä johtuen index-näkymä voi olla käyttökelvoton joillakin ACL-asetuksilla';
+$lang['hidepages'] = 'Piilota seuraavat sivut (säännönmukainen lauseke)';
$lang['useacl'] = 'Käytä käyttöoikeuksien hallintaa';
$lang['autopasswd'] = 'Luo salasana automaattisesti';
$lang['authtype'] = 'Autentikointijärjestelmä';
@@ -80,61 +77,66 @@ $lang['defaultgroup'] = 'Oletusryhmä';
$lang['superuser'] = 'Pääkäyttäjä. Ryhmä tai käyttäjä, jolla on täysi oikeus kaikkiin sivuihin ja toimintoihin käyttöoikeuksista huolimatta';
$lang['manager'] = 'Ylläpitäjä. Ryhmä tai käyttäjä, jolla on pääsy joihinkin ylläpitotoimintoihin';
$lang['profileconfirm'] = 'Vahvista profiilin päivitys salasanan avulla';
+$lang['rememberme'] = 'Salli pysyvät kirjautumis-cookiet (muista minut)';
$lang['disableactions'] = 'Estä DokuWiki-toimintojen käyttö';
$lang['disableactions_check'] = 'Tarkista';
$lang['disableactions_subscription'] = 'Tilaa/Peruuta tilaus';
$lang['disableactions_wikicode'] = 'Näytä lähdekoodi/Vie raakana';
$lang['disableactions_other'] = 'Muut toiminnot (pilkulla erotettuna)';
-$lang['sneaky_index'] = 'Oletuksena DokuWiki näyttää kaikki nimiavaruudet index-näkymäsä. Tämä asetus piilottaa ne, joihin käyttäjällä ei ole lukuoikeuksia. Tämä voi piilottaa joitakin sallittuja alinimiavaruuksia. Tästä johtuen index-näkymä voi olla käyttökelvoton joillakin ACL-asetuksilla';
$lang['auth_security_timeout'] = 'Autentikoinnin aikakatkaisu (sekunteja)';
$lang['securecookie'] = 'Lähetetäänkö HTTPS:n kautta asetetut evästetiedot HTTPS-yhteydellä? Kytke pois, jos vain wikisi kirjautuminen on suojattu SSL:n avulla, mutta muuten wikiä käytetään ilman suojausta.';
-$lang['xmlrpc'] = 'Käytä/poista XML-RPC liityntää';
-$lang['xmlrpcuser'] = 'Estä XML-RPC:n käyttö pilkulla erotetun listan ryhmille tai käyttäjille. Jätä tyhjäksi salliaksesi käyttö kaikille.';
+$lang['usewordblock'] = 'Estä spam sanalistan avulla';
+$lang['relnofollow'] = 'Käytä rel="nofollow" ulkoisille linkeille';
+$lang['indexdelay'] = 'Aikaraja indeksoinnille (sek)';
+$lang['mailguard'] = 'Häivytä email osoite';
+$lang['iexssprotect'] = 'Tarkista lähetetyt tiedostot pahojen javascript- ja html-koodien varalta';
+$lang['usedraft'] = 'Tallenna vedos muokkaustilassa automaattisesti ';
+$lang['htmlok'] = 'Salli upotettu HTML';
+$lang['phpok'] = 'Salli upotettu PHP';
+$lang['locktime'] = 'Lukitustiedostojen maksimi-ikä (sek)';
+$lang['cachetime'] = 'Välimuisti-tiedostojen maksimi-ikä (sek)';
+$lang['target____wiki'] = 'Kohdeikkuna sisäisissä linkeissä';
+$lang['target____interwiki'] = 'Kohdeikkuna interwiki-linkeissä';
+$lang['target____extern'] = 'Kohdeikkuna ulkoisissa linkeissä';
+$lang['target____media'] = 'Kohdeikkuna media-linkeissä';
+$lang['target____windows'] = 'Kohdeikkuna Windows-linkeissä';
+$lang['mediarevisions'] = 'Otetaan käyttään Media-versiointi';
+$lang['refcheck'] = 'Mediaviitteen tarkistus';
+$lang['refshow'] = 'Montako mediaviitettä näytetään';
+$lang['gdlib'] = 'GD Lib versio';
+$lang['im_convert'] = 'ImageMagick-muunnostyökalun polku';
+$lang['jpg_quality'] = 'JPG pakkauslaatu (0-100)';
+$lang['fetchsize'] = 'Suurin koko (bytejä), jonka fetch.php voi ladata ulkopuolisesta lähteestä';
+$lang['subscribers'] = 'Salli tuki sivujen tilaamiselle';
+$lang['subscribe_time'] = 'Aika jonka jälkeen tilauslinkit ja yhteenveto lähetetään (sek). Tämän pitäisi olla pienempi, kuin recent_days aika.';
+$lang['notify'] = 'Lähetä muutosilmoitukset tähän osoitteeseen';
+$lang['registernotify'] = 'Lähetä ilmoitus uusista rekisteröitymisistä tähän osoitteeseen';
+$lang['mailfrom'] = 'Sähköpostiosoite automaattisia postituksia varten';
+$lang['mailprefix'] = 'Etuliite automaattisesti lähetettyihin dähköposteihin';
+$lang['sitemap'] = 'Luo Google sitemap (päiviä)';
+$lang['rss_type'] = 'XML-syötteen tyyppi';
+$lang['rss_linkto'] = 'XML-syöte kytkeytyy';
+$lang['rss_content'] = 'Mitä XML-syöte näyttää?';
+$lang['rss_update'] = 'XML-syötteen päivitystahti (sek)';
+$lang['rss_show_summary'] = 'XML-syöte näyttää yhteenvedon otsikossa';
$lang['updatecheck'] = 'Tarkista päivityksiä ja turvavaroituksia? Tätä varten DokuWikin pitää ottaa yhteys update.dokuwiki.orgiin.';
$lang['userewrite'] = 'Käytä siivottuja URLeja';
$lang['useslash'] = 'Käytä kauttaviivaa nimiavaruuksien erottimena URL-osoitteissa';
-$lang['usedraft'] = 'Tallenna vedos muokkaustilassa automaattisesti ';
$lang['sepchar'] = 'Sivunimen sanaerotin';
$lang['canonical'] = 'Käytä kanonisoituja URLeja';
$lang['fnencode'] = 'Muita kuin ASCII merkkejä sisältävien tiedostonimien koodaustapa.';
$lang['autoplural'] = 'Etsi monikkomuotoja linkeistä';
$lang['compression'] = 'Attic-tiedostojen pakkausmenetelmä';
-$lang['cachetime'] = 'Välimuisti-tiedostojen maksimi-ikä (sek)';
-$lang['locktime'] = 'Lukitustiedostojen maksimi-ikä (sek)';
-$lang['fetchsize'] = 'Suurin koko (bytejä), jonka fetch.php voi ladata ulkopuolisesta lähteestä';
-$lang['notify'] = 'Lähetä muutosilmoitukset tähän osoitteeseen';
-$lang['registernotify'] = 'Lähetä ilmoitus uusista rekisteröitymisistä tähän osoitteeseen';
-$lang['mailfrom'] = 'Sähköpostiosoite automaattisia postituksia varten';
-$lang['mailprefix'] = 'Etuliite automaattisesti lähetettyihin dähköposteihin';
$lang['gzip_output'] = 'Käytä gzip "Content-Encoding"-otsaketta xhtml-tiedostojen lähettämiseen';
-$lang['gdlib'] = 'GD Lib versio';
-$lang['im_convert'] = 'ImageMagick-muunnostyökalun polku';
-$lang['jpg_quality'] = 'JPG pakkauslaatu (0-100)';
-$lang['subscribers'] = 'Salli tuki sivujen tilaamiselle';
-$lang['subscribe_time'] = 'Aika jonka jälkeen tilauslinkit ja yhteenveto lähetetään (sek). Tämän pitäisi olla pienempi, kuin recent_days aika.';
$lang['compress'] = 'Pakkaa CSS ja javascript';
$lang['cssdatauri'] = 'Maksimikoko tavuina jossa kuvat joihin viitataan CSS-tiedostoista olisi sisällytettynä suoraan tyylitiedostoon jotta HTTP-kyselyjen kaistaa saataisiin kutistettua. Tämä tekniikka ei toimi IE versiossa aikasempi kuin 8! <code>400:sta</code> <code>600:aan</code> tavua on hyvä arvo. Aseta <code>0</code> kytkeäksesi ominaisuuden pois.';
-$lang['hidepages'] = 'Piilota seuraavat sivut (säännönmukainen lauseke)';
$lang['send404'] = 'Lähetä "HTTP 404/Page Not Found" puuttuvista sivuista';
-$lang['sitemap'] = 'Luo Google sitemap (päiviä)';
$lang['broken_iua'] = 'Onko "ignore_user_abort" toiminto rikki järjestelmässäsi? Tämä voi aiheuttaa toimimattoman index-näkymän.
IIS+PHP/CGI on tunnetusti rikki. Katso <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> lisätietoja varten.';
$lang['xsendfile'] = 'Käytä X-Sendfile otsikkoa, kun web-palvelin lähettää staattisia tiedostoja? Palvelimesi pitää tukea tätä.';
$lang['renderer_xhtml'] = 'Renderöinti, jota käytetään wikin pääasialliseen (xhtml) tulostukseen';
$lang['renderer__core'] = '%s (dokuwiki core)';
$lang['renderer__plugin'] = '%s (liitännäinen)';
-$lang['rememberme'] = 'Salli pysyvät kirjautumis-cookiet (muista minut)';
-$lang['rss_type'] = 'XML-syötteen tyyppi';
-$lang['rss_linkto'] = 'XML-syöte kytkeytyy';
-$lang['rss_content'] = 'Mitä XML-syöte näyttää?';
-$lang['rss_update'] = 'XML-syötteen päivitystahti (sek)';
-$lang['recent_days'] = 'Montako edellistä muutosta säilytetään (päiviä)';
-$lang['rss_show_summary'] = 'XML-syöte näyttää yhteenvedon otsikossa';
-$lang['target____wiki'] = 'Kohdeikkuna sisäisissä linkeissä';
-$lang['target____interwiki'] = 'Kohdeikkuna interwiki-linkeissä';
-$lang['target____extern'] = 'Kohdeikkuna ulkoisissa linkeissä';
-$lang['target____media'] = 'Kohdeikkuna media-linkeissä';
-$lang['target____windows'] = 'Kohdeikkuna Windows-linkeissä';
$lang['proxy____host'] = 'Proxy-palvelimen nimi';
$lang['proxy____port'] = 'Proxy portti';
$lang['proxy____user'] = 'Proxy käyttäjän nimi';
diff --git a/lib/plugins/config/lang/fr/lang.php b/lib/plugins/config/lang/fr/lang.php
index 8dcd21032..af2217af5 100644
--- a/lib/plugins/config/lang/fr/lang.php
+++ b/lib/plugins/config/lang/fr/lang.php
@@ -17,6 +17,8 @@
* @author Johan Guilbaud <guilbaud.johan@gmail.com>
* @author schplurtz@laposte.net
* @author skimpax@gmail.com
+ * @author Yannick Aure <yannick.aure@gmail.com>
+ * @author Olivier DUVAL <zorky00@gmail.com>
*/
$lang['menu'] = 'Paramètres de configuration';
$lang['error'] = 'Paramètres non modifiés en raison d\'une valeur non valide, vérifiez vos réglages et réessayez. <br />Les valeurs erronées sont entourées d\'une bordure rouge.';
@@ -38,6 +40,8 @@ $lang['_anti_spam'] = 'Paramètres anti-spam';
$lang['_editing'] = 'Paramètres d\'édition';
$lang['_links'] = 'Paramètres des liens';
$lang['_media'] = 'Paramètres média';
+$lang['_notifications'] = 'Paramètres de Notification';
+$lang['_syndication'] = 'Paramètres de Syndication';
$lang['_advanced'] = 'Paramètres avancés';
$lang['_network'] = 'Paramètres réseaux';
$lang['_plugin_sufix'] = 'Paramètres de module';
@@ -45,26 +49,27 @@ $lang['_template_sufix'] = 'Paramètres de modèle';
$lang['_msg_setting_undefined'] = 'Pas de métadonnée de paramètres.';
$lang['_msg_setting_no_class'] = 'Pas de classe de paramètres.';
$lang['_msg_setting_no_default'] = 'Pas de valeur par défaut.';
-$lang['fmode'] = 'Mode de création des fichiers';
-$lang['dmode'] = 'Mode de création des répertoires';
+$lang['title'] = 'Titre du wiki';
+$lang['start'] = 'Nom de la page d\'accueil';
$lang['lang'] = 'Langue';
+$lang['template'] = 'Modèle';
+$lang['license'] = 'Sous quelle licence doit être placé le contenu ?';
+$lang['savedir'] = 'Répertoire de stockage';
$lang['basedir'] = 'Répertoire de base (ex. : <code>/dokuwiki/</code>). Laisser vide pour une détection automatique.';
$lang['baseurl'] = 'URL de base. Laisser vide pour une détection automatique.';
-$lang['savedir'] = 'Répertoire de stockage';
$lang['cookiedir'] = 'Chemin des cookies. Laissez vide pour utiliser l\'URL de base.';
-$lang['start'] = 'Nom de la page d\'accueil';
-$lang['title'] = 'Titre du wiki';
-$lang['template'] = 'Modèle';
-$lang['license'] = 'Sous quelle licence doit être placé le contenu ?';
-$lang['fullpath'] = 'Utiliser le chemin complet dans le pied de page';
+$lang['dmode'] = 'Mode de création des répertoires';
+$lang['fmode'] = 'Mode de création des fichiers';
+$lang['allowdebug'] = 'Debug (<strong>Ne l\'activez que si vous en avez besoin !</strong>)';
$lang['recent'] = 'Nombre de derniers changements à afficher';
+$lang['recent_days'] = 'Signaler les pages modifiées depuis (en jours)';
$lang['breadcrumbs'] = 'Nombre de traces à afficher';
$lang['youarehere'] = 'Traces hiérarchiques';
+$lang['fullpath'] = 'Utiliser le chemin complet dans le pied de page';
$lang['typography'] = 'Effectuer des améliorations typographiques';
-$lang['htmlok'] = 'Permettre HTML dans les pages';
-$lang['phpok'] = 'Permettre PHP dans les pages';
$lang['dformat'] = 'Format de date (cf. fonction <a href="http://fr.php.net/strftime">strftime</a> de PHP)';
$lang['signature'] = 'Signature';
+$lang['showuseras'] = 'Qu\'afficher en montrant les utilisateurs qui ont récemment modifié la page';
$lang['toptoclevel'] = 'Niveau le plus haut à afficher dans la table des matières';
$lang['tocminheads'] = 'Nombre minimum de titres pour qu\'une table des matières soit construite';
$lang['maxtoclevel'] = 'Niveau maximum pour figurer dans la table des matières';
@@ -72,16 +77,8 @@ $lang['maxseclevel'] = 'Niveau maximum pour modifier des sections';
$lang['camelcase'] = 'Utiliser CamelCase pour les liens';
$lang['deaccent'] = 'Retirer les accents dans les noms de pages';
$lang['useheading'] = 'Utiliser le titre de premier niveau';
-$lang['refcheck'] = 'Vérifier les références de média';
-$lang['refshow'] = 'Nombre de références de média à montrer';
-$lang['allowdebug'] = 'Debug (<strong>Ne l\'activez que si vous en avez besoin !</strong>)';
-$lang['mediarevisions'] = 'Activer les révisions (gestion de versions) des médias';
-$lang['usewordblock'] = 'Bloquer le spam selon les mots utilisés';
-$lang['indexdelay'] = 'Délai avant l\'indexation (en secondes)';
-$lang['relnofollow'] = 'Utiliser rel="nofollow" sur les liens extérieurs';
-$lang['mailguard'] = 'Brouiller les adresses de courriel';
-$lang['iexssprotect'] = 'Vérifier la présence de code JavaScript ou HTML malveillant dans les fichiers envoyés';
-$lang['showuseras'] = 'Qu\'afficher en montrant les utilisateurs qui ont récemment modifié la page';
+$lang['sneaky_index'] = 'Par défaut, DokuWiki affichera toutes les catégories dans la vue par index. Activer cette option permet de cacher celles pour lesquelles l\'utilisateur n\'a pas la permission de lecture. Il peut en résulter le masquage de sous-catégories accessibles. Ceci peut rendre l\'index inutilisable avec certaines ACL.';
+$lang['hidepages'] = 'Cacher les pages correspondant à (expression régulière)';
$lang['useacl'] = 'Utiliser les listes de contrôle d\'accès (ACL)';
$lang['autopasswd'] = 'Auto-générer les mots de passe';
$lang['authtype'] = 'Mécanisme d\'authentification';
@@ -90,61 +87,69 @@ $lang['defaultgroup'] = 'Groupe par défaut';
$lang['superuser'] = 'Superuser - groupe, utilisateur ou liste séparée par des virgules user1,@group1,user2 ayant un accès complet à toutes les pages quelque soit le paramétrage des ACL';
$lang['manager'] = 'Manager - groupe, utilisateur ou liste séparée par des virgules user1,@group1,user2 ayant accès à certaines fonctions de gestion';
$lang['profileconfirm'] = 'Confirmer par mot de passe les modifications de profil';
+$lang['rememberme'] = 'Permettre de conserver de manière permanente les cookies de connexion (mémoriser)';
$lang['disableactions'] = 'Actions à désactiver dans DokuWiki';
$lang['disableactions_check'] = 'Vérifier';
$lang['disableactions_subscription'] = 'Abonnement aux pages';
$lang['disableactions_wikicode'] = 'Afficher le texte source';
$lang['disableactions_other'] = 'Autres actions (séparées par des virgules)';
-$lang['sneaky_index'] = 'Par défaut, DokuWiki affichera toutes les catégories dans la vue par index. Activer cette option permet de cacher celles pour lesquelles l\'utilisateur n\'a pas la permission de lecture. Il peut en résulter le masquage de sous-catégories accessibles. Ceci peut rendre l\'index inutilisable avec certaines ACL.';
$lang['auth_security_timeout'] = 'Délai d\'expiration de sécurité (secondes)';
$lang['securecookie'] = 'Les cookies mis via HTTPS doivent-ils n\'être envoyé par le navigateur que via HTTPS ? Ne désactivez cette option que si la connexion à votre wiki est sécurisée avec SSL mais que la navigation sur le wiki n\'est pas sécurisée.';
-$lang['xmlrpc'] = 'Activer l\'interface XML-RPC.';
-$lang['xmlrpcuser'] = 'Restreindre l\'accès à XML-RPC aux groupes et utilisateurs indiqués ici. Laisser vide afin que tout le monde y ait accès.';
+$lang['remote'] = 'Active l\'API système distante. Ceci autorise d\'autres applications à accéder au wiki via XML-RPC ou d\'autres mécanismes.';
+$lang['remoteuser'] = 'Restreindre l\'accès à l\'API par une liste de groupes ou d\'utilisateurs séparés par une virgule. Laisser vide pour donner l\'accès à n\'importe qui.';
+$lang['usewordblock'] = 'Bloquer le spam selon les mots utilisés';
+$lang['relnofollow'] = 'Utiliser rel="nofollow" sur les liens extérieurs';
+$lang['indexdelay'] = 'Délai avant l\'indexation (en secondes)';
+$lang['mailguard'] = 'Brouiller les adresses de courriel';
+$lang['iexssprotect'] = 'Vérifier la présence de code JavaScript ou HTML malveillant dans les fichiers envoyés';
+$lang['usedraft'] = 'Enregistrer automatiquement un brouillon pendant l\'édition';
+$lang['htmlok'] = 'Permettre HTML dans les pages';
+$lang['phpok'] = 'Permettre PHP dans les pages';
+$lang['locktime'] = 'Âge maximum des fichiers verrous (en secondes)';
+$lang['cachetime'] = 'Âge maximum d\'un fichier en cache (en secondes)';
+$lang['target____wiki'] = 'Cible pour liens internes';
+$lang['target____interwiki'] = 'Cible pour liens interwiki';
+$lang['target____extern'] = 'Cible pour liens externes';
+$lang['target____media'] = 'Cible pour liens média';
+$lang['target____windows'] = 'Cible pour liens vers partages Windows';
+$lang['mediarevisions'] = 'Activer les révisions (gestion de versions) des médias';
+$lang['refcheck'] = 'Vérifier les références de média';
+$lang['refshow'] = 'Nombre de références de média à montrer';
+$lang['gdlib'] = 'Version de GD Lib';
+$lang['im_convert'] = 'Chemin vers l\'outil de conversion d\'ImageMagick';
+$lang['jpg_quality'] = 'Qualité de la compression JPEG (0-100)';
+$lang['fetchsize'] = 'Taille maximale (en octets) du fichier que fetch.php peut télécharger';
+$lang['subscribers'] = 'Activer l\'abonnement aux pages';
+$lang['subscribe_time'] = 'Délai après lequel les listes d\'abonnement et résumés sont envoyés (en secondes). Devrait être plus petit que le délai précisé dans recent_days.';
+$lang['notify'] = 'Notifier les modifications à cette adresse de courriel';
+$lang['registernotify'] = 'Envoyer un courriel annonçant les nouveaux utilisateurs enregistrés à cette adresse';
+$lang['mailfrom'] = 'Expéditeur des notifications par courriel du wiki';
+$lang['mailprefix'] = 'Préfixe à utiliser dans les objets des courriels automatiques';
+$lang['sitemap'] = 'Fréquence de génération une carte Google du site (en jours)';
+$lang['rss_type'] = 'Type de flux RSS';
+$lang['rss_linkto'] = 'Lien du flux RSS vers';
+$lang['rss_content'] = 'Quel contenu afficher dans le flux RSS ?';
+$lang['rss_update'] = 'Fréquence de mise à jour du flux RSS (en secondes)';
+$lang['rss_show_summary'] = 'Le flux XML affiche le résumé dans le titre';
+$lang['rss_media'] = 'Quels types de changements devraient être listés dans le flux XML?';
$lang['updatecheck'] = 'Vérifier les mises à jour ? DokuWiki doit pouvoir contacter update.dokuwiki.org.';
$lang['userewrite'] = 'URL esthétiques';
$lang['useslash'] = 'Utiliser « / » comme séparateur de catégorie dans les URL';
-$lang['usedraft'] = 'Enregistrer automatiquement un brouillon pendant l\'édition';
$lang['sepchar'] = 'Séparateur de mots dans les noms de page';
$lang['canonical'] = 'Utiliser des URL canoniques';
$lang['fnencode'] = 'Méthode pour l\'encodage des fichiers non-ASCII';
$lang['autoplural'] = 'Rechercher les formes plurielles dans les liens';
$lang['compression'] = 'Méthode de compression pour les fichiers dans attic';
-$lang['cachetime'] = 'Âge maximum d\'un fichier en cache (en secondes)';
-$lang['locktime'] = 'Âge maximum des fichiers verrous (en secondes)';
-$lang['fetchsize'] = 'Taille maximale (en octets) du fichier que fetch.php peut télécharger';
-$lang['notify'] = 'Notifier les modifications à cette adresse de courriel';
-$lang['registernotify'] = 'Envoyer un courriel annonçant les nouveaux utilisateurs enregistrés à cette adresse';
-$lang['mailfrom'] = 'Expéditeur des notifications par courriel du wiki';
-$lang['mailprefix'] = 'Préfixe à utiliser dans les objets des courriels automatiques';
$lang['gzip_output'] = 'Utiliser Content-Encoding gzip pour XHTML';
-$lang['gdlib'] = 'Version de GD Lib';
-$lang['im_convert'] = 'Chemin vers l\'outil de conversion d\'ImageMagick';
-$lang['jpg_quality'] = 'Qualité de la compression JPEG (0-100)';
-$lang['subscribers'] = 'Activer l\'abonnement aux pages';
-$lang['subscribe_time'] = 'Délai après lequel les listes d\'abonnement et résumés sont envoyés (en secondes). Devrait être plus petit que le délai précisé dans recent_days.';
$lang['compress'] = 'Compresser CSS et JavaScript';
$lang['cssdatauri'] = 'Taille maximale en octets pour inclure dans les feuilles de styles CSS, les images qui y sont référencées. Cette technique minimise les requêtes HTTP. Pour IE, ceci ne fonctionne qu\'à partir de la version 8 ! Valeurs correctes entre <code>400</code> et <code>600</code>. <code>0</code> pour désactiver.';
-$lang['hidepages'] = 'Cacher les pages correspondant à (expression régulière)';
$lang['send404'] = 'Renvoyer "HTTP 404/Page Non Trouvée" pour les pages introuvables';
-$lang['sitemap'] = 'Fréquence de génération une carte Google du site (en jours)';
$lang['broken_iua'] = 'La fonction ignore_user_abort est-elle opérationnelle sur votre système ? Ceci peut empêcher le fonctionnement de l\'index de recherche. IIS+PHP/
CGI dysfonctionne. Voir le <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">bug 852</a> pour plus d\'info.';
$lang['xsendfile'] = 'Utiliser l\'en-tête X-Sendfile pour permettre au serveur Web de délivrer des fichiers statiques ? Votre serveur Web doit supporter cette fonctionnalité.';
$lang['renderer_xhtml'] = 'Moteur de rendu du format de sortie principal (XHTML)';
$lang['renderer__core'] = '%s (cœur de dokuwiki)';
$lang['renderer__plugin'] = '%s (module externe)';
-$lang['rememberme'] = 'Permettre de conserver de manière permanente les cookies de connexion (mémoriser)';
-$lang['rss_type'] = 'Type de flux RSS';
-$lang['rss_linkto'] = 'Lien du flux RSS vers';
-$lang['rss_content'] = 'Quel contenu afficher dans le flux RSS ?';
-$lang['rss_update'] = 'Fréquence de mise à jour du flux RSS (en secondes)';
-$lang['recent_days'] = 'Signaler les pages modifiées depuis (en jours)';
-$lang['rss_show_summary'] = 'Le flux XML affiche le résumé dans le titre';
-$lang['target____wiki'] = 'Cible pour liens internes';
-$lang['target____interwiki'] = 'Cible pour liens interwiki';
-$lang['target____extern'] = 'Cible pour liens externes';
-$lang['target____media'] = 'Cible pour liens média';
-$lang['target____windows'] = 'Cible pour liens vers partages Windows';
$lang['proxy____host'] = 'Proxy - Serveur hôte';
$lang['proxy____port'] = 'Proxy - Numéro de port';
$lang['proxy____user'] = 'Proxy - Identifiant';
diff --git a/lib/plugins/config/lang/gl/lang.php b/lib/plugins/config/lang/gl/lang.php
index 07d62b7af..97b7ecdc8 100644
--- a/lib/plugins/config/lang/gl/lang.php
+++ b/lib/plugins/config/lang/gl/lang.php
@@ -3,6 +3,7 @@
* Galicianlanguage file
*
* @author Medúlio <medulio@ciberirmandade.org>
+ * @author Oscar M. Lage <r0sk10@gmail.com>
*/
$lang['menu'] = 'Opcións de Configuración';
$lang['error'] = 'Configuración non actualizada debido a un valor inválido, por favor revisa os teus trocos e volta envialos de novo.
@@ -39,6 +40,7 @@ $lang['lang'] = 'Idioma';
$lang['basedir'] = 'Directorio base';
$lang['baseurl'] = 'URL base';
$lang['savedir'] = 'Directorio no que se gardarán os datos';
+$lang['cookiedir'] = 'Ruta das cookies. Deixar en blanco para usar a url de base.';
$lang['start'] = 'Nome da páxina inicial';
$lang['title'] = 'Título do Wiki';
$lang['template'] = 'Sobreplanta';
@@ -62,6 +64,7 @@ $lang['useheading'] = 'Utilizar a primeira cabeceira para os nomes de
$lang['refcheck'] = 'Comprobar a referencia media';
$lang['refshow'] = 'Número de referencias media a amosar';
$lang['allowdebug'] = 'Permitir o depurado <b>desactívao se non o precisas!</b>';
+$lang['mediarevisions'] = 'Habilitar revisións dos arquivos-media?';
$lang['usewordblock'] = 'Bloquear correo-lixo segundo unha lista de verbas';
$lang['indexdelay'] = 'Retardo denantes de indexar (seg)';
$lang['relnofollow'] = 'Utilizar rel="nofollow" nas ligazóns externas';
@@ -84,14 +87,13 @@ $lang['disableactions_other'] = 'Outras accións (separadas por comas)';
$lang['sneaky_index'] = 'O DokuWiki amosará por defecto todos os nomes de espazo na vista de índice. Se activas isto agocharanse aqueles onde o usuario non teña permisos de lectura.';
$lang['auth_security_timeout'] = 'Tempo Límite de Seguridade de Autenticación (segundos)';
$lang['securecookie'] = 'Deben enviarse só vía HTTPS polo navegador as cookies configuradas vía HTTPS? Desactiva esta opción cando só o inicio de sesión do teu wiki estea asegurado con SSL pero a navegación do mesmo se faga de xeito inseguro.';
-$lang['xmlrpc'] = 'Activar/Desactivar interface XML-RPC';
-$lang['xmlrpcuser'] = 'Restrinxir o acceso mediante XML-RPC á lista separada por comas dos grupos e/ou usuarios proporcionados aquí. Déixao baleiro para darlle acceso a todas as persoas.';
$lang['updatecheck'] = 'Comprobar se hai actualizacións e avisos de seguridade? O DokuWiki precisa contactar con update.dokuwiki.org para executar esta característica.';
$lang['userewrite'] = 'Utilizar URLs amigábeis';
$lang['useslash'] = 'Utilizar a barra inclinada (/) como separador de nome de espazo nos URLs';
$lang['usedraft'] = 'Gardar un borrador automaticamente no tempo da edición';
$lang['sepchar'] = 'Verba separadora do nome de páxina';
$lang['canonical'] = 'Utilizar URLs completamente canónicos';
+$lang['fnencode'] = 'Método para codificar os nomes de arquivo non-ASCII.';
$lang['autoplural'] = 'Comprobar formas plurais nas ligazóns';
$lang['compression'] = 'Método de compresión para arquivos attic';
$lang['cachetime'] = 'Tempo máximo para a caché (seg.)';
@@ -100,6 +102,7 @@ $lang['fetchsize'] = 'Tamaño máximo (en bytes) que pode descargar
$lang['notify'] = 'Enviar notificacións de trocos a este enderezo de correo-e';
$lang['registernotify'] = 'Enviar información de novos usuarios rexistrados a este enderezo de correo-e';
$lang['mailfrom'] = 'Enderezo de correo-e a usar para as mensaxes automáticas';
+$lang['mailprefix'] = 'Prefixo de asunto de correo-e para as mensaxes automáticas';
$lang['gzip_output'] = 'Utilizar Contido-Codificación gzip para o xhtml';
$lang['gdlib'] = 'Versión da Libraría GD';
$lang['im_convert'] = 'Ruta deica a ferramenta de conversión ImageMagick';
@@ -132,6 +135,7 @@ $lang['proxy____port'] = 'Porto do Proxy';
$lang['proxy____user'] = 'Nome de usuario do Proxy';
$lang['proxy____pass'] = 'Contrasinal do Proxy';
$lang['proxy____ssl'] = 'Utilizar ssl para conectar ao Proxy';
+$lang['proxy____except'] = 'Expresión regular para atopar URLs que deban ser omitidas polo Proxy.';
$lang['safemodehack'] = 'Activar hack de modo seguro (safemode)';
$lang['ftp____host'] = 'Servidor FTP para o hack de modo seguro (safemode)';
$lang['ftp____port'] = 'Porto FTP para o hack de modo seguro(safemode)';
@@ -179,3 +183,4 @@ $lang['useheading_o_0'] = 'Endexamais';
$lang['useheading_o_navigation'] = 'Só Navegación';
$lang['useheading_o_content'] = 'Só Contido do Wiki';
$lang['useheading_o_1'] = 'Sempre';
+$lang['readdircache'] = 'Edad máxima para o directorio de caché (seg)';
diff --git a/lib/plugins/config/lang/he/lang.php b/lib/plugins/config/lang/he/lang.php
index e80a1bd7a..b200082c9 100644
--- a/lib/plugins/config/lang/he/lang.php
+++ b/lib/plugins/config/lang/he/lang.php
@@ -82,7 +82,6 @@ $lang['disableactions_wikicode'] = 'הצגת המקור/יצוא גולמי';
$lang['disableactions_other'] = 'פעולות אחרות (מופרדות בפסיק)';
$lang['sneaky_index'] = 'כברירת מחדל, דוקוויקי יציג את כל מרחבי השמות בתצוגת תוכן הענינים. בחירה באפשרות זאת תסתיר את אלו שבהם למשתמש אין הרשאות קריאה. התוצאה עלולה להיות הסתרת תת מרחבי שמות אליהם יש למשתמש גישה. באופן זה תוכן הענינים עלול להפוך לחסר תועלת עם הגדרות ACL מסוימות';
$lang['auth_security_timeout'] = 'מגבלת אבטח פסק הזמן להזדהות (שניות)';
-$lang['xmlrpc'] = 'לאפשר.לחסום את מנשק XML-RPC';
$lang['updatecheck'] = 'בדיקת עידכוני אבטחה והתראות? על DokuWiki להתקשר אל update.dokuwiki.org לצורך כך.';
$lang['userewrite'] = 'השתמש בכתובות URL יפות';
$lang['useslash'] = 'השתמש בלוכסן להגדרת מרחבי שמות בכתובות';
diff --git a/lib/plugins/config/lang/hu/lang.php b/lib/plugins/config/lang/hu/lang.php
index f991b7c95..a1de94160 100644
--- a/lib/plugins/config/lang/hu/lang.php
+++ b/lib/plugins/config/lang/hu/lang.php
@@ -89,8 +89,6 @@ $lang['disableactions_other'] = 'Egyéb tevékenységek (vesszővel elválasztv
$lang['sneaky_index'] = 'Alapértelmezetten minden névtér látszik a DokuWiki áttekintő (index) oldalán. Ezen opció bekapcsolása után azok nem jelennek meg, melyekhez a felhasználónak nincs olvasás joga. De ezzel eltakarhatunk egyébként elérhető al-névtereket is, így bizonyos ACL beállításoknál használhatatlan indexet eredményez ez a beállítás.';
$lang['auth_security_timeout'] = 'Authentikációs biztonsági időablak (másodperc)';
$lang['securecookie'] = 'A böngészők a HTTPS felett beállított sütijüket csak HTTPS felett küldhetik? Kapcsoljuk ki ezt az opciót, ha csak a bejelentkezést védjük SSL-lel, a wiki tartalmának böngészése nyílt forgalommal történik.';
-$lang['xmlrpc'] = 'XML-RPC interfész engedélyezése/tiltása';
-$lang['xmlrpcuser'] = 'Korlátozza XML-RPC hozzáférést az itt megadott vesszővel elválasztott csoportok vagy felhasználók számára. Hagyja üresen, ha mindenki számára biztosítja a hozzáférést.';
$lang['updatecheck'] = 'Frissítések és biztonsági figyelmeztetések figyelése. Ehhez a DokuWikinek kapcsolatba kell lépnie a update.dokuwiki.org-gal.';
$lang['userewrite'] = 'Szép URL-ek használata';
$lang['useslash'] = 'Per-jel használata névtér-elválasztóként az URL-ekben';
diff --git a/lib/plugins/config/lang/ia/lang.php b/lib/plugins/config/lang/ia/lang.php
index 689869b89..fdb9d954e 100644
--- a/lib/plugins/config/lang/ia/lang.php
+++ b/lib/plugins/config/lang/ia/lang.php
@@ -83,8 +83,6 @@ $lang['disableactions_other'] = 'Altere actiones (separate per commas)';
$lang['sneaky_index'] = 'Normalmente, DokuWiki monstra tote le spatios de nomines in le vista del indice. Si iste option es active, illos ubi le usator non ha le permission de lectura essera celate. Isto pote resultar in le celamento de subspatios de nomines accessibile. Isto pote render le indice inusabile con certe configurationes de ACL.';
$lang['auth_security_timeout'] = 'Expiration pro securitate de authentication (secundas)';
$lang['securecookie'] = 'Debe le cookies definite via HTTPS solmente esser inviate via HTTPS per le navigator? Disactiva iste option si solmente le apertura de sessiones a tu wiki es protegite con SSL ma le navigation del wiki es facite sin securitate.';
-$lang['xmlrpc'] = 'Activar/disactivar interfacie XML-RPC.';
-$lang['xmlrpcuser'] = 'Limitar le accesso a XML-RPC al gruppos o usatores date hic, separate per commas. Lassa isto vacue pro dar accesso a omnes.';
$lang['updatecheck'] = 'Verificar si existe actualisationes e advertimentos de securitate? DokuWiki debe contactar update.dokuwiki.org pro exequer iste function.';
$lang['userewrite'] = 'Usar URLs nette';
$lang['useslash'] = 'Usar le barra oblique ("/") como separator de spatios de nomines in URLs';
diff --git a/lib/plugins/config/lang/id-ni/lang.php b/lib/plugins/config/lang/id-ni/lang.php
index edde733fb..7b7e14ce5 100644
--- a/lib/plugins/config/lang/id-ni/lang.php
+++ b/lib/plugins/config/lang/id-ni/lang.php
@@ -5,7 +5,6 @@
* @author Harefa <fidelis@harefa.com>
* @author Yustinus Waruwu <juswaruwu@gmail.com>
*/
-$lang['xmlrpc'] = 'Orifi/böi\'orifi XML-RPC interface.';
$lang['renderer_xhtml'] = 'Fake Renderer ba zito\'ölö (XHTML) Wiki-output.';
$lang['renderer__core'] = '%s (dokuwiki core)';
$lang['renderer__plugin'] = '%s (plugin)';
diff --git a/lib/plugins/config/lang/it/lang.php b/lib/plugins/config/lang/it/lang.php
index c4dd433ed..751e5ee95 100644
--- a/lib/plugins/config/lang/it/lang.php
+++ b/lib/plugins/config/lang/it/lang.php
@@ -13,6 +13,8 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
+ * @author snarchio@gmail.com
*/
$lang['menu'] = 'Configurazione Wiki';
$lang['error'] = 'Impostazioni non aggiornate a causa di un valore non corretto, controlla le modifiche apportate e salva di nuovo.
@@ -36,6 +38,7 @@ $lang['_anti_spam'] = 'Impostazioni Anti-Spam';
$lang['_editing'] = 'Impostazioni Modifica';
$lang['_links'] = 'Impostazioni Collegamenti';
$lang['_media'] = 'Impostazioni File';
+$lang['_notifications'] = 'Impostazioni di notifica';
$lang['_advanced'] = 'Impostazioni Avanzate';
$lang['_network'] = 'Impostazioni Rete';
$lang['_plugin_sufix'] = 'Impostazioni Plugin';
@@ -43,25 +46,29 @@ $lang['_template_sufix'] = 'Impostazioni Modello';
$lang['_msg_setting_undefined'] = 'Nessun metadato definito.';
$lang['_msg_setting_no_class'] = 'Nessuna classe definita.';
$lang['_msg_setting_no_default'] = 'Nessun valore predefinito.';
-$lang['fmode'] = 'Permessi per i nuovi file';
-$lang['dmode'] = 'Permessi per le nuove directory';
-$lang['lang'] = 'Lingua';
-$lang['basedir'] = 'Directory di base';
-$lang['baseurl'] = 'URL di base';
-$lang['savedir'] = 'Directory per il salvataggio dei dati';
-$lang['start'] = 'Nome della pagina iniziale';
$lang['title'] = 'Titolo del wiki';
+$lang['start'] = 'Nome della pagina iniziale';
+$lang['lang'] = 'Lingua';
$lang['template'] = 'Modello';
+$lang['tagline'] = 'Tagline (se il template lo supporta)';
+$lang['sidebar'] = 'Nome pagina in barra laterale (se il template lo supporta), il campo vuoto disabilita la barra laterale';
$lang['license'] = 'Sotto quale licenza vorresti rilasciare il tuo contenuto?';
-$lang['fullpath'] = 'Mostra il percorso completo delle pagine';
+$lang['savedir'] = 'Directory per il salvataggio dei dati';
+$lang['basedir'] = 'Directory di base';
+$lang['baseurl'] = 'URL di base';
+$lang['cookiedir'] = 'Percorso cookie. Lascia in bianco per usare baseurl.';
+$lang['dmode'] = 'Permessi per le nuove directory';
+$lang['fmode'] = 'Permessi per i nuovi file';
+$lang['allowdebug'] = 'Abilita il debug <b>(disabilitare se non serve!)</b>';
$lang['recent'] = 'Ultime modifiche';
+$lang['recent_days'] = 'Quante modifiche recenti tenere (giorni)';
$lang['breadcrumbs'] = 'Numero di breadcrumb';
$lang['youarehere'] = 'Breadcrumb gerarchici';
+$lang['fullpath'] = 'Mostra il percorso completo delle pagine';
$lang['typography'] = 'Abilita la sostituzione tipografica';
-$lang['htmlok'] = 'Consenti HTML incorporato';
-$lang['phpok'] = 'Consenti PHP incorporato';
$lang['dformat'] = 'Formato delle date (vedi la funzione <a href="http://www.php.net/strftime">strftime</a> di PHP)';
$lang['signature'] = 'Firma';
+$lang['showuseras'] = 'Cosa visualizzare quando si mostra l\'ultimo utente che ha modificato una pagina';
$lang['toptoclevel'] = 'Livello superiore per l\'indice';
$lang['tocminheads'] = 'Ammontare minimo di intestazioni che determinano la creazione del TOC';
$lang['maxtoclevel'] = 'Numero massimo di livelli per l\'indice';
@@ -69,15 +76,8 @@ $lang['maxseclevel'] = 'Livello massimo per le sezioni modificabili';
$lang['camelcase'] = 'Usa CamelCase per i collegamenti';
$lang['deaccent'] = 'Pulizia dei nomi di pagina';
$lang['useheading'] = 'Usa la prima intestazione come nome di pagina';
-$lang['refcheck'] = 'Controlla i riferimenti ai file';
-$lang['refshow'] = 'Numero di riferimenti da visualizzare';
-$lang['allowdebug'] = 'Abilita il debug <b>(disabilitare se non serve!)</b>';
-$lang['usewordblock'] = 'Blocca lo spam in base alla blacklist';
-$lang['indexdelay'] = 'Intervallo di tempo prima dell\'indicizzazione';
-$lang['relnofollow'] = 'Usa rel="nofollow" nei collegamenti esterni';
-$lang['mailguard'] = 'Oscuramento indirizzi email';
-$lang['iexssprotect'] = 'Controlla i file caricati in cerca di possibile codice JavaScript o HTML maligno.';
-$lang['showuseras'] = 'Cosa visualizzare quando si mostra l\'ultimo utente che ha modificato una pagina';
+$lang['sneaky_index'] = 'Normalmente, DokuWiki mostra tutte le categorie nella vista indice. Abilitando questa opzione, saranno nascoste quelle per cui l\'utente non ha il permesso in lettura. Questo potrebbe far sì che alcune sottocategorie accessibili siano nascoste. La pagina indice potrebbe quindi diventare inutilizzabile con alcune configurazioni dell\'ACL.';
+$lang['hidepages'] = 'Nascondi le pagine che soddisfano la condizione (inserire un\'espressione regolare)';
$lang['useacl'] = 'Usa lista di controllo accessi (ACL)';
$lang['autopasswd'] = 'Genera password in automatico';
$lang['authtype'] = 'Sistema di autenticazione';
@@ -86,59 +86,70 @@ $lang['defaultgroup'] = 'Gruppo predefinito';
$lang['superuser'] = 'Amministratore - gruppo, utente o elenco di utenti separati da virgole (user1,@group1,user2) con accesso completo a tutte le pagine e le funzioni che riguardano le impostazioni ACL';
$lang['manager'] = 'Gestore - gruppo, utente o elenco di utenti separati da virgole (user1,@group1,user2) con accesso a determinate funzioni di gestione';
$lang['profileconfirm'] = 'Richiedi la password per modifiche al profilo';
+$lang['rememberme'] = 'Permetti i cookies di accesso permanenti (ricordami)';
$lang['disableactions'] = 'Disabilita azioni DokuWiki';
$lang['disableactions_check'] = 'Controlla';
$lang['disableactions_subscription'] = 'Sottoscrivi/Rimuovi sottoscrizione';
$lang['disableactions_wikicode'] = 'Mostra sorgente/Esporta Raw';
$lang['disableactions_other'] = 'Altre azioni (separate da virgola)';
-$lang['sneaky_index'] = 'Normalmente, DokuWiki mostra tutte le categorie nella vista indice. Abilitando questa opzione, saranno nascoste quelle per cui l\'utente non ha il permesso in lettura. Questo potrebbe far sì che alcune sottocategorie accessibili siano nascoste. La pagina indice potrebbe quindi diventare inutilizzabile con alcune configurazioni dell\'ACL.';
$lang['auth_security_timeout'] = 'Tempo di sicurezza per l\'autenticazione (secondi)';
$lang['securecookie'] = 'Devono i cookies impostati tramite HTTPS essere inviati al browser solo tramite HTTPS? Disattiva questa opzione solo quando l\'accesso al tuo wiki viene effettuato con il protocollo SSL ma la navigazione del wiki non risulta sicura.';
-$lang['xmlrpc'] = 'Abilita/disabilita interfaccia XML-RPC.';
-$lang['xmlrpcuser'] = 'Limita l\'accesso XML-RPC ai gruppi o utenti indicati qui (separati da virgola). Lascia il campo vuoto per dare accesso a tutti.';
+$lang['remote'] = 'Abilita il sistema di API remoto. Questo permette ad altre applicazioni di accedere al wiki tramite XML-RPC o altri meccanismi.';
+$lang['remoteuser'] = 'Restringi l\'accesso dell\'aPI remota ai gruppi o utenti qui specificati separati da virgola. Lascia vuoto per dare accesso a chiunque.';
+$lang['usewordblock'] = 'Blocca lo spam in base alla blacklist';
+$lang['relnofollow'] = 'Usa rel="nofollow" nei collegamenti esterni';
+$lang['indexdelay'] = 'Intervallo di tempo prima dell\'indicizzazione';
+$lang['mailguard'] = 'Oscuramento indirizzi email';
+$lang['iexssprotect'] = 'Controlla i file caricati in cerca di possibile codice JavaScript o HTML maligno.';
+$lang['usedraft'] = 'Salva una bozza in automatico in fase di modifica';
+$lang['htmlok'] = 'Consenti HTML incorporato';
+$lang['phpok'] = 'Consenti PHP incorporato';
+$lang['locktime'] = 'Durata dei file di lock (sec)';
+$lang['cachetime'] = 'Durata della cache (sec)';
+$lang['target____wiki'] = 'Finestra di destinazione per i collegamenti interni';
+$lang['target____interwiki'] = 'Finestra di destinazione per i collegamenti interwiki';
+$lang['target____extern'] = 'Finestra di destinazione per i collegamenti esterni';
+$lang['target____media'] = 'Finestra di destinazione per i collegamenti ai file';
+$lang['target____windows'] = 'Finestra di destinazione per i collegamenti alle risorse condivise';
+$lang['mediarevisions'] = 'Abilita Mediarevisions?';
+$lang['refcheck'] = 'Controlla i riferimenti ai file';
+$lang['refshow'] = 'Numero di riferimenti da visualizzare';
+$lang['gdlib'] = 'Versione GD Lib ';
+$lang['im_convert'] = 'Percorso per il convertitore di ImageMagick';
+$lang['jpg_quality'] = 'Qualità di compressione JPG (0-100)';
+$lang['fetchsize'] = 'Dimensione massima (bytes) scaricabile da fetch.php da extern';
+$lang['subscribers'] = 'Abilita la sottoscrizione alle pagine';
+$lang['subscribe_time'] = 'Tempo dopo il quale le liste di sottoscrizione e i riassunti vengono inviati (sec); Dovrebbe essere inferiore al tempo specificato in recent_days.';
+$lang['notify'] = 'Invia notifiche sulle modifiche a questo indirizzo';
+$lang['registernotify'] = 'Invia informazioni sui nuovi utenti registrati a questo indirizzo email';
+$lang['mailfrom'] = 'Mittente per le mail automatiche';
+$lang['mailprefix'] = 'Prefisso da inserire nell\'oggetto delle mail automatiche';
+$lang['htmlmail'] = 'Invia email HTML multipart più gradevoli ma più ingombranti in dimensione. Disabilita per mail in puro testo.';
+$lang['sitemap'] = 'Genera una sitemap Google (giorni)';
+$lang['rss_type'] = 'Tipo di feed XML';
+$lang['rss_linkto'] = 'Collega i feed XML a';
+$lang['rss_content'] = 'Cosa mostrare negli elementi dei feed XML?';
+$lang['rss_update'] = 'Intervallo di aggiornamento dei feed XML (sec)';
+$lang['rss_show_summary'] = 'I feed XML riportano un sommario nel titolo';
+$lang['rss_media'] = 'Quale tipo di cambiamento dovrebbe essere elencato nel feed XML?';
$lang['updatecheck'] = 'Controllare aggiornamenti e avvisi di sicurezza? DokuWiki deve contattare update.dokuwiki.org per questa funzione.';
$lang['userewrite'] = 'Usa il rewrite delle URL';
$lang['useslash'] = 'Usa la barra rovescia (slash) come separatore nelle URL';
-$lang['usedraft'] = 'Salva una bozza in automatico in fase di modifica';
$lang['sepchar'] = 'Separatore di parole nei nomi di pagina';
$lang['canonical'] = 'Usa URL canoniche';
$lang['fnencode'] = 'Metodo per codificare i filenames non-ASCII.';
$lang['autoplural'] = 'Controlla il plurale nei collegamenti';
$lang['compression'] = 'Usa la compressione per i file dell\'archivio';
-$lang['cachetime'] = 'Durata della cache (sec)';
-$lang['locktime'] = 'Durata dei file di lock (sec)';
-$lang['fetchsize'] = 'Dimensione massima (bytes) scaricabile da fetch.php da extern';
-$lang['notify'] = 'Invia notifiche sulle modifiche a questo indirizzo';
-$lang['registernotify'] = 'Invia informazioni sui nuovi utenti registrati a questo indirizzo email';
-$lang['mailfrom'] = 'Mittente per le mail automatiche';
-$lang['mailprefix'] = 'Prefisso da inserire nell\'oggetto delle mail automatiche';
$lang['gzip_output'] = 'Usa il Content-Encoding gzip per xhtml';
-$lang['gdlib'] = 'Versione GD Lib ';
-$lang['im_convert'] = 'Percorso per il convertitore di ImageMagick';
-$lang['jpg_quality'] = 'Qualità di compressione JPG (0-100)';
-$lang['subscribers'] = 'Abilita la sottoscrizione alle pagine';
-$lang['subscribe_time'] = 'Tempo dopo il quale le liste di sottoscrizione e i riassunti vengono inviati (sec); Dovrebbe essere inferiore al tempo specificato in recent_days.';
$lang['compress'] = 'Comprimi i file CSS e javascript';
-$lang['hidepages'] = 'Nascondi le pagine che soddisfano la condizione (inserire un\'espressione regolare)';
+$lang['cssdatauri'] = 'Dimensione massima in byte di un\'immagine che può essere integrata nel CSS per ridurre l\'overhead delle richieste HTTP. Questa tecnica non funziona con IE7 e precedenti! Da <code>400</code> a <code>600</code> bytes è un buon valore. Impostare a <code>0</code> per disabilitare.';
$lang['send404'] = 'Invia "HTTP 404/Pagina non trovata" per le pagine inesistenti';
-$lang['sitemap'] = 'Genera una sitemap Google (giorni)';
$lang['broken_iua'] = 'La funzione ignore_user_abort non funziona sul tuo sistema? Questo potrebbe far sì che l\'indice di ricerca sia inutilizzabile. È noto che nella configurazione IIS+PHP/CGI non funziona. Vedi il<a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> per maggiori informazioni.';
$lang['xsendfile'] = 'Usare l\'header X-Sendfile per permettere al webserver di fornire file statici? Questa funzione deve essere supportata dal tuo webserver.';
$lang['renderer_xhtml'] = 'Renderer da usare per la visualizzazione del wiki (xhtml)';
$lang['renderer__core'] = '%s (dokuwiki)';
$lang['renderer__plugin'] = '%s (plugin)';
-$lang['rememberme'] = 'Permetti i cookies di accesso permanenti (ricordami)';
-$lang['rss_type'] = 'Tipo di feed XML';
-$lang['rss_linkto'] = 'Collega i feed XML a';
-$lang['rss_content'] = 'Cosa mostrare negli elementi dei feed XML?';
-$lang['rss_update'] = 'Intervallo di aggiornamento dei feed XML (sec)';
-$lang['recent_days'] = 'Quante modifiche recenti tenere (giorni)';
-$lang['rss_show_summary'] = 'I feed XML riportano un sommario nel titolo';
-$lang['target____wiki'] = 'Finestra di destinazione per i collegamenti interni';
-$lang['target____interwiki'] = 'Finestra di destinazione per i collegamenti interwiki';
-$lang['target____extern'] = 'Finestra di destinazione per i collegamenti esterni';
-$lang['target____media'] = 'Finestra di destinazione per i collegamenti ai file';
-$lang['target____windows'] = 'Finestra di destinazione per i collegamenti alle risorse condivise';
+$lang['dnslookups'] = 'Dokuwiki farà il lookup dei nomi host per ricavare l\'indirizzo IP remoto degli utenti che modificano le pagine. Se hai un DNS lento o non funzionante o se non vuoi questa funzione, disabilita l\'opzione';
$lang['proxy____host'] = 'Nome server proxy';
$lang['proxy____port'] = 'Porta proxy';
$lang['proxy____user'] = 'Nome utente proxy';
diff --git a/lib/plugins/config/lang/ja/lang.php b/lib/plugins/config/lang/ja/lang.php
index 500d44539..a89123f8c 100644
--- a/lib/plugins/config/lang/ja/lang.php
+++ b/lib/plugins/config/lang/ja/lang.php
@@ -8,6 +8,7 @@
* @author Ikuo Obataya <i.obataya@gmail.com>
* @author Daniel Dupriest <kououken@gmail.com>
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ * @author Taisuke Shimamoto <dentostar@gmail.com>
*/
$lang['menu'] = 'サイト設定';
$lang['error'] = '不正な値が存在するため、設定は更新されませんでした。入力値を確認してから、再度更新してください。
@@ -31,6 +32,8 @@ $lang['_anti_spam'] = 'スパム対策';
$lang['_editing'] = '編集';
$lang['_links'] = 'リンク';
$lang['_media'] = 'メディア';
+$lang['_notifications'] = '通知設定';
+$lang['_syndication'] = 'RSS配信設定';
$lang['_advanced'] = '高度な設定';
$lang['_network'] = 'ネットワーク';
$lang['_plugin_sufix'] = 'プラグイン設定';
@@ -38,26 +41,29 @@ $lang['_template_sufix'] = 'テンプレート設定';
$lang['_msg_setting_undefined'] = '設定のためのメタデータがありません。';
$lang['_msg_setting_no_class'] = '設定クラスがありません。';
$lang['_msg_setting_no_default'] = '初期値が設定されていません。';
-$lang['fmode'] = 'ファイル作成マスク';
-$lang['dmode'] = 'フォルダ作成マスク';
+$lang['title'] = 'WIKIタイトル';
+$lang['start'] = 'スタートページ名';
$lang['lang'] = '使用言語';
+$lang['template'] = 'テンプレート';
+$lang['tagline'] = 'キャッチフレーズ (テンプレートが対応していれば)';
+$lang['sidebar'] = 'サイドバー用ページ名 (テンプレートが対応していれば)。空欄でサイドバー無効。';
+$lang['license'] = '作成した内容をどのライセンスでリリースしますか?';
+$lang['savedir'] = '保存ディレクトリ';
$lang['basedir'] = 'サーバのパス (例: <code>/dokuwiki/</code>)。空欄にすると自動的に検出します。';
$lang['baseurl'] = 'サーバの URL (例: <code>http://www.yourserver.com</code>)。空欄にすると自動的に検出します。';
-$lang['savedir'] = '保存ディレクトリ';
$lang['cookiedir'] = 'Cookie のパス。空欄にすると baseurl を使用します。';
-$lang['start'] = 'スタートページ名';
-$lang['title'] = 'WIKIタイトル';
-$lang['template'] = 'テンプレート';
-$lang['license'] = '作成した内容をどのライセンスでリリースしますか?';
-$lang['fullpath'] = 'ページのフッターに絶対パスを表示';
+$lang['dmode'] = 'フォルダ作成マスク';
+$lang['fmode'] = 'ファイル作成マスク';
+$lang['allowdebug'] = 'デバッグモード(<b>必要で無いときは無効にしてください</b>)';
$lang['recent'] = '最近の変更表示数';
+$lang['recent_days'] = '最近の変更とする期間(日数)';
$lang['breadcrumbs'] = 'トレース(パンくず)表示数';
$lang['youarehere'] = '現在位置を表示';
+$lang['fullpath'] = 'ページのフッターに絶対パスを表示';
$lang['typography'] = 'タイポグラフィー変換';
-$lang['htmlok'] = 'HTML埋め込み';
-$lang['phpok'] = 'PHP埋め込み';
$lang['dformat'] = '日付フォーマット(PHPの<a href="http://www.php.net/strftime">strftime</a>関数を参照)';
$lang['signature'] = '署名';
+$lang['showuseras'] = '最終編集者の情報として表示する内容';
$lang['toptoclevel'] = '目次 トップレベル見出し';
$lang['tocminheads'] = '目次を生成するための最小見出し数';
$lang['maxtoclevel'] = '目次 表示限度見出し';
@@ -65,16 +71,8 @@ $lang['maxseclevel'] = '編集可能見出し';
$lang['camelcase'] = 'キャメルケースリンク';
$lang['deaccent'] = 'ページ名アクセント';
$lang['useheading'] = '最初の見出しをページ名とする';
-$lang['refcheck'] = 'メディア参照元チェック';
-$lang['refshow'] = 'メディア参照元表示数';
-$lang['allowdebug'] = 'デバッグモード(<b>必要で無いときは無効にしてください</b>)';
-$lang['mediarevisions'] = 'メディアファイルの履歴を有効にしますか?';
-$lang['usewordblock'] = '単語リストに基づくスパムブロック';
-$lang['indexdelay'] = 'インデックスを許可(何秒後)';
-$lang['relnofollow'] = 'rel="nofollow"を付加';
-$lang['mailguard'] = 'メールアドレス保護';
-$lang['iexssprotect'] = 'アップロードファイルに悪意のあるJavaScriptやHTMLが含まれていないかチェックする';
-$lang['showuseras'] = '最終編集者の情報として表示する内容';
+$lang['sneaky_index'] = 'デフォルトでは索引にすべての名前空間を表示しますが、この機能はユーザーに閲覧権限のない名前空間を非表示にします。ただし、閲覧が可能な副名前空間まで表示されなくなるため、ACLの設定が適正でない場合は索引機能が使えなくなる場合があります。';
+$lang['hidepages'] = '非公開ページ(Regex)';
$lang['useacl'] = 'アクセス管理を行う(ACL)';
$lang['autopasswd'] = 'パスワードの自動生成(ACL)';
$lang['authtype'] = '認証方法(ACL)';
@@ -83,60 +81,68 @@ $lang['defaultgroup'] = 'デフォルトグループ(ACL)';
$lang['superuser'] = 'スーパーユーザー(ACL)';
$lang['manager'] = 'マネージャー(特定の管理機能を使用可能なユーザーもしくはグループ)';
$lang['profileconfirm'] = 'プロフィール変更時に現在のパスワードを要求(ACL)';
+$lang['rememberme'] = 'ログイン用クッキーを永久に保持することを許可(ログインを保持)';
$lang['disableactions'] = 'DokuWiki の動作を無効にする';
$lang['disableactions_check'] = 'チェック';
$lang['disableactions_subscription'] = '登録 / 解除';
$lang['disableactions_wikicode'] = 'ソース閲覧 / 生データ出力';
$lang['disableactions_other'] = 'その他の動作(カンマ区切り)';
-$lang['sneaky_index'] = 'デフォルトでは索引にすべての名前空間を表示しますが、この機能はユーザーに閲覧権限のない名前空間を非表示にします。ただし、閲覧が可能な副名前空間まで表示されなくなるため、ACLの設定が適正でない場合は索引機能が使えなくなる場合があります。';
$lang['auth_security_timeout'] = '認証タイムアウト設定(秒)';
$lang['securecookie'] = 'クッキーをHTTPSにてセットする場合は、ブラウザよりHTTPS経由で送信された場合にみに制限しますか?ログインのみをSSLで行う場合は、この機能を無効にしてください。';
-$lang['xmlrpc'] = 'XML-RPCインターフェースを有効/無効にする';
-$lang['xmlrpcuser'] = 'XML-RPCアクセスを指定グループとユーザーに制限します(半角コンマ区切り)。 すべての人にアクセスを許可する場合は空のままにしてください。';
+$lang['remote'] = 'リモートAPIを有効化します。有効化するとXML-RPCまたは他の手段でwikiにアプリケーションがアクセスすることを許可します。';
+$lang['remoteuser'] = 'カンマ区切りで書かれたグループ名、またはユーザ名だけにリモートAPIへのアクセスを許可します。空白の場合は、すべてのユーザにアクセスを許可します。';
+$lang['usewordblock'] = '単語リストに基づくスパムブロック';
+$lang['relnofollow'] = 'rel="nofollow"を付加';
+$lang['indexdelay'] = 'インデックスを許可(何秒後)';
+$lang['mailguard'] = 'メールアドレス保護';
+$lang['iexssprotect'] = 'アップロードファイルに悪意のあるJavaScriptやHTMLが含まれていないかチェックする';
+$lang['usedraft'] = '編集中の自動保存(ドラフト)機能を使用';
+$lang['htmlok'] = 'HTML埋め込み';
+$lang['phpok'] = 'PHP埋め込み';
+$lang['locktime'] = 'ファイルロック期限(秒)';
+$lang['cachetime'] = 'キャッシュ保持時間(秒)';
+$lang['target____wiki'] = '内部リンクの表示先';
+$lang['target____interwiki'] = 'InterWikiリンクの表示先';
+$lang['target____extern'] = '外部リンクの表示先';
+$lang['target____media'] = 'メディアリンクの表示先';
+$lang['target____windows'] = 'Windowsリンクの表示先';
+$lang['mediarevisions'] = 'メディアファイルの履歴を有効にしますか?';
+$lang['refcheck'] = 'メディア参照元チェック';
+$lang['refshow'] = 'メディア参照元表示数';
+$lang['gdlib'] = 'GDlibバージョン';
+$lang['im_convert'] = 'ImageMagick変換ツールへのパス';
+$lang['jpg_quality'] = 'JPG圧縮品質(0-100)';
+$lang['fetchsize'] = '外部からのダウンロード最大サイズ';
+$lang['subscribers'] = '更新通知機能';
+$lang['subscribe_time'] = '購読リストと概要を送信する期間(秒)。「最近の変更とする期間」で指定した期間より小さくしてください。';
+$lang['notify'] = '変更を通知するメールアドレス';
+$lang['registernotify'] = '新規ユーザー登録を通知するメールアドレス';
+$lang['mailfrom'] = 'メール送信時の送信元アドレス';
+$lang['mailprefix'] = '自動メールの題名に使用する接頭語';
+$lang['sitemap'] = 'Googleサイトマップ作成頻度(日数)';
+$lang['rss_type'] = 'RSSフィード形式';
+$lang['rss_linkto'] = 'RSS内リンク先';
+$lang['rss_content'] = 'XMLフィードに何を表示させますか?';
+$lang['rss_update'] = 'RSSフィードの更新間隔(秒)';
+$lang['rss_show_summary'] = 'フィードのタイトルにサマリーを表示';
+$lang['rss_media'] = 'XMLフィードで、どんな種類の変更を記載するか';
$lang['updatecheck'] = 'DokuWikiの更新とセキュリティに関する情報をチェックしますか? この機能は update.dokuwiki.org への接続が必要です。';
$lang['userewrite'] = 'URLの書き換え';
$lang['useslash'] = 'URL上の名前空間の区切りにスラッシュを使用';
-$lang['usedraft'] = '編集中の自動保存(ドラフト)機能を使用';
$lang['sepchar'] = 'ページ名の単語区切り文字';
$lang['canonical'] = 'canonical URL(正準URL)を使用';
$lang['fnencode'] = '非アスキーファイル名のエンコーディング方法';
$lang['autoplural'] = '自動複数形処理';
$lang['compression'] = 'アーカイブファイルの圧縮方法';
-$lang['cachetime'] = 'キャッシュ保持時間(秒)';
-$lang['locktime'] = 'ファイルロック期限(秒)';
-$lang['fetchsize'] = '外部からのダウンロード最大サイズ';
-$lang['notify'] = '変更を通知するメールアドレス';
-$lang['registernotify'] = '新規ユーザー登録を通知するメールアドレス';
-$lang['mailfrom'] = 'メール送信時の送信元アドレス';
-$lang['mailprefix'] = '自動メールの題名に使用する接頭語';
$lang['gzip_output'] = 'xhtmlに対するコンテンツ圧縮(gzip)を使用';
-$lang['gdlib'] = 'GDlibバージョン';
-$lang['im_convert'] = 'ImageMagick変換ツールへのパス';
-$lang['jpg_quality'] = 'JPG圧縮品質(0-100)';
-$lang['subscribers'] = '更新通知機能';
-$lang['subscribe_time'] = '購読リストと概要を送信する期間(秒)。「最近の変更とする期間」で指定した期間より小さくしてください。';
$lang['compress'] = 'CSSとJavaScriptを圧縮';
$lang['cssdatauri'] = 'HTTP リクエスト数によるオーバーヘッドを減らすため、CSS ファイルから参照される画像ファイルのサイズがここで指定するバイト数以内の場合は CSS ファイル内に Data URI として埋め込みます。このテクニックは IE7 以下では動作しません! <code>400</code> から <code>600</code> バイトがちょうどよい値です。<code>0</code> を指定すると埋め込み処理は行われません。';
-$lang['hidepages'] = '非公開ページ(Regex)';
$lang['send404'] = '文書が存在しないページに"HTTP404/Page Not Found"を使用';
-$lang['sitemap'] = 'Googleサイトマップ作成頻度(日数)';
$lang['broken_iua'] = 'ignore_user_abort関数が破損している恐れがあります。そのため、検索インデックスが動作しない可能性があります。IIS+PHP/CGIの組み合わせで破損することが判明しています。詳しくは<a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a>を参照してください。';
$lang['xsendfile'] = 'ウェブサーバーが静的ファイルを生成するために X-Sendfile ヘッダーを使用しますか?なお、この機能をウェブサーバーがサポートしている必要があります。';
$lang['renderer_xhtml'] = 'Wikiの出力(xhtml)にレンダラーを使用する';
$lang['renderer__core'] = '%s (Dokuwikiコア)';
$lang['renderer__plugin'] = '%s (プラグイン)';
-$lang['rememberme'] = 'ログイン用クッキーを永久に保持することを許可(ログインを保持)';
-$lang['rss_type'] = 'RSSフィード形式';
-$lang['rss_linkto'] = 'RSS内リンク先';
-$lang['rss_content'] = 'XMLフィードに何を表示させますか?';
-$lang['rss_update'] = 'RSSフィードの更新間隔(秒)';
-$lang['recent_days'] = '最近の変更とする期間(日数)';
-$lang['rss_show_summary'] = 'フィードのタイトルにサマリーを表示';
-$lang['target____wiki'] = '内部リンクの表示先';
-$lang['target____interwiki'] = 'InterWikiリンクの表示先';
-$lang['target____extern'] = '外部リンクの表示先';
-$lang['target____media'] = 'メディアリンクの表示先';
-$lang['target____windows'] = 'Windowsリンクの表示先';
$lang['proxy____host'] = 'プロキシ - サーバー名';
$lang['proxy____port'] = 'プロキシ - ポート';
$lang['proxy____user'] = 'プロキシ - ユーザー名';
diff --git a/lib/plugins/config/lang/ko/intro.txt b/lib/plugins/config/lang/ko/intro.txt
index 22dd96ef6..f6b76ecfc 100644
--- a/lib/plugins/config/lang/ko/intro.txt
+++ b/lib/plugins/config/lang/ko/intro.txt
@@ -1,9 +1,7 @@
====== 환경 설정 관리 ======
-DokuWiki 설치할 때 설정들을 변경하기 위해 사용하는 페이지입니다. 각 설정에 대한 자세한 도움말이 필요하다면 [[doku>ko:config|설정 문서(번역)]]와 [[doku>config|설정 문서(영문)]]를 참조합니다.
-
-플러그인에 대한 자세한 정보가 필요하다면 [[doku>plugin:config|플러그인 설정]]페이지를 참조합니다. 붉은 배경색으로 보이는 설정들은 이 플러인에서 변경하지 못하도록 되어있습니다. 파란 배경색으로 보이는 설정들은 기본 설정값을 가지고 있습니다. 흰색 배경색으로 보이는 설정들은 특별한 설치를 위해 설정되어 있습니다. 파란색과 흰색 배경 설정들이 수정 가능합니다.
-
-이페이지를 끝내기 전에 **저장**버튼을 누르지 않으면 설정값들은 적용되지 않습니다.
+DokuWiki 설치할 때 설정을 변경하기 위해 사용하는 페이지입니다. 각 설정에 대한 자세한 도움말이 필요하다면 [[doku>ko:config|설정 문서 (한국어)]]와 [[doku>config|설정 문서 (영어)]]를 참고하세요.
+플러그인에 대한 자세한 정보가 필요하다면 [[doku>plugin:config|플러그인 설정]] 문서를 참고하세요. 빨간 배경색으로 보이는 설정은 이 플러그인에서 변경하지 못하도록 되어있습니다. 파란 배경색으로 보이는 설정은 기본 설정값을 가지고 있습니다. 하얀 배경색으로 보이는 설정은 특별한 설치를 위해 설정되어 있습니다. 파란색과 하얀색 배경으로 된 설정은 수정이 가능합니다.
+이 페이지를 끝내기 전에 **저장** 버튼을 누르지 않으면 설정값은 적용되지 않습니다.
diff --git a/lib/plugins/config/lang/ko/lang.php b/lib/plugins/config/lang/ko/lang.php
index 20cfcdcfe..5f90044e4 100644
--- a/lib/plugins/config/lang/ko/lang.php
+++ b/lib/plugins/config/lang/ko/lang.php
@@ -8,145 +8,157 @@
* @author Song Younghwan <purluno@gmail.com>
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
+ * @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['menu'] = '환경 설정';
-$lang['error'] = '잘못된 값때문에 설정들을 변경할 수 없습니다. 수정한 값들을 검사하고 확인을 누르기 바랍니다.
- <br />잘못된 값(들)은 붉은 선으로 둘러싸여 있습니다.';
+$lang['error'] = '잘못된 값 때문에 설정을 변경할 수 없습니다. 수정한 값을 검토하고 확인을 누르세요.
+<br />잘못된 값은 빨간 선으로 둘러싸여 있습니다.';
$lang['updated'] = '설정이 성공적으로 변경되었습니다.';
$lang['nochoice'] = '(다른 선택이 불가능합니다.)';
-$lang['locked'] = '환경 설정 파일을 수정할 수 없습니다. 의도된 행동이 아니라면,<br /> 파일이름과 권한이 맞는지 확인하기 바랍니다. ';
-$lang['danger'] = '위험 : 이 옵션을 잘못 수정하면 환경설정 메뉴를 사용할 수 없을 수도 있습니다.';
-$lang['warning'] = '경고 : 이 옵션을 잘못 수정하면 잘못 동작 할 수 있습니다.';
-$lang['security'] = '보안 경고 : 이 옵션은 보안에 위험이 있을 수 있습니다.';
+$lang['locked'] = '환경 설정 파일을 수정할 수 없습니다. 의도한 행동이 아니라면,<br />
+파일 이름과 권한이 맞는지 확인하기 바랍니다. ';
+$lang['danger'] = '위험: 이 옵션을 잘못 수정하면 환경설정 메뉴를 사용할 수 없을 수도 있습니다.';
+$lang['warning'] = '경고: 이 옵션을 잘못 수정하면 잘못 동작할 수 있습니다.';
+$lang['security'] = '보안 경고: 이 옵션은 보안에 위험이 있을 수 있습니다.';
$lang['_configuration_manager'] = '환경 설정 관리자';
$lang['_header_dokuwiki'] = 'DokuWiki 설정';
-$lang['_header_plugin'] = 'Plugin 설정';
-$lang['_header_template'] = 'Template 설정';
+$lang['_header_plugin'] = '플러그인 설정';
+$lang['_header_template'] = '템플릿 설정';
$lang['_header_undefined'] = '정의되지 않은 설정';
$lang['_basic'] = '기본 설정';
$lang['_display'] = '화면 표시 설정';
$lang['_authentication'] = '인증 설정';
-$lang['_anti_spam'] = '안티-스팸 설정';
+$lang['_anti_spam'] = '스팸 방지 설정';
$lang['_editing'] = '편집 설정';
$lang['_links'] = '링크 설정';
$lang['_media'] = '미디어 설정';
-$lang['_advanced'] = '진보된 설정';
+$lang['_notifications'] = '알림 설정';
+$lang['_syndication'] = '신디케이션 설정';
+$lang['_advanced'] = '고급 설정';
$lang['_network'] = '네트워크 설정';
-$lang['_plugin_sufix'] = 'Plugin 설정';
-$lang['_template_sufix'] = 'Template 설정';
-$lang['_msg_setting_undefined'] = '설정되지 않은 메타데이타.';
+$lang['_plugin_sufix'] = '플러그인 설정';
+$lang['_template_sufix'] = '템플릿 설정';
+$lang['_msg_setting_undefined'] = '설정되지 않은 메타데이터.';
$lang['_msg_setting_no_class'] = '설정되지 않은 클래스.';
$lang['_msg_setting_no_default'] = '기본값 없음.';
-$lang['fmode'] = '파일 생성 모드';
-$lang['dmode'] = '디렉토리 생성 모드';
-$lang['lang'] = '언어';
-$lang['basedir'] = '기본 디렉토리';
-$lang['baseurl'] = '기본 URL';
+$lang['title'] = '위키 제목 (위키 이름)';
+$lang['start'] = '각 이름공간에서 사용할 시작 문서 이름';
+$lang['lang'] = '인터페이스 언어';
+$lang['template'] = '템플릿 (위키 디자인)';
+$lang['tagline'] = '태그 라인 (템플릿이 지원할 때에 한함)';
+$lang['sidebar'] = '사이드바 문서 이름 (템플릿이 지원할 때에 한함). 비워두면 사이드바를 비활성화';
+$lang['license'] = '콘텐츠에 어떤 라이선스를 적용하겠습니까?';
$lang['savedir'] = '데이타 저장 디렉토리';
-$lang['start'] = '시작 페이지 이름';
-$lang['title'] = '위키 제목';
-$lang['template'] = '템플릿';
-$lang['license'] = '컨텐트에 어떤 라이센스 정책을 적용하시겠습니까?';
-$lang['fullpath'] = '페이지 하단에 전체 경로 보여주기';
-$lang['recent'] = '최근에 바뀐 것';
-$lang['breadcrumbs'] = '위치 추적 수';
-$lang['youarehere'] = '계층형 위치 추적';
+$lang['basedir'] = '서버 경로 (예를 들어 <code>/dokuwiki/</code>). 자동 감지를 하려면 비우세요.';
+$lang['baseurl'] = '서버 URL (예를 들어 <code>http://www.yourserver.com</code>). 자동 감지를 하려면 비우세요.';
+$lang['cookiedir'] = '쿠키 위치. 비워두면 기본 URL 위치로 지정됩니다.';
+$lang['dmode'] = '디렉토리 생성 모드';
+$lang['fmode'] = '파일 생성 모드';
+$lang['allowdebug'] = '디버그 허용 <b>필요하지 않으면 금지!</b>';
+$lang['recent'] = '최근 바뀐 문서당 항목 수';
+$lang['recent_days'] = '최근 바뀐 문서 기준 시간 (날짜)';
+$lang['breadcrumbs'] = '위치 "추적" 수. 0으로 설정하면 비활성화함.';
+$lang['youarehere'] = '계층형 위치 추적 (다음 위의 옵션을 비활성화하고 싶습니다)';
+$lang['fullpath'] = '문서 하단에 전체 경로 보여주기';
$lang['typography'] = '기호 대체';
-$lang['htmlok'] = 'HTML 내장 허용';
-$lang['phpok'] = 'PHP 내장 허용';
-$lang['dformat'] = '날짜 포맷 (PHP <a href="http://www.php.net/strftime">strftime</a> 기능) 참조';
-$lang['signature'] = '서명';
+$lang['dformat'] = '날짜 형식 (PHP <a href="http://www.php.net/strftime">strftime</a> 기능 참고)';
+$lang['signature'] = '편집기에서 서명 버튼을 누를 때 삽입할 내용';
+$lang['showuseras'] = '마지막에 문서를 수정한 사용자를 보여줄지 여부';
$lang['toptoclevel'] = '목차 최상위 항목';
-$lang['tocminheads'] = '목차 표시 여부를 결정할 최소한의 표제 항목의 수';
+$lang['tocminheads'] = '목차 표시 여부를 결정할 최소한의 문단 제목 항목의 수';
$lang['maxtoclevel'] = '목차 최대 단계';
-$lang['maxseclevel'] = '섹션 최대 편집 단계';
+$lang['maxseclevel'] = '문단 최대 편집 단계';
$lang['camelcase'] = '링크에 CamelCase 사용';
-$lang['deaccent'] = '악센트 없는 페이지 이름';
-$lang['useheading'] = '페이지 이름으로 첫 헤드라인 사용';
-$lang['refcheck'] = '미디어 참조 검사';
-$lang['refshow'] = '보여줄 미디어 참조 수';
-$lang['allowdebug'] = '디버그 허용 <b>필요하지 않으면 금지!</b>';
-$lang['usewordblock'] = '금지단어를 사용해 스팸 막기';
-$lang['indexdelay'] = '색인 연기 시간(초)';
-$lang['relnofollow'] = '외부 링크에 rel="nofollow" 사용';
-$lang['mailguard'] = '이메일 주소를 알아볼 수 없게';
-$lang['iexssprotect'] = '업로드 파일의 악성 Javascript, HTML 코드 가능성 여부를 검사';
-$lang['showuseras'] = '마지막으로 페이지를 수정한 사용자를 보여줄지 여부';
-$lang['useacl'] = '접근 제어 목록(ACL) 사용';
-$lang['autopasswd'] = '자동으로 만들어진 패스워드';
+$lang['deaccent'] = '문서 이름을 지우는 방법';
+$lang['useheading'] = '문서 이름으로 첫 문단 제목 사용';
+$lang['sneaky_index'] = '기본적으로 DokuWiki는 색인 목록에 모든 이름공간을 보여줍니다.
+이 옵션을 설정하면 사용자가 읽기 권한을 가지고 있지 않은 이름공간은 보여주지 않습니다. 접근 가능한 하위 이름공간을 보이지 않게 설정하면 자동으로 설정됩니다. 특정 ACL 설정은 색인 사용이 불가능하게 할 수도 있습니다.';
+$lang['hidepages'] = '사이트맵과 기타 자동 색인과 같은 찾기에서 정규 표현식과 일치하는 문서 숨기기';
+$lang['useacl'] = '접근 제어 목록 (ACL) 사용';
+$lang['autopasswd'] = '자동으로 만들어진 비밀번호';
$lang['authtype'] = '인증 백-엔드';
-$lang['passcrypt'] = '패스워드 암호화 방법';
-$lang['defaultgroup'] = '기본 그룹';
-$lang['superuser'] = '슈퍼 유저';
-$lang['manager'] = '관리자 - 관리 기능들을 사용할 수 있는 그룹이나 사용자';
-$lang['profileconfirm'] = '개인정보 변경시 암호 재확인';
-$lang['disableactions'] = 'DokuWiki Action 금지';
+$lang['passcrypt'] = '비밀번호 암호화 방법';
+$lang['defaultgroup'] = '기본 그룹, 모든 새 사용자는 이 그룹에 속합니다';
+$lang['superuser'] = '슈퍼 유저 - ACL 설정과 상관없이 모든 문서와 기능에 대한 전체 접근 권한을 가진 그룹이나 사용자. 사용자1,@그룹1,사용자2 쉼표로 구분한 목록';
+$lang['manager'] = '관리자 - 관리 기능을 사용할 수 있는 그룹이나 사용자. 사용자1,@그룹1,사용자2 쉼표로 구분한 목록';
+$lang['profileconfirm'] = '개인 정보를 바꿀 때 비밀번호 다시 확인';
+$lang['rememberme'] = '항상 로그인 정보 저장 허용 (기억하기)';
+$lang['disableactions'] = 'DokuWiki 활동 비활성화';
$lang['disableactions_check'] = '검사';
$lang['disableactions_subscription'] = '구독 신청/해지';
-$lang['disableactions_wikicode'] = '문서 소스 보기';
-$lang['disableactions_other'] = '다른 Action(comma로 구분)';
-$lang['sneaky_index'] = '기본적으로, DokuWiki는 색인 목록에 모든 네임스페이스들을 보여줍니다.
-이 옵션을 설정하면 사용자가 읽기 권한을 가지고 있지 않은 네임스페이스들은 보여주지 않습니다. 접근 가능한 하위 네임스페이스들 보이지않게 설정하면 자동으로 설정됩니다.
-특정 ACL 설정은 색인 사용이 불가능하게 할 수도 있습니다.';
-$lang['auth_security_timeout'] = '인증 보안 초과 시간(초)';
-$lang['securecookie'] = 'HTTPS로 보내진 쿠키는 HTTPS에만 적용 할까요? 위키의 로그인 페이지만 SSL로 암호화 하고 위키 페이지는 그렇지 않은경우 꺼야 합니다.';
-$lang['xmlrpc'] = 'XML-RPC 인터페이스 지원/무시';
-$lang['xmlrpcuser'] = '주어진 그룹이나 유저들에게만 XML-RPC접근을 허락하려면 컴마로 구분하여 적으세요. 비어두면 모두에게 허용됩니다.';
-$lang['updatecheck'] = '업데이트와 보안 문제를 검사(DokuWiki를 update.dokuwiki.org에 연결해야 합니다.)';
-$lang['userewrite'] = 'URL rewriting기능 사용';
-$lang['useslash'] = 'URL에서 네임스페이스 구분자로 슬래쉬 문자 사용';
+$lang['disableactions_wikicode'] = '내용 보기/원시 내보대기';
+$lang['disableactions_other'] = '다른 활동 (쉼표로 구분)';
+$lang['auth_security_timeout'] = '인증 보안 초과 시간 (초)';
+$lang['securecookie'] = 'HTTPS로 보내진 쿠키는 HTTPS에만 적용 할까요? 위키의 로그인 페이지만 SSL로 암호화하고 위키 문서는 그렇지 않은 경우 비활성화 합니다.';
+$lang['remote'] = '원격 API를 활성화 합니다. 이 항목을 허용하면 XML-RPC 및 기타 메카니즘을 통해 다른 어플리케이션으로 접근가능합니다.';
+$lang['remoteuser'] = '이 항목에 입력된 쉼표로 나눠진 그룹이나 사용자에게 원격 API 접근을 제한합니다. 빈칸으로 두면 모두에게 허용합니다.';
+$lang['usewordblock'] = '금지 단어를 사용해 스팸 막기';
+$lang['relnofollow'] = '외부 링크에 rel="nofollow" 사용';
+$lang['indexdelay'] = '색인 연기 시간 (초)';
+$lang['mailguard'] = '이메일 주소를 알아볼 수 없게 하기';
+$lang['iexssprotect'] = '올린 파일의 악성 자바스크립트, HTML 코드 가능성 여부를 검사';
$lang['usedraft'] = '편집하는 동안 자동으로 문서 초안 저장';
-$lang['sepchar'] = '페이지 이름 단어 구분자';
-$lang['canonical'] = '완전한 canonical URL 사용';
-$lang['fnencode'] = '아스키가 아닌 파일이름을 인코딩 하는 방법.';
-$lang['autoplural'] = '링크 연결시 plural폼 검사';
-$lang['compression'] = 'attic파일 압축 방법 선택';
-$lang['cachetime'] = '최대 캐쉬 생존 시간(초)';
-$lang['locktime'] = '쵀대 파일 잠금 시간(초)';
-$lang['fetchsize'] = 'fetch.php가 외부에서 다운로드할 수도 있는 최대 크기(바이트)';
-$lang['notify'] = '이메일 알람 기능';
-$lang['registernotify'] = '신규 등록자 알람 기능';
-$lang['mailfrom'] = '자동으로 보내지는 메일 발신자';
-$lang['mailprefix'] = '자동으로 보내지는 메일의 제목 말머리 내용';
-$lang['gzip_output'] = 'xhml 내용 gzip 압축 여부';
+$lang['htmlok'] = 'HTML 내장 허용';
+$lang['phpok'] = 'PHP 내장 허용';
+$lang['locktime'] = '최대 파일 잠금 시간(초)';
+$lang['cachetime'] = '최대 캐시 생존 시간 (초)';
+$lang['target____wiki'] = '내부 링크에 대한 타겟 창';
+$lang['target____interwiki'] = '인터위키 링크에 대한 타겟 창';
+$lang['target____extern'] = '외부 링크에 대한 타겟 창';
+$lang['target____media'] = '미디어 링크에 대한 타겟 창';
+$lang['target____windows'] = '창 링크에 대한 타겟 창';
+$lang['mediarevisions'] = '미디어 버전 관리를 사용하겠습니까?';
+$lang['refcheck'] = '미디어 파일을 삭제하기 전에 사용하고 있는지 검사';
+$lang['refshow'] = '위의 설정이 활성화되었을 때 보여줄 미디어 참고 수';
$lang['gdlib'] = 'GD 라이브러리 버전';
-$lang['im_convert'] = 'ImageMagick 위치';
+$lang['im_convert'] = 'ImageMagick 변환 도구 위치';
$lang['jpg_quality'] = 'JPG 압축 품질 (0-100)';
-$lang['subscribers'] = '페이지 갱신 알람 기능';
-$lang['subscribe_time'] = ' 구독 목록과 요약이 보내질 경과 시간 (초); 이 것은 recent_days에서 설정된 시간보다 작아야 합니다.';
-$lang['compress'] = '최적화된 CSS, javascript 출력';
-$lang['hidepages'] = '매칭된 페이지 숨기기(정규표현식)';
+$lang['fetchsize'] = 'fetch.php가 외부에서 다운로드할 수도 있는 최대 크기 (바이트)';
+$lang['subscribers'] = '사용자가 이메일로 문서 바뀜에 구독하도록 허용';
+$lang['subscribe_time'] = '구독 목록과 요약이 보내질 경과 시간 (초); 이 것은 recent_days에서 설정된 시간보다 작아야 합니다.';
+$lang['notify'] = '항상 이 이메일 주소로 바뀜 알림을 보냄';
+$lang['registernotify'] = '항상 새 사용자한테 이 이메일 주소로 정보를 보냄';
+$lang['mailfrom'] = '자동으로 보내지는 메일 발신자';
+$lang['mailprefix'] = '자동으로 보내지는 메일의 제목 말머리 내용. 비웠을 경우 위키 제목 사용';
+$lang['htmlmail'] = '용량은 조금 더 크지만 보기 좋은 HTML 태그가 포함된 메일을 발송합니다. 텍스트만의 메일을 보내고자하면 비활성화하세요.';
+$lang['sitemap'] = '구글 사이트맵 생성 (날짜). 0일 경우 비활성화';
+$lang['rss_type'] = 'XML 피드 타입';
+$lang['rss_linkto'] = 'XML 피드 링크 정보';
+$lang['rss_content'] = 'XML 피드 항목에 표시되는 내용은?';
+$lang['rss_update'] = 'XML 피드 업데이트 주기 (초)';
+$lang['rss_show_summary'] = 'XML 피드 제목에서 요약정보 보여주기';
+$lang['rss_media'] = '어떤 규격으로 XML 피드를 받아보시겠습니까?';
+$lang['updatecheck'] = '업데이트와 보안 문제를 검사할까요? 이 기능을 사용하려면 DokuWiki를 update.dokuwiki.org에 연결해야 합니다.';
+$lang['userewrite'] = '멋진 URL 사용';
+$lang['useslash'] = 'URL에서 이름 구분자로 슬래시 문자 사용';
+$lang['sepchar'] = '문서 이름 단어 구분자';
+$lang['canonical'] = '완전한 canonical URL 사용';
+$lang['fnencode'] = '아스키가 아닌 파일 이름을 인코딩 하는 방법.';
+$lang['autoplural'] = '링크 연결시 복수 양식 검사';
+$lang['compression'] = '첨부 파일 압축 방법 선택';
+$lang['gzip_output'] = 'xhml 내용 gzip 압축 사용';
+$lang['compress'] = '최적화된 CSS, 자바스크립트 출력';
+$lang['cssdatauri'] = '그림이 렌더링될 최대 용량 크기를 CSS에 규정해야 HTTP 요청 헤더 오버헤드 크기를 감소시킬 수 있습니다. 이 기술은 IE 7 이하에서는 작동하지 않습니다! <code>400</code>에서 <code>600</code> 정도면 좋은 효율을 가져옵니다. <code>0</code>로 지정할 경우 비활성화 됩니다.';
$lang['send404'] = '존재하지 않는 페이지에 대해 "HTTP 404/Page Not Found" 응답';
-$lang['sitemap'] = '구글 사이트맵 생성(날짜)';
$lang['broken_iua'] = '설치된 시스템에서 ignore_user_abort 기능에 문제가 있으면 색인이 정상적으로 동작하지 않습니다. 이 기능이 IIS+PHP/CGI에서 문제가 있는 것으로 알려졌습니다. 자세한 정보는 <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a>를 참고하기 바랍니다.';
$lang['xsendfile'] = '웹 서버 static 파일 전송 지원을 위해 X-Sendfile 헤더를 사용한다면 이 옵션을 사용합니다.
웹 서버가 이 기능을 지원해야 합니다.';
$lang['renderer_xhtml'] = '주 (xhtml) 위키 출력 처리기';
$lang['renderer__core'] = '%s (DokuWiki 내부 기능)';
-$lang['renderer__plugin'] = '%s (DokuWiki 플러그인)';
-$lang['rememberme'] = '로그인 정보 저장 허용';
-$lang['rss_type'] = 'XML feed 타잎';
-$lang['rss_linkto'] = 'XML feed 링크 정보';
-$lang['rss_content'] = 'XML feed 항목들에 표시되는 내용은?';
-$lang['rss_update'] = 'XML feed 갱신 주기(초)';
-$lang['recent_days'] = '최근 바뀐 페이지 기준 시간(날짜)';
-$lang['rss_show_summary'] = 'XML feed 제목에서 요약정보 보여주기';
-$lang['target____wiki'] = '내부 링크들에 대한 타겟 윈도우 ';
-$lang['target____interwiki'] = 'InterWiki 링크들에 대한 타겟 윈도우';
-$lang['target____extern'] = '외부 링크들에 대한 타겟 윈도우';
-$lang['target____media'] = '미디어 링크들에 대한 타겟 윈도우';
-$lang['target____windows'] = '윈도우 링크들에 대한 타겟 윈도우';
+$lang['renderer__plugin'] = '%s (플러그인)';
+$lang['dnslookups'] = '이 옵션을 활성화하면 도쿠위키가 문서를 수정하는 사용자의 호스트 네임과 원격 IP 주소를 확인합니다. 서버가 느리거나, DNS를 운영하지 않거나 이 기능을 원치 않으면 비활성화 시켜주세요.';
$lang['proxy____host'] = '프록시 서버 이름';
$lang['proxy____port'] = '프록시 서버 포트';
$lang['proxy____user'] = '프록시 사용자 이름';
-$lang['proxy____pass'] = '프록시 패스워드';
-$lang['proxy____ssl'] = '프록시 연결시 ssl사용';
-$lang['proxy____except'] = '프록시설정이 무시될 URL주소들의 RegEx형식표현';
+$lang['proxy____pass'] = '프록시 비밀번호';
+$lang['proxy____ssl'] = '프록시 연결시 SSL 사용';
+$lang['proxy____except'] = '프록시 설정이 무시될 URL주소의 정규 표현식';
$lang['safemodehack'] = 'safemode hack기능 사용';
$lang['ftp____host'] = 'safemode hack의 FTP 서버';
-$lang['ftp____port'] = 'safemode hack의 FTP port';
+$lang['ftp____port'] = 'safemode hack의 FTP 포트';
$lang['ftp____user'] = 'safemode hack의 FTP 사용자 이름';
-$lang['ftp____pass'] = 'safemode hack의 FTP 패스워드';
+$lang['ftp____pass'] = 'safemode hack의 FTP 비밀번호';
$lang['ftp____root'] = 'safemode hack의 FTP 루트 디렉토리';
$lang['license_o_'] = '선택하지 않음';
$lang['typography_o_0'] = '사용 안함';
@@ -167,13 +179,13 @@ $lang['rss_type_o_rss2'] = 'RSS 2.0';
$lang['rss_type_o_atom'] = 'Atom 0.3';
$lang['rss_type_o_atom1'] = 'Atom 1.0';
$lang['rss_content_o_abstract'] = '개요';
-$lang['rss_content_o_diff'] = '통합 차이점 목록';
-$lang['rss_content_o_htmldiff'] = '차이점 목록 (HTML 테이블)';
-$lang['rss_content_o_html'] = '내용 (HTML 페이지)';
-$lang['rss_linkto_o_diff'] = '차이점 보기';
-$lang['rss_linkto_o_page'] = '변경 페이지 보기';
-$lang['rss_linkto_o_rev'] = '변경 목록 보기';
-$lang['rss_linkto_o_current'] = '최근 페이지 보기';
+$lang['rss_content_o_diff'] = '통합 차이 목록';
+$lang['rss_content_o_htmldiff'] = 'HTML 차이 목록 형식';
+$lang['rss_content_o_html'] = '최대 HTML 페이지 내용';
+$lang['rss_linkto_o_diff'] = '차이 보기';
+$lang['rss_linkto_o_page'] = '바뀐 문서 보기';
+$lang['rss_linkto_o_rev'] = '바뀐 목록 보기';
+$lang['rss_linkto_o_current'] = '현재 문서 보기';
$lang['compression_o_0'] = '없음';
$lang['compression_o_gz'] = 'gzip';
$lang['compression_o_bz2'] = 'bz2';
@@ -183,10 +195,10 @@ $lang['xsendfile_o_2'] = '표준 X-Sendfile 헤더';
$lang['xsendfile_o_3'] = '비공개 Nginx X-Accel-Redirect 헤더';
$lang['showuseras_o_loginname'] = '로그인 이름';
$lang['showuseras_o_username'] = '사용자 이름';
-$lang['showuseras_o_email'] = '사용자 e-mail 주소(메일주소 보호 셋팅에 따라 안보일 수 있음)';
-$lang['showuseras_o_email_link'] = 'mailto: link로 표현될 사용자 e-mail 주소';
-$lang['useheading_o_0'] = '아니요';
-$lang['useheading_o_navigation'] = '네비게이션에만';
+$lang['showuseras_o_email'] = '사용자 이메일 주소 (메일 주소 보호 설정에 따라 안보일 수 있음)';
+$lang['showuseras_o_email_link'] = 'mailto: link로 표현될 사용자 이메일 주소';
+$lang['useheading_o_0'] = '아니오';
+$lang['useheading_o_navigation'] = '둘러보기에만';
$lang['useheading_o_content'] = '위키 내용에만';
$lang['useheading_o_1'] = '항상';
-$lang['readdircache'] = 'readdir 캐쉬를 위한 최대 시간 (초)';
+$lang['readdircache'] = 'readdir 캐시를 위한 최대 시간 (초)';
diff --git a/lib/plugins/config/lang/la/lang.php b/lib/plugins/config/lang/la/lang.php
index 07d92ae36..057e69974 100644
--- a/lib/plugins/config/lang/la/lang.php
+++ b/lib/plugins/config/lang/la/lang.php
@@ -82,8 +82,6 @@ $lang['disableactions_other'] = 'Aliae actiones (uirgulis diuisae)';
$lang['sneaky_index'] = 'Hic uicis omnia genera in indice inserit. Si ineptam hanc optionem facias, solum ea, quae Sodales uidere possunt, in indice erunt. Hoc suggreges et suggenera abscondere potest.';
$lang['auth_security_timeout'] = 'Confirmationis Tempus (secundis)';
$lang['securecookie'] = 'Formulae HTTPS mittine solum per HTTPS possunt? Ineptam hanc optio facias, si accessus uicis tutus est, sed interretis non.';
-$lang['xmlrpc'] = 'Aptam\Ineptam XML-RPC administrationem facere';
-$lang['xmlrpcuser'] = 'Accessus XML-RPC gregibus uel Sodalibus in hoc indice astringere. Nihil scribere ut omnes accessum habeant';
$lang['updatecheck'] = 'Nouationes et fiducias inspicerene? Hic uicis connectere update.dokuwiki.org debes.';
$lang['userewrite'] = 'VRL formosis uti';
$lang['useslash'] = 'Repagula in URL, ut genera diuidas, uti';
diff --git a/lib/plugins/config/lang/lv/lang.php b/lib/plugins/config/lang/lv/lang.php
index 2f5883269..f95697c46 100644
--- a/lib/plugins/config/lang/lv/lang.php
+++ b/lib/plugins/config/lang/lv/lang.php
@@ -84,8 +84,6 @@ $lang['disableactions_other'] = 'citas darbības (atdalīt ar komatiem)';
$lang['sneaky_index'] = 'Pēc noklusētā DokuWiki lapu sarakstā parāda visu nodaļu lapas. Ieslēdzot šo parametru, noslēps tās nodaļas, kuras apmeklētājam nav tiesības lasīt. Bet tad tiks arī paslēptas dziļākas, bet atļautas nodaļas. Atsevišķos pieejas tiesību konfigurācijas gadījumos lapu saraksts var nedarboties.';
$lang['auth_security_timeout'] = 'Autorizācijas drošības intervāls (sekundēs)';
$lang['securecookie'] = 'Vai pa HTTPS sūtāmās sīkdatnes sūtīt tikai pa HTTPS? Atslēdz šo iespēju, kad tikai pieteikšanās wiki sistēmā notiek pa SSL šifrētu savienojumu, bet skatīšana - pa nešifrētu.';
-$lang['xmlrpc'] = 'Ieslēgt/izslēgt XML-RPC interfeisu.';
-$lang['xmlrpcuser'] = 'Ierobežot XML-RPC piekļuvi norādītām lietotāju grupām vai lietotājiem (atdalīt ar komatiem!). Atstāt tukšu, lai piekļuve būtu visiem.';
$lang['updatecheck'] = 'Pārbaudīt, vai pieejami atjauninājumi un drošības brīdinājumi? Dokuwiki sazināsies ar update.dokuwiki.org';
$lang['userewrite'] = 'Ērti lasāmas adreses (URL)';
$lang['useslash'] = 'Lietot slīpiņu par URL atdalītāju';
diff --git a/lib/plugins/config/lang/mr/lang.php b/lib/plugins/config/lang/mr/lang.php
index 321e05546..4f33bfa7c 100644
--- a/lib/plugins/config/lang/mr/lang.php
+++ b/lib/plugins/config/lang/mr/lang.php
@@ -86,8 +86,6 @@ $lang['disableactions_other'] = 'इतर क्रिया ( स्वल्
$lang['sneaky_index'] = 'सूची दृश्यामधे डिफॉल्ट स्वरूपात डॉक्युविकी सगळे नेमस्पेस दाखवते. हा पर्याय चालू केल्यास सदस्याला वाचण्याची परवानगी नसलेले नेमस्पेस दिसणार नाहीत. यामुळे परवानगी असलेले उप - नेमस्पेस न दिसण्याची शक्यता आहे. यामुळे काही विशिष्ठ ACL सेटिंगसाठी सूची वापरता येण्यासारखी राहणार नाही.';
$lang['auth_security_timeout'] = 'अधिकृत करण्याच्या प्रक्रियेची कालमर्यादा';
$lang['securecookie'] = 'HTTPS वापरून सेट केलेले कूकीज ब्राउजरने HTTPS द्वाराच पाठवले पाहिजेत का? जर तुमच्या विकीचं फ़क्त लॉगिन पानच SSL वापरून सुरक्षित केलं असेल व पानांचं ब्राउजिंग असुरक्षित असेल तर हा पर्याय चालू करू नका.';
-$lang['xmlrpc'] = 'XML-RPC इंटरफेस चालू/बंद करा';
-$lang['xmlrpcuser'] = 'XML-RPC सुविधा फ़क्त इथे स्वल्पविरामाने अलग करून दिलेल्या गट किंवा वापरकर्त्याला उपलब्ध आहेत. सर्वाना ही सुविधा देण्यासाठी ही जागा रिकामी सोडा.';
$lang['updatecheck'] = 'अपडेट आणि सुरक्षिततेविशयी सूचनान्वर पाळत ठेऊ का? या सुविधेसाठी डॉक्युविकीला update.dokuwiki.org शी संपर्क साधावा लागेल.';
$lang['userewrite'] = 'छान छान URL वापर';
$lang['useslash'] = 'URL मधे नेमस्पेस अलग करण्यासाठी \'/\' चिह्न वापरा';
diff --git a/lib/plugins/config/lang/nl/lang.php b/lib/plugins/config/lang/nl/lang.php
index c98d05adb..85dc2c4c7 100644
--- a/lib/plugins/config/lang/nl/lang.php
+++ b/lib/plugins/config/lang/nl/lang.php
@@ -15,6 +15,7 @@
* @author Timon Van Overveldt <timonvo@gmail.com>
* @author Jeroen
* @author Ricardo Guijt <ricardoguijt@gmail.com>
+ * @author Gerrit <klapinklapin@gmail.com>
*/
$lang['menu'] = 'Configuratie-instellingen';
$lang['error'] = 'De instellingen zijn niet gewijzigd wegens een incorrecte waarde, kijk je wijzigingen na en sla dan opnieuw op.<br />Je kunt de incorrecte waarde(s) herkennen aan de rode rand.';
@@ -36,6 +37,8 @@ $lang['_anti_spam'] = 'Anti-spaminstellingen';
$lang['_editing'] = 'Pagina-wijzigingsinstellingen';
$lang['_links'] = 'Link-instellingen';
$lang['_media'] = 'Media-instellingen';
+$lang['_notifications'] = 'Meldingsinstellingen';
+$lang['_syndication'] = 'Syndication-instellingen';
$lang['_advanced'] = 'Geavanceerde instellingen';
$lang['_network'] = 'Netwerkinstellingen';
$lang['_plugin_sufix'] = 'Plugin-instellingen';
@@ -43,26 +46,29 @@ $lang['_template_sufix'] = 'Sjabloon-instellingen';
$lang['_msg_setting_undefined'] = 'Geen metadata voor deze instelling.';
$lang['_msg_setting_no_class'] = 'Geen class voor deze instelling.';
$lang['_msg_setting_no_default'] = 'Geen standaard waarde.';
-$lang['fmode'] = 'Bestandaanmaak-modus (file creation mode)';
-$lang['dmode'] = 'Directory-aanmaak-modus (directory creation mode)';
+$lang['title'] = 'Titel van de wiki';
+$lang['start'] = 'Naam startpagina';
$lang['lang'] = 'Taal';
+$lang['template'] = 'Sjabloon ofwel het design van de wiki.';
+$lang['tagline'] = 'Ondertitel (als het sjabloon dat ondersteunt)';
+$lang['sidebar'] = 'Zijbalk-paginanaam (als het sjabloon dat ondersteunt), leeg veld betekent geen zijbalk';
+$lang['license'] = 'Onder welke licentie zou je tekst moeten worden gepubliceerd?';
+$lang['savedir'] = 'Directory om data op te slaan';
$lang['basedir'] = 'Basisdirectory';
$lang['baseurl'] = 'Basis-URL';
-$lang['savedir'] = 'Directory om data op te slaan';
$lang['cookiedir'] = 'Cookie pad. Laat leeg om de basis URL te gebruiken.';
-$lang['start'] = 'Naam startpagina';
-$lang['title'] = 'Titel van de wiki';
-$lang['template'] = 'Sjabloon';
-$lang['license'] = 'Onder welke licentie zou je tekst moeten worden gepubliceerd?';
+$lang['dmode'] = 'Directory-aanmaak-modus (directory creation mode)';
+$lang['fmode'] = 'Bestandaanmaak-modus (file creation mode)';
+$lang['allowdebug'] = 'Debug toestaan <b>uitzetten indien niet noodzakelijk!</b>';
+$lang['recent'] = 'Het aantal regels in Recente wijzigingen';
+$lang['recent_days'] = 'Hoeveel recente wijzigingen bewaren (dagen)';
+$lang['breadcrumbs'] = 'Aantal broodkruimels. Zet dit op 0 om uit te schakelen.';
+$lang['youarehere'] = 'Gebruik hierarchische broodkruimels (waarschijnlijk wil je dan de optie hierboven uitschakelen)';
$lang['fullpath'] = 'Volledig pad van pagina\'s in de footer weergeven';
-$lang['recent'] = 'Recente wijzigingen';
-$lang['breadcrumbs'] = 'Aantal broodkruimels';
-$lang['youarehere'] = 'Hierarchische broodkruimels';
$lang['typography'] = 'Breng typografische wijzigingen aan';
-$lang['htmlok'] = 'Embedded HTML toestaan';
-$lang['phpok'] = 'Embedded PHP toestaan';
$lang['dformat'] = 'Datum formaat (zie de PHP <a href="http://www.php.net/strftime">strftime</a> functie)';
-$lang['signature'] = 'Ondertekening';
+$lang['signature'] = 'Tekst die ingevoegd wordt met de Handtekening-knop in het bewerkvenster.';
+$lang['showuseras'] = 'Hoe de gebruiker die de pagina het laatst wijzigde weergeven';
$lang['toptoclevel'] = 'Bovenste niveau voor inhoudsopgave';
$lang['tocminheads'] = 'Minimum aantal koppen dat bepaald of een index gemaakt wordt';
$lang['maxtoclevel'] = 'Laagste niveau voor inhoudsopgave';
@@ -70,84 +76,86 @@ $lang['maxseclevel'] = 'Laagste sectiewijzigingsniveau';
$lang['camelcase'] = 'CamelCase gebruiken voor links';
$lang['deaccent'] = 'Paginanamen ontdoen van vreemde tekens';
$lang['useheading'] = 'Eerste kopje voor paginanaam gebruiken';
-$lang['refcheck'] = 'Controleer verwijzingen naar media';
-$lang['refshow'] = 'Aantal te tonen mediaverwijzingen';
-$lang['allowdebug'] = 'Debug toestaan <b>uitzetten indien niet noodzakelijk!</b>';
-$lang['mediarevisions'] = 'Media revisies activeren?';
-$lang['usewordblock'] = 'Blokkeer spam op basis van woordenlijst';
-$lang['indexdelay'] = 'Uitstel voor indexeren (sec)';
-$lang['relnofollow'] = 'Gebruik rel="nofollow" voor externe links';
-$lang['mailguard'] = 'E-mailadressen onherkenbaar maken';
-$lang['iexssprotect'] = 'Controleer geüploade bestanden op mogelijk schadelijke JavaScript of HTML code';
-$lang['showuseras'] = 'Hoe de gebruiker die de pagina het laatst wijzigde weergeven';
+$lang['sneaky_index'] = 'Met de standaardinstellingen zal DokuWiki alle namespaces laten zien in de index. Het inschakelen van deze optie zorgt ervoor dat de namespaces waar de gebruiker geen leestoegang tot heeft, verborgen worden. Dit kan resulteren in het verbergen van subnamespaces waar de gebruiker wel toegang to heeft. Dit kan de index onbruikbaar maken met bepaalde ACL-instellingen.';
+$lang['hidepages'] = 'Verberg deze pagina\'s in zoekresultaten, de index en andere automatische indexen (regular expressions)';
$lang['useacl'] = 'Gebruik access control lists';
$lang['autopasswd'] = 'Zelf wachtwoorden genereren';
$lang['authtype'] = 'Authenticatiemechanisme';
$lang['passcrypt'] = 'Encryptie-methode voor wachtwoord ';
-$lang['defaultgroup'] = 'Standaardgroep';
+$lang['defaultgroup'] = 'Standaardgroep, alle nieuwe gebruikers worden hierin geplaatst';
$lang['superuser'] = 'Superuser - een groep of gebruiker of kommalijst (gebruiker1,@groep1,gebruiker2) met volledige toegang tot alle pagina\'s en functies, ongeacht de ACL instellingen';
$lang['manager'] = 'Beheerder - een groep of gebruiker of kommalijst (gebruiker1,@groep1,gebruiker2) met toegang tot bepaalde beheersfunctionaliteit';
$lang['profileconfirm'] = 'Bevestig profielwijzigingen met wachtwoord';
+$lang['rememberme'] = 'Permanente login cookie toestaan (onthoud mij)';
$lang['disableactions'] = 'Aangevinkte DokuWiki-akties uitschakelen';
$lang['disableactions_check'] = 'Controleer';
$lang['disableactions_subscription'] = 'Inschrijven/opzeggen';
$lang['disableactions_wikicode'] = 'Bron bekijken/exporteer rauw';
$lang['disableactions_other'] = 'Andere akties (gescheiden door komma\'s)';
-$lang['sneaky_index'] = 'Met de standaardinstellingen zal DokuWiki alle namespaces laten zien in de index. Het inschakelen van deze optie zorgt ervoor dat de namespaces waar de gebruiker geen leestoegang tot heeft, verborgen worden. Dit kan resulteren in het verbergen van subnamespaces waar de gebruiker wel toegang to heeft. Dit kan de index onbruikbaar maken met bepaalde ACL-instellingen.';
$lang['auth_security_timeout'] = 'Authenticatiebeveiligings-timeout (seconden)';
$lang['securecookie'] = 'Moeten cookies die via HTTPS gezet zijn alleen via HTTPS verzonden worden door de browser? Zet deze optie uit als alleen het inloggen op de wiki beveiligd is, maar het gebruik verder niet.';
-$lang['xmlrpc'] = 'Inschakelen/uitschakelen XML-RPC interface.';
-$lang['xmlrpcuser'] = 'Beperk XML-RPC toegang tot de lijst met kommagescheiden groepen of gebruikers die hier zijn opgegeven. Laat leeg om iedereen toegang te geven.';
+$lang['remote'] = 'Activeer het remote API-systeem. Hiermee kunnen andere applicaties de wiki benaderen via XML-RPC of andere mechanismen.';
+$lang['remoteuser'] = 'Beperk toegang tot de remote API tot deze komma-lijst van groepen of gebruikers. Leeg betekent toegang voor iedereen.';
+$lang['usewordblock'] = 'Blokkeer spam op basis van woordenlijst';
+$lang['relnofollow'] = 'Gebruik rel="nofollow" voor externe links';
+$lang['indexdelay'] = 'Uitstel voor indexeren (sec)';
+$lang['mailguard'] = 'E-mailadressen onherkenbaar maken';
+$lang['iexssprotect'] = 'Controleer geüploade bestanden op mogelijk schadelijke JavaScript of HTML code';
+$lang['usedraft'] = 'Sla automatisch een concept op tijdens het wijzigen';
+$lang['htmlok'] = 'Embedded HTML toestaan';
+$lang['phpok'] = 'Embedded PHP toestaan';
+$lang['locktime'] = 'Maximum leeftijd voor lockbestanden (sec)';
+$lang['cachetime'] = 'Maximum leeftijd voor cache (sec)';
+$lang['target____wiki'] = 'Doelvenster voor interne links';
+$lang['target____interwiki'] = 'Doelvenster voor interwiki-links';
+$lang['target____extern'] = 'Doelvenster voor externe links';
+$lang['target____media'] = 'Doelvenster voor medialinks';
+$lang['target____windows'] = 'Doelvenster voor windows links';
+$lang['mediarevisions'] = 'Mediarevisies activeren?';
+$lang['refcheck'] = 'Controleer of er verwijzingen bestaan naar een mediabestand voor het wijderen';
+$lang['refshow'] = 'Aantal te tonen mediaverwijzingen';
+$lang['gdlib'] = 'Versie GD Lib ';
+$lang['im_convert'] = 'Path naar ImageMagick\'s convert tool';
+$lang['jpg_quality'] = 'JPG compressiekwaliteit (0-100)';
+$lang['fetchsize'] = 'Maximum grootte (bytes) die fetch.php mag downloaden van externe URLs, bijv. voor cachen of herschalen van externe afbeeldingen.';
+$lang['subscribers'] = 'Ondersteuning pagina-inschrijving aanzetten';
+$lang['subscribe_time'] = 'Inschrijvingsmeldingen en samenvattingen worden na deze tijdsduur (in seconden) verzonden. Deze waarde dient kleiner te zijn dan de tijd ingevuld bij "Hoeveel recente wijzigingen bewaren (dagen)"';
+$lang['notify'] = 'Stuur altijd e-mailnotificaties naar dit adres';
+$lang['registernotify'] = 'Stuur altijd informatie over nieuw geregistreerde gebruikers naar dit e-mailadres';
+$lang['mailfrom'] = 'E-mailadres van afzender voor automatische e-mail';
+$lang['mailprefix'] = 'Te gebruiken voorvoegsel voor onderwerp automatische email. Leeglaten gebruik de wikititel.';
+$lang['htmlmail'] = 'Zend multipart HTML e-mail. Dit ziet er beter uit, maar is groter. Uitschakelen betekent e-mail in platte tekst.';
+$lang['sitemap'] = 'Genereer Google sitemap (dagen). 0 betekent uitschakelen.';
+$lang['rss_type'] = 'XML feed type';
+$lang['rss_linkto'] = 'XML feed linkt naar';
+$lang['rss_content'] = 'Wat moet er in de XML feed items weergegeven worden?';
+$lang['rss_update'] = 'XML feed verversingsinterval (sec)';
+$lang['rss_show_summary'] = 'XML feed samenvatting in titel weergeven';
+$lang['rss_media'] = 'Welk type verandering moet in de XML feed worden weergegeven?';
$lang['updatecheck'] = 'Controleer op nieuwe versies en beveiligingswaarschuwingen? DokuWiki moet hiervoor contact opnemen met update.dokuwiki.org.';
$lang['userewrite'] = 'Gebruik nette URL\'s';
$lang['useslash'] = 'Gebruik slash (/) als scheiding tussen namepaces in URL\'s';
-$lang['usedraft'] = 'Sla automatisch een concept op tijdens het wijzigen';
$lang['sepchar'] = 'Woordscheider in paginanamen';
$lang['canonical'] = 'Herleid URL\'s tot hun basisvorm';
$lang['fnencode'] = 'Methode om niet-ASCII bestandsnamen te coderen.';
$lang['autoplural'] = 'Controleer op meervoudsvormen in links';
$lang['compression'] = 'Compressiemethode voor attic-bestanden';
-$lang['cachetime'] = 'Maximum leeftijd voor cache (sec)';
-$lang['locktime'] = 'Maximum leeftijd voor lockbestanden (sec)';
-$lang['fetchsize'] = 'Maximum grootte (bytes) die fetch.php mag downloaden van buiten';
-$lang['notify'] = 'Stuur e-mailnotificaties naar dit adres';
-$lang['registernotify'] = 'Stuur informatie over nieuw aangemelde gebruikers naar dit e-mailadres';
-$lang['mailfrom'] = 'E-mailadres voor automatische e-mail';
-$lang['mailprefix'] = 'Te gebruiken voorvoegsel voor onderwerp automatische email';
$lang['gzip_output'] = 'Gebruik gzip Content-Encoding voor xhtml';
-$lang['gdlib'] = 'Versie GD Lib ';
-$lang['im_convert'] = 'Path naar ImageMagick\'s convert tool';
-$lang['jpg_quality'] = 'JPG compressiekwaliteit (0-100)';
-$lang['subscribers'] = 'Ondersteuning pagina-inschrijving aanzetten';
-$lang['subscribe_time'] = 'Inschrijvingsmeldingen en samenvattingen worden na deze tijdsduur (in seconden) verzonden. Deze waarde dient kleiner te zijn dan de tijd ingevuld bij "Hoeveel recente wijzigingen bewaren (dagen)"';
$lang['compress'] = 'Compacte CSS en javascript output';
$lang['cssdatauri'] = 'Maximale omvang in bytes van in CSS gelinkte afbeeldingen die bij de stylesheet moeten worden ingesloten ter reductie van de HTTP request header overhead. Deze techniek werkt niet in IE7 en ouder! <code>400</code> tot <code>600</code> is een geschikte omvang. Stel de omvang in op <code>0</code> om deze functionaliteit uit te schakelen.';
-$lang['hidepages'] = 'Verberg deze pagina\'s (regular expressions)';
$lang['send404'] = 'Stuur "HTTP 404/Page Not Found" voor niet-bestaande pagina\'s';
-$lang['sitemap'] = 'Genereer Google sitemap (dagen)';
-$lang['broken_iua'] = 'Is de ignore_user_abort functie onbruikbaar op uw systeem? Dit kan een onbruikbare zoekindex tot gevolg hebben. IIS+PHP/CGI staat hier bekend om. Zie <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> voor meer informatie.';
+$lang['broken_iua'] = 'Is de ignore_user_abort functie onbruikbaar op uw systeem? Dit kan een onbruikbare zoekindex tot gevolg hebben. IIS+PHP/CGI staat hier bekend om. Zie <a href="http://bugs.dokuwiki.org/?do=details&amp;task_id=852">Bug 852</a> voor meer informatie.';
$lang['xsendfile'] = 'Gebruik de X-Sendfile header om de webserver statische content te laten versturen? De webserver moet dit wel ondersteunen.';
$lang['renderer_xhtml'] = 'Weergavesysteem voor de standaard (xhtml) wiki-uitvoer';
$lang['renderer__core'] = '%s (dokuwiki core)';
$lang['renderer__plugin'] = '%s (plugin)';
-$lang['rememberme'] = 'Permanente login cookie toestaan (onthoud mij)';
-$lang['rss_type'] = 'XML feed type';
-$lang['rss_linkto'] = 'XML feed linkt naar';
-$lang['rss_content'] = 'Wat moet er in de XML feed items weergegeven worden?';
-$lang['rss_update'] = 'XML feed verversingsinterval (sec)';
-$lang['recent_days'] = 'Hoeveel recente wijzigingen bewaren (dagen)';
-$lang['rss_show_summary'] = 'XML feed samenvatting in titel weergeven';
-$lang['target____wiki'] = 'Doelvenster voor interne links';
-$lang['target____interwiki'] = 'Doelvenster voor interwiki-links';
-$lang['target____extern'] = 'Doelvenster voor externe links';
-$lang['target____media'] = 'Doelvenster voor medialinks';
-$lang['target____windows'] = 'Doelvenster voor windows links';
+$lang['dnslookups'] = 'DokuWiki zoekt de hostnamen van IP-adressen van gebruikers die pagina wijzigen op. Schakel deze optie uit als je geen of een langzame DNS server hebt.';
$lang['proxy____host'] = 'Proxy server';
$lang['proxy____port'] = 'Proxy port';
$lang['proxy____user'] = 'Proxy gebruikersnaam';
$lang['proxy____pass'] = 'Proxy wachtwoord';
-$lang['proxy____ssl'] = 'Gebruik SSL om een connectie te maken met de proxy';
-$lang['proxy____except'] = 'Reguliere expressie om URL\'s te bepalen waarvoor de proxy overgeslaan moet worden.';
+$lang['proxy____ssl'] = 'Gebruik SSL om een verbinding te maken met de proxy';
+$lang['proxy____except'] = 'Reguliere expressie om URL\'s te bepalen waarvoor de proxy overgeslagen moet worden.';
$lang['safemodehack'] = 'Safemode hack aanzetten';
$lang['ftp____host'] = 'FTP server voor safemode hack';
$lang['ftp____port'] = 'FTP port voor safemode hack';
@@ -184,10 +192,10 @@ $lang['compression_o_0'] = 'geen';
$lang['compression_o_gz'] = 'gzip';
$lang['compression_o_bz2'] = 'bz2';
$lang['xsendfile_o_0'] = 'niet gebruiken';
-$lang['xsendfile_o_1'] = 'Eigen lighttpd header (voor release 1.5)';
+$lang['xsendfile_o_1'] = 'Merkgebonden lighttpd header (voor release 1.5)';
$lang['xsendfile_o_2'] = 'Standaard X-Sendfile header';
-$lang['xsendfile_o_3'] = 'Propritary Nginx X-Accel-Redirect header';
-$lang['showuseras_o_loginname'] = 'loginnaam';
+$lang['xsendfile_o_3'] = 'Merkgebonden Nginx X-Accel-Redirect header';
+$lang['showuseras_o_loginname'] = 'Loginnaam';
$lang['showuseras_o_username'] = 'Volledige naam';
$lang['showuseras_o_email'] = 'E-mailadres (onherkenbaar gemaakt volgens mailguard-instelling)';
$lang['showuseras_o_email_link'] = 'E-mailadres als mailto: link';
diff --git a/lib/plugins/config/lang/no/lang.php b/lib/plugins/config/lang/no/lang.php
index c41b5e566..b01637dd1 100644
--- a/lib/plugins/config/lang/no/lang.php
+++ b/lib/plugins/config/lang/no/lang.php
@@ -43,8 +43,8 @@ $lang['_links'] = 'Innstillinger for lenker';
$lang['_media'] = 'Innstillinger for mediafiler';
$lang['_advanced'] = 'Avanserte innstillinger';
$lang['_network'] = 'Nettverksinnstillinger';
-$lang['_plugin_sufix'] = '&ndash; innstillinger for tillegg';
-$lang['_template_sufix'] = '&ndash; innstillinger for mal';
+$lang['_plugin_sufix'] = '– innstillinger for tillegg';
+$lang['_template_sufix'] = '– innstillinger for mal';
$lang['_msg_setting_undefined'] = 'Ingen innstillingsmetadata';
$lang['_msg_setting_no_class'] = 'Ingen innstillingsklasse';
$lang['_msg_setting_no_default'] = 'Ingen standard verdi';
@@ -101,9 +101,6 @@ $lang['disableactions_other'] = 'Andre kommandoer (kommaseparert)';
$lang['sneaky_index'] = 'DokuWiki vil som standard vise alle navnerom i innholdsfortegnelsen. Hvis du skrur på dette alternativet vil brukere bare se de navnerommene der de har lesetilgang. Dette kan føre til at tilgjengelige undernavnerom skjules. Det kan gjøre innholdsfortegnelsen ubrukelig med enkelte ACL-oppsett.';
$lang['auth_security_timeout'] = 'Autentisering utløper etter (sekunder)';
$lang['securecookie'] = 'Skal informasjonskapsler satt via HTTPS kun sendes via HTTPS av nettleseren? Skal ikke velges dersom bare innloggingen til din wiki er sikret med SSL, og annen navigering på wikien er usikret.';
-$lang['xmlrpc'] = 'Slå på/slå av XML-RPC-grensesnitt';
-$lang['xmlrpcuser'] = 'Å tillate XML-RPC-adgang til bestemte grupper eller brukere, sette deres navne (kommaseparert) her. Slik får du tilgang til alle, la feltet tomt.
-';
$lang['updatecheck'] = 'Se etter oppdateringer og sikkerhetsadvarsler? Denne funksjonen er avhengig av å kontakte update.dokuwiki.org.';
$lang['userewrite'] = 'Bruk pene URLer';
$lang['useslash'] = 'Bruk / som skilletegn mellom navnerom i URLer';
diff --git a/lib/plugins/config/lang/pl/lang.php b/lib/plugins/config/lang/pl/lang.php
index 62c55d328..8441722cd 100644
--- a/lib/plugins/config/lang/pl/lang.php
+++ b/lib/plugins/config/lang/pl/lang.php
@@ -14,6 +14,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['menu'] = 'Ustawienia';
$lang['error'] = 'Ustawienia nie zostały zapisane z powodu błędnych wartości, przejrzyj je i ponów próbę zapisu. <br/> Niepoprawne wartości są wyróżnione kolorem czerwonym.';
@@ -35,6 +36,8 @@ $lang['_anti_spam'] = 'Spam';
$lang['_editing'] = 'Edycja';
$lang['_links'] = 'Odnośniki';
$lang['_media'] = 'Media';
+$lang['_notifications'] = 'Ustawienia powiadomień';
+$lang['_syndication'] = 'Ustawienia RSS';
$lang['_advanced'] = 'Zaawansowane';
$lang['_network'] = 'Sieć';
$lang['_plugin_sufix'] = 'Wtyczki';
@@ -42,26 +45,29 @@ $lang['_template_sufix'] = 'Motywy';
$lang['_msg_setting_undefined'] = 'Brak danych o ustawieniu.';
$lang['_msg_setting_no_class'] = 'Brak kategorii ustawień.';
$lang['_msg_setting_no_default'] = 'Brak wartości domyślnej.';
-$lang['fmode'] = 'Tryb tworzenia pliku';
-$lang['dmode'] = 'Tryb tworzenia katalogu';
+$lang['title'] = 'Tytuł wiki';
+$lang['start'] = 'Tytuł strony początkowej';
$lang['lang'] = 'Język';
+$lang['template'] = 'Motyw';
+$lang['tagline'] = 'Motto (jeśli szablon daje taką możliwość)';
+$lang['sidebar'] = 'Nazwa strony paska bocznego (jeśli szablon je obsługuje), puste pole wyłącza pasek boczny';
+$lang['license'] = 'Pod jaką licencją publikować treści wiki?';
+$lang['savedir'] = 'Katalog z danymi';
$lang['basedir'] = 'Katalog główny';
$lang['baseurl'] = 'Główny URL';
-$lang['savedir'] = 'Katalog z danymi';
$lang['cookiedir'] = 'Ścieżka plików ciasteczek. Zostaw puste by użyć baseurl.';
-$lang['start'] = 'Tytuł strony początkowej';
-$lang['title'] = 'Tytuł wiki';
-$lang['template'] = 'Motyw';
-$lang['license'] = 'Pod jaką licencją publikować treści wiki?';
-$lang['fullpath'] = 'Wyświetlanie pełnych ścieżek';
+$lang['dmode'] = 'Tryb tworzenia katalogu';
+$lang['fmode'] = 'Tryb tworzenia pliku';
+$lang['allowdebug'] = 'Debugowanie (niebezpieczne!)';
$lang['recent'] = 'Ilość ostatnich zmian';
+$lang['recent_days'] = 'Ilość ostatnich zmian (w dniach)';
$lang['breadcrumbs'] = 'Długość śladu';
$lang['youarehere'] = 'Ślad według struktury';
+$lang['fullpath'] = 'Wyświetlanie pełnych ścieżek';
$lang['typography'] = 'Konwersja cudzysłowu, myślników itp.';
-$lang['htmlok'] = 'Wstawki HTML';
-$lang['phpok'] = 'Wstawki PHP';
$lang['dformat'] = 'Format daty';
$lang['signature'] = 'Podpis';
+$lang['showuseras'] = 'Sposób wyświetlania nazwy użytkownika, który ostatnio edytował stronę';
$lang['toptoclevel'] = 'Minimalny poziom spisu treści';
$lang['tocminheads'] = 'Minimalna liczba nagłówków niezbędna do wytworzenia spisu treści.';
$lang['maxtoclevel'] = 'Maksymalny poziom spisu treści';
@@ -69,16 +75,8 @@ $lang['maxseclevel'] = 'Maksymalny poziom podziału na sekcje edycyjne
$lang['camelcase'] = 'Bikapitalizacja odnośników (CamelCase)';
$lang['deaccent'] = 'Podmieniaj znaki spoza ASCII w nazwach';
$lang['useheading'] = 'Pierwszy nagłówek jako tytuł';
-$lang['refcheck'] = 'Sprawdzanie odwołań przed usunięciem pliku';
-$lang['refshow'] = 'Ilość pokazywanych odwołań do pliku';
-$lang['allowdebug'] = 'Debugowanie (niebezpieczne!)';
-$lang['mediarevisions'] = 'Włączyć wersjonowanie multimediów?';
-$lang['usewordblock'] = 'Blokowanie spamu na podstawie słów';
-$lang['indexdelay'] = 'Okres indeksowania w sekundach';
-$lang['relnofollow'] = 'Nagłówek rel="nofollow" dla odnośników zewnętrznych';
-$lang['mailguard'] = 'Utrudnianie odczytu adresów e-mail';
-$lang['iexssprotect'] = 'Wykrywanie złośliwego kodu JavaScript i HTML w plikach';
-$lang['showuseras'] = 'Sposób wyświetlania nazwy użytkownika, który ostatnio edytował stronę';
+$lang['sneaky_index'] = 'Domyślnie, Dokuwiki pokazuje wszystkie katalogi w indeksie. Włączenie tej opcji ukryje katalogi, do których użytkownik nie ma praw. Może to spowodować ukrycie podkatalogów, do których użytkownik ma prawa. Ta opcja może spowodować błędne działanie indeksu w połączeniu z pewnymi konfiguracjami praw dostępu.';
+$lang['hidepages'] = 'Ukrywanie stron pasujących do wzorca (wyrażenie regularne)';
$lang['useacl'] = 'Kontrola uprawnień ACL';
$lang['autopasswd'] = 'Automatyczne generowanie haseł';
$lang['authtype'] = 'Typ autoryzacji';
@@ -87,60 +85,70 @@ $lang['defaultgroup'] = 'Domyślna grupa';
$lang['superuser'] = 'Administrator - grupa lub użytkownik z pełnymi uprawnieniami';
$lang['manager'] = 'Menadżer - grupa lub użytkownik z uprawnieniami do zarządzania wiki';
$lang['profileconfirm'] = 'Potwierdzanie zmiany profilu hasłem';
+$lang['rememberme'] = 'Pozwól na ciasteczka automatycznie logujące (pamiętaj mnie)';
$lang['disableactions'] = 'Wyłącz akcje DokuWiki';
$lang['disableactions_check'] = 'Sprawdzanie';
$lang['disableactions_subscription'] = 'Subskrypcje';
$lang['disableactions_wikicode'] = 'Pokazywanie źródeł';
$lang['disableactions_other'] = 'Inne akcje (oddzielone przecinkiem)';
-$lang['sneaky_index'] = 'Domyślnie, Dokuwiki pokazuje wszystkie katalogi w indeksie. Włączenie tej opcji ukryje katalogi, do których użytkownik nie ma praw. Może to spowodować ukrycie podkatalogów, do których użytkownik ma prawa. Ta opcja może spowodować błędne działanie indeksu w połączeniu z pewnymi konfiguracjami praw dostępu.';
$lang['auth_security_timeout'] = 'Czas wygaśnięcia uwierzytelnienia (w sekundach)';
$lang['securecookie'] = 'Czy ciasteczka wysłane do przeglądarki przez HTTPS powinny być przez nią odsyłane też tylko przez HTTPS? Odznacz tę opcję tylko wtedy, gdy logowanie użytkowników jest zabezpieczone SSL, ale przeglądanie stron odbywa się bez zabezpieczenia.';
-$lang['xmlrpc'] = 'Włącz/wyłącz interfejs XML-RPC';
-$lang['xmlrpcuser'] = 'Lista użytkowników i grup, którzy mogą korzystać z protokołu XML-RPC. Nazwy grup i użytkowników rozdziel przecinkami, puste pole oznacza dostęp dla wszystkich.';
+$lang['remote'] = 'Włącz API zdalnego dostępu. Pozwoli to innym aplikacjom na dostęp do wiki poprzez XML-RPC lub inne mechanizmy.';
+$lang['remoteuser'] = 'Ogranicz dostęp poprzez API zdalnego dostępu do podanych grup lub użytkowników, oddzielonych przecinkami. Pozostaw to pole puste by pozwolić na dostęp be ograniczeń.';
+$lang['usewordblock'] = 'Blokowanie spamu na podstawie słów';
+$lang['relnofollow'] = 'Nagłówek rel="nofollow" dla odnośników zewnętrznych';
+$lang['indexdelay'] = 'Okres indeksowania w sekundach';
+$lang['mailguard'] = 'Utrudnianie odczytu adresów e-mail';
+$lang['iexssprotect'] = 'Wykrywanie złośliwego kodu JavaScript i HTML w plikach';
+$lang['usedraft'] = 'Automatyczne zapisywanie szkicu podczas edycji';
+$lang['htmlok'] = 'Wstawki HTML';
+$lang['phpok'] = 'Wstawki PHP';
+$lang['locktime'] = 'Maksymalny wiek blokad w sekundach';
+$lang['cachetime'] = 'Maksymalny wiek cache w sekundach';
+$lang['target____wiki'] = 'Okno docelowe odnośników wewnętrznych';
+$lang['target____interwiki'] = 'Okno docelowe odnośników do innych wiki';
+$lang['target____extern'] = 'Okno docelowe odnośników zewnętrznych';
+$lang['target____media'] = 'Okno docelowe odnośników do plików';
+$lang['target____windows'] = 'Okno docelowe odnośników zasobów Windows';
+$lang['mediarevisions'] = 'Włączyć wersjonowanie multimediów?';
+$lang['refcheck'] = 'Sprawdzanie odwołań przed usunięciem pliku';
+$lang['refshow'] = 'Ilość pokazywanych odwołań do pliku';
+$lang['gdlib'] = 'Wersja biblioteki GDLib';
+$lang['im_convert'] = 'Ścieżka do programu imagemagick';
+$lang['jpg_quality'] = 'Jakość kompresji JPG (0-100)';
+$lang['fetchsize'] = 'Maksymalny rozmiar pliku (w bajtach) jaki można pobrać z zewnątrz';
+$lang['subscribers'] = 'Subskrypcja';
+$lang['subscribe_time'] = 'Czas po którym są wysyłane listy subskrypcji i streszczenia (sek.); Powinna być to wartość większa niż podana w zmiennej recent_days.';
+$lang['notify'] = 'Wysyłanie powiadomień na adres e-mail';
+$lang['registernotify'] = 'Prześlij informacje o nowych użytkownikach na adres e-mail';
+$lang['mailfrom'] = 'Adres e-mail tego wiki';
+$lang['mailprefix'] = 'Prefiks tematu e-mail do automatycznych wiadomości';
+$lang['htmlmail'] = 'Wysyłaj wiadomości e-mail w formacie HTML, które wyglądają lepiej, lecz ich rozmiar jest większy. Wyłącz wysyłanie wiadomości zawierających tekst niesformatowany.';
+$lang['sitemap'] = 'Okres generowania Google Sitemap (w dniach)';
+$lang['rss_type'] = 'Typ RSS';
+$lang['rss_linkto'] = 'Odnośniki w RSS';
+$lang['rss_content'] = 'Rodzaj informacji wyświetlanych w RSS ';
+$lang['rss_update'] = 'Okres aktualizacji RSS (w sekundach)';
+$lang['rss_show_summary'] = 'Podsumowanie w tytule';
+$lang['rss_media'] = 'Rodzaj zmian wyświetlanych w RSS';
$lang['updatecheck'] = 'Sprawdzanie aktualizacji i bezpieczeństwa. DokuWiki będzie kontaktować się z serwerem update.dokuwiki.org.';
$lang['userewrite'] = 'Proste adresy URL';
$lang['useslash'] = 'Używanie ukośnika jako separatora w adresie URL';
-$lang['usedraft'] = 'Automatyczne zapisywanie szkicu podczas edycji';
$lang['sepchar'] = 'Znak rozdzielający wyrazy nazw';
$lang['canonical'] = 'Kanoniczne adresy URL';
$lang['fnencode'] = 'Metoda kodowana nazw pików bez użycia ASCII.';
$lang['autoplural'] = 'Automatyczne tworzenie liczby mnogiej';
$lang['compression'] = 'Metoda kompresji dla usuniętych plików';
-$lang['cachetime'] = 'Maksymalny wiek cache w sekundach';
-$lang['locktime'] = 'Maksymalny wiek blokad w sekundach';
-$lang['fetchsize'] = 'Maksymalny rozmiar pliku (w bajtach) jaki można pobrać z zewnątrz';
-$lang['notify'] = 'Wysyłanie powiadomień na adres e-mail';
-$lang['registernotify'] = 'Prześlij informacje o nowych użytkownikach na adres e-mail';
-$lang['mailfrom'] = 'Adres e-mail tego wiki';
-$lang['mailprefix'] = 'Prefiks tematu e-mail do automatycznych wiadomości';
$lang['gzip_output'] = 'Używaj kodowania GZIP dla zawartości XHTML';
-$lang['gdlib'] = 'Wersja biblioteki GDLib';
-$lang['im_convert'] = 'Ścieżka do programu imagemagick';
-$lang['jpg_quality'] = 'Jakość kompresji JPG (0-100)';
-$lang['subscribers'] = 'Subskrypcja';
-$lang['subscribe_time'] = 'Czas po którym są wysyłane listy subskrypcji i streszczenia (sek.); Powinna być to wartość większa niż podana w zmiennej recent_days.';
$lang['compress'] = 'Kompresja arkuszy CSS i plików JavaScript';
$lang['cssdatauri'] = 'Rozmiar w bajtach, poniżej którego odwołania do obrazów w plikach CSS powinny być osadzone bezpośrednio w arkuszu stylów by zmniejszyć ogólne żądania nagłówków HTTP. Technika ta nie działa w IE 7 i poniżej! <code>400</code> do <code>600</code> bajtów jest dobrą wartością. Ustaw <code>0</code> aby wyłączyć.';
-$lang['hidepages'] = 'Ukrywanie stron pasujących do wzorca (wyrażenie regularne)';
$lang['send404'] = 'Nagłówek "HTTP 404/Page Not Found" dla nieistniejących stron';
-$lang['sitemap'] = 'Okres generowania Google Sitemap (w dniach)';
$lang['broken_iua'] = 'Czy funkcja "ignore_user_abort" działa? Jeśli nie, może to powodować problemy z indeksem przeszukiwania. Funkcja nie działa przy konfiguracji oprogramowania IIS+PHP/CGI. Szczegółowe informacje: <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a>.';
$lang['xsendfile'] = 'Użyj nagłówka HTTP X-Sendfile w celu przesyłania statycznych plików. Serwer HTTP musi obsługiwać ten nagłówek.';
$lang['renderer_xhtml'] = 'Mechanizm renderowania głównej treści strony (xhtml)';
$lang['renderer__core'] = '%s (dokuwiki)';
$lang['renderer__plugin'] = '%s (wtyczka)';
-$lang['rememberme'] = 'Pozwól na ciasteczka automatycznie logujące (pamiętaj mnie)';
-$lang['rss_type'] = 'Typ RSS';
-$lang['rss_linkto'] = 'Odnośniki w RSS';
-$lang['rss_content'] = 'Rodzaj informacji wyświetlanych w RSS ';
-$lang['rss_update'] = 'Okres aktualizacji RSS (w sekundach)';
-$lang['recent_days'] = 'Ilość ostatnich zmian (w dniach)';
-$lang['rss_show_summary'] = 'Podsumowanie w tytule';
-$lang['target____wiki'] = 'Okno docelowe odnośników wewnętrznych';
-$lang['target____interwiki'] = 'Okno docelowe odnośników do innych wiki';
-$lang['target____extern'] = 'Okno docelowe odnośników zewnętrznych';
-$lang['target____media'] = 'Okno docelowe odnośników do plików';
-$lang['target____windows'] = 'Okno docelowe odnośników zasobów Windows';
+$lang['dnslookups'] = 'DokiWiki wyszuka nazwy hostów dla zdalnych adresów IP użytkowników edytujących strony. Jeśli twój serwer DNS działa zbyt wolno, uległ awarii lub nie chcesz używać wyszukiwania, wyłącz tę opcję.';
$lang['proxy____host'] = 'Proxy - serwer';
$lang['proxy____port'] = 'Proxy - port';
$lang['proxy____user'] = 'Proxy - nazwa użytkownika';
diff --git a/lib/plugins/config/lang/pt-br/lang.php b/lib/plugins/config/lang/pt-br/lang.php
index 093e60ff8..8c0ef713a 100644
--- a/lib/plugins/config/lang/pt-br/lang.php
+++ b/lib/plugins/config/lang/pt-br/lang.php
@@ -98,8 +98,6 @@ $lang['disableactions_other'] = 'Outras ações (separadas por vírgula)';
$lang['sneaky_index'] = 'Por padrão, o DokuWiki irá exibir todos os espaços de nomes na visualização do índice. Ao habilitar essa opção, serão escondidos aqueles que o usuário não tiver permissão de leitura. Isso pode resultar na omissão de subespaços de nomes, tornando o índice inútil para certas configurações de ACL.';
$lang['auth_security_timeout'] = 'Tempo limite de segurança para autenticações (seg)';
$lang['securecookie'] = 'Os cookies definidos via HTTPS devem ser enviados para o navegador somente via HTTPS? Desabilite essa opção quando somente a autenticação do seu wiki for realizada de maneira segura via SSL e a navegação, de maneira insegura.';
-$lang['xmlrpc'] = 'Habilitar/desabilitar interface XML-RPC.';
-$lang['xmlrpcuser'] = 'Acesso Restrito ao XML-RPC para grupos separados por virgula ou usuários aqui. Deixe em branco para conveder acesso a todos.';
$lang['updatecheck'] = 'Verificar atualizações e avisos de segurança? O DokuWiki precisa contactar o "splitbrain.org" para efetuar esse recurso.';
$lang['userewrite'] = 'Usar URLs "limpas"';
$lang['useslash'] = 'Usar a barra como separador de espaços de nomes nas URLs';
diff --git a/lib/plugins/config/lang/pt/lang.php b/lib/plugins/config/lang/pt/lang.php
index fe05bd281..d0fe0ac0d 100644
--- a/lib/plugins/config/lang/pt/lang.php
+++ b/lib/plugins/config/lang/pt/lang.php
@@ -87,8 +87,6 @@ $lang['disableactions_other'] = 'Outras acções (separadas por vírgula)';
$lang['sneaky_index'] = 'Por norma, o DokuWiki irá exibir todos os espaços de nomes na visualização do índice. Ao habilitar essa opção, serão escondidos aqueles em que o utilizador não tenha permissão de leitura. Isto pode resultar na omissão de sub-ramos acessíveis, que poderá tornar o índice inútil para certas configurações de ACL.';
$lang['auth_security_timeout'] = 'Tempo limite de segurança para autenticações (seg)';
$lang['securecookie'] = 'Os cookies definidos via HTTPS deverão ser enviados para o navegador somente via HTTPS? Desabilite essa opção quando somente a autenticação do seu wiki for realizada de maneira segura via SSL e a navegação de maneira insegura.';
-$lang['xmlrpc'] = 'Habilitar/desabilitar interface XML-RPC.';
-$lang['xmlrpcuser'] = 'Restringir acesso XML-RPC para os grupos separados por vírgula ou utilizadores inseridos aqui. Deixar vazio para dar acesso a todos.';
$lang['updatecheck'] = 'Verificar por actualizações e avisos de segurança? O DokuWiki precisa contactar o "splitbrain.org" para efectuar esta verificação.';
$lang['userewrite'] = 'Usar URLs SEO';
$lang['useslash'] = 'Usar a barra como separador de espaços de nomes nas URLs';
diff --git a/lib/plugins/config/lang/ro/lang.php b/lib/plugins/config/lang/ro/lang.php
index 6b0a0e91a..72b205b90 100644
--- a/lib/plugins/config/lang/ro/lang.php
+++ b/lib/plugins/config/lang/ro/lang.php
@@ -9,6 +9,8 @@
* @author Emanuel-Emeric Andraşi <em.andrasi@mandrivausers.ro>
* @author Emanuel-Emeric Andrasi <em.andrasi@mandrivausers.ro>
* @author Marius OLAR <olarmariusalex@gmail.com>
+ * @author Marius Olar <olarmariusalex@yahoo.com>
+ * @author Emanuel-Emeric Andrași <em.andrasi@mandrivausers.ro>
*/
$lang['menu'] = 'Setări de Configurare';
$lang['error'] = 'Setări nu au fost actualizate datorită unei valori incorecte; verificaţi modificările şi încercaţi din nou. <br /> Valorile incorecte vor apărea într-un chenar roşu.';
@@ -47,6 +49,8 @@ $lang['cookiedir'] = 'Cale Cookie. Lăsați gol pentru a utiliza bas
$lang['start'] = 'Numele paginii de start';
$lang['title'] = 'Titlul wiki';
$lang['template'] = 'Şablon';
+$lang['tagline'] = 'Slogan (dacă templateul suportă opțiunea)';
+$lang['sidebar'] = 'Numele paginii barei laterale (dacă templateul suportă opțiunea), câmpul lăsat gol dezactivează bara laterală';
$lang['license'] = 'Sub ce licenţă va fi publicat conţinutul?';
$lang['fullpath'] = 'Arată calea completă a paginii în subsol';
$lang['recent'] = 'Modificări recente';
@@ -67,6 +71,7 @@ $lang['useheading'] = 'Foloseşte primul titlu pentru numele paginii'
$lang['refcheck'] = 'Verificare referinţă media';
$lang['refshow'] = 'Numărul de referinţe media de arătat';
$lang['allowdebug'] = 'Permite depanarea <b>dezactivaţi dacă cu e necesar!</b>';
+$lang['mediarevisions'] = 'Activare Revizii Media?';
$lang['usewordblock'] = 'Blochează spam-ul pe baza listei de cuvinte';
$lang['indexdelay'] = 'Timpul de întârziere înainte de indexare (sec)';
$lang['relnofollow'] = 'Folosiţi rel="nofollow" pentru legăturile externe';
@@ -89,8 +94,8 @@ $lang['disableactions_other'] = 'Alte acţiuni (separate prin virgulă)';
$lang['sneaky_index'] = 'Implicit, DokuWiki va arăta toate numele de spaţii la vizualizarea indexului. Activând această opţiune vor fi ascunse acelea la care utilizatorul nu are drepturi de citire. Aceasta poate determina ascunderea sub-numelor de spaţii accesibile. Aceasta poate face index-ul inutilizabil cu anumite setări ale ACL';
$lang['auth_security_timeout'] = 'Timpul de expirare al Autentificării Securizate (secunde)';
$lang['securecookie'] = 'Cookies-urile setate via HTTPS să fie trimise doar via HTTPS de către browser? Dezactivaţi această opţiune numai când login-ul wiki-ului este securizat cu SSL dar navigarea wiki-ului se realizează nesecurizat.';
-$lang['xmlrpc'] = 'Activează/dezactivează interfaţa XML-RPC';
-$lang['xmlrpcuser'] = 'Restricţionaţi accesul XML-RPC la grupurile sau utilizatorii separaţi prin virgulă daţi aici. Lasaţi gol pentru a da acces tuturor.';
+$lang['remote'] = 'Activează sistemul remote API. Acesta permite altor aplicații să acceseze wiki-ul via XML-RPC sau alte mecanisme.';
+$lang['remoteuser'] = 'Restricționează accesul sistemului remote API la grupurile sau utilizatorii următori (separați prin virgulă). Lăsați câmpul gol pentru a da acces către toți.';
$lang['updatecheck'] = 'Verificare actualizări şi avertismente privind securitatea? DokuWiki trebuie să contacteze update.dokuwiki.org pentru această facilitate.';
$lang['userewrite'] = 'Folosire URL-uri "nice"';
$lang['useslash'] = 'Foloseşte slash-ul ca separator de spaţii de nume în URL-uri';
@@ -130,6 +135,7 @@ $lang['rss_content'] = 'Ce să afişez în obiectele fluxurilor XML';
$lang['rss_update'] = 'Intervalul de actualizare a fluxului XML (sec)';
$lang['recent_days'] = 'Câte modificări recente să se păstreze?';
$lang['rss_show_summary'] = 'Fluxul XML arată rezumat în titlu';
+$lang['rss_media'] = 'Ce fel de modificări ar trebui afișate în fluxul XML?';
$lang['target____wiki'] = 'Fereastra ţintă pentru legăturile interne';
$lang['target____interwiki'] = 'Fereastra ţintă pentru legăturile interwiki';
$lang['target____extern'] = 'Fereastra ţintă pentru legăturile externe';
diff --git a/lib/plugins/config/lang/ru/lang.php b/lib/plugins/config/lang/ru/lang.php
index f29257a28..84dce4a67 100644
--- a/lib/plugins/config/lang/ru/lang.php
+++ b/lib/plugins/config/lang/ru/lang.php
@@ -16,6 +16,7 @@
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
* @author Ladyko Andrey <fylh@succexy.spb.ru>
* @author Eugene <windy.wanderer@gmail.com>
+ * @author Johnny Utah <pcpa@cyberpunk.su>
*/
$lang['menu'] = 'Настройки вики';
$lang['error'] = 'Настройки не были сохранены из-за ошибки в одном из значений. Пожалуйста, проверьте свои изменения и попробуйте ещё раз.<br />Неправильные значения будут обведены красной рамкой.';
@@ -37,6 +38,7 @@ $lang['_anti_spam'] = 'Параметры блокировки спа
$lang['_editing'] = 'Параметры правки';
$lang['_links'] = 'Параметры ссылок';
$lang['_media'] = 'Параметры медиафайлов';
+$lang['_notifications'] = 'Параметры уведомлений';
$lang['_advanced'] = 'Тонкая настройка';
$lang['_network'] = 'Параметры сети';
$lang['_plugin_sufix'] = 'Параметры плагина';
@@ -44,25 +46,29 @@ $lang['_template_sufix'] = 'Параметры шаблона';
$lang['_msg_setting_undefined'] = 'Не найдены метаданные настроек.';
$lang['_msg_setting_no_class'] = 'Не найден класс настроек.';
$lang['_msg_setting_no_default'] = 'Не задано значение по умолчанию.';
-$lang['fmode'] = 'Права для создаваемых файлов';
-$lang['dmode'] = 'Права для создаваемых директорий';
-$lang['lang'] = 'Язык';
-$lang['basedir'] = 'Корневая директория (например, <code>/dokuwiki/</code>). Оставьте пустым для автоопределения.';
-$lang['baseurl'] = 'Корневой адрес (URL) (например, <code>http://www.yourserver.ru</code>). Оставьте пустым для автоопределения.';
-$lang['savedir'] = 'Директория для данных';
-$lang['start'] = 'Имя стартовой страницы';
$lang['title'] = 'Название вики';
+$lang['start'] = 'Имя стартовой страницы';
+$lang['lang'] = 'Язык';
$lang['template'] = 'Шаблон';
+$lang['tagline'] = 'Слоган (если поддерживается шаблоном)';
+$lang['sidebar'] = 'Боковая панель, пустое поле отключает боковую панель.';
$lang['license'] = 'На условиях какой лицензии будет предоставляться содержимое вики?';
-$lang['fullpath'] = 'Полный путь к документу';
+$lang['savedir'] = 'Директория для данных';
+$lang['basedir'] = 'Корневая директория (например, <code>/dokuwiki/</code>). Оставьте пустым для автоопределения.';
+$lang['baseurl'] = 'Корневой адрес (URL) (например, <code>http://www.yourserver.ru</code>). Оставьте пустым для автоопределения.';
+$lang['cookiedir'] = 'Cookie директория. Оставьте пустым для автоопределения.';
+$lang['dmode'] = 'Права для создаваемых директорий';
+$lang['fmode'] = 'Права для создаваемых файлов';
+$lang['allowdebug'] = 'Включить отладку (отключите!)';
$lang['recent'] = 'Недавние изменения (кол-во)';
+$lang['recent_days'] = 'На сколько дней назад сохранять недавние изменения';
$lang['breadcrumbs'] = 'Вы посетили (кол-во)';
$lang['youarehere'] = 'Показывать «Вы находитесь здесь»';
+$lang['fullpath'] = 'Полный путь к документу';
$lang['typography'] = 'Типографские символы';
-$lang['htmlok'] = 'Разрешить HTML';
-$lang['phpok'] = 'Разрешить PHP';
$lang['dformat'] = 'Формат даты и времени';
$lang['signature'] = 'Шаблон подписи';
+$lang['showuseras'] = 'Что отображать при показе пользователя, редактировавшего страницу последним';
$lang['toptoclevel'] = 'Мин. уровень в содержании';
$lang['tocminheads'] = 'Мин. количество заголовков, при котором будет составлено содержание';
$lang['maxtoclevel'] = 'Макс. уровень в содержании';
@@ -70,15 +76,8 @@ $lang['maxseclevel'] = 'Макс. уровень для правки';
$lang['camelcase'] = 'Использовать ВикиРегистр для ссылок';
$lang['deaccent'] = 'Транслитерация в именах страниц';
$lang['useheading'] = 'Первый заголовок вместо имени';
-$lang['refcheck'] = 'Проверять ссылки на медиафайлы';
-$lang['refshow'] = 'Показывать ссылок на медиафайлы';
-$lang['allowdebug'] = 'Включить отладку (отключите!)';
-$lang['usewordblock'] = 'Блокировать спам по ключевым словам';
-$lang['indexdelay'] = 'Задержка перед индексированием';
-$lang['relnofollow'] = 'rel="nofollow" для внешних ссылок';
-$lang['mailguard'] = 'Кодировать адреса электронной почты';
-$lang['iexssprotect'] = 'Проверять закачанные файлы на наличие потенциально опасного кода JavaScript или HTML';
-$lang['showuseras'] = 'Что отображать при показе пользователя, редактировавшего страницу последним';
+$lang['sneaky_index'] = 'По умолчанию, «ДокуВики» показывает в индексе страниц все пространства имён. Включение этой опции скроет пространства имён, для которых пользователь не имеет прав чтения. Это может привести к скрытию доступных вложенных пространств имён и потере функциональности индекса страниц при некоторых конфигурациях прав доступа.';
+$lang['hidepages'] = 'Скрыть страницы (рег. выражение)';
$lang['useacl'] = 'Использовать списки прав доступа';
$lang['autopasswd'] = 'Автогенерация паролей';
$lang['authtype'] = 'Механизм аутентификации';
@@ -87,59 +86,66 @@ $lang['defaultgroup'] = 'Группа по умолчанию';
$lang['superuser'] = 'Суперпользователь — группа или пользователь с полным доступом ко всем страницам и функциям администрирования, независимо от установок ACL. Перечень разделяйте запятыми: user1,@group1,user2';
$lang['manager'] = 'Менеджер — группа или пользователь с доступом к определённым функциям управления. Перечень разделяйте запятыми: user1,@group1,user2';
$lang['profileconfirm'] = 'Пароль для изменения профиля';
+$lang['rememberme'] = 'Разрешить перманентные куки (cookies) для входа («запомнить меня»)';
$lang['disableactions'] = 'Заблокировать операции «ДокуВики»';
$lang['disableactions_check'] = 'Проверка';
$lang['disableactions_subscription'] = 'Подписка/Отмена подписки';
$lang['disableactions_wikicode'] = 'Показ/экспорт исходного текста';
$lang['disableactions_other'] = 'Другие операции (через запятую)';
-$lang['sneaky_index'] = 'По умолчанию, «ДокуВики» показывает в индексе страниц все пространства имён. Включение этой опции скроет пространства имён, для которых пользователь не имеет прав чтения. Это может привести к скрытию доступных вложенных пространств имён и потере функциональности индекса страниц при некоторых конфигурациях прав доступа.';
$lang['auth_security_timeout'] = 'Интервал для безопасности авторизации (сек.)';
$lang['securecookie'] = 'Должны ли куки (cookies), выставленные через HTTPS, отправляться браузером только через HTTPS. Отключите эту опцию в случае, когда только логин вашей вики передаётся через SSL, а обычный просмотр осуществляется в небезопасном режиме.';
-$lang['xmlrpc'] = 'Включить/выключить XML-RPC интерфейс.';
-$lang['xmlrpcuser'] = 'Запретить XML-RPC-доступ для списка групп и пользователей, перечисленных через запятую. Оставьте пустым, если хотите оставить доступ всем.';
+$lang['remote'] = 'Включить систему API для подключений. Это позволит другим приложениям получить доступ к вики через XML-RPC или другие механизмы.';
+$lang['usewordblock'] = 'Блокировать спам по ключевым словам';
+$lang['relnofollow'] = 'rel="nofollow" для внешних ссылок';
+$lang['indexdelay'] = 'Задержка перед индексированием';
+$lang['mailguard'] = 'Кодировать адреса электронной почты';
+$lang['iexssprotect'] = 'Проверять закачанные файлы на наличие потенциально опасного кода JavaScript или HTML';
+$lang['usedraft'] = 'Автоматически сохранять черновик во время правки';
+$lang['htmlok'] = 'Разрешить HTML';
+$lang['phpok'] = 'Разрешить PHP';
+$lang['locktime'] = 'Время блокировки страницы (сек.)';
+$lang['cachetime'] = 'Время жизни кэш-файла (сек.)';
+$lang['target____wiki'] = 'target для внутренних ссылок';
+$lang['target____interwiki'] = 'target для ссылок между вики';
+$lang['target____extern'] = 'target для внешних ссылок';
+$lang['target____media'] = 'target для ссылок на медиафайлы';
+$lang['target____windows'] = 'target для ссылок на сетевые каталоги';
+$lang['mediarevisions'] = 'Включение версий медиафайлов';
+$lang['refcheck'] = 'Проверять ссылки на медиафайлы';
+$lang['refshow'] = 'Показывать ссылок на медиафайлы';
+$lang['gdlib'] = 'Версия LibGD';
+$lang['im_convert'] = 'Путь к ImageMagick';
+$lang['jpg_quality'] = 'Качество сжатия JPG (0–100). Значение по умолчанию — 70.';
+$lang['fetchsize'] = 'Максимальный размер файла (в байтах), который fetch.php может скачивать с внешнего источника';
+$lang['subscribers'] = 'Разрешить подписку на изменения';
+$lang['subscribe_time'] = 'Интервал рассылки подписок и сводок (сек.). Должен быть меньше, чем значение, указанное в recent_days.';
+$lang['notify'] = 'Электронный адрес для извещений';
+$lang['registernotify'] = 'Посылать информацию о новых зарегистрированных пользователях на этот электронный адрес';
+$lang['mailfrom'] = 'Электронный адрес вики (От:)';
+$lang['mailprefix'] = 'Префикс используемый для автоматического письма станет темой сообщений';
+$lang['sitemap'] = 'Число дней, через которое нужно создавать (обновлять) карту сайта для поисковиков (Гугл, Яндекс и др.)';
+$lang['rss_type'] = 'Тип RSS';
+$lang['rss_linkto'] = 'Ссылки в RSS';
+$lang['rss_content'] = 'Что отображать в строках XML-ленты?';
+$lang['rss_update'] = 'Интервал обновления XML-ленты (сек.)';
+$lang['rss_show_summary'] = 'Показывать краткую выдержку в заголовках XML-ленты';
$lang['updatecheck'] = 'Проверять наличие обновлений и предупреждений о безопасности? Для этого «ДокуВики» потребуется связываться с сайтом <a href="http://www.splitbrain.org/">splitbrain.org</a>.';
$lang['userewrite'] = 'Удобочитаемые адреса (URL)';
$lang['useslash'] = 'Использовать слэш';
-$lang['usedraft'] = 'Автоматически сохранять черновик во время правки';
$lang['sepchar'] = 'Разделитель слов в имени страницы';
$lang['canonical'] = 'Полные канонические адреса (URL)';
$lang['fnencode'] = 'Метод кодирования имён файлов, записанных не ASCII-символами.';
$lang['autoplural'] = 'Автоматическое мн. число';
$lang['compression'] = 'Метод сжатия для архивных файлов';
-$lang['cachetime'] = 'Время жизни кэш-файла (сек.)';
-$lang['locktime'] = 'Время блокировки страницы (сек.)';
-$lang['fetchsize'] = 'Максимальный размер файла (в байтах), который fetch.php может скачивать с внешнего источника';
-$lang['notify'] = 'Электронный адрес для извещений';
-$lang['registernotify'] = 'Посылать информацию о новых зарегистрированных пользователях на этот электронный адрес';
-$lang['mailfrom'] = 'Электронный адрес вики (От:)';
-$lang['mailprefix'] = 'Префикс используемый для автоматического письма станет темой сообщений';
$lang['gzip_output'] = 'Использовать gzip-сжатие для xhtml';
-$lang['gdlib'] = 'Версия LibGD';
-$lang['im_convert'] = 'Путь к ImageMagick';
-$lang['jpg_quality'] = 'Качество сжатия JPG (0–100). Значение по умолчанию — 70.';
-$lang['subscribers'] = 'Разрешить подписку на изменения';
-$lang['subscribe_time'] = 'Интервал рассылки подписок и сводок (сек.). Должен быть меньше, чем значение, указанное в recent_days.';
$lang['compress'] = 'Сжимать файлы CSS и javascript';
-$lang['hidepages'] = 'Скрыть страницы (рег. выражение)';
+$lang['cssdatauri'] = 'Размер в байтах до которого изображения, указанные в CSS-файлах, должны быть встроены прямо в таблицу стилей, для уменьшения избычтоных HTTP-запросов. Этот метод не будет работать в IE версии 7 и ниже! Установка от <code>400</code> до <code>600</code> байт является хорошим показателем. Установите <code>0</code>, чтобы отключить.';
$lang['send404'] = 'Посылать «HTTP404/Page Not Found»';
-$lang['sitemap'] = 'Число дней, через которое нужно создавать (обновлять) карту сайта для поисковиков (Гугл, Яндекс и др.)';
$lang['broken_iua'] = 'Возможно, функция ignore_user_abort не работает в вашей системе? Это может привести к потере функциональности индексирования поиска. Эта проблема присутствует, например, в IIS+PHP/CGI. Для дополнительной информации смотрите <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">баг 852</a>.';
$lang['xsendfile'] = 'Используете заголовок X-Sendfile для загрузки файлов на веб-сервер? Ваш веб-сервер должен поддерживать это.';
$lang['renderer_xhtml'] = 'Обработчик основного (xhtml) вывода вики';
$lang['renderer__core'] = '%s (ядро dokuwiki)';
$lang['renderer__plugin'] = '%s (плагин)';
-$lang['rememberme'] = 'Разрешить перманентные куки (cookies) для входа («запомнить меня»)';
-$lang['rss_type'] = 'Тип RSS';
-$lang['rss_linkto'] = 'Ссылки в RSS';
-$lang['rss_content'] = 'Что отображать в строках XML-ленты?';
-$lang['rss_update'] = 'Интервал обновления XML-ленты (сек.)';
-$lang['recent_days'] = 'На сколько дней назад сохранять недавние изменения';
-$lang['rss_show_summary'] = 'Показывать краткую выдержку в заголовках XML-ленты';
-$lang['target____wiki'] = 'target для внутренних ссылок';
-$lang['target____interwiki'] = 'target для ссылок между вики';
-$lang['target____extern'] = 'target для внешних ссылок';
-$lang['target____media'] = 'target для ссылок на медиафайлы';
-$lang['target____windows'] = 'target для ссылок на сетевые каталоги';
$lang['proxy____host'] = 'proxy-адрес';
$lang['proxy____port'] = 'proxy-порт';
$lang['proxy____user'] = 'proxy-имя пользователя';
diff --git a/lib/plugins/config/lang/sk/lang.php b/lib/plugins/config/lang/sk/lang.php
index 72ce10775..9e18b3ed9 100644
--- a/lib/plugins/config/lang/sk/lang.php
+++ b/lib/plugins/config/lang/sk/lang.php
@@ -27,6 +27,8 @@ $lang['_anti_spam'] = 'Nastavenia anti-spamu';
$lang['_editing'] = 'Nastavenia úprav';
$lang['_links'] = 'Nastavenia odkazov';
$lang['_media'] = 'Nastavenia médií';
+$lang['_notifications'] = 'Nastavenie upozornení';
+$lang['_syndication'] = 'Nastavenie poskytovania obsahu';
$lang['_advanced'] = 'Rozšírené nastavenia';
$lang['_network'] = 'Nastavenia siete';
$lang['_plugin_sufix'] = 'Nastavenia plug-inu';
@@ -34,26 +36,29 @@ $lang['_template_sufix'] = 'Nastavenia šablóny';
$lang['_msg_setting_undefined'] = 'Nenastavené metadata.';
$lang['_msg_setting_no_class'] = 'Nenastavená trieda.';
$lang['_msg_setting_no_default'] = 'Žiadna predvolená hodnota.';
-$lang['fmode'] = 'Spôsob vytvárania súborov';
-$lang['dmode'] = 'Spôsob vytvárania adresárov';
+$lang['title'] = 'Názov wiki';
+$lang['start'] = 'Názov štartovacej stránky';
$lang['lang'] = 'Jazyk';
+$lang['template'] = 'Šablóna';
+$lang['tagline'] = 'Slogan (ak ho šablóna podporuje)';
+$lang['sidebar'] = 'Meno bočného panela (ak ho šablóna podporuje), prázdne pole deaktivuje bočný panel';
+$lang['license'] = 'Pod ktorou licenciou bude publikovaný obsah stránky?';
+$lang['savedir'] = 'Adresár pre ukladanie dát';
$lang['basedir'] = 'Hlavný adresár (napr. <code>/dokuwiki/</code>). Prázdna hodnota znamená použitie autodetekcie.';
$lang['baseurl'] = 'Adresa servera (napr. <code>http://www.yourserver.com</code>). Prázdna hodnota znamená použitie autodetekcie.';
-$lang['savedir'] = 'Adresár pre ukladanie dát';
$lang['cookiedir'] = 'Cesta k cookies. Prázdna hodnota znamená použitie adresy servera.';
-$lang['start'] = 'Názov štartovacej stránky';
-$lang['title'] = 'Názov wiki';
-$lang['template'] = 'Šablóna';
-$lang['license'] = 'Pod ktorou licenciou bude publikovaný obsah stránky?';
-$lang['fullpath'] = 'Zobrazovať plnú cestu k stránkam v pätičke';
+$lang['dmode'] = 'Spôsob vytvárania adresárov';
+$lang['fmode'] = 'Spôsob vytvárania súborov';
+$lang['allowdebug'] = 'Povoliť ladenie chýb <b>deaktivujte, ak nie je potrebné!</b>';
$lang['recent'] = 'Posledné zmeny';
+$lang['recent_days'] = 'Koľko posledných zmien uchovávať (dni)';
$lang['breadcrumbs'] = 'Počet záznamov histórie';
$lang['youarehere'] = 'Nachádzate sa';
+$lang['fullpath'] = 'Zobrazovať plnú cestu k stránkam v pätičke';
$lang['typography'] = 'Vykonať typografické zmeny';
-$lang['htmlok'] = 'Umožniť vkladanie HTML';
-$lang['phpok'] = 'Umožniť vkladanie PHP';
$lang['dformat'] = 'Formát dátumu (pozri funkciu PHP <a href="http://www.php.net/strftime">strftime</a>)';
$lang['signature'] = 'Podpis';
+$lang['showuseras'] = 'Čo použiť pri zobrazení používateľa, ktorý posledný upravoval stránku';
$lang['toptoclevel'] = 'Najvyššia úroveň pre generovanie obsahu.';
$lang['tocminheads'] = 'Minimálny počet nadpisov pre generovanie obsahu';
$lang['maxtoclevel'] = 'Maximálna úroveň pre generovanie obsahu.';
@@ -61,15 +66,8 @@ $lang['maxseclevel'] = 'Maximálna úroveň sekcie pre editáciu';
$lang['camelcase'] = 'Použiť CamelCase pre odkazy';
$lang['deaccent'] = 'Upraviť názvy stránok';
$lang['useheading'] = 'Použiť nadpis pre názov stránky';
-$lang['refcheck'] = 'Kontrolovať odkazy na médiá (pred vymazaním)';
-$lang['refshow'] = 'Počet zobrazených odkazov na médiá';
-$lang['allowdebug'] = 'Povoliť ladenie chýb <b>deaktivujte, ak nie je potrebné!</b>';
-$lang['usewordblock'] = 'Blokovať spam na základe zoznamu známych slov';
-$lang['indexdelay'] = 'Časové oneskorenie pred indexovaním (sek)';
-$lang['relnofollow'] = 'Používať rel="nofollow" pre externé odkazy';
-$lang['mailguard'] = 'Zamaskovať e-mailovú adresu';
-$lang['iexssprotect'] = 'Kontrolovať nahraté súbory na prítomnosť nebezpečného JavaScript alebo HTML kódu';
-$lang['showuseras'] = 'Čo použiť pri zobrazení používateľa, ktorý posledný upravoval stránku';
+$lang['sneaky_index'] = 'DokuWiki implicitne ukazuje v indexe všetky menné priestory. Povolením tejto voľby sa nezobrazia menné priestory, ku ktorým nemá používateľ právo na čítanie. Dôsledkom môže byť nezobrazenie vnorených prístupných menných priestorov. Táto voľba môže mať za následok nepoužiteľnosť indexu s určitými ACL nastaveniami.';
+$lang['hidepages'] = 'Skryť zodpovedajúce stránky (regulárne výrazy)';
$lang['useacl'] = 'Použiť kontrolu prístupu (ACL)';
$lang['autopasswd'] = 'Autogenerovanie hesla';
$lang['authtype'] = 'Systém autentifikácie (back-end)';
@@ -78,60 +76,70 @@ $lang['defaultgroup'] = 'Predvolená skupina';
$lang['superuser'] = 'Správca - skupina, používateľ alebo čiarkou oddelený zoznam "pouzivatel1,@skupina1,pouzivatel2" s plným prístupom ku všetkým stránkam a funkciám nezávisle od ACL nastavení';
$lang['manager'] = 'Manažér - skupina, používateľ alebo čiarkou oddelený zoznam "pouzivatel1,@skupina1,pouzivatel2" s prístupom k vybraným správcovským funkciám';
$lang['profileconfirm'] = 'Potvrdzovať zmeny profilu heslom';
+$lang['rememberme'] = 'Povoliť trvalé prihlasovacie cookies (zapamätaj si ma)';
$lang['disableactions'] = 'Zakázať DokuWiki akcie';
$lang['disableactions_check'] = 'Skontrolovať';
$lang['disableactions_subscription'] = 'Povoliť/Zrušiť informovanie o zmenách stránky';
$lang['disableactions_wikicode'] = 'Pozrieť zdroj/Exportovať zdroj';
$lang['disableactions_other'] = 'Iné akcie (oddelené čiarkou)';
-$lang['sneaky_index'] = 'DokuWiki implicitne ukazuje v indexe všetky menné priestory. Povolením tejto voľby sa nezobrazia menné priestory, ku ktorým nemá používateľ právo na čítanie. Dôsledkom môže byť nezobrazenie vnorených prístupných menných priestorov. Táto voľba môže mať za následok nepoužiteľnosť indexu s určitými ACL nastaveniami.';
$lang['auth_security_timeout'] = 'Časový limit pri prihlasovaní (v sekundách)';
$lang['securecookie'] = 'Mal by prehliadač posielať cookies nastavené cez HTTPS posielať iba cez HTTPS (bezpečné) pripojenie? Vypnite túto voľbu iba v prípade, ak je prihlasovanie do Vašej wiki zabezpečené SSL, ale prezeranie wiki je nezabezpečené.';
-$lang['xmlrpc'] = 'Povoliť/zakázať XML-RPC rozhranie.';
-$lang['xmlrpcuser'] = 'Obmedziť XML-RPC prístup iba pre uvedené skupiny alebo používateľov (oddelených čiarkami).';
+$lang['remote'] = 'Povolenie vzdialeného API. Umožnuje iným aplikáciám pristupovať k wiki cez XML-RPC alebo iným spôsobom.';
+$lang['remoteuser'] = 'Obmedzenie použitia vzdialeného API skupinám alebo používateľom oddelených čiarkami. Prázdne pole poskytuje prístup pre každého používateľa.';
+$lang['usewordblock'] = 'Blokovať spam na základe zoznamu známych slov';
+$lang['relnofollow'] = 'Používať rel="nofollow" pre externé odkazy';
+$lang['indexdelay'] = 'Časové oneskorenie pred indexovaním (sek)';
+$lang['mailguard'] = 'Zamaskovať e-mailovú adresu';
+$lang['iexssprotect'] = 'Kontrolovať nahraté súbory na prítomnosť nebezpečného JavaScript alebo HTML kódu';
+$lang['usedraft'] = 'Automaticky ukladať koncept počas úpravy stránky';
+$lang['htmlok'] = 'Umožniť vkladanie HTML';
+$lang['phpok'] = 'Umožniť vkladanie PHP';
+$lang['locktime'] = 'Maximálne trvanie blokovacích súborov (sek)';
+$lang['cachetime'] = 'Maximálne trvanie cache (sek)';
+$lang['target____wiki'] = 'Cieľové okno (target) pre interné odkazy';
+$lang['target____interwiki'] = 'Cieľové okno (target) pre interwiki odkazy';
+$lang['target____extern'] = 'Cieľové okno (target) pre externé odkazy';
+$lang['target____media'] = 'Cieľové okno (target) pre media odkazy';
+$lang['target____windows'] = 'Cieľové okno (target) pre windows odkazy';
+$lang['mediarevisions'] = 'Povoliť verzie súborov?';
+$lang['refcheck'] = 'Kontrolovať odkazy na médiá (pred vymazaním)';
+$lang['refshow'] = 'Počet zobrazených odkazov na médiá';
+$lang['gdlib'] = 'Verzia GD Lib';
+$lang['im_convert'] = 'Cesta k ImageMagick convert tool';
+$lang['jpg_quality'] = 'Kvalita JPG kompresie (0-100)';
+$lang['fetchsize'] = 'Maximálna veľkosť (v bajtoch) pri sťahovaní z externých zdrojov';
+$lang['subscribers'] = 'Povoliť podporu informovania o zmenách stránky';
+$lang['subscribe_time'] = 'Časový inteval, po uplynutí ktorého sú zasielané informácie o zmenách stránky alebo menného priestoru (sek); hodnota by mala byť menšia ako čas zadaný pri položke recent_days.';
+$lang['notify'] = 'Posielať upozornenia na zmeny na túto e-mailovú adresu';
+$lang['registernotify'] = 'Posielať informáciu o nových užívateľoch na túto e-mailovú adresu';
+$lang['mailfrom'] = 'E-mailová adresa na automatické e-maily';
+$lang['mailprefix'] = 'Prefix predmetu emailovej spravy zasielanej automaticky';
+$lang['htmlmail'] = 'Posielanie lepšie vyzerajúceho ale objemnejšieho HTML mailu. Deaktivovaním sa budú posielať iba textové maily.';
+$lang['sitemap'] = 'Generovať Google sitemap (dni)';
+$lang['rss_type'] = 'Typ XML feedu';
+$lang['rss_linkto'] = 'XML zdroj odkazuje na';
+$lang['rss_content'] = 'Čo zobrazovať v XML feede?';
+$lang['rss_update'] = 'Časový interval obnovy XML feedu (sek.)';
+$lang['rss_show_summary'] = 'XML zdroj ukáže prehľad v názve';
+$lang['rss_media'] = 'Aký typ zmien by mal byť zobrazený v XML feede?';
$lang['updatecheck'] = 'Kontrolovať aktualizácie a bezpečnostné upozornenia? DokuWiki potrebuje pre túto funkciu prístup k update.dokuwiki.org.';
$lang['userewrite'] = 'Používať nice URLs';
$lang['useslash'] = 'Používať lomku (/) ako oddeľovač v URL';
-$lang['usedraft'] = 'Automaticky ukladať koncept počas úpravy stránky';
$lang['sepchar'] = 'Oddeľovač slov v názvoch stránok';
$lang['canonical'] = 'Používať plne kanonické URL názvy';
$lang['fnencode'] = 'Spôsob kódovania non-ASCII mien súborov.';
$lang['autoplural'] = 'Kontrolovať množné číslo v odkazoch';
$lang['compression'] = 'Metóda kompresie pre staré verzie stránok';
-$lang['cachetime'] = 'Maximálne trvanie cache (sek)';
-$lang['locktime'] = 'Maximálne trvanie blokovacích súborov (sek)';
-$lang['fetchsize'] = 'Maximálna veľkosť (v bajtoch) pri sťahovaní z externých zdrojov';
-$lang['notify'] = 'Posielať upozornenia na zmeny na túto e-mailovú adresu';
-$lang['registernotify'] = 'Posielať informáciu o nových užívateľoch na túto e-mailovú adresu';
-$lang['mailfrom'] = 'E-mailová adresa na automatické e-maily';
-$lang['mailprefix'] = 'Prefix predmetu emailovej spravy zasielanej automaticky';
$lang['gzip_output'] = 'Používať gzip Content-Encoding pre xhtml';
-$lang['gdlib'] = 'Verzia GD Lib';
-$lang['im_convert'] = 'Cesta k ImageMagick convert tool';
-$lang['jpg_quality'] = 'Kvalita JPG kompresie (0-100)';
-$lang['subscribers'] = 'Povoliť podporu informovania o zmenách stránky';
-$lang['subscribe_time'] = 'Časový inteval, po uplynutí ktorého sú zasielané informácie o zmenách stránky alebo menného priestoru (sek); hodnota by mala byť menšia ako čas zadaný pri položke recent_days.';
$lang['compress'] = 'Komprimovať CSS a javascript výstup';
$lang['cssdatauri'] = 'Veľkosť v bytoch, do ktorej by mali byť obrázky s odkazom v CSS vložené priamo do štýlu z dôvodu obmedzenia HTTP požiadaviek. Tento postup nefunguje v IE verzie 7 a nižšie! Vhodná hodnota je od <code>400</code> do <code>600</code> bytov. Hodnota <code>0</code> deaktivuje túto metódu.';
-$lang['hidepages'] = 'Skryť zodpovedajúce stránky (regulárne výrazy)';
$lang['send404'] = 'Poslať "HTTP 404/Page Not Found" pre neexistujúce stránky';
-$lang['sitemap'] = 'Generovať Google sitemap (dni)';
$lang['broken_iua'] = 'Je vo Vašom systéme funkcia ignore_user_abort poškodená? Môže to mať za následok nefunkčnosť vyhľadávania v indexe. IIS+PHP/CGI je známy tým, že nefunguje správne. Pozrite <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> pre dalšie informácie.';
$lang['xsendfile'] = 'Používať X-Sendfile hlavičku pre doručenie statických súborov webserverom? Webserver musí túto funkcionalitu podporovať.';
$lang['renderer_xhtml'] = 'Používané vykresľovacie jadro pre hlavný (xhtml) wiki výstup';
$lang['renderer__core'] = '%s (dokuwiki jadro)';
$lang['renderer__plugin'] = '%s (plugin)';
-$lang['rememberme'] = 'Povoliť trvalé prihlasovacie cookies (zapamätaj si ma)';
-$lang['rss_type'] = 'Typ XML feedu';
-$lang['rss_linkto'] = 'XML zdroj odkazuje na';
-$lang['rss_content'] = 'Čo zobrazovať v XML feede?';
-$lang['rss_update'] = 'Časový interval obnovy XML feedu (sek.)';
-$lang['recent_days'] = 'Koľko posledných zmien uchovávať (dni)';
-$lang['rss_show_summary'] = 'XML zdroj ukáže prehľad v názve';
-$lang['target____wiki'] = 'Cieľové okno (target) pre interné odkazy';
-$lang['target____interwiki'] = 'Cieľové okno (target) pre interwiki odkazy';
-$lang['target____extern'] = 'Cieľové okno (target) pre externé odkazy';
-$lang['target____media'] = 'Cieľové okno (target) pre media odkazy';
-$lang['target____windows'] = 'Cieľové okno (target) pre windows odkazy';
+$lang['dnslookups'] = 'DokuWiki hľadá mená vzdialených IP adries používateľov editujúcich stránky. Ak máte pomalý alebo nefunkčný DNS server alebo nechcete túto možnosť, deaktivujte túto voľbu';
$lang['proxy____host'] = 'Proxy server - názov';
$lang['proxy____port'] = 'Proxy server - port';
$lang['proxy____user'] = 'Proxy server - užívateľské meno';
diff --git a/lib/plugins/config/lang/sl/lang.php b/lib/plugins/config/lang/sl/lang.php
index dadd01595..364e0fd7f 100644
--- a/lib/plugins/config/lang/sl/lang.php
+++ b/lib/plugins/config/lang/sl/lang.php
@@ -7,7 +7,6 @@
* @author Gregor Skumavc (grega.skumavc@gmail.com)
* @author Matej Urbančič (mateju@svn.gnome.org)
*/
-
$lang['menu'] = 'Splošne nastavitve';
$lang['error'] = 'Nastavitve niso shranjene zaradi neveljavne vrednosti.<br />Neveljavna vrednost je označena z rdečim robom vnosnega polja.';
$lang['updated'] = 'Nastavitve so uspešno posodobljene.';
@@ -27,7 +26,7 @@ $lang['_authentication'] = 'Nastavitve overjanja';
$lang['_anti_spam'] = 'Nastavitve neželenih sporočil (Anti-Spam)';
$lang['_editing'] = 'Nastavitve urejanja';
$lang['_links'] = 'Nastavitve povezav';
-$lang['_media'] = 'Predstavnostne nastavitve';
+$lang['_media'] = 'Predstavne nastavitve';
$lang['_advanced'] = 'Napredne nastavitve';
$lang['_network'] = 'Omrežne nastavitve';
$lang['_plugin_sufix'] = 'nastavitve';
@@ -41,9 +40,12 @@ $lang['lang'] = 'Jezik vmesnika';
$lang['basedir'] = 'Pot do strežnika (npr. /dokuwiki/). Prazno polje določa samodejno zaznavanje';
$lang['baseurl'] = 'Naslov URL strežnika (npr. http://www.streznik.si). Prazno polje določa samodejno zaznavanje';
$lang['savedir'] = 'Mapa za shranjevanje podatkov';
+$lang['cookiedir'] = 'Pot do piškotka. Prazno polje določa uporabo osnovnega naslova (baseurl)';
$lang['start'] = 'Ime začetne strani wiki';
$lang['title'] = 'Naslov Wiki spletišča';
$lang['template'] = 'Predloga';
+$lang['tagline'] = 'Označna vrstica (ob podpori predloge)';
+$lang['sidebar'] = 'Ime strani stranske vrstice (ob podpori predloge); prazno polje onemogoči stransko vrstico.';
$lang['license'] = 'Pod pogoji katerega dovoljenja je objavljena vsebina?';
$lang['fullpath'] = 'Pokaži polno pot strani v nogi strani';
$lang['recent'] = 'Nedavne spremembe';
@@ -62,8 +64,9 @@ $lang['camelcase'] = 'Uporabi EnoBesedni zapisa za povezave';
$lang['deaccent'] = 'Počisti imena strani';
$lang['useheading'] = 'Uporabi prvi naslov za ime strani';
$lang['refcheck'] = 'Preverjanje sklica predstavnih datotek';
-$lang['refshow'] = 'Število predstavnostnih sklicev za prikaz';
+$lang['refshow'] = 'Število predstavih sklicev za prikaz';
$lang['allowdebug'] = 'Dovoli razhroščevanje (po potrebi!)';
+$lang['mediarevisions'] = 'Ali naj se omogočijo objave predstavnih vsebin?';
$lang['usewordblock'] = 'Zaustavi neželeno besedilo glede na seznam besed';
$lang['indexdelay'] = 'Časovni zamik pred ustvarjanjem kazala (v sekundah)';
$lang['relnofollow'] = 'Uporabni možnost rel="nofollow" pri zunanjih povezavah';
@@ -86,8 +89,6 @@ $lang['disableactions_other'] = 'Druga dejanja (z vejico ločen seznam)';
$lang['sneaky_index'] = 'Privzeto pokaže sistem DokuWiki vse imenske prostore v pogledu kazala. Z omogočanjem te možnosti bodo skriti vsi imenski prostori, v katere prijavljen uporabnik nima dovoljenj dostopa. S tem je mogoče preprečiti dostop do podrejenih strani. Možnost lahko vpliva na uporabnost nastavitev nadzora dostopa ACL.';
$lang['auth_security_timeout'] = 'Varnostna časovna omejitev overitve (v sekundah)';
$lang['securecookie'] = 'Ali naj se piškotki poslani preko varne povezave HTTPS v brskalniku pošiljajo le preko HTTPS? Onemogočanje možnosti je priporočljivo le takrat, ko je prijava varovana s protokolom SSL, brskanje po strani pa ni posebej zavarovano.';
-$lang['xmlrpc'] = 'Omogoči/Onemogoči vmesnik XML-RPC.';
-$lang['xmlrpcuser'] = 'Omejitev dostopa do vmesnika XML-RPC z vejico ločenim seznamom skupin in uporabnikov. Prazno polje pomeni, prost dostop za vse uporabnike.';
$lang['updatecheck'] = 'Ali naj sistem preveri za posodobitve in varnostna opozorila.';
$lang['userewrite'] = 'Uporabi olepšan zapis naslovov URL';
$lang['useslash'] = 'Uporabi poševnico kot ločilnik imenskih prostorov v naslovih URL';
@@ -103,6 +104,7 @@ $lang['fetchsize'] = 'največja dovoljena velikost zunanjega prejema
$lang['notify'] = 'Pošlji obvestila o spremembah na določen elektronski naslov';
$lang['registernotify'] = 'Pošlji obvestila o novih vpisanih uporabnikih na določen elektronski naslov';
$lang['mailfrom'] = 'Elektronski naslov za samodejno poslana sporočila';
+$lang['mailprefix'] = 'Predpona zadeve elektronskega sporočila za samodejna sporočila.';
$lang['gzip_output'] = 'Uporabi stiskanje gzip vsebine za xhtml';
$lang['gdlib'] = 'Različica GD Lib';
$lang['im_convert'] = 'Pot do orodja za pretvarjanje slik ImageMagick';
@@ -110,6 +112,7 @@ $lang['jpg_quality'] = 'Kakovost stiskanja datotek JPG (0-100)';
$lang['subscribers'] = 'Omogoči podporo naročanju na strani';
$lang['subscribe_time'] = 'Čas po katerem so poslani povzetki sprememb (v sekundah); Vrednost mora biti krajša od časa, ki je določen z nedavno_dni.';
$lang['compress'] = 'Združi odvod CSS in JavaScript v brskalniku';
+$lang['cssdatauri'] = 'Velikost sklicanih slik v bajtih, ki so navedene v datotekah CSS za zmanjšanje zahtev osveževanja strežnika HTTP. Ta možnost ni podprta v brskalniku MS IE 7 in nižjih različicah! Ustrezne vrednosti so <code>400</code> do <code>600</code> bajtov. Vrednost <code>0</code> onemogoči možnost.';
$lang['hidepages'] = 'Skrij skladne strani (logični izraz)';
$lang['send404'] = 'Pošlji "HTTP 404/Strani ni mogoče najti" pri dostopu do neobstoječih strani';
$lang['sitemap'] = 'Ustvari Google kazalo strani (v dnevih)';
@@ -172,9 +175,9 @@ $lang['compression_o_0'] = 'brez';
$lang['compression_o_gz'] = 'gzip';
$lang['compression_o_bz2'] = 'bz2';
$lang['xsendfile_o_0'] = 'ne uporabi';
-$lang['xsendfile_o_1'] = 'plačniška glava lighttpd (pred različico 1.5)';
+$lang['xsendfile_o_1'] = 'lastniška glava lighttpd (pred različico 1.5)';
$lang['xsendfile_o_2'] = 'običajna glava X-Sendfile';
-$lang['xsendfile_o_3'] = 'plačniška glava Nginx X-Accel-Redirect';
+$lang['xsendfile_o_3'] = 'lastniška glava Nginx X-Accel-Redirect';
$lang['showuseras_o_loginname'] = 'Prijavno ime';
$lang['showuseras_o_username'] = 'Polno ime uporabnika';
$lang['showuseras_o_email'] = 'Elektronski naslov uporabnika (šifriran po določilih varovanja)';
diff --git a/lib/plugins/config/lang/sq/lang.php b/lib/plugins/config/lang/sq/lang.php
index adeb2a47d..69e283b11 100644
--- a/lib/plugins/config/lang/sq/lang.php
+++ b/lib/plugins/config/lang/sq/lang.php
@@ -83,8 +83,6 @@ $lang['disableactions_other'] = 'Veprime të tjera (të ndarë me presje)';
$lang['sneaky_index'] = 'Vetiu DokuWiki tregon të gjithë hapësirat e emrit në shikimin e index-it. Aktivizimi i kësaj alternative do të fshehë ato ku përdoruesi nuk ka të drejta leximi. Kjo mund të përfundojë në fshehje të nënhapësirave të emrit të aksesueshme. Kjo mund ta bëjë index-in të papërdorshëm me disa konfigurime të caktuara të ACL-së.';
$lang['auth_security_timeout'] = 'Koha e Përfundimit për Autentikim (sekonda)';
$lang['securecookie'] = 'A duhet që cookies të vendosura nëpërmjet HTTPS të dërgohen vetëm nëpërmjet HTTPS nga shfletuesit? Caktivizojeni këtë alternativë kur vetëm hyrja në wiki-n tuaj sigurohet me SSL por shfletimi i wiki-t bëhet në mënyrë të pasigurtë.';
-$lang['xmlrpc'] = 'Aktivizo/Caktivizo ndërfaqen XML-RPC';
-$lang['xmlrpcuser'] = 'Kufizo aksesin XML-RPC vetëm tek grupet ose përdoruesit e ndarë me presje të dhënë këtu. Lëre bosh për t\'i dhënë akses të gjithëve.';
$lang['updatecheck'] = 'Kontrollo për përditësime dhe paralajmërime sigurie? DokuWiki duhet të kontaktojë me update.dokuwiki.org për këtë veti.';
$lang['userewrite'] = 'Përdor URL të këndshme.';
$lang['useslash'] = 'Përdor / si ndarës të hapësirave të emrit në URL';
diff --git a/lib/plugins/config/lang/sr/lang.php b/lib/plugins/config/lang/sr/lang.php
index 5906dcd7e..c675b84e6 100644
--- a/lib/plugins/config/lang/sr/lang.php
+++ b/lib/plugins/config/lang/sr/lang.php
@@ -84,8 +84,6 @@ $lang['disableactions_other'] = 'Остале наредбе (раздвоје
$lang['sneaky_index'] = 'По инсталацији DokuWiki ће у индексу приказати све именске просторе. Укључивањем ове опције именски простори у којима корисник нема право читања ће бити сакривени. Консеквенца је да ће и доступни подпростори бити сакривени. Ово доводи до неупотребљивости Права приступа у неким поставкама.';
$lang['auth_security_timeout'] = 'Временска пауза у аутентификацији (секунде)';
$lang['securecookie'] = 'Да ли колачићи који су постављени преко ХТТПС треба слати веб читачу само преко ХТТПС? Искључите ову опцију само ако је пријављивање на вики заштићено ССЛом а остали део викија незаштићен.';
-$lang['xmlrpc'] = 'Укључи/искључи ИксМЛ-РПЦ интерфејс';
-$lang['xmlrpcuser'] = 'Ограничи ИксМЛ-РПЦ приступ на наведене групе корисника раздвојене зарезом. Остави празно да би свима дао приступ.';
$lang['updatecheck'] = 'Провера надоградњи и сигурносних упозорења? Dokuwiki мора да контактира update.dokuwiki.org ради добијања информација.';
$lang['userewrite'] = 'Направи леп УРЛ';
$lang['useslash'] = 'Користи косу црту у УРЛу за раздвајање именских простора ';
diff --git a/lib/plugins/config/lang/sv/lang.php b/lib/plugins/config/lang/sv/lang.php
index dfd93d37d..3d8392840 100644
--- a/lib/plugins/config/lang/sv/lang.php
+++ b/lib/plugins/config/lang/sv/lang.php
@@ -97,8 +97,6 @@ $lang['disableactions_other'] = 'Andra funktioner (kommaseparerade)';
$lang['sneaky_index'] = 'Som standard visar DokuWiki alla namnrymder på indexsidan. Genom att aktivera det här valet döljer man namnrymder som användaren inte har behörighet att läsa. Det kan leda till att man döljer åtkomliga undernamnrymder, och gör indexet oanvändbart med vissa ACL-inställningar.';
$lang['auth_security_timeout'] = 'Autentisieringssäkerhets timeout (sekunder)';
$lang['securecookie'] = 'Skall cookies som sätts via HTTPS endast skickas via HTTPS från webbläsaren? Avaktivera detta alternativ endast om inloggningen till din wiki är säkrad med SSL men läsning av wikin är osäkrad.';
-$lang['xmlrpc'] = 'Aktivera/avaktivera XML-RPC-gränssnitt';
-$lang['xmlrpcuser'] = 'Begränsa XML-RPC tillträde till komma separerade grupper eller användare som ges här. Lämna tomt för att ge tillgång till alla.';
$lang['updatecheck'] = 'Kontrollera uppdateringar och säkerhetsvarningar? DokuWiki behöver kontakta update.dokuwiki.org för den här funktionen.';
$lang['userewrite'] = 'Använd rena webbadresser';
$lang['useslash'] = 'Använd snedstreck för att separera namnrymder i webbadresser';
diff --git a/lib/plugins/config/lang/th/lang.php b/lib/plugins/config/lang/th/lang.php
index ce7c55e91..140a287df 100644
--- a/lib/plugins/config/lang/th/lang.php
+++ b/lib/plugins/config/lang/th/lang.php
@@ -41,7 +41,6 @@ $lang['defaultgroup'] = 'กลุ่มมาตรฐาน';
$lang['profileconfirm'] = 'ใส่รหัสผ่านเพื่อยืนยันการเปลี่ยนแปลงข้อมูล';
$lang['disableactions_check'] = 'ตรวจสอบ';
$lang['auth_security_timeout'] = 'ระยะเวลาที่จะตัดการเชื่อมต่อแบบการใช้งานด้วยสิทธิ์ผู้ใช้ (วินาที)';
-$lang['xmlrpc'] = 'ใช้งาน/ยกเลิก การเชื่อมต่อแบบ XML-RPC';
$lang['userewrite'] = 'แสดงที่อยู่เว็บ (URL) แบบอ่านเข้าใจง่าย';
$lang['cachetime'] = 'ระยะเวลาสำหรับการเก็บแคช (วินาที)';
$lang['locktime'] = 'ระยะเวลานานสุด ที่จะล็อคไม่ให้แก้ไขไฟล์ (วินาที)';
diff --git a/lib/plugins/config/lang/uk/intro.txt b/lib/plugins/config/lang/uk/intro.txt
index 7255c30f9..87abe1be3 100644
--- a/lib/plugins/config/lang/uk/intro.txt
+++ b/lib/plugins/config/lang/uk/intro.txt
@@ -1,6 +1,6 @@
-====== Настройка конфігурації ======
+====== Налаштування Вікі ======
-Використовуйте цю сторінку для настройки ДокуВікі. Для довідок щодо конкретних параметрів дивіться [[doku>config]]. Для більш детальної інформації про цей доданок дивіться [[doku>plugin:config]].
+Використовуйте цю сторінку для налаштування ДокуВікі. Для довідок щодо конкретних параметрів дивіться [[doku>config]]. Для більш детальної інформації про цей доданок дивіться [[doku>plugin:config]].
Параметри, що виділені червоним кольором тла захищені та не можуть бути змінені за допомогою цього доданка. Параметри, з синім кольором тла мають значення по замовчуванню, а параметри з білим тлом були встановлені для цієї локальної інсталяції. Сині та білі параметри можуть бути змінені.
diff --git a/lib/plugins/config/lang/uk/lang.php b/lib/plugins/config/lang/uk/lang.php
index 72d7e12f5..3d463fc72 100644
--- a/lib/plugins/config/lang/uk/lang.php
+++ b/lib/plugins/config/lang/uk/lang.php
@@ -11,54 +11,56 @@
* @author Ulrikhe Lukoie <lukoie@gmail>.com
* @author Kate Arzamastseva pshns@ukr.net
*/
-$lang['menu'] = 'Настройка конфігурації';
+$lang['menu'] = 'Налаштування Вікі';
$lang['error'] = 'Параметри не збережено через помилкові значення. Будь ласка, перегляньте ваші зміни та спробуйте ще раз
<br />Помилкові значення будуть виділені червоною рамкою.';
$lang['updated'] = 'Параметри успішно збережено.';
$lang['nochoice'] = '(інших варіантів не існує)';
-$lang['locked'] = 'Неможливо записати файл настройки. Переконайтеся, <br />
+$lang['locked'] = 'Неможливо записати файл налаштувань. Переконайтеся, <br />
що ім\'я та права доступу для локального файлу вказано правильно.';
$lang['danger'] = 'УВАГА! Зміна цього параметру може призвести до недоступності вашої Вікі та меню конфігурації.';
$lang['warning'] = 'УВАГА! Зміна цього параметру може призвести до непередбачуваних наслідків.';
$lang['security'] = 'УВАГА! Зміна цього параметру може призвести до послаблення безпеки вашої Вікі.';
$lang['_configuration_manager'] = 'Управління конфігурацією';
-$lang['_header_dokuwiki'] = 'Настройки ДокуВікі';
-$lang['_header_plugin'] = 'Настройки Доданків';
-$lang['_header_template'] = 'Настройки шаблонів';
-$lang['_header_undefined'] = 'Невизначені настройки';
-$lang['_basic'] = 'Базові настройки';
-$lang['_display'] = 'Настройки дисплея';
-$lang['_authentication'] = 'Настройки автентифікації';
-$lang['_anti_spam'] = 'Настройки Анти-спаму';
-$lang['_editing'] = 'Настройки редагування';
-$lang['_links'] = 'Настройки посилань';
-$lang['_media'] = 'Настройки медіа';
-$lang['_advanced'] = 'Розширені настройки';
-$lang['_network'] = 'Настройки мережі';
-$lang['_plugin_sufix'] = 'Настройки (доданок)';
-$lang['_template_sufix'] = 'Настройки (шаблон)';
+$lang['_header_dokuwiki'] = 'Налаштування ДокуВікі';
+$lang['_header_plugin'] = 'Налаштування Доданків';
+$lang['_header_template'] = 'Налаштування шаблонів';
+$lang['_header_undefined'] = 'Невизначені налаштування';
+$lang['_basic'] = 'Базові налаштування';
+$lang['_display'] = 'Налаштування відображення';
+$lang['_authentication'] = 'Налаштування автентифікації';
+$lang['_anti_spam'] = 'Налаштування Анти-спаму';
+$lang['_editing'] = 'Налаштування редагування';
+$lang['_links'] = 'Налаштування посилань';
+$lang['_media'] = 'Налаштування медіа';
+$lang['_notifications'] = 'Налаштування сповіщень';
+$lang['_advanced'] = 'Розширені налаштування';
+$lang['_network'] = 'Налаштування мережі';
+$lang['_plugin_sufix'] = 'Налаштування (доданок)';
+$lang['_template_sufix'] = 'Налаштування (шаблон)';
$lang['_msg_setting_undefined'] = 'Немає метаданих параметру.';
$lang['_msg_setting_no_class'] = 'Немає класу параметру.';
$lang['_msg_setting_no_default'] = 'Немає значення за замовчуванням.';
-$lang['fmode'] = 'Права для створених файлів';
-$lang['dmode'] = 'Права для створених папок';
-$lang['lang'] = 'Мова';
-$lang['basedir'] = 'Коренева папка';
-$lang['baseurl'] = 'Кореневий URL';
-$lang['savedir'] = 'Папка для збереження даних';
-$lang['start'] = 'Назва стартової сторінки';
$lang['title'] = 'Назва Вікі';
+$lang['start'] = 'Назва стартової сторінки';
+$lang['lang'] = 'Мова';
$lang['template'] = 'Шаблон';
$lang['license'] = 'Під якою ліцензією слід публікувати вміст?';
-$lang['fullpath'] = 'Повний шлях до документу';
+$lang['savedir'] = 'Папка для збереження даних';
+$lang['basedir'] = 'Коренева папка';
+$lang['baseurl'] = 'Кореневий URL';
+$lang['dmode'] = 'Права для створених папок';
+$lang['fmode'] = 'Права для створених файлів';
+$lang['allowdebug'] = 'Дозволити відлагодження <b>вимкніть, якщо не потрібно!</b>';
$lang['recent'] = 'Останні зміни';
+$lang['recent_days'] = 'Скільки останніх змін пам\'ятати (дні)';
$lang['breadcrumbs'] = 'Ви відвідали (кількість сторінок, що показується)';
$lang['youarehere'] = 'Показувати "Ви тут"';
+$lang['fullpath'] = 'Повний шлях до документу';
$lang['typography'] = 'Замінювати типографські символи';
-$lang['htmlok'] = 'Дозволити HTML';
-$lang['phpok'] = 'Дозволити PHP';
$lang['dformat'] = 'Формат дати (дивіться функцію <a href="http://www.php.net/strftime">strftime</a> PHP)';
$lang['signature'] = 'Підпис';
+$lang['showuseras'] = 'Що вказувати при відображенні користувача, який востаннє редагував сторінку';
$lang['toptoclevel'] = 'Мінімальний рівень для змісту';
$lang['tocminheads'] = 'Мінімальна кількість заголовків, необхідна для створення таблиці змісту';
$lang['maxtoclevel'] = 'Максимальний рівень для таблиці змісту';
@@ -66,15 +68,8 @@ $lang['maxseclevel'] = 'Максимальний рівень секц
$lang['camelcase'] = 'Використовувати CamelCase';
$lang['deaccent'] = 'Транслітерація в іменах сторінок';
$lang['useheading'] = 'Першій заголовок замість імені';
-$lang['refcheck'] = 'Перевіряти посилання на медіа-файлі';
-$lang['refshow'] = 'Показувати кількість медіа-посилань';
-$lang['allowdebug'] = 'Дозволити відлагодження <b>вимкніть, якщо не потрібно!</b>';
-$lang['usewordblock'] = 'Блокувати спам по списку слів';
-$lang['indexdelay'] = 'Затримка перед індексацією';
-$lang['relnofollow'] = 'Використовувати rel="nofollow"';
-$lang['mailguard'] = 'Кодувати адреси e-mail';
-$lang['iexssprotect'] = 'Перевірте оновлені файли на можливі заборонені Javascript чи HTML коди';
-$lang['showuseras'] = 'Що вказувати при відображенні користувача, який востаннє редагував сторінку';
+$lang['sneaky_index'] = 'За замовчуванням, ДокуВікі показує всі простори імен в змісті. Активація цієї опції сховає ті простори, де користувач не має прав на читання. Результатом може бути неможливість доступу до певних відкритих просторів імен. Це зробить неможливим використання змісту при певних конфігураціях.';
+$lang['hidepages'] = 'Ховати сторінки (regular expressions)';
$lang['useacl'] = 'Використовувати ACL';
$lang['autopasswd'] = 'Автоматичне створення паролів';
$lang['authtype'] = 'Аутентифікація';
@@ -83,59 +78,63 @@ $lang['defaultgroup'] = 'Група за замовчуванням';
$lang['superuser'] = 'Суперкористувач';
$lang['manager'] = 'Менеджер - група, користувач чи розділений комами список user1,@group1,user2 з правами до певних функцій керування';
$lang['profileconfirm'] = 'Підтверджувати зміни профілю паролем';
+$lang['rememberme'] = 'Дозволити постійні файли cookies для входу (Запам\'ятати мене)';
$lang['disableactions'] = 'Заборонити дії ДокуВікі';
$lang['disableactions_check'] = 'Перевірити';
$lang['disableactions_subscription'] = 'Підписатись/Відписатись';
$lang['disableactions_wikicode'] = 'Переглянути код/Експорт';
$lang['disableactions_other'] = 'Інші дії (розділені комами)';
-$lang['sneaky_index'] = 'За замовчуванням, ДокуВікі показує всі простори імен в змісті. Активація цієї опції сховає ті простори, де користувач не має прав на читання. Результатом може бути неможливість доступу до певних відкритих просторів імен. Це зробить неможливим використання змісту при певних конфігураціях.';
$lang['auth_security_timeout'] = 'Таймаут аутентифікації (в секундах)';
$lang['securecookie'] = 'Чи повинен браузер надсилати файли cookies тільки через HTTPS? Вимкніть цей параметр, лише тоді, якщо вхід до Вікі захищено SSL, але перегляд сторінок відбувається у незахищеному режимі.';
-$lang['xmlrpc'] = 'Дозволити/заборонити XML-RPC інтерфейс';
-$lang['xmlrpcuser'] = 'Заборонити XML-RPC доступ до користувачів або груп поданих тут та розділених комою. Залишіть поле незаповненим, щоб дозволити доступ усім.';
+$lang['usewordblock'] = 'Блокувати спам по списку слів';
+$lang['relnofollow'] = 'Використовувати rel="nofollow"';
+$lang['indexdelay'] = 'Затримка перед індексацією';
+$lang['mailguard'] = 'Кодувати адреси e-mail';
+$lang['iexssprotect'] = 'Перевірте оновлені файли на можливі заборонені Javascript чи HTML коди';
+$lang['usedraft'] = 'Автоматично зберігати чернетку при редагуванні';
+$lang['htmlok'] = 'Дозволити HTML';
+$lang['phpok'] = 'Дозволити PHP';
+$lang['locktime'] = 'Час блокування (сек)';
+$lang['cachetime'] = 'Максимальний вік кешу (сек)';
+$lang['target____wiki'] = 'Target для внутрішніх посилань';
+$lang['target____interwiki'] = 'Target для інтерВікі-посилань';
+$lang['target____extern'] = 'Target для зовнішніх посилань';
+$lang['target____media'] = 'Target для медіа-посилань';
+$lang['target____windows'] = 'Target для посилань на мережеві папки';
+$lang['refcheck'] = 'Перевіряти посилання на медіа-файлі';
+$lang['refshow'] = 'Показувати кількість медіа-посилань';
+$lang['gdlib'] = 'Версія GD Lib';
+$lang['im_convert'] = 'Шлях до ImageMagick';
+$lang['jpg_quality'] = 'Якість компресії JPG (0-100)';
+$lang['fetchsize'] = 'Максимальний розмір (в байтах), що fetch.php може завантажувати з зовні';
+$lang['subscribers'] = 'Підписка на зміни';
+$lang['subscribe_time'] = 'Час, після якого список підписки та дайджести будуть надіслані (сек.); Має бути меншим за час, вказаний у перемінній recent_days';
+$lang['notify'] = 'E-mail для сповіщень';
+$lang['registernotify'] = 'Надсилати інформацію про нових користувачів на цю адресу';
+$lang['mailfrom'] = 'E-mail для автоматичних повідомлень';
+$lang['mailprefix'] = 'Префікс теми повідомлення, що використовується в автоматичній розсилці електронних листів';
+$lang['sitemap'] = 'Створювати мапу сайту для Google (дні)';
+$lang['rss_type'] = 'тип RSS';
+$lang['rss_linkto'] = 'посилання в RSS';
+$lang['rss_content'] = 'Що відображати в пунктах XML-feed';
+$lang['rss_update'] = 'Інтервал оновлення RSS (сек)';
+$lang['rss_show_summary'] = 'Показувати підсумки змін в заголовку XML-feed';
$lang['updatecheck'] = 'Перевірити наявність оновлень чи попереджень безпеки? Для цього ДокуВікі необхідно зв\'язатися зі update.dokuwiki.org.';
$lang['userewrite'] = 'Красиві URL';
$lang['useslash'] = 'Слеш, як розділювач просторів імен в URL';
-$lang['usedraft'] = 'Автоматично зберігати чернетку при редагуванні';
$lang['sepchar'] = 'Розділювач слів у імені сторінки';
$lang['canonical'] = 'Канонічні URL';
$lang['fnencode'] = 'Метод для кодування імен файлів, що містять не ASCII символи.';
$lang['autoplural'] = 'Перевіряти множину у посиланнях';
$lang['compression'] = 'Метод стиснення attic файлів';
-$lang['cachetime'] = 'Максимальний вік кешу (сек)';
-$lang['locktime'] = 'Час блокування (сек)';
-$lang['fetchsize'] = 'Максимальний розмір (в байтах), що fetch.php може завантажувати з зовні';
-$lang['notify'] = 'E-mail для сповіщень';
-$lang['registernotify'] = 'Надсилати інформацію про нових користувачів на цю адресу';
-$lang['mailfrom'] = 'E-mail для автоматичних повідомлень';
-$lang['mailprefix'] = 'Префікс теми повідомлення, що використовується в автоматичній розсилці електронних листів';
$lang['gzip_output'] = 'Використовувати gzip, як Content-Encoding для xhtml';
-$lang['gdlib'] = 'Версія GD Lib';
-$lang['im_convert'] = 'Шлях до ImageMagick';
-$lang['jpg_quality'] = 'Якість компресії JPG (0-100)';
-$lang['subscribers'] = 'Підписка на зміни';
-$lang['subscribe_time'] = 'Час, після якого список підписки та дайджести будуть надіслані (сек.); Має бути меншим за час, вказаний у перемінній recent_days';
$lang['compress'] = 'Стискати файли CSS та javascript';
-$lang['hidepages'] = 'Ховати сторінки (regular expressions)';
$lang['send404'] = 'Надсилати "HTTP 404/Сторінка не знайдена " для неіснуючих сторінок';
-$lang['sitemap'] = 'Створювати мапу сайту для Google (дні)';
$lang['broken_iua'] = 'У вашій системі зіпсована функція ignore_user_abort? Це може зіпсувати пошукову систему. IIS+PHP/CGI не працює. Дивіться <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> для отримання додаткової інформації';
$lang['xsendfile'] = 'Використовувати заголовок X-Sendfile для доставки статичних файлів веб сервером? Ваш веб сервер повинен підтримувати цю функцію.';
$lang['renderer_xhtml'] = 'Транслятор (Renderer) для основного виводу wiki (xhtml)';
$lang['renderer__core'] = '%s (ядро докуВікі)';
$lang['renderer__plugin'] = '%s (доданок)';
-$lang['rememberme'] = 'Дозволити постійні файли cookies для входу (Запам\'ятати мене)';
-$lang['rss_type'] = 'тип RSS';
-$lang['rss_linkto'] = 'посилання в RSS';
-$lang['rss_content'] = 'Що відображати в пунктах XML-feed';
-$lang['rss_update'] = 'Інтервал оновлення RSS (сек)';
-$lang['recent_days'] = 'Скільки останніх змін пам\'ятати (дні)';
-$lang['rss_show_summary'] = 'Показувати підсумки змін в заголовку XML-feed';
-$lang['target____wiki'] = 'Target для внутрішніх посилань';
-$lang['target____interwiki'] = 'Target для інтерВікі-посилань';
-$lang['target____extern'] = 'Target для зовнішніх посилань';
-$lang['target____media'] = 'Target для медіа-посилань';
-$lang['target____windows'] = 'Target для посилань на мережеві папки';
$lang['proxy____host'] = 'Адреса Proxy';
$lang['proxy____port'] = 'Порт Proxy';
$lang['proxy____user'] = 'Користувач Proxy';
@@ -183,7 +182,7 @@ $lang['xsendfile_o_2'] = 'Стандартний X-Sendfile заголо
$lang['xsendfile_o_3'] = 'Фірмовий заголовок Nginx X-Accel-Redirect';
$lang['showuseras_o_loginname'] = 'Логін';
$lang['showuseras_o_username'] = 'Повне ім’я користувача';
-$lang['showuseras_o_email'] = 'E-mail користувача (прихована відповідно до настройок)';
+$lang['showuseras_o_email'] = 'E-mail користувача (прихована відповідно до налаштувань)';
$lang['showuseras_o_email_link'] = 'E-mail користувача як посилання mailto:';
$lang['useheading_o_0'] = 'Ніколи';
$lang['useheading_o_navigation'] = 'Лише для навігації';
diff --git a/lib/plugins/config/lang/vi/lang.php b/lib/plugins/config/lang/vi/lang.php
new file mode 100644
index 000000000..2933d8875
--- /dev/null
+++ b/lib/plugins/config/lang/vi/lang.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Vietnamese language file
+ *
+ */
diff --git a/lib/plugins/config/lang/zh-tw/intro.txt b/lib/plugins/config/lang/zh-tw/intro.txt
index c257947d9..4cacfc43f 100644
--- a/lib/plugins/config/lang/zh-tw/intro.txt
+++ b/lib/plugins/config/lang/zh-tw/intro.txt
@@ -1,7 +1,7 @@
-====== 配置管理器 ======
+====== 設定管理器 ======
-使用本頁控制您的 Dokuwiki 設定。每個獨立設定的相關訊息可參閱 [[doku>config]]。配置管理器的更多訊息請參閱 [[doku>plugin:config]]。
+使用本頁控制您的 Dokuwiki 設定。每個獨立設定的相關訊息可參閱 [[doku>config]]。設定管理器的更多訊息請參閱 [[doku>plugin:config]]。
淡紅色背景的項目是被保護的,不能通過這個管理器更改。藍色背景的項目是系統的預設值,白色背景的項目是您更改過的。藍色和白色的設定項目都可以更改。
-離開本頁之前不要忘記點擊最下面的 **儲存** 按鈕,否則您的修改將不會生效。
+離開本頁之前不要忘記點擊最下面的 **儲存** 按鈕,否則您的修改將不會生效。 \ No newline at end of file
diff --git a/lib/plugins/config/lang/zh-tw/lang.php b/lib/plugins/config/lang/zh-tw/lang.php
index 4f44eb60d..204b2b229 100644
--- a/lib/plugins/config/lang/zh-tw/lang.php
+++ b/lib/plugins/config/lang/zh-tw/lang.php
@@ -9,17 +9,18 @@
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
* @author Danny Lin
* @author Shuo-Ting Jian <shoting@gmail.com>
+ * @author syaoranhinata@gmail.com
*/
-$lang['menu'] = '系統配置設定';
+$lang['menu'] = '系統設定';
$lang['error'] = '設定因為不合法的值而未更新,請檢查您的更改並重新送出。
<br />不正確的值會被紅色方框包住。';
$lang['updated'] = '成功地更新設定。';
$lang['nochoice'] = '(無其他可用選項)';
$lang['locked'] = '設定檔無法更新,若非故意,請確認本地檔名及權限正確。';
-$lang['danger'] = '危險:改變此選項可能使您無法存取維基及配置選單。';
+$lang['danger'] = '危險:改變此選項可能使您無法存取維基及設定選單。';
$lang['warning'] = '警告:改變此選項可能導致不可預期的行為。';
$lang['security'] = '安全性警告:改變此選項可能造成安全風險。';
-$lang['_configuration_manager'] = '配置管理';
+$lang['_configuration_manager'] = '設定管理器';
$lang['_header_dokuwiki'] = 'DokuWiki 設定';
$lang['_header_plugin'] = '插件設定';
$lang['_header_template'] = '樣板設定';
@@ -38,26 +39,27 @@ $lang['_template_sufix'] = '樣板設定';
$lang['_msg_setting_undefined'] = '設定的後設數據不存在。';
$lang['_msg_setting_no_class'] = '設定的分類不存在。';
$lang['_msg_setting_no_default'] = '無預設值';
-$lang['fmode'] = '檔案建立模式';
-$lang['dmode'] = '目錄建立模式';
+$lang['title'] = '維基標題';
+$lang['start'] = '開始頁面的名稱';
$lang['lang'] = '語系';
+$lang['template'] = '樣板';
+$lang['license'] = '您希望您的內容為何種授權方式?';
+$lang['savedir'] = '儲存資料的目錄';
$lang['basedir'] = '根目錄';
$lang['baseurl'] = '根路徑 (URL)';
-$lang['savedir'] = '儲存資料的目錄';
$lang['cookiedir'] = 'Cookie 路徑。設定空白則使用 baseurl。';
-$lang['start'] = '開始頁面的名稱';
-$lang['title'] = '維基標題';
-$lang['template'] = '樣板';
-$lang['license'] = '您希望您的內容為何種授權方式?';
-$lang['fullpath'] = '顯示完整的路徑於頁面底部';
+$lang['dmode'] = '目錄建立模式';
+$lang['fmode'] = '檔案建立模式';
+$lang['allowdebug'] = '允許除錯 <b>(不需要請停用!)</b>';
$lang['recent'] = '最近更新';
+$lang['recent_days'] = '儲存多少天內的變更';
$lang['breadcrumbs'] = '導覽鏈數量';
$lang['youarehere'] = '顯示階層式導覽鏈';
+$lang['fullpath'] = '顯示完整的路徑於頁面底部';
$lang['typography'] = '進行字元替換';
-$lang['htmlok'] = '允許嵌入式 HTML';
-$lang['phpok'] = '允許嵌入式 PHP';
$lang['dformat'] = '日期格式 (參見 PHP 的 <a href="http://www.php.net/strftime">strftime</a> 函數)';
$lang['signature'] = '簽名';
+$lang['showuseras'] = '將最後編輯頁面的使用者顯示為:';
$lang['toptoclevel'] = '目錄表的最上層級';
$lang['tocminheads'] = '決定是否建立目錄表的最少標題數量';
$lang['maxtoclevel'] = '目錄表顯示的最大層級';
@@ -65,15 +67,8 @@ $lang['maxseclevel'] = '可編輯段落的最大層級';
$lang['camelcase'] = '對連結使用 CamelCase';
$lang['deaccent'] = '清理頁面名稱';
$lang['useheading'] = '使用第一個標題作為頁面名稱';
-$lang['refcheck'] = '媒體連結檢查';
-$lang['refshow'] = '媒體連結的顯示數量';
-$lang['allowdebug'] = '允許除錯 <b>(不需要請停用!)</b>';
-$lang['usewordblock'] = '根據字詞表阻擋垃圾訊息';
-$lang['indexdelay'] = '建立索引前的延遲時間 (秒)';
-$lang['relnofollow'] = '外部連結使用 rel="nofollow"';
-$lang['mailguard'] = '混淆 E-mail 位址';
-$lang['iexssprotect'] = '檢查上傳的檔案中是否隱含惡意的 JavaScript 或 HTML 碼';
-$lang['showuseras'] = '將最後編輯頁面的使用者顯示為:';
+$lang['sneaky_index'] = '預設情況下,DokuWiki 會在索引頁會顯示所有分類空間。啟用此選項會隱藏用戶沒有閱讀權限的頁面,但也可能將能閱讀的子頁面一併隱藏。在特定 ACL 設定下,這可能導致索引無法使用。';
+$lang['hidepages'] = '隱藏匹配的界面 (正規式)';
$lang['useacl'] = '使用存取控制名單';
$lang['autopasswd'] = '自動產生密碼';
$lang['authtype'] = '認證後台管理方式';
@@ -82,60 +77,65 @@ $lang['defaultgroup'] = '預設群組';
$lang['superuser'] = '超級用戶 - 不論 ACL 如何設定,都能訪問所有頁面與功能的用戶組/用戶';
$lang['manager'] = '管理員 - 能訪問相應管理功能的用戶组/用戶';
$lang['profileconfirm'] = '修改個人資料時需要確認密碼';
+$lang['rememberme'] = '允許自動登入 (記住我)';
$lang['disableactions'] = '停用的 DokuWiki 動作';
$lang['disableactions_check'] = '檢查';
$lang['disableactions_subscription'] = '訂閱/取消訂閱';
$lang['disableactions_wikicode'] = '檢視原始碼/匯出原始檔';
$lang['disableactions_other'] = '其他功能 (逗號分隔)';
-$lang['sneaky_index'] = '預設情況下,DokuWiki 會在索引頁會顯示所有命名空間。啟用此選項會隱藏用戶沒有閱讀權限的頁面,但也可能將能閱讀的子頁面一併隱藏。在特定 ACL 設定下,這可能導致索引無法使用。';
$lang['auth_security_timeout'] = '安全認證的計時 (秒)';
$lang['securecookie'] = 'HTTPS 頁面設定的 cookie 是否只能由瀏覽器經 HTTPS 傳送?取消此選項後,只有登入維基會被 SSL 保護而瀏覽時不會。';
-$lang['xmlrpc'] = '啟用/停用 XML-RPC 介面';
-$lang['xmlrpcuser'] = 'XML-RPC 存取權限將局限於在此提供的群組或使用者 (逗號分隔)。若要開放權限給所有人請留白。';
-$lang['updatecheck'] = '檢查更新與安全性警告?DokuWiki 需要聯繫 update.dokuwiki.org 才能使用此功能。';
-$lang['userewrite'] = '使用好看的 URL';
-$lang['useslash'] = '在 URL 中使用斜線作為命名空間的分隔字元';
+$lang['usewordblock'] = '根據字詞表阻擋垃圾訊息';
+$lang['relnofollow'] = '外部連結使用 rel="nofollow"';
+$lang['indexdelay'] = '建立索引前的延遲時間 (秒)';
+$lang['mailguard'] = '混淆 E-mail 位址';
+$lang['iexssprotect'] = '檢查上傳的檔案中是否隱含惡意的 JavaScript 或 HTML 碼';
$lang['usedraft'] = '編輯時自動儲存草稿';
-$lang['sepchar'] = '頁面名稱中單字的分隔字元';
-$lang['canonical'] = '使用最典型的 URL';
-$lang['fnencode'] = '非 ASCII 文件名稱的編輯方法。';
-$lang['autoplural'] = '檢查複數形式的連結 (英文)';
-$lang['compression'] = 'attic 文件的壓縮方式';
-$lang['cachetime'] = '緩存的最大存在時間 (秒)';
+$lang['htmlok'] = '允許嵌入式 HTML';
+$lang['phpok'] = '允許嵌入式 PHP';
$lang['locktime'] = '檔案的最大鎖定時間 (秒)';
+$lang['cachetime'] = '緩存的最大存在時間 (秒)';
+$lang['target____wiki'] = '內部連結的目標視窗';
+$lang['target____interwiki'] = '跨維基連結的目標視窗';
+$lang['target____extern'] = '外部連結的目標視窗';
+$lang['target____media'] = '媒體連結的目標視窗';
+$lang['target____windows'] = 'Windows 連結的目標視窗';
+$lang['refcheck'] = '媒體連結檢查';
+$lang['refshow'] = '媒體連結的顯示數量';
+$lang['gdlib'] = 'GD Lib 版本';
+$lang['im_convert'] = 'ImageMagick 的轉換工具路徑';
+$lang['jpg_quality'] = 'JPG 壓縮品質(0-100)';
$lang['fetchsize'] = 'fetch.php 可以從外部下載的最大檔案尺寸 (bytes)';
+$lang['subscribers'] = '啟用頁面訂閱';
+$lang['subscribe_time'] = '訂閱列表和摘要發送的時間間隔 (秒);這個值應該小於指定的最近更改保留時間 (recent_days)。';
$lang['notify'] = '寄送變更通知信到這個 E-mail 位址';
$lang['registernotify'] = '寄送新使用者註冊資訊到這個 E-mail 位址';
$lang['mailfrom'] = '自動發送郵件時使用的郵件地址';
$lang['mailprefix'] = '自動發送郵件時使用的標題前綴';
+$lang['sitemap'] = '產生 Google 站台地圖 (天)';
+$lang['rss_type'] = 'XML feed 類型';
+$lang['rss_linkto'] = 'XML feed 連結到';
+$lang['rss_content'] = 'XML feed 項目中顯示什麼呢?';
+$lang['rss_update'] = 'XML feed 更新間隔時間 (秒)';
+$lang['rss_show_summary'] = '於標題中顯示簡要的 XML feed';
+$lang['rss_media'] = '在 XML feed 中應列出哪些變更?';
+$lang['updatecheck'] = '檢查更新與安全性警告?DokuWiki 需要聯繫 update.dokuwiki.org 才能使用此功能。';
+$lang['userewrite'] = '使用好看的 URL';
+$lang['useslash'] = '在 URL 中使用斜線作為分類空間的分隔字元';
+$lang['sepchar'] = '頁面名稱中單字的分隔字元';
+$lang['canonical'] = '使用最典型的 URL';
+$lang['fnencode'] = '非 ASCII 文件名稱的編輯方法。';
+$lang['autoplural'] = '檢查複數形式的連結 (英文)';
+$lang['compression'] = 'attic 文件的壓縮方式';
$lang['gzip_output'] = '對 xhtml 使用 gzip 內容編碼';
-$lang['gdlib'] = 'GD Lib 版本';
-$lang['im_convert'] = 'ImageMagick 的轉換工具路徑';
-$lang['jpg_quality'] = 'JPG 壓縮品質(0-100)';
-$lang['subscribers'] = '啟用頁面訂閱';
-$lang['subscribe_time'] = '訂閱列表和摘要發送的時間間隔 (秒);這個值應該小於指定的最近更改保留時間 (recent_days)。';
$lang['compress'] = '壓縮 CSS 與 JavaScript 的輸出';
$lang['cssdatauri'] = 'CSS 中所引用的圖片假如小於該數字大小(bytes),將會被直接嵌入 CSS 中來減少 HTTP Request 的發送。此功能在 IE 7 及之下版本不支援。推薦使用 <code>400</code> 到 <code>600</code> 之間。設定為<code>0</code> 則停用。';
-$lang['hidepages'] = '隱藏匹配的界面 (正規式)';
$lang['send404'] = '存取不存在的頁面時送出 "HTTP 404/Page Not Found"';
-$lang['sitemap'] = '產生 Google 站台地圖 (天)';
$lang['broken_iua'] = 'ignore_user_abort 功能失效了?這有可能導致搜索索引不可用。IIS+PHP/CGI 已損壞。請參閱 <a href=\"http://bugs.splitbrain.org/?do=details&task_id=852\">Bug 852</a> 獲取更多信息。';
$lang['xsendfile'] = '使用 X-Sendfile 頭讓服務器發送狀態文件?您的服務器需要支持該功能。';
$lang['renderer_xhtml'] = '主要維基輸出 (xhtml) 的的渲染器';
$lang['renderer__core'] = '%s (dokuwiki 核心)';
$lang['renderer__plugin'] = '%s (插件)';
-$lang['rememberme'] = '允許自動登入 (記住我)';
-$lang['rss_type'] = 'XML feed 類型';
-$lang['rss_linkto'] = 'XML feed 連結到';
-$lang['rss_content'] = 'XML feed 項目中顯示什麼呢?';
-$lang['rss_update'] = 'XML feed 更新間隔時間 (秒)';
-$lang['recent_days'] = '儲存多少天內的變更';
-$lang['rss_show_summary'] = '於標題中顯示簡要的 XML feed';
-$lang['target____wiki'] = '內部連結的目標視窗';
-$lang['target____interwiki'] = '跨維基連結的目標視窗';
-$lang['target____extern'] = '外部連結的目標視窗';
-$lang['target____media'] = '媒體連結的目標視窗';
-$lang['target____windows'] = 'Windows 連結的目標視窗';
$lang['proxy____host'] = 'Proxy 伺服器名稱';
$lang['proxy____port'] = 'Proxy 連接埠';
$lang['proxy____user'] = 'Proxy 使用者名稱';
diff --git a/lib/plugins/config/lang/zh/lang.php b/lib/plugins/config/lang/zh/lang.php
index 2f6444ffa..832dfe749 100644
--- a/lib/plugins/config/lang/zh/lang.php
+++ b/lib/plugins/config/lang/zh/lang.php
@@ -38,6 +38,8 @@ $lang['_anti_spam'] = '反垃圾邮件/评论设置';
$lang['_editing'] = '编辑设置';
$lang['_links'] = '链接设置';
$lang['_media'] = '媒体设置';
+$lang['_notifications'] = '通知设置';
+$lang['_syndication'] = '聚合设置';
$lang['_advanced'] = '高级设置';
$lang['_network'] = '网络设置';
$lang['_plugin_sufix'] = '插件设置';
@@ -45,26 +47,29 @@ $lang['_template_sufix'] = '模板设置';
$lang['_msg_setting_undefined'] = '设置的元数据不存在。';
$lang['_msg_setting_no_class'] = '设置的分类不存在。';
$lang['_msg_setting_no_default'] = '设置的默认值不存在。';
-$lang['fmode'] = '文件的创建模式';
-$lang['dmode'] = '文件夹的创建模式';
+$lang['title'] = '维基站点的标题';
+$lang['start'] = '开始页面的名称';
$lang['lang'] = '语言';
+$lang['template'] = '模版';
+$lang['tagline'] = '副标题 (如果模板支持此功能)';
+$lang['sidebar'] = '侧边栏的页面名称 (如果模板支持此功能),留空以禁用侧边栏';
+$lang['license'] = '您愿意让你贡献的内容在何种许可方式下发布?';
+$lang['savedir'] = '保存数据的目录';
$lang['basedir'] = '根目录';
$lang['baseurl'] = '根路径(URL)';
-$lang['savedir'] = '保存数据的目录';
$lang['cookiedir'] = 'Cookie 路径。留空以使用 baseurl。';
-$lang['start'] = '开始页面的名称';
-$lang['title'] = '维基站点的标题';
-$lang['template'] = '模版';
-$lang['license'] = '您愿意让你贡献的内容在何种许可方式下发布?';
-$lang['fullpath'] = '在页面底部显示完整路径';
+$lang['dmode'] = '文件夹的创建模式';
+$lang['fmode'] = '文件的创建模式';
+$lang['allowdebug'] = '允许调试 <b>如果您不需要调试,请勿勾选!</b>';
$lang['recent'] = '最近更新';
+$lang['recent_days'] = '保留多少天的最近更改(天)';
$lang['breadcrumbs'] = '显示“足迹”的数量';
$lang['youarehere'] = '显示“您在这里”';
+$lang['fullpath'] = '在页面底部显示完整路径';
$lang['typography'] = '进行字符替换';
-$lang['htmlok'] = '允许嵌入式 HTML';
-$lang['phpok'] = '允许嵌入式 PHP';
$lang['dformat'] = '日期格式(参见 PHP 的 <a href="http://www.php.net/strftime">strftime</a> 功能)';
$lang['signature'] = '签名样式';
+$lang['showuseras'] = '显示用户为';
$lang['toptoclevel'] = '目录的最顶层';
$lang['tocminheads'] = '头条数目的最小数目,这将用于决定是否创建目录列表(TOC)';
$lang['maxtoclevel'] = '目录的最多层次';
@@ -72,15 +77,8 @@ $lang['maxseclevel'] = '段落编辑的最多层次';
$lang['camelcase'] = '对链接使用 CamelCase';
$lang['deaccent'] = '清理页面名称';
$lang['useheading'] = '使用“标题 H1”作为页面名称';
-$lang['refcheck'] = '检查媒体与页面的挂钩情况';
-$lang['refshow'] = '显示媒体与页面挂钩情况的数量';
-$lang['allowdebug'] = '允许调试 <b>如果您不需要调试,请勿勾选!</b>';
-$lang['usewordblock'] = '根据 wordlist 阻止垃圾评论';
-$lang['indexdelay'] = '构建索引前的时间延滞(秒)';
-$lang['relnofollow'] = '对外部链接使用 rel="nofollow" 标签';
-$lang['mailguard'] = '弄乱邮件地址(保护用户的邮件地址)';
-$lang['iexssprotect'] = '检验上传的文件以避免可能存在的恶意 JavaScript 或 HTML 代码';
-$lang['showuseras'] = '显示用户为';
+$lang['sneaky_index'] = '默认情况下,DokuWiki 在索引页会显示所有 namespace。启用该选项能隐藏那些用户没有权限阅读的页面。但也可能将用户能够阅读的子页面一并隐藏。这有可能导致在特定 ACL 设置下,索引功能不可用。';
+$lang['hidepages'] = '隐藏匹配的界面(正则表达式)';
$lang['useacl'] = '使用访问控制列表(ACL)';
$lang['autopasswd'] = '自动生成密码';
$lang['authtype'] = '认证后台管理方式';
@@ -89,61 +87,71 @@ $lang['defaultgroup'] = '默认组';
$lang['superuser'] = '超级用户 - 不论 ACL 如何设置,都能访问所有页面与功能的用户组/用户';
$lang['manager'] = '管理员 - 能访问相应管理功能的用户组/用户';
$lang['profileconfirm'] = '更新个人信息时需要输入当前密码';
+$lang['rememberme'] = '允许在本地机长期保留登录cookies信息(记住我)';
$lang['disableactions'] = '停用 DokuWiki 功能';
$lang['disableactions_check'] = '检查';
$lang['disableactions_subscription'] = '订阅/退订';
$lang['disableactions_wikicode'] = '查看源文件/导出源文件';
$lang['disableactions_other'] = '其他功能(用英文逗号分隔)';
-$lang['sneaky_index'] = '默认情况下,DokuWiki 在索引页会显示所有 namespace。启用该选项能隐藏那些用户没有权限阅读的页面。但也可能将用户能够阅读的子页面一并隐藏。这有可能导致在特定 ACL 设置下,索引功能不可用。';
$lang['auth_security_timeout'] = '认证安全超时(秒)';
$lang['securecookie'] = '要让浏览器须以HTTPS方式传送在HTTPS会话中设置的cookies吗?请只在登录过程为SSL加密而浏览维基为明文的情况下打开此选项。';
-$lang['xmlrpc'] = '启用/禁用 XML-RPC 交互界面。';
-$lang['xmlrpcuser'] = '将 XML-RPC 连接限制在用逗号分隔的组或用户中。留空对所有人开启连接权限。';
+$lang['remote'] = '激活远程 API 系统。这允许其他程序通过 XML-RPC 或其他机制来访问维基。';
+$lang['remoteuser'] = '将远程 API 的访问权限限制在指定的组或用户中,以逗号分隔。留空则允许任何人访问。';
+$lang['usewordblock'] = '根据 wordlist 阻止垃圾评论';
+$lang['relnofollow'] = '对外部链接使用 rel="nofollow" 标签';
+$lang['indexdelay'] = '构建索引前的时间延滞(秒)';
+$lang['mailguard'] = '弄乱邮件地址(保护用户的邮件地址)';
+$lang['iexssprotect'] = '检验上传的文件以避免可能存在的恶意 JavaScript 或 HTML 代码';
+$lang['usedraft'] = '编辑时自动保存一份草稿';
+$lang['htmlok'] = '允许嵌入式 HTML';
+$lang['phpok'] = '允许嵌入式 PHP';
+$lang['locktime'] = '独有编辑权/文件锁定的最长时间(秒)';
+$lang['cachetime'] = '缓存的最长时间(秒)';
+$lang['target____wiki'] = '内部链接的目标窗口';
+$lang['target____interwiki'] = 'Interwiki 链接的目标窗口';
+$lang['target____extern'] = '外部链接的目标窗口';
+$lang['target____media'] = '媒体文件链接的目标窗口';
+$lang['target____windows'] = 'Windows 链接的目标窗口';
+$lang['mediarevisions'] = '激活媒体修订历史?';
+$lang['refcheck'] = '检查媒体与页面的挂钩情况';
+$lang['refshow'] = '显示媒体与页面挂钩情况的数量';
+$lang['gdlib'] = 'GD 库版本';
+$lang['im_convert'] = 'ImageMagick 转换工具的路径';
+$lang['jpg_quality'] = 'JPG 压缩质量(0-100)';
+$lang['fetchsize'] = 'fetch.php 能从外部下载的最大文件大小(字节)';
+$lang['subscribers'] = '启用页面订阅支持';
+$lang['subscribe_time'] = '订阅列表和摘要发送的时间间隔(秒);这应当小于指定的最近更改保留时间(recent_days)。
+';
+$lang['notify'] = '发送更改通知给这个邮件地址';
+$lang['registernotify'] = '发送新注册用户的信息给这个邮件地址';
+$lang['mailfrom'] = '自动发送邮件时使用的邮件地址';
+$lang['mailprefix'] = '自动发送邮件时使用的邮件地址前缀';
+$lang['htmlmail'] = '发送更加美观,但体积更大的 HTML 多部分邮件。禁用则发送纯文本邮件。';
+$lang['sitemap'] = '生成 Google sitemap(天)';
+$lang['rss_type'] = 'XML feed 类型';
+$lang['rss_linkto'] = 'XML feed 链接到';
+$lang['rss_content'] = 'XML feed 项目中显示什么呢?';
+$lang['rss_update'] = 'XML feed 升级间隔(秒)';
+$lang['rss_show_summary'] = 'XML feed 在标题中显示摘要';
+$lang['rss_media'] = '在 XML 源中应该列出何种类型的更改?';
$lang['updatecheck'] = '自动检查更新并接收安全警告吗?开启该功能后 DokuWiki 将自动访问 splitbrain.org。';
$lang['userewrite'] = '使用更整洁的 URL';
$lang['useslash'] = '在 URL 中使用斜杠作为命名空间的分隔符';
-$lang['usedraft'] = '编辑时自动保存一份草稿';
$lang['sepchar'] = '页面名称中的单词分隔符';
$lang['canonical'] = '使用完全标准的 URL';
$lang['fnencode'] = '非 ASCII 文件名的编码方法。';
$lang['autoplural'] = '在链接中检查多种格式';
$lang['compression'] = 'attic 文件的压缩方式';
-$lang['cachetime'] = '缓存的最长时间(秒)';
-$lang['locktime'] = '独有编辑权/文件锁定的最长时间(秒)';
-$lang['fetchsize'] = 'fetch.php 能从外部下载的最大文件大小(字节)';
-$lang['notify'] = '发送更改通知给这个邮件地址';
-$lang['registernotify'] = '发送新注册用户的信息给这个邮件地址';
-$lang['mailfrom'] = '自动发送邮件时使用的邮件地址';
-$lang['mailprefix'] = '自动发送邮件时使用的邮件地址前缀';
$lang['gzip_output'] = '对 xhtml 使用 gzip 内容编码';
-$lang['gdlib'] = 'GD 库版本';
-$lang['im_convert'] = 'ImageMagick 转换工具的路径';
-$lang['jpg_quality'] = 'JPG 压缩质量(0-100)';
-$lang['subscribers'] = '启用页面订阅支持';
-$lang['subscribe_time'] = '订阅列表和摘要发送的时间间隔(秒);这应当小于指定的最近更改保留时间(recent_days)。
-';
$lang['compress'] = '使 CSS 和 javascript 的输出更紧密';
$lang['cssdatauri'] = '字节数。CSS 文件引用的图片若小于该字节,则被直接嵌入样式表中来减少 HTTP 请求头的开销。这个技术在 IE 中不起作用。<code>400</code> 到 <code>600</code> 字节是不错的值。设置为 <code>0</code> 则禁用。';
-$lang['hidepages'] = '隐藏匹配的界面(正则表达式)';
$lang['send404'] = '发送 "HTTP 404/页面没有找到" 错误信息给不存在的页面';
-$lang['sitemap'] = '生成 Google sitemap(天)';
$lang['broken_iua'] = 'ignore_user_abort 功能失效了?这有可能导致搜索索引不可用。IIS+PHP/CGI 已损坏。请参阅 <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> 获取更多信息。';
$lang['xsendfile'] = '使用 X-Sendfile 头让服务器发送状态文件?您的服务器需要支持该功能。';
$lang['renderer_xhtml'] = '主维基页面 (xhtml) 输出使用的渲染';
$lang['renderer__core'] = '%s(DokuWiki 内核)';
$lang['renderer__plugin'] = '%s(插件)';
-$lang['rememberme'] = '允许在本地机长期保留登录cookies信息(记住我)';
-$lang['rss_type'] = 'XML feed 类型';
-$lang['rss_linkto'] = 'XML feed 链接到';
-$lang['rss_content'] = 'XML feed 项目中显示什么呢?';
-$lang['rss_update'] = 'XML feed 升级间隔(秒)';
-$lang['recent_days'] = '保留多少天的最近更改(天)';
-$lang['rss_show_summary'] = 'XML feed 在标题中显示摘要';
-$lang['target____wiki'] = '内部链接的目标窗口';
-$lang['target____interwiki'] = 'Interwiki 链接的目标窗口';
-$lang['target____extern'] = '外部链接的目标窗口';
-$lang['target____media'] = '媒体文件链接的目标窗口';
-$lang['target____windows'] = 'Windows 链接的目标窗口';
+$lang['dnslookups'] = 'Dokuwiki 将会查询用户编辑页面的远程 IP 地址的主机名。如果您的 DNS 服务器比较缓慢或者不工作,或者您不想要这个功能,请禁用此选项。';
$lang['proxy____host'] = '代理服务器的名称';
$lang['proxy____port'] = '代理服务器的端口';
$lang['proxy____user'] = '代理服务器的用户名';
diff --git a/lib/plugins/config/plugin.info.txt b/lib/plugins/config/plugin.info.txt
index ace4889b6..1f9968154 100644
--- a/lib/plugins/config/plugin.info.txt
+++ b/lib/plugins/config/plugin.info.txt
@@ -1,6 +1,7 @@
+base config
author Christopher Smith
email chris@jalakai.co.uk
-date 2007-08-05
+date 2012-09-08
name Configuration Manager
desc Manage Dokuwiki's Configuration Settings
url http://dokuwiki.org/plugin:config
diff --git a/lib/plugins/config/rtl.css b/lib/plugins/config/rtl.css
deleted file mode 100644
index b8b9660e2..000000000
--- a/lib/plugins/config/rtl.css
+++ /dev/null
@@ -1,45 +0,0 @@
-#config__manager fieldset {
- clear: both;
-}
-
-#config__manager fieldset td {
- text-align: right;
-}
-
-#config__manager label {
- text-align: right;
-}
-
-#config__manager td.value input.checkbox {
- float: right;
- padding-left: 0;
- padding-right: 0.7em;
-}
-
-#config__manager td.value label {
- float: left;
-}
-
-#config__manager td.label {
- padding: 0.8em 1em 0.6em 0;
-}
-
-#config__manager td.label span.outkey {
- float: right;
- margin-right: 1em;
-}
-
-#config__manager td.label label {
- clear: right;
-}
-
-#config__manager td.label img {
- float: left;
-}
-
-#config__manager .selection {
- width: 14.8em;
- float: right;
- margin: 0 0 2px 0.3em;
-}
-
diff --git a/lib/plugins/config/settings/config.class.php b/lib/plugins/config/settings/config.class.php
index adf7d217a..8c48018d7 100644
--- a/lib/plugins/config/settings/config.class.php
+++ b/lib/plugins/config/settings/config.class.php
@@ -156,7 +156,7 @@ if (!class_exists('configuration')) {
}else{
$contents = '';
}
- $pattern = '/\$'.$this->_name.'\[[\'"]([^=]+)[\'"]\] ?= ?(.*?);(?=[^;]*(?:\$'.$this->_name.'|@include|$))/s';
+ $pattern = '/\$'.$this->_name.'\[[\'"]([^=]+)[\'"]\] ?= ?(.*?);(?=[^;]*(?:\$'.$this->_name.'|$))/s';
$matches=array();
preg_match_all($pattern,$contents,$matches,PREG_SET_ORDER);
@@ -279,10 +279,10 @@ if (!class_exists('configuration')) {
}
// the same for the active template
- if (@file_exists(DOKU_TPLINC.$file)){
+ if (@file_exists(tpl_incdir().$file)){
$meta = array();
- @include(DOKU_TPLINC.$file);
- @include(DOKU_TPLINC.$class);
+ @include(tpl_incdir().$file);
+ @include(tpl_incdir().$class);
if (!empty($meta)) {
$metadata['tpl'.CM_KEYMARKER.$tpl.CM_KEYMARKER.'template_settings_name'] = array('fieldset');
}
@@ -314,9 +314,9 @@ if (!class_exists('configuration')) {
}
// the same for the active template
- if (@file_exists(DOKU_TPLINC.$file)){
+ if (@file_exists(tpl_incdir().$file)){
$conf = array();
- @include(DOKU_TPLINC.$file);
+ @include(tpl_incdir().$file);
foreach ($conf as $key => $value){
$default['tpl'.CM_KEYMARKER.$tpl.CM_KEYMARKER.$key] = $value;
}
@@ -452,8 +452,8 @@ if (!class_exists('setting')) {
function _out_key($pretty=false,$url=false) {
if($pretty){
- $out = str_replace(CM_KEYMARKER,"&raquo;",$this->_key);
- if ($url && !strstr($out,'&raquo;')) {//provide no urls for plugins, etc.
+ $out = str_replace(CM_KEYMARKER,"»",$this->_key);
+ if ($url && !strstr($out,'»')) {//provide no urls for plugins, etc.
if ($out == 'start') //one exception
return '<a href="http://www.dokuwiki.org/config:startpage">'.$out.'</a>';
else
@@ -548,7 +548,7 @@ if (!class_exists('setting_email')) {
if ($value == $input) return false;
if ($this->_multiple) {
- $mails = array_filter(array_map('trim', split(',', $input)));
+ $mails = array_filter(array_map('trim', explode(',', $input)));
} else {
$mails = array($input);
}
diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php
index d8ad06134..3607f56c6 100644
--- a/lib/plugins/config/settings/config.metadata.php
+++ b/lib/plugins/config/settings/config.metadata.php
@@ -91,6 +91,8 @@ $meta['title'] = array('string');
$meta['start'] = array('string','_pattern' => '!^[^:;/]+$!'); // don't accept namespaces
$meta['lang'] = array('dirchoice','_dir' => DOKU_INC.'inc/lang/');
$meta['template'] = array('dirchoice','_dir' => DOKU_INC.'lib/tpl/','_pattern' => '/^[\w-]+$/');
+$meta['tagline'] = array('string');
+$meta['sidebar'] = array('string');
$meta['license'] = array('license');
$meta['savedir'] = array('savedir');
$meta['basedir'] = array('string');
@@ -102,6 +104,7 @@ $meta['allowdebug'] = array('onoff');
$meta['_display'] = array('fieldset');
$meta['recent'] = array('numeric');
+$meta['recent_days'] = array('numeric');
$meta['breadcrumbs'] = array('numeric','_min' => 0);
$meta['youarehere'] = array('onoff');
$meta['fullpath'] = array('onoff');
@@ -116,28 +119,26 @@ $meta['maxseclevel'] = array('multichoice','_choices' => array(0,1,2,3,4,5)); //
$meta['camelcase'] = array('onoff');
$meta['deaccent'] = array('multichoice','_choices' => array(0,1,2));
$meta['useheading'] = array('multichoice','_choices' => array(0,'navigation','content',1));
-$meta['refcheck'] = array('onoff');
-$meta['refshow'] = array('numeric');
+$meta['sneaky_index'] = array('onoff');
+$meta['hidepages'] = array('string');
$meta['_authentication'] = array('fieldset');
$meta['useacl'] = array('onoff');
$meta['autopasswd'] = array('onoff');
$meta['authtype'] = array('authtype');
-$meta['passcrypt'] = array('multichoice','_choices' => array('smd5','md5','apr1','sha1','ssha','crypt','mysql','my411','kmd5','pmd5','hmd5'));
+$meta['passcrypt'] = array('multichoice','_choices' => array('smd5','md5','apr1','sha1','ssha','lsmd5','crypt','mysql','my411','kmd5','pmd5','hmd5','bcrypt'));
$meta['defaultgroup']= array('string');
$meta['superuser'] = array('string');
$meta['manager'] = array('string');
$meta['profileconfirm'] = array('onoff');
$meta['rememberme'] = array('onoff');
-$meta['registernotify'] = array('email');
$meta['disableactions'] = array('disableactions',
'_choices' => array('backlink','index','recent','revisions','search','subscription','register','resendpwd','profile','edit','wikicode','check'),
'_combine' => array('subscription' => array('subscribe','unsubscribe'), 'wikicode' => array('source','export_raw')));
-$meta['sneaky_index'] = array('onoff');
$meta['auth_security_timeout'] = array('numeric');
$meta['securecookie'] = array('onoff');
-$meta['xmlrpc'] = array('onoff');
-$meta['xmlrpcuser'] = array('string');
+$meta['remote'] = array('onoff');
+$meta['remoteuser'] = array('string');
$meta['_anti_spam'] = array('fieldset');
$meta['usewordblock']= array('onoff');
@@ -150,9 +151,6 @@ $meta['_editing'] = array('fieldset');
$meta['usedraft'] = array('onoff');
$meta['htmlok'] = array('onoff');
$meta['phpok'] = array('onoff');
-$meta['notify'] = array('email', '_multiple' => true);
-$meta['subscribers'] = array('onoff');
-$meta['subscribe_time'] = array('numeric');
$meta['locktime'] = array('numeric');
$meta['cachetime'] = array('numeric');
@@ -169,6 +167,26 @@ $meta['gdlib'] = array('multichoice','_choices' => array(0,1,2));
$meta['im_convert'] = array('im_convert');
$meta['jpg_quality'] = array('numeric','_pattern' => '/^100$|^[1-9]?[0-9]$/'); //(0-100)
$meta['fetchsize'] = array('numeric');
+$meta['refcheck'] = array('onoff');
+$meta['refshow'] = array('numeric');
+
+$meta['_notifications'] = array('fieldset');
+$meta['subscribers'] = array('onoff');
+$meta['subscribe_time'] = array('numeric');
+$meta['notify'] = array('email', '_multiple' => true);
+$meta['registernotify'] = array('email');
+$meta['mailfrom'] = array('richemail');
+$meta['mailprefix'] = array('string');
+$meta['htmlmail'] = array('onoff');
+
+$meta['_syndication'] = array('fieldset');
+$meta['sitemap'] = array('numeric');
+$meta['rss_type'] = array('multichoice','_choices' => array('rss','rss1','rss2','atom','atom1'));
+$meta['rss_linkto'] = array('multichoice','_choices' => array('diff','page','rev','current'));
+$meta['rss_content'] = array('multichoice','_choices' => array('abstract','diff','htmldiff','html'));
+$meta['rss_media'] = array('multichoice','_choices' => array('both','pages','media'));
+$meta['rss_update'] = array('numeric');
+$meta['rss_show_summary'] = array('onoff');
$meta['_advanced'] = array('fieldset');
$meta['updatecheck'] = array('onoff');
@@ -178,27 +196,18 @@ $meta['sepchar'] = array('sepchar');
$meta['canonical'] = array('onoff');
$meta['fnencode'] = array('multichoice','_choices' => array('url','safe','utf-8'));
$meta['autoplural'] = array('onoff');
-$meta['mailfrom'] = array('richemail');
-$meta['mailprefix'] = array('string');
$meta['compress'] = array('onoff');
$meta['cssdatauri'] = array('numeric','_pattern' => '/^\d+$/');
$meta['gzip_output'] = array('onoff');
-$meta['hidepages'] = array('string');
$meta['send404'] = array('onoff');
$meta['compression'] = array('compression');
-$meta['sitemap'] = array('numeric');
-$meta['rss_type'] = array('multichoice','_choices' => array('rss','rss1','rss2','atom','atom1'));
-$meta['rss_linkto'] = array('multichoice','_choices' => array('diff','page','rev','current'));
-$meta['rss_content'] = array('multichoice','_choices' => array('abstract','diff','htmldiff','html'));
-$meta['rss_update'] = array('numeric');
-$meta['recent_days'] = array('numeric');
-$meta['rss_show_summary'] = array('onoff');
$meta['broken_iua'] = array('onoff');
$meta['xsendfile'] = array('multichoice','_choices' => array(0,1,2,3));
$meta['renderer_xhtml'] = array('renderer','_format' => 'xhtml','_choices' => array('xhtml'));
$meta['readdircache'] = array('numeric');
$meta['_network'] = array('fieldset');
+$meta['dnslookups'] = array('onoff');
$meta['proxy____host'] = array('string','_pattern' => '#^(|[a-z0-9\-\.+]+)$#i');
$meta['proxy____port'] = array('numericopt');
$meta['proxy____user'] = array('string');
diff --git a/lib/plugins/config/style.css b/lib/plugins/config/style.css
index 65c44a758..1be94feb9 100644
--- a/lib/plugins/config/style.css
+++ b/lib/plugins/config/style.css
@@ -15,6 +15,9 @@
color: __text__;
padding: 0 1em;
}
+[dir=rtl] #config__manager fieldset {
+ clear: both;
+}
#config__manager legend {
font-size: 1.25em;
}
@@ -28,25 +31,49 @@
#config__manager fieldset td {
text-align: left;
}
+[dir=rtl] #config__manager fieldset td {
+ text-align: right;
+}
#config__manager fieldset td.value {
/* fixed data column width */
width: 31em;
}
+[dir=rtl] #config__manager label {
+ text-align: right;
+}
+[dir=rtl] #config__manager td.value input.checkbox {
+ float: right;
+ padding-left: 0;
+ padding-right: 0.7em;
+}
+[dir=rtl] #config__manager td.value label {
+ float: left;
+}
+
#config__manager td.label {
padding: 0.8em 0 0.6em 1em;
vertical-align: top;
}
+[dir=rtl] #config__manager td.label {
+ padding: 0.8em 1em 0.6em 0;
+}
#config__manager td.label label {
clear: left;
display: block;
}
+[dir=rtl] #config__manager td.label label {
+ clear: right;
+}
#config__manager td.label img {
padding: 0 10px;
vertical-align: middle;
float: right;
}
+[dir=rtl] #config__manager td.label img {
+ float: left;
+}
#config__manager td.label span.outkey {
font-size: 70%;
@@ -60,6 +87,10 @@
position: relative;
z-index: 1;
}
+[dir=rtl] #config__manager td.label span.outkey {
+ float: right;
+ margin-right: 1em;
+}
#config__manager td input.edit {
width: 30em;
@@ -106,6 +137,11 @@
float: left;
margin: 0 0.3em 2px 0;
}
+[dir=rtl] #config__manager .selection {
+ width: 14.8em;
+ float: right;
+ margin: 0 0 2px 0.3em;
+}
#config__manager .selection label {
float: right;
diff --git a/lib/plugins/index.html b/lib/plugins/index.html
index d614603ac..977f90e10 100644
--- a/lib/plugins/index.html
+++ b/lib/plugins/index.html
@@ -1,6 +1,5 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
+<!DOCTYPE html>
+<html>
<head>
<meta http-equiv="refresh" content="0; URL=../../" />
<meta name="robots" content="noindex" />
diff --git a/lib/plugins/info/plugin.info.txt b/lib/plugins/info/plugin.info.txt
index 2432225f1..5c7d583c0 100644
--- a/lib/plugins/info/plugin.info.txt
+++ b/lib/plugins/info/plugin.info.txt
@@ -1,6 +1,7 @@
+base info
author Andreas Gohr
email andi@splitbrain.org
-date 2008-09-12
+date 2012-02-04
name Info Plugin
desc Displays information about various DokuWiki internals
url http://dokuwiki.org/plugin:info
diff --git a/lib/plugins/info/syntax.php b/lib/plugins/info/syntax.php
index 026a438bb..9aedbf0aa 100644
--- a/lib/plugins/info/syntax.php
+++ b/lib/plugins/info/syntax.php
@@ -174,7 +174,7 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
$hid = $this->_addToTOC($title, 3, $renderer);
$doc .= '<h3><a name="'.$hid.'" id="'.$hid.'">'.hsc($title).'</a></h3>';
$doc .= '<div class="level3">';
- $doc .= '<table class="inline"><tbody>';
+ $doc .= '<div class="table"><table class="inline"><tbody>';
$doc .= '<tr><th>Description</th><td colspan="2">'.$method['desc'].
'</td></tr>';
if ($method['params']){
@@ -190,7 +190,7 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
$doc .= '<tr><th>Return value</th><td>'.hsc(key($method['return'])).
'</td><td>'.hsc(current($method['return'])).'</td></tr>';
}
- $doc .= '</tbody></table>';
+ $doc .= '</tbody></table></div>';
$doc .= '</div>';
}
unset($po);
@@ -206,7 +206,7 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
global $PARSER_MODES;
$doc = '';
- $doc .= '<table class="inline"><tbody>';
+ $doc .= '<div class="table"><table class="inline"><tbody>';
foreach($PARSER_MODES as $mode => $modes){
$doc .= '<tr>';
$doc .= '<td class="leftalign">';
@@ -217,7 +217,7 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
$doc .= '</td>';
$doc .= '</tr>';
}
- $doc .= '</tbody></table>';
+ $doc .= '</tbody></table></div>';
return $doc;
}
diff --git a/lib/plugins/plugin/classes/ap_download.class.php b/lib/plugins/plugin/classes/ap_download.class.php
index 6aab4ba3c..d1b518d9d 100644
--- a/lib/plugins/plugin/classes/ap_download.class.php
+++ b/lib/plugins/plugin/classes/ap_download.class.php
@@ -8,8 +8,9 @@ class ap_download extends ap_manage {
*/
function process() {
global $lang;
+ global $INPUT;
- $plugin_url = $_REQUEST['url'];
+ $plugin_url = $INPUT->str('url');
$this->download($plugin_url, $this->overwrite);
return '';
}
@@ -59,7 +60,7 @@ class ap_download extends ap_manage {
return false;
}
- if (!$file = io_download($url, "$tmp/", true, $file)) {
+ if (!$file = io_download($url, "$tmp/", true, $file, 0)) {
$this->manager->error = sprintf($this->lang['error_download'],$url)."\n";
}
@@ -155,16 +156,16 @@ class ap_download extends ap_manage {
$info['type'] = 'plugin';
$info['tmp'] = "$base/$dir";
$conf = confToHash("$base/$dir/$f");
- $info['base'] = basename($conf['base']);
- if(!$info['base']) $info['base'] = basename("$base/$dir");
+ $info['base'] = utf8_basename($conf['base']);
+ if(!$info['base']) $info['base'] = utf8_basename("$base/$dir");
$result['new'][] = $info;
}elseif($f == 'template.info.txt'){
$info = array();
$info['type'] = 'template';
$info['tmp'] = "$base/$dir";
$conf = confToHash("$base/$dir/$f");
- $info['base'] = basename($conf['base']);
- if(!$info['base']) $info['base'] = basename("$base/$dir");
+ $info['base'] = utf8_basename($conf['base']);
+ if(!$info['base']) $info['base'] = utf8_basename("$base/$dir");
$result['new'][] = $info;
}
}else{
diff --git a/lib/plugins/plugin/classes/ap_enable.class.php b/lib/plugins/plugin/classes/ap_enable.class.php
index 35450a907..a25c7ede8 100644
--- a/lib/plugins/plugin/classes/ap_enable.class.php
+++ b/lib/plugins/plugin/classes/ap_enable.class.php
@@ -6,9 +6,11 @@ class ap_enable extends ap_manage {
function process() {
global $plugin_protected;
+ global $INPUT;
+
$count_enabled = $count_disabled = 0;
- $this->enabled = isset($_REQUEST['enabled']) ? $_REQUEST['enabled'] : array();
+ $this->enabled = $INPUT->arr('enabled');
foreach ($this->manager->plugin_list as $plugin) {
if (in_array($plugin, $plugin_protected)) continue;
diff --git a/lib/plugins/plugin/classes/ap_manage.class.php b/lib/plugins/plugin/classes/ap_manage.class.php
index 12480e922..28579cbe9 100644
--- a/lib/plugins/plugin/classes/ap_manage.class.php
+++ b/lib/plugins/plugin/classes/ap_manage.class.php
@@ -141,9 +141,18 @@ class ap_manage {
break;
case 'update' :
+ $url = $data[0];
$date = date('r');
- if (!$fp = @fopen($file, 'a')) return;
- fwrite($fp, "updated=$date\n");
+ if (!$fp = @fopen($file, 'r+')) return;
+ $buffer = "";
+ while (($line = fgets($fp)) !== false) {
+ $urlFound = strpos($line,"url");
+ if($urlFound !== false) $line="url=$url\n";
+ $buffer .= $line;
+ }
+ $buffer .= "updated=$date\n";
+ fseek($fp, 0);
+ fwrite($fp, $buffer);
fclose($fp);
break;
}
diff --git a/lib/plugins/plugin/lang/ar/lang.php b/lib/plugins/plugin/lang/ar/lang.php
index fbc6d3c36..8327e5ce3 100644
--- a/lib/plugins/plugin/lang/ar/lang.php
+++ b/lib/plugins/plugin/lang/ar/lang.php
@@ -50,3 +50,4 @@ $lang['enabled'] = 'الاضافة %s فُعلت. ';
$lang['notenabled'] = 'تعذر تفعيل الاضافة %s، تحقق من اذونات الملف.';
$lang['disabled'] = 'عُطلت الإضافة %s.';
$lang['notdisabled'] = 'تعذر تعطيل الإضافة %s، تحقق من اذونات الملف.';
+$lang['packageinstalled'] = 'حزمة الإضافة (%d plugin(s): %Xs) ثبتت بنجاج.';
diff --git a/lib/plugins/plugin/lang/cs/lang.php b/lib/plugins/plugin/lang/cs/lang.php
index 0ccabf344..1fd360dca 100644
--- a/lib/plugins/plugin/lang/cs/lang.php
+++ b/lib/plugins/plugin/lang/cs/lang.php
@@ -11,6 +11,7 @@
* @author Lefty <lefty@multihost.cz>
* @author Vojta Beran <xmamut@email.cz>
* @author zbynek.krivka@seznam.cz
+ * @author Bohumir Zamecnik <bohumir.zamecnik@gmail.com>
*/
$lang['menu'] = 'Správa pluginů';
$lang['download'] = 'Stáhnout a instalovat plugin';
diff --git a/lib/plugins/plugin/lang/da/lang.php b/lib/plugins/plugin/lang/da/lang.php
index 841d246df..d1deb6310 100644
--- a/lib/plugins/plugin/lang/da/lang.php
+++ b/lib/plugins/plugin/lang/da/lang.php
@@ -11,6 +11,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['menu'] = 'Håndter udvidelser';
$lang['download'] = 'Hent og tilføj ny udvidelse';
@@ -56,3 +57,4 @@ $lang['enabled'] = 'Udvidelsen %s blev aktiveret.';
$lang['notenabled'] = 'Udvidelsen %s kunne ikke aktiveres. Kontroller filtilladelser.';
$lang['disabled'] = 'Udvidelsen %s blev ikke aktiveret.';
$lang['notdisabled'] = 'Udvidelsen %s kunne ikke aktiveres. Kontroller filtilladelser.';
+$lang['packageinstalled'] = 'Plugin pakke (%d plugin(s): %s) installeret korrekt.';
diff --git a/lib/plugins/plugin/lang/eo/admin_plugin.txt b/lib/plugins/plugin/lang/eo/admin_plugin.txt
index 8cc59843b..c97dddf56 100644
--- a/lib/plugins/plugin/lang/eo/admin_plugin.txt
+++ b/lib/plugins/plugin/lang/eo/admin_plugin.txt
@@ -1,3 +1,3 @@
====== Administrado de Kromaĵoj ======
-En tiu ĉi paĝo vi povas administri ĉion pri DokuWiki-aj [[doku&gt;plugins|kromaĵoj]]. Por sukcesi elŝuti kaj instali kromaĵon, via dosierujo de kromaĵoj devas esti konservebla por la retservilo.
+En tiu ĉi paĝo vi povas administri ĉion pri DokuWiki-aj [[doku>plugins|kromaĵoj]]. Por sukcesi elŝuti kaj instali kromaĵon, via dosierujo de kromaĵoj devas esti konservebla por la retservilo.
diff --git a/lib/plugins/plugin/lang/eo/lang.php b/lib/plugins/plugin/lang/eo/lang.php
index ab9af73e1..67553454c 100644
--- a/lib/plugins/plugin/lang/eo/lang.php
+++ b/lib/plugins/plugin/lang/eo/lang.php
@@ -6,19 +6,18 @@
* @author Felipe Castro <fefcas@gmail.com>
* @author Felipe Castro <fefcas (cxe) gmail (punkto) com>
* @author Felipo Kastro <fefcas@gmail.com>
- * @author Robert Bogenschneider <robog@gmx.de>
* @author Erik Pedersen <erik pedersen@shaw.ca>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Robert Bogenschneider <robog@GMX.de>
* @author Robert BOGENSCHNEIDER <robog@gmx.de>
- * @author Robert BOGENSCHNEIDER <bogi@UEA.org>
+ * @author Robert Bogenschneider <bogi@uea.org>
+ * @author Robert Bogenschneider <robog@gmx.de>
*/
$lang['menu'] = 'Administri Kromaĵojn';
$lang['download'] = 'Elŝuti kaj instali novan kromaĵon';
$lang['manage'] = 'Instalitaj kromaĵoj';
-$lang['btn_info'] = 'info';
-$lang['btn_update'] = 'ĝisdatigo';
-$lang['btn_delete'] = 'forigi';
+$lang['btn_info'] = 'Info';
+$lang['btn_update'] = 'Ĝisdatigo';
+$lang['btn_delete'] = 'Forigi';
$lang['btn_settings'] = 'agordoj';
$lang['btn_download'] = 'Elŝuti';
$lang['btn_enable'] = 'Konservi';
@@ -29,16 +28,16 @@ $lang['source'] = 'Fonto:';
$lang['unknown'] = 'nekonate';
$lang['updating'] = 'Ĝisdatiganta ...';
$lang['updated'] = 'Kromaĵo %s estas sukcese ĝisdatigita';
-$lang['updates'] = 'La jenaj kromaĵoj estas sukcese ĝisdatigitaj';
+$lang['updates'] = 'Jenaj kromaĵoj estas sukcese ĝisdatigitaj';
$lang['update_none'] = 'Neniu ĝisdatigo troviĝas.';
$lang['deleting'] = 'Foriganta ...';
$lang['deleted'] = 'Kromaĵo %s estas forigita.';
$lang['downloading'] = 'Elŝutanta ...';
$lang['downloaded'] = 'La kromaĵo %s estas sukcese instalita';
-$lang['downloads'] = 'La jenaj kromaĵoj estas sukcese instalitaj:';
+$lang['downloads'] = 'Jenaj kromaĵoj estas sukcese instalitaj:';
$lang['download_none'] = 'Neniu kromaĵo troveblas, aŭ eble okazis nekonata problemo dum elŝuto kaj instalo.';
$lang['plugin'] = 'Kromaĵo:';
-$lang['components'] = 'Komponeroj';
+$lang['components'] = 'Komponantoj';
$lang['noinfo'] = 'Tiu ĉi kromaĵo liveris neniun informon: eble ĝi ne validas.';
$lang['name'] = 'Nomo:';
$lang['date'] = 'Dato:';
@@ -50,11 +49,11 @@ $lang['error'] = 'Nekonata eraro okazis.';
$lang['error_download'] = 'Maleblas elŝuti la kromaĵan dosieron: %s';
$lang['error_badurl'] = 'Suspektinda malbona URL - maleblas difini la dosieran nomon el la URL';
$lang['error_dircreate'] = 'Maleblas krei provizoran dosierujon por ricevi elŝutaĵon';
-$lang['error_decompress'] = 'La administrilo de kromaĵoj ne kapablis malkompakti la elŝutitan dosieron. Tio povas esti pro malkompleta elŝuto, tiaokaze vi devus provi refoje; aŭ eble la kompakta formato ne estas konata, tiaokaze vi bezonos elŝuti kaj instali la kromaĵon permane.';
-$lang['error_copy'] = 'Okazis eraro de dosierkopio dum provo instali dosierojn por la kromaĵo &lt;em&gt;%s&lt;/em&gt;: la disko povus esti plenplena aŭ aliro-rajtoj povus esti misdifinitaj. Tio povus rezulti en malkomplete instalita kromaĵo kaj igi vian vikion malstabila.';
-$lang['error_delete'] = 'Okazis eraro dum provo forigi la kromaĵon &lt;em&gt;%s&lt;/em&gt;. Plejprobable tio sekvas de nesufiĉa rajto por aliri la dosieron aŭ ties ujon.';
+$lang['error_decompress'] = 'La administrilo de kromaĵoj ne kapablis malkompakti la elŝutitan dosieron. Tio povas esti pro malkompleta elŝuto, tiaokaze provu refoje; aŭ eble la kompakta formato ne estas konata, tiaokaze elŝutu kaj instalu la kromaĵon permane.';
+$lang['error_copy'] = 'Okazis eraro de dosierkopio dum provo instali dosierojn por la kromaĵo <em>%s&</em>: la disko povus esti plenplena aŭ aliro-rajtoj povus esti misdifinitaj. Tio povus rezulti en malkomplete instalita kromaĵo kaj igi vian vikion malstabila.';
+$lang['error_delete'] = 'Okazis eraro dum provo forigi la kromaĵon <em>%s</em>. Verŝajne tio sekvas de nesufiĉa rajto por aliri la dosieron aŭ ties ujon.';
$lang['enabled'] = 'La kromaĵo %s estas ebligita.';
$lang['notenabled'] = 'La kromaĵo %s ne povis esti ebligita, kontrolu dosier-permesojn.';
$lang['disabled'] = 'La kromaĵo %s estas malebligita.';
$lang['notdisabled'] = 'La kromaĵo %s ne povis esti malebligita, kontrolu dosier-permesojn.';
-$lang['packageinstalled'] = 'Kromaĵa pakaĵo (%d kromaĵo(j): %s) sukcese instalitaj.';
+$lang['packageinstalled'] = 'Kromaĵa pakaĵo (%d kromaĵo(j): %s) sukcese instalita.';
diff --git a/lib/plugins/plugin/lang/es/lang.php b/lib/plugins/plugin/lang/es/lang.php
index ac548245b..db91b73c6 100644
--- a/lib/plugins/plugin/lang/es/lang.php
+++ b/lib/plugins/plugin/lang/es/lang.php
@@ -22,6 +22,7 @@
* @author emezeta <emezeta@infoprimo.com>
* @author Oscar Ciudad <oscar@jacho.net>
* @author Ruben Figols <ruben.figols@gmail.com>
+ * @author Gerardo Zamudio <gerardo@gerardozamudio.net>
*/
$lang['menu'] = 'Administración de Plugins';
$lang['download'] = 'Descargar e instalar un nuevo plugin';
diff --git a/lib/plugins/plugin/lang/fa/lang.php b/lib/plugins/plugin/lang/fa/lang.php
index 8f3fb8a41..dbfe9ef9a 100644
--- a/lib/plugins/plugin/lang/fa/lang.php
+++ b/lib/plugins/plugin/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['menu'] = 'مدیریت افزونه‌ها';
$lang['download'] = 'دریافت و نصب افزونه';
diff --git a/lib/plugins/plugin/lang/fr/lang.php b/lib/plugins/plugin/lang/fr/lang.php
index bb0b49872..31d524cc6 100644
--- a/lib/plugins/plugin/lang/fr/lang.php
+++ b/lib/plugins/plugin/lang/fr/lang.php
@@ -17,6 +17,8 @@
* @author Johan Guilbaud <guilbaud.johan@gmail.com>
* @author schplurtz@laposte.net
* @author skimpax@gmail.com
+ * @author Yannick Aure <yannick.aure@gmail.com>
+ * @author Olivier DUVAL <zorky00@gmail.com>
*/
$lang['menu'] = 'Gestion des modules externes';
$lang['download'] = 'Télécharger et installer un nouveau module';
diff --git a/lib/plugins/plugin/lang/gl/lang.php b/lib/plugins/plugin/lang/gl/lang.php
index 157911a62..a314b71b9 100644
--- a/lib/plugins/plugin/lang/gl/lang.php
+++ b/lib/plugins/plugin/lang/gl/lang.php
@@ -3,6 +3,7 @@
* Galicianlanguage file
*
* @author Medúlio <medulio@ciberirmandade.org>
+ * @author Oscar M. Lage <r0sk10@gmail.com>
*/
$lang['menu'] = 'Xestionar Extensións';
$lang['download'] = 'Descargar e instalar unha nova extensión';
@@ -48,3 +49,4 @@ $lang['enabled'] = 'Extensión %s activado.';
$lang['notenabled'] = 'A extensión %s non puido ser activada, comproba os permisos de arquivo.';
$lang['disabled'] = 'Extensión %s desactivada.';
$lang['notdisabled'] = 'A extensión %s non puido ser desactivada, comproba os permisos de arquivo.';
+$lang['packageinstalled'] = 'Paquete de extensión (%d plugin(s): %s) instalado axeitadamente.';
diff --git a/lib/plugins/plugin/lang/it/lang.php b/lib/plugins/plugin/lang/it/lang.php
index e675c5530..9ae55c5de 100644
--- a/lib/plugins/plugin/lang/it/lang.php
+++ b/lib/plugins/plugin/lang/it/lang.php
@@ -13,6 +13,8 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
+ * @author snarchio@gmail.com
*/
$lang['menu'] = 'Gestione Plugin';
$lang['download'] = 'Scarica e installa un nuovo plugin';
@@ -58,3 +60,4 @@ $lang['enabled'] = 'Plugin %s abilitato.';
$lang['notenabled'] = 'Impossibile abilitare il plugin %s, verifica i permessi dei file.';
$lang['disabled'] = 'Plugin %s disabilitato.';
$lang['notdisabled'] = 'Impossibile disabilitare il plugin %s, verifica i permessi dei file.';
+$lang['packageinstalled'] = 'Pacchetto plugin (%d plugin(s): %s) installato con successo.';
diff --git a/lib/plugins/plugin/lang/ja/lang.php b/lib/plugins/plugin/lang/ja/lang.php
index a96dcc9be..d366806c3 100644
--- a/lib/plugins/plugin/lang/ja/lang.php
+++ b/lib/plugins/plugin/lang/ja/lang.php
@@ -8,6 +8,7 @@
* @author Ikuo Obataya <i.obataya@gmail.com>
* @author Daniel Dupriest <kououken@gmail.com>
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ * @author Taisuke Shimamoto <dentostar@gmail.com>
*/
$lang['menu'] = 'プラグイン管理';
$lang['download'] = 'プラグインのダウンロードとインストール';
diff --git a/lib/plugins/plugin/lang/ko/admin_plugin.txt b/lib/plugins/plugin/lang/ko/admin_plugin.txt
index 22ce0e6e6..b553d622b 100644
--- a/lib/plugins/plugin/lang/ko/admin_plugin.txt
+++ b/lib/plugins/plugin/lang/ko/admin_plugin.txt
@@ -1,5 +1,5 @@
====== 플러그인 관리 ======
-이 페이지에서 Dokuwiki[[doku>plugins|plugins]]에 관련된 모든 관리 작업을 합니다. 플러그인을 다운로드하거나 설치하기 위해서 웹서버가 플러그인 디렉토리에 대해 쓰기 권한을 가지고 있어야 합니다.
+이 페이지에서 Dokuwiki [[doku>plugins|플러그인]]에 관련된 모든 관리 작업을 합니다. 플러그인을 다운로드하거나 설치하기 위해서는 웹 서버가 플러그인 디렉토리에 대해 쓰기 권한을 가지고 있어야 합니다.
diff --git a/lib/plugins/plugin/lang/ko/lang.php b/lib/plugins/plugin/lang/ko/lang.php
index c77c3259d..4fc6fd1d9 100644
--- a/lib/plugins/plugin/lang/ko/lang.php
+++ b/lib/plugins/plugin/lang/ko/lang.php
@@ -8,49 +8,51 @@
* @author Song Younghwan <purluno@gmail.com>
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
+ * @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['menu'] = '플러그인 관리자';
-$lang['download'] = '새로운 플러그인 다운로드 및 설치';
-$lang['manage'] = '이미 설치된 플러그인들';
+$lang['download'] = '새 플러그인 다운로드 및 설치';
+$lang['manage'] = '이미 설치한 플러그인';
$lang['btn_info'] = '정보';
-$lang['btn_update'] = '갱신';
+$lang['btn_update'] = '업데이트';
$lang['btn_delete'] = '삭제';
$lang['btn_settings'] = '설정';
$lang['btn_download'] = '다운로드';
$lang['btn_enable'] = '저장';
$lang['url'] = 'URL';
-$lang['installed'] = '설치된:';
-$lang['lastupdate'] = '가장 최근에 갱신된:';
-$lang['source'] = '소스:';
-$lang['unknown'] = '알 수 없는';
-$lang['updating'] = '갱신 중 ...';
-$lang['updated'] = '%s 플러그인이 성공적으로 갱신되었습니다.';
-$lang['updates'] = '다음 플러그인들이 성공적으로 갱신되었습니다:';
-$lang['update_none'] = '갱신 가능한 플러그인이 없습니다.';
+$lang['installed'] = '설치됨:';
+$lang['lastupdate'] = '가장 나중에 업데이트됨:';
+$lang['source'] = '내용:';
+$lang['unknown'] = '알 수 없음';
+$lang['updating'] = '업데이트 중 ...';
+$lang['updated'] = '%s 플러그인을 성공적으로 업데이트했습니다';
+$lang['updates'] = '다음 플러그인을 성공적으로 업데이트했습니다';
+$lang['update_none'] = '업데이트를 찾을 수 없습니다.';
$lang['deleting'] = '삭제 중 ...';
$lang['deleted'] = '%s 플러그인이 삭제되었습니다.';
$lang['downloading'] = '다운로드 중 ...';
$lang['downloaded'] = '%s 플러그인이 성공적으로 설치되었습니다.';
-$lang['downloads'] = '다음 플러그인들이 성공적으로 설치되었습니다:';
-$lang['download_none'] = '플러그인이 없거나 다운로드/설치 중에 알수 없는 문제가 발생했습니다.';
+$lang['downloads'] = '다음 플러그인이 성공적으로 설치되었습니다:';
+$lang['download_none'] = '플러그인이 없거나 다운로드 또는 설치 중에 알 수 없는 문제가 발생했습니다.';
$lang['plugin'] = '플러그인:';
-$lang['components'] = '콤퍼넌트들';
-$lang['noinfo'] = '이 플러그인은 어떤 정보도 없습니다. 유효한 플러그인이 아닐 지도 모릅니다.';
+$lang['components'] = '구성 요소';
+$lang['noinfo'] = '이 플러그인은 어떤 정보도 없습니다. 잘못된 플러그인일 수 있습니다.';
$lang['name'] = '이름:';
$lang['date'] = '날짜:';
-$lang['type'] = '타입:';
+$lang['type'] = '종류:';
$lang['desc'] = '설명:';
-$lang['author'] = '제작자:';
+$lang['author'] = '만든이:';
$lang['www'] = '웹:';
$lang['error'] = '알 수 없는 문제가 발생했습니다.';
$lang['error_download'] = '플러그인 파일을 다운로드 할 수 없습니다: %s';
-$lang['error_badurl'] = '잘못된 URL같습니다. - URL에서 파일 이름을 알 수 없습니다.';
+$lang['error_badurl'] = '잘못된 URL 같습니다 - URL에서 파일 이름을 알 수 없습니다.';
$lang['error_dircreate'] = '다운로드를 받기 위한 임시 디렉토리를 만들 수 없습니다.';
-$lang['error_decompress'] = '플러그인 매니저가 다운로드 받은 파일을 압축해제할 수 없습니다.잘못 다운로드 받았을 수도 있으니 다시 한번 시도해보기 바랍니다; 압축 포맷을 알 수 없는 경우에는 다운로드 후 수동으로 직접 설치하기 바랍니다.';
-$lang['error_copy'] = '플러그인 설치하는 동안 파일 복사 에러가 발생했습니다. <em>%s</em>: 디스크가 꽉 찼거나 파일 접근 권한이 잘못된 경우입니다. 플러그인 설치가 부분적으로만 이루어졌을 것입니다.설치가 불완전합니다.';
-$lang['error_delete'] = '<em>%s</em> 플러그인 삭제 도중 에러가 발생했습니다. 대부분의 경우, 불완전한 파일이거나 디렉토리 접근 권한이 잘못된 경우입니다.';
-$lang['enabled'] = '%s 플러그인을 켰습니다.';
-$lang['notenabled'] = '%s 플러그인을 킬 수 없습니다. 파일 권한을 확인하십시오.';
-$lang['disabled'] = '%s 플러그인을 껐습니다.';
-$lang['notdisabled'] = '%s 플러그인을 끌 수 없습니다. 파일 권한을 확인하십시오.';
-$lang['packageinstalled'] = '플러그인 패키지(%d 개의 플러그인: %s)가 성공적으로 설치되었습니다.';
+$lang['error_decompress'] = '플러그인 관리자가 다운로드 받은 파일을 압축을 풀 수 없습니다. 잘못 다운로드 받았을 수도 있으니 다시 한번 시도해보기 바랍니다. 또는 압축 포맷을 알 수 없는 경우에는 다운로드한 후 수동으로 직접 설치하기 바랍니다.';
+$lang['error_copy'] = '플러그인을 설치하는 동안 파일 복사하는 데 오류가 발생했습니다. <em>%s</em>: 디스크가 꽉 찼거나 파일 접근 권한이 잘못된 경우입니다. 플러그인 설치가 부분적으로만 이루어졌을 것입니다. 설치가 불완전합니다.';
+$lang['error_delete'] = '<em>%s</em> 플러그인을 삭제하는 동안 오류가 발생했습니다. 대부분의 경우 불완전한 파일이거나 디렉토리 접근 권한이 잘못된 경우입니다.';
+$lang['enabled'] = '%s 플러그인을 활성화했습니다.';
+$lang['notenabled'] = '%s 플러그인을 활성화할 수 없습니다. 파일 권한을 확인하십시오.';
+$lang['disabled'] = '%s 플러그인을 비활성화했습니다.';
+$lang['notdisabled'] = '%s 플러그인을 비활성화할 수 없습니다. 파일 권한을 확인하십시오.';
+$lang['packageinstalled'] = '플러그인 패키지(플러그인 %d개: %s)가 성공적으로 설치되었습니다.';
diff --git a/lib/plugins/plugin/lang/nl/lang.php b/lib/plugins/plugin/lang/nl/lang.php
index 0599c3184..10db78411 100644
--- a/lib/plugins/plugin/lang/nl/lang.php
+++ b/lib/plugins/plugin/lang/nl/lang.php
@@ -13,6 +13,7 @@
* @author Timon Van Overveldt <timonvo@gmail.com>
* @author Jeroen
* @author Ricardo Guijt <ricardoguijt@gmail.com>
+ * @author Gerrit <klapinklapin@gmail.com>
*/
$lang['menu'] = 'Plugins beheren';
$lang['download'] = 'Download en installeer een nieuwe plugin';
@@ -58,4 +59,4 @@ $lang['enabled'] = 'Plugin %s ingeschakeld.';
$lang['notenabled'] = 'Plugin %s kon niet worden ingeschakeld, controleer bestandsrechten.';
$lang['disabled'] = 'Plugin %s uitgeschakeld.';
$lang['notdisabled'] = 'Plugin %s kon niet worden uitgeschakeld, controleer bestandsrechten.';
-$lang['packageinstalled'] = 'Plugin package (%d plugin%s: %s) succesvol geïnstalleerd.';
+$lang['packageinstalled'] = 'Plugin package (%d plugin(s): %s) succesvol geïnstalleerd.';
diff --git a/lib/plugins/plugin/lang/pl/lang.php b/lib/plugins/plugin/lang/pl/lang.php
index 02459f1de..1d3bbbc03 100644
--- a/lib/plugins/plugin/lang/pl/lang.php
+++ b/lib/plugins/plugin/lang/pl/lang.php
@@ -14,6 +14,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['menu'] = 'Menadżer wtyczek';
$lang['download'] = 'Ściągnij i zainstaluj nową wtyczkę';
diff --git a/lib/plugins/plugin/lang/ro/lang.php b/lib/plugins/plugin/lang/ro/lang.php
index 9c90f77a3..c57647e0b 100644
--- a/lib/plugins/plugin/lang/ro/lang.php
+++ b/lib/plugins/plugin/lang/ro/lang.php
@@ -9,6 +9,8 @@
* @author Emanuel-Emeric Andraşi <em.andrasi@mandrivausers.ro>
* @author Emanuel-Emeric Andrasi <em.andrasi@mandrivausers.ro>
* @author Marius OLAR <olarmariusalex@gmail.com>
+ * @author Marius Olar <olarmariusalex@yahoo.com>
+ * @author Emanuel-Emeric Andrași <em.andrasi@mandrivausers.ro>
*/
$lang['menu'] = 'Administrează plugin-uri';
$lang['download'] = 'Descarcă şi instalează un nou plugin';
diff --git a/lib/plugins/plugin/lang/ru/lang.php b/lib/plugins/plugin/lang/ru/lang.php
index 757b607f5..f011c9954 100644
--- a/lib/plugins/plugin/lang/ru/lang.php
+++ b/lib/plugins/plugin/lang/ru/lang.php
@@ -16,6 +16,7 @@
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
* @author Ladyko Andrey <fylh@succexy.spb.ru>
* @author Eugene <windy.wanderer@gmail.com>
+ * @author Johnny Utah <pcpa@cyberpunk.su>
*/
$lang['menu'] = 'Управление плагинами';
$lang['download'] = 'Скачать и установить новый плагин';
@@ -61,3 +62,4 @@ $lang['enabled'] = 'Плагин %s включён.';
$lang['notenabled'] = 'Не удалось включить плагин %s. Проверьте системные права доступа к файлам.';
$lang['disabled'] = 'Плагин %s отключён.';
$lang['notdisabled'] = 'Не удалось отключить плагин %s. Проверьте системные права доступа к файлам.';
+$lang['packageinstalled'] = 'Пакет (%d плагин(а): %s) успешно установлен.';
diff --git a/lib/plugins/plugin/lang/sl/admin_plugin.txt b/lib/plugins/plugin/lang/sl/admin_plugin.txt
index 2e99c6297..5fd02e1ba 100644
--- a/lib/plugins/plugin/lang/sl/admin_plugin.txt
+++ b/lib/plugins/plugin/lang/sl/admin_plugin.txt
@@ -1,3 +1,3 @@
====== Upravljanje vstavkov ======
-Na tej strani je mogoe spreminjati in prilagajati nastavitve Dokuwiki [[doku>plugins|vstavkov]]. Za prejemanje in nameanje vstavkov v ustrezne mape, morajo imeti te doloena ustrezna dovoljenja za pisanje spletnega strenika.
+Na tej strani je mogoče spreminjati in prilagajati nastavitve DokuWiki [[doku>plugins|vstavkov]]. Za prejemanje in nameščanje vstavkov v ustrezne mape, morajo imeti te določena ustrezna dovoljenja za pisanje spletnega strežnika.
diff --git a/lib/plugins/plugin/lang/sl/lang.php b/lib/plugins/plugin/lang/sl/lang.php
index 39ba20139..3e5f8c8af 100644
--- a/lib/plugins/plugin/lang/sl/lang.php
+++ b/lib/plugins/plugin/lang/sl/lang.php
@@ -7,7 +7,6 @@
* @author Gregor Skumavc (grega.skumavc@gmail.com)
* @author Matej Urbančič (mateju@svn.gnome.org)
*/
-
$lang['menu'] = 'Upravljanje vstavkov';
$lang['download'] = 'Prejmi in namesti nov vstavek';
$lang['manage'] = 'Nameščeni vstavki';
@@ -52,3 +51,4 @@ $lang['enabled'] = 'Vstavek %s je omogočen.';
$lang['notenabled'] = 'Vstavka %s ni mogoče omogočiti zaradi neustreznih dovoljen.';
$lang['disabled'] = 'Vstavek %s je onemogočen.';
$lang['notdisabled'] = 'Vstavka %s ni mogoče onemogočiti zaradi neustreznih dovoljen.';
+$lang['packageinstalled'] = 'Paket vstavka (%d vstavkov: %s) je uspešno nameščen.';
diff --git a/lib/plugins/plugin/lang/vi/lang.php b/lib/plugins/plugin/lang/vi/lang.php
new file mode 100644
index 000000000..2933d8875
--- /dev/null
+++ b/lib/plugins/plugin/lang/vi/lang.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Vietnamese language file
+ *
+ */
diff --git a/lib/plugins/plugin/lang/zh-tw/lang.php b/lib/plugins/plugin/lang/zh-tw/lang.php
index 54234212d..8fa3efb0a 100644
--- a/lib/plugins/plugin/lang/zh-tw/lang.php
+++ b/lib/plugins/plugin/lang/zh-tw/lang.php
@@ -9,6 +9,7 @@
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
* @author Danny Lin
* @author Shuo-Ting Jian <shoting@gmail.com>
+ * @author syaoranhinata@gmail.com
*/
$lang['menu'] = '管理插件 (Plugins)';
$lang['download'] = '下載與安裝插件';
@@ -20,8 +21,8 @@ $lang['btn_settings'] = '設定';
$lang['btn_download'] = '下載';
$lang['btn_enable'] = '儲存';
$lang['url'] = 'URL';
-$lang['installed'] = '安裝:';
-$lang['lastupdate'] = '上次更新:';
+$lang['installed'] = '安裝:';
+$lang['lastupdate'] = '上次更新:';
$lang['source'] = '來源:';
$lang['unknown'] = '未知';
$lang['updating'] = '更新中 ...';
@@ -34,17 +35,17 @@ $lang['downloading'] = '下載中 ...';
$lang['downloaded'] = '插件 %s 已成功地安裝';
$lang['downloads'] = '以下的插件已成功地安裝:';
$lang['download_none'] = '找不到插件,或在下載與安裝時發生了未知的問題';
-$lang['plugin'] = '插件:';
+$lang['plugin'] = '插件:';
$lang['components'] = '元件';
$lang['noinfo'] = '此插件沒有回傳任何資訊,可能是無效的';
-$lang['name'] = '名稱:';
-$lang['date'] = '日期:';
-$lang['type'] = '類型:';
-$lang['desc'] = '描述:';
-$lang['author'] = '作者:';
+$lang['name'] = '名稱:';
+$lang['date'] = '日期:';
+$lang['type'] = '類型:';
+$lang['desc'] = '描述:';
+$lang['author'] = '作者:';
$lang['www'] = '網頁:';
$lang['error'] = '一個未知的錯誤發生。';
-$lang['error_download'] = '無法下載插件檔案: %s';
+$lang['error_download'] = '無法下載插件檔案: %s';
$lang['error_badurl'] = 'URL 可能有問題 - 從 URL 中無法得知文件名';
$lang['error_dircreate'] = '無法建立暫存目錄來接收下載的內容';
$lang['error_decompress'] = '插件管理器無法解壓下載的文件。這可能是由於下載出現錯誤,遇到這種情況,請您再次嘗試;或者是壓縮格式無法識別,遇到這種情況,您需要手動下載並安裝該插件。';
diff --git a/lib/plugins/plugin/lang/zh/lang.php b/lib/plugins/plugin/lang/zh/lang.php
index 58f05fbd9..473d31ead 100644
--- a/lib/plugins/plugin/lang/zh/lang.php
+++ b/lib/plugins/plugin/lang/zh/lang.php
@@ -60,4 +60,4 @@ $lang['enabled'] = '%s 插件启用';
$lang['notenabled'] = '%s插件启用失败,请检查文件权限。';
$lang['disabled'] = '%s 插件禁用';
$lang['notdisabled'] = '%s插件禁用失败,请检查文件权限。';
-$lang['packageinstalled'] = '插件 (%d plugin%s: %s) 已成功安装。';
+$lang['packageinstalled'] = '插件 (%d 插件: %s) 已成功安装。';
diff --git a/lib/plugins/plugin/plugin.info.txt b/lib/plugins/plugin/plugin.info.txt
new file mode 100644
index 000000000..c2f72d998
--- /dev/null
+++ b/lib/plugins/plugin/plugin.info.txt
@@ -0,0 +1,7 @@
+base plugin
+author Christopher Smith
+email chris@jalakai.co.uk
+date 2012-09-08
+name Plugin Manager plugin
+desc Manage and install plugins
+url http://www.dokuwiki.org/plugin:plugin
diff --git a/lib/plugins/plugin/rtl.css b/lib/plugins/plugin/rtl.css
deleted file mode 100644
index 6ababd8e0..000000000
--- a/lib/plugins/plugin/rtl.css
+++ /dev/null
@@ -1,51 +0,0 @@
-
-#plugin__manager .pm_menu,
-#plugin__manager .pm_info,
-#plugin__manager p,
-#plugin__manager label {
- text-align: right;
-}
-
-#plugin__manager .pm_menu {
- float: right;
-}
-
-#plugin__manager .pm_info {
- float: left;
-}
-
-#plugin__manager .pm_info dt {
- float: right;
- clear: right;
-}
-
-#plugin__manager .pm_info dd {
- margin: 0 7em 0 0;
-}
-
-#plugin__manager .common fieldset {
- text-align: right;
-}
-
-
-#plugin__manager .plugins .legend {
- text-align: right;
- float: right;
-}
-
-#plugin__manager .plugins .enable {
- float: right;
- margin-right: 0;
- margin-left: 0.5em;
-}
-
-#plugin__manager .plugins .button {
- float: left;
- margin-right: 0.5em;
-}
-
-
-#plugin__manager .plugins fieldset.buttons .button {
- float: right;
-}
-
diff --git a/lib/plugins/plugin/style.css b/lib/plugins/plugin/style.css
index de6cca579..9433e6001 100644
--- a/lib/plugins/plugin/style.css
+++ b/lib/plugins/plugin/style.css
@@ -52,15 +52,28 @@
text-align: left;
}
+[dir=rtl] #plugin__manager .pm_menu,
+[dir=rtl] #plugin__manager .pm_info,
+[dir=rtl] #plugin__manager p,
+[dir=rtl] #plugin__manager label {
+ text-align: right;
+}
+
#plugin__manager .pm_menu {
float: left;
width: 48%;
}
+[dir=rtl] #plugin__manager .pm_menu {
+ float: right;
+}
#plugin__manager .pm_info {
float: right;
width: 50%;
}
+[dir=rtl] #plugin__manager .pm_info {
+ float: left;
+}
#plugin__manager .common fieldset {
margin: 0;
@@ -68,6 +81,9 @@
text-align: left;
border: none;
}
+[dir=rtl] #plugin__manager .common fieldset {
+ text-align: right;
+}
#plugin__manager .common label {
padding: 0 0 0.5em 0;
@@ -111,6 +127,10 @@
padding: 0;
clear: none;
}
+[dir=rtl] #plugin__manager .plugins .legend {
+ text-align: right;
+ float: right;
+}
#plugin__manager .plugins .button {
font-size: 95%;
@@ -123,6 +143,13 @@
#plugin__manager .plugins fieldset.buttons .button {
float: left;
}
+[dir=rtl] #plugin__manager .plugins .button {
+ float: left;
+ margin-right: 0.5em;
+}
+[dir=rtl] #plugin__manager .plugins fieldset.buttons .button {
+ float: right;
+}
#plugin__manager .pm_info h3 {
margin-left: 0;
@@ -140,17 +167,29 @@
margin: 0;
padding: 0;
}
+[dir=rtl] #plugin__manager .pm_info dt {
+ float: right;
+ clear: right;
+}
#plugin__manager .pm_info dd {
margin: 0 0 0 7em;
padding: 0;
background: none;
}
+[dir=rtl] #plugin__manager .pm_info dd {
+ margin: 0 7em 0 0;
+}
#plugin__manager .plugins .enable {
float: left;
width: auto;
margin-right: 0.5em;
}
+[dir=rtl] #plugin__manager .plugins .enable {
+ float: right;
+ margin-right: 0;
+ margin-left: 0.5em;
+}
/* end admin plugin styles */
diff --git a/lib/plugins/popularity/admin.php b/lib/plugins/popularity/admin.php
index a04e98a66..474a09ef9 100644
--- a/lib/plugins/popularity/admin.php
+++ b/lib/plugins/popularity/admin.php
@@ -50,15 +50,17 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
* handle user request
*/
function handle() {
+ global $INPUT;
+
//Send the data
- if ( isset($_REQUEST['data']) ){
- $this->sentStatus = $this->helper->sendData( $_REQUEST['data'] );
+ if ( $INPUT->has('data') ){
+ $this->sentStatus = $this->helper->sendData( $INPUT->str('data') );
if ( $this->sentStatus === '' ){
//Update the last time we sent the data
touch ( $this->helper->popularityLastSubmitFile );
}
//Deal with the autosubmit option
- $this->_enableAutosubmit( isset($_REQUEST['autosubmit']) );
+ $this->_enableAutosubmit( $INPUT->has('autosubmit') );
}
}
@@ -78,7 +80,9 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
* Output HTML form
*/
function html() {
- if ( ! isset($_REQUEST['data']) ){
+ global $INPUT;
+
+ if ( ! $INPUT->has('data') ){
echo $this->locale_xhtml('intro');
//If there was an error the last time we tried to autosubmit, warn the user
@@ -106,7 +110,7 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
//If we failed to submit the data, try directly with the browser
echo $this->getLang('submissionFailed') . $this->sentStatus . '<br />';
echo $this->getLang('submitDirectly');
- echo $this->buildForm('browser', $_REQUEST['data']);
+ echo $this->buildForm('browser', $INPUT->str('data'));
}
}
}
@@ -135,7 +139,7 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
$form .= '<label for="autosubmit">'
.'<input type="checkbox" name="autosubmit" id="autosubmit" '
.($this->helper->isAutosubmitEnabled() ? 'checked' : '' )
- .'/>' . $this->getLang('autosubmit') .'<br />'
+ .'/> ' . $this->getLang('autosubmit') .'<br />'
.'</label>'
.'<input type="hidden" name="do" value="admin" />'
.'<input type="hidden" name="page" value="popularity" />';
diff --git a/lib/plugins/popularity/lang/cs/lang.php b/lib/plugins/popularity/lang/cs/lang.php
index 287bcf3b0..d7c58af2e 100644
--- a/lib/plugins/popularity/lang/cs/lang.php
+++ b/lib/plugins/popularity/lang/cs/lang.php
@@ -8,6 +8,7 @@
* @author Lefty <lefty@multihost.cz>
* @author Vojta Beran <xmamut@email.cz>
* @author zbynek.krivka@seznam.cz
+ * @author Bohumir Zamecnik <bohumir.zamecnik@gmail.com>
*/
$lang['name'] = 'Průzkum používání (může chviličku trvat, než se natáhne)';
$lang['submit'] = 'Odeslat data';
diff --git a/lib/plugins/popularity/lang/da/lang.php b/lib/plugins/popularity/lang/da/lang.php
index 325fd6568..bbf2a1ab4 100644
--- a/lib/plugins/popularity/lang/da/lang.php
+++ b/lib/plugins/popularity/lang/da/lang.php
@@ -9,6 +9,12 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['name'] = 'Tilbagemelding om popularitet (vil måske tage en del tid at indlæse)';
$lang['submit'] = 'Send data';
+$lang['autosubmit'] = 'Automatisk sende data en gang om måneden';
+$lang['submissionFailed'] = 'Dataene kunne ikke sendes pga. følgende fejl:';
+$lang['submitDirectly'] = 'Du kan sende dataene manuelt ved at sende følgende formular.';
+$lang['autosubmitError'] = 'Den sidste automatiske fremsendelse fejlede pga. følgende fejl:';
+$lang['lastSent'] = 'Dataene er blevet sendt.';
diff --git a/lib/plugins/popularity/lang/da/submitted.txt b/lib/plugins/popularity/lang/da/submitted.txt
new file mode 100644
index 000000000..7d7d5429c
--- /dev/null
+++ b/lib/plugins/popularity/lang/da/submitted.txt
@@ -0,0 +1,3 @@
+====== Popularitetsfeeback ======
+
+Dataene er blevet sendt. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/eo/intro.txt b/lib/plugins/popularity/lang/eo/intro.txt
index 8d9b3dde8..fd37efc70 100644
--- a/lib/plugins/popularity/lang/eo/intro.txt
+++ b/lib/plugins/popularity/lang/eo/intro.txt
@@ -1,9 +1,9 @@
====== Populareca enketo ======
-Tiu ĉi ilo prenas anoniman datenaron pri via vikio kaj ebligas al vi sendi ĝin reen al la kodumantoj de DokuWiki. Tio helpas ke ili komprenu kiel DokuWiki estas uzata kaj certigas ke estontaj disvolviĝaj decidoj estos subtenataj de statistikoj pri reala aplikado.
+Tiu ĉi ilo prenas anoniman datenaron pri via vikio kaj ebligas al vi sendi ĝin reen al la kodumantoj de DokuWiki. Tio helpas al ili kompreni kiel DokuWiki estas uzata kaj certigas ke estontaj disvolviĝaj decidoj estos subtenataj de statistikoj pri reala aplikado.
Ni instigas vin ripeti tiun agon iam kaj tiam por teni la disvolvigantojn informitaj, dum via vikio kreskas. Viaj resendotaj datenaroj estos identigitaj per anonima ID.
-La kolektita datenaro enhavas informon pri versio de la instalita DokuWiki, nombro kaj grandeco de la paĝoj kaj dosieroj, instalitaj kromaĵoj kaj informoj pri via PHP-sistemo.
+La kolektita datumaro enhavas informon pri versio de la instalita DokuWiki, nombro kaj grandeco de la paĝoj kaj dosieroj, instalitaj kromaĵoj kaj informoj pri via PHP-sistemo.
-La kruda datenaro sendota estas montrita sube. Bonvole uzu la butonon &quot;Sendi datumaron&quot; por transŝuti tiun informaron. \ No newline at end of file
+La kruda datumaro sendota estas montrita sube. Bonvolu uzi la butonon "Sendi datumaron" por transŝuti tiun informaron.
diff --git a/lib/plugins/popularity/lang/eo/lang.php b/lib/plugins/popularity/lang/eo/lang.php
index e992e12ce..c2bca23b1 100644
--- a/lib/plugins/popularity/lang/eo/lang.php
+++ b/lib/plugins/popularity/lang/eo/lang.php
@@ -7,14 +7,12 @@
* @author Robert Bogenschneider <robog@gmx.de>
* @author Erik Pedersen <erik pedersen@shaw.ca>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Robert Bogenschneider <robog@GMX.de>
- * @author Robert BOGENSCHNEIDER <robog@gmx.de>
- * @author Robert BOGENSCHNEIDER <bogi@UEA.org>
+ * @author Robert Bogenschneider <bogi@uea.org>
*/
$lang['name'] = 'Populareca enketo (eble la ŝargo prokrastos iomete)';
$lang['submit'] = 'Sendi datumaron';
$lang['autosubmit'] = 'Aŭtomate sendi datumaron monate';
-$lang['submissionFailed'] = 'La datumaro ne povis esti sendata pro la jena eraro:';
+$lang['submissionFailed'] = 'La datumaro ne povis esti sendata tial:';
$lang['submitDirectly'] = 'Vi povas sendi vi mem la datumaron per la sekva informilo.';
-$lang['autosubmitError'] = 'La lasta aŭtomata sendo malsukcesis, pro la jena eraro:';
-$lang['lastSent'] = 'La datumaro estas sendita';
+$lang['autosubmitError'] = 'La lasta aŭtomata sendo malsukcesis, tial:';
+$lang['lastSent'] = 'La datumaro sendiĝis';
diff --git a/lib/plugins/popularity/lang/eo/submitted.txt b/lib/plugins/popularity/lang/eo/submitted.txt
index c2bce4e9f..095439bf3 100644
--- a/lib/plugins/popularity/lang/eo/submitted.txt
+++ b/lib/plugins/popularity/lang/eo/submitted.txt
@@ -1,3 +1,3 @@
====== Enketo pri Populareco ======
-La datumoj estis senditaj sukcese. \ No newline at end of file
+La datumoj sendiĝis sukcese.
diff --git a/lib/plugins/popularity/lang/es/lang.php b/lib/plugins/popularity/lang/es/lang.php
index 752fb7da4..2be2d4a04 100644
--- a/lib/plugins/popularity/lang/es/lang.php
+++ b/lib/plugins/popularity/lang/es/lang.php
@@ -19,6 +19,7 @@
* @author emezeta <emezeta@infoprimo.com>
* @author Oscar Ciudad <oscar@jacho.net>
* @author Ruben Figols <ruben.figols@gmail.com>
+ * @author Gerardo Zamudio <gerardo@gerardozamudio.net>
*/
$lang['name'] = 'Retroinformación (Feedback) plugin Popularity';
$lang['submit'] = 'Enviar datos';
diff --git a/lib/plugins/popularity/lang/fa/lang.php b/lib/plugins/popularity/lang/fa/lang.php
index 70c65f1b3..600e68077 100644
--- a/lib/plugins/popularity/lang/fa/lang.php
+++ b/lib/plugins/popularity/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['name'] = 'بازخورد محبوبیت (ممکن است اندکی زمان ببرد)';
$lang['submit'] = 'ارسال اطلاعات';
diff --git a/lib/plugins/popularity/lang/fr/lang.php b/lib/plugins/popularity/lang/fr/lang.php
index 6b2a40204..904987079 100644
--- a/lib/plugins/popularity/lang/fr/lang.php
+++ b/lib/plugins/popularity/lang/fr/lang.php
@@ -14,11 +14,13 @@
* @author Johan Guilbaud <guilbaud.johan@gmail.com>
* @author schplurtz@laposte.net
* @author skimpax@gmail.com
+ * @author Yannick Aure <yannick.aure@gmail.com>
+ * @author Olivier DUVAL <zorky00@gmail.com>
*/
$lang['name'] = 'Enquête de popularité (peut nécessiter un certain temps pour être chargée)';
$lang['submit'] = 'Envoyer les données';
$lang['autosubmit'] = 'Envoyer les données automatiquement chaque mois';
$lang['submissionFailed'] = 'Les données ne peuvent pas être envoyées à cause des erreurs suivantes :';
-$lang['submitDirectly'] = 'Vous pouvez envoyer le données manuellement en soumettant ce formulaire.';
+$lang['submitDirectly'] = 'Vous pouvez envoyer le données manuellement en soumettant ce formulaire.';
$lang['autosubmitError'] = 'La dernière soumission automatique a échoué pour les raisons suivantes :';
-$lang['lastSent'] = 'Les données ont été envoyées';
+$lang['lastSent'] = 'Les données ont été envoyées ';
diff --git a/lib/plugins/popularity/lang/gl/lang.php b/lib/plugins/popularity/lang/gl/lang.php
index 3e7d9275b..34bd3935f 100644
--- a/lib/plugins/popularity/lang/gl/lang.php
+++ b/lib/plugins/popularity/lang/gl/lang.php
@@ -3,6 +3,12 @@
* Galician language file
*
* @author Medúlio <medulio@ciberirmandade.org>
+ * @author Oscar M. Lage <r0sk10@gmail.com>
*/
$lang['name'] = 'Resposta de Popularidade (pode demorar un tempo a cargar)';
$lang['submit'] = 'Enviar Datos';
+$lang['autosubmit'] = 'Enviar datos automáticamente unha vez por mes';
+$lang['submissionFailed'] = 'Os datos non se poden enviar debido ao seguinte erro:';
+$lang['submitDirectly'] = 'Podes enviar os datos de forma manual co seguinte formulario.';
+$lang['autosubmitError'] = 'O último envío automático fallou debido ao seguinte erro:';
+$lang['lastSent'] = 'Os datos foron enviados';
diff --git a/lib/plugins/popularity/lang/gl/submitted.txt b/lib/plugins/popularity/lang/gl/submitted.txt
new file mode 100644
index 000000000..0dec55eef
--- /dev/null
+++ b/lib/plugins/popularity/lang/gl/submitted.txt
@@ -0,0 +1,3 @@
+====== Resposta de Popularidade ======
+
+Os datos foron enviados satisfactoriamente. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/it/lang.php b/lib/plugins/popularity/lang/it/lang.php
index a7852f22c..a0cf274aa 100644
--- a/lib/plugins/popularity/lang/it/lang.php
+++ b/lib/plugins/popularity/lang/it/lang.php
@@ -9,6 +9,8 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
+ * @author snarchio@gmail.com
*/
$lang['name'] = 'Raccolta dati sul wiki (può impiegare del tempo per caricarsi)';
$lang['submit'] = 'Invia dati';
diff --git a/lib/plugins/popularity/lang/ja/lang.php b/lib/plugins/popularity/lang/ja/lang.php
index 736924bb1..f5e280db5 100644
--- a/lib/plugins/popularity/lang/ja/lang.php
+++ b/lib/plugins/popularity/lang/ja/lang.php
@@ -6,6 +6,7 @@
* @author Daniel Dupriest <kououken@gmail.com>
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
* @author Yuji Takenaka <webmaster@davilin.com>
+ * @author Taisuke Shimamoto <dentostar@gmail.com>
*/
$lang['name'] = '利用状況調査(ロードに少し時間が掛かります)';
$lang['submit'] = 'データ送信';
diff --git a/lib/plugins/popularity/lang/ko/intro.txt b/lib/plugins/popularity/lang/ko/intro.txt
index e979b71d5..0af7ee2cc 100644
--- a/lib/plugins/popularity/lang/ko/intro.txt
+++ b/lib/plugins/popularity/lang/ko/intro.txt
@@ -1,9 +1,9 @@
====== 인기도 조사 ======
-설치된 위키의 익명 정보를 DokuWiki 개발자들에게 보냅니다. 이 기능은 DokuWiki가 실제 사용자들에게 어떻게 사용되는지 DokuWiki 개발자들에게 알려줌으로써 이 후 개발 시 참고가 됩니다.
+설치된 위키의 익명 정보를 DokuWiki 개발자에게 보냅니다. 이 [[doku>popularity|기능]]은 DokuWiki가 실제 사용자에게 어떻게 사용되는지 DokuWiki 개발자에게 알려줌으로써 이 후 개발 시 참고가 됩니다.
설치된 위키가 커짐에 따라서 이 과정을 반복할 필요가 있습니다. 반복된 데이타는 익명 ID로 구별되어집니다.
-전송 데이타는 설치 DokuWiki 버전, 페이지와 파일 수, 크기, 설치 플러그인, 설치 PHP 정보등을 포함하고 있습니다.
+전송 데이타는 설치 DokuWiki 버전, 문서와 파일 수, 크기, 설치 플러그인, 설치 PHP 정보등을 포함하고 있습니다.
-실제 보내질 자료는 아래와 같습니다. 정보를 보내려면 "자료 보내기" 버튼을 클릭합니다.
+실제 보내질 자료는 아래와 같습니다. 정보를 보내려면 "자료 보내기" 버튼을 클릭합니다. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/ko/lang.php b/lib/plugins/popularity/lang/ko/lang.php
index 0f1442d53..5e6966402 100644
--- a/lib/plugins/popularity/lang/ko/lang.php
+++ b/lib/plugins/popularity/lang/ko/lang.php
@@ -7,11 +7,13 @@
* @author Song Younghwan <purluno@gmail.com>
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
+ * @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['name'] = '인기도 조사 (불러오는데 시간이 걸릴 수 있습니다.)';
$lang['submit'] = '자료 보내기';
$lang['autosubmit'] = '자료를 자동으로 매달 한번씩 보내기';
-$lang['submissionFailed'] = '다음과 같은 이유로 자료 전송에 실패했습니다 :';
+$lang['submissionFailed'] = '다음과 같은 이유로 자료 전송에 실패했습니다:';
$lang['submitDirectly'] = '아래의 양식에 맞춰 수동으로 작성된 자료를 보낼 수 있습니다';
-$lang['autosubmitError'] = '다음과 같은 이유로 자동 자료 전송에 실패했습니다 :';
+$lang['autosubmitError'] = '다음과 같은 이유로 자동 자료 전송에 실패했습니다:';
$lang['lastSent'] = '자료가 전송되었습니다';
diff --git a/lib/plugins/popularity/lang/ko/submitted.txt b/lib/plugins/popularity/lang/ko/submitted.txt
index e8b434dc5..12f0efe45 100644
--- a/lib/plugins/popularity/lang/ko/submitted.txt
+++ b/lib/plugins/popularity/lang/ko/submitted.txt
@@ -1,3 +1,3 @@
====== 인기도 조사 ======
-자료 전송이 성공적으로 완료되었습니다 \ No newline at end of file
+자료 전송이 성공적으로 완료되었습니다. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/nl/lang.php b/lib/plugins/popularity/lang/nl/lang.php
index e5e94aab4..b32ad9eb6 100644
--- a/lib/plugins/popularity/lang/nl/lang.php
+++ b/lib/plugins/popularity/lang/nl/lang.php
@@ -12,6 +12,7 @@
* @author Timon Van Overveldt <timonvo@gmail.com>
* @author Jeroen
* @author Ricardo Guijt <ricardoguijt@gmail.com>
+ * @author Gerrit <klapinklapin@gmail.com>
*/
$lang['name'] = 'Populariteitsfeedback (kan even duren om in te laden)';
$lang['submit'] = 'Verstuur';
diff --git a/lib/plugins/popularity/lang/pl/lang.php b/lib/plugins/popularity/lang/pl/lang.php
index 64d772d54..76a9464bd 100644
--- a/lib/plugins/popularity/lang/pl/lang.php
+++ b/lib/plugins/popularity/lang/pl/lang.php
@@ -12,6 +12,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['name'] = 'Informacja o popularności (ładowanie może zająć dłuższą chwilę)';
$lang['submit'] = 'Wyślij dane';
diff --git a/lib/plugins/popularity/lang/ro/lang.php b/lib/plugins/popularity/lang/ro/lang.php
index 7f3508362..8ba119dcb 100644
--- a/lib/plugins/popularity/lang/ro/lang.php
+++ b/lib/plugins/popularity/lang/ro/lang.php
@@ -7,6 +7,8 @@
* @author Emanuel-Emeric Andraşi <em.andrasi@mandrivausers.ro>
* @author Emanuel-Emeric Andrasi <em.andrasi@mandrivausers.ro>
* @author Marius OLAR <olarmariusalex@gmail.com>
+ * @author Marius Olar <olarmariusalex@yahoo.com>
+ * @author Emanuel-Emeric Andrași <em.andrasi@mandrivausers.ro>
*/
$lang['name'] = 'Feedback de popularitate (încărcarea poate dura mai mult)';
$lang['submit'] = 'Trimite datele';
diff --git a/lib/plugins/popularity/lang/ru/lang.php b/lib/plugins/popularity/lang/ru/lang.php
index 79b3e224d..0e29c795d 100644
--- a/lib/plugins/popularity/lang/ru/lang.php
+++ b/lib/plugins/popularity/lang/ru/lang.php
@@ -13,6 +13,7 @@
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
* @author Ladyko Andrey <fylh@succexy.spb.ru>
* @author Eugene <windy.wanderer@gmail.com>
+ * @author Johnny Utah <pcpa@cyberpunk.su>
*/
$lang['name'] = 'Сбор информации о популярности (для загрузки может потребоваться некоторое время)';
$lang['submit'] = 'Отправить данные';
diff --git a/lib/plugins/popularity/lang/sl/intro.txt b/lib/plugins/popularity/lang/sl/intro.txt
index ceb0e61e6..2c029db63 100644
--- a/lib/plugins/popularity/lang/sl/intro.txt
+++ b/lib/plugins/popularity/lang/sl/intro.txt
@@ -1,9 +1,9 @@
-====== Poroilo o uporabi ======
+====== Poročilo o uporabi ======
-To orodje je namenjeno zbiranju brezimnih podatkov o postavljeni Dokuwiki strani in omogoa poiljanje nekaterih podatkov neposredno razvijalcem sistema. S temi podatki lahko razvijalci razumejo naine uporabe sistema, zahteve uporabnikov in pogostost uporabe, kar s statistinimi podatki vpliva tudi na nadaljnji razvoj sistema.
+To orodje je namenjeno zbiranju brezimnih podatkov o postavljeni DokuWiki strani in omogoča pošiljanje nekaterih podatkov neposredno razvijalcem sistema. S temi podatki lahko razvijalci razumejo načine uporabe sistema, zahteve uporabnikov in pogostost uporabe, kar s statističnimi podatki vpliva tudi na nadaljnji razvoj sistema.
-Priporoeno je, da poroilo o uporabi poljete vsake toliko asa, saj lahko le tako razvijalci dobijo podatke o hitrosti rasti spletia in pogostosti uporabe. Vsi podatki so poslani oznaeni s posebno vpisno tevilko, ki omogoa brezimno sledenje.
+Priporočeno je, da poročilo o uporabi pošljete vsake toliko časa, saj lahko le tako razvijalci dobijo podatke o hitrosti rasti spletišča in pogostosti uporabe. Vsi podatki so poslani označeni s posebno vpisno številko, ki omogoča brezimno sledenje.
-Zbrani podatki vsebujejo podrobnosti o razliici uporabljenega sistema DokuWiki, tevilo in velikost wiki strani, datotekah, ki so naloene na sistem in podatke o vstavkih ter PHP namestitvi in razliici.
+Zbrani podatki vsebujejo podrobnosti o različici uporabljenega sistema DokuWiki, število in velikost wiki strani, datotekah, ki so naložene na sistem in podatke o vstavkih ter PHP namestitvi in različici.
-Surovi podatki, ki bodo poslani so prikazani spodaj. S pritiskom na gumb "Polji podatke", bodo ti poslani na strenik razvijalcev.
+Surovi podatki, ki bodo poslani so prikazani spodaj. S pritiskom na gumb "Pošlji podatke", bodo ti poslani na strežnik razvijalcev.
diff --git a/lib/plugins/popularity/lang/sl/submitted.txt b/lib/plugins/popularity/lang/sl/submitted.txt
index 988afd837..11ae052f7 100644
--- a/lib/plugins/popularity/lang/sl/submitted.txt
+++ b/lib/plugins/popularity/lang/sl/submitted.txt
@@ -1,3 +1,3 @@
-====== Poroilo o uporabi ======
+====== Poročilo o uporabi ======
-Podatki so bili uspeno poslani.
+Podatki so bili uspešno poslani.
diff --git a/lib/plugins/popularity/lang/vi/lang.php b/lib/plugins/popularity/lang/vi/lang.php
new file mode 100644
index 000000000..2933d8875
--- /dev/null
+++ b/lib/plugins/popularity/lang/vi/lang.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Vietnamese language file
+ *
+ */
diff --git a/lib/plugins/popularity/lang/zh-tw/lang.php b/lib/plugins/popularity/lang/zh-tw/lang.php
index 3ced0ee5a..3d19ce53a 100644
--- a/lib/plugins/popularity/lang/zh-tw/lang.php
+++ b/lib/plugins/popularity/lang/zh-tw/lang.php
@@ -9,6 +9,7 @@
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
* @author Danny Lin
* @author Shuo-Ting Jian <shoting@gmail.com>
+ * @author syaoranhinata@gmail.com
*/
$lang['name'] = '人氣回饋(載入可能需要一些時間)';
$lang['submit'] = '發送資料';
diff --git a/lib/plugins/popularity/plugin.info.txt b/lib/plugins/popularity/plugin.info.txt
index 16b148f41..871259ee9 100644
--- a/lib/plugins/popularity/plugin.info.txt
+++ b/lib/plugins/popularity/plugin.info.txt
@@ -1,7 +1,7 @@
base popularity
author Andreas Gohr
email andi@splitbrain.org
-date 2011-08-18
+date 2012-09-08
name Popularity Feedback Plugin
desc Send anonymous data about your wiki to the developers.
url http://www.dokuwiki.org/plugin:popularity
diff --git a/lib/plugins/remote.php b/lib/plugins/remote.php
new file mode 100644
index 000000000..a51f701fb
--- /dev/null
+++ b/lib/plugins/remote.php
@@ -0,0 +1,21 @@
+<?php
+
+abstract class DokuWiki_Remote_Plugin extends DokuWiki_Plugin {
+
+ private $api;
+
+ public function __construct() {
+ $this->api = new RemoteAPI();
+ }
+
+ /**
+ * @abstract
+ * @return array Information to all provided methods. {@see RemoteAPI}.
+ */
+ public abstract function _getMethods();
+
+ protected function getApi() {
+ return $this->api;
+ }
+
+}
diff --git a/lib/plugins/revert/admin.php b/lib/plugins/revert/admin.php
index 2aaf1395f..958cf5acf 100644
--- a/lib/plugins/revert/admin.php
+++ b/lib/plugins/revert/admin.php
@@ -64,7 +64,7 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
echo '<form action="" method="post"><div class="no">';
echo '<label>'.$this->getLang('filter').': </label>';
echo '<input type="text" name="filter" class="edit" value="'.hsc($_REQUEST['filter']).'" />';
- echo '<input type="submit" class="button" value="'.$lang['btn_search'].'" />';
+ echo ' <input type="submit" class="button" value="'.$lang['btn_search'].'" />';
echo ' <span>'.$this->getLang('note1').'</span>';
echo '</div></form><br /><br />';
}
@@ -134,7 +134,7 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
echo ($recent['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) ? '<li class="minor">' : '<li>';
echo '<div class="li">';
echo '<input type="checkbox" name="revert[]" value="'.hsc($recent['id']).'" checked="checked" id="revert__'.$cnt.'" />';
- echo '<label for="revert__'.$cnt.'">'.$date.'</label> ';
+ echo ' <label for="revert__'.$cnt.'">'.$date.'</label> ';
echo '<a href="'.wl($recent['id'],"do=diff").'">';
$p = array();
@@ -159,7 +159,7 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
echo '</a> ';
echo html_wikilink(':'.$recent['id'],(useHeading('navigation'))?NULL:$recent['id']);
- echo ' &ndash; '.htmlspecialchars($recent['sum']);
+ echo ' – '.htmlspecialchars($recent['sum']);
echo ' <span class="user">';
echo $recent['user'].' '.$recent['ip'];
diff --git a/lib/plugins/revert/lang/cs/lang.php b/lib/plugins/revert/lang/cs/lang.php
index cf19381c8..5414ea1e5 100644
--- a/lib/plugins/revert/lang/cs/lang.php
+++ b/lib/plugins/revert/lang/cs/lang.php
@@ -11,6 +11,7 @@
* @author Lefty <lefty@multihost.cz>
* @author Vojta Beran <xmamut@email.cz>
* @author zbynek.krivka@seznam.cz
+ * @author Bohumir Zamecnik <bohumir.zamecnik@gmail.com>
*/
$lang['menu'] = 'Obnova zaspamovaných stránek';
$lang['filter'] = 'Hledat zaspamované stránky';
diff --git a/lib/plugins/revert/lang/da/lang.php b/lib/plugins/revert/lang/da/lang.php
index c94366638..a76541a78 100644
--- a/lib/plugins/revert/lang/da/lang.php
+++ b/lib/plugins/revert/lang/da/lang.php
@@ -9,6 +9,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['menu'] = 'Gendannelsesstyring';
$lang['filter'] = 'Søg efter uønskede sider';
diff --git a/lib/plugins/revert/lang/eo/lang.php b/lib/plugins/revert/lang/eo/lang.php
index a893fb145..05eec26a8 100644
--- a/lib/plugins/revert/lang/eo/lang.php
+++ b/lib/plugins/revert/lang/eo/lang.php
@@ -9,16 +9,14 @@
* @author Robert Bogenschneider <robog@gmx.de>
* @author Erik Pedersen <erik pedersen@shaw.ca>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Robert Bogenschneider <robog@GMX.de>
- * @author Robert BOGENSCHNEIDER <robog@gmx.de>
- * @author Robert BOGENSCHNEIDER <bogi@UEA.org>
+ * @author Robert Bogenschneider <bogi@uea.org>
*/
$lang['menu'] = 'Administrado de restarigo';
$lang['filter'] = 'Serĉi spamecajn paĝojn';
$lang['revert'] = 'Restarigi la elektitajn paĝojn';
$lang['reverted'] = '%s estas restarigita al revizio %s';
$lang['removed'] = '%s estas forigita';
-$lang['revstart'] = 'Restariga procezo estas ekigita. Tio povas daŭri longan tempon. Se la skripto tro prokrastos antaŭ plenumo, vi bezonos restarigi po pli etaj blokoj.';
+$lang['revstart'] = 'Restariga procezo ekis. Tio povas daŭri longan tempon. Se la skripto tro prokrastos antaŭ plenumo, vi restarigu po pli etaj blokoj.';
$lang['revstop'] = 'Restariga procezo plenumiĝis sukcese.';
$lang['note1'] = 'Rimarko: tiu ĉi serĉo distingas usklecon';
-$lang['note2'] = 'Rimarko: la paĝo restariĝos al la lasta versio ne enhavanta la menditan spaman terminon &lt;i&gt;%s&lt;/i&gt;.';
+$lang['note2'] = 'Rimarko: la paĝo restariĝos al la lasta versio ne enhavanta la menditan spaman terminon <i>%s</i>.';
diff --git a/lib/plugins/revert/lang/es/lang.php b/lib/plugins/revert/lang/es/lang.php
index e235015d4..3fb02be8e 100644
--- a/lib/plugins/revert/lang/es/lang.php
+++ b/lib/plugins/revert/lang/es/lang.php
@@ -20,6 +20,7 @@
* @author emezeta <emezeta@infoprimo.com>
* @author Oscar Ciudad <oscar@jacho.net>
* @author Ruben Figols <ruben.figols@gmail.com>
+ * @author Gerardo Zamudio <gerardo@gerardozamudio.net>
*/
$lang['menu'] = 'Restaurador';
$lang['filter'] = 'Buscar páginas con spam';
diff --git a/lib/plugins/revert/lang/fa/lang.php b/lib/plugins/revert/lang/fa/lang.php
index 02d2aabd2..34a5c430e 100644
--- a/lib/plugins/revert/lang/fa/lang.php
+++ b/lib/plugins/revert/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['menu'] = 'مدیریت برگشت‌ها';
$lang['filter'] = 'جستجوی صفحات اسپم شده';
diff --git a/lib/plugins/revert/lang/fr/lang.php b/lib/plugins/revert/lang/fr/lang.php
index 9c5194b31..253e0c96e 100644
--- a/lib/plugins/revert/lang/fr/lang.php
+++ b/lib/plugins/revert/lang/fr/lang.php
@@ -15,6 +15,8 @@
* @author Johan Guilbaud <guilbaud.johan@gmail.com>
* @author schplurtz@laposte.net
* @author skimpax@gmail.com
+ * @author Yannick Aure <yannick.aure@gmail.com>
+ * @author Olivier DUVAL <zorky00@gmail.com>
*/
$lang['menu'] = 'Gestionnaire de réversions';
$lang['filter'] = 'Trouver les pages spammées ';
diff --git a/lib/plugins/revert/lang/gl/lang.php b/lib/plugins/revert/lang/gl/lang.php
index 87bce32ba..a0c5a9785 100644
--- a/lib/plugins/revert/lang/gl/lang.php
+++ b/lib/plugins/revert/lang/gl/lang.php
@@ -3,6 +3,7 @@
* Galicianlanguage file
*
* @author Medúlio <medulio@ciberirmandade.org>
+ * @author Oscar M. Lage <r0sk10@gmail.com>
*/
$lang['menu'] = 'Xestor de Reversión';
$lang['filter'] = 'Procurar páxinas con correo-lixo';
diff --git a/lib/plugins/revert/lang/it/lang.php b/lib/plugins/revert/lang/it/lang.php
index 79565655b..9c092de99 100644
--- a/lib/plugins/revert/lang/it/lang.php
+++ b/lib/plugins/revert/lang/it/lang.php
@@ -10,6 +10,8 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
+ * @author snarchio@gmail.com
*/
$lang['menu'] = 'Gestore di ripristini';
$lang['filter'] = 'Cerca pagine con spam';
diff --git a/lib/plugins/revert/lang/ja/lang.php b/lib/plugins/revert/lang/ja/lang.php
index 0cd8c6f9b..bb5a9c150 100644
--- a/lib/plugins/revert/lang/ja/lang.php
+++ b/lib/plugins/revert/lang/ja/lang.php
@@ -5,6 +5,7 @@
* @author Ikuo Obataya <i.obataya@gmail.com>
* @author Daniel Dupriest <kououken@gmail.com>
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ * @author Taisuke Shimamoto <dentostar@gmail.com>
*/
$lang['menu'] = '復元管理';
$lang['filter'] = 'スパムを受けたページを検索';
diff --git a/lib/plugins/revert/lang/ko/intro.txt b/lib/plugins/revert/lang/ko/intro.txt
index a0164dc4f..30813fe49 100644
--- a/lib/plugins/revert/lang/ko/intro.txt
+++ b/lib/plugins/revert/lang/ko/intro.txt
@@ -1,3 +1,3 @@
====== 복구 관리자 ======
-스팸 공격으로 부터 자동으로 복구하는데 이페이지는 도움이 될 수 있습니다. 스팸 공격받은 페이지 목록을 찾으려면 문자열을 입력하기 바랍니다(예. 스팸 URL), 그 후 검색된 페이지들이 스팸 공격받았는지 확인하고 복구합니다.
+스팸 공격으로 부터 자동으로 복구하는데 이 페이지가 도움이 될 수 있습니다. 스팸 공격받은 문서 목록을 찾으려면 문자열을 입력하기 바랍니다 (예를 들어 스팸 URL), 그 후 찾은 문서가 스팸 공격을 받았는지 확인하고 복구합니다.
diff --git a/lib/plugins/revert/lang/ko/lang.php b/lib/plugins/revert/lang/ko/lang.php
index 0163d2754..90cba9bce 100644
--- a/lib/plugins/revert/lang/ko/lang.php
+++ b/lib/plugins/revert/lang/ko/lang.php
@@ -7,13 +7,15 @@
* @author Song Younghwan <purluno@gmail.com>
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
+ * @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['menu'] = '복구 관리자';
-$lang['filter'] = '스팸 페이지 검색 ';
-$lang['revert'] = '선택 페이지들 복구';
-$lang['reverted'] = '%s를 이전 버전 %s 으로 복구';
+$lang['filter'] = '스팸 문서 찾기';
+$lang['revert'] = '선택한 문서 복구';
+$lang['reverted'] = '%s 버전을 %s 버전으로 복구';
$lang['removed'] = '%s 삭제';
-$lang['revstart'] = '복구 작업을 시작합니다. 오랜 시간이 걸릴 수 있습니다. 완료되기 전에 스크립트 time out이 발생한다면 더 작은 작업들로 나누어서 복구하기 바랍니다. ';
+$lang['revstart'] = '복구 작업을 시작합니다. 오랜 시간이 걸릴 수 있습니다. 완료되기 전에 스크립트 시간 초과가 발생한다면 더 작은 작업으로 나누어서 복구하기 바랍니다.';
$lang['revstop'] = '복구 작업이 성공적으로 끝났습니다.';
-$lang['note1'] = '주의: 대소문자 구별하여 검색합니다.';
-$lang['note2'] = '주의: 이 페이지는 스팸 단어 <i>%s</i>를 포함하지 않은 가장 최근 과거 문서 버전으로 복구됩니다. ';
+$lang['note1'] = '참고: 대소문자 구별하여 찾습니다.';
+$lang['note2'] = '참고: 이 문서는 <i>%s</i> 스팸 단어를 포함하지 않은 최근 이전 버전으로 복구됩니다. ';
diff --git a/lib/plugins/revert/lang/nl/lang.php b/lib/plugins/revert/lang/nl/lang.php
index 32e14c2c4..0a2880105 100644
--- a/lib/plugins/revert/lang/nl/lang.php
+++ b/lib/plugins/revert/lang/nl/lang.php
@@ -13,6 +13,7 @@
* @author Timon Van Overveldt <timonvo@gmail.com>
* @author Jeroen
* @author Ricardo Guijt <ricardoguijt@gmail.com>
+ * @author Gerrit <klapinklapin@gmail.com>
*/
$lang['menu'] = 'Herstelmanager';
$lang['filter'] = 'Zoek naar bekladde pagina\'s';
diff --git a/lib/plugins/revert/lang/pl/lang.php b/lib/plugins/revert/lang/pl/lang.php
index 30ab60fda..462841292 100644
--- a/lib/plugins/revert/lang/pl/lang.php
+++ b/lib/plugins/revert/lang/pl/lang.php
@@ -11,6 +11,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['menu'] = 'Menadżer przywracania';
$lang['filter'] = 'Wyszukaj uszkodzone strony';
diff --git a/lib/plugins/revert/lang/ro/lang.php b/lib/plugins/revert/lang/ro/lang.php
index 7397a1d74..5ea802575 100644
--- a/lib/plugins/revert/lang/ro/lang.php
+++ b/lib/plugins/revert/lang/ro/lang.php
@@ -9,6 +9,8 @@
* @author Emanuel-Emeric Andraşi <em.andrasi@mandrivausers.ro>
* @author Emanuel-Emeric Andrasi <em.andrasi@mandrivausers.ro>
* @author Marius OLAR <olarmariusalex@gmail.com>
+ * @author Marius Olar <olarmariusalex@yahoo.com>
+ * @author Emanuel-Emeric Andrași <em.andrasi@mandrivausers.ro>
*/
$lang['menu'] = 'Manager Reveniri';
$lang['filter'] = 'Caută pagini cu posibil spam';
diff --git a/lib/plugins/revert/lang/ru/lang.php b/lib/plugins/revert/lang/ru/lang.php
index 9624d8fd6..4abe37e6a 100644
--- a/lib/plugins/revert/lang/ru/lang.php
+++ b/lib/plugins/revert/lang/ru/lang.php
@@ -14,6 +14,7 @@
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
* @author Ladyko Andrey <fylh@succexy.spb.ru>
* @author Eugene <windy.wanderer@gmail.com>
+ * @author Johnny Utah <pcpa@cyberpunk.su>
*/
$lang['menu'] = 'Менеджер откаток';
$lang['filter'] = 'Поиск спам-страниц';
diff --git a/lib/plugins/revert/lang/sl/intro.txt b/lib/plugins/revert/lang/sl/intro.txt
index c63f281ed..4e2cabf96 100644
--- a/lib/plugins/revert/lang/sl/intro.txt
+++ b/lib/plugins/revert/lang/sl/intro.txt
@@ -1,3 +1,3 @@
====== Povrnitev okvarjene vsebine ======
-Na tej strani je mogoe povrniti vsebino wiki strani na izvorne vrednosti po napadu na stran in vpisu neelenih vsebin. Za iskanje strani z neeleno vsebino, uporabite iskalnik z ustreznim nizom (npr. naslov URL), potem pa potrdite, da so najdene strani res z neeleno vsebino in nato povrnite stanje na zadnjo pravo razliico.
+Na tej strani je mogoče povrniti vsebino wiki strani na izvorne vrednosti po napadu na stran in vpisu neželenih vsebin. Za iskanje strani z neželeno vsebino, uporabite iskalnik z ustreznim nizom (npr. naslov URL), potem pa potrdite, da so najdene strani res z neželeno vsebino in nato povrnite stanje na zadnjo pravo različico.
diff --git a/lib/plugins/revert/lang/vi/lang.php b/lib/plugins/revert/lang/vi/lang.php
new file mode 100644
index 000000000..2933d8875
--- /dev/null
+++ b/lib/plugins/revert/lang/vi/lang.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Vietnamese language file
+ *
+ */
diff --git a/lib/plugins/revert/lang/zh-tw/lang.php b/lib/plugins/revert/lang/zh-tw/lang.php
index a853ccd2e..64da648cd 100644
--- a/lib/plugins/revert/lang/zh-tw/lang.php
+++ b/lib/plugins/revert/lang/zh-tw/lang.php
@@ -9,6 +9,7 @@
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
* @author Danny Lin <danny0838@pchome.com.tw>
* @author Shuo-Ting Jian <shoting@gmail.com>
+ * @author syaoranhinata@gmail.com
*/
$lang['menu'] = '還原管理';
$lang['filter'] = '搜索包含垃圾訊息的頁面';
diff --git a/lib/plugins/revert/plugin.info.txt b/lib/plugins/revert/plugin.info.txt
index 5bb6f3413..205fe9177 100644
--- a/lib/plugins/revert/plugin.info.txt
+++ b/lib/plugins/revert/plugin.info.txt
@@ -1,6 +1,7 @@
+base revert
author Andreas Gohr
email andi@splitbrain.org
-date 2008-12-10
+date 2012-08-05
name Revert Manager
desc Allows you to mass revert recent edits
url http://dokuwiki.org/plugin:revert
diff --git a/lib/plugins/safefnrecode/plugin.info.txt b/lib/plugins/safefnrecode/plugin.info.txt
index b1600060c..2b42399b0 100644
--- a/lib/plugins/safefnrecode/plugin.info.txt
+++ b/lib/plugins/safefnrecode/plugin.info.txt
@@ -1,7 +1,7 @@
base safefnrecode
author Andreas Gohr
email andi@splitbrain.org
-date 2011-04-03
+date 2011-04-06
name safefnrecode plugin
desc Changes existing page and foldernames for the change in the safe filename encoding
url http://www.dokuwiki.org/plugin:safefnrecode
diff --git a/lib/plugins/syntax.php b/lib/plugins/syntax.php
index 12451f636..8b94493e4 100644
--- a/lib/plugins/syntax.php
+++ b/lib/plugins/syntax.php
@@ -37,6 +37,7 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
$info = DOKU_PLUGIN.'/'.$parts[2].'/plugin.info.txt';
if(@file_exists($info)) return confToHash($info);
trigger_error('getInfo() not implemented in '.get_class($this).' and '.$info.' not found', E_USER_WARNING);
+ return array();
}
/**
@@ -86,7 +87,7 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
* @param $match string The text matched by the patterns
* @param $state int The lexer state for the match
* @param $pos int The character position of the matched text
- * @param $handler ref Reference to the Doku_Handler object
+ * @param $handler Doku_Handler Reference to the Doku_Handler object
* @return array Return an array with all data you want to use in render
*/
function handle($match, $state, $pos, &$handler){
@@ -111,10 +112,10 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
* The contents of the $data array depends on what the handler() function above
* created
*
- * @param $format string output format being rendered
- * @param $renderer ref reference to the current renderer object
- * @param $data array data created by handler()
- * @return boolean rendered correctly?
+ * @param $format string output format being rendered
+ * @param $renderer Doku_Renderer reference to the current renderer object
+ * @param $data array data created by handler()
+ * @return boolean rendered correctly?
*/
function render($format, &$renderer, $data) {
trigger_error('render() not implemented in '.get_class($this), E_USER_WARNING);
@@ -148,6 +149,12 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
// extract from class name, format = <plugin type>_plugin_<name>[_<component name>]
function getPluginType() { list($t) = explode('_', get_class($this), 2); return $t; }
function getPluginName() { list($t, $p, $n) = explode('_', get_class($this), 4); return $n; }
+
+ /**
+ * Get the name of the component of the current class
+ *
+ * @return string component name
+ */
function getPluginComponent() { list($t, $p, $n, $c) = explode('_', get_class($this), 4); return (isset($c)?$c:''); }
// localisation methods
@@ -158,7 +165,7 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
* to try to minimise unnecessary loading of the strings when the plugin doesn't require them
* e.g. when info plugin is querying plugins for information about themselves.
*
- * @param $id id of the string to be retrieved
+ * @param string $id id of the string to be retrieved
* @return string string in appropriate language or english if not available
*/
function getLang($id) {
@@ -173,7 +180,7 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
* retrieve a language dependent wiki page and pass to xhtml renderer for display
* plugin equivalent of p_locale_xhtml()
*
- * @param $id id of language dependent wiki page
+ * @param string $id id of language dependent wiki page
* @return string parsed contents of the wiki page in xhtml format
*/
function locale_xhtml($id) {
@@ -210,6 +217,7 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
global $conf; // definitely don't invoke "global $lang"
$path = DOKU_PLUGIN.$this->getPluginName().'/lang/';
+ $lang = array();
// don't include once, in case several plugin components require the same language file
@include($path.'en/lang.php');
if ($conf['lang'] != 'en') @include($path.$conf['lang'].'/lang.php');
diff --git a/lib/plugins/testing/_test/dummy_plugin_integration_test.test.php b/lib/plugins/testing/_test/dummy_plugin_integration_test.test.php
new file mode 100644
index 000000000..5982c6933
--- /dev/null
+++ b/lib/plugins/testing/_test/dummy_plugin_integration_test.test.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @group integration
+ */
+class TestingDummyPluginIntegrationTest extends DokuWikiTest {
+
+ function setUp() {
+ $this->pluginsEnabled = array(
+ 'testing'
+ );
+
+ parent::setUp();
+ }
+
+ function testTestingPluginEnabled() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $hookTriggered = false;
+
+ $EVENT_HANDLER->register_hook('TESTING_PLUGIN_INSTALLED', 'AFTER', null,
+ function() use (&$hookTriggered) {
+ $hookTriggered = true;
+ }
+ );
+
+ $request->execute();
+
+ $this->assertTrue($hookTriggered, 'Testing plugin did not trigger!');
+ }
+}
diff --git a/lib/plugins/testing/_test/dummy_plugin_test.test.php b/lib/plugins/testing/_test/dummy_plugin_test.test.php
new file mode 100644
index 000000000..eee825fbd
--- /dev/null
+++ b/lib/plugins/testing/_test/dummy_plugin_test.test.php
@@ -0,0 +1,9 @@
+<?php
+
+class TestingDummyPluginTest extends DokuWikiTest {
+
+ function testNothing() {
+ $this->assertTrue(true, 'wow, you really fucked up');
+ }
+
+}
diff --git a/lib/plugins/testing/action.php b/lib/plugins/testing/action.php
new file mode 100644
index 000000000..e829847b6
--- /dev/null
+++ b/lib/plugins/testing/action.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Plugin for testing the test system
+ *
+ * This plugin doesn't really do anything and should always be disabled
+ *
+ * @author Tobias Sarnowski <tobias@trustedco.de>
+ */
+class action_plugin_testing extends DokuWiki_Action_Plugin {
+ function register(&$controller) {
+ $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'dokuwikiStarted');
+ }
+
+ function dokuwikiStarted() {
+ $param = array();
+ trigger_event('TESTING_PLUGIN_INSTALLED', $param);
+ msg('The testing plugin is enabled and should be disabled.',-1);
+ }
+}
diff --git a/lib/plugins/testing/plugin.info.txt b/lib/plugins/testing/plugin.info.txt
new file mode 100644
index 000000000..c78c07739
--- /dev/null
+++ b/lib/plugins/testing/plugin.info.txt
@@ -0,0 +1,7 @@
+base testing
+author Tobias Sarnowski
+email tobias@trustedco.de
+date 2012-04-26
+name Testing Plugin
+desc Used to test the test framework. Should always be disabled.
+url http://www.dokuwiki.org/plugin:testing
diff --git a/lib/plugins/usermanager/admin.php b/lib/plugins/usermanager/admin.php
index 8e90be093..30b65debb 100644
--- a/lib/plugins/usermanager/admin.php
+++ b/lib/plugins/usermanager/admin.php
@@ -149,10 +149,11 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
}
ptln("<form action=\"".wl($ID)."\" method=\"post\">");
formSecurityToken();
+ ptln(" <div class=\"table\">");
ptln(" <table class=\"inline\">");
ptln(" <thead>");
ptln(" <tr>");
- ptln(" <th>&nbsp;</th><th>".$this->lang["user_id"]."</th><th>".$this->lang["user_name"]."</th><th>".$this->lang["user_mail"]."</th><th>".$this->lang["user_groups"]."</th>");
+ ptln(" <th>&#160;</th><th>".$this->lang["user_id"]."</th><th>".$this->lang["user_name"]."</th><th>".$this->lang["user_mail"]."</th><th>".$this->lang["user_groups"]."</th>");
ptln(" </tr>");
ptln(" <tr>");
@@ -206,6 +207,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
ptln(" </td></tr>");
ptln(" </tbody>");
ptln(" </table>");
+ ptln(" </div>");
ptln("</form>");
ptln("</div>");
@@ -256,6 +258,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
ptln("<form action=\"".wl($ID)."\" method=\"post\">",$indent);
formSecurityToken();
+ ptln(" <div class=\"table\">",$indent);
ptln(" <table class=\"inline\">",$indent);
ptln(" <thead>",$indent);
ptln(" <tr><th>".$this->lang["field"]."</th><th>".$this->lang["value"]."</th></tr>",$indent);
@@ -295,6 +298,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
ptln(" </tr>",$indent);
ptln(" </tbody>",$indent);
ptln(" </table>",$indent);
+ ptln(" </div>",$indent);
foreach ($notes as $note)
ptln("<div class=\"fn\">".$note."</div>",$indent);
@@ -549,12 +553,13 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*/
function _retrieveUser($clean=true) {
global $auth;
+ global $INPUT;
- $user[0] = ($clean) ? $auth->cleanUser($_REQUEST['userid']) : $_REQUEST['userid'];
- $user[1] = $_REQUEST['userpass'];
- $user[2] = $_REQUEST['username'];
- $user[3] = $_REQUEST['usermail'];
- $user[4] = explode(',',$_REQUEST['usergroups']);
+ $user[0] = ($clean) ? $auth->cleanUser($INPUT->str('userid')) : $INPUT->str('userid');
+ $user[1] = $INPUT->str('userpass');
+ $user[2] = $INPUT->str('username');
+ $user[3] = $INPUT->str('usermail');
+ $user[4] = explode(',',$INPUT->str('usergroups'));
$user[4] = array_map('trim',$user[4]);
if($clean) $user[4] = array_map(array($auth,'cleanGroup'),$user[4]);
@@ -580,9 +585,9 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
}
function _retrieveFilter() {
+ global $INPUT;
- $t_filter = $_REQUEST['filter'];
- if (!is_array($t_filter)) return array();
+ $t_filter = $INPUT->arr('filter');
// messy, but this way we ensure we aren't getting any additional crap from malicious users
$filter = array();
diff --git a/lib/plugins/usermanager/lang/cs/lang.php b/lib/plugins/usermanager/lang/cs/lang.php
index fe54d4cce..8351c190b 100644
--- a/lib/plugins/usermanager/lang/cs/lang.php
+++ b/lib/plugins/usermanager/lang/cs/lang.php
@@ -10,6 +10,7 @@
* @author Lefty <lefty@multihost.cz>
* @author Vojta Beran <xmamut@email.cz>
* @author zbynek.krivka@seznam.cz
+ * @author Bohumir Zamecnik <bohumir.zamecnik@gmail.com>
*/
$lang['menu'] = 'Správa uživatelů';
$lang['noauth'] = '(autentizace uživatelů není k dispozici)';
diff --git a/lib/plugins/usermanager/lang/da/lang.php b/lib/plugins/usermanager/lang/da/lang.php
index ea3109374..845457f7e 100644
--- a/lib/plugins/usermanager/lang/da/lang.php
+++ b/lib/plugins/usermanager/lang/da/lang.php
@@ -10,6 +10,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['menu'] = 'Brugerstyring';
$lang['noauth'] = '(Brugervalidering er ikke tilgængelig)';
diff --git a/lib/plugins/usermanager/lang/de-informal/lang.php b/lib/plugins/usermanager/lang/de-informal/lang.php
index dbdce1fbf..e53781c77 100644
--- a/lib/plugins/usermanager/lang/de-informal/lang.php
+++ b/lib/plugins/usermanager/lang/de-informal/lang.php
@@ -5,11 +5,11 @@
* @author Alexander Fischer <tbanus@os-forge.net>
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
- * @author Matthias Schulte <post@lupo49.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
* @author Christian Wichmann <nospam@zone0.de>
* @author Pierre Corell <info@joomla-praxis.de>
*/
-$lang['menu'] = 'Benutzerverwalter';
+$lang['menu'] = 'Benutzerverwaltung';
$lang['noauth'] = '(Benutzeranmeldung ist nicht verfügbar)';
$lang['nosupport'] = '(Benutzerverwaltung wird nicht unterstützt)';
$lang['badauth'] = 'Ungültige Authentifizierung';
@@ -22,7 +22,7 @@ $lang['field'] = 'Feld';
$lang['value'] = 'Wert';
$lang['add'] = 'Zufügen';
$lang['delete'] = 'Löschen';
-$lang['delete_selected'] = 'Lösche ausgewähltes';
+$lang['delete_selected'] = 'Lösche Ausgewähltes';
$lang['edit'] = 'Bearbeiten';
$lang['edit_prompt'] = 'Bearbeite diesen Benutzer';
$lang['modify'] = 'Änderungen speichern';
@@ -43,10 +43,10 @@ $lang['next'] = 'nächste';
$lang['last'] = 'letzte';
$lang['edit_usermissing'] = 'Der gewählte Benutzer wurde nicht gefunden. Der angegebene Benutzername könnte gelöscht oder an anderer Stelle geändert worden sein.';
$lang['user_notify'] = 'Benutzer benachrichtigen';
-$lang['note_notify'] = 'Benachrichtigungsemails werden nur versandt, wenn der Benutzer ein neues Kennwort erhält.';
+$lang['note_notify'] = 'Benachrichtigungsmails werden nur versandt, wenn der Benutzer ein neues Kennwort erhält.';
$lang['note_group'] = 'Neue Benutzer werden zur Standardgruppe (%s) hinzugefügt, wenn keine Gruppe angegeben wird.';
$lang['note_pass'] = 'Das Passwort wird automatisch erzeugt, wenn das Feld freigelassen wird und der Benutzer Benachrichtigungen aktiviert hat.';
$lang['add_ok'] = 'Benutzer erfolgreich hinzugefügt';
$lang['add_fail'] = 'Hinzufügen des Benutzers fehlgeschlagen';
-$lang['notify_ok'] = 'Benachrichtigungs-Mail wurde versendet';
-$lang['notify_fail'] = 'Benachrichtigungse-Mail konnte nicht gesendet werden';
+$lang['notify_ok'] = 'Benachrichtigungsmail wurde versendet';
+$lang['notify_fail'] = 'Benachrichtigungsemail konnte nicht gesendet werden';
diff --git a/lib/plugins/usermanager/lang/de/lang.php b/lib/plugins/usermanager/lang/de/lang.php
index 507fe1f7c..0dd90cc68 100644
--- a/lib/plugins/usermanager/lang/de/lang.php
+++ b/lib/plugins/usermanager/lang/de/lang.php
@@ -12,11 +12,11 @@
* @author Dirk Einecke <dirk@dirkeinecke.de>
* @author Blitzi94@gmx.de
* @author Robert Bogenschneider <robog@GMX.de>
- * @author Robert Bogenschneider <robog@gmx.de>
* @author Niels Lange <niels@boldencursief.nl>
* @author Christian Wichmann <nospam@zone0.de>
* @author Paul Lachewsky <kaeptn.haddock@gmail.com>
* @author Pierre Corell <info@joomla-praxis.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
*/
$lang['menu'] = 'Benutzerverwaltung';
$lang['noauth'] = '(Authentifizierungssystem nicht verfügbar)';
@@ -57,5 +57,5 @@ $lang['note_group'] = 'Neue Nutzer werden der Standard-Gruppe (%s) hi
$lang['note_pass'] = 'Das Passwort wird automatisch generiert, wenn das entsprechende Feld leergelassen wird und die Benachrichtigung des Nutzers aktiviert ist.';
$lang['add_ok'] = 'Nutzer erfolgreich angelegt';
$lang['add_fail'] = 'Nutzer konnte nicht angelegt werden';
-$lang['notify_ok'] = 'Benachrichtigungs-Mail wurde versandt';
-$lang['notify_fail'] = 'Benachrichtigungs-Mail konnte nicht versandt werden';
+$lang['notify_ok'] = 'Benachrichtigungsmail wurde versandt';
+$lang['notify_fail'] = 'Benachrichtigungsmail konnte nicht versandt werden';
diff --git a/lib/plugins/usermanager/lang/eo/intro.txt b/lib/plugins/usermanager/lang/eo/intro.txt
index 2ef373f66..5b5a94001 100644
--- a/lib/plugins/usermanager/lang/eo/intro.txt
+++ b/lib/plugins/usermanager/lang/eo/intro.txt
@@ -1 +1 @@
-====== Administrado de Uzantoj ====== \ No newline at end of file
+====== Administrado de uzantoj ======
diff --git a/lib/plugins/usermanager/lang/eo/lang.php b/lib/plugins/usermanager/lang/eo/lang.php
index b5f1abc0e..75782fe23 100644
--- a/lib/plugins/usermanager/lang/eo/lang.php
+++ b/lib/plugins/usermanager/lang/eo/lang.php
@@ -9,9 +9,7 @@
* @author Robert Bogenschneider <robog@gmx.de>
* @author Erik Pedersen <erik pedersen@shaw.ca>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Robert Bogenschneider <robog@GMX.de>
- * @author Robert BOGENSCHNEIDER <robog@gmx.de>
- * @author Robert BOGENSCHNEIDER <bogi@UEA.org>
+ * @author Robert Bogenschneider <bogi@uea.org>
*/
$lang['menu'] = 'Administrado de uzantoj';
$lang['noauth'] = '(identiĝo de uzantoj ne disponeblas)';
@@ -20,7 +18,7 @@ $lang['badauth'] = 'tiu identiĝa procezo ne validas';
$lang['user_id'] = 'Uzanto';
$lang['user_pass'] = 'Pasvorto';
$lang['user_name'] = 'Vera nomo';
-$lang['user_mail'] = 'Retadreso';
+$lang['user_mail'] = 'Retpoŝtadreso';
$lang['user_groups'] = 'Grupoj';
$lang['field'] = 'Kampo';
$lang['value'] = 'Valoro';
@@ -35,22 +33,22 @@ $lang['search_prompt'] = 'Fari serĉon';
$lang['clear'] = 'Refari serĉan filtron';
$lang['filter'] = 'Filtro';
$lang['summary'] = 'Montriĝas uzantoj %1$d-%2$d el %3$d trovitaj. %4$d uzantoj entute.';
-$lang['nonefound'] = 'Neniu uzantoj troviĝas. %d uzantoj entute.';
-$lang['delete_ok'] = '%d uzantoj estis forigitaj';
+$lang['nonefound'] = 'Neniuj uzantoj troviĝas. %d uzantoj entute.';
+$lang['delete_ok'] = '%d uzantoj forigiĝis';
$lang['delete_fail'] = '%d malsukcesis esti forigitaj.';
-$lang['update_ok'] = 'Tiu uzanto estis sukcese ĝisdatigita';
+$lang['update_ok'] = 'Tiu uzanto sukcese ĝisdatiĝis';
$lang['update_fail'] = 'Malsukceso okazis por ĝisdatigi tiun uzanton';
$lang['update_exists'] = 'Malsukceso okazis por ŝanĝi la nomon de tiu uzanto: la enmetita nomo (%s) jam ekzistas (ĉiuj aliaj ŝanĝoj estos aplikitaj)';
$lang['start'] = 'Ekigi';
$lang['prev'] = 'antaŭe';
$lang['next'] = 'sekve';
$lang['last'] = 'laste';
-$lang['edit_usermissing'] = 'La elektita uzanto ne estis trovita: tiu nomo povis esti forigita aŭ ŝanĝita aliloke.';
+$lang['edit_usermissing'] = 'La elektita uzanto ne troviĝis: tiu nomo povis esti forigita aŭ ŝanĝita aliloke.';
$lang['user_notify'] = 'Avizi uzanton';
$lang['note_notify'] = 'Avizantaj mesaĝoj estos sendataj nur se la uzanto ekhavos novan pasvorton.';
$lang['note_group'] = 'Novaj uzantoj estos aldonitaj al la komuna grupo (%s) se neniu alia estos specifita.';
-$lang['note_pass'] = 'La pasvorto estos aŭtomate kreita se la kampo estos lasita malplena kaj \'aviso al uzantoj\' estos ebligita.';
-$lang['add_ok'] = 'La uzanto estis sukcese aldonita';
-$lang['add_fail'] = 'Malsukceso okazis por aldoni uzulon';
-$lang['notify_ok'] = 'Avizanta mesaĝo estis sendita';
+$lang['note_pass'] = 'La pasvorto estos aŭtomate kreita se la kampo estos lasita malplena kaj \'avizo al uzantoj\' estos ebligita.';
+$lang['add_ok'] = 'La uzanto sukcese aldoniĝis';
+$lang['add_fail'] = 'Ne eblis aldoni uzanton';
+$lang['notify_ok'] = 'Avizanta mesaĝo sendiĝis';
$lang['notify_fail'] = 'La avizanta mesaĝo ne povis esti sendita';
diff --git a/lib/plugins/usermanager/lang/eo/list.txt b/lib/plugins/usermanager/lang/eo/list.txt
index 714671afb..5be7222a9 100644
--- a/lib/plugins/usermanager/lang/eo/list.txt
+++ b/lib/plugins/usermanager/lang/eo/list.txt
@@ -1 +1 @@
-===== Listo de Uzantoj ===== \ No newline at end of file
+===== Listo de uzantoj =====
diff --git a/lib/plugins/usermanager/lang/es/lang.php b/lib/plugins/usermanager/lang/es/lang.php
index c12b77b3d..b616857a2 100644
--- a/lib/plugins/usermanager/lang/es/lang.php
+++ b/lib/plugins/usermanager/lang/es/lang.php
@@ -21,6 +21,7 @@
* @author emezeta <emezeta@infoprimo.com>
* @author Oscar Ciudad <oscar@jacho.net>
* @author Ruben Figols <ruben.figols@gmail.com>
+ * @author Gerardo Zamudio <gerardo@gerardozamudio.net>
*/
$lang['menu'] = 'Administración de usuarios';
$lang['noauth'] = '(la autenticación de usuarios no está disponible)';
diff --git a/lib/plugins/usermanager/lang/fa/lang.php b/lib/plugins/usermanager/lang/fa/lang.php
index f9e973b9c..674013474 100644
--- a/lib/plugins/usermanager/lang/fa/lang.php
+++ b/lib/plugins/usermanager/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['menu'] = 'مدیریت کاربر';
$lang['noauth'] = '(معتبرسازی کاربر ممکن نیست)';
diff --git a/lib/plugins/usermanager/lang/fr/lang.php b/lib/plugins/usermanager/lang/fr/lang.php
index 948262a8f..d84ff65c3 100644
--- a/lib/plugins/usermanager/lang/fr/lang.php
+++ b/lib/plugins/usermanager/lang/fr/lang.php
@@ -16,6 +16,8 @@
* @author Johan Guilbaud <guilbaud.johan@gmail.com>
* @author schplurtz@laposte.net
* @author skimpax@gmail.com
+ * @author Yannick Aure <yannick.aure@gmail.com>
+ * @author Olivier DUVAL <zorky00@gmail.com>
*/
$lang['menu'] = 'Gestion des utilisateurs';
$lang['noauth'] = '(authentification utilisateur non disponible)';
diff --git a/lib/plugins/usermanager/lang/gl/lang.php b/lib/plugins/usermanager/lang/gl/lang.php
index 0a01ef750..c9c633b39 100644
--- a/lib/plugins/usermanager/lang/gl/lang.php
+++ b/lib/plugins/usermanager/lang/gl/lang.php
@@ -3,6 +3,7 @@
* Galicianlanguage file
*
* @author Medúlio <medulio@ciberirmandade.org>
+ * @author Oscar M. Lage <r0sk10@gmail.com>
*/
$lang['menu'] = 'Xestor de Usuarios';
$lang['noauth'] = '(autenticación de usuarios non dispoñible)';
diff --git a/lib/plugins/usermanager/lang/it/lang.php b/lib/plugins/usermanager/lang/it/lang.php
index 34c510def..0222ff1e4 100644
--- a/lib/plugins/usermanager/lang/it/lang.php
+++ b/lib/plugins/usermanager/lang/it/lang.php
@@ -12,6 +12,8 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
+ * @author snarchio@gmail.com
*/
$lang['menu'] = 'Gestione Utenti';
$lang['noauth'] = '(autenticazione non disponibile)';
diff --git a/lib/plugins/usermanager/lang/ja/lang.php b/lib/plugins/usermanager/lang/ja/lang.php
index 321bbafe8..b5fd556dc 100644
--- a/lib/plugins/usermanager/lang/ja/lang.php
+++ b/lib/plugins/usermanager/lang/ja/lang.php
@@ -6,6 +6,7 @@
* @author Ikuo Obataya <i.obataya@gmail.com>
* @author Daniel Dupriest <kououken@gmail.com>
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
+ * @author Taisuke Shimamoto <dentostar@gmail.com>
*/
$lang['menu'] = 'ユーザー管理';
$lang['noauth'] = '(ユーザー認証が無効です)';
diff --git a/lib/plugins/usermanager/lang/ko/lang.php b/lib/plugins/usermanager/lang/ko/lang.php
index f2322414a..3754fea90 100644
--- a/lib/plugins/usermanager/lang/ko/lang.php
+++ b/lib/plugins/usermanager/lang/ko/lang.php
@@ -7,44 +7,46 @@
* @author Song Younghwan <purluno@gmail.com>
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
+ * @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['menu'] = '사용자 관리자';
$lang['noauth'] = '(사용자 인증이 불가능합니다.)';
$lang['nosupport'] = '(사용자 관리가 지원되지 않습니다.)';
-$lang['badauth'] = '유효하지 않은 인증 메카니즘입니다.';
+$lang['badauth'] = '잘못된 인증 메카니즘';
$lang['user_id'] = '사용자';
-$lang['user_pass'] = '패스워드';
+$lang['user_pass'] = '비밀번호';
$lang['user_name'] = '실제 이름';
$lang['user_mail'] = '이메일 ';
-$lang['user_groups'] = '그룹들';
+$lang['user_groups'] = '그룹';
$lang['field'] = '항목';
$lang['value'] = '값';
$lang['add'] = '추가';
$lang['delete'] = '삭제';
-$lang['delete_selected'] = '삭제 선택';
+$lang['delete_selected'] = '선택 삭제';
$lang['edit'] = '수정';
$lang['edit_prompt'] = '이 사용자 수정';
-$lang['modify'] = '변경 저장';
-$lang['search'] = '검색';
-$lang['search_prompt'] = '검색 실행';
-$lang['clear'] = '검색 필터 초기화';
+$lang['modify'] = '바뀜 저장';
+$lang['search'] = '찾기';
+$lang['search_prompt'] = '찾기 실행';
+$lang['clear'] = '찾기 필터 초기화';
$lang['filter'] = '필터';
-$lang['summary'] = '검색된 사용자들 보기(%1$d-%2$d 중 %3$d). 전체 사용자 %4$d 명.';
-$lang['nonefound'] = '검색된 사용자가 없습니다. 전체 사용자 %d 명.';
-$lang['delete_ok'] = '%d 명의 사용자가 삭제되었습니다.';
-$lang['delete_fail'] = '%d 명의 사용자의 삭제가 실패했습니다.';
-$lang['update_ok'] = '사용자 갱신이 성공했습니다.';
-$lang['update_fail'] = '사용자 갱신이 실패했습니다.';
-$lang['update_exists'] = '사용자 이름 변경이 실패했습니다. 사용자 이름(%s)이 이미 존재합니다. (다른 항목들의 변경은 적용됩니다.)';
+$lang['summary'] = '찾은 사용자 %3$d 중 %1$d-%2$d 보기. 전체 사용자 %4$d명.';
+$lang['nonefound'] = '찾은 사용자가 없습니다. 전체 사용자 %d명.';
+$lang['delete_ok'] = '사용자 %d명이 삭제되었습니다';
+$lang['delete_fail'] = '사용자 %d명의 삭제가 실패했습니다.';
+$lang['update_ok'] = '사용자 변경을 성공했습니다.';
+$lang['update_fail'] = '사용자 변경을 실패했습니다.';
+$lang['update_exists'] = '사용자 이름 변경이 실패했습니다. 사용자 이름(%s)이 이미 존재합니다. (다른 항목의 바뀜은 적용됩니다.)';
$lang['start'] = '시작';
$lang['prev'] = '이전';
$lang['next'] = '다음';
$lang['last'] = '마지막';
-$lang['edit_usermissing'] = '선택된 사용자를 찾을 수 없습니다, 사용자 이름이 삭제되거나 변경됐을 수도 있습니다.';
+$lang['edit_usermissing'] = '선택된 사용자를 찾을 수 없습니다. 사용자 이름이 삭제되거나 변경됐을 수도 있습니다.';
$lang['user_notify'] = '사용자에게 알림';
-$lang['note_notify'] = '사용자에게 새로운 암호를 준 경우에만 알림 이메일이 보내집니다.';
-$lang['note_group'] = '새로운 사용자들은 어떤 그룹도 설정하지 않은 경우에 기본 그룹(%s)에 추가됩니다.';
-$lang['note_pass'] = '사용자 통지가 지정되어 있을때, 필드에 아무값도 입력하지 않으면 암호가 자동 생성 됩니다.';
+$lang['note_notify'] = '사용자에게 새로운 비밀번호를 준 경우에만 알림 이메일이 보내집니다.';
+$lang['note_group'] = '새로운 사용자는 어떤 그룹도 설정하지 않은 경우에 기본 그룹(%s)에 추가됩니다.';
+$lang['note_pass'] = '사용자 통지가 지정되어 있을 때 필드에 아무 값도 입력하지 않으면 비밀번호가 자동으로 만들어집니다.';
$lang['add_ok'] = '사용자가 성공적으로 추가되었습니다.';
$lang['add_fail'] = '사용자 추가가 실패했습니다.';
$lang['notify_ok'] = '알림 이메일이 성공적으로 발송되었습니다. ';
diff --git a/lib/plugins/usermanager/lang/nl/lang.php b/lib/plugins/usermanager/lang/nl/lang.php
index b00ab22e0..8f30ce3ea 100644
--- a/lib/plugins/usermanager/lang/nl/lang.php
+++ b/lib/plugins/usermanager/lang/nl/lang.php
@@ -13,6 +13,7 @@
* @author Timon Van Overveldt <timonvo@gmail.com>
* @author Jeroen
* @author Ricardo Guijt <ricardoguijt@gmail.com>
+ * @author Gerrit <klapinklapin@gmail.com>
*/
$lang['menu'] = 'Gebruikersmanager';
$lang['noauth'] = '(gebruikersauthenticatie niet beschikbaar)';
diff --git a/lib/plugins/usermanager/lang/pl/lang.php b/lib/plugins/usermanager/lang/pl/lang.php
index 5bbf84370..cfc0ba327 100644
--- a/lib/plugins/usermanager/lang/pl/lang.php
+++ b/lib/plugins/usermanager/lang/pl/lang.php
@@ -12,6 +12,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['menu'] = 'Menadżer użytkowników';
$lang['noauth'] = '(uwierzytelnienie użytkownika niemożliwe)';
diff --git a/lib/plugins/usermanager/lang/ro/lang.php b/lib/plugins/usermanager/lang/ro/lang.php
index 4c0afc896..1b33cc4f8 100644
--- a/lib/plugins/usermanager/lang/ro/lang.php
+++ b/lib/plugins/usermanager/lang/ro/lang.php
@@ -9,6 +9,8 @@
* @author Emanuel-Emeric Andraşi <em.andrasi@mandrivausers.ro>
* @author Emanuel-Emeric Andrasi <em.andrasi@mandrivausers.ro>
* @author Marius OLAR <olarmariusalex@gmail.com>
+ * @author Marius Olar <olarmariusalex@yahoo.com>
+ * @author Emanuel-Emeric Andrași <em.andrasi@mandrivausers.ro>
*/
$lang['menu'] = 'Manager Utilizatori';
$lang['noauth'] = '(autentificarea utilizatorilor nu este disponibilă)';
diff --git a/lib/plugins/usermanager/lang/ru/lang.php b/lib/plugins/usermanager/lang/ru/lang.php
index 456ba5b29..eb9f26be6 100644
--- a/lib/plugins/usermanager/lang/ru/lang.php
+++ b/lib/plugins/usermanager/lang/ru/lang.php
@@ -16,6 +16,7 @@
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
* @author Ladyko Andrey <fylh@succexy.spb.ru>
* @author Eugene <windy.wanderer@gmail.com>
+ * @author Johnny Utah <pcpa@cyberpunk.su>
*/
$lang['menu'] = 'Управление пользователями';
$lang['noauth'] = '(авторизация пользователей недоступна)';
diff --git a/lib/plugins/usermanager/lang/sl/delete.txt b/lib/plugins/usermanager/lang/sl/delete.txt
index 7d9de54e6..1fd4fffe1 100644
--- a/lib/plugins/usermanager/lang/sl/delete.txt
+++ b/lib/plugins/usermanager/lang/sl/delete.txt
@@ -1 +1 @@
-===== Izbrisanje uporabnika ===== \ No newline at end of file
+===== Izbris uporabnika ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/vi/lang.php b/lib/plugins/usermanager/lang/vi/lang.php
new file mode 100644
index 000000000..2933d8875
--- /dev/null
+++ b/lib/plugins/usermanager/lang/vi/lang.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Vietnamese language file
+ *
+ */
diff --git a/lib/plugins/usermanager/lang/zh-tw/intro.txt b/lib/plugins/usermanager/lang/zh-tw/intro.txt
index 8f9488d7d..32ccf6fad 100644
--- a/lib/plugins/usermanager/lang/zh-tw/intro.txt
+++ b/lib/plugins/usermanager/lang/zh-tw/intro.txt
@@ -1 +1 @@
-====== 帳號管理員 ======
+====== 帳號管理器 ======
diff --git a/lib/plugins/usermanager/lang/zh-tw/lang.php b/lib/plugins/usermanager/lang/zh-tw/lang.php
index 5cb20aae8..23b4fdac6 100644
--- a/lib/plugins/usermanager/lang/zh-tw/lang.php
+++ b/lib/plugins/usermanager/lang/zh-tw/lang.php
@@ -10,8 +10,9 @@
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
* @author Danny Lin <danny0838@pchome.com.tw>
* @author Shuo-Ting Jian <shoting@gmail.com>
+ * @author syaoranhinata@gmail.com
*/
-$lang['menu'] = '帳號管理員';
+$lang['menu'] = '帳號管理器';
$lang['noauth'] = '(帳號認證尚未開放)';
$lang['nosupport'] = '(尚不支援帳號管理)';
$lang['badauth'] = '錯誤的認證機制';
@@ -35,8 +36,8 @@ $lang['filter'] = '篩選條件(Filter)';
$lang['summary'] = '顯示帳號 %1$d-%2$d,共 %3$d 筆符合。共有 %4$d 個帳號。';
$lang['nonefound'] = '找不到帳號。共有 %d 個帳號。';
$lang['delete_ok'] = '已刪除 %d 個帳號';
-$lang['delete_fail'] = '%d 個帳號刪除失敗';
-$lang['update_ok'] = '成功更新該帳號';
+$lang['delete_fail'] = '%d 個帳號刪除失敗。';
+$lang['update_ok'] = '已更新該帳號';
$lang['update_fail'] = '更新該帳號時失敗';
$lang['update_exists'] = '變更帳號名稱 (%s) 失敗,因為有同名帳號存在(其他修改已套用)。';
$lang['start'] = '開始';
diff --git a/lib/plugins/usermanager/plugin.info.txt b/lib/plugins/usermanager/plugin.info.txt
index 7ec5fafd5..f4495bb19 100644
--- a/lib/plugins/usermanager/plugin.info.txt
+++ b/lib/plugins/usermanager/plugin.info.txt
@@ -1,6 +1,7 @@
+base usermanager
author Chris Smith
email chris@jalakai.co.uk
-date 2008-09-17
+date 2012-09-08
name User Manager
-desc Manage users
+desc Manage users
url http://dokuwiki.org/plugin:usermanager
diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js
index 33a8f61b5..5a5e829bd 100644
--- a/lib/scripts/edit.js
+++ b/lib/scripts/edit.js
@@ -40,6 +40,8 @@ function createToolButton(icon,label,key,id,classname){
icon = DOKU_BASE + 'lib/images/toolbar/' + icon;
}
$ico.attr('src', icon);
+ $ico.attr('width', 16);
+ $ico.attr('height', 16);
$btn.append($ico);
// we have to return a DOM object (for compatibility reasons)
diff --git a/lib/scripts/index.html b/lib/scripts/index.html
index d614603ac..977f90e10 100644
--- a/lib/scripts/index.html
+++ b/lib/scripts/index.html
@@ -1,6 +1,5 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
+<!DOCTYPE html>
+<html>
<head>
<meta http-equiv="refresh" content="0; URL=../../" />
<meta name="robots" content="noindex" />
diff --git a/lib/scripts/media.js b/lib/scripts/media.js
index c74633523..182d5fefe 100644
--- a/lib/scripts/media.js
+++ b/lib/scripts/media.js
@@ -31,6 +31,7 @@ var dw_mediamanager = {
var $content, $tree;
$content = jQuery('#media__content');
$tree = jQuery('#media__tree');
+ if(!$tree.length) return;
dw_mediamanager.prepare_content($content);
@@ -135,7 +136,7 @@ var dw_mediamanager = {
});
$sortBy.children('input').change(function (event) {
dw_mediamanager.set_fileview_sort();
- dw_mediamanager.list.call(this, event);
+ dw_mediamanager.list.call(jQuery('#dw__mediasearch')[0] || this, event);
});
},
@@ -434,7 +435,7 @@ var dw_mediamanager = {
dw_mediamanager.$resizables().resizable('destroy');
if (update_list) {
- dw_mediamanager.list.call(jQuery('input[value="Apply"]')[0]);
+ dw_mediamanager.list.call(jQuery('#mediamanager__page form.options input[type="submit"]')[0]);
}
$content.html(data);
@@ -494,12 +495,12 @@ var dw_mediamanager = {
// set max width of resizable column
var widthOtherResizable = widthResizables - jQuery(this).width();
var minWidthNonResizable = parseFloat($filePanel.css("min-width"));
- var maxWidth = widthFull - (widthOtherResizable + minWidthNonResizable);
+ var maxWidth = widthFull - (widthOtherResizable + minWidthNonResizable) - 1;
$resizables.resizable( "option", "maxWidth", maxWidth );
- // width of file panel in % = 100% - width of resizables in %
- // this calculates with 99.99 and not 100 to overcome rounding errors
- var relWidthNonResizable = 99.99 - (100 * widthResizables / widthFull);
+ // width of file panel in % = 100% - width of resizables in %
+ // this calculates with 99.9 and not 100 to overcome rounding errors
+ var relWidthNonResizable = 99.9 - (100 * widthResizables / widthFull);
// set width of file panel
$filePanel.width(relWidthNonResizable+'%');
@@ -513,6 +514,8 @@ var dw_mediamanager = {
});
}
+ dw_mediamanager.resize();
+
dw_mediamanager.opacity_slider();
dw_mediamanager.portions_slider();
}
@@ -699,7 +702,7 @@ var dw_mediamanager = {
event.preventDefault();
$link = jQuery(this);
- id = $link.attr('name').substr(2);
+ id = $link.attr('id').substr(2);
if(!opener){
// if we don't run in popup display example
diff --git a/lib/scripts/page.js b/lib/scripts/page.js
index 5da4a9cc0..b8e83cb0c 100644
--- a/lib/scripts/page.js
+++ b/lib/scripts/page.js
@@ -10,7 +10,7 @@ dw_page = {
init: function(){
dw_page.sectionHighlight();
jQuery('a.fn_top').mouseover(dw_page.footnoteDisplay);
- dw_page.initTocToggle();
+ dw_page.makeToggle('#dw__toc h3','#dw__toc > div');
},
/**
@@ -27,9 +27,14 @@ dw_page = {
// Walk the DOM tree up (first previous siblings, then parents)
// until boundary element
while($tgt.length > 0 && !$tgt.hasClass('sectionedit' + nr)) {
- // $.last gives the DOM-ordered last element:
- // prev if present, else parent.
- $tgt = $tgt.prev().add($tgt.parent()).last();
+ // go down when the sectionedit begin marker is below $tgt
+ if ($tgt.find('.sectionedit' + nr).length > 0) {
+ $tgt = $tgt.children().last();
+ } else {
+ // $.last gives the DOM-ordered last element:
+ // prev if present, else parent.
+ $tgt = $tgt.prev().add($tgt.parent()).last();
+ }
$tgt.addClass('section_highlight');
}
})
@@ -93,48 +98,77 @@ dw_page = {
},
/**
- * Adds the toggle switch to the TOC
+ * Makes an element foldable by clicking its handle
+ *
+ * This is used for the TOC toggling, but can be used for other elements
+ * as well. A state indicator is inserted into the handle and can be styled
+ * by CSS.
+ *
+ * @param selector handle What should be clicked to toggle
+ * @param selector content This element will be toggled
*/
- initTocToggle: function() {
- var $header, $clicky, $toc, $tocul, setClicky;
- $header = jQuery('#toc__header');
- if(!$header.length) {
- return;
- }
- $toc = jQuery('#toc__inside');
- $tocul = $toc.children('ul.toc');
+ makeToggle: function(handle, content, state){
+ var $handle, $content, $clicky, $child, setClicky;
+ $handle = jQuery(handle);
+ if(!$handle.length) return;
+ $content = jQuery(content);
+ if(!$content.length) return;
+
+ // we animate the children
+ $child = $content.children();
+ // class/display toggling
setClicky = function(hiding){
if(hiding){
$clicky.html('<span>+</span>');
- $clicky[0].className = 'toc_open';
+ $handle.addClass('closed');
+ $handle.removeClass('open');
}else{
- $clicky.html('<span>&minus;</span>');
- $clicky[0].className = 'toc_close';
+ $clicky.html('<span>−</span>');
+ $handle.addClass('open');
+ $handle.removeClass('closed');
}
};
- $clicky = jQuery(document.createElement('span'))
- .attr('id','toc__toggle');
- $header.css('cursor','pointer')
- .click(function () {
- var hidden;
+ $handle[0].setState = function(state){
+ var hidden;
+ if(!state) state = 1;
+
+ // Assert that content instantly takes the whole space
+ $content.css('min-height', $content.height()).show();
- // Assert that $toc instantly takes the whole TOC space
- $toc.css('height', $toc.height()).show();
+ // stop any running animation
+ $child.stop(true, true);
- hidden = $tocul.stop(true, true).is(':hidden');
+ // was a state given or do we toggle?
+ if(state === -1) {
+ hidden = false;
+ } else if(state === 1) {
+ hidden = true;
+ } else {
+ hidden = $child.is(':hidden');
+ }
+
+ // update the state
+ setClicky(!hidden);
+
+ // Start animation and assure that $toc is hidden/visible
+ $child.dw_toggle(hidden, function () {
+ $content.toggle(hidden);
+ $content.css('min-height',''); // remove min-height again
+ });
+ };
- setClicky(!hidden);
+ // the state indicator
+ $clicky = jQuery(document.createElement('strong'));
- // Start animation and assure that $toc is hidden/visible
- $tocul.dw_toggle(hidden, function () {
- $toc.toggle(hidden);
- });
- })
+ // click function
+ $handle.css('cursor','pointer')
+ .click($handle[0].setState)
.prepend($clicky);
- setClicky();
+ // initial state
+ $handle[0].setState(state);
}
};
diff --git a/lib/styles/index.html b/lib/styles/index.html
index d614603ac..977f90e10 100644
--- a/lib/styles/index.html
+++ b/lib/styles/index.html
@@ -1,6 +1,5 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
+<!DOCTYPE html>
+<html>
<head>
<meta http-equiv="refresh" content="0; URL=../../" />
<meta name="robots" content="noindex" />
diff --git a/lib/styles/screen.css b/lib/styles/screen.css
index 101ed3529..8ada48932 100644
--- a/lib/styles/screen.css
+++ b/lib/styles/screen.css
@@ -10,36 +10,38 @@ div.success,
div.notify {
color: #000;
background-repeat: no-repeat;
- background-position: .5em 0;
- border-bottom: 1px solid;
+ background-position: 8px 50%;
+ border: 1px solid;
font-size: 90%;
- margin: 0;
- padding-left: 3em;
+ margin: 0 0 0.5em;
+ padding: 0.4em;
+ padding-left: 32px;
overflow: hidden;
+ border-radius: 5px;
}
div.error {
background-color: #fcc;
background-image: url(../images/error.png);
- border-bottom-color: #faa;
+ border-color: #ebb;
}
div.info {
background-color: #ccf;
background-image: url(../images/info.png);
- border-bottom-color: #aaf;
+ border-color: #bbe;
}
div.success {
background-color: #cfc;
background-image: url(../images/success.png);
- border-bottom-color: #afa;
+ border-color: #beb;
}
div.notify {
background-color: #ffc;
background-image: url(../images/notify.png);
- border-bottom-color: #ffa;
+ border-color: #eeb;
}
/* modal windows */
diff --git a/lib/tpl/default/_mediamanager.css b/lib/tpl/default/_mediamanager.css
index 198c7f440..2ce345e40 100644
--- a/lib/tpl/default/_mediamanager.css
+++ b/lib/tpl/default/_mediamanager.css
@@ -36,6 +36,10 @@
min-height: 20px;
overflow: hidden;
}
+[dir=rtl] #mediamanager__page .panelContent {
+ text-align: right;
+}
+
#mediamanager__page .panelContent {
overflow-y: auto;
@@ -59,8 +63,13 @@
background-color: __background_alt__;
}
+
/*____________ Namespaces tree ____________*/
+[dir=rtl] #mediamanager__page .namespaces {
+ text-align: right;
+}
+
#mediamanager__page .namespaces h2 {
font-size: 1em;
display: inline-block;
@@ -77,14 +86,32 @@
*+html #mediamanager__page .namespaces h2 {
display: inline;
}
+[dir=rtl] #mediamanager__page .namespaces h2 {
+ margin-right: 10px;
+}
#mediamanager__page .namespaces ul {
margin-left: .2em;
+ margin-bottom: 0;
+ padding: 0;
list-style: none;
}
+[dir=rtl] #mediamanager__page .namespaces ul {
+ margin-left: 0;
+ margin-right: .2em;
+}
+
#mediamanager__page .namespaces ul ul {
margin-left: 1em;
}
+[dir=rtl] #mediamanager__page .namespaces ul ul {
+ margin-left: 0;
+ margin-right: 1em;
+}
+#mediamanager__page .namespaces ul ul li {
+ margin: 0;
+}
+
#mediamanager__page .namespaces ul .selected {
background-color: __highlight__;
@@ -142,6 +169,9 @@
padding: 0;
margin: 0;
}
+[dir=rtl] #mediamanager__page .filelist ul.tabs {
+ margin-right: 10px;
+}
#mediamanager__page .filelist .panelContent ul li:hover {
background-color: __background_alt__;
@@ -178,6 +208,10 @@
position: relative;
line-height: 1.2;
}
+[dir=rtl] #mediamanager__page .filelist .thumbs li {
+ margin-right: 0;
+ margin-left: 6px;
+}
* html #mediamanager__page .filelist .thumbs li,
*+html #mediamanager__page .filelist .thumbs li {
display: inline;
@@ -200,6 +234,7 @@
#mediamanager__page .filelist .thumbs li .date {
display: block;
overflow: hidden;
+ text-overflow: ellipsis;
width: 90px;
white-space: nowrap;
}
@@ -252,6 +287,7 @@
#mediamanager__page .filelist .rows li .filesize,
#mediamanager__page .filelist .rows li .date {
overflow: hidden;
+ text-overflow: ellipsis;
float: left;
margin-left: 1%;
white-space: nowrap;
@@ -324,6 +360,9 @@
#mediamanager__page form.meta label span {
display: block;
}
+[dir=rtl] #mediamanager__page form.meta label span {
+ text-align: right;
+}
#mediamanager__page form.meta input {
width: 50%;
@@ -342,18 +381,18 @@
/*____________ Revisions form ____________*/
-#mediamanager__page #page__revisions ul {
+#mediamanager__page form.changes ul {
margin-left: 10px;
list-style-type: none;
}
-#mediamanager__page #page__revisions ul li div.li div {
+#mediamanager__page form.changes ul li div.li div {
font-size: 90%;
color: __text_neu__;
padding-left: 18px;
}
-#mediamanager__page #page__revisions ul li div.li input {
+#mediamanager__page form.changes ul li div.li input {
position: relative;
top: 1px;
}
@@ -372,6 +411,10 @@
vertical-align: top;
text-align: left;
}
+[dir=rtl] #mediamanager__diff td,
+[dir=rtl] #mediamanager__diff th {
+ text-align: right;
+}
#mediamanager__diff th {
font-weight: normal;
@@ -404,10 +447,6 @@
#mediamanager__diff .imageDiff {
position: relative;
}
-#mediamanager__diff .imageDiff .image1,
-#mediamanager__diff .imageDiff .image2 {
- width: 97%;
-}
#mediamanager__diff .imageDiff .image2 {
position: absolute;
top: 0;
@@ -425,7 +464,12 @@
overflow: hidden;
}
+#mediamanager__diff .imageDiff.portions img {
+ float: left;
+}
+
#mediamanager__diff .imageDiff img {
width: 100%;
+ max-width: none;
}
diff --git a/lib/tpl/default/_tabs.css b/lib/tpl/default/_tabs.css
index 8bfb676a0..a39b43441 100644
--- a/lib/tpl/default/_tabs.css
+++ b/lib/tpl/default/_tabs.css
@@ -10,6 +10,9 @@
margin: 0;
list-style: none;
}
+[dir=rtl] .dokuwiki ul.tabs li {
+ float: right;
+}
.dokuwiki ul.tabs li strong,
.dokuwiki ul.tabs li a {
@@ -20,6 +23,16 @@
color: __text__;
border-radius: .5em .5em 0 0;
}
+[dir=rtl] .dokuwiki ul.tabs li strong,
+[dir=rtl] .dokuwiki ul.tabs li a {
+ float: right;
+ margin: 0 0 0 .3em;
+}
+*+html[dir=rtl] .dokuwiki ul.tabs li strong,
+*+html[dir=rtl] .dokuwiki ul.tabs li a {
+ float: none;
+ display: inline-block;
+}
.dokuwiki ul.tabs li strong {
font-weight: normal;
}
diff --git a/lib/tpl/default/design.css b/lib/tpl/default/design.css
index a94f814aa..3405ec258 100644
--- a/lib/tpl/default/design.css
+++ b/lib/tpl/default/design.css
@@ -265,11 +265,6 @@ div.dokuwiki a:active {
text-decoration: underline;
}
-div.dokuwiki h1 a,
-div.dokuwiki h2 a,
-div.dokuwiki h3 a,
-div.dokuwiki h4 a,
-div.dokuwiki h5 a,
div.dokuwiki a.nolink {
color: __text__ !important;
text-decoration: none !important;
@@ -383,11 +378,11 @@ div.dokuwiki img.mediacenter {
}
/* smileys */
-div.dokuwiki img.middle {
+div.dokuwiki img.icon {
vertical-align: middle;
}
-div.dokuwiki acronym {
+div.dokuwiki abbr {
cursor: help;
border-bottom: 1px dotted __text__;
}
@@ -552,7 +547,7 @@ div.dokuwiki table.inline td {
/* ---------- table of contents ------------------- */
-div.dokuwiki div.toc {
+div.dokuwiki #dw__toc {
margin: 1.2em 0 0 2em;
float: right;
width: 200px;
@@ -560,46 +555,45 @@ div.dokuwiki div.toc {
clear: both;
}
-div.dokuwiki div.tocheader {
+div.dokuwiki #dw__toc h3 {
border: 1px solid __border__;
background-color: __background_alt__;
text-align: left;
font-weight: bold;
padding: 3px;
- margin-bottom: 2px;
+ margin: 0 0 2px 0;
+ font-size: 1em;
}
-div.dokuwiki span.toc_open,
-div.dokuwiki span.toc_close {
+div.dokuwiki .toggle strong {
border: 0.4em solid __background_alt__;
float: right;
display: block;
margin: 0.4em 3px 0 0;
}
-div.dokuwiki span.toc_open span,
-div.dokuwiki span.toc_close span {
+div.dokuwiki .toggle span {
display: none;
}
-div.dokuwiki span.toc_open {
+div.dokuwiki .toggle.closed strong {
margin-top: 0.4em;
border-top: 0.4em solid __text__;
}
-div.dokuwiki span.toc_close {
+div.dokuwiki .toggle.open strong {
margin-top: 0;
border-bottom: 0.4em solid __text__;
}
-div.dokuwiki #toc__inside {
+div.dokuwiki #dw__toc > div {
border: 1px solid __border__;
background-color: __background__;
text-align: left;
padding: 0.5em 0 0.7em 0;
}
-div.dokuwiki ul.toc {
+div.dokuwiki #dw__toc ul {
list-style-type: none;
list-style-image: none;
line-height: 1.2em;
@@ -607,23 +601,23 @@ div.dokuwiki ul.toc {
margin: 0;
}
-div.dokuwiki ul.toc li {
+div.dokuwiki #dw__toc ul li {
background: transparent url(images/tocdot2.gif) 0 0.6em no-repeat;
padding-left: 0.4em;
}
-div.dokuwiki ul.toc li.clear {
+div.dokuwiki #dw__toc ul li.clear {
background-image: none;
padding-left: 0.4em;
}
-div.dokuwiki a.toc:link,
-div.dokuwiki a.toc:visited {
+div.dokuwiki #dw__toc a:link,
+div.dokuwiki #dw__toc a:visited {
color: __extern__;
}
-div.dokuwiki a.toc:hover,
-div.dokuwiki a.toc:active {
+div.dokuwiki #dw__toc a:hover,
+div.dokuwiki #dw__toc a:active {
color: __text__;
}
@@ -712,12 +706,20 @@ div.insitu-footnote {
}
/* --------------- search result formating --------------- */
-div.dokuwiki .search_result {
- margin-bottom: 6px;
+#dw__loading {
+ text-align: center;
+ margin-bottom: 1em;
+}
+
+div.dokuwiki .search_results {
padding: 0 10px 0 30px;
}
-div.dokuwiki .search_snippet {
+div.dokuwiki .search_results dt {
+ margin-bottom: 3px;
+}
+div.dokuwiki .search_results dd {
+ margin-bottom: 6px;
color: __text_other__;
font-size: 12px;
margin-left: 20px;
diff --git a/lib/tpl/default/detail.php b/lib/tpl/default/detail.php
index 503c0ef71..1c8042e15 100644
--- a/lib/tpl/default/detail.php
+++ b/lib/tpl/default/detail.php
@@ -4,9 +4,6 @@
*
* This is the template for displaying image details
*
- * You should leave the doctype at the very top - It should
- * always be the very first line of a document.
- *
* @link http://dokuwiki.org/templates
* @author Andreas Gohr <andi@splitbrain.org>
*/
diff --git a/lib/tpl/default/main.php b/lib/tpl/default/main.php
index 3e85c58f2..851afde6c 100644
--- a/lib/tpl/default/main.php
+++ b/lib/tpl/default/main.php
@@ -5,9 +5,6 @@
* This is the template you need to change for the overall look
* of DokuWiki.
*
- * You should leave the doctype at the very top - It should
- * always be the very first line of a document.
- *
* @link http://dokuwiki.org/templates
* @author Andreas Gohr <andi@splitbrain.org>
*/
@@ -61,7 +58,7 @@ if (!defined('DOKU_INC')) die();
<div class="bar-right" id="bar__topright">
<?php tpl_button('recent')?>
- <?php tpl_searchform()?>&nbsp;
+ <?php tpl_searchform()?>&#160;
</div>
<div class="clearer"></div>
@@ -121,7 +118,7 @@ if (!defined('DOKU_INC')) die();
<?php tpl_button('profile')?>
<?php tpl_button('login')?>
<?php tpl_button('index')?>
- <?php tpl_button('top')?>&nbsp;
+ <?php tpl_button('top')?>&#160;
</div>
<div class="clearer"></div>
</div>
diff --git a/lib/tpl/default/media.css b/lib/tpl/default/media.css
index 37369fe2f..640ad3162 100644
--- a/lib/tpl/default/media.css
+++ b/lib/tpl/default/media.css
@@ -42,18 +42,29 @@
float: left;
padding: 0.5em 0.3em 0 0;
}
+[dir=rtl] #media__tree img {
+ float: right;
+ padding: 0.5em 0 0 0.3em;
+}
#media__tree ul {
list-style-type: none;
list-style-image: none;
margin-left: 1.5em;
}
+[dir=rtl] #media__tree ul {
+ margin-left: 0;
+ margin-right: 1.5em;
+}
#media__tree li {
clear: left;
list-style-type: none;
list-style-image: none;
}
+[dir=rtl] #media__tree li {
+ clear: right;
+}
*+html #media__tree li,
* html #media__tree li {
border: 1px solid __background__;
diff --git a/lib/tpl/default/mediamanager.php b/lib/tpl/default/mediamanager.php
index 7b7fe8675..35b526a32 100644
--- a/lib/tpl/default/mediamanager.php
+++ b/lib/tpl/default/mediamanager.php
@@ -1,18 +1,19 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?php
/**
* DokuWiki Default Template
*
* This is the template for the media manager popup
*
- * You should leave the doctype at the very top - It should
- * always be the very first line of a document.
- *
* @link http://dokuwiki.org/templates
* @author Andreas Gohr <andi@splitbrain.org>
*/
+
+// must be run from within DokuWiki
+if (!defined('DOKU_INC')) die();
+
?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $conf['lang']?>" lang="<?php echo $conf['lang']?>" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
diff --git a/lib/tpl/default/print.css b/lib/tpl/default/print.css
index 45b60aad2..f83e8c97c 100644
--- a/lib/tpl/default/print.css
+++ b/lib/tpl/default/print.css
@@ -200,7 +200,7 @@ a.fn_bot {
font-weight: bold;
}
-acronym {
+abbr {
border: 0;
}
@@ -224,5 +224,5 @@ table.inline td {
border: 1px solid #000000;
}
-.toc, .footerinc, .header, .bar, .user { display: none; }
+#dw__toc, .footerinc, .header, .bar, .user { display: none; }
diff --git a/lib/tpl/default/rtl.css b/lib/tpl/default/rtl.css
index 82c85839b..f16ba101b 100644
--- a/lib/tpl/default/rtl.css
+++ b/lib/tpl/default/rtl.css
@@ -54,15 +54,17 @@ div.dokuwiki li ol {
div.dokuwiki a.urlextern,
div.dokuwiki a.interwiki,
+div.dokuwiki a.mediafile,
div.dokuwiki a.windows,
div.dokuwiki a.mail {
- /* should work but doesn't - so we just disable icons here*/
- /*
background-position: right 1px;
padding-right: 16px;
- */
- background-image: none !important;
- padding: 0px 0px 0px 0px;
+ padding-left: 0;
+ display: inline-block; /* needed for IE7 */
+}
+
+div.dokuwiki a.mediafile {
+ padding-right: 18px;
}
div.dokuwiki div.secedit input.button {
@@ -89,30 +91,36 @@ div.dokuwiki div.level4 { margin-left: 0px; margin-right: 63px; }
div.dokuwiki div.level5 { margin-left: 0px; margin-right: 83px; }
/* TOC control */
-div.dokuwiki div.toc {
+div.dokuwiki #dw__toc {
float: left;
+ margin: 1.2em 2em 0 0;
}
-div.dokuwiki div.tocheader {
+div.dokuwiki #dw__toc h3 {
text-align: right;
}
-div.dokuwiki #toc__inside {
+div.dokuwiki .toggle strong {
+ float: left;
+ margin: 0.4em 0 0 3px;
+}
+
+div.dokuwiki #dw__toc > div {
text-align: right;
}
-div.dokuwiki ul.toc {
+div.dokuwiki #dw__toc ul {
padding: 0;
padding-right: 1em;
}
-div.dokuwiki ul.toc li {
+div.dokuwiki #dw__toc ul li {
background-position: right 0.6em;
padding-right: 0.4em;
direction: rtl;
}
-div.dokuwiki ul.toc li.clear {
+div.dokuwiki #dw__toc ul li.clear {
padding-right: 0.4em;
}
diff --git a/lib/tpl/default/template.info.txt b/lib/tpl/default/template.info.txt
new file mode 100644
index 000000000..a77289e58
--- /dev/null
+++ b/lib/tpl/default/template.info.txt
@@ -0,0 +1,7 @@
+base default
+author Andreas Gohr
+email andi@splitbrain.org
+date 2012-09-08
+name DokuWiki Default Template
+desc DokuWiki's default template until 2012
+url http://www.dokuwiki.org/template:default
diff --git a/lib/tpl/dokuwiki/css/_admin.css b/lib/tpl/dokuwiki/css/_admin.css
new file mode 100644
index 000000000..c8f3694b5
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_admin.css
@@ -0,0 +1,59 @@
+/**
+ * This file provides styles for the Administration overview
+ * (?do=admin).
+ */
+
+.dokuwiki ul.admin_tasks {
+ float: left;
+ width: 40%;
+ list-style-type: none;
+ font-size: 1.125em;
+}
+[dir=rtl] .dokuwiki ul.admin_tasks {
+ float: right;
+}
+
+.dokuwiki ul.admin_tasks li {
+ padding-left: 35px;
+ margin: 0 0 1em 0;
+ font-weight: bold;
+ list-style-type: none;
+ background: transparent none no-repeat scroll 0 0;
+ color: inherit;
+}
+[dir=rtl] .dokuwiki ul.admin_tasks li {
+ padding-left: 0;
+ padding-right: 35px;
+ background-position: right 0;
+}
+
+.dokuwiki ul.admin_tasks li.admin_acl {
+ background-image: url(../../images/admin/acl.png);
+}
+.dokuwiki ul.admin_tasks li.admin_usermanager {
+ background-image: url(../../images/admin/usermanager.png);
+}
+.dokuwiki ul.admin_tasks li.admin_plugin {
+ background-image: url(../../images/admin/plugin.png);
+}
+.dokuwiki ul.admin_tasks li.admin_config {
+ background-image: url(../../images/admin/config.png);
+}
+.dokuwiki ul.admin_tasks li.admin_revert {
+ background-image: url(../../images/admin/revert.png);
+}
+.dokuwiki ul.admin_tasks li.admin_popularity {
+ background-image: url(../../images/admin/popularity.png);
+}
+
+/* DokuWiki version below */
+.dokuwiki #admin__version {
+ clear: left;
+ float: right;
+ color: __text_neu__;
+ background-color: inherit;
+}
+[dir=rtl] .dokuwiki #admin__version {
+ clear: right;
+ float: left;
+}
diff --git a/lib/tpl/dokuwiki/css/_diff.css b/lib/tpl/dokuwiki/css/_diff.css
new file mode 100644
index 000000000..62f831213
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_diff.css
@@ -0,0 +1,65 @@
+/**
+ * This file provides styles for the diff view, which shows you
+ * differences between two versions of a page (?do=diff).
+ */
+
+.dokuwiki table.diff {
+ width: 100%;
+ border-width: 0;
+}
+.dokuwiki table.diff th,
+.dokuwiki table.diff td {
+ vertical-align: top;
+ padding: 0;
+ border-width: 0;
+ /* no style.ini colours because deleted and added lines have a fixed background colour */
+ background-color: #fff;
+ color: #333;
+}
+
+/* table header */
+.dokuwiki table.diff th {
+ border-bottom: 1px solid __border__;
+ font-size: 110%;
+ width: 50%;
+ font-weight: normal;
+}
+.dokuwiki table.diff th a {
+ font-weight: bold;
+}
+.dokuwiki table.diff th span.user {
+ font-size: .9em;
+}
+.dokuwiki table.diff th span.sum {
+ font-size: .9em;
+ font-weight: bold;
+}
+.dokuwiki table.diff th.minor {
+ color: #999;
+}
+
+/* table body */
+.dokuwiki table.diff td {
+ font-family: Consolas, "Andale Mono WT", "Andale Mono", "Bitstream Vera Sans Mono", "Nimbus Mono L", Monaco, "Courier New", monospace;
+}
+.dokuwiki table.diff td.diff-blockheader {
+ font-weight: bold;
+}
+.dokuwiki table.diff .diff-addedline {
+ background-color: #cfc;
+ color: inherit;
+}
+.dokuwiki table.diff .diff-deletedline {
+ background-color: #fdd;
+ color: inherit;
+}
+.dokuwiki table.diff td.diff-context {
+ background-color: #eee;
+ color: inherit;
+}
+.dokuwiki table.diff td.diff-addedline strong,
+.dokuwiki table.diff td.diff-deletedline strong {
+ color: #f00;
+ background-color: inherit;
+ font-weight: bold;
+}
diff --git a/lib/tpl/dokuwiki/css/_edit.css b/lib/tpl/dokuwiki/css/_edit.css
new file mode 100644
index 000000000..e4182774e
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_edit.css
@@ -0,0 +1,147 @@
+/**
+ * This file provides styles for the edit view (?do=edit), preview
+ * and section edit buttons.
+ */
+
+/* edit view
+********************************************************************/
+
+.dokuwiki div.editBox {
+}
+
+/*____________ toolbar ____________*/
+
+.dokuwiki div.toolbar {
+ margin-bottom: .5em;
+ overflow: hidden;
+}
+#draft__status {
+ float: right;
+ color: __text_alt__;
+ background-color: inherit;
+}
+[dir=rtl] #draft__status {
+ float: left;
+}
+#tool__bar {
+ float: left;
+}
+[dir=rtl] #tool__bar {
+ float: right;
+}
+
+/* buttons inside of toolbar */
+.dokuwiki div.toolbar button.toolbutton {
+}
+/* picker popups (outside of .dokuwiki) */
+div.picker {
+ width: 300px;
+ border: 1px solid __border__;
+ background-color: __background_alt__;
+ color: inherit;
+}
+/* picker for headlines */
+div.picker.pk_hl {
+ width: auto;
+}
+
+/* buttons inside of picker */
+div.picker button.pickerbutton,
+div.picker button.toolbutton {
+ padding: .1em .35em;
+ border-width: 0;
+}
+
+/*____________ edit textarea ____________*/
+
+.dokuwiki textarea.edit {
+ /* should just be "width: 100%", but IE8 doesn't like it, see FS#1910 + FS#1667 */
+ width: 700px;
+ min-width: 100%;
+ max-width: 100%;
+ margin-bottom: .5em;
+}
+
+/*____________ below the textarea ____________*/
+
+.dokuwiki div.editBar {
+ overflow: hidden;
+ margin-bottom: .5em;
+}
+
+/* size and wrap controls */
+#size__ctl {
+ float: right;
+}
+[dir=rtl] #size__ctl {
+ float: left;
+}
+#size__ctl img {
+ cursor: pointer;
+}
+
+/* edit buttons */
+.dokuwiki .editBar .editButtons {
+ display: inline;
+ margin-right: 1em;
+}
+[dir=rtl] .dokuwiki .editBar .editButtons {
+ margin-right: 0;
+ margin-left: 1em;
+}
+.dokuwiki .editBar .editButtons input {
+}
+
+/* summary input and minor changes checkbox */
+.dokuwiki .editBar .summary {
+ display: inline;
+}
+.dokuwiki .editBar .summary label {
+ vertical-align: middle;
+ white-space: nowrap;
+}
+.dokuwiki .editBar .summary label span {
+ vertical-align: middle;
+}
+.dokuwiki .editBar .summary input {
+}
+/* change background colour if summary is missing */
+.dokuwiki .editBar .summary input.missing {
+ color: __text__;
+ background-color: #ffcccc;
+}
+
+/* preview
+********************************************************************/
+
+.dokuwiki div.preview {
+ border: dotted __border__;
+ border-width: .2em 0;
+ padding: 1.4em 0;
+ margin-bottom: 1.4em;
+}
+
+/* section edit buttons
+********************************************************************/
+
+.dokuwiki .secedit {
+ float: right;
+ margin-top: -1.4em;
+}
+[dir=rtl] .dokuwiki .secedit {
+ float: left;
+}
+.dokuwiki .secedit input.button {
+ font-size: 75%;
+}
+
+/* generic style for section highlighting (including headings) */
+.dokuwiki .section_highlight {
+}
+/* style for section highlighting (only sections below headings) */
+.dokuwiki div.section_highlight {
+ margin: -3em -1em -.01em -1em; /* negative side margin = side padding + side border */
+ padding: 3em .5em .01em .5em;
+ border: solid __background_alt__;
+ border-width: 0 .5em;
+}
diff --git a/lib/tpl/dokuwiki/css/_fileuploader.css b/lib/tpl/dokuwiki/css/_fileuploader.css
new file mode 100644
index 000000000..42004de28
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_fileuploader.css
@@ -0,0 +1,112 @@
+/**
+ * This file provides the styles for the file uploader
+ * used in the media manager (both fullscreen and popup).
+ */
+
+.qq-uploader {
+ position: relative;
+ width: 100%;
+}
+
+.qq-uploader .error {
+ color: #f00;
+ background-color: #fff;
+}
+
+/* select file button */
+
+.qq-upload-button {
+ display: inline-block;
+ text-decoration: none;
+ font-size: 100%;
+ cursor: pointer;
+ margin: 1px 1px 5px;
+}
+
+* html .qq-upload-button,
+*+html .qq-upload-button {
+ display: inline;
+}
+
+.qq-upload-button-focus {
+ outline: 1px dotted;
+}
+
+/* drop area */
+
+.qq-upload-drop-area {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ min-height: 70px;
+ z-index: 2;
+ background: __background_neu__;
+ color: __text__;
+ text-align: center;
+}
+
+.qq-upload-drop-area span {
+ display: block;
+ position: absolute;
+ top: 50%;
+ width: 100%;
+ margin-top: -8px;
+ font-size: 120%;
+}
+
+.qq-upload-drop-area-active {
+ background: __background_alt__;
+}
+
+/* list of files to upload */
+
+div.qq-uploader ul {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.qq-uploader li {
+ margin: 0 0 5px;
+ color: __text__;
+}
+
+.qq-uploader li span,
+.qq-uploader li input,
+.qq-uploader li a {
+ margin-right: 5px;
+}
+
+.qq-upload-file {
+ display: block;
+ font-weight: bold;
+}
+
+.qq-upload-spinner {
+ display: inline-block;
+ background: url("../../images/throbber.gif");
+ width: 15px;
+ height: 15px;
+ vertical-align: text-bottom;
+}
+
+.qq-upload-size,
+.qq-upload-cancel {
+ font-size: 85%;
+}
+
+.qq-upload-failed-text {
+ display: none;
+}
+.qq-upload-fail .qq-upload-failed-text {
+ display: inline;
+}
+
+.qq-action-container * {
+ vertical-align: middle;
+}
+.qq-overwrite-check input {
+ margin-left: 10px;
+}
diff --git a/lib/tpl/dokuwiki/css/_footnotes.css b/lib/tpl/dokuwiki/css/_footnotes.css
new file mode 100644
index 000000000..a20f2964e
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_footnotes.css
@@ -0,0 +1,28 @@
+/**
+ * This file provides styles for footnotes.
+ */
+
+/*____________ footnotes inside the text ____________*/
+
+/* link to footnote inside the text */
+.dokuwiki sup a.fn_top {
+}
+/* JSpopup */
+div.insitu-footnote {
+ max-width: 40%;
+ min-width: 5em;
+}
+
+/*____________ footnotes at the bottom of the page ____________*/
+
+.dokuwiki div.footnotes {
+ border-top: 1px solid __border__;
+ padding: .5em 0 0 0;
+ margin: 1em 0 0 0;
+ clear: both;
+}
+.dokuwiki div.footnotes div.fn {
+}
+.dokuwiki div.footnotes div.fn sup a.fn_bot {
+ font-weight: bold;
+}
diff --git a/lib/tpl/dokuwiki/css/_forms.css b/lib/tpl/dokuwiki/css/_forms.css
new file mode 100644
index 000000000..3c7172226
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_forms.css
@@ -0,0 +1,92 @@
+
+/* TODO: this file is not up to the best standards and will be fixed after an overhaul of the form code */
+
+/**
+ * This file provides styles for forms in general and specifically
+ * for ?do=
+ * - login
+ * - resendpwd
+ * - register
+ * - profile
+ * - subscribe
+ */
+
+/* ---------------- forms ------------------------ */
+
+.dokuwiki form {
+ border: none;
+ display: inline;
+}
+
+.dokuwiki label.block {
+ display: block;
+ text-align: right;
+ font-weight: bold;
+}
+[dir=rtl] .dokuwiki label.block {
+ text-align: left;
+}
+
+.dokuwiki label.simple {
+ display: block;
+ text-align: left;
+ font-weight: normal;
+}
+[dir=rtl] .dokuwiki label.simple {
+ text-align: right;
+}
+
+.dokuwiki label.block select,
+.dokuwiki label.block input.edit {
+ width: 50%;
+}
+
+.dokuwiki label span {
+ vertical-align: middle;
+}
+
+.dokuwiki fieldset {
+ width: 400px;
+ text-align: center;
+ border: 1px solid __border__;
+ padding: 0.5em;
+ margin: auto;
+}
+
+
+.dokuwiki input.edit,
+.dokuwiki select.edit {
+ vertical-align: middle;
+}
+.dokuwiki select.edit {
+ padding: 0.1em 0;
+}
+
+
+.dokuwiki input.button,
+.dokuwiki button.button {
+ vertical-align: middle;
+}
+
+/**
+ * Styles for the subscription page
+ */
+
+#subscribe__form {
+ display: block;
+ width: 400px;
+ text-align: center;
+}
+
+#subscribe__form fieldset {
+ text-align: left;
+ margin: 0.5em 0;
+}
+[dir=rtl] #subscribe__form fieldset {
+ text-align: right;
+}
+
+#subscribe__form label {
+ display: block;
+ margin: 0 0.5em 0.5em;
+}
diff --git a/lib/tpl/dokuwiki/css/_imgdetail.css b/lib/tpl/dokuwiki/css/_imgdetail.css
new file mode 100644
index 000000000..a07400028
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_imgdetail.css
@@ -0,0 +1,38 @@
+/**
+ * This file provides styles for the image detail page (detail.php).
+ */
+
+#dokuwiki__detail {
+ padding: 1em;
+}
+#dokuwiki__detail h1 {
+}
+
+#dokuwiki__detail img {
+ float: left;
+ margin: 0 1.5em .5em 0;
+}
+[dir=rtl] #dokuwiki__detail div.content img {
+ float: right;
+ margin-right: 0;
+ margin-left: 1.5em;
+}
+#dokuwiki__detail div.img_detail {
+ float: left;
+}
+[dir=rtl] #dokuwiki__detail div.content div.img_detail {
+ float: right
+}
+
+#dokuwiki__detail div.img_detail h2 {
+}
+#dokuwiki__detail div.img_detail dl {
+}
+#dokuwiki__detail div.img_detail dl dt {
+}
+#dokuwiki__detail div.img_detail dl dd {
+}
+
+#dokuwiki__detail p.back {
+ clear: both;
+}
diff --git a/lib/tpl/dokuwiki/css/_links.css b/lib/tpl/dokuwiki/css/_links.css
new file mode 100644
index 000000000..e53ba45e5
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_links.css
@@ -0,0 +1,74 @@
+/**
+ * This file provides styles for all types of links.
+ */
+
+/*____________ links to wiki pages ____________*/
+
+/* existing wikipage */
+.dokuwiki a.wikilink1 {
+ color: __existing__;
+ background-color: inherit;
+}
+/* not existing wikipage */
+.dokuwiki a.wikilink2 {
+ color: __missing__;
+ background-color: inherit;
+ text-decoration: none;
+}
+.dokuwiki a.wikilink2:link,
+.dokuwiki a.wikilink2:visited {
+ border-bottom: 1px dashed;
+}
+.dokuwiki a.wikilink2:hover,
+.dokuwiki a.wikilink2:active,
+.dokuwiki a.wikilink2:focus {
+ border-bottom-width: 0;
+}
+
+/* any link to current page */
+.dokuwiki span.curid a {
+ font-weight: bold;
+}
+
+/*____________ other link types ____________*/
+
+.dokuwiki a.urlextern,
+.dokuwiki a.windows,
+.dokuwiki a.mail,
+.dokuwiki a.mediafile,
+.dokuwiki a.interwiki {
+ background-repeat: no-repeat;
+ background-position: 0 center;
+ padding: 0 0 0 18px;
+}
+/* external link */
+.dokuwiki a.urlextern {
+ background-image: url(images/external-link.png);
+}
+/* windows share */
+.dokuwiki a.windows {
+ background-image: url(images/unc.png);
+}
+/* email link */
+.dokuwiki a.mail {
+ background-image: url(images/email.png);
+}
+
+/* icons of the following are set by dokuwiki in lib/exe/css.php */
+/* link to some embedded media */
+.dokuwiki a.mediafile {
+}
+/* interwiki link */
+.dokuwiki a.interwiki {
+}
+
+/* RTL corrections; if link icons don't work as expected, remove the following lines */
+[dir=rtl] .dokuwiki a.urlextern,
+[dir=rtl] .dokuwiki a.windows,
+[dir=rtl] .dokuwiki a.mail,
+[dir=rtl] .dokuwiki a.interwiki,
+[dir=rtl] .dokuwiki a.mediafile {
+ background-position: right center;
+ padding: 0 18px 0 0;
+ display: inline-block; /* needed for IE7 */
+}
diff --git a/lib/tpl/dokuwiki/css/_media_fullscreen.css b/lib/tpl/dokuwiki/css/_media_fullscreen.css
new file mode 100644
index 000000000..c67e16051
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_media_fullscreen.css
@@ -0,0 +1,491 @@
+/**
+ * This file provides the styles for the fullscreen media manager
+ * (?do=media).
+ *
+ * What most templates would probably need to change (depending on
+ * their site width) are the 4 min-width's (search for @change).
+ */
+
+
+/*____________ structure ____________*/
+
+#mediamanager__page h1 {
+ margin-bottom: .5em;
+}
+
+#mediamanager__page {
+ /* min-width must be summary of all 3 panels' min-widths */
+ min-width: 50em; /* @change */
+ width: 100%;
+ text-align: left;
+}
+
+#mediamanager__page .panel {
+ float: left;
+}
+
+#mediamanager__page .namespaces {
+ width: 20%;
+ min-width: 10em; /* @change */
+}
+#mediamanager__page .filelist {
+ width: 50%;
+ min-width: 25em; /* @change */
+}
+#mediamanager__page .file {
+ width: 30%;
+ min-width: 15em; /* @change */
+}
+
+#mediamanager__page .panelHeader {
+ background-color: __background_alt__;
+ margin: 0 10px 10px 0;
+ padding: 10px 10px 8px;
+ text-align: left;
+ min-height: 20px;
+ overflow: hidden;
+}
+
+#mediamanager__page .panelContent {
+ overflow-y: auto;
+ overflow-x: hidden;
+ padding: 0;
+ margin: 0 10px 10px 0;
+ position: relative;
+}
+[dir=rtl] #mediamanager__page .panelContent {
+ text-align: right;
+}
+
+#mediamanager__page .file .panelHeader,
+#mediamanager__page .file .panelContent {
+ margin-right: 0;
+}
+
+#mediamanager__page .ui-resizable-e {
+ width: 6px;
+ right: 2px;
+ background: transparent url(../../images/resizecol.png) center center no-repeat;
+}
+#mediamanager__page .ui-resizable-e:hover {
+ background-color: __background_alt__;
+}
+
+
+#mediamanager__page dd {
+ margin: 0;
+}
+
+#mediamanager__page .panelHeader h3 {
+ float: left;
+ font-weight: normal;
+ font-size: 1em;
+ padding: 0;
+ margin: 0 0 3px;
+}
+
+
+/*____________ namespaces panel ____________*/
+
+[dir=rtl] #mediamanager__page .namespaces {
+ text-align: right;
+}
+
+#mediamanager__page .namespaces h2 {
+ font-size: 1em;
+ display: inline-block;
+ border-width: 0;
+ padding: .3em .8em;
+ margin: 0 .3em 0 0;
+ border-radius: .5em .5em 0 0;
+ font-weight: normal;
+ background-color: __background_alt__;
+ color: __text__;
+ line-height: 1.4em;
+}
+* html #mediamanager__page .namespaces h2,
+*+html #mediamanager__page .namespaces h2 {
+ display: inline;
+}
+[dir=rtl] #mediamanager__page .namespaces h2 {
+ margin-right: 10px;
+}
+
+#mediamanager__page .namespaces ul {
+ margin-left: .2em;
+ margin-bottom: 0;
+ padding: 0;
+ list-style: none;
+}
+[dir=rtl] #mediamanager__page .namespaces ul {
+ margin-left: 0;
+ margin-right: .2em;
+}
+#mediamanager__page .namespaces ul ul {
+ margin-left: 1em;
+}
+[dir=rtl] #mediamanager__page .namespaces ul ul {
+ margin-left: 0;
+ margin-right: 1em;
+}
+#mediamanager__page .namespaces ul ul li {
+ margin: 0;
+}
+
+#mediamanager__page .namespaces ul .selected {
+ background-color: __highlight__;
+ font-weight: bold;
+}
+
+
+/*____________ file list panel ____________*/
+
+/* file list header */
+
+#mediamanager__page .panelHeader form.options {
+ float: right;
+ margin-top: -3px;
+}
+
+#mediamanager__page .panelHeader ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+#mediamanager__page .panelHeader ul li {
+ color: __text__;
+ float: left;
+ line-height: 1;
+ padding-left: 3px;
+}
+[dir=rtl] #mediamanager__page .panelHeader ul li {
+ margin-right: 0;
+ margin-left: .5em;
+}
+
+#mediamanager__page .panelHeader ul li.listType {
+ padding-left: 30px;
+ background: url('../../images/icon-list.png') 3px 1px no-repeat;
+}
+#mediamanager__page .panelHeader ul li.sortBy {
+ padding-left: 30px;
+ background: url('../../images/icon-sort.png') 3px 1px no-repeat;
+}
+
+#mediamanager__page .panelHeader form.options .ui-buttonset label{
+ font-size: 90%;
+ margin-right: -0.4em;
+}
+#mediamanager__page .panelHeader form.options .ui-buttonset .ui-button-text {
+ padding: .3em .5em;
+ line-height: 1;
+}
+
+/* file list content */
+
+#mediamanager__page .filelist ul {
+ padding: 0;
+ margin: 0;
+}
+[dir=rtl] #mediamanager__page .filelist ul.tabs {
+ margin-right: 10px;
+}
+
+#mediamanager__page .filelist .panelContent ul li:hover {
+ background-color: __background_alt__;
+}
+
+#mediamanager__page .filelist li dt a {
+ vertical-align: middle;
+ display: table-cell;
+ overflow: hidden;
+}
+* html #mediamanager__page .filelist .thumbs li dt a,
+*+html #mediamanager__page .filelist .thumbs li dt a {
+ display: block;
+}
+* html #mediamanager__page .filelist .rows li dt a,
+*+html #mediamanager__page .filelist .rows li dt a {
+ display: inline;
+}
+
+/* file list as thumbs */
+
+#mediamanager__page .filelist .thumbs li {
+ width: 100px;
+ min-height: 130px;
+ display: inline-block;
+ display: -moz-inline-stack;
+ /* the right margin should visually be 10px, but because of its inline-block nature the whitespace inbetween is about 4px more */
+ margin: 0 6px 10px 0;
+ background-color: __background_neu__;
+ color: __text__;
+ padding: 5px;
+ vertical-align: top;
+ text-align: center;
+ position: relative;
+ line-height: 1.2;
+}
+[dir=rtl] #mediamanager__page .filelist .thumbs li {
+ margin-right: 0;
+ margin-left: 6px;
+}
+* html #mediamanager__page .filelist .thumbs li,
+*+html #mediamanager__page .filelist .thumbs li {
+ display: inline;
+ zoom: 1;
+}
+
+#mediamanager__page .filelist .thumbs li dt a {
+ width: 100px;
+ height: 90px;
+}
+
+#mediamanager__page .filelist .thumbs li dt a img {
+ max-width: 90px;
+ max-height: 90px;
+}
+
+#mediamanager__page .filelist .thumbs li .name,
+#mediamanager__page .filelist .thumbs li .size,
+#mediamanager__page .filelist .thumbs li .filesize,
+#mediamanager__page .filelist .thumbs li .date {
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ width: 90px;
+ white-space: nowrap;
+}
+#mediamanager__page .filelist .thumbs li .name {
+ padding: 5px 0;
+ font-weight: bold;
+}
+#mediamanager__page .filelist .thumbs li .date {
+ font-style: italic;
+ white-space: normal;
+}
+
+/* file list as rows */
+
+#mediamanager__page .filelist .rows li {
+ list-style: none;
+ display: block;
+ position: relative;
+ max-height: 50px;
+ margin: 0;
+ margin-bottom: 3px;
+ background-color: __background__;
+ color: __text__;
+ overflow: hidden;
+}
+
+#mediamanager__page .filelist .rows li:nth-child(2n+1) {
+ background-color: __background_neu__;
+}
+
+#mediamanager__page .filelist .rows li dt {
+ float: left;
+ width: 10%;
+ height: 40px;
+ text-align: center;
+}
+
+#mediamanager__page .filelist .rows li dt a {
+ width: 100px;
+ height: 40px;
+}
+
+#mediamanager__page .filelist .rows li dt a img {
+ max-width: 40px;
+ max-height: 40px;
+}
+
+#mediamanager__page .filelist .rows li .name,
+#mediamanager__page .filelist .rows li .size,
+#mediamanager__page .filelist .rows li .filesize,
+#mediamanager__page .filelist .rows li .date {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ float: left;
+ margin-left: 1%;
+ white-space: nowrap;
+}
+
+#mediamanager__page .filelist .rows li .name {
+ width: 30%;
+ font-weight: bold;
+}
+#mediamanager__page .filelist .rows li .size,
+#mediamanager__page .filelist .rows li .filesize {
+ width: 15%;
+}
+#mediamanager__page .filelist .rows li .date {
+ width: 20%;
+ font-style: italic;
+ white-space: normal;
+}
+
+/* upload form */
+
+#mediamanager__page div.upload {
+ padding-bottom: 0.5em;
+}
+
+/*____________ file panel ____________*/
+
+#mediamanager__page .file ul.actions {
+ text-align: center;
+ margin: 0 0 5px;
+ padding: 0;
+ list-style: none;
+}
+#mediamanager__page .file ul.actions li {
+ display: inline;
+ margin: 0;
+}
+
+#mediamanager__page .file div.image {
+ margin-bottom: 5px;
+ text-align: center;
+}
+
+#mediamanager__page .file div.image img {
+ width: 100%;
+}
+
+#mediamanager__page .file dl {
+ margin-bottom: 0;
+}
+#mediamanager__page .file dl dt {
+ font-weight: bold;
+ display: block;
+ background-color: __background_alt__;
+}
+#mediamanager__page .file dl dd {
+ display: block;
+ background-color: __background_neu__;
+}
+
+
+/* file meta data edit form */
+
+#mediamanager__page form.meta div.row {
+ margin-bottom: 5px;
+}
+
+#mediamanager__page form.meta label span {
+ display: block;
+}
+
+#mediamanager__page form.meta input {
+ width: 50%;
+}
+
+#mediamanager__page form.meta input.button {
+ width: auto;
+}
+
+#mediamanager__page form.meta textarea.edit {
+ height: 6em;
+ width: 95%;
+ min-width: 95%;
+ max-width: 95%;
+}
+
+/* file revisions form */
+
+#mediamanager__page #page__revisions ul {
+ margin-left: 10px;
+ padding: 0;
+ list-style-type: none;
+}
+
+#mediamanager__page #page__revisions ul li div.li div {
+ font-size: 90%;
+ color: __text_neu__;
+ padding-left: 18px;
+}
+
+#mediamanager__page #page__revisions ul li div.li input {
+ position: relative;
+ top: 1px;
+}
+
+/* file diff view */
+
+#mediamanager__diff table {
+ table-layout: fixed;
+ border-width: 0;
+}
+
+#mediamanager__diff td,
+#mediamanager__diff th {
+ width: 48%;
+ margin: 0 5px 10px 0;
+ padding: 0;
+ vertical-align: top;
+ text-align: left;
+ border-color: __background__;
+}
+[dir=rtl] #mediamanager__diff td,
+[dir=rtl] #mediamanager__diff th {
+ text-align: right;
+}
+
+#mediamanager__diff th {
+ font-weight: normal;
+ background-color: __background__;
+ line-height: 1.2;
+}
+#mediamanager__diff th a {
+ font-weight: bold;
+}
+#mediamanager__diff th span {
+ font-size: 90%;
+}
+
+#mediamanager__diff dl dd strong{
+ background-color: __highlight__;
+ color: __text__;
+ font-weight: normal;
+}
+
+/* image diff views */
+
+#mediamanager__page .file form.diffView {
+ margin-bottom: 10px;
+ display: block;
+}
+
+#mediamanager__diff div.slider {
+ margin: 10px;
+ width: 95%;
+}
+
+#mediamanager__diff .imageDiff {
+ position: relative;
+}
+#mediamanager__diff .imageDiff .image2 {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+
+#mediamanager__diff .imageDiff.opacity .image2 {
+ opacity: 0.5;
+}
+
+#mediamanager__diff .imageDiff.portions .image2 {
+ border-right: 1px solid red;
+ overflow: hidden;
+}
+
+#mediamanager__diff .imageDiff.portions img {
+ float: left;
+}
+
+#mediamanager__diff .imageDiff img {
+ width: 100%;
+ max-width: none;
+}
+
diff --git a/lib/tpl/dokuwiki/css/_media_popup.css b/lib/tpl/dokuwiki/css/_media_popup.css
new file mode 100644
index 000000000..c776e6b8a
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_media_popup.css
@@ -0,0 +1,257 @@
+/**
+ * This file provides styles for the media manager popup
+ * (mediamanager.php).
+ */
+
+/*____________ structure ____________*/
+
+html.popup {
+ overflow: auto;
+}
+
+#media__manager {
+ height: 100%;
+ overflow: hidden;
+}
+
+#mediamgr__aside {
+ width: 30%;
+ height: 100%;
+ overflow: auto;
+ position: absolute;
+ left: 0;
+ border-right: 1px solid __border__;
+}
+[dir=rtl] #mediamgr__aside {
+ left: auto;
+ right: 0;
+ border-right-width: 0;
+ border-left: 1px solid __border__;
+}
+#mediamgr__aside .pad {
+ padding: .5em;
+}
+
+#mediamgr__content {
+ width: 69.7%;
+ height: 100%;
+ overflow: auto;
+ position: absolute;
+ right: 0;
+}
+[dir=rtl] #mediamgr__content {
+ right: auto;
+ left: 0;
+}
+#mediamgr__content .pad {
+ padding: .5em;
+}
+
+#media__manager h1,
+#media__manager h2 {
+ font-size: 1.5em;
+ margin-bottom: .5em;
+ padding-bottom: .2em;
+ border-bottom: 1px solid __border__;
+}
+
+/* left side
+********************************************************************/
+
+/*____________ options ____________*/
+
+#media__opts {
+ margin-bottom: .5em;
+}
+
+#media__opts input {
+ margin-right: .3em;
+}
+[dir=rtl] #media__opts input {
+ margin-right: 0;
+ margin-left: .3em;
+}
+#media__opts label {
+}
+
+/*____________ tree ____________*/
+
+#media__tree ul {
+ padding-left: .2em;
+}
+[dir=rtl] #media__tree ul {
+ padding-left: 0;
+ padding-right: .2em;
+}
+#media__tree ul li {
+ clear: left;
+ list-style-type: none;
+ list-style-image: none;
+ margin-left: 0;
+}
+[dir=rtl] #media__tree ul li {
+ clear: right;
+ margin-right: 0;
+}
+#media__tree ul li img {
+ float: left;
+ padding: .5em .3em 0 0;
+}
+[dir=rtl] #media__tree ul li img {
+ float: right;
+ padding: .5em 0 0 .3em;
+}
+#media__tree ul li div.li {
+ display: inline;
+}
+#media__tree ul li li {
+ margin-left: 1.5em;
+}
+[dir=rtl] #media__tree ul li li {
+ margin-left: 0;
+ margin-right: 1.5em;
+}
+
+/* right side
+********************************************************************/
+
+/*____________ upload form ____________*/
+
+/* upload info */
+#media__content div.upload {
+ font-size: .9em;
+ margin-bottom: .5em;
+}
+
+#mediamanager__uploader {
+ margin-bottom: 1em;
+}
+#mediamanager__uploader p {
+ margin-bottom: .5em;
+}
+
+/*____________ file list ____________*/
+
+#media__content img.load {
+ margin: 1em auto;
+}
+
+#media__content .odd,
+#media__content .even {
+ padding: .5em;
+}
+#media__content .odd {
+ background-color: __background_alt__;
+}
+#media__content .even {
+}
+/* highlight newly uploaded or edited file */
+#media__content #scroll__here {
+ border: 1px dashed __border__;
+}
+
+/* link which inserts media file */
+#media__content a.mediafile {
+ margin-right: 1.5em;
+ font-weight: bold;
+}
+[dir=rtl] #media__content a.mediafile {
+ margin-right: 0;
+ margin-left: 1.5em;
+}
+#media__content span.info {
+}
+#media__content img.btn {
+ vertical-align: text-bottom;
+}
+
+/* info how to insert media, if JS disabled */
+#media__content div.example {
+ color: __text_neu__;
+ margin-left: 1em;
+}
+
+#media__content div.detail {
+ padding: .2em 0;
+}
+#media__content div.detail div.thumb {
+ float: left;
+ margin: 0 .5em 0 18px;
+}
+[dir=rtl] #media__content div.detail div.thumb {
+ float: right;
+ margin: 0 18px 0 .5em;
+}
+#media__content div.detail div.thumb a {
+ display: block;
+ cursor: pointer;
+}
+#media__content div.detail p {
+ margin-bottom: 0;
+}
+
+
+/*____________ media search ____________*/
+
+#dw__mediasearch {
+}
+#dw__mediasearch p {
+}
+#dw__mediasearch label {
+}
+#dw__mediasearch label span {
+}
+#dw__mediasearch input.edit {
+}
+#dw__mediasearch input.button {
+}
+
+
+/* meta edit form
+********************************************************************/
+
+#media__content form.meta {
+}
+
+#media__content form.meta div.metafield {
+ clear: left;
+ margin-bottom: .5em;
+ overflow: hidden;
+}
+[dir=rtl] #media__content form.meta div.metafield {
+ clear: right;
+}
+
+#media__content form.meta label {
+ display: block;
+ width: 25%;
+ float: left;
+ font-weight: bold;
+ clear: left;
+}
+[dir=rtl] #media__content form.meta label {
+ float: right;
+ clear: right;
+}
+#media__content form.meta .edit {
+ float: left;
+ width: 70%;
+ margin: 0;
+}
+[dir=rtl] #media__content form.meta .edit {
+ float: right;
+}
+#media__content form.meta textarea.edit {
+ /* needed because of IE8 hack in _edit.css for textarea.edit: */
+ max-width: 70%;
+ min-width: 70%;
+}
+
+#media__content form.meta div.buttons {
+ clear: left;
+ margin: .2em 0 0 25%;
+}
+[dir=rtl] #media__content form.meta div.buttons {
+ clear: right;
+ margin: .2em 25% 0 0;
+}
diff --git a/lib/tpl/dokuwiki/css/_modal.css b/lib/tpl/dokuwiki/css/_modal.css
new file mode 100644
index 000000000..a3d3be194
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_modal.css
@@ -0,0 +1,94 @@
+/**
+ * This file provides styles for modal dialogues.
+ */
+
+.dokuwiki .ui-widget {
+ font-size: 100%;
+}
+
+
+/* link wizard (opens from the link button in the edit toolbar)
+********************************************************************/
+
+#link__wiz {
+}
+
+[dir=rtl] #link__wiz_close {
+ float: left;
+}
+
+#link__wiz_result {
+ background-color: __background__;
+ width: 293px;
+ height: 193px;
+ overflow: auto;
+ border: 1px solid __border__;
+ margin: 3px auto;
+ text-align: left;
+ line-height: 1;
+}
+[dir=rtl] #link__wiz_result {
+ text-align: right;
+}
+
+#link__wiz_result div {
+ padding: 3px 3px 3px 0;
+}
+
+#link__wiz_result div a {
+ display: block;
+ padding-left: 22px;
+ min-height: 16px;
+ background: transparent 3px center no-repeat;
+}
+[dir=rtl] #link__wiz_result div a {
+ padding: 3px 22px 3px 3px;
+ background-position: 257px 3px;
+}
+
+#link__wiz_result div.type_u a {
+ background-image: url(../../images/up.png);
+}
+#link__wiz_result div.type_f a {
+ background-image: url(../../images/page.png);
+}
+#link__wiz_result div.type_d a {
+ background-image: url(../../images/ns.png);
+}
+
+#link__wiz_result div.even {
+ background-color: __background_neu__;
+}
+
+#link__wiz_result div.selected {
+ background-color: __background_alt__;
+}
+
+#link__wiz_result span {
+ display: block;
+ color: __text_neu__;
+ margin-left: 22px;
+}
+
+
+/* media option wizard (opens when inserting media in the media popup)
+********************************************************************/
+
+#media__popup {
+ /* for backwards compatibility (not needed since Rincewind) */
+ display: none;
+}
+
+#media__popup_content p {
+ margin: 0 0 .5em;
+}
+
+#media__popup_content label {
+ margin-right: .5em;
+ cursor: default;
+}
+
+#media__popup_content .button {
+ margin-right: 1px;
+ cursor: pointer;
+}
diff --git a/lib/tpl/dokuwiki/css/_recent.css b/lib/tpl/dokuwiki/css/_recent.css
new file mode 100644
index 000000000..d73bb9463
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_recent.css
@@ -0,0 +1,59 @@
+/**
+ * This file provides styles for the recent changes (?do=recent) and
+ * old revisions (?do=revisions).
+ */
+
+/*____________ list of revisions / recent changes ____________*/
+
+/* select type of revisions (media/pages) */
+.dokuwiki .changeType {
+ margin-bottom: .5em;
+}
+
+.dokuwiki form.changes ul li {
+ list-style: none;
+ margin-left: 0;
+}
+[dir=rtl] .dokuwiki form.changes ul li {
+ margin-right: 0;
+}
+.dokuwiki form.changes ul li span,
+.dokuwiki form.changes ul li a {
+ vertical-align: middle;
+}
+.dokuwiki form.changes ul li span.user a {
+ vertical-align: bottom;
+}
+.dokuwiki form.changes ul li.minor {
+ opacity: .7;
+}
+
+.dokuwiki form.changes li span.date {
+}
+.dokuwiki form.changes li a.diff_link {
+ vertical-align: baseline;
+}
+.dokuwiki form.changes li a.revisions_link {
+ vertical-align: baseline;
+}
+.dokuwiki form.changes li a.wikilink1,
+.dokuwiki form.changes li a.wikilink2 {
+}
+.dokuwiki form.changes li span.sum {
+ font-weight: bold;
+}
+.dokuwiki form.changes li span.user {
+}
+
+
+/*____________ page navigator ____________*/
+
+.dokuwiki div.pagenav {
+ text-align: center;
+ margin: 1.4em 0;
+}
+.dokuwiki div.pagenav-prev,
+.dokuwiki div.pagenav-next {
+ display: inline;
+ margin: 0 .5em;
+}
diff --git a/lib/tpl/dokuwiki/css/_search.css b/lib/tpl/dokuwiki/css/_search.css
new file mode 100644
index 000000000..0090308c9
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_search.css
@@ -0,0 +1,109 @@
+/**
+ * This file provides styles for the search results page (?do=search)
+ * and the AJAX search popup.
+ */
+
+/* search results page
+********************************************************************/
+
+/* loading gif */
+#dw__loading {
+ text-align: center;
+ margin-bottom: 1.4em;
+}
+
+/*____________ matching pagenames ____________*/
+
+.dokuwiki div.search_quickresult {
+ margin-bottom: 1.4em;
+}
+.dokuwiki div.search_quickresult h3 {
+}
+.dokuwiki div.search_quickresult ul {
+ padding: 0;
+}
+.dokuwiki div.search_quickresult ul li {
+ float: left;
+ width: 12em;
+ margin: 0 1.5em;
+}
+[dir=rtl] .dokuwiki div.search_quickresult ul li {
+ float: right;
+}
+
+/*____________ search results ____________*/
+
+.dokuwiki dl.search_results {
+ margin-bottom: 1.2em;
+}
+
+/* search heading */
+.dokuwiki dl.search_results dt {
+ font-weight: normal;
+ margin-bottom: .2em;
+}
+/* search snippet */
+.dokuwiki dl.search_results dd {
+ color: __text_alt__;
+ background-color: inherit;
+ margin: 0 0 1.2em 0;
+}
+
+/* search hit in normal text */
+.dokuwiki .search_hit {
+ color: __text__;
+ background-color: __highlight__;
+}
+/* search hit in search results */
+.dokuwiki .search_results strong.search_hit {
+ font-weight: normal;
+}
+/* ellipsis separating snippets */
+.dokuwiki .search_results .search_sep {
+ color: __text__;
+ background-color: inherit;
+}
+
+/* "nothing found" at search + media */
+.dokuwiki div.nothing {
+ margin-bottom: 1.4em;
+}
+
+
+/* AJAX quicksearch popup
+********************************************************************/
+
+.dokuwiki form.search div.no {
+ position: relative;
+}
+
+/* .JSpopup */
+.dokuwiki form.search div.ajax_qsearch {
+ position: absolute;
+ top: 0;
+ left: -13.5em; /* -( width of #qsearch__in + padding of .ajax_qsearch + a bit more ) */
+ width: 12em;
+ padding: 0.5em;
+ font-size: .9em;
+ z-index: 20;
+ text-align: left;
+ display: none;
+}
+[dir=rtl] .dokuwiki form.search div.ajax_qsearch {
+ left: auto;
+ right: -13.5em;
+ text-align: right;
+}
+.dokuwiki form.search div.ajax_qsearch strong {
+ display: block;
+ margin-bottom: .3em;
+}
+.dokuwiki form.search div.ajax_qsearch ul {
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.dokuwiki form.search div.ajax_qsearch ul li {
+ margin: 0;
+ padding: 0;
+ display: block !important;
+}
diff --git a/lib/tpl/dokuwiki/css/_tabs.css b/lib/tpl/dokuwiki/css/_tabs.css
new file mode 100644
index 000000000..1dffa8f7b
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_tabs.css
@@ -0,0 +1,53 @@
+/**
+ * This file provides the styles for general tabs.
+ */
+
+.dokuwiki ul.tabs {
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+}
+.dokuwiki ul.tabs li {
+ float: left;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+[dir=rtl] .dokuwiki ul.tabs li {
+ float: right;
+}
+
+.dokuwiki ul.tabs li strong,
+.dokuwiki ul.tabs li a {
+ float: left;
+ padding: .3em .8em;
+ margin: 0 .3em 0 0;
+ background-color: __background_neu__;
+ color: __text__;
+ border-radius: .5em .5em 0 0;
+}
+[dir=rtl] .dokuwiki ul.tabs li strong,
+[dir=rtl] .dokuwiki ul.tabs li a {
+ float: right;
+ margin: 0 0 0 .3em;
+}
+*+html[dir=rtl] .dokuwiki ul.tabs li strong,
+*+html[dir=rtl] .dokuwiki ul.tabs li a {
+ float: none;
+ display: inline-block;
+}
+.dokuwiki ul.tabs li strong {
+ font-weight: normal;
+}
+
+.dokuwiki ul.tabs li a:link,
+.dokuwiki ul.tabs li a:visited {
+}
+.dokuwiki ul.tabs li a:hover,
+.dokuwiki ul.tabs li a:active,
+.dokuwiki ul.tabs li a:focus,
+.dokuwiki ul.tabs li strong {
+ background-color: __background_alt__;
+ color: __text__;
+ text-decoration: none;
+}
diff --git a/lib/tpl/dokuwiki/css/_toc.css b/lib/tpl/dokuwiki/css/_toc.css
new file mode 100644
index 000000000..0d1b976d1
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/_toc.css
@@ -0,0 +1,93 @@
+/**
+ * This file provides styles for the TOC (table of contents), the
+ * sitemap (?do=index) and backlinks (?do=backlink).
+ */
+
+/* toc
+********************************************************************/
+
+/* toc container */
+#dw__toc {
+ float: right;
+ margin: 0 0 1.4em 1.4em;
+ width: 12em;
+ background-color: __background_alt__;
+ color: inherit;
+}
+[dir=rtl] #dw__toc {
+ float: left;
+ margin: 0 1.4em 1.4em 0;
+}
+
+/*____________ toc header ____________*/
+
+.dokuwiki h3.toggle {
+ padding: .2em .5em;
+ font-weight: bold;
+}
+
+.dokuwiki .toggle strong {
+ float: right;
+ margin: 0 .2em;
+}
+[dir=rtl] .dokuwiki .toggle strong {
+ float: left;
+}
+
+/*____________ toc list ____________*/
+
+#dw__toc > div {
+ padding: .2em .5em;
+}
+#dw__toc ul {
+ padding: 0;
+ margin: 0;
+}
+#dw__toc ul li {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ line-height: 1.1;
+}
+#dw__toc ul li div.li {
+ padding: .15em 0;
+}
+#dw__toc ul ul {
+ padding-left: 1em;
+}
+[dir=rtl] #dw__toc ul ul {
+ padding-left: 0;
+ padding-right: 1em;
+}
+#dw__toc ul ul li {
+}
+#dw__toc ul li a {
+}
+
+/* in case of toc list jumping one level
+ (e.g. if heading level 3 follows directly after heading level 1) */
+#dw__toc ul li.clear {
+}
+
+
+/* sitemap (and backlinks)
+********************************************************************/
+
+.dokuwiki ul.idx {
+ padding-left: 0;
+}
+[dir=rtl] .dokuwiki ul.idx {
+ padding-right: 0;
+}
+.dokuwiki ul.idx li {
+ list-style-image: url(images/bullet.png);
+}
+.dokuwiki ul.idx li.open {
+ list-style-image: url(images/open.png);
+}
+.dokuwiki ul.idx li.closed {
+ list-style-image: url(images/closed.png);
+}
+[dir=rtl] .dokuwiki ul.idx li.closed {
+ list-style-image: url(images/closed-rtl.png);
+}
diff --git a/lib/tpl/dokuwiki/css/basic.css b/lib/tpl/dokuwiki/css/basic.css
new file mode 100644
index 000000000..55c1d2dfe
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/basic.css
@@ -0,0 +1,417 @@
+/**
+ * This file provides the most basic styles.
+ *
+ * If you integrate DokuWiki into another project, you might either
+ * want to integrate this file into the other project as well, or use
+ * the other project's basic CSS for DokuWiki instead of this one.
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ */
+
+html {
+ overflow-x: auto;
+ overflow-y: scroll;
+}
+html,
+body {
+ color: __text__;
+ background: __background_site__ url(images/page-gradient.png) top left repeat-x;
+ margin: 0;
+ padding: 0;
+}
+body {
+ font: normal 87.5%/1.4 Arial, sans-serif;
+ /* default font size: 100% => 16px; 93.75% => 15px; 87.5% => 14px; 81.25% => 13px; 75% => 12px */
+ -webkit-text-size-adjust: 100%;
+}
+
+
+/*____________ headers ____________*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+caption,
+legend {
+ font-family: Arial, sans-serif;
+ font-weight: bold;
+ background-color: inherit;
+ padding: 0;
+ line-height: 1.2;
+ clear: left; /* ideally 'both', but problems with toc */
+}
+
+h1 {
+ font-size: 2em;
+ margin: 0 0 0.444em;
+}
+h2 {
+ font-size: 1.5em;
+ margin: 0 0 0.666em;
+}
+h3 {
+ font-size: 1.125em;
+ margin: 0 0 0.888em;
+}
+h4 {
+ font-size: 1em;
+ margin: 0 0 1.0em;
+}
+h5 {
+ font-size: .875em;
+ margin: 0 0 1.1428em;
+}
+h6 {
+ font-size: .75em;
+ margin: 0 0 1.333em;
+}
+/* bottom margin = 1 / font-size */
+
+
+/*____________ basic margins and paddings ____________*/
+
+p,
+ul,
+ol,
+dl,
+pre,
+table,
+hr,
+blockquote,
+fieldset,
+address {
+ margin: 0 0 1.4em 0; /* bottom margin = line-height */
+ padding: 0;
+}
+
+div {
+ margin: 0;
+ padding: 0;
+}
+
+
+/*____________ lists ____________*/
+
+ul,
+ol {
+ padding: 0 0 0 1.5em;
+}
+li,
+dd {
+ padding: 0;
+ margin: 0 0 0 1.5em;
+}
+dt {
+ font-weight: bold;
+ margin: 0;
+ padding: 0;
+}
+
+li ul,
+li ol,
+li dl,
+dl ul,
+dl ol,
+dl dl {
+ margin-bottom: 0;
+ padding: 0;
+}
+li li {
+ font-size: 100%;
+}
+
+ul { list-style: square outside; }
+ol { list-style: decimal outside; }
+ol ol { list-style-type: lower-alpha; }
+ol ol ol { list-style-type: upper-roman; }
+ol ol ol ol { list-style-type: upper-alpha; }
+ol ol ol ol ol { list-style-type: lower-roman; }
+
+
+/*____________ tables ____________*/
+
+table {
+ border-collapse: collapse;
+ empty-cells: show;
+ border-spacing: 0;
+ border: 1px solid __border__;
+}
+
+caption {
+ caption-side: top;
+ text-align: left;
+ margin: 0 0 .3em;
+}
+
+th,
+td {
+ padding: .3em .5em;
+ margin: 0;
+ vertical-align: top;
+ border: 1px solid __border__;
+ text-align: left;
+}
+th {
+ font-weight: bold;
+ background-color: __background_alt__;
+}
+
+
+/*____________ links ____________*/
+
+a {
+ outline: none;
+}
+a:link,
+a:visited {
+ text-decoration: none;
+ color: __link__;
+}
+a:link:hover,
+a:visited:hover,
+a:link:focus,
+a:visited:focus,
+a:link:active,
+a:visited:active {
+ text-decoration: underline;
+}
+
+
+/*____________ misc ____________*/
+
+img {
+ border-width: 0;
+ vertical-align: middle;
+ color: #666;
+ background-color: transparent;
+ font-style: italic;
+ height: auto;
+}
+img,
+object {
+ max-width: 100%;
+}
+/* IE8 and below won't display the images otherwise */
+button img {
+ max-width: none;
+}
+
+hr {
+ border-top: solid __border__;
+ border-bottom: solid __background__;
+ border-width: 1px 0;
+ height: 0;
+ width: 100%;
+ text-align: center;
+ clear: both;
+}
+
+acronym,
+abbr {
+ cursor: help;
+ border-bottom: 1px dotted;
+ font-style: normal;
+}
+
+pre,
+code,
+samp,
+kbd {
+ font-family: Consolas, "Andale Mono WT", "Andale Mono", "Bitstream Vera Sans Mono", "Nimbus Mono L", Monaco, "Courier New", monospace;
+ /* same font stack should be used for ".dokuwiki table.diff td" in _diff.css */
+ font-size: 1em;
+ direction: ltr;
+ text-align: left;
+}
+pre {
+ overflow: auto;
+ word-wrap: normal;
+}
+
+blockquote {
+ padding: 0 .5em;
+ border: solid __border__;
+ border-width: 0 0 0 .25em;
+}
+q:before,
+q:after {
+ content: '';
+}
+
+sub,
+sup {
+ font-size: .8em;
+ line-height: 1;
+}
+sub {
+ vertical-align: sub;
+}
+sup {
+ vertical-align: super;
+}
+
+/*____________ forms ____________*/
+
+/* for all of the form styles, style.ini colours are not used on purpose (except for fieldset border) */
+
+form {
+ display: inline;
+ margin: 0;
+ padding: 0;
+}
+fieldset {
+ padding: 1em 1em 0;
+ border: 1px solid __text_alt__;
+}
+legend {
+ margin: 0;
+ padding: 0 .1em;
+}
+label {
+ vertical-align: middle;
+ cursor: pointer;
+}
+
+input,
+textarea,
+button,
+select,
+optgroup,
+option {
+ font: inherit;
+ font-weight: normal;
+ color: #333;
+ background-color: #fff;
+ line-height: 1;
+ margin: 0;
+ vertical-align: middle;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+optgroup {
+ font-style: italic;
+ font-weight: bold;
+}
+option {
+ font-style: normal;
+ font-weight: normal;
+}
+
+input,
+textarea,
+select {
+ border: 1px solid #ccc;
+ box-shadow: inset 0 0 1px #eee;
+ border-radius: 2px;
+}
+input:active,
+input:focus,
+textarea:active,
+textarea:focus,
+select:active,
+select:focus {
+ border-color: #999;
+}
+input[type=radio],
+input[type=checkbox] {
+ padding: 0;
+ border-style: none;
+ box-shadow: none;
+}
+
+/* all types of buttons */
+input[type=submit],
+input.button,
+a.button,
+button,
+.qq-upload-button {
+ color: #333;
+ background-color: #eee;
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPgo8bGluZWFyR3JhZGllbnQgaWQ9Imc4MjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMTAwJSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNGNEY0RjQiIG9mZnNldD0iMC4zIi8+PHN0b3Agc3RvcC1jb2xvcj0iI0VFRUVFRSIgb2Zmc2V0PSIwLjk5Ii8+PHN0b3Agc3RvcC1jb2xvcj0iI0NDQ0NDQyIgb2Zmc2V0PSIuOTkiLz4KPC9saW5lYXJHcmFkaWVudD4KPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNnODI0KSIgLz4KPC9zdmc+);
+ /*background: -moz-linear-gradient( top, #ffffff 0%, #f4f4f4 30%, #eeeeee 99%, #cccccc 99%); see FS#2447*/
+ background: -webkit-linear-gradient(top, #ffffff 0%, #f4f4f4 30%, #eeeeee 99%, #cccccc 99%);
+ background: -o-linear-gradient( top, #ffffff 0%, #f4f4f4 30%, #eeeeee 99%, #cccccc 99%);
+ background: -ms-linear-gradient( top, #ffffff 0%, #f4f4f4 30%, #eeeeee 99%, #cccccc 99%);
+ background: linear-gradient( top, #ffffff 0%, #f4f4f4 30%, #eeeeee 99%, #cccccc 99%);
+ border: 1px solid #ccc;
+ border-radius: 2px;
+ padding: .1em .5em;
+ cursor: pointer;
+}
+
+input[type=submit]:hover,
+input[type=submit]:active,
+input[type=submit]:focus,
+input.button:hover,
+input.button:active,
+input.button:focus,
+a.button:hover,
+a.button:active,
+a.button:focus,
+button:hover,
+button:active,
+button:focus,
+.qq-upload-button:hover {
+ border-color: #999;
+ background-color: #ddd;
+ background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPgo8bGluZWFyR3JhZGllbnQgaWQ9Imc2NzAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMTAwJSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRkZGRkYiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNGNEY0RjQiIG9mZnNldD0iMC4zIi8+PHN0b3Agc3RvcC1jb2xvcj0iI0RERERERCIgb2Zmc2V0PSIwLjk5Ii8+PHN0b3Agc3RvcC1jb2xvcj0iI0JCQkJCQiIgb2Zmc2V0PSIuOTkiLz4KPC9saW5lYXJHcmFkaWVudD4KPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNnNjcwKSIgLz4KPC9zdmc+);
+ /*background: -moz-linear-gradient( top, #ffffff 0%, #f4f4f4 30%, #dddddd 99%, #cccccc 99%); see FS#2447*/
+ background: -webkit-linear-gradient(top, #ffffff 0%, #f4f4f4 30%, #dddddd 99%, #bbbbbb 99%);
+ background: -o-linear-gradient( top, #ffffff 0%, #f4f4f4 30%, #dddddd 99%, #bbbbbb 99%);
+ background: -ms-linear-gradient( top, #ffffff 0%, #f4f4f4 30%, #dddddd 99%, #bbbbbb 99%);
+ background: linear-gradient( top, #ffffff 0%, #f4f4f4 30%, #dddddd 99%, #bbbbbb 99%);
+}
+
+input::-moz-focus-inner,
+button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+input[disabled],
+button[disabled],
+input[readonly],
+button[readonly] {
+ cursor: auto;
+}
+
+/*____________ rtl corrections ____________*/
+
+[dir=rtl] caption,
+[dir=rtl] td,
+[dir=rtl] th {
+ text-align: right;
+}
+
+[dir=rtl] ul,
+[dir=rtl] ol {
+ padding: 0 1.5em 0 0;
+}
+[dir=rtl] li,
+[dir=rtl] dd {
+ margin: 0 1.5em 0 0;
+}
+[dir=rtl] blockquote {
+ border-width: 0 .25em 0 0;
+}
+
+[dir=rtl] h1,
+[dir=rtl] h2,
+[dir=rtl] h3,
+[dir=rtl] h4,
+[dir=rtl] h5,
+[dir=rtl] h6,
+[dir=rtl] caption,
+[dir=rtl] legend {
+ clear: right;
+}
+
+[dir=rtl] .a11y {
+ left: auto;
+ right: -9000px;
+}
diff --git a/lib/tpl/dokuwiki/css/content.css b/lib/tpl/dokuwiki/css/content.css
new file mode 100644
index 000000000..9f3eab0f0
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/content.css
@@ -0,0 +1,164 @@
+/**
+ * This file provides the main design styles for the page content.
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Clarence Lee <clarencedglee@gmail.com>
+ */
+
+
+/*____________ section indenting ____________
+
+.dokuwiki.page h1 {margin-left: 0;}
+.dokuwiki.page h2 {margin-left: .666em;}
+.dokuwiki.page h3 {margin-left: 1.776em;}
+.dokuwiki.page h4 {margin-left: 3em;}
+.dokuwiki.page h5 {margin-left: 4.5712em;}
+.dokuwiki.page div.level1 {margin-left: 0;}
+.dokuwiki.page div.level2 {margin-left: 1em;}
+.dokuwiki.page div.level3 {margin-left: 2em;}
+.dokuwiki.page div.level4 {margin-left: 3em;}
+.dokuwiki.page div.level5 {margin-left: 4em;}
+
+[dir=rtl] .dokuwiki .page h1 {margin-left: 0; margin-right: 0;}
+[dir=rtl] .dokuwiki .page h2 {margin-left: 0; margin-right: .666em;}
+[dir=rtl] .dokuwiki .page h3 {margin-left: 0; margin-right: 1.776em;}
+[dir=rtl] .dokuwiki .page h4 {margin-left: 0; margin-right: 3em;}
+[dir=rtl] .dokuwiki .page h5 {margin-left: 0; margin-right: 4.5712em;}
+[dir=rtl] .dokuwiki .page div.level1 {margin-left: 0; margin-right: 0;}
+[dir=rtl] .dokuwiki .page div.level2 {margin-left: 0; margin-right: 1em;}
+[dir=rtl] .dokuwiki .page div.level3 {margin-left: 0; margin-right: 2em;}
+[dir=rtl] .dokuwiki .page div.level4 {margin-left: 0; margin-right: 3em;}
+[dir=rtl] .dokuwiki .page div.level5 {margin-left: 0; margin-right: 4em;}
+*/
+/* hx margin-left = (1 / font-size) * .levelx-margin */
+
+
+/*____________ images ____________*/
+
+/* embedded images (styles are already partly set in lib/styles/all.css) */
+.dokuwiki img.media {
+ margin: .2em 0;
+}
+.dokuwiki img.medialeft {
+ margin: .2em 1em .2em 0;
+}
+.dokuwiki img.mediaright {
+ margin: .2em 0 .2em 1em;
+}
+.dokuwiki img.mediacenter {
+ margin: .2em auto;
+}
+
+
+/*____________ lists ____________*/
+
+#dokuwiki__content ul li,
+#dokuwiki__aside ul li {
+ color: __text_alt__;
+}
+#dokuwiki__content ol li,
+#dokuwiki__aside ol li {
+ color: __text_neu__;
+}
+#dokuwiki__content li .li,
+#dokuwiki__aside li .li {
+ color: __text__;
+}
+
+
+/*____________ tables ____________*/
+
+.dokuwiki div.table {
+ overflow-x: auto;
+ margin-bottom: 1.4em;
+}
+.dokuwiki div.table table {
+ margin-bottom: 0;
+}
+
+.dokuwiki table.inline {
+ min-width: 50%;
+ border-width: 0;
+}
+.dokuwiki table.inline th,
+.dokuwiki table.inline td {
+ border: 1px solid __border__;
+}
+.dokuwiki table.inline th {
+ color: inherit;
+ background-color: __background_alt__;
+}
+.dokuwiki table.inline td {
+}
+.dokuwiki table.inline tr:hover td {
+ background-color: __background_alt__;
+}
+.dokuwiki table.inline tr:hover th {
+ background-color: __border__;
+}
+
+
+/*____________ code ____________*/
+
+.dokuwiki pre,
+.dokuwiki tt,
+.dokuwiki code,
+.dokuwiki samp,
+.dokuwiki kbd {
+ background-color: __background_alt__;
+ color: __text__;
+}
+/* fix if background-color hides underlining */
+.dokuwiki em.u code {
+ text-decoration: underline;
+}
+.dokuwiki pre {
+ border: 1px solid __border__;
+ padding: .75em 1em;
+}
+/* for code in <file> */
+.dokuwiki pre.file {
+}
+
+/* filenames for downloadable file and code blocks */
+.dokuwiki dl.code,
+.dokuwiki dl.file {
+}
+
+.dokuwiki dl.code dt,
+.dokuwiki dl.file dt {
+ background-color: __background_alt__;
+ /*background: -moz-linear-gradient( top, __background__ 0%, __background_alt__ 100%); see FS#2447 */
+ background: -webkit-linear-gradient(top, __background__ 0%, __background_alt__ 100%);
+ background: -o-linear-gradient( top, __background__ 0%, __background_alt__ 100%);
+ background: -ms-linear-gradient( top, __background__ 0%, __background_alt__ 100%);
+ background: linear-gradient( top, __background__ 0%, __background_alt__ 100%);
+ color: inherit;
+ border: 1px solid __border__;
+ border-bottom-color: __background_alt__;
+ border-top-left-radius: .3em;
+ border-top-right-radius: .3em;
+ padding: .3em .6em .1em;
+ margin-bottom: -1px;
+ float: left;
+}
+[dir=rtl] .dokuwiki dl.code dt,
+[dir=rtl] .dokuwiki dl.file dt {
+ margin-left: 0;
+ margin-right: 1em;
+}
+.dokuwiki dl.code dt a,
+.dokuwiki dl.file dt a {
+ background-color: transparent;
+ font-size: 0.875em;
+ font-weight: normal;
+ display: block;
+ min-height: 16px;
+}
+.dokuwiki dl.code dd,
+.dokuwiki dl.file dd {
+ margin: 0;
+ clear: left;
+}
+
diff --git a/lib/tpl/dokuwiki/css/design.css b/lib/tpl/dokuwiki/css/design.css
new file mode 100644
index 000000000..12ec80687
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/design.css
@@ -0,0 +1,606 @@
+/**
+ * This file provides the main design styles for the
+ * bits that surround the content.
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Clarence Lee <clarencedglee@gmail.com>
+ */
+
+/* header
+********************************************************************/
+
+#dokuwiki__header {
+ padding: 2em 0 1.5em;
+}
+
+#dokuwiki__header .headings,
+#dokuwiki__header .tools {
+ margin-bottom: 1.5em;
+ width: 49%;
+}
+#dokuwiki__header h1 img {
+ float: left;
+ margin-right: .5em;
+}
+[dir=rtl] #dokuwiki__header h1 img {
+ float: right;
+ margin-left: .5em;
+ margin-right: 0;
+}
+#dokuwiki__header h1 span {
+ display: block;
+ padding-top: 10px;
+}
+#dokuwiki__header h1 {
+ margin: 0;
+ font-size: 1.5em;
+ font-weight: normal;
+}
+#dokuwiki__header h1 a {
+ text-decoration: none;
+ color: __text__;
+ background-color: inherit;
+}
+#dokuwiki__header h1 a:hover,
+#dokuwiki__header h1 a:active,
+#dokuwiki__header h1 a:focus {
+}
+#dokuwiki__header p.claim {
+ margin-bottom: 0;
+ font-size: 0.875em;
+}
+
+#dokuwiki__header .tools {
+ margin-top: .2em;
+}
+
+
+/* tools
+********************************************************************/
+
+/* highlight selected tool */
+.mode_admin a.action.admin,
+.mode_login a.action.login,
+.mode_register a.action.register,
+.mode_profile a.action.profile,
+.mode_recent a.action.recent,
+.mode_index a.action.index,
+.mode_media a.action.media,
+.mode_revisions a.action.revs,
+.mode_backlink a.action.backlink,
+.mode_subscribe a.action.subscribe {
+ font-weight: bold;
+}
+
+#dokuwiki__header .tools ul {
+ padding-left: 0;
+ margin-bottom: 0;
+}
+#dokuwiki__header .tools li {
+ font-size: 0.875em;
+ margin-left: 1em;
+ list-style: none;
+ display: inline;
+}
+[dir=rtl] #dokuwiki__header .tools li {
+ margin-right: 1em;
+ margin-left: 0;
+}
+#dokuwiki__header .tools form.search div.ajax_qsearch li {
+ font-size: 1em;
+ margin-left: 0;
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+#dokuwiki__usertools a.action {
+ padding-left: 20px;
+ background: transparent url(images/usertools.png) no-repeat 0 0;
+}
+[dir=rtl] #dokuwiki__usertools a.action {
+ padding-left: 0;
+ padding-right: 20px;
+}
+[dir=rtl] #IE7 #dokuwiki__usertools a.action {
+ display: inline-block;
+}
+
+
+#dokuwiki__header .mobileTools {
+ display: none; /* hide mobile tools dropdown to only show in mobile view */
+}
+
+/*____________ user tools ____________*/
+
+#dokuwiki__usertools {
+ position: absolute;
+ top: .5em;
+ right: .5em;
+ text-align: right;
+ width: 100%;
+}
+[dir=rtl] #dokuwiki__usertools {
+ text-align: left;
+ left: 40px;
+ right: auto;
+}
+#dokuwiki__usertools ul {
+ margin: 0 auto;
+ padding: 0;
+ max-width: __site_width__;
+}
+#dokuwiki__usertools ul li.user {
+}
+
+#dokuwiki__usertools a.action.admin {
+ background-position: left 0;
+}
+[dir=rtl] #dokuwiki__usertools a.action.admin {
+ background-position: right 0;
+}
+#dokuwiki__usertools a.action.profile {
+ background-position: left -32px;
+}
+[dir=rtl] #dokuwiki__usertools a.action.profile {
+ background-position: right -32px;
+}
+#dokuwiki__usertools a.action.register {
+ background-position: left -64px;
+}
+[dir=rtl] #dokuwiki__usertools a.action.register {
+ background-position: right -64px;
+}
+#dokuwiki__usertools a.action.login {
+ background-position: left -96px;
+}
+[dir=rtl] #dokuwiki__usertools a.action.login {
+ background-position: right -96px;
+}
+#dokuwiki__usertools a.action.logout {
+ background-position: left -128px;
+}
+[dir=rtl] #dokuwiki__usertools a.action.logout {
+ background-position: right -128px;
+}
+
+
+/*____________ site tools ____________*/
+
+#dokuwiki__sitetools {
+ text-align: right;
+}
+[dir=rtl] #dokuwiki__sitetools {
+ text-align: left;
+}
+
+#dokuwiki__sitetools form.search {
+ display: block;
+ font-size: 0.875em;
+ position: relative;
+}
+#IE7 #dokuwiki__sitetools form.search {
+ min-height: 1px;
+ z-index: 21;
+}
+#dokuwiki__sitetools form.search input.edit {
+ width: 18em;
+ padding: .35em 22px .35em .1em;
+}
+[dir=rtl] #dokuwiki__sitetools form.search input.edit {
+ padding: .35em .1em .35em 22px;
+}
+#dokuwiki__sitetools form.search input.button {
+ background: transparent url(images/search.png) no-repeat 0 0;
+ border-width: 0;
+ width: 19px;
+ height: 14px;
+ text-indent: -99999px;
+ margin-left: -20px;
+ box-shadow: none;
+ padding: 0;
+}
+[dir=rtl] #dokuwiki__sitetools form.search input.button {
+ background-position: 5px 0;
+ margin-left: 0;
+ margin-right: -20px;
+}
+
+#dokuwiki__sitetools ul {
+ margin-top: 0.5em;
+}
+#dokuwiki__sitetools li {
+}
+
+/*____________ breadcrumbs ____________*/
+
+.dokuwiki div.breadcrumbs {
+ border-top: 1px solid __border__;
+ border-bottom: 1px solid __background__;
+ margin-bottom: .5em;
+ font-size: 0.875em;
+ clear: both;
+}
+.dokuwiki div.breadcrumbs div {
+ padding: .1em .35em;
+}
+
+.dokuwiki div.breadcrumbs div:only-child {
+ border-top: 1px solid __background__;
+ border-bottom: 1px solid __border__;
+}
+.dokuwiki div.breadcrumbs div:first-child {
+ border-top: 1px solid __background__;
+}
+#IE7 .dokuwiki div.breadcrumbs div,
+#IE8 .dokuwiki div.breadcrumbs div {
+ border-bottom: 1px solid __border__;
+}
+.dokuwiki div.breadcrumbs div:last-child {
+ border-bottom: 1px solid __border__;
+}
+
+.dokuwiki div.breadcrumbs a {
+ color: __link__;
+ background-color: inherit;
+}
+.dokuwiki div.breadcrumbs .bcsep {
+ font-size: 0.75em;
+}
+
+
+/* sidebar
+********************************************************************/
+
+#dokuwiki__aside {
+}
+#dokuwiki__aside > .pad {
+ font-size: 0.875em;
+ overflow: hidden;
+ word-wrap: break-word;
+}
+
+/* make sidebar more condensed */
+
+#dokuwiki__aside h1 {
+ margin-bottom: .222em;
+}
+#dokuwiki__aside h2 {
+ margin-bottom: .333em;
+}
+#dokuwiki__aside h3 {
+ margin-bottom: .444em;
+}
+#dokuwiki__aside h4 {
+ margin-bottom: .5em;
+}
+#dokuwiki__aside h5 {
+ margin-bottom: .5714em;
+}
+
+#dokuwiki__aside p,
+#dokuwiki__aside ul,
+#dokuwiki__aside ol,
+#dokuwiki__aside dl,
+#dokuwiki__aside pre,
+#dokuwiki__aside table,
+#dokuwiki__aside fieldset,
+#dokuwiki__aside hr,
+#dokuwiki__aside blockquote,
+#dokuwiki__aside address {
+ margin-bottom: .7em;
+}
+
+#dokuwiki__aside ul,
+#dokuwiki__aside ol {
+ padding-left: 0;
+}
+[dir=rtl] #dokuwiki__aside ul,
+[dir=rtl] #dokuwiki__aside ol {
+ padding-right: 0;
+}
+#dokuwiki__aside li ul,
+#dokuwiki__aside li ol {
+ margin-bottom: 0;
+}
+
+#dokuwiki__aside a:link,
+#dokuwiki__aside a:visited {
+ color: __link__;
+ background-color: inherit;
+}
+
+
+/* content
+********************************************************************/
+
+#dokuwiki__content {
+}
+
+.dokuwiki .pageId {
+ position: absolute;
+ top: -2.3em;
+ right: -1em;
+ overflow: hidden;
+ padding: 1em 1em 0;
+}
+[dir=rtl] .dokuwiki .pageId {
+ right: auto;
+ left: -1em;
+}
+.dokuwiki .pageId span {
+ font-size: 0.875em;
+ border: solid __background_alt__;
+ border-width: 1px 1px 0;
+ background-color: __background__;
+ color: __text_alt__;
+ padding: .1em .35em;
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+ box-shadow: 0 0 .5em #999;
+ display: block;
+}
+
+.dokuwiki div.page {
+ background: __background__;
+ color: inherit;
+ border: 1px solid #eee;
+ box-shadow: 0 0 .5em #999;
+ border-radius: 2px;
+ padding: 1.556em 2em 2em;
+ margin-bottom: .5em;
+ overflow: hidden;
+ word-wrap: break-word;
+}
+
+.dokuwiki .docInfo {
+ font-size: 0.875em;
+ text-align: right;
+}
+[dir=rtl] .dokuwiki .docInfo {
+ text-align: left;
+}
+
+/*____________ misc ____________*/
+
+/* license note under edit window */
+.dokuwiki div.license {
+ font-size: 93.75%;
+}
+
+#IE7 .dokuwiki input.button,
+#IE7 .dokuwiki button {
+ line-height: 1.4;
+}
+
+#acl__tree li {
+ margin: 0;
+}
+
+#dokuwiki__content span.curid a {
+ font-weight: normal;
+}
+#dokuwiki__content strong span.curid a {
+ font-weight: bold;
+}
+
+
+/*____________ changes to _edit ____________*/
+
+.dokuwiki div.toolbar button.toolbutton {
+ border-radius: 0;
+ border-left-width: 0;
+ padding: .1em .35em;
+}
+.dokuwiki div.toolbar button.toolbutton:first-child {
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ border-left-width: 1px;
+}
+[dir=rtl] .dokuwiki div.toolbar button.toolbutton:first-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ border-left-width: 0;
+ border-right-width: 1px;
+}
+.dokuwiki div.toolbar button.toolbutton:last-child {
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+}
+[dir=rtl] .dokuwiki div.toolbar button.toolbutton:last-child {
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-left-width: 1px;
+}
+
+.dokuwiki div.section_highlight {
+ margin: -3em -2em -.01em -2em;
+ padding: 3em 1em .01em 1em;
+ border-width: 0 1em;
+}
+[dir=rtl] .dokuwiki div.section_highlight {
+ margin-right: -2em;
+ border-right-width: 1em;
+}
+
+.dokuwiki textarea.edit {
+ font-family: Consolas, "Andale Mono WT", "Andale Mono", "Bitstream Vera Sans Mono", "Liberation Mono", Monaco, "Courier New", monospace;
+}
+
+.dokuwiki div.preview {
+ margin: 0 -2em;
+ padding: 0 2em;
+}
+.dokuwiki.hasSidebar div.preview {
+ border-right: __sidebar_width__ solid __background_alt__;
+}
+[dir=rtl] .dokuwiki.hasSidebar div.preview {
+ border-right-width: 0;
+ border-left: __sidebar_width__ solid __background_alt__;
+}
+.dokuwiki div.preview div.pad {
+ padding: 1.556em 0 2em;
+}
+
+
+/*____________ changes to _toc ____________*/
+
+#dw__toc {
+ margin: -1.556em -2em .5em 1.4em;
+ width: __sidebar_width__;
+ border-left: 1px solid __border__;
+ background: __background__;
+ color: inherit;
+}
+[dir=rtl] #dw__toc {
+ margin: -1.556em 1.4em .5em -2em;
+ border-left-width: 0;
+ border-right: 1px solid __border__;
+}
+
+.dokuwiki h3.toggle {
+ padding: .5em 1em;
+ margin-bottom: 0;
+ font-size: .875em;
+ letter-spacing: .1em;
+}
+#dokuwiki__aside h3.toggle {
+ display: none;
+}
+
+.dokuwiki .toggle strong {
+ background: transparent url(images/toc-arrows.png) 0 0;
+ width: 8px;
+ height: 5px;
+ margin: .4em 0 0;
+}
+.dokuwiki .toggle.closed strong {
+ background-position: 0 -5px;
+}
+
+.dokuwiki .toggle strong span {
+ display: none;
+}
+
+
+#dw__toc > div {
+ font-size: 0.875em;
+ padding: .5em 1em 1em;
+}
+#dw__toc ul {
+ padding: 0 0 0 1.2em;
+}
+[dir=rtl] #dw__toc ul {
+ padding: 0 1.5em 0 0;
+}
+#dw__toc ul li {
+ list-style-image: url(images/toc-bullet.png);
+}
+#dw__toc ul li.clear {
+ list-style: none;
+}
+#dw__toc ul li div.li {
+ padding: .2em 0;
+}
+
+
+/*____________ changes to _imgdetail ____________*/
+
+#dokuwiki__detail {
+ padding: 0;
+}
+#dokuwiki__detail img {
+ float: none;
+ margin-bottom: 1.4em;
+}
+#dokuwiki__detail div.img_detail {
+ float: none;
+}
+
+#dokuwiki__detail div.img_detail dl {
+ overflow: hidden;
+}
+#dokuwiki__detail div.img_detail dl dt {
+ float: left;
+ width: 9em;
+ text-align: right;
+ clear: left;
+}
+[dir=rtl] #dokuwiki__detail div.img_detail dl dt {
+ float: right;
+ text-align: left;
+ clear: right;
+}
+#dokuwiki__detail div.img_detail dl dd {
+ margin-left: 9.5em;
+}
+[dir=rtl] #dokuwiki__detail div.img_detail dl dd {
+ margin-left: 0;
+ margin-right: 9.5em;
+}
+
+
+/*____________ JS popup ____________*/
+
+.JSpopup {
+ background-color: __background__;
+ color: __text__;
+ border: 1px solid __border__;
+ box-shadow: .1em .1em .1em __border__;
+ border-radius: 2px;
+ padding: .3em .5em;
+ font-size: .9em;
+}
+.dokuwiki form.search div.ajax_qsearch {
+ top: -.35em;
+ font-size: 1em;
+ text-overflow: ellipsis;
+}
+
+.JSpopup ul,
+.JSpopup ol {
+ padding-left: 0;
+}
+[dir=rtl] .JSpopup ul,
+[dir=rtl] .JSpopup ol {
+ padding-right: 0;
+}
+
+
+/* footer
+********************************************************************/
+
+.dokuwiki .wrapper {
+ margin-bottom: 1.4em;
+}
+
+#dokuwiki__footer {
+ margin-bottom: 1em;
+ text-align: center;
+}
+#dokuwiki__footer > .pad {
+ font-size: 0.875em;
+}
+
+#dokuwiki__footer div.license {
+ margin-bottom: 0.5em;
+ font-size: 100%;
+}
+
+[dir=rtl] #dokuwiki__footer .license img {
+ margin: 0 0 0 .5em;
+}
+
+#dokuwiki__footer div.buttons a img {
+ opacity: 0.5;
+}
+#dokuwiki__footer div.buttons a:hover img,
+#dokuwiki__footer div.buttons a:active img,
+#dokuwiki__footer div.buttons a:focus img {
+ opacity: 1;
+}
diff --git a/lib/tpl/dokuwiki/css/includes.css b/lib/tpl/dokuwiki/css/includes.css
new file mode 100644
index 000000000..bc189962f
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/includes.css
@@ -0,0 +1,4 @@
+/**
+ * This file provides styles for included seperate html files
+ * (added through "include hooks").
+ */
diff --git a/lib/tpl/dokuwiki/css/mobile.css b/lib/tpl/dokuwiki/css/mobile.css
new file mode 100644
index 000000000..6e07f23ec
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/mobile.css
@@ -0,0 +1,270 @@
+/**
+ * This file provides styles for mobile devices
+ * and smaller screens (up to 480px and 768px width).
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ */
+
+/* up to 979px screen widths
+********************************************************************/
+@media only screen and (max-width: 979px) {
+
+/* structure */
+#dokuwiki__aside {
+ width: 100%;
+ float: none;
+}
+
+#dokuwiki__aside > .pad,
+[dir=rtl] #dokuwiki__aside > .pad {
+ margin: 0 0 .5em;
+ /* style like .page */
+ background: __background__;
+ color: inherit;
+ border: 1px solid #eee;
+ box-shadow: 0 0 .5em #999;
+ border-radius: 2px;
+ padding: 1em;
+ margin-bottom: .5em;
+}
+
+#dokuwiki__aside h3.toggle {
+ font-size: 1em;
+}
+#dokuwiki__aside h3.toggle.closed {
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+#dokuwiki__aside h3.toggle.open {
+ border-bottom: 1px solid __border__;
+}
+
+.showSidebar #dokuwiki__content {
+ float: none;
+ margin-left: 0;
+ width: 100%;
+}
+.showSidebar #dokuwiki__content > .pad {
+ margin-left: 0;
+}
+
+[dir=rtl] .showSidebar #dokuwiki__content,
+[dir=rtl] .showSidebar #dokuwiki__content > .pad {
+ margin-right: 0;
+}
+
+/* toc */
+#dw__toc {
+ float: none;
+ margin: 0 0 1em 0;
+ width: auto;
+ border-left-width: 0;
+ border-bottom: 1px solid __border__;
+}
+[dir=rtl] #dw__toc {
+ float: none;
+ margin: 0 0 1em 0;
+ border-right-width: 0;
+}
+
+.dokuwiki h3.toggle {
+ padding: 0 .5em .5em 0;
+}
+#dw__toc > div,
+#dokuwiki__aside div.content {
+ padding: .2em 0 .5em;
+}
+
+/* page */
+.dokuwiki div.page {
+ padding: 1em;
+}
+
+/* _edit */
+.dokuwiki div.section_highlight {
+ margin: -3em -1em -.01em -1em;
+ padding: 3em .5em .01em .5em;
+ border-width: 0 .5em;
+}
+.dokuwiki div.preview {
+ margin: 0 -1em;
+ padding: 1em;
+}
+
+/* _recent */
+.dokuwiki form.changes ul {
+ padding-left: 0;
+}
+[dir=rtl] .dokuwiki form.changes ul {
+ padding-right: 0;
+}
+
+
+} /* /@media */
+
+
+/* up to 480px screen widths
+********************************************************************/
+@media only screen and (max-width: 480px) {
+
+body {
+ font-size: 100%;
+}
+
+/*____________ structure ____________*/
+
+#dokuwiki__site {
+ max-width: 100%;
+}
+#dokuwiki__site > .site {
+ padding: 0 .5em;
+}
+#dokuwiki__header {
+ padding: .5em 0;
+}
+
+
+/*____________ header ____________*/
+
+#dokuwiki__header ul.a11y.skip {
+ position: static !important;
+ left: 0 !important;
+ width: auto !important;
+ height: auto !important;
+ float: right;
+ font-size: 0.875em;
+ list-style: none;
+ padding-left: 0;
+ margin: 0;
+}
+[dir=rtl] #dokuwiki__header ul.a11y.skip {
+ left: auto !important;
+ right: 0 !important;
+ float: left;
+ padding-right: 0;
+}
+#dokuwiki__header ul.a11y.skip li {
+ margin-left: .35em;
+ display: inline;
+}
+[dir=rtl] #dokuwiki__header ul.a11y.skip li {
+ margin: 0 .35em 0 0;
+}
+
+#dokuwiki__header .headings,
+#dokuwiki__header .tools {
+ float: none;
+ text-align: left;
+ width: auto;
+ margin-bottom: .5em;
+}
+[dir=rtl] #dokuwiki__header .headings,
+[dir=rtl] #dokuwiki__header .tools {
+ float: none;
+ text-align: right;
+ width: auto;
+}
+#dokuwiki__sitetools {
+ text-align: left;
+}
+[dir=rtl] #dokuwiki__sitetools {
+ text-align: right;
+}
+#dokuwiki__usertools,
+#dokuwiki__sitetools ul,
+#dokuwiki__sitetools h3,
+#dokuwiki__pagetools,
+.dokuwiki div.breadcrumbs, /* @todo: maybe move breadcrumbs to the bottom? */
+.dokuwiki .pageId {
+ display: none;
+}
+
+/* search form */
+#dokuwiki__sitetools form.search {
+ float: left;
+ margin: 0 .2em .2em 0;
+ width: 49%;
+}
+[dir=rtl] #dokuwiki__sitetools form.search {
+ float: right;
+ margin: 0 0 .2em .2em;
+}
+
+#dokuwiki__sitetools form.search input.edit {
+ width: 100% !important;
+}
+.dokuwiki form.search div.ajax_qsearch {
+ display: none !important;
+}
+
+/* action dropdown is alternative for all hidden tools */
+#dokuwiki__header .mobileTools {
+ display: block;
+ font-size: 0.875em;
+ margin: 0 0 .2em 0;
+ float: right;
+ width: 49%;
+}
+[dir=rtl] #dokuwiki__header .mobileTools {
+ float: left;
+}
+#dokuwiki__header .mobileTools select {
+ padding: .3em .1em;
+ width: 100% !important;
+}
+
+/* force same height on search input and tools select */
+#dokuwiki__sitetools form.search input.edit,
+#dokuwiki__header .mobileTools select {
+ height: 2.1em;
+ line-height: 2.1em;
+ overflow: visible;
+}
+
+
+/*____________ content ____________*/
+
+#dokuwiki__aside > .pad,
+.dokuwiki div.page {
+ padding: .5em;
+}
+
+/* form elements */
+#config__manager fieldset td.value,
+#config__manager td .input,
+.dokuwiki fieldset,
+.dokuwiki input.edit,
+.dokuwiki textarea,
+.dokuwiki select {
+ width: auto !important;
+ max-width: 100% !important;
+}
+#config__manager fieldset {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+.dokuwiki label.block {
+ text-align: left;
+}
+[dir=rtl] .dokuwiki label.block {
+ text-align: right;
+}
+.dokuwiki label.block span {
+ display: block;
+}
+
+/* _edit */
+.dokuwiki div.section_highlight {
+ margin: 0;
+ padding: 0;
+ border-width: 0;
+}
+.dokuwiki div.preview {
+ margin: 0 -.5em;
+ padding: .5em;
+}
+
+
+
+} /* /@media */
diff --git a/lib/tpl/dokuwiki/css/pagetools.css b/lib/tpl/dokuwiki/css/pagetools.css
new file mode 100644
index 000000000..a40d525b3
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/pagetools.css
@@ -0,0 +1,334 @@
+/**
+ * This file provides the styles for the page tools
+ * (fly out navigation beside the page to edit, etc).
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+#dokuwiki__site > .site {
+ /* give space to the right so the tools won't disappear on smaller screens */
+ /* it's 40px because the 30px wide icons will have 5px more spacing to the left and right */
+ padding-right: 40px;
+ /* give the same space to the left to balance it out */
+ padding-left: 40px;
+}
+.dokuwiki div.page {
+ height: 190px;
+ min-height: 190px; /* 30 (= height of icons) x 6 (= maximum number of possible tools) + 2x5 */
+ height: auto;
+}
+#dokuwiki__usertools {
+ /* move the tools just outside of the site */
+ right: 40px;
+}
+[dir=rtl] #dokuwiki__usertools {
+ right: auto;
+ left: 40px;
+}
+
+
+#dokuwiki__pagetools {
+ position: absolute;
+ right: -40px;
+ /* on same vertical level as first headline, because .page has 2em padding */
+ top: 2em;
+ width: 40px;
+}
+[dir=rtl] #dokuwiki__pagetools {
+ right: auto;
+ left: -40px;
+}
+
+#dokuwiki__pagetools div.tools {
+ position: fixed;
+ width: 40px;
+}
+
+#dokuwiki__pagetools ul {
+ position: absolute;
+ right: 0;
+ text-align: right;
+ margin: 0;
+ padding: 0;
+ /* add transparent border to prevent jumping when proper border is added on hover */
+ border: 1px solid transparent;
+}
+[dir=rtl] #dokuwiki__pagetools ul {
+ right: auto;
+ left: 0;
+ text-align: left;
+}
+
+#dokuwiki__pagetools ul li {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ font-size: 0.875em;
+}
+
+#dokuwiki__pagetools ul li a {
+ display: block;
+ min-height: 20px; /* 30 - 2x5 */
+ line-height: 20px;
+ padding: 5px 40px 5px 5px;
+ background-image: url(images/pagetools-sprite.png);
+ background-position: right 0;
+ background-repeat: no-repeat;
+ /* add transparent border to prevent jumping when proper border is added on focus */
+ border: 1px solid transparent;
+ white-space: nowrap;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a {
+ padding: 5px 5px 5px 40px;
+ background-position: left 0;
+}
+
+/* hide labels accessibly when neither on hover nor on focus */
+#dokuwiki__pagetools ul li a span {
+ position: absolute;
+ clip: rect(0 0 0 0); /* IE7, IE6 */
+ clip: rect(0, 0, 0, 0);
+}
+
+/* show all tools on hover and individual tools on focus */
+#dokuwiki__pagetools:hover ul,
+#dokuwiki__pagetools ul li a:focus {
+ background-color: __background__;
+ border-color: __border__;
+ border-radius: 2px;
+ box-shadow: 2px 2px 2px __text_alt__;
+}
+[dir=rtl] #dokuwiki__pagetools:hover ul,
+[dir=rtl] #dokuwiki__pagetools ul li a:focus {
+ box-shadow: -2px 2px 2px __text_alt__;
+}
+
+#dokuwiki__pagetools:hover ul li a span,
+#dokuwiki__pagetools ul li a:focus span {
+ display: inline;
+ position: static;
+}
+
+#dokuwiki__pagetools ul li a:hover,
+#dokuwiki__pagetools ul li a:active,
+#dokuwiki__pagetools ul li a:focus {
+ text-decoration: none;
+}
+#dokuwiki__pagetools ul li a:hover {
+ background-color: __background_alt__;
+}
+
+/*____________ all available icons in sprite ____________*/
+
+#dokuwiki__pagetools ul li a.edit {
+ background-position: right 0;
+}
+#dokuwiki__pagetools ul li a.edit:hover,
+#dokuwiki__pagetools ul li a.edit:active,
+#dokuwiki__pagetools ul li a.edit:focus {
+ background-position: right -45px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.edit {
+ background-position: left 0;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.edit:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.edit:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.edit:focus {
+ background-position: left -45px;
+}
+
+#dokuwiki__pagetools ul li a.create {
+ background-position: right -90px;
+}
+#dokuwiki__pagetools ul li a.create:hover,
+#dokuwiki__pagetools ul li a.create:active,
+#dokuwiki__pagetools ul li a.create:focus {
+ background-position: right -135px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.create {
+ background-position: left -90px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.create:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.create:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.create:focus {
+ background-position: left -135px;
+}
+
+#dokuwiki__pagetools ul li a.show {
+ background-position: right -270px;
+}
+#dokuwiki__pagetools ul li a.show:hover,
+#dokuwiki__pagetools ul li a.show:active,
+#dokuwiki__pagetools ul li a.show:focus {
+ background-position: right -315px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.show {
+ background-position: left -270px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.show:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.show:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.show:focus {
+ background-position: left -315px;
+}
+
+#dokuwiki__pagetools ul li a.source {
+ background-position: right -360px;
+}
+#dokuwiki__pagetools ul li a.source:hover,
+#dokuwiki__pagetools ul li a.source:active,
+#dokuwiki__pagetools ul li a.source:focus {
+ background-position: right -405px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.source {
+ background-position: left -360px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.source:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.source:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.source:focus {
+ background-position: left -405px;
+}
+
+#dokuwiki__pagetools ul li a.draft {
+ background-position: right -180px;
+}
+#dokuwiki__pagetools ul li a.draft:hover,
+#dokuwiki__pagetools ul li a.draft:active,
+#dokuwiki__pagetools ul li a.draft:focus {
+ background-position: right -225px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.draft {
+ background-position: left -180px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.draft:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.draft:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.draft:focus {
+ background-position: left -225px;
+}
+
+#dokuwiki__pagetools ul li a.revs {
+ background-position: right -540px;
+}
+#dokuwiki__pagetools ul li a.revs:hover,
+#dokuwiki__pagetools ul li a.revs:active,
+#dokuwiki__pagetools ul li a.revs:focus,
+.mode_revisions #dokuwiki__pagetools ul li a.revs {
+ background-position: right -585px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.revs {
+ background-position: left -540px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.revs:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.revs:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.revs:focus,
+.mode_revisions [dir=rtl] #dokuwiki__pagetools ul li a.revs {
+ background-position: left -585px;
+}
+
+#dokuwiki__pagetools ul li a.backlink {
+ background-position: right -630px;
+}
+#dokuwiki__pagetools ul li a.backlink:hover,
+#dokuwiki__pagetools ul li a.backlink:active,
+#dokuwiki__pagetools ul li a.backlink:focus,
+.mode_backlink #dokuwiki__pagetools ul li a.backlink {
+ background-position: right -675px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.backlink {
+ background-position: left -630px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.backlink:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.backlink:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.backlink:focus,
+.mode_backlink [dir=rtl] #dokuwiki__pagetools ul li a.backlink {
+ background-position: left -675px;
+}
+
+#dokuwiki__pagetools ul li a.top {
+ background-position: right -810px;
+}
+#dokuwiki__pagetools ul li a.top:hover,
+#dokuwiki__pagetools ul li a.top:active,
+#dokuwiki__pagetools ul li a.top:focus {
+ background-position: right -855px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.top {
+ background-position: left -810px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.top:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.top:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.top:focus {
+ background-position: left -855px;
+}
+
+#dokuwiki__pagetools ul li a.revert {
+ background-position: right -450px;
+}
+#dokuwiki__pagetools ul li a.revert:hover,
+#dokuwiki__pagetools ul li a.revert:active,
+#dokuwiki__pagetools ul li a.revert:focus,
+.mode_revert #dokuwiki__pagetools ul li a.revert {
+ background-position: right -495px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.revert {
+ background-position: left -450px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.revert:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.revert:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.revert:focus,
+.mode_revert [dir=rtl] #dokuwiki__pagetools ul li a.revert {
+ background-position: left -495px;
+}
+
+#dokuwiki__pagetools ul li a.subscribe {
+ background-position: right -720px;
+}
+#dokuwiki__pagetools ul li a.subscribe:hover,
+#dokuwiki__pagetools ul li a.subscribe:active,
+#dokuwiki__pagetools ul li a.subscribe:focus,
+.mode_subscribe #dokuwiki__pagetools ul li a.subscribe {
+ background-position: right -765px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.subscribe {
+ background-position: left -720px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.subscribe:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.subscribe:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.subscribe:focus,
+.mode_subscribe [dir=rtl] #dokuwiki__pagetools ul li a.subscribe {
+ background-position: left -765px;
+}
+
+#dokuwiki__pagetools ul li a.mediaManager {
+ background-position: right -900px;
+}
+#dokuwiki__pagetools ul li a.mediaManager:hover,
+#dokuwiki__pagetools ul li a.mediaManager:active,
+#dokuwiki__pagetools ul li a.mediaManager:focus {
+ background-position: right -945px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager {
+ background-position: left -900px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager:focus {
+ background-position: left -945px;
+}
+
+#dokuwiki__pagetools ul li a.back {
+ background-position: right -990px;
+}
+#dokuwiki__pagetools ul li a.back:hover,
+#dokuwiki__pagetools ul li a.back:active,
+#dokuwiki__pagetools ul li a.back:focus {
+ background-position: right -1035px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.back {
+ background-position: left -990px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.back:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.back:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.back:focus {
+ background-position: left -1035px;
+}
diff --git a/lib/tpl/dokuwiki/css/print.css b/lib/tpl/dokuwiki/css/print.css
new file mode 100644
index 000000000..191d50c28
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/print.css
@@ -0,0 +1,193 @@
+/**
+ * This file provides the styles for printing.
+ *
+ * @todo: improve and finish
+ */
+
+body {
+ /*
+ font: normal 12pt/1.2 serif;
+ color: #000;
+ background-color: #fff;
+ */
+}
+
+/* hide certain sections */
+.a11y,
+div.notify,
+div.info,
+div.success,
+div.error,
+#dokuwiki__header .tools,
+#dokuwiki__aside,
+.dokuwiki .breadcrumbs,
+#dw__toc,
+h3.toggle,
+.dokuwiki .secedit,
+#dokuwiki__pagetools,
+#dokuwiki__footer {
+ display: none;
+}
+
+.dokuwiki h1,
+.dokuwiki h2,
+.dokuwiki h3,
+.dokuwiki h4,
+.dokuwiki h5,
+.dokuwiki caption,
+.dokuwiki legend {
+ clear: both;
+}
+.dokuwiki ul {
+ list-style: disc outside;
+}
+.dokuwiki ol {
+ list-style: decimal outside;
+}
+.dokuwiki ol ol {
+ list-style-type: lower-alpha;
+}
+.dokuwiki ol ol ol {
+ list-style-type: upper-roman;
+}
+.dokuwiki ol ol ol ol {
+ list-style-type: upper-alpha;
+}
+.dokuwiki ol ol ol ol ol {
+ list-style-type: lower-roman;
+}
+
+/* undo icons */
+.dokuwiki a:link,
+.dokuwiki a:visited {
+ text-decoration: underline;
+ color: #333;
+ background-color: inherit;
+ background-image: none;
+ padding: 0;
+}
+
+/* display href after link */
+a.urlextern:after,
+a.interwiki:after,
+a.mail:after {
+ content: " [" attr(href) "]";
+ font-size: 90%;
+}
+
+/* code blocks */
+.dokuwiki pre {
+ font-family: monospace;
+}
+.dokuwiki dl.code dt,
+.dokuwiki dl.file dt {
+ font-weight: bold;
+}
+
+/* images */
+.dokuwiki img {
+ border-width: 0;
+ vertical-align: middle;
+}
+.dokuwiki img.media {
+ margin: .2em 0;
+}
+.dokuwiki img.medialeft {
+ margin: .2em 1em .2em 0;
+ float: left;
+}
+.dokuwiki img.mediaright {
+ margin: .2em 0 .2em 1em;
+ float: right;
+}
+.dokuwiki img.mediacenter {
+ margin: .2em auto;
+ display: block;
+}
+
+/* align table cells */
+.dokuwiki .leftalign {
+ text-align: left;
+}
+.dokuwiki .centeralign {
+ text-align: center;
+}
+.dokuwiki .rightalign {
+ text-align: right;
+}
+
+/* underline */
+.dokuwiki em.u {
+ font-style: normal;
+ text-decoration: underline;
+}
+.dokuwiki em em.u {
+ font-style: italic;
+}
+
+div.clearer {
+ clear: both;
+ line-height: 0;
+ height: 0;
+ overflow: hidden;
+}
+
+.dokuwiki blockquote {
+ padding: 0 10pt;
+ margin: 0;
+ border: solid #ccc;
+ border-width: 0 0 0 2pt;
+}
+[dir=rtl] .dokuwiki blockquote {
+ border-width: 0 2pt 0 0;
+}
+
+/* tables */
+.dokuwiki table {
+ border-collapse: collapse;
+ empty-cells: show;
+ border-spacing: 0;
+ border: 1pt solid #ccc;
+}
+.dokuwiki th,
+.dokuwiki td {
+ padding: 3pt 5pt;
+ margin: 0;
+ vertical-align: top;
+ border: 1pt solid #666;
+ text-align: left;
+}
+[dir=rtl] .dokuwiki th,
+[dir=rtl] .dokuwiki td {
+ text-align: right;
+}
+.dokuwiki th {
+ font-weight: bold;
+}
+
+
+/*____________ a bit of layout ____________*/
+
+#dokuwiki__header {
+ border-bottom: 2pt solid #ccc;
+}
+#dokuwiki__header h1 {
+ font-size: 1.5em;
+}
+#dokuwiki__header h1 a {
+ text-decoration: none;
+}
+#dokuwiki__header h1 img {
+ float: left;
+ margin-right: .5em;
+}
+[dir=rtl] #dokuwiki__header h1 img {
+ float: right;
+ margin-right: 0;
+ margin-left: .5em;
+}
+.dokuwiki div.footnotes {
+ clear: both;
+ border-top: 1pt solid #000;
+ margin-top: 10pt;
+}
diff --git a/lib/tpl/dokuwiki/css/structure.css b/lib/tpl/dokuwiki/css/structure.css
new file mode 100644
index 000000000..00642e90b
--- /dev/null
+++ b/lib/tpl/dokuwiki/css/structure.css
@@ -0,0 +1,81 @@
+/**
+ * This file provides styles for the general layout structure.
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ */
+
+body {
+ margin: 0 auto;
+}
+#dokuwiki__site {
+ margin: 0 auto;
+ max-width: __site_width__;
+}
+#dokuwiki__site > .site {
+ padding: 0 .5em;
+}
+
+#dokuwiki__header {
+ width: 100%;
+}
+#dokuwiki__header > .pad {
+}
+ #dokuwiki__header .headings {
+ float: left;
+ }
+ [dir=rtl] #dokuwiki__header .headings {
+ float: right;
+ text-align: right;
+ }
+ #dokuwiki__header .tools {
+ float: right;
+ text-align: right;
+ }
+ [dir=rtl] #dokuwiki__header .tools {
+ float: left;
+ text-align: left;
+ }
+
+#dokuwiki__site .wrapper {
+ position: relative;
+}
+
+ #dokuwiki__aside {
+ width: __sidebar_width__;
+ float: left;
+ position: relative;
+ display: block;
+ }
+ [dir=rtl] #dokuwiki__aside {
+ float: right;
+ }
+ #dokuwiki__aside > .pad {
+ margin: 0 1.5em 0 0;
+ }
+ [dir=rtl] #dokuwiki__aside > .pad {
+ margin: 0 0 0 1.5em;
+ }
+
+ .showSidebar #dokuwiki__content {
+ float: right;
+ margin-left: -__sidebar_width__;
+ width: 100%;
+ }
+ [dir=rtl] .showSidebar #dokuwiki__content {
+ float: left;
+ margin-left: 0;
+ margin-right: -__sidebar_width__;
+ }
+ .showSidebar #dokuwiki__content > .pad {
+ margin-left: __sidebar_width__;
+ }
+ [dir=rtl] .showSidebar #dokuwiki__content > .pad {
+ margin-left: 0;
+ margin-right: __sidebar_width__;
+ }
+
+#dokuwiki__footer {
+ clear: both;
+}
+#dokuwiki__footer > .pad {
+}
diff --git a/lib/tpl/dokuwiki/detail.php b/lib/tpl/dokuwiki/detail.php
new file mode 100644
index 000000000..a8c5fef8a
--- /dev/null
+++ b/lib/tpl/dokuwiki/detail.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * DokuWiki Image Detail Page
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Anika Henke <anika@selfthinker.org>
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ */
+
+// must be run from within DokuWiki
+if (!defined('DOKU_INC')) die();
+
+?><!DOCTYPE html>
+<html lang="<?php echo $conf['lang']?>" dir="<?php echo $lang['direction'] ?>" class="no-js">
+<head>
+ <meta charset="utf-8" />
+ <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><![endif]-->
+ <title>
+ <?php echo hsc(tpl_img_getTag('IPTC.Headline',$IMG))?>
+ [<?php echo strip_tags($conf['title'])?>]
+ </title>
+ <script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script>
+ <?php tpl_metaheaders()?>
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+ <?php echo tpl_favicon(array('favicon', 'mobile')) ?>
+ <?php tpl_includeFile('meta.html') ?>
+</head>
+
+<body>
+ <!--[if lte IE 7 ]><div id="IE7"><![endif]--><!--[if IE 8 ]><div id="IE8"><![endif]-->
+ <div id="dokuwiki__site"><div id="dokuwiki__top"
+ class="dokuwiki site mode_<?php echo $ACT ?>">
+
+ <?php include('tpl_header.php') ?>
+
+ <div class="wrapper group" id="dokuwiki__detail">
+
+ <!-- ********** CONTENT ********** -->
+ <div id="dokuwiki__content"><div class="pad group">
+
+ <?php if(!$ERROR): ?>
+ <div class="pageId"><span><?php echo hsc(tpl_img_getTag('IPTC.Headline',$IMG)); ?></span></div>
+ <?php endif; ?>
+
+ <div class="page group">
+ <?php tpl_flush() ?>
+ <?php tpl_includeFile('pageheader.html') ?>
+ <!-- detail start -->
+ <?php
+ if($ERROR):
+ echo '<h1>'.$ERROR.'</h1>';
+ else: ?>
+
+ <h1><?php echo nl2br(hsc(tpl_img_getTag('simple.title'))); ?></h1>
+
+ <?php tpl_img(900,700); /* parameters: maximum width, maximum height (and more) */ ?>
+
+ <div class="img_detail">
+ <dl>
+ <?php
+ // @todo: logic should be transferred to backend
+ $config_files = getConfigFiles('mediameta');
+ foreach ($config_files as $config_file) {
+ if(@file_exists($config_file)) {
+ include($config_file);
+ }
+ }
+
+ foreach($fields as $key => $tag){
+ $t = array();
+ if (!empty($tag[0])) {
+ $t = array($tag[0]);
+ }
+ if(is_array($tag[3])) {
+ $t = array_merge($t,$tag[3]);
+ }
+ $value = tpl_img_getTag($t);
+ if ($value) {
+ echo '<dt>'.$lang[$tag[1]].':</dt><dd>';
+ if ($tag[2] == 'date') {
+ echo dformat($value);
+ } else {
+ echo hsc($value);
+ }
+ echo '</dd>';
+ }
+ }
+ ?>
+ </dl>
+ </div>
+ <?php //Comment in for Debug// dbg(tpl_img_getTag('Simple.Raw'));?>
+ <?php endif; ?>
+ </div>
+ <!-- detail stop -->
+ <?php tpl_includeFile('pagefooter.html') ?>
+ <?php tpl_flush() ?>
+
+ <?php /* doesn't make sense like this; @todo: maybe add tpl_imginfo()?
+ <div class="docInfo"><?php tpl_pageinfo(); ?></div>
+ */ ?>
+
+ </div></div><!-- /content -->
+
+ <hr class="a11y" />
+
+ <!-- PAGE ACTIONS -->
+ <?php if (!$ERROR): ?>
+ <div id="dokuwiki__pagetools">
+ <h3 class="a11y"><?php echo $lang['page_tools']; ?></h3>
+ <div class="tools">
+ <ul>
+ <?php // View in media manager; @todo: transfer logic to backend
+ $imgNS = getNS($IMG);
+ $authNS = auth_quickaclcheck("$imgNS:*");
+ if (($authNS >= AUTH_UPLOAD) && function_exists('media_managerURL')) {
+ $mmURL = media_managerURL(array('ns' => $imgNS, 'image' => $IMG));
+ echo '<li><a href="'.$mmURL.'" class="mediaManager"><span>'.$lang['img_manager'].'</span></a></li>';
+ }
+ ?>
+ <?php // Back to [ID]; @todo: transfer logic to backend
+ echo '<li><a href="'.wl($ID).'" class="back"><span>'.$lang['img_backto'].' '.$ID.'</span></a></li>';
+ ?>
+ </ul>
+ </div>
+ </div>
+ <?php endif; ?>
+ </div><!-- /wrapper -->
+
+ <?php include('tpl_footer.php') ?>
+ </div></div><!-- /site -->
+
+ <!--[if ( lte IE 7 | IE 8 ) ]></div><![endif]-->
+</body>
+</html>
diff --git a/lib/tpl/dokuwiki/images/apple-touch-icon.png b/lib/tpl/dokuwiki/images/apple-touch-icon.png
new file mode 100644
index 000000000..fb5f108c0
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/apple-touch-icon.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/bullet.png b/lib/tpl/dokuwiki/images/bullet.png
new file mode 100644
index 000000000..5e557b334
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/bullet.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/button-css.png b/lib/tpl/dokuwiki/images/button-css.png
new file mode 100644
index 000000000..706325e1c
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/button-css.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/button-donate.gif b/lib/tpl/dokuwiki/images/button-donate.gif
new file mode 100644
index 000000000..bba284e21
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/button-donate.gif
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/button-dw.png b/lib/tpl/dokuwiki/images/button-dw.png
new file mode 100644
index 000000000..8d6aea898
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/button-dw.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/button-php.gif b/lib/tpl/dokuwiki/images/button-php.gif
new file mode 100644
index 000000000..19aefb08f
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/button-php.gif
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/button-rss.png b/lib/tpl/dokuwiki/images/button-rss.png
new file mode 100644
index 000000000..b7cddadec
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/button-rss.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/button-xhtml.png b/lib/tpl/dokuwiki/images/button-xhtml.png
new file mode 100644
index 000000000..ec686442c
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/button-xhtml.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/closed-rtl.png b/lib/tpl/dokuwiki/images/closed-rtl.png
new file mode 100644
index 000000000..caa027e34
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/closed-rtl.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/closed.png b/lib/tpl/dokuwiki/images/closed.png
new file mode 100644
index 000000000..e3bd0f9e9
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/closed.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/email.png b/lib/tpl/dokuwiki/images/email.png
new file mode 100644
index 000000000..d1d4a5fd5
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/email.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/external-link.png b/lib/tpl/dokuwiki/images/external-link.png
new file mode 100644
index 000000000..a4d5de17c
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/external-link.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/favicon.ico b/lib/tpl/dokuwiki/images/favicon.ico
new file mode 100644
index 000000000..8b9616abb
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/favicon.ico
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/icons-license.txt b/lib/tpl/dokuwiki/images/icons-license.txt
new file mode 100644
index 000000000..7e12bbbd4
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/icons-license.txt
@@ -0,0 +1,5 @@
+Icons for: sitetools.png, email.png, external-link.png and unc.png
+Icon set: Dusseldorf
+Designer: pc.de
+License: Creative Commons Attribution License [http://creativecommons.org/licenses/by/3.0/]
+URL: http://pc.de/icons/#Dusseldorf
diff --git a/lib/tpl/dokuwiki/images/logo.png b/lib/tpl/dokuwiki/images/logo.png
new file mode 100644
index 000000000..35640279c
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/logo.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/open.png b/lib/tpl/dokuwiki/images/open.png
new file mode 100644
index 000000000..5f2d408c5
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/open.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/page-background.svg b/lib/tpl/dokuwiki/images/page-background.svg
new file mode 100644
index 000000000..086341ddf
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/page-background.svg
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
+ <linearGradient id="g" x1="0%" y1="0%" x2="0%" y2="100%">
+ <stop offset="0" stop-color="#dddddd" />
+ <stop offset="0.1" stop-color="#eeeeee" />
+ <stop offset="0.4" stop-color="#fbfaf9" />
+ </linearGradient>
+ <rect x="0" y="0" width="100%" height="100%" fill="url(#g)" />
+</svg> \ No newline at end of file
diff --git a/lib/tpl/dokuwiki/images/page-gradient.png b/lib/tpl/dokuwiki/images/page-gradient.png
new file mode 100644
index 000000000..8e16a2805
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/page-gradient.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools-build.php b/lib/tpl/dokuwiki/images/pagetools-build.php
new file mode 100644
index 000000000..1b7262ad5
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools-build.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * This script generates a sprite from the unprocessed pagetool icons by combining them
+ * and overlaying a color layer for the active state.
+ *
+ * This script requires a current libGD to be available.
+ *
+ * The color for the active state is read from the style.ini's __link__ replacement
+ *
+ * The final sprite is optimized with optipng if available.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @todo Maybe add some more error checking
+ */
+$GAMMA = 0.8;
+$OPTIPNG = '/usr/bin/optipng';
+
+// load input images
+$input = glob('pagetools/*.png');
+sort($input);
+$cnt = count($input);
+if(!$cnt){
+ die("No input images found. This script needs to be called from within the image directory!\n");
+}
+
+// create destination image
+$DST = imagecreatetruecolor(30,$cnt*45*2);
+imagesavealpha($DST, true);
+$C_trans = imagecolorallocatealpha($DST, 0, 0, 0, 127);
+imagefill($DST, 0, 0, $C_trans);
+
+// load highlight color from style.ini
+$ini = parse_ini_file('../style.ini',true);
+$COLOR = hex2rgb($ini['replacements']['__link__']);
+$C_active = imagecolorallocate($DST, $COLOR['r'],$COLOR['g'],$COLOR['b']);
+
+// add all the icons to the sprite image
+for($i=0; $i<$cnt; $i++){
+ $base = $i*90;
+
+ $IN = imagecreatefrompng($input[$i]);
+ imagesavealpha($IN, true);
+ imagecolorscale($IN,$GAMMA);
+ imagecopy($DST,$IN, 0,$base, 0,0, 30,30);
+ imagedestroy($IN);
+
+ $IN = imagecreatefrompng($input[$i]);
+ imagesavealpha($IN, true);
+ imagecolorscale($IN,$GAMMA);
+ imagecopy($DST,$IN, 0,$base+45, 0,0, 30,30);
+ imagedestroy($IN);
+
+ imagelayereffect($DST, IMG_EFFECT_OVERLAY);
+ imagefilledrectangle($DST, 0,$base+45, 30,$base+45+30, $C_active);
+ imagelayereffect($DST, IMG_EFFECT_NORMAL);
+}
+
+// output sprite
+imagepng($DST,'pagetools-sprite.png');
+imagedestroy($DST);
+
+// optimize if possible
+if(is_executable($OPTIPNG)){
+ system("$OPTIPNG -o5 'pagetools-sprite.png'");
+}
+
+/**
+ * Convert a hex color code to an rgb array
+ */
+function hex2rgb($hex) {
+ // strip hash
+ $hex = str_replace('#', '', $hex);
+
+ // normalize short codes
+ if(strlen($hex) == 3){
+ $hex = substr($hex,0,1).
+ substr($hex,0,1).
+ substr($hex,1,1).
+ substr($hex,1,1).
+ substr($hex,2,1).
+ substr($hex,2,1);
+ }
+
+ // calc rgb
+ return array(
+ 'r' => hexdec(substr($hex, 0, 2)),
+ 'g' => hexdec(substr($hex, 2, 2)),
+ 'b' => hexdec(substr($hex, 4, 2))
+ );
+}
+
+/**
+ * Scale (darken/lighten) a given image
+ *
+ * @param ressource $img The truetype GD image to work on
+ * @param float $scale Scale the colors by this value ( <1 darkens, >1 lightens)
+ */
+function imagecolorscale(&$img, $scale){
+ $w = imagesx($img);
+ $h = imagesy($img);
+
+ imagealphablending($img, false);
+ for($x = 0; $x < $w; $x++){
+ for($y = 0; $y < $h; $y++){
+ $rgba = imagecolorat($img, $x, $y);
+ $a = ($rgba >> 24) & 0xFF;
+ $r = ($rgba >> 16) & 0xFF;
+ $g = ($rgba >> 8) & 0xFF;
+ $b = $rgba & 0xFF;
+
+ $r = max(min(round($r*$scale),255),0);
+ $g = max(min(round($g*$scale),255),0);
+ $b = max(min(round($b*$scale),255),0);
+
+ $color = imagecolorallocatealpha($img, $r, $g, $b, $a);
+ imagesetpixel($img, $x, $y, $color);
+ }
+ }
+ imagealphablending($img, true);
+}
+
diff --git a/lib/tpl/dokuwiki/images/pagetools-sprite.png b/lib/tpl/dokuwiki/images/pagetools-sprite.png
new file mode 100644
index 000000000..898f0f4a6
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools-sprite.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/01_edit.png b/lib/tpl/dokuwiki/images/pagetools/01_edit.png
new file mode 100644
index 000000000..ad4a737d8
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/01_edit.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/02_create.png b/lib/tpl/dokuwiki/images/pagetools/02_create.png
new file mode 100644
index 000000000..e4fc5d3b1
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/02_create.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/03_draft.png b/lib/tpl/dokuwiki/images/pagetools/03_draft.png
new file mode 100644
index 000000000..a13d8c3b4
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/03_draft.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/04_show.png b/lib/tpl/dokuwiki/images/pagetools/04_show.png
new file mode 100644
index 000000000..6f64b1bd1
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/04_show.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/05_source.png b/lib/tpl/dokuwiki/images/pagetools/05_source.png
new file mode 100644
index 000000000..bcc4fa21f
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/05_source.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/06_revert.png b/lib/tpl/dokuwiki/images/pagetools/06_revert.png
new file mode 100644
index 000000000..7b8457e5e
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/06_revert.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/07_revisions.png b/lib/tpl/dokuwiki/images/pagetools/07_revisions.png
new file mode 100644
index 000000000..d918bce05
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/07_revisions.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/08_backlink.png b/lib/tpl/dokuwiki/images/pagetools/08_backlink.png
new file mode 100644
index 000000000..2c0823a72
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/08_backlink.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/09_subscribe.png b/lib/tpl/dokuwiki/images/pagetools/09_subscribe.png
new file mode 100644
index 000000000..30e039dbc
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/09_subscribe.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/10_top.png b/lib/tpl/dokuwiki/images/pagetools/10_top.png
new file mode 100644
index 000000000..e4bf1d49d
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/10_top.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/11_mediamanager.png b/lib/tpl/dokuwiki/images/pagetools/11_mediamanager.png
new file mode 100644
index 000000000..36116802f
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/11_mediamanager.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/12_back.png b/lib/tpl/dokuwiki/images/pagetools/12_back.png
new file mode 100644
index 000000000..d154651ec
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/12_back.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools/license.txt b/lib/tpl/dokuwiki/images/pagetools/license.txt
new file mode 100644
index 000000000..299624c62
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/pagetools/license.txt
@@ -0,0 +1,4 @@
+Icon set: iPhone toolbar icons
+Designer: TheWorkingGroup.ca
+License: Creative Commons Attribution-Share Alike License [http://creativecommons.org/licenses/by-sa/3.0/]
+URL: http://blog.twg.ca/2009/09/free-iphone-toolbar-icons/
diff --git a/lib/tpl/dokuwiki/images/search.png b/lib/tpl/dokuwiki/images/search.png
new file mode 100644
index 000000000..1ab7866fb
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/search.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/toc-arrows.png b/lib/tpl/dokuwiki/images/toc-arrows.png
new file mode 100644
index 000000000..4a353e4f6
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/toc-arrows.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/toc-bullet.png b/lib/tpl/dokuwiki/images/toc-bullet.png
new file mode 100644
index 000000000..fc771b97e
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/toc-bullet.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/unc.png b/lib/tpl/dokuwiki/images/unc.png
new file mode 100644
index 000000000..a552d6e6f
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/unc.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/usertools.png b/lib/tpl/dokuwiki/images/usertools.png
new file mode 100644
index 000000000..e99b6596e
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/usertools.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/main.php b/lib/tpl/dokuwiki/main.php
new file mode 100644
index 000000000..2406a206b
--- /dev/null
+++ b/lib/tpl/dokuwiki/main.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * DokuWiki Default Template 2012
+ *
+ * @link http://dokuwiki.org/template
+ * @author Anika Henke <anika@selfthinker.org>
+ * @author Clarence Lee <clarencedglee@gmail.com>
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ */
+
+if (!defined('DOKU_INC')) die(); /* must be run from within DokuWiki */
+
+$hasSidebar = page_findnearest($conf['sidebar']);
+$showSidebar = $hasSidebar && ($ACT=='show');
+?><!DOCTYPE html>
+<html lang="<?php echo $conf['lang'] ?>" dir="<?php echo $lang['direction'] ?>" class="no-js">
+<head>
+ <meta charset="utf-8" />
+ <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><![endif]-->
+ <title><?php tpl_pagetitle() ?> [<?php echo strip_tags($conf['title']) ?>]</title>
+ <script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script>
+ <?php tpl_metaheaders() ?>
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+ <?php echo tpl_favicon(array('favicon', 'mobile')) ?>
+ <?php tpl_includeFile('meta.html') ?>
+</head>
+
+<body>
+ <!--[if lte IE 7 ]><div id="IE7"><![endif]--><!--[if IE 8 ]><div id="IE8"><![endif]-->
+ <div id="dokuwiki__site"><div id="dokuwiki__top"
+ class="dokuwiki site mode_<?php echo $ACT ?> <?php echo ($showSidebar) ? 'showSidebar' : '';
+ ?> <?php echo ($hasSidebar) ? 'hasSidebar' : ''; ?>">
+
+ <?php include('tpl_header.php') ?>
+
+ <div class="wrapper group">
+
+ <?php if($showSidebar): ?>
+ <!-- ********** ASIDE ********** -->
+ <div id="dokuwiki__aside"><div class="pad include group">
+ <h3 class="toggle"><?php echo $lang['sidebar'] ?></h3>
+ <div class="content">
+ <?php tpl_flush() ?>
+ <?php tpl_includeFile('sidebarheader.html') ?>
+ <?php tpl_sidebar() ?>
+ <?php tpl_includeFile('sidebarfooter.html') ?>
+ </div>
+ </div></div><!-- /aside -->
+ <?php endif; ?>
+
+ <!-- ********** CONTENT ********** -->
+ <div id="dokuwiki__content"><div class="pad group">
+
+ <div class="pageId"><span><?php echo hsc($ID) ?></span></div>
+
+ <div class="page group">
+ <?php tpl_flush() ?>
+ <?php tpl_includeFile('pageheader.html') ?>
+ <!-- wikipage start -->
+ <?php tpl_content() ?>
+ <!-- wikipage stop -->
+ <?php tpl_includeFile('pagefooter.html') ?>
+ </div>
+
+ <div class="docInfo"><?php tpl_pageinfo() ?></div>
+
+ <?php tpl_flush() ?>
+ </div></div><!-- /content -->
+
+ <hr class="a11y" />
+
+ <!-- PAGE ACTIONS -->
+ <div id="dokuwiki__pagetools">
+ <h3 class="a11y"><?php echo $lang['page_tools']; ?></h3>
+ <div class="tools">
+ <ul>
+ <?php
+ tpl_action('edit', 1, 'li', 0, '<span>', '</span>');
+ tpl_action('revert', 1, 'li', 0, '<span>', '</span>');
+ tpl_action('revisions', 1, 'li', 0, '<span>', '</span>');
+ tpl_action('backlink', 1, 'li', 0, '<span>', '</span>');
+ tpl_action('subscribe', 1, 'li', 0, '<span>', '</span>');
+ tpl_action('top', 1, 'li', 0, '<span>', '</span>');
+ ?>
+ </ul>
+ </div>
+ </div>
+ </div><!-- /wrapper -->
+
+ <?php include('tpl_footer.php') ?>
+ </div></div><!-- /site -->
+
+ <div class="no"><?php tpl_indexerWebBug() /* provide DokuWiki housekeeping, required in all templates */ ?></div>
+ <!--[if ( lte IE 7 | IE 8 ) ]></div><![endif]-->
+</body>
+</html>
diff --git a/lib/tpl/dokuwiki/mediamanager.php b/lib/tpl/dokuwiki/mediamanager.php
new file mode 100644
index 000000000..23c9cee79
--- /dev/null
+++ b/lib/tpl/dokuwiki/mediamanager.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * DokuWiki Media Manager Popup
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ */
+// must be run from within DokuWiki
+if (!defined('DOKU_INC')) die();
+
+?><!DOCTYPE html>
+<html lang="<?php echo $conf['lang']?>" dir="<?php echo $lang['direction'] ?>" class="popup no-js">
+<head>
+ <meta charset="utf-8" />
+ <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><![endif]-->
+ <title>
+ <?php echo hsc($lang['mediaselect'])?>
+ [<?php echo strip_tags($conf['title'])?>]
+ </title>
+ <script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script>
+ <?php tpl_metaheaders()?>
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+ <?php echo tpl_favicon(array('favicon', 'mobile')) ?>
+ <?php tpl_includeFile('meta.html') ?>
+</head>
+
+<body>
+ <!--[if lte IE 7 ]><div id="IE7"><![endif]--><!--[if IE 8 ]><div id="IE8"><![endif]-->
+ <div id="media__manager" class="dokuwiki">
+ <?php html_msgarea() ?>
+ <div id="mediamgr__aside"><div class="pad">
+ <h1><?php echo hsc($lang['mediaselect'])?></h1>
+
+ <?php /* keep the id! additional elements are inserted via JS here */?>
+ <div id="media__opts"></div>
+
+ <?php tpl_mediaTree() ?>
+ </div></div>
+
+ <div id="mediamgr__content"><div class="pad">
+ <?php tpl_mediaContent() ?>
+ </div></div>
+ </div>
+ <!--[if ( lte IE 7 | IE 8 ) ]></div><![endif]-->
+</body>
+</html>
diff --git a/lib/tpl/dokuwiki/script.js b/lib/tpl/dokuwiki/script.js
new file mode 100644
index 000000000..d858bda89
--- /dev/null
+++ b/lib/tpl/dokuwiki/script.js
@@ -0,0 +1,75 @@
+/**
+ * We handle several device classes based on browser width.
+ * see http://twitter.github.com/bootstrap/scaffolding.html#responsive
+ *
+ * - desktop: 980+
+ * - mobile: < 980
+ * - tablet 481 - 979 (ostensibly for tablets in portrait mode)
+ * - phone <= 480
+ */
+var device_class = ''; // not yet known
+var device_classes = 'desktop mobile tablet phone';
+
+function tpl_dokuwiki_mobile(){
+
+ // determine our device pattern
+ // TODO: consider moving into dokuwiki core
+ var w = document.body.clientWidth;
+ if (w > 979) {
+ if (device_class == 'desktop') return;
+ device_class = 'desktop';
+ } else if (w > 480) {
+ if (device_class.match(/tablet/)) return;
+ device_class = 'mobile tablet';
+ } else {
+ if (device_class.match(/phone/)) return;
+ device_class = 'mobile phone';
+ }
+
+ jQuery('html').removeClass(device_classes).addClass(device_class);
+
+ // handle some layout changes based on change in device
+ var $handle = jQuery('#dokuwiki__aside h3.toggle');
+ var $toc = jQuery('#dw__toc h3');
+
+ if (device_class == 'desktop') {
+ // reset for desktop mode
+ if($handle.length) {
+ $handle[0].setState(1);
+ $handle.hide();
+ }
+ if($toc.length) {
+ $toc[0].setState(1);
+ }
+ }
+ if (device_class.match(/mobile/)){
+ // toc and sidebar hiding
+ if($handle.length) {
+ $handle.show();
+ $handle[0].setState(-1);
+ }
+ if($toc.length) {
+ $toc[0].setState(-1);
+ }
+ }
+}
+
+jQuery(function(){
+ var resizeTimer;
+ dw_page.makeToggle('#dokuwiki__aside h3.toggle','#dokuwiki__aside div.content');
+
+ tpl_dokuwiki_mobile();
+ jQuery(window).bind('resize',
+ function(){
+ if (resizeTimer) clearTimeout(resizeTimer);
+ resizeTimer = setTimeout(tpl_dokuwiki_mobile,200);
+ }
+ );
+
+ // increase sidebar length to match content (desktop mode only)
+ var $sidebar = jQuery('.desktop #dokuwiki__aside');
+ if($sidebar.length) {
+ var $content = jQuery('#dokuwiki__content div.page');
+ $content.css('min-height', $sidebar.height());
+ }
+});
diff --git a/lib/tpl/dokuwiki/style.ini b/lib/tpl/dokuwiki/style.ini
new file mode 100644
index 000000000..242b43080
--- /dev/null
+++ b/lib/tpl/dokuwiki/style.ini
@@ -0,0 +1,71 @@
+; Please see http://www.php.net/manual/en/function.parse-ini-file.php
+; for limitations of the ini format used here
+
+; Define the stylesheets your template uses here. The second value
+; defines for which output media the style should be loaded. Currently
+; print, screen and all are supported.
+
+[stylesheets]
+
+css/basic.css = screen
+css/_imgdetail.css = screen
+css/_media_popup.css = screen
+css/_media_fullscreen.css = screen
+css/_fileuploader.css = screen
+css/_tabs.css = screen
+css/_links.css = screen
+css/_toc.css = screen
+css/_footnotes.css = screen
+css/_search.css = screen
+css/_recent.css = screen
+css/_diff.css = screen
+css/_edit.css = screen
+css/_modal.css = screen
+css/_forms.css = screen
+css/_admin.css = screen
+css/structure.css = screen
+css/design.css = screen
+css/pagetools.css = screen
+css/content.css = screen
+css/includes.css = screen
+
+css/mobile.css = all
+css/print.css = print
+
+
+; This section is used to configure some placeholder values used in
+; the stylesheets. Changing this file is the simplest method to
+; give your wiki a new look.
+
+[replacements]
+
+;--------------------------------------------------------------------------
+;------ guaranteed dokuwiki color placeholders that every plugin can use
+
+; main text and background colors
+__text__ = "#333"
+__background__ = "#fff"
+; alternative text and background colors
+__text_alt__ = "#999"
+__background_alt__ = "#eee"
+; neutral text and background colors
+__text_neu__ = "#666"
+__background_neu__ = "#ddd"
+; border color
+__border__ = "#ccc"
+
+;--------------------------------------------------------------------------
+
+__background_site__ = "#fbfaf9"
+
+; these are used for links
+__link__ = "#2b73b7"
+__existing__ = "#080"
+__missing__ = "#d30"
+
+; highlighting search snippets
+__highlight__ = "#ff9"
+
+; site and sidebar widths
+__site_width__ = "75em"
+__sidebar_width__ = "16em"
diff --git a/lib/tpl/dokuwiki/template.info.txt b/lib/tpl/dokuwiki/template.info.txt
new file mode 100644
index 000000000..dfac2ef4e
--- /dev/null
+++ b/lib/tpl/dokuwiki/template.info.txt
@@ -0,0 +1,7 @@
+base dokuwiki
+author Anika Henke
+email anika@selfthinker.org
+date 2012-09-08
+name DokuWiki Template
+desc DokuWiki's default template since 2012
+url http://www.dokuwiki.org/template:dokuwiki
diff --git a/lib/tpl/dokuwiki/tpl_footer.php b/lib/tpl/dokuwiki/tpl_footer.php
new file mode 100644
index 000000000..3a2e3d121
--- /dev/null
+++ b/lib/tpl/dokuwiki/tpl_footer.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Template footer, included in the main and detail files
+ */
+
+// must be run from within DokuWiki
+if (!defined('DOKU_INC')) die();
+?>
+
+<!-- ********** FOOTER ********** -->
+<div id="dokuwiki__footer"><div class="pad">
+ <?php tpl_license(''); // license text ?>
+
+ <div class="buttons">
+ <?php
+ tpl_license('button', true, false, false); // license button, no wrapper
+ $target = ($conf['target']['extern']) ? 'target="'.$conf['target']['extern'].'"' : '';
+ ?>
+ <a href="http://www.dokuwiki.org/donate" title="Donate" <?php echo $target?>><img
+ src="<?php echo tpl_basedir(); ?>images/button-donate.gif" width="80" height="15" alt="Donate" /></a>
+ <a href="http://www.php.net" title="Powered by PHP" <?php echo $target?>><img
+ src="<?php echo tpl_basedir(); ?>images/button-php.gif" width="80" height="15" alt="Powered by PHP" /></a>
+ <a href="http://validator.w3.org/check/referer" title="Valid XHTML 1.0" <?php echo $target?>><img
+ src="<?php echo tpl_basedir(); ?>images/button-xhtml.png" width="80" height="15" alt="Valid XHTML 1.0" /></a>
+ <a href="http://jigsaw.w3.org/css-validator/check/referer?profile=css3" title="Valid CSS" <?php echo $target?>><img
+ src="<?php echo tpl_basedir(); ?>images/button-css.png" width="80" height="15" alt="Valid CSS" /></a>
+ <a href="http://dokuwiki.org/" title="Driven by DokuWiki" <?php echo $target?>><img
+ src="<?php echo tpl_basedir(); ?>images/button-dw.png" width="80" height="15" alt="Driven by DokuWiki" /></a>
+ </div>
+</div></div><!-- /footer -->
+
+<?php tpl_includeFile('footer.html') ?>
diff --git a/lib/tpl/dokuwiki/tpl_header.php b/lib/tpl/dokuwiki/tpl_header.php
new file mode 100644
index 000000000..0704aa271
--- /dev/null
+++ b/lib/tpl/dokuwiki/tpl_header.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Template header, included in the main and detail files
+ */
+
+// must be run from within DokuWiki
+if (!defined('DOKU_INC')) die();
+?>
+
+<!-- ********** HEADER ********** -->
+<div id="dokuwiki__header"><div class="pad group">
+
+ <?php tpl_includeFile('header.html') ?>
+
+ <div class="headings group">
+ <ul class="a11y skip">
+ <li><a href="#dokuwiki__content"><?php echo $lang['skip_to_content']; ?></a></li>
+ </ul>
+
+ <h1><?php
+ // get logo either out of the template images folder or data/media folder
+ $logoSize = array();
+ $logo = tpl_getMediaFile(array(':wiki:logo.png', 'images/logo.png'), false, $logoSize);
+
+ // display logo and wiki title in a link to the home page
+ tpl_link(
+ wl(),
+ '<img src="'.$logo.'" '.$logoSize[3].' alt="" /> <span>'.$conf['title'].'</span>',
+ 'accesskey="h" title="[H]"'
+ );
+ ?></h1>
+ <?php if ($conf['tagline']): ?>
+ <p class="claim"><?php echo $conf['tagline']; ?></p>
+ <?php endif ?>
+ </div>
+
+ <div class="tools group">
+ <!-- USER TOOLS -->
+ <?php if ($conf['useacl']): ?>
+ <div id="dokuwiki__usertools">
+ <h3 class="a11y"><?php echo $lang['user_tools']; ?></h3>
+ <ul>
+ <?php
+ if ($_SERVER['REMOTE_USER']) {
+ echo '<li class="user">';
+ tpl_userinfo(); /* 'Logged in as ...' */
+ echo '</li>';
+ }
+ tpl_action('admin', 1, 'li');
+ tpl_action('profile', 1, 'li');
+ tpl_action('register', 1, 'li');
+ tpl_action('login', 1, 'li');
+ ?>
+ </ul>
+ </div>
+ <?php endif ?>
+
+ <!-- SITE TOOLS -->
+ <div id="dokuwiki__sitetools">
+ <h3 class="a11y"><?php echo $lang['site_tools']; ?></h3>
+ <?php tpl_searchform(); ?>
+ <div class="mobileTools">
+ <?php tpl_actiondropdown($lang['tools']); ?>
+ </div>
+ <ul>
+ <?php
+ tpl_action('recent', 1, 'li');
+ tpl_action('media', 1, 'li');
+ tpl_action('index', 1, 'li');
+ ?>
+ </ul>
+ </div>
+
+ </div>
+
+ <!-- BREADCRUMBS -->
+ <?php if($conf['breadcrumbs'] || $conf['youarehere']): ?>
+ <div class="breadcrumbs">
+ <?php if($conf['youarehere']): ?>
+ <div class="youarehere"><?php tpl_youarehere() ?></div>
+ <?php endif ?>
+ <?php if($conf['breadcrumbs']): ?>
+ <div class="trace"><?php tpl_breadcrumbs() ?></div>
+ <?php endif ?>
+ </div>
+ <?php endif ?>
+
+ <?php html_msgarea() ?>
+
+ <hr class="a11y" />
+</div></div><!-- /header -->
diff --git a/lib/tpl/index.php b/lib/tpl/index.php
index 0273e5678..357cc1f0d 100644
--- a/lib/tpl/index.php
+++ b/lib/tpl/index.php
@@ -12,9 +12,8 @@ if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
if(!defined('NOSESSION')) define('NOSESSION',1);
require_once(DOKU_INC.'inc/init.php');
?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Template Replacements</title>
@@ -54,7 +53,7 @@ if ($ini) {
echo '<td>'.htmlspecialchars($val).'</td>';
echo '<td>';
if(preg_match('/^#[0-f]{3,6}$/i',$val)){
- echo '<div class="color" style="background-color:'.$val.';">&nbsp;</div>';
+ echo '<div class="color" style="background-color:'.$val.';">&#160;</div>';
}
echo '</td>';
echo '</tr>';