aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorGuy Brand <gb@unistra.fr>2020-06-01 12:54:55 +0200
committerGuy Brand <gb@unistra.fr>2020-06-01 12:54:55 +0200
commitdeeaa689327c15fc7e9395ba329a6f2513c654ec (patch)
treec783eea9ed5410eeece153e397a465046856f7d6
parent504b44a4c7fde212be653fc640f1685318449287 (diff)
parentbf713fe248da134f13395558651321459abc717e (diff)
downloaddokuwiki-deeaa689327c15fc7e9395ba329a6f2513c654ec.tar.gz
dokuwiki-deeaa689327c15fc7e9395ba329a6f2513c654ec.zip
Merge master into stable
-rw-r--r--.github/workflows/phpCS.yml22
-rw-r--r--.htaccess.dist4
-rw-r--r--.travis.yml34
-rw-r--r--README6
-rw-r--r--_cs/DokuWiki/Sniffs/Functions/OpeningFunctionBraceSniff.php81
-rw-r--r--_cs/DokuWiki/Sniffs/NamingConventions/ConstructorNameSniff.php85
-rw-r--r--_cs/DokuWiki/Sniffs/PHP/DeprecatedFunctionsSniff.php62
-rw-r--r--_cs/DokuWiki/Sniffs/PHP/DiscouragedFunctionsSniff.php54
-rw-r--r--_cs/DokuWiki/Sniffs/WhiteSpace/ScopeIndentSniff.php319
-rw-r--r--_cs/DokuWiki/ruleset.xml69
-rw-r--r--_cs/README18
-rw-r--r--_test/bootstrap.php18
-rw-r--r--_test/conf/local.php1
-rw-r--r--_test/conf/tpl/dokuwiki/css/_tests.less1
-rw-r--r--_test/conf/tpl/dokuwiki/style.ini7
-rw-r--r--_test/core/DokuWikiTest.php130
-rw-r--r--_test/core/TestRequest.php2
-rw-r--r--_test/core/phpQuery-onefile.php4
-rwxr-xr-x_test/fetchphpunit.php40
-rw-r--r--_test/mock/AuthCaseInsensitivePlugin.php12
-rw-r--r--_test/mock/AuthDeletePlugin.php28
-rw-r--r--_test/mock/AuthPlugin.php10
-rw-r--r--_test/mock/Doku_Renderer.php11
-rw-r--r--_test/mock/MailerMock.php16
-rw-r--r--_test/phpcs.xml80
-rw-r--r--_test/phpcs_MigrationAdjustments.xml103
-rw-r--r--_test/phpunit.xml7
-rw-r--r--_test/tests/general/general_html.test.php118
-rw-r--r--_test/tests/inc/Action/general.test.php4
-rw-r--r--_test/tests/inc/Extension/Event.test.php43
-rw-r--r--_test/tests/inc/PageUtilsIsHiddenPage.test.php8
-rw-r--r--_test/tests/inc/PassHash.test.php2
-rw-r--r--_test/tests/inc/PluginUtils.test.php23
-rw-r--r--_test/tests/inc/Subscriptions/BulkSubscriptionsSenderTest.php110
-rw-r--r--_test/tests/inc/Subscriptions/SubscriberManagerTest.php131
-rw-r--r--_test/tests/inc/Subscriptions/SubscriberRegexBuilderTest.php52
-rw-r--r--_test/tests/inc/Ui/Search_createPagenameFromQuery.test.php32
-rw-r--r--_test/tests/inc/XmlRpcServer.test.php69
-rw-r--r--_test/tests/inc/auth_aclcheck.test.php4
-rw-r--r--_test/tests/inc/auth_aclcheck_caseinsensitive.test.php8
-rw-r--r--_test/tests/inc/auth_admincheck.test.php106
-rw-r--r--_test/tests/inc/auth_deleteprofile.test.php37
-rw-r--r--_test/tests/inc/auth_password.test.php25
-rw-r--r--_test/tests/inc/cache_stalecheck.test.php4
-rw-r--r--_test/tests/inc/cache_use.test.php8
-rw-r--r--_test/tests/inc/changelog_getRevisionsAround.test.php5
-rw-r--r--_test/tests/inc/changelog_getlastrevisionat.test.php19
-rw-r--r--_test/tests/inc/changelog_getrelativerevision.test.php4
-rw-r--r--_test/tests/inc/changelog_getrevisioninfo.test.php4
-rw-r--r--_test/tests/inc/changelog_getrevisions.test.php5
-rw-r--r--_test/tests/inc/changelog_hasrevisions.test.php32
-rw-r--r--_test/tests/inc/common_basicinfo.test.php17
-rw-r--r--_test/tests/inc/common_clientip.test.php95
-rw-r--r--_test/tests/inc/common_dokupref.test.php86
-rw-r--r--_test/tests/inc/common_getGoogleQuery.test.php38
-rw-r--r--_test/tests/inc/common_ml.test.php2
-rw-r--r--_test/tests/inc/common_obfuscate.test.php15
-rw-r--r--_test/tests/inc/common_php_to_byte.test.php34
-rw-r--r--_test/tests/inc/common_saveWikiText.test.php4
-rw-r--r--_test/tests/inc/common_wl.test.php11
-rw-r--r--_test/tests/inc/events_nested.test.php6
-rw-r--r--_test/tests/inc/httpclient_http.test.php15
-rw-r--r--_test/tests/inc/httpclient_mock.php3
-rw-r--r--_test/tests/inc/indexer_indexing.test.php17
-rw-r--r--_test/tests/inc/indexer_rename.test.php2
-rw-r--r--_test/tests/inc/input.test.php4
-rw-r--r--_test/tests/inc/json.test.php418
-rwxr-xr-x[-rw-r--r--]_test/tests/inc/mailer.test.php40
-rw-r--r--_test/tests/inc/media_searchlist.test.php2
-rw-r--r--_test/tests/inc/pageutils_findnearest.test.php23
-rw-r--r--_test/tests/inc/pageutils_getid.test.php15
-rw-r--r--_test/tests/inc/pageutils_nons.test.php50
-rw-r--r--_test/tests/inc/pageutils_resolve_id.test.php16
-rw-r--r--_test/tests/inc/parser/lexer.test.php73
-rw-r--r--_test/tests/inc/parser/parser.inc.php8
-rw-r--r--_test/tests/inc/parser/parser_code.test.php5
-rw-r--r--_test/tests/inc/parser/parser_eol.test.php18
-rw-r--r--_test/tests/inc/parser/parser_file.test.php5
-rw-r--r--_test/tests/inc/parser/parser_footnote.test.php45
-rw-r--r--_test/tests/inc/parser/parser_headers.test.php36
-rw-r--r--_test/tests/inc/parser/parser_i18n.test.php19
-rw-r--r--_test/tests/inc/parser/parser_links.test.php111
-rw-r--r--_test/tests/inc/parser/parser_lists.test.php83
-rw-r--r--_test/tests/inc/parser/parser_media.test.php11
-rw-r--r--_test/tests/inc/parser/parser_preformatted.test.php40
-rw-r--r--_test/tests/inc/parser/parser_quote.test.php14
-rw-r--r--_test/tests/inc/parser/parser_quotes.test.php58
-rw-r--r--_test/tests/inc/parser/parser_replacements.test.php50
-rw-r--r--_test/tests/inc/parser/parser_table.test.php64
-rw-r--r--_test/tests/inc/parser/parser_unformatted.test.php7
-rw-r--r--_test/tests/inc/parser/renderer_metadata.test.php47
-rw-r--r--_test/tests/inc/parser/renderer_resolveinterwiki.test.php20
-rw-r--r--_test/tests/inc/parser/renderer_xhtml.test.php12
-rw-r--r--_test/tests/inc/remote.test.php106
-rw-r--r--_test/tests/inc/remoteapicore.test.php29
-rw-r--r--_test/tests/inc/remoteapicore_aclcheck.test.php6
-rw-r--r--_test/tests/inc/styleutils_cssstyleini.test.php38
-rw-r--r--_test/tests/inc/subscription.test.php246
-rw-r--r--_test/tests/inc/template_include_page.test.php3
-rw-r--r--_test/tests/inc/toolbar.test.php20
-rw-r--r--_test/tests/inc/utf8_basename.test.php4
-rw-r--r--_test/tests/inc/utf8_correctidx.test.php8
-rw-r--r--_test/tests/inc/utf8_html.test.php26
-rw-r--r--_test/tests/inc/utf8_romanize.test.php4
-rw-r--r--_test/tests/inc/utf8_stripspecials.test.php2
-rw-r--r--_test/tests/inc/utf8_strtolower.test.php4
-rw-r--r--_test/tests/inc/utf8_substr.test.php4
-rw-r--r--_test/tests/inc/utf8_unicode.test.php16
-rw-r--r--_test/tests/inc/utf8_utf16be.test.php4
-rw-r--r--_test/tests/lib/exe/css_css_compress.test.php15
-rw-r--r--appveyor.yml15
-rw-r--r--bin/.htaccess4
-rwxr-xr-xbin/dwpage.php2
-rwxr-xr-xbin/gittool.php16
-rwxr-xr-xbin/indexer.php8
-rwxr-xr-xbin/plugin.php8
-rwxr-xr-xbin/wantedpages.php14
-rw-r--r--composer.json3
-rw-r--r--composer.lock127
-rw-r--r--conf/.htaccess4
-rw-r--r--conf/acronyms.conf1
-rw-r--r--conf/dokuwiki.php24
-rw-r--r--conf/interwiki.conf1
-rw-r--r--conf/license.php16
-rw-r--r--data/.htaccess4
-rw-r--r--data/deleted.files129
-rw-r--r--data/pages/wiki/dokuwiki.txt14
-rw-r--r--data/pages/wiki/syntax.txt6
-rw-r--r--data/pages/wiki/welcome.txt2
-rw-r--r--doku.php10
-rw-r--r--feed.php27
-rw-r--r--inc/.htaccess4
-rw-r--r--inc/Action/Admin.php17
-rw-r--r--inc/Action/Draftdel.php12
-rw-r--r--inc/Action/Exception/FatalException.php3
-rw-r--r--inc/Action/Export.php3
-rw-r--r--inc/Action/Locked.php1
-rw-r--r--inc/Action/Logout.php4
-rw-r--r--inc/Action/Plugin.php2
-rw-r--r--inc/Action/Preview.php30
-rw-r--r--inc/Action/Profile.php2
-rw-r--r--inc/Action/ProfileDelete.php2
-rw-r--r--inc/Action/Redirect.php5
-rw-r--r--inc/Action/Register.php2
-rw-r--r--inc/Action/Resendpwd.php8
-rw-r--r--inc/Action/Revert.php7
-rw-r--r--inc/Action/Search.php4
-rw-r--r--inc/Action/Sitemap.php12
-rw-r--r--inc/Action/Subscribe.php28
-rw-r--r--inc/ActionRouter.php2
-rw-r--r--inc/Ajax.php78
-rw-r--r--inc/Cache/Cache.php240
-rw-r--r--inc/Cache/CacheInstructions.php46
-rw-r--r--inc/Cache/CacheParser.php64
-rw-r--r--inc/Cache/CacheRenderer.php94
-rw-r--r--inc/ChangeLog/ChangeLog.php666
-rw-r--r--inc/ChangeLog/MediaChangeLog.php30
-rw-r--r--inc/ChangeLog/PageChangeLog.php30
-rw-r--r--inc/Debug/DebugHelper.php167
-rw-r--r--inc/Debug/PropertyDeprecationHelper.php134
-rw-r--r--inc/Draft.php165
-rw-r--r--inc/Extension/ActionPlugin.php22
-rw-r--r--inc/Extension/AdminPlugin.php123
-rw-r--r--inc/Extension/AuthPlugin.php461
-rw-r--r--inc/Extension/CLIPlugin.php13
-rw-r--r--inc/Extension/Event.php197
-rw-r--r--inc/Extension/EventHandler.php108
-rw-r--r--inc/Extension/Plugin.php13
-rw-r--r--inc/Extension/PluginController.php393
-rw-r--r--inc/Extension/PluginInterface.php (renamed from inc/PluginInterface.php)10
-rw-r--r--inc/Extension/PluginTrait.php (renamed from inc/PluginTrait.php)134
-rw-r--r--inc/Extension/RemotePlugin.php122
-rw-r--r--inc/Extension/SyntaxPlugin.php132
-rw-r--r--inc/FeedParser.php65
-rw-r--r--inc/FeedParserFile.php62
-rw-r--r--inc/Form/ButtonElement.php2
-rw-r--r--inc/Form/DropdownElement.php12
-rw-r--r--inc/Form/Form.php12
-rw-r--r--inc/Form/LegacyForm.php2
-rw-r--r--inc/Form/OptGroup.php12
-rw-r--r--inc/HTTP/DokuHTTPClient.php77
-rw-r--r--inc/HTTP/HTTPClient.php (renamed from inc/HTTPClient.php)326
-rw-r--r--inc/HTTP/HTTPClientException.php10
-rw-r--r--inc/IXR_Library.php5
-rw-r--r--inc/Input.class.php335
-rw-r--r--inc/Input/Get.php29
-rw-r--r--inc/Input/Input.php287
-rw-r--r--inc/Input/Post.php30
-rw-r--r--inc/Input/Server.php19
-rw-r--r--inc/JSON.php656
-rw-r--r--inc/JpegMeta.php88
-rw-r--r--inc/Mailer.class.php111
-rw-r--r--inc/Manifest.php10
-rw-r--r--inc/Menu/AbstractMenu.php3
-rw-r--r--inc/Menu/Item/AbstractItem.php2
-rw-r--r--inc/Menu/Item/Admin.php12
-rw-r--r--inc/Menu/Item/Edit.php2
-rw-r--r--inc/Menu/Item/Revert.php2
-rw-r--r--inc/Menu/MobileMenu.php16
-rw-r--r--inc/Parsing/Handler/Block.php211
-rw-r--r--inc/Parsing/Handler/CallWriter.php40
-rw-r--r--inc/Parsing/Handler/CallWriterInterface.php30
-rw-r--r--inc/Parsing/Handler/Lists.php213
-rw-r--r--inc/Parsing/Handler/Nest.php83
-rw-r--r--inc/Parsing/Handler/Preformatted.php76
-rw-r--r--inc/Parsing/Handler/Quote.php110
-rw-r--r--inc/Parsing/Handler/ReWriterInterface.php29
-rw-r--r--inc/Parsing/Handler/Table.php345
-rw-r--r--inc/Parsing/Lexer/Lexer.php357
-rw-r--r--inc/Parsing/Lexer/ParallelRegex.php203
-rw-r--r--inc/Parsing/Lexer/StateStack.php60
-rw-r--r--inc/Parsing/Parser.php128
-rw-r--r--inc/Parsing/ParserMode/AbstractMode.php40
-rw-r--r--inc/Parsing/ParserMode/Acronym.php68
-rw-r--r--inc/Parsing/ParserMode/Base.php31
-rw-r--r--inc/Parsing/ParserMode/Camelcaselink.php23
-rw-r--r--inc/Parsing/ParserMode/Code.php25
-rw-r--r--inc/Parsing/ParserMode/Emaillink.php20
-rw-r--r--inc/Parsing/ParserMode/Entity.php50
-rw-r--r--inc/Parsing/ParserMode/Eol.php25
-rw-r--r--inc/Parsing/ParserMode/Externallink.php44
-rw-r--r--inc/Parsing/ParserMode/File.php25
-rw-r--r--inc/Parsing/ParserMode/Filelink.php39
-rw-r--r--inc/Parsing/ParserMode/Footnote.php50
-rw-r--r--inc/Parsing/ParserMode/Formatting.php115
-rw-r--r--inc/Parsing/ParserMode/Header.php24
-rw-r--r--inc/Parsing/ParserMode/Hr.php19
-rw-r--r--inc/Parsing/ParserMode/Html.php27
-rw-r--r--inc/Parsing/ParserMode/Internallink.php20
-rw-r--r--inc/Parsing/ParserMode/Linebreak.php19
-rw-r--r--inc/Parsing/ParserMode/Listblock.php44
-rw-r--r--inc/Parsing/ParserMode/Media.php20
-rw-r--r--inc/Parsing/ParserMode/ModeInterface.php46
-rw-r--r--inc/Parsing/ParserMode/Multiplyentity.php27
-rw-r--r--inc/Parsing/ParserMode/Nocache.php19
-rw-r--r--inc/Parsing/ParserMode/Notoc.php19
-rw-r--r--inc/Parsing/ParserMode/Php.php27
-rw-r--r--inc/Parsing/ParserMode/Plugin.php8
-rw-r--r--inc/Parsing/ParserMode/Preformatted.php31
-rw-r--r--inc/Parsing/ParserMode/Quote.php41
-rw-r--r--inc/Parsing/ParserMode/Quotes.php51
-rw-r--r--inc/Parsing/ParserMode/Rss.php19
-rw-r--r--inc/Parsing/ParserMode/Smiley.php48
-rw-r--r--inc/Parsing/ParserMode/Table.php47
-rw-r--r--inc/Parsing/ParserMode/Unformatted.php28
-rw-r--r--inc/Parsing/ParserMode/Windowssharelink.php31
-rw-r--r--inc/Parsing/ParserMode/Wordblock.php52
-rw-r--r--inc/PassHash.php (renamed from inc/PassHash.class.php)231
-rw-r--r--inc/Plugin.php11
-rw-r--r--inc/Remote/AccessDeniedException.php10
-rw-r--r--inc/Remote/Api.php (renamed from inc/remote.php)155
-rw-r--r--inc/Remote/ApiCore.php (renamed from inc/RemoteAPICore.php)415
-rw-r--r--inc/Remote/RemoteException.php10
-rw-r--r--inc/Remote/XmlRpcServer.php61
-rw-r--r--inc/SafeFN.class.php12
-rw-r--r--inc/Search/Indexer.php1214
-rw-r--r--inc/Sitemap/Item.php66
-rw-r--r--inc/Sitemap/Mapper.php (renamed from inc/Sitemapper.php)76
-rw-r--r--inc/StyleUtils.php220
-rw-r--r--inc/Subscriptions/BulkSubscriptionSender.php261
-rw-r--r--inc/Subscriptions/MediaSubscriptionSender.php47
-rw-r--r--inc/Subscriptions/PageSubscriptionSender.php88
-rw-r--r--inc/Subscriptions/RegistrationSubscriptionSender.php40
-rw-r--r--inc/Subscriptions/SubscriberManager.php290
-rw-r--r--inc/Subscriptions/SubscriberRegexBuilder.php70
-rw-r--r--inc/Subscriptions/SubscriptionSender.php86
-rw-r--r--inc/TaskRunner.php240
-rw-r--r--inc/Ui/Admin.php112
-rw-r--r--inc/Ui/Search.php17
-rw-r--r--inc/Utf8/Asian.php99
-rw-r--r--inc/Utf8/Clean.php204
-rw-r--r--inc/Utf8/Conversion.php162
-rw-r--r--inc/Utf8/PhpString.php383
-rw-r--r--inc/Utf8/Table.php93
-rw-r--r--inc/Utf8/Unicode.php277
-rw-r--r--inc/Utf8/tables/case.php567
-rw-r--r--inc/Utf8/tables/loweraccents.php116
-rw-r--r--inc/Utf8/tables/romanization.php1458
-rw-r--r--inc/Utf8/tables/specials.php620
-rw-r--r--inc/Utf8/tables/upperaccents.php114
-rw-r--r--inc/actions.php4
-rw-r--r--inc/auth.php137
-rw-r--r--inc/cache.php346
-rw-r--r--inc/changelog.php734
-rw-r--r--inc/cli.php5
-rw-r--r--inc/common.php287
-rw-r--r--inc/compatibility.php3
-rw-r--r--inc/config_cascade.php4
-rw-r--r--inc/confutils.php19
-rw-r--r--inc/deprecated.php570
-rw-r--r--inc/events.php257
-rw-r--r--inc/farm.php2
-rw-r--r--inc/fetch.functions.php18
-rw-r--r--inc/form.php37
-rw-r--r--inc/fulltext.php80
-rw-r--r--inc/html.php219
-rw-r--r--inc/indexer.php1264
-rw-r--r--inc/infoutils.php100
-rw-r--r--inc/init.php64
-rw-r--r--inc/io.php72
-rw-r--r--inc/lang/.htaccess8
-rw-r--r--inc/lang/ar/admin.txt2
-rw-r--r--inc/lang/ar/backlinks.txt2
-rw-r--r--inc/lang/ar/conflict.txt2
-rw-r--r--inc/lang/ar/denied.txt2
-rw-r--r--inc/lang/ar/diff.txt2
-rw-r--r--inc/lang/ar/edit.txt2
-rw-r--r--inc/lang/ar/editrev.txt2
-rw-r--r--inc/lang/ar/index.txt2
-rw-r--r--inc/lang/ar/install.html11
-rw-r--r--inc/lang/ar/lang.php93
-rw-r--r--inc/lang/ar/locked.txt2
-rw-r--r--inc/lang/ar/pwconfirm.txt3
-rw-r--r--inc/lang/ar/read.txt2
-rw-r--r--inc/lang/ar/recent.txt2
-rw-r--r--inc/lang/ar/resendpwd.txt2
-rw-r--r--inc/lang/ar/revisions.txt3
-rw-r--r--inc/lang/ar/searchpage.txt1
-rw-r--r--inc/lang/ar/showrev.txt2
-rw-r--r--inc/lang/ar/updateprofile.txt2
-rw-r--r--inc/lang/az/admin.txt1
-rw-r--r--inc/lang/az/backlinks.txt1
-rw-r--r--inc/lang/az/diff.txt1
-rw-r--r--inc/lang/az/index.txt1
-rw-r--r--inc/lang/az/login.txt1
-rw-r--r--inc/lang/az/newpage.txt2
-rw-r--r--inc/lang/az/norev.txt1
-rw-r--r--inc/lang/az/preview.txt3
-rw-r--r--inc/lang/az/read.txt1
-rw-r--r--inc/lang/az/recent.txt4
-rw-r--r--inc/lang/az/searchpage.txt1
-rw-r--r--inc/lang/az/stopwords.txt1
-rw-r--r--inc/lang/az/updateprofile.txt2
-rw-r--r--inc/lang/az/wordblock.txt3
-rw-r--r--inc/lang/be/admin.txt2
-rw-r--r--inc/lang/be/backlinks.txt3
-rw-r--r--inc/lang/be/conflict.txt5
-rw-r--r--inc/lang/be/denied.txt3
-rw-r--r--inc/lang/be/diff.txt3
-rw-r--r--inc/lang/be/draft.txt5
-rw-r--r--inc/lang/be/edit.txt1
-rw-r--r--inc/lang/be/editrev.txt2
-rw-r--r--inc/lang/be/index.txt3
-rw-r--r--inc/lang/be/install.html7
-rw-r--r--inc/lang/be/jquery.ui.datepicker.js37
-rw-r--r--inc/lang/be/lang.php357
-rw-r--r--inc/lang/be/locked.txt3
-rw-r--r--inc/lang/be/login.txt3
-rw-r--r--inc/lang/be/mailtext.txt12
-rw-r--r--inc/lang/be/newpage.txt3
-rw-r--r--inc/lang/be/norev.txt3
-rw-r--r--inc/lang/be/password.txt6
-rw-r--r--inc/lang/be/preview.txt3
-rw-r--r--inc/lang/be/pwconfirm.txt9
-rw-r--r--inc/lang/be/read.txt1
-rw-r--r--inc/lang/be/recent.txt3
-rw-r--r--inc/lang/be/register.txt3
-rw-r--r--inc/lang/be/registermail.txt10
-rw-r--r--inc/lang/be/resendpwd.txt3
-rw-r--r--inc/lang/be/resetpwd.txt3
-rw-r--r--inc/lang/be/revisions.txt3
-rw-r--r--inc/lang/be/searchpage.txt3
-rw-r--r--inc/lang/be/showrev.txt2
-rw-r--r--inc/lang/be/stopwords.txt80
-rw-r--r--inc/lang/be/subscr_digest.txt12
-rw-r--r--inc/lang/be/subscr_form.txt3
-rw-r--r--inc/lang/be/subscr_list.txt9
-rw-r--r--inc/lang/be/subscr_single.txt16
-rw-r--r--inc/lang/be/updateprofile.txt3
-rw-r--r--inc/lang/be/uploadmail.txt11
-rw-r--r--inc/lang/bg/admin.txt2
-rw-r--r--inc/lang/bg/conflict.txt1
-rw-r--r--inc/lang/bg/denied.txt1
-rw-r--r--inc/lang/bg/draft.txt1
-rw-r--r--inc/lang/bg/edit.txt1
-rw-r--r--inc/lang/bg/index.txt1
-rw-r--r--inc/lang/bg/install.html16
-rw-r--r--inc/lang/bg/lang.php86
-rw-r--r--inc/lang/bg/newpage.txt3
-rw-r--r--inc/lang/bg/norev.txt1
-rw-r--r--inc/lang/bg/preview.txt2
-rw-r--r--inc/lang/bg/pwconfirm.txt3
-rw-r--r--inc/lang/bg/read.txt1
-rw-r--r--inc/lang/bg/recent.txt3
-rw-r--r--inc/lang/bg/register.txt1
-rw-r--r--inc/lang/bg/resetpwd.txt1
-rw-r--r--inc/lang/bg/revisions.txt1
-rw-r--r--inc/lang/bg/searchpage.txt1
-rw-r--r--inc/lang/bn/admin.txt2
-rw-r--r--inc/lang/bn/backlinks.txt2
-rw-r--r--inc/lang/bn/conflict.txt2
-rw-r--r--inc/lang/bn/denied.txt2
-rw-r--r--inc/lang/bn/diff.txt2
-rw-r--r--inc/lang/bn/draft.txt2
-rw-r--r--inc/lang/bn/edit.txt2
-rw-r--r--inc/lang/bn/editrev.txt4
-rw-r--r--inc/lang/bn/index.txt2
-rw-r--r--inc/lang/ca-valencia/admin.txt1
-rw-r--r--inc/lang/ca-valencia/conflict.txt1
-rw-r--r--inc/lang/ca-valencia/denied.txt1
-rw-r--r--inc/lang/ca-valencia/diff.txt1
-rw-r--r--inc/lang/ca-valencia/draft.txt1
-rw-r--r--inc/lang/ca-valencia/edit.txt1
-rw-r--r--inc/lang/ca-valencia/index.txt3
-rw-r--r--inc/lang/ca-valencia/install.html3
-rw-r--r--inc/lang/ca-valencia/login.txt1
-rw-r--r--inc/lang/ca-valencia/newpage.txt2
-rw-r--r--inc/lang/ca-valencia/norev.txt2
-rw-r--r--inc/lang/ca-valencia/preview.txt3
-rw-r--r--inc/lang/ca-valencia/pwconfirm.txt6
-rw-r--r--inc/lang/ca-valencia/read.txt1
-rw-r--r--inc/lang/ca-valencia/recent.txt4
-rw-r--r--inc/lang/ca-valencia/register.txt1
-rw-r--r--inc/lang/ca-valencia/resendpwd.txt1
-rw-r--r--inc/lang/ca-valencia/revisions.txt1
-rw-r--r--inc/lang/ca-valencia/searchpage.txt1
-rw-r--r--inc/lang/ca-valencia/stopwords.txt1
-rw-r--r--inc/lang/ca-valencia/updateprofile.txt2
-rw-r--r--inc/lang/ca/admin.txt1
-rw-r--r--inc/lang/ca/backlinks.txt1
-rw-r--r--inc/lang/ca/conflict.txt1
-rw-r--r--inc/lang/ca/denied.txt1
-rw-r--r--inc/lang/ca/diff.txt1
-rw-r--r--inc/lang/ca/draft.txt2
-rw-r--r--inc/lang/ca/edit.txt1
-rw-r--r--inc/lang/ca/index.txt3
-rw-r--r--inc/lang/ca/install.html3
-rw-r--r--inc/lang/ca/lang.php125
-rw-r--r--inc/lang/ca/login.txt1
-rw-r--r--inc/lang/ca/newpage.txt2
-rw-r--r--inc/lang/ca/norev.txt2
-rw-r--r--inc/lang/ca/preview.txt3
-rw-r--r--inc/lang/ca/pwconfirm.txt8
-rw-r--r--inc/lang/ca/read.txt1
-rw-r--r--inc/lang/ca/recent.txt4
-rw-r--r--inc/lang/ca/register.txt1
-rw-r--r--inc/lang/ca/resendpwd.txt2
-rw-r--r--inc/lang/ca/resetpwd.txt2
-rw-r--r--inc/lang/ca/revisions.txt1
-rw-r--r--inc/lang/ca/searchpage.txt1
-rw-r--r--inc/lang/ca/stopwords.txt1
-rw-r--r--inc/lang/ca/updateprofile.txt2
-rw-r--r--inc/lang/cs/diff.txt1
-rw-r--r--inc/lang/cs/index.txt2
-rw-r--r--inc/lang/cs/install.html24
-rw-r--r--inc/lang/cs/lang.php10
-rw-r--r--inc/lang/cs/newpage.txt2
-rw-r--r--inc/lang/cs/onceexisted.txt3
-rw-r--r--inc/lang/cs/preview.txt2
-rw-r--r--inc/lang/cs/recent.txt2
-rw-r--r--inc/lang/cs/resetpwd.txt2
-rw-r--r--inc/lang/cs/searchpage.txt1
-rw-r--r--inc/lang/cs/stopwords.txt1
-rw-r--r--inc/lang/cs/updateprofile.txt2
-rw-r--r--inc/lang/cy/admin.txt1
-rw-r--r--inc/lang/cy/backlinks.txt1
-rw-r--r--inc/lang/cy/conflict.txt1
-rw-r--r--inc/lang/cy/denied.txt1
-rw-r--r--inc/lang/cy/diff.txt1
-rw-r--r--inc/lang/cy/draft.txt3
-rw-r--r--inc/lang/cy/edit.txt1
-rw-r--r--inc/lang/cy/index.txt1
-rw-r--r--inc/lang/cy/install.html25
-rw-r--r--inc/lang/cy/login.txt1
-rw-r--r--inc/lang/cy/mailwrap.html6
-rw-r--r--inc/lang/cy/newpage.txt3
-rw-r--r--inc/lang/cy/norev.txt1
-rw-r--r--inc/lang/cy/preview.txt3
-rw-r--r--inc/lang/cy/pwconfirm.txt8
-rw-r--r--inc/lang/cy/read.txt1
-rw-r--r--inc/lang/cy/recent.txt4
-rw-r--r--inc/lang/cy/register.txt1
-rw-r--r--inc/lang/cy/resendpwd.txt1
-rw-r--r--inc/lang/cy/resetpwd.txt1
-rw-r--r--inc/lang/cy/revisions.txt1
-rw-r--r--inc/lang/cy/searchpage.txt1
-rw-r--r--inc/lang/cy/stopwords.txt2
-rw-r--r--inc/lang/cy/updateprofile.txt2
-rw-r--r--inc/lang/da/admin.txt1
-rw-r--r--inc/lang/da/backlinks.txt1
-rw-r--r--inc/lang/da/diff.txt1
-rw-r--r--inc/lang/da/draft.txt1
-rw-r--r--inc/lang/da/edit.txt1
-rw-r--r--inc/lang/da/editrev.txt2
-rw-r--r--inc/lang/da/index.txt2
-rw-r--r--inc/lang/da/install.html25
-rw-r--r--inc/lang/da/lang.php109
-rw-r--r--inc/lang/da/newpage.txt2
-rw-r--r--inc/lang/da/norev.txt5
-rw-r--r--inc/lang/da/onceexisted.txt3
-rw-r--r--inc/lang/da/password.txt6
-rw-r--r--inc/lang/da/preview.txt1
-rw-r--r--inc/lang/da/pwconfirm.txt5
-rw-r--r--inc/lang/da/read.txt1
-rw-r--r--inc/lang/da/recent.txt4
-rw-r--r--inc/lang/da/register.txt3
-rw-r--r--inc/lang/da/registermail.txt2
-rw-r--r--inc/lang/da/resendpwd.txt4
-rw-r--r--inc/lang/da/resetpwd.txt2
-rw-r--r--inc/lang/da/revisions.txt4
-rw-r--r--inc/lang/da/searchpage.txt1
-rw-r--r--inc/lang/da/showrev.txt2
-rw-r--r--inc/lang/da/stopwords.txt2
-rw-r--r--inc/lang/da/subscr_digest.txt10
-rw-r--r--inc/lang/da/subscr_single.txt10
-rw-r--r--inc/lang/da/updateprofile.txt2
-rw-r--r--inc/lang/da/uploadmail.txt3
-rw-r--r--inc/lang/de-informal/admin.txt1
-rw-r--r--inc/lang/de-informal/backlinks.txt2
-rw-r--r--inc/lang/de-informal/conflict.txt1
-rw-r--r--inc/lang/de-informal/denied.txt1
-rw-r--r--inc/lang/de-informal/diff.txt2
-rw-r--r--inc/lang/de-informal/draft.txt1
-rw-r--r--inc/lang/de-informal/edit.txt5
-rw-r--r--inc/lang/de-informal/editrev.txt2
-rw-r--r--inc/lang/de-informal/index.txt1
-rw-r--r--inc/lang/de-informal/install.html28
-rw-r--r--inc/lang/de-informal/lang.php91
-rw-r--r--inc/lang/de-informal/locked.txt1
-rw-r--r--inc/lang/de-informal/login.txt1
-rw-r--r--inc/lang/de-informal/newpage.txt4
-rw-r--r--inc/lang/de-informal/norev.txt1
-rw-r--r--inc/lang/de-informal/preview.txt4
-rw-r--r--inc/lang/de-informal/pwconfirm.txt9
-rw-r--r--inc/lang/de-informal/read.txt1
-rw-r--r--inc/lang/de-informal/recent.txt4
-rw-r--r--inc/lang/de-informal/register.txt1
-rw-r--r--inc/lang/de-informal/resetpwd.txt1
-rw-r--r--inc/lang/de-informal/revisions.txt1
-rw-r--r--inc/lang/de-informal/searchpage.txt1
-rw-r--r--inc/lang/de-informal/stopwords.txt1
-rw-r--r--inc/lang/de-informal/updateprofile.txt2
-rw-r--r--inc/lang/de/admin.txt1
-rw-r--r--inc/lang/de/backlinks.txt4
-rw-r--r--inc/lang/de/conflict.txt3
-rw-r--r--inc/lang/de/denied.txt1
-rw-r--r--inc/lang/de/diff.txt2
-rw-r--r--inc/lang/de/draft.txt1
-rw-r--r--inc/lang/de/edit.txt5
-rw-r--r--inc/lang/de/editrev.txt2
-rw-r--r--inc/lang/de/index.txt3
-rw-r--r--inc/lang/de/install.html28
-rw-r--r--inc/lang/de/lang.php32
-rw-r--r--inc/lang/de/locked.txt1
-rw-r--r--inc/lang/de/login.txt1
-rw-r--r--inc/lang/de/newpage.txt4
-rw-r--r--inc/lang/de/norev.txt1
-rw-r--r--inc/lang/de/onceexisted.txt3
-rw-r--r--inc/lang/de/preview.txt2
-rw-r--r--inc/lang/de/pwconfirm.txt9
-rw-r--r--inc/lang/de/read.txt1
-rw-r--r--inc/lang/de/recent.txt4
-rw-r--r--inc/lang/de/register.txt3
-rw-r--r--inc/lang/de/resetpwd.txt1
-rw-r--r--inc/lang/de/revisions.txt1
-rw-r--r--inc/lang/de/stopwords.txt1
-rw-r--r--inc/lang/de/updateprofile.txt2
-rw-r--r--inc/lang/el/backlinks.txt2
-rw-r--r--inc/lang/el/conflict.txt7
-rw-r--r--inc/lang/el/denied.txt1
-rw-r--r--inc/lang/el/draft.txt6
-rw-r--r--inc/lang/el/edit.txt4
-rw-r--r--inc/lang/el/editrev.txt2
-rw-r--r--inc/lang/el/index.txt2
-rw-r--r--inc/lang/el/install.html27
-rw-r--r--inc/lang/el/lang.php107
-rw-r--r--inc/lang/el/locked.txt1
-rw-r--r--inc/lang/el/login.txt4
-rw-r--r--inc/lang/el/newpage.txt3
-rw-r--r--inc/lang/el/norev.txt4
-rw-r--r--inc/lang/el/onceexisted.txt2
-rw-r--r--inc/lang/el/preview.txt4
-rw-r--r--inc/lang/el/pwconfirm.txt3
-rw-r--r--inc/lang/el/register.txt4
-rw-r--r--inc/lang/el/resendpwd.txt5
-rw-r--r--inc/lang/el/resetpwd.txt2
-rw-r--r--inc/lang/el/searchpage.txt1
-rw-r--r--inc/lang/el/stopwords.txt3
-rw-r--r--inc/lang/el/updateprofile.txt3
-rw-r--r--inc/lang/en/admin.txt1
-rw-r--r--inc/lang/en/backlinks.txt1
-rw-r--r--inc/lang/en/conflict.txt1
-rw-r--r--inc/lang/en/denied.txt1
-rw-r--r--inc/lang/en/diff.txt1
-rw-r--r--inc/lang/en/draft.txt1
-rw-r--r--inc/lang/en/edit.txt1
-rw-r--r--inc/lang/en/index.txt1
-rw-r--r--inc/lang/en/install.html25
-rw-r--r--inc/lang/en/lang.php5
-rw-r--r--inc/lang/en/login.txt1
-rw-r--r--inc/lang/en/mailtext.txt19
-rw-r--r--inc/lang/en/newpage.txt3
-rw-r--r--inc/lang/en/norev.txt1
-rw-r--r--inc/lang/en/onceexisted.txt3
-rw-r--r--inc/lang/en/preview.txt3
-rw-r--r--inc/lang/en/pwconfirm.txt6
-rw-r--r--inc/lang/en/read.txt1
-rw-r--r--inc/lang/en/recent.txt4
-rw-r--r--inc/lang/en/register.txt1
-rw-r--r--inc/lang/en/resendpwd.txt1
-rw-r--r--inc/lang/en/resetpwd.txt1
-rw-r--r--inc/lang/en/revisions.txt1
-rw-r--r--inc/lang/en/searchpage.txt1
-rw-r--r--inc/lang/en/subscr_single.txt10
-rw-r--r--inc/lang/en/updateprofile.txt2
-rw-r--r--inc/lang/eo/backlinks.txt2
-rw-r--r--inc/lang/eo/denied.txt1
-rw-r--r--inc/lang/eo/diff.txt1
-rw-r--r--inc/lang/eo/index.txt2
-rw-r--r--inc/lang/eo/install.html8
-rw-r--r--inc/lang/eo/lang.php91
-rw-r--r--inc/lang/eo/login.txt2
-rw-r--r--inc/lang/eo/newpage.txt3
-rw-r--r--inc/lang/eo/preview.txt2
-rw-r--r--inc/lang/eo/pwconfirm.txt3
-rw-r--r--inc/lang/eo/read.txt1
-rw-r--r--inc/lang/eo/register.txt3
-rw-r--r--inc/lang/eo/resetpwd.txt3
-rw-r--r--inc/lang/eo/revisions.txt2
-rw-r--r--inc/lang/eo/searchpage.txt1
-rw-r--r--inc/lang/es/adminplugins.txt2
-rw-r--r--inc/lang/es/backlinks.txt1
-rw-r--r--inc/lang/es/conflict.txt2
-rw-r--r--inc/lang/es/denied.txt1
-rw-r--r--inc/lang/es/diff.txt1
-rw-r--r--inc/lang/es/draft.txt1
-rw-r--r--inc/lang/es/edit.txt1
-rw-r--r--inc/lang/es/editrev.txt2
-rw-r--r--inc/lang/es/index.txt3
-rw-r--r--inc/lang/es/install.html13
-rw-r--r--inc/lang/es/lang.php3
-rw-r--r--inc/lang/es/locked.txt2
-rw-r--r--inc/lang/es/newpage.txt2
-rw-r--r--inc/lang/es/norev.txt1
-rw-r--r--inc/lang/es/onceexisted.txt3
-rw-r--r--inc/lang/es/preview.txt3
-rw-r--r--inc/lang/es/pwconfirm.txt6
-rw-r--r--inc/lang/es/recent.txt4
-rw-r--r--inc/lang/es/register.txt2
-rw-r--r--inc/lang/es/resetpwd.txt2
-rw-r--r--inc/lang/es/revisions.txt1
-rw-r--r--inc/lang/es/searchpage.txt1
-rw-r--r--inc/lang/es/stopwords.txt281
-rw-r--r--inc/lang/et/admin.txt1
-rw-r--r--inc/lang/et/backlinks.txt1
-rw-r--r--inc/lang/et/conflict.txt1
-rw-r--r--inc/lang/et/denied.txt1
-rw-r--r--inc/lang/et/diff.txt1
-rw-r--r--inc/lang/et/draft.txt1
-rw-r--r--inc/lang/et/edit.txt1
-rw-r--r--inc/lang/et/editrev.txt1
-rw-r--r--inc/lang/et/newpage.txt2
-rw-r--r--inc/lang/et/norev.txt1
-rw-r--r--inc/lang/et/preview.txt2
-rw-r--r--inc/lang/et/pwconfirm.txt1
-rw-r--r--inc/lang/et/read.txt1
-rw-r--r--inc/lang/et/recent.txt4
-rw-r--r--inc/lang/et/register.txt1
-rw-r--r--inc/lang/et/resendpwd.txt1
-rw-r--r--inc/lang/et/resetpwd.txt2
-rw-r--r--inc/lang/et/revisions.txt1
-rw-r--r--inc/lang/et/searchpage.txt1
-rw-r--r--inc/lang/et/updateprofile.txt2
-rw-r--r--inc/lang/eu/backlinks.txt2
-rw-r--r--inc/lang/eu/conflict.txt2
-rw-r--r--inc/lang/eu/denied.txt1
-rw-r--r--inc/lang/eu/diff.txt1
-rw-r--r--inc/lang/eu/draft.txt2
-rw-r--r--inc/lang/eu/index.txt1
-rw-r--r--inc/lang/eu/install.html6
-rw-r--r--inc/lang/eu/login.txt1
-rw-r--r--inc/lang/eu/newpage.txt2
-rw-r--r--inc/lang/eu/preview.txt2
-rw-r--r--inc/lang/eu/register.txt2
-rw-r--r--inc/lang/eu/resendpwd.txt2
-rw-r--r--inc/lang/eu/resetpwd.txt2
-rw-r--r--inc/lang/eu/searchpage.txt1
-rw-r--r--inc/lang/eu/stopwords.txt2
-rw-r--r--inc/lang/eu/updateprofile.txt2
-rw-r--r--inc/lang/fa/admin.txt2
-rw-r--r--inc/lang/fa/adminplugins.txt2
-rw-r--r--inc/lang/fa/backlinks.txt2
-rw-r--r--inc/lang/fa/conflict.txt2
-rw-r--r--inc/lang/fa/denied.txt3
-rw-r--r--inc/lang/fa/diff.txt2
-rw-r--r--inc/lang/fa/draft.txt2
-rw-r--r--inc/lang/fa/edit.txt2
-rw-r--r--inc/lang/fa/editrev.txt4
-rw-r--r--inc/lang/fa/index.txt2
-rw-r--r--inc/lang/fa/install.html13
-rw-r--r--inc/lang/fa/lang.php112
-rw-r--r--inc/lang/fa/locked.txt2
-rw-r--r--inc/lang/fa/login.txt2
-rw-r--r--inc/lang/fa/newpage.txt2
-rw-r--r--inc/lang/fa/norev.txt2
-rw-r--r--inc/lang/fa/preview.txt2
-rw-r--r--inc/lang/fa/read.txt2
-rw-r--r--inc/lang/fa/recent.txt2
-rw-r--r--inc/lang/fa/register.txt2
-rw-r--r--inc/lang/fa/resendpwd.txt2
-rw-r--r--inc/lang/fa/resetpwd.txt2
-rw-r--r--inc/lang/fa/revisions.txt2
-rw-r--r--inc/lang/fa/searchpage.txt1
-rw-r--r--inc/lang/fa/showrev.txt2
-rw-r--r--inc/lang/fa/stopwords.txt3
-rw-r--r--inc/lang/fa/updateprofile.txt2
-rw-r--r--inc/lang/fi/backlinks.txt1
-rw-r--r--inc/lang/fi/denied.txt1
-rw-r--r--inc/lang/fi/draft.txt2
-rw-r--r--inc/lang/fi/install.html22
-rw-r--r--inc/lang/fi/lang.php79
-rw-r--r--inc/lang/fi/newpage.txt2
-rw-r--r--inc/lang/fi/preview.txt2
-rw-r--r--inc/lang/fi/recent.txt3
-rw-r--r--inc/lang/fi/resetpwd.txt4
-rw-r--r--inc/lang/fi/searchpage.txt1
-rw-r--r--inc/lang/fi/stopwords.txt8
-rw-r--r--inc/lang/fi/updateprofile.txt2
-rw-r--r--inc/lang/fo/admin.txt1
-rw-r--r--inc/lang/fo/backlinks.txt1
-rw-r--r--inc/lang/fo/denied.txt1
-rw-r--r--inc/lang/fo/diff.txt1
-rw-r--r--inc/lang/fo/edit.txt1
-rw-r--r--inc/lang/fo/newpage.txt2
-rw-r--r--inc/lang/fo/norev.txt1
-rw-r--r--inc/lang/fo/preview.txt1
-rw-r--r--inc/lang/fo/read.txt1
-rw-r--r--inc/lang/fo/recent.txt4
-rw-r--r--inc/lang/fo/register.txt1
-rw-r--r--inc/lang/fo/searchpage.txt1
-rw-r--r--inc/lang/fo/stopwords.txt1
-rw-r--r--inc/lang/fr/backlinks.txt1
-rw-r--r--inc/lang/fr/conflict.txt1
-rw-r--r--inc/lang/fr/denied.txt1
-rw-r--r--inc/lang/fr/diff.txt1
-rw-r--r--inc/lang/fr/draft.txt1
-rw-r--r--inc/lang/fr/edit.txt1
-rw-r--r--inc/lang/fr/index.txt1
-rw-r--r--inc/lang/fr/install.html39
-rw-r--r--inc/lang/fr/lang.php20
-rw-r--r--inc/lang/fr/mailtext.txt2
-rw-r--r--inc/lang/fr/newpage.txt1
-rw-r--r--inc/lang/fr/norev.txt1
-rw-r--r--inc/lang/fr/onceexisted.txt3
-rw-r--r--inc/lang/fr/password.txt3
-rw-r--r--inc/lang/fr/pwconfirm.txt3
-rw-r--r--inc/lang/fr/read.txt1
-rw-r--r--inc/lang/fr/recent.txt4
-rw-r--r--inc/lang/fr/register.txt2
-rw-r--r--inc/lang/fr/registermail.txt12
-rw-r--r--inc/lang/fr/resendpwd.txt1
-rw-r--r--inc/lang/fr/resetpwd.txt2
-rw-r--r--inc/lang/fr/revisions.txt3
-rw-r--r--inc/lang/fr/searchpage.txt1
-rw-r--r--inc/lang/fr/stopwords.txt1
-rw-r--r--inc/lang/fr/subscr_digest.txt5
-rw-r--r--inc/lang/fr/subscr_list.txt3
-rw-r--r--inc/lang/fr/subscr_single.txt11
-rw-r--r--inc/lang/fr/updateprofile.txt2
-rw-r--r--inc/lang/fy/admin.txt3
-rw-r--r--inc/lang/gl/admin.txt1
-rw-r--r--inc/lang/gl/backlinks.txt1
-rw-r--r--inc/lang/gl/conflict.txt1
-rw-r--r--inc/lang/gl/denied.txt1
-rw-r--r--inc/lang/gl/diff.txt1
-rw-r--r--inc/lang/gl/draft.txt1
-rw-r--r--inc/lang/gl/edit.txt1
-rw-r--r--inc/lang/gl/index.txt1
-rw-r--r--inc/lang/gl/install.html26
-rw-r--r--inc/lang/gl/login.txt1
-rw-r--r--inc/lang/gl/newpage.txt3
-rw-r--r--inc/lang/gl/norev.txt1
-rw-r--r--inc/lang/gl/preview.txt3
-rw-r--r--inc/lang/gl/pwconfirm.txt6
-rw-r--r--inc/lang/gl/read.txt1
-rw-r--r--inc/lang/gl/recent.txt4
-rw-r--r--inc/lang/gl/register.txt1
-rw-r--r--inc/lang/gl/resetpwd.txt2
-rw-r--r--inc/lang/gl/revisions.txt1
-rw-r--r--inc/lang/gl/searchpage.txt1
-rw-r--r--inc/lang/gl/stopwords.txt1
-rw-r--r--inc/lang/gl/updateprofile.txt2
-rw-r--r--inc/lang/gl/wordblock.txt4
-rw-r--r--inc/lang/he/admin.txt1
-rw-r--r--inc/lang/he/conflict.txt1
-rw-r--r--inc/lang/he/denied.txt1
-rw-r--r--inc/lang/he/diff.txt1
-rw-r--r--inc/lang/he/draft.txt2
-rw-r--r--inc/lang/he/editrev.txt2
-rw-r--r--inc/lang/he/index.txt3
-rw-r--r--inc/lang/he/install.html14
-rw-r--r--inc/lang/he/newpage.txt2
-rw-r--r--inc/lang/he/norev.txt1
-rw-r--r--inc/lang/he/preview.txt3
-rw-r--r--inc/lang/he/read.txt1
-rw-r--r--inc/lang/he/recent.txt4
-rw-r--r--inc/lang/he/resendpwd.txt1
-rw-r--r--inc/lang/he/resetpwd.txt2
-rw-r--r--inc/lang/he/revisions.txt1
-rw-r--r--inc/lang/he/searchpage.txt1
-rw-r--r--inc/lang/he/showrev.txt2
-rw-r--r--inc/lang/he/updateprofile.txt2
-rw-r--r--inc/lang/hi/diff.txt2
-rw-r--r--inc/lang/hr/denied.txt1
-rw-r--r--inc/lang/hr/diff.txt2
-rw-r--r--inc/lang/hr/draft.txt1
-rw-r--r--inc/lang/hr/editrev.txt2
-rw-r--r--inc/lang/hr/newpage.txt2
-rw-r--r--inc/lang/hr/preview.txt2
-rw-r--r--inc/lang/hr/read.txt2
-rw-r--r--inc/lang/hr/recent.txt2
-rw-r--r--inc/lang/hr/resetpwd.txt2
-rw-r--r--inc/lang/hr/searchpage.txt1
-rw-r--r--inc/lang/hu-formal/admin.txt2
-rw-r--r--inc/lang/hu-formal/backlinks.txt2
-rw-r--r--inc/lang/hu-formal/conflict.txt2
-rw-r--r--inc/lang/hu-formal/denied.txt1
-rw-r--r--inc/lang/hu-formal/diff.txt2
-rw-r--r--inc/lang/hu-formal/draft.txt2
-rw-r--r--inc/lang/hu-formal/edit.txt2
-rw-r--r--inc/lang/hu-formal/editrev.txt2
-rw-r--r--inc/lang/hu-formal/index.txt2
-rw-r--r--inc/lang/hu/backlinks.txt2
-rw-r--r--inc/lang/hu/conflict.txt2
-rw-r--r--inc/lang/hu/denied.txt1
-rw-r--r--inc/lang/hu/diff.txt1
-rw-r--r--inc/lang/hu/draft.txt2
-rw-r--r--inc/lang/hu/index.txt3
-rw-r--r--inc/lang/hu/install.html27
-rw-r--r--inc/lang/hu/locked.txt1
-rw-r--r--inc/lang/hu/login.txt2
-rw-r--r--inc/lang/hu/newpage.txt2
-rw-r--r--inc/lang/hu/norev.txt2
-rw-r--r--inc/lang/hu/preview.txt2
-rw-r--r--inc/lang/hu/pwconfirm.txt6
-rw-r--r--inc/lang/hu/recent.txt4
-rw-r--r--inc/lang/hu/register.txt3
-rw-r--r--inc/lang/hu/resendpwd.txt2
-rw-r--r--inc/lang/hu/resetpwd.txt2
-rw-r--r--inc/lang/hu/searchpage.txt1
-rw-r--r--inc/lang/hu/stopwords.txt49
-rw-r--r--inc/lang/ia/backlinks.txt2
-rw-r--r--inc/lang/ia/denied.txt1
-rw-r--r--inc/lang/ia/diff.txt2
-rw-r--r--inc/lang/ia/draft.txt2
-rw-r--r--inc/lang/ia/edit.txt2
-rw-r--r--inc/lang/ia/editrev.txt2
-rw-r--r--inc/lang/ia/install.html14
-rw-r--r--inc/lang/ia/locked.txt2
-rw-r--r--inc/lang/ia/login.txt2
-rw-r--r--inc/lang/ia/newpage.txt2
-rw-r--r--inc/lang/ia/norev.txt2
-rw-r--r--inc/lang/ia/preview.txt2
-rw-r--r--inc/lang/ia/pwconfirm.txt3
-rw-r--r--inc/lang/ia/read.txt2
-rw-r--r--inc/lang/ia/recent.txt2
-rw-r--r--inc/lang/ia/resendpwd.txt2
-rw-r--r--inc/lang/ia/revisions.txt2
-rw-r--r--inc/lang/ia/searchpage.txt1
-rw-r--r--inc/lang/ia/showrev.txt2
-rw-r--r--inc/lang/ia/updateprofile.txt2
-rw-r--r--inc/lang/id/admin.txt1
-rw-r--r--inc/lang/id/adminplugins.txt2
-rw-r--r--inc/lang/id/conflict.txt1
-rw-r--r--inc/lang/id/denied.txt1
-rw-r--r--inc/lang/id/diff.txt1
-rw-r--r--inc/lang/id/edit.txt1
-rw-r--r--inc/lang/id/editrev.txt2
-rw-r--r--inc/lang/id/index.txt1
-rw-r--r--inc/lang/id/install.html26
-rw-r--r--inc/lang/id/lang.php77
-rw-r--r--inc/lang/id/login.txt1
-rw-r--r--inc/lang/id/newpage.txt2
-rw-r--r--inc/lang/id/norev.txt1
-rw-r--r--inc/lang/id/preview.txt3
-rw-r--r--inc/lang/id/read.txt1
-rw-r--r--inc/lang/id/recent.txt4
-rw-r--r--inc/lang/id/register.txt1
-rw-r--r--inc/lang/id/resetpwd.txt2
-rw-r--r--inc/lang/id/revisions.txt1
-rw-r--r--inc/lang/id/searchpage.txt1
-rw-r--r--inc/lang/id/stopwords.txt29
-rw-r--r--inc/lang/is/diff.txt2
-rw-r--r--inc/lang/is/lang.php16
-rw-r--r--inc/lang/is/login.txt2
-rw-r--r--inc/lang/is/recent.txt2
-rw-r--r--inc/lang/is/resendpwd.txt2
-rw-r--r--inc/lang/it/admin.txt1
-rw-r--r--inc/lang/it/backlinks.txt1
-rw-r--r--inc/lang/it/conflict.txt1
-rw-r--r--inc/lang/it/denied.txt1
-rw-r--r--inc/lang/it/diff.txt1
-rw-r--r--inc/lang/it/draft.txt1
-rw-r--r--inc/lang/it/edit.txt1
-rw-r--r--inc/lang/it/editrev.txt2
-rw-r--r--inc/lang/it/index.txt3
-rw-r--r--inc/lang/it/install.html25
-rw-r--r--inc/lang/it/lang.php10
-rw-r--r--inc/lang/it/login.txt1
-rw-r--r--inc/lang/it/newpage.txt2
-rw-r--r--inc/lang/it/onceexisted.txt3
-rw-r--r--inc/lang/it/preview.txt4
-rw-r--r--inc/lang/it/pwconfirm.txt6
-rw-r--r--inc/lang/it/recent.txt3
-rw-r--r--inc/lang/it/register.txt2
-rw-r--r--inc/lang/it/resetpwd.txt4
-rw-r--r--inc/lang/it/searchpage.txt1
-rw-r--r--inc/lang/it/stopwords.txt1
-rw-r--r--inc/lang/ja/admin.txt3
-rw-r--r--inc/lang/ja/backlinks.txt3
-rw-r--r--inc/lang/ja/conflict.txt3
-rw-r--r--inc/lang/ja/denied.txt3
-rw-r--r--inc/lang/ja/diff.txt3
-rw-r--r--inc/lang/ja/draft.txt5
-rw-r--r--inc/lang/ja/edit.txt5
-rw-r--r--inc/lang/ja/editrev.txt2
-rw-r--r--inc/lang/ja/index.txt3
-rw-r--r--inc/lang/ja/install.html15
-rw-r--r--inc/lang/ja/lang.php171
-rw-r--r--inc/lang/ja/locked.txt2
-rw-r--r--inc/lang/ja/login.txt3
-rw-r--r--inc/lang/ja/mailtext.txt18
-rw-r--r--inc/lang/ja/newpage.txt5
-rw-r--r--inc/lang/ja/norev.txt5
-rw-r--r--inc/lang/ja/onceexisted.txt3
-rw-r--r--inc/lang/ja/password.txt2
-rw-r--r--inc/lang/ja/preview.txt3
-rw-r--r--inc/lang/ja/read.txt1
-rw-r--r--inc/lang/ja/recent.txt4
-rw-r--r--inc/lang/ja/register.txt3
-rw-r--r--inc/lang/ja/registermail.txt14
-rw-r--r--inc/lang/ja/resendpwd.txt3
-rw-r--r--inc/lang/ja/resetpwd.txt4
-rw-r--r--inc/lang/ja/revisions.txt3
-rw-r--r--inc/lang/ja/searchpage.txt1
-rw-r--r--inc/lang/ja/showrev.txt2
-rw-r--r--inc/lang/ja/stopwords.txt18
-rw-r--r--inc/lang/ja/subscr_digest.txt5
-rw-r--r--inc/lang/ja/subscr_list.txt6
-rw-r--r--inc/lang/ja/subscr_single.txt15
-rw-r--r--inc/lang/ja/updateprofile.txt4
-rw-r--r--inc/lang/ja/uploadmail.txt17
-rw-r--r--inc/lang/ka/admin.txt1
-rw-r--r--inc/lang/ka/backlinks.txt1
-rw-r--r--inc/lang/ka/conflict.txt2
-rw-r--r--inc/lang/ka/diff.txt2
-rw-r--r--inc/lang/ka/draft.txt2
-rw-r--r--inc/lang/ka/edit.txt1
-rw-r--r--inc/lang/ka/index.txt4
-rw-r--r--inc/lang/ka/lang.php3
-rw-r--r--inc/lang/km/admin.txt2
-rw-r--r--inc/lang/km/backlinks.txt4
-rw-r--r--inc/lang/km/conflict.txt2
-rw-r--r--inc/lang/km/denied.txt1
-rw-r--r--inc/lang/km/edit.txt4
-rw-r--r--inc/lang/km/index.txt3
-rw-r--r--inc/lang/km/lang.php393
-rw-r--r--inc/lang/km/login.txt4
-rw-r--r--inc/lang/km/newpage.txt5
-rw-r--r--inc/lang/km/norev.txt1
-rw-r--r--inc/lang/km/pwconfirm.txt2
-rw-r--r--inc/lang/km/recent.txt2
-rw-r--r--inc/lang/km/register.txt6
-rw-r--r--inc/lang/km/revisions.txt3
-rw-r--r--inc/lang/kn/admin.txt3
-rw-r--r--inc/lang/kn/backlinks.txt3
-rw-r--r--inc/lang/kn/conflict.txt3
-rw-r--r--inc/lang/ko/admin.txt2
-rw-r--r--inc/lang/ko/backlinks.txt2
-rw-r--r--inc/lang/ko/conflict.txt2
-rw-r--r--inc/lang/ko/denied.txt2
-rw-r--r--inc/lang/ko/diff.txt2
-rw-r--r--inc/lang/ko/draft.txt2
-rw-r--r--inc/lang/ko/edit.txt2
-rw-r--r--inc/lang/ko/editrev.txt2
-rw-r--r--inc/lang/ko/index.txt2
-rw-r--r--inc/lang/ko/install.html23
-rw-r--r--inc/lang/ko/lang.php90
-rw-r--r--inc/lang/ko/locked.txt2
-rw-r--r--inc/lang/ko/login.txt2
-rw-r--r--inc/lang/ko/newpage.txt2
-rw-r--r--inc/lang/ko/norev.txt2
-rw-r--r--inc/lang/ko/onceexisted.txt3
-rw-r--r--inc/lang/ko/preview.txt2
-rw-r--r--inc/lang/ko/pwconfirm.txt3
-rw-r--r--inc/lang/ko/read.txt2
-rw-r--r--inc/lang/ko/recent.txt2
-rw-r--r--inc/lang/ko/register.txt2
-rw-r--r--inc/lang/ko/resendpwd.txt2
-rw-r--r--inc/lang/ko/resetpwd.txt2
-rw-r--r--inc/lang/ko/revisions.txt2
-rw-r--r--inc/lang/ko/searchpage.txt1
-rw-r--r--inc/lang/ko/showrev.txt2
-rw-r--r--inc/lang/ko/stopwords.txt2
-rw-r--r--inc/lang/ko/updateprofile.txt2
-rw-r--r--inc/lang/ku/backlinks.txt1
-rw-r--r--inc/lang/ku/conflict.txt1
-rw-r--r--inc/lang/ku/diff.txt1
-rw-r--r--inc/lang/ku/edit.txt3
-rw-r--r--inc/lang/ku/index.txt2
-rw-r--r--inc/lang/ku/lang.php76
-rw-r--r--inc/lang/ku/newpage.txt2
-rw-r--r--inc/lang/ku/preview.txt2
-rw-r--r--inc/lang/ku/recent.txt2
-rw-r--r--inc/lang/ku/searchpage.txt1
-rw-r--r--inc/lang/la/admin.txt2
-rw-r--r--inc/lang/la/conflict.txt2
-rw-r--r--inc/lang/la/denied.txt1
-rw-r--r--inc/lang/la/diff.txt2
-rw-r--r--inc/lang/la/draft.txt2
-rw-r--r--inc/lang/la/edit.txt2
-rw-r--r--inc/lang/la/editrev.txt2
-rw-r--r--inc/lang/la/index.txt2
-rw-r--r--inc/lang/la/locked.txt2
-rw-r--r--inc/lang/la/login.txt2
-rw-r--r--inc/lang/la/newpage.txt2
-rw-r--r--inc/lang/la/norev.txt2
-rw-r--r--inc/lang/la/preview.txt2
-rw-r--r--inc/lang/la/pwconfirm.txt3
-rw-r--r--inc/lang/la/read.txt2
-rw-r--r--inc/lang/la/recent.txt2
-rw-r--r--inc/lang/la/register.txt2
-rw-r--r--inc/lang/la/resendpwd.txt2
-rw-r--r--inc/lang/la/revisions.txt2
-rw-r--r--inc/lang/la/searchpage.txt1
-rw-r--r--inc/lang/la/showrev.txt2
-rw-r--r--inc/lang/la/stopwords.txt2
-rw-r--r--inc/lang/la/updateprofile.txt2
-rw-r--r--inc/lang/lb/denied.txt1
-rw-r--r--inc/lang/lb/editrev.txt2
-rw-r--r--inc/lang/lb/locked.txt2
-rw-r--r--inc/lang/lb/newpage.txt3
-rw-r--r--inc/lang/lb/preview.txt2
-rw-r--r--inc/lang/lb/pwconfirm.txt6
-rw-r--r--inc/lang/lb/recent.txt3
-rw-r--r--inc/lang/lb/register.txt1
-rw-r--r--inc/lang/lb/searchpage.txt1
-rw-r--r--inc/lang/lb/showrev.txt2
-rw-r--r--inc/lang/lb/updateprofile.txt1
-rw-r--r--inc/lang/lt/admin.txt1
-rw-r--r--inc/lang/lt/adminplugins.txt1
-rw-r--r--inc/lang/lt/backlinks.txt1
-rw-r--r--inc/lang/lt/conflict.txt1
-rw-r--r--inc/lang/lt/denied.txt1
-rw-r--r--inc/lang/lt/diff.txt1
-rw-r--r--inc/lang/lt/draft.txt5
-rw-r--r--inc/lang/lt/edit.txt1
-rw-r--r--inc/lang/lt/editrev.txt2
-rw-r--r--inc/lang/lt/index.txt1
-rw-r--r--inc/lang/lt/lang.php24
-rw-r--r--inc/lang/lt/login.txt2
-rw-r--r--inc/lang/lt/newpage.txt3
-rw-r--r--inc/lang/lt/norev.txt2
-rw-r--r--inc/lang/lt/preview.txt4
-rw-r--r--inc/lang/lt/read.txt2
-rw-r--r--inc/lang/lt/recent.txt4
-rw-r--r--inc/lang/lt/register.txt1
-rw-r--r--inc/lang/lt/revisions.txt1
-rw-r--r--inc/lang/lt/searchpage.txt1
-rw-r--r--inc/lang/lt/updateprofile.txt1
-rw-r--r--inc/lang/lv/admin.txt3
-rw-r--r--inc/lang/lv/backlinks.txt2
-rw-r--r--inc/lang/lv/conflict.txt3
-rw-r--r--inc/lang/lv/denied.txt1
-rw-r--r--inc/lang/lv/diff.txt6
-rw-r--r--inc/lang/lv/edit.txt3
-rw-r--r--inc/lang/lv/editrev.txt3
-rw-r--r--inc/lang/lv/index.txt1
-rw-r--r--inc/lang/lv/install.html13
-rw-r--r--inc/lang/lv/locked.txt2
-rw-r--r--inc/lang/lv/login.txt2
-rw-r--r--inc/lang/lv/newpage.txt4
-rw-r--r--inc/lang/lv/norev.txt2
-rw-r--r--inc/lang/lv/preview.txt4
-rw-r--r--inc/lang/lv/pwconfirm.txt3
-rw-r--r--inc/lang/lv/read.txt3
-rw-r--r--inc/lang/lv/recent.txt5
-rw-r--r--inc/lang/lv/register.txt1
-rw-r--r--inc/lang/lv/resetpwd.txt2
-rw-r--r--inc/lang/lv/revisions.txt2
-rw-r--r--inc/lang/lv/searchpage.txt1
-rw-r--r--inc/lang/lv/stopwords.txt60
-rw-r--r--inc/lang/lv/updateprofile.txt5
-rw-r--r--inc/lang/mg/admin.txt1
-rw-r--r--inc/lang/mg/backlinks.txt2
-rw-r--r--inc/lang/mg/conflict.txt1
-rw-r--r--inc/lang/mg/denied.txt1
-rw-r--r--inc/lang/mg/diff.txt1
-rw-r--r--inc/lang/mg/edit.txt3
-rw-r--r--inc/lang/mg/editrev.txt2
-rw-r--r--inc/lang/mg/index.txt1
-rw-r--r--inc/lang/mg/locked.txt1
-rw-r--r--inc/lang/mg/login.txt1
-rw-r--r--inc/lang/mg/newpage.txt2
-rw-r--r--inc/lang/mg/norev.txt1
-rw-r--r--inc/lang/mg/preview.txt4
-rw-r--r--inc/lang/mg/read.txt2
-rw-r--r--inc/lang/mg/recent.txt4
-rw-r--r--inc/lang/mg/register.txt2
-rw-r--r--inc/lang/mg/revisions.txt2
-rw-r--r--inc/lang/mg/searchpage.txt1
-rw-r--r--inc/lang/mk/read.txt2
-rw-r--r--inc/lang/mk/recent.txt2
-rw-r--r--inc/lang/mk/showrev.txt2
-rw-r--r--inc/lang/ml/admin.txt2
-rw-r--r--inc/lang/mr/admin.txt2
-rw-r--r--inc/lang/mr/backlinks.txt2
-rw-r--r--inc/lang/mr/conflict.txt2
-rw-r--r--inc/lang/mr/denied.txt1
-rw-r--r--inc/lang/mr/diff.txt2
-rw-r--r--inc/lang/mr/draft.txt2
-rw-r--r--inc/lang/mr/edit.txt2
-rw-r--r--inc/lang/mr/editrev.txt2
-rw-r--r--inc/lang/mr/index.txt2
-rw-r--r--inc/lang/mr/install.html7
-rw-r--r--inc/lang/mr/locked.txt2
-rw-r--r--inc/lang/mr/login.txt2
-rw-r--r--inc/lang/mr/newpage.txt2
-rw-r--r--inc/lang/mr/norev.txt2
-rw-r--r--inc/lang/mr/preview.txt2
-rw-r--r--inc/lang/mr/pwconfirm.txt1
-rw-r--r--inc/lang/mr/read.txt2
-rw-r--r--inc/lang/mr/recent.txt2
-rw-r--r--inc/lang/mr/register.txt2
-rw-r--r--inc/lang/mr/resendpwd.txt2
-rw-r--r--inc/lang/mr/revisions.txt2
-rw-r--r--inc/lang/mr/searchpage.txt1
-rw-r--r--inc/lang/mr/showrev.txt2
-rw-r--r--inc/lang/mr/stopwords.txt2
-rw-r--r--inc/lang/mr/updateprofile.txt2
-rw-r--r--inc/lang/ne/admin.txt3
-rw-r--r--inc/lang/ne/backlinks.txt3
-rw-r--r--inc/lang/ne/conflict.txt2
-rw-r--r--inc/lang/ne/denied.txt1
-rw-r--r--inc/lang/ne/diff.txt2
-rw-r--r--inc/lang/ne/draft.txt2
-rw-r--r--inc/lang/ne/edit.txt2
-rw-r--r--inc/lang/ne/editrev.txt4
-rw-r--r--inc/lang/ne/index.txt2
-rw-r--r--inc/lang/ne/locked.txt2
-rw-r--r--inc/lang/ne/norev.txt3
-rw-r--r--inc/lang/ne/read.txt2
-rw-r--r--inc/lang/ne/recent.txt3
-rw-r--r--inc/lang/ne/resendpwd.txt2
-rw-r--r--inc/lang/ne/searchpage.txt1
-rw-r--r--inc/lang/ne/showrev.txt2
-rw-r--r--inc/lang/nl/backlinks.txt1
-rw-r--r--inc/lang/nl/denied.txt1
-rw-r--r--inc/lang/nl/index.txt3
-rw-r--r--inc/lang/nl/install.html15
-rw-r--r--inc/lang/nl/lang.php4
-rw-r--r--inc/lang/nl/newpage.txt2
-rw-r--r--inc/lang/nl/norev.txt1
-rw-r--r--inc/lang/nl/onceexisted.txt3
-rw-r--r--inc/lang/nl/preview.txt3
-rw-r--r--inc/lang/nl/read.txt1
-rw-r--r--inc/lang/nl/recent.txt2
-rw-r--r--inc/lang/nl/register.txt3
-rw-r--r--inc/lang/nl/resetpwd.txt2
-rw-r--r--inc/lang/nl/revisions.txt1
-rw-r--r--inc/lang/nl/searchpage.txt1
-rw-r--r--inc/lang/nl/stopwords.txt1
-rw-r--r--inc/lang/no/backlinks.txt2
-rw-r--r--inc/lang/no/conflict.txt1
-rw-r--r--inc/lang/no/denied.txt5
-rw-r--r--inc/lang/no/diff.txt1
-rw-r--r--inc/lang/no/draft.txt1
-rw-r--r--inc/lang/no/edit.txt1
-rw-r--r--inc/lang/no/index.txt3
-rw-r--r--inc/lang/no/install.html25
-rw-r--r--inc/lang/no/lang.php90
-rw-r--r--inc/lang/no/login.txt3
-rw-r--r--inc/lang/no/newpage.txt2
-rw-r--r--inc/lang/no/norev.txt1
-rw-r--r--inc/lang/no/preview.txt3
-rw-r--r--inc/lang/no/pwconfirm.txt6
-rw-r--r--inc/lang/no/read.txt1
-rw-r--r--inc/lang/no/recent.txt4
-rw-r--r--inc/lang/no/register.txt1
-rw-r--r--inc/lang/no/resendpwd.txt1
-rw-r--r--inc/lang/no/resetpwd.txt2
-rw-r--r--inc/lang/no/revisions.txt1
-rw-r--r--inc/lang/no/searchpage.txt1
-rw-r--r--inc/lang/no/stopwords.txt102
-rw-r--r--inc/lang/no/updateprofile.txt2
-rw-r--r--inc/lang/oc/admin.txt2
-rw-r--r--inc/lang/oc/adminplugins.txt1
-rw-r--r--inc/lang/oc/backlinks.txt2
-rw-r--r--inc/lang/oc/conflict.txt4
-rw-r--r--inc/lang/oc/denied.txt2
-rw-r--r--inc/lang/oc/diff.txt2
-rw-r--r--inc/lang/oc/index.txt2
-rw-r--r--inc/lang/oc/lang.php226
-rw-r--r--inc/lang/pl/admin.txt1
-rw-r--r--inc/lang/pl/backlinks.txt1
-rw-r--r--inc/lang/pl/conflict.txt1
-rw-r--r--inc/lang/pl/denied.txt1
-rw-r--r--inc/lang/pl/diff.txt1
-rw-r--r--inc/lang/pl/draft.txt1
-rw-r--r--inc/lang/pl/edit.txt5
-rw-r--r--inc/lang/pl/index.txt3
-rw-r--r--inc/lang/pl/install.html24
-rw-r--r--inc/lang/pl/lang.php93
-rw-r--r--inc/lang/pl/login.txt1
-rw-r--r--inc/lang/pl/newpage.txt3
-rw-r--r--inc/lang/pl/norev.txt1
-rw-r--r--inc/lang/pl/onceexisted.txt3
-rw-r--r--inc/lang/pl/preview.txt3
-rw-r--r--inc/lang/pl/read.txt1
-rw-r--r--inc/lang/pl/recent.txt4
-rw-r--r--inc/lang/pl/register.txt3
-rw-r--r--inc/lang/pl/resendpwd.txt1
-rw-r--r--inc/lang/pl/resetpwd.txt2
-rw-r--r--inc/lang/pl/revisions.txt1
-rw-r--r--inc/lang/pl/searchpage.txt1
-rw-r--r--inc/lang/pl/stopwords.txt1
-rw-r--r--inc/lang/pl/updateprofile.txt2
-rw-r--r--inc/lang/pt-br/admin.txt1
-rw-r--r--inc/lang/pt-br/backlinks.txt1
-rw-r--r--inc/lang/pt-br/denied.txt1
-rw-r--r--inc/lang/pt-br/draft.txt2
-rw-r--r--inc/lang/pt-br/edit.txt1
-rw-r--r--inc/lang/pt-br/editrev.txt2
-rw-r--r--inc/lang/pt-br/index.txt2
-rw-r--r--inc/lang/pt-br/install.html2
-rw-r--r--inc/lang/pt-br/lang.php99
-rw-r--r--inc/lang/pt-br/newpage.txt2
-rw-r--r--inc/lang/pt-br/onceexisted.txt3
-rw-r--r--inc/lang/pt-br/preview.txt2
-rw-r--r--inc/lang/pt-br/recent.txt3
-rw-r--r--inc/lang/pt-br/register.txt3
-rw-r--r--inc/lang/pt-br/resendpwd.txt2
-rw-r--r--inc/lang/pt-br/resetpwd.txt2
-rw-r--r--inc/lang/pt-br/revisions.txt1
-rw-r--r--inc/lang/pt-br/searchpage.txt1
-rw-r--r--inc/lang/pt-br/stopwords.txt2
-rw-r--r--inc/lang/pt-br/updateprofile.txt2
-rw-r--r--inc/lang/pt/admin.txt2
-rw-r--r--inc/lang/pt/adminplugins.txt2
-rw-r--r--inc/lang/pt/backlinks.txt3
-rw-r--r--inc/lang/pt/conflict.txt4
-rw-r--r--inc/lang/pt/denied.txt3
-rw-r--r--inc/lang/pt/diff.txt2
-rw-r--r--inc/lang/pt/draft.txt6
-rw-r--r--inc/lang/pt/edit.txt5
-rw-r--r--inc/lang/pt/editrev.txt3
-rw-r--r--inc/lang/pt/index.txt2
-rw-r--r--inc/lang/pt/install.html5
-rw-r--r--inc/lang/pt/lang.php349
-rw-r--r--inc/lang/pt/locked.txt2
-rw-r--r--inc/lang/pt/login.txt2
-rw-r--r--inc/lang/pt/mailtext.txt12
-rw-r--r--inc/lang/pt/newpage.txt4
-rw-r--r--inc/lang/pt/norev.txt6
-rw-r--r--inc/lang/pt/onceexisted.txt3
-rw-r--r--inc/lang/pt/password.txt6
-rw-r--r--inc/lang/pt/preview.txt2
-rw-r--r--inc/lang/pt/pwconfirm.txt6
-rw-r--r--inc/lang/pt/read.txt2
-rw-r--r--inc/lang/pt/recent.txt2
-rw-r--r--inc/lang/pt/register.txt4
-rw-r--r--inc/lang/pt/registermail.txt6
-rw-r--r--inc/lang/pt/resendpwd.txt2
-rw-r--r--inc/lang/pt/resetpwd.txt2
-rw-r--r--inc/lang/pt/revisions.txt2
-rw-r--r--inc/lang/pt/searchpage.txt1
-rw-r--r--inc/lang/pt/showrev.txt3
-rw-r--r--inc/lang/pt/stopwords.txt3
-rw-r--r--inc/lang/pt/subscr_digest.txt8
-rw-r--r--inc/lang/pt/subscr_form.txt4
-rw-r--r--inc/lang/pt/subscr_list.txt6
-rw-r--r--inc/lang/pt/subscr_single.txt17
-rw-r--r--inc/lang/pt/updateprofile.txt4
-rw-r--r--inc/lang/pt/uploadmail.txt4
-rw-r--r--inc/lang/ro/denied.txt1
-rw-r--r--inc/lang/ro/draft.txt7
-rw-r--r--inc/lang/ro/index.txt3
-rw-r--r--inc/lang/ro/install.html7
-rw-r--r--inc/lang/ro/lang.php92
-rw-r--r--inc/lang/ro/locked.txt3
-rw-r--r--inc/lang/ro/login.txt3
-rw-r--r--inc/lang/ro/newpage.txt2
-rw-r--r--inc/lang/ro/norev.txt3
-rw-r--r--inc/lang/ro/preview.txt2
-rw-r--r--inc/lang/ro/pwconfirm.txt3
-rw-r--r--inc/lang/ro/recent.txt2
-rw-r--r--inc/lang/ro/resendpwd.txt4
-rw-r--r--inc/lang/ro/revisions.txt4
-rw-r--r--inc/lang/ro/searchpage.txt1
-rw-r--r--inc/lang/ro/updateprofile.txt3
-rw-r--r--inc/lang/ru/admin.txt1
-rw-r--r--inc/lang/ru/backlinks.txt3
-rw-r--r--inc/lang/ru/conflict.txt4
-rw-r--r--inc/lang/ru/denied.txt1
-rw-r--r--inc/lang/ru/diff.txt2
-rw-r--r--inc/lang/ru/draft.txt2
-rw-r--r--inc/lang/ru/editrev.txt2
-rw-r--r--inc/lang/ru/index.txt5
-rw-r--r--inc/lang/ru/install.html4
-rw-r--r--inc/lang/ru/lang.php61
-rw-r--r--inc/lang/ru/login.txt3
-rw-r--r--inc/lang/ru/newpage.txt2
-rw-r--r--inc/lang/ru/norev.txt2
-rw-r--r--inc/lang/ru/onceexisted.txt3
-rw-r--r--inc/lang/ru/preview.txt3
-rw-r--r--inc/lang/ru/pwconfirm.txt2
-rw-r--r--inc/lang/ru/read.txt1
-rw-r--r--inc/lang/ru/recent.txt4
-rw-r--r--inc/lang/ru/register.txt2
-rw-r--r--inc/lang/ru/resendpwd.txt2
-rw-r--r--inc/lang/ru/resetpwd.txt2
-rw-r--r--inc/lang/ru/revisions.txt2
-rw-r--r--inc/lang/ru/searchpage.txt1
-rw-r--r--inc/lang/ru/stopwords.txt1
-rw-r--r--inc/lang/ru/updateprofile.txt2
-rw-r--r--inc/lang/ru/uploadmail.txt2
-rw-r--r--inc/lang/ru/wordblock.txt3
-rw-r--r--inc/lang/si/admin.txt3
-rw-r--r--inc/lang/si/adminplugins.txt1
-rw-r--r--inc/lang/si/backlinks.txt3
-rw-r--r--inc/lang/si/conflict.txt2
-rw-r--r--inc/lang/si/denied.txt1
-rw-r--r--inc/lang/si/diff.txt1
-rw-r--r--inc/lang/si/draft.txt1
-rw-r--r--inc/lang/si/index.txt1
-rw-r--r--inc/lang/si/lang.php27
-rw-r--r--inc/lang/sk/admin.txt2
-rw-r--r--inc/lang/sk/denied.txt1
-rw-r--r--inc/lang/sk/diff.txt1
-rw-r--r--inc/lang/sk/draft.txt1
-rw-r--r--inc/lang/sk/editrev.txt1
-rw-r--r--inc/lang/sk/install.html24
-rw-r--r--inc/lang/sk/lang.php114
-rw-r--r--inc/lang/sk/newpage.txt2
-rw-r--r--inc/lang/sk/onceexisted.txt3
-rw-r--r--inc/lang/sk/preview.txt2
-rw-r--r--inc/lang/sk/pwconfirm.txt6
-rw-r--r--inc/lang/sk/read.txt1
-rw-r--r--inc/lang/sk/recent.txt2
-rw-r--r--inc/lang/sk/resendpwd.txt2
-rw-r--r--inc/lang/sk/searchpage.txt1
-rw-r--r--inc/lang/sk/stopwords.txt2
-rw-r--r--inc/lang/sk/updateprofile.txt3
-rw-r--r--inc/lang/sl/denied.txt1
-rw-r--r--inc/lang/sl/draft.txt2
-rw-r--r--inc/lang/sl/editrev.txt2
-rw-r--r--inc/lang/sl/index.txt1
-rw-r--r--inc/lang/sl/install.html21
-rw-r--r--inc/lang/sl/lang.php70
-rw-r--r--inc/lang/sl/newpage.txt2
-rw-r--r--inc/lang/sl/preview.txt2
-rw-r--r--inc/lang/sl/pwconfirm.txt1
-rw-r--r--inc/lang/sl/read.txt1
-rw-r--r--inc/lang/sl/recent.txt2
-rw-r--r--inc/lang/sl/resetpwd.txt4
-rw-r--r--inc/lang/sl/searchpage.txt1
-rw-r--r--inc/lang/sl/stopwords.txt1
-rw-r--r--inc/lang/sl/updateprofile.txt2
-rw-r--r--inc/lang/sq/admin.txt2
-rw-r--r--inc/lang/sq/backlinks.txt2
-rw-r--r--inc/lang/sq/conflict.txt2
-rw-r--r--inc/lang/sq/denied.txt1
-rw-r--r--inc/lang/sq/diff.txt2
-rw-r--r--inc/lang/sq/draft.txt2
-rw-r--r--inc/lang/sq/edit.txt2
-rw-r--r--inc/lang/sq/editrev.txt2
-rw-r--r--inc/lang/sq/index.txt2
-rw-r--r--inc/lang/sq/install.html5
-rw-r--r--inc/lang/sq/locked.txt2
-rw-r--r--inc/lang/sq/login.txt2
-rw-r--r--inc/lang/sq/newpage.txt2
-rw-r--r--inc/lang/sq/norev.txt2
-rw-r--r--inc/lang/sq/preview.txt2
-rw-r--r--inc/lang/sq/read.txt2
-rw-r--r--inc/lang/sq/recent.txt2
-rw-r--r--inc/lang/sq/register.txt2
-rw-r--r--inc/lang/sq/resendpwd.txt2
-rw-r--r--inc/lang/sq/searchpage.txt1
-rw-r--r--inc/lang/sq/showrev.txt2
-rw-r--r--inc/lang/sq/stopwords.txt2
-rw-r--r--inc/lang/sq/updateprofile.txt2
-rw-r--r--inc/lang/sr/admin.txt3
-rw-r--r--inc/lang/sr/backlinks.txt1
-rw-r--r--inc/lang/sr/conflict.txt1
-rw-r--r--inc/lang/sr/denied.txt1
-rw-r--r--inc/lang/sr/diff.txt1
-rw-r--r--inc/lang/sr/draft.txt2
-rw-r--r--inc/lang/sr/edit.txt1
-rw-r--r--inc/lang/sr/index.txt1
-rw-r--r--inc/lang/sr/install.html13
-rw-r--r--inc/lang/sr/lang.php100
-rw-r--r--inc/lang/sr/login.txt1
-rw-r--r--inc/lang/sr/newpage.txt2
-rw-r--r--inc/lang/sr/norev.txt1
-rw-r--r--inc/lang/sr/onceexisted.txt3
-rw-r--r--inc/lang/sr/preview.txt3
-rw-r--r--inc/lang/sr/read.txt1
-rw-r--r--inc/lang/sr/recent.txt4
-rw-r--r--inc/lang/sr/register.txt1
-rw-r--r--inc/lang/sr/resendpwd.txt2
-rw-r--r--inc/lang/sr/resetpwd.txt2
-rw-r--r--inc/lang/sr/revisions.txt1
-rw-r--r--inc/lang/sr/searchpage.txt1
-rw-r--r--inc/lang/sr/updateprofile.txt2
-rw-r--r--inc/lang/sv/admin.txt1
-rw-r--r--inc/lang/sv/conflict.txt1
-rw-r--r--inc/lang/sv/denied.txt1
-rw-r--r--inc/lang/sv/diff.txt1
-rw-r--r--inc/lang/sv/draft.txt1
-rw-r--r--inc/lang/sv/edit.txt1
-rw-r--r--inc/lang/sv/index.txt1
-rw-r--r--inc/lang/sv/install.html26
-rw-r--r--inc/lang/sv/login.txt1
-rw-r--r--inc/lang/sv/newpage.txt2
-rw-r--r--inc/lang/sv/norev.txt1
-rw-r--r--inc/lang/sv/preview.txt3
-rw-r--r--inc/lang/sv/pwconfirm.txt9
-rw-r--r--inc/lang/sv/read.txt1
-rw-r--r--inc/lang/sv/recent.txt4
-rw-r--r--inc/lang/sv/register.txt1
-rw-r--r--inc/lang/sv/resendpwd.txt1
-rw-r--r--inc/lang/sv/resetpwd.txt2
-rw-r--r--inc/lang/sv/revisions.txt1
-rw-r--r--inc/lang/sv/searchpage.txt1
-rw-r--r--inc/lang/sv/stopwords.txt185
-rw-r--r--inc/lang/sv/updateprofile.txt2
-rw-r--r--inc/lang/ta/admin.txt2
-rw-r--r--inc/lang/ta/backlinks.txt2
-rw-r--r--inc/lang/ta/conflict.txt2
-rw-r--r--inc/lang/ta/denied.txt4
-rw-r--r--inc/lang/ta/diff.txt2
-rw-r--r--inc/lang/ta/draft.txt6
-rw-r--r--inc/lang/ta/edit.txt2
-rw-r--r--inc/lang/th/admin.txt2
-rw-r--r--inc/lang/th/backlinks.txt2
-rw-r--r--inc/lang/th/conflict.txt2
-rw-r--r--inc/lang/th/denied.txt1
-rw-r--r--inc/lang/th/diff.txt2
-rw-r--r--inc/lang/th/draft.txt2
-rw-r--r--inc/lang/th/edit.txt2
-rw-r--r--inc/lang/th/editrev.txt2
-rw-r--r--inc/lang/th/index.txt3
-rw-r--r--inc/lang/th/lang.php107
-rw-r--r--inc/lang/th/locked.txt2
-rw-r--r--inc/lang/th/login.txt1
-rw-r--r--inc/lang/th/newpage.txt2
-rw-r--r--inc/lang/th/norev.txt2
-rw-r--r--inc/lang/th/preview.txt2
-rw-r--r--inc/lang/th/pwconfirm.txt3
-rw-r--r--inc/lang/th/read.txt2
-rw-r--r--inc/lang/th/recent.txt2
-rw-r--r--inc/lang/th/register.txt2
-rw-r--r--inc/lang/th/resendpwd.txt2
-rw-r--r--inc/lang/th/revisions.txt2
-rw-r--r--inc/lang/th/searchpage.txt1
-rw-r--r--inc/lang/th/showrev.txt2
-rw-r--r--inc/lang/th/updateprofile.txt2
-rw-r--r--inc/lang/tr/backlinks.txt1
-rw-r--r--inc/lang/tr/conflict.txt1
-rw-r--r--inc/lang/tr/denied.txt1
-rw-r--r--inc/lang/tr/diff.txt1
-rw-r--r--inc/lang/tr/draft.txt2
-rw-r--r--inc/lang/tr/edit.txt1
-rw-r--r--inc/lang/tr/index.txt1
-rw-r--r--inc/lang/tr/install.html7
-rw-r--r--inc/lang/tr/lang.php101
-rw-r--r--inc/lang/tr/locked.txt1
-rw-r--r--inc/lang/tr/login.txt1
-rw-r--r--inc/lang/tr/newpage.txt3
-rw-r--r--inc/lang/tr/norev.txt1
-rw-r--r--inc/lang/tr/preview.txt3
-rw-r--r--inc/lang/tr/read.txt1
-rw-r--r--inc/lang/tr/recent.txt4
-rw-r--r--inc/lang/tr/register.txt1
-rw-r--r--inc/lang/tr/resetpwd.txt2
-rw-r--r--inc/lang/tr/revisions.txt1
-rw-r--r--inc/lang/tr/searchpage.txt1
-rw-r--r--inc/lang/uk/admin.txt1
-rw-r--r--inc/lang/uk/conflict.txt1
-rw-r--r--inc/lang/uk/denied.txt1
-rw-r--r--inc/lang/uk/diff.txt1
-rw-r--r--inc/lang/uk/draft.txt1
-rw-r--r--inc/lang/uk/index.txt1
-rw-r--r--inc/lang/uk/install.html22
-rw-r--r--inc/lang/uk/lang.php99
-rw-r--r--inc/lang/uk/locked.txt2
-rw-r--r--inc/lang/uk/login.txt1
-rw-r--r--inc/lang/uk/newpage.txt3
-rw-r--r--inc/lang/uk/norev.txt1
-rw-r--r--inc/lang/uk/preview.txt3
-rw-r--r--inc/lang/uk/pwconfirm.txt3
-rw-r--r--inc/lang/uk/read.txt1
-rw-r--r--inc/lang/uk/recent.txt3
-rw-r--r--inc/lang/uk/register.txt3
-rw-r--r--inc/lang/uk/resetpwd.txt2
-rw-r--r--inc/lang/uk/revisions.txt1
-rw-r--r--inc/lang/uk/searchpage.txt1
-rw-r--r--inc/lang/uk/stopwords.txt1
-rw-r--r--inc/lang/uk/updateprofile.txt2
-rw-r--r--inc/lang/vi/admin.txt2
-rw-r--r--inc/lang/vi/adminplugins.txt1
-rw-r--r--inc/lang/vi/conflict.txt6
-rw-r--r--inc/lang/vi/denied.txt5
-rw-r--r--inc/lang/vi/diff.txt1
-rw-r--r--inc/lang/vi/draft.txt5
-rw-r--r--inc/lang/vi/edit.txt2
-rw-r--r--inc/lang/vi/editrev.txt2
-rw-r--r--inc/lang/vi/index.txt2
-rw-r--r--inc/lang/vi/lang.php411
-rw-r--r--inc/lang/vi/locked.txt2
-rw-r--r--inc/lang/vi/login.txt2
-rw-r--r--inc/lang/vi/mailtext.txt18
-rw-r--r--inc/lang/vi/newpage.txt2
-rw-r--r--inc/lang/vi/norev.txt4
-rw-r--r--inc/lang/vi/onceexisted.txt3
-rw-r--r--inc/lang/vi/password.txt4
-rw-r--r--inc/lang/vi/preview.txt2
-rw-r--r--inc/lang/vi/pwconfirm.txt9
-rw-r--r--inc/lang/vi/read.txt2
-rw-r--r--inc/lang/vi/recent.txt2
-rw-r--r--inc/lang/vi/register.txt4
-rw-r--r--inc/lang/vi/registermail.txt10
-rw-r--r--inc/lang/vi/resendpwd.txt3
-rw-r--r--inc/lang/vi/resetpwd.txt3
-rw-r--r--inc/lang/vi/revisions.txt2
-rw-r--r--inc/lang/vi/searchpage.txt3
-rw-r--r--inc/lang/vi/showrev.txt2
-rw-r--r--inc/lang/vi/stopwords.txt39
-rw-r--r--inc/lang/vi/subscr_digest.txt16
-rw-r--r--inc/lang/vi/subscr_form.txt3
-rw-r--r--inc/lang/vi/subscr_list.txt13
-rw-r--r--inc/lang/vi/subscr_single.txt19
-rw-r--r--inc/lang/vi/updateprofile.txt3
-rw-r--r--inc/lang/vi/uploadmail.txt11
-rw-r--r--inc/lang/zh-tw/admin.txt2
-rw-r--r--inc/lang/zh-tw/backlinks.txt1
-rw-r--r--inc/lang/zh-tw/conflict.txt2
-rw-r--r--inc/lang/zh-tw/denied.txt1
-rw-r--r--inc/lang/zh-tw/diff.txt2
-rw-r--r--inc/lang/zh-tw/edit.txt2
-rw-r--r--inc/lang/zh-tw/index.txt2
-rw-r--r--inc/lang/zh-tw/install.html5
-rw-r--r--inc/lang/zh-tw/login.txt1
-rw-r--r--inc/lang/zh-tw/newpage.txt2
-rw-r--r--inc/lang/zh-tw/norev.txt2
-rw-r--r--inc/lang/zh-tw/preview.txt1
-rw-r--r--inc/lang/zh-tw/read.txt2
-rw-r--r--inc/lang/zh-tw/recent.txt2
-rw-r--r--inc/lang/zh-tw/register.txt2
-rw-r--r--inc/lang/zh-tw/resendpwd.txt2
-rw-r--r--inc/lang/zh-tw/resetpwd.txt2
-rw-r--r--inc/lang/zh-tw/revisions.txt2
-rw-r--r--inc/lang/zh-tw/searchpage.txt1
-rw-r--r--inc/lang/zh-tw/updateprofile.txt2
-rw-r--r--inc/lang/zh/admin.txt2
-rw-r--r--inc/lang/zh/adminplugins.txt2
-rw-r--r--inc/lang/zh/backlinks.txt2
-rw-r--r--inc/lang/zh/denied.txt1
-rw-r--r--inc/lang/zh/diff.txt2
-rw-r--r--inc/lang/zh/draft.txt2
-rw-r--r--inc/lang/zh/edit.txt2
-rw-r--r--inc/lang/zh/editrev.txt2
-rw-r--r--inc/lang/zh/index.txt2
-rw-r--r--inc/lang/zh/install.html3
-rw-r--r--inc/lang/zh/lang.php96
-rw-r--r--inc/lang/zh/locked.txt2
-rw-r--r--inc/lang/zh/newpage.txt2
-rw-r--r--inc/lang/zh/norev.txt2
-rw-r--r--inc/lang/zh/onceexisted.txt3
-rw-r--r--inc/lang/zh/preview.txt2
-rw-r--r--inc/lang/zh/read.txt1
-rw-r--r--inc/lang/zh/recent.txt2
-rw-r--r--inc/lang/zh/register.txt2
-rw-r--r--inc/lang/zh/resendpwd.txt2
-rw-r--r--inc/lang/zh/resetpwd.txt2
-rw-r--r--inc/lang/zh/revisions.txt2
-rw-r--r--inc/lang/zh/searchpage.txt1
-rw-r--r--inc/lang/zh/updateprofile.txt2
-rw-r--r--inc/legacy.php18
-rw-r--r--inc/load.php57
-rw-r--r--inc/mail.php194
-rw-r--r--inc/media.php91
-rw-r--r--inc/pageutils.php37
-rw-r--r--inc/parser/code.php16
-rw-r--r--inc/parser/handler.php1859
-rw-r--r--inc/parser/lexer.php614
-rw-r--r--inc/parser/metadata.php327
-rw-r--r--inc/parser/parser.php1025
-rw-r--r--inc/parser/renderer.php241
-rw-r--r--inc/parser/xhtml.php335
-rw-r--r--inc/parser/xhtmlsummary.php43
-rw-r--r--inc/parserutils.php81
-rw-r--r--inc/plugincontroller.class.php347
-rw-r--r--inc/pluginutils.php61
-rw-r--r--inc/search.php12
-rw-r--r--inc/subscription.php693
-rw-r--r--inc/template.php83
-rw-r--r--inc/toolbar.php36
-rw-r--r--inc/utf8.php1837
-rw-r--r--index.php8
-rw-r--r--install.php83
-rw-r--r--lib/exe/css.php131
-rw-r--r--lib/exe/detail.php21
-rw-r--r--lib/exe/fetch.php8
-rw-r--r--lib/exe/indexer.php209
-rw-r--r--lib/exe/jquery.php5
-rw-r--r--lib/exe/js.php54
-rw-r--r--lib/exe/mediamanager.php5
-rw-r--r--lib/exe/taskrunner.php16
-rw-r--r--lib/exe/xmlrpc.php66
-rw-r--r--lib/images/fileicons/32x32/svg.pngbin0 -> 980 bytes
-rw-r--r--lib/images/fileicons/index.php36
-rw-r--r--lib/images/fileicons/svg.pngbin0 -> 437 bytes
-rw-r--r--lib/images/smileys/index.php25
-rw-r--r--lib/plugins/acl/action.php46
-rw-r--r--lib/plugins/acl/admin.php435
-rw-r--r--lib/plugins/acl/lang/ar/lang.php3
-rw-r--r--lib/plugins/acl/lang/bg/lang.php2
-rw-r--r--lib/plugins/acl/lang/ca/lang.php6
-rw-r--r--lib/plugins/acl/lang/da/lang.php5
-rw-r--r--lib/plugins/acl/lang/el/lang.php2
-rw-r--r--lib/plugins/acl/lang/fa/lang.php3
-rw-r--r--lib/plugins/acl/lang/fi/lang.php5
-rw-r--r--lib/plugins/acl/lang/id/lang.php2
-rw-r--r--lib/plugins/acl/lang/is/lang.php3
-rw-r--r--lib/plugins/acl/lang/ja/lang.php6
-rw-r--r--lib/plugins/acl/lang/km/lang.php8
-rw-r--r--lib/plugins/acl/lang/lt/lang.php4
-rw-r--r--lib/plugins/acl/lang/no/lang.php3
-rw-r--r--lib/plugins/acl/lang/pt/help.txt11
-rw-r--r--lib/plugins/acl/lang/pt/lang.php31
-rw-r--r--lib/plugins/acl/lang/ro/lang.php5
-rw-r--r--lib/plugins/acl/lang/sr/lang.php3
-rw-r--r--lib/plugins/acl/lang/th/lang.php3
-rw-r--r--lib/plugins/acl/lang/tr/lang.php4
-rw-r--r--lib/plugins/acl/lang/vi/help.txt14
-rw-r--r--lib/plugins/acl/lang/vi/lang.php33
-rw-r--r--lib/plugins/acl/remote.php53
-rw-r--r--lib/plugins/acl/script.js4
-rw-r--r--lib/plugins/action.php25
-rw-r--r--lib/plugins/admin.php96
-rw-r--r--lib/plugins/auth.php438
-rw-r--r--lib/plugins/authad/action.php45
-rw-r--r--lib/plugins/authad/auth.php370
-rw-r--r--lib/plugins/authad/conf/default.php1
-rw-r--r--lib/plugins/authad/conf/metadata.php1
-rw-r--r--lib/plugins/authad/lang/ar/lang.php5
-rw-r--r--lib/plugins/authad/lang/ar/settings.php5
-rw-r--r--lib/plugins/authad/lang/bg/lang.php2
-rw-r--r--lib/plugins/authad/lang/bg/settings.php2
-rw-r--r--lib/plugins/authad/lang/ca/settings.php1
-rw-r--r--lib/plugins/authad/lang/cs/settings.php2
-rw-r--r--lib/plugins/authad/lang/da/lang.php3
-rw-r--r--lib/plugins/authad/lang/da/settings.php14
-rw-r--r--lib/plugins/authad/lang/de/settings.php2
-rw-r--r--lib/plugins/authad/lang/el/lang.php7
-rw-r--r--lib/plugins/authad/lang/el/settings.php16
-rw-r--r--lib/plugins/authad/lang/en/settings.php1
-rw-r--r--lib/plugins/authad/lang/eo/lang.php2
-rw-r--r--lib/plugins/authad/lang/eo/settings.php2
-rw-r--r--lib/plugins/authad/lang/es/settings.php2
-rw-r--r--lib/plugins/authad/lang/fi/lang.php2
-rw-r--r--lib/plugins/authad/lang/fi/settings.php2
-rw-r--r--lib/plugins/authad/lang/fr/settings.php5
-rw-r--r--lib/plugins/authad/lang/it/settings.php2
-rw-r--r--lib/plugins/authad/lang/ja/settings.php24
-rw-r--r--lib/plugins/authad/lang/nl/settings.php3
-rw-r--r--lib/plugins/authad/lang/pl/settings.php3
-rw-r--r--lib/plugins/authad/lang/pt-br/settings.php3
-rw-r--r--lib/plugins/authad/lang/pt/lang.php7
-rw-r--r--lib/plugins/authad/lang/pt/settings.php14
-rw-r--r--lib/plugins/authad/lang/ro/settings.php8
-rw-r--r--lib/plugins/authad/lang/ru/settings.php2
-rw-r--r--lib/plugins/authad/lang/sr/settings.php5
-rw-r--r--lib/plugins/authad/lang/tr/lang.php8
-rw-r--r--lib/plugins/authad/lang/tr/settings.php12
-rw-r--r--lib/plugins/authad/lang/uk/settings.php2
-rw-r--r--lib/plugins/authad/lang/vi/lang.php12
-rw-r--r--lib/plugins/authad/lang/vi/settings.php23
-rw-r--r--lib/plugins/authad/lang/zh/settings.php2
-rw-r--r--lib/plugins/authldap/auth.php501
-rw-r--r--lib/plugins/authldap/conf/default.php1
-rw-r--r--lib/plugins/authldap/conf/metadata.php1
-rw-r--r--lib/plugins/authldap/lang/ar/settings.php2
-rw-r--r--lib/plugins/authldap/lang/bg/settings.php2
-rw-r--r--lib/plugins/authldap/lang/ca/settings.php5
-rw-r--r--lib/plugins/authldap/lang/cs/settings.php2
-rw-r--r--lib/plugins/authldap/lang/da/settings.php19
-rw-r--r--lib/plugins/authldap/lang/de/settings.php2
-rw-r--r--lib/plugins/authldap/lang/el/lang.php9
-rw-r--r--lib/plugins/authldap/lang/el/settings.php32
-rw-r--r--lib/plugins/authldap/lang/en/settings.php1
-rw-r--r--lib/plugins/authldap/lang/es/settings.php3
-rw-r--r--lib/plugins/authldap/lang/fa/settings.php3
-rw-r--r--lib/plugins/authldap/lang/fi/settings.php2
-rw-r--r--lib/plugins/authldap/lang/fr/settings.php2
-rw-r--r--lib/plugins/authldap/lang/ja/settings.php35
-rw-r--r--lib/plugins/authldap/lang/nl/settings.php2
-rw-r--r--lib/plugins/authldap/lang/no/settings.php1
-rw-r--r--lib/plugins/authldap/lang/pt-br/settings.php2
-rw-r--r--lib/plugins/authldap/lang/pt/settings.php33
-rw-r--r--lib/plugins/authldap/lang/ru/settings.php7
-rw-r--r--lib/plugins/authldap/lang/sk/settings.php4
-rw-r--r--lib/plugins/authldap/lang/sr/settings.php9
-rw-r--r--lib/plugins/authldap/lang/tr/settings.php2
-rw-r--r--lib/plugins/authldap/lang/vi/lang.php9
-rw-r--r--lib/plugins/authldap/lang/vi/settings.php33
-rw-r--r--lib/plugins/authmysql/auth.php1110
-rw-r--r--lib/plugins/authmysql/conf/default.php34
-rw-r--r--lib/plugins/authmysql/conf/metadata.php34
-rw-r--r--lib/plugins/authmysql/lang/bg/lang.php10
-rw-r--r--lib/plugins/authmysql/lang/bg/settings.php19
-rw-r--r--lib/plugins/authmysql/lang/cs/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/cs/settings.php43
-rw-r--r--lib/plugins/authmysql/lang/cy/lang.php13
-rw-r--r--lib/plugins/authmysql/lang/cy/settings.php39
-rw-r--r--lib/plugins/authmysql/lang/da/lang.php12
-rw-r--r--lib/plugins/authmysql/lang/da/settings.php31
-rw-r--r--lib/plugins/authmysql/lang/de-informal/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/de-informal/settings.php43
-rw-r--r--lib/plugins/authmysql/lang/de/lang.php13
-rw-r--r--lib/plugins/authmysql/lang/de/settings.php43
-rw-r--r--lib/plugins/authmysql/lang/en/lang.php13
-rw-r--r--lib/plugins/authmysql/lang/en/settings.php39
-rw-r--r--lib/plugins/authmysql/lang/eo/lang.php8
-rw-r--r--lib/plugins/authmysql/lang/eo/settings.php41
-rw-r--r--lib/plugins/authmysql/lang/es/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/es/settings.php46
-rw-r--r--lib/plugins/authmysql/lang/eu/lang.php10
-rw-r--r--lib/plugins/authmysql/lang/eu/settings.php14
-rw-r--r--lib/plugins/authmysql/lang/fa/lang.php12
-rw-r--r--lib/plugins/authmysql/lang/fa/settings.php43
-rw-r--r--lib/plugins/authmysql/lang/fi/settings.php11
-rw-r--r--lib/plugins/authmysql/lang/fr/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/fr/settings.php42
-rw-r--r--lib/plugins/authmysql/lang/he/settings.php12
-rw-r--r--lib/plugins/authmysql/lang/hr/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/hr/settings.php42
-rw-r--r--lib/plugins/authmysql/lang/hu/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/hu/settings.php43
-rw-r--r--lib/plugins/authmysql/lang/it/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/it/settings.php46
-rw-r--r--lib/plugins/authmysql/lang/ja/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/ja/settings.php42
-rw-r--r--lib/plugins/authmysql/lang/ko/lang.php12
-rw-r--r--lib/plugins/authmysql/lang/ko/settings.php43
-rw-r--r--lib/plugins/authmysql/lang/lv/settings.php12
-rw-r--r--lib/plugins/authmysql/lang/nl/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/nl/settings.php42
-rw-r--r--lib/plugins/authmysql/lang/no/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/no/settings.php44
-rw-r--r--lib/plugins/authmysql/lang/pl/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/pl/settings.php45
-rw-r--r--lib/plugins/authmysql/lang/pt-br/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/pt-br/settings.php43
-rw-r--r--lib/plugins/authmysql/lang/pt/lang.php12
-rw-r--r--lib/plugins/authmysql/lang/pt/settings.php43
-rw-r--r--lib/plugins/authmysql/lang/ru/lang.php12
-rw-r--r--lib/plugins/authmysql/lang/ru/settings.php45
-rw-r--r--lib/plugins/authmysql/lang/sk/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/sk/settings.php42
-rw-r--r--lib/plugins/authmysql/lang/sl/settings.php11
-rw-r--r--lib/plugins/authmysql/lang/sr/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/sr/settings.php42
-rw-r--r--lib/plugins/authmysql/lang/sv/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/sv/settings.php29
-rw-r--r--lib/plugins/authmysql/lang/tr/lang.php9
-rw-r--r--lib/plugins/authmysql/lang/tr/settings.php41
-rw-r--r--lib/plugins/authmysql/lang/uk/lang.php10
-rw-r--r--lib/plugins/authmysql/lang/zh-tw/settings.php42
-rw-r--r--lib/plugins/authmysql/lang/zh/lang.php11
-rw-r--r--lib/plugins/authmysql/lang/zh/settings.php42
-rw-r--r--lib/plugins/authmysql/plugin.info.txt7
-rw-r--r--lib/plugins/authpdo/_test/mysql/mybb.sql16
-rw-r--r--lib/plugins/authpdo/_test/sqlite.test.php8
-rw-r--r--lib/plugins/authpdo/auth.php485
-rw-r--r--lib/plugins/authpdo/conf/metadata.php2
-rw-r--r--lib/plugins/authpdo/lang/bg/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/ca/lang.php10
-rw-r--r--lib/plugins/authpdo/lang/ca/settings.php8
-rw-r--r--lib/plugins/authpdo/lang/cs/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/cs/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/da/lang.php10
-rw-r--r--lib/plugins/authpdo/lang/da/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/de-informal/lang.php10
-rw-r--r--lib/plugins/authpdo/lang/de/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/de/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/el/lang.php10
-rw-r--r--lib/plugins/authpdo/lang/el/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/es/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/es/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/fa/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/fa/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/fr/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/fr/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/it/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/it/settings.php26
-rw-r--r--lib/plugins/authpdo/lang/ja/lang.php5
-rw-r--r--lib/plugins/authpdo/lang/ja/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/ko/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/ko/settings.php29
-rw-r--r--lib/plugins/authpdo/lang/nl/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/nl/settings.php26
-rw-r--r--lib/plugins/authpdo/lang/pl/lang.php10
-rw-r--r--lib/plugins/authpdo/lang/pl/settings.php17
-rw-r--r--lib/plugins/authpdo/lang/pt-br/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/pt-br/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/pt/lang.php7
-rw-r--r--lib/plugins/authpdo/lang/pt/settings.php26
-rw-r--r--lib/plugins/authpdo/lang/ru/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/ru/settings.php26
-rw-r--r--lib/plugins/authpdo/lang/sk/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/sk/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/tr/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/uk/lang.php10
-rw-r--r--lib/plugins/authpdo/lang/uk/settings.php15
-rw-r--r--lib/plugins/authpdo/lang/vi/lang.php10
-rw-r--r--lib/plugins/authpdo/lang/vi/settings.php25
-rw-r--r--lib/plugins/authpdo/lang/zh/lang.php2
-rw-r--r--lib/plugins/authpdo/lang/zh/settings.php26
-rw-r--r--lib/plugins/authpgsql/auth.php431
-rw-r--r--lib/plugins/authpgsql/conf/default.php33
-rw-r--r--lib/plugins/authpgsql/conf/metadata.php33
-rw-r--r--lib/plugins/authpgsql/lang/bg/settings.php13
-rw-r--r--lib/plugins/authpgsql/lang/cs/settings.php39
-rw-r--r--lib/plugins/authpgsql/lang/cy/settings.php33
-rw-r--r--lib/plugins/authpgsql/lang/da/settings.php22
-rw-r--r--lib/plugins/authpgsql/lang/de-informal/settings.php39
-rw-r--r--lib/plugins/authpgsql/lang/de/settings.php39
-rw-r--r--lib/plugins/authpgsql/lang/en/settings.php33
-rw-r--r--lib/plugins/authpgsql/lang/eo/settings.php37
-rw-r--r--lib/plugins/authpgsql/lang/es/settings.php41
-rw-r--r--lib/plugins/authpgsql/lang/fa/settings.php40
-rw-r--r--lib/plugins/authpgsql/lang/fr/settings.php38
-rw-r--r--lib/plugins/authpgsql/lang/hr/settings.php38
-rw-r--r--lib/plugins/authpgsql/lang/hu/settings.php39
-rw-r--r--lib/plugins/authpgsql/lang/it/settings.php40
-rw-r--r--lib/plugins/authpgsql/lang/ja/settings.php38
-rw-r--r--lib/plugins/authpgsql/lang/ko/settings.php39
-rw-r--r--lib/plugins/authpgsql/lang/lv/settings.php9
-rw-r--r--lib/plugins/authpgsql/lang/nl/settings.php38
-rw-r--r--lib/plugins/authpgsql/lang/no/settings.php38
-rw-r--r--lib/plugins/authpgsql/lang/pl/settings.php40
-rw-r--r--lib/plugins/authpgsql/lang/pt-br/settings.php39
-rw-r--r--lib/plugins/authpgsql/lang/pt/settings.php39
-rw-r--r--lib/plugins/authpgsql/lang/ru/settings.php42
-rw-r--r--lib/plugins/authpgsql/lang/sk/settings.php38
-rw-r--r--lib/plugins/authpgsql/lang/sl/settings.php16
-rw-r--r--lib/plugins/authpgsql/lang/sr/settings.php18
-rw-r--r--lib/plugins/authpgsql/lang/sv/settings.php29
-rw-r--r--lib/plugins/authpgsql/lang/tr/settings.php13
-rw-r--r--lib/plugins/authpgsql/lang/uk/settings.php8
-rw-r--r--lib/plugins/authpgsql/lang/zh-tw/settings.php38
-rw-r--r--lib/plugins/authpgsql/lang/zh/settings.php38
-rw-r--r--lib/plugins/authpgsql/plugin.info.txt7
-rw-r--r--lib/plugins/authplain/_test/conf/auth.users.php16
-rw-r--r--lib/plugins/authplain/_test/escaping.test.php6
-rw-r--r--lib/plugins/authplain/_test/userdata.test.php64
-rw-r--r--lib/plugins/authplain/auth.php205
-rw-r--r--lib/plugins/authplain/lang/ar/lang.php3
-rw-r--r--lib/plugins/authplain/lang/bg/lang.php2
-rw-r--r--lib/plugins/authplain/lang/da/lang.php3
-rw-r--r--lib/plugins/authplain/lang/el/lang.php4
-rw-r--r--lib/plugins/authplain/lang/fi/lang.php2
-rw-r--r--lib/plugins/authplain/lang/id/lang.php3
-rw-r--r--lib/plugins/authplain/lang/is/lang.php3
-rw-r--r--lib/plugins/authplain/lang/ja/lang.php5
-rw-r--r--lib/plugins/authplain/lang/km/lang.php3
-rw-r--r--lib/plugins/authplain/lang/ku/lang.php3
-rw-r--r--lib/plugins/authplain/lang/lt/lang.php3
-rw-r--r--lib/plugins/authplain/lang/pt/lang.php8
-rw-r--r--lib/plugins/authplain/lang/th/lang.php2
-rw-r--r--lib/plugins/authplain/lang/tr/lang.php2
-rw-r--r--lib/plugins/authplain/lang/vi/lang.php7
-rw-r--r--lib/plugins/cli.php11
-rw-r--r--lib/plugins/config/_test/ConfigParserTest.php (renamed from lib/plugins/config/_test/configuration.test.php)32
-rw-r--r--lib/plugins/config/_test/LoaderTest.php79
-rw-r--r--lib/plugins/config/_test/Setting/AbstractSettingTest.php99
-rw-r--r--lib/plugins/config/_test/Setting/SettingArrayTest.php20
-rw-r--r--lib/plugins/config/_test/Setting/SettingNumericTest.php24
-rw-r--r--lib/plugins/config/_test/Setting/SettingNumericoptTest.php23
-rw-r--r--lib/plugins/config/_test/Setting/SettingOnoffTest.php72
-rw-r--r--lib/plugins/config/_test/Setting/SettingStringTest.php13
-rw-r--r--lib/plugins/config/_test/Setting/SettingTest.php70
-rw-r--r--lib/plugins/config/_test/WriterTest.php63
-rw-r--r--lib/plugins/config/admin.php430
-rw-r--r--lib/plugins/config/core/ConfigParser.php90
-rw-r--r--lib/plugins/config/core/Configuration.php219
-rw-r--r--lib/plugins/config/core/Loader.php269
-rw-r--r--lib/plugins/config/core/Setting/Setting.php294
-rw-r--r--lib/plugins/config/core/Setting/SettingArray.php105
-rw-r--r--lib/plugins/config/core/Setting/SettingAuthtype.php60
-rw-r--r--lib/plugins/config/core/Setting/SettingCompression.php21
-rw-r--r--lib/plugins/config/core/Setting/SettingDirchoice.php33
-rw-r--r--lib/plugins/config/core/Setting/SettingDisableactions.php23
-rw-r--r--lib/plugins/config/core/Setting/SettingEmail.php58
-rw-r--r--lib/plugins/config/core/Setting/SettingFieldset.php17
-rw-r--r--lib/plugins/config/core/Setting/SettingHidden.php10
-rw-r--r--lib/plugins/config/core/Setting/SettingImConvert.php28
-rw-r--r--lib/plugins/config/core/Setting/SettingLicense.php23
-rw-r--r--lib/plugins/config/core/Setting/SettingMulticheckbox.php163
-rw-r--r--lib/plugins/config/core/Setting/SettingMultichoice.php71
-rw-r--r--lib/plugins/config/core/Setting/SettingNoClass.php12
-rw-r--r--lib/plugins/config/core/Setting/SettingNoDefault.php13
-rw-r--r--lib/plugins/config/core/Setting/SettingNoKnownClass.php11
-rw-r--r--lib/plugins/config/core/Setting/SettingNumeric.php42
-rw-r--r--lib/plugins/config/core/Setting/SettingNumericopt.php25
-rw-r--r--lib/plugins/config/core/Setting/SettingOnoff.php57
-rw-r--r--lib/plugins/config/core/Setting/SettingPassword.php39
-rw-r--r--lib/plugins/config/core/Setting/SettingRegex.php34
-rw-r--r--lib/plugins/config/core/Setting/SettingRenderer.php56
-rw-r--r--lib/plugins/config/core/Setting/SettingSavedir.php26
-rw-r--r--lib/plugins/config/core/Setting/SettingSepchar.php18
-rw-r--r--lib/plugins/config/core/Setting/SettingString.php32
-rw-r--r--lib/plugins/config/core/Setting/SettingUndefined.php40
-rw-r--r--lib/plugins/config/core/Writer.php116
-rw-r--r--lib/plugins/config/lang/ar/lang.php11
-rw-r--r--lib/plugins/config/lang/bg/lang.php9
-rw-r--r--lib/plugins/config/lang/ca-valencia/lang.php6
-rw-r--r--lib/plugins/config/lang/ca/lang.php19
-rw-r--r--lib/plugins/config/lang/cs/lang.php19
-rw-r--r--lib/plugins/config/lang/cy/lang.php8
-rw-r--r--lib/plugins/config/lang/da/lang.php139
-rw-r--r--lib/plugins/config/lang/de-informal/lang.php6
-rw-r--r--lib/plugins/config/lang/de/lang.php19
-rw-r--r--lib/plugins/config/lang/el/lang.php27
-rw-r--r--lib/plugins/config/lang/en/lang.php16
-rw-r--r--lib/plugins/config/lang/eo/lang.php7
-rw-r--r--lib/plugins/config/lang/es/lang.php8
-rw-r--r--lib/plugins/config/lang/eu/lang.php6
-rw-r--r--lib/plugins/config/lang/fa/lang.php26
-rw-r--r--lib/plugins/config/lang/fi/lang.php16
-rw-r--r--lib/plugins/config/lang/fr/lang.php19
-rw-r--r--lib/plugins/config/lang/gl/lang.php6
-rw-r--r--lib/plugins/config/lang/he/lang.php6
-rw-r--r--lib/plugins/config/lang/hr/lang.php6
-rw-r--r--lib/plugins/config/lang/hu/lang.php6
-rw-r--r--lib/plugins/config/lang/ia/lang.php6
-rw-r--r--lib/plugins/config/lang/id-ni/lang.php6
-rw-r--r--lib/plugins/config/lang/id/intro.txt6
-rw-r--r--lib/plugins/config/lang/is/lang.php11
-rw-r--r--lib/plugins/config/lang/it/lang.php17
-rw-r--r--lib/plugins/config/lang/ja/intro.txt4
-rw-r--r--lib/plugins/config/lang/ja/lang.php161
-rw-r--r--lib/plugins/config/lang/ko/lang.php9
-rw-r--r--lib/plugins/config/lang/la/lang.php6
-rw-r--r--lib/plugins/config/lang/lt/lang.php5
-rw-r--r--lib/plugins/config/lang/lv/lang.php6
-rw-r--r--lib/plugins/config/lang/mr/lang.php6
-rw-r--r--lib/plugins/config/lang/nl/lang.php12
-rw-r--r--lib/plugins/config/lang/no/lang.php14
-rw-r--r--lib/plugins/config/lang/pl/lang.php12
-rw-r--r--lib/plugins/config/lang/pt-br/lang.php21
-rw-r--r--lib/plugins/config/lang/pt/intro.txt4
-rw-r--r--lib/plugins/config/lang/pt/lang.php232
-rw-r--r--lib/plugins/config/lang/ro/lang.php11
-rw-r--r--lib/plugins/config/lang/ru/lang.php49
-rw-r--r--lib/plugins/config/lang/sk/lang.php17
-rw-r--r--lib/plugins/config/lang/sl/lang.php6
-rw-r--r--lib/plugins/config/lang/sq/lang.php6
-rw-r--r--lib/plugins/config/lang/sr/lang.php9
-rw-r--r--lib/plugins/config/lang/sv/lang.php6
-rw-r--r--lib/plugins/config/lang/th/lang.php5
-rw-r--r--lib/plugins/config/lang/tr/lang.php10
-rw-r--r--lib/plugins/config/lang/uk/lang.php11
-rw-r--r--lib/plugins/config/lang/vi/intro.txt7
-rw-r--r--lib/plugins/config/lang/vi/lang.php198
-rw-r--r--lib/plugins/config/lang/zh-tw/lang.php6
-rw-r--r--lib/plugins/config/lang/zh/lang.php19
-rw-r--r--lib/plugins/config/settings/config.class.php1430
-rw-r--r--lib/plugins/config/settings/config.metadata.php73
-rw-r--r--lib/plugins/config/settings/extra.class.php309
-rw-r--r--lib/plugins/extension/_test/extension.test.php54
-rw-r--r--lib/plugins/extension/action.php31
-rw-r--r--lib/plugins/extension/admin.php122
-rw-r--r--lib/plugins/extension/cli.php372
-rw-r--r--lib/plugins/extension/helper/extension.php502
-rw-r--r--lib/plugins/extension/helper/gui.php148
-rw-r--r--lib/plugins/extension/helper/list.php509
-rw-r--r--lib/plugins/extension/helper/repository.php86
-rw-r--r--lib/plugins/extension/lang/bg/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/bg/lang.php2
-rw-r--r--lib/plugins/extension/lang/ca/lang.php73
-rw-r--r--lib/plugins/extension/lang/cs/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/cy/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/da/intro_install.txt2
-rw-r--r--lib/plugins/extension/lang/da/intro_plugins.txt2
-rw-r--r--lib/plugins/extension/lang/da/intro_search.txt1
-rw-r--r--lib/plugins/extension/lang/da/intro_templates.txt2
-rw-r--r--lib/plugins/extension/lang/da/lang.php63
-rw-r--r--lib/plugins/extension/lang/de-informal/intro_plugins.txt2
-rw-r--r--lib/plugins/extension/lang/de-informal/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/de-informal/lang.php10
-rw-r--r--lib/plugins/extension/lang/de/intro_plugins.txt2
-rw-r--r--lib/plugins/extension/lang/de/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/de/lang.php13
-rw-r--r--lib/plugins/extension/lang/el/intro_install.txt1
-rw-r--r--lib/plugins/extension/lang/el/intro_plugins.txt1
-rw-r--r--lib/plugins/extension/lang/el/intro_search.txt1
-rw-r--r--lib/plugins/extension/lang/el/intro_templates.txt1
-rw-r--r--lib/plugins/extension/lang/el/lang.php89
-rw-r--r--lib/plugins/extension/lang/en/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/en/lang.php1
-rw-r--r--lib/plugins/extension/lang/eo/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/es/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/fa/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/fi/lang.php2
-rw-r--r--lib/plugins/extension/lang/fr/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/fr/lang.php7
-rw-r--r--lib/plugins/extension/lang/hr/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/hu/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/it/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/ja/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/ja/lang.php33
-rw-r--r--lib/plugins/extension/lang/ko/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/nl/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/no/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/pl/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/pt-br/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/pt-br/lang.php3
-rw-r--r--lib/plugins/extension/lang/pt/intro_install.txt2
-rw-r--r--lib/plugins/extension/lang/pt/intro_plugins.txt2
-rw-r--r--lib/plugins/extension/lang/pt/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/pt/intro_templates.txt2
-rw-r--r--lib/plugins/extension/lang/pt/lang.php54
-rw-r--r--lib/plugins/extension/lang/ru/intro_install.txt2
-rw-r--r--lib/plugins/extension/lang/ru/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/ru/lang.php6
-rw-r--r--lib/plugins/extension/lang/sk/intro_install.txt1
-rw-r--r--lib/plugins/extension/lang/sk/intro_plugins.txt1
-rw-r--r--lib/plugins/extension/lang/sk/intro_search.txt1
-rw-r--r--lib/plugins/extension/lang/sk/intro_templates.txt1
-rw-r--r--lib/plugins/extension/lang/sk/lang.php43
-rw-r--r--lib/plugins/extension/lang/tr/lang.php2
-rw-r--r--lib/plugins/extension/lang/uk/lang.php38
-rw-r--r--lib/plugins/extension/lang/vi/intro_install.txt1
-rw-r--r--lib/plugins/extension/lang/vi/intro_plugins.txt1
-rw-r--r--lib/plugins/extension/lang/vi/intro_search.txt1
-rw-r--r--lib/plugins/extension/lang/vi/intro_templates.txt1
-rw-r--r--lib/plugins/extension/lang/vi/lang.php96
-rw-r--r--lib/plugins/extension/lang/zh/intro_search.txt2
-rw-r--r--lib/plugins/extension/lang/zh/lang.php35
-rw-r--r--lib/plugins/extension/script.js14
-rw-r--r--lib/plugins/info/syntax.php119
-rw-r--r--lib/plugins/popularity/action.php42
-rw-r--r--lib/plugins/popularity/admin.php73
-rw-r--r--lib/plugins/popularity/helper.php194
-rw-r--r--lib/plugins/popularity/lang/ar/lang.php3
-rw-r--r--lib/plugins/popularity/lang/bg/lang.php2
-rw-r--r--lib/plugins/popularity/lang/ca/lang.php6
-rw-r--r--lib/plugins/popularity/lang/da/intro.txt2
-rw-r--r--lib/plugins/popularity/lang/da/lang.php3
-rw-r--r--lib/plugins/popularity/lang/el/lang.php2
-rw-r--r--lib/plugins/popularity/lang/fa/lang.php3
-rw-r--r--lib/plugins/popularity/lang/fi/lang.php2
-rw-r--r--lib/plugins/popularity/lang/is/lang.php3
-rw-r--r--lib/plugins/popularity/lang/lt/lang.php4
-rw-r--r--lib/plugins/popularity/lang/no/lang.php3
-rw-r--r--lib/plugins/popularity/lang/pt/intro.txt6
-rw-r--r--lib/plugins/popularity/lang/pt/lang.php5
-rw-r--r--lib/plugins/popularity/lang/ro/lang.php4
-rw-r--r--lib/plugins/popularity/lang/sr/lang.php3
-rw-r--r--lib/plugins/popularity/lang/th/lang.php3
-rw-r--r--lib/plugins/popularity/lang/tr/lang.php4
-rw-r--r--lib/plugins/popularity/lang/vi/intro.txt9
-rw-r--r--lib/plugins/popularity/lang/vi/lang.php14
-rw-r--r--lib/plugins/popularity/lang/vi/submitted.txt3
-rw-r--r--lib/plugins/remote.php104
-rw-r--r--lib/plugins/revert/admin.php89
-rw-r--r--lib/plugins/revert/lang/ar/lang.php4
-rw-r--r--lib/plugins/revert/lang/bg/lang.php2
-rw-r--r--lib/plugins/revert/lang/ca/lang.php6
-rw-r--r--lib/plugins/revert/lang/cs/lang.php4
-rw-r--r--lib/plugins/revert/lang/da/intro.txt2
-rw-r--r--lib/plugins/revert/lang/da/lang.php3
-rw-r--r--lib/plugins/revert/lang/el/lang.php2
-rw-r--r--lib/plugins/revert/lang/fa/lang.php3
-rw-r--r--lib/plugins/revert/lang/fi/lang.php5
-rw-r--r--lib/plugins/revert/lang/is/lang.php3
-rw-r--r--lib/plugins/revert/lang/ja/lang.php7
-rw-r--r--lib/plugins/revert/lang/ko/lang.php2
-rw-r--r--lib/plugins/revert/lang/no/lang.php8
-rw-r--r--lib/plugins/revert/lang/pt/intro.txt4
-rw-r--r--lib/plugins/revert/lang/pt/lang.php11
-rw-r--r--lib/plugins/revert/lang/ro/lang.php5
-rw-r--r--lib/plugins/revert/lang/ru/intro.txt2
-rw-r--r--lib/plugins/revert/lang/ru/lang.php4
-rw-r--r--lib/plugins/revert/lang/sr/lang.php3
-rw-r--r--lib/plugins/revert/lang/th/lang.php5
-rw-r--r--lib/plugins/revert/lang/tr/lang.php4
-rw-r--r--lib/plugins/revert/lang/vi/intro.txt3
-rw-r--r--lib/plugins/revert/lang/vi/lang.php17
-rw-r--r--lib/plugins/safefnrecode/action.php56
-rw-r--r--lib/plugins/styling/action.php35
-rw-r--r--lib/plugins/styling/admin.php100
-rw-r--r--lib/plugins/styling/iris.js1488
-rw-r--r--lib/plugins/styling/lang/bg/lang.php2
-rw-r--r--lib/plugins/styling/lang/ca/lang.php18
-rw-r--r--lib/plugins/styling/lang/da/intro.txt2
-rw-r--r--lib/plugins/styling/lang/da/lang.php23
-rw-r--r--lib/plugins/styling/lang/el/lang.php21
-rw-r--r--lib/plugins/styling/lang/ja/lang.php3
-rw-r--r--lib/plugins/styling/lang/no/lang.php1
-rw-r--r--lib/plugins/styling/lang/oc/lang.php11
-rw-r--r--lib/plugins/styling/lang/pt/intro.txt2
-rw-r--r--lib/plugins/styling/lang/pt/lang.php8
-rw-r--r--lib/plugins/styling/lang/ru/lang.php3
-rw-r--r--lib/plugins/styling/lang/sk/lang.php5
-rw-r--r--lib/plugins/styling/lang/uk/lang.php13
-rw-r--r--lib/plugins/styling/lang/vi/intro.txt2
-rw-r--r--lib/plugins/styling/lang/vi/lang.php23
-rw-r--r--lib/plugins/styling/popup.php5
-rw-r--r--lib/plugins/styling/script.js15
-rw-r--r--lib/plugins/syntax.php134
-rw-r--r--lib/plugins/testing/action.php10
-rw-r--r--lib/plugins/testing/conf/default.php7
-rw-r--r--lib/plugins/testing/conf/metadata.php7
-rw-r--r--lib/plugins/testing/lang/en/settings.php5
-rw-r--r--lib/plugins/usermanager/_test/csv_import.test.php45
-rw-r--r--lib/plugins/usermanager/_test/mocks.class.php12
-rw-r--r--lib/plugins/usermanager/admin.php744
-rw-r--r--lib/plugins/usermanager/lang/ar/lang.php3
-rw-r--r--lib/plugins/usermanager/lang/bg/lang.php2
-rw-r--r--lib/plugins/usermanager/lang/ca/lang.php18
-rw-r--r--lib/plugins/usermanager/lang/cs/lang.php3
-rw-r--r--lib/plugins/usermanager/lang/da/import.txt14
-rw-r--r--lib/plugins/usermanager/lang/da/lang.php53
-rw-r--r--lib/plugins/usermanager/lang/el/lang.php29
-rw-r--r--lib/plugins/usermanager/lang/fa/lang.php3
-rw-r--r--lib/plugins/usermanager/lang/fi/lang.php5
-rw-r--r--lib/plugins/usermanager/lang/id/lang.php2
-rw-r--r--lib/plugins/usermanager/lang/is/lang.php3
-rw-r--r--lib/plugins/usermanager/lang/ja/import.txt6
-rw-r--r--lib/plugins/usermanager/lang/ja/lang.php14
-rw-r--r--lib/plugins/usermanager/lang/lt/lang.php4
-rw-r--r--lib/plugins/usermanager/lang/no/lang.php3
-rw-r--r--lib/plugins/usermanager/lang/oc/lang.php41
-rw-r--r--lib/plugins/usermanager/lang/oc/list.txt1
-rw-r--r--lib/plugins/usermanager/lang/pt/add.txt2
-rw-r--r--lib/plugins/usermanager/lang/pt/delete.txt2
-rw-r--r--lib/plugins/usermanager/lang/pt/edit.txt2
-rw-r--r--lib/plugins/usermanager/lang/pt/import.txt14
-rw-r--r--lib/plugins/usermanager/lang/pt/intro.txt2
-rw-r--r--lib/plugins/usermanager/lang/pt/lang.php95
-rw-r--r--lib/plugins/usermanager/lang/pt/list.txt2
-rw-r--r--lib/plugins/usermanager/lang/ro/lang.php5
-rw-r--r--lib/plugins/usermanager/lang/ru/import.txt12
-rw-r--r--lib/plugins/usermanager/lang/ru/lang.php10
-rw-r--r--lib/plugins/usermanager/lang/sk/lang.php2
-rw-r--r--lib/plugins/usermanager/lang/sr/lang.php3
-rw-r--r--lib/plugins/usermanager/lang/th/lang.php3
-rw-r--r--lib/plugins/usermanager/lang/tr/lang.php4
-rw-r--r--lib/plugins/usermanager/lang/vi/add.txt1
-rw-r--r--lib/plugins/usermanager/lang/vi/delete.txt1
-rw-r--r--lib/plugins/usermanager/lang/vi/edit.txt1
-rw-r--r--lib/plugins/usermanager/lang/vi/import.txt8
-rw-r--r--lib/plugins/usermanager/lang/vi/intro.txt1
-rw-r--r--lib/plugins/usermanager/lang/vi/lang.php74
-rw-r--r--lib/plugins/usermanager/lang/vi/list.txt1
-rw-r--r--lib/plugins/usermanager/script.js2
-rw-r--r--lib/scripts/behaviour.js24
-rw-r--r--lib/scripts/cookie.js13
-rw-r--r--lib/scripts/edit.js11
-rw-r--r--lib/scripts/editor.js4
-rw-r--r--lib/scripts/fileuploaderextended.js2
-rw-r--r--lib/scripts/jquery/jquery-migrate.min.js2
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_95_fef1ec_1x400.pngbin0 -> 390 bytes
-rw-r--r--lib/scripts/jquery/jquery.cookie.js82
-rw-r--r--lib/scripts/jquery/jquery.min.js6
-rwxr-xr-xlib/scripts/jquery/update.sh2
-rw-r--r--lib/scripts/jquery/versions3
-rw-r--r--lib/scripts/linkwiz.js2
-rw-r--r--lib/scripts/locktimer.js60
-rw-r--r--lib/scripts/media.js10
-rw-r--r--lib/scripts/page.js23
-rw-r--r--lib/scripts/qsearch.js4
-rw-r--r--lib/scripts/script.js2
-rw-r--r--lib/scripts/search.js6
-rw-r--r--lib/tpl/dokuwiki/css/_edit.css1
-rw-r--r--lib/tpl/dokuwiki/css/_tabs.css1
-rw-r--r--lib/tpl/dokuwiki/css/basic.less4
-rw-r--r--lib/tpl/dokuwiki/css/design.less20
-rw-r--r--lib/tpl/dokuwiki/css/pagetools.less4
-rw-r--r--lib/tpl/dokuwiki/images/pagetools-build.php2
-rw-r--r--lib/tpl/dokuwiki/lang/bg/lang.php2
-rw-r--r--lib/tpl/dokuwiki/lang/cs/lang.php2
-rw-r--r--lib/tpl/dokuwiki/lang/da/lang.php16
-rw-r--r--lib/tpl/dokuwiki/lang/da/style.txt1
-rw-r--r--lib/tpl/dokuwiki/lang/de/lang.php2
-rw-r--r--lib/tpl/dokuwiki/lang/el/lang.php16
-rw-r--r--lib/tpl/dokuwiki/lang/el/style.txt1
-rw-r--r--lib/tpl/dokuwiki/lang/fa/lang.php1
-rw-r--r--lib/tpl/dokuwiki/lang/it/lang.php2
-rw-r--r--lib/tpl/dokuwiki/lang/ja/lang.php2
-rw-r--r--lib/tpl/dokuwiki/lang/ko/lang.php2
-rw-r--r--lib/tpl/dokuwiki/lang/oc/lang.php10
-rw-r--r--lib/tpl/dokuwiki/lang/pl/lang.php2
-rw-r--r--lib/tpl/dokuwiki/lang/pt-br/lang.php1
-rw-r--r--lib/tpl/dokuwiki/lang/pt/lang.php16
-rw-r--r--lib/tpl/dokuwiki/lang/pt/style.txt1
-rw-r--r--lib/tpl/dokuwiki/lang/sk/lang.php6
-rw-r--r--lib/tpl/dokuwiki/lang/vi/lang.php16
-rw-r--r--lib/tpl/dokuwiki/lang/vi/style.txt4
-rw-r--r--lib/tpl/dokuwiki/lang/zh/lang.php2
-rw-r--r--lib/tpl/dokuwiki/main.php1
-rw-r--r--lib/tpl/dokuwiki/script.js16
-rw-r--r--lib/tpl/dokuwiki/tpl_footer.php3
-rw-r--r--lib/tpl/index.php11
-rw-r--r--vendor/.htaccess4
-rw-r--r--vendor/composer/ClassLoader.php8
-rw-r--r--vendor/composer/autoload_files.php1
-rw-r--r--vendor/composer/autoload_real.php3
-rw-r--r--vendor/composer/autoload_static.php1
-rw-r--r--vendor/composer/installed.json449
-rw-r--r--vendor/geshi/geshi/.gitignore6
-rw-r--r--vendor/geshi/geshi/CHANGELOG20
-rw-r--r--vendor/geshi/geshi/README.md2
-rw-r--r--vendor/geshi/geshi/THANKS3
-rw-r--r--vendor/geshi/geshi/build.xml4
-rw-r--r--vendor/geshi/geshi/composer.json2
-rw-r--r--vendor/geshi/geshi/src/geshi.php45
-rw-r--r--vendor/geshi/geshi/src/geshi/4cs.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/6502acme.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/6502kickass.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/6502tasm.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/68000devpac.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/abap.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/actionscript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/actionscript3.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/ada.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/aimms.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/algol68.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/apache.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/applescript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/apt_sources.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/arm.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/asm.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/asp.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/asymptote.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/autoconf.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/autohotkey.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/autoit.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/avisynth.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/awk.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/bascomavr.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/bash.php25
-rw-r--r--vendor/geshi/geshi/src/geshi/basic4gl.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/batch.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/bf.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/biblatex.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/bibtex.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/blitzbasic.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/bnf.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/boo.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/c.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/c_loadrunner.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/c_mac.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/c_winapi.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/caddcl.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/cadlisp.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/ceylon.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/cfdg.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/cfm.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/chaiscript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/chapel.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/cil.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/clojure.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/cmake.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/cobol.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/coffeescript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/cpp-qt.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/cpp-winapi.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/cpp.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/csharp.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/css.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/cuesheet.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/d.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/dart.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/dcl.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/dcpu16.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/dcs.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/delphi.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/diff.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/div.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/dos.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/dot.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/e.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/ecmascript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/eiffel.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/email.php60
-rw-r--r--vendor/geshi/geshi/src/geshi/epc.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/erlang.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/euphoria.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/ezt.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/f1.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/falcon.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/fo.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/fortran.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/freebasic.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/freeswitch.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/fsharp.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/gambas.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/gdb.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/genero.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/genie.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/gettext.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/glsl.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/gml.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/gnuplot.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/go.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/groovy.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/gwbasic.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/haskell.php16
-rw-r--r--vendor/geshi/geshi/src/geshi/haxe.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/hicest.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/hq9plus.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/html4strict.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/html5.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/icon.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/idl.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/ini.php4
-rw-r--r--vendor/geshi/geshi/src/geshi/inno.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/intercal.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/io.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/ispfpanel.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/j.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/java.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/java5.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/javascript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/jcl.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/jquery.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/julia.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/kixtart.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/klonec.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/klonecpp.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/kotlin.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/latex.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/lb.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/ldif.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/lisp.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/llvm.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/locobasic.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/logtalk.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/lolcode.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/lotusformulas.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/lotusscript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/lscript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/lsl2.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/lua.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/m68k.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/magiksf.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/make.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/mapbasic.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/mathematica.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/matlab.php45
-rw-r--r--vendor/geshi/geshi/src/geshi/mercury.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/metapost.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/mirc.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/mk-61.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/mmix.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/modula2.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/modula3.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/mpasm.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/mxml.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/mysql.php20
-rw-r--r--vendor/geshi/geshi/src/geshi/nagios.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/netrexx.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/newlisp.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/nginx.php9
-rw-r--r--vendor/geshi/geshi/src/geshi/nimrod.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/nsis.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/oberon2.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/objc.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/objeck.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/ocaml-brief.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/ocaml.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/octave.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/oobas.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/oorexx.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/oracle11.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/oracle8.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/oxygene.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/oz.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/parasail.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/parigp.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/pascal.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/pcre.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/per.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/perl.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/perl6.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/pf.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/phix.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/php-brief.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/php.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/pic16.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/pike.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/pixelbender.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/pli.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/plsql.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/postgresql.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/postscript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/povray.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/powerbuilder.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/powershell.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/proftpd.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/progress.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/prolog.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/properties.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/providex.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/purebasic.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/pycon.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/pys60.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/python.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/q.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/qbasic.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/qml.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/racket.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/rails.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/rbs.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/rebol.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/reg.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/rexx.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/robots.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/roff.php510
-rw-r--r--vendor/geshi/geshi/src/geshi/rpmspec.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/rsplus.php4
-rw-r--r--vendor/geshi/geshi/src/geshi/ruby.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/rust.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/sas.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/sass.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/scala.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/scheme.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/scilab.php4
-rw-r--r--vendor/geshi/geshi/src/geshi/scl.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/sdlbasic.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/smalltalk.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/smarty.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/spark.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/sparql.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/sql.php6
-rw-r--r--vendor/geshi/geshi/src/geshi/sshconfig.php165
-rw-r--r--vendor/geshi/geshi/src/geshi/standardml.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/stonescript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/swift.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/systemverilog.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/tcl.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/tclegg.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/teraterm.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/texgraph.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/text.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/thinbasic.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/tsql.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/twig.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/typoscript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/unicon.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/upc.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/urbi.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/uscript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/vala.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/vb.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/vbnet.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/vbscript.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/vedit.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/verilog.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/vhdl.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/vim.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/visualfoxpro.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/visualprolog.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/whitespace.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/whois.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/winbatch.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/wolfram.php967
-rw-r--r--vendor/geshi/geshi/src/geshi/xbasic.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/xml.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/xojo.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/xorg_conf.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/xpp.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/yaml.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/z80.php2
-rw-r--r--vendor/geshi/geshi/src/geshi/zxbasic.php2
-rw-r--r--vendor/marcusschwarz/lesserphp/HISTORY.md7
-rw-r--r--vendor/marcusschwarz/lesserphp/README.md4
-rw-r--r--vendor/marcusschwarz/lesserphp/lessc.inc.php14
-rw-r--r--vendor/openpsa/universalfeedcreator/composer.json5
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/AtomCreator03.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/AtomCreator10.php15
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/FeedCreator.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/GPXCreator.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/HTMLCreator.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/JSCreator.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/KMLCreator.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/MBOXCreator.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/OPMLCreator.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/PHPCreator.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/PIECreator01.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator091.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator10.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator20.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Element/FeedDate.php8
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Element/FeedHtmlField.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Element/FeedImage.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Element/FeedItem.php1
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/Element/HtmlDescribable.php2
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/UniversalFeedCreator.php11
-rw-r--r--vendor/openpsa/universalfeedcreator/lib/constants.php10
-rw-r--r--vendor/paragonie/random_compat/composer.json1
-rw-r--r--vendor/paragonie/random_compat/lib/byte_safe_strings.php34
-rw-r--r--vendor/paragonie/random_compat/lib/cast_to_int.php16
-rw-r--r--vendor/paragonie/random_compat/lib/error_polyfill.php14
-rw-r--r--vendor/paragonie/random_compat/lib/random.php26
-rw-r--r--vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php23
-rw-r--r--vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php79
-rw-r--r--vendor/paragonie/random_compat/lib/random_bytes_libsodium.php17
-rw-r--r--vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php13
-rw-r--r--vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php20
-rw-r--r--vendor/paragonie/random_compat/lib/random_int.php16
-rw-r--r--vendor/paragonie/random_compat/psalm-autoload.php9
-rw-r--r--vendor/paragonie/random_compat/psalm.xml18
-rw-r--r--vendor/phpseclib/phpseclib/BACKERS.md8
-rw-r--r--vendor/phpseclib/phpseclib/LICENSE5
-rw-r--r--vendor/phpseclib/phpseclib/README.md20
-rw-r--r--vendor/phpseclib/phpseclib/appveyor.yml27
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php18
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/Crypt/Hash.php121
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php180
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php5
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php175
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/File/X509.php64
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php30
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/Net/SCP.php5
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php123
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/Net/SSH1.php3
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php904
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php79
-rw-r--r--vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php93
-rw-r--r--vendor/simplepie/simplepie/CHANGELOG.md134
-rw-r--r--vendor/simplepie/simplepie/LICENSE.txt2
-rw-r--r--vendor/simplepie/simplepie/README.markdown8
-rw-r--r--vendor/simplepie/simplepie/autoloader.php6
-rw-r--r--vendor/simplepie/simplepie/composer.json23
-rw-r--r--vendor/simplepie/simplepie/idn/idna_convert.class.php36
-rwxr-xr-xvendor/simplepie/simplepie/library/SimplePie.php192
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Author.php25
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache.php6
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/Base.php6
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/DB.php6
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/File.php8
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/Memcache.php6
-rwxr-xr-xvendor/simplepie/simplepie/library/SimplePie/Cache/Memcached.php6
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/MySQL.php34
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Cache/Redis.php6
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Caption.php37
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Category.php6
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php43
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Copyright.php19
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Core.php6
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Credit.php25
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php19
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Enclosure.php229
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Exception.php6
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/File.php10
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/HTTP/Parser.php22
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/IRI.php161
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Item.php147
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Locator.php37
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Misc.php61
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Net/IPv6.php26
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Parse/Date.php100
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Parser.php118
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Rating.php18
-rwxr-xr-xvendor/simplepie/simplepie/library/SimplePie/Registry.php6
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Restriction.php24
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Sanitize.php17
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/Source.php103
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php18
-rw-r--r--vendor/simplepie/simplepie/library/SimplePie/gzdecode.php18
-rw-r--r--vendor/splitbrain/php-archive/src/Archive.php29
-rw-r--r--vendor/splitbrain/php-archive/src/ArchiveCorruptedException.php10
-rw-r--r--vendor/splitbrain/php-archive/src/ArchiveIOException.php10
-rw-r--r--vendor/splitbrain/php-archive/src/ArchiveIllegalCompressionException.php10
-rw-r--r--vendor/splitbrain/php-archive/src/FileInfo.php4
-rw-r--r--vendor/splitbrain/php-archive/src/FileInfoException.php10
-rw-r--r--vendor/splitbrain/php-archive/src/Tar.php53
-rw-r--r--vendor/splitbrain/php-archive/src/Zip.php22
-rw-r--r--vendor/splitbrain/php-cli/README.md4
-rw-r--r--vendor/splitbrain/php-cli/src/CLI.php70
-rw-r--r--vendor/splitbrain/php-cli/src/Exception.php2
-rw-r--r--vendor/splitbrain/php-cli/src/Options.php8
-rw-r--r--vendor/splitbrain/php-cli/src/TableFormatter.php38
2589 files changed, 39403 insertions, 32015 deletions
diff --git a/.github/workflows/phpCS.yml b/.github/workflows/phpCS.yml
new file mode 100644
index 000000000..fd46c4682
--- /dev/null
+++ b/.github/workflows/phpCS.yml
@@ -0,0 +1,22 @@
+name: PHP Code Style
+
+on: [push, pull_request]
+
+jobs:
+ phpcs:
+ name: PHP CodeSniffer
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+
+ - name: Setup PHP
+ uses: shivammathur/setup-php@7b8bf7af6a42e028cbcccf623bb8499b4d6edf02
+ with:
+ php-version: '7.4'
+ coverage: none
+
+ - name: Download PHPCS
+ run: wget https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar
+
+ - name: run PHP codesniffer
+ run: php phpcs.phar -v --standard=_test/phpcs_MigrationAdjustments.xml
diff --git a/.htaccess.dist b/.htaccess.dist
index d8845e781..3e96a8388 100644
--- a/.htaccess.dist
+++ b/.htaccess.dist
@@ -4,10 +4,10 @@
## make sure nobody gets the htaccess, README, COPYING or VERSION files
<Files ~ "^([\._]ht|README$|VERSION$|COPYING$)">
- <IfModule mod_authz_host>
+ <IfModule mod_authz_core.c>
Require all denied
</IfModule>
- <IfModule !mod_authz_host>
+ <IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
diff --git a/.travis.yml b/.travis.yml
index 44affc5ee..ca2493016 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,6 +2,7 @@ language: php
sudo: false
php:
- "nightly"
+ - "7.3"
- "7.2"
- "7.1"
- "7.0"
@@ -11,27 +12,11 @@ env:
- DISABLE_FUNCTIONS="gzopen"
matrix:
fast_finish: true
- include:
- - php: hhvm
- sudo: true
- dist: trusty
- group: edge # until the next update
- addons:
- apt:
- packages:
- - mysql-server-5.6
- - mysql-client-core-5.6
- - mysql-client-5.6
- services:
- - mysql
- - postgresql
- env: DISABLE_FUNCTIONS=
allow_failures:
- - php: "hhvm"
- php: "nightly"
- exclude:
- - php: "hhvm"
- env: DISABLE_FUNCTIONS="gzopen"
+services:
+ - mysql
+ - postgresql
notifications:
irc:
channels:
@@ -39,12 +24,11 @@ notifications:
on_success: change
on_failure: change
install:
- - wget -O ~/.phpenv/versions/hhvm/bin/phpunit https://phar.phpunit.de/phpunit-5.7.phar
- - chmod 755 ~/.phpenv/versions/hhvm/bin/phpunit
+ - php _test/fetchphpunit.php
before_script:
- # Disable the HHVM JIT for faster Unit Testing
- - if [[ $TRAVIS_PHP_VERSION = hhv* ]]; then echo 'hhvm.jit = 0' >> /etc/hhvm/php.ini; fi
- - if [[ $TRAVIS_PHP_VERSION != hhv* ]]; then test -z "$DISABLE_FUNCTIONS" || echo "disable_functions=$DISABLE_FUNCTIONS" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini; fi
+ - test -z "$DISABLE_FUNCTIONS" || echo "disable_functions=$DISABLE_FUNCTIONS" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
- cp _test/mysql.conf.php.dist _test/mysql.conf.php
- cp _test/pgsql.conf.php.dist _test/pgsql.conf.php
-script: cd _test && phpunit --verbose --stderr
+ - ./_test/phpunit.phar --version
+script:
+ - cd _test && ./phpunit.phar --verbose --stderr
diff --git a/README b/README
index 3e7cb62ad..380f353d6 100644
--- a/README
+++ b/README
@@ -1,10 +1,10 @@
All documentation for DokuWiki is available online
-at http://www.dokuwiki.org/
+at https://www.dokuwiki.org/
For Installation Instructions see
-http://www.dokuwiki.org/install
+https://www.dokuwiki.org/install
-DokuWiki - 2004-2018 (c) Andreas Gohr <andi@splitbrain.org>
+DokuWiki - 2004-2020 (c) Andreas Gohr <andi@splitbrain.org>
and the DokuWiki Community
See COPYING and file headers for license info
diff --git a/_cs/DokuWiki/Sniffs/Functions/OpeningFunctionBraceSniff.php b/_cs/DokuWiki/Sniffs/Functions/OpeningFunctionBraceSniff.php
deleted file mode 100644
index 6c582b3af..000000000
--- a/_cs/DokuWiki/Sniffs/Functions/OpeningFunctionBraceSniff.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-/**
- * Generic_Sniffs_Functions_OpeningFunctionBraceKernighanRitchieSniff.
- */
-
-class DokuWiki_Sniffs_Functions_OpeningFunctionBraceSniff implements PHP_CodeSniffer_Sniff {
-
-
- /**
- * Registers the tokens that this sniff wants to listen for.
- *
- * @return void
- */
- public function register()
- {
- return array(T_FUNCTION);
-
- }//end register()
-
-
- /**
- * Processes this test, when one of its tokens is encountered.
- *
- * @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
- * @param int $stackPtr The position of the current token in the
- * stack passed in $tokens.
- *
- * @return void
- */
- public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
- {
- $tokens = $phpcsFile->getTokens();
-
- if (isset($tokens[$stackPtr]['scope_opener']) === false) {
- return;
- }
-
- $openingBrace = $tokens[$stackPtr]['scope_opener'];
-
- // The end of the function occurs at the end of the argument list. Its
- // like this because some people like to break long function declarations
- // over multiple lines.
- $functionLine = $tokens[$tokens[$stackPtr]['parenthesis_closer']]['line'];
- $braceLine = $tokens[$openingBrace]['line'];
-
- $lineDifference = ($braceLine - $functionLine);
-
- if ($lineDifference > 0) {
- $error = 'Opening brace should be on the same line as the declaration';
- $phpcsFile->addError($error, $openingBrace);
- return;
- }
-
- // Checks that the closing parenthesis and the opening brace are
- // separated by a whitespace character.
- $closerColumn = $tokens[$tokens[$stackPtr]['parenthesis_closer']]['column'];
- $braceColumn = $tokens[$openingBrace]['column'];
-
- $columnDifference = ($braceColumn - $closerColumn);
-
- if ($columnDifference > 2) {
- $error = 'Expected 0 or 1 space between the closing parenthesis and the opening brace; found '.($columnDifference - 1).'.';
- $phpcsFile->addError($error, $openingBrace);
- return;
- }
-
- // Check that a tab was not used instead of a space.
- $spaceTokenPtr = ($tokens[$stackPtr]['parenthesis_closer'] + 1);
- $spaceContent = $tokens[$spaceTokenPtr]['content'];
- if ($columnDifference == 2 && $spaceContent !== ' ') {
- $error = 'Expected a none or a single space character between closing parenthesis and opening brace; found "'.$spaceContent.'".';
- $phpcsFile->addError($error, $openingBrace);
- return;
- }
-
- }//end process()
-
-
-}//end class
-
-?>
diff --git a/_cs/DokuWiki/Sniffs/NamingConventions/ConstructorNameSniff.php b/_cs/DokuWiki/Sniffs/NamingConventions/ConstructorNameSniff.php
deleted file mode 100644
index 7dd6d9366..000000000
--- a/_cs/DokuWiki/Sniffs/NamingConventions/ConstructorNameSniff.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?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
deleted file mode 100644
index c15a5be02..000000000
--- a/_cs/DokuWiki/Sniffs/PHP/DeprecatedFunctionsSniff.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?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)
- */
- public $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',
- 'p_cached_xhtml' => 'p_cached_output',
- );
-
- /**
- * 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
deleted file mode 100644
index bd51b1166..000000000
--- a/_cs/DokuWiki/Sniffs/PHP/DiscouragedFunctionsSniff.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?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_DiscouragedFunctionsSniff 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)
- */
- public $forbiddenFunctions = array(
- 'date' => 'dformat',
- 'strftime' => 'dformat',
- );
-
- /**
- * If true, an error will be thrown; otherwise a warning.
- *
- * @var bool
- */
- public $error = false;
-
-}//end class
diff --git a/_cs/DokuWiki/Sniffs/WhiteSpace/ScopeIndentSniff.php b/_cs/DokuWiki/Sniffs/WhiteSpace/ScopeIndentSniff.php
deleted file mode 100644
index 72064bda0..000000000
--- a/_cs/DokuWiki/Sniffs/WhiteSpace/ScopeIndentSniff.php
+++ /dev/null
@@ -1,319 +0,0 @@
-<?php
-/**
- * DokuWiki_Sniffs_Whitespace_ScopeIndentSniff based on
- * Generic_Sniffs_Whitespace_ScopeIndentSniff.
- *
- * PHP version 5
- *
- * @category PHP
- * @package PHP_CodeSniffer
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Greg Sherwood <gsherwood@squiz.net>
- * @author Marc McIntyre <mmcintyre@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: ScopeIndentSniff.php 270281 2008-12-02 02:38:34Z squiz $
- * @link http://pear.php.net/package/PHP_CodeSniffer
- */
-
-/**
- * Generic_Sniffs_Whitespace_ScopeIndentSniff.
- *
- * Checks that control structures are structured correctly, and their content
- * is indented correctly.
- *
- * @category PHP
- * @package PHP_CodeSniffer
- * @author Greg Sherwood <gsherwood@squiz.net>
- * @author Marc McIntyre <mmcintyre@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.0
- * @link http://pear.php.net/package/PHP_CodeSniffer
- */
-class DokuWiki_Sniffs_WhiteSpace_ScopeIndentSniff implements PHP_CodeSniffer_Sniff
-{
-
- /**
- * The number of spaces code should be indented.
- *
- * @var int
- */
- protected $indent = 4;
-
- /**
- * Does the indent need to be exactly right.
- *
- * If TRUE, indent needs to be exactly $ident spaces. If FALSE,
- * indent needs to be at least $ident spaces (but can be more).
- *
- * @var bool
- */
- protected $exact = false;
-
- /**
- * Any scope openers that should not cause an indent.
- *
- * @var array(int)
- */
- protected $nonIndentingScopes = array();
-
-
- /**
- * Returns an array of tokens this test wants to listen for.
- *
- * @return array
- */
- public function register()
- {
- return PHP_CodeSniffer_Tokens::$scopeOpeners;
-
- }//end register()
-
-
- /**
- * Processes this test, when one of its tokens is encountered.
- *
- * @param PHP_CodeSniffer_File $phpcsFile All the tokens found in the document.
- * @param int $stackPtr The position of the current token
- * in the stack passed in $tokens.
- *
- * @return void
- */
- public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
- {
- $tokens = $phpcsFile->getTokens();
-
- // If this is an inline condition (ie. there is no scope opener), then
- // return, as this is not a new scope.
- if (isset($tokens[$stackPtr]['scope_opener']) === false) {
- return;
- }
-
- if ($tokens[$stackPtr]['code'] === T_ELSE) {
- $next = $phpcsFile->findNext(
- PHP_CodeSniffer_Tokens::$emptyTokens,
- ($stackPtr + 1),
- null,
- true
- );
-
- // We will handle the T_IF token in another call to process.
- if ($tokens[$next]['code'] === T_IF) {
- return;
- }
- }
-
- // Find the first token on this line.
- $firstToken = $stackPtr;
- for ($i = $stackPtr; $i >= 0; $i--) {
- // Record the first code token on the line.
- if (in_array($tokens[$i]['code'], PHP_CodeSniffer_Tokens::$emptyTokens) === false) {
- $firstToken = $i;
- }
-
- // It's the start of the line, so we've found our first php token.
- if ($tokens[$i]['column'] === 1) {
- break;
- }
- }
-
- // Based on the conditions that surround this token, determine the
- // indent that we expect this current content to be.
- $expectedIndent = $this->calculateExpectedIndent($tokens, $firstToken);
-
- if ($tokens[$firstToken]['column'] !== $expectedIndent) {
- if($this->exact || $tokens[$firstToken]['column'] < $expectedIndent){
- $error = 'Line indented incorrectly; expected ';
- $error .= ($expectedIndent - 1).' spaces, found ';
- $error .= ($tokens[$firstToken]['column'] - 1);
- $phpcsFile->addError($error, $stackPtr);
- }elseif((($tokens[$firstToken]['column'] - 1) % $this->indent)){
- $error = 'Line indented not by multiple of '.$this->indent.'; expected ';
- $error .= ($expectedIndent - 1).' spaces, found ';
- $error .= ($tokens[$firstToken]['column'] - 1);
- $phpcsFile->addError($error, $stackPtr);
- }
- }
-
- $scopeOpener = $tokens[$stackPtr]['scope_opener'];
- $scopeCloser = $tokens[$stackPtr]['scope_closer'];
-
- // Some scopes are expected not to have indents.
- if (in_array($tokens[$firstToken]['code'], $this->nonIndentingScopes) === false) {
- $indent = ($expectedIndent + $this->indent);
- } else {
- $indent = $expectedIndent;
- }
-
- $newline = false;
- $commentOpen = false;
- $inHereDoc = false;
-
- // Only loop over the content beween the opening and closing brace, not
- // the braces themselves.
- for ($i = ($scopeOpener + 1); $i < $scopeCloser; $i++) {
-
- // If this token is another scope, skip it as it will be handled by
- // another call to this sniff.
- if (in_array($tokens[$i]['code'], PHP_CodeSniffer_Tokens::$scopeOpeners) === true) {
- if (isset($tokens[$i]['scope_opener']) === true) {
- $i = $tokens[$i]['scope_closer'];
- } else {
- // If this token does not have a scope_opener indice, then
- // it's probably an inline scope, so let's skip to the next
- // semicolon. Inline scopes include inline if's, abstract
- // methods etc.
- $nextToken = $phpcsFile->findNext(T_SEMICOLON, $i, $scopeCloser);
- if ($nextToken !== false) {
- $i = $nextToken;
- }
- }
-
- continue;
- }
-
- // If this is a HEREDOC then we need to ignore it as the
- // whitespace before the contents within the HEREDOC are
- // considered part of the content.
- if ($tokens[$i]['code'] === T_START_HEREDOC) {
- $inHereDoc = true;
- continue;
- } else if ($inHereDoc === true) {
- if ($tokens[$i]['code'] === T_END_HEREDOC) {
- $inHereDoc = false;
- }
-
- continue;
- }
-
- if ($tokens[$i]['column'] === 1) {
- // We started a newline.
- $newline = true;
- }
-
- if ($newline === true && $tokens[$i]['code'] !== T_WHITESPACE) {
- // If we started a newline and we find a token that is not
- // whitespace, then this must be the first token on the line that
- // must be indented.
- $newline = false;
- $firstToken = $i;
-
- $column = $tokens[$firstToken]['column'];
-
- // Special case for non-PHP code.
- if ($tokens[$firstToken]['code'] === T_INLINE_HTML) {
- $trimmedContentLength
- = strlen(ltrim($tokens[$firstToken]['content']));
- if ($trimmedContentLength === 0) {
- continue;
- }
-
- $contentLength = strlen($tokens[$firstToken]['content']);
- $column = ($contentLength - $trimmedContentLength + 1);
- }
-
- // Check to see if this constant string spans multiple lines.
- // If so, then make sure that the strings on lines other than the
- // first line are indented appropriately, based on their whitespace.
- if (in_array($tokens[$firstToken]['code'], PHP_CodeSniffer_Tokens::$stringTokens) === true) {
- if (in_array($tokens[($firstToken - 1)]['code'], PHP_CodeSniffer_Tokens::$stringTokens) === true) {
- // If we find a string that directly follows another string
- // then its just a string that spans multiple lines, so we
- // don't need to check for indenting.
- continue;
- }
- }
-
- // This is a special condition for T_DOC_COMMENT and C-style
- // comments, which contain whitespace between each line.
- $comments = array(
- T_COMMENT,
- T_DOC_COMMENT
- );
-
- if (in_array($tokens[$firstToken]['code'], $comments) === true) {
- $content = trim($tokens[$firstToken]['content']);
- if (preg_match('|^/\*|', $content) !== 0) {
- // Check to see if the end of the comment is on the same line
- // as the start of the comment. If it is, then we don't
- // have to worry about opening a comment.
- if (preg_match('|\*/$|', $content) === 0) {
- // We don't have to calculate the column for the
- // start of the comment as there is a whitespace
- // token before it.
- $commentOpen = true;
- }
- } else if ($commentOpen === true) {
- if ($content === '') {
- // We are in a comment, but this line has nothing on it
- // so let's skip it.
- continue;
- }
-
- $contentLength = strlen($tokens[$firstToken]['content']);
- $trimmedContentLength
- = strlen(ltrim($tokens[$firstToken]['content']));
-
- $column = ($contentLength - $trimmedContentLength + 1);
- if (preg_match('|\*/$|', $content) !== 0) {
- $commentOpen = false;
- }
- }//end if
- }//end if
-
- // The token at the start of the line, needs to have its' column
- // greater than the relative indent we set above. If it is less,
- // an error should be shown.
- if ($column !== $indent) {
- if ($this->exact === true || $column < $indent) {
- $error = 'Line indented incorrectly; expected ';
- if ($this->exact === false) {
- $error .= 'at least ';
- }
-
- $error .= ($indent - 1).' spaces, found ';
- $error .= ($column - 1);
- $phpcsFile->addError($error, $firstToken);
- }
- }
- }//end if
- }//end for
-
- }//end process()
-
-
- /**
- * Calculates the expected indent of a token.
- *
- * @param array $tokens The stack of tokens for this file.
- * @param int $stackPtr The position of the token to get indent for.
- *
- * @return int
- */
- protected function calculateExpectedIndent(array $tokens, $stackPtr)
- {
- $conditionStack = array();
-
- // Empty conditions array (top level structure).
- if (empty($tokens[$stackPtr]['conditions']) === true) {
- return 1;
- }
-
- $tokenConditions = $tokens[$stackPtr]['conditions'];
- foreach ($tokenConditions as $id => $condition) {
- // If it's an indenting scope ie. it's not in our array of
- // scopes that don't indent, add it to our condition stack.
- if (in_array($condition, $this->nonIndentingScopes) === false) {
- $conditionStack[$id] = $condition;
- }
- }
-
- return ((count($conditionStack) * $this->indent) + 1);
-
- }//end calculateExpectedIndent()
-
-
-}//end class
-
-?>
diff --git a/_cs/DokuWiki/ruleset.xml b/_cs/DokuWiki/ruleset.xml
deleted file mode 100644
index 3ee7fb667..000000000
--- a/_cs/DokuWiki/ruleset.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0"?>
-<ruleset name="DokuWiki">
- <description>DokuWiki Coding Standard</description>
-
- <!-- ignore 3rd party libraries (that we haven't adopted) -->
- <exclude-pattern>*/inc/blowfish.php</exclude-pattern>
- <exclude-pattern>*/inc/lessc.inc.php</exclude-pattern>
- <exclude-pattern>*/inc/phpseclib/*</exclude-pattern>
- <exclude-pattern>*/lib/plugins/authad/adLDAP/*</exclude-pattern>
- <exclude-pattern>*/lib/scripts/fileuploader.js</exclude-pattern>
- <exclude-pattern>*/lib/scripts/jquery/*</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" />
- <rule 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/_cs/README b/_cs/README
deleted file mode 100644
index 7aac73161..000000000
--- a/_cs/README
+++ /dev/null
@@ -1,18 +0,0 @@
-This directory contains the Coding Standard tests to be used with PHP
-CodeSniffer on DokuWiki's code.
-
-1. Install PHP CodeSniffer:
-
- #> pear install PHP_CodeSniffer
-
-2. Link the Coding Standard to the CodeSniffer directory:
-
- #> ln -s /path/to/dokuwiki/_cs/DokuWiki /usr/share/pear/PHP/CodeSniffer/Standards/DokuWiki
-
-3. Set DokuWiki to be the default standard:
-
- #> phpcs --config-set default_standard DokuWiki
-
-
-
-The coding standard is work in progress.
diff --git a/_test/bootstrap.php b/_test/bootstrap.php
index 4f0d5efaa..ad8667a3a 100644
--- a/_test/bootstrap.php
+++ b/_test/bootstrap.php
@@ -20,9 +20,9 @@ error_reporting(DOKU_E_LEVEL);
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));
+// prepare temporary directories; str_replace is for WIN
+define('DOKU_INC', str_replace('\\', '/', dirname(dirname(__FILE__))) . '/');
+define('TMP_DIR', str_replace('\\', '/', sys_get_temp_dir()) . '/dwtests-'.microtime(true));
define('DOKU_CONF', TMP_DIR.'/conf/');
define('DOKU_TMP_DATA', TMP_DIR.'/data/');
@@ -88,15 +88,9 @@ if (getenv('PRESERVE_TMP') != 'true') {
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);
-}
+// populate default dirs for initial setup
+DokuWikiTest::setupDataDir();
+DokuWikiTest::setupConfDir();
// disable all non-default plugins by default
$dh = dir(DOKU_INC.'lib/plugins/');
diff --git a/_test/conf/local.php b/_test/conf/local.php
index ff1299393..6efb987fa 100644
--- a/_test/conf/local.php
+++ b/_test/conf/local.php
@@ -8,3 +8,4 @@ $conf['useacl'] = 1; //Use Access Control Lists to restrict
$conf['superuser'] = 'testuser'; //password: testpass
$conf['dnslookups'] = 0; //speedup tests
+$conf['updatecheck'] = 0; //speedup tests
diff --git a/_test/conf/tpl/dokuwiki/css/_tests.less b/_test/conf/tpl/dokuwiki/css/_tests.less
new file mode 100644
index 000000000..f1839f03c
--- /dev/null
+++ b/_test/conf/tpl/dokuwiki/css/_tests.less
@@ -0,0 +1 @@
+/* dummy file */
diff --git a/_test/conf/tpl/dokuwiki/style.ini b/_test/conf/tpl/dokuwiki/style.ini
new file mode 100644
index 000000000..7eab6e1ec
--- /dev/null
+++ b/_test/conf/tpl/dokuwiki/style.ini
@@ -0,0 +1,7 @@
+[stylesheets]
+css/_tests.less = screen
+
+[replacements]
+__background__ = "#f2ecec"
+__custom_variable__ = "#5e4040"
+__custom_variable_two__ = "url(test/foo.png)"
diff --git a/_test/core/DokuWikiTest.php b/_test/core/DokuWikiTest.php
index dbaf29eda..4430b87a3 100644
--- a/_test/core/DokuWikiTest.php
+++ b/_test/core/DokuWikiTest.php
@@ -1,4 +1,9 @@
<?php
+
+use dokuwiki\Extension\PluginController;
+use dokuwiki\Extension\Event;
+use dokuwiki\Extension\EventHandler;
+
if(!class_exists('PHPUnit_Framework_TestCase')) {
/**
* phpunit 5/6 compatibility
@@ -50,15 +55,8 @@ abstract class DokuWikiTest extends PHPUnit_Framework_TestCase {
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)){
- // clear indexer data and cache
- idx_get_indexer()->clear();
- TestUtils::rdelete(DOKU_TMP_DATA);
- }
-
- // populate default dirs
- TestUtils::rcopy(TMP_DIR, dirname(__FILE__).'/../data/');
+ self::setupDataDir();
+ self::setupConfDir();
}
/**
@@ -110,7 +108,7 @@ abstract class DokuWikiTest extends PHPUnit_Framework_TestCase {
// reset loaded plugins
global $plugin_controller_class, $plugin_controller;
- /** @var Doku_Plugin_Controller $plugin_controller */
+ /** @var PluginController $plugin_controller */
$plugin_controller = new $plugin_controller_class();
// disable all non-default plugins
@@ -140,36 +138,79 @@ abstract class DokuWikiTest extends PHPUnit_Framework_TestCase {
// reset event handler
global $EVENT_HANDLER;
- $EVENT_HANDLER = new Doku_Event_Handler();
+ $EVENT_HANDLER = new EventHandler();
// reload language
$local = $conf['lang'];
- trigger_event('INIT_LANG_LOAD', $local, 'init_lang', true);
+ Event::createAndTrigger('INIT_LANG_LOAD', $local, 'init_lang', true);
global $INPUT;
- $INPUT = new Input();
+ $INPUT = new \dokuwiki\Input\Input();
+ }
+
+ /**
+ * Reinitialize the data directory for this class run
+ */
+ public static function setupDataDir() {
+ // remove any leftovers from the last run
+ if(is_dir(DOKU_TMP_DATA)) {
+ // clear indexer data and cache
+ idx_get_indexer()->clear();
+ TestUtils::rdelete(DOKU_TMP_DATA);
+ }
+
+ // populate default dirs
+ TestUtils::rcopy(TMP_DIR, __DIR__ . '/../data/');
+ }
+
+ /**
+ * Reinitialize the conf directory for this class run
+ */
+ public static function setupConfDir() {
+ $defaults = [
+ 'acronyms.conf',
+ 'dokuwiki.php',
+ 'entities.conf',
+ 'interwiki.conf',
+ 'license.php',
+ 'manifest.json',
+ 'mediameta.php',
+ 'mime.conf',
+ 'plugins.php',
+ 'plugins.required.php',
+ 'scheme.conf',
+ 'smileys.conf',
+ 'wordblock.conf'
+ ];
+
+ // clear any leftovers
+ if(is_dir(DOKU_CONF)) {
+ TestUtils::rdelete(DOKU_CONF);
+ }
+ mkdir(DOKU_CONF);
+
+ // copy defaults
+ foreach($defaults as $file) {
+ copy(DOKU_INC . '/conf/' . $file, DOKU_CONF . $file);
+ }
+
+ // copy test files
+ TestUtils::rcopy(TMP_DIR, __DIR__ . '/../conf');
}
/**
* Waits until a new second has passed
*
- * The very first call will return immeadiately, proceeding calls will return
- * only after at least 1 second after the last call has passed.
- *
- * When passing $init=true it will not return immeadiately but use the current
- * second as initialization. It might still return faster than a second.
+ * This tried to be clever about the passing of time and return early if possible. Unfortunately
+ * this never worked reliably fo unknown reasons. To avoid flaky tests, this now always simply
+ * sleeps for a full second on every call.
*
- * @param bool $init wait from now on, not from last time
+ * @param bool $init no longer used
* @return int new timestamp
*/
protected function waitForTick($init = false) {
- static $last = 0;
- if($init) $last = time();
- while($last === $now = time()) {
- usleep(100000); //recheck in a 10th of a second
- }
- $last = $now;
- return $now;
+ sleep(1);
+ return time();
}
/**
@@ -191,4 +232,41 @@ abstract class DokuWikiTest extends PHPUnit_Framework_TestCase {
$method->setAccessible(true);
return $method->invokeArgs($obj, $args);
}
+
+ /**
+ * Allow for reading inaccessible properties (private or protected)
+ *
+ * This makes it easier to check internals of tested objects. This should generally
+ * be avoided.
+ *
+ * @param object $obj Object on which to access the property
+ * @param string $prop name of the property to access
+ * @return mixed
+ * @throws ReflectionException when the given obj/prop does not exist
+ */
+ protected static function getInaccessibleProperty($obj, $prop) {
+ $class = new \ReflectionClass($obj);
+ $property = $class->getProperty($prop);
+ $property->setAccessible(true);
+ return $property->getValue($obj);
+ }
+
+ /**
+ * Allow for reading inaccessible properties (private or protected)
+ *
+ * This makes it easier to set internals of tested objects. This should generally
+ * be avoided.
+ *
+ * @param object $obj Object on which to access the property
+ * @param string $prop name of the property to access
+ * @param mixed $value new value to set the property to
+ * @return void
+ * @throws ReflectionException when the given obj/prop does not exist
+ */
+ protected static function setInaccessibleProperty($obj, $prop, $value) {
+ $class = new \ReflectionClass($obj);
+ $property = $class->getProperty($prop);
+ $property->setAccessible(true);
+ $property->setValue($obj, $value);
+ }
}
diff --git a/_test/core/TestRequest.php b/_test/core/TestRequest.php
index fcc80328c..23ca76eec 100644
--- a/_test/core/TestRequest.php
+++ b/_test/core/TestRequest.php
@@ -4,6 +4,8 @@
* runtime inspection.
*/
+use dokuwiki\Input\Input;
+
/**
* Helper class to execute a fake request
*/
diff --git a/_test/core/phpQuery-onefile.php b/_test/core/phpQuery-onefile.php
index 115724853..96083f9c2 100644
--- a/_test/core/phpQuery-onefile.php
+++ b/_test/core/phpQuery-onefile.php
@@ -2153,7 +2153,7 @@ class phpQueryObject
if (! $param)
break;
// nth-child(n+b) to nth-child(1n+b)
- if ($param{0} == 'n')
+ if ($param[0] == 'n')
$param = '1'.$param;
// :nth-child(index/even/odd/equation)
if ($param == 'even' || $param == 'odd')
@@ -2168,7 +2168,7 @@ class phpQueryObject
return null;'),
new CallbackParam(), $param
);
- else if (mb_strlen($param) > 1 && $param{1} == 'n')
+ else if (mb_strlen($param) > 1 && $param[1] == 'n')
// an+b
$mapped = $this->map(
create_function('$node, $param',
diff --git a/_test/fetchphpunit.php b/_test/fetchphpunit.php
new file mode 100755
index 000000000..ceea6652d
--- /dev/null
+++ b/_test/fetchphpunit.php
@@ -0,0 +1,40 @@
+#!/usr/bin/php
+<?php
+/**
+ * Simple command line script to fetch the correct PHPUnit release
+ */
+
+$phpVersion = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;
+print "Running PHP $phpVersion\n";
+
+switch ($phpVersion) {
+ case '5.6':
+ $phpunit = 'phpunit-5.phar';
+ break;
+ case '7.0':
+ $phpunit = 'phpunit-6.phar';
+ break;
+ case '7.1':
+ case '7.2':
+ case '7.3':
+ $phpunit = 'phpunit-7.phar';
+ break;
+ case '7.4':
+ $phpunit = 'phpunit-7.phar';
+ // PHP 5 backward compatibility lock to PHPUnit 7 (type hinting)
+ break;
+ default:
+ $phpunit = 'phpunit-7.phar';
+
+}
+
+$url = "https://phar.phpunit.de/$phpunit";
+$out = __DIR__ . '/phpunit.phar';
+
+$return = 0;
+system("wget '$url' -O '$out'", $return);
+if ($return !== 0) exit($return);
+
+chmod($out, 0755);
+print "Downloaded $phpunit\n";
+exit(0);
diff --git a/_test/mock/AuthCaseInsensitivePlugin.php b/_test/mock/AuthCaseInsensitivePlugin.php
new file mode 100644
index 000000000..cf71c0c8c
--- /dev/null
+++ b/_test/mock/AuthCaseInsensitivePlugin.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace dokuwiki\test\mock;
+
+/**
+ * Class dokuwiki\Plugin\DokuWiki_Auth_Plugin
+ */
+class AuthCaseInsensitivePlugin extends AuthPlugin {
+ function isCaseSensitive(){
+ return false;
+ }
+} \ No newline at end of file
diff --git a/_test/mock/AuthDeletePlugin.php b/_test/mock/AuthDeletePlugin.php
new file mode 100644
index 000000000..82e96f2a6
--- /dev/null
+++ b/_test/mock/AuthDeletePlugin.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace dokuwiki\test\mock;
+
+/**
+ * Class dokuwiki\Plugin\DokuWiki_Auth_Plugin
+ */
+class AuthDeletePlugin extends AuthPlugin {
+
+ public $loggedOff = false;
+
+ public function __construct($canDeleteUser = true) {
+ $this->cando['delUser'] = $canDeleteUser;
+ }
+
+ public function checkPass($user, $pass) {
+ return $pass == 'password';
+ }
+
+ public function deleteUsers($users) {
+ return in_array($_SERVER['REMOTE_USER'], $users);
+ }
+
+ public function logoff() {
+ $this->loggedOff = true;
+ }
+
+} \ No newline at end of file
diff --git a/_test/mock/AuthPlugin.php b/_test/mock/AuthPlugin.php
new file mode 100644
index 000000000..53edb2fe1
--- /dev/null
+++ b/_test/mock/AuthPlugin.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace dokuwiki\test\mock;
+
+/**
+ * Class dokuwiki\Plugin\DokuWiki_Auth_Plugin
+ */
+class AuthPlugin extends \dokuwiki\Extension\AuthPlugin {
+
+}
diff --git a/_test/mock/Doku_Renderer.php b/_test/mock/Doku_Renderer.php
new file mode 100644
index 000000000..350346101
--- /dev/null
+++ b/_test/mock/Doku_Renderer.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace dokuwiki\test\mock;
+
+class Doku_Renderer extends \Doku_Renderer {
+
+ /** @inheritdoc */
+ public function getFormat() {
+ return 'none';
+ }
+}
diff --git a/_test/mock/MailerMock.php b/_test/mock/MailerMock.php
new file mode 100644
index 000000000..9d93bc25a
--- /dev/null
+++ b/_test/mock/MailerMock.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace dokuwiki\test\mock;
+
+class MailerMock extends \Mailer
+{
+
+ public $mails = [];
+
+ public function send()
+ {
+ $this->mails[] = $this->headers;
+ return true;
+ }
+
+}
diff --git a/_test/phpcs.xml b/_test/phpcs.xml
new file mode 100644
index 000000000..8f0d4dd24
--- /dev/null
+++ b/_test/phpcs.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+<ruleset name="DokuWiki Coding Standard Standard" namespace="DokuWiki\CS\Standard">
+ <description>Coding Standard used for DokuWiki</description>
+
+ <!-- default config -->
+ <arg name="colors"/>
+ <arg value="sp"/>
+ <arg name="extensions" value="php"/>
+
+ <ini name="memory_limit" value="-1"/>
+
+ <!-- where to look -->
+ <file>../inc</file>
+ <file>../lib</file>
+ <file>../bin</file>
+ <file>../doku.php</file>
+ <file>../index.php</file>
+ <file>../feed.php</file>
+ <file>../install.php</file>
+
+ <!-- skip these completely -->
+ <exclude-pattern>*/lang/*/lang.php</exclude-pattern>
+ <exclude-pattern>*/lang/*/settings.php</exclude-pattern>
+ <exclude-pattern>*/_test/*</exclude-pattern>
+
+ <!-- 3rd party libs, these should be moved to composer some day -->
+ <exclude-pattern>*/inc/DifferenceEngine.php</exclude-pattern>
+ <exclude-pattern>*/inc/IXR_Library.php</exclude-pattern>
+ <exclude-pattern>*/inc/JSON.php</exclude-pattern>
+ <exclude-pattern>*/inc/JpegMeta.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/authad/adLDAP</exclude-pattern>
+
+ <!-- deprecated files to be removed soon -->
+ <exclude-pattern>*/inc/cli.php</exclude-pattern>
+ <exclude-pattern>*/inc/parser/*</exclude-pattern>
+
+ <!-- rules on top of PSR-12 -->
+ <rule ref="PSR12">
+ <!-- This rule breaks the single line guard pattern that we prefer to keep using -->
+ <exclude name="Generic.ControlStructures.InlineControlStructure.NotAllowed"/>
+
+ <!-- we have lots of legacy classes without name spaces -->
+ <exclude name="PSR1.Classes.ClassDeclaration.MissingNamespace"/>
+ </rule>
+
+ <!-- disable some rules for certain paths, for legacy support -->
+ <rule ref="Squiz.Classes.ValidClassName.NotCamelCaps">
+ <exclude-pattern>*/inc/Plugin.php</exclude-pattern>
+ <exclude-pattern>*/inc/PluginInterface.php</exclude-pattern>
+ <exclude-pattern>*/inc/PluginTrait.php</exclude-pattern>
+
+ <exclude-pattern>*/lib/plugins/*.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/action.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/action/*.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/admin.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/admin/*.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/auth.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/auth/*.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/cli.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/cli/*.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/helper.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/helper/*.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/remote.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/remote/*.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/syntax.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/syntax/*.php</exclude-pattern>
+ </rule>
+
+ <!-- underscore skips exposing public methods to remote api -->
+ <rule ref="PSR2.Methods.MethodDeclaration.Underscore">
+ <exclude-pattern>*/inc/Extension/RemotePlugin.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/remote.php</exclude-pattern>
+ <exclude-pattern>*/lib/plugins/*/remote/*.php</exclude-pattern>
+ </rule>
+
+ <rule ref="PSR1.Methods.CamelCapsMethodName.NotCamelCaps">
+ <exclude-pattern>*/inc/Extension/PluginInterface.php</exclude-pattern>
+ <exclude-pattern>*/inc/Extension/PluginTrait.php</exclude-pattern>
+ </rule>
+</ruleset>
diff --git a/_test/phpcs_MigrationAdjustments.xml b/_test/phpcs_MigrationAdjustments.xml
new file mode 100644
index 000000000..d9d11832b
--- /dev/null
+++ b/_test/phpcs_MigrationAdjustments.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0"?>
+<ruleset name="Migration Adjustments for the DokuWiki Coding Standard Standard" namespace="DokuWiki\CS\Standard">
+ <description>These are exceptions to the Coding Standard used for DokuWiki that are intended to be removed over time.</description>
+
+ <!-- rules on top of PSR-12 -->
+ <rule ref="./phpcs.xml">
+ <!-- Rules with automatic fixes that we want to adhere to, but currently don't -->
+ <exclude name="Generic.Formatting.DisallowMultipleStatements.SameLine"/>
+ <exclude name="Generic.Functions.FunctionCallArgumentSpacing.NoSpaceAfterComma"/>
+ <exclude name="Generic.Functions.FunctionCallArgumentSpacing.SpaceBeforeComma"/>
+ <exclude name="Generic.Functions.FunctionCallArgumentSpacing.TooMuchSpaceAfterComma"/>
+ <exclude name="Generic.PHP.LowerCaseKeyword.Found"/>
+ <exclude name="Generic.PHP.LowerCaseConstant.Found"/>
+ <exclude name="Generic.WhiteSpace.ScopeIndent.IncorrectExact"/>
+ <exclude name="Generic.WhiteSpace.ScopeIndent.Incorrect"/>
+ <exclude name="Generic.WhiteSpace.IncrementDecrementSpacing.SpaceAfterDecrement"/>
+ <exclude name="Generic.WhiteSpace.IncrementDecrementSpacing.SpaceAfterIncrement"/>
+
+ <exclude name="Squiz.ControlStructures.ControlSignature.SpaceAfterCloseParenthesis"/>
+ <exclude name="Squiz.ControlStructures.ControlSignature.SpaceAfterKeyword"/>
+ <exclude name="Squiz.ControlStructures.ControlSignature.SpaceAfterCloseBrace"/>
+ <exclude name="Squiz.ControlStructures.ControlSignature.NewlineAfterOpenBrace"/>
+ <exclude name="Squiz.ControlStructures.ForEachLoopDeclaration.NoSpaceBeforeArrow"/>
+ <exclude name="Squiz.ControlStructures.ForEachLoopDeclaration.NoSpaceAfterArrow"/>
+ <exclude name="Squiz.ControlStructures.ForEachLoopDeclaration.SpacingBeforeAs"/>
+ <exclude name="Squiz.ControlStructures.ForLoopDeclaration.SpacingAfterSecond"/>
+ <exclude name="Squiz.ControlStructures.ForLoopDeclaration.NoSpaceAfterSecond"/>
+ <exclude name="Squiz.ControlStructures.ForLoopDeclaration.NoSpaceAfterFirst"/>
+ <exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.NoSpaceBeforeArg"/>
+ <exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpaceAfterEquals"/>
+ <exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterReference"/>
+ <exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingBeforeClose"/>
+ <exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpaceBeforeEquals"/>
+ <exclude name="Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine"/>
+ <exclude name="Squiz.Functions.MultiLineFunctionDeclaration.NewlineBeforeOpenBrace"/>
+ <exclude name="Squiz.Functions.MultiLineFunctionDeclaration.CloseBracketLine"/>
+ <exclude name="Squiz.WhiteSpace.ControlStructureSpacing.SpacingAfterOpen"/>
+ <exclude name="Squiz.WhiteSpace.ControlStructureSpacing.SpacingBeforeClose"/>
+ <exclude name="Squiz.WhiteSpace.ScopeClosingBrace.ContentBefore"/>
+ <exclude name="Squiz.WhiteSpace.ScopeClosingBrace.Indent"/>
+ <exclude name="Squiz.WhiteSpace.SuperfluousWhitespace.EndLine"/>
+
+ <exclude name="PSR2.Classes.ClassDeclaration.CloseBraceAfterBody"/>
+ <exclude name="PSR2.Classes.ClassDeclaration.OpenBraceNewLine"/>
+ <exclude name="PSR2.Classes.PropertyDeclaration.StaticBeforeVisibility"/>
+ <exclude name="PSR2.ControlStructures.ControlStructureSpacing.SpacingAfterOpenBrace"/>
+ <exclude name="PSR2.ControlStructures.ControlStructureSpacing.SpaceBeforeCloseBrace"/>
+ <exclude name="PSR2.ControlStructures.ElseIfDeclaration.NotAllowed"/>
+ <exclude name="PSR2.ControlStructures.SwitchDeclaration.BreakIndent"/>
+ <exclude name="PSR2.ControlStructures.SwitchDeclaration.BreakNotNewLine"/>
+ <exclude name="PSR2.ControlStructures.SwitchDeclaration.BodyOnNextLineCASE"/>
+ <exclude name="PSR2.ControlStructures.SwitchDeclaration.SpaceBeforeColonDEFAULT"/>
+ <exclude name="PSR2.ControlStructures.SwitchDeclaration.SpaceBeforeColonCASE"/>
+ <exclude name="PSR2.Files.EndFileNewline.TooMany"/>
+ <exclude name="PSR2.Files.EndFileNewline.NoneFound"/>
+ <exclude name="PSR2.Methods.FunctionCallSignature.Indent"/>
+ <exclude name="PSR2.Methods.FunctionCallSignature.EmptyLine"/>
+ <exclude name="PSR2.Methods.FunctionCallSignature.ContentAfterOpenBracket"/>
+ <exclude name="PSR2.Methods.FunctionCallSignature.SpaceBeforeOpenBracket"/>
+ <exclude name="PSR2.Methods.FunctionCallSignature.CloseBracketLine"/>
+ <exclude name="PSR2.Methods.FunctionCallSignature.SpaceBeforeCloseBracket"/>
+ <exclude name="PSR2.Methods.FunctionCallSignature.SpaceAfterOpenBracket"/>
+ <exclude name="PSR2.Methods.FunctionCallSignature.MultipleArguments"/>
+ <exclude name="PSR2.Methods.FunctionClosingBrace.SpacingBeforeClose"/>
+ <exclude name="PSR2.Methods.MethodDeclaration.StaticBeforeVisibility"/>
+ <exclude name="PSR2.Namespaces.NamespaceDeclaration.BlankLineAfter"/>
+ <exclude name="PSR2.Namespaces.UseDeclaration.SpaceAfterLastUse"/>
+
+ <exclude name="PSR12.Classes.ClassInstantiation.MissingParentheses"/>
+ <exclude name="PSR12.ControlStructures.BooleanOperatorPlacement.FoundMixed"/>
+ <exclude name="PSR12.ControlStructures.ControlStructureSpacing.FirstExpressionLine"/>
+ <exclude name="PSR12.ControlStructures.ControlStructureSpacing.CloseParenthesisLine"/>
+ <exclude name="PSR12.ControlStructures.ControlStructureSpacing.LineIndent"/>
+ <exclude name="PSR12.ControlStructures.ControlStructureSpacing.SpacingAfterOpenBrace"/>
+ <exclude name="PSR12.ControlStructures.ControlStructureSpacing.SpaceBeforeCloseBrace"/>
+ <exclude name="PSR12.Files.FileHeader.SpacingAfterBlock"/>
+ <exclude name="PSR12.Operators.OperatorSpacing.NoSpaceBefore"/>
+ <exclude name="PSR12.Operators.OperatorSpacing.NoSpaceAfter"/>
+
+ <exclude name="PSR12.Properties.ConstantVisibility.NotFound"/>
+ </rule>
+
+ <!-- for now we mix declarations and execution here (mostly for defines) -->
+ <rule ref="PSR1.Files.SideEffects">
+ <exclude-pattern>*/index.php</exclude-pattern>
+ <exclude-pattern>*/inc/parserutils.php</exclude-pattern>
+ <exclude-pattern>*/inc/mail.php</exclude-pattern>
+ <exclude-pattern>*/inc/init.php</exclude-pattern>
+ <exclude-pattern>*/inc/farm.php</exclude-pattern>
+ <exclude-pattern>*/inc/fulltext.php</exclude-pattern>
+ <exclude-pattern>*/inc/pluginutils.php</exclude-pattern>
+ <exclude-pattern>*/inc/indexer.php</exclude-pattern>
+ <exclude-pattern>*/inc/Mailer.class.php</exclude-pattern>
+ <exclude-pattern>*/doku.php</exclude-pattern>
+ <exclude-pattern>*/install.php</exclude-pattern>
+ <exclude-pattern>*/inc/utf8.php</exclude-pattern>
+ <exclude-pattern>*/feed.php</exclude-pattern>
+ <exclude-pattern>*/inc/load.php</exclude-pattern>
+ <exclude-pattern>*/bin/*.php</exclude-pattern>
+ <exclude-pattern>*/lib/exe/*.php</exclude-pattern>
+ </rule>
+
+</ruleset>
diff --git a/_test/phpunit.xml b/_test/phpunit.xml
index f4b88be9c..c450cea95 100644
--- a/_test/phpunit.xml
+++ b/_test/phpunit.xml
@@ -10,12 +10,15 @@
<testsuites>
<testsuite name="DokuWiki Tests">
<directory suffix=".test.php">tests/</directory>
+ <directory suffix="Test.php">tests/</directory>
</testsuite>
<testsuite name="Plugin Tests">
- <directory suffix=".test.php">../lib/plugins/*/_test</directory>
+ <directory suffix=".test.php">../lib/plugins/*/_test/</directory>
+ <directory suffix="Test.php">../lib/plugins/*/_test/</directory>
</testsuite>
<testsuite name="Template Tests">
- <directory suffix=".test.php">../lib/tpl/*/_test</directory>
+ <directory suffix=".test.php">../lib/tpl/*/_test/</directory>
+ <directory suffix="Test.php">../lib/tpl/*/_test/</directory>
</testsuite>
</testsuites>
diff --git a/_test/tests/general/general_html.test.php b/_test/tests/general/general_html.test.php
new file mode 100644
index 000000000..8e6dd77c0
--- /dev/null
+++ b/_test/tests/general/general_html.test.php
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * Check some page output for validity
+ *
+ * @group internet
+ */
+class general_html_test extends DokuWikiTest
+{
+ /** @var string[] we consider these hits shortcomings in the validator and not errors */
+ protected $allowedErrors = [
+ 'The string “ugc” is not a registered keyword.',
+ ];
+
+ /**
+ * List of requests to check for validity
+ *
+ * @return array
+ */
+ public function requestProvider()
+ {
+ return [
+ ['/doku.php', 'GET', []],
+ ['/doku.php', 'GET', ['do' => 'recent']],
+ ['/doku.php', 'GET', ['do' => 'index']],
+ ['/doku.php', 'GET', ['do' => 'login']],
+ ['/doku.php', 'GET', ['do' => 'search', 'q' => 'wiki']],
+ ['/doku.php', 'GET', ['id' => 'wiki:syntax']],
+ ['/doku.php', 'GET', ['id' => 'wiki:syntax', 'ns' => 'wiki', 'image' => 'wiki:dokuwiki-128.png', 'do' => 'media']],
+ ['/lib/exe/detail.php', 'GET', ['id' => 'wiki:syntax', 'media' => 'wiki:dokuwiki-128.png']],
+ ];
+ }
+
+ /**
+ * Sends the given HTML to the validator and returns the result
+ *
+ * @param string $html
+ * @return array
+ * @throws Exception when communication failed
+ */
+ protected function validate($html)
+ {
+ $http = new \dokuwiki\HTTP\DokuHTTPClient();
+ $http->headers['Content-Type'] = 'text/html; charset=utf-8';
+ $result = $http->post('https://validator.w3.org/nu/?out=json&level=error', $html);
+
+ if ($result === false) {
+ throw new \Exception($http->error);
+ }
+
+ $result = json_decode($result, true);
+ if ($result === null) {
+ throw new \Exception('could not decode JSON');
+ }
+
+ return $result;
+ }
+
+ /**
+ * Reformat the errors for nicer display in output
+ *
+ * @param array $result
+ * @return string[]
+ */
+ protected function listErrors($result)
+ {
+ $errors = [];
+ foreach ($result['messages'] as $msg) {
+ if ($this->isAllowedError($msg['message'])) continue;
+ $errors[] = "☛ " . $msg['message'] . "\n" . $msg['extract'] . "\n";
+ }
+ return $errors;
+ }
+
+ /**
+ * Is the given string an allowed error that should be skipped?
+ *
+ * @param string $string
+ * @return bool
+ */
+ protected function isAllowedError($string)
+ {
+ $re = join('|', array_map('preg_quote_cb', $this->allowedErrors));
+ return (bool)preg_match("/$re/", $string);
+ }
+
+ /**
+ * @dataProvider requestProvider
+ * @param string $url
+ * @param string $method
+ * @param array $data
+ * @group internet
+ */
+ public function test_Validity($url, $method, $data)
+ {
+ $request = new TestRequest();
+ if ($method == 'GET') {
+ $response = $request->get($data, $url);
+ } elseif ($method == 'POST') {
+ $response = $request->post($data, $url);
+ } else {
+ throw new \RuntimeException("unknown method given: $method");
+ }
+
+ $html = $response->getContent();
+ try {
+ $result = $this->validate($html);
+ } catch (\Exception $e) {
+ $this->markTestSkipped($e->getMessage());
+ return;
+ }
+
+ $errors = $this->listErrors($result);
+ $info = "Invalid HTML found:\n" . join("\n", $errors);
+
+ $this->assertEquals(0, count($errors), $info);
+ }
+}
diff --git a/_test/tests/inc/Action/general.test.php b/_test/tests/inc/Action/general.test.php
index 9aacfbf96..4f05d0518 100644
--- a/_test/tests/inc/Action/general.test.php
+++ b/_test/tests/inc/Action/general.test.php
@@ -23,10 +23,10 @@ class action_general extends DokuWikiTest {
array('Resendpwd', AUTH_NONE, array('exists' => true, 'ismanager' => false)),
array('Backlink', AUTH_NONE, array('exists' => true, 'ismanager' => false)),
- array('Revert', AUTH_ADMIN, array('exists' => true, 'ismanager' => false)),
+ array('Revert', AUTH_EDIT, array('exists' => true, 'ismanager' => false)),
array('Revert', AUTH_EDIT, array('exists' => true, 'ismanager' => true)),
- array('Admin', AUTH_ADMIN, array('exists' => true, 'ismanager' => false)),
+ array('Admin', AUTH_READ, array('exists' => true, 'ismanager' => false)), // let in, check later again
array('Admin', AUTH_READ, array('exists' => true, 'ismanager' => true)), // let in, check later again
array('Check', AUTH_READ, array('exists' => true, 'ismanager' => false)), // sensible?
diff --git a/_test/tests/inc/Extension/Event.test.php b/_test/tests/inc/Extension/Event.test.php
new file mode 100644
index 000000000..bc2268295
--- /dev/null
+++ b/_test/tests/inc/Extension/Event.test.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace tests\inc\Extension;
+
+use dokuwiki\Extension\Event;
+
+class EventTest extends \DokuWikiTest
+{
+ static public function staticFunc(&$data)
+ {
+ $data['test'] = strtoupper($data['test']);
+ }
+
+ public function dynamicFunc(&$data)
+ {
+ $data['test'] = strtoupper($data['test']);
+ }
+
+ public function testGlobal()
+ {
+ $data = 'test';
+ $result = Event::createAndTrigger('TESTTRIGGER', $data, 'strtoupper');
+ $this->assertEquals('TEST', $result);
+ }
+
+ public function testDynamic()
+ {
+ $data = ['test' => 'test'];
+ Event::createAndTrigger('TESTTRIGGER', $data, [$this, 'dynamicFunc']);
+ $this->assertEquals(['test' => 'TEST'], $data);
+ }
+
+ public function testStatic()
+ {
+ $data = ['test' => 'test'];
+ Event::createAndTrigger('TESTTRIGGER', $data, 'tests\inc\Extension\EventTest::staticFunc');
+ $this->assertEquals(['test' => 'TEST'], $data);
+
+ $data = ['test' => 'test'];
+ Event::createAndTrigger('TESTTRIGGER', $data, ['tests\inc\Extension\EventTest', 'staticFunc']);
+ $this->assertEquals(['test' => 'TEST'], $data);
+ }
+}
diff --git a/_test/tests/inc/PageUtilsIsHiddenPage.test.php b/_test/tests/inc/PageUtilsIsHiddenPage.test.php
index a7077862e..09ab78e1b 100644
--- a/_test/tests/inc/PageUtilsIsHiddenPage.test.php
+++ b/_test/tests/inc/PageUtilsIsHiddenPage.test.php
@@ -41,7 +41,7 @@ class PageUtilsIsHiddenPageTest extends DokuWikiTest {
$this->assertTrue(isHiddenPage('another'));
}
- function alwaysHide(Doku_Event &$event, $params) {
+ function alwaysHide(Doku_Event $event, $params) {
$event->data['hidden'] = true;
}
@@ -53,7 +53,7 @@ class PageUtilsIsHiddenPageTest extends DokuWikiTest {
$this->assertFalse(isHiddenPage('test'));
}
- function showBefore(Doku_Event &$event, $params) {
+ function showBefore(Doku_Event $event, $params) {
$event->data['hidden'] = false;
$event->preventDefault();
$event->stopPropagation();
@@ -75,7 +75,7 @@ class PageUtilsIsHiddenPageTest extends DokuWikiTest {
$this->assertTrue(isHiddenPage('another'));
}
- function hideBeforeWithoutPrevent(Doku_Event &$event, $params) {
+ function hideBeforeWithoutPrevent(Doku_Event $event, $params) {
$event->data['hidden'] = true;
}
@@ -87,7 +87,7 @@ class PageUtilsIsHiddenPageTest extends DokuWikiTest {
$this->assertFalse(isHiddenPage('test'));
}
- function showAfter(Doku_Event &$event, $params) {
+ function showAfter(Doku_Event $event, $params) {
$event->data['hidden'] = false;
}
diff --git a/_test/tests/inc/PassHash.test.php b/_test/tests/inc/PassHash.test.php
index 1bc4b95bc..2c8dc1c39 100644
--- a/_test/tests/inc/PassHash.test.php
+++ b/_test/tests/inc/PassHash.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\PassHash;
+
/**
* Class PassHash_test
*
diff --git a/_test/tests/inc/PluginUtils.test.php b/_test/tests/inc/PluginUtils.test.php
new file mode 100644
index 000000000..7ddad3af7
--- /dev/null
+++ b/_test/tests/inc/PluginUtils.test.php
@@ -0,0 +1,23 @@
+<?php
+
+class PluginUtilsTest extends DokuWikiTest
+{
+ /**
+ * @covers ::plugin_list()
+ */
+ public function test_cache_cleaning_cleanToUnclean()
+ {
+ $expectedListOfPlugins = [
+ 'acl',
+ 'authplain',
+ 'config',
+ 'info',
+ 'popularity',
+ 'revert',
+ 'safefnrecode',
+ 'usermanager',
+ ];
+
+ $this->assertEquals($expectedListOfPlugins, plugin_list());
+ }
+}
diff --git a/_test/tests/inc/Subscriptions/BulkSubscriptionsSenderTest.php b/_test/tests/inc/Subscriptions/BulkSubscriptionsSenderTest.php
new file mode 100644
index 000000000..3bc6a9c2f
--- /dev/null
+++ b/_test/tests/inc/Subscriptions/BulkSubscriptionsSenderTest.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace tests\inc\Subscriptions;
+
+use dokuwiki\Subscriptions\BulkSubscriptionSender;
+use dokuwiki\Subscriptions\SubscriberManager;
+use dokuwiki\test\mock\MailerMock;
+use DokuWikiTest;
+
+class BulkSubscriptionsSenderTest extends DokuWikiTest
+{
+
+ private $originalSubscriptionConfig;
+
+ public function setUp()
+ {
+ parent::setUp();
+ global $conf;
+ $this->originalSubscriptionConfig = $conf['subscribers'];
+ $conf['subscribers'] = true;
+ }
+
+ protected function tearDown()
+ {
+ global $conf;
+ $conf['subscribers'] = $this->originalSubscriptionConfig;
+ parent::tearDown();
+ }
+
+ public function testBulkdigest()
+ {
+ $mailerMock = new MailerMock();
+ $sub = new BulkSubscriptionSender($mailerMock);
+ $manager = new SubscriberManager();
+
+ // let's start with nothing
+ $this->assertEquals(0, $sub->sendBulk('sub1:test'));
+
+ // create a subscription
+ $manager->add('sub1:', 'testuser', 'digest', '978328800'); // last mod 2001-01-01
+
+ // now create change
+ $_SERVER['REMOTE_USER'] = 'someguy';
+ saveWikiText('sub1:test', 'foo bar', 'a subscription change', false);
+
+ // should trigger a mail
+ $this->assertEquals(1, $sub->sendBulk('sub1:test'));
+ $this->assertEquals(['arthur@example.com'], array_column($mailerMock->mails, 'Bcc'));
+
+ $mailerMock->mails = [];
+
+ // now create more changes
+ $_SERVER['REMOTE_USER'] = 'someguy';
+ saveWikiText('sub1:sub2:test', 'foo bar', 'a subscription change', false);
+ saveWikiText('sub1:another_test', 'foo bar', 'a subscription change', false);
+
+ // should not trigger a mail, because the subscription time has not been reached, yet
+ $this->assertEquals(0, $sub->sendBulk('sub1:test'));
+ $this->assertEquals([], array_column($mailerMock->mails, 'Bcc'));
+
+ // reset the subscription time
+ $manager->add('sub1:', 'testuser', 'digest', '978328800'); // last mod 2001-01-01
+
+ // we now should get mails for three changes
+ $this->assertEquals(3, $sub->sendBulk('sub1:test'));
+ $this->assertEquals(
+ ['arthur@example.com', 'arthur@example.com', 'arthur@example.com'],
+ array_column($mailerMock->mails, 'Bcc')
+ );
+ }
+
+ public function testBulklist()
+ {
+ $mailerMock = new MailerMock();
+ $sub = new BulkSubscriptionSender($mailerMock);
+ $manager = new SubscriberManager();
+
+ // let's start with nothing
+ $this->assertEquals(0, $sub->sendBulk('sub1:test'));
+
+ // create a subscription
+ $manager->add('sub1:', 'testuser', 'list', '978328800'); // last mod 2001-01-01
+
+ // now create change
+ $_SERVER['REMOTE_USER'] = 'someguy';
+ saveWikiText('sub1:test', 'foo bar', 'a subscription change', false);
+
+ // should trigger a mail
+ $this->assertEquals(1, $sub->sendBulk('sub1:test'));
+ $this->assertEquals(['arthur@example.com'], array_column($mailerMock->mails, 'Bcc'));
+
+ $mailerMock->mails = [];
+
+ // now create more changes
+ $_SERVER['REMOTE_USER'] = 'someguy';
+ saveWikiText('sub1:sub2:test', 'foo bar', 'a subscription change', false);
+ saveWikiText('sub1:another_test', 'foo bar', 'a subscription change', false);
+
+ // should not trigger a mail, because the subscription time has not been reached, yet
+ $this->assertEquals(0, $sub->sendBulk('sub1:test'));
+ $this->assertEquals([], array_column($mailerMock->mails, 'Bcc'));
+
+ // reset the subscription time
+ $manager->add('sub1:', 'testuser', 'list', '978328800'); // last mod 2001-01-01
+
+ // we now should get a single mail for all three changes
+ $this->assertEquals(1, $sub->sendBulk('sub1:test'));
+ $this->assertEquals(['arthur@example.com'], array_column($mailerMock->mails, 'Bcc'));
+ }
+}
diff --git a/_test/tests/inc/Subscriptions/SubscriberManagerTest.php b/_test/tests/inc/Subscriptions/SubscriberManagerTest.php
new file mode 100644
index 000000000..1fcd7c84b
--- /dev/null
+++ b/_test/tests/inc/Subscriptions/SubscriberManagerTest.php
@@ -0,0 +1,131 @@
+<?php
+
+namespace tests\inc\Subscriptions;
+
+use dokuwiki\Subscriptions\SubscriberManager;
+use DokuWikiTest;
+
+class SubscriberManagerTest extends DokuWikiTest
+{
+ private $originalSubscriptionConfig;
+
+ public function setUp()
+ {
+ parent::setUp();
+ global $conf;
+ $this->originalSubscriptionConfig = $conf['subscribers'];
+ $conf['subscribers'] = true;
+ }
+
+ protected function tearDown()
+ {
+ global $conf;
+ $conf['subscribers'] = $this->originalSubscriptionConfig;
+ parent::tearDown();
+ }
+
+ public function testAddremove()
+ {
+ $sub = new SubscriberManager();
+
+ // no subscriptions
+ $this->assertArrayNotHasKey(
+ 'wiki:dokuwiki',
+ $sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest'])
+ );
+
+ // add page subscription
+ $sub->add('wiki:dokuwiki', 'testuser', 'every');
+
+ // one subscription
+ $this->assertArrayHasKey(
+ 'wiki:dokuwiki',
+ $sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest'])
+ );
+
+ // remove page subscription
+ $sub->remove('wiki:dokuwiki', 'testuser');
+
+ // no subscription
+ $this->assertArrayNotHasKey(
+ 'wiki:dokuwiki',
+ $sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest'])
+ );
+
+ // add namespace subscription
+ $sub->add('wiki:', 'testuser', 'every');
+
+ // one subscription
+ $this->assertArrayHasKey(
+ 'wiki:',
+ $sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest'])
+ );
+
+ // remove (non existing) page subscription
+ $sub->remove('wiki:dokuwiki', 'testuser');
+
+ // still one subscription
+ $this->assertArrayHasKey(
+ 'wiki:',
+ $sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest'])
+ );
+
+ // change namespace subscription
+ $sub->add('wiki:', 'testuser', 'digest', '1234567');
+
+ // still one subscription
+ $this->assertArrayHasKey(
+ 'wiki:',
+ $sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest'])
+ );
+
+ // check contents
+ $this->assertEquals(
+ ['wiki:' => ['testuser' => ['digest', '1234567']]],
+ $sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest'])
+ );
+
+ // change subscription data
+ $sub->add('wiki:', 'testuser', 'digest', '7654321');
+
+ // still one subscription
+ $this->assertArrayHasKey(
+ 'wiki:',
+ $sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest'])
+ );
+
+ // check contents
+ $this->assertEquals(
+ ['wiki:' => ['testuser' => ['digest', '7654321']]],
+ $sub->subscribers('wiki:dokuwiki', null, ['every', 'list', 'digest'])
+ );
+ }
+
+ /**
+ * 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
+ */
+ public function testOverwrite()
+ {
+ $sub = new SubscriberManager();
+
+ $sub->add(':', 'admin', 'digest', '123456789');
+ $sub->add(':wiki:', 'admin', 'digest', '123456789');
+ $sub->add(':', 'admin', 'digest', '1234');
+ $sub->add(':wiki:', 'admin', 'digest', '1234');
+
+ $subscriptions = $sub->subscribers(':wiki:', '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/Subscriptions/SubscriberRegexBuilderTest.php b/_test/tests/inc/Subscriptions/SubscriberRegexBuilderTest.php
new file mode 100644
index 000000000..f9b22724d
--- /dev/null
+++ b/_test/tests/inc/Subscriptions/SubscriberRegexBuilderTest.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace tests\inc\Subscriptions;
+
+use dokuwiki\Subscriptions\SubscriberRegexBuilder;
+use DokuWikiTest;
+
+class SubscriberRegexBuilderTest extends DokuWikiTest
+{
+
+ public function regexTestdataProvider()
+ {
+ return [
+ ['Cold Fusion', null, null, 1],
+ ['casper', null, null, 1],
+ ['nope', null, null, 0],
+ ['lights', null, null, 0],
+ [['Cold Fusion', 'casper', 'nope'], null, null, 2],
+ [null, 'list', null, 1],
+ [null, 'every', null, 2],
+ [null, 'digest', null, 3],
+ [null, ['list', 'every'], null, 3],
+ ['casper', 'digest', null, 0],
+ ['casper', ['digest', 'every'], null, 1],
+ ['zioth', 'list', '1344691369', 1],
+ ['zioth', null, '1344691369', 1],
+ ['zioth', 'digest', '1344691369', 0],
+ ];
+ }
+
+ /**
+ * @dataProvider regexTestdataProvider
+ */
+ public function testRegexp($user, $style, $inputData, $expectedNumResults)
+ {
+ // data to test against
+ $data = [
+ "casper every\n",
+ "Andreas digest 1344689733",
+ "Cold%20Fusion every",
+ "zioth list 1344691369\n",
+ "nlights digest",
+ "rikblok\tdigest \t 1344716803",
+ ];
+
+ $sub = new SubscriberRegexBuilder();
+ $re = $sub->buildRegex($user, $style, $inputData);
+ $this->assertFalse(empty($re));
+ $result = preg_grep($re, $data);
+ $this->assertEquals($expectedNumResults, count($result));
+ }
+}
diff --git a/_test/tests/inc/Ui/Search_createPagenameFromQuery.test.php b/_test/tests/inc/Ui/Search_createPagenameFromQuery.test.php
index ad59fea7e..e1fe51824 100644
--- a/_test/tests/inc/Ui/Search_createPagenameFromQuery.test.php
+++ b/_test/tests/inc/Ui/Search_createPagenameFromQuery.test.php
@@ -95,6 +95,38 @@ class Search_createPagenameFromQuery extends DokuWikiTest
],
[
[
+ 'query' => 'WiKi:Foo',
+ 'parsed_str' => '((W+:wiki)AND(W+:foo))',
+ 'parsed_ary' => [0 => 'W+:wiki', 1 => 'W+:foo', 2 => 'AND',],
+ 'words' => [0 => 'wiki', 1 => 'foo',],
+ 'highlight' => [0 => 'wiki', 1 => 'foo',],
+ 'and' => [0 => 'wiki', 1 => 'foo',],
+ 'phrases' => [],
+ 'ns' => [],
+ 'notns' => [],
+ 'not' => [],
+ ],
+ ':wiki:foo',
+ 'uppercased pageid with colons should result in clean pageid',
+ ],
+ [
+ [
+ 'query' => 'Бб:Гг:Rr',
+ 'parsed_str' => '((W+:бб)AND(W+:гг)AND(W+:rr))',
+ 'parsed_ary' => ['W+:бб', 'AND', 'W+:гг', 'AND', 'W+:rr', 'AND'],
+ 'words' => ["бб", "гг", "rr"],
+ 'highlight' => ["бб", "гг", "rr"],
+ 'and' => ["бб", "гг", "rr"],
+ 'phrases' => [],
+ 'ns' => [],
+ 'notns' => [],
+ 'not' => [],
+ ],
+ ':бб:гг:rr',
+ 'uppercased utf-8 pageid with colons should result in clean pageid',
+ ],
+ [
+ [
'query' => '"wiki:foo"',
'parsed_str' => '((W_:wiki)AND(W_:foo)AND(P+:wiki:foo))',
'parsed_ary' => [0 => 'W_:wiki', 1 => 'W_:foo', 2 => 'AND', 3 => 'P+:wiki:foo', 4 => 'AND',],
diff --git a/_test/tests/inc/XmlRpcServer.test.php b/_test/tests/inc/XmlRpcServer.test.php
new file mode 100644
index 000000000..47d2f8cfc
--- /dev/null
+++ b/_test/tests/inc/XmlRpcServer.test.php
@@ -0,0 +1,69 @@
+<?php
+
+use dokuwiki\Remote\XmlRpcServer;
+
+class XmlRpcServerTestWrapper extends XmlRpcServer
+{
+ public $output;
+
+ public function output($xml) {
+ $this->output = $xml;
+ }
+}
+
+class XmlRpcServerTest extends DokuWikiTest
+{
+ protected $server;
+
+ function setUp()
+ {
+ parent::setUp();
+ global $conf;
+
+ $conf['remote'] = 1;
+ $conf['remoteuser'] = '';
+ $conf['useacl'] = 0;
+
+ $this->server = new XmlRpcServerTestWrapper(true);
+ }
+
+
+ function testDateFormat()
+ {
+ $pageName = ":wiki:dokuwiki";
+ $file = wikiFN($pageName);
+ $timestamp = filemtime($file);
+ $ixrModifiedTime = (new DateTime('@' . $timestamp))->format(IXR_Date::XMLRPC_ISO8601);
+
+ $request = <<<EOD
+<?xml version="1.0"?>
+ <methodCall>
+ <methodName>wiki.getPageInfo</methodName>
+ <param>
+ <value>
+ <string>$pageName</string>
+ </value>
+ </param>
+ </methodCall>
+EOD;
+ $expected = <<<EOD
+<methodResponse>
+ <params>
+ <param>
+ <value>
+ <struct>
+ <member><name>name</name><value><string>wiki:dokuwiki</string></value></member>
+ <member><name>lastModified</name><value><dateTime.iso8601>$ixrModifiedTime</dateTime.iso8601></value></member>
+ <member><name>author</name><value><string></string></value></member>
+ <member><name>version</name><value><int>$timestamp</int></value></member>
+</struct>
+ </value>
+ </param>
+ </params>
+</methodResponse>
+EOD;
+
+ $this->server->serve($request);
+ $this->assertEquals(trim($expected), trim($this->server->output));
+ }
+}
diff --git a/_test/tests/inc/auth_aclcheck.test.php b/_test/tests/inc/auth_aclcheck.test.php
index 8c9b37536..2b5342e43 100644
--- a/_test/tests/inc/auth_aclcheck.test.php
+++ b/_test/tests/inc/auth_aclcheck.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\test\mock\AuthPlugin;
+
class auth_acl_test extends DokuWikiTest {
protected $oldAuthAcl;
@@ -9,7 +11,7 @@ class auth_acl_test extends DokuWikiTest {
global $AUTH_ACL;
global $auth;
$this->oldAuthAcl = $AUTH_ACL;
- $auth = new DokuWiki_Auth_Plugin();
+ $auth = new AuthPlugin();
}
function tearDown() {
diff --git a/_test/tests/inc/auth_aclcheck_caseinsensitive.test.php b/_test/tests/inc/auth_aclcheck_caseinsensitive.test.php
index 21b2cfdb0..af0f17223 100644
--- a/_test/tests/inc/auth_aclcheck_caseinsensitive.test.php
+++ b/_test/tests/inc/auth_aclcheck_caseinsensitive.test.php
@@ -1,10 +1,6 @@
<?php
-class auth_acl_caseinsensitive_auth extends DokuWiki_Auth_Plugin {
- function isCaseSensitive() {
- return false;
- }
-}
+use dokuwiki\test\mock\AuthCaseInsensitivePlugin;
class auth_acl_caseinsensitive_test extends DokuWikiTest {
protected $oldAuth;
@@ -18,7 +14,7 @@ class auth_acl_caseinsensitive_test extends DokuWikiTest {
$this->oldAuth = $auth;
$this->oldAuthAcl = $AUTH_ACL;
- $auth = new auth_acl_caseinsensitive_auth();
+ $auth = new AuthCaseInsensitivePlugin();
}
function tearDown() {
diff --git a/_test/tests/inc/auth_admincheck.test.php b/_test/tests/inc/auth_admincheck.test.php
index 087be3810..718cd642f 100644
--- a/_test/tests/inc/auth_admincheck.test.php
+++ b/_test/tests/inc/auth_admincheck.test.php
@@ -1,125 +1,129 @@
<?php
-class auth_admin_test_AuthInSensitive extends DokuWiki_Auth_Plugin {
- function isCaseSensitive(){
- return false;
- }
-}
+use dokuwiki\test\mock\AuthCaseInsensitivePlugin;
+use dokuwiki\test\mock\AuthPlugin;
-class auth_admin_test extends DokuWikiTest {
+class auth_admin_test extends DokuWikiTest
+{
private $oldauth;
- function setUp() {
+ function setUp()
+ {
parent::setUp();
global $auth;
$this->oldauth = $auth;
}
- function setSensitive() {
+ function setSensitive()
+ {
global $auth;
- $auth = new DokuWiki_Auth_Plugin();
+ $auth = new AuthPlugin();
}
- function setInSensitive() {
+ function setInSensitive()
+ {
global $auth;
- $auth = new auth_admin_test_AuthInSensitive();
+ $auth = new AuthCaseInsensitivePlugin();
}
- function teardown() {
+ function teardown()
+ {
global $auth;
global $AUTH_ACL;
unset($AUTH_ACL);
$auth = $this->oldauth;
}
- function test_ismanager_insensitive(){
+ 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);
+ $this->assertFalse(auth_ismanager('jill', null, false, true));
// admin or manager users
- $this->assertEquals(auth_ismanager('john', null,false), true);
- $this->assertEquals(auth_ismanager('doe', null,false), true);
+ $this->assertTrue(auth_ismanager('john', null, false, true));
+ $this->assertTrue(auth_ismanager('doe', null, false, true));
- $this->assertEquals(auth_ismanager('dörte', null,false), true);
- $this->assertEquals(auth_ismanager('dänny', null,false), true);
+ $this->assertTrue(auth_ismanager('dörte', null, false, true));
+ $this->assertTrue(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->assertTrue(auth_ismanager('jill', array('admin'), false, true));
+ $this->assertTrue(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);
+ $this->assertTrue(auth_ismanager('jill', array('mötly görls'), false, true));
+ $this->assertTrue(auth_ismanager('jill', array('mötly böys'), false, true));
}
- function test_isadmin_insensitive(){
+ function test_isadmin_insensitive()
+ {
$this->setInSensitive();
global $conf;
$conf['superuser'] = 'john,@admin,doe,@roots';
// anonymous user
- $this->assertEquals(auth_ismanager('jill', null,true), false);
+ $this->assertFalse(auth_ismanager('jill', null, true, true));
// admin user
- $this->assertEquals(auth_ismanager('john', null,true), true);
- $this->assertEquals(auth_ismanager('doe', null,true), true);
+ $this->assertTrue(auth_ismanager('john', null, true, true));
+ $this->assertTrue(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);
+ $this->assertTrue(auth_ismanager('jill', array('admin'), true, true));
+ $this->assertTrue(auth_ismanager('jill', array('roots'), true, true));
+ $this->assertTrue(auth_ismanager('john', array('admin'), true, true));
+ $this->assertTrue(auth_ismanager('doe', array('admin'), true, true));
}
- function test_ismanager_sensitive(){
+ 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);
+ $this->assertFalse(auth_ismanager('jill', null, false, true));
// admin or manager users
- $this->assertEquals(auth_ismanager('john', null,false), true);
- $this->assertEquals(auth_ismanager('doe', null,false), true);
+ $this->assertTrue(auth_ismanager('john', null, false, true));
+ $this->assertTrue(auth_ismanager('doe', null, false, true));
- $this->assertEquals(auth_ismanager('dörte', null,false), false);
- $this->assertEquals(auth_ismanager('dänny', null,false), false);
+ $this->assertFalse(auth_ismanager('dörte', null, false, true));
+ $this->assertFalse(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->assertTrue(auth_ismanager('jill', array('admin'), false, true));
+ $this->assertTrue(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);
+ $this->assertFalse(auth_ismanager('jill', array('mötly görls'), false, true));
+ $this->assertFalse(auth_ismanager('jill', array('mötly böys'), false, true));
}
- function test_isadmin_sensitive(){
+ function test_isadmin_sensitive()
+ {
$this->setSensitive();
global $conf;
$conf['superuser'] = 'john,@admin,doe,@roots';
// anonymous user
- $this->assertEquals(auth_ismanager('jill', null,true), false);
+ $this->assertFalse(auth_ismanager('jill', null, true, true));
// admin user
- $this->assertEquals(auth_ismanager('john', null,true), true);
- $this->assertEquals(auth_ismanager('Doe', null,true), false);
+ $this->assertTrue(auth_ismanager('john', null, true, true));
+ $this->assertFalse(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);
- $this->assertEquals(auth_ismanager('Doe', array('admin'),true), true);
+ $this->assertTrue(auth_ismanager('jill', array('admin'), true, true));
+ $this->assertTrue(auth_ismanager('jill', array('roots'), true, true));
+ $this->assertTrue(auth_ismanager('john', array('admin'), true, true));
+ $this->assertTrue(auth_ismanager('doe', array('admin'), true, true));
+ $this->assertTrue(auth_ismanager('Doe', array('admin'), true, true));
}
}
-
-//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/auth_deleteprofile.test.php b/_test/tests/inc/auth_deleteprofile.test.php
index dc38fcd16..ebefae59d 100644
--- a/_test/tests/inc/auth_deleteprofile.test.php
+++ b/_test/tests/inc/auth_deleteprofile.test.php
@@ -1,33 +1,14 @@
<?php
-class Mock_Auth_Plugin extends DokuWiki_Auth_Plugin {
-
- public $loggedOff = false;
-
- public function __construct($canDeleteUser = true) {
- $this->cando['delUser'] = $canDeleteUser;
- }
-
- public function checkPass($user, $pass) {
- return $pass == 'password';
- }
-
- public function deleteUsers($users) {
- return in_array($_SERVER['REMOTE_USER'], $users);
- }
-
- public function logoff() {
- $this->loggedOff = true;
- }
-
-}
+use dokuwiki\Input\Input;
+use dokuwiki\test\mock\AuthDeletePlugin;
class auth_deleteprofile_test extends DokuWikiTest {
/*
* Tests:
*
- * 1. It works and the user is logged off
+ * 1. It works and the user is logged off
* 2. Password matches when config requires it
* 3,4. Auth plugin can prevent & wiki config can prevent
* 5. Any of invalid security token, missing/not set 'delete' flag, missing/unchecked 'confirm_delete'
@@ -53,7 +34,7 @@ class auth_deleteprofile_test extends DokuWikiTest {
$_REQUEST = $input;
$INPUT = new Input();
- $auth = new Mock_Auth_Plugin();
+ $auth = new AuthDeletePlugin();
$this->assertTrue(auth_deleteprofile());
$this->assertTrue($auth->loggedOff);
@@ -79,7 +60,7 @@ class auth_deleteprofile_test extends DokuWikiTest {
$_REQUEST = $input;
$INPUT = new Input();
- $auth = new Mock_Auth_Plugin();
+ $auth = new AuthDeletePlugin();
// password check required - it fails, so don't delete profile
$this->assertFalse(auth_deleteprofile());
@@ -109,7 +90,7 @@ class auth_deleteprofile_test extends DokuWikiTest {
$_REQUEST = $input;
$INPUT = new Input();
- $auth = new Mock_Auth_Plugin(false);
+ $auth = new AuthDeletePlugin(false);
$conf['disableactions'] = '';
$this->assertFalse(auth_deleteprofile());
}
@@ -133,7 +114,7 @@ class auth_deleteprofile_test extends DokuWikiTest {
$_REQUEST = $input;
$INPUT = new Input();
- $auth = new Mock_Auth_Plugin();
+ $auth = new AuthDeletePlugin();
$conf['disableactions'] = 'profile_delete';
$this->assertFalse(actionOK('profile_delete'));
@@ -162,7 +143,7 @@ class auth_deleteprofile_test extends DokuWikiTest {
$_REQUEST = $input;
$input_foundation = new Input();
- $auth = new Mock_Auth_Plugin();
+ $auth = new AuthDeletePlugin();
$INPUT = clone $input_foundation;
$INPUT->remove('delete');
@@ -176,4 +157,4 @@ class auth_deleteprofile_test extends DokuWikiTest {
$INPUT->remove('confirm_delete');
$this->assertFalse(auth_deleteprofile());
}
-} \ No newline at end of file
+}
diff --git a/_test/tests/inc/auth_password.test.php b/_test/tests/inc/auth_password.test.php
index 3ecc5f85e..beb95c060 100644
--- a/_test/tests/inc/auth_password.test.php
+++ b/_test/tests/inc/auth_password.test.php
@@ -92,6 +92,20 @@ class auth_password_test extends DokuWikiTest {
$this->assertTrue(auth_verifyPassword('test12345', '$H$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0'));
}
+ function test_verifypassword_drupal_sha512() {
+ $this->assertTrue(auth_verifypassword('drupal_sha512', '$S$D7JxIm0f7QKO3zjwVS1RH4AW8sYvmLjO0.Rn4swH0JVt6OrZ4yzZ'));
+ }
+
+ function test_verifypassword_drupal_migrated_6to7() {
+ $this->assertTrue(auth_verifypassword('pouette1234', 'U$S$9c47LGZuhR6TvhRQXzymkJIQ3mXthUCc6KDEGTt4B7eOL/H9Ykuy'));
+ }
+
+ function test_verifyPassword_seafilepbkdf2() {
+ $hash='PBKDF2SHA256$10000$99227b6df52aa1394b5ca0aceee2733dd6c2670c85bbe26c751a2c65e79d4db7$d61dd1c4df6873c73813fe97f96d0e917792602a33966f3fab0eef154637cc84';
+ $pw='@STR0NGpassW0RD';
+ $this->assertTrue(auth_verifyPassword($pw, $hash));
+ }
+
function test_veryPassword_mediawiki() {
$this->assertTrue(auth_verifyPassword('password', ':B:838c83e1:e4ab7024509eef084cdabd03d8b2972c'));
}
@@ -110,4 +124,15 @@ class auth_password_test extends DokuWikiTest {
$this->assertTrue($except);
}
+ /**
+ * issue #2629, support PHP's crypt() format (with rounds=0 parameter)
+ */
+ function test_verifyPassword_sha512_crypt() {
+ if(defined('CRYPT_SHA512') && CRYPT_SHA512 == 1) {
+ $this->assertTrue(auth_verifyPassword('Qwerty123', '$6$rounds=3000$9in6UciYPFG6ydsJ$YBjypQ7XoRqvJoX1a2.spSysSVHcdreVXi1Xh5SyOxo2yNSxDjlUCun2YXrwk9.YP6vmRvCWrhp0fbPgSOT7..'));
+ } else {
+ $this->markTestSkipped('SHA512 not available in this PHP environment');
+ }
+ }
+
}
diff --git a/_test/tests/inc/cache_stalecheck.test.php b/_test/tests/inc/cache_stalecheck.test.php
index 93f44a55c..2172d9930 100644
--- a/_test/tests/inc/cache_stalecheck.test.php
+++ b/_test/tests/inc/cache_stalecheck.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\Cache\CacheRenderer;
+
class cache_stalecheck_test extends DokuWikiTest {
function test_staleness() {
global $ID;
@@ -11,7 +13,7 @@ class cache_stalecheck_test extends DokuWikiTest {
saveWikiText($ID, 'Fresh', 'Created');
# Create stale cache
- $cache = new cache_renderer($ID, $file, 'xhtml');
+ $cache = new CacheRenderer($ID, $file, 'xhtml');
$cache->storeCache('Stale');
$stale = $cache->retrieveCache();
diff --git a/_test/tests/inc/cache_use.test.php b/_test/tests/inc/cache_use.test.php
index c0c12580a..3a1028d13 100644
--- a/_test/tests/inc/cache_use.test.php
+++ b/_test/tests/inc/cache_use.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\Cache\CacheRenderer;
+
/**
* Class cache_use_test
*
@@ -8,7 +10,7 @@
* @todo tests marked as flaky until Ticket #694 has been fixed
*/
class cache_use_test extends DokuWikiTest {
- /** @var cache_renderer $cache */
+ /** @var CacheRenderer $cache */
private $cache;
function setUp() {
@@ -21,7 +23,7 @@ class cache_use_test extends DokuWikiTest {
saveWikiText($ID, 'Content', 'Created');
- $this->cache = new cache_renderer($ID, $file, 'xhtml');
+ $this->cache = new CacheRenderer($ID, $file, 'xhtml');
$this->cache->storeCache('Test');
// set the modification times explicitly (overcome Issue #694)
@@ -76,6 +78,6 @@ class cache_use_test extends DokuWikiTest {
$conf['cachetime'] = -1; // disables renderer caching
$this->assertFalse($this->cache->useCache());
- $this->assertNotEmpty($this->cache->_nocache);
+ $this->assertNotEmpty($this->cache->isNoCache());
}
}
diff --git a/_test/tests/inc/changelog_getRevisionsAround.test.php b/_test/tests/inc/changelog_getRevisionsAround.test.php
index 2a5cb849e..ad6d3afcf 100644
--- a/_test/tests/inc/changelog_getRevisionsAround.test.php
+++ b/_test/tests/inc/changelog_getRevisionsAround.test.php
@@ -1,4 +1,7 @@
<?php
+
+use dokuwiki\ChangeLog\PageChangeLog;
+
/**
* Tests for requesting revisions of a page with getRevisions()
*
@@ -185,4 +188,4 @@ class changelog_getrevisionsaround_test extends DokuWikiTest {
$this->assertEquals($revsexpected, $revs);
}
-} \ No newline at end of file
+}
diff --git a/_test/tests/inc/changelog_getlastrevisionat.test.php b/_test/tests/inc/changelog_getlastrevisionat.test.php
index 4ab7900b6..cec54f6db 100644
--- a/_test/tests/inc/changelog_getlastrevisionat.test.php
+++ b/_test/tests/inc/changelog_getlastrevisionat.test.php
@@ -1,5 +1,8 @@
<?php
+use dokuwiki\ChangeLog\MediaChangeLog;
+use dokuwiki\ChangeLog\PageChangeLog;
+
/**
* Tests for requesting revisioninfo of a revision of a page with getRevisionInfo()
*
@@ -10,7 +13,7 @@
class changelog_getlastrevisionat_test extends DokuWikiTest {
private $pageid = 'mailinglist';
-
+
function setup() {
parent::setup();
global $cache_revinfo;
@@ -22,7 +25,7 @@ class changelog_getlastrevisionat_test extends DokuWikiTest {
unset($cache['mailinglist']);
}
}
-
+
/**
* no nonexist.changes meta file available
@@ -53,7 +56,7 @@ class changelog_getlastrevisionat_test extends DokuWikiTest {
$this->assertEquals($revsexpected, $revs);
}
-
+
/**
* test a future revision
*
@@ -64,7 +67,7 @@ class changelog_getlastrevisionat_test extends DokuWikiTest {
//set a known timestamp
touch(wikiFN($this->pageid), $rev);
-
+
$rev +=1;
$pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
@@ -89,7 +92,7 @@ class changelog_getlastrevisionat_test extends DokuWikiTest {
/**
* Request not existing revision
- *
+ *
*/
function test_olderrev() {
$rev = 1;
@@ -124,7 +127,7 @@ class changelog_getlastrevisionat_test extends DokuWikiTest {
$current = $pagelog->getLastRevisionAt($rev);
$this->assertEquals($currentexpected, $current);
}
-
+
/**
* test get correct revision on deleted media
*
@@ -154,13 +157,13 @@ class changelog_getlastrevisionat_test extends DokuWikiTest {
$ret = media_delete($image, 0);
- $medialog = new MediaChangelog($image);
+ $medialog = new MediaChangeLog($image);
$current = $medialog->getLastRevisionAt($rev);
// as we wait for a tick, we should get something greater than the timestamp
$this->assertGreaterThan($revexpected, $current);
// however, it should be less than the current time or equal to it
$this->assertLessThanOrEqual(time(), $current);
-
+
//restore settings
$_SERVER['REMOTE_USER'] = $oldRemoteUser;
$conf['superuser'] = $oldSuperUser;
diff --git a/_test/tests/inc/changelog_getrelativerevision.test.php b/_test/tests/inc/changelog_getrelativerevision.test.php
index f9962066a..49d7a0915 100644
--- a/_test/tests/inc/changelog_getrelativerevision.test.php
+++ b/_test/tests/inc/changelog_getrelativerevision.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\ChangeLog\PageChangeLog;
+
/**
* Tests for requesting revisioninfo of a revision of a page with getRevisionInfo()
*
@@ -415,4 +417,4 @@ class changelog_getrelativerevision_test extends DokuWikiTest {
$current = $pagelog->isCurrentRevision($rev);
$this->assertEquals($currentexpected, $current);
}
-} \ No newline at end of file
+}
diff --git a/_test/tests/inc/changelog_getrevisioninfo.test.php b/_test/tests/inc/changelog_getrevisioninfo.test.php
index 79b31d68e..2d7ad131a 100644
--- a/_test/tests/inc/changelog_getrevisioninfo.test.php
+++ b/_test/tests/inc/changelog_getrevisioninfo.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\ChangeLog\PageChangeLog;
+
/**
* Tests for requesting revisioninfo of a revision of a page with getRevisionInfo()
*
@@ -137,4 +139,4 @@ class changelog_getrevisionsinfo_test extends DokuWikiTest {
$info = $pagelog->getRevisionInfo($rev);
$this->assertEquals($infoexpected, $info);
}
-} \ No newline at end of file
+}
diff --git a/_test/tests/inc/changelog_getrevisions.test.php b/_test/tests/inc/changelog_getrevisions.test.php
index b247ce3d6..e29b80997 100644
--- a/_test/tests/inc/changelog_getrevisions.test.php
+++ b/_test/tests/inc/changelog_getrevisions.test.php
@@ -1,4 +1,7 @@
<?php
+
+use dokuwiki\ChangeLog\PageChangeLog;
+
/**
* Tests for requesting revisions of a page with getRevisions()
*
@@ -227,4 +230,4 @@ class changelog_getrevisions_test extends DokuWikiTest {
$this->assertEquals($revsexpected, $revs);
}
-} \ No newline at end of file
+}
diff --git a/_test/tests/inc/changelog_hasrevisions.test.php b/_test/tests/inc/changelog_hasrevisions.test.php
new file mode 100644
index 000000000..cace7b244
--- /dev/null
+++ b/_test/tests/inc/changelog_hasrevisions.test.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * Tests for if a page has revisions with hasRevisions()
+ *
+ * This class uses the files:
+ * - data/meta/mailinglist.changes
+ */
+class changelog_hasrevisions_test extends DokuWikiTest {
+
+ /**
+ * test page has revisions
+ */
+ function test_hasrevisions() {
+ $id = 'mailinglist';
+
+ $pagelog = new PageChangeLog($id);
+ $result = $pagelog->hasRevisions();
+ $this->assertTrue($result);
+ }
+
+ /**
+ * test page has no revisions
+ */
+ function test_norevisions() {
+ $id = 'nonexist';
+
+ $pagelog = new PageChangeLog($id);
+ $result = $pagelog->hasRevisions();
+ $this->assertFalse($result);
+ }
+}
diff --git a/_test/tests/inc/common_basicinfo.test.php b/_test/tests/inc/common_basicinfo.test.php
index 8359c0877..1bcc1a0d5 100644
--- a/_test/tests/inc/common_basicinfo.test.php
+++ b/_test/tests/inc/common_basicinfo.test.php
@@ -1,11 +1,11 @@
<?php
class common_infofunctions_test extends DokuWikiTest {
-
+
function setup(){
parent::setup();
- global $USERINFO;
+ global $USERINFO;
$USERINFO = array(
'pass' => '179ad45c6ce2cb97cf1029e212046e81',
'name' => 'Arthur Dent',
@@ -15,7 +15,7 @@ class common_infofunctions_test extends DokuWikiTest {
$_SERVER['REMOTE_USER'] = 'testuser';
$_SERVER['REMOTE_ADDR'] = '1.2.3.4';
}
-
+
function _get_info() {
global $USERINFO;
$info = array (
@@ -27,7 +27,7 @@ class common_infofunctions_test extends DokuWikiTest {
'ismobile' => false,
'client' => 'testuser',
);
-
+
return $info;
}
@@ -36,14 +36,15 @@ class common_infofunctions_test extends DokuWikiTest {
* Other functions provide the values
*/
function test_basicinfo(){
+ global $ID;
// test with REMOTE_USER set and the user an admin user
$info = $this->_get_info();
$this->assertEquals(basicinfo($ID,true),$info);
-
- // with $httpclient parameter set to false
+
+ // with $httpclient parameter set to false
unset($info['ismobile']);
$this->assertEquals(basicinfo($ID,false),$info);
-
+
// with anonymous user
unset($_SERVER['REMOTE_USER']);
global $USERINFO; $USERINFO = array();
@@ -58,7 +59,7 @@ class common_infofunctions_test extends DokuWikiTest {
);
$this->assertEquals(basicinfo($ID,true),$info);
}
-
+
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/common_clientip.test.php b/_test/tests/inc/common_clientip.test.php
index 5b569cd98..b06390ee4 100644
--- a/_test/tests/inc/common_clientip.test.php
+++ b/_test/tests/inc/common_clientip.test.php
@@ -2,12 +2,19 @@
class common_clientIP_test extends DokuWikiTest {
+ function setup(){
+ parent::setup();
+
+ global $conf;
+ $conf['trustedproxy'] = '^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)';
+ }
+
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->assertEquals(clientIP(),$out);
+ $this->assertEquals($out, clientIP());
}
function test_proxy1_all(){
@@ -15,7 +22,7 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '77.77.77.77';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '';
$out = '123.123.123.123,77.77.77.77';
- $this->assertEquals(clientIP(),$out);
+ $this->assertEquals($out, clientIP());
}
function test_proxy2_all(){
@@ -23,7 +30,7 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77';
$out = '123.123.123.123,77.77.77.77';
- $this->assertEquals(clientIP(),$out);
+ $this->assertEquals($out, clientIP());
}
function test_proxyhops_all(){
@@ -31,7 +38,7 @@ class common_clientIP_test extends DokuWikiTest {
$_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->assertEquals(clientIP(),$out);
+ $this->assertEquals($out, clientIP());
}
function test_simple_single(){
@@ -39,31 +46,63 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '';
$out = '123.123.123.123';
- $this->assertEquals(clientIP(true),$out);
+ $this->assertEquals($out, clientIP(true));
}
function test_proxy1_single(){
$_SERVER['REMOTE_ADDR'] = '123.123.123.123';
$_SERVER['HTTP_X_REAL_IP'] = '77.77.77.77';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '';
- $out = '77.77.77.77';
- $this->assertEquals(clientIP(true),$out);
+ $out = '123.123.123.123';
+ $this->assertEquals($out, clientIP(true));
}
function test_proxy2_single(){
$_SERVER['REMOTE_ADDR'] = '123.123.123.123';
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77';
- $out = '77.77.77.77';
- $this->assertEquals(clientIP(true),$out);
+ $out = '123.123.123.123';
+ $this->assertEquals($out, clientIP(true));
}
function test_proxyhops_single(){
$_SERVER['REMOTE_ADDR'] = '123.123.123.123';
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77,66.66.66.66';
+ $out = '123.123.123.123';
+ $this->assertEquals($out, clientIP(true));
+ }
+
+ function test_proxy1_local_single(){
+ $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+ $_SERVER['HTTP_X_REAL_IP'] = '77.77.77.77';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '';
+ $out = '77.77.77.77';
+ $this->assertEquals($out, clientIP(true));
+ }
+
+ function test_proxy2_local_single(){
+ $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77';
+ $out = '77.77.77.77';
+ $this->assertEquals($out, clientIP(true));
+ }
+
+ function test_proxyhops1_local_single(){
+ $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77,66.66.66.66';
+ $out = '77.77.77.77';
+ $this->assertEquals($out, clientIP(true));
+ }
+
+ function test_proxyhops2_local_single(){
+ $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '10.0.0.1,66.66.66.66';
$out = '66.66.66.66';
- $this->assertEquals(clientIP(true),$out);
+ $this->assertEquals($out, clientIP(true));
}
function test_local_all(){
@@ -71,7 +110,7 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '127.0.0.1';
$out = '123.123.123.123,127.0.0.1';
- $this->assertEquals(clientIP(),$out);
+ $this->assertEquals($out, clientIP());
}
function test_local1_single(){
@@ -79,7 +118,7 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '127.0.0.1';
$out = '123.123.123.123';
- $this->assertEquals(clientIP(true),$out);
+ $this->assertEquals($out, clientIP(true));
}
function test_local2_single(){
@@ -87,7 +126,7 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '123.123.123.123';
$out = '123.123.123.123';
- $this->assertEquals(clientIP(true),$out);
+ $this->assertEquals($out, clientIP(true));
}
function test_local3_single(){
@@ -95,7 +134,7 @@ class common_clientIP_test extends DokuWikiTest {
$_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->assertEquals(clientIP(true),$out);
+ $this->assertEquals($out, clientIP(true));
}
function test_local4_single(){
@@ -103,7 +142,7 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '192.168.0.5';
$out = '192.168.0.5';
- $this->assertEquals(clientIP(true),$out);
+ $this->assertEquals($out, clientIP(true));
}
function test_garbage_all(){
@@ -111,7 +150,7 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
$out = '123.123.123.123';
- $this->assertEquals(clientIP(),$out);
+ $this->assertEquals($out, clientIP());
}
function test_garbage_single(){
@@ -119,7 +158,7 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
$out = '123.123.123.123';
- $this->assertEquals(clientIP(true),$out);
+ $this->assertEquals($out, clientIP(true));
}
function test_garbageonly_all(){
@@ -127,7 +166,7 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
$out = '0.0.0.0';
- $this->assertEquals(clientIP(),$out);
+ $this->assertEquals($out, clientIP());
}
function test_garbageonly_single(){
@@ -135,7 +174,7 @@ class common_clientIP_test extends DokuWikiTest {
$_SERVER['HTTP_X_REAL_IP'] = '';
$_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
$out = '0.0.0.0';
- $this->assertEquals(clientIP(true),$out);
+ $this->assertEquals($out, clientIP(true));
}
function test_malicious(){
@@ -143,7 +182,23 @@ class common_clientIP_test extends DokuWikiTest {
$_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->assertEquals(clientIP(),$out);
+ $this->assertEquals($out, clientIP());
+ }
+
+ function test_malicious_with_remote_addr(){
+ $_SERVER['REMOTE_ADDR'] = '8.8.8.8';
+ $_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 = '8.8.8.8';
+ $this->assertEquals($out, clientIP(true));
+ }
+
+ function test_proxied_malicious_with_remote_addr(){
+ $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '8.8.8.8,<?php set_time_limit(0);echo \'my_delim\';passthru(\',123.123.123.123,\');die;?>';
+ $out = '127.0.0.1,8.8.8.8,123.123.123.123';
+ $this->assertEquals($out, clientIP());
}
}
diff --git a/_test/tests/inc/common_dokupref.test.php b/_test/tests/inc/common_dokupref.test.php
new file mode 100644
index 000000000..e45dfbbdc
--- /dev/null
+++ b/_test/tests/inc/common_dokupref.test.php
@@ -0,0 +1,86 @@
+<?php
+
+class common_dokupref_test extends DokuWikiTest {
+
+ function test_get_default() {
+ $this->assertEquals('nil', get_doku_pref('foo', 'nil'));
+ }
+
+ function test_set() {
+ set_doku_pref('foo1', 'bar1');
+ set_doku_pref('foo2', 'bar2');
+ $this->assertEquals('bar1', get_doku_pref('foo1', 'nil'));
+ $this->assertEquals('bar2', get_doku_pref('foo2', 'nil'));
+ }
+
+ function test_set_encode() {
+ set_doku_pref('foo#1', 'bar#1');
+ set_doku_pref('foo#2', 'bar2');
+ $this->assertEquals('bar#1', get_doku_pref('foo#1', 'nil'));
+ $this->assertEquals('bar2', get_doku_pref('foo#2', 'nil'));
+
+ set_doku_pref('foo#2', 'bar#2');
+ $this->assertEquals('bar#1', get_doku_pref('foo#1', 'nil'));
+ $this->assertEquals('bar#2', get_doku_pref('foo#2', 'nil'));
+ }
+
+ // mitigate bug in #2721
+ function test_duplicate_entries() {
+ $_COOKIE['DOKU_PREFS'] = 'foo1#bar1#foo2#bar1#foo2#bar2';
+ $this->assertEquals('bar2', get_doku_pref('foo2', 'nil'));
+
+ set_doku_pref('foo2', 'new2');
+ $this->assertEquals('bar1', get_doku_pref('foo1', 'nil'));
+ $this->assertEquals('new2', get_doku_pref('foo2', 'nil'));
+ $this->assertEquals('foo1#bar1#foo2#new2', $_COOKIE['DOKU_PREFS'],
+ 'cookie should not have duplicate entries');
+ }
+
+ // This is a definition from #1129
+ function test_empty() {
+ set_doku_pref('foo', '');
+ $this->assertSame('', get_doku_pref('foo', 'nil'));
+
+ set_doku_pref('foo', 0);
+ $this->assertSame('0', get_doku_pref('foo', 'nil'));
+
+ set_doku_pref('foo', null);
+ $this->assertSame('', get_doku_pref('foo', 'nil'));
+
+ set_doku_pref('foo', false);
+ $this->assertSame('nil', get_doku_pref('foo', 'nil'));
+ }
+
+ // #2721
+ function test_set_empty_string() {
+ set_doku_pref('foo1', 'bar1');
+ set_doku_pref('foo2', 'bar1');
+
+ set_doku_pref('foo2', '');
+ $this->assertEquals('bar1', get_doku_pref('foo1', 'nil'));
+ $this->assertEquals('', get_doku_pref('foo2', 'nil'));
+
+ set_doku_pref('foo2', 'bar2');
+ $this->assertEquals('bar1', get_doku_pref('foo1', 'nil'));
+ $this->assertEquals('bar2', get_doku_pref('foo2', 'nil'));
+ $this->assertEquals('foo1#bar1#foo2#bar2', $_COOKIE['DOKU_PREFS'],
+ 'cookie should not have duplicate entries');
+ }
+
+ // #2721
+ function test_set_delete() {
+ set_doku_pref('foo1', 'bar1');
+ set_doku_pref('foo2', 'bar2');
+
+ set_doku_pref('foo1', false);
+ $this->assertEquals('nil', get_doku_pref('foo1', 'nil'));
+ $this->assertEquals('bar2', get_doku_pref('foo2', 'nil'));
+
+ set_doku_pref('foo2', false);
+ $this->assertEquals('nil', get_doku_pref('foo1', 'nil'));
+ $this->assertEquals('nil', get_doku_pref('foo2', 'nil'));
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/common_getGoogleQuery.test.php b/_test/tests/inc/common_getGoogleQuery.test.php
new file mode 100644
index 000000000..8563832bf
--- /dev/null
+++ b/_test/tests/inc/common_getGoogleQuery.test.php
@@ -0,0 +1,38 @@
+<?php
+
+class common_getGoogleQuery_test extends DokuWikiTest {
+
+ /**
+ * https://github.com/splitbrain/dokuwiki/issues/2848
+ */
+ function test_google_form(){
+ global $INPUT;
+ $_SERVER['HTTP_REFERER'] = 'https://www.google.com/url?q=https://www.dokuwiki.org/&sa=D&ust=a&usg=b';
+ $INPUT = new Input();
+ $this->assertEquals('', getGoogleQuery());
+ }
+
+ function test_google_url(){
+ global $INPUT;
+ $_SERVER['HTTP_REFERER'] = 'https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.dokuwiki.org/&ved=a';
+ $INPUT = new Input();
+ $this->assertEquals('', getGoogleQuery());
+ }
+
+ function test_uncommon_url(){
+ global $INPUT;
+ $_SERVER['HTTP_REFERER'] = 'http://search.example.com/search?q=DokuWiki';
+ $INPUT = new Input();
+ $this->assertEquals('', getGoogleQuery());
+ }
+
+ function test_old_google(){
+ global $INPUT;
+ $_SERVER['HTTP_REFERER'] = 'https://www.google.com/search?newwindow=1&q=what%27s+my+referer';
+ $INPUT = new Input();
+ $this->assertEquals(array('what', 's', 'my', 'referer'), getGoogleQuery());
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/common_ml.test.php b/_test/tests/inc/common_ml.test.php
index 027dcaef2..853c634b4 100644
--- a/_test/tests/inc/common_ml.test.php
+++ b/_test/tests/inc/common_ml.test.php
@@ -124,7 +124,7 @@ class common_ml_test extends DokuWikiTest {
foreach($ids as $id) {
$tok = media_get_token($id, $w, 0);
- $hash = substr(PassHash::hmac('md5', $id, auth_cookiesalt()), 0, 6);
+ $hash = substr(\dokuwiki\PassHash::hmac('md5', $id, auth_cookiesalt()), 0, 6);
$expect = DOKU_BASE.$this->script.'?w='.$w.'&amp;tok='.$tok.'&amp;media='.rawurlencode($id);
$this->assertEquals($expect, ml($id, $args));
diff --git a/_test/tests/inc/common_obfuscate.test.php b/_test/tests/inc/common_obfuscate.test.php
index b8ec70980..15fb84546 100644
--- a/_test/tests/inc/common_obfuscate.test.php
+++ b/_test/tests/inc/common_obfuscate.test.php
@@ -5,20 +5,27 @@ class common_obfuscate_test extends DokuWikiTest {
function test_none(){
global $conf;
$conf['mailguard'] = 'none';
- $this->assertEquals(obfuscate('jon-doe@example.com'), 'jon-doe@example.com');
+ $this->assertEquals('jon-doe@example.com', obfuscate('jon-doe@example.com'));
}
function test_hex(){
global $conf;
$conf['mailguard'] = 'hex';
- $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;');
+ $this->assertEquals('&#106;&#111;&#110;&#45;&#100;&#111;&#101;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;',
+ obfuscate('jon-doe@example.com'));
+ }
+
+ function test_hex_utf32(){
+ global $conf;
+ $conf['mailguard'] = 'hex';
+ $this->assertEquals('&#117;&#115;&#101;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#x41f;&#x440;&#x438;&#x432;&#x435;&#x442;',
+ obfuscate('user@example.com?subject=Привет'));
}
function test_visible(){
global $conf;
$conf['mailguard'] = 'visible';
- $this->assertEquals(obfuscate('jon-doe@example.com'), 'jon [dash] doe [at] example [dot] com');
+ $this->assertEquals('jon [dash] doe [at] example [dot] com', obfuscate('jon-doe@example.com'));
}
diff --git a/_test/tests/inc/common_php_to_byte.test.php b/_test/tests/inc/common_php_to_byte.test.php
new file mode 100644
index 000000000..8ab446405
--- /dev/null
+++ b/_test/tests/inc/common_php_to_byte.test.php
@@ -0,0 +1,34 @@
+<?php
+
+class common_php_to_byte_test extends DokuWikiTest {
+
+
+ public function data() {
+ $data = [
+ ['1G', 1073741824],
+ ['8M', 8388608],
+ ['8K', 8192],
+ ['800', 800],
+ ['8', 8],
+ ['0', 0],
+ ['-1', -1]
+ ];
+
+ // larger sizes only work on 64bit platforms
+ if(PHP_INT_SIZE == 8) {
+ $data[] = ['8G', 8589934592];
+ }
+
+ return $data;
+ }
+
+ /**
+ * @dataProvider data
+ * @param string $value
+ * @param int $bytes
+ */
+ public function test_undefined($value, $bytes) {
+ $this->assertSame($bytes, php_to_byte($value));
+ }
+
+}
diff --git a/_test/tests/inc/common_saveWikiText.test.php b/_test/tests/inc/common_saveWikiText.test.php
index fe83caabd..7ae12ca27 100644
--- a/_test/tests/inc/common_saveWikiText.test.php
+++ b/_test/tests/inc/common_saveWikiText.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\ChangeLog\PageChangeLog;
+
class common_saveWikiText_test extends DokuWikiTest {
/** Delay writes of old revisions by a second. */
public function handle_write(Doku_Event $event, $param) {
@@ -166,7 +168,7 @@ class common_saveWikiText_test extends DokuWikiTest {
function test_savesequencedeleteexternalrevision() {
// add an additional delay when saving files to make sure
// nobody relies on the saving happening in the same second
- /** @var $EVENT_HANDLER Doku_Event_Handler */
+ /** @var $EVENT_HANDLER \dokuwiki\Extension\EventHandler */
global $EVENT_HANDLER;
$EVENT_HANDLER->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'handle_write');
diff --git a/_test/tests/inc/common_wl.test.php b/_test/tests/inc/common_wl.test.php
index 4bfde3f39..7e8bd0747 100644
--- a/_test/tests/inc/common_wl.test.php
+++ b/_test/tests/inc/common_wl.test.php
@@ -38,6 +38,15 @@ class common_wl_test extends DokuWikiTest {
$this->assertEquals($expect, wl('some'));
}
+ function test_wl_id_zero() {
+ global $conf;
+ $conf['useslash'] = 0;
+ $conf['userewrite'] = 0;
+
+ $expect = DOKU_BASE . DOKU_SCRIPT . '?id=0';
+ $this->assertEquals($expect, wl('0'));
+ }
+
function test_wl_id_ns() {
global $conf;
$conf['useslash'] = 0;
@@ -142,7 +151,7 @@ class common_wl_test extends DokuWikiTest {
$expect = DOKU_BASE . DOKU_SCRIPT . '/some/one?a=b&c=d';
$this->assertEquals($expect, wl('some:one', 'a=b,c=d', false, '&'));
}
-
+
function test_wl_empty_rev() {
global $conf;
$conf['useslash'] = 0;
diff --git a/_test/tests/inc/events_nested.test.php b/_test/tests/inc/events_nested.test.php
index fe5e395bb..3ed2fcf34 100644
--- a/_test/tests/inc/events_nested.test.php
+++ b/_test/tests/inc/events_nested.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\Extension\Event;
+
/**
* This tests if event handlers can trigger the same event again.
* This is used by plugins that modify cache handling and use metadata
@@ -16,7 +18,7 @@ class events_nested_test extends DokuWikiTest {
$firstcount++;
if ($firstcount == 1) {
$param = array();
- trigger_event('NESTED_EVENT', $param);
+ Event::createAndTrigger('NESTED_EVENT', $param);
}
}
);
@@ -28,7 +30,7 @@ class events_nested_test extends DokuWikiTest {
);
$param = array();
- trigger_event('NESTED_EVENT', $param);
+ Event::createAndTrigger('NESTED_EVENT', $param);
$this->assertEquals(2, $firstcount);
$this->assertEquals(2, $secondcount);
diff --git a/_test/tests/inc/httpclient_http.test.php b/_test/tests/inc/httpclient_http.test.php
index 6cc783b2b..f3afdce66 100644
--- a/_test/tests/inc/httpclient_http.test.php
+++ b/_test/tests/inc/httpclient_http.test.php
@@ -276,13 +276,13 @@ class httpclient_http_test extends DokuWikiTest {
*/
function test_chunked(){
$http = new HTTPMockClient();
- $data = $http->get('http://whoopdedo.org/cgi-bin/chunked/2550');
+ $data = $http->get($this->server.'/stream-bytes/5000?chunk_size=250');
if($http->noconnection()) {
$this->markTestSkipped('connection timed out');
return;
}
$this->assertFalse($data === false, $http->errorInfo());
- $this->assertEquals(2550,strlen($data));
+ $this->assertEquals(5000,strlen($data));
}
/**
@@ -301,6 +301,9 @@ class httpclient_http_test extends DokuWikiTest {
$this->assertTrue($data !== false, $http->errorInfo());
}
+ /**
+ * @throws ReflectionException
+ */
function test_postencode(){
$http = new HTTPMockClient();
@@ -312,7 +315,7 @@ class httpclient_http_test extends DokuWikiTest {
);
$this->assertEquals(
'%C3%B6%C3%A4%3F=%C3%B6%C3%A4%3F&foo=bang',
- $http->_postEncode($data),
+ $this->callInaccessibleMethod($http, 'postEncode', [$data]),
'simple'
);
@@ -323,7 +326,7 @@ class httpclient_http_test extends DokuWikiTest {
);
$this->assertEquals(
'foo=bang&%C3%A4rr%5B0%5D=%C3%B6&%C3%A4rr%5B1%5D=b&%C3%A4rr%5B2%5D=c',
- $http->_postEncode($data),
+ $this->callInaccessibleMethod($http, 'postEncode', [$data]),
'onelevelnum'
);
@@ -334,7 +337,7 @@ class httpclient_http_test extends DokuWikiTest {
);
$this->assertEquals(
'foo=bang&%C3%A4rr%5B%C3%B6%5D=%C3%A4&%C3%A4rr%5Bb%5D=c',
- $http->_postEncode($data),
+ $this->callInaccessibleMethod($http, 'postEncode', [$data]),
'onelevelassoc'
);
@@ -346,7 +349,7 @@ class httpclient_http_test extends DokuWikiTest {
);
$this->assertEquals(
'foo=bang&%C3%A4rr%5B%C3%B6%5D=%C3%A4&%C3%A4rr%5B%C3%A4%5D%5B%C3%B6%5D=%C3%A4',
- $http->_postEncode($data),
+ $this->callInaccessibleMethod($http, 'postEncode', [$data]),
'twolevelassoc'
);
}
diff --git a/_test/tests/inc/httpclient_mock.php b/_test/tests/inc/httpclient_mock.php
index b66b90775..56b99b7a2 100644
--- a/_test/tests/inc/httpclient_mock.php
+++ b/_test/tests/inc/httpclient_mock.php
@@ -1,4 +1,7 @@
<?php
+
+use dokuwiki\HTTP\HTTPClient;
+
/**
* Class HTTPMockClient
*
diff --git a/_test/tests/inc/indexer_indexing.test.php b/_test/tests/inc/indexer_indexing.test.php
index 3d8278d6c..3d4777f11 100644
--- a/_test/tests/inc/indexer_indexing.test.php
+++ b/_test/tests/inc/indexer_indexing.test.php
@@ -59,4 +59,21 @@ class indexer_indexing_test extends DokuWikiTest {
$query = '1010';
$this->assertEquals(array('notfound', 'testpage'), $indexer->lookupKey('onezero', $query));
}
+
+ public function test_numeric_zerostring_meta() {
+ $indexer = idx_get_indexer();
+ $indexer->addMetaKeys('zero1', 'zerostring', array('0'));
+ $indexer->addMetaKeys('zero2', 'zerostring', array('0'));
+ $indexer->addMetaKeys('0', 'zerostring', array('zero'));
+
+ $query = '0';
+ $result = $indexer->lookupKey('zerostring', $query);
+ sort($result);
+ $this->assertEquals(array('zero1', 'zero2'), $result);
+
+ $query = 'zero';
+ $result = $indexer->lookupKey('zerostring', $query);
+ sort($result);
+ $this->assertEquals(array('0'), $result);
+ }
} \ No newline at end of file
diff --git a/_test/tests/inc/indexer_rename.test.php b/_test/tests/inc/indexer_rename.test.php
index d8c456f8e..2dbe6dcad 100644
--- a/_test/tests/inc/indexer_rename.test.php
+++ b/_test/tests/inc/indexer_rename.test.php
@@ -3,7 +3,7 @@
* Test cases for the Doku_Indexer::renamePage and Doku_Indexer::renameMetaValue methods
*/
class indexer_rename_test extends DokuWikiTest {
- /** @var Doku_Indexer $indexer */
+ /** @var \dokuwiki\Search\Indexer $indexer */
private $indexer;
private $old_id = 'old_testid';
diff --git a/_test/tests/inc/input.test.php b/_test/tests/inc/input.test.php
index 4a8fb8d71..099a8eb81 100644
--- a/_test/tests/inc/input.test.php
+++ b/_test/tests/inc/input.test.php
@@ -1,7 +1,9 @@
<?php
+use dokuwiki\Input\Input;
+
/**
- * Tests for the Input class
+ * Tests for the dokuwiki\Input\Input class
*/
class input_test extends DokuWikiTest {
diff --git a/_test/tests/inc/json.test.php b/_test/tests/inc/json.test.php
deleted file mode 100644
index ca939d885..000000000
--- a/_test/tests/inc/json.test.php
+++ /dev/null
@@ -1,418 +0,0 @@
-<?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/tests/inc/mailer.test.php b/_test/tests/inc/mailer.test.php
index 6f35863c2..31c6015e9 100644..100755
--- a/_test/tests/inc/mailer.test.php
+++ b/_test/tests/inc/mailer.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\HTTP\HTTPClient;
+
/**
* Extends the mailer class to expose internal variables for testing
*/
@@ -22,6 +24,9 @@ class TestMailer extends Mailer {
}
+/**
+ * @group mailer_class
+ */
class mailer_test extends DokuWikiTest {
@@ -94,11 +99,36 @@ class mailer_test extends DokuWikiTest {
$headers = $mail->prop('headers');
$this->assertEquals('Andreas Gohr <andi@splitbrain.org>', $headers['To']);
+ $mail->to('"Andreas Gohr" <andi@splitbrain.org>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('"Andreas Gohr" <andi@splitbrain.org>', $headers['To']);
+
+ $mail->to('andi@splitbrain.org,foo@example.com');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('andi@splitbrain.org, foo@example.com', $headers['To']);
+
+ $mail->to('andi@splitbrain.org, Text <foo@example.com>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('andi@splitbrain.org, Text <foo@example.com>', $headers['To']);
+
+ $mail->to('Andreas Gohr <andi@splitbrain.org>,foo@example.com');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('Andreas Gohr <andi@splitbrain.org>, foo@example.com', $headers['To']);
+
$mail->to('Andreas Gohr <andi@splitbrain.org> , foo <foo@example.com>');
$mail->cleanHeaders();
$headers = $mail->prop('headers');
$this->assertEquals('Andreas Gohr <andi@splitbrain.org>, foo <foo@example.com>', $headers['To']);
+ $mail->to('"Foo, Dr." <foo@example.com> , foo <foo@example.com>');
+ $mail->cleanHeaders();
+ $headers = $mail->prop('headers');
+ $this->assertEquals('=?UTF-8?B?IkZvbywgRHIuIg==?= <foo@example.com>, foo <foo@example.com>', $headers['To']);
+
$mail->to('Möp <moep@example.com> , foo <foo@example.com>');
$mail->cleanHeaders();
$headers = $mail->prop('headers');
@@ -334,5 +364,15 @@ A test mail in <strong>html</strong>
$this->assertRegexp('/' . preg_quote($expected_mail_body, '/') . '/', $dump);
}
+
+ function test_getCleanName() {
+ $mail = new TestMailer();
+ $name = $mail->getCleanName('Foo Bar');
+ $this->assertEquals('Foo Bar', $name);
+ $name = $mail->getCleanName('Foo, Bar');
+ $this->assertEquals('"Foo, Bar"', $name);
+ $name = $mail->getCleanName('Foo" Bar');
+ $this->assertEquals('"Foo\" Bar"', $name);
+ }
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/media_searchlist.test.php b/_test/tests/inc/media_searchlist.test.php
index c038d3a20..b881ccc95 100644
--- a/_test/tests/inc/media_searchlist.test.php
+++ b/_test/tests/inc/media_searchlist.test.php
@@ -124,7 +124,7 @@ class media_searchlist_test extends DokuWikiTest {
$info = array();
$info['id'] = $this->upload_ns . ':' . $rel_id;
$info['perm'] = auth_quickaclcheck(getNS($info['id']).':*');
- $info['file'] = utf8_basename($file);
+ $info['file'] = \dokuwiki\Utf8\PhpString::basename($file);
$info['size'] = filesize($file);
$info['mtime'] = filemtime($file);
$info['writable'] = is_writable($file);
diff --git a/_test/tests/inc/pageutils_findnearest.test.php b/_test/tests/inc/pageutils_findnearest.test.php
index c2815a06c..55db44afa 100644
--- a/_test/tests/inc/pageutils_findnearest.test.php
+++ b/_test/tests/inc/pageutils_findnearest.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\test\mock\AuthPlugin;
+
class pageutils_findnearest_test extends DokuWikiTest {
protected $oldAuthAcl;
@@ -13,7 +15,7 @@ class pageutils_findnearest_test extends DokuWikiTest {
$conf['useacl'] = 1;
$this->oldAuthAcl = $AUTH_ACL;
- $auth = new DokuWiki_Auth_Plugin();
+ $auth = new AuthPlugin();
$AUTH_ACL = array(
'* @ALL 1',
@@ -36,6 +38,25 @@ class pageutils_findnearest_test extends DokuWikiTest {
$this->assertEquals(false, $sidebar);
}
+ function testZeroID() {
+ global $ID;
+
+ saveWikiText('sidebar', 'topsidebar-test', '');
+ saveWikiText('0', 'zero-test', '');
+ saveWikiText('0:0:0', 'zero-test', '');
+
+ $ID = '0:0:0';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('sidebar', $sidebar);
+
+ $sidebar = page_findnearest('0');
+ $this->assertEquals('0:0:0', $sidebar);
+
+ $ID = '0';
+ $sidebar = page_findnearest('0');
+ $this->assertEquals('0', $sidebar);
+ }
+
function testExistingSidebars() {
global $ID;
diff --git a/_test/tests/inc/pageutils_getid.test.php b/_test/tests/inc/pageutils_getid.test.php
index 0fcd58666..af5351cce 100644
--- a/_test/tests/inc/pageutils_getid.test.php
+++ b/_test/tests/inc/pageutils_getid.test.php
@@ -3,6 +3,21 @@
class init_getID_test extends DokuWikiTest {
/**
+ * id=0 case
+ */
+ function test_zero_id(){
+ global $conf;
+ $conf['basedir'] = '/';
+ $conf['userewrite'] = 0;
+
+ $_SERVER['SCRIPT_FILENAME'] = '/doku.php';
+ $_SERVER['REQUEST_URI'] = '/doku.php?id=0&do=edit';
+ $_REQUEST['id'] = '0';
+
+ $this->assertSame('0', getID('id'));
+ }
+
+ /**
* fetch media files with basedir and urlrewrite=2
*
* data provided by Jan Decaluwe <jan@jandecaluwe.com>
diff --git a/_test/tests/inc/pageutils_nons.test.php b/_test/tests/inc/pageutils_nons.test.php
new file mode 100644
index 000000000..8b2761f0a
--- /dev/null
+++ b/_test/tests/inc/pageutils_nons.test.php
@@ -0,0 +1,50 @@
+<?php
+
+class init_noNS_test extends DokuWikiTest {
+
+ /**
+ * @dataProvider noNSProvider
+ */
+ public function test_noNS($input, $expected)
+ {
+ global $conf;
+ $conf['start'] = 'start';
+
+ $this->assertSame($expected, noNS($input), $input);
+ }
+
+ public function noNSProvider()
+ {
+ return [
+ ['0:0:0', '0'],
+ ['0:0:start', 'start'],
+ ['foo:0', '0'],
+ ['0', '0'],
+ ];
+ }
+
+ /**
+ * @dataProvider noNSorNSProvider
+ */
+ public function test_noNSorNS($input, $expected)
+ {
+ global $conf;
+ $conf['start'] = 'start';
+
+ $this->assertSame($expected, noNSorNS($input), $input);
+ }
+
+ public function noNSorNSProvider()
+ {
+ return [
+ ['0:0:0', '0'],
+ ['0:0:start', '0'],
+ ['0:start', '0'],
+ ['0:foo', 'foo'],
+ ['foo:0', '0'],
+ ['0', '0'],
+ ];
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/pageutils_resolve_id.test.php b/_test/tests/inc/pageutils_resolve_id.test.php
index 23a2405d4..661f3fe28 100644
--- a/_test/tests/inc/pageutils_resolve_id.test.php
+++ b/_test/tests/inc/pageutils_resolve_id.test.php
@@ -3,7 +3,7 @@
class init_resolve_id_test extends DokuWikiTest {
- function test1(){
+ function test(){
// we test multiple cases here
// format: $ns, $page, $output
$tests = array();
@@ -23,10 +23,14 @@ class init_resolve_id_test extends DokuWikiTest {
$tests[] = array('','..:page','page');
// relative upper in namespace
- $tests[] = array('lev1:lev2','..page','lev1:page');
- $tests[] = array('lev1:lev2','..:page','lev1:page');
- $tests[] = array('lev1:lev2','..:..:page','page');
- $tests[] = array('lev1:lev2','..:..:..:page','page');
+ $tests[] = array('lev1:lev2:lev3','..page','lev1:lev2:page');
+ $tests[] = array('lev1:lev2:lev3','..:page','lev1:lev2:page');
+ $tests[] = array('lev1:lev2:lev3','..:..page','lev1:page');
+ $tests[] = array('lev1:lev2:lev3','..:..:page','lev1:page');
+ $tests[] = array('lev1:lev2:lev3','..:..:..page','page');
+ $tests[] = array('lev1:lev2:lev3','..:..:..:page','page');
+ $tests[] = array('lev1:lev2:lev3','..:..:..:..page','page');
+ $tests[] = array('lev1:lev2:lev3','..:..:..:..:page','page');
// strange and broken ones
$tests[] = array('lev1:lev2','....:....:page','lev1:lev2:page');
@@ -35,7 +39,7 @@ class init_resolve_id_test extends DokuWikiTest {
$tests[] = array('lev1:lev2','..:..:lev3:..:page:....:...','page');
foreach($tests as $test){
- $this->assertEquals(resolve_id($test[0],$test[1]),$test[2]);
+ $this->assertEquals($test[2], resolve_id($test[0],$test[1]), $test[0].' >'.$test[1]);
}
}
diff --git a/_test/tests/inc/parser/lexer.test.php b/_test/tests/inc/parser/lexer.test.php
index 50b6548a4..412bee75b 100644
--- a/_test/tests/inc/parser/lexer.test.php
+++ b/_test/tests/inc/parser/lexer.test.php
@@ -5,10 +5,9 @@
* @subpackage Tests
*/
-/**
-* Includes
-*/
-require_once DOKU_INC . 'inc/parser/lexer.php';
+use dokuwiki\Parsing\Lexer\Lexer;
+use dokuwiki\Parsing\Lexer\ParallelRegex;
+use dokuwiki\Parsing\Lexer\StateStack;
/**
* @package Doku
@@ -17,24 +16,24 @@ require_once DOKU_INC . 'inc/parser/lexer.php';
class TestOfLexerParallelRegex extends DokuWikiTest {
function testNoPatterns() {
- $regex = new Doku_LexerParallelRegex(false);
+ $regex = new ParallelRegex(false);
$this->assertFalse($regex->match("Hello", $match));
$this->assertEquals($match, "");
}
function testNoSubject() {
- $regex = new Doku_LexerParallelRegex(false);
+ $regex = new ParallelRegex(false);
$regex->addPattern(".*");
$this->assertTrue($regex->match("", $match));
$this->assertEquals($match, "");
}
function testMatchAll() {
- $regex = new Doku_LexerParallelRegex(false);
+ $regex = new ParallelRegex(false);
$regex->addPattern(".*");
$this->assertTrue($regex->match("Hello", $match));
$this->assertEquals($match, "Hello");
}
function testCaseSensitive() {
- $regex = new Doku_LexerParallelRegex(true);
+ $regex = new ParallelRegex(true);
$regex->addPattern("abc");
$this->assertTrue($regex->match("abcdef", $match));
$this->assertEquals($match, "abc");
@@ -42,7 +41,7 @@ class TestOfLexerParallelRegex extends DokuWikiTest {
$this->assertEquals($match, "abc");
}
function testCaseInsensitive() {
- $regex = new Doku_LexerParallelRegex(false);
+ $regex = new ParallelRegex(false);
$regex->addPattern("abc");
$this->assertTrue($regex->match("abcdef", $match));
$this->assertEquals($match, "abc");
@@ -50,7 +49,7 @@ class TestOfLexerParallelRegex extends DokuWikiTest {
$this->assertEquals($match, "ABC");
}
function testMatchMultiple() {
- $regex = new Doku_LexerParallelRegex(true);
+ $regex = new ParallelRegex(true);
$regex->addPattern("abc");
$regex->addPattern("ABC");
$this->assertTrue($regex->match("abcdef", $match));
@@ -60,7 +59,7 @@ class TestOfLexerParallelRegex extends DokuWikiTest {
$this->assertFalse($regex->match("Hello", $match));
}
function testPatternLabels() {
- $regex = new Doku_LexerParallelRegex(false);
+ $regex = new ParallelRegex(false);
$regex->addPattern("abc", "letter");
$regex->addPattern("123", "number");
$this->assertEquals($regex->match("abcdef", $match), "letter");
@@ -69,7 +68,7 @@ class TestOfLexerParallelRegex extends DokuWikiTest {
$this->assertEquals($match, "123");
}
function testMatchMultipleWithLookaheadNot() {
- $regex = new Doku_LexerParallelRegex(true);
+ $regex = new ParallelRegex(true);
$regex->addPattern("abc");
$regex->addPattern("ABC");
$regex->addPattern("a(?!\n).{1}");
@@ -82,37 +81,37 @@ class TestOfLexerParallelRegex extends DokuWikiTest {
$this->assertFalse($regex->match("Hello", $match));
}
function testMatchSetOptionCaseless() {
- $regex = new Doku_LexerParallelRegex(true);
+ $regex = new ParallelRegex(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 = new ParallelRegex(true);
$regex->addPattern("(?U)\w+");
$this->assertTrue($regex->match("aaaaaa", $match));
$this->assertEquals($match, "a");
}
function testMatchLookaheadEqual() {
- $regex = new Doku_LexerParallelRegex(true);
+ $regex = new ParallelRegex(true);
$regex->addPattern("\w(?=c)");
$this->assertTrue($regex->match("xbyczd", $match));
$this->assertEquals($match, "y");
}
function testMatchLookaheadNot() {
- $regex = new Doku_LexerParallelRegex(true);
+ $regex = new ParallelRegex(true);
$regex->addPattern("\w(?!b|c)");
$this->assertTrue($regex->match("xbyczd", $match));
$this->assertEquals($match, "b");
}
function testMatchLookbehindEqual() {
- $regex = new Doku_LexerParallelRegex(true);
+ $regex = new ParallelRegex(true);
$regex->addPattern("(?<=c)\w");
$this->assertTrue($regex->match("xbyczd", $match));
$this->assertEquals($match, "z");
}
function testMatchLookbehindNot() {
- $regex = new Doku_LexerParallelRegex(true);
+ $regex = new ParallelRegex(true);
$regex->addPattern("(?<!\A|x|b)\w");
$this->assertTrue($regex->match("xbyczd", $match));
$this->assertEquals($match, "c");
@@ -122,15 +121,15 @@ class TestOfLexerParallelRegex extends DokuWikiTest {
class TestOfLexerStateStack extends DokuWikiTest {
function testStartState() {
- $stack = new Doku_LexerStateStack("one");
+ $stack = new StateStack("one");
$this->assertEquals($stack->getCurrent(), "one");
}
function testExhaustion() {
- $stack = new Doku_LexerStateStack("one");
+ $stack = new StateStack("one");
$this->assertFalse($stack->leave());
}
function testStateMoves() {
- $stack = new Doku_LexerStateStack("one");
+ $stack = new StateStack("one");
$stack->enter("two");
$this->assertEquals($stack->getCurrent(), "two");
$stack->enter("three");
@@ -160,13 +159,13 @@ class TestOfLexer extends DokuWikiTest {
function testNoPatterns() {
$handler = $this->createMock('TestParser');
$handler->expects($this->never())->method('accept');
- $lexer = new Doku_Lexer($handler);
+ $lexer = new Lexer($handler);
$this->assertFalse($lexer->parse("abcdef"));
}
function testEmptyPage() {
$handler = $this->createMock('TestParser');
$handler->expects($this->never())->method('accept');
- $lexer = new Doku_Lexer($handler);
+ $lexer = new Lexer($handler);
$lexer->addPattern("a+");
$this->assertTrue($lexer->parse(""));
}
@@ -189,7 +188,7 @@ class TestOfLexer extends DokuWikiTest {
$handler->expects($this->at(7))->method('accept')
->with("z", DOKU_LEXER_UNMATCHED, 13)->will($this->returnValue(true));
- $lexer = new Doku_Lexer($handler);
+ $lexer = new Lexer($handler);
$lexer->addPattern("a+");
$this->assertTrue($lexer->parse("aaaxayyyaxaaaz"));
}
@@ -201,7 +200,7 @@ class TestOfLexer extends DokuWikiTest {
$handler->expects($this->at($i))->method('accept')
->with($target[$i], $this->anything(), $positions[$i])->will($this->returnValue(true));
}
- $lexer = new Doku_Lexer($handler);
+ $lexer = new Lexer($handler);
$lexer->addPattern("a+");
$lexer->addPattern("b+");
$this->assertTrue($lexer->parse("ababbxbaxxxxxxax"));
@@ -227,7 +226,7 @@ class TestOfLexerModes extends DokuWikiTest {
->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 = new Lexer($handler, "a");
$lexer->addPattern("a+", "a");
$lexer->addPattern("b+", "b");
$this->assertTrue($lexer->parse("abaabxbaaaxaaaax"));
@@ -261,7 +260,7 @@ class TestOfLexerModes extends DokuWikiTest {
$handler->expects($this->at(12))->method('b')
->with("a", DOKU_LEXER_UNMATCHED,18)->will($this->returnValue(true));
- $lexer = new Doku_Lexer($handler, "a");
+ $lexer = new Lexer($handler, "a");
$lexer->addPattern("a+", "a");
$lexer->addEntryPattern(":", "a", "b");
$lexer->addPattern("b+", "b");
@@ -293,7 +292,7 @@ class TestOfLexerModes extends DokuWikiTest {
->with("b", DOKU_LEXER_UNMATCHED,15)->will($this->returnValue(true));
- $lexer = new Doku_Lexer($handler, "a");
+ $lexer = new Lexer($handler, "a");
$lexer->addPattern("a+", "a");
$lexer->addEntryPattern("(", "a", "b");
$lexer->addPattern("b+", "b");
@@ -314,7 +313,7 @@ class TestOfLexerModes extends DokuWikiTest {
->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 = new Lexer($handler, "a");
$lexer->addPattern("a+", "a");
$lexer->addSpecialPattern("b+", "a", "b");
$this->assertTrue($lexer->parse("aabaaxxbbbxx"));
@@ -326,7 +325,7 @@ class TestOfLexerModes extends DokuWikiTest {
$handler->expects($this->at(1))->method('a')
->with(")", DOKU_LEXER_EXIT,2)->will($this->returnValue(true));
- $lexer = new Doku_Lexer($handler, "a");
+ $lexer = new Lexer($handler, "a");
$lexer->addPattern("a+", "a");
$lexer->addExitPattern(")", "a");
$this->assertFalse($lexer->parse("aa)aa"));
@@ -351,7 +350,7 @@ class TestOfLexerHandlers extends DokuWikiTest {
$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 = new Lexer($handler, "mode_a");
$lexer->addPattern("a+", "mode_a");
$lexer->addEntryPattern("(", "mode_a", "mode_b");
$lexer->addPattern("b+", "mode_b");
@@ -389,7 +388,7 @@ class TestOfLexerByteIndices extends DokuWikiTest {
$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 = new Lexer($handler, "ignore");
$lexer->addEntryPattern("<file>", "ignore", "caught");
$lexer->addExitPattern("</file>", "caught");
$lexer->addSpecialPattern('b','caught','special');
@@ -415,7 +414,7 @@ class TestOfLexerByteIndices extends DokuWikiTest {
$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 = new Lexer($handler, "ignore");
$lexer->addEntryPattern('<file>(?=.*</file>)', "ignore", "caught");
$lexer->addExitPattern("</file>", "caught");
$lexer->addSpecialPattern('b','caught','special');
@@ -441,7 +440,7 @@ class TestOfLexerByteIndices extends DokuWikiTest {
$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 = new Lexer($handler, "ignore");
$lexer->addEntryPattern('<file>(?!foo)', "ignore", "caught");
$lexer->addExitPattern("</file>", "caught");
$lexer->addSpecialPattern('b','caught','special');
@@ -467,7 +466,7 @@ class TestOfLexerByteIndices extends DokuWikiTest {
$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 = new Lexer($handler, "ignore");
$lexer->addEntryPattern('<file>', "ignore", "caught");
$lexer->addExitPattern("(?<=d)</file>", "caught");
$lexer->addSpecialPattern('b','caught','special');
@@ -493,7 +492,7 @@ class TestOfLexerByteIndices extends DokuWikiTest {
$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 = new Lexer($handler, 'ignore');
$lexer->addEntryPattern('<file>', 'ignore', 'caught');
$lexer->addExitPattern('(?<!c)</file>', 'caught');
$lexer->addSpecialPattern('b','caught','special');
@@ -520,7 +519,7 @@ class TestOfLexerByteIndices extends DokuWikiTest {
$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 = new 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
index c73f8d137..153f67b26 100644
--- a/_test/tests/inc/parser/parser.inc.php
+++ b/_test/tests/inc/parser/parser.inc.php
@@ -1,20 +1,22 @@
<?php
+use dokuwiki\Parsing\Parser;
+
require_once DOKU_INC . 'inc/parser/parser.php';
require_once DOKU_INC . 'inc/parser/handler.php';
+if (!defined('DOKU_PARSER_EOL')) define('DOKU_PARSER_EOL', "\n"); // add this to make handling test cases simpler
abstract class TestOfDoku_Parser extends DokuWikiTest {
- /** @var Doku_Parser */
+ /** @var Parser */
protected $P;
/** @var Doku_Handler */
protected $H;
function setUp() {
parent::setUp();
- $this->P = new Doku_Parser();
$this->H = new Doku_Handler();
- $this->P->Handler = $this->H;
+ $this->P = new Parser($this->H);
}
function tearDown() {
diff --git a/_test/tests/inc/parser/parser_code.test.php b/_test/tests/inc/parser/parser_code.test.php
index df8225f4e..961db7dd2 100644
--- a/_test/tests/inc/parser/parser_code.test.php
+++ b/_test/tests/inc/parser/parser_code.test.php
@@ -1,4 +1,7 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Code;
+
require_once 'parser.inc.php';
/**
@@ -10,7 +13,7 @@ class TestOfDoku_Parser_Code extends TestOfDoku_Parser {
function setUp() {
parent::setUp();
- $this->P->addMode('code',new Doku_Parser_Mode_Code());
+ $this->P->addMode('code',new Code());
}
function testCode() {
diff --git a/_test/tests/inc/parser/parser_eol.test.php b/_test/tests/inc/parser/parser_eol.test.php
index 6264f8b55..ae5e9cce5 100644
--- a/_test/tests/inc/parser/parser_eol.test.php
+++ b/_test/tests/inc/parser/parser_eol.test.php
@@ -1,10 +1,14 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Eol;
+use dokuwiki\Parsing\ParserMode\Linebreak;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
function testEol() {
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('eol',new Eol());
$this->P->parse("Foo\nBar");
$calls = array (
array('document_start',array()),
@@ -17,7 +21,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
}
function testEolMultiple() {
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('eol',new Eol());
$this->P->parse("Foo\n\nbar\nFoo");
$calls = array (
array('document_start',array()),
@@ -33,7 +37,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
}
function testWinEol() {
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('eol',new Eol());
$this->P->parse("Foo\r\nBar");
$calls = array (
array('document_start',array()),
@@ -46,7 +50,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
}
function testLinebreak() {
- $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->addMode('linebreak',new Linebreak());
$this->P->parse('Foo\\\\ Bar');
$calls = array (
array('document_start',array()),
@@ -61,8 +65,8 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
}
function testLinebreakPlusEol() {
- $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('linebreak',new Linebreak());
+ $this->P->addMode('eol',new Eol());
$this->P->parse('Foo\\\\'."\n\n".'Bar');
$calls = array (
@@ -80,7 +84,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
}
function testLinebreakInvalid() {
- $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->addMode('linebreak',new Linebreak());
$this->P->parse('Foo\\\\Bar');
$calls = array (
array('document_start',array()),
diff --git a/_test/tests/inc/parser/parser_file.test.php b/_test/tests/inc/parser/parser_file.test.php
index 39bda8a58..407b04a48 100644
--- a/_test/tests/inc/parser/parser_file.test.php
+++ b/_test/tests/inc/parser/parser_file.test.php
@@ -1,11 +1,14 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\File;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_File extends TestOfDoku_Parser {
function setUp() {
parent::setUp();
- $this->P->addMode('file',new Doku_Parser_Mode_File());
+ $this->P->addMode('file',new File());
}
function testFile() {
diff --git a/_test/tests/inc/parser/parser_footnote.test.php b/_test/tests/inc/parser/parser_footnote.test.php
index 2457fb031..96d7a8407 100644
--- a/_test/tests/inc/parser/parser_footnote.test.php
+++ b/_test/tests/inc/parser/parser_footnote.test.php
@@ -1,11 +1,24 @@
<?php
+
+use dokuwiki\Parsing\Handler\Lists;
+use dokuwiki\Parsing\ParserMode\Code;
+use dokuwiki\Parsing\ParserMode\Eol;
+use dokuwiki\Parsing\ParserMode\Footnote;
+use dokuwiki\Parsing\ParserMode\Formatting;
+use dokuwiki\Parsing\ParserMode\Hr;
+use dokuwiki\Parsing\ParserMode\Listblock;
+use dokuwiki\Parsing\ParserMode\Preformatted;
+use dokuwiki\Parsing\ParserMode\Quote;
+use dokuwiki\Parsing\ParserMode\Table;
+use dokuwiki\Parsing\ParserMode\Unformatted;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
function setUp() {
parent::setUp();
- $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote());
+ $this->P->addMode('footnote',new Footnote());
}
function testFootnote() {
@@ -39,7 +52,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteLinefeed() {
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('eol',new Eol());
$this->P->parse("Foo (( testing\ntesting )) Bar");
$calls = array (
array('document_start',array()),
@@ -76,7 +89,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteEol() {
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('eol',new Eol());
$this->P->parse("Foo \nX(( test\ning ))Y\n Bar");
$calls = array (
array('document_start',array()),
@@ -95,7 +108,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteStrong() {
- $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
+ $this->P->addMode('strong',new Formatting('strong'));
$this->P->parse('Foo (( **testing** )) Bar');
$calls = array (
array('document_start',array()),
@@ -118,7 +131,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteHr() {
- $this->P->addMode('hr',new Doku_Parser_Mode_HR());
+ $this->P->addMode('hr',new Hr());
$this->P->parse("Foo (( \n ---- \n )) Bar");
$calls = array (
array('document_start',array()),
@@ -139,7 +152,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteCode() {
- $this->P->addMode('code',new Doku_Parser_Mode_Code());
+ $this->P->addMode('code',new Code());
$this->P->parse("Foo (( <code>Test</code> )) Bar");
$calls = array (
array('document_start',array()),
@@ -160,7 +173,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnotePreformatted() {
- $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->addMode('preformatted',new Preformatted());
$this->P->parse("Foo (( \n Test\n )) Bar");
$calls = array (
array('document_start',array()),
@@ -181,8 +194,8 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnotePreformattedEol() {
- $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('preformatted',new Preformatted());
+ $this->P->addMode('eol',new Eol());
$this->P->parse("Foo (( \n Test\n )) Bar");
$calls = array (
array('document_start',array()),
@@ -204,7 +217,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteUnformatted() {
- $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->addMode('unformatted',new Unformatted());
$this->P->parse("Foo (( <nowiki>Test</nowiki> )) Bar");
$calls = array (
array('document_start',array()),
@@ -225,7 +238,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteNotHeader() {
- $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->addMode('unformatted',new Unformatted());
$this->P->parse("Foo (( \n====Test====\n )) Bar");
$calls = array (
array('document_start',array()),
@@ -244,7 +257,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteTable() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse("Foo ((
| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 |
| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
@@ -290,7 +303,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteList() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('listblock',new ListBlock());
$this->P->parse("Foo ((
*A
* B
@@ -303,7 +316,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('nest', array ( array (
array('footnote_open',array()),
array('listu_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('cdata',array("A")),
array('listcontent_close',array()),
@@ -332,7 +345,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteQuote() {
- $this->P->addMode('quote',new Doku_Parser_Mode_Quote());
+ $this->P->addMode('quote',new Quote());
$this->P->parse("Foo ((
> def
>>ghi
@@ -361,7 +374,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
}
function testFootnoteNesting() {
- $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
+ $this->P->addMode('strong',new Formatting('strong'));
$this->P->parse("(( a ** (( b )) ** c ))");
$calls = array(
diff --git a/_test/tests/inc/parser/parser_headers.test.php b/_test/tests/inc/parser/parser_headers.test.php
index a1bf7d2ba..d061899dd 100644
--- a/_test/tests/inc/parser/parser_headers.test.php
+++ b/_test/tests/inc/parser/parser_headers.test.php
@@ -1,10 +1,14 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Eol;
+use dokuwiki\Parsing\ParserMode\Header;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
function testHeader1() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n ====== Header ====== \n def");
$calls = array (
array('document_start',array()),
@@ -23,7 +27,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeader2() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n ===== Header ===== \n def");
$calls = array (
array('document_start',array()),
@@ -42,7 +46,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeader3() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n ==== Header ==== \n def");
$calls = array (
array('document_start',array()),
@@ -61,7 +65,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeader4() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n === Header === \n def");
$calls = array (
array('document_start',array()),
@@ -80,7 +84,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeader5() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n == Header == \n def");
$calls = array (
array('document_start',array()),
@@ -99,7 +103,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeader2UnevenSmaller() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n ===== Header == \n def");
$calls = array (
array('document_start',array()),
@@ -118,7 +122,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeader2UnevenBigger() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n ===== Header =========== \n def");
$calls = array (
array('document_start',array()),
@@ -137,7 +141,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeaderLarge() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n ======= Header ======= \n def");
$calls = array (
array('document_start',array()),
@@ -156,7 +160,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeaderSmall() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n= Header =\n def");
$calls = array (
array('document_start',array()),
@@ -170,7 +174,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
function testHeader1Mixed() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n====== == Header == ======\n def");
$calls = array (
array('document_start',array()),
@@ -189,7 +193,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeader5Mixed() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n== ====== Header ====== ==\n def");
$calls = array (
array('document_start',array()),
@@ -208,7 +212,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeaderMultiline() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n== ====== Header\n ====== ==\n def");
$calls = array (
array('document_start',array()),
@@ -227,14 +231,14 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
# function testNoToc() {
-# $this->P->addMode('notoc',new Doku_Parser_Mode_NoToc());
+# $this->P->addMode('notoc',new 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());
+ $this->P->addMode('header',new Header());
+ $this->P->addMode('eol',new Eol());
$this->P->parse("abc \n ====== Header ====== \n def");
$calls = array (
array('document_start',array()),
@@ -254,7 +258,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
}
function testHeaderMulti2() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("abc \n ====== Header ====== \n def abc \n ===== Header2 ===== \n def");
$calls = array (
array('document_start',array()),
diff --git a/_test/tests/inc/parser/parser_i18n.test.php b/_test/tests/inc/parser/parser_i18n.test.php
index 096f2e227..b10bd9f3e 100644
--- a/_test/tests/inc/parser/parser_i18n.test.php
+++ b/_test/tests/inc/parser/parser_i18n.test.php
@@ -1,4 +1,11 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Acronym;
+use dokuwiki\Parsing\ParserMode\Formatting;
+use dokuwiki\Parsing\ParserMode\Header;
+use dokuwiki\Parsing\ParserMode\Internallink;
+use dokuwiki\Parsing\ParserMode\Table;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_i18n extends TestOfDoku_Parser {
@@ -9,7 +16,7 @@ class TestOfDoku_Parser_i18n extends TestOfDoku_Parser {
'subscript', 'superscript', 'deleted',
);
foreach ( $formats as $format ) {
- $this->P->addMode($format,new Doku_Parser_Mode_Formatting($format));
+ $this->P->addMode($format,new Formatting($format));
}
$this->P->parse("I**ñ**t__ë__r//n//â<sup>t</sup>i<sub>ô</sub>n''à''liz<del>æ</del>tiøn");
$calls = array (
@@ -51,7 +58,7 @@ class TestOfDoku_Parser_i18n extends TestOfDoku_Parser {
}
function testHeader() {
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('header',new Header());
$this->P->parse("Foo\n ==== Iñtërnâtiônàlizætiøn ==== \n Bar");
$calls = array (
array('document_start',array()),
@@ -70,7 +77,7 @@ class TestOfDoku_Parser_i18n extends TestOfDoku_Parser {
}
function testTable() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
| Row 0 Col 1 | Iñtërnâtiônàlizætiøn | Row 0 Col 3 |
@@ -115,7 +122,7 @@ def');
function testAcronym() {
$t = array('Iñtërnâtiônàlizætiøn');
- $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym($t));
+ $this->P->addMode('acronym',new Acronym($t));
$this->P->parse("Foo Iñtërnâtiônàlizætiøn Bar");
$calls = array (
array('document_start',array()),
@@ -130,7 +137,7 @@ def');
}
function testInterwiki() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new InternalLink());
$this->P->parse("Foo [[wp>Iñtërnâtiônàlizætiøn|Iñtërnâtiônàlizætiøn]] Bar");
$calls = array (
array('document_start',array()),
@@ -145,7 +152,7 @@ def');
}
function testInternalLink() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new InternalLink());
$this->P->parse("Foo [[x:Iñtërnâtiônàlizætiøn:y:foo_bar:z|Iñtërnâtiônàlizætiøn]] Bar");
$calls = array (
array('document_start',array()),
diff --git a/_test/tests/inc/parser/parser_links.test.php b/_test/tests/inc/parser/parser_links.test.php
index ee001e73a..cbcfcb87b 100644
--- a/_test/tests/inc/parser/parser_links.test.php
+++ b/_test/tests/inc/parser/parser_links.test.php
@@ -1,4 +1,13 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Camelcaselink;
+use dokuwiki\Parsing\ParserMode\Emaillink;
+use dokuwiki\Parsing\ParserMode\Externallink;
+use dokuwiki\Parsing\ParserMode\Filelink;
+use dokuwiki\Parsing\ParserMode\Internallink;
+use dokuwiki\Parsing\ParserMode\Media;
+use dokuwiki\Parsing\ParserMode\Windowssharelink;
+
require_once 'parser.inc.php';
/**
@@ -9,7 +18,7 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
function testExternalLinkSimple() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
$this->P->parse("Foo http://www.google.com Bar");
$calls = array (
array('document_start',array()),
@@ -24,7 +33,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalLinkCase() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
$this->P->parse("Foo HTTP://WWW.GOOGLE.COM Bar");
$calls = array (
array('document_start',array()),
@@ -39,7 +48,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalIPv4() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
$this->P->parse("Foo http://123.123.3.21/foo Bar");
$calls = array (
array('document_start',array()),
@@ -54,7 +63,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalIPv6() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
$this->P->parse("Foo http://[3ffe:2a00:100:7031::1]/foo Bar");
$calls = array (
array('document_start',array()),
@@ -96,8 +105,8 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
$name = $title;
}
$this->setup();
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('internallink',new Internallink());
+ $this->P->addMode('externallink',new Externallink());
$this->P->parse("Foo $source Bar");
$calls = array (
array('document_start',array()),
@@ -117,7 +126,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalLinkJavascript() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
$this->P->parse("Foo javascript:alert('XSS'); Bar");
$calls = array (
array('document_start',array()),
@@ -130,7 +139,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalWWWLink() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
$this->P->parse("Foo www.google.com Bar");
$calls = array (
array('document_start',array()),
@@ -145,7 +154,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalWWWLinkInPath() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
// See issue #936. Should NOT generate a link!
$this->P->parse("Foo /home/subdir/www/www.something.de/somedir/ Bar");
$calls = array (
@@ -159,7 +168,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalWWWLinkFollowingPath() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
$this->P->parse("Foo /home/subdir/www/ www.something.de/somedir/ Bar");
$calls = array (
array('document_start',array()),
@@ -174,7 +183,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalFTPLink() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
$this->P->parse("Foo ftp.sunsite.com Bar");
$calls = array (
array('document_start',array()),
@@ -189,7 +198,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalFTPLinkInPath() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
// See issue #936. Should NOT generate a link!
$this->P->parse("Foo /home/subdir/www/ftp.something.de/somedir/ Bar");
$calls = array (
@@ -203,7 +212,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalFTPLinkFollowingPath() {
- $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->addMode('externallink',new Externallink());
$this->P->parse("Foo /home/subdir/www/ ftp.something.de/somedir/ Bar");
$calls = array (
array('document_start',array()),
@@ -218,7 +227,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testEmail() {
- $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
+ $this->P->addMode('emaillink',new Emaillink());
$this->P->parse("Foo <bugs@php.net> Bar");
$calls = array (
array('document_start',array()),
@@ -233,7 +242,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testEmailRFC2822() {
- $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
+ $this->P->addMode('emaillink',new Emaillink());
$this->P->parse("Foo <~fix+bug's.for/ev{e}r@php.net> Bar");
$calls = array (
array('document_start',array()),
@@ -248,7 +257,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testEmailCase() {
- $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
+ $this->P->addMode('emaillink',new Emaillink());
$this->P->parse("Foo <bugs@pHp.net> Bar");
$calls = array (
array('document_start',array()),
@@ -264,7 +273,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
function testInternalLinkOneChar() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[l]] Bar");
$calls = array (
array('document_start',array()),
@@ -279,7 +288,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testInternalLinkNoChar() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[]] Bar");
$calls = array (
array('document_start',array()),
@@ -294,7 +303,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testInternalLinkNamespaceNoTitle() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[foo:bar]] Bar");
$calls = array (
array('document_start',array()),
@@ -309,7 +318,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testInternalLinkNamespace() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[x:1:y:foo_bar:z|Test]] Bar");
$calls = array (
array('document_start',array()),
@@ -324,7 +333,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testInternalLinkSectionRef() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[wiki:syntax#internal|Syntax]] Bar");
$calls = array (
array('document_start',array()),
@@ -339,7 +348,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testInternalLinkCodeFollows() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[wiki:internal:link|Test]] Bar <code>command [arg1 [arg2 [arg3]]]</code>");
$calls = array (
array('document_start',array()),
@@ -354,7 +363,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testInternalLinkCodeFollows2() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[wiki:internal:link|[Square brackets in title] Test]] Bar <code>command [arg1 [arg2 [arg3]]]</code>");
$calls = array (
array('document_start',array()),
@@ -369,7 +378,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalInInternalLink() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[http://www.google.com|Google]] Bar");
$calls = array (
array('document_start',array()),
@@ -384,7 +393,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalInInternalLink2() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[http://www.google.com?test[]=squarebracketsinurl|Google]] Bar");
$calls = array (
array('document_start',array()),
@@ -399,7 +408,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testExternalInInternalLink2CodeFollows() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[http://www.google.com?test[]=squarebracketsinurl|Google]] Bar <code>command [arg1 [arg2 [arg3]]]</code>");
$calls = array (
array('document_start',array()),
@@ -414,7 +423,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testTwoInternalLinks() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[foo:bar|one]] and [[bar:foo|two]] Bar");
$calls = array (
array('document_start',array()),
@@ -432,7 +441,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
function testInterwikiLink() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[iw>somepage|Some Page]] Bar");
$calls = array (
array('document_start',array()),
@@ -447,7 +456,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testInterwikiLinkCase() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[IW>somepage|Some Page]] Bar");
$calls = array (
array('document_start',array()),
@@ -462,7 +471,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testInterwikiPedia() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[wp>Callback_(computer_science)|callbacks]] Bar");
$calls = array (
array('document_start',array()),
@@ -477,7 +486,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testCamelCase() {
- $this->P->addMode('camelcaselink',new Doku_Parser_Mode_CamelCaseLink());
+ $this->P->addMode('camelcaselink',new Camelcaselink());
$this->P->parse("Foo FooBar Bar");
$calls = array (
array('document_start',array()),
@@ -492,7 +501,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testFileLink() {
- $this->P->addMode('filelink',new Doku_Parser_Mode_FileLink());
+ $this->P->addMode('filelink',new FileLink());
$this->P->parse('Foo file://temp/file.txt Bar');
$calls = array (
array('document_start',array()),
@@ -507,7 +516,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testFileLinkInternal() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse('Foo [[file://temp/file.txt|Some File]] Bar');
$calls = array (
array('document_start',array()),
@@ -522,7 +531,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testWindowsShareLink() {
- $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink());
+ $this->P->addMode('windowssharelink',new Windowssharelink());
$this->P->parse('Foo \\\server\share Bar');
$calls = array (
array('document_start',array()),
@@ -537,7 +546,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testWindowsShareLinkHyphen() {
- $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink());
+ $this->P->addMode('windowssharelink',new Windowssharelink());
$this->P->parse('Foo \\\server\share-hyphen Bar');
$calls = array (
array('document_start',array()),
@@ -552,7 +561,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testWindowsShareLinkInternal() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse('Foo [[\\\server\share|My Documents]] Bar');
$calls = array (
array('document_start',array()),
@@ -567,7 +576,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaInternal() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{img.gif}} Bar');
$calls = array (
array('document_start',array()),
@@ -582,7 +591,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaInternalLinkOnly() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{img.gif?linkonly}} Bar');
$calls = array (
array('document_start',array()),
@@ -597,7 +606,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaNotImage() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{foo.txt?10x10|Some File}} Bar');
$calls = array (
array('document_start',array()),
@@ -612,7 +621,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaInternalLAlign() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{img.gif }} Bar');
$calls = array (
array('document_start',array()),
@@ -627,7 +636,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaInternalRAlign() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{ img.gif}} Bar');
$calls = array (
array('document_start',array()),
@@ -642,7 +651,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaInternalCenter() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{ img.gif }} Bar');
$calls = array (
array('document_start',array()),
@@ -657,7 +666,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaInternalParams() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{img.gif?50x100nocache}} Bar');
$calls = array (
array('document_start',array()),
@@ -672,7 +681,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaInternalTitle() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{img.gif?50x100|Some Image}} Bar');
$calls = array (
array('document_start',array()),
@@ -687,7 +696,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaExternal() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{http://www.google.com/img.gif}} Bar');
$calls = array (
array('document_start',array()),
@@ -702,7 +711,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaExternalParams() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{http://www.google.com/img.gif?50x100nocache}} Bar');
$calls = array (
array('document_start',array()),
@@ -717,7 +726,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaExternalTitle() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{http://www.google.com/img.gif?50x100|Some Image}} Bar');
$calls = array (
array('document_start',array()),
@@ -733,7 +742,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaInInternalLink() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[x:1:y:foo_bar:z|{{img.gif?10x20nocache|Some Image}}]] Bar");
$image = array(
@@ -760,7 +769,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaNoImageInInternalLink() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[x:1:y:foo_bar:z|{{foo.txt?10x20nocache|Some Image}}]] Bar");
$image = array(
@@ -787,7 +796,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testMediaInEmailLink() {
- $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('internallink',new Internallink());
$this->P->parse("Foo [[foo@example.com|{{img.gif?10x20nocache|Some Image}}]] Bar");
$image = array(
@@ -814,7 +823,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
}
function testNestedMedia() {
- $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->addMode('media',new Media());
$this->P->parse('Foo {{img.gif|{{foo.gif|{{bar.gif|Bar}}}}}} Bar');
$calls = array (
array('document_start',array()),
diff --git a/_test/tests/inc/parser/parser_lists.test.php b/_test/tests/inc/parser/parser_lists.test.php
index 6acaff637..2176af76d 100644
--- a/_test/tests/inc/parser/parser_lists.test.php
+++ b/_test/tests/inc/parser/parser_lists.test.php
@@ -1,10 +1,19 @@
<?php
+
+use dokuwiki\Parsing\Handler\Lists;
+use dokuwiki\Parsing\ParserMode\Eol;
+use dokuwiki\Parsing\ParserMode\Footnote;
+use dokuwiki\Parsing\ParserMode\Formatting;
+use dokuwiki\Parsing\ParserMode\Linebreak;
+use dokuwiki\Parsing\ParserMode\Listblock;
+use dokuwiki\Parsing\ParserMode\Unformatted;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
function testUnorderedList() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('listblock',new Listblock());
$this->P->parse('
*A
* B
@@ -13,7 +22,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('listu_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('cdata',array("A")),
array('listcontent_close',array()),
@@ -37,7 +46,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
}
function testOrderedList() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('listblock',new Listblock());
$this->P->parse('
-A
- B
@@ -46,7 +55,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('listo_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('cdata',array("A")),
array('listcontent_close',array()),
@@ -71,7 +80,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
function testMixedList() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('listblock',new Listblock());
$this->P->parse('
-A
* B
@@ -80,7 +89,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('listo_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('cdata',array("A")),
array('listcontent_close',array()),
@@ -102,14 +111,14 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
function testUnorderedListWinEOL() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('listblock',new Listblock());
$this->P->parse("\r\n *A\r\n * B\r\n * C\r\n");
$calls = array (
array('document_start',array()),
array('listu_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('cdata',array("A")),
array('listcontent_close',array()),
@@ -131,14 +140,14 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
function testOrderedListWinEOL() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('listblock',new Listblock());
$this->P->parse("\r\n -A\r\n - B\r\n - C\r\n");
$calls = array (
array('document_start',array()),
array('listo_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('cdata',array("A")),
array('listcontent_close',array()),
@@ -160,9 +169,9 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
function testNotAList() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('listblock',new Listblock());
$this->P->parse("Foo -bar *foo Bar");
$calls = array (
array('document_start',array()),
@@ -173,10 +182,10 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
function testUnorderedListParagraph() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('listblock',new Listblock());
+ $this->P->addMode('eol',new Eol());
$this->P->parse('Foo
*A
* B
@@ -188,7 +197,7 @@ Bar');
array('cdata',array("Foo")),
array('p_close',array()),
array('listu_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('cdata',array("A")),
array('listcontent_close',array()),
@@ -213,12 +222,12 @@ Bar');
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
// This is really a failing test - formatting able to spread across list items
// Problem is fixing it would mean a major rewrite of lists
function testUnorderedListStrong() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
- $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
+ $this->P->addMode('listblock',new Listblock());
+ $this->P->addMode('strong',new Formatting('strong'));
$this->P->parse('
***A**
*** B
@@ -227,7 +236,7 @@ Bar');
$calls = array (
array('document_start',array()),
array('listu_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('strong_open',array()),
array('cdata',array("A")),
@@ -248,12 +257,12 @@ Bar');
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
// This is really a failing test - unformatted able to spread across list items
// Problem is fixing it would mean a major rewrite of lists
function testUnorderedListUnformatted() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
- $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->addMode('listblock',new Listblock());
+ $this->P->addMode('unformatted',new Unformatted());
$this->P->parse('
*%%A%%
*%% B
@@ -262,7 +271,7 @@ Bar');
$calls = array (
array('document_start',array()),
array('listu_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('unformatted',array("A")),
array('listcontent_close',array()),
@@ -279,10 +288,10 @@ Bar');
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
function testUnorderedListLinebreak() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
- $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->addMode('listblock',new Listblock());
+ $this->P->addMode('linebreak',new Linebreak());
$this->P->parse('
*A\\\\ D
* B
@@ -291,7 +300,7 @@ Bar');
$calls = array (
array('document_start',array()),
array('listu_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('cdata',array("A")),
array('linebreak',array()),
@@ -315,10 +324,10 @@ Bar');
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
function testUnorderedListLinebreak2() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
- $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->addMode('listblock',new Listblock());
+ $this->P->addMode('linebreak',new Linebreak());
$this->P->parse('
*A\\\\
* B
@@ -342,10 +351,10 @@ Bar');
);
$this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
}
-
+
function testUnorderedListFootnote() {
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
- $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote());
+ $this->P->addMode('listblock',new Listblock());
+ $this->P->addMode('footnote',new Footnote());
$this->P->parse('
*((A))
*(( B
@@ -355,7 +364,7 @@ Bar');
$calls = array (
array('document_start',array()),
array('listu_open',array()),
- array('listitem_open',array(1,Doku_Handler_List::NODE)),
+ array('listitem_open',array(1,Lists::NODE)),
array('listcontent_open',array()),
array('nest', array( array(
array('footnote_open',array()),
diff --git a/_test/tests/inc/parser/parser_media.test.php b/_test/tests/inc/parser/parser_media.test.php
index 2b22dabff..fdb9c0fc4 100644
--- a/_test/tests/inc/parser/parser_media.test.php
+++ b/_test/tests/inc/parser/parser_media.test.php
@@ -133,6 +133,17 @@ class TestOfDoku_Parser_Media extends TestOfDoku_Parser {
$this->assertEquals($rest, substr($url, $substr_start));
}
+ function testVideoInternalTitle() {
+ $file = 'wiki:kind_zu_katze.ogv';
+ $title = 'Single quote: \' Ampersand: &';
+
+ $Renderer = new Doku_Renderer_xhtml();
+ $url = $Renderer->externalmedia($file, $title, null, null, null, 'cache', 'details', true);
+
+ // make sure the title is escaped just once
+ $this->assertEquals(htmlspecialchars($title), substr($url, 28, 32));
+ }
+
function testSimpleLinkText() {
$file = 'wiki:dokuwiki-128.png';
$parser_response = p_get_instructions('{{' . $file . '|This is a simple text.}}');
diff --git a/_test/tests/inc/parser/parser_preformatted.test.php b/_test/tests/inc/parser/parser_preformatted.test.php
index f7a01a7e5..ad99f2916 100644
--- a/_test/tests/inc/parser/parser_preformatted.test.php
+++ b/_test/tests/inc/parser/parser_preformatted.test.php
@@ -1,10 +1,20 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Code;
+use dokuwiki\Parsing\ParserMode\Eol;
+use dokuwiki\Parsing\ParserMode\File;
+use dokuwiki\Parsing\ParserMode\Header;
+use dokuwiki\Parsing\ParserMode\Html;
+use dokuwiki\Parsing\ParserMode\Listblock;
+use dokuwiki\Parsing\ParserMode\Php;
+use dokuwiki\Parsing\ParserMode\Preformatted;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
function testFile() {
- $this->P->addMode('file',new Doku_Parser_Mode_File());
+ $this->P->addMode('file',new File());
$this->P->parse('Foo <file>testing</file> Bar');
$calls = array (
array('document_start',array()),
@@ -22,7 +32,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
}
function testCode() {
- $this->P->addMode('code',new Doku_Parser_Mode_Code());
+ $this->P->addMode('code',new Code());
$this->P->parse('Foo <code>testing</code> Bar');
$calls = array (
array('document_start',array()),
@@ -39,7 +49,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
}
function testCodeWhitespace() {
- $this->P->addMode('code',new Doku_Parser_Mode_Code());
+ $this->P->addMode('code',new Code());
$this->P->parse("Foo <code \n>testing</code> Bar");
$calls = array (
array('document_start',array()),
@@ -56,7 +66,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
}
function testCodeLang() {
- $this->P->addMode('code',new Doku_Parser_Mode_Code());
+ $this->P->addMode('code',new Code());
$this->P->parse("Foo <code php>testing</code> Bar");
$calls = array (
array('document_start',array()),
@@ -73,7 +83,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
}
function testPreformatted() {
- $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->addMode('preformatted',new Preformatted());
$this->P->parse("F oo\n x \n y \nBar\n");
$calls = array (
array('document_start',array()),
@@ -90,7 +100,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
}
function testPreformattedWinEOL() {
- $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->addMode('preformatted',new Preformatted());
$this->P->parse("F oo\r\n x \r\n y \r\nBar\r\n");
$calls = array (
array('document_start',array()),
@@ -107,7 +117,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
}
function testPreformattedTab() {
- $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->addMode('preformatted',new Preformatted());
$this->P->parse("F oo\n\tx\t\n\t\ty\t\nBar\n");
$calls = array (
array('document_start',array()),
@@ -124,7 +134,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
}
function testPreformattedTabWinEOL() {
- $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->addMode('preformatted',new Preformatted());
$this->P->parse("F oo\r\n\tx\t\r\n\t\ty\t\r\nBar\r\n");
$calls = array (
array('document_start',array()),
@@ -141,8 +151,8 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
}
function testPreformattedList() {
- $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
- $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('preformatted',new Preformatted());
+ $this->P->addMode('listblock',new Listblock());
$this->P->parse(" - x \n * y \nF oo\n x \n y \n -X\n *Y\nBar\n");
$calls = array (
array('document_start',array()),
@@ -175,7 +185,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
// test for php
function testPHP() {
- $this->P->addMode('php',new Doku_Parser_Mode_PHP());
+ $this->P->addMode('php',new Php());
$this->P->parse('Foo <php>testing</php> Bar');
$calls = array (
array('document_start',array()),
@@ -192,7 +202,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
// test with for HTML
function testHTML() {
- $this->P->addMode('html',new Doku_Parser_Mode_HTML());
+ $this->P->addMode('html',new Html());
$this->P->parse('Foo <html>testing</html> Bar');
$calls = array (
array('document_start',array()),
@@ -210,9 +220,9 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
function testPreformattedPlusHeaderAndEol() {
// Note that EOL must come after preformatted!
- $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
- $this->P->addMode('header',new Doku_Parser_Mode_Header());
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('preformatted',new Preformatted());
+ $this->P->addMode('header',new Header());
+ $this->P->addMode('eol',new Eol());
$this->P->parse("F oo\n ==Test==\n y \nBar\n");
$calls = array (
array('document_start',array()),
diff --git a/_test/tests/inc/parser/parser_quote.test.php b/_test/tests/inc/parser/parser_quote.test.php
index ae14671c1..190f18cc1 100644
--- a/_test/tests/inc/parser/parser_quote.test.php
+++ b/_test/tests/inc/parser/parser_quote.test.php
@@ -1,10 +1,14 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Eol;
+use dokuwiki\Parsing\ParserMode\Quote;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
function testQuote() {
- $this->P->addMode('quote',new Doku_Parser_Mode_Quote());
+ $this->P->addMode('quote',new Quote());
$this->P->parse("abc\n> def\n>>ghi\nklm");
$calls = array (
array('document_start',array()),
@@ -27,7 +31,7 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
}
function testQuoteWinCr() {
- $this->P->addMode('quote',new Doku_Parser_Mode_Quote());
+ $this->P->addMode('quote',new Quote());
$this->P->parse("abc\r\n> def\r\n>>ghi\r\nklm");
$calls = array (
array('document_start',array()),
@@ -50,7 +54,7 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
}
function testQuoteMinumumContext() {
- $this->P->addMode('quote',new Doku_Parser_Mode_Quote());
+ $this->P->addMode('quote',new Quote());
$this->P->parse("\n> def\n>>ghi\n ");
$calls = array (
array('document_start',array()),
@@ -67,8 +71,8 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
}
function testQuoteEol() {
- $this->P->addMode('quote',new Doku_Parser_Mode_Quote());
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('quote',new Quote());
+ $this->P->addMode('eol',new Eol());
$this->P->parse("abc\n> def\n>>ghi\nklm");
$calls = array (
array('document_start',array()),
diff --git a/_test/tests/inc/parser/parser_quotes.test.php b/_test/tests/inc/parser/parser_quotes.test.php
index 6f174ddae..fb192d21f 100644
--- a/_test/tests/inc/parser/parser_quotes.test.php
+++ b/_test/tests/inc/parser/parser_quotes.test.php
@@ -1,4 +1,7 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Quotes;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
@@ -11,7 +14,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testSingleQuoteOpening() {
$raw = "Foo 'hello Bar";
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -29,7 +32,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testSingleQuoteOpeningSpecial() {
$raw = "Foo said:'hello Bar";
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -47,7 +50,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testSingleQuoteClosing() {
$raw = "Foo hello' Bar";
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -65,7 +68,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testSingleQuoteClosingSpecial() {
$raw = "Foo hello') Bar";
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -83,7 +86,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testSingleQuotes() {
$raw = "Foo 'hello' Bar";
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -103,7 +106,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testApostrophe() {
$raw = "hey it's fine weather today";
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -122,7 +125,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testSingleQuotesSpecial() {
$raw = "Foo ('hello') Bar";
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -142,7 +145,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testDoubleQuoteOpening() {
$raw = 'Foo "hello Bar';
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -160,7 +163,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testDoubleQuoteOpeningSpecial() {
$raw = 'Foo said:"hello Bar';
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -178,8 +181,13 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testDoubleQuoteClosing() {
$raw = 'Foo hello" Bar';
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
- $this->H->status['doublequote'] = 1;
+ $this->P->addMode('quotes',new Quotes());
+
+ /** @noinspection PhpUnhandledExceptionInspection */
+ $status = $this->getInaccessibleProperty($this->H, 'status');
+ $status['doublequote'] = 1;
+ /** @noinspection PhpUnhandledExceptionInspection */
+ $this->setInaccessibleProperty($this->H, 'status', $status);
$this->P->parse($raw);
$calls = array (
@@ -197,8 +205,13 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testDoubleQuoteClosingSpecial() {
$raw = 'Foo hello") Bar';
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
- $this->H->status['doublequote'] = 1;
+ $this->P->addMode('quotes',new Quotes());
+ /** @noinspection PhpUnhandledExceptionInspection */
+ $status = $this->getInaccessibleProperty($this->H, 'status');
+ $status['doublequote'] = 1;
+ /** @noinspection PhpUnhandledExceptionInspection */
+ $this->setInaccessibleProperty($this->H, 'status', $status);
+
$this->P->parse($raw);
$calls = array (
@@ -215,8 +228,13 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
}
function testDoubleQuoteClosingSpecial2() {
$raw = 'Foo hello") Bar';
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
- $this->H->status['doublequote'] = 0;
+ $this->P->addMode('quotes',new Quotes());
+ /** @noinspection PhpUnhandledExceptionInspection */
+ $status = $this->getInaccessibleProperty($this->H, 'status');
+ $status['doublequote'] = 0;
+ /** @noinspection PhpUnhandledExceptionInspection */
+ $this->setInaccessibleProperty($this->H, 'status', $status);
+
$this->P->parse($raw);
$calls = array (
@@ -234,7 +252,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testDoubleQuotes() {
$raw = 'Foo "hello" Bar';
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -254,7 +272,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testDoubleQuotesSpecial() {
$raw = 'Foo ("hello") Bar';
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -274,7 +292,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testDoubleQuotesEnclosingBrackets() {
$raw = 'Foo "{hello}" Bar';
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -294,7 +312,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testDoubleQuotesEnclosingLink() {
$raw = 'Foo "[[www.domain.com]]" Bar';
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
@@ -315,7 +333,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function testAllQuotes() {
$raw = 'There was written "He thought \'It\'s a man\'s world\'".';
- $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->addMode('quotes',new Quotes());
$this->P->parse($raw);
$calls = array (
diff --git a/_test/tests/inc/parser/parser_replacements.test.php b/_test/tests/inc/parser/parser_replacements.test.php
index f0367dac0..d910dba9e 100644
--- a/_test/tests/inc/parser/parser_replacements.test.php
+++ b/_test/tests/inc/parser/parser_replacements.test.php
@@ -1,10 +1,18 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Acronym;
+use dokuwiki\Parsing\ParserMode\Entity;
+use dokuwiki\Parsing\ParserMode\Hr;
+use dokuwiki\Parsing\ParserMode\Multiplyentity;
+use dokuwiki\Parsing\ParserMode\Smiley;
+use dokuwiki\Parsing\ParserMode\Wordblock;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
function testSingleAcronym() {
- $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOOBAR')));
+ $this->P->addMode('acronym',new Acronym(array('FOOBAR')));
$this->P->parse('abc FOOBAR xyz');
$calls = array (
@@ -21,7 +29,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testAlmostAnAcronym() {
- $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOOBAR')));
+ $this->P->addMode('acronym',new Acronym(array('FOOBAR')));
$this->P->parse('abcFOOBARxyz');
$calls = array (
@@ -36,7 +44,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testPickAcronymCorrectly() {
- $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOO')));
+ $this->P->addMode('acronym',new Acronym(array('FOO')));
$this->P->parse('FOOBAR FOO');
$calls = array (
@@ -53,7 +61,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testMultipleAcronyms() {
- $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOO','BAR')));
+ $this->P->addMode('acronym',new Acronym(array('FOO','BAR')));
$this->P->parse('abc FOO def BAR xyz');
$calls = array (
@@ -73,7 +81,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testMultipleAcronymsWithSubset1() {
- $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOO','A.FOO','FOO.1','A.FOO.1')));
+ $this->P->addMode('acronym',new Acronym(array('FOO','A.FOO','FOO.1','A.FOO.1')));
$this->P->parse('FOO A.FOO FOO.1 A.FOO.1');
$calls = array (
@@ -96,7 +104,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testMultipleAcronymsWithSubset2() {
- $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('A.FOO.1','FOO.1','A.FOO','FOO')));
+ $this->P->addMode('acronym',new Acronym(array('A.FOO.1','FOO.1','A.FOO','FOO')));
$this->P->parse('FOO A.FOO FOO.1 A.FOO.1');
$calls = array (
@@ -119,7 +127,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testSingleSmileyFail() {
- $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)')));
+ $this->P->addMode('smiley',new Smiley(array(':-)')));
$this->P->parse('abc:-)xyz');
$calls = array (
@@ -134,7 +142,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testSingleSmiley() {
- $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)')));
+ $this->P->addMode('smiley',new Smiley(array(':-)')));
$this->P->parse('abc :-) xyz');
$calls = array (
@@ -151,7 +159,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testMultipleSmileysFail() {
- $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)','^_^')));
+ $this->P->addMode('smiley',new Smiley(array(':-)','^_^')));
$this->P->parse('abc:-)x^_^yz');
$calls = array (
@@ -166,7 +174,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testMultipleSmileys() {
- $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)','^_^')));
+ $this->P->addMode('smiley',new Smiley(array(':-)','^_^')));
$this->P->parse('abc :-) x ^_^ yz');
$calls = array (
@@ -186,7 +194,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
function testBackslashSmileyFail() {
// This smiley is really :-\\ but escaping makes like interesting
- $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-\\\\')));
+ $this->P->addMode('smiley',new Smiley(array(':-\\\\')));
$this->P->parse('abc:-\\\xyz');
$calls = array (
@@ -202,7 +210,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
function testBackslashSmiley() {
// This smiley is really :-\\ but escaping makes like interesting
- $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-\\\\')));
+ $this->P->addMode('smiley',new Smiley(array(':-\\\\')));
$this->P->parse('abc :-\\\ xyz');
$calls = array (
@@ -219,7 +227,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testSingleWordblock() {
- $this->P->addMode('wordblock',new Doku_Parser_Mode_Wordblock(array('CAT')));
+ $this->P->addMode('wordblock',new Wordblock(array('CAT')));
$this->P->parse('abc CAT xyz');
$calls = array (
@@ -236,7 +244,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testWordblockCase() {
- $this->P->addMode('wordblock',new Doku_Parser_Mode_Wordblock(array('CAT')));
+ $this->P->addMode('wordblock',new Wordblock(array('CAT')));
$this->P->parse('abc cat xyz');
$calls = array (
@@ -253,7 +261,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testMultipleWordblock() {
- $this->P->addMode('wordblock',new Doku_Parser_Mode_Wordblock(array('CAT','dog')));
+ $this->P->addMode('wordblock',new Wordblock(array('CAT','dog')));
$this->P->parse('abc cat x DOG yz');
$calls = array (
@@ -272,7 +280,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testSingleEntity() {
- $this->P->addMode('entity',new Doku_Parser_Mode_Entity(array('->')));
+ $this->P->addMode('entity',new Entity(array('->')));
$this->P->parse('x -> y');
$calls = array (
@@ -289,7 +297,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testMultipleEntities() {
- $this->P->addMode('entity',new Doku_Parser_Mode_Entity(array('->','<-')));
+ $this->P->addMode('entity',new Entity(array('->','<-')));
$this->P->parse('x -> y <- z');
$calls = array (
@@ -308,7 +316,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testMultiplyEntity() {
- $this->P->addMode('multiplyentity',new Doku_Parser_Mode_MultiplyEntity());
+ $this->P->addMode('multiplyentity',new Multiplyentity());
$this->P->parse('Foo 10x20 Bar');
$calls = array (
@@ -326,7 +334,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
function testMultiplyEntityHex() {
// the multiply entity pattern should not match hex numbers, eg. 0x123
- $this->P->addMode('multiplyentity',new Doku_Parser_Mode_MultiplyEntity());
+ $this->P->addMode('multiplyentity',new Multiplyentity());
$this->P->parse('Foo 0x123 Bar');
$calls = array (
@@ -341,7 +349,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testHR() {
- $this->P->addMode('hr',new Doku_Parser_Mode_HR());
+ $this->P->addMode('hr',new Hr());
$this->P->parse("Foo \n ---- \n Bar");
$calls = array (
@@ -359,7 +367,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
}
function testHREol() {
- $this->P->addMode('hr',new Doku_Parser_Mode_HR());
+ $this->P->addMode('hr',new Hr());
$this->P->parse("Foo \n----\n Bar");
$calls = array (
diff --git a/_test/tests/inc/parser/parser_table.test.php b/_test/tests/inc/parser/parser_table.test.php
index f05dd29aa..c233a4072 100644
--- a/_test/tests/inc/parser/parser_table.test.php
+++ b/_test/tests/inc/parser/parser_table.test.php
@@ -1,10 +1,18 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Eol;
+use dokuwiki\Parsing\ParserMode\Footnote;
+use dokuwiki\Parsing\ParserMode\Formatting;
+use dokuwiki\Parsing\ParserMode\Linebreak;
+use dokuwiki\Parsing\ParserMode\Table;
+use dokuwiki\Parsing\ParserMode\Unformatted;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_Table extends TestOfDoku_Parser {
function testTable() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 |
@@ -48,7 +56,7 @@ def');
}
function testTableWinEOL() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse("\r\nabc\r\n| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 |\r\n| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |\r\ndef");
$calls = array (
array('document_start',array()),
@@ -88,7 +96,7 @@ def');
}
function testEmptyTable() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
|
@@ -113,7 +121,7 @@ def');
}
function testTableHeaders() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
^ X | Y ^ Z |
@@ -148,7 +156,7 @@ def');
}
function testTableHead() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
^ X ^ Y ^ Z ^
@@ -197,7 +205,7 @@ def');
}
function testTableHeadOneRowTable() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
^ X ^ Y ^ Z ^
@@ -232,7 +240,7 @@ def');
}
function testTableHeadMultiline() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
^ X1 ^ Y1 ^ Z1 ^
@@ -293,7 +301,7 @@ def');
}
function testCellAlignment() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
| X | Y ^ Z |
@@ -327,7 +335,7 @@ def');
}
function testCellSpan() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
| d || e |
@@ -369,7 +377,7 @@ def');
}
function testCellRowSpan() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
| a | c:::||
@@ -417,7 +425,7 @@ def');
}
function testCellRowSpanFirstRow() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
|::: ^ d:::^:::| ::: |
@@ -475,7 +483,7 @@ def');
}
function testRowSpanTableHead() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
^ X1 ^ Y1 ^ Z1 ^
@@ -533,7 +541,7 @@ def');
}
function testRowSpanAcrossTableHeadBoundary() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse('
abc
^ X1 ^ Y1 ^ Z1 ^
@@ -600,8 +608,8 @@ def');
}
function testCellAlignmentFormatting() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
- $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
+ $this->P->addMode('table',new Table());
+ $this->P->addMode('strong',new Formatting('strong'));
$this->P->parse('
abc
| **X** | Y ^ Z |
@@ -640,8 +648,8 @@ def');
}
function testTableEol() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
- $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->addMode('table',new Table());
+ $this->P->addMode('eol',new Eol());
$this->P->parse('
abc
| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 |
@@ -687,8 +695,8 @@ def');
// This is really a failing test - formatting able to spread across cols
// Problem is fixing it would mean a major rewrite of table handling
function testTableStrong() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
- $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
+ $this->P->addMode('table',new Table());
+ $this->P->addMode('strong',new Formatting('strong'));
$this->P->parse('
abc
| **Row 0 Col 1** | **Row 0 Col 2 | Row 0 Col 3** |
@@ -742,8 +750,8 @@ def');
// This is really a failing test - unformatted able to spread across cols
// Problem is fixing it would mean a major rewrite of table handling
function testTableUnformatted() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
- $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->addMode('table',new Table());
+ $this->P->addMode('unformatted',new Unformatted());
$this->P->parse('
abc
| <nowiki>Row 0 Col 1</nowiki> | <nowiki>Row 0 Col 2 | Row 0 Col 3</nowiki> |
@@ -791,8 +799,8 @@ def');
}
function testTableLinebreak() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
- $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->addMode('table',new Table());
+ $this->P->addMode('linebreak',new Linebreak());
$this->P->parse('
abc
| Row 0\\\\ Col 1 | Row 0 Col 2 | Row 0 Col 3 |
@@ -841,8 +849,8 @@ def');
// This is really a failing test - footnote able to spread across cols
// Problem is fixing it would mean a major rewrite of table handling
function testTableFootnote() {
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
- $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote());
+ $this->P->addMode('table',new Table());
+ $this->P->addMode('footnote',new Footnote());
$this->P->parse('
abc
| ((Row 0 Col 1)) | ((Row 0 Col 2 | Row 0 Col 3)) |
@@ -899,7 +907,7 @@ def');
function testTable_FS1833() {
$syntax = " \n| Row 0 Col 1 |\n";
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse($syntax);
$calls = array (
array('document_start',array()),
@@ -920,7 +928,7 @@ def');
*/
function testTable_CellFix() {
$syntax = "\n| r1c1 | r1c2 | r1c3 |\n| r2c1 |\n";
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse($syntax);
$calls = array (
array('document_start',array()),
@@ -961,7 +969,7 @@ def');
*/
function testTable_CellFix2() {
$syntax = "\n| r1c1 |\n| r2c1 | r2c2 | r2c3 |\n";
- $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('table',new Table());
$this->P->parse($syntax);
$calls = array (
array('document_start',array()),
diff --git a/_test/tests/inc/parser/parser_unformatted.test.php b/_test/tests/inc/parser/parser_unformatted.test.php
index f20ba5e8b..32c83fcce 100644
--- a/_test/tests/inc/parser/parser_unformatted.test.php
+++ b/_test/tests/inc/parser/parser_unformatted.test.php
@@ -1,10 +1,13 @@
<?php
+
+use dokuwiki\Parsing\ParserMode\Unformatted;
+
require_once 'parser.inc.php';
class TestOfDoku_Parser_Unformatted extends TestOfDoku_Parser {
function testNowiki() {
- $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->addMode('unformatted',new Unformatted());
$this->P->parse("Foo <nowiki>testing</nowiki> Bar");
$calls = array (
array('document_start',array()),
@@ -21,7 +24,7 @@ class TestOfDoku_Parser_Unformatted extends TestOfDoku_Parser {
}
function testDoublePercent() {
- $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->addMode('unformatted',new Unformatted());
$this->P->parse("Foo %%testing%% Bar");
$calls = array (
array('document_start',array()),
diff --git a/_test/tests/inc/parser/renderer_metadata.test.php b/_test/tests/inc/parser/renderer_metadata.test.php
new file mode 100644
index 000000000..5498d6f1f
--- /dev/null
+++ b/_test/tests/inc/parser/renderer_metadata.test.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Class renderer_xhtml_test
+ */
+class renderer_metadata_test extends DokuWikiTest {
+ /** @var Doku_Renderer_xhtml */
+ protected $R;
+
+ /**
+ * Called for each test
+ *
+ * @throws Exception
+ */
+ function setUp() {
+ parent::setUp();
+ $this->R = new Doku_Renderer_metadata();
+ }
+
+ function tearDown() {
+ unset($this->R);
+ }
+
+
+ function test_footnote_and_abstract() {
+ // avoid issues with the filectime() & filemtime in document_start() & document_end()
+ $now = time();
+ $this->R->persistent['date']['created'] = $now;
+ $this->R->persistent['date']['modified'] = $now;
+
+ $this->R->document_start();
+
+ $this->R->cdata("abstract: ");
+
+ $this->R->footnote_open();
+ $this->R->cdata(str_pad("footnote: ", Doku_Renderer_metadata::ABSTRACT_MAX, "lotsa junk "));
+ $this->R->footnote_close();
+
+ $this->R->cdata("abstract end.");
+
+ $this->R->document_end();
+
+ $expected = 'abstract: abstract end.';
+ $this->assertEquals($expected, $this->R->meta['description']['abstract']);
+ }
+
+}
diff --git a/_test/tests/inc/parser/renderer_resolveinterwiki.test.php b/_test/tests/inc/parser/renderer_resolveinterwiki.test.php
index 822c41af8..ae23280cf 100644
--- a/_test/tests/inc/parser/renderer_resolveinterwiki.test.php
+++ b/_test/tests/inc/parser/renderer_resolveinterwiki.test.php
@@ -1,6 +1,6 @@
<?php
-require_once DOKU_INC . 'inc/parser/renderer.php';
+use dokuwiki\test\mock\Doku_Renderer;
/**
* Tests for Doku_Renderer::_resolveInterWiki()
@@ -43,13 +43,27 @@ class Test_resolveInterwiki extends DokuWikiTest {
function testNonexisting() {
$Renderer = new Doku_Renderer();
$Renderer->interwiki = getInterwiki();
+ unset($Renderer->interwiki['default']);
$shortcut = 'nonexisting';
$reference = 'foo @+%/';
$url = $Renderer->_resolveInterWiki($shortcut, $reference);
- $expected = 'https://www.google.com/search?q=foo%20%40%2B%25%2F&amp;btnI=lucky';
- $this->assertEquals($expected, $url);
+ $this->assertEquals('', $url);
+ $this->assertEquals('', $shortcut);
+ }
+
+ function testNonexistingWithDefault() {
+ $Renderer = new Doku_Renderer();
+ $Renderer->interwiki = getInterwiki();
+ $Renderer->interwiki['default'] = 'https://en.wikipedia.org/wiki/{NAME}';
+
+ $shortcut = 'nonexisting';
+ $reference = 'foo';
+ $url = $Renderer->_resolveInterWiki($shortcut, $reference);
+
+ $this->assertEquals('https://en.wikipedia.org/wiki/foo', $url);
+ $this->assertEquals('default', $shortcut);
}
}
diff --git a/_test/tests/inc/parser/renderer_xhtml.test.php b/_test/tests/inc/parser/renderer_xhtml.test.php
index f7be39a1b..9b635c604 100644
--- a/_test/tests/inc/parser/renderer_xhtml.test.php
+++ b/_test/tests/inc/parser/renderer_xhtml.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\Parsing\Handler\Lists;
+
/**
* Class renderer_xhtml_test
*/
@@ -123,7 +125,7 @@ class renderer_xhtml_test extends DokuWikiTest {
$this->R->document_start();
$this->R->listo_open();
- $this->R->listitem_open(1, Doku_Handler_List::NODE);
+ $this->R->listitem_open(1, Lists::NODE);
$this->R->listcontent_open();
$this->R->cdata('item1');
$this->R->listcontent_close();
@@ -145,7 +147,7 @@ class renderer_xhtml_test extends DokuWikiTest {
$this->R->listcontent_close();
$this->R->listitem_close();
- $this->R->listitem_open(1, Doku_Handler_List::NODE);
+ $this->R->listitem_open(1, Lists::NODE);
$this->R->listcontent_open();
$this->R->cdata('item3');
$this->R->listcontent_close();
@@ -188,7 +190,7 @@ class renderer_xhtml_test extends DokuWikiTest {
$this->R->document_start();
$this->R->listu_open();
- $this->R->listitem_open(1, Doku_Handler_List::NODE);
+ $this->R->listitem_open(1, Lists::NODE);
$this->R->listcontent_open();
$this->R->cdata('item1');
$this->R->listcontent_close();
@@ -210,7 +212,7 @@ class renderer_xhtml_test extends DokuWikiTest {
$this->R->listcontent_close();
$this->R->listitem_close();
- $this->R->listitem_open(1, Doku_Handler_List::NODE);
+ $this->R->listitem_open(1, Lists::NODE);
$this->R->listcontent_open();
$this->R->cdata('item3');
$this->R->listcontent_close();
@@ -267,7 +269,7 @@ class renderer_xhtml_test extends DokuWikiTest {
$this->assertSame('0', $header);
$this->R->internallink($id);
- $expected = '<a href="/./doku.php?id='.$id.'" class="wikilink1" title="'.$id.'">0</a>';
+ $expected = '<a href="/./doku.php?id='.$id.'" class="wikilink1" title="'.$id.'" data-wiki-id="blanktest">0</a>';
$this->assertEquals($expected, trim($this->R->doc));
}
}
diff --git a/_test/tests/inc/remote.test.php b/_test/tests/inc/remote.test.php
index ee040f09a..7f1ec4aff 100644
--- a/_test/tests/inc/remote.test.php
+++ b/_test/tests/inc/remote.test.php
@@ -1,8 +1,9 @@
<?php
-class MockAuth extends DokuWiki_Auth_Plugin {
- function isCaseSensitive() { return true; }
-}
+use dokuwiki\test\mock\AuthPlugin;
+use dokuwiki\Extension\RemotePlugin;
+use dokuwiki\Remote\Api;
+use dokuwiki\Remote\RemoteException;
class RemoteAPICoreTest {
@@ -75,7 +76,7 @@ class RemoteAPICoreTest {
}
-class remote_plugin_testplugin extends DokuWiki_Remote_Plugin {
+class remote_plugin_testplugin extends RemotePlugin {
function _getMethods() {
return array(
'method1' => array(
@@ -108,7 +109,7 @@ class remote_plugin_testplugin extends DokuWiki_Remote_Plugin {
function publicCall() {return true;}
}
-class remote_plugin_testplugin2 extends DokuWiki_Remote_Plugin {
+class remote_plugin_testplugin2 extends RemotePlugin {
/**
* This is a dummy method
*
@@ -131,7 +132,7 @@ class remote_test extends DokuWikiTest {
protected $userinfo;
- /** @var RemoteAPI */
+ /** @var Api */
protected $remote;
function setUp() {
@@ -144,7 +145,7 @@ class remote_test extends DokuWikiTest {
parent::setUp();
// mock plugin controller to return our test plugins
- $pluginManager = $this->createMock('Doku_Plugin_Controller');
+ $pluginManager = $this->createMock('dokuwiki\Extension\PluginController');
$pluginManager->method('getList')->willReturn(array('testplugin', 'testplugin2'));
$pluginManager->method('load')->willReturnCallback(
function($type, $plugin) {
@@ -162,9 +163,9 @@ class remote_test extends DokuWikiTest {
$conf['useacl'] = 0;
$this->userinfo = $USERINFO;
- $this->remote = new RemoteAPI();
+ $this->remote = new Api();
- $auth = new MockAuth();
+ $auth = new AuthPlugin();
}
function tearDown() {
@@ -206,7 +207,7 @@ class remote_test extends DokuWikiTest {
}
/**
- * @expectedException RemoteAccessDeniedException
+ * @expectedException dokuwiki\Remote\AccessDeniedException
*/
function test_hasAccessFail() {
global $conf;
@@ -259,13 +260,16 @@ class remote_test extends DokuWikiTest {
$this->assertTrue(true); // avoid being marked as risky for having no assertion
}
- /**
- * @expectedException RemoteException
- */
function test_forceAccessFail() {
global $conf;
$conf['remote'] = 0;
- $this->remote->forceAccess();
+
+ try {
+ $this->remote->forceAccess();
+ $this->fail('Expects RemoteException to be raised');
+ } catch (RemoteException $th) {
+ $this->assertEquals(-32604, $th->getCode());
+ }
}
function test_generalCoreFunctionWithoutArguments() {
@@ -275,7 +279,7 @@ class remote_test extends DokuWikiTest {
$conf['remoteuser'] = '';
$conf['useacl'] = 1;
$USERINFO['grps'] = array('grp');
- $remoteApi = new RemoteApi();
+ $remoteApi = new Api();
$remoteApi->getCoreMethods(new RemoteAPICoreTest());
$this->assertEquals($remoteApi->call('wiki.stringTestMethod'), 'success');
@@ -286,16 +290,18 @@ class remote_test extends DokuWikiTest {
$this->assertEquals($remoteApi->call('wiki.voidTestMethod'), null);
}
- /**
- * @expectedException RemoteException
- */
function test_generalCoreFunctionOnArgumentMismatch() {
global $conf;
$conf['remote'] = 1;
- $remoteApi = new RemoteApi();
+ $remoteApi = new Api();
$remoteApi->getCoreMethods(new RemoteAPICoreTest());
- $remoteApi->call('wiki.voidTestMethod', array('something'));
+ try {
+ $remoteApi->call('wiki.voidTestMethod', array('something'));
+ $this->fail('Expects RemoteException to be raised');
+ } catch (RemoteException $th) {
+ $this->assertEquals(-32604, $th->getCode());
+ }
}
function test_generalCoreFunctionWithArguments() {
@@ -305,7 +311,7 @@ class remote_test extends DokuWikiTest {
$conf['remoteuser'] = '';
$conf['useacl'] = 1;
- $remoteApi = new RemoteApi();
+ $remoteApi = new Api();
$remoteApi->getCoreMethods(new RemoteAPICoreTest());
$this->assertEquals($remoteApi->call('wiki.oneStringArgMethod', array('string')), 'string');
@@ -314,6 +320,21 @@ class remote_test extends DokuWikiTest {
$this->assertEquals($remoteApi->call('wiki.twoArgWithDefaultArg', array('string', 'another')), array('string', 'another'));
}
+ function test_generalCoreFunctionOnArgumentMissing() {
+ global $conf;
+ $conf['remote'] = 1;
+ $conf['remoteuser'] = '';
+ $remoteApi = new Api();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+ try {
+ $remoteApi->call('wiki.twoArgWithDefaultArg', array());
+ $this->fail('Expects RemoteException to be raised');
+ } catch (RemoteException $th) {
+ $this->assertEquals(-32603, $th->getCode());
+ }
+ }
+
function test_pluginCallMethods() {
global $conf;
global $USERINFO;
@@ -321,28 +342,45 @@ class remote_test extends DokuWikiTest {
$conf['remoteuser'] = '';
$conf['useacl'] = 1;
- $remoteApi = new RemoteApi();
+ $remoteApi = new Api();
$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_pluginCallMethodsOnArgumentMissing() {
+ global $conf;
+ $conf['remote'] = 1;
+ $conf['remoteuser'] = '';
+ $remoteApi = new Api();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+ try {
+ $remoteApi->call('plugin.testplugin.method2', array());
+ $this->fail('Expects RemoteException to be raised');
+ } catch (RemoteException $th) {
+ $this->assertEquals(-32603, $th->getCode());
+ }
+ }
+
function test_notExistingCall() {
global $conf;
$conf['remote'] = 1;
- $remoteApi = new RemoteApi();
- $remoteApi->call('dose not exist');
+ $remoteApi = new Api();
+ try {
+ $remoteApi->call('dose not exist');
+ $this->fail('Expects RemoteException to be raised');
+ } catch (RemoteException $th) {
+ $this->assertEquals(-32603, $th->getCode());
+ }
}
function test_publicCallCore() {
global $conf;
$conf['useacl'] = 1;
- $remoteApi = new RemoteApi();
+ $remoteApi = new Api();
$remoteApi->getCoreMethods(new RemoteAPICoreTest());
$this->assertTrue($remoteApi->call('wiki.publicCall'));
}
@@ -350,28 +388,28 @@ class remote_test extends DokuWikiTest {
function test_publicCallPlugin() {
global $conf;
$conf['useacl'] = 1;
- $remoteApi = new RemoteApi();
+ $remoteApi = new Api();
$this->assertTrue($remoteApi->call('plugin.testplugin.publicCall'));
}
/**
- * @expectedException RemoteAccessDeniedException
+ * @expectedException dokuwiki\Remote\AccessDeniedException
*/
function test_publicCallCoreDeny() {
global $conf;
$conf['useacl'] = 1;
- $remoteApi = new RemoteApi();
+ $remoteApi = new Api();
$remoteApi->getCoreMethods(new RemoteAPICoreTest());
$remoteApi->call('wiki.stringTestMethod');
}
/**
- * @expectedException RemoteAccessDeniedException
+ * @expectedException dokuwiki\Remote\AccessDeniedException
*/
function test_publicCallPluginDeny() {
global $conf;
$conf['useacl'] = 1;
- $remoteApi = new RemoteApi();
+ $remoteApi = new Api();
$remoteApi->call('plugin.testplugin.methodString');
}
@@ -384,7 +422,7 @@ class remote_test extends DokuWikiTest {
global $EVENT_HANDLER;
$EVENT_HANDLER->register_hook('RPC_CALL_ADD', 'BEFORE', $this, 'pluginCallCustomPathRegister');
- $remoteApi = new RemoteAPI();
+ $remoteApi = new Api();
$result = $remoteApi->call('custom.path');
$this->assertEquals($result, 'success');
}
diff --git a/_test/tests/inc/remoteapicore.test.php b/_test/tests/inc/remoteapicore.test.php
index c3eda6349..e152d4ac5 100644
--- a/_test/tests/inc/remoteapicore.test.php
+++ b/_test/tests/inc/remoteapicore.test.php
@@ -1,5 +1,10 @@
<?php
+use dokuwiki\Remote\Api;
+use dokuwiki\Remote\ApiCore;
+use dokuwiki\test\mock\AuthPlugin;
+use dokuwiki\test\mock\AuthDeletePlugin;
+
/**
* Class remoteapicore_test
*/
@@ -7,7 +12,7 @@ class remoteapicore_test extends DokuWikiTest {
protected $userinfo;
protected $oldAuthAcl;
- /** @var RemoteAPI */
+ /** @var Api */
protected $remote;
public function setUp() {
@@ -21,13 +26,13 @@ class remoteapicore_test extends DokuWikiTest {
global $auth;
$this->oldAuthAcl = $AUTH_ACL;
$this->userinfo = $USERINFO;
- $auth = new DokuWiki_Auth_Plugin();
+ $auth = new AuthPlugin();
$conf['remote'] = 1;
$conf['remoteuser'] = '@user';
$conf['useacl'] = 0;
- $this->remote = new RemoteAPI();
+ $this->remote = new Api();
}
public function tearDown() {
@@ -389,7 +394,7 @@ You can use up to five different levels of',
}
public function test_getPageVersions() {
- /** @var $EVENT_HANDLER Doku_Event_Handler */
+ /** @var $EVENT_HANDLER \dokuwiki\Extension\EventHandler */
global $EVENT_HANDLER;
$EVENT_HANDLER->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'handle_write');
global $conf;
@@ -445,6 +450,20 @@ You can use up to five different levels of',
$this->assertEquals(0, count($versions));
}
+ public function test_deleteUser()
+ {
+ global $conf, $auth;
+ $auth = new AuthDeletePlugin();
+ $conf['remote'] = 1;
+ $conf['remoteuser'] = 'testuser';
+ $_SERVER['REMOTE_USER'] = 'testuser';
+ $params = [
+ ['testuser']
+ ];
+ $actualCallResult = $this->remote->call('dokuwiki.deleteUsers', $params);
+ $this->assertTrue($actualCallResult);
+ }
+
public function test_aclCheck() {
$id = 'aclpage';
@@ -466,7 +485,7 @@ You can use up to five different levels of',
}
public function test_getXMLRPCAPIVersion() {
- $this->assertEquals(DOKU_API_VERSION, $this->remote->call('dokuwiki.getXMLRPCAPIVersion'));
+ $this->assertEquals(ApiCore::API_VERSION, $this->remote->call('dokuwiki.getXMLRPCAPIVersion'));
}
public function test_getRPCVersionSupported() {
diff --git a/_test/tests/inc/remoteapicore_aclcheck.test.php b/_test/tests/inc/remoteapicore_aclcheck.test.php
index 25aff331f..6ba7f1dcf 100644
--- a/_test/tests/inc/remoteapicore_aclcheck.test.php
+++ b/_test/tests/inc/remoteapicore_aclcheck.test.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\Remote\Api;
+
/**
* Class remoteapicore_test
*/
@@ -7,7 +9,7 @@ class remoteapicore_aclcheck_test extends DokuWikiTest {
protected $userinfo;
protected $oldAuthAcl;
- /** @var RemoteAPI */
+ /** @var Api */
protected $remote;
protected $pluginsEnabled = array('auth_plugin_authplain');
@@ -38,7 +40,7 @@ class remoteapicore_aclcheck_test extends DokuWikiTest {
$conf['remoteuser'] = '@user';
$conf['useacl'] = 0;
- $this->remote = new RemoteAPI();
+ $this->remote = new Api();
}
diff --git a/_test/tests/inc/styleutils_cssstyleini.test.php b/_test/tests/inc/styleutils_cssstyleini.test.php
new file mode 100644
index 000000000..bbb10c3c6
--- /dev/null
+++ b/_test/tests/inc/styleutils_cssstyleini.test.php
@@ -0,0 +1,38 @@
+<?php
+
+class styleutils_cssstyleini_test extends DokuWikiTest {
+
+ function test_mergedstyleini() {
+ $util = new \dokuwiki\StyleUtils('dokuwiki', false, true);
+
+ $expected = array (
+ 'stylesheets' =>
+ array (
+ 'screen' =>
+ array (
+ DOKU_CONF . 'tpl/dokuwiki/css/_tests.less' => '/./',
+ DOKU_INC . 'lib/tpl/dokuwiki/css/content.less' => '/./lib/tpl/dokuwiki/',
+ ),
+ ),
+ 'replacements' =>
+ array (
+ '__text__' => '#333',
+ '__background__' => '#f2ecec',
+ '__custom_variable__' => '#5e4040',
+ '__custom_variable_two__' => 'url(' . DOKU_BASE . 'test/foo.png)',
+ ),
+ );
+
+ $actual = $util->cssStyleini();
+
+ // check that all stylesheet levels are present
+ $this->assertArrayHasKey('all', $actual['stylesheets']);
+ $this->assertArrayHasKey('print', $actual['stylesheets']);
+
+ // check an original stylesheet and an additional one
+ $this->assertArraySubset($expected['stylesheets']['screen'], $actual['stylesheets']['screen']);
+
+ // merged config has an original value (text), an overridden value (background) and a new custom replacement (custom_variable)
+ $this->assertArraySubset($expected['replacements'], $actual['replacements']);
+ }
+}
diff --git a/_test/tests/inc/subscription.test.php b/_test/tests/inc/subscription.test.php
deleted file mode 100644
index 34a7b9e4b..000000000
--- a/_test/tests/inc/subscription.test.php
+++ /dev/null
@@ -1,246 +0,0 @@
-<?php
-
-class subscription_test extends DokuWikiTest {
-
- function test_regexp() {
- // data to test against
- $data = array(
- "casper every\n",
- "Andreas digest 1344689733",
- "Cold%20Fusion every",
- "zioth list 1344691369\n",
- "nlights digest",
- "rikblok\tdigest \t 1344716803",
- );
-
- // user, style, data, expected number of results
- $tests = array(
- array('Cold Fusion', null, null, 1),
- array('casper', null, null, 1),
- array('nope', null, null, 0),
- array('lights', null, null, 0),
- array(array('Cold Fusion', 'casper', 'nope'), null, null, 2),
- array(null, 'list', null, 1),
- array(null, 'every', null, 2),
- array(null, 'digest', null, 3),
- array(null, array('list', 'every'), null, 3),
- array('casper', 'digest', null, 0),
- array('casper', array('digest', 'every'), null, 1),
- array('zioth', 'list', '1344691369', 1),
- array('zioth', null, '1344691369', 1),
- array('zioth', 'digest', '1344691369', 0),
- );
-
- $sub = new MockupSubscription();
-
- $row = 0;
- foreach($tests as $test) {
- $re = $sub->buildregex($test[0], $test[1], $test[2]);
- $this->assertFalse(empty($re), "test line $row");
- $result = preg_grep($re, $data);
- $this->assertEquals($test[3], count($result), "test line $row. $re got\n".print_r($result, true));
-
- $row++;
- }
- }
-
- function test_addremove() {
- $sub = new MockupSubscription();
-
- // no subscriptions
- $this->assertArrayNotHasKey(
- 'wiki:dokuwiki',
- $sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
- );
-
- // add page subscription
- $sub->add('wiki:dokuwiki', 'testuser', 'every');
-
- // one subscription
- $this->assertArrayHasKey(
- 'wiki:dokuwiki',
- $sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
- );
-
- // remove page subscription
- $sub->remove('wiki:dokuwiki', 'testuser');
-
- // no subscription
- $this->assertArrayNotHasKey(
- 'wiki:dokuwiki',
- $sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
- );
-
- // add namespace subscription
- $sub->add('wiki:', 'testuser', 'every');
-
- // one subscription
- $this->assertArrayHasKey(
- 'wiki:',
- $sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
- );
-
- // remove (non existing) page subscription
- $sub->remove('wiki:dokuwiki', 'testuser');
-
- // still one subscription
- $this->assertArrayHasKey(
- 'wiki:',
- $sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
- );
-
- // change namespace subscription
- $sub->add('wiki:', 'testuser', 'digest', '1234567');
-
- // still one subscription
- $this->assertArrayHasKey(
- 'wiki:',
- $sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
- );
-
- // check contents
- $this->assertEquals(
- array('wiki:' => array('testuser' => array('digest', '1234567'))),
- $sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
- );
-
- // change subscription data
- $sub->add('wiki:', 'testuser', 'digest', '7654321');
-
- // still one subscription
- $this->assertArrayHasKey(
- 'wiki:',
- $sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
- );
-
- // check contents
- $this->assertEquals(
- array('wiki:' => array('testuser' => array('digest', '7654321'))),
- $sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
- );
- }
-
- function test_bulkdigest() {
- $sub = new MockupSubscription();
-
- // let's start with nothing
- $this->assertEquals(0, $sub->send_bulk('sub1:test'));
-
- // create a subscription
- $sub->add('sub1:', 'testuser', 'digest', '978328800'); // last mod 2001-01-01
-
- // now create change
- $_SERVER['REMOTE_USER'] = 'someguy';
- saveWikiText('sub1:test', 'foo bar', 'a subscription change', false);
-
- // should trigger a mail
- $this->assertEquals(1, $sub->send_bulk('sub1:test'));
- $this->assertEquals(array('arthur@example.com'), $sub->mails);
-
- $sub->reset();
-
- // now create more changes
- $_SERVER['REMOTE_USER'] = 'someguy';
- saveWikiText('sub1:sub2:test', 'foo bar', 'a subscription change', false);
- saveWikiText('sub1:another_test', 'foo bar', 'a subscription change', false);
-
- // should not trigger a mail, because the subscription time has not been reached, yet
- $this->assertEquals(0, $sub->send_bulk('sub1:test'));
- $this->assertEquals(array(), $sub->mails);
-
- // reset the subscription time
- $sub->add('sub1:', 'testuser', 'digest', '978328800'); // last mod 2001-01-01
-
- // we now should get mails for three changes
- $this->assertEquals(3, $sub->send_bulk('sub1:test'));
- $this->assertEquals(array('arthur@example.com', 'arthur@example.com', 'arthur@example.com'), $sub->mails);
- }
-
- function test_bulklist() {
- $sub = new MockupSubscription();
-
- // let's start with nothing
- $this->assertEquals(0, $sub->send_bulk('sub1:test'));
-
- // create a subscription
- $sub->add('sub1:', 'testuser', 'list', '978328800'); // last mod 2001-01-01
-
- // now create change
- $_SERVER['REMOTE_USER'] = 'someguy';
- saveWikiText('sub1:test', 'foo bar', 'a subscription change', false);
-
- // should trigger a mail
- $this->assertEquals(1, $sub->send_bulk('sub1:test'));
- $this->assertEquals(array('arthur@example.com'), $sub->mails);
-
- $sub->reset();
-
- // now create more changes
- $_SERVER['REMOTE_USER'] = 'someguy';
- saveWikiText('sub1:sub2:test', 'foo bar', 'a subscription change', false);
- saveWikiText('sub1:another_test', 'foo bar', 'a subscription change', false);
-
- // should not trigger a mail, because the subscription time has not been reached, yet
- $this->assertEquals(0, $sub->send_bulk('sub1:test'));
- $this->assertEquals(array(), $sub->mails);
-
- // reset the subscription time
- $sub->add('sub1:', 'testuser', 'list', '978328800'); // last mod 2001-01-01
-
- // we now should get a single mail for all three changes
- $this->assertEquals(1, $sub->send_bulk('sub1:test'));
- $this->assertEquals(array('arthur@example.com'), $sub->mails);
- }
-
- /**
- * 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() {
- $sub = new MockupSubscription();
-
- $sub->add(':', 'admin', 'digest', '123456789');
- $sub->add(':wiki:', 'admin', 'digest', '123456789');
- $sub->add(':', 'admin', 'digest', '1234');
- $sub->add(':wiki:', 'admin', 'digest', '1234');
-
- $subscriptions = $sub->subscribers(':wiki:', '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');
- }
-}
-
-/**
- * makes protected methods visible for testing
- */
-class MockupSubscription extends Subscription {
- public $mails; // we keep sent mails here
-
- public function __construct() {
- $this->reset();
- }
-
- /**
- * resets the mail array
- */
- public function reset() {
- $this->mails = array();
- }
-
- public function isenabled() {
- return true;
- }
-
- public function buildregex($user = null, $style = null, $data = null) {
- return parent::buildregex($user, $style, $data);
- }
-
- protected function send($subscriber_mail, $subject, $id, $template, $trep, $hrep = null, $headers = array()) {
- $this->mails[] = $subscriber_mail;
- return true;
- }
-}
-
-//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/template_include_page.test.php b/_test/tests/inc/template_include_page.test.php
index 7dd13ba23..c6a75ac95 100644
--- a/_test/tests/inc/template_include_page.test.php
+++ b/_test/tests/inc/template_include_page.test.php
@@ -32,7 +32,7 @@ class template_pagetitle_test extends DokuWikiTest {
}
function test_adminPluginTitle() {
- global $ID,$ACT,$INPUT,$conf;
+ global $ID,$ACT,$INPUT,$conf,$USERINFO;
if (!plugin_load('admin','revert')) {
$this->markTestSkipped('Revert plugin not found, unable to test admin plugin titles');
@@ -44,6 +44,7 @@ class template_pagetitle_test extends DokuWikiTest {
$conf['lang'] = 'en';
$INPUT->set('page','revert');
+ $INPUT->server->set('REMOTE_USER', 'testuser'); // this user is admin
$this->assertEquals('Revert Manager', tpl_pagetitle(null, true));
}
diff --git a/_test/tests/inc/toolbar.test.php b/_test/tests/inc/toolbar.test.php
new file mode 100644
index 000000000..0116687dc
--- /dev/null
+++ b/_test/tests/inc/toolbar.test.php
@@ -0,0 +1,20 @@
+<?php
+
+class toolbar_test extends DokuWikiTest {
+
+ function test_encode_toolbar_signature() {
+ global $conf, $INFO, $INPUT;
+
+ $conf['signature'] = '" --- \\\\n //[[@MAIL@|@NAME@]] (@USER@) @DATE@//"';
+ $_SERVER['REMOTE_USER'] = 'john';
+ $INFO['userinfo']['name'] = '/*!]]>*/</script><script>alert("\123\")</script>';
+ $INFO['userinfo']['mail'] = 'example@example.org';
+
+ $date = str_replace('/', '\/', dformat());
+
+ $expected = '"\" --- \\\n \/\/[[example@example.org|\/*!]]>*\/<\/script><script>'.
+ 'alert(\"\\\\123\\\\\\")<\/script>]] (john) '.$date.'\/\/\""';
+
+ $this->assertEquals($expected, toolbar_signature());
+ }
+}
diff --git a/_test/tests/inc/utf8_basename.test.php b/_test/tests/inc/utf8_basename.test.php
index 1544e9915..c946e39f3 100644
--- a/_test/tests/inc/utf8_basename.test.php
+++ b/_test/tests/inc/utf8_basename.test.php
@@ -84,8 +84,8 @@ class utf8_basename_test extends DokuWikiTest {
);
foreach($data as $test){
- $this->assertEquals($test[2], utf8_basename($test[0], $test[1]), "input: ('".$test[0]."', '".$test[1]."')");
+ $this->assertEquals($test[2], \dokuwiki\Utf8\PhpString::basename($test[0], $test[1]), "input: ('".$test[0]."', '".$test[1]."')");
}
}
-} \ No newline at end of file
+}
diff --git a/_test/tests/inc/utf8_correctidx.test.php b/_test/tests/inc/utf8_correctidx.test.php
index a704fd0e8..5a24af737 100644
--- a/_test/tests/inc/utf8_correctidx.test.php
+++ b/_test/tests/inc/utf8_correctidx.test.php
@@ -15,7 +15,7 @@ class utf8_correctidx_test extends DokuWikiTest {
$tests[] = array('aaживπά우리をあöä',1,true,1);
foreach($tests as $test){
- $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(\dokuwiki\Utf8\Clean::correctIdx($test[0],$test[1],$test[2]),$test[3]);
}
}
@@ -33,7 +33,7 @@ class utf8_correctidx_test extends DokuWikiTest {
$tests[] = array('aaживπά우리をあöä',4,true,4);
foreach($tests as $test){
- $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(\dokuwiki\Utf8\Clean::correctIdx($test[0],$test[1],$test[2]),$test[3]);
}
}
@@ -53,7 +53,7 @@ class utf8_correctidx_test extends DokuWikiTest {
$tests[] = array('aaживπά우리をあöä',13,true,13);
foreach($tests as $test){
- $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(\dokuwiki\Utf8\Clean::correctIdx($test[0],$test[1],$test[2]),$test[3]);
}
}
@@ -69,7 +69,7 @@ class utf8_correctidx_test extends DokuWikiTest {
$tests[] = array('aaживπά우리をあöä',128,true,29);
foreach($tests as $test){
- $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(\dokuwiki\Utf8\Clean::correctIdx($test[0],$test[1],$test[2]),$test[3]);
}
}
diff --git a/_test/tests/inc/utf8_html.test.php b/_test/tests/inc/utf8_html.test.php
index bdebd9d45..d65004fc2 100644
--- a/_test/tests/inc/utf8_html.test.php
+++ b/_test/tests/inc/utf8_html.test.php
@@ -8,61 +8,67 @@ class utf8_html_test extends DokuWikiTest {
function test_from_1byte(){
$in = 'a';
$out = 'a';
- $this->assertEquals(utf8_tohtml($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::toHtml($in),$out);
+ }
+
+ function test_from_1byte_all(){
+ $in = 'a';
+ $out = '&#97;';
+ $this->assertEquals(utf8_tohtml($in, true),$out);
}
function test_from_2byte(){
$in = "\xc3\xbc";
$out = '&#252;';
- $this->assertEquals(utf8_tohtml($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::toHtml($in),$out);
}
function test_from_3byte(){
$in = "\xe2\x99\x8a";
$out = '&#x264a;';
- $this->assertEquals(utf8_tohtml($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::toHtml($in),$out);
}
function test_from_4byte(){
$in = "\xf4\x80\x80\x81";
$out = '&#x100001;';
- $this->assertEquals(utf8_tohtml($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::toHtml($in),$out);
}
function test_to_1byte(){
$out = 'a';
$in = 'a';
- $this->assertEquals(utf8_unhtml($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::fromHtml($in),$out);
}
function test_to_2byte(){
$out = "\xc3\xbc";
$in = '&#252;';
- $this->assertEquals(utf8_unhtml($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::fromHtml($in),$out);
}
function test_to_3byte(){
$out = "\xe2\x99\x8a";
$in = '&#x264a;';
- $this->assertEquals(utf8_unhtml($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::fromHtml($in),$out);
}
function test_to_4byte(){
$out = "\xf4\x80\x80\x81";
$in = '&#x100001;';
- $this->assertEquals(utf8_unhtml($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::fromHtml($in),$out);
}
function test_without_entities(){
$out = '&amp;#38;&amp;#38;';
$in = '&amp;#38;&#38;amp;#38;';
- $this->assertEquals(utf8_unhtml($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::fromHtml($in),$out);
}
function test_with_entities(){
$out = '&#38;&amp;#38;';
$in = '&amp;#38;&#38;amp;#38;';
- $this->assertEquals(utf8_unhtml($in,HTML_ENTITIES),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::fromHtml($in,HTML_ENTITIES),$out);
}
}
diff --git a/_test/tests/inc/utf8_romanize.test.php b/_test/tests/inc/utf8_romanize.test.php
index 353d48c00..5ffa38872 100644
--- a/_test/tests/inc/utf8_romanize.test.php
+++ b/_test/tests/inc/utf8_romanize.test.php
@@ -18,7 +18,7 @@ class utf8_romanize_test extends DokuWikiTest {
foreach($tests as $test){
list($jap,$rom) = explode(';',trim($test));
- $chk = utf8_romanize($jap);
+ $chk = \dokuwiki\Utf8\Clean::romanize($jap);
$this->assertEquals($rom,$chk,"$jap\t->\t$chk\t!=\t$rom\t($line)");
$line++;
}
@@ -31,7 +31,7 @@ class utf8_romanize_test extends DokuWikiTest {
* @author Andreas Gohr <andi@splitbrain.org>
*/
function test_deaccented(){
- $this->assertEquals("a A a A a o O",utf8_romanize("å Å ä Ä ä ö Ö"));
+ $this->assertEquals("a A a A a o O",\dokuwiki\Utf8\Clean::romanize("å Å ä Ä ä ö Ö"));
}
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/utf8_stripspecials.test.php b/_test/tests/inc/utf8_stripspecials.test.php
index c9dc3205f..723b36281 100644
--- a/_test/tests/inc/utf8_stripspecials.test.php
+++ b/_test/tests/inc/utf8_stripspecials.test.php
@@ -19,7 +19,7 @@ class utf8_stripspecials extends DokuWikiTest {
$tests[] = array('string with nbsps','_','\*','string_with_nbsps');
foreach($tests as $test){
- $this->assertEquals(utf8_stripspecials($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(\dokuwiki\Utf8\Clean::stripspecials($test[0],$test[1],$test[2]),$test[3]);
}
}
diff --git a/_test/tests/inc/utf8_strtolower.test.php b/_test/tests/inc/utf8_strtolower.test.php
index 85f5b270b..2654c72cc 100644
--- a/_test/tests/inc/utf8_strtolower.test.php
+++ b/_test/tests/inc/utf8_strtolower.test.php
@@ -10,7 +10,7 @@ class utf8_strtolower_test extends DokuWikiTest {
);
foreach($data as $input => $expected) {
- $this->assertEquals($expected, utf8_strtolower($input));
+ $this->assertEquals($expected, \dokuwiki\Utf8\PhpString::strtolower($input));
}
// just make sure our data was correct
@@ -20,4 +20,4 @@ class utf8_strtolower_test extends DokuWikiTest {
}
}
}
-} \ No newline at end of file
+}
diff --git a/_test/tests/inc/utf8_substr.test.php b/_test/tests/inc/utf8_substr.test.php
index 758e8c9d4..e7d3fb555 100644
--- a/_test/tests/inc/utf8_substr.test.php
+++ b/_test/tests/inc/utf8_substr.test.php
@@ -21,7 +21,7 @@ class utf8_substr_test extends DokuWikiTest {
$tests[] = array('живπά우리をあöä',-6,-2,'우리をあ');
foreach($tests as $test){
- $this->assertEquals(utf8_substr($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(\dokuwiki\Utf8\PhpString::substr($test[0],$test[1],$test[2]),$test[3]);
}
}
@@ -34,7 +34,7 @@ class utf8_substr_test extends DokuWikiTest {
$tests[] = array($str,0,66002,$str);
foreach($tests as $test){
- $this->assertEquals(utf8_substr($test[0],$test[1],$test[2]),$test[3]);
+ $this->assertEquals(\dokuwiki\Utf8\PhpString::substr($test[0],$test[1],$test[2]),$test[3]);
}
}
diff --git a/_test/tests/inc/utf8_unicode.test.php b/_test/tests/inc/utf8_unicode.test.php
index fde8c5d02..94ef9f23e 100644
--- a/_test/tests/inc/utf8_unicode.test.php
+++ b/_test/tests/inc/utf8_unicode.test.php
@@ -8,49 +8,49 @@ class utf8_unicode_test extends DokuWikiTest {
function test_from_1byte(){
$in = 'a';
$out = array(97);
- $this->assertEquals(utf8_to_unicode($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Unicode::fromUtf8($in),$out);
}
function test_from_2byte(){
$in = "\xc3\xbc";
$out = array(252);
- $this->assertEquals(utf8_to_unicode($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Unicode::fromUtf8($in),$out);
}
function test_from_3byte(){
$in = "\xe2\x99\x8a";
$out = array(9802);
- $this->assertEquals(utf8_to_unicode($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Unicode::fromUtf8($in),$out);
}
function test_from_4byte(){
$in = "\xf4\x80\x80\x81";
$out = array(1048577);
- $this->assertEquals(utf8_to_unicode($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Unicode::fromUtf8($in),$out);
}
function test_to_1byte(){
$out = 'a';
$in = array(97);
- $this->assertEquals(unicode_to_utf8($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Unicode::toUtf8($in),$out);
}
function test_to_2byte(){
$out = "\xc3\xbc";
$in = array(252);
- $this->assertEquals(unicode_to_utf8($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Unicode::toUtf8($in),$out);
}
function test_to_3byte(){
$out = "\xe2\x99\x8a";
$in = array(9802);
- $this->assertEquals(unicode_to_utf8($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Unicode::toUtf8($in),$out);
}
function test_to_4byte(){
$out = "\xf4\x80\x80\x81";
$in = array(1048577);
- $this->assertEquals(unicode_to_utf8($in),$out);
+ $this->assertEquals(\dokuwiki\Utf8\Unicode::toUtf8($in),$out);
}
}
diff --git a/_test/tests/inc/utf8_utf16be.test.php b/_test/tests/inc/utf8_utf16be.test.php
index 943ebeffc..6ac879f68 100644
--- a/_test/tests/inc/utf8_utf16be.test.php
+++ b/_test/tests/inc/utf8_utf16be.test.php
@@ -12,14 +12,14 @@ class utf8_utf16be_test extends DokuWikiTest {
* Convert from UTF-8 to UTF-16BE
*/
function test_to16be(){
- $this->assertEquals(utf8_to_utf16be($this->utf8), $this->utf16);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::toUtf16Be($this->utf8), $this->utf16);
}
/**
* Convert from UTF-16BE to UTF-8
*/
function test_from16be(){
- $this->assertEquals(utf16be_to_utf8($this->utf16),$this->utf8);
+ $this->assertEquals(\dokuwiki\Utf8\Conversion::fromUtf16Be($this->utf16),$this->utf8);
}
}
diff --git a/_test/tests/lib/exe/css_css_compress.test.php b/_test/tests/lib/exe/css_css_compress.test.php
index 807317ca6..35654ec0c 100644
--- a/_test/tests/lib/exe/css_css_compress.test.php
+++ b/_test/tests/lib/exe/css_css_compress.test.php
@@ -71,7 +71,7 @@ class css_css_compress_test extends DokuWikiTest {
function test_hack(){
$text = '/* Mac IE will not see this and continue with inline-block */
/* \\*/
- display: inline;
+ display: inline;
/* */';
$this->assertEquals('/* \\*/display:inline;/* */', css_compress($text));
}
@@ -138,6 +138,19 @@ class css_css_compress_test extends DokuWikiTest {
$this->assertEquals($expect, css_compress($input));
}
+ function test_quotes() {
+ $input = '/* "blockcomment" */ content: "/* STR2 : STR1 */ thisis : inquote"; STR1: 10px; STR2:"STR1"; STR3:\'STR1\';';
+ $expect = 'content:"/* STR2 : STR1 */ thisis : inquote";STR1:10px;STR2:"STR1";STR3:\'STR1\';';
+
+ $this->assertEquals($expect, css_compress($input));
+ }
+
+ function test_escapedQuotes() {
+ $inputEscapedQuote = 'content:"one quote visible: \\" "; foo: bar;//"';
+ $expectedOutput = 'content:"one quote visible: \\" ";foo:bar;';
+
+ $this->assertEquals($expectedOutput, css_compress($inputEscapedQuote));
+ }
}
//Setup VIM: ex: et ts=4 :
diff --git a/appveyor.yml b/appveyor.yml
index dd1140a55..b4177d295 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -8,12 +8,15 @@ version: '{build}.{branch}'
environment:
matrix:
- - PHP_VERSION: '7.0.21'
+ - PHP_VERSION: '7.2.4'
+ VC: 'VC15'
+ PHPUNIT: '7'
+ - PHP_VERSION: '7.0.29'
VC: 'VC14'
- PHPUNIT: '6.3'
- - PHP_VERSION: '5.6.30'
+ PHPUNIT: '6'
+ - PHP_VERSION: '5.6.35'
VC: 'VC11'
- PHPUNIT: '5.7'
+ PHPUNIT: '5'
cache:
- c:\php -> appveyor.yml
@@ -26,7 +29,7 @@ install:
- IF NOT EXIST c:\php mkdir c:\php
- IF NOT EXIST c:\php\%PHP_VERSION% mkdir c:\php\%PHP_VERSION%
- cd c:\php\%PHP_VERSION%
- - IF NOT EXIST php-installed.txt appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-%PHP_VERSION%-Win32-%VC%-x86.zip
+ - IF NOT EXIST php-installed.txt curl -fsSL -o php-%PHP_VERSION%-Win32-%VC%-x86.zip https://windows.php.net/downloads/releases/archives/php-%PHP_VERSION%-Win32-%VC%-x86.zip
- IF NOT EXIST php-installed.txt 7z x php-%PHP_VERSION%-Win32-%VC%-x86.zip -y >nul
- IF NOT EXIST php-installed.txt del /Q *.zip
- IF NOT EXIST php-installed.txt copy /Y php.ini-development php.ini
@@ -38,7 +41,7 @@ install:
- IF NOT EXIST php-installed.txt echo extension=php_gd2.dll >> php.ini
- IF NOT EXIST php-installed.txt echo extension=php_bz2.dll >> php.ini
- IF NOT EXIST php-installed.txt echo extension=php_pdo_sqlite.dll >> php.ini
- - IF NOT EXIST php-installed.txt appveyor DownloadFile https://phar.phpunit.de/phpunit-%PHPUNIT%.phar -FileName phpunit.phar
+ - IF NOT EXIST php-installed.txt curl -fsSL -o phpunit.phar https://phar.phpunit.de/phpunit-%PHPUNIT%.phar
- IF NOT EXIST php-installed.txt type nul >> php-installed.txt
test_script:
diff --git a/bin/.htaccess b/bin/.htaccess
index 5f279f180..76253143a 100644
--- a/bin/.htaccess
+++ b/bin/.htaccess
@@ -1,7 +1,7 @@
-<IfModule mod_authz_host>
+<IfModule mod_authz_core.c>
Require all denied
</IfModule>
-<IfModule !mod_authz_host>
+<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
diff --git a/bin/dwpage.php b/bin/dwpage.php
index 3124563fc..967183434 100755
--- a/bin/dwpage.php
+++ b/bin/dwpage.php
@@ -182,7 +182,7 @@ class PageCLI extends CLI {
}
if(empty($localfile)) {
- $localfile = getcwd() . '/' . utf8_basename($wiki_fn);
+ $localfile = getcwd() . '/' . \dokuwiki\Utf8\PhpString::basename($wiki_fn);
}
if(!file_exists(dirname($localfile))) {
diff --git a/bin/gittool.php b/bin/gittool.php
index 63d5b4426..990281bf6 100755
--- a/bin/gittool.php
+++ b/bin/gittool.php
@@ -89,17 +89,17 @@ class GitToolCLI extends CLI {
echo $options->help();
break;
case 'clone':
- $this->cmd_clone($args);
+ $this->cmdClone($args);
break;
case 'install':
- $this->cmd_install($args);
+ $this->cmdInstall($args);
break;
case 'repo':
case 'repos':
- $this->cmd_repos();
+ $this->cmdRepos();
break;
default:
- $this->cmd_git($command, $args);
+ $this->cmdGit($command, $args);
}
}
@@ -108,7 +108,7 @@ class GitToolCLI extends CLI {
*
* @param array $extensions
*/
- public function cmd_clone($extensions) {
+ public function cmdClone($extensions) {
$errors = array();
$succeeded = array();
@@ -137,7 +137,7 @@ class GitToolCLI extends CLI {
*
* @param array $extensions
*/
- public function cmd_install($extensions) {
+ public function cmdInstall($extensions) {
$errors = array();
$succeeded = array();
@@ -171,7 +171,7 @@ class GitToolCLI extends CLI {
* @param $cmd
* @param $arg
*/
- public function cmd_git($cmd, $arg) {
+ public function cmdGit($cmd, $arg) {
$repos = $this->findRepos();
$shell = array_merge(array('git', $cmd), $arg);
@@ -199,7 +199,7 @@ class GitToolCLI extends CLI {
/**
* Simply lists the repositories
*/
- public function cmd_repos() {
+ public function cmdRepos() {
$repos = $this->findRepos();
foreach($repos as $repo) {
echo "$repo\n";
diff --git a/bin/indexer.php b/bin/indexer.php
index 4d19a9515..9ccdaa448 100755
--- a/bin/indexer.php
+++ b/bin/indexer.php
@@ -60,7 +60,7 @@ class IndexerCLI extends CLI {
/**
* Update the index
*/
- function update() {
+ protected function update() {
global $conf;
$data = array();
$this->quietecho("Searching pages... ");
@@ -77,7 +77,7 @@ class IndexerCLI extends CLI {
*
* @param string $id
*/
- function index($id) {
+ protected function index($id) {
$this->quietecho("$id... ");
idx_addPage($id, !$this->quiet, $this->clear);
$this->quietecho("done.\n");
@@ -86,7 +86,7 @@ class IndexerCLI extends CLI {
/**
* Clear all index files
*/
- function clearindex() {
+ protected function clearindex() {
$this->quietecho("Clearing index... ");
idx_get_indexer()->clear();
$this->quietecho("done.\n");
@@ -97,7 +97,7 @@ class IndexerCLI extends CLI {
*
* @param string $msg
*/
- function quietecho($msg) {
+ protected function quietecho($msg) {
if(!$this->quiet) echo $msg;
}
}
diff --git a/bin/plugin.php b/bin/plugin.php
index cbe0b1fe7..a3ee78dd0 100755
--- a/bin/plugin.php
+++ b/bin/plugin.php
@@ -1,6 +1,7 @@
#!/usr/bin/php
<?php
+use dokuwiki\Extension\PluginController;
use splitbrain\phpcli\CLI;
use splitbrain\phpcli\Colors;
use splitbrain\phpcli\Options;
@@ -51,7 +52,7 @@ class PluginCLI extends CLI {
* List available plugins
*/
protected function listPlugins() {
- /** @var Doku_Plugin_Controller $plugin_controller */
+ /** @var PluginController $plugin_controller */
global $plugin_controller;
echo "\n";
@@ -85,10 +86,9 @@ class PluginCLI extends CLI {
* Instantiate a CLI plugin
*
* @param string $name
- * @return DokuWiki_CLI_Plugin|null
+ * @return \dokuwiki\Extension\CLIPlugin|null
*/
- protected
- function loadPlugin($name) {
+ protected function loadPlugin($name) {
// execute the plugin CLI
$class = "cli_plugin_$name";
if(class_exists($class)) {
diff --git a/bin/wantedpages.php b/bin/wantedpages.php
index 0240eb958..f2efa0950 100755
--- a/bin/wantedpages.php
+++ b/bin/wantedpages.php
@@ -74,8 +74,8 @@ class WantedPagesCLI extends CLI {
$this->info("searching $startdir");
- foreach($this->get_pages($startdir) as $page) {
- $this->internal_links($page);
+ foreach($this->getPages($startdir) as $page) {
+ $this->internalLinks($page);
}
ksort($this->result);
foreach($this->result as $main => $subs) {
@@ -98,7 +98,7 @@ class WantedPagesCLI extends CLI {
* @param string $basepath
* @return int
*/
- protected function dir_filter($entry, $basepath) {
+ protected function dirFilter($entry, $basepath) {
if($entry == '.' || $entry == '..') {
return WantedPagesCLI::DIR_CONTINUE;
}
@@ -121,7 +121,7 @@ class WantedPagesCLI extends CLI {
* @return array
* @throws DokuCLI_Exception
*/
- protected function get_pages($dir) {
+ protected function getPages($dir) {
static $trunclen = null;
if(!$trunclen) {
global $conf;
@@ -135,11 +135,11 @@ class WantedPagesCLI extends CLI {
$pages = array();
$dh = opendir($dir);
while(false !== ($entry = readdir($dh))) {
- $status = $this->dir_filter($entry, $dir);
+ $status = $this->dirFilter($entry, $dir);
if($status == WantedPagesCLI::DIR_CONTINUE) {
continue;
} else if($status == WantedPagesCLI::DIR_NS) {
- $pages = array_merge($pages, $this->get_pages($dir . '/' . $entry));
+ $pages = array_merge($pages, $this->getPages($dir . '/' . $entry));
} else {
$page = array(
'id' => pathID(substr($dir . '/' . $entry, $trunclen)),
@@ -157,7 +157,7 @@ class WantedPagesCLI extends CLI {
*
* @param array $page array with page id and file path
*/
- function internal_links($page) {
+ protected function internalLinks($page) {
global $conf;
$instructions = p_get_instructions(file_get_contents($page['file']));
$cns = getNS($page['id']);
diff --git a/composer.json b/composer.json
index 948b97a62..d2aae98d3 100644
--- a/composer.json
+++ b/composer.json
@@ -6,6 +6,7 @@
"license": "GPL v2",
"require": {
"php": ">=5.6",
+ "ext-json": "*",
"splitbrain/php-archive": "~1.0",
"phpseclib/phpseclib": "~2.0",
"paragonie/random_compat": "^2.0",
@@ -23,7 +24,7 @@
},
"suggest": {
"squizlabs/php_codesniffer": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
- "phpunit/phpunit": "Allows automated tests to be run without system-wide install."
+ "phpunit/phpunit": "Allows automated tests to be run without system-wide install (only version 4-7 are supported)."
},
"prefer-stable": true
}
diff --git a/composer.lock b/composer.lock
index 7ab0304fe..827d8f56d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1,10 +1,10 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "d5c15248668d2dd749de47b106049b77",
+ "content-hash": "0bc9b3664395537d94aa155b32251ae8",
"packages": [
{
"name": "aziraphale/email-address-validator",
@@ -49,20 +49,20 @@
},
{
"name": "geshi/geshi",
- "version": "v1.0.9.0",
+ "version": "v1.0.9.1",
"source": {
"type": "git",
"url": "https://github.com/GeSHi/geshi-1.0.git",
- "reference": "5a7b461338d322d941986a656d4d1651452e73dd"
+ "reference": "fd22ab78481bf90337862b590e6f7517863926b8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GeSHi/geshi-1.0/zipball/5a7b461338d322d941986a656d4d1651452e73dd",
- "reference": "5a7b461338d322d941986a656d4d1651452e73dd",
+ "url": "https://api.github.com/repos/GeSHi/geshi-1.0/zipball/fd22ab78481bf90337862b590e6f7517863926b8",
+ "reference": "fd22ab78481bf90337862b590e6f7517863926b8",
"shasum": ""
},
"require-dev": {
- "phpunit/phpunit": "^5.7"
+ "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.2"
},
"type": "library",
"autoload": {
@@ -85,20 +85,20 @@
],
"description": "Generic Syntax Highlighter",
"homepage": "http://qbnz.com/highlighter/",
- "time": "2017-05-05T05:51:25+00:00"
+ "time": "2019-10-20T20:54:46+00:00"
},
{
"name": "marcusschwarz/lesserphp",
- "version": "v0.5.1",
+ "version": "v0.5.4",
"source": {
"type": "git",
"url": "https://github.com/MarcusSchwarz/lesserphp.git",
- "reference": "e9e3d53980c0e486b07c75e12f2bae5e10bdee44"
+ "reference": "3a0f5ae0d63cbb661b5f4afd2f96875e73b3ad7e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/MarcusSchwarz/lesserphp/zipball/e9e3d53980c0e486b07c75e12f2bae5e10bdee44",
- "reference": "e9e3d53980c0e486b07c75e12f2bae5e10bdee44",
+ "url": "https://api.github.com/repos/MarcusSchwarz/lesserphp/zipball/3a0f5ae0d63cbb661b5f4afd2f96875e73b3ad7e",
+ "reference": "3a0f5ae0d63cbb661b5f4afd2f96875e73b3ad7e",
"shasum": ""
},
"require-dev": {
@@ -137,20 +137,20 @@
],
"description": "lesserphp is a compiler for LESS written in PHP based on leafo's lessphp.",
"homepage": "http://leafo.net/lessphp/",
- "time": "2016-09-30T11:13:18+00:00"
+ "time": "2020-01-19T19:18:49+00:00"
},
{
"name": "openpsa/universalfeedcreator",
- "version": "v1.8.3",
+ "version": "v1.8.3.2",
"source": {
"type": "git",
"url": "https://github.com/flack/UniversalFeedCreator.git",
- "reference": "6261e130446d8f787bbfd229a602fb11e6816a4e"
+ "reference": "906745196469b13ceefa6523ef04851a78ad10f4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/flack/UniversalFeedCreator/zipball/6261e130446d8f787bbfd229a602fb11e6816a4e",
- "reference": "6261e130446d8f787bbfd229a602fb11e6816a4e",
+ "url": "https://api.github.com/repos/flack/UniversalFeedCreator/zipball/906745196469b13ceefa6523ef04851a78ad10f4",
+ "reference": "906745196469b13ceefa6523ef04851a78ad10f4",
"shasum": ""
},
"require": {
@@ -163,11 +163,14 @@
"autoload": {
"classmap": [
"lib"
+ ],
+ "files": [
+ "lib/constants.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL"
+ "LGPL-2.1-or-later"
],
"authors": [
{
@@ -185,20 +188,20 @@
"pie",
"rss"
],
- "time": "2017-05-18T08:28:48+00:00"
+ "time": "2019-09-01T17:49:46+00:00"
},
{
"name": "paragonie/random_compat",
- "version": "v2.0.12",
+ "version": "v2.0.18",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
- "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb"
+ "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb",
- "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
+ "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
"shasum": ""
},
"require": {
@@ -230,23 +233,24 @@
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
"keywords": [
"csprng",
+ "polyfill",
"pseudorandom",
"random"
],
- "time": "2018-04-04T21:24:14+00:00"
+ "time": "2019-01-03T20:59:08+00:00"
},
{
"name": "phpseclib/phpseclib",
- "version": "2.0.11",
+ "version": "2.0.27",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
- "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b"
+ "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/7053f06f91b3de78e143d430e55a8f7889efc08b",
- "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc",
+ "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc",
"shasum": ""
},
"require": {
@@ -325,29 +329,50 @@
"x.509",
"x509"
],
- "time": "2018-04-15T16:55:05+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/terrafrost",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/phpseclib",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-04-04T23:17:33+00:00"
},
{
"name": "simplepie/simplepie",
- "version": "1.5.1",
+ "version": "1.5.5",
"source": {
"type": "git",
"url": "https://github.com/simplepie/simplepie.git",
- "reference": "db9fff27b6d49eed3d4047cd3211ec8dba2f5d6e"
+ "reference": "ae49e2201b6da9c808e5dac437aca356a11831b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/simplepie/simplepie/zipball/db9fff27b6d49eed3d4047cd3211ec8dba2f5d6e",
- "reference": "db9fff27b6d49eed3d4047cd3211ec8dba2f5d6e",
+ "url": "https://api.github.com/repos/simplepie/simplepie/zipball/ae49e2201b6da9c808e5dac437aca356a11831b4",
+ "reference": "ae49e2201b6da9c808e5dac437aca356a11831b4",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "ext-pcre": "*",
+ "ext-xml": "*",
+ "ext-xmlreader": "*",
+ "php": ">=5.6.0"
},
"require-dev": {
- "phpunit/phpunit": "~4 || ~5"
+ "phpunit/phpunit": "~5.4.3 || ~6.5"
},
"suggest": {
+ "ext-curl": "",
+ "ext-iconv": "",
+ "ext-intl": "",
+ "ext-mbstring": "",
"mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
},
"type": "library",
@@ -367,8 +392,8 @@
"role": "Creator, alumnus developer"
},
{
- "name": "Geoffrey Sneddon",
- "homepage": "http://gsnedders.com/",
+ "name": "Sam Sneddon",
+ "homepage": "https://gsnedders.com/",
"role": "Alumnus developer"
},
{
@@ -385,20 +410,20 @@
"feeds",
"rss"
],
- "time": "2017-11-12T02:03:34+00:00"
+ "time": "2020-05-01T12:23:14+00:00"
},
{
"name": "splitbrain/php-archive",
- "version": "1.0.10",
+ "version": "1.1.1",
"source": {
"type": "git",
"url": "https://github.com/splitbrain/php-archive.git",
- "reference": "a46f3aaeb9f123fdb7db4e192b0600feebf7f773"
+ "reference": "10d89013572ba1f4d4ad7fcb74860242f4c3860b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/splitbrain/php-archive/zipball/a46f3aaeb9f123fdb7db4e192b0600feebf7f773",
- "reference": "a46f3aaeb9f123fdb7db4e192b0600feebf7f773",
+ "url": "https://api.github.com/repos/splitbrain/php-archive/zipball/10d89013572ba1f4d4ad7fcb74860242f4c3860b",
+ "reference": "10d89013572ba1f4d4ad7fcb74860242f4c3860b",
"shasum": ""
},
"require": {
@@ -439,20 +464,20 @@
"unzip",
"zip"
],
- "time": "2018-05-01T08:03:56+00:00"
+ "time": "2018-09-09T12:13:53+00:00"
},
{
"name": "splitbrain/php-cli",
- "version": "1.1.2",
+ "version": "1.1.6",
"source": {
"type": "git",
"url": "https://github.com/splitbrain/php-cli.git",
- "reference": "1d6f0bf9eccbfd79d1f4d185ef27573601185c23"
+ "reference": "b7be3726872547253dd0bd61098fa9f634c33555"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/splitbrain/php-cli/zipball/1d6f0bf9eccbfd79d1f4d185ef27573601185c23",
- "reference": "1d6f0bf9eccbfd79d1f4d185ef27573601185c23",
+ "url": "https://api.github.com/repos/splitbrain/php-cli/zipball/b7be3726872547253dd0bd61098fa9f634c33555",
+ "reference": "b7be3726872547253dd0bd61098fa9f634c33555",
"shasum": ""
},
"require": {
@@ -490,7 +515,7 @@
"optparse",
"terminal"
],
- "time": "2018-02-02T08:46:12+00:00"
+ "time": "2019-10-16T07:31:14+00:00"
}
],
"packages-dev": [],
@@ -500,10 +525,12 @@
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
- "php": ">=5.6"
+ "php": ">=5.6",
+ "ext-json": "*"
},
"platform-dev": [],
"platform-overrides": {
"php": "5.6"
- }
+ },
+ "plugin-api-version": "1.1.0"
}
diff --git a/conf/.htaccess b/conf/.htaccess
index b3ffca597..9f4913240 100644
--- a/conf/.htaccess
+++ b/conf/.htaccess
@@ -1,8 +1,8 @@
## no access to the conf directory
-<IfModule mod_authz_host>
+<IfModule mod_authz_core.c>
Require all denied
</IfModule>
-<IfModule !mod_authz_host>
+<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
diff --git a/conf/acronyms.conf b/conf/acronyms.conf
index 9363f947e..2ecdeda52 100644
--- a/conf/acronyms.conf
+++ b/conf/acronyms.conf
@@ -20,6 +20,7 @@ FTP File Transfer Protocol
FOSS Free & Open-Source Software
FLOSS Free/Libre and Open Source Software
FUD Fear, Uncertainty, and Doubt
+FYI For your information
GB Gigabyte
GHz Gigahertz
GPL GNU General Public License
diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php
index d57cf1c57..290453d89 100644
--- a/conf/dokuwiki.php
+++ b/conf/dokuwiki.php
@@ -8,7 +8,7 @@
* This is a piece of PHP code so PHP syntax applies!
*
* For help with the configuration and a more detailed explanation of the various options
- * see http://www.dokuwiki.org/config
+ * see https://www.dokuwiki.org/config
*/
@@ -55,7 +55,7 @@ $conf['hidepages'] = ''; //Regexp for pages to be skipped from
$conf['useacl'] = 0; //Use Access Control Lists to restrict access?
$conf['autopasswd'] = 1; //autogenerate passwords and email them to user
$conf['authtype'] = 'authplain'; //which authentication backend should be used
-$conf['passcrypt'] = 'smd5'; //Used crypt method (smd5,md5,sha1,ssha,crypt,mysql,my411)
+$conf['passcrypt'] = 'bcrypt'; //Used crypt method (smd5,md5,sha1,ssha,crypt,mysql,my411,bcrypt)
$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
@@ -65,11 +65,11 @@ $conf['disableactions'] = ''; //comma separated list of actions to di
$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['remoteuser'] = '!!not set!!'; //user/groups that have access to remote interface (comma separated). leave empty to allow all users
/* Antispam Features */
$conf['usewordblock']= 1; //block spam based on words? 0|1
-$conf['relnofollow'] = 1; //use rel="nofollow" for external links?
+$conf['relnofollow'] = 1; //use rel="ugc 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:
@@ -136,6 +136,7 @@ $conf['rss_media'] = 'both'; //what should be listed?
// 'media' - media changes only
$conf['rss_update'] = 5*60; //Update the RSS feed every n seconds (defaults to 5 minutes)
$conf['rss_show_summary'] = 1; //Add revision summary to title? 0|1
+$conf['rss_show_deleted'] = 1; //Show deleted items 0|1
/* Advanced Settings */
$conf['updatecheck'] = 1; //automatically check for new releases?
@@ -158,6 +159,12 @@ $conf['renderer_xhtml'] = 'xhtml'; //renderer to use for main page generat
$conf['readdircache'] = 0; //time cache in second for the readdir operation, 0 to deactivate.
$conf['search_nslimit'] = 0; //limit the search to the current X namespaces
$conf['search_fragment'] = 'exact'; //specify the default fragment search behavior
+$conf['trustedproxy'] = '^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)';
+ //Regexp of trusted proxy address when reading IP using HTTP header
+ // if blank, do not trust any proxy (including local IP)
+
+/* Feature Flags */
+$conf['defer_js'] = 1; // Defer javascript to be executed after the page's HTML has been parsed. Setting will be removed in the next release.
/* Network Settings */
$conf['dnslookups'] = 1; //disable to disallow IP to hostname lookups
@@ -169,12 +176,3 @@ $conf['proxy']['user'] = '';
$conf['proxy']['pass'] = '';
$conf['proxy']['ssl'] = 0;
$conf['proxy']['except'] = '';
-// 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';
-
-
diff --git a/conf/interwiki.conf b/conf/interwiki.conf
index 2432f111d..58bc517b8 100644
--- a/conf/interwiki.conf
+++ b/conf/interwiki.conf
@@ -22,6 +22,7 @@ wpde https://de.wikipedia.org/wiki/{NAME}
wpes https://es.wikipedia.org/wiki/{NAME}
wppl https://pl.wikipedia.org/wiki/{NAME}
wpjp https://ja.wikipedia.org/wiki/{NAME}
+wpru https://ru.wikipedia.org/wiki/{NAME}
wpmeta https://meta.wikipedia.org/wiki/{NAME}
doku https://www.dokuwiki.org/
rfc https://tools.ietf.org/html/rfc
diff --git a/conf/license.php b/conf/license.php
index 30d409e2e..845c59f67 100644
--- a/conf/license.php
+++ b/conf/license.php
@@ -5,32 +5,34 @@
* license.local.php instead.
*/
+if(empty($LC)) $LC = empty($conf['lang']) ? 'en' : $conf['lang'];
+
$license['cc-zero'] = array(
'name' => 'CC0 1.0 Universal',
- 'url' => 'http://creativecommons.org/publicdomain/zero/1.0/',
+ 'url' => 'https://creativecommons.org/publicdomain/zero/1.0/deed.'.$LC,
);
$license['publicdomain'] = array(
'name' => 'Public Domain',
- 'url' => 'http://creativecommons.org/licenses/publicdomain/',
+ 'url' => 'https://creativecommons.org/licenses/publicdomain/deed.'.$LC,
);
$license['cc-by'] = array(
'name' => 'CC Attribution 4.0 International',
- 'url' => 'http://creativecommons.org/licenses/by/4.0/',
+ 'url' => 'https://creativecommons.org/licenses/by/4.0/deed.'.$LC,
);
$license['cc-by-sa'] = array(
'name' => 'CC Attribution-Share Alike 4.0 International',
- 'url' => 'http://creativecommons.org/licenses/by-sa/4.0/',
+ 'url' => 'https://creativecommons.org/licenses/by-sa/4.0/deed.'.$LC,
);
$license['gnufdl'] = array(
'name' => 'GNU Free Documentation License 1.3',
- 'url' => 'http://www.gnu.org/licenses/fdl-1.3.html',
+ 'url' => 'https://www.gnu.org/licenses/fdl-1.3.html',
);
$license['cc-by-nc'] = array(
'name' => 'CC Attribution-Noncommercial 4.0 International',
- 'url' => 'http://creativecommons.org/licenses/by-nc/4.0/',
+ 'url' => 'https://creativecommons.org/licenses/by-nc/4.0/deed.'.$LC,
);
$license['cc-by-nc-sa'] = array(
'name' => 'CC Attribution-Noncommercial-Share Alike 4.0 International',
- 'url' => 'http://creativecommons.org/licenses/by-nc-sa/4.0/',
+ 'url' => 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.'.$LC,
);
diff --git a/data/.htaccess b/data/.htaccess
index 5f279f180..76253143a 100644
--- a/data/.htaccess
+++ b/data/.htaccess
@@ -1,7 +1,7 @@
-<IfModule mod_authz_host>
+<IfModule mod_authz_core.c>
Require all denied
</IfModule>
-<IfModule !mod_authz_host>
+<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
diff --git a/data/deleted.files b/data/deleted.files
index efd0c3781..0d46be13d 100644
--- a/data/deleted.files
+++ b/data/deleted.files
@@ -2,6 +2,135 @@
# but were removed later. An up to date DokuWiki should not have any of
# the files installed
+# removed in 2020-06-01
+inc/PluginInterface.php
+inc/PluginTrait.php
+inc/HTTPClient.php
+inc/PassHash.class.php
+inc/remote.php
+inc/RemoteAPICore.php
+inc/Sitemapper.php
+lib/plugins/config/_test/configuration.test.php
+inc/Input.class.php
+inc/JSON.php
+inc/Plugin.php
+inc/events.php
+inc/lang/.htaccess
+inc/lang/az/wordblock.txt
+inc/lang/gl/wordblock.txt
+inc/lang/ru/wordblock.txt
+inc/parser/lexer.php
+inc/plugincontroller.class.php
+inc/subscription.php
+lib/exe/indexer.php
+lib/plugins/authmysql/auth.php
+lib/plugins/authmysql/conf/default.php
+lib/plugins/authmysql/conf/metadata.php
+lib/plugins/authmysql/lang/bg/lang.php
+lib/plugins/authmysql/lang/bg/settings.php
+lib/plugins/authmysql/lang/cs/lang.php
+lib/plugins/authmysql/lang/cs/settings.php
+lib/plugins/authmysql/lang/cy/lang.php
+lib/plugins/authmysql/lang/cy/settings.php
+lib/plugins/authmysql/lang/da/lang.php
+lib/plugins/authmysql/lang/da/settings.php
+lib/plugins/authmysql/lang/de-informal/lang.php
+lib/plugins/authmysql/lang/de-informal/settings.php
+lib/plugins/authmysql/lang/de/lang.php
+lib/plugins/authmysql/lang/de/settings.php
+lib/plugins/authmysql/lang/en/lang.php
+lib/plugins/authmysql/lang/en/settings.php
+lib/plugins/authmysql/lang/eo/lang.php
+lib/plugins/authmysql/lang/eo/settings.php
+lib/plugins/authmysql/lang/es/lang.php
+lib/plugins/authmysql/lang/es/settings.php
+lib/plugins/authmysql/lang/eu/lang.php
+lib/plugins/authmysql/lang/eu/settings.php
+lib/plugins/authmysql/lang/fa/lang.php
+lib/plugins/authmysql/lang/fa/settings.php
+lib/plugins/authmysql/lang/fi/settings.php
+lib/plugins/authmysql/lang/fr/lang.php
+lib/plugins/authmysql/lang/fr/settings.php
+lib/plugins/authmysql/lang/he/settings.php
+lib/plugins/authmysql/lang/hr/lang.php
+lib/plugins/authmysql/lang/hr/settings.php
+lib/plugins/authmysql/lang/hu/lang.php
+lib/plugins/authmysql/lang/hu/settings.php
+lib/plugins/authmysql/lang/it/lang.php
+lib/plugins/authmysql/lang/it/settings.php
+lib/plugins/authmysql/lang/ja/lang.php
+lib/plugins/authmysql/lang/ja/settings.php
+lib/plugins/authmysql/lang/ko/lang.php
+lib/plugins/authmysql/lang/ko/settings.php
+lib/plugins/authmysql/lang/lv/settings.php
+lib/plugins/authmysql/lang/nl/lang.php
+lib/plugins/authmysql/lang/nl/settings.php
+lib/plugins/authmysql/lang/no/lang.php
+lib/plugins/authmysql/lang/no/settings.php
+lib/plugins/authmysql/lang/pl/lang.php
+lib/plugins/authmysql/lang/pl/settings.php
+lib/plugins/authmysql/lang/pt-br/lang.php
+lib/plugins/authmysql/lang/pt-br/settings.php
+lib/plugins/authmysql/lang/pt/lang.php
+lib/plugins/authmysql/lang/pt/settings.php
+lib/plugins/authmysql/lang/ru/lang.php
+lib/plugins/authmysql/lang/ru/settings.php
+lib/plugins/authmysql/lang/sk/lang.php
+lib/plugins/authmysql/lang/sk/settings.php
+lib/plugins/authmysql/lang/sl/settings.php
+lib/plugins/authmysql/lang/sr/lang.php
+lib/plugins/authmysql/lang/sr/settings.php
+lib/plugins/authmysql/lang/sv/lang.php
+lib/plugins/authmysql/lang/sv/settings.php
+lib/plugins/authmysql/lang/tr/lang.php
+lib/plugins/authmysql/lang/tr/settings.php
+lib/plugins/authmysql/lang/uk/lang.php
+lib/plugins/authmysql/lang/zh-tw/settings.php
+lib/plugins/authmysql/lang/zh/lang.php
+lib/plugins/authmysql/lang/zh/settings.php
+lib/plugins/authmysql/plugin.info.txt
+lib/plugins/authpgsql/auth.php
+lib/plugins/authpgsql/conf/default.php
+lib/plugins/authpgsql/conf/metadata.php
+lib/plugins/authpgsql/lang/bg/settings.php
+lib/plugins/authpgsql/lang/cs/settings.php
+lib/plugins/authpgsql/lang/cy/settings.php
+lib/plugins/authpgsql/lang/da/settings.php
+lib/plugins/authpgsql/lang/de-informal/settings.php
+lib/plugins/authpgsql/lang/de/settings.php
+lib/plugins/authpgsql/lang/en/settings.php
+lib/plugins/authpgsql/lang/eo/settings.php
+lib/plugins/authpgsql/lang/es/settings.php
+lib/plugins/authpgsql/lang/fa/settings.php
+lib/plugins/authpgsql/lang/fr/settings.php
+lib/plugins/authpgsql/lang/hr/settings.php
+lib/plugins/authpgsql/lang/hu/settings.php
+lib/plugins/authpgsql/lang/it/settings.php
+lib/plugins/authpgsql/lang/ja/settings.php
+lib/plugins/authpgsql/lang/ko/settings.php
+lib/plugins/authpgsql/lang/lv/settings.php
+lib/plugins/authpgsql/lang/nl/settings.php
+lib/plugins/authpgsql/lang/no/settings.php
+lib/plugins/authpgsql/lang/pl/settings.php
+lib/plugins/authpgsql/lang/pt-br/settings.php
+lib/plugins/authpgsql/lang/pt/settings.php
+lib/plugins/authpgsql/lang/ru/settings.php
+lib/plugins/authpgsql/lang/sk/settings.php
+lib/plugins/authpgsql/lang/sl/settings.php
+lib/plugins/authpgsql/lang/sr/settings.php
+lib/plugins/authpgsql/lang/sv/settings.php
+lib/plugins/authpgsql/lang/tr/settings.php
+lib/plugins/authpgsql/lang/uk/settings.php
+lib/plugins/authpgsql/lang/zh-tw/settings.php
+lib/plugins/authpgsql/lang/zh/settings.php
+lib/plugins/authpgsql/plugin.info.txt
+lib/plugins/config/settings/config.class.php
+lib/plugins/config/settings/extra.class.php
+lib/plugins/styling/iris.js
+lib/scripts/jquery/jquery-migrate.min.js
+vendor/paragonie/random_compat/psalm-autoload.php
+vendor/paragonie/random_compat/psalm.xml
+
# removed in 2018-04-22
data/security.png
data/security.xcf
diff --git a/data/pages/wiki/dokuwiki.txt b/data/pages/wiki/dokuwiki.txt
index 29843e5c6..1e5a19826 100644
--- a/data/pages/wiki/dokuwiki.txt
+++ b/data/pages/wiki/dokuwiki.txt
@@ -6,7 +6,7 @@ Read the [[doku>manual|DokuWiki Manual]] to unleash the full power of DokuWiki.
===== Download =====
-DokuWiki is available at http://download.dokuwiki.org/
+DokuWiki is available at https://download.dokuwiki.org/
===== Read More =====
@@ -19,12 +19,12 @@ All documentation and additional information besides the [[syntax|syntax descrip
* [[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]]
+ * [[https://www.wikimatrix.org/show/DokuWiki|Compare it with other wiki software]]
**Installing DokuWiki**
* [[doku>requirements|System Requirements]]
- * [[http://download.dokuwiki.org/|Download DokuWiki]] :!:
+ * [[https://download.dokuwiki.org/|Download DokuWiki]] :!:
* [[doku>changes|Change Log]]
* [[doku>Install|How to install or upgrade]] :!:
* [[doku>config|Configuration]]
@@ -35,7 +35,6 @@ All documentation and additional information besides the [[syntax|syntax descrip
* [[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**
@@ -48,17 +47,16 @@ All documentation and additional information besides the [[syntax|syntax descrip
* [[doku>newsletter|Subscribe to the newsletter]] :!:
* [[doku>mailinglist|Join the mailing list]]
- * [[http://forum.dokuwiki.org|Check out the user forum]]
+ * [[https://forum.dokuwiki.org|Check out the user forum]]
* [[doku>irc|Talk to other users in the IRC channel]]
* [[https://github.com/splitbrain/dokuwiki/issues|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-2015 (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
+2004-2020 (c) Andreas Gohr <andi@splitbrain.org>((Please do not contact me for help and support -- use the [[doku>mailinglist]] or [[https://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 ;-).
+The DokuWiki engine is licensed under [[https://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/data/pages/wiki/syntax.txt b/data/pages/wiki/syntax.txt
index 4eb960ab1..bf36c0822 100644
--- a/data/pages/wiki/syntax.txt
+++ b/data/pages/wiki/syntax.txt
@@ -136,12 +136,12 @@ 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://php.net/images/php.gif?200x50}}
+Resized external image:           {{https://secure.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://php.net/images/php.gif?200x50}}
+ Resized external image:           {{https://secure.php.net/images/php.gif?200x50}}
By using left or right whitespaces you can choose the alignment.
@@ -416,7 +416,7 @@ class HelloWorldApp {
}
</code>
-The following language strings are currently recognized: //4cs 6502acme 6502kickass 6502tasm 68000devpac abap actionscript3 actionscript ada aimms algol68 apache applescript apt_sources arm asm asp asymptote autoconf autohotkey autoit avisynth awk bascomavr bash basic4gl batch bf biblatex bibtex blitzbasic bnf boo caddcl cadlisp ceylon cfdg cfm chaiscript chapel cil c_loadrunner clojure c_mac cmake cobol coffeescript c cpp cpp-qt cpp-winapi csharp css cuesheet c_winapi dart dcl dcpu16 dcs delphi diff div dos dot d ecmascript eiffel email epc e erlang euphoria ezt f1 falcon fo fortran freebasic freeswitch fsharp gambas gdb genero genie gettext glsl gml gnuplot go groovy gwbasic haskell haxe hicest hq9plus html html4strict html5 icon idl ini inno intercal io ispfpanel java5 java javascript jcl j jquery julia kixtart klonec klonecpp kotlin latex lb ldif lisp llvm locobasic logtalk lolcode lotusformulas lotusscript lscript lsl2 lua m68k magiksf make mapbasic mathematica matlab mercury metapost mirc mk-61 mmix modula2 modula3 mpasm mxml mysql nagios netrexx newlisp nginx nimrod nsis oberon2 objc objeck ocaml-brief ocaml octave oobas oorexx oracle11 oracle8 oxygene oz parasail parigp pascal pcre perl6 perl per pf phix php-brief php pic16 pike pixelbender pli plsql postgresql postscript povray powerbuilder powershell proftpd progress prolog properties providex purebasic pycon pys60 python qbasic qml q racket rails rbs rebol reg rexx robots rpmspec rsplus ruby rust sas sass scala scheme scilab scl sdlbasic smalltalk smarty spark sparql sql standardml stonescript swift systemverilog tclegg tcl teraterm texgraph text thinbasic tsql twig typoscript unicon upc urbi uscript vala vbnet vb vbscript vedit verilog vhdl vim visualfoxpro visualprolog whitespace whois winbatch xbasic xml xojo xorg_conf xpp yaml z80 zxbasic//
+The following language strings are currently recognized: //4cs 6502acme 6502kickass 6502tasm 68000devpac abap actionscript3 actionscript ada aimms algol68 apache applescript apt_sources arm asm asp asymptote autoconf autohotkey autoit avisynth awk bascomavr bash basic4gl batch bf biblatex bibtex blitzbasic bnf boo caddcl cadlisp ceylon cfdg cfm chaiscript chapel cil c_loadrunner clojure c_mac cmake cobol coffeescript c cpp cpp-qt cpp-winapi csharp css cuesheet c_winapi dart dcl dcpu16 dcs delphi diff div dos dot d ecmascript eiffel email epc e erlang euphoria ezt f1 falcon fo fortran freebasic freeswitch fsharp gambas gdb genero genie gettext glsl gml gnuplot go groovy gwbasic haskell haxe hicest hq9plus html html4strict html5 icon idl ini inno intercal io ispfpanel java5 java javascript jcl j jquery julia kixtart klonec klonecpp kotlin latex lb ldif lisp llvm locobasic logtalk lolcode lotusformulas lotusscript lscript lsl2 lua m68k magiksf make mapbasic mathematica matlab mercury metapost mirc mk-61 mmix modula2 modula3 mpasm mxml mysql nagios netrexx newlisp nginx nimrod nsis oberon2 objc objeck ocaml-brief ocaml octave oobas oorexx oracle11 oracle8 oxygene oz parasail parigp pascal pcre perl6 perl per pf phix php-brief php pic16 pike pixelbender pli plsql postgresql postscript povray powerbuilder powershell proftpd progress prolog properties providex purebasic pycon pys60 python qbasic qml q racket rails rbs rebol reg rexx robots roff rpmspec rsplus ruby rust sas sass scala scheme scilab scl sdlbasic smalltalk smarty spark sparql sql sshconfig standardml stonescript swift systemverilog tclegg tcl teraterm texgraph text thinbasic tsql twig typoscript unicon upc urbi uscript vala vbnet vb vbscript vedit verilog vhdl vim visualfoxpro visualprolog whitespace whois winbatch wolfram xbasic xml xojo xorg_conf xpp yaml z80 zxbasic//
There are additional [[doku>syntax_highlighting|advanced options]] available for syntax highlighting, such as highlighting lines or adding line numbers.
diff --git a/data/pages/wiki/welcome.txt b/data/pages/wiki/welcome.txt
index 6978f1b14..10caa7c45 100644
--- a/data/pages/wiki/welcome.txt
+++ b/data/pages/wiki/welcome.txt
@@ -25,6 +25,6 @@ You may also want to see what [[doku>plugins|plugins]] and [[doku>templates|temp
DokuWiki is an Open Source project that thrives through user contributions. A good way to stay informed on what's going on and to get useful tips in using DokuWiki is subscribing to the [[doku>newsletter]].
-The [[http://forum.dokuwiki.org|DokuWiki User Forum]] is an excellent way to get in contact with other DokuWiki users and is just one of the many ways to get [[doku>faq:support|support]].
+The [[https://forum.dokuwiki.org|DokuWiki User Forum]] is an excellent way to get in contact with other DokuWiki users and is just one of the many ways to get [[doku>faq:support|support]].
Of course we'd be more than happy to have you [[doku>teams:getting_involved|getting involved]] with DokuWiki.
diff --git a/doku.php b/doku.php
index 170090039..8e845a23f 100644
--- a/doku.php
+++ b/doku.php
@@ -9,7 +9,9 @@
*/
// update message version - always use a string to avoid localized floats!
-$updateVersion = "50.3";
+use dokuwiki\Extension\Event;
+
+$updateVersion = "51";
// xdebug_start_profiling();
@@ -70,7 +72,7 @@ if($DATE_AT) {
//check for existing $REV related to $DATE_AT
if($DATE_AT) {
- $pagelog = new PageChangeLog($ID);
+ $pagelog = new \dokuwiki\ChangeLog\PageChangeLog($ID);
$rev_t = $pagelog->getLastRevisionAt($DATE_AT);
if($rev_t === '') { //current revision
$REV = null;
@@ -111,7 +113,7 @@ if($conf['breadcrumbs']) breadcrumbs();
checkUpdateMessages();
$tmp = array(); // No event data
-trigger_event('DOKUWIKI_STARTED', $tmp);
+Event::createAndTrigger('DOKUWIKI_STARTED', $tmp);
//close session
session_write_close();
@@ -120,6 +122,6 @@ session_write_close();
act_dispatch();
$tmp = array(); // No event data
-trigger_event('DOKUWIKI_DONE', $tmp);
+Event::createAndTrigger('DOKUWIKI_DONE', $tmp);
// xdebug_dump_function_profile(1);
diff --git a/feed.php b/feed.php
index 65d751b3e..3302d854f 100644
--- a/feed.php
+++ b/feed.php
@@ -9,6 +9,12 @@
* @global Input $INPUT
*/
+use dokuwiki\Cache\Cache;
+use dokuwiki\ChangeLog\MediaChangeLog;
+use dokuwiki\ChangeLog\PageChangeLog;
+use dokuwiki\Extension\AuthPlugin;
+use dokuwiki\Extension\Event;
+
if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/');
require_once(DOKU_INC.'inc/init.php');
@@ -28,7 +34,7 @@ $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)
$key = join('', array_values($opt)).'$'.$_SERVER['REMOTE_USER'].'$'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'];
-$cache = new cache($key, '.feed');
+$cache = new Cache($key, '.feed');
// prepare cache depends
$depends['files'] = getConfigFiles('main');
@@ -42,7 +48,7 @@ header('Pragma: public');
header('Content-Type: application/xml; charset=utf-8');
header('X-Robots-Tag: noindex');
if($cache->useCache($depends)) {
- http_conditionalRequest($cache->_time);
+ http_conditionalRequest($cache->getTime());
if($conf['allowdebug']) header("X-CacheUsed: $cache->cache");
print $cache->retrieveCache();
exit;
@@ -76,7 +82,7 @@ if(isset($modes[$opt['feed_mode']])) {
'opt' => &$opt,
'data' => &$data,
);
- $event = new Doku_Event('FEED_MODE_UNKNOWN', $eventData);
+ $event = new Event('FEED_MODE_UNKNOWN', $eventData);
if($event->advise_before(true)) {
echo sprintf('<error>Unknown feed mode %s</error>', hsc($opt['feed_mode']));
exit;
@@ -127,6 +133,8 @@ function rss_parseOptions() {
'items' => array('int', 'num', $conf['recent']),
// Boolean, only used in rc mode
'show_minor' => array('bool', 'minor', false),
+ // Boolean, only used in rc mode
+ 'only_new' => array('bool', 'onlynewpages', false),
// String, only used in list mode
'sort' => array('str', 'sort', 'natural'),
// String, only used in search mode
@@ -140,6 +148,7 @@ function rss_parseOptions() {
$opt['items'] = max(0, (int) $opt['items']);
$opt['show_minor'] = (bool) $opt['show_minor'];
+ $opt['only_new'] = (bool) $opt['only_new'];
$opt['sort'] = valid_input_set('sort', array('default' => 'natural', 'date'), $opt);
$opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
@@ -174,7 +183,7 @@ function rss_parseOptions() {
$eventData = array(
'opt' => &$opt,
);
- trigger_event('FEED_OPTS_POSTPROCESS', $eventData);
+ Event::createAndTrigger('FEED_OPTS_POSTPROCESS', $eventData);
return $opt;
}
@@ -189,7 +198,7 @@ function rss_parseOptions() {
function rss_buildItems(&$rss, &$data, $opt) {
global $conf;
global $lang;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
$eventData = array(
@@ -197,7 +206,7 @@ function rss_buildItems(&$rss, &$data, $opt) {
'data' => &$data,
'opt' => &$opt,
);
- $event = new Doku_Event('FEED_DATA_PROCESS', $eventData);
+ $event = new Event('FEED_DATA_PROCESS', $eventData);
if($event->advise_before(false)) {
foreach($data as $ditem) {
if(!is_array($ditem)) {
@@ -443,7 +452,7 @@ function rss_buildItems(&$rss, &$data, $opt) {
'ditem' => &$ditem,
'rss' => &$rss
);
- $evt = new Doku_Event('FEED_ITEM_ADD', $evdata);
+ $evt = new Event('FEED_ITEM_ADD', $evdata);
if($evt->advise_before()) {
$rss->addItem($item);
}
@@ -460,8 +469,10 @@ function rss_buildItems(&$rss, &$data, $opt) {
*/
function rssRecentChanges($opt) {
global $conf;
- $flags = RECENTS_SKIP_DELETED;
+ $flags = 0;
+ if(!$conf['rss_show_deleted']) $flags += RECENTS_SKIP_DELETED;
if(!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS;
+ if($opt['only_new']) $flags += RECENTS_ONLY_CREATION;
if($opt['content_type'] == 'media' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_CHANGES;
if($opt['content_type'] == 'both' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_PAGES_MIXED;
diff --git a/inc/.htaccess b/inc/.htaccess
index 2b34c725f..6ba7d916c 100644
--- a/inc/.htaccess
+++ b/inc/.htaccess
@@ -1,8 +1,8 @@
## no access to the inc directory
-<IfModule mod_authz_host>
+<IfModule mod_authz_core.c>
Require all denied
</IfModule>
-<IfModule !mod_authz_host>
+<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
diff --git a/inc/Action/Admin.php b/inc/Action/Admin.php
index 8d4305788..1c9afd6b9 100644
--- a/inc/Action/Admin.php
+++ b/inc/Action/Admin.php
@@ -15,22 +15,11 @@ class Admin extends AbstractUserAction {
/** @inheritdoc */
public function minimumPermission() {
- global $INFO;
-
- if($INFO['ismanager']) {
- return AUTH_READ; // let in check later
- } else {
- return AUTH_ADMIN;
- }
+ return AUTH_READ; // let in check later
}
public function checkPreconditions() {
parent::checkPreconditions();
-
- global $INFO;
- if(!$INFO['ismanager']) {
- throw new ActionException('denied');
- }
}
public function preProcess() {
@@ -39,9 +28,9 @@ class Admin extends AbstractUserAction {
// retrieve admin plugin name from $_REQUEST['page']
if(($page = $INPUT->str('page', '', true)) != '') {
- /** @var $plugin \DokuWiki_Admin_Plugin */
+ /** @var $plugin \dokuwiki\Extension\AdminPlugin */
if($plugin = plugin_getRequestAdminPlugin()) { // FIXME this method does also permission checking
- if($plugin->forAdminOnly() && !$INFO['isadmin']) {
+ if(!$plugin->isAccessibleByCurrentUser()) {
throw new ActionException('denied');
}
$plugin->handle();
diff --git a/inc/Action/Draftdel.php b/inc/Action/Draftdel.php
index 77378f7cb..756c0e8cd 100644
--- a/inc/Action/Draftdel.php
+++ b/inc/Action/Draftdel.php
@@ -19,16 +19,18 @@ class Draftdel extends AbstractAction {
}
/**
- * Delete an existing draft if any
+ * Delete an existing draft for the current page and user if any
*
- * Reads draft information from $INFO. Redirects to show, afterwards.
+ * Redirects to show, afterwards.
*
* @throws ActionAbort
*/
public function preProcess() {
- global $INFO;
- @unlink($INFO['draft']);
- $INFO['draft'] = null;
+ global $INFO, $ID;
+ $draft = new \dokuwiki\Draft($ID, $INFO['client']);
+ if ($draft->isDraftAvailable()) {
+ $draft->deleteDraft();
+ }
throw new ActionAbort('redirect');
}
diff --git a/inc/Action/Exception/FatalException.php b/inc/Action/Exception/FatalException.php
index 5f2516fa2..42e30ccae 100644
--- a/inc/Action/Exception/FatalException.php
+++ b/inc/Action/Exception/FatalException.php
@@ -13,9 +13,6 @@ namespace dokuwiki\Action\Exception;
* @package dokuwiki\Action\Exception
*/
class FatalException extends \Exception {
-
- protected $status;
-
/**
* FatalException constructor.
*
diff --git a/inc/Action/Export.php b/inc/Action/Export.php
index 1eec27ec3..6b46b276e 100644
--- a/inc/Action/Export.php
+++ b/inc/Action/Export.php
@@ -3,6 +3,7 @@
namespace dokuwiki\Action;
use dokuwiki\Action\Exception\ActionAbort;
+use dokuwiki\Extension\Event;
/**
* Class Export
@@ -96,7 +97,7 @@ class Export extends AbstractAction {
$data['headers'] = $headers;
$data['output'] =& $output;
- trigger_event('ACTION_EXPORT_POSTPROCESS', $data);
+ Event::createAndTrigger('ACTION_EXPORT_POSTPROCESS', $data);
if(!empty($data['output'])) {
if(is_array($data['headers'])) foreach($data['headers'] as $key => $val) {
diff --git a/inc/Action/Locked.php b/inc/Action/Locked.php
index 3ff2c5b80..41866e341 100644
--- a/inc/Action/Locked.php
+++ b/inc/Action/Locked.php
@@ -19,6 +19,7 @@ class Locked extends AbstractAction {
/** @inheritdoc */
public function tplContent() {
html_locked();
+ html_edit();
}
}
diff --git a/inc/Action/Logout.php b/inc/Action/Logout.php
index 159090423..28e8fee58 100644
--- a/inc/Action/Logout.php
+++ b/inc/Action/Logout.php
@@ -23,7 +23,7 @@ class Logout extends AbstractUserAction {
public function checkPreconditions() {
parent::checkPreconditions();
- /** @var \DokuWiki_Auth_Plugin $auth */
+ /** @var \dokuwiki\Extension\AuthPlugin $auth */
global $auth;
if(!$auth->canDo('logout')) throw new ActionDisabledException();
}
@@ -41,7 +41,7 @@ class Logout extends AbstractUserAction {
// do the logout stuff and redirect to login
auth_logoff();
- send_redirect(wl($ID, array('do' => 'login')));
+ send_redirect(wl($ID, array('do' => 'login'), true, '&'));
// should never be reached
throw new ActionException('login');
diff --git a/inc/Action/Plugin.php b/inc/Action/Plugin.php
index c3e16bf87..43964cf39 100644
--- a/inc/Action/Plugin.php
+++ b/inc/Action/Plugin.php
@@ -23,7 +23,7 @@ class Plugin extends AbstractAction {
* @triggers TPL_ACT_UNKNOWN
*/
public function tplContent() {
- $evt = new \Doku_Event('TPL_ACT_UNKNOWN', $this->actionname);
+ $evt = new \dokuwiki\Extension\Event('TPL_ACT_UNKNOWN', $this->actionname);
if($evt->advise_before()) {
msg('Failed to handle action: ' . hsc($this->actionname), -1);
}
diff --git a/inc/Action/Preview.php b/inc/Action/Preview.php
index 850b2049a..7a5aa4807 100644
--- a/inc/Action/Preview.php
+++ b/inc/Action/Preview.php
@@ -29,29 +29,13 @@ class Preview extends Edit {
* Saves a draft on preview
*/
protected function savedraft() {
- global $INFO;
- global $ID;
- global $INPUT;
- global $conf;
-
- if(!$conf['usedraft']) return;
- if(!$INPUT->post->has('wikitext')) return;
-
- // ensure environment (safeguard when used via AJAX)
- assert(isset($INFO['client']), 'INFO.client should have been set');
- assert(isset($ID), 'ID should have been set');
-
- $draft = array(
- 'id' => $ID,
- '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');
- if(io_saveFile($cname, serialize($draft))) {
- $INFO['draft'] = $cname;
+ global $ID, $INFO;
+ $draft = new \dokuwiki\Draft($ID, $INFO['client']);
+ if (!$draft->saveDraft()) {
+ $errors = $draft->getErrors();
+ foreach ($errors as $error) {
+ msg(hsc($error), -1);
+ }
}
}
diff --git a/inc/Action/Profile.php b/inc/Action/Profile.php
index 53d8d2ff3..654a23818 100644
--- a/inc/Action/Profile.php
+++ b/inc/Action/Profile.php
@@ -23,7 +23,7 @@ class Profile extends AbstractUserAction {
public function checkPreconditions() {
parent::checkPreconditions();
- /** @var \DokuWiki_Auth_Plugin $auth */
+ /** @var \dokuwiki\Extension\AuthPlugin $auth */
global $auth;
if(!$auth->canDo('Profile')) throw new ActionDisabledException();
}
diff --git a/inc/Action/ProfileDelete.php b/inc/Action/ProfileDelete.php
index 995f81394..89c58edb5 100644
--- a/inc/Action/ProfileDelete.php
+++ b/inc/Action/ProfileDelete.php
@@ -23,7 +23,7 @@ class ProfileDelete extends AbstractUserAction {
public function checkPreconditions() {
parent::checkPreconditions();
- /** @var \DokuWiki_Auth_Plugin $auth */
+ /** @var \dokuwiki\Extension\AuthPlugin $auth */
global $auth;
if(!$auth->canDo('delUser')) throw new ActionDisabledException();
}
diff --git a/inc/Action/Redirect.php b/inc/Action/Redirect.php
index 2e28f4550..dca911a22 100644
--- a/inc/Action/Redirect.php
+++ b/inc/Action/Redirect.php
@@ -3,6 +3,7 @@
namespace dokuwiki\Action;
use dokuwiki\Action\Exception\ActionAbort;
+use dokuwiki\Extension\Event;
/**
* Class Redirect
@@ -41,7 +42,7 @@ class Redirect extends AbstractAliasAction {
}
// execute the redirect
- trigger_event('ACTION_SHOW_REDIRECT', $opts, array($this, 'redirect'));
+ Event::createAndTrigger('ACTION_SHOW_REDIRECT', $opts, array($this, 'redirect'));
// should never be reached
throw new ActionAbort('show');
@@ -55,7 +56,7 @@ class Redirect extends AbstractAliasAction {
* @param array $opts id and fragment for the redirect and the preact
*/
public function redirect($opts) {
- $go = wl($opts['id'], '', true);
+ $go = wl($opts['id'], '', true, '&');
if(isset($opts['fragment'])) $go .= '#' . $opts['fragment'];
//show it
diff --git a/inc/Action/Register.php b/inc/Action/Register.php
index 0d5415868..7d21bff4a 100644
--- a/inc/Action/Register.php
+++ b/inc/Action/Register.php
@@ -23,7 +23,7 @@ class Register extends AbstractAclAction {
public function checkPreconditions() {
parent::checkPreconditions();
- /** @var \DokuWiki_Auth_Plugin $auth */
+ /** @var \dokuwiki\Extension\AuthPlugin $auth */
global $auth;
global $conf;
if(isset($conf['openregister']) && !$conf['openregister']) throw new ActionDisabledException();
diff --git a/inc/Action/Resendpwd.php b/inc/Action/Resendpwd.php
index 5b5e38194..dfa4a99d0 100644
--- a/inc/Action/Resendpwd.php
+++ b/inc/Action/Resendpwd.php
@@ -23,7 +23,7 @@ class Resendpwd extends AbstractAclAction {
public function checkPreconditions() {
parent::checkPreconditions();
- /** @var \DokuWiki_Auth_Plugin $auth */
+ /** @var \dokuwiki\Extension\AuthPlugin $auth */
global $auth;
global $conf;
if(isset($conf['resendpasswd']) && !$conf['resendpasswd']) throw new ActionDisabledException(); //legacy option
@@ -59,7 +59,7 @@ class Resendpwd extends AbstractAclAction {
protected function resendpwd() {
global $lang;
global $conf;
- /* @var \DokuWiki_Auth_Plugin $auth */
+ /* @var \dokuwiki\Extension\AuthPlugin $auth */
global $auth;
global $INPUT;
@@ -73,7 +73,7 @@ class Resendpwd extends AbstractAclAction {
if($token) {
// we're in token phase - get user info from token
- $tfile = $conf['cachedir'] . '/' . $token{0} . '/' . $token . '.pwauth';
+ $tfile = $conf['cachedir'] . '/' . $token[0] . '/' . $token . '.pwauth';
if(!file_exists($tfile)) {
msg($lang['resendpwdbadauth'], -1);
$INPUT->remove('pwauth');
@@ -148,7 +148,7 @@ class Resendpwd extends AbstractAclAction {
// generate auth token
$token = md5(auth_randombytes(16)); // random secret
- $tfile = $conf['cachedir'] . '/' . $token{0} . '/' . $token . '.pwauth';
+ $tfile = $conf['cachedir'] . '/' . $token[0] . '/' . $token . '.pwauth';
$url = wl('', array('do' => 'resendpwd', 'pwauth' => $token), true, '&');
io_saveFile($tfile, $user);
diff --git a/inc/Action/Revert.php b/inc/Action/Revert.php
index ca35374f2..07c322cfe 100644
--- a/inc/Action/Revert.php
+++ b/inc/Action/Revert.php
@@ -16,12 +16,7 @@ class Revert extends AbstractAction {
/** @inheritdoc */
public function minimumPermission() {
- global $INFO;
- if($INFO['ismanager']) {
- return AUTH_EDIT;
- } else {
- return AUTH_ADMIN;
- }
+ return AUTH_EDIT;
}
/**
diff --git a/inc/Action/Search.php b/inc/Action/Search.php
index 382fc47e6..88bd0baa3 100644
--- a/inc/Action/Search.php
+++ b/inc/Action/Search.php
@@ -39,8 +39,8 @@ class Search extends AbstractAction {
if ($ID !== $conf['start'] && !$INPUT->has('q')) {
parse_str($INPUT->server->str('QUERY_STRING'), $urlParts);
$urlParts['q'] = $urlParts['id'];
- $urlParts['id'] = $conf['start'];
- $url = DOKU_URL . DOKU_SCRIPT . '?' . http_build_query($urlParts, null, '&');
+ unset($urlParts['id']);
+ $url = wl($ID, $urlParts, true, '&');
send_redirect($url);
}
diff --git a/inc/Action/Sitemap.php b/inc/Action/Sitemap.php
index 025c5153c..f0a925cc3 100644
--- a/inc/Action/Sitemap.php
+++ b/inc/Action/Sitemap.php
@@ -29,11 +29,11 @@ class Sitemap extends AbstractAction {
global $conf;
if($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) {
- throw new FatalException(404, 'Sitemap generation is disabled');
+ throw new FatalException('Sitemap generation is disabled', 404);
}
- $sitemap = \Sitemapper::getFilePath();
- if(\Sitemapper::sitemapIsCompressed()) {
+ $sitemap = Sitemap::getFilePath();
+ if(Sitemap::sitemapIsCompressed()) {
$mime = 'application/x-gzip';
} else {
$mime = 'application/xml; charset=utf-8';
@@ -41,13 +41,13 @@ class Sitemap extends AbstractAction {
// Check if sitemap file exists, otherwise create it
if(!is_readable($sitemap)) {
- \Sitemapper::generate();
+ Sitemap::generate();
}
if(is_readable($sitemap)) {
// Send headers
header('Content-Type: ' . $mime);
- header('Content-Disposition: attachment; filename=' . utf8_basename($sitemap));
+ header('Content-Disposition: attachment; filename=' . \dokuwiki\Utf8\PhpString::basename($sitemap));
http_conditionalRequest(filemtime($sitemap));
@@ -59,7 +59,7 @@ class Sitemap extends AbstractAction {
exit;
}
- throw new FatalException(500, 'Could not read the sitemap file - bad permissions?');
+ throw new FatalException('Could not read the sitemap file - bad permissions?');
}
}
diff --git a/inc/Action/Subscribe.php b/inc/Action/Subscribe.php
index c16571022..a129a8698 100644
--- a/inc/Action/Subscribe.php
+++ b/inc/Action/Subscribe.php
@@ -4,6 +4,8 @@ namespace dokuwiki\Action;
use dokuwiki\Action\Exception\ActionAbort;
use dokuwiki\Action\Exception\ActionDisabledException;
+use dokuwiki\Subscriptions\SubscriberManager;
+use dokuwiki\Extension\Event;
/**
* Class Subscribe
@@ -67,18 +69,18 @@ class Subscribe extends AbstractUserAction {
if(empty($params['action']) || !checkSecurityToken()) return;
// Handle POST data, may throw exception.
- trigger_event('ACTION_HANDLE_SUBSCRIBE', $params, array($this, 'handlePostData'));
+ Event::createAndTrigger('ACTION_HANDLE_SUBSCRIBE', $params, array($this, 'handlePostData'));
$target = $params['target'];
$style = $params['style'];
$action = $params['action'];
// Perform action.
- $sub = new \Subscription();
- if($action == 'unsubscribe') {
- $ok = $sub->remove($target, $INPUT->server->str('REMOTE_USER'), $style);
+ $subManager = new SubscriberManager();
+ if($action === 'unsubscribe') {
+ $ok = $subManager->remove($target, $INPUT->server->str('REMOTE_USER'), $style);
} else {
- $ok = $sub->add($target, $INPUT->server->str('REMOTE_USER'), $style);
+ $ok = $subManager->add($target, $INPUT->server->str('REMOTE_USER'), $style);
}
if($ok) {
@@ -89,15 +91,15 @@ class Subscribe extends AbstractUserAction {
), 1
);
throw new ActionAbort('redirect');
- } else {
- throw new \Exception(
- sprintf(
- $lang["subscr_{$action}_error"],
- hsc($INFO['userinfo']['name']),
- prettyprint_id($target)
- )
- );
}
+
+ throw new \Exception(
+ sprintf(
+ $lang["subscr_{$action}_error"],
+ hsc($INFO['userinfo']['name']),
+ prettyprint_id($target)
+ )
+ );
}
/**
diff --git a/inc/ActionRouter.php b/inc/ActionRouter.php
index edc45cfc4..dfcce3aff 100644
--- a/inc/ActionRouter.php
+++ b/inc/ActionRouter.php
@@ -76,7 +76,7 @@ class ActionRouter {
try {
// give plugins an opportunity to process the actionname
- $evt = new \Doku_Event('ACTION_ACT_PREPROCESS', $actionname);
+ $evt = new Extension\Event('ACTION_ACT_PREPROCESS', $actionname);
if ($evt->advise_before()) {
$this->action = $this->loadAction($actionname);
$this->checkAction($this->action);
diff --git a/inc/Ajax.php b/inc/Ajax.php
index 191d8f8ba..386d65397 100644
--- a/inc/Ajax.php
+++ b/inc/Ajax.php
@@ -16,11 +16,11 @@ class Ajax {
* @param string $call name of the ajax call
*/
public function __construct($call) {
- $callfn = 'call_' . $call;
+ $callfn = 'call' . ucfirst($call);
if(method_exists($this, $callfn)) {
$this->$callfn();
} else {
- $evt = new \Doku_Event('AJAX_CALL_UNKNOWN', $call);
+ $evt = new Extension\Event('AJAX_CALL_UNKNOWN', $call);
if($evt->advise_before()) {
print "AJAX call '" . hsc($call) . "' unknown!\n";
} else {
@@ -35,7 +35,7 @@ class Ajax {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- protected function call_qsearch() {
+ protected function callQsearch() {
global $lang;
global $INPUT;
@@ -82,7 +82,7 @@ class Ajax {
* @link http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.0
* @author Mike Frysinger <vapier@gentoo.org>
*/
- protected function call_suggestions() {
+ protected function callSuggestions() {
global $INPUT;
$query = cleanID($INPUT->post->str('q'));
@@ -107,10 +107,9 @@ class Ajax {
array(), // no description
array() // no urls
);
- $json = new \JSON();
header('Content-Type: application/x-suggestions+json');
- print $json->encode($suggestions);
+ print json_encode($suggestions);
}
/**
@@ -118,9 +117,7 @@ class Ajax {
*
* Andreas Gohr <andi@splitbrain.org>
*/
- protected function call_lock() {
- global $conf;
- global $lang;
+ protected function callLock() {
global $ID;
global $INFO;
global $INPUT;
@@ -130,34 +127,29 @@ class Ajax {
$INFO = pageinfo();
+ $response = [
+ 'errors' => [],
+ 'lock' => '0',
+ 'draft' => '',
+ ];
if(!$INFO['writable']) {
- echo 'Permission denied';
+ $response['errors'][] = 'Permission to write this page has been denied.';
+ echo json_encode($response);
return;
}
if(!checklock($ID)) {
lock($ID);
- echo 1;
+ $response['lock'] = '1';
}
- if($conf['usedraft'] && $INPUT->post->str('wikitext')) {
- $client = $_SERVER['REMOTE_USER'];
- if(!$client) $client = clientIP(true);
-
- $draft = array(
- 'id' => $ID,
- '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');
- if(io_saveFile($cname, serialize($draft))) {
- echo $lang['draftdate'] . ' ' . dformat();
- }
+ $draft = new Draft($ID, $INFO['client']);
+ if ($draft->saveDraft()) {
+ $response['draft'] = $draft->getDraftMessage();
+ } else {
+ $response['errors'] = array_merge($response['errors'], $draft->getErrors());
}
-
+ echo json_encode($response);
}
/**
@@ -165,7 +157,7 @@ class Ajax {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- protected function call_draftdel() {
+ protected function callDraftdel() {
global $INPUT;
$id = cleanID($INPUT->str('id'));
if(empty($id)) return;
@@ -182,7 +174,7 @@ class Ajax {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- protected function call_medians() {
+ protected function callMedians() {
global $conf;
global $INPUT;
@@ -205,7 +197,7 @@ class Ajax {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- protected function call_medialist() {
+ protected function callMedialist() {
global $NS;
global $INPUT;
@@ -224,7 +216,7 @@ class Ajax {
*
* @author Kate Arzamastseva <pshns@ukr.net>
*/
- protected function call_mediadetails() {
+ protected function callMediadetails() {
global $IMG, $JUMPTO, $REV, $fullscreen, $INPUT;
$fullscreen = true;
require_once(DOKU_INC . 'lib/exe/mediamanager.php');
@@ -245,7 +237,7 @@ class Ajax {
*
* @author Kate Arzamastseva <pshns@ukr.net>
*/
- protected function call_mediadiff() {
+ protected function callMediadiff() {
global $NS;
global $INPUT;
@@ -261,11 +253,11 @@ class Ajax {
*
* @author Kate Arzamastseva <pshns@ukr.net>
*/
- protected function call_mediaupload() {
+ protected function callMediaupload() {
global $NS, $MSG, $INPUT;
$id = '';
- if($_FILES['qqfile']['tmp_name']) {
+ if(isset($_FILES['qqfile']['tmp_name'])) {
$id = $INPUT->post->str('mediaid', $_FILES['qqfile']['name']);
} elseif($INPUT->get->has('qqfile')) {
$id = $INPUT->get->str('qqfile');
@@ -281,10 +273,10 @@ class Ajax {
io_createNamespace("$ns:xxx", 'media');
}
- if($_FILES['qqfile']['error']) unset($_FILES['qqfile']);
+ if(isset($_FILES['qqfile']['error']) && $_FILES['qqfile']['error']) unset($_FILES['qqfile']);
$res = false;
- if($_FILES['qqfile']['tmp_name']) $res = media_upload($NS, $AUTH, $_FILES['qqfile']);
+ if(isset($_FILES['qqfile']['tmp_name'])) $res = media_upload($NS, $AUTH, $_FILES['qqfile']);
if($INPUT->get->has('qqfile')) $res = media_upload_xhr($NS, $AUTH);
if($res) {
@@ -306,9 +298,9 @@ class Ajax {
'ns' => $NS
);
}
- $json = new \JSON;
+
header('Content-Type: application/json');
- echo $json->encode($result);
+ echo json_encode($result);
}
/**
@@ -316,7 +308,7 @@ class Ajax {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- protected function call_index() {
+ protected function callIndex() {
global $conf;
global $INPUT;
@@ -339,7 +331,7 @@ class Ajax {
*
* @author Andreas Gohr <gohr@cosmocode.de>
*/
- protected function call_linkwiz() {
+ protected function callLinkwiz() {
global $conf;
global $lang;
global $INPUT;
@@ -354,7 +346,7 @@ class Ajax {
$nsd = utf8_encodeFN(str_replace(':', '/', $ns));
$data = array();
- if($q && !$ns) {
+ if($q !== '' && $ns === '') {
// use index to lookup matching pages
$pages = ft_pageLookup($id, true);
@@ -422,7 +414,7 @@ class Ajax {
foreach($data as $item) {
$even *= -1; //zebra
- if(($item['type'] == 'd' || $item['type'] == 'u') && $item['id']) $item['id'] .= ':';
+ if(($item['type'] == 'd' || $item['type'] == 'u') && $item['id'] !== '') $item['id'] .= ':';
$link = wl($item['id']);
echo '<div class="' . (($even > 0) ? 'even' : 'odd') . ' type_' . $item['type'] . '">';
diff --git a/inc/Cache/Cache.php b/inc/Cache/Cache.php
new file mode 100644
index 000000000..af82e6bf6
--- /dev/null
+++ b/inc/Cache/Cache.php
@@ -0,0 +1,240 @@
+<?php
+
+namespace dokuwiki\Cache;
+
+use dokuwiki\Debug\PropertyDeprecationHelper;
+use dokuwiki\Extension\Event;
+
+/**
+ * Generic handling of caching
+ */
+class Cache
+{
+ use PropertyDeprecationHelper;
+
+ public $key = ''; // primary identifier for this item
+ public $ext = ''; // file ext for cache data, secondary identifier for this item
+ public $cache = ''; // cache file name
+ public $depends = array(); // array containing cache dependency information,
+ // used by makeDefaultCacheDecision to determine cache validity
+
+ // phpcs:disable
+ /**
+ * @deprecated since 2019-02-02 use the respective getters instead!
+ */
+ protected $_event = ''; // event to be triggered during useCache
+ protected $_time;
+ protected $_nocache = false; // if set to true, cache will not be used or stored
+ // phpcs:enable
+
+ /**
+ * @param string $key primary identifier
+ * @param string $ext file extension
+ */
+ public function __construct($key, $ext)
+ {
+ $this->key = $key;
+ $this->ext = $ext;
+ $this->cache = getCacheName($key, $ext);
+
+ /**
+ * @deprecated since 2019-02-02 use the respective getters instead!
+ */
+ $this->deprecatePublicProperty('_event');
+ $this->deprecatePublicProperty('_time');
+ $this->deprecatePublicProperty('_nocache');
+ }
+
+ public function getTime()
+ {
+ return $this->_time;
+ }
+
+ public function getEvent()
+ {
+ return $this->_event;
+ }
+
+ public function setEvent($event)
+ {
+ $this->_event = $event;
+ }
+
+ /**
+ * public method to determine whether the cache can be used
+ *
+ * to assist in centralisation of event triggering and calculation of cache statistics,
+ * don't override this function override makeDefaultCacheDecision()
+ *
+ * @param array $depends array of cache dependencies, support dependecies:
+ * 'age' => max age of the cache in seconds
+ * 'files' => cache must be younger than mtime of each file
+ * (nb. dependency passes if file doesn't exist)
+ *
+ * @return bool true if cache can be used, false otherwise
+ */
+ public function useCache($depends = array())
+ {
+ $this->depends = $depends;
+ $this->addDependencies();
+
+ if ($this->getEvent()) {
+ return $this->stats(
+ Event::createAndTrigger(
+ $this->getEvent(),
+ $this,
+ array($this, 'makeDefaultCacheDecision')
+ )
+ );
+ }
+
+ return $this->stats($this->makeDefaultCacheDecision());
+ }
+
+ /**
+ * internal method containing cache use decision logic
+ *
+ * this function processes the following keys in the depends array
+ * purge - force a purge on any non empty value
+ * age - expire cache if older than age (seconds)
+ * files - expire cache if any file in this array was updated more recently than the cache
+ *
+ * Note that this function needs to be public as it is used as callback for the event handler
+ *
+ * can be overridden
+ *
+ * @internal This method may only be called by the event handler! Call \dokuwiki\Cache\Cache::useCache instead!
+ *
+ * @return bool see useCache()
+ */
+ public function makeDefaultCacheDecision()
+ {
+ if ($this->_nocache) {
+ return false;
+ } // caching turned off
+ if (!empty($this->depends['purge'])) {
+ return false;
+ } // purge requested?
+ if (!($this->_time = @filemtime($this->cache))) {
+ return false;
+ } // cache exists?
+
+ // cache too old?
+ if (!empty($this->depends['age']) && ((time() - $this->_time) > $this->depends['age'])) {
+ return false;
+ }
+
+ 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?
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * add dependencies to the depends array
+ *
+ * this method should only add dependencies,
+ * it should not remove any existing dependencies and
+ * it should only overwrite a dependency when the new value is more stringent than the old
+ */
+ protected function addDependencies()
+ {
+ global $INPUT;
+ if ($INPUT->has('purge')) {
+ $this->depends['purge'] = true;
+ } // purge requested
+ }
+
+ /**
+ * retrieve the cached data
+ *
+ * @param bool $clean true to clean line endings, false to leave line endings alone
+ * @return string cache contents
+ */
+ public function retrieveCache($clean = true)
+ {
+ return io_readFile($this->cache, $clean);
+ }
+
+ /**
+ * cache $data
+ *
+ * @param string $data the data to be cached
+ * @return bool true on success, false otherwise
+ */
+ public function storeCache($data)
+ {
+ if ($this->_nocache) {
+ return false;
+ }
+
+ return io_saveFile($this->cache, $data);
+ }
+
+ /**
+ * remove any cached data associated with this cache instance
+ */
+ public function removeCache()
+ {
+ @unlink($this->cache);
+ }
+
+ /**
+ * Record cache hits statistics.
+ * (Only when debugging allowed, to reduce overhead.)
+ *
+ * @param bool $success result of this cache use attempt
+ * @return bool pass-thru $success value
+ */
+ protected function stats($success)
+ {
+ global $conf;
+ static $stats = null;
+ static $file;
+
+ if (!$conf['allowdebug']) {
+ return $success;
+ }
+
+ if (is_null($stats)) {
+ $file = $conf['cachedir'] . '/cache_stats.txt';
+ $lines = explode("\n", io_readFile($file));
+
+ foreach ($lines as $line) {
+ $i = strpos($line, ',');
+ $stats[substr($line, 0, $i)] = $line;
+ }
+ }
+
+ if (isset($stats[$this->ext])) {
+ list($ext, $count, $hits) = explode(',', $stats[$this->ext]);
+ } else {
+ $ext = $this->ext;
+ $count = 0;
+ $hits = 0;
+ }
+
+ $count++;
+ if ($success) {
+ $hits++;
+ }
+ $stats[$this->ext] = "$ext,$count,$hits";
+
+ io_saveFile($file, join("\n", $stats));
+
+ return $success;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isNoCache()
+ {
+ return $this->_nocache;
+ }
+}
diff --git a/inc/Cache/CacheInstructions.php b/inc/Cache/CacheInstructions.php
new file mode 100644
index 000000000..acd02abae
--- /dev/null
+++ b/inc/Cache/CacheInstructions.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace dokuwiki\Cache;
+
+/**
+ * Caching of parser instructions
+ */
+class CacheInstructions extends \dokuwiki\Cache\CacheParser
+{
+
+ /**
+ * @param string $id page id
+ * @param string $file source file for cache
+ */
+ public function __construct($id, $file)
+ {
+ parent::__construct($id, $file, 'i');
+ }
+
+ /**
+ * retrieve the cached data
+ *
+ * @param bool $clean true to clean line endings, false to leave line endings alone
+ * @return array cache contents
+ */
+ public function retrieveCache($clean = true)
+ {
+ $contents = io_readFile($this->cache, false);
+ return !empty($contents) ? unserialize($contents) : array();
+ }
+
+ /**
+ * cache $instructions
+ *
+ * @param array $instructions the instruction to be cached
+ * @return bool true on success, false otherwise
+ */
+ public function storeCache($instructions)
+ {
+ if ($this->_nocache) {
+ return false;
+ }
+
+ return io_saveFile($this->cache, serialize($instructions));
+ }
+}
diff --git a/inc/Cache/CacheParser.php b/inc/Cache/CacheParser.php
new file mode 100644
index 000000000..ed476f471
--- /dev/null
+++ b/inc/Cache/CacheParser.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace dokuwiki\Cache;
+
+/**
+ * Parser caching
+ */
+class CacheParser extends Cache
+{
+
+ public $file = ''; // source file for cache
+ public $mode = ''; // input mode (represents the processing the input file will undergo)
+ public $page = '';
+
+ /**
+ *
+ * @param string $id page id
+ * @param string $file source file for cache
+ * @param string $mode input mode
+ */
+ public function __construct($id, $file, $mode)
+ {
+ if ($id) {
+ $this->page = $id;
+ }
+ $this->file = $file;
+ $this->mode = $mode;
+
+ $this->setEvent('PARSER_CACHE_USE');
+ parent::__construct($file . $_SERVER['HTTP_HOST'] . $_SERVER['SERVER_PORT'], '.' . $mode);
+ }
+
+ /**
+ * method contains cache use decision logic
+ *
+ * @return bool see useCache()
+ */
+ public function makeDefaultCacheDecision()
+ {
+
+ if (!file_exists($this->file)) {
+ return false;
+ } // source exists?
+ return parent::makeDefaultCacheDecision();
+ }
+
+ protected function addDependencies()
+ {
+
+ // parser cache file dependencies ...
+ $files = array(
+ $this->file, // ... source
+ DOKU_INC . 'inc/parser/Parser.php', // ... parser
+ DOKU_INC . 'inc/parser/handler.php', // ... handler
+ );
+ $files = array_merge($files, getConfigFiles('main')); // ... wiki settings
+
+ $this->depends['files'] = !empty($this->depends['files']) ?
+ array_merge($files, $this->depends['files']) :
+ $files;
+ parent::addDependencies();
+ }
+
+}
diff --git a/inc/Cache/CacheRenderer.php b/inc/Cache/CacheRenderer.php
new file mode 100644
index 000000000..e8a28c309
--- /dev/null
+++ b/inc/Cache/CacheRenderer.php
@@ -0,0 +1,94 @@
+<?php
+
+namespace dokuwiki\Cache;
+
+/**
+ * Caching of data of renderer
+ */
+class CacheRenderer extends CacheParser
+{
+
+ /**
+ * method contains cache use decision logic
+ *
+ * @return bool see useCache()
+ */
+ public function makeDefaultCacheDecision()
+ {
+ global $conf;
+
+ if (!parent::makeDefaultCacheDecision()) {
+ return false;
+ }
+
+ if (!isset($this->page)) {
+ return true;
+ }
+
+ // meta cache older than file it depends on?
+ if ($this->_time < @filemtime(metaFN($this->page, '.meta'))) {
+ return false;
+ }
+
+ // 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
+ if ($this->_time >= @filemtime($conf['cachedir'] . '/purgefile')) {
+ return true;
+ }
+
+ // for wiki pages, check metadata dependencies
+ $metadata = p_get_metadata($this->page);
+
+ if (!isset($metadata['relation']['references']) ||
+ empty($metadata['relation']['references'])) {
+ return true;
+ }
+
+ foreach ($metadata['relation']['references'] as $id => $exists) {
+ if ($exists != page_exists($id, '', false)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ protected function addDependencies()
+ {
+ global $conf;
+
+ // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values:
+ // -1 : do not cache (should not be overridden)
+ // 0 : cache never expires (can be overridden) - no need to set depends['age']
+ if ($conf['cachetime'] == -1) {
+ $this->_nocache = true;
+ return;
+ } elseif ($conf['cachetime'] > 0) {
+ $this->depends['age'] = isset($this->depends['age']) ?
+ min($this->depends['age'], $conf['cachetime']) : $conf['cachetime'];
+ }
+
+ // renderer cache file dependencies ...
+ $files = array(
+ DOKU_INC . 'inc/parser/' . $this->mode . '.php', // ... the renderer
+ );
+
+ // page implies metadata and possibly some other dependencies
+ if (isset($this->page)) {
+
+ // for xhtml this will render the metadata if needed
+ $valid = p_get_metadata($this->page, 'date valid');
+ if (!empty($valid['age'])) {
+ $this->depends['age'] = isset($this->depends['age']) ?
+ min($this->depends['age'], $valid['age']) : $valid['age'];
+ }
+ }
+
+ $this->depends['files'] = !empty($this->depends['files']) ?
+ array_merge($files, $this->depends['files']) :
+ $files;
+
+ parent::addDependencies();
+ }
+}
diff --git a/inc/ChangeLog/ChangeLog.php b/inc/ChangeLog/ChangeLog.php
new file mode 100644
index 000000000..16b5cc285
--- /dev/null
+++ b/inc/ChangeLog/ChangeLog.php
@@ -0,0 +1,666 @@
+<?php
+
+namespace dokuwiki\ChangeLog;
+
+/**
+ * methods for handling of changelog of pages or media files
+ */
+abstract class ChangeLog
+{
+
+ /** @var string */
+ protected $id;
+ /** @var int */
+ protected $chunk_size;
+ /** @var array */
+ protected $cache;
+
+ /**
+ * Constructor
+ *
+ * @param string $id page id
+ * @param int $chunk_size maximum block size read from file
+ */
+ public function __construct($id, $chunk_size = 8192)
+ {
+ global $cache_revinfo;
+
+ $this->cache =& $cache_revinfo;
+ if (!isset($this->cache[$id])) {
+ $this->cache[$id] = array();
+ }
+
+ $this->id = $id;
+ $this->setChunkSize($chunk_size);
+
+ }
+
+ /**
+ * Set chunk size for file reading
+ * Chunk size zero let read whole file at once
+ *
+ * @param int $chunk_size maximum block size read from file
+ */
+ public function setChunkSize($chunk_size)
+ {
+ if (!is_numeric($chunk_size)) $chunk_size = 0;
+
+ $this->chunk_size = (int)max($chunk_size, 0);
+ }
+
+ /**
+ * Returns path to changelog
+ *
+ * @return string path to file
+ */
+ abstract protected function getChangelogFilename();
+
+ /**
+ * Returns path to current page/media
+ *
+ * @return string path to file
+ */
+ abstract protected function getFilename();
+
+ /**
+ * Get the changelog information for a specific page id and revision (timestamp)
+ *
+ * Adjacent changelog lines are optimistically parsed and cached to speed up
+ * consecutive calls to getRevisionInfo. For large changelog files, only the chunk
+ * containing the requested changelog line is read.
+ *
+ * @param int $rev revision timestamp
+ * @return bool|array false or array with entries:
+ * - date: unix timestamp
+ * - ip: IPv4 address (127.0.0.1)
+ * - type: log line type
+ * - id: page id
+ * - user: user name
+ * - sum: edit summary (or action reason)
+ * - extra: extra data (varies by line type)
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+ public function getRevisionInfo($rev)
+ {
+ $rev = max($rev, 0);
+
+ // check if it's already in the memory cache
+ if (isset($this->cache[$this->id]) && isset($this->cache[$this->id][$rev])) {
+ return $this->cache[$this->id][$rev];
+ }
+
+ //read lines from changelog
+ list($fp, $lines) = $this->readloglines($rev);
+ if ($fp) {
+ fclose($fp);
+ }
+ if (empty($lines)) return false;
+
+ // parse and cache changelog lines
+ foreach ($lines as $value) {
+ $tmp = parseChangelogLine($value);
+ if ($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ }
+ }
+ if (!isset($this->cache[$this->id][$rev])) {
+ return false;
+ }
+ return $this->cache[$this->id][$rev];
+ }
+
+ /**
+ * Return a list of page revisions numbers
+ *
+ * Does not guarantee that the revision exists in the attic,
+ * only that a line with the date exists in the changelog.
+ * By default the current revision is skipped.
+ *
+ * The current revision is automatically skipped when the page exists.
+ * See $INFO['meta']['last_change'] for the current revision.
+ * A negative $first let read the current revision too.
+ *
+ * For efficiency, the log lines are parsed and cached for later
+ * calls to getRevisionInfo. Large changelog files are read
+ * backwards in chunks until the requested number of changelog
+ * lines are recieved.
+ *
+ * @param int $first skip the first n changelog lines
+ * @param int $num number of revisions to return
+ * @return array with the revision timestamps
+ *
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Kate Arzamastseva <pshns@ukr.net>
+ */
+ public function getRevisions($first, $num)
+ {
+ $revs = array();
+ $lines = array();
+ $count = 0;
+
+ $num = max($num, 0);
+ if ($num == 0) {
+ return $revs;
+ }
+
+ if ($first < 0) {
+ $first = 0;
+ } else {
+ if (file_exists($this->getFilename())) {
+ // skip current revision if the page exists
+ $first = max($first + 1, 0);
+ }
+ }
+
+ $file = $this->getChangelogFilename();
+
+ if (!file_exists($file)) {
+ return $revs;
+ }
+ if (filesize($file) < $this->chunk_size || $this->chunk_size == 0) {
+ // read whole file
+ $lines = file($file);
+ if ($lines === false) {
+ return $revs;
+ }
+ } else {
+ // read chunks backwards
+ $fp = fopen($file, 'rb'); // "file pointer"
+ if ($fp === false) {
+ return $revs;
+ }
+ fseek($fp, 0, SEEK_END);
+ $tail = ftell($fp);
+
+ // chunk backwards
+ $finger = max($tail - $this->chunk_size, 0);
+ while ($count < $num + $first) {
+ $nl = $this->getNewlinepointer($fp, $finger);
+
+ // was the chunk big enough? if not, take another bite
+ if ($nl > 0 && $tail <= $nl) {
+ $finger = max($finger - $this->chunk_size, 0);
+ continue;
+ } else {
+ $finger = $nl;
+ }
+
+ // read chunk
+ $chunk = '';
+ $read_size = max($tail - $finger, 0); // found chunk size
+ $got = 0;
+ while ($got < $read_size && !feof($fp)) {
+ $tmp = @fread($fp, max(min($this->chunk_size, $read_size - $got), 0));
+ if ($tmp === false) {
+ break;
+ } //error state
+ $got += strlen($tmp);
+ $chunk .= $tmp;
+ }
+ $tmp = explode("\n", $chunk);
+ array_pop($tmp); // remove trailing newline
+
+ // combine with previous chunk
+ $count += count($tmp);
+ $lines = array_merge($tmp, $lines);
+
+ // next chunk
+ if ($finger == 0) {
+ break;
+ } else { // already read all the lines
+ $tail = $finger;
+ $finger = max($tail - $this->chunk_size, 0);
+ }
+ }
+ fclose($fp);
+ }
+
+ // skip parsing extra lines
+ $num = max(min(count($lines) - $first, $num), 0);
+ if ($first > 0 && $num > 0) {
+ $lines = array_slice($lines, max(count($lines) - $first - $num, 0), $num);
+ } else {
+ if ($first > 0 && $num == 0) {
+ $lines = array_slice($lines, 0, max(count($lines) - $first, 0));
+ } elseif ($first == 0 && $num > 0) {
+ $lines = array_slice($lines, max(count($lines) - $num, 0));
+ }
+ }
+
+ // handle lines in reverse order
+ for ($i = count($lines) - 1; $i >= 0; $i--) {
+ $tmp = parseChangelogLine($lines[$i]);
+ if ($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ $revs[] = $tmp['date'];
+ }
+ }
+
+ return $revs;
+ }
+
+ /**
+ * Get the nth revision left or right handside for a specific page id and revision (timestamp)
+ *
+ * For large changelog files, only the chunk containing the
+ * reference revision $rev is read and sometimes a next chunck.
+ *
+ * Adjacent changelog lines are optimistically parsed and cached to speed up
+ * consecutive calls to getRevisionInfo.
+ *
+ * @param int $rev revision timestamp used as startdate (doesn't need to be revisionnumber)
+ * @param int $direction give position of returned revision with respect to $rev; positive=next, negative=prev
+ * @return bool|int
+ * timestamp of the requested revision
+ * otherwise false
+ */
+ public function getRelativeRevision($rev, $direction)
+ {
+ $rev = max($rev, 0);
+ $direction = (int)$direction;
+
+ //no direction given or last rev, so no follow-up
+ if (!$direction || ($direction > 0 && $this->isCurrentRevision($rev))) {
+ return false;
+ }
+
+ //get lines from changelog
+ list($fp, $lines, $head, $tail, $eof) = $this->readloglines($rev);
+ if (empty($lines)) return false;
+
+ // look for revisions later/earlier then $rev, when founded count till the wanted revision is reached
+ // also parse and cache changelog lines for getRevisionInfo().
+ $revcounter = 0;
+ $relativerev = false;
+ $checkotherchunck = true; //always runs once
+ while (!$relativerev && $checkotherchunck) {
+ $tmp = array();
+ //parse in normal or reverse order
+ $count = count($lines);
+ if ($direction > 0) {
+ $start = 0;
+ $step = 1;
+ } else {
+ $start = $count - 1;
+ $step = -1;
+ }
+ for ($i = $start; $i >= 0 && $i < $count; $i = $i + $step) {
+ $tmp = parseChangelogLine($lines[$i]);
+ if ($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ //look for revs older/earlier then reference $rev and select $direction-th one
+ if (($direction > 0 && $tmp['date'] > $rev) || ($direction < 0 && $tmp['date'] < $rev)) {
+ $revcounter++;
+ if ($revcounter == abs($direction)) {
+ $relativerev = $tmp['date'];
+ }
+ }
+ }
+ }
+
+ //true when $rev is found, but not the wanted follow-up.
+ $checkotherchunck = $fp
+ && ($tmp['date'] == $rev || ($revcounter > 0 && !$relativerev))
+ && !(($tail == $eof && $direction > 0) || ($head == 0 && $direction < 0));
+
+ if ($checkotherchunck) {
+ list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, $direction);
+
+ if (empty($lines)) break;
+ }
+ }
+ if ($fp) {
+ fclose($fp);
+ }
+
+ return $relativerev;
+ }
+
+ /**
+ * Returns revisions around rev1 and rev2
+ * When available it returns $max entries for each revision
+ *
+ * @param int $rev1 oldest revision timestamp
+ * @param int $rev2 newest revision timestamp (0 looks up last revision)
+ * @param int $max maximum number of revisions returned
+ * @return array with two arrays with revisions surrounding rev1 respectively rev2
+ */
+ public function getRevisionsAround($rev1, $rev2, $max = 50)
+ {
+ $max = floor(abs($max) / 2) * 2 + 1;
+ $rev1 = max($rev1, 0);
+ $rev2 = max($rev2, 0);
+
+ if ($rev2) {
+ if ($rev2 < $rev1) {
+ $rev = $rev2;
+ $rev2 = $rev1;
+ $rev1 = $rev;
+ }
+ } else {
+ //empty right side means a removed page. Look up last revision.
+ $revs = $this->getRevisions(-1, 1);
+ $rev2 = $revs[0];
+ }
+ //collect revisions around rev2
+ list($revs2, $allrevs, $fp, $lines, $head, $tail) = $this->retrieveRevisionsAround($rev2, $max);
+
+ if (empty($revs2)) return array(array(), array());
+
+ //collect revisions around rev1
+ $index = array_search($rev1, $allrevs);
+ if ($index === false) {
+ //no overlapping revisions
+ list($revs1, , , , ,) = $this->retrieveRevisionsAround($rev1, $max);
+ if (empty($revs1)) $revs1 = array();
+ } else {
+ //revisions overlaps, reuse revisions around rev2
+ $revs1 = $allrevs;
+ while ($head > 0) {
+ for ($i = count($lines) - 1; $i >= 0; $i--) {
+ $tmp = parseChangelogLine($lines[$i]);
+ if ($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ $revs1[] = $tmp['date'];
+ $index++;
+
+ if ($index > floor($max / 2)) break 2;
+ }
+ }
+
+ list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, -1);
+ }
+ sort($revs1);
+ //return wanted selection
+ $revs1 = array_slice($revs1, max($index - floor($max / 2), 0), $max);
+ }
+
+ return array(array_reverse($revs1), array_reverse($revs2));
+ }
+
+
+ /**
+ * Checks if the ID has old revisons
+ * @return boolean
+ */
+ public function hasRevisions() {
+ $file = $this->getChangelogFilename();
+ return file_exists($file);
+ }
+
+ /**
+ * Returns lines from changelog.
+ * If file larger than $chuncksize, only chunck is read that could contain $rev.
+ *
+ * @param int $rev revision timestamp
+ * @return array|false
+ * if success returns array(fp, array(changeloglines), $head, $tail, $eof)
+ * where fp only defined for chuck reading, needs closing.
+ * otherwise false
+ */
+ protected function readloglines($rev)
+ {
+ $file = $this->getChangelogFilename();
+
+ if (!file_exists($file)) {
+ return false;
+ }
+
+ $fp = null;
+ $head = 0;
+ $tail = 0;
+ $eof = 0;
+
+ if (filesize($file) < $this->chunk_size || $this->chunk_size == 0) {
+ // read whole file
+ $lines = file($file);
+ if ($lines === false) {
+ return false;
+ }
+ } else {
+ // read by chunk
+ $fp = fopen($file, 'rb'); // "file pointer"
+ if ($fp === false) {
+ return false;
+ }
+ $head = 0;
+ fseek($fp, 0, SEEK_END);
+ $eof = ftell($fp);
+ $tail = $eof;
+
+ // find chunk
+ while ($tail - $head > $this->chunk_size) {
+ $finger = $head + floor(($tail - $head) / 2.0);
+ $finger = $this->getNewlinepointer($fp, $finger);
+ $tmp = fgets($fp);
+ if ($finger == $head || $finger == $tail) {
+ break;
+ }
+ $tmp = parseChangelogLine($tmp);
+ $finger_rev = $tmp['date'];
+
+ if ($finger_rev > $rev) {
+ $tail = $finger;
+ } else {
+ $head = $finger;
+ }
+ }
+
+ if ($tail - $head < 1) {
+ // cound not find chunk, assume requested rev is missing
+ fclose($fp);
+ return false;
+ }
+
+ $lines = $this->readChunk($fp, $head, $tail);
+ }
+ return array(
+ $fp,
+ $lines,
+ $head,
+ $tail,
+ $eof,
+ );
+ }
+
+ /**
+ * Read chunk and return array with lines of given chunck.
+ * Has no check if $head and $tail are really at a new line
+ *
+ * @param resource $fp resource filepointer
+ * @param int $head start point chunck
+ * @param int $tail end point chunck
+ * @return array lines read from chunck
+ */
+ protected function readChunk($fp, $head, $tail)
+ {
+ $chunk = '';
+ $chunk_size = max($tail - $head, 0); // found chunk size
+ $got = 0;
+ fseek($fp, $head);
+ while ($got < $chunk_size && !feof($fp)) {
+ $tmp = @fread($fp, max(min($this->chunk_size, $chunk_size - $got), 0));
+ if ($tmp === false) { //error state
+ break;
+ }
+ $got += strlen($tmp);
+ $chunk .= $tmp;
+ }
+ $lines = explode("\n", $chunk);
+ array_pop($lines); // remove trailing newline
+ return $lines;
+ }
+
+ /**
+ * Set pointer to first new line after $finger and return its position
+ *
+ * @param resource $fp filepointer
+ * @param int $finger a pointer
+ * @return int pointer
+ */
+ protected function getNewlinepointer($fp, $finger)
+ {
+ fseek($fp, $finger);
+ $nl = $finger;
+ if ($finger > 0) {
+ fgets($fp); // slip the finger forward to a new line
+ $nl = ftell($fp);
+ }
+ return $nl;
+ }
+
+ /**
+ * Check whether given revision is the current page
+ *
+ * @param int $rev timestamp of current page
+ * @return bool true if $rev is current revision, otherwise false
+ */
+ public function isCurrentRevision($rev)
+ {
+ return $rev == @filemtime($this->getFilename());
+ }
+
+ /**
+ * Return an existing revision for a specific date which is
+ * the current one or younger or equal then the date
+ *
+ * @param number $date_at timestamp
+ * @return string revision ('' for current)
+ */
+ public function getLastRevisionAt($date_at)
+ {
+ //requested date_at(timestamp) younger or equal then modified_time($this->id) => load current
+ if (file_exists($this->getFilename()) && $date_at >= @filemtime($this->getFilename())) {
+ return '';
+ } else {
+ if ($rev = $this->getRelativeRevision($date_at + 1, -1)) { //+1 to get also the requested date revision
+ return $rev;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ /**
+ * Returns the next lines of the changelog of the chunck before head or after tail
+ *
+ * @param resource $fp filepointer
+ * @param int $head position head of last chunk
+ * @param int $tail position tail of last chunk
+ * @param int $direction positive forward, negative backward
+ * @return array with entries:
+ * - $lines: changelog lines of readed chunk
+ * - $head: head of chunk
+ * - $tail: tail of chunk
+ */
+ protected function readAdjacentChunk($fp, $head, $tail, $direction)
+ {
+ if (!$fp) return array(array(), $head, $tail);
+
+ if ($direction > 0) {
+ //read forward
+ $head = $tail;
+ $tail = $head + floor($this->chunk_size * (2 / 3));
+ $tail = $this->getNewlinepointer($fp, $tail);
+ } else {
+ //read backward
+ $tail = $head;
+ $head = max($tail - $this->chunk_size, 0);
+ while (true) {
+ $nl = $this->getNewlinepointer($fp, $head);
+ // was the chunk big enough? if not, take another bite
+ if ($nl > 0 && $tail <= $nl) {
+ $head = max($head - $this->chunk_size, 0);
+ } else {
+ $head = $nl;
+ break;
+ }
+ }
+ }
+
+ //load next chunck
+ $lines = $this->readChunk($fp, $head, $tail);
+ return array($lines, $head, $tail);
+ }
+
+ /**
+ * Collect the $max revisions near to the timestamp $rev
+ *
+ * @param int $rev revision timestamp
+ * @param int $max maximum number of revisions to be returned
+ * @return bool|array
+ * return array with entries:
+ * - $requestedrevs: array of with $max revision timestamps
+ * - $revs: all parsed revision timestamps
+ * - $fp: filepointer only defined for chuck reading, needs closing.
+ * - $lines: non-parsed changelog lines before the parsed revisions
+ * - $head: position of first readed changelogline
+ * - $lasttail: position of end of last readed changelogline
+ * otherwise false
+ */
+ protected function retrieveRevisionsAround($rev, $max)
+ {
+ //get lines from changelog
+ list($fp, $lines, $starthead, $starttail, /* $eof */) = $this->readloglines($rev);
+ if (empty($lines)) return false;
+
+ //parse chunk containing $rev, and read forward more chunks until $max/2 is reached
+ $head = $starthead;
+ $tail = $starttail;
+ $revs = array();
+ $aftercount = $beforecount = 0;
+ while (count($lines) > 0) {
+ foreach ($lines as $line) {
+ $tmp = parseChangelogLine($line);
+ if ($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ $revs[] = $tmp['date'];
+ if ($tmp['date'] >= $rev) {
+ //count revs after reference $rev
+ $aftercount++;
+ if ($aftercount == 1) $beforecount = count($revs);
+ }
+ //enough revs after reference $rev?
+ if ($aftercount > floor($max / 2)) break 2;
+ }
+ }
+ //retrieve next chunk
+ list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, 1);
+ }
+ if ($aftercount == 0) return false;
+
+ $lasttail = $tail;
+
+ //read additional chuncks backward until $max/2 is reached and total number of revs is equal to $max
+ $lines = array();
+ $i = 0;
+ if ($aftercount > 0) {
+ $head = $starthead;
+ $tail = $starttail;
+ while ($head > 0) {
+ list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, -1);
+
+ for ($i = count($lines) - 1; $i >= 0; $i--) {
+ $tmp = parseChangelogLine($lines[$i]);
+ if ($tmp !== false) {
+ $this->cache[$this->id][$tmp['date']] = $tmp;
+ $revs[] = $tmp['date'];
+ $beforecount++;
+ //enough revs before reference $rev?
+ if ($beforecount > max(floor($max / 2), $max - $aftercount)) break 2;
+ }
+ }
+ }
+ }
+ sort($revs);
+
+ //keep only non-parsed lines
+ $lines = array_slice($lines, 0, $i);
+ //trunk desired selection
+ $requestedrevs = array_slice($revs, -$max, $max);
+
+ return array($requestedrevs, $revs, $fp, $lines, $head, $lasttail);
+ }
+}
diff --git a/inc/ChangeLog/MediaChangeLog.php b/inc/ChangeLog/MediaChangeLog.php
new file mode 100644
index 000000000..0d7d8d390
--- /dev/null
+++ b/inc/ChangeLog/MediaChangeLog.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace dokuwiki\ChangeLog;
+
+/**
+ * handles changelog of a media file
+ */
+class MediaChangeLog extends ChangeLog
+{
+
+ /**
+ * Returns path to changelog
+ *
+ * @return string path to file
+ */
+ protected function getChangelogFilename()
+ {
+ return mediaMetaFN($this->id, '.changes');
+ }
+
+ /**
+ * Returns path to current page/media
+ *
+ * @return string path to file
+ */
+ protected function getFilename()
+ {
+ return mediaFN($this->id);
+ }
+}
diff --git a/inc/ChangeLog/PageChangeLog.php b/inc/ChangeLog/PageChangeLog.php
new file mode 100644
index 000000000..f1b91dee6
--- /dev/null
+++ b/inc/ChangeLog/PageChangeLog.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace dokuwiki\ChangeLog;
+
+/**
+ * handles changelog of a wiki page
+ */
+class PageChangeLog extends ChangeLog
+{
+
+ /**
+ * Returns path to changelog
+ *
+ * @return string path to file
+ */
+ protected function getChangelogFilename()
+ {
+ return metaFN($this->id, '.changes');
+ }
+
+ /**
+ * Returns path to current page/media
+ *
+ * @return string path to file
+ */
+ protected function getFilename()
+ {
+ return wikiFN($this->id);
+ }
+}
diff --git a/inc/Debug/DebugHelper.php b/inc/Debug/DebugHelper.php
new file mode 100644
index 000000000..09ff76b0f
--- /dev/null
+++ b/inc/Debug/DebugHelper.php
@@ -0,0 +1,167 @@
+<?php
+
+
+namespace dokuwiki\Debug;
+
+use Doku_Event;
+use dokuwiki\Extension\EventHandler;
+
+class DebugHelper
+{
+ const INFO_DEPRECATION_LOG_EVENT = 'INFO_DEPRECATION_LOG';
+
+ /**
+ * Log accesses to deprecated fucntions to the debug log
+ *
+ * @param string $alternative (optional) The function or method that should be used instead
+ * @param int $callerOffset (optional) How far the deprecated method is removed from this one
+ *
+ * @triggers \dokuwiki\Debug::INFO_DEPRECATION_LOG_EVENT
+ */
+ public static function dbgDeprecatedFunction($alternative = '', $callerOffset = 1)
+ {
+ global $conf;
+ /** @var EventHandler $EVENT_HANDLER */
+ global $EVENT_HANDLER;
+ if (
+ !$conf['allowdebug'] &&
+ ($EVENT_HANDLER === null || !$EVENT_HANDLER->hasHandlerForEvent('INFO_DEPRECATION_LOG'))
+ ){
+ // avoid any work if no one cares
+ return;
+ }
+
+ $backtrace = debug_backtrace();
+ for ($i = 0; $i < $callerOffset; $i += 1) {
+ array_shift($backtrace);
+ }
+
+ list($self, $call) = $backtrace;
+
+ self::triggerDeprecationEvent(
+ $backtrace,
+ $alternative,
+ trim(
+ (!empty($self['class']) ? ($self['class'] . '::') : '') .
+ $self['function'] . '()', ':'),
+ trim(
+ (!empty($call['class']) ? ($call['class'] . '::') : '') .
+ $call['function'] . '()', ':'),
+ $call['file'],
+ $call['line']
+ );
+ }
+
+ /**
+ * This marks logs a deprecation warning for a property that should no longer be used
+ *
+ * This is usually called withing a magic getter or setter.
+ * For logging deprecated functions or methods see dbgDeprecatedFunction()
+ *
+ * @param string $class The class with the deprecated property
+ * @param string $propertyName The name of the deprecated property
+ *
+ * @triggers \dokuwiki\Debug::INFO_DEPRECATION_LOG_EVENT
+ */
+ public static function dbgDeprecatedProperty($class, $propertyName)
+ {
+ global $conf;
+ global $EVENT_HANDLER;
+ if (!$conf['allowdebug'] && !$EVENT_HANDLER->hasHandlerForEvent(self::INFO_DEPRECATION_LOG_EVENT)) {
+ // avoid any work if no one cares
+ return;
+ }
+
+ $backtrace = debug_backtrace();
+ array_shift($backtrace);
+ $call = $backtrace[1];
+ $caller = trim($call['class'] . '::' . $call['function'] . '()', ':');
+ $qualifiedName = $class . '::$' . $propertyName;
+ self::triggerDeprecationEvent(
+ $backtrace,
+ '',
+ $qualifiedName,
+ $caller,
+ $backtrace[0]['file'],
+ $backtrace[0]['line']
+ );
+ }
+
+ /**
+ * Trigger a custom deprecation event
+ *
+ * Usually dbgDeprecatedFunction() or dbgDeprecatedProperty() should be used instead.
+ * This method is intended only for those situation where they are not applicable.
+ *
+ * @param string $alternative
+ * @param string $deprecatedThing
+ * @param string $caller
+ * @param string $file
+ * @param int $line
+ * @param int $callerOffset How many lines should be removed from the beginning of the backtrace
+ */
+ public static function dbgCustomDeprecationEvent(
+ $alternative,
+ $deprecatedThing,
+ $caller,
+ $file,
+ $line,
+ $callerOffset = 1
+ ) {
+ global $conf;
+ /** @var EventHandler $EVENT_HANDLER */
+ global $EVENT_HANDLER;
+ if (!$conf['allowdebug'] && !$EVENT_HANDLER->hasHandlerForEvent(self::INFO_DEPRECATION_LOG_EVENT)) {
+ // avoid any work if no one cares
+ return;
+ }
+
+ $backtrace = array_slice(debug_backtrace(), $callerOffset);
+
+ self::triggerDeprecationEvent(
+ $backtrace,
+ $alternative,
+ $deprecatedThing,
+ $caller,
+ $file,
+ $line
+ );
+
+ }
+
+ /**
+ * @param array $backtrace
+ * @param string $alternative
+ * @param string $deprecatedThing
+ * @param string $caller
+ * @param string $file
+ * @param int $line
+ */
+ private static function triggerDeprecationEvent(
+ array $backtrace,
+ $alternative,
+ $deprecatedThing,
+ $caller,
+ $file,
+ $line
+ ) {
+ $data = [
+ 'trace' => $backtrace,
+ 'alternative' => $alternative,
+ 'called' => $deprecatedThing,
+ 'caller' => $caller,
+ 'file' => $file,
+ 'line' => $line,
+ ];
+ $event = new Doku_Event(self::INFO_DEPRECATION_LOG_EVENT, $data);
+ if ($event->advise_before()) {
+ $msg = $event->data['called'] . ' is deprecated. It was called from ';
+ $msg .= $event->data['caller'] . ' in ' . $event->data['file'] . ':' . $event->data['line'];
+ if ($event->data['alternative']) {
+ $msg .= ' ' . $event->data['alternative'] . ' should be used instead!';
+ }
+ dbglog($msg);
+ }
+ $event->advise_after();
+ }
+}
diff --git a/inc/Debug/PropertyDeprecationHelper.php b/inc/Debug/PropertyDeprecationHelper.php
new file mode 100644
index 000000000..6289d5ba8
--- /dev/null
+++ b/inc/Debug/PropertyDeprecationHelper.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * Trait for issuing warnings on deprecated access.
+ *
+ * Adapted from https://github.com/wikimedia/mediawiki/blob/4aedefdbfd193f323097354bf581de1c93f02715/includes/debug/DeprecationHelper.php
+ *
+ */
+
+
+namespace dokuwiki\Debug;
+
+/**
+ * Use this trait in classes which have properties for which public access
+ * is deprecated. Set the list of properties in $deprecatedPublicProperties
+ * and make the properties non-public. The trait will preserve public access
+ * but issue deprecation warnings when it is needed.
+ *
+ * Example usage:
+ * class Foo {
+ * use DeprecationHelper;
+ * protected $bar;
+ * public function __construct() {
+ * $this->deprecatePublicProperty( 'bar', '1.21', __CLASS__ );
+ * }
+ * }
+ *
+ * $foo = new Foo;
+ * $foo->bar; // works but logs a warning
+ *
+ * Cannot be used with classes that have their own __get/__set methods.
+ *
+ */
+trait PropertyDeprecationHelper
+{
+
+ /**
+ * List of deprecated properties, in <property name> => <class> format
+ * where <class> is the the name of the class defining the property
+ *
+ * E.g. [ '_event' => '\dokuwiki\Cache\Cache' ]
+ * @var string[]
+ */
+ protected $deprecatedPublicProperties = [];
+
+ /**
+ * Mark a property as deprecated. Only use this for properties that used to be public and only
+ * call it in the constructor.
+ *
+ * @param string $property The name of the property.
+ * @param null $class name of the class defining the property
+ * @see DebugHelper::dbgDeprecatedProperty
+ */
+ protected function deprecatePublicProperty(
+ $property,
+ $class = null
+ ) {
+ $this->deprecatedPublicProperties[$property] = $class ?: get_class();
+ }
+
+ public function __get($name)
+ {
+ if (isset($this->deprecatedPublicProperties[$name])) {
+ $class = $this->deprecatedPublicProperties[$name];
+ DebugHelper::dbgDeprecatedProperty($class, $name);
+ return $this->$name;
+ }
+
+ $qualifiedName = get_class() . '::$' . $name;
+ if ($this->deprecationHelperGetPropertyOwner($name)) {
+ // Someone tried to access a normal non-public property. Try to behave like PHP would.
+ trigger_error("Cannot access non-public property $qualifiedName", E_USER_ERROR);
+ } else {
+ // Non-existing property. Try to behave like PHP would.
+ trigger_error("Undefined property: $qualifiedName", E_USER_NOTICE);
+ }
+ return null;
+ }
+
+ public function __set($name, $value)
+ {
+ if (isset($this->deprecatedPublicProperties[$name])) {
+ $class = $this->deprecatedPublicProperties[$name];
+ DebugHelper::dbgDeprecatedProperty($class, $name);
+ $this->$name = $value;
+ return;
+ }
+
+ $qualifiedName = get_class() . '::$' . $name;
+ if ($this->deprecationHelperGetPropertyOwner($name)) {
+ // Someone tried to access a normal non-public property. Try to behave like PHP would.
+ trigger_error("Cannot access non-public property $qualifiedName", E_USER_ERROR);
+ } else {
+ // Non-existing property. Try to behave like PHP would.
+ $this->$name = $value;
+ }
+ }
+
+ /**
+ * Like property_exists but also check for non-visible private properties and returns which
+ * class in the inheritance chain declared the property.
+ * @param string $property
+ * @return string|bool Best guess for the class in which the property is defined.
+ */
+ private function deprecationHelperGetPropertyOwner($property)
+ {
+ // Easy branch: check for protected property / private property of the current class.
+ if (property_exists($this, $property)) {
+ // The class name is not necessarily correct here but getting the correct class
+ // name would be expensive, this will work most of the time and getting it
+ // wrong is not a big deal.
+ return __CLASS__;
+ }
+ // property_exists() returns false when the property does exist but is private (and not
+ // defined by the current class, for some value of "current" that differs slightly
+ // between engines).
+ // Since PHP triggers an error on public access of non-public properties but happily
+ // allows public access to undefined properties, we need to detect this case as well.
+ // Reflection is slow so use array cast hack to check for that:
+ $obfuscatedProps = array_keys((array)$this);
+ $obfuscatedPropTail = "\0$property";
+ foreach ($obfuscatedProps as $obfuscatedProp) {
+ // private props are in the form \0<classname>\0<propname>
+ if (strpos($obfuscatedProp, $obfuscatedPropTail, 1) !== false) {
+ $classname = substr($obfuscatedProp, 1, -strlen($obfuscatedPropTail));
+ if ($classname === '*') {
+ // sanity; this shouldn't be possible as protected properties were handled earlier
+ $classname = __CLASS__;
+ }
+ return $classname;
+ }
+ }
+ return false;
+ }
+}
diff --git a/inc/Draft.php b/inc/Draft.php
new file mode 100644
index 000000000..f80016c8d
--- /dev/null
+++ b/inc/Draft.php
@@ -0,0 +1,165 @@
+<?php
+
+namespace dokuwiki;
+
+/**
+ * Class Draft
+ *
+ * @package dokuwiki
+ */
+class Draft
+{
+
+ protected $errors = [];
+ protected $cname;
+ protected $id;
+ protected $client;
+
+ /**
+ * Draft constructor.
+ *
+ * @param string $ID the page id for this draft
+ * @param string $client the client identification (username or ip or similar) for this draft
+ */
+ public function __construct($ID, $client)
+ {
+ $this->id = $ID;
+ $this->client = $client;
+ $this->cname = getCacheName($client.$ID, '.draft');
+ if(file_exists($this->cname) && file_exists(wikiFN($ID))) {
+ if (filemtime($this->cname) < filemtime(wikiFN($ID))) {
+ // remove stale draft
+ $this->deleteDraft();
+ }
+ }
+ }
+
+ /**
+ * Get the filename for this draft (whether or not it exists)
+ *
+ * @return string
+ */
+ public function getDraftFilename()
+ {
+ return $this->cname;
+ }
+
+ /**
+ * Checks if this draft exists on the filesystem
+ *
+ * @return bool
+ */
+ public function isDraftAvailable()
+ {
+ return file_exists($this->cname);
+ }
+
+ /**
+ * Save a draft of a current edit session
+ *
+ * The draft will not be saved if
+ * - drafts are deactivated in the config
+ * - or the editarea is empty and there are no event handlers registered
+ * - or the event is prevented
+ *
+ * @triggers DRAFT_SAVE
+ *
+ * @return bool whether has the draft been saved
+ */
+ public function saveDraft()
+ {
+ global $INPUT, $INFO, $EVENT_HANDLER, $conf;
+ if (!$conf['usedraft']) {
+ return false;
+ }
+ if (!$INPUT->post->has('wikitext') &&
+ !$EVENT_HANDLER->hasHandlerForEvent('DRAFT_SAVE')) {
+ return false;
+ }
+ $draft = [
+ 'id' => $this->id,
+ 'prefix' => substr($INPUT->post->str('prefix'), 0, -1),
+ 'text' => $INPUT->post->str('wikitext'),
+ 'suffix' => $INPUT->post->str('suffix'),
+ 'date' => $INPUT->post->int('date'),
+ 'client' => $this->client,
+ 'cname' => $this->cname,
+ 'errors' => [],
+ ];
+ $event = new Extension\Event('DRAFT_SAVE', $draft);
+ if ($event->advise_before()) {
+ $draft['hasBeenSaved'] = io_saveFile($draft['cname'], serialize($draft));
+ if ($draft['hasBeenSaved']) {
+ $INFO['draft'] = $draft['cname'];
+ }
+ } else {
+ $draft['hasBeenSaved'] = false;
+ }
+ $event->advise_after();
+
+ $this->errors = $draft['errors'];
+
+ return $draft['hasBeenSaved'];
+ }
+
+ /**
+ * Get the text from the draft file
+ *
+ * @throws \RuntimeException if the draft file doesn't exist
+ *
+ * @return string
+ */
+ public function getDraftText()
+ {
+ if (!file_exists($this->cname)) {
+ throw new \RuntimeException(
+ "Draft for page $this->id and user $this->client doesn't exist at $this->cname."
+ );
+ }
+ $draft = unserialize(io_readFile($this->cname,false));
+ return cleanText(con($draft['prefix'],$draft['text'],$draft['suffix'],true));
+ }
+
+ /**
+ * Remove the draft from the filesystem
+ *
+ * Also sets $INFO['draft'] to null
+ */
+ public function deleteDraft()
+ {
+ global $INFO;
+ @unlink($this->cname);
+ $INFO['draft'] = null;
+ }
+
+ /**
+ * Get a formatted message stating when the draft was saved
+ *
+ * @return string
+ */
+ public function getDraftMessage()
+ {
+ global $lang;
+ return $lang['draftdate'] . ' ' . dformat(filemtime($this->cname));
+ }
+
+ /**
+ * Retrieve the errors that occured when saving the draft
+ *
+ * @return array
+ */
+ public function getErrors()
+ {
+ return $this->errors;
+ }
+
+ /**
+ * Get the timestamp when this draft was saved
+ *
+ * @return int
+ */
+ public function getDraftDate()
+ {
+ return filemtime($this->cname);
+ }
+}
diff --git a/inc/Extension/ActionPlugin.php b/inc/Extension/ActionPlugin.php
new file mode 100644
index 000000000..ed6d82038
--- /dev/null
+++ b/inc/Extension/ActionPlugin.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace dokuwiki\Extension;
+
+/**
+ * Action Plugin Prototype
+ *
+ * Handles action hooks within a plugin
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ */
+abstract class ActionPlugin extends Plugin
+{
+
+ /**
+ * Registers a callback function for a given event
+ *
+ * @param \Doku_Event_Handler $controller
+ */
+ abstract public function register(\Doku_Event_Handler $controller);
+}
diff --git a/inc/Extension/AdminPlugin.php b/inc/Extension/AdminPlugin.php
new file mode 100644
index 000000000..7900a1ec4
--- /dev/null
+++ b/inc/Extension/AdminPlugin.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace dokuwiki\Extension;
+
+/**
+ * Admin Plugin Prototype
+ *
+ * Implements an admin interface in a plugin
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ */
+abstract class AdminPlugin extends Plugin
+{
+
+ /**
+ * Return the text that is displayed at the main admin menu
+ * (Default localized language string 'menu' is returned, override this function for setting another name)
+ *
+ * @param string $language language code
+ * @return string menu string
+ */
+ public function getMenuText($language)
+ {
+ $menutext = $this->getLang('menu');
+ if (!$menutext) {
+ $info = $this->getInfo();
+ $menutext = $info['name'] . ' ...';
+ }
+ return $menutext;
+ }
+
+ /**
+ * Return the path to the icon being displayed in the main admin menu.
+ * By default it tries to find an 'admin.svg' file in the plugin directory.
+ * (Override this function for setting another image)
+ *
+ * Important: you have to return a single path, monochrome SVG icon! It has to be
+ * under 2 Kilobytes!
+ *
+ * We recommend icons from https://materialdesignicons.com/ or to use a matching
+ * style.
+ *
+ * @return string full path to the icon file
+ */
+ public function getMenuIcon()
+ {
+ $plugin = $this->getPluginName();
+ return DOKU_PLUGIN . $plugin . '/admin.svg';
+ }
+
+ /**
+ * Determine position in list in admin window
+ * Lower values are sorted up
+ *
+ * @return int
+ */
+ public function getMenuSort()
+ {
+ return 1000;
+ }
+
+ /**
+ * Carry out required processing
+ */
+ public function handle()
+ {
+ // some plugins might not need this
+ }
+
+ /**
+ * Output html of the admin page
+ */
+ abstract public function html();
+
+ /**
+ * Checks if access should be granted to this admin plugin
+ *
+ * @return bool true if the current user may access this admin plugin
+ */
+ public function isAccessibleByCurrentUser() {
+ $data = [];
+ $data['instance'] = $this;
+ $data['hasAccess'] = false;
+
+ $event = new Event('ADMINPLUGIN_ACCESS_CHECK', $data);
+ if($event->advise_before()) {
+ if ($this->forAdminOnly()) {
+ $data['hasAccess'] = auth_isadmin();
+ } else {
+ $data['hasAccess'] = auth_ismanager();
+ }
+ }
+ $event->advise_after();
+
+ return $data['hasAccess'];
+ }
+
+ /**
+ * Return true for access only by admins (config:superuser) or false if managers are allowed as well
+ *
+ * @return bool
+ */
+ public function forAdminOnly()
+ {
+ return true;
+ }
+
+ /**
+ * Return array with ToC items. Items can be created with the html_mktocitem()
+ *
+ * @see html_mktocitem()
+ * @see tpl_toc()
+ *
+ * @return array
+ */
+ public function getTOC()
+ {
+ return array();
+ }
+
+}
+
diff --git a/inc/Extension/AuthPlugin.php b/inc/Extension/AuthPlugin.php
new file mode 100644
index 000000000..4b75fba95
--- /dev/null
+++ b/inc/Extension/AuthPlugin.php
@@ -0,0 +1,461 @@
+<?php
+
+namespace dokuwiki\Extension;
+
+/**
+ * Auth Plugin Prototype
+ *
+ * allows to authenticate users in a plugin
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @author Jan Schumann <js@jschumann-it.com>
+ */
+abstract class AuthPlugin extends Plugin
+{
+ public $success = true;
+
+ /**
+ * Possible 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.
+ */
+ protected $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
+ *
+ * For future compatibility, sub classes should always include a call
+ * to parent::__constructor() in their constructors!
+ *
+ * Set $this->success to false if checks fail
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ */
+ public function __construct()
+ {
+ // the base class constructor does nothing, derived class
+ // constructors do the real work
+ }
+
+ /**
+ * Available Capabilities. [ DO NOT OVERRIDE ]
+ *
+ * For introspection/debugging
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @return array
+ */
+ public function getCapabilities()
+ {
+ return array_keys($this->cando);
+ }
+
+ /**
+ * 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>
+ * @param string $cap the capability to check
+ * @return bool
+ */
+ public 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];
+ }
+ }
+
+ /**
+ * 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 bool|null|int Result from the modification function or false if an event handler has canceled the action
+ */
+ public function triggerUserMod($type, $params)
+ {
+ $validTypes = array(
+ 'create' => 'createUser',
+ 'modify' => 'modifyUser',
+ 'delete' => 'deleteUsers',
+ );
+ if (empty($validTypes[$type])) {
+ return false;
+ }
+
+ $result = false;
+ $eventdata = array('type' => $type, 'params' => $params, 'modification_result' => null);
+ $evt = new Event('AUTH_USER_CHANGE', $eventdata);
+ if ($evt->advise_before(true)) {
+ $result = call_user_func_array(array($this, $validTypes[$type]), $evt->data['params']);
+ $evt->data['modification_result'] = $result;
+ }
+ $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>
+ */
+ public 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 (except this
+ * function returns null, in which case, DokuWiki will
+ * still run auth_login as a fallback, which may call
+ * checkPass()). If this function is not returning null,
+ * implementing checkPass() is not needed here 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,
+ * null on unknown result (fallback to checkPass)
+ */
+ public 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;
+
+ */
+ }
+
+ /**
+ * 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>
+ * @param string $user the user name
+ * @param string $pass the clear text password
+ * @return bool
+ */
+ public function checkPass($user, $pass)
+ {
+ msg("no valid authorisation system in use", -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 address of the user
+ * grps array list of groups the user is in
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $user the user name
+ * @param bool $requireGroups whether or not the returned data must include groups
+ * @return false|array containing user data or false
+ */
+ public function getUserData($user, $requireGroups = true)
+ {
+ if (!$this->cando['external']) msg("no valid authorisation system in use", -1);
+ return false;
+ }
+
+ /**
+ * 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>
+ * @param string $user
+ * @param string $pass
+ * @param string $name
+ * @param string $mail
+ * @param null|array $grps
+ * @return bool|null
+ */
+ public 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 string $user nick of the user to be changed
+ * @param array $changes array of field/value pairs to be changed (password will be clear text)
+ * @return bool
+ */
+ public function modifyUser($user, $changes)
+ {
+ msg("authorisation method does not allow modifying of user data", -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
+ */
+ public function deleteUsers($users)
+ {
+ msg("authorisation method does not allow deleting of users", -1);
+ return 0;
+ }
+
+ /**
+ * 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>
+ * @param array $filter array of field/pattern pairs, empty array for no filter
+ * @return int
+ */
+ public function getUserCount($filter = array())
+ {
+ msg("authorisation method does not provide user counts", -1);
+ return 0;
+ }
+
+ /**
+ * Bulk retrieval of user data [implement only where required/possible]
+ *
+ * Set getUsers capability when implemented
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @param int $start index of first user to be returned
+ * @param int $limit max number of users to be returned, 0 for unlimited
+ * @param array $filter array of field/pattern pairs, null for no filter
+ * @return array list of userinfo (refer getUserData for internal userinfo details)
+ */
+ public function retrieveUsers($start = 0, $limit = 0, $filter = null)
+ {
+ msg("authorisation method does not support mass retrieval of user data", -1);
+ return array();
+ }
+
+ /**
+ * Define a group [implement only where required/possible]
+ *
+ * Set addGroup capability when implemented
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @param string $group
+ * @return bool
+ */
+ public function addGroup($group)
+ {
+ msg("authorisation method does not support independent group creation", -1);
+ return false;
+ }
+
+ /**
+ * Retrieve groups [implement only where required/possible]
+ *
+ * Set getGroups capability when implemented
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @param int $start
+ * @param int $limit
+ * @return array
+ */
+ public 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
+ *
+ * @return bool
+ */
+ public function isCaseSensitive()
+ {
+ return true;
+ }
+
+ /**
+ * 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
+ * @return string the cleaned username
+ */
+ public 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
+ * @return string the cleaned groupname
+ */
+ public 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
+ */
+ public function useSessionCache($user)
+ {
+ global $conf;
+ return ($_SESSION[DOKU_COOKIE]['auth']['time'] >= @filemtime($conf['cachedir'] . '/sessionpurge'));
+ }
+}
diff --git a/inc/Extension/CLIPlugin.php b/inc/Extension/CLIPlugin.php
new file mode 100644
index 000000000..8637ccf8c
--- /dev/null
+++ b/inc/Extension/CLIPlugin.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace dokuwiki\Extension;
+
+/**
+ * CLI plugin prototype
+ *
+ * Provides DokuWiki plugin functionality on top of php-cli
+ */
+abstract class CLIPlugin extends \splitbrain\phpcli\CLI implements PluginInterface
+{
+ use PluginTrait;
+}
diff --git a/inc/Extension/Event.php b/inc/Extension/Event.php
new file mode 100644
index 000000000..32f346c72
--- /dev/null
+++ b/inc/Extension/Event.php
@@ -0,0 +1,197 @@
+<?php
+// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
+
+namespace dokuwiki\Extension;
+
+/**
+ * The Action plugin event
+ */
+class Event
+{
+ /** @var string READONLY event name, objects must register against this name to see the event */
+ public $name = '';
+ /** @var mixed|null READWRITE data relevant to the event, no standardised format, refer to event docs */
+ public $data = null;
+ /**
+ * @var mixed|null READWRITE the results of the event action, only relevant in "_AFTER" advise
+ * event handlers may modify this if they are preventing the default action
+ * to provide the after event handlers with event results
+ */
+ public $result = null;
+ /** @var bool READONLY if true, event handlers can prevent the events default action */
+ public $canPreventDefault = true;
+
+ /** @var bool whether or not to carry out the default action associated with the event */
+ protected $runDefault = true;
+ /** @var bool whether or not to continue propagating the event to other handlers */
+ protected $mayContinue = true;
+
+ /**
+ * event constructor
+ *
+ * @param string $name
+ * @param mixed $data
+ */
+ public function __construct($name, &$data)
+ {
+
+ $this->name = $name;
+ $this->data =& $data;
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->name;
+ }
+
+ /**
+ * advise all registered BEFORE handlers of this event
+ *
+ * if these methods are used by functions outside of this object, they must
+ * properly handle correct processing of any default action and issue an
+ * advise_after() signal. e.g.
+ * $evt = new dokuwiki\Plugin\Doku_Event(name, data);
+ * if ($evt->advise_before(canPreventDefault) {
+ * // default action code block
+ * }
+ * $evt->advise_after();
+ * unset($evt);
+ *
+ * @param bool $enablePreventDefault
+ * @return bool results of processing the event, usually $this->runDefault
+ */
+ public function advise_before($enablePreventDefault = true)
+ {
+ global $EVENT_HANDLER;
+
+ $this->canPreventDefault = $enablePreventDefault;
+ if ($EVENT_HANDLER !== null) {
+ $EVENT_HANDLER->process_event($this, 'BEFORE');
+ } else {
+ dbglog($this->name . ':BEFORE event triggered before event system was initialized');
+ }
+
+ return (!$enablePreventDefault || $this->runDefault);
+ }
+
+ /**
+ * advise all registered AFTER handlers of this event
+ *
+ * @param bool $enablePreventDefault
+ * @see advise_before() for details
+ */
+ public function advise_after()
+ {
+ global $EVENT_HANDLER;
+
+ $this->mayContinue = true;
+
+ if ($EVENT_HANDLER !== null) {
+ $EVENT_HANDLER->process_event($this, 'AFTER');
+ } else {
+ dbglog($this->name . ':AFTER event triggered before event system was initialized');
+ }
+ }
+
+ /**
+ * trigger
+ *
+ * - advise all registered (<event>_BEFORE) handlers that this event is about to take place
+ * - carry out the default action using $this->data based on $enablePrevent and
+ * $this->_default, all of which may have been modified by the event handlers.
+ * - advise all registered (<event>_AFTER) handlers that the event has taken place
+ *
+ * @param null|callable $action
+ * @param bool $enablePrevent
+ * @return mixed $event->results
+ * the value set by any <event>_before or <event> handlers if the default action is prevented
+ * or the results of the default action (as modified by <event>_after handlers)
+ * or NULL no action took place and no handler modified the value
+ */
+ public function trigger($action = null, $enablePrevent = true)
+ {
+
+ if (!is_callable($action)) {
+ $enablePrevent = false;
+ if ($action !== null) {
+ trigger_error(
+ 'The default action of ' . $this .
+ ' is not null but also not callable. Maybe the method is not public?',
+ E_USER_WARNING
+ );
+ }
+ }
+
+ if ($this->advise_before($enablePrevent) && is_callable($action)) {
+ $this->result = call_user_func_array($action, [&$this->data]);
+ }
+
+ $this->advise_after();
+
+ return $this->result;
+ }
+
+ /**
+ * stopPropagation
+ *
+ * stop any further processing of the event by event handlers
+ * this function does not prevent the default action taking place
+ */
+ public function stopPropagation()
+ {
+ $this->mayContinue = false;
+ }
+
+ /**
+ * may the event propagate to the next handler?
+ *
+ * @return bool
+ */
+ public function mayPropagate()
+ {
+ return $this->mayContinue;
+ }
+
+ /**
+ * preventDefault
+ *
+ * prevent the default action taking place
+ */
+ public function preventDefault()
+ {
+ $this->runDefault = false;
+ }
+
+ /**
+ * should the default action be executed?
+ *
+ * @return bool
+ */
+ public function mayRunDefault()
+ {
+ return $this->runDefault;
+ }
+
+ /**
+ * Convenience method to trigger an event
+ *
+ * Creates, triggers and destroys an event in one go
+ *
+ * @param string $name name for the event
+ * @param mixed $data event data
+ * @param callable $action (optional, default=NULL) default action, a php callback function
+ * @param bool $canPreventDefault (optional, default=true) can hooks prevent the default action
+ *
+ * @return mixed the event results value after all event processing is complete
+ * by default this is the return value of the default action however
+ * it can be set or modified by event handler hooks
+ */
+ static public function createAndTrigger($name, &$data, $action = null, $canPreventDefault = true)
+ {
+ $evt = new Event($name, $data);
+ return $evt->trigger($action, $canPreventDefault);
+ }
+}
diff --git a/inc/Extension/EventHandler.php b/inc/Extension/EventHandler.php
new file mode 100644
index 000000000..7bed0fe6f
--- /dev/null
+++ b/inc/Extension/EventHandler.php
@@ -0,0 +1,108 @@
+<?php
+// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
+
+namespace dokuwiki\Extension;
+
+/**
+ * Controls the registration and execution of all events,
+ */
+class EventHandler
+{
+
+ // public properties: none
+
+ // private properties
+ protected $hooks = array(); // array of events and their registered handlers
+
+ /**
+ * event_handler
+ *
+ * constructor, loads all action plugins and calls their register() method giving them
+ * an opportunity to register any hooks they require
+ */
+ public function __construct()
+ {
+
+ // load action plugins
+ /** @var ActionPlugin $plugin */
+ $plugin = null;
+ $pluginlist = plugin_list('action');
+
+ foreach ($pluginlist as $plugin_name) {
+ $plugin = plugin_load('action', $plugin_name);
+
+ if ($plugin !== null) $plugin->register($this);
+ }
+ }
+
+ /**
+ * register_hook
+ *
+ * register a hook for an event
+ *
+ * @param string $event string name used by the event, (incl '_before' or '_after' for triggers)
+ * @param string $advise
+ * @param object $obj object in whose scope method is to be executed,
+ * if NULL, method is assumed to be a globally available function
+ * @param string $method event handler function
+ * @param mixed $param data passed to the event handler
+ * @param int $seq sequence number for ordering hook execution (ascending)
+ */
+ public function register_hook($event, $advise, $obj, $method, $param = null, $seq = 0)
+ {
+ $seq = (int)$seq;
+ $doSort = !isset($this->hooks[$event . '_' . $advise][$seq]);
+ $this->hooks[$event . '_' . $advise][$seq][] = array($obj, $method, $param);
+
+ if ($doSort) {
+ ksort($this->hooks[$event . '_' . $advise]);
+ }
+ }
+
+ /**
+ * process the before/after event
+ *
+ * @param Event $event
+ * @param string $advise BEFORE or AFTER
+ */
+ public function process_event($event, $advise = '')
+ {
+
+ $evt_name = $event->name . ($advise ? '_' . $advise : '_BEFORE');
+
+ if (!empty($this->hooks[$evt_name])) {
+ foreach ($this->hooks[$evt_name] as $sequenced_hooks) {
+ foreach ($sequenced_hooks as $hook) {
+ list($obj, $method, $param) = $hook;
+
+ if ($obj === null) {
+ $method($event, $param);
+ } else {
+ $obj->$method($event, $param);
+ }
+
+ if (!$event->mayPropagate()) return;
+ }
+ }
+ }
+ }
+
+ /**
+ * Check if an event has any registered handlers
+ *
+ * When $advise is empty, both BEFORE and AFTER events will be considered,
+ * otherwise only the given advisory is checked
+ *
+ * @param string $name Name of the event
+ * @param string $advise BEFORE, AFTER or empty
+ * @return bool
+ */
+ public function hasHandlerForEvent($name, $advise = '')
+ {
+ if ($advise) {
+ return isset($this->hooks[$name . '_' . $advise]);
+ }
+
+ return isset($this->hooks[$name . '_BEFORE']) || isset($this->hooks[$name . '_AFTER']);
+ }
+}
diff --git a/inc/Extension/Plugin.php b/inc/Extension/Plugin.php
new file mode 100644
index 000000000..03637fe4d
--- /dev/null
+++ b/inc/Extension/Plugin.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace dokuwiki\Extension;
+
+/**
+ * DokuWiki Base Plugin
+ *
+ * Most plugin types inherit from this class
+ */
+abstract class Plugin implements PluginInterface
+{
+ use PluginTrait;
+}
diff --git a/inc/Extension/PluginController.php b/inc/Extension/PluginController.php
new file mode 100644
index 000000000..638fd3946
--- /dev/null
+++ b/inc/Extension/PluginController.php
@@ -0,0 +1,393 @@
+<?php
+
+namespace dokuwiki\Extension;
+
+/**
+ * Class to encapsulate access to dokuwiki plugins
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ */
+class PluginController
+{
+ /** @var array the types of plugins DokuWiki supports */
+ const PLUGIN_TYPES = ['auth', 'admin', 'syntax', 'action', 'renderer', 'helper', 'remote', 'cli'];
+
+ protected $listByType = [];
+ /** @var array all installed plugins and their enabled state [plugin=>enabled] */
+ protected $masterList = [];
+ protected $pluginCascade = ['default' => [], 'local' => [], 'protected' => []];
+ protected $lastLocalConfigFile = '';
+
+ /**
+ * Populates the master list of plugins
+ */
+ public function __construct()
+ {
+ $this->loadConfig();
+ $this->populateMasterList();
+ }
+
+ /**
+ * Returns a list of available plugins of given type
+ *
+ * @param $type string, plugin_type name;
+ * the type of plugin to return,
+ * use empty string for all types
+ * @param $all bool;
+ * false to only return enabled plugins,
+ * true to return both enabled and disabled plugins
+ *
+ * @return array of
+ * - plugin names when $type = ''
+ * - or plugin component names when a $type is given
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public function getList($type = '', $all = false)
+ {
+
+ // request the complete list
+ if (!$type) {
+ return $all ? array_keys($this->masterList) : array_keys(array_filter($this->masterList));
+ }
+
+ if (!isset($this->listByType[$type]['enabled'])) {
+ $this->listByType[$type]['enabled'] = $this->getListByType($type, true);
+ }
+ if ($all && !isset($this->listByType[$type]['disabled'])) {
+ $this->listByType[$type]['disabled'] = $this->getListByType($type, false);
+ }
+
+ return $all
+ ? array_merge($this->listByType[$type]['enabled'], $this->listByType[$type]['disabled'])
+ : $this->listByType[$type]['enabled'];
+ }
+
+ /**
+ * Loads the given plugin and creates an object of it
+ *
+ * @param $type string type of plugin to load
+ * @param $name string name of the plugin to load
+ * @param $new bool true to return a new instance of the plugin, false to use an already loaded instance
+ * @param $disabled bool true to load even disabled plugins
+ * @return PluginInterface|null the plugin object or null on failure
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ */
+ public function load($type, $name, $new = false, $disabled = false)
+ {
+
+ //we keep all loaded plugins available in global scope for reuse
+ global $DOKU_PLUGINS;
+
+ list($plugin, /* $component */) = $this->splitName($name);
+
+ // check if disabled
+ if (!$disabled && !$this->isEnabled($plugin)) {
+ return null;
+ }
+
+ $class = $type . '_plugin_' . $name;
+
+ //plugin already loaded?
+ if (!empty($DOKU_PLUGINS[$type][$name])) {
+ if ($new || !$DOKU_PLUGINS[$type][$name]->isSingleton()) {
+ return class_exists($class, true) ? new $class : null;
+ }
+
+ return $DOKU_PLUGINS[$type][$name];
+ }
+
+ //construct class and instantiate
+ if (!class_exists($class, true)) {
+
+ # the plugin might be in the wrong directory
+ $inf = confToHash(DOKU_PLUGIN . "$plugin/plugin.info.txt");
+ if ($inf['base'] && $inf['base'] != $plugin) {
+ 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;
+ }
+
+ $DOKU_PLUGINS[$type][$name] = new $class;
+ return $DOKU_PLUGINS[$type][$name];
+ }
+
+ /**
+ * Whether plugin is disabled
+ *
+ * @param string $plugin name of plugin
+ * @return bool true disabled, false enabled
+ * @deprecated in favor of the more sensible isEnabled where the return value matches the enabled state
+ */
+ public function isDisabled($plugin)
+ {
+ dbg_deprecated('isEnabled()');
+ return !$this->isEnabled($plugin);
+ }
+
+ /**
+ * Check whether plugin is disabled
+ *
+ * @param string $plugin name of plugin
+ * @return bool true enabled, false disabled
+ */
+ public function isEnabled($plugin)
+ {
+ return !empty($this->masterList[$plugin]);
+ }
+
+ /**
+ * Disable the plugin
+ *
+ * @param string $plugin name of plugin
+ * @return bool true saving succeed, false saving failed
+ */
+ public function disable($plugin)
+ {
+ if (array_key_exists($plugin, $this->pluginCascade['protected'])) return false;
+ $this->masterList[$plugin] = 0;
+ return $this->saveList();
+ }
+
+ /**
+ * Enable the plugin
+ *
+ * @param string $plugin name of plugin
+ * @return bool true saving succeed, false saving failed
+ */
+ public function enable($plugin)
+ {
+ if (array_key_exists($plugin, $this->pluginCascade['protected'])) return false;
+ $this->masterList[$plugin] = 1;
+ return $this->saveList();
+ }
+
+ /**
+ * Returns cascade of the config files
+ *
+ * @return array with arrays of plugin configs
+ */
+ public function getCascade()
+ {
+ return $this->pluginCascade;
+ }
+
+ /**
+ * Read all installed plugins and their current enabled state
+ */
+ protected function populateMasterList()
+ {
+ if ($dh = @opendir(DOKU_PLUGIN)) {
+ $all_plugins = array();
+ while (false !== ($plugin = readdir($dh))) {
+ if ($plugin[0] === '.') continue; // skip hidden entries
+ if (is_file(DOKU_PLUGIN . $plugin)) continue; // skip files, we're only interested in directories
+
+ if (array_key_exists($plugin, $this->masterList) && $this->masterList[$plugin] == 0) {
+ $all_plugins[$plugin] = 0;
+
+ } elseif (array_key_exists($plugin, $this->masterList) && $this->masterList[$plugin] == 1) {
+ $all_plugins[$plugin] = 1;
+ } else {
+ $all_plugins[$plugin] = 1;
+ }
+ }
+ $this->masterList = $all_plugins;
+ if (!file_exists($this->lastLocalConfigFile)) {
+ $this->saveList(true);
+ }
+ }
+ }
+
+ /**
+ * Includes the plugin config $files
+ * and returns the entries of the $plugins array set in these files
+ *
+ * @param array $files list of files to include, latter overrides previous
+ * @return array with entries of the $plugins arrays of the included files
+ */
+ protected function checkRequire($files)
+ {
+ $plugins = array();
+ foreach ($files as $file) {
+ if (file_exists($file)) {
+ include_once($file);
+ }
+ }
+ return $plugins;
+ }
+
+ /**
+ * Save the current list of plugins
+ *
+ * @param bool $forceSave ;
+ * false to save only when config changed
+ * true to always save
+ * @return bool true saving succeed, false saving failed
+ */
+ protected function saveList($forceSave = false)
+ {
+ global $conf;
+
+ if (empty($this->masterList)) return false;
+
+ // Rebuild list of local settings
+ $local_plugins = $this->rebuildLocal();
+ if ($local_plugins != $this->pluginCascade['local'] || $forceSave) {
+ $file = $this->lastLocalConfigFile;
+ $out = "<?php\n/*\n * Local plugin enable/disable settings\n" .
+ " * Auto-generated through plugin/extension manager\n *\n" .
+ " * NOTE: Plugins will not be added to this file unless there " .
+ "is a need to override a default setting. Plugins are\n" .
+ " * enabled by default.\n */\n";
+ foreach ($local_plugins as $plugin => $value) {
+ $out .= "\$plugins['$plugin'] = $value;\n";
+ }
+ // backup current file (remove any existing backup)
+ if (file_exists($file)) {
+ $backup = $file . '.bak';
+ if (file_exists($backup)) @unlink($backup);
+ if (!@copy($file, $backup)) return false;
+ if (!empty($conf['fperm'])) chmod($backup, $conf['fperm']);
+ }
+ //check if can open for writing, else restore
+ return io_saveFile($file, $out);
+ }
+ return false;
+ }
+
+ /**
+ * Rebuild the set of local plugins
+ *
+ * @return array array of plugins to be saved in end($config_cascade['plugins']['local'])
+ */
+ protected function rebuildLocal()
+ {
+ //assign to local variable to avoid overwriting
+ $backup = $this->masterList;
+ //Can't do anything about protected one so rule them out completely
+ $local_default = array_diff_key($backup, $this->pluginCascade['protected']);
+ //Diff between local+default and default
+ //gives us the ones we need to check and save
+ $diffed_ones = array_diff_key($local_default, $this->pluginCascade['default']);
+ //The ones which we are sure of (list of 0s not in default)
+ $sure_plugins = array_filter($diffed_ones, array($this, 'negate'));
+ //the ones in need of diff
+ $conflicts = array_diff_key($local_default, $diffed_ones);
+ //The final list
+ return array_merge($sure_plugins, array_diff_assoc($conflicts, $this->pluginCascade['default']));
+ }
+
+ /**
+ * Build the list of plugins and cascade
+ *
+ */
+ protected function loadConfig()
+ {
+ global $config_cascade;
+ foreach (array('default', 'protected') as $type) {
+ if (array_key_exists($type, $config_cascade['plugins'])) {
+ $this->pluginCascade[$type] = $this->checkRequire($config_cascade['plugins'][$type]);
+ }
+ }
+ $local = $config_cascade['plugins']['local'];
+ $this->lastLocalConfigFile = array_pop($local);
+ $this->pluginCascade['local'] = $this->checkRequire(array($this->lastLocalConfigFile));
+ if (is_array($local)) {
+ $this->pluginCascade['default'] = array_merge(
+ $this->pluginCascade['default'],
+ $this->checkRequire($local)
+ );
+ }
+ $this->masterList = array_merge(
+ $this->pluginCascade['default'],
+ $this->pluginCascade['local'],
+ $this->pluginCascade['protected']
+ );
+ }
+
+ /**
+ * Returns a list of available plugin components of given type
+ *
+ * @param string $type plugin_type name; the type of plugin to return,
+ * @param bool $enabled true to return enabled plugins,
+ * false to return disabled plugins
+ * @return array of plugin components of requested type
+ */
+ protected function getListByType($type, $enabled)
+ {
+ $master_list = $enabled
+ ? array_keys(array_filter($this->masterList))
+ : array_keys(array_filter($this->masterList, array($this, 'negate')));
+ $plugins = array();
+
+ foreach ($master_list as $plugin) {
+
+ if (file_exists(DOKU_PLUGIN . "$plugin/$type.php")) {
+ $plugins[] = $plugin;
+ continue;
+ }
+
+ $typedir = DOKU_PLUGIN . "$plugin/$type/";
+ if (is_dir($typedir)) {
+ if ($dp = opendir($typedir)) {
+ while (false !== ($component = readdir($dp))) {
+ if (strpos($component, '.') === 0 || strtolower(substr($component, -4)) !== '.php') continue;
+ if (is_file($typedir . $component)) {
+ $plugins[] = $plugin . '_' . substr($component, 0, -4);
+ }
+ }
+ closedir($dp);
+ }
+ }
+
+ }//foreach
+
+ return $plugins;
+ }
+
+ /**
+ * Split name in a plugin name and a component name
+ *
+ * @param string $name
+ * @return array with
+ * - plugin name
+ * - and component name when available, otherwise empty string
+ */
+ protected function splitName($name)
+ {
+ if (!isset($this->masterList[$name])) {
+ return explode('_', $name, 2);
+ }
+
+ return array($name, '');
+ }
+
+ /**
+ * Returns inverse boolean value of the input
+ *
+ * @param mixed $input
+ * @return bool inversed boolean value of input
+ */
+ protected function negate($input)
+ {
+ return !(bool)$input;
+ }
+}
diff --git a/inc/PluginInterface.php b/inc/Extension/PluginInterface.php
index 608989096..f2dbe8626 100644
--- a/inc/PluginInterface.php
+++ b/inc/Extension/PluginInterface.php
@@ -1,14 +1,18 @@
<?php
+
+namespace dokuwiki\Extension;
+
/**
* DokuWiki Plugin Interface
*
* Defines the public contract all DokuWiki plugins will adhere to. The actual code
- * to do so is defined in DokuWiki_PluginTrait
+ * to do so is defined in dokuwiki\Extension\PluginTrait
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Christopher Smith <chris@jalakai.co.uk>
*/
-interface DokuWiki_PluginInterface {
+interface PluginInterface
+{
/**
* General Info
*
@@ -107,7 +111,7 @@ interface DokuWiki_PluginInterface {
*
* @param string $name name of plugin to load
* @param bool $msg if a message should be displayed in case the plugin is not available
- * @return DokuWiki_PluginInterface|null helper plugin object
+ * @return PluginInterface|null helper plugin object
*/
public function loadHelper($name, $msg = true);
diff --git a/inc/PluginTrait.php b/inc/Extension/PluginTrait.php
index 57b735e85..f1db0f598 100644
--- a/inc/PluginTrait.php
+++ b/inc/Extension/PluginTrait.php
@@ -1,10 +1,12 @@
<?php
+namespace dokuwiki\Extension;
+
/**
- * Do not inherit directly from this class, instead inherit from the specialized
- * ones in lib/plugin
+ * Provides standard DokuWiki plugin behaviour
*/
-trait DokuWiki_PluginTrait {
+trait PluginTrait
+{
protected $localised = false; // set to true by setupLocale() after loading language dependent strings
protected $lang = array(); // array to hold language dependent strings, best accessed via ->getLang()
@@ -12,12 +14,13 @@ trait DokuWiki_PluginTrait {
protected $conf = array(); // array to hold plugin settings, best accessed via ->getConf()
/**
- * @see DokuWiki_PluginInterface::getInfo()
+ * @see PluginInterface::getInfo()
*/
- public function getInfo() {
+ public function getInfo()
+ {
$parts = explode('_', get_class($this));
$info = DOKU_PLUGIN . '/' . $parts[2] . '/plugin.info.txt';
- if(file_exists($info)) return confToHash($info);
+ if (file_exists($info)) return confToHash($info);
msg(
'getInfo() not implemented in ' . get_class($this) . ' and ' . $info . ' not found.<br />' .
@@ -31,43 +34,48 @@ trait DokuWiki_PluginTrait {
}
/**
- * @see DokuWiki_PluginInterface::isSingleton()
+ * @see PluginInterface::isSingleton()
*/
- public function isSingleton() {
+ public function isSingleton()
+ {
return true;
}
/**
- * @see DokuWiki_PluginInterface::loadHelper()
+ * @see PluginInterface::loadHelper()
*/
- public function loadHelper($name, $msg = true) {
+ public function loadHelper($name, $msg = true)
+ {
$obj = plugin_load('helper', $name);
- if(is_null($obj) && $msg) msg("Helper plugin $name is not available or invalid.", -1);
+ if (is_null($obj) && $msg) msg("Helper plugin $name is not available or invalid.", -1);
return $obj;
}
// region introspection methods
/**
- * @see DokuWiki_PluginInterface::getPluginType()
+ * @see PluginInterface::getPluginType()
*/
- public function getPluginType() {
+ public function getPluginType()
+ {
list($t) = explode('_', get_class($this), 2);
return $t;
}
/**
- * @see DokuWiki_PluginInterface::getPluginName()
+ * @see PluginInterface::getPluginName()
*/
- public function getPluginName() {
+ public function getPluginName()
+ {
list(/* $t */, /* $p */, $n) = explode('_', get_class($this), 4);
return $n;
}
/**
- * @see DokuWiki_PluginInterface::getPluginComponent()
+ * @see PluginInterface::getPluginComponent()
*/
- public function getPluginComponent() {
+ public function getPluginComponent()
+ {
list(/* $t */, /* $p */, /* $n */, $c) = explode('_', get_class($this), 4);
return (isset($c) ? $c : '');
}
@@ -76,31 +84,34 @@ trait DokuWiki_PluginTrait {
// region localization methods
/**
- * @see DokuWiki_PluginInterface::getLang()
+ * @see PluginInterface::getLang()
*/
- public function getLang($id) {
- if(!$this->localised) $this->setupLocale();
+ public function getLang($id)
+ {
+ if (!$this->localised) $this->setupLocale();
return (isset($this->lang[$id]) ? $this->lang[$id] : '');
}
/**
- * @see DokuWiki_PluginInterface::locale_xhtml()
+ * @see PluginInterface::locale_xhtml()
*/
- public function locale_xhtml($id) {
+ public function locale_xhtml($id)
+ {
return p_cached_output($this->localFN($id));
}
/**
- * @see DokuWiki_PluginInterface::localFN()
+ * @see PluginInterface::localFN()
*/
- public function localFN($id, $ext = 'txt') {
+ public function localFN($id, $ext = 'txt')
+ {
global $conf;
$plugin = $this->getPluginName();
$file = DOKU_CONF . 'plugin_lang/' . $plugin . '/' . $conf['lang'] . '/' . $id . '.' . $ext;
- if(!file_exists($file)) {
+ if (!file_exists($file)) {
$file = DOKU_PLUGIN . $plugin . '/lang/' . $conf['lang'] . '/' . $id . '.' . $ext;
- if(!file_exists($file)) {
+ if (!file_exists($file)) {
//fall back to english
$file = DOKU_PLUGIN . $plugin . '/lang/en/' . $id . '.' . $ext;
}
@@ -109,10 +120,11 @@ trait DokuWiki_PluginTrait {
}
/**
- * @see DokuWiki_PluginInterface::setupLocale()
+ * @see PluginInterface::setupLocale()
*/
- public function setupLocale() {
- if($this->localised) return;
+ public function setupLocale()
+ {
+ if ($this->localised) return;
global $conf, $config_cascade; // definitely don't invoke "global $lang"
$path = DOKU_PLUGIN . $this->getPluginName() . '/lang/';
@@ -121,16 +133,16 @@ trait DokuWiki_PluginTrait {
// don't include once, in case several plugin components require the same language file
@include($path . 'en/lang.php');
- foreach($config_cascade['lang']['plugin'] as $config_file) {
- if(file_exists($config_file . $this->getPluginName() . '/en/lang.php')) {
+ foreach ($config_cascade['lang']['plugin'] as $config_file) {
+ if (file_exists($config_file . $this->getPluginName() . '/en/lang.php')) {
include($config_file . $this->getPluginName() . '/en/lang.php');
}
}
- if($conf['lang'] != 'en') {
+ if ($conf['lang'] != 'en') {
@include($path . $conf['lang'] . '/lang.php');
- foreach($config_cascade['lang']['plugin'] as $config_file) {
- if(file_exists($config_file . $this->getPluginName() . '/' . $conf['lang'] . '/lang.php')) {
+ foreach ($config_cascade['lang']['plugin'] as $config_file) {
+ if (file_exists($config_file . $this->getPluginName() . '/' . $conf['lang'] . '/lang.php')) {
include($config_file . $this->getPluginName() . '/' . $conf['lang'] . '/lang.php');
}
}
@@ -144,15 +156,16 @@ trait DokuWiki_PluginTrait {
// region configuration methods
/**
- * @see DokuWiki_PluginInterface::getConf()
+ * @see PluginInterface::getConf()
*/
- public function getConf($setting, $notset = false) {
+ public function getConf($setting, $notset = false)
+ {
- if(!$this->configloaded) {
+ if (!$this->configloaded) {
$this->loadConfig();
}
- if(isset($this->conf[$setting])) {
+ if (isset($this->conf[$setting])) {
return $this->conf[$setting];
} else {
return $notset;
@@ -160,16 +173,17 @@ trait DokuWiki_PluginTrait {
}
/**
- * @see DokuWiki_PluginInterface::loadConfig()
+ * @see PluginInterface::loadConfig()
*/
- public function loadConfig() {
+ public function loadConfig()
+ {
global $conf;
$defaults = $this->readDefaultSettings();
$plugin = $this->getPluginName();
- foreach($defaults as $key => $value) {
- if(isset($conf['plugin'][$plugin][$key])) continue;
+ foreach ($defaults as $key => $value) {
+ if (isset($conf['plugin'][$plugin][$key])) continue;
$conf['plugin'][$plugin][$key] = $value;
}
@@ -183,12 +197,13 @@ trait DokuWiki_PluginTrait {
*
* @return array setting => value
*/
- protected function readDefaultSettings() {
+ protected function readDefaultSettings()
+ {
$path = DOKU_PLUGIN . $this->getPluginName() . '/conf/';
$conf = array();
- if(file_exists($path . 'default.php')) {
+ if (file_exists($path . 'default.php')) {
include($path . 'default.php');
}
@@ -199,38 +214,41 @@ trait DokuWiki_PluginTrait {
// region output methods
/**
- * @see DokuWiki_PluginInterface::email()
+ * @see PluginInterface::email()
*/
- public function email($email, $name = '', $class = '', $more = '') {
- if(!$email) return $name;
+ public function email($email, $name = '', $class = '', $more = '')
+ {
+ if (!$email) return $name;
$email = obfuscate($email);
- if(!$name) $name = $email;
+ if (!$name) $name = $email;
$class = "class='" . ($class ? $class : 'mail') . "'";
return "<a href='mailto:$email' $class title='$email' $more>$name</a>";
}
/**
- * @see DokuWiki_PluginInterface::external_link()
+ * @see PluginInterface::external_link()
*/
- public function external_link($link, $title = '', $class = '', $target = '', $more = '') {
+ public function external_link($link, $title = '', $class = '', $target = '', $more = '')
+ {
global $conf;
$link = htmlentities($link);
- if(!$title) $title = $link;
- if(!$target) $target = $conf['target']['extern'];
- if($conf['relnofollow']) $more .= ' rel="nofollow"';
+ if (!$title) $title = $link;
+ if (!$target) $target = $conf['target']['extern'];
+ if ($conf['relnofollow']) $more .= ' rel="nofollow"';
- if($class) $class = " class='$class'";
- if($target) $target = " target='$target'";
- if($more) $more = " " . trim($more);
+ if ($class) $class = " class='$class'";
+ if ($target) $target = " target='$target'";
+ if ($more) $more = " " . trim($more);
return "<a href='$link'$class$target$more>$title</a>";
}
/**
- * @see DokuWiki_PluginInterface::render_text()
+ * @see PluginInterface::render_text()
*/
- public function render_text($text, $format = 'xhtml') {
+ public function render_text($text, $format = 'xhtml')
+ {
return p_render($format, p_get_instructions($text), $info);
}
diff --git a/inc/Extension/RemotePlugin.php b/inc/Extension/RemotePlugin.php
new file mode 100644
index 000000000..33bca980a
--- /dev/null
+++ b/inc/Extension/RemotePlugin.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace dokuwiki\Extension;
+
+use dokuwiki\Remote\Api;
+use ReflectionException;
+use ReflectionMethod;
+
+/**
+ * Remote Plugin prototype
+ *
+ * Add functionality to the remote API in a plugin
+ */
+abstract class RemotePlugin extends Plugin
+{
+
+ private $api;
+
+ /**
+ * Constructor
+ */
+ public function __construct()
+ {
+ $this->api = new Api();
+ }
+
+ /**
+ * Get all available methods with remote access.
+ *
+ * By default it exports all public methods of a remote plugin. Methods beginning
+ * with an underscore are skipped.
+ *
+ * @return array Information about all provided methods. {@see dokuwiki\Remote\RemoteAPI}.
+ * @throws ReflectionException
+ */
+ public function _getMethods()
+ {
+ $result = array();
+
+ $reflection = new \ReflectionClass($this);
+ foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
+ // skip parent methods, only methods further down are exported
+ $declaredin = $method->getDeclaringClass()->name;
+ if ($declaredin === 'dokuwiki\Extension\Plugin' || $declaredin === 'dokuwiki\Extension\RemotePlugin') {
+ continue;
+ }
+ $method_name = $method->name;
+ if (strpos($method_name, '_') === 0) {
+ continue;
+ }
+
+ // strip asterisks
+ $doc = $method->getDocComment();
+ $doc = preg_replace(
+ array('/^[ \t]*\/\*+[ \t]*/m', '/[ \t]*\*+[ \t]*/m', '/\*+\/\s*$/m', '/\s*\/\s*$/m'),
+ array('', '', '', ''),
+ $doc
+ );
+
+ // prepare data
+ $data = array();
+ $data['name'] = $method_name;
+ $data['public'] = 0;
+ $data['doc'] = $doc;
+ $data['args'] = array();
+
+ // get parameter type from doc block type hint
+ foreach ($method->getParameters() as $parameter) {
+ $name = $parameter->name;
+ $type = 'string'; // we default to string
+ if (preg_match('/^@param[ \t]+([\w|\[\]]+)[ \t]\$' . $name . '/m', $doc, $m)) {
+ $type = $this->cleanTypeHint($m[1]);
+ }
+ $data['args'][] = $type;
+ }
+
+ // get return type from doc block type hint
+ if (preg_match('/^@return[ \t]+([\w|\[\]]+)/m', $doc, $m)) {
+ $data['return'] = $this->cleanTypeHint($m[1]);
+ } else {
+ $data['return'] = 'string';
+ }
+
+ // add to result
+ $result[$method_name] = $data;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Matches the given type hint against the valid options for the remote API
+ *
+ * @param string $hint
+ * @return string
+ */
+ protected function cleanTypeHint($hint)
+ {
+ $types = explode('|', $hint);
+ foreach ($types as $t) {
+ if (substr($t, -2) === '[]') {
+ return 'array';
+ }
+ if ($t === 'boolean') {
+ return 'bool';
+ }
+ if (in_array($t, array('array', 'string', 'int', 'double', 'bool', 'null', 'date', 'file'))) {
+ return $t;
+ }
+ }
+ return 'string';
+ }
+
+ /**
+ * @return Api
+ */
+ protected function getApi()
+ {
+ return $this->api;
+ }
+
+}
diff --git a/inc/Extension/SyntaxPlugin.php b/inc/Extension/SyntaxPlugin.php
new file mode 100644
index 000000000..ea8f51b4d
--- /dev/null
+++ b/inc/Extension/SyntaxPlugin.php
@@ -0,0 +1,132 @@
+<?php
+
+namespace dokuwiki\Extension;
+
+use Doku_Handler;
+use Doku_Renderer;
+
+/**
+ * Syntax Plugin Prototype
+ *
+ * All DokuWiki plugins to extend the parser/rendering mechanism
+ * need to inherit from this class
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+abstract class SyntaxPlugin extends \dokuwiki\Parsing\ParserMode\Plugin
+{
+ use PluginTrait;
+
+ protected $allowedModesSetup = false;
+
+ /**
+ * Syntax Type
+ *
+ * Needs to return one of the mode types defined in $PARSER_MODES in Parser.php
+ *
+ * @return string
+ */
+ abstract public function getType();
+
+ /**
+ * Allowed Mode Types
+ *
+ * Defines the mode types for other dokuwiki markup that maybe nested within the
+ * plugin's own markup. Needs to return an array of one or more of the mode types
+ * defined in $PARSER_MODES in Parser.php
+ *
+ * @return array
+ */
+ public function getAllowedTypes()
+ {
+ return array();
+ }
+
+ /**
+ * Paragraph Type
+ *
+ * Defines how this syntax is handled regarding paragraphs. This is important
+ * for correct XHTML nesting. Should return one of the following:
+ *
+ * 'normal' - The plugin can be used inside paragraphs
+ * 'block' - Open paragraphs need to be closed before plugin output
+ * 'stack' - Special case. Plugin wraps other paragraphs.
+ *
+ * @see Doku_Handler_Block
+ *
+ * @return string
+ */
+ public function getPType()
+ {
+ return 'normal';
+ }
+
+ /**
+ * Handler to prepare matched data for the rendering process
+ *
+ * This function can only pass data to render() via its return value - render()
+ * may be not be run during the object's current life.
+ *
+ * Usually you should only need the $match param.
+ *
+ * @param string $match The text matched by the patterns
+ * @param int $state The lexer state for the match
+ * @param int $pos The character position of the matched text
+ * @param Doku_Handler $handler The Doku_Handler object
+ * @return bool|array Return an array with all data you want to use in render, false don't add an instruction
+ */
+ abstract public function handle($match, $state, $pos, Doku_Handler $handler);
+
+ /**
+ * Handles the actual output creation.
+ *
+ * The function must not assume any other of the classes methods have been run
+ * during the object's current life. The only reliable data it receives are its
+ * parameters.
+ *
+ * The function should always check for the given output format and return false
+ * when a format isn't supported.
+ *
+ * $renderer contains a reference to the renderer object which is
+ * currently handling the rendering. You need to use it for writing
+ * the output. How this is done depends on the renderer used (specified
+ * by $format
+ *
+ * The contents of the $data array depends on what the handler() function above
+ * created
+ *
+ * @param string $format output format being rendered
+ * @param Doku_Renderer $renderer the current renderer object
+ * @param array $data data created by handler()
+ * @return boolean rendered correctly? (however, returned value is not used at the moment)
+ */
+ abstract public function render($format, Doku_Renderer $renderer, $data);
+
+ /**
+ * There should be no need to override this function
+ *
+ * @param string $mode
+ * @return bool
+ */
+ public function accepts($mode)
+ {
+
+ if (!$this->allowedModesSetup) {
+ global $PARSER_MODES;
+
+ $allowedModeTypes = $this->getAllowedTypes();
+ foreach ($allowedModeTypes as $mt) {
+ $this->allowedModes = array_merge($this->allowedModes, $PARSER_MODES[$mt]);
+ }
+
+ $idx = array_search(substr(get_class($this), 7), (array)$this->allowedModes);
+ if ($idx !== false) {
+ unset($this->allowedModes[$idx]);
+ }
+ $this->allowedModesSetup = true;
+ }
+
+ return parent::accepts($mode);
+ }
+}
diff --git a/inc/FeedParser.php b/inc/FeedParser.php
index 39434dcaf..8f71b96bc 100644
--- a/inc/FeedParser.php
+++ b/inc/FeedParser.php
@@ -1,13 +1,5 @@
<?php
/**
- * Class used to parse RSS and ATOM feeds
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-
-if(!defined('DOKU_INC')) die('meh.');
-
-/**
* We override some methods of the original SimplePie class here
*/
class FeedParser extends SimplePie {
@@ -15,70 +7,21 @@ class FeedParser extends SimplePie {
/**
* Constructor. Set some defaults
*/
- function __construct(){
+ public function __construct(){
parent::__construct();
$this->enable_cache(false);
- $this->set_file_class('FeedParser_File');
+ $this->set_file_class(\dokuwiki\FeedParserFile::class);
}
/**
* Backward compatibility for older plugins
*
+ * phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
* @param string $url
*/
- function feed_url($url){
+ public function feed_url($url){
$this->set_feed_url($url);
}
}
-/**
- * Fetch an URL using our own HTTPClient
- *
- * Replaces SimplePie's own class
- */
-class FeedParser_File extends SimplePie_File {
- var $http;
- var $useragent;
- var $success = true;
- var $headers = array();
- var $body;
- var $error;
- /** @noinspection PhpMissingParentConstructorInspection */
-
- /**
- * Inititializes the HTTPClient
- *
- * We ignore all given parameters - they are set in DokuHTTPClient
- *
- * @inheritdoc
- */
- function __construct($url, $timeout=10, $redirects=5,
- $headers=null, $useragent=null, $force_fsockopen=false, $curl_options = array()) {
- $this->http = new DokuHTTPClient();
- $this->success = $this->http->sendRequest($url);
-
- $this->headers = $this->http->resp_headers;
- $this->body = $this->http->resp_body;
- $this->error = $this->http->error;
-
- $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
-
- return $this->success;
- }
-
- /** @inheritdoc */
- function headers(){
- return $this->headers;
- }
- /** @inheritdoc */
- function body(){
- return $this->body;
- }
-
- /** @inheritdoc */
- function close(){
- return true;
- }
-
-}
diff --git a/inc/FeedParserFile.php b/inc/FeedParserFile.php
new file mode 100644
index 000000000..be3417e9b
--- /dev/null
+++ b/inc/FeedParserFile.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace dokuwiki;
+
+use dokuwiki\HTTP\DokuHTTPClient;
+
+/**
+ * Fetch an URL using our own HTTPClient
+ *
+ * Replaces SimplePie's own class
+ */
+class FeedParserFile extends \SimplePie_File
+{
+ protected $http;
+ /** @noinspection PhpMissingParentConstructorInspection */
+
+ /**
+ * Inititializes the HTTPClient
+ *
+ * We ignore all given parameters - they are set in DokuHTTPClient
+ *
+ * @inheritdoc
+ */
+ public function __construct(
+ $url,
+ $timeout = 10,
+ $redirects = 5,
+ $headers = null,
+ $useragent = null,
+ $force_fsockopen = false,
+ $curl_options = array()
+ ) {
+ $this->http = new DokuHTTPClient();
+ $this->success = $this->http->sendRequest($url);
+
+ $this->headers = $this->http->resp_headers;
+ $this->body = $this->http->resp_body;
+ $this->error = $this->http->error;
+
+ $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
+
+ return $this->success;
+ }
+
+ /** @inheritdoc */
+ public function headers()
+ {
+ return $this->headers;
+ }
+
+ /** @inheritdoc */
+ public function body()
+ {
+ return $this->body;
+ }
+
+ /** @inheritdoc */
+ public function close()
+ {
+ return true;
+ }
+}
diff --git a/inc/Form/ButtonElement.php b/inc/Form/ButtonElement.php
index e2afe9c97..4f585f0c1 100644
--- a/inc/Form/ButtonElement.php
+++ b/inc/Form/ButtonElement.php
@@ -17,7 +17,7 @@ class ButtonElement extends Element {
* @param string $name
* @param string $content HTML content of the button. You have to escape it yourself.
*/
- function __construct($name, $content = '') {
+ public function __construct($name, $content = '') {
parent::__construct('button', array('name' => $name, 'value' => 1));
$this->content = $content;
}
diff --git a/inc/Form/DropdownElement.php b/inc/Form/DropdownElement.php
index 023b67dd3..51f475196 100644
--- a/inc/Form/DropdownElement.php
+++ b/inc/Form/DropdownElement.php
@@ -104,7 +104,9 @@ class DropdownElement extends InputElement {
*/
public function attr($name, $value = null) {
if(strtolower($name) == 'multiple') {
- throw new \InvalidArgumentException('Sorry, the dropdown element does not support the "multiple" attribute');
+ throw new \InvalidArgumentException(
+ 'Sorry, the dropdown element does not support the "multiple" attribute'
+ );
}
return parent::attr($name, $value);
}
@@ -181,7 +183,13 @@ class DropdownElement extends InputElement {
if($this->useInput) $this->prefillInput();
$html = '<select ' . buildAttributes($this->attrs()) . '>';
- $html = array_reduce($this->optGroups, function($html, OptGroup $optGroup) {return $html . $optGroup->toHTML();}, $html);
+ $html = array_reduce(
+ $this->optGroups,
+ function ($html, OptGroup $optGroup) {
+ return $html . $optGroup->toHTML();
+ },
+ $html
+ );
$html .= '</select>';
return $html;
diff --git a/inc/Form/Form.php b/inc/Form/Form.php
index 92bbd30f4..c741a698f 100644
--- a/inc/Form/Form.php
+++ b/inc/Form/Form.php
@@ -84,7 +84,9 @@ class Form extends Element {
/**
* Get the position of the element in the form or false if it is not in the form
*
- * Warning: This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE. Please read the section on Booleans for more information. Use the === operator for testing the return value of this function.
+ * Warning: This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates
+ * to FALSE. Please read the section on Booleans for more information. Use the === operator for testing the
+ * return value of this function.
*
* @param Element $element
*
@@ -157,7 +159,9 @@ class Form extends Element {
* @return Element
*/
public function addElement(Element $element, $pos = -1) {
- if(is_a($element, '\dokuwiki\Form\Form')) throw new \InvalidArgumentException('You can\'t add a form to a form');
+ if(is_a($element, '\dokuwiki\Form\Form')) throw new \InvalidArgumentException(
+ 'You can\'t add a form to a form'
+ );
if($pos < 0) {
$this->elements[] = $element;
} else {
@@ -173,7 +177,9 @@ class Form extends Element {
* @param int $pos 0-based position of the element to replace
*/
public function replaceElement(Element $element, $pos) {
- if(is_a($element, '\dokuwiki\Form\Form')) throw new \InvalidArgumentException('You can\'t add a form to a form');
+ if(is_a($element, '\dokuwiki\Form\Form')) throw new \InvalidArgumentException(
+ 'You can\'t add a form to a form'
+ );
array_splice($this->elements, $pos, 1, array($element));
}
diff --git a/inc/Form/LegacyForm.php b/inc/Form/LegacyForm.php
index 1b47ba204..b30c8df9a 100644
--- a/inc/Form/LegacyForm.php
+++ b/inc/Form/LegacyForm.php
@@ -116,7 +116,7 @@ class LegacyForm extends Form {
$control = array();
foreach($legacy as $key => $val) {
- if($key{0} == '_') {
+ if($key[0] == '_') {
$control[substr($key, 1)] = $val;
} elseif($key == 'name') {
$control[$key] = $val;
diff --git a/inc/Form/OptGroup.php b/inc/Form/OptGroup.php
index 791f0b3f6..40149b171 100644
--- a/inc/Form/OptGroup.php
+++ b/inc/Form/OptGroup.php
@@ -51,9 +51,13 @@ class OptGroup extends Element {
$this->options = array();
foreach($options as $key => $val) {
if (is_array($val)) {
- if (!key_exists('label', $val)) throw new \InvalidArgumentException('If option is given as array, it has to have a "label"-key!');
+ if (!key_exists('label', $val)) throw new \InvalidArgumentException(
+ 'If option is given as array, it has to have a "label"-key!'
+ );
if (key_exists('attrs', $val) && is_array($val['attrs']) && key_exists('selected', $val['attrs'])) {
- throw new \InvalidArgumentException('Please use function "DropdownElement::val()" to set the selected option');
+ throw new \InvalidArgumentException(
+ 'Please use function "DropdownElement::val()" to set the selected option'
+ );
}
$this->options[$key] = $val;
} elseif(is_int($key)) {
@@ -93,7 +97,9 @@ class OptGroup extends Element {
if (!empty($val['attrs']) && is_array($val['attrs'])) {
$attrs = buildAttributes($val['attrs']);
}
- $html .= '<option' . $selected . ' value="' . hsc($key) . '" '.$attrs.'>' . hsc($val['label']) . '</option>';
+ $html .= '<option' . $selected . ' value="' . hsc($key) . '" '.$attrs.'>';
+ $html .= hsc($val['label']);
+ $html .= '</option>';
}
return $html;
}
diff --git a/inc/HTTP/DokuHTTPClient.php b/inc/HTTP/DokuHTTPClient.php
new file mode 100644
index 000000000..b1db7e3c5
--- /dev/null
+++ b/inc/HTTP/DokuHTTPClient.php
@@ -0,0 +1,77 @@
+<?php
+
+
+namespace dokuwiki\HTTP;
+
+
+
+/**
+ * Adds DokuWiki specific configs to the HTTP client
+ *
+ * @author Andreas Goetz <cpuidle@gmx.de>
+ */
+class DokuHTTPClient extends HTTPClient {
+
+ /**
+ * Constructor.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public function __construct(){
+ global $conf;
+
+ // call parent constructor
+ parent::__construct();
+
+ // set some values from the config
+ $this->proxy_host = $conf['proxy']['host'];
+ $this->proxy_port = $conf['proxy']['port'];
+ $this->proxy_user = $conf['proxy']['user'];
+ $this->proxy_pass = conf_decodeString($conf['proxy']['pass']);
+ $this->proxy_ssl = $conf['proxy']['ssl'];
+ $this->proxy_except = $conf['proxy']['except'];
+
+ // allow enabling debugging via URL parameter (if debugging allowed)
+ if($conf['allowdebug']) {
+ if(
+ isset($_REQUEST['httpdebug']) ||
+ (
+ isset($_SERVER['HTTP_REFERER']) &&
+ strpos($_SERVER['HTTP_REFERER'], 'httpdebug') !== false
+ )
+ ) {
+ $this->debug = true;
+ }
+ }
+ }
+
+
+ /**
+ * Wraps an event around the parent function
+ *
+ * @triggers HTTPCLIENT_REQUEST_SEND
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ /**
+ * @param string $url
+ * @param string|array $data the post data either as array or raw data
+ * @param string $method
+ * @return bool
+ */
+ public function sendRequest($url,$data='',$method='GET'){
+ $httpdata = array('url' => $url,
+ 'data' => $data,
+ 'method' => $method);
+ $evt = new \Doku_Event('HTTPCLIENT_REQUEST_SEND',$httpdata);
+ if($evt->advise_before()){
+ $url = $httpdata['url'];
+ $data = $httpdata['data'];
+ $method = $httpdata['method'];
+ }
+ $evt->advise_after();
+ unset($evt);
+ return parent::sendRequest($url,$data,$method);
+ }
+
+}
+
diff --git a/inc/HTTPClient.php b/inc/HTTP/HTTPClient.php
index e20b7d98f..99129219a 100644
--- a/inc/HTTPClient.php
+++ b/inc/HTTP/HTTPClient.php
@@ -1,18 +1,9 @@
<?php
-/**
- * HTTP Client
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Andreas Goetz <cpuidle@gmx.de>
- */
+namespace dokuwiki\HTTP;
define('HTTP_NL',"\r\n");
-/**
- * Class HTTPClientException
- */
-class HTTPClientException extends Exception { }
/**
* This class implements a basic HTTP client
@@ -28,53 +19,53 @@ class HTTPClientException extends Exception { }
*/
class HTTPClient {
//set these if you like
- var $agent; // User agent
- var $http; // HTTP version defaults to 1.0
- var $timeout; // read timeout (seconds)
- var $cookies;
- var $referer;
- var $max_redirect;
- var $max_bodysize;
- var $max_bodysize_abort = true; // if set, abort if the response body is bigger than max_bodysize
- var $header_regexp; // if set this RE must match against the headers, else abort
- var $headers;
- var $debug;
- var $start = 0.0; // for timings
- var $keep_alive = true; // keep alive rocks
+ public $agent; // User agent
+ public $http; // HTTP version defaults to 1.0
+ public $timeout; // read timeout (seconds)
+ public $cookies;
+ public $referer;
+ public $max_redirect;
+ public $max_bodysize;
+ public $max_bodysize_abort = true; // if set, abort if the response body is bigger than max_bodysize
+ public $header_regexp; // if set this RE must match against the headers, else abort
+ public $headers;
+ public $debug;
+ public $start = 0.0; // for timings
+ public $keep_alive = true; // keep alive rocks
// don't set these, read on error
- var $error;
- var $redirect_count;
+ public $error;
+ public $redirect_count;
// read these after a successful request
- var $status;
- var $resp_body;
- var $resp_headers;
+ public $status;
+ public $resp_body;
+ public $resp_headers;
// set these to do basic authentication
- var $user;
- var $pass;
+ public $user;
+ public $pass;
// set these if you need to use a proxy
- var $proxy_host;
- var $proxy_port;
- var $proxy_user;
- var $proxy_pass;
- var $proxy_ssl; //boolean set to true if your proxy needs SSL
- var $proxy_except; // regexp of URLs to exclude from proxy
+ public $proxy_host;
+ public $proxy_port;
+ public $proxy_user;
+ public $proxy_pass;
+ public $proxy_ssl; //boolean set to true if your proxy needs SSL
+ public $proxy_except; // regexp of URLs to exclude from proxy
// list of kept alive connections
- static $connections = array();
+ protected static $connections = array();
// what we use as boundary on multipart/form-data posts
- var $boundary = '---DokuWikiHTTPClient--4523452351';
+ protected $boundary = '---DokuWikiHTTPClient--4523452351';
/**
* Constructor.
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function __construct(){
+ public function __construct(){
$this->agent = 'Mozilla/4.0 (compatible; DokuWiki HTTP Client; '.PHP_OS.')';
$this->timeout = 15;
$this->cookies = array();
@@ -89,7 +80,7 @@ class HTTPClient {
$this->header_regexp= '';
if(extension_loaded('zlib')) $this->headers['Accept-encoding'] = 'gzip';
$this->headers['Accept'] = 'text/xml,application/xml,application/xhtml+xml,'.
- 'text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
+ 'text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
$this->headers['Accept-Language'] = 'en-us';
}
@@ -105,7 +96,7 @@ class HTTPClient {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function get($url,$sloppy304=false){
+ public function get($url,$sloppy304=false){
if(!$this->sendRequest($url)) return false;
if($this->status == 304 && $sloppy304) return $this->resp_body;
if($this->status < 200 || $this->status > 206) return false;
@@ -127,13 +118,13 @@ class HTTPClient {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function dget($url,$data,$sloppy304=false){
+ public function dget($url,$data,$sloppy304=false){
if(strpos($url,'?')){
$url .= '&';
}else{
$url .= '?';
}
- $url .= $this->_postEncode($data);
+ $url .= $this->postEncode($data);
return $this->get($url,$sloppy304);
}
@@ -147,7 +138,7 @@ class HTTPClient {
* @return false|string response body, false on error
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function post($url,$data){
+ public function post($url,$data){
if(!$this->sendRequest($url,$data,'POST')) return false;
if($this->status < 200 || $this->status > 206) return false;
return $this->resp_body;
@@ -170,18 +161,17 @@ class HTTPClient {
* @author Andreas Goetz <cpuidle@gmx.de>
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function sendRequest($url,$data='',$method='GET'){
- $this->start = $this->_time();
+ public function sendRequest($url,$data='',$method='GET'){
+ $this->start = $this->time();
$this->error = '';
$this->status = 0;
- $this->status = 0;
$this->resp_body = '';
$this->resp_headers = array();
// don't accept gzip if truncated bodies might occur
if($this->max_bodysize &&
- !$this->max_bodysize_abort &&
- $this->headers['Accept-encoding'] == 'gzip'){
+ !$this->max_bodysize_abort &&
+ $this->headers['Accept-encoding'] == 'gzip'){
unset($this->headers['Accept-encoding']);
}
@@ -196,7 +186,7 @@ class HTTPClient {
if(isset($uri['pass'])) $this->pass = $uri['pass'];
// proxy setup
- if($this->proxy_host && (!$this->proxy_except || !preg_match('/'.$this->proxy_except.'/i',$url)) ){
+ if($this->useProxyForUrl($url)){
$request_url = $url;
$server = $this->proxy_host;
$port = $this->proxy_port;
@@ -230,13 +220,13 @@ class HTTPClient {
$headers['Content-Type'] = null;
}
switch ($headers['Content-Type']) {
- case 'multipart/form-data':
- $headers['Content-Type'] = 'multipart/form-data; boundary=' . $this->boundary;
- $data = $this->_postMultipartEncode($data);
- break;
- default:
- $headers['Content-Type'] = 'application/x-www-form-urlencoded';
- $data = $this->_postEncode($data);
+ case 'multipart/form-data':
+ $headers['Content-Type'] = 'multipart/form-data; boundary=' . $this->boundary;
+ $data = $this->postMultipartEncode($data);
+ break;
+ default:
+ $headers['Content-Type'] = 'application/x-www-form-urlencoded';
+ $data = $this->postEncode($data);
}
}
}elseif($method == 'GET'){
@@ -256,15 +246,15 @@ class HTTPClient {
}
// already connected?
- $connectionId = $this->_uniqueConnectionId($server,$port);
- $this->_debug('connection pool', self::$connections);
+ $connectionId = $this->uniqueConnectionId($server,$port);
+ $this->debug('connection pool', self::$connections);
$socket = null;
if (isset(self::$connections[$connectionId])) {
- $this->_debug('reusing connection', $connectionId);
+ $this->debug('reusing connection', $connectionId);
$socket = self::$connections[$connectionId];
}
if (is_null($socket) || feof($socket)) {
- $this->_debug('opening connection', $connectionId);
+ $this->debug('opening connection', $connectionId);
// open socket
$socket = @fsockopen($server,$port,$errno, $errstr, $this->timeout);
if (!$socket){
@@ -275,7 +265,7 @@ class HTTPClient {
// try establish a CONNECT tunnel for SSL
try {
- if($this->_ssltunnel($socket, $request_url)){
+ if($this->ssltunnel($socket, $request_url)){
// no keep alive for tunnels
$this->keep_alive = false;
// tunnel is authed already
@@ -296,7 +286,7 @@ class HTTPClient {
}
}
- if ($this->keep_alive && !$this->proxy_host) {
+ if ($this->keep_alive && !$this->useProxyForUrl($request_url)) {
// RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive
// connection token to a proxy server. We still do keep the connection the
// proxy alive (well except for CONNECT tunnels)
@@ -311,22 +301,22 @@ class HTTPClient {
// build request
$request = "$method $request_url HTTP/".$this->http.HTTP_NL;
- $request .= $this->_buildHeaders($headers);
- $request .= $this->_getCookies();
+ $request .= $this->buildHeaders($headers);
+ $request .= $this->getCookies();
$request .= HTTP_NL;
$request .= $data;
- $this->_debug('request',$request);
- $this->_sendData($socket, $request, 'request');
+ $this->debug('request',$request);
+ $this->sendData($socket, $request, 'request');
// read headers from socket
$r_headers = '';
do{
- $r_line = $this->_readLine($socket, 'headers');
+ $r_line = $this->readLine($socket, 'headers');
$r_headers .= $r_line;
}while($r_line != "\r\n" && $r_line != "\n");
- $this->_debug('response headers',$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)){
@@ -345,7 +335,7 @@ class HTTPClient {
$this->status = $m[2];
// handle headers and cookies
- $this->resp_headers = $this->_parseHeaders($r_headers);
+ $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);
@@ -361,7 +351,7 @@ class HTTPClient {
}
}
- $this->_debug('Object headers',$this->resp_headers);
+ $this->debug('Object headers',$this->resp_headers);
// check server status code to follow redirect
if($this->status == 301 || $this->status == 302 ){
@@ -381,10 +371,10 @@ class HTTPClient {
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'];
+ dirname($uri['path']).'/'.$this->resp_headers['location'];
}else{
$this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
- $this->resp_headers['location'];
+ $this->resp_headers['location'];
}
}
// perform redirected request, always via GET (required by RFC)
@@ -398,18 +388,25 @@ class HTTPClient {
//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')){
+ 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 {
$chunk_size = '';
- while (preg_match('/^[a-zA-Z0-9]?$/',$byte=$this->_readData($socket,1,'chunk'))){
+ 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');
}
- $this->_readLine($socket, 'chunk'); // readtrailing \n
+ $this->readLine($socket, 'chunk'); // readtrailing \n
$chunk_size = hexdec($chunk_size);
if($this->max_bodysize && $chunk_size+strlen($r_body) > $this->max_bodysize){
@@ -421,8 +418,8 @@ class HTTPClient {
}
if ($chunk_size > 0) {
- $r_body .= $this->_readData($socket, $chunk_size, 'chunk');
- $this->_readData($socket, 2, 'chunk'); // read trailing \r\n
+ $r_body .= $this->readData($socket, $chunk_size, 'chunk');
+ $this->readData($socket, 2, 'chunk'); // read trailing \r\n
}
} while ($chunk_size && !$abort);
}elseif(isset($this->resp_headers['content-length']) && !isset($this->resp_headers['transfer-encoding'])){
@@ -433,25 +430,29 @@ class HTTPClient {
// read up to the content-length or max_bodysize
// for keep alive we need to read the whole message to clean up the socket for the next read
- if(!$this->keep_alive && $this->max_bodysize && $this->max_bodysize < $this->resp_headers['content-length']){
- $length = $this->max_bodysize;
+ if(
+ !$this->keep_alive &&
+ $this->max_bodysize &&
+ $this->max_bodysize < $this->resp_headers['content-length']
+ ) {
+ $length = $this->max_bodysize + 1;
}else{
$length = $this->resp_headers['content-length'];
}
- $r_body = $this->_readData($socket, $length, 'response (content-length limited)', true);
+ $r_body = $this->readData($socket, $length, 'response (content-length limited)', true);
}elseif( !isset($this->resp_headers['transfer-encoding']) && $this->max_bodysize && !$this->keep_alive){
- $r_body = $this->_readData($socket, $this->max_bodysize, 'response (content-length limited)', true);
+ $r_body = $this->readData($socket, $this->max_bodysize+1, 'response (content-length limited)', true);
} elseif ((int)$this->status === 204) {
// request has no content
} else{
// read entire socket
while (!feof($socket)) {
- $r_body .= $this->_readData($socket, 4096, 'response (unlimited)', true);
+ $r_body .= $this->readData($socket, 4096, 'response (unlimited)', true);
}
}
- // recheck body size, we might had to read the whole body, so we abort late or trim here
+ // recheck body size, we might have read max_bodysize+1 or even the whole body, so we abort late here
if($this->max_bodysize){
if(strlen($r_body) > $this->max_bodysize){
if ($this->max_bodysize_abort) {
@@ -472,7 +473,7 @@ class HTTPClient {
}
if (!$this->keep_alive ||
- (isset($this->resp_headers['connection']) && $this->resp_headers['connection'] == 'Close')) {
+ (isset($this->resp_headers['connection']) && $this->resp_headers['connection'] == 'Close')) {
// close socket
fclose($socket);
unset(self::$connections[$connectionId]);
@@ -480,8 +481,8 @@ class HTTPClient {
// decode gzip if needed
if(isset($this->resp_headers['content-encoding']) &&
- $this->resp_headers['content-encoding'] == 'gzip' &&
- strlen($r_body) > 10 && substr($r_body,0,3)=="\x1f\x8b\x08"){
+ $this->resp_headers['content-encoding'] == 'gzip' &&
+ strlen($r_body) > 10 && substr($r_body,0,3)=="\x1f\x8b\x08"){
$this->resp_body = @gzinflate(substr($r_body, 10));
if($this->resp_body === false){
$this->error = 'Failed to decompress gzip encoded content';
@@ -491,7 +492,7 @@ class HTTPClient {
$this->resp_body = $r_body;
}
- $this->_debug('response body',$this->resp_body);
+ $this->debug('response body',$this->resp_body);
$this->redirect_count = 0;
return true;
}
@@ -506,8 +507,8 @@ class HTTPClient {
* @throws HTTPClientException when a tunnel is needed but could not be established
* @return bool true if a tunnel was established
*/
- function _ssltunnel(&$socket, &$requesturl){
- if(!$this->proxy_host) return false;
+ protected function ssltunnel(&$socket, &$requesturl){
+ if(!$this->useProxyForUrl($requesturl)) return false;
$requestinfo = parse_url($requesturl);
if($requestinfo['scheme'] != 'https') return false;
if(!$requestinfo['port']) $requestinfo['port'] = 443;
@@ -520,17 +521,17 @@ class HTTPClient {
}
$request .= HTTP_NL;
- $this->_debug('SSL Tunnel CONNECT',$request);
- $this->_sendData($socket, $request, 'SSL Tunnel CONNECT');
+ $this->debug('SSL Tunnel CONNECT',$request);
+ $this->sendData($socket, $request, 'SSL Tunnel CONNECT');
// read headers from socket
$r_headers = '';
do{
- $r_line = $this->_readLine($socket, 'headers');
+ $r_line = $this->readLine($socket, 'headers');
$r_headers .= $r_line;
}while($r_line != "\r\n" && $r_line != "\n");
- $this->_debug('SSL Tunnel Response',$r_headers);
+ $this->debug('SSL Tunnel Response',$r_headers);
if(preg_match('/^HTTP\/1\.[01] 200/i',$r_headers)){
// set correct peer name for verification (enabled since PHP 5.6)
stream_context_set_option($socket, 'ssl', 'peer_name', $requestinfo['host']);
@@ -546,11 +547,13 @@ class HTTPClient {
if (@stream_socket_enable_crypto($socket, true, $cryptoMethod)) {
$requesturl = $requestinfo['path'].
- (!empty($requestinfo['query'])?'?'.$requestinfo['query']:'');
+ (!empty($requestinfo['query'])?'?'.$requestinfo['query']:'');
return true;
}
- throw new HTTPClientException('Failed to set up crypto for secure connection to '.$requestinfo['host'], -151);
+ throw new HTTPClientException(
+ 'Failed to set up crypto for secure connection to '.$requestinfo['host'], -151
+ );
}
throw new HTTPClientException('Failed to establish secure proxy connection', -150);
@@ -566,13 +569,13 @@ class HTTPClient {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function _sendData($socket, $data, $message) {
+ protected function sendData($socket, $data, $message) {
// send request
$towrite = strlen($data);
$written = 0;
while($written < $towrite){
// check timeout
- $time_used = $this->_time() - $this->start;
+ $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))
@@ -584,8 +587,8 @@ class HTTPClient {
$sel_e = null;
// wait for stream ready or timeout (1sec)
if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
- usleep(1000);
- continue;
+ usleep(1000);
+ continue;
}
// write to stream
@@ -611,17 +614,17 @@ class HTTPClient {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function _readData($socket, $nbytes, $message, $ignore_eof = false) {
+ protected function readData($socket, $nbytes, $message, $ignore_eof = false) {
$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;
+ $time_used = $this->time() - $this->start;
if ($time_used > $this->timeout)
throw new HTTPClientException(
- sprintf('Timeout while reading %s after %d bytes (%.3fs)', $message,
- strlen($r_data), $time_used), -100);
+ sprintf('Timeout while reading %s after %d bytes (%.3fs)', $message,
+ strlen($r_data), $time_used), -100);
if(feof($socket)) {
if(!$ignore_eof)
throw new HTTPClientException("Premature End of File (socket) while reading $message");
@@ -635,8 +638,8 @@ class HTTPClient {
$sel_e = null;
// wait for stream ready or timeout (1sec)
if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
- usleep(1000);
- continue;
+ usleep(1000);
+ continue;
}
$bytes = fread($socket, $to_read);
@@ -661,14 +664,14 @@ class HTTPClient {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function _readLine($socket, $message) {
+ protected function readLine($socket, $message) {
$r_data = '';
do {
- $time_used = $this->_time() - $this->start;
+ $time_used = $this->time() - $this->start;
if ($time_used > $this->timeout)
throw new HTTPClientException(
- sprintf('Timeout while reading %s (%.3fs) >%s<', $message, $time_used, $r_data),
- -100);
+ sprintf('Timeout while reading %s (%.3fs) >%s<', $message, $time_used, $r_data),
+ -100);
if(feof($socket))
throw new HTTPClientException("Premature End of File (socket) while reading $message");
@@ -678,8 +681,8 @@ class HTTPClient {
$sel_e = null;
// wait for stream ready or timeout (1sec)
if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
- usleep(1000);
- continue;
+ usleep(1000);
+ continue;
}
$r_data = fgets($socket, 1024);
@@ -697,12 +700,12 @@ class HTTPClient {
* @param string $info
* @param mixed $var
*/
- function _debug($info,$var=null){
+ protected function debug($info,$var=null){
if(!$this->debug) return;
if(php_sapi_name() == 'cli'){
- $this->_debug_text($info, $var);
+ $this->debugText($info, $var);
}else{
- $this->_debug_html($info, $var);
+ $this->debugHtml($info, $var);
}
}
@@ -712,8 +715,8 @@ class HTTPClient {
* @param string $info
* @param mixed $var
*/
- function _debug_html($info, $var=null){
- print '<b>'.$info.'</b> '.($this->_time() - $this->start).'s<br />';
+ protected function debugHtml($info, $var=null){
+ print '<b>'.$info.'</b> '.($this->time() - $this->start).'s<br />';
if(!is_null($var)){
ob_start();
print_r($var);
@@ -729,8 +732,8 @@ class HTTPClient {
* @param string $info
* @param mixed $var
*/
- function _debug_text($info, $var=null){
- print '*'.$info.'* '.($this->_time() - $this->start)."s\n";
+ protected function debugText($info, $var=null){
+ print '*'.$info.'* '.($this->time() - $this->start)."s\n";
if(!is_null($var)) print_r($var);
print "\n-----------------------------------------------\n";
}
@@ -740,7 +743,7 @@ class HTTPClient {
*
* @return float
*/
- static function _time(){
+ protected static function time(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
@@ -755,7 +758,7 @@ class HTTPClient {
* @param string $string
* @return array
*/
- function _parseHeaders($string){
+ protected function parseHeaders($string){
$headers = array();
$lines = explode("\n",$string);
array_shift($lines); //skip first line (status)
@@ -786,7 +789,7 @@ class HTTPClient {
* @param array $headers
* @return string
*/
- function _buildHeaders($headers){
+ protected function buildHeaders($headers){
$string = '';
foreach($headers as $key => $value){
if($value === '') continue;
@@ -802,7 +805,7 @@ class HTTPClient {
*
* @return string
*/
- function _getCookies(){
+ protected function getCookies(){
$headers = '';
foreach ($this->cookies as $key => $val){
$headers .= "$key=$val; ";
@@ -820,7 +823,7 @@ class HTTPClient {
* @param array $data
* @return string
*/
- function _postEncode($data){
+ protected function postEncode($data){
return http_build_query($data,'','&');
}
@@ -833,7 +836,7 @@ class HTTPClient {
* @param array $data
* @return string
*/
- function _postMultipartEncode($data){
+ protected function postMultipartEncode($data){
$boundary = '--'.$this->boundary;
$out = '';
foreach($data as $key => $val){
@@ -864,80 +867,19 @@ class HTTPClient {
* @param string $port
* @return string unique identifier
*/
- function _uniqueConnectionId($server, $port) {
+ protected function uniqueConnectionId($server, $port) {
return "$server:$port";
}
-}
-
-
-/**
- * Adds DokuWiki specific configs to the HTTP client
- *
- * @author Andreas Goetz <cpuidle@gmx.de>
- */
-class DokuHTTPClient extends HTTPClient {
/**
- * Constructor.
+ * Should the Proxy be used for the given URL?
*
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- function __construct(){
- global $conf;
-
- // call parent constructor
- parent::__construct();
-
- // set some values from the config
- $this->proxy_host = $conf['proxy']['host'];
- $this->proxy_port = $conf['proxy']['port'];
- $this->proxy_user = $conf['proxy']['user'];
- $this->proxy_pass = conf_decodeString($conf['proxy']['pass']);
- $this->proxy_ssl = $conf['proxy']['ssl'];
- $this->proxy_except = $conf['proxy']['except'];
-
- // allow enabling debugging via URL parameter (if debugging allowed)
- if($conf['allowdebug']) {
- if(
- isset($_REQUEST['httpdebug']) ||
- (
- isset($_SERVER['HTTP_REFERER']) &&
- strpos($_SERVER['HTTP_REFERER'], 'httpdebug') !== false
- )
- ) {
- $this->debug = true;
- }
- }
- }
-
-
- /**
- * Wraps an event around the parent function
+ * Checks the exceptions
*
- * @triggers HTTPCLIENT_REQUEST_SEND
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- /**
* @param string $url
- * @param string|array $data the post data either as array or raw data
- * @param string $method
* @return bool
*/
- function sendRequest($url,$data='',$method='GET'){
- $httpdata = array('url' => $url,
- 'data' => $data,
- 'method' => $method);
- $evt = new Doku_Event('HTTPCLIENT_REQUEST_SEND',$httpdata);
- if($evt->advise_before()){
- $url = $httpdata['url'];
- $data = $httpdata['data'];
- $method = $httpdata['method'];
- }
- $evt->advise_after();
- unset($evt);
- return parent::sendRequest($url,$data,$method);
+ protected function useProxyForUrl($url) {
+ return $this->proxy_host && (!$this->proxy_except || !preg_match('/' . $this->proxy_except . '/i', $url));
}
-
}
-
-//Setup VIM: ex: et ts=4 :
diff --git a/inc/HTTP/HTTPClientException.php b/inc/HTTP/HTTPClientException.php
new file mode 100644
index 000000000..5b8f4eeca
--- /dev/null
+++ b/inc/HTTP/HTTPClientException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace dokuwiki\HTTP;
+
+use Exception;
+
+class HTTPClientException extends Exception
+{
+
+}
diff --git a/inc/IXR_Library.php b/inc/IXR_Library.php
index 5ae1402b9..bb1655f10 100644
--- a/inc/IXR_Library.php
+++ b/inc/IXR_Library.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\HTTP\DokuHTTPClient;
+
/**
* IXR - The Incutio XML-RPC Library
*
@@ -820,6 +822,7 @@ EOD;
*/
class IXR_Date {
+ const XMLRPC_ISO8601 = "Ymd\TH:i:sO" ;
/** @var DateTime */
protected $date;
@@ -859,7 +862,7 @@ class IXR_Date {
* @return string
*/
public function getIso() {
- return $this->date->format(DateTime::ISO8601);
+ return $this->date->format(self::XMLRPC_ISO8601);
}
/**
diff --git a/inc/Input.class.php b/inc/Input.class.php
deleted file mode 100644
index 199994d8d..000000000
--- a/inc/Input.class.php
+++ /dev/null
@@ -1,335 +0,0 @@
-<?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;
- /** @var ServerInput Access $_SERVER parameters */
- public $server;
-
- protected $access;
-
- /**
- * @var Callable
- */
- protected $filter;
-
- /**
- * Intilizes the Input class and it subcomponents
- */
- function __construct() {
- $this->access = &$_REQUEST;
- $this->post = new PostInput();
- $this->get = new GetInput();
- $this->server = new ServerInput();
- }
-
- /**
- * Apply the set filter to the given value
- *
- * @param string $data
- * @return string
- */
- protected function applyfilter($data){
- if(!$this->filter) return $data;
- return call_user_func($this->filter, $data);
- }
-
- /**
- * Return a filtered copy of the input object
- *
- * Expects a callable that accepts one string parameter and returns a filtered string
- *
- * @param Callable|string $filter
- * @return Input
- */
- public function filter($filter='stripctl'){
- $this->filter = $filter;
- $clone = clone $this;
- $this->filter = '';
- return $clone;
- }
-
- /**
- * 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
- */
- 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;
- $value = $this->applyfilter($this->access[$name]);
- if($nonempty && empty($value)) return $default;
- return $value;
- }
-
- /**
- * 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 (reference)
- */
- 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 int $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;
- $value = $this->applyfilter($this->access[$name]);
- if($value === '') return $default;
- if($nonempty && empty($value)) return $default;
-
- return (int) $value;
- }
-
- /**
- * Access a request parameter as string
- *
- * @param string $name Parameter name
- * @param string $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;
- $value = $this->applyfilter($this->access[$name]);
- if($nonempty && empty($value)) return $default;
-
- return (string) $value;
- }
-
- /**
- * Access a request parameter and make sure it is has a valid value
- *
- * Please note that comparisons to the valid values are not done typesafe (request vars
- * are always strings) however the function will return the correct type from the $valids
- * array when an match was found.
- *
- * @param string $name Parameter name
- * @param array $valids Array of valid values
- * @param mixed $default Default to return if parameter isn't set or not valid
- * @return null|mixed
- */
- public function valid($name, $valids, $default = null) {
- if(!isset($this->access[$name])) return $default;
- if(is_array($this->access[$name])) return $default; // we don't allow arrays
- $value = $this->applyfilter($this->access[$name]);
- $found = array_search($value, $valids);
- if($found !== false) return $valids[$found]; // return the valid value for type safety
- return $default;
- }
-
- /**
- * 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;
- $value = $this->applyfilter($this->access[$name]);
- if($value === '') return $default;
- if($nonempty && empty($value)) return $default;
-
- return (bool) $value;
- }
-
- /**
- * 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 string $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;
- }
-}
-
-/**
- * Internal class used for $_SERVER access in Input class
- */
-class ServerInput extends Input {
- protected $access;
-
- /**
- * Initialize the $access array, remove subclass members
- */
- function __construct() {
- $this->access = &$_SERVER;
- }
-
-}
diff --git a/inc/Input/Get.php b/inc/Input/Get.php
new file mode 100644
index 000000000..99ab2655d
--- /dev/null
+++ b/inc/Input/Get.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace dokuwiki\Input;
+
+/**
+ * Internal class used for $_GET access in dokuwiki\Input\Input class
+ */
+class Get extends Input
+{
+ /** @noinspection PhpMissingParentConstructorInspection
+ * Initialize the $access array, remove subclass members
+ */
+ public 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/Input/Input.php b/inc/Input/Input.php
new file mode 100644
index 000000000..3d2426bcc
--- /dev/null
+++ b/inc/Input/Input.php
@@ -0,0 +1,287 @@
+<?php
+
+namespace dokuwiki\Input;
+
+/**
+ * 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 Post Access $_POST parameters */
+ public $post;
+ /** @var Get Access $_GET parameters */
+ public $get;
+ /** @var Server Access $_SERVER parameters */
+ public $server;
+
+ protected $access;
+
+ /**
+ * @var Callable
+ */
+ protected $filter;
+
+ /**
+ * Intilizes the dokuwiki\Input\Input class and it subcomponents
+ */
+ public function __construct()
+ {
+ $this->access = &$_REQUEST;
+ $this->post = new Post();
+ $this->get = new Get();
+ $this->server = new Server();
+ }
+
+ /**
+ * Apply the set filter to the given value
+ *
+ * @param string $data
+ * @return string
+ */
+ protected function applyfilter($data)
+ {
+ if (!$this->filter) return $data;
+ return call_user_func($this->filter, $data);
+ }
+
+ /**
+ * Return a filtered copy of the input object
+ *
+ * Expects a callable that accepts one string parameter and returns a filtered string
+ *
+ * @param Callable|string $filter
+ * @return Input
+ */
+ public function filter($filter = 'stripctl')
+ {
+ $this->filter = $filter;
+ $clone = clone $this;
+ $this->filter = '';
+ return $clone;
+ }
+
+ /**
+ * 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
+ */
+ 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;
+ $value = $this->applyfilter($this->access[$name]);
+ if ($nonempty && empty($value)) return $default;
+ return $value;
+ }
+
+ /**
+ * 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 (reference)
+ */
+ 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 int $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;
+ $value = $this->applyfilter($this->access[$name]);
+ if ($value === '') return $default;
+ if ($nonempty && empty($value)) return $default;
+
+ return (int)$value;
+ }
+
+ /**
+ * Access a request parameter as string
+ *
+ * @param string $name Parameter name
+ * @param string $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;
+ $value = $this->applyfilter($this->access[$name]);
+ if ($nonempty && empty($value)) return $default;
+
+ return (string)$value;
+ }
+
+ /**
+ * Access a request parameter and make sure it is has a valid value
+ *
+ * Please note that comparisons to the valid values are not done typesafe (request vars
+ * are always strings) however the function will return the correct type from the $valids
+ * array when an match was found.
+ *
+ * @param string $name Parameter name
+ * @param array $valids Array of valid values
+ * @param mixed $default Default to return if parameter isn't set or not valid
+ * @return null|mixed
+ */
+ public function valid($name, $valids, $default = null)
+ {
+ if (!isset($this->access[$name])) return $default;
+ if (is_array($this->access[$name])) return $default; // we don't allow arrays
+ $value = $this->applyfilter($this->access[$name]);
+ $found = array_search($value, $valids);
+ if ($found !== false) return $valids[$found]; // return the valid value for type safety
+ return $default;
+ }
+
+ /**
+ * 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;
+ $value = $this->applyfilter($this->access[$name]);
+ if ($value === '') return $default;
+ if ($nonempty && empty($value)) return $default;
+
+ return (bool)$value;
+ }
+
+ /**
+ * 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 string $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;
+ }
+}
diff --git a/inc/Input/Post.php b/inc/Input/Post.php
new file mode 100644
index 000000000..137cd72f4
--- /dev/null
+++ b/inc/Input/Post.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace dokuwiki\Input;
+
+/**
+ * Internal class used for $_POST access in dokuwiki\Input\Input class
+ */
+class Post extends Input
+{
+
+ /** @noinspection PhpMissingParentConstructorInspection
+ * Initialize the $access array, remove subclass members
+ */
+ public 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;
+ }
+}
diff --git a/inc/Input/Server.php b/inc/Input/Server.php
new file mode 100644
index 000000000..60964fd8f
--- /dev/null
+++ b/inc/Input/Server.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace dokuwiki\Input;
+
+/**
+ * Internal class used for $_SERVER access in dokuwiki\Input\Input class
+ */
+class Server extends Input
+{
+
+ /** @noinspection PhpMissingParentConstructorInspection
+ * Initialize the $access array, remove subclass members
+ */
+ public function __construct()
+ {
+ $this->access = &$_SERVER;
+ }
+
+}
diff --git a/inc/JSON.php b/inc/JSON.php
deleted file mode 100644
index fe4ca5cef..000000000
--- a/inc/JSON.php
+++ /dev/null
@@ -1,656 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * Converts to and from JSON format.
- *
- * JSON (JavaScript Object Notation) is a lightweight data-interchange
- * format. It is easy for humans to read and write. It is easy for machines
- * to parse and generate. It is based on a subset of the JavaScript
- * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
- * This feature can also be found in Python. JSON is a text format that is
- * completely language independent but uses conventions that are familiar
- * to programmers of the C-family of languages, including C, C++, C#, Java,
- * JavaScript, Perl, TCL, and many others. These properties make JSON an
- * ideal data-interchange language.
- *
- * This package provides a simple encoder and decoder for JSON notation. It
- * is intended for use with client-side Javascript applications that make
- * use of HTTPRequest to perform server communication functions - data can
- * be encoded into JSON notation for use in a client-side javascript, or
- * decoded from incoming Javascript requests. JSON format is native to
- * Javascript, and can be directly eval()'ed with no further parsing
- * overhead
- *
- * All strings should be in ASCII or UTF-8 format!
- *
- * PHP versions 4 and 5
- *
- * LICENSE: Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met: Redistributions of source code must retain the
- * above copyright notice, this list of conditions and the following
- * disclaimer. Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
- * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * @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.freebsd.org/copyright/freebsd-license.html
- * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198
- */
-
-// for DokuWiki
-if(!defined('DOKU_INC')) die('meh.');
-
-/**
- * Marker constant for JSON::decode(), used to flag stack state
- */
-define('JSON_SLICE', 1);
-
-/**
- * Marker constant for JSON::decode(), used to flag stack state
- */
-define('JSON_IN_STR', 2);
-
-/**
- * Marker constant for JSON::decode(), used to flag stack state
- */
-define('JSON_IN_ARR', 4);
-
-/**
- * Marker constant for JSON::decode(), used to flag stack state
- */
-define('JSON_IN_OBJ', 8);
-
-/**
- * Marker constant for JSON::decode(), used to flag stack state
- */
-define('JSON_IN_CMT', 16);
-
-/**
- * Behavior switch for JSON::decode()
- */
-define('JSON_LOOSE_TYPE', 10);
-
-/**
- * Behavior switch for JSON::decode()
- */
-define('JSON_STRICT_TYPE', 11);
-
-/**
- * Converts to and from JSON format.
- */
-class JSON {
-
- /**
- * Disables the use of PHP5's native json_decode()
- *
- * You shouldn't change this usually because the native function is much
- * faster. However, this non-native will also parse slightly broken JSON
- * which might be handy when talking to a non-conform endpoint
- */
- public $skipnative = false;
-
- /**
- * constructs a new JSON instance
- *
- * @param int $use object behavior: when encoding or decoding,
- * be loose or strict about object/array usage
- *
- * possible values:
- * JSON_STRICT_TYPE - strict typing, default
- * "{...}" syntax creates objects in decode.
- * JSON_LOOSE_TYPE - loose typing
- * "{...}" syntax creates associative arrays in decode.
- */
- function __construct($use=JSON_STRICT_TYPE) {
- $this->use = $use;
- }
-
- /**
- * encodes an arbitrary variable into JSON format
- * If available the native PHP JSON implementation is used.
- *
- * @param mixed $var any number, boolean, string, array, or object to be encoded.
- * see argument 1 to JSON() above for array-parsing behavior.
- * if var is a strng, note that encode() always expects it
- * to be in ASCII or UTF-8 format!
- *
- * @return string JSON string representation of input var
- * @access public
- */
- function encode($var) {
- if (!$this->skipnative && function_exists('json_encode')){
- return json_encode($var);
- }
- switch (gettype($var)) {
- case 'boolean':
- return $var ? 'true' : 'false';
-
- case 'NULL':
- return 'null';
-
- case 'integer':
- return sprintf('%d', $var);
-
- case 'double':
- case 'float':
- return sprintf('%f', $var);
-
- case 'string':
- // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
- $ascii = '';
- $strlen_var = strlen($var);
-
- /*
- * Iterate over every character in the string,
- * escaping with a slash or encoding to UTF-8 where necessary
- */
- for ($c = 0; $c < $strlen_var; ++$c) {
-
- $ord_var_c = ord($var{$c});
-
- switch ($ord_var_c) {
- case 0x08:
- $ascii .= '\b';
- break;
- case 0x09:
- $ascii .= '\t';
- break;
- case 0x0A:
- $ascii .= '\n';
- break;
- case 0x0C:
- $ascii .= '\f';
- break;
- case 0x0D:
- $ascii .= '\r';
- break;
-
- case 0x22:
- case 0x2F:
- case 0x5C:
- // double quote, slash, slosh
- $ascii .= '\\'.$var{$c};
- break;
-
- case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
- // characters U-00000000 - U-0000007F (same as ASCII)
- $ascii .= $var{$c};
- break;
-
- case (($ord_var_c & 0xE0) == 0xC0):
- // characters U-00000080 - U-000007FF, mask 110XXXXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c, ord($var{$c+1}));
- $c+=1;
- //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
- $utf16 = utf8_to_utf16be($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
-
- case (($ord_var_c & 0xF0) == 0xE0):
- // characters U-00000800 - U-0000FFFF, mask 1110XXXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c+1}),
- ord($var{$c+2}));
- $c+=2;
- //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
- $utf16 = utf8_to_utf16be($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
-
- case (($ord_var_c & 0xF8) == 0xF0):
- // characters U-00010000 - U-001FFFFF, mask 11110XXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c+1}),
- ord($var{$c+2}),
- ord($var{$c+3}));
- $c+=3;
- //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
- $utf16 = utf8_to_utf16be($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
-
- case (($ord_var_c & 0xFC) == 0xF8):
- // characters U-00200000 - U-03FFFFFF, mask 111110XX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c+1}),
- ord($var{$c+2}),
- ord($var{$c+3}),
- ord($var{$c+4}));
- $c+=4;
- //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
- $utf16 = utf8_to_utf16be($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
-
- case (($ord_var_c & 0xFE) == 0xFC):
- // characters U-04000000 - U-7FFFFFFF, mask 1111110X
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c+1}),
- ord($var{$c+2}),
- ord($var{$c+3}),
- ord($var{$c+4}),
- ord($var{$c+5}));
- $c+=5;
- //$utf16 = mb_convert_encoding($char, 'UTF-16', 'UTF-8');
- $utf16 = utf8_to_utf16be($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
- }
- }
-
- return '"'.$ascii.'"';
-
- case 'array':
- /*
- * As per JSON spec if any array key is not an integer
- * we must treat the the whole array as an object. We
- * also try to catch a sparsely populated associative
- * array with numeric keys here because some JS engines
- * will create an array with empty indexes up to
- * max_index which can cause memory issues and because
- * the keys, which may be relevant, will be remapped
- * otherwise.
- *
- * As per the ECMA and JSON specification an object may
- * have any string as a property. Unfortunately due to
- * a hole in the ECMA specification if the key is a
- * ECMA reserved word or starts with a digit the
- * parameter is only accessible using ECMAScript's
- * bracket notation.
- */
-
- // treat as a JSON object
- if (is_array($var) && count($var) && (array_keys($var) !== range(0, count($var) - 1))) {
- return sprintf('{%s}', join(',', array_map(array($this, 'name_value'),
- array_keys($var),
- array_values($var))));
- }
-
- // treat it like a regular array
- return sprintf('[%s]', join(',', array_map(array($this, 'encode'), $var)));
-
- case 'object':
- $vars = get_object_vars($var);
- return sprintf('{%s}', join(',', array_map(array($this, 'name_value'),
- array_keys($vars),
- array_values($vars))));
-
- default:
- return '';
- }
- }
-
- /**
- * encodes an arbitrary variable into JSON format, alias for encode()
- *
- * @param mixed $var
- *
- * @return string
- */
- function enc($var) {
- return $this->encode($var);
- }
-
- /** function name_value
- * array-walking function for use in generating JSON-formatted name-value pairs
- *
- * @param string $name name of key to use
- * @param mixed $value reference to an array element to be encoded
- *
- * @return string JSON-formatted name-value pair, like '"name":value'
- * @access private
- */
- function name_value($name, $value) {
- return (sprintf("%s:%s", $this->encode(strval($name)), $this->encode($value)));
- }
-
- /**
- * reduce a string by removing leading and trailing comments and whitespace
- *
- * @param $str string string value to strip of comments and whitespace
- *
- * @return string string value stripped of comments and whitespace
- * @access private
- */
- function reduce_string($str) {
- $str = preg_replace(array(
-
- // eliminate single line comments in '// ...' form
- '#^\s*//(.+)$#m',
-
- // eliminate multi-line comments in '/* ... */' form, at start of string
- '#^\s*/\*(.+)\*/#Us',
-
- // eliminate multi-line comments in '/* ... */' form, at end of string
- '#/\*(.+)\*/\s*$#Us'
-
- ), '', $str);
-
- // eliminate extraneous space
- return trim($str);
- }
-
- /**
- * decodes a JSON string into appropriate variable
- * If available the native PHP JSON implementation is used.
- *
- * @param string $str JSON-formatted string
- *
- * @return mixed number, boolean, string, array, or object
- * corresponding to given JSON input string.
- * See argument 1 to JSON() above for object-output behavior.
- * Note that decode() always returns strings
- * in ASCII or UTF-8 format!
- * @access public
- */
- function decode($str) {
- if (!$this->skipnative && function_exists('json_decode')){
- return json_decode($str,($this->use == JSON_LOOSE_TYPE));
- }
-
- $str = $this->reduce_string($str);
-
- switch (strtolower($str)) {
- case 'true':
- return true;
-
- case 'false':
- return false;
-
- case 'null':
- return null;
-
- default:
- if (is_numeric($str)) {
- // Lookie-loo, it's a number
-
- // This would work on its own, but I'm trying to be
- // good about returning integers where appropriate:
- // return (float)$str;
-
- // Return float or int, as appropriate
- return ((float)$str == (integer)$str)
- ? (integer)$str
- : (float)$str;
-
- } elseif (preg_match('/^("|\').+("|\')$/s', $str, $m) && $m[1] == $m[2]) {
- // STRINGS RETURNED IN UTF-8 FORMAT
- $delim = substr($str, 0, 1);
- $chrs = substr($str, 1, -1);
- $utf8 = '';
- $strlen_chrs = strlen($chrs);
-
- for ($c = 0; $c < $strlen_chrs; ++$c) {
-
- $substr_chrs_c_2 = substr($chrs, $c, 2);
- $ord_chrs_c = ord($chrs{$c});
-
- switch ($substr_chrs_c_2) {
- case '\b':
- $utf8 .= chr(0x08);
- $c+=1;
- break;
- case '\t':
- $utf8 .= chr(0x09);
- $c+=1;
- break;
- case '\n':
- $utf8 .= chr(0x0A);
- $c+=1;
- break;
- case '\f':
- $utf8 .= chr(0x0C);
- $c+=1;
- break;
- case '\r':
- $utf8 .= chr(0x0D);
- $c+=1;
- break;
-
- case '\\"':
- case '\\\'':
- case '\\\\':
- case '\\/':
- if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
- ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
- $utf8 .= $chrs{++$c};
- }
- break;
-
- default:
- if (preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6))) {
- // single, escaped unicode character
- $utf16 = chr(hexdec(substr($chrs, ($c+2), 2)))
- . chr(hexdec(substr($chrs, ($c+4), 2)));
- //$utf8 .= mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
- $utf8 .= utf16be_to_utf8($utf16);
- $c+=5;
-
- } elseif(($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F)) {
- $utf8 .= $chrs{$c};
-
- } elseif(($ord_chrs_c & 0xE0) == 0xC0) {
- // characters U-00000080 - U-000007FF, mask 110XXXXX
- //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $utf8 .= substr($chrs, $c, 2);
- $c += 1;
-
- } elseif(($ord_chrs_c & 0xF0) == 0xE0) {
- // characters U-00000800 - U-0000FFFF, mask 1110XXXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $utf8 .= substr($chrs, $c, 3);
- $c += 2;
-
- } elseif(($ord_chrs_c & 0xF8) == 0xF0) {
- // characters U-00010000 - U-001FFFFF, mask 11110XXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $utf8 .= substr($chrs, $c, 4);
- $c += 3;
-
- } elseif(($ord_chrs_c & 0xFC) == 0xF8) {
- // characters U-00200000 - U-03FFFFFF, mask 111110XX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $utf8 .= substr($chrs, $c, 5);
- $c += 4;
-
- } elseif(($ord_chrs_c & 0xFE) == 0xFC) {
- // characters U-04000000 - U-7FFFFFFF, mask 1111110X
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $utf8 .= substr($chrs, $c, 6);
- $c += 5;
-
- }
- break;
-
- }
-
- }
-
- return $utf8;
-
- } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
- // array, or object notation
-
- if ($str{0} == '[') {
- $stk = array(JSON_IN_ARR);
- $arr = array();
- } else {
- if ($this->use == JSON_LOOSE_TYPE) {
- $stk = array(JSON_IN_OBJ);
- $obj = array();
- } else {
- $stk = array(JSON_IN_OBJ);
- $obj = new stdClass();
- }
- }
-
- array_push($stk, array('what' => JSON_SLICE,
- 'where' => 0,
- 'delim' => false));
-
- $chrs = substr($str, 1, -1);
- $chrs = $this->reduce_string($chrs);
-
- if ($chrs == '') {
- if (reset($stk) == JSON_IN_ARR) {
- return $arr;
-
- } else {
- return $obj;
-
- }
- }
-
- //print("\nparsing {$chrs}\n");
-
- $strlen_chrs = strlen($chrs);
-
- for ($c = 0; $c <= $strlen_chrs; ++$c) {
-
- $top = end($stk);
- $substr_chrs_c_2 = substr($chrs, $c, 2);
-
- if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == JSON_SLICE))) {
- // found a comma that is not inside a string, array, etc.,
- // OR we've reached the end of the character list
- $slice = substr($chrs, $top['where'], ($c - $top['where']));
- array_push($stk, array('what' => JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
- //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
- if (reset($stk) == JSON_IN_ARR) {
- // we are in an array, so just push an element onto the stack
- array_push($arr, $this->decode($slice));
-
- } elseif (reset($stk) == JSON_IN_OBJ) {
- // we are in an object, so figure
- // out the property name and set an
- // element in an associative array,
- // for now
- if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
- // "name":value pair
- $key = $this->decode($parts[1]);
- $val = $this->decode($parts[2]);
-
- if ($this->use == JSON_LOOSE_TYPE) {
- $obj[$key] = $val;
- } else {
- $obj->$key = $val;
- }
- } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
- // name:value pair, where name is unquoted
- $key = $parts[1];
- $val = $this->decode($parts[2]);
-
- if ($this->use == JSON_LOOSE_TYPE) {
- $obj[$key] = $val;
- } else {
- $obj->$key = $val;
- }
- }
-
- }
-
- } 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) &&
- ((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");
-
- } elseif (($chrs{$c} == '[') &&
- in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
- // found a left-bracket, and we are in an array, object, or slice
- array_push($stk, array('what' => JSON_IN_ARR, 'where' => $c, 'delim' => false));
- //print("Found start of array at {$c}\n");
-
- } elseif (($chrs{$c} == ']') && ($top['what'] == JSON_IN_ARR)) {
- // found a right-bracket, and we're in an array
- array_pop($stk);
- //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
- } elseif (($chrs{$c} == '{') &&
- in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
- // found a left-brace, and we are in an array, object, or slice
- array_push($stk, array('what' => JSON_IN_OBJ, 'where' => $c, 'delim' => false));
- //print("Found start of object at {$c}\n");
-
- } elseif (($chrs{$c} == '}') && ($top['what'] == JSON_IN_OBJ)) {
- // found a right-brace, and we're in an object
- array_pop($stk);
- //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
- } elseif (($substr_chrs_c_2 == '/*') &&
- in_array($top['what'], array(JSON_SLICE, JSON_IN_ARR, JSON_IN_OBJ))) {
- // found a comment start, and we are in an array, object, or slice
- array_push($stk, array('what' => JSON_IN_CMT, 'where' => $c, 'delim' => false));
- $c++;
- //print("Found start of comment at {$c}\n");
-
- } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == JSON_IN_CMT)) {
- // found a comment end, and we're in one now
- array_pop($stk);
- $c++;
-
- for ($i = $top['where']; $i <= $c; ++$i)
- $chrs = substr_replace($chrs, ' ', $i, 1);
-
- //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
- }
-
- }
-
- if (reset($stk) == JSON_IN_ARR) {
- return $arr;
-
- } elseif (reset($stk) == JSON_IN_OBJ) {
- return $obj;
-
- }
-
- }
- }
- }
-
- /**
- * decodes a JSON string into appropriate variable; alias for decode()
- *
- * @param string $var
- *
- * @return mixed
- */
- function dec($var) {
- return $this->decode($var);
- }
-}
-
diff --git a/inc/JpegMeta.php b/inc/JpegMeta.php
index 94c276cfa..9ed1e2db4 100644
--- a/inc/JpegMeta.php
+++ b/inc/JpegMeta.php
@@ -414,7 +414,7 @@ class JpegMeta {
// make sure datetimes are in correct format
if(strlen($field) >= 8 && strtolower(substr($field, 0, 8)) == 'datetime') {
- if(strlen($value) < 8 || $value{4} != ':' || $value{7} != ':') {
+ if(strlen($value) < 8 || $value[4] != ':' || $value[7] != ':') {
$value = date('Y:m:d H:i:s', strtotime($value));
}
}
@@ -649,8 +649,8 @@ class JpegMeta {
$dates['ExifDateTime'] = $this->_info['exif']['DateTime'];
$aux = $this->_info['exif']['DateTime'];
- $aux{4} = "-";
- $aux{7} = "-";
+ $aux[4] = "-";
+ $aux[7] = "-";
$t = strtotime($aux);
if ($t && $t > $latestTime) {
@@ -668,8 +668,8 @@ class JpegMeta {
$dates['ExifDateTimeOriginal'] = $this->_info['exif']['DateTime'];
$aux = $this->_info['exif']['DateTimeOriginal'];
- $aux{4} = "-";
- $aux{7} = "-";
+ $aux[4] = "-";
+ $aux[7] = "-";
$t = strtotime($aux);
if ($t && $t > $latestTime) {
@@ -687,8 +687,8 @@ class JpegMeta {
$dates['ExifDateTimeDigitized'] = $this->_info['exif']['DateTime'];
$aux = $this->_info['exif']['DateTimeDigitized'];
- $aux{4} = "-";
- $aux{7} = "-";
+ $aux[4] = "-";
+ $aux[7] = "-";
$t = strtotime($aux);
if ($t && $t > $latestTime) {
@@ -1302,7 +1302,7 @@ class JpegMeta {
function _parseFileInfo() {
if (file_exists($this->_fileName) && is_file($this->_fileName)) {
$this->_info['file'] = array();
- $this->_info['file']['Name'] = utf8_decodeFN(utf8_basename($this->_fileName));
+ $this->_info['file']['Name'] = utf8_decodeFN(\dokuwiki\Utf8\PhpString::basename($this->_fileName));
$this->_info['file']['Path'] = fullpath($this->_fileName);
$this->_info['file']['Size'] = filesize($this->_fileName);
if ($this->_info['file']['Size'] < 1024) {
@@ -1393,7 +1393,7 @@ class JpegMeta {
}
} else {
$this->_info['file'] = array();
- $this->_info['file']['Name'] = utf8_basename($this->_fileName);
+ $this->_info['file']['Name'] = \dokuwiki\Utf8\PhpString::basename($this->_fileName);
$this->_info['file']['Url'] = $this->_fileName;
}
@@ -2402,7 +2402,7 @@ class JpegMeta {
$pos += 1;
$header = '';
for ($i = 0; $i < $strlen; $i++) {
- $header .= $data{$pos + $i};
+ $header .= $data[$pos + $i];
}
$pos += $strlen + 1 - ($strlen % 2); // The string is padded to even length, counting the length byte itself
@@ -2699,8 +2699,8 @@ class JpegMeta {
$tags[0x8827] = 'ISOSpeedRatings';
$tags[0x8828] = 'OECF';
$tags[0x9000] = 'EXIFVersion';
- $tags[0x9003] = 'DatetimeOriginal';
- $tags[0x9004] = 'DatetimeDigitized';
+ $tags[0x9003] = 'DateTimeOriginal';
+ $tags[0x9004] = 'DateTimeDigitized';
$tags[0x9101] = 'ComponentsConfiguration';
$tags[0x9102] = 'CompressedBitsPerPixel';
$tags[0x9201] = 'ShutterSpeedValue';
@@ -2849,8 +2849,8 @@ class JpegMeta {
$tags[0x8827] = array(3, 0); // ISOSpeedRatings -> SHORT, Any
$tags[0x8828] = array(7, 0); // OECF -> UNDEFINED, Any
$tags[0x9000] = array(7, 4); // EXIFVersion -> UNDEFINED, 4
- $tags[0x9003] = array(2, 20); // DatetimeOriginal -> ASCII, 20
- $tags[0x9004] = array(2, 20); // DatetimeDigitized -> ASCII, 20
+ $tags[0x9003] = array(2, 20); // DateTimeOriginal -> ASCII, 20
+ $tags[0x9004] = array(2, 20); // DateTimeDigitized -> ASCII, 20
$tags[0x9101] = array(7, 4); // ComponentsConfiguration -> UNDEFINED, 4
$tags[0x9102] = array(5, 1); // CompressedBitsPerPixel -> RATIONAL, 1
$tags[0x9201] = array(10, 1); // ShutterSpeedValue -> SRATIONAL, 1
@@ -2983,7 +2983,7 @@ class JpegMeta {
* @return int
*/
function _getByte(&$data, $pos) {
- return ord($data{$pos});
+ return ord($data[$pos]);
}
/*************************************************************/
@@ -2999,7 +2999,7 @@ class JpegMeta {
function _putByte(&$data, $pos, $val) {
$val = intval($val);
- $data{$pos} = chr($val);
+ $data[$pos] = chr($val);
return $pos + 1;
}
@@ -3007,11 +3007,11 @@ class JpegMeta {
/*************************************************************/
function _getShort(&$data, $pos, $bigEndian = true) {
if ($bigEndian) {
- return (ord($data{$pos}) << 8)
- + ord($data{$pos + 1});
+ return (ord($data[$pos]) << 8)
+ + ord($data[$pos + 1]);
} else {
- return ord($data{$pos})
- + (ord($data{$pos + 1}) << 8);
+ return ord($data[$pos])
+ + (ord($data[$pos + 1]) << 8);
}
}
@@ -3020,11 +3020,11 @@ class JpegMeta {
$val = intval($val);
if ($bigEndian) {
- $data{$pos + 0} = chr(($val & 0x0000FF00) >> 8);
- $data{$pos + 1} = chr(($val & 0x000000FF) >> 0);
+ $data[$pos + 0] = chr(($val & 0x0000FF00) >> 8);
+ $data[$pos + 1] = chr(($val & 0x000000FF) >> 0);
} else {
- $data{$pos + 0} = chr(($val & 0x00FF) >> 0);
- $data{$pos + 1} = chr(($val & 0xFF00) >> 8);
+ $data[$pos + 0] = chr(($val & 0x00FF) >> 0);
+ $data[$pos + 1] = chr(($val & 0xFF00) >> 8);
}
return $pos + 2;
@@ -3042,15 +3042,15 @@ class JpegMeta {
*/
function _getLong(&$data, $pos, $bigEndian = true) {
if ($bigEndian) {
- return (ord($data{$pos}) << 24)
- + (ord($data{$pos + 1}) << 16)
- + (ord($data{$pos + 2}) << 8)
- + ord($data{$pos + 3});
+ return (ord($data[$pos]) << 24)
+ + (ord($data[$pos + 1]) << 16)
+ + (ord($data[$pos + 2]) << 8)
+ + ord($data[$pos + 3]);
} else {
- return ord($data{$pos})
- + (ord($data{$pos + 1}) << 8)
- + (ord($data{$pos + 2}) << 16)
- + (ord($data{$pos + 3}) << 24);
+ return ord($data[$pos])
+ + (ord($data[$pos + 1]) << 8)
+ + (ord($data[$pos + 2]) << 16)
+ + (ord($data[$pos + 3]) << 24);
}
}
@@ -3069,15 +3069,15 @@ class JpegMeta {
$val = intval($val);
if ($bigEndian) {
- $data{$pos + 0} = chr(($val & 0xFF000000) >> 24);
- $data{$pos + 1} = chr(($val & 0x00FF0000) >> 16);
- $data{$pos + 2} = chr(($val & 0x0000FF00) >> 8);
- $data{$pos + 3} = chr(($val & 0x000000FF) >> 0);
+ $data[$pos + 0] = chr(($val & 0xFF000000) >> 24);
+ $data[$pos + 1] = chr(($val & 0x00FF0000) >> 16);
+ $data[$pos + 2] = chr(($val & 0x0000FF00) >> 8);
+ $data[$pos + 3] = chr(($val & 0x000000FF) >> 0);
} else {
- $data{$pos + 0} = chr(($val & 0x000000FF) >> 0);
- $data{$pos + 1} = chr(($val & 0x0000FF00) >> 8);
- $data{$pos + 2} = chr(($val & 0x00FF0000) >> 16);
- $data{$pos + 3} = chr(($val & 0xFF000000) >> 24);
+ $data[$pos + 0] = chr(($val & 0x000000FF) >> 0);
+ $data[$pos + 1] = chr(($val & 0x0000FF00) >> 8);
+ $data[$pos + 2] = chr(($val & 0x00FF0000) >> 16);
+ $data[$pos + 3] = chr(($val & 0xFF000000) >> 24);
}
return $pos + 4;
@@ -3089,10 +3089,10 @@ class JpegMeta {
$max = strlen($data);
while ($pos < $max) {
- if (ord($data{$pos}) == 0) {
+ if (ord($data[$pos]) == 0) {
return $str;
} else {
- $str .= $data{$pos};
+ $str .= $data[$pos];
}
$pos++;
}
@@ -3114,7 +3114,7 @@ class JpegMeta {
function _putString(&$data, $pos, &$str) {
$len = strlen($str);
for ($i = 0; $i < $len; $i++) {
- $data{$pos + $i} = $str{$i};
+ $data[$pos + $i] = $str[$i];
}
return $pos + $len;
@@ -3138,7 +3138,7 @@ class JpegMeta {
echo sprintf('%04d', $count) . ': ';
}
- $c = ord($data{$start});
+ $c = ord($data[$start]);
$count++;
$start++;
diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php
index 7968ce9fc..dd6cbd3eb 100644
--- a/inc/Mailer.class.php
+++ b/inc/Mailer.class.php
@@ -9,6 +9,8 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
+use dokuwiki\Extension\Event;
+
// end of line for mail lines - RFC822 says CRLF but postfix (and other MTAs?)
// think different
if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL', "\n");
@@ -43,12 +45,12 @@ class Mailer {
global $INPUT;
$server = parse_url(DOKU_URL, PHP_URL_HOST);
- if(strpos($server,'.') === false) $server = $server.'.localhost';
+ if(strpos($server,'.') === false) $server .= '.localhost';
- $this->partid = substr(md5(uniqid(rand(), true)),0, 8).'@'.$server;
- $this->boundary = '__________'.md5(uniqid(rand(), true));
+ $this->partid = substr(md5(uniqid(mt_rand(), true)),0, 8).'@'.$server;
+ $this->boundary = '__________'.md5(uniqid(mt_rand(), true));
- $listid = join('.', array_reverse(explode('/', DOKU_BASE))).$server;
+ $listid = implode('.', array_reverse(explode('/', DOKU_BASE))).$server;
$listid = strtolower(trim($listid, '.'));
$this->allowhtml = (bool)$conf['htmlmail'];
@@ -78,7 +80,7 @@ class Mailer {
*/
public function attachFile($path, $mime, $name = '', $embed = '') {
if(!$name) {
- $name = utf8_basename($path);
+ $name = \dokuwiki\Utf8\PhpString::basename($path);
}
$this->attach[] = array(
@@ -117,7 +119,7 @@ class Mailer {
* @param array $matches
* @return string placeholder
*/
- protected function autoembed_cb($matches) {
+ protected function autoEmbedCallBack($matches) {
static $embeds = 0;
$embeds++;
@@ -186,7 +188,7 @@ class Mailer {
*
* @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, null to use $textrep (with urls wrapped in <a> tags)
+ * @param array $htmlrep replacements to apply on the HTML part, null to use $textrep (urls wrapped in <a> tags)
* @param string $html the HTML body, leave null to create it from $text
* @param bool $wrap wrap the HTML in the default header/Footer
*/
@@ -196,17 +198,17 @@ class Mailer {
$textrep = (array)$textrep;
// create HTML from text if not given
- if(is_null($html)) {
+ if($html === null) {
$html = $text;
$html = hsc($html);
$html = preg_replace('/^----+$/m', '<hr >', $html);
$html = nl2br($html);
}
if($wrap) {
- $wrap = rawLocale('mailwrap', 'html');
+ $wrapper = rawLocale('mailwrap', 'html');
$html = preg_replace('/\n-- <br \/>.*$/s', '', $html); //strip signature
$html = str_replace('@EMAILSIGNATURE@', '', $html); //strip @EMAILSIGNATURE@
- $html = str_replace('@HTMLBODY@', $html, $wrap);
+ $html = str_replace('@HTMLBODY@', $html, $wrapper);
}
if(strpos($text, '@EMAILSIGNATURE@') === false) {
@@ -226,7 +228,7 @@ class Mailer {
// embed media from templates
$html = preg_replace_callback(
'/@MEDIA\(([^\)]+)\)@/',
- array($this, 'autoembed_cb'), $html
+ array($this, 'autoEmbedCallBack'), $html
);
// add default token replacements
@@ -322,13 +324,36 @@ class Mailer {
}
/**
+ * Return a clean name which can be safely used in mail address
+ * fields. That means the name will be enclosed in '"' if it includes
+ * a '"' or a ','. Also a '"' will be escaped as '\"'.
+ *
+ * @param string $name the name to clean-up
+ * @see cleanAddress
+ */
+ public function getCleanName($name) {
+ $name = trim($name, ' \t"');
+ $name = str_replace('"', '\"', $name, $count);
+ if ($count > 0 || strpos($name, ',') !== false) {
+ $name = '"'.$name.'"';
+ }
+ return $name;
+ }
+
+ /**
* 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!
*
+ * If @$addresses is a string then it will be split into multiple
+ * addresses. Addresses must be separated by a comma. If the display
+ * name includes a comma then it MUST be properly enclosed by '"' to
+ * prevent spliting at the wrong point.
+ *
* Example:
* cc("föö <foo@bar.com>, me@somewhere.com","TBcc");
+ * to("foo, Dr." <foo@bar.com>, me@somewhere.com");
*
* @param string|string[] $addresses Multiple adresses separated by commas or as array
* @return false|string the prepared header (can contain multiple lines)
@@ -336,7 +361,13 @@ class Mailer {
public function cleanAddress($addresses) {
$headers = '';
if(!is_array($addresses)){
- $addresses = explode(',', $addresses);
+ $count = preg_match_all('/\s*(?:("[^"]*"[^,]+),*)|([^,]+)\s*,*/', $addresses, $matches, PREG_SET_ORDER);
+ $addresses = array();
+ if ($count !== false && is_array($matches)) {
+ foreach ($matches as $match) {
+ array_push($addresses, rtrim($match[0], ','));
+ }
+ }
}
foreach($addresses as $part) {
@@ -348,6 +379,7 @@ class Mailer {
$text = trim($matches[1]);
$addr = $matches[2];
} else {
+ $text = '';
$addr = $part;
}
// skip empty ones
@@ -356,13 +388,13 @@ class Mailer {
}
// FIXME: is there a way to encode the localpart of a emailaddress?
- if(!utf8_isASCII($addr)) {
- msg(hsc("E-Mail address <$addr> is not ASCII"), -1);
+ if(!\dokuwiki\Utf8\Clean::isASCII($addr)) {
+ msg(hsc("E-Mail address <$addr> is not ASCII"), -1, __LINE__, __FILE__, MSG_ADMINS_ONLY);
continue;
}
if(!mail_isvalid($addr)) {
- msg(hsc("E-Mail address <$addr> is not valid"), -1);
+ msg(hsc("E-Mail address <$addr> is not valid"), -1, __LINE__, __FILE__, MSG_ADMINS_ONLY);
continue;
}
@@ -372,11 +404,11 @@ class Mailer {
$addr = "<$addr>";
if(defined('MAILHEADER_ASCIIONLY')) {
- $text = utf8_deaccent($text);
- $text = utf8_strip($text);
+ $text = \dokuwiki\Utf8\Clean::deaccent($text);
+ $text = \dokuwiki\Utf8\Clean::strip($text);
}
- if(strpos($text, ',') !== false || !utf8_isASCII($text)) {
+ if(strpos($text, ',') !== false || !\dokuwiki\Utf8\Clean::isASCII($text)) {
$text = '=?UTF-8?B?'.base64_encode($text).'?=';
}
} else {
@@ -522,10 +554,10 @@ class Mailer {
if(isset($this->headers['Subject'])) {
// add prefix to subject
if(empty($conf['mailprefix'])) {
- if(utf8_strlen($conf['title']) < 20) {
+ if(\dokuwiki\Utf8\PhpString::strlen($conf['title']) < 20) {
$prefix = '['.$conf['title'].']';
} else {
- $prefix = '['.utf8_substr($conf['title'], 0, 20).'...]';
+ $prefix = '['.\dokuwiki\Utf8\PhpString::substr($conf['title'], 0, 20).'...]';
}
} else {
$prefix = '['.$conf['mailprefix'].']';
@@ -537,10 +569,10 @@ class Mailer {
// encode subject
if(defined('MAILHEADER_ASCIIONLY')) {
- $this->headers['Subject'] = utf8_deaccent($this->headers['Subject']);
- $this->headers['Subject'] = utf8_strip($this->headers['Subject']);
+ $this->headers['Subject'] = \dokuwiki\Utf8\Clean::deaccent($this->headers['Subject']);
+ $this->headers['Subject'] = \dokuwiki\Utf8\Clean::strip($this->headers['Subject']);
}
- if(!utf8_isASCII($this->headers['Subject'])) {
+ if(!\dokuwiki\Utf8\Clean::isASCII($this->headers['Subject'])) {
$this->headers['Subject'] = '=?UTF-8?B?'.base64_encode($this->headers['Subject']).'?=';
}
}
@@ -566,7 +598,7 @@ class Mailer {
protected function prepareHeaders() {
$headers = '';
foreach($this->headers as $key => $val) {
- if ($val === '' || is_null($val)) continue;
+ if ($val === '' || $val === null) continue;
$headers .= $this->wrappedHeaderLine($key, $val);
}
return $headers;
@@ -604,6 +636,8 @@ class Mailer {
$ip = clientIP();
$cip = gethostsbyaddrs($ip);
+ $name = isset($INFO) ? $INFO['userinfo']['name'] : '';
+ $mail = isset($INFO) ? $INFO['userinfo']['mail'] : '';
$this->replacements['text'] = array(
'DATE' => dformat(),
@@ -613,10 +647,14 @@ class Mailer {
'TITLE' => $conf['title'],
'DOKUWIKIURL' => DOKU_URL,
'USER' => $INPUT->server->str('REMOTE_USER'),
- 'NAME' => $INFO['userinfo']['name'],
- 'MAIL' => $INFO['userinfo']['mail']
+ 'NAME' => $name,
+ 'MAIL' => $mail
+ );
+ $signature = str_replace(
+ '@DOKUWIKIURL@',
+ $this->replacements['text']['DOKUWIKIURL'],
+ $lang['email_signature_text']
);
- $signature = str_replace('@DOKUWIKIURL@', $this->replacements['text']['DOKUWIKIURL'], $lang['email_signature_text']);
$this->replacements['text']['EMAILSIGNATURE'] = "\n-- \n" . $signature . "\n";
$this->replacements['html'] = array(
@@ -627,9 +665,9 @@ class Mailer {
'TITLE' => hsc($conf['title']),
'DOKUWIKIURL' => '<a href="' . DOKU_URL . '">' . DOKU_URL . '</a>',
'USER' => hsc($INPUT->server->str('REMOTE_USER')),
- 'NAME' => hsc($INFO['userinfo']['name']),
- 'MAIL' => '<a href="mailto:"' . hsc($INFO['userinfo']['mail']) . '">' .
- hsc($INFO['userinfo']['mail']) . '</a>'
+ 'NAME' => hsc($name),
+ 'MAIL' => '<a href="mailto:"' . hsc($mail) . '">' .
+ hsc($mail) . '</a>'
);
$signature = $lang['email_signature_text'];
if(!empty($lang['email_signature_html'])) {
@@ -658,6 +696,7 @@ class Mailer {
* @return bool true if the mail was successfully passed to the MTA
*/
public function send() {
+ global $lang;
$success = false;
// prepare hook data
@@ -678,7 +717,7 @@ class Mailer {
);
// do our thing if BEFORE hook approves
- $evt = new Doku_Event('MAIL_MESSAGE_SEND', $data);
+ $evt = new Event('MAIL_MESSAGE_SEND', $data);
if($evt->advise_before(true)) {
// clean up before using the headers
$this->cleanHeaders();
@@ -716,8 +755,16 @@ class Mailer {
$headers .= MAILHEADER_EOL.trim($data['headers']);
}
+ if(!function_exists('mail')){
+ $emsg = $lang['email_fail'] . $subject;
+ error_log($emsg);
+ msg(hsc($emsg), -1, __LINE__, __FILE__, MSG_MANAGERS_ONLY);
+ $evt->advise_after();
+ return false;
+ }
+
// send the thing
- if(is_null($this->sendparam)) {
+ if($this->sendparam === null) {
$success = @mail($to, $subject, $body, $headers);
} else {
$success = @mail($to, $subject, $body, $headers, $this->sendparam);
diff --git a/inc/Manifest.php b/inc/Manifest.php
index 0df9c2b81..29e7f263f 100644
--- a/inc/Manifest.php
+++ b/inc/Manifest.php
@@ -2,6 +2,8 @@
namespace dokuwiki;
+use dokuwiki\Extension\Event;
+
class Manifest
{
public function sendManifest()
@@ -29,7 +31,7 @@ class Manifest
}
$styleUtil = new \dokuwiki\StyleUtils();
- $styleIni = $styleUtil->cssStyleini($conf['template']);
+ $styleIni = $styleUtil->cssStyleini();
$replacements = $styleIni['replacements'];
if (empty($manifest['background_color'])) {
@@ -37,7 +39,9 @@ class Manifest
}
if (empty($manifest['theme_color'])) {
- $manifest['theme_color'] = !empty($replacements['__theme_color__']) ? $replacements['__theme_color__'] : $replacements['__background_alt__'];
+ $manifest['theme_color'] = !empty($replacements['__theme_color__'])
+ ? $replacements['__theme_color__']
+ : $replacements['__background_alt__'];
}
if (empty($manifest['icons'])) {
@@ -72,7 +76,7 @@ class Manifest
}
}
- trigger_event('MANIFEST_SEND', $manifest);
+ Event::createAndTrigger('MANIFEST_SEND', $manifest);
header('Content-Type: application/manifest+json');
echo json_encode($manifest);
diff --git a/inc/Menu/AbstractMenu.php b/inc/Menu/AbstractMenu.php
index ce021ab64..37e5d2cc3 100644
--- a/inc/Menu/AbstractMenu.php
+++ b/inc/Menu/AbstractMenu.php
@@ -2,6 +2,7 @@
namespace dokuwiki\Menu;
+use dokuwiki\Extension\Event;
use dokuwiki\Menu\Item\AbstractItem;
/**
@@ -42,7 +43,7 @@ abstract class AbstractMenu implements MenuInterface {
'view' => $this->view,
'items' => array(),
);
- trigger_event('MENU_ITEMS_ASSEMBLY', $data, array($this, 'loadItems'));
+ Event::createAndTrigger('MENU_ITEMS_ASSEMBLY', $data, array($this, 'loadItems'));
return $data['items'];
}
diff --git a/inc/Menu/Item/AbstractItem.php b/inc/Menu/Item/AbstractItem.php
index 45ead5562..c6b04bfd3 100644
--- a/inc/Menu/Item/AbstractItem.php
+++ b/inc/Menu/Item/AbstractItem.php
@@ -114,7 +114,7 @@ abstract class AbstractItem {
* @return string
*/
public function getLink() {
- if($this->id[0] == '#') {
+ if($this->id && $this->id[0] == '#') {
return $this->id;
} else {
return wl($this->id, $this->params, false, '&');
diff --git a/inc/Menu/Item/Admin.php b/inc/Menu/Item/Admin.php
index 7302f0f34..e5506c220 100644
--- a/inc/Menu/Item/Admin.php
+++ b/inc/Menu/Item/Admin.php
@@ -11,14 +11,18 @@ class Admin extends AbstractItem {
/** @inheritdoc */
public function __construct() {
- global $INFO;
parent::__construct();
$this->svg = DOKU_INC . 'lib/images/menu/settings.svg';
+ }
+
+ /** @inheritdoc */
+ public function visibleInContext($ctx)
+ {
+ global $INFO;
+ if(!$INFO['ismanager']) return false;
- if(!$INFO['ismanager']) {
- throw new \RuntimeException("admin is for managers only");
- }
+ return parent::visibleInContext($ctx);
}
}
diff --git a/inc/Menu/Item/Edit.php b/inc/Menu/Item/Edit.php
index 5de1778fd..15d954380 100644
--- a/inc/Menu/Item/Edit.php
+++ b/inc/Menu/Item/Edit.php
@@ -32,7 +32,7 @@ class Edit extends AbstractItem {
}
}
} else {
- if(!actionOK($this->type)) throw new \RuntimeException("action disabled: source");
+ if(!actionOK("source")) throw new \RuntimeException("action disabled: source");
$params['rev'] = $REV;
$this->type = 'source';
$this->accesskey = 'v';
diff --git a/inc/Menu/Item/Revert.php b/inc/Menu/Item/Revert.php
index a360c6842..7d57df044 100644
--- a/inc/Menu/Item/Revert.php
+++ b/inc/Menu/Item/Revert.php
@@ -15,7 +15,7 @@ class Revert extends AbstractItem {
global $INFO;
parent::__construct();
- if(!$INFO['ismanager'] || !$REV || !$INFO['writable']) {
+ if(!$REV || !$INFO['writable']) {
throw new \RuntimeException('revert not available');
}
$this->params['rev'] = $REV;
diff --git a/inc/Menu/MobileMenu.php b/inc/Menu/MobileMenu.php
index 29e17d163..209805646 100644
--- a/inc/Menu/MobileMenu.php
+++ b/inc/Menu/MobileMenu.php
@@ -70,14 +70,16 @@ class MobileMenu implements MenuInterface {
$html .= '<option value="">' . $empty . '</option>';
foreach($this->getGroupedItems() as $tools => $items) {
- $html .= '<optgroup label="' . $lang[$tools . '_tools'] . '">';
- foreach($items as $item) {
- $params = $item->getParams();
- $html .= '<option value="' . $params['do'] . '">';
- $html .= hsc($item->getLabel());
- $html .= '</option>';
+ if (count($items)) {
+ $html .= '<optgroup label="' . $lang[$tools . '_tools'] . '">';
+ foreach($items as $item) {
+ $params = $item->getParams();
+ $html .= '<option value="' . $params['do'] . '">';
+ $html .= hsc($item->getLabel());
+ $html .= '</option>';
+ }
+ $html .= '</optgroup>';
}
- $html .= '</optgroup>';
}
$html .= '</select>';
diff --git a/inc/Parsing/Handler/Block.php b/inc/Parsing/Handler/Block.php
new file mode 100644
index 000000000..4cfa686d4
--- /dev/null
+++ b/inc/Parsing/Handler/Block.php
@@ -0,0 +1,211 @@
+<?php
+
+namespace dokuwiki\Parsing\Handler;
+
+/**
+ * Handler for paragraphs
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ */
+class Block
+{
+ protected $calls = array();
+ protected $skipEol = false;
+ protected $inParagraph = false;
+
+ // Blocks these should not be inside paragraphs
+ protected $blockOpen = array(
+ 'header',
+ 'listu_open','listo_open','listitem_open','listcontent_open',
+ 'table_open','tablerow_open','tablecell_open','tableheader_open','tablethead_open',
+ 'quote_open',
+ 'code','file','hr','preformatted','rss',
+ 'htmlblock','phpblock',
+ 'footnote_open',
+ );
+
+ protected $blockClose = array(
+ 'header',
+ 'listu_close','listo_close','listitem_close','listcontent_close',
+ 'table_close','tablerow_close','tablecell_close','tableheader_close','tablethead_close',
+ 'quote_close',
+ 'code','file','hr','preformatted','rss',
+ 'htmlblock','phpblock',
+ 'footnote_close',
+ );
+
+ // Stacks can contain paragraphs
+ protected $stackOpen = array(
+ 'section_open',
+ );
+
+ protected $stackClose = array(
+ 'section_close',
+ );
+
+
+ /**
+ * Constructor. Adds loaded syntax plugins to the block and stack
+ * arrays
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public function __construct()
+ {
+ global $DOKU_PLUGINS;
+ //check if syntax plugins were loaded
+ if (empty($DOKU_PLUGINS['syntax'])) return;
+ foreach ($DOKU_PLUGINS['syntax'] as $n => $p) {
+ $ptype = $p->getPType();
+ if ($ptype == 'block') {
+ $this->blockOpen[] = 'plugin_'.$n;
+ $this->blockClose[] = 'plugin_'.$n;
+ } elseif ($ptype == 'stack') {
+ $this->stackOpen[] = 'plugin_'.$n;
+ $this->stackClose[] = 'plugin_'.$n;
+ }
+ }
+ }
+
+ protected function openParagraph($pos)
+ {
+ if ($this->inParagraph) return;
+ $this->calls[] = array('p_open',array(), $pos);
+ $this->inParagraph = true;
+ $this->skipEol = true;
+ }
+
+ /**
+ * Close a paragraph if needed
+ *
+ * This function makes sure there are no empty paragraphs on the stack
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string|integer $pos
+ */
+ protected function closeParagraph($pos)
+ {
+ if (!$this->inParagraph) return;
+ // look back if there was any content - we don't want empty paragraphs
+ $content = '';
+ $ccount = count($this->calls);
+ for ($i=$ccount-1; $i>=0; $i--) {
+ if ($this->calls[$i][0] == 'p_open') {
+ break;
+ } elseif ($this->calls[$i][0] == 'cdata') {
+ $content .= $this->calls[$i][1][0];
+ } else {
+ $content = 'found markup';
+ break;
+ }
+ }
+
+ if (trim($content)=='') {
+ //remove the whole paragraph
+ //array_splice($this->calls,$i); // <- this is much slower than the loop below
+ for ($x=$ccount; $x>$i;
+ $x--) array_pop($this->calls);
+ } else {
+ // remove ending linebreaks in the paragraph
+ $i=count($this->calls)-1;
+ if ($this->calls[$i][0] == 'cdata') $this->calls[$i][1][0] = rtrim($this->calls[$i][1][0], "\n");
+ $this->calls[] = array('p_close',array(), $pos);
+ }
+
+ $this->inParagraph = false;
+ $this->skipEol = true;
+ }
+
+ protected function addCall($call)
+ {
+ $key = count($this->calls);
+ if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
+ $this->calls[$key-1][1][0] .= $call[1][0];
+ } else {
+ $this->calls[] = $call;
+ }
+ }
+
+ // simple version of addCall, without checking cdata
+ protected function storeCall($call)
+ {
+ $this->calls[] = $call;
+ }
+
+ /**
+ * Processes the whole instruction stack to open and close paragraphs
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $calls
+ *
+ * @return array
+ */
+ public function process($calls)
+ {
+ // open first paragraph
+ $this->openParagraph(0);
+ foreach ($calls as $key => $call) {
+ $cname = $call[0];
+ if ($cname == 'plugin') {
+ $cname='plugin_'.$call[1][0];
+ $plugin = true;
+ $plugin_open = (($call[1][2] == DOKU_LEXER_ENTER) || ($call[1][2] == DOKU_LEXER_SPECIAL));
+ $plugin_close = (($call[1][2] == DOKU_LEXER_EXIT) || ($call[1][2] == DOKU_LEXER_SPECIAL));
+ } else {
+ $plugin = false;
+ }
+ /* stack */
+ if (in_array($cname, $this->stackClose) && (!$plugin || $plugin_close)) {
+ $this->closeParagraph($call[2]);
+ $this->storeCall($call);
+ $this->openParagraph($call[2]);
+ continue;
+ }
+ if (in_array($cname, $this->stackOpen) && (!$plugin || $plugin_open)) {
+ $this->closeParagraph($call[2]);
+ $this->storeCall($call);
+ $this->openParagraph($call[2]);
+ continue;
+ }
+ /* block */
+ // If it's a substition it opens and closes at the same call.
+ // To make sure next paragraph is correctly started, let close go first.
+ if (in_array($cname, $this->blockClose) && (!$plugin || $plugin_close)) {
+ $this->closeParagraph($call[2]);
+ $this->storeCall($call);
+ $this->openParagraph($call[2]);
+ continue;
+ }
+ if (in_array($cname, $this->blockOpen) && (!$plugin || $plugin_open)) {
+ $this->closeParagraph($call[2]);
+ $this->storeCall($call);
+ continue;
+ }
+ /* eol */
+ if ($cname == 'eol') {
+ // Check this isn't an eol instruction to skip...
+ if (!$this->skipEol) {
+ // Next is EOL => double eol => mark as paragraph
+ if (isset($calls[$key+1]) && $calls[$key+1][0] == 'eol') {
+ $this->closeParagraph($call[2]);
+ $this->openParagraph($call[2]);
+ } else {
+ //if this is just a single eol make a space from it
+ $this->addCall(array('cdata',array("\n"), $call[2]));
+ }
+ }
+ continue;
+ }
+ /* normal */
+ $this->addCall($call);
+ $this->skipEol = false;
+ }
+ // close last paragraph
+ $call = end($this->calls);
+ $this->closeParagraph($call[2]);
+ return $this->calls;
+ }
+}
diff --git a/inc/Parsing/Handler/CallWriter.php b/inc/Parsing/Handler/CallWriter.php
new file mode 100644
index 000000000..2457143ed
--- /dev/null
+++ b/inc/Parsing/Handler/CallWriter.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace dokuwiki\Parsing\Handler;
+
+class CallWriter implements CallWriterInterface
+{
+
+ /** @var \Doku_Handler $Handler */
+ protected $Handler;
+
+ /**
+ * @param \Doku_Handler $Handler
+ */
+ public function __construct(\Doku_Handler $Handler)
+ {
+ $this->Handler = $Handler;
+ }
+
+ /** @inheritdoc */
+ public function writeCall($call)
+ {
+ $this->Handler->calls[] = $call;
+ }
+
+ /** @inheritdoc */
+ public function writeCalls($calls)
+ {
+ $this->Handler->calls = array_merge($this->Handler->calls, $calls);
+ }
+
+ /**
+ * @inheritdoc
+ * function is required, but since this call writer is first/highest in
+ * the chain it is not required to do anything
+ */
+ public function finalise()
+ {
+ unset($this->Handler);
+ }
+}
diff --git a/inc/Parsing/Handler/CallWriterInterface.php b/inc/Parsing/Handler/CallWriterInterface.php
new file mode 100644
index 000000000..1ade7c060
--- /dev/null
+++ b/inc/Parsing/Handler/CallWriterInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace dokuwiki\Parsing\Handler;
+
+interface CallWriterInterface
+{
+ /**
+ * Add a call to our call list
+ *
+ * @param $call the call to be added
+ */
+ public function writeCall($call);
+
+ /**
+ * Append a list of calls to our call list
+ *
+ * @param $calls list of calls to be appended
+ */
+ public function writeCalls($calls);
+
+ /**
+ * Explicit request to finish up and clean up NOW!
+ * (probably because document end has been reached)
+ *
+ * If part of a CallWriter chain, call finalise on
+ * the original call writer
+ *
+ */
+ public function finalise();
+}
diff --git a/inc/Parsing/Handler/Lists.php b/inc/Parsing/Handler/Lists.php
new file mode 100644
index 000000000..c4428fe46
--- /dev/null
+++ b/inc/Parsing/Handler/Lists.php
@@ -0,0 +1,213 @@
+<?php
+
+namespace dokuwiki\Parsing\Handler;
+
+class Lists implements ReWriterInterface
+{
+
+ /** @var CallWriterInterface original call writer */
+ protected $callWriter;
+
+ protected $calls = array();
+ protected $listCalls = array();
+ protected $listStack = array();
+
+ protected $initialDepth = 0;
+
+ const NODE = 1;
+
+
+ /** @inheritdoc */
+ public function __construct(CallWriterInterface $CallWriter)
+ {
+ $this->callWriter = $CallWriter;
+ }
+
+ /** @inheritdoc */
+ public function writeCall($call)
+ {
+ $this->calls[] = $call;
+ }
+
+ /**
+ * @inheritdoc
+ * Probably not needed but just in case...
+ */
+ public function writeCalls($calls)
+ {
+ $this->calls = array_merge($this->calls, $calls);
+ }
+
+ /** @inheritdoc */
+ public function finalise()
+ {
+ $last_call = end($this->calls);
+ $this->writeCall(array('list_close',array(), $last_call[2]));
+
+ $this->process();
+ $this->callWriter->finalise();
+ unset($this->callWriter);
+ }
+
+ /** @inheritdoc */
+ public function process()
+ {
+
+ foreach ($this->calls as $call) {
+ switch ($call[0]) {
+ case 'list_item':
+ $this->listOpen($call);
+ break;
+ case 'list_open':
+ $this->listStart($call);
+ break;
+ case 'list_close':
+ $this->listEnd($call);
+ break;
+ default:
+ $this->listContent($call);
+ break;
+ }
+ }
+
+ $this->callWriter->writeCalls($this->listCalls);
+ return $this->callWriter;
+ }
+
+ protected function listStart($call)
+ {
+ $depth = $this->interpretSyntax($call[1][0], $listType);
+
+ $this->initialDepth = $depth;
+ // array(list type, current depth, index of current listitem_open)
+ $this->listStack[] = array($listType, $depth, 1);
+
+ $this->listCalls[] = array('list'.$listType.'_open',array(),$call[2]);
+ $this->listCalls[] = array('listitem_open',array(1),$call[2]);
+ $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+ }
+
+
+ protected function listEnd($call)
+ {
+ $closeContent = true;
+
+ while ($list = array_pop($this->listStack)) {
+ if ($closeContent) {
+ $this->listCalls[] = array('listcontent_close',array(),$call[2]);
+ $closeContent = false;
+ }
+ $this->listCalls[] = array('listitem_close',array(),$call[2]);
+ $this->listCalls[] = array('list'.$list[0].'_close', array(), $call[2]);
+ }
+ }
+
+ protected function listOpen($call)
+ {
+ $depth = $this->interpretSyntax($call[1][0], $listType);
+ $end = end($this->listStack);
+ $key = key($this->listStack);
+
+ // Not allowed to be shallower than initialDepth
+ if ($depth < $this->initialDepth) {
+ $depth = $this->initialDepth;
+ }
+
+ if ($depth == $end[1]) {
+ // Just another item in the list...
+ if ($listType == $end[0]) {
+ $this->listCalls[] = array('listcontent_close',array(),$call[2]);
+ $this->listCalls[] = array('listitem_close',array(),$call[2]);
+ $this->listCalls[] = array('listitem_open',array($depth-1),$call[2]);
+ $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+
+ // new list item, update list stack's index into current listitem_open
+ $this->listStack[$key][2] = count($this->listCalls) - 2;
+
+ // Switched list type...
+ } else {
+ $this->listCalls[] = array('listcontent_close',array(),$call[2]);
+ $this->listCalls[] = array('listitem_close',array(),$call[2]);
+ $this->listCalls[] = array('list'.$end[0].'_close', array(), $call[2]);
+ $this->listCalls[] = array('list'.$listType.'_open', array(), $call[2]);
+ $this->listCalls[] = array('listitem_open', array($depth-1), $call[2]);
+ $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+
+ array_pop($this->listStack);
+ $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2);
+ }
+ } elseif ($depth > $end[1]) { // Getting deeper...
+ $this->listCalls[] = array('listcontent_close',array(),$call[2]);
+ $this->listCalls[] = array('list'.$listType.'_open', array(), $call[2]);
+ $this->listCalls[] = array('listitem_open', array($depth-1), $call[2]);
+ $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+
+ // set the node/leaf state of this item's parent listitem_open to NODE
+ $this->listCalls[$this->listStack[$key][2]][1][1] = self::NODE;
+
+ $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2);
+ } else { // Getting shallower ( $depth < $end[1] )
+ $this->listCalls[] = array('listcontent_close',array(),$call[2]);
+ $this->listCalls[] = array('listitem_close',array(),$call[2]);
+ $this->listCalls[] = array('list'.$end[0].'_close',array(),$call[2]);
+
+ // Throw away the end - done
+ array_pop($this->listStack);
+
+ while (1) {
+ $end = end($this->listStack);
+ $key = key($this->listStack);
+
+ if ($end[1] <= $depth) {
+ // Normalize depths
+ $depth = $end[1];
+
+ $this->listCalls[] = array('listitem_close',array(),$call[2]);
+
+ if ($end[0] == $listType) {
+ $this->listCalls[] = array('listitem_open',array($depth-1),$call[2]);
+ $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+
+ // new list item, update list stack's index into current listitem_open
+ $this->listStack[$key][2] = count($this->listCalls) - 2;
+ } else {
+ // Switching list type...
+ $this->listCalls[] = array('list'.$end[0].'_close', array(), $call[2]);
+ $this->listCalls[] = array('list'.$listType.'_open', array(), $call[2]);
+ $this->listCalls[] = array('listitem_open', array($depth-1), $call[2]);
+ $this->listCalls[] = array('listcontent_open',array(),$call[2]);
+
+ array_pop($this->listStack);
+ $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2);
+ }
+
+ break;
+
+ // Haven't dropped down far enough yet.... ( $end[1] > $depth )
+ } else {
+ $this->listCalls[] = array('listitem_close',array(),$call[2]);
+ $this->listCalls[] = array('list'.$end[0].'_close',array(),$call[2]);
+
+ array_pop($this->listStack);
+ }
+ }
+ }
+ }
+
+ protected function listContent($call)
+ {
+ $this->listCalls[] = $call;
+ }
+
+ protected function interpretSyntax($match, & $type)
+ {
+ if (substr($match, -1) == '*') {
+ $type = 'u';
+ } else {
+ $type = 'o';
+ }
+ // Is the +1 needed? It used to be count(explode(...))
+ // but I don't think the number is seen outside this handler
+ return substr_count(str_replace("\t", ' ', $match), ' ') + 1;
+ }
+}
diff --git a/inc/Parsing/Handler/Nest.php b/inc/Parsing/Handler/Nest.php
new file mode 100644
index 000000000..b0044a3cb
--- /dev/null
+++ b/inc/Parsing/Handler/Nest.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace dokuwiki\Parsing\Handler;
+
+/**
+ * Generic call writer class to handle nesting of rendering instructions
+ * within a render instruction. Also see nest() method of renderer base class
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ */
+class Nest implements ReWriterInterface
+{
+
+ /** @var CallWriterInterface original CallWriter */
+ protected $callWriter;
+
+ protected $calls = array();
+ protected $closingInstruction;
+
+ /**
+ * @inheritdoc
+ *
+ * @param CallWriterInterface $CallWriter the parser's current call writer, i.e. the one above us in the chain
+ * @param string $close closing instruction name, this is required to properly terminate the
+ * syntax mode if the document ends without a closing pattern
+ */
+ public function __construct(CallWriterInterface $CallWriter, $close = "nest_close")
+ {
+ $this->callWriter = $CallWriter;
+
+ $this->closingInstruction = $close;
+ }
+
+ /** @inheritdoc */
+ public function writeCall($call)
+ {
+ $this->calls[] = $call;
+ }
+
+ /** @inheritdoc */
+ public function writeCalls($calls)
+ {
+ $this->calls = array_merge($this->calls, $calls);
+ }
+
+ /** @inheritdoc */
+ public function finalise()
+ {
+ $last_call = end($this->calls);
+ $this->writeCall(array($this->closingInstruction,array(), $last_call[2]));
+
+ $this->process();
+ $this->callWriter->finalise();
+ unset($this->callWriter);
+ }
+
+ /** @inheritdoc */
+ public function process()
+ {
+ // merge consecutive cdata
+ $unmerged_calls = $this->calls;
+ $this->calls = array();
+
+ foreach ($unmerged_calls as $call) $this->addCall($call);
+
+ $first_call = reset($this->calls);
+ $this->callWriter->writeCall(array("nest", array($this->calls), $first_call[2]));
+
+ return $this->callWriter;
+ }
+
+ protected function addCall($call)
+ {
+ $key = count($this->calls);
+ if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
+ $this->calls[$key-1][1][0] .= $call[1][0];
+ } elseif ($call[0] == 'eol') {
+ // do nothing (eol shouldn't be allowed, to counter preformatted fix in #1652 & #1699)
+ } else {
+ $this->calls[] = $call;
+ }
+ }
+}
diff --git a/inc/Parsing/Handler/Preformatted.php b/inc/Parsing/Handler/Preformatted.php
new file mode 100644
index 000000000..a668771a7
--- /dev/null
+++ b/inc/Parsing/Handler/Preformatted.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace dokuwiki\Parsing\Handler;
+
+class Preformatted implements ReWriterInterface
+{
+
+ /** @var CallWriterInterface original call writer */
+ protected $callWriter;
+
+ protected $calls = array();
+ protected $pos;
+ protected $text ='';
+
+ /**
+ * @inheritdoc
+ */
+ public function __construct(CallWriterInterface $CallWriter)
+ {
+ $this->callWriter = $CallWriter;
+ }
+
+ /** @inheritdoc */
+ public function writeCall($call)
+ {
+ $this->calls[] = $call;
+ }
+
+ /**
+ * @inheritdoc
+ * Probably not needed but just in case...
+ */
+ public function writeCalls($calls)
+ {
+ $this->calls = array_merge($this->calls, $calls);
+ }
+
+ /** @inheritdoc */
+ public function finalise()
+ {
+ $last_call = end($this->calls);
+ $this->writeCall(array('preformatted_end',array(), $last_call[2]));
+
+ $this->process();
+ $this->callWriter->finalise();
+ unset($this->callWriter);
+ }
+
+ /** @inheritdoc */
+ public function process()
+ {
+ foreach ($this->calls as $call) {
+ switch ($call[0]) {
+ case 'preformatted_start':
+ $this->pos = $call[2];
+ break;
+ case 'preformatted_newline':
+ $this->text .= "\n";
+ break;
+ case 'preformatted_content':
+ $this->text .= $call[1][0];
+ break;
+ case 'preformatted_end':
+ if (trim($this->text)) {
+ $this->callWriter->writeCall(array('preformatted', array($this->text), $this->pos));
+ }
+ // see FS#1699 & FS#1652, add 'eol' instructions to ensure proper triggering of following p_open
+ $this->callWriter->writeCall(array('eol', array(), $this->pos));
+ $this->callWriter->writeCall(array('eol', array(), $this->pos));
+ break;
+ }
+ }
+
+ return $this->callWriter;
+ }
+}
diff --git a/inc/Parsing/Handler/Quote.php b/inc/Parsing/Handler/Quote.php
new file mode 100644
index 000000000..a786d10c0
--- /dev/null
+++ b/inc/Parsing/Handler/Quote.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace dokuwiki\Parsing\Handler;
+
+class Quote implements ReWriterInterface
+{
+
+ /** @var CallWriterInterface original CallWriter */
+ protected $callWriter;
+
+ protected $calls = array();
+
+ protected $quoteCalls = array();
+
+ /** @inheritdoc */
+ public function __construct(CallWriterInterface $CallWriter)
+ {
+ $this->callWriter = $CallWriter;
+ }
+
+ /** @inheritdoc */
+ public function writeCall($call)
+ {
+ $this->calls[] = $call;
+ }
+
+ /**
+ * @inheritdoc
+ *
+ * Probably not needed but just in case...
+ */
+ public function writeCalls($calls)
+ {
+ $this->calls = array_merge($this->calls, $calls);
+ }
+
+ /** @inheritdoc */
+ public function finalise()
+ {
+ $last_call = end($this->calls);
+ $this->writeCall(array('quote_end',array(), $last_call[2]));
+
+ $this->process();
+ $this->callWriter->finalise();
+ unset($this->callWriter);
+ }
+
+ /** @inheritdoc */
+ public function process()
+ {
+
+ $quoteDepth = 1;
+
+ foreach ($this->calls as $call) {
+ switch ($call[0]) {
+
+ /** @noinspection PhpMissingBreakStatementInspection */
+ case 'quote_start':
+ $this->quoteCalls[] = array('quote_open',array(),$call[2]);
+ // fallthrough
+ case 'quote_newline':
+ $quoteLength = $this->getDepth($call[1][0]);
+
+ if ($quoteLength > $quoteDepth) {
+ $quoteDiff = $quoteLength - $quoteDepth;
+ for ($i = 1; $i <= $quoteDiff; $i++) {
+ $this->quoteCalls[] = array('quote_open',array(),$call[2]);
+ }
+ } elseif ($quoteLength < $quoteDepth) {
+ $quoteDiff = $quoteDepth - $quoteLength;
+ for ($i = 1; $i <= $quoteDiff; $i++) {
+ $this->quoteCalls[] = array('quote_close',array(),$call[2]);
+ }
+ } else {
+ if ($call[0] != 'quote_start') $this->quoteCalls[] = array('linebreak',array(),$call[2]);
+ }
+
+ $quoteDepth = $quoteLength;
+
+ break;
+
+ case 'quote_end':
+ if ($quoteDepth > 1) {
+ $quoteDiff = $quoteDepth - 1;
+ for ($i = 1; $i <= $quoteDiff; $i++) {
+ $this->quoteCalls[] = array('quote_close',array(),$call[2]);
+ }
+ }
+
+ $this->quoteCalls[] = array('quote_close',array(),$call[2]);
+
+ $this->callWriter->writeCalls($this->quoteCalls);
+ break;
+
+ default:
+ $this->quoteCalls[] = $call;
+ break;
+ }
+ }
+
+ return $this->callWriter;
+ }
+
+ protected function getDepth($marker)
+ {
+ preg_match('/>{1,}/', $marker, $matches);
+ $quoteLength = strlen($matches[0]);
+ return $quoteLength;
+ }
+}
diff --git a/inc/Parsing/Handler/ReWriterInterface.php b/inc/Parsing/Handler/ReWriterInterface.php
new file mode 100644
index 000000000..13f7b48e3
--- /dev/null
+++ b/inc/Parsing/Handler/ReWriterInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace dokuwiki\Parsing\Handler;
+
+/**
+ * A ReWriter takes over from the orignal call writer and handles all new calls itself until
+ * the process method is called and control is given back to the original writer.
+ */
+interface ReWriterInterface extends CallWriterInterface
+{
+
+ /**
+ * ReWriterInterface constructor.
+ *
+ * This rewriter will be registered as the new call writer in the Handler.
+ * The original is passed as parameter
+ *
+ * @param CallWriterInterface $callWriter the original callwriter
+ */
+ public function __construct(CallWriterInterface $callWriter);
+
+ /**
+ * Process any calls that have been added and add them to the
+ * original call writer
+ *
+ * @return CallWriterInterface the orignal call writer
+ */
+ public function process();
+}
diff --git a/inc/Parsing/Handler/Table.php b/inc/Parsing/Handler/Table.php
new file mode 100644
index 000000000..6759ea798
--- /dev/null
+++ b/inc/Parsing/Handler/Table.php
@@ -0,0 +1,345 @@
+<?php
+
+namespace dokuwiki\Parsing\Handler;
+
+class Table implements ReWriterInterface
+{
+
+ /** @var CallWriterInterface original CallWriter */
+ protected $callWriter;
+
+ protected $calls = array();
+ protected $tableCalls = array();
+ protected $maxCols = 0;
+ protected $maxRows = 1;
+ protected $currentCols = 0;
+ protected $firstCell = false;
+ protected $lastCellType = 'tablecell';
+ protected $inTableHead = true;
+ protected $currentRow = array('tableheader' => 0, 'tablecell' => 0);
+ protected $countTableHeadRows = 0;
+
+ /** @inheritdoc */
+ public function __construct(CallWriterInterface $CallWriter)
+ {
+ $this->callWriter = $CallWriter;
+ }
+
+ /** @inheritdoc */
+ public function writeCall($call)
+ {
+ $this->calls[] = $call;
+ }
+
+ /**
+ * @inheritdoc
+ * Probably not needed but just in case...
+ */
+ public function writeCalls($calls)
+ {
+ $this->calls = array_merge($this->calls, $calls);
+ }
+
+ /** @inheritdoc */
+ public function finalise()
+ {
+ $last_call = end($this->calls);
+ $this->writeCall(array('table_end',array(), $last_call[2]));
+
+ $this->process();
+ $this->callWriter->finalise();
+ unset($this->callWriter);
+ }
+
+ /** @inheritdoc */
+ public function process()
+ {
+ foreach ($this->calls as $call) {
+ switch ($call[0]) {
+ case 'table_start':
+ $this->tableStart($call);
+ break;
+ case 'table_row':
+ $this->tableRowClose($call);
+ $this->tableRowOpen(array('tablerow_open',$call[1],$call[2]));
+ break;
+ case 'tableheader':
+ case 'tablecell':
+ $this->tableCell($call);
+ break;
+ case 'table_end':
+ $this->tableRowClose($call);
+ $this->tableEnd($call);
+ break;
+ default:
+ $this->tableDefault($call);
+ break;
+ }
+ }
+ $this->callWriter->writeCalls($this->tableCalls);
+
+ return $this->callWriter;
+ }
+
+ protected function tableStart($call)
+ {
+ $this->tableCalls[] = array('table_open',$call[1],$call[2]);
+ $this->tableCalls[] = array('tablerow_open',array(),$call[2]);
+ $this->firstCell = true;
+ }
+
+ protected function tableEnd($call)
+ {
+ $this->tableCalls[] = array('table_close',$call[1],$call[2]);
+ $this->finalizeTable();
+ }
+
+ protected function tableRowOpen($call)
+ {
+ $this->tableCalls[] = $call;
+ $this->currentCols = 0;
+ $this->firstCell = true;
+ $this->lastCellType = 'tablecell';
+ $this->maxRows++;
+ if ($this->inTableHead) {
+ $this->currentRow = array('tablecell' => 0, 'tableheader' => 0);
+ }
+ }
+
+ protected function tableRowClose($call)
+ {
+ if ($this->inTableHead && ($this->inTableHead = $this->isTableHeadRow())) {
+ $this->countTableHeadRows++;
+ }
+ // Strip off final cell opening and anything after it
+ while ($discard = array_pop($this->tableCalls)) {
+ if ($discard[0] == 'tablecell_open' || $discard[0] == 'tableheader_open') {
+ break;
+ }
+ if (!empty($this->currentRow[$discard[0]])) {
+ $this->currentRow[$discard[0]]--;
+ }
+ }
+ $this->tableCalls[] = array('tablerow_close', array(), $call[2]);
+
+ if ($this->currentCols > $this->maxCols) {
+ $this->maxCols = $this->currentCols;
+ }
+ }
+
+ protected function isTableHeadRow()
+ {
+ $td = $this->currentRow['tablecell'];
+ $th = $this->currentRow['tableheader'];
+
+ if (!$th || $td > 2) return false;
+ if (2*$td > $th) return false;
+
+ return true;
+ }
+
+ protected function tableCell($call)
+ {
+ if ($this->inTableHead) {
+ $this->currentRow[$call[0]]++;
+ }
+ if (!$this->firstCell) {
+ // Increase the span
+ $lastCall = end($this->tableCalls);
+
+ // A cell call which follows an open cell means an empty cell so span
+ if ($lastCall[0] == 'tablecell_open' || $lastCall[0] == 'tableheader_open') {
+ $this->tableCalls[] = array('colspan',array(),$call[2]);
+ }
+
+ $this->tableCalls[] = array($this->lastCellType.'_close',array(),$call[2]);
+ $this->tableCalls[] = array($call[0].'_open',array(1,null,1),$call[2]);
+ $this->lastCellType = $call[0];
+ } else {
+ $this->tableCalls[] = array($call[0].'_open',array(1,null,1),$call[2]);
+ $this->lastCellType = $call[0];
+ $this->firstCell = false;
+ }
+
+ $this->currentCols++;
+ }
+
+ protected function tableDefault($call)
+ {
+ $this->tableCalls[] = $call;
+ }
+
+ protected function finalizeTable()
+ {
+
+ // Add the max cols and rows to the table opening
+ if ($this->tableCalls[0][0] == 'table_open') {
+ // Adjust to num cols not num col delimeters
+ $this->tableCalls[0][1][] = $this->maxCols - 1;
+ $this->tableCalls[0][1][] = $this->maxRows;
+ $this->tableCalls[0][1][] = array_shift($this->tableCalls[0][1]);
+ } else {
+ trigger_error('First element in table call list is not table_open');
+ }
+
+ $lastRow = 0;
+ $lastCell = 0;
+ $cellKey = array();
+ $toDelete = array();
+
+ // if still in tableheader, then there can be no table header
+ // as all rows can't be within <THEAD>
+ if ($this->inTableHead) {
+ $this->inTableHead = false;
+ $this->countTableHeadRows = 0;
+ }
+
+ // Look for the colspan elements and increment the colspan on the
+ // previous non-empty opening cell. Once done, delete all the cells
+ // that contain colspans
+ for ($key = 0; $key < count($this->tableCalls); ++$key) {
+ $call = $this->tableCalls[$key];
+
+ switch ($call[0]) {
+ case 'table_open':
+ if ($this->countTableHeadRows) {
+ array_splice($this->tableCalls, $key+1, 0, array(
+ array('tablethead_open', array(), $call[2])));
+ }
+ break;
+
+ case 'tablerow_open':
+ $lastRow++;
+ $lastCell = 0;
+ break;
+
+ case 'tablecell_open':
+ case 'tableheader_open':
+ $lastCell++;
+ $cellKey[$lastRow][$lastCell] = $key;
+ break;
+
+ case 'table_align':
+ $prev = in_array($this->tableCalls[$key-1][0], array('tablecell_open', 'tableheader_open'));
+ $next = in_array($this->tableCalls[$key+1][0], array('tablecell_close', 'tableheader_close'));
+ // If the cell is empty, align left
+ if ($prev && $next) {
+ $this->tableCalls[$key-1][1][1] = 'left';
+
+ // If the previous element was a cell open, align right
+ } elseif ($prev) {
+ $this->tableCalls[$key-1][1][1] = 'right';
+
+ // If the next element is the close of an element, align either center or left
+ } elseif ($next) {
+ if ($this->tableCalls[$cellKey[$lastRow][$lastCell]][1][1] == 'right') {
+ $this->tableCalls[$cellKey[$lastRow][$lastCell]][1][1] = 'center';
+ } else {
+ $this->tableCalls[$cellKey[$lastRow][$lastCell]][1][1] = 'left';
+ }
+ }
+
+ // Now convert the whitespace back to cdata
+ $this->tableCalls[$key][0] = 'cdata';
+ break;
+
+ case 'colspan':
+ $this->tableCalls[$key-1][1][0] = false;
+
+ for ($i = $key-2; $i >= $cellKey[$lastRow][1]; $i--) {
+ if ($this->tableCalls[$i][0] == 'tablecell_open' ||
+ $this->tableCalls[$i][0] == 'tableheader_open'
+ ) {
+ if (false !== $this->tableCalls[$i][1][0]) {
+ $this->tableCalls[$i][1][0]++;
+ break;
+ }
+ }
+ }
+
+ $toDelete[] = $key-1;
+ $toDelete[] = $key;
+ $toDelete[] = $key+1;
+ break;
+
+ case 'rowspan':
+ if ($this->tableCalls[$key-1][0] == 'cdata') {
+ // ignore rowspan if previous call was cdata (text mixed with :::)
+ // we don't have to check next call as that wont match regex
+ $this->tableCalls[$key][0] = 'cdata';
+ } else {
+ $spanning_cell = null;
+
+ // can't cross thead/tbody boundary
+ if (!$this->countTableHeadRows || ($lastRow-1 != $this->countTableHeadRows)) {
+ for ($i = $lastRow-1; $i > 0; $i--) {
+ if ($this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tablecell_open' ||
+ $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tableheader_open'
+ ) {
+ if ($this->tableCalls[$cellKey[$i][$lastCell]][1][2] >= $lastRow - $i) {
+ $spanning_cell = $i;
+ break;
+ }
+ }
+ }
+ }
+ if (is_null($spanning_cell)) {
+ // No spanning cell found, so convert this cell to
+ // an empty one to avoid broken tables
+ $this->tableCalls[$key][0] = 'cdata';
+ $this->tableCalls[$key][1][0] = '';
+ break;
+ }
+ $this->tableCalls[$cellKey[$spanning_cell][$lastCell]][1][2]++;
+
+ $this->tableCalls[$key-1][1][2] = false;
+
+ $toDelete[] = $key-1;
+ $toDelete[] = $key;
+ $toDelete[] = $key+1;
+ }
+ break;
+
+ case 'tablerow_close':
+ // Fix broken tables by adding missing cells
+ $moreCalls = array();
+ while (++$lastCell < $this->maxCols) {
+ $moreCalls[] = array('tablecell_open', array(1, null, 1), $call[2]);
+ $moreCalls[] = array('cdata', array(''), $call[2]);
+ $moreCalls[] = array('tablecell_close', array(), $call[2]);
+ }
+ $moreCallsLength = count($moreCalls);
+ if ($moreCallsLength) {
+ array_splice($this->tableCalls, $key, 0, $moreCalls);
+ $key += $moreCallsLength;
+ }
+
+ if ($this->countTableHeadRows == $lastRow) {
+ array_splice($this->tableCalls, $key+1, 0, array(
+ array('tablethead_close', array(), $call[2])));
+ }
+ break;
+ }
+ }
+
+ // condense cdata
+ $cnt = count($this->tableCalls);
+ for ($key = 0; $key < $cnt; $key++) {
+ if ($this->tableCalls[$key][0] == 'cdata') {
+ $ckey = $key;
+ $key++;
+ while ($this->tableCalls[$key][0] == 'cdata') {
+ $this->tableCalls[$ckey][1][0] .= $this->tableCalls[$key][1][0];
+ $toDelete[] = $key;
+ $key++;
+ }
+ continue;
+ }
+ }
+
+ foreach ($toDelete as $delete) {
+ unset($this->tableCalls[$delete]);
+ }
+ $this->tableCalls = array_values($this->tableCalls);
+ }
+}
diff --git a/inc/Parsing/Lexer/Lexer.php b/inc/Parsing/Lexer/Lexer.php
new file mode 100644
index 000000000..c37e3fe4c
--- /dev/null
+++ b/inc/Parsing/Lexer/Lexer.php
@@ -0,0 +1,357 @@
+<?php
+/**
+ * Lexer adapted from Simple Test: http://sourceforge.net/projects/simpletest/
+ * For an intro to the Lexer see:
+ * https://web.archive.org/web/20120125041816/http://www.phppatterns.com/docs/develop/simple_test_lexer_notes
+ *
+ * @author Marcus Baker http://www.lastcraft.com
+ */
+
+namespace dokuwiki\Parsing\Lexer;
+
+// FIXME move elsewhere
+
+define("DOKU_LEXER_ENTER", 1);
+define("DOKU_LEXER_MATCHED", 2);
+define("DOKU_LEXER_UNMATCHED", 3);
+define("DOKU_LEXER_EXIT", 4);
+define("DOKU_LEXER_SPECIAL", 5);
+
+/**
+ * Accepts text and breaks it into tokens.
+ *
+ * Some optimisation to make the sure the content is only scanned by the PHP regex
+ * parser once. Lexer modes must not start with leading underscores.
+ */
+class Lexer
+{
+ /** @var ParallelRegex[] */
+ protected $regexes;
+ /** @var \Doku_Handler */
+ protected $handler;
+ /** @var StateStack */
+ protected $modeStack;
+ /** @var array mode "rewrites" */
+ protected $mode_handlers;
+ /** @var bool case sensitive? */
+ protected $case;
+
+ /**
+ * Sets up the lexer in case insensitive matching by default.
+ *
+ * @param \Doku_Handler $handler Handling strategy by reference.
+ * @param string $start Starting handler.
+ * @param boolean $case True for case sensitive.
+ */
+ public function __construct($handler, $start = "accept", $case = false)
+ {
+ $this->case = $case;
+ $this->regexes = array();
+ $this->handler = $handler;
+ $this->modeStack = new StateStack($start);
+ $this->mode_handlers = array();
+ }
+
+ /**
+ * Adds a token search pattern for a particular parsing mode.
+ *
+ * The pattern does not change the current mode.
+ *
+ * @param string $pattern Perl style regex, but ( and )
+ * lose the usual meaning.
+ * @param string $mode Should only apply this
+ * pattern when dealing with
+ * this type of input.
+ */
+ public function addPattern($pattern, $mode = "accept")
+ {
+ if (! isset($this->regexes[$mode])) {
+ $this->regexes[$mode] = new ParallelRegex($this->case);
+ }
+ $this->regexes[$mode]->addPattern($pattern);
+ }
+
+ /**
+ * Adds a pattern that will enter a new parsing mode.
+ *
+ * Useful for entering parenthesis, strings, tags, etc.
+ *
+ * @param string $pattern Perl style regex, but ( and ) lose the usual meaning.
+ * @param string $mode Should only apply this pattern when dealing with this type of input.
+ * @param string $new_mode Change parsing to this new nested mode.
+ */
+ public function addEntryPattern($pattern, $mode, $new_mode)
+ {
+ if (! isset($this->regexes[$mode])) {
+ $this->regexes[$mode] = new ParallelRegex($this->case);
+ }
+ $this->regexes[$mode]->addPattern($pattern, $new_mode);
+ }
+
+ /**
+ * Adds a pattern that will exit the current mode and re-enter the previous one.
+ *
+ * @param string $pattern Perl style regex, but ( and ) lose the usual meaning.
+ * @param string $mode Mode to leave.
+ */
+ public function addExitPattern($pattern, $mode)
+ {
+ if (! isset($this->regexes[$mode])) {
+ $this->regexes[$mode] = new ParallelRegex($this->case);
+ }
+ $this->regexes[$mode]->addPattern($pattern, "__exit");
+ }
+
+ /**
+ * Adds a pattern that has a special mode.
+ *
+ * Acts as an entry and exit pattern in one go, effectively calling a special
+ * parser handler for this token only.
+ *
+ * @param string $pattern Perl style regex, but ( and ) lose the usual meaning.
+ * @param string $mode Should only apply this pattern when dealing with this type of input.
+ * @param string $special Use this mode for this one token.
+ */
+ public function addSpecialPattern($pattern, $mode, $special)
+ {
+ if (! isset($this->regexes[$mode])) {
+ $this->regexes[$mode] = new ParallelRegex($this->case);
+ }
+ $this->regexes[$mode]->addPattern($pattern, "_$special");
+ }
+
+ /**
+ * Adds a mapping from a mode to another handler.
+ *
+ * @param string $mode Mode to be remapped.
+ * @param string $handler New target handler.
+ */
+ public function mapHandler($mode, $handler)
+ {
+ $this->mode_handlers[$mode] = $handler;
+ }
+
+ /**
+ * Splits the page text into tokens.
+ *
+ * Will fail if the handlers report an error or if no content is consumed. If successful then each
+ * unparsed and parsed token invokes a call to the held listener.
+ *
+ * @param string $raw Raw HTML text.
+ * @return boolean True on success, else false.
+ */
+ public function parse($raw)
+ {
+ if (! isset($this->handler)) {
+ return false;
+ }
+ $initialLength = strlen($raw);
+ $length = $initialLength;
+ $pos = 0;
+ while (is_array($parsed = $this->reduce($raw))) {
+ list($unmatched, $matched, $mode) = $parsed;
+ $currentLength = strlen($raw);
+ $matchPos = $initialLength - $currentLength - strlen($matched);
+ if (! $this->dispatchTokens($unmatched, $matched, $mode, $pos, $matchPos)) {
+ return false;
+ }
+ if ($currentLength == $length) {
+ return false;
+ }
+ $length = $currentLength;
+ $pos = $initialLength - $currentLength;
+ }
+ if (!$parsed) {
+ return false;
+ }
+ return $this->invokeHandler($raw, DOKU_LEXER_UNMATCHED, $pos);
+ }
+
+ /**
+ * Gives plugins access to the mode stack
+ *
+ * @return StateStack
+ */
+ public function getModeStack()
+ {
+ return $this->modeStack;
+ }
+
+ /**
+ * Sends the matched token and any leading unmatched
+ * text to the parser changing the lexer to a new
+ * mode if one is listed.
+ *
+ * @param string $unmatched Unmatched leading portion.
+ * @param string $matched Actual token match.
+ * @param bool|string $mode Mode after match. A boolean false mode causes no change.
+ * @param int $initialPos
+ * @param int $matchPos Current byte index location in raw doc thats being parsed
+ * @return boolean False if there was any error from the parser.
+ */
+ protected function dispatchTokens($unmatched, $matched, $mode, $initialPos, $matchPos)
+ {
+ if (! $this->invokeHandler($unmatched, DOKU_LEXER_UNMATCHED, $initialPos)) {
+ return false;
+ }
+ if ($this->isModeEnd($mode)) {
+ if (! $this->invokeHandler($matched, DOKU_LEXER_EXIT, $matchPos)) {
+ return false;
+ }
+ return $this->modeStack->leave();
+ }
+ if ($this->isSpecialMode($mode)) {
+ $this->modeStack->enter($this->decodeSpecial($mode));
+ if (! $this->invokeHandler($matched, DOKU_LEXER_SPECIAL, $matchPos)) {
+ return false;
+ }
+ return $this->modeStack->leave();
+ }
+ if (is_string($mode)) {
+ $this->modeStack->enter($mode);
+ return $this->invokeHandler($matched, DOKU_LEXER_ENTER, $matchPos);
+ }
+ return $this->invokeHandler($matched, DOKU_LEXER_MATCHED, $matchPos);
+ }
+
+ /**
+ * Tests to see if the new mode is actually to leave the current mode and pop an item from the matching
+ * mode stack.
+ *
+ * @param string $mode Mode to test.
+ * @return boolean True if this is the exit mode.
+ */
+ protected function isModeEnd($mode)
+ {
+ return ($mode === "__exit");
+ }
+
+ /**
+ * Test to see if the mode is one where this mode is entered for this token only and automatically
+ * leaves immediately afterwoods.
+ *
+ * @param string $mode Mode to test.
+ * @return boolean True if this is the exit mode.
+ */
+ protected function isSpecialMode($mode)
+ {
+ return (strncmp($mode, "_", 1) == 0);
+ }
+
+ /**
+ * Strips the magic underscore marking single token modes.
+ *
+ * @param string $mode Mode to decode.
+ * @return string Underlying mode name.
+ */
+ protected function decodeSpecial($mode)
+ {
+ return substr($mode, 1);
+ }
+
+ /**
+ * Calls the parser method named after the current mode.
+ *
+ * Empty content will be ignored. The lexer has a parser handler for each mode in the lexer.
+ *
+ * @param string $content Text parsed.
+ * @param boolean $is_match Token is recognised rather
+ * than unparsed data.
+ * @param int $pos Current byte index location in raw doc
+ * thats being parsed
+ * @return bool
+ */
+ protected function invokeHandler($content, $is_match, $pos)
+ {
+ if (($content === "") || ($content === false)) {
+ return true;
+ }
+ $handler = $this->modeStack->getCurrent();
+ if (isset($this->mode_handlers[$handler])) {
+ $handler = $this->mode_handlers[$handler];
+ }
+
+ // modes starting with plugin_ are all handled by the same
+ // handler but with an additional parameter
+ if (substr($handler, 0, 7)=='plugin_') {
+ list($handler,$plugin) = explode('_', $handler, 2);
+ return $this->handler->$handler($content, $is_match, $pos, $plugin);
+ }
+
+ return $this->handler->$handler($content, $is_match, $pos);
+ }
+
+ /**
+ * Tries to match a chunk of text and if successful removes the recognised chunk and any leading
+ * unparsed data. Empty strings will not be matched.
+ *
+ * @param string $raw The subject to parse. This is the content that will be eaten.
+ * @return array|bool Three item list of unparsed content followed by the
+ * recognised token and finally the action the parser is to take.
+ * True if no match, false if there is a parsing error.
+ */
+ protected function reduce(&$raw)
+ {
+ if (! isset($this->regexes[$this->modeStack->getCurrent()])) {
+ return false;
+ }
+ if ($raw === "") {
+ return true;
+ }
+ if ($action = $this->regexes[$this->modeStack->getCurrent()]->split($raw, $split)) {
+ list($unparsed, $match, $raw) = $split;
+ return array($unparsed, $match, $action);
+ }
+ return true;
+ }
+
+ /**
+ * Escapes regex characters other than (, ) and /
+ *
+ * @param string $str
+ * @return string
+ */
+ public static function escape($str)
+ {
+ $chars = array(
+ '/\\\\/',
+ '/\./',
+ '/\+/',
+ '/\*/',
+ '/\?/',
+ '/\[/',
+ '/\^/',
+ '/\]/',
+ '/\$/',
+ '/\{/',
+ '/\}/',
+ '/\=/',
+ '/\!/',
+ '/\</',
+ '/\>/',
+ '/\|/',
+ '/\:/'
+ );
+
+ $escaped = array(
+ '\\\\\\\\',
+ '\.',
+ '\+',
+ '\*',
+ '\?',
+ '\[',
+ '\^',
+ '\]',
+ '\$',
+ '\{',
+ '\}',
+ '\=',
+ '\!',
+ '\<',
+ '\>',
+ '\|',
+ '\:'
+ );
+ return preg_replace($chars, $escaped, $str);
+ }
+}
diff --git a/inc/Parsing/Lexer/ParallelRegex.php b/inc/Parsing/Lexer/ParallelRegex.php
new file mode 100644
index 000000000..96f61a10f
--- /dev/null
+++ b/inc/Parsing/Lexer/ParallelRegex.php
@@ -0,0 +1,203 @@
+<?php
+/**
+ * Lexer adapted from Simple Test: http://sourceforge.net/projects/simpletest/
+ * For an intro to the Lexer see:
+ * https://web.archive.org/web/20120125041816/http://www.phppatterns.com/docs/develop/simple_test_lexer_notes
+ *
+ * @author Marcus Baker http://www.lastcraft.com
+ */
+
+namespace dokuwiki\Parsing\Lexer;
+
+/**
+ * Compounded regular expression.
+ *
+ * Any of the contained patterns could match and when one does it's label is returned.
+ */
+class ParallelRegex
+{
+ /** @var string[] patterns to match */
+ protected $patterns;
+ /** @var string[] labels for above patterns */
+ protected $labels;
+ /** @var string the compound regex matching all patterns */
+ protected $regex;
+ /** @var bool case sensitive matching? */
+ protected $case;
+
+ /**
+ * Constructor. Starts with no patterns.
+ *
+ * @param boolean $case True for case sensitive, false
+ * for insensitive.
+ */
+ public function __construct($case)
+ {
+ $this->case = $case;
+ $this->patterns = array();
+ $this->labels = array();
+ $this->regex = null;
+ }
+
+ /**
+ * Adds a pattern with an optional label.
+ *
+ * @param mixed $pattern Perl style regex. Must be UTF-8
+ * encoded. If its a string, the (, )
+ * lose their meaning unless they
+ * form part of a lookahead or
+ * lookbehind assertation.
+ * @param bool|string $label Label of regex to be returned
+ * on a match. Label must be ASCII
+ */
+ public function addPattern($pattern, $label = true)
+ {
+ $count = count($this->patterns);
+ $this->patterns[$count] = $pattern;
+ $this->labels[$count] = $label;
+ $this->regex = null;
+ }
+
+ /**
+ * Attempts to match all patterns at once against a string.
+ *
+ * @param string $subject String to match against.
+ * @param string $match First matched portion of
+ * subject.
+ * @return bool|string False if no match found, label if label exists, true if not
+ */
+ public function match($subject, &$match)
+ {
+ if (count($this->patterns) == 0) {
+ return false;
+ }
+ if (! preg_match($this->getCompoundedRegex(), $subject, $matches)) {
+ $match = "";
+ return false;
+ }
+
+ $match = $matches[0];
+ $size = count($matches);
+ // FIXME this could be made faster by storing the labels as keys in a hashmap
+ for ($i = 1; $i < $size; $i++) {
+ if ($matches[$i] && isset($this->labels[$i - 1])) {
+ return $this->labels[$i - 1];
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Attempts to split the string against all patterns at once
+ *
+ * @param string $subject String to match against.
+ * @param array $split The split result: array containing, pre-match, match & post-match strings
+ * @return boolean True on success.
+ *
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ */
+ public function split($subject, &$split)
+ {
+ if (count($this->patterns) == 0) {
+ return false;
+ }
+
+ if (! preg_match($this->getCompoundedRegex(), $subject, $matches)) {
+ if (function_exists('preg_last_error')) {
+ $err = preg_last_error();
+ switch ($err) {
+ case PREG_BACKTRACK_LIMIT_ERROR:
+ msg('A PCRE backtrack error occured. Try to increase the pcre.backtrack_limit in php.ini', -1);
+ break;
+ case PREG_RECURSION_LIMIT_ERROR:
+ msg('A PCRE recursion error occured. Try to increase the pcre.recursion_limit in php.ini', -1);
+ break;
+ case PREG_BAD_UTF8_ERROR:
+ msg('A PCRE UTF-8 error occured. This might be caused by a faulty plugin', -1);
+ break;
+ case PREG_INTERNAL_ERROR:
+ msg('A PCRE internal error occured. This might be caused by a faulty plugin', -1);
+ break;
+ }
+ }
+
+ $split = array($subject, "", "");
+ return false;
+ }
+
+ $idx = count($matches)-2;
+ list($pre, $post) = preg_split($this->patterns[$idx].$this->getPerlMatchingFlags(), $subject, 2);
+ $split = array($pre, $matches[0], $post);
+
+ return isset($this->labels[$idx]) ? $this->labels[$idx] : true;
+ }
+
+ /**
+ * Compounds the patterns into a single
+ * regular expression separated with the
+ * "or" operator. Caches the regex.
+ * Will automatically escape (, ) and / tokens.
+ *
+ * @return null|string
+ */
+ protected function getCompoundedRegex()
+ {
+ if ($this->regex == null) {
+ $cnt = count($this->patterns);
+ for ($i = 0; $i < $cnt; $i++) {
+ /*
+ * decompose the input pattern into "(", "(?", ")",
+ * "[...]", "[]..]", "[^]..]", "[...[:...:]..]", "\x"...
+ * elements.
+ */
+ preg_match_all('/\\\\.|' .
+ '\(\?|' .
+ '[()]|' .
+ '\[\^?\]?(?:\\\\.|\[:[^]]*:\]|[^]\\\\])*\]|' .
+ '[^[()\\\\]+/', $this->patterns[$i], $elts);
+
+ $pattern = "";
+ $level = 0;
+
+ foreach ($elts[0] as $elt) {
+ /*
+ * for "(", ")" remember the nesting level, add "\"
+ * only to the non-"(?" ones.
+ */
+
+ switch ($elt) {
+ case '(':
+ $pattern .= '\(';
+ break;
+ case ')':
+ if ($level > 0)
+ $level--; /* closing (? */
+ else $pattern .= '\\';
+ $pattern .= ')';
+ break;
+ case '(?':
+ $level++;
+ $pattern .= '(?';
+ break;
+ default:
+ if (substr($elt, 0, 1) == '\\')
+ $pattern .= $elt;
+ else $pattern .= str_replace('/', '\/', $elt);
+ }
+ }
+ $this->patterns[$i] = "($pattern)";
+ }
+ $this->regex = "/" . implode("|", $this->patterns) . "/" . $this->getPerlMatchingFlags();
+ }
+ return $this->regex;
+ }
+
+ /**
+ * Accessor for perl regex mode flags to use.
+ * @return string Perl regex flags.
+ */
+ protected function getPerlMatchingFlags()
+ {
+ return ($this->case ? "msS" : "msSi");
+ }
+}
diff --git a/inc/Parsing/Lexer/StateStack.php b/inc/Parsing/Lexer/StateStack.php
new file mode 100644
index 000000000..325412bb4
--- /dev/null
+++ b/inc/Parsing/Lexer/StateStack.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Lexer adapted from Simple Test: http://sourceforge.net/projects/simpletest/
+ * For an intro to the Lexer see:
+ * https://web.archive.org/web/20120125041816/http://www.phppatterns.com/docs/develop/simple_test_lexer_notes
+ *
+ * @author Marcus Baker http://www.lastcraft.com
+ */
+
+namespace dokuwiki\Parsing\Lexer;
+
+/**
+ * States for a stack machine.
+ */
+class StateStack
+{
+ protected $stack;
+
+ /**
+ * Constructor. Starts in named state.
+ * @param string $start Starting state name.
+ */
+ public function __construct($start)
+ {
+ $this->stack = array($start);
+ }
+
+ /**
+ * Accessor for current state.
+ * @return string State.
+ */
+ public function getCurrent()
+ {
+ return $this->stack[count($this->stack) - 1];
+ }
+
+ /**
+ * Adds a state to the stack and sets it to be the current state.
+ *
+ * @param string $state New state.
+ */
+ public function enter($state)
+ {
+ array_push($this->stack, $state);
+ }
+
+ /**
+ * Leaves the current state and reverts
+ * to the previous one.
+ * @return boolean false if we attempt to drop off the bottom of the list.
+ */
+ public function leave()
+ {
+ if (count($this->stack) == 1) {
+ return false;
+ }
+ array_pop($this->stack);
+ return true;
+ }
+}
diff --git a/inc/Parsing/Parser.php b/inc/Parsing/Parser.php
new file mode 100644
index 000000000..63f014161
--- /dev/null
+++ b/inc/Parsing/Parser.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace dokuwiki\Parsing;
+
+use Doku_Handler;
+use dokuwiki\Parsing\Lexer\Lexer;
+use dokuwiki\Parsing\ParserMode\Base;
+use dokuwiki\Parsing\ParserMode\ModeInterface;
+
+/**
+ * Sets up the Lexer with modes and points it to the Handler
+ * For an intro to the Lexer see: wiki:parser
+ */
+class Parser {
+
+ /** @var Doku_Handler */
+ protected $handler;
+
+ /** @var Lexer $lexer */
+ protected $lexer;
+
+ /** @var ModeInterface[] $modes */
+ protected $modes = array();
+
+ /** @var bool mode connections may only be set up once */
+ protected $connected = false;
+
+ /**
+ * dokuwiki\Parsing\Doku_Parser constructor.
+ *
+ * @param Doku_Handler $handler
+ */
+ public function __construct(Doku_Handler $handler) {
+ $this->handler = $handler;
+ }
+
+ /**
+ * Adds the base mode and initialized the lexer
+ *
+ * @param Base $BaseMode
+ */
+ protected function addBaseMode($BaseMode) {
+ $this->modes['base'] = $BaseMode;
+ if(!$this->lexer) {
+ $this->lexer = new Lexer($this->handler, 'base', true);
+ }
+ $this->modes['base']->Lexer = $this->lexer;
+ }
+
+ /**
+ * Add a new syntax element (mode) to the parser
+ *
+ * PHP preserves order of associative elements
+ * Mode sequence is important
+ *
+ * @param string $name
+ * @param ModeInterface $Mode
+ */
+ public function addMode($name, ModeInterface $Mode) {
+ if(!isset($this->modes['base'])) {
+ $this->addBaseMode(new Base());
+ }
+ $Mode->Lexer = $this->lexer; // FIXME should be done by setter
+ $this->modes[$name] = $Mode;
+ }
+
+ /**
+ * Connect all modes with each other
+ *
+ * This is the last step before actually parsing.
+ */
+ protected function connectModes() {
+
+ if($this->connected) {
+ return;
+ }
+
+ foreach(array_keys($this->modes) as $mode) {
+ // Base isn't connected to anything
+ if($mode == 'base') {
+ continue;
+ }
+ $this->modes[$mode]->preConnect();
+
+ foreach(array_keys($this->modes) as $cm) {
+
+ if($this->modes[$cm]->accepts($mode)) {
+ $this->modes[$mode]->connectTo($cm);
+ }
+
+ }
+
+ $this->modes[$mode]->postConnect();
+ }
+
+ $this->connected = true;
+ }
+
+ /**
+ * Parses wiki syntax to instructions
+ *
+ * @param string $doc the wiki syntax text
+ * @return array instructions
+ */
+ public function parse($doc) {
+ $this->connectModes();
+ // Normalize CRs and pad doc
+ $doc = "\n" . str_replace("\r\n", "\n", $doc) . "\n";
+ $this->lexer->parse($doc);
+
+ if (!method_exists($this->handler, 'finalize')) {
+ /** @deprecated 2019-10 we have a legacy handler from a plugin, assume legacy _finalize exists */
+
+ \dokuwiki\Debug\DebugHelper::dbgCustomDeprecationEvent(
+ 'finalize()',
+ get_class($this->handler) . '::_finalize()',
+ __METHOD__,
+ __FILE__,
+ __LINE__
+ );
+ $this->handler->_finalize();
+ } else {
+ $this->handler->finalize();
+ }
+ return $this->handler->calls;
+ }
+
+}
diff --git a/inc/Parsing/ParserMode/AbstractMode.php b/inc/Parsing/ParserMode/AbstractMode.php
new file mode 100644
index 000000000..15fc9fe04
--- /dev/null
+++ b/inc/Parsing/ParserMode/AbstractMode.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+/**
+ * This class and all the subclasses below are used to reduce the effort required to register
+ * modes with the Lexer.
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ */
+abstract class AbstractMode implements ModeInterface
+{
+ /** @var \dokuwiki\Parsing\Lexer\Lexer $Lexer will be injected on loading FIXME this should be done by setter */
+ public $Lexer;
+ protected $allowedModes = array();
+
+ /** @inheritdoc */
+ abstract public function getSort();
+
+ /** @inheritdoc */
+ public function preConnect()
+ {
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ }
+
+ /** @inheritdoc */
+ public function accepts($mode)
+ {
+ return in_array($mode, (array) $this->allowedModes);
+ }
+}
diff --git a/inc/Parsing/ParserMode/Acronym.php b/inc/Parsing/ParserMode/Acronym.php
new file mode 100644
index 000000000..b42a7b573
--- /dev/null
+++ b/inc/Parsing/ParserMode/Acronym.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Acronym extends AbstractMode
+{
+ // A list
+ protected $acronyms = array();
+ protected $pattern = '';
+
+ /**
+ * Acronym constructor.
+ *
+ * @param string[] $acronyms
+ */
+ public function __construct($acronyms)
+ {
+ usort($acronyms, array($this,'compare'));
+ $this->acronyms = $acronyms;
+ }
+
+ /** @inheritdoc */
+ public function preConnect()
+ {
+ if (!count($this->acronyms)) return;
+
+ $bound = '[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]';
+ $acronyms = array_map(['\\dokuwiki\\Parsing\\Lexer\\Lexer', 'escape'], $this->acronyms);
+ $this->pattern = '(?<=^|'.$bound.')(?:'.join('|', $acronyms).')(?='.$bound.')';
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ if (!count($this->acronyms)) return;
+
+ if (strlen($this->pattern) > 0) {
+ $this->Lexer->addSpecialPattern($this->pattern, $mode, 'acronym');
+ }
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 240;
+ }
+
+ /**
+ * sort callback to order by string length descending
+ *
+ * @param string $a
+ * @param string $b
+ *
+ * @return int
+ */
+ protected function compare($a, $b)
+ {
+ $a_len = strlen($a);
+ $b_len = strlen($b);
+ if ($a_len > $b_len) {
+ return -1;
+ } elseif ($a_len < $b_len) {
+ return 1;
+ }
+
+ return 0;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Base.php b/inc/Parsing/ParserMode/Base.php
new file mode 100644
index 000000000..562275600
--- /dev/null
+++ b/inc/Parsing/ParserMode/Base.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Base extends AbstractMode
+{
+
+ /**
+ * Base constructor.
+ */
+ public function __construct()
+ {
+ global $PARSER_MODES;
+
+ $this->allowedModes = array_merge(
+ $PARSER_MODES['container'],
+ $PARSER_MODES['baseonly'],
+ $PARSER_MODES['paragraphs'],
+ $PARSER_MODES['formatting'],
+ $PARSER_MODES['substition'],
+ $PARSER_MODES['protected'],
+ $PARSER_MODES['disabled']
+ );
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 0;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Camelcaselink.php b/inc/Parsing/ParserMode/Camelcaselink.php
new file mode 100644
index 000000000..ef0b32531
--- /dev/null
+++ b/inc/Parsing/ParserMode/Camelcaselink.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Camelcaselink extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addSpecialPattern(
+ '\b[A-Z]+[a-z]+[A-Z][A-Za-z]*\b',
+ $mode,
+ 'camelcaselink'
+ );
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 290;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Code.php b/inc/Parsing/ParserMode/Code.php
new file mode 100644
index 000000000..aa494377d
--- /dev/null
+++ b/inc/Parsing/ParserMode/Code.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Code extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addEntryPattern('<code\b(?=.*</code>)', $mode, 'code');
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ $this->Lexer->addExitPattern('</code>', 'code');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 200;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Emaillink.php b/inc/Parsing/ParserMode/Emaillink.php
new file mode 100644
index 000000000..f9af28c66
--- /dev/null
+++ b/inc/Parsing/ParserMode/Emaillink.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Emaillink extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ // pattern below is defined in inc/mail.php
+ $this->Lexer->addSpecialPattern('<'.PREG_PATTERN_VALID_EMAIL.'>', $mode, 'emaillink');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 340;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Entity.php b/inc/Parsing/ParserMode/Entity.php
new file mode 100644
index 000000000..b670124b2
--- /dev/null
+++ b/inc/Parsing/ParserMode/Entity.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+use dokuwiki\Parsing\Lexer\Lexer;
+
+class Entity extends AbstractMode
+{
+
+ protected $entities = array();
+ protected $pattern = '';
+
+ /**
+ * Entity constructor.
+ * @param string[] $entities
+ */
+ public function __construct($entities)
+ {
+ $this->entities = $entities;
+ }
+
+
+ /** @inheritdoc */
+ public function preConnect()
+ {
+ if (!count($this->entities) || $this->pattern != '') return;
+
+ $sep = '';
+ foreach ($this->entities as $entity) {
+ $this->pattern .= $sep. Lexer::escape($entity);
+ $sep = '|';
+ }
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ if (!count($this->entities)) return;
+
+ if (strlen($this->pattern) > 0) {
+ $this->Lexer->addSpecialPattern($this->pattern, $mode, 'entity');
+ }
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 260;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Eol.php b/inc/Parsing/ParserMode/Eol.php
new file mode 100644
index 000000000..a5886b51f
--- /dev/null
+++ b/inc/Parsing/ParserMode/Eol.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Eol extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $badModes = array('listblock','table');
+ if (in_array($mode, $badModes)) {
+ return;
+ }
+ // see FS#1652, pattern extended to swallow preceding whitespace to avoid
+ // issues with lines that only contain whitespace
+ $this->Lexer->addSpecialPattern('(?:^[ \t]*)?\n', $mode, 'eol');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 370;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Externallink.php b/inc/Parsing/ParserMode/Externallink.php
new file mode 100644
index 000000000..747574595
--- /dev/null
+++ b/inc/Parsing/ParserMode/Externallink.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Externallink extends AbstractMode
+{
+ protected $schemes = array();
+ protected $patterns = array();
+
+ /** @inheritdoc */
+ public function preConnect()
+ {
+ if (count($this->patterns)) return;
+
+ $ltrs = '\w';
+ $gunk = '/\#~:.?+=&%@!\-\[\]';
+ $punc = '.:?\-;,';
+ $host = $ltrs.$punc;
+ $any = $ltrs.$gunk.$punc;
+
+ $this->schemes = getSchemes();
+ foreach ($this->schemes as $scheme) {
+ $this->patterns[] = '\b(?i)'.$scheme.'(?-i)://['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
+ }
+
+ $this->patterns[] = '(?<=\s)(?i)www?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
+ $this->patterns[] = '(?<=\s)(?i)ftp?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+
+ foreach ($this->patterns as $pattern) {
+ $this->Lexer->addSpecialPattern($pattern, $mode, 'externallink');
+ }
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 330;
+ }
+}
diff --git a/inc/Parsing/ParserMode/File.php b/inc/Parsing/ParserMode/File.php
new file mode 100644
index 000000000..149134135
--- /dev/null
+++ b/inc/Parsing/ParserMode/File.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class File extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addEntryPattern('<file\b(?=.*</file>)', $mode, 'file');
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ $this->Lexer->addExitPattern('</file>', 'file');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 210;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Filelink.php b/inc/Parsing/ParserMode/Filelink.php
new file mode 100644
index 000000000..3cd86cb8b
--- /dev/null
+++ b/inc/Parsing/ParserMode/Filelink.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Filelink extends AbstractMode
+{
+
+ protected $pattern;
+
+ /** @inheritdoc */
+ public function preConnect()
+ {
+
+ $ltrs = '\w';
+ $gunk = '/\#~:.?+=&%@!\-';
+ $punc = '.:?\-;,';
+ $host = $ltrs.$punc;
+ $any = $ltrs.$gunk.$punc;
+
+ $this->pattern = '\b(?i)file(?-i)://['.$any.']+?['.
+ $punc.']*[^'.$any.']';
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addSpecialPattern(
+ $this->pattern,
+ $mode,
+ 'filelink'
+ );
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 360;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Footnote.php b/inc/Parsing/ParserMode/Footnote.php
new file mode 100644
index 000000000..c399f9849
--- /dev/null
+++ b/inc/Parsing/ParserMode/Footnote.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Footnote extends AbstractMode
+{
+
+ /**
+ * Footnote constructor.
+ */
+ public function __construct()
+ {
+ global $PARSER_MODES;
+
+ $this->allowedModes = array_merge(
+ $PARSER_MODES['container'],
+ $PARSER_MODES['formatting'],
+ $PARSER_MODES['substition'],
+ $PARSER_MODES['protected'],
+ $PARSER_MODES['disabled']
+ );
+
+ unset($this->allowedModes[array_search('footnote', $this->allowedModes)]);
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addEntryPattern(
+ '\x28\x28(?=.*\x29\x29)',
+ $mode,
+ 'footnote'
+ );
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ $this->Lexer->addExitPattern(
+ '\x29\x29',
+ 'footnote'
+ );
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 150;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Formatting.php b/inc/Parsing/ParserMode/Formatting.php
new file mode 100644
index 000000000..a3c465cc0
--- /dev/null
+++ b/inc/Parsing/ParserMode/Formatting.php
@@ -0,0 +1,115 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+/**
+ * This class sets the markup for bold (=strong),
+ * italic (=emphasis), underline etc.
+ */
+class Formatting extends AbstractMode
+{
+ protected $type;
+
+ protected $formatting = array(
+ 'strong' => array(
+ 'entry' => '\*\*(?=.*\*\*)',
+ 'exit' => '\*\*',
+ 'sort' => 70
+ ),
+
+ 'emphasis' => array(
+ 'entry' => '//(?=[^\x00]*[^:])', //hack for bugs #384 #763 #1468
+ 'exit' => '//',
+ 'sort' => 80
+ ),
+
+ 'underline' => array(
+ 'entry' => '__(?=.*__)',
+ 'exit' => '__',
+ 'sort' => 90
+ ),
+
+ 'monospace' => array(
+ 'entry' => '\x27\x27(?=.*\x27\x27)',
+ 'exit' => '\x27\x27',
+ 'sort' => 100
+ ),
+
+ 'subscript' => array(
+ 'entry' => '<sub>(?=.*</sub>)',
+ 'exit' => '</sub>',
+ 'sort' => 110
+ ),
+
+ 'superscript' => array(
+ 'entry' => '<sup>(?=.*</sup>)',
+ 'exit' => '</sup>',
+ 'sort' => 120
+ ),
+
+ 'deleted' => array(
+ 'entry' => '<del>(?=.*</del>)',
+ 'exit' => '</del>',
+ 'sort' => 130
+ ),
+ );
+
+ /**
+ * @param string $type
+ */
+ public function __construct($type)
+ {
+ global $PARSER_MODES;
+
+ if (!array_key_exists($type, $this->formatting)) {
+ trigger_error('Invalid formatting type ' . $type, E_USER_WARNING);
+ }
+
+ $this->type = $type;
+
+ // formatting may contain other formatting but not it self
+ $modes = $PARSER_MODES['formatting'];
+ $key = array_search($type, $modes);
+ if (is_int($key)) {
+ unset($modes[$key]);
+ }
+
+ $this->allowedModes = array_merge(
+ $modes,
+ $PARSER_MODES['substition'],
+ $PARSER_MODES['disabled']
+ );
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+
+ // Can't nest formatting in itself
+ if ($mode == $this->type) {
+ return;
+ }
+
+ $this->Lexer->addEntryPattern(
+ $this->formatting[$this->type]['entry'],
+ $mode,
+ $this->type
+ );
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+
+ $this->Lexer->addExitPattern(
+ $this->formatting[$this->type]['exit'],
+ $this->type
+ );
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return $this->formatting[$this->type]['sort'];
+ }
+}
diff --git a/inc/Parsing/ParserMode/Header.php b/inc/Parsing/ParserMode/Header.php
new file mode 100644
index 000000000..854b3178c
--- /dev/null
+++ b/inc/Parsing/ParserMode/Header.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Header extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ //we're not picky about the closing ones, two are enough
+ $this->Lexer->addSpecialPattern(
+ '[ \t]*={2,}[^\n]+={2,}[ \t]*(?=\n)',
+ $mode,
+ 'header'
+ );
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 50;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Hr.php b/inc/Parsing/ParserMode/Hr.php
new file mode 100644
index 000000000..e4f0b444b
--- /dev/null
+++ b/inc/Parsing/ParserMode/Hr.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Hr extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addSpecialPattern('\n[ \t]*-{4,}[ \t]*(?=\n)', $mode, 'hr');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 160;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Html.php b/inc/Parsing/ParserMode/Html.php
new file mode 100644
index 000000000..f5b63ef09
--- /dev/null
+++ b/inc/Parsing/ParserMode/Html.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Html extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addEntryPattern('<html>(?=.*</html>)', $mode, 'html');
+ $this->Lexer->addEntryPattern('<HTML>(?=.*</HTML>)', $mode, 'htmlblock');
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ $this->Lexer->addExitPattern('</html>', 'html');
+ $this->Lexer->addExitPattern('</HTML>', 'htmlblock');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 190;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Internallink.php b/inc/Parsing/ParserMode/Internallink.php
new file mode 100644
index 000000000..6def0d9a3
--- /dev/null
+++ b/inc/Parsing/ParserMode/Internallink.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Internallink extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ // Word boundaries?
+ $this->Lexer->addSpecialPattern("\[\[.*?\]\](?!\])", $mode, 'internallink');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 300;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Linebreak.php b/inc/Parsing/ParserMode/Linebreak.php
new file mode 100644
index 000000000..dd95cc383
--- /dev/null
+++ b/inc/Parsing/ParserMode/Linebreak.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Linebreak extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addSpecialPattern('\x5C{2}(?:[ \t]|(?=\n))', $mode, 'linebreak');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 140;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Listblock.php b/inc/Parsing/ParserMode/Listblock.php
new file mode 100644
index 000000000..eef762777
--- /dev/null
+++ b/inc/Parsing/ParserMode/Listblock.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Listblock extends AbstractMode
+{
+
+ /**
+ * Listblock constructor.
+ */
+ public function __construct()
+ {
+ global $PARSER_MODES;
+
+ $this->allowedModes = array_merge(
+ $PARSER_MODES['formatting'],
+ $PARSER_MODES['substition'],
+ $PARSER_MODES['disabled'],
+ $PARSER_MODES['protected']
+ );
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addEntryPattern('[ \t]*\n {2,}[\-\*]', $mode, 'listblock');
+ $this->Lexer->addEntryPattern('[ \t]*\n\t{1,}[\-\*]', $mode, 'listblock');
+
+ $this->Lexer->addPattern('\n {2,}[\-\*]', 'listblock');
+ $this->Lexer->addPattern('\n\t{1,}[\-\*]', 'listblock');
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ $this->Lexer->addExitPattern('\n', 'listblock');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 10;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Media.php b/inc/Parsing/ParserMode/Media.php
new file mode 100644
index 000000000..f93f94773
--- /dev/null
+++ b/inc/Parsing/ParserMode/Media.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Media extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ // Word boundaries?
+ $this->Lexer->addSpecialPattern("\{\{(?:[^\}]|(?:\}[^\}]))+\}\}", $mode, 'media');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 320;
+ }
+}
diff --git a/inc/Parsing/ParserMode/ModeInterface.php b/inc/Parsing/ParserMode/ModeInterface.php
new file mode 100644
index 000000000..7cca0385f
--- /dev/null
+++ b/inc/Parsing/ParserMode/ModeInterface.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+/**
+ * Defines a mode (syntax component) in the Parser
+ */
+interface ModeInterface
+{
+ /**
+ * returns a number used to determine in which order modes are added
+ *
+ * @return int;
+ */
+ public function getSort();
+
+ /**
+ * Called before any calls to connectTo
+ *
+ * @return void
+ */
+ public function preConnect();
+
+ /**
+ * Connects the mode
+ *
+ * @param string $mode
+ * @return void
+ */
+ public function connectTo($mode);
+
+ /**
+ * Called after all calls to connectTo
+ *
+ * @return void
+ */
+ public function postConnect();
+
+ /**
+ * Check if given mode is accepted inside this mode
+ *
+ * @param string $mode
+ * @return bool
+ */
+ public function accepts($mode);
+}
diff --git a/inc/Parsing/ParserMode/Multiplyentity.php b/inc/Parsing/ParserMode/Multiplyentity.php
new file mode 100644
index 000000000..89df136df
--- /dev/null
+++ b/inc/Parsing/ParserMode/Multiplyentity.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+/**
+ * Implements the 640x480 replacement
+ */
+class Multiplyentity extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+
+ $this->Lexer->addSpecialPattern(
+ '(?<=\b)(?:[1-9]|\d{2,})[xX]\d+(?=\b)',
+ $mode,
+ 'multiplyentity'
+ );
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 270;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Nocache.php b/inc/Parsing/ParserMode/Nocache.php
new file mode 100644
index 000000000..fa6db8305
--- /dev/null
+++ b/inc/Parsing/ParserMode/Nocache.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Nocache extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addSpecialPattern('~~NOCACHE~~', $mode, 'nocache');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 40;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Notoc.php b/inc/Parsing/ParserMode/Notoc.php
new file mode 100644
index 000000000..5956207c1
--- /dev/null
+++ b/inc/Parsing/ParserMode/Notoc.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Notoc extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addSpecialPattern('~~NOTOC~~', $mode, 'notoc');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 30;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Php.php b/inc/Parsing/ParserMode/Php.php
new file mode 100644
index 000000000..914648b51
--- /dev/null
+++ b/inc/Parsing/ParserMode/Php.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Php extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addEntryPattern('<php>(?=.*</php>)', $mode, 'php');
+ $this->Lexer->addEntryPattern('<PHP>(?=.*</PHP>)', $mode, 'phpblock');
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ $this->Lexer->addExitPattern('</php>', 'php');
+ $this->Lexer->addExitPattern('</PHP>', 'phpblock');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 180;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Plugin.php b/inc/Parsing/ParserMode/Plugin.php
new file mode 100644
index 000000000..c885c6037
--- /dev/null
+++ b/inc/Parsing/ParserMode/Plugin.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+/**
+ * @fixme do we need this anymore or could the syntax plugin inherit directly from abstract mode?
+ */
+abstract class Plugin extends AbstractMode {}
diff --git a/inc/Parsing/ParserMode/Preformatted.php b/inc/Parsing/ParserMode/Preformatted.php
new file mode 100644
index 000000000..7dfc47489
--- /dev/null
+++ b/inc/Parsing/ParserMode/Preformatted.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Preformatted extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ // Has hard coded awareness of lists...
+ $this->Lexer->addEntryPattern('\n (?![\*\-])', $mode, 'preformatted');
+ $this->Lexer->addEntryPattern('\n\t(?![\*\-])', $mode, 'preformatted');
+
+ // How to effect a sub pattern with the Lexer!
+ $this->Lexer->addPattern('\n ', 'preformatted');
+ $this->Lexer->addPattern('\n\t', 'preformatted');
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ $this->Lexer->addExitPattern('\n', 'preformatted');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 20;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Quote.php b/inc/Parsing/ParserMode/Quote.php
new file mode 100644
index 000000000..65525b241
--- /dev/null
+++ b/inc/Parsing/ParserMode/Quote.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Quote extends AbstractMode
+{
+
+ /**
+ * Quote constructor.
+ */
+ public function __construct()
+ {
+ global $PARSER_MODES;
+
+ $this->allowedModes = array_merge(
+ $PARSER_MODES['formatting'],
+ $PARSER_MODES['substition'],
+ $PARSER_MODES['disabled'],
+ $PARSER_MODES['protected']
+ );
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addEntryPattern('\n>{1,}', $mode, 'quote');
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ $this->Lexer->addPattern('\n>{1,}', 'quote');
+ $this->Lexer->addExitPattern('\n', 'quote');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 220;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Quotes.php b/inc/Parsing/ParserMode/Quotes.php
new file mode 100644
index 000000000..13db2e679
--- /dev/null
+++ b/inc/Parsing/ParserMode/Quotes.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Quotes extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ global $conf;
+
+ $ws = '\s/\#~:+=&%@\-\x28\x29\]\[{}><"\''; // whitespace
+ $punc = ';,\.?!';
+
+ if ($conf['typography'] == 2) {
+ $this->Lexer->addSpecialPattern(
+ "(?<=^|[$ws])'(?=[^$ws$punc])",
+ $mode,
+ 'singlequoteopening'
+ );
+ $this->Lexer->addSpecialPattern(
+ "(?<=^|[^$ws]|[$punc])'(?=$|[$ws$punc])",
+ $mode,
+ 'singlequoteclosing'
+ );
+ $this->Lexer->addSpecialPattern(
+ "(?<=^|[^$ws$punc])'(?=$|[^$ws$punc])",
+ $mode,
+ 'apostrophe'
+ );
+ }
+
+ $this->Lexer->addSpecialPattern(
+ "(?<=^|[$ws])\"(?=[^$ws$punc])",
+ $mode,
+ 'doublequoteopening'
+ );
+ $this->Lexer->addSpecialPattern(
+ "\"",
+ $mode,
+ 'doublequoteclosing'
+ );
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 280;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Rss.php b/inc/Parsing/ParserMode/Rss.php
new file mode 100644
index 000000000..a62d9b807
--- /dev/null
+++ b/inc/Parsing/ParserMode/Rss.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Rss extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addSpecialPattern("\{\{rss>[^\}]+\}\}", $mode, 'rss');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 310;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Smiley.php b/inc/Parsing/ParserMode/Smiley.php
new file mode 100644
index 000000000..084ccc9ed
--- /dev/null
+++ b/inc/Parsing/ParserMode/Smiley.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+use dokuwiki\Parsing\Lexer\Lexer;
+
+class Smiley extends AbstractMode
+{
+ protected $smileys = array();
+ protected $pattern = '';
+
+ /**
+ * Smiley constructor.
+ * @param string[] $smileys
+ */
+ public function __construct($smileys)
+ {
+ $this->smileys = $smileys;
+ }
+
+ /** @inheritdoc */
+ public function preConnect()
+ {
+ if (!count($this->smileys) || $this->pattern != '') return;
+
+ $sep = '';
+ foreach ($this->smileys as $smiley) {
+ $this->pattern .= $sep.'(?<=\W|^)'. Lexer::escape($smiley).'(?=\W|$)';
+ $sep = '|';
+ }
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ if (!count($this->smileys)) return;
+
+ if (strlen($this->pattern) > 0) {
+ $this->Lexer->addSpecialPattern($this->pattern, $mode, 'smiley');
+ }
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 230;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Table.php b/inc/Parsing/ParserMode/Table.php
new file mode 100644
index 000000000..b4b512380
--- /dev/null
+++ b/inc/Parsing/ParserMode/Table.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Table extends AbstractMode
+{
+
+ /**
+ * Table constructor.
+ */
+ public function __construct()
+ {
+ global $PARSER_MODES;
+
+ $this->allowedModes = array_merge(
+ $PARSER_MODES['formatting'],
+ $PARSER_MODES['substition'],
+ $PARSER_MODES['disabled'],
+ $PARSER_MODES['protected']
+ );
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addEntryPattern('[\t ]*\n\^', $mode, 'table');
+ $this->Lexer->addEntryPattern('[\t ]*\n\|', $mode, 'table');
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ $this->Lexer->addPattern('\n\^', 'table');
+ $this->Lexer->addPattern('\n\|', 'table');
+ $this->Lexer->addPattern('[\t ]*:::[\t ]*(?=[\|\^])', 'table');
+ $this->Lexer->addPattern('[\t ]+', 'table');
+ $this->Lexer->addPattern('\^', 'table');
+ $this->Lexer->addPattern('\|', 'table');
+ $this->Lexer->addExitPattern('\n', 'table');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 60;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Unformatted.php b/inc/Parsing/ParserMode/Unformatted.php
new file mode 100644
index 000000000..1bc2826e6
--- /dev/null
+++ b/inc/Parsing/ParserMode/Unformatted.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Unformatted extends AbstractMode
+{
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addEntryPattern('<nowiki>(?=.*</nowiki>)', $mode, 'unformatted');
+ $this->Lexer->addEntryPattern('%%(?=.*%%)', $mode, 'unformattedalt');
+ }
+
+ /** @inheritdoc */
+ public function postConnect()
+ {
+ $this->Lexer->addExitPattern('</nowiki>', 'unformatted');
+ $this->Lexer->addExitPattern('%%', 'unformattedalt');
+ $this->Lexer->mapHandler('unformattedalt', 'unformatted');
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 170;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Windowssharelink.php b/inc/Parsing/ParserMode/Windowssharelink.php
new file mode 100644
index 000000000..747d4d8a9
--- /dev/null
+++ b/inc/Parsing/ParserMode/Windowssharelink.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+class Windowssharelink extends AbstractMode
+{
+
+ protected $pattern;
+
+ /** @inheritdoc */
+ public function preConnect()
+ {
+ $this->pattern = "\\\\\\\\\w+?(?:\\\\[\w\-$]+)+";
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ $this->Lexer->addSpecialPattern(
+ $this->pattern,
+ $mode,
+ 'windowssharelink'
+ );
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 350;
+ }
+}
diff --git a/inc/Parsing/ParserMode/Wordblock.php b/inc/Parsing/ParserMode/Wordblock.php
new file mode 100644
index 000000000..50b24b2db
--- /dev/null
+++ b/inc/Parsing/ParserMode/Wordblock.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace dokuwiki\Parsing\ParserMode;
+
+use dokuwiki\Parsing\Lexer\Lexer;
+
+/**
+ * @fixme is this actually used?
+ */
+class Wordblock extends AbstractMode
+{
+ protected $badwords = array();
+ protected $pattern = '';
+
+ /**
+ * Wordblock constructor.
+ * @param $badwords
+ */
+ public function __construct($badwords)
+ {
+ $this->badwords = $badwords;
+ }
+
+ /** @inheritdoc */
+ public function preConnect()
+ {
+
+ if (count($this->badwords) == 0 || $this->pattern != '') {
+ return;
+ }
+
+ $sep = '';
+ foreach ($this->badwords as $badword) {
+ $this->pattern .= $sep.'(?<=\b)(?i)'. Lexer::escape($badword).'(?-i)(?=\b)';
+ $sep = '|';
+ }
+ }
+
+ /** @inheritdoc */
+ public function connectTo($mode)
+ {
+ if (strlen($this->pattern) > 0) {
+ $this->Lexer->addSpecialPattern($this->pattern, $mode, 'wordblock');
+ }
+ }
+
+ /** @inheritdoc */
+ public function getSort()
+ {
+ return 250;
+ }
+}
diff --git a/inc/PassHash.class.php b/inc/PassHash.php
index 3d03c1e05..1189da0b7 100644
--- a/inc/PassHash.class.php
+++ b/inc/PassHash.php
@@ -1,10 +1,15 @@
<?php
+// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
+
+namespace dokuwiki;
+
/**
* Password Hashing Class
*
* This class implements various mechanisms used to hash passwords
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
* @license LGPL2
*/
class PassHash {
@@ -16,17 +21,24 @@ class PassHash {
* match true is is returned else false
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
*
* @param string $clear Clear-Text password
* @param string $hash Hash to compare against
* @return bool
*/
- function verify_hash($clear, $hash) {
+ public function verify_hash($clear, $hash) {
$method = '';
$salt = '';
$magic = '';
//determine the used method and salt
+ if (substr($hash, 0, 2) == 'U$') {
+ // This may be an updated password from user_update_7000(). Such hashes
+ // have 'U' added as the first character and need an extra md5().
+ $hash = substr($hash, 1);
+ $clear = md5($clear);
+ }
$len = strlen($hash);
if(preg_match('/^\$1\$([^\$]{0,8})\$/', $hash, $m)) {
$method = 'smd5';
@@ -36,6 +48,10 @@ class PassHash {
$method = 'apr1';
$salt = $m[1];
$magic = 'apr1';
+ } elseif(preg_match('/^\$S\$(.{52})$/', $hash, $m)) {
+ $method = 'drupal_sha512';
+ $salt = $m[1];
+ $magic = 'S';
} elseif(preg_match('/^\$P\$(.{31})$/', $hash, $m)) {
$method = 'pmd5';
$salt = $m[1];
@@ -51,6 +67,13 @@ class PassHash {
'iter' => $m[2],
);
$salt = $m[3];
+ } elseif(preg_match('/^PBKDF2(SHA\d+)\$(\d+)\$([[:xdigit:]]+)\$([[:xdigit:]]+)$/', $hash, $m)) {
+ $method = 'seafilepbkdf2';
+ $magic = array(
+ 'algo' => $m[1],
+ 'iter' => $m[2],
+ );
+ $salt = $m[3];
} elseif(preg_match('/^sha1\$(.{5})\$/', $hash, $m)) {
$method = 'djangosha1';
$salt = $m[1];
@@ -69,9 +92,15 @@ class PassHash {
} elseif(preg_match('/^:B:(.+?):.{32}$/', $hash, $m)) {
$method = 'mediawiki';
$salt = $m[1];
- } elseif(preg_match('/^\$6\$(.+?)\$/', $hash, $m)) {
+ } elseif(preg_match('/^\$6\$(rounds=\d+)?\$?(.+?)\$/', $hash, $m)) {
$method = 'sha512';
- $salt = $m[1];
+ $salt = $m[2];
+ $magic = $m[1];
+ } elseif(preg_match('/^\$(argon2id?)/', $hash, $m)) {
+ if(!defined('PASSWORD_'.strtoupper($m[1]))) {
+ throw new \Exception('This PHP installation has no '.strtoupper($m[1]).' support');
+ }
+ return password_verify($clear,$hash);
} elseif($len == 32) {
$method = 'md5';
} elseif($len == 40) {
@@ -201,7 +230,7 @@ class PassHash {
$text .= substr($bin, 0, min(16, $i));
}
for($i = $len; $i > 0; $i >>= 1) {
- $text .= ($i & 1) ? chr(0) : $clear{0};
+ $text .= ($i & 1) ? chr(0) : $clear[0];
}
$bin = pack("H32", md5($text));
for($i = 0; $i < 1000; $i++) {
@@ -338,35 +367,42 @@ class PassHash {
}
/**
- * Password hashing method 'pmd5'
+ * Password stretched hashing wrapper.
*
- * Uses salted MD5 hashs. Salt is 1+8 bytes long, 1st byte is the
- * iteration count when given, for null salts $compute is used.
+ * Initial hash is repeatedly rehashed with same password.
+ * Any salted hash algorithm supported by PHP hash() can be used. Salt
+ * is 1+8 bytes long, 1st byte is the iteration count when given. For null
+ * salts $compute is used.
*
- * The actual iteration count is the given count squared, maximum is
- * 30 (-> 1073741824). If a higher one is given, the function throws
- * an exception.
+ * The actual iteration count is 2 to the power of the given count,
+ * maximum is 30 (-> 2^30 = 1_073_741_824). If a higher one is given,
+ * the function throws an exception.
+ * This iteration count is expected to grow with increasing power of
+ * new computers.
*
- * @link http://www.openwall.com/phpass/
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+ * @link http://www.openwall.com/phpass/
*
+ * @param string $algo The hash algorithm to be 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
- * @throws Exception
+ * @throws \Exception
* @return string Hashed password
*/
- public function hash_pmd5($clear, $salt = null, $magic = 'P', $compute = 8) {
+ protected function stretched_hash($algo, $clear, $salt = null, $magic = 'P', $compute = 8) {
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
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
+ $iterc = $salt[0]; // pos 0 of salt is log2(iteration count)
$iter = strpos($itoa64, $iterc);
if($iter > 30) {
- throw new Exception("Too high iteration count ($iter) in ".
+ throw new \Exception("Too high iteration count ($iter) in ".
__CLASS__.'::'.__FUNCTION__);
}
@@ -374,14 +410,14 @@ class PassHash {
$salt = substr($salt, 1, 8);
// iterate
- $hash = md5($salt.$clear, true);
+ $hash = hash($algo, $salt . $clear, TRUE);
do {
- $hash = md5($hash.$clear, true);
+ $hash = hash($algo, $hash.$clear, true);
} while(--$iter);
// encode
$output = '';
- $count = 16;
+ $count = strlen($hash);
$i = 0;
do {
$value = ord($hash[$i++]);
@@ -403,6 +439,49 @@ class PassHash {
}
/**
+ * Password hashing method 'pmd5'
+ *
+ * Repeatedly uses salted MD5 hashs. See stretched_hash() for the
+ * details.
+ *
+ *
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+ * @link http://www.openwall.com/phpass/
+ * @see PassHash::stretched_hash() for the implementation details.
+ *
+ * @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) {
+ return $this->stretched_hash('md5', $clear, $salt, $magic, $compute);
+ }
+
+ /**
+ * Password hashing method 'drupal_sha512'
+ *
+ * Implements Drupal salted sha512 hashs. Drupal truncates the hash at 55
+ * characters. See stretched_hash() for the details;
+ *
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+ * @link https://api.drupal.org/api/drupal/includes%21password.inc/7.x
+ * @see PassHash::stretched_hash() for the implementation details.
+ *
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @param string $magic The hash identifier (S)
+ * @param int $compute The iteration count for new passwords (defautl is drupal 7's)
+ * @throws Exception
+ * @return string Hashed password
+ */
+ public function hash_drupal_sha512($clear, $salt = null, $magic = 'S', $compute = 15) {
+ return substr($this->stretched_hash('sha512', $clear, $salt, $magic, $compute), 0, 55);
+ }
+
+ /**
* Alias for hash_pmd5
*
* @param string $clear
@@ -411,6 +490,7 @@ class PassHash {
* @param int $compute
*
* @return string
+ * @throws \Exception
*/
public function hash_hmd5($clear, $salt = null, $magic = 'H', $compute = 8) {
return $this->hash_pmd5($clear, $salt, $magic, $compute);
@@ -451,6 +531,47 @@ class PassHash {
}
/**
+ * Password hashing method 'seafilepbkdf2'
+ *
+ * An algorithm and iteration count should be given in the opts array.
+ *
+ * Hash algorithm is the string that is in the password string in seafile
+ * database. It has to be converted to a php algo name.
+ *
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+ * @see https://stackoverflow.com/a/23670177
+ *
+ * @param string $clear The clear text to hash
+ * @param string $salt The salt to use, null for random
+ * @param array $opts ('algo' => hash algorithm, 'iter' => iterations)
+ * @return string Hashed password
+ * @throws Exception when PHP is missing support for the method/algo
+ */
+ public function hash_seafilepbkdf2($clear, $salt=null, $opts=array()) {
+ $this->init_salt($salt, 64);
+ if(empty($opts['algo'])) {
+ $prefixalgo='SHA256';
+ } else {
+ $prefixalgo=$opts['algo'];
+ }
+ $algo = strtolower($prefixalgo);
+ if(empty($opts['iter'])) {
+ $iter = 10000;
+ } else {
+ $iter = (int) $opts['iter'];
+ }
+ if(!function_exists('hash_pbkdf2')) {
+ throw new Exception('This PHP installation has no PBKDF2 support');
+ }
+ if(!in_array($algo, hash_algos())) {
+ throw new Exception("This PHP installation has no $algo support");
+ }
+
+ $hash = hash_pbkdf2($algo, $clear, hex2bin($salt), $iter, 0);
+ return "PBKDF2$prefixalgo\$$iter\$$salt\$$hash";
+ }
+
+ /**
* Password hashing method 'djangopbkdf2'
*
* An algorithm and iteration count should be given in the opts array.
@@ -460,7 +581,7 @@ class PassHash {
* @param string $salt The salt to use, null for random
* @param array $opts ('algo' => hash algorithm, 'iter' => iterations)
* @return string Hashed password
- * @throws Exception when PHP is missing support for the method/algo
+ * @throws \Exception when PHP is missing support for the method/algo
*/
public function hash_djangopbkdf2($clear, $salt=null, $opts=array()) {
$this->init_salt($salt, 12);
@@ -475,10 +596,10 @@ class PassHash {
$iter = (int) $opts['iter'];
}
if(!function_exists('hash_pbkdf2')) {
- throw new Exception('This PHP installation has no PBKDF2 support');
+ throw new \Exception('This PHP installation has no PBKDF2 support');
}
if(!in_array($algo, hash_algos())) {
- throw new Exception("This PHP installation has no $algo support");
+ throw new \Exception("This PHP installation has no $algo support");
}
$hash = base64_encode(hash_pbkdf2($algo, $clear, $salt, $iter, 0, true));
@@ -492,7 +613,7 @@ class PassHash {
* @param string $salt The salt to use, null for random
* @param array $opts ('iter' => iterations)
* @return string Hashed password
- * @throws Exception when PHP is missing support for the method/algo
+ * @throws \Exception when PHP is missing support for the method/algo
*/
public function hash_djangopbkdf2_sha256($clear, $salt=null, $opts=array()) {
$opts['algo'] = 'sha256';
@@ -506,7 +627,7 @@ class PassHash {
* @param string $salt The salt to use, null for random
* @param array $opts ('iter' => iterations)
* @return string Hashed password
- * @throws Exception when PHP is missing support for the method/algo
+ * @throws \Exception when PHP is missing support for the method/algo
*/
public function hash_djangopbkdf2_sha1($clear, $salt=null, $opts=array()) {
$opts['algo'] = 'sha1';
@@ -527,12 +648,12 @@ class PassHash {
* @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
+ * @throws \Exception
* @return string Hashed password
*/
public function hash_bcrypt($clear, $salt = null, $compute = 10) {
if(!defined('CRYPT_BLOWFISH') || CRYPT_BLOWFISH != 1) {
- throw new Exception('This PHP installation has no bcrypt support');
+ throw new \Exception('This PHP installation has no bcrypt support');
}
if(is_null($salt)) {
@@ -552,15 +673,20 @@ class PassHash {
*
* @param string $clear The clear text to hash
* @param string $salt The salt to use, null for random
+ * @param string $magic The rounds for sha512 (for example "rounds=3000"), null for default value
* @return string Hashed password
- * @throws Exception
+ * @throws \Exception
*/
- public function hash_sha512($clear, $salt = null) {
+ public function hash_sha512($clear, $salt = null, $magic = null) {
if(!defined('CRYPT_SHA512') || CRYPT_SHA512 != 1) {
- throw new Exception('This PHP installation has no SHA512 support');
+ throw new \Exception('This PHP installation has no SHA512 support');
}
$this->init_salt($salt, 8, false);
- return crypt($clear, '$6$'.$salt.'$');
+ if(empty($magic)) {
+ return crypt($clear, '$6$'.$salt.'$');
+ }else{
+ return crypt($clear, '$6$'.$magic.'$'.$salt.'$');
+ }
}
/**
@@ -580,6 +706,43 @@ class PassHash {
return ':B:'.$salt.':'.md5($salt.'-'.md5($clear));
}
+
+ /**
+ * Password hashing method 'argon2i'
+ *
+ * Uses php's own password_hash function to create argon2i password hash
+ * Default Cost and thread options are used for now.
+ *
+ * @link https://www.php.net/manual/de/function.password-hash.php
+ *
+ * @param string $clear The clear text to hash
+ * @return string Hashed password
+ */
+ public function hash_argon2i($clear) {
+ if(!defined('PASSWORD_ARGON2I')) {
+ throw new \Exception('This PHP installation has no ARGON2I support');
+ }
+ return password_hash($clear,PASSWORD_ARGON2I);
+ }
+
+ /**
+ * Password hashing method 'argon2id'
+ *
+ * Uses php's own password_hash function to create argon2id password hash
+ * Default Cost and thread options are used for now.
+ *
+ * @link https://www.php.net/manual/de/function.password-hash.php
+ *
+ * @param string $clear The clear text to hash
+ * @return string Hashed password
+ */
+ public function hash_argon2id($clear) {
+ if(!defined('PASSWORD_ARGON2ID')) {
+ throw new \Exception('This PHP installation has no ARGON2ID support');
+ }
+ return password_hash($clear,PASSWORD_ARGON2ID);
+ }
+
/**
* Wraps around native hash_hmac() or reimplents it
*
@@ -627,13 +790,19 @@ class PassHash {
}
/**
- * Use DokuWiki's secure random generator if available
+ * Use a secure random generator
*
* @param int $min
* @param int $max
* @return int
*/
protected function random($min, $max){
- return random_int($min, $max);
+ try {
+ return random_int($min, $max);
+ } catch (\Exception $e) {
+ // availability of random source is checked elsewhere in DokuWiki
+ // we demote this to an unchecked runtime exception here
+ throw new \RuntimeException($e->getMessage(), $e->getCode(), $e);
+ }
}
}
diff --git a/inc/Plugin.php b/inc/Plugin.php
deleted file mode 100644
index 9cd0ae805..000000000
--- a/inc/Plugin.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * DokuWiki Plugin
- *
- * Most of DokuWiki's plugin types simply inherit from this. All it does is
- * add the DokuWiki_PluginTrait to the class.
- */
-class DokuWiki_Plugin implements DokuWiki_PluginInterface {
- use DokuWiki_PluginTrait;
-}
diff --git a/inc/Remote/AccessDeniedException.php b/inc/Remote/AccessDeniedException.php
new file mode 100644
index 000000000..65f668930
--- /dev/null
+++ b/inc/Remote/AccessDeniedException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace dokuwiki\Remote;
+
+/**
+ * Class AccessDeniedException
+ */
+class AccessDeniedException extends RemoteException
+{
+}
diff --git a/inc/remote.php b/inc/Remote/Api.php
index 2d2e327c8..3b526564d 100644
--- a/inc/remote.php
+++ b/inc/Remote/Api.php
@@ -1,9 +1,9 @@
<?php
-if (!defined('DOKU_INC')) die();
+namespace dokuwiki\Remote;
-class RemoteException extends Exception {}
-class RemoteAccessDeniedException extends RemoteException {}
+use dokuwiki\Extension\Event;
+use dokuwiki\Extension\RemotePlugin;
/**
* This class provides information about remote access to the wiki.
@@ -33,19 +33,18 @@ class RemoteAccessDeniedException extends RemoteException {}
*
* plugin methods are formed like 'plugin.<plugin name>.<method name>'.
* i.e.: plugin.clock.getTime or plugin.clock_gmt.getTime
- *
- * @throws RemoteException
*/
-class RemoteAPI {
+class Api
+{
/**
- * @var RemoteAPICore
+ * @var ApiCore
*/
private $coreMethods = null;
/**
* @var array remote methods provided by dokuwiki plugins - will be filled lazy via
- * {@see RemoteAPI#getPluginMethods}
+ * {@see dokuwiki\Remote\RemoteAPI#getPluginMethods}
*/
private $pluginMethods = null;
@@ -63,7 +62,8 @@ class RemoteAPI {
/**
* constructor
*/
- public function __construct() {
+ public function __construct()
+ {
$this->dateTransformation = array($this, 'dummyTransformation');
$this->fileTransformation = array($this, 'dummyTransformation');
}
@@ -72,8 +72,10 @@ class RemoteAPI {
* Get all available methods with remote access.
*
* @return array with information to all available methods
+ * @throws RemoteException
*/
- public function getMethods() {
+ public function getMethods()
+ {
return array_merge($this->getCoreMethods(), $this->getPluginMethods());
}
@@ -83,8 +85,10 @@ class RemoteAPI {
* @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.
+ * @throws RemoteException
*/
- public function call($method, $args = array()) {
+ public function call($method, $args = array())
+ {
if ($args === null) {
$args = array();
}
@@ -104,7 +108,8 @@ class RemoteAPI {
* @param string $name name of the method
* @return bool if method exists
*/
- private function coreMethodExist($name) {
+ private function coreMethodExist($name)
+ {
$coreMethods = $this->getCoreMethods();
return array_key_exists($name, $coreMethods);
}
@@ -113,11 +118,12 @@ class RemoteAPI {
* Try to call custom methods provided by plugins
*
* @param string $method name of method
- * @param array $args
+ * @param array $args
* @return mixed
* @throws RemoteException if method not exists
*/
- private function callCustomCallPlugin($method, $args) {
+ private function callCustomCallPlugin($method, $args)
+ {
$customCalls = $this->getCustomCallPlugins();
if (!array_key_exists($method, $customCalls)) {
throw new RemoteException('Method does not exist', -32603);
@@ -132,10 +138,11 @@ class RemoteAPI {
* @return array with pairs of custom plugin calls
* @triggers RPC_CALL_ADD
*/
- private function getCustomCallPlugins() {
+ private function getCustomCallPlugins()
+ {
if ($this->pluginCustomCalls === null) {
$data = array();
- trigger_event('RPC_CALL_ADD', $data);
+ Event::createAndTrigger('RPC_CALL_ADD', $data);
$this->pluginCustomCalls = $data;
}
return $this->pluginCustomCalls;
@@ -146,11 +153,12 @@ class RemoteAPI {
*
* @param string $pluginName
* @param string $method method name
- * @param array $args
+ * @param array $args
* @return mixed return of custom method
* @throws RemoteException
*/
- private function callPlugin($pluginName, $method, $args) {
+ private function callPlugin($pluginName, $method, $args)
+ {
$plugin = plugin_load('remote', $pluginName);
$methods = $this->getPluginMethods();
if (!$plugin) {
@@ -158,36 +166,53 @@ class RemoteAPI {
}
$this->checkAccess($methods[$method]);
$name = $this->getMethodName($methods, $method);
- return call_user_func_array(array($plugin, $name), $args);
+ try {
+ set_error_handler(array($this, "argumentWarningHandler"), E_WARNING); // for PHP <7.1
+ return call_user_func_array(array($plugin, $name), $args);
+ } catch (\ArgumentCountError $th) {
+ throw new RemoteException('Method does not exist - wrong parameter count.', -32603);
+ } finally {
+ restore_error_handler();
+ }
}
/**
* Call a core method
*
* @param string $method name of method
- * @param array $args
+ * @param array $args
* @return mixed
* @throws RemoteException if method not exist
*/
- private function callCoreMethod($method, $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);
+ try {
+ set_error_handler(array($this, "argumentWarningHandler"), E_WARNING); // for PHP <7.1
+ return call_user_func_array(array($this->coreMethods, $this->getMethodName($coreMethods, $method)), $args);
+ } catch (\ArgumentCountError $th) {
+ throw new RemoteException('Method does not exist - wrong parameter count.', -32603);
+ } finally {
+ restore_error_handler();
+ }
}
/**
* Check if access should be checked
*
* @param array $methodMeta data about the method
+ * @throws AccessDeniedException
*/
- private function checkAccess($methodMeta) {
+ private function checkAccess($methodMeta)
+ {
if (!isset($methodMeta['public'])) {
$this->forceAccess();
- } else{
+ } else {
if ($methodMeta['public'] == '0') {
$this->forceAccess();
}
@@ -201,7 +226,8 @@ class RemoteAPI {
* @param array $args
* @throws RemoteException if wrong parameter count
*/
- private function checkArgumentLength($methodMeta, $args) {
+ private function checkArgumentLength($methodMeta, $args)
+ {
if (count($methodMeta['args']) < count($args)) {
throw new RemoteException('Method does not exist - wrong parameter count.', -32603);
}
@@ -214,36 +240,38 @@ class RemoteAPI {
* @param string $method name of method
* @return string
*/
- private function getMethodName($methodMeta, $method) {
+ private function getMethodName($methodMeta, $method)
+ {
if (isset($methodMeta[$method]['name'])) {
return $methodMeta[$method]['name'];
}
$method = explode('.', $method);
- return $method[count($method)-1];
+ return $method[count($method) - 1];
}
/**
* Perform access check for current user
*
* @return bool true if the current user has access to remote api.
- * @throws RemoteAccessDeniedException If remote access disabled
+ * @throws AccessDeniedException If remote access disabled
*/
- public function hasAccess() {
+ public function hasAccess()
+ {
global $conf;
global $USERINFO;
- /** @var Input $INPUT */
+ /** @var \dokuwiki\Input\Input $INPUT */
global $INPUT;
if (!$conf['remote']) {
- throw new RemoteAccessDeniedException('server error. RPC server not enabled.',-32604); //should not be here,just throw
+ throw new AccessDeniedException('server error. RPC server not enabled.', -32604);
}
- if(trim($conf['remoteuser']) == '!!not set!!') {
+ if (trim($conf['remoteuser']) == '!!not set!!') {
return false;
}
- if(!$conf['useacl']) {
+ if (!$conf['useacl']) {
return true;
}
- if(trim($conf['remoteuser']) == '') {
+ if (trim($conf['remoteuser']) == '') {
return true;
}
@@ -254,11 +282,12 @@ class RemoteAPI {
* Requests access
*
* @return void
- * @throws RemoteException On denied access.
+ * @throws AccessDeniedException On denied access.
*/
- public function forceAccess() {
+ public function forceAccess()
+ {
if (!$this->hasAccess()) {
- throw new RemoteAccessDeniedException('server error. not authorized to call method', -32604);
+ throw new AccessDeniedException('server error. not authorized to call method', -32604);
}
}
@@ -268,19 +297,27 @@ class RemoteAPI {
* @return array all plugin methods.
* @throws RemoteException if not implemented
*/
- public function getPluginMethods() {
+ public function getPluginMethods()
+ {
if ($this->pluginMethods === null) {
$this->pluginMethods = array();
$plugins = plugin_list('remote');
foreach ($plugins as $pluginName) {
- /** @var DokuWiki_Remote_Plugin $plugin */
+ /** @var RemotePlugin $plugin */
$plugin = plugin_load('remote', $pluginName);
- if (!is_subclass_of($plugin, 'DokuWiki_Remote_Plugin')) {
- throw new RemoteException("Plugin $pluginName does not implement DokuWiki_Remote_Plugin");
+ if (!is_subclass_of($plugin, 'dokuwiki\Extension\RemotePlugin')) {
+ throw new RemoteException(
+ "Plugin $pluginName does not implement dokuwiki\Plugin\DokuWiki_Remote_Plugin"
+ );
+ }
+
+ try {
+ $methods = $plugin->_getMethods();
+ } catch (\ReflectionException $e) {
+ throw new RemoteException('Automatic aggregation of available remote methods failed', 0, $e);
}
- $methods = $plugin->_getMethods();
foreach ($methods as $method => $meta) {
$this->pluginMethods["plugin.$pluginName.$method"] = $meta;
}
@@ -292,14 +329,15 @@ class RemoteAPI {
/**
* Collects all the core methods
*
- * @param RemoteAPICore $apiCore this parameter is used for testing. Here you can pass a non-default RemoteAPICore
- * instance. (for mocking)
+ * @param ApiCore $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) {
+ public function getCoreMethods($apiCore = null)
+ {
if ($this->coreMethods === null) {
if ($apiCore === null) {
- $this->coreMethods = new RemoteAPICore($this);
+ $this->coreMethods = new ApiCore($this);
} else {
$this->coreMethods = $apiCore;
}
@@ -313,7 +351,8 @@ class RemoteAPI {
* @param mixed $data
* @return mixed
*/
- public function toFile($data) {
+ public function toFile($data)
+ {
return call_user_func($this->fileTransformation, $data);
}
@@ -323,7 +362,8 @@ class RemoteAPI {
* @param mixed $data
* @return mixed
*/
- public function toDate($data) {
+ public function toDate($data)
+ {
return call_user_func($this->dateTransformation, $data);
}
@@ -333,7 +373,8 @@ class RemoteAPI {
* @param mixed $data
* @return mixed
*/
- public function dummyTransformation($data) {
+ public function dummyTransformation($data)
+ {
return $data;
}
@@ -342,7 +383,8 @@ class RemoteAPI {
*
* @param callback $dateTransformation
*/
- public function setDateTransformation($dateTransformation) {
+ public function setDateTransformation($dateTransformation)
+ {
$this->dateTransformation = $dateTransformation;
}
@@ -351,7 +393,18 @@ class RemoteAPI {
*
* @param callback $fileTransformation
*/
- public function setFileTransformation($fileTransformation) {
+ public function setFileTransformation($fileTransformation)
+ {
$this->fileTransformation = $fileTransformation;
}
+
+ /**
+ * The error handler that catches argument-related warnings
+ */
+ public function argumentWarningHandler($errno, $errstr)
+ {
+ if (substr($errstr, 0, 17) == 'Missing argument ') {
+ throw new RemoteException('Method does not exist - wrong parameter count.', -32603);
+ }
+ }
}
diff --git a/inc/RemoteAPICore.php b/inc/Remote/ApiCore.php
index 0ff358cf9..3aa7861f4 100644
--- a/inc/RemoteAPICore.php
+++ b/inc/Remote/ApiCore.php
@@ -1,22 +1,32 @@
<?php
-/**
- * Increased whenever the API is changed
- */
+namespace dokuwiki\Remote;
+
+use Doku_Renderer_xhtml;
+use dokuwiki\ChangeLog\MediaChangeLog;
+use dokuwiki\ChangeLog\PageChangeLog;
+use dokuwiki\Extension\Event;
+
define('DOKU_API_VERSION', 10);
/**
* Provides the core methods for the remote API.
* The methods are ordered in 'wiki.<method>' and 'dokuwiki.<method>' namespaces
*/
-class RemoteAPICore {
+class ApiCore
+{
+ /** @var int Increased whenever the API is changed */
+ const API_VERSION = 10;
+
+ /** @var Api */
private $api;
/**
- * @param RemoteAPI $api
+ * @param Api $api
*/
- public function __construct(RemoteAPI $api) {
+ public function __construct(Api $api)
+ {
$this->api = $api;
}
@@ -25,7 +35,8 @@ class RemoteAPICore {
*
* @return array
*/
- public function __getRemoteInfo() {
+ public function __getRemoteInfo()
+ {
return array(
'dokuwiki.getVersion' => array(
'args' => array(),
@@ -52,7 +63,7 @@ class RemoteAPICore {
), 'dokuwiki.getTime' => array(
'args' => array(),
'return' => 'int',
- 'doc' => 'Returns the current time at the remote wiki server as Unix timestamp.',
+ 'doc' => 'Returns the current time at the remote wiki server as Unix timestamp.',
), 'dokuwiki.setLocks' => array(
'args' => array('array'),
'return' => 'array',
@@ -66,6 +77,10 @@ class RemoteAPICore {
'args' => array('string', 'string', 'array'),
'return' => 'bool',
'doc' => 'Append text to a wiki page.'
+ ), 'dokuwiki.deleteUsers' => array(
+ 'args' => array('array'),
+ 'return' => 'bool',
+ 'doc' => 'Remove one or more users from the list of registered users.'
), 'wiki.getPage' => array(
'args' => array('string'),
'return' => 'string',
@@ -161,7 +176,7 @@ class RemoteAPICore {
'public' => '1',
), 'wiki.getRPCVersionSupported' => array(
'args' => array(),
- 'name' => 'wiki_RPCVersion',
+ 'name' => 'wikiRpcVersion',
'return' => 'int',
'doc' => 'Returns 2 with the supported RPC API version.',
'public' => '1'
@@ -173,14 +188,16 @@ class RemoteAPICore {
/**
* @return string
*/
- public function getVersion() {
+ public function getVersion()
+ {
return getVersion();
}
/**
* @return int unix timestamp
*/
- public function getTime() {
+ public function getTime()
+ {
return time();
}
@@ -190,15 +207,16 @@ class RemoteAPICore {
* @param string $id wiki page id
* @param int|string $rev revision timestamp of the page or empty string
* @return string page text.
- * @throws RemoteAccessDeniedException if no permission for page
+ * @throws AccessDeniedException if no permission for page
*/
- public function rawPage($id,$rev=''){
+ public 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);
+ if (auth_quickaclcheck($id) < AUTH_READ) {
+ throw new AccessDeniedException('You are not allowed to read this file', 111);
}
- $text = rawWiki($id,$rev);
- if(!$text) {
+ $text = rawWiki($id, $rev);
+ if (!$text) {
return pageTemplate($id);
} else {
return $text;
@@ -212,13 +230,14 @@ class RemoteAPICore {
*
* @param string $id file id
* @return mixed media file
- * @throws RemoteAccessDeniedException no permission for media
+ * @throws AccessDeniedException no permission for media
* @throws RemoteException not exist
*/
- public function getAttachment($id){
+ public 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);
+ if (auth_quickaclcheck(getNS($id) . ':*') < AUTH_READ) {
+ throw new AccessDeniedException('You are not allowed to read this file', 211);
}
$file = mediaFN($id);
@@ -238,7 +257,8 @@ class RemoteAPICore {
* @param string $id page id
* @return array
*/
- public function getAttachmentInfo($id){
+ public function getAttachmentInfo($id)
+ {
$id = cleanID($id);
$info = array(
'lastModified' => $this->api->toDate(0),
@@ -246,15 +266,15 @@ class RemoteAPICore {
);
$file = mediaFN($id);
- if(auth_quickaclcheck(getNS($id) . ':*') >= AUTH_READ) {
- if(file_exists($file)) {
+ if (auth_quickaclcheck(getNS($id) . ':*') >= AUTH_READ) {
+ if (file_exists($file)) {
$info['lastModified'] = $this->api->toDate(filemtime($file));
$info['size'] = filesize($file);
} else {
//Is it deleted media with changelog?
$medialog = new MediaChangeLog($id);
$revisions = $medialog->getRevisions(0, 1);
- if(!empty($revisions)) {
+ if (!empty($revisions)) {
$info['lastModified'] = $this->api->toDate($revisions[0]);
}
}
@@ -266,17 +286,18 @@ class RemoteAPICore {
/**
* Return a wiki page rendered to html
*
- * @param string $id page id
+ * @param string $id page id
* @param string|int $rev revision timestamp or empty string
* @return null|string html
- * @throws RemoteAccessDeniedException no access to page
+ * @throws AccessDeniedException no access to page
*/
- public function htmlPage($id,$rev=''){
+ public 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);
+ if (auth_quickaclcheck($id) < AUTH_READ) {
+ throw new AccessDeniedException('You are not allowed to read this page', 111);
}
- return p_wiki_xhtml($id,$rev,false);
+ return p_wiki_xhtml($id, $rev, false);
}
/**
@@ -284,14 +305,15 @@ class RemoteAPICore {
*
* @return array
*/
- public function listPages(){
- $list = array();
+ public function listPages()
+ {
+ $list = array();
$pages = idx_get_indexer()->getPages();
- $pages = array_filter(array_filter($pages,'isVisiblePage'),'page_exists');
+ $pages = array_filter(array_filter($pages, 'isVisiblePage'), 'page_exists');
- foreach(array_keys($pages) as $idx) {
+ foreach (array_keys($pages) as $idx) {
$perm = auth_quickaclcheck($pages[$idx]);
- if($perm < AUTH_READ) {
+ if ($perm < AUTH_READ) {
continue;
}
$page = array();
@@ -309,15 +331,16 @@ class RemoteAPICore {
* List all pages in the given namespace (and below)
*
* @param string $ns
- * @param array $opts
+ * @param array $opts
* $opts['depth'] recursion level, 0 for all
* $opts['hash'] do md5 sum of content?
* @return array
*/
- public function readNamespace($ns,$opts){
+ public function readNamespace($ns, $opts = array())
+ {
global $conf;
- if(!is_array($opts)) $opts=array();
+ if (!is_array($opts)) $opts = array();
$ns = cleanID($ns);
$dir = utf8_encodeFN(str_replace(':', '/', $ns));
@@ -333,29 +356,30 @@ class RemoteAPICore {
* @param string $query
* @return array
*/
- public function search($query){
+ public function search($query)
+ {
$regex = array();
- $data = ft_pageSearch($query,$regex);
+ $data = ft_pageSearch($query, $regex);
$pages = array();
// prepare additional data
$idx = 0;
- foreach($data as $id => $score){
+ foreach ($data as $id => $score) {
$file = wikiFN($id);
- if($idx < FT_SNIPPET_NUMBER){
- $snippet = ft_snippet($id,$regex);
+ if ($idx < FT_SNIPPET_NUMBER) {
+ $snippet = ft_snippet($id, $regex);
$idx++;
- }else{
+ } else {
$snippet = '';
}
$pages[] = array(
- 'id' => $id,
- 'score' => intval($score),
- 'rev' => filemtime($file),
- 'mtime' => filemtime($file),
- 'size' => filesize($file),
+ '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
);
@@ -368,7 +392,8 @@ class RemoteAPICore {
*
* @return string
*/
- public function getTitle(){
+ public function getTitle()
+ {
global $conf;
return $conf['title'];
}
@@ -383,15 +408,16 @@ class RemoteAPICore {
* @author Gina Haeussge <osd@foosel.net>
*
* @param string $ns
- * @param array $options
+ * @param array $options
* $options['depth'] recursion level, 0 for all
* $options['showmsg'] shows message if invalid media id is used
* $options['pattern'] check given pattern
* $options['hash'] add hashes to result list
* @return array
- * @throws RemoteAccessDeniedException no access to the media files
+ * @throws AccessDeniedException no access to the media files
*/
- public function listAttachments($ns, $options = array()) {
+ public function listAttachments($ns, $options = array())
+ {
global $conf;
$ns = cleanID($ns);
@@ -399,15 +425,15 @@ class RemoteAPICore {
if (!is_array($options)) $options = array();
$options['skipacl'] = 0; // no ACL skipping for XMLRPC
- if(auth_quickaclcheck($ns.':*') >= AUTH_READ) {
+ 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();
+ if (!$len) return array();
- for($i=0; $i<$len; $i++) {
+ for ($i = 0; $i < $len; $i++) {
unset($data[$i]['meta']);
$data[$i]['perms'] = $data[$i]['perm'];
unset($data[$i]['perm']);
@@ -415,7 +441,7 @@ class RemoteAPICore {
}
return $data;
} else {
- throw new RemoteAccessDeniedException('You are not allowed to list media files.', 215);
+ throw new AccessDeniedException('You are not allowed to list media files.', 215);
}
}
@@ -425,33 +451,35 @@ class RemoteAPICore {
* @param string $id page id
* @return array
*/
- function listBackLinks($id){
+ public function listBackLinks($id)
+ {
return ft_backlinks($this->resolvePageId($id));
}
/**
* Return some basic data about a page
*
- * @param string $id page id
+ * @param string $id page id
* @param string|int $rev revision timestamp or empty string
* @return array
- * @throws RemoteAccessDeniedException no access for page
+ * @throws AccessDeniedException no access for page
* @throws RemoteException page not exist
*/
- public function pageInfo($id,$rev=''){
+ public 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);
+ if (auth_quickaclcheck($id) < AUTH_READ) {
+ throw new AccessDeniedException('You are not allowed to read this page', 111);
}
- $file = wikiFN($id,$rev);
+ $file = wikiFN($id, $rev);
$time = @filemtime($file);
- if(!$time){
+ if (!$time) {
throw new RemoteException('The requested page does not exist', 121);
}
// set revision to current version if empty, use revision otherwise
// as the timestamps of old files are not necessarily correct
- if($rev === '') {
+ if ($rev === '') {
$rev = $time;
}
@@ -459,10 +487,10 @@ class RemoteAPICore {
$info = $pagelog->getRevisionInfo($rev);
$data = array(
- 'name' => $id,
+ 'name' => $id,
'lastModified' => $this->api->toDate($rev),
- 'author' => (($info['user']) ? $info['user'] : $info['ip']),
- 'version' => $rev
+ 'author' => is_array($info) ? (($info['user']) ? $info['user'] : $info['ip']) : null,
+ 'version' => $rev
);
return ($data);
@@ -477,53 +505,54 @@ class RemoteAPICore {
* @param string $text wiki text
* @param array $params parameters: summary, minor edit
* @return bool
- * @throws RemoteAccessDeniedException no write access for page
+ * @throws AccessDeniedException no write access for page
* @throws RemoteException no id, empty new page or locked
*/
- public function putPage($id, $text, $params) {
+ public function putPage($id, $text, $params = array())
+ {
global $TEXT;
global $lang;
- $id = $this->resolvePageId($id);
- $TEXT = cleanText($text);
- $sum = $params['sum'];
+ $id = $this->resolvePageId($id);
+ $TEXT = cleanText($text);
+ $sum = $params['sum'];
$minor = $params['minor'];
- if(empty($id)) {
+ if (empty($id)) {
throw new RemoteException('Empty page ID', 131);
}
- if(!page_exists($id) && trim($TEXT) == '' ) {
+ 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);
+ if (auth_quickaclcheck($id) < AUTH_EDIT) {
+ throw new AccessDeniedException('You are not allowed to edit this page', 112);
}
// Check, if page is locked
- if(checklock($id)) {
+ if (checklock($id)) {
throw new RemoteException('The page is currently locked', 133);
}
// SPAM check
- if(checkwordblock()) {
+ if (checkwordblock()) {
throw new RemoteException('Positive wordblock check', 134);
}
// autoset summary on new pages
- if(!page_exists($id) && empty($sum)) {
+ if (!page_exists($id) && empty($sum)) {
$sum = $lang['created'];
}
// autoset summary on deleted pages
- if(page_exists($id) && empty($TEXT) && empty($sum)) {
+ if (page_exists($id) && empty($TEXT) && empty($sum)) {
$sum = $lang['deleted'];
}
lock($id);
- saveWikiText($id,$TEXT,$sum,$minor);
+ saveWikiText($id, $TEXT, $sum, $minor);
unlock($id);
@@ -540,13 +569,34 @@ class RemoteAPICore {
* @param string $text wiki text
* @param array $params such as summary,minor
* @return bool|string
+ * @throws RemoteException
*/
- public function appendPage($id, $text, $params) {
+ public function appendPage($id, $text, $params = array())
+ {
$currentpage = $this->rawPage($id);
if (!is_string($currentpage)) {
return $currentpage;
}
- return $this->putPage($id, $currentpage.$text, $params);
+ return $this->putPage($id, $currentpage . $text, $params);
+ }
+
+ /**
+ * Remove one or more users from the list of registered users
+ *
+ * @param string[] $usernames List of usernames to remove
+ *
+ * @return bool
+ *
+ * @throws AccessDeniedException
+ */
+ public function deleteUsers($usernames)
+ {
+ if (!auth_isadmin()) {
+ throw new AccessDeniedException('Only admins are allowed to delete users', 114);
+ }
+ /** @var \dokuwiki\Extension\AuthPlugin $auth */
+ global $auth;
+ return (bool)$auth->triggerUserMod('delete', array($usernames));
}
/**
@@ -560,17 +610,18 @@ class RemoteAPICore {
* @return false|string
* @throws RemoteException
*/
- public function putAttachment($id, $file, $params) {
+ public function putAttachment($id, $file, $params = array())
+ {
$id = cleanID($id);
- $auth = auth_quickaclcheck(getNS($id).':*');
+ $auth = auth_quickaclcheck(getNS($id) . ':*');
- if(!isset($id)) {
+ if (!isset($id)) {
throw new RemoteException('Filename not given.', 231);
}
global $conf;
- $ftmp = $conf['tmpdir'] . '/' . md5($id.clientIP());
+ $ftmp = $conf['tmpdir'] . '/' . md5($id . clientIP());
// save temporary file
@unlink($ftmp);
@@ -591,17 +642,18 @@ class RemoteAPICore {
*
* @param string $id page id
* @return int
- * @throws RemoteAccessDeniedException no permissions
+ * @throws AccessDeniedException no permissions
* @throws RemoteException file in use or not deleted
*/
- public function deleteAttachment($id){
+ public function deleteAttachment($id)
+ {
$id = cleanID($id);
- $auth = auth_quickaclcheck(getNS($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);
+ throw new AccessDeniedException('You don\'t have permissions to delete files.', 212);
} elseif ($res & DOKU_MEDIA_INUSE) {
throw new RemoteException('File is still referenced', 232);
} else {
@@ -617,17 +669,18 @@ class RemoteAPICore {
* @param array|null $groups array of groups
* @return int permission level
*/
- public function aclCheck($id, $user = null, $groups = null) {
- /** @var DokuWiki_Auth_Plugin $auth */
+ public function aclCheck($id, $user = null, $groups = null)
+ {
+ /** @var \dokuwiki\Extension\AuthPlugin $auth */
global $auth;
$id = $this->resolvePageId($id);
- if($user === null) {
+ if ($user === null) {
return auth_quickaclcheck($id);
} else {
- if($groups === null) {
+ if ($groups === null) {
$userinfo = $auth->getUserData($user);
- if($userinfo === false) {
+ if ($userinfo === false) {
$groups = array();
} else {
$groups = $userinfo['grps'];
@@ -644,44 +697,45 @@ class RemoteAPICore {
*
* @param string $id page id
* @return array
- * @throws RemoteAccessDeniedException no read access for page
+ * @throws AccessDeniedException no read access for page
*/
- public function listLinks($id) {
+ public 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);
+ if (auth_quickaclcheck($id) < AUTH_READ) {
+ throw new AccessDeniedException('You are not allowed to read this page', 111);
}
$links = array();
// resolve page instructions
- $ins = p_cached_instructions(wikiFN($id));
+ $ins = p_cached_instructions(wikiFN($id));
// instantiate new Renderer - needed for interwiki links
$Renderer = new Doku_Renderer_xhtml();
$Renderer->interwiki = getInterwiki();
// parse parse instructions
- foreach($ins as $in) {
+ foreach ($ins as $in) {
$link = array();
- switch($in[0]) {
+ switch ($in[0]) {
case 'internallink':
$link['type'] = 'local';
$link['page'] = $in[1][0];
$link['href'] = wl($in[1][0]);
- array_push($links,$link);
+ array_push($links, $link);
break;
case 'externallink':
$link['type'] = 'extern';
$link['page'] = $in[1][0];
$link['href'] = $in[1][0];
- array_push($links,$link);
+ array_push($links, $link);
break;
case 'interwikilink':
- $url = $Renderer->_resolveInterWiki($in[1][2],$in[1][3]);
+ $url = $Renderer->_resolveInterWiki($in[1][2], $in[1][3]);
$link['type'] = 'extern';
$link['page'] = $url;
$link['href'] = $url;
- array_push($links,$link);
+ array_push($links, $link);
break;
}
}
@@ -699,8 +753,9 @@ class RemoteAPICore {
* @return array
* @throws RemoteException no valid timestamp
*/
- public function getRecentChanges($timestamp) {
- if(strlen($timestamp) != 10) {
+ public function getRecentChanges($timestamp)
+ {
+ if (strlen($timestamp) != 10) {
throw new RemoteException('The provided value is not a valid timestamp', 311);
}
@@ -710,12 +765,12 @@ class RemoteAPICore {
foreach ($recents as $recent) {
$change = array();
- $change['name'] = $recent['id'];
+ $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']));
+ $change['author'] = $recent['user'];
+ $change['version'] = $recent['date'];
+ $change['perms'] = $recent['perms'];
+ $change['size'] = @filesize(wikiFN($recent['id']));
array_push($changes, $change);
}
@@ -737,8 +792,9 @@ class RemoteAPICore {
* @return array
* @throws RemoteException no valid timestamp
*/
- public function getRecentMediaChanges($timestamp) {
- if(strlen($timestamp) != 10)
+ public 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);
@@ -747,12 +803,12 @@ class RemoteAPICore {
foreach ($recents as $recent) {
$change = array();
- $change['name'] = $recent['id'];
+ $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']));
+ $change['author'] = $recent['user'];
+ $change['version'] = $recent['date'];
+ $change['perms'] = $recent['perms'];
+ $change['size'] = @filesize(mediaFN($recent['id']));
array_push($changes, $change);
}
@@ -771,22 +827,26 @@ class RemoteAPICore {
*
* @author Michael Klier <chi@chimeric.de>
*
- * @param string $id page id
- * @param int $first skip the first n changelog lines (0 = from current(if exists), 1 = from 1st old rev, 2 = from 2nd old rev, etc)
+ * @param string $id page id
+ * @param int $first skip the first n changelog lines
+ * 0 = from current(if exists)
+ * 1 = from 1st old rev
+ * 2 = from 2nd old rev, etc
* @return array
- * @throws RemoteAccessDeniedException no read access for page
+ * @throws AccessDeniedException no read access for page
* @throws RemoteException empty id
*/
- public function pageVersions($id, $first) {
+ public function pageVersions($id, $first = 0)
+ {
$id = $this->resolvePageId($id);
- if(auth_quickaclcheck($id) < AUTH_READ) {
- throw new RemoteAccessDeniedException('You are not allowed to read this page', 111);
+ if (auth_quickaclcheck($id) < AUTH_READ) {
+ throw new AccessDeniedException('You are not allowed to read this page', 111);
}
global $conf;
$versions = array();
- if(empty($id)) {
+ if (empty($id)) {
throw new RemoteException('Empty page ID', 131);
}
@@ -796,29 +856,29 @@ class RemoteAPICore {
$pagelog = new PageChangeLog($id);
$revisions = $pagelog->getRevisions($first_rev, $conf['recent']);
- if($first == 0) {
+ if ($first == 0) {
array_unshift($revisions, ''); // include current revision
- if ( count($revisions) > $conf['recent'] ){
+ if (count($revisions) > $conf['recent']) {
array_pop($revisions); // remove extra log entry
}
}
- if(!empty($revisions)) {
- foreach($revisions as $rev) {
- $file = wikiFN($id,$rev);
+ 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){
+ if ($time) {
$pagelog->setChunkSize(1024);
$info = $pagelog->getRevisionInfo($rev ? $rev : $time);
- if(!empty($info)) {
+ if (!empty($info)) {
$data = array();
$data['user'] = $info['user'];
- $data['ip'] = $info['ip'];
+ $data['ip'] = $info['ip'];
$data['type'] = $info['type'];
- $data['sum'] = $info['sum'];
+ $data['sum'] = $info['sum'];
$data['modified'] = $this->api->toDate($info['date']);
$data['version'] = $info['date'];
array_push($versions, $data);
@@ -834,11 +894,11 @@ class RemoteAPICore {
/**
* The version of Wiki RPC API supported
*/
- public function wiki_RPCVersion(){
+ public function wikiRpcVersion()
+ {
return 2;
}
-
/**
* Locks or unlocks a given batch of pages
*
@@ -851,35 +911,36 @@ class RemoteAPICore {
* @param array[] $set list pages with array('lock' => array, 'unlock' => array)
* @return array
*/
- public function setLocks($set){
- $locked = array();
- $lockfail = array();
- $unlocked = array();
+ public function setLocks($set)
+ {
+ $locked = array();
+ $lockfail = array();
+ $unlocked = array();
$unlockfail = array();
- foreach((array) $set['lock'] as $id){
+ foreach ((array) $set['lock'] as $id) {
$id = $this->resolvePageId($id);
- if(auth_quickaclcheck($id) < AUTH_EDIT || checklock($id)){
+ if (auth_quickaclcheck($id) < AUTH_EDIT || checklock($id)) {
$lockfail[] = $id;
- }else{
+ } else {
lock($id);
$locked[] = $id;
}
}
- foreach((array) $set['unlock'] as $id){
+ foreach ((array) $set['unlock'] as $id) {
$id = $this->resolvePageId($id);
- if(auth_quickaclcheck($id) < AUTH_EDIT || !unlock($id)){
+ if (auth_quickaclcheck($id) < AUTH_EDIT || !unlock($id)) {
$unlockfail[] = $id;
- }else{
+ } else {
$unlocked[] = $id;
}
}
return array(
- 'locked' => $locked,
- 'lockfail' => $lockfail,
- 'unlocked' => $unlocked,
+ 'locked' => $locked,
+ 'lockfail' => $lockfail,
+ 'unlocked' => $unlocked,
'unlockfail' => $unlockfail,
);
}
@@ -889,8 +950,9 @@ class RemoteAPICore {
*
* @return int
*/
- public function getAPIVersion(){
- return DOKU_API_VERSION;
+ public function getAPIVersion()
+ {
+ return self::API_VERSION;
}
/**
@@ -900,25 +962,28 @@ class RemoteAPICore {
* @param string $pass
* @return int
*/
- public function login($user,$pass){
+ public function login($user, $pass)
+ {
global $conf;
- /** @var DokuWiki_Auth_Plugin $auth */
+ /** @var \dokuwiki\Extension\AuthPlugin $auth */
global $auth;
- if(!$conf['useacl']) return 0;
- if(!$auth) return 0;
+ 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{
+ $ok = null;
+ if ($auth->canDo('external')) {
+ $ok = $auth->trustExternal($user, $pass, false);
+ }
+ if ($ok === null){
$evdata = array(
- 'user' => $user,
+ 'user' => $user,
'password' => $pass,
- 'sticky' => false,
- 'silent' => true,
+ 'sticky' => false,
+ 'silent' => true,
);
- $ok = trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
+ $ok = Event::createAndTrigger('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
}
session_write_close(); // we're done with the session
@@ -930,11 +995,12 @@ class RemoteAPICore {
*
* @return int
*/
- public function logoff(){
+ public function logoff()
+ {
global $conf;
global $auth;
- if(!$conf['useacl']) return 0;
- if(!$auth) return 0;
+ if (!$conf['useacl']) return 0;
+ if (!$auth) return 0;
auth_logoff();
@@ -947,14 +1013,13 @@ class RemoteAPICore {
* @param string $id page id
* @return string
*/
- private function resolvePageId($id) {
+ private function resolvePageId($id)
+ {
$id = cleanID($id);
- if(empty($id)) {
+ if (empty($id)) {
global $conf;
$id = cleanID($conf['start']);
}
return $id;
}
-
}
-
diff --git a/inc/Remote/RemoteException.php b/inc/Remote/RemoteException.php
new file mode 100644
index 000000000..129a6c240
--- /dev/null
+++ b/inc/Remote/RemoteException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace dokuwiki\Remote;
+
+/**
+ * Class RemoteException
+ */
+class RemoteException extends \Exception
+{
+}
diff --git a/inc/Remote/XmlRpcServer.php b/inc/Remote/XmlRpcServer.php
new file mode 100644
index 000000000..0a16af1cc
--- /dev/null
+++ b/inc/Remote/XmlRpcServer.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace dokuwiki\Remote;
+
+/**
+ * Contains needed wrapper functions and registers all available XMLRPC functions.
+ */
+class XmlRpcServer extends \IXR_Server
+{
+ protected $remote;
+
+ /**
+ * Constructor. Register methods and run Server
+ */
+ public function __construct($wait=false)
+ {
+ $this->remote = new Api();
+ $this->remote->setDateTransformation(array($this, 'toDate'));
+ $this->remote->setFileTransformation(array($this, 'toFile'));
+ parent::__construct(false, false, $wait);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function call($methodname, $args)
+ {
+ try {
+ $result = $this->remote->call($methodname, $args);
+ return $result;
+ } /** @noinspection PhpRedundantCatchClauseInspection */ catch (AccessDeniedException $e) {
+ if (!isset($_SERVER['REMOTE_USER'])) {
+ http_status(401);
+ return new \IXR_Error(-32603, "server error. not authorized to call method $methodname");
+ } else {
+ http_status(403);
+ return new \IXR_Error(-32604, "server error. forbidden to call the method $methodname");
+ }
+ } catch (RemoteException $e) {
+ return new \IXR_Error($e->getCode(), $e->getMessage());
+ }
+ }
+
+ /**
+ * @param string|int $data iso date(yyyy[-]mm[-]dd[ hh:mm[:ss]]) or timestamp
+ * @return \IXR_Date
+ */
+ public function toDate($data)
+ {
+ return new \IXR_Date($data);
+ }
+
+ /**
+ * @param string $data
+ * @return \IXR_Base64
+ */
+ public function toFile($data)
+ {
+ return new \IXR_Base64($data);
+ }
+}
diff --git a/inc/SafeFN.class.php b/inc/SafeFN.class.php
index b9e4a2b2a..c5489b185 100644
--- a/inc/SafeFN.class.php
+++ b/inc/SafeFN.class.php
@@ -45,7 +45,7 @@ class SafeFN {
* @author Christopher Smith <chris@jalakai.co.uk>
*/
public static function encode($filename) {
- return self::unicode_to_safe(utf8_to_unicode($filename));
+ return self::unicodeToSafe(\dokuwiki\Utf8\Unicode::fromUtf8($filename));
}
/**
@@ -74,14 +74,14 @@ class SafeFN {
* @author Christopher Smith <chris@jalakai.co.uk>
*/
public static function decode($filename) {
- return unicode_to_utf8(self::safe_to_unicode(strtolower($filename)));
+ return \dokuwiki\Utf8\Unicode::toUtf8(self::safeToUnicode(strtolower($filename)));
}
- public static function validate_printable_utf8($printable_utf8) {
+ public static function validatePrintableUtf8($printable_utf8) {
return !preg_match('#[\x01-\x1f]#',$printable_utf8);
}
- public static function validate_safe($safe) {
+ public static function validateSafe($safe) {
return !preg_match('#[^'.self::$plain.self::$post_indicator.self::$pre_indicator.']#',$safe);
}
@@ -93,7 +93,7 @@ class SafeFN {
*
* @author Christopher Smith <chris@jalakai.co.uk>
*/
- private static function unicode_to_safe($unicode) {
+ private static function unicodeToSafe($unicode) {
$safe = '';
$converted = false;
@@ -126,7 +126,7 @@ class SafeFN {
*
* @author Christopher Smith <chris@jalakai.co.uk>
*/
- private static function safe_to_unicode($safe) {
+ private static function safeToUnicode($safe) {
$unicode = array();
$split = preg_split('#(?=['.self::$post_indicator.self::$pre_indicator.'])#',$safe,-1,PREG_SPLIT_NO_EMPTY);
diff --git a/inc/Search/Indexer.php b/inc/Search/Indexer.php
new file mode 100644
index 000000000..a29e5b28b
--- /dev/null
+++ b/inc/Search/Indexer.php
@@ -0,0 +1,1214 @@
+<?php
+
+namespace dokuwiki\Search;
+
+use dokuwiki\Extension\Event;
+
+/**
+ * Class that encapsulates operations on the indexer database.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+class Indexer {
+ /**
+ * @var array $pidCache Cache for getPID()
+ */
+ protected $pidCache = array();
+
+ /**
+ * Adds the contents of a page to the fulltext index
+ *
+ * The added text replaces previous words for the same page.
+ * An empty value erases the page.
+ *
+ * @param string $page a page name
+ * @param string $text the body of the page
+ * @return string|boolean the function completed successfully
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public function addPageWords($page, $text) {
+ if (!$this->lock())
+ return "locked";
+
+ // load known documents
+ $pid = $this->getPIDNoLock($page);
+ if ($pid === false) {
+ $this->unlock();
+ return false;
+ }
+
+ $pagewords = array();
+ // get word usage in page
+ $words = $this->getPageWords($text);
+ if ($words === false) {
+ $this->unlock();
+ return false;
+ }
+
+ if (!empty($words)) {
+ foreach (array_keys($words) as $wlen) {
+ $index = $this->getIndex('i', $wlen);
+ foreach ($words[$wlen] as $wid => $freq) {
+ $idx = ($wid<count($index)) ? $index[$wid] : '';
+ $index[$wid] = $this->updateTuple($idx, $pid, $freq);
+ $pagewords[] = "$wlen*$wid";
+ }
+ if (!$this->saveIndex('i', $wlen, $index)) {
+ $this->unlock();
+ return false;
+ }
+ }
+ }
+
+ // Remove obsolete index entries
+ $pageword_idx = $this->getIndexKey('pageword', '', $pid);
+ if ($pageword_idx !== '') {
+ $oldwords = explode(':',$pageword_idx);
+ $delwords = array_diff($oldwords, $pagewords);
+ $upwords = array();
+ foreach ($delwords as $word) {
+ if ($word != '') {
+ list($wlen, $wid) = explode('*', $word);
+ $wid = (int)$wid;
+ $upwords[$wlen][] = $wid;
+ }
+ }
+ foreach ($upwords as $wlen => $widx) {
+ $index = $this->getIndex('i', $wlen);
+ foreach ($widx as $wid) {
+ $index[$wid] = $this->updateTuple($index[$wid], $pid, 0);
+ }
+ $this->saveIndex('i', $wlen, $index);
+ }
+ }
+ // Save the reverse index
+ $pageword_idx = join(':', $pagewords);
+ if (!$this->saveIndexKey('pageword', '', $pid, $pageword_idx)) {
+ $this->unlock();
+ return false;
+ }
+
+ $this->unlock();
+ return true;
+ }
+
+ /**
+ * Split the words in a page and add them to the index.
+ *
+ * @param string $text content of the page
+ * @return array list of word IDs and number of times used
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function getPageWords($text) {
+
+ $tokens = $this->tokenizer($text);
+ $tokens = array_count_values($tokens); // count the frequency of each token
+
+ $words = array();
+ foreach ($tokens as $w=>$c) {
+ $l = wordlen($w);
+ if (isset($words[$l])){
+ $words[$l][$w] = $c + (isset($words[$l][$w]) ? $words[$l][$w] : 0);
+ }else{
+ $words[$l] = array($w => $c);
+ }
+ }
+
+ // arrive here with $words = array(wordlen => array(word => frequency))
+ $word_idx_modified = false;
+ $index = array(); //resulting index
+ foreach (array_keys($words) as $wlen) {
+ $word_idx = $this->getIndex('w', $wlen);
+ foreach ($words[$wlen] as $word => $freq) {
+ $word = (string)$word;
+ $wid = array_search($word, $word_idx, true);
+ if ($wid === false) {
+ $wid = count($word_idx);
+ $word_idx[] = $word;
+ $word_idx_modified = true;
+ }
+ if (!isset($index[$wlen]))
+ $index[$wlen] = array();
+ $index[$wlen][$wid] = $freq;
+ }
+ // save back the word index
+ if ($word_idx_modified && !$this->saveIndex('w', $wlen, $word_idx))
+ return false;
+ }
+
+ return $index;
+ }
+
+ /**
+ * Add/update keys to/of the metadata index.
+ *
+ * Adding new keys does not remove other keys for the page.
+ * An empty value will erase the key.
+ * The $key parameter can be an array to add multiple keys. $value will
+ * not be used if $key is an array.
+ *
+ * @param string $page a page name
+ * @param mixed $key a key string or array of key=>value pairs
+ * @param mixed $value the value or list of values
+ * @return boolean|string the function completed successfully
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Michael Hamann <michael@content-space.de>
+ */
+ public function addMetaKeys($page, $key, $value=null) {
+ if (!is_array($key)) {
+ $key = array($key => $value);
+ } elseif (!is_null($value)) {
+ // $key is array, but $value is not null
+ trigger_error("array passed to addMetaKeys but value is not null", E_USER_WARNING);
+ }
+
+ if (!$this->lock())
+ return "locked";
+
+ // load known documents
+ $pid = $this->getPIDNoLock($page);
+ if ($pid === false) {
+ $this->unlock();
+ return false;
+ }
+
+ // Special handling for titles so the index file is simpler
+ if (array_key_exists('title', $key)) {
+ $value = $key['title'];
+ if (is_array($value)) {
+ $value = $value[0];
+ }
+ $this->saveIndexKey('title', '', $pid, $value);
+ unset($key['title']);
+ }
+
+ foreach ($key as $name => $values) {
+ $metaname = idx_cleanName($name);
+ $this->addIndexKey('metadata', '', $metaname);
+ $metaidx = $this->getIndex($metaname.'_i', '');
+ $metawords = $this->getIndex($metaname.'_w', '');
+ $addwords = false;
+
+ if (!is_array($values)) $values = array($values);
+
+ $val_idx = $this->getIndexKey($metaname.'_p', '', $pid);
+ if ($val_idx !== '') {
+ $val_idx = explode(':', $val_idx);
+ // -1 means remove, 0 keep, 1 add
+ $val_idx = array_combine($val_idx, array_fill(0, count($val_idx), -1));
+ } else {
+ $val_idx = array();
+ }
+
+ foreach ($values as $val) {
+ $val = (string)$val;
+ if ($val !== "") {
+ $id = array_search($val, $metawords, true);
+ if ($id === false) {
+ // didn't find $val, so we'll add it to the end of metawords and create a placeholder in metaidx
+ $id = count($metawords);
+ $metawords[$id] = $val;
+ $metaidx[$id] = '';
+ $addwords = true;
+ }
+ // test if value is already in the index
+ if (isset($val_idx[$id]) && $val_idx[$id] <= 0){
+ $val_idx[$id] = 0;
+ } else { // else add it
+ $val_idx[$id] = 1;
+ }
+ }
+ }
+
+ if ($addwords) {
+ $this->saveIndex($metaname.'_w', '', $metawords);
+ }
+ $vals_changed = false;
+ foreach ($val_idx as $id => $action) {
+ if ($action == -1) {
+ $metaidx[$id] = $this->updateTuple($metaidx[$id], $pid, 0);
+ $vals_changed = true;
+ unset($val_idx[$id]);
+ } elseif ($action == 1) {
+ $metaidx[$id] = $this->updateTuple($metaidx[$id], $pid, 1);
+ $vals_changed = true;
+ }
+ }
+
+ if ($vals_changed) {
+ $this->saveIndex($metaname.'_i', '', $metaidx);
+ $val_idx = implode(':', array_keys($val_idx));
+ $this->saveIndexKey($metaname.'_p', '', $pid, $val_idx);
+ }
+
+ unset($metaidx);
+ unset($metawords);
+ }
+
+ $this->unlock();
+ return true;
+ }
+
+ /**
+ * Rename a page in the search index without changing the indexed content. This function doesn't check if the
+ * old or new name exists in the filesystem. It returns an error if the old page isn't in the page list of the
+ * indexer and it deletes all previously indexed content of the new page.
+ *
+ * @param string $oldpage The old page name
+ * @param string $newpage The new page name
+ * @return string|bool If the page was successfully renamed, can be a message in the case of an error
+ */
+ public function renamePage($oldpage, $newpage) {
+ if (!$this->lock()) return 'locked';
+
+ $pages = $this->getPages();
+
+ $id = array_search($oldpage, $pages, true);
+ if ($id === false) {
+ $this->unlock();
+ return 'page is not in index';
+ }
+
+ $new_id = array_search($newpage, $pages, true);
+ if ($new_id !== false) {
+ // make sure the page is not in the index anymore
+ if ($this->deletePageNoLock($newpage) !== true) {
+ return false;
+ }
+
+ $pages[$new_id] = 'deleted:'.time().rand(0, 9999);
+ }
+
+ $pages[$id] = $newpage;
+
+ // update index
+ if (!$this->saveIndex('page', '', $pages)) {
+ $this->unlock();
+ return false;
+ }
+
+ // reset the pid cache
+ $this->pidCache = array();
+
+ $this->unlock();
+ return true;
+ }
+
+ /**
+ * Renames a meta value in the index. This doesn't change the meta value in the pages, it assumes that all pages
+ * will be updated.
+ *
+ * @param string $key The metadata key of which a value shall be changed
+ * @param string $oldvalue The old value that shall be renamed
+ * @param string $newvalue The new value to which the old value shall be renamed, if exists values will be merged
+ * @return bool|string If renaming the value has been successful, false or error message on error.
+ */
+ public function renameMetaValue($key, $oldvalue, $newvalue) {
+ if (!$this->lock()) return 'locked';
+
+ // change the relation references index
+ $metavalues = $this->getIndex($key, '_w');
+ $oldid = array_search($oldvalue, $metavalues, true);
+ if ($oldid !== false) {
+ $newid = array_search($newvalue, $metavalues, true);
+ if ($newid !== false) {
+ // free memory
+ unset ($metavalues);
+
+ // okay, now we have two entries for the same value. we need to merge them.
+ $indexline = $this->getIndexKey($key.'_i', '', $oldid);
+ if ($indexline != '') {
+ $newindexline = $this->getIndexKey($key.'_i', '', $newid);
+ $pagekeys = $this->getIndex($key.'_p', '');
+ $parts = explode(':', $indexline);
+ foreach ($parts as $part) {
+ list($id, $count) = explode('*', $part);
+ $newindexline = $this->updateTuple($newindexline, $id, $count);
+
+ $keyline = explode(':', $pagekeys[$id]);
+ // remove old meta value
+ $keyline = array_diff($keyline, array($oldid));
+ // add new meta value when not already present
+ if (!in_array($newid, $keyline)) {
+ array_push($keyline, $newid);
+ }
+ $pagekeys[$id] = implode(':', $keyline);
+ }
+ $this->saveIndex($key.'_p', '', $pagekeys);
+ unset($pagekeys);
+ $this->saveIndexKey($key.'_i', '', $oldid, '');
+ $this->saveIndexKey($key.'_i', '', $newid, $newindexline);
+ }
+ } else {
+ $metavalues[$oldid] = $newvalue;
+ if (!$this->saveIndex($key.'_w', '', $metavalues)) {
+ $this->unlock();
+ return false;
+ }
+ }
+ }
+
+ $this->unlock();
+ return true;
+ }
+
+ /**
+ * Remove a page from the index
+ *
+ * Erases entries in all known indexes.
+ *
+ * @param string $page a page name
+ * @return string|boolean the function completed successfully
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ public function deletePage($page) {
+ if (!$this->lock())
+ return "locked";
+
+ $result = $this->deletePageNoLock($page);
+
+ $this->unlock();
+
+ return $result;
+ }
+
+ /**
+ * Remove a page from the index without locking the index, only use this function if the index is already locked
+ *
+ * Erases entries in all known indexes.
+ *
+ * @param string $page a page name
+ * @return boolean the function completed successfully
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function deletePageNoLock($page) {
+ // load known documents
+ $pid = $this->getPIDNoLock($page);
+ if ($pid === false) {
+ return false;
+ }
+
+ // Remove obsolete index entries
+ $pageword_idx = $this->getIndexKey('pageword', '', $pid);
+ if ($pageword_idx !== '') {
+ $delwords = explode(':',$pageword_idx);
+ $upwords = array();
+ foreach ($delwords as $word) {
+ if ($word != '') {
+ list($wlen,$wid) = explode('*', $word);
+ $wid = (int)$wid;
+ $upwords[$wlen][] = $wid;
+ }
+ }
+ foreach ($upwords as $wlen => $widx) {
+ $index = $this->getIndex('i', $wlen);
+ foreach ($widx as $wid) {
+ $index[$wid] = $this->updateTuple($index[$wid], $pid, 0);
+ }
+ $this->saveIndex('i', $wlen, $index);
+ }
+ }
+ // Save the reverse index
+ if (!$this->saveIndexKey('pageword', '', $pid, "")) {
+ return false;
+ }
+
+ $this->saveIndexKey('title', '', $pid, "");
+ $keyidx = $this->getIndex('metadata', '');
+ foreach ($keyidx as $metaname) {
+ $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);
+ $this->saveIndexKey($metaname.'_p', '', $pid, '');
+ }
+
+ return true;
+ }
+
+ /**
+ * Clear the whole index
+ *
+ * @return bool If the index has been cleared successfully
+ */
+ public function clear() {
+ global $conf;
+
+ if (!$this->lock()) return false;
+
+ @unlink($conf['indexdir'].'/page.idx');
+ @unlink($conf['indexdir'].'/title.idx');
+ @unlink($conf['indexdir'].'/pageword.idx');
+ @unlink($conf['indexdir'].'/metadata.idx');
+ $dir = @opendir($conf['indexdir']);
+ if($dir!==false){
+ while(($f = readdir($dir)) !== false){
+ if(substr($f,-4)=='.idx' &&
+ (substr($f,0,1)=='i' || substr($f,0,1)=='w'
+ || substr($f,-6)=='_w.idx' || substr($f,-6)=='_i.idx' || substr($f,-6)=='_p.idx'))
+ @unlink($conf['indexdir']."/$f");
+ }
+ }
+ @unlink($conf['indexdir'].'/lengths.idx');
+
+ // clear the pid cache
+ $this->pidCache = array();
+
+ $this->unlock();
+ return true;
+ }
+
+ /**
+ * Split the text into words for fulltext search
+ *
+ * TODO: does this also need &$stopwords ?
+ *
+ * @triggers INDEXER_TEXT_PREPARE
+ * This event allows plugins to modify the text before it gets tokenized.
+ * Plugins intercepting this event should also intercept INDEX_VERSION_GET
+ *
+ * @param string $text plain text
+ * @param boolean $wc are wildcards allowed?
+ * @return array list of words in the text
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public function tokenizer($text, $wc=false) {
+ $wc = ($wc) ? '' : '\*';
+ $stopwords =& idx_get_stopwords();
+
+ // prepare the text to be tokenized
+ $evt = new Event('INDEXER_TEXT_PREPARE', $text);
+ if ($evt->advise_before(true)) {
+ if (preg_match('/[^0-9A-Za-z ]/u', $text)) {
+ $text = \dokuwiki\Utf8\Asian::separateAsianWords($text);
+ }
+ }
+ $evt->advise_after();
+ unset($evt);
+
+ $text = strtr($text,
+ array(
+ "\r" => ' ',
+ "\n" => ' ',
+ "\t" => ' ',
+ "\xC2\xAD" => '', //soft-hyphen
+ )
+ );
+ if (preg_match('/[^0-9A-Za-z ]/u', $text))
+ $text = \dokuwiki\Utf8\Clean::stripspecials($text, ' ', '\._\-:'.$wc);
+
+ $wordlist = explode(' ', $text);
+ foreach ($wordlist as $i => $word) {
+ $wordlist[$i] = (preg_match('/[^0-9A-Za-z]/u', $word)) ?
+ \dokuwiki\Utf8\PhpString::strtolower($word) : strtolower($word);
+ }
+
+ foreach ($wordlist as $i => $word) {
+ if ((!is_numeric($word) && strlen($word) < IDX_MINWORDLENGTH)
+ || array_search($word, $stopwords, true) !== false)
+ unset($wordlist[$i]);
+ }
+ return array_values($wordlist);
+ }
+
+ /**
+ * Get the numeric PID of a page
+ *
+ * @param string $page The page to get the PID for
+ * @return bool|int The page id on success, false on error
+ */
+ public function getPID($page) {
+ // return PID without locking when it is in the cache
+ if (isset($this->pidCache[$page])) return $this->pidCache[$page];
+
+ if (!$this->lock())
+ return false;
+
+ // load known documents
+ $pid = $this->getPIDNoLock($page);
+ if ($pid === false) {
+ $this->unlock();
+ return false;
+ }
+
+ $this->unlock();
+ return $pid;
+ }
+
+ /**
+ * Get the numeric PID of a page without locking the index.
+ * Only use this function when the index is already locked.
+ *
+ * @param string $page The page to get the PID for
+ * @return bool|int The page id on success, false on error
+ */
+ protected function getPIDNoLock($page) {
+ // avoid expensive addIndexKey operation for the most recently requested pages by using a cache
+ if (isset($this->pidCache[$page])) return $this->pidCache[$page];
+ $pid = $this->addIndexKey('page', '', $page);
+ // limit cache to 10 entries by discarding the oldest element as in DokuWiki usually only the most recently
+ // added item will be requested again
+ if (count($this->pidCache) > 10) array_shift($this->pidCache);
+ $this->pidCache[$page] = $pid;
+ return $pid;
+ }
+
+ /**
+ * Get the page id of a numeric PID
+ *
+ * @param int $pid The PID to get the page id for
+ * @return string The page id
+ */
+ public function getPageFromPID($pid) {
+ return $this->getIndexKey('page', '', $pid);
+ }
+
+ /**
+ * Find pages in the fulltext index containing the words,
+ *
+ * The search words must be pre-tokenized, meaning only letters and
+ * numbers with an optional wildcard
+ *
+ * The returned array will have the original tokens as key. The values
+ * 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 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>
+ */
+ public function lookup(&$tokens) {
+ $result = array();
+ $wids = $this->getIndexWords($tokens, $result);
+ if (empty($wids)) return array();
+ // load known words and documents
+ $page_idx = $this->getIndex('page', '');
+ $docs = array();
+ foreach (array_keys($wids) as $wlen) {
+ $wids[$wlen] = array_unique($wids[$wlen]);
+ $index = $this->getIndex('i', $wlen);
+ foreach($wids[$wlen] as $ixid) {
+ if ($ixid < count($index))
+ $docs["$wlen*$ixid"] = $this->parseTuples($page_idx, $index[$ixid]);
+ }
+ }
+ // merge found pages into final result array
+ $final = array();
+ foreach ($result as $word => $res) {
+ $final[$word] = array();
+ foreach ($res as $wid) {
+ // handle the case when ($ixid < count($index)) has been false
+ // and thus $docs[$wid] hasn't been set.
+ if (!isset($docs[$wid])) continue;
+ $hits = &$docs[$wid];
+ foreach ($hits as $hitkey => $hitcnt) {
+ // make sure the document still exists
+ if (!page_exists($hitkey, '', false)) continue;
+ if (!isset($final[$word][$hitkey]))
+ $final[$word][$hitkey] = $hitcnt;
+ else
+ $final[$word][$hitkey] += $hitcnt;
+ }
+ }
+ }
+ return $final;
+ }
+
+ /**
+ * Find pages containing a metadata key.
+ *
+ * The metadata values are compared as case-sensitive strings. Pass a
+ * callback function that returns true or false to use a different
+ * comparison function. The function will be called with the $value being
+ * searched for as the first argument, and the word in the index as the
+ * second argument. The function preg_match can be used directly if the
+ * values are regexes.
+ *
+ * @param string $key name of the metadata key to look for
+ * @param string $value search term to look for, must be a string or array of strings
+ * @param callback $func comparison function
+ * @return array lists with page names, keys are query values if $value is array
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Michael Hamann <michael@content-space.de>
+ */
+ public function lookupKey($key, &$value, $func=null) {
+ if (!is_array($value))
+ $value_array = array($value);
+ else
+ $value_array =& $value;
+
+ // the matching ids for the provided value(s)
+ $value_ids = array();
+
+ $metaname = idx_cleanName($key);
+
+ // get all words in order to search the matching ids
+ if ($key == 'title') {
+ $words = $this->getIndex('title', '');
+ } else {
+ $words = $this->getIndex($metaname.'_w', '');
+ }
+
+ if (!is_null($func)) {
+ foreach ($value_array as $val) {
+ foreach ($words as $i => $word) {
+ if (call_user_func_array($func, array($val, $word)))
+ $value_ids[$i][] = $val;
+ }
+ }
+ } else {
+ foreach ($value_array as $val) {
+ $xval = $val;
+ $caret = '^';
+ $dollar = '$';
+ // check for wildcards
+ if (substr($xval, 0, 1) == '*') {
+ $xval = substr($xval, 1);
+ $caret = '';
+ }
+ if (substr($xval, -1, 1) == '*') {
+ $xval = substr($xval, 0, -1);
+ $dollar = '';
+ }
+ if (!$caret || !$dollar) {
+ $re = $caret.preg_quote($xval, '/').$dollar;
+ foreach(array_keys(preg_grep('/'.$re.'/', $words)) as $i)
+ $value_ids[$i][] = $val;
+ } else {
+ if (($i = array_search($val, $words, true)) !== false)
+ $value_ids[$i][] = $val;
+ }
+ }
+ }
+
+ unset($words); // free the used memory
+
+ // initialize the result so it won't be null
+ $result = array();
+ foreach ($value_array as $val) {
+ $result[$val] = array();
+ }
+
+ $page_idx = $this->getIndex('page', '');
+
+ // Special handling for titles
+ if ($key == 'title') {
+ foreach ($value_ids as $pid => $val_list) {
+ $page = $page_idx[$pid];
+ foreach ($val_list as $val) {
+ $result[$val][] = $page;
+ }
+ }
+ } else {
+ // load all lines and pages so the used lines can be taken and matched with the pages
+ $lines = $this->getIndex($metaname.'_i', '');
+
+ foreach ($value_ids as $value_id => $val_list) {
+ // parse the tuples of the form page_id*1:page2_id*1 and so on, return value
+ // is an array with page_id => 1, page2_id => 1 etc. so take the keys only
+ $pages = array_keys($this->parseTuples($page_idx, $lines[$value_id]));
+ foreach ($val_list as $val) {
+ $result[$val] = array_merge($result[$val], $pages);
+ }
+ }
+ }
+ if (!is_array($value)) $result = $result[$value];
+ return $result;
+ }
+
+ /**
+ * Find the index ID of each search term.
+ *
+ * The query terms should only contain valid characters, with a '*' at
+ * either the beginning or end of the word (or both).
+ * The $result parameter can be used to merge the index locations with
+ * the appropriate query term.
+ *
+ * @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) {
+ $tokens = array();
+ $tokenlength = array();
+ $tokenwild = array();
+ foreach ($words as $word) {
+ $result[$word] = array();
+ $caret = '^';
+ $dollar = '$';
+ $xword = $word;
+ $wlen = wordlen($word);
+
+ // check for wildcards
+ if (substr($xword, 0, 1) == '*') {
+ $xword = substr($xword, 1);
+ $caret = '';
+ $wlen -= 1;
+ }
+ if (substr($xword, -1, 1) == '*') {
+ $xword = substr($xword, 0, -1);
+ $dollar = '';
+ $wlen -= 1;
+ }
+ if ($wlen < IDX_MINWORDLENGTH && $caret && $dollar && !is_numeric($xword))
+ continue;
+ if (!isset($tokens[$xword]))
+ $tokenlength[$wlen][] = $xword;
+ if (!$caret || !$dollar) {
+ $re = $caret.preg_quote($xword, '/').$dollar;
+ $tokens[$xword][] = array($word, '/'.$re.'/');
+ if (!isset($tokenwild[$xword]))
+ $tokenwild[$xword] = $wlen;
+ } else {
+ $tokens[$xword][] = array($word, null);
+ }
+ }
+ asort($tokenwild);
+ // $tokens = array( base word => array( [ query term , regexp ] ... ) ... )
+ // $tokenlength = array( base word length => base word ... )
+ // $tokenwild = array( base word => base word length ... )
+ $length_filter = empty($tokenwild) ? $tokenlength : min(array_keys($tokenlength));
+ $indexes_known = $this->indexLengths($length_filter);
+ if (!empty($tokenwild)) sort($indexes_known);
+ // get word IDs
+ $wids = array();
+ foreach ($indexes_known as $ixlen) {
+ $word_idx = $this->getIndex('w', $ixlen);
+ // handle exact search
+ if (isset($tokenlength[$ixlen])) {
+ foreach ($tokenlength[$ixlen] as $xword) {
+ $wid = array_search($xword, $word_idx, true);
+ if ($wid !== false) {
+ $wids[$ixlen][] = $wid;
+ foreach ($tokens[$xword] as $w)
+ $result[$w[0]][] = "$ixlen*$wid";
+ }
+ }
+ }
+ // handle wildcard search
+ foreach ($tokenwild as $xword => $wlen) {
+ if ($wlen >= $ixlen) break;
+ foreach ($tokens[$xword] as $w) {
+ if (is_null($w[1])) continue;
+ foreach(array_keys(preg_grep($w[1], $word_idx)) as $wid) {
+ $wids[$ixlen][] = $wid;
+ $result[$w[0]][] = "$ixlen*$wid";
+ }
+ }
+ }
+ }
+ return $wids;
+ }
+
+ /**
+ * Return a list of all pages
+ * Warning: pages may not exist!
+ *
+ * @param string $key list only pages containing the metadata key (optional)
+ * @return array list of page names
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ public function getPages($key=null) {
+ $page_idx = $this->getIndex('page', '');
+ if (is_null($key)) return $page_idx;
+
+ $metaname = idx_cleanName($key);
+
+ // Special handling for titles
+ if ($key == 'title') {
+ $title_idx = $this->getIndex('title', '');
+ array_splice($page_idx, count($title_idx));
+ foreach ($title_idx as $i => $title)
+ if ($title === "") unset($page_idx[$i]);
+ return array_values($page_idx);
+ }
+
+ $pages = array();
+ $lines = $this->getIndex($metaname.'_i', '');
+ foreach ($lines as $line) {
+ $pages = array_merge($pages, $this->parseTuples($page_idx, $line));
+ }
+ return array_keys($pages);
+ }
+
+ /**
+ * Return a list of words sorted by number of times used
+ *
+ * @param int $min bottom frequency threshold
+ * @param int $max upper frequency limit. No limit if $max<$min
+ * @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>
+ */
+ public function histogram($min=1, $max=0, $minlen=3, $key=null) {
+ if ($min < 1)
+ $min = 1;
+ if ($max < $min)
+ $max = 0;
+
+ $result = array();
+
+ if ($key == 'title') {
+ $index = $this->getIndex('title', '');
+ $index = array_count_values($index);
+ foreach ($index as $val => $cnt) {
+ if ($cnt >= $min && (!$max || $cnt <= $max) && strlen($val) >= $minlen)
+ $result[$val] = $cnt;
+ }
+ }
+ elseif (!is_null($key)) {
+ $metaname = idx_cleanName($key);
+ $index = $this->getIndex($metaname.'_i', '');
+ $val_idx = array();
+ foreach ($index as $wid => $line) {
+ $freq = $this->countTuples($line);
+ 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) {
+ if (strlen($words[$wid]) >= $minlen)
+ $result[$words[$wid]] = $freq;
+ }
+ }
+ }
+ else {
+ $lengths = idx_listIndexLengths();
+ foreach ($lengths as $length) {
+ if ($length < $minlen) continue;
+ $index = $this->getIndex('i', $length);
+ $words = null;
+ foreach ($index as $wid => $line) {
+ $freq = $this->countTuples($line);
+ if ($freq >= $min && (!$max || $freq <= $max)) {
+ if ($words === null)
+ $words = $this->getIndex('w', $length);
+ $result[$words[$wid]] = $freq;
+ }
+ }
+ }
+ }
+
+ arsort($result);
+ return $result;
+ }
+
+ /**
+ * Lock the indexer.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @return bool|string
+ */
+ protected function lock() {
+ global $conf;
+ $status = true;
+ $run = 0;
+ $lock = $conf['lockdir'].'/_indexer.lock';
+ while (!@mkdir($lock, $conf['dmode'])) {
+ usleep(50);
+ if(is_dir($lock) && time()-@filemtime($lock) > 60*5){
+ // looks like a stale lock - remove it
+ if (!@rmdir($lock)) {
+ $status = "removing the stale lock failed";
+ return false;
+ } else {
+ $status = "stale lock removed";
+ }
+ }elseif($run++ == 1000){
+ // we waited 5 seconds for that lock
+ return false;
+ }
+ }
+ if (!empty($conf['dperm'])) {
+ chmod($lock, $conf['dperm']);
+ }
+ return $status;
+ }
+
+ /**
+ * Release the indexer lock.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @return bool
+ */
+ protected function unlock() {
+ global $conf;
+ @rmdir($conf['lockdir'].'/_indexer.lock');
+ return true;
+ }
+
+ /**
+ * Retrieve the entire index.
+ *
+ * The $suffix argument is for an index that is split into
+ * multiple parts. Different index files should use different
+ * base names.
+ *
+ * @param string $idx name of the index
+ * @param string $suffix subpart identifier
+ * @return array list of lines without CR or LF
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function getIndex($idx, $suffix) {
+ global $conf;
+ $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx';
+ if (!file_exists($fn)) return array();
+ return file($fn, FILE_IGNORE_NEW_LINES);
+ }
+
+ /**
+ * Replace the contents of the index with an array.
+ *
+ * @param string $idx name of the index
+ * @param string $suffix subpart identifier
+ * @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) {
+ global $conf;
+ $fn = $conf['indexdir'].'/'.$idx.$suffix;
+ $fh = @fopen($fn.'.tmp', 'w');
+ if (!$fh) return false;
+ fwrite($fh, join("\n", $lines));
+ if (!empty($lines))
+ fwrite($fh, "\n");
+ fclose($fh);
+ if ($conf['fperm'])
+ chmod($fn.'.tmp', $conf['fperm']);
+ io_rename($fn.'.tmp', $fn.'.idx');
+ return true;
+ }
+
+ /**
+ * Retrieve a line from the index.
+ *
+ * @param string $idx name of the index
+ * @param string $suffix subpart identifier
+ * @param int $id the line number
+ * @return string a line with trailing whitespace removed
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function getIndexKey($idx, $suffix, $id) {
+ global $conf;
+ $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx';
+ if (!file_exists($fn)) return '';
+ $fh = @fopen($fn, 'r');
+ if (!$fh) return '';
+ $ln = -1;
+ while (($line = fgets($fh)) !== false) {
+ if (++$ln == $id) break;
+ }
+ fclose($fh);
+ return rtrim((string)$line);
+ }
+
+ /**
+ * Write a line into the index.
+ *
+ * @param string $idx name of the index
+ * @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) {
+ global $conf;
+ if (substr($line, -1) != "\n")
+ $line .= "\n";
+ $fn = $conf['indexdir'].'/'.$idx.$suffix;
+ $fh = @fopen($fn.'.tmp', 'w');
+ if (!$fh) return false;
+ $ih = @fopen($fn.'.idx', 'r');
+ if ($ih) {
+ $ln = -1;
+ while (($curline = fgets($ih)) !== false) {
+ fwrite($fh, (++$ln == $id) ? $line : $curline);
+ }
+ if ($id > $ln) {
+ while ($id > ++$ln)
+ fwrite($fh, "\n");
+ fwrite($fh, $line);
+ }
+ fclose($ih);
+ } else {
+ $ln = -1;
+ while ($id > ++$ln)
+ fwrite($fh, "\n");
+ fwrite($fh, $line);
+ }
+ fclose($fh);
+ if ($conf['fperm'])
+ chmod($fn.'.tmp', $conf['fperm']);
+ io_rename($fn.'.tmp', $fn.'.idx');
+ return true;
+ }
+
+ /**
+ * Retrieve or insert a value in the index.
+ *
+ * @param string $idx name of the index
+ * @param string $suffix subpart identifier
+ * @param string $value line to find in the index
+ * @return int|bool line number of the value in the index or false if writing the index failed
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function addIndexKey($idx, $suffix, $value) {
+ $index = $this->getIndex($idx, $suffix);
+ $id = array_search($value, $index, true);
+ if ($id === false) {
+ $id = count($index);
+ $index[$id] = $value;
+ if (!$this->saveIndex($idx, $suffix, $index)) {
+ trigger_error("Failed to write $idx index", E_USER_ERROR);
+ return false;
+ }
+ }
+ return $id;
+ }
+
+ /**
+ * Get the list of lengths indexed in the wiki.
+ *
+ * Read the index directory or a cache file and returns
+ * a sorted array of lengths of the words used in the wiki.
+ *
+ * @author YoBoY <yoboy.leguesh@gmail.com>
+ *
+ * @return array
+ */
+ protected function listIndexLengths() {
+ return idx_listIndexLengths();
+ }
+
+ /**
+ * Get the word lengths that have been indexed.
+ *
+ * Reads the index directory and returns an array of lengths
+ * that there are indices for.
+ *
+ * @author YoBoY <yoboy.leguesh@gmail.com>
+ *
+ * @param array|int $filter
+ * @return array
+ */
+ protected function indexLengths($filter) {
+ global $conf;
+ $idx = array();
+ if (is_array($filter)) {
+ // testing if index files exist only
+ $path = $conf['indexdir']."/i";
+ foreach ($filter as $key => $value) {
+ if (file_exists($path.$key.'.idx'))
+ $idx[] = $key;
+ }
+ } else {
+ $lengths = idx_listIndexLengths();
+ foreach ($lengths as $key => $length) {
+ // keep all the values equal or superior
+ if ((int)$length >= (int)$filter)
+ $idx[] = $length;
+ }
+ }
+ return $idx;
+ }
+
+ /**
+ * Insert or replace a tuple in a line.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $line
+ * @param string|int $id
+ * @param int $count
+ * @return string
+ */
+ protected function updateTuple($line, $id, $count) {
+ if ($line != ''){
+ $line = preg_replace('/(^|:)'.preg_quote($id,'/').'\*\d*/', '', $line);
+ }
+ $line = trim($line, ':');
+ if ($count) {
+ if ($line) {
+ return "$id*$count:".$line;
+ } else {
+ return "$id*$count";
+ }
+ }
+ return $line;
+ }
+
+ /**
+ * Split a line into an array of tuples.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param array $keys
+ * @param string $line
+ * @return array
+ */
+ protected function parseTuples(&$keys, $line) {
+ $result = array();
+ if ($line == '') return $result;
+ $parts = explode(':', $line);
+ foreach ($parts as $tuple) {
+ if ($tuple === '') continue;
+ list($key, $cnt) = explode('*', $tuple);
+ if (!$cnt) continue;
+ $key = $keys[$key];
+ if ($key === false || is_null($key)) continue;
+ $result[$key] = $cnt;
+ }
+ return $result;
+ }
+
+ /**
+ * Sum the counts in a list of tuples.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $line
+ * @return int
+ */
+ protected function countTuples($line) {
+ $freq = 0;
+ $parts = explode(':', $line);
+ foreach ($parts as $tuple) {
+ if ($tuple === '') continue;
+ list(/* $pid */, $cnt) = explode('*', $tuple);
+ $freq += (int)$cnt;
+ }
+ return $freq;
+ }
+}
diff --git a/inc/Sitemap/Item.php b/inc/Sitemap/Item.php
new file mode 100644
index 000000000..d11bfc135
--- /dev/null
+++ b/inc/Sitemap/Item.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace dokuwiki\Sitemap;
+
+/**
+ * An item of a sitemap.
+ *
+ * @author Michael Hamann
+ */
+class Item {
+ public $url;
+ public $lastmod;
+ public $changefreq;
+ public $priority;
+
+ /**
+ * Create a new item.
+ *
+ * @param string $url The url of the item
+ * @param int $lastmod Timestamp of the last modification
+ * @param string $changefreq 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.
+ */
+ public function __construct($url, $lastmod, $changefreq = null, $priority = null) {
+ $this->url = $url;
+ $this->lastmod = $lastmod;
+ $this->changefreq = $changefreq;
+ $this->priority = $priority;
+ }
+
+ /**
+ * Helper function for creating an item for a wikipage id.
+ *
+ * @param string $id A wikipage id.
+ * @param string $changefreq How frequently the item is likely to change.
+ * Valid values: always, hourly, daily, weekly, monthly, yearly, never.
+ * @param float|string $priority The priority of the item relative to other URLs on your site.
+ * Valid values range from 0.0 to 1.0.
+ * @return Item The sitemap item.
+ */
+ public static function createFromID($id, $changefreq = null, $priority = null) {
+ $id = trim($id);
+ $date = @filemtime(wikiFN($id));
+ if(!$date) return null;
+ return new Item(wl($id, '', true), $date, $changefreq, $priority);
+ }
+
+ /**
+ * Get the XML representation of the sitemap item.
+ *
+ * @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)
+ $result .= ' <changefreq>'.hsc($this->changefreq).'</changefreq>'.NL;
+ if ($this->priority !== null)
+ $result .= ' <priority>'.hsc($this->priority).'</priority>'.NL;
+ $result .= ' </url>'.NL;
+ return $result;
+ }
+}
diff --git a/inc/Sitemapper.php b/inc/Sitemap/Mapper.php
index 037990e96..2f0567f05 100644
--- a/inc/Sitemapper.php
+++ b/inc/Sitemap/Mapper.php
@@ -6,14 +6,16 @@
* @author Michael Hamann <michael@content-space.de>
*/
-if(!defined('DOKU_INC')) die('meh.');
+namespace dokuwiki\Sitemap;
+
+use dokuwiki\HTTP\DokuHTTPClient;
/**
* A class for building sitemaps and pinging search engines with the sitemap URL.
*
* @author Michael Hamann
*/
-class Sitemapper {
+class Mapper {
/**
* Builds a Google Sitemap of all public pages known to the indexer
*
@@ -31,7 +33,7 @@ class Sitemapper {
global $conf;
if($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) return false;
- $sitemap = Sitemapper::getFilePath();
+ $sitemap = Mapper::getFilePath();
if(file_exists($sitemap)){
if(!is_writable($sitemap)) return false;
@@ -56,16 +58,16 @@ class Sitemapper {
//skip hidden, non existing and restricted files
if(isHiddenPage($id)) continue;
if(auth_aclcheck($id,'',array()) < AUTH_READ) continue;
- $item = SitemapItem::createFromID($id);
+ $item = Item::createFromID($id);
if ($item !== null)
$items[] = $item;
}
$eventData = array('items' => &$items, 'sitemap' => &$sitemap);
- $event = new Doku_Event('SITEMAP_GENERATE', $eventData);
+ $event = new \dokuwiki\Extension\Event('SITEMAP_GENERATE', $eventData);
if ($event->advise_before(true)) {
//save the new sitemap
- $event->result = io_saveFile($sitemap, Sitemapper::getXML($items));
+ $event->result = io_saveFile($sitemap, Mapper::getXML($items));
}
$event->advise_after();
@@ -85,7 +87,7 @@ class Sitemapper {
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 */
+ /** @var Item $item */
echo $item->toXML();
}
echo '</urlset>'.NL;
@@ -145,7 +147,7 @@ class Sitemapper {
$data = array('ping_urls' => $ping_urls,
'encoded_sitemap_url' => $encoded_sitemap_url
);
- $event = new Doku_Event('SITEMAP_PING', $data);
+ $event = new \dokuwiki\Extension\Event('SITEMAP_PING', $data);
if ($event->advise_before(true)) {
foreach ($data['ping_urls'] as $name => $url) {
dbglog("Sitemapper::PingSearchEngines(): pinging $name");
@@ -160,61 +162,3 @@ class Sitemapper {
}
}
-/**
- * An item of a sitemap.
- *
- * @author Michael Hamann
- */
-class SitemapItem {
- public $url;
- public $lastmod;
- public $changefreq;
- public $priority;
-
- /**
- * Create a new item.
- *
- * @param string $url The url of the item
- * @param int $lastmod Timestamp of the last modification
- * @param string $changefreq 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.
- */
- public function __construct($url, $lastmod, $changefreq = null, $priority = null) {
- $this->url = $url;
- $this->lastmod = $lastmod;
- $this->changefreq = $changefreq;
- $this->priority = $priority;
- }
-
- /**
- * Helper function for creating an item for a wikipage id.
- *
- * @param string $id A wikipage id.
- * @param string $changefreq How frequently the item is likely to change. Valid values: always, hourly, daily, weekly, monthly, yearly, never.
- * @param float|string $priority The priority of the item relative to other URLs on your site. Valid values range from 0.0 to 1.0.
- * @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;
- return new SitemapItem(wl($id, '', true), $date, $changefreq, $priority);
- }
-
- /**
- * Get the XML representation of the sitemap item.
- *
- * @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)
- $result .= ' <changefreq>'.hsc($this->changefreq).'</changefreq>'.NL;
- if ($this->priority !== null)
- $result .= ' <priority>'.hsc($this->priority).'</priority>'.NL;
- $result .= ' </url>'.NL;
- return $result;
- }
-}
diff --git a/inc/StyleUtils.php b/inc/StyleUtils.php
index e584942c0..d9f19a58b 100644
--- a/inc/StyleUtils.php
+++ b/inc/StyleUtils.php
@@ -2,8 +2,50 @@
namespace dokuwiki;
+/**
+ * Class StyleUtils
+ *
+ * Reads and applies the template's style.ini settings
+ */
class StyleUtils
{
+
+ /** @var string current template */
+ protected $tpl;
+ /** @var bool reinitialize styles config */
+ protected $reinit;
+ /** @var bool $preview preview mode */
+ protected $preview;
+ /** @var array default replacements to be merged with custom style configs */
+ protected $defaultReplacements = array(
+ '__text__' => "#000",
+ '__background__' => "#fff",
+ '__text_alt__' => "#999",
+ '__background_alt__' => "#eee",
+ '__text_neu__' => "#666",
+ '__background_neu__' => "#ddd",
+ '__border__' => "#ccc",
+ '__highlight__' => "#ff9",
+ '__link__' => "#00f",
+ );
+
+ /**
+ * StyleUtils constructor.
+ * @param string $tpl template name: if not passed as argument, the default value from $conf will be used
+ * @param bool $preview
+ * @param bool $reinit whether static style conf should be reinitialized
+ */
+ public function __construct($tpl = '', $preview = false, $reinit = false)
+ {
+ if (!$tpl) {
+ global $conf;
+ $tpl = $conf['template'];
+ }
+ $this->tpl = $tpl;
+ $this->reinit = $reinit;
+ $this->preview = $preview;
+ }
+
/**
* Load style ini contents
*
@@ -11,94 +53,123 @@ class StyleUtils
* the stylesheet modes
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @author Anna Dabrowska <info@cosmocode.de>
*
- * @param string $tpl the used template
- * @param bool $preview load preview replacements
* @return array with keys 'stylesheets' and 'replacements'
*/
- public function cssStyleini($tpl, $preview=false) {
- global $conf;
+ public function cssStyleini()
+ {
+ static $combined = [];
+ if (!empty($combined) && !$this->reinit) {
+ return $combined;
+ }
+ global $conf;
+ global $config_cascade;
$stylesheets = array(); // mode, file => base
+
// guaranteed placeholder => value
- $replacements = array(
- '__text__' => "#000",
- '__background__' => "#fff",
- '__text_alt__' => "#999",
- '__background_alt__' => "#eee",
- '__text_neu__' => "#666",
- '__background_neu__' => "#ddd",
- '__border__' => "#ccc",
- '__highlight__' => "#ff9",
- '__link__' => "#00f",
- );
-
- // load template's style.ini
- $incbase = tpl_incdir($tpl);
- $webbase = tpl_basedir($tpl);
- $ini = $incbase.'style.ini';
- if(file_exists($ini)){
- $data = parse_ini_file($ini, true);
-
- // stylesheets
- if(is_array($data['stylesheets'])) foreach($data['stylesheets'] as $file => $mode){
- if (!file_exists($incbase . $file)) {
- list($extension, $basename) = array_map('strrev', explode('.', strrev($file), 2));
- $newExtension = $extension === 'css' ? 'less' : 'css';
- if (file_exists($incbase . $basename . '.' . $newExtension)) {
- $stylesheets[$mode][$incbase . $basename . '.' . $newExtension] = $webbase;
- if ($conf['allowdebug']) {
- msg("Stylesheet $file not found, using $basename.$newExtension instead. Please contact developer of \"{$conf['template']}\" template.", 2);
- }
- continue;
- }
- }
- $stylesheets[$mode][$incbase . $file] = $webbase;
- }
+ $replacements = $this->defaultReplacements;
- // replacements
- if(is_array($data['replacements'])){
- $replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'],$webbase));
- }
+ // merge all styles from config cascade
+ if (!is_array($config_cascade['styleini'])) {
+ trigger_error('Missing config cascade for styleini', E_USER_WARNING);
}
- // load configs's style.ini
- $webbase = DOKU_BASE;
- $ini = DOKU_CONF."tpl/$tpl/style.ini";
- $incbase = dirname($ini).'/';
- if(file_exists($ini)){
- $data = parse_ini_file($ini, true);
+ // allow replacement overwrites in preview mode
+ if ($this->preview) {
+ $config_cascade['styleini']['local'][] = $conf['cachedir'] . '/preview.ini';
+ }
- // stylesheets
- if(isset($data['stylesheets']) && is_array($data['stylesheets'])) foreach($data['stylesheets'] as $file => $mode){
- $stylesheets[$mode][$incbase.$file] = $webbase;
- }
+ $combined['stylesheets'] = [];
+ $combined['replacements'] = [];
+
+ foreach (array('default', 'local', 'protected') as $config_group) {
+ if (empty($config_cascade['styleini'][$config_group])) continue;
+
+ // set proper server dirs
+ $webbase = $this->getWebbase($config_group);
- // replacements
- if(isset($data['replacements']) && is_array($data['replacements'])){
- $replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'],$webbase));
+ foreach ($config_cascade['styleini'][$config_group] as $inifile) {
+ // replace the placeholder with the name of the current template
+ $inifile = str_replace('%TEMPLATE%', $this->tpl, $inifile);
+
+ $incbase = dirname($inifile) . '/';
+
+ if (file_exists($inifile)) {
+ $config = parse_ini_file($inifile, true);
+
+ if (is_array($config['stylesheets'])) {
+ foreach ($config['stylesheets'] as $inifile => $mode) {
+ // validate and include style files
+ $stylesheets = array_merge(
+ $stylesheets,
+ $this->getValidatedStyles($stylesheets, $inifile, $mode, $incbase, $webbase)
+ );
+ $combined['stylesheets'] = array_merge($combined['stylesheets'], $stylesheets);
+ }
+ }
+
+ if (is_array($config['replacements'])) {
+ $replacements = array_replace(
+ $replacements,
+ $this->cssFixreplacementurls($config['replacements'], $webbase)
+ );
+ $combined['replacements'] = array_merge($combined['replacements'], $replacements);
+ }
+ }
}
}
- // allow replacement overwrites in preview mode
- if($preview) {
- $webbase = DOKU_BASE;
- $ini = $conf['cachedir'].'/preview.ini';
- if(file_exists($ini)) {
- $data = parse_ini_file($ini, true);
- // replacements
- if(is_array($data['replacements'])) {
- $replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'], $webbase));
+ return $combined;
+ }
+
+ /**
+ * Checks if configured style files exist and, if necessary, adjusts file extensions in config
+ *
+ * @param array $stylesheets
+ * @param string $file
+ * @param string $mode
+ * @param string $incbase
+ * @param string $webbase
+ * @return mixed
+ */
+ protected function getValidatedStyles($stylesheets, $file, $mode, $incbase, $webbase)
+ {
+ global $conf;
+ if (!file_exists($incbase . $file)) {
+ list($extension, $basename) = array_map('strrev', explode('.', strrev($file), 2));
+ $newExtension = $extension === 'css' ? 'less' : 'css';
+ if (file_exists($incbase . $basename . '.' . $newExtension)) {
+ $stylesheets[$mode][$incbase . $basename . '.' . $newExtension] = $webbase;
+ if ($conf['allowdebug']) {
+ msg("Stylesheet $file not found, using $basename.$newExtension instead. " .
+ "Please contact developer of \"$this->tpl\" template.", 2);
}
+ } elseif ($conf['allowdebug']) {
+ msg("Stylesheet $file not found, please contact the developer of \"$this->tpl\" template.", 2);
}
}
-
- return array(
- 'stylesheets' => $stylesheets,
- 'replacements' => $replacements
- );
+ $stylesheets[$mode][fullpath($incbase . $file)] = $webbase;
+ return $stylesheets;
}
+ /**
+ * Returns the web base path for the given level/group in config cascade.
+ * Style resources are relative to the template directory for the main (default) styles
+ * but relative to DOKU_BASE for everything else"
+ *
+ * @param string $config_group
+ * @return string
+ */
+ protected function getWebbase($config_group)
+ {
+ if ($config_group === 'default') {
+ return tpl_basedir($this->tpl);
+ } else {
+ return DOKU_BASE;
+ }
+ }
/**
* Amend paths used in replacement relative urls, refer FS#2879
@@ -109,9 +180,14 @@ class StyleUtils
* @param string $location
* @return array
*/
- protected function cssFixreplacementurls($replacements, $location) {
- foreach($replacements as $key => $value) {
- $replacements[$key] = preg_replace('#(url\([ \'"]*)(?!/|data:|http://|https://| |\'|")#','\\1'.$location,$value);
+ protected function cssFixreplacementurls($replacements, $location)
+ {
+ foreach ($replacements as $key => $value) {
+ $replacements[$key] = preg_replace(
+ '#(url\([ \'"]*)(?!/|data:|http://|https://| |\'|")#',
+ '\\1' . $location,
+ $value
+ );
}
return $replacements;
}
diff --git a/inc/Subscriptions/BulkSubscriptionSender.php b/inc/Subscriptions/BulkSubscriptionSender.php
new file mode 100644
index 000000000..672ef90f6
--- /dev/null
+++ b/inc/Subscriptions/BulkSubscriptionSender.php
@@ -0,0 +1,261 @@
+<?php
+
+
+namespace dokuwiki\Subscriptions;
+
+
+use dokuwiki\ChangeLog\PageChangeLog;
+use dokuwiki\Input\Input;
+use DokuWiki_Auth_Plugin;
+
+class BulkSubscriptionSender extends SubscriptionSender
+{
+
+ /**
+ * Send digest and list subscriptions
+ *
+ * This sends mails to all subscribers that have a subscription for namespaces above
+ * the given page if the needed $conf['subscribe_time'] has passed already.
+ *
+ * This function is called form lib/exe/indexer.php
+ *
+ * @param string $page
+ *
+ * @return int number of sent mails
+ */
+ public function sendBulk($page)
+ {
+ $subscriberManager = new SubscriberManager();
+ if (!$subscriberManager->isenabled()) {
+ return 0;
+ }
+
+ /** @var DokuWiki_Auth_Plugin $auth */
+ global $auth;
+ global $conf;
+ global $USERINFO;
+ /** @var Input $INPUT */
+ global $INPUT;
+ $count = 0;
+
+ $subscriptions = $subscriberManager->subscribers($page, null, ['digest', 'list']);
+
+ // remember current user info
+ $olduinfo = $USERINFO;
+ $olduser = $INPUT->server->str('REMOTE_USER');
+
+ foreach ($subscriptions as $target => $users) {
+ if (!$this->lock($target)) {
+ continue;
+ }
+
+ foreach ($users as $user => $info) {
+ list($style, $lastupdate) = $info;
+
+ $lastupdate = (int)$lastupdate;
+ if ($lastupdate + $conf['subscribe_time'] > time()) {
+ // Less than the configured time period passed since last
+ // update.
+ continue;
+ }
+
+ // Work as the user to make sure ACLs apply correctly
+ $USERINFO = $auth->getUserData($user);
+ $INPUT->server->set('REMOTE_USER', $user);
+ if ($USERINFO === false) {
+ continue;
+ }
+ if (!$USERINFO['mail']) {
+ continue;
+ }
+
+ if (substr($target, -1, 1) === ':') {
+ // subscription target is a namespace, get all changes within
+ $changes = getRecentsSince($lastupdate, null, getNS($target));
+ } else {
+ // single page subscription, check ACL ourselves
+ if (auth_quickaclcheck($target) < AUTH_READ) {
+ continue;
+ }
+ $meta = p_get_metadata($target);
+ $changes = [$meta['last_change']];
+ }
+
+ // Filter out pages only changed in small and own edits
+ $change_ids = [];
+ foreach ($changes as $rev) {
+ $n = 0;
+ while (!is_null($rev) && $rev['date'] >= $lastupdate &&
+ ($INPUT->server->str('REMOTE_USER') === $rev['user'] ||
+ $rev['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT)) {
+ $pagelog = new PageChangeLog($rev['id']);
+ $rev = $pagelog->getRevisions($n++, 1);
+ $rev = (count($rev) > 0) ? $rev[0] : null;
+ }
+
+ if (!is_null($rev) && $rev['date'] >= $lastupdate) {
+ // Some change was not a minor one and not by myself
+ $change_ids[] = $rev['id'];
+ }
+ }
+
+ // send it
+ if ($style === 'digest') {
+ foreach ($change_ids as $change_id) {
+ $this->sendDigest(
+ $USERINFO['mail'],
+ $change_id,
+ $lastupdate
+ );
+ $count++;
+ }
+ } else {
+ if ($style === 'list') {
+ $this->sendList($USERINFO['mail'], $change_ids, $target);
+ $count++;
+ }
+ }
+ // TODO: Handle duplicate subscriptions.
+
+ // Update notification time.
+ $subscriberManager->add($target, $user, $style, time());
+ }
+ $this->unlock($target);
+ }
+
+ // restore current user info
+ $USERINFO = $olduinfo;
+ $INPUT->server->set('REMOTE_USER', $olduser);
+ return $count;
+ }
+
+ /**
+ * Lock subscription info
+ *
+ * We don't use io_lock() her because we do not wait for the lock and use a larger stale time
+ *
+ * @param string $id The target page or namespace, specified by id; Namespaces
+ * are identified by appending a colon.
+ *
+ * @return bool true, if you got a succesful lock
+ * @author Adrian Lang <lang@cosmocode.de>
+ */
+ protected function lock($id)
+ {
+ global $conf;
+
+ $lock = $conf['lockdir'] . '/_subscr_' . md5($id) . '.lock';
+
+ if (is_dir($lock) && time() - @filemtime($lock) > 60 * 5) {
+ // looks like a stale lock - remove it
+ @rmdir($lock);
+ }
+
+ // try creating the lock directory
+ if (!@mkdir($lock, $conf['dmode'])) {
+ return false;
+ }
+
+ if (!empty($conf['dperm'])) {
+ chmod($lock, $conf['dperm']);
+ }
+ return true;
+ }
+
+ /**
+ * Unlock subscription info
+ *
+ * @param string $id The target page or namespace, specified by id; Namespaces
+ * are identified by appending a colon.
+ *
+ * @return bool
+ * @author Adrian Lang <lang@cosmocode.de>
+ */
+ protected function unlock($id)
+ {
+ global $conf;
+ $lock = $conf['lockdir'] . '/_subscr_' . md5($id) . '.lock';
+ return @rmdir($lock);
+ }
+
+ /**
+ * Send a digest mail
+ *
+ * Sends a digest mail showing a bunch of changes of a single page. Basically the same as sendPageDiff()
+ * but determines the last known revision first
+ *
+ * @param string $subscriber_mail The target mail address
+ * @param string $id The ID
+ * @param int $lastupdate Time of the last notification
+ *
+ * @return bool
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ */
+ protected function sendDigest($subscriber_mail, $id, $lastupdate)
+ {
+ $pagelog = new PageChangeLog($id);
+ $n = 0;
+ do {
+ $rev = $pagelog->getRevisions($n++, 1);
+ $rev = (count($rev) > 0) ? $rev[0] : null;
+ } while (!is_null($rev) && $rev > $lastupdate);
+
+ // TODO I'm not happy with the following line and passing $this->mailer around. Not sure how to solve it better
+ $pageSubSender = new PageSubscriptionSender($this->mailer);
+ return $pageSubSender->sendPageDiff(
+ $subscriber_mail,
+ 'subscr_digest',
+ $id,
+ $rev
+ );
+ }
+
+ /**
+ * Send a list mail
+ *
+ * Sends a list mail showing a list of changed pages.
+ *
+ * @param string $subscriber_mail The target mail address
+ * @param array $ids Array of ids
+ * @param string $ns_id The id of the namespace
+ *
+ * @return bool true if a mail was sent
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ */
+ protected function sendList($subscriber_mail, $ids, $ns_id)
+ {
+ if (count($ids) === 0) {
+ return false;
+ }
+
+ $tlist = '';
+ $hlist = '<ul>';
+ foreach ($ids as $id) {
+ $link = wl($id, [], true);
+ $tlist .= '* ' . $link . NL;
+ $hlist .= '<li><a href="' . $link . '">' . hsc($id) . '</a></li>' . NL;
+ }
+ $hlist .= '</ul>';
+
+ $id = prettyprint_id($ns_id);
+ $trep = [
+ 'DIFF' => rtrim($tlist),
+ 'PAGE' => $id,
+ 'SUBSCRIBE' => wl($id, ['do' => 'subscribe'], true, '&'),
+ ];
+ $hrep = [
+ 'DIFF' => $hlist,
+ ];
+
+ return $this->send(
+ $subscriber_mail,
+ 'subscribe_list',
+ $ns_id,
+ 'subscr_list',
+ $trep,
+ $hrep
+ );
+ }
+}
diff --git a/inc/Subscriptions/MediaSubscriptionSender.php b/inc/Subscriptions/MediaSubscriptionSender.php
new file mode 100644
index 000000000..1757c2b1c
--- /dev/null
+++ b/inc/Subscriptions/MediaSubscriptionSender.php
@@ -0,0 +1,47 @@
+<?php
+
+
+namespace dokuwiki\Subscriptions;
+
+
+class MediaSubscriptionSender extends SubscriptionSender
+{
+
+ /**
+ * Send the diff for some media change
+ *
+ * @fixme this should embed thumbnails of images in HTML version
+ *
+ * @param string $subscriber_mail The target mail address
+ * @param string $template Mail template ('uploadmail', ...)
+ * @param string $id Media file for which the notification is
+ * @param int|bool $rev Old revision if any
+ * @param int|bool $current_rev New revision if any
+ */
+ public function sendMediaDiff($subscriber_mail, $template, $id, $rev = false, $current_rev = false)
+ {
+ global $conf;
+
+ $file = mediaFN($id);
+ list($mime, /* $ext */) = mimetype($id);
+
+ $trep = [
+ 'MIME' => $mime,
+ 'MEDIA' => ml($id, $current_rev?('rev='.$current_rev):'', true, '&', true),
+ 'SIZE' => filesize_h(filesize($file)),
+ ];
+
+ if ($rev && $conf['mediarevisions']) {
+ $trep['OLD'] = ml($id, "rev=$rev", true, '&', true);
+ } else {
+ $trep['OLD'] = '---';
+ }
+
+ $headers = ['Message-Id' => $this->getMessageID($id, @filemtime($file))];
+ if ($rev) {
+ $headers['In-Reply-To'] = $this->getMessageID($id, $rev);
+ }
+
+ $this->send($subscriber_mail, 'upload', $id, $template, $trep, null, $headers);
+ }
+}
diff --git a/inc/Subscriptions/PageSubscriptionSender.php b/inc/Subscriptions/PageSubscriptionSender.php
new file mode 100644
index 000000000..e5577c1af
--- /dev/null
+++ b/inc/Subscriptions/PageSubscriptionSender.php
@@ -0,0 +1,88 @@
+<?php
+
+
+namespace dokuwiki\Subscriptions;
+
+
+use Diff;
+use InlineDiffFormatter;
+use UnifiedDiffFormatter;
+
+class PageSubscriptionSender extends SubscriptionSender
+{
+
+ /**
+ * Send the diff for some page change
+ *
+ * @param string $subscriber_mail The target mail address
+ * @param string $template Mail template ('subscr_digest', 'subscr_single', 'mailtext', ...)
+ * @param string $id Page for which the notification is
+ * @param int|null $rev Old revision if any
+ * @param string $summary Change summary if any
+ * @param int|null $current_rev New revision if any
+ *
+ * @return bool true if successfully sent
+ */
+ public function sendPageDiff($subscriber_mail, $template, $id, $rev = null, $summary = '', $current_rev = null)
+ {
+ global $DIFF_INLINESTYLES;
+
+ // prepare replacements (keys not set in hrep will be taken from trep)
+ $trep = [
+ 'PAGE' => $id,
+ 'NEWPAGE' => wl($id, $current_rev?('rev='.$current_rev):'', true, '&'),
+ 'SUMMARY' => $summary,
+ 'SUBSCRIBE' => wl($id, ['do' => 'subscribe'], true, '&'),
+ ];
+ $hrep = [];
+
+ if ($rev) {
+ $subject = 'changed';
+ $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;
+ $df = new Diff(
+ explode("\n", $old_content),
+ explode("\n", $new_content)
+ );
+ $dformat = new InlineDiffFormatter();
+ $hdiff = $dformat->format($df);
+ $hdiff = '<table>' . $hdiff . '</table>';
+ $DIFF_INLINESTYLES = false;
+ } else {
+ $subject = 'newpage';
+ $trep['OLDPAGE'] = '---';
+ $tdiff = rawWiki($id);
+ $hdiff = nl2br(hsc($tdiff));
+ }
+
+ $trep['DIFF'] = $tdiff;
+ $hrep['DIFF'] = $hdiff;
+
+ $headers = ['Message-Id' => $this->getMessageID($id)];
+ if ($rev) {
+ $headers['In-Reply-To'] = $this->getMessageID($id, $rev);
+ }
+
+ return $this->send(
+ $subscriber_mail,
+ $subject,
+ $id,
+ $template,
+ $trep,
+ $hrep,
+ $headers
+ );
+ }
+
+}
diff --git a/inc/Subscriptions/RegistrationSubscriptionSender.php b/inc/Subscriptions/RegistrationSubscriptionSender.php
new file mode 100644
index 000000000..bd4887599
--- /dev/null
+++ b/inc/Subscriptions/RegistrationSubscriptionSender.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace dokuwiki\Subscriptions;
+
+class RegistrationSubscriptionSender extends SubscriptionSender
+{
+
+ /**
+ * Send a notify mail on new registration
+ *
+ * @param string $login login name of the new user
+ * @param string $fullname full name of the new user
+ * @param string $email email address of the new user
+ *
+ * @return bool true if a mail was sent
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ */
+ public function sendRegister($login, $fullname, $email)
+ {
+ global $conf;
+ if (empty($conf['registernotify'])) {
+ return false;
+ }
+
+ $trep = [
+ 'NEWUSER' => $login,
+ 'NEWNAME' => $fullname,
+ 'NEWEMAIL' => $email,
+ ];
+
+ return $this->send(
+ $conf['registernotify'],
+ 'new_user',
+ $login,
+ 'registermail',
+ $trep
+ );
+ }
+}
diff --git a/inc/Subscriptions/SubscriberManager.php b/inc/Subscriptions/SubscriberManager.php
new file mode 100644
index 000000000..ded1390cf
--- /dev/null
+++ b/inc/Subscriptions/SubscriberManager.php
@@ -0,0 +1,290 @@
+<?php
+
+namespace dokuwiki\Subscriptions;
+
+use dokuwiki\Input\Input;
+use DokuWiki_Auth_Plugin;
+use Exception;
+
+class SubscriberManager
+{
+
+ /**
+ * Check if subscription system is enabled
+ *
+ * @return bool
+ */
+ public function isenabled()
+ {
+ return actionOK('subscribe');
+ }
+
+ /**
+ * Adds a new subscription for the given page or namespace
+ *
+ * This will automatically overwrite any existent subscription for the given user on this
+ * *exact* page or namespace. It will *not* modify any subscription that may exist in higher namespaces.
+ *
+ * @throws Exception when user or style is empty
+ *
+ * @param string $id The target page or namespace, specified by id; Namespaces
+ * are identified by appending a colon.
+ * @param string $user
+ * @param string $style
+ * @param string $data
+ *
+ * @return bool
+ */
+ public function add($id, $user, $style, $data = '')
+ {
+ if (!$this->isenabled()) {
+ return false;
+ }
+
+ // delete any existing subscription
+ $this->remove($id, $user);
+
+ $user = auth_nameencode(trim($user));
+ $style = trim($style);
+ $data = trim($data);
+
+ if (!$user) {
+ throw new Exception('no subscription user given');
+ }
+ if (!$style) {
+ throw new Exception('no subscription style given');
+ }
+ if (!$data) {
+ $data = time();
+ } //always add current time for new subscriptions
+
+ $line = "$user $style $data\n";
+ $file = $this->file($id);
+ return io_saveFile($file, $line, true);
+ }
+
+
+ /**
+ * Removes a subscription for the given page or namespace
+ *
+ * This removes all subscriptions matching the given criteria on the given page or
+ * namespace. It will *not* modify any subscriptions that may exist in higher
+ * namespaces.
+ *
+ * @param string $id The target object’s (namespace or page) id
+ * @param string|array $user
+ * @param string|array $style
+ * @param string|array $data
+ *
+ * @return bool
+ */
+ public function remove($id, $user = null, $style = null, $data = null)
+ {
+ if (!$this->isenabled()) {
+ return false;
+ }
+
+ $file = $this->file($id);
+ if (!file_exists($file)) {
+ return true;
+ }
+
+ $regexBuilder = new SubscriberRegexBuilder();
+ $re = $regexBuilder->buildRegex($user, $style, $data);
+ return io_deleteFromFile($file, $re, true);
+ }
+
+ /**
+ * Get data for $INFO['subscribed']
+ *
+ * $INFO['subscribed'] is either false if no subscription for the current page
+ * and user is in effect. Else it contains an array of arrays with the fields
+ * “target”, “style”, and optionally “data”.
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ * @param string $id Page ID, defaults to global $ID
+ * @param string $user User, defaults to $_SERVER['REMOTE_USER']
+ *
+ * @return array|false
+ */
+ public function userSubscription($id = '', $user = '')
+ {
+ if (!$this->isenabled()) {
+ return false;
+ }
+
+ global $ID;
+ /** @var Input $INPUT */
+ global $INPUT;
+ if (!$id) {
+ $id = $ID;
+ }
+ if (!$user) {
+ $user = $INPUT->server->str('REMOTE_USER');
+ }
+
+ if (empty($user)) {
+ // not logged in
+ return false;
+ }
+
+ $subs = $this->subscribers($id, $user);
+ if (!count($subs)) {
+ return false;
+ }
+
+ $result = [];
+ foreach ($subs as $target => $info) {
+ $result[] = [
+ 'target' => $target,
+ 'style' => $info[$user][0],
+ 'data' => $info[$user][1],
+ ];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Recursively search for matching subscriptions
+ *
+ * This function searches all relevant subscription files for a page or
+ * namespace.
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ * @param string $page The target object’s (namespace or page) id
+ * @param string|array $user
+ * @param string|array $style
+ * @param string|array $data
+ *
+ * @return array
+ */
+ public function subscribers($page, $user = null, $style = null, $data = null)
+ {
+ if (!$this->isenabled()) {
+ return [];
+ }
+
+ // Construct list of files which may contain relevant subscriptions.
+ $files = [':' => $this->file(':')];
+ do {
+ $files[$page] = $this->file($page);
+ $page = getNS(rtrim($page, ':')) . ':';
+ } while ($page !== ':');
+
+ $regexBuilder = new SubscriberRegexBuilder();
+ $re = $regexBuilder->buildRegex($user, $style, $data);
+
+ // Handle files.
+ $result = [];
+ foreach ($files as $target => $file) {
+ if (!file_exists($file)) {
+ continue;
+ }
+
+ $lines = file($file);
+ foreach ($lines as $line) {
+ // fix old style subscription files
+ if (strpos($line, ' ') === false) {
+ $line = trim($line) . " every\n";
+ }
+
+ // check for matching entries
+ if (!preg_match($re, $line, $m)) {
+ continue;
+ }
+
+ $u = rawurldecode($m[1]); // decode the user name
+ if (!isset($result[$target])) {
+ $result[$target] = [];
+ }
+ $result[$target][$u] = [$m[2], $m[3]]; // add to result
+ }
+ }
+ return array_reverse($result);
+ }
+
+ /**
+ * Default callback for COMMON_NOTIFY_ADDRESSLIST
+ *
+ * Aggregates all email addresses of user who have subscribed the given page with 'every' style
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ * @author Steven Danz <steven-danz@kc.rr.com>
+ *
+ * @todo move the whole functionality into this class, trigger SUBSCRIPTION_NOTIFY_ADDRESSLIST instead,
+ * use an array for the addresses within it
+ *
+ * @param array &$data Containing the entries:
+ * - $id (the page id),
+ * - $self (whether the author should be notified,
+ * - $addresslist (current email address list)
+ * - $replacements (array of additional string substitutions, @KEY@ to be replaced by value)
+ */
+ public function notifyAddresses(&$data)
+ {
+ if (!$this->isenabled()) {
+ return;
+ }
+
+ /** @var DokuWiki_Auth_Plugin $auth */
+ global $auth;
+ global $conf;
+ /** @var \Input $INPUT */
+ global $INPUT;
+
+ $id = $data['id'];
+ $self = $data['self'];
+ $addresslist = $data['addresslist'];
+
+ $subscriptions = $this->subscribers($id, null, 'every');
+
+ $result = [];
+ foreach ($subscriptions as $target => $users) {
+ foreach ($users as $user => $info) {
+ $userinfo = $auth->getUserData($user);
+ if ($userinfo === false) {
+ continue;
+ }
+ if (!$userinfo['mail']) {
+ continue;
+ }
+ if (!$self && $user == $INPUT->server->str('REMOTE_USER')) {
+ continue;
+ } //skip our own changes
+
+ $level = auth_aclcheck($id, $user, $userinfo['grps']);
+ if ($level >= AUTH_READ) {
+ if (strcasecmp($userinfo['mail'], $conf['notify']) != 0) { //skip user who get notified elsewhere
+ $result[$user] = $userinfo['mail'];
+ }
+ }
+ }
+ }
+ $data['addresslist'] = trim($addresslist . ',' . implode(',', $result), ',');
+ }
+
+ /**
+ * Return the subscription meta file for the given 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.
+ *
+ * @return string
+ */
+ protected function file($id)
+ {
+ $meta_fname = '.mlist';
+ if ((substr($id, -1, 1) === ':')) {
+ $meta_froot = getNS($id);
+ $meta_fname = '/' . $meta_fname;
+ } else {
+ $meta_froot = $id;
+ }
+ return metaFN((string)$meta_froot, $meta_fname);
+ }
+}
diff --git a/inc/Subscriptions/SubscriberRegexBuilder.php b/inc/Subscriptions/SubscriberRegexBuilder.php
new file mode 100644
index 000000000..959702aac
--- /dev/null
+++ b/inc/Subscriptions/SubscriberRegexBuilder.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace dokuwiki\Subscriptions;
+
+use Exception;
+
+class SubscriberRegexBuilder
+{
+
+ /**
+ * Construct a regular expression for parsing a subscription definition line
+ *
+ * @param string|array $user
+ * @param string|array $style
+ * @param string|array $data
+ *
+ * @return string complete regexp including delimiters
+ * @throws Exception when no data is passed
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ */
+ public function buildRegex($user = null, $style = null, $data = null)
+ {
+ // always work with arrays
+ $user = (array)$user;
+ $style = (array)$style;
+ $data = (array)$data;
+
+ // clean
+ $user = array_filter(array_map('trim', $user));
+ $style = array_filter(array_map('trim', $style));
+ $data = array_filter(array_map('trim', $data));
+
+ // user names are encoded
+ $user = array_map('auth_nameencode', $user);
+
+ // quote
+ $user = array_map('preg_quote_cb', $user);
+ $style = array_map('preg_quote_cb', $style);
+ $data = array_map('preg_quote_cb', $data);
+
+ // join
+ $user = join('|', $user);
+ $style = join('|', $style);
+ $data = join('|', $data);
+
+ // any data at all?
+ if ($user . $style . $data === '') {
+ throw new Exception('no data passed');
+ }
+
+ // replace empty values, set which ones are optional
+ $sopt = '';
+ $dopt = '';
+ if ($user === '') {
+ $user = '\S+';
+ }
+ if ($style === '') {
+ $style = '\S+';
+ $sopt = '?';
+ }
+ if ($data === '') {
+ $data = '\S+';
+ $dopt = '?';
+ }
+
+ // assemble
+ return "/^($user)(?:\\s+($style))$sopt(?:\\s+($data))$dopt$/";
+ }
+}
diff --git a/inc/Subscriptions/SubscriptionSender.php b/inc/Subscriptions/SubscriptionSender.php
new file mode 100644
index 000000000..afc05bfc0
--- /dev/null
+++ b/inc/Subscriptions/SubscriptionSender.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace dokuwiki\Subscriptions;
+
+use Mailer;
+
+abstract class SubscriptionSender
+{
+ protected $mailer;
+
+ public function __construct(Mailer $mailer = null)
+ {
+ if ($mailer === null) {
+ $mailer = new Mailer();
+ }
+ $this->mailer = $mailer;
+ }
+
+ /**
+ * Get a valid message id for a certain $id and revision (or the current revision)
+ *
+ * @param string $id The id of the page (or media file) the message id should be for
+ * @param string $rev The revision of the page, set to the current revision of the page $id if not set
+ *
+ * @return string
+ */
+ protected function getMessageID($id, $rev = null)
+ {
+ static $listid = null;
+ if (is_null($listid)) {
+ $server = parse_url(DOKU_URL, PHP_URL_HOST);
+ $listid = join('.', array_reverse(explode('/', DOKU_BASE))) . $server;
+ $listid = urlencode($listid);
+ $listid = strtolower(trim($listid, '.'));
+ }
+
+ if (is_null($rev)) {
+ $rev = @filemtime(wikiFN($id));
+ }
+
+ return "<$id?rev=$rev@$listid>";
+ }
+
+ /**
+ * Helper function for sending a mail
+ *
+ * @param string $subscriber_mail The target mail address
+ * @param string $subject The lang id of the mail subject (without the
+ * prefix “mail_”)
+ * @param string $context The context of this mail, eg. page or namespace id
+ * @param string $template The name of the mail template
+ * @param array $trep Predefined parameters used to parse the
+ * template (in text format)
+ * @param array $hrep Predefined parameters used to parse the
+ * template (in HTML format), null to default to $trep
+ * @param array $headers Additional mail headers in the form 'name' => 'value'
+ *
+ * @return bool
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ */
+ protected function send($subscriber_mail, $subject, $context, $template, $trep, $hrep = null, $headers = [])
+ {
+ global $lang;
+ global $conf;
+
+ $text = rawLocale($template);
+ $subject = $lang['mail_' . $subject] . ' ' . $context;
+ $mail = $this->mailer;
+ $mail->bcc($subscriber_mail);
+ $mail->subject($subject);
+ $mail->setBody($text, $trep, $hrep);
+ if (in_array($template, ['subscr_list', 'subscr_digest'])) {
+ $mail->from($conf['mailfromnobody']);
+ }
+ if (isset($trep['SUBSCRIBE'])) {
+ $mail->setHeader('List-Unsubscribe', '<' . $trep['SUBSCRIBE'] . '>', false);
+ }
+
+ foreach ($headers as $header => $value) {
+ $mail->setHeader($header, $value);
+ }
+
+ return $mail->send();
+ }
+}
diff --git a/inc/TaskRunner.php b/inc/TaskRunner.php
new file mode 100644
index 000000000..c5de7e303
--- /dev/null
+++ b/inc/TaskRunner.php
@@ -0,0 +1,240 @@
+<?php
+
+namespace dokuwiki;
+
+use dokuwiki\Extension\Event;
+use dokuwiki\Sitemap\Mapper;
+use dokuwiki\Subscriptions\BulkSubscriptionSender;
+
+/**
+ * Class TaskRunner
+ *
+ * Run an asynchronous task.
+ */
+class TaskRunner
+{
+ /**
+ * Run the next task
+ *
+ * @todo refactor to remove dependencies on globals
+ * @triggers INDEXER_TASKS_RUN
+ */
+ public function run()
+ {
+ global $INPUT, $conf, $ID;
+
+ // keep running after browser closes connection
+ @ignore_user_abort(true);
+
+ // check if user abort worked, if yes send output early
+ $defer = !@ignore_user_abort() || $conf['broken_iua'];
+ $output = $INPUT->has('debug') && $conf['allowdebug'];
+ if(!$defer && !$output){
+ $this->sendGIF();
+ }
+
+ $ID = cleanID($INPUT->str('id'));
+
+ // Catch any possible output (e.g. errors)
+ if(!$output) {
+ ob_start();
+ } else {
+ header('Content-Type: text/plain');
+ }
+
+ // run one of the jobs
+ $tmp = []; // No event data
+ $evt = new Event('INDEXER_TASKS_RUN', $tmp);
+ if ($evt->advise_before()) {
+ $this->runIndexer() or
+ $this->runSitemapper() or
+ $this->sendDigest() or
+ $this->runTrimRecentChanges() or
+ $this->runTrimRecentChanges(true) or
+ $evt->advise_after();
+ }
+
+ if(!$output) {
+ ob_end_clean();
+ if($defer) {
+ $this->sendGIF();
+ }
+ }
+ }
+
+ /**
+ * Just send a 1x1 pixel blank gif to the browser
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Harry Fuecks <fuecks@gmail.com>
+ */
+ protected function sendGIF()
+ {
+ $img = base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAIBTAA7');
+ header('Content-Type: image/gif');
+ header('Content-Length: '.strlen($img));
+ header('Connection: Close');
+ print $img;
+ tpl_flush();
+ // Browser should drop connection after this
+ // Thinks it's got the whole image
+ }
+
+ /**
+ * Trims the recent changes cache (or imports the old changelog) as needed.
+ *
+ * @param bool $media_changes If the media changelog shall be trimmed instead of
+ * the page changelog
+ *
+ * @return bool
+ * @triggers TASK_RECENTCHANGES_TRIM
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ */
+ protected 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
+ // Trims the recent changes cache to the last $conf['changes_days'] recent
+ // changes or $conf['recent'] items, which ever is larger.
+ // The trimming is only done once a day.
+ if (file_exists($fn) &&
+ (@filemtime($fn . '.trimmed') + 86400) < time() &&
+ !file_exists($fn . '_tmp')) {
+ @touch($fn . '.trimmed');
+ io_lock($fn);
+ $lines = file($fn);
+ if (count($lines) <= $conf['recent']) {
+ // nothing to trim
+ io_unlock($fn);
+ echo "runTrimRecentChanges($media_changes): finished" . NL;
+ return false;
+ }
+
+ io_saveFile($fn . '_tmp', ''); // presave tmp as 2nd lock
+ $trim_time = time() - $conf['recent_days'] * 86400;
+ $out_lines = [];
+ $old_lines = [];
+ for ($i = 0; $i < count($lines); $i++) {
+ $log = parseChangelogLine($lines[$i]);
+ if ($log === false) {
+ continue; // discard junk
+ }
+
+ if ($log['date'] < $trim_time) {
+ // keep old lines for now (append .$i to prevent key collisions)
+ $old_lines[$log['date'] . ".$i"] = $lines[$i];
+ } else {
+ // definitely keep these lines
+ $out_lines[$log['date'] . ".$i"] = $lines[$i];
+ }
+ }
+
+ if (count($lines) == count($out_lines)) {
+ // nothing to trim
+ @unlink($fn . '_tmp');
+ io_unlock($fn);
+ echo "runTrimRecentChanges($media_changes): finished" . NL;
+ return false;
+ }
+
+ // sort the final result, it shouldn't be necessary,
+ // however the extra robustness in making the changelog cache self-correcting is worth it
+ ksort($out_lines);
+ $extra = $conf['recent'] - count($out_lines); // do we need extra lines do bring us up to minimum
+ if ($extra > 0) {
+ ksort($old_lines);
+ $out_lines = array_merge(array_slice($old_lines, -$extra), $out_lines);
+ }
+
+ $eventData = [
+ 'isMedia' => $media_changes,
+ 'trimmedChangelogLines' => $out_lines,
+ 'removedChangelogLines' => $extra > 0 ? array_slice($old_lines, 0, -$extra) : $old_lines,
+ ];
+ Event::createAndTrigger('TASK_RECENTCHANGES_TRIM', $eventData);
+ $out_lines = $eventData['trimmedChangelogLines'];
+
+ // save trimmed changelog
+ io_saveFile($fn . '_tmp', implode('', $out_lines));
+ @unlink($fn);
+ if (!rename($fn . '_tmp', $fn)) {
+ // rename failed so try another way...
+ io_unlock($fn);
+ io_saveFile($fn, implode('', $out_lines));
+ @unlink($fn . '_tmp');
+ } else {
+ io_unlock($fn);
+ }
+ echo "runTrimRecentChanges($media_changes): finished" . NL;
+ return true;
+ }
+
+ // nothing done
+ echo "runTrimRecentChanges($media_changes): finished" . NL;
+ return false;
+ }
+
+
+ /**
+ * Runs the indexer for the current page
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ protected function runIndexer()
+ {
+ global $ID;
+ print 'runIndexer(): started' . NL;
+
+ if ((string) $ID === '') {
+ return false;
+ }
+
+ // do the work
+ return idx_addPage($ID, true);
+ }
+
+ /**
+ * Builds a Google Sitemap of all public pages known to the indexer
+ *
+ * The map is placed in the root directory named sitemap.xml.gz - This
+ * file needs to be writable!
+ *
+ * @author Andreas Gohr
+ * @link https://www.google.com/webmasters/sitemaps/docs/en/about.html
+ */
+ protected function runSitemapper()
+ {
+ print 'runSitemapper(): started' . NL;
+ $result = Mapper::generate() && Mapper::pingSearchEngines();
+ print 'runSitemapper(): finished' . NL;
+ return $result;
+ }
+
+ /**
+ * Send digest and list mails for all subscriptions which are in effect for the
+ * current page
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ */
+ protected function sendDigest()
+ {
+ global $ID;
+
+ echo 'sendDigest(): started' . NL;
+ if (!actionOK('subscribe')) {
+ echo 'sendDigest(): disabled' . NL;
+ return false;
+ }
+ $sub = new BulkSubscriptionSender();
+ $sent = $sub->sendBulk($ID);
+
+ echo "sendDigest(): sent $sent mails" . NL;
+ echo 'sendDigest(): finished' . NL;
+ return (bool)$sent;
+ }
+}
diff --git a/inc/Ui/Admin.php b/inc/Ui/Admin.php
index aa3b8b99e..fe319d414 100644
--- a/inc/Ui/Admin.php
+++ b/inc/Ui/Admin.php
@@ -12,6 +12,9 @@ namespace dokuwiki\Ui;
*/
class Admin extends Ui {
+ protected $forAdmins = array('usermanager', 'acl', 'extension', 'config', 'styling');
+ protected $forManagers = array('revert', 'popularity');
+ /** @var array[] */
protected $menu;
/**
@@ -24,58 +27,30 @@ class Admin extends Ui {
echo '<div class="ui-admin">';
echo p_locale_xhtml('admin');
$this->showSecurityCheck();
- $this->showAdminMenu();
- $this->showManagerMenu();
+ $this->showMenu('admin');
+ $this->showMenu('manager');
$this->showVersion();
- $this->showPluginMenu();
+ $this->showMenu('other');
echo '</div>';
}
/**
- * Display the standard admin tasks
+ * Show the given menu of available plugins
+ *
+ * @param string $type admin|manager|other
*/
- protected function showAdminMenu() {
- /** @var \DokuWiki_Auth_Plugin $auth */
- global $auth;
- global $INFO;
-
- if(!$INFO['isadmin']) return;
-
- // user manager only if the auth backend supports it
- if(!$auth || !$auth->canDo('getUsers') ) {
- if(isset($this->menu['usermanager'])) unset($this->menu['usermanager']);
+ protected function showMenu($type) {
+ if (!$this->menu[$type]) return;
+
+ if ($type === 'other') {
+ echo p_locale_xhtml('adminplugins');
+ $class = 'admin_plugins';
+ } else {
+ $class = 'admin_tasks';
}
- echo '<ul class="admin_tasks">';
- foreach(array('usermanager','acl', 'extension', 'config', 'styling') as $plugin) {
- if(!isset($this->menu[$plugin])) continue;
- $this->showMenuItem($this->menu[$plugin]);
- unset($this->menu[$plugin]);
- }
- echo '</ul>';
- }
-
- /**
- * Display the standard manager tasks
- */
- protected function showManagerMenu() {
- echo '<ul class="admin_tasks">';
- foreach(array('revert','popularity') as $plugin) {
- if(!isset($this->menu[$plugin])) continue;
- $this->showMenuItem($this->menu[$plugin]);
- unset($this->menu[$plugin]);
- }
- echo '</ul>';
- }
-
- /**
- * Display all the remaining plugins
- */
- protected function showPluginMenu() {
- if(!count($this->menu)) return;
- echo p_locale_xhtml('adminplugins');
- echo '<ul class="admin_plugins">';
- foreach ($this->menu as $item) {
+ echo "<ul class=\"$class\">";
+ foreach ($this->menu[$type] as $item) {
$this->showMenuItem($item);
}
echo '</ul>';
@@ -102,9 +77,11 @@ class Admin extends Ui {
protected function showSecurityCheck() {
global $conf;
if(substr($conf['savedir'], 0, 2) !== './') return;
+ $img = DOKU_URL . $conf['savedir'] .
+ '/dont-panic-if-you-see-this-in-your-logs-it-means-your-directory-permissions-are-correct.png';
echo '<a style="border:none; float:right;"
href="http://www.dokuwiki.org/security#web_access_security">
- <img src="' . DOKU_URL . $conf['savedir'] . '/dont-panic-if-you-see-this-in-your-logs-it-means-your-directory-permissions-are-correct.png" alt="Your data directory seems to be protected properly."
+ <img src="' . $img . '" alt="Your data directory seems to be protected properly."
onerror="this.parentNode.style.display=\'none\'" /></a>';
}
@@ -136,19 +113,27 @@ class Admin extends Ui {
* @return array list of plugins with their properties
*/
protected function getPluginList() {
- global $INFO;
global $conf;
$pluginlist = plugin_list('admin');
- $menu = array();
+ $menu = ['admin' => [], 'manager' => [], 'other' => []];
+
foreach($pluginlist as $p) {
- /** @var \DokuWiki_Admin_Plugin $obj */
+ /** @var \dokuwiki\Extension\AdminPlugin $obj */
if(($obj = plugin_load('admin', $p)) === null) continue;
// check permissions
- if($obj->forAdminOnly() && !$INFO['isadmin']) continue;
+ if (!$obj->isAccessibleByCurrentUser()) continue;
+
+ if (in_array($p, $this->forAdmins, true)) {
+ $type = 'admin';
+ } elseif (in_array($p, $this->forManagers, true)){
+ $type = 'manager';
+ } else {
+ $type = 'other';
+ }
- $menu[$p] = array(
+ $menu[$type][$p] = array(
'plugin' => $p,
'prompt' => $obj->getMenuText($conf['lang']),
'icon' => $obj->getMenuIcon(),
@@ -157,17 +142,26 @@ class Admin extends Ui {
}
// sort by name, then sort
- uasort(
- $menu,
- function ($a, $b) {
- $strcmp = strcasecmp($a['prompt'], $b['prompt']);
- if($strcmp != 0) return $strcmp;
- if($a['sort'] == $b['sort']) return 0;
- return ($a['sort'] < $b['sort']) ? -1 : 1;
- }
- );
+ uasort($menu['admin'], [$this, 'menuSort']);
+ uasort($menu['manager'], [$this, 'menuSort']);
+ uasort($menu['other'], [$this, 'menuSort']);
return $menu;
}
+ /**
+ * Custom sorting for admin menu
+ *
+ * We sort alphabetically first, then by sort value
+ *
+ * @param array $a
+ * @param array $b
+ * @return int
+ */
+ protected function menuSort($a, $b) {
+ $strcmp = strcasecmp($a['prompt'], $b['prompt']);
+ if($strcmp != 0) return $strcmp;
+ if($a['sort'] === $b['sort']) return 0;
+ return ($a['sort'] < $b['sort']) ? -1 : 1;
+ }
}
diff --git a/inc/Ui/Search.php b/inc/Ui/Search.php
index 419b967d7..e4eef6706 100644
--- a/inc/Ui/Search.php
+++ b/inc/Ui/Search.php
@@ -2,7 +2,8 @@
namespace dokuwiki\Ui;
-use \dokuwiki\Form\Form;
+use dokuwiki\Extension\Event;
+use dokuwiki\Form\Form;
class Search extends Ui
{
@@ -86,7 +87,7 @@ class Search extends Ui
$searchForm->addFieldsetClose();
- trigger_event('FORM_SEARCH_OUTPUT', $searchForm);
+ Event::createAndTrigger('FORM_SEARCH_OUTPUT', $searchForm);
return $searchForm->toHTML();
}
@@ -498,8 +499,8 @@ class Search extends Ui
*/
public function createPagenameFromQuery($parsedQuery)
{
- $cleanedQuery = cleanID($parsedQuery['query']);
- if ($cleanedQuery === $parsedQuery['query']) {
+ $cleanedQuery = cleanID($parsedQuery['query']); // already strtolowered
+ if ($cleanedQuery === \dokuwiki\Utf8\PhpString::strtolower($parsedQuery['query'])) {
return ':' . $cleanedQuery;
}
$pagename = '';
@@ -538,7 +539,7 @@ class Search extends Ui
'listItemContent' => [$link],
'page' => $id,
];
- trigger_event('SEARCH_RESULT_PAGELOOKUP', $eventData);
+ Event::createAndTrigger('SEARCH_RESULT_PAGELOOKUP', $eventData);
$html .= '<li>' . implode('', $eventData['listItemContent']) . '</li>';
}
$html .= '</ul> ';
@@ -587,7 +588,9 @@ class Search extends Ui
$resultBody = [];
$mtime = filemtime(wikiFN($id));
$lastMod = '<span class="lastmod">' . $lang['lastmod'] . '</span> ';
- $lastMod .= '<time datetime="' . date_iso8601($mtime) . '" title="'.dformat($mtime).'">' . dformat($mtime, '%f') . '</time>';
+ $lastMod .= '<time datetime="' . date_iso8601($mtime) . '" title="' . dformat($mtime) . '">' .
+ dformat($mtime, '%f') .
+ '</time>';
$resultBody['meta'] = $lastMod;
if ($cnt !== 0) {
$num++;
@@ -604,7 +607,7 @@ class Search extends Ui
'page' => $id,
'position' => $position,
];
- trigger_event('SEARCH_RESULT_FULLPAGE', $eventData);
+ Event::createAndTrigger('SEARCH_RESULT_FULLPAGE', $eventData);
$html .= '<div class="search_fullpage_result">';
$html .= '<dt>' . implode(' ', $eventData['resultHeader']) . '</dt>';
foreach ($eventData['resultBody'] as $class => $htmlContent) {
diff --git a/inc/Utf8/Asian.php b/inc/Utf8/Asian.php
new file mode 100644
index 000000000..c7baa3029
--- /dev/null
+++ b/inc/Utf8/Asian.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace dokuwiki\Utf8;
+
+/**
+ * Methods and constants to handle Asian "words"
+ *
+ * This uses a crude regexp to determine which parts of an Asian string should be treated as words.
+ * This is necessary because in some Asian languages a single unicode char represents a whole idea
+ * without spaces separating them.
+ */
+class Asian
+{
+
+ /**
+ * This defines a non-capturing group for the use in regular expressions to match any asian character that
+ * needs to be treated as a word. Uses the Unicode-Ranges for Asian characters taken from
+ * http://en.wikipedia.org/wiki/Unicode_block
+ */
+ const REGEXP =
+ '(?:' .
+
+ '[\x{0E00}-\x{0E7F}]' . // Thai
+
+ '|' .
+
+ '[' .
+ '\x{2E80}-\x{3040}' . // CJK -> Hangul
+ '\x{309D}-\x{30A0}' .
+ '\x{30FD}-\x{31EF}\x{3200}-\x{D7AF}' .
+ '\x{F900}-\x{FAFF}' . // CJK Compatibility Ideographs
+ '\x{FE30}-\x{FE4F}' . // CJK Compatibility Forms
+ "\xF0\xA0\x80\x80-\xF0\xAA\x9B\x9F" . // CJK Extension B
+ "\xF0\xAA\x9C\x80-\xF0\xAB\x9C\xBF" . // CJK Extension C
+ "\xF0\xAB\x9D\x80-\xF0\xAB\xA0\x9F" . // CJK Extension D
+ "\xF0\xAF\xA0\x80-\xF0\xAF\xAB\xBF" . // CJK Compatibility Supplement
+ ']' .
+
+ '|' .
+
+ '[' . // Hiragana/Katakana (can be two characters)
+ '\x{3042}\x{3044}\x{3046}\x{3048}' .
+ '\x{304A}-\x{3062}\x{3064}-\x{3082}' .
+ '\x{3084}\x{3086}\x{3088}-\x{308D}' .
+ '\x{308F}-\x{3094}' .
+ '\x{30A2}\x{30A4}\x{30A6}\x{30A8}' .
+ '\x{30AA}-\x{30C2}\x{30C4}-\x{30E2}' .
+ '\x{30E4}\x{30E6}\x{30E8}-\x{30ED}' .
+ '\x{30EF}-\x{30F4}\x{30F7}-\x{30FA}' .
+ '][' .
+ '\x{3041}\x{3043}\x{3045}\x{3047}\x{3049}' .
+ '\x{3063}\x{3083}\x{3085}\x{3087}\x{308E}\x{3095}-\x{309C}' .
+ '\x{30A1}\x{30A3}\x{30A5}\x{30A7}\x{30A9}' .
+ '\x{30C3}\x{30E3}\x{30E5}\x{30E7}\x{30EE}\x{30F5}\x{30F6}\x{30FB}\x{30FC}' .
+ '\x{31F0}-\x{31FF}' .
+ ']?' .
+ ')';
+
+
+ /**
+ * Check if the given term contains Asian word characters
+ *
+ * @param string $term
+ * @return bool
+ */
+ public static function isAsianWords($term)
+ {
+ return (bool)preg_match('/' . self::REGEXP . '/u', $term);
+ }
+
+ /**
+ * Surround all Asian words in the given text with the given separator
+ *
+ * @param string $text Original text containing asian words
+ * @param string $sep the separator to use
+ * @return string Text with separated asian words
+ */
+ public static function separateAsianWords($text, $sep = ' ')
+ {
+ // handle asian chars as single words (may fail on older PHP version)
+ $asia = @preg_replace('/(' . self::REGEXP . ')/u', $sep . '\1' . $sep, $text);
+ if (!is_null($asia)) $text = $asia; // recover from regexp falure
+
+ return $text;
+ }
+
+ /**
+ * Split the given text into separate parts
+ *
+ * Each part is either a non-asian string, or a single asian word
+ *
+ * @param string $term
+ * @return string[]
+ */
+ public static function splitAsianWords($term)
+ {
+ return preg_split('/(' . self::REGEXP . '+)/u', $term, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+ }
+}
diff --git a/inc/Utf8/Clean.php b/inc/Utf8/Clean.php
new file mode 100644
index 000000000..0975ff559
--- /dev/null
+++ b/inc/Utf8/Clean.php
@@ -0,0 +1,204 @@
+<?php
+
+namespace dokuwiki\Utf8;
+
+/**
+ * Methods to assess and clean UTF-8 strings
+ */
+class Clean
+{
+ /**
+ * Checks if a string contains 7bit ASCII only
+ *
+ * @author Andreas Haerter <andreas.haerter@dev.mail-node.com>
+ *
+ * @param string $str
+ * @return bool
+ */
+ public static function isASCII($str)
+ {
+ return (preg_match('/(?:[^\x00-\x7F])/', $str) !== 1);
+ }
+
+ /**
+ * Tries to detect if a string is in Unicode encoding
+ *
+ * @author <bmorel@ssi.fr>
+ * @link http://php.net/manual/en/function.utf8-encode.php
+ *
+ * @param string $str
+ * @return bool
+ */
+ public static function isUtf8($str)
+ {
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ $b = ord($str[$i]);
+ if ($b < 0x80) continue; # 0bbbbbbb
+ elseif (($b & 0xE0) === 0xC0) $n = 1; # 110bbbbb
+ elseif (($b & 0xF0) === 0xE0) $n = 2; # 1110bbbb
+ elseif (($b & 0xF8) === 0xF0) $n = 3; # 11110bbb
+ elseif (($b & 0xFC) === 0xF8) $n = 4; # 111110bb
+ elseif (($b & 0xFE) === 0xFC) $n = 5; # 1111110b
+ else return false; # Does not match any model
+
+ for ($j = 0; $j < $n; $j++) { # n bytes matching 10bbbbbb follow ?
+ if ((++$i === $len) || ((ord($str[$i]) & 0xC0) !== 0x80))
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Strips all high byte chars
+ *
+ * Returns a pure ASCII7 string
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $str
+ * @return string
+ */
+ public static function strip($str)
+ {
+ $ascii = '';
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ if (ord($str[$i]) < 128) {
+ $ascii .= $str[$i];
+ }
+ }
+ return $ascii;
+ }
+
+ /**
+ * Removes special characters (nonalphanumeric) from a UTF-8 string
+ *
+ * This function adds the controlchars 0x00 to 0x19 to the array of
+ * stripped chars (they are not included in $UTF8_SPECIAL_CHARS)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @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
+ */
+ public static function stripspecials($string, $repl = '', $additional = '')
+ {
+ static $specials = null;
+ if ($specials === null) {
+ $specials = preg_quote(Table::specialChars(), '/');
+ }
+
+ return preg_replace('/[' . $additional . '\x00-\x19' . $specials . ']/u', $repl, $string);
+ }
+
+ /**
+ * Replace bad bytes with an alternative character
+ *
+ * ASCII character is recommended for replacement char
+ *
+ * PCRE Pattern to locate bad bytes in a UTF-8 string
+ * Comes from W3 FAQ: Multilingual Forms
+ * Note: modified to include full ASCII range including control chars
+ *
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @see http://www.w3.org/International/questions/qa-forms-utf-8
+ *
+ * @param string $str to search
+ * @param string $replace to replace bad bytes with (defaults to '?') - use ASCII
+ * @return string
+ */
+ public static function replaceBadBytes($str, $replace = '')
+ {
+ $UTF8_BAD =
+ '([\x00-\x7F]' . # ASCII (including control chars)
+ '|[\xC2-\xDF][\x80-\xBF]' . # non-overlong 2-byte
+ '|\xE0[\xA0-\xBF][\x80-\xBF]' . # excluding overlongs
+ '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' . # straight 3-byte
+ '|\xED[\x80-\x9F][\x80-\xBF]' . # excluding surrogates
+ '|\xF0[\x90-\xBF][\x80-\xBF]{2}' . # planes 1-3
+ '|[\xF1-\xF3][\x80-\xBF]{3}' . # planes 4-15
+ '|\xF4[\x80-\x8F][\x80-\xBF]{2}' . # plane 16
+ '|(.{1}))'; # invalid byte
+ ob_start();
+ while (preg_match('/' . $UTF8_BAD . '/S', $str, $matches)) {
+ if (!isset($matches[2])) {
+ echo $matches[0];
+ } else {
+ echo $replace;
+ }
+ $str = substr($str, strlen($matches[0]));
+ }
+ return ob_get_clean();
+ }
+
+
+ /**
+ * Replace accented UTF-8 characters by unaccented ASCII-7 equivalents
+ *
+ * Use the optional parameter to just deaccent lower ($case = -1) or upper ($case = 1)
+ * letters. Default is to deaccent both cases ($case = 0)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $string
+ * @param int $case
+ * @return string
+ */
+ public static function deaccent($string, $case = 0)
+ {
+ if ($case <= 0) {
+ $string = strtr($string, Table::lowerAccents());
+ }
+ if ($case >= 0) {
+ $string = strtr($string, Table::upperAccents());
+ }
+ return $string;
+ }
+
+ /**
+ * Romanize a non-latin string
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $string
+ * @return string
+ */
+ public static function romanize($string)
+ {
+ if (self::isASCII($string)) return $string; //nothing to do
+
+ return strtr($string, Table::romanization());
+ }
+
+ /**
+ * adjust a byte index into a utf8 string to a utf8 character boundary
+ *
+ * @author chris smith <chris@jalakai.co.uk>
+ *
+ * @param string $str utf8 character string
+ * @param int $i byte index into $str
+ * @param bool $next direction to search for boundary, false = up (current character) true = down (next character)
+ * @return int byte index into $str now pointing to a utf8 character boundary
+ */
+ public static function correctIdx($str, $i, $next = false)
+ {
+
+ if ($i <= 0) return 0;
+
+ $limit = strlen($str);
+ if ($i >= $limit) return $limit;
+
+ if ($next) {
+ while (($i < $limit) && ((ord($str[$i]) & 0xC0) === 0x80)) $i++;
+ } else {
+ while ($i && ((ord($str[$i]) & 0xC0) === 0x80)) $i--;
+ }
+
+ return $i;
+ }
+
+}
diff --git a/inc/Utf8/Conversion.php b/inc/Utf8/Conversion.php
new file mode 100644
index 000000000..fad9cd0b1
--- /dev/null
+++ b/inc/Utf8/Conversion.php
@@ -0,0 +1,162 @@
+<?php
+
+namespace dokuwiki\Utf8;
+
+/**
+ * Methods to convert from and to UTF-8 strings
+ */
+class Conversion
+{
+
+ /**
+ * Encodes UTF-8 characters to HTML entities
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author <vpribish at shopping dot com>
+ * @link http://php.net/manual/en/function.utf8-decode.php
+ *
+ * @param string $str
+ * @param bool $all Encode non-utf8 char to HTML as well
+ * @return string
+ */
+ public static function toHtml($str, $all = false)
+ {
+ $ret = '';
+ foreach (Unicode::fromUtf8($str) as $cp) {
+ if ($cp < 0x80 && !$all) {
+ $ret .= chr($cp);
+ } elseif ($cp < 0x100) {
+ $ret .= "&#$cp;";
+ } else {
+ $ret .= '&#x' . dechex($cp) . ';';
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * Decodes HTML entities to UTF-8 characters
+ *
+ * Convert any &#..; entity to a codepoint,
+ * The entities flag defaults to only decoding numeric entities.
+ * Pass HTML_ENTITIES and named entities, including &amp; &lt; etc.
+ * are handled as well. Avoids the problem that would occur if you
+ * had to decode "&amp;#38;&#38;amp;#38;"
+ *
+ * unhtmlspecialchars(\dokuwiki\Utf8\Conversion::fromHtml($s)) -> "&#38;&#38;"
+ * \dokuwiki\Utf8\Conversion::fromHtml(unhtmlspecialchars($s)) -> "&&amp#38;"
+ * what it should be -> "&#38;&amp#38;"
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ *
+ * @param string $str UTF-8 encoded string
+ * @param boolean $entities decode name entities in addtition to numeric ones
+ * @return string UTF-8 encoded string with numeric (and named) entities replaced.
+ */
+ public static function fromHtml($str, $entities = false)
+ {
+ if (!$entities) {
+ return preg_replace_callback(
+ '/(&#([Xx])?([0-9A-Za-z]+);)/m',
+ [__CLASS__, 'decodeNumericEntity'],
+ $str
+ );
+ }
+
+ return preg_replace_callback(
+ '/&(#)?([Xx])?([0-9A-Za-z]+);/m',
+ [__CLASS__, 'decodeAnyEntity'],
+ $str
+ );
+ }
+
+ /**
+ * Decodes any HTML entity to it's correct UTF-8 char equivalent
+ *
+ * @param string $ent An entity
+ * @return string
+ */
+ protected static function decodeAnyEntity($ent)
+ {
+ // create the named entity lookup table
+ static $table = null;
+ if ($table === null) {
+ $table = get_html_translation_table(HTML_ENTITIES);
+ $table = array_flip($table);
+ $table = array_map(
+ static function ($c) {
+ return Unicode::toUtf8(array(ord($c)));
+ },
+ $table
+ );
+ }
+
+ if ($ent[1] === '#') {
+ return self::decodeNumericEntity($ent);
+ }
+
+ if (array_key_exists($ent[0], $table)) {
+ return $table[$ent[0]];
+ }
+
+ return $ent[0];
+ }
+
+ /**
+ * Decodes numeric HTML entities to their correct UTF-8 characters
+ *
+ * @param $ent string A numeric entity
+ * @return string|false
+ */
+ protected static function decodeNumericEntity($ent)
+ {
+ switch ($ent[2]) {
+ case 'X':
+ case 'x':
+ $cp = hexdec($ent[3]);
+ break;
+ default:
+ $cp = intval($ent[3]);
+ break;
+ }
+ return Unicode::toUtf8(array($cp));
+ }
+
+ /**
+ * UTF-8 to UTF-16BE conversion.
+ *
+ * Maybe really UCS-2 without mb_string due to utf8_to_unicode limits
+ *
+ * @param string $str
+ * @param bool $bom
+ * @return string
+ */
+ public static function toUtf16be($str, $bom = false)
+ {
+ $out = $bom ? "\xFE\xFF" : '';
+ if (UTF8_MBSTRING) {
+ return $out . mb_convert_encoding($str, 'UTF-16BE', 'UTF-8');
+ }
+
+ $uni = Unicode::fromUtf8($str);
+ foreach ($uni as $cp) {
+ $out .= pack('n', $cp);
+ }
+ return $out;
+ }
+
+ /**
+ * UTF-8 to UTF-16BE conversion.
+ *
+ * Maybe really UCS-2 without mb_string due to utf8_to_unicode limits
+ *
+ * @param string $str
+ * @return false|string
+ */
+ public static function fromUtf16be($str)
+ {
+ $uni = unpack('n*', $str);
+ return Unicode::toUtf8($uni);
+ }
+
+}
diff --git a/inc/Utf8/PhpString.php b/inc/Utf8/PhpString.php
new file mode 100644
index 000000000..5bcd601a4
--- /dev/null
+++ b/inc/Utf8/PhpString.php
@@ -0,0 +1,383 @@
+<?php
+
+namespace dokuwiki\Utf8;
+
+/**
+ * UTF-8 aware equivalents to PHP's string functions
+ */
+class PhpString
+{
+
+ /**
+ * A locale independent basename() implementation
+ *
+ * works around a bug in PHP's basename() implementation
+ *
+ * @param string $path A path
+ * @param string $suffix If the name component ends in suffix this will also be cut off
+ * @return string
+ * @link https://bugs.php.net/bug.php?id=37738
+ *
+ * @see basename()
+ */
+ public static function 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;
+ }
+
+ /**
+ * Unicode aware replacement for strlen()
+ *
+ * utf8_decode() converts characters that are not in ISO-8859-1
+ * to '?', which, for the purpose of counting, is alright - It's
+ * even faster than mb_strlen.
+ *
+ * @param string $string
+ * @return int
+ * @see utf8_decode()
+ *
+ * @author <chernyshevsky at hotmail dot com>
+ * @see strlen()
+ */
+ public static function strlen($string)
+ {
+ if (function_exists('utf8_decode')) {
+ return strlen(utf8_decode($string));
+ }
+
+ if (UTF8_MBSTRING) {
+ return mb_strlen($string, 'UTF-8');
+ }
+
+ if (function_exists('iconv_strlen')) {
+ return iconv_strlen($string, 'UTF-8');
+ }
+
+ return strlen($string);
+ }
+
+ /**
+ * UTF-8 aware alternative to substr
+ *
+ * Return part of a string given character offset (and optionally length)
+ *
+ * @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 string
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ */
+ public static function substr($str, $offset, $length = null)
+ {
+ if (UTF8_MBSTRING) {
+ if ($length === null) {
+ return mb_substr($str, $offset);
+ }
+
+ return mb_substr($str, $offset, $length);
+ }
+
+ /*
+ * Notes:
+ *
+ * no mb string support, so we'll use pcre regex's with 'u' flag
+ * pcre only supports repetitions of less than 65536, in order to accept up to MAXINT values for
+ * offset and length, we'll repeat a group of 65535 characters when needed (ok, up to MAXINT-65536)
+ *
+ * substr documentation states false can be returned in some cases (e.g. offset > string length)
+ * mb_substr never returns false, it will return an empty string instead.
+ *
+ * calculating the number of characters in the string is a relatively expensive operation, so
+ * we only carry it out when necessary. It isn't necessary for +ve offsets and no specified length
+ */
+
+ // cast parameters to appropriate types to avoid multiple notices/warnings
+ $str = (string)$str; // generates E_NOTICE for PHP4 objects, but not PHP5 objects
+ $offset = (int)$offset;
+ if ($length !== null) $length = (int)$length;
+
+ // handle trivial cases
+ if ($length === 0) return '';
+ if ($offset < 0 && $length < 0 && $length < $offset) return '';
+
+ $offset_pattern = '';
+ $length_pattern = '';
+
+ // normalise -ve offsets (we could use a tail anchored pattern, but they are horribly slow!)
+ if ($offset < 0) {
+ $strlen = self::strlen($str); // see notes
+ $offset = $strlen + $offset;
+ if ($offset < 0) $offset = 0;
+ }
+
+ // establish a pattern for offset, a non-captured group equal in length to offset
+ if ($offset > 0) {
+ $Ox = (int)($offset / 65535);
+ $Oy = $offset % 65535;
+
+ if ($Ox) $offset_pattern = '(?:.{65535}){' . $Ox . '}';
+ $offset_pattern = '^(?:' . $offset_pattern . '.{' . $Oy . '})';
+ } else {
+ $offset_pattern = '^'; // offset == 0; just anchor the pattern
+ }
+
+ // establish a pattern for length
+ if ($length === null) {
+ $length_pattern = '(.*)$'; // the rest of the string
+ } else {
+
+ if (!isset($strlen)) $strlen = self::strlen($str); // see notes
+ if ($offset > $strlen) return ''; // another trivial case
+
+ if ($length > 0) {
+
+ // reduce any length that would go past the end of the string
+ $length = min($strlen - $offset, $length);
+
+ $Lx = (int)($length / 65535);
+ $Ly = $length % 65535;
+
+ // +ve length requires ... a captured group of length characters
+ if ($Lx) $length_pattern = '(?:.{65535}){' . $Lx . '}';
+ $length_pattern = '(' . $length_pattern . '.{' . $Ly . '})';
+
+ } else if ($length < 0) {
+
+ if ($length < ($offset - $strlen)) return '';
+
+ $Lx = (int)((-$length) / 65535);
+ $Ly = (-$length) % 65535;
+
+ // -ve length requires ... capture everything except a group of -length characters
+ // anchored at the tail-end of the string
+ if ($Lx) $length_pattern = '(?:.{65535}){' . $Lx . '}';
+ $length_pattern = '(.*)(?:' . $length_pattern . '.{' . $Ly . '})$';
+ }
+ }
+
+ if (!preg_match('#' . $offset_pattern . $length_pattern . '#us', $str, $match)) return '';
+ return $match[1];
+ }
+
+ // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
+ /**
+ * Unicode aware replacement for substr_replace()
+ *
+ * @param string $string input string
+ * @param string $replacement the replacement
+ * @param int $start the replacing will begin at the start'th offset into string.
+ * @param int $length If given and is positive, it represents the length of the portion of string which is
+ * to be replaced. If length is zero then this function will have the effect of inserting
+ * replacement into string at the given start offset.
+ * @return string
+ * @see substr_replace()
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public static function substr_replace($string, $replacement, $start, $length = 0)
+ {
+ $ret = '';
+ if ($start > 0) $ret .= self::substr($string, 0, $start);
+ $ret .= $replacement;
+ $ret .= self::substr($string, $start + $length);
+ return $ret;
+ }
+ // phpcs:enable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
+
+ /**
+ * Unicode aware replacement for ltrim()
+ *
+ * @param string $str
+ * @param string $charlist
+ * @return string
+ * @see ltrim()
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public static function ltrim($str, $charlist = '')
+ {
+ if ($charlist === '') return ltrim($str);
+
+ //quote charlist for use in a characterclass
+ $charlist = preg_replace('!([\\\\\\-\\]\\[/])!', '\\\${1}', $charlist);
+
+ return preg_replace('/^[' . $charlist . ']+/u', '', $str);
+ }
+
+ /**
+ * Unicode aware replacement for rtrim()
+ *
+ * @param string $str
+ * @param string $charlist
+ * @return string
+ * @see rtrim()
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public static function rtrim($str, $charlist = '')
+ {
+ if ($charlist === '') return rtrim($str);
+
+ //quote charlist for use in a characterclass
+ $charlist = preg_replace('!([\\\\\\-\\]\\[/])!', '\\\${1}', $charlist);
+
+ return preg_replace('/[' . $charlist . ']+$/u', '', $str);
+ }
+
+ /**
+ * Unicode aware replacement for trim()
+ *
+ * @param string $str
+ * @param string $charlist
+ * @return string
+ * @see trim()
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public static function trim($str, $charlist = '')
+ {
+ if ($charlist === '') return trim($str);
+
+ return self::ltrim(self::rtrim($str, $charlist), $charlist);
+ }
+
+ /**
+ * This is a unicode aware replacement for strtolower()
+ *
+ * Uses mb_string extension if available
+ *
+ * @param string $string
+ * @return string
+ * @see \dokuwiki\Utf8\PhpString::strtoupper()
+ *
+ * @author Leo Feyer <leo@typolight.org>
+ * @see strtolower()
+ */
+ public static function strtolower($string)
+ {
+ if (UTF8_MBSTRING) {
+ if (class_exists('Normalizer', $autoload = false)) {
+ return \Normalizer::normalize(mb_strtolower($string, 'utf-8'));
+ }
+ return (mb_strtolower($string, 'utf-8'));
+ }
+ return strtr($string, Table::upperCaseToLowerCase());
+ }
+
+ /**
+ * This is a unicode aware replacement for strtoupper()
+ *
+ * Uses mb_string extension if available
+ *
+ * @param string $string
+ * @return string
+ * @see \dokuwiki\Utf8\PhpString::strtoupper()
+ *
+ * @author Leo Feyer <leo@typolight.org>
+ * @see strtoupper()
+ */
+ public static function strtoupper($string)
+ {
+ if (UTF8_MBSTRING) return mb_strtoupper($string, 'utf-8');
+
+ return strtr($string, Table::lowerCaseToUpperCase());
+ }
+
+
+ /**
+ * UTF-8 aware alternative to ucfirst
+ * Make a string's first character uppercase
+ *
+ * @param string $str
+ * @return string with first character as upper case (if applicable)
+ * @author Harry Fuecks
+ *
+ */
+ public static function ucfirst($str)
+ {
+ switch (self::strlen($str)) {
+ case 0:
+ return '';
+ case 1:
+ return self::strtoupper($str);
+ default:
+ preg_match('/^(.{1})(.*)$/us', $str, $matches);
+ return self::strtoupper($matches[1]) . $matches[2];
+ }
+ }
+
+ /**
+ * UTF-8 aware alternative to ucwords
+ * Uppercase the first character of each word in a string
+ *
+ * @param string $str
+ * @return string with first char of each word uppercase
+ * @author Harry Fuecks
+ * @see http://php.net/ucwords
+ *
+ */
+ public static function ucwords($str)
+ {
+ // Note: [\x0c\x09\x0b\x0a\x0d\x20] matches;
+ // form feeds, horizontal tabs, vertical tabs, linefeeds and carriage returns
+ // This corresponds to the definition of a "word" defined at http://php.net/ucwords
+ $pattern = '/(^|([\x0c\x09\x0b\x0a\x0d\x20]+))([^\x0c\x09\x0b\x0a\x0d\x20]{1})[^\x0c\x09\x0b\x0a\x0d\x20]*/u';
+
+ return preg_replace_callback(
+ $pattern,
+ function ($matches) {
+ $leadingws = $matches[2];
+ $ucfirst = self::strtoupper($matches[3]);
+ $ucword = self::substr_replace(ltrim($matches[0]), $ucfirst, 0, 1);
+ return $leadingws . $ucword;
+ },
+ $str
+ );
+ }
+
+ /**
+ * This is an Unicode aware replacement for strpos
+ *
+ * @param string $haystack
+ * @param string $needle
+ * @param integer $offset
+ * @return integer
+ * @author Leo Feyer <leo@typolight.org>
+ * @see strpos()
+ *
+ */
+ public static function strpos($haystack, $needle, $offset = 0)
+ {
+ $comp = 0;
+ $length = null;
+
+ while ($length === null || $length < $offset) {
+ $pos = strpos($haystack, $needle, $offset + $comp);
+
+ if ($pos === false)
+ return false;
+
+ $length = self::strlen(substr($haystack, 0, $pos));
+
+ if ($length < $offset)
+ $comp = $pos - $length;
+ }
+
+ return $length;
+ }
+
+
+}
diff --git a/inc/Utf8/Table.php b/inc/Utf8/Table.php
new file mode 100644
index 000000000..8683c9238
--- /dev/null
+++ b/inc/Utf8/Table.php
@@ -0,0 +1,93 @@
+<?php
+
+namespace dokuwiki\Utf8;
+
+/**
+ * Provides static access to the UTF-8 conversion tables
+ *
+ * Lazy-Loads tables on first access
+ */
+class Table
+{
+
+ /**
+ * Get the upper to lower case conversion table
+ *
+ * @return array
+ */
+ public static function upperCaseToLowerCase()
+ {
+ static $table = null;
+ if ($table === null) $table = include __DIR__ . '/tables/case.php';
+ return $table;
+ }
+
+ /**
+ * Get the lower to upper case conversion table
+ *
+ * @return array
+ */
+ public static function lowerCaseToUpperCase()
+ {
+ static $table = null;
+ if ($table === null) {
+ $uclc = self::upperCaseToLowerCase();
+ $table = array_flip($uclc);
+ }
+ return $table;
+ }
+
+ /**
+ * Get the lower case accent table
+ * @return array
+ */
+ public static function lowerAccents()
+ {
+ static $table = null;
+ if ($table === null) {
+ $table = include __DIR__ . '/tables/loweraccents.php';
+ }
+ return $table;
+ }
+
+ /**
+ * Get the lower case accent table
+ * @return array
+ */
+ public static function upperAccents()
+ {
+ static $table = null;
+ if ($table === null) {
+ $table = include __DIR__ . '/tables/upperaccents.php';
+ }
+ return $table;
+ }
+
+ /**
+ * Get the romanization table
+ * @return array
+ */
+ public static function romanization()
+ {
+ static $table = null;
+ if ($table === null) {
+ $table = include __DIR__ . '/tables/romanization.php';
+ }
+ return $table;
+ }
+
+ /**
+ * Get the special chars as a concatenated string
+ * @return string
+ */
+ public static function specialChars()
+ {
+ static $string = null;
+ if ($string === null) {
+ $table = include __DIR__ . '/tables/specials.php';
+ // FIXME should we cache this to file system?
+ $string = Unicode::toUtf8($table);
+ }
+ return $string;
+ }
+}
diff --git a/inc/Utf8/Unicode.php b/inc/Utf8/Unicode.php
new file mode 100644
index 000000000..4b6426533
--- /dev/null
+++ b/inc/Utf8/Unicode.php
@@ -0,0 +1,277 @@
+<?php
+
+namespace dokuwiki\Utf8;
+
+/**
+ * Convert between UTF-8 and a list of Unicode Code Points
+ */
+class Unicode
+{
+
+ /**
+ * Takes an UTF-8 string and returns an array of ints representing the
+ * Unicode characters. Astral planes are supported ie. the ints in the
+ * output can be > 0xFFFF. Occurrances of the BOM are ignored. Surrogates
+ * are not allowed.
+ *
+ * If $strict is set to true the function returns false if the input
+ * string isn't a valid UTF-8 octet sequence and raises a PHP error at
+ * level E_USER_WARNING
+ *
+ * Note: this function has been modified slightly in this library to
+ * trigger errors on encountering bad bytes
+ *
+ * @author <hsivonen@iki.fi>
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @see unicode_to_utf8
+ * @link http://hsivonen.iki.fi/php-utf8/
+ * @link http://sourceforge.net/projects/phputf8/
+ * @todo break into less complex chunks
+ * @todo use exceptions instead of user errors
+ *
+ * @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
+ */
+ public static function fromUtf8($str, $strict = false)
+ {
+ $mState = 0; // cached expected number of octets after the current octet
+ // until the beginning of the next UTF8 character sequence
+ $mUcs4 = 0; // cached Unicode character
+ $mBytes = 1; // cached expected number of octets in the current sequence
+
+ $out = array();
+
+ $len = strlen($str);
+
+ for ($i = 0; $i < $len; $i++) {
+
+ $in = ord($str[$i]);
+
+ if ($mState === 0) {
+
+ // When mState is zero we expect either a US-ASCII character or a
+ // multi-octet sequence.
+ if (0 === (0x80 & $in)) {
+ // US-ASCII, pass straight through.
+ $out[] = $in;
+ $mBytes = 1;
+
+ } else if (0xC0 === (0xE0 & $in)) {
+ // First octet of 2 octet sequence
+ $mUcs4 = $in;
+ $mUcs4 = ($mUcs4 & 0x1F) << 6;
+ $mState = 1;
+ $mBytes = 2;
+
+ } else if (0xE0 === (0xF0 & $in)) {
+ // First octet of 3 octet sequence
+ $mUcs4 = $in;
+ $mUcs4 = ($mUcs4 & 0x0F) << 12;
+ $mState = 2;
+ $mBytes = 3;
+
+ } else if (0xF0 === (0xF8 & $in)) {
+ // First octet of 4 octet sequence
+ $mUcs4 = $in;
+ $mUcs4 = ($mUcs4 & 0x07) << 18;
+ $mState = 3;
+ $mBytes = 4;
+
+ } else if (0xF8 === (0xFC & $in)) {
+ /* First octet of 5 octet sequence.
+ *
+ * This is illegal because the encoded codepoint must be either
+ * (a) not the shortest form or
+ * (b) outside the Unicode range of 0-0x10FFFF.
+ * Rather than trying to resynchronize, we will carry on until the end
+ * of the sequence and let the later error handling code catch it.
+ */
+ $mUcs4 = $in;
+ $mUcs4 = ($mUcs4 & 0x03) << 24;
+ $mState = 4;
+ $mBytes = 5;
+
+ } else if (0xFC === (0xFE & $in)) {
+ // First octet of 6 octet sequence, see comments for 5 octet sequence.
+ $mUcs4 = $in;
+ $mUcs4 = ($mUcs4 & 1) << 30;
+ $mState = 5;
+ $mBytes = 6;
+
+ } elseif ($strict) {
+ /* Current octet is neither in the US-ASCII range nor a legal first
+ * octet of a multi-octet sequence.
+ */
+ trigger_error(
+ 'utf8_to_unicode: Illegal sequence identifier ' .
+ 'in UTF-8 at byte ' . $i,
+ E_USER_WARNING
+ );
+ return false;
+
+ }
+
+ } else {
+
+ // When mState is non-zero, we expect a continuation of the multi-octet
+ // sequence
+ if (0x80 === (0xC0 & $in)) {
+
+ // Legal continuation.
+ $shift = ($mState - 1) * 6;
+ $tmp = $in;
+ $tmp = ($tmp & 0x0000003F) << $shift;
+ $mUcs4 |= $tmp;
+
+ /**
+ * End of the multi-octet sequence. mUcs4 now contains the final
+ * Unicode codepoint to be output
+ */
+ if (0 === --$mState) {
+
+ /*
+ * Check for illegal sequences and codepoints.
+ */
+ // From Unicode 3.1, non-shortest form is illegal
+ if (((2 === $mBytes) && ($mUcs4 < 0x0080)) ||
+ ((3 === $mBytes) && ($mUcs4 < 0x0800)) ||
+ ((4 === $mBytes) && ($mUcs4 < 0x10000)) ||
+ (4 < $mBytes) ||
+ // From Unicode 3.2, surrogate characters are illegal
+ (($mUcs4 & 0xFFFFF800) === 0xD800) ||
+ // Codepoints outside the Unicode range are illegal
+ ($mUcs4 > 0x10FFFF)) {
+
+ if ($strict) {
+ trigger_error(
+ 'utf8_to_unicode: Illegal sequence or codepoint ' .
+ 'in UTF-8 at byte ' . $i,
+ E_USER_WARNING
+ );
+
+ return false;
+ }
+
+ }
+
+ if (0xFEFF !== $mUcs4) {
+ // BOM is legal but we don't want to output it
+ $out[] = $mUcs4;
+ }
+
+ //initialize UTF8 cache
+ $mState = 0;
+ $mUcs4 = 0;
+ $mBytes = 1;
+ }
+
+ } elseif ($strict) {
+ /**
+ *((0xC0 & (*in) != 0x80) && (mState != 0))
+ * Incomplete multi-octet sequence.
+ */
+ trigger_error(
+ 'utf8_to_unicode: Incomplete multi-octet ' .
+ ' sequence in UTF-8 at byte ' . $i,
+ E_USER_WARNING
+ );
+
+ return false;
+ }
+ }
+ }
+ return $out;
+ }
+
+ /**
+ * Takes an array of ints representing the Unicode characters and returns
+ * a UTF-8 string. Astral planes are supported ie. the ints in the
+ * input can be > 0xFFFF. Occurrances of the BOM are ignored. Surrogates
+ * are not allowed.
+ *
+ * If $strict is set to true the function returns false if the input
+ * array contains ints that represent surrogates or are outside the
+ * Unicode range and raises a PHP error at level E_USER_WARNING
+ *
+ * Note: this function has been modified slightly in this library to use
+ * output buffering to concatenate the UTF-8 string (faster) as well as
+ * reference the array by it's keys
+ *
+ * @param array $arr of unicode code points representing a string
+ * @param boolean $strict Check for invalid sequences?
+ * @return string|false UTF-8 string or false if array contains invalid code points
+ *
+ * @author <hsivonen@iki.fi>
+ * @author Harry Fuecks <hfuecks@gmail.com>
+ * @see utf8_to_unicode
+ * @link http://hsivonen.iki.fi/php-utf8/
+ * @link http://sourceforge.net/projects/phputf8/
+ * @todo use exceptions instead of user errors
+ */
+ public static function toUtf8($arr, $strict = false)
+ {
+ if (!is_array($arr)) return '';
+ ob_start();
+
+ foreach (array_keys($arr) as $k) {
+
+ if (($arr[$k] >= 0) && ($arr[$k] <= 0x007f)) {
+ # ASCII range (including control chars)
+
+ echo chr($arr[$k]);
+
+ } else if ($arr[$k] <= 0x07ff) {
+ # 2 byte sequence
+
+ echo chr(0xc0 | ($arr[$k] >> 6));
+ echo chr(0x80 | ($arr[$k] & 0x003f));
+
+ } else if ($arr[$k] == 0xFEFF) {
+ # Byte order mark (skip)
+ // nop -- zap the BOM
+
+ } else if ($arr[$k] >= 0xD800 && $arr[$k] <= 0xDFFF) {
+ # Test for illegal surrogates
+
+ // found a surrogate
+ if ($strict) {
+ trigger_error(
+ 'unicode_to_utf8: Illegal surrogate ' .
+ 'at index: ' . $k . ', value: ' . $arr[$k],
+ E_USER_WARNING
+ );
+ return false;
+ }
+
+ } else if ($arr[$k] <= 0xffff) {
+ # 3 byte sequence
+
+ echo chr(0xe0 | ($arr[$k] >> 12));
+ echo chr(0x80 | (($arr[$k] >> 6) & 0x003f));
+ echo chr(0x80 | ($arr[$k] & 0x003f));
+
+ } else if ($arr[$k] <= 0x10ffff) {
+ # 4 byte sequence
+
+ echo chr(0xf0 | ($arr[$k] >> 18));
+ echo chr(0x80 | (($arr[$k] >> 12) & 0x3f));
+ echo chr(0x80 | (($arr[$k] >> 6) & 0x3f));
+ echo chr(0x80 | ($arr[$k] & 0x3f));
+
+ } elseif ($strict) {
+
+ trigger_error(
+ 'unicode_to_utf8: Codepoint out of Unicode range ' .
+ 'at index: ' . $k . ', value: ' . $arr[$k],
+ E_USER_WARNING
+ );
+
+ // out of range
+ return false;
+ }
+ }
+
+ return ob_get_clean();
+ }
+}
diff --git a/inc/Utf8/tables/case.php b/inc/Utf8/tables/case.php
new file mode 100644
index 000000000..ac5f5629e
--- /dev/null
+++ b/inc/Utf8/tables/case.php
@@ -0,0 +1,567 @@
+<?php
+/**
+ * UTF-8 Case lookup table
+ *
+ * This lookuptable defines the lower case letters to their corresponding
+ * upper case letter in UTF-8
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+return [
+ 'A' => 'a',
+ 'A' => 'a',
+ 'Á' => 'á',
+ 'À' => 'à',
+ 'Ă' => 'ă',
+ 'Ắ' => 'ắ',
+ 'Ẵ' => 'ẵ',
+ 'Ẳ' => 'ẳ',
+ 'Â' => 'â',
+ 'Ấ' => 'ấ',
+ 'Ầ' => 'ầ',
+ 'Ẫ' => 'ẫ',
+ 'Ǎ' => 'ǎ',
+ 'Å' => 'å',
+ 'Ǻ' => 'ǻ',
+ 'Ä' => 'ä',
+ 'Ǟ' => 'ǟ',
+ 'Ã' => 'ã',
+ 'Ǡ' => 'ǡ',
+ 'Ą' => 'ą',
+ 'Ā' => 'ā',
+ 'Ả' => 'ả',
+ 'Ȁ' => 'ȁ',
+ 'Ȃ' => 'ȃ',
+ 'Ặ' => 'ặ',
+ 'Ậ' => 'ậ',
+ 'Ḁ' => 'ḁ',
+ 'Æ' => 'æ',
+ 'Ǽ' => 'ǽ',
+ 'Ǣ' => 'ǣ',
+ 'B' => 'b',
+ 'Ḃ' => 'ḃ',
+ 'Ḅ' => 'ḅ',
+ 'Ḇ' => 'ḇ',
+ 'Ɓ' => 'ɓ',
+ 'Ƃ' => 'ƃ',
+ 'C' => 'c',
+ 'Ć' => 'ć',
+ 'Ĉ' => 'ĉ',
+ 'Č' => 'č',
+ 'Ċ' => 'ċ',
+ 'Ç' => 'ç',
+ 'Ƈ' => 'ƈ',
+ 'D' => 'd',
+ 'D' => 'd',
+ 'Ď' => 'ď',
+ 'Ḋ' => 'ḋ',
+ 'Ḑ' => 'ḑ',
+ 'Ḍ' => 'ḍ',
+ 'Ḓ' => 'ḓ',
+ 'Ḏ' => 'ḏ',
+ 'Ð' => 'ð',
+ 'Dz' => 'dz', //FIXME
+ 'Dž' => 'dž', //FIXME
+ 'Ɗ' => 'ɗ',
+ 'Ƌ' => 'ƌ',
+ 'E' => 'e',
+ 'E' => 'e',
+ 'É' => 'é',
+ 'È' => 'è',
+ 'Ê' => 'ê',
+ 'Ế' => 'ế',
+ 'Ề' => 'ề',
+ 'Ễ' => 'ễ',
+ 'Ể' => 'ể',
+ 'Ě' => 'ě',
+ 'Ẽ' => 'ẽ',
+ 'Ė' => 'ė',
+ 'Ȩ' => 'ȩ',
+ 'Ḝ' => 'ḝ',
+ 'Ę' => 'ę',
+ 'Ē' => 'ē',
+ 'Ḕ' => 'ḕ',
+ 'Ẻ' => 'ẻ',
+ 'Ȅ' => 'ȅ',
+ 'Ȇ' => 'ȇ',
+ 'Ẹ' => 'ẹ',
+ 'Ệ' => 'ệ',
+ 'Ḛ' => 'ḛ',
+ 'Ǝ' => 'ǝ',
+ 'Ə' => 'ə',
+ 'Ɛ' => 'ɛ',
+ 'F' => 'f',
+ 'F' => 'f',
+ 'Ƒ' => 'ƒ',
+ 'G' => 'g',
+ 'G' => 'g',
+ 'Ǵ' => 'ǵ',
+ 'Ğ' => 'ğ',
+ 'Ĝ' => 'ĝ',
+ 'Ġ' => 'ġ',
+ 'Ģ' => 'ģ',
+ 'Ḡ' => 'ḡ',
+ 'Ǥ' => 'ǥ',
+ 'Ɣ' => 'ɣ',
+ 'Ƣ' => 'ƣ',
+ 'H' => 'h',
+ 'Ĥ' => 'ĥ',
+ 'Ȟ' => 'ȟ',
+ 'Ḧ' => 'ḧ',
+ 'Ḣ' => 'ḣ',
+ 'Ḩ' => 'ḩ',
+ 'Ḥ' => 'ḥ',
+ 'Ḫ' => 'ḫ',
+ 'Ƕ' => 'ƕ',
+ 'I' => 'i',
+ 'I' => 'i',
+ 'Í' => 'í',
+ 'Ĭ' => 'ĭ',
+ 'Î' => 'î',
+ 'Ǐ' => 'ǐ',
+ 'Ï' => 'ï',
+ 'Ḯ' => 'ḯ',
+ 'Ĩ' => 'ĩ',
+ 'Ī' => 'ī',
+ 'Ỉ' => 'ỉ',
+ 'Ȉ' => 'ȉ',
+ 'Ȋ' => 'ȋ',
+ 'Ị' => 'ị',
+ 'Ḭ' => 'ḭ',
+ 'Ɨ' => 'ɨ',
+ 'Ɩ' => 'ɩ',
+ 'J' => 'j',
+ 'J' => 'j',
+ 'Ĵ' => 'ĵ',
+ 'K' => 'k',
+ 'Ḱ' => 'ḱ',
+ 'Ǩ' => 'ǩ',
+ 'Ķ' => 'ķ',
+ 'Ḳ' => 'ḳ',
+ 'Ḵ' => 'ḵ',
+ 'Ƙ' => 'ƙ',
+ 'L' => 'l',
+ 'Ĺ' => 'ĺ',
+ 'Ľ' => 'ľ',
+ 'Ļ' => 'ļ',
+ 'Ł' => 'ł',
+ 'Ḷ' => 'ḷ',
+ 'Ḽ' => 'ḽ',
+ 'Ḻ' => 'ḻ',
+ 'Ŀ' => 'ŀ',
+ 'Lj' => 'lj', // FIXME
+ 'M' => 'm',
+ 'M' => 'm',
+ 'Ṁ' => 'ṁ',
+ 'Ṃ' => 'ṃ',
+ 'N' => 'n',
+ 'N' => 'n',
+ 'Ń' => 'ń',
+ 'Ǹ' => 'ǹ',
+ 'Ñ' => 'ñ',
+ 'Ṅ' => 'ṅ',
+ 'Ņ' => 'ņ',
+ 'Ṇ' => 'ṇ',
+ 'Ṋ' => 'ṋ',
+ 'Ṉ' => 'ṉ',
+ 'Ɲ' => 'ɲ',
+ 'Ƞ' => 'ƞ',
+ 'Ŋ' => 'ŋ',
+ 'O' => 'o',
+ 'O' => 'o',
+ 'Ó' => 'ó',
+ 'Ŏ' => 'ŏ',
+ 'Ô' => 'ô',
+ 'Ố' => 'ố',
+ 'Ồ' => 'ồ',
+ 'Ỗ' => 'ỗ',
+ 'Ổ' => 'ổ',
+ 'Ö' => 'ö',
+ 'Ȫ' => 'ȫ',
+ 'Ő' => 'ő',
+ 'Õ' => 'õ',
+ 'Ṍ' => 'ṍ',
+ 'Ṏ' => 'ṏ',
+ 'Ȯ' => 'ȯ',
+ 'Ȱ' => 'ȱ',
+ 'Ø' => 'ø',
+ 'Ǿ' => 'ǿ',
+ 'Ǫ' => 'ǫ',
+ 'Ǭ' => 'ǭ',
+ 'Ṓ' => 'ṓ',
+ 'Ṑ' => 'ṑ',
+ 'Ỏ' => 'ỏ',
+ 'Ȍ' => 'ȍ',
+ 'Ȏ' => 'ȏ',
+ 'Ơ' => 'ơ',
+ 'Ờ' => 'ờ',
+ 'Ỡ' => 'ỡ',
+ 'Ở' => 'ở',
+ 'Ợ' => 'ợ',
+ 'Ọ' => 'ọ',
+ 'Ộ' => 'ộ',
+ 'Ɔ' => 'ɔ',
+ 'Ɵ' => 'ɵ',
+ 'Ȣ' => 'ȣ',
+ 'P' => 'p',
+ 'P' => 'p',
+ 'Ṕ' => 'ṕ',
+ 'Ƥ' => 'ƥ',
+ 'Q' => 'q',
+ 'Q' => 'q',
+ 'R' => 'r',
+ 'R' => 'r',
+ 'Ŕ' => 'ŕ',
+ 'Ṙ' => 'ṙ',
+ 'Ŗ' => 'ŗ',
+ 'Ȑ' => 'ȑ',
+ 'Ȓ' => 'ȓ',
+ 'Ṛ' => 'ṛ',
+ 'Ṝ' => 'ṝ',
+ 'Ʀ' => 'ʀ',
+ 'S' => 's',
+ 'S' => 's',
+ 'Ś' => 'ś',
+ 'Ṥ' => 'ṥ',
+ 'Ŝ' => 'ŝ',
+ 'Ṧ' => 'ṧ',
+ 'Ṡ' => 'ṡ',
+ 'Ş' => 'ş',
+ 'Ṣ' => 'ṣ',
+ 'Ṩ' => 'ṩ',
+ 'Ș' => 'ș',
+ 'T' => 't',
+ 'T' => 't',
+ 'Ť' => 'ť',
+ 'Ṫ' => 'ṫ',
+ 'Ţ' => 'ţ',
+ 'Ṭ' => 'ṭ',
+ 'Ṱ' => 'ṱ',
+ 'Ṯ' => 'ṯ',
+ 'Ŧ' => 'ŧ',
+ 'Ƭ' => 'ƭ',
+ 'Ʈ' => 'ʈ',
+ 'U' => 'u',
+ 'Ú' => 'ú',
+ 'Ù' => 'ù',
+ 'Ŭ' => 'ŭ',
+ 'Û' => 'û',
+ 'Ǔ' => 'ǔ',
+ 'Ů' => 'ů',
+ 'Ǘ' => 'ǘ',
+ 'Ǜ' => 'ǜ',
+ 'Ǚ' => 'ǚ',
+ 'Ǖ' => 'ǖ',
+ 'Ű' => 'ű',
+ 'Ũ' => 'ũ',
+ 'Ų' => 'ų',
+ 'Ū' => 'ū',
+ 'Ṻ' => 'ṻ',
+ 'Ủ' => 'ủ',
+ 'Ȕ' => 'ȕ',
+ 'Ȗ' => 'ȗ',
+ 'Ứ' => 'ứ',
+ 'Ừ' => 'ừ',
+ 'Ữ' => 'ữ',
+ 'Ử' => 'ử',
+ 'Ự' => 'ự',
+ 'Ụ' => 'ụ',
+ 'Ṷ' => 'ṷ',
+ 'Ṵ' => 'ṵ',
+ 'Ɯ' => 'ɯ',
+ 'Ʊ' => 'ʊ',
+ 'V' => 'v',
+ 'V' => 'v',
+ 'Ṿ' => 'ṿ',
+ 'Ʋ' => 'ʋ',
+ 'W' => 'w',
+ 'W' => 'w',
+ 'Ẃ' => 'ẃ',
+ 'Ẁ' => 'ẁ',
+ 'Ẅ' => 'ẅ',
+ 'Ẇ' => 'ẇ',
+ 'Ẉ' => 'ẉ',
+ 'X' => 'x',
+ 'X' => 'x',
+ 'Ẍ' => 'ẍ',
+ 'Y' => 'y',
+ 'Y' => 'y',
+ 'Ý' => 'ý',
+ 'Ỳ' => 'ỳ',
+ 'Ŷ' => 'ŷ',
+ 'Ÿ' => 'ÿ',
+ 'Ẏ' => 'ẏ',
+ 'Ȳ' => 'ȳ',
+ 'Ỷ' => 'ỷ',
+ 'Ỵ' => 'ỵ',
+ 'Ƴ' => 'ƴ',
+ 'Ȝ' => 'ȝ',
+ 'Z' => 'z',
+ 'Ź' => 'ź',
+ 'Ẑ' => 'ẑ',
+ 'Ž' => 'ž',
+ 'Ż' => 'ż',
+ 'Ẓ' => 'ẓ',
+ 'Ƶ' => 'ƶ',
+ 'Ȥ' => 'ȥ',
+ 'Ʒ' => 'ʒ',
+ 'Ǯ' => 'ǯ',
+ 'Ƹ' => 'ƹ',
+ 'Þ' => 'þ',
+ 'Ƨ' => 'ƨ',
+ 'Ƽ' => 'ƽ',
+ 'Ƅ' => 'ƅ',
+ 'Α' => 'α',
+ 'Ἀ' => 'ἀ',
+ 'Ἄ' => 'ἄ',
+ 'Ἂ' => 'ἂ',
+ 'ᾊ' => 'ᾂ',
+ 'Ἆ' => 'ἆ',
+ 'ᾎ' => 'ᾆ',
+ 'ᾈ' => 'ᾀ',
+ 'Ἁ' => 'ἁ',
+ 'ᾍ' => 'ᾅ',
+ 'Ἃ' => 'ἃ',
+ 'ᾋ' => 'ᾃ',
+ 'Ἇ' => 'ἇ',
+ 'ᾏ' => 'ᾇ',
+ 'ᾉ' => 'ᾁ',
+ 'Ὰ' => 'ὰ',
+ 'Ᾰ' => 'ᾰ',
+ 'Ᾱ' => 'ᾱ',
+ 'ᾼ' => 'ᾳ',
+ 'Β' => 'β',
+ 'Γ' => 'γ',
+ 'Ε' => 'ε',
+ 'Ἐ' => 'ἐ',
+ 'Ἔ' => 'ἔ',
+ 'Ἒ' => 'ἒ',
+ 'Ἑ' => 'ἑ',
+ 'Ἕ' => 'ἕ',
+ 'Έ' => 'έ',
+ 'Ὲ' => 'ὲ',
+ 'Ϝ' => 'ϝ',
+ 'Ϛ' => 'ϛ',
+ 'Ζ' => 'ζ',
+ 'Η' => 'η',
+ 'ᾜ' => 'ᾔ',
+ 'Ἢ' => 'ἢ',
+ 'ᾚ' => 'ᾒ',
+ 'Ἦ' => 'ἦ',
+ 'ᾞ' => 'ᾖ',
+ 'ᾘ' => 'ᾐ',
+ 'Ἥ' => 'ἥ',
+ 'ᾝ' => 'ᾕ',
+ 'Ἣ' => 'ἣ',
+ 'ᾛ' => 'ᾓ',
+ 'Ἧ' => 'ἧ',
+ 'ᾟ' => 'ᾗ',
+ 'Ή' => 'ή',
+ 'Ὴ' => 'ὴ',
+ 'ῌ' => 'ῃ',
+ 'Θ' => 'θ',
+ 'Ι' => 'ι',
+ 'Ἰ' => 'ἰ',
+ 'Ἲ' => 'ἲ',
+ 'Ἶ' => 'ἶ',
+ 'Ἱ' => 'ἱ',
+ 'Ἵ' => 'ἵ',
+ 'Ἳ' => 'ἳ',
+ 'Ἷ' => 'ἷ',
+ 'Ὶ' => 'ὶ',
+ 'Ῐ' => 'ῐ',
+ 'Ϊ' => 'ϊ',
+ 'Ῑ' => 'ῑ',
+ 'Κ' => 'κ',
+ 'Λ' => 'λ',
+ 'Ν' => 'ν',
+ 'Ξ' => 'ξ',
+ 'Ο' => 'ο',
+ 'Ὀ' => 'ὀ',
+ 'Ὄ' => 'ὄ',
+ 'Ὂ' => 'ὂ',
+ 'Ὅ' => 'ὅ',
+ 'Ὃ' => 'ὃ',
+ 'Ό' => 'ό',
+ 'Ὸ' => 'ὸ',
+ 'Π' => 'π',
+ 'Ϟ' => 'ϟ',
+ 'Ρ' => 'ρ',
+ 'Ῥ' => 'ῥ',
+ 'Σ' => 'ς',
+ 'Τ' => 'τ',
+ 'Υ' => 'υ',
+ 'Ὑ' => 'ὑ',
+ 'Ὓ' => 'ὓ',
+ 'Ὗ' => 'ὗ',
+ 'Ύ' => 'ύ',
+ 'Ὺ' => 'ὺ',
+ 'Ϋ' => 'ϋ',
+ 'Ῡ' => 'ῡ',
+ 'Χ' => 'χ',
+ 'Ψ' => 'ψ',
+ 'Ω' => 'ω',
+ 'Ὤ' => 'ὤ',
+ 'ᾬ' => 'ᾤ',
+ 'Ὢ' => 'ὢ',
+ 'Ὦ' => 'ὦ',
+ 'ᾮ' => 'ᾦ',
+ 'Ὡ' => 'ὡ',
+ 'Ὥ' => 'ὥ',
+ 'ᾭ' => 'ᾥ',
+ 'Ὣ' => 'ὣ',
+ 'Ὧ' => 'ὧ',
+ 'ᾯ' => 'ᾧ',
+ 'ᾩ' => 'ᾡ',
+ 'Ώ' => 'ώ',
+ 'Ὼ' => 'ὼ',
+ 'ῼ' => 'ῳ',
+ 'Ϣ' => 'ϣ',
+ 'Ϥ' => 'ϥ',
+ 'Ϧ' => 'ϧ',
+ 'Ϩ' => 'ϩ',
+ 'Ϫ' => 'ϫ',
+ 'Ϭ' => 'ϭ',
+ 'А' => 'а',
+ 'Ӑ' => 'ӑ',
+ 'Ӓ' => 'ӓ',
+ 'Ә' => 'ә',
+ 'Ӛ' => 'ӛ',
+ 'Ӕ' => 'ӕ',
+ 'В' => 'в',
+ 'Г' => 'г',
+ 'Ѓ' => 'ѓ',
+ 'Ґ' => 'ґ',
+ 'Ғ' => 'ғ',
+ 'Ҕ' => 'ҕ',
+ 'Ԁ' => 'ԁ',
+ 'Ђ' => 'ђ',
+ 'Ԃ' => 'ԃ',
+ 'Ҙ' => 'ҙ',
+ 'Е' => 'е',
+ 'Ѐ' => 'ѐ',
+ 'Ё' => 'ё',
+ 'Є' => 'є',
+ 'Ж' => 'ж',
+ 'Ӂ' => 'ӂ',
+ 'Ӝ' => 'ӝ',
+ 'Җ' => 'җ',
+ 'Ӟ' => 'ӟ',
+ 'Ԅ' => 'ԅ',
+ 'Ѕ' => 'ѕ',
+ 'Ӡ' => 'ӡ',
+ 'Ԇ' => 'ԇ',
+ 'И' => 'и',
+ 'Ӥ' => 'ӥ',
+ 'Ӣ' => 'ӣ',
+ 'Ҋ' => 'ҋ',
+ 'І' => 'і',
+ 'Ї' => 'ї',
+ 'Й' => 'й',
+ 'К' => 'к',
+ 'Ќ' => 'ќ',
+ 'Қ' => 'қ',
+ 'Ӄ' => 'ӄ',
+ 'Ҡ' => 'ҡ',
+ 'Ҟ' => 'ҟ',
+ 'Л' => 'л',
+ 'Ӆ' => 'ӆ',
+ 'Љ' => 'љ',
+ 'Ԉ' => 'ԉ',
+ 'М' => 'м',
+ 'Ӎ' => 'ӎ',
+ 'Ӊ' => 'ӊ',
+ 'Ң' => 'ң',
+ 'Ӈ' => 'ӈ',
+ 'Ҥ' => 'ҥ',
+ 'Њ' => 'њ',
+ 'Ԋ' => 'ԋ',
+ 'Ӧ' => 'ӧ',
+ 'Ө' => 'ө',
+ 'Ӫ' => 'ӫ',
+ 'П' => 'п',
+ 'Ҧ' => 'ҧ',
+ 'Ҁ' => 'ҁ',
+ 'Ҏ' => 'ҏ',
+ 'С' => 'с',
+ 'Ԍ' => 'ԍ',
+ 'Ҫ' => 'ҫ',
+ 'Т' => 'т',
+ 'Ԏ' => 'ԏ',
+ 'Ћ' => 'ћ',
+ 'У' => 'у',
+ 'Ў' => 'ў',
+ 'Ӱ' => 'ӱ',
+ 'Ӳ' => 'ӳ',
+ 'Ӯ' => 'ӯ',
+ 'Ұ' => 'ұ',
+ 'Ѹ' => 'ѹ',
+ 'Ф' => 'ф',
+ 'Х' => 'х',
+ 'Ҳ' => 'ҳ',
+ 'Һ' => 'һ',
+ 'Ѿ' => 'ѿ',
+ 'Ѽ' => 'ѽ',
+ 'Ѻ' => 'ѻ',
+ 'Ц' => 'ц',
+ 'Ҵ' => 'ҵ',
+ 'Ч' => 'ч',
+ 'Ҷ' => 'ҷ',
+ 'Ӌ' => 'ӌ',
+ 'Ҹ' => 'ҹ',
+ 'Ҽ' => 'ҽ',
+ 'Ҿ' => 'ҿ',
+ 'Џ' => 'џ',
+ 'Щ' => 'щ',
+ 'Ъ' => 'ъ',
+ 'Ы' => 'ы',
+ 'Ӹ' => 'ӹ',
+ 'Ь' => 'ь',
+ 'Ҍ' => 'ҍ',
+ 'Э' => 'э',
+ 'Ӭ' => 'ӭ',
+ 'Ю' => 'ю',
+ 'Я' => 'я',
+ 'Ѥ' => 'ѥ',
+ 'Ѧ' => 'ѧ',
+ 'Ѩ' => 'ѩ',
+ 'Ѭ' => 'ѭ',
+ 'Ѯ' => 'ѯ',
+ 'Ѱ' => 'ѱ',
+ 'Ѳ' => 'ѳ',
+ 'Ѵ' => 'ѵ',
+ 'Ҩ' => 'ҩ',
+ 'Ա' => 'ա',
+ 'Բ' => 'բ',
+ 'Գ' => 'գ',
+ 'Դ' => 'դ',
+ 'Ե' => 'ե',
+ 'Է' => 'է',
+ 'Ը' => 'ը',
+ 'Թ' => 'թ',
+ 'Ժ' => 'ժ',
+ 'Ի' => 'ի',
+ 'Լ' => 'լ',
+ 'Ծ' => 'ծ',
+ 'Կ' => 'կ',
+ 'Հ' => 'հ',
+ 'Ձ' => 'ձ',
+ 'Ղ' => 'ղ',
+ 'Ճ' => 'ճ',
+ 'Յ' => 'յ',
+ 'Ն' => 'ն',
+ 'Շ' => 'շ',
+ 'Ո' => 'ո',
+ 'Չ' => 'չ',
+ 'Պ' => 'պ',
+ 'Ռ' => 'ռ',
+ 'Ս' => 'ս',
+ 'Վ' => 'վ',
+ 'Տ' => 'տ',
+ 'Ր' => 'ր',
+ 'Ց' => 'ց',
+ 'Փ' => 'փ',
+ 'Ք' => 'ք',
+ 'Օ' => 'օ',
+ 'Ֆ' => 'ֆ',
+];
diff --git a/inc/Utf8/tables/loweraccents.php b/inc/Utf8/tables/loweraccents.php
new file mode 100644
index 000000000..cc3ec8eae
--- /dev/null
+++ b/inc/Utf8/tables/loweraccents.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * UTF-8 lookup table for lower case accented letters
+ *
+ * This lookuptable defines replacements for accented characters from the ASCII-7
+ * range. This are lower case letters only.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see \dokuwiki\Utf8\Clean::deaccent()
+ */
+return [
+ 'á' => 'a',
+ 'à' => 'a',
+ 'ă' => 'a',
+ 'â' => 'a',
+ 'å' => 'a',
+ 'ä' => 'ae',
+ 'ã' => 'a',
+ 'ą' => 'a',
+ 'ā' => 'a',
+ 'æ' => 'ae',
+ 'ḃ' => 'b',
+ 'ć' => 'c',
+ 'ĉ' => 'c',
+ 'č' => 'c',
+ 'ċ' => 'c',
+ 'ç' => 'c',
+ 'ď' => 'd',
+ 'ḋ' => 'd',
+ 'đ' => 'd',
+ 'ð' => 'dh',
+ 'é' => 'e',
+ 'è' => 'e',
+ 'ĕ' => 'e',
+ 'ê' => 'e',
+ 'ě' => 'e',
+ 'ë' => 'e',
+ 'ė' => 'e',
+ 'ę' => 'e',
+ 'ē' => 'e',
+ 'ḟ' => 'f',
+ 'ƒ' => 'f',
+ 'ğ' => 'g',
+ 'ĝ' => 'g',
+ 'ġ' => 'g',
+ 'ģ' => 'g',
+ 'ĥ' => 'h',
+ 'ħ' => 'h',
+ 'í' => 'i',
+ 'ì' => 'i',
+ 'î' => 'i',
+ 'ï' => 'i',
+ 'ĩ' => 'i',
+ 'į' => 'i',
+ 'ī' => 'i',
+ 'ĵ' => 'j',
+ 'ķ' => 'k',
+ 'ĺ' => 'l',
+ 'ľ' => 'l',
+ 'ļ' => 'l',
+ 'ł' => 'l',
+ 'ṁ' => 'm',
+ 'ń' => 'n',
+ 'ň' => 'n',
+ 'ñ' => 'n',
+ 'ņ' => 'n',
+ 'ó' => 'o',
+ 'ò' => 'o',
+ 'ô' => 'o',
+ 'ö' => 'oe',
+ 'ő' => 'o',
+ 'õ' => 'o',
+ 'ø' => 'o',
+ 'ō' => 'o',
+ 'ơ' => 'o',
+ 'ṗ' => 'p',
+ 'ŕ' => 'r',
+ 'ř' => 'r',
+ 'ŗ' => 'r',
+ 'ś' => 's',
+ 'ŝ' => 's',
+ 'š' => 's',
+ 'ṡ' => 's',
+ 'ş' => 's',
+ 'ș' => 's',
+ 'ß' => 'ss',
+ 'ť' => 't',
+ 'ṫ' => 't',
+ 'ţ' => 't',
+ 'ț' => 't',
+ 'ŧ' => 't',
+ 'ú' => 'u',
+ 'ù' => 'u',
+ 'ŭ' => 'u',
+ 'û' => 'u',
+ 'ů' => 'u',
+ 'ü' => 'ue',
+ 'ű' => 'u',
+ 'ũ' => 'u',
+ 'ų' => 'u',
+ 'ū' => 'u',
+ 'ư' => 'u',
+ 'ẃ' => 'w',
+ 'ẁ' => 'w',
+ 'ŵ' => 'w',
+ 'ẅ' => 'w',
+ 'ý' => 'y',
+ 'ỳ' => 'y',
+ 'ŷ' => 'y',
+ 'ÿ' => 'y',
+ 'ź' => 'z',
+ 'ž' => 'z',
+ 'ż' => 'z',
+ 'þ' => 'th',
+ 'µ' => 'u',
+];
diff --git a/inc/Utf8/tables/romanization.php b/inc/Utf8/tables/romanization.php
new file mode 100644
index 000000000..e757b9c4d
--- /dev/null
+++ b/inc/Utf8/tables/romanization.php
@@ -0,0 +1,1458 @@
+<?php
+/**
+ * Romanization lookup table
+ *
+ * This lookup tables provides a way to transform strings written in a language
+ * different from the ones based upon latin letters into plain ASCII.
+ *
+ * Please note: this is not a scientific transliteration table. It only works
+ * oneway from nonlatin to ASCII and it works by simple character replacement
+ * only. Specialities of each language are not supported.
+ *
+ * @todo some keys are used multiple times
+ * @todo remove or integrate commented pairs
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Vitaly Blokhin <vitinfo@vitn.com>
+ * @author Bisqwit <bisqwit@iki.fi>
+ * @author Arthit Suriyawongkul <arthit@gmail.com>
+ * @author Denis Scheither <amorphis@uni-bremen.de>
+ * @author Eivind Morland <eivind.morland@gmail.com>
+ * @link http://www.uconv.com/translit.htm
+ * @link http://kanjidict.stc.cx/hiragana.php?src=2
+ * @link http://www.translatum.gr/converter/greek-transliteration.htm
+ * @link http://en.wikipedia.org/wiki/Royal_Thai_General_System_of_Transcription
+ * @link http://www.btranslations.com/resources/romanization/korean.asp
+ */
+return [
+ // scandinavian - differs from what we do in deaccent
+ 'å' => 'a',
+ 'Å' => 'A',
+ 'ä' => 'a',
+ 'Ä' => 'A',
+ 'ö' => 'o',
+ 'Ö' => 'O',
+
+ //russian cyrillic
+ 'а' => 'a',
+ 'А' => 'A',
+ 'б' => 'b',
+ 'Б' => 'B',
+ 'в' => 'v',
+ 'В' => 'V',
+ 'г' => 'g',
+ 'Г' => 'G',
+ 'д' => 'd',
+ 'Д' => 'D',
+ 'е' => 'e',
+ 'Е' => 'E',
+ 'ё' => 'jo',
+ 'Ё' => 'Jo',
+ 'ж' => 'zh',
+ 'Ж' => 'Zh',
+ 'з' => 'z',
+ 'З' => 'Z',
+ 'и' => 'i',
+ 'И' => 'I',
+ 'й' => 'j',
+ 'Й' => 'J',
+ 'к' => 'k',
+ 'К' => 'K',
+ 'л' => 'l',
+ 'Л' => 'L',
+ 'м' => 'm',
+ 'М' => 'M',
+ 'н' => 'n',
+ 'Н' => 'N',
+ 'о' => 'o',
+ 'О' => 'O',
+ 'п' => 'p',
+ 'П' => 'P',
+ 'р' => 'r',
+ 'Р' => 'R',
+ 'с' => 's',
+ 'С' => 'S',
+ 'т' => 't',
+ 'Т' => 'T',
+ 'у' => 'u',
+ 'У' => 'U',
+ 'ф' => 'f',
+ 'Ф' => 'F',
+ 'х' => 'x',
+ 'Х' => 'X',
+ 'ц' => 'c',
+ 'Ц' => 'C',
+ 'ч' => 'ch',
+ 'Ч' => 'Ch',
+ 'ш' => 'sh',
+ 'Ш' => 'Sh',
+ 'щ' => 'sch',
+ 'Щ' => 'Sch',
+ 'ъ' => '',
+ 'Ъ' => '',
+ 'ы' => 'y',
+ 'Ы' => 'Y',
+ 'ь' => '',
+ 'Ь' => '',
+ 'э' => 'eh',
+ 'Э' => 'Eh',
+ 'ю' => 'ju',
+ 'Ю' => 'Ju',
+ 'я' => 'ja',
+ 'Я' => 'Ja',
+
+ // Ukrainian cyrillic
+ 'Ґ' => 'Gh',
+ 'ґ' => 'gh',
+ 'Є' => 'Je',
+ 'є' => 'je',
+ 'І' => 'I',
+ 'і' => 'i',
+ 'Ї' => 'Ji',
+ 'ї' => 'ji',
+
+ // Georgian
+ 'ა' => 'a',
+ 'ბ' => 'b',
+ 'გ' => 'g',
+ 'დ' => 'd',
+ 'ე' => 'e',
+ 'ვ' => 'v',
+ 'ზ' => 'z',
+ 'თ' => 'th',
+ 'ი' => 'i',
+ 'კ' => 'p',
+ 'ლ' => 'l',
+ 'მ' => 'm',
+ 'ნ' => 'n',
+ 'ო' => 'o',
+ 'პ' => 'p',
+ 'ჟ' => 'zh',
+ 'რ' => 'r',
+ 'ს' => 's',
+ 'ტ' => 't',
+ 'უ' => 'u',
+ 'ფ' => 'ph',
+ 'ქ' => 'kh',
+ 'ღ' => 'gh',
+ 'ყ' => 'q',
+ 'შ' => 'sh',
+ 'ჩ' => 'ch',
+ 'ც' => 'c',
+ 'ძ' => 'dh',
+ 'წ' => 'w',
+ 'ჭ' => 'j',
+ 'ხ' => 'x',
+ 'ჯ' => 'jh',
+ 'ჰ' => 'xh',
+
+ //Sanskrit
+ 'अ' => 'a',
+ 'आ' => 'ah',
+ 'इ' => 'i',
+ 'ई' => 'ih',
+ 'उ' => 'u',
+ 'ऊ' => 'uh',
+ 'ऋ' => 'ry',
+ 'ॠ' => 'ryh',
+ 'ऌ' => 'ly',
+ 'ॡ' => 'lyh',
+ 'ए' => 'e',
+ 'ऐ' => 'ay',
+ 'ओ' => 'o',
+ 'औ' => 'aw',
+ 'अं' => 'amh',
+ 'अः' => 'aq',
+ 'क' => 'k',
+ 'ख' => 'kh',
+ 'ग' => 'g',
+ 'घ' => 'gh',
+ 'ङ' => 'nh',
+ 'च' => 'c',
+ 'छ' => 'ch',
+ 'ज' => 'j',
+ 'झ' => 'jh',
+ 'ञ' => 'ny',
+ 'ट' => 'tq',
+ 'ठ' => 'tqh',
+ 'ड' => 'dq',
+ 'ढ' => 'dqh',
+ 'ण' => 'nq',
+ 'त' => 't',
+ 'थ' => 'th',
+ 'द' => 'd',
+ 'ध' => 'dh',
+ 'न' => 'n',
+ 'प' => 'p',
+ 'फ' => 'ph',
+ 'ब' => 'b',
+ 'भ' => 'bh',
+ 'म' => 'm',
+ 'य' => 'z',
+ 'र' => 'r',
+ 'ल' => 'l',
+ 'व' => 'v',
+ 'श' => 'sh',
+ 'ष' => 'sqh',
+ 'स' => 's',
+ 'ह' => 'x',
+
+ //Sanskrit diacritics
+ 'Ā' => 'A',
+ 'Ī' => 'I',
+ 'Ū' => 'U',
+ 'Ṛ' => 'R',
+ 'Ṝ' => 'R',
+ 'Ṅ' => 'N',
+ 'Ñ' => 'N',
+ 'Ṭ' => 'T',
+ 'Ḍ' => 'D',
+ 'Ṇ' => 'N',
+ 'Ś' => 'S',
+ 'Ṣ' => 'S',
+ 'Ṁ' => 'M',
+ 'Ṃ' => 'M',
+ 'Ḥ' => 'H',
+ 'Ḷ' => 'L',
+ 'Ḹ' => 'L',
+ 'ā' => 'a',
+ 'ī' => 'i',
+ 'ū' => 'u',
+ 'ṛ' => 'r',
+ 'ṝ' => 'r',
+ 'ṅ' => 'n',
+ 'ñ' => 'n',
+ 'ṭ' => 't',
+ 'ḍ' => 'd',
+ 'ṇ' => 'n',
+ 'ś' => 's',
+ 'ṣ' => 's',
+ 'ṁ' => 'm',
+ 'ṃ' => 'm',
+ 'ḥ' => 'h',
+ 'ḷ' => 'l',
+ 'ḹ' => 'l',
+
+ //Hebrew
+ 'א' => 'a',
+ 'ב' => 'b',
+ 'ג' => 'g',
+ 'ד' => 'd',
+ 'ה' => 'h',
+ 'ו' => 'v',
+ 'ז' => 'z',
+ 'ח' => 'kh',
+ 'ט' => 'th',
+ 'י' => 'y',
+ 'ך' => 'h',
+ 'כ' => 'k',
+ 'ל' => 'l',
+ 'ם' => 'm',
+ 'מ' => 'm',
+ 'ן' => 'n',
+ 'נ' => 'n',
+ 'ס' => 's',
+ 'ע' => 'ah',
+ 'ף' => 'f',
+ 'פ' => 'p',
+ 'ץ' => 'c',
+ 'צ' => 'c',
+ 'ק' => 'q',
+ 'ר' => 'r',
+ 'ש' => 'sh',
+ 'ת' => 't',
+
+ //Arabic
+ 'ا' => 'a',
+ 'ب' => 'b',
+ 'ت' => 't',
+ 'ث' => 'th',
+ 'ج' => 'g',
+ 'ح' => 'xh',
+ 'خ' => 'x',
+ 'د' => 'd',
+ 'ذ' => 'dh',
+ 'ر' => 'r',
+ 'ز' => 'z',
+ 'س' => 's',
+ 'ش' => 'sh',
+ 'ص' => 's\'',
+ 'ض' => 'd\'',
+ 'ط' => 't\'',
+ 'ظ' => 'z\'',
+ 'ع' => 'y',
+ 'غ' => 'gh',
+ 'ف' => 'f',
+ 'ق' => 'q',
+ 'ك' => 'k',
+ 'ل' => 'l',
+ 'م' => 'm',
+ 'ن' => 'n',
+ 'ه' => 'x\'',
+ 'و' => 'u',
+ 'ي' => 'i',
+
+ // Japanese characters (last update: 2008-05-09)
+
+ // Japanese hiragana
+
+ // 3 character syllables, っ doubles the consonant after
+ 'っちゃ' => 'ccha',
+ 'っちぇ' => 'cche',
+ 'っちょ' => 'ccho',
+ 'っちゅ' => 'cchu',
+ 'っびゃ' => 'bbya',
+ 'っびぇ' => 'bbye',
+ 'っびぃ' => 'bbyi',
+ 'っびょ' => 'bbyo',
+ 'っびゅ' => 'bbyu',
+ 'っぴゃ' => 'ppya',
+ 'っぴぇ' => 'ppye',
+ 'っぴぃ' => 'ppyi',
+ 'っぴょ' => 'ppyo',
+ 'っぴゅ' => 'ppyu',
+ 'っちゃ' => 'ccha',
+ 'っちぇ' => 'cche',
+ 'っち' => 'cchi',
+ 'っちょ' => 'ccho',
+ 'っちゅ' => 'cchu',
+ // 'っひゃ'=>'hya',
+ // 'っひぇ'=>'hye',
+ // 'っひぃ'=>'hyi',
+ // 'っひょ'=>'hyo',
+ // 'っひゅ'=>'hyu',
+ 'っきゃ' => 'kkya',
+ 'っきぇ' => 'kkye',
+ 'っきぃ' => 'kkyi',
+ 'っきょ' => 'kkyo',
+ 'っきゅ' => 'kkyu',
+ 'っぎゃ' => 'ggya',
+ 'っぎぇ' => 'ggye',
+ 'っぎぃ' => 'ggyi',
+ 'っぎょ' => 'ggyo',
+ 'っぎゅ' => 'ggyu',
+ 'っみゃ' => 'mmya',
+ 'っみぇ' => 'mmye',
+ 'っみぃ' => 'mmyi',
+ 'っみょ' => 'mmyo',
+ 'っみゅ' => 'mmyu',
+ 'っにゃ' => 'nnya',
+ 'っにぇ' => 'nnye',
+ 'っにぃ' => 'nnyi',
+ 'っにょ' => 'nnyo',
+ 'っにゅ' => 'nnyu',
+ 'っりゃ' => 'rrya',
+ 'っりぇ' => 'rrye',
+ 'っりぃ' => 'rryi',
+ 'っりょ' => 'rryo',
+ 'っりゅ' => 'rryu',
+ 'っしゃ' => 'ssha',
+ 'っしぇ' => 'sshe',
+ 'っし' => 'sshi',
+ 'っしょ' => 'ssho',
+ 'っしゅ' => 'sshu',
+
+ // seperate hiragana 'n' ('n' + 'i' != 'ni', normally we would write "kon'nichi wa" but the
+ // apostrophe would be converted to _ anyway)
+ 'んあ' => 'n_a',
+ 'んえ' => 'n_e',
+ 'んい' => 'n_i',
+ 'んお' => 'n_o',
+ 'んう' => 'n_u',
+ 'んや' => 'n_ya',
+ 'んよ' => 'n_yo',
+ 'んゆ' => 'n_yu',
+
+ // 2 character syllables - normal
+ 'ふぁ' => 'fa',
+ 'ふぇ' => 'fe',
+ 'ふぃ' => 'fi',
+ 'ふぉ' => 'fo',
+ 'ちゃ' => 'cha',
+ 'ちぇ' => 'che',
+ 'ち' => 'chi',
+ 'ちょ' => 'cho',
+ 'ちゅ' => 'chu',
+ 'ひゃ' => 'hya',
+ 'ひぇ' => 'hye',
+ 'ひぃ' => 'hyi',
+ 'ひょ' => 'hyo',
+ 'ひゅ' => 'hyu',
+ 'びゃ' => 'bya',
+ 'びぇ' => 'bye',
+ 'びぃ' => 'byi',
+ 'びょ' => 'byo',
+ 'びゅ' => 'byu',
+ 'ぴゃ' => 'pya',
+ 'ぴぇ' => 'pye',
+ 'ぴぃ' => 'pyi',
+ 'ぴょ' => 'pyo',
+ 'ぴゅ' => 'pyu',
+ 'きゃ' => 'kya',
+ 'きぇ' => 'kye',
+ 'きぃ' => 'kyi',
+ 'きょ' => 'kyo',
+ 'きゅ' => 'kyu',
+ 'ぎゃ' => 'gya',
+ 'ぎぇ' => 'gye',
+ 'ぎぃ' => 'gyi',
+ 'ぎょ' => 'gyo',
+ 'ぎゅ' => 'gyu',
+ 'みゃ' => 'mya',
+ 'みぇ' => 'mye',
+ 'みぃ' => 'myi',
+ 'みょ' => 'myo',
+ 'みゅ' => 'myu',
+ 'にゃ' => 'nya',
+ 'にぇ' => 'nye',
+ 'にぃ' => 'nyi',
+ 'にょ' => 'nyo',
+ 'にゅ' => 'nyu',
+ 'りゃ' => 'rya',
+ 'りぇ' => 'rye',
+ 'りぃ' => 'ryi',
+ 'りょ' => 'ryo',
+ 'りゅ' => 'ryu',
+ 'しゃ' => 'sha',
+ 'しぇ' => 'she',
+ 'し' => 'shi',
+ 'しょ' => 'sho',
+ 'しゅ' => 'shu',
+ 'じゃ' => 'ja',
+ 'じぇ' => 'je',
+ 'じょ' => 'jo',
+ 'じゅ' => 'ju',
+ 'うぇ' => 'we',
+ 'うぃ' => 'wi',
+ 'いぇ' => 'ye',
+
+ // 2 character syllables, っ doubles the consonant after
+ 'っば' => 'bba',
+ 'っべ' => 'bbe',
+ 'っび' => 'bbi',
+ 'っぼ' => 'bbo',
+ 'っぶ' => 'bbu',
+ 'っぱ' => 'ppa',
+ 'っぺ' => 'ppe',
+ 'っぴ' => 'ppi',
+ 'っぽ' => 'ppo',
+ 'っぷ' => 'ppu',
+ 'った' => 'tta',
+ 'って' => 'tte',
+ 'っち' => 'cchi',
+ 'っと' => 'tto',
+ 'っつ' => 'ttsu',
+ 'っだ' => 'dda',
+ 'っで' => 'dde',
+ 'っぢ' => 'ddi',
+ 'っど' => 'ddo',
+ 'っづ' => 'ddu',
+ 'っが' => 'gga',
+ 'っげ' => 'gge',
+ 'っぎ' => 'ggi',
+ 'っご' => 'ggo',
+ 'っぐ' => 'ggu',
+ 'っか' => 'kka',
+ 'っけ' => 'kke',
+ 'っき' => 'kki',
+ 'っこ' => 'kko',
+ 'っく' => 'kku',
+ 'っま' => 'mma',
+ 'っめ' => 'mme',
+ 'っみ' => 'mmi',
+ 'っも' => 'mmo',
+ 'っむ' => 'mmu',
+ 'っな' => 'nna',
+ 'っね' => 'nne',
+ 'っに' => 'nni',
+ 'っの' => 'nno',
+ 'っぬ' => 'nnu',
+ 'っら' => 'rra',
+ 'っれ' => 'rre',
+ 'っり' => 'rri',
+ 'っろ' => 'rro',
+ 'っる' => 'rru',
+ 'っさ' => 'ssa',
+ 'っせ' => 'sse',
+ 'っし' => 'sshi',
+ 'っそ' => 'sso',
+ 'っす' => 'ssu',
+ 'っざ' => 'zza',
+ 'っぜ' => 'zze',
+ 'っじ' => 'jji',
+ 'っぞ' => 'zzo',
+ 'っず' => 'zzu',
+
+ // 1 character syllabels
+ 'あ' => 'a',
+ 'え' => 'e',
+ 'い' => 'i',
+ 'お' => 'o',
+ 'う' => 'u',
+ 'ん' => 'n',
+ 'は' => 'ha',
+ 'へ' => 'he',
+ 'ひ' => 'hi',
+ 'ほ' => 'ho',
+ 'ふ' => 'fu',
+ 'ば' => 'ba',
+ 'べ' => 'be',
+ 'び' => 'bi',
+ 'ぼ' => 'bo',
+ 'ぶ' => 'bu',
+ 'ぱ' => 'pa',
+ 'ぺ' => 'pe',
+ 'ぴ' => 'pi',
+ 'ぽ' => 'po',
+ 'ぷ' => 'pu',
+ 'た' => 'ta',
+ 'て' => 'te',
+ 'ち' => 'chi',
+ 'と' => 'to',
+ 'つ' => 'tsu',
+ 'だ' => 'da',
+ 'で' => 'de',
+ 'ぢ' => 'di',
+ 'ど' => 'do',
+ 'づ' => 'du',
+ 'が' => 'ga',
+ 'げ' => 'ge',
+ 'ぎ' => 'gi',
+ 'ご' => 'go',
+ 'ぐ' => 'gu',
+ 'か' => 'ka',
+ 'け' => 'ke',
+ 'き' => 'ki',
+ 'こ' => 'ko',
+ 'く' => 'ku',
+ 'ま' => 'ma',
+ 'め' => 'me',
+ 'み' => 'mi',
+ 'も' => 'mo',
+ 'む' => 'mu',
+ 'な' => 'na',
+ 'ね' => 'ne',
+ 'に' => 'ni',
+ 'の' => 'no',
+ 'ぬ' => 'nu',
+ 'ら' => 'ra',
+ 'れ' => 're',
+ 'り' => 'ri',
+ 'ろ' => 'ro',
+ 'る' => 'ru',
+ 'さ' => 'sa',
+ 'せ' => 'se',
+ 'し' => 'shi',
+ 'そ' => 'so',
+ 'す' => 'su',
+ 'わ' => 'wa',
+ 'を' => 'wo',
+ 'ざ' => 'za',
+ 'ぜ' => 'ze',
+ 'じ' => 'ji',
+ 'ぞ' => 'zo',
+ 'ず' => 'zu',
+ 'や' => 'ya',
+ 'よ' => 'yo',
+ 'ゆ' => 'yu',
+ // old characters
+ 'ゑ' => 'we',
+ 'ゐ' => 'wi',
+
+ // convert what's left (probably only kicks in when something's missing above)
+ // 'ぁ'=>'a','ぇ'=>'e','ぃ'=>'i','ぉ'=>'o','ぅ'=>'u',
+ // 'ゃ'=>'ya','ょ'=>'yo','ゅ'=>'yu',
+
+ // never seen one of those (disabled for the moment)
+ // 'ヴぁ'=>'va','ヴぇ'=>'ve','ヴぃ'=>'vi','ヴぉ'=>'vo','ヴ'=>'vu',
+ // 'でゃ'=>'dha','でぇ'=>'dhe','でぃ'=>'dhi','でょ'=>'dho','でゅ'=>'dhu',
+ // 'どぁ'=>'dwa','どぇ'=>'dwe','どぃ'=>'dwi','どぉ'=>'dwo','どぅ'=>'dwu',
+ // 'ぢゃ'=>'dya','ぢぇ'=>'dye','ぢぃ'=>'dyi','ぢょ'=>'dyo','ぢゅ'=>'dyu',
+ // 'ふぁ'=>'fwa','ふぇ'=>'fwe','ふぃ'=>'fwi','ふぉ'=>'fwo','ふぅ'=>'fwu',
+ // 'ふゃ'=>'fya','ふぇ'=>'fye','ふぃ'=>'fyi','ふょ'=>'fyo','ふゅ'=>'fyu',
+ // 'すぁ'=>'swa','すぇ'=>'swe','すぃ'=>'swi','すぉ'=>'swo','すぅ'=>'swu',
+ // 'てゃ'=>'tha','てぇ'=>'the','てぃ'=>'thi','てょ'=>'tho','てゅ'=>'thu',
+ // 'つゃ'=>'tsa','つぇ'=>'tse','つぃ'=>'tsi','つょ'=>'tso','つ'=>'tsu',
+ // 'とぁ'=>'twa','とぇ'=>'twe','とぃ'=>'twi','とぉ'=>'two','とぅ'=>'twu',
+ // 'ヴゃ'=>'vya','ヴぇ'=>'vye','ヴぃ'=>'vyi','ヴょ'=>'vyo','ヴゅ'=>'vyu',
+ // 'うぁ'=>'wha','うぇ'=>'whe','うぃ'=>'whi','うぉ'=>'who','うぅ'=>'whu',
+ // 'じゃ'=>'zha','じぇ'=>'zhe','じぃ'=>'zhi','じょ'=>'zho','じゅ'=>'zhu',
+ // 'じゃ'=>'zya','じぇ'=>'zye','じぃ'=>'zyi','じょ'=>'zyo','じゅ'=>'zyu',
+
+ // 'spare' characters from other romanization systems
+ // 'だ'=>'da','で'=>'de','ぢ'=>'di','ど'=>'do','づ'=>'du',
+ // 'ら'=>'la','れ'=>'le','り'=>'li','ろ'=>'lo','る'=>'lu',
+ // 'さ'=>'sa','せ'=>'se','し'=>'si','そ'=>'so','す'=>'su',
+ // 'ちゃ'=>'cya','ちぇ'=>'cye','ちぃ'=>'cyi','ちょ'=>'cyo','ちゅ'=>'cyu',
+ //'じゃ'=>'jya','じぇ'=>'jye','じぃ'=>'jyi','じょ'=>'jyo','じゅ'=>'jyu',
+ //'りゃ'=>'lya','りぇ'=>'lye','りぃ'=>'lyi','りょ'=>'lyo','りゅ'=>'lyu',
+ //'しゃ'=>'sya','しぇ'=>'sye','しぃ'=>'syi','しょ'=>'syo','しゅ'=>'syu',
+ //'ちゃ'=>'tya','ちぇ'=>'tye','ちぃ'=>'tyi','ちょ'=>'tyo','ちゅ'=>'tyu',
+ //'し'=>'ci',,い'=>'yi','ぢ'=>'dzi',
+ //'っじゃ'=>'jja','っじぇ'=>'jje','っじ'=>'jji','っじょ'=>'jjo','っじゅ'=>'jju',
+
+
+ // Japanese katakana
+
+ // 4 character syllables: ッ doubles the consonant after, ー doubles the vowel before
+ // (usualy written with macron, but we don't want that in our URLs)
+ 'ッビャー' => 'bbyaa',
+ 'ッビェー' => 'bbyee',
+ 'ッビィー' => 'bbyii',
+ 'ッビョー' => 'bbyoo',
+ 'ッビュー' => 'bbyuu',
+ 'ッピャー' => 'ppyaa',
+ 'ッピェー' => 'ppyee',
+ 'ッピィー' => 'ppyii',
+ 'ッピョー' => 'ppyoo',
+ 'ッピュー' => 'ppyuu',
+ 'ッキャー' => 'kkyaa',
+ 'ッキェー' => 'kkyee',
+ 'ッキィー' => 'kkyii',
+ 'ッキョー' => 'kkyoo',
+ 'ッキュー' => 'kkyuu',
+ 'ッギャー' => 'ggyaa',
+ 'ッギェー' => 'ggyee',
+ 'ッギィー' => 'ggyii',
+ 'ッギョー' => 'ggyoo',
+ 'ッギュー' => 'ggyuu',
+ 'ッミャー' => 'mmyaa',
+ 'ッミェー' => 'mmyee',
+ 'ッミィー' => 'mmyii',
+ 'ッミョー' => 'mmyoo',
+ 'ッミュー' => 'mmyuu',
+ 'ッニャー' => 'nnyaa',
+ 'ッニェー' => 'nnyee',
+ 'ッニィー' => 'nnyii',
+ 'ッニョー' => 'nnyoo',
+ 'ッニュー' => 'nnyuu',
+ 'ッリャー' => 'rryaa',
+ 'ッリェー' => 'rryee',
+ 'ッリィー' => 'rryii',
+ 'ッリョー' => 'rryoo',
+ 'ッリュー' => 'rryuu',
+ 'ッシャー' => 'sshaa',
+ 'ッシェー' => 'sshee',
+ 'ッシー' => 'sshii',
+ 'ッショー' => 'sshoo',
+ 'ッシュー' => 'sshuu',
+ 'ッチャー' => 'cchaa',
+ 'ッチェー' => 'cchee',
+ 'ッチー' => 'cchii',
+ 'ッチョー' => 'cchoo',
+ 'ッチュー' => 'cchuu',
+ 'ッティー' => 'ttii',
+ 'ッヂィー' => 'ddii',
+
+ // 3 character syllables - doubled vowels
+ 'ファー' => 'faa',
+ 'フェー' => 'fee',
+ 'フィー' => 'fii',
+ 'フォー' => 'foo',
+ 'フャー' => 'fyaa',
+ 'フェー' => 'fyee',
+ 'フィー' => 'fyii',
+ 'フョー' => 'fyoo',
+ 'フュー' => 'fyuu',
+ 'ヒャー' => 'hyaa',
+ 'ヒェー' => 'hyee',
+ 'ヒィー' => 'hyii',
+ 'ヒョー' => 'hyoo',
+ 'ヒュー' => 'hyuu',
+ 'ビャー' => 'byaa',
+ 'ビェー' => 'byee',
+ 'ビィー' => 'byii',
+ 'ビョー' => 'byoo',
+ 'ビュー' => 'byuu',
+ 'ピャー' => 'pyaa',
+ 'ピェー' => 'pyee',
+ 'ピィー' => 'pyii',
+ 'ピョー' => 'pyoo',
+ 'ピュー' => 'pyuu',
+ 'キャー' => 'kyaa',
+ 'キェー' => 'kyee',
+ 'キィー' => 'kyii',
+ 'キョー' => 'kyoo',
+ 'キュー' => 'kyuu',
+ 'ギャー' => 'gyaa',
+ 'ギェー' => 'gyee',
+ 'ギィー' => 'gyii',
+ 'ギョー' => 'gyoo',
+ 'ギュー' => 'gyuu',
+ 'ミャー' => 'myaa',
+ 'ミェー' => 'myee',
+ 'ミィー' => 'myii',
+ 'ミョー' => 'myoo',
+ 'ミュー' => 'myuu',
+ 'ニャー' => 'nyaa',
+ 'ニェー' => 'nyee',
+ 'ニィー' => 'nyii',
+ 'ニョー' => 'nyoo',
+ 'ニュー' => 'nyuu',
+ 'リャー' => 'ryaa',
+ 'リェー' => 'ryee',
+ 'リィー' => 'ryii',
+ 'リョー' => 'ryoo',
+ 'リュー' => 'ryuu',
+ 'シャー' => 'shaa',
+ 'シェー' => 'shee',
+ 'シー' => 'shii',
+ 'ショー' => 'shoo',
+ 'シュー' => 'shuu',
+ 'ジャー' => 'jaa',
+ 'ジェー' => 'jee',
+ 'ジー' => 'jii',
+ 'ジョー' => 'joo',
+ 'ジュー' => 'juu',
+ 'スァー' => 'swaa',
+ 'スェー' => 'swee',
+ 'スィー' => 'swii',
+ 'スォー' => 'swoo',
+ 'スゥー' => 'swuu',
+ 'デァー' => 'daa',
+ 'デェー' => 'dee',
+ 'ディー' => 'dii',
+ 'デォー' => 'doo',
+ 'デゥー' => 'duu',
+ 'チャー' => 'chaa',
+ 'チェー' => 'chee',
+ 'チー' => 'chii',
+ 'チョー' => 'choo',
+ 'チュー' => 'chuu',
+ 'ヂャー' => 'dyaa',
+ 'ヂェー' => 'dyee',
+ 'ヂィー' => 'dyii',
+ 'ヂョー' => 'dyoo',
+ 'ヂュー' => 'dyuu',
+ 'ツャー' => 'tsaa',
+ 'ツェー' => 'tsee',
+ 'ツィー' => 'tsii',
+ 'ツョー' => 'tsoo',
+ 'ツー' => 'tsuu',
+ 'トァー' => 'twaa',
+ 'トェー' => 'twee',
+ 'トィー' => 'twii',
+ 'トォー' => 'twoo',
+ 'トゥー' => 'twuu',
+ 'ドァー' => 'dwaa',
+ 'ドェー' => 'dwee',
+ 'ドィー' => 'dwii',
+ 'ドォー' => 'dwoo',
+ 'ドゥー' => 'dwuu',
+ 'ウァー' => 'whaa',
+ 'ウェー' => 'whee',
+ 'ウィー' => 'whii',
+ 'ウォー' => 'whoo',
+ 'ウゥー' => 'whuu',
+ 'ヴャー' => 'vyaa',
+ 'ヴェー' => 'vyee',
+ 'ヴィー' => 'vyii',
+ 'ヴョー' => 'vyoo',
+ 'ヴュー' => 'vyuu',
+ 'ヴァー' => 'vaa',
+ 'ヴェー' => 'vee',
+ 'ヴィー' => 'vii',
+ 'ヴォー' => 'voo',
+ 'ヴー' => 'vuu',
+ 'ウェー' => 'wee',
+ 'ウィー' => 'wii',
+ 'イェー' => 'yee',
+ 'ティー' => 'tii',
+ 'ヂィー' => 'dii',
+
+ // 3 character syllables - doubled consonants
+ 'ッビャ' => 'bbya',
+ 'ッビェ' => 'bbye',
+ 'ッビィ' => 'bbyi',
+ 'ッビョ' => 'bbyo',
+ 'ッビュ' => 'bbyu',
+ 'ッピャ' => 'ppya',
+ 'ッピェ' => 'ppye',
+ 'ッピィ' => 'ppyi',
+ 'ッピョ' => 'ppyo',
+ 'ッピュ' => 'ppyu',
+ 'ッキャ' => 'kkya',
+ 'ッキェ' => 'kkye',
+ 'ッキィ' => 'kkyi',
+ 'ッキョ' => 'kkyo',
+ 'ッキュ' => 'kkyu',
+ 'ッギャ' => 'ggya',
+ 'ッギェ' => 'ggye',
+ 'ッギィ' => 'ggyi',
+ 'ッギョ' => 'ggyo',
+ 'ッギュ' => 'ggyu',
+ 'ッミャ' => 'mmya',
+ 'ッミェ' => 'mmye',
+ 'ッミィ' => 'mmyi',
+ 'ッミョ' => 'mmyo',
+ 'ッミュ' => 'mmyu',
+ 'ッニャ' => 'nnya',
+ 'ッニェ' => 'nnye',
+ 'ッニィ' => 'nnyi',
+ 'ッニョ' => 'nnyo',
+ 'ッニュ' => 'nnyu',
+ 'ッリャ' => 'rrya',
+ 'ッリェ' => 'rrye',
+ 'ッリィ' => 'rryi',
+ 'ッリョ' => 'rryo',
+ 'ッリュ' => 'rryu',
+ 'ッシャ' => 'ssha',
+ 'ッシェ' => 'sshe',
+ 'ッシ' => 'sshi',
+ 'ッショ' => 'ssho',
+ 'ッシュ' => 'sshu',
+ 'ッチャ' => 'ccha',
+ 'ッチェ' => 'cche',
+ 'ッチ' => 'cchi',
+ 'ッチョ' => 'ccho',
+ 'ッチュ' => 'cchu',
+ 'ッティ' => 'tti',
+ 'ッヂィ' => 'ddi',
+
+ // 3 character syllables - doubled vowel and consonants
+ 'ッバー' => 'bbaa',
+ 'ッベー' => 'bbee',
+ 'ッビー' => 'bbii',
+ 'ッボー' => 'bboo',
+ 'ッブー' => 'bbuu',
+ 'ッパー' => 'ppaa',
+ 'ッペー' => 'ppee',
+ 'ッピー' => 'ppii',
+ 'ッポー' => 'ppoo',
+ 'ップー' => 'ppuu',
+ 'ッケー' => 'kkee',
+ 'ッキー' => 'kkii',
+ 'ッコー' => 'kkoo',
+ 'ックー' => 'kkuu',
+ 'ッカー' => 'kkaa',
+ 'ッガー' => 'ggaa',
+ 'ッゲー' => 'ggee',
+ 'ッギー' => 'ggii',
+ 'ッゴー' => 'ggoo',
+ 'ッグー' => 'gguu',
+ 'ッマー' => 'maa',
+ 'ッメー' => 'mee',
+ 'ッミー' => 'mii',
+ 'ッモー' => 'moo',
+ 'ッムー' => 'muu',
+ 'ッナー' => 'nnaa',
+ 'ッネー' => 'nnee',
+ 'ッニー' => 'nnii',
+ 'ッノー' => 'nnoo',
+ 'ッヌー' => 'nnuu',
+ 'ッラー' => 'rraa',
+ 'ッレー' => 'rree',
+ 'ッリー' => 'rrii',
+ 'ッロー' => 'rroo',
+ 'ッルー' => 'rruu',
+ 'ッサー' => 'ssaa',
+ 'ッセー' => 'ssee',
+ 'ッシー' => 'sshii',
+ 'ッソー' => 'ssoo',
+ 'ッスー' => 'ssuu',
+ 'ッザー' => 'zzaa',
+ 'ッゼー' => 'zzee',
+ 'ッジー' => 'jjii',
+ 'ッゾー' => 'zzoo',
+ 'ッズー' => 'zzuu',
+ 'ッター' => 'ttaa',
+ 'ッテー' => 'ttee',
+ 'ッチー' => 'chii',
+ 'ットー' => 'ttoo',
+ 'ッツー' => 'ttsuu',
+ 'ッダー' => 'ddaa',
+ 'ッデー' => 'ddee',
+ 'ッヂー' => 'ddii',
+ 'ッドー' => 'ddoo',
+ 'ッヅー' => 'dduu',
+
+ // 2 character syllables - normal
+ 'ファ' => 'fa',
+ 'フェ' => 'fe',
+ 'フィ' => 'fi',
+ 'フォ' => 'fo',
+ 'フゥ' => 'fu',
+ // 'フャ'=>'fya',
+ // 'フェ'=>'fye',
+ // 'フィ'=>'fyi',
+ // 'フョ'=>'fyo',
+ // 'フュ'=>'fyu',
+ 'フャ' => 'fa',
+ 'フェ' => 'fe',
+ 'フィ' => 'fi',
+ 'フョ' => 'fo',
+ 'フュ' => 'fu',
+ 'ヒャ' => 'hya',
+ 'ヒェ' => 'hye',
+ 'ヒィ' => 'hyi',
+ 'ヒョ' => 'hyo',
+ 'ヒュ' => 'hyu',
+ 'ビャ' => 'bya',
+ 'ビェ' => 'bye',
+ 'ビィ' => 'byi',
+ 'ビョ' => 'byo',
+ 'ビュ' => 'byu',
+ 'ピャ' => 'pya',
+ 'ピェ' => 'pye',
+ 'ピィ' => 'pyi',
+ 'ピョ' => 'pyo',
+ 'ピュ' => 'pyu',
+ 'キャ' => 'kya',
+ 'キェ' => 'kye',
+ 'キィ' => 'kyi',
+ 'キョ' => 'kyo',
+ 'キュ' => 'kyu',
+ 'ギャ' => 'gya',
+ 'ギェ' => 'gye',
+ 'ギィ' => 'gyi',
+ 'ギョ' => 'gyo',
+ 'ギュ' => 'gyu',
+ 'ミャ' => 'mya',
+ 'ミェ' => 'mye',
+ 'ミィ' => 'myi',
+ 'ミョ' => 'myo',
+ 'ミュ' => 'myu',
+ 'ニャ' => 'nya',
+ 'ニェ' => 'nye',
+ 'ニィ' => 'nyi',
+ 'ニョ' => 'nyo',
+ 'ニュ' => 'nyu',
+ 'リャ' => 'rya',
+ 'リェ' => 'rye',
+ 'リィ' => 'ryi',
+ 'リョ' => 'ryo',
+ 'リュ' => 'ryu',
+ 'シャ' => 'sha',
+ 'シェ' => 'she',
+ 'ショ' => 'sho',
+ 'シュ' => 'shu',
+ 'ジャ' => 'ja',
+ 'ジェ' => 'je',
+ 'ジョ' => 'jo',
+ 'ジュ' => 'ju',
+ 'スァ' => 'swa',
+ 'スェ' => 'swe',
+ 'スィ' => 'swi',
+ 'スォ' => 'swo',
+ 'スゥ' => 'swu',
+ 'デァ' => 'da',
+ 'デェ' => 'de',
+ 'ディ' => 'di',
+ 'デォ' => 'do',
+ 'デゥ' => 'du',
+ 'チャ' => 'cha',
+ 'チェ' => 'che',
+ 'チ' => 'chi',
+ 'チョ' => 'cho',
+ 'チュ' => 'chu',
+ // 'ヂャ'=>'dya',
+ // 'ヂェ'=>'dye',
+ // 'ヂィ'=>'dyi',
+ // 'ヂョ'=>'dyo',
+ // 'ヂュ'=>'dyu',
+ 'ツャ' => 'tsa',
+ 'ツェ' => 'tse',
+ 'ツィ' => 'tsi',
+ 'ツョ' => 'tso',
+ 'ツ' => 'tsu',
+ 'トァ' => 'twa',
+ 'トェ' => 'twe',
+ 'トィ' => 'twi',
+ 'トォ' => 'two',
+ 'トゥ' => 'twu',
+ 'ドァ' => 'dwa',
+ 'ドェ' => 'dwe',
+ 'ドィ' => 'dwi',
+ 'ドォ' => 'dwo',
+ 'ドゥ' => 'dwu',
+ 'ウァ' => 'wha',
+ 'ウェ' => 'whe',
+ 'ウィ' => 'whi',
+ 'ウォ' => 'who',
+ 'ウゥ' => 'whu',
+ 'ヴャ' => 'vya',
+ 'ヴェ' => 'vye',
+ 'ヴィ' => 'vyi',
+ 'ヴョ' => 'vyo',
+ 'ヴュ' => 'vyu',
+ 'ヴァ' => 'va',
+ 'ヴェ' => 've',
+ 'ヴィ' => 'vi',
+ 'ヴォ' => 'vo',
+ 'ヴ' => 'vu',
+ 'ウェ' => 'we',
+ 'ウィ' => 'wi',
+ 'イェ' => 'ye',
+ 'ティ' => 'ti',
+ 'ヂィ' => 'di',
+
+ // 2 character syllables - doubled vocal
+ 'アー' => 'aa',
+ 'エー' => 'ee',
+ 'イー' => 'ii',
+ 'オー' => 'oo',
+ 'ウー' => 'uu',
+ 'ダー' => 'daa',
+ 'デー' => 'dee',
+ 'ヂー' => 'dii',
+ 'ドー' => 'doo',
+ 'ヅー' => 'duu',
+ 'ハー' => 'haa',
+ 'ヘー' => 'hee',
+ 'ヒー' => 'hii',
+ 'ホー' => 'hoo',
+ 'フー' => 'fuu',
+ 'バー' => 'baa',
+ 'ベー' => 'bee',
+ 'ビー' => 'bii',
+ 'ボー' => 'boo',
+ 'ブー' => 'buu',
+ 'パー' => 'paa',
+ 'ペー' => 'pee',
+ 'ピー' => 'pii',
+ 'ポー' => 'poo',
+ 'プー' => 'puu',
+ 'ケー' => 'kee',
+ 'キー' => 'kii',
+ 'コー' => 'koo',
+ 'クー' => 'kuu',
+ 'カー' => 'kaa',
+ 'ガー' => 'gaa',
+ 'ゲー' => 'gee',
+ 'ギー' => 'gii',
+ 'ゴー' => 'goo',
+ 'グー' => 'guu',
+ 'マー' => 'maa',
+ 'メー' => 'mee',
+ 'ミー' => 'mii',
+ 'モー' => 'moo',
+ 'ムー' => 'muu',
+ 'ナー' => 'naa',
+ 'ネー' => 'nee',
+ 'ニー' => 'nii',
+ 'ノー' => 'noo',
+ 'ヌー' => 'nuu',
+ 'ラー' => 'raa',
+ 'レー' => 'ree',
+ 'リー' => 'rii',
+ 'ロー' => 'roo',
+ 'ルー' => 'ruu',
+ 'サー' => 'saa',
+ 'セー' => 'see',
+ 'シー' => 'shii',
+ 'ソー' => 'soo',
+ 'スー' => 'suu',
+ 'ザー' => 'zaa',
+ 'ゼー' => 'zee',
+ 'ジー' => 'jii',
+ 'ゾー' => 'zoo',
+ 'ズー' => 'zuu',
+ 'ター' => 'taa',
+ 'テー' => 'tee',
+ 'チー' => 'chii',
+ 'トー' => 'too',
+ 'ツー' => 'tsuu',
+ 'ワー' => 'waa',
+ 'ヲー' => 'woo',
+ 'ヤー' => 'yaa',
+ 'ヨー' => 'yoo',
+ 'ユー' => 'yuu',
+ 'ヵー' => 'kaa',
+ 'ヶー' => 'kee',
+ // old characters
+ 'ヱー' => 'wee',
+ 'ヰー' => 'wii',
+
+ // seperate katakana 'n'
+ 'ンア' => 'n_a',
+ 'ンエ' => 'n_e',
+ 'ンイ' => 'n_i',
+ 'ンオ' => 'n_o',
+ 'ンウ' => 'n_u',
+ 'ンヤ' => 'n_ya',
+ 'ンヨ' => 'n_yo',
+ 'ンユ' => 'n_yu',
+
+ // 2 character syllables - doubled consonants
+ 'ッバ' => 'bba',
+ 'ッベ' => 'bbe',
+ 'ッビ' => 'bbi',
+ 'ッボ' => 'bbo',
+ 'ッブ' => 'bbu',
+ 'ッパ' => 'ppa',
+ 'ッペ' => 'ppe',
+ 'ッピ' => 'ppi',
+ 'ッポ' => 'ppo',
+ 'ップ' => 'ppu',
+ 'ッケ' => 'kke',
+ 'ッキ' => 'kki',
+ 'ッコ' => 'kko',
+ 'ック' => 'kku',
+ 'ッカ' => 'kka',
+ 'ッガ' => 'gga',
+ 'ッゲ' => 'gge',
+ 'ッギ' => 'ggi',
+ 'ッゴ' => 'ggo',
+ 'ッグ' => 'ggu',
+ 'ッマ' => 'ma',
+ 'ッメ' => 'me',
+ 'ッミ' => 'mi',
+ 'ッモ' => 'mo',
+ 'ッム' => 'mu',
+ 'ッナ' => 'nna',
+ 'ッネ' => 'nne',
+ 'ッニ' => 'nni',
+ 'ッノ' => 'nno',
+ 'ッヌ' => 'nnu',
+ 'ッラ' => 'rra',
+ 'ッレ' => 'rre',
+ 'ッリ' => 'rri',
+ 'ッロ' => 'rro',
+ 'ッル' => 'rru',
+ 'ッサ' => 'ssa',
+ 'ッセ' => 'sse',
+ 'ッシ' => 'sshi',
+ 'ッソ' => 'sso',
+ 'ッス' => 'ssu',
+ 'ッザ' => 'zza',
+ 'ッゼ' => 'zze',
+ 'ッジ' => 'jji',
+ 'ッゾ' => 'zzo',
+ 'ッズ' => 'zzu',
+ 'ッタ' => 'tta',
+ 'ッテ' => 'tte',
+ 'ッチ' => 'cchi',
+ 'ット' => 'tto',
+ 'ッツ' => 'ttsu',
+ 'ッダ' => 'dda',
+ 'ッデ' => 'dde',
+ 'ッヂ' => 'ddi',
+ 'ッド' => 'ddo',
+ 'ッヅ' => 'ddu',
+
+ // 1 character syllables
+ 'ア' => 'a',
+ 'エ' => 'e',
+ 'イ' => 'i',
+ 'オ' => 'o',
+ 'ウ' => 'u',
+ 'ン' => 'n',
+ 'ハ' => 'ha',
+ 'ヘ' => 'he',
+ 'ヒ' => 'hi',
+ 'ホ' => 'ho',
+ 'フ' => 'fu',
+ 'バ' => 'ba',
+ 'ベ' => 'be',
+ 'ビ' => 'bi',
+ 'ボ' => 'bo',
+ 'ブ' => 'bu',
+ 'パ' => 'pa',
+ 'ペ' => 'pe',
+ 'ピ' => 'pi',
+ 'ポ' => 'po',
+ 'プ' => 'pu',
+ 'ケ' => 'ke',
+ 'キ' => 'ki',
+ 'コ' => 'ko',
+ 'ク' => 'ku',
+ 'カ' => 'ka',
+ 'ガ' => 'ga',
+ 'ゲ' => 'ge',
+ 'ギ' => 'gi',
+ 'ゴ' => 'go',
+ 'グ' => 'gu',
+ 'マ' => 'ma',
+ 'メ' => 'me',
+ 'ミ' => 'mi',
+ 'モ' => 'mo',
+ 'ム' => 'mu',
+ 'ナ' => 'na',
+ 'ネ' => 'ne',
+ 'ニ' => 'ni',
+ 'ノ' => 'no',
+ 'ヌ' => 'nu',
+ 'ラ' => 'ra',
+ 'レ' => 're',
+ 'リ' => 'ri',
+ 'ロ' => 'ro',
+ 'ル' => 'ru',
+ 'サ' => 'sa',
+ 'セ' => 'se',
+ 'シ' => 'shi',
+ 'ソ' => 'so',
+ 'ス' => 'su',
+ 'ザ' => 'za',
+ 'ゼ' => 'ze',
+ 'ジ' => 'ji',
+ 'ゾ' => 'zo',
+ 'ズ' => 'zu',
+ 'タ' => 'ta',
+ 'テ' => 'te',
+ 'チ' => 'chi',
+ 'ト' => 'to',
+ 'ツ' => 'tsu',
+ 'ダ' => 'da',
+ 'デ' => 'de',
+ 'ヂ' => 'di',
+ 'ド' => 'do',
+ 'ヅ' => 'du',
+ 'ワ' => 'wa',
+ 'ヲ' => 'wo',
+ 'ヤ' => 'ya',
+ 'ヨ' => 'yo',
+ 'ユ' => 'yu',
+ 'ヵ' => 'ka',
+ 'ヶ' => 'ke',
+ // old characters
+ 'ヱ' => 'we',
+ 'ヰ' => 'wi',
+
+ // convert what's left (probably only kicks in when something's missing above)
+ 'ァ' => 'a',
+ 'ェ' => 'e',
+ 'ィ' => 'i',
+ 'ォ' => 'o',
+ 'ゥ' => 'u',
+ 'ャ' => 'ya',
+ 'ョ' => 'yo',
+ 'ュ' => 'yu',
+
+ // special characters
+ '・' => '_',
+ '、' => '_',
+ 'ー' => '_',
+ // when used with hiragana (seldom), this character would not be converted otherwise
+
+ // 'ラ'=>'la',
+ // 'レ'=>'le',
+ // 'リ'=>'li',
+ // 'ロ'=>'lo',
+ // 'ル'=>'lu',
+ // 'チャ'=>'cya',
+ // 'チェ'=>'cye',
+ // 'チィ'=>'cyi',
+ // 'チョ'=>'cyo',
+ // 'チュ'=>'cyu',
+ // 'デャ'=>'dha',
+ // 'デェ'=>'dhe',
+ // 'ディ'=>'dhi',
+ // 'デョ'=>'dho',
+ // 'デュ'=>'dhu',
+ // 'リャ'=>'lya',
+ // 'リェ'=>'lye',
+ // 'リィ'=>'lyi',
+ // 'リョ'=>'lyo',
+ // 'リュ'=>'lyu',
+ // 'テャ'=>'tha',
+ // 'テェ'=>'the',
+ // 'ティ'=>'thi',
+ // 'テョ'=>'tho',
+ // 'テュ'=>'thu',
+ // 'ファ'=>'fwa',
+ // 'フェ'=>'fwe',
+ // 'フィ'=>'fwi',
+ // 'フォ'=>'fwo',
+ // 'フゥ'=>'fwu',
+ // 'チャ'=>'tya',
+ // 'チェ'=>'tye',
+ // 'チィ'=>'tyi',
+ // 'チョ'=>'tyo',
+ // 'チュ'=>'tyu',
+ // 'ジャ'=>'jya',
+ // 'ジェ'=>'jye',
+ // 'ジィ'=>'jyi',
+ // 'ジョ'=>'jyo',
+ // 'ジュ'=>'jyu',
+ // 'ジャ'=>'zha',
+ // 'ジェ'=>'zhe',
+ // 'ジィ'=>'zhi',
+ // 'ジョ'=>'zho',
+ // 'ジュ'=>'zhu',
+ // 'ジャ'=>'zya',
+ // 'ジェ'=>'zye',
+ // 'ジィ'=>'zyi',
+ // 'ジョ'=>'zyo',
+ // 'ジュ'=>'zyu',
+ // 'シャ'=>'sya',
+ // 'シェ'=>'sye',
+ // 'シィ'=>'syi',
+ // 'ショ'=>'syo',
+ // 'シュ'=>'syu',
+ // 'シ'=>'ci',
+ // 'フ'=>'hu',
+ // 'シ'=>'si',
+ // 'チ'=>'ti',
+ // 'ツ'=>'tu',
+ // 'イ'=>'yi',
+ // 'ヂ'=>'dzi',
+
+ // "Greeklish"
+ 'Γ' => 'G',
+ 'Δ' => 'E',
+ 'Θ' => 'Th',
+ 'Λ' => 'L',
+ 'Ξ' => 'X',
+ 'Π' => 'P',
+ 'Σ' => 'S',
+ 'Φ' => 'F',
+ 'Ψ' => 'Ps',
+ 'γ' => 'g',
+ 'δ' => 'e',
+ 'θ' => 'th',
+ 'λ' => 'l',
+ 'ξ' => 'x',
+ 'π' => 'p',
+ 'σ' => 's',
+ 'φ' => 'f',
+ 'ψ' => 'ps',
+
+ // Thai
+ 'ก' => 'k',
+ 'ข' => 'kh',
+ 'ฃ' => 'kh',
+ 'ค' => 'kh',
+ 'ฅ' => 'kh',
+ 'ฆ' => 'kh',
+ 'ง' => 'ng',
+ 'จ' => 'ch',
+ 'ฉ' => 'ch',
+ 'ช' => 'ch',
+ 'ซ' => 's',
+ 'ฌ' => 'ch',
+ 'ญ' => 'y',
+ 'ฎ' => 'd',
+ 'ฏ' => 't',
+ 'ฐ' => 'th',
+ 'ฑ' => 'd',
+ 'ฒ' => 'th',
+ 'ณ' => 'n',
+ 'ด' => 'd',
+ 'ต' => 't',
+ 'ถ' => 'th',
+ 'ท' => 'th',
+ 'ธ' => 'th',
+ 'น' => 'n',
+ 'บ' => 'b',
+ 'ป' => 'p',
+ 'ผ' => 'ph',
+ 'ฝ' => 'f',
+ 'พ' => 'ph',
+ 'ฟ' => 'f',
+ 'ภ' => 'ph',
+ 'ม' => 'm',
+ 'ย' => 'y',
+ 'ร' => 'r',
+ 'ฤ' => 'rue',
+ 'ฤๅ' => 'rue',
+ 'ล' => 'l',
+ 'ฦ' => 'lue',
+ 'ฦๅ' => 'lue',
+ 'ว' => 'w',
+ 'ศ' => 's',
+ 'ษ' => 's',
+ 'ส' => 's',
+ 'ห' => 'h',
+ 'ฬ' => 'l',
+ 'ฮ' => 'h',
+ 'ะ' => 'a',
+ 'ั' => 'a',
+ 'รร' => 'a',
+ 'า' => 'a',
+ 'ๅ' => 'a',
+ 'ำ' => 'am',
+ 'ํา' => 'am',
+ 'ิ' => 'i',
+ 'ี' => 'i',
+ 'ึ' => 'ue',
+ 'ี' => 'ue',
+ 'ุ' => 'u',
+ 'ู' => 'u',
+ 'เ' => 'e',
+ 'แ' => 'ae',
+ 'โ' => 'o',
+ 'อ' => 'o',
+ 'ียะ' => 'ia',
+ 'ีย' => 'ia',
+ 'ือะ' => 'uea',
+ 'ือ' => 'uea',
+ 'ัวะ' => 'ua',
+ 'ัว' => 'ua',
+ 'ใ' => 'ai',
+ 'ไ' => 'ai',
+ 'ัย' => 'ai',
+ 'าย' => 'ai',
+ 'าว' => 'ao',
+ 'ุย' => 'ui',
+ 'อย' => 'oi',
+ 'ือย' => 'ueai',
+ 'วย' => 'uai',
+ 'ิว' => 'io',
+ '็ว' => 'eo',
+ 'ียว' => 'iao',
+ '่' => '',
+ '้' => '',
+ '๊' => '',
+ '๋' => '',
+ '็' => '',
+ '์' => '',
+ '๎' => '',
+ 'ํ' => '',
+ 'ฺ' => '',
+ 'ๆ' => '2',
+ '๏' => 'o',
+ 'ฯ' => '-',
+ '๚' => '-',
+ '๛' => '-',
+ '๐' => '0',
+ '๑' => '1',
+ '๒' => '2',
+ '๓' => '3',
+ '๔' => '4',
+ '๕' => '5',
+ '๖' => '6',
+ '๗' => '7',
+ '๘' => '8',
+ '๙' => '9',
+
+ // Korean
+ 'ㄱ' => 'k', 'ㅋ' => 'kh',
+ 'ㄲ' => 'kk',
+ 'ㄷ' => 't',
+ 'ㅌ' => 'th',
+ 'ㄸ' => 'tt',
+ 'ㅂ' => 'p',
+ 'ㅍ' => 'ph',
+ 'ㅃ' => 'pp',
+ 'ㅈ' => 'c',
+ 'ㅊ' => 'ch',
+ 'ㅉ' => 'cc',
+ 'ㅅ' => 's',
+ 'ㅆ' => 'ss',
+ 'ㅎ' => 'h',
+ 'ㅇ' => 'ng',
+ 'ㄴ' => 'n',
+ 'ㄹ' => 'l',
+ 'ㅁ' => 'm',
+ 'ㅏ' => 'a',
+ 'ㅓ' => 'e',
+ 'ㅗ' => 'o',
+ 'ㅜ' => 'wu',
+ 'ㅡ' => 'u',
+ 'ㅣ' => 'i',
+ 'ㅐ' => 'ay',
+ 'ㅔ' => 'ey',
+ 'ㅚ' => 'oy',
+ 'ㅘ' => 'wa',
+ 'ㅝ' => 'we',
+ 'ㅟ' => 'wi',
+ 'ㅙ' => 'way',
+ 'ㅞ' => 'wey',
+ 'ㅢ' => 'uy',
+ 'ㅑ' => 'ya',
+ 'ㅕ' => 'ye',
+ 'ㅛ' => 'oy',
+ 'ㅠ' => 'yu',
+ 'ㅒ' => 'yay',
+ 'ㅖ' => 'yey',
+];
diff --git a/inc/Utf8/tables/specials.php b/inc/Utf8/tables/specials.php
new file mode 100644
index 000000000..3dda94b39
--- /dev/null
+++ b/inc/Utf8/tables/specials.php
@@ -0,0 +1,620 @@
+<?php
+/**
+ * UTF-8 array of common special characters
+ *
+ * This array should contain all special characters (not a letter or digit)
+ * defined in the various local charsets - it's not a complete list of non-alphanum
+ * characters in UTF-8. It's not perfect but should match most cases of special
+ * chars.
+ *
+ * The controlchars 0x00 to 0x19 are _not_ included in this array. The space 0x20 is!
+ * These chars are _not_ in the array either: _ (0x5f), : 0x3a, . 0x2e, - 0x2d, * 0x2a
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see \dokuwiki\Utf8\Clean::stripspecials()
+ */
+return [
+ 0x1a, // 
+ 0x1b, // 
+ 0x1c, // 
+ 0x1d, // 
+ 0x1e, // 
+ 0x1f, // 
+ 0x20, // <space>
+ 0x21, // !
+ 0x22, // "
+ 0x23, // #
+ 0x24, // $
+ 0x25, // %
+ 0x26, // &
+ 0x27, // '
+ 0x28, // (
+ 0x29, // )
+ 0x2b, // +
+ 0x2c, // ,
+ 0x2f, // /
+ 0x3b, // ;
+ 0x3c, // <
+ 0x3d, // =
+ 0x3e, // >
+ 0x3f, // ?
+ 0x40, // @
+ 0x5b, // [
+ 0x5c, // \
+ 0x5d, // ]
+ 0x5e, // ^
+ 0x60, // `
+ 0x7b, // {
+ 0x7c, // |
+ 0x7d, // }
+ 0x7e, // ~
+ 0x7f, // 
+ 0x80, // €
+ 0x81, // 
+ 0x82, // ‚
+ 0x83, // ƒ
+ 0x84, // „
+ 0x85, // …
+ 0x86, // †
+ 0x87, // ‡
+ 0x88, // ˆ
+ 0x89, // ‰
+ 0x8a, // Š
+ 0x8b, // ‹
+ 0x8c, // Œ
+ 0x8d, // 
+ 0x8e, // Ž
+ 0x8f, // 
+ 0x90, // 
+ 0x91, // ‘
+ 0x92, // ’
+ 0x93, // “
+ 0x94, // ”
+ 0x95, // •
+ 0x96, // –
+ 0x97, // —
+ 0x98, // ˜
+ 0x99, // ™
+ 0x9a, // š
+ 0x9b, // ›
+ 0x9c, // œ
+ 0x9d, // 
+ 0x9e, // ž
+ 0x9f, // Ÿ
+ 0xa0, //  
+ 0xa1, // ¡
+ 0xa2, // ¢
+ 0xa3, // £
+ 0xa4, // ¤
+ 0xa5, // ¥
+ 0xa6, // ¦
+ 0xa7, // §
+ 0xa8, // ¨
+ 0xa9, // ©
+ 0xaa, // ª
+ 0xab, // «
+ 0xac, // ¬
+ 0xad, // ­
+ 0xae, // ®
+ 0xaf, // ¯
+ 0xb0, // °
+ 0xb1, // ±
+ 0xb2, // ²
+ 0xb3, // ³
+ 0xb4, // ´
+ 0xb5, // µ
+ 0xb6, // ¶
+ 0xb7, // ·
+ 0xb8, // ¸
+ 0xb9, // ¹
+ 0xba, // º
+ 0xbb, // »
+ 0xbc, // ¼
+ 0xbd, // ½
+ 0xbe, // ¾
+ 0xbf, // ¿
+ 0xd7, // ×
+ 0xf7, // ÷
+ 0x2c7, // ˇ
+ 0x2d8, // ˘
+ 0x2d9, // ˙
+ 0x2da, // ˚
+ 0x2db, // ˛
+ 0x2dc, // ˜
+ 0x2dd, // ˝
+ 0x300, // ̀
+ 0x301, // ́
+ 0x303, // ̃
+ 0x309, // ̉
+ 0x323, // ̣
+ 0x384, // ΄
+ 0x385, // ΅
+ 0x387, // ·
+ 0x3c6, // φ
+ 0x3d1, // ϑ
+ 0x3d2, // ϒ
+ 0x3d5, // ϕ
+ 0x3d6, // ϖ
+ 0x5b0, // ְ
+ 0x5b1, // ֱ
+ 0x5b2, // ֲ
+ 0x5b3, // ֳ
+ 0x5b4, // ִ
+ 0x5b5, // ֵ
+ 0x5b6, // ֶ
+ 0x5b7, // ַ
+ 0x5b8, // ָ
+ 0x5b9, // ֹ
+ 0x5bb, // ֻ
+ 0x5bc, // ּ
+ 0x5bd, // ֽ
+ 0x5be, // ־
+ 0x5bf, // ֿ
+ 0x5c0, // ׀
+ 0x5c1, // ׁ
+ 0x5c2, // ׂ
+ 0x5c3, // ׃
+ 0x5f3, // ׳
+ 0x5f4, // ״
+ 0x60c, // ،
+ 0x61b, // ؛
+ 0x61f, // ؟
+ 0x640, // ـ
+ 0x64b, // ً
+ 0x64c, // ٌ
+ 0x64d, // ٍ
+ 0x64e, // َ
+ 0x64f, // ُ
+ 0x650, // ِ
+ 0x651, // ّ
+ 0x652, // ْ
+ 0x66a, // ٪
+ 0xe3f, // ฿
+ 0x200c, // ‌
+ 0x200d, // ‍
+ 0x200e, // ‎
+ 0x200f, // ‏
+ 0x2013, // –
+ 0x2014, // —
+ 0x2015, // ―
+ 0x2017, // ‗
+ 0x2018, // ‘
+ 0x2019, // ’
+ 0x201a, // ‚
+ 0x201c, // “
+ 0x201d, // ”
+ 0x201e, // „
+ 0x2020, // †
+ 0x2021, // ‡
+ 0x2022, // •
+ 0x2026, // …
+ 0x2030, // ‰
+ 0x2032, // ′
+ 0x2033, // ″
+ 0x2039, // ‹
+ 0x203a, // ›
+ 0x2044, // ⁄
+ 0x20a7, // ₧
+ 0x20aa, // ₪
+ 0x20ab, // ₫
+ 0x20ac, // €
+ 0x2116, // №
+ 0x2118, // ℘
+ 0x2122, // ™
+ 0x2126, // Ω
+ 0x2135, // ℵ
+ 0x2190, // ←
+ 0x2191, // ↑
+ 0x2192, // →
+ 0x2193, // ↓
+ 0x2194, // ↔
+ 0x2195, // ↕
+ 0x21b5, // ↵
+ 0x21d0, // ⇐
+ 0x21d1, // ⇑
+ 0x21d2, // ⇒
+ 0x21d3, // ⇓
+ 0x21d4, // ⇔
+ 0x2200, // ∀
+ 0x2202, // ∂
+ 0x2203, // ∃
+ 0x2205, // ∅
+ 0x2206, // ∆
+ 0x2207, // ∇
+ 0x2208, // ∈
+ 0x2209, // ∉
+ 0x220b, // ∋
+ 0x220f, // ∏
+ 0x2211, // ∑
+ 0x2212, // −
+ 0x2215, // ∕
+ 0x2217, // ∗
+ 0x2219, // ∙
+ 0x221a, // √
+ 0x221d, // ∝
+ 0x221e, // ∞
+ 0x2220, // ∠
+ 0x2227, // ∧
+ 0x2228, // ∨
+ 0x2229, // ∩
+ 0x222a, // ∪
+ 0x222b, // ∫
+ 0x2234, // ∴
+ 0x223c, // ∼
+ 0x2245, // ≅
+ 0x2248, // ≈
+ 0x2260, // ≠
+ 0x2261, // ≡
+ 0x2264, // ≤
+ 0x2265, // ≥
+ 0x2282, // ⊂
+ 0x2283, // ⊃
+ 0x2284, // ⊄
+ 0x2286, // ⊆
+ 0x2287, // ⊇
+ 0x2295, // ⊕
+ 0x2297, // ⊗
+ 0x22a5, // ⊥
+ 0x22c5, // ⋅
+ 0x2310, // ⌐
+ 0x2320, // ⌠
+ 0x2321, // ⌡
+ 0x2329, // 〈
+ 0x232a, // 〉
+ 0x2469, // ⑩
+ 0x2500, // ─
+ 0x2502, // │
+ 0x250c, // ┌
+ 0x2510, // ┐
+ 0x2514, // └
+ 0x2518, // ┘
+ 0x251c, // ├
+ 0x2524, // ┤
+ 0x252c, // ┬
+ 0x2534, // ┴
+ 0x253c, // ┼
+ 0x2550, // ═
+ 0x2551, // ║
+ 0x2552, // ╒
+ 0x2553, // ╓
+ 0x2554, // ╔
+ 0x2555, // ╕
+ 0x2556, // ╖
+ 0x2557, // ╗
+ 0x2558, // ╘
+ 0x2559, // ╙
+ 0x255a, // ╚
+ 0x255b, // ╛
+ 0x255c, // ╜
+ 0x255d, // ╝
+ 0x255e, // ╞
+ 0x255f, // ╟
+ 0x2560, // ╠
+ 0x2561, // ╡
+ 0x2562, // ╢
+ 0x2563, // ╣
+ 0x2564, // ╤
+ 0x2565, // ╥
+ 0x2566, // ╦
+ 0x2567, // ╧
+ 0x2568, // ╨
+ 0x2569, // ╩
+ 0x256a, // ╪
+ 0x256b, // ╫
+ 0x256c, // ╬
+ 0x2580, // ▀
+ 0x2584, // ▄
+ 0x2588, // █
+ 0x258c, // ▌
+ 0x2590, // ▐
+ 0x2591, // ░
+ 0x2592, // ▒
+ 0x2593, // ▓
+ 0x25a0, // ■
+ 0x25b2, // ▲
+ 0x25bc, // ▼
+ 0x25c6, // ◆
+ 0x25ca, // ◊
+ 0x25cf, // ●
+ 0x25d7, // ◗
+ 0x2605, // ★
+ 0x260e, // ☎
+ 0x261b, // ☛
+ 0x261e, // ☞
+ 0x2660, // ♠
+ 0x2663, // ♣
+ 0x2665, // ♥
+ 0x2666, // ♦
+ 0x2701, // ✁
+ 0x2702, // ✂
+ 0x2703, // ✃
+ 0x2704, // ✄
+ 0x2706, // ✆
+ 0x2707, // ✇
+ 0x2708, // ✈
+ 0x2709, // ✉
+ 0x270c, // ✌
+ 0x270d, // ✍
+ 0x270e, // ✎
+ 0x270f, // ✏
+ 0x2710, // ✐
+ 0x2711, // ✑
+ 0x2712, // ✒
+ 0x2713, // ✓
+ 0x2714, // ✔
+ 0x2715, // ✕
+ 0x2716, // ✖
+ 0x2717, // ✗
+ 0x2718, // ✘
+ 0x2719, // ✙
+ 0x271a, // ✚
+ 0x271b, // ✛
+ 0x271c, // ✜
+ 0x271d, // ✝
+ 0x271e, // ✞
+ 0x271f, // ✟
+ 0x2720, // ✠
+ 0x2721, // ✡
+ 0x2722, // ✢
+ 0x2723, // ✣
+ 0x2724, // ✤
+ 0x2725, // ✥
+ 0x2726, // ✦
+ 0x2727, // ✧
+ 0x2729, // ✩
+ 0x272a, // ✪
+ 0x272b, // ✫
+ 0x272c, // ✬
+ 0x272d, // ✭
+ 0x272e, // ✮
+ 0x272f, // ✯
+ 0x2730, // ✰
+ 0x2731, // ✱
+ 0x2732, // ✲
+ 0x2733, // ✳
+ 0x2734, // ✴
+ 0x2735, // ✵
+ 0x2736, // ✶
+ 0x2737, // ✷
+ 0x2738, // ✸
+ 0x2739, // ✹
+ 0x273a, // ✺
+ 0x273b, // ✻
+ 0x273c, // ✼
+ 0x273d, // ✽
+ 0x273e, // ✾
+ 0x273f, // ✿
+ 0x2740, // ❀
+ 0x2741, // ❁
+ 0x2742, // ❂
+ 0x2743, // ❃
+ 0x2744, // ❄
+ 0x2745, // ❅
+ 0x2746, // ❆
+ 0x2747, // ❇
+ 0x2748, // ❈
+ 0x2749, // ❉
+ 0x274a, // ❊
+ 0x274b, // ❋
+ 0x274d, // ❍
+ 0x274f, // ❏
+ 0x2750, // ❐
+ 0x2751, // ❑
+ 0x2752, // ❒
+ 0x2756, // ❖
+ 0x2758, // ❘
+ 0x2759, // ❙
+ 0x275a, // ❚
+ 0x275b, // ❛
+ 0x275c, // ❜
+ 0x275d, // ❝
+ 0x275e, // ❞
+ 0x2761, // ❡
+ 0x2762, // ❢
+ 0x2763, // ❣
+ 0x2764, // ❤
+ 0x2765, // ❥
+ 0x2766, // ❦
+ 0x2767, // ❧
+ 0x277f, // ❿
+ 0x2789, // ➉
+ 0x2793, // ➓
+ 0x2794, // ➔
+ 0x2798, // ➘
+ 0x2799, // ➙
+ 0x279a, // ➚
+ 0x279b, // ➛
+ 0x279c, // ➜
+ 0x279d, // ➝
+ 0x279e, // ➞
+ 0x279f, // ➟
+ 0x27a0, // ➠
+ 0x27a1, // ➡
+ 0x27a2, // ➢
+ 0x27a3, // ➣
+ 0x27a4, // ➤
+ 0x27a5, // ➥
+ 0x27a6, // ➦
+ 0x27a7, // ➧
+ 0x27a8, // ➨
+ 0x27a9, // ➩
+ 0x27aa, // ➪
+ 0x27ab, // ➫
+ 0x27ac, // ➬
+ 0x27ad, // ➭
+ 0x27ae, // ➮
+ 0x27af, // ➯
+ 0x27b1, // ➱
+ 0x27b2, // ➲
+ 0x27b3, // ➳
+ 0x27b4, // ➴
+ 0x27b5, // ➵
+ 0x27b6, // ➶
+ 0x27b7, // ➷
+ 0x27b8, // ➸
+ 0x27b9, // ➹
+ 0x27ba, // ➺
+ 0x27bb, // ➻
+ 0x27bc, // ➼
+ 0x27bd, // ➽
+ 0x27be, // ➾
+ 0x3000, //  
+ 0x3001, // 、
+ 0x3002, // 。
+ 0x3003, // 〃
+ 0x3008, // 〈
+ 0x3009, // 〉
+ 0x300a, // 《
+ 0x300b, // 》
+ 0x300c, // 「
+ 0x300d, // 」
+ 0x300e, // 『
+ 0x300f, // 』
+ 0x3010, // 【
+ 0x3011, // 】
+ 0x3012, // 〒
+ 0x3014, // 〔
+ 0x3015, // 〕
+ 0x3016, // 〖
+ 0x3017, // 〗
+ 0x3018, // 〘
+ 0x3019, // 〙
+ 0x301a, // 〚
+ 0x301b, // 〛
+ 0x3036, // 〶
+ 0xf6d9, // 
+ 0xf6da, // 
+ 0xf6db, // 
+ 0xf8d7, // 
+ 0xf8d8, // 
+ 0xf8d9, // 
+ 0xf8da, // 
+ 0xf8db, // 
+ 0xf8dc, // 
+ 0xf8dd, // 
+ 0xf8de, // 
+ 0xf8df, // 
+ 0xf8e0, // 
+ 0xf8e1, // 
+ 0xf8e2, // 
+ 0xf8e3, // 
+ 0xf8e4, // 
+ 0xf8e5, // 
+ 0xf8e6, // 
+ 0xf8e7, // 
+ 0xf8e8, // 
+ 0xf8e9, // 
+ 0xf8ea, // 
+ 0xf8eb, // 
+ 0xf8ec, // 
+ 0xf8ed, // 
+ 0xf8ee, // 
+ 0xf8ef, // 
+ 0xf8f0, // 
+ 0xf8f1, // 
+ 0xf8f2, // 
+ 0xf8f3, // 
+ 0xf8f4, // 
+ 0xf8f5, // 
+ 0xf8f6, // 
+ 0xf8f7, // 
+ 0xf8f8, // 
+ 0xf8f9, // 
+ 0xf8fa, // 
+ 0xf8fb, // 
+ 0xf8fc, // 
+ 0xf8fd, // 
+ 0xf8fe, // 
+ 0xfe7c, // ﹼ
+ 0xfe7d, // ﹽ
+ 0xff01, // !
+ 0xff02, // "
+ 0xff03, // #
+ 0xff04, // $
+ 0xff05, // %
+ 0xff06, // &
+ 0xff07, // '
+ 0xff08, // (
+ 0xff09, // )
+ 0xff09, // )
+ 0xff0a, // *
+ 0xff0b, // +
+ 0xff0c, // ,
+ 0xff0d, // -
+ 0xff0e, // .
+ 0xff0f, // /
+ 0xff1a, // :
+ 0xff1b, // ;
+ 0xff1c, // <
+ 0xff1d, // =
+ 0xff1e, // >
+ 0xff1f, // ?
+ 0xff20, // @
+ 0xff3b, // [
+ 0xff3c, // \
+ 0xff3d, // ]
+ 0xff3e, // ^
+ 0xff40, // `
+ 0xff5b, // {
+ 0xff5c, // |
+ 0xff5d, // }
+ 0xff5e, // ~
+ 0xff5f, // ⦅
+ 0xff60, // ⦆
+ 0xff61, // 。
+ 0xff62, // 「
+ 0xff63, // 」
+ 0xff64, // 、
+ 0xff65, // ・
+ 0xffe0, // ¢
+ 0xffe1, // £
+ 0xffe2, // ¬
+ 0xffe3, //  ̄
+ 0xffe4, // ¦
+ 0xffe5, // ¥
+ 0xffe6, // ₩
+ 0xffe8, // │
+ 0xffe9, // ←
+ 0xffea, // ↑
+ 0xffeb, // →
+ 0xffec, // ↓
+ 0xffed, // ■
+ 0xffee, // ○
+ 0x1d6fc, // 𝛼
+ 0x1d6fd, // 𝛽
+ 0x1d6fe, // 𝛾
+ 0x1d6ff, // 𝛿
+ 0x1d700, // 𝜀
+ 0x1d701, // 𝜁
+ 0x1d702, // 𝜂
+ 0x1d703, // 𝜃
+ 0x1d704, // 𝜄
+ 0x1d705, // 𝜅
+ 0x1d706, // 𝜆
+ 0x1d707, // 𝜇
+ 0x1d708, // 𝜈
+ 0x1d709, // 𝜉
+ 0x1d70a, // 𝜊
+ 0x1d70b, // 𝜋
+ 0x1d70c, // 𝜌
+ 0x1d70d, // 𝜍
+ 0x1d70e, // 𝜎
+ 0x1d70f, // 𝜏
+ 0x1d710, // 𝜐
+ 0x1d711, // 𝜑
+ 0x1d712, // 𝜒
+ 0x1d713, // 𝜓
+ 0x1d714, // 𝜔
+ 0x1d715, // 𝜕
+ 0x1d716, // 𝜖
+ 0x1d717, // 𝜗
+ 0x1d718, // 𝜘
+ 0x1d719, // 𝜙
+ 0x1d71a, // 𝜚
+ 0x1d71b, // 𝜛
+ 0xc2a0, // 슠
+ 0xe28087, //
+ 0xe280af, //
+ 0xe281a0, //
+ 0xefbbbf, //
+];
diff --git a/inc/Utf8/tables/upperaccents.php b/inc/Utf8/tables/upperaccents.php
new file mode 100644
index 000000000..e6e48de2c
--- /dev/null
+++ b/inc/Utf8/tables/upperaccents.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * UTF-8 lookup table for upper case accented letters
+ *
+ * This lookuptable defines replacements for accented characters from the ASCII-7
+ * range. This are upper case letters only.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @see \dokuwiki\Utf8\Clean::deaccent()
+ */
+return [
+ 'Á' => 'A',
+ 'À' => 'A',
+ 'Ă' => 'A',
+ 'Â' => 'A',
+ 'Å' => 'A',
+ 'Ä' => 'Ae',
+ 'Ã' => 'A',
+ 'Ą' => 'A',
+ 'Ā' => 'A',
+ 'Æ' => 'Ae',
+ 'Ḃ' => 'B',
+ 'Ć' => 'C',
+ 'Ĉ' => 'C',
+ 'Č' => 'C',
+ 'Ċ' => 'C',
+ 'Ç' => 'C',
+ 'Ď' => 'D',
+ 'Ḋ' => 'D',
+ 'Đ' => 'D',
+ 'Ð' => 'Dh',
+ 'É' => 'E',
+ 'È' => 'E',
+ 'Ĕ' => 'E',
+ 'Ê' => 'E',
+ 'Ě' => 'E',
+ 'Ë' => 'E',
+ 'Ė' => 'E',
+ 'Ę' => 'E',
+ 'Ē' => 'E',
+ 'Ḟ' => 'F',
+ 'Ƒ' => 'F',
+ 'Ğ' => 'G',
+ 'Ĝ' => 'G',
+ 'Ġ' => 'G',
+ 'Ģ' => 'G',
+ 'Ĥ' => 'H',
+ 'Ħ' => 'H',
+ 'Í' => 'I',
+ 'Ì' => 'I',
+ 'Î' => 'I',
+ 'Ï' => 'I',
+ 'Ĩ' => 'I',
+ 'Į' => 'I',
+ 'Ī' => 'I',
+ 'Ĵ' => 'J',
+ 'Ķ' => 'K',
+ 'Ĺ' => 'L',
+ 'Ľ' => 'L',
+ 'Ļ' => 'L',
+ 'Ł' => 'L',
+ 'Ṁ' => 'M',
+ 'Ń' => 'N',
+ 'Ň' => 'N',
+ 'Ñ' => 'N',
+ 'Ņ' => 'N',
+ 'Ó' => 'O',
+ 'Ò' => 'O',
+ 'Ô' => 'O',
+ 'Ö' => 'Oe',
+ 'Ő' => 'O',
+ 'Õ' => 'O',
+ 'Ø' => 'O',
+ 'Ō' => 'O',
+ 'Ơ' => 'O',
+ 'Ṗ' => 'P',
+ 'Ŕ' => 'R',
+ 'Ř' => 'R',
+ 'Ŗ' => 'R',
+ 'Ś' => 'S',
+ 'Ŝ' => 'S',
+ 'Š' => 'S',
+ 'Ṡ' => 'S',
+ 'Ş' => 'S',
+ 'Ș' => 'S',
+ 'Ť' => 'T',
+ 'Ṫ' => 'T',
+ 'Ţ' => 'T',
+ 'Ț' => 'T',
+ 'Ŧ' => 'T',
+ 'Ú' => 'U',
+ 'Ù' => 'U',
+ 'Ŭ' => 'U',
+ 'Û' => 'U',
+ 'Ů' => 'U',
+ 'Ü' => 'Ue',
+ 'Ű' => 'U',
+ 'Ũ' => 'U',
+ 'Ų' => 'U',
+ 'Ū' => 'U',
+ 'Ư' => 'U',
+ 'Ẃ' => 'W',
+ 'Ẁ' => 'W',
+ 'Ŵ' => 'W',
+ 'Ẅ' => 'W',
+ 'Ý' => 'Y',
+ 'Ỳ' => 'Y',
+ 'Ŷ' => 'Y',
+ 'Ÿ' => 'Y',
+ 'Ź' => 'Z',
+ 'Ž' => 'Z',
+ 'Ż' => 'Z',
+ 'Þ' => 'Th',
+];
diff --git a/inc/actions.php b/inc/actions.php
index 9ba887860..4ea529dcd 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -6,7 +6,7 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
+use dokuwiki\Extension\Event;
/**
* All action processing starts here
@@ -16,7 +16,7 @@ function act_dispatch(){
$router = \dokuwiki\ActionRouter::getInstance(true);
$headers = array('Content-Type: text/html; charset=utf-8');
- trigger_event('ACTION_HEADERS_SEND',$headers,'act_sendheaders');
+ Event::createAndTrigger('ACTION_HEADERS_SEND',$headers,'act_sendheaders');
// clear internal variables
unset($router);
diff --git a/inc/auth.php b/inc/auth.php
index e1d7a645a..ffd0c2249 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -9,9 +9,13 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
-
// some ACL level defines
+use dokuwiki\Extension\AuthPlugin;
+use dokuwiki\Extension\Event;
+use dokuwiki\Extension\PluginController;
+use dokuwiki\PassHash;
+use dokuwiki\Subscriptions\RegistrationSubscriptionSender;
+
define('AUTH_NONE', 0);
define('AUTH_READ', 1);
define('AUTH_EDIT', 2);
@@ -34,13 +38,13 @@ define('AUTH_ADMIN', 255);
*/
function auth_setup() {
global $conf;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
/* @var Input $INPUT */
global $INPUT;
global $AUTH_ACL;
global $lang;
- /* @var Doku_Plugin_Controller $plugin_controller */
+ /* @var PluginController $plugin_controller */
global $plugin_controller;
$AUTH_ACL = array();
@@ -96,17 +100,21 @@ function auth_setup() {
$INPUT->set('p', stripctl($INPUT->str('p')));
}
- if(!is_null($auth) && $auth->canDo('external')) {
- // external trust mechanism in place
- $auth->trustExternal($INPUT->str('u'), $INPUT->str('p'), $INPUT->bool('r'));
- } else {
+ $ok = null;
+ if (!is_null($auth) && $auth->canDo('external')) {
+ $ok = $auth->trustExternal($INPUT->str('u'), $INPUT->str('p'), $INPUT->bool('r'));
+ }
+
+ if ($ok === null) {
+ // external trust mechanism not in place, or returns no result,
+ // then attempt auth_login
$evdata = array(
'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');
+ Event::createAndTrigger('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
}
//load ACL into a global array XXX
@@ -135,7 +143,7 @@ function auth_loadACL() {
$out = array();
foreach($acl as $line) {
$line = trim($line);
- if(empty($line) || ($line{0} == '#')) continue; // skip blank lines & comments
+ if(empty($line) || ($line[0] == '#')) continue; // skip blank lines & comments
list($id,$rest) = preg_split('/[ \t]+/',$line,2);
// substitute user wildcard first (its 1:1)
@@ -150,10 +158,12 @@ function auth_loadACL() {
// substitute group wildcard (its 1:m)
if(strstr($line, '%GROUP%')){
// if user is not logged in, grps is empty, no output will be added (i.e. skipped)
- 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";
+ if(isset($USERINFO['grps'])){
+ 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 {
$out[] = "$id\t$rest";
@@ -211,7 +221,7 @@ function auth_login($user, $pass, $sticky = false, $silent = false) {
global $USERINFO;
global $conf;
global $lang;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
/* @var Input $INPUT */
global $INPUT;
@@ -407,7 +417,7 @@ function auth_decrypt($ciphertext, $secret) {
function auth_logoff($keepbc = false) {
global $conf;
global $USERINFO;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
/* @var Input $INPUT */
global $INPUT;
@@ -440,18 +450,19 @@ function auth_logoff($keepbc = false) {
*
* The info is available through $INFO['ismanager'], too
*
- * @author Andreas Gohr <andi@splitbrain.org>
+ * @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 bool $recache set to true to refresh the cache
+ * @return bool
* @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
- * @return bool
+ * @author Andreas Gohr <andi@splitbrain.org>
*/
-function auth_ismanager($user = null, $groups = null, $adminonly = false) {
+function auth_ismanager($user = null, $groups = null, $adminonly = false, $recache=false) {
global $conf;
global $USERINFO;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
/* @var Input $INPUT */
global $INPUT;
@@ -466,16 +477,25 @@ function auth_ismanager($user = null, $groups = null, $adminonly = false) {
}
}
if(is_null($groups)) {
- $groups = (array) $USERINFO['grps'];
+ $groups = $USERINFO ? (array) $USERINFO['grps'] : array();
}
- // check superuser match
- if(auth_isMember($conf['superuser'], $user, $groups)) return true;
- if($adminonly) return false;
- // check managers
- if(auth_isMember($conf['manager'], $user, $groups)) return true;
+ // prefer cached result
+ static $cache = [];
+ $cachekey = serialize([$user, $adminonly, $groups]);
+ if (!isset($cache[$cachekey]) || $recache) {
+ // check superuser match
+ $ok = auth_isMember($conf['superuser'], $user, $groups);
- return false;
+ // check managers
+ if (!$ok && !$adminonly) {
+ $ok = auth_isMember($conf['manager'], $user, $groups);
+ }
+
+ $cache[$cachekey] = $ok;
+ }
+
+ return $cache[$cachekey];
}
/**
@@ -485,15 +505,16 @@ function auth_ismanager($user = null, $groups = null, $adminonly = false) {
*
* The info is available through $INFO['isadmin'], too
*
+ * @param string $user Username
+ * @param array $groups List of groups the user is in
+ * @param bool $recache set to true to refresh the cache
+ * @return bool
* @author Andreas Gohr <andi@splitbrain.org>
* @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, $recache=false) {
+ return auth_ismanager($user, $groups, true, $recache);
}
/**
@@ -508,13 +529,13 @@ function auth_isadmin($user = null, $groups = null) {
* @return bool true for membership acknowledged
*/
function auth_isMember($memberlist, $user, array $groups) {
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
if(!$auth) return false;
// clean user and groups
if(!$auth->isCaseSensitive()) {
- $user = utf8_strtolower($user);
+ $user = \dokuwiki\Utf8\PhpString::strtolower($user);
$groups = array_map('utf8_strtolower', $groups);
}
$user = $auth->cleanUser($user);
@@ -529,7 +550,7 @@ function auth_isMember($memberlist, $user, array $groups) {
// compare cleaned values
foreach($members as $member) {
if($member == '@ALL' ) return true;
- if(!$auth->isCaseSensitive()) $member = utf8_strtolower($member);
+ if(!$auth->isCaseSensitive()) $member = \dokuwiki\Utf8\PhpString::strtolower($member);
if($member[0] == '@') {
$member = $auth->cleanGroup(substr($member, 1));
if(in_array($member, $groups)) return true;
@@ -560,7 +581,7 @@ function auth_quickaclcheck($id) {
global $INPUT;
# if no ACL is used always return upload rights
if(!$conf['useacl']) return AUTH_UPLOAD;
- return auth_aclcheck($id, $INPUT->server->str('REMOTE_USER'), $USERINFO['grps']);
+ return auth_aclcheck($id, $INPUT->server->str('REMOTE_USER'), is_array($USERINFO) ? $USERINFO['grps'] : array());
}
/**
@@ -581,7 +602,7 @@ function auth_aclcheck($id, $user, $groups) {
'groups' => $groups
);
- return trigger_event('AUTH_ACL_CHECK', $data, 'auth_aclcheck_cb');
+ return Event::createAndTrigger('AUTH_ACL_CHECK', $data, 'auth_aclcheck_cb');
}
/**
@@ -601,7 +622,7 @@ function auth_aclcheck_cb($data) {
global $conf;
global $AUTH_ACL;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
// if no ACL is used always return upload rights
@@ -617,7 +638,7 @@ function auth_aclcheck_cb($data) {
}
if(!$auth->isCaseSensitive()) {
- $user = utf8_strtolower($user);
+ $user = \dokuwiki\Utf8\PhpString::strtolower($user);
$groups = array_map('utf8_strtolower', $groups);
}
$user = auth_nameencode($auth->cleanUser($user));
@@ -644,7 +665,7 @@ function auth_aclcheck_cb($data) {
$match = preg_replace('/#.*$/', '', $match); //ignore comments
$acl = preg_split('/[ \t]+/', $match);
if(!$auth->isCaseSensitive() && $acl[1] !== '@ALL') {
- $acl[1] = utf8_strtolower($acl[1]);
+ $acl[1] = \dokuwiki\Utf8\PhpString::strtolower($acl[1]);
}
if(!in_array($acl[1], $groups)) {
continue;
@@ -674,7 +695,7 @@ function auth_aclcheck_cb($data) {
$match = preg_replace('/#.*$/', '', $match); //ignore comments
$acl = preg_split('/[ \t]+/', $match);
if(!$auth->isCaseSensitive() && $acl[1] !== '@ALL') {
- $acl[1] = utf8_strtolower($acl[1]);
+ $acl[1] = \dokuwiki\Utf8\PhpString::strtolower($acl[1]);
}
if(!in_array($acl[1], $groups)) {
continue;
@@ -733,7 +754,7 @@ function auth_nameencode($name, $skip_group = false) {
if($name == '%GROUP%') return $name;
if(!isset($cache[$name][$skip_group])) {
- if($skip_group && $name{0} == '@') {
+ if($skip_group && $name[0] == '@') {
$cache[$name][$skip_group] = '@'.preg_replace_callback(
'/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/',
'auth_nameencode_callback', substr($name, 1)
@@ -778,7 +799,7 @@ function auth_pwgen($foruser = '') {
'foruser' => $foruser
);
- $evt = new Doku_Event('AUTH_PASSWORD_GENERATE', $data);
+ $evt = new Event('AUTH_PASSWORD_GENERATE', $data);
if($evt->advise_before(true)) {
$c = 'bcdfghjklmnprstvwz'; //consonants except hard to speak ones
$v = 'aeiou'; //vowels
@@ -792,7 +813,7 @@ function auth_pwgen($foruser = '') {
$data['password'] .= $a[auth_random(0, strlen($a) - 1)];
}
//... and add a nice number and special
- $data['password'] .= auth_random(10, 99).$s[auth_random(0, strlen($s) - 1)];
+ $data['password'] .= $s[auth_random(0, strlen($s) - 1)].auth_random(10, 99);
}
$evt->advise_after();
@@ -810,7 +831,7 @@ function auth_pwgen($foruser = '') {
*/
function auth_sendPassword($user, $password) {
global $lang;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
if(!$auth) return false;
@@ -827,7 +848,7 @@ function auth_sendPassword($user, $password) {
);
$mail = new Mailer();
- $mail->to($userinfo['name'].' <'.$userinfo['mail'].'>');
+ $mail->to($mail->getCleanName($userinfo['name']).' <'.$userinfo['mail'].'>');
$mail->subject($lang['regpwmail']);
$mail->setBody($text, $trep);
return $mail->send();
@@ -845,7 +866,7 @@ function auth_sendPassword($user, $password) {
function register() {
global $lang;
global $conf;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var \dokuwiki\Extension\AuthPlugin $auth */
global $auth;
global $INPUT;
@@ -887,8 +908,8 @@ function register() {
}
// send notification about the new user
- $subscription = new Subscription();
- $subscription->send_register($login, $fullname, $email);
+ $subscription = new RegistrationSubscriptionSender();
+ $subscription->sendRegister($login, $fullname, $email);
// are we done?
if(!$conf['autopasswd']) {
@@ -914,7 +935,7 @@ function register() {
function updateprofile() {
global $conf;
global $lang;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
/* @var Input $INPUT */
global $INPUT;
@@ -1003,7 +1024,7 @@ function updateprofile() {
function auth_deleteprofile(){
global $conf;
global $lang;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var \dokuwiki\Extension\AuthPlugin $auth */
global $auth;
/* @var Input $INPUT */
global $INPUT;
@@ -1057,7 +1078,7 @@ function auth_deleteprofile(){
function act_resendpwd() {
global $lang;
global $conf;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
/* @var Input $INPUT */
global $INPUT;
@@ -1072,7 +1093,7 @@ function act_resendpwd() {
if($token) {
// we're in token phase - get user info from token
- $tfile = $conf['cachedir'].'/'.$token{0}.'/'.$token.'.pwauth';
+ $tfile = $conf['cachedir'].'/'.$token[0].'/'.$token.'.pwauth';
if(!file_exists($tfile)) {
msg($lang['resendpwdbadauth'], -1);
$INPUT->remove('pwauth');
@@ -1147,7 +1168,7 @@ function act_resendpwd() {
// generate auth token
$token = md5(auth_randombytes(16)); // random secret
- $tfile = $conf['cachedir'].'/'.$token{0}.'/'.$token.'.pwauth';
+ $tfile = $conf['cachedir'].'/'.$token[0].'/'.$token.'.pwauth';
$url = wl('', array('do'=> 'resendpwd', 'pwauth'=> $token), true, '&');
io_saveFile($tfile, $user);
@@ -1225,7 +1246,7 @@ function auth_verifyPassword($clear, $crypt) {
*/
function auth_setCookie($user, $pass, $sticky) {
global $conf;
- /* @var DokuWiki_Auth_Plugin $auth */
+ /* @var AuthPlugin $auth */
global $auth;
global $USERINFO;
diff --git a/inc/cache.php b/inc/cache.php
index 8589d91ba..b5793c263 100644
--- a/inc/cache.php
+++ b/inc/cache.php
@@ -1,337 +1,57 @@
<?php
-/**
- * Generic class to handle caching
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Chris Smith <chris@jalakai.co.uk>
- */
-
-if(!defined('DOKU_INC')) die('meh.');
+// phpcs:ignoreFile
+use dokuwiki\Cache\CacheParser;
+use dokuwiki\Cache\CacheInstructions;
+use dokuwiki\Cache\CacheRenderer;
+use dokuwiki\Debug\DebugHelper;
/**
- * Generic handling of caching
+ * @deprecated since 2019-02-02 use \dokuwiki\Cache\Cache instead!
*/
-class cache {
- public $key = ''; // primary identifier for this item
- public $ext = ''; // file ext for cache data, secondary identifier for this item
- public $cache = ''; // cache file name
- public $depends = array(); // array containing cache dependency information,
- // used by _useCache to determine cache validity
-
- public $_event = ''; // event to be triggered during useCache
- public $_time;
- public $_nocache = false; // if set to true, cache will not be used or stored
-
- /**
- * @param string $key primary identifier
- * @param string $ext file extension
- */
- public function __construct($key,$ext) {
- $this->key = $key;
- $this->ext = $ext;
- $this->cache = getCacheName($key,$ext);
- }
-
- /**
- * public method to determine whether the cache can be used
- *
- * to assist in centralisation of event triggering and calculation of cache statistics,
- * don't override this function override _useCache()
- *
- * @param array $depends array of cache dependencies, support dependecies:
- * 'age' => max age of the cache in seconds
- * 'files' => cache must be younger than mtime of each file
- * (nb. dependency passes if file doesn't exist)
- *
- * @return bool true if cache can be used, false otherwise
- */
- public function useCache($depends=array()) {
- $this->depends = $depends;
- $this->_addDependencies();
-
- if ($this->_event) {
- return $this->_stats(trigger_event($this->_event, $this, array($this,'_useCache')));
- } else {
- return $this->_stats($this->_useCache());
- }
- }
-
- /**
- * private method containing cache use decision logic
- *
- * this function processes the following keys in the depends array
- * purge - force a purge on any non empty value
- * age - expire cache if older than age (seconds)
- * files - expire cache if any file in this array was updated more recently than the cache
- *
- * Note that this function needs to be public as it is used as callback for the event handler
- *
- * can be overridden
- *
- * @return bool see useCache()
- */
- public function _useCache() {
-
- if ($this->_nocache) return false; // caching turned off
- if (!empty($this->depends['purge'])) return false; // purge requested?
- if (!($this->_time = @filemtime($this->cache))) return false; // cache exists?
-
- // cache too old?
- if (!empty($this->depends['age']) && ((time() - $this->_time) > $this->depends['age'])) return false;
-
- 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?
- }
- }
-
- return true;
- }
-
- /**
- * add dependencies to the depends array
- *
- * this method should only add dependencies,
- * it should not remove any existing dependencies and
- * it should only overwrite a dependency when the new value is more stringent than the old
- */
- protected function _addDependencies() {
- global $INPUT;
- if ($INPUT->has('purge')) $this->depends['purge'] = true; // purge requested
- }
-
- /**
- * retrieve the cached data
- *
- * @param bool $clean true to clean line endings, false to leave line endings alone
- * @return string cache contents
- */
- public function retrieveCache($clean=true) {
- return io_readFile($this->cache, $clean);
- }
-
- /**
- * cache $data
- *
- * @param string $data the data to be cached
- * @return bool true on success, false otherwise
- */
- public function storeCache($data) {
- if ($this->_nocache) return false;
-
- return io_savefile($this->cache, $data);
- }
-
- /**
- * remove any cached data associated with this cache instance
- */
- public function removeCache() {
- @unlink($this->cache);
- }
-
- /**
- * Record cache hits statistics.
- * (Only when debugging allowed, to reduce overhead.)
- *
- * @param bool $success result of this cache use attempt
- * @return bool pass-thru $success value
- */
- protected function _stats($success) {
- global $conf;
- static $stats = null;
- static $file;
-
- if (!$conf['allowdebug']) { return $success; }
-
- if (is_null($stats)) {
- $file = $conf['cachedir'].'/cache_stats.txt';
- $lines = explode("\n",io_readFile($file));
-
- foreach ($lines as $line) {
- $i = strpos($line,',');
- $stats[substr($line,0,$i)] = $line;
- }
- }
-
- if (isset($stats[$this->ext])) {
- list($ext,$count,$hits) = explode(',',$stats[$this->ext]);
- } else {
- $ext = $this->ext;
- $count = 0;
- $hits = 0;
- }
-
- $count++;
- if ($success) $hits++;
- $stats[$this->ext] = "$ext,$count,$hits";
-
- io_saveFile($file,join("\n",$stats));
-
- return $success;
+class cache extends \dokuwiki\Cache\Cache
+{
+ public function __construct($key, $ext)
+ {
+ DebugHelper::dbgDeprecatedFunction(dokuwiki\Cache\Cache::class);
+ parent::__construct($key, $ext);
}
}
/**
- * Parser caching
+ * @deprecated since 2019-02-02 use \dokuwiki\Cache\CacheParser instead!
*/
-class cache_parser extends cache {
+class cache_parser extends \dokuwiki\Cache\CacheParser
+{
- public $file = ''; // source file for cache
- public $mode = ''; // input mode (represents the processing the input file will undergo)
- public $page = '';
-
- public $_event = 'PARSER_CACHE_USE';
-
- /**
- *
- * @param string $id page id
- * @param string $file source file for cache
- * @param string $mode input mode
- */
- public function __construct($id, $file, $mode) {
- if ($id) $this->page = $id;
- $this->file = $file;
- $this->mode = $mode;
-
- parent::__construct($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.$mode);
- }
-
- /**
- * method contains cache use decision logic
- *
- * @return bool see useCache()
- */
- public function _useCache() {
-
- if (!file_exists($this->file)) return false; // source exists?
- return parent::_useCache();
- }
-
- protected function _addDependencies() {
-
- // parser cache file dependencies ...
- $files = array($this->file, // ... source
- DOKU_INC.'inc/parser/parser.php', // ... parser
- DOKU_INC.'inc/parser/handler.php', // ... handler
- );
- $files = array_merge($files, getConfigFiles('main')); // ... wiki settings
-
- $this->depends['files'] = !empty($this->depends['files']) ? array_merge($files, $this->depends['files']) : $files;
- parent::_addDependencies();
+ public function __construct($id, $file, $mode)
+ {
+ DebugHelper::dbgDeprecatedFunction(CacheParser::class);
+ parent::__construct($id, $file, $mode);
}
}
/**
- * Caching of data of renderer
+ * @deprecated since 2019-02-02 use \dokuwiki\Cache\CacheRenderer instead!
*/
-class cache_renderer extends cache_parser {
-
- /**
- * method contains cache use decision logic
- *
- * @return bool see useCache()
- */
- public function _useCache() {
- global $conf;
-
- if (!parent::_useCache()) return false;
-
- if (!isset($this->page)) {
- 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
- if ($this->_time >= @filemtime($conf['cachedir'].'/purgefile')) {
- return true;
- }
-
- // for wiki pages, check metadata dependencies
- $metadata = p_get_metadata($this->page);
+class cache_renderer extends \dokuwiki\Cache\CacheRenderer
+{
- if (!isset($metadata['relation']['references']) ||
- empty($metadata['relation']['references'])) {
- return true;
- }
-
- foreach ($metadata['relation']['references'] as $id => $exists) {
- if ($exists != page_exists($id,'',false)) return false;
- }
-
- return true;
- }
-
- protected function _addDependencies() {
- global $conf;
-
- // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values:
- // -1 : do not cache (should not be overridden)
- // 0 : cache never expires (can be overridden) - no need to set depends['age']
- if ($conf['cachetime'] == -1) {
- $this->_nocache = true;
- return;
- } elseif ($conf['cachetime'] > 0) {
- $this->depends['age'] = isset($this->depends['age']) ?
- min($this->depends['age'],$conf['cachetime']) : $conf['cachetime'];
- }
-
- // renderer cache file dependencies ...
- $files = array(
- DOKU_INC.'inc/parser/'.$this->mode.'.php', // ... the renderer
- );
-
- // page implies metadata and possibly some other dependencies
- if (isset($this->page)) {
-
- $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']) ?
- min($this->depends['age'],$valid['age']) : $valid['age'];
- }
- }
-
- $this->depends['files'] = !empty($this->depends['files']) ? array_merge($files, $this->depends['files']) : $files;
- parent::_addDependencies();
+ public function __construct($id, $file, $mode)
+ {
+ DebugHelper::dbgDeprecatedFunction(CacheRenderer::class);
+ parent::__construct($id, $file, $mode);
}
}
/**
- * Caching of parser instructions
+ * @deprecated since 2019-02-02 use \dokuwiki\Cache\CacheInstructions instead!
*/
-class cache_instructions extends cache_parser {
-
- /**
- * @param string $id page id
- * @param string $file source file for cache
- */
- public function __construct($id, $file) {
- parent::__construct($id, $file, 'i');
- }
-
- /**
- * retrieve the cached data
- *
- * @param bool $clean true to clean line endings, false to leave line endings alone
- * @return array cache contents
- */
- public function retrieveCache($clean=true) {
- $contents = io_readFile($this->cache, false);
- return !empty($contents) ? unserialize($contents) : array();
- }
-
- /**
- * cache $instructions
- *
- * @param array $instructions the instruction to be cached
- * @return bool true on success, false otherwise
- */
- public function storeCache($instructions) {
- if ($this->_nocache) return false;
-
- return io_savefile($this->cache,serialize($instructions));
+class cache_instructions extends \dokuwiki\Cache\CacheInstructions
+{
+ public function __construct($id, $file)
+ {
+ DebugHelper::dbgDeprecatedFunction(CacheInstructions::class);
+ parent::__construct($id, $file);
}
}
diff --git a/inc/changelog.php b/inc/changelog.php
index d77b0180a..57eb48c76 100644
--- a/inc/changelog.php
+++ b/inc/changelog.php
@@ -93,7 +93,7 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr
'type' => str_replace($strip, '', $type),
'id' => $id,
'user' => $user,
- 'sum' => utf8_substr(str_replace($strip, '', $summary), 0, 255),
+ 'sum' => \dokuwiki\Utf8\PhpString::substr(str_replace($strip, '', $summary), 0, 255),
'extra' => str_replace($strip, '', $extra),
'sizechange' => $sizechange
);
@@ -104,20 +104,27 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr
if (!$wasRemoved) {
$oldmeta = p_read_metadata($id);
$meta = array();
- if ($wasCreated && empty($oldmeta['persistent']['date']['created'])){ // newly created
+ if (
+ $wasCreated && (
+ empty($oldmeta['persistent']['date']['created']) ||
+ $oldmeta['persistent']['date']['created'] === $created
+ )
+ ){
+ // newly created
$meta['date']['created'] = $created;
if ($user){
- $meta['creator'] = $INFO['userinfo']['name'];
+ $meta['creator'] = isset($INFO) ? $INFO['userinfo']['name'] : null;
$meta['user'] = $user;
}
- } elseif (($wasCreated || $wasReverted) && !empty($oldmeta['persistent']['date']['created'])) { // re-created / restored
+ } elseif (($wasCreated || $wasReverted) && !empty($oldmeta['persistent']['date']['created'])) {
+ // re-created / restored
$meta['date']['created'] = $oldmeta['persistent']['date']['created'];
$meta['date']['modified'] = $created; // use the files ctime here
$meta['creator'] = $oldmeta['persistent']['creator'];
- if ($user) $meta['contributor'][$user] = $INFO['userinfo']['name'];
+ if ($user) $meta['contributor'][$user] = isset($INFO) ? $INFO['userinfo']['name'] : null;
} elseif (!$minor) { // non-minor modification
$meta['date']['modified'] = $date;
- if ($user) $meta['contributor'][$user] = $INFO['userinfo']['name'];
+ if ($user) $meta['contributor'][$user] = isset($INFO) ? $INFO['userinfo']['name'] : null;
}
$meta['last_change'] = $logline;
p_set_metadata($id, $meta);
@@ -147,7 +154,15 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr
* - (none, so far)
* @param null|int $sizechange Change of filesize
*/
-function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null, $sizechange = null){
+function addMediaLogEntry(
+ $date,
+ $id,
+ $type=DOKU_CHANGE_TYPE_EDIT,
+ $summary='',
+ $extra='',
+ $flags=null,
+ $sizechange = null)
+{
global $conf;
/** @var Input $INPUT */
global $INPUT;
@@ -170,7 +185,7 @@ function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='',
'type' => str_replace($strip, '', $type),
'id' => $id,
'user' => $user,
- 'sum' => utf8_substr(str_replace($strip, '', $summary), 0, 255),
+ 'sum' => \dokuwiki\Utf8\PhpString::substr(str_replace($strip, '', $summary), 0, 255),
'extra' => str_replace($strip, '', $extra),
'sizechange' => $sizechange
);
@@ -190,6 +205,7 @@ function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='',
*
* RECENTS_SKIP_DELETED - don't include deleted pages
* RECENTS_SKIP_MINORS - don't include minor changes
+ * RECENTS_ONLY_CREATION - only include new created pages and media
* RECENTS_SKIP_SUBSPACES - don't include subspaces
* RECENTS_MEDIA_CHANGES - return media changes instead of page changes
* RECENTS_MEDIA_PAGES_MIXED - return both media changes and page changes
@@ -213,16 +229,22 @@ function getRecents($first,$num,$ns='',$flags=0){
// read all recent changes. (kept short)
if ($flags & RECENTS_MEDIA_CHANGES) {
- $lines = @file($conf['media_changelog']);
+ $lines = @file($conf['media_changelog']) ?: [];
} else {
- $lines = @file($conf['changelog']);
+ $lines = @file($conf['changelog']) ?: [];
+ }
+ if (!is_array($lines)) {
+ $lines = array();
}
$lines_position = count($lines)-1;
$media_lines_position = 0;
$media_lines = array();
if ($flags & RECENTS_MEDIA_PAGES_MIXED) {
- $media_lines = @file($conf['media_changelog']);
+ $media_lines = @file($conf['media_changelog']) ?: [];
+ if (!is_array($media_lines)) {
+ $media_lines = array();
+ }
$media_lines_position = count($media_lines)-1;
}
@@ -238,7 +260,12 @@ 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);
+ $media_rec = _handleRecent(
+ @$media_lines[$media_lines_position],
+ $ns,
+ $flags | RECENTS_MEDIA_CHANGES,
+ $seen
+ );
if (!$media_rec) {
$media_lines_position --;
continue;
@@ -273,6 +300,7 @@ function getRecents($first,$num,$ns='',$flags=0){
*
* RECENTS_SKIP_DELETED - don't include deleted pages
* RECENTS_SKIP_MINORS - don't include minor changes
+ * RECENTS_ONLY_CREATION - only include new created pages and media
* RECENTS_SKIP_SUBSPACES - don't include subspaces
* RECENTS_MEDIA_CHANGES - return media changes instead of page changes
*
@@ -347,6 +375,9 @@ function _handleRecent($line,$ns,$flags,&$seen){
// skip seen ones
if(isset($seen[$recent['id']])) return false;
+ // skip changes, of only new items are requested
+ if($recent['type']!==DOKU_CHANGE_TYPE_CREATE && ($flags & RECENTS_ONLY_CREATION)) return false;
+
// skip minors
if($recent['type']===DOKU_CHANGE_TYPE_MINOR_EDIT && ($flags & RECENTS_SKIP_MINORS)) return false;
@@ -378,682 +409,3 @@ function _handleRecent($line,$ns,$flags,&$seen){
return $recent;
}
-
-/**
- * Class ChangeLog
- * methods for handling of changelog of pages or media files
- */
-abstract class ChangeLog {
-
- /** @var string */
- protected $id;
- /** @var int */
- protected $chunk_size;
- /** @var array */
- protected $cache;
-
- /**
- * Constructor
- *
- * @param string $id page id
- * @param int $chunk_size maximum block size read from file
- */
- public function __construct($id, $chunk_size = 8192) {
- global $cache_revinfo;
-
- $this->cache =& $cache_revinfo;
- if(!isset($this->cache[$id])) {
- $this->cache[$id] = array();
- }
-
- $this->id = $id;
- $this->setChunkSize($chunk_size);
-
- }
-
- /**
- * Set chunk size for file reading
- * Chunk size zero let read whole file at once
- *
- * @param int $chunk_size maximum block size read from file
- */
- public function setChunkSize($chunk_size) {
- if(!is_numeric($chunk_size)) $chunk_size = 0;
-
- $this->chunk_size = (int) max($chunk_size, 0);
- }
-
- /**
- * Returns path to changelog
- *
- * @return string path to file
- */
- abstract protected function getChangelogFilename();
-
- /**
- * Returns path to current page/media
- *
- * @return string path to file
- */
- abstract protected function getFilename();
-
- /**
- * Get the changelog information for a specific page id and revision (timestamp)
- *
- * Adjacent changelog lines are optimistically parsed and cached to speed up
- * consecutive calls to getRevisionInfo. For large changelog files, only the chunk
- * containing the requested changelog line is read.
- *
- * @param int $rev revision timestamp
- * @return bool|array false or array with entries:
- * - date: unix timestamp
- * - ip: IPv4 address (127.0.0.1)
- * - type: log line type
- * - id: page id
- * - user: user name
- * - sum: edit summary (or action reason)
- * - extra: extra data (varies by line type)
- *
- * @author Ben Coburn <btcoburn@silicodon.net>
- * @author Kate Arzamastseva <pshns@ukr.net>
- */
- public function getRevisionInfo($rev) {
- $rev = max($rev, 0);
-
- // check if it's already in the memory cache
- if(isset($this->cache[$this->id]) && isset($this->cache[$this->id][$rev])) {
- return $this->cache[$this->id][$rev];
- }
-
- //read lines from changelog
- list($fp, $lines) = $this->readloglines($rev);
- if($fp) {
- fclose($fp);
- }
- if(empty($lines)) return false;
-
- // parse and cache changelog lines
- foreach($lines as $value) {
- $tmp = parseChangelogLine($value);
- if($tmp !== false) {
- $this->cache[$this->id][$tmp['date']] = $tmp;
- }
- }
- if(!isset($this->cache[$this->id][$rev])) {
- return false;
- }
- return $this->cache[$this->id][$rev];
- }
-
- /**
- * Return a list of page revisions numbers
- *
- * Does not guarantee that the revision exists in the attic,
- * only that a line with the date exists in the changelog.
- * By default the current revision is skipped.
- *
- * The current revision is automatically skipped when the page exists.
- * See $INFO['meta']['last_change'] for the current revision.
- * A negative $first let read the current revision too.
- *
- * For efficiency, the log lines are parsed and cached for later
- * calls to getRevisionInfo. Large changelog files are read
- * backwards in chunks until the requested number of changelog
- * lines are recieved.
- *
- * @param int $first skip the first n changelog lines
- * @param int $num number of revisions to return
- * @return array with the revision timestamps
- *
- * @author Ben Coburn <btcoburn@silicodon.net>
- * @author Kate Arzamastseva <pshns@ukr.net>
- */
- public function getRevisions($first, $num) {
- $revs = array();
- $lines = array();
- $count = 0;
-
- $num = max($num, 0);
- if($num == 0) {
- return $revs;
- }
-
- if($first < 0) {
- $first = 0;
- } else if(file_exists($this->getFilename())) {
- // skip current revision if the page exists
- $first = max($first + 1, 0);
- }
-
- $file = $this->getChangelogFilename();
-
- if(!file_exists($file)) {
- return $revs;
- }
- if(filesize($file) < $this->chunk_size || $this->chunk_size == 0) {
- // read whole file
- $lines = file($file);
- if($lines === false) {
- return $revs;
- }
- } else {
- // read chunks backwards
- $fp = fopen($file, 'rb'); // "file pointer"
- if($fp === false) {
- return $revs;
- }
- fseek($fp, 0, SEEK_END);
- $tail = ftell($fp);
-
- // chunk backwards
- $finger = max($tail - $this->chunk_size, 0);
- while($count < $num + $first) {
- $nl = $this->getNewlinepointer($fp, $finger);
-
- // was the chunk big enough? if not, take another bite
- if($nl > 0 && $tail <= $nl) {
- $finger = max($finger - $this->chunk_size, 0);
- continue;
- } else {
- $finger = $nl;
- }
-
- // read chunk
- $chunk = '';
- $read_size = max($tail - $finger, 0); // found chunk size
- $got = 0;
- while($got < $read_size && !feof($fp)) {
- $tmp = @fread($fp, max(min($this->chunk_size, $read_size - $got), 0));
- if($tmp === false) {
- break;
- } //error state
- $got += strlen($tmp);
- $chunk .= $tmp;
- }
- $tmp = explode("\n", $chunk);
- array_pop($tmp); // remove trailing newline
-
- // combine with previous chunk
- $count += count($tmp);
- $lines = array_merge($tmp, $lines);
-
- // next chunk
- if($finger == 0) {
- break;
- } // already read all the lines
- else {
- $tail = $finger;
- $finger = max($tail - $this->chunk_size, 0);
- }
- }
- fclose($fp);
- }
-
- // skip parsing extra lines
- $num = max(min(count($lines) - $first, $num), 0);
- if ($first > 0 && $num > 0) { $lines = array_slice($lines, max(count($lines) - $first - $num, 0), $num); }
- else if($first > 0 && $num == 0) { $lines = array_slice($lines, 0, max(count($lines) - $first, 0)); }
- else if($first == 0 && $num > 0) { $lines = array_slice($lines, max(count($lines) - $num, 0)); }
-
- // handle lines in reverse order
- for($i = count($lines) - 1; $i >= 0; $i--) {
- $tmp = parseChangelogLine($lines[$i]);
- if($tmp !== false) {
- $this->cache[$this->id][$tmp['date']] = $tmp;
- $revs[] = $tmp['date'];
- }
- }
-
- return $revs;
- }
-
- /**
- * Get the nth revision left or right handside for a specific page id and revision (timestamp)
- *
- * For large changelog files, only the chunk containing the
- * reference revision $rev is read and sometimes a next chunck.
- *
- * Adjacent changelog lines are optimistically parsed and cached to speed up
- * consecutive calls to getRevisionInfo.
- *
- * @param int $rev revision timestamp used as startdate (doesn't need to be revisionnumber)
- * @param int $direction give position of returned revision with respect to $rev; positive=next, negative=prev
- * @return bool|int
- * timestamp of the requested revision
- * otherwise false
- */
- public function getRelativeRevision($rev, $direction) {
- $rev = max($rev, 0);
- $direction = (int) $direction;
-
- //no direction given or last rev, so no follow-up
- if(!$direction || ($direction > 0 && $this->isCurrentRevision($rev))) {
- return false;
- }
-
- //get lines from changelog
- list($fp, $lines, $head, $tail, $eof) = $this->readloglines($rev);
- if(empty($lines)) return false;
-
- // look for revisions later/earlier then $rev, when founded count till the wanted revision is reached
- // also parse and cache changelog lines for getRevisionInfo().
- $revcounter = 0;
- $relativerev = false;
- $checkotherchunck = true; //always runs once
- while(!$relativerev && $checkotherchunck) {
- $tmp = array();
- //parse in normal or reverse order
- $count = count($lines);
- if($direction > 0) {
- $start = 0;
- $step = 1;
- } else {
- $start = $count - 1;
- $step = -1;
- }
- for($i = $start; $i >= 0 && $i < $count; $i = $i + $step) {
- $tmp = parseChangelogLine($lines[$i]);
- if($tmp !== false) {
- $this->cache[$this->id][$tmp['date']] = $tmp;
- //look for revs older/earlier then reference $rev and select $direction-th one
- if(($direction > 0 && $tmp['date'] > $rev) || ($direction < 0 && $tmp['date'] < $rev)) {
- $revcounter++;
- if($revcounter == abs($direction)) {
- $relativerev = $tmp['date'];
- }
- }
- }
- }
-
- //true when $rev is found, but not the wanted follow-up.
- $checkotherchunck = $fp
- && ($tmp['date'] == $rev || ($revcounter > 0 && !$relativerev))
- && !(($tail == $eof && $direction > 0) || ($head == 0 && $direction < 0));
-
- if($checkotherchunck) {
- list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, $direction);
-
- if(empty($lines)) break;
- }
- }
- if($fp) {
- fclose($fp);
- }
-
- return $relativerev;
- }
-
- /**
- * Returns revisions around rev1 and rev2
- * When available it returns $max entries for each revision
- *
- * @param int $rev1 oldest revision timestamp
- * @param int $rev2 newest revision timestamp (0 looks up last revision)
- * @param int $max maximum number of revisions returned
- * @return array with two arrays with revisions surrounding rev1 respectively rev2
- */
- public function getRevisionsAround($rev1, $rev2, $max = 50) {
- $max = floor(abs($max) / 2)*2 + 1;
- $rev1 = max($rev1, 0);
- $rev2 = max($rev2, 0);
-
- if($rev2) {
- if($rev2 < $rev1) {
- $rev = $rev2;
- $rev2 = $rev1;
- $rev1 = $rev;
- }
- } else {
- //empty right side means a removed page. Look up last revision.
- $revs = $this->getRevisions(-1, 1);
- $rev2 = $revs[0];
- }
- //collect revisions around rev2
- list($revs2, $allrevs, $fp, $lines, $head, $tail) = $this->retrieveRevisionsAround($rev2, $max);
-
- if(empty($revs2)) return array(array(), array());
-
- //collect revisions around rev1
- $index = array_search($rev1, $allrevs);
- if($index === false) {
- //no overlapping revisions
- list($revs1,,,,,) = $this->retrieveRevisionsAround($rev1, $max);
- if(empty($revs1)) $revs1 = array();
- } else {
- //revisions overlaps, reuse revisions around rev2
- $revs1 = $allrevs;
- while($head > 0) {
- for($i = count($lines) - 1; $i >= 0; $i--) {
- $tmp = parseChangelogLine($lines[$i]);
- if($tmp !== false) {
- $this->cache[$this->id][$tmp['date']] = $tmp;
- $revs1[] = $tmp['date'];
- $index++;
-
- if($index > floor($max / 2)) break 2;
- }
- }
-
- list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, -1);
- }
- sort($revs1);
- //return wanted selection
- $revs1 = array_slice($revs1, max($index - floor($max/2), 0), $max);
- }
-
- return array(array_reverse($revs1), array_reverse($revs2));
- }
-
- /**
- * Returns lines from changelog.
- * If file larger than $chuncksize, only chunck is read that could contain $rev.
- *
- * @param int $rev revision timestamp
- * @return array|false
- * if success returns array(fp, array(changeloglines), $head, $tail, $eof)
- * where fp only defined for chuck reading, needs closing.
- * otherwise false
- */
- protected function readloglines($rev) {
- $file = $this->getChangelogFilename();
-
- if(!file_exists($file)) {
- return false;
- }
-
- $fp = null;
- $head = 0;
- $tail = 0;
- $eof = 0;
-
- if(filesize($file) < $this->chunk_size || $this->chunk_size == 0) {
- // read whole file
- $lines = file($file);
- if($lines === false) {
- return false;
- }
- } else {
- // read by chunk
- $fp = fopen($file, 'rb'); // "file pointer"
- if($fp === false) {
- return false;
- }
- $head = 0;
- fseek($fp, 0, SEEK_END);
- $eof = ftell($fp);
- $tail = $eof;
-
- // find chunk
- while($tail - $head > $this->chunk_size) {
- $finger = $head + floor(($tail - $head) / 2.0);
- $finger = $this->getNewlinepointer($fp, $finger);
- $tmp = fgets($fp);
- if($finger == $head || $finger == $tail) {
- break;
- }
- $tmp = parseChangelogLine($tmp);
- $finger_rev = $tmp['date'];
-
- if($finger_rev > $rev) {
- $tail = $finger;
- } else {
- $head = $finger;
- }
- }
-
- if($tail - $head < 1) {
- // cound not find chunk, assume requested rev is missing
- fclose($fp);
- return false;
- }
-
- $lines = $this->readChunk($fp, $head, $tail);
- }
- return array(
- $fp,
- $lines,
- $head,
- $tail,
- $eof
- );
- }
-
- /**
- * Read chunk and return array with lines of given chunck.
- * Has no check if $head and $tail are really at a new line
- *
- * @param resource $fp resource filepointer
- * @param int $head start point chunck
- * @param int $tail end point chunck
- * @return array lines read from chunck
- */
- protected function readChunk($fp, $head, $tail) {
- $chunk = '';
- $chunk_size = max($tail - $head, 0); // found chunk size
- $got = 0;
- fseek($fp, $head);
- while($got < $chunk_size && !feof($fp)) {
- $tmp = @fread($fp, max(min($this->chunk_size, $chunk_size - $got), 0));
- if($tmp === false) { //error state
- break;
- }
- $got += strlen($tmp);
- $chunk .= $tmp;
- }
- $lines = explode("\n", $chunk);
- array_pop($lines); // remove trailing newline
- return $lines;
- }
-
- /**
- * Set pointer to first new line after $finger and return its position
- *
- * @param resource $fp filepointer
- * @param int $finger a pointer
- * @return int pointer
- */
- protected function getNewlinepointer($fp, $finger) {
- fseek($fp, $finger);
- $nl = $finger;
- if($finger > 0) {
- fgets($fp); // slip the finger forward to a new line
- $nl = ftell($fp);
- }
- return $nl;
- }
-
- /**
- * Check whether given revision is the current page
- *
- * @param int $rev timestamp of current page
- * @return bool true if $rev is current revision, otherwise false
- */
- public function isCurrentRevision($rev) {
- return $rev == @filemtime($this->getFilename());
- }
-
- /**
- * Return an existing revision for a specific date which is
- * the current one or younger or equal then the date
- *
- * @param number $date_at timestamp
- * @return string revision ('' for current)
- */
- function getLastRevisionAt($date_at){
- //requested date_at(timestamp) younger or equal then modified_time($this->id) => load current
- if(file_exists($this->getFilename()) && $date_at >= @filemtime($this->getFilename())) {
- return '';
- } else if ($rev = $this->getRelativeRevision($date_at+1, -1)) { //+1 to get also the requested date revision
- return $rev;
- } else {
- return false;
- }
- }
-
- /**
- * Returns the next lines of the changelog of the chunck before head or after tail
- *
- * @param resource $fp filepointer
- * @param int $head position head of last chunk
- * @param int $tail position tail of last chunk
- * @param int $direction positive forward, negative backward
- * @return array with entries:
- * - $lines: changelog lines of readed chunk
- * - $head: head of chunk
- * - $tail: tail of chunk
- */
- protected function readAdjacentChunk($fp, $head, $tail, $direction) {
- if(!$fp) return array(array(), $head, $tail);
-
- if($direction > 0) {
- //read forward
- $head = $tail;
- $tail = $head + floor($this->chunk_size * (2 / 3));
- $tail = $this->getNewlinepointer($fp, $tail);
- } else {
- //read backward
- $tail = $head;
- $head = max($tail - $this->chunk_size, 0);
- while(true) {
- $nl = $this->getNewlinepointer($fp, $head);
- // was the chunk big enough? if not, take another bite
- if($nl > 0 && $tail <= $nl) {
- $head = max($head - $this->chunk_size, 0);
- } else {
- $head = $nl;
- break;
- }
- }
- }
-
- //load next chunck
- $lines = $this->readChunk($fp, $head, $tail);
- return array($lines, $head, $tail);
- }
-
- /**
- * Collect the $max revisions near to the timestamp $rev
- *
- * @param int $rev revision timestamp
- * @param int $max maximum number of revisions to be returned
- * @return bool|array
- * return array with entries:
- * - $requestedrevs: array of with $max revision timestamps
- * - $revs: all parsed revision timestamps
- * - $fp: filepointer only defined for chuck reading, needs closing.
- * - $lines: non-parsed changelog lines before the parsed revisions
- * - $head: position of first readed changelogline
- * - $lasttail: position of end of last readed changelogline
- * otherwise false
- */
- protected function retrieveRevisionsAround($rev, $max) {
- //get lines from changelog
- list($fp, $lines, $starthead, $starttail, /* $eof */) = $this->readloglines($rev);
- if(empty($lines)) return false;
-
- //parse chunk containing $rev, and read forward more chunks until $max/2 is reached
- $head = $starthead;
- $tail = $starttail;
- $revs = array();
- $aftercount = $beforecount = 0;
- while(count($lines) > 0) {
- foreach($lines as $line) {
- $tmp = parseChangelogLine($line);
- if($tmp !== false) {
- $this->cache[$this->id][$tmp['date']] = $tmp;
- $revs[] = $tmp['date'];
- if($tmp['date'] >= $rev) {
- //count revs after reference $rev
- $aftercount++;
- if($aftercount == 1) $beforecount = count($revs);
- }
- //enough revs after reference $rev?
- if($aftercount > floor($max / 2)) break 2;
- }
- }
- //retrieve next chunk
- list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, 1);
- }
- if($aftercount == 0) return false;
-
- $lasttail = $tail;
-
- //read additional chuncks backward until $max/2 is reached and total number of revs is equal to $max
- $lines = array();
- $i = 0;
- if($aftercount > 0) {
- $head = $starthead;
- $tail = $starttail;
- while($head > 0) {
- list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, -1);
-
- for($i = count($lines) - 1; $i >= 0; $i--) {
- $tmp = parseChangelogLine($lines[$i]);
- if($tmp !== false) {
- $this->cache[$this->id][$tmp['date']] = $tmp;
- $revs[] = $tmp['date'];
- $beforecount++;
- //enough revs before reference $rev?
- if($beforecount > max(floor($max / 2), $max - $aftercount)) break 2;
- }
- }
- }
- }
- sort($revs);
-
- //keep only non-parsed lines
- $lines = array_slice($lines, 0, $i);
- //trunk desired selection
- $requestedrevs = array_slice($revs, -$max, $max);
-
- return array($requestedrevs, $revs, $fp, $lines, $head, $lasttail);
- }
-}
-
-/**
- * Class PageChangelog handles changelog of a wiki page
- */
-class PageChangelog extends ChangeLog {
-
- /**
- * Returns path to changelog
- *
- * @return string path to file
- */
- protected function getChangelogFilename() {
- return metaFN($this->id, '.changes');
- }
-
- /**
- * Returns path to current page/media
- *
- * @return string path to file
- */
- protected function getFilename() {
- return wikiFN($this->id);
- }
-}
-
-/**
- * Class MediaChangelog handles changelog of a media file
- */
-class MediaChangelog extends ChangeLog {
-
- /**
- * Returns path to changelog
- *
- * @return string path to file
- */
- protected function getChangelogFilename() {
- return mediaMetaFN($this->id, '.changes');
- }
-
- /**
- * Returns path to current page/media
- *
- * @return string path to file
- */
- protected function getFilename() {
- return mediaFN($this->id);
- }
-}
diff --git a/inc/cli.php b/inc/cli.php
index cb4fc587d..cb4dabf04 100644
--- a/inc/cli.php
+++ b/inc/cli.php
@@ -5,6 +5,7 @@
*
* All DokuWiki commandline scripts should inherit from this class and implement the abstract methods.
*
+ * @deprecated 2017-11-10
* @author Andreas Gohr <andi@splitbrain.org>
*/
abstract class DokuCLI {
@@ -401,13 +402,13 @@ class DokuCLI_Options {
}
// first non-option
- if($arg{0} != '-') {
+ if($arg[0] != '-') {
$non_opts = array_merge($non_opts, array_slice($this->args, $i));
break;
}
// long option
- if(strlen($arg) > 1 && $arg{1} == '-') {
+ if(strlen($arg) > 1 && $arg[1] == '-') {
list($opt, $val) = explode('=', substr($arg, 2), 2);
if(!isset($this->setup[$this->command]['opts'][$opt])) {
diff --git a/inc/common.php b/inc/common.php
index 1fd0154c2..3fc1b85f5 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -6,7 +6,13 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
+use dokuwiki\Cache\CacheInstructions;
+use dokuwiki\Cache\CacheRenderer;
+use dokuwiki\ChangeLog\PageChangeLog;
+use dokuwiki\Subscriptions\PageSubscriptionSender;
+use dokuwiki\Subscriptions\SubscriberManager;
+use dokuwiki\Extension\AuthPlugin;
+use dokuwiki\Extension\Event;
/**
* These constants are used with the recents function
@@ -16,6 +22,7 @@ define('RECENTS_SKIP_MINORS', 4);
define('RECENTS_SKIP_SUBSPACES', 8);
define('RECENTS_MEDIA_CHANGES', 16);
define('RECENTS_MEDIA_PAGES_MIXED', 32);
+define('RECENTS_ONLY_CREATION', 64);
/**
* Wrapper around htmlspecialchars()
@@ -100,7 +107,7 @@ function getSecurityToken() {
// CSRF checks are only for logged in users - do not generate for anonymous
if(trim($user) == '' || trim($session) == '') return '';
- return PassHash::hmac('md5', $session.$user, auth_cookiesalt());
+ return \dokuwiki\PassHash::hmac('md5', $session.$user, auth_cookiesalt());
}
/**
@@ -211,12 +218,8 @@ function pageinfo() {
$info['id'] = $ID;
$info['rev'] = $REV;
- if($INPUT->server->has('REMOTE_USER')) {
- $sub = new Subscription();
- $info['subscribed'] = $sub->user_subscription();
- } else {
- $info['subscribed'] = false;
- }
+ $subManager = new SubscriberManager();
+ $info['subscribed'] = $subManager->userSubscription();
$info['locked'] = checklock($ID);
$info['filepath'] = wikiFN($ID);
@@ -274,27 +277,29 @@ function pageinfo() {
p_set_metadata($ID, array('last_change' => $revinfo));
}
- $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 !== false){
+ $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']) {
- $info['editor'] = $revinfo['user'];
- } else {
- $info['editor'] = $revinfo['ip'];
+ if($revinfo['user']) {
+ $info['editor'] = $revinfo['user'];
+ } else {
+ $info['editor'] = $revinfo['ip'];
+ }
+ }else{
+ $info['ip'] = null;
+ $info['user'] = null;
+ $info['sum'] = null;
+ $info['editor'] = null;
}
// draft
- $draft = getCacheName($info['client'].$ID, '.draft');
- if(file_exists($draft)) {
- if(@filemtime($draft) < @filemtime(wikiFN($ID))) {
- // remove stale draft
- @unlink($draft);
- } else {
- $info['draft'] = $draft;
- }
+ $draft = new \dokuwiki\Draft($ID, $info['client']);
+ if ($draft->isDraftAvailable()) {
+ $info['draft'] = $draft->getDraftFilename();
}
return $info;
@@ -311,7 +316,7 @@ function jsinfo() {
}
//export minimal info to JS, plugins can add more
$JSINFO['id'] = $ID;
- $JSINFO['namespace'] = (string) $INFO['namespace'];
+ $JSINFO['namespace'] = isset($INFO) ? (string) $INFO['namespace'] : '';
$JSINFO['ACT'] = act_clean($ACT);
$JSINFO['useHeadingNavigation'] = (int) useHeading('navigation');
$JSINFO['useHeadingContent'] = (int) useHeading('content');
@@ -361,16 +366,16 @@ function buildURLparams($params, $sep = '&amp;') {
*
* @author Andreas Gohr
*
- * @param array $params array with (attribute name-attribute value) pairs
- * @param bool $skipempty skip empty string values?
+ * @param array $params array with (attribute name-attribute value) pairs
+ * @param bool $skipEmptyStrings skip empty string values?
* @return string
*/
-function buildAttributes($params, $skipempty = false) {
+function buildAttributes($params, $skipEmptyStrings = false) {
$url = '';
$white = false;
foreach($params as $key => $val) {
- if($key{0} == '_') continue;
- if($val === '' && $skipempty) continue;
+ if($key[0] == '_') continue;
+ if($val === '' && $skipEmptyStrings) continue;
if($white) $url .= ' ';
$url .= $key.'="';
@@ -396,12 +401,13 @@ function breadcrumbs() {
global $ID;
global $ACT;
global $conf;
+ global $INFO;
//first visit?
$crumbs = isset($_SESSION[DOKU_COOKIE]['bc']) ? $_SESSION[DOKU_COOKIE]['bc'] : array();
- //we only save on show and existing visible wiki documents
+ //we only save on show and existing visible readable wiki documents
$file = wikiFN($ID);
- if($ACT != 'show' || isHiddenPage($ID) || !file_exists($file)) {
+ if($ACT != 'show' || $INFO['perm'] < AUTH_READ || isHiddenPage($ID) || !file_exists($file)) {
$_SESSION[DOKU_COOKIE]['bc'] = $crumbs;
return $crumbs;
}
@@ -490,7 +496,9 @@ function wl($id = '', $urlParameters = '', $absolute = false, $separator = '&amp
global $conf;
if(is_array($urlParameters)) {
if(isset($urlParameters['rev']) && !$urlParameters['rev']) unset($urlParameters['rev']);
- if(isset($urlParameters['at']) && $conf['date_at_format']) $urlParameters['at'] = date($conf['date_at_format'],$urlParameters['at']);
+ if(isset($urlParameters['at']) && $conf['date_at_format']) {
+ $urlParameters['at'] = date($conf['date_at_format'], $urlParameters['at']);
+ }
$urlParameters = buildURLparams($urlParameters, $separator);
} else {
$urlParameters = str_replace(',', $separator, $urlParameters);
@@ -511,7 +519,7 @@ function wl($id = '', $urlParameters = '', $absolute = false, $separator = '&amp
} elseif($conf['userewrite']) {
$xlink .= $id;
if($urlParameters) $xlink .= '?'.$urlParameters;
- } elseif($id) {
+ } elseif($id !== '') {
$xlink .= DOKU_SCRIPT.'?id='.$id;
if($urlParameters) $xlink .= $separator.$urlParameters;
} else {
@@ -714,7 +722,13 @@ function checkwordblock($text = '') {
if(!$text) $text = "$PRE $TEXT $SUF $SUM";
// 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);
+ // phpcs:disable Generic.Files.LineLength.TooLong
+ $text = preg_replace(
+ '!(\b)(www\.[\w.:?\-;,]+?\.[\w.:?\-;,]+?[\w/\#~:.?+=&%@\!\-.:?\-;,]+?)([.:?\-;,]*[^\w/\#~:.?+=&%@\!\-.:?\-;,])!i',
+ '\1http://\2 \2\3',
+ $text
+ );
+ // phpcs:enable
$wordblocks = getWordblocks();
// how many lines to read at once (to work around some PCRE limits)
@@ -750,7 +764,7 @@ function checkwordblock($text = '') {
$callback = function () {
return true;
};
- return trigger_event('COMMON_WORDBLOCK_BLOCKED', $data, $callback, true);
+ return Event::createAndTrigger('COMMON_WORDBLOCK_BLOCKED', $data, $callback, true);
}
}
return false;
@@ -773,7 +787,7 @@ function checkwordblock($text = '') {
*/
function clientIP($single = false) {
/* @var Input $INPUT */
- global $INPUT;
+ global $INPUT, $conf;
$ip = array();
$ip[] = $INPUT->server->str('REMOTE_ADDR');
@@ -820,17 +834,18 @@ function clientIP($single = false) {
if(!$single) return join(',', $ip);
- // decide which IP to use, trying to avoid local addresses
- $ip = array_reverse($ip);
+ // skip trusted local addresses
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)) {
+ if(!empty($conf['trustedproxy']) && preg_match('/'.$conf['trustedproxy'].'/', $i)) {
continue;
} else {
return $i;
}
}
- // still here? just use the first (last) address
- return $ip[0];
+
+ // still here? just use the last address
+ // this case all ips in the list are trusted
+ return $ip[count($ip)-1];
}
/**
@@ -840,6 +855,7 @@ function clientIP($single = false) {
*
* @link http://www.brainhandles.com/2007/10/15/detecting-mobile-browsers/#code
*
+ * @deprecated 2018-04-27 you probably want media queries instead anyway
* @return bool if true, client is mobile browser; otherwise false
*/
function clientismobile() {
@@ -852,7 +868,18 @@ function clientismobile() {
if(!$INPUT->server->has('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';
+ $uamatches = join(
+ '|',
+ [
+ '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", $INPUT->server->str('HTTP_USER_AGENT'))) return true;
@@ -996,7 +1023,7 @@ function cleanText($text) {
// if the text is not valid UTF-8 we simply assume latin1
// this won't break any worse than it breaks with the wrong encoding
// but might actually fix the problem in many cases
- if(!utf8_check($text)) $text = utf8_encode($text);
+ if(!\dokuwiki\Utf8\Clean::isUtf8($text)) $text = utf8_encode($text);
return $text;
}
@@ -1065,7 +1092,7 @@ function pageTemplate($id) {
'doreplace' => true // should wildcard replacements be done on the text?
);
- $evt = new Doku_Event('COMMON_PAGETPL_LOAD', $data);
+ $evt = new Event('COMMON_PAGETPL_LOAD', $data);
if($evt->advise_before(true)) {
// the before event might have loaded the content already
if(empty($data['tpl'])) {
@@ -1129,6 +1156,9 @@ function parsePageTemplate(&$data) {
'@ID@',
'@NS@',
'@CURNS@',
+ '@!CURNS@',
+ '@!!CURNS@',
+ '@!CURNS!@',
'@FILE@',
'@!FILE@',
'@!FILE!@',
@@ -1145,16 +1175,19 @@ function parsePageTemplate(&$data) {
$id,
getNS($id),
curNS($id),
+ \dokuwiki\Utf8\PhpString::ucfirst(curNS($id)),
+ \dokuwiki\Utf8\PhpString::ucwords(curNS($id)),
+ \dokuwiki\Utf8\PhpString::strtoupper(curNS($id)),
$file,
- utf8_ucfirst($file),
- utf8_strtoupper($file),
+ \dokuwiki\Utf8\PhpString::ucfirst($file),
+ \dokuwiki\Utf8\PhpString::strtoupper($file),
$page,
- utf8_ucfirst($page),
- utf8_ucwords($page),
- utf8_strtoupper($page),
+ \dokuwiki\Utf8\PhpString::ucfirst($page),
+ \dokuwiki\Utf8\PhpString::ucwords($page),
+ \dokuwiki\Utf8\PhpString::strtoupper($page),
$INPUT->server->str('REMOTE_USER'),
- $USERINFO['name'],
- $USERINFO['mail'],
+ $USERINFO ? $USERINFO['name'] : '',
+ $USERINFO ? $USERINFO['mail'] : '',
$conf['dformat'],
), $tpl
);
@@ -1268,9 +1301,17 @@ function detectExternalEdit($id) {
$filesize_new = filesize($fileLastMod);
$sizechange = $filesize_new - $filesize_old;
- addLogEntry($lastMod, $id, DOKU_CHANGE_TYPE_EDIT, $lang['external_edit'], '', array('ExternalEdit'=> true), $sizechange);
+ addLogEntry(
+ $lastMod,
+ $id,
+ DOKU_CHANGE_TYPE_EDIT,
+ $lang['external_edit'],
+ '',
+ array('ExternalEdit' => true),
+ $sizechange
+ );
// remove soon to be stale instructions
- $cache = new cache_instructions($id, $fileLastMod);
+ $cache = new CacheInstructions($id, $fileLastMod);
$cache->removeCache();
}
}
@@ -1334,7 +1375,7 @@ function saveWikiText($id, $text, $summary, $minor = false) {
$svdta['changeType'] = DOKU_CHANGE_TYPE_MINOR_EDIT;
}
- $event = new Doku_Event('COMMON_WIKIPAGE_SAVE', $svdta);
+ $event = new Event('COMMON_WIKIPAGE_SAVE', $svdta);
if(!$event->advise_before()) return;
// if the content has not been changed, no save happens (plugins may override this)
@@ -1353,7 +1394,7 @@ function saveWikiText($id, $text, $summary, $minor = false) {
if($svdta['changeType'] == DOKU_CHANGE_TYPE_DELETE) {
// Send "update" event with empty data, so plugins can react to page deletion
$data = array(array($svdta['file'], '', false), getNS($id), noNS($id), false);
- trigger_event('IO_WIKIPAGE_WRITE', $data);
+ Event::createAndTrigger('IO_WIKIPAGE_WRITE', $data);
// pre-save deleted revision
@touch($svdta['file']);
clearstatcache();
@@ -1361,7 +1402,8 @@ function saveWikiText($id, $text, $summary, $minor = false) {
// remove empty file
@unlink($svdta['file']);
$filesize_new = 0;
- // don't remove old meta info as it should be saved, plugins can use IO_WIKIPAGE_WRITE for removing their metadata...
+ // don't remove old meta info as it should be saved, plugins can use
+ // IO_WIKIPAGE_WRITE for removing their metadata...
// purge non-persistant meta data
p_purge_metadata($id);
// remove empty namespaces
@@ -1378,11 +1420,19 @@ function saveWikiText($id, $text, $summary, $minor = false) {
$event->advise_after();
- addLogEntry($svdta['newRevision'], $svdta['id'], $svdta['changeType'], $svdta['summary'], $svdta['changeInfo'], null, $svdta['sizechange']);
+ addLogEntry(
+ $svdta['newRevision'],
+ $svdta['id'],
+ $svdta['changeType'],
+ $svdta['summary'],
+ $svdta['changeInfo'],
+ null,
+ $svdta['sizechange']
+ );
// send notify mails
- notify($svdta['id'], 'admin', $svdta['oldRevision'], $svdta['summary'], $minor);
- notify($svdta['id'], 'subscribers', $svdta['oldRevision'], $svdta['summary'], $minor);
+ notify($svdta['id'], 'admin', $svdta['oldRevision'], $svdta['summary'], $minor, $svdta['newRevision']);
+ notify($svdta['id'], 'subscribers', $svdta['oldRevision'], $svdta['summary'], $minor, $svdta['newRevision']);
// update the purgefile (timestamp of the last time anything within the wiki was changed)
io_saveFile($conf['cachedir'].'/purgefile', time());
@@ -1391,7 +1441,7 @@ function saveWikiText($id, $text, $summary, $minor = false) {
if(useHeading('content')) {
$pages = ft_backlinks($id, true);
foreach($pages as $page) {
- $cache = new cache_renderer($page, wikiFN($page), 'xhtml');
+ $cache = new CacheRenderer($page, wikiFN($page), 'xhtml');
$cache->removeCache();
}
}
@@ -1424,11 +1474,12 @@ function saveOldRevision($id) {
* @param string $summary What changed
* @param boolean $minor Is this a minor edit?
* @param string[] $replace Additional string substitutions, @KEY@ to be replaced by value
+ * @param int|string $current_rev New page revision
* @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(), $current_rev = false) {
global $conf;
/* @var Input $INPUT */
global $INPUT;
@@ -1442,9 +1493,9 @@ function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace =
if(!actionOK('subscribe')) return false; //subscribers enabled?
if($conf['useacl'] && $INPUT->server->str('REMOTE_USER') && $minor) return false; //skip minors
$data = array('id' => $id, 'addresslist' => '', 'self' => false, 'replacements' => $replace);
- trigger_event(
+ Event::createAndTrigger(
'COMMON_NOTIFY_ADDRESSLIST', $data,
- array(new Subscription(), 'notifyaddresses')
+ array(new SubscriberManager(), 'notifyAddresses')
);
$to = $data['addresslist'];
if(empty($to)) return false;
@@ -1454,8 +1505,8 @@ function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace =
}
// prepare content
- $subscription = new Subscription();
- return $subscription->send_diff($to, $tpl, $id, $rev, $summary);
+ $subscription = new PageSubscriptionSender();
+ return $subscription->sendPageDiff($to, $tpl, $id, $rev, $summary, $current_rev);
}
/**
@@ -1479,11 +1530,7 @@ function getGoogleQuery() {
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);
- if(UTF8_MBSTRING) mb_internal_encoding($enc);
$q = '';
if(isset($query['q'])){
@@ -1496,6 +1543,8 @@ function getGoogleQuery() {
$q = trim($q);
if(!$q) return '';
+ // ignore if query includes a full URL
+ if(strpos($q, '//') !== false) return '';
$q = preg_split('/[\s\'"\\\\`()\]\[?:!\.{};,#+*<>\\/]+/', $q, -1, PREG_SPLIT_NO_EMPTY);
return $q;
}
@@ -1616,12 +1665,7 @@ function obfuscate($email) {
return strtr($email, $obfuscate);
case 'hex' :
- $encode = '';
- $len = strlen($email);
- for($x = 0; $x < $len; $x++) {
- $encode .= '&#x'.bin2hex($email{$x}).';';
- }
- return $encode;
+ return \dokuwiki\Utf8\Conversion::toHtml($email, true);
case 'none' :
default :
@@ -1645,34 +1689,27 @@ function unslash($string, $char = "'") {
/**
* Convert php.ini shorthands to byte
*
- * @author <gilthans dot NO dot SPAM at gmail dot com>
- * @link http://php.net/manual/en/ini.core.php#79564
+ * On 32 bit systems values >= 2GB will fail!
+ *
+ * -1 (infinite size) will be reported as -1
*
- * @param string $v shorthands
- * @return int|string
+ * @link https://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes
+ * @param string $value PHP size shorthand
+ * @return int
*/
-function php_to_byte($v) {
- $l = substr($v, -1);
- $ret = substr($v, 0, -1);
- switch(strtoupper($l)) {
- /** @noinspection PhpMissingBreakStatementInspection */
- case 'P':
- $ret *= 1024;
- /** @noinspection PhpMissingBreakStatementInspection */
- case 'T':
- $ret *= 1024;
- /** @noinspection PhpMissingBreakStatementInspection */
+function php_to_byte($value) {
+ switch (strtoupper(substr($value,-1))) {
case 'G':
- $ret *= 1024;
- /** @noinspection PhpMissingBreakStatementInspection */
+ $ret = intval(substr($value, 0, -1)) * 1024 * 1024 * 1024;
+ break;
case 'M':
- $ret *= 1024;
- /** @noinspection PhpMissingBreakStatementInspection */
+ $ret = intval(substr($value, 0, -1)) * 1024 * 1024;
+ break;
case 'K':
- $ret *= 1024;
+ $ret = intval(substr($value, 0, -1)) * 1024;
break;
- default;
- $ret *= 10;
+ default:
+ $ret = intval($value);
break;
}
return $ret;
@@ -1704,12 +1741,15 @@ function preg_quote_cb($string) {
* @return string
*/
function shorten($keep, $short, $max, $min = 9, $char = '…') {
- $max = $max - utf8_strlen($keep);
+ $max = $max - \dokuwiki\Utf8\PhpString::strlen($keep);
if($max < $min) return $keep;
- $len = utf8_strlen($short);
+ $len = \dokuwiki\Utf8\PhpString::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);
+ return $keep .
+ \dokuwiki\Utf8\PhpString::substr($short, 0, $half - 1) .
+ $char .
+ \dokuwiki\Utf8\PhpString::substr($short, $len - $half);
}
/**
@@ -1737,7 +1777,7 @@ function editorinfo($username, $textonly = false) {
*/
function userlink($username = null, $textonly = false) {
global $conf, $INFO;
- /** @var DokuWiki_Auth_Plugin $auth */
+ /** @var AuthPlugin $auth */
global $auth;
/** @var Input $INPUT */
global $INPUT;
@@ -1764,11 +1804,12 @@ function userlink($username = null, $textonly = false) {
if($textonly){
$data['name'] = $INFO['userinfo']['name']. ' (' . $INPUT->server->str('REMOTE_USER') . ')';
}else {
- $data['name'] = '<bdi>' . hsc($INFO['userinfo']['name']) . '</bdi> (<bdi>' . hsc($INPUT->server->str('REMOTE_USER')) . '</bdi>)';
+ $data['name'] = '<bdi>' . hsc($INFO['userinfo']['name']) . '</bdi> '.
+ '(<bdi>' . hsc($INPUT->server->str('REMOTE_USER')) . '</bdi>)';
}
}
- $evt = new Doku_Event('COMMON_USER_LINK', $data);
+ $evt = new Event('COMMON_USER_LINK', $data);
if($evt->advise_before(true)) {
if(empty($data['name'])) {
if($auth) $info = $auth->getUserData($username);
@@ -1887,6 +1928,7 @@ function license_img($type) {
function is_mem_available($mem, $bytes = 1048576) {
$limit = trim(ini_get('memory_limit'));
if(empty($limit)) return true; // no limit set!
+ if($limit == -1) return true; // unlimited
// parse limit to bytes
$limit = php_to_byte($limit);
@@ -1997,7 +2039,10 @@ function get_doku_pref($pref, $default) {
if(isset($_COOKIE['DOKU_PREFS']) && strpos($_COOKIE['DOKU_PREFS'], $enc_pref) !== false) {
$parts = explode('#', $_COOKIE['DOKU_PREFS']);
$cnt = count($parts);
- for($i = 0; $i < $cnt; $i += 2) {
+
+ // due to #2721 there might be duplicate entries,
+ // so we read from the end
+ for($i = $cnt-2; $i >= 0; $i -= 2) {
if($parts[$i] == $enc_pref) {
return urldecode($parts[$i + 1]);
}
@@ -2019,29 +2064,39 @@ function set_doku_pref($pref, $val) {
$orig = get_doku_pref($pref, false);
$cookieVal = '';
- if($orig && ($orig != $val)) {
+ if($orig !== false && ($orig !== $val)) {
$parts = explode('#', $_COOKIE['DOKU_PREFS']);
$cnt = count($parts);
// urlencode $pref for the comparison
$enc_pref = rawurlencode($pref);
- for($i = 0; $i < $cnt; $i += 2) {
- if($parts[$i] == $enc_pref) {
- if ($val !== false) {
- $parts[$i + 1] = rawurlencode($val);
+ $seen = false;
+ for ($i = 0; $i < $cnt; $i += 2) {
+ if ($parts[$i] == $enc_pref) {
+ if (!$seen){
+ if ($val !== false) {
+ $parts[$i + 1] = rawurlencode($val);
+ } else {
+ unset($parts[$i]);
+ unset($parts[$i + 1]);
+ }
+ $seen = true;
} else {
+ // no break because we want to remove duplicate entries
unset($parts[$i]);
unset($parts[$i + 1]);
}
- break;
}
}
$cookieVal = implode('#', $parts);
- } else if (!$orig && $val !== false) {
- $cookieVal = ($_COOKIE['DOKU_PREFS'] ? $_COOKIE['DOKU_PREFS'].'#' : '').rawurlencode($pref).'#'.rawurlencode($val);
+ } else if ($orig === false && $val !== false) {
+ $cookieVal = ($_COOKIE['DOKU_PREFS'] ? $_COOKIE['DOKU_PREFS'] . '#' : '') .
+ rawurlencode($pref) . '#' . rawurlencode($val);
}
- if (!empty($cookieVal)) {
- $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
+ $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
+ if(defined('DOKU_UNITTEST')) {
+ $_COOKIE['DOKU_PREFS'] = $cookieVal;
+ }else{
setcookie('DOKU_PREFS', $cookieVal, time()+365*24*3600, $cookieDir, '', ($conf['securecookie'] && is_ssl()));
}
}
diff --git a/inc/compatibility.php b/inc/compatibility.php
index cb865a2d7..445f2456b 100644
--- a/inc/compatibility.php
+++ b/inc/compatibility.php
@@ -79,4 +79,5 @@ if(!function_exists('gztell') && function_exists('gztell64')) {
function gztell($zp) {
return gztell64($zp);
}
-} \ No newline at end of file
+}
+
diff --git a/inc/config_cascade.php b/inc/config_cascade.php
index f0aa6cc7e..61d099c6e 100644
--- a/inc/config_cascade.php
+++ b/inc/config_cascade.php
@@ -61,6 +61,10 @@ $config_cascade = array_merge(
'userscript' => array(
'default' => array(DOKU_CONF . 'userscript.js')
),
+ 'styleini' => array(
+ 'default' => array(DOKU_INC . 'lib/tpl/%TEMPLATE%/' . 'style.ini'),
+ 'local' => array(DOKU_CONF . 'tpl/%TEMPLATE%/' . 'style.ini')
+ ),
'acl' => array(
'default' => DOKU_CONF . 'acl.auth.php',
),
diff --git a/inc/confutils.php b/inc/confutils.php
index 59147010f..31724d27d 100644
--- a/inc/confutils.php
+++ b/inc/confutils.php
@@ -11,6 +11,9 @@
* (scheme.conf & stopwords.conf), e.g.
* !gopher
*/
+
+use dokuwiki\Extension\AuthPlugin;
+use dokuwiki\Extension\Event;
const DOKU_CONF_NEGATION = '!';
/**
@@ -145,19 +148,23 @@ function getCdnUrls() {
'versions' => $versions,
'src' => &$src
);
- $event = new Doku_Event('CONFUTIL_CDN_SELECT', $data);
+ $event = new Event('CONFUTIL_CDN_SELECT', $data);
if($event->advise_before()) {
if(!$conf['jquerycdn']) {
$jqmod = md5(join('-', $versions));
$src[] = DOKU_BASE . 'lib/exe/jquery.php' . '?tseed=' . $jqmod;
} elseif($conf['jquerycdn'] == 'jquery') {
$src[] = sprintf('https://code.jquery.com/jquery-%s.min.js', $versions['JQ_VERSION']);
- $src[] = sprintf('https://code.jquery.com/jquery-migrate-%s.min.js', $versions['JQM_VERSION']);
$src[] = sprintf('https://code.jquery.com/ui/%s/jquery-ui.min.js', $versions['JQUI_VERSION']);
} elseif($conf['jquerycdn'] == 'cdnjs') {
- $src[] = sprintf('https://cdnjs.cloudflare.com/ajax/libs/jquery/%s/jquery.min.js', $versions['JQ_VERSION']);
- $src[] = sprintf('https://cdnjs.cloudflare.com/ajax/libs/jquery-migrate/%s/jquery-migrate.min.js', $versions['JQM_VERSION']);
- $src[] = sprintf('https://cdnjs.cloudflare.com/ajax/libs/jqueryui/%s/jquery-ui.min.js', $versions['JQUI_VERSION']);
+ $src[] = sprintf(
+ 'https://cdnjs.cloudflare.com/ajax/libs/jquery/%s/jquery.min.js',
+ $versions['JQ_VERSION']
+ );
+ $src[] = sprintf(
+ 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/%s/jquery-ui.min.js',
+ $versions['JQUI_VERSION']
+ );
}
}
$event->advise_after();
@@ -341,7 +348,7 @@ function actionOK($action){
static $disabled = null;
if(is_null($disabled) || defined('SIMPLE_TEST')){
global $conf;
- /** @var DokuWiki_Auth_Plugin $auth */
+ /** @var AuthPlugin $auth */
global $auth;
// prepare disabled actions array and handle legacy options
diff --git a/inc/deprecated.php b/inc/deprecated.php
new file mode 100644
index 000000000..205037344
--- /dev/null
+++ b/inc/deprecated.php
@@ -0,0 +1,570 @@
+<?php
+// phpcs:ignoreFile -- this file violates PSR2 by definition
+/**
+ * These classes and functions are deprecated and will be removed in future releases
+ */
+
+use dokuwiki\Debug\DebugHelper;
+use dokuwiki\Subscriptions\BulkSubscriptionSender;
+use dokuwiki\Subscriptions\MediaSubscriptionSender;
+use dokuwiki\Subscriptions\PageSubscriptionSender;
+use dokuwiki\Subscriptions\RegistrationSubscriptionSender;
+use dokuwiki\Subscriptions\SubscriberManager;
+
+/**
+ * @inheritdoc
+ * @deprecated 2018-05-07
+ */
+class RemoteAccessDeniedException extends \dokuwiki\Remote\AccessDeniedException
+{
+ /** @inheritdoc */
+ public function __construct($message = "", $code = 0, Throwable $previous = null)
+ {
+ dbg_deprecated(\dokuwiki\Remote\AccessDeniedException::class);
+ parent::__construct($message, $code, $previous);
+ }
+
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2018-05-07
+ */
+class RemoteException extends \dokuwiki\Remote\RemoteException
+{
+ /** @inheritdoc */
+ public function __construct($message = "", $code = 0, Throwable $previous = null)
+ {
+ dbg_deprecated(\dokuwiki\Remote\RemoteException::class);
+ parent::__construct($message, $code, $previous);
+ }
+
+}
+
+/**
+ * Escapes regex characters other than (, ) and /
+ *
+ * @param string $str
+ * @return string
+ * @deprecated 2018-05-04
+ */
+function Doku_Lexer_Escape($str)
+{
+ dbg_deprecated('\\dokuwiki\\Parsing\\Lexer\\Lexer::escape()');
+ return \dokuwiki\Parsing\Lexer\Lexer::escape($str);
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2018-06-01
+ */
+class setting extends \dokuwiki\plugin\config\core\Setting\Setting
+{
+ /** @inheritdoc */
+ public function __construct($key, array $params = null)
+ {
+ dbg_deprecated(\dokuwiki\plugin\config\core\Setting\Setting::class);
+ parent::__construct($key, $params);
+ }
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2018-06-01
+ */
+class setting_authtype extends \dokuwiki\plugin\config\core\Setting\SettingAuthtype
+{
+ /** @inheritdoc */
+ public function __construct($key, array $params = null)
+ {
+ dbg_deprecated(\dokuwiki\plugin\config\core\Setting\SettingAuthtype::class);
+ parent::__construct($key, $params);
+ }
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2018-06-01
+ */
+class setting_string extends \dokuwiki\plugin\config\core\Setting\SettingString
+{
+ /** @inheritdoc */
+ public function __construct($key, array $params = null)
+ {
+ dbg_deprecated(\dokuwiki\plugin\config\core\Setting\SettingString::class);
+ parent::__construct($key, $params);
+ }
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2018-06-15
+ */
+class PageChangelog extends \dokuwiki\ChangeLog\PageChangeLog
+{
+ /** @inheritdoc */
+ public function __construct($id, $chunk_size = 8192)
+ {
+ dbg_deprecated(\dokuwiki\ChangeLog\PageChangeLog::class);
+ parent::__construct($id, $chunk_size);
+ }
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2018-06-15
+ */
+class MediaChangelog extends \dokuwiki\ChangeLog\MediaChangeLog
+{
+ /** @inheritdoc */
+ public function __construct($id, $chunk_size = 8192)
+ {
+ dbg_deprecated(\dokuwiki\ChangeLog\MediaChangeLog::class);
+ parent::__construct($id, $chunk_size);
+ }
+}
+
+/** Behavior switch for JSON::decode() */
+define('JSON_LOOSE_TYPE', 16);
+
+/** Behavior switch for JSON::decode() */
+define('JSON_STRICT_TYPE', 0);
+
+/**
+ * Encode/Decode JSON
+ * @deprecated 2018-07-27
+ */
+class JSON
+{
+ protected $use = 0;
+
+ /**
+ * @param int $use JSON_*_TYPE flag
+ * @deprecated 2018-07-27
+ */
+ public function __construct($use = JSON_STRICT_TYPE)
+ {
+ $this->use = $use;
+ }
+
+ /**
+ * Encode given structure to JSON
+ *
+ * @param mixed $var
+ * @return string
+ * @deprecated 2018-07-27
+ */
+ public function encode($var)
+ {
+ dbg_deprecated('json_encode');
+ return json_encode($var);
+ }
+
+ /**
+ * Alias for encode()
+ * @param $var
+ * @return string
+ * @deprecated 2018-07-27
+ */
+ public function enc($var) {
+ return $this->encode($var);
+ }
+
+ /**
+ * Decode given string from JSON
+ *
+ * @param string $str
+ * @return mixed
+ * @deprecated 2018-07-27
+ */
+ public function decode($str)
+ {
+ dbg_deprecated('json_encode');
+ return json_decode($str, ($this->use == JSON_LOOSE_TYPE));
+ }
+
+ /**
+ * Alias for decode
+ *
+ * @param $str
+ * @return mixed
+ * @deprecated 2018-07-27
+ */
+ public function dec($str) {
+ return $this->decode($str);
+ }
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2019-02-19
+ */
+class Input extends \dokuwiki\Input\Input {
+ /**
+ * @inheritdoc
+ * @deprecated 2019-02-19
+ */
+ public function __construct()
+ {
+ dbg_deprecated(\dokuwiki\Input\Input::class);
+ parent::__construct();
+ }
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2019-02-19
+ */
+class PostInput extends \dokuwiki\Input\Post {
+ /**
+ * @inheritdoc
+ * @deprecated 2019-02-19
+ */
+ public function __construct()
+ {
+ dbg_deprecated(\dokuwiki\Input\Post::class);
+ parent::__construct();
+ }
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2019-02-19
+ */
+class GetInput extends \dokuwiki\Input\Get {
+ /**
+ * @inheritdoc
+ * @deprecated 2019-02-19
+ */
+ public function __construct()
+ {
+ dbg_deprecated(\dokuwiki\Input\Get::class);
+ parent::__construct();
+ }
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2019-02-19
+ */
+class ServerInput extends \dokuwiki\Input\Server {
+ /**
+ * @inheritdoc
+ * @deprecated 2019-02-19
+ */
+ public function __construct()
+ {
+ dbg_deprecated(\dokuwiki\Input\Server::class);
+ parent::__construct();
+ }
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2019-03-06
+ */
+class PassHash extends \dokuwiki\PassHash {
+ /**
+ * @inheritdoc
+ * @deprecated 2019-03-06
+ */
+ public function __construct()
+ {
+ dbg_deprecated(\dokuwiki\PassHash::class);
+ }
+}
+
+/**
+ * @deprecated since 2019-03-17 use \dokuwiki\HTTP\HTTPClientException instead!
+ */
+class HTTPClientException extends \dokuwiki\HTTP\HTTPClientException {
+
+ /**
+ * @inheritdoc
+ * @deprecated 2019-03-17
+ */
+ public function __construct($message = '', $code = 0, $previous = null)
+ {
+ DebugHelper::dbgDeprecatedFunction(dokuwiki\HTTP\HTTPClientException::class);
+ parent::__construct($message, $code, $previous);
+ }
+}
+
+/**
+ * @deprecated since 2019-03-17 use \dokuwiki\HTTP\HTTPClient instead!
+ */
+class HTTPClient extends \dokuwiki\HTTP\HTTPClient {
+
+ /**
+ * @inheritdoc
+ * @deprecated 2019-03-17
+ */
+ public function __construct()
+ {
+ DebugHelper::dbgDeprecatedFunction(dokuwiki\HTTP\HTTPClient::class);
+ parent::__construct();
+ }
+}
+
+/**
+ * @deprecated since 2019-03-17 use \dokuwiki\HTTP\DokuHTTPClient instead!
+ */
+class DokuHTTPClient extends \dokuwiki\HTTP\DokuHTTPClient
+{
+
+ /**
+ * @inheritdoc
+ * @deprecated 2019-03-17
+ */
+ public function __construct()
+ {
+ DebugHelper::dbgDeprecatedFunction(dokuwiki\HTTP\DokuHTTPClient::class);
+ parent::__construct();
+ }
+}
+
+/**
+ * function wrapper to process (create, trigger and destroy) an event
+ *
+ * @param string $name name for the event
+ * @param mixed $data event data
+ * @param callback $action (optional, default=NULL) default action, a php callback function
+ * @param bool $canPreventDefault (optional, default=true) can hooks prevent the default action
+ *
+ * @return mixed the event results value after all event processing is complete
+ * by default this is the return value of the default action however
+ * it can be set or modified by event handler hooks
+ * @deprecated 2018-06-15
+ */
+function trigger_event($name, &$data, $action=null, $canPreventDefault=true) {
+ dbg_deprecated('\dokuwiki\Extension\Event::createAndTrigger');
+ return \dokuwiki\Extension\Event::createAndTrigger($name, $data, $action, $canPreventDefault);
+}
+
+/**
+ * @inheritdoc
+ * @deprecated 2018-06-15
+ */
+class Doku_Plugin_Controller extends \dokuwiki\Extension\PluginController {
+ /** @inheritdoc */
+ public function __construct()
+ {
+ dbg_deprecated(\dokuwiki\Extension\PluginController::class);
+ parent::__construct();
+ }
+}
+
+
+/**
+ * Class for handling (email) subscriptions
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @deprecated 2019-04-22 Use the classes in the \dokuwiki\Subscriptions namespace instead!
+ */
+class Subscription {
+
+ /**
+ * Check if subscription system is enabled
+ *
+ * @return bool
+ *
+ * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::isenabled
+ */
+ public function isenabled() {
+ DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::isenabled');
+ $subscriberManager = new SubscriberManager();
+ return $subscriberManager->isenabled();
+ }
+
+ /**
+ * Recursively search for matching subscriptions
+ *
+ * This function searches all relevant subscription files for a page or
+ * namespace.
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ * @param string $page The target object’s (namespace or page) id
+ * @param string|array $user
+ * @param string|array $style
+ * @param string|array $data
+ * @return array
+ *
+ * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::subscribers
+ */
+ public function subscribers($page, $user = null, $style = null, $data = null) {
+ DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::subscribers');
+ $manager = new SubscriberManager();
+ return $manager->subscribers($page, $user, $style, $data);
+ }
+
+ /**
+ * Adds a new subscription for the given page or namespace
+ *
+ * This will automatically overwrite any existent subscription for the given user on this
+ * *exact* page or namespace. It will *not* modify any subscription that may exist in higher namespaces.
+ *
+ * @param string $id The target page or namespace, specified by id; Namespaces
+ * are identified by appending a colon.
+ * @param string $user
+ * @param string $style
+ * @param string $data
+ * @throws Exception when user or style is empty
+ * @return bool
+ *
+ * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::add
+ */
+ public function add($id, $user, $style, $data = '') {
+ DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::add');
+ $manager = new SubscriberManager();
+ return $manager->add($id, $user, $style, $data);
+ }
+
+ /**
+ * Removes a subscription for the given page or namespace
+ *
+ * This removes all subscriptions matching the given criteria on the given page or
+ * namespace. It will *not* modify any subscriptions that may exist in higher
+ * namespaces.
+ *
+ * @param string $id The target object’s (namespace or page) id
+ * @param string|array $user
+ * @param string|array $style
+ * @param string|array $data
+ * @return bool
+ *
+ * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::remove
+ */
+ public function remove($id, $user = null, $style = null, $data = null) {
+ DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::remove');
+ $manager = new SubscriberManager();
+ return $manager->remove($id, $user, $style, $data);
+ }
+
+ /**
+ * Get data for $INFO['subscribed']
+ *
+ * $INFO['subscribed'] is either false if no subscription for the current page
+ * and user is in effect. Else it contains an array of arrays with the fields
+ * “target”, “style”, and optionally “data”.
+ *
+ * @param string $id Page ID, defaults to global $ID
+ * @param string $user User, defaults to $_SERVER['REMOTE_USER']
+ * @return array|false
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::userSubscription
+ */
+ public function user_subscription($id = '', $user = '') {
+ DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::userSubscription');
+ $manager = new SubscriberManager();
+ return $manager->userSubscription($id, $user);
+ }
+
+ /**
+ * Send digest and list subscriptions
+ *
+ * This sends mails to all subscribers that have a subscription for namespaces above
+ * the given page if the needed $conf['subscribe_time'] has passed already.
+ *
+ * This function is called form lib/exe/indexer.php
+ *
+ * @param string $page
+ * @return int number of sent mails
+ *
+ * @deprecated 2019-04-20 \dokuwiki\Subscriptions\BulkSubscriptionSender::sendBulk
+ */
+ public function send_bulk($page) {
+ DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\BulkSubscriptionSender::sendBulk');
+ $subscriptionSender = new BulkSubscriptionSender();
+ return $subscriptionSender->sendBulk($page);
+ }
+
+ /**
+ * Send the diff for some page change
+ *
+ * @param string $subscriber_mail The target mail address
+ * @param string $template Mail template ('subscr_digest', 'subscr_single', 'mailtext', ...)
+ * @param string $id Page for which the notification is
+ * @param int|null $rev Old revision if any
+ * @param string $summary Change summary if any
+ * @return bool true if successfully sent
+ *
+ * @deprecated 2019-04-20 \dokuwiki\Subscriptions\PageSubscriptionSender::sendPageDiff
+ */
+ public function send_diff($subscriber_mail, $template, $id, $rev = null, $summary = '') {
+ DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\PageSubscriptionSender::sendPageDiff');
+ $subscriptionSender = new PageSubscriptionSender();
+ return $subscriptionSender->sendPageDiff($subscriber_mail, $template, $id, $rev, $summary);
+ }
+
+ /**
+ * Send the diff for some media change
+ *
+ * @fixme this should embed thumbnails of images in HTML version
+ *
+ * @param string $subscriber_mail The target mail address
+ * @param string $template Mail template ('uploadmail', ...)
+ * @param string $id Media file for which the notification is
+ * @param int|bool $rev Old revision if any
+ *
+ * @deprecated 2019-04-20 \dokuwiki\Subscriptions\MediaSubscriptionSender::sendMediaDiff
+ */
+ public function send_media_diff($subscriber_mail, $template, $id, $rev = false) {
+ DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\MediaSubscriptionSender::sendMediaDiff');
+ $subscriptionSender = new MediaSubscriptionSender();
+ return $subscriptionSender->sendMediaDiff($subscriber_mail, $template, $id, $rev);
+ }
+
+ /**
+ * Send a notify mail on new registration
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param string $login login name of the new user
+ * @param string $fullname full name of the new user
+ * @param string $email email address of the new user
+ * @return bool true if a mail was sent
+ *
+ * @deprecated 2019-04-20 \dokuwiki\Subscriptions\RegistrationSubscriptionSender::sendRegister
+ */
+ public function send_register($login, $fullname, $email) {
+ DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\RegistrationSubscriptionSender::sendRegister');
+ $subscriptionSender = new RegistrationSubscriptionSender();
+ return $subscriptionSender->sendRegister($login, $fullname, $email);
+ }
+
+
+ /**
+ * Default callback for COMMON_NOTIFY_ADDRESSLIST
+ *
+ * Aggregates all email addresses of user who have subscribed the given page with 'every' style
+ *
+ * @author Steven Danz <steven-danz@kc.rr.com>
+ * @author Adrian Lang <lang@cosmocode.de>
+ *
+ * @todo move the whole functionality into this class, trigger SUBSCRIPTION_NOTIFY_ADDRESSLIST instead,
+ * use an array for the addresses within it
+ *
+ * @param array &$data Containing the entries:
+ * - $id (the page id),
+ * - $self (whether the author should be notified,
+ * - $addresslist (current email address list)
+ * - $replacements (array of additional string substitutions, @KEY@ to be replaced by value)
+ *
+ * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::notifyAddresses
+ */
+ public function notifyaddresses(&$data) {
+ DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::notifyAddresses');
+ $manager = new SubscriberManager();
+ $manager->notifyAddresses($data);
+ }
+}
+
+/**
+ * @deprecated 2019-12-29 use \dokuwiki\Search\Indexer
+ */
+class Doku_Indexer extends \dokuwiki\Search\Indexer {};
diff --git a/inc/events.php b/inc/events.php
deleted file mode 100644
index 034414f88..000000000
--- a/inc/events.php
+++ /dev/null
@@ -1,257 +0,0 @@
-<?php
-/**
- * DokuWiki Events
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Christopher Smith <chris@jalakai.co.uk>
- */
-
-if(!defined('DOKU_INC')) die('meh.');
-
-/**
- * The event
- */
-class Doku_Event {
-
- // public properties
- public $name = ''; // READONLY event name, objects must register against this name to see the event
- public $data = null; // READWRITE data relevant to the event, no standardised format (YET!)
- public $result = null; // READWRITE the results of the event action, only relevant in "_AFTER" advise
- // event handlers may modify this if they are preventing the default action
- // to provide the after event handlers with event results
- public $canPreventDefault = true; // READONLY if true, event handlers can prevent the events default action
-
- // private properties, event handlers can effect these through the provided methods
- protected $_default = true; // whether or not to carry out the default action associated with the event
- protected $_continue = true; // whether or not to continue propagating the event to other handlers
-
- /**
- * event constructor
- *
- * @param string $name
- * @param mixed $data
- */
- function __construct($name, &$data) {
-
- $this->name = $name;
- $this->data =& $data;
-
- }
-
- /**
- * @return string
- */
- function __toString() {
- return $this->name;
- }
-
- /**
- * advise functions
- *
- * advise all registered handlers of this event
- *
- * if these methods are used by functions outside of this object, they must
- * properly handle correct processing of any default action and issue an
- * advise_after() signal. e.g.
- * $evt = new Doku_Event(name, data);
- * if ($evt->advise_before(canPreventDefault) {
- * // default action code block
- * }
- * $evt->advise_after();
- * unset($evt);
- *
- * @param bool $enablePreventDefault
- * @return bool results of processing the event, usually $this->_default
- */
- function advise_before($enablePreventDefault=true) {
- global $EVENT_HANDLER;
-
- $this->canPreventDefault = $enablePreventDefault;
- $EVENT_HANDLER->process_event($this,'BEFORE');
-
- return (!$enablePreventDefault || $this->_default);
- }
-
- function advise_after() {
- global $EVENT_HANDLER;
-
- $this->_continue = true;
- $EVENT_HANDLER->process_event($this,'AFTER');
- }
-
- /**
- * trigger
- *
- * - advise all registered (<event>_BEFORE) handlers that this event is about to take place
- * - carry out the default action using $this->data based on $enablePrevent and
- * $this->_default, all of which may have been modified by the event handlers.
- * - advise all registered (<event>_AFTER) handlers that the event has taken place
- *
- * @param null|callable $action
- * @param bool $enablePrevent
- * @return mixed $event->results
- * the value set by any <event>_before or <event> handlers if the default action is prevented
- * or the results of the default action (as modified by <event>_after handlers)
- * or NULL no action took place and no handler modified the value
- */
- function trigger($action=null, $enablePrevent=true) {
-
- if (!is_callable($action)) {
- $enablePrevent = false;
- if (!is_null($action)) {
- trigger_error('The default action of '.$this.' is not null but also not callable. Maybe the method is not public?', E_USER_WARNING);
- }
- }
-
- if ($this->advise_before($enablePrevent) && is_callable($action)) {
- if (is_array($action)) {
- list($obj,$method) = $action;
- $this->result = $obj->$method($this->data);
- } else {
- $this->result = $action($this->data);
- }
- }
-
- $this->advise_after();
-
- return $this->result;
- }
-
- /**
- * stopPropagation
- *
- * stop any further processing of the event by event handlers
- * this function does not prevent the default action taking place
- */
- public function stopPropagation() {
- $this->_continue = false;
- }
-
- /**
- * may the event propagate to the next handler?
- *
- * @return bool
- */
- public function mayPropagate() {
- return $this->_continue;
- }
-
- /**
- * preventDefault
- *
- * prevent the default action taking place
- */
- public function preventDefault() {
- $this->_default = false;
- }
-
- /**
- * should the default action be executed?
- *
- * @return bool
- */
- public function mayRunDefault() {
- return $this->_default;
- }
-}
-
-/**
- * Controls the registration and execution of all events,
- */
-class Doku_Event_Handler {
-
- // public properties: none
-
- // private properties
- protected $_hooks = array(); // array of events and their registered handlers
-
- /**
- * event_handler
- *
- * constructor, loads all action plugins and calls their register() method giving them
- * an opportunity to register any hooks they require
- */
- function __construct() {
-
- // load action plugins
- /** @var DokuWiki_Action_Plugin $plugin */
- $plugin = null;
- $pluginlist = plugin_list('action');
-
- foreach ($pluginlist as $plugin_name) {
- $plugin = plugin_load('action',$plugin_name);
-
- if ($plugin !== null) $plugin->register($this);
- }
- }
-
- /**
- * register_hook
- *
- * register a hook for an event
- *
- * @param string $event string name used by the event, (incl '_before' or '_after' for triggers)
- * @param string $advise
- * @param object $obj object in whose scope method is to be executed,
- * if NULL, method is assumed to be a globally available function
- * @param string $method event handler function
- * @param mixed $param data passed to the event handler
- * @param int $seq sequence number for ordering hook execution (ascending)
- */
- function register_hook($event, $advise, $obj, $method, $param=null, $seq=0) {
- $seq = (int)$seq;
- $doSort = !isset($this->_hooks[$event.'_'.$advise][$seq]);
- $this->_hooks[$event.'_'.$advise][$seq][] = array($obj, $method, $param);
-
- if ($doSort) {
- ksort($this->_hooks[$event.'_'.$advise]);
- }
- }
-
- /**
- * process the before/after event
- *
- * @param Doku_Event $event
- * @param string $advise BEFORE or AFTER
- */
- function process_event($event,$advise='') {
-
- $evt_name = $event->name . ($advise ? '_'.$advise : '_BEFORE');
-
- if (!empty($this->_hooks[$evt_name])) {
- foreach ($this->_hooks[$evt_name] as $sequenced_hooks) {
- foreach ($sequenced_hooks as $hook) {
- list($obj, $method, $param) = $hook;
-
- if (is_null($obj)) {
- $method($event, $param);
- } else {
- $obj->$method($event, $param);
- }
-
- if (!$event->mayPropagate()) return;
- }
- }
- }
- }
-}
-
-/**
- * trigger_event
- *
- * function wrapper to process (create, trigger and destroy) an event
- *
- * @param string $name name for the event
- * @param mixed $data event data
- * @param callback $action (optional, default=NULL) default action, a php callback function
- * @param bool $canPreventDefault (optional, default=true) can hooks prevent the default action
- *
- * @return mixed the event results value after all event processing is complete
- * by default this is the return value of the default action however
- * it can be set or modified by event handler hooks
- */
-function trigger_event($name, &$data, $action=null, $canPreventDefault=true) {
-
- $evt = new Doku_Event($name, $data);
- return $evt->trigger($action, $canPreventDefault);
-}
diff --git a/inc/farm.php b/inc/farm.php
index 0cd9d4f9c..03aa0eb30 100644
--- a/inc/farm.php
+++ b/inc/farm.php
@@ -22,7 +22,7 @@
* @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)
+// DOKU_FARMDIR needs to be set in preload.php, 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);
diff --git a/inc/fetch.functions.php b/inc/fetch.functions.php
index b8e75eaec..63672629d 100644
--- a/inc/fetch.functions.php
+++ b/inc/fetch.functions.php
@@ -68,10 +68,14 @@ function sendFile($file, $mime, $dl, $cache, $public = false, $orig = null) {
}
//download or display?
- if($dl) {
- header('Content-Disposition: attachment;'.rfc2231_encode('filename', utf8_basename($orig)).';');
+ if ($dl) {
+ header('Content-Disposition: attachment;' . rfc2231_encode(
+ 'filename', \dokuwiki\Utf8\PhpString::basename($orig)) . ';'
+ );
} else {
- header('Content-Disposition: inline;'.rfc2231_encode('filename', utf8_basename($orig)).';');
+ header('Content-Disposition: inline;' . rfc2231_encode(
+ 'filename', \dokuwiki\Utf8\PhpString::basename($orig)) . ';'
+ );
}
//use x-sendfile header to pass the delivery to compatible webservers
@@ -104,7 +108,13 @@ function sendFile($file, $mime, $dl, $cache, $public = false, $orig = null) {
* @return string in the format " name*=charset'lang'value" for values WITH special characters
*/
function rfc2231_encode($name, $value, $charset='utf-8', $lang='en') {
- $internal = preg_replace_callback('/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/', function($match) { return rawurlencode($match[0]); }, $value);
+ $internal = preg_replace_callback(
+ '/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/',
+ function ($match) {
+ return rawurlencode($match[0]);
+ },
+ $value
+ );
if ( $value != $internal ) {
return ' '.$name.'*='.$charset."'".$lang."'".$internal;
} else {
diff --git a/inc/form.php b/inc/form.php
index 7afb0ba30..7a4d737a0 100644
--- a/inc/form.php
+++ b/inc/form.php
@@ -6,7 +6,9 @@
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
+// phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
+// phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore
+
/**
* Class for creating simple HTML forms.
@@ -23,6 +25,11 @@ if(!defined('DOKU_INC')) die('meh.');
*
* See the form_make* functions later in this file.
*
+ * Please note that even though this class is technically deprecated (use dokuwiki\Form instead),
+ * it is still widely used in the core and the related form events. Until those have been rewritten,
+ * this will continue to be used
+ *
+ * @deprecated 2019-07-14
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
class Doku_Form {
@@ -55,7 +62,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function __construct($params, $action=false, $method=false, $enctype=false) {
+ public function __construct($params, $action=false, $method=false, $enctype=false) {
if(!is_array($params)) {
$this->params = array('id' => $params);
if ($action !== false) $this->params['action'] = $action;
@@ -88,7 +95,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function startFieldset($legend) {
+ public function startFieldset($legend) {
if ($this->_infieldset) {
$this->addElement(array('_elem'=>'closefieldset'));
}
@@ -101,7 +108,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function endFieldset() {
+ public function endFieldset() {
if ($this->_infieldset) {
$this->addElement(array('_elem'=>'closefieldset'));
}
@@ -120,7 +127,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function addHidden($name, $value) {
+ public function addHidden($name, $value) {
if (is_null($value))
unset($this->_hidden[$name]);
else
@@ -138,7 +145,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function addElement($elem) {
+ public function addElement($elem) {
$this->_content[] = $elem;
}
@@ -152,7 +159,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function insertElement($pos, $elem) {
+ public function insertElement($pos, $elem) {
array_splice($this->_content, $pos, 0, array($elem));
}
@@ -166,7 +173,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function replaceElement($pos, $elem) {
+ public function replaceElement($pos, $elem) {
$rep = array();
if (!is_null($elem)) $rep[] = $elem;
array_splice($this->_content, $pos, 1, $rep);
@@ -182,7 +189,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function findElementByType($type) {
+ public function findElementByType($type) {
foreach ($this->_content as $pos=>$elem) {
if (is_array($elem) && $elem['_elem'] == $type)
return $pos;
@@ -200,7 +207,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function findElementById($id) {
+ public function findElementById($id) {
foreach ($this->_content as $pos=>$elem) {
if (is_array($elem) && isset($elem['id']) && $elem['id'] == $id)
return $pos;
@@ -219,7 +226,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function findElementByAttribute($name, $value) {
+ public function findElementByAttribute($name, $value) {
foreach ($this->_content as $pos=>$elem) {
if (is_array($elem) && isset($elem[$name]) && $elem[$name] == $value)
return $pos;
@@ -239,7 +246,7 @@ class Doku_Form {
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
- function &getElementAt($pos) {
+ public function &getElementAt($pos) {
if ($pos < 0) $pos = count($this->_content) + $pos;
if ($pos < 0) $pos = 0;
if ($pos >= count($this->_content)) $pos = count($this->_content) - 1;
@@ -256,7 +263,7 @@ class Doku_Form {
*
* @return string html of the form
*/
- function getForm() {
+ public function getForm() {
global $lang;
$form = '';
$this->params['accept-charset'] = $lang['encoding'];
@@ -286,7 +293,7 @@ class Doku_Form {
*
* wraps around getForm()
*/
- function printForm(){
+ public function printForm(){
echo $this->getForm();
}
@@ -302,7 +309,7 @@ class Doku_Form {
* @author Adrian Lang <lang@cosmocode.de>
*/
- function addRadioSet($name, $entries) {
+ public function addRadioSet($name, $entries) {
global $INPUT;
$value = (array_key_exists($INPUT->post->str($name), $entries)) ?
$INPUT->str($name) : key($entries);
diff --git a/inc/fulltext.php b/inc/fulltext.php
index dba11d0e4..670f048d3 100644
--- a/inc/fulltext.php
+++ b/inc/fulltext.php
@@ -6,7 +6,7 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
+use dokuwiki\Extension\Event;
/**
* create snippets for the first few results only
@@ -23,8 +23,8 @@ if(!defined('FT_SNIPPET_NUMBER')) define('FT_SNIPPET_NUMBER',15);
* @param string $query
* @param array $highlight
* @param string $sort
- * @param int|string $after only show results with an modified time after this date, accepts timestap or strtotime arguments
- * @param int|string $before only show results with an modified time before this date, accepts timestap or strtotime arguments
+ * @param int|string $after only show results with mtime after this date, accepts timestap or strtotime arguments
+ * @param int|string $before only show results with mtime before this date, accepts timestap or strtotime arguments
*
* @return array
*/
@@ -41,7 +41,7 @@ function ft_pageSearch($query,&$highlight, $sort = null, $after = null, $before
];
$data['highlight'] =& $highlight;
- return trigger_event('SEARCH_QUERY_FULLPAGE', $data, '_ft_pageSearch');
+ return Event::createAndTrigger('SEARCH_QUERY_FULLPAGE', $data, '_ft_pageSearch');
}
/**
@@ -95,9 +95,9 @@ function _ft_pageSearch(&$data) {
'phrase' => $phrase,
'text' => rawWiki($id)
);
- $evt = new Doku_Event('FULLTEXT_PHRASE_MATCH',$evdata);
+ $evt = new Event('FULLTEXT_PHRASE_MATCH',$evdata);
if ($evt->advise_before() && $evt->result !== true) {
- $text = utf8_strtolower($evdata['text']);
+ $text = \dokuwiki\Utf8\PhpString::strtolower($evdata['text']);
if (strpos($text, $phrase) !== false) {
$evt->result = true;
}
@@ -232,8 +232,8 @@ function ft_mediause($id, $ignore_perms = false){
* @param string $id page id
* @param bool $in_ns match against namespace as well?
* @param bool $in_title search in title?
- * @param int|string $after only show results with an modified time after this date, accepts timestap or strtotime arguments
- * @param int|string $before only show results with an modified time before this date, accepts timestap or strtotime arguments
+ * @param int|string $after only show results with mtime after this date, accepts timestap or strtotime arguments
+ * @param int|string $before only show results with mtime before this date, accepts timestap or strtotime arguments
*
* @return string[]
*/
@@ -246,7 +246,7 @@ function ft_pageLookup($id, $in_ns=false, $in_title=false, $after = null, $befor
'before' => $before
];
$data['has_titles'] = true; // for plugin backward compatibility check
- return trigger_event('SEARCH_QUERY_PAGELOOKUP', $data, '_ft_pageLookup');
+ return Event::createAndTrigger('SEARCH_QUERY_PAGELOOKUP', $data, '_ft_pageLookup');
}
/**
@@ -315,8 +315,8 @@ function _ft_pageLookup(&$data){
/**
* @param array $results search results in the form pageid => value
- * @param int|string $after only returns results with an modified time after this date, accepts timestap or strtotime arguments
- * @param int|string $before only returns results with an modified time after this date, accepts timestap or strtotime arguments
+ * @param int|string $after only returns results with mtime after this date, accepts timestap or strtotime arguments
+ * @param int|string $before only returns results with mtime after this date, accepts timestap or strtotime arguments
*
* @return array
*/
@@ -407,15 +407,26 @@ function ft_snippet($id,$highlight){
'snippet' => '',
);
- $evt = new Doku_Event('FULLTEXT_SNIPPET_CREATE',$evdata);
+ $evt = new Event('FULLTEXT_SNIPPET_CREATE',$evdata);
if ($evt->advise_before()) {
$match = array();
$snippets = array();
$utf8_offset = $offset = $end = 0;
- $len = utf8_strlen($text);
+ $len = \dokuwiki\Utf8\PhpString::strlen($text);
// build a regexp from the phrases to highlight
- $re1 = '('.join('|',array_map('ft_snippet_re_preprocess', array_map('preg_quote_cb',array_filter((array) $highlight)))).')';
+ $re1 = '(' .
+ join(
+ '|',
+ array_map(
+ 'ft_snippet_re_preprocess',
+ array_map(
+ 'preg_quote_cb',
+ array_filter((array) $highlight)
+ )
+ )
+ ) .
+ ')';
$re2 = "$re1.{0,75}(?!\\1)$re1";
$re3 = "$re1.{0,45}(?!\\1)$re1.{0,45}(?!\\1)(?!\\2)$re1";
@@ -431,8 +442,8 @@ function ft_snippet($id,$highlight){
list($str,$idx) = $match[0];
// convert $idx (a byte offset) into a utf8 character offset
- $utf8_idx = utf8_strlen(substr($text,0,$idx));
- $utf8_len = utf8_strlen($str);
+ $utf8_idx = \dokuwiki\Utf8\PhpString::strlen(substr($text,0,$idx));
+ $utf8_len = \dokuwiki\Utf8\PhpString::strlen($str);
// establish context, 100 bytes surrounding the match string
// first look to see if we can go 100 either side,
@@ -461,9 +472,9 @@ function ft_snippet($id,$highlight){
$end = $utf8_idx + $utf8_len + $post; // now set it to the end of this context
if ($append) {
- $snippets[count($snippets)-1] .= utf8_substr($text,$append,$end-$append);
+ $snippets[count($snippets)-1] .= \dokuwiki\Utf8\PhpString::substr($text,$append,$end-$append);
} else {
- $snippets[] = utf8_substr($text,$start,$end-$start);
+ $snippets[] = \dokuwiki\Utf8\PhpString::substr($text,$start,$end-$start);
}
// set $offset for next match attempt
@@ -472,13 +483,17 @@ function ft_snippet($id,$highlight){
// this prevents further matching of this snippet but for possible matches of length
// smaller than match length + context (at least 50 characters) this match is part of the context
$utf8_offset = $utf8_idx + $utf8_len;
- $offset = $idx + strlen(utf8_substr($text,$utf8_idx,$utf8_len));
- $offset = utf8_correctIdx($text,$offset);
+ $offset = $idx + strlen(\dokuwiki\Utf8\PhpString::substr($text,$utf8_idx,$utf8_len));
+ $offset = \dokuwiki\Utf8\Clean::correctIdx($text,$offset);
}
$m = "\1";
$snippets = preg_replace('/'.$re1.'/iu',$m.'$1'.$m,$snippets);
- $snippet = preg_replace('/'.$m.'([^'.$m.']*?)'.$m.'/iu','<strong class="search_hit">$1</strong>',hsc(join('... ',$snippets)));
+ $snippet = preg_replace(
+ '/' . $m . '([^' . $m . ']*?)' . $m . '/iu',
+ '<strong class="search_hit">$1</strong>',
+ hsc(join('... ', $snippets))
+ );
$evdata['snippet'] = $snippet;
}
@@ -496,9 +511,7 @@ function ft_snippet($id,$highlight){
*/
function ft_snippet_re_preprocess($term) {
// do not process asian terms where word boundaries are not explicit
- if(preg_match('/'.IDX_ASIAN.'/u',$term)){
- return $term;
- }
+ if(\dokuwiki\Utf8\Asian::isAsianWords($term)) return $term;
if (UTF8_PROPERTYSUPPORT) {
// unicode word boundaries
@@ -616,8 +629,8 @@ function ft_resultComplement($args) {
* @author Andreas Gohr <andi@splitbrain.org>
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
*
- * @param Doku_Indexer $Indexer
- * @param string $query search query
+ * @param dokuwiki\Search\Indexer $Indexer
+ * @param string $query search query
* @return array of search formulas
*/
function ft_queryParser($Indexer, $query){
@@ -659,7 +672,8 @@ function ft_queryParser($Indexer, $query){
*/
$parsed_query = '';
$parens_level = 0;
- $terms = preg_split('/(-?".*?")/u', utf8_strtolower($query), -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+ $terms = preg_split('/(-?".*?")/u', \dokuwiki\Utf8\PhpString::strtolower($query),
+ -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
foreach ($terms as $term) {
$parsed = '';
@@ -850,19 +864,19 @@ function ft_queryParser($Indexer, $query){
*
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
*
- * @param Doku_Indexer $Indexer
- * @param string $term
- * @param bool $consider_asian
- * @param bool $phrase_mode
+ * @param dokuwiki\Search\Indexer $Indexer
+ * @param string $term
+ * @param bool $consider_asian
+ * @param bool $phrase_mode
* @return string
*/
function ft_termParser($Indexer, $term, $consider_asian = true, $phrase_mode = false) {
$parsed = '';
if ($consider_asian) {
// successive asian characters need to be searched as a phrase
- $words = preg_split('/('.IDX_ASIAN.'+)/u', $term, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+ $words = \dokuwiki\Utf8\Asian::splitAsianWords($term);
foreach ($words as $word) {
- $phrase_mode = $phrase_mode ? true : preg_match('/'.IDX_ASIAN.'/u', $word);
+ $phrase_mode = $phrase_mode ? true : \dokuwiki\Utf8\Asian::isAsianWords($word);
$parsed .= ft_termParser($Indexer, $word, false, $phrase_mode);
}
} else {
diff --git a/inc/html.php b/inc/html.php
index 7bd38ebda..1f494d46b 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -6,8 +6,11 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
-if(!defined('NL')) define('NL',"\n");
+use dokuwiki\ChangeLog\MediaChangeLog;
+use dokuwiki\ChangeLog\PageChangeLog;
+use dokuwiki\Extension\AuthPlugin;
+use dokuwiki\Extension\Event;
+
if (!defined('SEC_EDIT_PATTERN')) {
define('SEC_EDIT_PATTERN', '#<!-- EDIT({.*?}) -->#');
}
@@ -47,11 +50,17 @@ function html_login($svg = false){
print p_locale_xhtml('login');
print '<div class="centeralign">'.NL;
- $form = new Doku_Form(array('id' => 'dw__login'));
+ $form = new Doku_Form(array('id' => 'dw__login', 'action'=>wl($ID)));
$form->startFieldset($lang['btn_login']);
$form->addHidden('id', $ID);
$form->addHidden('do', 'login');
- $form->addElement(form_makeTextField('u', ((!$INPUT->bool('http_credentials')) ? $INPUT->str('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'));
@@ -82,7 +91,7 @@ function html_login($svg = false){
function html_denied() {
print p_locale_xhtml('denied');
- if(empty($_SERVER['REMOTE_USER'])){
+ if(empty($_SERVER['REMOTE_USER']) && actionOK('login')){
html_login();
}
}
@@ -99,7 +108,7 @@ function html_denied() {
function html_secedit($text,$show=true){
global $INFO;
- if(!$INFO['writable'] || !$show || $INFO['rev']){
+ if((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $INFO['rev'])){
return preg_replace(SEC_EDIT_PATTERN,'',$text);
}
@@ -126,7 +135,7 @@ function html_secedit_button($matches){
$data ['target'] = strtolower($data['target']);
$data ['hid'] = strtolower($data['hid']);
- return trigger_event('HTML_SECEDIT_BUTTON', $data,
+ return Event::createAndTrigger('HTML_SECEDIT_BUTTON', $data,
'html_secedit_get_button');
}
@@ -170,7 +179,10 @@ function html_secedit_get_button($data) {
function html_topbtn(){
global $lang;
- $ret = '<a class="nolink" href="#dokuwiki__top"><button class="button" onclick="window.scrollTo(0, 0)" title="'.$lang['btn_top'].'">'.$lang['btn_top'].'</button></a>';
+ $ret = '<a class="nolink" href="#dokuwiki__top">' .
+ '<button class="button" onclick="window.scrollTo(0, 0)" title="' . $lang['btn_top'] . '">' .
+ $lang['btn_top'] .
+ '</button></a>';
return $ret;
}
@@ -288,7 +300,7 @@ function html_show($txt=null){
}else{
if ($REV||$DATE_AT){
$data = array('rev' => &$REV, 'date_at' => &$DATE_AT);
- trigger_event('HTML_SHOWREV_OUTPUT', $data, 'html_showrev');
+ Event::createAndTrigger('HTML_SHOWREV_OUTPUT', $data, 'html_showrev');
}
$html = p_wiki_xhtml($ID,$REV,true,$DATE_AT);
$html = html_secedit($html,$secedit);
@@ -307,17 +319,17 @@ function html_draft(){
global $INFO;
global $ID;
global $lang;
- $draft = unserialize(io_readFile($INFO['draft'],false));
- $text = cleanText(con($draft['prefix'],$draft['text'],$draft['suffix'],true));
+ $draft = new \dokuwiki\Draft($ID, $INFO['client']);
+ $text = $draft->getDraftText();
print p_locale_xhtml('draft');
html_diff($text, false);
$form = new Doku_Form(array('id' => 'dw__editform'));
$form->addHidden('id', $ID);
- $form->addHidden('date', $draft['date']);
+ $form->addHidden('date', $draft->getDraftDate());
$form->addHidden('wikitext', $text);
$form->addElement(form_makeOpenTag('div', array('id'=>'draft__status')));
- $form->addElement($lang['draftdate'].' '. dformat(filemtime($INFO['draft'])));
+ $form->addElement($draft->getDraftMessage());
$form->addElement(form_makeCloseTag('div'));
$form->addElement(form_makeButton('submit', 'recover', $lang['btn_recover'], array('tabindex'=>'1')));
$form->addElement(form_makeButton('submit', 'draftdel', $lang['btn_draftdel'], array('tabindex'=>'2')));
@@ -343,7 +355,7 @@ function html_hilight($html,$phrases){
$regex = join('|',$phrases);
if ($regex === '') return $html;
- if (!utf8_check($regex)) return $html;
+ if (!\dokuwiki\Utf8\Clean::isUtf8($regex)) return $html;
$html = @preg_replace_callback("/((<[^>]*)|$regex)/ui",'html_hilight_callback',$html);
return $html;
}
@@ -690,10 +702,12 @@ function html_recent($first = 0, $show_changes = 'both') {
print p_locale_xhtml('recent');
if(getNS($ID) != '') {
- print '<div class="level1"><p>' . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) . '</p></div>';
+ 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', 'class' => 'changes'));
+ $form = new Doku_Form(array('id' => 'dw__recent', 'method' => 'GET', 'class' => 'changes', 'action'=>wl($ID)));
$form->addHidden('sectok', null);
$form->addHidden('do', 'recent');
$form->addHidden('id', $ID);
@@ -773,7 +787,14 @@ function html_recent($first = 0, $show_changes = 'both') {
}
if(!empty($recent['media'])) {
- $href = media_managerURL(array('tab_details' => 'history', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&');
+ $href = media_managerURL(
+ array(
+ 'tab_details' => 'history',
+ 'image' => $recent['id'],
+ 'ns' => getNS($recent['id'])
+ ),
+ '&'
+ );
} else {
$href = wl($recent['id'], "do=revisions", false, '&');
}
@@ -790,7 +811,14 @@ function html_recent($first = 0, $show_changes = 'both') {
$form->addElement(form_makeCloseTag('a'));
if(!empty($recent['media'])) {
- $href = media_managerURL(array('tab_details' => 'view', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&');
+ $href = media_managerURL(
+ array(
+ 'tab_details' => 'view',
+ 'image' => $recent['id'],
+ 'ns' => getNS($recent['id'])
+ ),
+ '&'
+ );
$class = file_exists(mediaFN($recent['id'])) ? 'wikilink1' : 'wikilink2';
$form->addElement(form_makeOpenTag('a', array(
'class' => $class,
@@ -897,14 +925,15 @@ function html_list_index($item){
global $ID, $conf;
// prevent searchbots needlessly following links
- $nofollow = ($ID != $conf['start'] || $conf['sitemap']) ? ' rel="nofollow"' : '';
+ $nofollow = ($ID != $conf['start'] || $conf['sitemap']) ? 'rel="nofollow"' : '';
$ret = '';
$base = ':'.$item['id'];
$base = substr($base,strrpos($base,':')+1);
if($item['type']=='d'){
// FS#2766, no need for search bots to follow namespace links in the index
- $ret .= '<a href="'.wl($ID,'idx='.rawurlencode($item['id'])).'" title="' . $item['id'] . '" class="idx_dir"' . $nofollow . '><strong>';
+ $link = wl($ID, 'idx=' . rawurlencode($item['id']));
+ $ret .= '<a href="' . $link . '" title="' . $item['id'] . '" class="idx_dir" ' . $nofollow . '><strong>';
$ret .= $base;
$ret .= '</strong></a>';
}else{
@@ -935,7 +964,7 @@ function html_li_index($item){
if($item['type'] == "f"){
// scroll to the current item
- if($item['id'] == $INFO['id'] && $ACT == 'index') {
+ if(isset($INFO) && $item['id'] == $INFO['id'] && $ACT == 'index') {
$id = ' id="scroll__here"';
$class = ' bounce';
}
@@ -1556,21 +1585,21 @@ function html_insert_softbreaks($diffhtml) {
*/
function html_softbreak_callback($match){
// if match is an html tag, return it intact
- if ($match[0]{0} == '<') return $match[0];
+ if ($match[0][0] == '<') return $match[0];
// its a long string without a breaking character,
// make certain characters into breaking characters by inserting a
- // breaking character (zero length space, U+200B / #8203) in front them.
+ // word break opportunity (<wbr> tag) in front of them.
$regex = <<< REGEX
-(?(?= # start a conditional expression with a positive look ahead ...
-&\#?\\w{1,6};) # ... for html entities - we don't want to split them (ok to catch some invalid combinations)
-&\#?\\w{1,6}; # yes pattern - a quicker match for the html entity, since we know we have one
+(?(?= # start a conditional expression with a positive look ahead ...
+&\#?\\w{1,6};) # ... for html entities - we don't want to split them (ok to catch some invalid combinations)
+&\#?\\w{1,6}; # yes pattern - a quicker match for the html entity, since we know we have one
|
-[?/,&\#;:] # no pattern - any other group of 'special' characters to insert a breaking character after
-)+ # end conditional expression
+[?/,&\#;:] # no pattern - any other group of 'special' characters to insert a breaking character after
+)+ # end conditional expression
REGEX;
- return preg_replace('<'.$regex.'>xu','\0&#8203;',$match[0]);
+ return preg_replace('<'.$regex.'>xu','\0<wbr>',$match[0]);
}
/**
@@ -1643,13 +1672,41 @@ function html_register(){
$form->startFieldset($lang['btn_register']);
$form->addHidden('do', 'register');
$form->addHidden('save', '1');
- $form->addElement(form_makeTextField('login', $INPUT->post->str('login'), $lang['user'], '', 'block', $base_attrs));
+ $form->addElement(
+ form_makeTextField(
+ 'login',
+ $INPUT->post->str('login'),
+ $lang['user'],
+ '',
+ 'block',
+ $base_attrs
+ )
+ );
if (!$conf['autopasswd']) {
$form->addElement(form_makePasswordField('pass', $lang['pass'], '', 'block', $base_attrs));
$form->addElement(form_makePasswordField('passchk', $lang['passchk'], '', 'block', $base_attrs));
}
- $form->addElement(form_makeTextField('fullname', $INPUT->post->str('fullname'), $lang['fullname'], '', 'block', $base_attrs));
- $form->addElement(form_makeField('email','email', $INPUT->post->str('email'), $lang['email'], '', 'block', $email_attrs));
+ $form->addElement(
+ form_makeTextField(
+ 'fullname',
+ $INPUT->post->str('fullname'),
+ $lang['fullname'],
+ '',
+ 'block',
+ $base_attrs
+ )
+ );
+ $form->addElement(
+ form_makeField(
+ 'email',
+ 'email',
+ $INPUT->post->str('email'),
+ $lang['email'],
+ '',
+ 'block',
+ $email_attrs
+ )
+ );
$form->addElement(form_makeButton('submit', '', $lang['btn_register']));
$form->endFieldset();
html_form('register', $form);
@@ -1668,7 +1725,7 @@ function html_updateprofile(){
global $conf;
global $INPUT;
global $INFO;
- /** @var DokuWiki_Auth_Plugin $auth */
+ /** @var AuthPlugin $auth */
global $auth;
print p_locale_xhtml('updateprofile');
@@ -1680,7 +1737,16 @@ function html_updateprofile(){
$form->startFieldset($lang['profile']);
$form->addHidden('do', 'profile');
$form->addHidden('save', '1');
- $form->addElement(form_makeTextField('login', $_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', $fullname, $lang['fullname'], '', 'block', $attr));
@@ -1694,7 +1760,15 @@ function html_updateprofile(){
}
if ($conf['profileconfirm']) {
$form->addElement(form_makeTag('br'));
- $form->addElement(form_makePasswordField('oldpass', $lang['oldpass'], '', 'block', array('size'=>'50', 'required' => 'required')));
+ $form->addElement(
+ form_makePasswordField(
+ 'oldpass',
+ $lang['oldpass'],
+ '',
+ 'block',
+ array('size' => '50', 'required' => 'required')
+ )
+ );
}
$form->addElement(form_makeButton('submit', '', $lang['btn_save']));
$form->addElement(form_makeButton('reset', '', $lang['btn_reset']));
@@ -1707,10 +1781,27 @@ function html_updateprofile(){
$form_profiledelete->startFieldset($lang['profdeleteuser']);
$form_profiledelete->addHidden('do', 'profile_delete');
$form_profiledelete->addHidden('delete', '1');
- $form_profiledelete->addElement(form_makeCheckboxField('confirm_delete', '1', $lang['profconfdelete'],'dw__confirmdelete','', array('required' => 'required')));
+ $form_profiledelete->addElement(
+ form_makeCheckboxField(
+ 'confirm_delete',
+ '1',
+ $lang['profconfdelete'],
+ 'dw__confirmdelete',
+ '',
+ array('required' => 'required')
+ )
+ );
if ($conf['profileconfirm']) {
$form_profiledelete->addElement(form_makeTag('br'));
- $form_profiledelete->addElement(form_makePasswordField('oldpass', $lang['oldpass'], '', 'block', array('size'=>'50', 'required' => 'required')));
+ $form_profiledelete->addElement(
+ form_makePasswordField(
+ 'oldpass',
+ $lang['oldpass'],
+ '',
+ 'block',
+ array('size' => '50', 'required' => 'required')
+ )
+ );
}
$form_profiledelete->addElement(form_makeButton('submit', '', $lang['btn_deleteuser']));
$form_profiledelete->endFieldset();
@@ -1783,7 +1874,7 @@ function html_edit(){
if ($data['target'] !== 'section') {
// Only emit event if page is writable, section edit data is valid and
// edit target is not section.
- trigger_event('HTML_EDIT_FORMSELECTION', $data, 'html_edit_form', true);
+ Event::createAndTrigger('HTML_EDIT_FORMSELECTION', $data, 'html_edit_form', true);
} else {
html_edit_form($data);
}
@@ -1803,12 +1894,35 @@ function html_edit(){
$form->addElement(form_makeCloseTag('div'));
if ($wr) {
$form->addElement(form_makeOpenTag('div', array('class'=>'editButtons')));
- $form->addElement(form_makeButton('submit', 'save', $lang['btn_save'], array('id'=>'edbtn__save', 'accesskey'=>'s', 'tabindex'=>'4')));
- $form->addElement(form_makeButton('submit', 'preview', $lang['btn_preview'], array('id'=>'edbtn__preview', 'accesskey'=>'p', 'tabindex'=>'5')));
+ $form->addElement(
+ form_makeButton(
+ 'submit',
+ 'save',
+ $lang['btn_save'],
+ array('id' => 'edbtn__save', 'accesskey' => 's', 'tabindex' => '4')
+ )
+ );
+ $form->addElement(
+ form_makeButton(
+ 'submit',
+ 'preview',
+ $lang['btn_preview'],
+ array('id' => 'edbtn__preview', 'accesskey' => 'p', 'tabindex' => '5')
+ )
+ );
$form->addElement(form_makeButton('submit', 'cancel', $lang['btn_cancel'], array('tabindex'=>'6')));
$form->addElement(form_makeCloseTag('div'));
$form->addElement(form_makeOpenTag('div', array('class'=>'summary')));
- $form->addElement(form_makeTextField('summary', $SUM, $lang['summary'], 'edit__summary', 'nowrap', array('size'=>'50', 'tabindex'=>'2')));
+ $form->addElement(
+ form_makeTextField(
+ 'summary',
+ $SUM,
+ $lang['summary'],
+ 'edit__summary',
+ 'nowrap',
+ array('size' => '50', 'tabindex' => '2')
+ )
+ );
$elem = html_minoredit();
if ($elem) $form->addElement($elem);
$form->addElement(form_makeCloseTag('div'));
@@ -1826,16 +1940,27 @@ function html_edit(){
if ($wr) {
// sets changed to true when previewed
- echo '<script type="text/javascript">/*<![CDATA[*/'. NL;
+ echo '<script>/*<![CDATA[*/'. NL;
echo 'textChanged = ' . ($mod ? 'true' : 'false');
echo '/*!]]>*/</script>' . NL;
} ?>
<div class="editBox" role="application">
<div class="toolbar group">
- <div id="draft__status" class="draft__status"><?php if(!empty($INFO['draft'])) echo $lang['draftdate'].' '.dformat();?></div>
- <div id="tool__bar" class="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="tool__bar" class="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>
+ <div id="draft__status" class="draft__status">
+ <?php
+ $draft = new \dokuwiki\Draft($ID, $INFO['client']);
+ if ($draft->isDraftAvailable()) {
+ echo $draft->getDraftMessage();
+ }
+ ?>
</div>
<?php
@@ -1893,7 +2018,7 @@ function html_minoredit(){
function html_debug(){
global $conf;
global $lang;
- /** @var DokuWiki_Auth_Plugin $auth */
+ /** @var AuthPlugin $auth */
global $auth;
global $INFO;
@@ -2098,7 +2223,7 @@ function html_mktocitem($link, $text, $level, $hash='#'){
function html_form($name, &$form) {
// Safety check in case the caller forgets.
$form->endFieldset();
- trigger_event('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false);
+ Event::createAndTrigger('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false);
}
/**
diff --git a/inc/indexer.php b/inc/indexer.php
index fac7a3f68..ab02b8ea2 100644
--- a/inc/indexer.php
+++ b/inc/indexer.php
@@ -7,7 +7,8 @@
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
+use dokuwiki\Extension\Event;
+use dokuwiki\Search\Indexer;
// Version tag used to force rebuild on upgrade
define('INDEXER_VERSION', 8);
@@ -15,41 +16,6 @@ define('INDEXER_VERSION', 8);
// set the minimum token length to use in the index (note, this doesn't apply to numeric tokens)
if (!defined('IDX_MINWORDLENGTH')) define('IDX_MINWORDLENGTH',2);
-// Asian characters are handled as words. The following regexp defines the
-// Unicode-Ranges for Asian characters
-// Ranges taken from http://en.wikipedia.org/wiki/Unicode_block
-// I'm no language expert. If you think some ranges are wrongly chosen or
-// a range is missing, please contact me
-define('IDX_ASIAN1','[\x{0E00}-\x{0E7F}]'); // Thai
-define('IDX_ASIAN2','['.
- '\x{2E80}-\x{3040}'. // CJK -> Hangul
- '\x{309D}-\x{30A0}'.
- '\x{30FD}-\x{31EF}\x{3200}-\x{D7AF}'.
- '\x{F900}-\x{FAFF}'. // CJK Compatibility Ideographs
- '\x{FE30}-\x{FE4F}'. // CJK Compatibility Forms
- "\xF0\xA0\x80\x80-\xF0\xAA\x9B\x9F". // CJK Extension B
- "\xF0\xAA\x9C\x80-\xF0\xAB\x9C\xBF". // CJK Extension C
- "\xF0\xAB\x9D\x80-\xF0\xAB\xA0\x9F". // CJK Extension D
- "\xF0\xAF\xA0\x80-\xF0\xAF\xAB\xBF". // CJK Compatibility Supplement
- ']');
-define('IDX_ASIAN3','['. // Hiragana/Katakana (can be two characters)
- '\x{3042}\x{3044}\x{3046}\x{3048}'.
- '\x{304A}-\x{3062}\x{3064}-\x{3082}'.
- '\x{3084}\x{3086}\x{3088}-\x{308D}'.
- '\x{308F}-\x{3094}'.
- '\x{30A2}\x{30A4}\x{30A6}\x{30A8}'.
- '\x{30AA}-\x{30C2}\x{30C4}-\x{30E2}'.
- '\x{30E4}\x{30E6}\x{30E8}-\x{30ED}'.
- '\x{30EF}-\x{30F4}\x{30F7}-\x{30FA}'.
- ']['.
- '\x{3041}\x{3043}\x{3045}\x{3047}\x{3049}'.
- '\x{3063}\x{3083}\x{3085}\x{3087}\x{308E}\x{3095}-\x{309C}'.
- '\x{30A1}\x{30A3}\x{30A5}\x{30A7}\x{30A9}'.
- '\x{30C3}\x{30E3}\x{30E5}\x{30E7}\x{30EE}\x{30F5}\x{30F6}\x{30FB}\x{30FC}'.
- '\x{31F0}-\x{31FF}'.
- ']?');
-define('IDX_ASIAN', '(?:'.IDX_ASIAN1.'|'.IDX_ASIAN2.'|'.IDX_ASIAN3.')');
-
/**
* Version of the indexer taking into consideration the external tokenizer.
* The indexer is only compatible with data written by the same version.
@@ -71,7 +37,7 @@ function idx_get_version(){
// DokuWiki version is included for the convenience of plugins
$data = array('dokuwiki'=>$version);
- trigger_event('INDEXER_VERSION_GET', $data, null, false);
+ Event::createAndTrigger('INDEXER_VERSION_GET', $data, null, false);
unset($data['dokuwiki']); // this needs to be first
ksort($data);
foreach ($data as $plugin=>$vers)
@@ -102,1227 +68,16 @@ function wordlen($w){
}
/**
- * Class that encapsulates operations on the indexer database.
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
-class Doku_Indexer {
- /**
- * @var array $pidCache Cache for getPID()
- */
- protected $pidCache = array();
-
- /**
- * Adds the contents of a page to the fulltext index
- *
- * The added text replaces previous words for the same page.
- * An empty value erases the page.
- *
- * @param string $page a page name
- * @param string $text the body of the page
- * @return string|boolean the function completed successfully
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- public function addPageWords($page, $text) {
- if (!$this->lock())
- return "locked";
-
- // load known documents
- $pid = $this->getPIDNoLock($page);
- if ($pid === false) {
- $this->unlock();
- return false;
- }
-
- $pagewords = array();
- // get word usage in page
- $words = $this->getPageWords($text);
- if ($words === false) {
- $this->unlock();
- return false;
- }
-
- if (!empty($words)) {
- foreach (array_keys($words) as $wlen) {
- $index = $this->getIndex('i', $wlen);
- foreach ($words[$wlen] as $wid => $freq) {
- $idx = ($wid<count($index)) ? $index[$wid] : '';
- $index[$wid] = $this->updateTuple($idx, $pid, $freq);
- $pagewords[] = "$wlen*$wid";
- }
- if (!$this->saveIndex('i', $wlen, $index)) {
- $this->unlock();
- return false;
- }
- }
- }
-
- // Remove obsolete index entries
- $pageword_idx = $this->getIndexKey('pageword', '', $pid);
- if ($pageword_idx !== '') {
- $oldwords = explode(':',$pageword_idx);
- $delwords = array_diff($oldwords, $pagewords);
- $upwords = array();
- foreach ($delwords as $word) {
- if ($word != '') {
- list($wlen,$wid) = explode('*', $word);
- $wid = (int)$wid;
- $upwords[$wlen][] = $wid;
- }
- }
- foreach ($upwords as $wlen => $widx) {
- $index = $this->getIndex('i', $wlen);
- foreach ($widx as $wid) {
- $index[$wid] = $this->updateTuple($index[$wid], $pid, 0);
- }
- $this->saveIndex('i', $wlen, $index);
- }
- }
- // Save the reverse index
- $pageword_idx = join(':', $pagewords);
- if (!$this->saveIndexKey('pageword', '', $pid, $pageword_idx)) {
- $this->unlock();
- return false;
- }
-
- $this->unlock();
- return true;
- }
-
- /**
- * Split the words in a page and add them to the index.
- *
- * @param string $text content of the page
- * @return array list of word IDs and number of times used
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Christopher Smith <chris@jalakai.co.uk>
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
- protected function getPageWords($text) {
-
- $tokens = $this->tokenizer($text);
- $tokens = array_count_values($tokens); // count the frequency of each token
-
- $words = array();
- foreach ($tokens as $w=>$c) {
- $l = wordlen($w);
- if (isset($words[$l])){
- $words[$l][$w] = $c + (isset($words[$l][$w]) ? $words[$l][$w] : 0);
- }else{
- $words[$l] = array($w => $c);
- }
- }
-
- // arrive here with $words = array(wordlen => array(word => frequency))
- $word_idx_modified = false;
- $index = array(); //resulting index
- foreach (array_keys($words) as $wlen) {
- $word_idx = $this->getIndex('w', $wlen);
- foreach ($words[$wlen] as $word => $freq) {
- $word = (string)$word;
- $wid = array_search($word, $word_idx, true);
- if ($wid === false) {
- $wid = count($word_idx);
- $word_idx[] = $word;
- $word_idx_modified = true;
- }
- if (!isset($index[$wlen]))
- $index[$wlen] = array();
- $index[$wlen][$wid] = $freq;
- }
- // save back the word index
- if ($word_idx_modified && !$this->saveIndex('w', $wlen, $word_idx))
- return false;
- }
-
- return $index;
- }
-
- /**
- * Add/update keys to/of the metadata index.
- *
- * Adding new keys does not remove other keys for the page.
- * An empty value will erase the key.
- * The $key parameter can be an array to add multiple keys. $value will
- * not be used if $key is an array.
- *
- * @param string $page a page name
- * @param mixed $key a key string or array of key=>value pairs
- * @param mixed $value the value or list of values
- * @return boolean|string the function completed successfully
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- * @author Michael Hamann <michael@content-space.de>
- */
- public function addMetaKeys($page, $key, $value=null) {
- if (!is_array($key)) {
- $key = array($key => $value);
- } elseif (!is_null($value)) {
- // $key is array, but $value is not null
- trigger_error("array passed to addMetaKeys but value is not null", E_USER_WARNING);
- }
-
- if (!$this->lock())
- return "locked";
-
- // load known documents
- $pid = $this->getPIDNoLock($page);
- if ($pid === false) {
- $this->unlock();
- return false;
- }
-
- // Special handling for titles so the index file is simpler
- if (array_key_exists('title', $key)) {
- $value = $key['title'];
- if (is_array($value)) {
- $value = $value[0];
- }
- $this->saveIndexKey('title', '', $pid, $value);
- unset($key['title']);
- }
-
- foreach ($key as $name => $values) {
- $metaname = idx_cleanName($name);
- $this->addIndexKey('metadata', '', $metaname);
- $metaidx = $this->getIndex($metaname.'_i', '');
- $metawords = $this->getIndex($metaname.'_w', '');
- $addwords = false;
-
- if (!is_array($values)) $values = array($values);
-
- $val_idx = $this->getIndexKey($metaname.'_p', '', $pid);
- if ($val_idx != '') {
- $val_idx = explode(':', $val_idx);
- // -1 means remove, 0 keep, 1 add
- $val_idx = array_combine($val_idx, array_fill(0, count($val_idx), -1));
- } else {
- $val_idx = array();
- }
-
- foreach ($values as $val) {
- $val = (string)$val;
- if ($val !== "") {
- $id = array_search($val, $metawords, true);
- if ($id === false) {
- // didn't find $val, so we'll add it to the end of metawords and create a placeholder in metaidx
- $id = count($metawords);
- $metawords[$id] = $val;
- $metaidx[$id] = '';
- $addwords = true;
- }
- // test if value is already in the index
- if (isset($val_idx[$id]) && $val_idx[$id] <= 0){
- $val_idx[$id] = 0;
- } else { // else add it
- $val_idx[$id] = 1;
- }
- }
- }
-
- if ($addwords) {
- $this->saveIndex($metaname.'_w', '', $metawords);
- }
- $vals_changed = false;
- foreach ($val_idx as $id => $action) {
- if ($action == -1) {
- $metaidx[$id] = $this->updateTuple($metaidx[$id], $pid, 0);
- $vals_changed = true;
- unset($val_idx[$id]);
- } elseif ($action == 1) {
- $metaidx[$id] = $this->updateTuple($metaidx[$id], $pid, 1);
- $vals_changed = true;
- }
- }
-
- if ($vals_changed) {
- $this->saveIndex($metaname.'_i', '', $metaidx);
- $val_idx = implode(':', array_keys($val_idx));
- $this->saveIndexKey($metaname.'_p', '', $pid, $val_idx);
- }
-
- unset($metaidx);
- unset($metawords);
- }
-
- $this->unlock();
- return true;
- }
-
- /**
- * Rename a page in the search index without changing the indexed content. This function doesn't check if the
- * old or new name exists in the filesystem. It returns an error if the old page isn't in the page list of the
- * indexer and it deletes all previously indexed content of the new page.
- *
- * @param string $oldpage The old page name
- * @param string $newpage The new page name
- * @return string|bool If the page was successfully renamed, can be a message in the case of an error
- */
- public function renamePage($oldpage, $newpage) {
- if (!$this->lock()) return 'locked';
-
- $pages = $this->getPages();
-
- $id = array_search($oldpage, $pages, true);
- if ($id === false) {
- $this->unlock();
- return 'page is not in index';
- }
-
- $new_id = array_search($newpage, $pages, true);
- if ($new_id !== false) {
- // make sure the page is not in the index anymore
- if ($this->deletePageNoLock($newpage) !== true) {
- return false;
- }
-
- $pages[$new_id] = 'deleted:'.time().rand(0, 9999);
- }
-
- $pages[$id] = $newpage;
-
- // update index
- if (!$this->saveIndex('page', '', $pages)) {
- $this->unlock();
- return false;
- }
-
- // reset the pid cache
- $this->pidCache = array();
-
- $this->unlock();
- return true;
- }
-
- /**
- * Renames a meta value in the index. This doesn't change the meta value in the pages, it assumes that all pages
- * will be updated.
- *
- * @param string $key The metadata key of which a value shall be changed
- * @param string $oldvalue The old value that shall be renamed
- * @param string $newvalue The new value to which the old value shall be renamed, can exist (then values will be merged)
- * @return bool|string If renaming the value has been successful, false or error message on error.
- */
- public function renameMetaValue($key, $oldvalue, $newvalue) {
- if (!$this->lock()) return 'locked';
-
- // change the relation references index
- $metavalues = $this->getIndex($key, '_w');
- $oldid = array_search($oldvalue, $metavalues, true);
- if ($oldid !== false) {
- $newid = array_search($newvalue, $metavalues, true);
- if ($newid !== false) {
- // free memory
- unset ($metavalues);
-
- // okay, now we have two entries for the same value. we need to merge them.
- $indexline = $this->getIndexKey($key.'_i', '', $oldid);
- if ($indexline != '') {
- $newindexline = $this->getIndexKey($key.'_i', '', $newid);
- $pagekeys = $this->getIndex($key.'_p', '');
- $parts = explode(':', $indexline);
- foreach ($parts as $part) {
- list($id, $count) = explode('*', $part);
- $newindexline = $this->updateTuple($newindexline, $id, $count);
-
- $keyline = explode(':', $pagekeys[$id]);
- // remove old meta value
- $keyline = array_diff($keyline, array($oldid));
- // add new meta value when not already present
- if (!in_array($newid, $keyline)) {
- array_push($keyline, $newid);
- }
- $pagekeys[$id] = implode(':', $keyline);
- }
- $this->saveIndex($key.'_p', '', $pagekeys);
- unset($pagekeys);
- $this->saveIndexKey($key.'_i', '', $oldid, '');
- $this->saveIndexKey($key.'_i', '', $newid, $newindexline);
- }
- } else {
- $metavalues[$oldid] = $newvalue;
- if (!$this->saveIndex($key.'_w', '', $metavalues)) {
- $this->unlock();
- return false;
- }
- }
- }
-
- $this->unlock();
- return true;
- }
-
- /**
- * Remove a page from the index
- *
- * Erases entries in all known indexes.
- *
- * @param string $page a page name
- * @return string|boolean the function completed successfully
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
- public function deletePage($page) {
- if (!$this->lock())
- return "locked";
-
- $result = $this->deletePageNoLock($page);
-
- $this->unlock();
-
- return $result;
- }
-
- /**
- * Remove a page from the index without locking the index, only use this function if the index is already locked
- *
- * Erases entries in all known indexes.
- *
- * @param string $page a page name
- * @return boolean the function completed successfully
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
- protected function deletePageNoLock($page) {
- // load known documents
- $pid = $this->getPIDNoLock($page);
- if ($pid === false) {
- return false;
- }
-
- // Remove obsolete index entries
- $pageword_idx = $this->getIndexKey('pageword', '', $pid);
- if ($pageword_idx !== '') {
- $delwords = explode(':',$pageword_idx);
- $upwords = array();
- foreach ($delwords as $word) {
- if ($word != '') {
- list($wlen,$wid) = explode('*', $word);
- $wid = (int)$wid;
- $upwords[$wlen][] = $wid;
- }
- }
- foreach ($upwords as $wlen => $widx) {
- $index = $this->getIndex('i', $wlen);
- foreach ($widx as $wid) {
- $index[$wid] = $this->updateTuple($index[$wid], $pid, 0);
- }
- $this->saveIndex('i', $wlen, $index);
- }
- }
- // Save the reverse index
- if (!$this->saveIndexKey('pageword', '', $pid, "")) {
- return false;
- }
-
- $this->saveIndexKey('title', '', $pid, "");
- $keyidx = $this->getIndex('metadata', '');
- foreach ($keyidx as $metaname) {
- $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);
- $this->saveIndexKey($metaname.'_p', '', $pid, '');
- }
-
- return true;
- }
-
- /**
- * Clear the whole index
- *
- * @return bool If the index has been cleared successfully
- */
- public function clear() {
- global $conf;
-
- if (!$this->lock()) return false;
-
- @unlink($conf['indexdir'].'/page.idx');
- @unlink($conf['indexdir'].'/title.idx');
- @unlink($conf['indexdir'].'/pageword.idx');
- @unlink($conf['indexdir'].'/metadata.idx');
- $dir = @opendir($conf['indexdir']);
- if($dir!==false){
- while(($f = readdir($dir)) !== false){
- if(substr($f,-4)=='.idx' &&
- (substr($f,0,1)=='i' || substr($f,0,1)=='w'
- || substr($f,-6)=='_w.idx' || substr($f,-6)=='_i.idx' || substr($f,-6)=='_p.idx'))
- @unlink($conf['indexdir']."/$f");
- }
- }
- @unlink($conf['indexdir'].'/lengths.idx');
-
- // clear the pid cache
- $this->pidCache = array();
-
- $this->unlock();
- return true;
- }
-
- /**
- * Split the text into words for fulltext search
- *
- * TODO: does this also need &$stopwords ?
- *
- * @triggers INDEXER_TEXT_PREPARE
- * This event allows plugins to modify the text before it gets tokenized.
- * Plugins intercepting this event should also intercept INDEX_VERSION_GET
- *
- * @param string $text plain text
- * @param boolean $wc are wildcards allowed?
- * @return array list of words in the text
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- public function tokenizer($text, $wc=false) {
- $wc = ($wc) ? '' : '\*';
- $stopwords =& idx_get_stopwords();
-
- // prepare the text to be tokenized
- $evt = new Doku_Event('INDEXER_TEXT_PREPARE', $text);
- if ($evt->advise_before(true)) {
- if (preg_match('/[^0-9A-Za-z ]/u', $text)) {
- // handle asian chars as single words (may fail on older PHP version)
- $asia = @preg_replace('/('.IDX_ASIAN.')/u', ' \1 ', $text);
- if (!is_null($asia)) $text = $asia; // recover from regexp falure
- }
- }
- $evt->advise_after();
- unset($evt);
-
- $text = strtr($text,
- array(
- "\r" => ' ',
- "\n" => ' ',
- "\t" => ' ',
- "\xC2\xAD" => '', //soft-hyphen
- )
- );
- if (preg_match('/[^0-9A-Za-z ]/u', $text))
- $text = utf8_stripspecials($text, ' ', '\._\-:'.$wc);
-
- $wordlist = explode(' ', $text);
- foreach ($wordlist as $i => $word) {
- $wordlist[$i] = (preg_match('/[^0-9A-Za-z]/u', $word)) ?
- utf8_strtolower($word) : strtolower($word);
- }
-
- foreach ($wordlist as $i => $word) {
- if ((!is_numeric($word) && strlen($word) < IDX_MINWORDLENGTH)
- || array_search($word, $stopwords, true) !== false)
- unset($wordlist[$i]);
- }
- return array_values($wordlist);
- }
-
- /**
- * Get the numeric PID of a page
- *
- * @param string $page The page to get the PID for
- * @return bool|int The page id on success, false on error
- */
- public function getPID($page) {
- // return PID without locking when it is in the cache
- if (isset($this->pidCache[$page])) return $this->pidCache[$page];
-
- if (!$this->lock())
- return false;
-
- // load known documents
- $pid = $this->getPIDNoLock($page);
- if ($pid === false) {
- $this->unlock();
- return false;
- }
-
- $this->unlock();
- return $pid;
- }
-
- /**
- * Get the numeric PID of a page without locking the index.
- * Only use this function when the index is already locked.
- *
- * @param string $page The page to get the PID for
- * @return bool|int The page id on success, false on error
- */
- protected function getPIDNoLock($page) {
- // avoid expensive addIndexKey operation for the most recently requested pages by using a cache
- if (isset($this->pidCache[$page])) return $this->pidCache[$page];
- $pid = $this->addIndexKey('page', '', $page);
- // limit cache to 10 entries by discarding the oldest element as in DokuWiki usually only the most recently
- // added item will be requested again
- if (count($this->pidCache) > 10) array_shift($this->pidCache);
- $this->pidCache[$page] = $pid;
- return $pid;
- }
-
- /**
- * Get the page id of a numeric PID
- *
- * @param int $pid The PID to get the page id for
- * @return string The page id
- */
- public function getPageFromPID($pid) {
- return $this->getIndexKey('page', '', $pid);
- }
-
- /**
- * Find pages in the fulltext index containing the words,
- *
- * The search words must be pre-tokenized, meaning only letters and
- * numbers with an optional wildcard
- *
- * The returned array will have the original tokens as key. The values
- * 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 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>
- */
- public function lookup(&$tokens) {
- $result = array();
- $wids = $this->getIndexWords($tokens, $result);
- if (empty($wids)) return array();
- // load known words and documents
- $page_idx = $this->getIndex('page', '');
- $docs = array();
- foreach (array_keys($wids) as $wlen) {
- $wids[$wlen] = array_unique($wids[$wlen]);
- $index = $this->getIndex('i', $wlen);
- foreach($wids[$wlen] as $ixid) {
- if ($ixid < count($index))
- $docs["$wlen*$ixid"] = $this->parseTuples($page_idx, $index[$ixid]);
- }
- }
- // merge found pages into final result array
- $final = array();
- foreach ($result as $word => $res) {
- $final[$word] = array();
- foreach ($res as $wid) {
- // handle the case when ($ixid < count($index)) has been false
- // and thus $docs[$wid] hasn't been set.
- if (!isset($docs[$wid])) continue;
- $hits = &$docs[$wid];
- foreach ($hits as $hitkey => $hitcnt) {
- // make sure the document still exists
- if (!page_exists($hitkey, '', false)) continue;
- if (!isset($final[$word][$hitkey]))
- $final[$word][$hitkey] = $hitcnt;
- else
- $final[$word][$hitkey] += $hitcnt;
- }
- }
- }
- return $final;
- }
-
- /**
- * Find pages containing a metadata key.
- *
- * The metadata values are compared as case-sensitive strings. Pass a
- * callback function that returns true or false to use a different
- * comparison function. The function will be called with the $value being
- * searched for as the first argument, and the word in the index as the
- * second argument. The function preg_match can be used directly if the
- * values are regexes.
- *
- * @param string $key name of the metadata key to look for
- * @param string $value search term to look for, must be a string or array of strings
- * @param callback $func comparison function
- * @return array lists with page names, keys are query values if $value is array
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- * @author Michael Hamann <michael@content-space.de>
- */
- public function lookupKey($key, &$value, $func=null) {
- if (!is_array($value))
- $value_array = array($value);
- else
- $value_array =& $value;
-
- // the matching ids for the provided value(s)
- $value_ids = array();
-
- $metaname = idx_cleanName($key);
-
- // get all words in order to search the matching ids
- if ($key == 'title') {
- $words = $this->getIndex('title', '');
- } else {
- $words = $this->getIndex($metaname.'_w', '');
- }
-
- if (!is_null($func)) {
- foreach ($value_array as $val) {
- foreach ($words as $i => $word) {
- if (call_user_func_array($func, array($val, $word)))
- $value_ids[$i][] = $val;
- }
- }
- } else {
- foreach ($value_array as $val) {
- $xval = $val;
- $caret = '^';
- $dollar = '$';
- // check for wildcards
- if (substr($xval, 0, 1) == '*') {
- $xval = substr($xval, 1);
- $caret = '';
- }
- if (substr($xval, -1, 1) == '*') {
- $xval = substr($xval, 0, -1);
- $dollar = '';
- }
- if (!$caret || !$dollar) {
- $re = $caret.preg_quote($xval, '/').$dollar;
- foreach(array_keys(preg_grep('/'.$re.'/', $words)) as $i)
- $value_ids[$i][] = $val;
- } else {
- if (($i = array_search($val, $words, true)) !== false)
- $value_ids[$i][] = $val;
- }
- }
- }
-
- unset($words); // free the used memory
-
- // initialize the result so it won't be null
- $result = array();
- foreach ($value_array as $val) {
- $result[$val] = array();
- }
-
- $page_idx = $this->getIndex('page', '');
-
- // Special handling for titles
- if ($key == 'title') {
- foreach ($value_ids as $pid => $val_list) {
- $page = $page_idx[$pid];
- foreach ($val_list as $val) {
- $result[$val][] = $page;
- }
- }
- } else {
- // load all lines and pages so the used lines can be taken and matched with the pages
- $lines = $this->getIndex($metaname.'_i', '');
-
- foreach ($value_ids as $value_id => $val_list) {
- // parse the tuples of the form page_id*1:page2_id*1 and so on, return value
- // is an array with page_id => 1, page2_id => 1 etc. so take the keys only
- $pages = array_keys($this->parseTuples($page_idx, $lines[$value_id]));
- foreach ($val_list as $val) {
- $result[$val] = array_merge($result[$val], $pages);
- }
- }
- }
- if (!is_array($value)) $result = $result[$value];
- return $result;
- }
-
- /**
- * Find the index ID of each search term.
- *
- * The query terms should only contain valid characters, with a '*' at
- * either the beginning or end of the word (or both).
- * The $result parameter can be used to merge the index locations with
- * the appropriate query term.
- *
- * @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) {
- $tokens = array();
- $tokenlength = array();
- $tokenwild = array();
- foreach ($words as $word) {
- $result[$word] = array();
- $caret = '^';
- $dollar = '$';
- $xword = $word;
- $wlen = wordlen($word);
-
- // check for wildcards
- if (substr($xword, 0, 1) == '*') {
- $xword = substr($xword, 1);
- $caret = '';
- $wlen -= 1;
- }
- if (substr($xword, -1, 1) == '*') {
- $xword = substr($xword, 0, -1);
- $dollar = '';
- $wlen -= 1;
- }
- if ($wlen < IDX_MINWORDLENGTH && $caret && $dollar && !is_numeric($xword))
- continue;
- if (!isset($tokens[$xword]))
- $tokenlength[$wlen][] = $xword;
- if (!$caret || !$dollar) {
- $re = $caret.preg_quote($xword, '/').$dollar;
- $tokens[$xword][] = array($word, '/'.$re.'/');
- if (!isset($tokenwild[$xword]))
- $tokenwild[$xword] = $wlen;
- } else {
- $tokens[$xword][] = array($word, null);
- }
- }
- asort($tokenwild);
- // $tokens = array( base word => array( [ query term , regexp ] ... ) ... )
- // $tokenlength = array( base word length => base word ... )
- // $tokenwild = array( base word => base word length ... )
- $length_filter = empty($tokenwild) ? $tokenlength : min(array_keys($tokenlength));
- $indexes_known = $this->indexLengths($length_filter);
- if (!empty($tokenwild)) sort($indexes_known);
- // get word IDs
- $wids = array();
- foreach ($indexes_known as $ixlen) {
- $word_idx = $this->getIndex('w', $ixlen);
- // handle exact search
- if (isset($tokenlength[$ixlen])) {
- foreach ($tokenlength[$ixlen] as $xword) {
- $wid = array_search($xword, $word_idx, true);
- if ($wid !== false) {
- $wids[$ixlen][] = $wid;
- foreach ($tokens[$xword] as $w)
- $result[$w[0]][] = "$ixlen*$wid";
- }
- }
- }
- // handle wildcard search
- foreach ($tokenwild as $xword => $wlen) {
- if ($wlen >= $ixlen) break;
- foreach ($tokens[$xword] as $w) {
- if (is_null($w[1])) continue;
- foreach(array_keys(preg_grep($w[1], $word_idx)) as $wid) {
- $wids[$ixlen][] = $wid;
- $result[$w[0]][] = "$ixlen*$wid";
- }
- }
- }
- }
- return $wids;
- }
-
- /**
- * Return a list of all pages
- * Warning: pages may not exist!
- *
- * @param string $key list only pages containing the metadata key (optional)
- * @return array list of page names
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
- public function getPages($key=null) {
- $page_idx = $this->getIndex('page', '');
- if (is_null($key)) return $page_idx;
-
- $metaname = idx_cleanName($key);
-
- // Special handling for titles
- if ($key == 'title') {
- $title_idx = $this->getIndex('title', '');
- array_splice($page_idx, count($title_idx));
- foreach ($title_idx as $i => $title)
- if ($title === "") unset($page_idx[$i]);
- return array_values($page_idx);
- }
-
- $pages = array();
- $lines = $this->getIndex($metaname.'_i', '');
- foreach ($lines as $line) {
- $pages = array_merge($pages, $this->parseTuples($page_idx, $line));
- }
- return array_keys($pages);
- }
-
- /**
- * Return a list of words sorted by number of times used
- *
- * @param int $min bottom frequency threshold
- * @param int $max upper frequency limit. No limit if $max<$min
- * @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>
- */
- public function histogram($min=1, $max=0, $minlen=3, $key=null) {
- if ($min < 1)
- $min = 1;
- if ($max < $min)
- $max = 0;
-
- $result = array();
-
- if ($key == 'title') {
- $index = $this->getIndex('title', '');
- $index = array_count_values($index);
- foreach ($index as $val => $cnt) {
- if ($cnt >= $min && (!$max || $cnt <= $max) && strlen($val) >= $minlen)
- $result[$val] = $cnt;
- }
- }
- elseif (!is_null($key)) {
- $metaname = idx_cleanName($key);
- $index = $this->getIndex($metaname.'_i', '');
- $val_idx = array();
- foreach ($index as $wid => $line) {
- $freq = $this->countTuples($line);
- 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) {
- if (strlen($words[$wid]) >= $minlen)
- $result[$words[$wid]] = $freq;
- }
- }
- }
- else {
- $lengths = idx_listIndexLengths();
- foreach ($lengths as $length) {
- if ($length < $minlen) continue;
- $index = $this->getIndex('i', $length);
- $words = null;
- foreach ($index as $wid => $line) {
- $freq = $this->countTuples($line);
- if ($freq >= $min && (!$max || $freq <= $max)) {
- if ($words === null)
- $words = $this->getIndex('w', $length);
- $result[$words[$wid]] = $freq;
- }
- }
- }
- }
-
- arsort($result);
- return $result;
- }
-
- /**
- * Lock the indexer.
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- *
- * @return bool|string
- */
- protected function lock() {
- global $conf;
- $status = true;
- $run = 0;
- $lock = $conf['lockdir'].'/_indexer.lock';
- while (!@mkdir($lock, $conf['dmode'])) {
- usleep(50);
- if(is_dir($lock) && time()-@filemtime($lock) > 60*5){
- // looks like a stale lock - remove it
- if (!@rmdir($lock)) {
- $status = "removing the stale lock failed";
- return false;
- } else {
- $status = "stale lock removed";
- }
- }elseif($run++ == 1000){
- // we waited 5 seconds for that lock
- return false;
- }
- }
- if (!empty($conf['dperm'])) {
- chmod($lock, $conf['dperm']);
- }
- return $status;
- }
-
- /**
- * Release the indexer lock.
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- *
- * @return bool
- */
- protected function unlock() {
- global $conf;
- @rmdir($conf['lockdir'].'/_indexer.lock');
- return true;
- }
-
- /**
- * Retrieve the entire index.
- *
- * The $suffix argument is for an index that is split into
- * multiple parts. Different index files should use different
- * base names.
- *
- * @param string $idx name of the index
- * @param string $suffix subpart identifier
- * @return array list of lines without CR or LF
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
- protected function getIndex($idx, $suffix) {
- global $conf;
- $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx';
- if (!file_exists($fn)) return array();
- return file($fn, FILE_IGNORE_NEW_LINES);
- }
-
- /**
- * Replace the contents of the index with an array.
- *
- * @param string $idx name of the index
- * @param string $suffix subpart identifier
- * @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) {
- global $conf;
- $fn = $conf['indexdir'].'/'.$idx.$suffix;
- $fh = @fopen($fn.'.tmp', 'w');
- if (!$fh) return false;
- fwrite($fh, join("\n", $lines));
- if (!empty($lines))
- fwrite($fh, "\n");
- fclose($fh);
- if (isset($conf['fperm']))
- chmod($fn.'.tmp', $conf['fperm']);
- io_rename($fn.'.tmp', $fn.'.idx');
- return true;
- }
-
- /**
- * Retrieve a line from the index.
- *
- * @param string $idx name of the index
- * @param string $suffix subpart identifier
- * @param int $id the line number
- * @return string a line with trailing whitespace removed
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
- protected function getIndexKey($idx, $suffix, $id) {
- global $conf;
- $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx';
- if (!file_exists($fn)) return '';
- $fh = @fopen($fn, 'r');
- if (!$fh) return '';
- $ln = -1;
- while (($line = fgets($fh)) !== false) {
- if (++$ln == $id) break;
- }
- fclose($fh);
- return rtrim((string)$line);
- }
-
- /**
- * Write a line into the index.
- *
- * @param string $idx name of the index
- * @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) {
- global $conf;
- if (substr($line, -1) != "\n")
- $line .= "\n";
- $fn = $conf['indexdir'].'/'.$idx.$suffix;
- $fh = @fopen($fn.'.tmp', 'w');
- if (!$fh) return false;
- $ih = @fopen($fn.'.idx', 'r');
- if ($ih) {
- $ln = -1;
- while (($curline = fgets($ih)) !== false) {
- fwrite($fh, (++$ln == $id) ? $line : $curline);
- }
- if ($id > $ln) {
- while ($id > ++$ln)
- fwrite($fh, "\n");
- fwrite($fh, $line);
- }
- fclose($ih);
- } else {
- $ln = -1;
- while ($id > ++$ln)
- fwrite($fh, "\n");
- fwrite($fh, $line);
- }
- fclose($fh);
- if (isset($conf['fperm']))
- chmod($fn.'.tmp', $conf['fperm']);
- io_rename($fn.'.tmp', $fn.'.idx');
- return true;
- }
-
- /**
- * Retrieve or insert a value in the index.
- *
- * @param string $idx name of the index
- * @param string $suffix subpart identifier
- * @param string $value line to find in the index
- * @return int|bool line number of the value in the index or false if writing the index failed
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
- protected function addIndexKey($idx, $suffix, $value) {
- $index = $this->getIndex($idx, $suffix);
- $id = array_search($value, $index, true);
- if ($id === false) {
- $id = count($index);
- $index[$id] = $value;
- if (!$this->saveIndex($idx, $suffix, $index)) {
- trigger_error("Failed to write $idx index", E_USER_ERROR);
- return false;
- }
- }
- return $id;
- }
-
- /**
- * Get the list of lengths indexed in the wiki.
- *
- * Read the index directory or a cache file and returns
- * a sorted array of lengths of the words used in the wiki.
- *
- * @author YoBoY <yoboy.leguesh@gmail.com>
- *
- * @return array
- */
- protected function listIndexLengths() {
- return idx_listIndexLengths();
- }
-
- /**
- * Get the word lengths that have been indexed.
- *
- * Reads the index directory and returns an array of lengths
- * that there are indices for.
- *
- * @author YoBoY <yoboy.leguesh@gmail.com>
- *
- * @param array|int $filter
- * @return array
- */
- protected function indexLengths($filter) {
- global $conf;
- $idx = array();
- if (is_array($filter)) {
- // testing if index files exist only
- $path = $conf['indexdir']."/i";
- foreach ($filter as $key => $value) {
- if (file_exists($path.$key.'.idx'))
- $idx[] = $key;
- }
- } else {
- $lengths = idx_listIndexLengths();
- foreach ($lengths as $key => $length) {
- // keep all the values equal or superior
- if ((int)$length >= (int)$filter)
- $idx[] = $length;
- }
- }
- return $idx;
- }
-
- /**
- * Insert or replace a tuple in a line.
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- *
- * @param string $line
- * @param string|int $id
- * @param int $count
- * @return string
- */
- protected function updateTuple($line, $id, $count) {
- if ($line != ''){
- $line = preg_replace('/(^|:)'.preg_quote($id,'/').'\*\d*/', '', $line);
- }
- $line = trim($line, ':');
- if ($count) {
- if ($line) {
- return "$id*$count:".$line;
- } else {
- return "$id*$count";
- }
- }
- return $line;
- }
-
- /**
- * Split a line into an array of tuples.
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param array $keys
- * @param string $line
- * @return array
- */
- protected function parseTuples(&$keys, $line) {
- $result = array();
- if ($line == '') return $result;
- $parts = explode(':', $line);
- foreach ($parts as $tuple) {
- if ($tuple === '') continue;
- list($key, $cnt) = explode('*', $tuple);
- if (!$cnt) continue;
- $key = $keys[$key];
- if (!$key) continue;
- $result[$key] = $cnt;
- }
- return $result;
- }
-
- /**
- * Sum the counts in a list of tuples.
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- *
- * @param string $line
- * @return int
- */
- protected function countTuples($line) {
- $freq = 0;
- $parts = explode(':', $line);
- foreach ($parts as $tuple) {
- if ($tuple === '') continue;
- list(/* $pid */, $cnt) = explode('*', $tuple);
- $freq += (int)$cnt;
- }
- return $freq;
- }
-}
-
-/**
* Create an instance of the indexer.
*
- * @return Doku_Indexer a Doku_Indexer
+ * @return Indexer an Indexer
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function idx_get_indexer() {
static $Indexer;
if (!isset($Indexer)) {
- $Indexer = new Doku_Indexer();
+ $Indexer = new Indexer();
}
return $Indexer;
}
@@ -1425,7 +180,7 @@ function idx_addPage($page, $verbose=false, $force=false) {
$metadata['relation_media'] = array();
$data = compact('page', 'body', 'metadata', 'pid');
- $evt = new Doku_Event('INDEXER_PAGE_ADD', $data);
+ $evt = new Event('INDEXER_PAGE_ADD', $data);
if ($evt->advise_before()) $data['body'] = $data['body'] . " " . rawWiki($page);
$evt->advise_after();
unset($evt);
@@ -1521,7 +276,10 @@ function idx_listIndexLengths() {
clearstatcache();
if (file_exists($conf['indexdir'].'/lengths.idx')
&& (time() < @filemtime($conf['indexdir'].'/lengths.idx') + $conf['readdircache'])) {
- if (($lengths = @file($conf['indexdir'].'/lengths.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)) !== false) {
+ if (
+ ($lengths = @file($conf['indexdir'].'/lengths.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES))
+ !== false
+ ) {
$idx = array();
foreach ($lengths as $length) {
$idx[] = (int)$length;
@@ -1602,7 +360,7 @@ function idx_indexLengths($filter) {
* @return string
*/
function idx_cleanName($name) {
- $name = utf8_romanize(trim((string)$name));
+ $name = \dokuwiki\Utf8\Clean::romanize(trim((string)$name));
$name = preg_replace('#[ \./\\:-]+#', '_', $name);
$name = preg_replace('/[^A-Za-z0-9_]/', '', $name);
return strtolower($name);
diff --git a/inc/infoutils.php b/inc/infoutils.php
index 57f89e508..f5fe582a0 100644
--- a/inc/infoutils.php
+++ b/inc/infoutils.php
@@ -5,7 +5,8 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
+
+use dokuwiki\HTTP\DokuHTTPClient;
if(!defined('DOKU_MESSAGEURL')){
if(in_array('ssl', stream_get_transports())) {
@@ -135,14 +136,19 @@ function check(){
$mem = (int) php_to_byte(ini_get('memory_limit'));
if($mem){
- if($mem < 16777216){
- msg('PHP is limited to less than 16MB RAM ('.$mem.' bytes). Increase memory_limit in php.ini',-1);
- }elseif($mem < 20971520){
- msg('PHP is limited to less than 20MB RAM ('.$mem.' bytes), you might encounter problems with bigger pages. Increase memory_limit in php.ini',-1);
- }elseif($mem < 33554432){
- msg('PHP is limited to less than 32MB RAM ('.$mem.' bytes), but that should be enough in most cases. If not, increase memory_limit in php.ini',0);
- }else{
- msg('More than 32MB RAM ('.$mem.' bytes) available.',1);
+ if ($mem === -1) {
+ msg('PHP memory is unlimited', 1);
+ } else if ($mem < 16777216) {
+ msg('PHP is limited to less than 16MB RAM (' . filesize_h($mem) . ').
+ Increase memory_limit in php.ini', -1);
+ } else if ($mem < 20971520) {
+ msg('PHP is limited to less than 20MB RAM (' . filesize_h($mem) . '),
+ you might encounter problems with bigger pages. Increase memory_limit in php.ini', -1);
+ } else if ($mem < 33554432) {
+ msg('PHP is limited to less than 32MB RAM (' . filesize_h($mem) . '),
+ but that should be enough in most cases. If not, increase memory_limit in php.ini', 0);
+ } else {
+ msg('More than 32MB RAM (' . filesize_h($mem) . ') available.', 1);
}
}
@@ -208,7 +214,8 @@ function check(){
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);
+ 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);
}
@@ -288,7 +295,8 @@ function check(){
if(abs($diff) < 4) {
msg("Server time seems to be okay. Diff: {$diff}s", 1);
} else {
- msg("Your server's clock seems to be out of sync! Consider configuring a sync with a NTP server. Diff: {$diff}s");
+ msg("Your server's clock seems to be out of sync!
+ Consider configuring a sync with a NTP server. Diff: {$diff}s");
}
}
@@ -320,6 +328,8 @@ define('MSG_ADMINS_ONLY',4);
/**
* Display a message to the user
*
+ * Triggers INFOUTIL_MSG_SHOW
+ *
* @param string $message
* @param int $lvl -1 = error, 0 = info, 1 = success, 2 = notify
* @param string $line line number
@@ -328,24 +338,37 @@ define('MSG_ADMINS_ONLY',4);
*/
function msg($message,$lvl=0,$line='',$file='',$allow=MSG_PUBLIC){
global $MSG, $MSG_shown;
- $errors = array();
- $errors[-1] = 'error';
- $errors[0] = 'info';
- $errors[1] = 'success';
- $errors[2] = 'notify';
-
- if($line || $file) $message.=' ['.utf8_basename($file).':'.$line.']';
-
- if(!isset($MSG)) $MSG = array();
- $MSG[]=array('lvl' => $errors[$lvl], 'msg' => $message, 'allow' => $allow);
- if(isset($MSG_shown) || headers_sent()){
- if(function_exists('html_msgarea')){
- html_msgarea();
- }else{
- print "ERROR($lvl) $message";
+ static $errors = array(-1=>'error', 0=>'info', 1=>'success', 2=>'notify');
+
+ $msgdata = array(
+ 'msg' => $message,
+ 'lvl' => $lvl,
+ 'allow' => $allow,
+ 'line' => $line,
+ 'file' => $file,
+ );
+
+ $evt = new \dokuwiki\Extension\Event('INFOUTIL_MSG_SHOW', $msgdata);
+ if ($evt->advise_before()) {
+ /* Show msg normally - event could suppress message show */
+ if($msgdata['line'] || $msgdata['file']) {
+ $basename = \dokuwiki\Utf8\PhpString::basename($msgdata['file']);
+ $msgdata['msg'] .=' ['.$basename.':'.$msgdata['line'].']';
+ }
+
+ if(!isset($MSG)) $MSG = array();
+ $MSG[] = $msgdata;
+ if(isset($MSG_shown) || headers_sent()){
+ if(function_exists('html_msgarea')){
+ html_msgarea();
+ }else{
+ print "ERROR(".$msgdata['lvl'].") ".$msgdata['msg']."\n";
+ }
+ unset($GLOBALS['MSG']);
}
- unset($GLOBALS['MSG']);
}
+ $evt->advise_after();
+ unset($evt);
}
/**
* Determine whether the current user is allowed to view the message
@@ -378,7 +401,8 @@ function info_msg_allowed($msg){
return $INFO['isadmin'];
default:
- trigger_error('invalid msg allow restriction. msg="'.$msg['msg'].'" allow='.$msg['allow'].'"', E_USER_WARNING);
+ trigger_error('invalid msg allow restriction. msg="'.$msg['msg'].'" allow='.$msg['allow'].'"',
+ E_USER_WARNING);
return $INFO['isadmin'];
}
@@ -441,26 +465,10 @@ function dbglog($msg,$header=''){
* Log accesses to deprecated fucntions to the debug log
*
* @param string $alternative The function or method that should be used instead
+ * @triggers INFO_DEPRECATION_LOG
*/
function dbg_deprecated($alternative = '') {
- global $conf;
- if(!$conf['allowdebug']) return;
-
- $backtrace = debug_backtrace();
- array_shift($backtrace);
- $self = array_shift($backtrace);
- $call = array_shift($backtrace);
-
- $called = trim($self['class'].'::'.$self['function'].'()', ':');
- $caller = trim($call['class'].'::'.$call['function'].'()', ':');
-
- $msg = $called.' is deprecated. It was called from ';
- $msg .= $caller.' in '.$call['file'].':'.$call['line'];
- if($alternative) {
- $msg .= ' '.$alternative.' should be used instead!';
- }
-
- dbglog($msg);
+ \dokuwiki\Debug\DebugHelper::dbgDeprecatedFunction($alternative, 2);
}
/**
diff --git a/inc/init.php b/inc/init.php
index ba6743f95..f9bb53472 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -3,6 +3,8 @@
* Initialize some defaults needed for DokuWiki
*/
+use dokuwiki\Extension\Event;
+use dokuwiki\Extension\EventHandler;
/**
* timing Dokuwiki execution
@@ -104,23 +106,35 @@ if(!defined('DOKU_BASE')){
}
// define whitespace
+if(!defined('NL')) define ('NL',"\n");
if(!defined('DOKU_LF')) define ('DOKU_LF',"\n");
if(!defined('DOKU_TAB')) define ('DOKU_TAB',"\t");
// define cookie and session id, append server port when securecookie is configured FS#1664
-if (!defined('DOKU_COOKIE')) define('DOKU_COOKIE', 'DW'.md5(DOKU_REL.(($conf['securecookie'])?$_SERVER['SERVER_PORT']:'')));
-
+if (!defined('DOKU_COOKIE')) {
+ $serverPort = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : '';
+ define('DOKU_COOKIE', 'DW' . md5(DOKU_REL . (($conf['securecookie']) ? $serverPort : '')));
+ unset($serverPort);
+}
// define main script
if(!defined('DOKU_SCRIPT')) define('DOKU_SCRIPT','doku.php');
-// DEPRECATED, use tpl_basedir() instead
-if(!defined('DOKU_TPL')) define('DOKU_TPL',
- DOKU_BASE.'lib/tpl/'.$conf['template'].'/');
+if(!defined('DOKU_TPL')) {
+ /**
+ * @deprecated 2012-10-13 replaced by more dynamic method
+ * @see tpl_basedir()
+ */
+ define('DOKU_TPL', DOKU_BASE.'lib/tpl/'.$conf['template'].'/');
+}
-// DEPRECATED, use tpl_incdir() instead
-if(!defined('DOKU_TPLINC')) define('DOKU_TPLINC',
- DOKU_INC.'lib/tpl/'.$conf['template'].'/');
+if(!defined('DOKU_TPLINC')) {
+ /**
+ * @deprecated 2012-10-13 replaced by more dynamic method
+ * @see tpl_incdir()
+ */
+ define('DOKU_TPLINC', DOKU_INC.'lib/tpl/'.$conf['template'].'/');
+}
// make session rewrites XHTML compliant
@ini_set('arg_separator.output', '&amp;');
@@ -132,7 +146,8 @@ if(!defined('DOKU_TPLINC')) define('DOKU_TPLINC',
@ini_set('pcre.backtrack_limit', '20971520');
// enable gzip compression if supported
-$conf['gzip_output'] &= (strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') !== false);
+$httpAcceptEncoding = isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : '';
+$conf['gzip_output'] &= (strpos($httpAcceptEncoding, 'gzip') !== false);
global $ACT;
if ($conf['gzip_output'] &&
!defined('DOKU_DISABLE_GZIP_OUTPUT') &&
@@ -177,9 +192,8 @@ init_paths();
init_files();
// setup plugin controller class (can be overwritten in preload.php)
-$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';
+if (empty($plugin_controller_class)) $plugin_controller_class = dokuwiki\Extension\PluginController::class;
// load libraries
require_once(DOKU_INC.'vendor/autoload.php');
@@ -197,17 +211,17 @@ if($conf['compression'] == 'gz' && !DOKU_HAS_GZIP) {
// input handle class
global $INPUT;
-$INPUT = new Input();
+$INPUT = new \dokuwiki\Input\Input();
// initialize plugin controller
$plugin_controller = new $plugin_controller_class();
// initialize the event handler
global $EVENT_HANDLER;
-$EVENT_HANDLER = new Doku_Event_Handler();
+$EVENT_HANDLER = new EventHandler();
$local = $conf['lang'];
-trigger_event('INIT_LANG_LOAD', $local, 'init_lang', true);
+Event::createAndTrigger('INIT_LANG_LOAD', $local, 'init_lang', true);
// setup authentication system
@@ -229,7 +243,13 @@ mail_setup();
function init_session() {
global $conf;
session_name(DOKU_SESSION_NAME);
- session_set_cookie_params(DOKU_SESSION_LIFETIME, DOKU_SESSION_PATH, DOKU_SESSION_DOMAIN, ($conf['securecookie'] && is_ssl()), true);
+ session_set_cookie_params(
+ DOKU_SESSION_LIFETIME,
+ DOKU_SESSION_PATH,
+ DOKU_SESSION_DOMAIN,
+ ($conf['securecookie'] && is_ssl()),
+ true
+ );
// make sure the session cookie contains a valid session ID
if(isset($_COOKIE[DOKU_SESSION_NAME]) && !preg_match('/^[-,a-zA-Z0-9]{22,256}$/', $_COOKIE[DOKU_SESSION_NAME])) {
@@ -268,7 +288,9 @@ function init_paths(){
}
// path to old changelog only needed for upgrading
- $conf['changelog_old'] = init_path((isset($conf['changelog']))?($conf['changelog']):($conf['savedir'].'/changes.log'));
+ $conf['changelog_old'] = init_path(
+ (isset($conf['changelog'])) ? ($conf['changelog']) : ($conf['savedir'] . '/changes.log')
+ );
if ($conf['changelog_old']=='') { unset($conf['changelog_old']); }
// hardcoded changelog because it is now a cache that lives in meta
$conf['changelog'] = $conf['metadir'].'/_dokuwiki.changes';
@@ -318,7 +340,7 @@ function init_files(){
$fh = @fopen($file,'a');
if($fh){
fclose($fh);
- if(!empty($conf['fperm'])) chmod($file, $conf['fperm']);
+ if($conf['fperm']) chmod($file, $conf['fperm']);
}else{
nice_die("$file is not writable. Check your permissions settings!");
}
@@ -383,7 +405,7 @@ function init_creationmodes(){
// check what is set automatically by the system on file creation
// and set the fperm param if it's not what we want
- $auto_fmode = 0666 & ~$umask;
+ $auto_fmode = $conf['fmode'] & ~$umask;
if($auto_fmode != $conf['fmode']) $conf['fperm'] = $conf['fmode'];
// check what is set automatically by the system on file creation
@@ -437,7 +459,7 @@ function getBaseURL($abs=null){
//finish here for relative URLs
if(!$abs) return $dir;
- //use config option if available, trim any slash from end of baseurl to avoid multiple consecutive slashes in the path
+ //use config if available, trim any slash from end of baseurl to avoid multiple consecutive slashes in the path
if(!empty($conf['baseurl'])) return rtrim($conf['baseurl'],'/').$dir;
//split hostheader into host and port
@@ -551,10 +573,10 @@ EOT;
function fullpath($path,$exists=false){
static $run = 0;
$root = '';
- $iswin = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' || @$GLOBALS['DOKU_UNITTEST_ASSUME_WINDOWS']);
+ $iswin = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' || !empty($GLOBALS['DOKU_UNITTEST_ASSUME_WINDOWS']));
// find the (indestructable) root of the path - keeps windows stuff intact
- if($path{0} == '/'){
+ if($path[0] == '/'){
$root = '/';
}elseif($iswin){
// match drive letter and UNC paths
diff --git a/inc/io.php b/inc/io.php
index 7b646f127..1dfabe845 100644
--- a/inc/io.php
+++ b/inc/io.php
@@ -6,7 +6,8 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
+use dokuwiki\HTTP\DokuHTTPClient;
+use dokuwiki\Extension\Event;
/**
* Removes empty directories
@@ -16,7 +17,6 @@ if(!defined('DOKU_INC')) die('meh.');
* $data[0] ns: The colon separated namespace path minus the trailing page name.
* $data[1] ns_type: 'pages' or 'media' namespace tree.
*
- * @todo use safemode hack
* @param string $id - a pageid, the namespace of that id will be tried to 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
@@ -40,7 +40,7 @@ function io_sweepNS($id,$basedir='datadir'){
if ($ns_type!==false) {
$data = array($id, $ns_type);
$delone = true; // we deleted at least one dir
- trigger_event('IO_NAMESPACE_DELETED', $data);
+ Event::createAndTrigger('IO_NAMESPACE_DELETED', $data);
}
} else { return $delone; }
}
@@ -70,7 +70,7 @@ function io_sweepNS($id,$basedir='datadir'){
function io_readWikiPage($file, $id, $rev=false) {
if (empty($rev)) { $rev = false; }
$data = array(array($file, true), getNS($id), noNS($id), $rev);
- return trigger_event('IO_WIKIPAGE_READ', $data, '_io_readWikiPage_action', false);
+ return Event::createAndTrigger('IO_WIKIPAGE_READ', $data, '_io_readWikiPage_action', false);
}
/**
@@ -190,7 +190,7 @@ function io_writeWikiPage($file, $content, $id, $rev=false) {
if (empty($rev)) { $rev = false; }
if ($rev===false) { io_createNamespace($id); } // create namespaces as needed
$data = array(array($file, $content, false), getNS($id), noNS($id), $rev);
- return trigger_event('IO_WIKIPAGE_WRITE', $data, '_io_writeWikiPage_action', false);
+ return Event::createAndTrigger('IO_WIKIPAGE_WRITE', $data, '_io_writeWikiPage_action', false);
}
/**
@@ -252,7 +252,7 @@ function _io_saveFile($file, $content, $append) {
fclose($fh);
}
- if(!$fileexists and !empty($conf['fperm'])) chmod($file, $conf['fperm']);
+ if(!$fileexists and $conf['fperm']) chmod($file, $conf['fperm']);
return true;
}
@@ -400,8 +400,6 @@ function io_deleteFromFile($file,$badline,$regex=false){
*/
function io_lock($file){
global $conf;
- // no locking if safemode hack
- if($conf['safemodehack']) return;
$lockDir = $conf['lockdir'].'/'.md5($file);
@ignore_user_abort(1);
@@ -428,8 +426,6 @@ function io_lock($file){
*/
function io_unlock($file){
global $conf;
- // no locking if safemode hack
- if($conf['safemodehack']) return;
$lockDir = $conf['lockdir'].'/'.md5($file);
@rmdir($lockDir);
@@ -474,7 +470,7 @@ function io_createNamespace($id, $ns_type='pages') {
$missing = array_reverse($missing); // inside out
foreach ($missing as $ns) {
$data = array($ns, $ns_type);
- trigger_event('IO_NAMESPACE_CREATED', $data);
+ Event::createAndTrigger('IO_NAMESPACE_CREATED', $data);
}
}
@@ -508,14 +504,9 @@ function io_mkdir_p($target){
if (file_exists($target) && !is_dir($target)) return 0;
//recursion
if (io_mkdir_p(substr($target,0,strrpos($target,'/')))){
- if($conf['safemodehack']){
- $dir = preg_replace('/^'.preg_quote(fullpath($conf['ftp']['root']),'/').'/','', $target);
- return io_mkdir_ftp($dir);
- }else{
- $ret = @mkdir($target,$conf['dmode']); // crawl back up & create dir tree
- if($ret && !empty($conf['dperm'])) chmod($target, $conf['dperm']);
- return $ret;
- }
+ $ret = @mkdir($target,$conf['dmode']); // crawl back up & create dir tree
+ if($ret && !empty($conf['dperm'])) chmod($target, $conf['dperm']);
+ return $ret;
}
return 0;
}
@@ -571,44 +562,6 @@ function io_rmdir($path, $removefiles = false) {
}
/**
- * Creates a directory using FTP
- *
- * This is used when the safemode workaround is enabled
- *
- * @author <andi@splitbrain.org>
- *
- * @param string $dir name of the new directory
- * @return false|string
- */
-function io_mkdir_ftp($dir){
- global $conf;
-
- if(!function_exists('ftp_connect')){
- msg("FTP support not found - safemode workaround not usable",-1);
- return false;
- }
-
- $conn = @ftp_connect($conf['ftp']['host'],$conf['ftp']['port'],10);
- if(!$conn){
- msg("FTP connection failed",-1);
- return false;
- }
-
- if(!@ftp_login($conn, $conf['ftp']['user'], conf_decodeString($conf['ftp']['pass']))){
- msg("FTP login failed",-1);
- return false;
- }
-
- //create directory
- $ok = @ftp_mkdir($conn, $dir);
- //set permissions
- @ftp_site($conn,sprintf("CHMOD %04o %s",$conf['dmode'],$dir));
-
- @ftp_close($conn);
- return $ok;
-}
-
-/**
* Creates a unique temporary directory and returns
* its path.
*
@@ -646,7 +599,8 @@ function io_mktmpdir() {
*
* @param string $url url to download
* @param string $file path to file or directory where to save
- * @param bool $useAttachment if true: try to use name of download, uses otherwise $defaultName, false: uses $file as path to file
+ * @param bool $useAttachment true: try to use name of download, uses otherwise $defaultName
+ * false: uses $file as path to file
* @param string $defaultName fallback for if using $useAttachment
* @param int $maxSize maximum file size
* @return bool|string if failed false, otherwise true or the name of the file in the given dir
@@ -669,7 +623,7 @@ function io_download($url,$file,$useAttachment=false,$defaultName='',$maxSize=20
if (is_string($content_disposition) &&
preg_match('/attachment;\s*filename\s*=\s*"([^"]*)"/i', $content_disposition, $match)) {
- $name = utf8_basename($match[1]);
+ $name = \dokuwiki\Utf8\PhpString::basename($match[1]);
}
}
diff --git a/inc/lang/.htaccess b/inc/lang/.htaccess
deleted file mode 100644
index 2aaae02fd..000000000
--- a/inc/lang/.htaccess
+++ /dev/null
@@ -1,8 +0,0 @@
-## no access to the lang directory
-<IfModule mod_authz_host>
- Require all denied
-</IfModule>
-<IfModule !mod_authz_host>
- Order allow,deny
- Deny from all
-</IfModule>
diff --git a/inc/lang/ar/admin.txt b/inc/lang/ar/admin.txt
index bbb443886..83994ad56 100644
--- a/inc/lang/ar/admin.txt
+++ b/inc/lang/ar/admin.txt
@@ -1,3 +1,3 @@
====== الأدارة ======
-قائمة بالمهام الإدارية المتاحة فى دوكو ويكي. \ No newline at end of file
+قائمة بالمهام الإدارية المتاحة فى دوكو ويكي.
diff --git a/inc/lang/ar/backlinks.txt b/inc/lang/ar/backlinks.txt
index f6d24f413..8c1cd2468 100644
--- a/inc/lang/ar/backlinks.txt
+++ b/inc/lang/ar/backlinks.txt
@@ -1,3 +1,3 @@
====== إرتباطات ======
-هذه قائمة بالصفحات المرتبطة بالصفحة الحالية. \ No newline at end of file
+هذه قائمة بالصفحات المرتبطة بالصفحة الحالية.
diff --git a/inc/lang/ar/conflict.txt b/inc/lang/ar/conflict.txt
index 4d7c4e8e7..eabed035f 100644
--- a/inc/lang/ar/conflict.txt
+++ b/inc/lang/ar/conflict.txt
@@ -2,4 +2,4 @@
يوجد نسخة أحدث من هذه الصفحة. يحدث هذا عندما يحرر مشترك آخر الصفحة أثناء تعديلك لها.
-افحص الاختلافات جيداً، ثم حدد أية نسخة تحفظ. بالضغط على "حفظ" ستحفظ نسختك. أما بالضغط على "إلغاء" فستحافظ على النسخة الحالية. \ No newline at end of file
+افحص الاختلافات جيداً، ثم حدد أية نسخة تحفظ. بالضغط على "حفظ" ستحفظ نسختك. أما بالضغط على "إلغاء" فستحافظ على النسخة الحالية.
diff --git a/inc/lang/ar/denied.txt b/inc/lang/ar/denied.txt
index b369f7f23..45baea02e 100644
--- a/inc/lang/ar/denied.txt
+++ b/inc/lang/ar/denied.txt
@@ -1,3 +1,3 @@
====== لا صلاحيات ======
-عذرا، ليس مصرح لك الاستمرار \ No newline at end of file
+عذرا، ليس مصرح لك الاستمرار
diff --git a/inc/lang/ar/diff.txt b/inc/lang/ar/diff.txt
index ed1937c2f..b9ca6ecbf 100644
--- a/inc/lang/ar/diff.txt
+++ b/inc/lang/ar/diff.txt
@@ -1,3 +1,3 @@
====== اختلافات ======
-عرض الاختلافات بين النسخة المختارة و النسخة الحالية من الصفحة. \ No newline at end of file
+عرض الاختلافات بين النسخة المختارة و النسخة الحالية من الصفحة.
diff --git a/inc/lang/ar/edit.txt b/inc/lang/ar/edit.txt
index d4e1eb43b..27e7dc1f4 100644
--- a/inc/lang/ar/edit.txt
+++ b/inc/lang/ar/edit.txt
@@ -1 +1 @@
-حرر هذه الصفحة ثم اضغط على "حفظ". انظر [[wiki:syntax|دليل الصياغة]] لمعرفة صيغة الويكي. يرجى تعديل الصفحة فقط إذا كنت ستحسنها. إذا رغبت فى اختبار شيء ما، تعلم الخطوات الأولى فى [[playground:playground|الملعب]]. \ No newline at end of file
+حرر هذه الصفحة ثم اضغط على "حفظ". انظر [[wiki:syntax|دليل الصياغة]] لمعرفة صيغة الويكي. يرجى تعديل الصفحة فقط إذا كنت ستحسنها. إذا رغبت فى اختبار شيء ما، تعلم الخطوات الأولى فى [[playground:playground|الملعب]].
diff --git a/inc/lang/ar/editrev.txt b/inc/lang/ar/editrev.txt
index a51fe9436..f9b5c313c 100644
--- a/inc/lang/ar/editrev.txt
+++ b/inc/lang/ar/editrev.txt
@@ -1,2 +1,2 @@
**لقد حملت نسخة قديمة من الصفحة!** إذا حفظتها، سيتم إنشاء نسخة جديدة بهذه المعلومات.
----- \ No newline at end of file
+----
diff --git a/inc/lang/ar/index.txt b/inc/lang/ar/index.txt
index 43840ec26..1d9701d73 100644
--- a/inc/lang/ar/index.txt
+++ b/inc/lang/ar/index.txt
@@ -1,3 +1,3 @@
====== فهرس ======
-هذا فهرس لجميع الصفحات مرتبة حسب [[doku>namespaces|namespaces]].
+هذا فهرس لجميع الصفحات مرتبة حسب [[doku>ar:namespaces|namespaces]].
diff --git a/inc/lang/ar/install.html b/inc/lang/ar/install.html
index 3ef23aee2..db200b832 100644
--- a/inc/lang/ar/install.html
+++ b/inc/lang/ar/install.html
@@ -1,12 +1,7 @@
-<p>تساعد هذه الصفحة في التثبيت والإعداد الأوليين ل <a href="http://dokuwiki.org">دوكو ويكي</a>. مزيد من المعلومات عن هذا المثبت في
-<a href="http://dokuwiki.org/installer">صفحة التوثيق</a> الخاصة به.</p>
+<p>تساعد هذه الصفحة في التثبيت والإعداد الأوليين ل <a href="http://dokuwiki.org">دوكو ويكي</a>. مزيد من المعلومات عن هذا المثبت في <a href="http://dokuwiki.org/installer">صفحة التوثيق</a> الخاصة به.</p>
<p>دوكو ويكي تستخدم ملفات عادية لتخزين الصفحات و المعلومات المرتبطة بها (مثل. الصور , وفهارس البحث, والنسخ القديمة, إلخ). لكي تعمل بنجاح دوكو ويكي <strong>يجب</strong> ان يكون لديها اذن بالكتابة على المجلدات التي تحوي هذه الملفات. هذا المثبت غير قادر على اعداد اذونات المجلدات. عادة يجب عمل هذا مباشرة باستخدام أمر في محث الاوامر أو إن كنت تستخدم استضافة، عن طريقة FTP في لوحة تحكم الاستضافة (مثل. cPanel).</p>
-<p>سيُعد هذا المثبت اعدادات دوكو ويكي ل
-<abbr title="قائمة التحكم بالوصول">ACL</abbr>, الذي سيسمح للمدير بالولوج و الوصول لقائمة إدارة دوكو ويكي لتثبيت الإضافات، وإدارة المستخدمين، و التحكم بالوصول لصفحات الويكي، وتعديل الاعدادات.
-ليس مطلوبا لأجل عمل دوكو ويكي, لكنه سيجعل دوكو ويكي أسهل على المدير.</p>
+<p>سيُعد هذا المثبت اعدادات دوكو ويكي ل <abbr title="قائمة التحكم بالوصول">ACL</abbr>, الذي سيسمح للمدير بالولوج و الوصول لقائمة إدارة دوكو ويكي لتثبيت الإضافات، وإدارة المستخدمين، و التحكم بالوصول لصفحات الويكي، وتعديل الاعدادات. ليس مطلوبا لأجل عمل دوكو ويكي, لكنه سيجعل دوكو ويكي أسهل على المدير.</p>
-<p>المستخدمين الخبراء و المستخدمين مع متطلبات خاصة عليهم استخدام هذا الرابط لتفاصيل تتعلق ب
-<a href="http://dokuwiki.org/install">توجيهات التثبيت</a>
-و <a href="http://dokuwiki.org/config">ضبط الإعدادات</a>.</p> \ No newline at end of file
+<p>المستخدمين الخبراء و المستخدمين مع متطلبات خاصة عليهم استخدام هذا الرابط لتفاصيل تتعلق ب <a href="http://dokuwiki.org/install">توجيهات التثبيت</a> و <a href="http://dokuwiki.org/config">ضبط الإعدادات</a>.</p>
diff --git a/inc/lang/ar/lang.php b/inc/lang/ar/lang.php
index 82ef5325f..7a86edfcf 100644
--- a/inc/lang/ar/lang.php
+++ b/inc/lang/ar/lang.php
@@ -3,10 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Khalid <khalid.aljahil@gmail.com>
* @author Mostafa Hussein <mostafa@gmail.com>
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
- * @author uahello@gmail.com
* @author Ahmad Abd-Elghany <tolpa1@gmail.com>
* @author alhajr <alhajr300@gmail.com>
* @author Mohamed Belhsine <b.mohamed897@gmail.com>
@@ -70,43 +70,7 @@ $lang['badpassconfirm'] = 'عذراً,كلمة السر غير صحيحة
$lang['minoredit'] = 'تعديلات طفيفة';
$lang['draftdate'] = 'حفظ المسودات آليا مفعّل';
$lang['nosecedit'] = 'غُيرت الصفحة في هذه الأثناء، معلومات الجزء اصبحت قديمة. حُمُلت كل الصفحة بدلا.';
-$lang['regmissing'] = 'عذرا، عليك ملء جميع الحقول.';
-$lang['reguexists'] = 'عذرا، يوجد مشترك بنفس الاسم.';
-$lang['regsuccess'] = 'أنشئ المستخدم و ارسلت كلمة السر بالبريد.';
-$lang['regsuccess2'] = 'أنشئ المستخدم.';
-$lang['regmailfail'] = 'حدث خطأ فى إرسال رسالة كلمة السر. يرجى مراسلة المدير!';
-$lang['regbadmail'] = 'يبدو البريد الإلكتروني المعطى غيرَ صحيح، إن كنت تظن أن هذا خطأ، راسل المدير';
-$lang['regbadpass'] = 'كلمتا المرور غير متطابقتين، حاول مرة أخرى.';
-$lang['regpwmail'] = 'كلمة مرورك إلى دوكو ويكي';
-$lang['reghere'] = 'ليس لديك حساب بعد؟ احصل على واحد';
-$lang['profna'] = 'هذه الويكي لا تدعم تعديل الملف الشخصي';
-$lang['profnochange'] = 'لا تغييرات، لا شيء ليُعمل.';
-$lang['profnoempty'] = 'غير مسموح باسم مستخدم أو بريد فارغ.';
-$lang['profchanged'] = 'حُدث الملف الشخصي للمستخدم بنجاح.';
-$lang['profnodelete'] = 'هذه الموسوعه لا ندعم حذف الأشخاص';
-$lang['profdeleteuser'] = 'احذف حساب';
-$lang['profdeleted'] = 'حسابك الخاص تم حذفه من هذه الموسوعة';
-$lang['profconfdelete'] = 'أنا أرغب في حذف حسابي من هذه الموسوعة.<br/>
-هذا الحدث غير ممكن.';
-$lang['profconfdeletemissing'] = 'لم تقم بوضع علامة في مربع التأكيد';
-$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['maxuploadsize'] = 'الحجم الاقصى %s للملف';
-$lang['lockedby'] = 'مقفلة حاليا لـ:';
-$lang['lockexpire'] = 'ينتهي القفل في:';
+$lang['js']['search_toggle_tools'] = 'إظهار / إخفاء أدوات البحث';
$lang['js']['willexpire'] = 'سينتهي قفل تحرير هذه الصفحه خلال دقيقة.\nلتجنب التعارض استخدم زر المعاينة لتصفير مؤقت القفل.';
$lang['js']['notsavedyet'] = 'التعديلات غير المحفوظة ستفقد.';
$lang['js']['searchmedia'] = 'ابحث عن ملفات';
@@ -141,12 +105,63 @@ $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['js']['media_overwrt'] = 'أكتب فوق الملفات الموجودة';
+$lang['search_exact_match'] = 'تطابق تام';
+$lang['search_starts_with'] = 'يبدأ بالتالي';
+$lang['search_ends_with'] = 'ينتهي بالتالي';
+$lang['search_contains'] = 'يحتوي';
+$lang['search_custom_match'] = 'مخصص';
+$lang['search_any_time'] = 'أي وقت';
+$lang['search_past_7_days'] = 'الأسبوع الماضي';
+$lang['search_past_month'] = 'الشهر الماضي';
+$lang['search_past_year'] = 'السنة الماضية';
+$lang['search_sort_by_hits'] = 'فرز حسب عدد الزيارات';
+$lang['search_sort_by_mtime'] = 'فرز حسب وقت آخر تعديل';
+$lang['regmissing'] = 'عذرا، عليك ملء جميع الحقول.';
+$lang['reguexists'] = 'عذرا، يوجد مشترك بنفس الاسم.';
+$lang['regsuccess'] = 'أنشئ المستخدم و ارسلت كلمة السر بالبريد.';
+$lang['regsuccess2'] = 'أنشئ المستخدم.';
+$lang['regfail'] = 'لا يمكن إنشاء المستخدم.';
+$lang['regmailfail'] = 'حدث خطأ فى إرسال رسالة كلمة السر. يرجى مراسلة المدير!';
+$lang['regbadmail'] = 'يبدو البريد الإلكتروني المعطى غيرَ صحيح، إن كنت تظن أن هذا خطأ، راسل المدير';
+$lang['regbadpass'] = 'كلمتا المرور غير متطابقتين، حاول مرة أخرى.';
+$lang['regpwmail'] = 'كلمة مرورك إلى دوكو ويكي';
+$lang['reghere'] = 'ليس لديك حساب بعد؟ احصل على واحد';
+$lang['profna'] = 'هذه الويكي لا تدعم تعديل الملف الشخصي';
+$lang['profnochange'] = 'لا تغييرات، لا شيء ليُعمل.';
+$lang['profnoempty'] = 'غير مسموح باسم مستخدم أو بريد فارغ.';
+$lang['profchanged'] = 'حُدث الملف الشخصي للمستخدم بنجاح.';
+$lang['profnodelete'] = 'هذه الموسوعه لا ندعم حذف الأشخاص';
+$lang['profdeleteuser'] = 'احذف حساب';
+$lang['profdeleted'] = 'حسابك الخاص تم حذفه من هذه الموسوعة';
+$lang['profconfdelete'] = 'أنا أرغب في حذف حسابي من هذه الموسوعة.<br/>
+هذا الحدث غير ممكن.';
+$lang['profconfdeletemissing'] = 'لم تقم بوضع علامة في مربع التأكيد';
+$lang['proffail'] = 'لم يتم تحديث ملف المستخدم';
+$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['maxuploadsize'] = 'الحجم الاقصى %s للملف';
+$lang['lockedby'] = 'مقفلة حاليا لـ:';
+$lang['lockexpire'] = 'ينتهي القفل في:';
$lang['rssfailed'] = 'خطأ ما حدث أثناء جلب ملف التغذية:';
$lang['nothingfound'] = 'لا يوجد شيء';
$lang['mediaselect'] = 'ملفات الوسائط';
@@ -344,5 +359,5 @@ $lang['currentns'] = 'مساحة الاسم الحالية';
$lang['searchresult'] = 'نتيجة البحث';
$lang['plainhtml'] = 'نص HTML غير منسق';
$lang['wikimarkup'] = 'علامات الوكي';
-$lang['email_signature_text'] = 'أنشئت هذه الرسالة من دوكو ويكي في
+$lang['email_signature_text'] = 'أنشئت هذه الرسالة من دوكو ويكي في
@DOKUWIKIURL@';
diff --git a/inc/lang/ar/locked.txt b/inc/lang/ar/locked.txt
index 72e9be535..48fa61a5b 100644
--- a/inc/lang/ar/locked.txt
+++ b/inc/lang/ar/locked.txt
@@ -1,3 +1,3 @@
====== الصفحة مقفلة ======
-هذه الصفحة مقفلة للتحرير بواسطة مستخدم أخر. عليك أن تنتظر حتى ينتهى من تعديلاتة أو تتنتهى مدة القفل. \ No newline at end of file
+هذه الصفحة مقفلة للتحرير بواسطة مستخدم أخر. عليك أن تنتظر حتى ينتهى من تعديلاتة أو تتنتهى مدة القفل.
diff --git a/inc/lang/ar/pwconfirm.txt b/inc/lang/ar/pwconfirm.txt
index 6e971d367..f9e88fa01 100644
--- a/inc/lang/ar/pwconfirm.txt
+++ b/inc/lang/ar/pwconfirm.txt
@@ -1,6 +1,9 @@
مرحبا @FULLNAME@
شخص ما طلب كلمة سر جديدة لـحسابك @TITLE@ في @DOKUWIKIURL@
+
إذا لم تكن قد طلبت كلمة سر جديدة رجاء قم بتجاهل هذه الرسالة .
+
لتأكيد أنك أنت قمت بطلب كلمة السر الجديدة . نرجو منك الضغط على الرابط في الأسفل .
+
@CONFIRM@
diff --git a/inc/lang/ar/read.txt b/inc/lang/ar/read.txt
index 3e6c504ff..27a93047b 100644
--- a/inc/lang/ar/read.txt
+++ b/inc/lang/ar/read.txt
@@ -1 +1 @@
-هذه الصفحة للقراءة فقط. يمكنك تصفح مصدرها، ولكن لا يمكنك تعديلها. إن كنت تتعتفد أن هناك خطأ ما خاطب المدير. \ No newline at end of file
+هذه الصفحة للقراءة فقط. يمكنك تصفح مصدرها، ولكن لا يمكنك تعديلها. إن كنت تتعتفد أن هناك خطأ ما خاطب المدير.
diff --git a/inc/lang/ar/recent.txt b/inc/lang/ar/recent.txt
index 94d68401e..567c7d955 100644
--- a/inc/lang/ar/recent.txt
+++ b/inc/lang/ar/recent.txt
@@ -1,3 +1,3 @@
====== احدث التغييرات ======
-تم تعديل الصفحات التالية حديثا. \ No newline at end of file
+تم تعديل الصفحات التالية حديثا:
diff --git a/inc/lang/ar/resendpwd.txt b/inc/lang/ar/resendpwd.txt
index c69713706..6ba748a71 100644
--- a/inc/lang/ar/resendpwd.txt
+++ b/inc/lang/ar/resendpwd.txt
@@ -1,3 +1,3 @@
==== إرسال كلمة سر جديدة ====
-رجاء اكتب اسم المستخدم في الاستمارة الموجودة في الأسفل ليتم طلب رقم سري جديد لحسابك في هذا الويكي . سيرسل رابط لتأكيد طلبك إلى بريدك الإلكتروني المسجل . \ No newline at end of file
+رجاء اكتب اسم المستخدم في الاستمارة الموجودة في الأسفل ليتم طلب رقم سري جديد لحسابك في هذا الويكي . سيرسل رابط لتأكيد طلبك إلى بريدك الإلكتروني المسجل.
diff --git a/inc/lang/ar/revisions.txt b/inc/lang/ar/revisions.txt
index 930a4ef5c..35a0bfce5 100644
--- a/inc/lang/ar/revisions.txt
+++ b/inc/lang/ar/revisions.txt
@@ -1,2 +1,3 @@
====== النسخ القديمة ======
-النسخ القديمة للصفحة الحالية. لإستعادة نسخة قديمة: أخترها من المعروض، ثم إضغط على زر "عدل هذه الصفحة" و أحفظها. \ No newline at end of file
+
+النسخ القديمة للصفحة الحالية. لإستعادة نسخة قديمة: أخترها من المعروض، ثم إضغط على زر "عدل هذه الصفحة" و أحفظها.
diff --git a/inc/lang/ar/searchpage.txt b/inc/lang/ar/searchpage.txt
index 52537c3ba..54012256a 100644
--- a/inc/lang/ar/searchpage.txt
+++ b/inc/lang/ar/searchpage.txt
@@ -1,4 +1,3 @@
====== بحث ======
نتائج البحث . @CREATEPAGEINFO@
-
diff --git a/inc/lang/ar/showrev.txt b/inc/lang/ar/showrev.txt
index 30129071c..8ec11ec74 100644
--- a/inc/lang/ar/showrev.txt
+++ b/inc/lang/ar/showrev.txt
@@ -1,2 +1,2 @@
**هذه نسخة قديمة من الصفحة!**
----- \ No newline at end of file
+----
diff --git a/inc/lang/ar/updateprofile.txt b/inc/lang/ar/updateprofile.txt
index 04a5a09d5..a3c56c534 100644
--- a/inc/lang/ar/updateprofile.txt
+++ b/inc/lang/ar/updateprofile.txt
@@ -1,3 +1,3 @@
==== تحديث بيانات حسابك ====
-عليك فقط أن تكمل كتابة الحقول التي تريد أن تغيرها . لا تستطيع تغيير اسم المستخدم . \ No newline at end of file
+عليك فقط أن تكمل كتابة الحقول التي تريد أن تغيرها . لا تستطيع تغيير اسم المستخدم .
diff --git a/inc/lang/az/admin.txt b/inc/lang/az/admin.txt
index 000caa06d..5bf09ee90 100644
--- a/inc/lang/az/admin.txt
+++ b/inc/lang/az/admin.txt
@@ -1,4 +1,3 @@
====== İdarəetmə ======
Aşağıda Dokuwiki-də mümkün olan administrativ əməliyyatların siyahısı göstərilib.
-
diff --git a/inc/lang/az/backlinks.txt b/inc/lang/az/backlinks.txt
index 72a7c858d..3c5a93b96 100644
--- a/inc/lang/az/backlinks.txt
+++ b/inc/lang/az/backlinks.txt
@@ -1,4 +1,3 @@
====== Əks linklər ======
Bu, bu səhifəyə link saxlayan səhifələrin siyahısıdır.
-
diff --git a/inc/lang/az/diff.txt b/inc/lang/az/diff.txt
index a944f84f4..200dd238c 100644
--- a/inc/lang/az/diff.txt
+++ b/inc/lang/az/diff.txt
@@ -1,4 +1,3 @@
====== Fərqlər ======
Burada bu səhifənin seçilmiş və hazırki versiyaların arasında olan fərqlər göstərilib.
-
diff --git a/inc/lang/az/index.txt b/inc/lang/az/index.txt
index dc3ffa3b0..116dd7dd6 100644
--- a/inc/lang/az/index.txt
+++ b/inc/lang/az/index.txt
@@ -1,4 +1,3 @@
====== Mündəricat ======
Burada mövcud olan səhifələr Namespace-lərə ([[doku>namespaces|namespaces]]) görə sıralanmış halda göstərilib.
-
diff --git a/inc/lang/az/login.txt b/inc/lang/az/login.txt
index e0a559bc1..a70a3f39f 100644
--- a/inc/lang/az/login.txt
+++ b/inc/lang/az/login.txt
@@ -1,4 +1,3 @@
====== Avtorizasiya ======
Hazırda Siz sistemə daxil olmamısınız. Aşağıdakı formanı istifadə edib sistemə daxil olun. //Qeyd:// cookies qurlu olmalıdır.
-
diff --git a/inc/lang/az/newpage.txt b/inc/lang/az/newpage.txt
index c749f20af..1c7ea953a 100644
--- a/inc/lang/az/newpage.txt
+++ b/inc/lang/az/newpage.txt
@@ -1,3 +1,3 @@
====== Bu səhifə hələ mövcud deyil ======
-Siz yaradılmamış səhifənin link-ini acmısınız. Əgər sizin giriş haqlarınız çatırsa, siz "Səhifəni yarat" düyməsini sixib, o səhifəni yarada bilərsiniz.
+Siz yaradılmamış səhifənin link-ini acmısınız. Əgər sizin giriş haqlarınız çatırsa, siz **Səhifəni yarat** düyməsini sixib, o səhifəni yarada bilərsiniz.
diff --git a/inc/lang/az/norev.txt b/inc/lang/az/norev.txt
index 453dad56b..42a5e25fa 100644
--- a/inc/lang/az/norev.txt
+++ b/inc/lang/az/norev.txt
@@ -1,4 +1,3 @@
====== Belə versiya mövcud deyil ======
Bu səhifənin göstərilmiş versiyası mövcud deyil. Səhifənin bütün versiyalaraının siyahısını görmək üçün, ''Səhifənin tarixçəsi'' düyməsini sıxın.
-
diff --git a/inc/lang/az/preview.txt b/inc/lang/az/preview.txt
index dbeaa44f5..377c1ba7f 100644
--- a/inc/lang/az/preview.txt
+++ b/inc/lang/az/preview.txt
@@ -1,4 +1,3 @@
====== Baxış ======
-Burda daxil elədiyiniz mətnin necə görünəcəyi göstərilir. Qeyd: mətn hələ **yadda saxlanılmayıb!**
-
+Burda daxil elədiyiniz mətnin necə görünəcəyi göstərilir. **Qeyd: mətn hələ yadda saxlanılmayıb**!
diff --git a/inc/lang/az/read.txt b/inc/lang/az/read.txt
index 39b31f108..216b2f3b7 100644
--- a/inc/lang/az/read.txt
+++ b/inc/lang/az/read.txt
@@ -1,2 +1 @@
Bu səhifəni ancaq oxumaq olar. Siz səhifənin ilkin mətninə baxa bilərsiniz, amma dəyişə bilməzsiniz. Əgər bunun düzgün olmadığını fikirləşirsinizsə onda administrator ilə əlaqə saxlayın.
-
diff --git a/inc/lang/az/recent.txt b/inc/lang/az/recent.txt
index 8766d9953..da07b70c1 100644
--- a/inc/lang/az/recent.txt
+++ b/inc/lang/az/recent.txt
@@ -1,5 +1,3 @@
====== Son dəyişiklər ======
-Bu səhifələr yaxında dəyismişdirlər.
-
-
+Bu səhifələr yaxında dəyismişdirlər:
diff --git a/inc/lang/az/searchpage.txt b/inc/lang/az/searchpage.txt
index 9bf5a5b17..c6ff57dd7 100644
--- a/inc/lang/az/searchpage.txt
+++ b/inc/lang/az/searchpage.txt
@@ -1,4 +1,3 @@
====== Axtarış ======
Qarşınızda - axtarışın nəticələridir. @CREATEPAGEINFO@
-
diff --git a/inc/lang/az/stopwords.txt b/inc/lang/az/stopwords.txt
index 04eb312eb..9c91fb3e0 100644
--- a/inc/lang/az/stopwords.txt
+++ b/inc/lang/az/stopwords.txt
@@ -62,3 +62,4 @@ səni
yaxşı
yenə
əgər
+www
diff --git a/inc/lang/az/updateprofile.txt b/inc/lang/az/updateprofile.txt
index 569e425d4..3fbc457d6 100644
--- a/inc/lang/az/updateprofile.txt
+++ b/inc/lang/az/updateprofile.txt
@@ -1,5 +1,3 @@
====== Profili yenilə ======
İstədiyiniz xanaları dəyiştirin. İstifadəşi adı dəyiştirilə bilməz.
-
-
diff --git a/inc/lang/az/wordblock.txt b/inc/lang/az/wordblock.txt
deleted file mode 100644
index ec8b102af..000000000
--- a/inc/lang/az/wordblock.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-====== SPAM-ın qarşısı alındı ======
-
-Sizin dəyişiklər **yaddaşa saxlanmadı**, çünki onların içində bir və ya daha çox içazəsiz sözlər var idi. Əgər siz wiki-yə spam əlavə etmək istəyirdinizsə, onda utanmırsız?! Əgər siz bunu səhv hesab edirsinizsə, onda administrator ilə əlaqə saxlayın.
diff --git a/inc/lang/be/admin.txt b/inc/lang/be/admin.txt
index 40fc5fbcd..130d5f2b3 100644
--- a/inc/lang/be/admin.txt
+++ b/inc/lang/be/admin.txt
@@ -1,3 +1,3 @@
====== Кіраванне ======
-Ніжэй вы зможаце знайсці спіс адміністрацыйных аперацый, даступных у «ДокуВікі». \ No newline at end of file
+Ніжэй вы зможаце знайсці спіс адміністрацыйных аперацый, даступных у «ДокуВікі».
diff --git a/inc/lang/be/backlinks.txt b/inc/lang/be/backlinks.txt
new file mode 100644
index 000000000..b4978a80e
--- /dev/null
+++ b/inc/lang/be/backlinks.txt
@@ -0,0 +1,3 @@
+====== Зваротныя спасылкі ======
+
+Гэта спіс старонак, якія спасылаюцца на дадзеную старонку.
diff --git a/inc/lang/be/conflict.txt b/inc/lang/be/conflict.txt
new file mode 100644
index 000000000..f0df9fd22
--- /dev/null
+++ b/inc/lang/be/conflict.txt
@@ -0,0 +1,5 @@
+====== Існуе больш новая версія ======
+
+Існуе больш новая версія дакумента, які вы рэдагавалі. Такое здараецца, калі іншы карыстальнік змяніў дакумент, пакуль вы рабілі тое ж самае.
+
+Уважліва вывучыце адрозненні, прыведзеныя ніжэй, і вырашыце, якую версію пакінуць. Калі вы вылучыце «Захаваць», то ваша версія будзе захавана. Націснуўшы на кнопку «Адмяніць», вы пакінеце дадзеную версію.
diff --git a/inc/lang/be/denied.txt b/inc/lang/be/denied.txt
new file mode 100644
index 000000000..b53628bbb
--- /dev/null
+++ b/inc/lang/be/denied.txt
@@ -0,0 +1,3 @@
+====== Доступ забаронены ======
+
+Прабачце, у вас не хапае правоў для гэтага дзеяння.
diff --git a/inc/lang/be/diff.txt b/inc/lang/be/diff.txt
new file mode 100644
index 000000000..824d0e915
--- /dev/null
+++ b/inc/lang/be/diff.txt
@@ -0,0 +1,3 @@
+====== Адрозненні ======
+
+Тут паказаны адрозненні паміж двума версіямі гэтай старонкі.
diff --git a/inc/lang/be/draft.txt b/inc/lang/be/draft.txt
new file mode 100644
index 000000000..dfce0ae90
--- /dev/null
+++ b/inc/lang/be/draft.txt
@@ -0,0 +1,5 @@
+====== Знойдзены чарнавік ======
+
+Апошні раз рэдагаванне гэтай старонкі не было карэктна завершана. Падчас вашай працы быў аўтаматычна захаваны чарнавік, які вы зараз можаце аднавіць і працягнуць перапыненую праўку. Ніжэй вы бачыце аўтаматычна захаваную версію.
+
+Калі ласка, вырашыце, ці вы хочаце //аднавіць// страчаную версію, //выдаліць// чарнавік, або //адмяніць// рэдагаванне.
diff --git a/inc/lang/be/edit.txt b/inc/lang/be/edit.txt
new file mode 100644
index 000000000..b9c4473a5
--- /dev/null
+++ b/inc/lang/be/edit.txt
@@ -0,0 +1 @@
+Адрэдагуйце старонку і націсніце «Захаваць». Прачытайце [[wiki:syntax|старонку дапамогі]] для азнаямлення з сінтаксісам вікі. Калі ласка, рэдагуйце толькі ў тым выпадку, калі плануеце **палепшыць** змесціва. Калі вы проста хочаце патэставаць што-небудзь, скарыстайцеся адмысловай старонкай: [[playground:playground]].
diff --git a/inc/lang/be/editrev.txt b/inc/lang/be/editrev.txt
new file mode 100644
index 000000000..1e4afbad9
--- /dev/null
+++ b/inc/lang/be/editrev.txt
@@ -0,0 +1,2 @@
+**Вы загрузілі старую рэвізію дакумента!** Захаваўшы яе, вы створыце новую дадзеную версію з гэтым змесцівам.
+----
diff --git a/inc/lang/be/index.txt b/inc/lang/be/index.txt
new file mode 100644
index 000000000..4a4f0398e
--- /dev/null
+++ b/inc/lang/be/index.txt
@@ -0,0 +1,3 @@
+====== Змест ======
+
+Перад вамі спіс даступных старонак, спарадкаваны па [[doku>namespaces|прасторах імёнаў]].
diff --git a/inc/lang/be/install.html b/inc/lang/be/install.html
new file mode 100644
index 000000000..6644f8b1c
--- /dev/null
+++ b/inc/lang/be/install.html
@@ -0,0 +1,7 @@
+<p>Гэтая старонка прызначана дапамагчы ў першапачатковай ўсталёўцы і канфігурацыі «<a href="http://www.dokuwiki.org/">ДокуВики</a>». Дадатковая інфармацыя аб праграме ўстаноўкі даступная на яе <a href="http://www.dokuwiki.org/ru:installer">старонцы дакументацыі</a>.</p>
+
+<p>«ДокуВики» выкарыстоўвае звычайныя файлы для захоўвання старонак і дадатковай інфармацыі (напрыклад, малюнкаў, пошукавага індэкса, папярэдніх версій старонкі, і г. д.). Для паспяховай працы «ДокуВики» <strong>неабходны</strong> доступ на запіс да дырэкторый з гэтымі файламі. Дадзеная праграма ўсталявання не можа самастойна змяняць сістэмныя правы доступу да дырэкторый. Звычайна гэта робіцца непасрэдна з каманднага радка (shell), або, калі вы выкарыстоўваеце аддалены хостынг, праз FTP або панэль кіравання свайго хостынгу (напрыклад, cPanel).</p>
+
+<p>Праграма ўстаноўкі ўключыць выкарыстанне спісаў кантролю доступу (<abbr title="access control list">ACL</abbr>) у вашай «ДокуВики». Гэта дазволіць адміністратара, пасля аўтарызацыі ў «ДокуВики», выкарыстоўваць спецыяльнае меню для ўстаноўкі убудоў, кіравання карыстальнікамі і доступам да старонак вікі, а таксама для налады канфігурацыйных параметраў. Спісы кантролю доступу не абавязковыя для працы «ДокуВики», аднак яны дазваляюць спрасціць кіраванне вашай «ДокуВики».</p>
+
+<p>Дасведчаным карыстальнікам і карыстальнікам са спецыяльнымі патрабаваннямі да ўстаноўцы рэкамендуецца звярнуцца па наступных спасылках для ўдакладнення падрабязнасьцяў <a href="http://www.dokuwiki.org/ru:install">працэсу ўстаноўкі</a> і <a href="http://www.dokuwiki.org/ru:config">параметраў канфігурацыі</a>.</p>
diff --git a/inc/lang/be/jquery.ui.datepicker.js b/inc/lang/be/jquery.ui.datepicker.js
new file mode 100644
index 000000000..7d96dd1da
--- /dev/null
+++ b/inc/lang/be/jquery.ui.datepicker.js
@@ -0,0 +1,37 @@
+/* Belarusian initialisation for the jQuery UI date picker plugin. */
+/* Written by Pavel Selitskas <p.selitskas@gmail.com> */
+( function( factory ) {
+ if ( typeof define === "function" && define.amd ) {
+
+ // AMD. Register as an anonymous module.
+ define( [ "../widgets/datepicker" ], factory );
+ } else {
+
+ // Browser globals
+ factory( jQuery.datepicker );
+ }
+}( function( datepicker ) {
+
+datepicker.regional.be = {
+ closeText: "Зачыніць",
+ prevText: "&larr;Папяр.",
+ nextText: "Наст.&rarr;",
+ currentText: "Сёньня",
+ monthNames: [ "Студзень","Люты","Сакавік","Красавік","Травень","Чэрвень",
+ "Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Сьнежань" ],
+ monthNamesShort: [ "Сту","Лют","Сак","Кра","Тра","Чэр",
+ "Ліп","Жні","Вер","Кас","Ліс","Сьн" ],
+ dayNames: [ "нядзеля","панядзелак","аўторак","серада","чацьвер","пятніца","субота" ],
+ dayNamesShort: [ "ндз","пнд","аўт","срд","чцв","птн","сбт" ],
+ dayNamesMin: [ "Нд","Пн","Аў","Ср","Чц","Пт","Сб" ],
+ weekHeader: "Тд",
+ dateFormat: "dd.mm.yy",
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: "" };
+datepicker.setDefaults( datepicker.regional.be );
+
+return datepicker.regional.be;
+
+} ) );
diff --git a/inc/lang/be/lang.php b/inc/lang/be/lang.php
new file mode 100644
index 000000000..2e8e7dd9b
--- /dev/null
+++ b/inc/lang/be/lang.php
@@ -0,0 +1,357 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ */
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['doublequoteopening'] = '«';
+$lang['doublequoteclosing'] = '»';
+$lang['singlequoteopening'] = '„';
+$lang['singlequoteclosing'] = '“';
+$lang['apostrophe'] = '’';
+$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_newer'] = '<< больш за новыя';
+$lang['btn_older'] = 'больш старыя >>';
+$lang['btn_revs'] = 'Гісторыя старонкі';
+$lang['btn_recent'] = 'Нядаўнія змены';
+$lang['btn_upload'] = 'Загрузіць';
+$lang['btn_cancel'] = 'Адмяніць';
+$lang['btn_index'] = 'Усе старонкі';
+$lang['btn_secedit'] = 'Кіраваць';
+$lang['btn_login'] = 'Увайсці';
+$lang['btn_logout'] = 'Выйсці';
+$lang['btn_admin'] = 'Кіраванне';
+$lang['btn_update'] = 'Абнавіць';
+$lang['btn_delete'] = 'Выдаліць';
+$lang['btn_back'] = 'Назад';
+$lang['btn_backlink'] = 'Спасылкі сюды';
+$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['btn_media'] = 'Кіраванне медыяфайлы';
+$lang['btn_deleteuser'] = 'Выдаліць мой рахунак';
+$lang['btn_img_backto'] = 'Вярнуцца да %s';
+$lang['btn_mediaManager'] = 'Прагляд у «кіраванні медыяфайлы»';
+$lang['loggedinas'] = 'Зайшлі як';
+$lang['user'] = 'Імя карыстальніка';
+$lang['pass'] = 'Пароль';
+$lang['newpass'] = 'Новы пароль';
+$lang['oldpass'] = 'калі ласка, Увядзіце бягучы пароль';
+$lang['passchk'] = 'паспрабуйце';
+$lang['remember'] = 'Запомніць мяне';
+$lang['fullname'] = 'Поўнае імя';
+$lang['email'] = 'Эл. адрас';
+$lang['profile'] = 'Профіль карыстальніка';
+$lang['badlogin'] = 'Прабачце, няправільнае імя карыстальніка або пароль.';
+$lang['badpassconfirm'] = 'Прабачце, пароль няправільны';
+$lang['minoredit'] = 'Нязначныя змены';
+$lang['draftdate'] = 'захаваны Чарнавік';
+$lang['nosecedit'] = 'За гэты час старонка была зменена і інфармацыя аб секцыі састарэла. Загружана поўная версія старонкі.';
+$lang['searchcreatepage'] = 'Калі вы не знайшлі тое, што шукалі, то можаце стварыць або змяніць старонку %s, названую адпаведна вашаму запыту.';
+$lang['search_fullresults'] = 'Вынікі паўнатэкставага пошуку';
+$lang['js']['search_toggle_tools'] = 'Налада пошуку';
+$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']['mediainsert'] = 'Уставіць';
+$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'] = 'Спасылка на сеткавыя каталогі Windows працуе толькі з MS Internet Explorer, але вы можаце скапіяваць спасылку.';
+$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['search_exact_match'] = 'Дакладнае адпаведнасць';
+$lang['search_starts_with'] = 'Пачынаецца на';
+$lang['search_ends_with'] = 'Заканчваецца';
+$lang['search_contains'] = 'Ўтрымлівае';
+$lang['search_custom_match'] = 'Зададзена карыстальнікам';
+$lang['search_any_ns'] = 'Любы прастору імёнаў';
+$lang['search_any_time'] = 'Любы час';
+$lang['search_past_7_days'] = 'Мінулая тыдзень';
+$lang['search_past_month'] = 'Мінулы месяц';
+$lang['search_past_year'] = 'Мінулы год';
+$lang['search_sort_by_hits'] = 'Сартаваць па хітам';
+$lang['search_sort_by_mtime'] = 'Сартаваць па апошняга змены';
+$lang['regmissing'] = 'Прабачце, вам варта запоўніць усе палі.';
+$lang['reguexists'] = 'Прабачце, карыстальнік з такім лагінам ужо існуе.';
+$lang['regsuccess'] = 'Карыстальнік створаны; пароль высланы на адрас электроннай пошты.';
+$lang['regsuccess2'] = 'Карыстальнік створаны.';
+$lang['regfail'] = 'Карыстальнік не можа быць створаны.';
+$lang['regmailfail'] = 'Падобна на тое ёсць праблема з адпраўкай пароля па пошце. Калі ласка, паведаміце аб гэтым адміністратару!';
+$lang['regbadmail'] = 'Дадзены вамі адрас электроннай пошты выглядае няправільным. Калі вы лічыце гэта памылкай, паведаміце адміністратару.';
+$lang['regbadpass'] = 'Два уведзеных пароля не супадаюць. Калі ласка, паспрабуйце яшчэ раз.';
+$lang['regpwmail'] = 'Ваш пароль для сістэмы «Докувики»';
+$lang['reghere'] = 'У вас яшчэ няма акаўнта? Зарэгіструйцеся';
+$lang['profna'] = 'Гэтая вікі не падтрымлівае змяненне профілю';
+$lang['profnochange'] = 'Зменаў не было ўнесена, профіль не абноўлены.';
+$lang['profnoempty'] = 'Лагін і адрас электроннай пошты не могуць быць пустымі.';
+$lang['profchanged'] = 'Профіль карыстальніка паспяхова абноўлены.';
+$lang['profnodelete'] = 'Гэтая вікі не падтрымлівае выдаленне карыстальнікаў.';
+$lang['profdeleteuser'] = 'Выдаліць рахунак';
+$lang['profdeleted'] = 'Ваш уліковы запіс быў выдалены з гэтай вікі';
+$lang['profconfdelete'] = 'Я хачу, каб выдаліць свой рахунак з гэтай вікі.<br />Гэта дзеянне незваротна.';
+$lang['profconfdeletemissing'] = 'Сцяжок пацверджання не ўстаноўлены';
+$lang['proffail'] = 'Профіль карыстальніка не быў абноўлены.';
+$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['maxuploadsize'] = 'Макс. памер загружанага файла %s.';
+$lang['lockedby'] = 'У дадзены момант заблакавана карыстальнікам';
+$lang['lockexpire'] = 'Блакаванне заканчваецца ў';
+$lang['rssfailed'] = 'Адбылася памылка пры атрыманні наступнай навіннай стужкі: ';
+$lang['nothingfound'] = 'Нічога не знойдзена.';
+$lang['mediaselect'] = 'Выбар медиафайла';
+$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['mediafiles'] = 'Даступныя файлы';
+$lang['accessdenied'] = 'Вы не можаце праглядзець гэтую старонку.';
+$lang['mediausage'] = 'Для спасылкі на гэты файл выкарыстоўвайце наступны сінтаксіс:';
+$lang['mediaview'] = 'Паглядзець зыходны файл';
+$lang['mediaroot'] = 'корань';
+$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['difflink'] = 'Спасылка на гэта параўнанне';
+$lang['diff_type'] = 'Паглядзець адрозненні';
+$lang['diff_inline'] = 'ўнутры тэксту';
+$lang['diff_side'] = 'двума калонкамі';
+$lang['diffprevrev'] = 'Папярэдняя версія';
+$lang['diffnextrev'] = 'Наступная версія';
+$lang['difflastrev'] = 'Апошняя версія';
+$lang['diffbothprevrev'] = 'Папярэдняя версія справа і злева';
+$lang['diffbothnextrev'] = 'Наступная версія справа і злева';
+$lang['line'] = 'Радок';
+$lang['breadcrumb'] = 'Вы наведалі:';
+$lang['youarehere'] = 'Вы знаходзіцеся тут:';
+$lang['lastmod'] = 'Апошнія змены:';
+$lang['by'] = ' —';
+$lang['deleted'] = 'выдаленае';
+$lang['created'] = 'створана';
+$lang['restored'] = 'старая версія адноўлена (%s)';
+$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['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'] = 'медыяфайлаў';
+$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_smileys'] = 'Смайлікі';
+$lang['qb_chars'] = 'Спецыяльныя сімвалы';
+$lang['upperns'] = 'Перайсці ў бацькоўскі прастору імёнаў';
+$lang['metaedit'] = 'Рэдагаваць метададзеныя';
+$lang['metasaveerr'] = 'Памылка запісу метададзеных';
+$lang['metasaveok'] = 'Метададзеныя захаваныя';
+$lang['img_title'] = 'Назва:';
+$lang['img_caption'] = 'Подпіс:';
+$lang['img_date'] = 'Дата:';
+$lang['img_fname'] = 'Імя файла:';
+$lang['img_fsize'] = 'Памер:';
+$lang['img_artist'] = 'Фатограф';
+$lang['img_copyr'] = 'Аўтарскія правы:';
+$lang['img_format'] = 'памер ліста:';
+$lang['img_camera'] = 'Мадэль камеры:';
+$lang['img_keywords'] = 'Ключавыя словы:';
+$lang['img_width'] = 'Шырыня:';
+$lang['img_height'] = 'Вышыня:';
+$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_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'] = 'інфармацыйнае электронны ліст са спісам змен для кожнай старонкі (кожныя %.2f рн.)';
+$lang['subscr_style_list'] = 'спіс змененых старонак з часу апошняга адпраўленага электроннага ліста (кожныя %.2f рн.)';
+$lang['authtempfail'] = 'Аўтэнтыфікацыя карыстальнікаў часова недаступная. Калі праблема працягваецца якое-то час, калі ласка, паведаміце аб гэтым адміністратару вікі.';
+$lang['i_chooselang'] = 'Выберыце свой мову / Choose your language';
+$lang['i_installer'] = 'Ўстаноўка «Докувики»';
+$lang['i_wikiname'] = 'Назва вікі';
+$lang['i_enableacl'] = 'Дазволіць абмежаванне правоў доступу (рэкамендуецца)';
+$lang['i_superuser'] = 'Адміністратар';
+$lang['i_problems'] = 'Праграма ўстаноўкі сутыкнулася з праблемамі, пералічанымі ніжэй. Каб працягнуць, вам неабходна іх ліквідаваць. ';
+$lang['i_modified'] = 'З меркаванняў бяспекі гэтая праграма запускаецца толькі на новай, нязменным ўсталёўцы «Докувики».
+ Вам трэба альбо зноўку распакаваць запампаваны пакет ўстаноўкі, альбо звярнуцца да поўнай
+<a href="http://www.dokuwiki.org/install">інструкцыі па ўсталёўцы «Докувики»</a>';
+$lang['i_funcna'] = 'Функцыя PHP <code>%s</code> недаступная. Можа быць, яна па якой-то прычыне заблакаваная вашым хостэрам?';
+$lang['i_phpver'] = 'Ваша версія PHP (<code>%s</code>) ніжэй патрабаванай (<code>%s</code>). Вам неабходна абнавіць ўсталяваную версію PHP.';
+$lang['i_mbfuncoverload'] = 'Для запуску «Докувики» неабходна адключыць параметр mbstring.func_overload ў php.ini';
+$lang['i_permfail'] = '<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_badval'] = '<code>%s</code> — недапушчальнае або пустое значэнне';
+$lang['i_success'] = 'Канфігурацыя прайшла паспяхова. Цяпер вы можаце выдаліць файл install.php. Пераходзіце да
+<a href="doku.php?id=wiki:welcome">сваёй новай «Докувики»</a>.';
+$lang['i_failure'] = 'Пры запісу ў файлы канфігурацыі былі выяўленыя памылкі. Магчыма, вам прыйдзецца выправіць іх уручную, перш чым вы зможаце выкарыстоўваць <a href="doku.php?id=wiki:welcome">сваю новую «Докувики»</a>.';
+$lang['i_policy'] = 'Зыходная палітыка правоў доступу';
+$lang['i_pol0'] = 'Адкрытая вікі (чытанне, запіс, загрузка файлаў для ўсіх)';
+$lang['i_pol1'] = 'Агульнадаступная вікі (чытанне для ўсіх, запіс і загрузка файлаў для зарэгістраваных карыстальнікаў)';
+$lang['i_pol2'] = 'Закрытая вікі (чытанне, запіс і загрузка файлаў толькі для зарэгістраваных карыстальнікаў)';
+$lang['i_allowreg'] = 'Дазволіць карыстальнікам самастойна рэгістравацца';
+$lang['i_retry'] = 'Паўтарыць';
+$lang['i_license'] = 'калі Ласка, выберыце тып ліцэнзіі для сваёй вікі';
+$lang['i_license_none'] = 'Не адлюстроўваць інфармацыю аб ліцэнзіі';
+$lang['i_pop_field'] = 'калі Ласка, дапамажыце нам палепшыць «Докувики»:';
+$lang['i_pop_label'] = 'Адпраўляць раз у месяц ананімную карыстацкую інфармацыю распрацоўнікам «Докувики»';
+$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'] = 'Аднавіць гэтую версію';
+$lang['media_acl_warning'] = 'Гэты спіс можа быць няпоўным з-за абмежаванняў спісаў кантролю доступу (ACL) і схаваных старонак.';
+$lang['currentns'] = 'Бягучае прастору імёнаў';
+$lang['searchresult'] = 'Вынікі пошуку';
+$lang['plainhtml'] = 'Просты HTML';
+$lang['wikimarkup'] = 'вікі-разметка';
+$lang['page_nonexist_rev'] = 'Гэтая старонка яшчэ не існавала %s. Яна была створана <a href="%s">%s</a>.';
+$lang['unable_to_parse_date'] = 'Немагчыма апрацаваць параметр "%s".';
+$lang['email_signature_text'] = 'Гэты ліст створана «Докувики» з сайта
+@DOKUWIKIURL@';
diff --git a/inc/lang/be/locked.txt b/inc/lang/be/locked.txt
new file mode 100644
index 000000000..69c2ee783
--- /dev/null
+++ b/inc/lang/be/locked.txt
@@ -0,0 +1,3 @@
+====== Старонка заблакаваная ======
+
+Гэтая старонка ў дадзены момант заблякаваная для рэдагавання іншым карыстальнікам. Вам давядзецца пачакаць, пакуль гэты карыстальнік скончыць рэдагаванне або скончыцца час блакавання.
diff --git a/inc/lang/be/login.txt b/inc/lang/be/login.txt
new file mode 100644
index 000000000..541a699be
--- /dev/null
+++ b/inc/lang/be/login.txt
@@ -0,0 +1,3 @@
+====== Аўтарызацыя ======
+
+У дадзены момант вы не ў сістэме. Авторизируйтесь пры дапамозе наступнай формы. //Заўвагу:// для працы ў вас павінны быць уключаны куки (cookies).
diff --git a/inc/lang/be/mailtext.txt b/inc/lang/be/mailtext.txt
new file mode 100644
index 000000000..77073332f
--- /dev/null
+++ b/inc/lang/be/mailtext.txt
@@ -0,0 +1,12 @@
+У вашай вікі была дададзеная або зменена старонка. Падрабязнасці:
+
+Дата: @DATE@
+Браўзэр: @BROWSER@
+IP-адрас: @IPADDRESS@
+Хост: @HOSTNAME@
+Старая версія: @OLDPAGE@
+Новая версія: @NEWPAGE@
+Зводка змяненняў: @SUMMARY@
+Карыстальнік: @USER@
+
+@DIFF@
diff --git a/inc/lang/be/newpage.txt b/inc/lang/be/newpage.txt
new file mode 100644
index 000000000..eca0728f5
--- /dev/null
+++ b/inc/lang/be/newpage.txt
@@ -0,0 +1,3 @@
+====== Гэтая старонка яшчэ не існуе ======
+
+Вы перайшлі па спасылцы на тэму, для якой яшчэ не створана старонка. Калі дазваляюць вашы правы доступу, вы можаце стварыць яе, націснуўшы на кнопку **Стварыць старонку**.
diff --git a/inc/lang/be/norev.txt b/inc/lang/be/norev.txt
new file mode 100644
index 000000000..95b9aef18
--- /dev/null
+++ b/inc/lang/be/norev.txt
@@ -0,0 +1,3 @@
+====== Такой версіі не існуе ======
+
+Паказаная версія старонкі не існуе. Націсніце на кнопку «Гісторыя старонкі», каб атрымаць спіс даступных папярэдніх версій гэтага дакумента.
diff --git a/inc/lang/be/password.txt b/inc/lang/be/password.txt
new file mode 100644
index 000000000..57ad82ab3
--- /dev/null
+++ b/inc/lang/be/password.txt
@@ -0,0 +1,6 @@
+Добры дзень, @FULLNAME@!
+
+Вашы дадзеныя для @TITLE@ (@DOKUWIKIURL@)
+
+Лагін: @LOGIN@
+Пароль: @PASSWORD@
diff --git a/inc/lang/be/preview.txt b/inc/lang/be/preview.txt
new file mode 100644
index 000000000..30c198fb6
--- /dev/null
+++ b/inc/lang/be/preview.txt
@@ -0,0 +1,3 @@
+====== Прагляд ======
+
+Тут паказана, як ваш тэкст будзе выглядаць. **Увага: тэкст яшчэ не захаваны**!
diff --git a/inc/lang/be/pwconfirm.txt b/inc/lang/be/pwconfirm.txt
new file mode 100644
index 000000000..1469d2c26
--- /dev/null
+++ b/inc/lang/be/pwconfirm.txt
@@ -0,0 +1,9 @@
+Добры дзень, @FULLNAME@.
+
+Хто-то запрасіў новы пароль для ўваходу ў @TITLE@ па адрасе @DOKUWIKIURL@
+
+Калі вы не запытвалі новы пароль, проста праігнаруйце гэты ліст.
+
+Для пацверджання, што запыт быў сапраўды зроблены вамі, калі ласка, перайдзіце па наступнай спасылцы.
+
+@CONFIRM@
diff --git a/inc/lang/be/read.txt b/inc/lang/be/read.txt
new file mode 100644
index 000000000..fe29bd574
--- /dev/null
+++ b/inc/lang/be/read.txt
@@ -0,0 +1 @@
+Гэтая старонка толькі для чытання. Вы можаце паглядзець яе зыходны тэкст, але не можаце яго змяніць. Паведаміце адміністратару, калі лічыце, што гэта няправільна.
diff --git a/inc/lang/be/recent.txt b/inc/lang/be/recent.txt
new file mode 100644
index 000000000..50805f3a9
--- /dev/null
+++ b/inc/lang/be/recent.txt
@@ -0,0 +1,3 @@
+====== Нядаўнія змены ======
+
+Наступныя старонкі былі нядаўна зменены:
diff --git a/inc/lang/be/register.txt b/inc/lang/be/register.txt
new file mode 100644
index 000000000..a7cdd87f4
--- /dev/null
+++ b/inc/lang/be/register.txt
@@ -0,0 +1,3 @@
+====== Рэгістрацыя новага карыстальніка ======
+
+Для рэгістрацыі ў вікі запоўніце ўсе палі ніжэй. Звярніце ўвагу на **правільнасць адрасы электроннай пошты** — туды будзе высланы пароль у тым выпадку, калі вас не просяць самастойна ўвесці яго тут. Лагін павінен задавальняць абмежаванням для [[doku>ru:pagename|ідэнтыфікатара старонкі]].
diff --git a/inc/lang/be/registermail.txt b/inc/lang/be/registermail.txt
new file mode 100644
index 000000000..15bd810d8
--- /dev/null
+++ b/inc/lang/be/registermail.txt
@@ -0,0 +1,10 @@
+Быў зарэгістраваны новы карыстальнік. Падрабязнасці:
+
+Лагін: @NEWUSER@
+Поўнае імя: @NEWNAME@
+Эл. адрас: @NEWEMAIL@
+
+Дата: @DATE@
+Браўзэр: @BROWSER@
+Адрас IP: @IPADDRESS@
+Хост: @HOSTNAME@
diff --git a/inc/lang/be/resendpwd.txt b/inc/lang/be/resendpwd.txt
new file mode 100644
index 000000000..fd9e6a0d8
--- /dev/null
+++ b/inc/lang/be/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Выслаць новы пароль ======
+
+Для атрымання новага пароля калі ласка, увядзіце ваш лагін. Ваш новы пароль будзе адпраўлены па адрасе электроннай пошты, зарэгістраванаму на ваша імя.
diff --git a/inc/lang/be/resetpwd.txt b/inc/lang/be/resetpwd.txt
new file mode 100644
index 000000000..8b12fd8d7
--- /dev/null
+++ b/inc/lang/be/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Ўстаноўка новага пароля ======
+
+Калі ласка, увядзіце новы пароль для вашага ўліковага запісу ў гэтай вікі.
diff --git a/inc/lang/be/revisions.txt b/inc/lang/be/revisions.txt
new file mode 100644
index 000000000..818bd7f19
--- /dev/null
+++ b/inc/lang/be/revisions.txt
@@ -0,0 +1,3 @@
+====== Гісторыя старонкі ======
+
+Перад вамі гісторыя правак бягучага дакумента. Каб вярнуцца да адной з папярэдніх версій, абярыце патрэбную, націсніце «Рэдагаваць старонку» і захавайце яе.
diff --git a/inc/lang/be/searchpage.txt b/inc/lang/be/searchpage.txt
new file mode 100644
index 000000000..0c20b484d
--- /dev/null
+++ b/inc/lang/be/searchpage.txt
@@ -0,0 +1,3 @@
+====== Пошук ======
+
+Перад вамі вынікі пошуку. @CREATEPAGEINFO@
diff --git a/inc/lang/be/showrev.txt b/inc/lang/be/showrev.txt
new file mode 100644
index 000000000..60ee85b19
--- /dev/null
+++ b/inc/lang/be/showrev.txt
@@ -0,0 +1,2 @@
+**Гэта старая версія дакумента!**
+----
diff --git a/inc/lang/be/stopwords.txt b/inc/lang/be/stopwords.txt
new file mode 100644
index 000000000..694e8e5ea
--- /dev/null
+++ b/inc/lang/be/stopwords.txt
@@ -0,0 +1,80 @@
+# Гэта сьпіс словаў, якія индексатор ігнаруе, па адным слове ў радку
+# Пры рэдагаванні гэтага файла абавязкова выкарыстоўвайце заканчэння радкоў UNIX (толькі newline)
+# Не трэба ўключаць словы карацей 3 сімвалаў - яны ігнаруюцца ў любым выпадку
+адзін
+адна
+амаль
+больш
+будзе
+была
+было
+быццам
+быць
+вядома
+гэтага
+гэтай
+гэты
+добра
+жизня
+жыццё
+заўсёды
+здаецца
+зноў
+зрэшты
+зусім
+казала
+казаў
+калі
+ледзь
+лепш
+менш
+можа
+можна
+мяне
+нават
+навошта
+нарэшце
+небудзь
+нельга
+ніколі
+нічога
+паміж
+пасля
+перад
+потым
+праз
+раптам
+сабе
+сваю
+свая
+сваё
+свой
+сказала
+сказаць
+сказаў
+сябе
+сёння
+таго
+тады
+такая
+такое
+такой
+таксама
+таму
+толькі
+трэба
+усяго
+усіх
+хоць
+хіба
+цябе
+цяпер
+чаго
+часам
+шмат
+якая
+якое
+ёсць
+іншая
+іншы
+www
diff --git a/inc/lang/be/subscr_digest.txt b/inc/lang/be/subscr_digest.txt
new file mode 100644
index 000000000..0a81d192c
--- /dev/null
+++ b/inc/lang/be/subscr_digest.txt
@@ -0,0 +1,12 @@
+Прывітанне!
+
+Старонка @PAGE@ у вікі @TITLE@ змянілася. Спіс змен:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Старая версія: @OLDPAGE@
+Новая версія: @NEWPAGE@
+
+Каб адпісацца ад апавяшчэнняў аб зменах, ўвайдзіце ў вікі @DOKUWIKIURL@ ў раздзел @SUBSCRIBE@ і адмяніце падпіску на старонку і/або прастору імёнаў.
diff --git a/inc/lang/be/subscr_form.txt b/inc/lang/be/subscr_form.txt
new file mode 100644
index 000000000..93732dae9
--- /dev/null
+++ b/inc/lang/be/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Кіраванне падпіскамі ======
+
+Тут вы можаце кіраваць падпіскамі для дадзенай старонкі і прасторы імёнаў.
diff --git a/inc/lang/be/subscr_list.txt b/inc/lang/be/subscr_list.txt
new file mode 100644
index 000000000..1cc646b7e
--- /dev/null
+++ b/inc/lang/be/subscr_list.txt
@@ -0,0 +1,9 @@
+Прывітанне!
+
+Старонкі ў прасторы імёнаў @PAGE@ у вікі @TITLE@ былі змененыя. Спіс новых старонак:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Каб адпісацца ад апавяшчэнняў аб зменах, ўвайдзіце ў вікі @DOKUWIKIURL@ ў раздзел @SUBSCRIBE@ і адмяніце падпіску на старонку і/або прастору імёнаў.
diff --git a/inc/lang/be/subscr_single.txt b/inc/lang/be/subscr_single.txt
new file mode 100644
index 000000000..70c4a4d1e
--- /dev/null
+++ b/inc/lang/be/subscr_single.txt
@@ -0,0 +1,16 @@
+Прывітанне!
+
+Старонка @PAGE@ у вікі @TITLE@ змянілася.
+Спіс змен:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Дата: @DATE@
+Аўтар: @USER@
+Заўвага: @SUMMARY@
+Старая версія: @OLDPAGE@
+Новая версія: @NEWPAGE@
+
+Каб адпісацца ад апавяшчэнняў аб зменах, ўвайдзіце ў вікі @DOKUWIKIURL@ ў раздзел @SUBSCRIBE@ і адмяніце падпіску на старонку і/або прастору імёнаў.
diff --git a/inc/lang/be/updateprofile.txt b/inc/lang/be/updateprofile.txt
new file mode 100644
index 000000000..6f767d135
--- /dev/null
+++ b/inc/lang/be/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Абнавіць профіль ======
+
+Неабходна запоўніць толькі тыя палі, якія вы хочаце змяніць. Ваш лагін не можа быць зменены.
diff --git a/inc/lang/be/uploadmail.txt b/inc/lang/be/uploadmail.txt
new file mode 100644
index 000000000..77030458c
--- /dev/null
+++ b/inc/lang/be/uploadmail.txt
@@ -0,0 +1,11 @@
+У вашу вікі быў запампаваны файл. Падрабязная інфармацыя:
+
+Файл: @MEDIA@
+Старая версія: @OLD@
+Дата: @DATE@
+Браўзэр: @BROWSER@
+Адрас IP: @IPADDRESS@
+Хост: @HOSTNAME@
+Памер: @SIZE@
+Тып MIME: @MIME@
+Карыстальнік: @USER@
diff --git a/inc/lang/bg/admin.txt b/inc/lang/bg/admin.txt
index d3c14a0da..3f0a73a28 100644
--- a/inc/lang/bg/admin.txt
+++ b/inc/lang/bg/admin.txt
@@ -1,3 +1,3 @@
====== Администриране ======
-Отдолу ще намерите списъка с администраторските задачи в DokuWiki. \ No newline at end of file
+Отдолу ще намерите списъка с администраторските задачи в DokuWiki.
diff --git a/inc/lang/bg/conflict.txt b/inc/lang/bg/conflict.txt
index 8c62a3787..af6f86eb9 100644
--- a/inc/lang/bg/conflict.txt
+++ b/inc/lang/bg/conflict.txt
@@ -3,4 +3,3 @@
Съществува по-нова версия на документа, който сте редактирали. Това се случва когато друг потребител е променил документа докато сте го редактирали.
Разгледайте внимателно разликите, след това решете коя версия да бъде запазена. Ако натиснете ''Запис'', ще бъде запазена вашата версия. Натиснете ли ''Отказ'', ще бъде запазена текущата версия.
-
diff --git a/inc/lang/bg/denied.txt b/inc/lang/bg/denied.txt
index bd695d46d..7010090d9 100644
--- a/inc/lang/bg/denied.txt
+++ b/inc/lang/bg/denied.txt
@@ -1,4 +1,3 @@
====== Отказан достъп ======
Нямате достатъчно права, за да продължите.
-
diff --git a/inc/lang/bg/draft.txt b/inc/lang/bg/draft.txt
index a59201130..2869cc8bd 100644
--- a/inc/lang/bg/draft.txt
+++ b/inc/lang/bg/draft.txt
@@ -3,4 +3,3 @@
Последната редакционна сесия на страницата не е завършена правилно. Dokuwiki автоматично запазва чернова по време на редактирането, която можете да ползвате сега, за да продължите работата си. Отдолу може да видите данните, които бяха запазени от последната сесия.
Моля решете, дали искате да //възстановите// последната си редакционна сесия, //изтриете// автоматично запазената чернова или //откажете// редакцията.
-
diff --git a/inc/lang/bg/edit.txt b/inc/lang/bg/edit.txt
index 086d9978e..2fa159981 100644
--- a/inc/lang/bg/edit.txt
+++ b/inc/lang/bg/edit.txt
@@ -1,2 +1 @@
Редактирайте и натиснете ''Запис''. За информация относно ползвания синтаксис прочетете [[wiki:syntax]]. Моля, редактирайте само когато може да **подобрите** съдържанието. Ако ще пробвате разни неща, може да експериментирате в [[playground:playground|пясъчника]].
-
diff --git a/inc/lang/bg/index.txt b/inc/lang/bg/index.txt
index 7dabac6af..b92583dca 100644
--- a/inc/lang/bg/index.txt
+++ b/inc/lang/bg/index.txt
@@ -1,4 +1,3 @@
====== Индекс ======
Това е списък на всички налични страници подредени по [[doku>namespaces|именни пространства]].
-
diff --git a/inc/lang/bg/install.html b/inc/lang/bg/install.html
index 8763e4df6..9dcba6b97 100644
--- a/inc/lang/bg/install.html
+++ b/inc/lang/bg/install.html
@@ -1,15 +1,7 @@
-<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 ползва обикновени файлове за съхраняване на страниците и информацията свързана с тях (примерно картинки, търсения, стари версии, и др.). За да функционира нормално DokuWiki <strong>трябва</strong> да има право за писане в директориите, които съдържат тези файлове. Инсталаторът не може да настройва правата на директориите. Вие трябва да направите това директно от командният ред или ако ползвате хостинг през FTP или контролния панела на хоста (примерно cPanel).</p>
-<p>Инсталаторът ще настрои вашата DokuWiki конфигурация на
-<abbr title="списъка за достъп">ACL</abbr>, което ще позволи на администратора да се впише и ползва администраторското меню в DokuWiki за инсталиране на приставки, контрол на потребителите, управление на достъпа до страниците и промяна на останалите настройки. Това не е необходимо за функционирането на DokuWiki, но прави администрирането по-лесно.</p>
+<p>Инсталаторът ще настрои вашата DokuWiki конфигурация на <abbr title="списъка за достъп">ACL</abbr>, което ще позволи на администратора да се впише и ползва администраторското меню в DokuWiki за инсталиране на приставки, контрол на потребителите, управление на достъпа до страниците и промяна на останалите настройки. Това не е необходимо за функционирането на DokuWiki, но прави администрирането по-лесно.</p>
-<p>Опитните потребители и потребителите със специални изисквания към настройките имат на разположение допълнителна информация относно <a href="http://dokuwiki.org/install">инсталирането</a>
-и <a href="http://dokuwiki.org/config">настройването</a>.</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 fd4677c1a..accc4973b 100644
--- a/inc/lang/bg/lang.php
+++ b/inc/lang/bg/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Salif Mehmed <salif13mehmed@gmail.com>
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
* @author Kiril <neohidra@gmail.com>
@@ -67,44 +68,6 @@ $lang['badpassconfirm'] = 'За съжаление паролата е г
$lang['minoredit'] = 'Промените са незначителни';
$lang['draftdate'] = 'Черновата е автоматично записана на';
$lang['nosecedit'] = 'Страницата бе междувременно променена, презареждане на страницата поради неактуална информация.';
-$lang['regmissing'] = 'Моля, попълнете всички полета.';
-$lang['reguexists'] = 'Вече съществува потребител с избраното име.';
-$lang['regsuccess'] = 'Потребителят е създаден, а паролата е пратена по електронната поща.';
-$lang['regsuccess2'] = 'Потребителят е създаден.';
-$lang['regfail'] = 'Потребителят не може да бъде създаден.';
-$lang['regmailfail'] = 'Изглежда, че има проблем с пращането на писмото с паролата. Моля, свържете се с администратора!';
-$lang['regbadmail'] = 'Въведеният адрес изглежда невалиден - ако мислите, че това е грешка, свържете се с администратора.';
-$lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново.';
-$lang['regpwmail'] = 'Паролата ви за DokuWiki';
-$lang['reghere'] = 'Все още нямате профил? Направете си';
-$lang['profna'] = 'Wiki-то не поддържа промяна на профила';
-$lang['profnochange'] = 'Няма промени.';
-$lang['profnoempty'] = 'Въвеждането на име и имейл е задължително';
-$lang['profchanged'] = 'Потребителският профил е обновен успешно.';
-$lang['profnodelete'] = 'Изтриването на потребители в това wiki не е възможно';
-$lang['profdeleteuser'] = 'Изтриване на профила';
-$lang['profdeleted'] = 'Вашият профил е премахнат от това wiki ';
-$lang['profconfdelete'] = 'Искам да изтрия профила си от това wiki. <br/> Веднъж изтрит, профилът не може да бъде възстановен!';
-$lang['profconfdeletemissing'] = 'Не сте поставили отметка в кутията потвърждение';
-$lang['proffail'] = 'Потребителският профил не може да бъде актуализиран.';
-$lang['pwdforget'] = 'Забравили сте паролата си? Получете нова';
-$lang['resendna'] = 'Wiki-то не поддържа повторно пращане на паролата.';
-$lang['resendpwd'] = 'Задаване на нова парола за';
-$lang['resendpwdmissing'] = 'Моля, попълнете всички полета.';
-$lang['resendpwdnouser'] = 'Потребителят не е намерен в базата от данни.';
-$lang['resendpwdbadauth'] = 'Кодът за потвърждение е невалиден. Проверете дали сте използвали целия линк за потвърждение.';
-$lang['resendpwdconfirm'] = 'Линк за потвърждение е пратен по електронната поща.';
-$lang['resendpwdsuccess'] = 'Новата ви паролата е пратена по електронната поща.';
-$lang['license'] = 'Ако не е посочено друго, съдържанието на Wiki-то е лицензирано под следния лиценз:';
-$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'] = 'Търсене на файлове';
@@ -146,6 +109,51 @@ $lang['js']['media_done_btn'] = 'Готово';
$lang['js']['media_drop'] = 'Влачете и пуснете файлове тук, за да бъдат качени';
$lang['js']['media_cancel'] = 'премахване';
$lang['js']['media_overwrt'] = 'Презапиши съществуващите файлове';
+$lang['search_starts_with'] = 'започва с';
+$lang['search_ends_with'] = 'завършва с';
+$lang['search_contains'] = 'съдържа';
+$lang['search_any_time'] = 'по всяко време';
+$lang['search_past_7_days'] = 'миналата седмица';
+$lang['search_past_month'] = 'миналия месец';
+$lang['search_past_year'] = 'миналата година';
+$lang['regmissing'] = 'Моля, попълнете всички полета.';
+$lang['reguexists'] = 'Вече съществува потребител с избраното име.';
+$lang['regsuccess'] = 'Потребителят е създаден, а паролата е пратена по електронната поща.';
+$lang['regsuccess2'] = 'Потребителят е създаден.';
+$lang['regfail'] = 'Потребителят не може да бъде създаден.';
+$lang['regmailfail'] = 'Изглежда, че има проблем с пращането на писмото с паролата. Моля, свържете се с администратора!';
+$lang['regbadmail'] = 'Въведеният адрес изглежда невалиден - ако мислите, че това е грешка, свържете се с администратора.';
+$lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново.';
+$lang['regpwmail'] = 'Паролата ви за DokuWiki';
+$lang['reghere'] = 'Все още нямате профил? Направете си';
+$lang['profna'] = 'Wiki-то не поддържа промяна на профила';
+$lang['profnochange'] = 'Няма промени.';
+$lang['profnoempty'] = 'Въвеждането на име и имейл е задължително';
+$lang['profchanged'] = 'Потребителският профил е обновен успешно.';
+$lang['profnodelete'] = 'Изтриването на потребители в това wiki не е възможно';
+$lang['profdeleteuser'] = 'Изтриване на профила';
+$lang['profdeleted'] = 'Вашият профил е премахнат от това wiki ';
+$lang['profconfdelete'] = 'Искам да изтрия профила си от това wiki. <br/> Веднъж изтрит, профилът не може да бъде възстановен!';
+$lang['profconfdeletemissing'] = 'Не сте поставили отметка в кутията потвърждение';
+$lang['proffail'] = 'Потребителският профил не може да бъде актуализиран.';
+$lang['pwdforget'] = 'Забравили сте паролата си? Получете нова';
+$lang['resendna'] = 'Wiki-то не поддържа повторно пращане на паролата.';
+$lang['resendpwd'] = 'Задаване на нова парола за';
+$lang['resendpwdmissing'] = 'Моля, попълнете всички полета.';
+$lang['resendpwdnouser'] = 'Потребителят не е намерен в базата от данни.';
+$lang['resendpwdbadauth'] = 'Кодът за потвърждение е невалиден. Проверете дали сте използвали целия линк за потвърждение.';
+$lang['resendpwdconfirm'] = 'Линк за потвърждение е пратен по електронната поща.';
+$lang['resendpwdsuccess'] = 'Новата ви паролата е пратена по електронната поща.';
+$lang['license'] = 'Ако не е посочено друго, съдържанието на Wiki-то е лицензирано под следния лиценз:';
+$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['rssfailed'] = 'Възникна грешка при получаването на емисията: ';
$lang['nothingfound'] = 'Нищо не е открито.';
$lang['mediaselect'] = 'Файлове';
@@ -333,5 +341,5 @@ $lang['media_restore'] = 'Възстановяване на тази в
$lang['currentns'] = 'Текущо именно пространство';
$lang['searchresult'] = 'Резултати от търсенето';
$lang['plainhtml'] = 'Обикновен HTML';
-$lang['email_signature_text'] = 'Писмото е генерирано от DokuWiki на адрес
+$lang['email_signature_text'] = 'Писмото е генерирано от DokuWiki на адрес
@DOKUWIKIURL@';
diff --git a/inc/lang/bg/newpage.txt b/inc/lang/bg/newpage.txt
index 22d3bb6d1..89b94b319 100644
--- a/inc/lang/bg/newpage.txt
+++ b/inc/lang/bg/newpage.txt
@@ -1,4 +1,3 @@
====== Несъществуваща тема ======
-Последвали сте препратка към тема, която не съществува. Ако правата ви позволяват, може да я създадете чрез бутона ''Създаване на страница''.
-
+Последвали сте препратка към тема, която не съществува. Ако правата ви позволяват, може да я създадете чрез бутона **Създаване на страница**.
diff --git a/inc/lang/bg/norev.txt b/inc/lang/bg/norev.txt
index fb7aeef89..6d2e947d9 100644
--- a/inc/lang/bg/norev.txt
+++ b/inc/lang/bg/norev.txt
@@ -1,4 +1,3 @@
====== Няма такава версия ======
Избраната версия не съществува. Натиснете бутона ''История'' за отваряне на списъка със стари версии на документа.
-
diff --git a/inc/lang/bg/preview.txt b/inc/lang/bg/preview.txt
index 41fde7380..90e518444 100644
--- a/inc/lang/bg/preview.txt
+++ b/inc/lang/bg/preview.txt
@@ -1,3 +1,3 @@
====== Преглед ======
-Ето как ще изглежда страницата. Текста все още **не е запазен**! \ No newline at end of file
+Ето как ще изглежда страницата. **Текста все още не е запазен**!
diff --git a/inc/lang/bg/pwconfirm.txt b/inc/lang/bg/pwconfirm.txt
index 3d0a9671c..d2bfd6a9f 100644
--- a/inc/lang/bg/pwconfirm.txt
+++ b/inc/lang/bg/pwconfirm.txt
@@ -1,7 +1,6 @@
Здравейте @FULLNAME@!
-Някой е поискал нова парола за потребител @TITLE@
-на @DOKUWIKIURL@
+Някой е поискал нова парола за потребител @TITLE@ на @DOKUWIKIURL@
Ако не сте поискали нова парола, тогава просто игнорирайте това писмо.
diff --git a/inc/lang/bg/read.txt b/inc/lang/bg/read.txt
index 861d47fc5..c4af24e5e 100644
--- a/inc/lang/bg/read.txt
+++ b/inc/lang/bg/read.txt
@@ -1,2 +1 @@
Страницата е само за четене. Може да разглеждате кода, но не и да го променяте. Обърнете се съм администратора, ако смятате, че това не е редно.
-
diff --git a/inc/lang/bg/recent.txt b/inc/lang/bg/recent.txt
index c92029054..d435493c8 100644
--- a/inc/lang/bg/recent.txt
+++ b/inc/lang/bg/recent.txt
@@ -1,4 +1,3 @@
====== Скорошни промени ======
-Следните страници са били променени наскоро.
-
+Следните страници са били променени наскоро:
diff --git a/inc/lang/bg/register.txt b/inc/lang/bg/register.txt
index 333428005..0754f2c74 100644
--- a/inc/lang/bg/register.txt
+++ b/inc/lang/bg/register.txt
@@ -1,4 +1,3 @@
====== Регистриране като нов потребител ======
Моля, попълнете всичките полета отдолу, за да бъде създаден нов профил. Уверете се, че въведеният **имейл адрес е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]].
-
diff --git a/inc/lang/bg/resetpwd.txt b/inc/lang/bg/resetpwd.txt
index caa4adfdc..754adb60f 100644
--- a/inc/lang/bg/resetpwd.txt
+++ b/inc/lang/bg/resetpwd.txt
@@ -1,4 +1,3 @@
====== Задаване на нова парола ======
Моля, въведете нова парола за вашия акаунт в Wiki страницата.
-
diff --git a/inc/lang/bg/revisions.txt b/inc/lang/bg/revisions.txt
index 0e14662b7..6f3e2d0a3 100644
--- a/inc/lang/bg/revisions.txt
+++ b/inc/lang/bg/revisions.txt
@@ -1,4 +1,3 @@
====== Стари версии======
Това са старите версии на документа. За да възстановите стара версия, изберете я долу, натиснете ''Редактиране'' и я запазете.
-
diff --git a/inc/lang/bg/searchpage.txt b/inc/lang/bg/searchpage.txt
index 6da6042e9..ee5e204f5 100644
--- a/inc/lang/bg/searchpage.txt
+++ b/inc/lang/bg/searchpage.txt
@@ -1,4 +1,3 @@
====== Търсене ======
Резултата от търсенето ще намерите по-долу. @CREATEPAGEINFO@
-
diff --git a/inc/lang/bn/admin.txt b/inc/lang/bn/admin.txt
index ede23c764..6b8dd94e4 100644
--- a/inc/lang/bn/admin.txt
+++ b/inc/lang/bn/admin.txt
@@ -1,3 +1,3 @@
====== প্রশাসন ======
-আপনি DokuWiki পাওয়া প্রশাসনিক কাজগুলো একটি তালিকা পেতে পারেন নীচে. \ No newline at end of file
+আপনি DokuWiki পাওয়া প্রশাসনিক কাজগুলো একটি তালিকা পেতে পারেন নীচে.
diff --git a/inc/lang/bn/backlinks.txt b/inc/lang/bn/backlinks.txt
index 61a7cac3f..3e455c98d 100644
--- a/inc/lang/bn/backlinks.txt
+++ b/inc/lang/bn/backlinks.txt
@@ -1,3 +1,3 @@
====== ব্যাকলিঙ্কগুলি ======
-এই বর্তমান পৃষ্ঠায় ফিরে সংযোগ আছে বলে মনে হচ্ছে যে পেজের একটি তালিকা. \ No newline at end of file
+এই বর্তমান পৃষ্ঠায় ফিরে সংযোগ আছে বলে মনে হচ্ছে যে পেজের একটি তালিকা.
diff --git a/inc/lang/bn/conflict.txt b/inc/lang/bn/conflict.txt
index b18ad9531..684b5e6ed 100644
--- a/inc/lang/bn/conflict.txt
+++ b/inc/lang/bn/conflict.txt
@@ -2,4 +2,4 @@
আপনি সম্পাদিত ডকুমেন্টের একটি নতুন সংস্করণ বিদ্যমান. আপনি এটি সম্পাদনা যখন অন্য ব্যবহারকারীর নথি পরিবর্তিত যখন এটি হয়.
-পুঙ্খানুপুঙ্খভাবে নিচে দেখানো পার্থক্য পরীক্ষা, তারপর রাখা যা সংস্করণে ঠিক. আপনি "সংরক্ষণ" চয়ন, আপনার সংস্করণ সংরক্ষিত হবে অথবা বর্তমান সংস্করণ রাখা ''বাতিল'' হিট করুন. \ No newline at end of file
+পুঙ্খানুপুঙ্খভাবে নিচে দেখানো পার্থক্য পরীক্ষা, তারপর রাখা যা সংস্করণে ঠিক. আপনি "সংরক্ষণ" চয়ন, আপনার সংস্করণ সংরক্ষিত হবে অথবা বর্তমান সংস্করণ রাখা ''বাতিল'' হিট করুন.
diff --git a/inc/lang/bn/denied.txt b/inc/lang/bn/denied.txt
index 5ba0fcf4f..34249a2e8 100644
--- a/inc/lang/bn/denied.txt
+++ b/inc/lang/bn/denied.txt
@@ -1,3 +1,3 @@
====== অনুমতি অস্বীকার =====
-দুঃখিত, আপনি কি এগিয়ে যেতে যথেষ্ট অধিকার নেই. \ No newline at end of file
+দুঃখিত, আপনি কি এগিয়ে যেতে যথেষ্ট অধিকার নেই.
diff --git a/inc/lang/bn/diff.txt b/inc/lang/bn/diff.txt
index 5952e28da..420c23908 100644
--- a/inc/lang/bn/diff.txt
+++ b/inc/lang/bn/diff.txt
@@ -1,3 +1,3 @@
====== পার্থক্য ======
-এর মানে আপনি পৃষ্ঠার দুটি সংস্করণের মধ্যে পার্থক্য দেখায়. \ No newline at end of file
+এর মানে আপনি পৃষ্ঠার দুটি সংস্করণের মধ্যে পার্থক্য দেখায়.
diff --git a/inc/lang/bn/draft.txt b/inc/lang/bn/draft.txt
index 0b614f485..7d089f858 100644
--- a/inc/lang/bn/draft.txt
+++ b/inc/lang/bn/draft.txt
@@ -2,4 +2,4 @@
এই পৃষ্ঠাতে আপনার সর্বশেষ সম্পাদনা সময় সঠিকভাবে সম্পন্ন করা হয় নি. DokuWiki স্বয়ংক্রিয়ভাবে আপনি এখন আপনার সম্পাদনা চালিয়ে যেতে ব্যবহার করতে পারেন যা আপনার কাজ করার সময় একটি খসড়া সংরক্ষিত. আপনি আপনার শেষ সময় থেকে সংরক্ষিত ছিল যে তথ্য দেখতে পারেন নিচে.
-আপনি / /ফিরাইয়া আনা / / আপনার হারিয়ে সম্পাদনা সময়, / / মুছে দিন / / স্বতঃসংরক্ষিত খসড়া অথবা / / বাতিল / / সম্পাদনা প্রক্রিয়া পুনরুদ্ধার করতে চান তা স্থির করুন. \ No newline at end of file
+আপনি / /ফিরাইয়া আনা / / আপনার হারিয়ে সম্পাদনা সময়, / / মুছে দিন / / স্বতঃসংরক্ষিত খসড়া অথবা / / বাতিল / / সম্পাদনা প্রক্রিয়া পুনরুদ্ধার করতে চান তা স্থির করুন.
diff --git a/inc/lang/bn/edit.txt b/inc/lang/bn/edit.txt
index b294b6461..c29b20a14 100644
--- a/inc/lang/bn/edit.txt
+++ b/inc/lang/bn/edit.txt
@@ -1 +1 @@
-পাতা সম্পাদনা করুন এবং ''সংরক্ষণ'' আঘাত. দেখুন [[উইকি: সিনট্যাক্স]] উইকি সিনট্যাক্স জন্য. আপনি এটি **উন্নত** করতে পারেন শুধুমাত্র যদি পাতাটি সম্পাদনা করুন. আপনি কিছু কিছু বিষয় পরীক্ষা আপনার প্রথম পদক্ষেপ করা শিখতে চান [[খেলার মাঠ: খেলার মাঠ | খেলার মাঠ]]. \ No newline at end of file
+পাতা সম্পাদনা করুন এবং ''সংরক্ষণ'' আঘাত. দেখুন [[wiki:syntax]] উইকি সিনট্যাক্স জন্য. আপনি এটি **উন্নত** করতে পারেন শুধুমাত্র যদি পাতাটি সম্পাদনা করুন. আপনি কিছু কিছু বিষয় পরীক্ষা আপনার প্রথম পদক্ষেপ করা শিখতে চান [[playground:playground|খেলার মাঠ]].
diff --git a/inc/lang/bn/editrev.txt b/inc/lang/bn/editrev.txt
index 1ea72367e..17eed55bf 100644
--- a/inc/lang/bn/editrev.txt
+++ b/inc/lang/bn/editrev.txt
@@ -1,2 +1,2 @@
-** আপনি নথির একটি পুরোনো সংস্করণ লোড করেছেন! ** যদি আপনি এটি সংরক্ষণ করেন, আপনি এই তথ্য দিয়ে একটি নতুন সংস্করণ তৈরি করবে.
----- \ No newline at end of file
+**আপনি নথির একটি পুরোনো সংস্করণ লোড করেছেন!** যদি আপনি এটি সংরক্ষণ করেন, আপনি এই তথ্য দিয়ে একটি নতুন সংস্করণ তৈরি করবে.
+----
diff --git a/inc/lang/bn/index.txt b/inc/lang/bn/index.txt
index 9f5ad751a..346cb9cee 100644
--- a/inc/lang/bn/index.txt
+++ b/inc/lang/bn/index.txt
@@ -1,3 +1,3 @@
====== সাইটম্যাপ ======
-এই দ্বারা আদেশ সমস্ত উপলব্ধ পৃষ্ঠাগুলি উপর একটি সাইট ম্যাপ হল [[Doku> নামব্যবধান | নামব্যবধান]]. \ No newline at end of file
+এই দ্বারা আদেশ সমস্ত উপলব্ধ পৃষ্ঠাগুলি উপর একটি সাইট ম্যাপ হল [[Doku> নামব্যবধান | নামব্যবধান]].
diff --git a/inc/lang/ca-valencia/admin.txt b/inc/lang/ca-valencia/admin.txt
index 60b1b6e5d..f2b4347fc 100644
--- a/inc/lang/ca-valencia/admin.txt
+++ b/inc/lang/ca-valencia/admin.txt
@@ -1,4 +1,3 @@
====== Administració ======
Baix pot trobar una llista de tasques administratives disponibles en DokuWiki.
-
diff --git a/inc/lang/ca-valencia/conflict.txt b/inc/lang/ca-valencia/conflict.txt
index 6e91fe5ea..2eb1faf8a 100644
--- a/inc/lang/ca-valencia/conflict.txt
+++ b/inc/lang/ca-valencia/conflict.txt
@@ -3,4 +3,3 @@
Existix una versió més nova del document que ha editat. Açò ha passat perquè un altre usuari ha modificat el document mentre vosté estava editant-lo.
Estudie be les diferències mostrades avall i decidixca quina versió vol guardar. Si pulsa ''Guardar'' es guardarà la versió que està editant. Pulse ''Cancelar'' per a conservar la versió modificada per l'atre usuari.
-
diff --git a/inc/lang/ca-valencia/denied.txt b/inc/lang/ca-valencia/denied.txt
index 6640e07f5..90688ac39 100644
--- a/inc/lang/ca-valencia/denied.txt
+++ b/inc/lang/ca-valencia/denied.txt
@@ -1,4 +1,3 @@
====== Permís denegat ======
Disculpe, pero no té permís per a continuar.
-
diff --git a/inc/lang/ca-valencia/diff.txt b/inc/lang/ca-valencia/diff.txt
index 2b5c60e1c..96eb31cd4 100644
--- a/inc/lang/ca-valencia/diff.txt
+++ b/inc/lang/ca-valencia/diff.txt
@@ -1,4 +1,3 @@
====== Diferències ======
Ací es mostren les diferències entre dos versions de la pàgina.
-
diff --git a/inc/lang/ca-valencia/draft.txt b/inc/lang/ca-valencia/draft.txt
index d3972a78f..1436dd9f5 100644
--- a/inc/lang/ca-valencia/draft.txt
+++ b/inc/lang/ca-valencia/draft.txt
@@ -3,4 +3,3 @@
L'última edició d'esta pàgina no es completà correctament. DokuWiki guarda automàticament un borrador que ara pot recuperar per a continuar editant. Baix pot vore la data en què es guardà l'últim borrador.
Per favor, decidisca si vol //recuperar// la sessió que pergué, //borrar// el borrador o //cancelar// esta edició.
-
diff --git a/inc/lang/ca-valencia/edit.txt b/inc/lang/ca-valencia/edit.txt
index e1ca6bf23..cdfa125b3 100644
--- a/inc/lang/ca-valencia/edit.txt
+++ b/inc/lang/ca-valencia/edit.txt
@@ -1,2 +1 @@
Edite la pàgina i pulse 'Guardar". Consulte la [[wiki:syntax|Sintaxis]] del Wiki. Per favor, edite la pàgina només **si pot millorar-la**. Si vol fer proves, deprenga a utilisar el Wiki en el [[playground:playground|espai de proves]].
-
diff --git a/inc/lang/ca-valencia/index.txt b/inc/lang/ca-valencia/index.txt
index 5e57c1680..969f1d4b1 100644
--- a/inc/lang/ca-valencia/index.txt
+++ b/inc/lang/ca-valencia/index.txt
@@ -1,4 +1,3 @@
====== Índex ======
-Un índex de totes les pàgines disponibles ordenades per [[doku>namespaces|espais de noms]].
-
+Un índex de totes les pàgines disponibles ordenades per [[doku>ca:namespaces|espais de noms]].
diff --git a/inc/lang/ca-valencia/install.html b/inc/lang/ca-valencia/install.html
index 804b80313..85b3e12b8 100644
--- a/inc/lang/ca-valencia/install.html
+++ b/inc/lang/ca-valencia/install.html
@@ -1,5 +1,4 @@
-<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>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 utilitza arxius corrents per al magatzemament 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>
diff --git a/inc/lang/ca-valencia/login.txt b/inc/lang/ca-valencia/login.txt
index 23cfd9820..fb58a7c89 100644
--- a/inc/lang/ca-valencia/login.txt
+++ b/inc/lang/ca-valencia/login.txt
@@ -1,4 +1,3 @@
====== Inici de sessió ======
Encara no ha iniciat sessió! Introduïxca les seues credencials d'autenticació per a iniciar-la. Necessita tindre les galetes del navegador activades.
-
diff --git a/inc/lang/ca-valencia/newpage.txt b/inc/lang/ca-valencia/newpage.txt
index 9605ab07d..9ca25346b 100644
--- a/inc/lang/ca-valencia/newpage.txt
+++ b/inc/lang/ca-valencia/newpage.txt
@@ -1,3 +1,3 @@
====== Este tema encara no existix ======
-Ha seguit un víncul a una pàgina que encara no existix. Si té els permissos necessaris pot crear-la utilizant el botó ''Crear esta pàgina''.
+Ha seguit un víncul a una pàgina que encara no existix. Si té els permissos necessaris pot crear-la utilizant el botó **Crear esta pàgina**.
diff --git a/inc/lang/ca-valencia/norev.txt b/inc/lang/ca-valencia/norev.txt
index 434e62dfa..d3239bdb8 100644
--- a/inc/lang/ca-valencia/norev.txt
+++ b/inc/lang/ca-valencia/norev.txt
@@ -1,3 +1,3 @@
====== No existix la versió ======
-La versió especificada no existix. Utilise el botó ''Versions antigues'' per a vore una llista de versions antigues d'este document. \ No newline at end of file
+La versió especificada no existix. Utilise el botó ''Versions antigues'' per a vore una llista de versions antigues d'este document.
diff --git a/inc/lang/ca-valencia/preview.txt b/inc/lang/ca-valencia/preview.txt
index e4cddec2a..1a3439bf9 100644
--- a/inc/lang/ca-valencia/preview.txt
+++ b/inc/lang/ca-valencia/preview.txt
@@ -1,4 +1,3 @@
====== Previsualisació ======
-Açò es una previsualització per a vore cóm quedarà la pàgina. Recorde que encara no està guardada!
-
+Açò es una previsualització per a vore cóm quedarà la pàgina. **Recorde que encara no està guardada**!
diff --git a/inc/lang/ca-valencia/pwconfirm.txt b/inc/lang/ca-valencia/pwconfirm.txt
index a537567a7..2c10050ca 100644
--- a/inc/lang/ca-valencia/pwconfirm.txt
+++ b/inc/lang/ca-valencia/pwconfirm.txt
@@ -1,11 +1,9 @@
¡Hola @FULLNAME@!
-Algú ha solicitat una nova contrasenya per a entrar com a
-@TITLE en @DOKUWIKIURL@
+Algú ha solicitat una nova contrasenya per a entrar com a @TITLE en @DOKUWIKIURL@
Si no ha segut vosté qui ha solicitat la nova contrasenya ignore este correu.
-Per a confirmar que la petició ha segut feta realment per vosté
-utilise el següent víncul.
+Per a confirmar que la petició ha segut feta realment per vosté utilise el següent víncul.
@CONFIRM@
diff --git a/inc/lang/ca-valencia/read.txt b/inc/lang/ca-valencia/read.txt
index 28e424587..109514136 100644
--- a/inc/lang/ca-valencia/read.txt
+++ b/inc/lang/ca-valencia/read.txt
@@ -1,2 +1 @@
Esta pàgina és només de llectura. Pot vore el còdic font, pero no pot canviar-lo. Pregunte a l'administrador si creu que és un error.
-
diff --git a/inc/lang/ca-valencia/recent.txt b/inc/lang/ca-valencia/recent.txt
index ca1f5c5ed..9425a3273 100644
--- a/inc/lang/ca-valencia/recent.txt
+++ b/inc/lang/ca-valencia/recent.txt
@@ -1,5 +1,3 @@
====== Canvis recents ======
-Les següents pàgines han canviat recentment.
-
-
+Les següents pàgines han canviat recentment:
diff --git a/inc/lang/ca-valencia/register.txt b/inc/lang/ca-valencia/register.txt
index ec4ff8b23..27da895a6 100644
--- a/inc/lang/ca-valencia/register.txt
+++ b/inc/lang/ca-valencia/register.txt
@@ -1,4 +1,3 @@
====== Registrar-se com a usuari nou ======
Escriga tota la informació que se li demana al davall per a crear un nou conte en este wiki. Assegure's de donar una **direcció de correu electrònic vàlida** - si no se li demana una contrasenya ací se li enviarà a eixa adreça. El nom d'usuari deuria ser un [[doku>pagename|nom de pàgina]] vàlid.
-
diff --git a/inc/lang/ca-valencia/resendpwd.txt b/inc/lang/ca-valencia/resendpwd.txt
index 2feac0966..bf620b0ff 100644
--- a/inc/lang/ca-valencia/resendpwd.txt
+++ b/inc/lang/ca-valencia/resendpwd.txt
@@ -1,4 +1,3 @@
====== Enviar contrasenya nova ======
Per favor, introduïxca el nom d'usuari en el formulari per a demanar una nova contrasenya per al seu conte en este wiki. Se li enviarà un víncul de confirmació a la direcció de correu en que estiga registrat.
-
diff --git a/inc/lang/ca-valencia/revisions.txt b/inc/lang/ca-valencia/revisions.txt
index d83a2e9b1..3cdf0d42a 100644
--- a/inc/lang/ca-valencia/revisions.txt
+++ b/inc/lang/ca-valencia/revisions.txt
@@ -1,4 +1,3 @@
====== Versions antigues ======
Versions antigues del document actual. Per a recuperar una versió anterior de la pàgina, tríe-la ací baix, pulse ''Editar esta pàgina'' i guarde-la.
-
diff --git a/inc/lang/ca-valencia/searchpage.txt b/inc/lang/ca-valencia/searchpage.txt
index 390d6064b..3bb250fde 100644
--- a/inc/lang/ca-valencia/searchpage.txt
+++ b/inc/lang/ca-valencia/searchpage.txt
@@ -1,4 +1,3 @@
====== Buscar ======
Pot vore els resultats de la busca ací baix. @CREATEPAGEINFO@
-
diff --git a/inc/lang/ca-valencia/stopwords.txt b/inc/lang/ca-valencia/stopwords.txt
index 39c5bb3d8..5579686a2 100644
--- a/inc/lang/ca-valencia/stopwords.txt
+++ b/inc/lang/ca-valencia/stopwords.txt
@@ -71,3 +71,4 @@ atre
atra
atres
també
+www
diff --git a/inc/lang/ca-valencia/updateprofile.txt b/inc/lang/ca-valencia/updateprofile.txt
index 9116fedf0..9aa62221d 100644
--- a/inc/lang/ca-valencia/updateprofile.txt
+++ b/inc/lang/ca-valencia/updateprofile.txt
@@ -1,5 +1,3 @@
====== Actualise el seu perfil ======
Només deu completar els camps que vol canviar. No es pot canviar el nom d'usuari.
-
-
diff --git a/inc/lang/ca/admin.txt b/inc/lang/ca/admin.txt
index 5c0a6d00a..9344cad01 100644
--- a/inc/lang/ca/admin.txt
+++ b/inc/lang/ca/admin.txt
@@ -1,4 +1,3 @@
====== Administració ======
Heus ací una llista de les tasques administratives disponibles en DokuWiki.
-
diff --git a/inc/lang/ca/backlinks.txt b/inc/lang/ca/backlinks.txt
index e2ecaf4f9..663288ed6 100644
--- a/inc/lang/ca/backlinks.txt
+++ b/inc/lang/ca/backlinks.txt
@@ -1,4 +1,3 @@
====== Enllaços ======
Heus ací una llista de pàgines enllaçades amb la pàgina actual.
-
diff --git a/inc/lang/ca/conflict.txt b/inc/lang/ca/conflict.txt
index 53183f0b7..d1e23c54d 100644
--- a/inc/lang/ca/conflict.txt
+++ b/inc/lang/ca/conflict.txt
@@ -3,4 +3,3 @@
Existeix una versió més recent del document que heu editat. Això passa quan un altre usuari canvia el document mentre l'estàveu editant.
Examineu detingudament les diferències que es mostren més avall i després decidiu quina versió voleu mantenir. Si trieu ''desa'', es desarà la vostra versió. Si trieu ''cancel·la'' es mantindrà la versió actual.
-
diff --git a/inc/lang/ca/denied.txt b/inc/lang/ca/denied.txt
index 3f66d6bb6..38be219d0 100644
--- a/inc/lang/ca/denied.txt
+++ b/inc/lang/ca/denied.txt
@@ -1,4 +1,3 @@
====== Permís denegat ======
No teniu prou drets per continuar.
-
diff --git a/inc/lang/ca/diff.txt b/inc/lang/ca/diff.txt
index 83ca86782..f59111618 100644
--- a/inc/lang/ca/diff.txt
+++ b/inc/lang/ca/diff.txt
@@ -1,4 +1,3 @@
====== Diferències ======
Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
-
diff --git a/inc/lang/ca/draft.txt b/inc/lang/ca/draft.txt
index 68593c2fd..535e57fb4 100644
--- a/inc/lang/ca/draft.txt
+++ b/inc/lang/ca/draft.txt
@@ -2,4 +2,4 @@
La darrera sessió vostra d'edició d'aquesta pàgina no es va completar correctament. DokuWiki en va desar automàticament un esborrany mentre treballàveu, el qual podeu utilitzar ara per continuar l'edició. Més avall podeu veure la data i hora en què es va desar durant la vostra darrera sessió.
-Decidiu si voleu //recuperar// la vostra darrera sessió d'edició, //suprimir// l'esborrany que es va desar automàticament o //cancel·lar// el procés d'edició. \ No newline at end of file
+Decidiu si voleu //recuperar// la vostra darrera sessió d'edició, //suprimir// l'esborrany que es va desar automàticament o //cancel·lar// el procés d'edició.
diff --git a/inc/lang/ca/edit.txt b/inc/lang/ca/edit.txt
index 743b0ff55..bbe5ae6ff 100644
--- a/inc/lang/ca/edit.txt
+++ b/inc/lang/ca/edit.txt
@@ -1,2 +1 @@
Editeu la pàgina i premeu ''Desa''. Per a més informació sobre la sintaxi Wiki vegeu [[wiki:syntax|sintaxi]]. Si us plau, editeu la pàgina només si podeu **millorar-la**. Si voleu fer proves, aprengueu a donar les primeres passes al [[playground:playground|pati]].
-
diff --git a/inc/lang/ca/index.txt b/inc/lang/ca/index.txt
index 6ba71fd8f..e2a70ad1c 100644
--- a/inc/lang/ca/index.txt
+++ b/inc/lang/ca/index.txt
@@ -1,4 +1,3 @@
====== Índex ======
-Heus ací un índex de totes les pàgines disponibles, ordenades per [[doku>namespaces|espais]].
-
+Heus ací un índex de totes les pàgines disponibles, ordenades per [[doku>ca:namespaces|espais]].
diff --git a/inc/lang/ca/install.html b/inc/lang/ca/install.html
index 363e598d2..659e07a3f 100644
--- a/inc/lang/ca/install.html
+++ b/inc/lang/ca/install.html
@@ -4,5 +4,4 @@
<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
+<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>
diff --git a/inc/lang/ca/lang.php b/inc/lang/ca/lang.php
index 5133b37a3..4cb513004 100644
--- a/inc/lang/ca/lang.php
+++ b/inc/lang/ca/lang.php
@@ -3,9 +3,9 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Adolfo Jayme Barrientos <fito@libreoffice.org>
* @author Carles Bellver <carles.bellver@cent.uji.es>
- * @author Carles Bellver <carles.bellver@gmail.com>
- * @author daniel@6temes.cat
+ * @author daniel <daniel@6temes.cat>
* @author Eduard Díaz <edudiaz@scopia.es>
* @author controlonline.net <controlonline.net@gmail.com>
* @author Pauet <pauet@gmx.com>
@@ -14,14 +14,14 @@
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
-$lang['doublequoteopening'] = '“';
-$lang['doublequoteclosing'] = '”';
-$lang['singlequoteopening'] = '‘';
-$lang['singlequoteclosing'] = '’';
+$lang['doublequoteopening'] = '«';
+$lang['doublequoteclosing'] = '»';
+$lang['singlequoteopening'] = '“';
+$lang['singlequoteclosing'] = '”';
$lang['apostrophe'] = '’';
$lang['btn_edit'] = 'Edita aquesta pàgina';
-$lang['btn_source'] = 'Mostra codi font';
-$lang['btn_show'] = 'Mostra pàgina';
+$lang['btn_source'] = 'Mostra el codi font';
+$lang['btn_show'] = 'Mostra la pàgina';
$lang['btn_create'] = 'Crea aquesta pàgina';
$lang['btn_search'] = 'Cerca';
$lang['btn_save'] = 'Desa';
@@ -52,63 +52,28 @@ $lang['btn_draftdel'] = 'Suprimeix esborrany';
$lang['btn_revert'] = 'Restaura';
$lang['btn_register'] = 'Registra\'m';
$lang['btn_apply'] = 'Aplica';
-$lang['btn_media'] = 'Mànager Multimèdia';
-$lang['btn_deleteuser'] = 'Esborrar compte';
+$lang['btn_media'] = 'Gestor multimèdia';
+$lang['btn_deleteuser'] = 'Suprimeix el meu compte';
$lang['btn_img_backto'] = 'Torna a %s';
$lang['btn_mediaManager'] = 'Veure a multimèdia mànager ';
$lang['loggedinas'] = 'Heu entrat com:';
-$lang['user'] = 'Nom d\'usuari';
+$lang['user'] = 'Nom d’usuari';
$lang['pass'] = 'Contrasenya';
-$lang['newpass'] = 'Nova contrasenya';
+$lang['newpass'] = 'Contrasenya nova';
$lang['oldpass'] = 'Confirmeu la contrasenya actual';
$lang['passchk'] = 'una altra vegada';
-$lang['remember'] = 'Recorda\'m';
+$lang['remember'] = 'Recorda’m';
$lang['fullname'] = 'Nom complet';
-$lang['email'] = 'Correu electrònic';
-$lang['profile'] = 'Perfil d\'usuari';
+$lang['email'] = 'Adreça electrònica';
+$lang['profile'] = 'Perfil d’usuari';
$lang['badlogin'] = 'Nom d\'usuari o contrasenya incorrectes.';
$lang['badpassconfirm'] = 'Contrasenya incorrecta';
$lang['minoredit'] = 'Canvis menors';
$lang['draftdate'] = 'L\'esborrany s\'ha desat automàticament';
$lang['nosecedit'] = 'Mentrestant la pàgina ha estat modificada. La informació de seccions estava obsoleta i ha calgut carregar la pàgina sencera.';
-$lang['regmissing'] = 'Heu d\'omplir tots els camps.';
-$lang['reguexists'] = 'Ja existeix un altre usuari amb aquest nom.';
-$lang['regsuccess'] = 'S\'ha creat l\'usuari. La contrasenya s\'ha enviat per correu.';
-$lang['regsuccess2'] = 'S\'ha creat l\'usuari.';
-$lang['regfail'] = 'L\'usuari no pot ser creat';
-$lang['regmailfail'] = 'Sembla que un error ha impedit enviar la contrasenya per correu. Contacteu amb l\'administrador.';
-$lang['regbadmail'] = 'L\'adreça de correu que heu donat no sembla vàlida. Si creieu que això és un error, contacu amb l\'administrador.';
-$lang['regbadpass'] = 'Les dues contrasenyes no són iguals. Torneu a intentar-ho.';
-$lang['regpwmail'] = 'La vostra contrasenya per al Wiki';
-$lang['reghere'] = 'Si no teniu un compte, aquí en podeu obtenir un';
-$lang['profna'] = 'Aquest wiki no permet modificar el perfil';
-$lang['profnochange'] = 'No heu introduït cap canvi.';
-$lang['profnoempty'] = 'No es pot deixar en blanc el nom o l\'adreça de correu.';
-$lang['profchanged'] = 'El perfil d\'usuari s\'ha actualitzat correctament.';
-$lang['profnodelete'] = 'Aquesta wiki no permet esborrar usuaris';
-$lang['profdeleteuser'] = 'Esborrar compte';
-$lang['profdeleted'] = 'El vostre compte ha sigut esborrat d\'aquest compte';
-$lang['profconfdelete'] = 'Vull esmorrar el meu compte d\'aquesta wiki. </br> Aquesta acció no pot desfer-se.';
-$lang['profconfdeletemissing'] = 'Confirmació no acceptada';
-$lang['proffail'] = 'Perfil d\'usuari no actialitzat';
-$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'] = 'Estableix una nova contrasenya per';
-$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.';
-$lang['resendpwdconfirm'] = 'Se us ha enviat per correu electrònic un enllaç de confirmació.';
-$lang['resendpwdsuccess'] = 'Se us ha enviat la nova contrasenya per correu electrònic.';
-$lang['license'] = 'Excepte on es digui una altra cosa, el contingut d\'aquest wiki està subjecte a la llicència següent:';
-$lang['licenseok'] = 'Nota. En editar aquesta pàgina esteu acceptant que el vostre contingut estigui subjecte a la llicència següent:';
-$lang['searchmedia'] = 'Cerca pel nom de fitxer';
-$lang['searchmedia_in'] = 'Cerca en: %s';
-$lang['txt_upload'] = 'Trieu el fitxer que voleu penjar:';
-$lang['txt_filename'] = 'Introduïu el nom wiki (opcional):';
-$lang['txt_overwrt'] = 'Sobreescriu el fitxer actual';
-$lang['maxuploadsize'] = 'Puja com a màxim %s per arxiu.';
-$lang['lockedby'] = 'Actualment blocat per:';
-$lang['lockexpire'] = 'Venciment del blocatge:';
+$lang['searchcreatepage'] = 'Si no heu trobat el que cercàveu, podeu crear o editar la pàgina %s, el nom de la qual deriva de la vostra consulta.';
+$lang['search_fullresults'] = 'Resultats de text complet';
+$lang['js']['search_toggle_tools'] = 'Commuta les eines de cerca';
$lang['js']['willexpire'] = 'El blocatge per a editar aquesta pàgina venç d\'aquí a un minut.\nUtilitzeu la visualització prèvia per reiniciar el rellotge i evitar conflictes.';
$lang['js']['notsavedyet'] = 'Heu fet canvis que es perdran si no els deseu.
Voleu continuar?';
@@ -152,6 +117,56 @@ $lang['js']['media_done_btn'] = 'Fet';
$lang['js']['media_drop'] = 'Arrossega aquí els arxius a pujar';
$lang['js']['media_cancel'] = 'esborra';
$lang['js']['media_overwrt'] = 'Sobreescriu els arxius existents';
+$lang['search_exact_match'] = 'Coincidència exacta';
+$lang['search_starts_with'] = 'Comença per';
+$lang['search_ends_with'] = 'Termina per';
+$lang['search_contains'] = 'Conté';
+$lang['search_custom_match'] = 'Personalitzat';
+$lang['search_any_ns'] = 'Qualsevol espai de noms';
+$lang['search_any_time'] = 'Qualsevol temps';
+$lang['search_past_7_days'] = 'La setmana passada';
+$lang['search_past_month'] = 'El mes passat';
+$lang['search_past_year'] = 'L’any passat';
+$lang['search_sort_by_hits'] = 'Ordena per visites';
+$lang['search_sort_by_mtime'] = 'Ordena per darrera modificació';
+$lang['regmissing'] = 'Heu d\'omplir tots els camps.';
+$lang['reguexists'] = 'Ja existeix un altre usuari amb aquest nom.';
+$lang['regsuccess'] = 'S\'ha creat l\'usuari. La contrasenya s\'ha enviat per correu.';
+$lang['regsuccess2'] = 'S\'ha creat l\'usuari.';
+$lang['regfail'] = 'L\'usuari no pot ser creat';
+$lang['regmailfail'] = 'Sembla que un error ha impedit enviar la contrasenya per correu. Contacteu amb l\'administrador.';
+$lang['regbadmail'] = 'L\'adreça de correu que heu donat no sembla vàlida. Si creieu que això és un error, contacu amb l\'administrador.';
+$lang['regbadpass'] = 'Les dues contrasenyes no són iguals. Torneu a intentar-ho.';
+$lang['regpwmail'] = 'La vostra contrasenya per al Wiki';
+$lang['reghere'] = 'Si no teniu un compte, aquí en podeu obtenir un';
+$lang['profna'] = 'Aquest wiki no permet modificar el perfil';
+$lang['profnochange'] = 'No heu introduït cap canvi.';
+$lang['profnoempty'] = 'No es pot deixar en blanc el nom o l\'adreça de correu.';
+$lang['profchanged'] = 'El perfil d\'usuari s\'ha actualitzat correctament.';
+$lang['profnodelete'] = 'Aquesta wiki no permet esborrar usuaris';
+$lang['profdeleteuser'] = 'Esborrar compte';
+$lang['profdeleted'] = 'El vostre compte ha sigut esborrat d\'aquest compte';
+$lang['profconfdelete'] = 'Vull esmorrar el meu compte d\'aquesta wiki. </br> Aquesta acció no pot desfer-se.';
+$lang['profconfdeletemissing'] = 'Confirmació no acceptada';
+$lang['proffail'] = 'Perfil d\'usuari no actialitzat';
+$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'] = 'Estableix una nova contrasenya per';
+$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.';
+$lang['resendpwdconfirm'] = 'Se us ha enviat per correu electrònic un enllaç de confirmació.';
+$lang['resendpwdsuccess'] = 'Se us ha enviat la nova contrasenya per correu electrònic.';
+$lang['license'] = 'Excepte on es digui una altra cosa, el contingut d\'aquest wiki està subjecte a la llicència següent:';
+$lang['licenseok'] = 'Nota. En editar aquesta pàgina esteu acceptant que el vostre contingut estigui subjecte a la llicència següent:';
+$lang['searchmedia'] = 'Cerca pel nom de fitxer';
+$lang['searchmedia_in'] = 'Cerca en: %s';
+$lang['txt_upload'] = 'Trieu el fitxer que voleu penjar:';
+$lang['txt_filename'] = 'Introduïu el nom wiki (opcional):';
+$lang['txt_overwrt'] = 'Sobreescriu el fitxer actual';
+$lang['maxuploadsize'] = 'Puja com a màxim %s per arxiu.';
+$lang['lockedby'] = 'Actualment blocat per:';
+$lang['lockexpire'] = 'Venciment del blocatge:';
$lang['rssfailed'] = 'S\'ha produït un error en recollir aquesta alimentació: ';
$lang['nothingfound'] = 'No s\'ha trobat res.';
$lang['mediaselect'] = 'Selecció de fitxers';
@@ -213,7 +228,7 @@ $lang['skip_to_content'] = 'salta al contingut';
$lang['sidebar'] = 'Barra lateral';
$lang['mail_newpage'] = 'pàgina afegida:';
$lang['mail_changed'] = 'pàgina modificada:';
-$lang['mail_subscribe_list'] = 'pagines canviades a l0espai de noms:';
+$lang['mail_subscribe_list'] = 'pàgines canviades a l’espai de noms:';
$lang['mail_new_user'] = 'nou usuari:';
$lang['mail_upload'] = 'fitxer penjat:';
$lang['changes_type'] = 'Veure els canvis de';
@@ -244,7 +259,7 @@ $lang['qb_media'] = 'Afegeix imatges o altres fitxers';
$lang['qb_sig'] = 'Insereix signatura';
$lang['qb_smileys'] = 'Emoticones';
$lang['qb_chars'] = 'Caràcters especials';
-$lang['upperns'] = 'Salta a l\'espai superior';
+$lang['upperns'] = 'salta a l’espai superior';
$lang['metaedit'] = 'Edita metadades';
$lang['metasaveerr'] = 'No s\'han pogut escriure les metadades';
$lang['metasaveok'] = 'S\'han desat les metadades';
diff --git a/inc/lang/ca/login.txt b/inc/lang/ca/login.txt
index 37ca4d582..579d42266 100644
--- a/inc/lang/ca/login.txt
+++ b/inc/lang/ca/login.txt
@@ -1,4 +1,3 @@
====== Entrada ======
No heu entrat. Introduïu les vostres credencials d'autenticació en aquest formulari. A partir d'aquest moment heu de tenir les galetes habilitades en el vostre navegador.
-
diff --git a/inc/lang/ca/newpage.txt b/inc/lang/ca/newpage.txt
index d0a2db92a..6f2c0a8f0 100644
--- a/inc/lang/ca/newpage.txt
+++ b/inc/lang/ca/newpage.txt
@@ -1,3 +1,3 @@
====== Aquest tema encara no existeix ======
-Heu seguit un enllaç a un tema que encara no existeix. Podeu crear-lo per mitjà del botó ''Crea aquesta pàgina''.
+Heu seguit un enllaç a un tema que encara no existeix. Podeu crear-lo per mitjà del botó **Crea aquesta pàgina**.
diff --git a/inc/lang/ca/norev.txt b/inc/lang/ca/norev.txt
index b5089c5eb..7c999fccf 100644
--- a/inc/lang/ca/norev.txt
+++ b/inc/lang/ca/norev.txt
@@ -1,5 +1,3 @@
====== No existeix aquesta revisió ======
-
La revisió especificada no existeix. Utilitzeu el botó ''Revisions anteriors'' per obtenir una llista de revisions d'aquest document.
-
diff --git a/inc/lang/ca/preview.txt b/inc/lang/ca/preview.txt
index fa2f98ca5..d9b808841 100644
--- a/inc/lang/ca/preview.txt
+++ b/inc/lang/ca/preview.txt
@@ -1,4 +1,3 @@
====== Previsualització ======
-Heus ací una previsualització del vostre text. Recordeu que encara **no l'heu desat!**
-
+Heus ací una previsualització del vostre text. **Recordeu que encara no l'heu desat**!
diff --git a/inc/lang/ca/pwconfirm.txt b/inc/lang/ca/pwconfirm.txt
index 226e12623..38c9dd1c9 100644
--- a/inc/lang/ca/pwconfirm.txt
+++ b/inc/lang/ca/pwconfirm.txt
@@ -1,11 +1,9 @@
-@FULLNAME@,
+¡Hola @FULLNAME@!
-Algú ha sol·licitat una nova contrasenya per al vostre compte d'usuari en @TITLE@
-@DOKUWIKIURL@
+Algú ha sol·licitat una nova contrasenya per al vostre compte d'usuari en @TITLE@ @DOKUWIKIURL@
Si no heu fet aquesta sol·licitud, simplement no feu cas de la resta del missatge.
-Per confirmar que realment heu sol·licitat una nova contrasenya, utilitzeu
-l'enllaç següent:
+Per confirmar que realment heu sol·licitat una nova contrasenya, utilitzeu l'enllaç següent:
@CONFIRM@
diff --git a/inc/lang/ca/read.txt b/inc/lang/ca/read.txt
index e173ad2dc..46c65f612 100644
--- a/inc/lang/ca/read.txt
+++ b/inc/lang/ca/read.txt
@@ -1,2 +1 @@
Aquesta pàgina és només de lectura. Podeu veure'n el codi font, però no podeu canviar-la. Consulteu el vostre administrador si penseu que això és degut a algun error.
-
diff --git a/inc/lang/ca/recent.txt b/inc/lang/ca/recent.txt
index cea2f5cff..3ee00ee0e 100644
--- a/inc/lang/ca/recent.txt
+++ b/inc/lang/ca/recent.txt
@@ -1,5 +1,3 @@
====== Canvis recents ======
-Les pàgines següents s'han modificat recentment.
-
-
+Les pàgines següents s'han modificat recentment:
diff --git a/inc/lang/ca/register.txt b/inc/lang/ca/register.txt
index a91e6df31..2fe375fc1 100644
--- a/inc/lang/ca/register.txt
+++ b/inc/lang/ca/register.txt
@@ -1,4 +1,3 @@
====== Registre d'un usuari nou ======
Empleneu tota la informació que se us demana per crear un compte nou en aquest wiki. Assegureu-vos que doneu una **adreça de correu vàlida**, on se us enviarà la vostra contrasenya. El nom d'usuari o usuària ha de ser vàlid com a [[doku>pagename|nom de pàgina]].
-
diff --git a/inc/lang/ca/resendpwd.txt b/inc/lang/ca/resendpwd.txt
index cd59f899d..04e930406 100644
--- a/inc/lang/ca/resendpwd.txt
+++ b/inc/lang/ca/resendpwd.txt
@@ -1,3 +1,3 @@
====== Nova contrasenya ======
-Per sol·licitar una nova contrasenya, introduïu el vostre nom d'usuari en el formulari següent. Se us enviarà un enllaç de confirmació a l'adreça de correu amb què us vau registrar. \ No newline at end of file
+Per sol·licitar una nova contrasenya, introduïu el vostre nom d'usuari en el formulari següent. Se us enviarà un enllaç de confirmació a l'adreça de correu amb què us vau registrar.
diff --git a/inc/lang/ca/resetpwd.txt b/inc/lang/ca/resetpwd.txt
index 565f1d5b0..4f2797b82 100644
--- a/inc/lang/ca/resetpwd.txt
+++ b/inc/lang/ca/resetpwd.txt
@@ -1,3 +1,3 @@
===== Establiu una nova contrasenya =====
-Introdueixi una nova contrasenya pel seu compte a aquest wiki. \ No newline at end of file
+Introdueixi una nova contrasenya pel seu compte a aquest wiki.
diff --git a/inc/lang/ca/revisions.txt b/inc/lang/ca/revisions.txt
index 5c044d8e6..9fe6b4b56 100644
--- a/inc/lang/ca/revisions.txt
+++ b/inc/lang/ca/revisions.txt
@@ -1,4 +1,3 @@
====== Revisions anteriors ======
Heus ací les revisions anteriors del document actual. Per restaurar una revisió anterior, seleccioneu-la de la llista, feu clic en ''Edita aquesta pàgina'' i deseu-la.
-
diff --git a/inc/lang/ca/searchpage.txt b/inc/lang/ca/searchpage.txt
index 68da58ca2..7c8465bbb 100644
--- a/inc/lang/ca/searchpage.txt
+++ b/inc/lang/ca/searchpage.txt
@@ -1,4 +1,3 @@
====== Cerca ======
Heus ací els resultats de la cerca. @CREATEPAGEINFO@
-
diff --git a/inc/lang/ca/stopwords.txt b/inc/lang/ca/stopwords.txt
index 03be425ed..73abf4a17 100644
--- a/inc/lang/ca/stopwords.txt
+++ b/inc/lang/ca/stopwords.txt
@@ -104,3 +104,4 @@ uns
vaig
van
vosaltres
+www
diff --git a/inc/lang/ca/updateprofile.txt b/inc/lang/ca/updateprofile.txt
index 0ba022600..680a20b62 100644
--- a/inc/lang/ca/updateprofile.txt
+++ b/inc/lang/ca/updateprofile.txt
@@ -1,3 +1,3 @@
====== Actualització del perfil d'usuari ======
-Només cal que completeu els camps que vulgueu canviar. El nom d'usuari no es pot canviar. \ No newline at end of file
+Només cal que completeu els camps que vulgueu canviar. El nom d'usuari no es pot canviar.
diff --git a/inc/lang/cs/diff.txt b/inc/lang/cs/diff.txt
index d49e56993..87a9238d2 100644
--- a/inc/lang/cs/diff.txt
+++ b/inc/lang/cs/diff.txt
@@ -1,4 +1,3 @@
====== Rozdíly ======
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
-
diff --git a/inc/lang/cs/index.txt b/inc/lang/cs/index.txt
index d19626f6f..f14979b5c 100644
--- a/inc/lang/cs/index.txt
+++ b/inc/lang/cs/index.txt
@@ -1,3 +1,3 @@
====== Index ======
-Zde je k dispozici index všech dostupných stránek seřazený podle [[doku>namespaces|jmenných prostorů]].
+Zde je k dispozici index všech dostupných stránek seřazený podle [[doku>cs:namespaces|jmenných prostorů]].
diff --git a/inc/lang/cs/install.html b/inc/lang/cs/install.html
index 043e92431..2eeb7774d 100644
--- a/inc/lang/cs/install.html
+++ b/inc/lang/cs/install.html
@@ -1,23 +1,7 @@
-<p>Tato stránka vám pomůže při první instalaci a konfiguraci
-<a href="http://dokuwiki.org">Dokuwiki</a>. Více
-informací o tomto instalátoru naleznete v jeho vlastní <a
-href="http://dokuwiki.org/installer">dokumentaci</a>.</p>
+<p>Tato stránka vám pomůže při první instalaci a konfiguraci <a href="http://dokuwiki.org">Dokuwiki</a>. Více informací o tomto instalátoru naleznete v jeho vlastní <a href="http://dokuwiki.org/cs:installer">dokumentaci</a>.</p>
-<p>DokuWiki používá obyčejné soubory pro uložení wiki stránek a dalších informací
-spojených s nimi (např. obrázků, vyhledávacích indexů, starších verzí). Aby DokuWiki
-správně fungovala <strong>musí</strong> mít přístup k adresářům, kde jsou uloženy
-tyto soubory. Tento instalátor není schopen sám nastavit přístupová práva k souborům
-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>DokuWiki používá obyčejné soubory pro uložení wiki stránek a dalších informací spojených s nimi (např. obrázků, vyhledávacích indexů, starších verzí). Aby DokuWiki správně fungovala <strong>musí</strong> mít přístup k adresářům, kde jsou uloženy tyto soubory. Tento instalátor není schopen sám nastavit přístupová práva k souborům 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í <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
-nutné, ale zpříjemní to správu DokuWiki.</p>
-
-<p>Zkušení uživatelé nebo uživatelé se speciálními požadavky by se
-měli podívat na následující stránky pro další informace ohledně
-<a href="http://dokuwiki.org/install">instalace</a> a
-<a href="http://dokuwiki.org/config">nastavení</a> DokuWiki.</p>
+<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 nutné, ale zpříjemní to správu DokuWiki.</p>
+<p>Zkušení uživatelé nebo uživatelé se speciálními požadavky by se měli podívat na následující stránky pro další informace ohledně <a href="http://dokuwiki.org/cs:install">instalace</a> a <a href="http://dokuwiki.org/config">nastavení</a> DokuWiki.</p>
diff --git a/inc/lang/cs/lang.php b/inc/lang/cs/lang.php
index 8a57c0ebc..2eeb115dd 100644
--- a/inc/lang/cs/lang.php
+++ b/inc/lang/cs/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Petr Kajzar <petr.kajzar@lf1.cuni.cz>
+ * @author Robert Surý <rsurycz@seznam.cz>
+ * @author Martin Hořínek <hev@hev.cz>
* @author Jonáš Dyba <jonas.dyba@gmail.com>
* @author Bohumir Zamecnik <bohumir@zamecnik.org>
* @author Tomas Valenta <t.valenta@sh.cvut.cz>
@@ -81,7 +85,9 @@ $lang['badpassconfirm'] = 'Bohužel špatné heslo';
$lang['minoredit'] = 'Drobné změny';
$lang['draftdate'] = 'Koncept automaticky uložen v';
$lang['nosecedit'] = 'Stránka byla v mezičase změněna. Informace o sekci již nebylo platné, byla načtena celá stránka.';
+$lang['searchcreatepage'] = 'Pokud jste nenašli to, co jste hledali, můžete vytvořit nebo upravit stránku %s, pojmenovanou podle vašeho dotazu.';
$lang['search_fullresults'] = 'Fulltextové výsledky';
+$lang['js']['search_toggle_tools'] = 'Zobrazit/skrýt vyhledávací nástroje';
$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ží.';
$lang['js']['notsavedyet'] = 'Jsou tu neuložené změny, které budou ztraceny.
Chcete opravdu pokračovat?';
@@ -125,13 +131,17 @@ $lang['js']['media_done_btn'] = 'Hotovo';
$lang['js']['media_drop'] = 'Sem přetáhněte soubory pro nahrátí';
$lang['js']['media_cancel'] = 'odstranit';
$lang['js']['media_overwrt'] = 'Přepsat existující soubory';
+$lang['search_exact_match'] = 'Přesná shoda';
$lang['search_starts_with'] = 'Začíná s';
$lang['search_ends_with'] = 'Končí s';
$lang['search_contains'] = 'Obsahuje';
$lang['search_custom_match'] = 'Vlastní';
+$lang['search_any_ns'] = 'Jakýkoliv jmenný prostor';
+$lang['search_any_time'] = 'Jakýkoliv čas';
$lang['search_past_7_days'] = 'Minulý týden';
$lang['search_past_month'] = 'Minulý měsíc';
$lang['search_past_year'] = 'Minulý rok';
+$lang['search_sort_by_hits'] = 'Řadit podle shody';
$lang['search_sort_by_mtime'] = 'Řadit podle naposledy změněných';
$lang['regmissing'] = 'Musíte vyplnit všechny údaje.';
$lang['reguexists'] = 'Uživatel se stejným jménem už je zaregistrován.';
diff --git a/inc/lang/cs/newpage.txt b/inc/lang/cs/newpage.txt
index 091250af7..31166eb16 100644
--- a/inc/lang/cs/newpage.txt
+++ b/inc/lang/cs/newpage.txt
@@ -1,3 +1,3 @@
====== Stránka s tímto názvem ještě neexistuje ======
-Odkaz vás zavedl na stránku, která ještě neexistuje. Můžete ji vytvořit stisknutím tlačítka ''Vytvořit stránku''.
+Odkaz vás zavedl na stránku, která ještě neexistuje. Můžete ji vytvořit stisknutím tlačítka **Vytvořit stránku**.
diff --git a/inc/lang/cs/onceexisted.txt b/inc/lang/cs/onceexisted.txt
new file mode 100644
index 000000000..698a98ab6
--- /dev/null
+++ b/inc/lang/cs/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Tato stránka již neexistuje ======
+
+Sledovali jste odkaz na stránku, která již neexistuje. Můžete zkontrolovat seznam [[?do=revisions|old revisions]] a zjistit, kdy a proč byl odstraněn, přistoupit ke starým revizím nebo jej obnovit. \ No newline at end of file
diff --git a/inc/lang/cs/preview.txt b/inc/lang/cs/preview.txt
index 079eda4e7..a11a205e6 100644
--- a/inc/lang/cs/preview.txt
+++ b/inc/lang/cs/preview.txt
@@ -1,3 +1,3 @@
====== Náhled ======
-Zde je náhled, jak bude dokument vypadat. Pozor: Soubor zatím **není uložen**!
+Zde je náhled, jak bude dokument vypadat. **Pozor: Soubor zatím není uložen**!
diff --git a/inc/lang/cs/recent.txt b/inc/lang/cs/recent.txt
index e4ca5e9bc..e0c369310 100644
--- a/inc/lang/cs/recent.txt
+++ b/inc/lang/cs/recent.txt
@@ -1,3 +1,3 @@
====== Poslední úpravy ======
-Následující stránky byly nedávno změněny.
+Následující stránky byly nedávno změněny:
diff --git a/inc/lang/cs/resetpwd.txt b/inc/lang/cs/resetpwd.txt
index 9aa449cb6..7e640d88a 100644
--- a/inc/lang/cs/resetpwd.txt
+++ b/inc/lang/cs/resetpwd.txt
@@ -1,3 +1,3 @@
====== Nastavení nového hesla ======
-Zadejte prosím nové heslo pro váš účet. \ No newline at end of file
+Zadejte prosím nové heslo pro váš účet.
diff --git a/inc/lang/cs/searchpage.txt b/inc/lang/cs/searchpage.txt
index 800d61c27..19b82d178 100644
--- a/inc/lang/cs/searchpage.txt
+++ b/inc/lang/cs/searchpage.txt
@@ -1,4 +1,3 @@
====== Vyhledávání ======
Výsledky hledání můžete vidět níže. @CREATEPAGEINFO@
-
diff --git a/inc/lang/cs/stopwords.txt b/inc/lang/cs/stopwords.txt
index 26d874143..d658a9344 100644
--- a/inc/lang/cs/stopwords.txt
+++ b/inc/lang/cs/stopwords.txt
@@ -913,6 +913,7 @@ vyšší
vzdor
vzhledem
vždy
+www
za
zač
začátkem
diff --git a/inc/lang/cs/updateprofile.txt b/inc/lang/cs/updateprofile.txt
index bf6281df2..787fe1aaa 100644
--- a/inc/lang/cs/updateprofile.txt
+++ b/inc/lang/cs/updateprofile.txt
@@ -1,5 +1,3 @@
====== Upravit profil vašeho účtu ======
Vyplňte pouze pole, která chcete změnit. Nemůžete ale změnit své uživatelské jméno.
-
-
diff --git a/inc/lang/cy/admin.txt b/inc/lang/cy/admin.txt
index 75485fcf2..85eb7ac26 100644
--- a/inc/lang/cy/admin.txt
+++ b/inc/lang/cy/admin.txt
@@ -1,4 +1,3 @@
====== Gweinyddu ======
Gallwch chi ddarganfod rhestr o dasgau gweinyddol ar gael mewn DokuWiki, isod.
-
diff --git a/inc/lang/cy/backlinks.txt b/inc/lang/cy/backlinks.txt
index 2180e5503..7405b0ef7 100644
--- a/inc/lang/cy/backlinks.txt
+++ b/inc/lang/cy/backlinks.txt
@@ -1,4 +1,3 @@
====== Olgysylltiadau ======
Dyma restr o dudalennau sy'n ymddangos eu bod nhw'n cysylltu'n ôl i'r dudalen gyfredol.
-
diff --git a/inc/lang/cy/conflict.txt b/inc/lang/cy/conflict.txt
index 133e863e5..4adeff7bf 100644
--- a/inc/lang/cy/conflict.txt
+++ b/inc/lang/cy/conflict.txt
@@ -3,4 +3,3 @@
Mae fersiwn mwy diweddar o'r ddogfen a wnaethoch chi olygu yn bodoli. Bydd hwn yn digwydd pan fydd defnyddiwr arall yn newid y ddogfen wrth i chi'n ei golygu hi.
Archwiliwch y gwahaniaethau isod yn drylwyr, yna penderfynnwch pa fersiwn i'w gadw. Os ydych chi'n dewis ''cadw'', caiff eich fersiwn chi ei gadw. Pwyswch ''canslo'' i gadw'r fersiwn cyfredol.
-
diff --git a/inc/lang/cy/denied.txt b/inc/lang/cy/denied.txt
index 2c0eb001c..f7ce869e0 100644
--- a/inc/lang/cy/denied.txt
+++ b/inc/lang/cy/denied.txt
@@ -1,4 +1,3 @@
====== Gwrthodwyd Hawl ======
Sori, 'sdim hawliau digonol 'da chi i barhau.
-
diff --git a/inc/lang/cy/diff.txt b/inc/lang/cy/diff.txt
index 69a9ff688..908093923 100644
--- a/inc/lang/cy/diff.txt
+++ b/inc/lang/cy/diff.txt
@@ -1,4 +1,3 @@
====== Gwahaniaethau ======
Mae hwn yn dangos y gwahaniaethau rhwng dau fersiwn y dudalen.
-
diff --git a/inc/lang/cy/draft.txt b/inc/lang/cy/draft.txt
index 3b10c511e..6074ceb1f 100644
--- a/inc/lang/cy/draft.txt
+++ b/inc/lang/cy/draft.txt
@@ -3,6 +3,3 @@
Doedd eich sesiwn golygu ddiwethaf heb gwblhau'n gywir. Gwnaeth DokuWiki gadw copi ddrafft yn awtomatig wrth i chi weithio, sydd nawr ar gael i chi er mwyn parhau gyda'ch golygu. Gallwch chi weld y data a gafodd ei gadw o'ch sesiwn diwethaf isod.
Penderfynwch os ydych chi am //adennill// eich sesiwn golygu goll, //dileu//'r drafft awtogadw neu //canslo//'r broses olygu.
-
-
-
diff --git a/inc/lang/cy/edit.txt b/inc/lang/cy/edit.txt
index 7e2d899ef..d3adfdd7e 100644
--- a/inc/lang/cy/edit.txt
+++ b/inc/lang/cy/edit.txt
@@ -1,2 +1 @@
Golygwch y dudalen a phwyso ''Cadw''. Gweler [[wiki:syntax]] ar gyfer cystrawen Wici. Golygwch y dudalen hon dim ond os ydych chi'n gallu ei **gwella** hi. Os ydych chi am brofi pethau, cymerwch eich camau cyntaf ar y [[playground:playground|maes chwarae]].
-
diff --git a/inc/lang/cy/index.txt b/inc/lang/cy/index.txt
index 607a2f695..17ce1103d 100644
--- a/inc/lang/cy/index.txt
+++ b/inc/lang/cy/index.txt
@@ -1,4 +1,3 @@
====== Map safle ======
Dyma fap safle o bob tudalen sydd ar gael, wedi'u trefnu gan [[doku>namespaces|namespaces]].
-
diff --git a/inc/lang/cy/install.html b/inc/lang/cy/install.html
index 406c7b456..7862804f9 100644
--- a/inc/lang/cy/install.html
+++ b/inc/lang/cy/install.html
@@ -1,24 +1,7 @@
-<p>Mae'r dudalen hon yn eich helpu chi i arsefydlu am y tro cyntaf a gyda ffurfweddu
-<a href="http://dokuwiki.org">Dokuwiki</a>. Mae mwy o wybodaeth ar yr arsefydlwr hwn
-ar <a href="http://dokuwiki.org/installer">dudalen ddogfennaeth</a> ei hun.</p>
+<p>Mae'r dudalen hon yn eich helpu chi i arsefydlu am y tro cyntaf a gyda ffurfweddu <a href="http://dokuwiki.org">Dokuwiki</a>. Mae mwy o wybodaeth ar yr arsefydlwr hwn ar <a href="http://dokuwiki.org/installer">dudalen ddogfennaeth</a> ei hun.</p>
-<p>Mae DokuWiki yn defnyddio ffeiliau arferol ar gyfer storio tudalennau wici a
-gwybodaeth gysylltiol gyda'r tudalennau hynny (e.e. delweddau, indecsau chwilio,
-hen adolygiadau, ac ati). Er mwyn gweithredu'n llwyddiannus mae'n
-<strong>rhaid</strong> i DokuWiki gael yr hawl i ysgrifennu i'r ffolderi sydd yn
-dal y ffeiliau hynny. 'Dyw'r arsefydlwr hwn ddim yn gallu gosod hawliau ffolderi.
-Bydd hwn, fel rheol, yn gorfod cael ei wneud yn uniongyrchol gydag anogwr gorchymyn,
-neu os ydych chi'n defnyddio gwesteiwr, drwy FTP neu eich panel gwesteio (e.e.
-cPanel).</p>
+<p>Mae DokuWiki yn defnyddio ffeiliau arferol ar gyfer storio tudalennau wici a gwybodaeth gysylltiol gyda'r tudalennau hynny (e.e. delweddau, indecsau chwilio, hen adolygiadau, ac ati). Er mwyn gweithredu'n llwyddiannus mae'n <strong>rhaid</strong> i DokuWiki gael yr hawl i ysgrifennu i'r ffolderi sydd yn dal y ffeiliau hynny. 'Dyw'r arsefydlwr hwn ddim yn gallu gosod hawliau ffolderi. Bydd hwn, fel rheol, yn gorfod cael ei wneud yn uniongyrchol gydag anogwr gorchymyn, neu os ydych chi'n defnyddio gwesteiwr, drwy FTP neu eich panel gwesteio (e.e. cPanel).</p>
-<p>Bydd yr arsefydlwr hwn yn gosod eich ffurfwedd DokuWiki ar gyfer
-<abbr title="access control list">ACL</abbr>, sydd yn ei dro yn caniat&aacute;u
-mewngofnodi gweinyddwr a mynediad i ddewislen gweinyddu DokuWiki ar gyfer arsefydlu
-ategion, rheoli defnyddwyr, rheoli mynediad i dudalennau wici a newid gosodiadau
-ffurfwedd. 'Sdim angen hwn ar DokuWiki er mwyn gweithio, ond bydd yn gwneud
-Dokuwiki yn haws i'w weinyddu.</p>
+<p>Bydd yr arsefydlwr hwn yn gosod eich ffurfwedd DokuWiki ar gyfer <abbr title="access control list">ACL</abbr>, sydd yn ei dro yn caniat&aacute;u mewngofnodi gweinyddwr a mynediad i ddewislen gweinyddu DokuWiki ar gyfer arsefydlu ategion, rheoli defnyddwyr, rheoli mynediad i dudalennau wici a newid gosodiadau ffurfwedd. 'Sdim angen hwn ar DokuWiki er mwyn gweithio, ond bydd yn gwneud Dokuwiki yn haws i'w weinyddu.</p>
-<p>Dylai defnyddwyr profiadol neu'r rheiny gydag anghenion gosodiad rrbennig special
-ddefnyddio'r dolenni hyn am wybodaeth parthed
-<a href="http://dokuwiki.org/install">canllawiau arsefydlu</a>
-and <a href="http://dokuwiki.org/config">gosodiadau ffurfwedd</a>.</p>
+<p>Dylai defnyddwyr profiadol neu'r rheiny gydag anghenion gosodiad rrbennig special ddefnyddio'r dolenni hyn am wybodaeth parthed <a href="http://dokuwiki.org/install">canllawiau arsefydlu</a> and <a href="http://dokuwiki.org/config">gosodiadau ffurfwedd</a>.</p>
diff --git a/inc/lang/cy/login.txt b/inc/lang/cy/login.txt
index dbdde0e67..4142d8401 100644
--- a/inc/lang/cy/login.txt
+++ b/inc/lang/cy/login.txt
@@ -1,4 +1,3 @@
====== Mewngofnodi ======
'Dych chi heb fewngofnodi! Rhowch eich manylion mewngofnodi isod. Mae angen galluogi cwcis er mwyn mewngofnodi.
-
diff --git a/inc/lang/cy/mailwrap.html b/inc/lang/cy/mailwrap.html
index 254fcca7a..c634fade4 100644
--- a/inc/lang/cy/mailwrap.html
+++ b/inc/lang/cy/mailwrap.html
@@ -1,13 +1,13 @@
<html>
<head>
- <title>@TITLE@</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
@HTMLBODY@
<br /><hr />
-<small>Cafodd y neges hon ei generadu gan DokuWiki ar @DOKUWIKIURL@.</small>
+<small>@EMAILSIGNATURE@</small>
</body>
</html>
diff --git a/inc/lang/cy/newpage.txt b/inc/lang/cy/newpage.txt
index dfe8a79d9..a0978df19 100644
--- a/inc/lang/cy/newpage.txt
+++ b/inc/lang/cy/newpage.txt
@@ -1,4 +1,3 @@
====== 'Dyw'r testun hwn ddim yn bodoli eto ======
-Rydych chi wedi dilyn dolen i destun sy ddim yn bodoli eto. Os oes hawliau 'da chi, gallwch chi ei greu gan bwyso ar "Creu y dudalen hon".
-
+Rydych chi wedi dilyn dolen i destun sy ddim yn bodoli eto. Os oes hawliau 'da chi, gallwch chi ei greu gan bwyso ar **Creu y dudalen hon**.
diff --git a/inc/lang/cy/norev.txt b/inc/lang/cy/norev.txt
index 7d978c550..cd11b0488 100644
--- a/inc/lang/cy/norev.txt
+++ b/inc/lang/cy/norev.txt
@@ -1,4 +1,3 @@
====== Adolygiad ddim y bodoli ======
'Dyw'r adolygiad hwn ddim yn bodoli. Pwyswch ar "Hen adolygiadau" am restr o hen adolygiadau'r ddogfen hon.
-
diff --git a/inc/lang/cy/preview.txt b/inc/lang/cy/preview.txt
index 477879d51..10ad6a17c 100644
--- a/inc/lang/cy/preview.txt
+++ b/inc/lang/cy/preview.txt
@@ -1,4 +1,3 @@
====== Rhagolwg ======
-Dyma ragolwg o sut fydd eich testun yn edrych. Cofiwch: 'Dyw e **heb ei gadw** 'to!
-
+Dyma ragolwg o sut fydd eich testun yn edrych. **Cofiwch: 'Dyw e heb ei gadw 'to**!
diff --git a/inc/lang/cy/pwconfirm.txt b/inc/lang/cy/pwconfirm.txt
index 529571e14..9e26d3e4d 100644
--- a/inc/lang/cy/pwconfirm.txt
+++ b/inc/lang/cy/pwconfirm.txt
@@ -1,15 +1,9 @@
Shw mae @FULLNAME@!
-Mae rhywun wedi gofyn am gyfrinair newydd ar gyfer eich manylion
-@TITLE@ ar @DOKUWIKIURL@
+Mae rhywun wedi gofyn am gyfrinair newydd ar gyfer eich manylion @TITLE@ ar @DOKUWIKIURL@
Os na wnaethoch chi ofyn am gyfrinair newydd, anwybyddwch yr e-bost hwn.
I gadarnhau daeth y cais oddi wrthoch chi, pwyswch y ddolen isod.
@CONFIRM@
-
---
-Cafodd y neges hon ei generadu gan DokuWiki ar
-@DOKUWIKIURL@
-
diff --git a/inc/lang/cy/read.txt b/inc/lang/cy/read.txt
index 8703ef937..d44ce09c2 100644
--- a/inc/lang/cy/read.txt
+++ b/inc/lang/cy/read.txt
@@ -1,2 +1 @@
Mae'r dudalen hon i'w darllen yn unig. Gallwch chi edrych ar y ffynhonnell, ond nid ei newid hi. Cysylltwch â'ch gweinyddwr chi os ydych chi'n meddwl bod hwn yn anghywir.
-
diff --git a/inc/lang/cy/recent.txt b/inc/lang/cy/recent.txt
index 2affbf905..408be516e 100644
--- a/inc/lang/cy/recent.txt
+++ b/inc/lang/cy/recent.txt
@@ -1,5 +1,3 @@
====== Newidiadau Diweddar ======
-Cafodd y tudalennau canlynol eu newid yn ddiweddar.
-
-
+Cafodd y tudalennau canlynol eu newid yn ddiweddar:
diff --git a/inc/lang/cy/register.txt b/inc/lang/cy/register.txt
index 6fbc85056..806a65abf 100644
--- a/inc/lang/cy/register.txt
+++ b/inc/lang/cy/register.txt
@@ -1,4 +1,3 @@
====== Cofrestru fel defnyddiwr newydd ======
Llenwch yr holl wybodaeth isod i greu cyfrif newydd ar y wici hwn. Sicrhewch eich bod chi'n cynnwys **cyfeiriad e-bost dilys** - os na chewch chi'ch annog am gyfrinair, caiff un ei anfon i'ch cyfeiriad. Dylai'r enw mewngofnodi fod yn [[doku>pagename|enw tudalen]] dilys.
-
diff --git a/inc/lang/cy/resendpwd.txt b/inc/lang/cy/resendpwd.txt
index ddad8a906..64324be49 100644
--- a/inc/lang/cy/resendpwd.txt
+++ b/inc/lang/cy/resendpwd.txt
@@ -1,4 +1,3 @@
====== Anfon cyfrinair newydd ======
Ailgyflwynwch eich defnyddair yn y ffurflen isod i wneud cais am gyfrinair newydd i'ch cyfrif ar y wici hwn. Caiff ddolen gadarnhau ei hanfon i chi drwy eich e-bost cofrestredig.
-
diff --git a/inc/lang/cy/resetpwd.txt b/inc/lang/cy/resetpwd.txt
index 57f19928e..922bb97aa 100644
--- a/inc/lang/cy/resetpwd.txt
+++ b/inc/lang/cy/resetpwd.txt
@@ -1,4 +1,3 @@
====== Gosod cyfrinair newydd ======
Rhowch gyfrinair newydd i'ch cyfrif ar y wici hwn.
-
diff --git a/inc/lang/cy/revisions.txt b/inc/lang/cy/revisions.txt
index afbc9fed2..b18fef7b7 100644
--- a/inc/lang/cy/revisions.txt
+++ b/inc/lang/cy/revisions.txt
@@ -1,4 +1,3 @@
====== Hen Adolygiadau ======
Dyma adolygiadau hŷn y ddogfen gyfredol. I droi'n ôl i hen adolygiad, dewiswch e isod a phwyso ''Golygu'r dudalen hon'' a'i gadw.
-
diff --git a/inc/lang/cy/searchpage.txt b/inc/lang/cy/searchpage.txt
index 6a645cb57..0967dc697 100644
--- a/inc/lang/cy/searchpage.txt
+++ b/inc/lang/cy/searchpage.txt
@@ -1,4 +1,3 @@
====== Chwilio ======
Gallwch chi ddarganfod canlyniadau eich chwiliad isod. @CREATEPAGEINFO@
-
diff --git a/inc/lang/cy/stopwords.txt b/inc/lang/cy/stopwords.txt
index 2ac4c3174..742e9a3d8 100644
--- a/inc/lang/cy/stopwords.txt
+++ b/inc/lang/cy/stopwords.txt
@@ -28,4 +28,4 @@ pwy
roedd
sut
wrth
-www \ No newline at end of file
+www
diff --git a/inc/lang/cy/updateprofile.txt b/inc/lang/cy/updateprofile.txt
index ce9ca503f..8f5e3f2e3 100644
--- a/inc/lang/cy/updateprofile.txt
+++ b/inc/lang/cy/updateprofile.txt
@@ -1,5 +1,3 @@
====== Diweddaru proffil eich cyfrif ======
Newidiwch y meysydd rydych chi amm newid yn unig. 'Sdim modd i chi newid eich defnyddair.
-
-
diff --git a/inc/lang/da/admin.txt b/inc/lang/da/admin.txt
index 3ac4a70df..01093fb64 100644
--- a/inc/lang/da/admin.txt
+++ b/inc/lang/da/admin.txt
@@ -1,4 +1,3 @@
====== Administration ======
Nedenfor kan du finde en række administrative værktøjer.
-
diff --git a/inc/lang/da/backlinks.txt b/inc/lang/da/backlinks.txt
index 6dfa3cc43..c6f7e90d6 100644
--- a/inc/lang/da/backlinks.txt
+++ b/inc/lang/da/backlinks.txt
@@ -1,4 +1,3 @@
====== Henvisninger bagud ======
Dette er en liste over alle de dokumenter der henviser tilbage til det nuværende dokument.
-
diff --git a/inc/lang/da/diff.txt b/inc/lang/da/diff.txt
index f77224f2f..9ca1f7fd8 100644
--- a/inc/lang/da/diff.txt
+++ b/inc/lang/da/diff.txt
@@ -1,4 +1,3 @@
====== Forskelle ======
Dette viser forskellene mellem den valgte og den nuværende udgave af dokumentet. Gul er linjer der findes i den gamle udgave, og grøn er linjer der findes i den nuværende.
-
diff --git a/inc/lang/da/draft.txt b/inc/lang/da/draft.txt
index 69c780140..105fed7ec 100644
--- a/inc/lang/da/draft.txt
+++ b/inc/lang/da/draft.txt
@@ -3,4 +3,3 @@
Din sidste redigeringssession på denne side blev ikke afsluttet korrekt. DokuWiki har automatisk gemt en kladde mens du arbejdede, som du kan benytte til at fortsætte redigeringen. Forneden kan du se de data der blev gemt fra din sidste session.
Vælg venligst, om du vil //gendanne// din tabte redigering, //slette// den gemte kladde eller //afbryde// redigeringen.
-
diff --git a/inc/lang/da/edit.txt b/inc/lang/da/edit.txt
index 0a9ea39dc..41c410827 100644
--- a/inc/lang/da/edit.txt
+++ b/inc/lang/da/edit.txt
@@ -1,2 +1 @@
Rediger dette dokument og tryk på knappen **''[Gem]''**. Se [[wiki:syntax|Formaterings tips]] for Wiki syntaks. Ret venligst kun dette dokument hvis du kan **forbedre** det. Brug venligst [[playground:playground|sandkassen]] til at teste før du retter i et rigtigt dokument. Husk også at bruge **''[Forhåndsvisning]''** før du gemmer dokumentet.
-
diff --git a/inc/lang/da/editrev.txt b/inc/lang/da/editrev.txt
index 438363e5d..46db55848 100644
--- a/inc/lang/da/editrev.txt
+++ b/inc/lang/da/editrev.txt
@@ -1,2 +1,2 @@
-**Du har hentet en gammel udgave af dette dokument!** Hvis du gemmer dokumentet vil du overskrive den nuværende med den gamle udgave.
+**Du har hentet en gammel revision af dette dokument!** Hvis du gemmer dokumentet vil du overskrive den nuværende revision med denne udgave.
----
diff --git a/inc/lang/da/index.txt b/inc/lang/da/index.txt
index 74afb9831..f0fae97bb 100644
--- a/inc/lang/da/index.txt
+++ b/inc/lang/da/index.txt
@@ -1,3 +1,3 @@
====== Indeks ======
-Dette er en oversigt over alle tilgængelige dokumenter, sorteret efter [[doku>namespaces|navnerum]].
+Dette er en oversigt over alle tilgængelige dokumenter, sorteret efter [[doku>da:namespaces|navnerum]].
diff --git a/inc/lang/da/install.html b/inc/lang/da/install.html
index 3cc13f8e2..6ea2b5a32 100644
--- a/inc/lang/da/install.html
+++ b/inc/lang/da/install.html
@@ -1,24 +1,7 @@
-<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>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
-kontrol panel (f.eks. cPanel).</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 kontrol panel (f.eks. cPanel).</p>
-<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>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
-<a href="http://dokuwiki.org/install">installations instruktioner</a>
-og <a href="http://dokuwiki.org/config">konfigurations indstillinger</a>.</p>
+<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 c9374f21e..03c367c35 100644
--- a/inc/lang/da/lang.php
+++ b/inc/lang/da/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jacob Palm <jacobpalmdk@icloud.com>
* @author Kenneth Schack Banner <kescba@gmail.com>
* @author Jon Theil Nielsen <jontheil@gmail.com>
* @author koeppe <koeppe@kazur.dk>
@@ -19,7 +20,6 @@
* @author Jens Hyllegaard <jens.hyllegaard@gmail.com>
* @author soer9648 <soer9648@eucl.dk>
* @author Søren Birk <sbi@eucl.dk>
- * @author Jacob Palm <mail@jacobpalm.dk>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -38,7 +38,7 @@ $lang['btn_preview'] = 'Forhåndsvisning';
$lang['btn_top'] = 'Tilbage til toppen';
$lang['btn_newer'] = '<< forrige side';
$lang['btn_older'] = 'næste side >>';
-$lang['btn_revs'] = 'Gamle udgaver';
+$lang['btn_revs'] = 'Gamle revisioner';
$lang['btn_recent'] = 'Nye ændringer';
$lang['btn_upload'] = 'Overfør';
$lang['btn_cancel'] = 'Fortryd';
@@ -62,7 +62,7 @@ $lang['btn_revert'] = 'Gendan';
$lang['btn_register'] = 'Registrér';
$lang['btn_apply'] = 'Anvend';
$lang['btn_media'] = 'Media Manager';
-$lang['btn_deleteuser'] = 'Fjern Min Konto';
+$lang['btn_deleteuser'] = 'Fjern min brugerkonto';
$lang['btn_img_backto'] = 'Tilbage til %s';
$lang['btn_mediaManager'] = 'Vis i Media Manager';
$lang['loggedinas'] = 'Logget ind som:';
@@ -73,50 +73,16 @@ $lang['oldpass'] = 'Bekræft gammel adgangskode';
$lang['passchk'] = 'Gentag ny adgangskode';
$lang['remember'] = 'Automatisk log ind';
$lang['fullname'] = 'Fulde navn';
-$lang['email'] = 'E-mail';
+$lang['email'] = 'E-mail adresse';
$lang['profile'] = 'Brugerprofil';
$lang['badlogin'] = 'Brugernavn eller adgangskode var forkert.';
$lang['badpassconfirm'] = 'Adgangkode var desværre forkert';
$lang['minoredit'] = 'Mindre ændringer';
$lang['draftdate'] = 'Kladde automatisk gemt d.';
$lang['nosecedit'] = 'Siden blev ændret i mellemtiden, sektions information var for gammel, hentede hele siden i stedet.';
-$lang['regmissing'] = 'Du skal udfylde alle felter.';
-$lang['reguexists'] = 'Dette brugernavn er allerede i brug.';
-$lang['regsuccess'] = 'Du er nu oprettet som bruger. Dit adgangskode bliver sendt til dig i en e-mail.';
-$lang['regsuccess2'] = 'Du er nu oprettet som bruger.';
-$lang['regfail'] = 'Brugeren kunne ikke oprettes.';
-$lang['regmailfail'] = 'Dit adgangskode blev ikke sendt. Kontakt venligst administratoren.';
-$lang['regbadmail'] = 'E-mail-adressen er ugyldig. Kontakt venligst administratoren, hvis du mener dette er en fejl.';
-$lang['regbadpass'] = 'De to adgangskoder er ikke ens, vær venlig at prøve igen.';
-$lang['regpwmail'] = 'Dit adgangskode til DokuWiki';
-$lang['reghere'] = 'Opret en DokuWiki-konto her';
-$lang['profna'] = 'Denne wiki understøtter ikke ændring af profiler';
-$lang['profnochange'] = 'Ingen ændringer, intet modificeret.';
-$lang['profnoempty'] = 'Tomt navn eller e-mail adresse er ikke tilladt.';
-$lang['profchanged'] = 'Brugerprofil opdateret korrekt.';
-$lang['profnodelete'] = 'Denne wiki understøtter ikke sletning af brugere';
-$lang['profdeleteuser'] = 'Slet konto';
-$lang['profdeleted'] = 'Din brugerkonto er blevet slettet fra denne wiki';
-$lang['profconfdelete'] = 'Jeg ønsker at slette min konto fra denne wiki. <br/> Denne handling kan ikke fortrydes.';
-$lang['proffail'] = 'Brugerprofilen blev ikke opdateret.';
-$lang['pwdforget'] = 'Har du glemt dit adgangskode? Få en ny';
-$lang['resendna'] = 'Denne wiki understøtter ikke udsendelse af ny adgangskode.';
-$lang['resendpwd'] = 'Vælg en 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.';
-$lang['resendpwdconfirm'] = 'En e-mail med et link til bekræftelse er blevet sendt.';
-$lang['resendpwdsuccess'] = 'Din nye adgangskode er blevet sendt med e-mail.';
-$lang['license'] = 'Med mindre andet angivet, vil indhold på denne wiki blive udgivet under følgende licens:';
-$lang['licenseok'] = 'Bemærk - ved at redigere denne side, accepterer du at dit indhold bliver frigivet under følgende licens:';
-$lang['searchmedia'] = 'Søg filnavn';
-$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['searchcreatepage'] = 'Hvis du ikke fandt hvad du ledte efter, kan du oprette eller redigere siden %s, opkaldt efter din forespørgsel.';
+$lang['search_fullresults'] = 'Fuld-tekst resultater';
+$lang['js']['search_toggle_tools'] = 'Vis/skjul søgeværktøjer';
$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?';
@@ -160,6 +126,56 @@ $lang['js']['media_done_btn'] = 'Færdig';
$lang['js']['media_drop'] = 'Træk filer hertil for at overføre';
$lang['js']['media_cancel'] = 'fjern';
$lang['js']['media_overwrt'] = 'Overskriv eksisterende filer';
+$lang['search_exact_match'] = 'Præcist match';
+$lang['search_starts_with'] = 'Starter med';
+$lang['search_ends_with'] = 'Slutter med';
+$lang['search_contains'] = 'Indeholder';
+$lang['search_custom_match'] = 'Brugerdefineret';
+$lang['search_any_ns'] = 'Ethvert navnerum';
+$lang['search_any_time'] = 'Når som helst';
+$lang['search_past_7_days'] = 'Seneste uge';
+$lang['search_past_month'] = 'Seneste måned';
+$lang['search_past_year'] = 'Seneste år';
+$lang['search_sort_by_hits'] = 'Sorter efter visninger';
+$lang['search_sort_by_mtime'] = 'Sorter efter ændringsdato';
+$lang['regmissing'] = 'Du skal udfylde alle felter.';
+$lang['reguexists'] = 'Dette brugernavn er allerede i brug.';
+$lang['regsuccess'] = 'Du er nu oprettet som bruger. Din adgangskode bliver sendt til dig i en e-mail.';
+$lang['regsuccess2'] = 'Du er nu oprettet som bruger.';
+$lang['regfail'] = 'Brugeren kunne ikke oprettes.';
+$lang['regmailfail'] = 'Dit adgangskode blev ikke sendt. Kontakt venligst administratoren.';
+$lang['regbadmail'] = 'E-mail-adressen er ugyldig. Kontakt venligst administratoren, hvis du mener dette er en fejl.';
+$lang['regbadpass'] = 'De to adgangskoder er ikke ens, prøv venligst igen.';
+$lang['regpwmail'] = 'Din adgangskode til DokuWiki';
+$lang['reghere'] = 'Har du ikke en brugerkonto? Opret en nu';
+$lang['profna'] = 'Denne wiki understøtter ikke ændring af profiler';
+$lang['profnochange'] = 'Ingen ændringer, intet modificeret.';
+$lang['profnoempty'] = 'Tomt navn eller e-mail adresse er ikke tilladt.';
+$lang['profchanged'] = 'Brugerprofil opdateret korrekt.';
+$lang['profnodelete'] = 'Denne wiki understøtter ikke sletning af brugere';
+$lang['profdeleteuser'] = 'Slet brugerkonto';
+$lang['profdeleted'] = 'Din brugerkonto er blevet slettet fra denne wiki';
+$lang['profconfdelete'] = 'Jeg ønsker at slette min brugerkonto fra denne wiki. <br/> Denne handling kan ikke fortrydes.';
+$lang['profconfdeletemissing'] = 'Afkrydsningsfelt til bekræftelse er ikke markeret';
+$lang['proffail'] = 'Brugerprofilen blev ikke opdateret.';
+$lang['pwdforget'] = 'Har du glemt din adgangskode? Få en ny';
+$lang['resendna'] = 'Denne wiki understøtter ikke udsendelse af ny adgangskode.';
+$lang['resendpwd'] = 'Vælg en 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.';
+$lang['resendpwdconfirm'] = 'En e-mail med et link til bekræftelse er blevet sendt.';
+$lang['resendpwdsuccess'] = 'Din nye adgangskode er blevet sendt med e-mail.';
+$lang['license'] = 'Med mindre andet angivet, vil indhold på denne wiki blive udgivet under følgende licens:';
+$lang['licenseok'] = 'Bemærk - ved at redigere denne side, accepterer du at dit indhold bliver frigivet under følgende licens:';
+$lang['searchmedia'] = 'Søg filnavn';
+$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['rssfailed'] = 'Der opstod en fejl ved hentning af dette feed: ';
$lang['nothingfound'] = 'Søgningen gav intet resultat.';
$lang['mediaselect'] = 'Vælg mediefil';
@@ -190,7 +206,7 @@ $lang['quickhits'] = 'Tilsvarende sidenavne';
$lang['toc'] = 'Indholdsfortegnelse';
$lang['current'] = 'nuværende';
$lang['yours'] = 'Din version';
-$lang['diff'] = 'Vis forskelle i forhold til den nuværende udgave';
+$lang['diff'] = 'Vis forskelle i forhold til den nuværende revision';
$lang['diff2'] = 'Vis forskelle i forhold til de valgte revisioner';
$lang['difflink'] = 'Link til denne sammenlinings vising';
$lang['diff_type'] = 'Vis forskelle:';
@@ -208,7 +224,7 @@ $lang['lastmod'] = 'Sidst ændret:';
$lang['by'] = 'af';
$lang['deleted'] = 'slettet';
$lang['created'] = 'oprettet';
-$lang['restored'] = 'gammel udgave gendannet (%s)';
+$lang['restored'] = 'gammel revision gendannet (%s)';
$lang['external_edit'] = 'ekstern redigering';
$lang['summary'] = 'Resumé af ændrigner';
$lang['noflash'] = 'Du skal installere <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Player</a> for at kunne se dette indhold.';
@@ -218,7 +234,7 @@ $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['sidebar'] = 'Sidebjælke';
+$lang['sidebar'] = 'Sidepanel';
$lang['mail_newpage'] = 'side tilføjet:';
$lang['mail_changed'] = 'side ændret:';
$lang['mail_subscribe_list'] = 'sider ændret i navnerum:';
@@ -295,8 +311,11 @@ $lang['i_modified'] = 'Af sikkerheds hensyn vil dette script kun virk
Du burde enten gen-udpakke filerne fra den hentede pakke eller tjekke den fuldstændige
<a href="http://dokuwiki.org/install">DokuWiki installations instruktioner</a>';
$lang['i_funcna'] = 'PHP funtionen <code>%s</code> er ikke tilgængelig. Måske har din udbyder slået det fra af en eller anden grund?';
+$lang['i_disabled'] = 'Det er blevet slået fra af din udbyder.';
+$lang['i_funcnmail'] = '<b>Bemærk:</b> PHP mail funktionen er ikke tilgængelig. %s Hvis den forbliver utilgængelig, kan du installere <a href="http://dokuwiki.org/plugins/smtp">SMTP udvidelsen</a>.';
$lang['i_phpver'] = 'Din PHP version <code>%s</code> er mindre en den nødvendige <code>%s</code>. Du er nød til at opgradere din PHP installation.';
$lang['i_mbfuncoverload'] = 'mbstring.func_overload skal være deaktiveret i php.ini for at køre DokuWiki.';
+$lang['i_urandom'] = 'DokuWiki kan ikke oprette kryptografisk sikre numre til cookies. Du bør måske kontrollere dine open_basedir indstillinger i php.ini for korrekt <code>/dev/urandom</code> adgang.';
$lang['i_permfail'] = 'DokuWiki kan ikke skrive til <code>%s</code>. Du er nød til at rette tilladelses indstillingerne for denne mappe!';
$lang['i_confexists'] = '<code>%s</code> eksisterer allerede';
$lang['i_writeerr'] = 'Kunne ikke oprette <code>%s</code>. Du bliver nød til at tjekke mappe/fil- tilladelserne og oprette filen manuelt.';
@@ -347,10 +366,12 @@ $lang['media_perm_upload'] = 'Du har ikke nok rettigheder til at uploade fil
$lang['media_update'] = 'Upload ny version';
$lang['media_restore'] = 'Genskab denne version';
$lang['media_acl_warning'] = 'Listen er måske ikke komplet pga. ACL restriktioner og skjulte sider.';
+$lang['email_fail'] = 'PHP mail() mangler eller er slået fra. Den følgende mail blev ikke sendt:';
$lang['currentns'] = 'Nuværende navnerum';
$lang['searchresult'] = 'Søgsresultat';
$lang['plainhtml'] = 'Ren HTML';
$lang['wikimarkup'] = 'Wiki Opmærkning';
$lang['page_nonexist_rev'] = 'Siden blev ikke fundet ved %s. Den blev efterfølgende oprettet ved <a href="%s">%s</a>.';
+$lang['unable_to_parse_date'] = 'Kan ikke fortolke parameteren "%s".';
$lang['email_signature_text'] = 'Denne e-mail blev genereret af DokuWiki på
@DOKUWIKIURL@';
diff --git a/inc/lang/da/newpage.txt b/inc/lang/da/newpage.txt
index 1d602c02c..1f23c8463 100644
--- a/inc/lang/da/newpage.txt
+++ b/inc/lang/da/newpage.txt
@@ -1,3 +1,3 @@
====== Dette dokument eksisterer ikke (endnu) ======
-Du har fulgt en henvisning til et dokument der ikke eksisterer (endnu). Du kan oprette dokumentet ved at trykke på knappen **''[Opret dette dokument]''**.
+Du har fulgt en henvisning til et dokument der ikke eksisterer (endnu). Du kan oprette dokumentet ved at trykke på knappen **Opret dette dokument**.
diff --git a/inc/lang/da/norev.txt b/inc/lang/da/norev.txt
index aa6896237..a30fa110f 100644
--- a/inc/lang/da/norev.txt
+++ b/inc/lang/da/norev.txt
@@ -1,4 +1,3 @@
-====== Den valgte udgave findes ikke ======
-
-Den valgte udgave af dokumentet findes ikke! Tryk på knappen **''[Gamle udgaver]''** for at se en liste af gamle udgaver af dette dokument.
+====== Den valgte revision findes ikke ======
+Den valgte revision af dokumentet findes ikke. Tryk på knappen **''[Gamle revisioner]''** for at se en liste af gamle revisioner af dette dokument.
diff --git a/inc/lang/da/onceexisted.txt b/inc/lang/da/onceexisted.txt
new file mode 100644
index 000000000..5e71c66e1
--- /dev/null
+++ b/inc/lang/da/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Denne side findes ikke længere ======
+
+Du har fulgt et link til en side der ikke længere eksisterer. Du kan kigge i listen over [[?do=revisions|gamle revisioner]] for at se hvorfor/hvornår siden blev slettet, samt tilgå gamle revisioner eller gendanne siden. \ No newline at end of file
diff --git a/inc/lang/da/password.txt b/inc/lang/da/password.txt
index b129bb9b1..5bf30c0fb 100644
--- a/inc/lang/da/password.txt
+++ b/inc/lang/da/password.txt
@@ -1,6 +1,6 @@
Hej @FULLNAME@!
-Her er dine brugeroplysninger @TITLE@ at @DOKUWIKIURL@
+Her er dine brugeroplysninger til @TITLE@ på @DOKUWIKIURL@
-Brugernavn : @LOGIN@
-Adgangskode : @PASSWORD@
+Brugernavn: @LOGIN@
+Adgangskode: @PASSWORD@
diff --git a/inc/lang/da/preview.txt b/inc/lang/da/preview.txt
index 23e65e89d..92910d13f 100644
--- a/inc/lang/da/preview.txt
+++ b/inc/lang/da/preview.txt
@@ -1,4 +1,3 @@
====== Forhåndsvisning ======
Dette er en forhåndsvisning af hvordan dokumentet vil se ud. Husk: Det er //**IKKE**// gemt endnu! Hvis det ser godt ud, så tryk på knappen **''[Gem]''**
-
diff --git a/inc/lang/da/pwconfirm.txt b/inc/lang/da/pwconfirm.txt
index 25c20a4a3..180443015 100644
--- a/inc/lang/da/pwconfirm.txt
+++ b/inc/lang/da/pwconfirm.txt
@@ -1,10 +1,9 @@
Hej @FULLNAME@!
-Nogen har bedt om et nyt password til dit @TITLE@
-login på @DOKUWIKIURL@
+Nogen har bedt om et nyt password til dit @TITLE@ login på @DOKUWIKIURL@
Hvis du ikke bad om dette, så ignorer venligst denne email.
-For at bekræfte at det var dig der bad om dette, benyt venligst det følgende henvisning.
+For at bekræfte at det var dig der bad om dette, benyt venligst den følgende henvisning.
@CONFIRM@
diff --git a/inc/lang/da/read.txt b/inc/lang/da/read.txt
index 49f65831b..f4a19a5b5 100644
--- a/inc/lang/da/read.txt
+++ b/inc/lang/da/read.txt
@@ -1,2 +1 @@
Dette dokument kan kun læses. Du kan se kildekoden, men ikke gemme ændringer i det. Hvis du mener at dette er en fejl, så skriv det venligst på [[wiki:fejl-oversigt]].
-
diff --git a/inc/lang/da/recent.txt b/inc/lang/da/recent.txt
index c44fa368e..c8c77ae2a 100644
--- a/inc/lang/da/recent.txt
+++ b/inc/lang/da/recent.txt
@@ -1,5 +1,3 @@
====== Nye ændringer ======
-Følgende dokumenter er blevet ændret for nylig.
-
-
+Følgende dokumenter er blevet ændret for nylig:
diff --git a/inc/lang/da/register.txt b/inc/lang/da/register.txt
index 4ff2ed1eb..998d96054 100644
--- a/inc/lang/da/register.txt
+++ b/inc/lang/da/register.txt
@@ -1,4 +1,3 @@
====== Opret en wiki-konto ======
-Udfyld nedenstånde skema for at oprette en konto i denne wiki. Sørg for at bruge en **gyldig e-mail-adresse** - dit adgangskode bliver sendt til dig. Dit brugernavn skal være et gyldigt [[doku>pagename|dokumentnavn]].
-
+Udfyld nedenstånde skema for at oprette en brugerkonto i denne wiki. Sørg for at bruge en **gyldig e-mail adresse** - din adgangskode bliver sendt til dig. Dit brugernavn skal være et gyldigt [[doku>da:pagename|sidenavn]].
diff --git a/inc/lang/da/registermail.txt b/inc/lang/da/registermail.txt
index 8ce3b54dc..6a3b05607 100644
--- a/inc/lang/da/registermail.txt
+++ b/inc/lang/da/registermail.txt
@@ -1,4 +1,4 @@
-En ny bruger har registreret. Her er detaljerne:
+En ny bruger er bæevet oprettet. Her er detaljerne:
Brugernavn : @NEWUSER@
Navn : @NEWNAME@
diff --git a/inc/lang/da/resendpwd.txt b/inc/lang/da/resendpwd.txt
index e96861ed2..e015d5898 100644
--- a/inc/lang/da/resendpwd.txt
+++ b/inc/lang/da/resendpwd.txt
@@ -1,3 +1,3 @@
-====== Send nyt password ======
+====== Send ny adgangskode ======
-Udfyld alle nedenstående felter for at få tilsendt et nyt password til denne wiki. Dit nye password vil blive sendt til den opgivne e-mail-adresse. Brugernavnet bør være dit wiki brugernavn.
+Udfyld alle nedenstående felter for at få tilsendt en ny adgangskode til denne wiki. Din nye adgangskode vil blive sendt til den angivne e-mail adresse. Brugernavnet bør være dit wiki brugernavn.
diff --git a/inc/lang/da/resetpwd.txt b/inc/lang/da/resetpwd.txt
index e0823db17..3cd84813e 100644
--- a/inc/lang/da/resetpwd.txt
+++ b/inc/lang/da/resetpwd.txt
@@ -1,3 +1,3 @@
====== Vælg ny adgangskode ======
-Indtast venligst en ny adgangskode for din konto på denne wiki. \ No newline at end of file
+Indtast venligst en ny adgangskode til din brugerkonto på denne wiki.
diff --git a/inc/lang/da/revisions.txt b/inc/lang/da/revisions.txt
index 08f6f2073..396f5e1b1 100644
--- a/inc/lang/da/revisions.txt
+++ b/inc/lang/da/revisions.txt
@@ -1,3 +1,3 @@
-====== Gamle udgaver ======
+====== Gamle revisioner ======
-Her er de gamle udgaver af dette dokument. Du kan vende tilbage til en tidligere udgave af dokumentet ved at vælge det nedenfor, trykke på knappen **''[Rediger dette dokument]''**, og til sidst gemme dokumentet.
+Her er de gamle revisioner af dette dokument. Du kan vende tilbage til en tidligere revision af dokumentet ved at vælge den nedenfor, trykke på knappen **''[Rediger dette dokument]''**, og til sidst gemme dokumentet.
diff --git a/inc/lang/da/searchpage.txt b/inc/lang/da/searchpage.txt
index c4447852f..05c269b68 100644
--- a/inc/lang/da/searchpage.txt
+++ b/inc/lang/da/searchpage.txt
@@ -1,4 +1,3 @@
====== Søgning ======
Du kan se resultaterne af din søgning nedenunder. @CREATEPAGEINFO@
-
diff --git a/inc/lang/da/showrev.txt b/inc/lang/da/showrev.txt
index 3d4890397..bac17c792 100644
--- a/inc/lang/da/showrev.txt
+++ b/inc/lang/da/showrev.txt
@@ -1,2 +1,2 @@
-**Dette er en gammel udgave af dokumentet!**
+**Dette er en gammel revision af dokumentet!**
----
diff --git a/inc/lang/da/stopwords.txt b/inc/lang/da/stopwords.txt
index 0fb926720..cd27cb9b9 100644
--- a/inc/lang/da/stopwords.txt
+++ b/inc/lang/da/stopwords.txt
@@ -84,4 +84,4 @@ syv
til
tre
var
-www \ No newline at end of file
+www
diff --git a/inc/lang/da/subscr_digest.txt b/inc/lang/da/subscr_digest.txt
index 06a28d681..74ac67a22 100644
--- a/inc/lang/da/subscr_digest.txt
+++ b/inc/lang/da/subscr_digest.txt
@@ -7,10 +7,8 @@ Her er ændringerne:
@DIFF@
--------------------------------------------------------
-Gammel Revision: @OLDPAGE@
-Ny Revision: @NEWPAGE@
+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.
+For at stoppe notifikationer om sideændringer, log ind på wikien på
+@DOKUWIKIURL@ og besøg @SUBSCRIBE@ for at afmelde side og/eller navneområde ændringer.
diff --git a/inc/lang/da/subscr_single.txt b/inc/lang/da/subscr_single.txt
index fb5052368..8894b638e 100644
--- a/inc/lang/da/subscr_single.txt
+++ b/inc/lang/da/subscr_single.txt
@@ -10,10 +10,8 @@ Her er ændringerne:
Dato : @DATE@
Bruger : @USER@
Summering: @SUMMARY@
-Gammel Revision: @OLDPAGE@
-Ny Revision: @NEWPAGE@
+Gammel revision: @OLDPAGE@
+Ny revision: @NEWPAGE@
-For at slå side notifikationer fra, skal du logge ind på
-@DOKUWIKIURL@ og besøge
-@SUBSCRIBE@
-og slå abonnoment for side / navnerum ændringer fra.
+For at stoppe notifikationer om sideændringer, log ind på wikien på
+@DOKUWIKIURL@ og besøg @SUBSCRIBE@ for at afmelde side og/eller navneområde ændringer..
diff --git a/inc/lang/da/updateprofile.txt b/inc/lang/da/updateprofile.txt
index 2c6ce3f16..67d138a40 100644
--- a/inc/lang/da/updateprofile.txt
+++ b/inc/lang/da/updateprofile.txt
@@ -1,3 +1,3 @@
-====== Opdater din kontos profil ======
+====== Opdater din brugerkonto ======
Du behøver kun at udfylde de felter du ønsker at ændre. Du kan ikke ændre dit brugernavn.
diff --git a/inc/lang/da/uploadmail.txt b/inc/lang/da/uploadmail.txt
index 87a087589..e45b89ad6 100644
--- a/inc/lang/da/uploadmail.txt
+++ b/inc/lang/da/uploadmail.txt
@@ -1,6 +1,7 @@
-En fil blev overføret til din DokuWiki. Her er detaljerne:
+En fil blev overført til din DokuWiki. Her er detaljerne:
Fil : @MEDIA@
+Gammel revision: @OLD@
Dato : @DATE@
Browser : @BROWSER@
IP-adresse : @IPADDRESS@
diff --git a/inc/lang/de-informal/admin.txt b/inc/lang/de-informal/admin.txt
index c52f343ea..aa5f00a10 100644
--- a/inc/lang/de-informal/admin.txt
+++ b/inc/lang/de-informal/admin.txt
@@ -1,4 +1,3 @@
====== Administration ======
Folgende administrative Aufgaben stehen in DokuWiki zur Verfügung.
-
diff --git a/inc/lang/de-informal/backlinks.txt b/inc/lang/de-informal/backlinks.txt
index aae4c5582..8a43b59a6 100644
--- a/inc/lang/de-informal/backlinks.txt
+++ b/inc/lang/de-informal/backlinks.txt
@@ -1,5 +1,3 @@
====== Backlinks ======
Dies ist eine Liste der Seiten, die zurück zur momentanen Seite linken.
-
-
diff --git a/inc/lang/de-informal/conflict.txt b/inc/lang/de-informal/conflict.txt
index eec345061..5d39acef2 100644
--- a/inc/lang/de-informal/conflict.txt
+++ b/inc/lang/de-informal/conflict.txt
@@ -3,4 +3,3 @@
Eine neuere Version des aktuell in Bearbeitung befindlichen Dokuments existiert. Das heißt, jemand hat gleichzeitig an der selben Seite gearbeitet und zuerst gespeichert.
Die unten aufgeführten Unterschiede können bei der Entscheidung helfen, welchem Dokument Vorrang gewährt wird. Wähle **''[Speichern]''** zum Sichern deiner Version oder **''[Abbrechen]''**, um deine Version zu verwerfen und die zuerst gespeicherte Seite zu behalten.
-
diff --git a/inc/lang/de-informal/denied.txt b/inc/lang/de-informal/denied.txt
index 99004f6e1..30f1adb31 100644
--- a/inc/lang/de-informal/denied.txt
+++ b/inc/lang/de-informal/denied.txt
@@ -1,4 +1,3 @@
====== Zugang verweigert ======
Du hast nicht die erforderliche Berechtigung, um diese Aktion durchzuführen.
-
diff --git a/inc/lang/de-informal/diff.txt b/inc/lang/de-informal/diff.txt
index 82fbbc252..ecb82684a 100644
--- a/inc/lang/de-informal/diff.txt
+++ b/inc/lang/de-informal/diff.txt
@@ -1,5 +1,3 @@
====== Unterschiede ======
Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
-
-
diff --git a/inc/lang/de-informal/draft.txt b/inc/lang/de-informal/draft.txt
index e56dbe083..ba373a683 100644
--- a/inc/lang/de-informal/draft.txt
+++ b/inc/lang/de-informal/draft.txt
@@ -3,4 +3,3 @@
Deine letzte Bearbeitungssitzung wurde nicht ordnungsgemäß abgeschlossen. DokuWiki hat während deiner Arbeit automatisch einen Zwischenentwurf gespeichert, den du jetzt nutzen kannst, um deine Arbeit fortzusetzen. Unten siehst du die Daten, die bei deiner letzten Sitzung gespeichert wurden.
Bitte entscheide dich, ob du den Entwurf //wiederherstellen// oder //löschen// willst oder ob du die Bearbeitung abbrechen möchtest.
-
diff --git a/inc/lang/de-informal/edit.txt b/inc/lang/de-informal/edit.txt
index 28a764124..c13106ff0 100644
--- a/inc/lang/de-informal/edit.txt
+++ b/inc/lang/de-informal/edit.txt
@@ -1,4 +1 @@
-Bitte bearbeite dieses Dokument nur, wenn du es **verbessern** kannst.
-
-Nach dem Bearbeiten den **''[Speichern]''**-Knopf drücken. Siehe [[wiki:syntax]] zur Wiki-Syntax. Zum Testen bitte erst im [[playground:playground|Spielplatz]] üben.
-
+Bitte bearbeite dieses Dokument nur, wenn du es **verbessern** kannst. Nach dem Bearbeiten den **''[Speichern]''**-Knopf drücken. Siehe [[wiki:syntax]] zur Wiki-Syntax. Zum Testen bitte erst im [[playground:playground|Spielplatz]] üben.
diff --git a/inc/lang/de-informal/editrev.txt b/inc/lang/de-informal/editrev.txt
index 6c1f642cc..40a8b72d2 100644
--- a/inc/lang/de-informal/editrev.txt
+++ b/inc/lang/de-informal/editrev.txt
@@ -1,2 +1,2 @@
**Eine ältere Version des Dokuments wurde geladen!** Beim Speichern wird eine neue Version des Dokuments mit diesem Inhalt erstellt.
----- \ No newline at end of file
+----
diff --git a/inc/lang/de-informal/index.txt b/inc/lang/de-informal/index.txt
index fa8dc4663..5509bff09 100644
--- a/inc/lang/de-informal/index.txt
+++ b/inc/lang/de-informal/index.txt
@@ -1,4 +1,3 @@
====== Übersicht ======
Dies ist eine Übersicht über alle vorhandenen Seiten und [[doku>namespaces|Namensräume]].
-
diff --git a/inc/lang/de-informal/install.html b/inc/lang/de-informal/install.html
index 19fae8065..0b65fc724 100644
--- a/inc/lang/de-informal/install.html
+++ b/inc/lang/de-informal/install.html
@@ -1,27 +1,7 @@
-<p>Diese Seite hilft dir bei der Erstinstallation und Konfiguration von
-<a href="http://dokuwiki.org">DokuWiki</a>. Zusätzliche Informationen zu
-diesem Installationsskript findest du auf der entsprechenden
-<a href="http://dokuwiki.org/installer">Hilfe-Seite</a> (en).</p>
+<p>Diese Seite hilft dir bei der Erstinstallation und Konfiguration von <a href="http://dokuwiki.org">DokuWiki</a>. Zusätzliche Informationen zu diesem Installationsskript findest du auf der entsprechenden <a href="http://dokuwiki.org/installer">Hilfe-Seite</a> (en).</p>
-<p>DokuWiki verwendet normale Dateien für das Speichern von Wikiseiten und
-anderen Informationen (Bilder, Suchindizes, alte Versionen usw.).
-Um DokuWiki betreiben zu können, <strong>muss</strong> Schreibzugriff auf die
-Verzeichnisse bestehen, in denen DokuWiki diese Dateien ablegt. Dieses
-Installationsprogramm kann diese Rechte nicht für dich setzen. Du musst dies
-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>DokuWiki verwendet normale Dateien für das Speichern von Wikiseiten und anderen Informationen (Bilder, Suchindizes, alte Versionen usw.). Um DokuWiki betreiben zu können, <strong>muss</strong> Schreibzugriff auf die Verzeichnisse bestehen, in denen DokuWiki diese Dateien ablegt. Dieses Installationsprogramm kann diese Rechte nicht für dich setzen. Du musst dies 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
-(<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, dass
-Verwalten von Benutzern und das Ändern von Konfigurationseinstellungen durchführen.
-Das Benutzen der Zugangskontrolle ist nicht zwingend erforderlich, es erleichtert aber
-die Administration von DokuWiki.</p>
-
-<p>Erfahrene Anwender oder Benutzer mit speziellen Konfigurationsbedürfnissen sollten
-die folgenden Links nutzen, um sich über
-<a href="http://dokuwiki.org/install">Installation</a>
-und <a href="http://dokuwiki.org/config">Konfiguration</a> zu
-informieren.</p>
+<p>Dieses Skript hilft dir beim ersten Einrichten des Zugangsschutzes (<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, dass Verwalten von Benutzern und das Ändern von Konfigurationseinstellungen durchführen. Das Benutzen der Zugangskontrolle ist nicht zwingend erforderlich, es erleichtert aber die Administration von DokuWiki.</p>
+<p>Erfahrene Anwender oder Benutzer mit speziellen Konfigurationsbedürfnissen sollten die folgenden Links nutzen, um sich über <a href="http://dokuwiki.org/install">Installation</a> und <a href="http://dokuwiki.org/config">Konfiguration</a> zu informieren.</p>
diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php
index e4e5b4fa7..0bb4ddea5 100644
--- a/inc/lang/de-informal/lang.php
+++ b/inc/lang/de-informal/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Martin <martin@andev.de>
* @author F. Mueller-Donath <j.felix@mueller-donath.de>
* @author Andreas Gohr <andi@splitbrain.org>
* @author Christof <gagi@fin.de>
@@ -84,44 +85,8 @@ $lang['badpassconfirm'] = 'Das Passwort war falsch.';
$lang['minoredit'] = 'Kleine Änderung';
$lang['draftdate'] = 'Entwurf gespeichert am';
$lang['nosecedit'] = 'Diese Seite wurde in der Zwischenzeit geändert, da das Sektionsinfo veraltet ist. Die ganze Seite wird stattdessen geladen.';
-$lang['regmissing'] = 'Alle Felder müssen ausgefüllt werden';
-$lang['reguexists'] = 'Der Benutzername existiert leider schon.';
-$lang['regsuccess'] = 'Der neue Benutzer wurde angelegt und das Passwort per E-Mail versandt.';
-$lang['regsuccess2'] = 'Der neue Benutzer wurde angelegt.';
-$lang['regfail'] = 'Der Benutzer konnte nicht erstellt werden.';
-$lang['regmailfail'] = 'Offenbar ist ein Fehler beim Versenden der Passwortmail aufgetreten. Bitte wende dich an den Wiki-Admin.';
-$lang['regbadmail'] = 'Die angegebene Mail-Adresse scheint ungültig zu sein. Falls dies ein Fehler ist, wende dich bitte an den Wiki-Admin.';
-$lang['regbadpass'] = 'Die beiden eingegeben Passwörter stimmen nicht überein. Bitte versuche es noch einmal.';
-$lang['regpwmail'] = 'Ihr DokuWiki-Passwort';
-$lang['reghere'] = 'Du hast noch keinen Zugang? Hier registrieren';
-$lang['profna'] = 'Änderung des Benutzerprofils in diesem Wiki nicht möglich.';
-$lang['profnochange'] = 'Keine Änderungen, nichts zu tun.';
-$lang['profnoempty'] = 'Es muss ein Name oder eine E-Mail Adresse angegeben werden.';
-$lang['profchanged'] = 'Benutzerprofil erfolgreich geändert.';
-$lang['profnodelete'] = 'Dieses Wiki unterstützt nicht das Löschen von Benutzern.';
-$lang['profdeleteuser'] = 'Benutzerprofil löschen';
-$lang['profdeleted'] = 'Dein Benutzerprofil wurde im Wiki gelöscht.';
-$lang['profconfdelete'] = 'Ich möchte mein Benutzerprofil löschen.<br/> Diese Aktion ist nicht umkehrbar.';
-$lang['profconfdeletemissing'] = 'Bestätigungs-Checkbox wurde nicht angehakt.';
-$lang['proffail'] = 'Das Benutzerprofil wurde nicht aktualisiert.';
-$lang['pwdforget'] = 'Passwort vergessen? Fordere ein neues an';
-$lang['resendna'] = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
-$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.';
-$lang['resendpwdconfirm'] = 'Ein Bestätigungslink wurde per E-Mail versandt.';
-$lang['resendpwdsuccess'] = 'Dein neues Passwort wurde per E-Mail versandt.';
-$lang['license'] = 'Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:';
-$lang['licenseok'] = 'Hinweis: Durch das Bearbeiten dieser Seite gibst du dein Einverständnis, dass dein Inhalt unter der folgenden Lizenz veröffentlicht wird:';
-$lang['searchmedia'] = 'Suche nach Datei:';
-$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['search_fullresults'] = 'Volltextergebnisse';
+$lang['js']['search_toggle_tools'] = 'Suchwerkzeuge umschalten';
$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.';
$lang['js']['notsavedyet'] = 'Nicht gespeicherte Änderungen gehen verloren!';
$lang['js']['searchmedia'] = 'Suche nach Dateien';
@@ -163,6 +128,56 @@ $lang['js']['media_done_btn'] = 'Fertig';
$lang['js']['media_drop'] = 'Dateien hier hinziehen um sie hochzuladen';
$lang['js']['media_cancel'] = 'Entfernen';
$lang['js']['media_overwrt'] = 'Existierende Dateien überschreiben';
+$lang['search_exact_match'] = 'Genaue Treffer';
+$lang['search_starts_with'] = 'Beginnt mit';
+$lang['search_ends_with'] = 'Endet mit';
+$lang['search_contains'] = 'Enthält';
+$lang['search_custom_match'] = 'Angepasst ';
+$lang['search_any_ns'] = 'Alle Namensräume';
+$lang['search_any_time'] = 'Jederzeit';
+$lang['search_past_7_days'] = 'Letzte Woche';
+$lang['search_past_month'] = 'Letzter Monat';
+$lang['search_past_year'] = 'Letztes Jahr';
+$lang['search_sort_by_hits'] = 'Sortiere nach Treffer';
+$lang['search_sort_by_mtime'] = 'Sortiere nach letzter Änderung';
+$lang['regmissing'] = 'Alle Felder müssen ausgefüllt werden';
+$lang['reguexists'] = 'Der Benutzername existiert leider schon.';
+$lang['regsuccess'] = 'Der neue Benutzer wurde angelegt und das Passwort per E-Mail versandt.';
+$lang['regsuccess2'] = 'Der neue Benutzer wurde angelegt.';
+$lang['regfail'] = 'Der Benutzer konnte nicht erstellt werden.';
+$lang['regmailfail'] = 'Offenbar ist ein Fehler beim Versenden der Passwortmail aufgetreten. Bitte wende dich an den Wiki-Admin.';
+$lang['regbadmail'] = 'Die angegebene Mail-Adresse scheint ungültig zu sein. Falls dies ein Fehler ist, wende dich bitte an den Wiki-Admin.';
+$lang['regbadpass'] = 'Die beiden eingegeben Passwörter stimmen nicht überein. Bitte versuche es noch einmal.';
+$lang['regpwmail'] = 'Ihr DokuWiki-Passwort';
+$lang['reghere'] = 'Du hast noch keinen Zugang? Hier registrieren';
+$lang['profna'] = 'Änderung des Benutzerprofils in diesem Wiki nicht möglich.';
+$lang['profnochange'] = 'Keine Änderungen, nichts zu tun.';
+$lang['profnoempty'] = 'Es muss ein Name oder eine E-Mail Adresse angegeben werden.';
+$lang['profchanged'] = 'Benutzerprofil erfolgreich geändert.';
+$lang['profnodelete'] = 'Dieses Wiki unterstützt nicht das Löschen von Benutzern.';
+$lang['profdeleteuser'] = 'Benutzerprofil löschen';
+$lang['profdeleted'] = 'Dein Benutzerprofil wurde im Wiki gelöscht.';
+$lang['profconfdelete'] = 'Ich möchte mein Benutzerprofil löschen.<br/> Diese Aktion ist nicht umkehrbar.';
+$lang['profconfdeletemissing'] = 'Bestätigungs-Checkbox wurde nicht angehakt.';
+$lang['proffail'] = 'Das Benutzerprofil wurde nicht aktualisiert.';
+$lang['pwdforget'] = 'Passwort vergessen? Fordere ein neues an';
+$lang['resendna'] = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
+$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.';
+$lang['resendpwdconfirm'] = 'Ein Bestätigungslink wurde per E-Mail versandt.';
+$lang['resendpwdsuccess'] = 'Dein neues Passwort wurde per E-Mail versandt.';
+$lang['license'] = 'Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:';
+$lang['licenseok'] = 'Hinweis: Durch das Bearbeiten dieser Seite gibst du dein Einverständnis, dass dein Inhalt unter der folgenden Lizenz veröffentlicht wird:';
+$lang['searchmedia'] = 'Suche nach Datei:';
+$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['rssfailed'] = 'Es ist ein Fehler beim Laden des Feeds aufgetreten: ';
$lang['nothingfound'] = 'Nichts gefunden.';
$lang['mediaselect'] = 'Dateiauswahl';
diff --git a/inc/lang/de-informal/locked.txt b/inc/lang/de-informal/locked.txt
index 1cfa089c0..2c757bd2f 100644
--- a/inc/lang/de-informal/locked.txt
+++ b/inc/lang/de-informal/locked.txt
@@ -1,4 +1,3 @@
====== Seite gesperrt ======
Diese Seite ist momentan von einem anderen Benutzer gesperrt. Warte, bis dieser mit dem Bearbeiten fertig ist oder die Sperre abläuft.
-
diff --git a/inc/lang/de-informal/login.txt b/inc/lang/de-informal/login.txt
index 5c99c48f1..480eded03 100644
--- a/inc/lang/de-informal/login.txt
+++ b/inc/lang/de-informal/login.txt
@@ -1,4 +1,3 @@
====== Anmelden ======
Gib deinen Benutzernamen und dein Passwort in das Formular unten ein, um dich anzumelden. Bitte beachte, dass dafür "Cookies" in den Sicherheitseinstellungen deines Browsers erlaubt sein müssen.
-
diff --git a/inc/lang/de-informal/newpage.txt b/inc/lang/de-informal/newpage.txt
index 5e261cc89..f10e434d2 100644
--- a/inc/lang/de-informal/newpage.txt
+++ b/inc/lang/de-informal/newpage.txt
@@ -1,5 +1,3 @@
====== Dieses Thema existiert noch nicht ======
-Du bist einem Link zu einer Seite gefolgt, die noch nicht existiert. Du kannst die Seite mit dem Knopf **''[Seite anlegen]''** selbst anlegen und mit Inhalt füllen.
-
-
+Du bist einem Link zu einer Seite gefolgt, die noch nicht existiert. Du kannst die Seite mit dem Knopf **Seite anlegen** selbst anlegen und mit Inhalt füllen.
diff --git a/inc/lang/de-informal/norev.txt b/inc/lang/de-informal/norev.txt
index c6243313d..20e8d829e 100644
--- a/inc/lang/de-informal/norev.txt
+++ b/inc/lang/de-informal/norev.txt
@@ -1,4 +1,3 @@
====== Version existiert nicht ======
Die angegebene Version des Dokuments wurde nicht gefunden. Benutze den **''[Ältere Versionen]''** Knopf, um eine Liste aller verfügbaren Versionen dieses Dokuments zu erhalten.
-
diff --git a/inc/lang/de-informal/preview.txt b/inc/lang/de-informal/preview.txt
index d3a578f69..28bbd1ea5 100644
--- a/inc/lang/de-informal/preview.txt
+++ b/inc/lang/de-informal/preview.txt
@@ -1,5 +1,3 @@
====== Vorschau ======
-So wird dein Text später aussehen. Achtung: Der Text wurde noch **nicht gespeichert**!
-
-
+So wird dein Text später aussehen. **Achtung: Der Text wurde noch nicht gespeichert**!
diff --git a/inc/lang/de-informal/pwconfirm.txt b/inc/lang/de-informal/pwconfirm.txt
index a3b95d82a..e48ad83eb 100644
--- a/inc/lang/de-informal/pwconfirm.txt
+++ b/inc/lang/de-informal/pwconfirm.txt
@@ -1,12 +1,9 @@
Hallo @FULLNAME@!
-Jemand hat ein neues Passwort für deinen @TITLE@
-Login auf @DOKUWIKIURL@ angefordert.
+Jemand hat ein neues Passwort für deinen @TITLE@ Login auf @DOKUWIKIURL@ angefordert.
-Wenn du diese Änderung nicht angefordert hast, ignoriere diese
-E-Mail einfach.
+Wenn du diese Änderung nicht angefordert hast, ignoriere diese E-Mail einfach.
-Um die Anforderung zu bestätigen, folge bitte dem unten angegebenen
-Bestätigungslink.
+Um die Anforderung zu bestätigen, folge bitte dem unten angegebenen Bestätigungslink.
@CONFIRM@
diff --git a/inc/lang/de-informal/read.txt b/inc/lang/de-informal/read.txt
index 1c5422a29..5ef26e59d 100644
--- a/inc/lang/de-informal/read.txt
+++ b/inc/lang/de-informal/read.txt
@@ -1,2 +1 @@
Diese Seite ist nicht editierbar. Du kannst den Quelltext sehen, jedoch nicht verändern. Kontaktiere den Administrator, wenn du glaubst, dass hier ein Fehler vorliegt.
-
diff --git a/inc/lang/de-informal/recent.txt b/inc/lang/de-informal/recent.txt
index c05bbae12..0022b21c1 100644
--- a/inc/lang/de-informal/recent.txt
+++ b/inc/lang/de-informal/recent.txt
@@ -1,5 +1,3 @@
====== Letzte Änderungen ======
-Die folgenden Seiten wurden zuletzt geändert.
-
-
+Die folgenden Seiten wurden zuletzt geändert:
diff --git a/inc/lang/de-informal/register.txt b/inc/lang/de-informal/register.txt
index f6bf6ed85..a10d3dac1 100644
--- a/inc/lang/de-informal/register.txt
+++ b/inc/lang/de-informal/register.txt
@@ -1,4 +1,3 @@
====== Als neuer Benutzer registrieren ======
Bitte fülle alle Felder aus, um einen neuen Benutzer-Account in diesem Wiki anzulegen. Stelle sicher, dass eine **gültige E-Mail-Adresse** angegeben wird - das Passwort wird an diese Adresse gesendet. Der Benutzername sollte aus einem Wort ohne Umlaute, Leer- oder Sonderzeichen bestehen.
-
diff --git a/inc/lang/de-informal/resetpwd.txt b/inc/lang/de-informal/resetpwd.txt
index 8423bd801..62186fcc8 100644
--- a/inc/lang/de-informal/resetpwd.txt
+++ b/inc/lang/de-informal/resetpwd.txt
@@ -1,4 +1,3 @@
====== Neues Passwort setzen ======
Bitte gib ein neues Passwort für deinen Wiki-Zugang ein.
-
diff --git a/inc/lang/de-informal/revisions.txt b/inc/lang/de-informal/revisions.txt
index b69169a4e..5a6af9f42 100644
--- a/inc/lang/de-informal/revisions.txt
+++ b/inc/lang/de-informal/revisions.txt
@@ -1,4 +1,3 @@
====== Ältere Versionen ======
Dies sind ältere Versionen der gewählten Seite. Um zu einer älteren Version zurückzukehren, wähle die entsprechende Version aus, klicke auf **''[Diese Seite bearbeiten]''** und speichere sie erneut ab.
-
diff --git a/inc/lang/de-informal/searchpage.txt b/inc/lang/de-informal/searchpage.txt
index 5de550a7f..8e1e7a9b7 100644
--- a/inc/lang/de-informal/searchpage.txt
+++ b/inc/lang/de-informal/searchpage.txt
@@ -1,4 +1,3 @@
====== Suche ======
Unten sind die Ergebnisse deiner Suche gelistet. @CREATEPAGEINFO@
-
diff --git a/inc/lang/de-informal/stopwords.txt b/inc/lang/de-informal/stopwords.txt
index 443b17723..609591da5 100644
--- a/inc/lang/de-informal/stopwords.txt
+++ b/inc/lang/de-informal/stopwords.txt
@@ -120,6 +120,7 @@ wird
wirst
woher
wohin
+www
zum
zur
über
diff --git a/inc/lang/de-informal/updateprofile.txt b/inc/lang/de-informal/updateprofile.txt
index 66c2e8293..e9a58a02d 100644
--- a/inc/lang/de-informal/updateprofile.txt
+++ b/inc/lang/de-informal/updateprofile.txt
@@ -1,5 +1,3 @@
====== Benutzerprofil ändern ======
Nur die Felder, die du änderst, werden aktualisiert. Alle anderen bleiben, wie sie sind. Deinen Benutzernamen kannst du jedoch nicht ändern.
-
-
diff --git a/inc/lang/de/admin.txt b/inc/lang/de/admin.txt
index f079f7e91..8fd7e3309 100644
--- a/inc/lang/de/admin.txt
+++ b/inc/lang/de/admin.txt
@@ -1,4 +1,3 @@
====== Administration ======
Folgende administrative Aufgaben stehen in DokuWiki zur Verfügung:
-
diff --git a/inc/lang/de/backlinks.txt b/inc/lang/de/backlinks.txt
index b9caf945f..b510b8aeb 100644
--- a/inc/lang/de/backlinks.txt
+++ b/inc/lang/de/backlinks.txt
@@ -1,5 +1,3 @@
-====== Links hierher (Backlinks) ======
+====== Links hierher ======
Dies ist eine Liste der Seiten, welche zurück zur momentanen Seite führen.
-
-
diff --git a/inc/lang/de/conflict.txt b/inc/lang/de/conflict.txt
index 0d0283bf3..0d7cefd4f 100644
--- a/inc/lang/de/conflict.txt
+++ b/inc/lang/de/conflict.txt
@@ -1,6 +1,5 @@
====== Es gibt eine neuere Version ======
-Es existiert eine neuere Version des aktuell in Bearbeitung befindlichen Dokumentes. Das heißt, jemand hat parallel an der selben Seite gearbeitet und zuerst gespeichert.
+Es existiert eine neuere Version des aktuell in Bearbeitung befindlichen Dokumentes. Das heißt, jemand hat parallel an derselben Seite gearbeitet und zuerst gespeichert.
Die unten aufgeführten Unterschiede können bei der Entscheidung helfen, welchem Dokument Vorrang gewährt wird. Wählen Sie **''[Speichern]''** zum Sichern Ihrer Version oder **''[Abbrechen]''**, um Ihre Version zu verwerfen und die zuerst gespeicherte Seite zu behalten.
-
diff --git a/inc/lang/de/denied.txt b/inc/lang/de/denied.txt
index db3343876..1965ed98e 100644
--- a/inc/lang/de/denied.txt
+++ b/inc/lang/de/denied.txt
@@ -1,4 +1,3 @@
====== Zugang verweigert ======
Sie haben nicht die erforderliche Berechtigung, um diese Aktion durchzuführen.
-
diff --git a/inc/lang/de/diff.txt b/inc/lang/de/diff.txt
index 3747da85e..58890ace1 100644
--- a/inc/lang/de/diff.txt
+++ b/inc/lang/de/diff.txt
@@ -1,5 +1,3 @@
====== Unterschiede ======
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
-
-
diff --git a/inc/lang/de/draft.txt b/inc/lang/de/draft.txt
index 17d5d318e..8cf9eb6e8 100644
--- a/inc/lang/de/draft.txt
+++ b/inc/lang/de/draft.txt
@@ -3,4 +3,3 @@
Ihre letzte Bearbeitungssitzung wurde nicht ordnungsgemäß abgeschlossen. DokuWiki hat während Ihrer Arbeit automatisch einen Zwischenentwurf gespeichert, den Sie jetzt nutzen können, um Ihre Arbeit fortzusetzen. Unten sehen Sie die Daten, die bei Ihrer letzten Sitzung gespeichert wurden.
Bitte entscheiden Sie, ob Sie den Entwurf //wiederherstellen// oder //löschen// wollen, oder ob Sie die Bearbeitung abbrechen möchten.
-
diff --git a/inc/lang/de/edit.txt b/inc/lang/de/edit.txt
index 6e56d25cb..df01486da 100644
--- a/inc/lang/de/edit.txt
+++ b/inc/lang/de/edit.txt
@@ -1,4 +1 @@
-Seite Bearbeiten und **''[Speichern]''** drücken. Siehe [[wiki:syntax]] zur Wiki-Syntax.
-Bitte nur editieren, falls das Dokument tatsächlich **verbessert** werden kann.
-Zum Testen bitte erst im [[playground:playground|Spielplatz]] üben.
-
+Seite bearbeiten und **''[Speichern]''** drücken. Siehe [[wiki:syntax]] zur Wiki-Syntax. Bitte nur editieren, falls das Dokument tatsächlich **verbessert** werden kann. Zum Testen bitte erst im [[playground:playground|Spielplatz]] üben.
diff --git a/inc/lang/de/editrev.txt b/inc/lang/de/editrev.txt
index 6c1f642cc..40a8b72d2 100644
--- a/inc/lang/de/editrev.txt
+++ b/inc/lang/de/editrev.txt
@@ -1,2 +1,2 @@
**Eine ältere Version des Dokuments wurde geladen!** Beim Speichern wird eine neue Version des Dokuments mit diesem Inhalt erstellt.
----- \ No newline at end of file
+----
diff --git a/inc/lang/de/index.txt b/inc/lang/de/index.txt
index fa8dc4663..28718f2a1 100644
--- a/inc/lang/de/index.txt
+++ b/inc/lang/de/index.txt
@@ -1,4 +1,3 @@
====== Übersicht ======
-Dies ist eine Übersicht über alle vorhandenen Seiten und [[doku>namespaces|Namensräume]].
-
+Dies ist eine Übersicht über alle vorhandenen Seiten und [[doku>de:namespaces|Namensräume]].
diff --git a/inc/lang/de/install.html b/inc/lang/de/install.html
index 47dcdf61d..6ad10c3f1 100644
--- a/inc/lang/de/install.html
+++ b/inc/lang/de/install.html
@@ -1,27 +1,7 @@
-<p>Diese Seite hilft Ihnen bei der Erstinstallation und Konfiguration von
-<a href="http://dokuwiki.org">DokuWiki</a>. Zusätzliche Informationen zu
-diesem Installationsskript finden Sie auf der entsprechenden
-<a href="http://dokuwiki.org/installer">Hilfe Seite</a> (en).</p>
+<p>Diese Seite hilft Ihnen bei der Erstinstallation und Konfiguration von <a href="http://dokuwiki.org">DokuWiki</a>. Zusätzliche Informationen zu diesem Installationsskript finden Sie auf der entsprechenden <a href="http://dokuwiki.org/de:installer">Hilfe Seite</a>.</p>
-<p>DokuWiki verwendet normale Dateien für das Speichern von Wikiseiten und
-anderen Informationen (Bilder, Suchindizes, alte Versionen usw.).
-Um DokuWiki betreiben zu können, <strong>muss</strong> Schreibzugriff auf die
-Verzeichnisse bestehen, in denen DokuWiki diese Dateien ablegt. Dieses
-Installationsprogramm kann diese Rechte nicht für Sie setzen. Sie müssen dies
-manuell auf einer Kommando-Shell oder, falls Sie DokuWiki bei einem Fremdanbieter
-hosten, über FTP oder ein entsprechendes Werkzeug (z.B. cPanel) durchführen.</p>
+<p>DokuWiki verwendet normale Dateien für das Speichern von Wikiseiten und anderen Informationen (Bilder, Suchindizes, alte Versionen usw.). Um DokuWiki betreiben zu können, <strong>muss</strong> Schreibzugriff auf die Verzeichnisse bestehen, in denen DokuWiki diese Dateien ablegt. Dieses Installationsprogramm kann diese Rechte nicht für Sie setzen. Sie müssen dies manuell auf einer Kommando-Shell oder, falls Sie DokuWiki bei einem Fremdanbieter hosten, über FTP oder ein entsprechendes Werkzeug (z.B. cPanel) durchführen.</p>
-<p>Dieses Skript hilft Ihnen beim ersten Einrichten des Zugangsschutzes
-(<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, dass
-Verwalten von Benutzern und das Ändern von Konfigurationseinstellungen durchführen.
-Das Nutzen der Zugangskontrolle ist nicht zwingend erforderlich, es erleichtert aber
-die Administration von DokuWiki.</p>
-
-<p>Erfahrene Anwender oder Benutzer mit speziellen Konfigurationsbedürfnissen sollten
-die folgenden Links nutzen, um sich über
-<a href="http://dokuwiki.org/install">Installation</a>
-und <a href="http://dokuwiki.org/config">Konfiguration</a> zu
-informieren.</p>
+<p>Dieses Skript hilft Ihnen beim ersten Einrichten des Zugangsschutzes (<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, dass Verwalten von Benutzern und das Ändern von Konfigurationseinstellungen durchführen. Das Nutzen der Zugangskontrolle ist nicht zwingend erforderlich, es erleichtert aber die Administration von DokuWiki.</p>
+<p>Erfahrene Anwender oder Benutzer mit speziellen Konfigurationsbedürfnissen sollten die folgenden Links nutzen, um sich über <a href="http://dokuwiki.org/de:install">Installation</a> und <a href="http://dokuwiki.org/de:config">Konfiguration</a> zu informieren.</p>
diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php
index 2fd78f5ff..aa7e93b3b 100644
--- a/inc/lang/de/lang.php
+++ b/inc/lang/de/lang.php
@@ -3,12 +3,20 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Eric Haberstroh <ehaberstroh@gmail.com>
+ * @author C!own77 <clown77@posteo.de>
+ * @author Anonymous <anonymous@example.org>
+ * @author Michaelsy <github@informantum.de>
+ * @author Benjamin Molitor <bmolitor@uos.de>
+ * @author Alex Beck <alex@4becks.com>
+ * @author Jürgen Fredriksson <jfriedrich@gmx.at>
+ * @author Sebastian Engel <mail@engel-s.de>
* @author Karl_de_Hall <Karl.Grohmueller@sonnenhof-sha.de>
* @author Michael Bohn <mjbohn@gmail.com>
* @author Joel Strasser <strasser999@gmail.com>
* @author Robert Riebisch <robert.riebisch@googlemail.com>
* @author Joerg <scooter22@gmx.de>
- * @author Andreas Gohr <andi@splitbrain.org>
* @author Christof <gagi@fin.de>
* @author Anika Henke <anika@selfthinker.org>
* @author Esther Brunner <esther@kaffeehaus.ch>
@@ -136,18 +144,18 @@ $lang['js']['media_diff_portions'] = 'Übergang';
$lang['js']['media_select'] = 'Dateien auswählen…';
$lang['js']['media_upload_btn'] = 'Hochladen';
$lang['js']['media_done_btn'] = 'Fertig';
-$lang['js']['media_drop'] = 'Dateien hier hinziehen um sie hochzuladen';
+$lang['js']['media_drop'] = 'Dateien hier hinziehen, um sie hochzuladen';
$lang['js']['media_cancel'] = 'Entfernen';
$lang['js']['media_overwrt'] = 'Existierende Dateien überschreiben';
-$lang['search_exact_match'] = 'genaue Treffer';
-$lang['search_starts_with'] = 'beginnt mit';
-$lang['search_ends_with'] = 'endet mit';
-$lang['search_contains'] = 'enthält';
-$lang['search_custom_match'] = 'angepasst ';
-$lang['search_any_ns'] = 'alle Kategorien';
-$lang['search_any_time'] = 'jederzeit';
-$lang['search_past_7_days'] = 'letzte Woche';
-$lang['search_past_month'] = 'letzter Monat';
+$lang['search_exact_match'] = 'Genaue Treffer';
+$lang['search_starts_with'] = 'Beginnt mit';
+$lang['search_ends_with'] = 'Endet mit';
+$lang['search_contains'] = 'Enthält';
+$lang['search_custom_match'] = 'Angepasst ';
+$lang['search_any_ns'] = 'Alle Namensräume';
+$lang['search_any_time'] = 'Jederzeit';
+$lang['search_past_7_days'] = 'Letzte Woche';
+$lang['search_past_month'] = 'Letzter Monat';
$lang['search_past_year'] = 'letztes Jahr';
$lang['search_sort_by_hits'] = 'Sortiere nach Treffer';
$lang['search_sort_by_mtime'] = 'Sortiere nach letzter Änderung';
@@ -370,7 +378,7 @@ $lang['media_edit'] = '%s bearbeiten';
$lang['media_history'] = 'Versionsverlauf von %s.';
$lang['media_meta_edited'] = 'Meta-Informationen bearbeitet';
$lang['media_perm_read'] = 'Sie besitzen nicht die notwendigen Berechtigungen um die Datei anzuzeigen.';
-$lang['media_perm_upload'] = 'Sie besitzen nicht die notwendigen Berechtigungen um Dateien hochzuladen.';
+$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['media_acl_warning'] = 'Diese Liste ist möglicherweise nicht vollständig. Versteckte und durch ACL gesperrte Seiten werden nicht angezeigt.';
diff --git a/inc/lang/de/locked.txt b/inc/lang/de/locked.txt
index 97323ca61..58b899705 100644
--- a/inc/lang/de/locked.txt
+++ b/inc/lang/de/locked.txt
@@ -1,4 +1,3 @@
====== Seite gesperrt ======
Diese Seite ist momentan von einem anderen Benutzer gesperrt. Warten Sie, bis dieser mit dem Bearbeiten fertig ist oder die Sperre abläuft.
-
diff --git a/inc/lang/de/login.txt b/inc/lang/de/login.txt
index 6698da614..349dcd82d 100644
--- a/inc/lang/de/login.txt
+++ b/inc/lang/de/login.txt
@@ -1,4 +1,3 @@
====== Anmelden ======
Geben Sie Ihren Benutzernamen und Ihr Passwort in das Formular unten ein, um sich anzumelden. Bitte beachten Sie, dass dafür "Cookies" in den Sicherheitseinstellungen Ihres Browsers erlaubt sein müssen.
-
diff --git a/inc/lang/de/newpage.txt b/inc/lang/de/newpage.txt
index 7871c67de..020f704f4 100644
--- a/inc/lang/de/newpage.txt
+++ b/inc/lang/de/newpage.txt
@@ -1,5 +1,3 @@
====== Dieses Thema existiert noch nicht ======
-Sie sind einem Link zu einer Seite gefolgt, die noch nicht existiert. Sie können die Seite mit dem Knopf **"[Seite anlegen]"** selbst anlegen und mit Inhalt füllen.
-
-
+Sie sind einem Link zu einer Seite gefolgt, die noch nicht existiert. Sie können die Seite mit dem Knopf **Seite anlegen** selbst anlegen und mit Inhalt füllen.
diff --git a/inc/lang/de/norev.txt b/inc/lang/de/norev.txt
index 8a9c6927b..75eb5e310 100644
--- a/inc/lang/de/norev.txt
+++ b/inc/lang/de/norev.txt
@@ -1,4 +1,3 @@
====== Version existiert nicht ======
Die angegebene Version des Dokuments wurde nicht gefunden. Benutzen Sie den **''[Ältere Versionen]''** Knopf, um eine Liste aller verfügbaren Versionen dieses Dokuments zu erhalten.
-
diff --git a/inc/lang/de/onceexisted.txt b/inc/lang/de/onceexisted.txt
new file mode 100644
index 000000000..c5408f479
--- /dev/null
+++ b/inc/lang/de/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Diese Seite existiert nicht mehr ======
+
+Du bist einem Link zu einer Seite gefolgt, den es nicht mehr gibt. Um zu sehen, wann und warum diese Seite gelöscht bzw. um ältere Versionen zu besichtigen oder zu laden, besuche [[?do=revisions|old revisions]]. \ No newline at end of file
diff --git a/inc/lang/de/preview.txt b/inc/lang/de/preview.txt
index b07ae5091..c8789d116 100644
--- a/inc/lang/de/preview.txt
+++ b/inc/lang/de/preview.txt
@@ -1,5 +1,3 @@
====== Vorschau ======
So wird Ihr Text später aussehen. Achtung: Der Text wurde noch **nicht gespeichert**!
-
-
diff --git a/inc/lang/de/pwconfirm.txt b/inc/lang/de/pwconfirm.txt
index b571163ed..59954cab6 100644
--- a/inc/lang/de/pwconfirm.txt
+++ b/inc/lang/de/pwconfirm.txt
@@ -1,12 +1,9 @@
Hallo @FULLNAME@!
-Jemand hat ein neues Passwort für Ihren @TITLE@
-login auf @DOKUWIKIURL@ angefordert.
+Jemand hat ein neues Passwort für Ihren @TITLE@ login auf @DOKUWIKIURL@ angefordert.
-Wenn Sie diese Änderung nicht angefordert haben, ignorieren Sie diese
-E-Mail einfach.
+Wenn Sie diese Änderung nicht angefordert haben, ignorieren Sie diese E-Mail einfach.
-Um die Anforderung zu bestätigen, folgen Sie bitte dem unten angegebenen
-Bestätigungslink.
+Um die Anforderung zu bestätigen, folgen Sie bitte dem unten angegebenen Bestätigungslink.
@CONFIRM@
diff --git a/inc/lang/de/read.txt b/inc/lang/de/read.txt
index bc011d0ee..b531025af 100644
--- a/inc/lang/de/read.txt
+++ b/inc/lang/de/read.txt
@@ -1,2 +1 @@
Diese Seite ist nicht editierbar. Sie können den Quelltext sehen, jedoch nicht verändern. Kontaktieren Sie den Administrator, wenn Sie glauben, dass hier ein Fehler vorliegt.
-
diff --git a/inc/lang/de/recent.txt b/inc/lang/de/recent.txt
index c05bbae12..0022b21c1 100644
--- a/inc/lang/de/recent.txt
+++ b/inc/lang/de/recent.txt
@@ -1,5 +1,3 @@
====== Letzte Änderungen ======
-Die folgenden Seiten wurden zuletzt geändert.
-
-
+Die folgenden Seiten wurden zuletzt geändert:
diff --git a/inc/lang/de/register.txt b/inc/lang/de/register.txt
index f1ea30a47..b14a07026 100644
--- a/inc/lang/de/register.txt
+++ b/inc/lang/de/register.txt
@@ -1,4 +1,3 @@
====== Als neuer Benutzer registrieren ======
-Bitte füllen Sie alle Felder aus, um einen neuen Benutzer-Account in diesem Wiki anzulegen. Stellen Sie sicher, dass eine **gültige E-Mail-Adresse** angegeben wird - das Passwort wird an diese Adresse gesendet. Der Benutzername sollte aus einem Wort ohne Umlaute, Leer- oder Sonderzeichen bestehen.
-
+Bitte füllen Sie alle Felder aus, um einen neuen Benutzer-Account in diesem Wiki anzulegen. Stellen Sie sicher, dass eine **gültige E-Mail-Adresse** angegeben wird - das Passwort wird an diese Adresse gesendet. Der Benutzername sollte aus einem Wort ohne Umlaute, Leer- oder Sonderzeichen bestehen. [[doku>de:pagename]]
diff --git a/inc/lang/de/resetpwd.txt b/inc/lang/de/resetpwd.txt
index a0a55c67a..1d228c73d 100644
--- a/inc/lang/de/resetpwd.txt
+++ b/inc/lang/de/resetpwd.txt
@@ -1,4 +1,3 @@
====== Neues Passwort setzen ======
Bitte geben Sie ein neues Passwort für Ihren Wiki-Zugang ein.
-
diff --git a/inc/lang/de/revisions.txt b/inc/lang/de/revisions.txt
index 843c3f9f4..cfbfcd360 100644
--- a/inc/lang/de/revisions.txt
+++ b/inc/lang/de/revisions.txt
@@ -1,4 +1,3 @@
====== Ältere Versionen ======
Dies sind ältere Versionen der gewählten Seite. Um zu einer älteren Version zurückzukehren, wählen Sie die entsprechende Version aus, klicken auf **''[Diese Seite bearbeiten]''** und speichern Sie diese erneut ab.
-
diff --git a/inc/lang/de/stopwords.txt b/inc/lang/de/stopwords.txt
index 0487a940a..9b52e2aad 100644
--- a/inc/lang/de/stopwords.txt
+++ b/inc/lang/de/stopwords.txt
@@ -120,6 +120,7 @@ wird
wirst
woher
wohin
+www
zum
zur
über
diff --git a/inc/lang/de/updateprofile.txt b/inc/lang/de/updateprofile.txt
index f19dd13f6..b361ea2a4 100644
--- a/inc/lang/de/updateprofile.txt
+++ b/inc/lang/de/updateprofile.txt
@@ -1,5 +1,3 @@
====== Benutzerprofil ändern ======
Nur die Felder, die Sie ändern, werden aktualisiert. Alle anderen bleiben, wie sie sind. Ihren Benutzernamen können Sie jedoch nicht ändern.
-
-
diff --git a/inc/lang/el/backlinks.txt b/inc/lang/el/backlinks.txt
index 572f85791..95e5eb090 100644
--- a/inc/lang/el/backlinks.txt
+++ b/inc/lang/el/backlinks.txt
@@ -1,3 +1,3 @@
====== Σύνδεσμοι προς την τρέχουσα σελίδα ======
-Οι παρακάτω σελίδες περιέχουν συνδέσμους προς την τρέχουσα σελίδα. \ No newline at end of file
+Οι παρακάτω σελίδες περιέχουν συνδέσμους προς την τρέχουσα σελίδα.
diff --git a/inc/lang/el/conflict.txt b/inc/lang/el/conflict.txt
index a2065c0f3..402ed1dd9 100644
--- a/inc/lang/el/conflict.txt
+++ b/inc/lang/el/conflict.txt
@@ -1,8 +1,5 @@
====== Υπάρχει μία νεώτερη έκδοση αυτής της σελίδας ======
-Υπάρχει μία νεώτερη έκδοση της σελίδας που τρoποποιήσατε.
-Αυτό συμβαίνει εάν κάποιος άλλος χρήστης τροποποίησε την ίδια σελίδα ενώ την επεξεργαζόσασταν και εσείς.
+Υπάρχει μία νεώτερη έκδοση της σελίδας που τρoποποιήσατε. Αυτό συμβαίνει εάν κάποιος άλλος χρήστης τροποποίησε την ίδια σελίδα ενώ την επεξεργαζόσασταν και εσείς.
-Ελέγξτε προσεκτικά τις διαφορές που παρουσιάζονται παρακάτω και έπειτα αποφασίστε ποια έκδοση θα κρατήσετε.
-Εάν επιλέξετε ''Αποθήκευση'', η δική σας έκδοση θα αποθηκευτεί.
-Εάν επιλέξετε ''Ακύρωση'', η νεώτερη έκδοση θα διατηρηθεί ως τρέχουσα.
+Ελέγξτε προσεκτικά τις διαφορές που παρουσιάζονται παρακάτω και έπειτα αποφασίστε ποια έκδοση θα κρατήσετε. Εάν επιλέξετε ''Αποθήκευση'', η δική σας έκδοση θα αποθηκευτεί. Εάν επιλέξετε ''Ακύρωση'', η νεώτερη έκδοση θα διατηρηθεί ως τρέχουσα.
diff --git a/inc/lang/el/denied.txt b/inc/lang/el/denied.txt
index 25fcbe8ca..d45133d39 100644
--- a/inc/lang/el/denied.txt
+++ b/inc/lang/el/denied.txt
@@ -1,4 +1,3 @@
====== Μη επιτρεπτή ενέργεια ======
Συγγνώμη, αλλά δεν έχετε επαρκή δικαιώματα για την συγκεκριμένη ενέργεια.
-
diff --git a/inc/lang/el/draft.txt b/inc/lang/el/draft.txt
index 5ca7b8dfa..1deff22b4 100644
--- a/inc/lang/el/draft.txt
+++ b/inc/lang/el/draft.txt
@@ -1,9 +1,5 @@
====== Βρέθηκε μία αυτόματα αποθηκευμένη σελίδα ======
-Η τελευταία τροποποίηση αυτής της σελίδας δεν ολοκληρώθηκε επιτυχώς.
-Η εφαρμογή αποθήκευσε αυτόματα μία εκδοχή της σελίδας την ώρα που την επεξεργαζόσασταν και μπορείτε να την χρησιμοποιήσετε για να συνεχίσετε την εργασία σας.
-Παρακάτω φαίνεται αυτή η πιο πρόσφατη αυτόματα αποθηκευμένη σελίδα.
+Η τελευταία τροποποίηση αυτής της σελίδας δεν ολοκληρώθηκε επιτυχώς. Η εφαρμογή αποθήκευσε αυτόματα μία εκδοχή της σελίδας την ώρα που την επεξεργαζόσασταν και μπορείτε να την χρησιμοποιήσετε για να συνεχίσετε την εργασία σας. Παρακάτω φαίνεται αυτή η πιο πρόσφατη αυτόματα αποθηκευμένη σελίδα.
Μπορείτε να //επαναφέρετε// αυτή την αυτόματα αποθηκευμένη σελίδα ως τρέχουσα, να την //διαγράψετε// ή να //ακυρώσετε// τη διαδικασία τροποποίησης της τρέχουσας σελίδας.
-
-
diff --git a/inc/lang/el/edit.txt b/inc/lang/el/edit.txt
index 8d9559fcc..4d1b4dfdb 100644
--- a/inc/lang/el/edit.txt
+++ b/inc/lang/el/edit.txt
@@ -1,3 +1 @@
-Τροποποιήστε την σελίδα **μόνο** εάν μπορείτε να την **βελτιώσετε**.
-Για να κάνετε δοκιμές με ασφάλεια ή να εξοικειωθείτε με το περιβάλλον χρησιμοποιήστε το [[:playground:playground|playground]].
-Αφού τροποποιήστε την σελίδα επιλέξτε ''Αποθήκευση''. Δείτε τις [[:wiki:syntax|οδηγίες]] για την σωστή σύνταξη.
+Τροποποιήστε την σελίδα **μόνο** εάν μπορείτε να την **βελτιώσετε**. Για να κάνετε δοκιμές με ασφάλεια ή να εξοικειωθείτε με το περιβάλλον χρησιμοποιήστε το [[playground:playground|playground]]. Αφού τροποποιήστε την σελίδα επιλέξτε ''Αποθήκευση''. Δείτε τις [[wiki:syntax|οδηγίες]] για την σωστή σύνταξη.
diff --git a/inc/lang/el/editrev.txt b/inc/lang/el/editrev.txt
index ac6bc5a3d..11b688b13 100644
--- a/inc/lang/el/editrev.txt
+++ b/inc/lang/el/editrev.txt
@@ -1,2 +1,2 @@
**Φορτώσατε μια παλαιότερη έκδοση της σελίδας!** Εάν την αποθηκεύσετε, θα αντικαταστήσει την τρέχουσα έκδοση.
----- \ No newline at end of file
+----
diff --git a/inc/lang/el/index.txt b/inc/lang/el/index.txt
index e2da3a85e..ad8a9d252 100644
--- a/inc/lang/el/index.txt
+++ b/inc/lang/el/index.txt
@@ -1,3 +1,3 @@
====== Κατάλογος ======
-Εδώ βλέπετε τον κατάλογο όλων των διαθέσιμων σελίδων, ταξινομημένες κατά [[doku>namespaces|φακέλους]].
+Εδώ βλέπετε τον κατάλογο όλων των διαθέσιμων σελίδων, ταξινομημένες κατά [[doku>el:namespaces|φακέλους]].
diff --git a/inc/lang/el/install.html b/inc/lang/el/install.html
index c99a02f33..8ad496dad 100644
--- a/inc/lang/el/install.html
+++ b/inc/lang/el/install.html
@@ -1,26 +1,7 @@
-<p>Αυτή η σελίδα περιέχει πληροφορίες που βοηθούν στην αρχική εγκατάσταση και
-ρύθμιση της εφαρμογής <a href="http://www.dokuwiki.org/el:dokuwiki">Dokuwiki</a>.
-Περισσότερες πληροφορίες υπάρχουν στη <a href="http://www.dokuwiki.org/el:installer">
-σελίδα τεκμηρίωσης</a> του οδηγού εγκατάστασης.</p>
+<p>Αυτή η σελίδα περιέχει πληροφορίες που βοηθούν στην αρχική εγκατάσταση και ρύθμιση της εφαρμογής <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 ή του πίνακα ελέγχου του περιβάλλοντος
-φιλοξενίας (π.χ. cPanel).</p>
+<p>Η εφαρμογή DokuWiki χρησιμοποιεί απλά αρχεία για να αποθηκεύει τις σελίδες wiki καθώς και πληροφορίες που σχετίζονται με αυτές (π.χ. εικόνες, καταλόγους αναζήτησης, παλαιότερες εκδόσεις σελίδων, κλπ). Για να λειτουργεί σωστά η εφαρμογή DokuWiki <strong>πρέπει</strong> να έχει δικαιώματα εγγραφής στους φακέλους που φιλοξενούν αυτά τα αρχεία. Ο οδηγός εγκατάστασης δεν έχει την δυνατότητα να παραχωρήσει αυτά τα δικαιώματα εγγραφής στους σχετικούς φακέλους. Ο κανονικός τρόπος για να γίνει αυτό είναι είτε απευθείας σε περιβάλλον γραμμής εντολών ή, εάν δεν έχετε τέτοια πρόσβαση, μέσω FTP ή του πίνακα ελέγχου του περιβάλλοντος φιλοξενίας (π.χ. cPanel).</p>
-<p>Ο οδηγός εγκατάστασης θα ρυθμίσει την εφαρμογή DokuWiki ώστε να χρησιμοποιεί
-<abbr title="access control list">ACL</abbr>, με τρόπο ώστε ο διαχειριστής
-να έχει δυνατότητα εισόδου και πρόσβαση στο μενού διαχείρισης της εφαρμογής για
-εγκατάσταση επεκτάσεων, διαχείριση χρηστών, διαχείριση δικαιωμάτων πρόσβασης στις
-διάφορες σελίδες και αλλαγή των ρυθμίσεων. Αυτό δεν είναι απαραίτητο για να
-λειτουργήσει η εφαρμογή, αλλά κάνει την διαχείρισή της ευκολότερη.</p>
+<p>Ο οδηγός εγκατάστασης θα ρυθμίσει την εφαρμογή DokuWiki ώστε να χρησιμοποιεί <abbr title="access control list">ACL</abbr>, με τρόπο ώστε ο διαχειριστής να έχει δυνατότητα εισόδου και πρόσβαση στο μενού διαχείρισης της εφαρμογής για εγκατάσταση επεκτάσεων, διαχείριση χρηστών, διαχείριση δικαιωμάτων πρόσβασης στις διάφορες σελίδες και αλλαγή των ρυθμίσεων. Αυτό δεν είναι απαραίτητο για να λειτουργήσει η εφαρμογή, αλλά κάνει την διαχείρισή της ευκολότερη.</p>
-<p>Οι έμπειροι χρήστες και οι χρήστες με ειδικές απαιτήσεις μπορούν να επισκεφθούν
-τις σελίδες που περιέχουν λεπτομερείς <a href="http://dokuwiki.org/install">
-οδηγίες εγκατάστασης</a> και <a href="http://dokuwiki.org/config">πληροφορίες
-για τις ρυθμίσεις</a>.</p> \ No newline at end of file
+<p>Οι έμπειροι χρήστες και οι χρήστες με ειδικές απαιτήσεις μπορούν να επισκεφθούν τις σελίδες που περιέχουν λεπτομερείς <a href="http://dokuwiki.org/el:install"> οδηγίες εγκατάστασης</a> και <a href="http://dokuwiki.org/config">πληροφορίες για τις ρυθμίσεις</a>.</p>
diff --git a/inc/lang/el/lang.php b/inc/lang/el/lang.php
index 4533f414d..1a7b29b95 100644
--- a/inc/lang/el/lang.php
+++ b/inc/lang/el/lang.php
@@ -3,12 +3,14 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Apostolos Tsompanopoulos <info@aptlogs.com>
+ * @author Katerina Katapodi <extragold1234@hotmail.com>
* @author Thanos Massias <tm@thriasio.gr>
* @author Αθανάσιος Νταής <homunculus@wana.gr>
* @author Konstantinos Koryllos <koryllos@gmail.com>
* @author George Petsagourakis <petsagouris@gmail.com>
* @author Petros Vidalis <pvidalis@gmail.com>
- * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
+ * @author Vasileios Karavasilis <vasileioskaravasilis@gmail.com>
* @author Constantinos Xanthopoulos <conx@xanthopoulos.info>
* @author chris taklis <ctaklis@gmail.com>
* @author cross <cross1962@gmail.com>
@@ -73,44 +75,9 @@ $lang['badpassconfirm'] = 'Ο κωδικός που εισάγατε εί
$lang['minoredit'] = 'Ασήμαντες αλλαγές';
$lang['draftdate'] = 'Αυτόματη αποθήκευση πρόχειρης σελίδας στις';
$lang['nosecedit'] = 'Η σελίδα τροποποιήθηκε στο μεταξύ και τα στοιχεία της ενότητας δεν ήταν συγχρονισμένα, οπότε φορτώθηκε η πλήρης σελίδα. ';
-$lang['regmissing'] = 'Πρέπει να συμπληρώσετε όλα τα πεδία.';
-$lang['reguexists'] = 'Αυτός ο λογαριασμός υπάρχει ήδη.';
-$lang['regsuccess'] = 'Ο λογαριασμός δημιουργήθηκε και ο κωδικός εστάλει με e-mail.';
-$lang['regsuccess2'] = 'Ο λογαριασμός δημιουργήθηκε.';
-$lang['regfail'] = 'Δεν έγινε η δημιουργία χρήστη.';
-$lang['regmailfail'] = 'Φαίνεται να υπάρχει πρόβλημα με την αποστολή του κωδικού μέσω e-mail. Παρακαλούμε επικοινωνήστε μαζί μας!';
-$lang['regbadmail'] = 'Η διεύθυνση e-mail δεν είναι έγκυρη - εάν πιστεύετε ότι αυτό είναι λάθος, επικοινωνήστε μαζί μας';
-$lang['regbadpass'] = 'Οι δύο κωδικοί δεν είναι ίδιοι, προσπαθήστε ξανά.';
-$lang['regpwmail'] = 'Ο κωδικός σας';
-$lang['reghere'] = 'Δεν έχετε λογαριασμό ακόμη? Δημιουργήστε έναν';
-$lang['profna'] = 'Αυτό το wiki δεν υποστηρίζει την επεξεργασία προφίλ.';
-$lang['profnochange'] = 'Καμία αλλαγή.';
-$lang['profnoempty'] = 'Δεν επιτρέπεται κενό όνομα χρήστη η κενή διεύθυνση email.';
-$lang['profchanged'] = 'Το προφίλ χρήστη τροποποιήθηκε επιτυχώς.';
-$lang['profnodelete'] = 'Το wiki δεν υποστηρίζει την διαγραφή χρηστών';
-$lang['profdeleteuser'] = 'Διαγραφή λογαριασμού';
-$lang['profdeleted'] = 'Ο λογαριασμός διαγράφηκε από αυτό το wiki';
-$lang['profconfdelete'] = 'Επιθυμώ να διαγράψω τον λογαριασμό μου από αυτό το wiki. <br/> Αυτή η επιλογή δεν μπορεί να αναιρεθεί.';
-$lang['profconfdeletemissing'] = 'Το κουμπί επιβεβαίωσης δεν πατήθηκε';
-$lang['proffail'] = 'Δεν ενημερώθηκε το προφίλ του χρήστη.';
-$lang['pwdforget'] = 'Ξεχάσατε το κωδικό σας; Αποκτήστε νέο.';
-$lang['resendna'] = 'Αυτό το wiki δεν υποστηρίζει την εκ\' νέου αποστολή κωδικών.';
-$lang['resendpwd'] = 'Εισαγωγή νέου ωδικού για';
-$lang['resendpwdmissing'] = 'Πρέπει να συμπληρώσετε όλα τα πεδία.';
-$lang['resendpwdnouser'] = 'Αυτός ο χρήστης δεν υπάρχει στα αρχεία μας.';
-$lang['resendpwdbadauth'] = 'Αυτός ο κωδικός ενεργοποίησης δεν είναι έγκυρος.';
-$lang['resendpwdconfirm'] = 'Ο σύνδεσμος προς την σελίδα ενεργοποίησης εστάλει με e-mail.';
-$lang['resendpwdsuccess'] = 'Ο νέος σας κωδικός εστάλη με e-mail.';
-$lang['license'] = 'Εκτός εάν αναφέρεται διαφορετικά, το περιεχόμενο σε αυτο το wiki διέπεται από την ακόλουθη άδεια:';
-$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['searchcreatepage'] = 'Αν δεν βρήκατε αυτό που ψάχνατε, μπορείτε να δημιουργήσετε και να εκδώσετε την σελίδα %s, που ονομάστηκε μετά την αναζήτηση.';
+$lang['search_fullresults'] = 'Ολοκληρωμένα αποτελέσματα';
+$lang['js']['search_toggle_tools'] = 'Χρησιμοποιήστε τα Εργαλεία Αναζήτησης';
$lang['js']['willexpire'] = 'Το κλείδωμά σας για την επεξεργασία αυτής της σελίδας θα λήξει σε ένα λεπτό.\n Για να το ανανεώσετε χρησιμοποιήστε την Προεπισκόπηση.';
$lang['js']['notsavedyet'] = 'Οι μη αποθηκευμένες αλλαγές θα χαθούν.
Θέλετε να συνεχίσετε;';
@@ -154,6 +121,56 @@ $lang['js']['media_done_btn'] = 'Ολοκλήρωση';
$lang['js']['media_drop'] = 'Ρίξτε αρχεία εδώ για να τα φορτώσετε';
$lang['js']['media_cancel'] = 'αφαίρεση';
$lang['js']['media_overwrt'] = 'Αντικατάσταση υπάρχοντων αρχείων';
+$lang['search_exact_match'] = 'Απόλυτο ταίριασμα';
+$lang['search_starts_with'] = 'Αρχίζει με';
+$lang['search_ends_with'] = 'Τελειώνει με';
+$lang['search_contains'] = 'Περιέχει';
+$lang['search_custom_match'] = 'Προσωποποίηση';
+$lang['search_any_ns'] = 'Οιοδήποτε κενό με όνομα';
+$lang['search_any_time'] = 'Οιαδήποτε στιγμή';
+$lang['search_past_7_days'] = 'Την περασμένη εβδομάδα';
+$lang['search_past_month'] = 'Τον περασμένο μήνα';
+$lang['search_past_year'] = 'Τον περασμένο χρόνο';
+$lang['search_sort_by_hits'] = 'Επιλογή με βάση τα κλικ';
+$lang['search_sort_by_mtime'] = 'Επιλογή σύμφωνα με την τελευταία τροποποίηση';
+$lang['regmissing'] = 'Πρέπει να συμπληρώσετε όλα τα πεδία.';
+$lang['reguexists'] = 'Αυτός ο λογαριασμός υπάρχει ήδη.';
+$lang['regsuccess'] = 'Ο λογαριασμός δημιουργήθηκε και ο κωδικός εστάλει με e-mail.';
+$lang['regsuccess2'] = 'Ο λογαριασμός δημιουργήθηκε.';
+$lang['regfail'] = 'Δεν έγινε η δημιουργία χρήστη.';
+$lang['regmailfail'] = 'Φαίνεται να υπάρχει πρόβλημα με την αποστολή του κωδικού μέσω e-mail. Παρακαλούμε επικοινωνήστε μαζί μας!';
+$lang['regbadmail'] = 'Η διεύθυνση e-mail δεν είναι έγκυρη - εάν πιστεύετε ότι αυτό είναι λάθος, επικοινωνήστε μαζί μας';
+$lang['regbadpass'] = 'Οι δύο κωδικοί δεν είναι ίδιοι, προσπαθήστε ξανά.';
+$lang['regpwmail'] = 'Ο κωδικός σας';
+$lang['reghere'] = 'Δεν έχετε λογαριασμό ακόμη; Δημιουργήστε έναν';
+$lang['profna'] = 'Αυτό το wiki δεν υποστηρίζει την επεξεργασία προφίλ.';
+$lang['profnochange'] = 'Καμία αλλαγή.';
+$lang['profnoempty'] = 'Δεν επιτρέπεται κενό όνομα χρήστη η κενή διεύθυνση email.';
+$lang['profchanged'] = 'Το προφίλ χρήστη τροποποιήθηκε επιτυχώς.';
+$lang['profnodelete'] = 'Το wiki δεν υποστηρίζει την διαγραφή χρηστών';
+$lang['profdeleteuser'] = 'Διαγραφή λογαριασμού';
+$lang['profdeleted'] = 'Ο λογαριασμός διαγράφηκε από αυτό το wiki';
+$lang['profconfdelete'] = 'Επιθυμώ να διαγράψω τον λογαριασμό μου από αυτό το wiki. <br/> Αυτή η επιλογή δεν μπορεί να αναιρεθεί.';
+$lang['profconfdeletemissing'] = 'Το κουμπί επιβεβαίωσης δεν πατήθηκε';
+$lang['proffail'] = 'Δεν ενημερώθηκε το προφίλ του χρήστη.';
+$lang['pwdforget'] = 'Ξεχάσατε το κωδικό σας; Αποκτήστε νέο.';
+$lang['resendna'] = 'Αυτό το wiki δεν υποστηρίζει την εκ\' νέου αποστολή κωδικών.';
+$lang['resendpwd'] = 'Εισαγωγή νέου ωδικού για';
+$lang['resendpwdmissing'] = 'Πρέπει να συμπληρώσετε όλα τα πεδία.';
+$lang['resendpwdnouser'] = 'Αυτός ο χρήστης δεν υπάρχει στα αρχεία μας.';
+$lang['resendpwdbadauth'] = 'Αυτός ο κωδικός ενεργοποίησης δεν είναι έγκυρος.';
+$lang['resendpwdconfirm'] = 'Ο σύνδεσμος προς την σελίδα ενεργοποίησης εστάλει με e-mail.';
+$lang['resendpwdsuccess'] = 'Ο νέος σας κωδικός εστάλη με e-mail.';
+$lang['license'] = 'Εκτός εάν αναφέρεται διαφορετικά, το περιεχόμενο σε αυτο το wiki διέπεται από την ακόλουθη άδεια:';
+$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['rssfailed'] = 'Παρουσιάστηκε κάποιο σφάλμα κατά την ανάγνωση αυτού του feed: ';
$lang['nothingfound'] = 'Δεν βρέθηκαν σχετικά αποτελέσματα.';
$lang['mediaselect'] = 'Επιλογή Αρχείων';
@@ -161,6 +178,7 @@ $lang['uploadsucc'] = 'Επιτυχής φόρτωση';
$lang['uploadfail'] = 'Η μεταφόρτωση απέτυχε. Πιθανόν αυτό να οφείλεται στις ρυθμίσεις πρόσβασης του αρχείου.';
$lang['uploadwrong'] = 'Η μεταφόρτωση δεν έγινε δεκτή. Δεν επιτρέπονται αρχεία αυτού του τύπου!';
$lang['uploadexist'] = 'Το αρχείο ήδη υπάρχει. Δεν έγινε καμία αλλαγή.';
+$lang['uploadbadcontent'] = 'Το περιεχόμενο που φορτώθηκε δεν ταίριαζε το %s της προέκτασης του φακέλλου.';
$lang['uploadspam'] = 'Η μεταφόρτωση ακυρώθηκε από το φίλτρο spam.';
$lang['uploadxss'] = 'Η μεταφόρτωση ακυρώθηκε λόγω πιθανού επικίνδυνου περιεχομένου.';
$lang['uploadsize'] = 'Το αρχείο ήταν πολύ μεγάλο. (μέγιστο %s)';
@@ -192,6 +210,8 @@ $lang['diff_side'] = 'Δίπλα-δίπλα';
$lang['diffprevrev'] = 'Προηγούμενη αναθεώρηση';
$lang['diffnextrev'] = 'Επόμενη αναθεώρηση';
$lang['difflastrev'] = 'Τελευταία αναθεώρηση';
+$lang['diffbothprevrev'] = 'Προηγούμενος έλεγχος και από τις δύο πλευρές';
+$lang['diffbothnextrev'] = 'Επόμενος έλεγχος και από τις δύο πλευρές';
$lang['line'] = 'Γραμμή';
$lang['breadcrumb'] = 'Ιστορικό:';
$lang['youarehere'] = 'Είστε εδώ:';
@@ -301,6 +321,9 @@ $lang['i_pol2'] = 'Κλειστό Wiki (μόνο οι εγγεγ
$lang['i_allowreg'] = 'Οι χρήστες επιτρέπεται να εγγραφούν μόνοι τους';
$lang['i_retry'] = 'Νέα προσπάθεια';
$lang['i_license'] = 'Παρακαλώ επιλέξτε την άδεια που θα χρησιμοποιήσετε για την διάθεση του περιεχομένου σας:';
+$lang['i_license_none'] = 'Μην προβάλλετε καθόλου πληροφορίες σχετικά με την άδεια';
+$lang['i_pop_field'] = 'Παρακαλώ, βοηθήστε μας να βελτιώσουμε το Dokuwiki';
+$lang['i_pop_label'] = 'Μια φορά τον μήνα, στέλνετε δεδομένα προς χρήση στους δημιουργούς του Dokuwiki';
$lang['recent_global'] = 'Βλέπετε τις αλλαγές εντός του φακέλου <b>%s</b>. Μπορείτε επίσης να <a href="%s">δείτε τις πρόσφατες αλλαγές σε όλο το wiki</a>.';
$lang['years'] = 'πριν %d χρόνια';
$lang['months'] = 'πριν %d μήνες';
@@ -333,6 +356,12 @@ $lang['media_perm_read'] = 'Συγνώμη, δεν έχετε επαρκή
$lang['media_perm_upload'] = 'Συγνώμη, δεν έχετε επαρκή διακαιώματα για να φορτώσετε αυτά τα αρχεία.';
$lang['media_update'] = 'Φόρτωση νέας έκδοσης';
$lang['media_restore'] = 'Επαναφορά αυτή της έκδοσης';
+$lang['media_acl_warning'] = 'Αυτή η λίστα πιθανόν να μην είναι πλήρης λόγω του ACL, περιορισμούς και κρυμμένες σελίδες.';
+$lang['currentns'] = 'Χώρος για όνομα';
$lang['searchresult'] = 'Αποτέλεσμα έρευνας';
+$lang['plainhtml'] = 'Απλό HTML';
+$lang['wikimarkup'] = 'Wiki Markup';
+$lang['page_nonexist_rev'] = 'Δεν υπήρξε σελίδα στο %s. Δημιουργήθηκε στη συνέχεια στο <a href=\'\'%s\'\'>%s,</a>.';
+$lang['unable_to_parse_date'] = 'Δεν μπόρεσε να περάσει στην παράμετρο \'\'%s\'\'.';
$lang['email_signature_text'] = 'Αυτό το e-mail δημιουργήθηκε αυτόματα από την εφαρμογή DokuWiki στην διεύθυνση
@DOKUWIKIURL@';
diff --git a/inc/lang/el/locked.txt b/inc/lang/el/locked.txt
index 425c334f1..20ffeb743 100644
--- a/inc/lang/el/locked.txt
+++ b/inc/lang/el/locked.txt
@@ -2,4 +2,3 @@
Αυτή η σελίδα είναι προς το παρόν δεσμευμένη για τροποποίηση από άλλον χρήστη.
Θα πρέπει να περιμένετε μέχρι ο συγκεκριμένος χρήστης να σταματήσει να την επεξεργάζεται ή να εκπνεύσει το χρονικό όριο για το σχετικό κλείδωμα.
-
diff --git a/inc/lang/el/login.txt b/inc/lang/el/login.txt
index 3021a19ea..4a9a60fa3 100644
--- a/inc/lang/el/login.txt
+++ b/inc/lang/el/login.txt
@@ -1,5 +1,3 @@
====== Σύνδεση χρήστη ======
-Αυτή την στιγμή δεν έχετε συνδεθεί ως χρήστης!
-Για να συνδεθείτε, εισάγετε τα στοιχεία σας στην παρακάτω φόρμα.
-Πρέπει να έχετε ενεργοποιήσει τα cookies στο πρόγραμμα περιήγηση σας.
+Αυτή την στιγμή δεν έχετε συνδεθεί ως χρήστης! Για να συνδεθείτε, εισάγετε τα στοιχεία σας στην παρακάτω φόρμα. Πρέπει να έχετε ενεργοποιήσει τα cookies στο πρόγραμμα περιήγηση σας.
diff --git a/inc/lang/el/newpage.txt b/inc/lang/el/newpage.txt
index 3349ad90e..6d9c955bf 100644
--- a/inc/lang/el/newpage.txt
+++ b/inc/lang/el/newpage.txt
@@ -1,4 +1,3 @@
====== Αυτή η σελίδα δεν υπάρχει ακόμη ======
-Η σελίδα που ζητάτε δεν υπάρχει ακόμη.
-Aν όμως έχετε επαρκή δικαιώματα, μπορείτε να την δημιουργήσετε επιλέγοντας ''Δημιουργία σελίδας''.
+Η σελίδα που ζητάτε δεν υπάρχει ακόμη. Aν όμως έχετε επαρκή δικαιώματα, μπορείτε να την δημιουργήσετε επιλέγοντας **Δημιουργία σελίδας**.
diff --git a/inc/lang/el/norev.txt b/inc/lang/el/norev.txt
index 2b13290ff..87d24eddb 100644
--- a/inc/lang/el/norev.txt
+++ b/inc/lang/el/norev.txt
@@ -1,5 +1,3 @@
====== Αυτή η έκδοση δεν υπάρχει ======
-Η έκδοση που αναζητήσατε δεν υπάρχει.
-Μπορείτε να δείτε λίστα με τις παλαιότερες εκδόσεις της τρέχουσας σελίδας πατώντας ''Παλαιότερες εκδόσεις σελίδας''.
-
+Η έκδοση που αναζητήσατε δεν υπάρχει. Μπορείτε να δείτε λίστα με τις παλαιότερες εκδόσεις της τρέχουσας σελίδας πατώντας ''Παλαιότερες εκδόσεις σελίδας''.
diff --git a/inc/lang/el/onceexisted.txt b/inc/lang/el/onceexisted.txt
new file mode 100644
index 000000000..70b5a2566
--- /dev/null
+++ b/inc/lang/el/onceexisted.txt
@@ -0,0 +1,2 @@
+Αυτή η σελίδα δεν υπάρχει πια
+Ακολουθήσατε έναν σύνδεσμο σε μια σελίδα που δεν υπάρχει πια. Μπορείτε να ελέγξετε την λίστα στο [[?do=revisions|old revisions]] για να δείτε αν και γιατί αφαιρέθηκε, να πάτε σε παλαιότερους ελέγχους ή να την ανανεώσετε. \ No newline at end of file
diff --git a/inc/lang/el/preview.txt b/inc/lang/el/preview.txt
index aef65c974..8369faddd 100644
--- a/inc/lang/el/preview.txt
+++ b/inc/lang/el/preview.txt
@@ -1,5 +1,3 @@
====== Προεπισκόπηση ======
-Αυτή είναι μια προεπισκόπηση του πως θα δείχνει η σελίδα.
-Υπενθύμιση: Οι αλλαγές σας **δεν έχουν αποθηκευθεί** ακόμη!
-
+Αυτή είναι μια προεπισκόπηση του πως θα δείχνει η σελίδα. **Υπενθύμιση: Οι αλλαγές σας δεν έχουν αποθηκευθεί ακόμη**!
diff --git a/inc/lang/el/pwconfirm.txt b/inc/lang/el/pwconfirm.txt
index 4c1559c3b..3b6cf0e01 100644
--- a/inc/lang/el/pwconfirm.txt
+++ b/inc/lang/el/pwconfirm.txt
@@ -1,7 +1,6 @@
Γεια σας @FULLNAME@!
-Κάποιος ζήτησε τη δημιουργία νέου συνθηματικού για τον λογαριασμό @TITLE@
-που διατηρείτε στο @DOKUWIKIURL@
+Κάποιος ζήτησε τη δημιουργία νέου συνθηματικού για τον λογαριασμό @TITLE@ που διατηρείτε στο @DOKUWIKIURL@
Αν δεν ζητήσατε εσείς την δημιουργία νέου συνθηματικού απλά αγνοήστε αυτό το e-mail.
diff --git a/inc/lang/el/register.txt b/inc/lang/el/register.txt
index 6a4e963e4..d34c544a6 100644
--- a/inc/lang/el/register.txt
+++ b/inc/lang/el/register.txt
@@ -1,5 +1,3 @@
====== Εγγραφή νέου χρήστη ======
-Συμπληρώστε όλα τα παρακάτω πεδία για να δημιουργήσετε ένα νέο λογαριασμό σε αυτό το wiki.
-Πρέπει να δώσετε μια **υπαρκτή e-mail διεύθυνση** - ο κωδικός σας θα σας αποσταλεί σε αυτήν.
-Το όνομα χρήστη θα πρέπει να πληρεί τις ίδιες απαιτήσεις ονόματος που ισχύουν και για τους [[doku>el:pagename|φακέλους]].
+Συμπληρώστε όλα τα παρακάτω πεδία για να δημιουργήσετε ένα νέο λογαριασμό σε αυτό το wiki. Πρέπει να δώσετε μια **υπαρκτή e-mail διεύθυνση** - ο κωδικός σας θα σας αποσταλεί σε αυτήν. Το όνομα χρήστη θα πρέπει να πληρεί τις ίδιες απαιτήσεις ονόματος που ισχύουν και για τους [[doku>el:pagename|φακέλους]].
diff --git a/inc/lang/el/resendpwd.txt b/inc/lang/el/resendpwd.txt
index 6b4f3bbca..8d82f60ff 100644
--- a/inc/lang/el/resendpwd.txt
+++ b/inc/lang/el/resendpwd.txt
@@ -1,6 +1,3 @@
====== Αποστολή νέου κωδικού ======
-Συμπληρώστε όλα τα παρακάτω πεδία για να λάβετε ένα νέο κωδικό για τον λογαριασμό σας σε αυτό το wiki.
-Ο νέος κωδικός σας θα σταλεί στην e-mail διεύθυνση που έχετε ήδη δηλώσει.
-Το όνομα πρέπει να είναι αυτό που ισχύει για τον λογαριασμό σας σε αυτό το wiki.
-
+Συμπληρώστε όλα τα παρακάτω πεδία για να λάβετε ένα νέο κωδικό για τον λογαριασμό σας σε αυτό το wiki. Ο νέος κωδικός σας θα σταλεί στην e-mail διεύθυνση που έχετε ήδη δηλώσει. Το όνομα πρέπει να είναι αυτό που ισχύει για τον λογαριασμό σας σε αυτό το wiki.
diff --git a/inc/lang/el/resetpwd.txt b/inc/lang/el/resetpwd.txt
index 0d26d05fa..cbb1c42b2 100644
--- a/inc/lang/el/resetpwd.txt
+++ b/inc/lang/el/resetpwd.txt
@@ -1,3 +1,3 @@
====== Εισάγετε νέο κωδικό πρόσβασης ======
-Παρακαλούμε, εισάγετε έναν νέο κωδικό πρόσβασης για τον λογαριασμό σας. \ No newline at end of file
+Παρακαλούμε, εισάγετε έναν νέο κωδικό πρόσβασης για τον λογαριασμό σας.
diff --git a/inc/lang/el/searchpage.txt b/inc/lang/el/searchpage.txt
index c5bbbbfae..bee13de0b 100644
--- a/inc/lang/el/searchpage.txt
+++ b/inc/lang/el/searchpage.txt
@@ -1,4 +1,3 @@
====== Αναζήτηση ======
Τα αποτελέσματα της αναζήτησής σας. @CREATEPAGEINFO@
-
diff --git a/inc/lang/el/stopwords.txt b/inc/lang/el/stopwords.txt
index 01d5103b3..29caa1a6a 100644
--- a/inc/lang/el/stopwords.txt
+++ b/inc/lang/el/stopwords.txt
@@ -100,4 +100,5 @@
είτε
μόνο
μη
-ενώ \ No newline at end of file
+ενώ
+www
diff --git a/inc/lang/el/updateprofile.txt b/inc/lang/el/updateprofile.txt
index 56f176d37..ccb9596b6 100644
--- a/inc/lang/el/updateprofile.txt
+++ b/inc/lang/el/updateprofile.txt
@@ -1,4 +1,3 @@
====== Τροποποίηση προφίλ ======
-Τροποποιήστε **μόνο** τα πεδία που θέλετε να αλλάξετε.
-Δεν μπορείτε να αλλάξετε το πεδίο ''Όνομα''.
+Τροποποιήστε **μόνο** τα πεδία που θέλετε να αλλάξετε. Δεν μπορείτε να αλλάξετε το πεδίο ''Όνομα''.
diff --git a/inc/lang/en/admin.txt b/inc/lang/en/admin.txt
index cfd21b217..8998ca9d8 100644
--- a/inc/lang/en/admin.txt
+++ b/inc/lang/en/admin.txt
@@ -1,4 +1,3 @@
====== Administration ======
Below you can find a list of administrative tasks available in DokuWiki.
-
diff --git a/inc/lang/en/backlinks.txt b/inc/lang/en/backlinks.txt
index 5b40b84ea..55514bf35 100644
--- a/inc/lang/en/backlinks.txt
+++ b/inc/lang/en/backlinks.txt
@@ -1,4 +1,3 @@
====== Backlinks ======
This is a list of pages that seem to link back to the current page.
-
diff --git a/inc/lang/en/conflict.txt b/inc/lang/en/conflict.txt
index 624f17b21..2586a2a44 100644
--- a/inc/lang/en/conflict.txt
+++ b/inc/lang/en/conflict.txt
@@ -3,4 +3,3 @@
A newer version of the document you edited exists. This happens when another user changed the document while you were editing it.
Examine the differences shown below thoroughly, then decide which version to keep. If you choose ''save'', your version will be saved. Hit ''cancel'' to keep the current version.
-
diff --git a/inc/lang/en/denied.txt b/inc/lang/en/denied.txt
index 34cb8456a..e6fade4b9 100644
--- a/inc/lang/en/denied.txt
+++ b/inc/lang/en/denied.txt
@@ -1,4 +1,3 @@
====== Permission Denied ======
Sorry, you don't have enough rights to continue.
-
diff --git a/inc/lang/en/diff.txt b/inc/lang/en/diff.txt
index 934534d42..46f0b34fe 100644
--- a/inc/lang/en/diff.txt
+++ b/inc/lang/en/diff.txt
@@ -1,4 +1,3 @@
====== Differences ======
This shows you the differences between two versions of the page.
-
diff --git a/inc/lang/en/draft.txt b/inc/lang/en/draft.txt
index e84d34a5b..b6a930ac8 100644
--- a/inc/lang/en/draft.txt
+++ b/inc/lang/en/draft.txt
@@ -3,4 +3,3 @@
Your last edit session on this page was not completed correctly. DokuWiki automatically saved a draft during your work which you may now use to continue your editing. Below you can see the data that was saved from your last session.
Please decide if you want to //recover// your lost edit session, //delete// the autosaved draft or //cancel// the editing process.
-
diff --git a/inc/lang/en/edit.txt b/inc/lang/en/edit.txt
index 48c9c296d..0f395b574 100644
--- a/inc/lang/en/edit.txt
+++ b/inc/lang/en/edit.txt
@@ -1,2 +1 @@
Edit the page and hit ''Save''. See [[wiki:syntax]] for Wiki syntax. Please edit the page only if you can **improve** it. If you want to test some things, learn to make your first steps on the [[playground:playground|playground]].
-
diff --git a/inc/lang/en/index.txt b/inc/lang/en/index.txt
index 152911bbb..dced64951 100644
--- a/inc/lang/en/index.txt
+++ b/inc/lang/en/index.txt
@@ -1,4 +1,3 @@
====== Sitemap ======
This is a sitemap over all available pages ordered by [[doku>namespaces|namespaces]].
-
diff --git a/inc/lang/en/install.html b/inc/lang/en/install.html
index df2b69935..fa6b99ab7 100644
--- a/inc/lang/en/install.html
+++ b/inc/lang/en/install.html
@@ -1,24 +1,7 @@
-<p>This page assists in the first time installation and configuration of
-<a href="http://dokuwiki.org">Dokuwiki</a>. More info on this
-installer is available on it's own
-<a href="http://dokuwiki.org/installer">documentation page</a>.</p>
+<p>This page assists in the first time installation and configuration of <a href="http://dokuwiki.org">Dokuwiki</a>. More info on this installer is available on it's own <a href="http://dokuwiki.org/installer">documentation page</a>.</p>
-<p>DokuWiki uses ordinary files for the storage of wiki pages and other
-information associated with those pages (e.g. images, search indexes, old
-revisions, etc). In order to operate successfully DokuWiki
-<strong>must</strong> have write access to the directories that hold those
-files. This installer is not capable of setting up directory permissions. That
-normally needs to be done directly on a command shell or if you are using hosting,
-through FTP or your hosting control panel (e.g. cPanel).</p>
+<p>DokuWiki uses ordinary files for the storage of wiki pages and other information associated with those pages (e.g. images, search indexes, old revisions, etc). In order to operate successfully DokuWiki <strong>must</strong> have write access to the directories that hold those files. This installer is not capable of setting up directory permissions. That normally needs to be done directly on a command shell or if you are using hosting, through FTP or your hosting control panel (e.g. cPanel).</p>
-<p>This installer will setup your DokuWiki configuration for
-<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
-to administer.</p>
+<p>This installer will setup your DokuWiki configuration for <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 to administer.</p>
-<p>Experienced users or users with special setup requirements should use these links
-for details concerning
-<a href="http://dokuwiki.org/install">installation instructions</a>
-and <a href="http://dokuwiki.org/config">configuration settings</a>.</p>
+<p>Experienced users or users with special setup requirements should use these links for details concerning <a href="http://dokuwiki.org/install">installation instructions</a> and <a href="http://dokuwiki.org/config">configuration settings</a>.</p>
diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php
index 4d11bac08..eb3ad1638 100644
--- a/inc/lang/en/lang.php
+++ b/inc/lang/en/lang.php
@@ -319,8 +319,12 @@ $lang['i_modified'] = 'For security reasons this script will only wor
You should either re-extract the files from the downloaded package or consult the complete
<a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>';
$lang['i_funcna'] = 'PHP function <code>%s</code> is not available. Maybe your hosting provider disabled it for some reason?';
+$lang['i_disabled'] = 'It has been disabled by your provider.';
+$lang['i_funcnmail'] = '<b>Note:</b> The PHP mail function is not available. %s' .
+ ' If it remains unavailable, you may install the <a href="http://dokuwiki.org/plugins/smtp">smtp plugin</a>.';
$lang['i_phpver'] = 'Your PHP version <code>%s</code> is lower than the needed <code>%s</code>. You need to upgrade your PHP install.';
$lang['i_mbfuncoverload'] = 'mbstring.func_overload must be disabled in php.ini to run DokuWiki.';
+$lang['i_urandom'] = 'DokuWiki cannot create cryptographically secure numbers for cookies. You may want to check your open_basedir settings in php.ini for proper <code>/dev/urandom</code> access.';
$lang['i_permfail'] = '<code>%s</code> is not writable by DokuWiki. You need to fix the permission settings of this directory!';
$lang['i_confexists'] = '<code>%s</code> already exists';
$lang['i_writeerr'] = 'Unable to create <code>%s</code>. You will need to check directory/file permissions and create the file manually.';
@@ -377,6 +381,7 @@ $lang['media_update'] = 'Upload new version';
$lang['media_restore'] = 'Restore this version';
$lang['media_acl_warning'] = 'This list might not be complete due to ACL restrictions and hidden pages.';
+$lang['email_fail'] = 'PHP mail() missing or disabled. The following email was not sent: ';
$lang['currentns'] = 'Current namespace';
$lang['searchresult'] = 'Search Result';
$lang['plainhtml'] = 'Plain HTML';
diff --git a/inc/lang/en/login.txt b/inc/lang/en/login.txt
index 2004ea198..151bf7f4b 100644
--- a/inc/lang/en/login.txt
+++ b/inc/lang/en/login.txt
@@ -1,4 +1,3 @@
====== Login ======
You are currently not logged in! Enter your authentication credentials below to log in. You need to have cookies enabled to log in.
-
diff --git a/inc/lang/en/mailtext.txt b/inc/lang/en/mailtext.txt
index aea14d459..eac40356d 100644
--- a/inc/lang/en/mailtext.txt
+++ b/inc/lang/en/mailtext.txt
@@ -1,12 +1,15 @@
A page in your DokuWiki was added or changed. Here are the details:
-Date : @DATE@
-Browser : @BROWSER@
-IP-Address : @IPADDRESS@
-Hostname : @HOSTNAME@
-Old Revision: @OLDPAGE@
-New Revision: @NEWPAGE@
-Edit Summary: @SUMMARY@
-User : @USER@
+Browser : @BROWSER@
+IP Address : @IPADDRESS@
+Hostname : @HOSTNAME@
+Old Revision : @OLDPAGE@
+New Revision : @NEWPAGE@
+Date of New Revision: @DATE@
+Edit Summary : @SUMMARY@
+User : @USER@
+
+There may be newer changes after this revision. If this
+happens, a message will be shown on the top of the rev page.
@DIFF@
diff --git a/inc/lang/en/newpage.txt b/inc/lang/en/newpage.txt
index e78b534a0..c9ae6e6fe 100644
--- a/inc/lang/en/newpage.txt
+++ b/inc/lang/en/newpage.txt
@@ -1,4 +1,3 @@
====== 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 clicking on "Create this page".
-
+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 27c336be7..b24c7923c 100644
--- a/inc/lang/en/norev.txt
+++ b/inc/lang/en/norev.txt
@@ -1,4 +1,3 @@
====== No such revision ======
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/onceexisted.txt b/inc/lang/en/onceexisted.txt
new file mode 100644
index 000000000..87cc05750
--- /dev/null
+++ b/inc/lang/en/onceexisted.txt
@@ -0,0 +1,3 @@
+======= This page does not exist anymore ======
+
+You've followed a link to a page that no longer exists. You can check the list of [[?do=revisions|old revisions]] to see when and why it was deleted, access old revisions or restore it. \ No newline at end of file
diff --git a/inc/lang/en/preview.txt b/inc/lang/en/preview.txt
index 5ca69694d..672705683 100644
--- a/inc/lang/en/preview.txt
+++ b/inc/lang/en/preview.txt
@@ -1,4 +1,3 @@
====== Preview ======
-This is a preview of what your text will look like. Remember: It is **not saved** yet!
-
+This is a preview of what your text will look like. **Remember: It is not saved yet**!
diff --git a/inc/lang/en/pwconfirm.txt b/inc/lang/en/pwconfirm.txt
index 3732d8a03..44bdeb4a8 100644
--- a/inc/lang/en/pwconfirm.txt
+++ b/inc/lang/en/pwconfirm.txt
@@ -1,11 +1,9 @@
Hi @FULLNAME@!
-Someone requested a new password for your @TITLE@
-login at @DOKUWIKIURL@
+Someone requested a new password for your @TITLE@ login at @DOKUWIKIURL@
If you did not request a new password then just ignore this email.
-To confirm that the request was really sent by you please use the
-following link.
+To confirm that the request was really sent by you please use the following link.
@CONFIRM@
diff --git a/inc/lang/en/read.txt b/inc/lang/en/read.txt
index 9f56d81ad..6e2af1335 100644
--- a/inc/lang/en/read.txt
+++ b/inc/lang/en/read.txt
@@ -1,2 +1 @@
This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong.
-
diff --git a/inc/lang/en/recent.txt b/inc/lang/en/recent.txt
index 3f7b58c46..0f9a7f6b3 100644
--- a/inc/lang/en/recent.txt
+++ b/inc/lang/en/recent.txt
@@ -1,5 +1,3 @@
====== Recent Changes ======
-The following pages were changed recently.
-
-
+The following pages were changed recently:
diff --git a/inc/lang/en/register.txt b/inc/lang/en/register.txt
index db68d4f2f..777840261 100644
--- a/inc/lang/en/register.txt
+++ b/inc/lang/en/register.txt
@@ -1,4 +1,3 @@
====== Register as new user ======
Fill in all the information below to create a new account in this wiki. Make sure you supply a **valid e-mail address** - if you are not asked to enter a password here, a new one will be sent to that address. The login name should be a valid [[doku>pagename|pagename]].
-
diff --git a/inc/lang/en/resendpwd.txt b/inc/lang/en/resendpwd.txt
index 98c8c756b..2696fe4f0 100644
--- a/inc/lang/en/resendpwd.txt
+++ b/inc/lang/en/resendpwd.txt
@@ -1,4 +1,3 @@
====== Send new password ======
Please enter your user name in the form below to request a new password for your account in this wiki. A confirmation link will be sent to your registered email address.
-
diff --git a/inc/lang/en/resetpwd.txt b/inc/lang/en/resetpwd.txt
index 993b48765..5f59f0f68 100644
--- a/inc/lang/en/resetpwd.txt
+++ b/inc/lang/en/resetpwd.txt
@@ -1,4 +1,3 @@
====== Set new password ======
Please enter a new password for your account in this wiki.
-
diff --git a/inc/lang/en/revisions.txt b/inc/lang/en/revisions.txt
index dd5f35b8e..90b036a0c 100644
--- a/inc/lang/en/revisions.txt
+++ b/inc/lang/en/revisions.txt
@@ -1,4 +1,3 @@
====== Old Revisions ======
These are the older revisons of the current document. To revert to an old revision, select it from below, click ''Edit this page'' and save it.
-
diff --git a/inc/lang/en/searchpage.txt b/inc/lang/en/searchpage.txt
index 59cbec251..0cd016011 100644
--- a/inc/lang/en/searchpage.txt
+++ b/inc/lang/en/searchpage.txt
@@ -1,4 +1,3 @@
====== Search ======
You can find the results of your search below. @CREATEPAGEINFO@
-
diff --git a/inc/lang/en/subscr_single.txt b/inc/lang/en/subscr_single.txt
index 8f097dc3e..046b9945d 100644
--- a/inc/lang/en/subscr_single.txt
+++ b/inc/lang/en/subscr_single.txt
@@ -7,11 +7,11 @@ Here are the changes:
@DIFF@
--------------------------------------------------------
-Date : @DATE@
-User : @USER@
-Edit Summary: @SUMMARY@
-Old Revision: @OLDPAGE@
-New Revision: @NEWPAGE@
+User : @USER@
+Edit Summary : @SUMMARY@
+Old Revision : @OLDPAGE@
+New Revision : @NEWPAGE@
+Date of New Revision: @DATE@
To cancel the page notifications, log into the wiki at
@DOKUWIKIURL@ then visit
diff --git a/inc/lang/en/updateprofile.txt b/inc/lang/en/updateprofile.txt
index b929fee83..73e53aaa7 100644
--- a/inc/lang/en/updateprofile.txt
+++ b/inc/lang/en/updateprofile.txt
@@ -1,5 +1,3 @@
====== Update your account profile ======
You only need to complete those fields you wish to change. You may not change your user name.
-
-
diff --git a/inc/lang/eo/backlinks.txt b/inc/lang/eo/backlinks.txt
index cd0cca9c6..d3c1f51a0 100644
--- a/inc/lang/eo/backlinks.txt
+++ b/inc/lang/eo/backlinks.txt
@@ -1,3 +1,3 @@
====== Retroligiloj ======
-Ĉi tiu listo montras paĝojn, kiuj referencas al la aktuala paĝo. \ No newline at end of file
+Ĉi tiu listo montras paĝojn, kiuj referencas al la aktuala paĝo.
diff --git a/inc/lang/eo/denied.txt b/inc/lang/eo/denied.txt
index e0abba12c..2b41f21f8 100644
--- a/inc/lang/eo/denied.txt
+++ b/inc/lang/eo/denied.txt
@@ -1,4 +1,3 @@
====== Aliro malpermesita ======
Vi ne havas sufiĉajn rajtojn daŭrigi.
-
diff --git a/inc/lang/eo/diff.txt b/inc/lang/eo/diff.txt
index 3c9db61c8..86ec56ec5 100644
--- a/inc/lang/eo/diff.txt
+++ b/inc/lang/eo/diff.txt
@@ -1,4 +1,3 @@
====== Diferencoj ======
Tio montras diferencojn inter du versioj de la paĝo.
-
diff --git a/inc/lang/eo/index.txt b/inc/lang/eo/index.txt
index ac1f32cba..534e60827 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>namespaces|nomspacoj]].
+Tio ĉi estas indekso pri ĉiuj disponeblaj paĝoj ordigitaj laŭ [[doku>eo:namespaces|nomspacoj]].
diff --git a/inc/lang/eo/install.html b/inc/lang/eo/install.html
index 0fb94e4a9..b12a2ac71 100644
--- a/inc/lang/eo/install.html
+++ b/inc/lang/eo/install.html
@@ -1,9 +1,7 @@
-<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>
+<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/eo:installer">dokumentada paĝo</a>.</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>
-<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>
+<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>
-<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>
+<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 26d3dd234..d659a609c 100644
--- a/inc/lang/eo/lang.php
+++ b/inc/lang/eo/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Florian <florianmail55@gmail.com>
* @author Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>
* @author Antono Vasiljev <esperanto.minsk ĈE tut.by>
* @author Felipe Castro <fefcas@yahoo.com.br>
@@ -68,44 +69,7 @@ $lang['badpassconfirm'] = 'Pardonu, la pasvorto malĝustis';
$lang['minoredit'] = 'Etaj modifoj';
$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 kreiĝis kaj la pasvorto sendiĝis per retpoŝto.';
-$lang['regsuccess2'] = 'La uzanto kreiĝis.';
-$lang['regfail'] = 'Ne eblis krei uzanton.';
-$lang['regmailfail'] = 'Ŝajne okazis eraro dum elsendo de la pasvorto. Bonvolu informi administranton pri tio!';
-$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 permesata.';
-$lang['profchanged'] = 'La profilo de la uzanto sukcese aktualiĝis.';
-$lang['profnodelete'] = 'Tiu ĉi vikio ne subtenas forigo de uzantoj';
-$lang['profdeleteuser'] = 'Forigi aliĝon';
-$lang['profdeleted'] = 'Via uzant-aliĝo estis forigata de tiu ĉi vikio';
-$lang['profconfdelete'] = 'Mi deziras forigi mian aliĝon de tiu ĉi vikio. <br/> Tiu ĉi ago ne povos esti malfarata.';
-$lang['profconfdeletemissing'] = 'Konfirmilo ne estas markita';
-$lang['proffail'] = 'La uzantokonto ne estis aktualigita.';
-$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, 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 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ŝ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 je:';
+$lang['searchcreatepage'] = 'Se vi ne trovis kion vi serĉantis, vi povas krei aŭ redakti la paĝo %s, nomita laŭ via serĉo.';
$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?';
@@ -148,6 +112,55 @@ $lang['js']['media_done_btn'] = 'Finita';
$lang['js']['media_drop'] = 'Demetu ĉi-tien por alŝuti';
$lang['js']['media_cancel'] = 'forigi';
$lang['js']['media_overwrt'] = 'Anstataûi ekzistantajn dosierojn';
+$lang['search_exact_match'] = 'Ekzakta kongruo';
+$lang['search_starts_with'] = 'Komenciĝas per';
+$lang['search_ends_with'] = 'Finiĝas per';
+$lang['search_contains'] = 'Enhavas';
+$lang['search_any_ns'] = 'Ajn nomspaco';
+$lang['search_any_time'] = 'Ajn tempo';
+$lang['search_past_7_days'] = 'Pasinta semajno';
+$lang['search_past_month'] = 'Pasinta monato';
+$lang['search_past_year'] = 'Pasinta jaro';
+$lang['search_sort_by_hits'] = 'Ordigi per fururaĵoj';
+$lang['search_sort_by_mtime'] = 'Ordigi per laste modifita';
+$lang['regmissing'] = 'Pardonu, vi devas plenigi ĉiujn kampojn.';
+$lang['reguexists'] = 'Pardonu, ĉi tiu uzanto-nomo jam ekzistas.';
+$lang['regsuccess'] = 'La uzanto kreiĝis kaj la pasvorto sendiĝis per retpoŝto.';
+$lang['regsuccess2'] = 'La uzanto kreiĝis.';
+$lang['regfail'] = 'Ne eblis krei uzanton.';
+$lang['regmailfail'] = 'Ŝajne okazis eraro dum elsendo de la pasvorto. Bonvolu informi administranton pri tio!';
+$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 permesata.';
+$lang['profchanged'] = 'La profilo de la uzanto sukcese aktualiĝis.';
+$lang['profnodelete'] = 'Tiu ĉi vikio ne subtenas forigo de uzantoj';
+$lang['profdeleteuser'] = 'Forigi aliĝon';
+$lang['profdeleted'] = 'Via uzant-aliĝo estis forigata de tiu ĉi vikio';
+$lang['profconfdelete'] = 'Mi deziras forigi mian aliĝon de tiu ĉi vikio. <br/> Tiu ĉi ago ne povos esti malfarata.';
+$lang['profconfdeletemissing'] = 'Konfirmilo ne estas markita';
+$lang['proffail'] = 'La uzantokonto ne estis aktualigita.';
+$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, 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 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ŝ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 je:';
$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';
@@ -336,5 +349,7 @@ $lang['currentns'] = 'Aktuala nomspaco';
$lang['searchresult'] = 'Serĉrezulto';
$lang['plainhtml'] = 'Plena HTML';
$lang['wikimarkup'] = 'Vikiteksto';
+$lang['page_nonexist_rev'] = 'Paĝo ne ekzistis al %s. Ĝi do sekve estis kreita al <a href="%s">%s</a>.';
+$lang['unable_to_parse_date'] = 'Neebla sintakse analizi la parametro "%s".';
$lang['email_signature_text'] = 'Tiu ĉi mesaĝo kreiĝis de DokuWiki ĉe
@DOKUWIKIURL@';
diff --git a/inc/lang/eo/login.txt b/inc/lang/eo/login.txt
index 2b9b34340..7920dd474 100644
--- a/inc/lang/eo/login.txt
+++ b/inc/lang/eo/login.txt
@@ -1,3 +1,3 @@
====== Enirejo ======
-Vi ankoraŭ ne identiĝis! Entajpu necesajn informojn sube por identiĝi. Kuketoj (cookies) devas esti ŝaltitaj. \ No newline at end of file
+Vi ankoraŭ ne identiĝis! Entajpu necesajn informojn sube por identiĝi. Kuketoj (cookies) devas esti ŝaltitaj.
diff --git a/inc/lang/eo/newpage.txt b/inc/lang/eo/newpage.txt
index 53ab6209d..66f0a868f 100644
--- a/inc/lang/eo/newpage.txt
+++ b/inc/lang/eo/newpage.txt
@@ -1,4 +1,3 @@
====== Ĉi tiu paĝo ankoraŭ ne ekzistas ======
-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".
-
+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/preview.txt b/inc/lang/eo/preview.txt
index b3faef69e..f510f4dab 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 konserviĝis**!
+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 d6cde8dcb..3f198b0b0 100644
--- a/inc/lang/eo/pwconfirm.txt
+++ b/inc/lang/eo/pwconfirm.txt
@@ -1,7 +1,6 @@
Saluton, @FULLNAME@!
-Iu petis novan pasvorton por via @TITLE@
-ensalutnomo ĉe @DOKUWIKIURL@
+Iu petis novan pasvorton por via @TITLE@ ensalutnomo ĉe @DOKUWIKIURL@
Se ne vi petis tion, ignoru tiun ĉi mesaĝon.
diff --git a/inc/lang/eo/read.txt b/inc/lang/eo/read.txt
index b8c642f43..949004bba 100644
--- a/inc/lang/eo/read.txt
+++ b/inc/lang/eo/read.txt
@@ -1,2 +1 @@
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/register.txt b/inc/lang/eo/register.txt
index 10b303d3b..85e69c542 100644
--- a/inc/lang/eo/register.txt
+++ b/inc/lang/eo/register.txt
@@ -1,4 +1,3 @@
====== 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. [[doku>eo:pagename]]
diff --git a/inc/lang/eo/resetpwd.txt b/inc/lang/eo/resetpwd.txt
index 442a7ac4e..61fd06ce0 100644
--- a/inc/lang/eo/resetpwd.txt
+++ b/inc/lang/eo/resetpwd.txt
@@ -1,4 +1,3 @@
====== Difini novan pasvorton ======
-
-Bonvolu indiki novan pasvorton por via konto en tiu ĉi vikio. \ No newline at end of file
+Bonvolu indiki novan pasvorton por via konto en tiu ĉi vikio.
diff --git a/inc/lang/eo/revisions.txt b/inc/lang/eo/revisions.txt
index 4f37bb125..01a9c3f29 100644
--- a/inc/lang/eo/revisions.txt
+++ b/inc/lang/eo/revisions.txt
@@ -1,3 +1,3 @@
====== Malnovaj revizioj ======
-Sube estas listo de malnovaj revizioj de la dokumento. Elektu revizion se vi volas rigardi ĝin aŭ anstataŭigi kurantan paĝon per ĝi. \ No newline at end of file
+Sube estas listo de malnovaj revizioj de la dokumento. Elektu revizion se vi volas rigardi ĝin aŭ anstataŭigi kurantan paĝon per ĝi.
diff --git a/inc/lang/eo/searchpage.txt b/inc/lang/eo/searchpage.txt
index 20711c241..34618161c 100644
--- a/inc/lang/eo/searchpage.txt
+++ b/inc/lang/eo/searchpage.txt
@@ -1,4 +1,3 @@
====== Serĉo ======
Sube estas rezultoj de serĉo en la retejo. @CREATEPAGEINFO@
-
diff --git a/inc/lang/es/adminplugins.txt b/inc/lang/es/adminplugins.txt
index 8e1b0f813..9b85b1f23 100644
--- a/inc/lang/es/adminplugins.txt
+++ b/inc/lang/es/adminplugins.txt
@@ -1 +1 @@
-===== Plugins Adicionales ===== \ No newline at end of file
+===== Complementos adicionales ===== \ No newline at end of file
diff --git a/inc/lang/es/backlinks.txt b/inc/lang/es/backlinks.txt
index 4de93ef34..c72270b0c 100644
--- a/inc/lang/es/backlinks.txt
+++ b/inc/lang/es/backlinks.txt
@@ -1,4 +1,3 @@
====== Referencias ======
Esta es una lista de páginas que parecen hacer referencia a la página actual.
-
diff --git a/inc/lang/es/conflict.txt b/inc/lang/es/conflict.txt
index 265ac1ee6..4c22c0ab2 100644
--- a/inc/lang/es/conflict.txt
+++ b/inc/lang/es/conflict.txt
@@ -2,4 +2,4 @@
Existe una versión más reciente del documento que has editado. Esto sucede cuando otro usuario ha modificado el documento mientras lo estabas editando.
-Examina las diferencias mostradas abajo a fondo, y decide entonces cual conservar. Si eliges ''Guardar'', tu versión será guardada. Si eliges ''Cancelar'' se guardará la actual versión. \ No newline at end of file
+Examina las diferencias mostradas abajo a fondo, y decide entonces cual conservar. Si eliges ''Guardar'', tu versión será guardada. Si eliges ''Cancelar'' se guardará la actual versión.
diff --git a/inc/lang/es/denied.txt b/inc/lang/es/denied.txt
index 02a76a8cf..e8d8e034b 100644
--- a/inc/lang/es/denied.txt
+++ b/inc/lang/es/denied.txt
@@ -1,4 +1,3 @@
====== Permiso Denegado ======
Lo siento, no tienes suficientes permisos para continuar.
-
diff --git a/inc/lang/es/diff.txt b/inc/lang/es/diff.txt
index e0e9e08ab..ba94b2e42 100644
--- a/inc/lang/es/diff.txt
+++ b/inc/lang/es/diff.txt
@@ -1,4 +1,3 @@
====== Diferencias ======
Muestra las diferencias entre dos versiones de la página.
-
diff --git a/inc/lang/es/draft.txt b/inc/lang/es/draft.txt
index 054d618b3..f7c7fc15e 100644
--- a/inc/lang/es/draft.txt
+++ b/inc/lang/es/draft.txt
@@ -3,4 +3,3 @@
Su última sesión de edición en esta página no se completó correctamente. DokuWiki guardó automáticamente un borrador mientras usted trabajaba; puede utilizar el borrador para continuar editándolo. Abajo se ven los datos que fueron guardados en su última sesión.
Por favor decida si desea //recuperar// su sesión perdida, //eliminar// el borrador guardado automáticamente o //cancelar// el proceso de edición.
-
diff --git a/inc/lang/es/edit.txt b/inc/lang/es/edit.txt
index 4ed253bb3..f91c3fa4f 100644
--- a/inc/lang/es/edit.txt
+++ b/inc/lang/es/edit.txt
@@ -1,2 +1 @@
Edita la página y pulsa ''Guardar''. Vaya a [[wiki:syntax]] para ver la sintaxis del Wiki. Por favor edite la página solo si puedes **mejorarla**. Si quieres probar algo relacionado a la sintaxis, aprende a dar tus primeros pasos en el [[playground:playground]].
-
diff --git a/inc/lang/es/editrev.txt b/inc/lang/es/editrev.txt
index 4b587b7ce..6978ac7d4 100644
--- a/inc/lang/es/editrev.txt
+++ b/inc/lang/es/editrev.txt
@@ -1,2 +1,2 @@
**Has cargado una revisión vieja del documento!** Si la guardas crearás una versión nueva con estos datos.
----- \ No newline at end of file
+----
diff --git a/inc/lang/es/index.txt b/inc/lang/es/index.txt
index 148e5f406..6f5673aa6 100644
--- a/inc/lang/es/index.txt
+++ b/inc/lang/es/index.txt
@@ -1,4 +1,3 @@
====== Índice ======
-Este es un índice de todas las páginas disponibles ordenado por [[doku>namespaces|espacios de nombres]].
-
+Este es un índice de todas las páginas disponibles ordenado por [[doku>es:namespaces|espacios de nombres]].
diff --git a/inc/lang/es/install.html b/inc/lang/es/install.html
index 94680bbba..4381db109 100644
--- a/inc/lang/es/install.html
+++ b/inc/lang/es/install.html
@@ -1,14 +1,7 @@
-<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
-<a href="http://dokuwiki.org/installer">página de documentación</a>.
-</p>
+<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 <a href="http://dokuwiki.org/es: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 <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>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
-<a href="http://dokuwiki.org/install">instrucciones de instalación</a>
-y <a href="http://dokuwiki.org/config">configuración</a>.</p>
+<p>Usuarios experimentados o usuarios con requerimientos especiales deben usar estos enlaces para detalles concernientes a <a href="http://dokuwiki.org/es:install">instrucciones de instalación</a> y <a href="http://dokuwiki.org/es:config">configuración</a>.</p>
diff --git a/inc/lang/es/lang.php b/inc/lang/es/lang.php
index 41b6cf84a..95a1d644e 100644
--- a/inc/lang/es/lang.php
+++ b/inc/lang/es/lang.php
@@ -4,6 +4,9 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Domingo Redal <docxml@gmail.com>
+ * @author Liliana <lilianasaidon@gmail.com>
+ * @author Alex Cachinero <anarres@protonmail.com>
+ * @author WIRESLINKEA <wireslinkea@gmail.com>
* @author Zigor Astarbe <zigor@astarbe.com>
* @author Adrián Ariza <adrian_ariza.ciudad.com.ar>
* @author Gabiel Molina <gabriel191@gmail.com>
diff --git a/inc/lang/es/locked.txt b/inc/lang/es/locked.txt
index e151bf7e9..c1028ff21 100644
--- a/inc/lang/es/locked.txt
+++ b/inc/lang/es/locked.txt
@@ -1,3 +1,3 @@
====== Página bloqueada ======
-Esta página está actualmente bloqueada porque la está editando otro usuario. Tienes que esperar a que termine de editarla o el bloqueo expire. \ No newline at end of file
+Esta página está actualmente bloqueada porque la está editando otro usuario. Tienes que esperar a que termine de editarla o el bloqueo expire.
diff --git a/inc/lang/es/newpage.txt b/inc/lang/es/newpage.txt
index d119ca29d..98abee673 100644
--- a/inc/lang/es/newpage.txt
+++ b/inc/lang/es/newpage.txt
@@ -1,3 +1,3 @@
====== Este tema no existe todavía ======
-Has seguido un enlace a un tema que no existe todavía. Puedes crearlo usando el botón ''Crea esta página''.
+Has seguido un enlace a un tema que no existe todavía. Puedes crearlo usando el botón **Crea esta página**.
diff --git a/inc/lang/es/norev.txt b/inc/lang/es/norev.txt
index 42ee6b5c2..4bb764666 100644
--- a/inc/lang/es/norev.txt
+++ b/inc/lang/es/norev.txt
@@ -1,4 +1,3 @@
====== No existe esta revision ======
La revisión especificada no existe. Usa el botón ''Revisiones antiguas'' para una lista de revisiones antiguas de este documento.
-
diff --git a/inc/lang/es/onceexisted.txt b/inc/lang/es/onceexisted.txt
new file mode 100644
index 000000000..e4ac24a97
--- /dev/null
+++ b/inc/lang/es/onceexisted.txt
@@ -0,0 +1,3 @@
+====== Esta página ya no está disponible ======
+
+Has seguido un enlace a una página que ya no está disponible. Se puede averiguar el listado de [[?do=revisions|revisiones antiguas]] para comprobar cuando y por qué ha sido borrada, acceder a revisiones antiguas, o restaurarla. \ No newline at end of file
diff --git a/inc/lang/es/preview.txt b/inc/lang/es/preview.txt
index b4d5a2ed1..dead88851 100644
--- a/inc/lang/es/preview.txt
+++ b/inc/lang/es/preview.txt
@@ -1,4 +1,3 @@
====== Previsualización ======
-Esto es una previsualización de cómo aparecerá tu texto. Recuerda: **no está guardado** todavía!
-
+Esto es una previsualización de cómo aparecerá tu texto. **Recuerda: no está guardado todavía**!
diff --git a/inc/lang/es/pwconfirm.txt b/inc/lang/es/pwconfirm.txt
index b03d309ec..a99153c7b 100644
--- a/inc/lang/es/pwconfirm.txt
+++ b/inc/lang/es/pwconfirm.txt
@@ -1,11 +1,9 @@
Hola @FULLNAME@!
-Alguien solicitó una nueva contraseña para su nombre de
-usuario @TITLE@ en @DOKUWIKIURL@
+Alguien solicitó una nueva contraseña para su nombre de usuario @TITLE@ en @DOKUWIKIURL@
Si usted no solicitó una nueva contraseña, simplemente ignore este email.
-Para confirmar que la solicitud fue realizada realmente por usted,
-por favor use el siguiente enlace.
+Para confirmar que la solicitud fue realizada realmente por usted, por favor use el siguiente enlace.
@CONFIRM@
diff --git a/inc/lang/es/recent.txt b/inc/lang/es/recent.txt
index 432def26f..3e10cf4c5 100644
--- a/inc/lang/es/recent.txt
+++ b/inc/lang/es/recent.txt
@@ -1,5 +1,3 @@
====== Cambios Recientes ======
-Las siguientes páginas han sido modificadas recientemente.
-
-
+Las siguientes páginas han sido modificadas recientemente:
diff --git a/inc/lang/es/register.txt b/inc/lang/es/register.txt
index 98248269d..843f95bd1 100644
--- a/inc/lang/es/register.txt
+++ b/inc/lang/es/register.txt
@@ -1,3 +1,3 @@
====== Registro como nuevo usuario ======
-Completa toda la información del formulario para crear un nuevo usuario en este wiki. Asegúrate que escribes una **dirección de e-mail válida** puesto que allí se enviará tu contraseña. El nombre de usuario ha de ser un nombre válido según [[doku>pagename|pagename]].
+Completa toda la información del formulario para crear un nuevo usuario en este wiki. Asegúrate que escribes una **dirección de e-mail válida** puesto que allí se enviará tu contraseña. El nombre de usuario ha de ser un nombre válido según [[doku>es:pagename|pagename]].
diff --git a/inc/lang/es/resetpwd.txt b/inc/lang/es/resetpwd.txt
index 6fade9598..76e6b4a2c 100644
--- a/inc/lang/es/resetpwd.txt
+++ b/inc/lang/es/resetpwd.txt
@@ -1,3 +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
+Favor de introducir una nueva contraseña para su cuenta en este wiki.
diff --git a/inc/lang/es/revisions.txt b/inc/lang/es/revisions.txt
index b093e857f..2c44612de 100644
--- a/inc/lang/es/revisions.txt
+++ b/inc/lang/es/revisions.txt
@@ -1,4 +1,3 @@
====== Revisiones Antiguas ======
Estas son revisiones más antiguas del documento actual. Para volver a una revisión antigua selecciónala de abajo, pulsa ''Edita esta página'' y guárdala.
-
diff --git a/inc/lang/es/searchpage.txt b/inc/lang/es/searchpage.txt
index 9bc31616a..4d701097b 100644
--- a/inc/lang/es/searchpage.txt
+++ b/inc/lang/es/searchpage.txt
@@ -1,4 +1,3 @@
====== Búsqueda ======
Puedes encontrar los resultados de tu búsqueda abajo. @CREATEPAGEINFO@
-
diff --git a/inc/lang/es/stopwords.txt b/inc/lang/es/stopwords.txt
index 256908925..db095a72c 100644
--- a/inc/lang/es/stopwords.txt
+++ b/inc/lang/es/stopwords.txt
@@ -2,170 +2,171 @@
# Cuando se edita este archivo, asegúrese de usar la línea de terminaciones UNIX (una sola nueva línea)
# No necesita incluir palabras cortas con 3 caracteres - estas son ignoradas de todos modos
#Esta lista esta basada en las que encontramos en la siguiente url http://www.ranks.nl/stopwords/
-una
-unas
-unos
-uno
-sobre
-todo
-también
-tras
-otro
algún
-alguno
alguna
-algunos
algunas
-ser
-soy
+alguno
+algunos
+ambos
+ampleamos
+ante
+antes
+aquel
+aquellas
+aquellos
+aqui
+arriba
+atras
+bajo
+bastante
+bien
+cada
+cierta
+ciertas
+cierto
+ciertos
+como
+con
+conseguimos
+conseguir
+consigo
+consigue
+consiguen
+consigues
+cual
+cuando
+dentro
+desde
+donde
+dos
+ellas
+ellos
+empleais
+emplean
+emplear
+empleas
+empleo
+encima
+entonces
+entre
+era
+eramos
+eran
+eras
eres
-somos
-sois
-estoy
esta
-estamos
+estaba
+estado
estais
+estamos
estan
-como
-para
-atras
-porque
-por
-qué
-estado
-estaba
-ante
-antes
-siendo
-ambos
-pero
-poder
-puede
-puedo
-podemos
-podeis
-pueden
-fui
+estoy
+fin
fue
-fuimos
fueron
-hacer
-hago
+fui
+fuimos
+gueno
hace
-hacemos
haceis
+hacemos
hacen
-cada
-fin
+hacer
+haces
+hago
incluso
-primero
-desde
-conseguir
-consigo
-consigue
-consigues
-conseguimos
-consiguen
-voy
-va
-vamos
-vais
-van
-vaya
-gueno
-tener
-tengo
-tiene
-tenemos
-teneis
-tienen
+intenta
+intentais
+intentamos
+intentan
+intentar
+intentas
+intento
+largo
las
los
-aqui
+mientras
mio
-tuyo
-ellos
-ellas
+modo
+muchos
+muy
nos
nosotros
-vosotros
-vosotras
-dentro
-solo
-solamente
-saber
-sabes
+otro
+para
+pero
+podeis
+podemos
+poder
+podria
+podriais
+podriamos
+podrian
+podrias
+por
+porque
+primero
+puede
+pueden
+puedo
+qué
+quien
sabe
-sabemos
sabeis
+sabemos
saben
-ultimo
-largo
-bastante
-haces
-muchos
-aquellos
-aquellas
+saber
+sabes
+ser
+siendo
+sin
+sobre
+sois
+solamente
+solo
+somos
+soy
sus
-entonces
+también
+teneis
+tenemos
+tener
+tengo
tiempo
-verdad
-verdadero
-verdadera
-cierto
-ciertos
-cierta
-ciertas
-intentar
-intento
-intenta
-intentas
-intentamos
-intentais
-intentan
-dos
-bajo
-arriba
-encima
-usar
-uso
-usas
+tiene
+tienen
+todo
+trabaja
+trabajais
+trabajamos
+trabajan
+trabajar
+trabajas
+trabajo
+tras
+tuyo
+ultimo
+una
+unas
+uno
+unos
usa
-usamos
usais
+usamos
usan
-emplear
-empleo
-empleas
-emplean
-ampleamos
-empleais
+usar
+usas
+uso
+va
+vais
valor
-muy
-era
-eras
-eramos
-eran
-modo
-bien
-cual
-cuando
-donde
-mientras
-quien
-con
-entre
-sin
-trabajo
-trabajar
-trabajas
-trabaja
-trabajamos
-trabajais
-trabajan
-podria
-podrias
-podriamos
-podrian
-podriais
-aquel
+vamos
+van
+vaya
+verdad
+verdadera
+verdadero
+vosotras
+vosotros
+voy
+www
diff --git a/inc/lang/et/admin.txt b/inc/lang/et/admin.txt
index 1934f482b..93882cc52 100644
--- a/inc/lang/et/admin.txt
+++ b/inc/lang/et/admin.txt
@@ -1,4 +1,3 @@
====== Administreerimine ======
Alljärgnevalt leiate nimekirja administratiivsetest tegevustest, mida DokuWiki võimaldab.
-
diff --git a/inc/lang/et/backlinks.txt b/inc/lang/et/backlinks.txt
index 4b405cdfd..563556567 100644
--- a/inc/lang/et/backlinks.txt
+++ b/inc/lang/et/backlinks.txt
@@ -1,4 +1,3 @@
====== Siia lehele lingiga haagitud lehed ======
Nimekiri nendest lehtedest, kuskohalt Sa lingi abil siia lehele saad.
-
diff --git a/inc/lang/et/conflict.txt b/inc/lang/et/conflict.txt
index cf9f571ab..c0de3dc0f 100644
--- a/inc/lang/et/conflict.txt
+++ b/inc/lang/et/conflict.txt
@@ -3,4 +3,3 @@
Sellest dokumendist, mis Sa toimetasid on tegelikult juba olemas ka uuem versioon. Selline asi juhtub siis kui sel ajal kui Sina vaikselt oma dokumendi kallal nokitsesid tegi keegi juba kähku omad Muutused sealsamas dokumendis ära.
Vaata hoolikalt allpool näidatud erinevusi ja siis otsusta millise versiooni alles jätad. Kui Sa peaks valima ''salvesta'', siis juhtubki selline lugu, et Sinu versioon salvestatakse. kui Sa aga peaks klõpsama ''katkesta'' säilib hetkel kehtiv versioon.
-
diff --git a/inc/lang/et/denied.txt b/inc/lang/et/denied.txt
index 093ccf4a8..600f3be63 100644
--- a/inc/lang/et/denied.txt
+++ b/inc/lang/et/denied.txt
@@ -1,4 +1,3 @@
====== Sul pole ligipääsuluba ======
Kahju küll, aga sinu tublidusest ei piisa, et edasi liikuda.
-
diff --git a/inc/lang/et/diff.txt b/inc/lang/et/diff.txt
index d10a93b84..400fb95fc 100644
--- a/inc/lang/et/diff.txt
+++ b/inc/lang/et/diff.txt
@@ -1,4 +1,3 @@
====== Erinevused ======
Siin näed erinevusi valitud versiooni ja hetkel kehtiva lehekülje vahel.
-
diff --git a/inc/lang/et/draft.txt b/inc/lang/et/draft.txt
index 6669f3be5..18eb167ef 100644
--- a/inc/lang/et/draft.txt
+++ b/inc/lang/et/draft.txt
@@ -3,4 +3,3 @@
Sinu viimane toimetamissessioon ei lõppenud eelmine kord korrapäraselt. DokuWiki automaatselt salvestas Sinu pooliku töö, mida võid nüüd kasutada töö jätkamiseks. Allpool näed teksti, mis suudeti päästa.
Kas tahad //taastada// kaotused, //kustutada// poolik töö või //üldse mitte midagi teha//?
-
diff --git a/inc/lang/et/edit.txt b/inc/lang/et/edit.txt
index 6167c8552..f9d680109 100644
--- a/inc/lang/et/edit.txt
+++ b/inc/lang/et/edit.txt
@@ -1,2 +1 @@
Toimeta seda lehte ja klõpsa ''Salvesta'' peal. Wikis teksti kujundamise vahenditega tutvumiseks, st. kuidas teha rasvast ja kaldkirja jne., vaata [[wiki:syntax|süntaksitutvustus lehelt]]. Kui Sa tahad midagi testida, saad seda teha [[playground:playground|mängualal]].
-
diff --git a/inc/lang/et/editrev.txt b/inc/lang/et/editrev.txt
index 3ab6d7161..27ad5de6b 100644
--- a/inc/lang/et/editrev.txt
+++ b/inc/lang/et/editrev.txt
@@ -1,3 +1,2 @@
**Sa oled omale tõmmanud selle dokumendi vana versiooni!** Kui Sa selle salvestad sünnib nende andmetega uus versioon.
----
-
diff --git a/inc/lang/et/newpage.txt b/inc/lang/et/newpage.txt
index fb78e6434..e43936630 100644
--- a/inc/lang/et/newpage.txt
+++ b/inc/lang/et/newpage.txt
@@ -1,3 +1,3 @@
====== Seda teemat veel ei ole ======
-Sa klikkisid lingile, mille all teemat veel pole. Selle saad Sa tekitada kasutades ''Tekita see leht nuppu''.
+Sa klikkisid lingile, mille all teemat veel pole. Selle saad Sa tekitada kasutades **Tekita see leht nuppu**.
diff --git a/inc/lang/et/norev.txt b/inc/lang/et/norev.txt
index 42d204f2d..d126d23a6 100644
--- a/inc/lang/et/norev.txt
+++ b/inc/lang/et/norev.txt
@@ -1,4 +1,3 @@
====== Sellist versiooni pole ======
Sellist versiooni ei ole olemas. Selle dokumendi eelmiste versioonide nägemiseks klõpsa ''Eelmised versioonid'' nupul.
-
diff --git a/inc/lang/et/preview.txt b/inc/lang/et/preview.txt
index df45c65ae..a1699c1a4 100644
--- a/inc/lang/et/preview.txt
+++ b/inc/lang/et/preview.txt
@@ -1,3 +1,3 @@
====== Eelvaade ======
-Siin saad eelnevalt vaadata, milline su tekst välja näeks. Pea aga meeles, et see **ei ole veel salvestatud** !
+Siin saad eelnevalt vaadata, milline su tekst välja näeks. **Pea aga meeles, et see ei ole veel salvestatud**!
diff --git a/inc/lang/et/pwconfirm.txt b/inc/lang/et/pwconfirm.txt
index ee3b31334..1e7b65b81 100644
--- a/inc/lang/et/pwconfirm.txt
+++ b/inc/lang/et/pwconfirm.txt
@@ -3,6 +3,7 @@ Tere @FULLNAME@!
Keegi on Sinu parooli uuendust soovinud kasutajale @TITLE@ (@DOKUWIKIURL@).
Kui see ei olnud Sina, siis võid seda meili lihtsalt ignoreerida.
+
Kinnitamaks uue parooli saamise soovi mine aadressile:
@CONFIRM@
diff --git a/inc/lang/et/read.txt b/inc/lang/et/read.txt
index 64696f079..8ca369500 100644
--- a/inc/lang/et/read.txt
+++ b/inc/lang/et/read.txt
@@ -1,2 +1 @@
Seda lehte saad ainult lugeda. Saad küll vaadata lehe põhja aga muuta midagi ei saa. Suhtle oma serveri administraatoriga kui Sa millegagi rahul pole.
-
diff --git a/inc/lang/et/recent.txt b/inc/lang/et/recent.txt
index cf7a85420..41669869a 100644
--- a/inc/lang/et/recent.txt
+++ b/inc/lang/et/recent.txt
@@ -1,5 +1,3 @@
====== Viimased muutused ======
-Viimati muudeti alljärgnevaid lehti.
-
-
+Viimati muudeti alljärgnevaid lehti:
diff --git a/inc/lang/et/register.txt b/inc/lang/et/register.txt
index 9cd0b911d..ae9bf6a14 100644
--- a/inc/lang/et/register.txt
+++ b/inc/lang/et/register.txt
@@ -1,4 +1,3 @@
====== Registreeri uus kasutaja ======
Täida alljärgnevad lüngad et me saaks Sulle Wikis kasutajakonto tekitada. Ole nii kena ja kindlasti pane kirja oma **kehtiv e-posti aadress** - Sinu uus parool saadetakse sellele aadressile. Sisselogimise nimi peaks olema kehtiv [[doku>pagename|lehenimi]].
-
diff --git a/inc/lang/et/resendpwd.txt b/inc/lang/et/resendpwd.txt
index cd0ef8d10..c06e1c0c8 100644
--- a/inc/lang/et/resendpwd.txt
+++ b/inc/lang/et/resendpwd.txt
@@ -1,4 +1,3 @@
====== Saada uus parool ======
Palun sisesta oma kasutaja nimi, et saada uut parooli. Soovi kinnitamiseks saadame Sinu meilile lingi.
-
diff --git a/inc/lang/et/resetpwd.txt b/inc/lang/et/resetpwd.txt
index 3a802986f..81660a183 100644
--- a/inc/lang/et/resetpwd.txt
+++ b/inc/lang/et/resetpwd.txt
@@ -1,3 +1,3 @@
====== Sea uus salasõna ======
-Sisesta oma selle wiki kasutajale uus salasõna \ No newline at end of file
+Sisesta oma selle wiki kasutajale uus salasõna
diff --git a/inc/lang/et/revisions.txt b/inc/lang/et/revisions.txt
index c546a1f14..f8dc742f4 100644
--- a/inc/lang/et/revisions.txt
+++ b/inc/lang/et/revisions.txt
@@ -1,4 +1,3 @@
====== eelnevad versioonid ======
Need on käesoleva dokumendi eelnevad versioonid. Vana versiooni juurde tagasi pöördumiseks vali sobiv, klõpsa ''Toimeta seda lehte'' peal ja salvesta see.
-
diff --git a/inc/lang/et/searchpage.txt b/inc/lang/et/searchpage.txt
index 546ae0eea..5dbb48b52 100644
--- a/inc/lang/et/searchpage.txt
+++ b/inc/lang/et/searchpage.txt
@@ -1,4 +1,3 @@
====== Otsi ======
Leiad vasted oma otsingule. @CREATEPAGEINFO@
-
diff --git a/inc/lang/et/updateprofile.txt b/inc/lang/et/updateprofile.txt
index 35da12801..e02429d9b 100644
--- a/inc/lang/et/updateprofile.txt
+++ b/inc/lang/et/updateprofile.txt
@@ -1,5 +1,3 @@
====== Uuenda oma kasutaja infot ======
Täida ainult need väljad, mida tahad uuendada. Uuendada ei saa kasutajanime.
-
-
diff --git a/inc/lang/eu/backlinks.txt b/inc/lang/eu/backlinks.txt
index 8cbb7b6d2..76d5cd41e 100644
--- a/inc/lang/eu/backlinks.txt
+++ b/inc/lang/eu/backlinks.txt
@@ -1,3 +1,3 @@
====== Itzulera Estekak ======
-Orri honetara bueltan estekatzen dutela diruditen orrien lista bat da honakoa. \ No newline at end of file
+Orri honetara bueltan estekatzen dutela diruditen orrien lista bat da honakoa.
diff --git a/inc/lang/eu/conflict.txt b/inc/lang/eu/conflict.txt
index d7d0d337e..c9c614af4 100644
--- a/inc/lang/eu/conflict.txt
+++ b/inc/lang/eu/conflict.txt
@@ -2,4 +2,4 @@
Editatu duzun dokumentua baino bertsio berriago existitzen da. Editatzen ari zarela beste erabiltzaile batek dokumentua aldatzen duenean gertatzen da hau.
-Aztertu arretaz behean erakutsitako desberdintasunak eta erabaki zein bertsio mantendu. Zure aukera "Gorde" bada, zure bertsioa gordeko da. Uneko bertsioa mantentzeko "ezeztatu" sakatu. \ No newline at end of file
+Aztertu arretaz behean erakutsitako desberdintasunak eta erabaki zein bertsio mantendu. Zure aukera "Gorde" bada, zure bertsioa gordeko da. Uneko bertsioa mantentzeko "ezeztatu" sakatu.
diff --git a/inc/lang/eu/denied.txt b/inc/lang/eu/denied.txt
index 869c4c7d8..7ceddea6c 100644
--- a/inc/lang/eu/denied.txt
+++ b/inc/lang/eu/denied.txt
@@ -1,4 +1,3 @@
====== Ez duzu baimenik ======
Barkatu, ez duzu baimenik orri hau ikusteko.
-
diff --git a/inc/lang/eu/diff.txt b/inc/lang/eu/diff.txt
index 8d335ea2e..f79fa5fda 100644
--- a/inc/lang/eu/diff.txt
+++ b/inc/lang/eu/diff.txt
@@ -1,4 +1,3 @@
====== Aldaketak ======
Aukeratutako bertsioaren eta egungo bertsioaren arteko aldaketak aurkezten ditu.
-
diff --git a/inc/lang/eu/draft.txt b/inc/lang/eu/draft.txt
index 5d64b0b36..1e48e44c7 100644
--- a/inc/lang/eu/draft.txt
+++ b/inc/lang/eu/draft.txt
@@ -2,4 +2,4 @@
Zure azken edizio saioa orri honetan ez zen zuzen burutu. DokuWiki-k automatikoki zirriborro bat gorde zuen lanean ari zinen bitartean eta orain zure edizioa jarraitzeko erabili dezakezu. Behean ikusi dezakezu zure asken saioan gorde ziren datuak.
-Erabaki mesedez zure edizio saio galdua //berreskuratu// nahi duzun, automatikoki gordetako zirriborroa //ezabatu// nahi duzun edo edizio prozesua //ezeztatu// nahi duzun. \ No newline at end of file
+Erabaki mesedez zure edizio saio galdua //berreskuratu// nahi duzun, automatikoki gordetako zirriborroa //ezabatu// nahi duzun edo edizio prozesua //ezeztatu// nahi duzun.
diff --git a/inc/lang/eu/index.txt b/inc/lang/eu/index.txt
index 30f88498a..7b439a874 100644
--- a/inc/lang/eu/index.txt
+++ b/inc/lang/eu/index.txt
@@ -1,4 +1,3 @@
====== Aurkibidea ======
[[doku>namespaces|namespaces]] bitartez ordenatutako aurkibidea da hau.
-
diff --git a/inc/lang/eu/install.html b/inc/lang/eu/install.html
index ce2eeb364..bbbfb1fd9 100644
--- a/inc/lang/eu/install.html
+++ b/inc/lang/eu/install.html
@@ -2,8 +2,6 @@
<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
-<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>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
-<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
+<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>
diff --git a/inc/lang/eu/login.txt b/inc/lang/eu/login.txt
index ebb1607d9..73759993b 100644
--- a/inc/lang/eu/login.txt
+++ b/inc/lang/eu/login.txt
@@ -1,4 +1,3 @@
====== Login ======
Ez duzu sesiorik hasi! Sar ezazu zure erabiltzaile izena eta pasahitza. Gogoratu coockie-ak baimenduta izan behar dituzula.
-
diff --git a/inc/lang/eu/newpage.txt b/inc/lang/eu/newpage.txt
index cac872ce1..782c98004 100644
--- a/inc/lang/eu/newpage.txt
+++ b/inc/lang/eu/newpage.txt
@@ -1,3 +1,3 @@
====== Gai hau ez da existitzen oraindik ======
-Existitzen ez den gai batera doan lotura bat jarraitu duzu. Zuk zeuk sortu dezakezu ''Sortu orri hau'' erabiliz.
+Existitzen ez den gai batera doan lotura bat jarraitu duzu. Zuk zeuk sortu dezakezu **Sortu orri hau** erabiliz.
diff --git a/inc/lang/eu/preview.txt b/inc/lang/eu/preview.txt
index 1f0d14f5e..fbd5e1798 100644
--- a/inc/lang/eu/preview.txt
+++ b/inc/lang/eu/preview.txt
@@ -1,3 +1,3 @@
====== Aurreikuspena ======
-Hau zure testuaren aurrebista bat besterik ez da. Gogoratu: **ez da gorde** oraindik!
+Hau zure testuaren aurrebista bat besterik ez da. **Gogoratu: ez da gorde oraindik**!
diff --git a/inc/lang/eu/register.txt b/inc/lang/eu/register.txt
index 4a8a49bd7..3bfdc1ee8 100644
--- a/inc/lang/eu/register.txt
+++ b/inc/lang/eu/register.txt
@@ -1,3 +1,3 @@
====== Erregistratu erabiltzaile berri bezala ======
-Bete beheko informazio guztia wiki honetan kontu berri bat sortzeko. Ziurtatu **baliozko posta-e helbide** bat ematen duzula - ez bazaizu hemen eskatzen pasahitzik sartzeko, berri bat bidaliko zaizu helbide horretara. Saioa hasteko izenak baliozko [[doku>pagename|orri izena]] izan behar du. \ No newline at end of file
+Bete beheko informazio guztia wiki honetan kontu berri bat sortzeko. Ziurtatu **baliozko posta-e helbide** bat ematen duzula - ez bazaizu hemen eskatzen pasahitzik sartzeko, berri bat bidaliko zaizu helbide horretara. Saioa hasteko izenak baliozko [[doku>pagename|orri izena]] izan behar du.
diff --git a/inc/lang/eu/resendpwd.txt b/inc/lang/eu/resendpwd.txt
index 98f261cd8..2d59e8c09 100644
--- a/inc/lang/eu/resendpwd.txt
+++ b/inc/lang/eu/resendpwd.txt
@@ -1,3 +1,3 @@
====== Bidali pasahitz berria ======
-Mesedez, sartu zure erabiltzaile izena beheko formularioan zure wiki honetako kontuarentzat pasahitz berria eskatzeko. Baieztapen esteka bat bidaliko zaizu erregistratutako zure posta-e helbidera. \ No newline at end of file
+Mesedez, sartu zure erabiltzaile izena beheko formularioan zure wiki honetako kontuarentzat pasahitz berria eskatzeko. Baieztapen esteka bat bidaliko zaizu erregistratutako zure posta-e helbidera.
diff --git a/inc/lang/eu/resetpwd.txt b/inc/lang/eu/resetpwd.txt
index 9bb6e3ae8..70f43a71d 100644
--- a/inc/lang/eu/resetpwd.txt
+++ b/inc/lang/eu/resetpwd.txt
@@ -1,3 +1,3 @@
====== Pasahitza berria ezarri ======
-Mesedez wiki honetako zure pasahitza berria sartu. \ No newline at end of file
+Mesedez wiki honetako zure pasahitza berria sartu.
diff --git a/inc/lang/eu/searchpage.txt b/inc/lang/eu/searchpage.txt
index ebd31d0de..a4a0a2b47 100644
--- a/inc/lang/eu/searchpage.txt
+++ b/inc/lang/eu/searchpage.txt
@@ -1,4 +1,3 @@
====== Bilaketa ======
Emaitzak ondorengo aurkiketan bilatu ditzakezu. @CREATEPAGEINFO@
-
diff --git a/inc/lang/eu/stopwords.txt b/inc/lang/eu/stopwords.txt
index 1aeb868bc..3eb31030e 100644
--- a/inc/lang/eu/stopwords.txt
+++ b/inc/lang/eu/stopwords.txt
@@ -23,4 +23,4 @@ nor
nork
und
the
-www \ No newline at end of file
+www
diff --git a/inc/lang/eu/updateprofile.txt b/inc/lang/eu/updateprofile.txt
index 233bfecf1..588108c6d 100644
--- a/inc/lang/eu/updateprofile.txt
+++ b/inc/lang/eu/updateprofile.txt
@@ -1,3 +1,3 @@
====== Eguneratu zure kontuaren profila ======
-Aldatu nahi dituzun atalak bakarrik bete behar dituzu. Ezin duzu zure erabiltzaile izena aldatu. \ No newline at end of file
+Aldatu nahi dituzun atalak bakarrik bete behar dituzu. Ezin duzu zure erabiltzaile izena aldatu.
diff --git a/inc/lang/fa/admin.txt b/inc/lang/fa/admin.txt
index e445b3b93..6fcaf1ba9 100644
--- a/inc/lang/fa/admin.txt
+++ b/inc/lang/fa/admin.txt
@@ -1,3 +1,3 @@
====== مدیریت ======
-در اینجا فهرستی از وظیفه‌های مدیریتی موجود در داکو ویکی را مشاهده می‌کنید. \ No newline at end of file
+در اینجا فهرستی از وظیفه‌های مدیریتی موجود در داکو ویکی را مشاهده می‌کنید.
diff --git a/inc/lang/fa/adminplugins.txt b/inc/lang/fa/adminplugins.txt
index dab0251be..7b5e7f871 100644
--- a/inc/lang/fa/adminplugins.txt
+++ b/inc/lang/fa/adminplugins.txt
@@ -1 +1 @@
-===== برنامه‌های جانبی دیگر ===== \ No newline at end of file
+===== افزونه‌ها ===== \ No newline at end of file
diff --git a/inc/lang/fa/backlinks.txt b/inc/lang/fa/backlinks.txt
index 774d3d6cc..572fc3f0a 100644
--- a/inc/lang/fa/backlinks.txt
+++ b/inc/lang/fa/backlinks.txt
@@ -1,3 +1,3 @@
====== پیوندهای بازگشتی ======
-در این‌جا فهرستی از صفحاتی که به این صفحه پیوند داده‌اند را مشاهده می‌کنید. \ No newline at end of file
+در این‌جا فهرستی از برگه‌هایی که به این برگه پیوند داده‌اند را مشاهده می‌کنید.
diff --git a/inc/lang/fa/conflict.txt b/inc/lang/fa/conflict.txt
index 9de037024..27f51eb24 100644
--- a/inc/lang/fa/conflict.txt
+++ b/inc/lang/fa/conflict.txt
@@ -2,4 +2,4 @@
این نگارش جدید از مطلبی که ویرایش کرده‌اید وجود دارد. این اتفاق زمانی رخ می‌دهد که یک کاربر دیگر زمانی که شما ویرایش می‌کرده‌اید، ان را تغییر داده است.
-تفاوت‌های زیر را بررسی کنید، و تصمیم بگیرید که کدام نگارش حفظ شود. اگر دکمه‌ی «ذخیره» را بفشارید، نسخه‌ی شما ذخیره می‌شود و اگر دکمه‌ی «لغو» را بفشارید، نسخه‌ی کنونی حفظ خواهد شد. \ No newline at end of file
+تفاوت‌های زیر را بررسی کنید، و تصمیم بگیرید که کدام نگارش حفظ شود. اگر دکمه‌ی «ذخیره» را بفشارید، نسخه‌ی شما ذخیره می‌شود و اگر دکمه‌ی «لغو» را بفشارید، نسخه‌ی کنونی حفظ خواهد شد.
diff --git a/inc/lang/fa/denied.txt b/inc/lang/fa/denied.txt
index b3cb41cfa..cbb12f3d7 100644
--- a/inc/lang/fa/denied.txt
+++ b/inc/lang/fa/denied.txt
@@ -1,4 +1,3 @@
====== دسترسی ممکن نیست ======
-متاسفم، شما اجازهٔ دسترسی به این صفحه را ندارید.
-
+متأسفم، شما اجازهٔ دسترسی به این صفحه را ندارید.
diff --git a/inc/lang/fa/diff.txt b/inc/lang/fa/diff.txt
index 80e1ce7a1..d2b90f757 100644
--- a/inc/lang/fa/diff.txt
+++ b/inc/lang/fa/diff.txt
@@ -1,3 +1,3 @@
====== تفاوت‌ها ======
-تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده می‌کنید. \ No newline at end of file
+تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده می‌کنید.
diff --git a/inc/lang/fa/draft.txt b/inc/lang/fa/draft.txt
index 6ad11219f..5653da01d 100644
--- a/inc/lang/fa/draft.txt
+++ b/inc/lang/fa/draft.txt
@@ -2,4 +2,4 @@
آخرین سشن ویرایش شما با موفقیت به پایان نرسیده. دوکوویکی به طور خودکار چرک‌نویسی از صفحه‌ی شما ذخیره می‌کند که شما می‌توانید آن را کامل کنید. در زیر مقادیر موجود در چرک‌نویس را مشاهده می‌کنید.
-خواهشمندیم تصمیم بگیرید که می‌خواهید چرک‌نویس را //بازیابی//، یا آن را //حذف// کنید و یا ویرایش را //لغو// نمایید. \ No newline at end of file
+خواهشمندیم تصمیم بگیرید که می‌خواهید چرک‌نویس را //بازیابی//، یا آن را //حذف// کنید و یا ویرایش را //لغو// نمایید.
diff --git a/inc/lang/fa/edit.txt b/inc/lang/fa/edit.txt
index 7c3873af4..5e7b244ca 100644
--- a/inc/lang/fa/edit.txt
+++ b/inc/lang/fa/edit.txt
@@ -1 +1 @@
-این صفحه را ویرایش کنید و کلید «ذخیره» را فشار دهید. صفحه [[wiki:syntax|قوانین نگارشی]] را برای روش نگارش ویکی مشاهده کنید. خواهشمندیم فقط در صورتی این صفحه را ویرایش کنید که توانایی **بهبود بخشیدن** به آن را دارید. اگر تصمیم دارید چیزی را تست کنید یا اولین قدم‌های‌تان را در نگارش ویکی بردارید، به [[playground:playground|زمین بازی]] بروید. \ No newline at end of file
+این صفحه را ویرایش کنید و کلید «ذخیره» را فشار دهید. صفحه [[wiki:syntax|قوانین نگارشی]] را برای روش نگارش ویکی مشاهده کنید. خواهشمندیم فقط در صورتی این صفحه را ویرایش کنید که توانایی **بهبود بخشیدن** به آن را دارید. اگر تصمیم دارید چیزی را تست کنید یا اولین قدم‌های‌تان را در نگارش ویکی بردارید، به [[playground:playground|زمین بازی]] بروید.
diff --git a/inc/lang/fa/editrev.txt b/inc/lang/fa/editrev.txt
index eae539414..fa9a0bfd7 100644
--- a/inc/lang/fa/editrev.txt
+++ b/inc/lang/fa/editrev.txt
@@ -1,2 +1,2 @@
-**شما یک نگارش قدیمی را مشاهده می‌کنید!** اگر این نگارش را ذخیره کنید، شما یک نگارش جدید ایجاد کرده‌اید!
----- \ No newline at end of file
+**شما یک نگارش قدیمی را مشاهده می‌کنید!** اگر این نگارش را ذخیره کنید، شما یک نگارش جدید با این محتویات ایجاد کرده‌اید!
+----
diff --git a/inc/lang/fa/index.txt b/inc/lang/fa/index.txt
index 993c8d164..5b5aa7d35 100644
--- a/inc/lang/fa/index.txt
+++ b/inc/lang/fa/index.txt
@@ -1,3 +1,3 @@
====== نقشه‌ی سایت ======
-این صفحه حاوی فهرست تمامی صفحات موجود به ترتیب [[doku>namespaces|فضای‌نام‌ها]] است. \ No newline at end of file
+این صفحه حاوی فهرست تمامی صفحات موجود به ترتیب [[doku>namespaces|فضای‌نام‌ها]] است.
diff --git a/inc/lang/fa/install.html b/inc/lang/fa/install.html
index 7960f9cc8..0ce8a5dc2 100644
--- a/inc/lang/fa/install.html
+++ b/inc/lang/fa/install.html
@@ -1,12 +1,7 @@
-<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 و یا از طریق کنترل پنل خدمات میزبانی‌تون انجام شود. </p>
+<p>DokuWiki از فایل‌های معمولی برای ذخیره‌ی صفحات ویکی و اطلاعات مربوط به آن‌ها استفاده می‌کند (مثل تصاویر، فهرست‌های جستجو، نگارش‌های پیشین و غیره). برای نصب موفقیت آمیز DokuWiki <strong>باید</strong> دسترسی نوشتن برای شاخه‌های این فایل‌ها داشته باشید. این کار باید توسط دستورات خط فرمان و یا دسترسی FTP و یا از طریق کنترل پنل خدمات میزبانی‌تون انجام شود. </p>
-<p>این برنامه دسترسی‌های DokuWiki را برای شما تنظیم خواهد کرد،
-به این معنی که مدیر سیستم می‌تواند به صفحه‌ی مدیران وارد شود، افزونه نصب کنید، کاربران را مدیریت کند، دسترسی به صفحات ویکی را مدیریت کند و یا تنظیمات را تغییر دهد.</p>
+<p>این برنامه دسترسی‌های DokuWiki را برای شما تنظیم خواهد کرد، به این معنی که مدیر سیستم می‌تواند به صفحه‌ی مدیران وارد شود، افزونه نصب کنید، کاربران را مدیریت کند، دسترسی به صفحات ویکی را مدیریت کند و یا تنظیمات را تغییر دهد.</p>
-<p>برای اطلاعات بیشتر در مورد نصب می‌توانید از این پیوند‌ها استفاده کنید
-<a href="http://dokuwiki.org/install">روش نصب</a>
-و <a href="http://dokuwiki.org/config">تنظیمات پیکربندی</a>.</p> \ No newline at end of file
+<p>برای اطلاعات بیشتر در مورد نصب می‌توانید از این پیوند‌ها استفاده کنید <a href="http://dokuwiki.org/install">روش نصب</a> و <a href="http://dokuwiki.org/config">تنظیمات پیکربندی</a>.</p>
diff --git a/inc/lang/fa/lang.php b/inc/lang/fa/lang.php
index d1e16e7fd..8e432ab06 100644
--- a/inc/lang/fa/lang.php
+++ b/inc/lang/fa/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author علیرضا ایوز <info@alirezaivaz.ir>
+ * @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
* @author behrad eslamifar <behrad_es@yahoo.com)
* @author Mohsen Firoozmandan <info@mambolearn.com>
* @author Omid Mottaghi <omidmr@gmail.com>
@@ -16,7 +18,6 @@
* @author Mohammad Sadegh <msdn2013@gmail.com>
* @author Omid Hezaveh <hezpublic@gmail.com>
* @author Mohmmad Razavi <sepent@gmail.com>
- * @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
* @author sam01 <m.sajad079@gmail.com>
*/
$lang['encoding'] = 'utf-8';
@@ -38,16 +39,16 @@ $lang['btn_newer'] = 'نتایج بیشتر »';
$lang['btn_older'] = '« نتایج کمتر';
$lang['btn_revs'] = 'نگارش‌های پیشین';
$lang['btn_recent'] = 'تغییرات اخیر';
-$lang['btn_upload'] = 'ارسال';
+$lang['btn_upload'] = 'بارگذاری';
$lang['btn_cancel'] = 'لغو';
$lang['btn_index'] = 'فهرست';
$lang['btn_secedit'] = 'ویرایش';
-$lang['btn_login'] = 'ورود به سیستم';
-$lang['btn_logout'] = 'خروج از سیستم';
+$lang['btn_login'] = 'ورود به سامانه';
+$lang['btn_logout'] = 'خروج از سامانه';
$lang['btn_admin'] = 'مدیر';
$lang['btn_update'] = 'به‌روزرسانی';
$lang['btn_delete'] = 'حذف';
-$lang['btn_back'] = 'عقب';
+$lang['btn_back'] = 'برگشت';
$lang['btn_backlink'] = 'پیوندهای به این صفحه';
$lang['btn_subscribe'] = 'عضویت در تغییرات صفحه';
$lang['btn_profile'] = 'به‌روزرسانی پروفایل';
@@ -57,7 +58,7 @@ $lang['btn_draft'] = 'ویرایش پیش‌نویس';
$lang['btn_recover'] = 'بازیابی پیش‌نویس';
$lang['btn_draftdel'] = 'حذف پیش‌نویس';
$lang['btn_revert'] = 'بازیابی';
-$lang['btn_register'] = 'ثبت نام';
+$lang['btn_register'] = 'نام‌نویسی';
$lang['btn_apply'] = 'اعمال';
$lang['btn_media'] = 'مدیریت رسانه‌ها';
$lang['btn_deleteuser'] = 'حساب کاربری مرا حذف کن';
@@ -71,51 +72,16 @@ $lang['oldpass'] = 'گذرواژه‌ی فعلی را تایید
$lang['passchk'] = 'یک بار دیگر';
$lang['remember'] = 'مرا به خاطر بسپار';
$lang['fullname'] = 'نام واقعی شما';
-$lang['email'] = 'ایمیل';
+$lang['email'] = 'رایانامه';
$lang['profile'] = 'پروفایل کاربر';
$lang['badlogin'] = 'متاسفم، نام کاربری یا رمز عبور اشتباه است.';
$lang['badpassconfirm'] = 'متاسفم، رمز عبور اشتباه است';
$lang['minoredit'] = 'ویرایش‌های خُرد';
$lang['draftdate'] = 'ذخیره خودکار پیش‌نویس در';
$lang['nosecedit'] = 'این صفحه در این میان تغییر کرده است، اطلاعات بخش قدیمی شده است، در عوض محتوای کل نمایش داده می‌شود.';
-$lang['regmissing'] = 'متاسفم، شما باید همه قسمت‌ها را پر کنید.';
-$lang['reguexists'] = 'نام کاربری‌ای که وارد کردید قبلن استفاده شده است.';
-$lang['regsuccess'] = 'کاربر ساخته شد و گذرواژه به صورت ایمیل ارسال گردید.';
-$lang['regsuccess2'] = 'حساب ایجاد شد.';
-$lang['regfail'] = 'ایجاد کاربر ممکن نیست.';
-$lang['regmailfail'] = 'مشکلی در ارسال ایمیل رمز عبور پیش آمده است، با مدیر تماس بگیرید!';
-$lang['regbadmail'] = 'نشانی واردشدهٔ ایمیل قابل‌قبول نیست، چرا که دارای ساختار نامعتبری است. اگر فکر می‌کنید این یک ایراد سایت است با مدیر تماس بگیرید';
-$lang['regbadpass'] = 'گذرواژه‌هایی که وارد کردید یکسان نیستند، لطفاً یکبار دیگر تلاش کنید.';
-$lang['regpwmail'] = 'گذرواژه‌ی DokuWiki شما';
-$lang['reghere'] = 'شما هنوز حسابی در اینجا ندارید؟ یکی ایجاد کنید';
-$lang['profna'] = 'این ویکی اجازه ویرایش پروفایل را نمی‌دهد';
-$lang['profnochange'] = 'تغییری صورت نگرفت.';
-$lang['profnoempty'] = 'نام و آدرس ایمیل باید پر شود.';
-$lang['profchanged'] = 'پروفایل کاربر با موفقیت به روز شد.';
-$lang['profnodelete'] = 'این ویکی از حذف کاربران پشتیبانی نمی‌کند';
-$lang['profdeleteuser'] = 'حذف حساب کاربری';
-$lang['profdeleted'] = 'حساب کاربری شما از این ویکی حذف گردیده است';
-$lang['profconfdelete'] = 'می‌خواهم حساب کاربری من از این ویکی حذف شود. <br/> این عمل قابل برگشت نیست.';
-$lang['profconfdeletemissing'] = 'جعبهٔ تأیید تیک نخورده است';
-$lang['proffail'] = 'بروزرسانی پروفایل کاربری انجام نشد.';
-$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['maxuploadsize'] = 'حداکثر %s برای هر فایل مجاز است.';
-$lang['lockedby'] = 'در حال حاضر قفل شده است:';
-$lang['lockexpire'] = 'قفل منقضی می‌شود در:';
+$lang['searchcreatepage'] = 'اگر آن چیزی که می‌خواهید را پیدا نکردید، می‌توانید صفحهٔ %s را که هم‌نام درخواست شماست بسازید یا ویرایش کنید.';
+$lang['search_fullresults'] = 'متن کامل نتایج';
+$lang['js']['search_toggle_tools'] = 'فعال یا عدم فعال‌سازی ابزارهای جستجو';
$lang['js']['willexpire'] = 'حالت قفل شما مدتی است منقضی شده است \n برای جلوگیری از تداخل دکمه‌ی پیش‌نمایش را برای صفر شدن ساعت قفل بزنید.';
$lang['js']['notsavedyet'] = 'تغییرات ذخیره نشده از بین خواهد رفت.';
$lang['js']['searchmedia'] = 'جستجو برای فایل‌ها';
@@ -127,7 +93,7 @@ $lang['js']['mediaalign'] = 'هم‌ترازی';
$lang['js']['mediasize'] = 'اندازه تصویر';
$lang['js']['mediatarget'] = 'هدف پیوند';
$lang['js']['mediaclose'] = 'بستن';
-$lang['js']['mediainsert'] = 'درج کردن';
+$lang['js']['mediainsert'] = 'درج‌کردن';
$lang['js']['mediadisplayimg'] = 'نمایش تصویر.';
$lang['js']['mediadisplaylnk'] = 'فقط پیوند را نمایش بده.';
$lang['js']['mediasmall'] = 'نگارش کوچک';
@@ -152,12 +118,62 @@ $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_select'] = 'انتخاب پرونده‌ها...';
+$lang['js']['media_upload_btn'] = 'بارگذاری';
$lang['js']['media_done_btn'] = 'انجام شد';
$lang['js']['media_drop'] = 'فایل‌ها را در اینجا قرار دهید تا آپلود شود';
$lang['js']['media_cancel'] = 'حذف';
$lang['js']['media_overwrt'] = 'جاینوشت فایل‌های موجود';
+$lang['search_exact_match'] = 'دقیقا برابر';
+$lang['search_starts_with'] = 'شروع بشود با';
+$lang['search_ends_with'] = 'پایان یابد با';
+$lang['search_contains'] = 'شامل';
+$lang['search_custom_match'] = 'دلخواه';
+$lang['search_any_ns'] = 'هر فضای نام';
+$lang['search_any_time'] = 'هر زمان';
+$lang['search_past_7_days'] = 'هفتهٔ قبل';
+$lang['search_past_month'] = 'ماه قبل';
+$lang['search_past_year'] = 'سال قبل';
+$lang['search_sort_by_hits'] = 'مرتب کردن برحسب تعداد بازدید';
+$lang['search_sort_by_mtime'] = 'مرتب کردن برحسب آخرین ویرایش';
+$lang['regmissing'] = 'متاسفم، شما باید همه قسمت‌ها را پر کنید.';
+$lang['reguexists'] = 'نام کاربری‌ای که وارد کردید قبلن استفاده شده است.';
+$lang['regsuccess'] = 'کاربر ساخته شد و گذرواژه به صورت ایمیل ارسال گردید.';
+$lang['regsuccess2'] = 'حساب ایجاد شد.';
+$lang['regfail'] = 'ایجاد کاربر ممکن نیست.';
+$lang['regmailfail'] = 'مشکلی در ارسال ایمیل رمز عبور پیش آمده است، با مدیر تماس بگیرید!';
+$lang['regbadmail'] = 'نشانی واردشدهٔ ایمیل قابل‌قبول نیست، چرا که دارای ساختار نامعتبری است. اگر فکر می‌کنید این یک ایراد سایت است با مدیر تماس بگیرید';
+$lang['regbadpass'] = 'گذرواژه‌هایی که وارد کردید یکسان نیستند، لطفاً یکبار دیگر تلاش کنید.';
+$lang['regpwmail'] = 'گذرواژه‌ی DokuWiki شما';
+$lang['reghere'] = 'شما هنوز حسابی در اینجا ندارید؟ یکی ایجاد کنید';
+$lang['profna'] = 'این ویکی اجازه ویرایش پروفایل را نمی‌دهد';
+$lang['profnochange'] = 'تغییری صورت نگرفت.';
+$lang['profnoempty'] = 'نام و آدرس ایمیل باید پر شود.';
+$lang['profchanged'] = 'پروفایل کاربر با موفقیت به روز شد.';
+$lang['profnodelete'] = 'این ویکی از حذف کاربران پشتیبانی نمی‌کند';
+$lang['profdeleteuser'] = 'حذف حساب کاربری';
+$lang['profdeleted'] = 'حساب کاربری شما از این ویکی حذف گردیده است';
+$lang['profconfdelete'] = 'می‌خواهم حساب کاربری من از این ویکی حذف شود. <br/> این عمل قابل برگشت نیست.';
+$lang['profconfdeletemissing'] = 'جعبهٔ تأیید تیک نخورده است';
+$lang['proffail'] = 'بروزرسانی پروفایل کاربری انجام نشد.';
+$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['maxuploadsize'] = 'حداکثر %s برای هر فایل مجاز است.';
+$lang['lockedby'] = 'در حال حاضر قفل شده است:';
+$lang['lockexpire'] = 'قفل منقضی می‌شود در:';
$lang['rssfailed'] = 'بروز خطا در هنگام واکشی این فید:';
$lang['nothingfound'] = 'چیزی پیدا نشد.';
$lang['mediaselect'] = 'فایل‌ها';
diff --git a/inc/lang/fa/locked.txt b/inc/lang/fa/locked.txt
index 2c0ca88e9..a2ebc7c7f 100644
--- a/inc/lang/fa/locked.txt
+++ b/inc/lang/fa/locked.txt
@@ -1,3 +1,3 @@
====== قفل شده است ======
-این صفحه توسط یک کاربر دیگر، برای ویرایش، قفل شده است. شما باید تا پایان ویرایش این کاربر یا منقضی شدن قفل صبر کنید. \ No newline at end of file
+این صفحه توسط یک کاربر دیگر، برای ویرایش، قفل شده است. شما باید تا پایان ویرایش این کاربر یا منقضی شدن قفل صبر کنید.
diff --git a/inc/lang/fa/login.txt b/inc/lang/fa/login.txt
index 0b1b3f9fc..9eff85a42 100644
--- a/inc/lang/fa/login.txt
+++ b/inc/lang/fa/login.txt
@@ -1,3 +1,3 @@
====== ورود ======
-شما وارد سایت نشده‌اید! موارد زیر را تایپ کنید تا وارد شوید. برای ورود، نیاز دارید که کوکی‌های مرورگر فعال باشد. \ No newline at end of file
+شما وارد سایت نشده‌اید! موارد زیر را تایپ کنید تا وارد شوید. برای ورود، نیاز دارید که کوکی‌های مرورگر فعال باشد.
diff --git a/inc/lang/fa/newpage.txt b/inc/lang/fa/newpage.txt
index 06377a94a..6af3c77f1 100644
--- a/inc/lang/fa/newpage.txt
+++ b/inc/lang/fa/newpage.txt
@@ -1,3 +1,3 @@
====== این صفحه وجود ندارد ======
-شما به این صفحه که وجود ندارد رسیده‌اید. اگر دسترسی‌ها به شما اجازه می‌دهند، می‌توانید این صفحه را با کلیلک کردن روی دکمه‌ی «ساخت این صفحه» ایجاد کنید. \ No newline at end of file
+شما به این صفحه که وجود ندارد رسیده‌اید. اگر دسترسی‌ها به شما اجازه می‌دهند، می‌توانید این صفحه را با کلیلک کردن روی دکمه‌ی «ساخت این صفحه» ایجاد کنید.
diff --git a/inc/lang/fa/norev.txt b/inc/lang/fa/norev.txt
index 186e374ad..9ca400ac1 100644
--- a/inc/lang/fa/norev.txt
+++ b/inc/lang/fa/norev.txt
@@ -1,3 +1,3 @@
====== نگارشی یافت نشد ======
-نگارش مورد نظر یافت نشد. از دکمه‌ی «نگارش‌های پیشین» برای مشاهده‌ی نگارش‌های پیشین این صفحه استفاده کنید. \ No newline at end of file
+نگارش مورد نظر یافت نشد. از دکمه‌ی «نگارش‌های پیشین» برای مشاهده‌ی نگارش‌های پیشین این صفحه استفاده کنید.
diff --git a/inc/lang/fa/preview.txt b/inc/lang/fa/preview.txt
index 727aa7089..bc656b9b9 100644
--- a/inc/lang/fa/preview.txt
+++ b/inc/lang/fa/preview.txt
@@ -1,3 +1,3 @@
====== پیش‌نمایش ======
-این پیش‌نمایش متن شماست. به یاد داشته باشید که این متن هنوز **ذخیره نشده‌است**! \ No newline at end of file
+این پیش‌نمایش متن شماست. به یاد داشته باشید که این متن هنوز **ذخیره نشده‌است**!
diff --git a/inc/lang/fa/read.txt b/inc/lang/fa/read.txt
index 1acfdb466..6d7cb66ee 100644
--- a/inc/lang/fa/read.txt
+++ b/inc/lang/fa/read.txt
@@ -1 +1 @@
-این صفحه فقط خواندنی است. شما می‌توانید متن صفحه را مشاهده کنید، اما نمی‌توانید آن را تغییر دهید. اگر فکر می‌کنید که مشکلی رخ داده است، مدیر ویکی را در جریان بگذارید. \ No newline at end of file
+این صفحه فقط خواندنی است. شما می‌توانید متن صفحه را مشاهده کنید، اما نمی‌توانید آن را تغییر دهید. اگر فکر می‌کنید که مشکلی رخ داده است، مدیر ویکی را در جریان بگذارید.
diff --git a/inc/lang/fa/recent.txt b/inc/lang/fa/recent.txt
index a3d0c558e..e2e9005cb 100644
--- a/inc/lang/fa/recent.txt
+++ b/inc/lang/fa/recent.txt
@@ -1,3 +1,3 @@
====== تغییرات اخیر ======
-این صفحه‌ها به تازگی تغییر کرده‌اند. \ No newline at end of file
+این صفحه‌ها به تازگی تغییر کرده‌اند:
diff --git a/inc/lang/fa/register.txt b/inc/lang/fa/register.txt
index c6e1f0d4a..2412478f2 100644
--- a/inc/lang/fa/register.txt
+++ b/inc/lang/fa/register.txt
@@ -1,3 +1,3 @@
====== ثبت نام ======
-تمامی فیلدها را پر کنید و اطمینان پیدا کنید که ایمیل معتبر وارد کرده‌اید - اگر شما گذرواژه‌ای وارد نکردید، یک مقدار جدید برای‌تان ارسال خواهد شد. نام کاربری شما باید یک [[doku>pagename|صفحه‌ی]] معتبر باشد. \ No newline at end of file
+تمامی فیلدها را پر کنید و اطمینان پیدا کنید که ایمیل معتبر وارد کرده‌اید - اگر شما گذرواژه‌ای وارد نکردید، یک مقدار جدید برای‌تان ارسال خواهد شد. نام کاربری شما باید یک [[doku>pagename|صفحه‌ی]] معتبر باشد.
diff --git a/inc/lang/fa/resendpwd.txt b/inc/lang/fa/resendpwd.txt
index 75ace99d1..991c4fb81 100644
--- a/inc/lang/fa/resendpwd.txt
+++ b/inc/lang/fa/resendpwd.txt
@@ -1,3 +1,3 @@
====== ارسال گذرواژه‌ی جدید ======
-خواهش‌مندیم نام کاربری خود را در فرم زیر بنویسید تا گذرواژه‌ی جدید برای‌تان ارسال شود. یک پیوند تاییدیه برای ایمیل ثبت شده ارسال می‌شود. \ No newline at end of file
+خواهش‌مندیم نام کاربری خود را در فرم زیر بنویسید تا گذرواژه‌ی جدید برای‌تان ارسال شود. یک پیوند تاییدیه برای ایمیل ثبت شده ارسال می‌شود.
diff --git a/inc/lang/fa/resetpwd.txt b/inc/lang/fa/resetpwd.txt
index 6a1355eba..e44219227 100644
--- a/inc/lang/fa/resetpwd.txt
+++ b/inc/lang/fa/resetpwd.txt
@@ -1,3 +1,3 @@
====== تعیین کلمه عبور جدید ======
-لطفاً یک کلمه عبور جدید برای حساب کاربری خود در این ویکی ایجاد کنید. \ No newline at end of file
+لطفاً یک کلمه عبور جدید برای حساب کاربری خود در این ویکی ایجاد کنید.
diff --git a/inc/lang/fa/revisions.txt b/inc/lang/fa/revisions.txt
index 7714ae674..5eb1f03ac 100644
--- a/inc/lang/fa/revisions.txt
+++ b/inc/lang/fa/revisions.txt
@@ -1,3 +1,3 @@
====== نگارش‌های پیشین ======
-در اینجا نگارش‌های پیشین این صفحه را مشاهده می‌کنید. برای بازگشتن به آن‌ها، آن را انتخاب کنید و کلید «ویرایش این صفحه» را انتخاب کنید و سپس ذخیره نمایید. \ No newline at end of file
+در اینجا نگارش‌های پیشین این صفحه را مشاهده می‌کنید. برای بازگشتن به آن‌ها، آن را انتخاب کنید و کلید «ویرایش این صفحه» را انتخاب کنید و سپس ذخیره نمایید.
diff --git a/inc/lang/fa/searchpage.txt b/inc/lang/fa/searchpage.txt
index 50d872e05..fad8c90a5 100644
--- a/inc/lang/fa/searchpage.txt
+++ b/inc/lang/fa/searchpage.txt
@@ -1,4 +1,3 @@
====== جستجو ======
نتایج جستجو در زیر آمده است. @CREATEPAGEINFO@
-
diff --git a/inc/lang/fa/showrev.txt b/inc/lang/fa/showrev.txt
index 2117ee63c..b878a2287 100644
--- a/inc/lang/fa/showrev.txt
+++ b/inc/lang/fa/showrev.txt
@@ -1,2 +1,2 @@
**این یک نگارش قدیمی از این مطلب است!**
----- \ No newline at end of file
+----
diff --git a/inc/lang/fa/stopwords.txt b/inc/lang/fa/stopwords.txt
index 58d3ca0f3..f4c0d8d9a 100644
--- a/inc/lang/fa/stopwords.txt
+++ b/inc/lang/fa/stopwords.txt
@@ -442,4 +442,5 @@ www
شه
روز
کنی
-اصلا \ No newline at end of file
+اصلا
+www
diff --git a/inc/lang/fa/updateprofile.txt b/inc/lang/fa/updateprofile.txt
index d79083306..8606898db 100644
--- a/inc/lang/fa/updateprofile.txt
+++ b/inc/lang/fa/updateprofile.txt
@@ -1,3 +1,3 @@
====== به روز رسانی پروفایل ======
-شما می‌توانید مقادیر زیر را تغییر دهید. \ No newline at end of file
+شما می‌توانید مقادیر زیر را تغییر دهید.
diff --git a/inc/lang/fi/backlinks.txt b/inc/lang/fi/backlinks.txt
index 457720241..b84e465a7 100644
--- a/inc/lang/fi/backlinks.txt
+++ b/inc/lang/fi/backlinks.txt
@@ -1,4 +1,3 @@
====== Linkitykset ======
Tässä lista tälle sivuille linkittävistä sivuista.
-
diff --git a/inc/lang/fi/denied.txt b/inc/lang/fi/denied.txt
index 89ebd4830..f6427159f 100644
--- a/inc/lang/fi/denied.txt
+++ b/inc/lang/fi/denied.txt
@@ -1,4 +1,3 @@
====== Lupa evätty ======
Sinulla ei ole tarpeeksi valtuuksia jatkaa.
-
diff --git a/inc/lang/fi/draft.txt b/inc/lang/fi/draft.txt
index 859f4d9f9..2e4a1eea2 100644
--- a/inc/lang/fi/draft.txt
+++ b/inc/lang/fi/draft.txt
@@ -2,4 +2,4 @@
Edellinen muokkauksesi tälle sivulle ei ole päivittynyt oikein. DokuWiki on automaattisesti tallentanut vedoksen muokkauksen aikana. Voit nyt jatkaa muokkausta. Alla näet tallennetun version edellisestä istunnostasi.
-Valitse jos haluat //palauttaa// edellisen muutoksesi, //poistaa// automaattisesti tallennetun vedoksen, vai //peruuttaa// muutokset. \ No newline at end of file
+Valitse jos haluat //palauttaa// edellisen muutoksesi, //poistaa// automaattisesti tallennetun vedoksen, vai //peruuttaa// muutokset.
diff --git a/inc/lang/fi/install.html b/inc/lang/fi/install.html
index 1b43455b5..74be3227f 100644
--- a/inc/lang/fi/install.html
+++ b/inc/lang/fi/install.html
@@ -1,21 +1,7 @@
-<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>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
- asetusvalikon kautta. (cPanel).</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 asetusvalikon kautta. (cPanel).</p>
-<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>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ä
- <a href="http://dokuwiki.org/config">asetuksista</a>.</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ä <a href="http://dokuwiki.org/config">asetuksista</a>.</p>
diff --git a/inc/lang/fi/lang.php b/inc/lang/fi/lang.php
index ebcca3347..a872b156f 100644
--- a/inc/lang/fi/lang.php
+++ b/inc/lang/fi/lang.php
@@ -2,7 +2,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
+ * @author Tuomo Hartikainen <tuomo.hartikainen@heksia.fi>
* @author Petteri <petteri@gmail.com>
* @author Matti Pöllä <mpo@iki.fi>
* @author Otto Vainio <otto@valjakko.net>
@@ -71,43 +72,6 @@ $lang['badpassconfirm'] = 'Valitan. Salasana oli väärin';
$lang['minoredit'] = 'Pieni muutos';
$lang['draftdate'] = 'Luonnos tallennettu automaattisesti';
$lang['nosecedit'] = 'Sivu on muuttunut välillä ja kappaleen tiedot olivat vanhentuneet. Koko sivu ladattu.';
-$lang['regmissing'] = 'Kaikki kentät tulee täyttää.';
-$lang['reguexists'] = 'Käyttäjä tällä käyttäjänimellä on jo olemassa.';
-$lang['regsuccess'] = 'Käyttäjä luotiin ja salasana lähetettiin sähköpostilla.';
-$lang['regsuccess2'] = 'Käyttäjänimi on luotu.';
-$lang['regfail'] = 'Valitsemaasi käyttäjää ei voitu luoda.';
-$lang['regmailfail'] = 'Näyttää siltä, että salasanan lähettämisessä tapahtui virhe. Ota yhteys ylläpitäjään!';
-$lang['regbadmail'] = 'Antamasi sähköpostiosoite näyttää epäkelvolta. Jos pidät tätä virheenä ota yhteys ylläpitäjään.';
-$lang['regbadpass'] = 'Annetut kaksi salasanaa eivät täsmää. Yritä uudelleen.';
-$lang['regpwmail'] = 'DokuWiki salasanasi';
-$lang['reghere'] = 'Puuttuuko sinulta käyttäjätili? Hanki sellainen';
-$lang['profna'] = 'Tässä wikissä profiilien muokkaaminen ei ole mahdollista';
-$lang['profnochange'] = 'Ei muutoksia.';
-$lang['profnoempty'] = 'Tyhjä nimi tai sähköpostiosoite ei ole sallittu.';
-$lang['profchanged'] = 'Käyttäjän profiilin päivitys onnistui.';
-$lang['profnodelete'] = 'Tässä wikissä ei voi poistaa käyttäjiä';
-$lang['profdeleteuser'] = 'Poista tili';
-$lang['profdeleted'] = 'Käyttäjätilisi on postettu tästä wikistä';
-$lang['profconfdelete'] = 'Haluan poistaa käyttäjätilini tästä wikistä. <br/> Tätä toimintoa ei voi myöhemmin peruuttaa.';
-$lang['profconfdeletemissing'] = 'Vahvistus rastia ei valittu';
-$lang['pwdforget'] = 'Unohtuiko salasana? Hanki uusi';
-$lang['resendna'] = 'Tämä wiki ei tue salasanan uudelleenlähettämistä.';
-$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ä.';
-$lang['resendpwdconfirm'] = 'Varmistuslinkki on lähetetty sähköpostilla';
-$lang['resendpwdsuccess'] = 'Uusi salasanasi on lähetetty sähköpostilla.';
-$lang['license'] = 'Jollei muuta ole mainittu, niin sisältö tässä wikissä on lisensoitu seuraavalla lisenssillä:';
-$lang['licenseok'] = 'Huom: Muokkaamalla tätä sivua suostut lisensoimaan sisällön seuraavan lisenssin mukaisesti:';
-$lang['searchmedia'] = 'Etsi tiedostoa nimeltä:';
-$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.';
$lang['js']['notsavedyet'] = 'Dokumentissa on tallentamattomia muutoksia, jotka häviävät.
Haluatko varmasti jatkaa?';
@@ -151,6 +115,43 @@ $lang['js']['media_done_btn'] = 'Valmis';
$lang['js']['media_drop'] = 'Pudota lähetettävät tiedostot tähän';
$lang['js']['media_cancel'] = 'Poista';
$lang['js']['media_overwrt'] = 'Ylikirjoita olemassa olevat tiedostot';
+$lang['regmissing'] = 'Kaikki kentät tulee täyttää.';
+$lang['reguexists'] = 'Käyttäjä tällä käyttäjänimellä on jo olemassa.';
+$lang['regsuccess'] = 'Käyttäjä luotiin ja salasana lähetettiin sähköpostilla.';
+$lang['regsuccess2'] = 'Käyttäjänimi on luotu.';
+$lang['regfail'] = 'Valitsemaasi käyttäjää ei voitu luoda.';
+$lang['regmailfail'] = 'Näyttää siltä, että salasanan lähettämisessä tapahtui virhe. Ota yhteys ylläpitäjään!';
+$lang['regbadmail'] = 'Antamasi sähköpostiosoite näyttää epäkelvolta. Jos pidät tätä virheenä ota yhteys ylläpitäjään.';
+$lang['regbadpass'] = 'Annetut kaksi salasanaa eivät täsmää. Yritä uudelleen.';
+$lang['regpwmail'] = 'DokuWiki salasanasi';
+$lang['reghere'] = 'Puuttuuko sinulta käyttäjätili? Hanki sellainen';
+$lang['profna'] = 'Tässä wikissä profiilien muokkaaminen ei ole mahdollista';
+$lang['profnochange'] = 'Ei muutoksia.';
+$lang['profnoempty'] = 'Tyhjä nimi tai sähköpostiosoite ei ole sallittu.';
+$lang['profchanged'] = 'Käyttäjän profiilin päivitys onnistui.';
+$lang['profnodelete'] = 'Tässä wikissä ei voi poistaa käyttäjiä';
+$lang['profdeleteuser'] = 'Poista tili';
+$lang['profdeleted'] = 'Käyttäjätilisi on postettu tästä wikistä';
+$lang['profconfdelete'] = 'Haluan poistaa käyttäjätilini tästä wikistä. <br/> Tätä toimintoa ei voi myöhemmin peruuttaa.';
+$lang['profconfdeletemissing'] = 'Vahvistus rastia ei valittu';
+$lang['pwdforget'] = 'Unohtuiko salasana? Hanki uusi';
+$lang['resendna'] = 'Tämä wiki ei tue salasanan uudelleenlähettämistä.';
+$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ä.';
+$lang['resendpwdconfirm'] = 'Varmistuslinkki on lähetetty sähköpostilla';
+$lang['resendpwdsuccess'] = 'Uusi salasanasi on lähetetty sähköpostilla.';
+$lang['license'] = 'Jollei muuta ole mainittu, niin sisältö tässä wikissä on lisensoitu seuraavalla lisenssillä:';
+$lang['licenseok'] = 'Huom: Muokkaamalla tätä sivua suostut lisensoimaan sisällön seuraavan lisenssin mukaisesti:';
+$lang['searchmedia'] = 'Etsi tiedostoa nimeltä:';
+$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['rssfailed'] = 'Virhe tapahtui noudettaessa tätä syötettä: ';
$lang['nothingfound'] = 'Mitään ei löytynyt.';
$lang['mediaselect'] = 'Mediatiedoston valinta';
@@ -338,5 +339,5 @@ $lang['searchresult'] = 'Haun tulokset';
$lang['plainhtml'] = 'pelkkä HTML';
$lang['wikimarkup'] = 'Wiki markup';
$lang['unable_to_parse_date'] = 'Parametrin "%s" jäsennys ei onnistu.';
-$lang['email_signature_text'] = 'Tämän postin loi DokuWiki osoitteessa
+$lang['email_signature_text'] = 'Tämän postin loi DokuWiki osoitteessa
@DOKUWIKIURL@';
diff --git a/inc/lang/fi/newpage.txt b/inc/lang/fi/newpage.txt
index fc6379be7..29e6786b8 100644
--- a/inc/lang/fi/newpage.txt
+++ b/inc/lang/fi/newpage.txt
@@ -1,3 +1,3 @@
====== Tätä otsikkoa ei vielä ole ======
-Olet seurannut linkkiä otsikkoon jota ei vielä ole. Voit luoda tämän käyttämällä ''Luo tämä sivu'' -nappia.
+Olet seurannut linkkiä otsikkoon jota ei vielä ole. Voit luoda tämän käyttämällä **Luo tämä sivu** -nappia.
diff --git a/inc/lang/fi/preview.txt b/inc/lang/fi/preview.txt
index 848780701..c5586e818 100644
--- a/inc/lang/fi/preview.txt
+++ b/inc/lang/fi/preview.txt
@@ -1,3 +1,3 @@
====== Esikatselu ======
-Tämä on esikatselu siitä, miltä tekstisi tulee näyttämään. Muista, että tätä **ei ole tallennettu** vielä!
+Tämä on esikatselu siitä, miltä tekstisi tulee näyttämään. **Muista, että tätä ei ole tallennettu vielä**!
diff --git a/inc/lang/fi/recent.txt b/inc/lang/fi/recent.txt
index ffb08107e..4ab1234ce 100644
--- a/inc/lang/fi/recent.txt
+++ b/inc/lang/fi/recent.txt
@@ -1,4 +1,3 @@
====== Viimeiset muutokset ======
-Seuraavat sivut ovat muuttuneet viime aikoina.
-
+Seuraavat sivut ovat muuttuneet viime aikoina:
diff --git a/inc/lang/fi/resetpwd.txt b/inc/lang/fi/resetpwd.txt
index c6780949a..074c529c7 100644
--- a/inc/lang/fi/resetpwd.txt
+++ b/inc/lang/fi/resetpwd.txt
@@ -1,3 +1,3 @@
-===== Aseta salasana =====
+====== Aseta salasana ======
-Anna uusi salasanasi tässä wikissä. \ No newline at end of file
+Anna uusi salasanasi tässä wikissä.
diff --git a/inc/lang/fi/searchpage.txt b/inc/lang/fi/searchpage.txt
index 8e61bf367..02434416b 100644
--- a/inc/lang/fi/searchpage.txt
+++ b/inc/lang/fi/searchpage.txt
@@ -1,4 +1,3 @@
====== Etsi ======
Löydät etsinnän tulokset alta. @CREATEPAGEINFO@
-
diff --git a/inc/lang/fi/stopwords.txt b/inc/lang/fi/stopwords.txt
index 82d3daa44..85c1fab04 100644
--- a/inc/lang/fi/stopwords.txt
+++ b/inc/lang/fi/stopwords.txt
@@ -2,10 +2,10 @@
# Kun muokkaat sivua, varmista että käytät UNIX rivinvaihtoa (yksi newline)
# Ei tarvitse lisätä alle kolmen merkin sanoja. NE ohitetaan automaattisesti.
# Jos wikissäsin muita kieliä, lisää sanoja listaan esimerkiksi sivulta http://www.ranks.nl/stopwords/
-www
+com
eli
-tai
+oli
sinä
sinun
-com
-oli
+tai
+www
diff --git a/inc/lang/fi/updateprofile.txt b/inc/lang/fi/updateprofile.txt
index 71407954a..e7e362168 100644
--- a/inc/lang/fi/updateprofile.txt
+++ b/inc/lang/fi/updateprofile.txt
@@ -1,3 +1,3 @@
====== Päivitä käyttäjätilisi profiilia ======
-Täytä vain ne kentät, joita haluat muuttaa. Et voi muuttaa käyttäjätunnustasi. \ No newline at end of file
+Täytä vain ne kentät, joita haluat muuttaa. Et voi muuttaa käyttäjätunnustasi.
diff --git a/inc/lang/fo/admin.txt b/inc/lang/fo/admin.txt
index 27743223d..fce45bd22 100644
--- a/inc/lang/fo/admin.txt
+++ b/inc/lang/fo/admin.txt
@@ -1,4 +1,3 @@
====== Fyrisiting ======
Niðanfyri kanst tú finna eina røð av amboðum til fyrisiting.
-
diff --git a/inc/lang/fo/backlinks.txt b/inc/lang/fo/backlinks.txt
index 422377f62..5c79e051c 100644
--- a/inc/lang/fo/backlinks.txt
+++ b/inc/lang/fo/backlinks.txt
@@ -1,4 +1,3 @@
====== Ávísing afturúr ======
Hetta er ein listi yvur øll tey skjøl sum vísa aftur á tað núverandi skjali.
-
diff --git a/inc/lang/fo/denied.txt b/inc/lang/fo/denied.txt
index ecebba88c..056822b3f 100644
--- a/inc/lang/fo/denied.txt
+++ b/inc/lang/fo/denied.txt
@@ -1,4 +1,3 @@
====== Atgongd nokta! ======
Tú hevur ikki rættindi til at halda áfram.
-
diff --git a/inc/lang/fo/diff.txt b/inc/lang/fo/diff.txt
index 343818b40..b199844c5 100644
--- a/inc/lang/fo/diff.txt
+++ b/inc/lang/fo/diff.txt
@@ -1,4 +1,3 @@
====== Munir ======
Hetta vísur munir millum tí valdu og núverandu útgávu av skjalinum. Gular eru linjur sum er at finna í gomlu útgávuni, og grønar eru linjur sum eru at finna í núvarandi útgávuni.
-
diff --git a/inc/lang/fo/edit.txt b/inc/lang/fo/edit.txt
index 2ba92a2d2..a5d7764d8 100644
--- a/inc/lang/fo/edit.txt
+++ b/inc/lang/fo/edit.txt
@@ -1,2 +1 @@
Rætta hetta skjal og trýst so á **''[Goym]''** knappin. Sí [[wiki:syntax|snið ábending]] fyri Wiki setningsbygnað. Rætta vinarliga bert hetta skjali um tú kanst **fyrireika** tað. Nýt vinarliga [[playground:playground|sandkassan]] til at testa áðrenn tú rættar í einum røttum skjali. Minst eisini til at brúkar **''[Forskoðan]''** áðrenn tú goymur skjalið.
-
diff --git a/inc/lang/fo/newpage.txt b/inc/lang/fo/newpage.txt
index 6eeb1ef31..22e33a671 100644
--- a/inc/lang/fo/newpage.txt
+++ b/inc/lang/fo/newpage.txt
@@ -1,3 +1,3 @@
====== Hetta skjal er ikki til (enn) ======
-Tú fylgdi ein ávísing til eitt skjal sum ikki er til (enn). Tú kanst stovna skjali við at trýsta á **''[Stovna hetta skjal]''** knappin.
+Tú fylgdi ein ávísing til eitt skjal sum ikki er til (enn). Tú kanst stovna skjali við at trýsta á **Stovna hetta skjal** knappin.
diff --git a/inc/lang/fo/norev.txt b/inc/lang/fo/norev.txt
index d0b463a40..d9600c688 100644
--- a/inc/lang/fo/norev.txt
+++ b/inc/lang/fo/norev.txt
@@ -1,4 +1,3 @@
====== Valda útgávan er ikki til ======
Valda útgávan av skjalinum er ikki til! Trýst á knappin **''[Gamlar útgávur]''** fyri at síggja ein lista yvur gamlar útgávur av hesum skjali.
-
diff --git a/inc/lang/fo/preview.txt b/inc/lang/fo/preview.txt
index e3e65d805..67912bccd 100644
--- a/inc/lang/fo/preview.txt
+++ b/inc/lang/fo/preview.txt
@@ -1,4 +1,3 @@
====== Forskoðan ======
Hetta er ein forskoðan skjalinum, sum vísur hvussi tað fer at síggja út. Minst til: Tað er //**IKKI**// goymt enn! Um tað sær rætt út, trýst so á **''[Goym]''** knappin
-
diff --git a/inc/lang/fo/read.txt b/inc/lang/fo/read.txt
index bacf79026..c3a288d91 100644
--- a/inc/lang/fo/read.txt
+++ b/inc/lang/fo/read.txt
@@ -1,2 +1 @@
Hetta skjal kan bert læsast. Tú kanst síggja kelduna, men ikki goyma broytingar í tí. Um tú heldur at hetta er eitt brek, skriva so vinarliga í [[wiki:brek-yvirlit]].
-
diff --git a/inc/lang/fo/recent.txt b/inc/lang/fo/recent.txt
index 4704f3781..203c1512f 100644
--- a/inc/lang/fo/recent.txt
+++ b/inc/lang/fo/recent.txt
@@ -1,5 +1,3 @@
====== Nýggjar broytingar ======
-Fylgjandi skjøl er broytt nýliga.
-
-
+Fylgjandi skjøl er broytt nýliga:
diff --git a/inc/lang/fo/register.txt b/inc/lang/fo/register.txt
index 24438afe8..236c81442 100644
--- a/inc/lang/fo/register.txt
+++ b/inc/lang/fo/register.txt
@@ -1,4 +1,3 @@
====== Upprætta eina wiki-konti ======
Fylla út niðanfyrista skema fyri at upprætta eina konti í hesu wiki. Minst til at nýta eina **galdandi t-post-adressu** - títt loyniorð verður sent til tín. Títt brúkaranavn skal verða galdandi [[doku>pagename|skjalanavn]].
-
diff --git a/inc/lang/fo/searchpage.txt b/inc/lang/fo/searchpage.txt
index 896102bfe..7b519f26f 100644
--- a/inc/lang/fo/searchpage.txt
+++ b/inc/lang/fo/searchpage.txt
@@ -1,4 +1,3 @@
====== Leiting ======
Tú kanst síggja úrslitini av tíni leiting niðanfyri. @CREATEPAGEINFO@
-
diff --git a/inc/lang/fo/stopwords.txt b/inc/lang/fo/stopwords.txt
index 210e85902..44effc41c 100644
--- a/inc/lang/fo/stopwords.txt
+++ b/inc/lang/fo/stopwords.txt
@@ -85,3 +85,4 @@ yvur
átta
áðrenn
øll
+www
diff --git a/inc/lang/fr/backlinks.txt b/inc/lang/fr/backlinks.txt
index 8e6d27d95..4013f25e6 100644
--- a/inc/lang/fr/backlinks.txt
+++ b/inc/lang/fr/backlinks.txt
@@ -1,4 +1,3 @@
====== Pages pointant sur la page en cours ======
Ceci est la liste des pages qui semblent pointer sur la page actuelle.
-
diff --git a/inc/lang/fr/conflict.txt b/inc/lang/fr/conflict.txt
index e34ec9743..56db68f96 100644
--- a/inc/lang/fr/conflict.txt
+++ b/inc/lang/fr/conflict.txt
@@ -3,4 +3,3 @@
Une version plus récente du document que vous avez modifié existe. Cela se produit lorsqu'un autre utilisateur enregistre une nouvelle version du document alors que vous le modifiez.
Examinez attentivement les différences ci-dessous et décidez quelle version conserver. Si vous choisissez « Enregistrer », votre version sera enregistrée. Cliquez sur « Annuler » pour conserver la version actuelle.
-
diff --git a/inc/lang/fr/denied.txt b/inc/lang/fr/denied.txt
index 6de193004..4135c449e 100644
--- a/inc/lang/fr/denied.txt
+++ b/inc/lang/fr/denied.txt
@@ -1,4 +1,3 @@
====== Autorisation refusée ======
Désolé, vous n'avez pas suffisamment d'autorisations pour poursuivre votre demande.
-
diff --git a/inc/lang/fr/diff.txt b/inc/lang/fr/diff.txt
index d1230ccaf..304eeb5dd 100644
--- a/inc/lang/fr/diff.txt
+++ b/inc/lang/fr/diff.txt
@@ -1,4 +1,3 @@
====== Différences ======
Ci-dessous, les différences entre deux révisions de la page.
-
diff --git a/inc/lang/fr/draft.txt b/inc/lang/fr/draft.txt
index 44cb4e39d..2af840499 100644
--- a/inc/lang/fr/draft.txt
+++ b/inc/lang/fr/draft.txt
@@ -3,4 +3,3 @@
La dernière modification de cette page ne s'est pas terminée correctement. DokuWiki a enregistré automatiquement un brouillon de votre travail que vous pouvez utiliser pour votre modification. Ci-dessous figurent les données enregistrées lors de votre dernière session.
À vous de décider si vous souhaitez //récupérer// votre session de modification précédente, //supprimer// le brouillon enregistré automatiquement ou //annuler// le processus d'édition.
-
diff --git a/inc/lang/fr/edit.txt b/inc/lang/fr/edit.txt
index df8c9fc9e..fa84818b4 100644
--- a/inc/lang/fr/edit.txt
+++ b/inc/lang/fr/edit.txt
@@ -1,2 +1 @@
Modifiez cette page et cliquez sur « Enregistrer ». Voyez le [[:wiki:syntax|guide de mise en page]] pour une aide à propos du formatage. Veuillez ne modifier cette page que si vous pouvez l'**améliorer**. Si vous souhaitez faire des tests, faites vos premiers pas dans le [[:playground:playground|bac à sable]].
-
diff --git a/inc/lang/fr/index.txt b/inc/lang/fr/index.txt
index 15e16734c..e31883a14 100644
--- a/inc/lang/fr/index.txt
+++ b/inc/lang/fr/index.txt
@@ -1,4 +1,3 @@
====== Plan du site ======
Voici un plan du site de toutes les pages disponibles, triées par [[doku>fr:namespaces|catégories]].
-
diff --git a/inc/lang/fr/install.html b/inc/lang/fr/install.html
index 6dcba25dc..a13a5acaf 100644
--- a/inc/lang/fr/install.html
+++ b/inc/lang/fr/install.html
@@ -1,13 +1,32 @@
-<p>Cette page vous assiste dans l'installation et la
-configuration de <a href="http://dokuwiki.org">DokuWiki</a>.
-Pour plus d'informations sur cet installateur, reportez-vous à sa
-<a href="http://dokuwiki.org/installer">page de
-documentation</a>.</p>
+<p>Cette page vous assiste dans l'installation et la configuration
+de <a href="http://dokuwiki.org">DokuWiki</a>. Pour plus d'informations
+sur cet installateur, 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ées à ces pages
-(par exemple, les images, les index de recherche, les anciennes révisions, ...). Pour fonctionner correctement, DokuWiki <strong>doit</strong> avoir accès en écriture aux différents répertoires qui contiennent ces fichiers. Cet installateur n'est pas capable de modifier les autorisations sur les répertoires. Cette opération doit-être effectué directement depuis votre ligne de commande shell, ou, si vous êtes hébergé, <em>via</em> FTP ou votre panneau de contrôle (par exemple cPanel, Plesk, ...).</p>
+<p>DokuWiki utilise des fichiers textes ordinaires pour stocker les
+pages du wiki et les autres informations associées à ces pages (par
+exemple, les images, les index de recherche, les anciennes révisions,
+...). Pour fonctionner correctement, DokuWiki <strong>doit</strong>
+avoir accès en écriture aux différents dossiers qui contiennent ces
+fichiers. Cet installateur n'est pas capable de modifier les
+autorisations sur les dossiers. Cette opération doit-être effectuée
+directement depuis votre ligne de commande shell, ou, si vous êtes
+hébergé, <em>via</em> FTP ou votre panneau de contrôle (par exemple
+cPanel, Plesk, ...).</p>
-<p>Cet installateur va paramétrer votre configuration de DokuWiki pour des contrôle d'accès (ACL), qui permettront l'accès à un identifiant administrateur et l'accès au menu d'administration de DokuWiki pour l'ajout d'extensions, la gestion d'utilisateurs, la gestion de l'accès aux pages du wiki et les modifications des paramètres de configuration. Les contrôle d'accès ne sont pas nécessaires au fonctionnement de DokuWiki, néanmoins elles facilitent l'administration de DokuWiki.</p>
+<p>Cet installateur va paramétrer votre instance de DokuWiki pour
+utiliser des listes de contrôle d'accès
+(<abbr title="access control list">ACL</abbr>). Ces ACL permettront
+à leur tour la connexion avec un identifiant administrateur ayant
+accès au menu d'administration pour ajouter des extensions, gérer
+les utilisateurs, gérer les accès aux pages du wiki et modifier les
+paramètres de configuration. Ceci n'est pas nécessaire pour que
+DokuWiki fonctionne, cependant, cela le rendra plus facile à
+administrer.</p>
-<p>Les utilisateurs expérimentés ou les utilisateurs possédants des besoins de configurations spécifiques 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>
+<p>Les utilisateurs expérimentés ou les utilisateurs possédants des
+besoins de configurations spécifiques devraient se reporter aux
+liens suivants pour les détails concernant les <a
+href="http://dokuwiki.org/fr:install">instructions d'installation</a>
+et les <a href="http://dokuwiki.org/fr:config">paramètres de
+configuration</a>.</p>
diff --git a/inc/lang/fr/lang.php b/inc/lang/fr/lang.php
index 8cf396c00..dfc9ce770 100644
--- a/inc/lang/fr/lang.php
+++ b/inc/lang/fr/lang.php
@@ -3,8 +3,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
- * @author Damien Regad <dregad@mantisbt.org>
+ * @author Nicolas Friedli <nicolas@theologique.ch>
* @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+ * @author PaliPalo <palipalo@hotmail.fr>
+ * @author Laurent Ponthieu <contact@coopindus.fr>
+ * @author Damien Regad <dregad@mantisbt.org>
* @author Michael Bohn <mjbohn@gmail.com>
* @author Sébastien Bauer <sebastien.bauer@advalvas.be>
* @author Antoine Fixary <antoine.fixary@freesbee.fr>
@@ -182,7 +185,7 @@ $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 n\'existe pas dans notre base de données.';
$lang['resendpwdbadauth'] = 'Désolé, ce code d\'authentification est invalide. Assurez-vous d\'avoir utilisé le lien de confirmation intégral.';
-$lang['resendpwdconfirm'] = 'Un lien de confirmation vous a été expédié par courriel.';
+$lang['resendpwdconfirm'] = 'Un lien de confirmation a été expédié par courriel.';
$lang['resendpwdsuccess'] = 'Votre nouveau mot de passe vous a été expédié par courriel.';
$lang['license'] = 'Sauf mention contraire, le contenu de ce wiki est placé sous les termes de la licence suivante :';
$lang['licenseok'] = 'Note : En modifiant cette page, vous acceptez que le contenu soit placé sous les termes de la licence suivante :';
@@ -200,7 +203,7 @@ $lang['mediaselect'] = 'Sélection de fichiers';
$lang['uploadsucc'] = 'Envoi réussi';
$lang['uploadfail'] = 'L\'envoi a échoué. Les autorisations sont-elles correctes ?';
$lang['uploadwrong'] = 'Envoi refusé. Cette extension de fichier est interdite !';
-$lang['uploadexist'] = 'Le fichier existe déjà. L\'envoi a été annulé.';
+$lang['uploadexist'] = 'Le fichier existe déjà. L\'envoi est ignoré.';
$lang['uploadbadcontent'] = 'Le contenu envoyé ne correspond pas à l\'extension du fichier (%s).';
$lang['uploadspam'] = 'L\'envoi a été bloqué par la liste noire de l\'anti-spam.';
$lang['uploadxss'] = 'L\'envoi a été bloqué car son contenu est peut-être malveillant.';
@@ -239,7 +242,7 @@ $lang['line'] = 'Ligne';
$lang['breadcrumb'] = 'Piste:';
$lang['youarehere'] = 'Vous êtes ici:';
$lang['lastmod'] = 'Dernière modification:';
-$lang['by'] = 'par';
+$lang['by'] = 'de';
$lang['deleted'] = 'supprimée';
$lang['created'] = 'créée';
$lang['restored'] = 'ancienne révision (%s) restaurée';
@@ -302,10 +305,10 @@ $lang['img_camera'] = 'Appareil photo:';
$lang['img_keywords'] = 'Mots-clés:';
$lang['img_width'] = 'Largeur:';
$lang['img_height'] = 'Hauteur:';
-$lang['subscr_subscribe_success'] = '%s a été ajouté à la liste des abonnés de %s';
+$lang['subscr_subscribe_success'] = '%s a été ajouté à la liste des abonnés à %s';
$lang['subscr_subscribe_error'] = 'Erreur à l\'ajout de %s à la liste des abonnés de %s';
$lang['subscr_subscribe_noaddress'] = 'Il n\'y a pas d\'adresse associée à votre identifiant, vous ne pouvez pas être ajouté à la liste des abonnés.';
-$lang['subscr_unsubscribe_success'] = '%s a été supprimé de la liste des abonnés de %s';
+$lang['subscr_unsubscribe_success'] = '%s a été supprimé de la liste des abonnés à %s';
$lang['subscr_unsubscribe_error'] = 'Erreur au retrait de %s de la liste des abonnés de %s';
$lang['subscr_already_subscribed'] = '%s est déjà abonné à %s';
$lang['subscr_not_subscribed'] = '%s n\'est pas abonné à %s';
@@ -327,8 +330,10 @@ $lang['i_superuser'] = 'Super-utilisateur';
$lang['i_problems'] = 'L\'installateur a détecté les problèmes indiqués ci-dessous. Vous ne pouvez pas poursuivre l\'installation tant qu\'ils n\'auront pas été corrigés.';
$lang['i_modified'] = 'Pour des raisons de sécurité, ce script ne fonctionne qu\'avec une installation neuve et non modifiée de DokuWiki. Vous devriez ré-extraire les fichiers depuis le paquet téléchargé ou consulter les <a href="http://dokuwiki.org/install">instructions d\'installation de DokuWiki</a>';
$lang['i_funcna'] = 'La fonction PHP <code>%s</code> n\'est pas disponible. Peut-être que votre hébergeur web l\'a désactivée ?';
+$lang['i_disabled'] = 'A été désactivé par votre fournisseur d’accès.';
$lang['i_phpver'] = 'Votre version de PHP (%s) est antérieure à la version requise (%s). Vous devez mettre à jour votre installation de PHP.';
$lang['i_mbfuncoverload'] = 'Il faut désactiver mbstring.func_overload dans php.ini pour DokuWiki';
+$lang['i_urandom'] = 'DokuWiki ne peut créer de nombres cryptographiquement sûrs pour les cookies. Vous voudrez peut-être vérifier que le réglage open_basedir dans php.ini permet l\'accès à <code>/dev/urandom</code>.';
$lang['i_permfail'] = '<code>%s</code> n\'est pas accessible en écriture pour DokuWiki. Vous devez corriger les autorisations de ce répertoire !';
$lang['i_confexists'] = '<code>%s</code> existe déjà';
$lang['i_writeerr'] = 'Impossible de créer <code>%s</code>. Vous devez vérifier les autorisations des répertoires/fichiers et créer le fichier manuellement.';
@@ -379,11 +384,12 @@ $lang['media_perm_upload'] = 'Désolé, vous n\'avez pas l\'autorisation d\'
$lang['media_update'] = 'Envoyer une nouvelle version';
$lang['media_restore'] = 'Restaurer cette version';
$lang['media_acl_warning'] = 'En raison des restrictions dans les ACL et de pages cachées, cette liste peut ne pas être complète.';
+$lang['email_fail'] = 'La fonction PHP mail() est absente ou désactivée. Le message suivant n’a pas été envoyé:';
$lang['currentns'] = 'Catégorie courante';
$lang['searchresult'] = 'Résultat de la recherche';
$lang['plainhtml'] = 'HTML brut';
$lang['wikimarkup'] = 'Wiki balise';
$lang['page_nonexist_rev'] = 'La page n\'existait pas le %s. Elle a été créée le <a href="%s">%s</a>.';
$lang['unable_to_parse_date'] = 'Ne peut analyser le paramètre date "%s".';
-$lang['email_signature_text'] = 'Ce courriel a été généré par DokuWiki depuis
+$lang['email_signature_text'] = 'Courriel envoyé par DokuWiki depuis
@DOKUWIKIURL@';
diff --git a/inc/lang/fr/mailtext.txt b/inc/lang/fr/mailtext.txt
index d93eb1e8a..a4aa8d8b0 100644
--- a/inc/lang/fr/mailtext.txt
+++ b/inc/lang/fr/mailtext.txt
@@ -1,4 +1,4 @@
-Une page dans votre wiki a été ajoutée ou modifiée. Voici les
+Une page dans votre wiki a changé ou été modifiée. Voici les
détails :
Date : @DATE@
diff --git a/inc/lang/fr/newpage.txt b/inc/lang/fr/newpage.txt
index c649489fa..667061a21 100644
--- a/inc/lang/fr/newpage.txt
+++ b/inc/lang/fr/newpage.txt
@@ -1,4 +1,3 @@
====== Cette page n'existe pas encore ======
Vous avez suivi un lien vers une page qui n'existe pas encore. Si vos permissions sont suffisantes, vous pouvez la créer en cliquant sur « Créer cette page ».
-
diff --git a/inc/lang/fr/norev.txt b/inc/lang/fr/norev.txt
index 0d40dbe05..822efff4a 100644
--- a/inc/lang/fr/norev.txt
+++ b/inc/lang/fr/norev.txt
@@ -1,4 +1,3 @@
====== Révision non trouvée ======
La révision demandée n'existe pas. Cliquez sur « Anciennes révisions » pour obtenir une liste des révisions de ce document.
-
diff --git a/inc/lang/fr/onceexisted.txt b/inc/lang/fr/onceexisted.txt
new file mode 100644
index 000000000..67b36f05f
--- /dev/null
+++ b/inc/lang/fr/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Cette page n'existe plus ======
+
+Vous avez suivi un lien vers une page qui n'existe plus. Vous pouvez afficher la liste des [[?do=revisions|anciennes revisions]] pour voir quand et pourquoi la page a été supprimée, pour accéder à ses anciennes révisions ou pour la restaurer. \ No newline at end of file
diff --git a/inc/lang/fr/password.txt b/inc/lang/fr/password.txt
index 2ffe71586..58237246f 100644
--- a/inc/lang/fr/password.txt
+++ b/inc/lang/fr/password.txt
@@ -1,6 +1,7 @@
Bonjour @FULLNAME@ !
-Voici vos identifiants pour @TITLE@ sur @DOKUWIKIURL@
+Voici vos identifiants pour @TITLE@ sur
+@DOKUWIKIURL@
Utilisateur : @LOGIN@
Mot de passe : @PASSWORD@
diff --git a/inc/lang/fr/pwconfirm.txt b/inc/lang/fr/pwconfirm.txt
index 187ec0bd0..18434eb07 100644
--- a/inc/lang/fr/pwconfirm.txt
+++ b/inc/lang/fr/pwconfirm.txt
@@ -6,6 +6,7 @@ Quelqu'un a demandé un nouveau mot de passe pour votre identifiant
Si vous n'êtes pas à l'origine de cette requête d'un nouveau mot de
passe, ignorez simplement ce message.
-Pour confirmer que cette requête émane bien de vous, merci de cliquer sur le lien ci-dessous.
+Pour confirmer que cette requête émane bien de vous, veuillez suivre
+le lien ci-dessous.
@CONFIRM@
diff --git a/inc/lang/fr/read.txt b/inc/lang/fr/read.txt
index 6afb864a8..c81844583 100644
--- a/inc/lang/fr/read.txt
+++ b/inc/lang/fr/read.txt
@@ -1,2 +1 @@
Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur.
-
diff --git a/inc/lang/fr/recent.txt b/inc/lang/fr/recent.txt
index b41972fc1..77ec119d1 100644
--- a/inc/lang/fr/recent.txt
+++ b/inc/lang/fr/recent.txt
@@ -1,5 +1,3 @@
====== Derniers changements ======
-Les pages suivantes ont été modifiées récemment.
-
-
+Voici la liste des pages modifiées récemment :
diff --git a/inc/lang/fr/register.txt b/inc/lang/fr/register.txt
index f98383454..df1d22eee 100644
--- a/inc/lang/fr/register.txt
+++ b/inc/lang/fr/register.txt
@@ -1,3 +1,3 @@
====== S'enregistrer comme nouvel utilisateur ======
-Remplissez toutes les informations ci-dessous pour vous créer un compte sur ce wiki. Assurez-vous de fournir une **adresse de courriel valide** - s'il ne vous est pas demandé de saisir un mot de passe ici, il vous sera expédié par courriel à cette adresse. Le nom d'utilisateur doit être un [[doku>pagename|nom de page]] valide.
+Remplissez toutes les informations ci-dessous pour vous créer un compte sur ce wiki. Assurez-vous de fournir une **adresse de courriel valide** - s'il ne vous est pas demandé de saisir un mot de passe ici, il vous sera expédié par courriel à cette adresse. Le nom d'utilisateur doit être un [[doku>fr:pagename|nom de page]] valide.
diff --git a/inc/lang/fr/registermail.txt b/inc/lang/fr/registermail.txt
index fe39c2db5..bbf7ed3a0 100644
--- a/inc/lang/fr/registermail.txt
+++ b/inc/lang/fr/registermail.txt
@@ -1,10 +1,10 @@
Un nouvel utilisateur s'est enregistré. Voici les détails :
-Utilisateur : @NEWUSER@
+Utilisateur : @NEWUSER@
Nom : @NEWNAME@
-Courriel : @NEWEMAIL@
+Courriel : @NEWEMAIL@
-Date : @DATE@
-Navigateur internet : @BROWSER@
-Adresse IP : @IPADDRESS@
-Nom d'hôte : @HOSTNAME@
+Date : @DATE@
+Navigateur : @BROWSER@
+Adresse IP : @IPADDRESS@
+Nom d'hôte : @HOSTNAME@
diff --git a/inc/lang/fr/resendpwd.txt b/inc/lang/fr/resendpwd.txt
index 91dd92482..d0cef5d42 100644
--- a/inc/lang/fr/resendpwd.txt
+++ b/inc/lang/fr/resendpwd.txt
@@ -1,4 +1,3 @@
====== Envoyer un nouveau mot de passe ======
Veuillez compléter les champs ci-dessous pour obtenir un nouveau mot de passe pour votre compte dans ce wiki. Un lien de confirmation vous sera expédié à l'adresse de courriel utilisée lors de votre enregistrement.
-
diff --git a/inc/lang/fr/resetpwd.txt b/inc/lang/fr/resetpwd.txt
index 7b1990ca0..105625db1 100644
--- a/inc/lang/fr/resetpwd.txt
+++ b/inc/lang/fr/resetpwd.txt
@@ -1,3 +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
+Merci d'entrer un nouveau mot de passe pour votre compte sur ce wiki.
diff --git a/inc/lang/fr/revisions.txt b/inc/lang/fr/revisions.txt
index 29c17137f..7f45db55e 100644
--- a/inc/lang/fr/revisions.txt
+++ b/inc/lang/fr/revisions.txt
@@ -1,4 +1,3 @@
====== Anciennes révisions ======
-Voici les anciennes révisions de la page en cours. Pour revenir à une ancienne révision, sélectionnez-la ci-dessous, cliquez sur le bouton « Modifier cette page » et enregistrez-la.
-
+Voici les anciennes révisions de la page en cours. Pour les comparer, sélectionnez-les avec les cases à options. Pour revenir à une ancienne révision, affichez-la en cliquant sur son nom, puis cliquez sur le bouton « Modifier cette page » et enregistrez-la. \ No newline at end of file
diff --git a/inc/lang/fr/searchpage.txt b/inc/lang/fr/searchpage.txt
index 7866187d4..1301b0c47 100644
--- a/inc/lang/fr/searchpage.txt
+++ b/inc/lang/fr/searchpage.txt
@@ -1,4 +1,3 @@
====== Recherche ======
Voici les résultats de votre recherche. @CREATEPAGEINFO@
-
diff --git a/inc/lang/fr/stopwords.txt b/inc/lang/fr/stopwords.txt
index 5f187f7e1..d86d76942 100644
--- a/inc/lang/fr/stopwords.txt
+++ b/inc/lang/fr/stopwords.txt
@@ -104,6 +104,7 @@ voient
vont
votre
vous
+www
ça
étaient
état
diff --git a/inc/lang/fr/subscr_digest.txt b/inc/lang/fr/subscr_digest.txt
index c1fa4637e..fa64b2262 100644
--- a/inc/lang/fr/subscr_digest.txt
+++ b/inc/lang/fr/subscr_digest.txt
@@ -1,13 +1,14 @@
Bonjour,
-La page « @PAGE@ » dans le wiki « @TITLE@ » a été modifiée. Voici les modifications :
+La page « @PAGE@ » dans le wiki « @TITLE@ » a changé.
+Voici les modifications :
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
Révision précédente : @OLDPAGE@
-Nouvelle révision : @NEWPAGE@
+Nouvelle révision  : @NEWPAGE@
Pour annuler les notifications de page, connectez-vous au wiki à l'adresse
@DOKUWIKIURL@ puis visitez
diff --git a/inc/lang/fr/subscr_list.txt b/inc/lang/fr/subscr_list.txt
index 4c5c55d16..f34fa52e0 100644
--- a/inc/lang/fr/subscr_list.txt
+++ b/inc/lang/fr/subscr_list.txt
@@ -1,6 +1,7 @@
Bonjour,
-Des pages de la catégorie « @PAGE@ » du wiki « @TITLE@ » ont été modifiées. Voici les modifications :
+Des pages de la catégorie « @PAGE@ » du wiki « @TITLE@ » ont
+changé. Voici les modifications :
--------------------------------------------------------
@DIFF@
diff --git a/inc/lang/fr/subscr_single.txt b/inc/lang/fr/subscr_single.txt
index a13bd00ec..d101fabd9 100644
--- a/inc/lang/fr/subscr_single.txt
+++ b/inc/lang/fr/subscr_single.txt
@@ -1,16 +1,17 @@
Bonjour,
-La page « @PAGE@ » dans le wiki « @TITLE@ » a été modifiée. Voici les modifications :
+La page « @PAGE@ » dans le wiki « @TITLE@ » a changé.
+Voici les modifications :
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-Date : @DATE@
-Utilisateur : @USER@
-Résumé : @SUMMARY@
+Date : @DATE@
+Utilisateur : @USER@
+Résumé : @SUMMARY@
Révision précédente : @OLDPAGE@
-Nouvelle révision : @NEWPAGE@
+Nouvelle révision : @NEWPAGE@
Pour annuler les notifications de page, connectez-vous au wiki à l'adresse
@DOKUWIKIURL@ puis visitez
diff --git a/inc/lang/fr/updateprofile.txt b/inc/lang/fr/updateprofile.txt
index 623d75e88..326a98933 100644
--- a/inc/lang/fr/updateprofile.txt
+++ b/inc/lang/fr/updateprofile.txt
@@ -1,5 +1,3 @@
====== Mise à jour de votre profil ======
Ne complétez que les champs que vous souhaitez modifier. Vous ne pouvez pas modifier votre nom d'utilisateur.
-
-
diff --git a/inc/lang/fy/admin.txt b/inc/lang/fy/admin.txt
new file mode 100644
index 000000000..e99bdeab6
--- /dev/null
+++ b/inc/lang/fy/admin.txt
@@ -0,0 +1,3 @@
+====== Administraasje ======
+
+Hjirûnder kinst in list fyne fan beskikbare administratieve taken yn DokuWiki \ No newline at end of file
diff --git a/inc/lang/gl/admin.txt b/inc/lang/gl/admin.txt
index eeaed992a..25cb3292b 100644
--- a/inc/lang/gl/admin.txt
+++ b/inc/lang/gl/admin.txt
@@ -1,4 +1,3 @@
====== Administración ======
De seguido podes atopar unha lista de tarefas administrativas dispoñíbeis no DokuWiki.
-
diff --git a/inc/lang/gl/backlinks.txt b/inc/lang/gl/backlinks.txt
index f77b74bbd..10ed0d5c4 100644
--- a/inc/lang/gl/backlinks.txt
+++ b/inc/lang/gl/backlinks.txt
@@ -1,4 +1,3 @@
====== Ligazóns entrantes ======
Isto é unha listaxe de páxinas que semellan ligar coa páxina actual.
-
diff --git a/inc/lang/gl/conflict.txt b/inc/lang/gl/conflict.txt
index dcd87c7a5..f3e985881 100644
--- a/inc/lang/gl/conflict.txt
+++ b/inc/lang/gl/conflict.txt
@@ -3,4 +3,3 @@
Hai unha versión máis nova do documento que editaches. Isto sucede cando outro usuario mudou o documento mentres ti estabas a editalo.
Examina as diferenzas amosadas embaixo polo miúdo, e logo decide que versión queres manter. Se escolleres ''Gardar'', gardarase a túa versión. Preme en ''Cancelar'' para manteres a versión actual.
-
diff --git a/inc/lang/gl/denied.txt b/inc/lang/gl/denied.txt
index ef37a06f0..df5b3d2e2 100644
--- a/inc/lang/gl/denied.txt
+++ b/inc/lang/gl/denied.txt
@@ -1,4 +1,3 @@
====== Permiso Denegado ======
Sentímolo, mais non tes permisos de abondo para continuares.
-
diff --git a/inc/lang/gl/diff.txt b/inc/lang/gl/diff.txt
index df87707f0..087d880d8 100644
--- a/inc/lang/gl/diff.txt
+++ b/inc/lang/gl/diff.txt
@@ -1,4 +1,3 @@
====== Diferenzas ======
Isto amosa as diferenzas entre a revisión seleccionada e a versión actual da páxina.
-
diff --git a/inc/lang/gl/draft.txt b/inc/lang/gl/draft.txt
index ac36dc01a..c360e14e0 100644
--- a/inc/lang/gl/draft.txt
+++ b/inc/lang/gl/draft.txt
@@ -3,4 +3,3 @@
A túa última sesión de edición desta páxina non foi completada de xeito correcto. O DokuWiki gravou automaticamente un rascuño durante o teu traballo que agora podes usar para continuares coa edición. De seguido podes ver os datos que foron gardados da túa última sesión.
Por favor, escolle se queres //Recuperar// a túa sesión de edición perdida, //Eliminar// o borrador autogardado ou //Cancelar// o proceso de edición.
-
diff --git a/inc/lang/gl/edit.txt b/inc/lang/gl/edit.txt
index 1cc124300..ff7b6f19a 100644
--- a/inc/lang/gl/edit.txt
+++ b/inc/lang/gl/edit.txt
@@ -1,2 +1 @@
Edita a páxina e preme en ''Gardar''. Bótalle un ollo á [[wiki:syntax|sintaxe]] para veres a sintaxe do Wiki. Por favor, edita a páxina só se podes **mellorala**. Se quixeres facer probas, aprende como levar a cabo os teus primeiros pasos na [[playground:playground|eira]].
-
diff --git a/inc/lang/gl/index.txt b/inc/lang/gl/index.txt
index b0b100bda..c7f81e089 100644
--- a/inc/lang/gl/index.txt
+++ b/inc/lang/gl/index.txt
@@ -1,4 +1,3 @@
====== Índice ======
Isto é un índice de todas as páxinas dispoñíbeis, ordenadas por [[doku>namespaces|nomes de espazo]].
-
diff --git a/inc/lang/gl/install.html b/inc/lang/gl/install.html
index fdaaa175a..e422c74f7 100644
--- a/inc/lang/gl/install.html
+++ b/inc/lang/gl/install.html
@@ -1,25 +1,7 @@
-<p>Esta páxina é unha axuda na primeira vez que se instala e configura o
-<a href="http://dokuwiki.org">Dokuwiki</a>. Se queres máis información
-verbo deste instalador está dispoñible na súa propia
-<a href="http://dokuwiki.org/installer">páxina de documentación</a>.</p>
+<p>Esta páxina é unha axuda na primeira vez que se instala e configura o <a href="http://dokuwiki.org">Dokuwiki</a>. Se queres máis información 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,
-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
-usar unha hospedaxe, a través do FTP ou do panel de control da túa hospedaxe (p.e.
-o cPanel).</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, 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 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
-<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
-administración do mesmo.</p>
+<p>Este instalador configurará o teu DokuWiki para o uso da <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 administración do mesmo.</p>
-<p>Os usuarios expertos ou con requisitos especiais de configuración poden visitar
-as seguintes ligazóns para obter pormenores relativos ás
-<a href="http://dokuwiki.org/install">instruccións de instalación</a>
-e á <a href="http://dokuwiki.org/config">configuración</a>.</p>
+<p>Os usuarios expertos ou con requisitos especiais de configuración poden visitar as seguintes ligazóns para obter pormenores relativos ás <a href="http://dokuwiki.org/install">instruccións de instalación</a> e á <a href="http://dokuwiki.org/config">configuración</a>.</p>
diff --git a/inc/lang/gl/login.txt b/inc/lang/gl/login.txt
index 506b30c6a..c6c46b5ad 100644
--- a/inc/lang/gl/login.txt
+++ b/inc/lang/gl/login.txt
@@ -1,4 +1,3 @@
====== Inicio de Sesión ======
Actualmente non iniciaches sesión ningunha! Insire as túas credenciais de identificación para iniciares a sesión. Debes ter as cookies activadas para poderes iniciar unha sesión.
-
diff --git a/inc/lang/gl/newpage.txt b/inc/lang/gl/newpage.txt
index c073f1194..10c84aa1a 100644
--- a/inc/lang/gl/newpage.txt
+++ b/inc/lang/gl/newpage.txt
@@ -1,4 +1,3 @@
====== Este tema aínda non existe ======
-Seguiches unha ligazón deica un tema que aínda non existe. Se tes permisos axeitados, podes crealo ti premendo no botón ''Crear esta páxina''.
-
+Seguiches unha ligazón deica un tema que aínda non existe. Se tes permisos axeitados, podes crealo ti premendo no botón **Crear esta páxina**.
diff --git a/inc/lang/gl/norev.txt b/inc/lang/gl/norev.txt
index af7383da8..eed1118f8 100644
--- a/inc/lang/gl/norev.txt
+++ b/inc/lang/gl/norev.txt
@@ -1,4 +1,3 @@
======Non hai tal revisión======
A revisión especificada non existe. Utiliza o botón de ''Revisións Antigas'' para obteres unha listaxe das revisións antigas deste documento.
-
diff --git a/inc/lang/gl/preview.txt b/inc/lang/gl/preview.txt
index e0f749ff0..6d4a283c0 100644
--- a/inc/lang/gl/preview.txt
+++ b/inc/lang/gl/preview.txt
@@ -1,4 +1,3 @@
====== Previsualización ======
-Isto é unha previsualización de como aparecerá o teu texto. Lembra: **Non está gardado** aínda!
-
+Isto é unha previsualización de como aparecerá o teu texto. **Lembra: Non está gardado aínda**!
diff --git a/inc/lang/gl/pwconfirm.txt b/inc/lang/gl/pwconfirm.txt
index 8185560bd..c8005bfb2 100644
--- a/inc/lang/gl/pwconfirm.txt
+++ b/inc/lang/gl/pwconfirm.txt
@@ -1,11 +1,9 @@
Ola @FULLNAME@!
-Alguén solicitou un novo contrasinal para o teu inicio de sesión
-@TITLE@ en @DOKUWIKIURL@
+Alguén solicitou un novo contrasinal para o teu inicio de sesión @TITLE@ en @DOKUWIKIURL@
Se non fuches ti quen o fixo podes ignorar este correo-e.
-Para confirmares que esta solicitude foi realmente enviada por ti,
-por favor, visita a seguinte ligazón.
+Para confirmares que esta solicitude foi realmente enviada por ti, por favor, visita a seguinte ligazón.
@CONFIRM@
diff --git a/inc/lang/gl/read.txt b/inc/lang/gl/read.txt
index 28f3e1a95..a4ec3a564 100644
--- a/inc/lang/gl/read.txt
+++ b/inc/lang/gl/read.txt
@@ -1,2 +1 @@
Esta páxina é só de lectura. Podes ver o código fonte, mais non podes mudala. Coméntallo ao teu administrador se consideras que é un erro.
-
diff --git a/inc/lang/gl/recent.txt b/inc/lang/gl/recent.txt
index 622e4d938..1cd6c3b1b 100644
--- a/inc/lang/gl/recent.txt
+++ b/inc/lang/gl/recent.txt
@@ -1,5 +1,3 @@
====== Trocos Recentes ======
-As seguintes páxinas foron mudadas recentemente.
-
-
+As seguintes páxinas foron mudadas recentemente:
diff --git a/inc/lang/gl/register.txt b/inc/lang/gl/register.txt
index 4f51f3878..99422dd25 100644
--- a/inc/lang/gl/register.txt
+++ b/inc/lang/gl/register.txt
@@ -1,4 +1,3 @@
====== Rexistro como novo usuario ======
Cubre toda a información requirida a continuación para creares unha nova conta neste wiki. Asegúrate de forneceres un **enderezo de correo-e válido** - se non se che pide aquí que insiras un contrasinal, recibirás un novo nese enderezo. O nome de usuario deberá ser un [[doku>pagename|nome de páxina]] válido.
-
diff --git a/inc/lang/gl/resetpwd.txt b/inc/lang/gl/resetpwd.txt
index d3d64e90d..558f9e5eb 100644
--- a/inc/lang/gl/resetpwd.txt
+++ b/inc/lang/gl/resetpwd.txt
@@ -1,3 +1,3 @@
====== Establecer novo contrasinal ======
-Por favor introduzca un novo contrasinal para a súa conta neste wiki. \ No newline at end of file
+Por favor introduzca un novo contrasinal para a súa conta neste wiki.
diff --git a/inc/lang/gl/revisions.txt b/inc/lang/gl/revisions.txt
index 3d5cccd7f..488cda722 100644
--- a/inc/lang/gl/revisions.txt
+++ b/inc/lang/gl/revisions.txt
@@ -1,4 +1,3 @@
======Revisións Antigas======
Estas son as revisións antigas do documento actual. Para retomar unha revisión antiga selecciónaa na seguinte lista, preme en ''Editar esta páxina'' e gárdaa.
-
diff --git a/inc/lang/gl/searchpage.txt b/inc/lang/gl/searchpage.txt
index 6c8849355..053db9833 100644
--- a/inc/lang/gl/searchpage.txt
+++ b/inc/lang/gl/searchpage.txt
@@ -1,4 +1,3 @@
====== Procura ======
Podes atopar os resultados da túa procura a continuación. @CREATEPAGEINFO@
-
diff --git a/inc/lang/gl/stopwords.txt b/inc/lang/gl/stopwords.txt
index 5520cd275..3813aaa64 100644
--- a/inc/lang/gl/stopwords.txt
+++ b/inc/lang/gl/stopwords.txt
@@ -683,6 +683,7 @@ visto
volta
vosa
wink
+www
xeito
xeitos
xente
diff --git a/inc/lang/gl/updateprofile.txt b/inc/lang/gl/updateprofile.txt
index 8620dea12..adc8e2435 100644
--- a/inc/lang/gl/updateprofile.txt
+++ b/inc/lang/gl/updateprofile.txt
@@ -1,5 +1,3 @@
====== Actualizar o perfil da túa conta ======
Só precisas cubrir os campos que desexes mudar. Non podes mudar o teu nome de usuario.
-
-
diff --git a/inc/lang/gl/wordblock.txt b/inc/lang/gl/wordblock.txt
deleted file mode 100644
index ec8d67aff..000000000
--- a/inc/lang/gl/wordblock.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-====== Bloqueo por Correo-lixo ======
-
-Os teus trocos **non** foron gardados porque conteñen unha ou varias verbas bloqueadas. Se tentaches deixar correo-lixo no wiki -- Estívoche ben! Se consideras que é un erro, contacta co administrador deste Wiki.
-
diff --git a/inc/lang/he/admin.txt b/inc/lang/he/admin.txt
index ada73e5d4..6a166d92f 100644
--- a/inc/lang/he/admin.txt
+++ b/inc/lang/he/admin.txt
@@ -1,4 +1,3 @@
====== ניהול ======
ניתן למצוא מטה רשימה של משימות ניהול זמינות ב-DokuWiki.
-
diff --git a/inc/lang/he/conflict.txt b/inc/lang/he/conflict.txt
index c1cccdfcf..8b46d18a8 100644
--- a/inc/lang/he/conflict.txt
+++ b/inc/lang/he/conflict.txt
@@ -3,4 +3,3 @@
ישנה גרסה עדכנית יותר של המסמך. מצב כזה קורה כאשר משתמש אחר שינה את המסמך בזמן שערכת אותו.
מומלץ לעיין בהבדלים המופיעים להלן ולאחר מכן להחליט איזו גרסה כדאי לשמור. לחיצה על הכפתור "שמירה" תשמור את הגרסה שערכת. לחיצה על הכפתור "ביטול" תשמור את הגרסה הקיימת.
-
diff --git a/inc/lang/he/denied.txt b/inc/lang/he/denied.txt
index a2e19f3c5..a64b1f201 100644
--- a/inc/lang/he/denied.txt
+++ b/inc/lang/he/denied.txt
@@ -1,4 +1,3 @@
====== הרשאה נדחתה ======
אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך.
-
diff --git a/inc/lang/he/diff.txt b/inc/lang/he/diff.txt
index f1216bb4a..c779086d9 100644
--- a/inc/lang/he/diff.txt
+++ b/inc/lang/he/diff.txt
@@ -1,4 +1,3 @@
====== הבדלים ======
כאן מוצגים ההבדלים בין הגרסה שנבחרה והגרסה הנוכחית של הדף.
-
diff --git a/inc/lang/he/draft.txt b/inc/lang/he/draft.txt
index b999cc187..5699fe8e8 100644
--- a/inc/lang/he/draft.txt
+++ b/inc/lang/he/draft.txt
@@ -2,4 +2,4 @@
העריכה האחרונה שבוצעה לדף זה לא הושלמה כראוי. DokuWiki שמר באופן אוטומטי טיוטה של העבודה ובאפשרותך להשתמש בה כדי להמשיך את העריכה. ניתן לראות להלן את הנתונים שנשמרו מהפעם הקודמת.
-באפשרותך לבחור ב//שחזור הטיוטה// של אותה עריכה //מחיקת הטיוטה// או //ביטול// העריכה כליל. \ No newline at end of file
+באפשרותך לבחור ב//שחזור הטיוטה// של אותה עריכה //מחיקת הטיוטה// או //ביטול// העריכה כליל.
diff --git a/inc/lang/he/editrev.txt b/inc/lang/he/editrev.txt
index e33001fa3..ad5121f1f 100644
--- a/inc/lang/he/editrev.txt
+++ b/inc/lang/he/editrev.txt
@@ -1,2 +1,2 @@
**הדף שנפתח הוא גרסה ישנה של המסמך!** לחיצה על הלחצן "שמירה" תשחזר את המסמך לגרסה המוצגת כעת.
----- \ No newline at end of file
+----
diff --git a/inc/lang/he/index.txt b/inc/lang/he/index.txt
index 4b0623f84..f98e1f451 100644
--- a/inc/lang/he/index.txt
+++ b/inc/lang/he/index.txt
@@ -1,4 +1,3 @@
====== מפת אתר ======
-זהו קובץ מפת אתר הנמצא מעל לכל הדפים המאורגנים ב[[ויקי:דוקיוויקי]].
-
+זהו קובץ מפת אתר הנמצא מעל לכל הדפים המאורגנים ב[[doku>namespace|מתחמים]].
diff --git a/inc/lang/he/install.html b/inc/lang/he/install.html
index e2cc179cf..66e3844db 100644
--- a/inc/lang/he/install.html
+++ b/inc/lang/he/install.html
@@ -1,13 +1,7 @@
-<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 או מנשק הניהול של המארח (cPanell לדוגמה).</p>
+<p>DokuWiki עושה שימוש בקבצים רגילים לשמירת דפי ויקי ומידע נוסף הקשור לדפים אלו (לדוגמה: תמונות, רשימות חיפוש, גרסאות קודמות וכו׳). לצורך תפקוד תקין DokuWiki <strong>חייב</strong> גישה לכתיבה לתיקיות המכילות קבצים אלו. תכנית התקנה זו אינה יכולה להגדיר הרשאות לתיקיות. פעולה זו צריכה בד״כ להתבצע ישירות משורת הפקודה או במקרה שנעשה שימוש בשרת מארח דרך FTP או מנשק הניהול של המארח (cPanell לדוגמה).</p>
-<p>מתקין זה יגדיר את תצורת ה־<abbr title="access control list">ACL</abbr> ב-DokuWiki שלך
-, זה בתורו מאפשר גישת מנהל לתפריט הניהול של DokuWiki כדי להתקין הרחבות, לנהל משתמשים, לנהל גישות לדפי ויקי ושינויים בהגדרות התצורה.
-אין הוא הכרחי לתפקוד DokuWiki אך הוא יהפוך את Dokuwiki לפשוט יותר לניהול.</p>
+<p>מתקין זה יגדיר את תצורת ה־<abbr title="access control list">ACL</abbr> ב-DokuWiki שלך , זה בתורו מאפשר גישת מנהל לתפריט הניהול של DokuWiki כדי להתקין הרחבות, לנהל משתמשים, לנהל גישות לדפי ויקי ושינויים בהגדרות התצורה. אין הוא הכרחי לתפקוד DokuWiki אך הוא יהפוך את Dokuwiki לפשוט יותר לניהול.</p>
-<p>על משתמשים מנוסים או כאלו עם דרישות מיוחדות להתקנה להשתמש בקישורים אלו לפרטים בנוגע ל<a href="http://dokuwiki.org/install">הוראות התקנה</a> ול<a href="http://dokuwiki.org/config">הגדרות תצורה</a>.</p>
+<p>על משתמשים מנוסים או כאלו עם דרישות מיוחדות להתקנה להשתמש בקישורים אלו לפרטים בנוגע ל<a href="http://dokuwiki.org/install">הוראות התקנה</a> ו <a href="http://dokuwiki.org/config">הגדרות תצורה</a>.</p>
diff --git a/inc/lang/he/newpage.txt b/inc/lang/he/newpage.txt
index ac6fb7386..68a5388a5 100644
--- a/inc/lang/he/newpage.txt
+++ b/inc/lang/he/newpage.txt
@@ -1,3 +1,3 @@
====== דף זה עדיין לא קיים ======
-הדף אליו הגעת עדיין לא קיים. לחיצה על הכפתור "יצירת דף" תצור אותו. \ No newline at end of file
+הדף אליו הגעת עדיין לא קיים. לחיצה על הכפתור **יצירת דף** תצור אותו.
diff --git a/inc/lang/he/norev.txt b/inc/lang/he/norev.txt
index 3d08e16db..916682f89 100644
--- a/inc/lang/he/norev.txt
+++ b/inc/lang/he/norev.txt
@@ -1,4 +1,3 @@
====== גרסה לא קיימת ======
הגרסה שהוזנה אינה קיימת. נא להשתמש בכפתור ''גרסאות קודמות'' להצגת רשימת הגרסאות של מסמך זה.
-
diff --git a/inc/lang/he/preview.txt b/inc/lang/he/preview.txt
index 1331c23ad..06d0a409c 100644
--- a/inc/lang/he/preview.txt
+++ b/inc/lang/he/preview.txt
@@ -1,4 +1,3 @@
====== תצוגה מקדימה ======
-זו תצוגה מקדימה של הדף לעתיד. להזכירך: **הדף עדיין לא נשמר!**
-
+זו תצוגה מקדימה של הדף לעתיד. להזכירך: **הדף עדיין לא נשמר**!
diff --git a/inc/lang/he/read.txt b/inc/lang/he/read.txt
index 18efc5e03..2d747badd 100644
--- a/inc/lang/he/read.txt
+++ b/inc/lang/he/read.txt
@@ -1,2 +1 @@
דף זה הוא דף לקריאה בלבד. ניתן לצפות בקוד המקור שלו, אך לא ניתן לערוך אותו. ניתן לפנות למנהל הוויקי אם לדעתך נפלה טעות.
-
diff --git a/inc/lang/he/recent.txt b/inc/lang/he/recent.txt
index 0febd96e5..0c9bf1539 100644
--- a/inc/lang/he/recent.txt
+++ b/inc/lang/he/recent.txt
@@ -1,5 +1,3 @@
====== שינויים אחרונים ======
-הדפים הבאים עברו שינויים לאחרונה.
-
-
+הדפים הבאים עברו שינויים לאחרונה:
diff --git a/inc/lang/he/resendpwd.txt b/inc/lang/he/resendpwd.txt
index 8ca27207b..e885e4dde 100644
--- a/inc/lang/he/resendpwd.txt
+++ b/inc/lang/he/resendpwd.txt
@@ -1,4 +1,3 @@
====== שליחת ססמה חדשה ======
יש להזין את שם המשתמש בטופס מטה ולבקש ססמה חדשה לחשבון שלך בוויקי זה. הקישור לאימות יישלח לכתובת הדוא״ל באמצעותה נרשמת.
-
diff --git a/inc/lang/he/resetpwd.txt b/inc/lang/he/resetpwd.txt
index bd7b5ace4..d049c6fd0 100644
--- a/inc/lang/he/resetpwd.txt
+++ b/inc/lang/he/resetpwd.txt
@@ -1,3 +1,3 @@
====== קבע סיסמה חדשה ======
-אנא הכנס סיסמה חדשה לחשבון שלך בויקי זה. \ No newline at end of file
+אנא הכנס סיסמה חדשה לחשבון שלך בויקי זה.
diff --git a/inc/lang/he/revisions.txt b/inc/lang/he/revisions.txt
index 6b23402f5..6987fbb16 100644
--- a/inc/lang/he/revisions.txt
+++ b/inc/lang/he/revisions.txt
@@ -1,4 +1,3 @@
====== גרסאות ישנות ======
אלה גרסאות מוקדמות יותר של המסמך הנוכחי. כדי לשחזר גרסה מוקדמת יותר יש ללחוץ על הכפתור ''עריכה'' ולשמור את הדף.
-
diff --git a/inc/lang/he/searchpage.txt b/inc/lang/he/searchpage.txt
index 574629b17..51903d9ee 100644
--- a/inc/lang/he/searchpage.txt
+++ b/inc/lang/he/searchpage.txt
@@ -1,4 +1,3 @@
====== חיפוש ======
ניתן לראות את תוצאות החיפוש למטה. @CREATEPAGEINFO@
-
diff --git a/inc/lang/he/showrev.txt b/inc/lang/he/showrev.txt
index 22ca0c3ae..2f735500b 100644
--- a/inc/lang/he/showrev.txt
+++ b/inc/lang/he/showrev.txt
@@ -1,2 +1,2 @@
**זו גרסה ישנה של המסמך!** לחיצה על כותרת המסמך תציג את גרסתו הנוכחית.
----- \ No newline at end of file
+----
diff --git a/inc/lang/he/updateprofile.txt b/inc/lang/he/updateprofile.txt
index 494d8389d..6b680a68d 100644
--- a/inc/lang/he/updateprofile.txt
+++ b/inc/lang/he/updateprofile.txt
@@ -1,5 +1,3 @@
====== עידכון פרטי חשבונך ======
אין צורך למלא מעבר לפרטים המיועדים לשינוי. לא ניתן לשנות את שם המשתמש.
-
-
diff --git a/inc/lang/hi/diff.txt b/inc/lang/hi/diff.txt
index 6f88c1985..ec5ca3b86 100644
--- a/inc/lang/hi/diff.txt
+++ b/inc/lang/hi/diff.txt
@@ -1,3 +1,3 @@
======असमानता======
-यह आपको पृष्ठ के दो संस्करणों के बीच असमानता को दर्शाता है. \ No newline at end of file
+यह आपको पृष्ठ के दो संस्करणों के बीच असमानता को दर्शाता है.
diff --git a/inc/lang/hr/denied.txt b/inc/lang/hr/denied.txt
index 0613b5831..910cdb5ab 100644
--- a/inc/lang/hr/denied.txt
+++ b/inc/lang/hr/denied.txt
@@ -1,4 +1,3 @@
====== Niste ovlašteni ======
Nemate potrebne ovlasti za nastavak.
-
diff --git a/inc/lang/hr/diff.txt b/inc/lang/hr/diff.txt
index 295397ac4..821164362 100644
--- a/inc/lang/hr/diff.txt
+++ b/inc/lang/hr/diff.txt
@@ -1,3 +1,3 @@
====== Razlike ======
-Slijede razlike između dviju inačica stranice
+Slijede razlike između dviju inačica stranice.
diff --git a/inc/lang/hr/draft.txt b/inc/lang/hr/draft.txt
index 6caa26e1d..a25d532d9 100644
--- a/inc/lang/hr/draft.txt
+++ b/inc/lang/hr/draft.txt
@@ -1,4 +1,5 @@
====== Pronađen prethodni pokušaj izmjena ======
Vaše zadnje uređivanje ove stranice nije završilo uredno. DokuWiki je automatski pohranio kopiju tijekom rada koju sada možete iskoristiti da nastavite uređivanje. Niže možete vidjeti sadržaj koji je pohranjen pri vašem zadnjem uređivanju.
+
Molimo odlučite da li želite //vratiti// ili //obrisati// pohranjeni sadržaj pri vašem zadnjem neuspjelom uređivanju, ili pak želite //odustati// od uređivanja.
diff --git a/inc/lang/hr/editrev.txt b/inc/lang/hr/editrev.txt
index 9ac656e47..517e0a683 100644
--- a/inc/lang/hr/editrev.txt
+++ b/inc/lang/hr/editrev.txt
@@ -1,2 +1,2 @@
**Učitali ste stariju inačicu dokumenta!** Ukoliko je pohranite - biti će kreirana nova inačica dokumenta.
----- \ No newline at end of file
+----
diff --git a/inc/lang/hr/newpage.txt b/inc/lang/hr/newpage.txt
index 39346580f..5f85ff2ff 100644
--- a/inc/lang/hr/newpage.txt
+++ b/inc/lang/hr/newpage.txt
@@ -1,3 +1,3 @@
====== Dokument ne postoji ======
-Traženi dokument (još) ne postoji. Ukoliko ga želite otvoriti kliknite na ''Novi dokument''.
+Traženi dokument (još) ne postoji. Ukoliko ga želite otvoriti kliknite na **Novi dokument**.
diff --git a/inc/lang/hr/preview.txt b/inc/lang/hr/preview.txt
index 4289f4d92..ce4a805a7 100644
--- a/inc/lang/hr/preview.txt
+++ b/inc/lang/hr/preview.txt
@@ -1,3 +1,3 @@
====== Pregled ======
-Ovo je pregled kako će izgledati Vaš dokument nakon što se pohrani.
+Ovo je pregled kako će izgledati **Vaš dokument nakon što se pohrani**.
diff --git a/inc/lang/hr/read.txt b/inc/lang/hr/read.txt
index 221f1b200..691d3e4c0 100644
--- a/inc/lang/hr/read.txt
+++ b/inc/lang/hr/read.txt
@@ -1 +1 @@
-Ova stranica se može samo čitati. Možete vidjeti kod, ali ga ne možete mijenjati. Javite se vašem administratoru ako se s tim ne slažete. \ No newline at end of file
+Ova stranica se može samo čitati. Možete vidjeti kod, ali ga ne možete mijenjati. Javite se vašem administratoru ako se s tim ne slažete.
diff --git a/inc/lang/hr/recent.txt b/inc/lang/hr/recent.txt
index 4145ca1c5..6f8f65173 100644
--- a/inc/lang/hr/recent.txt
+++ b/inc/lang/hr/recent.txt
@@ -1,3 +1,3 @@
====== Nedavne izmjene ======
-Stranice koje su nedavno promijenjene.
+Stranice koje su nedavno promijenjene:
diff --git a/inc/lang/hr/resetpwd.txt b/inc/lang/hr/resetpwd.txt
index 8d92e51d2..ffb272204 100644
--- a/inc/lang/hr/resetpwd.txt
+++ b/inc/lang/hr/resetpwd.txt
@@ -1,3 +1,3 @@
====== Postavi novu lozinku ======
-Molimo unesite novu lozinku za Vašu korisničku prijavu na ovom wiki-u. \ No newline at end of file
+Molimo unesite novu lozinku za Vašu korisničku prijavu na ovom wiki-u.
diff --git a/inc/lang/hr/searchpage.txt b/inc/lang/hr/searchpage.txt
index 14c050960..362dd9789 100644
--- a/inc/lang/hr/searchpage.txt
+++ b/inc/lang/hr/searchpage.txt
@@ -1,4 +1,3 @@
====== Pretraživanja ======
Možete naći rezultat vaše pretrage u nastavku. @CREATEPAGEINFO@
-
diff --git a/inc/lang/hu-formal/admin.txt b/inc/lang/hu-formal/admin.txt
index b661bfb17..69771f638 100644
--- a/inc/lang/hu-formal/admin.txt
+++ b/inc/lang/hu-formal/admin.txt
@@ -1,3 +1,3 @@
===== Beállítások =====
-Alább találja a DokuWiki-ben elérhető beállítási lehetőségek listáját. \ No newline at end of file
+Alább találja a DokuWiki-ben elérhető beállítási lehetőségek listáját.
diff --git a/inc/lang/hu-formal/backlinks.txt b/inc/lang/hu-formal/backlinks.txt
index 437eb2e25..b6507a733 100644
--- a/inc/lang/hu-formal/backlinks.txt
+++ b/inc/lang/hu-formal/backlinks.txt
@@ -1,3 +1,3 @@
====== Hivatkozások ======
-Mindazon oldalak listája, amelyek az aktuális oldalra hivatkoznak. \ No newline at end of file
+Mindazon oldalak listája, amelyek az aktuális oldalra hivatkoznak.
diff --git a/inc/lang/hu-formal/conflict.txt b/inc/lang/hu-formal/conflict.txt
index 6718d67e6..ba12d4a75 100644
--- a/inc/lang/hu-formal/conflict.txt
+++ b/inc/lang/hu-formal/conflict.txt
@@ -2,4 +2,4 @@
Az Ön által szerkesztett oldalnak már egy újabb változata érhető el. Ez akkor fordulhat elő, ha egy másik felhasználó módosította a dokumtemot, mialatt Ön is szerkesztette azt.
-Vizsgálja meg az alább látható eltéréseket, majd döntse el, melyik változatot tartja meg. Ha a "Mentés" gombot választja, az Ön verziója mentődik el. Kattintson a "Mégsem" gombra a jelenlegi változat megtartásához. \ No newline at end of file
+Vizsgálja meg az alább látható eltéréseket, majd döntse el, melyik változatot tartja meg. Ha a "Mentés" gombot választja, az Ön verziója mentődik el. Kattintson a "Mégsem" gombra a jelenlegi változat megtartásához.
diff --git a/inc/lang/hu-formal/denied.txt b/inc/lang/hu-formal/denied.txt
index d56a18117..510bcfb6f 100644
--- a/inc/lang/hu-formal/denied.txt
+++ b/inc/lang/hu-formal/denied.txt
@@ -1,4 +1,3 @@
====== Hozzáférés megtadadva ======
Sajnáljuk, de nincs joga a folytatáshoz.
-
diff --git a/inc/lang/hu-formal/diff.txt b/inc/lang/hu-formal/diff.txt
index f922a504a..aa430be21 100644
--- a/inc/lang/hu-formal/diff.txt
+++ b/inc/lang/hu-formal/diff.txt
@@ -1,3 +1,3 @@
====== Eltérések ======
-Az oldal két változata közötti különbségek az alábbiak. \ No newline at end of file
+Az oldal két változata közötti különbségek az alábbiak.
diff --git a/inc/lang/hu-formal/draft.txt b/inc/lang/hu-formal/draft.txt
index 9233eacad..a68506d63 100644
--- a/inc/lang/hu-formal/draft.txt
+++ b/inc/lang/hu-formal/draft.txt
@@ -2,4 +2,4 @@
Az Ön ezen az oldalon végzett utolsó szerkesztési művelete helytelenül fejeződött be. A DokuWiki automatikusan elmentett egy piszkozatot az Ön munkája során. Alább láthatók az utolsó munkafázis mentett adatai.
-Kérjük, döntse el, hogy //helyreállítja-e// a befejezetlen módosításokat, vagy //törli// az automatikusan mentett piszkozatot, vagy //megszakítja// a szerkesztési folyamatot. \ No newline at end of file
+Kérjük, döntse el, hogy //helyreállítja-e// a befejezetlen módosításokat, vagy //törli// az automatikusan mentett piszkozatot, vagy //megszakítja// a szerkesztési folyamatot.
diff --git a/inc/lang/hu-formal/edit.txt b/inc/lang/hu-formal/edit.txt
index 08f648ba6..eaf30bfa9 100644
--- a/inc/lang/hu-formal/edit.txt
+++ b/inc/lang/hu-formal/edit.txt
@@ -1 +1 @@
-Módosítsa az oldalt, majd kattintson a "Mentés" gombra. A wiki-szintaxishoz nézze meg a [[wiki:syntax|szintaxis]] oldalt. Kérjük, csak akkor módosítsa az oldalt, ha **tökéletesíteni**, **javítani** tudja. Amennyiben szeretne kipróbálni ezt-azt, a [[playground:playground|játszótéren]] megtanulhatja az első lépéseket. \ No newline at end of file
+Módosítsa az oldalt, majd kattintson a "Mentés" gombra. A wiki-szintaxishoz nézze meg a [[wiki:syntax|szintaxis]] oldalt. Kérjük, csak akkor módosítsa az oldalt, ha **tökéletesíteni**, **javítani** tudja. Amennyiben szeretne kipróbálni ezt-azt, a [[playground:playground|játszótéren]] megtanulhatja az első lépéseket.
diff --git a/inc/lang/hu-formal/editrev.txt b/inc/lang/hu-formal/editrev.txt
index 2eca33c7a..c8034ea0b 100644
--- a/inc/lang/hu-formal/editrev.txt
+++ b/inc/lang/hu-formal/editrev.txt
@@ -1,2 +1,2 @@
**A dokumentum egy korábbi változatát töltötte be!** Ha az oldalt elmenti, akkor egy új változat jön létre belőle.
----- \ No newline at end of file
+----
diff --git a/inc/lang/hu-formal/index.txt b/inc/lang/hu-formal/index.txt
index 0f2b18fd2..ead091f5f 100644
--- a/inc/lang/hu-formal/index.txt
+++ b/inc/lang/hu-formal/index.txt
@@ -1,3 +1,3 @@
====== Oldaltérkép (tartalom) ======
-Az összes elérhető oldal [[doku>namespaces|névterek]] szerint rendezett oldaltérképe. \ No newline at end of file
+Az összes elérhető oldal [[doku>hu:namespaces|névterek]] szerint rendezett oldaltérképe.
diff --git a/inc/lang/hu/backlinks.txt b/inc/lang/hu/backlinks.txt
index d457ab769..a987d9663 100644
--- a/inc/lang/hu/backlinks.txt
+++ b/inc/lang/hu/backlinks.txt
@@ -1,5 +1,3 @@
====== Hivatkozások ======
Ez azoknak az oldalaknak a listája, amelyek erre az oldalra "visszamutatnak" (hivatkoznak).
-
-
diff --git a/inc/lang/hu/conflict.txt b/inc/lang/hu/conflict.txt
index b823465b3..14a651019 100644
--- a/inc/lang/hu/conflict.txt
+++ b/inc/lang/hu/conflict.txt
@@ -3,5 +3,3 @@
Az általad szerkesztett dokumentumnak egy újabb változata létezik. Ez akkor történik, ha egy másik felhasználó megváltoztatta a dokumentumot, amíg szerkesztetted.
Nézd át gondosan a lenti eltéréseket, aztán dönts arról, melyik változatot tartod meg. Ha ''Mentés'' gombot választod, akkor a Te változatod kerül mentésre. Nyomj ''Mégsem'' gombot a jelenlegi változat megtartásához.
-
-
diff --git a/inc/lang/hu/denied.txt b/inc/lang/hu/denied.txt
index 922cbb895..ff95c8419 100644
--- a/inc/lang/hu/denied.txt
+++ b/inc/lang/hu/denied.txt
@@ -1,4 +1,3 @@
====== Hozzáférés megtagadva ======
Sajnáljuk, nincs jogod a folytatáshoz.
-
diff --git a/inc/lang/hu/diff.txt b/inc/lang/hu/diff.txt
index 50bd067e9..a212f2db5 100644
--- a/inc/lang/hu/diff.txt
+++ b/inc/lang/hu/diff.txt
@@ -1,4 +1,3 @@
====== Különbségek ======
A kiválasztott változat és az aktuális verzió közötti különbségek a következők.
-
diff --git a/inc/lang/hu/draft.txt b/inc/lang/hu/draft.txt
index cae980aa5..3a0895427 100644
--- a/inc/lang/hu/draft.txt
+++ b/inc/lang/hu/draft.txt
@@ -2,4 +2,4 @@
Az oldal utolsó szerkesztését nem fejezted be rendesen. A DokuWiki elmentette piszkozatként, így most folytathatod a szerkesztést. Lent látható, amit az utolsó szerkesztésből elmentettünk.
-Válassz a //helyreállítás// vagy a //törlés// opciók közül a piszkozat sorsát illetően vagy //megszakíthatod// a szerkesztési folyamatot. \ No newline at end of file
+Válassz a //helyreállítás// vagy a //törlés// opciók közül a piszkozat sorsát illetően vagy //megszakíthatod// a szerkesztési folyamatot.
diff --git a/inc/lang/hu/index.txt b/inc/lang/hu/index.txt
index ebf15148d..88154ef1a 100644
--- a/inc/lang/hu/index.txt
+++ b/inc/lang/hu/index.txt
@@ -1,4 +1,3 @@
====== Áttekintő (index) ======
-Az összes elérhető oldal áttekintése [[doku>namespaces|névterek]] szerint rendezve.
-
+Az összes elérhető oldal áttekintése [[doku>hu:namespaces|névterek]] szerint rendezve.
diff --git a/inc/lang/hu/install.html b/inc/lang/hu/install.html
index c0373932e..c8390d344 100644
--- a/inc/lang/hu/install.html
+++ b/inc/lang/hu/install.html
@@ -1,26 +1,7 @@
-<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ó
-<a href="http://dokuwiki.org/installer">ezen az oldalon</a>
-található.</p>
+<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ó <a href="http://dokuwiki.org/installer">ezen az oldalon</a> található.</p>
-<p>A DokuWiki hagyományos fájlokat használ a wiki oldalak és a hozzájuk
-kapcsolódó információk (pl. képek, keresési indexek, korábbi változatok stb.)
-tárolásához. Emiatt a sikeres működés érdekében a DokuWikinek írási joggal
-<strong>kell</strong> rendelkeznie azokon a könyvtárakon, ahová ezek a
-fájlok kerülnek. Ez a Beállító Varázsló nem képes beállítani a könyvtárakhoz
-a szükséges jogosultságokat, azokat közvetlenül parancssorból kell megtenni,
-illetve tárhelyszolgáltatás igénybevétele esetén FTP kliens segítségével,
-vagy a tárhelyszolgáltató által rendelkezésre bocsátott beállítóeszköz
-(pl. cPanel) segítségével.</p>
+<p>A DokuWiki hagyományos fájlokat használ a wiki oldalak és a hozzájuk kapcsolódó információk (pl. képek, keresési indexek, korábbi változatok stb.) tárolásához. Emiatt a sikeres működés érdekében a DokuWikinek írási joggal <strong>kell</strong> rendelkeznie azokon a könyvtárakon, ahová ezek a fájlok kerülnek. Ez a Beállító Varázsló nem képes beállítani a könyvtárakhoz a szükséges jogosultságokat, azokat közvetlenül parancssorból kell megtenni, illetve tárhelyszolgáltatás igénybevétele esetén FTP kliens segítségével, 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
-(<abbr title="access control list">ACL</abbr>-ek) használatára. Így
-az Adminisztrátor 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.
-Ez tulajdonképpen nem szükséges a DokuWiki működéséhez, de megkönnyíti
-az adminisztrációt.</p>
+<p>A Beállító Varázsló felkészíti ezt a DokuWikit a hozzáférési listák (<abbr title="access control list">ACL</abbr>-ek) használatára. Így az Adminisztrátor 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. Ez tulajdonképpen nem szükséges a DokuWiki működéséhez, de megkönnyíti az adminisztrációt.</p>
-<p>Szakértők illetve speciális beállítást igénylő felhasználók további információkat
-találnak a következő oldalakon a <a href="http://dokuwiki.org/install">telepítéssel</a>
-és <a href="http://dokuwiki.org/config">konfigurálási lehetőségekkel</a> kapcsolatban.</p>
+<p>Szakértők illetve speciális beállítást igénylő felhasználók további információkat találnak a következő oldalakon a <a href="http://dokuwiki.org/install">telepítéssel</a> és <a href="http://dokuwiki.org/config">konfigurálási lehetőségekkel</a> kapcsolatban.</p>
diff --git a/inc/lang/hu/locked.txt b/inc/lang/hu/locked.txt
index 004c46191..5612e8167 100644
--- a/inc/lang/hu/locked.txt
+++ b/inc/lang/hu/locked.txt
@@ -1,4 +1,3 @@
====== Az oldal zárolva ======
Ezt az oldalt épp szerkeszti egy másik felhasználó. Várnod kell, amíg a másik felhasználó befejezi, vagy amíg a zárolási ideje le nem jár.
-
diff --git a/inc/lang/hu/login.txt b/inc/lang/hu/login.txt
index 3f7e62e72..ce606c02e 100644
--- a/inc/lang/hu/login.txt
+++ b/inc/lang/hu/login.txt
@@ -1,5 +1,3 @@
====== Belépés ======
Nem vagy bejelentkezve! Add meg az azonosítási adataid a belépéshez lentebb! A böngésződben engedélyezned kell a sütik (cookies) fogadását a belépéshez.
-
-
diff --git a/inc/lang/hu/newpage.txt b/inc/lang/hu/newpage.txt
index de5a34d8e..68c3b7f4a 100644
--- a/inc/lang/hu/newpage.txt
+++ b/inc/lang/hu/newpage.txt
@@ -1,3 +1,3 @@
====== Ilyen oldal még nem létezik ======
-Egy nem létező oldalra tévedtél. Létrehozhatod az ''Oldal létrehozása'' gombra kattintva. \ No newline at end of file
+Egy nem létező oldalra tévedtél. Létrehozhatod az **Oldal létrehozása** gombra kattintva.
diff --git a/inc/lang/hu/norev.txt b/inc/lang/hu/norev.txt
index 1f4e6725b..ad38c8747 100644
--- a/inc/lang/hu/norev.txt
+++ b/inc/lang/hu/norev.txt
@@ -1,5 +1,3 @@
====== Nincs ilyen változat ======
A megadott változat nem létezik. Használd az ''Előző változatok'' gombot az előzmények listájának megtekintéséhez.
-
-
diff --git a/inc/lang/hu/preview.txt b/inc/lang/hu/preview.txt
index e04b2c838..050b669e2 100644
--- a/inc/lang/hu/preview.txt
+++ b/inc/lang/hu/preview.txt
@@ -1,3 +1,3 @@
====== Előnézet ======
-Ez a szöveged előnézete, így fog kinézni élesben. Viszont ez **még nincs elmentve**!
+Ez a szöveged előnézete, így fog kinézni élesben. **Viszont ez még nincs elmentve**!
diff --git a/inc/lang/hu/pwconfirm.txt b/inc/lang/hu/pwconfirm.txt
index 203dc3975..c88c8ec6d 100644
--- a/inc/lang/hu/pwconfirm.txt
+++ b/inc/lang/hu/pwconfirm.txt
@@ -1,11 +1,9 @@
Szia @FULLNAME@!
-Te vagy más valaki kért egy új jelszót a @DOKUWIKIURL@
-címen lévő @TITLE@ wiki felhasználódhoz.
+Te vagy más valaki kért egy új jelszót a @DOKUWIKIURL@ címen lévő @TITLE@ wiki felhasználódhoz.
Ha nem kértél ilyet, hagyd figyelmen kívül ezt a levelet.
-Ha Te voltál, az új jelszó kérelmed megerősítéséhez kattints a
-következő linkre vagy másold a böngésződbe:
+Ha Te voltál, az új jelszó kérelmed megerősítéséhez kattints a következő linkre vagy másold a böngésződbe:
@CONFIRM@
diff --git a/inc/lang/hu/recent.txt b/inc/lang/hu/recent.txt
index 4e0c1ec06..85e9f9eeb 100644
--- a/inc/lang/hu/recent.txt
+++ b/inc/lang/hu/recent.txt
@@ -1,5 +1,3 @@
====== Legutóbbi változások ======
-Az alábbi oldalak változtak legutoljára.
-
-
+Az alábbi oldalak változtak legutoljára:
diff --git a/inc/lang/hu/register.txt b/inc/lang/hu/register.txt
index 523b720e7..0fe5144ae 100644
--- a/inc/lang/hu/register.txt
+++ b/inc/lang/hu/register.txt
@@ -1,4 +1,3 @@
====== Új felhasználó regisztrálása ======
-Töltsd ki az összes alábbi adatot az új Wiki felhasználói azonosítód létrehozásához. Győződj meg róla, hogy **érvényes e-mail címet** adtál meg, mivel az új jelszavad erre a címre küldjük el. Az azonosítód érvényes [[doku>pagename|oldalnév]] kell legyen.
-
+Töltsd ki az összes alábbi adatot az új Wiki felhasználói azonosítód létrehozásához. Győződj meg róla, hogy **érvényes e-mail címet** adtál meg, mivel az új jelszavad erre a címre küldjük el. Az azonosítód érvényes [[doku>hu:pagename|oldalnév]] kell legyen.
diff --git a/inc/lang/hu/resendpwd.txt b/inc/lang/hu/resendpwd.txt
index b73fa42b2..235ce0c6b 100644
--- a/inc/lang/hu/resendpwd.txt
+++ b/inc/lang/hu/resendpwd.txt
@@ -1,3 +1,3 @@
===== Új jelszó kérése =====
-Kérlek, add meg a felhasználói azonosítód az új jelszó elküldéséhez. A jelszó cseréjéhez szükséges megerősítő linket elküldjük a regisztrált e-mail címedre. \ No newline at end of file
+Kérlek, add meg a felhasználói azonosítód az új jelszó elküldéséhez. A jelszó cseréjéhez szükséges megerősítő linket elküldjük a regisztrált e-mail címedre.
diff --git a/inc/lang/hu/resetpwd.txt b/inc/lang/hu/resetpwd.txt
index 53b28d75c..c10cecb31 100644
--- a/inc/lang/hu/resetpwd.txt
+++ b/inc/lang/hu/resetpwd.txt
@@ -1,3 +1,3 @@
====== Új jelszó beállítása ======
-Kérlek, add meg az új jelszót a felhasználódhoz. \ No newline at end of file
+Kérlek, add meg az új jelszót a felhasználódhoz.
diff --git a/inc/lang/hu/searchpage.txt b/inc/lang/hu/searchpage.txt
index 6329a46d9..69a7db53c 100644
--- a/inc/lang/hu/searchpage.txt
+++ b/inc/lang/hu/searchpage.txt
@@ -1,4 +1,3 @@
====== Keresés ======
A keresés eredményét lentebb láthatod. @CREATEPAGEINFO@
-
diff --git a/inc/lang/hu/stopwords.txt b/inc/lang/hu/stopwords.txt
index a8bd35c7d..fe72cde07 100644
--- a/inc/lang/hu/stopwords.txt
+++ b/inc/lang/hu/stopwords.txt
@@ -2,38 +2,39 @@
# Ha szerkeszted ezt a fájlt, győződj meg arról, hogy UNIX sorvég-jeleket használj! (csak NL karakter)
# Nincs szükség 3 karakternél rövidebb szavak felsorolására, ezeket egyébként sem vesszük figyelembe.
# Ez a lista a http://www.ranks.nl/stopwords/ oldalon szereplő alapján készült
+át
+én
+és
+ön
+össze
+ők
a
az
-egy
be
+csak
+de
+egy
+el
+fel
+hát
+hogy
+ide
+igen
ki
le
-fel
+lesz
meg
-el
-át
-rá
-ide
+mi
+mint
+nem
oda
+rá
szét
-össze
-vissza
-de
-hát
-és
+te
+ti
vagy
-hogy
van
-lesz
+vissza
volt
-csak
-nem
-igen
-mint
-én
-te
-mi
-ti
-ők
-ön
+www
diff --git a/inc/lang/ia/backlinks.txt b/inc/lang/ia/backlinks.txt
index de5d2ac56..14a559a95 100644
--- a/inc/lang/ia/backlinks.txt
+++ b/inc/lang/ia/backlinks.txt
@@ -1,3 +1,3 @@
====== Retroligamines ======
-Isto es un lista de paginas que contine ligamines de retorno al pagina actual. \ No newline at end of file
+Isto es un lista de paginas que contine ligamines de retorno al pagina actual.
diff --git a/inc/lang/ia/denied.txt b/inc/lang/ia/denied.txt
index 82f2fc668..3d938abed 100644
--- a/inc/lang/ia/denied.txt
+++ b/inc/lang/ia/denied.txt
@@ -1,4 +1,3 @@
====== Permission refusate ======
Pardono, tu non ha le derectos requisite pro continuar.
-
diff --git a/inc/lang/ia/diff.txt b/inc/lang/ia/diff.txt
index dbfa70f13..daa94f4a9 100644
--- a/inc/lang/ia/diff.txt
+++ b/inc/lang/ia/diff.txt
@@ -1,3 +1,3 @@
====== Differentias ======
-Isto te monstra le differentias inter duo versiones del pagina. \ No newline at end of file
+Isto te monstra le differentias inter duo versiones del pagina.
diff --git a/inc/lang/ia/draft.txt b/inc/lang/ia/draft.txt
index ae8de13f4..feed2a8ac 100644
--- a/inc/lang/ia/draft.txt
+++ b/inc/lang/ia/draft.txt
@@ -2,4 +2,4 @@
Tu ultime session de modification in iste pagina non ha essite concludite correctemente. DokuWiki ha automaticamente salveguardate un version provisori durante tu labor. Ora tu pote usar iste version provisori pro continuar le modification. Hic infra tu vide le datos salveguardate de tu ultime session.
-Per favor decide si tu vole //recuperar// le session de modification perdite, //deler// le version provisori o //cancellar// le processo de modification. \ No newline at end of file
+Per favor decide si tu vole //recuperar// le session de modification perdite, //deler// le version provisori o //cancellar// le processo de modification.
diff --git a/inc/lang/ia/edit.txt b/inc/lang/ia/edit.txt
index 5bc58362a..5c80bb0cd 100644
--- a/inc/lang/ia/edit.txt
+++ b/inc/lang/ia/edit.txt
@@ -1 +1 @@
-Modifica le pagina e preme "Salveguardar". Vide [[wiki:syntax]] pro le syntaxe wiki. Per favor modifica le paginas solmente si tu pote **meliorar** lo. Si tu vole testar alcun cosas, apprende facer tu prime passos in le [[playground:playground|parco de jocos]]. \ No newline at end of file
+Modifica le pagina e preme "Salveguardar". Vide [[wiki:syntax]] pro le syntaxe wiki. Per favor modifica le paginas solmente si tu pote **meliorar** lo. Si tu vole testar alcun cosas, apprende facer tu prime passos in le [[playground:playground|parco de jocos]].
diff --git a/inc/lang/ia/editrev.txt b/inc/lang/ia/editrev.txt
index 192381f8c..b147b55d9 100644
--- a/inc/lang/ia/editrev.txt
+++ b/inc/lang/ia/editrev.txt
@@ -1,2 +1,2 @@
**Tu ha cargate un version ancian del documento!** Si tu lo salveguarda, tu crea un nove version con iste datos.
----- \ No newline at end of file
+----
diff --git a/inc/lang/ia/install.html b/inc/lang/ia/install.html
index 3b48bfd34..cb8420e47 100644
--- a/inc/lang/ia/install.html
+++ b/inc/lang/ia/install.html
@@ -1,13 +1,7 @@
-<p>Iste pagina te assiste in le prime installation e configuration de
-<a href="http://dokuwiki.org">Dokuwiki</a>. Ulterior informationes super iste installator es disponibile in le
-<a href="http://dokuwiki.org/installer">pagina de documentation</a> de illo.</p>
+<p>Iste pagina te assiste in le prime installation e configuration de <a href="http://dokuwiki.org">Dokuwiki</a>. Ulterior informationes super iste installator es disponibile in le <a href="http://dokuwiki.org/installer">pagina de documentation</a> de illo.</p>
-<p>DokuWiki usa files ordinari pro le immagazinage de paginas wiki e altere informationes associate con iste paginas (p.ex. imagines, indices de recerca, versiones ancian, etc). Pro poter functionar, DokuWiki
-<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>DokuWiki usa files ordinari pro le immagazinage de paginas wiki e altere informationes associate con iste paginas (p.ex. imagines, indices de recerca, versiones ancian, etc). Pro poter functionar, DokuWiki <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
-<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>Iste installator configurara tu installation de DokuWiki pro <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>
-e <a href="http://dokuwiki.org/config">configurationes</a>.</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> e <a href="http://dokuwiki.org/config">configurationes</a>.</p>
diff --git a/inc/lang/ia/locked.txt b/inc/lang/ia/locked.txt
index 726aabb34..38c714fb6 100644
--- a/inc/lang/ia/locked.txt
+++ b/inc/lang/ia/locked.txt
@@ -1,3 +1,3 @@
====== Pagina serrate ======
-Iste pagina es actualmente serrate proque un altere usator lo modifica in iste momento. Tu debe attender usque iste usator fini le modification o usque al expiration del serratura. \ No newline at end of file
+Iste pagina es actualmente serrate proque un altere usator lo modifica in iste momento. Tu debe attender usque iste usator fini le modification o usque al expiration del serratura.
diff --git a/inc/lang/ia/login.txt b/inc/lang/ia/login.txt
index 4c428f358..46a22cbbc 100644
--- a/inc/lang/ia/login.txt
+++ b/inc/lang/ia/login.txt
@@ -1,3 +1,3 @@
====== Aperir session ======
-Tu non es identificate! Entra tu credentiales de authentication pro aperir un session. Tu debe haber activate le cookies pro aperir un session. \ No newline at end of file
+Tu non es identificate! Entra tu credentiales de authentication pro aperir un session. Tu debe haber activate le cookies pro aperir un session.
diff --git a/inc/lang/ia/newpage.txt b/inc/lang/ia/newpage.txt
index 8db7aa797..c6e42a013 100644
--- a/inc/lang/ia/newpage.txt
+++ b/inc/lang/ia/newpage.txt
@@ -1,3 +1,3 @@
====== Iste topico non existe ancora ======
-Tu ha sequite un ligamine verso un topico que non existe ancora. Si tu ha le permission requisite, tu pote crear lo con le button "Crear iste pagina". \ No newline at end of file
+Tu ha sequite un ligamine verso un topico que non existe ancora. Si tu ha le permission requisite, tu pote crear lo con le button **Crear iste pagina**.
diff --git a/inc/lang/ia/norev.txt b/inc/lang/ia/norev.txt
index 75e44b969..67a6e8df9 100644
--- a/inc/lang/ia/norev.txt
+++ b/inc/lang/ia/norev.txt
@@ -1,3 +1,3 @@
====== Version non existe ======
-Le version specificate non existe. Usa le button "Versiones ancian" pro un lista de versiones ancian de iste documento. \ No newline at end of file
+Le version specificate non existe. Usa le button "Versiones ancian" pro un lista de versiones ancian de iste documento.
diff --git a/inc/lang/ia/preview.txt b/inc/lang/ia/preview.txt
index 22b958baf..1b5b06988 100644
--- a/inc/lang/ia/preview.txt
+++ b/inc/lang/ia/preview.txt
@@ -1,3 +1,3 @@
====== Previsualisation ======
-Isto es un previsualisation de tu texto. Memora: le pagina **non** ha ancora essite salveguardate! \ No newline at end of file
+Isto es un previsualisation de tu texto. **Memora: le pagina non ha ancora essite salveguardate**!
diff --git a/inc/lang/ia/pwconfirm.txt b/inc/lang/ia/pwconfirm.txt
index c8e3d002c..c194d81f2 100644
--- a/inc/lang/ia/pwconfirm.txt
+++ b/inc/lang/ia/pwconfirm.txt
@@ -1,7 +1,6 @@
Salute @FULLNAME@!
-Alcuno ha requestate un nove contrasigno pro tu conto de @TITLE@
-a @DOKUWIKIURL@
+Alcuno ha requestate un nove contrasigno pro tu conto de @TITLE@ a @DOKUWIKIURL@
Si tu non ha requestate un nove contrasigno, alora simplemente ignora iste message.
diff --git a/inc/lang/ia/read.txt b/inc/lang/ia/read.txt
index e7e80dbfc..bfc987707 100644
--- a/inc/lang/ia/read.txt
+++ b/inc/lang/ia/read.txt
@@ -1 +1 @@
-Iste pagina es pro lectura solmente. Tu pote vider le codice-fonte, ma non modificar lo. Contacta tu administrator si tu pensa que isto es errate. \ No newline at end of file
+Iste pagina es pro lectura solmente. Tu pote vider le codice-fonte, ma non modificar lo. Contacta tu administrator si tu pensa que isto es errate.
diff --git a/inc/lang/ia/recent.txt b/inc/lang/ia/recent.txt
index ba39c3ff5..8426bed3c 100644
--- a/inc/lang/ia/recent.txt
+++ b/inc/lang/ia/recent.txt
@@ -1,3 +1,3 @@
====== Modificationes recente ======
-Le sequente paginas ha essite modificate recentemente. \ No newline at end of file
+Le sequente paginas ha essite modificate recentemente:
diff --git a/inc/lang/ia/resendpwd.txt b/inc/lang/ia/resendpwd.txt
index 97bcac02a..2b8b3e4db 100644
--- a/inc/lang/ia/resendpwd.txt
+++ b/inc/lang/ia/resendpwd.txt
@@ -1,3 +1,3 @@
====== Inviar nove contrasigno ======
-Per favor entra tu nomine de usator in le formulario hic infra pro requestar un nove contrasigno pro tu conto in iste wiki. Un ligamine de confirmation essera inviate a tu adresse de e-mail registrate. \ No newline at end of file
+Per favor entra tu nomine de usator in le formulario hic infra pro requestar un nove contrasigno pro tu conto in iste wiki. Un ligamine de confirmation essera inviate a tu adresse de e-mail registrate.
diff --git a/inc/lang/ia/revisions.txt b/inc/lang/ia/revisions.txt
index e914edb61..4f89cbeae 100644
--- a/inc/lang/ia/revisions.txt
+++ b/inc/lang/ia/revisions.txt
@@ -1,3 +1,3 @@
====== Versiones ancian ======
-Ecce le versiones ancian del documento presente. Pro reverter lo a un version ancian, selige un version del lista in basso, clicca "Modificar iste pagina" e salveguarda lo. \ No newline at end of file
+Ecce le versiones ancian del documento presente. Pro reverter lo a un version ancian, selige un version del lista in basso, clicca "Modificar iste pagina" e salveguarda lo.
diff --git a/inc/lang/ia/searchpage.txt b/inc/lang/ia/searchpage.txt
index 7e093d27f..06a89f77c 100644
--- a/inc/lang/ia/searchpage.txt
+++ b/inc/lang/ia/searchpage.txt
@@ -1,4 +1,3 @@
====== Recerca ======
Le resultatos de tu recerca se trova hic infra. @CREATEPAGEINFO@
-
diff --git a/inc/lang/ia/showrev.txt b/inc/lang/ia/showrev.txt
index 60ee2a7f6..3ac33147d 100644
--- a/inc/lang/ia/showrev.txt
+++ b/inc/lang/ia/showrev.txt
@@ -1,2 +1,2 @@
**Isto es un version ancian del documento!**
----- \ No newline at end of file
+----
diff --git a/inc/lang/ia/updateprofile.txt b/inc/lang/ia/updateprofile.txt
index 3968d3cde..ab0928f9e 100644
--- a/inc/lang/ia/updateprofile.txt
+++ b/inc/lang/ia/updateprofile.txt
@@ -1,3 +1,3 @@
====== Actualisa le profilo de tu conto ======
-Solmente es necessari completar le campos que tu vole cambiar. Non es possibile cambiar tu nomine de usator. \ No newline at end of file
+Solmente es necessari completar le campos que tu vole cambiar. Non es possibile cambiar tu nomine de usator.
diff --git a/inc/lang/id/admin.txt b/inc/lang/id/admin.txt
index 8cb25edb6..21c9a953a 100644
--- a/inc/lang/id/admin.txt
+++ b/inc/lang/id/admin.txt
@@ -1,4 +1,3 @@
====== Administrasi ======
Berikut ini adalah daftar pekerjaan administratif yang dapat Anda temukan di DokuWiki.
-
diff --git a/inc/lang/id/adminplugins.txt b/inc/lang/id/adminplugins.txt
index 2a91b3d1a..82ddd938b 100644
--- a/inc/lang/id/adminplugins.txt
+++ b/inc/lang/id/adminplugins.txt
@@ -1 +1 @@
-=====Plugin Tambahan===== \ No newline at end of file
+===== Plugin Tambahan ===== \ No newline at end of file
diff --git a/inc/lang/id/conflict.txt b/inc/lang/id/conflict.txt
index 236e8b6e9..0ec08c459 100644
--- a/inc/lang/id/conflict.txt
+++ b/inc/lang/id/conflict.txt
@@ -3,4 +3,3 @@
Versi terbaru dari dokumen yang baru saja Anda Edit telah ada. Ini terjadi ketika user lain telah selesai mengubah halaman, saat Anda sedang meng-edit.
Pertimbangkan perbedaan yang ditampilkan dibawah ini, kemudian putuskan versi mana yang harus disimpan. Jika Anda memilih "Simpan", versi (tulisan terbaru) Andalah yang akan disimpan. Tekan "Batal" to menggunakan versi tulisan yang telah ada.
-
diff --git a/inc/lang/id/denied.txt b/inc/lang/id/denied.txt
index ff09c13c4..1a880a134 100644
--- a/inc/lang/id/denied.txt
+++ b/inc/lang/id/denied.txt
@@ -1,4 +1,3 @@
====== Akses Ditolak ======
Maaf, Anda tidak mempunyai hak akses untuk melanjutkan.
-
diff --git a/inc/lang/id/diff.txt b/inc/lang/id/diff.txt
index eee1e5a58..b71e5b0ad 100644
--- a/inc/lang/id/diff.txt
+++ b/inc/lang/id/diff.txt
@@ -1,4 +1,3 @@
====== Perbedaan ======
Ini menunjukkan perbedaan antara versi yang terpilih dengan versi yang sedang aktif.
-
diff --git a/inc/lang/id/edit.txt b/inc/lang/id/edit.txt
index a32803c44..61927490d 100644
--- a/inc/lang/id/edit.txt
+++ b/inc/lang/id/edit.txt
@@ -1,2 +1 @@
Ubah isi halaman kemudian tekan "Simpan". Lihat [[wiki:syntax]] untuk sintaks-sintaks Wiki. Mohon edit/ubah halaman sesuai dengan judul halamannya. Bila Anda masih ragu untuk menulis di halaman ini, silahkan bermain-main di [[playground:playground|tamanbermain]].
-
diff --git a/inc/lang/id/editrev.txt b/inc/lang/id/editrev.txt
index e6d247c7a..52f37174a 100644
--- a/inc/lang/id/editrev.txt
+++ b/inc/lang/id/editrev.txt
@@ -1,2 +1,2 @@
**Anda telah membuka dokumen versi lama!** Jika menyimpannya, berarti Anda akan membuat versi baru dari data ini.
----- \ No newline at end of file
+----
diff --git a/inc/lang/id/index.txt b/inc/lang/id/index.txt
index 88bbb12e4..71da208cc 100644
--- a/inc/lang/id/index.txt
+++ b/inc/lang/id/index.txt
@@ -1,4 +1,3 @@
====== Index ======
Berikut ini adalah index dari keseluruhan halaman yang ada, diurutkan berdasar [[doku>namespaces|namespaces]].
-
diff --git a/inc/lang/id/install.html b/inc/lang/id/install.html
index 4e288b334..e4058b154 100644
--- a/inc/lang/id/install.html
+++ b/inc/lang/id/install.html
@@ -1,25 +1,7 @@
-<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
-<a href="http://dokuwiki.org/installer">halaman dokumentasi</a> sendiri.</p>
+<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 <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
-<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>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
-<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>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>.
-untuk hal-hal yang berhubungan dengan instalasi dan konfigurasi.</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>. 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 dc9d66259..61f279839 100644
--- a/inc/lang/id/lang.php
+++ b/inc/lang/id/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author rusly-id <rusly-id@users.noreply.github.com>
* @author mubaidillah <mubaidillah@gmail.com>
* @author Irwan Butar Butar <irwansah.putra@gmail.com>
* @author Yustinus Waruwu <juswaruwu@gmail.com>
@@ -64,43 +65,6 @@ $lang['badlogin'] = 'Maaf, username atau password salah.';
$lang['badpassconfirm'] = 'Maaf, password salah';
$lang['minoredit'] = 'Perubahan Minor';
$lang['draftdate'] = 'Simpan draft secara otomatis';
-$lang['regmissing'] = 'Maaf, Anda harus mengisi semua field.';
-$lang['reguexists'] = 'Maaf, user dengan user login ini telah ada.';
-$lang['regsuccess'] = 'User telah didaftarkan dan password telah dikirim ke email Anda.';
-$lang['regsuccess2'] = 'User telah dibuatkan.';
-$lang['regmailfail'] = 'Kami menemukan kesalahan saat mengirimkan password ke alamat email Anda. Mohon hubungi administrator.';
-$lang['regbadmail'] = 'Alamat email yang Anda masukkan tidak valid - jika menurut Anda hal ini adalah kesalahan sistem, mohon hubungi admin.';
-$lang['regbadpass'] = 'Passwod yang dimasukkan tidak sama. Silahkan ulangi lagi.';
-$lang['regpwmail'] = 'Password DokuWiki Anda';
-$lang['reghere'] = 'Anda belum mempunyai account? silahkan ';
-$lang['profna'] = 'Wiki ini tidak mengijinkan perubahan profil.';
-$lang['profnochange'] = 'Tidak ada perubahan.';
-$lang['profnoempty'] = 'Mohon mengisikan nama atau alamat email.';
-$lang['profchanged'] = 'Profil User berhasil diubah.';
-$lang['profnodelete'] = 'Wiki ini tidak mendukung penghapusan pengguna';
-$lang['profdeleteuser'] = 'Hapus Akun';
-$lang['profdeleted'] = 'Akun anda telah dihapus dari wiki ini';
-$lang['profconfdelete'] = 'Saya berharap menghapus akun saya dari wiki ini.
-Aksi ini tidak bisa diselesaikan.';
-$lang['profconfdeletemissing'] = 'Knfirmasi check box tidak tercentang';
-$lang['pwdforget'] = 'Lupa Password? Dapatkan yang baru';
-$lang['resendna'] = 'Wiki ini tidak mendukung pengiriman ulang password.';
-$lang['resendpwd'] = 'Atur password baru';
-$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.';
-$lang['resendpwdconfirm'] = 'Link konfirmasi telah dikirim melalui email.';
-$lang['resendpwdsuccess'] = 'Password baru Anda telah dikirim melalui email.';
-$lang['license'] = 'Kecuali jika dinyatakan lain, konten pada wiki ini dilisensikan dibawah lisensi berikut:';
-$lang['licenseok'] = 'Catatan: Dengan menyunting halaman ini, Anda setuju untuk melisensikan konten Anda dibawah lisensi berikut:';
-$lang['searchmedia'] = 'Cari nama file:';
-$lang['searchmedia_in'] = 'Cari di %s';
-$lang['txt_upload'] = 'File yang akan diupload:';
-$lang['txt_filename'] = 'Masukkan nama wiki (opsional):';
-$lang['txt_overwrt'] = 'File yang telah ada akan ditindih';
-$lang['maxuploadsize'] = 'Unggah maks. %s per berkas';
-$lang['lockedby'] = 'Sedang dikunci oleh:';
-$lang['lockexpire'] = 'Penguncian artikel sampai dengan:';
$lang['js']['willexpire'] = 'Halaman yang sedang Anda kunci akan berakhir dalam waktu kurang lebih satu menit.\nUntuk menghindari konflik, gunakan tombol Preview untuk me-reset timer pengunci.';
$lang['js']['notsavedyet'] = 'Perubahan yang belum disimpan akan hilang.\nYakin akan dilanjutkan?';
$lang['js']['searchmedia'] = 'Cari file';
@@ -142,6 +106,43 @@ $lang['js']['media_done_btn'] = 'Selesai';
$lang['js']['media_drop'] = 'Tarik file disini untuk mengunggah';
$lang['js']['media_cancel'] = 'Buang';
$lang['js']['media_overwrt'] = 'Timpa berkas yang ada';
+$lang['regmissing'] = 'Maaf, Anda harus mengisi semua field.';
+$lang['reguexists'] = 'Maaf, user dengan user login ini telah ada.';
+$lang['regsuccess'] = 'User telah didaftarkan dan password telah dikirim ke email Anda.';
+$lang['regsuccess2'] = 'User telah dibuatkan.';
+$lang['regmailfail'] = 'Kami menemukan kesalahan saat mengirimkan password ke alamat email Anda. Mohon hubungi administrator.';
+$lang['regbadmail'] = 'Alamat email yang Anda masukkan tidak valid - jika menurut Anda hal ini adalah kesalahan sistem, mohon hubungi admin.';
+$lang['regbadpass'] = 'Passwod yang dimasukkan tidak sama. Silahkan ulangi lagi.';
+$lang['regpwmail'] = 'Password DokuWiki Anda';
+$lang['reghere'] = 'Anda belum mempunyai account? silahkan ';
+$lang['profna'] = 'Wiki ini tidak mengijinkan perubahan profil.';
+$lang['profnochange'] = 'Tidak ada perubahan.';
+$lang['profnoempty'] = 'Mohon mengisikan nama atau alamat email.';
+$lang['profchanged'] = 'Profil User berhasil diubah.';
+$lang['profnodelete'] = 'Wiki ini tidak mendukung penghapusan pengguna';
+$lang['profdeleteuser'] = 'Hapus Akun';
+$lang['profdeleted'] = 'Akun anda telah dihapus dari wiki ini';
+$lang['profconfdelete'] = 'Saya berharap menghapus akun saya dari wiki ini.
+Aksi ini tidak bisa diselesaikan.';
+$lang['profconfdeletemissing'] = 'Knfirmasi check box tidak tercentang';
+$lang['pwdforget'] = 'Lupa Password? Dapatkan yang baru';
+$lang['resendna'] = 'Wiki ini tidak mendukung pengiriman ulang password.';
+$lang['resendpwd'] = 'Atur password baru';
+$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.';
+$lang['resendpwdconfirm'] = 'Link konfirmasi telah dikirim melalui email.';
+$lang['resendpwdsuccess'] = 'Password baru Anda telah dikirim melalui email.';
+$lang['license'] = 'Kecuali jika dinyatakan lain, konten pada wiki ini dilisensikan dibawah lisensi berikut:';
+$lang['licenseok'] = 'Catatan: Dengan menyunting halaman ini, Anda setuju untuk melisensikan konten Anda dibawah lisensi berikut:';
+$lang['searchmedia'] = 'Cari nama file:';
+$lang['searchmedia_in'] = 'Cari di %s';
+$lang['txt_upload'] = 'File yang akan diupload:';
+$lang['txt_filename'] = 'Masukkan nama wiki (opsional):';
+$lang['txt_overwrt'] = 'File yang telah ada akan ditindih';
+$lang['maxuploadsize'] = 'Unggah maks. %s per berkas';
+$lang['lockedby'] = 'Sedang dikunci oleh:';
+$lang['lockexpire'] = 'Penguncian artikel sampai dengan:';
$lang['rssfailed'] = 'Error terjadi saat mengambil feed: ';
$lang['nothingfound'] = 'Tidak menemukan samasekali.';
$lang['mediaselect'] = 'Pilihan Mediafile';
@@ -308,5 +309,5 @@ $lang['media_restore'] = 'Kembalikan versi ini';
$lang['currentns'] = 'Namespace saat ini';
$lang['searchresult'] = 'Hasil Pencarian';
$lang['wikimarkup'] = 'Markah Wiki';
-$lang['email_signature_text'] = 'Email ini dibuat otomatis oleh DokuWiki
+$lang['email_signature_text'] = 'Email ini dibuat otomatis oleh DokuWiki
@DOKUWIKIURL@';
diff --git a/inc/lang/id/login.txt b/inc/lang/id/login.txt
index f736e882b..ca919192f 100644
--- a/inc/lang/id/login.txt
+++ b/inc/lang/id/login.txt
@@ -1,4 +1,3 @@
====== Login ======
Anda belum login! Masukkan data autentifikasi dibawah ini untuk masuk log (login). Cookies harus diaktifkan agar bisa login.
-
diff --git a/inc/lang/id/newpage.txt b/inc/lang/id/newpage.txt
index 8d3f99d72..f2aaa86ef 100644
--- a/inc/lang/id/newpage.txt
+++ b/inc/lang/id/newpage.txt
@@ -1,3 +1,3 @@
====== Topik ini belum tersedia ======
-Belum ada artikel di halaman ini. Anda dapat membuat tulisan-tulisan baru di halaman ini dengan menekan tombol "Buat Halaman Baru" (lihat dibagian bawah...!)
+Belum ada artikel di halaman ini. Anda dapat membuat tulisan-tulisan baru di halaman ini dengan menekan tombol **Buat Halaman Baru** (lihat dibagian bawah...!)
diff --git a/inc/lang/id/norev.txt b/inc/lang/id/norev.txt
index 5244f8303..cd60cafa1 100644
--- a/inc/lang/id/norev.txt
+++ b/inc/lang/id/norev.txt
@@ -1,4 +1,3 @@
====== Revisi tidak tersedia ======
Revisi yang diinginkan tidak ada. Gunakan tombol ''Revisi Lama'' untuk menampilkan daftar revisi lama dari dokumen ini.
-
diff --git a/inc/lang/id/preview.txt b/inc/lang/id/preview.txt
index 1621946b1..73a145f8c 100644
--- a/inc/lang/id/preview.txt
+++ b/inc/lang/id/preview.txt
@@ -1,4 +1,3 @@
====== Preview ======
-Ini adalah preview tentang bagimana tulisan Anda akan ditampilkan. Ingat: tulisan ini **belum disimpan**!
-
+Ini adalah preview tentang bagimana tulisan Anda akan ditampilkan. **Ingat: tulisan ini belum disimpan**!
diff --git a/inc/lang/id/read.txt b/inc/lang/id/read.txt
index f78c0eb9d..f11d600db 100644
--- a/inc/lang/id/read.txt
+++ b/inc/lang/id/read.txt
@@ -1,2 +1 @@
Halaman ini hanya bisa dibaca. Anda bisa melihat sumbernya, tetapi tidak diperkenankan untuk mengubah. Hubungi administrator jika menemukan kesalahan pada halaman ini.
-
diff --git a/inc/lang/id/recent.txt b/inc/lang/id/recent.txt
index f7cf24443..ef8d461aa 100644
--- a/inc/lang/id/recent.txt
+++ b/inc/lang/id/recent.txt
@@ -1,5 +1,3 @@
====== Perubahan ======
-Berikut ini adalah halaman-halaman yang baru saja diubah.
-
-
+Berikut ini adalah halaman-halaman yang baru saja diubah:
diff --git a/inc/lang/id/register.txt b/inc/lang/id/register.txt
index dd8c578f0..289da68b3 100644
--- a/inc/lang/id/register.txt
+++ b/inc/lang/id/register.txt
@@ -1,4 +1,3 @@
====== Mendaftar sebagai anggota baru ======
Isikan semua informasi dibawah ini untuk membuat account baru di wiki ini. Pastikan Anda telah mengisikan **alamat email yang valid**, karena password akan dikirim melalui email ini. Nama login harus sesuai dengan aturan [[doku>pagename|pagename]].
-
diff --git a/inc/lang/id/resetpwd.txt b/inc/lang/id/resetpwd.txt
index 6ab26c866..43a0a9726 100644
--- a/inc/lang/id/resetpwd.txt
+++ b/inc/lang/id/resetpwd.txt
@@ -1,3 +1,3 @@
====== Atur sandi baru ======
-Silakan masukkan sandi baru untuk akun Anda di wiki ini. \ No newline at end of file
+Silakan masukkan sandi baru untuk akun Anda di wiki ini.
diff --git a/inc/lang/id/revisions.txt b/inc/lang/id/revisions.txt
index d82b2735f..b408b55e9 100644
--- a/inc/lang/id/revisions.txt
+++ b/inc/lang/id/revisions.txt
@@ -1,4 +1,3 @@
====== Revisi Lama ======
Ini adalah revisi-revisi lama dari dokumen ini. Untuk mengaktifkan kembali revisi lama, pilih dokumen revisi, kemudikan tekan "Edit halaman ini" lalu Simpan.
-
diff --git a/inc/lang/id/searchpage.txt b/inc/lang/id/searchpage.txt
index c03b6d729..5a04beb72 100644
--- a/inc/lang/id/searchpage.txt
+++ b/inc/lang/id/searchpage.txt
@@ -1,4 +1,3 @@
====== Pencarian ======
Anda dapat menemukan hasil pencarian dibawah ini. @CREATEPAGEINFO@
-
diff --git a/inc/lang/id/stopwords.txt b/inc/lang/id/stopwords.txt
index 73713c838..9b1ca7422 100644
--- a/inc/lang/id/stopwords.txt
+++ b/inc/lang/id/stopwords.txt
@@ -3,20 +3,26 @@
# No need to include words shorter than 3 chars - these are ignored anyway
# This list is based upon the ones found at http://www.ranks.nl/stopwords/
about
-are
+adalah
and
-you
-your
-them
-their
+are
com
+dan
for
from
-into
how
+into
+jika
+kemudian
+lalu
+maka
that
the
+their
+them
this
+und
+untuk
was
what
when
@@ -24,14 +30,7 @@ where
who
will
with
-und
-the
www
yang
-dan
-adalah
-untuk
-lalu
-maka
-kemudian
-jika
+you
+your
diff --git a/inc/lang/is/diff.txt b/inc/lang/is/diff.txt
index a6d246ad7..1b94e86a0 100644
--- a/inc/lang/is/diff.txt
+++ b/inc/lang/is/diff.txt
@@ -1,3 +1,3 @@
===== Breytingar =====
-Hér sést hvað hefur breyst á milli útgáfna. \ No newline at end of file
+Hér sést hvað hefur breyst á milli útgáfna.
diff --git a/inc/lang/is/lang.php b/inc/lang/is/lang.php
index 0af4c57a6..de74c8c09 100644
--- a/inc/lang/is/lang.php
+++ b/inc/lang/is/lang.php
@@ -1,5 +1,8 @@
<?php
+
/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
* is language file
*
* This file was initially built by fetching translations from other
@@ -8,6 +11,7 @@
* lines starting with @author
*
* @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesIs.php?view=co
+ *
* @author Hrannar Baldursson <hrannar.baldursson@gmail.com>
* @author Ólafur Gunnlaugsson <oli@audiotools.com>
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
@@ -50,6 +54,7 @@ $lang['btn_recover'] = 'Endurheimta uppkast';
$lang['btn_draftdel'] = 'Eyða uppkasti';
$lang['btn_revert'] = 'Endurheimta';
$lang['btn_register'] = 'Skráning';
+$lang['btn_img_backto'] = 'Aftur til %s';
$lang['loggedinas'] = 'Innskráning sem:';
$lang['user'] = 'Notendanafn';
$lang['pass'] = 'Aðgangsorð';
@@ -64,6 +69,11 @@ $lang['badlogin'] = 'Því miður, notandanafn eða aðgangsorð va
$lang['minoredit'] = 'Minniháttar breyting';
$lang['draftdate'] = 'Uppkast vistað sjálfkrafa';
$lang['nosecedit'] = 'Síðunni var breytt á meðan, upplýsingar um svæðið voru úreltar og öll síðan því endurhlaðin.';
+$lang['js']['searchmedia'] = 'Leita að skrám';
+$lang['js']['hidedetails'] = 'Fela upplýsingar';
+$lang['js']['linkwiz'] = 'Tengill-leiðsagnarforrit';
+$lang['js']['linkto'] = 'Tengja';
+$lang['js']['del_confirm'] = 'Á örugglega að eyða valdar skrár?';
$lang['regmissing'] = 'Afsakið, en þú verður að fylla út í allar eyður.';
$lang['reguexists'] = 'Afsakið, notandi með þessu nafni er þegar skráður inn.';
$lang['regsuccess'] = 'Notandi hefur verið búinn til og aðgangsorð sent í tölvupósti.';
@@ -106,11 +116,6 @@ $lang['uploadsize'] = 'Innhlaðið skrá var of stór. (Hámark eru %
$lang['deletesucc'] = 'Skrá %s hefur verið eytt.';
$lang['namespaces'] = 'Nafnrýmar';
$lang['mediafiles'] = 'Tiltækar skrár í';
-$lang['js']['searchmedia'] = 'Leita að skrám';
-$lang['js']['hidedetails'] = 'Fela upplýsingar';
-$lang['js']['linkwiz'] = 'Tengill-leiðsagnarforrit';
-$lang['js']['linkto'] = 'Tengja';
-$lang['js']['del_confirm'] = 'Á örugglega að eyða valdar skrár?';
$lang['mediaview'] = 'Sjá upprunalega skrá';
$lang['mediaroot'] = 'rót';
$lang['mediaextchange'] = 'Skrárending var breytt úr .%s til .%s!';
@@ -167,7 +172,6 @@ $lang['qb_chars'] = 'Sértækir stafir';
$lang['metaedit'] = 'Breyta lýsigögnum';
$lang['metasaveerr'] = 'Vistun lýsigagna mistókst';
$lang['metasaveok'] = 'Lýsigögn vistuð';
-$lang['btn_img_backto'] = 'Aftur til %s';
$lang['img_title'] = 'Heiti:';
$lang['img_caption'] = 'Skýringartexti:';
$lang['img_date'] = 'Dagsetning:';
diff --git a/inc/lang/is/login.txt b/inc/lang/is/login.txt
index 81e7e5e32..a8b0d297a 100644
--- a/inc/lang/is/login.txt
+++ b/inc/lang/is/login.txt
@@ -1,3 +1,3 @@
===== Innskráning =====
-Þú ert ekki skráður inn! Skráuðu þig inn hér að neðan. Athugaðu að vafrinn sem að þú notar verður að styðja móttöku smákaka. \ No newline at end of file
+Þú ert ekki skráður inn! Skráuðu þig inn hér að neðan. Athugaðu að vafrinn sem að þú notar verður að styðja móttöku smákaka.
diff --git a/inc/lang/is/recent.txt b/inc/lang/is/recent.txt
index 7d3cf5720..291cb9904 100644
--- a/inc/lang/is/recent.txt
+++ b/inc/lang/is/recent.txt
@@ -1,3 +1,3 @@
===== Nýlegar Breytingar =====
-Eftirfarandi síðum hefur nýlega verið breytt. \ No newline at end of file
+Eftirfarandi síðum hefur nýlega verið breytt:
diff --git a/inc/lang/is/resendpwd.txt b/inc/lang/is/resendpwd.txt
index b847b1d4d..08ad909fd 100644
--- a/inc/lang/is/resendpwd.txt
+++ b/inc/lang/is/resendpwd.txt
@@ -1,3 +1,3 @@
====== Senda nýtt aðgangsorð ======
-Vinsamlegast sláðu inn notendanafn þitt í formið hér fyrir neðan til að biðja um nýtt aðgangsorð fyrir reikninginn þinn í þessu wiki. A staðfesting hlekkur verður sendast á skráð netfang. \ No newline at end of file
+Vinsamlegast sláðu inn notendanafn þitt í formið hér fyrir neðan til að biðja um nýtt aðgangsorð fyrir reikninginn þinn í þessu wiki. A staðfesting hlekkur verður sendast á skráð netfang.
diff --git a/inc/lang/it/admin.txt b/inc/lang/it/admin.txt
index 95a611edc..55e854e21 100644
--- a/inc/lang/it/admin.txt
+++ b/inc/lang/it/admin.txt
@@ -1,4 +1,3 @@
====== Amministrazione ======
Qui sotto puoi trovare una lista delle possibili azioni amministrative attualmente disponibili in Dokuwiki.
-
diff --git a/inc/lang/it/backlinks.txt b/inc/lang/it/backlinks.txt
index ad5a9c23b..1af1359f1 100644
--- a/inc/lang/it/backlinks.txt
+++ b/inc/lang/it/backlinks.txt
@@ -1,4 +1,3 @@
====== Puntano qui ======
Questa è una lista delle pagine che sembrano avere un collegamento alla pagina attuale.
-
diff --git a/inc/lang/it/conflict.txt b/inc/lang/it/conflict.txt
index bcb90d28d..16af3e18f 100644
--- a/inc/lang/it/conflict.txt
+++ b/inc/lang/it/conflict.txt
@@ -3,4 +3,3 @@
Esiste una versione più recente del documento che hai modificato. Questo può accadere quando un altro utente ha già modificato il documento durante le tue modifiche.
Esamina le differenze mostrate di seguito, quindi decidi quale versione mantenere. Se scegli ''Salva'', la tua versione verrà salvata. Clicca su ''Annulla'' per mantenere la versione attuale.
-
diff --git a/inc/lang/it/denied.txt b/inc/lang/it/denied.txt
index 577d081ce..7ef8722f4 100644
--- a/inc/lang/it/denied.txt
+++ b/inc/lang/it/denied.txt
@@ -1,4 +1,3 @@
====== Accesso negato ======
Non hai i diritti per continuare.
-
diff --git a/inc/lang/it/diff.txt b/inc/lang/it/diff.txt
index 5a41eaaec..d4d89f1ef 100644
--- a/inc/lang/it/diff.txt
+++ b/inc/lang/it/diff.txt
@@ -1,4 +1,3 @@
====== Differenze ======
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
-
diff --git a/inc/lang/it/draft.txt b/inc/lang/it/draft.txt
index 479d0fafc..6468c7068 100644
--- a/inc/lang/it/draft.txt
+++ b/inc/lang/it/draft.txt
@@ -3,4 +3,3 @@
La tua ultima sessione di modifica su questa pagina non è stata completata correttamente. DokuWiki ha salvato in automatico una bozza durante il tuo lavoro, che puoi ora utilizzare per continuare le tue modifiche. Di seguito puoi trovare i dati che sono stati salvati dalla tua ultima sessione.
Decidi se vuoi //recuperare// la sessione di modifica, //eliminare// la bozza salavata in automatico oppure //annullare// le modifiche.
-
diff --git a/inc/lang/it/edit.txt b/inc/lang/it/edit.txt
index 8f2ba973a..16aef89e1 100644
--- a/inc/lang/it/edit.txt
+++ b/inc/lang/it/edit.txt
@@ -1,2 +1 @@
Modifica la pagina e clicca su ''Salva''. Vedi [[wiki:syntax]] per la sintassi riconosciuta dal Wiki. Modifica questa pagina solo se puoi **apportare dei miglioramenti**. Se vuoi solo fare degli esperimenti ed imparare come fare i primi passi usa [[playground:playground]].
-
diff --git a/inc/lang/it/editrev.txt b/inc/lang/it/editrev.txt
index 502320083..bd2550562 100644
--- a/inc/lang/it/editrev.txt
+++ b/inc/lang/it/editrev.txt
@@ -1,2 +1,2 @@
**Hai caricato una revisione precedente del documento!** Se salvi questa pagina creerai una nuova versione con questi dati.
----- \ No newline at end of file
+----
diff --git a/inc/lang/it/index.txt b/inc/lang/it/index.txt
index 52c6fbc5d..283f4dcd9 100644
--- a/inc/lang/it/index.txt
+++ b/inc/lang/it/index.txt
@@ -1,4 +1,3 @@
====== Indice ======
-Questo è un indice di tutte le pagine disponibili ordinate per [[doku>namespaces|categorie]].
-
+Questo è un indice di tutte le pagine disponibili ordinate per [[doku>it:namespaces|categorie]].
diff --git a/inc/lang/it/install.html b/inc/lang/it/install.html
index 9d0e57ff8..f1f27f939 100644
--- a/inc/lang/it/install.html
+++ b/inc/lang/it/install.html
@@ -1,24 +1,7 @@
-<p>Questa pagina ti assisterà durante l'installazione e la prima configurazione di
-<a href="http://dokuwiki.org">Dokuwiki</a>. Ulteriori informazioni sulla
-procedura di installazione sono reperibili nella
-<a href="http://dokuwiki.org/installer">pagina di documentazione</a>.</p>
+<p>Questa pagina ti assisterà durante l'installazione e la prima configurazione di <a href="http://dokuwiki.org">Dokuwiki</a>. Ulteriori informazioni sulla procedura di installazione sono reperibili nella <a href="http://dokuwiki.org/it:installer">pagina di documentazione</a>.</p>
-<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
-file. La procedura di installazione non è in grado di impostare i permessi sulle directory. Questo
-deve normalmente essere fatto direttamente da linea di comando oppure, se stai usando un servizio di hosting,
-attraverso FTP o dal pannello di controllo del servizio di hosting (es. cPanel).</p>
+<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 file. La procedura di installazione non è in grado di impostare i permessi sulle directory. Questo deve normalmente essere fatto direttamente da linea di comando oppure, se stai usando un servizio di hosting, 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
-<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
-da amministrare.</p>
+<p>Questa procedura di installazione imposterà la configurazione di DokuWiki per l'uso 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 da amministrare.</p>
-<p>Gli utenti esperti o con particolari esigenze di installazione dovrebbero far riferimento ai
-seguenti link per dettagli sulle
-<a href="http://dokuwiki.org/install">istruzioni per l'installazione</a>
-e sui <a href="http://dokuwiki.org/config">parametri di configurazione</a>.</p>
+<p>Gli utenti esperti o con particolari esigenze di installazione dovrebbero far riferimento ai seguenti link per dettagli sulle <a href="http://dokuwiki.org/it:install">istruzioni per l'installazione</a> e sui <a href="http://dokuwiki.org/it:config">parametri di configurazione</a>.</p>
diff --git a/inc/lang/it/lang.php b/inc/lang/it/lang.php
index 683ce45bd..9d9c1edd4 100644
--- a/inc/lang/it/lang.php
+++ b/inc/lang/it/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Roberto Bellingeri <bellingeri@netguru.it>
+ * @author Eddy <eddy@mail.it>
+ * @author Riccardo <riccardo.furlato@gmail.com>
+ * @author Stefano <stefano.stefano@gmail.com>
* @author damiano <damiano@spagnuolo.eu>
* @author Torpedo <dgtorpedo@gmail.com>
* @author Giorgio Vecchiocattivi <giorgio@vecchio.it>
@@ -21,7 +25,6 @@
* @author Francesco <francesco.cavalli@hotmail.com>
* @author Fabio <fabioslurp@yahoo.it>
* @author Maurizio <mcannavo@katamail.com>
- * @author Riccardo <riccardofila@gmail.com>
* @author Paolo <paolopoz12@gmail.com>
*/
$lang['encoding'] = 'utf-8';
@@ -135,6 +138,11 @@ $lang['search_contains'] = 'Contiene';
$lang['search_custom_match'] = 'Personalizza';
$lang['search_any_ns'] = 'Qualsiasi spazio dei nomi';
$lang['search_any_time'] = 'Ogni volta';
+$lang['search_past_7_days'] = 'scorsa settimana';
+$lang['search_past_month'] = 'scorso mese';
+$lang['search_past_year'] = 'scorso anno';
+$lang['search_sort_by_hits'] = 'ordinato per selezione';
+$lang['search_sort_by_mtime'] = 'ordinato per ultima modifica';
$lang['regmissing'] = 'Devi riempire tutti i campi.';
$lang['reguexists'] = 'Il nome utente inserito esiste già.';
$lang['regsuccess'] = 'L\'utente è stato creato. La password è stata spedita via email.';
diff --git a/inc/lang/it/login.txt b/inc/lang/it/login.txt
index c6fd97b6f..1dcb1ff76 100644
--- a/inc/lang/it/login.txt
+++ b/inc/lang/it/login.txt
@@ -1,4 +1,3 @@
====== Accesso ======
Non sei ancora collegato! Inserisci il tuo nome utente e la tua password per autenticarti. E' necessario che il tuo browser abbia i cookie abilitati.
-
diff --git a/inc/lang/it/newpage.txt b/inc/lang/it/newpage.txt
index d41601cfb..4470f9cbd 100644
--- a/inc/lang/it/newpage.txt
+++ b/inc/lang/it/newpage.txt
@@ -1,3 +1,3 @@
====== Questo argomento non esiste ancora ======
-Hai seguito un collegamento ad un argomento che non è ancora stato creato. Se vuoi puoi crearlo tu stesso usando il pulsante ''Crea questa pagina''.
+Hai seguito un collegamento ad un argomento che non è ancora stato creato. Se vuoi puoi crearlo tu stesso usando il pulsante **Crea questa pagina**.
diff --git a/inc/lang/it/onceexisted.txt b/inc/lang/it/onceexisted.txt
new file mode 100644
index 000000000..dfd1be06a
--- /dev/null
+++ b/inc/lang/it/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Questa pagina non esiste più ======
+
+Hai seguito un link ad una pagina che non esiste più. Puoi controllare la lista delle [[?do=revisions|vecchie revisioni]] per vedere quando e perchè è stata cancellata, accedere alle vecchie revisioni o ripristinarla. \ No newline at end of file
diff --git a/inc/lang/it/preview.txt b/inc/lang/it/preview.txt
index c3cf35246..fa0e0975d 100644
--- a/inc/lang/it/preview.txt
+++ b/inc/lang/it/preview.txt
@@ -1,5 +1,3 @@
====== Anteprima ======
-Questa è un'anteprima di come apparirà il tuo testo. Attenzione: **la pagina non è ancora stata salvata**!.
-
-
+Questa è un'anteprima di come apparirà il tuo testo. **Attenzione: la pagina non è ancora stata salvata**!
diff --git a/inc/lang/it/pwconfirm.txt b/inc/lang/it/pwconfirm.txt
index 3eb36fb67..13a8b45b0 100644
--- a/inc/lang/it/pwconfirm.txt
+++ b/inc/lang/it/pwconfirm.txt
@@ -1,11 +1,9 @@
Ciao @FULLNAME@!
-Qualcuno ha richiesto una nuova password per il tuo accesso
-@TITLE@ a @DOKUWIKIURL@
+Qualcuno ha richiesto una nuova password per il tuo accesso @TITLE@ a @DOKUWIKIURL@
Se non hai richiesto tu la nuova password ignora questa email.
-Per confermare che la richiesta è stata realmente inviata da te usa il
-seguente collegamento.
+Per confermare che la richiesta è stata realmente inviata da te usa il seguente collegamento.
@CONFIRM@
diff --git a/inc/lang/it/recent.txt b/inc/lang/it/recent.txt
index 4c29a9d52..87f20e897 100644
--- a/inc/lang/it/recent.txt
+++ b/inc/lang/it/recent.txt
@@ -1,4 +1,3 @@
====== Ultime modifiche ======
-Queste sono le ultime pagine modificate.
-
+Queste sono le ultime pagine modificate:
diff --git a/inc/lang/it/register.txt b/inc/lang/it/register.txt
index 5a336a971..f3dd8b490 100644
--- a/inc/lang/it/register.txt
+++ b/inc/lang/it/register.txt
@@ -1,3 +1,3 @@
====== Registrazione nuovo utente ======
-Riempi tutte le informazioni seguenti per creare un nuovo account in questo wiki. Assicurati di inserire un **indirizzo email valido** - a meno che tu non l'abbia già inserita qui, la password ti sarà inviata con un messaggio di posta elettronica. Il nome utente deve soddisfare i criteri per i [[doku>pagename|nomi delle pagine]]. \ No newline at end of file
+Riempi tutte le informazioni seguenti per creare un nuovo account in questo wiki. Assicurati di inserire un **indirizzo email valido** - a meno che tu non l'abbia già inserita qui, la password ti sarà inviata con un messaggio di posta elettronica. Il nome utente deve soddisfare i criteri per i [[doku>it:pagename|nomi delle pagine]].
diff --git a/inc/lang/it/resetpwd.txt b/inc/lang/it/resetpwd.txt
index 450dd8301..5959b2554 100644
--- a/inc/lang/it/resetpwd.txt
+++ b/inc/lang/it/resetpwd.txt
@@ -1 +1,3 @@
-Inserisci perfavore una nuova password per il tuo account su questo wiki. \ No newline at end of file
+====== Impostare la nuova password ======
+
+Inserisci perfavore una nuova password per il tuo account su questo wiki.
diff --git a/inc/lang/it/searchpage.txt b/inc/lang/it/searchpage.txt
index e997ebdb7..089a08968 100644
--- a/inc/lang/it/searchpage.txt
+++ b/inc/lang/it/searchpage.txt
@@ -1,4 +1,3 @@
====== Cerca ======
Questi sono i risultati della ricerca. @CREATEPAGEINFO@
-
diff --git a/inc/lang/it/stopwords.txt b/inc/lang/it/stopwords.txt
index e91aa3b55..57d840f28 100644
--- a/inc/lang/it/stopwords.txt
+++ b/inc/lang/it/stopwords.txt
@@ -117,3 +117,4 @@ vai
voi
volte
vostro
+www
diff --git a/inc/lang/ja/admin.txt b/inc/lang/ja/admin.txt
index b0c6d34ab..9cbc03de7 100644
--- a/inc/lang/ja/admin.txt
+++ b/inc/lang/ja/admin.txt
@@ -1,4 +1,3 @@
====== 管理者メニュー ======
-DokuWikiで管理できるタスクの一覧です
-
+DokuWikiで使用出来る管理タスクの一覧です。
diff --git a/inc/lang/ja/backlinks.txt b/inc/lang/ja/backlinks.txt
index 69644b79d..400bd679d 100644
--- a/inc/lang/ja/backlinks.txt
+++ b/inc/lang/ja/backlinks.txt
@@ -1,4 +1,3 @@
====== バックリンク ======
-先ほどの文書にリンクしている文書のリストです。
-
+このページにリンクしているページの一覧です。
diff --git a/inc/lang/ja/conflict.txt b/inc/lang/ja/conflict.txt
index 099b5989a..5e637fff1 100644
--- a/inc/lang/ja/conflict.txt
+++ b/inc/lang/ja/conflict.txt
@@ -2,5 +2,4 @@
編集中に他のユーザーがこの文書を更新したため、新しいバージョンの文書が存在します。
-以下に文書間の差分を表示するので、どちらかの文書を選択してください。''保存'' を選択すると現在編集中の文書が保存されます。''キャンセル'' は編集中の文書が破棄されます。
-
+以下に文書間の差分を表示するので、どちらかの文書を選択してください。''保存'' を選択すると現在編集中の文書が保存されます。''キャンセル'' を選択すると編集中の文書が破棄されます。
diff --git a/inc/lang/ja/denied.txt b/inc/lang/ja/denied.txt
index 98ccb2f5a..b212288dc 100644
--- a/inc/lang/ja/denied.txt
+++ b/inc/lang/ja/denied.txt
@@ -1,4 +1,3 @@
====== アクセスが拒否されました ======
-実行する権限がありません。
-
+申し訳ありませんが、実行する権限がありません。
diff --git a/inc/lang/ja/diff.txt b/inc/lang/ja/diff.txt
index fe5f6b165..d90edd735 100644
--- a/inc/lang/ja/diff.txt
+++ b/inc/lang/ja/diff.txt
@@ -1,4 +1,3 @@
====== 差分 ======
-この文書の現在のバージョンと選択したバージョンの差分を表示します。
-
+このページの2つのバージョン間の差分を表示します。
diff --git a/inc/lang/ja/draft.txt b/inc/lang/ja/draft.txt
index af3160b8c..d5d6084f2 100644
--- a/inc/lang/ja/draft.txt
+++ b/inc/lang/ja/draft.txt
@@ -1,6 +1,5 @@
====== ドラフトファイルが存在します ======
-このページに対する最後の編集は正しく終了されませんでした。 その編集作業を引き続き行えるよう、以下に示す内容が自動的に保存されています。
-
-この自動的に保存された編集内容に対して、//復元する//、//削除する//、 もしくはこのページの編集を//キャンセル//して下さい。
+このページに対する最後の編集は正しく終了しませんでした。 その編集作業を引き続き行えるよう、作業中にドラフトを自動保存しました。あなたの最後のセッションを元に保存されたデータを以下に表示しています。
+この自動的に保存された編集内容を//復元する//か//削除する//か、もしくはこのページの編集を//キャンセル//して下さい。
diff --git a/inc/lang/ja/edit.txt b/inc/lang/ja/edit.txt
index e7a8f9720..13351574f 100644
--- a/inc/lang/ja/edit.txt
+++ b/inc/lang/ja/edit.txt
@@ -1,4 +1 @@
-編集して''保存''をクリックしてください。Wikiの構文については [[wiki:syntax]] を参考にしてください
-
-当然のことですが、この文書の質を **向上** させる場合のみ編集してください。もし編集方法や構文を練習したいのであれば [[playground:playground]] を利用してください。
-
+編集して''保存''をクリックしてください。Wikiの構文については [[wiki:syntax]] を参考にしてください。当然のことですが、この文書の質を **向上** させる場合のみ編集してください。もし編集方法や構文を練習したいのであれば [[playground:playground]] を利用してください。
diff --git a/inc/lang/ja/editrev.txt b/inc/lang/ja/editrev.txt
index 7c984131c..5168edc2a 100644
--- a/inc/lang/ja/editrev.txt
+++ b/inc/lang/ja/editrev.txt
@@ -1,2 +1,2 @@
-**古いリビジョンの文書を開いています** もしこのまま保存すると、この文書が最新となります。
+**文書の過去の版を開いています**。もしこのまま保存すると、この文書が最新となります。
----
diff --git a/inc/lang/ja/index.txt b/inc/lang/ja/index.txt
index eb168d146..a5515b1ff 100644
--- a/inc/lang/ja/index.txt
+++ b/inc/lang/ja/index.txt
@@ -1,4 +1,3 @@
====== サイトマップ ======
-全ての閲覧可能ページを[[doku>ja:namespaces|名前空間]]順に並べたサイトマップです。
-
+全ての閲覧可能なページを[[doku>ja:namespaces|名前空間]]順に並べたサイトマップです。
diff --git a/inc/lang/ja/install.html b/inc/lang/ja/install.html
index 3a1d0d409..003cf9a39 100644
--- a/inc/lang/ja/install.html
+++ b/inc/lang/ja/install.html
@@ -1,14 +1,7 @@
-<p>このページは、<a href="http://dokuwiki.org">Dokuwiki</a>のインストールと初期設定をサポートします。
-このインストーラーに関する詳細は <a href="http://dokuwiki.org/installer">documentation page</a> を参考にしてください。</p>
+<p>このページは、<a href="http://dokuwiki.org">Dokuwiki</a>のインストールと初期設定をサポートします。このインストーラーに関する詳細は <a href="http://dokuwiki.org/ja:installer">documentation page</a> を参考にしてください。</p>
-<p>DokuWikiは、通常のファイルにWikiページの内容と関連する情報(例えば、画像、検索インデックス、古いリビジョンなど)を保存します。
-そのため、DokuWikiを使用するためには、それらのファイルを保存するディレクトリに書き込みの権限が<strong>必ず</strong>必要となります。
-このインストーラーではディレクトリの権限の変更は行えないため、コマンドシェルで権限の変更を直接行うか、
-ホスティングサービスを利用している場合はそのコントロールパネルもしくはFTPを通して、権限の変更を行ってください。</p>
+<p>DokuWikiは、通常のファイルにWikiページの内容と関連する情報(例えば、画像、検索インデックス、古いリビジョンなど)を保存します。そのため、DokuWikiを使用するためには、それらのファイルを保存するディレクトリに書き込みの権限が<strong>必ず</strong>必要となります。このインストーラーではディレクトリの権限の変更は行えないため、コマンドシェルで権限の変更を直接行うか、ホスティングサービスを利用している場合はそのコントロールパネルもしくはFTPを通して、権限の変更を行ってください。</p>
-<p>DokuWikiは、プラグイン、ユーザー、Wikiページへのアクセス制限、設定の変更を管理する機能を有しており、
-その機能を有効にするために必要な <abbr title="access control list">ACL</abbr> の設定が、このインストーラーによって行われます。
-この管理機能は、DokuWikiを使用する上で必要ではありませんが、DokuWikiの管理を簡単にしてくれます。</p>
+<p>DokuWikiは、プラグイン、ユーザー、Wikiページへのアクセス制限、設定の変更を管理する機能を有しており、その機能を有効にするために必要な <abbr title="access control list">ACL</abbr> の設定が、このインストーラーによって行われます。この管理機能は、DokuWikiを使用する上で必要ではありませんが、DokuWikiの管理を簡単にしてくれます。</p>
-<p>従来のバージョンを使用しているユーザーや特別なセットアップが必要な場合は、次のリンク先を参考にして下さい
-(<a href="http://dokuwiki.org/install">installation instructions</a>, <a href="http://dokuwiki.org/config">configuration settings</a>)。</p>
+<p>従来のバージョンを使用しているユーザーや特別なセットアップが必要な場合は、次のリンク先を参考にして下さい (<a href="http://dokuwiki.org/ja:install">installation instructions</a>, <a href="http://dokuwiki.org/ja:config">configuration settings</a>)。</p>
diff --git a/inc/lang/ja/lang.php b/inc/lang/ja/lang.php
index 5f21a7e94..e2f3dd16e 100644
--- a/inc/lang/ja/lang.php
+++ b/inc/lang/ja/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
+ * @author lempel <riverlempel@hotmail.com>
* @author Yuji Takenaka <webmaster@davilin.com>
* @author Ikuo Obataya <i.obataya@gmail.com>
* @author Daniel Dupriest <kououken@gmail.com>
@@ -10,7 +12,6 @@
* @author Taisuke Shimamoto <dentostar@gmail.com>
* @author Satoshi Sahara <sahara.satoshi@gmail.com>
* @author Hideaki SAWADA <chuno@live.jp>
- * @author Hideaki SAWADA <sawadakun@live.jp>
* @author PzF_X <jp_minecraft@yahoo.co.jp>
*/
$lang['encoding'] = 'utf-8';
@@ -46,7 +47,7 @@ $lang['btn_backlink'] = 'バックリンク';
$lang['btn_subscribe'] = '変更履歴配信の登録';
$lang['btn_profile'] = 'ユーザー情報の更新';
$lang['btn_reset'] = 'リセット';
-$lang['btn_resendpwd'] = '新しいパスワードをセット';
+$lang['btn_resendpwd'] = '新しいパスワードを設定';
$lang['btn_draft'] = 'ドラフトを編集';
$lang['btn_recover'] = 'ドラフトを復元';
$lang['btn_draftdel'] = 'ドラフトを削除';
@@ -54,64 +55,29 @@ $lang['btn_revert'] = '元に戻す';
$lang['btn_register'] = 'ユーザー登録';
$lang['btn_apply'] = '適用';
$lang['btn_media'] = 'メディアマネージャー';
-$lang['btn_deleteuser'] = '自分のアカウントの抹消';
-$lang['btn_img_backto'] = '戻る %s';
+$lang['btn_deleteuser'] = '自分のアカウントを抹消する';
+$lang['btn_img_backto'] = '%sへ戻る';
$lang['btn_mediaManager'] = 'メディアマネージャーで閲覧';
$lang['loggedinas'] = 'ようこそ:';
$lang['user'] = 'ユーザー名';
$lang['pass'] = 'パスワード';
$lang['newpass'] = '新しいパスワード';
-$lang['oldpass'] = '現在のパスワード';
-$lang['passchk'] = '確認';
-$lang['remember'] = 'ユーザー名とパスワードを記憶する';
+$lang['oldpass'] = '現在のパスワードを確認';
+$lang['passchk'] = '確認のため再入力';
+$lang['remember'] = 'ログインを保持する';
$lang['fullname'] = 'フルネーム';
$lang['email'] = 'メールアドレス';
$lang['profile'] = 'ユーザー情報';
-$lang['badlogin'] = 'ユーザー名かパスワードが違います。';
-$lang['badpassconfirm'] = 'パスワードが間違っています。';
+$lang['badlogin'] = 'ユーザー名もしくはパスワードに誤りがあります。';
+$lang['badpassconfirm'] = 'パスワードに誤りがあります。';
$lang['minoredit'] = '小変更';
$lang['draftdate'] = 'ドラフト保存日時:';
-$lang['nosecedit'] = 'ページ内容が変更されていますがセクション情報が古いため、代わりにページ全体をロードしました。';
-$lang['regmissing'] = '全ての項目を入力してください。';
-$lang['reguexists'] = 'このユーザー名は既に存在しています。';
-$lang['regsuccess'] = '新しいユーザーが作成されました。パスワードは登録したメールアドレス宛てに送付されます。';
-$lang['regsuccess2'] = '新しいユーザーが作成されました。';
-$lang['regfail'] = 'ユーザーを作成できませんでした。';
-$lang['regmailfail'] = 'パスワードのメール送信に失敗しました。お手数ですが管理者まで連絡をお願いします。';
-$lang['regbadmail'] = 'メールアドレスが有効ではありません。';
-$lang['regbadpass'] = '確認用のパスワードが正しくありません。';
-$lang['regpwmail'] = 'あなたの DokuWiki パスワード';
-$lang['reghere'] = 'ご自分用のアカウントを取ってみては如何ですか?';
-$lang['profna'] = 'ユーザー情報の変更は出来ません';
-$lang['profnochange'] = '変更点はありませんでした。';
-$lang['profnoempty'] = 'ユーザー名とメールアドレスを入力して下さい。';
-$lang['profchanged'] = 'ユーザー情報は更新されました。';
-$lang['profnodelete'] = 'この wiki はユーザーを削除できない。';
-$lang['profdeleteuser'] = 'アカウントの削除';
-$lang['profdeleted'] = 'このwikiからあなたのユーザーアカウントは削除済です。';
-$lang['profconfdelete'] = 'このwikiから自分のアカウント抹消を希望します。<br/> この操作は取消すことができません。';
-$lang['profconfdeletemissing'] = '確認のチェックボックスがチェックされていません。';
-$lang['proffail'] = 'ユーザー情報は更新されませんでした。';
-$lang['pwdforget'] = 'パスワードをお忘れですか?パスワード再発行';
-$lang['resendna'] = 'パスワードの再発行は出来ません。';
-$lang['resendpwd'] = '新しいパスワードをセット';
-$lang['resendpwdmissing'] = '全ての項目を入力して下さい。';
-$lang['resendpwdnouser'] = '入力されたユーザーが見つかりませんでした。';
-$lang['resendpwdbadauth'] = '申し訳ありません。この確認コードは有効ではありません。メール内に記載されたリンクを確認してください。';
-$lang['resendpwdconfirm'] = '確認用のリンクを含んだメールを送信しました。';
-$lang['resendpwdsuccess'] = '新しいパスワードがメールで送信されました。';
-$lang['license'] = '特に明示されていない限り、本Wikiの内容は次のライセンスに従います:';
-$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'] = '編集中の文書はロック期限を過ぎようとしています。このままロックする場合は、一度文書の確認を行って期限をリセットしてください。';
-$lang['js']['notsavedyet'] = '変更は保存されません。このまま処理を続けてよろしいですか?';
+$lang['nosecedit'] = '読み込みまでの間にページ内容が変更され、セクション情報が古くなったため、代わりにページ全体をロードしました。';
+$lang['searchcreatepage'] = 'もしお探しの内容が見つからなければ、検索キーワードに因んだ「%s」という名前のページを作成・編集出来ます。';
+$lang['search_fullresults'] = '全文検索';
+$lang['js']['search_toggle_tools'] = '検索ツールを表示/非表示';
+$lang['js']['willexpire'] = '編集中の文書のロックが、間もなく期限切れとなります。\n編集の競合を防ぐには、一度「プレビュー」ボタンを押してロック期限をリセットしてください。';
+$lang['js']['notsavedyet'] = '保存していない変更は失われます。';
$lang['js']['searchmedia'] = 'ファイル検索';
$lang['js']['keepopen'] = '選択中はウィンドウを閉じない';
$lang['js']['hidedetails'] = '詳細を非表示';
@@ -131,12 +97,12 @@ $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']['medianolink'] = '画像へリンクしない';
+$lang['js']['medialeft'] = '画像を左に寄せる';
+$lang['js']['mediaright'] = '画像を右に寄せる';
+$lang['js']['mediacenter'] = '画像を中央に寄せる';
$lang['js']['medianoalign'] = '位置を設定しない';
-$lang['js']['nosmblinks'] = 'ウィンドウズの共有フォルダへリンクは Microsoft Internet Explorer でしか機能しませんが、リンクをコピーして貼り付けることは可能です。';
+$lang['js']['nosmblinks'] = 'Windows の共有フォルダへリンクは Microsoft Internet Explorer でしか機能しませんが、リンクをコピーして貼り付けることは可能です。';
$lang['js']['linkwiz'] = 'リンクウィザード';
$lang['js']['linkto'] = 'リンク先:';
$lang['js']['del_confirm'] = '選択した項目を本当に削除しますか?';
@@ -151,7 +117,57 @@ $lang['js']['media_done_btn'] = '完了';
$lang['js']['media_drop'] = 'ここにファイルをドロップするとアップロードします';
$lang['js']['media_cancel'] = '削除';
$lang['js']['media_overwrt'] = '既存のファイルを上書きする';
-$lang['rssfailed'] = 'RSSの取得に失敗しました:';
+$lang['search_exact_match'] = '完全一致';
+$lang['search_starts_with'] = '前方一致';
+$lang['search_ends_with'] = '後方一致';
+$lang['search_contains'] = '部分一致';
+$lang['search_custom_match'] = 'カスタム';
+$lang['search_any_ns'] = '全ての名前空間';
+$lang['search_any_time'] = '全期間';
+$lang['search_past_7_days'] = '1週間以内';
+$lang['search_past_month'] = '1カ月以内';
+$lang['search_past_year'] = '1年以内';
+$lang['search_sort_by_hits'] = 'ヒット数順に並べる';
+$lang['search_sort_by_mtime'] = '最終更新順に並べる';
+$lang['regmissing'] = 'お手数ですが、全ての項目を入力してください。';
+$lang['reguexists'] = '恐れ入りますが、このユーザー名は既に存在しています。';
+$lang['regsuccess'] = '新しいユーザーが作成されました。パスワードは登録したメールアドレス宛てに送付されます。';
+$lang['regsuccess2'] = '新しいユーザーが作成されました。';
+$lang['regfail'] = 'ユーザーを作成できませんでした。';
+$lang['regmailfail'] = 'パスワードのメールを送信する際にエラーが生じた模様です。お手数ですが管理者まで連絡をお願いします。';
+$lang['regbadmail'] = 'メールアドレスが有効でないと判断されました。不具合だと思われる場合は、管理者にご連絡下さい。';
+$lang['regbadpass'] = '確認用のパスワードが正しくありません。もう一度お試し下さい。';
+$lang['regpwmail'] = 'あなたの DokuWiki パスワード';
+$lang['reghere'] = 'ご自分用のアカウントを取ってみてはいかがですか?';
+$lang['profna'] = 'このWikiではユーザー情報の変更は出来ません';
+$lang['profnochange'] = '変更点が無かったため、システム側では何も操作を行いませんでした。';
+$lang['profnoempty'] = 'ユーザー名とメールアドレスを入力して下さい。';
+$lang['profchanged'] = 'ユーザー情報は更新されました。';
+$lang['profnodelete'] = 'このWikiではユーザーを削除出来ません';
+$lang['profdeleteuser'] = 'アカウントの削除';
+$lang['profdeleted'] = 'あなたのユーザーアカウントはこのWikiから削除されました。';
+$lang['profconfdelete'] = 'このWikiから自分のアカウントを消去する場合はチェックボックスにチェックを入れて下さい。<br/> この操作は取消すことができません。';
+$lang['profconfdeletemissing'] = '確認のチェックボックスがチェックされていません。';
+$lang['proffail'] = 'ユーザー情報は更新されませんでした。';
+$lang['pwdforget'] = 'パスワードをお忘れですか?';
+$lang['resendna'] = 'このWikiではパスワードの再発行は出来ません。';
+$lang['resendpwd'] = '新しいパスワードを設定';
+$lang['resendpwdmissing'] = 'お手数ですが、全ての項目を入力して下さい。';
+$lang['resendpwdnouser'] = '恐れ入りますが、入力されたユーザーがデータベース上にありませんでした。';
+$lang['resendpwdbadauth'] = '申し訳ありませんが、この確認コードは有効ではありません。URLが一部のみ切り取られていないかどうか、メール内に記載されたリンクをご確認下さい。';
+$lang['resendpwdconfirm'] = '確認用のリンクを含んだメールを送信しました。';
+$lang['resendpwdsuccess'] = '新しいパスワードがメールで送信されました。';
+$lang['license'] = '特に明示されていない限り、本Wikiの内容は次のライセンスに従います:';
+$lang['licenseok'] = '注意: 本ページを編集した場合、あなたの編集した内容が次のライセンスに従うことに同意したものとみなします:';
+$lang['searchmedia'] = 'ファイル名を検索:';
+$lang['searchmedia_in'] = '%s 内を検索';
+$lang['txt_upload'] = 'アップロードするファイルを選んでください:';
+$lang['txt_filename'] = '名前を変更してアップロード(任意):';
+$lang['txt_overwrt'] = '既存のファイルを上書き';
+$lang['maxuploadsize'] = 'アップロード上限サイズ:1ファイルにつき%s';
+$lang['lockedby'] = '文書をロックしているユーザー:';
+$lang['lockexpire'] = 'ロック期限:';
+$lang['rssfailed'] = 'フィードの取得中にエラーが発生しました:';
$lang['nothingfound'] = '該当文書はありませんでした。';
$lang['mediaselect'] = 'メディアファイル';
$lang['uploadsucc'] = 'アップロード完了';
@@ -160,22 +176,22 @@ $lang['uploadwrong'] = 'アップロードは拒否されました。
$lang['uploadexist'] = '同名のファイルが存在するため、アップロードできません。';
$lang['uploadbadcontent'] = 'アップロードされたファイルの内容は、拡張子 %s と一致しません。';
$lang['uploadspam'] = 'スパムブラックリストによりアップロードが遮断されました。';
-$lang['uploadxss'] = '悪意のある内容である可能性により、アップロードが遮断されました。';
+$lang['uploadxss'] = '悪意のある内容を含んでいる可能性がある為、アップロードが遮断されました。';
$lang['uploadsize'] = 'アップロードしようとしたファイルは大きすぎます(最大 %s)。';
$lang['deletesucc'] = 'ファイル "%s" は削除されました。';
$lang['deletefail'] = 'ファイル "%s" が削除できません。権限を確認して下さい。';
$lang['mediainuse'] = 'ファイル "%s" は使用中のため、削除されませんでした。';
$lang['namespaces'] = '名前空間';
-$lang['mediafiles'] = '有効なファイル:';
+$lang['mediafiles'] = '利用可能なファイル:';
$lang['accessdenied'] = 'このページを閲覧する権限がありません。';
-$lang['mediausage'] = 'このファイルを使用するためには次の文法を使用する:';
+$lang['mediausage'] = 'このファイルを使用するには次のWiki文法を使用して下さい。';
$lang['mediaview'] = 'オリジナルファイルを閲覧';
$lang['mediaroot'] = 'ルート';
-$lang['mediaupload'] = 'ファイルを現在の名前空間にアップロードします。副名前空間を使用する場合には、ファイル名の前にコロンで区切って追加してください。';
+$lang['mediaupload'] = 'ファイルを現在の名前空間にアップロードします。副名前空間を使用する場合には、ファイルを選択後、ファイル名の前にコロンで区切って追加してください。ドラッグ&ドロップでファイルを選択する事も出来ます。';
$lang['mediaextchange'] = '拡張子が .%s から .%s へ変更されました。';
$lang['reference'] = '参照先';
$lang['ref_inuse'] = 'このファイルは、次のページで使用中のため削除できません。';
-$lang['ref_hidden'] = 'このページに存在するいくつかの参照先は、権限が無いため読むことができません。';
+$lang['ref_hidden'] = 'このページに存在するいくつかの参照先は、権限が無いため読み込むことができません。';
$lang['hits'] = 'ヒット';
$lang['quickhits'] = 'マッチした文書名';
$lang['toc'] = '目次';
@@ -192,7 +208,7 @@ $lang['diffnextrev'] = '次のリビジョン';
$lang['difflastrev'] = '最新リビジョン';
$lang['diffbothprevrev'] = '両方とも前のリビジョン';
$lang['diffbothnextrev'] = '両方とも次のリビジョン';
-$lang['line'] = 'ライン';
+$lang['line'] = '行';
$lang['breadcrumb'] = 'トレース:';
$lang['youarehere'] = '現在位置:';
$lang['lastmod'] = '最終更新:';
@@ -202,7 +218,7 @@ $lang['created'] = '作成';
$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 Plugin</a> が必要です。';
$lang['download'] = 'この部分をダウンロード';
$lang['tools'] = 'ツール';
$lang['user_tools'] = 'ユーザ用ツール';
@@ -230,7 +246,7 @@ $lang['qb_h3'] = '第三見出し';
$lang['qb_h4'] = '第四見出し';
$lang['qb_h5'] = '第五見出し';
$lang['qb_h'] = '見出し';
-$lang['qb_hs'] = '見出し選択';
+$lang['qb_hs'] = '見出し(階層を選択)';
$lang['qb_hplus'] = '上の階層の見出し';
$lang['qb_hminus'] = '下の階層の見出し';
$lang['qb_hequal'] = '同じ階層の見出し';
@@ -239,7 +255,7 @@ $lang['qb_extlink'] = '外部リンク';
$lang['qb_hr'] = '横罫線';
$lang['qb_ol'] = '記号付きリスト';
$lang['qb_ul'] = '記号なしリスト';
-$lang['qb_media'] = 'イメージやファイルの追加';
+$lang['qb_media'] = 'イメージやファイルの追加(新しいウィンドウで開きます)';
$lang['qb_sig'] = '署名の挿入';
$lang['qb_smileys'] = 'スマイリー';
$lang['qb_chars'] = '特殊文字';
@@ -260,10 +276,10 @@ $lang['img_keywords'] = 'キーワード:';
$lang['img_width'] = '幅:';
$lang['img_height'] = '高さ:';
$lang['subscr_subscribe_success'] = '%sが%sの購読リストに登録されました。';
-$lang['subscr_subscribe_error'] = '%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_unsubscribe_error'] = '%sを%sの購読リストから削除するのに失敗しました。';
$lang['subscr_already_subscribed'] = '%sは既に%sに登録されています。';
$lang['subscr_not_subscribed'] = '%sは%sに登録されていません。';
$lang['subscr_m_not_subscribed'] = '現在のページ、もしくは名前空間にあなたは登録されていません。';
@@ -275,8 +291,8 @@ $lang['subscr_m_receive'] = '受信';
$lang['subscr_style_every'] = '全ての変更にメールを送信';
$lang['subscr_style_digest'] = 'それぞれのページへの変更の要約をメールする(%.2f 日毎)';
$lang['subscr_style_list'] = '前回のメールから変更されたページをリスト(%.2f 日毎)';
-$lang['authtempfail'] = 'ユーザー認証が一時的に使用できなくなっています。この状態が続いているようであれば、Wikiの管理者に連絡して下さい。';
-$lang['i_chooselang'] = '使用言語を選択してください';
+$lang['authtempfail'] = 'ユーザー認証が一時的に使用できなくなっています。問題が解決しない場合は、Wikiの管理者に連絡して下さい。';
+$lang['i_chooselang'] = '使用言語を選択';
$lang['i_installer'] = 'DokuWiki インストーラー';
$lang['i_wikiname'] = 'Wiki名';
$lang['i_enableacl'] = 'ACL(アクセス管理)を使用する(推奨)';
@@ -288,24 +304,25 @@ $lang['i_modified'] = 'セキュリティの理由から、新規も
$lang['i_funcna'] = 'PHPの関数 <code>%s</code> が使用できません。ホスティング会社が何らかの理由で無効にしている可能性があります。';
$lang['i_phpver'] = 'PHPのバージョン <code>%s</code> が必要なバージョン <code>%s</code> より以前のものです。PHPのアップグレードが必要です。';
$lang['i_mbfuncoverload'] = 'DokuWiki を実行する php.ini ファイルの mbstring.func_overload は無効にして下さい。';
+$lang['i_urandom'] = 'DokuWikiは、Cookieに対して暗号的に安全な番号を作成できません。<code>/dev/urandom</code>に対する適切なアクセスについて、php.iniの設定 open_basedir を確認する事をお勧めします。';
$lang['i_permfail'] = '<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_badval'] = '<code>%s</code> - 正しくない、もしくは値が空です';
-$lang['i_success'] = '設定ファイルは正しく作成されました。<a href="doku.php?id=wiki:welcome">作成した DokuWiki</a>を使用するには install.php を削除してください。';
+$lang['i_success'] = '設定ファイルは正しく作成されました。install.phpは、もう削除しても構いません。引き続き、<a href="doku.php?id=wiki:welcome">作成したDokuWiki</a>をご利用下さい。';
$lang['i_failure'] = '設定ファイルの作成中にエラーが発生しました。<a href="doku.php?id=wiki:welcome">作成した DokuWiki</a>を使用する前に、それらの問題を手動で修正する必要があります。';
$lang['i_policy'] = 'ACL初期設定';
$lang['i_pol0'] = 'オープン Wiki(全ての人に、閲覧・書き込み・アップロードを許可)';
$lang['i_pol1'] = 'パブリック Wiki(閲覧は全ての人が可能、書き込み・アップロードは登録ユーザーのみ)';
-$lang['i_pol2'] = 'クローズド Wiki (登録ユーザーにのみ使用を許可)';
-$lang['i_allowreg'] = 'ユーザ自身で登録可能';
+$lang['i_pol2'] = 'クローズド Wiki(登録ユーザーにのみ、閲覧・書き込み・アップロードを許可)';
+$lang['i_allowreg'] = '訪問者自身でユーザー登録機能を使えるようにする';
$lang['i_retry'] = '再試行';
$lang['i_license'] = 'あなたが作成したコンテンツが属するライセンスを選択してください:';
$lang['i_license_none'] = 'ライセンス情報を表示しません。';
$lang['i_pop_field'] = 'Dokuwiki の内容の向上に協力して下さい:';
-$lang['i_pop_label'] = '月に一回、DokuWikiの開発者に匿名の使用データを送信します。';
-$lang['recent_global'] = '現在、<b>%s</b> 名前空間内の変更点を閲覧中です。<a href="%s">Wiki全体の最近の変更点の確認</a>もできます。';
+$lang['i_pop_label'] = '月に一回、DokuWikiの開発者に匿名の使用データを送信する';
+$lang['recent_global'] = '現在、名前空間 <b>%s</b> 内の変更を閲覧中です。<a href="%s">Wiki全体の最近の変更の確認</a>もできます。';
$lang['years'] = '%d年前';
$lang['months'] = '%dカ月前';
$lang['weeks'] = '%d週間前';
@@ -333,11 +350,11 @@ $lang['media_viewold'] = '%2$s に %1$s';
$lang['media_edit'] = '%s を編集';
$lang['media_history'] = '%s の履歴';
$lang['media_meta_edited'] = 'メタデータが編集されました';
-$lang['media_perm_read'] = 'ファイルを閲覧する権限がありません。';
-$lang['media_perm_upload'] = 'ファイルをアップロードする権限がありません。';
+$lang['media_perm_read'] = '申し訳ありませんが、ファイルを閲覧する権限がありません。';
+$lang['media_perm_upload'] = '申し訳ありませんが、ファイルをアップロードする権限がありません。';
$lang['media_update'] = '新しいバージョンをアップロード';
$lang['media_restore'] = 'このバージョンを復元';
-$lang['media_acl_warning'] = 'ACL制限や非表示ページは表示されないので、このリストは完全でない場合があります。';
+$lang['media_acl_warning'] = '閲覧権限の無いページや非表示ページは表示されないので、このリストは完全でない場合があります。';
$lang['currentns'] = '現在の名前空間';
$lang['searchresult'] = '検索結果';
$lang['plainhtml'] = 'プレーンHTML';
diff --git a/inc/lang/ja/locked.txt b/inc/lang/ja/locked.txt
index 1c37c93d1..d501af456 100644
--- a/inc/lang/ja/locked.txt
+++ b/inc/lang/ja/locked.txt
@@ -1,3 +1,3 @@
====== 文書ロック中 ======
-この文書は他のユーザーによってロックされています。編集が完了するか、ロックの期限が切れるのを待って下さい。
+この文書は、他のユーザーが編集中のためロックされています。編集が完了するか、ロックの期限が切れるまでお待ち下さい。
diff --git a/inc/lang/ja/login.txt b/inc/lang/ja/login.txt
index ef18d378e..de97dee90 100644
--- a/inc/lang/ja/login.txt
+++ b/inc/lang/ja/login.txt
@@ -1,4 +1,3 @@
====== ログイン ======
-ユーザー名とパスワードを入力してログインしてください(クッキーを有効にする必要があります)。
-
+現在ログインしていません。ログインするには、以下にユーザー名とパスワードを入力して下さい(クッキーを有効にする必要があります)。
diff --git a/inc/lang/ja/mailtext.txt b/inc/lang/ja/mailtext.txt
index 4bad3d945..7ea2636f2 100644
--- a/inc/lang/ja/mailtext.txt
+++ b/inc/lang/ja/mailtext.txt
@@ -1,12 +1,14 @@
DokuWiki 内の文書が追加もしくは変更されました。詳細は以下の通りです。
-日付 : @DATE@
-ブラウザ : @BROWSER@
-IPアドレス : @IPADDRESS@
-ホスト名 : @HOSTNAME@
-前リビジョン: @OLDPAGE@
-新リビジョン: @NEWPAGE@
-編集のサマリ: @SUMMARY@
-ユーザー名 : @USER@
+ブラウザ     : @BROWSER@
+IPアドレス    : @IPADDRESS@
+ホスト名     : @HOSTNAME@
+前リビジョン   : @OLDPAGE@
+新リビジョン   : @NEWPAGE@
+新リビジョンの日付: @DATE@
+編集の概要    : @SUMMARY@
+ユーザー名    : @USER@
+
+この通知の後、新たなリビジョンが追加されている可能性があります。その場合、本リビジョンのページ上部にメッセージが表示されます。
@DIFF@
diff --git a/inc/lang/ja/newpage.txt b/inc/lang/ja/newpage.txt
index d03169f8a..deec746bc 100644
--- a/inc/lang/ja/newpage.txt
+++ b/inc/lang/ja/newpage.txt
@@ -1,4 +1,3 @@
-====== このトピックには文書が存在しません ======
-
-このトピックに文書が作成されていません。 もし、文書作成の権限がある場合は、''文書の作成''をクリックして 最初の文書を作成することができます。
+====== この項目はまだ存在しません ======
+この項目はまだ作成されていません。もし、文書作成の権限がある場合は、**文書の作成**をクリックして最初の文書を作成することができます。
diff --git a/inc/lang/ja/norev.txt b/inc/lang/ja/norev.txt
index 48ccde700..bb9778124 100644
--- a/inc/lang/ja/norev.txt
+++ b/inc/lang/ja/norev.txt
@@ -1,4 +1,3 @@
-====== リビジョンが存在しません ======
-
-指定されたリビジョン存在しません。''以前のリビジョン''をクリックして確認してください。
+====== このリビジョンは存在しません ======
+指定されたリビジョンが存在しません。''以前のリビジョン''をクリックして、この文書の過去の版の一覧を確認してください。
diff --git a/inc/lang/ja/onceexisted.txt b/inc/lang/ja/onceexisted.txt
new file mode 100644
index 000000000..5cabad2b6
--- /dev/null
+++ b/inc/lang/ja/onceexisted.txt
@@ -0,0 +1,3 @@
+====== このページはもう存在しません ======
+
+このページは削除されました。[[?do=revisions|以前のリビジョン]]の一覧をチェックして、いつ・なぜ削除されたのか確認したり、過去の版にアクセスしたり、元に戻したり出来ます。 \ No newline at end of file
diff --git a/inc/lang/ja/password.txt b/inc/lang/ja/password.txt
index fa11b1044..3e527bdf2 100644
--- a/inc/lang/ja/password.txt
+++ b/inc/lang/ja/password.txt
@@ -1,4 +1,4 @@
-こんにちは @FULLNAME@! さん
+こんにちは @FULLNAME@ さん
@TITLE@(@DOKUWIKIURL@)に登録されたユーザー情報は以下の通りです。
diff --git a/inc/lang/ja/preview.txt b/inc/lang/ja/preview.txt
index ee839cd06..c0fe39d86 100644
--- a/inc/lang/ja/preview.txt
+++ b/inc/lang/ja/preview.txt
@@ -1,4 +1,3 @@
====== プレビュー ======
-編集中の文書のプレビューです。確認用なので**保存されていない**ことに注意してください。
-
+編集中の文書のプレビューです。**まだ保存されていませんのでご注意下さい。** \ No newline at end of file
diff --git a/inc/lang/ja/read.txt b/inc/lang/ja/read.txt
index 14137cc14..b48445d18 100644
--- a/inc/lang/ja/read.txt
+++ b/inc/lang/ja/read.txt
@@ -1,2 +1 @@
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
-
diff --git a/inc/lang/ja/recent.txt b/inc/lang/ja/recent.txt
index d18fd1bc2..69d004e31 100644
--- a/inc/lang/ja/recent.txt
+++ b/inc/lang/ja/recent.txt
@@ -1,5 +1,3 @@
====== 最近の変更 ======
-以下の文書は最近更新されたものです。
-
-
+最近更新されたページの一覧です。
diff --git a/inc/lang/ja/register.txt b/inc/lang/ja/register.txt
index 0cd278699..ce1892076 100644
--- a/inc/lang/ja/register.txt
+++ b/inc/lang/ja/register.txt
@@ -1,4 +1,3 @@
====== 新規ユーザー登録 ======
-このWikiのユーザー登録を行うためには、以下の情報を全て入力して下さい。 もし以下の項目にパスワードが存在しない場合、パスワードはメールにて送信されますので、 必ず**有効なメールアドレス**を入力してください。 また、ログイン名は[[doku>ja:pagename|ページ名]]に準拠していなければなりません。
-
+このWikiのユーザー登録を行うには、以下の情報を全て入力して下さい。 もし以下の項目にパスワードが存在しない場合、パスワードはメールにて送信されますので、 必ず**有効なメールアドレス**を入力してください。 また、ログイン名は[[doku>ja:pagename|ページ名]]の規則に準拠していなければなりません。
diff --git a/inc/lang/ja/registermail.txt b/inc/lang/ja/registermail.txt
index ad5241a0b..5a2484087 100644
--- a/inc/lang/ja/registermail.txt
+++ b/inc/lang/ja/registermail.txt
@@ -1,10 +1,10 @@
新しいユーザーが登録されました。ユーザー情報は以下の通りです。
-ユーザー名 : @NEWUSER@
-フルネーム : @NEWNAME@
-メールアドレス : @NEWEMAIL@
+ユーザー名  : @NEWUSER@
+フルネーム  : @NEWNAME@
+メールアドレス: @NEWEMAIL@
-登録日 : @DATE@
-ブラウザ : @BROWSER@
-IPアドレス : @IPADDRESS@
-ホスト名 : @HOSTNAME@
+登録日    : @DATE@
+ブラウザ   : @BROWSER@
+IPアドレス  : @IPADDRESS@
+ホスト名   : @HOSTNAME@
diff --git a/inc/lang/ja/resendpwd.txt b/inc/lang/ja/resendpwd.txt
index 23dd6ff1f..836ef7182 100644
--- a/inc/lang/ja/resendpwd.txt
+++ b/inc/lang/ja/resendpwd.txt
@@ -1,4 +1,3 @@
====== パスワード再発行 ======
-このWikiで使用する新しいパスワードをリクエストするために、ユーザー名を入力して下さい。 新パスワード発行リクエストの確認メールが、登録されているメールアドレスに送信されます。
-
+このWikiで使用する新しいパスワードをリクエストするには、ユーザー名を入力して下さい。 新パスワード発行リクエストの確認メールが、登録されているメールアドレスに送信されます。
diff --git a/inc/lang/ja/resetpwd.txt b/inc/lang/ja/resetpwd.txt
index a414af991..b28bc3763 100644
--- a/inc/lang/ja/resetpwd.txt
+++ b/inc/lang/ja/resetpwd.txt
@@ -1,3 +1,3 @@
-====== 新しいパスワードをセット ======
+====== 新しいパスワードを設定 ======
-このWikiでの、あなたのアカウント用の新しいパスワードを入力して下さい \ No newline at end of file
+このWikiでお使いのアカウント用の新しいパスワードを入力して下さい。
diff --git a/inc/lang/ja/revisions.txt b/inc/lang/ja/revisions.txt
index e43731ccd..5483d4328 100644
--- a/inc/lang/ja/revisions.txt
+++ b/inc/lang/ja/revisions.txt
@@ -1,4 +1,3 @@
====== 以前のリビジョン ======
-以下はこの文書の以前のリビジョンです。復元するには''文書の編集''をクリック、その後保存してください。
-
+以下はこの文書の以前の版(リビジョン)です。過去の版から復元するには、復元したい版を選択して、''文書の編集''をクリックし、その後保存してください。
diff --git a/inc/lang/ja/searchpage.txt b/inc/lang/ja/searchpage.txt
index 3c8751a2d..04af74fad 100644
--- a/inc/lang/ja/searchpage.txt
+++ b/inc/lang/ja/searchpage.txt
@@ -1,4 +1,3 @@
====== 検索 ======
以下に検索結果を表示します。@CREATEPAGEINFO@
-
diff --git a/inc/lang/ja/showrev.txt b/inc/lang/ja/showrev.txt
index d8ce4784e..d257b0ebf 100644
--- a/inc/lang/ja/showrev.txt
+++ b/inc/lang/ja/showrev.txt
@@ -1,2 +1,2 @@
-**以前のリビジョンの文書です**
+**文書の過去の版を表示しています。**
----
diff --git a/inc/lang/ja/stopwords.txt b/inc/lang/ja/stopwords.txt
index 628e46ebe..caa8dcd4d 100644
--- a/inc/lang/ja/stopwords.txt
+++ b/inc/lang/ja/stopwords.txt
@@ -1,9 +1,11 @@
# 以下は、インデックス作成時に無視する語句のリストです。一行に一単語ずつ記入してください。
-# UNIXで用いられる改行コード(LF)を使用してください
-# 3文字より短い語句は自動的に無視されるので、リストに加える必要はありません。
-# このリストは次のサイトをもとに作成されています(http://www.ranks.nl/stopwords/)
+# このファイルを編集する際は、UNIXで用いられる改行コード(LF)を使用してください。
+# 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/ja/subscr_digest.txt b/inc/lang/ja/subscr_digest.txt
index 026a2fe89..7315b7622 100644
--- a/inc/lang/ja/subscr_digest.txt
+++ b/inc/lang/ja/subscr_digest.txt
@@ -1,6 +1,6 @@
こんにちは。
-@TITLE@ 内のページ @PAGE@ は変更されました。
+@TITLE@ 内のページ @PAGE@ に変更がありました。
変更点は以下の通りです:
--------------------------------------------------------
@@ -12,6 +12,5 @@
この通知を解除するには次のウィキへログインし
@DOKUWIKIURL@
-その後、
+その後、以下のページからページと名前空間の変更に対する購読を解除してください。
@SUBSCRIBE@
-ページと名前空間の変更に対する購読を解除してください。
diff --git a/inc/lang/ja/subscr_list.txt b/inc/lang/ja/subscr_list.txt
index dbe37c7f8..3b841ea4b 100644
--- a/inc/lang/ja/subscr_list.txt
+++ b/inc/lang/ja/subscr_list.txt
@@ -1,15 +1,13 @@
こんにちは。
-@TITLE@ の 名前空間 @PAGE@ にあるページが変更されました。
+@TITLE@ の 名前空間 @PAGE@ にあるページに変更がありました。
変更点は以下の通りです:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-
この通知を解除するには次のウィキへログインし
@DOKUWIKIURL@
-その後、
+その後、以下のページからページと名前空間の変更に対する購読を解除してください。
@SUBSCRIBE@
-ページと名前空間の変更に対する購読を解除してください。
diff --git a/inc/lang/ja/subscr_single.txt b/inc/lang/ja/subscr_single.txt
index 4dac31e02..68190bfc4 100644
--- a/inc/lang/ja/subscr_single.txt
+++ b/inc/lang/ja/subscr_single.txt
@@ -1,20 +1,19 @@
こんにちは。
-@TITLE@ のウィキにあるページ @PAGE@ が変更されました。
+@TITLE@ のウィキにあるページ @PAGE@ に変更がありました。
変更点は以下の通りです:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-日付 : @DATE@
-ユーザー : @USER@
-変更概要: @SUMMARY@
-古いリビジョン: @OLDPAGE@
-新しいリビジョン: @NEWPAGE@
+ユーザー       : @USER@
+編集の概要      : @SUMMARY@
+古いリビジョン    : @OLDPAGE@
+新しいリビジョン   : @NEWPAGE@
+新しいリビジョンの日付: @DATE@
この通知を解除するには次のウィキへログインし
@DOKUWIKIURL@
-その後、
+その後、以下のページからページと名前空間の変更に対する購読を解除してください。
@SUBSCRIBE@
-ページと名前空間の変更に対する購読を解除してください。
diff --git a/inc/lang/ja/updateprofile.txt b/inc/lang/ja/updateprofile.txt
index e83d92965..21096970b 100644
--- a/inc/lang/ja/updateprofile.txt
+++ b/inc/lang/ja/updateprofile.txt
@@ -1,5 +1,3 @@
====== アカウント情報更新 ======
-変更したい項目を入力して下さい。ユーザー名は変更できません。
-
-
+変更したい項目のみ書き換えて下さい。ユーザー名は変更できません。
diff --git a/inc/lang/ja/uploadmail.txt b/inc/lang/ja/uploadmail.txt
index 8734c91df..11fa1a46d 100644
--- a/inc/lang/ja/uploadmail.txt
+++ b/inc/lang/ja/uploadmail.txt
@@ -1,10 +1,11 @@
お使いのDokuWikiにファイルがアップロードされました。詳細は以下の通りです。
-ファイル : @MEDIA@
-日付 : @DATE@
-ブラウザ : @BROWSER@
-IPアドレス : @IPADDRESS@
-ホスト名 : @HOSTNAME@
-サイズ : @SIZE@
-MIMEタイプ : @MIME@
-ユーザー名 : @USER@
+ファイル : @MEDIA@
+古い版  : @OLD@
+日付   : @DATE@
+ブラウザ : @BROWSER@
+IPアドレス: @IPADDRESS@
+ホスト名 : @HOSTNAME@
+サイズ  : @SIZE@
+MIMEタイプ: @MIME@
+ユーザー名: @USER@
diff --git a/inc/lang/ka/admin.txt b/inc/lang/ka/admin.txt
index 97072a449..ff15020cf 100644
--- a/inc/lang/ka/admin.txt
+++ b/inc/lang/ka/admin.txt
@@ -1,4 +1,3 @@
====== მართვა ======
ქვემოთ თქვენ ხედავთ ადმინისტრაციული ოპერაციების სიას «დოკუვიკიში».
-
diff --git a/inc/lang/ka/backlinks.txt b/inc/lang/ka/backlinks.txt
index 7b54797c7..57daed7e1 100644
--- a/inc/lang/ka/backlinks.txt
+++ b/inc/lang/ka/backlinks.txt
@@ -1,4 +1,3 @@
====== გადმომისამართება ======
გვერდები რომლებიც ანიშნებენ ამ გვერდზე.
-
diff --git a/inc/lang/ka/conflict.txt b/inc/lang/ka/conflict.txt
index 1b1eb0482..2d1fb7654 100644
--- a/inc/lang/ka/conflict.txt
+++ b/inc/lang/ka/conflict.txt
@@ -2,4 +2,4 @@
არსებობს დოკუმენტის უფრო ახალი ვერსია, რომელიც თქვენ დაარედაქტირეთ. ეს ხდება მაშინ, როდესაც სხვა მომხმარებელი არედაქტირებს დოკუმენტს, სანამ თქვენ აკეთებდით იგივეს.
-ყურადღებით დააკვირდით ქვემოთ მოყვანილ განსხვავებებს, და გადაწყვიტეთ რომელი ვერსია სჯობს. თუ შენახვას დააჭერთ, თქვენი ვერსია შეინახება. \ No newline at end of file
+ყურადღებით დააკვირდით ქვემოთ მოყვანილ განსხვავებებს, და გადაწყვიტეთ რომელი ვერსია სჯობს. თუ შენახვას დააჭერთ, თქვენი ვერსია შეინახება.
diff --git a/inc/lang/ka/diff.txt b/inc/lang/ka/diff.txt
index c635e45f4..502aef29b 100644
--- a/inc/lang/ka/diff.txt
+++ b/inc/lang/ka/diff.txt
@@ -1,3 +1,3 @@
====== განსხვავებები ======
-ქვემოთ მოყვანილაი განსხვავებები მსგავს გვერდებს შორის.
+ქვემოთ მოყვანილაი განსხვავებები მსგავს გვერდებს შორის.
diff --git a/inc/lang/ka/draft.txt b/inc/lang/ka/draft.txt
index f3356ddb5..0c344d923 100644
--- a/inc/lang/ka/draft.txt
+++ b/inc/lang/ka/draft.txt
@@ -1,3 +1,3 @@
====== ნაპოვნია ჩანაწერი ======
-გვერდის რედაქტირება არ იყო დამთავრებული. \ No newline at end of file
+გვერდის რედაქტირება არ იყო დამთავრებული.
diff --git a/inc/lang/ka/edit.txt b/inc/lang/ka/edit.txt
index 3fffceb0c..35048886a 100644
--- a/inc/lang/ka/edit.txt
+++ b/inc/lang/ka/edit.txt
@@ -1,2 +1 @@
დაარედაქტირეთ გვერდი და დააჭირეთ «შენახვას». წაიკითხეთ [[wiki:syntax|FAQ]] ვიკის სინტაქსისთან გასაცნობად. დაარედაქტირეთ გვერდი მხოლოდ იმ შემთხვევაში თუ აპირებთ გვერდის გაუმჯობესებას. თუ თქვენ რამის დატესტვა გინდათ, გამოიყენეთ სპეციალური გვერდი.
-
diff --git a/inc/lang/ka/index.txt b/inc/lang/ka/index.txt
index 7daef7fb6..8c8626518 100644
--- a/inc/lang/ka/index.txt
+++ b/inc/lang/ka/index.txt
@@ -1 +1,3 @@
-====== სტატიები ====== აქ ნაჩვენებია ყველა სტატია \ No newline at end of file
+====== სტატიები ======
+
+აქ ნაჩვენებია ყველა სტატია
diff --git a/inc/lang/ka/lang.php b/inc/lang/ka/lang.php
index 0e7c1e17f..e8e99c572 100644
--- a/inc/lang/ka/lang.php
+++ b/inc/lang/ka/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
* @author Tengiz <tech2008a@gmail.com>
* @author Luka Lejava <luka.lejava@gmail.com>
*/
@@ -177,7 +178,7 @@ $lang['accessdenied'] = 'თქვენ არ შეგიძლი
$lang['mediausage'] = 'გამოიყენე შემდეგი სინტაქსი რათა მიუთითო ეს ფაილი';
$lang['mediaview'] = 'ორიგინალი ფაილის ჩვენება';
$lang['mediaroot'] = 'root';
-$lang['mediaextchange'] = 'ფაილის გაფართოება შეიცვალა .%-დან .%-ზე!';
+$lang['mediaextchange'] = 'ფაილის გაფართოება შეიცვალა .%s დან .%s!';
$lang['ref_inuse'] = 'ფაილი წაშლა შეუძლებელია, გამოიყენება აქ:';
$lang['ref_hidden'] = 'ზოგიერთი ბლოკის წაკითხვის უფლება არ გაქვთ';
$lang['quickhits'] = 'მსგავსი სახელები';
diff --git a/inc/lang/km/admin.txt b/inc/lang/km/admin.txt
index 29338b2e7..7403411ea 100644
--- a/inc/lang/km/admin.txt
+++ b/inc/lang/km/admin.txt
@@ -1,3 +1,3 @@
====== អ្នកគ្រោង ======
-ខាងក្រោមជាប្រដបប្រដារបស់អ្នកគ្រោង ឌោគូវីគី។
+ខាងក្រោមជាប្រដបប្រដារបស់អ្នកគ្រោង ឌោគូវីគី។
diff --git a/inc/lang/km/backlinks.txt b/inc/lang/km/backlinks.txt
index f28068a58..ef9795179 100644
--- a/inc/lang/km/backlinks.txt
+++ b/inc/lang/km/backlinks.txt
@@ -1,5 +1,3 @@
====== ខ្សែដំណរក្រោយ ======
-នេះជាទំព័រដែលមានដំណរបណ្តពីទំព័រឥឡូវ។
-====== Backlinks ======
-This is a list of pages that seem to link back to the current page.
+នេះជាទំព័រដែលមានដំណរបណ្តពីទំព័រឥឡូវ។
diff --git a/inc/lang/km/conflict.txt b/inc/lang/km/conflict.txt
index 7b95fda65..718df8f95 100644
--- a/inc/lang/km/conflict.txt
+++ b/inc/lang/km/conflict.txt
@@ -1,3 +1,3 @@
====== មានបុនរាព្រឹត្តិថ្មីៗ ======
-មានបុនរាព្រឹត្តិថ្មី
+មានបុនរាព្រឹត្តិថ្មី
diff --git a/inc/lang/km/denied.txt b/inc/lang/km/denied.txt
index be0371498..a5056cb7f 100644
--- a/inc/lang/km/denied.txt
+++ b/inc/lang/km/denied.txt
@@ -1,4 +1,3 @@
====== បដិសេធអនុញ្ញាត ======
សូមទុស អ្នកគ្មានអនុញ្ញាតទៅបណ្តទេ។
-
diff --git a/inc/lang/km/edit.txt b/inc/lang/km/edit.txt
index 516ea3779..089a43208 100644
--- a/inc/lang/km/edit.txt
+++ b/inc/lang/km/edit.txt
@@ -1,3 +1 @@
-កែតម្រូវទំព័រនេះហើយ ចុច«រក្សាតុក»។ មើល [[wiki:syntax|វាក្យ​សម្ពន្ធ]] ជាកម្នូវីគី។
-សំកែសម្រួលបើអ្នកអាច**ច្នៃចរើន**វា។ បើអ្នកចង់សាកពិសោតអ្វីមួយ សំរៀននៅក្នុង
-[[playground:playground|playground]]។
+កែតម្រូវទំព័រនេះហើយ ចុច«រក្សាតុក»។ មើល [[wiki:syntax|វាក្យ​សម្ពន្ធ]] ជាកម្នូវីគី។ សំកែសម្រួលបើអ្នកអាច**ច្នៃចរើន**វា។ បើអ្នកចង់សាកពិសោតអ្វីមួយ សំរៀននៅក្នុង [[playground:playground|playground]]។
diff --git a/inc/lang/km/index.txt b/inc/lang/km/index.txt
index 350050837..9f15c4b8f 100644
--- a/inc/lang/km/index.txt
+++ b/inc/lang/km/index.txt
@@ -1,2 +1,3 @@
====== លិបិក្រម ======
-នេះជាលិបិក្រមទំព័រទាំងឡាយបញ្ជាដោយ [[doku>wiki:namespaces|នាមថាន]]។
+
+នេះជាលិបិក្រមទំព័រទាំងឡាយបញ្ជាដោយ [[doku>wiki:namespaces|ដ្ឋាននាម]] ។
diff --git a/inc/lang/km/lang.php b/inc/lang/km/lang.php
index 2dbc0d385..8f97465d2 100644
--- a/inc/lang/km/lang.php
+++ b/inc/lang/km/lang.php
@@ -1,202 +1,201 @@
<?php
+
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Ratana Lim <aerorat@yahoo.com>
+ * auth.class language support
+ * installer strings
+ *
+ * @author Samana Johann <samana.johann@sangham.net>
+ * @author no credits taken <someone@cambodia.kh>
+ * @author Ratana Lim <aerorat@yahoo.com>
*/
-$lang['encoding'] = 'utf-8';
-$lang['direction'] = 'ltr';
-$lang['doublequoteopening'] = '«';
-$lang['doublequoteclosing'] = '»';
-$lang['singlequoteopening'] = '‘';//&lsquo;
-$lang['singlequoteclosing'] = '’';//&rsquo;
-$lang['apostrophe'] = '’';//&rsquo;
-
-$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_newer'] = '<<ទំព័រទំនើប';
-$lang['btn_older'] = 'ទំព័រថ្មែសម័យ>>';
-$lang['btn_revs'] = 'ទំព័រចាស់ៗ';
-$lang['btn_recent'] = 'ទំព័រថ្មីៗ';
-$lang['btn_upload'] = 'ដាកលើង';
-$lang['btn_cancel'] = 'បោះបង់';
-$lang['btn_index'] = 'លិបិក្រម';
-$lang['btn_secedit']= 'កែ';
-$lang['btn_login'] = 'កត់ចូល';
-$lang['btn_logout'] = 'កត់ចេញ';
-$lang['btn_admin'] = 'អ្នកគ្រប់គ្រង';
-$lang['btn_update'] = 'កែឡើង';
-$lang['btn_delete'] = 'លុបចោល';
-$lang['btn_back'] = 'ត្រឡប់';
-$lang['btn_backlink'] = 'ខ្សែចំណងក្រោយ';
-$lang['btn_subscribe'] = 'ដាក់ដំណឹងផ្លស់ប្តូរ';
-$lang['btn_profile'] = 'កែប្រវត្តិរូប';
-$lang['btn_reset'] = 'កមណត់ឡើងរិញ';
-$lang['btn_draft'] = 'កែគំរោង';
-$lang['btn_recover'] = 'ស្រោះគំរោងឡើង';
-$lang['btn_draftdel'] = 'លុបគំរោង';
-$lang['btn_register'] = 'ចុះឈ្មោះ';//'Register';
-
-$lang['loggedinas'] = 'អ្នកប្រើ:';
-$lang['user'] = 'នាមបម្រើ';
-$lang['pass'] = 'ពាក្សសម្ងត់';
-$lang['newpass'] = 'ពាក្សសម្ងាត់ថ្មី';
-$lang['oldpass'] = 'បន្ជាកពាក្សសម្ងាត់';
-$lang['passchk'] = 'ម្ដងទាត';
-$lang['remember'] = 'ចំណាំខ្ញុំ';
-$lang['fullname'] = 'នាមត្រគោល';
-$lang['email'] = 'អ៊ីមែល';
-$lang['profile'] = 'ប្រវត្តិរូប';// 'User Profile';
-$lang['badlogin'] = 'សុំអាទោស​ នាមបំរើ ឬ ពាក្សសម្ងាតមិនត្រវទេ។';
-$lang['minoredit'] = 'កែបបណ្តិចបណ្តួច';// 'Minor Changes';
-$lang['draftdate'] = 'គំរោង កត់ស្វ័យប្រវត្ត';
-
-$lang['regmissing'] = 'សុំអាទោស​ អ្នកត្រវបំពេញក្របវាល។';
-$lang['reguexists'] = 'សុំអាទោស​ នាមប្រើនេះមានរួចហើ។';
-$lang['regsuccess'] = 'អ្នកប្រើបានបង្កើតហើយ និងពាក្សសម្ងាតក៏បានផ្ញើទៀត។';
-$lang['regsuccess2']= 'អ្នកប្រើបានបង្កើតហើយ។';
-$lang['regmailfail']= 'មើលទៅដុចជាមានកំហុសក្នុង....សុំទាកទងអ្នកក្របក្រង';
-$lang['regbadmail'] = 'អ៊ីមេលអ្នកសាសេមិនត្រូវបញ្ជរ—បើអ្នកកិតថានេះជាកំហុសបដិបត្តិ សុំទាកទងអ្នកក្របគ្រោង។';
-$lang['regbadpass'] = 'គូពាក្សសម្ងាតមិនដូចគ្នាទេ សមសាកទៀត។';
-$lang['regpwmail'] = 'ពាក្សសម្ងាតអ្នក';
-$lang['reghere'] = 'អ្នកឥតមានបញ្ជីនាមបម្រើទេ? សុំចល់ចុះឈ្មោះធ្វើគណនីសម្របប្រើប្រស';
-
-$lang['profna'] = 'មិនអាចកែ';
-$lang['profnochange'] = 'ឥតផ្លាស់ប្ដូរ ក្មានអ្វីធ្វើទេ។';
-$lang['profnoempty'] = 'នាមេឬអីមេលទទេ';
-$lang['profchanged'] = 'ប្រវត្តិរូបអ្នកប្រើបាន ។';
-
-$lang['pwdforget'] = 'ភ្លិចពាក្សសម្ងាត់ យកមួយទាត។';
-$lang['resendna'] = 'វីគីនេះមិនឧបរំផ្ញើពាក្សសម្ងាតម្ដងទៀតទេ។';
-$lang['resendpwdmissing'] = 'សុំអាទោស​ អ្នកត្រវបំពេញវាល។';
-$lang['resendpwdnouser'] = 'សុំអាទោស​ យាងរកអ្នកប្រើមិនឃើងទេ។';
-$lang['resendpwdbadauth'] = 'សុំអាទោស​ រហស្សលេខអនុញ្ញាតពំអាចប្រើបានទេ។ ខ្សែបន្ត';
-$lang['resendpwdconfirm'] ='ខ្សែបន្ត';
-$lang['resendpwdsuccess'] = 'ពាក្សសម្ងាតអ្នកបានផ្ញើហើយ។';
-
-$lang['txt_upload'] = 'ជ្រើសឯកសារដែលរុញ​ឡើង:';
-$lang['txt_filename'] = 'រុញឡើងជា (ស្រេច​ចិត្ត):';
-$lang['txt_overwrt'] = 'កត់ពីលើ';//'Overwrite existing file';
-$lang['lockedby'] = 'ឥឡូវនេះចកជាប់​:';
-$lang['lockexpire'] = 'សោជាប់ផុត​កំណត់ម៉ោង:';
-$lang['js']['willexpire'] = 'សោអ្នកចំពោះកែតម្រូវទំព័រនេះ ហួសពែលក្នុងមួយនាទី។\nកុំឲ្យមានជម្លោះ ប្រើ «បង្ហាញ»​ ទៅកំណត់​ឡើង​វិញ។';
-
-$lang['js']['notsavedyet'] = 'កម្រែមិនទានរុក្សាទកត្រូវបោះបង់។\nបន្តទៅទាឬទេ?';
-$lang['rssfailed'] = 'មានកំហុសពេលទៅ​ប្រមូល​យកមតិ​ព័ត៌មាន៖ ';
-$lang['nothingfound']= 'រកមិនឃើញអ្វីទេ។';
-
-$lang['mediaselect'] = 'ឯកសារមីឌៀ';
-$lang['uploadsucc'] = 'រុញចូលមានជ័យ';
-$lang['uploadfail'] = 'រុញឡើងបរាជ័យ។ ប្រហែលខុសសិទ្ឋានុញ្ញាត?';
-$lang['uploadwrong'] = 'រុញឡើងត្រូវ​បាន​បដិសេធ។ ឯកសារ';
-$lang['uploadexist'] = 'ឯកសារមានហើយ។ ឥតមានធ្វើអ្វីទេ។';
-$lang['uploadbadcontent'] = 'ធាតុចំរុញឡើងមិនត្រូវកន្ទុយឯកសារ %s ទេ។';
-$lang['uploadspam'] = 'ចំរុញឡើង បង្ខាំង ដៅយ ';
-$lang['uploadxss'] = 'ចំរុញឡើង បង្ខាំង ';
-$lang['deletesucc'] = 'ឯកសារ «%s» បានលុបហើយ។';
-$lang['deletefail'] = '«%s» មិនអាចលុបទេ—មើល';
-$lang['mediainuse'] = 'ឯកសារ «%s» ឥតទានលុបទេ—មានគេកំភងទេជាប់ប្រើ។';
-$lang['namespaces'] = 'នាមដ្ឋាន';
-$lang['mediafiles'] = 'ឯកសារទំនេនៅក្នុង';
-
-$lang['js']['keepopen'] = 'ទុកបង្អួចបើក ពេលការជម្រើស';
-$lang['js']['hidedetails'] = 'បាំង';
-$lang['mediausage'] = 'ប្រើ';
-$lang['mediaview'] = 'មើលឯកសារដើម';
-$lang['mediaroot'] = 'ឫស';
-$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['line'] = 'ខ្សែ';
-$lang['breadcrumb'] = 'ដាន:';
-$lang['youarehere'] = 'ដាន:';
-$lang['lastmod'] = 'ពេលកែចុងក្រោយ:';
-$lang['by'] = 'និពន្ឋដោយ';
-$lang['deleted'] = 'យកចេញ';
-$lang['created'] = 'បង្កើត';
-$lang['external_edit'] = 'កំរេពីក្រៅ';
-$lang['summary'] = 'កែតម្រា';
-
-$lang['mail_newpage'] = 'ថែមទំព័រ';
-$lang['mail_changed'] = 'ទំព័រប្រែប្រួល';
-$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'] = 'និវេទន៍ទី១';
-$lang['qb_h2'] = 'និវេទន៍ទី២';
-$lang['qb_h3'] = 'និវេទន៍ទី៣';
-$lang['qb_h4'] = 'និវេទន៍ទី៤';
-$lang['qb_h5'] = 'និវេទន៍ទី៥';
-$lang['qb_link'] = 'ខ្សែបន្តក្នុង';
-$lang['qb_extlink'] = 'ខ្សែបន្តក្រៅ';
-$lang['qb_hr'] = 'បន្ទាផ្ដេក';
-$lang['qb_ol'] = 'តារាងត្រៀប';
-$lang['qb_ul'] = 'តារាងអត្រៀប';
-$lang['qb_media'] = 'បន្ថែមរូនឹងឯកសារឥទៀត';
-$lang['qb_sig'] = 'ស៊កហត្ថលេខា';
-$lang['qb_smileys'] = 'សញ្ញាអារម្មណ៍';
-$lang['qb_chars'] = 'អក្ខរៈពិសេស';
-
-$lang['js']['del_confirm']= 'លុប';
-
-$lang['metaedit'] = 'កែទិន្នន័យអរូប';//'Edit Metadata';
-$lang['metasaveerr'] = 'ពំអាចកត់រទិន្នន័យអរូប';//'Writing metadata failed';
-$lang['metasaveok'] = 'ទិន្នន័យអរូប';
-$lang['btn_img_backto'] = 'ថយក្រោយ%s';
-$lang['img_title'] = 'អភិធេយ្យ:';
-$lang['img_caption'] = 'ចំណងជើង:';
-$lang['img_date'] = 'ថ្ងៃខែ:';//'Date';
-$lang['img_fname'] = 'ឈ្មោះឯកសារ:';
-$lang['img_fsize'] = 'ទំហំ:';//'Size';
-$lang['img_artist'] = 'អ្នកថតរូប:';
-$lang['img_copyr'] = 'រក្សា​សិទ្ធិ:';
-$lang['img_format'] = 'ធុនប្រភេទ:';
-$lang['img_camera'] = 'គ្រឿងថត:';
-$lang['img_keywords']= 'មេពាក្ស:';//'Keywords';
-
-/* auth.class language support */
-$lang['authtempfail'] = 'ការផ្ទៀងផ្ទាត់​ភាព​​ត្រឹមត្រូវឥតដំនេ។ ប្រើ ....';
-
-/* installer strings */
-$lang['i_chooselang'] = 'រើសពាស្សាអ្នក';
-$lang['i_installer'] = 'ដំឡើងឌោគូវីគី';
-$lang['i_wikiname'] = 'នាមវីគី';
-$lang['i_enableacl'] = 'បើកប្រើ (អនុសាស)';
-$lang['i_superuser'] = 'អ្នកកំពូល';
-$lang['i_problems'] = 'កម្មវិធី​ដំឡើងបានប៉ះឧបសគ្គ។ អ្នកមិនអាចបន្តទៅទៀត ដល់អ្នកជួសជុលវា។';
-$lang['i_modified'] = '';
-$lang['i_permfail'] = '<code>%s</code> មិនអាចសាស';
-$lang['i_confexists'] = '<code>%s</code> មានហាយ';
-$lang['i_writeerr'] = 'មិនអាចបណ្កើ<code>%s</code>។ អ្នកត្រវការពិនិត្យអធិក្រឹតិរបស់ថតនឹងឯកសារ។';
-$lang['i_success'] = '';
-$lang['i_failure'] = 'ពលសាសារ';
-$lang['i_policy'] = 'បញ្ជីអនុញ្ញតផ្ដើម';
-$lang['i_pol0'] = 'វីគីបើកចំហ';
-$lang['i_pol1'] = 'វីគីសធារណៈ';
-$lang['i_pol2'] = 'វីគីបិទជិត';
-
-$lang['i_retry'] = 'ម្តងទៀត';
-
-//Setup VIM: ex: et ts=2 :
-$lang['email_signature_text'] = 'អ៊ីមេលនេះបន្ចេអពីឌោគូវីគីនៅ
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['doublequoteopening'] = '«';
+$lang['doublequoteclosing'] = '»';
+$lang['singlequoteopening'] = '‘';
+$lang['singlequoteclosing'] = '’';
+$lang['apostrophe'] = '’';
+$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_newer'] = '<<ទំព័រទំនើប';
+$lang['btn_older'] = 'ទំព័រថ្មែសម័យ>>';
+$lang['btn_revs'] = 'ទំព័រចាស់ៗ';
+$lang['btn_recent'] = 'ទំព័រថ្មីៗ';
+$lang['btn_upload'] = 'ដាកលើង';
+$lang['btn_cancel'] = 'បោះបង់';
+$lang['btn_index'] = 'លិបិក្រម';
+$lang['btn_secedit'] = 'កែ';
+$lang['btn_login'] = 'កត់ចូល';
+$lang['btn_logout'] = 'កត់ចេញ';
+$lang['btn_admin'] = 'អ្នកគ្រប់គ្រង';
+$lang['btn_update'] = 'កែឡើង';
+$lang['btn_delete'] = 'លុបចោល';
+$lang['btn_back'] = 'ត្រឡប់';
+$lang['btn_backlink'] = 'ខ្សែចំណងក្រោយ';
+$lang['btn_subscribe'] = 'ដាក់ដំណឹងផ្លស់ប្តូរ';
+$lang['btn_profile'] = 'កែប្រវត្តិរូប';
+$lang['btn_reset'] = 'កមណត់ឡើងរិញ';
+$lang['btn_draft'] = 'កែគំរោង';
+$lang['btn_recover'] = 'ស្រោះគំរោងឡើង';
+$lang['btn_draftdel'] = 'លុបគំរោង';
+$lang['btn_register'] = 'ចុះឈ្មោះ';
+$lang['btn_img_backto'] = 'ថយក្រោយ%s';
+$lang['loggedinas'] = 'អ្នកប្រើ:';
+$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['js']['willexpire'] = 'សោអ្នកចំពោះកែតម្រូវទំព័រនេះ ហួសពែលក្នុងមួយនាទី។\nកុំឲ្យមានជម្លោះ ប្រើ «បង្ហាញ»​ ទៅកំណត់​ឡើង​វិញ។';
+$lang['js']['notsavedyet'] = 'កម្រែមិនទានរុក្សាទកត្រូវបោះបង់។\nបន្តទៅទាឬទេ?';
+$lang['js']['keepopen'] = 'ទុកបង្អួចបើក ពេលការជម្រើស';
+$lang['js']['hidedetails'] = 'បាំង';
+$lang['js']['medialeft'] = 'តម្រឹមរូបភាពនៅខាងឆ្វេង។';
+$lang['js']['mediaright'] = 'តម្រឹមរូបភាពនៅខាងស្តាំ។';
+$lang['js']['mediacenter'] = 'តម្រឹមរូបភាពនៅកណ្តាល។';
+$lang['js']['medianoalign'] = 'កុំប្រើតម្រឹម។';
+$lang['js']['del_confirm'] = 'លុប';
+$lang['js']['media_diff'] = 'មើលអ្វីដែលខុសគ្នា:';
+$lang['js']['media_upload_btn'] = 'ផ្ទុកឡើង';
+$lang['js']['media_done_btn'] = 'ការបានបញ្ចប់';
+$lang['js']['media_cancel'] = 'លុបចេញ';
+$lang['search_starts_with'] = 'ចាប់ផ្ដើមពី';
+$lang['search_ends_with'] = 'បញ្ចប់ពី';
+$lang['search_contains'] = 'មាននៅខាងក្នុង';
+$lang['search_any_ns'] = 'ដ្ឋាននាមអ្វីៗ';
+$lang['search_any_time'] = 'គ្រប់ពេល';
+$lang['search_past_7_days'] = 'សប្តាហ៍មុន';
+$lang['search_past_month'] = 'ខែមុន';
+$lang['search_past_year'] = 'ឆ្នាំមុន';
+$lang['regmissing'] = 'សុំអាទោស​ អ្នកត្រវបំពេញក្របវាល។';
+$lang['reguexists'] = 'សុំអាទោស​ នាមប្រើនេះមានរួចហើ។';
+$lang['regsuccess'] = 'អ្នកប្រើបានបង្កើតហើយ និងពាក្សសម្ងាតក៏បានផ្ញើទៀត។';
+$lang['regsuccess2'] = 'អ្នកប្រើបានបង្កើតហើយ។';
+$lang['regmailfail'] = 'មើលទៅដុចជាមានកំហុសក្នុង....សុំទាកទងអ្នកក្របក្រង';
+$lang['regbadmail'] = 'អ៊ីមេលអ្នកសាសេមិនត្រូវបញ្ជរ—បើអ្នកកិតថានេះជាកំហុសបដិបត្តិ សុំទាកទងអ្នកក្របគ្រោង។';
+$lang['regbadpass'] = 'គូពាក្សសម្ងាតមិនដូចគ្នាទេ សមសាកទៀត។';
+$lang['regpwmail'] = 'ពាក្សសម្ងាតអ្នក';
+$lang['reghere'] = 'អ្នកឥតមានបញ្ជីនាមបម្រើទេ? សុំចល់ចុះឈ្មោះធ្វើគណនីសម្របប្រើប្រស';
+$lang['profna'] = 'មិនអាចកែ';
+$lang['profnochange'] = 'ឥតផ្លាស់ប្ដូរ ក្មានអ្វីធ្វើទេ។';
+$lang['profnoempty'] = 'នាមេឬអីមេលទទេ';
+$lang['profchanged'] = 'ប្រវត្តិរូបអ្នកប្រើបាន ។';
+$lang['pwdforget'] = 'ភ្លិចពាក្សសម្ងាត់ យកមួយទាត។';
+$lang['resendna'] = 'វីគីនេះមិនឧបរំផ្ញើពាក្សសម្ងាតម្ដងទៀតទេ។';
+$lang['resendpwdmissing'] = 'សុំអាទោស​ អ្នកត្រវបំពេញវាល។';
+$lang['resendpwdnouser'] = 'សុំអាទោស​ យាងរកអ្នកប្រើមិនឃើងទេ។';
+$lang['resendpwdbadauth'] = 'សុំអាទោស​ រហស្សលេខអនុញ្ញាតពំអាចប្រើបានទេ។ ខ្សែបន្ត';
+$lang['resendpwdconfirm'] = 'ខ្សែបន្ត';
+$lang['resendpwdsuccess'] = 'ពាក្សសម្ងាតអ្នកបានផ្ញើហើយ។';
+$lang['txt_upload'] = 'ជ្រើសឯកសារដែលរុញ​ឡើង:';
+$lang['txt_filename'] = 'រុញឡើងជា (ស្រេច​ចិត្ត):';
+$lang['txt_overwrt'] = 'កត់ពីលើ';
+$lang['lockedby'] = 'ឥឡូវនេះចកជាប់​:';
+$lang['lockexpire'] = 'សោជាប់ផុត​កំណត់ម៉ោង:';
+$lang['rssfailed'] = 'មានកំហុសពេលទៅ​ប្រមូល​យកមតិ​ព័ត៌មាន៖ ';
+$lang['nothingfound'] = 'រកមិនឃើញអ្វីទេ។';
+$lang['mediaselect'] = 'ឯកសារមីឌៀ';
+$lang['uploadsucc'] = 'រុញចូលមានជ័យ';
+$lang['uploadfail'] = 'រុញឡើងបរាជ័យ។ ប្រហែលខុសសិទ្ឋានុញ្ញាត?';
+$lang['uploadwrong'] = 'រុញឡើងត្រូវ​បាន​បដិសេធ។ ឯកសារ';
+$lang['uploadexist'] = 'ឯកសារមានហើយ។ ឥតមានធ្វើអ្វីទេ។';
+$lang['uploadbadcontent'] = 'ធាតុចំរុញឡើងមិនត្រូវកន្ទុយឯកសារ %s ទេ។';
+$lang['uploadspam'] = 'ចំរុញឡើង បង្ខាំង ដៅយ ';
+$lang['uploadxss'] = 'ចំរុញឡើង បង្ខាំង ';
+$lang['deletesucc'] = 'ឯកសារ «%s» បានលុបហើយ។';
+$lang['deletefail'] = '«%s» មិនអាចលុបទេ—មើល';
+$lang['mediainuse'] = 'ឯកសារ «%s» ឥតទានលុបទេ—មានគេកំភងទេជាប់ប្រើ។';
+$lang['namespaces'] = 'ដ្ឋាននាម';
+$lang['mediafiles'] = 'ឯកសារទំនេនៅក្នុង';
+$lang['mediausage'] = 'ប្រើ';
+$lang['mediaview'] = 'មើលឯកសារដើម';
+$lang['mediaroot'] = 'ឫស';
+$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['line'] = 'ខ្សែ';
+$lang['breadcrumb'] = 'ដាន:';
+$lang['youarehere'] = 'ដាន:';
+$lang['lastmod'] = 'ពេលកែចុងក្រោយ:';
+$lang['by'] = 'និពន្ឋដោយ';
+$lang['deleted'] = 'យកចេញ';
+$lang['created'] = 'បង្កើត';
+$lang['external_edit'] = 'កំរេពីក្រៅ';
+$lang['summary'] = 'កែតម្រា';
+$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'] = 'និវេទន៍ទី១';
+$lang['qb_h2'] = 'និវេទន៍ទី២';
+$lang['qb_h3'] = 'និវេទន៍ទី៣';
+$lang['qb_h4'] = 'និវេទន៍ទី៤';
+$lang['qb_h5'] = 'និវេទន៍ទី៥';
+$lang['qb_link'] = 'ខ្សែបន្តក្នុង';
+$lang['qb_extlink'] = 'ខ្សែបន្តក្រៅ';
+$lang['qb_hr'] = 'បន្ទាផ្ដេក';
+$lang['qb_ol'] = 'តារាងត្រៀប';
+$lang['qb_ul'] = 'តារាងអត្រៀប';
+$lang['qb_media'] = 'បន្ថែមរូនឹងឯកសារឥទៀត';
+$lang['qb_sig'] = 'ស៊កហត្ថលេខា';
+$lang['qb_smileys'] = 'សញ្ញាអារម្មណ៍';
+$lang['qb_chars'] = 'អក្ខរៈពិសេស';
+$lang['metaedit'] = 'កែទិន្នន័យអរូប';
+$lang['metasaveerr'] = 'ពំអាចកត់រទិន្នន័យអរូប';
+$lang['metasaveok'] = 'ទិន្នន័យអរូប';
+$lang['img_title'] = 'អភិធេយ្យ:';
+$lang['img_caption'] = 'ចំណងជើង:';
+$lang['img_date'] = 'ថ្ងៃខែ:';
+$lang['img_fname'] = 'ឈ្មោះឯកសារ:';
+$lang['img_fsize'] = 'ទំហំ:';
+$lang['img_artist'] = 'អ្នកថតរូប:';
+$lang['img_copyr'] = 'រក្សា​សិទ្ធិ:';
+$lang['img_format'] = 'ធុនប្រភេទ:';
+$lang['img_camera'] = 'គ្រឿងថត:';
+$lang['img_keywords'] = 'មេពាក្ស:';
+$lang['authtempfail'] = 'ការផ្ទៀងផ្ទាត់​ភាព​​ត្រឹមត្រូវឥតដំនេ។ ប្រើ ....';
+$lang['i_chooselang'] = 'រើសពាស្សាអ្នក';
+$lang['i_installer'] = 'ដំឡើងឌោគូវីគី';
+$lang['i_wikiname'] = 'នាមវីគី';
+$lang['i_enableacl'] = 'បើកប្រើ (អនុសាស)';
+$lang['i_superuser'] = 'អ្នកកំពូល';
+$lang['i_problems'] = 'កម្មវិធី​ដំឡើងបានប៉ះឧបសគ្គ។ អ្នកមិនអាចបន្តទៅទៀត ដល់អ្នកជួសជុលវា។';
+$lang['i_permfail'] = '<code>%s</code> មិនអាចសាស';
+$lang['i_confexists'] = '<code>%s</code> មានហាយ';
+$lang['i_writeerr'] = 'មិនអាចបណ្កើ<code>%s</code>។ អ្នកត្រវការពិនិត្យអធិក្រឹតិរបស់ថតនឹងឯកសារ។';
+$lang['i_failure'] = 'ពលសាសារ';
+$lang['i_policy'] = 'បញ្ជីអនុញ្ញតផ្ដើម';
+$lang['i_pol0'] = 'វីគីបើកចំហ';
+$lang['i_pol1'] = 'វីគីសធារណៈ';
+$lang['i_pol2'] = 'វីគីបិទជិត';
+$lang['i_retry'] = 'ម្តងទៀត';
+$lang['email_signature_text'] = 'អ៊ីមេលនេះបន្ចេអពីឌោគូវីគីនៅ
@DOKUWIKIURL@';
diff --git a/inc/lang/km/login.txt b/inc/lang/km/login.txt
index 2149d9c32..17d3904f5 100644
--- a/inc/lang/km/login.txt
+++ b/inc/lang/km/login.txt
@@ -1,5 +1,3 @@
====== កត់ចូល ======
-អ្នកមិនទាន់។
-អ្នកត្រូវការអនុញ្ញាឲ្យកត់តនំបានចូល។
-
+អ្នកមិនទាន់។ អ្នកត្រូវការអនុញ្ញាឲ្យកត់តនំបានចូល។
diff --git a/inc/lang/km/newpage.txt b/inc/lang/km/newpage.txt
index 4b2b4e2d8..fe786e65d 100644
--- a/inc/lang/km/newpage.txt
+++ b/inc/lang/km/newpage.txt
@@ -1,4 +1,3 @@
-====== ឥតទានមានទេ ======
-អ្នកតាមត្រសៃខ្សែដែលគ្មានទំព័រ។
-បើ
+====== ឥតទាន់មានទេ ======
+អ្នកតាមត្រសៃខ្សែដែលគ្មានទំព័រ។ បើ
diff --git a/inc/lang/km/norev.txt b/inc/lang/km/norev.txt
index 7ca11893e..050ae6278 100644
--- a/inc/lang/km/norev.txt
+++ b/inc/lang/km/norev.txt
@@ -1,2 +1,3 @@
====== ឥតមានបុនរាព្រឹត្តិទេ ======
+
បុនរាព្រឹត្តិពុំមានទេ។ សុំប្រើ «ទំព័រចាស់ៗ» ទៅមើលបញ្ជីប្រវត្តទំព័រចាស់រូបស់អត្ថបទនេះ។
diff --git a/inc/lang/km/pwconfirm.txt b/inc/lang/km/pwconfirm.txt
index 34051aa4c..a51d1fcd2 100644
--- a/inc/lang/km/pwconfirm.txt
+++ b/inc/lang/km/pwconfirm.txt
@@ -1,8 +1,8 @@
សួស្ដី @FULLNAME@!
មានគេសុមស្នើពាក្យ​សម្ងាត់​រុបសឲ្យ@TITLE@ នៅ @DOKUWIKIURL@។
-បើអ្នកមិនជាអ្នកសុមពាក្យ​សម្ងាត់ទេ សុំបស់ចល់អ៊ីមេលនេះ។
+បើអ្នកមិនជាអ្នកសុមពាក្យ​សម្ងាត់ទេ សុំបស់ចល់អ៊ីមេលនេះ។
សុំអះអាងដែលសំណើនេះដោយទៅតាមខ្សែ
diff --git a/inc/lang/km/recent.txt b/inc/lang/km/recent.txt
index 14449ea49..d53e1d115 100644
--- a/inc/lang/km/recent.txt
+++ b/inc/lang/km/recent.txt
@@ -1,3 +1,3 @@
====== ប្រវត្តិទំព័របច្ចុប្បន្ន ======
-ទំព័រទាំងនេះគឺទំព័រកែប្រែ
+ទំព័រទាំងនេះគឺទំព័រកែប្រែ:
diff --git a/inc/lang/km/register.txt b/inc/lang/km/register.txt
index b850c2ec3..b407419c8 100644
--- a/inc/lang/km/register.txt
+++ b/inc/lang/km/register.txt
@@ -1,7 +1,3 @@
====== អ្នកប្រើថ្មី ======
-Fill in all the information below to create a new account in this wiki.
-Make sure you supply a **valid e-mail address** - if you are not asked
-to enter a password here, a new one will be sent to that address.
-The login name should be a valid [[doku>wiki:pagename|pagename]].
-
+បំពេញនៅក្នុងទាំងអស់ព័ត៌មានខាងក្រោមដើម្បីបង្កើតគណនីថ្មីនៅក្នុងវិគីនេះ។ ធ្វើឱ្យប្រាកដថាអ្នកផ្គត់ផ្គង់មួយ**សុពលភាពអ៊ីម៉ែលអាសយដ្ឋាន**-ប្រសិនបើអ្នកមិនត្រូវបានសួរដើម្បីបញ្ចូលពាក្យសម្ងាត់នៅទីនេះថ្មីមួយនឹងត្រូវបានផ្ញើទៅអាសយដ្ឋាន។ ឈ្មោះចូលគួរត្រូវបានយសុពលភាព [[doku>wiki:pagename|ទំព័រឈ្មោះ]].
diff --git a/inc/lang/km/revisions.txt b/inc/lang/km/revisions.txt
index a15186df8..d25f407bb 100644
--- a/inc/lang/km/revisions.txt
+++ b/inc/lang/km/revisions.txt
@@ -1,4 +1,3 @@
====== ប្រវត្តិទំព័រចាស់ ======
-ទាំងនេះគឺប្រវត្តិទំព័រចាស់រុបសអត្ថបទនេះ។
-ជ្រើសខ្សែទំព័រពីខាងក្រោមហើយ ចុត «កែទំព័រនេះ» រួចហើយរក្សាវាទុក។
+ទាំងនេះគឺប្រវត្តិទំព័រចាស់រុបសអត្ថបទនេះ។ ជ្រើសខ្សែទំព័រពីខាងក្រោមហើយ ចុត «កែទំព័រនេះ» រួចហើយរក្សាវាទុក។
diff --git a/inc/lang/kn/admin.txt b/inc/lang/kn/admin.txt
index 2897218da..ae08fe4d4 100644
--- a/inc/lang/kn/admin.txt
+++ b/inc/lang/kn/admin.txt
@@ -1,2 +1,3 @@
====== ಆಡಳಿತಾತ್ಮಕ ======
-ಈ ಕೆಳಗೆ ಡಾಕುವಿಕಿ(DokuWiki)ಯಲ್ಲಿರುವ ಆಡಳಿತಾತ್ಮಕ ಕಾರ್ಯಗಳ ಪಟ್ಟಿಯನ್ನು ನೋಡಬಹುದು. \ No newline at end of file
+
+ಈ ಕೆಳಗೆ ಡಾಕುವಿಕಿ(DokuWiki)ಯಲ್ಲಿರುವ ಆಡಳಿತಾತ್ಮಕ ಕಾರ್ಯಗಳ ಪಟ್ಟಿಯನ್ನು ನೋಡಬಹುದು.
diff --git a/inc/lang/kn/backlinks.txt b/inc/lang/kn/backlinks.txt
index 68ef78bc7..f68ea012f 100644
--- a/inc/lang/kn/backlinks.txt
+++ b/inc/lang/kn/backlinks.txt
@@ -1,2 +1,3 @@
====== ಹಿಂಕೊಂಡಿಗಳು ======
-ಹಾಲಿ ಪುಟಕ್ಕೆ ಹಿಂದಕ್ಕೆ ಕೊಂಡಿಯಿರಬಹುದಾದಂತಹ ಪುಟಗಳ ಪಟ್ಟಿಯಿದು. \ No newline at end of file
+
+ಹಾಲಿ ಪುಟಕ್ಕೆ ಹಿಂದಕ್ಕೆ ಕೊಂಡಿಯಿರಬಹುದಾದಂತಹ ಪುಟಗಳ ಪಟ್ಟಿಯಿದು.
diff --git a/inc/lang/kn/conflict.txt b/inc/lang/kn/conflict.txt
index 880639f06..6447a3d90 100644
--- a/inc/lang/kn/conflict.txt
+++ b/inc/lang/kn/conflict.txt
@@ -1,4 +1,5 @@
====== ಹೊಸ ಅವತರಣಿಕೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ ======
+
ನೀವು ಸಂಪಾದಿಸಿದ ಕಡತದ ಇನ್ನೂ ಹೊಸ ಆವೃತ್ತಿ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. ನೀವು ಸಂಪಾದಿಸುತ್ತಿರುವಾಗ ಬೇರೊಬ್ಬರು ಅದೇ ಕಡತವನ್ನು ಮಾರ್ಪಡಿಸಿದರೆ ಹೀಗಾಗುತ್ತದೆ.
-ಕೆಳಗೆ ತೋರಿಸಿರುವ ವ್ಯತ್ಯಾಸಗಳನ್ನು ಕೂಲಂಕುಶವಾಗಿ ಪರಿಶೀಲಿಸಿ, ನಂತರ ಯಾವ ಆವೃತ್ತಿಯನ್ನು ಇಟ್ಟುಕೊಳ್ಳಬೇಕೆಂದು ನಿರ್ಧರಿಸಿ. ನೀವು "ಉಳಿಸು" ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಂಡರೆ ನಿಮ್ಮ ಆವೃತ್ತಿ ಉಳಿದುಕೊಳ್ಳುತ್ತದೆ. ನೀವು "ರದ್ದು ಮಾಡು" ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಂಡರೆ ಹಾಲಿ ಆವೃತ್ತಿ ಉಳಿಯುತ್ತದೆ. \ No newline at end of file
+ಕೆಳಗೆ ತೋರಿಸಿರುವ ವ್ಯತ್ಯಾಸಗಳನ್ನು ಕೂಲಂಕುಶವಾಗಿ ಪರಿಶೀಲಿಸಿ, ನಂತರ ಯಾವ ಆವೃತ್ತಿಯನ್ನು ಇಟ್ಟುಕೊಳ್ಳಬೇಕೆಂದು ನಿರ್ಧರಿಸಿ. ನೀವು "ಉಳಿಸು" ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಂಡರೆ ನಿಮ್ಮ ಆವೃತ್ತಿ ಉಳಿದುಕೊಳ್ಳುತ್ತದೆ. ನೀವು "ರದ್ದು ಮಾಡು" ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಂಡರೆ ಹಾಲಿ ಆವೃತ್ತಿ ಉಳಿಯುತ್ತದೆ.
diff --git a/inc/lang/ko/admin.txt b/inc/lang/ko/admin.txt
index 2f81e8961..6f8c9e5ee 100644
--- a/inc/lang/ko/admin.txt
+++ b/inc/lang/ko/admin.txt
@@ -1,3 +1,3 @@
====== 관리 ======
-도쿠위키에서 사용할 수 있는 관리 작업 목록을 아래에서 찾을 수 있습니다. \ No newline at end of file
+도쿠위키에서 사용할 수 있는 관리 작업 목록을 아래에서 찾을 수 있습니다.
diff --git a/inc/lang/ko/backlinks.txt b/inc/lang/ko/backlinks.txt
index 457974d86..ee86e0c3c 100644
--- a/inc/lang/ko/backlinks.txt
+++ b/inc/lang/ko/backlinks.txt
@@ -1,3 +1,3 @@
====== 역링크 ======
-현재 문서를 가리키는 링크가 있는 문서 목록입니다. \ No newline at end of file
+현재 문서를 가리키는 링크가 있는 문서 목록입니다.
diff --git a/inc/lang/ko/conflict.txt b/inc/lang/ko/conflict.txt
index b5420333b..ba15a02ac 100644
--- a/inc/lang/ko/conflict.txt
+++ b/inc/lang/ko/conflict.txt
@@ -2,4 +2,4 @@
편집한 문서의 새 판이 있습니다. 당신이 편집하고 있는 동안 다른 사용자가 문서를 바꾸면 이런 일이 생길 수 있습니다.
-아래의 차이를 철저하게 검토하고 어떤 판을 저장하실지 결정하세요. ''저장''을 선택하면 당신의 판이 저장됩니다. ''취소''를 선택하면 현재 판이 유지됩니다. \ No newline at end of file
+아래의 차이를 철저하게 검토하고 어떤 판을 저장하실지 결정하세요. ''저장''을 선택하면 당신의 판이 저장됩니다. ''취소''를 선택하면 현재 판이 유지됩니다.
diff --git a/inc/lang/ko/denied.txt b/inc/lang/ko/denied.txt
index bf82fbd31..8ed2b224f 100644
--- a/inc/lang/ko/denied.txt
+++ b/inc/lang/ko/denied.txt
@@ -1,3 +1,3 @@
====== 권한 거절 ======
-죄송하지만 계속할 수 있는 권한이 없습니다. \ No newline at end of file
+죄송하지만 계속할 수 있는 권한이 없습니다.
diff --git a/inc/lang/ko/diff.txt b/inc/lang/ko/diff.txt
index 3fef83221..3e68b202e 100644
--- a/inc/lang/ko/diff.txt
+++ b/inc/lang/ko/diff.txt
@@ -1,3 +1,3 @@
====== 차이 ======
-문서의 선택한 두 판 사이의 차이를 보여줍니다. \ No newline at end of file
+문서의 선택한 두 판 사이의 차이를 보여줍니다.
diff --git a/inc/lang/ko/draft.txt b/inc/lang/ko/draft.txt
index bb6dc8c00..49224f802 100644
--- a/inc/lang/ko/draft.txt
+++ b/inc/lang/ko/draft.txt
@@ -2,4 +2,4 @@
이 문서의 마지막 편집 세션은 올바르게 끝나지 않았습니다. 도쿠위키는 작업 도중 자동으로 저장된 초안을 사용해 편집을 계속 할 수 있습니다. 마지막 세션 동안 저장된 초안을 아래에서 볼 수 있습니다.
-비정상적으로 끝난 편집 세션을 **복구**할지 여부를 결정하고, 자동으로 저장되었던 초안을 **삭제**하거나 편집 과정을 **취소**하세요. \ No newline at end of file
+비정상적으로 끝난 편집 세션을 **복구**할지 여부를 결정하고, 자동으로 저장되었던 초안을 **삭제**하거나 편집 과정을 **취소**하세요.
diff --git a/inc/lang/ko/edit.txt b/inc/lang/ko/edit.txt
index 70b24ac7b..b90cca7a4 100644
--- a/inc/lang/ko/edit.txt
+++ b/inc/lang/ko/edit.txt
@@ -1 +1 @@
-문서를 편집하고 ''저장''을 누르세요. 위키 구문은 [[wiki:syntax]]를 참조하세요. 문서를 **더 좋게 만들 자신이 있을 때**에만 편집하세요. 연습을 하고 싶다면 먼저 [[playground:playground|연습장]]에 가서 연습하세요. \ No newline at end of file
+문서를 편집하고 ''저장''을 누르세요. 위키 구문은 [[wiki:syntax]]를 참조하세요. 문서를 **더 좋게 만들 자신이 있을 때**에만 편집하세요. 연습을 하고 싶다면 먼저 [[playground:playground|연습장]]에 가서 연습하세요.
diff --git a/inc/lang/ko/editrev.txt b/inc/lang/ko/editrev.txt
index 530b38d25..675c99730 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 ce94e09c8..9cf9e26c0 100644
--- a/inc/lang/ko/index.txt
+++ b/inc/lang/ko/index.txt
@@ -1,3 +1,3 @@
====== 사이트맵 ======
-[[doku>ko:namespaces|이름공간]] 순으로 정렬한 모든 문서의 사이트맵입니다. \ No newline at end of file
+[[doku>ko:namespaces|이름공간]] 순으로 정렬한 모든 문서의 사이트맵입니다.
diff --git a/inc/lang/ko/install.html b/inc/lang/ko/install.html
index ecc0d3caa..e944b4ee5 100644
--- a/inc/lang/ko/install.html
+++ b/inc/lang/ko/install.html
@@ -1,22 +1,7 @@
-<p>이 페이지는 <a href="http://dokuwiki.org">도쿠위키</a>의 첫
-설치와 환경 설정을 도와줍니다. 이 설치 프로그램에 대한 자세한 정보는
-<a href="http://dokuwiki.org/ko:installer">설명문 페이지</a>에서
-볼 수 있습니다.</p>
+<p>이 페이지는 <a href="http://dokuwiki.org">도쿠위키</a>의 첫 설치와 환경 설정을 도와줍니다. 이 설치 프로그램에 대한 자세한 정보는 <a href="http://dokuwiki.org/ko:installer">설명문 페이지</a>에서 볼 수 있습니다.</p>
-<p>도쿠위키는 위키 문서와 해당 문서와 관련된 정보(예를 들어 그림,
-검색 색인, 이전 판 문서 등)를 저장하기 위해 일반적인 텍스트 파일을
-사용합니다. 성공적으로 작동하려면 도쿠위키는 이 파일을 담고
-있는 디렉토리에 대한 쓰기 권한이 <strong>있어야</strong> 합니다.
-이 설치 프로그램은 디렉토리 권한을 설정할 수 없습니다. 보통
-직접 명령 셸에 수행하거나 호스팅을 사용한다면, FTP나 호스팅
-제어판(예를 들어 CPanel)을 통해 수행해야 합니다.</p>
+<p>도쿠위키는 위키 문서와 해당 문서와 관련된 정보(예를 들어 그림, 검색 색인, 이전 판 문서 등)를 저장하기 위해 일반적인 텍스트 파일을 사용합니다. 성공적으로 작동하려면 도쿠위키는 이 파일을 담고 있는 디렉토리에 대한 쓰기 권한이 <strong>있어야</strong> 합니다. 이 설치 프로그램은 디렉토리 권한을 설정할 수 없습니다. 보통 직접 명령 셸에 수행하거나 호스팅을 사용한다면, FTP나 호스팅 제어판(예를 들어 CPanel)을 통해 수행해야 합니다.</p>
-<p>이 설치 프로그램은 관리자로 로그인하고 나서 플러그인 설치, 사용자 관리,
-위키 문서로의 접근 관리와 환경 설정을 바꾸기 위한 도쿠위키의 관리 메뉴에
-접근할 수 있는, <acronym title="access control list; 접근 제어 목록">ACL</acronym>에
-대한 도쿠위키 환경을 설정합니다. 도쿠위키가 작동하는데 필요하지 않지만,
-도쿠위키를 쉽게 관리할 수 있도록 해줍니다.</p>
+<p>이 설치 프로그램은 관리자로 로그인하고 나서 플러그인 설치, 사용자 관리, 위키 문서로의 접근 관리와 환경 설정을 바꾸기 위한 도쿠위키의 관리 메뉴에 접근할 수 있는, <acronym title="access control list; 접근 제어 목록">ACL</acronym>에 대한 도쿠위키 환경을 설정합니다. 도쿠위키가 작동하는데 필요하지 않지만, 도쿠위키를 쉽게 관리할 수 있도록 해줍니다.</p>
-<p>숙련된 사용자나 특수한 설치가 필요한 사용자에게 자세한 내용은
-<a href="http://dokuwiki.org/ko:install">설치 지침</a>과
-<a href="http://dokuwiki.org/ko:config">환경 설정</a> 링크를 사용해야 합니다.</p>
+<p>숙련된 사용자나 특수한 설치가 필요한 사용자에게 자세한 내용은 <a href="http://dokuwiki.org/ko:install">설치 지침</a>과 <a href="http://dokuwiki.org/ko:config">환경 설정</a> 링크를 사용해야 합니다.</p>
diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php
index 91bd8caaf..50ad63444 100644
--- a/inc/lang/ko/lang.php
+++ b/inc/lang/ko/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author pavement <pavement@rael.cc>
+ * @author Traend <Traend@ruu.kr>
* @author Seungheon Song <esketch@gmail.com>
* @author Hyun Kim <lawfully@gmail.com>
* @author jk Lee
@@ -49,7 +51,7 @@ $lang['btn_back'] = '뒤로';
$lang['btn_backlink'] = '역링크';
$lang['btn_subscribe'] = '구독 관리';
$lang['btn_profile'] = '프로필 업데이트';
-$lang['btn_reset'] = '재설정';
+$lang['btn_reset'] = '재';
$lang['btn_resendpwd'] = '새 비밀번호 설정';
$lang['btn_draft'] = '초안 편집';
$lang['btn_recover'] = '초안 복구';
@@ -76,44 +78,10 @@ $lang['badpassconfirm'] = '죄송하지만 비밀번호가 잘못되었
$lang['minoredit'] = '사소한 바뀜';
$lang['draftdate'] = '초안 자동 저장 시간';
$lang['nosecedit'] = '한 동안 문서가 바뀌었으며, 문단 정보가 오래되어 문서 전체를 대신 열었습니다.';
-$lang['regmissing'] = '죄송하지만 모든 필드를 채워야 합니다.';
-$lang['reguexists'] = '죄송하지만 같은 이름을 사용하는 사용자가 있습니다.';
-$lang['regsuccess'] = '사용자 계정을 만들었으며 비밀번호는 이메일로 보냈습니다.';
-$lang['regsuccess2'] = '사용자 계정을 만들었습니다.';
-$lang['regfail'] = '사용자 계정을 만들 수 없었습니다.';
-$lang['regmailfail'] = '비밀번호를 이메일로 보내는 동안 오류가 발생했습니다. 관리자에게 문의해주세요!';
-$lang['regbadmail'] = '주어진 이메일 주소가 잘못되었습니다 - 오류라고 생각하면 관리자에게 문의해주세요';
-$lang['regbadpass'] = '두 주어진 비밀번호가 일치하지 않습니다, 다시 입력하세요.';
-$lang['regpwmail'] = '도쿠위키 비밀번호';
-$lang['reghere'] = '계정이 없나요? 계정을 등록하세요';
-$lang['profna'] = '이 위키는 프로필 수정을 할 수 없습니다';
-$lang['profnochange'] = '바뀐 내용이 없습니다.';
-$lang['profnoempty'] = '빈 이름이나 이메일 주소는 허용하지 않습니다.';
-$lang['profchanged'] = '프로필이 성공적으로 바뀌었습니다.';
-$lang['profnodelete'] = '이 위키는 사용자 계정 삭제를 지원하지 않습니다';
-$lang['profdeleteuser'] = '계정 삭제';
-$lang['profdeleted'] = '당신의 사용자 계정이 이 위키에서 삭제되었습니다';
-$lang['profconfdelete'] = '이 위키에서 내 계정을 제거하고 싶습니다. <br/> 이 행동은 되돌릴 수 없습니다.';
-$lang['profconfdeletemissing'] = '선택하지 않은 확인 상자를 확인';
-$lang['proffail'] = '사용자 프로필이 업데이트되지 않았습니다.';
-$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['maxuploadsize'] = '최대 올리기 용량. 파일당 %s.';
-$lang['lockedby'] = '현재 잠근 사용자:';
-$lang['lockexpire'] = '잠금 해제 시간:';
+$lang['searchcreatepage'] = '찾으려는 항목을 찾지 못한 경우, 쿼리 이름을 따서 %s 페이지를 만들거나 편집할 수 있습니다.
+';
+$lang['search_fullresults'] = '전체 텍스트 결과';
+$lang['js']['search_toggle_tools'] = '검색 도구 전환';
$lang['js']['willexpire'] = '잠시 후 편집 잠금이 해제됩니다.\n편집 충돌을 피하려면 미리 보기를 눌러 잠금 시간을 다시 설정하세요.';
$lang['js']['notsavedyet'] = '저장하지 않은 바뀜이 사라집니다.';
$lang['js']['searchmedia'] = '파일 검색';
@@ -155,11 +123,53 @@ $lang['js']['media_done_btn'] = '완료';
$lang['js']['media_drop'] = '올릴 파일을 여기에 끌어넣으세요';
$lang['js']['media_cancel'] = '제거';
$lang['js']['media_overwrt'] = '기존 파일에 덮어쓰기';
+$lang['search_exact_match'] = '정확히 일치';
+$lang['search_starts_with'] = '시작';
+$lang['search_ends_with'] = '끝';
+$lang['search_any_ns'] = '모든 네임스페이스';
+$lang['regmissing'] = '죄송하지만 모든 필드를 채워야 합니다.';
+$lang['reguexists'] = '죄송하지만 같은 이름을 사용하는 사용자가 있습니다.';
+$lang['regsuccess'] = '사용자 계정을 만들었으며 비밀번호는 이메일로 보냈습니다.';
+$lang['regsuccess2'] = '사용자 계정을 만들었습니다.';
+$lang['regfail'] = '사용자 계정을 만들 수 없었습니다.';
+$lang['regmailfail'] = '비밀번호를 이메일로 보내는 동안 오류가 발생했습니다. 관리자에게 문의해주세요!';
+$lang['regbadmail'] = '주어진 이메일 주소가 잘못되었습니다 - 오류라고 생각하면 관리자에게 문의해주세요';
+$lang['regbadpass'] = '두 주어진 비밀번호가 일치하지 않습니다, 다시 입력하세요.';
+$lang['regpwmail'] = '도쿠위키 비밀번호';
+$lang['reghere'] = '계정이 없나요? 계정을 등록하세요';
+$lang['profna'] = '이 위키는 프로필 수정을 할 수 없습니다';
+$lang['profnochange'] = '바뀐 내용이 없습니다.';
+$lang['profnoempty'] = '빈 이름이나 이메일 주소는 허용하지 않습니다.';
+$lang['profchanged'] = '프로필이 성공적으로 바뀌었습니다.';
+$lang['profnodelete'] = '이 위키는 사용자 계정 삭제를 지원하지 않습니다';
+$lang['profdeleteuser'] = '계정 삭제';
+$lang['profdeleted'] = '당신의 사용자 계정이 이 위키에서 삭제되었습니다';
+$lang['profconfdelete'] = '이 위키에서 내 계정을 제거하고 싶습니다. <br/> 이 행동은 되돌릴 수 없습니다.';
+$lang['profconfdeletemissing'] = '선택하지 않은 확인 상자를 확인';
+$lang['proffail'] = '사용자 프로필이 업데이트되지 않았습니다.';
+$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['maxuploadsize'] = '최대 올리기 용량. 파일당 %s.';
+$lang['lockedby'] = '현재 잠근 사용자:';
+$lang['lockexpire'] = '잠금 해제 시간:';
$lang['rssfailed'] = '이 피드를 가져오는 동안 오류가 발생했습니다:';
$lang['nothingfound'] = '아무 것도 없습니다.';
$lang['mediaselect'] = '미디어 파일';
$lang['uploadsucc'] = '올리기 성공';
-$lang['uploadfail'] = '올리기가 실패되었습니다. 잘못된 권한 때문일지도 모릅니다.';
+$lang['uploadfail'] = '올리기가 실패되었습니다. 잘못된 ';
$lang['uploadwrong'] = '올리기가 거부되었습니다. 금지된 파일 확장자입니다!';
$lang['uploadexist'] = '파일이 이미 존재합니다.';
$lang['uploadbadcontent'] = '올린 파일이 %s 파일 확장자와 일치하지 않습니다.';
diff --git a/inc/lang/ko/locked.txt b/inc/lang/ko/locked.txt
index 38832d06e..83a677ce8 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 f8af4100f..1ddc8f11c 100644
--- a/inc/lang/ko/login.txt
+++ b/inc/lang/ko/login.txt
@@ -1,3 +1,3 @@
====== 로그인 ======
-로그인하지 않았습니다! 아래에서 로그인하세요. 로그인하려면 쿠키를 활성화해야 합니다. \ No newline at end of file
+로그인하지 않았습니다! 아래에서 로그인하세요. 로그인하려면 쿠키를 활성화해야 합니다.
diff --git a/inc/lang/ko/newpage.txt b/inc/lang/ko/newpage.txt
index a553cf9c2..51c730b1f 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 5cb7360d7..091034094 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/onceexisted.txt b/inc/lang/ko/onceexisted.txt
new file mode 100644
index 000000000..48dff4497
--- /dev/null
+++ b/inc/lang/ko/onceexisted.txt
@@ -0,0 +1,3 @@
+======= 이 페이지는 더 이상 존재하지 않습니다 ======
+
+더 이상 존재하지 않는 페이지에 대한 링크를 따라왔습니다. [[?do=revisions|이전 판]] 목록을 확인하여 삭제 시점과 이유를 확인하고 오래된 판을 확인하거나 복원할 수 있습니다. \ No newline at end of file
diff --git a/inc/lang/ko/preview.txt b/inc/lang/ko/preview.txt
index eed2b21f5..4f5e221d7 100644
--- a/inc/lang/ko/preview.txt
+++ b/inc/lang/ko/preview.txt
@@ -1,3 +1,3 @@
====== 미리 보기 ======
-입력한 내용이 어떻게 보일지 미리 보여줍니다. 아직 **저장되지 않았다**는 점을 기억해두세요! \ No newline at end of file
+입력한 내용이 어떻게 보일지 미리 보여줍니다. 아직 **저장되지 않았다**는 점을 기억해두세요!
diff --git a/inc/lang/ko/pwconfirm.txt b/inc/lang/ko/pwconfirm.txt
index dfe32a0f4..9928502ff 100644
--- a/inc/lang/ko/pwconfirm.txt
+++ b/inc/lang/ko/pwconfirm.txt
@@ -1,7 +1,6 @@
@FULLNAME@님 안녕하세요!
-누군가가 @DOKUWIKIURL@에 @TITLE@에 대해
-새 비밀번호가 필요하다고 요청했습니다.
+누군가가 @DOKUWIKIURL@에 @TITLE@에 대해 새 비밀번호가 필요하다고 요청했습니다.
새 비밀번호를 요청하지 않았다면 이 이메일을 무시해버리세요.
diff --git a/inc/lang/ko/read.txt b/inc/lang/ko/read.txt
index 079b8e130..be80bd73d 100644
--- a/inc/lang/ko/read.txt
+++ b/inc/lang/ko/read.txt
@@ -1 +1 @@
-이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요. \ No newline at end of file
+이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요.
diff --git a/inc/lang/ko/recent.txt b/inc/lang/ko/recent.txt
index 4dd19640c..802cb6941 100644
--- a/inc/lang/ko/recent.txt
+++ b/inc/lang/ko/recent.txt
@@ -1,3 +1,3 @@
====== 최근 바뀜 ======
-다음 문서는 최근에 바뀌었습니다. \ No newline at end of file
+다음 문서는 최근에 바뀌었습니다:
diff --git a/inc/lang/ko/register.txt b/inc/lang/ko/register.txt
index 4d3df298e..027e1d52b 100644
--- a/inc/lang/ko/register.txt
+++ b/inc/lang/ko/register.txt
@@ -1,3 +1,3 @@
====== 새 사용자 등록 ======
-이 위키에 새 계정을 만드려면 아래의 모든 내용을 입력하세요. **올바른 이메일 주소**를 사용하세요. 비밀번호를 입력하는 곳이 없다면, 새 비밀번호는 해당 주소로 보내집니다. 사용자 이름은 올바른 [[doku>ko:pagename|문서 이름]]이어야 합니다. \ No newline at end of file
+이 위키에 새 계정을 만드려면 아래의 모든 내용을 입력하세요. **올바른 이메일 주소**를 사용하세요. 비밀번호를 입력하는 곳이 없다면, 새 비밀번호는 해당 주소로 보내집니다. 사용자 이름은 올바른 [[doku>ko:pagename|문서 이름]]이어야 합니다.
diff --git a/inc/lang/ko/resendpwd.txt b/inc/lang/ko/resendpwd.txt
index 44cd5ad98..b9f48df1e 100644
--- a/inc/lang/ko/resendpwd.txt
+++ b/inc/lang/ko/resendpwd.txt
@@ -1,3 +1,3 @@
====== 새 비밀번호 보내기 ======
-이 위키 계정에 대한 새 비밀번호를 요청하기 위해 아래 양식에서 사용자 이름을 입력하세요. 확인 링크는 새로 등록한 이메일 주소로 보냅니다. \ No newline at end of file
+이 위키 계정에 대한 새 비밀번호를 요청하기 위해 아래 양식에서 사용자 이름을 입력하세요. 확인 링크는 새로 등록한 이메일 주소로 보냅니다.
diff --git a/inc/lang/ko/resetpwd.txt b/inc/lang/ko/resetpwd.txt
index cc2ec6a94..f22aa94ae 100644
--- a/inc/lang/ko/resetpwd.txt
+++ b/inc/lang/ko/resetpwd.txt
@@ -1,3 +1,3 @@
====== 새 비밀번호 설정 ======
-이 위키에 있는 계정의 새 비밀번호를 입력하세요. \ No newline at end of file
+이 위키에 있는 계정의 새 비밀번호를 입력하세요.
diff --git a/inc/lang/ko/revisions.txt b/inc/lang/ko/revisions.txt
index ed80dbcd5..7fa706c00 100644
--- a/inc/lang/ko/revisions.txt
+++ b/inc/lang/ko/revisions.txt
@@ -1,3 +1,3 @@
====== 이전 판 ======
-이 문서의 이전 판은 다음과 같습니다. 이전 판으로 되돌리려면, 아래에서 선택한 다음 ''문서 편집''을 클릭하고 나서 저장하세요. \ No newline at end of file
+이 문서의 이전 판은 다음과 같습니다. 이전 판으로 되돌리려면, 아래에서 선택한 다음 ''문서 편집''을 클릭하고 나서 저장하세요.
diff --git a/inc/lang/ko/searchpage.txt b/inc/lang/ko/searchpage.txt
index 9a3d2f356..881d6da04 100644
--- a/inc/lang/ko/searchpage.txt
+++ b/inc/lang/ko/searchpage.txt
@@ -1,4 +1,3 @@
====== 검색 ======
아래에서 검색 결과를 찾을 수 있습니다. @CREATEPAGEINFO@
-
diff --git a/inc/lang/ko/showrev.txt b/inc/lang/ko/showrev.txt
index 91be367f5..31d8b10b6 100644
--- a/inc/lang/ko/showrev.txt
+++ b/inc/lang/ko/showrev.txt
@@ -1,2 +1,2 @@
**문서의 이전 판입니다!**
----- \ No newline at end of file
+----
diff --git a/inc/lang/ko/stopwords.txt b/inc/lang/ko/stopwords.txt
index b0be85166..71e5a08f2 100644
--- a/inc/lang/ko/stopwords.txt
+++ b/inc/lang/ko/stopwords.txt
@@ -36,4 +36,4 @@ will
with
und
the
-www \ No newline at end of file
+www
diff --git a/inc/lang/ko/updateprofile.txt b/inc/lang/ko/updateprofile.txt
index 0ddea30b0..335091d9a 100644
--- a/inc/lang/ko/updateprofile.txt
+++ b/inc/lang/ko/updateprofile.txt
@@ -1,3 +1,3 @@
====== 계정 프로필 업데이트 ======
-바꾸고 싶은 항목을 입력하세요. 사용자 이름은 바꿀 수 없습니다. \ No newline at end of file
+바꾸고 싶은 항목을 입력하세요. 사용자 이름은 바꿀 수 없습니다.
diff --git a/inc/lang/ku/backlinks.txt b/inc/lang/ku/backlinks.txt
index 5fa2ddfda..408cdee68 100644
--- a/inc/lang/ku/backlinks.txt
+++ b/inc/lang/ku/backlinks.txt
@@ -1,4 +1,3 @@
====== Girêdanên paş ======
Di rûpelên di vê lîsteyê de girêdanên ji vê rûpelê re hene.
-
diff --git a/inc/lang/ku/conflict.txt b/inc/lang/ku/conflict.txt
index e139dce26..37cca18af 100644
--- a/inc/lang/ku/conflict.txt
+++ b/inc/lang/ku/conflict.txt
@@ -3,4 +3,3 @@
Guhertoyeke nûtir a belgeya ku tu biguherînî heye. Sedema wê, bikarhênerkê/î din di hema demê de belge diguherîne.
Examine the differences shown below thoroughly, then decide which version to keep. If you choose ''save'', your version will be saved. Hit ''cancel'' to keep the current version.
-
diff --git a/inc/lang/ku/diff.txt b/inc/lang/ku/diff.txt
index 934ffb67e..70bb24c4c 100644
--- a/inc/lang/ku/diff.txt
+++ b/inc/lang/ku/diff.txt
@@ -1,4 +1,3 @@
====== Cuyawazî ======
Li vê derê cuyawaziyên nav revîziyona hilbijartî û verziyona aniha tên nîşan dan.
-
diff --git a/inc/lang/ku/edit.txt b/inc/lang/ku/edit.txt
index 3a259dcf7..33e0db509 100644
--- a/inc/lang/ku/edit.txt
+++ b/inc/lang/ku/edit.txt
@@ -1,2 +1 @@
-Rûpelê biguherîne û ''Tomar bike'' bitikîne. Ji bo sîntaksa wîkiyê binihêre [[wiki:syntax]]. Ji kerema xwe rûpelê bi tenê biguherîne, heke tû dikarî **baştir** bikî. Heke tu dixwazî çend tiştan biceribînî, biçe [[wiki:playground]]. Li vê derê tu dikarî her tiştî biceribînî.
-
+Rûpelê biguherîne û ''Tomar bike'' bitikîne. Ji bo sîntaksa wîkiyê binihêre [[wiki:syntax]]. Ji kerema xwe rûpelê bi tenê biguherîne, heke tû dikarî **baştir** bikî. Heke tu dixwazî çend tiştan biceribînî, biçe [[playground:playground]]. Li vê derê tu dikarî her tiştî biceribînî.
diff --git a/inc/lang/ku/index.txt b/inc/lang/ku/index.txt
index 401404484..c01e4c67b 100644
--- a/inc/lang/ku/index.txt
+++ b/inc/lang/ku/index.txt
@@ -1,3 +1,3 @@
====== Îndeks ======
-Ev îndeksa hemû rûpelên heyî ye. Rûpel li gora [[doku>namespaces|namespace]] hatin birêzkirin. \ No newline at end of file
+Ev îndeksa hemû rûpelên heyî ye. Rûpel li gora [[doku>namespaces|namespace]] hatin birêzkirin.
diff --git a/inc/lang/ku/lang.php b/inc/lang/ku/lang.php
index 3bfb5e645..651171875 100644
--- a/inc/lang/ku/lang.php
+++ b/inc/lang/ku/lang.php
@@ -1,45 +1,45 @@
<?php
+
/**
* kurdish language file
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @translator Erdal Ronahî <erdal.ronahi@gmail.com>
+ *
+ * @author qezwan <qezwan@gmail.com>
*/
-$lang['encoding'] = 'utf-8';
-$lang['direction'] = 'ltr';
-
-$lang['btn_edit'] = 'Vê rûpelê biguherîne';
-$lang['btn_source'] = 'Çavkaniya rûpelê nîşan bide';
-$lang['btn_show'] = 'Rûpelê nîşan bide';
-$lang['btn_create'] = 'Vê rûpelê biafirîne';
-$lang['btn_search'] = 'Lêbigere';
-$lang['btn_save'] = 'Tomar bike';
-$lang['btn_preview']= 'Pêşdîtin';
-$lang['btn_top'] = 'Biçe ser';
-$lang['btn_newer'] = '<< nûtir';
-$lang['btn_older'] = 'kevntir >>';
-$lang['btn_revs'] = 'Revîziyonên kevn';
-$lang['btn_recent'] = 'Guherandinên dawî';
-$lang['btn_upload'] = 'Bar bike';
-$lang['btn_cancel'] = 'Betal';
-$lang['btn_index'] = 'Îndeks';
-$lang['btn_secedit']= 'Biguherîne';
-$lang['btn_login'] = 'Têkeve';
-$lang['btn_logout'] = 'Derkeve';
-$lang['btn_admin'] = 'Admin';
-$lang['btn_update'] = 'Rojanekirin';
-$lang['btn_delete'] = 'Jê bibe';
-$lang['btn_back'] = 'Paş';
-$lang['btn_backlink'] = 'Girêdanên paş';
-
-$lang['nothingfound']= 'Tiştek nehat dîtin.';
-$lang['reference'] = 'Referansa';
-$lang['toc'] = 'Tabloya Navêrokê';
-$lang['line'] = 'Rêz';
-$lang['breadcrumb'] = 'Şop:';
-$lang['lastmod'] = 'Guherandina dawî:';
-$lang['deleted'] = 'hat jê birin';
-$lang['created'] = 'hat afirandin';
-$lang['summary'] = 'Kurteya guhartinê';
-
-//Setup VIM: ex: et ts=2 :
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['btn_edit'] = 'Vê rûpelê biguherîne';
+$lang['btn_source'] = 'Çavkaniya rûpelê nîşan bide';
+$lang['btn_show'] = 'Rûpelê nîşan bide';
+$lang['btn_create'] = 'Vê rûpelê biafirîne';
+$lang['btn_search'] = 'Lêbigere';
+$lang['btn_save'] = 'Tomar bike';
+$lang['btn_preview'] = 'Pêşdîtin';
+$lang['btn_top'] = 'Biçe ser';
+$lang['btn_newer'] = '<< nûtir';
+$lang['btn_older'] = 'kevntir >>';
+$lang['btn_revs'] = 'Revîziyonên kevn';
+$lang['btn_recent'] = 'Guherandinên dawî';
+$lang['btn_upload'] = 'Bar bike';
+$lang['btn_cancel'] = 'Betal';
+$lang['btn_index'] = 'Îndeks';
+$lang['btn_secedit'] = 'Biguherîne';
+$lang['btn_login'] = 'Têkeve';
+$lang['btn_logout'] = 'Derkeve';
+$lang['btn_admin'] = 'Admin';
+$lang['btn_update'] = 'Rojanekirin';
+$lang['btn_delete'] = 'Jê bibe';
+$lang['btn_back'] = 'Paş';
+$lang['btn_backlink'] = 'Girêdanên paş';
+$lang['passchk'] = 'باریکی دیکە';
+$lang['nothingfound'] = 'Tiştek nehat dîtin.';
+$lang['reference'] = 'Referansa';
+$lang['toc'] = 'Tabloya Navêrokê';
+$lang['line'] = 'Rêz';
+$lang['breadcrumb'] = 'Şop:';
+$lang['lastmod'] = 'Guherandina dawî:';
+$lang['deleted'] = 'hat jê birin';
+$lang['created'] = 'hat afirandin';
+$lang['summary'] = 'Kurteya guhartinê';
diff --git a/inc/lang/ku/newpage.txt b/inc/lang/ku/newpage.txt
index 6d256f06e..3e898e4bb 100644
--- a/inc/lang/ku/newpage.txt
+++ b/inc/lang/ku/newpage.txt
@@ -1,3 +1,3 @@
====== Ev rûpel hîn nehat nivîsandin ======
-Rûpela tu hatî hîn nehat nivîsandin. Tu dikarî niha dest bi nivîsandina vê rûpelê bikî. Ji bo vê, ''Dest pê bike'' bitikîne.
+Rûpela tu hatî hîn nehat nivîsandin. Tu dikarî niha dest bi nivîsandina vê rûpelê bikî. Ji bo vê, **Dest pê bike** bitikîne.
diff --git a/inc/lang/ku/preview.txt b/inc/lang/ku/preview.txt
index da8f4cb44..5555ff136 100644
--- a/inc/lang/ku/preview.txt
+++ b/inc/lang/ku/preview.txt
@@ -1,3 +1,3 @@
====== Pêşdîtin ======
-Li vê derê tu dikarî bibîni ku nivîsa te dê çawa xuya bibe. Ji bîr neke: Hîn **nehat tomar kirin**! \ No newline at end of file
+Li vê derê tu dikarî bibîni ku nivîsa te dê çawa xuya bibe. **Ji bîr neke: Hîn nehat tomar kirin**!
diff --git a/inc/lang/ku/recent.txt b/inc/lang/ku/recent.txt
index 268c89ab2..323da6aed 100644
--- a/inc/lang/ku/recent.txt
+++ b/inc/lang/ku/recent.txt
@@ -1,3 +1,3 @@
====== Guherandinên dawî ======
-Ev rûpel di dema nêzîk de hatin guherandin.
+Ev rûpel di dema nêzîk de hatin guherandin:
diff --git a/inc/lang/ku/searchpage.txt b/inc/lang/ku/searchpage.txt
index 90055b1f7..38e048296 100644
--- a/inc/lang/ku/searchpage.txt
+++ b/inc/lang/ku/searchpage.txt
@@ -1,4 +1,3 @@
====== Lêbigere ======
Jêr encamên lêgerandina te tên nîşan dan. @CREATEPAGEINFO@
-
diff --git a/inc/lang/la/admin.txt b/inc/lang/la/admin.txt
index a8e380280..6f38b00eb 100644
--- a/inc/lang/la/admin.txt
+++ b/inc/lang/la/admin.txt
@@ -1,3 +1,3 @@
====== Administratio ======
-In hac pagina administratio uicis est. \ No newline at end of file
+In hac pagina administratio uicis est.
diff --git a/inc/lang/la/conflict.txt b/inc/lang/la/conflict.txt
index aebc38b25..84c2788d0 100644
--- a/inc/lang/la/conflict.txt
+++ b/inc/lang/la/conflict.txt
@@ -2,4 +2,4 @@
Recentior forma est: nam dum hanc paginam recensibas, aliquis paginam mutauit.
-Discrimina uides et formam seruandam eligis. Alia forma delebitur. \ No newline at end of file
+Discrimina uides et formam seruandam eligis. Alia forma delebitur.
diff --git a/inc/lang/la/denied.txt b/inc/lang/la/denied.txt
index 1cdaf05c9..d844a7fff 100644
--- a/inc/lang/la/denied.txt
+++ b/inc/lang/la/denied.txt
@@ -1,4 +1,3 @@
====== Ad hanc paginam accedere non potes ======
Ad hanc paginam accedere non potes: antea in conuentum ineas.
-
diff --git a/inc/lang/la/diff.txt b/inc/lang/la/diff.txt
index ead382715..f9f8322f6 100644
--- a/inc/lang/la/diff.txt
+++ b/inc/lang/la/diff.txt
@@ -1,3 +1,3 @@
====== Discrimina ======
-Discrimina inter duas paginas ostendere \ No newline at end of file
+Discrimina inter duas paginas ostendere.
diff --git a/inc/lang/la/draft.txt b/inc/lang/la/draft.txt
index 23bb20fe2..aaea7de17 100644
--- a/inc/lang/la/draft.txt
+++ b/inc/lang/la/draft.txt
@@ -2,4 +2,4 @@
Tua extrema recensio non perfecta est. Vicis propositum in itinere seruauit, sic his seruatis uteris.
-Statuas si //restituere// uis, //delere// seruata aut //delere// omnes. \ No newline at end of file
+Statuas si //restituere// uis, //delere// seruata aut //delere// omnes.
diff --git a/inc/lang/la/edit.txt b/inc/lang/la/edit.txt
index 342b30726..4bbbaf2c6 100644
--- a/inc/lang/la/edit.txt
+++ b/inc/lang/la/edit.txt
@@ -1 +1 @@
-Paginam recensere et "Serua" premere. Vide [[wiki:syntax]] ut uicis stilus uidere possis. Hanc paginam recenses, solum si hanc auges. Prima uestigia apud hunc nexum [[playground:playground|playground]] uidere possis. \ No newline at end of file
+Paginam recensere et "Serua" premere. Vide [[wiki:syntax]] ut uicis stilus uidere possis. Hanc paginam recenses, solum si hanc auges. Prima uestigia apud hunc nexum [[playground:playground|playground]] uidere possis.
diff --git a/inc/lang/la/editrev.txt b/inc/lang/la/editrev.txt
index 6a4d082cc..9c4cd491b 100644
--- a/inc/lang/la/editrev.txt
+++ b/inc/lang/la/editrev.txt
@@ -1,2 +1,2 @@
**Vetus forma a te restituta est** Si hanc formam seruabis, nouam creabis.
----- \ No newline at end of file
+----
diff --git a/inc/lang/la/index.txt b/inc/lang/la/index.txt
index cd65dbb59..0c9dc926c 100644
--- a/inc/lang/la/index.txt
+++ b/inc/lang/la/index.txt
@@ -1,3 +1,3 @@
====== Forma Situs ======
-Haec forma situs ordinata [[doku>namespaces|generatim]]. \ No newline at end of file
+Haec forma situs ordinata [[doku>namespaces|generatim]].
diff --git a/inc/lang/la/locked.txt b/inc/lang/la/locked.txt
index 65446df30..6982f6f4a 100644
--- a/inc/lang/la/locked.txt
+++ b/inc/lang/la/locked.txt
@@ -1,3 +1,3 @@
====== Pagina inclusa ======
-Haec pagina inclusa est: nullam mutationem facere potest. \ No newline at end of file
+Haec pagina inclusa est: nullam mutationem facere potest.
diff --git a/inc/lang/la/login.txt b/inc/lang/la/login.txt
index 25d4cd170..e79c7ab1b 100644
--- a/inc/lang/la/login.txt
+++ b/inc/lang/la/login.txt
@@ -1,3 +1,3 @@
====== Aditus ======
-Nomen Sodalis et tesseram scribere debes ut in conuentum inire uelis. \ No newline at end of file
+Nomen Sodalis et tesseram scribere debes ut in conuentum inire uelis.
diff --git a/inc/lang/la/newpage.txt b/inc/lang/la/newpage.txt
index 13cfff7d6..f5a945666 100644
--- a/inc/lang/la/newpage.txt
+++ b/inc/lang/la/newpage.txt
@@ -1,3 +1,3 @@
====== Hoc argumentum deest ======
-Nexum, quod pressisti, ad argumentum nullum fert. Si facultatem habes, creare nouam paginam potes. \ No newline at end of file
+Nexum, quod pressisti, ad argumentum nullum fert. Si facultatem habes, **creare nouam paginam** potes.
diff --git a/inc/lang/la/norev.txt b/inc/lang/la/norev.txt
index 19b60fe15..d15badb11 100644
--- a/inc/lang/la/norev.txt
+++ b/inc/lang/la/norev.txt
@@ -1,3 +1,3 @@
====== Forma non reperta ======
-Haec forma non reperta est. Aliam formam quaeris. \ No newline at end of file
+Haec forma non reperta est. Aliam formam quaeris.
diff --git a/inc/lang/la/preview.txt b/inc/lang/la/preview.txt
index 7e5a1377e..468d6178c 100644
--- a/inc/lang/la/preview.txt
+++ b/inc/lang/la/preview.txt
@@ -1,3 +1,3 @@
====== Praeuisio ======
-In hac pagina scriptum praeuidere potes. Memento hunc non seruatum iam esse. \ No newline at end of file
+In hac pagina scriptum praeuidere potes. **Memento hunc non seruatum iam esse**.
diff --git a/inc/lang/la/pwconfirm.txt b/inc/lang/la/pwconfirm.txt
index ade0a1caf..26e0f2f9f 100644
--- a/inc/lang/la/pwconfirm.txt
+++ b/inc/lang/la/pwconfirm.txt
@@ -1,7 +1,6 @@
Aue, @FULLNAME@!
-Aliquis tesseram nouam @TITLE@
-ut ineas in @DOKUWIKIURL@
+Aliquis tesseram nouam @TITLE@ ut ineas in @DOKUWIKIURL@
Si nouam tesseram non petiuisti, hoc nuntium ignorat.
diff --git a/inc/lang/la/read.txt b/inc/lang/la/read.txt
index b1710f2e6..478091e76 100644
--- a/inc/lang/la/read.txt
+++ b/inc/lang/la/read.txt
@@ -1 +1 @@
-Hanc paginam solum legere potes. Fontem uidere, sed non mutare potes. \ No newline at end of file
+Hanc paginam solum legere potes. Fontem uidere, sed non mutare potes.
diff --git a/inc/lang/la/recent.txt b/inc/lang/la/recent.txt
index d8e721cbf..d619c829e 100644
--- a/inc/lang/la/recent.txt
+++ b/inc/lang/la/recent.txt
@@ -1,3 +1,3 @@
====== Recentes Mutationes ======
-Hae paginae mutatae sunt in recentibus temporibus \ No newline at end of file
+Hae paginae mutatae sunt in recentibus temporibus:
diff --git a/inc/lang/la/register.txt b/inc/lang/la/register.txt
index 71ca8dd0f..f3ff55747 100644
--- a/inc/lang/la/register.txt
+++ b/inc/lang/la/register.txt
@@ -1,3 +1,3 @@
====== Nouom\am Sodalem Adscribere ======
-Nomen Sodalis legitimus esse debes: [[doku>pagename|pagename]]. \ No newline at end of file
+Nomen Sodalis legitimus esse debes: [[doku>pagename|pagename]].
diff --git a/inc/lang/la/resendpwd.txt b/inc/lang/la/resendpwd.txt
index 5a4972fca..46c312725 100644
--- a/inc/lang/la/resendpwd.txt
+++ b/inc/lang/la/resendpwd.txt
@@ -1,3 +1,3 @@
====== ouam Tesseram mittere ======
-Inserere nomen Sodalis priusquam tesseram petere. Confirmatio mittibitur. \ No newline at end of file
+Inserere nomen Sodalis priusquam tesseram petere. Confirmatio mittibitur.
diff --git a/inc/lang/la/revisions.txt b/inc/lang/la/revisions.txt
index 38b9bae0e..fa55804f9 100644
--- a/inc/lang/la/revisions.txt
+++ b/inc/lang/la/revisions.txt
@@ -1,3 +1,3 @@
====== Veteres recensiones ======
-In hac pagina ueteres recensiones paginae sunt: ut unam ex his restituas, illam eligis et deinde "Recensere paginam" premis et serua. \ No newline at end of file
+In hac pagina ueteres recensiones paginae sunt: ut unam ex his restituas, illam eligis et deinde "Recensere paginam" premis et serua.
diff --git a/inc/lang/la/searchpage.txt b/inc/lang/la/searchpage.txt
index 76255d539..052df4933 100644
--- a/inc/lang/la/searchpage.txt
+++ b/inc/lang/la/searchpage.txt
@@ -1,4 +1,3 @@
====== Quaerere ======
Responsiones in hac pagina uidere potes. @CREATEPAGEINFO@
-
diff --git a/inc/lang/la/showrev.txt b/inc/lang/la/showrev.txt
index b95e68265..6729dcc4e 100644
--- a/inc/lang/la/showrev.txt
+++ b/inc/lang/la/showrev.txt
@@ -1,2 +1,2 @@
**Haec uetus forma documenti est!**
----- \ No newline at end of file
+----
diff --git a/inc/lang/la/stopwords.txt b/inc/lang/la/stopwords.txt
index f063ba775..bd79fcb18 100644
--- a/inc/lang/la/stopwords.txt
+++ b/inc/lang/la/stopwords.txt
@@ -34,4 +34,4 @@ e
cum
haec
hic
-www \ No newline at end of file
+www
diff --git a/inc/lang/la/updateprofile.txt b/inc/lang/la/updateprofile.txt
index 565f81a3e..b0373fd36 100644
--- a/inc/lang/la/updateprofile.txt
+++ b/inc/lang/la/updateprofile.txt
@@ -1,3 +1,3 @@
====== Nouare Sodalis tabellas ======
-Solum in campis, quos mutare uis, scribis. Nomen Sodalis non mutare potes. \ No newline at end of file
+Solum in campis, quos mutare uis, scribis. Nomen Sodalis non mutare potes.
diff --git a/inc/lang/lb/denied.txt b/inc/lang/lb/denied.txt
index 1a7fd8f52..a8c4c6fff 100644
--- a/inc/lang/lb/denied.txt
+++ b/inc/lang/lb/denied.txt
@@ -1,4 +1,3 @@
======Erlaabnis verweigert======
Et deet mer leed, du hues net genuch Rechter fir weiderzefueren.
-
diff --git a/inc/lang/lb/editrev.txt b/inc/lang/lb/editrev.txt
index 6d7a12929..dc2cc75a7 100644
--- a/inc/lang/lb/editrev.txt
+++ b/inc/lang/lb/editrev.txt
@@ -1,2 +1,2 @@
**Du hues eng al Versioun vum Dokument gelueden!** Wanns de se änners, mëss de eng nei Versioun mat dësen Daten.
----- \ No newline at end of file
+----
diff --git a/inc/lang/lb/locked.txt b/inc/lang/lb/locked.txt
index 944efb251..c170b5b56 100644
--- a/inc/lang/lb/locked.txt
+++ b/inc/lang/lb/locked.txt
@@ -1,3 +1,3 @@
====== Säit gespaart ======
-Dës Säit ass am Moment duerch en anere Benotzer fir Ännerunge gespart. Du muss waarde bis e mat sengen Ännerunge fäerdeg ass oder d'Spär ofleeft. \ No newline at end of file
+Dës Säit ass am Moment duerch en anere Benotzer fir Ännerunge gespart. Du muss waarde bis e mat sengen Ännerunge fäerdeg ass oder d'Spär ofleeft.
diff --git a/inc/lang/lb/newpage.txt b/inc/lang/lb/newpage.txt
index 93917614d..bf7108fa8 100644
--- a/inc/lang/lb/newpage.txt
+++ b/inc/lang/lb/newpage.txt
@@ -1,4 +1,3 @@
======Dësen Thema gëtt et nach net======
-Du hues op e Link vun enger Säit geklickt, déi et nach net gëtt. Wanns de déi néideg Rechter hues, da kanns de dës Säit uleeën andeems de op ''Dës Säit uleeën'' klicks.
-
+Du hues op e Link vun enger Säit geklickt, déi et nach net gëtt. Wanns de déi néideg Rechter hues, da kanns de dës Säit uleeën andeems de op **Dës Säit uleeën** klicks.
diff --git a/inc/lang/lb/preview.txt b/inc/lang/lb/preview.txt
index f131cdad8..adac87265 100644
--- a/inc/lang/lb/preview.txt
+++ b/inc/lang/lb/preview.txt
@@ -1,3 +1,3 @@
======Net gespäichert Versioun======
-Dëst ass nëmmen eng net gespäichert Versioun; d'Ännerunge sinn nach **net** gespäichert!
+Dëst ass nëmmen eng net gespäichert Versioun; **d'Ännerunge sinn nach net gespäichert**!
diff --git a/inc/lang/lb/pwconfirm.txt b/inc/lang/lb/pwconfirm.txt
index efb0406e1..a57c5a34f 100644
--- a/inc/lang/lb/pwconfirm.txt
+++ b/inc/lang/lb/pwconfirm.txt
@@ -1,11 +1,9 @@
Moien @FULLNAME@!
-Iergendeen huet e neit Passwuert fir däin @TITLE@
-login op @DOKUWIKIURL@ gefrot
+Iergendeen huet e neit Passwuert fir däin @TITLE@ login op @DOKUWIKIURL@ gefrot
Wanns de kee nei Passwuert gefrot hues, dann ignoréier dës Mail.
-Fir ze konfirméieren dass du wierklech en neit Passwuert gefrot hues,
-klick op folgende Link.
+Fir ze konfirméieren dass du wierklech en neit Passwuert gefrot hues, klick op folgende Link.
@CONFIRM@
diff --git a/inc/lang/lb/recent.txt b/inc/lang/lb/recent.txt
index c7359e202..c0922511d 100644
--- a/inc/lang/lb/recent.txt
+++ b/inc/lang/lb/recent.txt
@@ -1,4 +1,3 @@
====== Rezent Ännerungen ======
-Folgend Säite goufen an der lescht g'ännert.
-
+Folgend Säite goufen an der lescht g'ännert:
diff --git a/inc/lang/lb/register.txt b/inc/lang/lb/register.txt
index 1e017e997..7664a9411 100644
--- a/inc/lang/lb/register.txt
+++ b/inc/lang/lb/register.txt
@@ -1,4 +1,3 @@
====== Als neie Benotzer registréieren ======
Fëll alles hei ënnendrënner aus fir en neie Kont op dësem Wiki unzeleeën. Pass op dass de eng **gëlteg Emailadress** ugëss - wanns de net gefrot gëss hei e Passwuert anzeginn, da kriss de e neit op déi Adress geschéckt. De Benotzernumm soll e gëltege [[doku>pagename|Säitenumm]] sinn.
-
diff --git a/inc/lang/lb/searchpage.txt b/inc/lang/lb/searchpage.txt
index c2e76eb7b..f9d63ef19 100644
--- a/inc/lang/lb/searchpage.txt
+++ b/inc/lang/lb/searchpage.txt
@@ -1,4 +1,3 @@
======Sich======
Hei ënnendrënner sinn d'Resultater vun der Sich. @CREATEPAGEINFO@
-
diff --git a/inc/lang/lb/showrev.txt b/inc/lang/lb/showrev.txt
index f6e2deee8..2fcd5e59b 100644
--- a/inc/lang/lb/showrev.txt
+++ b/inc/lang/lb/showrev.txt
@@ -1,2 +1,2 @@
**Dat hei ass eng al Versioun vum Document!**
----- \ No newline at end of file
+----
diff --git a/inc/lang/lb/updateprofile.txt b/inc/lang/lb/updateprofile.txt
index 326d62217..f2709692d 100644
--- a/inc/lang/lb/updateprofile.txt
+++ b/inc/lang/lb/updateprofile.txt
@@ -1,4 +1,3 @@
====== Profil aktualiséieren ======
Du brauchs just d'Felder auszefëllen déis de wëlls änneren. Du kanns däi Benotzernumm net änneren.
-
diff --git a/inc/lang/lt/admin.txt b/inc/lang/lt/admin.txt
index fd9ae9a87..c93081092 100644
--- a/inc/lang/lt/admin.txt
+++ b/inc/lang/lt/admin.txt
@@ -1,4 +1,3 @@
====== Administracija ======
Žemiau matote veiksmų, kuriuos gali atlikti administratorius, sąrašą.
-
diff --git a/inc/lang/lt/adminplugins.txt b/inc/lang/lt/adminplugins.txt
new file mode 100644
index 000000000..78e197a7d
--- /dev/null
+++ b/inc/lang/lt/adminplugins.txt
@@ -0,0 +1 @@
+===== Papildomi įskiepiai ===== \ No newline at end of file
diff --git a/inc/lang/lt/backlinks.txt b/inc/lang/lt/backlinks.txt
index ad0d5b83a..b289ae454 100644
--- a/inc/lang/lt/backlinks.txt
+++ b/inc/lang/lt/backlinks.txt
@@ -1,4 +1,3 @@
====== Atgalinės nuorodos ======
Čia matote sąrašą puslapių, kuriuose yra nuorodos į esamą puslapį.
-
diff --git a/inc/lang/lt/conflict.txt b/inc/lang/lt/conflict.txt
index be0c5ff4f..858d6164b 100644
--- a/inc/lang/lt/conflict.txt
+++ b/inc/lang/lt/conflict.txt
@@ -3,4 +3,3 @@
Rasta naujesnė dokumento, kurį redagavote, versija. Tai atsitinka tada, kai kitas vartotojas modifikuoja dokumentą tuo metu, kai jūs jį redaguojate.
Atidžiai peržvelkite žemiau esančius skirtumus ir nuspręskite, kurią versiją išsaugoti. Paspausdami ''Išsaugoti'' išsaugosite saviškę versiją. Paspausdami ''Atšaukti'' išsaugosite esamą versiją.
-
diff --git a/inc/lang/lt/denied.txt b/inc/lang/lt/denied.txt
index 9a8544694..1f7781d58 100644
--- a/inc/lang/lt/denied.txt
+++ b/inc/lang/lt/denied.txt
@@ -1,4 +1,3 @@
====== Priėjimas uždraustas ======
Jūs neturite reikiamų teisių, kad galėtumėte tęsti.
-
diff --git a/inc/lang/lt/diff.txt b/inc/lang/lt/diff.txt
index dc5e59f89..5e636354d 100644
--- a/inc/lang/lt/diff.txt
+++ b/inc/lang/lt/diff.txt
@@ -1,4 +1,3 @@
====== Skirtumai ======
Čia matote skirtumus tarp pasirinktos versijos ir esamo dokumento.
-
diff --git a/inc/lang/lt/draft.txt b/inc/lang/lt/draft.txt
new file mode 100644
index 000000000..4d3191af3
--- /dev/null
+++ b/inc/lang/lt/draft.txt
@@ -0,0 +1,5 @@
+====== Rastas juodraščio failas ======
+
+Jūsų paskutinė redagavimo sesija šiame puslapyje nebuvo tinkamai baigta. DokuWiki automatiškai išsaugojo juodraštį, kurį galite naudoti norėdami tęsti redagavimą. Žemiau galite pamatyti duomenis, kurie buvo išsaugoti iš jūsų paskutinės sesijos.
+
+ Nuspręskite, ar norite //atkurti// prarastą redagavimo sesiją, //ištrinti// automatiškai išsaugotą juodraštį ar //atšaukti// redagavimo procesą. \ No newline at end of file
diff --git a/inc/lang/lt/edit.txt b/inc/lang/lt/edit.txt
index 8fadf97ad..3b5e021ae 100644
--- a/inc/lang/lt/edit.txt
+++ b/inc/lang/lt/edit.txt
@@ -1,2 +1 @@
Modifikuokite šį puslapį ir paspauskite ''Išsaugoti''. Apie wiki sintaksę galite paskaityti [[wiki:syntax|čia]]. Prašome redaguoti šį puslapį tik tada, kai galite jį **patobulinti**. Jei tik norite išbandyti wiki galimybes, prašytume tai daryti [[playground:playground|čia]].
-
diff --git a/inc/lang/lt/editrev.txt b/inc/lang/lt/editrev.txt
index 9e5eaeece..05b55394e 100644
--- a/inc/lang/lt/editrev.txt
+++ b/inc/lang/lt/editrev.txt
@@ -1,2 +1,2 @@
**Jūs naudojate seną šio dokumento versiją!** jei ją išsaugosite, su šiais duomenimis sukursite naują versiją.
----- \ No newline at end of file
+----
diff --git a/inc/lang/lt/index.txt b/inc/lang/lt/index.txt
index d13683c47..9e308bb19 100644
--- a/inc/lang/lt/index.txt
+++ b/inc/lang/lt/index.txt
@@ -1,4 +1,3 @@
====== Indeksas ======
Čia matote visų šiuo metu egzistuojančių puslapių sąrašą. Jie išrūšiuoti pagal [[doku>namespaces|pavadinimą]].
-
diff --git a/inc/lang/lt/lang.php b/inc/lang/lt/lang.php
index 67fabef92..004bb850f 100644
--- a/inc/lang/lt/lang.php
+++ b/inc/lang/lt/lang.php
@@ -3,10 +3,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Michael Harrison <michharri120@gmail.com>
* @author Linas Valiukas <shirshegsm@gmail.com>
* @author Edmondas Girkantas <eg@zemaitija.net>
* @author Arūnas Vaitekūnas <aras@fan.lt>
- * @author audrius.klevas@gmail.com
+ * @author audrius.klevas <audrius.klevas@gmail.com>
* @author Tomas Darius Davainis <tomasdd@gmail.com>
*/
$lang['encoding'] = 'utf-8';
@@ -42,10 +43,15 @@ $lang['btn_backlink'] = 'Atgalinės nuorodos';
$lang['btn_subscribe'] = 'Užsisakyti keitimų prenumeratą';
$lang['btn_profile'] = 'Atnaujinti profilį';
$lang['btn_reset'] = 'Atstata';
+$lang['btn_resendpwd'] = 'Nustatykite naują slaptažodį';
$lang['btn_draft'] = 'Redaguoti juodraštį';
$lang['btn_recover'] = 'Atkurti juodraštį';
$lang['btn_draftdel'] = 'Šalinti juodraštį';
+$lang['btn_revert'] = 'Atkurti';
$lang['btn_register'] = 'Registruotis';
+$lang['btn_apply'] = 'Taikyti';
+$lang['btn_media'] = 'Žiniasklaidos vadybininkas';
+$lang['btn_deleteuser'] = 'Pašalinti mano paskyrą';
$lang['btn_img_backto'] = 'Atgal į %s';
$lang['loggedinas'] = 'Prisijungęs kaip:';
$lang['user'] = 'Vartotojo vardas';
@@ -61,6 +67,13 @@ $lang['badlogin'] = 'Nurodėte blogą vartotojo vardą arba slapta
$lang['minoredit'] = 'Nedidelis pataisymas';
$lang['draftdate'] = 'Juodraštis automatiškai išsaugotas';
$lang['nosecedit'] = 'Puslapis buvo kažkieno pataisytas, teksto dalies informacija tapo pasenusi, todėl pakrautas visas puslapis.';
+$lang['js']['willexpire'] = 'Šio puslapio redagavimo užrakto galiojimo laikas baigsis po minutės.\nNorėdami išvengti nesklandumų naudokite peržiūros mygtuką ir užraktas atsinaujins.';
+$lang['js']['notsavedyet'] = 'Pakeitimai nebus išsaugoti.\nTikrai tęsti?';
+$lang['js']['keepopen'] = 'Pažymėjus palikti langą atvertą';
+$lang['js']['hidedetails'] = 'Paslėpti Detales';
+$lang['js']['nosmblinks'] = 'Nurodos į "Windows shares" veikia tik su Microsoft Internet Explorer naršykle.
+Vis dėlto, jūs galite nukopijuoti šią nuorodą.';
+$lang['js']['del_confirm'] = 'Ar tikrai ištrinti pažymėtą(us) įrašą(us)?';
$lang['regmissing'] = 'Turite užpildyti visus laukus.';
$lang['reguexists'] = 'Vartotojas su pasirinktu prisijungimo vardu jau egzistuoja.';
$lang['regsuccess'] = 'Vartotojas sukurtas, slaptažodis išsiųstas el. paštu.';
@@ -88,13 +101,6 @@ $lang['txt_filename'] = 'Įveskite wikivardą (nebūtina):';
$lang['txt_overwrt'] = 'Perrašyti egzistuojančią bylą';
$lang['lockedby'] = 'Užrakintas vartotojo:';
$lang['lockexpire'] = 'Užraktas bus nuimtas:';
-$lang['js']['willexpire'] = 'Šio puslapio redagavimo užrakto galiojimo laikas baigsis po minutės.\nNorėdami išvengti nesklandumų naudokite peržiūros mygtuką ir užraktas atsinaujins.';
-$lang['js']['notsavedyet'] = 'Pakeitimai nebus išsaugoti.\nTikrai tęsti?';
-$lang['js']['keepopen'] = 'Pažymėjus palikti langą atvertą';
-$lang['js']['hidedetails'] = 'Paslėpti Detales';
-$lang['js']['nosmblinks'] = 'Nurodos į "Windows shares" veikia tik su Microsoft Internet Explorer naršykle.
-Vis dėlto, jūs galite nukopijuoti šią nuorodą.';
-$lang['js']['del_confirm'] = 'Ar tikrai ištrinti pažymėtą(us) įrašą(us)?';
$lang['rssfailed'] = 'Siunčiant šį feed\'ą įvyko klaida: ';
$lang['nothingfound'] = 'Paieškos rezultatų nėra.';
$lang['mediaselect'] = 'Mediabylos išsirinkimas';
@@ -179,5 +185,5 @@ $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['email_signature_text'] = 'Šis laiškas buvo sugeneruotas DokuWiki
+$lang['email_signature_text'] = 'Šis laiškas buvo sugeneruotas DokuWiki
@DOKUWIKIURL@';
diff --git a/inc/lang/lt/login.txt b/inc/lang/lt/login.txt
index 2a6e21db2..e5c9c2bb0 100644
--- a/inc/lang/lt/login.txt
+++ b/inc/lang/lt/login.txt
@@ -1,5 +1,3 @@
====== Prisijungimas ======
Šiuo metu jūs nesate prisijungęs. Įveskite savo prisijungimo duomenis žemiau. „Cookies“ palaikymas jūsų naršyklėje turi būti įjungtas.
-
-
diff --git a/inc/lang/lt/newpage.txt b/inc/lang/lt/newpage.txt
index c28e30bd4..64d3c7f00 100644
--- a/inc/lang/lt/newpage.txt
+++ b/inc/lang/lt/newpage.txt
@@ -1,4 +1,3 @@
====== Šis puslapis dar neegzistuoja ======
-Nuoroda, kurią jūs paspaudėte, atvedė į dar neegzistuojantį puslapį. Jūs galite jį sukurti paspausdami ''Sukurti šį puslapį'' mygtuką.
-
+Nuoroda, kurią jūs paspaudėte, atvedė į dar neegzistuojantį puslapį. Jūs galite jį sukurti paspausdami **Sukurti šį puslapį** mygtuką.
diff --git a/inc/lang/lt/norev.txt b/inc/lang/lt/norev.txt
index 028ebe7f2..45efb1aae 100644
--- a/inc/lang/lt/norev.txt
+++ b/inc/lang/lt/norev.txt
@@ -1,5 +1,3 @@
====== Tokios versijos nėra ======
Nurodyta versija neegzistuoja. Norėdami pamatyti visas dokumento versijas, paspauskite ''Senos versijos'' mygtuką
-
-
diff --git a/inc/lang/lt/preview.txt b/inc/lang/lt/preview.txt
index 2d24e2164..796ca7dde 100644
--- a/inc/lang/lt/preview.txt
+++ b/inc/lang/lt/preview.txt
@@ -1,5 +1,3 @@
====== Peržiūra ======
-Čia matote, kaip atrodo jūsų pakeitimai. **Pakeitimai dar nėra išsaugoti!**
-
-
+Čia matote, kaip atrodo jūsų pakeitimai. **Pakeitimai dar nėra išsaugoti**!
diff --git a/inc/lang/lt/read.txt b/inc/lang/lt/read.txt
index 91ea7e656..17a150f12 100644
--- a/inc/lang/lt/read.txt
+++ b/inc/lang/lt/read.txt
@@ -1,3 +1 @@
Šį puslapį galima tik skaityti. Jūs galite peržvelgti jo kodą (source), bet negalite jo keisti. Jei manote, kad tai klaida - susisiekite su administratoriumi.
-
-
diff --git a/inc/lang/lt/recent.txt b/inc/lang/lt/recent.txt
index 506538629..3b09d82b0 100644
--- a/inc/lang/lt/recent.txt
+++ b/inc/lang/lt/recent.txt
@@ -1,5 +1,3 @@
====== Naujausi keitimai ======
-Šie puslapiai buvo neseniai pakeisti.
-
-
+Šie puslapiai buvo neseniai pakeisti:
diff --git a/inc/lang/lt/register.txt b/inc/lang/lt/register.txt
index f595826f3..c709140f0 100644
--- a/inc/lang/lt/register.txt
+++ b/inc/lang/lt/register.txt
@@ -1,4 +1,3 @@
====== Naujo vartotojo registracija ======
Norėdami tapti nauju registruotu šio tinklalapio vartotoju, užpildykite žemiau esančią formą. Būtinai turite nurodyti **veikiantį el. pašto adresą**, nes jūsų slaptažodis bus išsiųstas pastaruoju adresu. Prisijungimo vardas turėtų būti sukurtas pagal [[doku>pagename|puslapio pavadinimo]] taisykles.
-
diff --git a/inc/lang/lt/revisions.txt b/inc/lang/lt/revisions.txt
index 9999767bd..47ab77351 100644
--- a/inc/lang/lt/revisions.txt
+++ b/inc/lang/lt/revisions.txt
@@ -1,4 +1,3 @@
====== Senos versijos ======
Čia matote senas šio dokumento versijas. Jei norite atstatyti dokumentą į jo senesniąją versiją, paspauskite "Redaguoti šį puslapį" prie norimos versijos ir išsaugokite ją.
-
diff --git a/inc/lang/lt/searchpage.txt b/inc/lang/lt/searchpage.txt
index 111029d04..6986ee8f0 100644
--- a/inc/lang/lt/searchpage.txt
+++ b/inc/lang/lt/searchpage.txt
@@ -1,4 +1,3 @@
====== Paieška ======
Žemiau matote Jūsų atliktos paieškos rezultatus. @CREATEPAGEINFO@
-
diff --git a/inc/lang/lt/updateprofile.txt b/inc/lang/lt/updateprofile.txt
index 7ede1a00a..1ac294b09 100644
--- a/inc/lang/lt/updateprofile.txt
+++ b/inc/lang/lt/updateprofile.txt
@@ -1,4 +1,3 @@
====== Redaguoti savo profilį ======
Užpildykite tik tuos laukus, kuriuos norite pakeisti. Vartotojo vardo keisti nebūtina.
-
diff --git a/inc/lang/lv/admin.txt b/inc/lang/lv/admin.txt
index 3b37fa389..42cbec145 100644
--- a/inc/lang/lv/admin.txt
+++ b/inc/lang/lv/admin.txt
@@ -1,6 +1,3 @@
====== Administrēšana ======
DokuWiki pieejamas šādas administrēšanas iespējas:
-
-
-
diff --git a/inc/lang/lv/backlinks.txt b/inc/lang/lv/backlinks.txt
index 19bebf7b2..632e8d4e0 100644
--- a/inc/lang/lv/backlinks.txt
+++ b/inc/lang/lv/backlinks.txt
@@ -1,5 +1,3 @@
====== Saistītās lapas ======
Norāde uz šo lapu ir atrodama dokumentos:
-
-
diff --git a/inc/lang/lv/conflict.txt b/inc/lang/lv/conflict.txt
index 5aa6442c9..47888aa34 100644
--- a/inc/lang/lv/conflict.txt
+++ b/inc/lang/lv/conflict.txt
@@ -3,6 +3,3 @@
Tevis labotajam dokumentam jau ir jaunāka versija. Tā gadās, ja cits lietotājs tavas labošanas laikā ir paguvis veikt savus labojumus.
Rūpīgi pārlūko šeit parādītās atšķirības un tad izlem, kuru variantu paturēt. Ja nospiedīsi ''Saglabāt'', saglabāsies tavs teksts. Ja nospiedīsi ''Atlikt'' paliks pašreizējais variants.
-
-
-
diff --git a/inc/lang/lv/denied.txt b/inc/lang/lv/denied.txt
index 6733fb2e9..59ce98e48 100644
--- a/inc/lang/lv/denied.txt
+++ b/inc/lang/lv/denied.txt
@@ -1,4 +1,3 @@
====== Piekļuve aizliegta ======
Atvaino, tev nav tiesību turpināt.
-
diff --git a/inc/lang/lv/diff.txt b/inc/lang/lv/diff.txt
index 40e1b5405..a5b71e129 100644
--- a/inc/lang/lv/diff.txt
+++ b/inc/lang/lv/diff.txt
@@ -1,7 +1,3 @@
====== Atšķirības ======
-Norādītais vecais variants no patreizējās lapas atšķiras ar:
-
-
-
-
+Norādītais vecais variants no patreizējās lapas atšķiras ar.
diff --git a/inc/lang/lv/edit.txt b/inc/lang/lv/edit.txt
index 9da6f2d23..3fcabfa99 100644
--- a/inc/lang/lv/edit.txt
+++ b/inc/lang/lv/edit.txt
@@ -1,2 +1 @@
-Labo lapu un uzklikšķini uz ''Saglabāt''. Par lietojamo sintaksi skaties rakstu [[wiki:syntax]]. Lūdzu labo tika tad, ja vari lapu **uzlabot**. Ja gribi tikai kaut ko izmēģināt, izmanto [[wiki:playground|smilšukasti]].
-
+Labo lapu un uzklikšķini uz ''Saglabāt''. Par lietojamo sintaksi skaties rakstu [[wiki:syntax]]. Lūdzu labo tika tad, ja vari lapu **uzlabot**. Ja gribi tikai kaut ko izmēģināt, izmanto [[playground:playground|smilšukasti]].
diff --git a/inc/lang/lv/editrev.txt b/inc/lang/lv/editrev.txt
index 6fa7a4c05..0629b82fb 100644
--- a/inc/lang/lv/editrev.txt
+++ b/inc/lang/lv/editrev.txt
@@ -1 +1,2 @@
----- **Tu skaties vecu dokumenta versiju!** Ja to saglabāsi, tad izveidosies jauns dokuments ar šo veco saturu. ----
+**Tu skaties vecu dokumenta versiju!** Ja to saglabāsi, tad izveidosies jauns dokuments ar šo veco saturu.
+----
diff --git a/inc/lang/lv/index.txt b/inc/lang/lv/index.txt
index 6baa2a3e2..5eee93b36 100644
--- a/inc/lang/lv/index.txt
+++ b/inc/lang/lv/index.txt
@@ -1,4 +1,3 @@
====== Rādītājs ======
Visu pieejamo lapu rādītājs. Sakārtots pēc [[doku>namespaces|sadaļām]].
-
diff --git a/inc/lang/lv/install.html b/inc/lang/lv/install.html
index 26dd8d782..57782974b 100644
--- a/inc/lang/lv/install.html
+++ b/inc/lang/lv/install.html
@@ -1,12 +1,7 @@
-<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>Šī 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>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 <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>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
-<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
+<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>
diff --git a/inc/lang/lv/locked.txt b/inc/lang/lv/locked.txt
index 7d57ce98b..6536eea14 100644
--- a/inc/lang/lv/locked.txt
+++ b/inc/lang/lv/locked.txt
@@ -1,5 +1,3 @@
====== Lapa aizņemta ======
Lapa aizņemta, to patlaban labo cits lietotājs. Tev ir jāgaida, kamēr to pabeigs labot vai arī iztecēs labotājam atvēlētais laiks.
-
-
diff --git a/inc/lang/lv/login.txt b/inc/lang/lv/login.txt
index a98d21d1a..3ae529257 100644
--- a/inc/lang/lv/login.txt
+++ b/inc/lang/lv/login.txt
@@ -1,3 +1,3 @@
====== Login ======
-Tu neesi ielogojies! Ievadi savu lietotājvārdu un paroli. Pārlūkprogrammai jāpieņem //cookies//.
+Tu neesi ielogojies! Ievadi savu lietotājvārdu un paroli. Pārlūkprogrammai jāpieņem //cookies//.
diff --git a/inc/lang/lv/newpage.txt b/inc/lang/lv/newpage.txt
index a4a05fdc5..1180cf739 100644
--- a/inc/lang/lv/newpage.txt
+++ b/inc/lang/lv/newpage.txt
@@ -1,5 +1,3 @@
====== Šķirklis vēl nav izveidots ======
-Tu izvēlējies saiti uz vēl neizveidotu šķirkli. Ja tiesības ļauj, vari to izveidot, uzklikšķinot uz pogas ''Izveidot lapu''.
-
-
+Tu izvēlējies saiti uz vēl neizveidotu šķirkli. Ja tiesības ļauj, vari to izveidot, uzklikšķinot uz pogas **Izveidot lapu**.
diff --git a/inc/lang/lv/norev.txt b/inc/lang/lv/norev.txt
index b7c46245f..a668810c7 100644
--- a/inc/lang/lv/norev.txt
+++ b/inc/lang/lv/norev.txt
@@ -1,5 +1,3 @@
====== Nav šādas versijas ======
Norādītās lapas versijas nav. Lieto pogu ''Vecās versijas'', lai redzētu dokumenta veco versiju sarakstu.
-
-
diff --git a/inc/lang/lv/preview.txt b/inc/lang/lv/preview.txt
index c3d618a12..fe43b3685 100644
--- a/inc/lang/lv/preview.txt
+++ b/inc/lang/lv/preview.txt
@@ -1,5 +1,3 @@
====== Priekšskats ======
-Tavs teksts izskatīsies šādi. Ievēro, tas vēl **nav saglabāts** !
-
-
+Tavs teksts izskatīsies šādi. **Ievēro, tas vēl nav saglabāts**!
diff --git a/inc/lang/lv/pwconfirm.txt b/inc/lang/lv/pwconfirm.txt
index 62c8bedc8..5dcc3f383 100644
--- a/inc/lang/lv/pwconfirm.txt
+++ b/inc/lang/lv/pwconfirm.txt
@@ -1,7 +1,6 @@
Sveiki, @FULLNAME@!
-Kāds pieprasījis jaunu paroli tavam @TITLE@ kontam
-@DOKUWIKIURL@ sistēmā.
+Kāds pieprasījis jaunu paroli tavam @TITLE@ kontam @DOKUWIKIURL@ sistēmā.
Ja paroli neesi prasījis, ignorē šo vēstuli.
diff --git a/inc/lang/lv/read.txt b/inc/lang/lv/read.txt
index 876e53cb8..4d479820d 100644
--- a/inc/lang/lv/read.txt
+++ b/inc/lang/lv/read.txt
@@ -1,4 +1 @@
Šī lapa ir tikai lasāma. Vari apskatīt izejas kodu, bet nevari to mainīt. Ja domā, ka tas nav pareizi, vaicā administratoram.
-
-
-
diff --git a/inc/lang/lv/recent.txt b/inc/lang/lv/recent.txt
index 70cf1aa1e..86d3141a7 100644
--- a/inc/lang/lv/recent.txt
+++ b/inc/lang/lv/recent.txt
@@ -1,8 +1,3 @@
====== Jaunākie grozījumi ======
Jaunākie labojumi ir:
-
-
-
-
-
diff --git a/inc/lang/lv/register.txt b/inc/lang/lv/register.txt
index 5e6477d37..a602d7436 100644
--- a/inc/lang/lv/register.txt
+++ b/inc/lang/lv/register.txt
@@ -1,4 +1,3 @@
====== Jauna lietotāja reģistrācija ======
Lai izveidotu jaunu kontu, aizpildi visas prasītās ailes. Pārliecinies, ka uzdod **derīgu pasta adresi**, jo jauno paroli tev nosūtīs pa pastu. Lietotājvārdam jāatbilst [[doku>pagename|wiki vārdu nosacījumiem]].
-
diff --git a/inc/lang/lv/resetpwd.txt b/inc/lang/lv/resetpwd.txt
index 757f34cff..000b748c9 100644
--- a/inc/lang/lv/resetpwd.txt
+++ b/inc/lang/lv/resetpwd.txt
@@ -1,3 +1,3 @@
====== Uzstādīt jaunu paroli ======
-Lūdzu izvēlies savam kontam jaunu paroli. \ No newline at end of file
+Lūdzu izvēlies savam kontam jaunu paroli.
diff --git a/inc/lang/lv/revisions.txt b/inc/lang/lv/revisions.txt
index 51ad8495d..38577847b 100644
--- a/inc/lang/lv/revisions.txt
+++ b/inc/lang/lv/revisions.txt
@@ -1,5 +1,3 @@
====== Vecās versijas ======
Dokumentam ir šādas vecās versijas. Lai atgrieztos pie vecā varianta, izvēlies to no saraksta, uzklikšķini uz "Labot šo lapu" un saglabā to.
-
-
diff --git a/inc/lang/lv/searchpage.txt b/inc/lang/lv/searchpage.txt
index a4b5aae35..065e71f7b 100644
--- a/inc/lang/lv/searchpage.txt
+++ b/inc/lang/lv/searchpage.txt
@@ -1,4 +1,3 @@
====== Meklēšana ======
Te vari redzēt meklēšanas rezultātus. @CREATEPAGEINFO@
-
diff --git a/inc/lang/lv/stopwords.txt b/inc/lang/lv/stopwords.txt
index 846c86946..844725734 100644
--- a/inc/lang/lv/stopwords.txt
+++ b/inc/lang/lv/stopwords.txt
@@ -2,47 +2,45 @@
# Labojot failu ievēro, ja jālieto UNIX rindu aplauzumi (single newline)
# Nevajag likt sarakstā par 3 burtiem īsākus vārdus, tos tā pat neņem vērā
# Angļu valodai saraksts ņemts no http://www.ranks.nl/stopwords/
-gar
-par
-pār
-pret
-starp
-caur
-uz
+ārpus
+šaipus
aiz
apakš
+apakšpus
+augšpus
bez
+caur
+dēļ
+gar
+iekšpus
+itin
iz
+jā
+jo
+kaut
kopš
+līdz
+labad
+lejpus
+nē
+nav
no
+otrpus
+pār
pēc
+pēc
+pa
+par
pie
pirms
+pret
priekš
+starp
+taču
uz
-virs
-zem
-apakšpus
-ārpus
-augšpus
-iekšpus
-lejpus
-otrpus
-šaipus
+vai
viņpus
+virs
virspus
-dēļ
-labad
-pēc
-līdz
-pa
-vai
-jā
-nē
-kaut
-nav
-itin
-jo
-taču
-
-
+www
+zem
diff --git a/inc/lang/lv/updateprofile.txt b/inc/lang/lv/updateprofile.txt
index 12fbd8de4..09720792e 100644
--- a/inc/lang/lv/updateprofile.txt
+++ b/inc/lang/lv/updateprofile.txt
@@ -1,8 +1,3 @@
====== Atjaunot sava konta datus ======
Jāaizpilda tikai tie lauki, kuru saturu vēlies mainīt. Nav iespējams mainīt savu lietotājvārdu.
-
-
-
-
-
diff --git a/inc/lang/mg/admin.txt b/inc/lang/mg/admin.txt
index 2c4fc3f6c..a4ed67b2f 100644
--- a/inc/lang/mg/admin.txt
+++ b/inc/lang/mg/admin.txt
@@ -1,4 +1,3 @@
====== Administration ======
Hitanao eo ambany lisitry ny asa fanaovana admin misy amin'ny DokuWiki.
-
diff --git a/inc/lang/mg/backlinks.txt b/inc/lang/mg/backlinks.txt
index c625e6504..e07cfe631 100644
--- a/inc/lang/mg/backlinks.txt
+++ b/inc/lang/mg/backlinks.txt
@@ -1,5 +1,3 @@
====== Verindrohy ======
Lisitr'ireo pejy misy rohy manondro amin'ity pejy ity.
-
-
diff --git a/inc/lang/mg/conflict.txt b/inc/lang/mg/conflict.txt
index 96b369e39..7d614fe76 100644
--- a/inc/lang/mg/conflict.txt
+++ b/inc/lang/mg/conflict.txt
@@ -3,4 +3,3 @@
Efa misy kinova vaovao ny tahirin-kevitra novainao. Rehefa misy olona hafa nanova koa nandritra anao nanova no mitranga ny toy izao.
Jereo ny tsy fitoviany miseho etsy ambany ireo, avy eo safidio izay kinova tianao hotazonina. Raha misafidy ny bokotra ''Raketo'' ianao, dia ny nataonao no horaketina. Ny bokotra ''Aoka ihany'' tsindriana raha hitazonana izay kinova misy ao.
-
diff --git a/inc/lang/mg/denied.txt b/inc/lang/mg/denied.txt
index d6d2b814e..af64f783e 100644
--- a/inc/lang/mg/denied.txt
+++ b/inc/lang/mg/denied.txt
@@ -1,4 +1,3 @@
====== Tsy tafiditra ======
Miala tsiny fa tsy manana alalana hanohizana mankany ianao.
-
diff --git a/inc/lang/mg/diff.txt b/inc/lang/mg/diff.txt
index 8d7d69b45..cd6ab2a71 100644
--- a/inc/lang/mg/diff.txt
+++ b/inc/lang/mg/diff.txt
@@ -1,4 +1,3 @@
====== Tsy fitoviana ======
Ireto ny maha-samihafa ny kinova nosafidiana sy ny kinovan'ny pejy amin'izao.
-
diff --git a/inc/lang/mg/edit.txt b/inc/lang/mg/edit.txt
index 2cde9deb1..de222e560 100644
--- a/inc/lang/mg/edit.txt
+++ b/inc/lang/mg/edit.txt
@@ -1,2 +1 @@
-Rehefa avy manova ny pejy dia tsindrio ny bokotra ''Raketo''. Jereo ny [[wiki:syntax]] misy ny fomba fanoratana. Raha misy zavatra tianao handramana dia ianaro ao amin'ny [[wiki:playground]].
-
+Rehefa avy manova ny pejy dia tsindrio ny bokotra ''Raketo''. Jereo ny [[wiki:syntax]] misy ny fomba fanoratana. Raha misy zavatra tianao handramana dia ianaro ao amin'ny [[playground:playground]].
diff --git a/inc/lang/mg/editrev.txt b/inc/lang/mg/editrev.txt
index a6ff5ba32..1ebe35003 100644
--- a/inc/lang/mg/editrev.txt
+++ b/inc/lang/mg/editrev.txt
@@ -1,2 +1,2 @@
**Kinovan'ny pejy taloha no nosokafanao!** Raha raketinao io, dia hanamboatra kinova vaovao miaraka amin'io ianao.
----- \ No newline at end of file
+----
diff --git a/inc/lang/mg/index.txt b/inc/lang/mg/index.txt
index 614fd6434..706e37c85 100644
--- a/inc/lang/mg/index.txt
+++ b/inc/lang/mg/index.txt
@@ -1,4 +1,3 @@
====== Index ======
Ity misy index mahasarona ireo pejy misy milahatra arakaraka ny [[doku>namespaces|namespaces]].
-
diff --git a/inc/lang/mg/locked.txt b/inc/lang/mg/locked.txt
index 5705659a3..9ed5b00db 100644
--- a/inc/lang/mg/locked.txt
+++ b/inc/lang/mg/locked.txt
@@ -1,4 +1,3 @@
====== Pejy voahidy ======
Mbola ovain'olona hafa ity pejy ity ka voahidy aloha. Andraso kely ho vitany ny azy, na ho lany fotoana ilay hidy.
-
diff --git a/inc/lang/mg/login.txt b/inc/lang/mg/login.txt
index 1ea3facb0..587751c3a 100644
--- a/inc/lang/mg/login.txt
+++ b/inc/lang/mg/login.txt
@@ -1,4 +1,3 @@
====== Login ======
Mbola tsy niditra ianao izao! Ampidiro eto ambany ny anarana sy ny alahidy. Ilaina manaiky cookies ny navigateur-nao raha hiditra.
-
diff --git a/inc/lang/mg/newpage.txt b/inc/lang/mg/newpage.txt
index a998caf28..747905771 100644
--- a/inc/lang/mg/newpage.txt
+++ b/inc/lang/mg/newpage.txt
@@ -1,3 +1,3 @@
====== Mbola tsy misy an'io pejy io ======
-Nanindry rohy manondro pejy mbola tsy misy ianao. Afaka amboarinao io pejy io, tsindrio ny bokotra ''Amboary ity pejy''
+Nanindry rohy manondro pejy mbola tsy misy ianao. Afaka amboarinao io pejy io, tsindrio ny bokotra **Amboary ity pejy**.
diff --git a/inc/lang/mg/norev.txt b/inc/lang/mg/norev.txt
index 71ecb9ba4..09734b9d0 100644
--- a/inc/lang/mg/norev.txt
+++ b/inc/lang/mg/norev.txt
@@ -1,4 +1,3 @@
====== Tsy misy io kinova io ======
Tsy misy ny kinova voalaza. Ampiasao ny bokotra ''Kinova taloha'' hampisehoana ireo karazana fanovana natao tamin'ity pejy ity.
-
diff --git a/inc/lang/mg/preview.txt b/inc/lang/mg/preview.txt
index 52019cd73..d5c166882 100644
--- a/inc/lang/mg/preview.txt
+++ b/inc/lang/mg/preview.txt
@@ -1,5 +1,3 @@
====== Topi-maso ======
-Topi-maso ahafahanao mijery ny fivoakan'ny soratra nataonao ity. Tandremo: Mbola **tsy voarakitra** io!
-
-
+Topi-maso ahafahanao mijery ny fivoakan'ny soratra nataonao ity. **Tandremo: Mbola tsy voarakitra io**!
diff --git a/inc/lang/mg/read.txt b/inc/lang/mg/read.txt
index 0fe51f4a2..8b341de7a 100644
--- a/inc/lang/mg/read.txt
+++ b/inc/lang/mg/read.txt
@@ -1,3 +1 @@
Vakiana fotsiny ity pejy ity. Afaka jerenao ny source, saingy tsy afaka ovainao. Anontanio ny admin raha heverinao fa tsy mety izany.
-
-
diff --git a/inc/lang/mg/recent.txt b/inc/lang/mg/recent.txt
index 4bc8245a7..b88f52113 100644
--- a/inc/lang/mg/recent.txt
+++ b/inc/lang/mg/recent.txt
@@ -1,5 +1,3 @@
====== Fiovana farany ======
-Ireto pejy ireto no niova vao haingana.
-
-
+Ireto pejy ireto no niova vao haingana:
diff --git a/inc/lang/mg/register.txt b/inc/lang/mg/register.txt
index 618c1f97e..e421b1aaa 100644
--- a/inc/lang/mg/register.txt
+++ b/inc/lang/mg/register.txt
@@ -1,5 +1,3 @@
====== Hanokatra kaonty vaovao ======
Fenoy ny saha rehetra eto ambany raha hanokatra kaonty amin'ity wiki ity. Hamarino fa adiresy imailaka mandeha no omenao - halefa any mantsy ny alahidy. Ny anarana dia tsy maintsy manaraka ny fepetran'ny [[doku>pagename|pagename]].
-
-
diff --git a/inc/lang/mg/revisions.txt b/inc/lang/mg/revisions.txt
index 72704587a..64291c9e5 100644
--- a/inc/lang/mg/revisions.txt
+++ b/inc/lang/mg/revisions.txt
@@ -1,5 +1,3 @@
====== Kinova taloha ======
Ireto ny kinovan'ny pejy taloha. Raha te hamerina kinova taloha ianao, tsongay eo ambany izy hisokatra, avy eo tsindrio ny bokotra ''Hanova ny pejy'' ary ''Soraty''.
-
-
diff --git a/inc/lang/mg/searchpage.txt b/inc/lang/mg/searchpage.txt
index 43fc402d4..fde6d29a0 100644
--- a/inc/lang/mg/searchpage.txt
+++ b/inc/lang/mg/searchpage.txt
@@ -1,4 +1,3 @@
====== Karoka ======
Ireto ambany ireto ny valin'ny fikarohanao. @CREATEPAGEINFO@
-
diff --git a/inc/lang/mk/read.txt b/inc/lang/mk/read.txt
index 8c8726eea..437f17b56 100644
--- a/inc/lang/mk/read.txt
+++ b/inc/lang/mk/read.txt
@@ -1 +1 @@
-Оваа страница е само за читање. Можете да го гледате изворот, но не можете да ја менувате. Ако мислите дека ова е погрешно, контактирајте го администраторот. \ No newline at end of file
+Оваа страница е само за читање. Можете да го гледате изворот, но не можете да ја менувате. Ако мислите дека ова е погрешно, контактирајте го администраторот.
diff --git a/inc/lang/mk/recent.txt b/inc/lang/mk/recent.txt
index cfbba4aa2..4b0959eb4 100644
--- a/inc/lang/mk/recent.txt
+++ b/inc/lang/mk/recent.txt
@@ -1,3 +1,3 @@
====== Скорешни промени ======
-Следниве страници беа скорешно променети. \ No newline at end of file
+Следниве страници беа скорешно променети:
diff --git a/inc/lang/mk/showrev.txt b/inc/lang/mk/showrev.txt
index a0ca7353e..8cb903b14 100644
--- a/inc/lang/mk/showrev.txt
+++ b/inc/lang/mk/showrev.txt
@@ -1,2 +1,2 @@
**Ова е стара ревизија од документото!**
----- \ No newline at end of file
+----
diff --git a/inc/lang/ml/admin.txt b/inc/lang/ml/admin.txt
index 0f9c81486..a96555c19 100644
--- a/inc/lang/ml/admin.txt
+++ b/inc/lang/ml/admin.txt
@@ -1,3 +1,3 @@
====== പൊതു സെറ്റിംഗ്സ് ======
-താഴെ കാണുന്ന പട്ടിക ഡോക്കുവിക്കിയിൽ ഉള്ള പൊതു സെറ്റിംഗ്സ് ആണ് . \ No newline at end of file
+താഴെ കാണുന്ന പട്ടിക ഡോക്കുവിക്കിയിൽ ഉള്ള പൊതു സെറ്റിംഗ്സ് ആണ് .
diff --git a/inc/lang/mr/admin.txt b/inc/lang/mr/admin.txt
index 6f54384f2..9dafe912e 100644
--- a/inc/lang/mr/admin.txt
+++ b/inc/lang/mr/admin.txt
@@ -1,3 +1,3 @@
====== व्यवस्थापन ======
-खाली तुम्हाला डॉक्युविकि मधे उपलब्ध असलेल्या व्यवस्थापनाच्या क्रियांची सूची दिली आहे. \ No newline at end of file
+खाली तुम्हाला डॉक्युविकि मधे उपलब्ध असलेल्या व्यवस्थापनाच्या क्रियांची सूची दिली आहे.
diff --git a/inc/lang/mr/backlinks.txt b/inc/lang/mr/backlinks.txt
index 997fa68e0..c9b075ea9 100644
--- a/inc/lang/mr/backlinks.txt
+++ b/inc/lang/mr/backlinks.txt
@@ -1,3 +1,3 @@
====== प्रतिलिंक ======
-ही त्या सर्व प्रृष्ठांची सूची आहे जी या पृष्ठाला परत लिंक करतात. \ No newline at end of file
+ही त्या सर्व प्रृष्ठांची सूची आहे जी या पृष्ठाला परत लिंक करतात.
diff --git a/inc/lang/mr/conflict.txt b/inc/lang/mr/conflict.txt
index 2b1bb6423..dd9a8434e 100644
--- a/inc/lang/mr/conflict.txt
+++ b/inc/lang/mr/conflict.txt
@@ -2,4 +2,4 @@
तुम्ही संपादित केलेल्या दस्तावेजाची नवीन आवृत्ती उपलब्ध आहे. तुम्ही संपादित करत असलेल्या दस्तावेजामधे त्याच वेळी इतर यूजरने बदल केल्यास असे घडते.
-खाली दर्शाविलेले फरक नीट तपासा आणि त्यापैकी कुठले ठेवायचे ते ठरवा. जर तुम्ही 'सुरक्षित' केलं तर तुमचे बदल सुरक्षित होतील. सध्याची आवृत्ति ठेवण्यासाठी 'कॅन्सल' वर क्लिक करा. \ No newline at end of file
+खाली दर्शाविलेले फरक नीट तपासा आणि त्यापैकी कुठले ठेवायचे ते ठरवा. जर तुम्ही 'सुरक्षित' केलं तर तुमचे बदल सुरक्षित होतील. सध्याची आवृत्ति ठेवण्यासाठी 'कॅन्सल' वर क्लिक करा.
diff --git a/inc/lang/mr/denied.txt b/inc/lang/mr/denied.txt
index 5415fde04..4fb1c554d 100644
--- a/inc/lang/mr/denied.txt
+++ b/inc/lang/mr/denied.txt
@@ -1,4 +1,3 @@
====== परवानगी नाकारली ======
क्षमा करा, पण तुम्हाला यापुढे जाण्याचे हक्क नाहीत.
-
diff --git a/inc/lang/mr/diff.txt b/inc/lang/mr/diff.txt
index f0a845056..e6abdfedc 100644
--- a/inc/lang/mr/diff.txt
+++ b/inc/lang/mr/diff.txt
@@ -1,3 +1,3 @@
====== फरक ======
-या पानावर तुम्हाला निवडलेली आवृत्ती व सध्याच्या आवृत्ती मधले फरक दाखवले आहेत. \ No newline at end of file
+या पानावर तुम्हाला निवडलेली आवृत्ती व सध्याच्या आवृत्ती मधले फरक दाखवले आहेत.
diff --git a/inc/lang/mr/draft.txt b/inc/lang/mr/draft.txt
index aa74475d7..52f8d2eb2 100644
--- a/inc/lang/mr/draft.txt
+++ b/inc/lang/mr/draft.txt
@@ -2,4 +2,4 @@
तुमचा मागचा संपादानाचा सेशन नीट पूर्ण झाला नव्हता. डॉक्युविकिने तुमच्या कामाचा मसुदा आपोआप सुरक्षित केला होता , जो वापरून तुमची संपादन परत चालू करू शकता. खाली तुमच्या मागच्या सेशन मधला सुरक्षित केलेला डेटा दाखवला आहे.
-कृपया आता हे ठरवा की तुमच्या संपादन सेशनचे //पुनर्स्थापन// करायचे, सुरक्षित केलेला मसुदा //रद्द// करायचा का संपादनच //कॅन्सल// करायचं. \ No newline at end of file
+कृपया आता हे ठरवा की तुमच्या संपादन सेशनचे //पुनर्स्थापन// करायचे, सुरक्षित केलेला मसुदा //रद्द// करायचा का संपादनच //कॅन्सल// करायचं.
diff --git a/inc/lang/mr/edit.txt b/inc/lang/mr/edit.txt
index 6c6347e70..d372edf9f 100644
--- a/inc/lang/mr/edit.txt
+++ b/inc/lang/mr/edit.txt
@@ -1 +1 @@
-पान संपादित करा आणि 'सुरक्षित' वर क्लिक करा. विकी सिन्टॅक्स साठी [[wiki:syntax]] पहा.कृपया तुम्ही जर एखादे पान **सुधारित** करू शकत असाल तरच ते संपादित करा. अन्यथा जर तुम्हाला फ़क्त काही गोष्टी ट्राय करून बघायच्या असतील तर [[playground:playground|प्लेग्राऊण्ड]] मधे आपले धडे गिरवा! \ No newline at end of file
+पान संपादित करा आणि 'सुरक्षित' वर क्लिक करा. विकी सिन्टॅक्स साठी [[wiki:syntax]] पहा.कृपया तुम्ही जर एखादे पान **सुधारित** करू शकत असाल तरच ते संपादित करा. अन्यथा जर तुम्हाला फ़क्त काही गोष्टी ट्राय करून बघायच्या असतील तर [[playground:playground|प्लेग्राऊण्ड]] मधे आपले धडे गिरवा!
diff --git a/inc/lang/mr/editrev.txt b/inc/lang/mr/editrev.txt
index d58c8abd0..7eb356049 100644
--- a/inc/lang/mr/editrev.txt
+++ b/inc/lang/mr/editrev.txt
@@ -1,2 +1,2 @@
**तुमची या पानाची जुनी आवृत्ती लोड केलि आहे!** जर तुमची ती सुरक्षित केली तर तुमची त्याची एक नवीन आवृत्ती तयार कराल.
----- \ No newline at end of file
+----
diff --git a/inc/lang/mr/index.txt b/inc/lang/mr/index.txt
index 489b20435..a15af08b5 100644
--- a/inc/lang/mr/index.txt
+++ b/inc/lang/mr/index.txt
@@ -1,3 +1,3 @@
====== सूची ======
-ही सर्व उपलब्ध पानांची [[doku>namespaces|नेमस्पेस]] अनुसार तयार केलेली सूची आहे. \ No newline at end of file
+ही सर्व उपलब्ध पानांची [[doku>namespaces|नेमस्पेस]] अनुसार तयार केलेली सूची आहे.
diff --git a/inc/lang/mr/install.html b/inc/lang/mr/install.html
index 9696c78dd..9800b54b5 100644
--- a/inc/lang/mr/install.html
+++ b/inc/lang/mr/install.html
@@ -1,10 +1,7 @@
-<p>हे पान <a href="http://dokuwiki.org">डॉक्युविकि</a> च्या पहिल्या इन्स्टॉलेशन आणि कॉन्फिगरेशन साठी मदत करतं. या इंस्टॉलर विषयी जास्ती माहिती त्याच्या
-<a href="http://dokuwiki.org/installer">माहितीसंग्रह पानावर</a> उपलब्ध आहे.</p>
+<p>हे पान <a href="http://dokuwiki.org">डॉक्युविकि</a> च्या पहिल्या इन्स्टॉलेशन आणि कॉन्फिगरेशन साठी मदत करतं. या इंस्टॉलर विषयी जास्ती माहिती त्याच्या <a href="http://dokuwiki.org/installer">माहितीसंग्रह पानावर</a> उपलब्ध आहे.</p>
<p> डॉक्युविकि विकी पाने व सम्बंधित माहिती ( उदा. फोटो , शोध सूची, जुन्या आवृत्ती ई.) साठवण्यासाठी सामान्य फाइलचा उपयोग करतं. डॉक्युविकिने नीट काम करण्यासाठी डॉक्युविकिला या फाइल जिथे साठवल्या आहेत त्या डिरेक्टरीमधे लेखनाचे हक्क ( write access ) असणे <strong>अत्यावश्यक</strong> आहे. या इंस्टॉलरला डिरेक्टरीचे हक्क सेट करता येत नाहीत. ते थेट तुमच्या शेल मधून सेट करावे लागतात, किंवा तुम्ही व्यावसायिक होस्टिंग वापरत असाल तर FTP वापरून अथवा तुमच्या होस्टिंग कंट्रोल पॅनल ( उदा. cPanel वगैरे ) मधून सेट करावे लागतात.</p>
<p>हा इंस्टॉलर तुमच्या डॉक्युविकिचे <abbr title="access control list">ACL</abbr> कॉन्फिगरेशन ठरवेल, ज्याद्वारे तुम्हाला व्यवस्थापकीय लॉगिन, डॉक्युविकिच्या व्यवस्थापन मेनू मधे प्लगिनचे इन्स्टॉलेशन, सदस्यांची व्यवस्था, विकी पानांवरील हक्क, कॉन्फिगरेशन बदलणे ई. साठी प्रवेशाचे हक्क वगैरे बदल करता येतील. ही व्यवस्था डॉक्युविकि वापरण्यासाठी आवश्यक नाही पण वापरल्यास डॉक्युविकिचे व्यवस्थापन अधिक सुरळित होइल.</p>
-<p>अनुभवी सदस्य किंवा ज्याना काही ख़ास गरजा असतील त्यानी खालील लिंक्स वापराव्यात :
-<a href="http://dokuwiki.org/install">इन्स्टॉलेशनविषयी सूचना</a>
-and <a href="http://dokuwiki.org/config">कॉन्फिगरेशनची सेटिंग</a></p> \ No newline at end of file
+<p>अनुभवी सदस्य किंवा ज्याना काही ख़ास गरजा असतील त्यानी खालील लिंक्स वापराव्यात : <a href="http://dokuwiki.org/install">इन्स्टॉलेशनविषयी सूचना</a> and <a href="http://dokuwiki.org/config">कॉन्फिगरेशनची सेटिंग</a></p>
diff --git a/inc/lang/mr/locked.txt b/inc/lang/mr/locked.txt
index dae909c40..f0c6e07e5 100644
--- a/inc/lang/mr/locked.txt
+++ b/inc/lang/mr/locked.txt
@@ -1,3 +1,3 @@
====== पान लॉक आहे ======
-हे पान सध्या दुसर्या सदस्याने संपादनासाठी लॉक केले आहे. तुम्हाला त्याचे संपादन करून होईपर्यंत किंवा लॉक संपेपर्यंत थांबावे लागेल. \ No newline at end of file
+हे पान सध्या दुसर्या सदस्याने संपादनासाठी लॉक केले आहे. तुम्हाला त्याचे संपादन करून होईपर्यंत किंवा लॉक संपेपर्यंत थांबावे लागेल.
diff --git a/inc/lang/mr/login.txt b/inc/lang/mr/login.txt
index f2fef4c45..1b5d2e66b 100644
--- a/inc/lang/mr/login.txt
+++ b/inc/lang/mr/login.txt
@@ -1,3 +1,3 @@
====== लॉगिन ======
-तुम्ही सध्या लॉगिन केलेले नाही! तुमचे नाव-पासवर्ड देऊन खाली लॉगिन करा. लॉगिन करण्यासाठी तुमच्या ब्राउजरमधे कुकीज चालू असल्या पाहिजेत. \ No newline at end of file
+तुम्ही सध्या लॉगिन केलेले नाही! तुमचे नाव-पासवर्ड देऊन खाली लॉगिन करा. लॉगिन करण्यासाठी तुमच्या ब्राउजरमधे कुकीज चालू असल्या पाहिजेत.
diff --git a/inc/lang/mr/newpage.txt b/inc/lang/mr/newpage.txt
index 00a1c6b60..d6a43cb16 100644
--- a/inc/lang/mr/newpage.txt
+++ b/inc/lang/mr/newpage.txt
@@ -1,3 +1,3 @@
====== हा मुद्दा अजून अस्तित्त्वात नाही ======
-तुमची अशा एखाद्या मुद्द्याच्या लिंक वरून इथे आला आहात जो अजून अस्तित्त्वात नाही. जर तुम्हाला परवानगी असेल तर तुमची त्या मुद्द्यावर "हे पान नवीन तयार करा" हे बटण क्लिक करून स्वतः एक पान तयार करू शकता. \ No newline at end of file
+तुमची अशा एखाद्या मुद्द्याच्या लिंक वरून इथे आला आहात जो अजून अस्तित्त्वात नाही. जर तुम्हाला परवानगी असेल तर तुमची त्या मुद्द्यावर **हे पान नवीन तयार करा** हे बटण क्लिक करून स्वतः एक पान तयार करू शकता.
diff --git a/inc/lang/mr/norev.txt b/inc/lang/mr/norev.txt
index 180b031fe..7548c05ae 100644
--- a/inc/lang/mr/norev.txt
+++ b/inc/lang/mr/norev.txt
@@ -1,3 +1,3 @@
====== अशी कुठली आवृत्ती नाही ======
-ही आवृत्ती अस्तित्त्वात नाही. "जुन्या आवृत्त्या" बटण वापरून या दस्तावेजाच्या सर्व जुन्या आवृत्त्या तुमची पाहू शकता. \ No newline at end of file
+ही आवृत्ती अस्तित्त्वात नाही. "जुन्या आवृत्त्या" बटण वापरून या दस्तावेजाच्या सर्व जुन्या आवृत्त्या तुमची पाहू शकता.
diff --git a/inc/lang/mr/preview.txt b/inc/lang/mr/preview.txt
index 8277398dd..fc2c157d6 100644
--- a/inc/lang/mr/preview.txt
+++ b/inc/lang/mr/preview.txt
@@ -1,3 +1,3 @@
====== झलक ======
-ही तुमचा मजकूर कसा दिसेल त्याची एक झलक आहे. लक्षात ठेवा : हा मजकूर अजुन **सुरक्षित केलेला नाही** ! \ No newline at end of file
+ही तुमचा मजकूर कसा दिसेल त्याची एक झलक आहे. लक्षात ठेवा : हा मजकूर अजुन **सुरक्षित केलेला नाही** !
diff --git a/inc/lang/mr/pwconfirm.txt b/inc/lang/mr/pwconfirm.txt
index 8c03f174d..0b2a1323c 100644
--- a/inc/lang/mr/pwconfirm.txt
+++ b/inc/lang/mr/pwconfirm.txt
@@ -1,6 +1,7 @@
नमस्कार @FULLNAME@!
कोणीतरी तुमच्या @TITLE@ या @DOKUWIKIURL@ येथील लॉगिनसाठी नवीन पासवर्ड मागवला आहे.
+
जर तुम्ही हा पासवर्ड मागवला नसेल तर कृपया ह्या ईमेलकड़े दुर्लक्ष करा.
जर नक्की तुम्हीच हा पासवर्ड मागवला असेल तर खालील लिंकवर क्लिक करून ते नक्की करा.
diff --git a/inc/lang/mr/read.txt b/inc/lang/mr/read.txt
index b834dd750..0f54c671a 100644
--- a/inc/lang/mr/read.txt
+++ b/inc/lang/mr/read.txt
@@ -1 +1 @@
-हे पान फक्त वाचता येऊ शकतं. तुम्ही त्याचा मूळ विकी मजकूर पाहू शकता पण तो बदलू शकत नाही. जर हे चुकीचं असेल तर तुमच्या विकी व्यवस्थापकाशी संपर्क साधा. \ No newline at end of file
+हे पान फक्त वाचता येऊ शकतं. तुम्ही त्याचा मूळ विकी मजकूर पाहू शकता पण तो बदलू शकत नाही. जर हे चुकीचं असेल तर तुमच्या विकी व्यवस्थापकाशी संपर्क साधा.
diff --git a/inc/lang/mr/recent.txt b/inc/lang/mr/recent.txt
index 9a6d6f151..e64989052 100644
--- a/inc/lang/mr/recent.txt
+++ b/inc/lang/mr/recent.txt
@@ -1,3 +1,3 @@
====== अलीकडील बदल ======
-खालील पाने हल्लीच बदलली आहेत \ No newline at end of file
+खालील पाने हल्लीच बदलली आहेत:
diff --git a/inc/lang/mr/register.txt b/inc/lang/mr/register.txt
index 3aca31278..15bbda1bd 100644
--- a/inc/lang/mr/register.txt
+++ b/inc/lang/mr/register.txt
@@ -1,3 +1,3 @@
====== नवीन सदस्य म्हणुन नोंदणी करा ======
-खाली तुमची माहिती भरून या विकी वर नवीन खातं उघडा. कृपया आपण देत असलेला ईमेल चालू असल्याची खात्री करा - जर तुम्हाला इथे पासवर्ड टाकायला सांगितला नाही तयार एक नवीन पासवर्ड तुम्हाला त्या ईमेल वर पाठवला जाइल. तुमचं लॉगिन नाम एक वैध [[doku>pagename|पेजनेम]] असले पाहिजे. \ No newline at end of file
+खाली तुमची माहिती भरून या विकी वर नवीन खातं उघडा. कृपया आपण देत असलेला ईमेल चालू असल्याची खात्री करा - जर तुम्हाला इथे पासवर्ड टाकायला सांगितला नाही तयार एक नवीन पासवर्ड तुम्हाला त्या ईमेल वर पाठवला जाइल. तुमचं लॉगिन नाम एक वैध [[doku>pagename|पेजनेम]] असले पाहिजे.
diff --git a/inc/lang/mr/resendpwd.txt b/inc/lang/mr/resendpwd.txt
index 64b95a45f..db9bdfe24 100644
--- a/inc/lang/mr/resendpwd.txt
+++ b/inc/lang/mr/resendpwd.txt
@@ -1,3 +1,3 @@
====== नवीन पासवर्ड पाठव ======
-या विकिवरील तुमच्या अकाउंटसाठी नवीन पासवर्ड मिळवण्यासाठी कृपया तुमचे सदस्य नाम खालच्या फॉर्म मधे टाका. ही पासवर्डची मागणी नक्की करण्यासाठी तुम्ही नोंदणी करताना दिलेल्या ईमेल पत्त्यावर एक लिंक पाठवली जाइल. \ No newline at end of file
+या विकिवरील तुमच्या अकाउंटसाठी नवीन पासवर्ड मिळवण्यासाठी कृपया तुमचे सदस्य नाम खालच्या फॉर्म मधे टाका. ही पासवर्डची मागणी नक्की करण्यासाठी तुम्ही नोंदणी करताना दिलेल्या ईमेल पत्त्यावर एक लिंक पाठवली जाइल.
diff --git a/inc/lang/mr/revisions.txt b/inc/lang/mr/revisions.txt
index fb842c763..6cd1c39a4 100644
--- a/inc/lang/mr/revisions.txt
+++ b/inc/lang/mr/revisions.txt
@@ -1,3 +1,3 @@
====== जुन्या आवृत्त्या ======
-ह्या सद्य दस्तावेजच्या जुन्या आवृत्त्या आहेत. एखाद्या जुन्या आवृत्तीवर परत जाण्यासाठी टी खालून निवडा, "हे पान संपादित करा" वर क्लिक करा आणि ते सुरक्षित करा. \ No newline at end of file
+ह्या सद्य दस्तावेजच्या जुन्या आवृत्त्या आहेत. एखाद्या जुन्या आवृत्तीवर परत जाण्यासाठी टी खालून निवडा, "हे पान संपादित करा" वर क्लिक करा आणि ते सुरक्षित करा.
diff --git a/inc/lang/mr/searchpage.txt b/inc/lang/mr/searchpage.txt
index 707e69939..cc754d1af 100644
--- a/inc/lang/mr/searchpage.txt
+++ b/inc/lang/mr/searchpage.txt
@@ -1,4 +1,3 @@
====== शोध ======
तुम्हाला खाली तुमच्या शोधाचे फलित दिसतील. @CREATEPAGEINFO@
-
diff --git a/inc/lang/mr/showrev.txt b/inc/lang/mr/showrev.txt
index dc058307f..76a5d77df 100644
--- a/inc/lang/mr/showrev.txt
+++ b/inc/lang/mr/showrev.txt
@@ -1,2 +1,2 @@
** ही ह्या दस्तावेजची जुनी आवृत्ती आहे. **
----- \ No newline at end of file
+----
diff --git a/inc/lang/mr/stopwords.txt b/inc/lang/mr/stopwords.txt
index 2b413a928..ecb9f170c 100644
--- a/inc/lang/mr/stopwords.txt
+++ b/inc/lang/mr/stopwords.txt
@@ -36,4 +36,4 @@ will
with
und
the
-www \ No newline at end of file
+www
diff --git a/inc/lang/mr/updateprofile.txt b/inc/lang/mr/updateprofile.txt
index c08810f3e..6de177fc3 100644
--- a/inc/lang/mr/updateprofile.txt
+++ b/inc/lang/mr/updateprofile.txt
@@ -1,3 +1,3 @@
====== तुमची सदस्य माहिती अद्ययावत करा ======
-फ़क्त तुम्हाला बदल करायचा असेल तेच रकाने परत भरा. तुमची तुमचे सदस्य नाम बदलू शकत नाही. \ No newline at end of file
+फ़क्त तुम्हाला बदल करायचा असेल तेच रकाने परत भरा. तुमची तुमचे सदस्य नाम बदलू शकत नाही.
diff --git a/inc/lang/ne/admin.txt b/inc/lang/ne/admin.txt
index 7a829dbe5..f69753460 100644
--- a/inc/lang/ne/admin.txt
+++ b/inc/lang/ne/admin.txt
@@ -1,2 +1,3 @@
====== व्यवस्थापन ======
-तल तपाईले DokuWikiमा उपलव्ध व्यवस्थापकिय कार्यहरुको सुची पाउन सक्नुहुन्छ । \ No newline at end of file
+
+तल तपाईले DokuWikiमा उपलव्ध व्यवस्थापकिय कार्यहरुको सुची पाउन सक्नुहुन्छ ।
diff --git a/inc/lang/ne/backlinks.txt b/inc/lang/ne/backlinks.txt
index 51b95731d..55fba206f 100644
--- a/inc/lang/ne/backlinks.txt
+++ b/inc/lang/ne/backlinks.txt
@@ -1,2 +1,3 @@
====== पछाडि लिङ्क ======
-यो पृष्ठहरुको सुचीहरुले पछाडि लिङ्क स्वयंलाई नै गरेको छ। \ No newline at end of file
+
+यो पृष्ठहरुको सुचीहरुले पछाडि लिङ्क स्वयंलाई नै गरेको छ।
diff --git a/inc/lang/ne/conflict.txt b/inc/lang/ne/conflict.txt
index 457e108ad..3062089de 100644
--- a/inc/lang/ne/conflict.txt
+++ b/inc/lang/ne/conflict.txt
@@ -2,4 +2,4 @@
तपाईले सम्पादन गर्नुभएको पाठको नयाँ सस्करण उपलब्ध छ। तपाईले सम्पादन गरिरहनु भएको समयमा अर्को प्रयोगकर्ताले यो पाठ परिवर्तन गरेकोले यस्तो भएको हो ।
-दुबैका फरक दाज्नुहोस् र दुईमा कुन राख्नेहो निश्चित गर्नुहोस् ।तपाईले "वचत गर्नुहोस् " छान्नु भयो भने तपाईको संस्करण वचत हुनेछ। "रद्द गर्नुहोस्" छान्नु भयो भने अहिलेको संस्करण वचत हुनेछ । \ No newline at end of file
+दुबैका फरक दाज्नुहोस् र दुईमा कुन राख्नेहो निश्चित गर्नुहोस् ।तपाईले "वचत गर्नुहोस् " छान्नु भयो भने तपाईको संस्करण वचत हुनेछ। "रद्द गर्नुहोस्" छान्नु भयो भने अहिलेको संस्करण वचत हुनेछ ।
diff --git a/inc/lang/ne/denied.txt b/inc/lang/ne/denied.txt
index 5c58cde28..653cd005b 100644
--- a/inc/lang/ne/denied.txt
+++ b/inc/lang/ne/denied.txt
@@ -1,4 +1,3 @@
====== अनुमति अमान्य ======
माफ गर्नुहोला तपाईलाई अगाडि बढ्न अनुमति छैन।
-
diff --git a/inc/lang/ne/diff.txt b/inc/lang/ne/diff.txt
index 76d75fbfb..17ec66901 100644
--- a/inc/lang/ne/diff.txt
+++ b/inc/lang/ne/diff.txt
@@ -1,3 +1,3 @@
====== भिन्नताहरु ======
-यसले यो पृष्ठको छानिएको संस्करण र हालको संकरण बीच भिन्नताहरु देखाउँछ । \ No newline at end of file
+यसले यो पृष्ठको छानिएको संस्करण र हालको संकरण बीच भिन्नताहरु देखाउँछ ।
diff --git a/inc/lang/ne/draft.txt b/inc/lang/ne/draft.txt
index 88630c992..3593f2012 100644
--- a/inc/lang/ne/draft.txt
+++ b/inc/lang/ne/draft.txt
@@ -2,4 +2,4 @@
तपाईको यो पृष्ठको गत सम्पादन सफलतापूर्वक सम्पन्न भएको थिएन ।DokuWiki ले स्वचालितरुपमा ड्राफ्ट वचतगरेको छ त्यस देखि तपाईले आफ्नो सम्पादन कार्यमा निरन्तरता दिन सक्नुहुन्छ। तल तपाईले गत सत्रमा बचत गरिएको सामग्री देख्न सक्नुहुन्छ ।
-कृपया निर्णय दिनुहोस् कि तपाई गत सत्रमा बचत गरिएको सत्रको सम्पादनकार्य //recover// , //delete// वा //cancel// के गर्न चाहनुहुन्छ भनेर।
+कृपया निर्णय दिनुहोस् कि तपाई गत सत्रमा बचत गरिएको सत्रको सम्पादनकार्य //recover//, //delete// वा //cancel// के गर्न चाहनुहुन्छ भनेर।
diff --git a/inc/lang/ne/edit.txt b/inc/lang/ne/edit.txt
index be498a61b..e82b54a30 100644
--- a/inc/lang/ne/edit.txt
+++ b/inc/lang/ne/edit.txt
@@ -1 +1 @@
-पृष्ठ सम्पादन गर्नुहोस र "बचत" मा थिच्नुहोस् । सिन्टेक्सको लागि [[wiki:syntax]] हेर्नुहोस् । यो पृष्ठलाई **सुधार्न** सक्नुहुन्छ भने मात्र सम्पादन गर्नुहोस् ।यदि कुनै प्रयोग गर्न या , जान्न चाहनुहुन्छ भने [[playground:playground|playground]] को प्रयोग गर्नुहोस् । \ No newline at end of file
+पृष्ठ सम्पादन गर्नुहोस र "बचत" मा थिच्नुहोस् । सिन्टेक्सको लागि [[wiki:syntax]] हेर्नुहोस् । यो पृष्ठलाई **सुधार्न** सक्नुहुन्छ भने मात्र सम्पादन गर्नुहोस् ।यदि कुनै प्रयोग गर्न या , जान्न चाहनुहुन्छ भने [[playground:playground|playground]] को प्रयोग गर्नुहोस् ।
diff --git a/inc/lang/ne/editrev.txt b/inc/lang/ne/editrev.txt
index 0db67c2bb..e6cc9c188 100644
--- a/inc/lang/ne/editrev.txt
+++ b/inc/lang/ne/editrev.txt
@@ -1,2 +1,2 @@
-** तपाईले यस कागजातको पुरानो संस्करण खोल्नु भएको छ ।** यदि यसलाई वचत गर्नुभयो भने यसैसामग्रीबाट नयाँ संस्करणको निर्माण हुनेछ ।
----- \ No newline at end of file
+**तपाईले यस कागजातको पुरानो संस्करण खोल्नु भएको छ ।** यदि यसलाई वचत गर्नुभयो भने यसैसामग्रीबाट नयाँ संस्करणको निर्माण हुनेछ ।
+----
diff --git a/inc/lang/ne/index.txt b/inc/lang/ne/index.txt
index cb06f0307..2eba65316 100644
--- a/inc/lang/ne/index.txt
+++ b/inc/lang/ne/index.txt
@@ -1,3 +1,3 @@
====== सुची ======
-यो सबै उपलाब्ध पृष्ठहरुको [[doku>namespaces|namespaces]] का आधारमा मिलाइएको सुची हो । \ No newline at end of file
+यो सबै उपलाब्ध पृष्ठहरुको [[doku>namespaces|namespaces]] का आधारमा मिलाइएको सुची हो ।
diff --git a/inc/lang/ne/locked.txt b/inc/lang/ne/locked.txt
index 85f5390a0..575d57722 100644
--- a/inc/lang/ne/locked.txt
+++ b/inc/lang/ne/locked.txt
@@ -1,3 +1,3 @@
====== पृष्ठमा ताला लगाएको छ ======
-यो पृष्ठ अर्को प्रयोगकर्ताद्वारा सम्पादनका लागि ताला लगाइएको छ । तपाईले सम्पादन समाप्त नहुन्जेल या तालाको समय समाप्त नहुन्जेल सम्म प्रतिक्षागर्नु पर्छ । \ No newline at end of file
+यो पृष्ठ अर्को प्रयोगकर्ताद्वारा सम्पादनका लागि ताला लगाइएको छ । तपाईले सम्पादन समाप्त नहुन्जेल या तालाको समय समाप्त नहुन्जेल सम्म प्रतिक्षागर्नु पर्छ ।
diff --git a/inc/lang/ne/norev.txt b/inc/lang/ne/norev.txt
index 28c4efb66..96c918692 100644
--- a/inc/lang/ne/norev.txt
+++ b/inc/lang/ne/norev.txt
@@ -1,2 +1,3 @@
====== कुनै त्यस्तो पुन:संस्करण भेटिएन ======
-खुलाइएको पुन:संस्करण अस्तित्वमा छैन ।यस कागजातको सम्पूर्ण संस्करणको सुचीको लागि "पुरानो पुन:संस्करण" बटन प्रयोग गर्नुहोस् । \ No newline at end of file
+
+खुलाइएको पुन:संस्करण अस्तित्वमा छैन ।यस कागजातको सम्पूर्ण संस्करणको सुचीको लागि "पुरानो पुन:संस्करण" बटन प्रयोग गर्नुहोस् ।
diff --git a/inc/lang/ne/read.txt b/inc/lang/ne/read.txt
index e004cd39b..2c11d5d77 100644
--- a/inc/lang/ne/read.txt
+++ b/inc/lang/ne/read.txt
@@ -1 +1 @@
-यो पृष्ठ पढ्नको लागि मात्र हो । तपाई स्रोतहेर्न सक्नुहुन्छ ,तर सम्पादन भने गर्न सक्नुहुन्न । तपाईको व्यवस्थापक(administrator) सँग के समस्या छ भनेर सोध्नु होला । \ No newline at end of file
+यो पृष्ठ पढ्नको लागि मात्र हो । तपाई स्रोतहेर्न सक्नुहुन्छ ,तर सम्पादन भने गर्न सक्नुहुन्न । तपाईको व्यवस्थापक(administrator) सँग के समस्या छ भनेर सोध्नु होला ।
diff --git a/inc/lang/ne/recent.txt b/inc/lang/ne/recent.txt
index 239903fd7..2db49c9aa 100644
--- a/inc/lang/ne/recent.txt
+++ b/inc/lang/ne/recent.txt
@@ -1,2 +1,3 @@
====== हालैको परिवर्तन ======
-निम्न पृष्ठहरु हालै परिवर्तन गरिएका छन् । \ No newline at end of file
+
+निम्न पृष्ठहरु हालै परिवर्तन गरिएका छन् ।:
diff --git a/inc/lang/ne/resendpwd.txt b/inc/lang/ne/resendpwd.txt
index aec9dfb95..5fa71da54 100644
--- a/inc/lang/ne/resendpwd.txt
+++ b/inc/lang/ne/resendpwd.txt
@@ -1,3 +1,3 @@
====== नयाँ प्रवेशशब्द पठाउनुहोस् ======
-कृपया तपाईको यस विकीमा रहेको खाताको लाहि नयाँ प्रवेशशव्द अनुरोध गर्न तपाईँको नाम निम्न फर्ममा प्रविष्ट गर्नुहोस । एउटा किटानी लिङ्क तपाईले दर्ता गर्नु भएको इमेल ठेगानामा पठाइने छ । \ No newline at end of file
+कृपया तपाईको यस विकीमा रहेको खाताको लाहि नयाँ प्रवेशशव्द अनुरोध गर्न तपाईँको नाम निम्न फर्ममा प्रविष्ट गर्नुहोस । एउटा किटानी लिङ्क तपाईले दर्ता गर्नु भएको इमेल ठेगानामा पठाइने छ ।
diff --git a/inc/lang/ne/searchpage.txt b/inc/lang/ne/searchpage.txt
index 02219e72b..7c0a47c28 100644
--- a/inc/lang/ne/searchpage.txt
+++ b/inc/lang/ne/searchpage.txt
@@ -1,4 +1,3 @@
====== खोज ======
तपाईले आफ्नो खोजको निम्न नतिजा पाउन सक्नुहुन्छ। @CREATEPAGEINFO@
-
diff --git a/inc/lang/ne/showrev.txt b/inc/lang/ne/showrev.txt
index 5b22e9737..7a7a53adc 100644
--- a/inc/lang/ne/showrev.txt
+++ b/inc/lang/ne/showrev.txt
@@ -1,2 +1,2 @@
** यो कागजातको पुरानो पुन:संस्करण हो !**
---- \ No newline at end of file
+----
diff --git a/inc/lang/nl/backlinks.txt b/inc/lang/nl/backlinks.txt
index 6edbf4021..daae32049 100644
--- a/inc/lang/nl/backlinks.txt
+++ b/inc/lang/nl/backlinks.txt
@@ -1,4 +1,3 @@
====== Backlinks ======
Dit is een lijst van pagina's die terug lijken te wijzen naar de huidige pagina.
-
diff --git a/inc/lang/nl/denied.txt b/inc/lang/nl/denied.txt
index a172ddab6..283fd6e61 100644
--- a/inc/lang/nl/denied.txt
+++ b/inc/lang/nl/denied.txt
@@ -1,4 +1,3 @@
====== Toegang geweigerd ======
Sorry: je hebt niet voldoende rechten om verder te gaan.
-
diff --git a/inc/lang/nl/index.txt b/inc/lang/nl/index.txt
index ad7122ba0..660c45fce 100644
--- a/inc/lang/nl/index.txt
+++ b/inc/lang/nl/index.txt
@@ -1,4 +1,3 @@
====== Index ======
-Dit is een index van alle beschikbare pagina's gesorteerd op [[doku>namespaces|namespaces]].
-
+Dit is een index van alle beschikbare pagina's gesorteerd op [[doku>nl:namespaces|namespaces]].
diff --git a/inc/lang/nl/install.html b/inc/lang/nl/install.html
index a65325826..d48dff315 100644
--- a/inc/lang/nl/install.html
+++ b/inc/lang/nl/install.html
@@ -1,14 +1,7 @@
-<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>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>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 <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>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://dokuwiki.org/install">installatie-instructies</a>
-en <a href="http://dokuwiki.org/config">configuratie-instellingen</a>.</p>
+<p>Ervaren gebruikers of gebruikers die een aangepaste configuratie nodig hebben kunnen voor details terecht op de volgende pagina's: <a href="http://dokuwiki.org/nl:install">installatie-instructies</a> en <a href="http://dokuwiki.org/nl:config">configuratie-instellingen</a>.</p>
diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php
index fe3c8793b..f799318c3 100644
--- a/inc/lang/nl/lang.php
+++ b/inc/lang/nl/lang.php
@@ -3,6 +3,9 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author PBU <pbu@xs4all.nl>
+ * @author Gerrit Uitslag <klapinklapin@gmail.com>
+ * @author Andy <astolker@icloud.com>
* @author Harriet Neitz <harrietneitz@gmail.com>
* @author mark prins <mprins@users.sf.net>
* @author François Kooman <fkooman.tuxed.net>
@@ -18,7 +21,6 @@
* @author Timon Van Overveldt <timonvo@gmail.com>
* @author Jeroen
* @author Ricardo Guijt <ricardoguijt@gmail.com>
- * @author Gerrit <klapinklapin@gmail.com>
* @author Remon <no@email.local>
* @author gicalle <gicalle@hotmail.com>
* @author Rene <wllywlnt@yahoo.com>
diff --git a/inc/lang/nl/newpage.txt b/inc/lang/nl/newpage.txt
index 0e4b95ec0..e9bcd0d50 100644
--- a/inc/lang/nl/newpage.txt
+++ b/inc/lang/nl/newpage.txt
@@ -1,3 +1,3 @@
====== Dit onderwerp bestaat nog niet ======
-De pagina over dit onderwerp bestaat nog niet. Aanmaken kan door op de ''Maak deze pagina aan'' te klikken.
+De pagina over dit onderwerp bestaat nog niet. Aanmaken kan door op de **Maak deze pagina aan** te klikken.
diff --git a/inc/lang/nl/norev.txt b/inc/lang/nl/norev.txt
index 849fc5138..a66837fbd 100644
--- a/inc/lang/nl/norev.txt
+++ b/inc/lang/nl/norev.txt
@@ -1,4 +1,3 @@
====== Revisie bestaat niet ======
De opgegeven revisie bestaat niet. Klik op ''Oude revisies'' voor een lijst van oude revisies van dit document.
-
diff --git a/inc/lang/nl/onceexisted.txt b/inc/lang/nl/onceexisted.txt
new file mode 100644
index 000000000..4669563e0
--- /dev/null
+++ b/inc/lang/nl/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Deze pagina bestaat niet meer ======
+
+Je hebt een link gevolgd naar een pagina die niet meer bestaat. Je kunt de lijst met [[?do=revisions|Oude revisies]] bekijken om te zien wanneer en waarom de pagina was verwijderd, oude versies te bekijken en om deze te herstellen. \ No newline at end of file
diff --git a/inc/lang/nl/preview.txt b/inc/lang/nl/preview.txt
index 4d2927aff..4ce0b2b8b 100644
--- a/inc/lang/nl/preview.txt
+++ b/inc/lang/nl/preview.txt
@@ -1,4 +1,3 @@
====== Preview ======
-Dit is een preview van de tekst zoals hij er uit komt te zien. Let op: het is nog **niet opgeslagen!**
-
+Dit is een preview van de tekst zoals hij er uit komt te zien. **Let op: het is nog niet opgeslagen**!
diff --git a/inc/lang/nl/read.txt b/inc/lang/nl/read.txt
index 2a9bb9a93..329143a01 100644
--- a/inc/lang/nl/read.txt
+++ b/inc/lang/nl/read.txt
@@ -1,2 +1 @@
Deze pagina is alleen-lezen. Je kan de broncode bekijken maar niet veranderen. Neem contact op met de beheerder als je denkt dat dit niet klopt.
-
diff --git a/inc/lang/nl/recent.txt b/inc/lang/nl/recent.txt
index 4b507f2ca..456f91716 100644
--- a/inc/lang/nl/recent.txt
+++ b/inc/lang/nl/recent.txt
@@ -1,3 +1,3 @@
====== Recente wijzigingen ======
-De volgende pagina's zijn recent aangepast.
+De volgende pagina's zijn recent aangepast:
diff --git a/inc/lang/nl/register.txt b/inc/lang/nl/register.txt
index fc31860da..8843d4b67 100644
--- a/inc/lang/nl/register.txt
+++ b/inc/lang/nl/register.txt
@@ -1,4 +1,3 @@
====== 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>pagename|paginanaam]] 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>nl:pagename|paginanaam]] zijn.
diff --git a/inc/lang/nl/resetpwd.txt b/inc/lang/nl/resetpwd.txt
index 345e30725..23c5e9086 100644
--- a/inc/lang/nl/resetpwd.txt
+++ b/inc/lang/nl/resetpwd.txt
@@ -1,3 +1,3 @@
====== Een nieuw wachtwoord instellen ======
-Vul alstublieft een nieuw wachtwoord in voor jouw account in deze wiki. \ No newline at end of file
+Vul alstublieft een nieuw wachtwoord in voor jouw account in deze wiki.
diff --git a/inc/lang/nl/revisions.txt b/inc/lang/nl/revisions.txt
index 7a78917fc..e73c359fc 100644
--- a/inc/lang/nl/revisions.txt
+++ b/inc/lang/nl/revisions.txt
@@ -1,4 +1,3 @@
====== Oude revisies ======
Dit zijn de oude revisies van het document. Om terug te keren naar een oude revisie selecteer je hem hieronder en klik je op de ''Pagina aanpassen'' en vervolgens op ''Opslaan''.
-
diff --git a/inc/lang/nl/searchpage.txt b/inc/lang/nl/searchpage.txt
index b9d123655..7b5e68f1a 100644
--- a/inc/lang/nl/searchpage.txt
+++ b/inc/lang/nl/searchpage.txt
@@ -1,4 +1,3 @@
====== Zoeken ======
Hieronder zijn de resultaten van de zoekopdracht. @CREATEPAGEINFO@
-
diff --git a/inc/lang/nl/stopwords.txt b/inc/lang/nl/stopwords.txt
index 3056c4a70..7a8daabae 100644
--- a/inc/lang/nl/stopwords.txt
+++ b/inc/lang/nl/stopwords.txt
@@ -31,6 +31,7 @@ was
wat
wel
wij
+www
zal
zei
zij
diff --git a/inc/lang/no/backlinks.txt b/inc/lang/no/backlinks.txt
index 2298acc45..100ca143d 100644
--- a/inc/lang/no/backlinks.txt
+++ b/inc/lang/no/backlinks.txt
@@ -1,3 +1,3 @@
====== Tilbakelenker ======
-Dette er en liste over sider som ser ut til å lenke tilbake til denne siden. \ No newline at end of file
+Dette er en liste over sider som ser ut til å lenke tilbake til denne siden.
diff --git a/inc/lang/no/conflict.txt b/inc/lang/no/conflict.txt
index 49961d0df..a7761d4dc 100644
--- a/inc/lang/no/conflict.txt
+++ b/inc/lang/no/conflict.txt
@@ -3,4 +3,3 @@
Det fins en nyere utgave av dokumentet du har redigert. Dette kan skje når en annen bruker redigerer dokumentet samtidig med deg.
Legg nøye merke til forskjellene som vises under, og velg deretter hvilken versjon du vil beholde. Om du velger ''**Lagre**'', så kommer din versjon til å lagres. Velg ''**Avbryt**'' for å beholde den nyeste versjonen (ikke din).
-
diff --git a/inc/lang/no/denied.txt b/inc/lang/no/denied.txt
index f60f48f6b..915561bd7 100644
--- a/inc/lang/no/denied.txt
+++ b/inc/lang/no/denied.txt
@@ -1,4 +1,3 @@
-====== Adgang forbudt ======
-
-Beklager, men du har ikke rettigheter til dette.
+====== Ingen tilgang ======
+Beklager, du har ikke tilgang til denne siden.
diff --git a/inc/lang/no/diff.txt b/inc/lang/no/diff.txt
index e4c2eb080..3101a08d0 100644
--- a/inc/lang/no/diff.txt
+++ b/inc/lang/no/diff.txt
@@ -1,4 +1,3 @@
====== Forskjeller ======
Her vises forskjeller mellom den valgte versjonen og den nåværende versjonen av dokumentet.
-
diff --git a/inc/lang/no/draft.txt b/inc/lang/no/draft.txt
index 8bcea65aa..3296c2241 100644
--- a/inc/lang/no/draft.txt
+++ b/inc/lang/no/draft.txt
@@ -3,4 +3,3 @@
Din siste endring av denne siden ble ikke avsluttet riktig. DokuWiki lagret automatisk en kladd under ditt arbeid som du nå kan bruke for å fortsette redigeringen. Nedenfor kan du se de lagrede data.
Vennligst avgjør om du vil //gjennopprette// din tapte sesjon, //slette// kladden eller //avbryte// redigeringen.
-
diff --git a/inc/lang/no/edit.txt b/inc/lang/no/edit.txt
index bdb3bc854..8c3b5fb6c 100644
--- a/inc/lang/no/edit.txt
+++ b/inc/lang/no/edit.txt
@@ -1,2 +1 @@
Rediger siden og klikk på ''**Lagre**''. Se [[wiki:syntax]] for Wikisyntaks. Rediger siden bare hvis du kan **forbedre** sidens innhold. Hvis du vil teste ut hvordan saker og ting fungerer, kan du gjøre det på [[playground:playground|lekeplassen]].
-
diff --git a/inc/lang/no/index.txt b/inc/lang/no/index.txt
index e2ea95933..edb3c2f8a 100644
--- a/inc/lang/no/index.txt
+++ b/inc/lang/no/index.txt
@@ -1,4 +1,3 @@
====== Indeks ======
-Dette er en fortegnelse over alle tilgjengelige sider, sortert etter [[doku>namespaces|navnerom]].
-
+Dette er en fortegnelse over alle tilgjengelige sider, sortert etter [[doku>no:namespaces|navnerom]].
diff --git a/inc/lang/no/install.html b/inc/lang/no/install.html
index ef3ee2ea6..95f32720b 100644
--- a/inc/lang/no/install.html
+++ b/inc/lang/no/install.html
@@ -1,24 +1,7 @@
-<p>Denne siden assisterer under førstegangs installasjon og konfigurasjon av
-<a href="http://dokuwiki.org">Dokuwiki</a>. Mer informasjon for denne
-installasjonen er tilgjengelig på
-<a href="http://dokuwiki.org/installer">dokumentasjonssiden</a>.</p>
+<p>Denne siden assisterer under førstegangs installasjon og konfigurasjon av <a href="http://dokuwiki.org">Dokuwiki</a>. Mer informasjon for denne installasjonen er tilgjengelig på <a href="http://dokuwiki.org/installer">dokumentasjonssiden</a>.</p>
-<p>DokuWiki bruker vanlige filer for lagring av wikisider og annen
-informasjon assosiert med disse sidene (f.eks. bilder, søkeindekser, eldre
-revisjoner osv.). For å kunne virke <strong>må</strong> DokuWiki
-ha skrivetilgang til de mapper som lagrer disse filene.
-Denne installasjonen kan ikke sette opp mapperettigheter. Det må normalt
-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>DokuWiki bruker vanlige filer for lagring av wikisider og annen informasjon assosiert med disse sidene (f.eks. bilder, søkeindekser, eldre revisjoner osv.). For å kunne virke <strong>må</strong> DokuWiki ha skrivetilgang til de mapper som lagrer disse filene. Denne installasjonen kan ikke sette opp mapperettigheter. Det må normalt 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
-<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 å
-administrere.</p>
+<p>Denne installasjonen vil sette opp din DokuWiki-konfigurasjon for <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 å administrere.</p>
-<p>Erfarne brukere eller brukere med spessielle oppsettingskrav bør se på disse lenkene
-for detaljer rundt
-<a href="http://dokuwiki.org/install">installasjonsinstrukser</a>
-og <a href="http://dokuwiki.org/config">konfigurasjonsinnstillinger</a>.</p>
+<p>Erfarne brukere eller brukere med spessielle oppsettingskrav bør se på disse lenkene for detaljer rundt <a href="http://dokuwiki.org/install">installasjonsinstrukser</a> og <a href="http://dokuwiki.org/config">konfigurasjonsinnstillinger</a>.</p>
diff --git a/inc/lang/no/lang.php b/inc/lang/no/lang.php
index b8d3d3b16..0b4cd8629 100644
--- a/inc/lang/no/lang.php
+++ b/inc/lang/no/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Torgeir Blesvik <bletor@banenor.no>
+ * @author Rut Kristin Aanestad <dark@met.no>
+ * @author ThorPrestboen <thor.erling.prestboen@gmail.com>
+ * @author Christian McKenna <mckchr@banenor.no>
* @author Reidar Mosvold <Reidar.Mosvold@hit.no>
* @author Jorge Barrera Grandon <jorge@digitalwolves.org>
* @author Rune Rasmussen [http://www.syntaxerror.no/]
@@ -15,7 +19,7 @@
* @author Knut Staring <knutst@gmail.com>
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Rune Rasmussen syntaxerror.no@gmail.com
+ * @author Rune Rasmussen <syntaxerror.no@gmail.com>
* @author Jon Bøe <jonmagneboe@hotmail.com>
* @author Egil Hansen <egil@rosetta.no>
* @author Thomas Juberg <Thomas.Juberg@Gmail.com>
@@ -24,7 +28,6 @@
* @author Patrick <spill.p@hotmail.com>
* @author Danny Buckhof <daniel.raknes@hotmail.no>
* @author Arne Hanssen <arne.hanssen@getmail.no>
- * @author Arne Hanssen <arnehans@getmail.no>
* @author Patrick Sletvold <patricksletvold@hotmail.com>
*/
$lang['encoding'] = 'utf-8';
@@ -86,44 +89,8 @@ $lang['badpassconfirm'] = 'Beklager, passordet var feil';
$lang['minoredit'] = 'Mindre endringer';
$lang['draftdate'] = 'Kladd autolagret';
$lang['nosecedit'] = 'Siden er i mellomtiden endret, seksjonsinfo har blitt foreldet - lastet full side istedet.';
-$lang['regmissing'] = 'Vennligst fyll ut alle felt.';
-$lang['reguexists'] = 'Det finnes allerede en konto med dette brukernavnet.';
-$lang['regsuccess'] = 'Brukerkonto har blitt laget og passord har blitt sendt via e-post.';
-$lang['regsuccess2'] = 'Brukeren har blitt laget.';
-$lang['regfail'] = 'Brukeren kan ikke opprettes';
-$lang['regmailfail'] = 'En feil oppstod da passordet ditt skulle sendes via e-post. Vennligst kontakt administratoren!';
-$lang['regbadmail'] = 'Den angitte e-post adressen ser ut til å være ugyldig. Vennligst kontakt administratoren om du anser dette som feilaktig.';
-$lang['regbadpass'] = 'De to angitte passordene er ikke like, vennligst forsøk igjen.';
-$lang['regpwmail'] = 'Ditt DokuWiki passord';
-$lang['reghere'] = 'Har du ikke en konto ennå? Lag deg en';
-$lang['profna'] = 'Denne wikien støtter ikke profilendringer';
-$lang['profnochange'] = 'Ingen endringer, ingenting å gjøre.';
-$lang['profnoempty'] = 'Tomt navn- eller e-postfelt er ikke tillatt.';
-$lang['profchanged'] = 'Brukerprofilen ble vellykket oppdatert.';
-$lang['profnodelete'] = 'Denne wikien støtter ikke sletting av brukere';
-$lang['profdeleteuser'] = 'Slett konto';
-$lang['profdeleted'] = 'Din brukerkonto har blitt slettet fra denne wikien';
-$lang['profconfdelete'] = 'Jeg ønsker å fjerne min konto fra denne wikien. <br/> Denne handlingen kan ikke gjøres om.';
-$lang['profconfdeletemissing'] = 'Boks for bekreftelse ikke avkrysset';
-$lang['proffail'] = 'Brukerprofilen ble ikke oppdatert';
-$lang['pwdforget'] = 'Glemt passordet ditt? Få deg et nytt';
-$lang['resendna'] = 'Denne wikien støtter ikke nyutsending av passord.';
-$lang['resendpwd'] = 'Sett 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.';
-$lang['resendpwdconfirm'] = 'En bekreftelseslenke er blitt sendt på e-post.';
-$lang['resendpwdsuccess'] = 'Ditt nye passord er blitt sendt på e-post.';
-$lang['license'] = 'Der annet ikke er angitt, er innholdet på denne wiki utgitt under følgende lisens:';
-$lang['licenseok'] = 'Merk: Ved å endre på denne siden godtar du at ditt innhold utgis under følgende lisens:';
-$lang['searchmedia'] = 'Søk filnavn';
-$lang['searchmedia_in'] = 'Søk i %s';
-$lang['txt_upload'] = 'Velg fil som skal lastes opp:';
-$lang['txt_filename'] = 'Skriv inn wikinavn (alternativt):';
-$lang['txt_overwrt'] = 'Overskriv eksisterende fil';
-$lang['maxuploadsize'] = 'Opplast maks %s per fil.';
-$lang['lockedby'] = 'Låst av:';
-$lang['lockexpire'] = 'Låsingen utløper:';
+$lang['searchcreatepage'] = 'Hvis du ikke fant det du søkte etter kan du lage eller endre siden %s.';
+$lang['js']['search_toggle_tools'] = 'Søkeverktøy';
$lang['js']['willexpire'] = 'Din redigeringslås for dette dokumentet kommer snart til å utløpe.\nFor å unngå versjonskonflikter bør du forhåndsvise dokumentet ditt for å forlenge redigeringslåsen.';
$lang['js']['notsavedyet'] = 'Ulagrede endringer vil gå tapt!
Vil du fortsette?';
@@ -167,6 +134,49 @@ $lang['js']['media_done_btn'] = 'Ferdig';
$lang['js']['media_drop'] = 'Dra filer hit for å laste dem opp';
$lang['js']['media_cancel'] = 'fjern';
$lang['js']['media_overwrt'] = 'Erstatt eksisterende filer';
+$lang['search_contains'] = 'Inneholder';
+$lang['search_past_7_days'] = 'Sist uke';
+$lang['search_past_month'] = 'Siste måned';
+$lang['search_past_year'] = 'Siste år';
+$lang['search_sort_by_hits'] = 'Sorter etter treff';
+$lang['regmissing'] = 'Vennligst fyll ut alle felt.';
+$lang['reguexists'] = 'Det finnes allerede en konto med dette brukernavnet.';
+$lang['regsuccess'] = 'Brukerkonto har blitt laget og passord har blitt sendt via e-post.';
+$lang['regsuccess2'] = 'Brukeren har blitt laget.';
+$lang['regfail'] = 'Brukeren kan ikke opprettes';
+$lang['regmailfail'] = 'En feil oppstod da passordet ditt skulle sendes via e-post. Vennligst kontakt administratoren!';
+$lang['regbadmail'] = 'Den angitte e-post adressen ser ut til å være ugyldig. Vennligst kontakt administratoren om du anser dette som feilaktig.';
+$lang['regbadpass'] = 'De to angitte passordene er ikke like, vennligst forsøk igjen.';
+$lang['regpwmail'] = 'Ditt DokuWiki passord';
+$lang['reghere'] = 'Har du ikke en konto ennå? Lag deg en';
+$lang['profna'] = 'Denne wikien støtter ikke profilendringer';
+$lang['profnochange'] = 'Ingen endringer, ingenting å gjøre.';
+$lang['profnoempty'] = 'Tomt navn- eller e-postfelt er ikke tillatt.';
+$lang['profchanged'] = 'Brukerprofilen ble vellykket oppdatert.';
+$lang['profnodelete'] = 'Denne wikien støtter ikke sletting av brukere';
+$lang['profdeleteuser'] = 'Slett konto';
+$lang['profdeleted'] = 'Din brukerkonto har blitt slettet fra denne wikien';
+$lang['profconfdelete'] = 'Jeg ønsker å fjerne min konto fra denne wikien. <br/> Denne handlingen kan ikke gjøres om.';
+$lang['profconfdeletemissing'] = 'Boks for bekreftelse ikke avkrysset';
+$lang['proffail'] = 'Brukerprofilen ble ikke oppdatert';
+$lang['pwdforget'] = 'Glemt passordet ditt? Få deg et nytt';
+$lang['resendna'] = 'Denne wikien støtter ikke nyutsending av passord.';
+$lang['resendpwd'] = 'Sett 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.';
+$lang['resendpwdconfirm'] = 'En bekreftelseslenke er blitt sendt på e-post.';
+$lang['resendpwdsuccess'] = 'Ditt nye passord er blitt sendt på e-post.';
+$lang['license'] = 'Der annet ikke er angitt, er innholdet på denne wiki utgitt under følgende lisens:';
+$lang['licenseok'] = 'Merk: Ved å endre på denne siden godtar du at ditt innhold utgis under følgende lisens:';
+$lang['searchmedia'] = 'Søk filnavn';
+$lang['searchmedia_in'] = 'Søk i %s';
+$lang['txt_upload'] = 'Velg fil som skal lastes opp:';
+$lang['txt_filename'] = 'Skriv inn wikinavn (alternativt):';
+$lang['txt_overwrt'] = 'Overskriv eksisterende fil';
+$lang['maxuploadsize'] = 'Opplast maks %s per fil.';
+$lang['lockedby'] = 'Låst av:';
+$lang['lockexpire'] = 'Låsingen utløper:';
$lang['rssfailed'] = 'En feil oppstod da denne kilden skulle hentes:';
$lang['nothingfound'] = 'Ingen data funnet.';
$lang['mediaselect'] = 'Mediefiler';
diff --git a/inc/lang/no/login.txt b/inc/lang/no/login.txt
index 877fff0d8..0c67c7520 100644
--- a/inc/lang/no/login.txt
+++ b/inc/lang/no/login.txt
@@ -1,4 +1,3 @@
====== Logg inn ======
-Du er ikke innlogget! Angi ditt brukernavn og passord nedenfor for å logge inn. Støtte for informasjonskapsler (cockies) må være aktivert i din nettleser for at du skal kunne logge inn.
-
+Du er ikke innlogget! Angi ditt brukernavn og passord nedenfor for å logge inn. Støtte for informasjonskapsler (cookies) må være aktivert i din nettleser for at du skal kunne logge inn.
diff --git a/inc/lang/no/newpage.txt b/inc/lang/no/newpage.txt
index 86cad00ed..0f4ba4e5b 100644
--- a/inc/lang/no/newpage.txt
+++ b/inc/lang/no/newpage.txt
@@ -1,3 +1,3 @@
====== Dette emnet har ikke noe innhold ======
-Du har klikket på en lenke til et emne som ikke finnes ennå. Du kan opprette det ved å klikke på ''**Lag denne siden**''.
+Du har klikket på en lenke til et emne som ikke finnes ennå. Du kan opprette det ved å klikke på **Lag denne siden**.
diff --git a/inc/lang/no/norev.txt b/inc/lang/no/norev.txt
index cc58c99e3..140197610 100644
--- a/inc/lang/no/norev.txt
+++ b/inc/lang/no/norev.txt
@@ -1,4 +1,3 @@
====== Versjonen finnes ikke ======
Den angitte versjonen finnes ikke. Bruk ''**Historikk**'' for en oversikt over de versjoner som finnes av dette dokumentet.
-
diff --git a/inc/lang/no/preview.txt b/inc/lang/no/preview.txt
index 2bed20e86..52501b7aa 100644
--- a/inc/lang/no/preview.txt
+++ b/inc/lang/no/preview.txt
@@ -1,4 +1,3 @@
====== Forhåndsvisning ======
-Dette er en forhåndsvisning av hvordan din tekst kommer til å se ut når den blir vist. Husk at den er **ikke lagret** ennå!
-
+Dette er en forhåndsvisning av hvordan din tekst kommer til å se ut når den blir vist. **Husk at den er ikke lagret ennå**!
diff --git a/inc/lang/no/pwconfirm.txt b/inc/lang/no/pwconfirm.txt
index 29ff6f20d..7134d6650 100644
--- a/inc/lang/no/pwconfirm.txt
+++ b/inc/lang/no/pwconfirm.txt
@@ -1,11 +1,9 @@
Hei @FULLNAME@!
-Noen har bedt om nytt passord for din @TITLE@ innlogging
-på @DOKUWIKIURL@
+Noen har bedt om nytt passord for din @TITLE@ innlogging på @DOKUWIKIURL@
Om du ikke ba om nytt passord kan du bare overse denne e-posten.
-For å bekrefte at forespørselen virkelig kom fra deg kan du bruke
-følgende lenke:
+For å bekrefte at forespørselen virkelig kom fra deg kan du bruke følgende lenke:
@CONFIRM@
diff --git a/inc/lang/no/read.txt b/inc/lang/no/read.txt
index 27fcb5118..1ea8e57d2 100644
--- a/inc/lang/no/read.txt
+++ b/inc/lang/no/read.txt
@@ -1,2 +1 @@
Denne siden er skrivebeskyttet. Du kan se på den, men ikke endre den. Kontakt administratoren hvis du mener at du bør kunne endre siden.
-
diff --git a/inc/lang/no/recent.txt b/inc/lang/no/recent.txt
index 857013c32..88109de3d 100644
--- a/inc/lang/no/recent.txt
+++ b/inc/lang/no/recent.txt
@@ -1,5 +1,3 @@
====== Siste nytt ======
-Følgende sider har nylig blitt oppdatert.
-
-
+Følgende sider har nylig blitt oppdatert:
diff --git a/inc/lang/no/register.txt b/inc/lang/no/register.txt
index 160e47364..b305c7c1d 100644
--- a/inc/lang/no/register.txt
+++ b/inc/lang/no/register.txt
@@ -1,4 +1,3 @@
====== Registrer deg som bruker ======
Angi all informasjon som det blir spurt om nedenfor for å lage en ny brukerkonto for denne wikien. Vær spesielt nøye med å angi en **gyldig e-postadresse** - ditt passord vil bli sendt til den e-postadressen du angir. Brukernavnet må være et gyldig [[doku>pagename|sidenavn]].
-
diff --git a/inc/lang/no/resendpwd.txt b/inc/lang/no/resendpwd.txt
index 315ab81ee..ade0f771a 100644
--- a/inc/lang/no/resendpwd.txt
+++ b/inc/lang/no/resendpwd.txt
@@ -1,4 +1,3 @@
====== Send nytt passord ======
Fyll inn ditt brukernavn i skjema nedenfor for å be om nytt passord for din konto i denne wiki. En bekreftelseslenke vil bli sendt til din e-postadresse.
-
diff --git a/inc/lang/no/resetpwd.txt b/inc/lang/no/resetpwd.txt
index 2da717021..9fb03b99e 100644
--- a/inc/lang/no/resetpwd.txt
+++ b/inc/lang/no/resetpwd.txt
@@ -1,3 +1,3 @@
====== Sett nytt passord ======
-Vennligst skriv inn et nytt passord for din konto i denne wikien. \ No newline at end of file
+Vennligst skriv inn et nytt passord for din konto i denne wikien.
diff --git a/inc/lang/no/revisions.txt b/inc/lang/no/revisions.txt
index 023fd8dce..82df74ec9 100644
--- a/inc/lang/no/revisions.txt
+++ b/inc/lang/no/revisions.txt
@@ -1,4 +1,3 @@
====== Historikk ======
Her vises tidligere versjoner av dokumentet. For å sette dette dokumentet tilbake til en tidligere versjon kan du velge den ønskede versjonen nedenfor, klikke på **''Rediger denne siden''** og lagre dokumentet.
-
diff --git a/inc/lang/no/searchpage.txt b/inc/lang/no/searchpage.txt
index b8d9f0169..2d764d289 100644
--- a/inc/lang/no/searchpage.txt
+++ b/inc/lang/no/searchpage.txt
@@ -1,4 +1,3 @@
====== Søk ======
Du ser resultatet av dette søket nedenfor. @CREATEPAGEINFO@
-
diff --git a/inc/lang/no/stopwords.txt b/inc/lang/no/stopwords.txt
index 9a4c302d9..d32397fd6 100644
--- a/inc/lang/no/stopwords.txt
+++ b/inc/lang/no/stopwords.txt
@@ -2,67 +2,67 @@
# Når du redigerer siden, pass på å bruke UNIX linjeslutt (enkel ny linje).
# Ord kortere enn 3 bokstaver er automatisk ignorert.
# Listen er basert på http://helmer.aksis.uib.no/nta/ord10000.txt
-i
-og
-det
-er
-på
-til
-som
-en
å
-for
-av
+år
+alle
+andre
at
-har
-med
+av
+bare
+ble
+bli
+blir
+da
de
-ikke
den
-han
-om
+det
+dette
+eller
+en
+enn
+er
et
+etter
+få
+før
+for
fra
-men
-vi
-var
+går
+ha
+hadde
+han
+har
+hun
+i
+ikke
+inn
jeg
-seg
-sier
-vil
kan
-ble
-skal
-etter
+må
+med
+men
+mer
+mot
+nå
+og
også
+om
+opp
+over
+på
-ut
-år
-nå
-da
-dette
-blir
-ved
-mot
-hadde
+seg
+sier
+sin
+skal
+som
+til
to
-hun
-over
+ut
være
-ha
-må
-går
-opp
-få
-andre
-eller
-bare
-sin
-mer
-inn
-før
-bli
vært
-enn
-alle
-www \ No newline at end of file
+var
+ved
+vi
+vil
+www
diff --git a/inc/lang/no/updateprofile.txt b/inc/lang/no/updateprofile.txt
index b2e37e76d..e1349ab13 100644
--- a/inc/lang/no/updateprofile.txt
+++ b/inc/lang/no/updateprofile.txt
@@ -1,5 +1,3 @@
====== Oppdater din brukerprofil ======
Du behøver bare fylle ut de felter du ønsker å endre. Du kan ikke endre brukernavnet ditt.
-
-
diff --git a/inc/lang/oc/admin.txt b/inc/lang/oc/admin.txt
new file mode 100644
index 000000000..d19db36b3
--- /dev/null
+++ b/inc/lang/oc/admin.txt
@@ -0,0 +1,2 @@
+====== Administracion ======
+Çai-jos trobaretz una liste de las tascas administrativas disponiblas dins DokuWiki. \ No newline at end of file
diff --git a/inc/lang/oc/adminplugins.txt b/inc/lang/oc/adminplugins.txt
new file mode 100644
index 000000000..8326fb87c
--- /dev/null
+++ b/inc/lang/oc/adminplugins.txt
@@ -0,0 +1 @@
+===== Extensions suplementàrias ===== \ No newline at end of file
diff --git a/inc/lang/oc/backlinks.txt b/inc/lang/oc/backlinks.txt
new file mode 100644
index 000000000..5c06a2a74
--- /dev/null
+++ b/inc/lang/oc/backlinks.txt
@@ -0,0 +1,2 @@
+====== Ligams de retorn ======
+Aquò es una lista de las paginas que semblan menar a la pagina actuala. \ No newline at end of file
diff --git a/inc/lang/oc/conflict.txt b/inc/lang/oc/conflict.txt
new file mode 100644
index 000000000..1b5cbc978
--- /dev/null
+++ b/inc/lang/oc/conflict.txt
@@ -0,0 +1,4 @@
+====== Una version mai recenta existís ======
+Una version mai recenta del document qu’avètz modificat existís. Aquò arriba quand qualqu’un mai càmbia lo document del temps que lo modificatz.
+
+Examinatz las diferéncias mostradas çai-jos, puèi causissètz la version de gardar. Se causissètz « enregistrar », vòstra version serà enregistrada. Quichatz « anullar » per gardar la version actuala. \ No newline at end of file
diff --git a/inc/lang/oc/denied.txt b/inc/lang/oc/denied.txt
new file mode 100644
index 000000000..58732c998
--- /dev/null
+++ b/inc/lang/oc/denied.txt
@@ -0,0 +1,2 @@
+====== Autorizacion refusada ======
+O planhèm, avètz pas pro de dreches per contunhar. \ No newline at end of file
diff --git a/inc/lang/oc/diff.txt b/inc/lang/oc/diff.txt
new file mode 100644
index 000000000..2c1d3197b
--- /dev/null
+++ b/inc/lang/oc/diff.txt
@@ -0,0 +1,2 @@
+====== Diferéncias ======
+Vaquí las diferéncias entre las doas versions de la pagina. \ No newline at end of file
diff --git a/inc/lang/oc/index.txt b/inc/lang/oc/index.txt
new file mode 100644
index 000000000..eaade2168
--- /dev/null
+++ b/inc/lang/oc/index.txt
@@ -0,0 +1,2 @@
+====== Plan del site ======
+Aquò es lo plan del site de totas las paginas disponiblas, triadas per [[doku>namespaces|namespaces]]. \ No newline at end of file
diff --git a/inc/lang/oc/lang.php b/inc/lang/oc/lang.php
new file mode 100644
index 000000000..bd1a57aa3
--- /dev/null
+++ b/inc/lang/oc/lang.php
@@ -0,0 +1,226 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author En Matt <heartattack@free.fr>
+ * @author Quenti <pages_quentin@hotmail.com>
+ */
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['doublequoteopening'] = '«';
+$lang['doublequoteclosing'] = '»';
+$lang['singlequoteopening'] = '’';
+$lang['singlequoteclosing'] = '’';
+$lang['apostrophe'] = '’';
+$lang['btn_edit'] = 'Modificar aquesta pagina';
+$lang['btn_source'] = 'Mostrar lo còdi font';
+$lang['btn_show'] = 'Mostrar la pagina';
+$lang['btn_create'] = 'Crear aquesta pagina';
+$lang['btn_search'] = 'Cercar';
+$lang['btn_save'] = 'Salvar';
+$lang['btn_preview'] = 'Apercebut';
+$lang['btn_top'] = 'Tornar amont';
+$lang['btn_newer'] = '<< mai recents';
+$lang['btn_older'] = 'mens recents >>';
+$lang['btn_revs'] = 'Ancianas versions';
+$lang['btn_recent'] = 'Cambiaments recents';
+$lang['btn_upload'] = 'Actualizar';
+$lang['btn_cancel'] = 'Anullar';
+$lang['btn_index'] = 'Plan del site';
+$lang['btn_secedit'] = 'Modificar';
+$lang['btn_login'] = 'Connexion';
+$lang['btn_logout'] = 'Desconnexion';
+$lang['btn_admin'] = 'Admin';
+$lang['btn_update'] = 'Actualizar';
+$lang['btn_delete'] = 'Suprimir';
+$lang['btn_back'] = 'Tornar';
+$lang['btn_backlink'] = 'Ligams de retorn';
+$lang['btn_subscribe'] = 'Gerir los abonaments';
+$lang['btn_profile'] = 'Actualizar lo perfil';
+$lang['btn_reset'] = 'Reïnicializar';
+$lang['btn_resendpwd'] = 'Definir un novèl senhal';
+$lang['btn_draft'] = 'Modificar lo borrolhon';
+$lang['btn_recover'] = 'Restablir lo borrolhon';
+$lang['btn_draftdel'] = 'Suprimir lo borrolhon';
+$lang['btn_revert'] = 'Restablir';
+$lang['btn_register'] = 'Se marcar';
+$lang['btn_apply'] = 'Aplicar';
+$lang['btn_media'] = 'Gestion dels mèdias';
+$lang['btn_deleteuser'] = 'Tirar mon compte';
+$lang['btn_img_backto'] = 'Tornar a %s';
+$lang['btn_mediaManager'] = 'Veire dins lo gestionari de mèdias';
+$lang['loggedinas'] = 'Session a';
+$lang['user'] = 'Nom d\'utilizaire';
+$lang['pass'] = 'Senhal';
+$lang['newpass'] = 'Noù senhal';
+$lang['oldpass'] = 'Confirmatz lo senhal actual';
+$lang['passchk'] = 'tornamai';
+$lang['remember'] = 'Se remembrar de ieu';
+$lang['fullname'] = 'Nom vertadièr';
+$lang['email'] = 'Corrièl';
+$lang['profile'] = 'Perfil d\'utilizaire';
+$lang['badlogin'] = 'Lo nom d\'utilizaire o lo senhal es incorrècte.';
+$lang['badpassconfirm'] = 'Lo senhal es incorrècte';
+$lang['minoredit'] = 'Cambiaments minors';
+$lang['draftdate'] = 'Salvagarda auto del borrolhon activada';
+$lang['nosecedit'] = 'Aquesta pagina a cambiat d’aquel temps, la seccion info èra pas a jorn, pagina complèta cargada allòc.';
+$lang['searchcreatepage'] = 'S’avètz pas trobat çò que cercàvetz, podètz crear o modificar la pagina %s, nommada segon vòstra requèsta.';
+$lang['search_fullresults'] = 'Resultats tèxte brut';
+$lang['js']['search_toggle_tools'] = 'Mostrar/Amagar las aisinas de recèrca';
+$lang['js']['notsavedyet'] = 'Los cambiaments pas enregistrats seràn perduts.';
+$lang['js']['searchmedia'] = 'Cercar de fichièrs';
+$lang['js']['keepopen'] = 'Gardar la fenèstra dobèrta sus la selecion';
+$lang['js']['hidedetails'] = 'Rescondre los detalhs';
+$lang['js']['mediatitle'] = 'Paramètres del ligam';
+$lang['js']['mediadisplay'] = 'Tipe de ligam';
+$lang['js']['mediaalign'] = 'Alinhament';
+$lang['js']['mediasize'] = 'Talha de l\'imatge';
+$lang['js']['mediatarget'] = 'Cibla del ligam';
+$lang['js']['mediaclose'] = 'Tampar';
+$lang['js']['mediainsert'] = 'Inserir';
+$lang['js']['mediadisplayimg'] = 'Mostrar l\'imatge.';
+$lang['js']['mediadisplaylnk'] = 'Mostrar sol lo ligam.';
+$lang['js']['mediasmall'] = 'Version pichona';
+$lang['js']['mediamedium'] = 'Version mejana';
+$lang['js']['medialarge'] = 'Version bèla';
+$lang['js']['mediaoriginal'] = 'Version originala';
+$lang['js']['medialnk'] = 'Ligam cap a la pagina de detalhs';
+$lang['js']['mediadirect'] = 'Ligam dirècte a l\'originala';
+$lang['js']['medianolnk'] = 'Cap de ligam';
+$lang['js']['medianolink'] = 'Ligar pas l\'imatge';
+$lang['js']['medialeft'] = 'Alinhar los imatges a man drecha';
+$lang['js']['mediaright'] = 'Alinhar los imatges a man esquèrra.';
+$lang['js']['mediacenter'] = 'Alinhar los imatges al centre.';
+$lang['js']['medianoalign'] = 'Cap d’alinament.';
+$lang['js']['linkwiz'] = 'Assistent pels ligams';
+$lang['js']['linkto'] = 'Ligam cap a :';
+$lang['js']['del_confirm'] = 'Volètz vertadièrament suprimir lo(s) item(s) seleccionat(s) ?';
+$lang['js']['restore_confirm'] = 'Volètz vertadièrament restaurar aquesta version ?';
+$lang['js']['media_diff'] = 'Veire las diferéncias :';
+$lang['js']['media_diff_both'] = 'Costat per costat';
+$lang['js']['media_select'] = 'Seleccionar de fichièrs...';
+$lang['js']['media_upload_btn'] = 'Enviar';
+$lang['js']['media_done_btn'] = 'Fach';
+$lang['js']['media_drop'] = 'Pausatz los fichièrs aquí per los mandar';
+$lang['js']['media_cancel'] = 'levar';
+$lang['js']['media_overwrt'] = 'Remplaçar los fichièrs existents';
+$lang['search_exact_match'] = 'Correspondéncia exacta';
+$lang['search_starts_with'] = 'Comença amb';
+$lang['search_ends_with'] = 'Termina amb';
+$lang['search_contains'] = 'Conten';
+$lang['search_past_7_days'] = 'La setmana passada';
+$lang['search_past_month'] = 'Lo mes passat';
+$lang['search_past_year'] = 'L\'an passat';
+$lang['search_sort_by_hits'] = 'Triar per accès';
+$lang['search_sort_by_mtime'] = 'Triar per darrièra modificacion';
+$lang['regmissing'] = 'O planhèm, vos cal garnir totes los camps.';
+$lang['reguexists'] = 'Un utilizaire amb aqueste nom existís ja.';
+$lang['regsuccess'] = 'L’utilizaire es estat creat e lo senhal enviat per corrièl.';
+$lang['regsuccess2'] = 'L’utilizaire es estat creat.';
+$lang['regfail'] = 'L’utilizaire a pas pogut èsser creat.';
+$lang['regbadpass'] = 'Los dos senhals donats correspondon pas, tornatz ensajar.';
+$lang['regpwmail'] = 'Vòstre senhal DokuWiki';
+$lang['reghere'] = 'Avètz pas encara de compte ? Creatz-ne un';
+$lang['profna'] = 'Aqueste wiki permet pas de modificar lo perfil';
+$lang['profnochange'] = 'Cap de cambiament, pas res per far.';
+$lang['profnoempty'] = 'Un nom o corrièl void es pas autorizat.';
+$lang['profchanged'] = 'Perfil utilizaire corrèctament actualizat.';
+$lang['profnodelete'] = 'Aqueste wiki es pas compatible amb la supression dels utilizaires';
+$lang['profdeleteuser'] = 'Suprimir lo compte';
+$lang['profdeleted'] = 'Vòstre compte foguèt suprimit d’aqueste wiki';
+$lang['profconfdelete'] = 'Vòli tirar mon compte d’aqueste wiki. <br/> Aquesta accion pòt pas èsser anullada.';
+$lang['profconfdeletemissing'] = 'La casa de confirmacion es pas causida.';
+$lang['proffail'] = 'Lo perfil de l’utilizaire es pas estat actualizat.';
+$lang['pwdforget'] = 'Avètz oblidat lo senhal ? Demandatz-ne un nòu';
+$lang['resendna'] = 'Aqueste wiki es pas compatible amb las demandas de mandadís de senhal.';
+$lang['resendpwd'] = 'Definir un nòu senhal per';
+$lang['resendpwdmissing'] = 'O planhèm, vos cal garnir totes los camps.';
+$lang['resendpwdnouser'] = 'O planhèm, trobam pas aqueste utilizaire dins nòstra basa de donadas.';
+$lang['resendpwdconfirm'] = 'Avèm enviat un ligam de confirmacion per corrièl.';
+$lang['resendpwdsuccess'] = 'Avèm enviat lo senhal per corrièl.';
+$lang['searchmedia'] = 'Cercar un nom de fichièr :';
+$lang['searchmedia_in'] = 'Cercar dins %s';
+$lang['txt_upload'] = 'Selecionnatz lo fichièr d’enviar :';
+$lang['txt_filename'] = 'Enviar coma (opcional) :';
+$lang['txt_overwrt'] = 'Remplaçar lo fichièr existent';
+$lang['maxuploadsize'] = 'Mandadís max %s per fichièr.';
+$lang['lockedby'] = 'Actualament verrolhat per :';
+$lang['lockexpire'] = 'Lo verrolhatge expira a :';
+$lang['nothingfound'] = 'Pas res es estat trobat.';
+$lang['mediaselect'] = 'Fichièrs mèdias';
+$lang['uploadsucc'] = 'Corrèctament enviat';
+$lang['uploadfail'] = 'Fracàs del mandadís. Benlèu un problèma de permissions ?';
+$lang['uploadwrong'] = 'Mandadís regetat. Aquela extension de fichièr es prohibida ! ';
+$lang['uploadexist'] = 'Lo fichièr existís ja. Pas res fach.';
+$lang['deletesucc'] = 'Lo fichièr « %s » es estat suprimit.';
+$lang['deletefail'] = 'Supression impossibla del fichièr « %s » - verificatz las autorizacions.';
+$lang['mediainuse'] = 'Lo fichièr « %s » es pas estat suprimit - es encara utilizat.';
+$lang['mediafiles'] = 'Fichièrs disponibles dins';
+$lang['accessdenied'] = 'Sètz pas autorizatz a veire aquesta pagina.';
+$lang['mediaview'] = 'Veire lo fichièr d\'origina';
+$lang['mediaroot'] = 'root';
+$lang['reference'] = 'Referéncia per';
+$lang['hits'] = 'Accèsses';
+$lang['toc'] = 'Ensenhador';
+$lang['current'] = 'actuala';
+$lang['yours'] = 'Vòstra version';
+$lang['diff'] = 'Mostrar las diferéncias amb la version actuala';
+$lang['diff_type'] = 'Veire las diferéncias :';
+$lang['diffprevrev'] = 'Revision precedenta';
+$lang['diffnextrev'] = 'Revision seguenta';
+$lang['difflastrev'] = 'Darrièra revision';
+$lang['line'] = 'Linha';
+$lang['youarehere'] = 'Sètz aquí :';
+$lang['lastmod'] = 'Darrièra modification :';
+$lang['by'] = 'per';
+$lang['deleted'] = 'levada';
+$lang['created'] = 'creada';
+$lang['tools'] = 'Aisinas';
+$lang['user_tools'] = 'Aisinas utilizaire';
+$lang['site_tools'] = 'Aisinas site';
+$lang['page_tools'] = 'Aisinas pagina';
+$lang['skip_to_content'] = 'passar al contengut';
+$lang['mail_newpage'] = 'pagina ajustada';
+$lang['mail_changed'] = 'pagina cambiada';
+$lang['mail_new_user'] = 'utilizaire novèl :';
+$lang['mail_upload'] = 'fichièr enviat :';
+$lang['changes_type'] = 'Veire los cambiaments de';
+$lang['pages_changes'] = 'Paginas';
+$lang['media_changes'] = 'Fichièrs mèdia';
+$lang['qb_sig'] = 'Inserir una signatura';
+$lang['metaedit'] = 'Modificar las metadonadas';
+$lang['metasaveok'] = 'Metadonadas enregistradas';
+$lang['img_title'] = 'Títol :';
+$lang['img_date'] = 'Data :';
+$lang['img_fsize'] = 'Talha :';
+$lang['img_format'] = 'Format :';
+$lang['img_camera'] = 'Camèra :';
+$lang['img_keywords'] = 'Mot claus :';
+$lang['img_width'] = 'Largor :';
+$lang['img_height'] = 'Nautor :';
+$lang['i_chooselang'] = 'Causissètz vòstra lenga';
+$lang['i_wikiname'] = 'Nom del wiki';
+$lang['i_policy'] = 'Prima politica d’ACL';
+$lang['i_pol0'] = 'Wiki dubèrt (lectura, escritura, mandadís per totes)';
+$lang['i_pol1'] = 'Wiki public (lectura per totes, escritura e mandadís pels utilizaires marcats)';
+$lang['i_pol2'] = 'Wiki barrat (lectura, escritura, mandadís pels sols utilizaires marcats)';
+$lang['i_allowreg'] = 'Autorizar las inscripcions';
+$lang['i_retry'] = 'Tornar ensajar';
+$lang['years'] = 'fa %d ans';
+$lang['months'] = 'fa %d mese';
+$lang['weeks'] = 'fa %d setmanas';
+$lang['days'] = 'fa %d jorns';
+$lang['hours'] = 'fa %d oras';
+$lang['minutes'] = 'fa %d minutas';
+$lang['seconds'] = 'fa %d segondas';
+$lang['media_uploadtab'] = 'Enviar';
+$lang['media_searchtab'] = 'Cercar';
+$lang['media_file'] = 'Fichièr';
+$lang['media_viewtab'] = 'Veire';
+$lang['media_edittab'] = 'Modificar';
+$lang['media_historytab'] = 'Istoric';
+$lang['media_list_thumbs'] = 'Vinhetas';
+$lang['media_list_rows'] = 'Linhas';
+$lang['media_sort_name'] = 'Nom';
+$lang['media_sort_date'] = 'Data';
diff --git a/inc/lang/pl/admin.txt b/inc/lang/pl/admin.txt
index cea45f9d0..217e7d623 100644
--- a/inc/lang/pl/admin.txt
+++ b/inc/lang/pl/admin.txt
@@ -1,4 +1,3 @@
====== Administracja ======
Czynności administracyjne DokuWiki.
-
diff --git a/inc/lang/pl/backlinks.txt b/inc/lang/pl/backlinks.txt
index 4edccb09b..fcca104e9 100644
--- a/inc/lang/pl/backlinks.txt
+++ b/inc/lang/pl/backlinks.txt
@@ -1,4 +1,3 @@
====== Odnośnik z innych stron ======
Strony zawierające odnośniki do aktualnej strony.
-
diff --git a/inc/lang/pl/conflict.txt b/inc/lang/pl/conflict.txt
index da6f95260..cd5a77483 100644
--- a/inc/lang/pl/conflict.txt
+++ b/inc/lang/pl/conflict.txt
@@ -3,4 +3,3 @@
Istnieje nowsza wersja edytowanej strony. Prawdopodobnie ktoś zmienił tę stronę w trakcie Twojej pracy.
Przeglądnij dokładnie poniższe różnice i zdecyduj, którą wersję zatrzymać. Jeśli naciśniesz ''zapisz'' to Twoja wersja zostanie zapisana. Jeśli naciśniesz ''anuluj'' to zostanie wybrana aktualna wersja strony.
-
diff --git a/inc/lang/pl/denied.txt b/inc/lang/pl/denied.txt
index 2b268b921..fdd9d7b72 100644
--- a/inc/lang/pl/denied.txt
+++ b/inc/lang/pl/denied.txt
@@ -1,4 +1,3 @@
====== Brak dostępu ======
Nie masz wystarczających uprawnień.
-
diff --git a/inc/lang/pl/diff.txt b/inc/lang/pl/diff.txt
index 2c896ddb3..b3d160a4e 100644
--- a/inc/lang/pl/diff.txt
+++ b/inc/lang/pl/diff.txt
@@ -1,4 +1,3 @@
====== Różnice ======
Różnice między wybraną wersją a wersją aktualną.
-
diff --git a/inc/lang/pl/draft.txt b/inc/lang/pl/draft.txt
index 4036c3079..64b9e8c3c 100644
--- a/inc/lang/pl/draft.txt
+++ b/inc/lang/pl/draft.txt
@@ -3,4 +3,3 @@
Twoja ostatnia sesja edycji nie została poprawnie zakończona. DokuWiki automatycznie zachowało szkic strony podczas Twojej pracy abyś mógł (mogła) ją dokończyć. Poniżej możesz zobaczyć co zostało zapisane w czasie ostatnie sesji.
Zdecyduj czy chcesz //przywrócić// ostatnią sesję, //usunąć// ją lub //anulować//.
-
diff --git a/inc/lang/pl/edit.txt b/inc/lang/pl/edit.txt
index abb20ae1c..050b8ec12 100644
--- a/inc/lang/pl/edit.txt
+++ b/inc/lang/pl/edit.txt
@@ -1,4 +1 @@
-Zredaguj tę stronę i naciśnij ''zapisz''.
-
-Na stronie ze [[wiki:syntax|składnią]] znajdziesz opis znaczników wiki. Jeśli chcesz poćwiczyć zajrzyj do [[playground:playground|piaskownicy]].
-
+Zredaguj tę stronę i naciśnij ''zapisz''. Na stronie ze [[wiki:syntax|składnią]] znajdziesz opis znaczników wiki. Jeśli chcesz poćwiczyć zajrzyj do [[playground:playground|piaskownicy]].
diff --git a/inc/lang/pl/index.txt b/inc/lang/pl/index.txt
index 1d3fd27f6..ebba0b6eb 100644
--- a/inc/lang/pl/index.txt
+++ b/inc/lang/pl/index.txt
@@ -1,4 +1,3 @@
====== Indeks ======
-Indeks wszystkich dostępnych stron pogrupowany według [[doku>namespaces|katalogów]].
-
+Indeks wszystkich dostępnych stron pogrupowany według [[doku>pl:namespaces|katalogów]].
diff --git a/inc/lang/pl/install.html b/inc/lang/pl/install.html
index 01405e6c0..05daaa9ef 100644
--- a/inc/lang/pl/install.html
+++ b/inc/lang/pl/install.html
@@ -1,23 +1,7 @@
-<p>Ta strona ma na celu pomóc Ci w instalacji i konfiguracji
-<a href="http://dokuwiki.org">Dokuwiki</a>.
-Więcej informacji o instalatorze znajdziesz w
-<a href="http://dokuwiki.org/installer">dokumentacji instalatora</a>.</p>
+<p>Ta strona ma na celu pomóc Ci w instalacji i konfiguracji <a href="http://dokuwiki.org">Dokuwiki</a>. Więcej informacji o instalatorze znajdziesz w <a href="http://dokuwiki.org/installer">dokumentacji instalatora</a>.</p>
-<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>
-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
-lub panelu kontrolnego Twojego dostawcy usług serwerowych.</p>
+<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> 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 lub panelu kontrolnego Twojego dostawcy usług serwerowych.</p>
-<p>Instalator pomoże Ci w konfiguracji uprawnień
-<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>Instalator pomoże Ci w konfiguracji uprawnień <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
-<a href="http://dokuwiki.org/install">instrukcją instalacji</a>
-oraz <a href="http://dokuwiki.org/config">instrukcją konfiguracji</a>.</p>
+<p>Zaawansowani użytkownicy lub użytkownicy mający specjalne wymagania powinni zapoznać się z <a href="http://dokuwiki.org/pl:install">instrukcją instalacji</a> oraz <a href="http://dokuwiki.org/pl:config">instrukcją konfiguracji</a>.</p>
diff --git a/inc/lang/pl/lang.php b/inc/lang/pl/lang.php
index f8e3fe83b..49ee3e796 100644
--- a/inc/lang/pl/lang.php
+++ b/inc/lang/pl/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Bartek S <sadupl@gmail.com>
+ * @author Przemek <p_kudriawcew@o2.pl>
* @author Wojciech Lichota <wojciech@lichota.pl>
* @author Max <maxrb146@gmail.com>
* @author Grzegorz Żur <grzegorz.zur@gmail.com>
@@ -81,44 +83,9 @@ $lang['badpassconfirm'] = 'Niestety, hasło jest niepoprawne.';
$lang['minoredit'] = 'Mniejsze zmiany';
$lang['draftdate'] = 'Czas zachowania szkicu';
$lang['nosecedit'] = 'Strona została zmodyfikowana, sekcje zostały zmienione. Załadowano całą stronę.';
-$lang['regmissing'] = 'Wypełnij wszystkie pola.';
-$lang['reguexists'] = 'Użytkownik o tej nazwie już istnieje.';
-$lang['regsuccess'] = 'Utworzono użytkownika. Hasło zostało przesłane pocztą.';
-$lang['regsuccess2'] = 'Utworzono użytkownika.';
-$lang['regfail'] = 'Użytkownik nie mógł zostać utworzony.';
-$lang['regmailfail'] = 'Wystąpił błąd przy wysyłaniu hasła pocztą!';
-$lang['regbadmail'] = 'Adres e-mail jest nieprawidłowy!';
-$lang['regbadpass'] = 'Hasła nie są identyczne, spróbuj ponownie.';
-$lang['regpwmail'] = 'Twoje hasło do DokuWiki';
-$lang['reghere'] = 'Nie masz jeszcze konta? Zdobądź je';
-$lang['profna'] = 'To wiki nie pozwala na zmianę profilu.';
-$lang['profnochange'] = 'Żadnych zmian, nic do zrobienia.';
-$lang['profnoempty'] = 'Pusta nazwa lub adres e-mail nie dozwolone.';
-$lang['profchanged'] = 'Zaktualizowano profil użytkownika.';
-$lang['profnodelete'] = 'Ta wiki nie umożliwia usuwania użytkowników';
-$lang['profdeleteuser'] = 'Usuń konto';
-$lang['profdeleted'] = 'Twoje konto zostało usunięte z tej wiki';
-$lang['profconfdelete'] = 'Chcę usunąć moje konto z tej wiki. <br/> Decyzja nie może być cofnięta.';
-$lang['profconfdeletemissing'] = 'Pole potwierdzenia nie zostało zaznaczone';
-$lang['proffail'] = 'Profil użytkownika nie został uaktualniony.';
-$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'] = '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.';
-$lang['resendpwdconfirm'] = 'Prośba o potwierdzenie została przesłana pocztą.';
-$lang['resendpwdsuccess'] = 'Nowe hasło zostało wysłane pocztą.';
-$lang['license'] = 'Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji:';
-$lang['licenseok'] = 'Uwaga: edytując tę stronę zgadzasz się na publikowanie jej treści pod licencją:';
-$lang['searchmedia'] = 'Szukaj pliku o nazwie:';
-$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['searchcreatepage'] = 'Jeżeli nie znalazłeś tego czego szukałeś możesz stworzyć lub edytować stronę %s, nazwaną tak jak twoja kwerenda';
+$lang['search_fullresults'] = 'Pokaż więcej wyników';
+$lang['js']['search_toggle_tools'] = 'Przełącz narzędzia wyszukiwania';
$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ę.';
$lang['js']['notsavedyet'] = 'Nie zapisane zmiany zostaną utracone.
Czy na pewno kontynuować?';
@@ -162,6 +129,56 @@ $lang['js']['media_done_btn'] = 'Zrobione';
$lang['js']['media_drop'] = 'Upuść tutaj pliki do przesłania';
$lang['js']['media_cancel'] = 'usuń';
$lang['js']['media_overwrt'] = 'Nadpisz istniejące pliki';
+$lang['search_exact_match'] = 'Dokładne dopasowanie';
+$lang['search_starts_with'] = 'Zaczyna się na';
+$lang['search_ends_with'] = 'Kończy się na';
+$lang['search_contains'] = 'Zwiera';
+$lang['search_custom_match'] = 'Spersonalizowany';
+$lang['search_any_ns'] = 'Jakakolwiek przestrzeń nazw';
+$lang['search_any_time'] = 'Kiedykolwiek';
+$lang['search_past_7_days'] = 'Poprzedni tydzień';
+$lang['search_past_month'] = 'Poprzedni miesiąc';
+$lang['search_past_year'] = 'Poprzedni rok';
+$lang['search_sort_by_hits'] = 'Sortuj według popularności';
+$lang['search_sort_by_mtime'] = 'Sortuj według daty modyfikacji';
+$lang['regmissing'] = 'Wypełnij wszystkie pola.';
+$lang['reguexists'] = 'Użytkownik o tej nazwie już istnieje.';
+$lang['regsuccess'] = 'Utworzono użytkownika. Hasło zostało przesłane pocztą.';
+$lang['regsuccess2'] = 'Utworzono użytkownika.';
+$lang['regfail'] = 'Użytkownik nie mógł zostać utworzony.';
+$lang['regmailfail'] = 'Wystąpił błąd przy wysyłaniu hasła pocztą!';
+$lang['regbadmail'] = 'Adres e-mail jest nieprawidłowy!';
+$lang['regbadpass'] = 'Hasła nie są identyczne, spróbuj ponownie.';
+$lang['regpwmail'] = 'Twoje hasło do DokuWiki';
+$lang['reghere'] = 'Nie masz jeszcze konta? Zdobądź je';
+$lang['profna'] = 'To wiki nie pozwala na zmianę profilu.';
+$lang['profnochange'] = 'Żadnych zmian, nic do zrobienia.';
+$lang['profnoempty'] = 'Pusta nazwa lub adres e-mail nie dozwolone.';
+$lang['profchanged'] = 'Zaktualizowano profil użytkownika.';
+$lang['profnodelete'] = 'Ta wiki nie umożliwia usuwania użytkowników';
+$lang['profdeleteuser'] = 'Usuń konto';
+$lang['profdeleted'] = 'Twoje konto zostało usunięte z tej wiki';
+$lang['profconfdelete'] = 'Chcę usunąć moje konto z tej wiki. <br/> Decyzja nie może być cofnięta.';
+$lang['profconfdeletemissing'] = 'Pole potwierdzenia nie zostało zaznaczone';
+$lang['proffail'] = 'Profil użytkownika nie został uaktualniony.';
+$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'] = '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.';
+$lang['resendpwdconfirm'] = 'Prośba o potwierdzenie została przesłana pocztą.';
+$lang['resendpwdsuccess'] = 'Nowe hasło zostało wysłane pocztą.';
+$lang['license'] = 'Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji:';
+$lang['licenseok'] = 'Uwaga: edytując tę stronę zgadzasz się na publikowanie jej treści pod licencją:';
+$lang['searchmedia'] = 'Szukaj pliku o nazwie:';
+$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['rssfailed'] = 'Wystąpił błąd przy pobieraniu tych danych: ';
$lang['nothingfound'] = 'Nic nie znaleziono.';
$lang['mediaselect'] = 'Wysyłanie pliku';
diff --git a/inc/lang/pl/login.txt b/inc/lang/pl/login.txt
index b60427f4f..14220c452 100644
--- a/inc/lang/pl/login.txt
+++ b/inc/lang/pl/login.txt
@@ -1,4 +1,3 @@
====== Logowanie ======
Wprowadź nazwę użytkownika i hasło aby się zalogować. Twoja przeglądarka musi mieć włączoną obsługę ciasteczek (cookies).
-
diff --git a/inc/lang/pl/newpage.txt b/inc/lang/pl/newpage.txt
index 532d3f4ab..6fd16c03a 100644
--- a/inc/lang/pl/newpage.txt
+++ b/inc/lang/pl/newpage.txt
@@ -1,4 +1,3 @@
====== Ta strona jeszcze nie istnieje ======
-Jesteś na stronie, która jeszcze nie istnieje. Jeśli masz wystarczające uprawnienia, możesz utworzyć tę stronę klikając ''utwórz stronę''.
-
+Jesteś na stronie, która jeszcze nie istnieje. Jeśli masz wystarczające uprawnienia, możesz utworzyć tę stronę klikając **utwórz stronę**.
diff --git a/inc/lang/pl/norev.txt b/inc/lang/pl/norev.txt
index 858e4a881..7226d31b3 100644
--- a/inc/lang/pl/norev.txt
+++ b/inc/lang/pl/norev.txt
@@ -1,4 +1,3 @@
====== Nie ma takiej wersji ======
Nie ma takiej wersji. Kliknij przycisk ''poprzednie wersje'', aby wyświetlić listę wszystkich wersji tej strony.
-
diff --git a/inc/lang/pl/onceexisted.txt b/inc/lang/pl/onceexisted.txt
new file mode 100644
index 000000000..605a76cc0
--- /dev/null
+++ b/inc/lang/pl/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Ta strona już nie istnieje ======
+
+Wybrałeś odnośnik do strony która już nie instnieję, Możesz sprawdzić listę [[?do=revisions|old revisions]] aby sprawdzić kiedy i dlaczego strona została usunięta. Masz również możliwość dostępu do starej wersji strony i przywrócenia jej \ No newline at end of file
diff --git a/inc/lang/pl/preview.txt b/inc/lang/pl/preview.txt
index 41a123cf3..4fa91013b 100644
--- a/inc/lang/pl/preview.txt
+++ b/inc/lang/pl/preview.txt
@@ -1,4 +1,3 @@
====== Podgląd ======
-To jest podgląd edytowanej strony. Pamiętaj, że ta strona **nie** jest jeszcze zapisana!
-
+To jest podgląd edytowanej strony. **Pamiętaj, że ta strona nie jest jeszcze zapisana**!
diff --git a/inc/lang/pl/read.txt b/inc/lang/pl/read.txt
index 5f89fd93d..754dfa846 100644
--- a/inc/lang/pl/read.txt
+++ b/inc/lang/pl/read.txt
@@ -1,2 +1 @@
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
-
diff --git a/inc/lang/pl/recent.txt b/inc/lang/pl/recent.txt
index 65a776c0e..95eb8051a 100644
--- a/inc/lang/pl/recent.txt
+++ b/inc/lang/pl/recent.txt
@@ -1,5 +1,3 @@
====== Ostatnie zmiany ======
-Ostatnio zmienione strony.
-
-
+Ostatnio zmienione strony:
diff --git a/inc/lang/pl/register.txt b/inc/lang/pl/register.txt
index 91b761d15..65a2a9914 100644
--- a/inc/lang/pl/register.txt
+++ b/inc/lang/pl/register.txt
@@ -1,4 +1,3 @@
====== Rejestracja nowego użytkownika ======
-Wypełnij wszystkie pola formularza aby utworzyć nowe konto w tym wiki. Pamiętaj, żeby podać **poprawny adres e-mail**, ponieważ nowe hasło może zostać do Ciebie przesłane pocztą. Nazwa użytkownika powinna być zgodna z formatem [[doku>pagename|nazw stron]].
-
+Wypełnij wszystkie pola formularza aby utworzyć nowe konto w tym wiki. Pamiętaj, żeby podać **poprawny adres e-mail**, ponieważ nowe hasło może zostać do Ciebie przesłane pocztą. Nazwa użytkownika powinna być zgodna z formatem [[doku>pl:pagename|nazw stron]].
diff --git a/inc/lang/pl/resendpwd.txt b/inc/lang/pl/resendpwd.txt
index a7cac7442..90f7391b3 100644
--- a/inc/lang/pl/resendpwd.txt
+++ b/inc/lang/pl/resendpwd.txt
@@ -1,4 +1,3 @@
====== Przesyłanie nowego hasła ======
Aby otrzymać nowe hasło, podaj nazwę Twojego konta w tym wiki. Prośba o potwierdzenie w postaci odnośnika zostanie Ci przesłana pocztą elektroniczną.
-
diff --git a/inc/lang/pl/resetpwd.txt b/inc/lang/pl/resetpwd.txt
index 64d2d7d47..32647fe0a 100644
--- a/inc/lang/pl/resetpwd.txt
+++ b/inc/lang/pl/resetpwd.txt
@@ -1,3 +1,3 @@
====== Ustalenie nowego hasła ======
-Podaj, proszę, nowe hasło do Twojego konta w tym wiki. \ No newline at end of file
+Podaj, proszę, nowe hasło do Twojego konta w tym wiki.
diff --git a/inc/lang/pl/revisions.txt b/inc/lang/pl/revisions.txt
index afe2b6478..761eb6801 100644
--- a/inc/lang/pl/revisions.txt
+++ b/inc/lang/pl/revisions.txt
@@ -1,4 +1,3 @@
====== Poprzednie wersje ======
Poprzednie wersje tej strony. Aby przywrócić poprzednią wersję wybierz ją, rozpocznij edycję a potem zapisz.
-
diff --git a/inc/lang/pl/searchpage.txt b/inc/lang/pl/searchpage.txt
index 70e1de649..beb59b256 100644
--- a/inc/lang/pl/searchpage.txt
+++ b/inc/lang/pl/searchpage.txt
@@ -1,4 +1,3 @@
====== Wyszukiwanie ======
Wyniki wyszukiwania. @CREATEPAGEINFO@
-
diff --git a/inc/lang/pl/stopwords.txt b/inc/lang/pl/stopwords.txt
index f1d244a26..f0f50c11f 100644
--- a/inc/lang/pl/stopwords.txt
+++ b/inc/lang/pl/stopwords.txt
@@ -85,5 +85,6 @@ więc
wszystkich
wszystkim
wszystko
+www
właśnie
zawsze
diff --git a/inc/lang/pl/updateprofile.txt b/inc/lang/pl/updateprofile.txt
index aa80f4cdf..5336a834a 100644
--- a/inc/lang/pl/updateprofile.txt
+++ b/inc/lang/pl/updateprofile.txt
@@ -1,5 +1,3 @@
====== Aktualizacja profilu użytkownika ======
Wystarczy, że wypełnisz tylko te pola, które chcesz zmienić. Nie możesz zmienić nazwy użytkownika.
-
-
diff --git a/inc/lang/pt-br/admin.txt b/inc/lang/pt-br/admin.txt
index f8be56e60..0e14fbb6a 100644
--- a/inc/lang/pt-br/admin.txt
+++ b/inc/lang/pt-br/admin.txt
@@ -1,4 +1,3 @@
====== Administração ======
Abaixo você encontra uma lista das tarefas administrativas disponíveis no DokuWiki.
-
diff --git a/inc/lang/pt-br/backlinks.txt b/inc/lang/pt-br/backlinks.txt
index fce9dba54..5f84e7815 100644
--- a/inc/lang/pt-br/backlinks.txt
+++ b/inc/lang/pt-br/backlinks.txt
@@ -1,4 +1,3 @@
====== Links reversos ======
Esta é uma lista de todas as páginas que apresentam links para a página atual.
-
diff --git a/inc/lang/pt-br/denied.txt b/inc/lang/pt-br/denied.txt
index 9a71df619..1c1738020 100644
--- a/inc/lang/pt-br/denied.txt
+++ b/inc/lang/pt-br/denied.txt
@@ -1,4 +1,3 @@
====== Permissão Negada ======
Desculpe, você não tem permissões suficientes para continuar.
-
diff --git a/inc/lang/pt-br/draft.txt b/inc/lang/pt-br/draft.txt
index b3d345cca..60926a0e2 100644
--- a/inc/lang/pt-br/draft.txt
+++ b/inc/lang/pt-br/draft.txt
@@ -2,4 +2,4 @@
A sua última sessão de edição não foi concluída corretamente. O DokuWiki automaticamente salvou um rascunho durante o seu trabalho, que você pode usar agora para continuar a sua edição. Abaixo você pode ver os dados que foram salvos na sua última sessão.
-Por favor, escolha se você quer //recuperar// sua sessão de edição perdida, //excluir// o rascunho salvo automaticamente ou //cancelar// o processo de edição. \ No newline at end of file
+Por favor, escolha se você quer //recuperar// sua sessão de edição perdida, //excluir// o rascunho salvo automaticamente ou //cancelar// o processo de edição.
diff --git a/inc/lang/pt-br/edit.txt b/inc/lang/pt-br/edit.txt
index 113fb8ede..53708f986 100644
--- a/inc/lang/pt-br/edit.txt
+++ b/inc/lang/pt-br/edit.txt
@@ -1,2 +1 @@
Edite a página e clique em ''Salvar''. Veja [[wiki:syntax|aqui]] a sintaxe do Wiki. Por favor, edite a página apenas se você puder **aprimorá-la**. Se você deseja testar alguma coisa, faça-o no [[playground:playground|playground]].
-
diff --git a/inc/lang/pt-br/editrev.txt b/inc/lang/pt-br/editrev.txt
index df6413525..2926ce03c 100644
--- a/inc/lang/pt-br/editrev.txt
+++ b/inc/lang/pt-br/editrev.txt
@@ -1,4 +1,2 @@
**Você carregou uma revisão antiga desse documento!** Se você salvá-la, irá criar uma nova versão com esses dados.
----
-
-
diff --git a/inc/lang/pt-br/index.txt b/inc/lang/pt-br/index.txt
index 816a49952..ea8fee137 100644
--- a/inc/lang/pt-br/index.txt
+++ b/inc/lang/pt-br/index.txt
@@ -1,3 +1,3 @@
====== Índice ======
-Esse é um índice de todas as páginas disponíveis, ordenadas por [[doku>namespaces|domínios]]. \ No newline at end of file
+Esse é um índice de todas as páginas disponíveis, ordenadas por [[doku>pt-br:namespaces|domínios]].
diff --git a/inc/lang/pt-br/install.html b/inc/lang/pt-br/install.html
index d1b786939..3e7954faa 100644
--- a/inc/lang/pt-br/install.html
+++ b/inc/lang/pt-br/install.html
@@ -4,4 +4,4 @@
<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
+<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/pt-br:install">instalação</a> e da <a href="http://dokuwiki.org/config">configuração</a>.</p>
diff --git a/inc/lang/pt-br/lang.php b/inc/lang/pt-br/lang.php
index f671f9c68..d851a6f45 100644
--- a/inc/lang/pt-br/lang.php
+++ b/inc/lang/pt-br/lang.php
@@ -3,7 +3,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Davi Jorge <davimoises2015@hotmail.com>
+ * @author Schopf <pschopf@gmail.com>
* @author Frederico Gonçalves Guimarães <frederico@teia.bio.br>
+ * @author Márcio Gomes Gonçalves <gomes@metha.com.br>
* @author Luis Fernando Enciso <lfenciso@certto.com.br>
* @author Alauton/Loug
* @author Felipe Castro <fefcas@gmail.com>
@@ -84,44 +88,9 @@ $lang['badpassconfirm'] = 'Desculpe, mas a senha está errada ';
$lang['minoredit'] = 'Alterações mínimas';
$lang['draftdate'] = 'O rascunho foi salvo automaticamente em';
$lang['nosecedit'] = 'A página foi modificada nesse intervalo de tempo. Como a informação da seção estava desatualizada, foi carregada a página inteira.';
-$lang['regmissing'] = 'Desculpe, mas você precisa preencher todos os campos.';
-$lang['reguexists'] = 'Desculpe, mas já existe um usuário com esse nome.';
-$lang['regsuccess'] = 'O usuário foi criado e a senha enviada para seu e-mail.';
-$lang['regsuccess2'] = 'O usuário foi criado.';
-$lang['regfail'] = 'Não foi possível criar esse usuário.';
-$lang['regmailfail'] = 'Aparentemente ocorreu um erro no envio da senha. Por favor, entre em contato com o administrador!';
-$lang['regbadmail'] = 'O endereço de e-mail fornecido é, aparentemente, inválido - se você acha que isso é um erro, entre em contato com o administrador';
-$lang['regbadpass'] = 'As senhas digitadas não são idênticas. Por favor, tente novamente.';
-$lang['regpwmail'] = 'A sua senha do DokuWiki';
-$lang['reghere'] = 'Ainda não tem uma conta? Crie uma';
-$lang['profna'] = 'Esse wiki não suporta modificações do perfil.';
-$lang['profnochange'] = 'Sem alterações, nada para fazer.';
-$lang['profnoempty'] = 'Não são permitidos nomes ou endereços de e-mail em branco.';
-$lang['profchanged'] = 'O perfil do usuário foi atualizado com sucesso.';
-$lang['profnodelete'] = 'Esse wiki não suporta a exclusão de usuários ';
-$lang['profdeleteuser'] = 'Excluir a conta';
-$lang['profdeleted'] = 'Sua conta de usuário foi excluída desse wiki';
-$lang['profconfdelete'] = 'Eu desejo remover minha conta dessa wiki. <br/> Essa ação não pode ser desfeita.';
-$lang['profconfdeletemissing'] = 'Caixa de confirmação não marcada';
-$lang['proffail'] = 'O perfil do usuário não foi atualizado.';
-$lang['pwdforget'] = 'Esqueceu sua senha? Solicite outra';
-$lang['resendna'] = 'Esse wiki não tem suporte para o reenvio de senhas.';
-$lang['resendpwd'] = 'Definir 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.';
-$lang['resendpwdconfirm'] = 'Um link de confirmação foi enviado por e-mail.';
-$lang['resendpwdsuccess'] = 'Sua nova senha foi enviada por e-mail.';
-$lang['license'] = 'Exceto onde for informado ao contrário, o conteúdo neste wiki está sob a seguinte licença:';
-$lang['licenseok'] = 'Observe: editando esta página você aceita disponibilizar o seu conteúdo sob a seguinte licença:';
-$lang['searchmedia'] = 'Buscar arquivo:';
-$lang['searchmedia_in'] = 'Buscar em %s';
-$lang['txt_upload'] = 'Selecione o arquivo a ser enviado:';
-$lang['txt_filename'] = 'Enviar como (opcional):';
-$lang['txt_overwrt'] = 'Substituir o arquivo existente';
-$lang['maxuploadsize'] = 'Tamanho máximo de %s por arquivo.';
-$lang['lockedby'] = 'Atualmente bloqueada por:';
-$lang['lockexpire'] = 'O bloqueio expira em:';
+$lang['searchcreatepage'] = 'Caso você não encontre o que está procurando, você pode criar ou editar a página %s, que recebeu esse nome após a sua pesquisa.';
+$lang['search_fullresults'] = 'Resultados de texto inteiro';
+$lang['js']['search_toggle_tools'] = 'Alternar as ferramentas de pesquisa';
$lang['js']['willexpire'] = 'O seu bloqueio de edição deste página irá expirar em um minuto.\nPara evitar conflitos de edição, clique no botão de visualização para reiniciar o temporizador de bloqueio.';
$lang['js']['notsavedyet'] = 'As alterações não salvas serão perdidas.
Deseja realmente continuar?';
@@ -165,6 +134,56 @@ $lang['js']['media_done_btn'] = 'Concluído';
$lang['js']['media_drop'] = 'Arraste os arquivos até aqui para enviar';
$lang['js']['media_cancel'] = 'remover';
$lang['js']['media_overwrt'] = 'Sobrescrever arquivos existentes';
+$lang['search_exact_match'] = 'Correspondência exata';
+$lang['search_starts_with'] = 'Começa com';
+$lang['search_ends_with'] = 'Termina com';
+$lang['search_contains'] = 'Contém';
+$lang['search_custom_match'] = 'Personalizar';
+$lang['search_any_ns'] = 'Qualquer espaço de nomes';
+$lang['search_any_time'] = 'Qualquer hora';
+$lang['search_past_7_days'] = 'Semana passada';
+$lang['search_past_month'] = 'Mês passado';
+$lang['search_past_year'] = 'Ano passado';
+$lang['search_sort_by_hits'] = 'Ordenar pelos acertos';
+$lang['search_sort_by_mtime'] = 'Ordenar por última modificação';
+$lang['regmissing'] = 'Desculpe, mas você precisa preencher todos os campos.';
+$lang['reguexists'] = 'Desculpe, mas já existe um usuário com esse nome.';
+$lang['regsuccess'] = 'O usuário foi criado e a senha enviada para seu e-mail.';
+$lang['regsuccess2'] = 'O usuário foi criado.';
+$lang['regfail'] = 'Não foi possível criar esse usuário.';
+$lang['regmailfail'] = 'Aparentemente ocorreu um erro no envio da senha. Por favor, entre em contato com o administrador!';
+$lang['regbadmail'] = 'O endereço de e-mail fornecido é, aparentemente, inválido - se você acha que isso é um erro, entre em contato com o administrador';
+$lang['regbadpass'] = 'As senhas digitadas não são idênticas. Por favor, tente novamente.';
+$lang['regpwmail'] = 'A sua senha do DokuWiki';
+$lang['reghere'] = 'Ainda não tem uma conta? Crie uma';
+$lang['profna'] = 'Esse wiki não suporta modificações do perfil.';
+$lang['profnochange'] = 'Sem alterações, nada para fazer.';
+$lang['profnoempty'] = 'Não são permitidos nomes ou endereços de e-mail em branco.';
+$lang['profchanged'] = 'O perfil do usuário foi atualizado com sucesso.';
+$lang['profnodelete'] = 'Esse wiki não suporta a exclusão de usuários ';
+$lang['profdeleteuser'] = 'Excluir a conta';
+$lang['profdeleted'] = 'Sua conta de usuário foi excluída desse wiki';
+$lang['profconfdelete'] = 'Eu desejo remover minha conta dessa wiki. <br/> Essa ação não pode ser desfeita.';
+$lang['profconfdeletemissing'] = 'Caixa de confirmação não marcada';
+$lang['proffail'] = 'O perfil do usuário não foi atualizado.';
+$lang['pwdforget'] = 'Esqueceu sua senha? Solicite outra';
+$lang['resendna'] = 'Esse wiki não tem suporte para o reenvio de senhas.';
+$lang['resendpwd'] = 'Definir 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.';
+$lang['resendpwdconfirm'] = 'Um link de confirmação foi enviado por e-mail.';
+$lang['resendpwdsuccess'] = 'Sua nova senha foi enviada por e-mail.';
+$lang['license'] = 'Exceto onde for informado ao contrário, o conteúdo neste wiki está sob a seguinte licença:';
+$lang['licenseok'] = 'Observe: editando esta página você aceita disponibilizar o seu conteúdo sob a seguinte licença:';
+$lang['searchmedia'] = 'Buscar arquivo:';
+$lang['searchmedia_in'] = 'Buscar em %s';
+$lang['txt_upload'] = 'Selecione o arquivo a ser enviado:';
+$lang['txt_filename'] = 'Enviar como (opcional):';
+$lang['txt_overwrt'] = 'Substituir o arquivo existente';
+$lang['maxuploadsize'] = 'Tamanho máximo de %s por arquivo.';
+$lang['lockedby'] = 'Atualmente bloqueada por:';
+$lang['lockexpire'] = 'O bloqueio expira em:';
$lang['rssfailed'] = 'Ocorreu um erro durante a atualização dessa fonte: ';
$lang['nothingfound'] = 'Não foi encontrado nada.';
$lang['mediaselect'] = 'Arquivos de mídia';
@@ -299,8 +318,11 @@ $lang['i_problems'] = 'O instalador encontrou alguns problemas, indic
$lang['i_modified'] = 'Por questões de segurança, esse script funcionará apenas em uma instalação nova e não modificada do DokuWiki.
Você pode extrair novamente os arquivos do pacote original ou consultar as <a href="http://dokuwiki.org/install">instruções de instalação do DokuWiki</a>.';
$lang['i_funcna'] = 'A função PHP <code>%s</code> não está disponível. O seu host a mantém desabilitada por algum motivo?';
+$lang['i_disabled'] = 'Foi desativado pelo seu provedor.';
+$lang['i_funcnmail'] = '<b>Nota:</b> A função de correio PHP não está disponível. %s Se permanecer indisponível, você pode instalar o <a href="https://www.dokuwiki.org/plugin:smtp">plugin SMTP</a>.';
$lang['i_phpver'] = 'A sua versão do PHP (<code>%s</code>) é inferior à necessária (<code>%s</code>). Você precisa atualizar a sua instalação do PHP.';
$lang['i_mbfuncoverload'] = 'mbstring.func_overload precisa ser desabilitado no php.ini para executar o DokuWiki';
+$lang['i_urandom'] = 'O DokuWiki não pode criar números criptograficamente seguros para cookies. Você pode verificar as configurações do open_basedir no php.ini para obter o acesso <code> / dev / urandom </code> adequado.';
$lang['i_permfail'] = 'O DokuWiki não tem permissão de escrita em <code>%s</code>. Você precisa corrigir as configurações de permissão nesse diretório!';
$lang['i_confexists'] = '<code>%s</code> já existe';
$lang['i_writeerr'] = 'Não foi possível criar <code>%s</code>. É necessário checar as permissões de arquivos/diretórios e criar o arquivo manualmente.';
@@ -351,6 +373,7 @@ $lang['media_perm_upload'] = 'Desculpe, mas você não tem privilégios sufi
$lang['media_update'] = 'Enviar uma nova versão';
$lang['media_restore'] = 'Restaurar esta versão';
$lang['media_acl_warning'] = 'Essa lista pode não estar completa devido a restrições de ACL e páginas ocultas.';
+$lang['email_fail'] = 'PHP mail () ausente ou desativado. O seguinte email não foi enviado:';
$lang['currentns'] = 'Domínio atual';
$lang['searchresult'] = 'Resultado da Busca';
$lang['plainhtml'] = 'HTML simples';
diff --git a/inc/lang/pt-br/newpage.txt b/inc/lang/pt-br/newpage.txt
index 77ba49fa5..cc2ca5030 100644
--- a/inc/lang/pt-br/newpage.txt
+++ b/inc/lang/pt-br/newpage.txt
@@ -1,3 +1,3 @@
====== Esse tópico ainda não existe ======
-Você clicou em um link para um tópico que ainda não existe. Se for permitido, você poderá criá-lo usando o botão ''Criar essa página''.
+Você clicou em um link para um tópico que ainda não existe. Se for permitido, você poderá criá-lo usando o botão **Criar essa página**.
diff --git a/inc/lang/pt-br/onceexisted.txt b/inc/lang/pt-br/onceexisted.txt
new file mode 100644
index 000000000..aee7ff552
--- /dev/null
+++ b/inc/lang/pt-br/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Esta página não existe mais =======
+
+Você seguiu um link para uma página que não existe mais. Você pode verificar a lista de [[?do=revisions|revisões anteriores]] para verificar quando e porque ela foi excluída, acessar revisões anteriores ou restaurá-la. \ No newline at end of file
diff --git a/inc/lang/pt-br/preview.txt b/inc/lang/pt-br/preview.txt
index efdc8f7f2..ba1efe73e 100644
--- a/inc/lang/pt-br/preview.txt
+++ b/inc/lang/pt-br/preview.txt
@@ -1,3 +1,3 @@
====== Visualização ======
-Essa é uma visualização de como será a aparência do seu texto. Lembre-se: ele ainda **não foi gravado**!
+Essa é uma visualização de como será a aparência do seu texto. **Lembre-se: ele ainda não foi gravado**!
diff --git a/inc/lang/pt-br/recent.txt b/inc/lang/pt-br/recent.txt
index 988f235b4..e9c41638a 100644
--- a/inc/lang/pt-br/recent.txt
+++ b/inc/lang/pt-br/recent.txt
@@ -1,4 +1,3 @@
====== Alterações Recentes ======
-As seguintes páginas foram alteradas recentemente.
-
+As seguintes páginas foram alteradas recentemente:
diff --git a/inc/lang/pt-br/register.txt b/inc/lang/pt-br/register.txt
index 431feca98..b83aa0ad7 100644
--- a/inc/lang/pt-br/register.txt
+++ b/inc/lang/pt-br/register.txt
@@ -1,4 +1,3 @@
====== Registre-se como um novo usuário ======
-Preencha todas as informações abaixo para criar uma nova conta nesse Wiki. Certifique-se de que você forneceu um **endereço de e-mail válido** - se não for pedido que você entre com uma senha aqui, ela será enviada para esse endereço. O nome de usuário deve ser um [[doku>pagename|nome de página]] válido.
-
+Preencha todas as informações abaixo para criar uma nova conta nesse Wiki. Certifique-se de que você forneceu um **endereço de e-mail válido** - se não for pedido que você entre com uma senha aqui, ela será enviada para esse endereço. O nome de usuário deve ser um [[doku>pt-br:pagename|nome de página]] válido.
diff --git a/inc/lang/pt-br/resendpwd.txt b/inc/lang/pt-br/resendpwd.txt
index b74713f0f..4330e0fd6 100644
--- a/inc/lang/pt-br/resendpwd.txt
+++ b/inc/lang/pt-br/resendpwd.txt
@@ -1,3 +1,3 @@
====== Enviar nova senha ======
-Por favor, digite o seu nome de usuário no formulário abaixo para requisitar uma nova senha para a sua conta nesse wiki. O link de confirmação será enviado para o endereço de e-mail que você forneceu. \ No newline at end of file
+Por favor, digite o seu nome de usuário no formulário abaixo para requisitar uma nova senha para a sua conta nesse wiki. O link de confirmação será enviado para o endereço de e-mail que você forneceu.
diff --git a/inc/lang/pt-br/resetpwd.txt b/inc/lang/pt-br/resetpwd.txt
index febb1d6a0..4c403c8c5 100644
--- a/inc/lang/pt-br/resetpwd.txt
+++ b/inc/lang/pt-br/resetpwd.txt
@@ -1,3 +1,3 @@
====== Definir uma nova senha ======
-Por favor, digite uma nova senha para sua conta neste wiki. \ No newline at end of file
+Por favor, digite uma nova senha para sua conta neste wiki.
diff --git a/inc/lang/pt-br/revisions.txt b/inc/lang/pt-br/revisions.txt
index 1c174dcb0..fd2ff7d43 100644
--- a/inc/lang/pt-br/revisions.txt
+++ b/inc/lang/pt-br/revisions.txt
@@ -1,4 +1,3 @@
====== Revisões anteriores ======
Essas são as revisões anteriores desse documento. Para reverter a uma revisão antiga, selecione-a abaixo, clique em ''Editar esta página'' e salve-a.
-
diff --git a/inc/lang/pt-br/searchpage.txt b/inc/lang/pt-br/searchpage.txt
index 2e8dd59aa..fe31dba01 100644
--- a/inc/lang/pt-br/searchpage.txt
+++ b/inc/lang/pt-br/searchpage.txt
@@ -1,4 +1,3 @@
====== Pesquisa ======
Você pode encontrar os resultados da sua pesquisa abaixo. @CREATEPAGEINFO@
-
diff --git a/inc/lang/pt-br/stopwords.txt b/inc/lang/pt-br/stopwords.txt
index c781ffbf2..bad61f218 100644
--- a/inc/lang/pt-br/stopwords.txt
+++ b/inc/lang/pt-br/stopwords.txt
@@ -52,4 +52,4 @@ também
uma
umas
uns
-www \ No newline at end of file
+www
diff --git a/inc/lang/pt-br/updateprofile.txt b/inc/lang/pt-br/updateprofile.txt
index b3f62f396..2a19939f3 100644
--- a/inc/lang/pt-br/updateprofile.txt
+++ b/inc/lang/pt-br/updateprofile.txt
@@ -1,5 +1,3 @@
====== Atualize o perfil da sua conta ======
Você precisa preencher somente os campos que você deseja alterar. Você não pode alterar o seu nome de usuário.
-
-
diff --git a/inc/lang/pt/admin.txt b/inc/lang/pt/admin.txt
index 5b103b38d..4e1ad1b13 100644
--- a/inc/lang/pt/admin.txt
+++ b/inc/lang/pt/admin.txt
@@ -1,3 +1,3 @@
====== Administração ======
-Abaixo pode encontrar uma lista de tarefas de administrativas disponíveis na DokuWiki. \ No newline at end of file
+Abaixo você pode encontrar uma lista de tarefas de administrativas disponíveis no DokuWiki.
diff --git a/inc/lang/pt/adminplugins.txt b/inc/lang/pt/adminplugins.txt
index 259f5ce45..3eac7af53 100644
--- a/inc/lang/pt/adminplugins.txt
+++ b/inc/lang/pt/adminplugins.txt
@@ -1 +1 @@
-===== Extras Adicionais ===== \ No newline at end of file
+===== Plugins Adicionais ===== \ No newline at end of file
diff --git a/inc/lang/pt/backlinks.txt b/inc/lang/pt/backlinks.txt
index 4eb82cb26..fdc8fe867 100644
--- a/inc/lang/pt/backlinks.txt
+++ b/inc/lang/pt/backlinks.txt
@@ -1,4 +1,3 @@
====== Backlinks ======
-Esta é uma lista de páginas que parece que interliga para a página atual.
-
+Esta é uma lista de páginas que parecem interligar de volta para a página atual.
diff --git a/inc/lang/pt/conflict.txt b/inc/lang/pt/conflict.txt
index 49575fdb8..1cd2fcb5d 100644
--- a/inc/lang/pt/conflict.txt
+++ b/inc/lang/pt/conflict.txt
@@ -1,5 +1,5 @@
====== Existe uma versão mais recente ======
-Existe uma versão mais recente do documento editado. Isto acontece quando um outro utilizador alterou o documento enquanto o estava a editar.
+Existe uma versão mais recente do documento editado. Isto acontece quando um outro utilizador alterou o documento enquanto você o editava.
-Analise cuidadosamente as diferenças mostradas abaixo, depois decida qual a versão a manter. Se escolher 'guardar'', a sua versão será guardada. Clique em ''cancelar '' para manter a versão atual.
+Analise cuidadosamente as diferenças mostradas abaixo, depois decida qual a versão manter. Se escolher 'salvar'', a sua versão será salva. Clique em ''cancelar '' para manter a versão atual.
diff --git a/inc/lang/pt/denied.txt b/inc/lang/pt/denied.txt
index f4e8e0114..8b7a3d115 100644
--- a/inc/lang/pt/denied.txt
+++ b/inc/lang/pt/denied.txt
@@ -1,4 +1,3 @@
====== Permissão Negada ======
-Desculpe, não tem direitos suficientes para continuar.
-
+Desculpe, você não tem direitos suficientes para continuar.
diff --git a/inc/lang/pt/diff.txt b/inc/lang/pt/diff.txt
index b73326268..23feb14d0 100644
--- a/inc/lang/pt/diff.txt
+++ b/inc/lang/pt/diff.txt
@@ -1,3 +1,3 @@
====== Diferenças ======
-Esta página mostra as diferenças entre as duas revisões da página. \ No newline at end of file
+Esta página mostra as diferenças entre as duas revisões da página.
diff --git a/inc/lang/pt/draft.txt b/inc/lang/pt/draft.txt
index 1baf95c1c..4aa9556a7 100644
--- a/inc/lang/pt/draft.txt
+++ b/inc/lang/pt/draft.txt
@@ -1,7 +1,5 @@
====== Rascunho encontrado ======
-A sessão referente à última edição desta página não terminou correctamente. Foi guardado automaticamente um rascunho durante a edição que pode ou não usar para continuar a edição. Abaixo pode ver os dados guardados da última sessão.
+A sessão referente à última edição desta página não terminou corretamente. Foi guardado automaticamente um rascunho durante a edição que você pode ou não usar para continuar a edição. Abaixo pode ver os dados guardados da última sessão.
-Por favor, decida se quer **recuperar** os dados guardados, **remover** o rascunho** ou **cancelar** o processo de edição corrente.
-
-----
+Por favor, decida se quer //recuperar// os dados guardados, //remover// o rascunho ou //cancelar// o processo de edição corrente.
diff --git a/inc/lang/pt/edit.txt b/inc/lang/pt/edit.txt
index 2fa596e29..7d455590f 100644
--- a/inc/lang/pt/edit.txt
+++ b/inc/lang/pt/edit.txt
@@ -1,4 +1 @@
-Edite o documento e clique no botão <Gravar>. Reveja a [[wiki:syntax|sintaxe]] das regras de formatação do texto.
-
-Por favor, altere o conteúdo deste documento apenas quando puder **melhorá-lo**.\\ Se pretende testar os seus conhecimentos no uso deste motor Wiki, realize os seus testes no [[playground:playground | Recreio]].
-
+Edite o documento e clique no botão "Salvar". Veja a [[wiki:syntax|sintaxe]] das regras de formatação do texto. Por favor, altere o conteúdo deste documento apenas quando puder **melhorá-lo**. Se pretende testar seus conhecimentos no uso deste motor Wiki, realize os seus testes no [[playground:playground|Recreio]].
diff --git a/inc/lang/pt/editrev.txt b/inc/lang/pt/editrev.txt
index 2c7697b52..7ec25aae1 100644
--- a/inc/lang/pt/editrev.txt
+++ b/inc/lang/pt/editrev.txt
@@ -1 +1,2 @@
-**Carregou uma revisão antiga do documento!** Se a gravar irá criar uma nova versão do documento com este conteúdo, que substituirá a versão actual. \ No newline at end of file
+**Você carregou uma revisão antiga do documento!** Se a salvar irá criar uma nova versão do documento com este conteúdo, que substituirá a versão atual.
+----
diff --git a/inc/lang/pt/index.txt b/inc/lang/pt/index.txt
index 46a807d2d..be624c6fa 100644
--- a/inc/lang/pt/index.txt
+++ b/inc/lang/pt/index.txt
@@ -1,3 +1,3 @@
====== Índice ======
-Este índice mostra todas as páginas disponíveis, agrupadas por [[doku>namespaces|espaço de nome]]. \ No newline at end of file
+Este índice mostra todas as páginas disponíveis, agrupadas por [[doku>namespaces|espaço de nome]].
diff --git a/inc/lang/pt/install.html b/inc/lang/pt/install.html
index 69227bd4e..ecbf105fd 100644
--- a/inc/lang/pt/install.html
+++ b/inc/lang/pt/install.html
@@ -2,7 +2,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
-<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>Este "assistente" vai configurar o DokuWiki com <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
+<p>Utilizadores experiente ou com requisitos especiais devem seguir estes links, que detalham mais em pormenor a<a href="http://dokuwiki.org/pt-br:install">instalação</a> e <a href="http://dokuwiki.org/config">configuração</a> do DokuWiki.</p>
diff --git a/inc/lang/pt/lang.php b/inc/lang/pt/lang.php
index 64c25fa9f..6556d0ce3 100644
--- a/inc/lang/pt/lang.php
+++ b/inc/lang/pt/lang.php
@@ -3,12 +3,16 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
+ * @author Mario AlexandTeixeira dos Santos <masterofclan@gmail.com>
+ * @author Maykon Oliveira <maykonoliveira850@gmail.com>
+ * @author José Vieira <jmsv63@gmail.com>
* @author José Carlos Monteiro <jose.c.monteiro@netcabo.pt>
* @author José Monteiro <Jose.Monteiro@DoWeDo-IT.com>
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
- * @author José Campos zecarlosdecampos@gmail.com
+ * @author José Campos <zecarlosdecampos@gmail.com>
* @author Murilo <muriloricci@hotmail.com>
* @author Paulo Silva <paulotsilva@yahoo.com>
* @author Guido Salatino <guidorafael23@gmail.com>
@@ -29,7 +33,7 @@ $lang['btn_source'] = 'Mostrar página fonte ';
$lang['btn_show'] = 'Mostrar página';
$lang['btn_create'] = 'Criar esta página';
$lang['btn_search'] = 'Pesquisar';
-$lang['btn_save'] = 'Guardar';
+$lang['btn_save'] = 'Salvar';
$lang['btn_preview'] = 'Pré-visualizar';
$lang['btn_top'] = 'Voltar ao topo';
$lang['btn_newer'] = '<< mais recente';
@@ -43,13 +47,13 @@ $lang['btn_secedit'] = 'Editar';
$lang['btn_login'] = 'Iniciar sessão';
$lang['btn_logout'] = 'Terminar sessão';
$lang['btn_admin'] = 'Administrar';
-$lang['btn_update'] = 'Actualizar';
-$lang['btn_delete'] = 'Apagar';
+$lang['btn_update'] = 'Atualizar';
+$lang['btn_delete'] = 'Excluir';
$lang['btn_back'] = 'Voltar';
$lang['btn_backlink'] = 'Backlinks';
-$lang['btn_subscribe'] = 'Subscrever Alterações';
-$lang['btn_profile'] = 'Actualizar Perfil';
-$lang['btn_reset'] = 'Limpar';
+$lang['btn_subscribe'] = 'Gerenciar Subscrições';
+$lang['btn_profile'] = 'Atualizar Perfil';
+$lang['btn_reset'] = 'Redefinir';
$lang['btn_resendpwd'] = 'Definir nova senha';
$lang['btn_draft'] = 'Editar rascunho';
$lang['btn_recover'] = 'Recuperar rascunho';
@@ -57,141 +61,155 @@ $lang['btn_draftdel'] = 'Apagar rascunho';
$lang['btn_revert'] = 'Restaurar';
$lang['btn_register'] = 'Registar';
$lang['btn_apply'] = 'Aplicar';
-$lang['btn_media'] = 'Gestor de Media';
-$lang['btn_deleteuser'] = 'Remover a Minha Conta';
+$lang['btn_media'] = 'Gerenciador de Mídia';
+$lang['btn_deleteuser'] = 'Remover Minha Conta';
$lang['btn_img_backto'] = 'De volta a %s';
-$lang['btn_mediaManager'] = 'Ver em gestor de media';
+$lang['btn_mediaManager'] = 'Ver no gerenciador de mídia';
$lang['loggedinas'] = 'Está em sessão como:';
$lang['user'] = 'Utilizador';
$lang['pass'] = 'Senha';
$lang['newpass'] = 'Nova senha';
-$lang['oldpass'] = 'Confirme senha actual';
-$lang['passchk'] = 'Confirmar novamente';
-$lang['remember'] = 'Memorizar?';
+$lang['oldpass'] = 'Confirme senha atual';
+$lang['passchk'] = 'mais uma vez';
+$lang['remember'] = 'Lembrar?';
$lang['fullname'] = 'Nome completo';
-$lang['email'] = 'Email';
-$lang['profile'] = 'Perfil do Utilizador';
-$lang['badlogin'] = 'O utilizador inválido ou senha inválida.';
-$lang['badpassconfirm'] = 'Infelizmente a palavra-passe não é a correcta';
+$lang['email'] = 'E-mail';
+$lang['profile'] = 'Perfil do Usuário';
+$lang['badlogin'] = 'Usuário ou ou senha inválida.';
+$lang['badpassconfirm'] = 'Infelizmente a senha não é a correta';
$lang['minoredit'] = 'Alterações Menores';
$lang['draftdate'] = 'Rascunho automaticamente gravado em';
-$lang['nosecedit'] = 'A página foi modificada entretanto. Como a informação da secção estava desactualizada, foi carregada a página inteira.';
-$lang['regmissing'] = 'Por favor, preencha todos os campos.';
-$lang['reguexists'] = 'Este utilizador já está inscrito. Por favor escolha outro nome de utilizador.';
-$lang['regsuccess'] = 'O utilizador foi criado e a senha foi enviada para o endereço de correio electrónico usado na inscrição.';
-$lang['regsuccess2'] = 'O utilizador foi criado.';
-$lang['regfail'] = 'O usuário não pode ser criado.';
-$lang['regmailfail'] = 'Houve um erro no envio da senha por e-mail. Por favor, contacte o administrador!';
-$lang['regbadmail'] = 'O endereço de correio electrónico é inválido. Se o endereço está correcto, e isto é um erro, por favor, contacte o administrador!';
-$lang['regbadpass'] = 'As duas senhas não são idênticas, por favor tente de novo.';
-$lang['regpwmail'] = 'A sua senha DokuWiki';
-$lang['reghere'] = 'Para se registar, clique em';
-$lang['profna'] = 'Este Wiki não suporta modificações aos perfis.';
-$lang['profnochange'] = 'Nada alteração, nada a fazer.';
-$lang['profnoempty'] = 'Não são permitidos nomes ou endereços em branco.';
-$lang['profchanged'] = 'Perfil do utilizador actualizado com sucesso.';
-$lang['profnodelete'] = 'Esta wiki não suporta remoção de utilizadores';
-$lang['profdeleteuser'] = 'Apagar Conta';
-$lang['profdeleted'] = 'A sua conta de utilizador foi removida desta wiki';
-$lang['profconfdelete'] = 'Quero remover a minha conta desta wiki. <br/> Esta acção não pode ser anulada.';
-$lang['profconfdeletemissing'] = 'A caixa de confirmação não foi marcada';
-$lang['proffail'] = 'O perfil do usuário não foi atualizado.';
-$lang['pwdforget'] = 'Esqueceu a sua senha? Pedir nova senha';
-$lang['resendna'] = 'Este wiki não suporta reenvio de senhas.';
-$lang['resendpwd'] = 'Definir 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.';
-$lang['resendpwdconfirm'] = 'O link de confirmação foi enviado por e-mail.';
-$lang['resendpwdsuccess'] = 'A nova senha foi enviada por e-mail.';
-$lang['license'] = 'Excepto menção em contrário, o conteúdo neste wiki está sob a seguinte licença:';
-$lang['licenseok'] = 'Nota: Ao editar esta página você aceita disponibilizar o seu conteúdo sob a seguinte licença:';
-$lang['searchmedia'] = 'Procurar nome de ficheiro:';
-$lang['searchmedia_in'] = 'Procurar em %s';
-$lang['txt_upload'] = 'Escolha ficheiro para carregar:';
-$lang['txt_filename'] = 'Carregar como (opcional):';
-$lang['txt_overwrt'] = 'Escrever por cima do ficheiro já existente';
-$lang['maxuploadsize'] = 'Publique max. %s por arquivo.';
-$lang['lockedby'] = 'Bloqueado por:';
-$lang['lockexpire'] = 'Expira em:';
-$lang['js']['willexpire'] = 'O bloqueio de edição para este documento irá expirar num minuto.\nPara evitar conflitos use o botão Prever para re-iniciar o temporizador de bloqueio.';
-$lang['js']['notsavedyet'] = 'Alterações não gravadas serão perdidas.';
-$lang['js']['searchmedia'] = 'Procurar por ficheiros';
+$lang['nosecedit'] = 'A página foi modificada. Como a informação da seção estava desatualizada, foi carregada a página inteira.';
+$lang['searchcreatepage'] = 'Se não encontrou o que estava procurando, pode criar uma nova página com o nome %s.';
+$lang['search_fullresults'] = 'O que foi encontrado nos textos';
+$lang['js']['search_toggle_tools'] = 'Mudar Ferramenta de Pesquisa';
+$lang['js']['willexpire'] = 'O bloqueio de edição para este documento irá expirar em um minuto.\nPara evitar conflitos use o botão prever para reiniciar o temporizador de bloqueio.';
+$lang['js']['notsavedyet'] = 'Alterações não salvas serão perdidas.';
+$lang['js']['searchmedia'] = 'Procurar por arquivos';
$lang['js']['keepopen'] = 'Mantenha a janela aberta durante a selecção';
$lang['js']['hidedetails'] = 'Esconder Detalhes';
-$lang['js']['mediatitle'] = 'Propriedades de ligação';
-$lang['js']['mediadisplay'] = 'Tipo de ligação';
+$lang['js']['mediatitle'] = 'Configurações de link';
+$lang['js']['mediadisplay'] = 'Tipo de link';
$lang['js']['mediaalign'] = 'Alinhamento';
$lang['js']['mediasize'] = 'Tamanho da imagem';
-$lang['js']['mediatarget'] = 'Alvo da ligação';
+$lang['js']['mediatarget'] = 'Alvo do link';
$lang['js']['mediaclose'] = 'Fechar';
$lang['js']['mediainsert'] = 'Inserir';
-$lang['js']['mediadisplayimg'] = 'Mostrar a imagem';
-$lang['js']['mediadisplaylnk'] = 'Mostrar apenas a ligação';
+$lang['js']['mediadisplayimg'] = 'Mostrar a imagem.';
+$lang['js']['mediadisplaylnk'] = 'Mostrar apenas o link.';
$lang['js']['mediasmall'] = 'Versão pequena';
$lang['js']['mediamedium'] = 'Versão média';
$lang['js']['medialarge'] = 'Versão grande';
$lang['js']['mediaoriginal'] = 'Versão original';
-$lang['js']['medialnk'] = 'Ligação para a página de detalhe';
-$lang['js']['mediadirect'] = 'Ligação directa para o original';
-$lang['js']['medianolnk'] = 'Nenhuma ligação';
-$lang['js']['medianolink'] = 'Não ligar à imagem';
+$lang['js']['medialnk'] = 'Link para a página de detalhe';
+$lang['js']['mediadirect'] = 'Link direto para o original';
+$lang['js']['medianolnk'] = 'Nenhuma link';
+$lang['js']['medianolink'] = 'Não linkar à imagem';
$lang['js']['medialeft'] = 'Alinhar a imagem à esquerda.';
$lang['js']['mediaright'] = 'Alinhar a imagem à direita.';
$lang['js']['mediacenter'] = 'Alinhar a imagem ao centro.';
$lang['js']['medianoalign'] = 'Não usar alinhamento algum.';
-$lang['js']['nosmblinks'] = 'Ligação a pastas Windows partilhadas apenas funciona com o Microsoft Internet Explorer.
-Pode no entanto copiar e colar o link.';
-$lang['js']['linkwiz'] = 'Assistente de Criação de Ligação';
-$lang['js']['linkto'] = 'Ligação para:';
+$lang['js']['nosmblinks'] = 'Linkar a pastas Windows compartilhadas apenas funciona com o Microsoft Internet Explorer.\nVocê pode no entanto copiar e colar o link.';
+$lang['js']['linkwiz'] = 'Assistente de Criação de Link';
+$lang['js']['linkto'] = 'Link para:';
$lang['js']['del_confirm'] = 'Remover o(s) item(s) selecionados?';
$lang['js']['restore_confirm'] = 'Restaurar esta versão?';
$lang['js']['media_diff'] = 'Ver diferenças:';
$lang['js']['media_diff_both'] = 'Lado a Lado';
$lang['js']['media_diff_opacity'] = 'Sobreposição';
$lang['js']['media_diff_portions'] = 'Slider';
-$lang['js']['media_select'] = 'Selecione ficheiros…';
+$lang['js']['media_select'] = 'Selecione arquivos…';
$lang['js']['media_upload_btn'] = 'Enviar';
$lang['js']['media_done_btn'] = 'Feito';
-$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['rssfailed'] = 'Ocorreu um erro neste canal RSS: ';
+$lang['js']['media_drop'] = 'Largue arquivo aqui para enviar';
+$lang['js']['media_cancel'] = 'excluir';
+$lang['js']['media_overwrt'] = 'Escrever por cima de arquivos existentes';
+$lang['search_exact_match'] = 'Correspondência exata';
+$lang['search_starts_with'] = 'Começa por';
+$lang['search_ends_with'] = 'Termina em';
+$lang['search_contains'] = 'Contém';
+$lang['search_custom_match'] = 'Personalizado';
+$lang['search_any_ns'] = 'Qualquer local';
+$lang['search_any_time'] = 'Em qualquer momento';
+$lang['search_past_7_days'] = 'Semana passada';
+$lang['search_past_month'] = 'Mês passado';
+$lang['search_past_year'] = 'Ano passado';
+$lang['search_sort_by_hits'] = 'Ordenar por ocorrência';
+$lang['search_sort_by_mtime'] = 'Ordenar pela última alteração';
+$lang['regmissing'] = 'Por favor, preencha todos os campos.';
+$lang['reguexists'] = 'Este usuário já está inscrito. Por favor escolha outro nome de usuário.';
+$lang['regsuccess'] = 'O usuário foi criado e a senha foi enviada para o endereço de correio eletrônico usado na inscrição.';
+$lang['regsuccess2'] = 'O usuário foi criado.';
+$lang['regfail'] = 'O usuário não pode ser criado.';
+$lang['regmailfail'] = 'Houve um erro no envio da senha por e-mail. Por favor, contacte o administrador!';
+$lang['regbadmail'] = 'O endereço de correio eletrônico é inválido. Se o endereço está correto e isto é um erro, contacte o administrador!';
+$lang['regbadpass'] = 'As duas senhas não são idênticas, por favor tente de novo.';
+$lang['regpwmail'] = 'A sua senha DokuWiki';
+$lang['reghere'] = 'Ainda não tem uma conta? Registre-se';
+$lang['profna'] = 'Este Wiki não suporta modificações nos perfis';
+$lang['profnochange'] = 'Nenhuma alteração, nada a fazer.';
+$lang['profnoempty'] = 'Não são permitidos nomes ou e-mails em branco.';
+$lang['profchanged'] = 'Perfil do usuário atualizado com sucesso.';
+$lang['profnodelete'] = 'Este wiki não suporta remoção de utilizadores';
+$lang['profdeleteuser'] = 'Apagar Conta';
+$lang['profdeleted'] = 'A sua conta de utilizador foi removida deste wiki';
+$lang['profconfdelete'] = 'Quero remover a minha conta deste wiki. <br/> Esta ação não pode ser desfeita.';
+$lang['profconfdeletemissing'] = 'A caixa de confirmação não foi marcada';
+$lang['proffail'] = 'O perfil do usuário não foi atualizado.';
+$lang['pwdforget'] = 'Esqueceu a sua senha? Peça uma nova';
+$lang['resendna'] = 'Este wiki não suporta reenvio de senhas.';
+$lang['resendpwd'] = 'Definir nova senha para';
+$lang['resendpwdmissing'] = 'É preciso preencher todos os campos.';
+$lang['resendpwdnouser'] = 'Não foi possível encontrar este usuário.';
+$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.';
+$lang['resendpwdconfirm'] = 'O link de confirmação foi enviado por e-mail.';
+$lang['resendpwdsuccess'] = 'A nova senha foi enviada por e-mail.';
+$lang['license'] = 'Excepto menção em contrário, o conteúdo neste wiki está sob a seguinte licença:';
+$lang['licenseok'] = 'Nota: Ao editar esta página você aceita disponibilizar o seu conteúdo sob a seguinte licença:';
+$lang['searchmedia'] = 'Procurar nome de arquivo:';
+$lang['searchmedia_in'] = 'Procurar em %s';
+$lang['txt_upload'] = 'Escolha arquivo a carregar:';
+$lang['txt_filename'] = 'Carregar como (opcional):';
+$lang['txt_overwrt'] = 'Sobrescrever arquivo';
+$lang['maxuploadsize'] = 'Enviar %s max. por arquivo.';
+$lang['lockedby'] = 'Bloqueado por:';
+$lang['lockexpire'] = 'Expira em:';
+$lang['rssfailed'] = 'Erro ao buscar informação deste feed:';
$lang['nothingfound'] = 'Nada foi encontrado.';
-$lang['mediaselect'] = 'Selecção de ficheiros';
-$lang['uploadsucc'] = 'Carregamento com sucesso';
-$lang['uploadfail'] = 'Falhou o carregamento. Talvez por não ter permissões?';
-$lang['uploadwrong'] = 'Carregamento negado. Esta extensão está proibida.';
-$lang['uploadexist'] = 'O ficheiro já existe. Não pode ser carregado.';
-$lang['uploadbadcontent'] = 'O conteúdo carregado não corresponde à extensão %s.';
-$lang['uploadspam'] = 'O carregamento foi bloqueado pela lista negra de SPAM.';
-$lang['uploadxss'] = 'O carregamento foi bloqueado porque possivelmente contem conteúdo malicioso.';
-$lang['uploadsize'] = 'O ficheiro carregado é demasiado grande. (máx. %s)';
-$lang['deletesucc'] = 'O ficheiro "%s" foi removido.';
-$lang['deletefail'] = 'O ficheiro "%s" não pode ser removido, por favor verifique as permissões.';
-$lang['mediainuse'] = 'O ficheiro "%s" não foi removido porque está ainda a ser usado.';
-$lang['namespaces'] = 'Grupos';
-$lang['mediafiles'] = 'Ficheiros disponíveis em';
+$lang['mediaselect'] = 'Seleção de arquivos';
+$lang['uploadsucc'] = 'Enviado com sucesso';
+$lang['uploadfail'] = 'O envio falhou. Talvez por não ter permissões?';
+$lang['uploadwrong'] = 'Envio negado. Esta extensão de arquivo é proibida!';
+$lang['uploadexist'] = 'O arquivo já existe. Nada foi feito.';
+$lang['uploadbadcontent'] = 'O conteúdo do envio não corresponde à extensão %s.';
+$lang['uploadspam'] = 'O envio foi bloqueado pela lista negra de spam.';
+$lang['uploadxss'] = 'O envio foi bloqueado porque possivelmente contem conteúdo malicioso.';
+$lang['uploadsize'] = 'O arquivo enviado é muito grande. (máx. %s)';
+$lang['deletesucc'] = 'O arquivo "%s" foi excluído.';
+$lang['deletefail'] = 'O arquivo "%s" não pode ser excluído - verifique as permissões.';
+$lang['mediainuse'] = 'O arquivo "%s" não foi excluído porque está sendo usado.';
+$lang['namespaces'] = 'Namespaces';
+$lang['mediafiles'] = 'Arquivos disponíveis em';
$lang['accessdenied'] = 'Não tem permissão para ver esta página.';
-$lang['mediausage'] = 'Use a seguinte sintaxe para referenciar este ficheiro:';
-$lang['mediaview'] = 'Ver ficheiro original';
+$lang['mediausage'] = 'Use a seguinte sintaxe para referenciar este arquivo:';
+$lang['mediaview'] = 'Ver arquivo original';
$lang['mediaroot'] = 'root';
-$lang['mediaupload'] = 'Carregar ficheiros para o grupo actual aqui. Para criar sub-grupos: escrever o nome do sub-grupo seguido de : antes do nome do ficheiro no campo "Carregar como".';
+$lang['mediaupload'] = 'Enviar arquivos para o grupo atual aqui. Para criar sub-grupos: escrever o nome do sub-grupo seguido de: antes do nome do arquivo no campo "Enviar como".';
$lang['mediaextchange'] = 'Extensão alterada de .%s para .%s!';
$lang['reference'] = 'Referências para';
-$lang['ref_inuse'] = 'O ficheiro não pode ser removido, porque está ainda a ser usado nestes documentos:';
+$lang['ref_inuse'] = 'O arquivo não pode ser removido, porque está sendo usado nestes documentos:';
$lang['ref_hidden'] = 'Algumas referências estão em documentos para os quais não tem permissão para ler';
$lang['hits'] = 'Resultados';
-$lang['quickhits'] = 'Documentos encontrados';
+$lang['quickhits'] = 'Pagenames encontrados';
$lang['toc'] = 'Tabela de Conteúdos';
-$lang['current'] = 'Actual';
-$lang['yours'] = 'A sua versão';
-$lang['diff'] = 'mostrar diferenças com a versão actual';
-$lang['diff2'] = 'mostrar diferenças entre versões escolhidas';
-$lang['difflink'] = 'Ligação para esta vista de comparação';
-$lang['diff_type'] = 'Ver diferenças';
+$lang['current'] = 'Atual';
+$lang['yours'] = 'Sua versão';
+$lang['diff'] = 'Mostrar diferenças com a versão atual';
+$lang['diff2'] = 'Mostrar diferenças entre versões escolhidas';
+$lang['difflink'] = 'Links para esta vista de comparação';
+$lang['diff_type'] = 'Ver diferenças:';
$lang['diff_inline'] = 'Embutido';
-$lang['diff_side'] = 'Lado a lado';
+$lang['diff_side'] = 'Lado a Lado';
$lang['diffprevrev'] = 'Revisão anterior';
$lang['diffnextrev'] = 'Próxima revisão';
$lang['difflastrev'] = 'Última revisão';
@@ -200,34 +218,34 @@ $lang['diffbothnextrev'] = 'Ambos os lados da próxima revisão';
$lang['line'] = 'Linha';
$lang['breadcrumb'] = 'Está em:';
$lang['youarehere'] = 'Está aqui:';
-$lang['lastmod'] = 'Esta página foi modificada pela última vez em:';
+$lang['lastmod'] = 'Última modificação em:';
$lang['by'] = 'por';
-$lang['deleted'] = 'Documento automaticamente removido.';
-$lang['created'] = 'Criação deste novo documento.';
-$lang['restored'] = 'Versão anterior restaurada (%s)';
-$lang['external_edit'] = 'Edição externa';
-$lang['summary'] = 'Sumário da Edição';
+$lang['deleted'] = 'excluído';
+$lang['created'] = 'criado';
+$lang['restored'] = 'versão anterior restaurada (%s)';
+$lang['external_edit'] = 'edição externa';
+$lang['summary'] = 'Sumário da edição';
$lang['noflash'] = 'O <a href="http://www.adobe.com/products/flashplayer/">Plugin Adobe Flash</a> é necessário para exibir este conteúdo.';
-$lang['download'] = 'Descarregar Snippet';
+$lang['download'] = 'Baixar Snippet';
$lang['tools'] = 'Ferramentas';
-$lang['user_tools'] = 'Ferramentas de Utilizador';
+$lang['user_tools'] = 'Ferramentas de Usuário';
$lang['site_tools'] = 'Ferramentas de Site';
$lang['page_tools'] = 'Ferramentas de Página';
-$lang['skip_to_content'] = 'saltar para conteúdo';
+$lang['skip_to_content'] = 'ir ao conteúdo';
$lang['sidebar'] = 'Barra Lateral';
$lang['mail_newpage'] = 'documento adicionado:';
$lang['mail_changed'] = 'documento modificado:';
-$lang['mail_subscribe_list'] = 'páginas alteradas no espaço de nome:';
-$lang['mail_new_user'] = 'Novo utilizador:';
-$lang['mail_upload'] = 'Ficheiro carregado:';
+$lang['mail_subscribe_list'] = 'páginas alteradas no namespace:';
+$lang['mail_new_user'] = 'Novo usuário:';
+$lang['mail_upload'] = 'Arquivo enviado:';
$lang['changes_type'] = 'Ver alterações de';
$lang['pages_changes'] = 'Páginas';
-$lang['media_changes'] = 'Ficheiros Media';
-$lang['both_changes'] = 'Tanto páginas como ficheiros media';
-$lang['qb_bold'] = 'Texto com Ênfase';
+$lang['media_changes'] = 'Arquivo de mídia';
+$lang['both_changes'] = 'Tanto páginas como arquivos de mídia';
+$lang['qb_bold'] = 'Texto Negrito';
$lang['qb_italic'] = 'Texto Itálico';
$lang['qb_underl'] = 'Texto Sublinhado';
-$lang['qb_code'] = 'Texto Código';
+$lang['qb_code'] = 'Texto Monoespaçado';
$lang['qb_strike'] = 'Texto Riscado';
$lang['qb_h1'] = 'Cabeçalho Nível 1';
$lang['qb_h2'] = 'Cabeçalho Nível 2';
@@ -235,27 +253,27 @@ $lang['qb_h3'] = 'Cabeçalho Nível 3';
$lang['qb_h4'] = 'Cabeçalho Nível 4';
$lang['qb_h5'] = 'Cabeçalho Nível 5';
$lang['qb_h'] = 'Cabeçalho';
-$lang['qb_hs'] = 'Seleccionar Cabeçalho';
+$lang['qb_hs'] = 'Selecionar Cabeçalho';
$lang['qb_hplus'] = 'Cabeçalho Maior';
$lang['qb_hminus'] = 'Cabeçalho Menor';
$lang['qb_hequal'] = 'Cabeçalho de Nível Semelhante';
-$lang['qb_link'] = 'Ligação Interna';
-$lang['qb_extlink'] = 'Ligação Externa';
+$lang['qb_link'] = 'Link Interno';
+$lang['qb_extlink'] = 'Link Externo';
$lang['qb_hr'] = 'Barra Horizontal';
$lang['qb_ol'] = 'Item numa Lista Ordenada';
$lang['qb_ul'] = 'Item numa Lista Não Ordenada';
-$lang['qb_media'] = 'Incluir imagens e outros ficheiros';
+$lang['qb_media'] = 'Incluir imagens e outros arquivos (abre numa nova página)';
$lang['qb_sig'] = 'Inserir Assinatura';
$lang['qb_smileys'] = 'Smileys';
$lang['qb_chars'] = 'Caracteres Especiais';
-$lang['upperns'] = 'Ir para o espaço de nomes parente';
+$lang['upperns'] = 'Ir para o namespace superior';
$lang['metaedit'] = 'Editar Metadata';
-$lang['metasaveerr'] = 'Falhou a escrita de Metadata';
-$lang['metasaveok'] = 'Metadata gravada';
+$lang['metasaveerr'] = 'Erro na escrita de Metadata';
+$lang['metasaveok'] = 'Metadata salva';
$lang['img_title'] = 'Título:';
$lang['img_caption'] = 'Legenda:';
$lang['img_date'] = 'Data:';
-$lang['img_fname'] = 'Ficheiro:';
+$lang['img_fname'] = 'Arquivo:';
$lang['img_fsize'] = 'Tamanho:';
$lang['img_artist'] = 'Fotógrafo:';
$lang['img_copyr'] = 'Copyright:';
@@ -266,49 +284,52 @@ $lang['img_width'] = 'Largura:';
$lang['img_height'] = 'Altura:';
$lang['subscr_subscribe_success'] = 'Adicionado %s à lista de subscrição para %s';
$lang['subscr_subscribe_error'] = 'Erro ao adicionar %s à lista de subscrição para %s';
-$lang['subscr_subscribe_noaddress'] = 'Não existe endereço algum associado com o seu nome de utilizador, não pode ser adicionado à lista de subscrição';
+$lang['subscr_subscribe_noaddress'] = 'Não existe endereço algum associado com o seu nome de usuário, você não pode ser adicionado à lista de subscrição';
$lang['subscr_unsubscribe_success'] = 'Removido %s da lista de subscrição para %s';
$lang['subscr_unsubscribe_error'] = 'Erro ao remover %s da lista de subscrição para %s';
$lang['subscr_already_subscribed'] = '%s já está subscrito em %s';
$lang['subscr_not_subscribed'] = '%s não está subscrito em %s';
-$lang['subscr_m_not_subscribed'] = 'Não está subscrito à página ou espaço de nome corrente.';
+$lang['subscr_m_not_subscribed'] = 'Não está subscrito à página ou namespace corrente.';
$lang['subscr_m_new_header'] = 'Adicionar subscrição';
-$lang['subscr_m_current_header'] = 'Subscrições correntes';
+$lang['subscr_m_current_header'] = 'Subscrições atuais';
$lang['subscr_m_unsubscribe'] = 'Des-subscrever';
$lang['subscr_m_subscribe'] = 'Subscrever';
$lang['subscr_m_receive'] = 'Receber';
-$lang['subscr_style_every'] = 'email em qualquer alteração';
+$lang['subscr_style_every'] = 'e-mail em toda alteração';
$lang['subscr_style_digest'] = '"digest email" de alterações em cada página (cada %.2f dias)';
-$lang['subscr_style_list'] = 'lista de páginas alteradas desde o último email (cada %.2f dias)';
-$lang['authtempfail'] = 'Autenticação temporariamente indisponível. Se a situação persistir, por favor informe o Wiki Admin.';
-$lang['i_chooselang'] = 'Escolha a linguagem';
+$lang['subscr_style_list'] = 'lista de páginas alteradas desde o último e-mail (cada %.2f dias)';
+$lang['authtempfail'] = 'Autenticação temporariamente indisponível. Se a situação persistir, informe o Administrador do Wiki.';
+$lang['i_chooselang'] = 'Escolha o idioma';
$lang['i_installer'] = 'Instalador do DokuWiki';
$lang['i_wikiname'] = 'Nome Wiki';
-$lang['i_enableacl'] = 'Activar ACL (recomendado)';
-$lang['i_superuser'] = 'Super-utilizador';
-$lang['i_problems'] = 'O instalador encontrou alguns problemas, indicados mais abaixo. Não pode continuar até que sejam corrigidos.';
-$lang['i_modified'] = 'Por razões de segurança, este script só funciona em novas e não-modificadas instalações do Dokuwiki. Deve por isso re-extrair os ficheiros do pacote que descarregou ou então deve consultar as completas <a href="http://dokuwiki.org/install">instruções de instalação do Dokuwiki installation instructions</a>';
-$lang['i_funcna'] = 'A função PHP <code>%s</code> não está disponível. Terá o serviço de alojamento desactivado-a por alguma razão?';
-$lang['i_phpver'] = 'A versão de PHP actual <code>%s</code> é inferior à versão mínima <code>%s</code>. É preciso actualizar a instalação PHP.';
-$lang['i_mbfuncoverload'] = 'mbstring.func_overload deve ser desabilitada no php.ini para executar DokuWiki.';
+$lang['i_enableacl'] = 'Ativar ACL (recomendado)';
+$lang['i_superuser'] = 'Superusuário';
+$lang['i_problems'] = 'O instalador encontrou alguns problemas, indicados abaixo. Não pode continuar até que sejam corrigidos.';
+$lang['i_modified'] = 'Por razões de segurança, este script só funciona em novas e não-modificadas instalações do Dokuwiki. Você deve re-extrair os arquivos do pacote que baixou ou então consultar as <a href="http://dokuwiki.org/install">instruções de instalação do Dokuwiki</a>';
+$lang['i_funcna'] = 'A função PHP <code>%s</code> não está disponível. Talvez o host a tenha desativado-a por alguma razão?';
+$lang['i_disabled'] = 'Isso foi desativado pelo seu provedor.';
+$lang['i_funcnmail'] = '<b>Nota:</b> A função mail do PHP não está disponível. %s Se ela permanecer indisponível, instale o <a href="http://dokuwiki.org/plugins/smtp">plugin smtp</a>.';
+$lang['i_phpver'] = 'A versão de PHP actual <code>%s</code> é inferior à versão mínima <code>%s</code>. É preciso atualizar a instalação PHP.';
+$lang['i_mbfuncoverload'] = 'mbstring.func_overload deve ser desativada no php.ini para executar o DokuWiki.';
+$lang['i_urandom'] = 'DokuWiki não pode criar números criptograficamente seguros para cookies. Verifique a configuração open_basedir no php.ini para um acesso <code>/dev/urandom</code> adequado.';
$lang['i_permfail'] = '<code>%s</code> não permite que o DokuWiki escreva nela. É preciso corrigir as permissões desta pasta!';
$lang['i_confexists'] = '<code>%s</code> já existe';
-$lang['i_writeerr'] = 'Não foi possível criar <code>%s</code>. É preciso verificar as permissões e criar o ficheiro manualmente.';
+$lang['i_writeerr'] = 'Não foi possível criar <code>%s</code>. É preciso verificar as permissões e criar o arquivo manualmente.';
$lang['i_badhash'] = 'dokuwiki.php não é o original ou não é reconhecido (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - valor ilegal ou vazio';
-$lang['i_success'] = 'A instalação e configuração inicial foram bem sucedidas. Pode remover o install.php. Aceda ao seu novo <a href="doku.php?id=wiki:welcome">Wiki</a> a correr o DokuWiki.';
-$lang['i_failure'] = 'Ocorreram alguns erros durante a escrita nos ficheiros de configuração. Poderá ser preciso corrigi-los manualmente antes de poder aceder ao seu novo <a href="doku.php?id=wiki:welcome">Wiki</a> a correr o DokuWiki.';
-$lang['i_policy'] = 'Politica ACL inicial';
-$lang['i_pol0'] = 'Wiki Aberto (ler, escrever e carregar para todos)';
-$lang['i_pol1'] = 'Wiki Público (ler para todos, escrever e carregar para utilizadores inscritos)';
-$lang['i_pol2'] = 'Wiki Fechado (ler, escrever e carregar somente para utilizadores inscritos)';
-$lang['i_allowreg'] = 'Permitir aos utilizadores registarem-se por si próprios';
+$lang['i_success'] = 'A instalação e a configuração inicial terminaram. Pode remover o install.php. Acesse ao seu novo <a href="doku.php?id=wiki:welcome">Wiki</a> rodando o DokuWiki.';
+$lang['i_failure'] = 'Ocorreram alguns erros durante a escrita nos arquivos de configuração. Poderá ser preciso corrigi-los manualmente antes de poder acessar ao seu novo <a href="doku.php?id=wiki:welcome">Wiki</a> rodando o DokuWiki.';
+$lang['i_policy'] = 'Política ACL inicial';
+$lang['i_pol0'] = 'Wiki Aberto (ler, escrever e enviar arquivos para todos)';
+$lang['i_pol1'] = 'Wiki Público (ler para todos, escrever e enviar arquivos para utilizadores inscritos)';
+$lang['i_pol2'] = 'Wiki Fechado (ler, escrever e enviar arquivos somente para utilizadores inscritos)';
+$lang['i_allowreg'] = 'Permitir aos utilizadores registarem-se sozinhos';
$lang['i_retry'] = 'Repetir';
$lang['i_license'] = 'Por favor escolha a licença sob a qual quer colocar o seu conteúdo:';
$lang['i_license_none'] = 'Não mostrar nenhuma informação de licença';
$lang['i_pop_field'] = 'Por favor ajude-nos a melhorar a experiência Dokuwiki:';
-$lang['i_pop_label'] = 'Uma vez por mês, enviar dados anónimos de uso para os desenvolvedores DokuWiki';
-$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['i_pop_label'] = 'Uma vez por mês, enviar dados anônimos de uso para os desenvolvedores DokuWiki';
+$lang['recent_global'] = 'Você está vendo as alterações dentro do namespace <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';
$lang['weeks'] = '%d semanas atrás';
@@ -319,32 +340,34 @@ $lang['seconds'] = '%d segundos atrás';
$lang['wordblock'] = 'A sua alteração não foi guardada porque contém texto bloqueado (spam).';
$lang['media_uploadtab'] = 'Enviar';
$lang['media_searchtab'] = 'Procurar';
-$lang['media_file'] = 'Ficheiro';
+$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'] = 'Linhas';
-$lang['media_sort_name'] = 'Ordenar por nome';
-$lang['media_sort_date'] = 'Ordenar por data';
+$lang['media_sort_name'] = 'Nome';
+$lang['media_sort_date'] = 'Data';
$lang['media_namespaces'] = 'Escolha o namespace';
-$lang['media_files'] = 'Ficheiros em %s';
-$lang['media_upload'] = 'Enviar para o grupo <strong>%s</strong>.';
-$lang['media_search'] = 'Procurar no grupo <strong>%s</strong>.';
+$lang['media_files'] = 'Arquivos em %s';
+$lang['media_upload'] = 'Enviar para %s';
+$lang['media_search'] = 'Procurar em %s';
$lang['media_view'] = '%s';
$lang['media_viewold'] = '%s em %s';
$lang['media_edit'] = 'Editar %s';
$lang['media_history'] = 'Histórico do %s';
$lang['media_meta_edited'] = 'metadata editada';
-$lang['media_perm_read'] = 'Perdão, não tem permissão para ler ficheiros.';
-$lang['media_perm_upload'] = 'Perdão, não tem permissão para enviar ficheiros.';
-$lang['media_update'] = 'enviar nova versão';
+$lang['media_perm_read'] = 'Perdão, não tem permissão para ler arquivos.';
+$lang['media_perm_upload'] = 'Perdão, não tem permissão para enviar arquivos.';
+$lang['media_update'] = 'Enviar nova versão';
$lang['media_restore'] = 'Restaurar esta versão';
-$lang['currentns'] = 'Namespace actual';
-$lang['searchresult'] = 'Resultado da pesquisa';
+$lang['media_acl_warning'] = 'Essa lista pode não estar completa devido a restrições de ACL e páginas ocultas.';
+$lang['email_fail'] = 'O mail() PHP está ausente ou desativado. O seguinte e-mail não foi enviado:';
+$lang['currentns'] = 'Namespace atual';
+$lang['searchresult'] = 'Resultado da Pesquisa';
$lang['plainhtml'] = 'HTML simples';
$lang['wikimarkup'] = 'Markup de Wiki';
-$lang['page_nonexist_rev'] = 'Página não existia no %s. Posteriormente, foi criado em <a href="%s">%s</a>.';
+$lang['page_nonexist_rev'] = 'Página não existia no %s. Posteriormente, foi criada em <a href="%s">%s</a>.';
$lang['unable_to_parse_date'] = 'Não é possível analisar o parâmetro "%s".';
$lang['email_signature_text'] = 'Este email foi gerado por DokuWiki em
@DOKUWIKIURL@';
diff --git a/inc/lang/pt/locked.txt b/inc/lang/pt/locked.txt
index a4bb4d606..e84552a72 100644
--- a/inc/lang/pt/locked.txt
+++ b/inc/lang/pt/locked.txt
@@ -1,3 +1,3 @@
====== Página em Edição ======
-Esta página está bloqueada por outro utilizador, que se encontra a editá-la neste momento. Terá que aguardar que o utilizador termine a edição ou que o bloqueio expire. \ No newline at end of file
+Esta página está bloqueada por outro utilizador, que se encontra a editá-la neste momento. Terá que aguardar que o utilizador termine a edição ou que o bloqueio expire.
diff --git a/inc/lang/pt/login.txt b/inc/lang/pt/login.txt
index 42c2a983c..50f9acb08 100644
--- a/inc/lang/pt/login.txt
+++ b/inc/lang/pt/login.txt
@@ -1,3 +1,3 @@
====== Entrar ======
-Não está actualmente em sessão! Introduza as suas credenciais de autenticação abaixo para para entrar em sessão. Precisa de ter cookies activos no seu navegador. \ No newline at end of file
+Não está logado! Digite as suas credenciais de autenticação abaixo para para logar-se. Precisa de ter cookies ativos no navegador.
diff --git a/inc/lang/pt/mailtext.txt b/inc/lang/pt/mailtext.txt
index 844f24617..bec21cc42 100644
--- a/inc/lang/pt/mailtext.txt
+++ b/inc/lang/pt/mailtext.txt
@@ -1,6 +1,4 @@
-Um documento no site Wiki @DOKUWIKIURL@ foi criado ou modificado.
-
-Aqui estão os detalhes:
+Um documento no site Wiki @DOKUWIKIURL@ foi criado ou modificado. Aqui estão os detalhes:
Data : @DATE@
Browser : @BROWSER@
@@ -8,7 +6,11 @@ Endereço IP : @IPADDRESS@
Hostname : @HOSTNAME@
Documento Ant.: @OLDPAGE@
Documento Novo: @NEWPAGE@
-Edit Summary : @SUMMARY@
-User : @USER@
+Data da Revisão: @DATE@
+Resumo da Edição : @SUMMARY@
+Usuário : @USER@
+
+Pode haver alterações mais recentes após esta revisão. Se isto
+acontecer, uma mensagem será mostrada na parte superior da página de revisão.
@DIFF@
diff --git a/inc/lang/pt/newpage.txt b/inc/lang/pt/newpage.txt
index 2d9c95599..0a5c936f5 100644
--- a/inc/lang/pt/newpage.txt
+++ b/inc/lang/pt/newpage.txt
@@ -1,3 +1,3 @@
-====== Documento Inexistente ======
+====== Este tópico ainda não existe ======
-Seguiu uma ligação para um documento que ainda não existe. Pode criá-lo usando o botão "Criar página", se as permissões lho permitirem. \ No newline at end of file
+Você seguiu um link para um documento que ainda não existe. Pode criá-lo usando o botão **Criar página**, se as permissões lhe permitirem.
diff --git a/inc/lang/pt/norev.txt b/inc/lang/pt/norev.txt
index 6dd8dfb6c..2802d5f2b 100644
--- a/inc/lang/pt/norev.txt
+++ b/inc/lang/pt/norev.txt
@@ -1,7 +1,3 @@
====== Revisão Inexistente ======
-A revisão especificada não existe.
-
-Clique no botão <Revisões> para aceder à lista de revisões deste documento.
-
-----
+A revisão especificada não existe. Clique no botão <Revisões anteriores> para acessar a lista de revisões deste documento.
diff --git a/inc/lang/pt/onceexisted.txt b/inc/lang/pt/onceexisted.txt
new file mode 100644
index 000000000..57472186f
--- /dev/null
+++ b/inc/lang/pt/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Esta página não existe mais ======
+
+Você seguiu um link para uma página que não existe mais. Você pode verificar a lista de [[?Do=revisions|revisões antigas]] para ver quando e por que foi excluída, acessar revisões antigas ou restaurá-la. \ No newline at end of file
diff --git a/inc/lang/pt/password.txt b/inc/lang/pt/password.txt
index cfd81f3b8..218f6367d 100644
--- a/inc/lang/pt/password.txt
+++ b/inc/lang/pt/password.txt
@@ -1,6 +1,6 @@
Olá, @FULLNAME@!
-Aqui estão as suas credenciais de autenticação para @TITLE@, em @DOKUWIKIURL@
+Aqui estão as suas credenciais para @TITLE@, em @DOKUWIKIURL@
-Utilizador : @LOGIN@
-Senha : @PASSWORD@
+Usuário : @LOGIN@
+Senha : @PASSWORD@
diff --git a/inc/lang/pt/preview.txt b/inc/lang/pt/preview.txt
index 1a8dab0b8..c5a8bec70 100644
--- a/inc/lang/pt/preview.txt
+++ b/inc/lang/pt/preview.txt
@@ -1,3 +1,3 @@
====== Previsão ======
-Esta é uma previsão de como ficará o conteúdo. Lembre-se: ainda **não está gravado**! \ No newline at end of file
+Esta é uma previsão de como ficará o conteúdo. **Lembre-se: ainda não está salvo**!
diff --git a/inc/lang/pt/pwconfirm.txt b/inc/lang/pt/pwconfirm.txt
index 00fee3e4f..bcb08ac5a 100644
--- a/inc/lang/pt/pwconfirm.txt
+++ b/inc/lang/pt/pwconfirm.txt
@@ -1,9 +1,9 @@
Olá @FULLNAME@!
-Alguém efectuou um pedido para uma nova senha para o seu perfil @TITLE@ em @DOKUWIKIURL@
+Alguém solicitou uma nova senha para o seu perfil @TITLE@ em @DOKUWIKIURL@
-Se não foi você que efectuou o pedido então por favor ignore esta mensagem.
+Se não foi você que solicitou então ignore esta mensagem.
-Senão, para confirmar o pedido, por favor siga este link:
+Senão, para confirmar o pedido, siga este link:
@CONFIRM@
diff --git a/inc/lang/pt/read.txt b/inc/lang/pt/read.txt
index 177b1e81d..968084afd 100644
--- a/inc/lang/pt/read.txt
+++ b/inc/lang/pt/read.txt
@@ -1 +1 @@
-Esta página é apenas de leitura. Pode ver a fonte, mas não alterá-la. Informe-se com o administrador deste Wiki se achar que isto não está correcto. \ No newline at end of file
+Esta página é apenas de leitura. Pode ver a fonte, mas não alterá-la. Informe-se com o administrador deste Wiki se achar que isto não está correto.
diff --git a/inc/lang/pt/recent.txt b/inc/lang/pt/recent.txt
index 3957df484..eccf2817f 100644
--- a/inc/lang/pt/recent.txt
+++ b/inc/lang/pt/recent.txt
@@ -1,3 +1,3 @@
====== Alterações Recentes ======
-Os seguintes documentos foram alterados recentemente. \ No newline at end of file
+Os seguintes documentos foram alterados recentemente:
diff --git a/inc/lang/pt/register.txt b/inc/lang/pt/register.txt
index 228cb9979..b7a8cc677 100644
--- a/inc/lang/pt/register.txt
+++ b/inc/lang/pt/register.txt
@@ -1,3 +1,3 @@
-====== Inscrição como novo utilizador ======
+====== Inscrição como novo usuário ======
-Preencha toda a informação abaixo para criar uma nova conta nesta wiki. Assegure que providencia um **endereço de email válido** - se não lhe for pedido que introduza uma nova palavra chave aqui, ser-lhe-á enviada uma para esse endereço. O nome de utilizador deve ser um [[doku>pagename|nome de página]] válido. \ No newline at end of file
+Preencha toda a informação abaixo para criar uma nova conta neste wiki. Assegure que providencia um **endereço de e-mail válido** - se não lhe for pedido que introduza uma nova senha aqui, ser-lhe-á enviada uma para esse endereço. O nome de usuário deve ser um [[doku>pt-br:pagename|nome de página]] válido.
diff --git a/inc/lang/pt/registermail.txt b/inc/lang/pt/registermail.txt
index 7f5333dad..ae4a70efc 100644
--- a/inc/lang/pt/registermail.txt
+++ b/inc/lang/pt/registermail.txt
@@ -1,10 +1,10 @@
-Inscrição de um novo utilizador. Aqui estão os detalhes:
+Um novo usuário foi registrado. Aqui estão os detalhes:
-Username : @NEWUSER@
+Usuário : @NEWUSER@
Nome Completo : @NEWNAME@
E-mail : @NEWEMAIL@
Data : @DATE@
-Browser : @BROWSER@
+Navegador : @BROWSER@
Endereço IP : @IPADDRESS@
Hostname : @HOSTNAME@
diff --git a/inc/lang/pt/resendpwd.txt b/inc/lang/pt/resendpwd.txt
index 9a54ace07..7ce47a636 100644
--- a/inc/lang/pt/resendpwd.txt
+++ b/inc/lang/pt/resendpwd.txt
@@ -1,3 +1,3 @@
====== Enviar nova senha ======
-Por favor, insira o seu nome de utilizador neste formulário para requerer uma nova senha para esta conta/perfil. Um link de confirmação será enviado para o endereço de e-mail associado. \ No newline at end of file
+Insira o seu nome de usuário neste formulário para solicitar uma nova senha para esta conta/perfil. Um link de confirmação será enviado para o endereço de e-mail associado.
diff --git a/inc/lang/pt/resetpwd.txt b/inc/lang/pt/resetpwd.txt
index 898772a23..795575aa5 100644
--- a/inc/lang/pt/resetpwd.txt
+++ b/inc/lang/pt/resetpwd.txt
@@ -1,3 +1,3 @@
====== Definir nova senha ======
-Digite uma nova senha para a sua conta nesta wiki. \ No newline at end of file
+Digite uma nova senha para a sua conta neste wiki.
diff --git a/inc/lang/pt/revisions.txt b/inc/lang/pt/revisions.txt
index 0a0d35950..b0c1ae009 100644
--- a/inc/lang/pt/revisions.txt
+++ b/inc/lang/pt/revisions.txt
@@ -1,3 +1,3 @@
====== Revisões antigas ======
-Estas são as revisões antigas do documento corrente. Para reverter para uma destas revisões, escolha-a abaixo, clique no botão "Editar página" e grave. \ No newline at end of file
+Estas são as revisões antigas do documento corrente. Para reverter para uma destas revisões, escolha-a abaixo, clique no botão "Editar página" e salve.
diff --git a/inc/lang/pt/searchpage.txt b/inc/lang/pt/searchpage.txt
index 27a6baafd..62449d470 100644
--- a/inc/lang/pt/searchpage.txt
+++ b/inc/lang/pt/searchpage.txt
@@ -1,4 +1,3 @@
====== Pesquisa ======
Pode encontrar os resultados da sua pesquisa abaixo. @CREATEPAGEINFO@
-
diff --git a/inc/lang/pt/showrev.txt b/inc/lang/pt/showrev.txt
index 25d617fa3..e706f4567 100644
--- a/inc/lang/pt/showrev.txt
+++ b/inc/lang/pt/showrev.txt
@@ -1 +1,2 @@
-**Esta é uma versão antiga do documento!** \ No newline at end of file
+**Esta é uma versão antiga do documento!**
+----
diff --git a/inc/lang/pt/stopwords.txt b/inc/lang/pt/stopwords.txt
index 373e6ee5a..218272626 100644
--- a/inc/lang/pt/stopwords.txt
+++ b/inc/lang/pt/stopwords.txt
@@ -1,5 +1,5 @@
# Esta é uma lista de plavaras que o indexador ignora, uma palavra por linha
-# Quando você edita esta lista certifique-se que usa fim de linha usado em sistemas UNIX
+# Quando você edita esta lista certifique-se que usa fim de linha usado em sistemas UNIX (fim de linha simples)
# Não é necessário incluir palavras menores que 3 letras - estas são sempre ignoradas
# Esta lista é baseada nas encontradas em http://www.ranks.nl/stopwords/
último
@@ -139,3 +139,4 @@ ver
verdade
verdadeiro
você
+www
diff --git a/inc/lang/pt/subscr_digest.txt b/inc/lang/pt/subscr_digest.txt
index 943bba8a6..565c39986 100644
--- a/inc/lang/pt/subscr_digest.txt
+++ b/inc/lang/pt/subscr_digest.txt
@@ -1,6 +1,6 @@
Olá!
-A página @PAGE@ na wiki @TITLE@ mudou.
+A página @PAGE@ do wiki @TITLE@ mudou.
Eis as mudanças:
--------------------------------------------------------
@@ -10,7 +10,7 @@ Eis as mudanças:
Revisão Antiga: @OLDPAGE@
Revisão Nova: @NEWPAGE@
-Para cancelar as notificações de página, inicie sessão na wiki em
-@DOKUWIKIURL@, visite
+Para cancelar as notificações de página, inicie sessão no wiki em
+@DOKUWIKIURL@, então visite
@SUBSCRIBE@
-e des-subscreva as alterações à página e/ou nome espaço de nome.
+e des-subscreva as alterações à página e/ou namespace.
diff --git a/inc/lang/pt/subscr_form.txt b/inc/lang/pt/subscr_form.txt
index 9bb7b6b45..079a81659 100644
--- a/inc/lang/pt/subscr_form.txt
+++ b/inc/lang/pt/subscr_form.txt
@@ -1,3 +1,3 @@
-====== Gestão de Subscrição ======
+====== Gerenciamento de Subscrição ======
-Esta página permite-lhe gerir as suas subscrições para a página e espaço de nomes correntes. \ No newline at end of file
+Esta página permite-lhe gerenciar as suas subscrições para a página e namespace atuais. \ No newline at end of file
diff --git a/inc/lang/pt/subscr_list.txt b/inc/lang/pt/subscr_list.txt
index fdaef5e0d..003baecf1 100644
--- a/inc/lang/pt/subscr_list.txt
+++ b/inc/lang/pt/subscr_list.txt
@@ -1,13 +1,13 @@
Olá!
-Páginas no espaço de nome @PAGE@ da wiki @TITLE@ mudaram.
+Páginas no namespace @PAGE@ do wiki @TITLE@ mudaram.
Eis as páginas alteradas:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-Para cancelar as notificações de páginas, inicie sessão na wiki em
+Para cancelar as notificações de páginas, inicie sessão no wiki em
@DOKUWIKIURL@, visite
@SUBSCRIBE@
-e des-subscreva às alterações da página e/ou espaço de nome.
+e des-subscreva às alterações da página e/ou namespace.
diff --git a/inc/lang/pt/subscr_single.txt b/inc/lang/pt/subscr_single.txt
index 10674f75a..8b494e052 100644
--- a/inc/lang/pt/subscr_single.txt
+++ b/inc/lang/pt/subscr_single.txt
@@ -7,13 +7,14 @@ Eis as alterações:
@DIFF@
--------------------------------------------------------
-Data : @DATE@
-Utilizador : @USER@
-Sumário de Edição: @SUMMARY@
-Revisão Antiga: @OLDPAGE@
-Revisão Nova: @NEWPAGE@
+Data : @DATE@
+Usuário : @USER@
+Sumário de Edição : @SUMMARY@
+Revisão Antiga : @OLDPAGE@
+Revisão Nova : @NEWPAGE@
+Data da Revisão: @DATE@
-Para cancelar as notificações de página, inicie sessão no wiki em
-@DOKUWIKIURL@, visite
+Para cancelar as notificações de página, logue-se no wiki em
+@DOKUWIKIURL@, então visite
@SUBSCRIBE@
-e des-subscreva às alterações de página e/ou espaço de nome.
+e des-subscreva às alterações de página e/ou namespace.
diff --git a/inc/lang/pt/updateprofile.txt b/inc/lang/pt/updateprofile.txt
index efacfe4a2..78ae025a2 100644
--- a/inc/lang/pt/updateprofile.txt
+++ b/inc/lang/pt/updateprofile.txt
@@ -1,3 +1,3 @@
-====== Actualize o seu perfil ======
+====== Atualize o seu perfil ======
-Apenas precisa de completar os campos que pretende alterar. Não é possível alterar o seu nome de utilizador. \ No newline at end of file
+Apenas precisa de completar os campos que pretende alterar. Não é possível alterar o seu nome de usuário.
diff --git a/inc/lang/pt/uploadmail.txt b/inc/lang/pt/uploadmail.txt
index 09787e1db..4b8275fbd 100644
--- a/inc/lang/pt/uploadmail.txt
+++ b/inc/lang/pt/uploadmail.txt
@@ -1,6 +1,6 @@
-Um ficheiro foi carregado. Aqui estão os detalhes:
+Um arquivo foi enviado. Aqui estão os detalhes:
-Ficheiro : @MEDIA@
+Arquivo : @MEDIA@
Revisão antiga : @OLD@
Data : @DATE@
Navegador : @BROWSER@
diff --git a/inc/lang/ro/denied.txt b/inc/lang/ro/denied.txt
index 490233acf..a485c1a12 100644
--- a/inc/lang/ro/denied.txt
+++ b/inc/lang/ro/denied.txt
@@ -1,4 +1,3 @@
====== Acces nepermis ======
Din păcate nu ai destule drepturi pentru a continua.
-
diff --git a/inc/lang/ro/draft.txt b/inc/lang/ro/draft.txt
index 550db52ff..9ed88b6bf 100644
--- a/inc/lang/ro/draft.txt
+++ b/inc/lang/ro/draft.txt
@@ -1,8 +1,5 @@
====== Fișierul schiță nu a fost găsit ======
-Ultima ta sesiune de editare nu s-a finalizat corect. În vreme ce lucrai,
-DokuWiki a salvat automat o schiță, pe care o poți utiliza acum pentru a
-continua editarea. Mai jos poți vedea informațiile care s-au salvat de la ultima sesiune.
+Ultima ta sesiune de editare nu s-a finalizat corect. În vreme ce lucrai, DokuWiki a salvat automat o schiță, pe care o poți utiliza acum pentru a continua editarea. Mai jos poți vedea informațiile care s-au salvat de la ultima sesiune.
-Decide dacă vrei să //recuperezi// sesiunea de editare pierdută, să //ștergi//
-schița salvată automat sau să //anulezi// procesul de editare.
+Decide dacă vrei să //recuperezi// sesiunea de editare pierdută, să //ștergi// schița salvată automat sau să //anulezi// procesul de editare.
diff --git a/inc/lang/ro/index.txt b/inc/lang/ro/index.txt
index 1ae5b9ca5..a0eebb77c 100644
--- a/inc/lang/ro/index.txt
+++ b/inc/lang/ro/index.txt
@@ -1,4 +1,3 @@
====== Index ======
-Acesta e un index al tuturor paginilor ordonat după [[doku>namespaces|spații
-de nume]].
+Acesta e un index al tuturor paginilor ordonat după [[doku>namespaces|spații de nume]].
diff --git a/inc/lang/ro/install.html b/inc/lang/ro/install.html
index 222b86e54..5d97b07f7 100644
--- a/inc/lang/ro/install.html
+++ b/inc/lang/ro/install.html
@@ -1,10 +1,7 @@
<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ăsești în <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 putea fi folosit, DokuWiki <strong>trebuie</strong> să aibă drepturi de scriere în directoarele ce conțin aceste fișiere.
-Acest script de instalare nu poate configura drepturile directoarelor. De regulă, aceasta se face direct, în linie de comandă, sau în cazul unoi soluții de hosting, prin FTP sau prin panoul de control al gazdei (de ex. cPanel).</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 putea fi folosit, DokuWiki <strong>trebuie</strong> să aibă drepturi de scriere în directoarele ce conțin aceste fișiere. Acest script de instalare nu poate configura drepturile directoarelor. De regulă, aceasta se face direct, în linie de comandă, sau în cazul unoi soluții de hosting, prin FTP sau prin panoul de control al gazdei (de ex. cPanel).</p>
-<p>Acest script de instalare va configura DokuWiki pentru <abbr title="access control list">ACL</abbr>, care permite autentificarea administratorului și accesul la meniul de administrare pentru instalarea plugin-urilor, gestiunea utilizatorilor, accesului la paginile wiki și modificarea configurației.
-Acest script nu este necesar pentru funcționarea DokuWiki, însă ușurează administrarea.
+<p>Acest script de instalare va configura DokuWiki pentru <abbr title="access control list">ACL</abbr>, care permite autentificarea administratorului și accesul la meniul de administrare pentru instalarea plugin-urilor, gestiunea utilizatorilor, accesului la paginile wiki și modificarea configurației. Acest script nu este necesar pentru funcționarea DokuWiki, însă ușurează administrarea.
<p>Utilizatorii experimentați sau utilizatorii care au nevoie de o configurație specială pot accesa paginile cu <a href="http://dokuwiki.org/install">instrucțiunile de instalare</a> și <a href="http://dokuwiki.org/config">opțiunile de configurare</a> a DokuWiki.</p>
-
diff --git a/inc/lang/ro/lang.php b/inc/lang/ro/lang.php
index 69d04abba..6abe7f00e 100644
--- a/inc/lang/ro/lang.php
+++ b/inc/lang/ro/lang.php
@@ -3,13 +3,13 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Vitalie Ciubotaru <vitalie@ciubotaru.tokyo>
+ * @author Victor <kvp@live.com>
+ * @author Marian Banica <open@banica.eu.org>
* @author Tiberiu Micu <tibimicu@gmx.net>
* @author Sergiu Baltariu <s_baltariu@yahoo.com>
* @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 Marian Banica <banica.marian@gmail.com>
* @author Adrian Vesa <adrianvesa@dotwikis.com>
* @author valentina_prof <sadoveanu.inform@gmail.com>
*/
@@ -72,43 +72,6 @@ $lang['badpassconfirm'] = 'Ne pare rau, parola este gresita';
$lang['minoredit'] = 'Modificare minoră';
$lang['draftdate'] = 'Schiță salvată automat la';
$lang['nosecedit'] = 'Pagina s-a modificat între timp, secțiunea info a expirat, s-a încărcat pagina întreagă în loc.';
-$lang['regmissing'] = 'Ne pare rău, trebuie să completezi toate cîmpurile.';
-$lang['reguexists'] = 'Ne pare rău, un utilizator cu acest nume este deja autentificat.';
-$lang['regsuccess'] = 'Utilizatorul a fost creat. Parola a fost trimisă prin e-mail.';
-$lang['regsuccess2'] = 'Utilizatorul a fost creat.';
-$lang['regfail'] = 'Utilizatorul nu a putu fi creat.';
-$lang['regmailfail'] = 'Se pare că a fost o eroare la trimiterea parolei prin e-mail. Contactează administratorul!';
-$lang['regbadmail'] = 'Adresa de e-mail este nevalidă - dacă ești de părere că este o eroare contactează administratorul.';
-$lang['regbadpass'] = 'Cele două parole furnizate nu sunt identice; încearcă din nou.';
-$lang['regpwmail'] = 'Parola ta DokuWiki';
-$lang['reghere'] = 'Încă nu ai un cont? Creează unul!';
-$lang['profna'] = 'Acest wiki nu permite modificarea profilului';
-$lang['profnochange'] = 'Nici o modificare; nimic de făcut.';
-$lang['profnoempty'] = 'Nu sunt permise numele sau adresa de e-mail necompletate.';
-$lang['profchanged'] = 'Profilul de utilizator a fost actualizat cu succes.';
-$lang['profnodelete'] = 'Acest wiki nu accepta stergerea conturilor utilizatorilor';
-$lang['profdeleteuser'] = 'Sterge cont';
-$lang['profdeleted'] = 'Contul tau a fost sters de pe acest wiki';
-$lang['profconfdelete'] = 'As dori sa sterf contul meu de pe acest Wiki. <br/> Aceasta actiune nu poate fi anulata.';
-$lang['proffail'] = 'Profilul utilizatorului nu a fost actualizat.';
-$lang['pwdforget'] = 'Parolă uitată? Obține una nouă!';
-$lang['resendna'] = 'Acest wiki nu permite retrimiterea parolei.';
-$lang['resendpwd'] = 'Configurează 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. Verifică dacă ai folosit întreg link-ul de confirmare.';
-$lang['resendpwdconfirm'] = 'Un link de confirmare a fost trimis prin e-mail.';
-$lang['resendpwdsuccess'] = 'Noua parolă a fost trimisă prin e-mail.';
-$lang['license'] = 'Exceptând locurile unde este altfel specificat, conținutul acestui wiki este licențiat sub următoarea licență:';
-$lang['licenseok'] = 'Notă: Prin editarea acestei pagini ești de acord să publici conțintul sub următoarea licență:';
-$lang['searchmedia'] = 'Caută numele fișierului:';
-$lang['searchmedia_in'] = 'Caută în %s';
-$lang['txt_upload'] = 'Selectează fișierul de încărcat:';
-$lang['txt_filename'] = 'Încarcă fișierul ca (opțional):';
-$lang['txt_overwrt'] = 'Suprascrie fișierul existent';
-$lang['maxuploadsize'] = 'Incarcare maxima %s per fisier.';
-$lang['lockedby'] = 'Momentan blocat de:';
-$lang['lockexpire'] = 'Blocarea expiră la:';
$lang['js']['willexpire'] = 'Blocarea pentru editarea paginii expiră intr-un minut.\nPentru a preveni conflictele folosește butonul de previzualizare pentru resetarea blocării.';
$lang['js']['notsavedyet'] = 'Există modificări nesalvate care se vor pierde.
Dorești să continui?';
@@ -152,6 +115,54 @@ $lang['js']['media_done_btn'] = 'Gata';
$lang['js']['media_drop'] = 'Lasă fișierele aici pentru încărcarea lor';
$lang['js']['media_cancel'] = 'Înlătură';
$lang['js']['media_overwrt'] = 'Suprascrie fișierele deja existente';
+$lang['search_starts_with'] = 'Începe cu';
+$lang['search_ends_with'] = 'Termină cu';
+$lang['search_contains'] = 'Conţine';
+$lang['search_any_ns'] = 'Orice spațiu de nume';
+$lang['search_any_time'] = 'Oricând';
+$lang['search_past_7_days'] = 'Săptămâna trecută';
+$lang['search_past_month'] = 'Luna trecută';
+$lang['search_past_year'] = 'Anul trecut';
+$lang['search_sort_by_hits'] = 'Sortează după popularitate';
+$lang['search_sort_by_mtime'] = 'Sortează după ultima modificare';
+$lang['regmissing'] = 'Ne pare rău, trebuie să completezi toate cîmpurile.';
+$lang['reguexists'] = 'Ne pare rău, un utilizator cu acest nume este deja autentificat.';
+$lang['regsuccess'] = 'Utilizatorul a fost creat. Parola a fost trimisă prin e-mail.';
+$lang['regsuccess2'] = 'Utilizatorul a fost creat.';
+$lang['regfail'] = 'Utilizatorul nu a putut fi creat.';
+$lang['regmailfail'] = 'Se pare că a fost o eroare la trimiterea parolei prin e-mail. Contactează administratorul!';
+$lang['regbadmail'] = 'Adresa de e-mail este nevalidă - dacă ești de părere că este o eroare contactează administratorul.';
+$lang['regbadpass'] = 'Cele două parole furnizate nu sunt identice; încearcă din nou.';
+$lang['regpwmail'] = 'Parola ta DokuWiki';
+$lang['reghere'] = 'Încă nu ai un cont? Creează unul!';
+$lang['profna'] = 'Acest wiki nu permite modificarea profilului';
+$lang['profnochange'] = 'Nici o modificare; nimic de făcut.';
+$lang['profnoempty'] = 'Nu sunt permise numele sau adresa de e-mail necompletate.';
+$lang['profchanged'] = 'Profilul de utilizator a fost actualizat cu succes.';
+$lang['profnodelete'] = 'Acest wiki nu accepta stergerea conturilor utilizatorilor';
+$lang['profdeleteuser'] = 'Sterge cont';
+$lang['profdeleted'] = 'Contul tau a fost sters de pe acest wiki';
+$lang['profconfdelete'] = 'As dori sa sterf contul meu de pe acest Wiki. <br/> Aceasta actiune nu poate fi anulata.';
+$lang['profconfdeletemissing'] = 'Căsuța de confirmare nu este bifată';
+$lang['proffail'] = 'Profilul utilizatorului nu a fost actualizat.';
+$lang['pwdforget'] = 'Parolă uitată? Obține una nouă!';
+$lang['resendna'] = 'Acest wiki nu permite retrimiterea parolei.';
+$lang['resendpwd'] = 'Configurează 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. Verifică dacă ai folosit întreg link-ul de confirmare.';
+$lang['resendpwdconfirm'] = 'Un link de confirmare a fost trimis prin e-mail.';
+$lang['resendpwdsuccess'] = 'Noua parolă a fost trimisă prin e-mail.';
+$lang['license'] = 'Exceptând locurile unde este altfel specificat, conținutul acestui wiki este licențiat sub următoarea licență:';
+$lang['licenseok'] = 'Notă: Prin editarea acestei pagini ești de acord să publici conțintul sub următoarea licență:';
+$lang['searchmedia'] = 'Caută numele fișierului:';
+$lang['searchmedia_in'] = 'Caută în %s';
+$lang['txt_upload'] = 'Selectează fișierul de încărcat:';
+$lang['txt_filename'] = 'Încarcă fișierul ca (opțional):';
+$lang['txt_overwrt'] = 'Suprascrie fișierul existent';
+$lang['maxuploadsize'] = 'Incarcare maxima %s per fisier.';
+$lang['lockedby'] = 'Momentan blocat de:';
+$lang['lockexpire'] = 'Blocarea expiră la:';
$lang['rssfailed'] = 'A apărut o eroare in timpul descărcării acestui câmp: ';
$lang['nothingfound'] = 'Nu am găsit nimic.';
$lang['mediaselect'] = 'Fișiere media';
@@ -333,6 +344,7 @@ $lang['media_perm_read'] = 'Ne pare rău, dar nu ai suficiente permisiuni
$lang['media_perm_upload'] = 'Ne pare rău, dar nu ai suficiente permisiuni pentru a putea încărca fișiere.';
$lang['media_update'] = 'Încarcă noua versiune';
$lang['media_restore'] = 'Restaurează această versiune';
+$lang['currentns'] = 'Spațiul de nume curent';
$lang['searchresult'] = 'Rezultatul cautarii';
$lang['email_signature_text'] = 'Acest e-mail a fost generat de DokuWiki la
@DOKUWIKIURL@';
diff --git a/inc/lang/ro/locked.txt b/inc/lang/ro/locked.txt
index d1e80ad40..c1ca33038 100644
--- a/inc/lang/ro/locked.txt
+++ b/inc/lang/ro/locked.txt
@@ -1,4 +1,3 @@
====== Pagină blocată ======
-Pagina este momentan blocată de alt utilizator. Trebuie să aștepți pînă când
-acest utilizator termină editarea sau până când expiră blocarea.
+Pagina este momentan blocată de alt utilizator. Trebuie să aștepți pînă când acest utilizator termină editarea sau până când expiră blocarea.
diff --git a/inc/lang/ro/login.txt b/inc/lang/ro/login.txt
index 7de38f621..550848e42 100644
--- a/inc/lang/ro/login.txt
+++ b/inc/lang/ro/login.txt
@@ -1,4 +1,3 @@
====== Autentificare ======
-Nu ești autentificat! Introdu datele de autentificare. Pentru ca
-autentificarea să funcționeze trebuie să fie permise cookie-urile în browser.
+Nu ești autentificat! Introdu datele de autentificare. Pentru ca autentificarea să funcționeze trebuie să fie permise cookie-urile în browser.
diff --git a/inc/lang/ro/newpage.txt b/inc/lang/ro/newpage.txt
index 2ef35136e..be0480607 100644
--- a/inc/lang/ro/newpage.txt
+++ b/inc/lang/ro/newpage.txt
@@ -1,3 +1,3 @@
====== Pagina nu există încă ======
-Ai urmat o legătură către o pagină care nu există. O poti crea prin apăsarea butonului ''Editează această pagină''.
+Ai urmat o legătură către o pagină care nu există. O poti crea prin apăsarea butonului **Editează această pagină**.
diff --git a/inc/lang/ro/norev.txt b/inc/lang/ro/norev.txt
index 08bbb74dd..b8aee094f 100644
--- a/inc/lang/ro/norev.txt
+++ b/inc/lang/ro/norev.txt
@@ -1,4 +1,3 @@
====== Nu există versiunea paginii ======
-Versiunea indicată nu există. Folosește butonul ''Versiuni anterioare'' pentru
-o listă a versiunilor acestei pagini.
+Versiunea indicată nu există. Folosește butonul ''Versiuni anterioare'' pentru o listă a versiunilor acestei pagini.
diff --git a/inc/lang/ro/preview.txt b/inc/lang/ro/preview.txt
index c89d19727..75ff12b97 100644
--- a/inc/lang/ro/preview.txt
+++ b/inc/lang/ro/preview.txt
@@ -1,3 +1,3 @@
====== Previzualizare ======
-Acesta este modul în care va arăta textul. Ai în vedere: **Nu** e încă **salvat**!
+Acesta este modul în care va arăta textul. **Ai în vedere: Nu e încă salvat**!
diff --git a/inc/lang/ro/pwconfirm.txt b/inc/lang/ro/pwconfirm.txt
index 1123b8b96..d2e1020d2 100644
--- a/inc/lang/ro/pwconfirm.txt
+++ b/inc/lang/ro/pwconfirm.txt
@@ -1,7 +1,6 @@
Salutare, @FULLNAME@!
-Cineva a cerut o parolă nouă pentru @TITLE@ pentru conectarea la
-@DOKUWIKIURL@.
+Cineva a cerut o parolă nouă pentru @TITLE@ pentru conectarea la @DOKUWIKIURL@.
Dacă nu ai solicitat o parolă nouă, ignoră acest e-mail.
diff --git a/inc/lang/ro/recent.txt b/inc/lang/ro/recent.txt
index e92ca8fa7..4f54095bc 100644
--- a/inc/lang/ro/recent.txt
+++ b/inc/lang/ro/recent.txt
@@ -1,3 +1,3 @@
====== Modificări recente ======
-Următoarele pagini au fost modificate recent.
+Următoarele pagini au fost modificate recent:
diff --git a/inc/lang/ro/resendpwd.txt b/inc/lang/ro/resendpwd.txt
index 24d995e89..2d1ef3c4b 100644
--- a/inc/lang/ro/resendpwd.txt
+++ b/inc/lang/ro/resendpwd.txt
@@ -1,5 +1,3 @@
====== Trimite parolă nouă ======
-Introduc numele de utilizator în formularul de mai jos pentru a solicita o
-nouă parolă pentru aceast wiki. Un link de confirmare va fi trimis la adresa
-de e-mail înregistrată.
+Introduc numele de utilizator în formularul de mai jos pentru a solicita o nouă parolă pentru aceast wiki. Un link de confirmare va fi trimis la adresa de e-mail înregistrată.
diff --git a/inc/lang/ro/revisions.txt b/inc/lang/ro/revisions.txt
index 7cafaf046..67e977b1a 100644
--- a/inc/lang/ro/revisions.txt
+++ b/inc/lang/ro/revisions.txt
@@ -1,5 +1,3 @@
====== Versiune anterioară ======
-Acestea sunt versiunile anterioare ale paginii curente. Pentru revenirea la o
-versiune anteroară, selectează versiunea de mai jos, clic pe ''Editează
-această pagină'' și salvează versiunea.
+Acestea sunt versiunile anterioare ale paginii curente. Pentru revenirea la o versiune anteroară, selectează versiunea de mai jos, clic pe ''Editează această pagină'' și salvează versiunea.
diff --git a/inc/lang/ro/searchpage.txt b/inc/lang/ro/searchpage.txt
index 5b262fe03..c13a28cb1 100644
--- a/inc/lang/ro/searchpage.txt
+++ b/inc/lang/ro/searchpage.txt
@@ -1,4 +1,3 @@
====== Căutare ======
Rezultatele căutării sunt afișate mai jos. @CREATEPAGEINFO@
-
diff --git a/inc/lang/ro/updateprofile.txt b/inc/lang/ro/updateprofile.txt
index de43c69cb..f4ce7003b 100644
--- a/inc/lang/ro/updateprofile.txt
+++ b/inc/lang/ro/updateprofile.txt
@@ -1,4 +1,3 @@
====== Actualizare profil utilizator ======
-Trebuie să completezi doar câmpurile pe care dorești să le modifici. Nu poți
-modifica numele de utilizator.
+Trebuie să completezi doar câmpurile pe care dorești să le modifici. Nu poți modifica numele de utilizator.
diff --git a/inc/lang/ru/admin.txt b/inc/lang/ru/admin.txt
index 8a670d5a0..463712620 100644
--- a/inc/lang/ru/admin.txt
+++ b/inc/lang/ru/admin.txt
@@ -1,4 +1,3 @@
====== Управление ======
Ниже вы сможете найти список административных операций, доступных в «Докувики».
-
diff --git a/inc/lang/ru/backlinks.txt b/inc/lang/ru/backlinks.txt
index a3b638d19..c4d59a85c 100644
--- a/inc/lang/ru/backlinks.txt
+++ b/inc/lang/ru/backlinks.txt
@@ -1,4 +1,3 @@
====== Обратные ссылки ======
-Это список страниц, которые ссылаются на текущую страницу.
-
+Список страниц, ссылающихся на текущую страницу.
diff --git a/inc/lang/ru/conflict.txt b/inc/lang/ru/conflict.txt
index e813d8c13..fa43cdd29 100644
--- a/inc/lang/ru/conflict.txt
+++ b/inc/lang/ru/conflict.txt
@@ -1,5 +1,5 @@
====== Существует более новая версия ======
-Существует более новая версия документа, который вы редактировали. Такое случается, когда другой пользователь изменил документ, пока вы делали то же самое.
+Существует более новая версия страницы, которую вы редактировали. Такое случается, когда другой пользователь изменил страницу, пока вы делали то же самое.
-Внимательно изучите различия, приведенные ниже, и решите, какую версию оставить. Если вы выберете «Сохранить», то ваша версия будет сохранена. Нажав «Отменить», вы оставите текущую версию.
+Внимательно изучите различия, приведённые ниже, и решите, какую версию оставить. Если вы выберете «Сохранить», то ваша версия будет сохранена. Нажав «Отменить», вы оставите текущую версию. \ No newline at end of file
diff --git a/inc/lang/ru/denied.txt b/inc/lang/ru/denied.txt
index 791b30b1a..23867453a 100644
--- a/inc/lang/ru/denied.txt
+++ b/inc/lang/ru/denied.txt
@@ -1,4 +1,3 @@
====== Доступ запрещён ======
Извините, у вас не хватает прав для этого действия.
-
diff --git a/inc/lang/ru/diff.txt b/inc/lang/ru/diff.txt
index 21b8a8eab..e91b9dba1 100644
--- a/inc/lang/ru/diff.txt
+++ b/inc/lang/ru/diff.txt
@@ -1,3 +1,3 @@
====== Различия ======
-Здесь показаны различия между двумя версиями данной страницы.
+Показаны различия между двумя версиями страницы.
diff --git a/inc/lang/ru/draft.txt b/inc/lang/ru/draft.txt
index a92aa34cd..ceeacb401 100644
--- a/inc/lang/ru/draft.txt
+++ b/inc/lang/ru/draft.txt
@@ -2,4 +2,4 @@
Последний раз редактирование этой страницы не было корректно завершено. Во время вашей работы был автоматически сохранён черновик, который вы теперь можете восстановить и продолжить прерванную правку. Ниже вы видите автоматически сохранённую версию.
-Пожалуйста, решите, хотите ли вы //восстановить// потерянную версию, //удалить// черновик, или //отменить// редактирование.
+Пожалуйста, решите, хотите ли вы //восстановить// потерянную версию, //удалить// черновик или //отменить// редактирование.
diff --git a/inc/lang/ru/editrev.txt b/inc/lang/ru/editrev.txt
index d46f07bc8..361482aaf 100644
--- a/inc/lang/ru/editrev.txt
+++ b/inc/lang/ru/editrev.txt
@@ -1,2 +1,2 @@
-**Вы загрузили старую ревизию документа!** Сохранив её, вы создадите новую текущую версию с этим содержимым.
+**Вы загрузили старую версию документа!** Сохранив её, вы создадите новую текущую версию с этим содержимым.
----
diff --git a/inc/lang/ru/index.txt b/inc/lang/ru/index.txt
index a059b281f..e234f971b 100644
--- a/inc/lang/ru/index.txt
+++ b/inc/lang/ru/index.txt
@@ -1,4 +1,3 @@
-====== Содержание ======
-
-Перед вами список доступных страниц, упорядоченный по [[doku>namespaces|пространствам имён]].
+====== Карта сайта ======
+Перед вами список доступных страниц, упорядоченный по [[doku>ru:namespaces|пространствам имён]].
diff --git a/inc/lang/ru/install.html b/inc/lang/ru/install.html
index c1c58faa0..57fe31cfa 100644
--- a/inc/lang/ru/install.html
+++ b/inc/lang/ru/install.html
@@ -1,7 +1,7 @@
-<p>Эта страница предназначена помочь в первоначальной установке и конфигурации «<a href="http://www.dokuwiki.org/">ДокуВики</a>». Дополнительная информация о программе установки доступна на её <a href="http://www.dokuwiki.org/installer">странице документации</a>.</p>
+<p>Эта страница предназначена помочь в первоначальной установке и конфигурации «<a href="http://www.dokuwiki.org/">ДокуВики</a>». Дополнительная информация о программе установки доступна на её <a href="http://www.dokuwiki.org/ru:installer">странице документации</a>.</p>
<p>«ДокуВики» использует обычные файлы для хранения страниц и дополнительной информации (например, изображений, поискового индекса, предыдущих версий страницы, и т. д.). Для успешной работы «ДокуВики» <strong>необходим</strong> доступ на запись к директориям с этими файлами. Данная программа установки не может самостоятельно изменять системные права доступа к директориям. Обычно это делается напрямую из командной строки (shell), или, если вы используете удалённый хостинг, через FTP или панель управления своего хостинга (например, cPanel).</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>
+<p>Опытным пользователям и пользователям со специальными требованиями к установке рекомендуется обратиться по следующим ссылкам для уточнения подробностей <a href="http://www.dokuwiki.org/ru:install">процесса установки</a> и <a href="http://www.dokuwiki.org/ru:config">параметров конфигурации</a>.</p>
diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php
index 7eebd39bf..3e4857cc1 100644
--- a/inc/lang/ru/lang.php
+++ b/inc/lang/ru/lang.php
@@ -3,9 +3,13 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Анатолий <anatol_m@mail.ru>
* @author Yuriy Skalko <yuriy.skalko@gmail.com>
+ * @author Alexander Kh. <001.arx@gmail.com>
+ * @author Vyacheslav Strenadko <vyacheslav.strenadko@gmail.com>
+ * @author Wolterhon <hotmottot.1@gmail.com>
* @author Zhassulan <zyesmukanov@gmail.com>
- * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
* @author Yuri Pimenov <up@ftpsearch.lv>
* @author Igor Tarasov <tigr@mail15.com>
* @author Denis Simakov <akinoame1@gmail.com>
@@ -44,7 +48,7 @@ $lang['doublequoteopening'] = '«';
$lang['doublequoteclosing'] = '»';
$lang['singlequoteopening'] = '„';
$lang['singlequoteclosing'] = '“';
-$lang['apostrophe'] = '’';
+$lang['apostrophe'] = '“';
$lang['btn_edit'] = 'Править страницу';
$lang['btn_source'] = 'Показать исходный текст';
$lang['btn_show'] = 'Показать страницу';
@@ -100,7 +104,7 @@ $lang['nosecedit'] = 'За это время страница бы
$lang['searchcreatepage'] = 'Если вы не нашли то, что искали, то можете создать или изменить страницу %s, названную соответственно вашему запросу.';
$lang['search_fullresults'] = 'Результаты полнотекстового поиска';
$lang['js']['search_toggle_tools'] = 'Настройка поиска';
-$lang['js']['willexpire'] = 'Ваша блокировка этой страницы на редактирование истекает в течение минуты.\nЧтобы предотвратить конфликты используйте кнопку «Просмотр» для сброса таймера блокировки.';
+$lang['js']['willexpire'] = 'Ваша блокировка этой страницы на редактирование истекает в течение минуты.\nИспользуйте кнопку «Просмотр» для сброса таймера блокировки, чтобы предотвратить конфликты.';
$lang['js']['notsavedyet'] = 'Несохранённые изменения будут потеряны. Вы действительно хотите продолжить?';
$lang['js']['searchmedia'] = 'Поиск файлов';
$lang['js']['keepopen'] = 'Не закрывать окно после выбора';
@@ -141,24 +145,24 @@ $lang['js']['media_done_btn'] = 'Готово';
$lang['js']['media_drop'] = 'Переместите файлы сюда для загрузки';
$lang['js']['media_cancel'] = 'убрать';
$lang['js']['media_overwrt'] = 'Перезаписать существующие файлы';
-$lang['search_exact_match'] = 'Точное соответствие';
+$lang['search_exact_match'] = 'Точное совпадение';
$lang['search_starts_with'] = 'Начинается на';
$lang['search_ends_with'] = 'Заканчивается';
$lang['search_contains'] = 'Содержит';
$lang['search_custom_match'] = 'Задано пользователем';
-$lang['search_any_ns'] = 'Любое пространство имен';
+$lang['search_any_ns'] = 'Все простр. имён';
$lang['search_any_time'] = 'Любое время';
$lang['search_past_7_days'] = 'Прошлая неделя';
$lang['search_past_month'] = 'Прошлый месяц';
$lang['search_past_year'] = 'Прошлый год';
-$lang['search_sort_by_hits'] = 'Сортировать по хитам';
-$lang['search_sort_by_mtime'] = 'Сортировать по последнему изменению';
+$lang['search_sort_by_hits'] = 'Сорт. по популярности';
+$lang['search_sort_by_mtime'] = 'Сорт. по последнему изменению';
$lang['regmissing'] = 'Извините, вам следует заполнить все поля.';
$lang['reguexists'] = 'Извините, пользователь с таким логином уже существует.';
$lang['regsuccess'] = 'Пользователь создан; пароль выслан на адрес электронной почты.';
$lang['regsuccess2'] = 'Пользователь создан.';
$lang['regfail'] = 'Пользователь не может быть создан.';
-$lang['regmailfail'] = 'Похоже есть проблема с отправкой пароля по почте. Пожалуйста, сообщите об этом администратору!';
+$lang['regmailfail'] = 'Похоже, есть проблема с отправкой пароля по почте. Пожалуйста, сообщите об этом администратору!';
$lang['regbadmail'] = 'Данный вами адрес электронной почты выглядит неправильным. Если вы считаете это ошибкой, сообщите администратору.';
$lang['regbadpass'] = 'Два введённых пароля не совпадают. Пожалуйста, попробуйте ещё раз.';
$lang['regpwmail'] = 'Ваш пароль для системы «Докувики»';
@@ -170,12 +174,11 @@ $lang['profchanged'] = 'Профиль пользователя усп
$lang['profnodelete'] = 'Данная вики не поддерживает удаление пользователей.';
$lang['profdeleteuser'] = 'Удалить аккаунт';
$lang['profdeleted'] = 'Ваш аккаунт был удалён из этой вики';
-$lang['profconfdelete'] = 'Я хочу удалить свой аккаунт из этой вики. <br />
-Это действие необратимо.';
+$lang['profconfdelete'] = 'Я хочу удалить свой аккаунт из этой вики.<br />Это действие необратимо.';
$lang['profconfdeletemissing'] = 'Флажок подтверждения не установлен';
-$lang['proffail'] = 'Профиль пользователя не был обновлен.';
+$lang['proffail'] = 'Профиль пользователя не обновлён.';
$lang['pwdforget'] = 'Забыли пароль? Получите новый';
-$lang['resendna'] = 'Данная вики не поддерживает повторную отправку пароля.';
+$lang['resendna'] = 'Вики не поддерживает повторную отправку пароля.';
$lang['resendpwd'] = 'Установить новый пароль для';
$lang['resendpwdmissing'] = 'Вы должны заполнить все поля формы.';
$lang['resendpwdnouser'] = 'Пользователь с таким логином не обнаружен в нашей базе данных.';
@@ -192,7 +195,7 @@ $lang['txt_overwrt'] = 'Перезаписать существующ
$lang['maxuploadsize'] = 'Макс. размер загружаемого файла %s.';
$lang['lockedby'] = 'В данный момент заблокировано пользователем';
$lang['lockexpire'] = 'Блокировка истекает в';
-$lang['rssfailed'] = 'Произошла ошибка при получении следующей новостной ленты: ';
+$lang['rssfailed'] = 'Произошла ошибка при получении новостной ленты: ';
$lang['nothingfound'] = 'Ничего не найдено.';
$lang['mediaselect'] = 'Выбор медиафайла';
$lang['uploadsucc'] = 'Загрузка произведена успешно';
@@ -202,7 +205,7 @@ $lang['uploadexist'] = 'Файл с таким именем сущес
$lang['uploadbadcontent'] = 'Содержание файла не соответствует расширению %s.';
$lang['uploadspam'] = 'Загрузка заблокирована спам-фильтром.';
$lang['uploadxss'] = 'Загрузка заблокирована по соображениям безопасности.';
-$lang['uploadsize'] = 'Загруженный файл был слишком большой (макс. %s).';
+$lang['uploadsize'] = 'Загружаемый файл был слишком большим. (Макс. %s).';
$lang['deletesucc'] = 'Файл "%s" был удалён.';
$lang['deletefail'] = 'Невозможно удалить файл "%s" — проверьте права доступа к нему.';
$lang['mediainuse'] = 'Файл "%s" не был удалён — он всё ещё используется.';
@@ -212,12 +215,12 @@ $lang['accessdenied'] = 'Вы не можете просмотреть
$lang['mediausage'] = 'Для ссылки на этот файл используйте следующий синтаксис:';
$lang['mediaview'] = 'Посмотреть исходный файл';
$lang['mediaroot'] = 'корень';
-$lang['mediaupload'] = 'Здесь можно загрузить файл в текущий каталог («пространство имён»). Чтобы создать подкаталоги, добавьте их к началу имени файла («Загрузить как»). Имена подкаталогов разделяются двоеточиями.';
+$lang['mediaupload'] = 'Загрузка файла в текущее пространство имён. Для создания подпространства имён добавьте его название перед именем файла через двоеточие. Поддерживается drag-and-drop (перетащить-и-оставить).';
$lang['mediaextchange'] = 'Расширение изменилось с .%s на .%s!';
$lang['reference'] = 'Ссылки для';
$lang['ref_inuse'] = 'Этот файл не может быть удалён, так как он используется на следующих страницах:';
$lang['ref_hidden'] = 'Некоторые ссылки находятся на страницах, на чтение которых у вас нет прав доступа';
-$lang['hits'] = 'соответствий';
+$lang['hits'] = 'совпад.';
$lang['quickhits'] = 'Подходящие страницы';
$lang['toc'] = 'Содержание';
$lang['current'] = 'текущий';
@@ -236,7 +239,7 @@ $lang['diffbothnextrev'] = 'Следующая версия справа
$lang['line'] = 'Строка';
$lang['breadcrumb'] = 'Вы посетили:';
$lang['youarehere'] = 'Вы находитесь здесь:';
-$lang['lastmod'] = 'Последние изменения:';
+$lang['lastmod'] = 'Последнее изменение:';
$lang['by'] = ' —';
$lang['deleted'] = 'удалено';
$lang['created'] = 'создано';
@@ -255,7 +258,7 @@ $lang['mail_newpage'] = 'страница добавлена:';
$lang['mail_changed'] = 'страница изменена:';
$lang['mail_subscribe_list'] = 'изменились страницы в пространстве имён:';
$lang['mail_new_user'] = 'новый пользователь:';
-$lang['mail_upload'] = 'файл закачан:';
+$lang['mail_upload'] = 'файл загружен:';
$lang['changes_type'] = 'Посмотреть изменения';
$lang['pages_changes'] = 'страниц';
$lang['media_changes'] = 'медиафайлов';
@@ -272,8 +275,8 @@ $lang['qb_h4'] = 'Заголовок 4-го уровня';
$lang['qb_h5'] = 'Заголовок 5-го уровня';
$lang['qb_h'] = 'Заголовок';
$lang['qb_hs'] = 'Выбор заголовка';
-$lang['qb_hplus'] = 'Заголовок более высокого уровня';
-$lang['qb_hminus'] = 'Заголовок более низкого уровня (подзаголовок)';
+$lang['qb_hplus'] = 'Заголовок большего уровня';
+$lang['qb_hminus'] = 'Заголовок меньшего уровня (подзаголовок)';
$lang['qb_hequal'] = 'Заголовок текущего уровня';
$lang['qb_link'] = 'Внутренняя ссылка';
$lang['qb_extlink'] = 'Внешняя ссылка';
@@ -327,11 +330,14 @@ $lang['i_modified'] = 'Из соображений безопасно
Вам нужно либо заново распаковать скачанный пакет установки, либо обратиться к полной
<a href="http://www.dokuwiki.org/install">инструкции по установке «Докувики»</a>';
$lang['i_funcna'] = 'Функция PHP <code>%s</code> недоступна. Может быть, она по какой-то причине заблокирована вашим хостером?';
+$lang['i_disabled'] = 'Отключено вашим провайдером.';
+$lang['i_funcnmail'] = '<b>Примечание:</ b> PHP-функция mail недоступна. %s Если она по прежнему недоступна, вы можете установить <a href="https://www.dokuwiki.org/plugin:smtp">плагин SMTP</a>.';
$lang['i_phpver'] = 'Ваша версия PHP (<code>%s</code>) ниже требуемой (<code>%s</code>). Вам необходимо обновить установленную версию PHP.';
$lang['i_mbfuncoverload'] = 'Для запуска «Докувики» необходимо отключить параметр mbstring.func_overload в php.ini';
+$lang['i_urandom'] = 'DokuWiki не может создавать криптографически безопасные номера для файлов cookie. Возможно, вы захотите проверить настройки open_basedir в php.ini для правильного доступа <code> / dev / urandom </ code>.';
$lang['i_permfail'] = '<code>%s</code> недоступна для записи «Докувики». Вам необходимо исправить системные права доступа для этой директории!';
$lang['i_confexists'] = '<code>%s</code> уже существует';
-$lang['i_writeerr'] = 'Не удалось создать <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. Переходите к
@@ -349,12 +355,12 @@ $lang['i_pop_field'] = 'Пожалуйста, помогите нам
$lang['i_pop_label'] = 'Отправлять раз в месяц анонимную пользовательскую информацию разработчикам «Докувики»';
$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['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'] = 'Найти';
@@ -381,6 +387,7 @@ $lang['media_perm_upload'] = 'Извините, у вас недостато
$lang['media_update'] = 'Загрузить новую версию';
$lang['media_restore'] = 'Восстановить эту версию';
$lang['media_acl_warning'] = 'Этот список может быть неполным из-за ограничений списков контроля доступа (ACL) и скрытых страниц.';
+$lang['email_fail'] = 'PHP mail() отсутствует или отключен. Следующее письмо не было отправлено: ';
$lang['currentns'] = 'Текущее пространство имён';
$lang['searchresult'] = 'Результаты поиска';
$lang['plainhtml'] = 'Простой HTML';
diff --git a/inc/lang/ru/login.txt b/inc/lang/ru/login.txt
index 0a94a0b4b..1a74ec4df 100644
--- a/inc/lang/ru/login.txt
+++ b/inc/lang/ru/login.txt
@@ -1,4 +1,3 @@
====== Авторизация ======
-В данный момент вы не в системе. Авторизируйтесь при помощи следующей формы. //Замечание:// для работы у вас должны быть включены куки (cookies).
-
+Сейчас вы не в системе. Авторизируйтесь при помощи формы ниже. //Замечание:// для работы у вас должны быть включены куки (cookies). \ No newline at end of file
diff --git a/inc/lang/ru/newpage.txt b/inc/lang/ru/newpage.txt
index ea8e35bf5..836c16fdc 100644
--- a/inc/lang/ru/newpage.txt
+++ b/inc/lang/ru/newpage.txt
@@ -1,3 +1,3 @@
====== Эта страница ещё не существует ======
-Вы перешли по ссылке на тему, для которой ещё не создана страница. Если позволяют ваши права доступа, вы можете создать её, нажав на кнопку «Создать страницу».
+Вы перешли по ссылке на страницу, которая ещё не существует. Если позволяют ваши права доступа, создайте её, нажав на кнопку **Создать страницу**. \ No newline at end of file
diff --git a/inc/lang/ru/norev.txt b/inc/lang/ru/norev.txt
index c088d0d5a..ef798f88e 100644
--- a/inc/lang/ru/norev.txt
+++ b/inc/lang/ru/norev.txt
@@ -1,3 +1,3 @@
====== Такой версии не существует ======
-Указанная версия страницы не существует. Нажмите на кнопку «История страницы», чтобы получить список доступных предыдущих версий этого документа.
+Указанная версия страницы не существует. Нажмите на кнопку «История страницы», чтобы получить список доступных предыдущих версий этого документа. \ No newline at end of file
diff --git a/inc/lang/ru/onceexisted.txt b/inc/lang/ru/onceexisted.txt
new file mode 100644
index 000000000..7237113cf
--- /dev/null
+++ b/inc/lang/ru/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Данная страница более не существует ======
+
+Вы перешли по ссылке на страницу, которая больше не существует. Вы можете проверить [[?do=revisions|историю её изменений]], чтобы увидеть, когда и почему она была удалена, а также получить доступ к более ранним её версиям или восстановить её. \ No newline at end of file
diff --git a/inc/lang/ru/preview.txt b/inc/lang/ru/preview.txt
index 2bc383eb2..e66e7e42f 100644
--- a/inc/lang/ru/preview.txt
+++ b/inc/lang/ru/preview.txt
@@ -1,4 +1,3 @@
====== Просмотр ======
-Здесь показано, как ваш текст будет выглядеть. Внимание: текст ещё **не сохранён!**
-
+Здесь показано, как ваш текст будет выглядеть. **Внимание: текст ещё не сохранён!**
diff --git a/inc/lang/ru/pwconfirm.txt b/inc/lang/ru/pwconfirm.txt
index fff66946e..51081057a 100644
--- a/inc/lang/ru/pwconfirm.txt
+++ b/inc/lang/ru/pwconfirm.txt
@@ -4,6 +4,6 @@
Если вы не запрашивали новый пароль, просто проигнорируйте это письмо.
-Для подтверждения, что запрос был действительно сделан вами, пожалуйста, перейдите по следующей ссылке.
+Для подтверждения, что запрос был действительно сделан вами, пожалуйста, перейдите по ссылке:
@CONFIRM@
diff --git a/inc/lang/ru/read.txt b/inc/lang/ru/read.txt
index 08c3afa7d..8adfb7a35 100644
--- a/inc/lang/ru/read.txt
+++ b/inc/lang/ru/read.txt
@@ -1,2 +1 @@
Эта страница только для чтения. Вы можете посмотреть её исходный текст, но не можете его изменить. Сообщите администратору, если считаете, что это неправильно.
-
diff --git a/inc/lang/ru/recent.txt b/inc/lang/ru/recent.txt
index 0d4d3285a..ec9bf355f 100644
--- a/inc/lang/ru/recent.txt
+++ b/inc/lang/ru/recent.txt
@@ -1,5 +1,3 @@
====== Недавние изменения ======
-Следующие страницы были недавно изменены
-
-
+Следующие страницы были недавно изменены:
diff --git a/inc/lang/ru/register.txt b/inc/lang/ru/register.txt
index 2d5d9878e..9dde4a8fe 100644
--- a/inc/lang/ru/register.txt
+++ b/inc/lang/ru/register.txt
@@ -1,3 +1,3 @@
====== Регистрация нового пользователя ======
-Для регистрации в вики заполните все поля ниже. Обратите внимание на **правильность адреса электронной почты** — туда будет выслан пароль в том случае, если вас не просят самостоятельно ввести его здесь. Логин должен удовлетворять ограничениям для [[doku>pagename|идентификатора страницы]].
+Для регистрации в вики заполните все поля ниже. Обратите внимание на **правильность адреса электронной почты** — туда будет выслан пароль в том случае, если вас не просят самостоятельно ввести его здесь. Логин должен удовлетворять ограничениям для [[doku>ru:pagename|идентификатора страницы]].
diff --git a/inc/lang/ru/resendpwd.txt b/inc/lang/ru/resendpwd.txt
index bc24c49b5..8dbd30367 100644
--- a/inc/lang/ru/resendpwd.txt
+++ b/inc/lang/ru/resendpwd.txt
@@ -1,3 +1,3 @@
====== Выслать новый пароль ======
-Для получения нового пароля введите ваш логин. Ваш новый пароль будет отправлен по адресу электронной почты, зарегистрированному на ваше имя. \ No newline at end of file
+Пожалуйста, введите свой логин в форму ниже, чтобы запросить новый пароль для учётной записи в этой вики. Ссылка для подтверждения будет отправлена на адрес электронной почты, указанный при регистрации. \ No newline at end of file
diff --git a/inc/lang/ru/resetpwd.txt b/inc/lang/ru/resetpwd.txt
index f7c9d3564..b7cc95cc4 100644
--- a/inc/lang/ru/resetpwd.txt
+++ b/inc/lang/ru/resetpwd.txt
@@ -1,3 +1,3 @@
====== Установка нового пароля ======
-Пожалуйста введите новый пароль для вашей учетной записи в этой вики.
+Пожалуйста, введите новый пароль для своей учётной записи в этой вики. \ No newline at end of file
diff --git a/inc/lang/ru/revisions.txt b/inc/lang/ru/revisions.txt
index d5faf3d66..3efeb66ef 100644
--- a/inc/lang/ru/revisions.txt
+++ b/inc/lang/ru/revisions.txt
@@ -1,3 +1,3 @@
====== История страницы ======
-Перед вами история правок текущего документа. Чтобы вернуться к одной из предыдущих версий, выберите нужную, нажмите «Править страницу» и сохраните её. \ No newline at end of file
+Перед вами список предыдущих версий текущего документа. Чтобы вернуться к одной из предыдущих версий, выберите нужную, нажмите «Править страницу» и сохраните её.
diff --git a/inc/lang/ru/searchpage.txt b/inc/lang/ru/searchpage.txt
index deea577ed..925ab4299 100644
--- a/inc/lang/ru/searchpage.txt
+++ b/inc/lang/ru/searchpage.txt
@@ -1,4 +1,3 @@
====== Поиск ======
Перед вами результаты поиска. @CREATEPAGEINFO@
-
diff --git a/inc/lang/ru/stopwords.txt b/inc/lang/ru/stopwords.txt
index 826a89e06..5bb3acc41 100644
--- a/inc/lang/ru/stopwords.txt
+++ b/inc/lang/ru/stopwords.txt
@@ -91,3 +91,4 @@
этой
этим
этот
+www
diff --git a/inc/lang/ru/updateprofile.txt b/inc/lang/ru/updateprofile.txt
index 824916c65..ce411eeca 100644
--- a/inc/lang/ru/updateprofile.txt
+++ b/inc/lang/ru/updateprofile.txt
@@ -1,5 +1,3 @@
====== Обновить профиль ======
Необходимо заполнить только те поля, которые вы хотите изменить. Ваш логин не может быть изменён.
-
-
diff --git a/inc/lang/ru/uploadmail.txt b/inc/lang/ru/uploadmail.txt
index a92d85564..7c342a702 100644
--- a/inc/lang/ru/uploadmail.txt
+++ b/inc/lang/ru/uploadmail.txt
@@ -1,4 +1,4 @@
-В вашу вики был закачан файл. Подробная информация:
+В вашу вики был загружен файл. Подробная информация:
Файл: @MEDIA@
Старая версия: @OLD@
diff --git a/inc/lang/ru/wordblock.txt b/inc/lang/ru/wordblock.txt
deleted file mode 100644
index 09c663fb3..000000000
--- a/inc/lang/ru/wordblock.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-====== СПАМ заблокирован ======
-
-Ваши изменения **не были** сохранены, так как они содержат одно или более запрещенных слов. Если Вы пытались добавить спам в Вики -- ай-яй-яй! Если Вы считаете, что это какая-то ошибка, обратитесь к администратору вики.
diff --git a/inc/lang/si/admin.txt b/inc/lang/si/admin.txt
new file mode 100644
index 000000000..ded268034
--- /dev/null
+++ b/inc/lang/si/admin.txt
@@ -0,0 +1,3 @@
+====== පරිපාලනය ======
+
+ඩොකුවිකි (DokuWiki) තුල පවතින පරිපාලන කාර්යයන් ලැයිස්තුවක් පහත දැකගත හැකිය. \ No newline at end of file
diff --git a/inc/lang/si/adminplugins.txt b/inc/lang/si/adminplugins.txt
new file mode 100644
index 000000000..5a9503760
--- /dev/null
+++ b/inc/lang/si/adminplugins.txt
@@ -0,0 +1 @@
+===== අමතර යෙදවුම් ===== \ No newline at end of file
diff --git a/inc/lang/si/backlinks.txt b/inc/lang/si/backlinks.txt
new file mode 100644
index 000000000..03c3bb471
--- /dev/null
+++ b/inc/lang/si/backlinks.txt
@@ -0,0 +1,3 @@
+====== බාහිර සබැදුම් ======
+
+මෙම පිටුවට සම්බන්ධව ඇති බාහිර සබැදුම් ලැයිස්තුවක් මෙහි දක්වා ඇත. \ No newline at end of file
diff --git a/inc/lang/si/conflict.txt b/inc/lang/si/conflict.txt
new file mode 100644
index 000000000..ec1b516ce
--- /dev/null
+++ b/inc/lang/si/conflict.txt
@@ -0,0 +1,2 @@
+====== නව සංස්කරණයක් පවතී ======
+
diff --git a/inc/lang/si/denied.txt b/inc/lang/si/denied.txt
new file mode 100644
index 000000000..fb929784e
--- /dev/null
+++ b/inc/lang/si/denied.txt
@@ -0,0 +1 @@
+====== ඉදිරියට යාමට අවසරයක් නොමැත ====== \ No newline at end of file
diff --git a/inc/lang/si/diff.txt b/inc/lang/si/diff.txt
new file mode 100644
index 000000000..99a939534
--- /dev/null
+++ b/inc/lang/si/diff.txt
@@ -0,0 +1 @@
+====== වෙනස්කම් ====== \ No newline at end of file
diff --git a/inc/lang/si/draft.txt b/inc/lang/si/draft.txt
new file mode 100644
index 000000000..635974ac9
--- /dev/null
+++ b/inc/lang/si/draft.txt
@@ -0,0 +1 @@
+====== Draft file found ====== \ No newline at end of file
diff --git a/inc/lang/si/index.txt b/inc/lang/si/index.txt
new file mode 100644
index 000000000..c6d0975a6
--- /dev/null
+++ b/inc/lang/si/index.txt
@@ -0,0 +1 @@
+වෙබ්අඩවියේ පෙළගැස්ම \ No newline at end of file
diff --git a/inc/lang/si/lang.php b/inc/lang/si/lang.php
new file mode 100644
index 000000000..8e184b612
--- /dev/null
+++ b/inc/lang/si/lang.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thanushka Peiris <apps@thanushka.me>
+ */
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['doublequoteopening'] = '“';
+$lang['doublequoteclosing'] = '”';
+$lang['singlequoteopening'] = '‘';
+$lang['singlequoteclosing'] = '’';
+$lang['apostrophe'] = '’';
+$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_newer'] = 'වඩාත් ආසන්න';
+$lang['btn_older'] = 'අවම වශයෙන් ආසන්න';
+$lang['btn_revs'] = 'පැරණි සංස්කරණ';
+$lang['btn_recent'] = 'ආසන්න වෙනස්කිරීම්';
+$lang['btn_upload'] = 'උඩුගතකිරීම';
diff --git a/inc/lang/sk/admin.txt b/inc/lang/sk/admin.txt
index 510eeb9c8..3d0ab5855 100644
--- a/inc/lang/sk/admin.txt
+++ b/inc/lang/sk/admin.txt
@@ -1,5 +1,3 @@
====== Administrácia ======
Nižšie môžete nájsť zoznam administratívnych úloh dostupných v DokuWiki.
-
-
diff --git a/inc/lang/sk/denied.txt b/inc/lang/sk/denied.txt
index aa6f7b8fb..56c7b9660 100644
--- a/inc/lang/sk/denied.txt
+++ b/inc/lang/sk/denied.txt
@@ -1,4 +1,3 @@
====== Nepovolená akcia ======
Prepáčte, ale nemáte dostatočné oprávnenie k tejto činnosti.
-
diff --git a/inc/lang/sk/diff.txt b/inc/lang/sk/diff.txt
index 0548ea5d6..1b4495aa0 100644
--- a/inc/lang/sk/diff.txt
+++ b/inc/lang/sk/diff.txt
@@ -1,4 +1,3 @@
====== Rozdiely ======
Tu môžete vidieť rozdiely medzi vybranou verziou a aktuálnou verziou danej stránky.
-
diff --git a/inc/lang/sk/draft.txt b/inc/lang/sk/draft.txt
index 96a4e91b2..f648c358d 100644
--- a/inc/lang/sk/draft.txt
+++ b/inc/lang/sk/draft.txt
@@ -3,4 +3,3 @@
Vaša posledná editácia tejto stránky nebola ukončená korektne. Dokuwiki automaticky uložila počas vašej práce koncept a ten môžete teraz použiť pre pokračovanie editácie. Nižšie môžete vidieť dáta, ktoré boli uložené.
Prosím, rozhodnite sa, či chcete //obnoviť// vašu poslednú editáciu, //zmazať// automaticky uložený koncept alebo //stornovať// proces editácie.
-
diff --git a/inc/lang/sk/editrev.txt b/inc/lang/sk/editrev.txt
index ed15e791c..35c62b1d1 100644
--- a/inc/lang/sk/editrev.txt
+++ b/inc/lang/sk/editrev.txt
@@ -1 +1,2 @@
**Máte načítanú staršiu verziu dokumentu!** Pokiaľ ju uložíte, vytvoríte tým novú aktuálnu verziu.
+----
diff --git a/inc/lang/sk/install.html b/inc/lang/sk/install.html
index 86cc6cc06..3b93ab84f 100644
--- a/inc/lang/sk/install.html
+++ b/inc/lang/sk/install.html
@@ -1,23 +1,7 @@
-<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>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
-webhostingové administračné rozhranie.</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 webhostingové administračné rozhranie.</p>
-<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
-spravovať Dokuwiki.</p>
+<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 spravovať Dokuwiki.</p>
-<p>Skúsení užívatelia alebo užívatelia so špeciálnymi požiadavkami môžu použiť
-tieto odkazy pre bližšie informácie týkajúce sa
-<a href="http://dokuwiki.org/install">inštalačných pokynov</a>
-a <a href="http://dokuwiki.org/config">konfiguračných nastavení</a>.</p>
+<p>Skúsení užívatelia alebo užívatelia so špeciálnymi požiadavkami môžu použiť tieto odkazy pre bližšie informácie týkajúce sa <a href="http://dokuwiki.org/install">inštalačných pokynov</a> a <a href="http://dokuwiki.org/config">konfiguračných nastavení</a>.</p>
diff --git a/inc/lang/sk/lang.php b/inc/lang/sk/lang.php
index bd8d1c9a3..83c160b60 100644
--- a/inc/lang/sk/lang.php
+++ b/inc/lang/sk/lang.php
@@ -1,19 +1,26 @@
<?php
/**
+ * slovak language file
+ *
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * auth.class language support
+ * installer strings
+ *
+ * @author Peter Mydliar <peto.mydliar@gmail.com>
* @author Martin Michalek <michalek.dev@gmail.com>
* @author Ondrej Vegh <ov@vsieti.sk> with help of the scholars from Zdruzena stredna skola polygraficka in Bratislava
* @author Michal Mesko <michal.mesko@gmail.com>
* @author exusik <exusik@gmail.com>
+ * @author Tibor Repček <tiborepcek@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
-$lang['doublequoteopening'] = '„';
-$lang['doublequoteclosing'] = '“';
-$lang['singlequoteopening'] = '‚';
-$lang['singlequoteclosing'] = '‘';
+$lang['doublequoteopening'] = '“';
+$lang['doublequoteclosing'] = '”';
+$lang['singlequoteopening'] = '‘';
+$lang['singlequoteclosing'] = '’';
$lang['apostrophe'] = '’';
$lang['btn_edit'] = 'Upraviť stránku';
$lang['btn_source'] = 'Zobraziť zdroj stránky';
@@ -67,44 +74,9 @@ $lang['badpassconfirm'] = 'Ľutujem, heslo bolo nesprávne.';
$lang['minoredit'] = 'Menšie zmeny';
$lang['draftdate'] = 'Koncept automaticky uložený';
$lang['nosecedit'] = 'Stránka bola medzičasom zmenená, informácie o sekcii sú zastaralé a z tohto dôvodu bola nahraná celá stránka.';
-$lang['regmissing'] = 'Musíte vyplniť všetky údaje.';
-$lang['reguexists'] = 'Používateľ s rovnakým menom je už zaregistrovaný.';
-$lang['regsuccess'] = 'Používateľský účet bol vytvorený a heslo zaslané emailom.';
-$lang['regsuccess2'] = 'Používateľský účet bol vytvorený.';
-$lang['regfail'] = 'Používateľský účet nemôže byť vytvorený.';
-$lang['regmailfail'] = 'Zdá sa, že nastala chyba pri posielaní mailu s heslom. Skúste kontaktovať správcu.';
-$lang['regbadmail'] = 'Zadaná emailová adresa nie je platná. Pokiaľ si myslíte, že to je zle, skúste kontaktovať správcu.';
-$lang['regbadpass'] = 'Zadané heslá nie sú rovnaké, zadajte ich prosím znovu.';
-$lang['regpwmail'] = 'Vaše heslo do systému DokuWiki';
-$lang['reghere'] = 'Nemáte používateľský účet? Vytvorte si ho';
-$lang['profna'] = 'Táto wiki nepodporuje zmenu profilu';
-$lang['profnochange'] = 'Žiadne zmeny, nie je čo robiť.';
-$lang['profnoempty'] = 'Prázdne meno alebo mailová adresa nie sú povolené.';
-$lang['profchanged'] = 'Profil požívateľa bol úspešne zmenený.';
-$lang['profnodelete'] = 'Táto wiki neumožňuje zrušenie používateľov.';
-$lang['profdeleteuser'] = 'Zrušiť účet';
-$lang['profdeleted'] = 'Váš účet bol zrušený v tejto wiki.';
-$lang['profconfdelete'] = 'Chcem odstrániť môj účet z tejto wiki. <br/> Táto operácia je nevratná.';
-$lang['profconfdeletemissing'] = 'Nebolo zavolené potvrdzovacie políčko';
-$lang['proffail'] = 'Profil používateľa nebol aktualizovaný.';
-$lang['pwdforget'] = 'Zabudli ste heslo? Získajte nové!';
-$lang['resendna'] = 'Táto wiki nepodporuje opätovné zasielanie hesla.';
-$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 použí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.';
-$lang['resendpwdconfirm'] = 'Autorizačný odkaz bol zaslaný na e-mail.';
-$lang['resendpwdsuccess'] = 'Vaše nové heslo bolo zaslané na e-mail.';
-$lang['license'] = 'Ak nie je uvedené inak, obsah tejto wiki je uverejnený pod nasledujúcou licenciou:';
-$lang['licenseok'] = 'Poznámka: Zmenou tejto stránky súhlasíte s uverejnením obsahu pod nasledujúcou licenciou:';
-$lang['searchmedia'] = 'Hľadať meno súboru:';
-$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['searchcreatepage'] = 'Ak ste nenašli, čo ste hľadali, môžete vytvoriť alebo upraviť stránku %s, ktorá bola nazvaná podľa vášho dopytu.';
+$lang['search_fullresults'] = 'Fulltextové výsledky';
+$lang['js']['search_toggle_tools'] = 'Zobraziť/Skryť vyhľadávacie nástroje';
$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.';
$lang['js']['notsavedyet'] = 'Neuložené zmeny budú stratené.
Chcete naozaj pokračovať?';
@@ -132,8 +104,7 @@ $lang['js']['medialeft'] = 'Zarovnať obrázok vľavo.';
$lang['js']['mediaright'] = 'Zarovnať obrázok vpravo.';
$lang['js']['mediacenter'] = 'Zarovnať obrázok na stred.';
$lang['js']['medianoalign'] = 'Nepoužívať zarovnanie.';
-$lang['js']['nosmblinks'] = 'Odkazovanie na zdieľané prostriedky Windows funguje len v Internet Exploreri.
-Aj napriek tomu tento odkaz môžete skopírovať a vložiť inde.';
+$lang['js']['nosmblinks'] = 'Odkazovanie na zdieľané prostriedky Windows funguje len v Internet Exploreri.\nAj napriek tomu tento odkaz môžete skopírovať a vložiť inde.';
$lang['js']['linkwiz'] = 'Sprievodca odkazmi';
$lang['js']['linkto'] = 'Odkaz na:';
$lang['js']['del_confirm'] = 'Zmazať túto položku?';
@@ -148,6 +119,56 @@ $lang['js']['media_done_btn'] = 'Hotovo';
$lang['js']['media_drop'] = 'Pridajte súbory potiahnutím myšou';
$lang['js']['media_cancel'] = 'odstrániť';
$lang['js']['media_overwrt'] = 'Prepísať existujúce súbory';
+$lang['search_exact_match'] = 'Presná zhoda';
+$lang['search_starts_with'] = 'Začín na';
+$lang['search_ends_with'] = 'Končí na';
+$lang['search_contains'] = 'Obsahuje';
+$lang['search_custom_match'] = 'Vlastný';
+$lang['search_any_ns'] = 'Akýkoľvek menný priestor';
+$lang['search_any_time'] = 'Kedykoľvek';
+$lang['search_past_7_days'] = 'Posledný týždeň';
+$lang['search_past_month'] = 'Posledný mesiac';
+$lang['search_past_year'] = 'Posledný rok';
+$lang['search_sort_by_hits'] = 'Zoradiť podľa počtu návštev';
+$lang['search_sort_by_mtime'] = 'Zoradiť podľa posledných úprav';
+$lang['regmissing'] = 'Musíte vyplniť všetky údaje.';
+$lang['reguexists'] = 'Používateľ s rovnakým menom je už zaregistrovaný.';
+$lang['regsuccess'] = 'Používateľský účet bol vytvorený a heslo zaslané emailom.';
+$lang['regsuccess2'] = 'Používateľský účet bol vytvorený.';
+$lang['regfail'] = 'Používateľský účet nemôže byť vytvorený.';
+$lang['regmailfail'] = 'Zdá sa, že nastala chyba pri posielaní mailu s heslom. Skúste kontaktovať správcu.';
+$lang['regbadmail'] = 'Zadaná emailová adresa nie je platná. Pokiaľ si myslíte, že to je zle, skúste kontaktovať správcu.';
+$lang['regbadpass'] = 'Zadané heslá nie sú rovnaké, zadajte ich prosím znovu.';
+$lang['regpwmail'] = 'Vaše heslo do systému DokuWiki';
+$lang['reghere'] = 'Nemáte používateľský účet? Vytvorte si ho';
+$lang['profna'] = 'Táto wiki nepodporuje zmenu profilu';
+$lang['profnochange'] = 'Žiadne zmeny, nie je čo robiť.';
+$lang['profnoempty'] = 'Prázdne meno alebo mailová adresa nie sú povolené.';
+$lang['profchanged'] = 'Profil požívateľa bol úspešne zmenený.';
+$lang['profnodelete'] = 'Táto wiki neumožňuje zrušenie používateľov.';
+$lang['profdeleteuser'] = 'Zrušiť účet';
+$lang['profdeleted'] = 'Váš účet bol zrušený v tejto wiki.';
+$lang['profconfdelete'] = 'Chcem odstrániť môj účet z tejto wiki. <br/> Táto operácia je nevratná.';
+$lang['profconfdeletemissing'] = 'Nebolo zavolené potvrdzovacie políčko';
+$lang['proffail'] = 'Profil používateľa nebol aktualizovaný.';
+$lang['pwdforget'] = 'Zabudli ste heslo? Získajte nové!';
+$lang['resendna'] = 'Táto wiki nepodporuje opätovné zasielanie hesla.';
+$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 použí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.';
+$lang['resendpwdconfirm'] = 'Autorizačný odkaz bol zaslaný na e-mail.';
+$lang['resendpwdsuccess'] = 'Vaše nové heslo bolo zaslané na e-mail.';
+$lang['license'] = 'Ak nie je uvedené inak, obsah tejto wiki je uverejnený pod nasledujúcou licenciou:';
+$lang['licenseok'] = 'Poznámka: Zmenou tejto stránky súhlasíte s uverejnením obsahu pod nasledujúcou licenciou:';
+$lang['searchmedia'] = 'Hľadať meno súboru:';
+$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['rssfailed'] = 'Nastala chyba pri vytváraní tohto RSS: ';
$lang['nothingfound'] = 'Nič nenájdené.';
$lang['mediaselect'] = 'Výber súboru';
@@ -187,8 +208,10 @@ $lang['diff_side'] = 'Vedľa seba';
$lang['diffprevrev'] = 'Predchádzajúca revízia';
$lang['diffnextrev'] = 'Nasledujúca revízia';
$lang['difflastrev'] = 'Posledná revízia';
+$lang['diffbothprevrev'] = 'Obojstranná predošlá revízia';
+$lang['diffbothnextrev'] = 'Obojstranná nasledujúca revízia';
$lang['line'] = 'Riadok';
-$lang['breadcrumb'] = 'História:';
+$lang['breadcrumb'] = 'Cesta:';
$lang['youarehere'] = 'Nachádzate sa:';
$lang['lastmod'] = 'Posledná úprava:';
$lang['by'] = 'od';
@@ -335,6 +358,7 @@ $lang['currentns'] = 'Aktuálny menný priestor';
$lang['searchresult'] = 'Výsledky hľadania';
$lang['plainhtml'] = 'Jednoduché HTML';
$lang['wikimarkup'] = 'Wiki formát';
+$lang['page_nonexist_rev'] = 'Stránka %s neexistovala. Bola vytvorená dodatočne <a href="%s">%s</a>.';
$lang['unable_to_parse_date'] = 'Nie je možné spracovať parameter "%s".';
$lang['email_signature_text'] = 'Táto správa bola zaslaná DokuWiki
@DOKUWIKIURL@';
diff --git a/inc/lang/sk/newpage.txt b/inc/lang/sk/newpage.txt
index 180d80ee1..e4f654c27 100644
--- a/inc/lang/sk/newpage.txt
+++ b/inc/lang/sk/newpage.txt
@@ -1,3 +1,3 @@
====== Stránka s týmto názvom ešte neexistuje ======
-Odkaz vás zaviedol na stránku, ktorá ešte neexistuje. Môžete ju vytvoriť stlačením tlačítka ''Vytvoriť stránku''.
+Odkaz vás zaviedol na stránku, ktorá ešte neexistuje. Môžete ju vytvoriť stlačením tlačítka **Vytvoriť stránku**.
diff --git a/inc/lang/sk/onceexisted.txt b/inc/lang/sk/onceexisted.txt
new file mode 100644
index 000000000..7e4ead1d6
--- /dev/null
+++ b/inc/lang/sk/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Táto stránka už neexistuje ======
+
+Klikli ste na odkaz k stránke, ktorá už neexistuje. Môžete skontrolovať zoznam [[?do=revisions|predošlých revízií]] a zistíte, kedy a prečo bola stránka zmazaná. Tiež získate prístup k predošlým revíziám a môžete ich obnoviť. \ No newline at end of file
diff --git a/inc/lang/sk/preview.txt b/inc/lang/sk/preview.txt
index 871bca371..446f80271 100644
--- a/inc/lang/sk/preview.txt
+++ b/inc/lang/sk/preview.txt
@@ -1,3 +1,3 @@
====== Náhľad ======
-Tu je náhľad, ako bude dokument vyzerať. Pozor: Súbor zatiaľ **nie je uložený**!
+Tu je náhľad, ako bude dokument vyzerať. **Pozor: Súbor zatiaľ nie je uložený**!
diff --git a/inc/lang/sk/pwconfirm.txt b/inc/lang/sk/pwconfirm.txt
index f8ba97adf..ee0178d99 100644
--- a/inc/lang/sk/pwconfirm.txt
+++ b/inc/lang/sk/pwconfirm.txt
@@ -1,11 +1,9 @@
Ahoj @FULLNAME@!
-Niekto žiadal o nové heslo pre vaše @TITLE@
-konto na @DOKUWIKIURL@
+Niekto žiadal o nové heslo pre vaše @TITLE@ konto na @DOKUWIKIURL@
Ak ste nežiadali o nové heslo, potom iba ignorujte tento mail.
-Pre potvrdenie, že požiadavka bola skutočne odoslaná vami,
-použite prosím nasledujúci odkaz.
+Pre potvrdenie, že požiadavka bola skutočne odoslaná vami, použite prosím nasledujúci odkaz.
@CONFIRM@
diff --git a/inc/lang/sk/read.txt b/inc/lang/sk/read.txt
index 64b7ed26e..72fc096a9 100644
--- a/inc/lang/sk/read.txt
+++ b/inc/lang/sk/read.txt
@@ -1,2 +1 @@
Táto stránka je iba na čítanie. Môžete si prehliadnuť zdrojový kód, ale nemôžete ho meniť. Opýtajte sa správcu, ak si myslíte, že niečo nie je v poriadku.
-
diff --git a/inc/lang/sk/recent.txt b/inc/lang/sk/recent.txt
index d9f7c3b9b..3f5b75301 100644
--- a/inc/lang/sk/recent.txt
+++ b/inc/lang/sk/recent.txt
@@ -1,3 +1,3 @@
====== Posledné úpravy ======
-Nasledujúce stránky boli nedávno zmenené.
+Nasledujúce stránky boli nedávno zmenené:
diff --git a/inc/lang/sk/resendpwd.txt b/inc/lang/sk/resendpwd.txt
index 143706b72..d8d37cd5b 100644
--- a/inc/lang/sk/resendpwd.txt
+++ b/inc/lang/sk/resendpwd.txt
@@ -1,3 +1,3 @@
====== Poslať nové heslo ======
-Zadajte prosím vaše prihlasovacie meno do formulára za účelom vygenerovania nového hesla. Autorizačný odkaz bude zaslaný na vašu zaregistrovanú email adresu. \ No newline at end of file
+Zadajte prosím vaše prihlasovacie meno do formulára za účelom vygenerovania nového hesla. Autorizačný odkaz bude zaslaný na vašu zaregistrovanú email adresu.
diff --git a/inc/lang/sk/searchpage.txt b/inc/lang/sk/searchpage.txt
index 5905db664..1f6d4fc10 100644
--- a/inc/lang/sk/searchpage.txt
+++ b/inc/lang/sk/searchpage.txt
@@ -1,4 +1,3 @@
====== Vyhľadávanie ======
Výsledky hľadania môžete vidieť nižšie. @CREATEPAGEINFO@
-
diff --git a/inc/lang/sk/stopwords.txt b/inc/lang/sk/stopwords.txt
index 060ee495f..fa78362ff 100644
--- a/inc/lang/sk/stopwords.txt
+++ b/inc/lang/sk/stopwords.txt
@@ -24,5 +24,3 @@ moji
náš
váš
www
-
-
diff --git a/inc/lang/sk/updateprofile.txt b/inc/lang/sk/updateprofile.txt
index 33b5e5b78..19ada24d1 100644
--- a/inc/lang/sk/updateprofile.txt
+++ b/inc/lang/sk/updateprofile.txt
@@ -1,6 +1,3 @@
====== Zmena vášho používateľského profilu ======
Potrebujete vyplniť len tie polia, ktoré chcete zmeniť. Nemôžete zmeniť prihlasovacie meno.
-
-
-
diff --git a/inc/lang/sl/denied.txt b/inc/lang/sl/denied.txt
index 206e167bb..10783e550 100644
--- a/inc/lang/sl/denied.txt
+++ b/inc/lang/sl/denied.txt
@@ -1,4 +1,3 @@
====== Ni ustreznih dovoljenj ======
Za nadaljevanje opravila je treba imeti ustrezna dovoljenja.
-
diff --git a/inc/lang/sl/draft.txt b/inc/lang/sl/draft.txt
index b3fe4de35..72d449d36 100644
--- a/inc/lang/sl/draft.txt
+++ b/inc/lang/sl/draft.txt
@@ -2,4 +2,4 @@
Zadnja seja te strani ni bila pravilno zaključena. Sistem DokuWiki je samodejno shranil osnutek strani, ki ga je mogoče naprej urejati. Spodaj so navedeni podatki samodejnega shranjevanja zadnje seje.
-Vsebino osnutka je mogoče //obnoviti// na zadnjo sejo, //izbrisati// samodejno shranjen osnutek ali pa //prekiniti// urejanje. \ No newline at end of file
+Vsebino osnutka je mogoče //obnoviti// na zadnjo sejo, //izbrisati// samodejno shranjen osnutek ali pa //prekiniti// urejanje.
diff --git a/inc/lang/sl/editrev.txt b/inc/lang/sl/editrev.txt
index baaacd270..cf348fa44 100644
--- a/inc/lang/sl/editrev.txt
+++ b/inc/lang/sl/editrev.txt
@@ -1,2 +1,2 @@
**Naložena je stara različica dokumenta!** V kolikor staro različico shranite, bo shranjena kot najnovejša različica.
----- \ No newline at end of file
+----
diff --git a/inc/lang/sl/index.txt b/inc/lang/sl/index.txt
index dd54d2bed..4da7b80fe 100644
--- a/inc/lang/sl/index.txt
+++ b/inc/lang/sl/index.txt
@@ -1,4 +1,3 @@
====== Kazalo ======
Na spodnjem seznamu so izpisane vse wiki strani, ki so na voljo, razvrščene pa so po posameznih [[doku>namespaces|imenskih prostorih]].
-
diff --git a/inc/lang/sl/install.html b/inc/lang/sl/install.html
index a00833405..7c2be7f4f 100644
--- a/inc/lang/sl/install.html
+++ b/inc/lang/sl/install.html
@@ -1,20 +1,7 @@
-<p>Stran je namenjena pomoči pri prvi namestitvi in nastavitvi spletišča
-<a href="http://dokuwiki.org">Dokuwiki</a>. Več podrobnosti o tem je mogoče najti na straneh dokumentacije
-<a href="http://dokuwiki.org/installer">namestitve</a>.</p>
+<p>Stran je namenjena pomoči pri prvi namestitvi in nastavitvi spletišča <a href="http://dokuwiki.org">Dokuwiki</a>. Več podrobnosti o tem je mogoče najti na straneh dokumentacije <a href="http://dokuwiki.org/installer">namestitve</a>.</p>
-<p>Sistem DokuWiki uporablja običajne besedilne datoteke za shranjevanje
-wiki strani in drugih podrobnosti o teh straneh (npr. slike, kazalo, stare
-različice in drugo). Za pravilno delovanje <strong>mora</strong> imeti sistem DokuWiki prost
-dostop do map in datotek, zato je ključno, da so dovoljenja določena pravilno.
-Z namestilnikom ni mogoče spreminjanje dovoljenj map. To je običajno najlažje
-narediti v ukazni lupini ali pa, če spletišče Wiki gostuje na zunanjih
-strežnikih, preko nadzornika FTP povezave (npr. cPanel).</p>
+<p>Sistem DokuWiki uporablja običajne besedilne datoteke za shranjevanje wiki strani in drugih podrobnosti o teh straneh (npr. slike, kazalo, stare različice in drugo). Za pravilno delovanje <strong>mora</strong> imeti sistem DokuWiki prost dostop do map in datotek, zato je ključno, da so dovoljenja določena pravilno. Z namestilnikom ni mogoče spreminjanje dovoljenj map. To je običajno najlažje 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
-<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>
+<p>Z namestilnikom lahko spremenite nastavitve dostopa sistema Dokuwiki <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>
-<p>Zahtevnejši uporabniki ali skrbniki s posebnimi zahtevami namestitve sistema
-si lahko več podrobnosti ogledajo na straneh <a href="http://dokuwiki.org/install">navodil namestitve</a> in <a href="http://dokuwiki.org/config">nastavitve</a>.</p> \ No newline at end of file
+<p>Zahtevnejši uporabniki ali skrbniki s posebnimi zahtevami namestitve sistema si lahko več podrobnosti ogledajo na straneh <a href="http://dokuwiki.org/install">navodil namestitve</a> in <a href="http://dokuwiki.org/config">nastavitve</a>.</p>
diff --git a/inc/lang/sl/lang.php b/inc/lang/sl/lang.php
index 213e0f83a..913fb5e97 100644
--- a/inc/lang/sl/lang.php
+++ b/inc/lang/sl/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleš Milošič <ales.milosic@gmail.com>
* @author Simon <sbx@protonmail.ch>
* @author Jaka Kranjc <lynxlupodian@hotmail.com>
* @author Boštjan Seničar <senicar@gmail.com>
@@ -71,40 +72,7 @@ $lang['badpassconfirm'] = 'Napaka! Geslo ni pravo.';
$lang['minoredit'] = 'Manjše spremembe';
$lang['draftdate'] = 'Samodejno shranjevanje osnutka je omogočeno';
$lang['nosecedit'] = 'Stran je bila v vmesnem času spremenjena. Podatki strani so bili zastareli, zato se je celotna vsebina naložila znova.';
-$lang['regmissing'] = 'Izpolniti je treba vsa polja.';
-$lang['reguexists'] = 'Uporabnik s tem imenom že obstaja.';
-$lang['regsuccess'] = 'Uporabniški račun je uspešno ustvarjen. Geslo je bilo poslano na naveden elektronski naslov.';
-$lang['regsuccess2'] = 'Uporabniški račun je uspešno ustvarjen.';
-$lang['regmailfail'] = 'Videti je, da je prišlo do napake med pošiljanjem gesla. Stopite v stik s skrbnikom sistema!';
-$lang['regbadmail'] = 'Videti je, da je naveden elektronski naslov neveljaven - v kolikor je to napaka, stopite v stik s skrbnikom sistema.';
-$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'] = '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['profnodelete'] = 'Ni omogočena podpora za brisanje uporabnikov.';
-$lang['profdeleteuser'] = 'Izbriši račun';
-$lang['profdeleted'] = 'Uporabniški račun je izbrisan.';
-$lang['profconfdeletemissing'] = 'Potrditveno okno ni označeno';
-$lang['pwdforget'] = 'Ali ste pozabili geslo? Pridobite si novo geslo.';
-$lang['resendna'] = 'DokuWiki ne podpira možnosti ponovnega pošiljanja gesel.';
-$lang['resendpwd'] = 'Nastavi novo geslo za';
-$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.';
-$lang['resendpwdconfirm'] = 'Povezava za potrditev računa je bila poslana na elektronski naslov.';
-$lang['resendpwdsuccess'] = 'Novo geslo je bilo poslano na elektronski naslov.';
-$lang['license'] = 'V kolikor ni posebej določeno, je vsebina Wiki strani objavljena pod pogoji dovoljenja:';
-$lang['licenseok'] = 'Opomba: z urejanjem vsebine strani, se strinjate z objavo pod pogoji dovoljenja:';
-$lang['searchmedia'] = 'Poišči ime datoteke:';
-$lang['searchmedia_in'] = 'Poišči v %s';
-$lang['txt_upload'] = 'Izberite datoteko za pošiljanje:';
-$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['searchcreatepage'] = 'Če nisi našel tega kar iščeš, lahko ustvariš ali urediš stran %s, ki bo poimenovana po vašem iskalnem pojmu.';
$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';
@@ -145,6 +113,40 @@ $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['regmissing'] = 'Izpolniti je treba vsa polja.';
+$lang['reguexists'] = 'Uporabnik s tem imenom že obstaja.';
+$lang['regsuccess'] = 'Uporabniški račun je uspešno ustvarjen. Geslo je bilo poslano na naveden elektronski naslov.';
+$lang['regsuccess2'] = 'Uporabniški račun je uspešno ustvarjen.';
+$lang['regmailfail'] = 'Videti je, da je prišlo do napake med pošiljanjem gesla. Stopite v stik s skrbnikom sistema!';
+$lang['regbadmail'] = 'Videti je, da je naveden elektronski naslov neveljaven - v kolikor je to napaka, stopite v stik s skrbnikom sistema.';
+$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'] = '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['profnodelete'] = 'Ni omogočena podpora za brisanje uporabnikov.';
+$lang['profdeleteuser'] = 'Izbriši račun';
+$lang['profdeleted'] = 'Uporabniški račun je izbrisan.';
+$lang['profconfdeletemissing'] = 'Potrditveno okno ni označeno';
+$lang['pwdforget'] = 'Ali ste pozabili geslo? Pridobite si novo geslo.';
+$lang['resendna'] = 'DokuWiki ne podpira možnosti ponovnega pošiljanja gesel.';
+$lang['resendpwd'] = 'Nastavi novo geslo za';
+$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.';
+$lang['resendpwdconfirm'] = 'Povezava za potrditev računa je bila poslana na elektronski naslov.';
+$lang['resendpwdsuccess'] = 'Novo geslo je bilo poslano na elektronski naslov.';
+$lang['license'] = 'V kolikor ni posebej določeno, je vsebina Wiki strani objavljena pod pogoji dovoljenja:';
+$lang['licenseok'] = 'Opomba: z urejanjem vsebine strani, se strinjate z objavo pod pogoji dovoljenja:';
+$lang['searchmedia'] = 'Poišči ime datoteke:';
+$lang['searchmedia_in'] = 'Poišči v %s';
+$lang['txt_upload'] = 'Izberite datoteko za pošiljanje:';
+$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['rssfailed'] = 'Prišlo je do napake med pridobivanjem vira: ';
$lang['nothingfound'] = 'Ni najdenih predmetov.';
$lang['mediaselect'] = 'Predstavne datoteke';
diff --git a/inc/lang/sl/newpage.txt b/inc/lang/sl/newpage.txt
index 2f11bbf55..8c630428a 100644
--- a/inc/lang/sl/newpage.txt
+++ b/inc/lang/sl/newpage.txt
@@ -1,3 +1,3 @@
====== Stran še ne obstaja ======
-Sledili ste povezavi na stran, ki še ne obstaja. Stran je mogoče ustvariti preko povezave ''Ustvari stran''.
+Sledili ste povezavi na stran, ki še ne obstaja. Stran je mogoče ustvariti preko povezave **Ustvari stran**.
diff --git a/inc/lang/sl/preview.txt b/inc/lang/sl/preview.txt
index c49de6617..ab8e5f7d1 100644
--- a/inc/lang/sl/preview.txt
+++ b/inc/lang/sl/preview.txt
@@ -1,3 +1,3 @@
====== Predogled ======
-Prikazan je predogled strani. Stran še ni shranjena!
+Prikazan je predogled strani. **Stran še ni shranjena**!
diff --git a/inc/lang/sl/pwconfirm.txt b/inc/lang/sl/pwconfirm.txt
index 33f478714..109acb5c8 100644
--- a/inc/lang/sl/pwconfirm.txt
+++ b/inc/lang/sl/pwconfirm.txt
@@ -3,6 +3,7 @@ Pozdravljeni, @FULLNAME@!
S podatki vašega imena je bila poslana zahteva za pridobitev novega gesla za uporabniško ime @TITLE@ na wiki spletišču @DOKUWIKIURL@.
- V kolikor novega gesla niste zahtevali, prezrite to sporočilo.
+
- Za potrditev zahteve za pridobitev novega gesla, kliknite spodnjo povezavo.
@CONFIRM@
diff --git a/inc/lang/sl/read.txt b/inc/lang/sl/read.txt
index 5ba9a2eb0..44f31624c 100644
--- a/inc/lang/sl/read.txt
+++ b/inc/lang/sl/read.txt
@@ -1,2 +1 @@
Stran je odprta z dovoljenji le za branje. Dovoljeno je ogledati si izvorno kodo strani, vsebine pa ni mogoče spreminjati. Za več podrobnosti stopite v stik s skrbnikom sistema.
-
diff --git a/inc/lang/sl/recent.txt b/inc/lang/sl/recent.txt
index 282a492be..ee903a8a8 100644
--- a/inc/lang/sl/recent.txt
+++ b/inc/lang/sl/recent.txt
@@ -1,3 +1,3 @@
====== Nedavne spremembe ======
-Izpisane wiki strani so bile nedavno spremenjene.
+Izpisane wiki strani so bile nedavno spremenjene:
diff --git a/inc/lang/sl/resetpwd.txt b/inc/lang/sl/resetpwd.txt
index c2a81ab9a..87110277b 100644
--- a/inc/lang/sl/resetpwd.txt
+++ b/inc/lang/sl/resetpwd.txt
@@ -1 +1,3 @@
-====== Nastavitev novega gesla ======<br><br>Vnesite novo geslo za račun Wiki. \ No newline at end of file
+====== Nastavitev novega gesla ======
+
+Vnesite novo geslo za račun Wiki.
diff --git a/inc/lang/sl/searchpage.txt b/inc/lang/sl/searchpage.txt
index d19d5e275..f47f7654d 100644
--- a/inc/lang/sl/searchpage.txt
+++ b/inc/lang/sl/searchpage.txt
@@ -1,4 +1,3 @@
====== Iskanje ======
Spodaj so izpisani rezultati iskanja. @CREATEPAGEINFO@
-
diff --git a/inc/lang/sl/stopwords.txt b/inc/lang/sl/stopwords.txt
index 8eed2daa6..31f27917f 100644
--- a/inc/lang/sl/stopwords.txt
+++ b/inc/lang/sl/stopwords.txt
@@ -16,3 +16,4 @@ njihova
njihove
njihovi
njihovo
+www
diff --git a/inc/lang/sl/updateprofile.txt b/inc/lang/sl/updateprofile.txt
index 5e939f2f2..18b9d2537 100644
--- a/inc/lang/sl/updateprofile.txt
+++ b/inc/lang/sl/updateprofile.txt
@@ -1,3 +1,3 @@
===== Posodabljanje računa =====
-Posodobiti ali spremeniti je mogoče le nekatere podatke. Uporabniškega imena ni mogoče spremeniti. \ No newline at end of file
+Posodobiti ali spremeniti je mogoče le nekatere podatke. Uporabniškega imena ni mogoče spremeniti.
diff --git a/inc/lang/sq/admin.txt b/inc/lang/sq/admin.txt
index 6edbf8a19..fc12524cd 100644
--- a/inc/lang/sq/admin.txt
+++ b/inc/lang/sq/admin.txt
@@ -1,3 +1,3 @@
====== Administrimi ======
-Poshtë është një listë e punëve administrative të disponueshme në DokuWiki. \ No newline at end of file
+Poshtë është një listë e punëve administrative të disponueshme në DokuWiki.
diff --git a/inc/lang/sq/backlinks.txt b/inc/lang/sq/backlinks.txt
index b25df00be..70035aee5 100644
--- a/inc/lang/sq/backlinks.txt
+++ b/inc/lang/sq/backlinks.txt
@@ -1,3 +1,3 @@
====== Linke të kthyeshëm ======
-Kjo është një listë e faqeve që duket se lidhen mbrapsht te kjo faqe aktuale. \ No newline at end of file
+Kjo është një listë e faqeve që duket se lidhen mbrapsht te kjo faqe aktuale.
diff --git a/inc/lang/sq/conflict.txt b/inc/lang/sq/conflict.txt
index 9c6cc940d..4edf8147f 100644
--- a/inc/lang/sq/conflict.txt
+++ b/inc/lang/sq/conflict.txt
@@ -2,4 +2,4 @@
Ekziston një version më i ri i dokumentit që ju redaktuat. Kjo ndodh kur një përdorues tjetër e ndryshoi dokumentin ndërkohë që ju po e redaktonit atë.
-Gjeni ndryshimet e treguara më poshtë dhe pastaj vendosni se kë version doni të mbani. Nëse zgjidhni "ruaj", versioni juaj do të ruhet. Klikon "fshi" për të mbajtur versioni aktual. \ No newline at end of file
+Gjeni ndryshimet e treguara më poshtë dhe pastaj vendosni se kë version doni të mbani. Nëse zgjidhni "ruaj", versioni juaj do të ruhet. Klikon "fshi" për të mbajtur versioni aktual.
diff --git a/inc/lang/sq/denied.txt b/inc/lang/sq/denied.txt
index 60aa05e55..25de5089f 100644
--- a/inc/lang/sq/denied.txt
+++ b/inc/lang/sq/denied.txt
@@ -1,4 +1,3 @@
====== Leja Refuzohet ======
Na vjen keq, ju nuk keni të drejta të mjaftueshme për të vazhduar.
-
diff --git a/inc/lang/sq/diff.txt b/inc/lang/sq/diff.txt
index ab03a283f..d68c984e2 100644
--- a/inc/lang/sq/diff.txt
+++ b/inc/lang/sq/diff.txt
@@ -1,3 +1,3 @@
====== Ndryshimet ======
-Kjo tregon ndryshimet midis dy versioneve të faqes. \ No newline at end of file
+Kjo tregon ndryshimet midis dy versioneve të faqes.
diff --git a/inc/lang/sq/draft.txt b/inc/lang/sq/draft.txt
index 80634a780..13b425660 100644
--- a/inc/lang/sq/draft.txt
+++ b/inc/lang/sq/draft.txt
@@ -2,4 +2,4 @@
Sesioni juaj i fundit i redaktimit në këtë faqe nuk përfundoi me sukses. DokuWiki ruajti automatikisht një skicë gjatë punës tuaj të cilën mund ta përdorni tani për të vazhduar redaktimin tuaj. Më poshtë mund të shihni të dhënat që janë ruajtur nga sesioni juaj i fundit.
-Ju lutem vendosni nëse doni të //rekuperoni// sesionin tuaj të humbur të redaktimit, //fshini// skicën e ruajtur automatikisht ose //dilni// nga proçesi i redaktimit. \ No newline at end of file
+Ju lutem vendosni nëse doni të //rekuperoni// sesionin tuaj të humbur të redaktimit, //fshini// skicën e ruajtur automatikisht ose //dilni// nga proçesi i redaktimit.
diff --git a/inc/lang/sq/edit.txt b/inc/lang/sq/edit.txt
index 1f038ead7..d48c35484 100644
--- a/inc/lang/sq/edit.txt
+++ b/inc/lang/sq/edit.txt
@@ -1 +1 @@
-Redaktoni faqen dhe shtypni "Ruaj". Shikoni [[wiki:syntax]] për sintaksën e Wiki-t. Nëse doni të provoni disa gjëra, mësoni të hidhni hapat e parë në [[playground:playground|playground]]. \ No newline at end of file
+Redaktoni faqen dhe shtypni "Ruaj". Shikoni [[wiki:syntax]] për sintaksën e Wiki-t. Nëse doni të provoni disa gjëra, mësoni të hidhni hapat e parë në [[playground:playground|playground]].
diff --git a/inc/lang/sq/editrev.txt b/inc/lang/sq/editrev.txt
index 08792eafb..941be3948 100644
--- a/inc/lang/sq/editrev.txt
+++ b/inc/lang/sq/editrev.txt
@@ -1,2 +1,2 @@
**Keni ngarkuar një rishikim të vjetër të dokumentit!** Nëse e ruani, do të krijoni një version të ri me këto të dhëna.
----- \ No newline at end of file
+----
diff --git a/inc/lang/sq/index.txt b/inc/lang/sq/index.txt
index 6daef1c30..f17dca95b 100644
--- a/inc/lang/sq/index.txt
+++ b/inc/lang/sq/index.txt
@@ -1,3 +1,3 @@
====== Index ======
-Ky është një index mbi të gjitha faqet e disponueshme të renditura sipas [[doku>namespaces|namespaces]]. \ No newline at end of file
+Ky është një index mbi të gjitha faqet e disponueshme të renditura sipas [[doku>namespaces|namespaces]].
diff --git a/inc/lang/sq/install.html b/inc/lang/sq/install.html
index bad30b1bc..14546286d 100644
--- a/inc/lang/sq/install.html
+++ b/inc/lang/sq/install.html
@@ -2,7 +2,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 <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>Ky installer do të instalojë konfigurimin e DokuWiki-t tuaj 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
+<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>
diff --git a/inc/lang/sq/locked.txt b/inc/lang/sq/locked.txt
index 8c86c8be0..7f97f3854 100644
--- a/inc/lang/sq/locked.txt
+++ b/inc/lang/sq/locked.txt
@@ -1,3 +1,3 @@
====== Faqe e kyçur ======
-Kjo faqe është përkohësisht e kyçur për redaktim nga një përdorues tjetër. Duhet të prisni derisa ky përdorues të mbarojë redaktimin ose çelësi të skadojë. \ No newline at end of file
+Kjo faqe është përkohësisht e kyçur për redaktim nga një përdorues tjetër. Duhet të prisni derisa ky përdorues të mbarojë redaktimin ose çelësi të skadojë.
diff --git a/inc/lang/sq/login.txt b/inc/lang/sq/login.txt
index 843e47652..93510a946 100644
--- a/inc/lang/sq/login.txt
+++ b/inc/lang/sq/login.txt
@@ -1,3 +1,3 @@
====== Hyrje ======
-Momentalisht nuk jeni të futur në Wiki! Futni informacionet tuaja të autentikimit më poshtë për të hyrë. Duhet t'i keni cookies të aktivizuara për të hyrë. \ No newline at end of file
+Momentalisht nuk jeni të futur në Wiki! Futni informacionet tuaja të autentikimit më poshtë për të hyrë. Duhet t'i keni cookies të aktivizuara për të hyrë.
diff --git a/inc/lang/sq/newpage.txt b/inc/lang/sq/newpage.txt
index 1db750d00..49bb3b6d3 100644
--- a/inc/lang/sq/newpage.txt
+++ b/inc/lang/sq/newpage.txt
@@ -1,3 +1,3 @@
====== Kjo temë nuk ekziston ende ======
-Keni ndjekur një link për në një temë që nuk ekziston ende. Nëse ua lejojnë të drejtat, mund ta krijoni duke klikuar butonin "Krijo këtë faqe". \ No newline at end of file
+Keni ndjekur një link për në një temë që nuk ekziston ende. Nëse ua lejojnë të drejtat, mund ta krijoni duke klikuar butonin **Krijo këtë faqe**.
diff --git a/inc/lang/sq/norev.txt b/inc/lang/sq/norev.txt
index 0e73223a9..df87903b5 100644
--- a/inc/lang/sq/norev.txt
+++ b/inc/lang/sq/norev.txt
@@ -1,3 +1,3 @@
====== Nuk ekzistion një rishikim i tillë ======
-Rishikimi i specifikuar nuk ekziston. Përdor buttonin "Rishikime të vjetra" për një listë të rishikimeve të vjetra të këtij dokumenti. \ No newline at end of file
+Rishikimi i specifikuar nuk ekziston. Përdor buttonin "Rishikime të vjetra" për një listë të rishikimeve të vjetra të këtij dokumenti.
diff --git a/inc/lang/sq/preview.txt b/inc/lang/sq/preview.txt
index 07148b842..7a6a27cfa 100644
--- a/inc/lang/sq/preview.txt
+++ b/inc/lang/sq/preview.txt
@@ -1,3 +1,3 @@
====== Shikim Paraprak ======
-Ky është një shikim paraprak i tekstit tuaj. Kujtohuni: **Nuk** është ruajtur ende! \ No newline at end of file
+Ky është një shikim paraprak i tekstit tuaj. **Kujtohuni: Nuk është ruajtur ende**!
diff --git a/inc/lang/sq/read.txt b/inc/lang/sq/read.txt
index cbb028048..f6593fcb8 100644
--- a/inc/lang/sq/read.txt
+++ b/inc/lang/sq/read.txt
@@ -1 +1 @@
-Kjo faqe është vetëm për lexim. Mund të shihni kodin burim, por nuk mund ta ndryshoni atë. Kontaktoni administratorin nëse mendoni se kjo është e gabuar. \ No newline at end of file
+Kjo faqe është vetëm për lexim. Mund të shihni kodin burim, por nuk mund ta ndryshoni atë. Kontaktoni administratorin nëse mendoni se kjo është e gabuar.
diff --git a/inc/lang/sq/recent.txt b/inc/lang/sq/recent.txt
index 4b3bdf48d..c5754afaf 100644
--- a/inc/lang/sq/recent.txt
+++ b/inc/lang/sq/recent.txt
@@ -1,3 +1,3 @@
====== Ndryshimet e kohëve të fundit ======
-Faqet e mëposhtme janë ndryshuar së fundmi. \ No newline at end of file
+Faqet e mëposhtme janë ndryshuar së fundmi:
diff --git a/inc/lang/sq/register.txt b/inc/lang/sq/register.txt
index d4a3ca36b..c8813dd12 100644
--- a/inc/lang/sq/register.txt
+++ b/inc/lang/sq/register.txt
@@ -1,3 +1,3 @@
====== Regjistrohuni si një përdorues i ri ======
-Plotësoni të gjitha informacionet e mëposhtme për të krijuar një llogari në këtë wiki. Sigorohuni që të jepni një **adresë email-i të vlefshme**. Nëse nuk ju kërkohet të futni një fjalëkalim këtu, një fjalëkalim i ri do t'ju dërgohet në adresën e email-it që specifikuat. Emri i hyrjes duhet të një [[doku>pagename|pagename]] e vlefshme. \ No newline at end of file
+Plotësoni të gjitha informacionet e mëposhtme për të krijuar një llogari në këtë wiki. Sigorohuni që të jepni një **adresë email-i të vlefshme**. Nëse nuk ju kërkohet të futni një fjalëkalim këtu, një fjalëkalim i ri do t'ju dërgohet në adresën e email-it që specifikuat. Emri i hyrjes duhet të një [[doku>pagename|pagename]] e vlefshme.
diff --git a/inc/lang/sq/resendpwd.txt b/inc/lang/sq/resendpwd.txt
index 79d0b3e8e..8a98a7485 100644
--- a/inc/lang/sq/resendpwd.txt
+++ b/inc/lang/sq/resendpwd.txt
@@ -1,3 +1,3 @@
====== Dërgo fjalëkalim të ri ======
-Ju lutemi futni emrin tuaj të përdorimit në formën e mëposhtme për të kërkuar një fjalëkalim të ri për llogarinë tuaj në këtë wiki. Një link konfirmimi do të dërgohet në adresën tuaj të eMail-it. \ No newline at end of file
+Ju lutemi futni emrin tuaj të përdorimit në formën e mëposhtme për të kërkuar një fjalëkalim të ri për llogarinë tuaj në këtë wiki. Një link konfirmimi do të dërgohet në adresën tuaj të eMail-it.
diff --git a/inc/lang/sq/searchpage.txt b/inc/lang/sq/searchpage.txt
index 4c72f22db..d3adfd956 100644
--- a/inc/lang/sq/searchpage.txt
+++ b/inc/lang/sq/searchpage.txt
@@ -1,4 +1,3 @@
====== Kërko ======
Mund të gjeni rezultatet e kërkimit tuaj më poshtë. @CREATEPAGEINFO@
-
diff --git a/inc/lang/sq/showrev.txt b/inc/lang/sq/showrev.txt
index 9c1f761dc..16b5fd9ed 100644
--- a/inc/lang/sq/showrev.txt
+++ b/inc/lang/sq/showrev.txt
@@ -1,2 +1,2 @@
**Ky është një rishikim i vjetër i dokumentit!**
----- \ No newline at end of file
+----
diff --git a/inc/lang/sq/stopwords.txt b/inc/lang/sq/stopwords.txt
index e35669410..d5acd7fdb 100644
--- a/inc/lang/sq/stopwords.txt
+++ b/inc/lang/sq/stopwords.txt
@@ -36,4 +36,4 @@ will
with
und
the
-www \ No newline at end of file
+www
diff --git a/inc/lang/sq/updateprofile.txt b/inc/lang/sq/updateprofile.txt
index ba76beb1f..a24060310 100644
--- a/inc/lang/sq/updateprofile.txt
+++ b/inc/lang/sq/updateprofile.txt
@@ -1,3 +1,3 @@
====== Përditësoni profilin e llogarisë tuaj ======
-Duhet vetëm të plotësoni ato fusha që doni të ndryshoni. Mund të mos e ndryshoni emrin tuaj të përdoruesit. \ No newline at end of file
+Duhet vetëm të plotësoni ato fusha që doni të ndryshoni. Mund të mos e ndryshoni emrin tuaj të përdoruesit.
diff --git a/inc/lang/sr/admin.txt b/inc/lang/sr/admin.txt
index 1e42970d3..284410b4b 100644
--- a/inc/lang/sr/admin.txt
+++ b/inc/lang/sr/admin.txt
@@ -1,4 +1,3 @@
====== Администрација ======
-Изпод се налази листа доступних администраторских опција у DokuWiki-ју.
-
+Испод се налази листа доступних администраторских опција у DokuWiki-ју.
diff --git a/inc/lang/sr/backlinks.txt b/inc/lang/sr/backlinks.txt
index dae8d5ab2..a02dc4af0 100644
--- a/inc/lang/sr/backlinks.txt
+++ b/inc/lang/sr/backlinks.txt
@@ -1,4 +1,3 @@
====== Повратне везе ======
Ово је листа страница које имају везе ка тренутној страници.
-
diff --git a/inc/lang/sr/conflict.txt b/inc/lang/sr/conflict.txt
index 2a1427ec4..4f53a0d1b 100644
--- a/inc/lang/sr/conflict.txt
+++ b/inc/lang/sr/conflict.txt
@@ -3,4 +3,3 @@
Постоји новија верзија документа који сте изменили. Ово се дешава када неки други корисник измени документ док га Ви још увек мењате.
Проучите разлике које су доле детаљно приказане, па након тога одлучите коју верзију желите да задржите. Ако изаберете ''сачувај'', Ваша верзија ће да буде сачувана. Ако изаберите ''поништи'', тренутна верзија ће да буде сачувана.
-
diff --git a/inc/lang/sr/denied.txt b/inc/lang/sr/denied.txt
index 521c28453..4b72917a6 100644
--- a/inc/lang/sr/denied.txt
+++ b/inc/lang/sr/denied.txt
@@ -1,4 +1,3 @@
====== Забрањен приступ ======
Извините, али немате довољно права да наставите.
-
diff --git a/inc/lang/sr/diff.txt b/inc/lang/sr/diff.txt
index 39b7427ec..d410c0476 100644
--- a/inc/lang/sr/diff.txt
+++ b/inc/lang/sr/diff.txt
@@ -1,4 +1,3 @@
====== Разлике ======
Овде су приказане разлике између изабране ревизије и тренутне верзије странице.
-
diff --git a/inc/lang/sr/draft.txt b/inc/lang/sr/draft.txt
index 44affdd34..65e7b26e2 100644
--- a/inc/lang/sr/draft.txt
+++ b/inc/lang/sr/draft.txt
@@ -2,4 +2,4 @@
Прошли пут кад сте покушали нешто да измените на овој страници ваше измене нису успешно сачуване. DokuWiki је аутоматски сачувао скицу вашег рада коју сада можете да искористите да бисте наставили са изменама. Испод можете да видите податке који су сачувани током ваше последње посете.
-Молимо вас, одаберите да ли желите да //повратите// ваше измене, //обришете// аутоматски сачувану скицу, или //поништите// цео процес измена. \ No newline at end of file
+Молимо вас, одаберите да ли желите да //повратите// ваше измене, //обришете// аутоматски сачувану скицу, или //поништите// цео процес измена.
diff --git a/inc/lang/sr/edit.txt b/inc/lang/sr/edit.txt
index 2d6fa7b8e..7ccf5fec3 100644
--- a/inc/lang/sr/edit.txt
+++ b/inc/lang/sr/edit.txt
@@ -1,2 +1 @@
Измените ову страницу и притисните ''Сачувај''. Погледајте [[wiki:syntax]] за синтаксу Викија. Молим Вас, измените ову страницу само ако имате намеру да је **побољшате**. Ако желите да тестирате могућности, научите да направите своје кораке на [[playground:playground]].
-
diff --git a/inc/lang/sr/index.txt b/inc/lang/sr/index.txt
index fe6467a1d..d82a3b998 100644
--- a/inc/lang/sr/index.txt
+++ b/inc/lang/sr/index.txt
@@ -1,4 +1,3 @@
====== Индекс ======
Овде је индекс свих доступних страница поређаних по [[doku>namespaces|именским просторима]].
-
diff --git a/inc/lang/sr/install.html b/inc/lang/sr/install.html
index c6c70dfea..efb47c4b0 100644
--- a/inc/lang/sr/install.html
+++ b/inc/lang/sr/install.html
@@ -1,12 +1,7 @@
-<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> имати могућност писања под фасциклама у којима се налазе ове датотеке. Овај програм за инсталацију нема могућност постављања дозвола за фасцикле. То се обично ради директно из командне линије или ако користите изнајмњени сервер, помоћу ФТПа или кроз Контролни панел (нпр. cPanel).</p>
+<p>DokuWiki користи обичне датотеке за складиштење вики страница и осталих информација везаних за странице (слике, индекс претраге, старе преправке, итд.). Да би радио како треба DokuWiki као апликација <strong>мора</strong> имати могућност писања под фасциклама у којима се налазе ове датотеке. Овај програм за инсталацију нема могућност постављања дозвола за фасцикле. То се обично ради директно из командне линије или ако користите изнајмњени сервер, помоћу ФТПа или кроз Контролни панел (нпр. cPanel).</p>
-<p>Овај програм за инсталацију DokuWiki-а ће поставити подешавања за
-Права приступа, које ће омогућити пријјављивање као администратор и приступ менију за инсталацију додатака, управљање корисницима, управљање приступом ка страницама и алтернатвна подешавања. Није неопходно да би DokuWiki радио, али ће вам олакшати администрацију.</p>
+<p>Овај програм за инсталацију DokuWiki-а ће поставити подешавања за Права приступа, које ће омогућити пријјављивање као администратор и приступ менију за инсталацију додатака, управљање корисницима, управљање приступом ка страницама и алтернатвна подешавања. Није неопходно да би DokuWiki радио, али ће вам олакшати администрацију.</p>
-<p>Искуснији корисници и корисници са посебним захтевима би требало да погледају следеће линкове са детаљним упутствима о
-<a href="http://dokuwiki.org/install">инструкцијама за инсталацију</a>
-и <a href="http://dokuwiki.org/config">подешавањима</a>.</p> \ No newline at end of file
+<p>Искуснији корисници и корисници са посебним захтевима би требало да погледају следеће линкове са детаљним упутствима о <a href="http://dokuwiki.org/install">инструкцијама за инсталацију</a> и <a href="http://dokuwiki.org/config">подешавањима</a>.</p>
diff --git a/inc/lang/sr/lang.php b/inc/lang/sr/lang.php
index 9182c1b7f..522002386 100644
--- a/inc/lang/sr/lang.php
+++ b/inc/lang/sr/lang.php
@@ -3,10 +3,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Жељко Тодоровић <zeljko_todorovic@mail.com>
+ * @author Milan Oparnica <milan.opa@gmail.com>
* @author Filip Brcic <brcha@users.sourceforge.net>
* @author Иван Петровић (Ivan Petrovic) <petrovicivan@ubuntusrbija.org>
* @author Miroslav Šolti <solti.miroslav@gmail.com>
- * @author Жељко Тодоровић <zeljko_todorovic@mail.com>
* @author Марко М. Костић <marko.m.kostic@gmail.com>
*/
$lang['encoding'] = 'utf-8';
@@ -68,44 +69,9 @@ $lang['badpassconfirm'] = 'Нажалост, лозинка је била
$lang['minoredit'] = 'Мала измена';
$lang['draftdate'] = 'Нацрт је аутоматски сачуван';
$lang['nosecedit'] = 'Страна је у међувремену промењена, поглавље је застарело и поново се учитава цела страна.';
-$lang['regmissing'] = 'Извините, морате да попуните сва поља.';
-$lang['reguexists'] = 'Извините, корисник са истим именом већ постоји.';
-$lang['regsuccess'] = 'Корисник је направљен и лозинка је послата путем е-поште.';
-$lang['regsuccess2'] = 'Корисник је направљен.';
-$lang['regfail'] = 'Нисам могао да направим корисника.';
-$lang['regmailfail'] = 'Изгледа да је дошло до грешке приликом слања лозинке е-поштом. Контактирајте администратора!';
-$lang['regbadmail'] = 'Дата е-адреса није у реду - ако мислите да је ово грешка, контактирајте администратора';
-$lang['regbadpass'] = 'Две унете лозинке нису исте. Пробајте поново.';
-$lang['regpwmail'] = 'Ваша DokuWiki лозинка';
-$lang['reghere'] = 'Још увек немате налог? Само направите један';
-$lang['profna'] = 'Овај вики не дозвољава измену профила';
-$lang['profnochange'] = 'Нема промена.';
-$lang['profnoempty'] = 'Није дозвољено оставити празно поље имена или е-адресе.';
-$lang['profchanged'] = 'Кориснички профил је ажуриран.';
-$lang['profnodelete'] = 'Овај вики не подржава брисање корисника';
-$lang['profdeleteuser'] = 'Избриши налог';
-$lang['profdeleted'] = 'Ваш кориснички налог је избрисан са овог викија';
-$lang['profconfdelete'] = 'Желим да уклоним свој налог са овог викија. <br/> Ова радња се не може опозвати.';
-$lang['profconfdeletemissing'] = 'Није штиклирано поље за потврду';
-$lang['proffail'] = 'Кориснички профил није ажуриран.';
-$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['maxuploadsize'] = 'Отпреми највише %s по датотеци.';
-$lang['lockedby'] = 'Тренутно закључано од стране:';
-$lang['lockexpire'] = 'Закључавање истиче:';
+$lang['searchcreatepage'] = 'Ako niste pronašli to što tražite, možete napraviti ili urediti stranicu %s, imenovanu prema zadatom upitu.';
+$lang['search_fullresults'] = 'Tekstualni rezultati';
+$lang['js']['search_toggle_tools'] = 'Uključi/isključi Alate Pretrage';
$lang['js']['willexpire'] = 'Ваше закључавање за измену ове странице ће да истекне за један минут.\nДа би сте избегли конфликте, искористите дугме за преглед како би сте ресетовали тајмер закључавања.';
$lang['js']['notsavedyet'] = 'Несачуване измене ће бити изгубљене.
Да ли стварно желите да наставите?';
@@ -141,12 +107,64 @@ $lang['js']['del_confirm'] = 'Обриши овај унос?';
$lang['js']['restore_confirm'] = 'Заиста желите да вратите ово издање?';
$lang['js']['media_diff'] = 'Погледај разлике:';
$lang['js']['media_diff_both'] = 'Једно до другог';
+$lang['js']['media_diff_opacity'] = 'Prosvetl';
+$lang['js']['media_diff_portions'] = 'Prevuci';
$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['search_exact_match'] = 'Potpuno podudaranje';
+$lang['search_starts_with'] = 'Počinje sa';
+$lang['search_ends_with'] = 'Završava se sa';
+$lang['search_contains'] = 'Sadrži';
+$lang['search_custom_match'] = 'Prilagođen';
+$lang['search_any_ns'] = 'Svako imenovanje ';
+$lang['search_any_time'] = 'Svako vreme';
+$lang['search_past_7_days'] = 'Prošla nedelja';
+$lang['search_past_month'] = 'Prošli mesec';
+$lang['search_past_year'] = 'Prošla godina';
+$lang['search_sort_by_hits'] = 'Poređaj po pogodcima';
+$lang['search_sort_by_mtime'] = 'Poređaj po vremenu izmene';
+$lang['regmissing'] = 'Извините, морате да попуните сва поља.';
+$lang['reguexists'] = 'Извините, корисник са истим именом већ постоји.';
+$lang['regsuccess'] = 'Корисник је направљен и лозинка је послата путем е-поште.';
+$lang['regsuccess2'] = 'Корисник је направљен.';
+$lang['regfail'] = 'Нисам могао да направим корисника.';
+$lang['regmailfail'] = 'Изгледа да је дошло до грешке приликом слања лозинке е-поштом. Контактирајте администратора!';
+$lang['regbadmail'] = 'Дата е-адреса није у реду - ако мислите да је ово грешка, контактирајте администратора';
+$lang['regbadpass'] = 'Две унете лозинке нису исте. Пробајте поново.';
+$lang['regpwmail'] = 'Ваша DokuWiki лозинка';
+$lang['reghere'] = 'Још увек немате налог? Само направите један';
+$lang['profna'] = 'Овај вики не дозвољава измену профила';
+$lang['profnochange'] = 'Нема промена.';
+$lang['profnoempty'] = 'Није дозвољено оставити празно поље имена или е-адресе.';
+$lang['profchanged'] = 'Кориснички профил је ажуриран.';
+$lang['profnodelete'] = 'Овај вики не подржава брисање корисника';
+$lang['profdeleteuser'] = 'Избриши налог';
+$lang['profdeleted'] = 'Ваш кориснички налог је избрисан са овог викија';
+$lang['profconfdelete'] = 'Желим да уклоним свој налог са овог викија. <br/> Ова радња се не може опозвати.';
+$lang['profconfdeletemissing'] = 'Није штиклирано поље за потврду';
+$lang['proffail'] = 'Кориснички профил није ажуриран.';
+$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['maxuploadsize'] = 'Отпреми највише %s по датотеци.';
+$lang['lockedby'] = 'Тренутно закључано од стране:';
+$lang['lockexpire'] = 'Закључавање истиче:';
$lang['rssfailed'] = 'Дошло је до грешке приликом преузимања овог довода: ';
$lang['nothingfound'] = 'Ништа није нађено.';
$lang['mediaselect'] = 'Избор медијске датотеке';
@@ -212,9 +230,9 @@ $lang['mail_subscribe_list'] = 'Странице промењене у име
$lang['mail_new_user'] = 'нови корисник:';
$lang['mail_upload'] = 'послата датотека:';
$lang['changes_type'] = 'Прикажи измене';
-$lang['pages_changes'] = 'Странице';
+$lang['pages_changes'] = 'страница';
$lang['media_changes'] = 'датотека';
-$lang['both_changes'] = 'И страница и датотека';
+$lang['both_changes'] = 'и страница и датотека';
$lang['qb_bold'] = 'Мастан текст';
$lang['qb_italic'] = 'Курзивни текст';
$lang['qb_underl'] = 'Подвучени текст';
diff --git a/inc/lang/sr/login.txt b/inc/lang/sr/login.txt
index c2f5a6fb6..1bc71dfd0 100644
--- a/inc/lang/sr/login.txt
+++ b/inc/lang/sr/login.txt
@@ -1,4 +1,3 @@
====== Пријављивање ======
Тренутно нисте пријављени! Унесите Ваше информације испод да бисте се пријавили. За то је неопходно да колачићи буду омогућен.
-
diff --git a/inc/lang/sr/newpage.txt b/inc/lang/sr/newpage.txt
index 40a36e6f6..5162f3d5d 100644
--- a/inc/lang/sr/newpage.txt
+++ b/inc/lang/sr/newpage.txt
@@ -1,3 +1,3 @@
====== Ова тема још увек не постоји ======
-Пратили сте везу до теме која још увек не постоји. Можете да је направите користећи дугме ''Направи ову страницу''.
+Пратили сте везу до теме која још увек не постоји. Можете да је направите користећи дугме **Направи ову страницу**.
diff --git a/inc/lang/sr/norev.txt b/inc/lang/sr/norev.txt
index 73f8d0b48..5bb57cdf3 100644
--- a/inc/lang/sr/norev.txt
+++ b/inc/lang/sr/norev.txt
@@ -1,4 +1,3 @@
====== Не постоји таква ревизија ======
Задата ревизија не постоји. Искористите дугме ''Старе ревизије'' да излистате старе ревизије овог документа.
-
diff --git a/inc/lang/sr/onceexisted.txt b/inc/lang/sr/onceexisted.txt
new file mode 100644
index 000000000..ce9c28fc3
--- /dev/null
+++ b/inc/lang/sr/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Ova stranica više ne postoji ======
+
+Pratili ste sled do stranice koja više ne postoji. U dnevniku [[?do=revisions|old revisions]] možete pronaći kada i zašto je stranica obrisana, otvoriti njenu staru verziju i povratiti je. \ No newline at end of file
diff --git a/inc/lang/sr/preview.txt b/inc/lang/sr/preview.txt
index be928884f..57c02cedc 100644
--- a/inc/lang/sr/preview.txt
+++ b/inc/lang/sr/preview.txt
@@ -1,4 +1,3 @@
====== Преглед ======
-Ово је преглед тога како би Ваш текст изгледао. Не заборавите: он још **није сачуван**!
-
+Ово је преглед тога како би Ваш текст изгледао. **Не заборавите: он још није сачуван**!
diff --git a/inc/lang/sr/read.txt b/inc/lang/sr/read.txt
index c2d9ffff7..437a07f2a 100644
--- a/inc/lang/sr/read.txt
+++ b/inc/lang/sr/read.txt
@@ -1,2 +1 @@
Ова страница је само за читање. Можете да погледате изворни код, али не можете да је мењате. Обратите се администратору ако мислите да то није уреду.
-
diff --git a/inc/lang/sr/recent.txt b/inc/lang/sr/recent.txt
index 54c0c26f0..62bd5edf5 100644
--- a/inc/lang/sr/recent.txt
+++ b/inc/lang/sr/recent.txt
@@ -1,5 +1,3 @@
====== Скорије измене ======
-Следеће странице су биле измењене у скорије време.
-
-
+Следеће странице су биле измењене у скорије време:
diff --git a/inc/lang/sr/register.txt b/inc/lang/sr/register.txt
index a553b7a1f..a2c74ded0 100644
--- a/inc/lang/sr/register.txt
+++ b/inc/lang/sr/register.txt
@@ -1,4 +1,3 @@
====== Региструјте се као нови корисник ======
Попуните све информације испод како би сте направили нови налог на овом викију. Обавезно упишите **тачну е-адресу** - Ваша нова лозинка ће тамо бити послата. Корисничко име би требало да буде исправно [[doku>pagename|име странице]]
-
diff --git a/inc/lang/sr/resendpwd.txt b/inc/lang/sr/resendpwd.txt
index 7f6623dbd..b45be8e83 100644
--- a/inc/lang/sr/resendpwd.txt
+++ b/inc/lang/sr/resendpwd.txt
@@ -1,3 +1,3 @@
====== Пошаљи нову лозинку ======
-Молим Вас унесите корисничко име у форму да бисте затражили нову лозинку за Ваш налог на овом викију. Потврдни линк ће бити послат на е-адресу коју сте користили на регистрацији. \ No newline at end of file
+Молим Вас унесите корисничко име у форму да бисте затражили нову лозинку за Ваш налог на овом викију. Потврдни линк ће бити послат на е-адресу коју сте користили на регистрацији.
diff --git a/inc/lang/sr/resetpwd.txt b/inc/lang/sr/resetpwd.txt
index 642de9882..1cabd3fdd 100644
--- a/inc/lang/sr/resetpwd.txt
+++ b/inc/lang/sr/resetpwd.txt
@@ -1,3 +1,3 @@
====== Поставите нову лозинку ======
-Унесите нову лозинку за ваш налог на овом викију. \ No newline at end of file
+Унесите нову лозинку за ваш налог на овом викију.
diff --git a/inc/lang/sr/revisions.txt b/inc/lang/sr/revisions.txt
index 1ca995a11..463270ff2 100644
--- a/inc/lang/sr/revisions.txt
+++ b/inc/lang/sr/revisions.txt
@@ -1,4 +1,3 @@
====== Старе ревизије ======
Ово су старије ревизије тренутног документа. Да би сте повратили стару ревизију, изаберите је одоздо, кликните на ''Измени страницу'' и сачувајте је.
-
diff --git a/inc/lang/sr/searchpage.txt b/inc/lang/sr/searchpage.txt
index 4663f47fc..3a6cea3ac 100644
--- a/inc/lang/sr/searchpage.txt
+++ b/inc/lang/sr/searchpage.txt
@@ -1,4 +1,3 @@
====== Претрага ======
Испод можете да нађете резултате Ваше претраге. @CREATEPAGEINFO@
-
diff --git a/inc/lang/sr/updateprofile.txt b/inc/lang/sr/updateprofile.txt
index 1f31b2250..296cb3c05 100644
--- a/inc/lang/sr/updateprofile.txt
+++ b/inc/lang/sr/updateprofile.txt
@@ -1,3 +1,3 @@
====== Ажурирање Вашег профила ======
-Потребно је попунити само она поља која желите да промените. Поље Корисничко име не можете да промените. \ No newline at end of file
+Потребно је попунити само она поља која желите да промените. Поље Корисничко име не можете да промените.
diff --git a/inc/lang/sv/admin.txt b/inc/lang/sv/admin.txt
index 10887da7d..e98c93573 100644
--- a/inc/lang/sv/admin.txt
+++ b/inc/lang/sv/admin.txt
@@ -1,4 +1,3 @@
====== Administration ======
Nedan hittar du en lista över de tillgängliga administrativa uppgifterna i DokuWiki.
-
diff --git a/inc/lang/sv/conflict.txt b/inc/lang/sv/conflict.txt
index 42168d1b4..3f173097b 100644
--- a/inc/lang/sv/conflict.txt
+++ b/inc/lang/sv/conflict.txt
@@ -3,4 +3,3 @@
Det finns en senare version av dokumentet du har redigerat. Detta kan hända när en annan användare redigerar dokumentet samtidigt som du.
Granska skillnaderna som visas nedan noga, och välj sedan vilken version du vill behålla. Om du väljer ''spara'', så kommer din version att sparas. Välj ''avbryt'' för att behålla den nuvarande versionen.
-
diff --git a/inc/lang/sv/denied.txt b/inc/lang/sv/denied.txt
index 7ae09b85b..c5716479c 100644
--- a/inc/lang/sv/denied.txt
+++ b/inc/lang/sv/denied.txt
@@ -1,4 +1,3 @@
====== Åtkomst nekad ======
Tyvärr, du har inte behörighet att fortsätta.
-
diff --git a/inc/lang/sv/diff.txt b/inc/lang/sv/diff.txt
index 9fb8c20f2..4ff2cbc00 100644
--- a/inc/lang/sv/diff.txt
+++ b/inc/lang/sv/diff.txt
@@ -1,4 +1,3 @@
====== Skillnader ======
Här visas skillnader mellan den valda versionen och den nuvarande versionen av sidan.
-
diff --git a/inc/lang/sv/draft.txt b/inc/lang/sv/draft.txt
index 3749ad035..31adec753 100644
--- a/inc/lang/sv/draft.txt
+++ b/inc/lang/sv/draft.txt
@@ -3,4 +3,3 @@
Din senaste redigering av sidan avslutades inte på ett korrekt sätt. DokuWiki sparade automatiskt ett utkast under tiden du arbetade, och nu kan du använda det för att fortsätta redigeringen. Nedan kan du se det innehåll som sparats från din förra session.
Bestäm om du vill //återskapa// din förlorade redigeringssession, //radera// det automatiskt sparade utkastet eller //avbryta// redigeringen.
-
diff --git a/inc/lang/sv/edit.txt b/inc/lang/sv/edit.txt
index 187b11fca..673843855 100644
--- a/inc/lang/sv/edit.txt
+++ b/inc/lang/sv/edit.txt
@@ -1,2 +1 @@
Redigera sidan och klicka ''Spara''. Se [[wiki:syntax]] för Wikisyntax. Redigera bara sidan om du kan **förbättra** den. Om du vill testa hur saker och ting fungerar, gör det på [[playground:playground|lekplatsen]].
-
diff --git a/inc/lang/sv/index.txt b/inc/lang/sv/index.txt
index 24d715b74..10d52b40d 100644
--- a/inc/lang/sv/index.txt
+++ b/inc/lang/sv/index.txt
@@ -1,4 +1,3 @@
====== Innehållsförteckning ======
Detta är en innehållsförteckning över alla tillgängliga sidor, sorterad efter [[doku>namespaces|namnrymder]].
-
diff --git a/inc/lang/sv/install.html b/inc/lang/sv/install.html
index a6b3ade92..ae81a2cd3 100644
--- a/inc/lang/sv/install.html
+++ b/inc/lang/sv/install.html
@@ -1,25 +1,7 @@
-<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/installer">dokumentationssida</a>.</p>
+<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/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
-<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
-om du använder ett webbhotell, via FTP eller din leverantörs kontrollpanel
-(till exempel cPanel).</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 <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 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
-<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
-fungera, men det förenklar administrationen.</p>
+<p>Detta installationsprogram anpassar inställningarna i din DokuWiki för <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 fungera, men det förenklar administrationen.</p>
-<p>Erfarna användare, eller användare med särskilda behov, kan använda dessa
-länkar för att hitta mer detaljer om
-<a href="http://dokuwiki.org/install">installation</a>
-och <a href="http://dokuwiki.org/config">inställningar</a>.</p>
+<p>Erfarna användare, eller användare med särskilda behov, kan använda dessa länkar för att hitta mer detaljer om <a href="http://dokuwiki.org/install">installation</a> och <a href="http://dokuwiki.org/config">inställningar</a>.</p>
diff --git a/inc/lang/sv/login.txt b/inc/lang/sv/login.txt
index 5f0e3b262..5cf78fdad 100644
--- a/inc/lang/sv/login.txt
+++ b/inc/lang/sv/login.txt
@@ -1,4 +1,3 @@
====== Logga in ======
Du är inte inloggad! Ange ditt användarnamn och lösenord i formuläret nedan för att logga in. Stöd för cookies måste vara aktiverat i din webbläsare för att du skall kunna logga in.
-
diff --git a/inc/lang/sv/newpage.txt b/inc/lang/sv/newpage.txt
index 3e0951056..82f5929b6 100644
--- a/inc/lang/sv/newpage.txt
+++ b/inc/lang/sv/newpage.txt
@@ -1,3 +1,3 @@
====== Det här ämnet finns inte ännu ======
-Du har följt en länk till ett ämne som inte finns ännu. Du kan skapa det genom att klicka på ''Skapa den här sidan''.
+Du har följt en länk till ett ämne som inte finns ännu. Du kan skapa det genom att klicka på **Skapa den här sidan**.
diff --git a/inc/lang/sv/norev.txt b/inc/lang/sv/norev.txt
index 46df86235..7d539f534 100644
--- a/inc/lang/sv/norev.txt
+++ b/inc/lang/sv/norev.txt
@@ -1,4 +1,3 @@
====== Det finns ingen sådan version ======
Den angivna versionen finns inte. Använd ''Historik'' för en förteckning över de versioner som finns av detta dokument.
-
diff --git a/inc/lang/sv/preview.txt b/inc/lang/sv/preview.txt
index 5c3a65341..31c32b839 100644
--- a/inc/lang/sv/preview.txt
+++ b/inc/lang/sv/preview.txt
@@ -1,4 +1,3 @@
====== Förhandsgranskning ======
-Detta är en förhandstitt på hur din text kommer att se ut när den visas. Kom ihåg: Den är **inte sparad** ännu!
-
+Detta är en förhandstitt på hur din text kommer att se ut när den visas. **Kom ihåg: Den är inte sparad ännu**!
diff --git a/inc/lang/sv/pwconfirm.txt b/inc/lang/sv/pwconfirm.txt
index 428cfa3dc..18d7590b6 100644
--- a/inc/lang/sv/pwconfirm.txt
+++ b/inc/lang/sv/pwconfirm.txt
@@ -1,12 +1,9 @@
Hej @FULLNAME@!
-Någon har bett om ett nytt lösenord för ditt konto på @TITLE@
-(@DOKUWIKIURL@)
+Någon har bett om ett nytt lösenord för ditt konto på @TITLE@ (@DOKUWIKIURL@)
-Om det inte var du som bad om ett nytt lösenord kan du helt
-enkelt ignorera det här brevet.
+Om det inte var du som bad om ett nytt lösenord kan du helt enkelt ignorera det här brevet.
-För att bekräfta att förfrågan verkligen kom från dig, var vänlig
-och använd följande länk.
+För att bekräfta att förfrågan verkligen kom från dig, var vänlig och använd följande länk.
@CONFIRM@
diff --git a/inc/lang/sv/read.txt b/inc/lang/sv/read.txt
index 5391b3ddf..8aa4335ab 100644
--- a/inc/lang/sv/read.txt
+++ b/inc/lang/sv/read.txt
@@ -1,2 +1 @@
Denna sida är skrivskyddad. Du kan titta på källkoden, men inte ändra den. Kontakta administratören om du anser att du bör kunna ändra sidan.
-
diff --git a/inc/lang/sv/recent.txt b/inc/lang/sv/recent.txt
index d8c39dfa5..b68f4b7e0 100644
--- a/inc/lang/sv/recent.txt
+++ b/inc/lang/sv/recent.txt
@@ -1,5 +1,3 @@
====== Senaste ändringarna ======
-Följande sidor/dokument har nyligen uppdaterats.
-
-
+Följande sidor/dokument har nyligen uppdaterats:
diff --git a/inc/lang/sv/register.txt b/inc/lang/sv/register.txt
index e75d2a672..5087ccbeb 100644
--- a/inc/lang/sv/register.txt
+++ b/inc/lang/sv/register.txt
@@ -1,4 +1,3 @@
====== Registrera dig som användare ======
Fyll i all information som efterfrågas i formuläret nedan för att skapa ett nytt konto i denna wiki. Var särskilt noga med att ange en **giltig e-postadress** - om du inte blir ombedd att ange ett lösenord här kommer ett nytt lösenord att skickas till den adressen. Användarnamnet skall vara ett giltigt [[doku>pagename|sidnamn]].
-
diff --git a/inc/lang/sv/resendpwd.txt b/inc/lang/sv/resendpwd.txt
index 0757ee9dd..2c62bb729 100644
--- a/inc/lang/sv/resendpwd.txt
+++ b/inc/lang/sv/resendpwd.txt
@@ -1,4 +1,3 @@
====== Skicka nytt lösenord ======
Fyll i ditt användarnamn i formuläret nedan för att få ett nytt lösenord till ditt konto i denna wiki. En länk för verifiering kommer att skickas till din registrerade e-postadress.
-
diff --git a/inc/lang/sv/resetpwd.txt b/inc/lang/sv/resetpwd.txt
index a329ce571..294972b68 100644
--- a/inc/lang/sv/resetpwd.txt
+++ b/inc/lang/sv/resetpwd.txt
@@ -1,3 +1,3 @@
====== Sätt nytt lösenord ======
-Vänligen skriv ett nytt lösenord för ditt konto på denna wiki. \ No newline at end of file
+Vänligen skriv ett nytt lösenord för ditt konto på denna wiki.
diff --git a/inc/lang/sv/revisions.txt b/inc/lang/sv/revisions.txt
index b9dfc5600..8f2808637 100644
--- a/inc/lang/sv/revisions.txt
+++ b/inc/lang/sv/revisions.txt
@@ -1,4 +1,3 @@
====== Historik ======
Här visas tidigare versioner av detta dokument. För att återställa dokumentet till en tidigare version, välj den önskade versionen nedan, klicka på ''Redigera sida'' och spara sedan dokumentet.
-
diff --git a/inc/lang/sv/searchpage.txt b/inc/lang/sv/searchpage.txt
index d01bf23e4..55cbf1903 100644
--- a/inc/lang/sv/searchpage.txt
+++ b/inc/lang/sv/searchpage.txt
@@ -1,4 +1,3 @@
====== Sök ======
Nedan ser du resultatet av sökningen. @CREATEPAGEINFO@
-
diff --git a/inc/lang/sv/stopwords.txt b/inc/lang/sv/stopwords.txt
index 357659673..583da7b7a 100644
--- a/inc/lang/sv/stopwords.txt
+++ b/inc/lang/sv/stopwords.txt
@@ -1,129 +1,100 @@
-# This is a list of words the indexer ignores, one word per line
-# When you edit this file be sure to use UNIX line endings (single newline)
-# No need to include words shorter than 3 chars - these are ignored anyway
-# This list is based upon the ones found at http://www.ranks.nl/stopwords/
-about
-are
-and
-you
-your
-them
-their
-com
-for
-from
-into
-how
-that
-the
-this
-was
-what
-when
-where
-who
-will
-with
-und
-the
-www
-
# Följande svenska stoppord kommer från
# http://snowball.tartarus.org/algorithms/swedish/stop.txt. Ord kortare än tre
# bokstäver har tagits bort (se kommentaren ovan) Se även
# http://www.cling.gu.se/theses/2004/cl0sknub_cl0tsven.pdf. Vi behåller de
# engelska orden eftersom det är rätt vanligt med engelska texter.
-och
-det
+över
+alla
+allt
att
-jag
-hon
-som
-han
+blev
+bli
+blir
+blivit
+där
+dem
den
-med
-var
-sig
-för
-till
-men
+denna
+deras
+dess
+dessa
+det
+detta
+dig
+din
+dina
+ditt
+efter
+eller
+era
+ert
ett
+för
+från
+här
hade
-icke
-mig
-henne
-sin
-har
-inte
+han
hans
-honom
-skulle
+har
+henne
hennes
-där
-min
-man
-vid
-kunde
-något
-från
-när
-efter
-upp
-dem
-vara
-vad
-över
-dig
+hon
+honom
+hur
+icke
+ingen
+inom
+inte
+jag
kan
-sina
-här
+kunde
+man
+med
+mellan
+men
+mig
+min
+mina
+mitt
mot
-alla
-under
-någon
-eller
-allt
mycket
+när
+någon
+något
+några
+och
+oss
+sådan
+sådana
+sådant
+samma
sedan
-denna
+sig
+sin
+sina
+sitta
själv
-detta
+skulle
+som
+till
+under
+upp
utan
-varit
-hur
-ingen
-mitt
-bli
-blev
-oss
-din
-dessa
-några
-deras
-blir
-mina
-samma
-vilken
-sådan
vår
-blivit
-dess
-inom
-mellan
-sådant
+våra
+vårt
+vad
+var
+vara
varför
+varit
varje
-vilka
-ditt
-vem
-vilket
-sitta
-sådana
-vart
-dina
vars
-vårt
-våra
-ert
-era
+vart
+vem
+vid
+vilka
vilkas
+vilken
+vilket
+www
diff --git a/inc/lang/sv/updateprofile.txt b/inc/lang/sv/updateprofile.txt
index 98ed6e33f..d4b8d5df1 100644
--- a/inc/lang/sv/updateprofile.txt
+++ b/inc/lang/sv/updateprofile.txt
@@ -1,5 +1,3 @@
====== Uppdatera din användarprofil ======
Du behöver bara fylla i de fält som du vill ändra. Du kan inte ändra ditt användarnamn.
-
-
diff --git a/inc/lang/ta/admin.txt b/inc/lang/ta/admin.txt
index 2538b4569..74570f2dd 100644
--- a/inc/lang/ta/admin.txt
+++ b/inc/lang/ta/admin.txt
@@ -1,3 +1,3 @@
====== நிர்வாகம் ======
-கீழே டோகுவிக்கியின் நிர்வாகம் தொடர்பான முறைமைகளைப் பார்க்கலாம். \ No newline at end of file
+கீழே டோகுவிக்கியின் நிர்வாகம் தொடர்பான முறைமைகளைப் பார்க்கலாம்.
diff --git a/inc/lang/ta/backlinks.txt b/inc/lang/ta/backlinks.txt
index d8e618fc0..50ad3a5cf 100644
--- a/inc/lang/ta/backlinks.txt
+++ b/inc/lang/ta/backlinks.txt
@@ -1,3 +1,3 @@
====== பின்னிணைப்புக்கள் ======
-குறித்த பக்கத்திற்கான இணைப்பைக் கொண்டிருக்கும் அனைத்துப் பக்கங்களும் \ No newline at end of file
+குறித்த பக்கத்திற்கான இணைப்பைக் கொண்டிருக்கும் அனைத்துப் பக்கங்களும்
diff --git a/inc/lang/ta/conflict.txt b/inc/lang/ta/conflict.txt
index 301c2f07a..1bd822dc7 100644
--- a/inc/lang/ta/conflict.txt
+++ b/inc/lang/ta/conflict.txt
@@ -1,3 +1,3 @@
====== புதிய பதிப்பு உண்டு ======
-நீங்கள் திருத்திய பக்கத்திற்கு புதிய பதிப்பு உருவாகியுள்ளது. நீங்கள் குறித்த பக்கத்தை திருத்தும் போது, இன்னுமொரு பயனர் அதே பக்கத்தைத் திருத்தினால் இப்படி ஏற்பட வாய்ப்புண்டு. \ No newline at end of file
+நீங்கள் திருத்திய பக்கத்திற்கு புதிய பதிப்பு உருவாகியுள்ளது. நீங்கள் குறித்த பக்கத்தை திருத்தும் போது, இன்னுமொரு பயனர் அதே பக்கத்தைத் திருத்தினால் இப்படி ஏற்பட வாய்ப்புண்டு.
diff --git a/inc/lang/ta/denied.txt b/inc/lang/ta/denied.txt
index 9dcf1c9ed..08d95a819 100644
--- a/inc/lang/ta/denied.txt
+++ b/inc/lang/ta/denied.txt
@@ -1 +1,3 @@
-மன்னிக்கவும் ! உங்களுக்கு தொடர அனுமதி இல்லை \ No newline at end of file
+====== அணுகல் மறுக்கப்பட்டது ======
+
+மன்னிக்கவும் ! உங்களுக்கு தொடர அனுமதி இல்லை
diff --git a/inc/lang/ta/diff.txt b/inc/lang/ta/diff.txt
index bbc287676..cc57512bf 100644
--- a/inc/lang/ta/diff.txt
+++ b/inc/lang/ta/diff.txt
@@ -1,3 +1,3 @@
====== வேறுபாடுகள் ======
-குறித்த பக்கத்திற்கான இருவேறுபட்ட மாறுதல்களைக் காட்டுகின்றது. \ No newline at end of file
+குறித்த பக்கத்திற்கான இருவேறுபட்ட மாறுதல்களைக் காட்டுகின்றது.
diff --git a/inc/lang/ta/draft.txt b/inc/lang/ta/draft.txt
index 2bb89219d..9f1b2d3d9 100644
--- a/inc/lang/ta/draft.txt
+++ b/inc/lang/ta/draft.txt
@@ -1 +1,5 @@
-====== பூரணமாகத கோப்பு ====== \ No newline at end of file
+====== பூரணமாகத கோப்பு ======
+
+உங்கள் கடந்த திருத்த அமர்வு இந்த பக்கத்தில் இருந்தது நிறைவு இல்லை சரியாக. DokuWiki தானாகவே சேமிக்கப்படும் ஒரு வரைவு போது உங்கள் வேலை நீங்கள் இப்போது பயன்படுத்த தொடர உங்கள் எடிட்டிங். கீழே நீங்கள் பார்க்க முடியும் என்று தரவு காப்பாற்றப்பட்டது இருந்து உங்கள் கடைசி அமர்வு.
+
+தயவு செய்து முடிவு செய்ய வேண்டும் என்றால், //மீட்க// உங்கள் இழந்து திருத்த அமர்வு, //நீக்கு// தானாக வரைவு அல்லது //நீக்கு// எடிட்டிங் செயல்முறை.
diff --git a/inc/lang/ta/edit.txt b/inc/lang/ta/edit.txt
index e2d61d781..bbf6ac683 100644
--- a/inc/lang/ta/edit.txt
+++ b/inc/lang/ta/edit.txt
@@ -1 +1 @@
-பக்கத்தைத் திருத்தி முடிந்தவுடன், "செமி" என்ற பட்டனை அழுத்தவும். விக்கியின் வாக்கிய அமைப்புக்களைப் அறிந்துகொள்ள [[wiki:syntax]] ஐ பார்க்கவும். நீங்கள் விக்கியில் எழுதிப் பயிற்சிபெற [playground:playground|விளையாட்டுத்தாடலை]] பயன்படுத்தவும். \ No newline at end of file
+பக்கத்தைத் திருத்தி முடிந்தவுடன், "செமி" என்ற பட்டனை அழுத்தவும். விக்கியின் வாக்கிய அமைப்புக்களைப் அறிந்துகொள்ள [[wiki:syntax]] ஐ பார்க்கவும். நீங்கள் விக்கியில் எழுதிப் பயிற்சிபெற [playground:playground|விளையாட்டுத்தாடலை]] பயன்படுத்தவும்.
diff --git a/inc/lang/th/admin.txt b/inc/lang/th/admin.txt
index 677e779b6..7509cfbc4 100644
--- a/inc/lang/th/admin.txt
+++ b/inc/lang/th/admin.txt
@@ -1,3 +1,3 @@
====== งานธุรการควบคุมระบบ ======
-ด้านล่างนี้คุณสามารถพบรายการงานควบคุมระบบทั้งหมดในโดกุวิกิ \ No newline at end of file
+ด้านล่างนี้คุณสามารถพบรายการงานควบคุมระบบทั้งหมดในโดกุวิกิ
diff --git a/inc/lang/th/backlinks.txt b/inc/lang/th/backlinks.txt
index fff6898d8..239325dc3 100644
--- a/inc/lang/th/backlinks.txt
+++ b/inc/lang/th/backlinks.txt
@@ -1,3 +1,3 @@
====== ลิงค์กลับ(Backlinks) ======
-นี่คือรายชื่อเพจที่ชี้ลิงค์กลับมายังเพจปัจจุบัน \ No newline at end of file
+นี่คือรายชื่อเพจที่ชี้ลิงค์กลับมายังเพจปัจจุบัน
diff --git a/inc/lang/th/conflict.txt b/inc/lang/th/conflict.txt
index 5e786a6b3..891d0192e 100644
--- a/inc/lang/th/conflict.txt
+++ b/inc/lang/th/conflict.txt
@@ -2,4 +2,4 @@
มีเอกสารรุ่นใหม่กว่าที่คุณได้แก้ไขไว้ มันเกิดขึ้นเมื่อผู้ใช้รายอื่นได้ทำการแก้ไขเอกสารในขณะที่ขณะเดียวกันกับที่คุณกำลังแก้ไขมัน
-ให้ตรวจสอบความแตกต่างที่แสดงไว้ด้านล่างนี้ให้ทั่วถึง, แล้วตัดสินใจว่าจะเก็บฉบับไหนไว้ ถ้าคุณเลือก "บันทึก", ฉบับของคุณจะถูกบันทึกไว้ หรือกด "ยกเลิก" เพื่อเก็บฉบับปัจจุบัน \ No newline at end of file
+ให้ตรวจสอบความแตกต่างที่แสดงไว้ด้านล่างนี้ให้ทั่วถึง, แล้วตัดสินใจว่าจะเก็บฉบับไหนไว้ ถ้าคุณเลือก "บันทึก", ฉบับของคุณจะถูกบันทึกไว้ หรือกด "ยกเลิก" เพื่อเก็บฉบับปัจจุบัน
diff --git a/inc/lang/th/denied.txt b/inc/lang/th/denied.txt
index 4cc29d626..4bbd23a87 100644
--- a/inc/lang/th/denied.txt
+++ b/inc/lang/th/denied.txt
@@ -1,4 +1,3 @@
====== ปฏิเสธสิทธิ์ ======
ขออภัย คุณไม่มีสิทธิ์เพียงพอที่จะดำเนินการต่อ
-
diff --git a/inc/lang/th/diff.txt b/inc/lang/th/diff.txt
index e21759e03..7e1d1d49a 100644
--- a/inc/lang/th/diff.txt
+++ b/inc/lang/th/diff.txt
@@ -1,3 +1,3 @@
====== ความแตกต่าง ======
-นี่เป็นการแสดงความแตกต่างระหว่างเพจสองรุ่น \ No newline at end of file
+นี่เป็นการแสดงความแตกต่างระหว่างเพจสองรุ่น
diff --git a/inc/lang/th/draft.txt b/inc/lang/th/draft.txt
index 37b1841a2..1dbbf9273 100644
--- a/inc/lang/th/draft.txt
+++ b/inc/lang/th/draft.txt
@@ -2,4 +2,4 @@
เซสชั่นที่คุณแก้ไขฉบับล่าสุดในเพจนี้ไม่ถูกจัดเก็บให้สมบูรณ์ โดกุวิกิได้ทำการบันทึกฉบับร่างให้โดยอัตโนมัติในระหว่างที่คุณกำลังทำงาน อันซึ่งขณะนี้คุณอาจต้องการใช้มันเพื่อแก้ไขต่อ ด้านล่างนี้คุณจะเห็นข้อมูลที่ถูกบันทึกไว้จากการทำงานครั้งล่าสุด
-กรุณาตัดสินใจว่าคุณต้องการที่จะ //กู้คืน//งานฉบับที่แก้ไขล่าสุด, //ลบทิ้ง/// ตัวฉบับร่างที่ได้บันทึกอัตโนมัติไว้, //ยกเลิก// กระบวนการแก้ไขนี้ \ No newline at end of file
+กรุณาตัดสินใจว่าคุณต้องการที่จะ //กู้คืน//งานฉบับที่แก้ไขล่าสุด, //ลบทิ้ง/// ตัวฉบับร่างที่ได้บันทึกอัตโนมัติไว้, //ยกเลิก// กระบวนการแก้ไขนี้
diff --git a/inc/lang/th/edit.txt b/inc/lang/th/edit.txt
index 81dc0000b..83361c62b 100644
--- a/inc/lang/th/edit.txt
+++ b/inc/lang/th/edit.txt
@@ -1 +1 @@
-แก้ไขหน้านี้แล้วกด "บันทึก" ให้อ่าน[[wiki:syntax|ไวยกรณ์วิกิ]] สำหรับค้นหาไวยกรณ์ที่ใช้ในวิกิ และกรุณาแก้ไขเฉพาะเพจที่คุณสามารถ**ปรับปรุง**ให้มันดีขึ้นได้, ถ้าหากคุณต้องการที่จะทดสอบอะไรบางอย่าง ให้ไปลองเล่นครั้งแรกได้ใน[[playground:playground|สนามเด็กเล่น]] \ No newline at end of file
+แก้ไขหน้านี้แล้วกด "บันทึก" ให้อ่าน[[wiki:syntax|ไวยกรณ์วิกิ]] สำหรับค้นหาไวยกรณ์ที่ใช้ในวิกิ และกรุณาแก้ไขเฉพาะเพจที่คุณสามารถ**ปรับปรุง**ให้มันดีขึ้นได้, ถ้าหากคุณต้องการที่จะทดสอบอะไรบางอย่าง ให้ไปลองเล่นครั้งแรกได้ใน[[playground:playground|สนามเด็กเล่น]]
diff --git a/inc/lang/th/editrev.txt b/inc/lang/th/editrev.txt
index 28e6760d3..5da4867c8 100644
--- a/inc/lang/th/editrev.txt
+++ b/inc/lang/th/editrev.txt
@@ -1,2 +1,2 @@
**คุณได้โหลดเอาเอกสารฉบับเก่าขึ้นมา!** ถ้าคุณบันทึกมัน คุณจะสร้างเอกสารรุ่นใหม่ด้วยข้อมูลเหล่านี้
----- \ No newline at end of file
+----
diff --git a/inc/lang/th/index.txt b/inc/lang/th/index.txt
index eb32a64c0..8bc7099dc 100644
--- a/inc/lang/th/index.txt
+++ b/inc/lang/th/index.txt
@@ -1,2 +1,3 @@
====== ดัชนี ======
-นี่คือดัชนีรวมทุกเพจ เรียงตาม[[doku>namespaces|เนมสเปซ]] \ No newline at end of file
+
+นี่คือดัชนีรวมทุกเพจ เรียงตาม[[doku>namespaces|เนมสเปซ]]
diff --git a/inc/lang/th/lang.php b/inc/lang/th/lang.php
index b2b2fd852..aa87977a1 100644
--- a/inc/lang/th/lang.php
+++ b/inc/lang/th/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Mac <mac@easterncyber.com>
* @author Komgrit Niyomrath <n.komgrit@gmail.com>
* @author Arthit Suriyawongkul <arthit@gmail.com>
* @author Kittithat Arnontavilas <mrtomyum@gmail.com>
@@ -69,6 +70,62 @@ $lang['badpassconfirm'] = 'พาสเวิร์ดไม่ถูก
$lang['minoredit'] = 'เป็นการแก้ไขเล็กน้อย';
$lang['draftdate'] = 'บันทึกฉบับร่างเมื่อ';
$lang['nosecedit'] = 'ในช่วงเวลาที่ผ่านมานี้เพจถูกแก้ไขไปแล้ว, เนื้อหาในเซคชั่นนี้ไม่ทันสมัย กรุณาโหลดเพจใหม่ทั้งหน้าแทน';
+$lang['searchcreatepage'] = 'หากคุณไม่พบสิ่งที่ต้องการ คุณสามารถสร้างหรือแก้ไขหน้า %s ซึ่งตั้งชื่อตามกระทู้ของคุณ';
+$lang['search_fullresults'] = 'ผลลัพธ์เต็มรูปแบบ';
+$lang['js']['search_toggle_tools'] = 'สลับเครื่องมือที่ใช้ค้นหา';
+$lang['js']['willexpire'] = 'การล๊อคเพื่อแก้ไขหน้านี้กำลังจะหมดเวลาในอีก \n นาที เพื่อที่จะหลีกเลี่ยงข้อขัดแย้งให้ใช้ปุ่ม "Preview" เพื่อรีเซ็ทเวลาใหม่';
+$lang['js']['notsavedyet'] = 'การแก้ไขที่ไม่ได้บันทึกจะสูญหาย \n ต้องการทำต่อจริงๆหรือ?';
+$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']['mediainsert'] = 'แทรก';
+$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'] = 'เชื่อมไปยังหน้าต่างแบ่งปัน ทำงานได้กับเฉพาะไมโครซอฟท์อินเตอร์เน็ตเอ็กซโปรเรอร์(IE) คุณยังคงสามารถคัดลอกและแปะลิ้งค์ได้';
+$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['search_exact_match'] = 'คู่ที่เหมาะสม';
+$lang['search_starts_with'] = 'เริ่มต้นด้วย';
+$lang['search_ends_with'] = 'สิ้นสุดด้วย';
+$lang['search_contains'] = 'มี';
+$lang['search_custom_match'] = 'กำหนดเอง';
+$lang['search_any_ns'] = 'เนมสเปซใด ๆ';
+$lang['search_any_time'] = 'เวลาใดๆ';
+$lang['search_past_7_days'] = 'สัปดาห์ที่ผ่านมา';
+$lang['search_past_month'] = 'เดือนที่ผ่านมา';
+$lang['search_past_year'] = 'ปีที่ผ่านมา';
+$lang['search_sort_by_hits'] = 'เรียงตามความนิยม';
+$lang['search_sort_by_mtime'] = 'เรียงตามการแก้ไขครั้งล่าสุด';
$lang['regmissing'] = 'ขออภัย คุณต้องกรอกให้ครบทุกช่อง';
$lang['reguexists'] = 'ชื่อบัญชีที่ใส่นั้นมีผู้อื่นได้ใช้แล้ว กรุณาเลือกชื่อผู้ใช้อื่น';
$lang['regsuccess'] = 'ผู้ใช้ถูกสร้างแล้ว และรหัสผ่านได้ถูกส่งไปทางอีเมลแล้ว';
@@ -107,28 +164,6 @@ $lang['txt_overwrt'] = 'เขียนทับไฟล์ที่
$lang['maxuploadsize'] = 'อัพโหลด สูงสุด %s ต่อไฟล์';
$lang['lockedby'] = 'ตอนนี้ถูกล๊อคโดย:';
$lang['lockexpire'] = 'การล๊อคจะหมดอายุเมื่อ:';
-$lang['js']['willexpire'] = 'การล๊อคเพื่อแก้ไขหน้านี้กำลังจะหมดเวลาในอีก \n นาที เพื่อที่จะหลีกเลี่ยงข้อขัดแย้งให้ใช้ปุ่ม "Preview" เพื่อรีเซ็ทเวลาใหม่';
-$lang['js']['notsavedyet'] = 'การแก้ไขที่ไม่ได้บันทึกจะสูญหาย \n ต้องการทำต่อจริงๆหรือ?';
-$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']['mediainsert'] = 'แทรก';
-$lang['js']['mediadisplayimg'] = 'แสดงรูปภาพ';
-$lang['js']['mediadisplaylnk'] = 'แสดงลิงค์ เท่านั้น';
-$lang['js']['mediasmall'] = 'รูปแบบขนาดเล็ก';
-$lang['js']['mediamedium'] = 'รูปแบบขนาดกลาง';
-$lang['js']['medialarge'] = 'รูปแบบขนาดใหญ่';
-$lang['js']['mediaoriginal'] = 'รูปแบบตั้งต้น';
-$lang['js']['nosmblinks'] = 'เชื่อมไปยังหน้าต่างแบ่งปัน ทำงานได้กับเฉพาะไมโครซอฟท์อินเตอร์เน็ตเอ็กซโปรเรอร์(IE) คุณยังคงสามารถคัดลอกและแปะลิ้งค์ได้';
-$lang['js']['linkwiz'] = 'ลิงค์วิเศษ';
-$lang['js']['linkto'] = 'ลิงค์ไป:';
-$lang['js']['del_confirm'] = 'ต้องการลบรายการที่เลือกจริงๆหรือ?';
$lang['rssfailed'] = 'มีข้อผิดพลาดขณะดูดฟีดนี้';
$lang['nothingfound'] = 'ไม่พบสิ่งใด';
$lang['mediaselect'] = 'ไฟล์สื่อ';
@@ -145,6 +180,7 @@ $lang['deletefail'] = '"%s" ไม่สามารถลบได
$lang['mediainuse'] = 'ไฟล์ "%s" ไม่ได้ถูกลบ - มันถูกใช้อยู่';
$lang['namespaces'] = 'เนมสเปซ';
$lang['mediafiles'] = 'มีไฟล์พร้อมใช้อยู่ใน';
+$lang['accessdenied'] = 'คุณไม่ได้รับสิทธิ์ในการดูหน้าเพจนี้';
$lang['mediausage'] = 'ให้ใช้ไวยกรณ์ต่อไปนี้เพื่ออ้างอิงไฟล์นี้';
$lang['mediaview'] = 'ดูไฟล์ต้นฉบับ';
$lang['mediaroot'] = 'ราก(รูท)';
@@ -160,6 +196,15 @@ $lang['current'] = 'ฉบับปัจจุบัน';
$lang['yours'] = 'ฉบับของคุณ';
$lang['diff'] = 'แสดงจุดแตกต่างกับฉบับปัจจุบัน';
$lang['diff2'] = 'แสดงจุดแตกต่างระหว่างฉบับที่เลือกไว้';
+$lang['difflink'] = 'ลิงค์ไปยังการเปรียบเทียบนี้';
+$lang['diff_type'] = 'ดูความแตกต่าง:';
+$lang['diff_inline'] = 'อยู่ในไลน์';
+$lang['diff_side'] = 'เคียงบ่าเคียงไหล่';
+$lang['diffprevrev'] = 'การแก้ไขก่อนหน้า';
+$lang['diffnextrev'] = 'การแก้ไขถัดไป';
+$lang['difflastrev'] = 'การแก้ไขล่าสุด';
+$lang['diffbothprevrev'] = 'การแก้ไขก่อนหน้าทั้งสองฝั่ง';
+$lang['diffbothnextrev'] = 'การแก้ไขถัดไปทั้งสองฝั่ง';
$lang['line'] = 'บรรทัด';
$lang['breadcrumb'] = 'ตามรอย:';
$lang['youarehere'] = 'คุณอยู่ที่นี่:';
@@ -172,10 +217,21 @@ $lang['external_edit'] = 'แก้ไขภายนอก';
$lang['summary'] = 'สรุป(หมายเหตุ)การแก้ไขนี้';
$lang['noflash'] = 'ต้องการตัวเล่นแฟลช <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> เพื่อแสดงผลเนื้อหานี้';
$lang['download'] = 'ดาวน์โหลดสนิปเป็ด(Snippet)';
+$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'] = 'ไฟล์มีเดีย';
+$lang['both_changes'] = 'ทั้งสองหน้าและมีเดียไฟล์';
$lang['qb_bold'] = 'ทำตัวหนา';
$lang['qb_italic'] = 'ทำตัวเอียง';
$lang['qb_underl'] = 'ขีดเส้นใต้ข้อความ';
@@ -214,6 +270,11 @@ $lang['img_copyr'] = 'ผู้ถือลิขสิทธิ์:
$lang['img_format'] = 'รูปแบบ:';
$lang['img_camera'] = 'กล้อง:';
$lang['img_keywords'] = 'คำหลัก:';
+$lang['img_width'] = 'ความกว้าง:';
+$lang['img_height'] = 'ความสูง:';
+$lang['subscr_subscribe_success'] = 'เพิ่ม %s ในรายการสมัครสมาชิก สำหรับ %s';
+$lang['subscr_subscribe_error'] = 'เกิดข้อผิดพลาดในการเพิ่ม %s ในรายการสมัครสมาชิก สำหรับ %s';
+$lang['subscr_subscribe_noaddress'] = 'ไม่มีที่อยู่ที่เกี่ยวข้องกับการเข้าสู่ระบบของคุณ จึงไม่สามารถเพิ่มลงในรายการสมัครสมาชิก';
$lang['authtempfail'] = 'ระบบตรวจสอบสิทธิ์ผู้ใช้ไม่พร้อมใช้งานชั่วคราว หากสถานการณ์ยังไม่เปลี่ยนแปลง กรุณาแจ้งผู้ดูแลระบวิกิของคุณ';
$lang['i_chooselang'] = 'เลือกภาษาของคุณ';
$lang['i_installer'] = 'ตัวติดตั้งโดกุวิกิ';
@@ -241,5 +302,5 @@ $lang['days'] = '%d วันก่อน';
$lang['hours'] = '%d ชั่วโมงก่อน';
$lang['minutes'] = '%d นาทีก่อน';
$lang['seconds'] = '%d วินาทีก่อน';
-$lang['email_signature_text'] = 'จดหมายนี้ถูกสร้างขึ้นโดยโดกุวิกิที่
+$lang['email_signature_text'] = 'จดหมายนี้ถูกสร้างขึ้นโดยโดกุวิกิที่
@DOKUWIKIURL@';
diff --git a/inc/lang/th/locked.txt b/inc/lang/th/locked.txt
index a198ad717..a4708080c 100644
--- a/inc/lang/th/locked.txt
+++ b/inc/lang/th/locked.txt
@@ -1,3 +1,3 @@
====== เพจถูกล๊อค ======
-เพจนี้กำลังถูกล๊อคจากการแก้ไขโดยผู้ใช้ท่านอื่น คุณต้องรอจนกว่าผู้ใช้คนนี้จะแก้ไขเสร็จ หรือการล๊อคนั้นหมดเวลา \ No newline at end of file
+เพจนี้กำลังถูกล๊อคจากการแก้ไขโดยผู้ใช้ท่านอื่น คุณต้องรอจนกว่าผู้ใช้คนนี้จะแก้ไขเสร็จ หรือการล๊อคนั้นหมดเวลา
diff --git a/inc/lang/th/login.txt b/inc/lang/th/login.txt
index d384c2d27..73be6586d 100644
--- a/inc/lang/th/login.txt
+++ b/inc/lang/th/login.txt
@@ -1,4 +1,3 @@
====== ล็อกอิน ======
คุณยังไม่ได้เข้าสู่ระบบ(ล็อกอิน)ในขณะนี้! กรอกรายละเอียดเพื่อพิสูจน์สิทธิ์ข้างล่างนี้เพื่อล็อกอิน คุณต้องเปิดคุ๊กกี้ให้ทำงานก่อนที่จะล็อกอิน
-
diff --git a/inc/lang/th/newpage.txt b/inc/lang/th/newpage.txt
index cab906d4c..b9ffc750d 100644
--- a/inc/lang/th/newpage.txt
+++ b/inc/lang/th/newpage.txt
@@ -1,3 +1,3 @@
====== ยังไม่มีหัวข้อนี้ ======
-คุณได้กดลิ้งค์เข้ามายังหัวข้อที่ยังไม่ได้สร้าง ถ้าคุณได้รับอนุญาติ คุณอาจจะสร้างมันได้ด้วยการกดปุ่ม "สร้างเพจนี้" \ No newline at end of file
+คุณได้กดลิ้งค์เข้ามายังหัวข้อที่ยังไม่ได้สร้าง ถ้าคุณได้รับอนุญาติ คุณอาจจะสร้างมันได้ด้วยการกดปุ่ม **สร้างเพจนี้**
diff --git a/inc/lang/th/norev.txt b/inc/lang/th/norev.txt
index 9127a20c3..61e6082e0 100644
--- a/inc/lang/th/norev.txt
+++ b/inc/lang/th/norev.txt
@@ -1,3 +1,3 @@
====== ไม่มีฉบับที่ระบุ ======
-ฉบับที่ระบุไม่มีอยู่จริง กรุณาใช้ปุ่ม "ฉบับเก่าๆ" เพื่อแสดงรายการรุ่นเก่าๆของเอกสารนี้ิ \ No newline at end of file
+ฉบับที่ระบุไม่มีอยู่จริง กรุณาใช้ปุ่ม "ฉบับเก่าๆ" เพื่อแสดงรายการรุ่นเก่าๆของเอกสารนี้ิ
diff --git a/inc/lang/th/preview.txt b/inc/lang/th/preview.txt
index caaf8ad2d..8e8f96a27 100644
--- a/inc/lang/th/preview.txt
+++ b/inc/lang/th/preview.txt
@@ -1,3 +1,3 @@
====== ดูตัวอย่าง ======
-นี่คือหน้าตัวอย่างของข้อความที่คุณกรอก จำไว้ว่า: มันยัง **ไม่ได้บันทึก** เก็บไว้! \ No newline at end of file
+นี่คือหน้าตัวอย่างของข้อความที่คุณกรอก จำไว้ว่า: มันยัง **ไม่ได้บันทึก** เก็บไว้!
diff --git a/inc/lang/th/pwconfirm.txt b/inc/lang/th/pwconfirm.txt
index 1cf42c8ef..fb5610f68 100644
--- a/inc/lang/th/pwconfirm.txt
+++ b/inc/lang/th/pwconfirm.txt
@@ -1,7 +1,6 @@
เฮ้ @FULLNAME@!
-มีบางคนร้องขอรหัสผ่านใหม่สำหรับ @TITLE@ ของคุณ
-เพื่อล็อกอินที่ @DOKUWIKIURL@
+มีบางคนร้องขอรหัสผ่านใหม่สำหรับ @TITLE@ ของคุณ เพื่อล็อกอินที่ @DOKUWIKIURL@
ถ้าคุรไม่ได้ร้องขอรหัสผ่านใหม่ ก็ไม่ต้องสนใจอีเมลนี้
diff --git a/inc/lang/th/read.txt b/inc/lang/th/read.txt
index ac4f31290..fe5275982 100644
--- a/inc/lang/th/read.txt
+++ b/inc/lang/th/read.txt
@@ -1 +1 @@
-หน้านี้มีไว้อ่านอย่างเดียว คุณสามารถอ่านข้อความต้นฉบับ ไม่สามารถแก้ไขได้ ให้สอบถามผู้ดูแลระบบถ้าคุณคิดว่านี่คือข้อผิดพลาด \ No newline at end of file
+หน้านี้มีไว้อ่านอย่างเดียว คุณสามารถอ่านข้อความต้นฉบับ ไม่สามารถแก้ไขได้ ให้สอบถามผู้ดูแลระบบถ้าคุณคิดว่านี่คือข้อผิดพลาด
diff --git a/inc/lang/th/recent.txt b/inc/lang/th/recent.txt
index 1655ae82b..c632c76d7 100644
--- a/inc/lang/th/recent.txt
+++ b/inc/lang/th/recent.txt
@@ -1,3 +1,3 @@
====== การเปลี่ยนแปลงเมื่อเร็วๆนี้ ======
-เพจเหล่านี้ถูกเปลี่ยนแปลงเมื่อเร็วๆนี้ \ No newline at end of file
+เพจเหล่านี้ถูกเปลี่ยนแปลงเมื่อเร็วๆนี้:
diff --git a/inc/lang/th/register.txt b/inc/lang/th/register.txt
index ed4a40876..6d2772e23 100644
--- a/inc/lang/th/register.txt
+++ b/inc/lang/th/register.txt
@@ -1,3 +1,3 @@
====== ลงทะเบียนเป็นผู้ใช้หน้าใหม่ ======
-กรอกข้อมูลทั้งหมดด้านล่างเพื่อสร้างบัญชีใหม่ในวิกินี้ ให้แน่ใจว่าคุณให้ **ที่อยู่อีเมลที่ใช้ได้จริง** ถ้าคุณไม่ถูกถามให้กรอกรหัสผา่นที่นี่, รหัสผ่านใหม่จะถูกส่งไปยังที่อยู่ดังกล่าว ชื่อล็อกอินควรจะใช้ได้ถูกต้องตาม[[doku>pagename|pagename]]. \ No newline at end of file
+กรอกข้อมูลทั้งหมดด้านล่างเพื่อสร้างบัญชีใหม่ในวิกินี้ ให้แน่ใจว่าคุณให้ **ที่อยู่อีเมลที่ใช้ได้จริง** ถ้าคุณไม่ถูกถามให้กรอกรหัสผา่นที่นี่, รหัสผ่านใหม่จะถูกส่งไปยังที่อยู่ดังกล่าว ชื่อล็อกอินควรจะใช้ได้ถูกต้องตาม[[doku>pagename|pagename]].
diff --git a/inc/lang/th/resendpwd.txt b/inc/lang/th/resendpwd.txt
index 1935abedd..73da702ee 100644
--- a/inc/lang/th/resendpwd.txt
+++ b/inc/lang/th/resendpwd.txt
@@ -1,3 +1,3 @@
====== ส่งรหัสผ่านใหม่ ======
-กรุณากรอกชื่อผู้ใช้ในช่องด้านล่างเพื่อร้องขอรหัสผ่านใหม่จากบัญชีของคุณในวิกินี้ ลิงค์ยืนยันจะถูกส่งไปยังที่อยู่อีเมลที่คุณลงทะเบียนไว้ \ No newline at end of file
+กรุณากรอกชื่อผู้ใช้ในช่องด้านล่างเพื่อร้องขอรหัสผ่านใหม่จากบัญชีของคุณในวิกินี้ ลิงค์ยืนยันจะถูกส่งไปยังที่อยู่อีเมลที่คุณลงทะเบียนไว้
diff --git a/inc/lang/th/revisions.txt b/inc/lang/th/revisions.txt
index 98a49d724..e67b9c67b 100644
--- a/inc/lang/th/revisions.txt
+++ b/inc/lang/th/revisions.txt
@@ -1,3 +1,3 @@
====== ฉบับเก่า ======
-เหล่านี้เป็นรายการฉบับเก่าของเอกสารปัจจุบัน หากต้องการคืนสภาพฉบับเก่า ให้เลือกมันจากด้านล่าง, คลิ๊ก "แก้ไขเพจนี้" แล้วจึงค่อยบันทึกมัน \ No newline at end of file
+เหล่านี้เป็นรายการฉบับเก่าของเอกสารปัจจุบัน หากต้องการคืนสภาพฉบับเก่า ให้เลือกมันจากด้านล่าง, คลิ๊ก "แก้ไขเพจนี้" แล้วจึงค่อยบันทึกมัน
diff --git a/inc/lang/th/searchpage.txt b/inc/lang/th/searchpage.txt
index 87153b08a..56d9c04ad 100644
--- a/inc/lang/th/searchpage.txt
+++ b/inc/lang/th/searchpage.txt
@@ -1,4 +1,3 @@
====== สืบค้น ======
คุณสามารถพบผลลัพธ์การสืบค้นของคุณด้านล่าง @CREATEPAGEINFO@
-
diff --git a/inc/lang/th/showrev.txt b/inc/lang/th/showrev.txt
index f93869f38..9dc0e894a 100644
--- a/inc/lang/th/showrev.txt
+++ b/inc/lang/th/showrev.txt
@@ -1,2 +1,2 @@
**นี่คือเอกสารรุ่น/ฉบับเก่า**
----- \ No newline at end of file
+----
diff --git a/inc/lang/th/updateprofile.txt b/inc/lang/th/updateprofile.txt
index 3e0a8dffd..7a0d9cf05 100644
--- a/inc/lang/th/updateprofile.txt
+++ b/inc/lang/th/updateprofile.txt
@@ -1,3 +1,3 @@
====== ปรับปรุงข้อมูลส่วนตัวของบัญชีคุณ ======
-คุณเพียงต้องการกรอกช่องที่ต้องการแก้ไขเหล่านี้ให้ครบ แต่ไม่สามารถเปลี่ยนชื่อผู้ใช้ได้ \ No newline at end of file
+คุณเพียงต้องการกรอกช่องที่ต้องการแก้ไขเหล่านี้ให้ครบ แต่ไม่สามารถเปลี่ยนชื่อผู้ใช้ได้
diff --git a/inc/lang/tr/backlinks.txt b/inc/lang/tr/backlinks.txt
index e219a60c0..ef71a2ebc 100644
--- a/inc/lang/tr/backlinks.txt
+++ b/inc/lang/tr/backlinks.txt
@@ -1,4 +1,3 @@
====== Geri linkler ======
Bu sayfaya bağlantı veren sayfaların listesi aşağıdadır.
-
diff --git a/inc/lang/tr/conflict.txt b/inc/lang/tr/conflict.txt
index 504947998..ba770bfab 100644
--- a/inc/lang/tr/conflict.txt
+++ b/inc/lang/tr/conflict.txt
@@ -3,4 +3,3 @@
Değiştirdiğiniz dökümanın daha yeni bir versiyonu mevcut. Bu durum, siz dökümanı değiştirirken başka bir kullanıcının da aynı dökümanı değiştirmesi halinde olur.
Aşağıda gösterilen farkları dikkatlice inceleyin, daha sonra hangi versiyonun korunacağına karar verin. Eğer ''Kaydet''i seçerseniz, sizin sürümünüz kaydedilir. Mevcut sürümü korumak için ''İptal''e tıklayın.
-
diff --git a/inc/lang/tr/denied.txt b/inc/lang/tr/denied.txt
index 2acfd7a8f..07f50f154 100644
--- a/inc/lang/tr/denied.txt
+++ b/inc/lang/tr/denied.txt
@@ -1,4 +1,3 @@
====== Yetki Reddedildi ======
Üzgünüz, devam etmek için yetkiniz yok.
-
diff --git a/inc/lang/tr/diff.txt b/inc/lang/tr/diff.txt
index 72baa676b..b7519490f 100644
--- a/inc/lang/tr/diff.txt
+++ b/inc/lang/tr/diff.txt
@@ -1,4 +1,3 @@
====== Farklar ======
Bu sayfanın seçili sürümü ile mevcut sürümü arasındaki farkları gösterir.
-
diff --git a/inc/lang/tr/draft.txt b/inc/lang/tr/draft.txt
index b1a8881b8..0f759e7f4 100644
--- a/inc/lang/tr/draft.txt
+++ b/inc/lang/tr/draft.txt
@@ -2,4 +2,4 @@
Bu sayfadaki en son oturumunuz düzgün olarak tamamlanmamış. DokuWiki otomatik olarak bir taslak kaydetmiş olduğu için çalışmanıza devam edebilirsiniz. Aşağıda en son oturumunuzda kaydedilmiş olan taslağı görebilirsiniz.
-Bu taslağı //geri getirebilir//, //silebilir// veya düzenleme sürecinden //vazgeçebilirsiniz//. \ No newline at end of file
+Bu taslağı //geri getirebilir//, //silebilir// veya düzenleme sürecinden //vazgeçebilirsiniz//.
diff --git a/inc/lang/tr/edit.txt b/inc/lang/tr/edit.txt
index 4f84c4e53..09d92eee3 100644
--- a/inc/lang/tr/edit.txt
+++ b/inc/lang/tr/edit.txt
@@ -1,2 +1 @@
Sayfayı değiştirin ve ''Kaydete'' basın. Wiki sözdizimi için [[wiki:syntax]]'a bakınız. Lütfen sayfayı sadece eğer **geliştirebiliyorsanız** değiştirin. Eğer testler yapmak istiyorsanız, [[playground:playground|playground]] adresini kullanın.
-
diff --git a/inc/lang/tr/index.txt b/inc/lang/tr/index.txt
index e361e8784..d42554b96 100644
--- a/inc/lang/tr/index.txt
+++ b/inc/lang/tr/index.txt
@@ -1,4 +1,3 @@
====== İndeks ======
Bu mevcut tüm sayfaların [[doku>namespaces|isim alanlarına]] göre sıralı bir indeksidir.
-
diff --git a/inc/lang/tr/install.html b/inc/lang/tr/install.html
index de82d729e..d222aeb30 100644
--- a/inc/lang/tr/install.html
+++ b/inc/lang/tr/install.html
@@ -1,8 +1,7 @@
<p>Bu sayfa <a href="http://dokuwiki.org">Dokuwiki</a> kurmanıza yardımcı olmaktadır. Kurulum hakkında bilgi sahibi olmak için <a href="http://dokuwiki.org/installer">bu sayfayı</a> ziyaret edebilirsiniz.</p>
-<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>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 <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>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>
- 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
+<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>
diff --git a/inc/lang/tr/lang.php b/inc/lang/tr/lang.php
index 4147a1357..27e867d25 100644
--- a/inc/lang/tr/lang.php
+++ b/inc/lang/tr/lang.php
@@ -3,16 +3,17 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Hakan <hakandursun2009@gmail.com>
+ * @author mahir <mahirtakak@gmail.com>
* @author Selim Farsakoğlu <farsakogluselim@yahoo.de>
* @author Aydın Coşkuner <aydinweb@gmail.com>
* @author Cihan Kahveci <kahvecicihan@gmail.com>
* @author Yavuz Selim <yavuzselim@gmail.com>
* @author Caleb Maclennan <caleb@alerque.com>
- * @author farukerdemoncel@gmail.com
+ * @author farukerdemoncel <farukerdemoncel@gmail.com>
* @author Mustafa Aslan <maslan@hotmail.com>
* @author huseyin can <huseyincan73@gmail.com>
* @author ilker rifat kapaç <irifat@gmail.com>
- * @author İlker R. Kapaç <irifat@gmail.com>
* @author Mete Cuma <mcumax@gmail.com>
*/
$lang['encoding'] = 'utf-8';
@@ -74,44 +75,9 @@ $lang['badpassconfirm'] = 'Üzgünüz, parolanız yanlış';
$lang['minoredit'] = 'Küçük Değişiklikler';
$lang['draftdate'] = 'Taslak şu saatte otomatik kaydedildi:';
$lang['nosecedit'] = 'Sayfa yakın zamanda değiştirilmiştir, bölüm bilgisi eski kalmıştır. Bunun için bölüm yerine tüm sayfa yüklenmiştir.';
-$lang['regmissing'] = 'Üzgünüz, tüm alanları doldurmalısınız.';
-$lang['reguexists'] = 'Üzgünüz, bu isime sahip bir kullanıcı zaten mevcut.';
-$lang['regsuccess'] = 'Kullanıcı oluşturuldu ve şifre e-posta adresine gönderildi.';
-$lang['regsuccess2'] = 'Kullanıcı oluşturuldu.';
-$lang['regfail'] = 'Kullanıcı oluşturulamadı.';
-$lang['regmailfail'] = 'Şifrenizi e-posta ile gönderirken bir hata oluşmuş gibi görünüyor. Lütfen yönetici ile temasa geçiniz!';
-$lang['regbadmail'] = 'Verilen e-posta adresi geçersiz gibi görünüyor - bunun bir hata olduğunu düşünüyorsanız yönetici ile temasa geçiniz.';
-$lang['regbadpass'] = 'Girilen parolalar aynı değil. Lütfen tekrar deneyiniz.';
-$lang['regpwmail'] = 'DokuWiki parolanız';
-$lang['reghere'] = 'Daha hesabınız yok mu? Hemen bir tane açtırın!';
-$lang['profna'] = 'Bu wiki kullanıcı bilgilerini değiştirmeyi desteklememektedir';
-$lang['profnochange'] = 'Değişiklik yok, birşey yapılmadı.';
-$lang['profnoempty'] = 'Boş isim veya e-posta adresine izin verilmiyor.';
-$lang['profchanged'] = 'Kullanıcı bilgileri başarıyla değiştirildi.';
-$lang['profnodelete'] = 'Bu wiki kullanıcı silmeyi desteklemiyor';
-$lang['profdeleteuser'] = 'Hesabı Sil';
-$lang['profdeleted'] = 'Bu wiki\'den hesabınız silindi';
-$lang['profconfdelete'] = 'Bu wiki\'den hesabımı silmek istiyorum. <br/>Bu işlem geri alınamaz';
-$lang['profconfdeletemissing'] = 'Onay kutusu işaretlenmedi';
-$lang['proffail'] = 'Kullanıcı bilgileri güncellenmedi.';
-$lang['pwdforget'] = 'Parolanızı mı unuttunuz? Yeni bir parola alın';
-$lang['resendna'] = 'Bu wiki parolayı tekrar göndermeyi desteklememektedir.';
-$lang['resendpwd'] = 'İçin yeni şifre belirle';
-$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.';
-$lang['resendpwdconfirm'] = 'Doğrulama linki e-posta adresinize gönderildi.';
-$lang['resendpwdsuccess'] = 'Yeni parolanız e-posta adresinize gönderildi.';
-$lang['license'] = 'Aksi belirtilmediği halde, bu wikinin içeriğinin telif hakları şu lisans ile korunmaktadır:';
-$lang['licenseok'] = 'Not: Bu sayfayı değiştirerek yazınızın şu lisans ile yayınlanmasını kabul etmiş olacaksınız:';
-$lang['searchmedia'] = 'Dosya Adı Ara:';
-$lang['searchmedia_in'] = '%s içinde ara';
-$lang['txt_upload'] = 'Yüklenecek dosyayı seç:';
-$lang['txt_filename'] = 'Dosya adı (zorunlu değil):';
-$lang['txt_overwrt'] = 'Mevcut dosyanın üstüne yaz';
-$lang['maxuploadsize'] = 'Yükleme dosya başına en fazla %s';
-$lang['lockedby'] = 'Şu an şunun tarafından kilitli:';
-$lang['lockexpire'] = 'Kilitin açılma tarihi:';
+$lang['searchcreatepage'] = 'Eğer aradığınızı bulamadıysanız, %s sayfasını yaratabilir veya düzenleyebilirsiniz. ';
+$lang['search_fullresults'] = 'Tam Metin sonuçları';
+$lang['js']['search_toggle_tools'] = 'Arama Araçlarını Değiştir';
$lang['js']['willexpire'] = 'Bu sayfayı değiştirme kilidinin süresi yaklaşık bir dakika içinde geçecek.\nÇakışmaları önlemek için önizleme tuşunu kullanarak kilit sayacını sıfırla.';
$lang['js']['notsavedyet'] = 'Kaydedilmemiş değişiklikler kaybolacak.
Devam etmek istiyor musunuz?';
@@ -146,12 +112,63 @@ $lang['js']['del_confirm'] = 'Bu girişi sil?';
$lang['js']['restore_confirm'] = 'Bu sürüme geri dönmek istediğinizden emin misiniz?';
$lang['js']['media_diff'] = 'Farkları gör:';
$lang['js']['media_diff_both'] = 'Yan yana';
+$lang['js']['media_diff_portions'] = 'Kaydır';
$lang['js']['media_select'] = 'Dosyalar seç...';
$lang['js']['media_upload_btn'] = 'Yükle';
$lang['js']['media_done_btn'] = 'Bitti';
$lang['js']['media_drop'] = 'Yüklemek istediğiniz dosyaları buraya bırakın';
$lang['js']['media_cancel'] = 'kaldır';
$lang['js']['media_overwrt'] = 'Var olan dosyaların üzerine yaz';
+$lang['search_exact_match'] = 'Tam eşleşme';
+$lang['search_starts_with'] = 'Bununla başlar';
+$lang['search_ends_with'] = 'Bununla biter';
+$lang['search_contains'] = 'İçerir';
+$lang['search_custom_match'] = 'Özel';
+$lang['search_any_ns'] = 'Herhangi bir isim';
+$lang['search_any_time'] = 'Herhangi bir zaman';
+$lang['search_past_7_days'] = 'Geçen hafta';
+$lang['search_past_month'] = 'Geçen ay';
+$lang['search_past_year'] = 'Geçen yıl';
+$lang['search_sort_by_hits'] = 'Tıklanmaya göre sırala';
+$lang['search_sort_by_mtime'] = 'Son değiştirilmeye göre sırala';
+$lang['regmissing'] = 'Üzgünüz, tüm alanları doldurmalısınız.';
+$lang['reguexists'] = 'Üzgünüz, bu isime sahip bir kullanıcı zaten mevcut.';
+$lang['regsuccess'] = 'Kullanıcı oluşturuldu ve şifre e-posta adresine gönderildi.';
+$lang['regsuccess2'] = 'Kullanıcı oluşturuldu.';
+$lang['regfail'] = 'Kullanıcı oluşturulamadı.';
+$lang['regmailfail'] = 'Şifrenizi e-posta ile gönderirken bir hata oluşmuş gibi görünüyor. Lütfen yönetici ile temasa geçiniz!';
+$lang['regbadmail'] = 'Verilen e-posta adresi geçersiz gibi görünüyor - bunun bir hata olduğunu düşünüyorsanız yönetici ile temasa geçiniz.';
+$lang['regbadpass'] = 'Girilen parolalar aynı değil. Lütfen tekrar deneyiniz.';
+$lang['regpwmail'] = 'DokuWiki parolanız';
+$lang['reghere'] = 'Daha hesabınız yok mu? Hemen bir tane açtırın!';
+$lang['profna'] = 'Bu wiki kullanıcı bilgilerini değiştirmeyi desteklememektedir';
+$lang['profnochange'] = 'Değişiklik yok, birşey yapılmadı.';
+$lang['profnoempty'] = 'Boş isim veya e-posta adresine izin verilmiyor.';
+$lang['profchanged'] = 'Kullanıcı bilgileri başarıyla değiştirildi.';
+$lang['profnodelete'] = 'Bu wiki kullanıcı silmeyi desteklemiyor';
+$lang['profdeleteuser'] = 'Hesabı Sil';
+$lang['profdeleted'] = 'Bu wiki\'den hesabınız silindi';
+$lang['profconfdelete'] = 'Bu wiki\'den hesabımı silmek istiyorum. <br/>Bu işlem geri alınamaz';
+$lang['profconfdeletemissing'] = 'Onay kutusu işaretlenmedi';
+$lang['proffail'] = 'Kullanıcı bilgileri güncellenmedi.';
+$lang['pwdforget'] = 'Parolanızı mı unuttunuz? Yeni bir parola alın';
+$lang['resendna'] = 'Bu wiki parolayı tekrar göndermeyi desteklememektedir.';
+$lang['resendpwd'] = 'İçin yeni şifre belirle';
+$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.';
+$lang['resendpwdconfirm'] = 'Doğrulama linki e-posta adresinize gönderildi.';
+$lang['resendpwdsuccess'] = 'Yeni parolanız e-posta adresinize gönderildi.';
+$lang['license'] = 'Aksi belirtilmediği halde, bu wikinin içeriğinin telif hakları şu lisans ile korunmaktadır:';
+$lang['licenseok'] = 'Not: Bu sayfayı değiştirerek yazınızın şu lisans ile yayınlanmasını kabul etmiş olacaksınız:';
+$lang['searchmedia'] = 'Dosya Adı Ara:';
+$lang['searchmedia_in'] = '%s içinde ara';
+$lang['txt_upload'] = 'Yüklenecek dosyayı seç:';
+$lang['txt_filename'] = 'Dosya adı (zorunlu değil):';
+$lang['txt_overwrt'] = 'Mevcut dosyanın üstüne yaz';
+$lang['maxuploadsize'] = 'Yükleme dosya başına en fazla %s';
+$lang['lockedby'] = 'Şu an şunun tarafından kilitli:';
+$lang['lockexpire'] = 'Kilitin açılma tarihi:';
$lang['rssfailed'] = 'Bu beslemeyi çekerken hata oluştu: ';
$lang['nothingfound'] = 'Hiçbir şey yok.';
$lang['mediaselect'] = 'Çokluortam dosyası seçimi';
@@ -274,6 +291,7 @@ $lang['subscr_m_unsubscribe'] = 'Üyelik iptali';
$lang['subscr_m_subscribe'] = 'Kayıt ol';
$lang['subscr_m_receive'] = 'Al';
$lang['subscr_style_every'] = 'her değişiklikte e-posta gönder';
+$lang['subscr_style_digest'] = 'Her sayfa için değişikliklerin özet e-postası (her %.2f gün)';
$lang['subscr_style_list'] = 'Son e-postadan bu yana değiştirilen sayfaların listesi (her %.2f gün)';
$lang['authtempfail'] = 'Kullanıcı doğrulama geçici olarak yapılamıyor. Eğer bu durum devam ederse lütfen Wiki yöneticine haber veriniz.';
$lang['i_chooselang'] = 'Dili seçiniz';
@@ -334,9 +352,10 @@ $lang['media_perm_read'] = 'Özür dileriz, dosyaları okumak için yeterl
$lang['media_perm_upload'] = 'Üzgünüm, karşıya dosya yükleme yetkiniz yok.';
$lang['media_update'] = 'Yeni versiyonu yükleyin';
$lang['media_restore'] = 'Bu sürümü eski haline getir';
+$lang['media_acl_warning'] = 'Bu sayfa ACL sınırlarından ve gizli sayfalardan dolayı eksik olabilir. ';
$lang['currentns'] = 'Geçerli isimalanı';
$lang['searchresult'] = 'Arama Sonucu';
$lang['plainhtml'] = 'Yalın HTML';
$lang['wikimarkup'] = 'Wiki Biçimlendirmesi';
-$lang['email_signature_text'] = 'Bu e-posta aşağıdaki DokuWiki tarafından otomatik olarak oluşturulmuştur
+$lang['email_signature_text'] = 'Bu e-posta aşağıdaki DokuWiki tarafından otomatik olarak oluşturulmuştur
@DOKUWIKIURL@';
diff --git a/inc/lang/tr/locked.txt b/inc/lang/tr/locked.txt
index 14385426e..7e042159e 100644
--- a/inc/lang/tr/locked.txt
+++ b/inc/lang/tr/locked.txt
@@ -1,4 +1,3 @@
====== Sayfa kilitli ======
Bu sayfa şu anda başka bir kullanıcının değiştirmesi için kilitli. Kilitin süresi geçene veya bu kullanıcı değiştirmeyi bitirene kadar beklemelisiniz.
-
diff --git a/inc/lang/tr/login.txt b/inc/lang/tr/login.txt
index 2ce378d00..ce29b962e 100644
--- a/inc/lang/tr/login.txt
+++ b/inc/lang/tr/login.txt
@@ -1,4 +1,3 @@
====== Giriş ======
Şu an giriş yapmış değilsiniz! Giriş yapmak için giriş bilgilerinizi aşağıya yazın. Giriş yapmak için çerezleri açmalısınız.
-
diff --git a/inc/lang/tr/newpage.txt b/inc/lang/tr/newpage.txt
index 8a47e6bf3..79f5f2c29 100644
--- a/inc/lang/tr/newpage.txt
+++ b/inc/lang/tr/newpage.txt
@@ -1,4 +1,3 @@
====== Bu başlık henüz mevcut değil ======
-Henüz mevcut olmayan bir başlığın linkiyle geldiniz. ''bu sayfayı oluştur'' tuşuna tıklayarak sayfayı oluşturabilirsiniz.
-
+Henüz mevcut olmayan bir başlığın linkiyle geldiniz. **Bu sayfayı oluştur** tuşuna tıklayarak sayfayı oluşturabilirsiniz.
diff --git a/inc/lang/tr/norev.txt b/inc/lang/tr/norev.txt
index e6f97bef2..0c5e923aa 100644
--- a/inc/lang/tr/norev.txt
+++ b/inc/lang/tr/norev.txt
@@ -1,4 +1,3 @@
====== Böyle bir sürüm yok ======
Belirtilen sürüm mevcut değil. Bu dökümanın eski sürümlerinin bir listesine ulaşmak için ''Eski sürümler'' tuşunu kullanın.
-
diff --git a/inc/lang/tr/preview.txt b/inc/lang/tr/preview.txt
index 71a8a42f6..28a9a4cda 100644
--- a/inc/lang/tr/preview.txt
+++ b/inc/lang/tr/preview.txt
@@ -1,4 +1,3 @@
====== Önizleme ======
-Bu yazınızın nasıl çıkacağının bir önizlemesi. Unutma: Yazı henüz **kaydedilmedi!**
-
+Bu yazınızın nasıl çıkacağının bir önizlemesi. **Unutma: Yazı henüz kaydedilmedi!**
diff --git a/inc/lang/tr/read.txt b/inc/lang/tr/read.txt
index 59314f152..e6c0f5db1 100644
--- a/inc/lang/tr/read.txt
+++ b/inc/lang/tr/read.txt
@@ -1,2 +1 @@
Bu sayfa salt okunur. Kaynağı görebilirsiniz ama değiştiremezsiniz. Bunun yanlış olduğunu düşünüyorsanız yöneticiye danışın.
-
diff --git a/inc/lang/tr/recent.txt b/inc/lang/tr/recent.txt
index 99efc8fb1..f193f3fe6 100644
--- a/inc/lang/tr/recent.txt
+++ b/inc/lang/tr/recent.txt
@@ -1,5 +1,3 @@
====== Son değişiklikler ======
-Aşağıdaki sayfalar yakın zamanda değiştirildi.
-
-
+Aşağıdaki sayfalar yakın zamanda değiştirildi:
diff --git a/inc/lang/tr/register.txt b/inc/lang/tr/register.txt
index b67e4b5c5..73e1636c5 100644
--- a/inc/lang/tr/register.txt
+++ b/inc/lang/tr/register.txt
@@ -1,4 +1,3 @@
====== Yeni kullanıcı olarak kaydolun ======
Bu wikide yeni bir hesap açmak için aşağıdaki tüm bilgileri doldurunuz. **Doğru e-posta adresi verdiğinizden** emin olun, yeni parolanız e-postanıza gönderilecek. Giriş adınız geçerli bir [[doku>pagename|sayfa adı]] olmalıdır.
-
diff --git a/inc/lang/tr/resetpwd.txt b/inc/lang/tr/resetpwd.txt
index 1ed758693..df98be635 100644
--- a/inc/lang/tr/resetpwd.txt
+++ b/inc/lang/tr/resetpwd.txt
@@ -1,3 +1,3 @@
====== Yeni şifre belirle ======
-Lütfen bu wiki hesabınız için yeni bir şifre belirleyin. \ No newline at end of file
+Lütfen bu wiki hesabınız için yeni bir şifre belirleyin.
diff --git a/inc/lang/tr/revisions.txt b/inc/lang/tr/revisions.txt
index 841fba2b9..58fad4ac7 100644
--- a/inc/lang/tr/revisions.txt
+++ b/inc/lang/tr/revisions.txt
@@ -1,4 +1,3 @@
====== Eski sürümler ======
Bunlar mevcut dökümanın daha eski sürümleridir. Eski bir sürüme çevirmek için, sürümü aşağıdan seçin, ''Sayfayı değiştir''e tıklayın ve kaydedin.
-
diff --git a/inc/lang/tr/searchpage.txt b/inc/lang/tr/searchpage.txt
index 05660eb4f..4ea7f457c 100644
--- a/inc/lang/tr/searchpage.txt
+++ b/inc/lang/tr/searchpage.txt
@@ -1,4 +1,3 @@
====== Arama ======
Aşağıda aramanın sonuçları listelenmiştir. @CREATEPAGEINFO@
-
diff --git a/inc/lang/uk/admin.txt b/inc/lang/uk/admin.txt
index f698d937e..b8123feec 100644
--- a/inc/lang/uk/admin.txt
+++ b/inc/lang/uk/admin.txt
@@ -1,4 +1,3 @@
====== Адміністрування ======
Нижче ви можете знайти перелік адміністративних задач, що наявні в ДокуВікі.
-
diff --git a/inc/lang/uk/conflict.txt b/inc/lang/uk/conflict.txt
index 5a8930721..cbd3ba2d4 100644
--- a/inc/lang/uk/conflict.txt
+++ b/inc/lang/uk/conflict.txt
@@ -5,4 +5,3 @@
Уважно перегляньте розбіжності та вирішіть, яку версію залишити. Якщо ви натиснете
''зберегти'', буде збережена ваша версія. Якщо натиснете ''скасувати'' --- то залишиться
поточна версія.
-
diff --git a/inc/lang/uk/denied.txt b/inc/lang/uk/denied.txt
index 635d31c38..778822847 100644
--- a/inc/lang/uk/denied.txt
+++ b/inc/lang/uk/denied.txt
@@ -1,4 +1,3 @@
====== Доступ заборонено ======
Вибачте, але у вас не вистачає прав для продовження.
-
diff --git a/inc/lang/uk/diff.txt b/inc/lang/uk/diff.txt
index cfdf9a887..b63942374 100644
--- a/inc/lang/uk/diff.txt
+++ b/inc/lang/uk/diff.txt
@@ -1,4 +1,3 @@
====== Розбіжності ======
Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
-
diff --git a/inc/lang/uk/draft.txt b/inc/lang/uk/draft.txt
index f6acca8ed..aa47c9fe6 100644
--- a/inc/lang/uk/draft.txt
+++ b/inc/lang/uk/draft.txt
@@ -3,4 +3,3 @@
Останнє редагування цієї сторінки не було завершено коректно. ДокуВікі автоматично зберегла чернетку під час вашої роботи. Ви можете використати чернетку для продовження редагування. Нижче ви можете побачити дані, збережені з попереднього сеансу.
Будь ласка вирішить, чи ви бажаєте //відновити// останній сеанс редагування, //знищити// збережену чернетку або //скасувати// редагування.
-
diff --git a/inc/lang/uk/index.txt b/inc/lang/uk/index.txt
index 0ba0d185b..f6fb56c7c 100644
--- a/inc/lang/uk/index.txt
+++ b/inc/lang/uk/index.txt
@@ -1,4 +1,3 @@
====== Зміст ======
Це перелік усіх доступних сторінок, упоряджених за [[doku>namespaces|просторами імен]]
-
diff --git a/inc/lang/uk/install.html b/inc/lang/uk/install.html
index a28042741..b672976a8 100644
--- a/inc/lang/uk/install.html
+++ b/inc/lang/uk/install.html
@@ -1,21 +1,7 @@
-<p>Ця сторінка допомагає при першій установці та налаштуванні <a href="http://dokuwiki.org">ДокуВікі</a>.
-Більше інформації про програму установки можна знайти на <a href="http://dokuwiki.org/installer">сторінці документації</a>.</p>
+<p>Ця сторінка допомагає при першій установці та налаштуванні <a href="http://dokuwiki.org">ДокуВікі</a>. Більше інформації про програму установки можна знайти на <a href="http://dokuwiki.org/ru:installer">сторінці документації</a>.</p>
-<p>ДокуВікі використовую звичайні файли для зберігання сторінок вікі та іншої інформації,
-щодо цих сторінок (наприклад, зображень, індексів пошуку, старих ревізій та ін.). Для
-успішного функціонування ДокуВікі <strong>має</strong> мати права на запис для папок, що
-містять ці файли. Ця програма установки не може змінювати права доступу. Звичайно це
-робиться за допомогою інтерпретатора shell, або, якщо ви використовуєте хостинг,
-за допомогою FTP або панелі управління хостингом (наприклад cPanel).</p>
+<p>ДокуВікі використовую звичайні файли для зберігання сторінок вікі та іншої інформації, щодо цих сторінок (наприклад, зображень, індексів пошуку, старих ревізій та ін.). Для успішного функціонування ДокуВікі <strong>має</strong> мати права на запис для папок, що містять ці файли. Ця програма установки не може змінювати права доступу. Звичайно це робиться за допомогою інтерпретатора shell, або, якщо ви використовуєте хостинг, за допомогою FTP або панелі управління хостингом (наприклад cPanel).</p>
-<p>Ця програма установки налаштує вашу ДокуВікі для використання
-<abbr title="список контролю доступу">ACL</abbr>, що, в свою чергу,
-дозволить адміністратору входити до адміністративного меню для установки доданків,
-керування користувачами, керування правами доступу до сторінок Вікі та змін параметрів
-конфігурації. Це не є обов'язковим для роботи ДокуВікі, але зробить життя адміністратора
-значно легшим.</p>
+<p>Ця програма установки налаштує вашу ДокуВікі для використання <abbr title="список контролю доступу">ACL</abbr>, що, в свою чергу, дозволить адміністратору входити до адміністративного меню для установки доданків, керування користувачами, керування правами доступу до сторінок Вікі та змін параметрів конфігурації. Це не є обов'язковим для роботи ДокуВікі, але зробить життя адміністратора значно легшим.</p>
-<p>Досвідчені користувачі, або користувачі, що мають особливі вимоги до налагодження, мають
-використовувати ці посилання для детальної інформації, щодо
-<a href="http://dokuwiki.org/install">інструкцій з установки</a>
-та <a href="http://dokuwiki.org/config">параметрів конфігурації</a>.</p>
+<p>Досвідчені користувачі, або користувачі, що мають особливі вимоги до налагодження, мають використовувати ці посилання для детальної інформації, щодо <a href="http://dokuwiki.org/ru:install">інструкцій з установки</a> та <a href="http://dokuwiki.org/ru:config">параметрів конфігурації</a>.</p>
diff --git a/inc/lang/uk/lang.php b/inc/lang/uk/lang.php
index e9ed28aa3..2b7784409 100644
--- a/inc/lang/uk/lang.php
+++ b/inc/lang/uk/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author velmyshanovnyi <velmyshanovnyi@gmail.com>
+ * @author Dmytro Marchenko <dmytro.marchenko1989@gmail.com>
* @author Oleksii <alexey.furashev@gmail.com>
* @author Vitaly <vitaly.balashov@smuzzy.com.ua>
* @author Oleksiy Voronin <ovoronin@gmail.com>
@@ -24,7 +26,7 @@ $lang['doublequoteclosing'] = '”';
$lang['singlequoteopening'] = '‘';
$lang['singlequoteclosing'] = '’';
$lang['apostrophe'] = '’';
-$lang['btn_edit'] = 'Редагувати';
+$lang['btn_edit'] = 'Редагувати цю сторінку';
$lang['btn_source'] = 'Показати вихідний текст';
$lang['btn_show'] = 'Показати сторінку';
$lang['btn_create'] = 'Створити сторінку';
@@ -32,8 +34,8 @@ $lang['btn_search'] = 'Пошук';
$lang['btn_save'] = 'Зберегти';
$lang['btn_preview'] = 'Перегляд';
$lang['btn_top'] = 'Повернутися наверх';
-$lang['btn_newer'] = '<< більш нові';
-$lang['btn_older'] = 'більш старі >>';
+$lang['btn_newer'] = '<< новіші';
+$lang['btn_older'] = 'старіші >>';
$lang['btn_revs'] = 'Старі ревізії';
$lang['btn_recent'] = 'Останні зміни';
$lang['btn_upload'] = 'Завантажити';
@@ -76,44 +78,9 @@ $lang['badpassconfirm'] = 'Вибачте, але пароль невір
$lang['minoredit'] = 'Незначні зміни';
$lang['draftdate'] = 'Чернетка збережена';
$lang['nosecedit'] = 'Сторінку змінено, дані розділу застарілі. Завантажено сторінку повністю.';
-$lang['regmissing'] = 'Необхідно заповнити всі поля.';
-$lang['reguexists'] = 'Користувач з таким іменем вже існує.';
-$lang['regsuccess'] = 'Користувача створено. Пароль відправлено на e-mail.';
-$lang['regsuccess2'] = 'Користувача створено.';
-$lang['regfail'] = 'Користувач не створений';
-$lang['regmailfail'] = 'При відправленні пароля сталась помилка. Зв’яжіться з адміністратором!';
-$lang['regbadmail'] = 'Схоже, що адреса e-mail невірна - якщо ви вважаєте, що це помилка, зв’яжіться з адміністратором';
-$lang['regbadpass'] = 'Надані паролі не співпадають, спробуйте ще раз.';
-$lang['regpwmail'] = 'Пароль ДокуВікі';
-$lang['reghere'] = 'Ще не маєте облікового запису? Отримайте його негайно';
-$lang['profna'] = 'Ця Вікі не підтримує зміни профілю';
-$lang['profnochange'] = 'Немає змін, немає що робити.';
-$lang['profnoempty'] = 'Ім’я або e-mail не можуть бути пустими.';
-$lang['profchanged'] = 'Профіль успішно змінено.';
-$lang['profnodelete'] = 'Ця вікі не підтримує видалення користувачів.';
-$lang['profdeleteuser'] = 'Видалити аккаунт';
-$lang['profdeleted'] = 'Ваш профіль користувача буде видалено з цієї wiki.';
-$lang['profconfdelete'] = 'Я хочу видалити мій акаунт з цієї вікі.';
-$lang['profconfdeletemissing'] = 'Галочка на "Підтверджено" не поставлена';
-$lang['proffail'] = 'Профіль користувача не вдалося поновити.';
-$lang['pwdforget'] = 'Забули пароль? Отримайте новий';
-$lang['resendna'] = 'Ця Вікі не підтримує повторне відправлення пароля.';
-$lang['resendpwd'] = 'Встановити новий пароль для';
-$lang['resendpwdmissing'] = 'Необхідно заповнити усі поля.';
-$lang['resendpwdnouser'] = 'Такий користувач не існує.';
-$lang['resendpwdbadauth'] = 'Код автентифікації невірний. Перевірте, чи ви використали повне посилання для підтвердження.';
-$lang['resendpwdconfirm'] = 'Посилання для підтвердження відіслано на e-mail.';
-$lang['resendpwdsuccess'] = 'Новий пароль відіслано на e-mail.';
-$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['searchcreatepage'] = 'Якщо ви не знайшли те, що шукали, ви можете створити або відредагувати сторінку %s, названу після вашого запиту.';
+$lang['search_fullresults'] = 'Повнотекстові результати';
+$lang['js']['search_toggle_tools'] = 'Переключити інструменти пошуку';
$lang['js']['willexpire'] = 'Блокування редагування цієї сторінки закінчується через хвилину.\n Щоб уникнути конфліктів використовуйте кнопку перегляду для продовження блокування.';
$lang['js']['notsavedyet'] = 'Незбережені зміни будуть втрачені.
Дійсно продовжити?';
@@ -156,6 +123,56 @@ $lang['js']['media_done_btn'] = 'Успішно';
$lang['js']['media_drop'] = 'Перетягніть сюди файли для відвантаження';
$lang['js']['media_cancel'] = 'видалити';
$lang['js']['media_overwrt'] = 'Перезаписати існуючі файли';
+$lang['search_exact_match'] = 'Точна відповідність';
+$lang['search_starts_with'] = 'Починається з';
+$lang['search_ends_with'] = 'Закінчується з';
+$lang['search_contains'] = 'Містить';
+$lang['search_custom_match'] = 'Користувальницький';
+$lang['search_any_ns'] = 'Будь-який простір імен';
+$lang['search_any_time'] = 'Будь-який час';
+$lang['search_past_7_days'] = 'Минулий тиждень';
+$lang['search_past_month'] = 'Минулий місяць';
+$lang['search_past_year'] = 'Минулий рік';
+$lang['search_sort_by_hits'] = 'Сортувати за зверненнями';
+$lang['search_sort_by_mtime'] = 'Сортувати за останньою зміною';
+$lang['regmissing'] = 'Необхідно заповнити всі поля.';
+$lang['reguexists'] = 'Користувач з таким іменем вже існує.';
+$lang['regsuccess'] = 'Користувача створено. Пароль відправлено на e-mail.';
+$lang['regsuccess2'] = 'Користувача створено.';
+$lang['regfail'] = 'Користувач не створений';
+$lang['regmailfail'] = 'При відправленні пароля сталась помилка. Зв’яжіться з адміністратором!';
+$lang['regbadmail'] = 'Схоже, що адреса e-mail невірна - якщо ви вважаєте, що це помилка, зв’яжіться з адміністратором';
+$lang['regbadpass'] = 'Надані паролі не співпадають, спробуйте ще раз.';
+$lang['regpwmail'] = 'Пароль ДокуВікі';
+$lang['reghere'] = 'Ще не маєте облікового запису? Отримайте його негайно';
+$lang['profna'] = 'Ця Вікі не підтримує зміни профілю';
+$lang['profnochange'] = 'Немає змін, немає що робити.';
+$lang['profnoempty'] = 'Ім’я або e-mail не можуть бути пустими.';
+$lang['profchanged'] = 'Профіль успішно змінено.';
+$lang['profnodelete'] = 'Ця вікі не підтримує видалення користувачів.';
+$lang['profdeleteuser'] = 'Видалити аккаунт';
+$lang['profdeleted'] = 'Ваш профіль користувача буде видалено з цієї wiki.';
+$lang['profconfdelete'] = 'Я хочу видалити мій акаунт з цієї вікі.';
+$lang['profconfdeletemissing'] = 'Галочка на "Підтверджено" не поставлена';
+$lang['proffail'] = 'Профіль користувача не вдалося поновити.';
+$lang['pwdforget'] = 'Забули пароль? Отримайте новий';
+$lang['resendna'] = 'Ця Вікі не підтримує повторне відправлення пароля.';
+$lang['resendpwd'] = 'Встановити новий пароль для';
+$lang['resendpwdmissing'] = 'Необхідно заповнити усі поля.';
+$lang['resendpwdnouser'] = 'Такий користувач не існує.';
+$lang['resendpwdbadauth'] = 'Код автентифікації невірний. Перевірте, чи ви використали повне посилання для підтвердження.';
+$lang['resendpwdconfirm'] = 'Посилання для підтвердження відіслано на e-mail.';
+$lang['resendpwdsuccess'] = 'Новий пароль відіслано на e-mail.';
+$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['rssfailed'] = 'Виникла помилка під час отримання RSS-стрічки: ';
$lang['nothingfound'] = 'Нічого не знайдено.';
$lang['mediaselect'] = 'Вибір медіа-файлу';
diff --git a/inc/lang/uk/locked.txt b/inc/lang/uk/locked.txt
index 367c286bf..8cdf39411 100644
--- a/inc/lang/uk/locked.txt
+++ b/inc/lang/uk/locked.txt
@@ -1,3 +1,3 @@
====== Сторінку заблоковано ======
-Цю сторінку заблоковано іншим користувачем для редагування. Зачекайте, поки цей користувач завершить редагування або закінчиться час блокування. \ No newline at end of file
+Цю сторінку заблоковано іншим користувачем для редагування. Зачекайте, поки цей користувач завершить редагування або закінчиться час блокування.
diff --git a/inc/lang/uk/login.txt b/inc/lang/uk/login.txt
index f45f81024..bc3315155 100644
--- a/inc/lang/uk/login.txt
+++ b/inc/lang/uk/login.txt
@@ -1,4 +1,3 @@
====== Вхід до вікі ======
Ви не ввійшли до системи. Введіть ваші реєстраційні дані для того, щоб увійти. У вашому браузері повинні бути увімкнені файли cookies.
-
diff --git a/inc/lang/uk/newpage.txt b/inc/lang/uk/newpage.txt
index 39cdecc35..70fee6afe 100644
--- a/inc/lang/uk/newpage.txt
+++ b/inc/lang/uk/newpage.txt
@@ -1,4 +1,3 @@
====== Сторінка ще не існує ======
-Ви прийшли за посиланням на сторінку, що ще не існує. Якщо ваші права дозволяють, ви можете створити цю сторінку натиснувши кнопку ''Створити сторінку''.
-
+Ви прийшли за посиланням на сторінку, що ще не існує. Якщо ваші права дозволяють, ви можете створити цю сторінку натиснувши кнопку **Створити сторінку**.
diff --git a/inc/lang/uk/norev.txt b/inc/lang/uk/norev.txt
index 3c9295fce..09d2cf751 100644
--- a/inc/lang/uk/norev.txt
+++ b/inc/lang/uk/norev.txt
@@ -1,4 +1,3 @@
====== Немає такої ревізії ======
Вказана ревізія не існує. Використовуйте кнопку ''Старі ревізії'', щоб отримати перелік ревізій цього документу.
-
diff --git a/inc/lang/uk/preview.txt b/inc/lang/uk/preview.txt
index b4174c7a4..f74e9a50e 100644
--- a/inc/lang/uk/preview.txt
+++ b/inc/lang/uk/preview.txt
@@ -1,4 +1,3 @@
====== Попередній перегляд ======
-Це попередній перегляд того, як буде виглядати ваш текст. Не забувайте, текст ще **не збережено**!
-
+Це попередній перегляд того, як буде виглядати ваш текст. **Не забувайте, текст ще не збережено**!
diff --git a/inc/lang/uk/pwconfirm.txt b/inc/lang/uk/pwconfirm.txt
index cd981f116..d10077915 100644
--- a/inc/lang/uk/pwconfirm.txt
+++ b/inc/lang/uk/pwconfirm.txt
@@ -4,7 +4,6 @@
Якщо це були не ви, ігноруйте це повідомлення.
-Для підтвердження, що це дійсно ви запитали новий пароль, будь ласка
-перейдіть за наступним посиланням.
+Для підтвердження, що це дійсно ви запитали новий пароль, будь ласка перейдіть за наступним посиланням.
@CONFIRM@
diff --git a/inc/lang/uk/read.txt b/inc/lang/uk/read.txt
index 59ea6a1b6..352ae3595 100644
--- a/inc/lang/uk/read.txt
+++ b/inc/lang/uk/read.txt
@@ -1,2 +1 @@
Ця сторінка доступна тільки для перегляду. Ви можете продивитися вихідний текст, але не можете змінювати його. Якщо ви вважаєте, що це не вірно, зверніться до адміністратора.
-
diff --git a/inc/lang/uk/recent.txt b/inc/lang/uk/recent.txt
index 645e3d869..4c211f4fa 100644
--- a/inc/lang/uk/recent.txt
+++ b/inc/lang/uk/recent.txt
@@ -1,4 +1,3 @@
====== Останні зміни ======
-Вказані нижче сторінки було змінено нещодавно.
-
+Вказані нижче сторінки було змінено нещодавно:
diff --git a/inc/lang/uk/register.txt b/inc/lang/uk/register.txt
index 8fffc002e..6bdc836cd 100644
--- a/inc/lang/uk/register.txt
+++ b/inc/lang/uk/register.txt
@@ -1,4 +1,3 @@
====== Реєстрація нового користувача ======
-Введіть необхідну інформацію для того, щоб створити нового користувача у цій Вікі. Переконайтеся. що ви ввели **правильну адресу e-mail** - якщо ви не ввели пароль, то новий пароль буде відіслано на цю адресу. Ім'я користувача повинно бути дозволеною [[doku>pagename|назвою сторінки]] вікі.
-
+Введіть необхідну інформацію для того, щоб створити нового користувача у цій Вікі. Переконайтеся. що ви ввели **правильну адресу e-mail** - якщо ви не ввели пароль, то новий пароль буде відіслано на цю адресу. Ім'я користувача повинно бути дозволеною [[doku>ru:pagename|назвою сторінки]] вікі.
diff --git a/inc/lang/uk/resetpwd.txt b/inc/lang/uk/resetpwd.txt
index b24e88473..a673429a9 100644
--- a/inc/lang/uk/resetpwd.txt
+++ b/inc/lang/uk/resetpwd.txt
@@ -1,3 +1,3 @@
====== Встановити новий пароль ======
-Будь-ласка, введіть новий пароль для цієї wiki. \ No newline at end of file
+Будь-ласка, введіть новий пароль для цієї wiki.
diff --git a/inc/lang/uk/revisions.txt b/inc/lang/uk/revisions.txt
index 646de2a2f..6baca8905 100644
--- a/inc/lang/uk/revisions.txt
+++ b/inc/lang/uk/revisions.txt
@@ -1,4 +1,3 @@
====== Старі ревізії ======
Це старі версії поточного документа. Для того, щоб повернутися до старої версії, виберіть її, натисніть ''Редагувати'', та збережіть сторінку.
-
diff --git a/inc/lang/uk/searchpage.txt b/inc/lang/uk/searchpage.txt
index f323c4ae4..67a7129e5 100644
--- a/inc/lang/uk/searchpage.txt
+++ b/inc/lang/uk/searchpage.txt
@@ -1,4 +1,3 @@
====== Пошук ======
Дивіться результати пошуку нижче. @CREATEPAGEINFO@
-
diff --git a/inc/lang/uk/stopwords.txt b/inc/lang/uk/stopwords.txt
index 288ab8e9f..56dc48d8b 100644
--- a/inc/lang/uk/stopwords.txt
+++ b/inc/lang/uk/stopwords.txt
@@ -1,3 +1,4 @@
# Це список ігнорованих індексатором слів, одне слово в рядку
# При редагуванні цього файлу переконайтеся, що використовуєте символи переведення рядку, як в UNIX (одиночні)
# Слова, коротші за 3 символи включати не треба. Вони ігноруються в будь-якому випадку
+www
diff --git a/inc/lang/uk/updateprofile.txt b/inc/lang/uk/updateprofile.txt
index d043f99a7..9c5f111cc 100644
--- a/inc/lang/uk/updateprofile.txt
+++ b/inc/lang/uk/updateprofile.txt
@@ -1,5 +1,3 @@
====== Оновити ваш профіль ======
Необхідно заповнити тільки ті поля, які ви бажаєте змінити. Ви не можете змінити ім’я користувача.
-
-
diff --git a/inc/lang/vi/admin.txt b/inc/lang/vi/admin.txt
index d8ac73e8c..ab3010fb4 100644
--- a/inc/lang/vi/admin.txt
+++ b/inc/lang/vi/admin.txt
@@ -1,3 +1,3 @@
====== Quản lý ======
-Sau đây là các mục quản lý trong DokuWiki.
+Dưới đây bạn có thể tìm thấy một danh sách các nhiệm vụ quản lý có sẵn trong DokuWiki.
diff --git a/inc/lang/vi/adminplugins.txt b/inc/lang/vi/adminplugins.txt
new file mode 100644
index 000000000..89f8165ad
--- /dev/null
+++ b/inc/lang/vi/adminplugins.txt
@@ -0,0 +1 @@
+===== Plugin bổ sung ===== \ No newline at end of file
diff --git a/inc/lang/vi/conflict.txt b/inc/lang/vi/conflict.txt
index 646dcbc45..f54e6ea80 100644
--- a/inc/lang/vi/conflict.txt
+++ b/inc/lang/vi/conflict.txt
@@ -1,5 +1,5 @@
-====== Có phiên bản mới hơn ======
+====== Có phiên bản mới hơn tồn tại ======
-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.
+Một phiên bản mới hơn của tài liệu bạn sửa đổi tồn tại. Điều này xảy ra khi một thành viên khác thay đổi tài liệu trong khi bạn đang sửa đổi nó.
-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.
+Kiểm tra khác biệt được hiển thị dưới đây, sau đó hãy quyết định giữ phiên bản nào. Nếu bạn chọn ''Lưu'', phiên bản của bạn sẽ được lưu. Nhấn ''Hủy bỏ'' để giữ phiên bản hiện tại.
diff --git a/inc/lang/vi/denied.txt b/inc/lang/vi/denied.txt
index fe6e759fc..145b13c6e 100644
--- a/inc/lang/vi/denied.txt
+++ b/inc/lang/vi/denied.txt
@@ -1,4 +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.
+====== Không được phép ======
+Rất tiếc là bạn không có đủ quyền để tiếp tục.
diff --git a/inc/lang/vi/diff.txt b/inc/lang/vi/diff.txt
index 10bfd0f30..ad7e10ff2 100644
--- a/inc/lang/vi/diff.txt
+++ b/inc/lang/vi/diff.txt
@@ -1,4 +1,3 @@
====== Khác biệt ======
Đây là những khác biệt giữa phiên bạn được chọn và phiên bản hiện tại của trang này.
-
diff --git a/inc/lang/vi/draft.txt b/inc/lang/vi/draft.txt
new file mode 100644
index 000000000..34ee9e5b5
--- /dev/null
+++ b/inc/lang/vi/draft.txt
@@ -0,0 +1,5 @@
+====== Tìm thấy tập tin nháp ======
+
+Phiên sửa đổi cuối cùng của bạn trên trang này không được hoàn thành chính xác. DokuWiki tự động lưu một bản nháp trong khi bạn đang sửa đổi mà bây giờ bạn có thể sử dụng để tiếp tục sửa đổi. Bạn có thể thấy dữ liệu dưới đây được lưu từ phiên trước của bạn.
+
+Vui lòng quyết định nếu bạn muốn //khôi phục// phiên sửa đổi bị mất của bạn, //xóa// bản nháp được lưu tự động hoặc //hủy// quá trình sửa đổi. \ No newline at end of file
diff --git a/inc/lang/vi/edit.txt b/inc/lang/vi/edit.txt
index 1c16f903c..7fc123bd8 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 ''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ử]].
+Sửa đổi trang này và nhấn ''Lưu''. Xem [[wiki:syntax]] cho cú pháp Wiki. Vui lòng sửa đổi trang chỉ khi nào bạn có thể **cải thiện** nó. Nếu bạn muốn thử một số thứ, hãy học cách thực hiện những bước đầu tiên của bạn tại [[playground:playground|chỗ thử]].
diff --git a/inc/lang/vi/editrev.txt b/inc/lang/vi/editrev.txt
index 8a2031c4d..f2c1209e6 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 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.
+**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ữ liệu này.
----
diff --git a/inc/lang/vi/index.txt b/inc/lang/vi/index.txt
index 708d2030d..8ef044448 100644
--- a/inc/lang/vi/index.txt
+++ b/inc/lang/vi/index.txt
@@ -1,3 +1,3 @@
====== Mục lục ======
-Đây là mục lục của tất cả các trang, xếp theo thứ tự [[doku>namespaces|namespaces]].
+Đây là mục lục của tất cả các trang, xếp theo thứ tự [[doku>namespaces|không gian tên]].
diff --git a/inc/lang/vi/lang.php b/inc/lang/vi/lang.php
index 8e49dec37..bbb2e074d 100644
--- a/inc/lang/vi/lang.php
+++ b/inc/lang/vi/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Thien Hau <thienhausoftware@gmail.com>
* @author James Do <jdo@myrealbox.com>
*/
$lang['encoding'] = 'utf-8';
@@ -12,14 +13,14 @@ $lang['doublequoteclosing'] = '”';
$lang['singlequoteopening'] = '‘';
$lang['singlequoteclosing'] = '’';
$lang['apostrophe'] = '’';
-$lang['btn_edit'] = 'Biên soạn trang này';
-$lang['btn_source'] = 'Xem mã nguồn';
+$lang['btn_edit'] = 'Sửa đổi trang này';
+$lang['btn_source'] = 'Xem mã nguồn trang';
$lang['btn_show'] = 'Xem trang';
$lang['btn_create'] = 'Tạo trang này';
-$lang['btn_search'] = 'Tìm';
+$lang['btn_search'] = 'Tìm kiếm';
$lang['btn_save'] = 'Lưu';
-$lang['btn_preview'] = 'Duyệt trước';
-$lang['btn_top'] = 'Trở lên trên';
+$lang['btn_preview'] = 'Xem trước';
+$lang['btn_top'] = 'Quay 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ũ';
@@ -27,16 +28,17 @@ $lang['btn_recent'] = 'Thay đổi gần đây';
$lang['btn_upload'] = 'Tải lên';
$lang['btn_cancel'] = 'Huỷ bỏ';
$lang['btn_index'] = 'Mục lục';
-$lang['btn_secedit'] = 'Biên soạn';
+$lang['btn_secedit'] = 'Sửa đổi';
$lang['btn_login'] = 'Đăng nhập';
-$lang['btn_logout'] = 'Thoát';
+$lang['btn_logout'] = 'Đăng xuấ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_backlink'] = 'Liên kết đến đây';
+$lang['btn_subscribe'] = 'Quản lý các mục đăng ký';
$lang['btn_profile'] = 'Cập nhật hồ sơ';
-$lang['btn_reset'] = 'Làm lại';
+$lang['btn_reset'] = 'Đặt 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';
@@ -44,199 +46,314 @@ $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['btn_media'] = 'Quản lý tập tin';
+$lang['btn_deleteuser'] = 'Xóa tài khoản của tôi';
+$lang['btn_img_backto'] = 'Quay lại %s';
+$lang['btn_mediaManager'] = 'Xem trong Trình quản lý tập tin';
+$lang['loggedinas'] = 'Đăng nhập vói tên:';
+$lang['user'] = 'Tên thành viên';
$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['oldpass'] = 'Xác nhận 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['remember'] = 'Nhớ tôi';
+$lang['fullname'] = 'Tên thật';
+$lang['email'] = 'Thư điện tử';
$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';
-$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['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'] = '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['badlogin'] = 'Tên thành viên hoặc mật khẩu không đúng.';
+$lang['badpassconfirm'] = 'Xin lỗi, mật khẩu không đúng';
+$lang['minoredit'] = 'Thay đổi nhỏ';
+$lang['draftdate'] = 'Bản nháp được lưu tự động lúc';
+$lang['nosecedit'] = 'Trang đã được thay đổi trong một thời gian ngắn, thông tin phần đã hết hạn được tải toàn bộ trang.';
+$lang['searchcreatepage'] = 'Nếu bạn không tìm thấy những gì bạn đang tìm kiếm, bạn có thể tạo hoặc sửa đổi trang %s, được đặt tên theo truy vấn của bạn.';
+$lang['search_fullresults'] = 'Toàn văn kết quả';
+$lang['js']['search_toggle_tools'] = 'Chuyển đổi công cụ tìm kiếm';
+$lang['js']['willexpire'] = 'Khóa của bạn dùng cho việc sửa đổi trang này sắp hết hạn sau một phút nữa.\nĐể tránh xung đột, hãy sử dụng nút xem trước để đặt lại bộ hẹn giờ khóa.';
+$lang['js']['notsavedyet'] = 'Những thay đổi chưa được lưu sẽ bị mất.';
$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']['keepopen'] = 'Giữ cửa sổ 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']['mediaalign'] = 'Căn chỉnh';
+$lang['js']['mediasize'] = 'Cỡ hình ảnh';
+$lang['js']['mediatarget'] = 'Liên kết đến';
$lang['js']['mediaclose'] = 'Đóng';
$lang['js']['mediainsert'] = 'Chèn';
-$lang['js']['mediadisplayimg'] = 'Hiển thị ảnh.';
+$lang['js']['mediadisplayimg'] = 'Hiển thị hình ả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']['mediasmall'] = 'Phiên bản nhỏ';
+$lang['js']['mediamedium'] = 'Phiên bản vừa';
+$lang['js']['medialarge'] = 'Phiên bản lớn';
+$lang['js']['mediaoriginal'] = 'Phiên bản 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']['mediadirect'] = 'Liên kết trực tiếp tới tập tin 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']['medianolink'] = 'Không liên kết đến hình ảnh';
+$lang['js']['medialeft'] = 'Căn chỉnh hình ảnh sang trái.';
+$lang['js']['mediaright'] = 'Căn chỉnh hình ảnh sang phải.';
+$lang['js']['mediacenter'] = 'Căn chỉnh hình ảnh ra giữa.';
+$lang['js']['medianoalign'] = 'Không căn chỉnh.';
+$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 chép và dán liên kết.';
+$lang['js']['linkwiz'] = 'Thuật sĩ liên kết';
$lang['js']['linkto'] = 'Liên kết tới:';
-$lang['js']['del_confirm'] = 'Xoá mục này?';
+$lang['js']['del_confirm'] = 'Muốn xóa (các) mục đã chọn?';
$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_diff'] = 'Xem khác biệt:';
+$lang['js']['media_diff_both'] = 'Cạnh nhau';
+$lang['js']['media_diff_opacity'] = 'Xuyên qua';
+$lang['js']['media_diff_portions'] = 'Vuốt';
+$lang['js']['media_select'] = 'Chọn tệp tin...';
$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'] = 'Xem';
+$lang['js']['media_drop'] = 'Kéo tập tin vào đây để tải lên';
+$lang['js']['media_cancel'] = 'xóa';
+$lang['js']['media_overwrt'] = 'Ghi đè các tập tin hiện có';
+$lang['search_exact_match'] = 'Khớp chính xác';
+$lang['search_starts_with'] = 'Bắt đầu với';
+$lang['search_ends_with'] = 'Kết thúc bằng';
+$lang['search_contains'] = 'Chứa';
+$lang['search_custom_match'] = 'Tùy chỉnh';
+$lang['search_any_ns'] = 'Mọi không gian tên';
+$lang['search_any_time'] = 'Mọi lúc';
+$lang['search_past_7_days'] = 'Tuần trước';
+$lang['search_past_month'] = 'Tháng trước';
+$lang['search_past_year'] = 'Năm trước';
+$lang['search_sort_by_hits'] = 'Sắp xếp theo lượt truy cập';
+$lang['search_sort_by_mtime'] = 'Sắp xếp theo sửa đổi cuối';
+$lang['regmissing'] = 'Xin lỗi, bạn cần điền vào tất cả các trường';
+$lang['reguexists'] = 'Xin lỗi, thành viên có thông tin đăng nhập này đã tồn tại.';
+$lang['regsuccess'] = 'Thành viên đã được tạo và mật khẩu được gửi qua thư điện tử.';
+$lang['regsuccess2'] = 'Thành viên đã được tạo.';
+$lang['regfail'] = 'Không thể tạo thành viên.';
+$lang['regmailfail'] = 'Có vẻ như đã xảy ra lỗi khi gửi thư mật khẩu. Vui lòng liên hệ với quản trị viên!';
+$lang['regbadmail'] = 'Địa chỉ thư điện tử cung cấp có vẻ không hợp lệ - nếu bạn nghĩ đây là lỗi, hãy liên hệ với quản trị viên';
+$lang['regbadpass'] = 'Hai mật khẩu đã nhập không giống nhau, vui lòng thử lại.';
+$lang['regpwmail'] = 'Mật khẩu DokuWiki của bạn';
+$lang['reghere'] = 'Bạn chưa có tài khoản? Hãy lấy một cái';
+$lang['profna'] = 'Wiki này không hỗ trợ sửa đổi hồ sơ';
+$lang['profnochange'] = 'Không có thay đổi, không có gì để làm.';
+$lang['profnoempty'] = 'Không được bỏ trống tên hoặc địa chỉ thư điện tử.';
+$lang['profchanged'] = 'Cập nhật Hồ sơ thành viên thành công.';
+$lang['profnodelete'] = 'Wiki này không hỗ trợ xóa thành viên';
+$lang['profdeleteuser'] = 'Xóa tài khoản';
+$lang['profdeleted'] = 'Tài khoản thành viên của bạn đã bị xóa khỏi wiki này';
+$lang['profconfdelete'] = 'Tôi muốn xóa tài khoản của tôi khỏi wiki này. <br/> Hành động này không thể hoàn tác.';
+$lang['profconfdeletemissing'] = 'Hộp kiểm xác nhận chưa được đánh dấu';
+$lang['proffail'] = 'Hồ sơ thành viên chưa được cập nhật.';
+$lang['pwdforget'] = 'Bạn quên mật khẩu? Thử một cái 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ã xác thực này 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 qua thư điện tử.';
+$lang['resendpwdsuccess'] = 'Mật khẩu mới của bạn đã được gửi qua thư điện tử.';
+$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:';
+$lang['licenseok'] = 'Lưu ý: Bằng cách sửa đổi trang này, bạn đồng ý cấp phép cho nội dung của mình theo giấy phép sau:';
+$lang['searchmedia'] = 'Tìm kiếm tên tập tin:';
+$lang['searchmedia_in'] = 'Tìm kiếm ở %s';
+$lang['txt_upload'] = 'Chọn tập tin để tải lên:';
+$lang['txt_filename'] = 'Tải lên dưới dạng (tùy chọn):';
+$lang['txt_overwrt'] = 'Ghi đè tập tin hiện có';
+$lang['maxuploadsize'] = 'Tải lên tối đa. %s mỗi tập tin.';
+$lang['lockedby'] = 'Hiện đang bị khóa bởi:';
+$lang['lockexpire'] = 'Sẽ được mở khóa vào lúc:';
+$lang['rssfailed'] = 'Đã xảy ra lỗi khi tìm nạp nguồn cấp dữ liệu này:';
+$lang['nothingfound'] = 'Không có gì được tìm thấy.';
+$lang['mediaselect'] = 'Tập tin Phương tiện';
$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 đủ quyền?';
-$lang['uploadwrong'] = 'Tải lên bị từ chối. Cấm tải loại tệp này';
-$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['uploadfail'] = 'Tải lên không thành công. Có thể không đủ quyền?';
+$lang['uploadwrong'] = 'Tải lên bị từ chối. Phần mở rộng tập tin này bị cấm!';
+$lang['uploadexist'] = 'Tập tin đã tồn tại. Không có gì được thực hiện.';
+$lang['uploadbadcontent'] = 'Nội dung được tải lên không khớp với phần tập tin mở rộng %s.';
+$lang['uploadspam'] = 'Việc tải lên đã bị chặn bởi danh sách đen thư rác.';
+$lang['uploadxss'] = 'Việc tải lên đã bị chặn do nội dung độc hại.';
+$lang['uploadsize'] = 'Tập tin đã tải lên quá lớn. (tối đa %s)';
+$lang['deletesucc'] = 'Tập tin "%s" đã bị xóa.';
+$lang['deletefail'] = 'Không thể xóa "%s" - kiểm tra quyền.';
+$lang['mediainuse'] = 'Không thể xóa tập tin "%s" - nó vẫn đang được sử dụng.';
+$lang['namespaces'] = 'Không gian tên';
+$lang['mediafiles'] = 'Tập tin có sẵn trong';
$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['mediausage'] = 'Sử dụng cú pháp sau để tham chiếu tập tin này:';
+$lang['mediaview'] = 'Xem tập tin 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';
-$lang['toc'] = 'Nội dung';
+$lang['mediaupload'] = 'Tải một tập tin vào không gian tên hiện tại ở đây. Để tạo không gian tên con, hãy thêm chúng vào tên tệp của bạn được phân tách bằng dấu hai chấm sau khi bạn chọn tập tin. Tập tin cũng có thể được chọn bằng cách kéo và thả.';
+$lang['mediaextchange'] = 'Phần mở rộng tập tin đã được thay đổi từ .%s thành .%s!';
+$lang['reference'] = 'Tài liệu tham khảo cho';
+$lang['ref_inuse'] = 'Không thể xóa tập tin này vì nó vẫn được sử dụng ở các trang sau:';
+$lang['ref_hidden'] = 'Một số tài liệu tham khảo trên các trang bạn không có quyền đọc';
+$lang['hits'] = 'Lượt truy cập';
+$lang['quickhits'] = 'Tên trang trùng khớp';
+$lang['toc'] = 'Mục lục';
$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['yours'] = 'Phiên bản của bạn';
+$lang['diff'] = 'Xem khác biệt với phiên bản hiện tại';
+$lang['diff2'] = 'Xem khác biệt giữa các phiên bản được chọn';
+$lang['difflink'] = 'Liên kết đến bản xem so sánh này';
+$lang['diff_type'] = 'Xem khác biệt:';
$lang['diff_inline'] = 'Nội tuyến';
-$lang['diff_side'] = 'Xếp cạnh nhau';
+$lang['diff_side'] = 'Cạnh nhau';
+$lang['diffprevrev'] = 'Phiên bản trước';
+$lang['diffnextrev'] = 'Phiên bản sau';
+$lang['difflastrev'] = 'Phiên bản cuối';
+$lang['diffbothprevrev'] = 'Phiên bản cuối của cả hai bên';
+$lang['diffbothnextrev'] = 'Phiên bản sau của cả hai bên';
$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['lastmod'] = 'Sửa đổi lần cuối:';
+$lang['by'] = 'bởi';
$lang['deleted'] = 'bị xoá';
-$lang['created'] = 'được tạo ra';
+$lang['created'] = 'tạo';
$lang['restored'] = 'phiên bản cũ đã được khôi phục (%s)';
-$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['external_edit'] = 'sửa đổi bên ngoài';
+$lang['summary'] = 'Tóm tắt sửa đổi';
+$lang['noflash'] = 'Cần có <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> mới có thể xem được nội dung này.';
+$lang['download'] = 'Tải xuống đoạn trích';
+$lang['tools'] = 'Công cụ';
+$lang['user_tools'] = 'Công cụ thành viên';
+$lang['site_tools'] = 'Công cụ trang web';
+$lang['page_tools'] = 'Công cụ trang';
+$lang['skip_to_content'] = 'Đi đến nội dung';
+$lang['sidebar'] = 'Thanh bên';
+$lang['mail_newpage'] = 'trang đã thêm:';
+$lang['mail_changed'] = 'trang đã thay đổi:';
+$lang['mail_subscribe_list'] = 'các trang đã thay đổi trong không gian tên:';
+$lang['mail_new_user'] = 'thành viên mới:';
+$lang['mail_upload'] = 'tập tin đã được tải lên:';
$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['media_changes'] = 'Tập tin phương tiện';
+$lang['both_changes'] = 'Cả trang và các tập tin phương tiện';
$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_underl'] = 'Chữ gạch chân';
+$lang['qb_code'] = 'Chữ đơn cách';
+$lang['qb_strike'] = 'Chữ đè gạch ngang';
$lang['qb_h1'] = 'Đầu đề cấp 1';
$lang['qb_h2'] = 'Đầu đề cấp 2';
$lang['qb_h3'] = 'Đầu đề cấp 3';
$lang['qb_h4'] = 'Đầu đề cấp 4';
$lang['qb_h5'] = 'Đầu đề cấp 5';
-$lang['qb_link'] = 'Mốc nối nội tại';
-$lang['qb_extlink'] = 'Mốc nối ra ngoài';
-$lang['qb_hr'] = 'Gạch ngang';
-$lang['qb_ol'] = 'Điểm trong danh sách có thứ tự';
-$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['metaedit'] = 'Sửa Metadata';
-$lang['metasaveerr'] = 'Thất bại khi viết metadata';
-$lang['metasaveok'] = 'Metadata đã được lưu';
-$lang['btn_img_backto'] = 'Quay lại %s';
+$lang['qb_h'] = 'Đầu đề';
+$lang['qb_hs'] = 'Chọn đầu đề';
+$lang['qb_hplus'] = 'Đầu đề cao hơn';
+$lang['qb_hminus'] = 'Đầu đề thấp hơn';
+$lang['qb_hequal'] = 'Đầu đề cùng cấp';
+$lang['qb_link'] = 'Liên kết nội bộ';
+$lang['qb_extlink'] = 'Liên kết ngoài';
+$lang['qb_hr'] = 'Thanh ngang';
+$lang['qb_ol'] = 'Mục danh sách đánh số';
+$lang['qb_ul'] = 'Mục danh sách không đánh số';
+$lang['qb_media'] = 'Thêm hình ảnh và các tập tin khác (mở trong một cửa sổ mới)';
+$lang['qb_sig'] = 'Chèn chữ ký';
+$lang['qb_smileys'] = 'Biểu tượng mặt cười';
+$lang['qb_chars'] = 'Ký tự đặc biệt';
+$lang['upperns'] = 'nhảy đến không gian tên mẹ';
+$lang['metaedit'] = 'Sửa Siêu dữ liệu';
+$lang['metasaveerr'] = 'Viết Siêu dữ liệu không thành công';
+$lang['metasaveok'] = 'Đã lưu Siêu dữ liệu';
$lang['img_title'] = 'Tiêu đề:';
-$lang['img_caption'] = 'Ghi chú:';
+$lang['img_caption'] = 'Chú thích:';
$lang['img_date'] = 'Ngày:';
-$lang['img_fname'] = 'Tên file:';
-$lang['img_fsize'] = 'Kích cỡ:';
+$lang['img_fname'] = 'Tên tập tin:';
+$lang['img_fsize'] = 'Kích thướ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_camera'] = 'Máy ảnh:';
$lang['img_keywords'] = 'Từ khóa:';
-$lang['img_width'] = 'Rộng:';
-$lang['img_height'] = 'Cao:';
-$lang['btn_mediaManager'] = 'Xem trong trình quản lý tệp media';
-$lang['i_chooselang'] = 'Chọn ngôn ngữ';
+$lang['img_width'] = 'Chiều rộng:';
+$lang['img_height'] = 'Chiều cao:';
+$lang['subscr_subscribe_success'] = 'Đã thêm %s vào danh sách đăng ký cho %s';
+$lang['subscr_subscribe_error'] = 'Có lỗi khi thêm %s vào danh sách đăng ký cho %s';
+$lang['subscr_subscribe_noaddress'] = 'Không có địa chỉ liên quan nào đến thông tin đăng nhập của bạn, bạn không thể thêm vào danh sách đăng ký';
+$lang['subscr_unsubscribe_success'] = 'Đã xóa %s khỏi danh sách đăng ký cho %s';
+$lang['subscr_unsubscribe_error'] = 'Có lỗi khi xóa %s khỏi danh sách đăng ký cho %s';
+$lang['subscr_already_subscribed'] = '%s đã được đăng ký cho %s';
+$lang['subscr_not_subscribed'] = '%s chưa được đăng ký cho %s';
+$lang['subscr_m_not_subscribed'] = 'Bạn hiện chưa đăng ký vào trang hiện tại hoặc không gian tên.';
+$lang['subscr_m_new_header'] = 'Thêm đăng ký';
+$lang['subscr_m_current_header'] = 'Đăng ký hiện tại';
+$lang['subscr_m_unsubscribe'] = 'Hủy đăng ký';
+$lang['subscr_m_subscribe'] = 'Đăng ký';
+$lang['subscr_m_receive'] = 'Nhận';
+$lang['subscr_style_every'] = 'thư điện tử về mọi thay đổi';
+$lang['subscr_style_digest'] = 'Thông báo thư điện tử về các thay đổi cho mỗi trang (mỗi %.2f ngày)';
+$lang['subscr_style_list'] = 'danh sách các trang đã thay đổi kể từ thư điện tử cuối cùng (mỗi %.2f ngày)';
+$lang['authtempfail'] = 'Xác thực thành viên tạm thời không có sẵn. Nếu tình trạng này vẫn còn, vui lòng thông báo cho Quản trị viên Wiki của bạn.';
+$lang['i_chooselang'] = 'Chọn ngôn ngữ của bạn';
+$lang['i_installer'] = 'Trình cài đặt DokuWiki';
+$lang['i_wikiname'] = 'Tên Wiki';
+$lang['i_enableacl'] = 'Kích hoạt ACL (khuyến nghị)';
+$lang['i_superuser'] = 'Siêu thành viên';
+$lang['i_problems'] = 'Trình cài đặt tìm thấy một số vấn đề, được chỉ ra bên dưới. Bạn không thể tiếp tục cho đến khi bạn đã sửa chúng.';
+$lang['i_modified'] = 'Vì lý do bảo mật, tập lệnh này sẽ chỉ hoạt động với bản cài đặt Dokuwiki mới và chưa được sửa đổi.
+ Bạn nên trích xuất lại các tệp từ gói đã tải xuống hoặc tham khảo
+ <a href="http://dokuwiki.org/install">Hướng dẫn cài đặt Dokuwiki</a> đầy đủ';
+$lang['i_funcna'] = 'Hàm PHP <code>%s</code> không có sẵn. Có lẽ nhà cung cấp dịch vụ lưu trữ của bạn đã vô hiệu hóa nó vì một số lý do?';
+$lang['i_phpver'] = 'Phiên bản PHP <code>%s</code> hiện taị thấp hơn mức <code>%s</code> cần thiết. Bạn cần nâng cấp cài đặt PHP của bạn.';
+$lang['i_mbfuncoverload'] = 'mbopes.func_overload phải bị vô hiệu trong php.ini để chạy DokuWiki.';
+$lang['i_urandom'] = 'DokuWiki không thể tạo số mật mã an toàn cho cookie. Bạn có thể muốn kiểm tra cài đặt open_basingir trong php.ini để truy cập <code>/dev/urandom</code> thích hợp.';
+$lang['i_permfail'] = 'DokuWiki Không thể ghi được <code>%s</code>. Bạn cần sửa đổi các thiết lập quyền của đường dẫn này!';
+$lang['i_confexists'] = '<code>%s</code> đã tồn tại';
+$lang['i_writeerr'] = 'Không thể tạo <code>%s</code>. Bạn sẽ cần kiểm tra quyền truy cập thư mục/tập tin và tạo tập tin thủ công.';
+$lang['i_badhash'] = 'Không thể công nhận hoặc sửa đổi dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval'] = '<code>%s</code> - giá trị bất hợp pháp hoặc trống';
+$lang['i_success'] = 'Đã hoàn thành việc cấu hình thành công. Bạn có thể xóa tệp install.php ngay bây giờ. Tiếp tục
+ <a href="doku.php?id=wiki:welcome">DokuWiki mới của bạn</a>';
+$lang['i_failure'] = 'Một số lỗi xảy ra trong khi viết các tập tin cấu hình. Bạn có thể cần phải sửa chúng bằng tay trước khi
+ bạn có thể sử dụng <a href="doku.php?id=wiki:welcome">DokuWiki mới của bạn</a>.';
+$lang['i_policy'] = 'Thiết lập chính sách ACL';
+$lang['i_pol0'] = 'Wiki mở (bất kỳ ai cũng có thể đọc, viết, tải lên)';
+$lang['i_pol1'] = 'Wiki công cộng (bất kỳ ai cũng có thể xem, thành viên đã đăng ký có thể viết và tải lên)';
+$lang['i_pol2'] = 'Wiki đóng (chỉ thành viên đã đăng ký mới có thể đọc, viết, tải lên)';
+$lang['i_allowreg'] = 'Cho phép người dùng tự đăng ký';
$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['i_license'] = 'Vui lòng chọn giấy phép bạn muốn đặt nội dung của bạn dưới:';
+$lang['i_license_none'] = 'Không hiển thị bất kỳ thông tin giấy phép';
+$lang['i_pop_field'] = 'Vui lòng giúp chúng tôi cải thiện trải nghiệm DokuWiki:';
+$lang['i_pop_label'] = 'Mỗi tháng một lần, gửi dữ liệu sử dụng ẩn danh đến các nhà phát triển DokuWiki';
+$lang['recent_global'] = 'Bạn hiện đang xem những thay đổi bên trong không gian tên <b>%s</b>. Bạn cũng có thể <a href="%s">xem những thay đổi gần đây trên toàn bộ wiki</a>.';
+$lang['years'] = '%d năm trước';
+$lang['months'] = '%d tháng trước';
+$lang['weeks'] = '%d tuần trước';
+$lang['days'] = '%d ngày trước';
+$lang['hours'] = '%d giờ trước';
+$lang['minutes'] = '%d phút trước';
+$lang['seconds'] = '%d giây trước';
+$lang['wordblock'] = 'Thay đổi của bạn không được lưu vì nó 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_searchtab'] = 'Tìm kiếm';
+$lang['media_file'] = 'Tập tin';
$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_thumbs'] = 'Hì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_namespaces'] = 'Chọn không gian tên';
+$lang['media_files'] = 'Các tập tin trong %s';
$lang['media_upload'] = 'Tải lên %s';
-$lang['media_search'] = 'Tìm ở %s';
+$lang['media_search'] = 'Tìm kiế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_meta_edited'] = 'đã sửa siêu dữ liệu';
+$lang['media_perm_read'] = 'Xin lỗi, bạn không có đủ quyền để đọc tập tin.';
+$lang['media_perm_upload'] = 'Xin lỗi, bạn không đủ quyền để tải tập tin 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';
-$lang['email_signature_text'] = 'Điện thư này tạo bởi DokuWiki ở
+$lang['media_acl_warning'] = 'Danh sách này có thể không đầy đủ do các hạn chế ACL và trang ẩn.';
+$lang['currentns'] = 'Không gian tên hiện tại';
+$lang['searchresult'] = 'Kết quả tìm kiếm';
+$lang['plainhtml'] = 'HTML thuần túy';
+$lang['wikimarkup'] = 'Đánh dấu Wiki';
+$lang['page_nonexist_rev'] = 'Trang không tồn tại tại %s. Sau đó, nó đã được tạo ở <a href="%s">%s</a>.';
+$lang['unable_to_parse_date'] = 'Không thể phân tích cú pháp tại tham số "%s".';
+$lang['email_signature_text'] = 'Thư này được tạo bởi DokuWiki tại
@DOKUWIKIURL@';
diff --git a/inc/lang/vi/locked.txt b/inc/lang/vi/locked.txt
index acb0981c5..014fd8d9e 100644
--- a/inc/lang/vi/locked.txt
+++ b/inc/lang/vi/locked.txt
@@ -1,3 +1,3 @@
====== Trang bị khoá ======
-Trang này đang bị khoá để một bạn khác biên soạn. Bạn cần đợi cho đến khi nào bạn kia đã biên soạn xong, hoặc khoá hết hạn.
+Trang này hiện đang bị khóa do thành viên khác đang sửa đổi. Bạn phải đợi cho đến khi thành viên này hoàn thành sửa đổi hoặc khóa hết hạn.
diff --git a/inc/lang/vi/login.txt b/inc/lang/vi/login.txt
index 71a8b1a01..f9fbc9434 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! 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.
+Hiện bạn chưa đăng nhập! Nhập thông tin xác thực của bạn bên dưới để đăng nhập. Bạn cần bật cookie để đăng nhập.
diff --git a/inc/lang/vi/mailtext.txt b/inc/lang/vi/mailtext.txt
index bcbb65659..4b6c6b56d 100644
--- a/inc/lang/vi/mailtext.txt
+++ b/inc/lang/vi/mailtext.txt
@@ -1,12 +1,14 @@
Một trang trên DokuWiki của bạn vừa được bổ sung hoặc thay đổi. Sau đây là chi tiết:
-Date : @DATE@
-Browser : @BROWSER@
-IP-Address : @IPADDRESS@
-Hostname : @HOSTNAME@
-Old Revision: @OLDPAGE@
-New Revision: @NEWPAGE@
-Edit Summary: @SUMMARY@
-User : @USER@
+Ngày : @DATE@
+Trình duyệt : @BROWSER@
+Địa chỉ IP : @IPADDRESS@
+Tên máy chủ : @HOSTNAME@
+Phiên bản cũ: @OLDPAGE@
+Phiên bản mới: @NEWPAGE@
+Tóm lược sửa đổi: @SUMMARY@
+Thành viên : @USER@
+
+Có thể có những thay đổi mới hơn sau khi phiên bản này. Nếu điều này xảy ra, một tin nhắn sẽ được hiển thị trên đầu trang rev.
@DIFF@
diff --git a/inc/lang/vi/newpage.txt b/inc/lang/vi/newpage.txt
index 93f474b18..614cf9e4b 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 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ị.
+Bạn đã truy cập một liên kết đến một chủ đề chưa tồn tại. Nếu quyền cho phép, bạn có thể tạo nó bằng cách nhấp vào **Tạo trang này**.
diff --git a/inc/lang/vi/norev.txt b/inc/lang/vi/norev.txt
index 224bd1db0..afa0a91bc 100644
--- a/inc/lang/vi/norev.txt
+++ b/inc/lang/vi/norev.txt
@@ -1,3 +1,3 @@
-====== Phiên bản chưa có ======
+====== Không có phiên bản ======
-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.
+Phiên bản bạn yêu cầu không tồn tại. Nhấn vào "Phiên bản cũ" để biết danh sách các bản sửa đổi cũ của tài liệu này.
diff --git a/inc/lang/vi/onceexisted.txt b/inc/lang/vi/onceexisted.txt
new file mode 100644
index 000000000..a07663bf1
--- /dev/null
+++ b/inc/lang/vi/onceexisted.txt
@@ -0,0 +1,3 @@
+======= Trang này không còn tồn tại ======
+
+Bạn đã vào một liên kết đến một trang không còn tồn tại. Bạn có thể kiểm tra danh sách [[?do=revisions|phiên bản cũ]] để xem khi nào và tại sao nó bị xóa, truy cập các phiên bản cũ hoặc khôi phục nó. \ No newline at end of file
diff --git a/inc/lang/vi/password.txt b/inc/lang/vi/password.txt
index 9f80429f8..11571c6aa 100644
--- a/inc/lang/vi/password.txt
+++ b/inc/lang/vi/password.txt
@@ -1,6 +1,6 @@
-Thân chào bạn @FULLNAME@!
+Chào @FULLNAME@!
-Đây là chi tiết để bạn đăng nhập @TITLE@ tại @DOKUWIKIURL@:
+Đây là thông tin thành viên chi tiết để bạn đăng nhập @TITLE@ tại @DOKUWIKIURL@:
Username: @LOGIN@
Password: @PASSWORD@
diff --git a/inc/lang/vi/preview.txt b/inc/lang/vi/preview.txt
index f02a25142..a259827e8 100644
--- a/inc/lang/vi/preview.txt
+++ b/inc/lang/vi/preview.txt
@@ -1,3 +1,3 @@
====== Xem trước ======
-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**!
+Đây là một bản xem trước của văn bản của bạn sẽ trông như thế nào. **Hãy nhớ: Nó vẫn chưa được lưu**!
diff --git a/inc/lang/vi/pwconfirm.txt b/inc/lang/vi/pwconfirm.txt
new file mode 100644
index 000000000..ee2625bb5
--- /dev/null
+++ b/inc/lang/vi/pwconfirm.txt
@@ -0,0 +1,9 @@
+Chào @FULLNAME@!
+
+Ai đó đã yêu cầu mật khẩu mới cho bạn đăng nhập @TITLE@ tại @DOKUWIKIURL@
+
+Nếu bạn không yêu cầu mật khẩu mới thì hãy bỏ qua thư điện tử này.
+
+Để xác nhận rằng yêu cầu đã thực sự được gửi bởi bạn, vui lòng truy cập liên kết sau.
+
+@CONFIRM@ \ No newline at end of file
diff --git a/inc/lang/vi/read.txt b/inc/lang/vi/read.txt
index eec69966b..f87905a68 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. Hãy báo lại người quản lý nếu hệ thống hoạt động không đúng.
+Trang này hiện chỉ có thể đọc được. Bạn có thể xem mã nguồn, nhưng không thể thay đổi nó. Hỏi quản trị viên của bạn nếu bạn nghĩ rằng điều này là sai.
diff --git a/inc/lang/vi/recent.txt b/inc/lang/vi/recent.txt
index fe6628f6e..59a144608 100644
--- a/inc/lang/vi/recent.txt
+++ b/inc/lang/vi/recent.txt
@@ -1,3 +1,3 @@
====== Thay đổi gần đây ======
-Những trang sau được thay đổi gần đây.
+Những trang sau có thay đổi gần đây:
diff --git a/inc/lang/vi/register.txt b/inc/lang/vi/register.txt
index f7d35c84b..c6f7ae12a 100644
--- a/inc/lang/vi/register.txt
+++ b/inc/lang/vi/register.txt
@@ -1,3 +1,3 @@
-====== Đăng ký mới ======
+====== Đăng ký làm thành viên mới ======
-Xin điền vào mọi thông tin sau đây để tạo một username mới cho wiki này. Bạn cần cung cấp **e-mail chính xác** - để gởi password mới của bạn đến đấy. Username cần là một [[doku>pagename|pagename]] hợp lệ.
+Điền vào tất cả các thông tin dưới đây để tạo một tài khoản mới trong wiki này. Hãy chắc chắn rằng bạn cung cấp một **địa chủ thư điện tử hợp lệ** - nếu bạn không được yêu cầu nhập mật khẩu tại đây, một mật khẩu mới sẽ được gửi đến địa chỉ đó. Tên đăng nhập phải là [[doku>pagename|tên]] hợp lệ .
diff --git a/inc/lang/vi/registermail.txt b/inc/lang/vi/registermail.txt
new file mode 100644
index 000000000..786d8c175
--- /dev/null
+++ b/inc/lang/vi/registermail.txt
@@ -0,0 +1,10 @@
+Một người dùng mới đã đăng ký. Đây là những thông tin chi tiết:
+
+Tên thành viên : @NEWUSER@
+Tên đầy đủ : @NEWNAME@
+Thư điện tử : @NEWEMAIL@
+
+Ngày : @DATE@
+Trình duyệt : @BROWSER@
+Địa chỉ IP : @IPADDRESS@
+Tên máy chủ : @HOSTNAME@ \ No newline at end of file
diff --git a/inc/lang/vi/resendpwd.txt b/inc/lang/vi/resendpwd.txt
new file mode 100644
index 000000000..879c33617
--- /dev/null
+++ b/inc/lang/vi/resendpwd.txt
@@ -0,0 +1,3 @@
+====== Gửi mật khẩu mới ======
+
+Vui lòng nhập tên thành viên của bạn vào mẫu dưới đây để yêu cầu mật khẩu mới cho tài khoản của bạn trong wiki này. Một liên kết xác nhận sẽ được gửi đến địa chỉ thư điện tử đã đăng ký của bạn. \ No newline at end of file
diff --git a/inc/lang/vi/resetpwd.txt b/inc/lang/vi/resetpwd.txt
new file mode 100644
index 000000000..b307583de
--- /dev/null
+++ b/inc/lang/vi/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Đặt mật khẩu mới ======
+
+Vui lòng nhập mật khẩu mới cho tài khoản của bạn trong wiki này. \ No newline at end of file
diff --git a/inc/lang/vi/revisions.txt b/inc/lang/vi/revisions.txt
index b9e9779ee..b32338ee8 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 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.
+Đây là những phiên bản cũ của tài liệu hiện tại. Để lùi sửa về phiên bản cũ, chọn nó từ bên dưới, nhấp vào ''Chỉnh sửa trang này'' và lưu nó.
diff --git a/inc/lang/vi/searchpage.txt b/inc/lang/vi/searchpage.txt
index cbba3fa48..0b4344512 100644
--- a/inc/lang/vi/searchpage.txt
+++ b/inc/lang/vi/searchpage.txt
@@ -1,4 +1,3 @@
-====== Tìm ======
+====== Tìm kiếm ======
Sau đây là kết quả mà bạn đã tìm. @CREATEPAGEINFO@
-
diff --git a/inc/lang/vi/showrev.txt b/inc/lang/vi/showrev.txt
index a146f4ef3..93326e5a9 100644
--- a/inc/lang/vi/showrev.txt
+++ b/inc/lang/vi/showrev.txt
@@ -1,2 +1,2 @@
-**Đây là một phiên bản cũ cùa văn kiện!**
+**Đây là một phiên bản cũ cùa văn bản!**
----
diff --git a/inc/lang/vi/stopwords.txt b/inc/lang/vi/stopwords.txt
new file mode 100644
index 000000000..b9c8957c9
--- /dev/null
+++ b/inc/lang/vi/stopwords.txt
@@ -0,0 +1,39 @@
+# Đây là danh sách các từ mà người lập chỉ mục bỏ qua, mỗi từ một dòng
+# Khi bạn sửa đổi tệp này, hãy chắc chắn sử dụng các kết thúc dòng UNIX (dòng mới)
+# Không cần bao gồm các từ ngắn hơn 3 ký tự - dù sao chúng cũng bị bỏ qua
+# Danh sách này dựa trên những cái được tìm thấy tại http://www.ranks.nl/stopwords/
+about
+are
+as
+an
+and
+you
+your
+them
+their
+com
+for
+from
+into
+if
+in
+is
+it
+how
+of
+on
+or
+that
+the
+this
+to
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www \ No newline at end of file
diff --git a/inc/lang/vi/subscr_digest.txt b/inc/lang/vi/subscr_digest.txt
new file mode 100644
index 000000000..a2abd8581
--- /dev/null
+++ b/inc/lang/vi/subscr_digest.txt
@@ -0,0 +1,16 @@
+Chào!
+
+Trang @PAGE@ trong wiki @TITLE@ đã được thay đổi.
+Dưới đây là những thay đổi:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Phiên bản cũ: @OLDPAGE@
+Phiên bản mới: @NEWPAGE@
+
+Để hủy thông báo trang, đăng nhập vào wiki tại
+@DOKUWIKIURL@ sau đó truy cập
+@SUBSCRIBE@
+và hủy đăng ký trang và/hoặc thay đổi không gian tên. \ No newline at end of file
diff --git a/inc/lang/vi/subscr_form.txt b/inc/lang/vi/subscr_form.txt
new file mode 100644
index 000000000..326491587
--- /dev/null
+++ b/inc/lang/vi/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Quản lý đăng ký ======
+
+Trang này cho phép bạn quản lý đăng ký của mình cho trang hiện tại và không gian tên. \ No newline at end of file
diff --git a/inc/lang/vi/subscr_list.txt b/inc/lang/vi/subscr_list.txt
new file mode 100644
index 000000000..e58cc39cb
--- /dev/null
+++ b/inc/lang/vi/subscr_list.txt
@@ -0,0 +1,13 @@
+Chào!
+
+Trang @PAGE@ trong wiki @TITLE@ đã được thay đổi.
+Dưới đây là những thay đổi:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Để hủy thông báo trang, đăng nhập vào wiki tại
+@DOKUWIKIURL@ sau đó truy cập
+@SUBSCRIBE@
+và hủy đăng ký trang và/hoặc thay đổi không gian tên. \ No newline at end of file
diff --git a/inc/lang/vi/subscr_single.txt b/inc/lang/vi/subscr_single.txt
new file mode 100644
index 000000000..11166c22d
--- /dev/null
+++ b/inc/lang/vi/subscr_single.txt
@@ -0,0 +1,19 @@
+Chào!
+
+Trang @PAGE@ trong wiki @TITLE@ đã được thay đổi.
+Dưới đây là những thay đổi:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Thành viên : @USER@
+Tóm lược sửa đổi : @SUMMARY@
+Phiên bản cũ : @OLDPAGE@
+Phiên bản mới : @NEWPAGE@
+Ngày phiên bản mới: @DATE@
+
+Để hủy thông báo trang, đăng nhập vào wiki tại
+@DOKUWIKIURL@ sau đó truy cập
+@SUBSCRIBE@
+và hủy đăng ký trang và/hoặc thay đổi không gian tên. \ No newline at end of file
diff --git a/inc/lang/vi/updateprofile.txt b/inc/lang/vi/updateprofile.txt
new file mode 100644
index 000000000..e362bb27c
--- /dev/null
+++ b/inc/lang/vi/updateprofile.txt
@@ -0,0 +1,3 @@
+====== Cập nhật hồ sơ tài khoản của bạn ======
+
+Bạn chỉ cần hoàn thành những trường bạn muốn thay đổi. Bạn không thể thay đổi tên người dùng của bạn. \ No newline at end of file
diff --git a/inc/lang/vi/uploadmail.txt b/inc/lang/vi/uploadmail.txt
new file mode 100644
index 000000000..97428b154
--- /dev/null
+++ b/inc/lang/vi/uploadmail.txt
@@ -0,0 +1,11 @@
+Một tập tin đã được tải lên DokuWiki của bạn. Đây là những thông tin chi tiết:
+
+Tập tin : @MEDIA@
+Phiên bản cũ: @OLD@
+Ngày : @DATE@
+Trình duyệt : @BROWSER@
+Địa chỉ IP : @IPADDRESS@
+Tên máy chủ : @HOSTNAME@
+Kích cỡ : @SIZE@
+Loại MIME : @MIME@
+Thành viên : @USER@ \ No newline at end of file
diff --git a/inc/lang/zh-tw/admin.txt b/inc/lang/zh-tw/admin.txt
index 5916e7106..8a7ac0f3d 100644
--- a/inc/lang/zh-tw/admin.txt
+++ b/inc/lang/zh-tw/admin.txt
@@ -1,3 +1,3 @@
====== 管理選單 ======
-以下為 DokuWiki 的管理設定。 \ No newline at end of file
+以下為 DokuWiki 的管理設定。
diff --git a/inc/lang/zh-tw/backlinks.txt b/inc/lang/zh-tw/backlinks.txt
index 6a8bf8896..f7d000ba4 100644
--- a/inc/lang/zh-tw/backlinks.txt
+++ b/inc/lang/zh-tw/backlinks.txt
@@ -1,4 +1,3 @@
====== 反向連結 ======
這是引用、連結到目前頁面的頁面清單。
-
diff --git a/inc/lang/zh-tw/conflict.txt b/inc/lang/zh-tw/conflict.txt
index 4f31f665f..c4836ca92 100644
--- a/inc/lang/zh-tw/conflict.txt
+++ b/inc/lang/zh-tw/conflict.txt
@@ -2,4 +2,4 @@
此檔案已存在更新的版本。這是因為有其他使用者在您編輯時變更了這份文件。
-請仔細檢查以下差異,再決定保留哪份。您可選擇「儲存」您的版本或「取消」保留目前版本。 \ No newline at end of file
+請仔細檢查以下差異,再決定保留哪份。您可選擇「儲存」您的版本或「取消」保留目前版本。
diff --git a/inc/lang/zh-tw/denied.txt b/inc/lang/zh-tw/denied.txt
index 23f306d07..754ee92db 100644
--- a/inc/lang/zh-tw/denied.txt
+++ b/inc/lang/zh-tw/denied.txt
@@ -1,4 +1,3 @@
====== 權限拒絕 ======
抱歉,您沒有足夠權限繼續執行。
-
diff --git a/inc/lang/zh-tw/diff.txt b/inc/lang/zh-tw/diff.txt
index e2c05001f..b32f7638f 100644
--- a/inc/lang/zh-tw/diff.txt
+++ b/inc/lang/zh-tw/diff.txt
@@ -1,3 +1,3 @@
====== 差異處 ======
-這裏顯示兩個版本的差異處。 \ No newline at end of file
+這裏顯示兩個版本的差異處。
diff --git a/inc/lang/zh-tw/edit.txt b/inc/lang/zh-tw/edit.txt
index f6b74794f..60dffe0dc 100644
--- a/inc/lang/zh-tw/edit.txt
+++ b/inc/lang/zh-tw/edit.txt
@@ -1 +1 @@
-編輯本頁後,請按下「儲存」按鈕。若要參看語法說明,請到[[wiki:syntax|語法]]頁。請只在能讓本文品質**更好**時才編輯。如果只是要測試,請移玉步至 [[playground:playground|遊樂場]]。 \ No newline at end of file
+編輯本頁後,請按下「儲存」按鈕。若要參看語法說明,請到[[wiki:syntax|語法]]頁。請只在能讓本文品質**更好**時才編輯。如果只是要測試,請移玉步至 [[playground:playground|遊樂場]]。
diff --git a/inc/lang/zh-tw/index.txt b/inc/lang/zh-tw/index.txt
index 31e60ac87..e5fd2431f 100644
--- a/inc/lang/zh-tw/index.txt
+++ b/inc/lang/zh-tw/index.txt
@@ -1,3 +1,3 @@
====== 網站地圖 ======
-這個網站地圖列出了所有允許的頁面,依 [[doku>namespaces|分類名稱]] 排序。 \ No newline at end of file
+這個網站地圖列出了所有允許的頁面,依 [[doku>namespaces|分類名稱]] 排序。
diff --git a/inc/lang/zh-tw/install.html b/inc/lang/zh-tw/install.html
index 9a0d1dcd9..85df3c7fe 100644
--- a/inc/lang/zh-tw/install.html
+++ b/inc/lang/zh-tw/install.html
@@ -1,8 +1,7 @@
-<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/zh-tw:installer">官方文檔頁面</a>。</p>
<p>DokuWiki 使用普通檔案來儲存 wiki 頁面,以及與頁面相關的訊息(例如:圖像、搜尋索引、修訂記錄等)。為了正常運作,DokuWiki <strong>必須</strong> 擁有針對那些路徑和檔案的寫入權限。本安裝工具無法設定目錄權限,這通常要透過命令行、FTP 或您主機上的控制台(如cPanel)進行。</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
+<p>有經驗的或有特殊需求的使用者,請參閱更詳細的 <a href="http://dokuwiki.org/zh-tw:install">安裝指南</a> 和 <a href="http://dokuwiki.org/zh-tw:config">設定</a>。</p>
diff --git a/inc/lang/zh-tw/login.txt b/inc/lang/zh-tw/login.txt
index b82f08a20..77269b501 100644
--- a/inc/lang/zh-tw/login.txt
+++ b/inc/lang/zh-tw/login.txt
@@ -1,4 +1,3 @@
====== 登入 ======
您尚未登入,請輸入您的使用者名稱和密碼。 另外,瀏覽器需要啟用 cookies 以登入本 wiki。
-
diff --git a/inc/lang/zh-tw/newpage.txt b/inc/lang/zh-tw/newpage.txt
index 06ccd3d75..5c5da7e57 100644
--- a/inc/lang/zh-tw/newpage.txt
+++ b/inc/lang/zh-tw/newpage.txt
@@ -1,3 +1,3 @@
====== 此主題不存在 ======
-您來到了一個未建立頁面的主題。如果權限允許,您可以用 「建立此頁」按鈕建立頁面。 \ No newline at end of file
+您來到了一個未建立頁面的主題。如果權限允許,您可以用 **建立此頁**按鈕建立頁面。
diff --git a/inc/lang/zh-tw/norev.txt b/inc/lang/zh-tw/norev.txt
index 2a32ba6a8..7fea647c8 100644
--- a/inc/lang/zh-tw/norev.txt
+++ b/inc/lang/zh-tw/norev.txt
@@ -1,3 +1,3 @@
====== 無此版本 ======
-該版本的文件不存在。請用「舊版」按鈕檢視該文件所有舊版本清單。 \ No newline at end of file
+該版本的文件不存在。請用「舊版」按鈕檢視該文件所有舊版本清單。
diff --git a/inc/lang/zh-tw/preview.txt b/inc/lang/zh-tw/preview.txt
index 95d4b10e1..7fd65547f 100644
--- a/inc/lang/zh-tw/preview.txt
+++ b/inc/lang/zh-tw/preview.txt
@@ -1,4 +1,3 @@
====== 預覽 ======
以下是該文件的預覽。請記住:**您還未儲存它**!
-
diff --git a/inc/lang/zh-tw/read.txt b/inc/lang/zh-tw/read.txt
index 4a472cd0d..ed3d5e8ba 100644
--- a/inc/lang/zh-tw/read.txt
+++ b/inc/lang/zh-tw/read.txt
@@ -1 +1 @@
-本頁是唯讀的,您可以看到原始碼,但不能更動它。您如果覺得它不應被鎖上,請詢問管理員。 \ No newline at end of file
+本頁是唯讀的,您可以看到原始碼,但不能更動它。您如果覺得它不應被鎖上,請詢問管理員。
diff --git a/inc/lang/zh-tw/recent.txt b/inc/lang/zh-tw/recent.txt
index 28314294b..8710c6899 100644
--- a/inc/lang/zh-tw/recent.txt
+++ b/inc/lang/zh-tw/recent.txt
@@ -1,5 +1,3 @@
====== 最近更新 ======
以下的頁面是最近才更新的:
-
-
diff --git a/inc/lang/zh-tw/register.txt b/inc/lang/zh-tw/register.txt
index 6f2a75c9a..5d540d53d 100644
--- a/inc/lang/zh-tw/register.txt
+++ b/inc/lang/zh-tw/register.txt
@@ -1,3 +1,3 @@
====== 註冊新使用者 ======
-若要註冊本 wiki 的帳號,請填寫下列資料。請確定您提供的是**合法的電郵地址**。如果您不必填寫密碼,系統就會為您自動產生登入密碼,並寄送到該電郵地址。登入名稱須符合正確[[doku>pagename|頁面名稱]]之條件。
+若要註冊本 wiki 的帳號,請填寫下列資料。請確定您提供的是**合法的電郵地址**。如果您不必填寫密碼,系統就會為您自動產生登入密碼,並寄送到該電郵地址。登入名稱須符合正確[[doku>zh-tw:pagename|頁面名稱]]之條件。
diff --git a/inc/lang/zh-tw/resendpwd.txt b/inc/lang/zh-tw/resendpwd.txt
index 46078a348..e575ecb20 100644
--- a/inc/lang/zh-tw/resendpwd.txt
+++ b/inc/lang/zh-tw/resendpwd.txt
@@ -1,3 +1,3 @@
====== 寄送新密碼 ======
-請在以下欄位輸入您的帳號,新密碼將會寄送到您註冊時填寫的電郵地址。 \ No newline at end of file
+請在以下欄位輸入您的帳號,新密碼將會寄送到您註冊時填寫的電郵地址。
diff --git a/inc/lang/zh-tw/resetpwd.txt b/inc/lang/zh-tw/resetpwd.txt
index ef0bff256..b2269154e 100644
--- a/inc/lang/zh-tw/resetpwd.txt
+++ b/inc/lang/zh-tw/resetpwd.txt
@@ -1,3 +1,3 @@
====== 設定新密碼 ======
-請為您的帳號輸入新密碼。 \ No newline at end of file
+請為您的帳號輸入新密碼。
diff --git a/inc/lang/zh-tw/revisions.txt b/inc/lang/zh-tw/revisions.txt
index 64daa9935..1ca060d2a 100644
--- a/inc/lang/zh-tw/revisions.txt
+++ b/inc/lang/zh-tw/revisions.txt
@@ -1,3 +1,3 @@
====== 舊版 ======
-以下是該文件的舊版本。如要還原成某個舊版次,就點下它,然後按「編輯本頁」,並存檔起來就可以了。 \ No newline at end of file
+以下是該文件的舊版本。如要還原成某個舊版次,就點下它,然後按「編輯本頁」,並存檔起來就可以了。
diff --git a/inc/lang/zh-tw/searchpage.txt b/inc/lang/zh-tw/searchpage.txt
index 9e2c13ac7..5fe9a2e3b 100644
--- a/inc/lang/zh-tw/searchpage.txt
+++ b/inc/lang/zh-tw/searchpage.txt
@@ -1,4 +1,3 @@
====== 搜尋精靈 ======
提示:您可以在下面找到您的搜尋結果。@CREATEPAGEINFO@
-
diff --git a/inc/lang/zh-tw/updateprofile.txt b/inc/lang/zh-tw/updateprofile.txt
index a7a2ad803..7ff569889 100644
--- a/inc/lang/zh-tw/updateprofile.txt
+++ b/inc/lang/zh-tw/updateprofile.txt
@@ -1,3 +1,3 @@
====== 更新個人資料 ======
-您只需修改想更新的欄位就好,帳號名稱不能變更。 \ No newline at end of file
+您只需修改想更新的欄位就好,帳號名稱不能變更。
diff --git a/inc/lang/zh/admin.txt b/inc/lang/zh/admin.txt
index bf6476e9c..935145458 100644
--- a/inc/lang/zh/admin.txt
+++ b/inc/lang/zh/admin.txt
@@ -1,3 +1,3 @@
====== 管理 ======
-在下面您能找到 DokuWiki 中可用管理任务的列表。 \ No newline at end of file
+在下面您能找到 DokuWiki 中可用管理任务的列表。
diff --git a/inc/lang/zh/adminplugins.txt b/inc/lang/zh/adminplugins.txt
index 66cee4509..0c4bdb855 100644
--- a/inc/lang/zh/adminplugins.txt
+++ b/inc/lang/zh/adminplugins.txt
@@ -1 +1 @@
-===== 附加插件 ===== \ No newline at end of file
+===== 附加插件 =====
diff --git a/inc/lang/zh/backlinks.txt b/inc/lang/zh/backlinks.txt
index 19e3feea6..0556eabf7 100644
--- a/inc/lang/zh/backlinks.txt
+++ b/inc/lang/zh/backlinks.txt
@@ -1,3 +1,3 @@
====== 反向链接 ======
-这里是能够反向链接到当前页面的其他页面列表。 \ No newline at end of file
+这里是能够反向链接到当前页面的其他页面列表。
diff --git a/inc/lang/zh/denied.txt b/inc/lang/zh/denied.txt
index 94721e48a..d835e2866 100644
--- a/inc/lang/zh/denied.txt
+++ b/inc/lang/zh/denied.txt
@@ -1,4 +1,3 @@
====== 拒绝授权 ======
对不起,您没有足够权限,无法继续。
-
diff --git a/inc/lang/zh/diff.txt b/inc/lang/zh/diff.txt
index 19e8ef752..a733ed580 100644
--- a/inc/lang/zh/diff.txt
+++ b/inc/lang/zh/diff.txt
@@ -1,3 +1,3 @@
====== 差别 ======
-这里会显示出您选择的修订版和当前版本之间的差别。 \ No newline at end of file
+这里会显示出您选择的修订版和当前版本之间的差别。
diff --git a/inc/lang/zh/draft.txt b/inc/lang/zh/draft.txt
index 615cb07bf..77bdb8c1e 100644
--- a/inc/lang/zh/draft.txt
+++ b/inc/lang/zh/draft.txt
@@ -3,5 +3,3 @@
您在本页最后的编辑过程没有正常结束。DokuWiki 在您的编辑过程中自动保存了一份草稿,您现在可以使用它继续编辑。 下面是最后编辑时的数据。
请决定您希望 //恢复// 您丢失的编辑数据,//删除// 自动保存的草稿,或者 //取消// 本编辑过程。
-
-
diff --git a/inc/lang/zh/edit.txt b/inc/lang/zh/edit.txt
index 846e89817..7f9041ca6 100644
--- a/inc/lang/zh/edit.txt
+++ b/inc/lang/zh/edit.txt
@@ -1 +1 @@
-编辑本页后请点击“保存”。请参阅 [[wiki:syntax]] 了解维基语法。只有在您能 **改进** 该页面的前提下才编辑它。如果您想尝试一些东西,请先到 [[playground:playground|playground]] 热身。 \ No newline at end of file
+编辑本页后请点击“保存”。请参阅 [[wiki:syntax]] 了解维基语法。只有在您能 **改进** 该页面的前提下才编辑它。如果您想尝试语法,请先到 [[playground:playground|playground]] 里热身。
diff --git a/inc/lang/zh/editrev.txt b/inc/lang/zh/editrev.txt
index 82013cbbd..902d55200 100644
--- a/inc/lang/zh/editrev.txt
+++ b/inc/lang/zh/editrev.txt
@@ -1,2 +1,2 @@
**您载入了该文档旧的修订版!** 如果您保存了它,您就会用这些数据创建一份新的修订版。
----- \ No newline at end of file
+----
diff --git a/inc/lang/zh/index.txt b/inc/lang/zh/index.txt
index efb07b9e3..7c2730139 100644
--- a/inc/lang/zh/index.txt
+++ b/inc/lang/zh/index.txt
@@ -1,3 +1,3 @@
====== 索引 ======
-这是根据 [[doku>namespaces|命名空间]] 排列的所有可访问页面的索引。 \ No newline at end of file
+这是根据 [[doku>zh:namespaces|命名空间]] 排列的所有可访问页面的索引。
diff --git a/inc/lang/zh/install.html b/inc/lang/zh/install.html
index 448f6bda7..6850b1d84 100644
--- a/inc/lang/zh/install.html
+++ b/inc/lang/zh/install.html
@@ -4,5 +4,4 @@
<p>本安装工具将设置您的 DokuWiki 配置 <abbr title="访问控制列表">ACL</abbr>,它能让管理员登录并使用“管理”功能来安装插件,管理用户,管理访问权限和其他配置设置。它并不是 DokuWiki 正常运行所必须的,但安装之后它将更方便您的管理。</p>
-<p>有经验的用户或有特殊需求的用户请参阅更详细的 <a href="http://dokuwiki.org/install">安装指南</a>
-和 <a href="http://dokuwiki.org/config">配置设置</a>。</p>
+<p>有经验的用户或有特殊需求的用户请参阅更详细的 <a href="http://dokuwiki.org/zh:install">安装指南</a> 和 <a href="http://dokuwiki.org/zh:config">配置设置</a>。</p>
diff --git a/inc/lang/zh/lang.php b/inc/lang/zh/lang.php
index 3de6a2f1c..ea431d719 100644
--- a/inc/lang/zh/lang.php
+++ b/inc/lang/zh/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Xin <chenxin1034@gmail.com>
+ * @author HaoNan <haonan@zhuoming.info>
+ * @author Phy <dokuwiki@phy25.com>
+ * @author Aaron Zhou <iradio@163.com>
* @author lempel <riverlempel@hotmail.com>
* @author ZDYX <zhangduyixiong@gmail.com>
* @author http://www.chinese-tools.com/tools/converter-tradsimp.html
@@ -90,44 +94,9 @@ $lang['badpassconfirm'] = '对不起,密码错误';
$lang['minoredit'] = '细微修改';
$lang['draftdate'] = '草稿自动保存于';
$lang['nosecedit'] = '在您编辑期间本页刚被他人修改过,局部信息已过期,故载入全页。';
-$lang['regmissing'] = '对不起,您必须填写所有的字段。';
-$lang['reguexists'] = '对不起,该用户名已经存在。';
-$lang['regsuccess'] = '新用户已建立,密码将通过电子邮件发送给您。';
-$lang['regsuccess2'] = '新用户已建立';
-$lang['regfail'] = '用户不能被创建。';
-$lang['regmailfail'] = '发送密码邮件时产生错误。请联系管理员!';
-$lang['regbadmail'] = '您输入的邮件地址有问题——如果您认为这是系统错误,请联系管理员。';
-$lang['regbadpass'] = '您输入的密码与系统产生的不符,请重试。';
-$lang['regpwmail'] = '您的 DokuWiki 密码';
-$lang['reghere'] = '还没有账号?立即注册';
-$lang['profna'] = '本维基不允许修改个人信息';
-$lang['profnochange'] = '没有改动,不进行操作。';
-$lang['profnoempty'] = '不允许使用空的用户名或邮件地址。';
-$lang['profchanged'] = '用户信息更新成功。';
-$lang['profnodelete'] = '这个 wiki 不支持删除用户';
-$lang['profdeleteuser'] = '删除账号';
-$lang['profdeleted'] = '你的用户已经从这个 wiki 中删除';
-$lang['profconfdelete'] = '我希望删除我的账户。<br/>这项操作无法撤销。';
-$lang['profconfdeletemissing'] = '确认框未勾选';
-$lang['proffail'] = '用户设置没有更新。';
-$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['maxuploadsize'] = '上传限制。每个文件 %s';
-$lang['lockedby'] = '目前已被下列人员锁定:';
-$lang['lockexpire'] = '预计锁定解除于:';
+$lang['searchcreatepage'] = '如果没有找到搜索内容,你可以创建或编辑以你查找内容命名的页面 %s。';
+$lang['search_fullresults'] = '全文搜索结果';
+$lang['js']['search_toggle_tools'] = '触发搜索工具';
$lang['js']['willexpire'] = '您对本页的独有编辑权将于一分钟之后解除。\n为了防止与其他人的编辑冲突,请使用预览按钮重设计时器。';
$lang['js']['notsavedyet'] = '未保存的更改将丢失。
真的要继续?';
@@ -171,6 +140,56 @@ $lang['js']['media_done_btn'] = '完成';
$lang['js']['media_drop'] = '拖拽文件到此处来上传';
$lang['js']['media_cancel'] = '删除';
$lang['js']['media_overwrt'] = '覆盖已存在的文件';
+$lang['search_exact_match'] = '精确匹配';
+$lang['search_starts_with'] = '开始于';
+$lang['search_ends_with'] = '结束于';
+$lang['search_contains'] = '包含';
+$lang['search_custom_match'] = '定制';
+$lang['search_any_ns'] = '任何名空间';
+$lang['search_any_time'] = '任意时间';
+$lang['search_past_7_days'] = '上周';
+$lang['search_past_month'] = '上月';
+$lang['search_past_year'] = '去年';
+$lang['search_sort_by_hits'] = '按照点击率排序';
+$lang['search_sort_by_mtime'] = '按照最新更新时间排序';
+$lang['regmissing'] = '对不起,您必须填写所有的字段。';
+$lang['reguexists'] = '对不起,该用户名已经存在。';
+$lang['regsuccess'] = '新用户已建立,密码将通过电子邮件发送给您。';
+$lang['regsuccess2'] = '新用户已建立';
+$lang['regfail'] = '用户不能被创建。';
+$lang['regmailfail'] = '发送密码邮件时产生错误。请联系管理员!';
+$lang['regbadmail'] = '您输入的邮件地址有问题——如果您认为这是系统错误,请联系管理员。';
+$lang['regbadpass'] = '您输入的密码与系统产生的不符,请重试。';
+$lang['regpwmail'] = '您的 DokuWiki 密码';
+$lang['reghere'] = '还没有账号?立即注册';
+$lang['profna'] = '本维基不允许修改个人信息';
+$lang['profnochange'] = '没有改动,不进行操作。';
+$lang['profnoempty'] = '不允许使用空的用户名或邮件地址。';
+$lang['profchanged'] = '用户信息更新成功。';
+$lang['profnodelete'] = '这个 wiki 不支持删除用户';
+$lang['profdeleteuser'] = '删除账号';
+$lang['profdeleted'] = '你的用户已经从这个 wiki 中删除';
+$lang['profconfdelete'] = '我希望删除我的账户。<br/>这项操作无法撤销。';
+$lang['profconfdeletemissing'] = '确认框未勾选';
+$lang['proffail'] = '用户设置没有更新。';
+$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['maxuploadsize'] = '上传限制。每个文件 %s';
+$lang['lockedby'] = '目前已被下列人员锁定:';
+$lang['lockexpire'] = '预计锁定解除于:';
$lang['rssfailed'] = '获取该 RSS 信息时产生错误:';
$lang['nothingfound'] = '什么都没有找到。';
$lang['mediaselect'] = '媒体文件';
@@ -308,6 +327,7 @@ $lang['i_modified'] = '由于安全上的考虑,该脚本只能用
$lang['i_funcna'] = 'PHP 功能 <code>%s</code> 无法使用。也许您的服务器提供商因为某些原因禁用了它。';
$lang['i_phpver'] = '您的 PHP 版本 <code>%s</code> 低于最低要求的 <code>%s</code>。您需要升级您的 PHP 版本。';
$lang['i_mbfuncoverload'] = '为了运行DokuWiki,您必须在php.ini中禁用mbstring.func_overload。';
+$lang['i_urandom'] = 'DokuWiki 无法为 Cookie 创建密码安全的数字。您可能需要检查 php.ini 中的 open_basedir 设置,以获取正确的<code>/dev/urandom</code>访问权限。';
$lang['i_permfail'] = 'DokuWiki 无法写入 <code>%s</code>。您需要修改该路径的权限设定!';
$lang['i_confexists'] = '<code>%s</code> 已经存在';
$lang['i_writeerr'] = '无法创建 <code>%s</code>。您需要检查该路径/文件的权限设定并手动创建该文件。';
diff --git a/inc/lang/zh/locked.txt b/inc/lang/zh/locked.txt
index 321e4a047..5bcf6ac82 100644
--- a/inc/lang/zh/locked.txt
+++ b/inc/lang/zh/locked.txt
@@ -1,3 +1,3 @@
====== 页面已锁定 ======
-本页面目前正被其他用户编辑。您要等到该用户完成编辑或锁定因过期而自动解除后才能编辑。 \ No newline at end of file
+本页面目前正被其他用户编辑。您要等到该用户完成编辑或锁定因过期而自动解除后才能编辑。
diff --git a/inc/lang/zh/newpage.txt b/inc/lang/zh/newpage.txt
index 6f96b568d..9ca65e307 100644
--- a/inc/lang/zh/newpage.txt
+++ b/inc/lang/zh/newpage.txt
@@ -1,3 +1,3 @@
====== 该主题尚不存在 ======
-您访问的页面并不存在。如果允许,您可以使用“创建该页面”按钮来创建它。 \ No newline at end of file
+您访问的页面并不存在。如果允许,您可以使用**创建该页面**按钮来创建它。
diff --git a/inc/lang/zh/norev.txt b/inc/lang/zh/norev.txt
index 3fe5aabd8..6734bde75 100644
--- a/inc/lang/zh/norev.txt
+++ b/inc/lang/zh/norev.txt
@@ -1,3 +1,3 @@
====== 没有该修订版 ======
-您指定的修订版并不存在。请使用“修订记录”按钮查看本页面的修订记录列表。 \ No newline at end of file
+您指定的修订版并不存在。请使用“修订记录”按钮查看本页面的修订记录列表。
diff --git a/inc/lang/zh/onceexisted.txt b/inc/lang/zh/onceexisted.txt
new file mode 100644
index 000000000..fcdb694ee
--- /dev/null
+++ b/inc/lang/zh/onceexisted.txt
@@ -0,0 +1,3 @@
+======= 该页面不再存在 ======
+
+你访问的页面不再存在。你可以查阅[[?do=revisions|页面历史版本]]列表,其中记录了页面被删除的时间、原因,还可以查看或恢复历史版本。
diff --git a/inc/lang/zh/preview.txt b/inc/lang/zh/preview.txt
index dbb3de675..c89715583 100644
--- a/inc/lang/zh/preview.txt
+++ b/inc/lang/zh/preview.txt
@@ -1,3 +1,3 @@
====== 预览 ======
-这是该文件的效果预览。请记住:它**并没有被保存**!
+这是该文件的效果预览。**请记住:它并没有被保存**!
diff --git a/inc/lang/zh/read.txt b/inc/lang/zh/read.txt
index eb47765a2..10832a374 100644
--- a/inc/lang/zh/read.txt
+++ b/inc/lang/zh/read.txt
@@ -1,2 +1 @@
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
-
diff --git a/inc/lang/zh/recent.txt b/inc/lang/zh/recent.txt
index 95634d037..f75cd036a 100644
--- a/inc/lang/zh/recent.txt
+++ b/inc/lang/zh/recent.txt
@@ -1,5 +1,3 @@
====== 最近更新 ======
以下的页面是最近才更新的:
-
-
diff --git a/inc/lang/zh/register.txt b/inc/lang/zh/register.txt
index 7410ff1c0..020320efb 100644
--- a/inc/lang/zh/register.txt
+++ b/inc/lang/zh/register.txt
@@ -1,3 +1,3 @@
====== 注册新用户 ======
-填写以下资料来创建一个新帐户。请确定您提供的是 **正确的 E-mail 地址** - 如果您没有被要求在这里输入密码,那么新密码将通过您的邮件地址发送给您。 用于登录的用户名必须合法,请参阅 [[doku>pagename|pagename]]。
+填写以下资料来创建一个新帐户。请确定您提供的是 **正确的 E-mail 地址** - 如果您没有被要求在这里输入密码,那么新密码将通过您的邮件地址发送给您。 用于登录的用户名必须合法,请参阅 [[doku>zh:pagename|pagename]]。
diff --git a/inc/lang/zh/resendpwd.txt b/inc/lang/zh/resendpwd.txt
index f98e469e6..5c1df992e 100644
--- a/inc/lang/zh/resendpwd.txt
+++ b/inc/lang/zh/resendpwd.txt
@@ -1,5 +1,3 @@
====== 发送新密码 ======
请在下列区域中输入您的用户名来获取新密码。 一封包含确认链接的邮件将发送给您注册的邮件地址。
-
-
diff --git a/inc/lang/zh/resetpwd.txt b/inc/lang/zh/resetpwd.txt
index a9d59fdd3..3c32f0f3a 100644
--- a/inc/lang/zh/resetpwd.txt
+++ b/inc/lang/zh/resetpwd.txt
@@ -1,3 +1,3 @@
====== 设置新密码 ======
-请为您在本维基上的账户设置一个新密码。 \ No newline at end of file
+请为您在本维基上的账户设置一个新密码。
diff --git a/inc/lang/zh/revisions.txt b/inc/lang/zh/revisions.txt
index 89d2a7857..c460b6d91 100644
--- a/inc/lang/zh/revisions.txt
+++ b/inc/lang/zh/revisions.txt
@@ -1,3 +1,3 @@
====== 修订记录 ======
-以下是当前文档的修订记录。如果要回复到某个旧的修订版,请在下面选择它,并点击“编辑本页”,之后保存即可。 \ No newline at end of file
+以下是当前文档的修订记录。如果要回复到某个旧的修订版,请在下面选择它,并点击“编辑本页”,之后保存即可。
diff --git a/inc/lang/zh/searchpage.txt b/inc/lang/zh/searchpage.txt
index 0ea6cb5e4..424195bfe 100644
--- a/inc/lang/zh/searchpage.txt
+++ b/inc/lang/zh/searchpage.txt
@@ -1,4 +1,3 @@
====== 搜索 ======
下面将显示您的搜索结果。@CREATEPAGEINFO@
-
diff --git a/inc/lang/zh/updateprofile.txt b/inc/lang/zh/updateprofile.txt
index 007578801..d657b6b9a 100644
--- a/inc/lang/zh/updateprofile.txt
+++ b/inc/lang/zh/updateprofile.txt
@@ -1,5 +1,3 @@
====== 更新您帐户的信息 ======
您只需要填写希望更改的区域即可。您不能更改用户名。
-
-
diff --git a/inc/legacy.php b/inc/legacy.php
new file mode 100644
index 000000000..fa72649b7
--- /dev/null
+++ b/inc/legacy.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * We map legacy class names to the new namespaced versions here
+ *
+ * These are names that we will probably never change because they have been part of DokuWiki's
+ * public interface for years and renaming would break just too many plugins
+ */
+
+class_alias('\dokuwiki\Extension\EventHandler', 'Doku_Event_Handler');
+class_alias('\dokuwiki\Extension\Event', 'Doku_Event');
+
+class_alias('\dokuwiki\Extension\ActionPlugin', 'DokuWiki_Action_Plugin');
+class_alias('\dokuwiki\Extension\AdminPlugin', 'DokuWiki_Admin_Plugin');
+class_alias('\dokuwiki\Extension\AuthPlugin', 'DokuWiki_Auth_Plugin');
+class_alias('\dokuwiki\Extension\CLIPlugin', 'DokuWiki_CLI_Plugin');
+class_alias('\dokuwiki\Extension\Plugin', 'DokuWiki_Plugin');
+class_alias('\dokuwiki\Extension\RemotePlugin', 'DokuWiki_Remote_Plugin');
+class_alias('\dokuwiki\Extension\SyntaxPlugin', 'DokuWiki_Syntax_Plugin');
diff --git a/inc/load.php b/inc/load.php
index 2131b9d62..f4b15af27 100644
--- a/inc/load.php
+++ b/inc/load.php
@@ -5,6 +5,8 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
+use dokuwiki\Extension\PluginController;
+
// setup class autoloader
spl_autoload_register('load_autoload');
@@ -15,7 +17,6 @@ require_once(DOKU_INC.'inc/changelog.php');
require_once(DOKU_INC.'inc/common.php');
require_once(DOKU_INC.'inc/confutils.php');
require_once(DOKU_INC.'inc/pluginutils.php');
-require_once(DOKU_INC.'inc/events.php');
require_once(DOKU_INC.'inc/form.php');
require_once(DOKU_INC.'inc/fulltext.php');
require_once(DOKU_INC.'inc/html.php');
@@ -28,12 +29,13 @@ require_once(DOKU_INC.'inc/media.php');
require_once(DOKU_INC.'inc/pageutils.php');
require_once(DOKU_INC.'inc/parserutils.php');
require_once(DOKU_INC.'inc/search.php');
-require_once(DOKU_INC.'inc/subscription.php');
require_once(DOKU_INC.'inc/template.php');
require_once(DOKU_INC.'inc/toolbar.php');
require_once(DOKU_INC.'inc/utf8.php');
require_once(DOKU_INC.'inc/auth.php');
require_once(DOKU_INC.'inc/compatibility.php');
+require_once(DOKU_INC.'inc/deprecated.php');
+require_once(DOKU_INC.'inc/legacy.php');
/**
* spl_autoload_register callback
@@ -50,10 +52,7 @@ require_once(DOKU_INC.'inc/compatibility.php');
*/
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',
+ if($classes === null) $classes = array(
'Diff' => DOKU_INC.'inc/DifferenceEngine.php',
'UnifiedDiffFormatter' => DOKU_INC.'inc/DifferenceEngine.php',
'TableDiffFormatter' => DOKU_INC.'inc/DifferenceEngine.php',
@@ -61,8 +60,6 @@ function load_autoload($name){
'cache_parser' => DOKU_INC.'inc/cache.php',
'cache_instructions' => DOKU_INC.'inc/cache.php',
'cache_renderer' => DOKU_INC.'inc/cache.php',
- 'Doku_Event' => DOKU_INC.'inc/events.php',
- 'Doku_Event_Handler' => DOKU_INC.'inc/events.php',
'Input' => DOKU_INC.'inc/Input.class.php',
'JpegMeta' => DOKU_INC.'inc/JpegMeta.php',
'SimplePie' => DOKU_INC.'inc/SimplePie.php',
@@ -71,29 +68,11 @@ function load_autoload($name){
'IXR_Client' => DOKU_INC.'inc/IXR_Library.php',
'IXR_Error' => DOKU_INC.'inc/IXR_Library.php',
'IXR_IntrospectionServer' => DOKU_INC.'inc/IXR_Library.php',
- 'Doku_Plugin_Controller'=> DOKU_INC.'inc/plugincontroller.class.php',
- 'Doku_Parser_Mode' => DOKU_INC.'inc/parser/parser.php',
- 'Doku_Parser_Mode_Plugin' => DOKU_INC.'inc/parser/parser.php',
'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',
- 'Subscription' => DOKU_INC.'inc/subscription.php',
-
- 'DokuWiki_PluginInterface' => DOKU_INC.'inc/PluginInterface.php',
- 'DokuWiki_PluginTrait' => DOKU_INC.'inc/PluginTrait.php',
- 'DokuWiki_Plugin' => DOKU_INC.'inc/Plugin.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',
- 'DokuWiki_CLI_Plugin' => DOKU_PLUGIN.'cli.php',
+ 'Doku_Handler' => DOKU_INC.'inc/parser/handler.php',
'Doku_Renderer' => DOKU_INC.'inc/parser/renderer.php',
'Doku_Renderer_xhtml' => DOKU_INC.'inc/parser/xhtml.php',
'Doku_Renderer_code' => DOKU_INC.'inc/parser/code.php',
@@ -114,8 +93,17 @@ function load_autoload($name){
// namespace to directory conversion
$name = str_replace('\\', '/', $name);
+ // test namespace
+ if(substr($name, 0, 14) === 'dokuwiki/test/') {
+ $file = DOKU_INC . '_test/' . substr($name, 14) . '.php';
+ if(file_exists($file)) {
+ require $file;
+ return true;
+ }
+ }
+
// plugin namespace
- if(substr($name, 0, 16) == 'dokuwiki/plugin/') {
+ if(substr($name, 0, 16) === 'dokuwiki/plugin/') {
$name = str_replace('/test/', '/_test/', $name); // no underscore in test namespace
$file = DOKU_PLUGIN . substr($name, 16) . '.php';
if(file_exists($file)) {
@@ -125,7 +113,7 @@ function load_autoload($name){
}
// template namespace
- if(substr($name, 0, 18) == 'dokuwiki/template/') {
+ if(substr($name, 0, 18) === 'dokuwiki/template/') {
$name = str_replace('/test/', '/_test/', $name); // no underscore in test namespace
$file = DOKU_INC.'lib/tpl/' . substr($name, 18) . '.php';
if(file_exists($file)) {
@@ -135,7 +123,7 @@ function load_autoload($name){
}
// our own namespace
- if(substr($name, 0, 9) == 'dokuwiki/') {
+ if(substr($name, 0, 9) === 'dokuwiki/') {
$file = DOKU_INC . 'inc/' . substr($name, 9) . '.php';
if(file_exists($file)) {
require $file;
@@ -144,8 +132,13 @@ function load_autoload($name){
}
// Plugin loading
- if(preg_match('/^(auth|helper|syntax|action|admin|renderer|remote|cli)_plugin_('.DOKU_PLUGIN_NAME_REGEX.')(?:_([^_]+))?$/',
- $name, $m)) {
+ if(preg_match(
+ '/^(' . implode('|', PluginController::PLUGIN_TYPES) . ')_plugin_(' .
+ DOKU_PLUGIN_NAME_REGEX .
+ ')(?:_([^_]+))?$/',
+ $name,
+ $m
+ )) {
// try to load the wanted plugin file
$c = ((count($m) === 4) ? "/{$m[3]}" : '');
$plg = DOKU_PLUGIN . "{$m[2]}/{$m[1]}$c.php";
diff --git a/inc/mail.php b/inc/mail.php
index f72dbdeec..ef4f4404c 100644
--- a/inc/mail.php
+++ b/inc/mail.php
@@ -6,8 +6,6 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
-
// end of line for mail lines - RFC822 says CRLF but postfix (and other MTAs?)
// think different
if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL',"\n");
@@ -27,7 +25,10 @@ if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL',"\n");
* Check if a given mail address is valid
*/
if (!defined('RFC2822_ATEXT')) define('RFC2822_ATEXT',"0-9a-zA-Z!#$%&'*+/=?^_`{|}~-");
-if (!defined('PREG_PATTERN_VALID_EMAIL')) define('PREG_PATTERN_VALID_EMAIL', '['.RFC2822_ATEXT.']+(?:\.['.RFC2822_ATEXT.']+)*@(?i:[0-9a-z][0-9a-z-]*\.)+(?i:[a-z]{2,63})');
+if (!defined('PREG_PATTERN_VALID_EMAIL')) define(
+ 'PREG_PATTERN_VALID_EMAIL',
+ '['.RFC2822_ATEXT.']+(?:\.['.RFC2822_ATEXT.']+)*@(?i:[0-9a-z][0-9a-z-]*\.)+(?i:[a-z]{2,63})'
+);
/**
* Prepare mailfrom replacement patterns
@@ -79,189 +80,6 @@ function mail_setup(){
}
/**
- * UTF-8 autoencoding replacement for PHPs mail function
- *
- * Email address fields (To, From, Cc, Bcc can contain a textpart and an address
- * like this: 'Andreas Gohr <andi@splitbrain.org>' - the text part is encoded
- * automatically. You can seperate receivers by commas.
- *
- * @param string $to Receiver of the mail (multiple seperated by commas)
- * @param string $subject Mailsubject
- * @param string $body Messagebody
- * @param string $from Sender address
- * @param string $cc CarbonCopy receiver (multiple seperated by commas)
- * @param string $bcc BlindCarbonCopy receiver (multiple seperated by commas)
- * @param string $headers Additional Headers (seperated by MAILHEADER_EOL
- * @param string $params Additonal Sendmail params (passed to mail())
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @see mail()
- *
- * @deprecated User the Mailer:: class instead
- */
-function mail_send($to, $subject, $body, $from='', $cc='', $bcc='', $headers=null, $params=null){
- dbg_deprecated('class Mailer::');
- $message = compact('to','subject','body','from','cc','bcc','headers','params');
- return trigger_event('MAIL_MESSAGE_SEND',$message,'_mail_send_action');
-}
-
-/**
- * @param $data
- * @return bool
- *
- * @deprecated User the Mailer:: class instead
- */
-function _mail_send_action($data) {
- dbg_deprecated('class Mailer::');
- // retrieve parameters from event data, $to, $subject, $body, $from, $cc, $bcc, $headers, $params
- $to = $data['to'];
- $subject = $data['subject'];
- $body = $data['body'];
-
- // add robustness in case plugin removes any of these optional values
- $from = isset($data['from']) ? $data['from'] : '';
- $cc = isset($data['cc']) ? $data['cc'] : '';
- $bcc = isset($data['bcc']) ? $data['bcc'] : '';
- $headers = isset($data['headers']) ? $data['headers'] : null;
- $params = isset($data['params']) ? $data['params'] : null;
-
- // 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')){
- $subject = utf8_deaccent($subject);
- $subject = utf8_strip($subject);
- }
-
- if(!utf8_isASCII($subject)) {
- $enc_subj = '=?UTF-8?Q?'.mail_quotedprintable_encode($subject,0).'?=';
- // Spaces must be encoded according to rfc2047. Use the "_" shorthand
- $enc_subj = preg_replace('/ /', '_', $enc_subj);
-
- // quoted printable has length restriction, use base64 if needed
- if(strlen($subject) > 74){
- $enc_subj = '=?UTF-8?B?'.base64_encode($subject).'?=';
- }
-
- $subject = $enc_subj;
- }
-
- $header = '';
-
- // No named recipients for To: in Windows (see FS#652)
- $usenames = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? false : true;
-
- $to = mail_encode_address($to,'',$usenames);
- $header .= mail_encode_address($from,'From');
- $header .= mail_encode_address($cc,'Cc');
- $header .= mail_encode_address($bcc,'Bcc');
- $header .= 'MIME-Version: 1.0'.MAILHEADER_EOL;
- $header .= 'Content-Type: text/plain; charset=UTF-8'.MAILHEADER_EOL;
- $header .= 'Content-Transfer-Encoding: quoted-printable'.MAILHEADER_EOL;
- $header .= $headers;
- $header = trim($header);
-
- $body = mail_quotedprintable_encode($body);
-
- if($params == null){
- return @mail($to,$subject,$body,$header);
- }else{
- return @mail($to,$subject,$body,$header,$params);
- }
-}
-
-/**
- * Encodes an email address header
- *
- * Unicode characters will be deaccented and encoded
- * quoted_printable for headers.
- * Addresses may not contain Non-ASCII data!
- *
- * Example:
- * mail_encode_address("föö <foo@bar.com>, me@somewhere.com","TBcc");
- *
- * @param string $string Multiple adresses separated by commas
- * @param string $header Name of the header (To,Bcc,Cc,...)
- * @param boolean $names Allow named Recipients?
- *
- * @deprecated User the Mailer:: class instead
- */
-function mail_encode_address($string,$header='',$names=true){
- dbg_deprecated('class Mailer::');
- $headers = '';
- $parts = explode(',',$string);
- 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(hsc("E-Mail address <$addr> is not ASCII"),-1);
- continue;
- }
-
- if(!mail_isvalid($addr)){
- msg(hsc("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)){
- // 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).'?="';
- } else {
- $text = '=?UTF-8?Q?'.mail_quotedprintable_encode($text, 0).'?=';
- }
- // additionally the space character should be encoded as =20 (or each
- // word QP encoded separately).
- // however this is needed only in mail headers, not globally in mail_quotedprintable_encode().
- $text = str_replace(" ", "=20", $text);
- }
- }else{
- $text = '';
- }
-
- // add to header comma seperated
- if($headers != ''){
- $headers .= ',';
- if($header) $headers .= MAILHEADER_EOL.' '; // avoid overlong mail headers
- }
- $headers .= $text.' '.$addr;
- }
-
- if(empty($headers)) return null;
-
- //if headername was given add it and close correctly
- if($header) $headers = $header.': '.$headers.MAILHEADER_EOL;
-
- return $headers;
-}
-
-/**
* Check if a given mail address is valid
*
* @param string $email the address to check
@@ -305,7 +123,7 @@ function mail_quotedprintable_encode($sText,$maxlen=74,$bEmulate_imap_8bit=true)
// encode x09,x20 at lineends
{
$iLength = strlen($sLine);
- $iLastChar = ord($sLine{$iLength-1});
+ $iLastChar = ord($sLine[$iLength-1]);
// !!!!!!!!
// imap_8_bit does not encode x20 at the very end of a text,
@@ -314,7 +132,7 @@ function mail_quotedprintable_encode($sText,$maxlen=74,$bEmulate_imap_8bit=true)
// or comment next line for RFC2045 conformance, if you like
if (!($bEmulate_imap_8bit && ($i==count($aLines)-1))){
if (($iLastChar==0x09)||($iLastChar==0x20)) {
- $sLine{$iLength-1}='=';
+ $sLine[$iLength-1]='=';
$sLine .= ($iLastChar==0x09)?'09':'20';
}
}
diff --git a/inc/media.php b/inc/media.php
index 128466061..cc29bd16c 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -6,8 +6,10 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
-if(!defined('NL')) define('NL',"\n");
+use dokuwiki\ChangeLog\MediaChangeLog;
+use dokuwiki\HTTP\DokuHTTPClient;
+use dokuwiki\Subscriptions\MediaSubscriptionSender;
+use dokuwiki\Extension\Event;
/**
* Lists pages which currently use a media file selected for deletion
@@ -172,7 +174,17 @@ function media_metaform($id,$auth){
$form->addElement('<div class="row">');
if($field[2] == 'text'){
- $form->addElement(form_makeField('text', $p['name'], $value, ($lang[$field[1]]) ? $lang[$field[1]] : $field[1] . ':', $p['id'], $p['class'], $p_attrs));
+ $form->addElement(
+ form_makeField(
+ 'text',
+ $p['name'],
+ $value,
+ ($lang[$field[1]]) ? $lang[$field[1]] : $field[1] . ':',
+ $p['id'],
+ $p['class'],
+ $p_attrs
+ )
+ );
}else{
$att = buildAttributes($p);
$form->addElement('<label for="meta__'.$key.'">'.$lang[$field[1]].'</label>');
@@ -181,7 +193,14 @@ function media_metaform($id,$auth){
$form->addElement('</div>'.NL);
}
$form->addElement('<div class="buttons">');
- $form->addElement(form_makeButton('submit', '', $lang['btn_save'], array('accesskey' => 's', 'name' => 'mediado[save]')));
+ $form->addElement(
+ form_makeButton(
+ 'submit',
+ '',
+ $lang['btn_save'],
+ array('accesskey' => 's', 'name' => 'mediado[save]')
+ )
+ );
$form->addElement('</div>'.NL);
$form->printForm();
@@ -242,13 +261,13 @@ function media_delete($id,$auth){
// trigger an event - MEDIA_DELETE_FILE
$data = array();
$data['id'] = $id;
- $data['name'] = utf8_basename($file);
+ $data['name'] = \dokuwiki\Utf8\PhpString::basename($file);
$data['path'] = $file;
$data['size'] = (file_exists($file)) ? filesize($file) : 0;
$data['unl'] = false;
$data['del'] = false;
- $evt = new Doku_Event('MEDIA_DELETE_FILE',$data);
+ $evt = new Event('MEDIA_DELETE_FILE',$data);
if ($evt->advise_before()) {
$old = @filemtime($file);
if(!file_exists(mediaFN($id, $old)) && file_exists($file)) {
@@ -466,7 +485,7 @@ function media_save($file, $id, $ow, $auth, $move) {
$data[5] = $move;
// trigger event
- return trigger_event('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true);
+ return Event::createAndTrigger('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true);
}
/**
@@ -525,12 +544,20 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'mov
// (Should normally chmod to $conf['fperm'] only if $conf['fperm'] is set.)
chmod($fn, $conf['fmode']);
msg($lang['uploadsucc'],1);
- media_notify($id,$fn,$imime,$old);
+ media_notify($id,$fn,$imime,$old,$new);
// add a log entry to the media changelog
$filesize_new = filesize($fn);
$sizechange = $filesize_new - $filesize_old;
if($REV) {
- addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_REVERT, sprintf($lang['restored'], dformat($REV)), $REV, null, $sizechange);
+ addMediaLogEntry(
+ $new,
+ $id,
+ DOKU_CHANGE_TYPE_REVERT,
+ sprintf($lang['restored'], dformat($REV)),
+ $REV,
+ null,
+ $sizechange
+ );
} elseif($overwrite) {
addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT, '', '', null, $sizechange);
} else {
@@ -645,12 +672,12 @@ function media_contentcheck($file,$mime){
* @param bool|int $old_rev revision timestamp or false
* @return bool
*/
-function media_notify($id,$file,$mime,$old_rev=false){
+function media_notify($id,$file,$mime,$old_rev=false,$current_rev=false){
global $conf;
if(empty($conf['notify'])) return false; //notify enabled?
- $subscription = new Subscription();
- return $subscription->send_media_diff($conf['notify'], 'uploadmail', $id, $old_rev);
+ $subscription = new MediaSubscriptionSender();
+ return $subscription->sendMediaDiff($conf['notify'], 'uploadmail', $id, $old_rev, $current_rev);
}
/**
@@ -1249,7 +1276,7 @@ function media_diff($image, $ns, $auth, $fromajax = false) {
$data[5] = $fromajax;
// trigger event
- return trigger_event('MEDIA_DIFF', $data, '_media_file_diff', true);
+ return Event::createAndTrigger('MEDIA_DIFF', $data, '_media_file_diff', true);
}
/**
@@ -1487,7 +1514,7 @@ function media_searchlist($query,$ns,$auth=null,$fullscreen=false,$sort='natural
'query' => $query
);
if (!blank($query)) {
- $evt = new Doku_Event('MEDIA_SEARCH', $evdata);
+ $evt = new Event('MEDIA_SEARCH', $evdata);
if ($evt->advise_before()) {
$dir = utf8_encodeFN(str_replace(':','/',$evdata['ns']));
$quoted = preg_quote($evdata['query'],'/');
@@ -1716,7 +1743,7 @@ function media_printimgdetail($item, $fullscreen=false){
// output
if ($fullscreen) {
echo '<a id="l_:'.$item['id'].'" class="image thumb" href="'.
- media_managerURL(array('image' => hsc($item['id']), 'ns' => getNS($item['id']), 'tab_details' => 'view')).'">';
+ media_managerURL(['image' => hsc($item['id']), 'ns' => getNS($item['id']), 'tab_details' => 'view']).'">';
echo '<img src="'.$src.'" '.$att.' />';
echo '</a>';
}
@@ -1735,7 +1762,7 @@ function media_printimgdetail($item, $fullscreen=false){
$d = $item['meta']->getField(array('IPTC.Caption','EXIF.UserComment',
'EXIF.TIFFImageDescription',
'EXIF.TIFFUserComment'));
- if(utf8_strlen($d) > 250) $d = utf8_substr($d,0,250).'...';
+ if(\dokuwiki\Utf8\PhpString::strlen($d) > 250) $d = \dokuwiki\Utf8\PhpString::substr($d,0,250).'...';
$k = $item['meta']->getField(array('IPTC.Keywords','IPTC.Category','xmp.dc:subject'));
// print EXIF/IPTC data
@@ -1900,7 +1927,16 @@ function media_searchform($ns,$query='',$fullscreen=false){
$form->addHidden($fullscreen ? 'mediado' : 'do', 'searchlist');
$form->addElement(form_makeOpenTag('p'));
- $form->addElement(form_makeTextField('q', $query,$lang['searchmedia'],'','',array('title'=>sprintf($lang['searchmedia_in'],hsc($ns).':*'))));
+ $form->addElement(
+ form_makeTextField(
+ 'q',
+ $query,
+ $lang['searchmedia'],
+ '',
+ '',
+ array('title' => sprintf($lang['searchmedia_in'], hsc($ns) . ':*'))
+ )
+ );
$form->addElement(form_makeButton('submit', '', $lang['btn_search']));
$form->addElement(form_makeCloseTag('p'));
html_form('searchmedia', $form);
@@ -1943,7 +1979,13 @@ function media_nstree($ns){
// find the namespace parts or insert them
while ($data[$pos]['id'] != $tmp_ns) {
- if ($pos >= count($data) || ($data[$pos]['level'] <= $level+1 && strnatcmp(utf8_encodeFN($data[$pos]['id']), utf8_encodeFN($tmp_ns)) > 0)) {
+ if (
+ $pos >= count($data) ||
+ (
+ $data[$pos]['level'] <= $level+1 &&
+ strnatcmp(utf8_encodeFN($data[$pos]['id']), utf8_encodeFN($tmp_ns)) > 0
+ )
+ ) {
array_splice($data, $pos, 0, array(array('level' => $level+1, 'id' => $tmp_ns, 'open' => 'true')));
break;
}
@@ -2040,7 +2082,7 @@ function media_resize_image($file, $ext, $w, $h=0){
media_resize_imageIM($ext, $file, $info[0], $info[1], $local, $w, $h) ||
media_resize_imageGD($ext, $file, $info[0], $info[1], $local, $w, $h)
) {
- if(!empty($conf['fperm'])) @chmod($local, $conf['fperm']);
+ if($conf['fperm']) @chmod($local, $conf['fperm']);
return $local;
}
//still here? resizing failed
@@ -2107,7 +2149,7 @@ function media_crop_image($file, $ext, $w, $h=0){
if( $mtime > @filemtime($file) ||
media_crop_imageIM($ext,$file,$info[0],$info[1],$local,$cw,$ch,$cx,$cy) ||
media_resize_imageGD($ext,$file,$cw,$ch,$local,$cw,$ch,$cx,$cy) ){
- if(!empty($conf['fperm'])) @chmod($local, $conf['fperm']);
+ if($conf['fperm']) @chmod($local, $conf['fperm']);
return media_resize_image($local,$ext, $w, $h);
}
@@ -2134,7 +2176,7 @@ function media_get_token($id,$w,$h){
if ($w) $token .= '.'.$w;
if ($h) $token .= '.'.$h;
- return substr(PassHash::hmac('md5', $token, auth_cookiesalt()),0,6);
+ return substr(\dokuwiki\PassHash::hmac('md5', $token, auth_cookiesalt()),0,6);
}
return '';
@@ -2353,7 +2395,12 @@ function media_resize_imageGD($ext,$from,$from_w,$from_h,$to,$to_w,$to_h,$ofs_x=
$transcolorindex = @imagecolortransparent($image);
if($transcolorindex >= 0 ) { //transparent color exists
$transcolor = @imagecolorsforindex($image, $transcolorindex);
- $transcolorindex = @imagecolorallocate($newimg, $transcolor['red'], $transcolor['green'], $transcolor['blue']);
+ $transcolorindex = @imagecolorallocate(
+ $newimg,
+ $transcolor['red'],
+ $transcolor['green'],
+ $transcolor['blue']
+ );
@imagefill($newimg, 0, 0, $transcolorindex);
@imagecolortransparent($newimg, $transcolorindex);
}else{ //filling with white
diff --git a/inc/pageutils.php b/inc/pageutils.php
index 55eda5514..8540d227e 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -7,6 +7,9 @@
* @todo Combine similar functions like {wiki,media,meta}FN()
*/
+use dokuwiki\ChangeLog\MediaChangeLog;
+use dokuwiki\ChangeLog\PageChangeLog;
+
/**
* Fetch the an ID from request
*
@@ -41,7 +44,8 @@ function getID($param='id',$clean=true){
if($param != 'id') {
$relpath = 'lib/exe/';
}
- $script = $conf['basedir'].$relpath.utf8_basename($INPUT->server->str('SCRIPT_FILENAME'));
+ $script = $conf['basedir'] . $relpath .
+ \dokuwiki\Utf8\PhpString::basename($INPUT->server->str('SCRIPT_FILENAME'));
}elseif($INPUT->server->str('PATH_INFO')){
$request = $INPUT->server->str('PATH_INFO');
@@ -86,12 +90,11 @@ function getID($param='id',$clean=true){
if (isset($urlParameters['id'])) {
unset($urlParameters['id']);
}
- send_redirect(wl($id,$urlParameters,true));
+ send_redirect(wl($id, $urlParameters, true, '&'));
}
}
-
if($clean) $id = cleanID($id);
- if(empty($id) && $param=='id') $id = $conf['start'];
+ if($id === '' && $param=='id') $id = $conf['start'];
return $id;
}
@@ -125,7 +128,7 @@ function cleanID($raw_id,$ascii=false){
$sepcharpat = '#\\'.$sepchar.'+#';
$id = trim((string)$raw_id);
- $id = utf8_strtolower($id);
+ $id = \dokuwiki\Utf8\PhpString::strtolower($id);
//alternative namespace seperator
if($conf['useslash']){
@@ -134,13 +137,13 @@ function cleanID($raw_id,$ascii=false){
$id = strtr($id,';/',':'.$sepchar);
}
- if($conf['deaccent'] == 2 || $ascii) $id = utf8_romanize($id);
- if($conf['deaccent'] || $ascii) $id = utf8_deaccent($id,-1);
+ if($conf['deaccent'] == 2 || $ascii) $id = \dokuwiki\Utf8\Clean::romanize($id);
+ if($conf['deaccent'] || $ascii) $id = \dokuwiki\Utf8\Clean::deaccent($id,-1);
//remove specials
- $id = utf8_stripspecials($id,$sepchar,'\*');
+ $id = \dokuwiki\Utf8\Clean::stripspecials($id,$sepchar,'\*');
- if($ascii) $id = utf8_strip($id);
+ if($ascii) $id = \dokuwiki\Utf8\Clean::strip($id);
//clean up
$id = preg_replace($sepcharpat,$sepchar,$id);
@@ -210,9 +213,9 @@ function noNSorNS($id) {
global $conf;
$p = noNS($id);
- if ($p == $conf['start'] || $p == false) {
+ if ($p === $conf['start'] || $p === false) {
$p = curNS($id);
- if ($p == false) {
+ if ($p === false) {
return $conf['start'];
}
}
@@ -461,9 +464,9 @@ function resolve_id($ns,$id,$clean=true){
// if the id starts with a dot we need to handle the
// relative stuff
- if($id && $id{0} == '.'){
+ if($id && $id[0] == '.'){
// normalize initial dots without a colon
- $id = preg_replace('/^(\.+)(?=[^:\.])/','\1:',$id);
+ $id = preg_replace('/^((\.+:)*)(\.+)(?=[^:\.])/','\1\3:',$id);
// prepend the current namespace
$id = $ns.':'.$id;
@@ -616,7 +619,7 @@ function resolve_pageid($ns,&$page,&$exists,$rev='',$date_at=false ){
function getCacheName($data,$ext=''){
global $conf;
$md5 = md5($data);
- $file = $conf['cachedir'].'/'.$md5{0}.'/'.$md5.$ext;
+ $file = $conf['cachedir'].'/'.$md5[0].'/'.$md5.$ext;
io_makeFileDir($file);
return $file;
}
@@ -634,7 +637,7 @@ function isHiddenPage($id){
'id' => $id,
'hidden' => false
);
- trigger_event('PAGEUTILS_ID_HIDEPAGE', $data, '_isHiddenPage');
+ \dokuwiki\Extension\Event::createAndTrigger('PAGEUTILS_ID_HIDEPAGE', $data, '_isHiddenPage');
return $data['hidden'];
}
@@ -759,7 +762,7 @@ function utf8_decodeFN($file){
* @return false|string the full page id of the found page, false if any
*/
function page_findnearest($page, $useacl = true){
- if (!$page) return false;
+ if ((string) $page === '') return false;
global $ID;
$ns = $ID;
@@ -769,7 +772,7 @@ function page_findnearest($page, $useacl = true){
if(page_exists($pageid) && (!$useacl || auth_quickaclcheck($pageid) >= AUTH_READ)){
return $pageid;
}
- } while($ns);
+ } while($ns !== false);
return false;
}
diff --git a/inc/parser/code.php b/inc/parser/code.php
index f91f1d228..cded87d6d 100644
--- a/inc/parser/code.php
+++ b/inc/parser/code.php
@@ -4,10 +4,8 @@
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
-
class Doku_Renderer_code extends Doku_Renderer {
- var $_codeblock = 0;
+ protected $_codeblock = 0;
/**
* Send the wanted code block to the browser
@@ -18,13 +16,13 @@ class Doku_Renderer_code extends Doku_Renderer {
* @param string $language
* @param string $filename
*/
- function code($text, $language = null, $filename = '') {
+ public function code($text, $language = null, $filename = '') {
global $INPUT;
if(!$language) $language = 'txt';
$language = preg_replace(PREG_PATTERN_VALID_LANGUAGE, '', $language);
if(!$filename) $filename = 'snippet.'.$language;
- $filename = utf8_basename($filename);
- $filename = utf8_stripspecials($filename, '_');
+ $filename = \dokuwiki\Utf8\PhpString::basename($filename);
+ $filename = \dokuwiki\Utf8\Clean::stripspecials($filename, '_');
// send CRLF to Windows clients
if(strpos($INPUT->server->str('HTTP_USER_AGENT'), 'Windows') !== false) {
@@ -49,14 +47,14 @@ class Doku_Renderer_code extends Doku_Renderer {
* @param string $language
* @param string $filename
*/
- function file($text, $language = null, $filename = '') {
+ public function file($text, $language = null, $filename = '') {
$this->code($text, $language, $filename);
}
/**
* This should never be reached, if it is send a 404
*/
- function document_end() {
+ public function document_end() {
http_status(404);
echo '404 - Not found';
exit;
@@ -67,7 +65,7 @@ class Doku_Renderer_code extends Doku_Renderer {
*
* @returns string 'code'
*/
- function getFormat() {
+ public function getFormat() {
return 'code';
}
}
diff --git a/inc/parser/handler.php b/inc/parser/handler.php
index 12551588b..e5f7c4ed5 100644
--- a/inc/parser/handler.php
+++ b/inc/parser/handler.php
@@ -1,44 +1,84 @@
<?php
-if(!defined('DOKU_INC')) die('meh.');
-if (!defined('DOKU_PARSER_EOL')) define('DOKU_PARSER_EOL',"\n"); // add this to make handling test cases simpler
-class Doku_Handler {
-
- var $Renderer = null;
+use dokuwiki\Extension\Event;
+use dokuwiki\Extension\SyntaxPlugin;
+use dokuwiki\Parsing\Handler\Block;
+use dokuwiki\Parsing\Handler\CallWriter;
+use dokuwiki\Parsing\Handler\CallWriterInterface;
+use dokuwiki\Parsing\Handler\Lists;
+use dokuwiki\Parsing\Handler\Nest;
+use dokuwiki\Parsing\Handler\Preformatted;
+use dokuwiki\Parsing\Handler\Quote;
+use dokuwiki\Parsing\Handler\Table;
- var $CallWriter = null;
+/**
+ * Class Doku_Handler
+ */
+class Doku_Handler {
+ /** @var CallWriterInterface */
+ protected $callWriter = null;
- var $calls = array();
+ /** @var array The current CallWriter will write directly to this list of calls, Parser reads it */
+ public $calls = array();
- var $status = array(
+ /** @var array internal status holders for some modes */
+ protected $status = array(
'section' => false,
'doublequote' => 0,
);
- var $rewriteBlocks = true;
+ /** @var bool should blocks be rewritten? FIXME seems to always be true */
+ protected $rewriteBlocks = true;
- function __construct() {
- $this->CallWriter = new Doku_Handler_CallWriter($this);
+ /**
+ * Doku_Handler constructor.
+ */
+ public function __construct() {
+ $this->callWriter = new CallWriter($this);
}
/**
- * @param string $handler
- * @param mixed $args
- * @param integer|string $pos
+ * Add a new call by passing it to the current CallWriter
+ *
+ * @param string $handler handler method name (see mode handlers below)
+ * @param mixed $args arguments for this call
+ * @param int $pos byte position in the original source file
*/
- function _addCall($handler, $args, $pos) {
+ public function addCall($handler, $args, $pos) {
$call = array($handler,$args, $pos);
- $this->CallWriter->writeCall($call);
+ $this->callWriter->writeCall($call);
}
- function addPluginCall($plugin, $args, $state, $pos, $match) {
- $call = array('plugin',array($plugin, $args, $state, $match), $pos);
- $this->CallWriter->writeCall($call);
+ /** @deprecated 2019-10-31 use addCall() instead */
+ public function _addCall($handler, $args, $pos) {
+ dbg_deprecated('addCall');
+ $this->addCall($handler, $args, $pos);
}
- function _finalize(){
+ /**
+ * Similar to addCall, but adds a plugin call
+ *
+ * @param string $plugin name of the plugin
+ * @param mixed $args arguments for this call
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @param string $match matched syntax
+ */
+ public function addPluginCall($plugin, $args, $state, $pos, $match) {
+ $call = array('plugin',array($plugin, $args, $state, $match), $pos);
+ $this->callWriter->writeCall($call);
+ }
- $this->CallWriter->finalise();
+ /**
+ * Finishes handling
+ *
+ * Called from the parser. Calls finalise() on the call writer, closes open
+ * sections, rewrites blocks and adds document_start and document_end calls.
+ *
+ * @triggers PARSER_HANDLER_DONE
+ */
+ public function finalize(){
+ $this->callWriter->finalise();
if ( $this->status['section'] ) {
$last_call = end($this->calls);
@@ -46,11 +86,11 @@ class Doku_Handler {
}
if ( $this->rewriteBlocks ) {
- $B = new Doku_Handler_Block();
+ $B = new Block();
$this->calls = $B->process($this->calls);
}
- trigger_event('PARSER_HANDLER_DONE',$this);
+ Event::createAndTrigger('PARSER_HANDLER_DONE',$this);
array_unshift($this->calls,array('document_start',array(),0));
$last_call = end($this->calls);
@@ -60,9 +100,10 @@ class Doku_Handler {
/**
* fetch the current call and advance the pointer to the next one
*
+ * @fixme seems to be unused?
* @return bool|mixed
*/
- function fetch() {
+ public function fetch() {
$call = current($this->calls);
if($call !== false) {
next($this->calls); //advance the pointer
@@ -73,23 +114,127 @@ class Doku_Handler {
/**
+ * Internal function for parsing highlight options.
+ * $options is parsed for key value pairs separated by commas.
+ * A value might also be missing in which case the value will simple
+ * be set to true. Commas in strings are ignored, e.g. option="4,56"
+ * will work as expected and will only create one entry.
+ *
+ * @param string $options space separated list of key-value pairs,
+ * e.g. option1=123, option2="456"
+ * @return array|null Array of key-value pairs $array['key'] = 'value';
+ * or null if no entries found
+ */
+ protected function parse_highlight_options($options) {
+ $result = array();
+ preg_match_all('/(\w+(?:="[^"]*"))|(\w+(?:=[^\s]*))|(\w+[^=\s\]])(?:\s*)/', $options, $matches, PREG_SET_ORDER);
+ foreach ($matches as $match) {
+ $equal_sign = strpos($match [0], '=');
+ if ($equal_sign === false) {
+ $key = trim($match[0]);
+ $result [$key] = 1;
+ } else {
+ $key = substr($match[0], 0, $equal_sign);
+ $value = substr($match[0], $equal_sign+1);
+ $value = trim($value, '"');
+ if (strlen($value) > 0) {
+ $result [$key] = $value;
+ } else {
+ $result [$key] = 1;
+ }
+ }
+ }
+
+ // Check for supported options
+ $result = array_intersect_key(
+ $result,
+ array_flip(array(
+ 'enable_line_numbers',
+ 'start_line_numbers_at',
+ 'highlight_lines_extra',
+ 'enable_keyword_links')
+ )
+ );
+
+ // Sanitize values
+ if(isset($result['enable_line_numbers'])) {
+ if($result['enable_line_numbers'] === 'false') {
+ $result['enable_line_numbers'] = false;
+ }
+ $result['enable_line_numbers'] = (bool) $result['enable_line_numbers'];
+ }
+ if(isset($result['highlight_lines_extra'])) {
+ $result['highlight_lines_extra'] = array_map('intval', explode(',', $result['highlight_lines_extra']));
+ $result['highlight_lines_extra'] = array_filter($result['highlight_lines_extra']);
+ $result['highlight_lines_extra'] = array_unique($result['highlight_lines_extra']);
+ }
+ if(isset($result['start_line_numbers_at'])) {
+ $result['start_line_numbers_at'] = (int) $result['start_line_numbers_at'];
+ }
+ if(isset($result['enable_keyword_links'])) {
+ if($result['enable_keyword_links'] === 'false') {
+ $result['enable_keyword_links'] = false;
+ }
+ $result['enable_keyword_links'] = (bool) $result['enable_keyword_links'];
+ }
+ if (count($result) == 0) {
+ return null;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Simplifies handling for the formatting tags which all behave the same
+ *
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @param string $name actual mode name
+ */
+ protected function nestingTag($match, $state, $pos, $name) {
+ switch ( $state ) {
+ case DOKU_LEXER_ENTER:
+ $this->addCall($name.'_open', array(), $pos);
+ break;
+ case DOKU_LEXER_EXIT:
+ $this->addCall($name.'_close', array(), $pos);
+ break;
+ case DOKU_LEXER_UNMATCHED:
+ $this->addCall('cdata', array($match), $pos);
+ break;
+ }
+ }
+
+
+ /**
+ * The following methods define the handlers for the different Syntax modes
+ *
+ * The handlers are called from dokuwiki\Parsing\Lexer\Lexer\invokeParser()
+ *
+ * @todo it might make sense to move these into their own class or merge them with the
+ * ParserMode classes some time.
+ */
+ // region mode handlers
+
+ /**
* Special plugin handler
*
* This handler is called for all modes starting with 'plugin_'.
- * An additional parameter with the plugin name is passed
+ * An additional parameter with the plugin name is passed. The plugin's handle()
+ * method is called here
*
* @author Andreas Gohr <andi@splitbrain.org>
*
- * @param string|integer $match
- * @param string|integer $state
- * @param integer $pos
- * @param $pluginname
- *
- * @return bool
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @param string $pluginname name of the plugin
+ * @return bool mode handled?
*/
- function plugin($match, $state, $pos, $pluginname){
+ public function plugin($match, $state, $pos, $pluginname){
$data = array($match);
- /** @var DokuWiki_Syntax_Plugin $plugin */
+ /** @var SyntaxPlugin $plugin */
$plugin = plugin_load('syntax',$pluginname);
if($plugin != null){
$data = $plugin->handle($match, $state, $pos, $this);
@@ -100,16 +245,29 @@ class Doku_Handler {
return true;
}
- function base($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function base($match, $state, $pos) {
switch ( $state ) {
case DOKU_LEXER_UNMATCHED:
- $this->_addCall('cdata',array($match), $pos);
+ $this->addCall('cdata', array($match), $pos);
return true;
break;
}
+ return false;
}
- function header($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function header($match, $state, $pos) {
// get level and title
$title = trim($match);
$level = 7 - strspn($title,'=');
@@ -117,98 +275,154 @@ class Doku_Handler {
$title = trim($title,'=');
$title = trim($title);
- if ($this->status['section']) $this->_addCall('section_close',array(),$pos);
+ if ($this->status['section']) $this->addCall('section_close', array(), $pos);
- $this->_addCall('header',array($title,$level,$pos), $pos);
+ $this->addCall('header', array($title, $level, $pos), $pos);
- $this->_addCall('section_open',array($level),$pos);
+ $this->addCall('section_open', array($level), $pos);
$this->status['section'] = true;
return true;
}
- function notoc($match, $state, $pos) {
- $this->_addCall('notoc',array(),$pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function notoc($match, $state, $pos) {
+ $this->addCall('notoc', array(), $pos);
return true;
}
- function nocache($match, $state, $pos) {
- $this->_addCall('nocache',array(),$pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function nocache($match, $state, $pos) {
+ $this->addCall('nocache', array(), $pos);
return true;
}
- function linebreak($match, $state, $pos) {
- $this->_addCall('linebreak',array(),$pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function linebreak($match, $state, $pos) {
+ $this->addCall('linebreak', array(), $pos);
return true;
}
- function eol($match, $state, $pos) {
- $this->_addCall('eol',array(),$pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function eol($match, $state, $pos) {
+ $this->addCall('eol', array(), $pos);
return true;
}
- function hr($match, $state, $pos) {
- $this->_addCall('hr',array(),$pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function hr($match, $state, $pos) {
+ $this->addCall('hr', array(), $pos);
return true;
}
/**
- * @param string|integer $match
- * @param string|integer $state
- * @param integer $pos
- * @param string $name
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
*/
- function _nestingTag($match, $state, $pos, $name) {
- switch ( $state ) {
- case DOKU_LEXER_ENTER:
- $this->_addCall($name.'_open', array(), $pos);
- break;
- case DOKU_LEXER_EXIT:
- $this->_addCall($name.'_close', array(), $pos);
- break;
- case DOKU_LEXER_UNMATCHED:
- $this->_addCall('cdata',array($match), $pos);
- break;
- }
- }
-
- function strong($match, $state, $pos) {
- $this->_nestingTag($match, $state, $pos, 'strong');
+ public function strong($match, $state, $pos) {
+ $this->nestingTag($match, $state, $pos, 'strong');
return true;
}
- function emphasis($match, $state, $pos) {
- $this->_nestingTag($match, $state, $pos, 'emphasis');
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function emphasis($match, $state, $pos) {
+ $this->nestingTag($match, $state, $pos, 'emphasis');
return true;
}
- function underline($match, $state, $pos) {
- $this->_nestingTag($match, $state, $pos, 'underline');
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function underline($match, $state, $pos) {
+ $this->nestingTag($match, $state, $pos, 'underline');
return true;
}
- function monospace($match, $state, $pos) {
- $this->_nestingTag($match, $state, $pos, 'monospace');
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function monospace($match, $state, $pos) {
+ $this->nestingTag($match, $state, $pos, 'monospace');
return true;
}
- function subscript($match, $state, $pos) {
- $this->_nestingTag($match, $state, $pos, 'subscript');
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function subscript($match, $state, $pos) {
+ $this->nestingTag($match, $state, $pos, 'subscript');
return true;
}
- function superscript($match, $state, $pos) {
- $this->_nestingTag($match, $state, $pos, 'superscript');
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function superscript($match, $state, $pos) {
+ $this->nestingTag($match, $state, $pos, 'superscript');
return true;
}
- function deleted($match, $state, $pos) {
- $this->_nestingTag($match, $state, $pos, 'deleted');
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function deleted($match, $state, $pos) {
+ $this->nestingTag($match, $state, $pos, 'deleted');
return true;
}
-
- function footnote($match, $state, $pos) {
-// $this->_nestingTag($match, $state, $pos, 'footnote');
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function footnote($match, $state, $pos) {
if (!isset($this->_footnote)) $this->_footnote = false;
switch ( $state ) {
@@ -216,146 +430,185 @@ class Doku_Handler {
// footnotes can not be nested - however due to limitations in lexer it can't be prevented
// we will still enter a new footnote mode, we just do nothing
if ($this->_footnote) {
- $this->_addCall('cdata',array($match), $pos);
+ $this->addCall('cdata', array($match), $pos);
break;
}
-
$this->_footnote = true;
- $ReWriter = new Doku_Handler_Nest($this->CallWriter,'footnote_close');
- $this->CallWriter = & $ReWriter;
- $this->_addCall('footnote_open', array(), $pos);
+ $this->callWriter = new Nest($this->callWriter, 'footnote_close');
+ $this->addCall('footnote_open', array(), $pos);
break;
case DOKU_LEXER_EXIT:
// check whether we have already exitted the footnote mode, can happen if the modes were nested
if (!$this->_footnote) {
- $this->_addCall('cdata',array($match), $pos);
+ $this->addCall('cdata', array($match), $pos);
break;
}
$this->_footnote = false;
+ $this->addCall('footnote_close', array(), $pos);
- $this->_addCall('footnote_close', array(), $pos);
- $this->CallWriter->process();
- $ReWriter = & $this->CallWriter;
- $this->CallWriter = & $ReWriter->CallWriter;
+ /** @var Nest $reWriter */
+ $reWriter = $this->callWriter;
+ $this->callWriter = $reWriter->process();
break;
case DOKU_LEXER_UNMATCHED:
- $this->_addCall('cdata', array($match), $pos);
+ $this->addCall('cdata', array($match), $pos);
break;
}
return true;
}
- function listblock($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function listblock($match, $state, $pos) {
switch ( $state ) {
case DOKU_LEXER_ENTER:
- $ReWriter = new Doku_Handler_List($this->CallWriter);
- $this->CallWriter = & $ReWriter;
- $this->_addCall('list_open', array($match), $pos);
+ $this->callWriter = new Lists($this->callWriter);
+ $this->addCall('list_open', array($match), $pos);
break;
case DOKU_LEXER_EXIT:
- $this->_addCall('list_close', array(), $pos);
- $this->CallWriter->process();
- $ReWriter = & $this->CallWriter;
- $this->CallWriter = & $ReWriter->CallWriter;
+ $this->addCall('list_close', array(), $pos);
+ /** @var Lists $reWriter */
+ $reWriter = $this->callWriter;
+ $this->callWriter = $reWriter->process();
break;
case DOKU_LEXER_MATCHED:
- $this->_addCall('list_item', array($match), $pos);
+ $this->addCall('list_item', array($match), $pos);
break;
case DOKU_LEXER_UNMATCHED:
- $this->_addCall('cdata', array($match), $pos);
+ $this->addCall('cdata', array($match), $pos);
break;
}
return true;
}
- function unformatted($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function unformatted($match, $state, $pos) {
if ( $state == DOKU_LEXER_UNMATCHED ) {
- $this->_addCall('unformatted',array($match), $pos);
+ $this->addCall('unformatted', array($match), $pos);
}
return true;
}
- function php($match, $state, $pos) {
- global $conf;
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function php($match, $state, $pos) {
if ( $state == DOKU_LEXER_UNMATCHED ) {
- $this->_addCall('php',array($match), $pos);
+ $this->addCall('php', array($match), $pos);
}
return true;
}
- function phpblock($match, $state, $pos) {
- global $conf;
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function phpblock($match, $state, $pos) {
if ( $state == DOKU_LEXER_UNMATCHED ) {
- $this->_addCall('phpblock',array($match), $pos);
+ $this->addCall('phpblock', array($match), $pos);
}
return true;
}
- function html($match, $state, $pos) {
- global $conf;
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function html($match, $state, $pos) {
if ( $state == DOKU_LEXER_UNMATCHED ) {
- $this->_addCall('html',array($match), $pos);
+ $this->addCall('html', array($match), $pos);
}
return true;
}
- function htmlblock($match, $state, $pos) {
- global $conf;
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function htmlblock($match, $state, $pos) {
if ( $state == DOKU_LEXER_UNMATCHED ) {
- $this->_addCall('htmlblock',array($match), $pos);
+ $this->addCall('htmlblock', array($match), $pos);
}
return true;
}
- function preformatted($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function preformatted($match, $state, $pos) {
switch ( $state ) {
case DOKU_LEXER_ENTER:
- $ReWriter = new Doku_Handler_Preformatted($this->CallWriter);
- $this->CallWriter = $ReWriter;
- $this->_addCall('preformatted_start',array(), $pos);
+ $this->callWriter = new Preformatted($this->callWriter);
+ $this->addCall('preformatted_start', array(), $pos);
break;
case DOKU_LEXER_EXIT:
- $this->_addCall('preformatted_end',array(), $pos);
- $this->CallWriter->process();
- $ReWriter = & $this->CallWriter;
- $this->CallWriter = & $ReWriter->CallWriter;
+ $this->addCall('preformatted_end', array(), $pos);
+ /** @var Preformatted $reWriter */
+ $reWriter = $this->callWriter;
+ $this->callWriter = $reWriter->process();
break;
case DOKU_LEXER_MATCHED:
- $this->_addCall('preformatted_newline',array(), $pos);
+ $this->addCall('preformatted_newline', array(), $pos);
break;
case DOKU_LEXER_UNMATCHED:
- $this->_addCall('preformatted_content',array($match), $pos);
+ $this->addCall('preformatted_content', array($match), $pos);
break;
}
return true;
}
- function quote($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function quote($match, $state, $pos) {
switch ( $state ) {
case DOKU_LEXER_ENTER:
- $ReWriter = new Doku_Handler_Quote($this->CallWriter);
- $this->CallWriter = & $ReWriter;
- $this->_addCall('quote_start',array($match), $pos);
+ $this->callWriter = new Quote($this->callWriter);
+ $this->addCall('quote_start', array($match), $pos);
break;
case DOKU_LEXER_EXIT:
- $this->_addCall('quote_end',array(), $pos);
- $this->CallWriter->process();
- $ReWriter = & $this->CallWriter;
- $this->CallWriter = & $ReWriter->CallWriter;
+ $this->addCall('quote_end', array(), $pos);
+ /** @var Lists $reWriter */
+ $reWriter = $this->callWriter;
+ $this->callWriter = $reWriter->process();
break;
case DOKU_LEXER_MATCHED:
- $this->_addCall('quote_newline',array($match), $pos);
+ $this->addCall('quote_newline', array($match), $pos);
break;
case DOKU_LEXER_UNMATCHED:
- $this->_addCall('cdata',array($match), $pos);
+ $this->addCall('cdata', array($match), $pos);
break;
}
@@ -364,81 +617,23 @@ class Doku_Handler {
}
/**
- * Internal function for parsing highlight options.
- * $options is parsed for key value pairs separated by commas.
- * A value might also be missing in which case the value will simple
- * be set to true. Commas in strings are ignored, e.g. option="4,56"
- * will work as expected and will only create one entry.
- *
- * @param string $options space separated list of key-value pairs,
- * e.g. option1=123, option2="456"
- * @return array|null Array of key-value pairs $array['key'] = 'value';
- * or null if no entries found
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
*/
- protected function parse_highlight_options ($options) {
- $result = array();
- preg_match_all('/(\w+(?:="[^"]*"))|(\w+(?:=[^\s]*))|(\w+[^=\s\]])(?:\s*)/', $options, $matches, PREG_SET_ORDER);
- foreach ($matches as $match) {
- $equal_sign = strpos($match [0], '=');
- if ($equal_sign === false) {
- $key = trim($match[0]);
- $result [$key] = 1;
- } else {
- $key = substr($match[0], 0, $equal_sign);
- $value = substr($match[0], $equal_sign+1);
- $value = trim($value, '"');
- if (strlen($value) > 0) {
- $result [$key] = $value;
- } else {
- $result [$key] = 1;
- }
- }
- }
-
- // Check for supported options
- $result = array_intersect_key(
- $result,
- array_flip(array(
- 'enable_line_numbers',
- 'start_line_numbers_at',
- 'highlight_lines_extra',
- 'enable_keyword_links')
- )
- );
-
- // Sanitize values
- if(isset($result['enable_line_numbers'])) {
- if($result['enable_line_numbers'] === 'false') {
- $result['enable_line_numbers'] = false;
- }
- $result['enable_line_numbers'] = (bool) $result['enable_line_numbers'];
- }
- if(isset($result['highlight_lines_extra'])) {
- $result['highlight_lines_extra'] = array_map('intval', explode(',', $result['highlight_lines_extra']));
- $result['highlight_lines_extra'] = array_filter($result['highlight_lines_extra']);
- $result['highlight_lines_extra'] = array_unique($result['highlight_lines_extra']);
- }
- if(isset($result['start_line_numbers_at'])) {
- $result['start_line_numbers_at'] = (int) $result['start_line_numbers_at'];
- }
- if(isset($result['enable_keyword_links'])) {
- if($result['enable_keyword_links'] === 'false') {
- $result['enable_keyword_links'] = false;
- }
- $result['enable_keyword_links'] = (bool) $result['enable_keyword_links'];
- }
- if (count($result) == 0) {
- return null;
- }
-
- return $result;
- }
-
- function file($match, $state, $pos) {
+ public function file($match, $state, $pos) {
return $this->code($match, $state, $pos, 'file');
}
- function code($match, $state, $pos, $type='code') {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @param string $type either 'code' or 'file'
+ * @return bool mode handled?
+ */
+ public function code($match, $state, $pos, $type='code') {
if ( $state == DOKU_LEXER_UNMATCHED ) {
$matches = explode('>',$match,2);
// Cut out variable options enclosed in []
@@ -455,76 +650,146 @@ class Doku_Handler {
if (!empty($options[0])) {
$param [] = $this->parse_highlight_options ($options[0]);
}
- $this->_addCall($type, $param, $pos);
+ $this->addCall($type, $param, $pos);
}
return true;
}
- function acronym($match, $state, $pos) {
- $this->_addCall('acronym',array($match), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function acronym($match, $state, $pos) {
+ $this->addCall('acronym', array($match), $pos);
return true;
}
- function smiley($match, $state, $pos) {
- $this->_addCall('smiley',array($match), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function smiley($match, $state, $pos) {
+ $this->addCall('smiley', array($match), $pos);
return true;
}
- function wordblock($match, $state, $pos) {
- $this->_addCall('wordblock',array($match), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function wordblock($match, $state, $pos) {
+ $this->addCall('wordblock', array($match), $pos);
return true;
}
- function entity($match, $state, $pos) {
- $this->_addCall('entity',array($match), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function entity($match, $state, $pos) {
+ $this->addCall('entity', array($match), $pos);
return true;
}
- function multiplyentity($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function multiplyentity($match, $state, $pos) {
preg_match_all('/\d+/',$match,$matches);
- $this->_addCall('multiplyentity',array($matches[0][0],$matches[0][1]), $pos);
+ $this->addCall('multiplyentity', array($matches[0][0], $matches[0][1]), $pos);
return true;
}
- function singlequoteopening($match, $state, $pos) {
- $this->_addCall('singlequoteopening',array(), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function singlequoteopening($match, $state, $pos) {
+ $this->addCall('singlequoteopening', array(), $pos);
return true;
}
- function singlequoteclosing($match, $state, $pos) {
- $this->_addCall('singlequoteclosing',array(), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function singlequoteclosing($match, $state, $pos) {
+ $this->addCall('singlequoteclosing', array(), $pos);
return true;
}
- function apostrophe($match, $state, $pos) {
- $this->_addCall('apostrophe',array(), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function apostrophe($match, $state, $pos) {
+ $this->addCall('apostrophe', array(), $pos);
return true;
}
- function doublequoteopening($match, $state, $pos) {
- $this->_addCall('doublequoteopening',array(), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function doublequoteopening($match, $state, $pos) {
+ $this->addCall('doublequoteopening', array(), $pos);
$this->status['doublequote']++;
return true;
}
- function doublequoteclosing($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function doublequoteclosing($match, $state, $pos) {
if ($this->status['doublequote'] <= 0) {
$this->doublequoteopening($match, $state, $pos);
} else {
- $this->_addCall('doublequoteclosing',array(), $pos);
+ $this->addCall('doublequoteclosing', array(), $pos);
$this->status['doublequote'] = max(0, --$this->status['doublequote']);
}
return true;
}
- function camelcaselink($match, $state, $pos) {
- $this->_addCall('camelcaselink',array($match), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function camelcaselink($match, $state, $pos) {
+ $this->addCall('camelcaselink', array($match), $pos);
return true;
}
- /*
- */
- function internallink($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function internallink($match, $state, $pos) {
// Strip the opening and closing markup
$link = preg_replace(array('/^\[\[/','/\]\]$/u'),'',$match);
@@ -543,42 +808,42 @@ class Doku_Handler {
if ( link_isinterwiki($link[0]) ) {
// Interwiki
$interwiki = explode('>',$link[0],2);
- $this->_addCall(
+ $this->addCall(
'interwikilink',
array($link[0],$link[1],strtolower($interwiki[0]),$interwiki[1]),
$pos
);
}elseif ( preg_match('/^\\\\\\\\[^\\\\]+?\\\\/u',$link[0]) ) {
// Windows Share
- $this->_addCall(
+ $this->addCall(
'windowssharelink',
array($link[0],$link[1]),
$pos
);
}elseif ( preg_match('#^([a-z0-9\-\.+]+?)://#i',$link[0]) ) {
// external link (accepts all protocols)
- $this->_addCall(
+ $this->addCall(
'externallink',
array($link[0],$link[1]),
$pos
);
}elseif ( preg_match('<'.PREG_PATTERN_VALID_EMAIL.'>',$link[0]) ) {
// E-Mail (pattern above is defined in inc/mail.php)
- $this->_addCall(
+ $this->addCall(
'emaillink',
array($link[0],$link[1]),
$pos
);
}elseif ( preg_match('!^#.+!',$link[0]) ){
// local link
- $this->_addCall(
+ $this->addCall(
'locallink',
array(substr($link[0],1),$link[1]),
$pos
);
}else{
// internal link
- $this->_addCall(
+ $this->addCall(
'internallink',
array($link[0],$link[1]),
$pos
@@ -588,20 +853,38 @@ class Doku_Handler {
return true;
}
- function filelink($match, $state, $pos) {
- $this->_addCall('filelink',array($match, null), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function filelink($match, $state, $pos) {
+ $this->addCall('filelink', array($match, null), $pos);
return true;
}
- function windowssharelink($match, $state, $pos) {
- $this->_addCall('windowssharelink',array($match, null), $pos);
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function windowssharelink($match, $state, $pos) {
+ $this->addCall('windowssharelink', array($match, null), $pos);
return true;
}
- function media($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function media($match, $state, $pos) {
$p = Doku_Handler_Parse_Media($match);
- $this->_addCall(
+ $this->addCall(
$p['type'],
array($p['src'], $p['title'], $p['align'], $p['width'],
$p['height'], $p['cache'], $p['linking']),
@@ -610,7 +893,13 @@ class Doku_Handler {
return true;
}
- function rss($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function rss($match, $state, $pos) {
$link = preg_replace(array('/^\{\{rss>/','/\}\}$/'),'',$match);
// get params
@@ -635,11 +924,17 @@ class Doku_Handler {
$p['refresh'] = 14400; // default to 4 hours
}
- $this->_addCall('rss',array($link,$p),$pos);
+ $this->addCall('rss', array($link, $p), $pos);
return true;
}
- function externallink($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function externallink($match, $state, $pos) {
$url = $match;
$title = null;
@@ -653,69 +948,82 @@ class Doku_Handler {
$url = 'http://'.$url;
}
- $this->_addCall('externallink',array($url, $title), $pos);
+ $this->addCall('externallink', array($url, $title), $pos);
return true;
}
- function emaillink($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function emaillink($match, $state, $pos) {
$email = preg_replace(array('/^</','/>$/'),'',$match);
- $this->_addCall('emaillink',array($email, null), $pos);
+ $this->addCall('emaillink', array($email, null), $pos);
return true;
}
- function table($match, $state, $pos) {
+ /**
+ * @param string $match matched syntax
+ * @param int $state a LEXER_STATE_* constant
+ * @param int $pos byte position in the original source file
+ * @return bool mode handled?
+ */
+ public function table($match, $state, $pos) {
switch ( $state ) {
case DOKU_LEXER_ENTER:
- $ReWriter = new Doku_Handler_Table($this->CallWriter);
- $this->CallWriter = & $ReWriter;
+ $this->callWriter = new Table($this->callWriter);
- $this->_addCall('table_start', array($pos + 1), $pos);
+ $this->addCall('table_start', array($pos + 1), $pos);
if ( trim($match) == '^' ) {
- $this->_addCall('tableheader', array(), $pos);
+ $this->addCall('tableheader', array(), $pos);
} else {
- $this->_addCall('tablecell', array(), $pos);
+ $this->addCall('tablecell', array(), $pos);
}
break;
case DOKU_LEXER_EXIT:
- $this->_addCall('table_end', array($pos), $pos);
- $this->CallWriter->process();
- $ReWriter = & $this->CallWriter;
- $this->CallWriter = & $ReWriter->CallWriter;
+ $this->addCall('table_end', array($pos), $pos);
+ /** @var Table $reWriter */
+ $reWriter = $this->callWriter;
+ $this->callWriter = $reWriter->process();
break;
case DOKU_LEXER_UNMATCHED:
if ( trim($match) != '' ) {
- $this->_addCall('cdata',array($match), $pos);
+ $this->addCall('cdata', array($match), $pos);
}
break;
case DOKU_LEXER_MATCHED:
if ( $match == ' ' ){
- $this->_addCall('cdata', array($match), $pos);
+ $this->addCall('cdata', array($match), $pos);
} else if ( preg_match('/:::/',$match) ) {
- $this->_addCall('rowspan', array($match), $pos);
+ $this->addCall('rowspan', array($match), $pos);
} else if ( preg_match('/\t+/',$match) ) {
- $this->_addCall('table_align', array($match), $pos);
+ $this->addCall('table_align', array($match), $pos);
} else if ( preg_match('/ {2,}/',$match) ) {
- $this->_addCall('table_align', array($match), $pos);
+ $this->addCall('table_align', array($match), $pos);
} else if ( $match == "\n|" ) {
- $this->_addCall('table_row', array(), $pos);
- $this->_addCall('tablecell', array(), $pos);
+ $this->addCall('table_row', array(), $pos);
+ $this->addCall('tablecell', array(), $pos);
} else if ( $match == "\n^" ) {
- $this->_addCall('table_row', array(), $pos);
- $this->_addCall('tableheader', array(), $pos);
+ $this->addCall('table_row', array(), $pos);
+ $this->addCall('tableheader', array(), $pos);
} else if ( $match == '|' ) {
- $this->_addCall('tablecell', array(), $pos);
+ $this->addCall('tablecell', array(), $pos);
} else if ( $match == '^' ) {
- $this->_addCall('tableheader', array(), $pos);
+ $this->addCall('tableheader', array(), $pos);
}
break;
}
return true;
}
+
+ // endregion modes
}
//------------------------------------------------------------------------
@@ -808,1004 +1116,3 @@ function Doku_Handler_Parse_Media($match) {
return $params;
}
-//------------------------------------------------------------------------
-interface Doku_Handler_CallWriter_Interface {
- public function writeCall($call);
- public function writeCalls($calls);
- public function finalise();
-}
-
-class Doku_Handler_CallWriter implements Doku_Handler_CallWriter_Interface {
-
- var $Handler;
-
- /**
- * @param Doku_Handler $Handler
- */
- function __construct(Doku_Handler $Handler) {
- $this->Handler = $Handler;
- }
-
- function writeCall($call) {
- $this->Handler->calls[] = $call;
- }
-
- function writeCalls($calls) {
- $this->Handler->calls = array_merge($this->Handler->calls, $calls);
- }
-
- // function is required, but since this call writer is first/highest in
- // the chain it is not required to do anything
- function finalise() {
- unset($this->Handler);
- }
-}
-
-//------------------------------------------------------------------------
-/**
- * Generic call writer class to handle nesting of rendering instructions
- * within a render instruction. Also see nest() method of renderer base class
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- */
-class Doku_Handler_Nest implements Doku_Handler_CallWriter_Interface {
-
- var $CallWriter;
- var $calls = array();
-
- var $closingInstruction;
-
- /**
- * constructor
- *
- * @param Doku_Handler_CallWriter $CallWriter the renderers current call writer
- * @param string $close closing instruction name, this is required to properly terminate the
- * syntax mode if the document ends without a closing pattern
- */
- function __construct(Doku_Handler_CallWriter_Interface $CallWriter, $close="nest_close") {
- $this->CallWriter = $CallWriter;
-
- $this->closingInstruction = $close;
- }
-
- function writeCall($call) {
- $this->calls[] = $call;
- }
-
- function writeCalls($calls) {
- $this->calls = array_merge($this->calls, $calls);
- }
-
- function finalise() {
- $last_call = end($this->calls);
- $this->writeCall(array($this->closingInstruction,array(), $last_call[2]));
-
- $this->process();
- $this->CallWriter->finalise();
- unset($this->CallWriter);
- }
-
- function process() {
- // merge consecutive cdata
- $unmerged_calls = $this->calls;
- $this->calls = array();
-
- foreach ($unmerged_calls as $call) $this->addCall($call);
-
- $first_call = reset($this->calls);
- $this->CallWriter->writeCall(array("nest", array($this->calls), $first_call[2]));
- }
-
- function addCall($call) {
- $key = count($this->calls);
- if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
- $this->calls[$key-1][1][0] .= $call[1][0];
- } else if ($call[0] == 'eol') {
- // do nothing (eol shouldn't be allowed, to counter preformatted fix in #1652 & #1699)
- } else {
- $this->calls[] = $call;
- }
- }
-}
-
-class Doku_Handler_List implements Doku_Handler_CallWriter_Interface {
-
- var $CallWriter;
-
- var $calls = array();
- var $listCalls = array();
- var $listStack = array();
-
- const NODE = 1;
-
- function __construct(Doku_Handler_CallWriter_Interface $CallWriter) {
- $this->CallWriter = $CallWriter;
- }
-
- function writeCall($call) {
- $this->calls[] = $call;
- }
-
- // Probably not needed but just in case...
- function writeCalls($calls) {
- $this->calls = array_merge($this->calls, $calls);
-# $this->CallWriter->writeCalls($this->calls);
- }
-
- function finalise() {
- $last_call = end($this->calls);
- $this->writeCall(array('list_close',array(), $last_call[2]));
-
- $this->process();
- $this->CallWriter->finalise();
- unset($this->CallWriter);
- }
-
- //------------------------------------------------------------------------
- function process() {
-
- foreach ( $this->calls as $call ) {
- switch ($call[0]) {
- case 'list_item':
- $this->listOpen($call);
- break;
- case 'list_open':
- $this->listStart($call);
- break;
- case 'list_close':
- $this->listEnd($call);
- break;
- default:
- $this->listContent($call);
- break;
- }
- }
-
- $this->CallWriter->writeCalls($this->listCalls);
- }
-
- //------------------------------------------------------------------------
- function listStart($call) {
- $depth = $this->interpretSyntax($call[1][0], $listType);
-
- $this->initialDepth = $depth;
- // array(list type, current depth, index of current listitem_open)
- $this->listStack[] = array($listType, $depth, 1);
-
- $this->listCalls[] = array('list'.$listType.'_open',array(),$call[2]);
- $this->listCalls[] = array('listitem_open',array(1),$call[2]);
- $this->listCalls[] = array('listcontent_open',array(),$call[2]);
- }
-
- //------------------------------------------------------------------------
- function listEnd($call) {
- $closeContent = true;
-
- while ( $list = array_pop($this->listStack) ) {
- if ( $closeContent ) {
- $this->listCalls[] = array('listcontent_close',array(),$call[2]);
- $closeContent = false;
- }
- $this->listCalls[] = array('listitem_close',array(),$call[2]);
- $this->listCalls[] = array('list'.$list[0].'_close', array(), $call[2]);
- }
- }
-
- //------------------------------------------------------------------------
- function listOpen($call) {
- $depth = $this->interpretSyntax($call[1][0], $listType);
- $end = end($this->listStack);
- $key = key($this->listStack);
-
- // Not allowed to be shallower than initialDepth
- if ( $depth < $this->initialDepth ) {
- $depth = $this->initialDepth;
- }
-
- //------------------------------------------------------------------------
- if ( $depth == $end[1] ) {
-
- // Just another item in the list...
- if ( $listType == $end[0] ) {
- $this->listCalls[] = array('listcontent_close',array(),$call[2]);
- $this->listCalls[] = array('listitem_close',array(),$call[2]);
- $this->listCalls[] = array('listitem_open',array($depth-1),$call[2]);
- $this->listCalls[] = array('listcontent_open',array(),$call[2]);
-
- // new list item, update list stack's index into current listitem_open
- $this->listStack[$key][2] = count($this->listCalls) - 2;
-
- // Switched list type...
- } else {
-
- $this->listCalls[] = array('listcontent_close',array(),$call[2]);
- $this->listCalls[] = array('listitem_close',array(),$call[2]);
- $this->listCalls[] = array('list'.$end[0].'_close', array(), $call[2]);
- $this->listCalls[] = array('list'.$listType.'_open', array(), $call[2]);
- $this->listCalls[] = array('listitem_open', array($depth-1), $call[2]);
- $this->listCalls[] = array('listcontent_open',array(),$call[2]);
-
- array_pop($this->listStack);
- $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2);
- }
-
- //------------------------------------------------------------------------
- // Getting deeper...
- } else if ( $depth > $end[1] ) {
-
- $this->listCalls[] = array('listcontent_close',array(),$call[2]);
- $this->listCalls[] = array('list'.$listType.'_open', array(), $call[2]);
- $this->listCalls[] = array('listitem_open', array($depth-1), $call[2]);
- $this->listCalls[] = array('listcontent_open',array(),$call[2]);
-
- // set the node/leaf state of this item's parent listitem_open to NODE
- $this->listCalls[$this->listStack[$key][2]][1][1] = self::NODE;
-
- $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2);
-
- //------------------------------------------------------------------------
- // Getting shallower ( $depth < $end[1] )
- } else {
- $this->listCalls[] = array('listcontent_close',array(),$call[2]);
- $this->listCalls[] = array('listitem_close',array(),$call[2]);
- $this->listCalls[] = array('list'.$end[0].'_close',array(),$call[2]);
-
- // Throw away the end - done
- array_pop($this->listStack);
-
- while (1) {
- $end = end($this->listStack);
- $key = key($this->listStack);
-
- if ( $end[1] <= $depth ) {
-
- // Normalize depths
- $depth = $end[1];
-
- $this->listCalls[] = array('listitem_close',array(),$call[2]);
-
- if ( $end[0] == $listType ) {
- $this->listCalls[] = array('listitem_open',array($depth-1),$call[2]);
- $this->listCalls[] = array('listcontent_open',array(),$call[2]);
-
- // new list item, update list stack's index into current listitem_open
- $this->listStack[$key][2] = count($this->listCalls) - 2;
-
- } else {
- // Switching list type...
- $this->listCalls[] = array('list'.$end[0].'_close', array(), $call[2]);
- $this->listCalls[] = array('list'.$listType.'_open', array(), $call[2]);
- $this->listCalls[] = array('listitem_open', array($depth-1), $call[2]);
- $this->listCalls[] = array('listcontent_open',array(),$call[2]);
-
- array_pop($this->listStack);
- $this->listStack[] = array($listType, $depth, count($this->listCalls) - 2);
- }
-
- break;
-
- // Haven't dropped down far enough yet.... ( $end[1] > $depth )
- } else {
-
- $this->listCalls[] = array('listitem_close',array(),$call[2]);
- $this->listCalls[] = array('list'.$end[0].'_close',array(),$call[2]);
-
- array_pop($this->listStack);
-
- }
-
- }
-
- }
- }
-
- //------------------------------------------------------------------------
- function listContent($call) {
- $this->listCalls[] = $call;
- }
-
- //------------------------------------------------------------------------
- function interpretSyntax($match, & $type) {
- if ( substr($match,-1) == '*' ) {
- $type = 'u';
- } else {
- $type = 'o';
- }
- // Is the +1 needed? It used to be count(explode(...))
- // but I don't think the number is seen outside this handler
- return substr_count(str_replace("\t",' ',$match), ' ') + 1;
- }
-}
-
-//------------------------------------------------------------------------
-class Doku_Handler_Preformatted implements Doku_Handler_CallWriter_Interface {
-
- var $CallWriter;
-
- var $calls = array();
- var $pos;
- var $text ='';
-
-
-
- function __construct(Doku_Handler_CallWriter_Interface $CallWriter) {
- $this->CallWriter = $CallWriter;
- }
-
- function writeCall($call) {
- $this->calls[] = $call;
- }
-
- // Probably not needed but just in case...
- function writeCalls($calls) {
- $this->calls = array_merge($this->calls, $calls);
-# $this->CallWriter->writeCalls($this->calls);
- }
-
- function finalise() {
- $last_call = end($this->calls);
- $this->writeCall(array('preformatted_end',array(), $last_call[2]));
-
- $this->process();
- $this->CallWriter->finalise();
- unset($this->CallWriter);
- }
-
- function process() {
- foreach ( $this->calls as $call ) {
- switch ($call[0]) {
- case 'preformatted_start':
- $this->pos = $call[2];
- break;
- case 'preformatted_newline':
- $this->text .= "\n";
- break;
- case 'preformatted_content':
- $this->text .= $call[1][0];
- break;
- case 'preformatted_end':
- if (trim($this->text)) {
- $this->CallWriter->writeCall(array('preformatted',array($this->text),$this->pos));
- }
- // see FS#1699 & FS#1652, add 'eol' instructions to ensure proper triggering of following p_open
- $this->CallWriter->writeCall(array('eol',array(),$this->pos));
- $this->CallWriter->writeCall(array('eol',array(),$this->pos));
- break;
- }
- }
- }
-
-}
-
-//------------------------------------------------------------------------
-class Doku_Handler_Quote implements Doku_Handler_CallWriter_Interface {
-
- var $CallWriter;
-
- var $calls = array();
-
- var $quoteCalls = array();
-
- function __construct(Doku_Handler_CallWriter_Interface $CallWriter) {
- $this->CallWriter = $CallWriter;
- }
-
- function writeCall($call) {
- $this->calls[] = $call;
- }
-
- // Probably not needed but just in case...
- function writeCalls($calls) {
- $this->calls = array_merge($this->calls, $calls);
- }
-
- function finalise() {
- $last_call = end($this->calls);
- $this->writeCall(array('quote_end',array(), $last_call[2]));
-
- $this->process();
- $this->CallWriter->finalise();
- unset($this->CallWriter);
- }
-
- function process() {
-
- $quoteDepth = 1;
-
- foreach ( $this->calls as $call ) {
- switch ($call[0]) {
-
- case 'quote_start':
-
- $this->quoteCalls[] = array('quote_open',array(),$call[2]);
-
- case 'quote_newline':
-
- $quoteLength = $this->getDepth($call[1][0]);
-
- if ( $quoteLength > $quoteDepth ) {
- $quoteDiff = $quoteLength - $quoteDepth;
- for ( $i = 1; $i <= $quoteDiff; $i++ ) {
- $this->quoteCalls[] = array('quote_open',array(),$call[2]);
- }
- } else if ( $quoteLength < $quoteDepth ) {
- $quoteDiff = $quoteDepth - $quoteLength;
- for ( $i = 1; $i <= $quoteDiff; $i++ ) {
- $this->quoteCalls[] = array('quote_close',array(),$call[2]);
- }
- } else {
- if ($call[0] != 'quote_start') $this->quoteCalls[] = array('linebreak',array(),$call[2]);
- }
-
- $quoteDepth = $quoteLength;
-
- break;
-
- case 'quote_end':
-
- if ( $quoteDepth > 1 ) {
- $quoteDiff = $quoteDepth - 1;
- for ( $i = 1; $i <= $quoteDiff; $i++ ) {
- $this->quoteCalls[] = array('quote_close',array(),$call[2]);
- }
- }
-
- $this->quoteCalls[] = array('quote_close',array(),$call[2]);
-
- $this->CallWriter->writeCalls($this->quoteCalls);
- break;
-
- default:
- $this->quoteCalls[] = $call;
- break;
- }
- }
- }
-
- function getDepth($marker) {
- preg_match('/>{1,}/', $marker, $matches);
- $quoteLength = strlen($matches[0]);
- return $quoteLength;
- }
-}
-
-//------------------------------------------------------------------------
-class Doku_Handler_Table implements Doku_Handler_CallWriter_Interface {
-
- var $CallWriter;
-
- var $calls = array();
- var $tableCalls = array();
- var $maxCols = 0;
- var $maxRows = 1;
- var $currentCols = 0;
- var $firstCell = false;
- var $lastCellType = 'tablecell';
- var $inTableHead = true;
- var $currentRow = array('tableheader' => 0, 'tablecell' => 0);
- var $countTableHeadRows = 0;
-
- function __construct(Doku_Handler_CallWriter_Interface $CallWriter) {
- $this->CallWriter = $CallWriter;
- }
-
- function writeCall($call) {
- $this->calls[] = $call;
- }
-
- // Probably not needed but just in case...
- function writeCalls($calls) {
- $this->calls = array_merge($this->calls, $calls);
- }
-
- function finalise() {
- $last_call = end($this->calls);
- $this->writeCall(array('table_end',array(), $last_call[2]));
-
- $this->process();
- $this->CallWriter->finalise();
- unset($this->CallWriter);
- }
-
- //------------------------------------------------------------------------
- function process() {
- foreach ( $this->calls as $call ) {
- switch ( $call[0] ) {
- case 'table_start':
- $this->tableStart($call);
- break;
- case 'table_row':
- $this->tableRowClose($call);
- $this->tableRowOpen(array('tablerow_open',$call[1],$call[2]));
- break;
- case 'tableheader':
- case 'tablecell':
- $this->tableCell($call);
- break;
- case 'table_end':
- $this->tableRowClose($call);
- $this->tableEnd($call);
- break;
- default:
- $this->tableDefault($call);
- break;
- }
- }
- $this->CallWriter->writeCalls($this->tableCalls);
- }
-
- function tableStart($call) {
- $this->tableCalls[] = array('table_open',$call[1],$call[2]);
- $this->tableCalls[] = array('tablerow_open',array(),$call[2]);
- $this->firstCell = true;
- }
-
- function tableEnd($call) {
- $this->tableCalls[] = array('table_close',$call[1],$call[2]);
- $this->finalizeTable();
- }
-
- function tableRowOpen($call) {
- $this->tableCalls[] = $call;
- $this->currentCols = 0;
- $this->firstCell = true;
- $this->lastCellType = 'tablecell';
- $this->maxRows++;
- if ($this->inTableHead) {
- $this->currentRow = array('tablecell' => 0, 'tableheader' => 0);
- }
- }
-
- function tableRowClose($call) {
- if ($this->inTableHead && ($this->inTableHead = $this->isTableHeadRow())) {
- $this->countTableHeadRows++;
- }
- // Strip off final cell opening and anything after it
- while ( $discard = array_pop($this->tableCalls ) ) {
-
- if ( $discard[0] == 'tablecell_open' || $discard[0] == 'tableheader_open') {
- break;
- }
- if (!empty($this->currentRow[$discard[0]])) {
- $this->currentRow[$discard[0]]--;
- }
- }
- $this->tableCalls[] = array('tablerow_close', array(), $call[2]);
-
- if ( $this->currentCols > $this->maxCols ) {
- $this->maxCols = $this->currentCols;
- }
- }
-
- function isTableHeadRow() {
- $td = $this->currentRow['tablecell'];
- $th = $this->currentRow['tableheader'];
-
- if (!$th || $td > 2) return false;
- if (2*$td > $th) return false;
-
- return true;
- }
-
- function tableCell($call) {
- if ($this->inTableHead) {
- $this->currentRow[$call[0]]++;
- }
- if ( !$this->firstCell ) {
-
- // Increase the span
- $lastCall = end($this->tableCalls);
-
- // A cell call which follows an open cell means an empty cell so span
- if ( $lastCall[0] == 'tablecell_open' || $lastCall[0] == 'tableheader_open' ) {
- $this->tableCalls[] = array('colspan',array(),$call[2]);
-
- }
-
- $this->tableCalls[] = array($this->lastCellType.'_close',array(),$call[2]);
- $this->tableCalls[] = array($call[0].'_open',array(1,null,1),$call[2]);
- $this->lastCellType = $call[0];
-
- } else {
-
- $this->tableCalls[] = array($call[0].'_open',array(1,null,1),$call[2]);
- $this->lastCellType = $call[0];
- $this->firstCell = false;
-
- }
-
- $this->currentCols++;
- }
-
- function tableDefault($call) {
- $this->tableCalls[] = $call;
- }
-
- function finalizeTable() {
-
- // Add the max cols and rows to the table opening
- if ( $this->tableCalls[0][0] == 'table_open' ) {
- // Adjust to num cols not num col delimeters
- $this->tableCalls[0][1][] = $this->maxCols - 1;
- $this->tableCalls[0][1][] = $this->maxRows;
- $this->tableCalls[0][1][] = array_shift($this->tableCalls[0][1]);
- } else {
- trigger_error('First element in table call list is not table_open');
- }
-
- $lastRow = 0;
- $lastCell = 0;
- $cellKey = array();
- $toDelete = array();
-
- // if still in tableheader, then there can be no table header
- // as all rows can't be within <THEAD>
- if ($this->inTableHead) {
- $this->inTableHead = false;
- $this->countTableHeadRows = 0;
- }
-
- // Look for the colspan elements and increment the colspan on the
- // previous non-empty opening cell. Once done, delete all the cells
- // that contain colspans
- for ($key = 0 ; $key < count($this->tableCalls) ; ++$key) {
- $call = $this->tableCalls[$key];
-
- switch ($call[0]) {
- case 'table_open' :
- if($this->countTableHeadRows) {
- array_splice($this->tableCalls, $key+1, 0, array(
- array('tablethead_open', array(), $call[2]))
- );
- }
- break;
-
- case 'tablerow_open':
-
- $lastRow++;
- $lastCell = 0;
- break;
-
- case 'tablecell_open':
- case 'tableheader_open':
-
- $lastCell++;
- $cellKey[$lastRow][$lastCell] = $key;
- break;
-
- case 'table_align':
-
- $prev = in_array($this->tableCalls[$key-1][0], array('tablecell_open', 'tableheader_open'));
- $next = in_array($this->tableCalls[$key+1][0], array('tablecell_close', 'tableheader_close'));
- // If the cell is empty, align left
- if ($prev && $next) {
- $this->tableCalls[$key-1][1][1] = 'left';
-
- // If the previous element was a cell open, align right
- } elseif ($prev) {
- $this->tableCalls[$key-1][1][1] = 'right';
-
- // If the next element is the close of an element, align either center or left
- } elseif ( $next) {
- if ( $this->tableCalls[$cellKey[$lastRow][$lastCell]][1][1] == 'right' ) {
- $this->tableCalls[$cellKey[$lastRow][$lastCell]][1][1] = 'center';
- } else {
- $this->tableCalls[$cellKey[$lastRow][$lastCell]][1][1] = 'left';
- }
-
- }
-
- // Now convert the whitespace back to cdata
- $this->tableCalls[$key][0] = 'cdata';
- break;
-
- case 'colspan':
-
- $this->tableCalls[$key-1][1][0] = false;
-
- for($i = $key-2; $i >= $cellKey[$lastRow][1]; $i--) {
-
- if ( $this->tableCalls[$i][0] == 'tablecell_open' || $this->tableCalls[$i][0] == 'tableheader_open' ) {
-
- if ( false !== $this->tableCalls[$i][1][0] ) {
- $this->tableCalls[$i][1][0]++;
- break;
- }
-
- }
- }
-
- $toDelete[] = $key-1;
- $toDelete[] = $key;
- $toDelete[] = $key+1;
- break;
-
- case 'rowspan':
-
- if ( $this->tableCalls[$key-1][0] == 'cdata' ) {
- // ignore rowspan if previous call was cdata (text mixed with :::) we don't have to check next call as that wont match regex
- $this->tableCalls[$key][0] = 'cdata';
-
- } else {
-
- $spanning_cell = null;
-
- // can't cross thead/tbody boundary
- if (!$this->countTableHeadRows || ($lastRow-1 != $this->countTableHeadRows)) {
- for($i = $lastRow-1; $i > 0; $i--) {
-
- if ( $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tablecell_open' || $this->tableCalls[$cellKey[$i][$lastCell]][0] == 'tableheader_open' ) {
-
- if ($this->tableCalls[$cellKey[$i][$lastCell]][1][2] >= $lastRow - $i) {
- $spanning_cell = $i;
- break;
- }
-
- }
- }
- }
- if (is_null($spanning_cell)) {
- // No spanning cell found, so convert this cell to
- // an empty one to avoid broken tables
- $this->tableCalls[$key][0] = 'cdata';
- $this->tableCalls[$key][1][0] = '';
- break;
- }
- $this->tableCalls[$cellKey[$spanning_cell][$lastCell]][1][2]++;
-
- $this->tableCalls[$key-1][1][2] = false;
-
- $toDelete[] = $key-1;
- $toDelete[] = $key;
- $toDelete[] = $key+1;
- }
- break;
-
- case 'tablerow_close':
-
- // Fix broken tables by adding missing cells
- $moreCalls = array();
- while (++$lastCell < $this->maxCols) {
- $moreCalls[] = array('tablecell_open', array(1, null, 1), $call[2]);
- $moreCalls[] = array('cdata', array(''), $call[2]);
- $moreCalls[] = array('tablecell_close', array(), $call[2]);
- }
- $moreCallsLength = count($moreCalls);
- if($moreCallsLength) {
- array_splice($this->tableCalls, $key, 0, $moreCalls);
- $key += $moreCallsLength;
- }
-
- if($this->countTableHeadRows == $lastRow) {
- array_splice($this->tableCalls, $key+1, 0, array(
- array('tablethead_close', array(), $call[2])));
- }
- break;
-
- }
- }
-
- // condense cdata
- $cnt = count($this->tableCalls);
- for( $key = 0; $key < $cnt; $key++){
- if($this->tableCalls[$key][0] == 'cdata'){
- $ckey = $key;
- $key++;
- while($this->tableCalls[$key][0] == 'cdata'){
- $this->tableCalls[$ckey][1][0] .= $this->tableCalls[$key][1][0];
- $toDelete[] = $key;
- $key++;
- }
- continue;
- }
- }
-
- foreach ( $toDelete as $delete ) {
- unset($this->tableCalls[$delete]);
- }
- $this->tableCalls = array_values($this->tableCalls);
- }
-}
-
-
-/**
- * Handler for paragraphs
- *
- * @author Harry Fuecks <hfuecks@gmail.com>
- */
-class Doku_Handler_Block {
- var $calls = array();
- var $skipEol = false;
- var $inParagraph = false;
-
- // Blocks these should not be inside paragraphs
- var $blockOpen = array(
- 'header',
- 'listu_open','listo_open','listitem_open','listcontent_open',
- 'table_open','tablerow_open','tablecell_open','tableheader_open','tablethead_open',
- 'quote_open',
- 'code','file','hr','preformatted','rss',
- 'htmlblock','phpblock',
- 'footnote_open',
- );
-
- var $blockClose = array(
- 'header',
- 'listu_close','listo_close','listitem_close','listcontent_close',
- 'table_close','tablerow_close','tablecell_close','tableheader_close','tablethead_close',
- 'quote_close',
- 'code','file','hr','preformatted','rss',
- 'htmlblock','phpblock',
- 'footnote_close',
- );
-
- // Stacks can contain paragraphs
- var $stackOpen = array(
- 'section_open',
- );
-
- var $stackClose = array(
- 'section_close',
- );
-
-
- /**
- * Constructor. Adds loaded syntax plugins to the block and stack
- * arrays
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- function __construct(){
- global $DOKU_PLUGINS;
- //check if syntax plugins were loaded
- if(empty($DOKU_PLUGINS['syntax'])) return;
- foreach($DOKU_PLUGINS['syntax'] as $n => $p){
- $ptype = $p->getPType();
- if($ptype == 'block'){
- $this->blockOpen[] = 'plugin_'.$n;
- $this->blockClose[] = 'plugin_'.$n;
- }elseif($ptype == 'stack'){
- $this->stackOpen[] = 'plugin_'.$n;
- $this->stackClose[] = 'plugin_'.$n;
- }
- }
- }
-
- function openParagraph($pos){
- if ($this->inParagraph) return;
- $this->calls[] = array('p_open',array(), $pos);
- $this->inParagraph = true;
- $this->skipEol = true;
- }
-
- /**
- * Close a paragraph if needed
- *
- * This function makes sure there are no empty paragraphs on the stack
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string|integer $pos
- */
- function closeParagraph($pos){
- if (!$this->inParagraph) return;
- // look back if there was any content - we don't want empty paragraphs
- $content = '';
- $ccount = count($this->calls);
- for($i=$ccount-1; $i>=0; $i--){
- if($this->calls[$i][0] == 'p_open'){
- break;
- }elseif($this->calls[$i][0] == 'cdata'){
- $content .= $this->calls[$i][1][0];
- }else{
- $content = 'found markup';
- break;
- }
- }
-
- if(trim($content)==''){
- //remove the whole paragraph
- //array_splice($this->calls,$i); // <- this is much slower than the loop below
- for($x=$ccount; $x>$i; $x--) array_pop($this->calls);
- }else{
- // remove ending linebreaks in the paragraph
- $i=count($this->calls)-1;
- if ($this->calls[$i][0] == 'cdata') $this->calls[$i][1][0] = rtrim($this->calls[$i][1][0],DOKU_PARSER_EOL);
- $this->calls[] = array('p_close',array(), $pos);
- }
-
- $this->inParagraph = false;
- $this->skipEol = true;
- }
-
- function addCall($call) {
- $key = count($this->calls);
- if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
- $this->calls[$key-1][1][0] .= $call[1][0];
- } else {
- $this->calls[] = $call;
- }
- }
-
- // simple version of addCall, without checking cdata
- function storeCall($call) {
- $this->calls[] = $call;
- }
-
- /**
- * Processes the whole instruction stack to open and close paragraphs
- *
- * @author Harry Fuecks <hfuecks@gmail.com>
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param array $calls
- *
- * @return array
- */
- function process($calls) {
- // open first paragraph
- $this->openParagraph(0);
- foreach ( $calls as $key => $call ) {
- $cname = $call[0];
- if ($cname == 'plugin') {
- $cname='plugin_'.$call[1][0];
- $plugin = true;
- $plugin_open = (($call[1][2] == DOKU_LEXER_ENTER) || ($call[1][2] == DOKU_LEXER_SPECIAL));
- $plugin_close = (($call[1][2] == DOKU_LEXER_EXIT) || ($call[1][2] == DOKU_LEXER_SPECIAL));
- } else {
- $plugin = false;
- }
- /* stack */
- if ( in_array($cname,$this->stackClose ) && (!$plugin || $plugin_close)) {
- $this->closeParagraph($call[2]);
- $this->storeCall($call);
- $this->openParagraph($call[2]);
- continue;
- }
- if ( in_array($cname,$this->stackOpen ) && (!$plugin || $plugin_open) ) {
- $this->closeParagraph($call[2]);
- $this->storeCall($call);
- $this->openParagraph($call[2]);
- continue;
- }
- /* block */
- // If it's a substition it opens and closes at the same call.
- // To make sure next paragraph is correctly started, let close go first.
- if ( in_array($cname, $this->blockClose) && (!$plugin || $plugin_close)) {
- $this->closeParagraph($call[2]);
- $this->storeCall($call);
- $this->openParagraph($call[2]);
- continue;
- }
- if ( in_array($cname, $this->blockOpen) && (!$plugin || $plugin_open)) {
- $this->closeParagraph($call[2]);
- $this->storeCall($call);
- continue;
- }
- /* eol */
- if ( $cname == 'eol' ) {
- // Check this isn't an eol instruction to skip...
- if ( !$this->skipEol ) {
- // Next is EOL => double eol => mark as paragraph
- if ( isset($calls[$key+1]) && $calls[$key+1][0] == 'eol' ) {
- $this->closeParagraph($call[2]);
- $this->openParagraph($call[2]);
- } else {
- //if this is just a single eol make a space from it
- $this->addCall(array('cdata',array(DOKU_PARSER_EOL), $call[2]));
- }
- }
- continue;
- }
- /* normal */
- $this->addCall($call);
- $this->skipEol = false;
- }
- // close last paragraph
- $call = end($this->calls);
- $this->closeParagraph($call[2]);
- return $this->calls;
- }
-}
-
-//Setup VIM: ex: et ts=4 :
diff --git a/inc/parser/lexer.php b/inc/parser/lexer.php
deleted file mode 100644
index ba6a65397..000000000
--- a/inc/parser/lexer.php
+++ /dev/null
@@ -1,614 +0,0 @@
-<?php
-/**
- * Author Markus Baker: http://www.lastcraft.com
- * Version adapted from Simple Test: http://sourceforge.net/projects/simpletest/
- * For an intro to the Lexer see:
- * https://web.archive.org/web/20120125041816/http://www.phppatterns.com/docs/develop/simple_test_lexer_notes
- * @author Marcus Baker
- * @package Doku
- * @subpackage Lexer
- * @version $Id: lexer.php,v 1.1 2005/03/23 23:14:09 harryf Exp $
- */
-
-/**
- * Init path constant
- */
-if(!defined('DOKU_INC')) die('meh.');
-
-/**#@+
- * lexer mode constant
- */
-define("DOKU_LEXER_ENTER", 1);
-define("DOKU_LEXER_MATCHED", 2);
-define("DOKU_LEXER_UNMATCHED", 3);
-define("DOKU_LEXER_EXIT", 4);
-define("DOKU_LEXER_SPECIAL", 5);
-/**#@-*/
-
-/**
- * Compounded regular expression. Any of
- * the contained patterns could match and
- * when one does it's label is returned.
- *
- * @package Doku
- * @subpackage Lexer
- */
-class Doku_LexerParallelRegex {
- var $_patterns;
- var $_labels;
- var $_regex;
- var $_case;
-
- /**
- * Constructor. Starts with no patterns.
- *
- * @param boolean $case True for case sensitive, false
- * for insensitive.
- * @access public
- */
- function __construct($case) {
- $this->_case = $case;
- $this->_patterns = array();
- $this->_labels = array();
- $this->_regex = null;
- }
-
- /**
- * Adds a pattern with an optional label.
- *
- * @param mixed $pattern Perl style regex. Must be UTF-8
- * encoded. If its a string, the (, )
- * lose their meaning unless they
- * form part of a lookahead or
- * lookbehind assertation.
- * @param bool|string $label Label of regex to be returned
- * on a match. Label must be ASCII
- * @access public
- */
- function addPattern($pattern, $label = true) {
- $count = count($this->_patterns);
- $this->_patterns[$count] = $pattern;
- $this->_labels[$count] = $label;
- $this->_regex = null;
- }
-
- /**
- * Attempts to match all patterns at once against a string.
- *
- * @param string $subject String to match against.
- * @param string $match First matched portion of
- * subject.
- * @return boolean True on success.
- * @access public
- */
- function match($subject, &$match) {
- if (count($this->_patterns) == 0) {
- return false;
- }
- if (! preg_match($this->_getCompoundedRegex(), $subject, $matches)) {
- $match = "";
- return false;
- }
-
- $match = $matches[0];
- $size = count($matches);
- for ($i = 1; $i < $size; $i++) {
- if ($matches[$i] && isset($this->_labels[$i - 1])) {
- return $this->_labels[$i - 1];
- }
- }
- return true;
- }
-
- /**
- * Attempts to split the string against all patterns at once
- *
- * @param string $subject String to match against.
- * @param array $split The split result: array containing, pre-match, match & post-match strings
- * @return boolean True on success.
- * @access public
- *
- * @author Christopher Smith <chris@jalakai.co.uk>
- */
- function split($subject, &$split) {
- if (count($this->_patterns) == 0) {
- return false;
- }
-
- if (! preg_match($this->_getCompoundedRegex(), $subject, $matches)) {
- if(function_exists('preg_last_error')){
- $err = preg_last_error();
- switch($err){
- case PREG_BACKTRACK_LIMIT_ERROR:
- msg('A PCRE backtrack error occured. Try to increase the pcre.backtrack_limit in php.ini',-1);
- break;
- case PREG_RECURSION_LIMIT_ERROR:
- msg('A PCRE recursion error occured. Try to increase the pcre.recursion_limit in php.ini',-1);
- break;
- case PREG_BAD_UTF8_ERROR:
- msg('A PCRE UTF-8 error occured. This might be caused by a faulty plugin',-1);
- break;
- case PREG_INTERNAL_ERROR:
- msg('A PCRE internal error occured. This might be caused by a faulty plugin',-1);
- break;
- }
- }
-
- $split = array($subject, "", "");
- return false;
- }
-
- $idx = count($matches)-2;
- list($pre, $post) = preg_split($this->_patterns[$idx].$this->_getPerlMatchingFlags(), $subject, 2);
- $split = array($pre, $matches[0], $post);
-
- return isset($this->_labels[$idx]) ? $this->_labels[$idx] : true;
- }
-
- /**
- * Compounds the patterns into a single
- * regular expression separated with the
- * "or" operator. Caches the regex.
- * Will automatically escape (, ) and / tokens.
- *
- * @internal array $_patterns List of patterns in order.
- * @return null|string
- * @access private
- */
- function _getCompoundedRegex() {
- if ($this->_regex == null) {
- $cnt = count($this->_patterns);
- for ($i = 0; $i < $cnt; $i++) {
-
- /*
- * decompose the input pattern into "(", "(?", ")",
- * "[...]", "[]..]", "[^]..]", "[...[:...:]..]", "\x"...
- * elements.
- */
- preg_match_all('/\\\\.|' .
- '\(\?|' .
- '[()]|' .
- '\[\^?\]?(?:\\\\.|\[:[^]]*:\]|[^]\\\\])*\]|' .
- '[^[()\\\\]+/', $this->_patterns[$i], $elts);
-
- $pattern = "";
- $level = 0;
-
- foreach ($elts[0] as $elt) {
- /*
- * for "(", ")" remember the nesting level, add "\"
- * only to the non-"(?" ones.
- */
-
- switch($elt) {
- case '(':
- $pattern .= '\(';
- break;
- case ')':
- if ($level > 0)
- $level--; /* closing (? */
- else
- $pattern .= '\\';
- $pattern .= ')';
- break;
- case '(?':
- $level++;
- $pattern .= '(?';
- break;
- default:
- if (substr($elt, 0, 1) == '\\')
- $pattern .= $elt;
- else
- $pattern .= str_replace('/', '\/', $elt);
- }
- }
- $this->_patterns[$i] = "($pattern)";
- }
- $this->_regex = "/" . implode("|", $this->_patterns) . "/" . $this->_getPerlMatchingFlags();
- }
- return $this->_regex;
- }
-
- /**
- * Accessor for perl regex mode flags to use.
- * @return string Perl regex flags.
- * @access private
- */
- function _getPerlMatchingFlags() {
- return ($this->_case ? "msS" : "msSi");
- }
-}
-
-/**
- * States for a stack machine.
- * @package Lexer
- * @subpackage Lexer
- */
-class Doku_LexerStateStack {
- var $_stack;
-
- /**
- * Constructor. Starts in named state.
- * @param string $start Starting state name.
- * @access public
- */
- function __construct($start) {
- $this->_stack = array($start);
- }
-
- /**
- * Accessor for current state.
- * @return string State.
- * @access public
- */
- function getCurrent() {
- return $this->_stack[count($this->_stack) - 1];
- }
-
- /**
- * Adds a state to the stack and sets it
- * to be the current state.
- * @param string $state New state.
- * @access public
- */
- function enter($state) {
- array_push($this->_stack, $state);
- }
-
- /**
- * Leaves the current state and reverts
- * to the previous one.
- * @return boolean False if we drop off
- * the bottom of the list.
- * @access public
- */
- function leave() {
- if (count($this->_stack) == 1) {
- return false;
- }
- array_pop($this->_stack);
- return true;
- }
-}
-
-/**
- * Accepts text and breaks it into tokens.
- * Some optimisation to make the sure the
- * content is only scanned by the PHP regex
- * parser once. Lexer modes must not start
- * with leading underscores.
- * @package Doku
- * @subpackage Lexer
- */
-class Doku_Lexer {
- var $_regexes;
- var $_parser;
- var $_mode;
- var $_mode_handlers;
- var $_case;
-
- /**
- * Sets up the lexer in case insensitive matching
- * by default.
- * @param Doku_Parser $parser Handling strategy by
- * reference.
- * @param string $start Starting handler.
- * @param boolean $case True for case sensitive.
- * @access public
- */
- function __construct($parser, $start = "accept", $case = false) {
- $this->_case = $case;
- /** @var Doku_LexerParallelRegex[] _regexes */
- $this->_regexes = array();
- $this->_parser = $parser;
- $this->_mode = new Doku_LexerStateStack($start);
- $this->_mode_handlers = array();
- }
-
- /**
- * Adds a token search pattern for a particular
- * parsing mode. The pattern does not change the
- * current mode.
- * @param string $pattern Perl style regex, but ( and )
- * lose the usual meaning.
- * @param string $mode Should only apply this
- * pattern when dealing with
- * this type of input.
- * @access public
- */
- function addPattern($pattern, $mode = "accept") {
- if (! isset($this->_regexes[$mode])) {
- $this->_regexes[$mode] = new Doku_LexerParallelRegex($this->_case);
- }
- $this->_regexes[$mode]->addPattern($pattern);
- }
-
- /**
- * Adds a pattern that will enter a new parsing
- * mode. Useful for entering parenthesis, strings,
- * tags, etc.
- * @param string $pattern Perl style regex, but ( and )
- * lose the usual meaning.
- * @param string $mode Should only apply this
- * pattern when dealing with
- * this type of input.
- * @param string $new_mode Change parsing to this new
- * nested mode.
- * @access public
- */
- function addEntryPattern($pattern, $mode, $new_mode) {
- if (! isset($this->_regexes[$mode])) {
- $this->_regexes[$mode] = new Doku_LexerParallelRegex($this->_case);
- }
- $this->_regexes[$mode]->addPattern($pattern, $new_mode);
- }
-
- /**
- * Adds a pattern that will exit the current mode
- * and re-enter the previous one.
- * @param string $pattern Perl style regex, but ( and )
- * lose the usual meaning.
- * @param string $mode Mode to leave.
- * @access public
- */
- function addExitPattern($pattern, $mode) {
- if (! isset($this->_regexes[$mode])) {
- $this->_regexes[$mode] = new Doku_LexerParallelRegex($this->_case);
- }
- $this->_regexes[$mode]->addPattern($pattern, "__exit");
- }
-
- /**
- * Adds a pattern that has a special mode. Acts as an entry
- * and exit pattern in one go, effectively calling a special
- * parser handler for this token only.
- * @param string $pattern Perl style regex, but ( and )
- * lose the usual meaning.
- * @param string $mode Should only apply this
- * pattern when dealing with
- * this type of input.
- * @param string $special Use this mode for this one token.
- * @access public
- */
- function addSpecialPattern($pattern, $mode, $special) {
- if (! isset($this->_regexes[$mode])) {
- $this->_regexes[$mode] = new Doku_LexerParallelRegex($this->_case);
- }
- $this->_regexes[$mode]->addPattern($pattern, "_$special");
- }
-
- /**
- * Adds a mapping from a mode to another handler.
- * @param string $mode Mode to be remapped.
- * @param string $handler New target handler.
- * @access public
- */
- function mapHandler($mode, $handler) {
- $this->_mode_handlers[$mode] = $handler;
- }
-
- /**
- * Splits the page text into tokens. Will fail
- * if the handlers report an error or if no
- * content is consumed. If successful then each
- * unparsed and parsed token invokes a call to the
- * held listener.
- * @param string $raw Raw HTML text.
- * @return boolean True on success, else false.
- * @access public
- */
- function parse($raw) {
- if (! isset($this->_parser)) {
- return false;
- }
- $initialLength = strlen($raw);
- $length = $initialLength;
- $pos = 0;
- while (is_array($parsed = $this->_reduce($raw))) {
- list($unmatched, $matched, $mode) = $parsed;
- $currentLength = strlen($raw);
- $matchPos = $initialLength - $currentLength - strlen($matched);
- if (! $this->_dispatchTokens($unmatched, $matched, $mode, $pos, $matchPos)) {
- return false;
- }
- if ($currentLength == $length) {
- return false;
- }
- $length = $currentLength;
- $pos = $initialLength - $currentLength;
- }
- if (!$parsed) {
- return false;
- }
- return $this->_invokeParser($raw, DOKU_LEXER_UNMATCHED, $pos);
- }
-
- /**
- * Sends the matched token and any leading unmatched
- * text to the parser changing the lexer to a new
- * mode if one is listed.
- * @param string $unmatched Unmatched leading portion.
- * @param string $matched Actual token match.
- * @param bool|string $mode Mode after match. A boolean
- * false mode causes no change.
- * @param int $initialPos
- * @param int $matchPos
- * Current byte index location in raw doc
- * thats being parsed
- * @return boolean False if there was any error
- * from the parser.
- * @access private
- */
- function _dispatchTokens($unmatched, $matched, $mode = false, $initialPos, $matchPos) {
- if (! $this->_invokeParser($unmatched, DOKU_LEXER_UNMATCHED, $initialPos) ){
- return false;
- }
- if ($this->_isModeEnd($mode)) {
- if (! $this->_invokeParser($matched, DOKU_LEXER_EXIT, $matchPos)) {
- return false;
- }
- return $this->_mode->leave();
- }
- if ($this->_isSpecialMode($mode)) {
- $this->_mode->enter($this->_decodeSpecial($mode));
- if (! $this->_invokeParser($matched, DOKU_LEXER_SPECIAL, $matchPos)) {
- return false;
- }
- return $this->_mode->leave();
- }
- if (is_string($mode)) {
- $this->_mode->enter($mode);
- return $this->_invokeParser($matched, DOKU_LEXER_ENTER, $matchPos);
- }
- return $this->_invokeParser($matched, DOKU_LEXER_MATCHED, $matchPos);
- }
-
- /**
- * Tests to see if the new mode is actually to leave
- * the current mode and pop an item from the matching
- * mode stack.
- * @param string $mode Mode to test.
- * @return boolean True if this is the exit mode.
- * @access private
- */
- function _isModeEnd($mode) {
- return ($mode === "__exit");
- }
-
- /**
- * Test to see if the mode is one where this mode
- * is entered for this token only and automatically
- * leaves immediately afterwoods.
- * @param string $mode Mode to test.
- * @return boolean True if this is the exit mode.
- * @access private
- */
- function _isSpecialMode($mode) {
- return (strncmp($mode, "_", 1) == 0);
- }
-
- /**
- * Strips the magic underscore marking single token
- * modes.
- * @param string $mode Mode to decode.
- * @return string Underlying mode name.
- * @access private
- */
- function _decodeSpecial($mode) {
- return substr($mode, 1);
- }
-
- /**
- * Calls the parser method named after the current
- * mode. Empty content will be ignored. The lexer
- * has a parser handler for each mode in the lexer.
- * @param string $content Text parsed.
- * @param boolean $is_match Token is recognised rather
- * than unparsed data.
- * @param int $pos Current byte index location in raw doc
- * thats being parsed
- * @return bool
- * @access private
- */
- function _invokeParser($content, $is_match, $pos) {
- if (($content === "") || ($content === false)) {
- return true;
- }
- $handler = $this->_mode->getCurrent();
- if (isset($this->_mode_handlers[$handler])) {
- $handler = $this->_mode_handlers[$handler];
- }
-
- // modes starting with plugin_ are all handled by the same
- // handler but with an additional parameter
- if(substr($handler,0,7)=='plugin_'){
- list($handler,$plugin) = explode('_',$handler,2);
- return $this->_parser->$handler($content, $is_match, $pos, $plugin);
- }
-
- return $this->_parser->$handler($content, $is_match, $pos);
- }
-
- /**
- * Tries to match a chunk of text and if successful
- * removes the recognised chunk and any leading
- * unparsed data. Empty strings will not be matched.
- * @param string $raw The subject to parse. This is the
- * content that will be eaten.
- * @return array Three item list of unparsed
- * content followed by the
- * recognised token and finally the
- * action the parser is to take.
- * True if no match, false if there
- * is a parsing error.
- * @access private
- */
- function _reduce(&$raw) {
- if (! isset($this->_regexes[$this->_mode->getCurrent()])) {
- return false;
- }
- if ($raw === "") {
- return true;
- }
- if ($action = $this->_regexes[$this->_mode->getCurrent()]->split($raw, $split)) {
- list($unparsed, $match, $raw) = $split;
- return array($unparsed, $match, $action);
- }
- return true;
- }
-}
-
-/**
- * Escapes regex characters other than (, ) and /
- *
- * @TODO
- *
- * @param string $str
- *
- * @return mixed
- */
-function Doku_Lexer_Escape($str) {
- //$str = addslashes($str);
- $chars = array(
- '/\\\\/',
- '/\./',
- '/\+/',
- '/\*/',
- '/\?/',
- '/\[/',
- '/\^/',
- '/\]/',
- '/\$/',
- '/\{/',
- '/\}/',
- '/\=/',
- '/\!/',
- '/\</',
- '/\>/',
- '/\|/',
- '/\:/'
- );
-
- $escaped = array(
- '\\\\\\\\',
- '\.',
- '\+',
- '\*',
- '\?',
- '\[',
- '\^',
- '\]',
- '\$',
- '\{',
- '\}',
- '\=',
- '\!',
- '\<',
- '\>',
- '\|',
- '\:'
- );
- return preg_replace($chars, $escaped, $str);
-}
-
-//Setup VIM: ex: et ts=4 sw=4 :
diff --git a/inc/parser/metadata.php b/inc/parser/metadata.php
index 9b1b5c98b..849fffe8d 100644
--- a/inc/parser/metadata.php
+++ b/inc/parser/metadata.php
@@ -1,22 +1,5 @@
<?php
/**
- * Renderer for metadata
- *
- * @author Esther Brunner <wikidesign@gmail.com>
- */
-if(!defined('DOKU_INC')) die('meh.');
-
-if(!defined('DOKU_LF')) {
- // Some whitespace to help View > Source
- define ('DOKU_LF', "\n");
-}
-
-if(!defined('DOKU_TAB')) {
- // Some whitespace to help View > Source
- define ('DOKU_TAB', "\t");
-}
-
-/**
* The MetaData Renderer
*
* Metadata is additional information about a DokuWiki page that gets extracted mainly from the page's content
@@ -24,8 +7,11 @@ if(!defined('DOKU_TAB')) {
* $persistent.
*
* Some simplified rendering to $doc is done to gather the page's (text-only) abstract.
+ *
+ * @author Esther Brunner <wikidesign@gmail.com>
*/
-class Doku_Renderer_metadata extends Doku_Renderer {
+class Doku_Renderer_metadata extends Doku_Renderer
+{
/** the approximate byte lenght to capture for the abstract */
const ABSTRACT_LEN = 250;
@@ -47,6 +33,9 @@ class Doku_Renderer_metadata extends Doku_Renderer {
/** @var string keeps the first image reference */
protected $firstimage = '';
+ /** @var bool whether or not data is being captured for the abstract, public to be accessible by plugins */
+ public $capturing = true;
+
/** @var bool determines if enough data for the abstract was collected, yet */
public $capture = true;
@@ -58,7 +47,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* @return string always 'metadata'
*/
- function getFormat() {
+ public function getFormat()
+ {
return 'metadata';
}
@@ -67,19 +57,20 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* Sets up some of the persistent info about the page if it doesn't exist, yet.
*/
- function document_start() {
+ public function document_start()
+ {
global $ID;
$this->headers = array();
// external pages are missing create date
- if(!$this->persistent['date']['created']) {
+ if (!isset($this->persistent['date']['created']) || !$this->persistent['date']['created']) {
$this->persistent['date']['created'] = filectime(wikiFN($ID));
}
- if(!isset($this->persistent['user'])) {
+ if (!isset($this->persistent['user'])) {
$this->persistent['user'] = '';
}
- if(!isset($this->persistent['creator'])) {
+ if (!isset($this->persistent['creator'])) {
$this->persistent['creator'] = '';
}
// reset metadata to persistent values
@@ -91,27 +82,27 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* Stores collected data in the metadata
*/
- function document_end() {
+ public function document_end()
+ {
global $ID;
// store internal info in metadata (notoc,nocache)
$this->meta['internal'] = $this->info;
- if(!isset($this->meta['description']['abstract'])) {
+ if (!isset($this->meta['description']['abstract'])) {
// cut off too long abstracts
$this->doc = trim($this->doc);
- if(strlen($this->doc) > self::ABSTRACT_MAX) {
- $this->doc = utf8_substr($this->doc, 0, self::ABSTRACT_MAX).'…';
+ if (strlen($this->doc) > self::ABSTRACT_MAX) {
+ $this->doc = \dokuwiki\Utf8\PhpString::substr($this->doc, 0, self::ABSTRACT_MAX).'…';
}
$this->meta['description']['abstract'] = $this->doc;
}
$this->meta['relation']['firstimage'] = $this->firstimage;
- if(!isset($this->meta['date']['modified'])) {
+ if (!isset($this->meta['date']['modified'])) {
$this->meta['date']['modified'] = filemtime(wikiFN($ID));
}
-
}
/**
@@ -122,13 +113,18 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* @param $text
*/
- function cdata($text) {
- if(!$this->capture) return;
+ public function cdata($text)
+ {
+ if (!$this->capture || !$this->capturing) {
+ return;
+ }
$this->doc .= $text;
$this->captured += strlen($text);
- if($this->captured > self::ABSTRACT_LEN) $this->capture = false;
+ if ($this->captured > self::ABSTRACT_LEN) {
+ $this->capture = false;
+ }
}
/**
@@ -138,11 +134,12 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $text the text to display
* @param int $level the nesting level
*/
- function toc_additem($id, $text, $level) {
+ public function toc_additem($id, $text, $level)
+ {
global $conf;
//only add items within configured levels
- if($level >= $conf['toptoclevel'] && $level <= $conf['maxtoclevel']) {
+ if ($level >= $conf['toptoclevel'] && $level <= $conf['maxtoclevel']) {
// the TOC is one of our standard ul list arrays ;-)
$this->meta['description']['tableofcontents'][] = array(
'hid' => $id,
@@ -151,7 +148,6 @@ class Doku_Renderer_metadata extends Doku_Renderer {
'level' => $level - $conf['toptoclevel'] + 1
);
}
-
}
/**
@@ -161,8 +157,11 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param int $level header level
* @param int $pos byte position in the original source
*/
- function header($text, $level, $pos) {
- if(!isset($this->meta['title'])) $this->meta['title'] = $text;
+ public function header($text, $level, $pos)
+ {
+ if (!isset($this->meta['title'])) {
+ $this->meta['title'] = $text;
+ }
// add the header to the TOC
$hid = $this->_headerToLink($text, true);
@@ -175,28 +174,32 @@ class Doku_Renderer_metadata extends Doku_Renderer {
/**
* Open a paragraph
*/
- function p_open() {
+ public function p_open()
+ {
$this->cdata(DOKU_LF);
}
/**
* Close a paragraph
*/
- function p_close() {
+ public function p_close()
+ {
$this->cdata(DOKU_LF);
}
/**
* Create a line break
*/
- function linebreak() {
+ public function linebreak()
+ {
$this->cdata(DOKU_LF);
}
/**
* Create a horizontal line
*/
- function hr() {
+ public function hr()
+ {
$this->cdata(DOKU_LF.'----------'.DOKU_LF);
}
@@ -209,25 +212,33 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function footnote_open() {
- if($this->capture) {
- // move current content to store and record footnote
+ public function footnote_open()
+ {
+ if ($this->capture) {
+ // move current content to store
+ // this is required to ensure safe behaviour of plugins accessed within footnotes
$this->store = $this->doc;
$this->doc = '';
+
+ // disable capturing
+ $this->capturing = false;
}
}
/**
* Callback for footnote end syntax
*
- * All rendered content is moved to the $footnotes array and the old
- * content is restored from $store again
+ * All content rendered whilst within footnote syntax mode is discarded,
+ * the previously rendered content is restored and capturing is re-enabled.
*
* @author Andreas Gohr
*/
- function footnote_close() {
- if($this->capture) {
- // restore old content
+ public function footnote_close()
+ {
+ if ($this->capture) {
+ // re-enable capturing
+ $this->capturing = true;
+ // restore previously rendered content
$this->doc = $this->store;
$this->store = '';
}
@@ -236,14 +247,16 @@ class Doku_Renderer_metadata extends Doku_Renderer {
/**
* Open an unordered list
*/
- function listu_open() {
+ public function listu_open()
+ {
$this->cdata(DOKU_LF);
}
/**
* Open an ordered list
*/
- function listo_open() {
+ public function listo_open()
+ {
$this->cdata(DOKU_LF);
}
@@ -253,14 +266,16 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param int $level the nesting level
* @param bool $node true when a node; false when a leaf
*/
- function listitem_open($level,$node=false) {
+ public function listitem_open($level, $node=false)
+ {
$this->cdata(str_repeat(DOKU_TAB, $level).'* ');
}
/**
* Close a list item
*/
- function listitem_close() {
+ public function listitem_close()
+ {
$this->cdata(DOKU_LF);
}
@@ -269,21 +284,24 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* @param string $text
*/
- function preformatted($text) {
+ public function preformatted($text)
+ {
$this->cdata($text);
}
/**
* Start a block quote
*/
- function quote_open() {
+ public function quote_open()
+ {
$this->cdata(DOKU_LF.DOKU_TAB.'"');
}
/**
* Stop a block quote
*/
- function quote_close() {
+ public function quote_close()
+ {
$this->cdata('"'.DOKU_LF);
}
@@ -294,7 +312,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $lang programming language to use for syntax highlighting
* @param string $file file path label
*/
- function file($text, $lang = null, $file = null) {
+ public function file($text, $lang = null, $file = null)
+ {
$this->cdata(DOKU_LF.$text.DOKU_LF);
}
@@ -305,7 +324,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $language programming language to use for syntax highlighting
* @param string $file file path label
*/
- function code($text, $language = null, $file = null) {
+ public function code($text, $language = null, $file = null)
+ {
$this->cdata(DOKU_LF.$text.DOKU_LF);
}
@@ -316,7 +336,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* @param string $acronym
*/
- function acronym($acronym) {
+ public function acronym($acronym)
+ {
$this->cdata($acronym);
}
@@ -327,7 +348,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* @param string $smiley
*/
- function smiley($smiley) {
+ public function smiley($smiley)
+ {
$this->cdata($smiley);
}
@@ -340,7 +362,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* @param string $entity
*/
- function entity($entity) {
+ public function entity($entity)
+ {
$this->cdata($entity);
}
@@ -352,14 +375,16 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string|int $x first value
* @param string|int $y second value
*/
- function multiplyentity($x, $y) {
+ public function multiplyentity($x, $y)
+ {
$this->cdata($x.'×'.$y);
}
/**
* Render an opening single quote char (language specific)
*/
- function singlequoteopening() {
+ public function singlequoteopening()
+ {
global $lang;
$this->cdata($lang['singlequoteopening']);
}
@@ -367,7 +392,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
/**
* Render a closing single quote char (language specific)
*/
- function singlequoteclosing() {
+ public function singlequoteclosing()
+ {
global $lang;
$this->cdata($lang['singlequoteclosing']);
}
@@ -375,7 +401,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
/**
* Render an apostrophe char (language specific)
*/
- function apostrophe() {
+ public function apostrophe()
+ {
global $lang;
$this->cdata($lang['apostrophe']);
}
@@ -383,7 +410,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
/**
* Render an opening double quote char (language specific)
*/
- function doublequoteopening() {
+ public function doublequoteopening()
+ {
global $lang;
$this->cdata($lang['doublequoteopening']);
}
@@ -391,7 +419,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
/**
* Render an closinging double quote char (language specific)
*/
- function doublequoteclosing() {
+ public function doublequoteclosing()
+ {
global $lang;
$this->cdata($lang['doublequoteclosing']);
}
@@ -402,7 +431,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $link The link name
* @see http://en.wikipedia.org/wiki/CamelCase
*/
- function camelcaselink($link) {
+ public function camelcaselink($link)
+ {
$this->internallink($link, $link);
}
@@ -412,10 +442,13 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $hash hash link identifier
* @param string $name name for the link
*/
- function locallink($hash, $name = null) {
- if(is_array($name)) {
+ public function locallink($hash, $name = null)
+ {
+ if (is_array($name)) {
$this->_firstimage($name['src']);
- if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+ if ($name['type'] == 'internalmedia') {
+ $this->_recordMediaUsage($name['src']);
+ }
}
}
@@ -425,16 +458,19 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $id page ID to link to. eg. 'wiki:syntax'
* @param string|array|null $name name for the link, array for media file
*/
- function internallink($id, $name = null) {
+ public function internallink($id, $name = null)
+ {
global $ID;
- if(is_array($name)) {
+ if (is_array($name)) {
$this->_firstimage($name['src']);
- if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+ if ($name['type'] == 'internalmedia') {
+ $this->_recordMediaUsage($name['src']);
+ }
}
$parts = explode('?', $id, 2);
- if(count($parts) === 2) {
+ if (count($parts) === 2) {
$id = $parts[0];
}
@@ -450,7 +486,7 @@ class Doku_Renderer_metadata extends Doku_Renderer {
// p_set_metadata($id, $data);
// add link title to summary
- if($this->capture) {
+ if ($this->capture) {
$name = $this->_getLinkTitle($name, $default, $id);
$this->doc .= $name;
}
@@ -462,13 +498,16 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $url full URL with scheme
* @param string|array|null $name name for the link, array for media file
*/
- function externallink($url, $name = null) {
- if(is_array($name)) {
+ public function externallink($url, $name = null)
+ {
+ if (is_array($name)) {
$this->_firstimage($name['src']);
- if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+ if ($name['type'] == 'internalmedia') {
+ $this->_recordMediaUsage($name['src']);
+ }
}
- if($this->capture) {
+ if ($this->capture) {
$this->doc .= $this->_getLinkTitle($name, '<'.$url.'>');
}
}
@@ -483,13 +522,16 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $wikiName indentifier (shortcut) for the remote wiki
* @param string $wikiUri the fragment parsed from the original link
*/
- function interwikilink($match, $name = null, $wikiName, $wikiUri) {
- if(is_array($name)) {
+ public function interwikilink($match, $name, $wikiName, $wikiUri)
+ {
+ if (is_array($name)) {
$this->_firstimage($name['src']);
- if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+ if ($name['type'] == 'internalmedia') {
+ $this->_recordMediaUsage($name['src']);
+ }
}
- if($this->capture) {
+ if ($this->capture) {
list($wikiUri) = explode('#', $wikiUri, 2);
$name = $this->_getLinkTitle($name, $wikiUri);
$this->doc .= $name;
@@ -502,15 +544,21 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $url the link
* @param string|array $name name for the link, array for media file
*/
- function windowssharelink($url, $name = null) {
- if(is_array($name)) {
+ public function windowssharelink($url, $name = null)
+ {
+ if (is_array($name)) {
$this->_firstimage($name['src']);
- if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+ if ($name['type'] == 'internalmedia') {
+ $this->_recordMediaUsage($name['src']);
+ }
}
- if($this->capture) {
- if($name) $this->doc .= $name;
- else $this->doc .= '<'.$url.'>';
+ if ($this->capture) {
+ if ($name) {
+ $this->doc .= $name;
+ } else {
+ $this->doc .= '<'.$url.'>';
+ }
}
}
@@ -522,15 +570,21 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $address Email-Address
* @param string|array $name name for the link, array for media file
*/
- function emaillink($address, $name = null) {
- if(is_array($name)) {
+ public function emaillink($address, $name = null)
+ {
+ if (is_array($name)) {
$this->_firstimage($name['src']);
- if($name['type'] == 'internalmedia') $this->_recordMediaUsage($name['src']);
+ if ($name['type'] == 'internalmedia') {
+ $this->_recordMediaUsage($name['src']);
+ }
}
- if($this->capture) {
- if($name) $this->doc .= $name;
- else $this->doc .= '<'.$address.'>';
+ if ($this->capture) {
+ if ($name) {
+ $this->doc .= $name;
+ } else {
+ $this->doc .= '<'.$address.'>';
+ }
}
}
@@ -545,9 +599,12 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $cache cache|recache|nocache
* @param string $linking linkonly|detail|nolink
*/
- function internalmedia($src, $title = null, $align = null, $width = null,
- $height = null, $cache = null, $linking = null) {
- if($this->capture && $title) $this->doc .= '['.$title.']';
+ public function internalmedia($src, $title = null, $align = null, $width = null,
+ $height = null, $cache = null, $linking = null)
+ {
+ if ($this->capture && $title) {
+ $this->doc .= '['.$title.']';
+ }
$this->_firstimage($src);
$this->_recordMediaUsage($src);
}
@@ -563,9 +620,12 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $cache cache|recache|nocache
* @param string $linking linkonly|detail|nolink
*/
- function externalmedia($src, $title = null, $align = null, $width = null,
- $height = null, $cache = null, $linking = null) {
- if($this->capture && $title) $this->doc .= '['.$title.']';
+ public function externalmedia($src, $title = null, $align = null, $width = null,
+ $height = null, $cache = null, $linking = null)
+ {
+ if ($this->capture && $title) {
+ $this->doc .= '['.$title.']';
+ }
$this->_firstimage($src);
}
@@ -575,7 +635,8 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param string $url URL of the feed
* @param array $params Finetuning of the output
*/
- function rss($url, $params) {
+ public function rss($url, $params)
+ {
$this->meta['relation']['haspart'][$url] = true;
$this->meta['date']['valid']['age'] =
@@ -596,12 +657,15 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* @return mixed|string
*/
- function _simpleTitle($name) {
+ public function _simpleTitle($name)
+ {
global $conf;
- if(is_array($name)) return '';
+ if (is_array($name)) {
+ return '';
+ }
- if($conf['useslash']) {
+ if ($conf['useslash']) {
$nssep = '[:;/]';
} else {
$nssep = '[:;]';
@@ -613,23 +677,6 @@ class Doku_Renderer_metadata extends Doku_Renderer {
}
/**
- * Creates a linkid from a headline
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @param string $title The headline title
- * @param boolean $create Create a new unique ID?
- * @return string
- */
- function _headerToLink($title, $create = false) {
- if($create) {
- return sectionID($title, $this->headers);
- } else {
- $check = false;
- return sectionID($title, $check);
- }
- }
-
- /**
* Construct a title and handle images in titles
*
* @author Harry Fuecks <hfuecks@gmail.com>
@@ -638,17 +685,20 @@ class Doku_Renderer_metadata extends Doku_Renderer {
* @param null|string $id linked page id (used to extract title from first heading)
* @return string title text
*/
- function _getLinkTitle($title, $default, $id = null) {
- if(is_array($title)) {
- if($title['title']) {
+ public function _getLinkTitle($title, $default, $id = null)
+ {
+ if (is_array($title)) {
+ if ($title['title']) {
return '['.$title['title'].']';
} else {
return $default;
}
- } else if(is_null($title) || trim($title) == '') {
- if(useHeading('content') && $id) {
+ } elseif (is_null($title) || trim($title) == '') {
+ if (useHeading('content') && $id) {
$heading = p_get_first_heading($id, METADATA_DONT_RENDER);
- if($heading) return $heading;
+ if ($heading) {
+ return $heading;
+ }
}
return $default;
} else {
@@ -661,15 +711,19 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* @param string $src image URL or ID
*/
- function _firstimage($src) {
- if($this->firstimage) return;
+ protected function _firstimage($src)
+ {
global $ID;
+ if ($this->firstimage) {
+ return;
+ }
+
list($src) = explode('#', $src, 2);
- if(!media_isexternal($src)) {
+ if (!media_isexternal($src)) {
resolve_mediaid(getNS($ID), $src, $exists);
}
- if(preg_match('/.(jpe?g|gif|png)$/i', $src)) {
+ if (preg_match('/.(jpe?g|gif|png)$/i', $src)) {
$this->firstimage = $src;
}
}
@@ -679,11 +733,14 @@ class Doku_Renderer_metadata extends Doku_Renderer {
*
* @param string $src media ID
*/
- function _recordMediaUsage($src) {
+ protected function _recordMediaUsage($src)
+ {
global $ID;
list ($src) = explode('#', $src, 2);
- if(media_isexternal($src)) return;
+ if (media_isexternal($src)) {
+ return;
+ }
resolve_mediaid(getNS($ID), $src, $exists);
$this->meta['relation']['media'][$src] = $exists;
}
diff --git a/inc/parser/parser.php b/inc/parser/parser.php
index 8cff2b8be..aee82f01d 100644
--- a/inc/parser/parser.php
+++ b/inc/parser/parser.php
@@ -1,8 +1,6 @@
<?php
-if(!defined('DOKU_INC')) die('meh.');
-require_once DOKU_INC . 'inc/parser/lexer.php';
-require_once DOKU_INC . 'inc/parser/handler.php';
+use dokuwiki\Debug\PropertyDeprecationHelper;
/**
* Define various types of modes used by the parser - they are used to
@@ -13,1022 +11,89 @@ $PARSER_MODES = array(
// containers are complex modes that can contain many other modes
// hr breaks the principle but they shouldn't be used in tables / lists
// so they are put here
- 'container' => array('listblock','table','quote','hr'),
+ 'container' => array('listblock', 'table', 'quote', 'hr'),
// some mode are allowed inside the base mode only
- 'baseonly' => array('header'),
+ 'baseonly' => array('header'),
// modes for styling text -- footnote behaves similar to styling
- 'formatting' => array('strong', 'emphasis', 'underline', 'monospace',
- 'subscript', 'superscript', 'deleted', 'footnote'),
+ 'formatting' => array(
+ 'strong', 'emphasis', 'underline', 'monospace',
+ 'subscript', 'superscript', 'deleted', 'footnote'
+ ),
// modes where the token is simply replaced - they can not contain any
// other modes
- 'substition' => array('acronym','smiley','wordblock','entity',
- 'camelcaselink', 'internallink','media',
- 'externallink','linebreak','emaillink',
- 'windowssharelink','filelink','notoc',
- 'nocache','multiplyentity','quotes','rss'),
+ 'substition' => array(
+ 'acronym', 'smiley', 'wordblock', 'entity',
+ 'camelcaselink', 'internallink', 'media',
+ 'externallink', 'linebreak', 'emaillink',
+ 'windowssharelink', 'filelink', 'notoc',
+ 'nocache', 'multiplyentity', 'quotes', 'rss'
+ ),
// modes which have a start and end token but inside which
// no other modes should be applied
- 'protected' => array('preformatted','code','file','php','html','htmlblock','phpblock'),
+ 'protected' => array('preformatted', 'code', 'file', 'php', 'html', 'htmlblock', 'phpblock'),
// inside this mode no wiki markup should be applied but lineendings
// and whitespace isn't preserved
- 'disabled' => array('unformatted'),
+ 'disabled' => array('unformatted'),
// used to mark paragraph boundaries
- 'paragraphs' => array('eol')
+ 'paragraphs' => array('eol')
);
-//-------------------------------------------------------------------
-
/**
- * Sets up the Lexer with modes and points it to the Handler
- * For an intro to the Lexer see: wiki:parser
- */
-class Doku_Parser {
-
- var $Handler;
-
- /**
- * @var Doku_Lexer $Lexer
- */
- var $Lexer;
-
- var $modes = array();
-
- var $connected = false;
-
- /**
- * @param Doku_Parser_Mode_base $BaseMode
- */
- function addBaseMode($BaseMode) {
- $this->modes['base'] = $BaseMode;
- if ( !$this->Lexer ) {
- $this->Lexer = new Doku_Lexer($this->Handler,'base', true);
- }
- $this->modes['base']->Lexer = $this->Lexer;
- }
-
- /**
- * PHP preserves order of associative elements
- * Mode sequence is important
- *
- * @param string $name
- * @param Doku_Parser_Mode_Interface $Mode
- */
- function addMode($name, Doku_Parser_Mode_Interface $Mode) {
- if ( !isset($this->modes['base']) ) {
- $this->addBaseMode(new Doku_Parser_Mode_base());
- }
- $Mode->Lexer = $this->Lexer;
- $this->modes[$name] = $Mode;
- }
-
- function connectModes() {
-
- if ( $this->connected ) {
- return;
- }
-
- foreach ( array_keys($this->modes) as $mode ) {
-
- // Base isn't connected to anything
- if ( $mode == 'base' ) {
- continue;
- }
- $this->modes[$mode]->preConnect();
-
- foreach ( array_keys($this->modes) as $cm ) {
-
- if ( $this->modes[$cm]->accepts($mode) ) {
- $this->modes[$mode]->connectTo($cm);
- }
-
- }
-
- $this->modes[$mode]->postConnect();
- }
-
- $this->connected = true;
- }
-
- function parse($doc) {
- if ( $this->Lexer ) {
- $this->connectModes();
- // Normalize CRs and pad doc
- $doc = "\n".str_replace("\r\n","\n",$doc)."\n";
- $this->Lexer->parse($doc);
- $this->Handler->_finalize();
- return $this->Handler->calls;
- } else {
- return false;
- }
- }
-
-}
-
-//-------------------------------------------------------------------
-
-/**
- * Class Doku_Parser_Mode_Interface
- *
- * Defines a mode (syntax component) in the Parser
- */
-interface Doku_Parser_Mode_Interface {
- /**
- * returns a number used to determine in which order modes are added
- */
- public function getSort();
-
- /**
- * Called before any calls to connectTo
- * @return void
- */
- function preConnect();
-
- /**
- * Connects the mode
- *
- * @param string $mode
- * @return void
- */
- function connectTo($mode);
-
- /**
- * Called after all calls to connectTo
- * @return void
- */
- function postConnect();
-
- /**
- * Check if given mode is accepted inside this mode
- *
- * @param string $mode
- * @return bool
- */
- function accepts($mode);
-}
-
-/**
- * This class and all the subclasses below are used to reduce the effort required to register
- * modes with the Lexer.
+ * Class Doku_Parser
*
- * @author Harry Fuecks <hfuecks@gmail.com>
+ * @deprecated 2018-05-04
*/
-class Doku_Parser_Mode implements Doku_Parser_Mode_Interface {
- /**
- * @var Doku_Lexer $Lexer
- */
- var $Lexer;
- var $allowedModes = array();
-
- function getSort() {
- trigger_error('getSort() not implemented in '.get_class($this), E_USER_WARNING);
- }
-
- function preConnect() {}
- function connectTo($mode) {}
- function postConnect() {}
- function accepts($mode) {
- return in_array($mode, (array) $this->allowedModes );
- }
-}
-
-/**
- * Basically the same as Doku_Parser_Mode but extends from DokuWiki_Plugin
- *
- * Adds additional functions to syntax plugins
- */
-class Doku_Parser_Mode_Plugin extends DokuWiki_Plugin implements Doku_Parser_Mode_Interface {
- /**
- * @var Doku_Lexer $Lexer
- */
- var $Lexer;
- var $allowedModes = array();
-
- /**
- * Sort for applying this mode
- *
- * @return int
- */
- function getSort() {
- trigger_error('getSort() not implemented in '.get_class($this), E_USER_WARNING);
- }
-
- function preConnect() {}
- function connectTo($mode) {}
- function postConnect() {}
- function accepts($mode) {
- return in_array($mode, (array) $this->allowedModes );
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_base extends Doku_Parser_Mode {
-
- function __construct() {
- global $PARSER_MODES;
-
- $this->allowedModes = array_merge (
- $PARSER_MODES['container'],
- $PARSER_MODES['baseonly'],
- $PARSER_MODES['paragraphs'],
- $PARSER_MODES['formatting'],
- $PARSER_MODES['substition'],
- $PARSER_MODES['protected'],
- $PARSER_MODES['disabled']
- );
- }
-
- function getSort() {
- return 0;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_footnote extends Doku_Parser_Mode {
-
- function __construct() {
- global $PARSER_MODES;
-
- $this->allowedModes = array_merge (
- $PARSER_MODES['container'],
- $PARSER_MODES['formatting'],
- $PARSER_MODES['substition'],
- $PARSER_MODES['protected'],
- $PARSER_MODES['disabled']
- );
-
- unset($this->allowedModes[array_search('footnote', $this->allowedModes)]);
- }
-
- function connectTo($mode) {
- $this->Lexer->addEntryPattern(
- '\x28\x28(?=.*\x29\x29)',$mode,'footnote'
- );
- }
-
- function postConnect() {
- $this->Lexer->addExitPattern(
- '\x29\x29','footnote'
- );
- }
-
- function getSort() {
- return 150;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_header extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- //we're not picky about the closing ones, two are enough
- $this->Lexer->addSpecialPattern(
- '[ \t]*={2,}[^\n]+={2,}[ \t]*(?=\n)',
- $mode,
- 'header'
- );
- }
-
- function getSort() {
- return 50;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_notoc extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addSpecialPattern('~~NOTOC~~',$mode,'notoc');
- }
-
- function getSort() {
- return 30;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_nocache extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addSpecialPattern('~~NOCACHE~~',$mode,'nocache');
+class Doku_Parser extends \dokuwiki\Parsing\Parser {
+ use PropertyDeprecationHelper {
+ __set as protected deprecationHelperMagicSet;
+ __get as protected deprecationHelperMagicGet;
}
- function getSort() {
- return 40;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_linebreak extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addSpecialPattern('\x5C{2}(?:[ \t]|(?=\n))',$mode,'linebreak');
- }
-
- function getSort() {
- return 140;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_eol extends Doku_Parser_Mode {
+ /** @inheritdoc */
+ public function __construct(Doku_Handler $handler = null) {
+ dbg_deprecated(\dokuwiki\Parsing\Parser::class);
+ $this->deprecatePublicProperty('modes', __CLASS__);
+ $this->deprecatePublicProperty('connected', __CLASS__);
- function connectTo($mode) {
- $badModes = array('listblock','table');
- if ( in_array($mode, $badModes) ) {
- return;
+ if ($handler === null) {
+ $handler = new Doku_Handler();
}
- // see FS#1652, pattern extended to swallow preceding whitespace to avoid issues with lines that only contain whitespace
- $this->Lexer->addSpecialPattern('(?:^[ \t]*)?\n',$mode,'eol');
- }
- function getSort() {
- return 370;
+ parent::__construct($handler);
}
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_hr extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addSpecialPattern('\n[ \t]*-{4,}[ \t]*(?=\n)',$mode,'hr');
- }
-
- function getSort() {
- return 160;
- }
-}
-
-//-------------------------------------------------------------------
-/**
- * This class sets the markup for bold (=strong),
- * italic (=emphasis), underline etc.
- */
-class Doku_Parser_Mode_formatting extends Doku_Parser_Mode {
- var $type;
-
- var $formatting = array (
- 'strong' => array (
- 'entry'=>'\*\*(?=.*\*\*)',
- 'exit'=>'\*\*',
- 'sort'=>70
- ),
-
- 'emphasis'=> array (
- 'entry'=>'//(?=[^\x00]*[^:])', //hack for bugs #384 #763 #1468
- 'exit'=>'//',
- 'sort'=>80
- ),
- 'underline'=> array (
- 'entry'=>'__(?=.*__)',
- 'exit'=>'__',
- 'sort'=>90
- ),
+ public function __set($name, $value)
+ {
- 'monospace'=> array (
- 'entry'=>'\x27\x27(?=.*\x27\x27)',
- 'exit'=>'\x27\x27',
- 'sort'=>100
- ),
-
- 'subscript'=> array (
- 'entry'=>'<sub>(?=.*</sub>)',
- 'exit'=>'</sub>',
- 'sort'=>110
- ),
-
- 'superscript'=> array (
- 'entry'=>'<sup>(?=.*</sup>)',
- 'exit'=>'</sup>',
- 'sort'=>120
- ),
-
- 'deleted'=> array (
- 'entry'=>'<del>(?=.*</del>)',
- 'exit'=>'</del>',
- 'sort'=>130
- ),
- );
-
- /**
- * @param string $type
- */
- function __construct($type) {
- global $PARSER_MODES;
-
- if ( !array_key_exists($type, $this->formatting) ) {
- trigger_error('Invalid formatting type '.$type, E_USER_WARNING);
- }
-
- $this->type = $type;
-
- // formatting may contain other formatting but not it self
- $modes = $PARSER_MODES['formatting'];
- $key = array_search($type, $modes);
- if ( is_int($key) ) {
- unset($modes[$key]);
- }
-
- $this->allowedModes = array_merge (
- $modes,
- $PARSER_MODES['substition'],
- $PARSER_MODES['disabled']
- );
- }
-
- function connectTo($mode) {
-
- // Can't nest formatting in itself
- if ( $mode == $this->type ) {
+ if ($name === 'Handler') {
+ $this->handler = $value;
return;
}
- $this->Lexer->addEntryPattern(
- $this->formatting[$this->type]['entry'],
- $mode,
- $this->type
- );
- }
-
- function postConnect() {
-
- $this->Lexer->addExitPattern(
- $this->formatting[$this->type]['exit'],
- $this->type
- );
-
- }
-
- function getSort() {
- return $this->formatting[$this->type]['sort'];
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_listblock extends Doku_Parser_Mode {
-
- function __construct() {
- global $PARSER_MODES;
-
- $this->allowedModes = array_merge (
- $PARSER_MODES['formatting'],
- $PARSER_MODES['substition'],
- $PARSER_MODES['disabled'],
- $PARSER_MODES['protected'] #XXX new
- );
-
- // $this->allowedModes[] = 'footnote';
- }
-
- function connectTo($mode) {
- $this->Lexer->addEntryPattern('[ \t]*\n {2,}[\-\*]',$mode,'listblock');
- $this->Lexer->addEntryPattern('[ \t]*\n\t{1,}[\-\*]',$mode,'listblock');
-
- $this->Lexer->addPattern('\n {2,}[\-\*]','listblock');
- $this->Lexer->addPattern('\n\t{1,}[\-\*]','listblock');
-
- }
-
- function postConnect() {
- $this->Lexer->addExitPattern('\n','listblock');
- }
-
- function getSort() {
- return 10;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_table extends Doku_Parser_Mode {
-
- function __construct() {
- global $PARSER_MODES;
-
- $this->allowedModes = array_merge (
- $PARSER_MODES['formatting'],
- $PARSER_MODES['substition'],
- $PARSER_MODES['disabled'],
- $PARSER_MODES['protected']
- );
- }
-
- function connectTo($mode) {
- $this->Lexer->addEntryPattern('[\t ]*\n\^',$mode,'table');
- $this->Lexer->addEntryPattern('[\t ]*\n\|',$mode,'table');
- }
-
- function postConnect() {
- $this->Lexer->addPattern('\n\^','table');
- $this->Lexer->addPattern('\n\|','table');
- $this->Lexer->addPattern('[\t ]*:::[\t ]*(?=[\|\^])','table');
- $this->Lexer->addPattern('[\t ]+','table');
- $this->Lexer->addPattern('\^','table');
- $this->Lexer->addPattern('\|','table');
- $this->Lexer->addExitPattern('\n','table');
- }
-
- function getSort() {
- return 60;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_unformatted extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addEntryPattern('<nowiki>(?=.*</nowiki>)',$mode,'unformatted');
- $this->Lexer->addEntryPattern('%%(?=.*%%)',$mode,'unformattedalt');
- }
-
- function postConnect() {
- $this->Lexer->addExitPattern('</nowiki>','unformatted');
- $this->Lexer->addExitPattern('%%','unformattedalt');
- $this->Lexer->mapHandler('unformattedalt','unformatted');
- }
-
- function getSort() {
- return 170;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_php extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addEntryPattern('<php>(?=.*</php>)',$mode,'php');
- $this->Lexer->addEntryPattern('<PHP>(?=.*</PHP>)',$mode,'phpblock');
- }
-
- function postConnect() {
- $this->Lexer->addExitPattern('</php>','php');
- $this->Lexer->addExitPattern('</PHP>','phpblock');
- }
-
- function getSort() {
- return 180;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_html extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addEntryPattern('<html>(?=.*</html>)',$mode,'html');
- $this->Lexer->addEntryPattern('<HTML>(?=.*</HTML>)',$mode,'htmlblock');
- }
-
- function postConnect() {
- $this->Lexer->addExitPattern('</html>','html');
- $this->Lexer->addExitPattern('</HTML>','htmlblock');
- }
-
- function getSort() {
- return 190;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_preformatted extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- // Has hard coded awareness of lists...
- $this->Lexer->addEntryPattern('\n (?![\*\-])',$mode,'preformatted');
- $this->Lexer->addEntryPattern('\n\t(?![\*\-])',$mode,'preformatted');
-
- // How to effect a sub pattern with the Lexer!
- $this->Lexer->addPattern('\n ','preformatted');
- $this->Lexer->addPattern('\n\t','preformatted');
-
- }
-
- function postConnect() {
- $this->Lexer->addExitPattern('\n','preformatted');
- }
-
- function getSort() {
- return 20;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_code extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addEntryPattern('<code\b(?=.*</code>)',$mode,'code');
- }
-
- function postConnect() {
- $this->Lexer->addExitPattern('</code>','code');
- }
-
- function getSort() {
- return 200;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_file extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addEntryPattern('<file\b(?=.*</file>)',$mode,'file');
- }
-
- function postConnect() {
- $this->Lexer->addExitPattern('</file>','file');
- }
-
- function getSort() {
- return 210;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_quote extends Doku_Parser_Mode {
-
- function __construct() {
- global $PARSER_MODES;
-
- $this->allowedModes = array_merge (
- $PARSER_MODES['formatting'],
- $PARSER_MODES['substition'],
- $PARSER_MODES['disabled'],
- $PARSER_MODES['protected'] #XXX new
- );
- #$this->allowedModes[] = 'footnote';
- #$this->allowedModes[] = 'preformatted';
- #$this->allowedModes[] = 'unformatted';
- }
-
- function connectTo($mode) {
- $this->Lexer->addEntryPattern('\n>{1,}',$mode,'quote');
- }
-
- function postConnect() {
- $this->Lexer->addPattern('\n>{1,}','quote');
- $this->Lexer->addExitPattern('\n','quote');
- }
-
- function getSort() {
- return 220;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_acronym extends Doku_Parser_Mode {
- // A list
- var $acronyms = array();
- var $pattern = '';
-
- function __construct($acronyms) {
- usort($acronyms,array($this,'_compare'));
- $this->acronyms = $acronyms;
- }
-
- function preConnect() {
- if(!count($this->acronyms)) return;
-
- $bound = '[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]';
- $acronyms = array_map('Doku_Lexer_Escape',$this->acronyms);
- $this->pattern = '(?<=^|'.$bound.')(?:'.join('|',$acronyms).')(?='.$bound.')';
- }
-
- function connectTo($mode) {
- if(!count($this->acronyms)) return;
-
- if ( strlen($this->pattern) > 0 ) {
- $this->Lexer->addSpecialPattern($this->pattern,$mode,'acronym');
- }
- }
-
- function getSort() {
- return 240;
- }
-
- /**
- * sort callback to order by string length descending
- *
- * @param string $a
- * @param string $b
- *
- * @return int
- */
- function _compare($a,$b) {
- $a_len = strlen($a);
- $b_len = strlen($b);
- if ($a_len > $b_len) {
- return -1;
- } else if ($a_len < $b_len) {
- return 1;
- }
-
- return 0;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_smiley extends Doku_Parser_Mode {
- // A list
- var $smileys = array();
- var $pattern = '';
-
- function __construct($smileys) {
- $this->smileys = $smileys;
- }
-
- function preConnect() {
- if(!count($this->smileys) || $this->pattern != '') return;
-
- $sep = '';
- foreach ( $this->smileys as $smiley ) {
- $this->pattern .= $sep.'(?<=\W|^)'.Doku_Lexer_Escape($smiley).'(?=\W|$)';
- $sep = '|';
- }
- }
-
- function connectTo($mode) {
- if(!count($this->smileys)) return;
-
- if ( strlen($this->pattern) > 0 ) {
- $this->Lexer->addSpecialPattern($this->pattern,$mode,'smiley');
- }
- }
-
- function getSort() {
- return 230;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_wordblock extends Doku_Parser_Mode {
- // A list
- var $badwords = array();
- var $pattern = '';
-
- function __construct($badwords) {
- $this->badwords = $badwords;
- }
-
- function preConnect() {
-
- if ( count($this->badwords) == 0 || $this->pattern != '') {
+ if ($name === 'Lexer') {
+ $this->lexer = $value;
return;
}
- $sep = '';
- foreach ( $this->badwords as $badword ) {
- $this->pattern .= $sep.'(?<=\b)(?i)'.Doku_Lexer_Escape($badword).'(?-i)(?=\b)';
- $sep = '|';
- }
-
+ $this->deprecationHelperMagicSet($name, $value);
}
- function connectTo($mode) {
- if ( strlen($this->pattern) > 0 ) {
- $this->Lexer->addSpecialPattern($this->pattern,$mode,'wordblock');
+ public function __get($name)
+ {
+ if ($name === 'Handler') {
+ return $this->handler;
}
- }
-
- function getSort() {
- return 250;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_entity extends Doku_Parser_Mode {
- // A list
- var $entities = array();
- var $pattern = '';
- function __construct($entities) {
- $this->entities = $entities;
- }
-
- function preConnect() {
- if(!count($this->entities) || $this->pattern != '') return;
-
- $sep = '';
- foreach ( $this->entities as $entity ) {
- $this->pattern .= $sep.Doku_Lexer_Escape($entity);
- $sep = '|';
+ if ($name === 'Lexer') {
+ return $this->lexer;
}
- }
-
- function connectTo($mode) {
- if(!count($this->entities)) return;
- if ( strlen($this->pattern) > 0 ) {
- $this->Lexer->addSpecialPattern($this->pattern,$mode,'entity');
- }
- }
-
- function getSort() {
- return 260;
- }
-}
-
-//-------------------------------------------------------------------
-// Implements the 640x480 replacement
-class Doku_Parser_Mode_multiplyentity extends Doku_Parser_Mode {
-
- function connectTo($mode) {
-
- $this->Lexer->addSpecialPattern(
- '(?<=\b)(?:[1-9]|\d{2,})[xX]\d+(?=\b)',$mode,'multiplyentity'
- );
-
- }
-
- function getSort() {
- return 270;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_quotes extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- global $conf;
-
- $ws = '\s/\#~:+=&%@\-\x28\x29\]\[{}><"\''; // whitespace
- $punc = ';,\.?!';
-
- if($conf['typography'] == 2){
- $this->Lexer->addSpecialPattern(
- "(?<=^|[$ws])'(?=[^$ws$punc])",$mode,'singlequoteopening'
- );
- $this->Lexer->addSpecialPattern(
- "(?<=^|[^$ws]|[$punc])'(?=$|[$ws$punc])",$mode,'singlequoteclosing'
- );
- $this->Lexer->addSpecialPattern(
- "(?<=^|[^$ws$punc])'(?=$|[^$ws$punc])",$mode,'apostrophe'
- );
- }
-
- $this->Lexer->addSpecialPattern(
- "(?<=^|[$ws])\"(?=[^$ws$punc])",$mode,'doublequoteopening'
- );
- $this->Lexer->addSpecialPattern(
- "\"",$mode,'doublequoteclosing'
- );
-
- }
-
- function getSort() {
- return 280;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_camelcaselink extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addSpecialPattern(
- '\b[A-Z]+[a-z]+[A-Z][A-Za-z]*\b',$mode,'camelcaselink'
- );
- }
-
- function getSort() {
- return 290;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_internallink extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- // Word boundaries?
- $this->Lexer->addSpecialPattern("\[\[.*?\]\](?!\])",$mode,'internallink');
- }
-
- function getSort() {
- return 300;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_media extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- // Word boundaries?
- $this->Lexer->addSpecialPattern("\{\{(?:[^\}]|(?:\}[^\}]))+\}\}",$mode,'media');
- }
-
- function getSort() {
- return 320;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_rss extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- $this->Lexer->addSpecialPattern("\{\{rss>[^\}]+\}\}",$mode,'rss');
- }
-
- function getSort() {
- return 310;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_externallink extends Doku_Parser_Mode {
- var $schemes = array();
- var $patterns = array();
-
- function preConnect() {
- if(count($this->patterns)) return;
-
- $ltrs = '\w';
- $gunk = '/\#~:.?+=&%@!\-\[\]';
- $punc = '.:?\-;,';
- $host = $ltrs.$punc;
- $any = $ltrs.$gunk.$punc;
-
- $this->schemes = getSchemes();
- foreach ( $this->schemes as $scheme ) {
- $this->patterns[] = '\b(?i)'.$scheme.'(?-i)://['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
- }
-
- $this->patterns[] = '(?<=\s)(?i)www?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
- $this->patterns[] = '(?<=\s)(?i)ftp?(?-i)\.['.$host.']+?\.['.$host.']+?['.$any.']+?(?=['.$punc.']*[^'.$any.'])';
- }
-
- function connectTo($mode) {
-
- foreach ( $this->patterns as $pattern ) {
- $this->Lexer->addSpecialPattern($pattern,$mode,'externallink');
- }
- }
-
- function getSort() {
- return 330;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_filelink extends Doku_Parser_Mode {
-
- var $pattern;
-
- function preConnect() {
-
- $ltrs = '\w';
- $gunk = '/\#~:.?+=&%@!\-';
- $punc = '.:?\-;,';
- $host = $ltrs.$punc;
- $any = $ltrs.$gunk.$punc;
-
- $this->pattern = '\b(?i)file(?-i)://['.$any.']+?['.
- $punc.']*[^'.$any.']';
- }
-
- function connectTo($mode) {
- $this->Lexer->addSpecialPattern(
- $this->pattern,$mode,'filelink');
- }
-
- function getSort() {
- return 360;
- }
-}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_windowssharelink extends Doku_Parser_Mode {
-
- var $pattern;
-
- function preConnect() {
- $this->pattern = "\\\\\\\\\w+?(?:\\\\[\w\-$]+)+";
- }
-
- function connectTo($mode) {
- $this->Lexer->addSpecialPattern(
- $this->pattern,$mode,'windowssharelink');
- }
-
- function getSort() {
- return 350;
+ return $this->deprecationHelperMagicGet($name);
}
}
-
-//-------------------------------------------------------------------
-class Doku_Parser_Mode_emaillink extends Doku_Parser_Mode {
-
- function connectTo($mode) {
- // pattern below is defined in inc/mail.php
- $this->Lexer->addSpecialPattern('<'.PREG_PATTERN_VALID_EMAIL.'>',$mode,'emaillink');
- }
-
- function getSort() {
- return 340;
- }
-}
-
-
-//Setup VIM: ex: et ts=4 :
diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php
index 83b51d4b1..e4eff2a62 100644
--- a/inc/parser/renderer.php
+++ b/inc/parser/renderer.php
@@ -5,7 +5,9 @@
* @author Harry Fuecks <hfuecks@gmail.com>
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
+
+use dokuwiki\Extension\Plugin;
+use dokuwiki\Extension\SyntaxPlugin;
/**
* Allowed chars in $language for code highlighting
@@ -16,7 +18,7 @@ define('PREG_PATTERN_VALID_LANGUAGE', '#[^a-zA-Z0-9\-_]#');
/**
* An empty renderer, produces no output
*
- * Inherits from DokuWiki_Plugin for giving additional functions to render plugins
+ * Inherits from dokuwiki\Plugin\DokuWiki_Plugin for giving additional functions to render plugins
*
* The renderer transforms the syntax instructions created by the parser and handler into the
* desired output format. For each instruction a corresponding method defined in this class will
@@ -24,7 +26,7 @@ define('PREG_PATTERN_VALID_LANGUAGE', '#[^a-zA-Z0-9\-_]#');
* $doc field. When all instructions are processed, the $doc field contents will be cached by
* DokuWiki and sent to the user.
*/
-class Doku_Renderer extends DokuWiki_Plugin {
+abstract class Doku_Renderer extends Plugin {
/** @var array Settings, control the behavior of the renderer */
public $info = array(
'cache' => true, // may the rendered result cached?
@@ -40,6 +42,9 @@ class Doku_Renderer extends DokuWiki_Plugin {
/** @var array contains the interwiki configuration, set in p_render() */
public $interwiki = array();
+ /** @var array the list of headers used to create unique link ids */
+ protected $headers = array();
+
/**
* @var string the rendered document, this will be cached after the renderer ran through
*/
@@ -51,7 +56,11 @@ class Doku_Renderer extends DokuWiki_Plugin {
* This is called before each use of the renderer object and should be used to
* completely reset the state of the renderer to be reused for a new document
*/
- function reset() {
+ public function reset(){
+ $this->headers = array();
+ $this->doc = '';
+ $this->info['cache'] = true;
+ $this->info['toc'] = true;
}
/**
@@ -62,7 +71,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @return bool false if the plugin has to be instantiated
*/
- function isSingleton() {
+ public function isSingleton() {
return false;
}
@@ -73,15 +82,12 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @return string
*/
- function getFormat() {
- trigger_error('getFormat() not implemented in '.get_class($this), E_USER_WARNING);
- return '';
- }
+ abstract public function getFormat();
/**
* Disable caching of this renderer's output
*/
- function nocache() {
+ public function nocache() {
$this->info['cache'] = false;
}
@@ -90,7 +96,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* This might not be used for certain sub renderer
*/
- function notoc() {
+ public function notoc() {
$this->info['toc'] = false;
}
@@ -104,8 +110,8 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $state matched state if any
* @param string $match raw matched syntax
*/
- function plugin($name, $data, $state = '', $match = '') {
- /** @var DokuWiki_Syntax_Plugin $plugin */
+ public function plugin($name, $data, $state = '', $match = '') {
+ /** @var SyntaxPlugin $plugin */
$plugin = plugin_load('syntax', $name);
if($plugin != null) {
$plugin->render($this->getFormat(), $this, $data);
@@ -118,7 +124,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param array $instructions
*/
- function nest($instructions) {
+ public function nest($instructions) {
foreach($instructions as $instruction) {
// execute the callback against ourself
if(method_exists($this, $instruction[0])) {
@@ -133,7 +139,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* normally the syntax mode should override this instruction when instantiating Doku_Handler_Nest -
* however plugins will not be able to - as their instructions require data.
*/
- function nest_close() {
+ public function nest_close() {
}
#region Syntax modes - sub classes will need to implement them to fill $doc
@@ -141,13 +147,13 @@ class Doku_Renderer extends DokuWiki_Plugin {
/**
* Initialize the document
*/
- function document_start() {
+ public function document_start() {
}
/**
* Finalize the document
*/
- function document_end() {
+ public function document_end() {
}
/**
@@ -155,7 +161,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @return string
*/
- function render_TOC() {
+ public function render_TOC() {
return '';
}
@@ -166,7 +172,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $text the text to display
* @param int $level the nesting level
*/
- function toc_additem($id, $text, $level) {
+ public function toc_additem($id, $text, $level) {
}
/**
@@ -176,7 +182,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param int $level header level
* @param int $pos byte position in the original source
*/
- function header($text, $level, $pos) {
+ public function header($text, $level, $pos) {
}
/**
@@ -184,13 +190,13 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param int $level section level (as determined by the previous header)
*/
- function section_open($level) {
+ public function section_open($level) {
}
/**
* Close the current section
*/
- function section_close() {
+ public function section_close() {
}
/**
@@ -198,151 +204,151 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param string $text
*/
- function cdata($text) {
+ public function cdata($text) {
}
/**
* Open a paragraph
*/
- function p_open() {
+ public function p_open() {
}
/**
* Close a paragraph
*/
- function p_close() {
+ public function p_close() {
}
/**
* Create a line break
*/
- function linebreak() {
+ public function linebreak() {
}
/**
* Create a horizontal line
*/
- function hr() {
+ public function hr() {
}
/**
* Start strong (bold) formatting
*/
- function strong_open() {
+ public function strong_open() {
}
/**
* Stop strong (bold) formatting
*/
- function strong_close() {
+ public function strong_close() {
}
/**
* Start emphasis (italics) formatting
*/
- function emphasis_open() {
+ public function emphasis_open() {
}
/**
* Stop emphasis (italics) formatting
*/
- function emphasis_close() {
+ public function emphasis_close() {
}
/**
* Start underline formatting
*/
- function underline_open() {
+ public function underline_open() {
}
/**
* Stop underline formatting
*/
- function underline_close() {
+ public function underline_close() {
}
/**
* Start monospace formatting
*/
- function monospace_open() {
+ public function monospace_open() {
}
/**
* Stop monospace formatting
*/
- function monospace_close() {
+ public function monospace_close() {
}
/**
* Start a subscript
*/
- function subscript_open() {
+ public function subscript_open() {
}
/**
* Stop a subscript
*/
- function subscript_close() {
+ public function subscript_close() {
}
/**
* Start a superscript
*/
- function superscript_open() {
+ public function superscript_open() {
}
/**
* Stop a superscript
*/
- function superscript_close() {
+ public function superscript_close() {
}
/**
* Start deleted (strike-through) formatting
*/
- function deleted_open() {
+ public function deleted_open() {
}
/**
* Stop deleted (strike-through) formatting
*/
- function deleted_close() {
+ public function deleted_close() {
}
/**
* Start a footnote
*/
- function footnote_open() {
+ public function footnote_open() {
}
/**
* Stop a footnote
*/
- function footnote_close() {
+ public function footnote_close() {
}
/**
* Open an unordered list
*/
- function listu_open() {
+ public function listu_open() {
}
/**
* Close an unordered list
*/
- function listu_close() {
+ public function listu_close() {
}
/**
* Open an ordered list
*/
- function listo_open() {
+ public function listo_open() {
}
/**
* Close an ordered list
*/
- function listo_close() {
+ public function listo_close() {
}
/**
@@ -351,25 +357,25 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param int $level the nesting level
* @param bool $node true when a node; false when a leaf
*/
- function listitem_open($level,$node=false) {
+ public function listitem_open($level,$node=false) {
}
/**
* Close a list item
*/
- function listitem_close() {
+ public function listitem_close() {
}
/**
* Start the content of a list item
*/
- function listcontent_open() {
+ public function listcontent_open() {
}
/**
* Stop the content of a list item
*/
- function listcontent_close() {
+ public function listcontent_close() {
}
/**
@@ -379,7 +385,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param string $text
*/
- function unformatted($text) {
+ public function unformatted($text) {
$this->cdata($text);
}
@@ -391,7 +397,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param string $text The PHP code
*/
- function php($text) {
+ public function php($text) {
}
/**
@@ -402,7 +408,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param string $text The PHP code
*/
- function phpblock($text) {
+ public function phpblock($text) {
}
/**
@@ -412,7 +418,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param string $text The HTML
*/
- function html($text) {
+ public function html($text) {
}
/**
@@ -422,7 +428,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param string $text The HTML
*/
- function htmlblock($text) {
+ public function htmlblock($text) {
}
/**
@@ -430,19 +436,19 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param string $text
*/
- function preformatted($text) {
+ public function preformatted($text) {
}
/**
* Start a block quote
*/
- function quote_open() {
+ public function quote_open() {
}
/**
* Stop a block quote
*/
- function quote_close() {
+ public function quote_close() {
}
/**
@@ -452,7 +458,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $lang programming language to use for syntax highlighting
* @param string $file file path label
*/
- function file($text, $lang = null, $file = null) {
+ public function file($text, $lang = null, $file = null) {
}
/**
@@ -462,7 +468,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $lang programming language to use for syntax highlighting
* @param string $file file path label
*/
- function code($text, $lang = null, $file = null) {
+ public function code($text, $lang = null, $file = null) {
}
/**
@@ -472,7 +478,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param string $acronym
*/
- function acronym($acronym) {
+ public function acronym($acronym) {
}
/**
@@ -482,7 +488,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param string $smiley
*/
- function smiley($smiley) {
+ public function smiley($smiley) {
}
/**
@@ -494,7 +500,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param string $entity
*/
- function entity($entity) {
+ public function entity($entity) {
}
/**
@@ -505,37 +511,37 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string|int $x first value
* @param string|int $y second value
*/
- function multiplyentity($x, $y) {
+ public function multiplyentity($x, $y) {
}
/**
* Render an opening single quote char (language specific)
*/
- function singlequoteopening() {
+ public function singlequoteopening() {
}
/**
* Render a closing single quote char (language specific)
*/
- function singlequoteclosing() {
+ public function singlequoteclosing() {
}
/**
* Render an apostrophe char (language specific)
*/
- function apostrophe() {
+ public function apostrophe() {
}
/**
* Render an opening double quote char (language specific)
*/
- function doublequoteopening() {
+ public function doublequoteopening() {
}
/**
* Render an closinging double quote char (language specific)
*/
- function doublequoteclosing() {
+ public function doublequoteclosing() {
}
/**
@@ -544,7 +550,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $link The link name
* @see http://en.wikipedia.org/wiki/CamelCase
*/
- function camelcaselink($link) {
+ public function camelcaselink($link) {
}
/**
@@ -553,7 +559,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $hash hash link identifier
* @param string $name name for the link
*/
- function locallink($hash, $name = null) {
+ public function locallink($hash, $name = null) {
}
/**
@@ -562,7 +568,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $link page ID to link to. eg. 'wiki:syntax'
* @param string|array $title name for the link, array for media file
*/
- function internallink($link, $title = null) {
+ public function internallink($link, $title = null) {
}
/**
@@ -571,7 +577,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $link full URL with scheme
* @param string|array $title name for the link, array for media file
*/
- function externallink($link, $title = null) {
+ public function externallink($link, $title = null) {
}
/**
@@ -580,7 +586,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $url URL of the feed
* @param array $params Finetuning of the output
*/
- function rss($url, $params) {
+ public function rss($url, $params) {
}
/**
@@ -593,7 +599,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $wikiName indentifier (shortcut) for the remote wiki
* @param string $wikiUri the fragment parsed from the original link
*/
- function interwikilink($link, $title = null, $wikiName, $wikiUri) {
+ public function interwikilink($link, $title, $wikiName, $wikiUri) {
}
/**
@@ -602,7 +608,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $link the link
* @param string|array $title name for the link, array for media file
*/
- function filelink($link, $title = null) {
+ public function filelink($link, $title = null) {
}
/**
@@ -611,7 +617,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $link the link
* @param string|array $title name for the link, array for media file
*/
- function windowssharelink($link, $title = null) {
+ public function windowssharelink($link, $title = null) {
}
/**
@@ -622,7 +628,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $address Email-Address
* @param string|array $name name for the link, array for media file
*/
- function emaillink($address, $name = null) {
+ public function emaillink($address, $name = null) {
}
/**
@@ -636,7 +642,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $cache cache|recache|nocache
* @param string $linking linkonly|detail|nolink
*/
- function internalmedia($src, $title = null, $align = null, $width = null,
+ public function internalmedia($src, $title = null, $align = null, $width = null,
$height = null, $cache = null, $linking = null) {
}
@@ -651,7 +657,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $cache cache|recache|nocache
* @param string $linking linkonly|detail|nolink
*/
- function externalmedia($src, $title = null, $align = null, $width = null,
+ public function externalmedia($src, $title = null, $align = null, $width = null,
$height = null, $cache = null, $linking = null) {
}
@@ -665,7 +671,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param int $height height of media in pixel
* @param string $cache cache|recache|nocache
*/
- function internalmedialink($src, $title = null, $align = null,
+ public function internalmedialink($src, $title = null, $align = null,
$width = null, $height = null, $cache = null) {
}
@@ -679,7 +685,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param int $height height of media in pixel
* @param string $cache cache|recache|nocache
*/
- function externalmedialink($src, $title = null, $align = null,
+ public function externalmedialink($src, $title = null, $align = null,
$width = null, $height = null, $cache = null) {
}
@@ -690,7 +696,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param int $numrows NOT IMPLEMENTED
* @param int $pos byte position in the original source
*/
- function table_open($maxcols = null, $numrows = null, $pos = null) {
+ public function table_open($maxcols = null, $numrows = null, $pos = null) {
}
/**
@@ -698,55 +704,55 @@ class Doku_Renderer extends DokuWiki_Plugin {
*
* @param int $pos byte position in the original source
*/
- function table_close($pos = null) {
+ public function table_close($pos = null) {
}
/**
* Open a table header
*/
- function tablethead_open() {
+ public function tablethead_open() {
}
/**
* Close a table header
*/
- function tablethead_close() {
+ public function tablethead_close() {
}
/**
* Open a table body
*/
- function tabletbody_open() {
+ public function tabletbody_open() {
}
/**
* Close a table body
*/
- function tabletbody_close() {
+ public function tabletbody_close() {
}
/**
* Open a table footer
*/
- function tabletfoot_open() {
+ public function tabletfoot_open() {
}
/**
* Close a table footer
*/
- function tabletfoot_close() {
+ public function tabletfoot_close() {
}
/**
* Open a table row
*/
- function tablerow_open() {
+ public function tablerow_open() {
}
/**
* Close a table row
*/
- function tablerow_close() {
+ public function tablerow_close() {
}
/**
@@ -756,13 +762,13 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $align left|center|right
* @param int $rowspan
*/
- function tableheader_open($colspan = 1, $align = null, $rowspan = 1) {
+ public function tableheader_open($colspan = 1, $align = null, $rowspan = 1) {
}
/**
* Close a table header cell
*/
- function tableheader_close() {
+ public function tableheader_close() {
}
/**
@@ -772,13 +778,13 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $align left|center|right
* @param int $rowspan
*/
- function tablecell_open($colspan = 1, $align = null, $rowspan = 1) {
+ public function tablecell_open($colspan = 1, $align = null, $rowspan = 1) {
}
/**
* Close a table cell
*/
- function tablecell_close() {
+ public function tablecell_close() {
}
#endregion
@@ -786,6 +792,23 @@ class Doku_Renderer extends DokuWiki_Plugin {
#region util functions, you probably won't need to reimplement them
/**
+ * Creates a linkid from a headline
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $title The headline title
+ * @param boolean $create Create a new unique ID?
+ * @return string
+ */
+ public function _headerToLink($title, $create = false) {
+ if($create) {
+ return sectionID($title, $this->headers);
+ } else {
+ $check = false;
+ return sectionID($title, $check);
+ }
+ }
+
+ /**
* Removes any Namespace from the given name but keeps
* casing and special chars
*
@@ -794,7 +817,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param string $name
* @return string
*/
- function _simpleTitle($name) {
+ public function _simpleTitle($name) {
global $conf;
//if there is a hash we use the ancor name only
@@ -818,14 +841,17 @@ class Doku_Renderer extends DokuWiki_Plugin {
* @param null|bool $exists reference which returns if an internal page exists
* @return string interwikilink
*/
- function _resolveInterWiki(&$shortcut, $reference, &$exists = null) {
+ public function _resolveInterWiki(&$shortcut, $reference, &$exists = null) {
//get interwiki URL
if(isset($this->interwiki[$shortcut])) {
$url = $this->interwiki[$shortcut];
- } else {
- // Default to Google I'm feeling lucky
- $url = 'https://www.google.com/search?q={URL}&amp;btnI=lucky';
- $shortcut = 'go';
+ }elseif(isset($this->interwiki['default'])) {
+ $shortcut = 'default';
+ $url = $this->interwiki[$shortcut];
+ }else{
+ // not parsable interwiki outputs '' to make sure string manipluation works
+ $shortcut = '';
+ $url = '';
}
//split into hash and url part
@@ -840,7 +866,7 @@ class Doku_Renderer extends DokuWiki_Plugin {
//use placeholders
$url = str_replace('{URL}', rawurlencode($reference), $url);
//wiki names will be cleaned next, otherwise urlencode unsafe chars
- $url = str_replace('{NAME}', ($url{0} === ':') ? $reference :
+ $url = str_replace('{NAME}', ($url[0] === ':') ? $reference :
preg_replace_callback('/[[\\\\\]^`{|}#%]/', function($match) {
return rawurlencode($match[0]);
}, $reference), $url);
@@ -857,12 +883,13 @@ class Doku_Renderer extends DokuWiki_Plugin {
'{PATH}' => $parsed['path'],
'{QUERY}' => $parsed['query'] ,
]);
- } else {
- //default
+ } else if($url != '') {
+ // make sure when no url is defined, we keep it null
+ // default
$url = $url.rawurlencode($reference);
}
//handle as wiki links
- if($url{0} === ':') {
+ if($url[0] === ':') {
$urlparam = null;
$id = $url;
if (strpos($url, '?') !== false) {
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index a3e7b45f5..a135130a2 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -1,26 +1,15 @@
<?php
+
+use dokuwiki\ChangeLog\MediaChangeLog;
+
/**
* Renderer for XHTML output
*
+ * This is DokuWiki's main renderer used to display page content in the wiki
+ *
* @author Harry Fuecks <hfuecks@gmail.com>
* @author Andreas Gohr <andi@splitbrain.org>
- */
-if(!defined('DOKU_INC')) die('meh.');
-
-if(!defined('DOKU_LF')) {
- // Some whitespace to help View > Source
- define ('DOKU_LF', "\n");
-}
-
-if(!defined('DOKU_TAB')) {
- // Some whitespace to help View > Source
- define ('DOKU_TAB', "\t");
-}
-
-/**
- * The XHTML Renderer
*
- * This is DokuWiki's main renderer used to display page content in the wiki
*/
class Doku_Renderer_xhtml extends Doku_Renderer {
/** @var array store the table of contents */
@@ -28,14 +17,13 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/** @var array A stack of section edit data */
protected $sectionedits = array();
- var $date_at = ''; // link pages and media against this revision
+
+ /** @var string|int link pages and media against this revision */
+ public $date_at = '';
/** @var int last section edit id, used by startSectionEdit */
protected $lastsecid = 0;
- /** @var array the list of headers used to create unique link ids */
- protected $headers = array();
-
/** @var array a list of footnotes, list starts at 1! */
protected $footnotes = array();
@@ -122,23 +110,22 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @return string always 'xhtml'
*/
- function getFormat() {
+ public function getFormat() {
return 'xhtml';
}
/**
* Initialize the document
*/
- function document_start() {
+ public function document_start() {
//reset some internals
$this->toc = array();
- $this->headers = array();
}
/**
* Finalize the document
*/
- function document_end() {
+ public function document_end() {
// Finish open section edits.
while(count($this->sectionedits) > 0) {
if($this->sectionedits[count($this->sectionedits) - 1]['start'] <= 1) {
@@ -183,7 +170,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
// Prepare the TOC
global $conf;
- if($this->info['toc'] && is_array($this->toc) && $conf['tocminheads'] && count($this->toc) >= $conf['tocminheads']) {
+ if(
+ $this->info['toc'] &&
+ is_array($this->toc) &&
+ $conf['tocminheads'] && count($this->toc) >= $conf['tocminheads']
+ ) {
global $TOC;
$TOC = $this->toc;
}
@@ -199,7 +190,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param string $text the text to display
* @param int $level the nesting level
*/
- function toc_additem($id, $text, $level) {
+ public function toc_additem($id, $text, $level) {
global $conf;
//handle TOC
@@ -215,7 +206,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param int $level header level
* @param int $pos byte position in the original source
*/
- function header($text, $level, $pos) {
+ public function header($text, $level, $pos) {
global $conf;
if(blank($text)) return; //skip empty headlines
@@ -261,14 +252,14 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param int $level section level (as determined by the previous header)
*/
- function section_open($level) {
+ public function section_open($level) {
$this->doc .= '<div class="level'.$level.'">'.DOKU_LF;
}
/**
* Close the current section
*/
- function section_close() {
+ public function section_close() {
$this->doc .= DOKU_LF.'</div>'.DOKU_LF;
}
@@ -277,133 +268,133 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param $text
*/
- function cdata($text) {
+ public function cdata($text) {
$this->doc .= $this->_xmlEntities($text);
}
/**
* Open a paragraph
*/
- function p_open() {
+ public function p_open() {
$this->doc .= DOKU_LF.'<p>'.DOKU_LF;
}
/**
* Close a paragraph
*/
- function p_close() {
+ public function p_close() {
$this->doc .= DOKU_LF.'</p>'.DOKU_LF;
}
/**
* Create a line break
*/
- function linebreak() {
+ public function linebreak() {
$this->doc .= '<br/>'.DOKU_LF;
}
/**
* Create a horizontal line
*/
- function hr() {
+ public function hr() {
$this->doc .= '<hr />'.DOKU_LF;
}
/**
* Start strong (bold) formatting
*/
- function strong_open() {
+ public function strong_open() {
$this->doc .= '<strong>';
}
/**
* Stop strong (bold) formatting
*/
- function strong_close() {
+ public function strong_close() {
$this->doc .= '</strong>';
}
/**
* Start emphasis (italics) formatting
*/
- function emphasis_open() {
+ public function emphasis_open() {
$this->doc .= '<em>';
}
/**
* Stop emphasis (italics) formatting
*/
- function emphasis_close() {
+ public function emphasis_close() {
$this->doc .= '</em>';
}
/**
* Start underline formatting
*/
- function underline_open() {
+ public function underline_open() {
$this->doc .= '<em class="u">';
}
/**
* Stop underline formatting
*/
- function underline_close() {
+ public function underline_close() {
$this->doc .= '</em>';
}
/**
* Start monospace formatting
*/
- function monospace_open() {
+ public function monospace_open() {
$this->doc .= '<code>';
}
/**
* Stop monospace formatting
*/
- function monospace_close() {
+ public function monospace_close() {
$this->doc .= '</code>';
}
/**
* Start a subscript
*/
- function subscript_open() {
+ public function subscript_open() {
$this->doc .= '<sub>';
}
/**
* Stop a subscript
*/
- function subscript_close() {
+ public function subscript_close() {
$this->doc .= '</sub>';
}
/**
* Start a superscript
*/
- function superscript_open() {
+ public function superscript_open() {
$this->doc .= '<sup>';
}
/**
* Stop a superscript
*/
- function superscript_close() {
+ public function superscript_close() {
$this->doc .= '</sup>';
}
/**
* Start deleted (strike-through) formatting
*/
- function deleted_open() {
+ public function deleted_open() {
$this->doc .= '<del>';
}
/**
* Stop deleted (strike-through) formatting
*/
- function deleted_close() {
+ public function deleted_close() {
$this->doc .= '</del>';
}
@@ -416,7 +407,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function footnote_open() {
+ public function footnote_open() {
// move current content to store and record footnote
$this->store = $this->doc;
@@ -431,7 +422,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @author Andreas Gohr
*/
- function footnote_close() {
+ public function footnote_close() {
/** @var $fnid int takes track of seen footnotes, assures they are unique even across multiple docs FS#2841 */
static $fnid = 0;
// assign new footnote id (we start at 1)
@@ -462,7 +453,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
*/
- function listu_open($classes = null) {
+ public function listu_open($classes = null) {
$class = '';
if($classes !== null) {
if(is_array($classes)) $classes = join(' ', $classes);
@@ -474,7 +465,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Close an unordered list
*/
- function listu_close() {
+ public function listu_close() {
$this->doc .= '</ul>'.DOKU_LF;
}
@@ -483,7 +474,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
*/
- function listo_open($classes = null) {
+ public function listo_open($classes = null) {
$class = '';
if($classes !== null) {
if(is_array($classes)) $classes = join(' ', $classes);
@@ -495,7 +486,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Close an ordered list
*/
- function listo_close() {
+ public function listo_close() {
$this->doc .= '</ol>'.DOKU_LF;
}
@@ -505,7 +496,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param int $level the nesting level
* @param bool $node true when a node; false when a leaf
*/
- function listitem_open($level, $node=false) {
+ public function listitem_open($level, $node=false) {
$branching = $node ? ' node' : '';
$this->doc .= '<li class="level'.$level.$branching.'">';
}
@@ -513,21 +504,21 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Close a list item
*/
- function listitem_close() {
+ public function listitem_close() {
$this->doc .= '</li>'.DOKU_LF;
}
/**
* Start the content of a list item
*/
- function listcontent_open() {
+ public function listcontent_open() {
$this->doc .= '<div class="li">';
}
/**
* Stop the content of a list item
*/
- function listcontent_close() {
+ public function listcontent_close() {
$this->doc .= '</div>'.DOKU_LF;
}
@@ -538,7 +529,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param string $text
*/
- function unformatted($text) {
+ public function unformatted($text) {
$this->doc .= $this->_xmlEntities($text);
}
@@ -550,7 +541,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function php($text, $wrapper = 'code') {
+ public function php($text, $wrapper = 'code') {
global $conf;
if($conf['phpok']) {
@@ -571,7 +562,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param string $text The PHP code
*/
- function phpblock($text) {
+ public function phpblock($text) {
$this->php($text, 'pre');
}
@@ -583,7 +574,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function html($text, $wrapper = 'code') {
+ public function html($text, $wrapper = 'code') {
global $conf;
if($conf['htmlok']) {
@@ -600,21 +591,21 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param string $text The HTML
*/
- function htmlblock($text) {
+ public function htmlblock($text) {
$this->html($text, 'pre');
}
/**
* Start a block quote
*/
- function quote_open() {
+ public function quote_open() {
$this->doc .= '<blockquote><div class="no">'.DOKU_LF;
}
/**
* Stop a block quote
*/
- function quote_close() {
+ public function quote_close() {
$this->doc .= '</div></blockquote>'.DOKU_LF;
}
@@ -623,7 +614,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param string $text
*/
- function preformatted($text) {
+ public function preformatted($text) {
$this->doc .= '<pre class="code">'.trim($this->_xmlEntities($text), "\n\r").'</pre>'.DOKU_LF;
}
@@ -635,7 +626,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param string $filename file path label
* @param array $options assoziative array with additional geshi options
*/
- function file($text, $language = null, $filename = null, $options=null) {
+ public function file($text, $language = null, $filename = null, $options=null) {
$this->_highlight('file', $text, $language, $filename, $options);
}
@@ -647,7 +638,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param string $filename file path label
* @param array $options assoziative array with additional geshi options
*/
- function code($text, $language = null, $filename = null, $options=null) {
+ public function code($text, $language = null, $filename = null, $options=null) {
$this->_highlight('code', $text, $language, $filename, $options);
}
@@ -661,7 +652,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param string $filename file path label
* @param array $options assoziative array with additional geshi options
*/
- function _highlight($type, $text, $language = null, $filename = null, $options = null) {
+ public function _highlight($type, $text, $language = null, $filename = null, $options = null) {
global $ID;
global $lang;
global $INPUT;
@@ -681,12 +672,17 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$offset = $INPUT->str('codeblockOffset');
}
$this->doc .= '<dl class="'.$type.'">'.DOKU_LF;
- $this->doc .= '<dt><a href="'.exportlink($ID, 'code', array('codeblock' => $offset+$this->_codeblock)).'" title="'.$lang['download'].'" class="'.$class.'">';
+ $this->doc .= '<dt><a href="' .
+ exportlink(
+ $ID,
+ 'code',
+ array('codeblock' => $offset + $this->_codeblock)
+ ) . '" title="' . $lang['download'] . '" class="' . $class . '">';
$this->doc .= hsc($filename);
$this->doc .= '</a></dt>'.DOKU_LF.'<dd>';
}
- if($text{0} == "\n") {
+ if($text[0] == "\n") {
$text = substr($text, 1);
}
if(substr($text, -1) == "\n") {
@@ -699,7 +695,9 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$class = 'code'; //we always need the code class to make the syntax highlighting apply
if($type != 'code') $class .= ' '.$type;
- $this->doc .= "<pre class=\"$class $language\">".p_xhtml_cached_geshi($text, $language, '', $options).'</pre>'.DOKU_LF;
+ $this->doc .= "<pre class=\"$class $language\">" .
+ p_xhtml_cached_geshi($text, $language, '', $options) .
+ '</pre>' . DOKU_LF;
}
if($filename) {
@@ -716,7 +714,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param string $acronym
*/
- function acronym($acronym) {
+ public function acronym($acronym) {
if(array_key_exists($acronym, $this->acronyms)) {
@@ -737,7 +735,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param string $smiley
*/
- function smiley($smiley) {
+ public function smiley($smiley) {
if(array_key_exists($smiley, $this->smileys)) {
$this->doc .= '<img src="'.DOKU_BASE.'lib/images/smileys/'.$this->smileys[$smiley].
'" class="icon" alt="'.
@@ -756,7 +754,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param string $entity
*/
- function entity($entity) {
+ public function entity($entity) {
if(array_key_exists($entity, $this->entities)) {
$this->doc .= $this->entities[$entity];
} else {
@@ -772,14 +770,14 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param string|int $x first value
* @param string|int $y second value
*/
- function multiplyentity($x, $y) {
+ public function multiplyentity($x, $y) {
$this->doc .= "$x&times;$y";
}
/**
* Render an opening single quote char (language specific)
*/
- function singlequoteopening() {
+ public function singlequoteopening() {
global $lang;
$this->doc .= $lang['singlequoteopening'];
}
@@ -787,7 +785,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Render a closing single quote char (language specific)
*/
- function singlequoteclosing() {
+ public function singlequoteclosing() {
global $lang;
$this->doc .= $lang['singlequoteclosing'];
}
@@ -795,7 +793,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Render an apostrophe char (language specific)
*/
- function apostrophe() {
+ public function apostrophe() {
global $lang;
$this->doc .= $lang['apostrophe'];
}
@@ -803,7 +801,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Render an opening double quote char (language specific)
*/
- function doublequoteopening() {
+ public function doublequoteopening() {
global $lang;
$this->doc .= $lang['doublequoteopening'];
}
@@ -811,7 +809,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Render an closinging double quote char (language specific)
*/
- function doublequoteclosing() {
+ public function doublequoteclosing() {
global $lang;
$this->doc .= $lang['doublequoteclosing'];
}
@@ -825,7 +823,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @see http://en.wikipedia.org/wiki/CamelCase
*/
- function camelcaselink($link, $returnonly = false) {
+ public function camelcaselink($link, $returnonly = false) {
if($returnonly) {
return $this->internallink($link, $link, null, true);
} else {
@@ -841,7 +839,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param bool $returnonly whether to return html or write to doc attribute
* @return void|string writes to doc attribute or returns html depends on $returnonly
*/
- function locallink($hash, $name = null, $returnonly = false) {
+ public function locallink($hash, $name = null, $returnonly = false) {
global $ID;
$name = $this->_getLinkTitle($name, $hash, $isImage);
$hash = $this->_headerToLink($hash);
@@ -872,7 +870,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param string $linktype type to set use of headings
* @return void|string writes to doc attribute or returns html depends on $returnonly
*/
- function internallink($id, $name = null, $search = null, $returnonly = false, $linktype = 'content') {
+ public function internallink($id, $name = null, $search = null, $returnonly = false, $linktype = 'content') {
global $conf;
global $ID;
global $INFO;
@@ -920,12 +918,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$link['style'] = '';
$link['pre'] = '';
$link['suf'] = '';
- // highlight link to current page
- if($id == $INFO['id']) {
- $link['pre'] = '<span class="curid">';
- $link['suf'] = '</span>';
- }
- $link['more'] = '';
+ $link['more'] = 'data-wiki-id="'.$id.'"'; // id is already cleaned
$link['class'] = $class;
if($this->date_at) {
$params = $params.'&at='.rawurlencode($this->date_at);
@@ -963,7 +956,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param bool $returnonly whether to return html or write to doc attribute
* @return void|string writes to doc attribute or returns html depends on $returnonly
*/
- function externallink($url, $name = null, $returnonly = false) {
+ public function externallink($url, $name = null, $returnonly = false) {
global $conf;
$name = $this->_getLinkTitle($name, $url, $isImage);
@@ -1004,7 +997,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$link['name'] = $name;
$link['title'] = $this->_xmlEntities($url);
- if($conf['relnofollow']) $link['rel'] .= ' nofollow';
+ if($conf['relnofollow']) $link['rel'] .= ' ugc nofollow';
if($conf['target']['extern']) $link['rel'] .= ' noopener';
//output formatted
@@ -1027,7 +1020,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param bool $returnonly whether to return html or write to doc attribute
* @return void|string writes to doc attribute or returns html depends on $returnonly
*/
- function interwikilink($match, $name = null, $wikiName, $wikiUri, $returnonly = false) {
+ public function interwikilink($match, $name, $wikiName, $wikiUri, $returnonly = false) {
global $conf;
$link = array();
@@ -1066,11 +1059,13 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$link['url'] = $url;
$link['title'] = htmlspecialchars($link['url']);
- //output formatted
+ // output formatted
if($returnonly) {
+ if($url == '') return $link['name'];
return $this->_formatLink($link);
} else {
- $this->doc .= $this->_formatLink($link);
+ if($url == '') $this->doc .= $link['name'];
+ else $this->doc .= $this->_formatLink($link);
}
}
@@ -1082,7 +1077,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param bool $returnonly whether to return html or write to doc attribute
* @return void|string writes to doc attribute or returns html depends on $returnonly
*/
- function windowssharelink($url, $name = null, $returnonly = false) {
+ public function windowssharelink($url, $name = null, $returnonly = false) {
global $conf;
//simple setup
@@ -1122,7 +1117,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param bool $returnonly whether to return html or write to doc attribute
* @return void|string writes to doc attribute or returns html depends on $returnonly
*/
- function emaillink($address, $name = null, $returnonly = false) {
+ public function emaillink($address, $name = null, $returnonly = false) {
global $conf;
//simple setup
$link = array();
@@ -1174,7 +1169,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param bool $return return HTML instead of adding to $doc
* @return void|string writes to doc attribute or returns html depends on $return
*/
- function internalmedia($src, $title = null, $align = null, $width = null,
+ public function internalmedia($src, $title = null, $align = null, $width = null,
$height = null, $cache = null, $linking = null, $return = false) {
global $ID;
if (strpos($src, '#') !== false) {
@@ -1188,7 +1183,15 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
list($ext, $mime) = mimetype($src, false);
if(substr($mime, 0, 5) == 'image' && $render) {
- $link['url'] = ml($src, array('id' => $ID, 'cache' => $cache, 'rev'=>$this->_getLastMediaRevisionAt($src)), ($linking == 'direct'));
+ $link['url'] = ml(
+ $src,
+ array(
+ 'id' => $ID,
+ 'cache' => $cache,
+ 'rev' => $this->_getLastMediaRevisionAt($src)
+ ),
+ ($linking == 'direct')
+ );
} elseif(($mime == 'application/x-shockwave-flash' || media_supportedav($mime)) && $render) {
// don't link movies
$noLink = true;
@@ -1196,7 +1199,15 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
// add file icons
$class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext);
$link['class'] .= ' mediafile mf_'.$class;
- $link['url'] = ml($src, array('id' => $ID, 'cache' => $cache , 'rev'=>$this->_getLastMediaRevisionAt($src)), true);
+ $link['url'] = ml(
+ $src,
+ array(
+ 'id' => $ID,
+ 'cache' => $cache,
+ 'rev' => $this->_getLastMediaRevisionAt($src)
+ ),
+ true
+ );
if($exists) $link['title'] .= ' ('.filesize_h(filesize(mediaFN($src))).')';
}
@@ -1230,15 +1241,23 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param bool $return return HTML instead of adding to $doc
* @return void|string writes to doc attribute or returns html depends on $return
*/
- function externalmedia($src, $title = null, $align = null, $width = null,
+ public function externalmedia($src, $title = null, $align = null, $width = null,
$height = null, $cache = null, $linking = null, $return = false) {
if(link_isinterwiki($src)){
list($shortcut, $reference) = explode('>', $src, 2);
$exists = null;
$src = $this->_resolveInterWiki($shortcut, $reference, $exists);
+ if($src == '' && empty($title)){
+ // make sure at least something will be shown in this case
+ $title = $reference;
+ }
}
list($src, $hash) = explode('#', $src, 2);
$noLink = false;
+ if($src == '') {
+ // only output plaintext without link if there is no src
+ $noLink = true;
+ }
$render = ($linking == 'linkonly') ? false : true;
$link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render);
@@ -1277,7 +1296,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function rss($url, $params) {
+ public function rss($url, $params) {
global $lang;
global $conf;
@@ -1369,7 +1388,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param int $pos byte position in the original source
* @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
*/
- function table_open($maxcols = null, $numrows = null, $pos = null, $classes = null) {
+ public function table_open($maxcols = null, $numrows = null, $pos = null, $classes = null) {
// initialize the row counter used for classes
$this->_counter['row_counter'] = 0;
$class = 'table';
@@ -1394,7 +1413,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param int $pos byte position in the original source
*/
- function table_close($pos = null) {
+ public function table_close($pos = null) {
$this->doc .= '</table></div>'.DOKU_LF;
if($pos !== null) {
$this->finishSectionEdit($pos);
@@ -1404,42 +1423,42 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Open a table header
*/
- function tablethead_open() {
+ public function tablethead_open() {
$this->doc .= DOKU_TAB.'<thead>'.DOKU_LF;
}
/**
* Close a table header
*/
- function tablethead_close() {
+ public function tablethead_close() {
$this->doc .= DOKU_TAB.'</thead>'.DOKU_LF;
}
/**
* Open a table body
*/
- function tabletbody_open() {
+ public function tabletbody_open() {
$this->doc .= DOKU_TAB.'<tbody>'.DOKU_LF;
}
/**
* Close a table body
*/
- function tabletbody_close() {
+ public function tabletbody_close() {
$this->doc .= DOKU_TAB.'</tbody>'.DOKU_LF;
}
/**
* Open a table footer
*/
- function tabletfoot_open() {
+ public function tabletfoot_open() {
$this->doc .= DOKU_TAB.'<tfoot>'.DOKU_LF;
}
/**
* Close a table footer
*/
- function tabletfoot_close() {
+ public function tabletfoot_close() {
$this->doc .= DOKU_TAB.'</tfoot>'.DOKU_LF;
}
@@ -1448,7 +1467,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
*/
- function tablerow_open($classes = null) {
+ public function tablerow_open($classes = null) {
// initialize the cell counter used for classes
$this->_counter['cell_counter'] = 0;
$class = 'row'.$this->_counter['row_counter']++;
@@ -1462,7 +1481,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Close a table row
*/
- function tablerow_close() {
+ public function tablerow_close() {
$this->doc .= DOKU_LF.DOKU_TAB.'</tr>'.DOKU_LF;
}
@@ -1474,7 +1493,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param int $rowspan
* @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
*/
- function tableheader_open($colspan = 1, $align = null, $rowspan = 1, $classes = null) {
+ public function tableheader_open($colspan = 1, $align = null, $rowspan = 1, $classes = null) {
$class = 'class="col'.$this->_counter['cell_counter']++;
if(!is_null($align)) {
$class .= ' '.$align.'align';
@@ -1498,7 +1517,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Close a table header cell
*/
- function tableheader_close() {
+ public function tableheader_close() {
$this->doc .= '</th>';
}
@@ -1510,7 +1529,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param int $rowspan
* @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input
*/
- function tablecell_open($colspan = 1, $align = null, $rowspan = 1, $classes = null) {
+ public function tablecell_open($colspan = 1, $align = null, $rowspan = 1, $classes = null) {
$class = 'class="col'.$this->_counter['cell_counter']++;
if(!is_null($align)) {
$class .= ' '.$align.'align';
@@ -1534,7 +1553,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
/**
* Close a table cell
*/
- function tablecell_close() {
+ public function tablecell_close() {
$this->doc .= '</td>';
}
@@ -1544,7 +1563,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @return int The current header level
*/
- function getLastlevel() {
+ public function getLastlevel() {
return $this->lastlevel;
}
@@ -1560,7 +1579,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _formatLink($link) {
+ public function _formatLink($link) {
//make sure the url is XHTML compliant (skip mailto)
if(substr($link['url'], 0, 7) != 'mailto:') {
$link['url'] = str_replace('&', '&amp;', $link['url']);
@@ -1603,7 +1622,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param bool $render should the media be embedded inline or just linked
* @return string
*/
- function _media($src, $title = null, $align = null, $width = null,
+ public function _media($src, $title = null, $align = null, $width = null,
$height = null, $cache = null, $render = true) {
$ret = '';
@@ -1625,14 +1644,21 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
if(!$render) {
// if the picture is not supposed to be rendered
// return the title of the picture
- if(!$title) {
+ if($title === null || $title === "") {
// just show the sourcename
- $title = $this->_xmlEntities(utf8_basename(noNS($src)));
+ $title = $this->_xmlEntities(\dokuwiki\Utf8\PhpString::basename(noNS($src)));
}
return $title;
}
//add image tag
- $ret .= '<img src="'.ml($src, array('w' => $width, 'h' => $height, 'cache' => $cache, 'rev'=>$this->_getLastMediaRevisionAt($src))).'"';
+ $ret .= '<img src="' . ml(
+ $src,
+ array(
+ 'w' => $width, 'h' => $height,
+ 'cache' => $cache,
+ 'rev' => $this->_getLastMediaRevisionAt($src)
+ )
+ ) . '"';
$ret .= ' class="media'.$align.'"';
if($title) {
@@ -1652,11 +1678,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
} elseif(media_supportedav($mime, 'video') || media_supportedav($mime, 'audio')) {
// first get the $title
- $title = !is_null($title) ? $this->_xmlEntities($title) : false;
+ $title = !is_null($title) ? $title : false;
if(!$render) {
// if the file is not supposed to be rendered
// return the title of the file (just the sourcename if there is no title)
- return $title ? $title : $this->_xmlEntities(utf8_basename(noNS($src)));
+ return $this->_xmlEntities($title ? $title : \dokuwiki\Utf8\PhpString::basename(noNS($src)));
}
$att = array();
@@ -1680,7 +1706,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
// return the title of the flash
if(!$title) {
// just show the sourcename
- $title = utf8_basename(noNS($src));
+ $title = \dokuwiki\Utf8\PhpString::basename(noNS($src));
}
return $this->_xmlEntities($title);
}
@@ -1701,7 +1727,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$ret .= $this->_xmlEntities($title);
} else {
// just show the sourcename
- $ret .= $this->_xmlEntities(utf8_basename(noNS($src)));
+ $ret .= $this->_xmlEntities(\dokuwiki\Utf8\PhpString::basename(noNS($src)));
}
return $ret;
@@ -1713,26 +1739,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param $string
* @return string
*/
- function _xmlEntities($string) {
+ public function _xmlEntities($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
- /**
- * Creates a linkid from a headline
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @param string $title The headline title
- * @param boolean $create Create a new unique ID?
- * @return string
- */
- function _headerToLink($title, $create = false) {
- if($create) {
- return sectionID($title, $this->headers);
- } else {
- $check = false;
- return sectionID($title, $check);
- }
- }
+
/**
* Construct a title and handle images in titles
@@ -1745,7 +1756,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param string $linktype content|navigation
* @return string HTML of the title, might be full image tag or just escaped text
*/
- function _getLinkTitle($title, $default, &$isImage, $id = null, $linktype = 'content') {
+ public function _getLinkTitle($title, $default, &$isImage, $id = null, $linktype = 'content') {
$isImage = false;
if(is_array($title)) {
$isImage = true;
@@ -1770,7 +1781,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param array $img
* @return string HTML img tag or similar
*/
- function _imageTitle($img) {
+ public function _imageTitle($img) {
global $ID;
// some fixes on $img['src']
@@ -1805,7 +1816,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param bool $render should the media be embedded inline or just linked
* @return array associative array with link config
*/
- function _getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render) {
+ public function _getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render) {
global $conf;
$link = array();
@@ -1834,7 +1845,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param array $atts - additional attributes for the <video> tag
* @return string
*/
- function _video($src, $width, $height, $atts = null) {
+ public function _video($src, $width, $height, $atts = null) {
// prepare width and height
if(is_null($atts)) $atts = array();
$atts['width'] = (int) $width;
@@ -1878,11 +1889,20 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$url = ml($file, '', true, '&');
$linkType = 'internalmedia';
}
- $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(utf8_basename(noNS($file)));
+ $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(\dokuwiki\Utf8\PhpString::basename(noNS($file)));
$out .= '<source src="'.hsc($url).'" type="'.$mime.'" />'.NL;
// alternative content (just a link to the file)
- $fallback .= $this->$linkType($file, $title, null, null, null, $cache = null, $linking = 'linkonly', $return = true);
+ $fallback .= $this->$linkType(
+ $file,
+ $title,
+ null,
+ null,
+ null,
+ $cache = null,
+ $linking = 'linkonly',
+ $return = true
+ );
}
// output each track if any
@@ -1908,7 +1928,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @param array $atts - additional attributes for the <audio> tag
* @return string
*/
- function _audio($src, $atts = array()) {
+ public function _audio($src, $atts = array()) {
$files = array();
$isExternal = media_isexternal($src);
@@ -1936,11 +1956,20 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$url = ml($file, '', true, '&');
$linkType = 'internalmedia';
}
- $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(utf8_basename(noNS($file)));
+ $title = $atts['title'] ? $atts['title'] : $this->_xmlEntities(\dokuwiki\Utf8\PhpString::basename(noNS($file)));
$out .= '<source src="'.hsc($url).'" type="'.$mime.'" />'.NL;
// alternative content (just a link to the file)
- $fallback .= $this->$linkType($file, $title, null, null, null, $cache = null, $linking = 'linkonly', $return = true);
+ $fallback .= $this->$linkType(
+ $file,
+ $title,
+ null,
+ null,
+ null,
+ $cache = null,
+ $linking = 'linkonly',
+ $return = true
+ );
}
// finish
@@ -1958,7 +1987,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
* @access protected
* @return string revision ('' for current)
*/
- function _getLastMediaRevisionAt($media_id){
+ protected function _getLastMediaRevisionAt($media_id){
if(!$this->date_at || media_isexternal($media_id)) return '';
$pagelog = new MediaChangeLog($media_id);
return $pagelog->getLastRevisionAt($this->date_at);
diff --git a/inc/parser/xhtmlsummary.php b/inc/parser/xhtmlsummary.php
index 867b71f6a..4641bf836 100644
--- a/inc/parser/xhtmlsummary.php
+++ b/inc/parser/xhtmlsummary.php
@@ -1,6 +1,4 @@
<?php
-if(!defined('DOKU_INC')) die('meh.');
-
/**
* The summary XHTML form selects either up to the first two paragraphs
* it find in a page or the first section (whichever comes first)
@@ -20,32 +18,25 @@ class Doku_Renderer_xhtmlsummary extends Doku_Renderer_xhtml {
// Namespace these variables to
// avoid clashes with parent classes
- var $sum_paragraphs = 0;
- var $sum_capture = true;
- var $sum_inSection = false;
- var $sum_summary = '';
- var $sum_pageTitle = false;
+ protected $sum_paragraphs = 0;
+ protected $sum_capture = true;
+ protected $sum_inSection = false;
+ protected $sum_summary = '';
+ protected $sum_pageTitle = false;
- function document_start() {
+ /** @inheritdoc */
+ public function document_start() {
$this->doc .= DOKU_LF.'<div>'.DOKU_LF;
}
- function document_end() {
+ /** @inheritdoc */
+ public function document_end() {
$this->doc = $this->sum_summary;
$this->doc .= DOKU_LF.'</div>'.DOKU_LF;
}
- // FIXME not supported anymore
- function toc_open() {
- $this->sum_summary .= $this->doc;
- }
-
- // FIXME not supported anymore
- function toc_close() {
- $this->doc = '';
- }
-
- function header($text, $level, $pos) {
+ /** @inheritdoc */
+ public function header($text, $level, $pos) {
if ( !$this->sum_pageTitle ) {
$this->info['sum_pagetitle'] = $text;
$this->sum_pageTitle = true;
@@ -55,27 +46,31 @@ class Doku_Renderer_xhtmlsummary extends Doku_Renderer_xhtml {
$this->doc .= "</h$level>".DOKU_LF;
}
- function section_open($level) {
+ /** @inheritdoc */
+ public function section_open($level) {
if ( $this->sum_capture ) {
$this->sum_inSection = true;
}
}
- function section_close() {
+ /** @inheritdoc */
+ public function section_close() {
if ( $this->sum_capture && $this->sum_inSection ) {
$this->sum_summary .= $this->doc;
$this->sum_capture = false;
}
}
- function p_open() {
+ /** @inheritdoc */
+ public function p_open() {
if ( $this->sum_capture && $this->sum_paragraphs < 2 ) {
$this->sum_paragraphs++;
}
parent :: p_open();
}
- function p_close() {
+ /** @inheritdoc */
+ public function p_close() {
parent :: p_close();
if ( $this->sum_capture && $this->sum_paragraphs >= 2 ) {
$this->sum_summary .= $this->doc;
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 5b0cab06e..846be54db 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -7,7 +7,12 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
+use dokuwiki\Cache\CacheInstructions;
+use dokuwiki\Cache\CacheRenderer;
+use dokuwiki\ChangeLog\PageChangeLog;
+use dokuwiki\Extension\PluginController;
+use dokuwiki\Extension\Event;
+use dokuwiki\Parsing\Parser;
/**
* How many pages shall be rendered for getting metadata during one request
@@ -74,7 +79,8 @@ function p_wiki_xhtml($id, $rev='', $excuse=true,$date_at=''){
if($rev || $date_at){
if(file_exists($file)){
- $ret = p_render('xhtml',p_get_instructions(io_readWikiPage($file,$id,$rev)),$info,$date_at); //no caching on old revisions
+ //no caching on old revisions
+ $ret = p_render('xhtml',p_get_instructions(io_readWikiPage($file,$id,$rev)),$info,$date_at);
}elseif($excuse){
$ret = p_locale_xhtml('norev');
}
@@ -82,7 +88,13 @@ function p_wiki_xhtml($id, $rev='', $excuse=true,$date_at=''){
if(file_exists($file)){
$ret = p_cached_output($file,'xhtml',$id);
}elseif($excuse){
- $ret = p_locale_xhtml('newpage');
+ //check if the page once existed
+ $changelog = new PageChangeLog($id);
+ if($changelog->hasRevisions()) {
+ $ret = p_locale_xhtml('onceexisted');
+ } else {
+ $ret = p_locale_xhtml('newpage');
+ }
}
}
@@ -120,7 +132,7 @@ function p_locale_xhtml($id){
function p_cached_output($file, $format='xhtml', $id='') {
global $conf;
- $cache = new cache_renderer($id, $file, $format);
+ $cache = new CacheRenderer($id, $file, $format);
if ($cache->useCache()) {
$parsed = $cache->retrieveCache(false);
if($conf['allowdebug'] && $format=='xhtml') {
@@ -160,7 +172,7 @@ function p_cached_instructions($file,$cacheonly=false,$id='') {
static $run = null;
if(is_null($run)) $run = array();
- $cache = new cache_instructions($id, $file);
+ $cache = new CacheInstructions($id, $file);
if ($cacheonly || $cache->useCache() || (isset($run[$file]) && !defined('DOKU_UNITTEST'))) {
return $cache->retrieveCache();
@@ -191,11 +203,8 @@ function p_get_instructions($text){
$modes = p_get_parsermodes();
- // Create the parser
- $Parser = new Doku_Parser();
-
- // Add the Handler
- $Parser->Handler = new Doku_Handler();
+ // Create the parser and handler
+ $Parser = new Parser(new Doku_Handler());
//add modes to parser
foreach($modes as $mode){
@@ -203,7 +212,7 @@ function p_get_instructions($text){
}
// Do the parsing
- trigger_event('PARSER_WIKITEXT_PREPROCESS', $text);
+ Event::createAndTrigger('PARSER_WIKITEXT_PREPROCESS', $text);
$p = $Parser->parse($text);
// dbg($p);
return $p;
@@ -213,7 +222,8 @@ function p_get_instructions($text){
* returns the metadata of a page
*
* @param string $id The id of the page the metadata should be returned from
- * @param string $key The key of the metdata value that shall be read (by default everything) - separate hierarchies by " " like "date created"
+ * @param string $key The key of the metdata value that shall be read (by default everything)
+ * separate hierarchies by " " like "date created"
* @param int $render If the page should be rendererd - possible values:
* METADATA_DONT_RENDER, METADATA_RENDER_USING_SIMPLE_CACHE, METADATA_RENDER_USING_CACHE
* METADATA_RENDER_UNLIMITED (also combined with the previous two options),
@@ -249,7 +259,7 @@ function p_get_metadata($id, $key='', $render=METADATA_RENDER_USING_CACHE){
if (!$recursion && $render != METADATA_DONT_RENDER && !isset($rendered_pages[$id])&& page_exists($id)){
$recursion = true;
- $cachefile = new cache_renderer($id, wikiFN($id), 'metadata');
+ $cachefile = new CacheRenderer($id, wikiFN($id), 'metadata');
$do_render = false;
if ($render & METADATA_RENDER_UNLIMITED || $render_count < P_GET_METADATA_RENDER_LIMIT) {
@@ -300,10 +310,10 @@ function p_get_metadata($id, $key='', $render=METADATA_RENDER_USING_CACHE){
*
* @see http://www.dokuwiki.org/devel:metadata#functions_to_get_and_set_metadata
*
- * @param String $id is the ID of a wiki page
- * @param Array $data is an array with key ⇒ value pairs to be set in the metadata
- * @param Boolean $render whether or not the page metadata should be generated with the renderer
- * @param Boolean $persistent indicates whether or not the particular metadata value will persist through
+ * @param string $id is the ID of a wiki page
+ * @param array $data is an array with key ⇒ value pairs to be set in the metadata
+ * @param boolean $render whether or not the page metadata should be generated with the renderer
+ * @param boolean $persistent indicates whether or not the particular metadata value will persist through
* the next metadata rendering.
* @return boolean true on success
*
@@ -343,7 +353,10 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){
}
if($persistent) {
if(isset($meta['persistent'][$key][$subkey]) && is_array($meta['persistent'][$key][$subkey])) {
- $meta['persistent'][$key][$subkey] = array_replace($meta['persistent'][$key][$subkey], (array)$subvalue);
+ $meta['persistent'][$key][$subkey] = array_replace(
+ $meta['persistent'][$key][$subkey],
+ (array) $subvalue
+ );
} else {
$meta['persistent'][$key][$subkey] = $subvalue;
}
@@ -355,10 +368,14 @@ 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_replace((array)$meta['current'][$key],$value) : $value;
+ $meta['current'][$key] = !empty($meta['current'][$key]) ?
+ array_replace((array)$meta['current'][$key],$value) :
+ $value;
if ($persistent) {
- $meta['persistent'][$key] = !empty($meta['persistent'][$key]) ? array_replace((array)$meta['persistent'][$key],$value) : $value;
+ $meta['persistent'][$key] = !empty($meta['persistent'][$key]) ?
+ array_replace((array)$meta['persistent'][$key],$value) :
+ $value;
}
}
@@ -422,7 +439,9 @@ function p_read_metadata($id,$cache=false) {
if (isset($cache_metadata[(string)$id])) return $cache_metadata[(string)$id];
$file = metaFN($id, '.meta');
- $meta = file_exists($file) ? unserialize(io_readFile($file, false)) : array('current'=>array(),'persistent'=>array());
+ $meta = file_exists($file) ?
+ unserialize(io_readFile($file, false)) :
+ array('current'=>array(),'persistent'=>array());
if ($cache) {
$cache_metadata[(string)$id] = $meta;
@@ -475,7 +494,7 @@ function p_render_metadata($id, $orig){
// add an extra key for the event - to tell event handlers the page whose metadata this is
$orig['page'] = $id;
- $evt = new Doku_Event('PARSER_METADATA_RENDER', $orig);
+ $evt = new Event('PARSER_METADATA_RENDER', $orig);
if ($evt->advise_before()) {
// get instructions
@@ -536,7 +555,7 @@ function p_get_parsermodes(){
global $PARSER_MODES;
$obj = null;
foreach($pluginlist as $p){
- /** @var DokuWiki_Syntax_Plugin $obj */
+ /** @var \dokuwiki\Extension\SyntaxPlugin $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
@@ -560,7 +579,7 @@ function p_get_parsermodes(){
$std_modes[] = 'multiplyentity';
}
foreach($std_modes as $m){
- $class = "Doku_Parser_Mode_$m";
+ $class = 'dokuwiki\\Parsing\\ParserMode\\'.ucfirst($m);
$obj = new $class();
$modes[] = array(
'sort' => $obj->getSort(),
@@ -573,7 +592,7 @@ function p_get_parsermodes(){
$fmt_modes = array('strong','emphasis','underline','monospace',
'subscript','superscript','deleted');
foreach($fmt_modes as $m){
- $obj = new Doku_Parser_Mode_formatting($m);
+ $obj = new \dokuwiki\Parsing\ParserMode\Formatting($m);
$modes[] = array(
'sort' => $obj->getSort(),
'mode' => $m,
@@ -582,16 +601,16 @@ function p_get_parsermodes(){
}
// add modes which need files
- $obj = new Doku_Parser_Mode_smiley(array_keys(getSmileys()));
+ $obj = new \dokuwiki\Parsing\ParserMode\Smiley(array_keys(getSmileys()));
$modes[] = array('sort' => $obj->getSort(), 'mode' => 'smiley','obj' => $obj );
- $obj = new Doku_Parser_Mode_acronym(array_keys(getAcronyms()));
+ $obj = new \dokuwiki\Parsing\ParserMode\Acronym(array_keys(getAcronyms()));
$modes[] = array('sort' => $obj->getSort(), 'mode' => 'acronym','obj' => $obj );
- $obj = new Doku_Parser_Mode_entity(array_keys(getEntities()));
+ $obj = new \dokuwiki\Parsing\ParserMode\Entity(array_keys(getEntities()));
$modes[] = array('sort' => $obj->getSort(), 'mode' => 'entity','obj' => $obj );
// add optional camelcase mode
if($conf['camelcase']){
- $obj = new Doku_Parser_Mode_camelcaselink();
+ $obj = new \dokuwiki\Parsing\ParserMode\Camelcaselink();
$modes[] = array('sort' => $obj->getSort(), 'mode' => 'camelcaselink','obj' => $obj );
}
@@ -660,7 +679,7 @@ function p_render($mode,$instructions,&$info,$date_at=''){
// Post process and return the output
$data = array($mode,& $Renderer->doc);
- trigger_event('RENDERER_CONTENT_POSTPROCESS',$data);
+ Event::createAndTrigger('RENDERER_CONTENT_POSTPROCESS',$data);
return $Renderer->doc;
}
@@ -674,7 +693,7 @@ function p_render($mode,$instructions,&$info,$date_at=''){
* @author Christopher Smith <chris@jalakai.co.uk>
*/
function p_get_renderer($mode) {
- /** @var Doku_Plugin_Controller $plugin_controller */
+ /** @var PluginController $plugin_controller */
global $conf, $plugin_controller;
$rname = !empty($conf['renderer_'.$mode]) ? $conf['renderer_'.$mode] : $mode;
diff --git a/inc/plugincontroller.class.php b/inc/plugincontroller.class.php
deleted file mode 100644
index fd8cd9663..000000000
--- a/inc/plugincontroller.class.php
+++ /dev/null
@@ -1,347 +0,0 @@
-<?php
-/**
- * Class to encapsulate access to dokuwiki plugins
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Christopher Smith <chris@jalakai.co.uk>
- */
-
-// plugin related constants
-if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
-
-class Doku_Plugin_Controller {
-
- protected $list_bytype = array();
- protected $tmp_plugins = array();
- protected $plugin_cascade = array('default'=>array(),'local'=>array(),'protected'=>array());
- protected $last_local_config_file = '';
-
- /**
- * Populates the master list of plugins
- */
- public function __construct() {
- $this->loadConfig();
- $this->_populateMasterList();
- }
-
- /**
- * Returns a list of available plugins of given type
- *
- * @param $type string, plugin_type name;
- * the type of plugin to return,
- * use empty string for all types
- * @param $all bool;
- * false to only return enabled plugins,
- * true to return both enabled and disabled plugins
- *
- * @return array of
- * - plugin names when $type = ''
- * - or plugin component names when a $type is given
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- public function getList($type='',$all=false){
-
- // request the complete list
- if (!$type) {
- return $all ? array_keys($this->tmp_plugins) : array_keys(array_filter($this->tmp_plugins));
- }
-
- if (!isset($this->list_bytype[$type]['enabled'])) {
- $this->list_bytype[$type]['enabled'] = $this->_getListByType($type,true);
- }
- if ($all && !isset($this->list_bytype[$type]['disabled'])) {
- $this->list_bytype[$type]['disabled'] = $this->_getListByType($type,false);
- }
-
- return $all ? array_merge($this->list_bytype[$type]['enabled'],$this->list_bytype[$type]['disabled']) : $this->list_bytype[$type]['enabled'];
- }
-
- /**
- * Loads the given plugin and creates an object of it
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param $type string type of plugin to load
- * @param $name string name of the plugin to load
- * @param $new bool true to return a new instance of the plugin, false to use an already loaded instance
- * @param $disabled bool true to load even disabled plugins
- * @return DokuWiki_PluginInterface|null the plugin object or null on failure
- */
- public function load($type,$name,$new=false,$disabled=false){
-
- //we keep all loaded plugins available in global scope for reuse
- global $DOKU_PLUGINS;
-
- list($plugin, /* $component */) = $this->_splitName($name);
-
- // check if disabled
- if(!$disabled && $this->isdisabled($plugin)){
- return null;
- }
-
- $class = $type.'_plugin_'.$name;
-
- //plugin already loaded?
- if(!empty($DOKU_PLUGINS[$type][$name])){
- if ($new || !$DOKU_PLUGINS[$type][$name]->isSingleton()) {
- return class_exists($class, true) ? new $class : null;
- } else {
- return $DOKU_PLUGINS[$type][$name];
- }
- }
-
- //construct class and instantiate
- if (!class_exists($class, true)) {
-
- # the plugin might be in the wrong directory
- $dir = $this->get_directory($plugin);
- $inf = confToHash(DOKU_PLUGIN."$dir/plugin.info.txt");
- if($inf['base'] && $inf['base'] != $plugin){
- 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;
- }
-
- $DOKU_PLUGINS[$type][$name] = new $class;
- return $DOKU_PLUGINS[$type][$name];
- }
-
- /**
- * Whether plugin is disabled
- *
- * @param string $plugin name of plugin
- * @return bool true disabled, false enabled
- */
- public function isdisabled($plugin) {
- return empty($this->tmp_plugins[$plugin]);
- }
-
- /**
- * Disable the plugin
- *
- * @param string $plugin name of plugin
- * @return bool true saving succeed, false saving failed
- */
- public function disable($plugin) {
- if(array_key_exists($plugin,$this->plugin_cascade['protected'])) return false;
- $this->tmp_plugins[$plugin] = 0;
- return $this->saveList();
- }
-
- /**
- * Enable the plugin
- *
- * @param string $plugin name of plugin
- * @return bool true saving succeed, false saving failed
- */
- public function enable($plugin) {
- if(array_key_exists($plugin,$this->plugin_cascade['protected'])) return false;
- $this->tmp_plugins[$plugin] = 1;
- return $this->saveList();
- }
-
- /**
- * Returns directory name of plugin
- *
- * @param string $plugin name of plugin
- * @return string name of directory
- */
- public function get_directory($plugin) {
- return $plugin;
- }
-
- /**
- * Returns cascade of the config files
- *
- * @return array with arrays of plugin configs
- */
- public function getCascade() {
- return $this->plugin_cascade;
- }
-
- protected function _populateMasterList() {
- global $conf;
-
- if ($dh = @opendir(DOKU_PLUGIN)) {
- $all_plugins = array();
- while (false !== ($plugin = readdir($dh))) {
- if ($plugin[0] == '.') continue; // skip hidden entries
- if (is_file(DOKU_PLUGIN.$plugin)) continue; // skip files, we're only interested in directories
-
- if (array_key_exists($plugin,$this->tmp_plugins) && $this->tmp_plugins[$plugin] == 0){
- $all_plugins[$plugin] = 0;
-
- } elseif ((array_key_exists($plugin,$this->tmp_plugins) && $this->tmp_plugins[$plugin] == 1)) {
- $all_plugins[$plugin] = 1;
- } else {
- $all_plugins[$plugin] = 1;
- }
- }
- $this->tmp_plugins = $all_plugins;
- if (!file_exists($this->last_local_config_file)) {
- $this->saveList(true);
- }
- }
- }
-
- /**
- * Includes the plugin config $files
- * and returns the entries of the $plugins array set in these files
- *
- * @param array $files list of files to include, latter overrides previous
- * @return array with entries of the $plugins arrays of the included files
- */
- protected function checkRequire($files) {
- $plugins = array();
- foreach($files as $file) {
- if(file_exists($file)) {
- include_once($file);
- }
- }
- return $plugins;
- }
-
- /**
- * Save the current list of plugins
- *
- * @param bool $forceSave;
- * false to save only when config changed
- * true to always save
- * @return bool true saving succeed, false saving failed
- */
- protected function saveList($forceSave = false) {
- global $conf;
-
- if (empty($this->tmp_plugins)) return false;
-
- // Rebuild list of local settings
- $local_plugins = $this->rebuildLocal();
- if($local_plugins != $this->plugin_cascade['local'] || $forceSave) {
- $file = $this->last_local_config_file;
- $out = "<?php\n/*\n * Local plugin enable/disable settings\n * Auto-generated through plugin/extension manager\n *\n".
- " * NOTE: Plugins will not be added to this file unless there is a need to override a default setting. Plugins are\n".
- " * enabled by default.\n */\n";
- foreach ($local_plugins as $plugin => $value) {
- $out .= "\$plugins['$plugin'] = $value;\n";
- }
- // backup current file (remove any existing backup)
- if (file_exists($file)) {
- $backup = $file.'.bak';
- if (file_exists($backup)) @unlink($backup);
- if (!@copy($file,$backup)) return false;
- if (!empty($conf['fperm'])) chmod($backup, $conf['fperm']);
- }
- //check if can open for writing, else restore
- return io_saveFile($file,$out);
- }
- return false;
- }
-
- /**
- * Rebuild the set of local plugins
- *
- * @return array array of plugins to be saved in end($config_cascade['plugins']['local'])
- */
- protected function rebuildLocal() {
- //assign to local variable to avoid overwriting
- $backup = $this->tmp_plugins;
- //Can't do anything about protected one so rule them out completely
- $local_default = array_diff_key($backup,$this->plugin_cascade['protected']);
- //Diff between local+default and default
- //gives us the ones we need to check and save
- $diffed_ones = array_diff_key($local_default,$this->plugin_cascade['default']);
- //The ones which we are sure of (list of 0s not in default)
- $sure_plugins = array_filter($diffed_ones,array($this,'negate'));
- //the ones in need of diff
- $conflicts = array_diff_key($local_default,$diffed_ones);
- //The final list
- return array_merge($sure_plugins,array_diff_assoc($conflicts,$this->plugin_cascade['default']));
- }
-
- /**
- * Build the list of plugins and cascade
- *
- */
- protected function loadConfig() {
- global $config_cascade;
- foreach(array('default','protected') as $type) {
- if(array_key_exists($type,$config_cascade['plugins']))
- $this->plugin_cascade[$type] = $this->checkRequire($config_cascade['plugins'][$type]);
- }
- $local = $config_cascade['plugins']['local'];
- $this->last_local_config_file = array_pop($local);
- $this->plugin_cascade['local'] = $this->checkRequire(array($this->last_local_config_file));
- if(is_array($local)) {
- $this->plugin_cascade['default'] = array_merge($this->plugin_cascade['default'],$this->checkRequire($local));
- }
- $this->tmp_plugins = array_merge($this->plugin_cascade['default'],$this->plugin_cascade['local'],$this->plugin_cascade['protected']);
- }
-
- /**
- * Returns a list of available plugin components of given type
- *
- * @param string $type plugin_type name; the type of plugin to return,
- * @param bool $enabled true to return enabled plugins,
- * false to return disabled plugins
- * @return array of plugin components of requested type
- */
- protected function _getListByType($type, $enabled) {
- $master_list = $enabled ? array_keys(array_filter($this->tmp_plugins)) : array_keys(array_filter($this->tmp_plugins,array($this,'negate')));
- $plugins = array();
-
- foreach ($master_list as $plugin) {
-
- $basedir = $this->get_directory($plugin);
- if (file_exists(DOKU_PLUGIN."$basedir/$type.php")){
- $plugins[] = $plugin;
- continue;
- }
-
- $typedir = DOKU_PLUGIN."$basedir/$type/";
- if (is_dir($typedir)) {
- if ($dp = opendir($typedir)) {
- while (false !== ($component = readdir($dp))) {
- if (substr($component,0,1) == '.' || strtolower(substr($component, -4)) != ".php") continue;
- if (is_file($typedir.$component)) {
- $plugins[] = $plugin.'_'.substr($component, 0, -4);
- }
- }
- closedir($dp);
- }
- }
-
- }//foreach
-
- return $plugins;
- }
-
- /**
- * Split name in a plugin name and a component name
- *
- * @param string $name
- * @return array with
- * - plugin name
- * - and component name when available, otherwise empty string
- */
- protected function _splitName($name) {
- if (array_search($name, array_keys($this->tmp_plugins)) === false) {
- return explode('_',$name,2);
- }
-
- return array($name,'');
- }
-
- /**
- * Returns inverse boolean value of the input
- *
- * @param mixed $input
- * @return bool inversed boolean value of input
- */
- protected function negate($input) {
- return !(bool) $input;
- }
-}
diff --git a/inc/pluginutils.php b/inc/pluginutils.php
index a395be435..a93cd4f60 100644
--- a/inc/pluginutils.php
+++ b/inc/pluginutils.php
@@ -7,8 +7,13 @@
*/
// plugin related constants
+use dokuwiki\Extension\AdminPlugin;
+use dokuwiki\Extension\PluginController;
+use dokuwiki\Extension\PluginInterface;
+
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
+// 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]+');
/**
@@ -22,10 +27,13 @@ if(!defined('DOKU_PLUGIN_NAME_REGEX')) define('DOKU_PLUGIN_NAME_REGEX', '[a-zA-Z
* @param bool $all; true to retrieve all, false to retrieve only enabled plugins
* @return array with plugin names or plugin component names
*/
-function plugin_list($type='',$all=false) {
- /** @var $plugin_controller Doku_Plugin_Controller */
+function plugin_list($type='',$all=false)
+{
+ /** @var $plugin_controller PluginController */
global $plugin_controller;
- return $plugin_controller->getList($type,$all);
+ $plugins = $plugin_controller->getList($type,$all);
+ sort($plugins, SORT_NATURAL|SORT_FLAG_CASE);
+ return $plugins;
}
/**
@@ -37,10 +45,11 @@ function plugin_list($type='',$all=false) {
* @param $name string name of the plugin to load
* @param $new bool true to return a new instance of the plugin, false to use an already loaded instance
* @param $disabled bool true to load even disabled plugins
- * @return DokuWiki_PluginInterface|null the plugin object or null on failure
+ * @return PluginInterface|null the plugin object or null on failure
*/
-function plugin_load($type,$name,$new=false,$disabled=false) {
- /** @var $plugin_controller Doku_Plugin_Controller */
+function plugin_load($type,$name,$new=false,$disabled=false)
+{
+ /** @var $plugin_controller PluginController */
global $plugin_controller;
return $plugin_controller->load($type,$name,$new,$disabled);
}
@@ -51,10 +60,11 @@ function plugin_load($type,$name,$new=false,$disabled=false) {
* @param string $plugin name of plugin
* @return bool true disabled, false enabled
*/
-function plugin_isdisabled($plugin) {
- /** @var $plugin_controller Doku_Plugin_Controller */
+function plugin_isdisabled($plugin)
+{
+ /** @var $plugin_controller PluginController */
global $plugin_controller;
- return $plugin_controller->isdisabled($plugin);
+ return !$plugin_controller->isEnabled($plugin);
}
/**
@@ -63,8 +73,9 @@ function plugin_isdisabled($plugin) {
* @param string $plugin name of plugin
* @return bool true saving succeed, false saving failed
*/
-function plugin_enable($plugin) {
- /** @var $plugin_controller Doku_Plugin_Controller */
+function plugin_enable($plugin)
+{
+ /** @var $plugin_controller PluginController */
global $plugin_controller;
return $plugin_controller->enable($plugin);
}
@@ -75,8 +86,9 @@ function plugin_enable($plugin) {
* @param string $plugin name of plugin
* @return bool true saving succeed, false saving failed
*/
-function plugin_disable($plugin) {
- /** @var $plugin_controller Doku_Plugin_Controller */
+function plugin_disable($plugin)
+{
+ /** @var $plugin_controller PluginController */
global $plugin_controller;
return $plugin_controller->disable($plugin);
}
@@ -86,11 +98,12 @@ function plugin_disable($plugin) {
*
* @param string $plugin name of plugin
* @return string name of directory
+ * @deprecated 2018-07-20
*/
-function plugin_directory($plugin) {
- /** @var $plugin_controller Doku_Plugin_Controller */
- global $plugin_controller;
- return $plugin_controller->get_directory($plugin);
+function plugin_directory($plugin)
+{
+ dbg_deprecated('$plugin directly');
+ return $plugin;
}
/**
@@ -98,8 +111,9 @@ function plugin_directory($plugin) {
*
* @return array with arrays of plugin configs
*/
-function plugin_getcascade() {
- /** @var $plugin_controller Doku_Plugin_Controller */
+function plugin_getcascade()
+{
+ /** @var $plugin_controller PluginController */
global $plugin_controller;
return $plugin_controller->getCascade();
}
@@ -111,7 +125,8 @@ function plugin_getcascade() {
*
* @return Doku_Plugin_Admin
*/
-function plugin_getRequestAdminPlugin(){
+function plugin_getRequestAdminPlugin()
+{
static $admin_plugin = false;
global $ACT,$INPUT,$INFO;
@@ -120,10 +135,10 @@ function plugin_getRequestAdminPlugin(){
$pluginlist = plugin_list('admin');
if (in_array($page, $pluginlist)) {
// attempt to load the plugin
- /** @var $admin_plugin DokuWiki_Admin_Plugin */
+ /** @var $admin_plugin AdminPlugin */
$admin_plugin = plugin_load('admin', $page);
// verify
- if ($admin_plugin && $admin_plugin->forAdminOnly() && !$INFO['isadmin']) {
+ if ($admin_plugin && !$admin_plugin->isAccessibleByCurrentUser()) {
$admin_plugin = null;
$INPUT->remove('page');
msg('For admins only',-1);
diff --git a/inc/search.php b/inc/search.php
index e4d9c3caf..27efc65fe 100644
--- a/inc/search.php
+++ b/inc/search.php
@@ -6,8 +6,6 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
-
/**
* Recurse directory
*
@@ -20,7 +18,8 @@ if(!defined('DOKU_INC')) die('meh.');
* @param array $opts option array will be given to the Callback
* @param string $dir Current directory beyond $base
* @param int $lvl Recursion Level
- * @param mixed $sort 'natural' to use natural order sorting (default); 'date' to sort by filemtime; leave empty to skip sorting.
+ * @param mixed $sort 'natural' to use natural order sorting (default);
+ * 'date' to sort by filemtime; leave empty to skip sorting.
* @author Andreas Gohr <andi@splitbrain.org>
*/
function search(&$data,$base,$func,$opts,$dir='',$lvl=1,$sort='natural'){
@@ -212,7 +211,7 @@ function search_media(&$data,$base,$file,$type,$lvl,$opts){
return false;
}
- $info['file'] = utf8_basename($file);
+ $info['file'] = \dokuwiki\Utf8\PhpString::basename($file);
$info['size'] = filesize($base.'/'.$file);
$info['mtime'] = filemtime($base.'/'.$file);
$info['writable'] = is_writable($base.'/'.$file);
@@ -479,7 +478,8 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){
// are we done here maybe?
if($type == 'd'){
if(empty($opts['listdirs'])) return $return;
- if(empty($opts['skipacl']) && !empty($opts['sneakyacl']) && $item['perm'] < AUTH_READ) return false; //neither list nor recurse
+ //neither list nor recurse forbidden items:
+ if(empty($opts['skipacl']) && !empty($opts['sneakyacl']) && $item['perm'] < AUTH_READ) return false;
if(!empty($opts['dirmatch']) && !preg_match('/'.$opts['dirmatch'].'/',$file)) return $return;
if(!empty($opts['nsmatch']) && !preg_match('/'.$opts['nsmatch'].'/',$item['ns'])) return $return;
}else{
@@ -497,7 +497,7 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){
$item['open'] = $return;
if(!empty($opts['meta'])){
- $item['file'] = utf8_basename($file);
+ $item['file'] = \dokuwiki\Utf8\PhpString::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
deleted file mode 100644
index 74bec656d..000000000
--- a/inc/subscription.php
+++ /dev/null
@@ -1,693 +0,0 @@
-<?php
-/**
- * Class for handling (email) subscriptions
- *
- * @author Adrian Lang <lang@cosmocode.de>
- * @author Andreas Gohr <andi@splitbrain.org>
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- */
-class Subscription {
-
- /**
- * Check if subscription system is enabled
- *
- * @return bool
- */
- public function isenabled() {
- return actionOK('subscribe');
- }
-
- /**
- * Return the subscription meta file for the given 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.
- * @return string
- */
- protected function file($id) {
- $meta_fname = '.mlist';
- if((substr($id, -1, 1) === ':')) {
- $meta_froot = getNS($id);
- $meta_fname = '/'.$meta_fname;
- } else {
- $meta_froot = $id;
- }
- return metaFN((string) $meta_froot, $meta_fname);
- }
-
- /**
- * Lock subscription info
- *
- * We don't use io_lock() her because we do not wait for the lock and use a larger stale time
- *
- * @author Adrian Lang <lang@cosmocode.de>
- * @param string $id The target page or namespace, specified by id; Namespaces
- * are identified by appending a colon.
- * @return bool true, if you got a succesful lock
- */
- protected function lock($id) {
- global $conf;
-
- $lock = $conf['lockdir'].'/_subscr_'.md5($id).'.lock';
-
- if(is_dir($lock) && time() - @filemtime($lock) > 60 * 5) {
- // looks like a stale lock - remove it
- @rmdir($lock);
- }
-
- // try creating the lock directory
- if(!@mkdir($lock, $conf['dmode'])) {
- return false;
- }
-
- if(!empty($conf['dperm'])) chmod($lock, $conf['dperm']);
- return true;
- }
-
- /**
- * Unlock subscription info
- *
- * @author Adrian Lang <lang@cosmocode.de>
- * @param string $id The target page or namespace, specified by id; Namespaces
- * are identified by appending a colon.
- * @return bool
- */
- protected function unlock($id) {
- global $conf;
- $lock = $conf['lockdir'].'/_subscr_'.md5($id).'.lock';
- return @rmdir($lock);
- }
-
- /**
- * Construct a regular expression for parsing a subscription definition line
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string|array $user
- * @param string|array $style
- * @param string|array $data
- * @return string complete regexp including delimiters
- * @throws Exception when no data is passed
- */
- protected function buildregex($user = null, $style = null, $data = null) {
- // always work with arrays
- $user = (array) $user;
- $style = (array) $style;
- $data = (array) $data;
-
- // clean
- $user = array_filter(array_map('trim', $user));
- $style = array_filter(array_map('trim', $style));
- $data = array_filter(array_map('trim', $data));
-
- // user names are encoded
- $user = array_map('auth_nameencode', $user);
-
- // quote
- $user = array_map('preg_quote_cb', $user);
- $style = array_map('preg_quote_cb', $style);
- $data = array_map('preg_quote_cb', $data);
-
- // join
- $user = join('|', $user);
- $style = join('|', $style);
- $data = join('|', $data);
-
- // any data at all?
- if($user.$style.$data === '') throw new Exception('no data passed');
-
- // replace empty values, set which ones are optional
- $sopt = '';
- $dopt = '';
- if($user === '') {
- $user = '\S+';
- }
- if($style === '') {
- $style = '\S+';
- $sopt = '?';
- }
- if($data === '') {
- $data = '\S+';
- $dopt = '?';
- }
-
- // assemble
- return "/^($user)(?:\\s+($style))$sopt(?:\\s+($data))$dopt$/";
- }
-
- /**
- * Recursively search for matching subscriptions
- *
- * This function searches all relevant subscription files for a page or
- * namespace.
- *
- * @author Adrian Lang <lang@cosmocode.de>
- *
- * @param string $page The target object’s (namespace or page) id
- * @param string|array $user
- * @param string|array $style
- * @param string|array $data
- * @return array
- */
- public function subscribers($page, $user = null, $style = null, $data = null) {
- if(!$this->isenabled()) return array();
-
- // Construct list of files which may contain relevant subscriptions.
- $files = array(':' => $this->file(':'));
- do {
- $files[$page] = $this->file($page);
- $page = getNS(rtrim($page, ':')).':';
- } while($page !== ':');
-
- $re = $this->buildregex($user, $style, $data);
-
- // Handle files.
- $result = array();
- foreach($files as $target => $file) {
- if(!file_exists($file)) continue;
-
- $lines = file($file);
- foreach($lines as $line) {
- // fix old style subscription files
- if(strpos($line, ' ') === false) $line = trim($line)." every\n";
-
- // check for matching entries
- if(!preg_match($re, $line, $m)) continue;
-
- $u = rawurldecode($m[1]); // decode the user name
- if(!isset($result[$target])) $result[$target] = array();
- $result[$target][$u] = array($m[2], $m[3]); // add to result
- }
- }
- return array_reverse($result);
- }
-
- /**
- * Adds a new subscription for the given page or namespace
- *
- * This will automatically overwrite any existent subscription for the given user on this
- * *exact* page or namespace. It will *not* modify any subscription that may exist in higher namespaces.
- *
- * @param string $id The target page or namespace, specified by id; Namespaces
- * are identified by appending a colon.
- * @param string $user
- * @param string $style
- * @param string $data
- * @throws Exception when user or style is empty
- * @return bool
- */
- public function add($id, $user, $style, $data = '') {
- if(!$this->isenabled()) return false;
-
- // delete any existing subscription
- $this->remove($id, $user);
-
- $user = auth_nameencode(trim($user));
- $style = trim($style);
- $data = trim($data);
-
- if(!$user) throw new Exception('no subscription user given');
- if(!$style) throw new Exception('no subscription style given');
- if(!$data) $data = time(); //always add current time for new subscriptions
-
- $line = "$user $style $data\n";
- $file = $this->file($id);
- return io_saveFile($file, $line, true);
- }
-
- /**
- * Removes a subscription for the given page or namespace
- *
- * This removes all subscriptions matching the given criteria on the given page or
- * namespace. It will *not* modify any subscriptions that may exist in higher
- * namespaces.
- *
- * @param string $id The target object’s (namespace or page) id
- * @param string|array $user
- * @param string|array $style
- * @param string|array $data
- * @return bool
- */
- public function remove($id, $user = null, $style = null, $data = null) {
- if(!$this->isenabled()) return false;
-
- $file = $this->file($id);
- if(!file_exists($file)) return true;
-
- $re = $this->buildregex($user, $style, $data);
- return io_deleteFromFile($file, $re, true);
- }
-
- /**
- * Get data for $INFO['subscribed']
- *
- * $INFO['subscribed'] is either false if no subscription for the current page
- * and user is in effect. Else it contains an array of arrays with the fields
- * “target”, “style”, and optionally “data”.
- *
- * @param string $id Page ID, defaults to global $ID
- * @param string $user User, defaults to $_SERVER['REMOTE_USER']
- * @return array
- * @author Adrian Lang <lang@cosmocode.de>
- */
- function user_subscription($id = '', $user = '') {
- if(!$this->isenabled()) return false;
-
- global $ID;
- /** @var Input $INPUT */
- global $INPUT;
- if(!$id) $id = $ID;
- if(!$user) $user = $INPUT->server->str('REMOTE_USER');
-
- $subs = $this->subscribers($id, $user);
- if(!count($subs)) return false;
-
- $result = array();
- foreach($subs as $target => $info) {
- $result[] = array(
- 'target' => $target,
- 'style' => $info[$user][0],
- 'data' => $info[$user][1]
- );
- }
-
- return $result;
- }
-
- /**
- * Send digest and list subscriptions
- *
- * This sends mails to all subscribers that have a subscription for namespaces above
- * the given page if the needed $conf['subscribe_time'] has passed already.
- *
- * This function is called form lib/exe/indexer.php
- *
- * @param string $page
- * @return int number of sent mails
- */
- public function send_bulk($page) {
- if(!$this->isenabled()) return 0;
-
- /** @var DokuWiki_Auth_Plugin $auth */
- global $auth;
- global $conf;
- global $USERINFO;
- /** @var Input $INPUT */
- global $INPUT;
- $count = 0;
-
- $subscriptions = $this->subscribers($page, null, array('digest', 'list'));
-
- // remember current user info
- $olduinfo = $USERINFO;
- $olduser = $INPUT->server->str('REMOTE_USER');
-
- foreach($subscriptions as $target => $users) {
- if(!$this->lock($target)) continue;
-
- foreach($users as $user => $info) {
- list($style, $lastupdate) = $info;
-
- $lastupdate = (int) $lastupdate;
- if($lastupdate + $conf['subscribe_time'] > time()) {
- // Less than the configured time period passed since last
- // update.
- continue;
- }
-
- // Work as the user to make sure ACLs apply correctly
- $USERINFO = $auth->getUserData($user);
- $INPUT->server->set('REMOTE_USER',$user);
- if($USERINFO === false) continue;
- if(!$USERINFO['mail']) continue;
-
- if(substr($target, -1, 1) === ':') {
- // subscription target is a namespace, get all changes within
- $changes = getRecentsSince($lastupdate, null, getNS($target));
- } else {
- // single page subscription, check ACL ourselves
- if(auth_quickaclcheck($target) < AUTH_READ) continue;
- $meta = p_get_metadata($target);
- $changes = array($meta['last_change']);
- }
-
- // Filter out pages only changed in small and own edits
- $change_ids = array();
- foreach($changes as $rev) {
- $n = 0;
- while(!is_null($rev) && $rev['date'] >= $lastupdate &&
- ($INPUT->server->str('REMOTE_USER') === $rev['user'] ||
- $rev['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT)) {
- $pagelog = new PageChangeLog($rev['id']);
- $rev = $pagelog->getRevisions($n++, 1);
- $rev = (count($rev) > 0) ? $rev[0] : null;
- }
-
- if(!is_null($rev) && $rev['date'] >= $lastupdate) {
- // Some change was not a minor one and not by myself
- $change_ids[] = $rev['id'];
- }
- }
-
- // send it
- if($style === 'digest') {
- foreach($change_ids as $change_id) {
- $this->send_digest(
- $USERINFO['mail'], $change_id,
- $lastupdate
- );
- $count++;
- }
- } elseif($style === 'list') {
- $this->send_list($USERINFO['mail'], $change_ids, $target);
- $count++;
- }
- // TODO: Handle duplicate subscriptions.
-
- // Update notification time.
- $this->add($target, $user, $style, time());
- }
- $this->unlock($target);
- }
-
- // restore current user info
- $USERINFO = $olduinfo;
- $INPUT->server->set('REMOTE_USER',$olduser);
- return $count;
- }
-
- /**
- * Send the diff for some page change
- *
- * @param string $subscriber_mail The target mail address
- * @param string $template Mail template ('subscr_digest', 'subscr_single', 'mailtext', ...)
- * @param string $id Page for which the notification is
- * @param int|null $rev Old revision if any
- * @param string $summary Change summary if any
- * @return bool true if successfully sent
- */
- public function send_diff($subscriber_mail, $template, $id, $rev = null, $summary = '') {
- global $DIFF_INLINESTYLES;
-
- // prepare replacements (keys not set in hrep will be taken from trep)
- $trep = array(
- 'PAGE' => $id,
- 'NEWPAGE' => wl($id, '', true, '&'),
- 'SUMMARY' => $summary,
- 'SUBSCRIBE' => wl($id, array('do' => 'subscribe'), true, '&')
- );
- $hrep = array();
-
- if($rev) {
- $subject = 'changed';
- $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;
- $df = new Diff(explode("\n", $old_content),
- explode("\n", $new_content));
- $dformat = new InlineDiffFormatter();
- $hdiff = $dformat->format($df);
- $hdiff = '<table>'.$hdiff.'</table>';
- $DIFF_INLINESTYLES = false;
- } else {
- $subject = 'newpage';
- $trep['OLDPAGE'] = '---';
- $tdiff = rawWiki($id);
- $hdiff = nl2br(hsc($tdiff));
- }
-
- $trep['DIFF'] = $tdiff;
- $hrep['DIFF'] = $hdiff;
-
- $headers = array('Message-Id' => $this->getMessageID($id));
- if ($rev) {
- $headers['In-Reply-To'] = $this->getMessageID($id, $rev);
- }
-
- return $this->send(
- $subscriber_mail, $subject, $id,
- $template, $trep, $hrep, $headers
- );
- }
-
- /**
- * Send the diff for some media change
- *
- * @fixme this should embed thumbnails of images in HTML version
- *
- * @param string $subscriber_mail The target mail address
- * @param string $template Mail template ('uploadmail', ...)
- * @param string $id Media file for which the notification is
- * @param int|bool $rev Old revision if any
- */
- public function send_media_diff($subscriber_mail, $template, $id, $rev = false) {
- global $conf;
-
- $file = mediaFN($id);
- list($mime, /* $ext */) = mimetype($id);
-
- $trep = array(
- 'MIME' => $mime,
- 'MEDIA' => ml($id,'',true,'&',true),
- 'SIZE' => filesize_h(filesize($file)),
- );
-
- if ($rev && $conf['mediarevisions']) {
- $trep['OLD'] = ml($id, "rev=$rev", true, '&', true);
- } else {
- $trep['OLD'] = '---';
- }
-
- $headers = array('Message-Id' => $this->getMessageID($id, @filemtime($file)));
- if ($rev) {
- $headers['In-Reply-To'] = $this->getMessageID($id, $rev);
- }
-
- $this->send($subscriber_mail, 'upload', $id, $template, $trep, null, $headers);
-
- }
-
- /**
- * Send a notify mail on new registration
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string $login login name of the new user
- * @param string $fullname full name of the new user
- * @param string $email email address of the new user
- * @return bool true if a mail was sent
- */
- public function send_register($login, $fullname, $email) {
- global $conf;
- if(empty($conf['registernotify'])) return false;
-
- $trep = array(
- 'NEWUSER' => $login,
- 'NEWNAME' => $fullname,
- 'NEWEMAIL' => $email,
- );
-
- return $this->send(
- $conf['registernotify'],
- 'new_user',
- $login,
- 'registermail',
- $trep
- );
- }
-
- /**
- * Send a digest mail
- *
- * Sends a digest mail showing a bunch of changes of a single page. Basically the same as send_diff()
- * but determines the last known revision first
- *
- * @author Adrian Lang <lang@cosmocode.de>
- *
- * @param string $subscriber_mail The target mail address
- * @param string $id The ID
- * @param int $lastupdate Time of the last notification
- * @return bool
- */
- protected function send_digest($subscriber_mail, $id, $lastupdate) {
- $pagelog = new PageChangeLog($id);
- $n = 0;
- do {
- $rev = $pagelog->getRevisions($n++, 1);
- $rev = (count($rev) > 0) ? $rev[0] : null;
- } while(!is_null($rev) && $rev > $lastupdate);
-
- return $this->send_diff(
- $subscriber_mail,
- 'subscr_digest',
- $id, $rev
- );
- }
-
- /**
- * Send a list mail
- *
- * 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
- * @return bool true if a mail was sent
- */
- protected function send_list($subscriber_mail, $ids, $ns_id) {
- if(count($ids) === 0) return false;
-
- $tlist = '';
- $hlist = '<ul>';
- foreach($ids as $id) {
- $link = wl($id, array(), true);
- $tlist .= '* '.$link.NL;
- $hlist .= '<li><a href="'.$link.'">'.hsc($id).'</a></li>'.NL;
- }
- $hlist .= '</ul>';
-
- $id = prettyprint_id($ns_id);
- $trep = array(
- 'DIFF' => rtrim($tlist),
- 'PAGE' => $id,
- 'SUBSCRIBE' => wl($id, array('do' => 'subscribe'), true, '&')
- );
- $hrep = array(
- 'DIFF' => $hlist
- );
-
- return $this->send(
- $subscriber_mail,
- 'subscribe_list',
- $ns_id,
- 'subscr_list', $trep, $hrep
- );
- }
-
- /**
- * Helper function for sending a mail
- *
- * @author Adrian Lang <lang@cosmocode.de>
- *
- * @param string $subscriber_mail The target mail address
- * @param string $subject The lang id of the mail subject (without the
- * prefix “mail_”)
- * @param string $context The context of this mail, eg. page or namespace id
- * @param string $template The name of the mail template
- * @param array $trep Predefined parameters used to parse the
- * template (in text format)
- * @param array $hrep Predefined parameters used to parse the
- * template (in HTML format), null to default to $trep
- * @param array $headers Additional mail headers in the form 'name' => 'value'
- * @return bool
- */
- protected function send($subscriber_mail, $subject, $context, $template, $trep, $hrep = null, $headers = array()) {
- global $lang;
- global $conf;
-
- $text = rawLocale($template);
- $subject = $lang['mail_'.$subject].' '.$context;
- $mail = new Mailer();
- $mail->bcc($subscriber_mail);
- $mail->subject($subject);
- $mail->setBody($text, $trep, $hrep);
- if(in_array($template, array('subscr_list', 'subscr_digest'))){
- $mail->from($conf['mailfromnobody']);
- }
- if(isset($trep['SUBSCRIBE'])) {
- $mail->setHeader('List-Unsubscribe', '<'.$trep['SUBSCRIBE'].'>', false);
- }
-
- foreach ($headers as $header => $value) {
- $mail->setHeader($header, $value);
- }
-
- return $mail->send();
- }
-
- /**
- * Get a valid message id for a certain $id and revision (or the current revision)
- *
- * @param string $id The id of the page (or media file) the message id should be for
- * @param string $rev The revision of the page, set to the current revision of the page $id if not set
- * @return string
- */
- protected function getMessageID($id, $rev = null) {
- static $listid = null;
- if (is_null($listid)) {
- $server = parse_url(DOKU_URL, PHP_URL_HOST);
- $listid = join('.', array_reverse(explode('/', DOKU_BASE))).$server;
- $listid = urlencode($listid);
- $listid = strtolower(trim($listid, '.'));
- }
-
- if (is_null($rev)) {
- $rev = @filemtime(wikiFN($id));
- }
-
- return "<$id?rev=$rev@$listid>";
- }
-
- /**
- * Default callback for COMMON_NOTIFY_ADDRESSLIST
- *
- * Aggregates all email addresses of user who have subscribed the given page with 'every' style
- *
- * @author Steven Danz <steven-danz@kc.rr.com>
- * @author Adrian Lang <lang@cosmocode.de>
- *
- * @todo move the whole functionality into this class, trigger SUBSCRIPTION_NOTIFY_ADDRESSLIST instead,
- * use an array for the addresses within it
- *
- * @param array &$data Containing the entries:
- * - $id (the page id),
- * - $self (whether the author should be notified,
- * - $addresslist (current email address list)
- * - $replacements (array of additional string substitutions, @KEY@ to be replaced by value)
- */
- public function notifyaddresses(&$data) {
- if(!$this->isenabled()) return;
-
- /** @var DokuWiki_Auth_Plugin $auth */
- global $auth;
- global $conf;
- /** @var Input $INPUT */
- global $INPUT;
-
- $id = $data['id'];
- $self = $data['self'];
- $addresslist = $data['addresslist'];
-
- $subscriptions = $this->subscribers($id, null, 'every');
-
- $result = array();
- foreach($subscriptions as $target => $users) {
- foreach($users as $user => $info) {
- $userinfo = $auth->getUserData($user);
- if($userinfo === false) continue;
- if(!$userinfo['mail']) continue;
- if(!$self && $user == $INPUT->server->str('REMOTE_USER')) continue; //skip our own changes
-
- $level = auth_aclcheck($id, $user, $userinfo['grps']);
- if($level >= AUTH_READ) {
- if(strcasecmp($userinfo['mail'], $conf['notify']) != 0) { //skip user who get notified elsewhere
- $result[$user] = $userinfo['mail'];
- }
- }
- }
- }
- $data['addresslist'] = trim($addresslist.','.implode(',', $result), ',');
- }
-}
diff --git a/inc/template.php b/inc/template.php
index cdc7ca083..035c5ca3d 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -6,7 +6,8 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) die('meh.');
+use dokuwiki\Extension\AdminPlugin;
+use dokuwiki\Extension\Event;
/**
* Access a template file
@@ -80,9 +81,9 @@ function tpl_content($prependTOC = true) {
$INFO['prependTOC'] = $prependTOC;
ob_start();
- trigger_event('TPL_ACT_RENDER', $ACT, 'tpl_content_core');
+ Event::createAndTrigger('TPL_ACT_RENDER', $ACT, 'tpl_content_core');
$html_output = ob_get_clean();
- trigger_event('TPL_CONTENT_DISPLAY', $html_output, 'ptln');
+ Event::createAndTrigger('TPL_CONTENT_DISPLAY', $html_output, 'ptln');
return !empty($html_output);
}
@@ -142,14 +143,14 @@ function tpl_toc($return = false) {
}
} elseif($ACT == 'admin') {
// try to load admin plugin TOC
- /** @var $plugin DokuWiki_Admin_Plugin */
+ /** @var $plugin AdminPlugin */
if ($plugin = plugin_getRequestAdminPlugin()) {
$toc = $plugin->getTOC();
$TOC = $toc; // avoid later rebuild
}
}
- trigger_event('TPL_TOC_RENDER', $toc, null, false);
+ Event::createAndTrigger('TPL_TOC_RENDER', $toc, null, false);
$html = html_TOC($toc);
if($return) return $html;
echo $html;
@@ -175,7 +176,7 @@ function tpl_admin() {
if(in_array($class, $pluginlist)) {
// attempt to load the plugin
- /** @var $plugin DokuWiki_Admin_Plugin */
+ /** @var $plugin AdminPlugin */
$plugin = plugin_load('admin', $class);
}
}
@@ -247,7 +248,7 @@ function tpl_metaheaders($alt = true) {
}
$styleUtil = new \dokuwiki\StyleUtils();
- $styleIni = $styleUtil->cssStyleini($conf['template']);
+ $styleIni = $styleUtil->cssStyleini();
$replacements = $styleIni['replacements'];
if (!empty($replacements['__theme_color__'])) {
$head['meta'][] = array('name' => 'theme-color', 'content' => $replacements['__theme_color__']);
@@ -262,7 +263,7 @@ function tpl_metaheaders($alt = true) {
$head['link'][] = array(
'rel' => 'alternate', 'type'=> 'application/rss+xml',
'title'=> $lang['currentns'],
- 'href' => DOKU_BASE.'feed.php?mode=list&ns='.$INFO['namespace']
+ 'href' => DOKU_BASE.'feed.php?mode=list&ns='.(isset($INFO) ? $INFO['namespace'] : '')
);
}
if(($ACT == 'show' || $ACT == 'search') && $INFO['writable']) {
@@ -331,34 +332,36 @@ function tpl_metaheaders($alt = true) {
// load stylesheets
$head['link'][] = array(
- 'rel' => 'stylesheet', 'type'=> 'text/css',
+ 'rel' => 'stylesheet',
'href'=> DOKU_BASE.'lib/exe/css.php?t='.rawurlencode($conf['template']).'&tseed='.$tseed
);
- $script = "var NS='".$INFO['namespace']."';";
+ $script = "var NS='".(isset($INFO)?$INFO['namespace']:'')."';";
if($conf['useacl'] && $INPUT->server->str('REMOTE_USER')) {
$script .= "var SIG=".toolbar_signature().";";
}
jsinfo();
$script .= 'var JSINFO = ' . json_encode($JSINFO).';';
- $head['script'][] = array('type'=> 'text/javascript', '_data'=> $script);
+ $head['script'][] = array('_data'=> $script);
// load jquery
$jquery = getCdnUrls();
foreach($jquery as $src) {
$head['script'][] = array(
- 'type' => 'text/javascript', 'charset' => 'utf-8', '_data' => '', 'src' => $src
- );
+ 'charset' => 'utf-8',
+ '_data' => '',
+ 'src' => $src,
+ ) + ($conf['defer_js'] ? [ 'defer' => 'defer'] : []);
}
// load our javascript dispatcher
$head['script'][] = array(
- 'type'=> 'text/javascript', 'charset'=> 'utf-8', '_data'=> '',
- 'src' => DOKU_BASE.'lib/exe/js.php'.'?t='.rawurlencode($conf['template']).'&tseed='.$tseed
- );
+ 'charset'=> 'utf-8', '_data'=> '',
+ 'src' => DOKU_BASE.'lib/exe/js.php'.'?t='.rawurlencode($conf['template']).'&tseed='.$tseed,
+ ) + ($conf['defer_js'] ? [ 'defer' => 'defer'] : []);
// trigger event here
- trigger_event('TPL_METAHEADER_OUTPUT', $head, '_tpl_metaheaders_action', true);
+ Event::createAndTrigger('TPL_METAHEADER_OUTPUT', $head, '_tpl_metaheaders_action', true);
return true;
}
@@ -603,7 +606,7 @@ function tpl_get_action($type) {
$unknown = true;
}
- $evt = new Doku_Event('TPL_ACTION_GET', $data);
+ $evt = new Event('TPL_ACTION_GET', $data);
if($evt->advise_before()) {
//handle unknown types
if($unknown) {
@@ -702,7 +705,7 @@ function tpl_searchform($ajax = true, $autocomplete = true) {
$searchForm->addTagClose('div');
}
$searchForm->addTagClose('div');
- trigger_event('FORM_QUICKSEARCH_OUTPUT', $searchForm);
+ Event::createAndTrigger('FORM_QUICKSEARCH_OUTPUT', $searchForm);
echo $searchForm->toHTML();
@@ -933,7 +936,7 @@ function tpl_pagetitle($id = null, $ret = false) {
case 'admin' :
$page_title = $lang['btn_admin'];
// try to get the plugin name
- /** @var $plugin DokuWiki_Admin_Plugin */
+ /** @var $plugin AdminPlugin */
if ($plugin = plugin_getRequestAdminPlugin()){
$plugin_title = $plugin->getMenuText($conf['lang']);
$page_title = $plugin_title ? $plugin_title : $plugin->getPluginName();
@@ -956,6 +959,7 @@ function tpl_pagetitle($id = null, $ret = false) {
// page functions
case 'edit' :
+ case 'preview' :
$page_title = "✎ ".$name;
break;
@@ -1138,7 +1142,7 @@ function tpl_img($maxwidth = 0, $maxheight = 0, $link = true, $params = null) {
$p['src'] = $src;
$data = array('url'=> ($link ? $url : null), 'params'=> $p);
- return trigger_event('TPL_IMG_DISPLAY', $data, '_tpl_img_action', true);
+ return Event::createAndTrigger('TPL_IMG_DISPLAY', $data, '_tpl_img_action', true);
}
/**
@@ -1169,7 +1173,7 @@ function tpl_indexerWebBug() {
global $ID;
$p = array();
- $p['src'] = DOKU_BASE.'lib/exe/indexer.php?id='.rawurlencode($ID).
+ $p['src'] = DOKU_BASE.'lib/exe/taskrunner.php?id='.rawurlencode($ID).
'&'.time();
$p['width'] = 2; //no more 1x1 px image because we live in times of ad blockers...
$p['height'] = 1;
@@ -1343,7 +1347,7 @@ function tpl_mediaContent($fromajax = false, $sort='natural') {
// 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);
+ $evt = new Event('MEDIAMANAGER_CONTENT_OUTPUT', $data);
if($evt->advise_before()) {
$do = $data['do'];
if($do == 'filesinuse') {
@@ -1422,7 +1426,11 @@ function tpl_mediaFileDetails($image, $rev) {
/** @var Input $INPUT */
global $INPUT;
- $removed = (!file_exists(mediaFN($image)) && file_exists(mediaMetaFN($image, '.changes')) && $conf['mediarevisions']);
+ $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;
$ns = getNS($image);
@@ -1450,7 +1458,8 @@ function tpl_mediaFileDetails($image, $rev) {
$class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext);
$class = 'select mediafile mf_'.$class;
$attributes = $rev ? ['rev' => $rev] : [];
- $tabTitle = '<strong><a href="'.ml($image, $attributes).'" class="'.$class.'" title="'.$lang['mediaview'].'">'.$image.'</a>'.'</strong>';
+ $tabTitle = '<strong><a href="'.ml($image, $attributes).'" class="'.$class.'" title="'.$lang['mediaview'].'">'.
+ $image.'</a>'.'</strong>';
if($opened_tab === 'view' && $rev) {
printf($lang['media_viewold'], $tabTitle, dformat($rev));
} else {
@@ -1658,7 +1667,7 @@ function tpl_subscribe() {
* @author Andreas Gohr <andi@splitbrain.org>
*/
function tpl_flush() {
- ob_flush();
+ if( ob_get_level() > 0 ) ob_flush();
flush();
}
@@ -1669,13 +1678,14 @@ function tpl_flush() {
* file, otherwise it is assumed to be relative to the current template
*
* @param string[] $search locations to look at
- * @param bool $abs if to use absolute URL
- * @param array &$imginfo filled with getimagesize()
+ * @param bool $abs if to use absolute URL
+ * @param array &$imginfo filled with getimagesize()
+ * @param bool $fallback use fallback image if target isn't found or return 'false' if potential false result is required
* @return string
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_getMediaFile($search, $abs = false, &$imginfo = null) {
+function tpl_getMediaFile($search, $abs = false, &$imginfo = null, $fallback = true) {
$img = '';
$file = '';
$ismedia = false;
@@ -1692,6 +1702,17 @@ function tpl_getMediaFile($search, $abs = false, &$imginfo = null) {
if(file_exists($file)) break;
}
+ // manage non existing target
+ if(!file_exists($file)) {
+ // give result for fallback image
+ if ($fallback === true) {
+ $file = DOKU_INC.'lib/images/blank.gif';
+ // stop process if false result is required (if $fallback is false)
+ } else {
+ return false;
+ }
+ }
+
// fetch image data if requested
if(!is_null($imginfo)) {
$imginfo = getimagesize($file);
@@ -1839,7 +1860,7 @@ function tpl_classes() {
'mode_'.$ACT,
'tpl_'.$conf['template'],
$INPUT->server->bool('REMOTE_USER') ? 'loggedIn' : '',
- $INFO['exists'] ? '' : 'notFound',
+ (isset($INFO) && $INFO['exists']) ? '' : 'notFound',
($ID == $conf['start']) ? 'home' : '',
);
return join(' ', $classes);
@@ -1862,7 +1883,7 @@ function tpl_toolsevent($toolsname, $items, $view = 'main') {
);
$hook = 'TEMPLATE_' . strtoupper($toolsname) . '_DISPLAY';
- $evt = new Doku_Event($hook, $data);
+ $evt = new Event($hook, $data);
if($evt->advise_before()) {
foreach($evt->data['items'] as $k => $html) echo $html;
}
diff --git a/inc/toolbar.php b/inc/toolbar.php
index 2eaf38efc..7151202f2 100644
--- a/inc/toolbar.php
+++ b/inc/toolbar.php
@@ -4,9 +4,7 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
- */
-
-if(!defined('DOKU_INC')) die('meh.');
+ */use dokuwiki\Extension\Event;
/**
* Prepares and prints an JavaScript array with all toolbar buttons
@@ -20,7 +18,7 @@ function toolbar_JSdefines($varname){
$menu = array();
- $evt = new Doku_Event('TOOLBAR_DEFINE', $menu);
+ $evt = new Event('TOOLBAR_DEFINE', $menu);
if ($evt->advise_before()){
// build button array
@@ -213,7 +211,30 @@ function toolbar_JSdefines($varname){
'type' => 'picker',
'title' => $lang['qb_chars'],
'icon' => 'chars.png',
- 'list' => explode(' ','À à Á á  â à ã Ä ä Ǎ ǎ Ă ă Å å Ā ā Ą ą Æ æ Ć ć Ç ç Č č Ĉ ĉ Ċ ċ Ð đ ð Ď ď È è É é Ê ê Ë ë Ě ě Ē ē Ė ė Ę ę Ģ ģ Ĝ ĝ Ğ ğ Ġ ġ Ĥ ĥ Ì ì Í í Î î Ï ï Ǐ ǐ Ī ī İ ı Į į Ĵ ĵ Ķ ķ Ĺ ĺ Ļ ļ Ľ ľ Ł ł Ŀ ŀ Ń ń Ñ ñ Ņ ņ Ň ň Ò ò Ó ó Ô ô Õ õ Ö ö Ǒ ǒ Ō ō Ő ő Œ œ Ø ø Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ş ş Š š Ŝ ŝ Ţ ţ Ť ť Ù ù Ú ú Û û Ü ü Ǔ ǔ Ŭ ŭ Ū ū Ů ů ǖ ǘ ǚ ǜ Ų ų Ű ű Ŵ ŵ Ý ý Ÿ ÿ Ŷ ŷ Ź ź Ž ž Ż ż Þ þ ß Ħ ħ ¿ ¡ ¢ £ ¤ ¥ € ¦ § ª ¬ ¯ ° ± ÷ ‰ ¼ ½ ¾ ¹ ² ³ µ ¶ † ‡ · • º ∀ ∂ ∃ Ə ə ∅ ∇ ∈ ∉ ∋ ∏ ∑ ‾ − ∗ × ⁄ √ ∝ ∞ ∠ ∧ ∨ ∩ ∪ ∫ ∴ ∼ ≅ ≈ ≠ ≡ ≤ ≥ ⊂ ⊃ ⊄ ⊆ ⊇ ⊕ ⊗ ⊥ ⋅ ◊ ℘ ℑ ℜ ℵ ♠ ♣ ♥ ♦ α β Γ γ Δ δ ε ζ η Θ θ ι κ Λ λ μ Ξ ξ Π π ρ Σ σ Τ τ υ Φ φ χ Ψ ψ Ω ω ★ ☆ ☎ ☚ ☛ ☜ ☝ ☞ ☟ ☹ ☺ ✔ ✘ „ “ ” ‚ ‘ ’ « » ‹ › — – … ← ↑ → ↓ ↔ ⇐ ⇑ ⇒ ⇓ ⇔ © ™ ® ′ ″ [ ] { } ~ ( ) % § $ # | @'),
+ 'list' => [
+ 'À', 'à', 'Á', 'á', 'Â', 'â', 'Ã', 'ã', 'Ä', 'ä', 'Ǎ', 'ǎ', 'Ă', 'ă', 'Å', 'å',
+ 'Ā', 'ā', 'Ą', 'ą', 'Æ', 'æ', 'Ć', 'ć', 'Ç', 'ç', 'Č', 'č', 'Ĉ', 'ĉ', 'Ċ', 'ċ',
+ 'Ð', 'đ', 'ð', 'Ď', 'ď', 'È', 'è', 'É', 'é', 'Ê', 'ê', 'Ë', 'ë', 'Ě', 'ě', 'Ē',
+ 'ē', 'Ė', 'ė', 'Ę', 'ę', 'Ģ', 'ģ', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ĥ', 'ĥ', 'Ì',
+ 'ì', 'Í', 'í', 'Î', 'î', 'Ï', 'ï', 'Ǐ', 'ǐ', 'Ī', 'ī', 'İ', 'ı', 'Į', 'į', 'Ĵ',
+ 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ł', 'ł', 'Ŀ', 'ŀ', 'Ń', 'ń', 'Ñ',
+ 'ñ', 'Ņ', 'ņ', 'Ň', 'ň', 'Ò', 'ò', 'Ó', 'ó', 'Ô', 'ô', 'Õ', 'õ', 'Ö', 'ö', 'Ǒ',
+ 'ǒ', 'Ō', 'ō', 'Ő', 'ő', 'Œ', 'œ', 'Ø', 'ø', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś',
+ 'ś', 'Ş', 'ş', 'Š', 'š', 'Ŝ', 'ŝ', 'Ţ', 'ţ', 'Ť', 'ť', 'Ù', 'ù', 'Ú', 'ú', 'Û',
+ 'û', 'Ü', 'ü', 'Ǔ', 'ǔ', 'Ŭ', 'ŭ', 'Ū', 'ū', 'Ů', 'ů', 'ǖ', 'ǘ', 'ǚ', 'ǜ', 'Ų',
+ 'ų', 'Ű', 'ű', 'Ŵ', 'ŵ', 'Ý', 'ý', 'Ÿ', 'ÿ', 'Ŷ', 'ŷ', 'Ź', 'ź', 'Ž', 'ž', 'Ż',
+ 'ż', 'Þ', 'þ', 'ß', 'Ħ', 'ħ', '¿', '¡', '¢', '£', '¤', '¥', '€', '¦', '§', 'ª',
+ '¬', '¯', '°', '±', '÷', '‰', '¼', '½', '¾', '¹', '²', '³', 'µ', '¶', '†', '‡',
+ '·', '•', 'º', '∀', '∂', '∃', 'Ə', 'ə', '∅', '∇', '∈', '∉', '∋', '∏', '∑', '‾',
+ '−', '∗', '×', '⁄', '√', '∝', '∞', '∠', '∧', '∨', '∩', '∪', '∫', '∴', '∼', '≅',
+ '≈', '≠', '≡', '≤', '≥', '⊂', '⊃', '⊄', '⊆', '⊇', '⊕', '⊗', '⊥', '⋅', '◊', '℘',
+ 'ℑ', 'ℜ', 'ℵ', '♠', '♣', '♥', '♦', 'α', 'β', 'Γ', 'γ', 'Δ', 'δ', 'ε', 'ζ', 'η',
+ 'Θ', 'θ', 'ι', 'κ', 'Λ', 'λ', 'μ', 'Ξ', 'ξ', 'Π', 'π', 'ρ', 'Σ', 'σ', 'Τ', 'τ',
+ 'υ', 'Φ', 'φ', 'χ', 'Ψ', 'ψ', 'Ω', 'ω', '★', '☆', '☎', '☚', '☛', '☜', '☝', '☞',
+ '☟', '☹', '☺', '✔', '✘', '„', '“', '”', '‚', '‘', '’', '«', '»', '‹', '›', '—',
+ '–', '…', '←', '↑', '→', '↓', '↔', '⇐', '⇑', '⇒', '⇓', '⇔', '©', '™', '®', '′',
+ '″', '[', ']', '{', '}', '~', '(', ')', '%', '§', '$', '#', '|', '@'
+ ],
'block' => false
),
array(
@@ -229,8 +250,7 @@ function toolbar_JSdefines($varname){
unset($evt);
// use JSON to build the JavaScript array
- $json = new JSON();
- print "var $varname = ".$json->encode($menu).";\n";
+ print "var $varname = ".json_encode($menu).";\n";
}
/**
@@ -250,7 +270,7 @@ function toolbar_signature(){
$sig = str_replace('@NAME@',$INFO['userinfo']['name'],$sig);
$sig = str_replace('@MAIL@',$INFO['userinfo']['mail'],$sig);
$sig = str_replace('@DATE@',dformat(),$sig);
- $sig = str_replace('\\\\n','\\n',addslashes($sig));
+ $sig = str_replace('\\\\n','\\n',$sig);
return json_encode($sig);
}
diff --git a/inc/utf8.php b/inc/utf8.php
index 4de287429..1227407bf 100644
--- a/inc/utf8.php
+++ b/inc/utf8.php
@@ -2,18 +2,25 @@
/**
* UTF8 helper functions
*
- * @license LGPL 2.1 (http://www.gnu.org/copyleft/lesser.html)
+ * This file now only intitializes the UTF-8 capability detection and defines helper
+ * functions if needed. All actual code is in the \dokuwiki\Utf8 classes
+ *
* @author Andreas Gohr <andi@splitbrain.org>
*/
+use dokuwiki\Utf8\Clean;
+use dokuwiki\Utf8\Conversion;
+use dokuwiki\Utf8\PhpString;
+use dokuwiki\Utf8\Unicode;
+
/**
* check for mb_string support
*/
-if(!defined('UTF8_MBSTRING')){
- if(function_exists('mb_substr') && !defined('UTF8_NOMBSTRING')){
- define('UTF8_MBSTRING',1);
- }else{
- define('UTF8_MBSTRING',0);
+if (!defined('UTF8_MBSTRING')) {
+ if (function_exists('mb_substr') && !defined('UTF8_NOMBSTRING')) {
+ define('UTF8_MBSTRING', 1);
+ } else {
+ define('UTF8_MBSTRING', 0);
}
}
@@ -22,8 +29,8 @@ if(!defined('UTF8_MBSTRING')){
*
* Without this many of the functions below will not work, so this is a minimal requirement
*/
-if(!defined('UTF8_PREGSUPPORT')){
- define('UTF8_PREGSUPPORT', (bool) @preg_match('/^.$/u', 'ñ'));
+if (!defined('UTF8_PREGSUPPORT')) {
+ define('UTF8_PREGSUPPORT', (bool)@preg_match('/^.$/u', 'ñ'));
}
/**
@@ -31,1741 +38,247 @@ if(!defined('UTF8_PREGSUPPORT')){
*
* This is not required for the functions below, but might be needed in a UTF-8 aware application
*/
-if(!defined('UTF8_PROPERTYSUPPORT')){
- define('UTF8_PROPERTYSUPPORT', (bool) @preg_match('/^\pL$/u', 'ñ'));
+if (!defined('UTF8_PROPERTYSUPPORT')) {
+ define('UTF8_PROPERTYSUPPORT', (bool)@preg_match('/^\pL$/u', 'ñ'));
}
-if(UTF8_MBSTRING){ mb_internal_encoding('UTF-8'); }
-
-if(!function_exists('utf8_isASCII')){
- /**
- * Checks if a string contains 7bit ASCII only
- *
- * @author Andreas Haerter <andreas.haerter@dev.mail-node.com>
- *
- * @param string $str
- * @return bool
- */
- function utf8_isASCII($str){
- return (preg_match('/(?:[^\x00-\x7F])/', $str) !== 1);
- }
-}
-
-if(!function_exists('utf8_strip')){
- /**
- * Strips all highbyte chars
- *
- * Returns a pure ASCII7 string
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string $str
- * @return string
- */
- function utf8_strip($str){
- $ascii = '';
- $len = strlen($str);
- for($i=0; $i<$len; $i++){
- if(ord($str{$i}) <128){
- $ascii .= $str{$i};
- }
- }
- return $ascii;
- }
+if (UTF8_MBSTRING) {
+ mb_internal_encoding('UTF-8');
}
-if(!function_exists('utf8_check')){
- /**
- * Tries to detect if a string is in Unicode encoding
- *
- * @author <bmorel@ssi.fr>
- * @link http://php.net/manual/en/function.utf8-encode.php
- *
- * @param string $Str
- * @return bool
- */
- function utf8_check($Str) {
- $len = strlen($Str);
- for ($i=0; $i<$len; $i++) {
- $b = ord($Str[$i]);
- if ($b < 0x80) continue; # 0bbbbbbb
- elseif (($b & 0xE0) == 0xC0) $n=1; # 110bbbbb
- elseif (($b & 0xF0) == 0xE0) $n=2; # 1110bbbb
- elseif (($b & 0xF8) == 0xF0) $n=3; # 11110bbb
- elseif (($b & 0xFC) == 0xF8) $n=4; # 111110bb
- elseif (($b & 0xFE) == 0xFC) $n=5; # 1111110b
- else return false; # Does not match any model
- for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
- if ((++$i == $len) || ((ord($Str[$i]) & 0xC0) != 0x80))
- return false;
- }
- }
- return true;
+if (!function_exists('utf8_isASCII')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_isASCII($str)
+ {
+ dbg_deprecated(Clean::class . '::isASCII()');
+ return Clean::isASCII($str);
}
}
-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_strip')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_strip($str)
+ {
+ dbg_deprecated(Clean::class . '::strip()');
+ return Clean::strip($str);
}
}
-if(!function_exists('utf8_strlen')){
- /**
- * Unicode aware replacement for strlen()
- *
- * utf8_decode() converts characters that are not in ISO-8859-1
- * to '?', which, for the purpose of counting, is alright - It's
- * even faster than mb_strlen.
- *
- * @author <chernyshevsky at hotmail dot com>
- * @see strlen()
- * @see utf8_decode()
- *
- * @param string $string
- * @return int
- */
- function utf8_strlen($string) {
- if (function_exists('utf8_decode')) {
- return strlen(utf8_decode($string));
- } elseif (UTF8_MBSTRING) {
- return mb_strlen($string, 'UTF-8');
- } elseif (function_exists('iconv_strlen')) {
- return iconv_strlen($string, 'UTF-8');
- } else {
- return strlen($string);
- }
+if (!function_exists('utf8_check')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_check($str)
+ {
+ dbg_deprecated(Clean::class . '::isUtf8()');
+ return Clean::isUtf8($str);
}
}
-if(!function_exists('utf8_substr')){
- /**
- * UTF-8 aware alternative to substr
- *
- * Return part of a string given character offset (and optionally length)
- *
- * @author Harry Fuecks <hfuecks@gmail.com>
- * @author Chris Smith <chris@jalakai.co.uk>
- *
- * @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 string
- */
- function utf8_substr($str, $offset, $length = null) {
- if(UTF8_MBSTRING){
- if( $length === null ){
- return mb_substr($str, $offset);
- }else{
- return mb_substr($str, $offset, $length);
- }
- }
-
- /*
- * Notes:
- *
- * no mb string support, so we'll use pcre regex's with 'u' flag
- * pcre only supports repetitions of less than 65536, in order to accept up to MAXINT values for
- * offset and length, we'll repeat a group of 65535 characters when needed (ok, up to MAXINT-65536)
- *
- * substr documentation states false can be returned in some cases (e.g. offset > string length)
- * mb_substr never returns false, it will return an empty string instead.
- *
- * calculating the number of characters in the string is a relatively expensive operation, so
- * we only carry it out when necessary. It isn't necessary for +ve offsets and no specified length
- */
-
- // cast parameters to appropriate types to avoid multiple notices/warnings
- $str = (string)$str; // generates E_NOTICE for PHP4 objects, but not PHP5 objects
- $offset = (int)$offset;
- if (!is_null($length)) $length = (int)$length;
-
- // handle trivial cases
- if ($length === 0) return '';
- if ($offset < 0 && $length < 0 && $length < $offset) return '';
-
- $offset_pattern = '';
- $length_pattern = '';
-
- // normalise -ve offsets (we could use a tail anchored pattern, but they are horribly slow!)
- if ($offset < 0) {
- $strlen = utf8_strlen($str); // see notes
- $offset = $strlen + $offset;
- if ($offset < 0) $offset = 0;
- }
-
- // establish a pattern for offset, a non-captured group equal in length to offset
- if ($offset > 0) {
- $Ox = (int)($offset/65535);
- $Oy = $offset%65535;
-
- if ($Ox) $offset_pattern = '(?:.{65535}){'.$Ox.'}';
- $offset_pattern = '^(?:'.$offset_pattern.'.{'.$Oy.'})';
- } else {
- $offset_pattern = '^'; // offset == 0; just anchor the pattern
- }
-
- // establish a pattern for length
- if (is_null($length)) {
- $length_pattern = '(.*)$'; // the rest of the string
- } else {
-
- if (!isset($strlen)) $strlen = utf8_strlen($str); // see notes
- if ($offset > $strlen) return ''; // another trivial case
-
- if ($length > 0) {
-
- $length = min($strlen-$offset, $length); // reduce any length that would go passed the end of the string
-
- $Lx = (int)($length/65535);
- $Ly = $length%65535;
-
- // +ve length requires ... a captured group of length characters
- if ($Lx) $length_pattern = '(?:.{65535}){'.$Lx.'}';
- $length_pattern = '('.$length_pattern.'.{'.$Ly.'})';
-
- } else if ($length < 0) {
-
- if ($length < ($offset - $strlen)) return '';
-
- $Lx = (int)((-$length)/65535);
- $Ly = (-$length)%65535;
-
- // -ve length requires ... capture everything except a group of -length characters
- // anchored at the tail-end of the string
- if ($Lx) $length_pattern = '(?:.{65535}){'.$Lx.'}';
- $length_pattern = '(.*)(?:'.$length_pattern.'.{'.$Ly.'})$';
- }
- }
-
- if (!preg_match('#'.$offset_pattern.$length_pattern.'#us',$str,$match)) return '';
- return $match[1];
+if (!function_exists('utf8_basename')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_basename($path, $suffix = '')
+ {
+ dbg_deprecated(PhpString::class . '::basename()');
+ return PhpString::basename($path, $suffix);
}
}
-if(!function_exists('utf8_substr_replace')){
- /**
- * Unicode aware replacement for substr_replace()
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @see substr_replace()
- *
- * @param string $string input string
- * @param string $replacement the replacement
- * @param int $start the replacing will begin at the start'th offset into string.
- * @param int $length If given and is positive, it represents the length of the portion of string which is
- * to be replaced. If length is zero then this function will have the effect of inserting
- * replacement into string at the given start offset.
- * @return string
- */
- function utf8_substr_replace($string, $replacement, $start , $length=0 ){
- $ret = '';
- if($start>0) $ret .= utf8_substr($string, 0, $start);
- $ret .= $replacement;
- $ret .= utf8_substr($string, $start+$length);
- return $ret;
+if (!function_exists('utf8_strlen')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_strlen($str)
+ {
+ dbg_deprecated(PhpString::class . '::strlen()');
+ return PhpString::strlen($str);
}
}
-if(!function_exists('utf8_ltrim')){
- /**
- * Unicode aware replacement for ltrim()
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @see ltrim()
- *
- * @param string $str
- * @param string $charlist
- * @return string
- */
- function utf8_ltrim($str,$charlist=''){
- if($charlist == '') return ltrim($str);
-
- //quote charlist for use in a characterclass
- $charlist = preg_replace('!([\\\\\\-\\]\\[/])!','\\\${1}',$charlist);
-
- return preg_replace('/^['.$charlist.']+/u','',$str);
+if (!function_exists('utf8_substr')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_substr($str, $offset, $length = null)
+ {
+ dbg_deprecated(PhpString::class . '::substr()');
+ return PhpString::substr($str, $offset, $length);
}
}
-if(!function_exists('utf8_rtrim')){
- /**
- * Unicode aware replacement for rtrim()
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @see rtrim()
- *
- * @param string $str
- * @param string $charlist
- * @return string
- */
- function utf8_rtrim($str,$charlist=''){
- if($charlist == '') return rtrim($str);
-
- //quote charlist for use in a characterclass
- $charlist = preg_replace('!([\\\\\\-\\]\\[/])!','\\\${1}',$charlist);
-
- return preg_replace('/['.$charlist.']+$/u','',$str);
+if (!function_exists('utf8_substr_replace')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_substr_replace($string, $replacement, $start, $length = 0)
+ {
+ dbg_deprecated(PhpString::class . '::substr_replace()');
+ return PhpString::substr_replace($string, $replacement, $start, $length);
}
}
-if(!function_exists('utf8_trim')){
- /**
- * Unicode aware replacement for trim()
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @see trim()
- *
- * @param string $str
- * @param string $charlist
- * @return string
- */
- function utf8_trim($str,$charlist='') {
- if($charlist == '') return trim($str);
-
- return utf8_ltrim(utf8_rtrim($str,$charlist),$charlist);
+if (!function_exists('utf8_ltrim')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_ltrim($str, $charlist = '')
+ {
+ dbg_deprecated(PhpString::class . '::ltrim()');
+ return PhpString::ltrim($str, $charlist);
}
}
-if(!function_exists('utf8_strtolower')){
- /**
- * This is a unicode aware replacement for strtolower()
- *
- * Uses mb_string extension if available
- *
- * @author Leo Feyer <leo@typolight.org>
- * @see strtolower()
- * @see utf8_strtoupper()
- *
- * @param string $string
- * @return string
- */
- function utf8_strtolower($string){
- if(UTF8_MBSTRING) {
- if (class_exists("Normalizer", $autoload = false))
- return normalizer::normalize(mb_strtolower($string,'utf-8'));
- else
- return (mb_strtolower($string,'utf-8'));
- }
- global $UTF8_UPPER_TO_LOWER;
- return strtr($string,$UTF8_UPPER_TO_LOWER);
+if (!function_exists('utf8_rtrim')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_rtrim($str, $charlist = '')
+ {
+ dbg_deprecated(PhpString::class . '::rtrim()');
+ return PhpString::rtrim($str, $charlist);
}
}
-if(!function_exists('utf8_strtoupper')){
- /**
- * This is a unicode aware replacement for strtoupper()
- *
- * Uses mb_string extension if available
- *
- * @author Leo Feyer <leo@typolight.org>
- * @see strtoupper()
- * @see utf8_strtoupper()
- *
- * @param string $string
- * @return string
- */
- function utf8_strtoupper($string){
- if(UTF8_MBSTRING) return mb_strtoupper($string,'utf-8');
-
- global $UTF8_LOWER_TO_UPPER;
- return strtr($string,$UTF8_LOWER_TO_UPPER);
+if (!function_exists('utf8_trim')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_trim($str, $charlist = '')
+ {
+ dbg_deprecated(PhpString::class . '::trim()');
+ return PhpString::trim($str, $charlist);
}
}
-if(!function_exists('utf8_ucfirst')){
- /**
- * UTF-8 aware alternative to ucfirst
- * Make a string's first character uppercase
- *
- * @author Harry Fuecks
- *
- * @param string $str
- * @return string with first character as upper case (if applicable)
- */
- function utf8_ucfirst($str){
- switch ( utf8_strlen($str) ) {
- case 0:
- return '';
- case 1:
- return utf8_strtoupper($str);
- default:
- preg_match('/^(.{1})(.*)$/us', $str, $matches);
- return utf8_strtoupper($matches[1]).$matches[2];
- }
+if (!function_exists('utf8_strtolower')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_strtolower($str)
+ {
+ dbg_deprecated(PhpString::class . '::strtolower()');
+ return PhpString::strtolower($str);
}
}
-if(!function_exists('utf8_ucwords')){
- /**
- * UTF-8 aware alternative to ucwords
- * Uppercase the first character of each word in a string
- *
- * @author Harry Fuecks
- * @see http://php.net/ucwords
- *
- * @param string $str
- * @return string with first char of each word uppercase
- */
- function utf8_ucwords($str) {
- // Note: [\x0c\x09\x0b\x0a\x0d\x20] matches;
- // form feeds, horizontal tabs, vertical tabs, linefeeds and carriage returns
- // This corresponds to the definition of a "word" defined at http://php.net/ucwords
- $pattern = '/(^|([\x0c\x09\x0b\x0a\x0d\x20]+))([^\x0c\x09\x0b\x0a\x0d\x20]{1})[^\x0c\x09\x0b\x0a\x0d\x20]*/u';
-
- return preg_replace_callback($pattern, 'utf8_ucwords_callback',$str);
- }
-
- /**
- * Callback function for preg_replace_callback call in utf8_ucwords
- * You don't need to call this yourself
- *
- * @author Harry Fuecks
- * @see utf8_ucwords
- * @see utf8_strtoupper
- *
- * @param array $matches matches corresponding to a single word
- * @return string with first char of the word in uppercase
- */
- function utf8_ucwords_callback($matches) {
- $leadingws = $matches[2];
- $ucfirst = utf8_strtoupper($matches[3]);
- $ucword = utf8_substr_replace(ltrim($matches[0]),$ucfirst,0,1);
- return $leadingws . $ucword;
+if (!function_exists('utf8_strtoupper')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_strtoupper($str)
+ {
+ dbg_deprecated(PhpString::class . '::strtoupper()');
+ return PhpString::strtoupper($str);
}
}
-if(!function_exists('utf8_deaccent')){
- /**
- * Replace accented UTF-8 characters by unaccented ASCII-7 equivalents
- *
- * Use the optional parameter to just deaccent lower ($case = -1) or upper ($case = 1)
- * letters. Default is to deaccent both cases ($case = 0)
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string $string
- * @param int $case
- * @return string
- */
- function utf8_deaccent($string,$case=0){
- if($case <= 0){
- global $UTF8_LOWER_ACCENTS;
- $string = strtr($string,$UTF8_LOWER_ACCENTS);
- }
- if($case >= 0){
- global $UTF8_UPPER_ACCENTS;
- $string = strtr($string,$UTF8_UPPER_ACCENTS);
- }
- return $string;
+if (!function_exists('utf8_ucfirst')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_ucfirst($str)
+ {
+ dbg_deprecated(PhpString::class . '::ucfirst()');
+ return PhpString::ucfirst($str);
}
}
-if(!function_exists('utf8_romanize')){
- /**
- * Romanize a non-latin string
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string $string
- * @return string
- */
- function utf8_romanize($string){
- if(utf8_isASCII($string)) return $string; //nothing to do
-
- global $UTF8_ROMANIZATION;
- return strtr($string,$UTF8_ROMANIZATION);
+if (!function_exists('utf8_ucwords')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_ucwords($str)
+ {
+ dbg_deprecated(PhpString::class . '::ucwords()');
+ return PhpString::ucwords($str);
}
}
-if(!function_exists('utf8_stripspecials')){
- /**
- * Removes special characters (nonalphanumeric) from a UTF-8 string
- *
- * This function adds the controlchars 0x00 to 0x19 to the array of
- * stripped chars (they are not included in $UTF8_SPECIAL_CHARS)
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @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_CHARS2;
-
- static $specials = null;
- if(is_null($specials)){
- #$specials = preg_quote(unicode_to_utf8($UTF8_SPECIAL_CHARS), '/');
- $specials = preg_quote($UTF8_SPECIAL_CHARS2, '/');
- }
-
- return preg_replace('/['.$additional.'\x00-\x19'.$specials.']/u',$repl,$string);
+if (!function_exists('utf8_deaccent')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_deaccent($str, $case = 0)
+ {
+ dbg_deprecated(Clean::class . '::deaccent()');
+ return Clean::deaccent($str, $case);
}
}
-if(!function_exists('utf8_strpos')){
- /**
- * This is an Unicode aware replacement for strpos
- *
- * @author Leo Feyer <leo@typolight.org>
- * @see strpos()
- *
- * @param string $haystack
- * @param string $needle
- * @param integer $offset
- * @return integer
- */
- function utf8_strpos($haystack, $needle, $offset=0){
- $comp = 0;
- $length = null;
-
- while (is_null($length) || $length < $offset) {
- $pos = strpos($haystack, $needle, $offset + $comp);
-
- if ($pos === false)
- return false;
-
- $length = utf8_strlen(substr($haystack, 0, $pos));
-
- if ($length < $offset)
- $comp = $pos - $length;
- }
-
- return $length;
+if (!function_exists('utf8_romanize')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_romanize($str)
+ {
+ dbg_deprecated(Clean::class . '::romanize()');
+ return Clean::romanize($str);
}
}
-if(!function_exists('utf8_tohtml')){
- /**
- * Encodes UTF-8 characters to HTML entities
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- * @author <vpribish at shopping dot com>
- * @link http://php.net/manual/en/function.utf8-decode.php
- *
- * @param string $str
- * @return string
- */
- function utf8_tohtml ($str) {
- $ret = '';
- foreach (utf8_to_unicode($str) as $cp) {
- if ($cp < 0x80)
- $ret .= chr($cp);
- elseif ($cp < 0x100)
- $ret .= "&#$cp;";
- else
- $ret .= '&#x'.dechex($cp).';';
- }
- return $ret;
+if (!function_exists('utf8_stripspecials')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_stripspecials($str, $repl = '', $additional = '')
+ {
+ dbg_deprecated(Clean::class . '::stripspecials()');
+ return Clean::stripspecials($str, $repl, $additional);
}
}
-if(!function_exists('utf8_unhtml')){
- /**
- * Decodes HTML entities to UTF-8 characters
- *
- * Convert any &#..; entity to a codepoint,
- * The entities flag defaults to only decoding numeric entities.
- * Pass HTML_ENTITIES and named entities, including &amp; &lt; etc.
- * are handled as well. Avoids the problem that would occur if you
- * had to decode "&amp;#38;&#38;amp;#38;"
- *
- * unhtmlspecialchars(utf8_unhtml($s)) -> "&#38;&#38;"
- * utf8_unhtml(unhtmlspecialchars($s)) -> "&&amp#38;"
- * what it should be -> "&#38;&amp#38;"
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- *
- * @param string $str UTF-8 encoded string
- * @param boolean $entities Flag controlling decoding of named entities.
- * @return string UTF-8 encoded string with numeric (and named) entities replaced.
- */
- function utf8_unhtml($str, $entities=null) {
- static $decoder = null;
- if (is_null($decoder))
- $decoder = new utf8_entity_decoder();
- if (is_null($entities))
- return preg_replace_callback('/(&#([Xx])?([0-9A-Za-z]+);)/m',
- 'utf8_decode_numeric', $str);
- else
- return preg_replace_callback('/&(#)?([Xx])?([0-9A-Za-z]+);/m',
- array(&$decoder, 'decode'), $str);
+if (!function_exists('utf8_strpos')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_strpos($haystack, $needle, $offset = 0)
+ {
+ dbg_deprecated(PhpString::class . '::strpos()');
+ return PhpString::strpos($haystack, $needle, $offset);
}
}
-if(!function_exists('utf8_decode_numeric')){
- /**
- * Decodes numeric HTML entities to their correct UTF-8 characters
- *
- * @param $ent string A numeric entity
- * @return string|false
- */
- function utf8_decode_numeric($ent) {
- switch ($ent[2]) {
- case 'X':
- case 'x':
- $cp = hexdec($ent[3]);
- break;
- default:
- $cp = intval($ent[3]);
- break;
- }
- return unicode_to_utf8(array($cp));
+if (!function_exists('utf8_tohtml')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_tohtml($str, $all = false)
+ {
+ dbg_deprecated(Conversion::class . '::toHtml()');
+ return Conversion::toHtml($str, $all);
}
}
-if(!class_exists('utf8_entity_decoder')){
- /**
- * Encapsulate HTML entity decoding tables
- */
- class utf8_entity_decoder {
- protected $table;
-
- /**
- * 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 around unicode_to_utf8()
- *
- * @param string $c
- * @return string|false
- */
- function makeutf8($c) {
- return unicode_to_utf8(array(ord($c)));
- }
-
- /**
- * Decodes any HTML entity to it's correct UTF-8 char equivalent
- *
- * @param string $ent An entity
- * @return string|false
- */
- function decode($ent) {
- if ($ent[1] == '#') {
- return utf8_decode_numeric($ent);
- } elseif (array_key_exists($ent[0],$this->table)) {
- return $this->table[$ent[0]];
- } else {
- return $ent[0];
- }
- }
+if (!function_exists('utf8_unhtml')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_unhtml($str, $enties = false)
+ {
+ dbg_deprecated(Conversion::class . '::fromHtml()');
+ return Conversion::fromHtml($str, $enties);
}
}
-if(!function_exists('utf8_to_unicode')){
- /**
- * Takes an UTF-8 string and returns an array of ints representing the
- * Unicode characters. Astral planes are supported ie. the ints in the
- * output can be > 0xFFFF. Occurrances of the BOM are ignored. Surrogates
- * are not allowed.
- *
- * If $strict is set to true the function returns false if the input
- * string isn't a valid UTF-8 octet sequence and raises a PHP error at
- * level E_USER_WARNING
- *
- * Note: this function has been modified slightly in this library to
- * trigger errors on encountering bad bytes
- *
- * @author <hsivonen@iki.fi>
- * @author Harry Fuecks <hfuecks@gmail.com>
- * @see unicode_to_utf8
- * @link http://hsivonen.iki.fi/php-utf8/
- * @link http://sourceforge.net/projects/phputf8/
- *
- * @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
- */
- function utf8_to_unicode($str,$strict=false) {
- $mState = 0; // cached expected number of octets after the current octet
- // until the beginning of the next UTF8 character sequence
- $mUcs4 = 0; // cached Unicode character
- $mBytes = 1; // cached expected number of octets in the current sequence
-
- $out = array();
-
- $len = strlen($str);
-
- for($i = 0; $i < $len; $i++) {
-
- $in = ord($str{$i});
-
- if ( $mState == 0) {
-
- // When mState is zero we expect either a US-ASCII character or a
- // multi-octet sequence.
- if (0 == (0x80 & ($in))) {
- // US-ASCII, pass straight through.
- $out[] = $in;
- $mBytes = 1;
-
- } else if (0xC0 == (0xE0 & ($in))) {
- // First octet of 2 octet sequence
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x1F) << 6;
- $mState = 1;
- $mBytes = 2;
-
- } else if (0xE0 == (0xF0 & ($in))) {
- // First octet of 3 octet sequence
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x0F) << 12;
- $mState = 2;
- $mBytes = 3;
-
- } else if (0xF0 == (0xF8 & ($in))) {
- // First octet of 4 octet sequence
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x07) << 18;
- $mState = 3;
- $mBytes = 4;
-
- } else if (0xF8 == (0xFC & ($in))) {
- /* First octet of 5 octet sequence.
- *
- * This is illegal because the encoded codepoint must be either
- * (a) not the shortest form or
- * (b) outside the Unicode range of 0-0x10FFFF.
- * Rather than trying to resynchronize, we will carry on until the end
- * of the sequence and let the later error handling code catch it.
- */
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x03) << 24;
- $mState = 4;
- $mBytes = 5;
-
- } else if (0xFC == (0xFE & ($in))) {
- // First octet of 6 octet sequence, see comments for 5 octet sequence.
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 1) << 30;
- $mState = 5;
- $mBytes = 6;
-
- } elseif($strict) {
- /* Current octet is neither in the US-ASCII range nor a legal first
- * octet of a multi-octet sequence.
- */
- trigger_error(
- 'utf8_to_unicode: Illegal sequence identifier '.
- 'in UTF-8 at byte '.$i,
- E_USER_WARNING
- );
- return false;
-
- }
-
- } else {
-
- // When mState is non-zero, we expect a continuation of the multi-octet
- // sequence
- if (0x80 == (0xC0 & ($in))) {
-
- // Legal continuation.
- $shift = ($mState - 1) * 6;
- $tmp = $in;
- $tmp = ($tmp & 0x0000003F) << $shift;
- $mUcs4 |= $tmp;
-
- /**
- * End of the multi-octet sequence. mUcs4 now contains the final
- * Unicode codepoint to be output
- */
- if (0 == --$mState) {
-
- /*
- * Check for illegal sequences and codepoints.
- */
- // From Unicode 3.1, non-shortest form is illegal
- if (((2 == $mBytes) && ($mUcs4 < 0x0080)) ||
- ((3 == $mBytes) && ($mUcs4 < 0x0800)) ||
- ((4 == $mBytes) && ($mUcs4 < 0x10000)) ||
- (4 < $mBytes) ||
- // From Unicode 3.2, surrogate characters are illegal
- (($mUcs4 & 0xFFFFF800) == 0xD800) ||
- // Codepoints outside the Unicode range are illegal
- ($mUcs4 > 0x10FFFF)) {
-
- if($strict){
- trigger_error(
- 'utf8_to_unicode: Illegal sequence or codepoint '.
- 'in UTF-8 at byte '.$i,
- E_USER_WARNING
- );
-
- return false;
- }
-
- }
-
- if (0xFEFF != $mUcs4) {
- // BOM is legal but we don't want to output it
- $out[] = $mUcs4;
- }
-
- //initialize UTF8 cache
- $mState = 0;
- $mUcs4 = 0;
- $mBytes = 1;
- }
-
- } elseif($strict) {
- /**
- *((0xC0 & (*in) != 0x80) && (mState != 0))
- * Incomplete multi-octet sequence.
- */
- trigger_error(
- 'utf8_to_unicode: Incomplete multi-octet '.
- ' sequence in UTF-8 at byte '.$i,
- E_USER_WARNING
- );
-
- return false;
- }
- }
- }
- return $out;
+if (!function_exists('utf8_to_unicode')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_to_unicode($str, $strict = false)
+ {
+ dbg_deprecated(Unicode::class . '::fromUtf8()');
+ return Unicode::fromUtf8($str, $strict);
}
}
-if(!function_exists('unicode_to_utf8')){
- /**
- * Takes an array of ints representing the Unicode characters and returns
- * a UTF-8 string. Astral planes are supported ie. the ints in the
- * input can be > 0xFFFF. Occurrances of the BOM are ignored. Surrogates
- * are not allowed.
- *
- * If $strict is set to true the function returns false if the input
- * array contains ints that represent surrogates or are outside the
- * Unicode range and raises a PHP error at level E_USER_WARNING
- *
- * Note: this function has been modified slightly in this library to use
- * output buffering to concatenate the UTF-8 string (faster) as well as
- * reference the array by it's keys
- *
- * @param array $arr of unicode code points representing a string
- * @param boolean $strict Check for invalid sequences?
- * @return string|false UTF-8 string or false if array contains invalid code points
- *
- * @author <hsivonen@iki.fi>
- * @author Harry Fuecks <hfuecks@gmail.com>
- * @see utf8_to_unicode
- * @link http://hsivonen.iki.fi/php-utf8/
- * @link http://sourceforge.net/projects/phputf8/
- */
- function unicode_to_utf8($arr,$strict=false) {
- if (!is_array($arr)) return '';
- ob_start();
-
- foreach (array_keys($arr) as $k) {
-
- if ( ($arr[$k] >= 0) && ($arr[$k] <= 0x007f) ) {
- # ASCII range (including control chars)
-
- echo chr($arr[$k]);
-
- } else if ($arr[$k] <= 0x07ff) {
- # 2 byte sequence
-
- echo chr(0xc0 | ($arr[$k] >> 6));
- echo chr(0x80 | ($arr[$k] & 0x003f));
-
- } else if($arr[$k] == 0xFEFF) {
- # Byte order mark (skip)
-
- // nop -- zap the BOM
-
- } else if ($arr[$k] >= 0xD800 && $arr[$k] <= 0xDFFF) {
- # Test for illegal surrogates
-
- // found a surrogate
- if($strict){
- trigger_error(
- 'unicode_to_utf8: Illegal surrogate '.
- 'at index: '.$k.', value: '.$arr[$k],
- E_USER_WARNING
- );
- return false;
- }
-
- } else if ($arr[$k] <= 0xffff) {
- # 3 byte sequence
-
- echo chr(0xe0 | ($arr[$k] >> 12));
- echo chr(0x80 | (($arr[$k] >> 6) & 0x003f));
- echo chr(0x80 | ($arr[$k] & 0x003f));
-
- } else if ($arr[$k] <= 0x10ffff) {
- # 4 byte sequence
-
- echo chr(0xf0 | ($arr[$k] >> 18));
- echo chr(0x80 | (($arr[$k] >> 12) & 0x3f));
- echo chr(0x80 | (($arr[$k] >> 6) & 0x3f));
- echo chr(0x80 | ($arr[$k] & 0x3f));
-
- } elseif($strict) {
-
- trigger_error(
- 'unicode_to_utf8: Codepoint out of Unicode range '.
- 'at index: '.$k.', value: '.$arr[$k],
- E_USER_WARNING
- );
-
- // out of range
- return false;
- }
- }
-
- $result = ob_get_contents();
- ob_end_clean();
- return $result;
+if (!function_exists('unicode_to_utf8')) {
+ /** @deprecated 2019-06-09 */
+ function unicode_to_utf8($arr, $strict = false)
+ {
+ dbg_deprecated(Unicode::class . '::toUtf8()');
+ return Unicode::toUtf8($arr, $strict);
}
}
-if(!function_exists('utf8_to_utf16be')){
- /**
- * UTF-8 to UTF-16BE conversion.
- *
- * Maybe really UCS-2 without mb_string due to utf8_to_unicode limits
- *
- * @param string $str
- * @param bool $bom
- * @return string
- */
- function utf8_to_utf16be(&$str, $bom = false) {
- $out = $bom ? "\xFE\xFF" : '';
- if(UTF8_MBSTRING) return $out.mb_convert_encoding($str,'UTF-16BE','UTF-8');
-
- $uni = utf8_to_unicode($str);
- foreach($uni as $cp){
- $out .= pack('n',$cp);
- }
- return $out;
+if (!function_exists('utf8_to_utf16be')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_to_utf16be($str, $bom = false)
+ {
+ dbg_deprecated(Conversion::class . '::toUtf16be()');
+ return Conversion::toUtf16be($str, $bom);
}
}
-if(!function_exists('utf16be_to_utf8')){
- /**
- * UTF-8 to UTF-16BE conversion.
- *
- * Maybe really UCS-2 without mb_string due to utf8_to_unicode limits
- *
- * @param string $str
- * @return false|string
- */
- function utf16be_to_utf8(&$str) {
- $uni = unpack('n*',$str);
- return unicode_to_utf8($uni);
+if (!function_exists('utf16be_to_utf8')) {
+ /** @deprecated 2019-06-09 */
+ function utf16be_to_utf8($str)
+ {
+ dbg_deprecated(Conversion::class . '::fromUtf16be()');
+ return Conversion::fromUtf16be($str);
}
}
-if(!function_exists('utf8_bad_replace')){
- /**
- * Replace bad bytes with an alternative character
- *
- * ASCII character is recommended for replacement char
- *
- * PCRE Pattern to locate bad bytes in a UTF-8 string
- * Comes from W3 FAQ: Multilingual Forms
- * Note: modified to include full ASCII range including control chars
- *
- * @author Harry Fuecks <hfuecks@gmail.com>
- * @see http://www.w3.org/International/questions/qa-forms-utf-8
- *
- * @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 = '') {
- $UTF8_BAD =
- '([\x00-\x7F]'. # ASCII (including control chars)
- '|[\xC2-\xDF][\x80-\xBF]'. # non-overlong 2-byte
- '|\xE0[\xA0-\xBF][\x80-\xBF]'. # excluding overlongs
- '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}'. # straight 3-byte
- '|\xED[\x80-\x9F][\x80-\xBF]'. # excluding surrogates
- '|\xF0[\x90-\xBF][\x80-\xBF]{2}'. # planes 1-3
- '|[\xF1-\xF3][\x80-\xBF]{3}'. # planes 4-15
- '|\xF4[\x80-\x8F][\x80-\xBF]{2}'. # plane 16
- '|(.{1}))'; # invalid byte
- ob_start();
- while (preg_match('/'.$UTF8_BAD.'/S', $str, $matches)) {
- if ( !isset($matches[2])) {
- echo $matches[0];
- } else {
- echo $replace;
- }
- $str = substr($str,strlen($matches[0]));
- }
- $result = ob_get_contents();
- ob_end_clean();
- return $result;
+if (!function_exists('utf8_bad_replace')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_bad_replace($str, $replace = '')
+ {
+ dbg_deprecated(Clean::class . '::replaceBadBytes()');
+ return Clean::replaceBadBytes($str, $replace);
}
}
-if(!function_exists('utf8_correctIdx')){
- /**
- * adjust a byte index into a utf8 string to a utf8 character boundary
- *
- * @param string $str utf8 character string
- * @param int $i byte index into $str
- * @param $next bool direction to search for boundary,
- * false = up (current character)
- * true = down (next character)
- *
- * @return int byte index into $str now pointing to a utf8 character boundary
- *
- * @author chris smith <chris@jalakai.co.uk>
- */
- function utf8_correctIdx(&$str,$i,$next=false) {
-
- if ($i <= 0) return 0;
-
- $limit = strlen($str);
- if ($i>=$limit) return $limit;
-
- if ($next) {
- while (($i<$limit) && ((ord($str[$i]) & 0xC0) == 0x80)) $i++;
- } else {
- while ($i && ((ord($str[$i]) & 0xC0) == 0x80)) $i--;
- }
-
- return $i;
+if (!function_exists('utf8_correctIdx')) {
+ /** @deprecated 2019-06-09 */
+ function utf8_correctIdx($str, $i, $next = false)
+ {
+ dbg_deprecated(Clean::class . '::correctIdx()');
+ return Clean::correctIdx($str, $i, $next);
}
}
-
-// only needed if no mb_string available
-if(!UTF8_MBSTRING){
- /**
- * UTF-8 Case lookup table
- *
- * This lookuptable defines the upper case letters to their correspponding
- * lower case letter in UTF-8
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- global $UTF8_LOWER_TO_UPPER;
- if(empty($UTF8_LOWER_TO_UPPER)) $UTF8_LOWER_TO_UPPER = array(
- "z"=>"Z","y"=>"Y","x"=>"X","w"=>"W","v"=>"V","u"=>"U","t"=>"T","s"=>"S","r"=>"R","q"=>"Q",
- "p"=>"P","o"=>"O","n"=>"N","m"=>"M","l"=>"L","k"=>"K","j"=>"J","i"=>"I","h"=>"H","g"=>"G",
- "f"=>"F","e"=>"E","d"=>"D","c"=>"C","b"=>"B","a"=>"A","ῳ"=>"ῼ","ῥ"=>"Ῥ","ῡ"=>"Ῡ","ῑ"=>"Ῑ",
- "ῐ"=>"Ῐ","ῃ"=>"ῌ","ι"=>"Ι","ᾳ"=>"ᾼ","ᾱ"=>"Ᾱ","ᾰ"=>"Ᾰ","ᾧ"=>"ᾯ","ᾦ"=>"ᾮ","ᾥ"=>"ᾭ","ᾤ"=>"ᾬ",
- "ᾣ"=>"ᾫ","ᾢ"=>"ᾪ","ᾡ"=>"ᾩ","ᾗ"=>"ᾟ","ᾖ"=>"ᾞ","ᾕ"=>"ᾝ","ᾔ"=>"ᾜ","ᾓ"=>"ᾛ","ᾒ"=>"ᾚ","ᾑ"=>"ᾙ",
- "ᾐ"=>"ᾘ","ᾇ"=>"ᾏ","ᾆ"=>"ᾎ","ᾅ"=>"ᾍ","ᾄ"=>"ᾌ","ᾃ"=>"ᾋ","ᾂ"=>"ᾊ","ᾁ"=>"ᾉ","ᾀ"=>"ᾈ","ώ"=>"Ώ",
- "ὼ"=>"Ὼ","ύ"=>"Ύ","ὺ"=>"Ὺ","ό"=>"Ό","ὸ"=>"Ὸ","ί"=>"Ί","ὶ"=>"Ὶ","ή"=>"Ή","ὴ"=>"Ὴ","έ"=>"Έ",
- "ὲ"=>"Ὲ","ά"=>"Ά","ὰ"=>"Ὰ","ὧ"=>"Ὧ","ὦ"=>"Ὦ","ὥ"=>"Ὥ","ὤ"=>"Ὤ","ὣ"=>"Ὣ","ὢ"=>"Ὢ","ὡ"=>"Ὡ",
- "ὗ"=>"Ὗ","ὕ"=>"Ὕ","ὓ"=>"Ὓ","ὑ"=>"Ὑ","ὅ"=>"Ὅ","ὄ"=>"Ὄ","ὃ"=>"Ὃ","ὂ"=>"Ὂ","ὁ"=>"Ὁ","ὀ"=>"Ὀ",
- "ἷ"=>"Ἷ","ἶ"=>"Ἶ","ἵ"=>"Ἵ","ἴ"=>"Ἴ","ἳ"=>"Ἳ","ἲ"=>"Ἲ","ἱ"=>"Ἱ","ἰ"=>"Ἰ","ἧ"=>"Ἧ","ἦ"=>"Ἦ",
- "ἥ"=>"Ἥ","ἤ"=>"Ἤ","ἣ"=>"Ἣ","ἢ"=>"Ἢ","ἡ"=>"Ἡ","ἕ"=>"Ἕ","ἔ"=>"Ἔ","ἓ"=>"Ἓ","ἒ"=>"Ἒ","ἑ"=>"Ἑ",
- "ἐ"=>"Ἐ","ἇ"=>"Ἇ","ἆ"=>"Ἆ","ἅ"=>"Ἅ","ἄ"=>"Ἄ","ἃ"=>"Ἃ","ἂ"=>"Ἂ","ἁ"=>"Ἁ","ἀ"=>"Ἀ","ỹ"=>"Ỹ",
- "ỷ"=>"Ỷ","ỵ"=>"Ỵ","ỳ"=>"Ỳ","ự"=>"Ự","ữ"=>"Ữ","ử"=>"Ử","ừ"=>"Ừ","ứ"=>"Ứ","ủ"=>"Ủ","ụ"=>"Ụ",
- "ợ"=>"Ợ","ỡ"=>"Ỡ","ở"=>"Ở","ờ"=>"Ờ","ớ"=>"Ớ","ộ"=>"Ộ","ỗ"=>"Ỗ","ổ"=>"Ổ","ồ"=>"Ồ","ố"=>"Ố",
- "ỏ"=>"Ỏ","ọ"=>"Ọ","ị"=>"Ị","ỉ"=>"Ỉ","ệ"=>"Ệ","ễ"=>"Ễ","ể"=>"Ể","ề"=>"Ề","ế"=>"Ế","ẽ"=>"Ẽ",
- "ẻ"=>"Ẻ","ẹ"=>"Ẹ","ặ"=>"Ặ","ẵ"=>"Ẵ","ẳ"=>"Ẳ","ằ"=>"Ằ","ắ"=>"Ắ","ậ"=>"Ậ","ẫ"=>"Ẫ","ẩ"=>"Ẩ",
- "ầ"=>"Ầ","ấ"=>"Ấ","ả"=>"Ả","ạ"=>"Ạ","ẛ"=>"Ṡ","ẕ"=>"Ẕ","ẓ"=>"Ẓ","ẑ"=>"Ẑ","ẏ"=>"Ẏ","ẍ"=>"Ẍ",
- "ẋ"=>"Ẋ","ẉ"=>"Ẉ","ẇ"=>"Ẇ","ẅ"=>"Ẅ","ẃ"=>"Ẃ","ẁ"=>"Ẁ","ṿ"=>"Ṿ","ṽ"=>"Ṽ","ṻ"=>"Ṻ","ṹ"=>"Ṹ",
- "ṷ"=>"Ṷ","ṵ"=>"Ṵ","ṳ"=>"Ṳ","ṱ"=>"Ṱ","ṯ"=>"Ṯ","ṭ"=>"Ṭ","ṫ"=>"Ṫ","ṩ"=>"Ṩ","ṧ"=>"Ṧ","ṥ"=>"Ṥ",
- "ṣ"=>"Ṣ","ṡ"=>"Ṡ","ṟ"=>"Ṟ","ṝ"=>"Ṝ","ṛ"=>"Ṛ","ṙ"=>"Ṙ","ṗ"=>"Ṗ","ṕ"=>"Ṕ","ṓ"=>"Ṓ","ṑ"=>"Ṑ",
- "ṏ"=>"Ṏ","ṍ"=>"Ṍ","ṋ"=>"Ṋ","ṉ"=>"Ṉ","ṇ"=>"Ṇ","ṅ"=>"Ṅ","ṃ"=>"Ṃ","ṁ"=>"Ṁ","ḿ"=>"Ḿ","ḽ"=>"Ḽ",
- "ḻ"=>"Ḻ","ḹ"=>"Ḹ","ḷ"=>"Ḷ","ḵ"=>"Ḵ","ḳ"=>"Ḳ","ḱ"=>"Ḱ","ḯ"=>"Ḯ","ḭ"=>"Ḭ","ḫ"=>"Ḫ","ḩ"=>"Ḩ",
- "ḧ"=>"Ḧ","ḥ"=>"Ḥ","ḣ"=>"Ḣ","ḡ"=>"Ḡ","ḟ"=>"Ḟ","ḝ"=>"Ḝ","ḛ"=>"Ḛ","ḙ"=>"Ḙ","ḗ"=>"Ḗ","ḕ"=>"Ḕ",
- "ḓ"=>"Ḓ","ḑ"=>"Ḑ","ḏ"=>"Ḏ","ḍ"=>"Ḍ","ḋ"=>"Ḋ","ḉ"=>"Ḉ","ḇ"=>"Ḇ","ḅ"=>"Ḅ","ḃ"=>"Ḃ","ḁ"=>"Ḁ",
- "ֆ"=>"Ֆ","օ"=>"Օ","ք"=>"Ք","փ"=>"Փ","ւ"=>"Ւ","ց"=>"Ց","ր"=>"Ր","տ"=>"Տ","վ"=>"Վ","ս"=>"Ս",
- "ռ"=>"Ռ","ջ"=>"Ջ","պ"=>"Պ","չ"=>"Չ","ո"=>"Ո","շ"=>"Շ","ն"=>"Ն","յ"=>"Յ","մ"=>"Մ","ճ"=>"Ճ",
- "ղ"=>"Ղ","ձ"=>"Ձ","հ"=>"Հ","կ"=>"Կ","ծ"=>"Ծ","խ"=>"Խ","լ"=>"Լ","ի"=>"Ի","ժ"=>"Ժ","թ"=>"Թ",
- "ը"=>"Ը","է"=>"Է","զ"=>"Զ","ե"=>"Ե","դ"=>"Դ","գ"=>"Գ","բ"=>"Բ","ա"=>"Ա","ԏ"=>"Ԏ","ԍ"=>"Ԍ",
- "ԋ"=>"Ԋ","ԉ"=>"Ԉ","ԇ"=>"Ԇ","ԅ"=>"Ԅ","ԃ"=>"Ԃ","ԁ"=>"Ԁ","ӹ"=>"Ӹ","ӵ"=>"Ӵ","ӳ"=>"Ӳ","ӱ"=>"Ӱ",
- "ӯ"=>"Ӯ","ӭ"=>"Ӭ","ӫ"=>"Ӫ","ө"=>"Ө","ӧ"=>"Ӧ","ӥ"=>"Ӥ","ӣ"=>"Ӣ","ӡ"=>"Ӡ","ӟ"=>"Ӟ","ӝ"=>"Ӝ",
- "ӛ"=>"Ӛ","ә"=>"Ә","ӗ"=>"Ӗ","ӕ"=>"Ӕ","ӓ"=>"Ӓ","ӑ"=>"Ӑ","ӎ"=>"Ӎ","ӌ"=>"Ӌ","ӊ"=>"Ӊ","ӈ"=>"Ӈ",
- "ӆ"=>"Ӆ","ӄ"=>"Ӄ","ӂ"=>"Ӂ","ҿ"=>"Ҿ","ҽ"=>"Ҽ","һ"=>"Һ","ҹ"=>"Ҹ","ҷ"=>"Ҷ","ҵ"=>"Ҵ","ҳ"=>"Ҳ",
- "ұ"=>"Ұ","ү"=>"Ү","ҭ"=>"Ҭ","ҫ"=>"Ҫ","ҩ"=>"Ҩ","ҧ"=>"Ҧ","ҥ"=>"Ҥ","ң"=>"Ң","ҡ"=>"Ҡ","ҟ"=>"Ҟ",
- "ҝ"=>"Ҝ","қ"=>"Қ","ҙ"=>"Ҙ","җ"=>"Җ","ҕ"=>"Ҕ","ғ"=>"Ғ","ґ"=>"Ґ","ҏ"=>"Ҏ","ҍ"=>"Ҍ","ҋ"=>"Ҋ",
- "ҁ"=>"Ҁ","ѿ"=>"Ѿ","ѽ"=>"Ѽ","ѻ"=>"Ѻ","ѹ"=>"Ѹ","ѷ"=>"Ѷ","ѵ"=>"Ѵ","ѳ"=>"Ѳ","ѱ"=>"Ѱ","ѯ"=>"Ѯ",
- "ѭ"=>"Ѭ","ѫ"=>"Ѫ","ѩ"=>"Ѩ","ѧ"=>"Ѧ","ѥ"=>"Ѥ","ѣ"=>"Ѣ","ѡ"=>"Ѡ","џ"=>"Џ","ў"=>"Ў","ѝ"=>"Ѝ",
- "ќ"=>"Ќ","ћ"=>"Ћ","њ"=>"Њ","љ"=>"Љ","ј"=>"Ј","ї"=>"Ї","і"=>"І","ѕ"=>"Ѕ","є"=>"Є","ѓ"=>"Ѓ",
- "ђ"=>"Ђ","ё"=>"Ё","ѐ"=>"Ѐ","я"=>"Я","ю"=>"Ю","э"=>"Э","ь"=>"Ь","ы"=>"Ы","ъ"=>"Ъ","щ"=>"Щ",
- "ш"=>"Ш","ч"=>"Ч","ц"=>"Ц","х"=>"Х","ф"=>"Ф","у"=>"У","т"=>"Т","с"=>"С","р"=>"Р","п"=>"П",
- "о"=>"О","н"=>"Н","м"=>"М","л"=>"Л","к"=>"К","й"=>"Й","и"=>"И","з"=>"З","ж"=>"Ж","е"=>"Е",
- "д"=>"Д","г"=>"Г","в"=>"В","б"=>"Б","а"=>"А","ϵ"=>"Ε","ϲ"=>"Σ","ϱ"=>"Ρ","ϰ"=>"Κ","ϯ"=>"Ϯ",
- "ϭ"=>"Ϭ","ϫ"=>"Ϫ","ϩ"=>"Ϩ","ϧ"=>"Ϧ","ϥ"=>"Ϥ","ϣ"=>"Ϣ","ϡ"=>"Ϡ","ϟ"=>"Ϟ","ϝ"=>"Ϝ","ϛ"=>"Ϛ",
- "ϙ"=>"Ϙ","ϖ"=>"Π","ϕ"=>"Φ","ϑ"=>"Θ","ϐ"=>"Β","ώ"=>"Ώ","ύ"=>"Ύ","ό"=>"Ό","ϋ"=>"Ϋ","ϊ"=>"Ϊ",
- "ω"=>"Ω","ψ"=>"Ψ","χ"=>"Χ","φ"=>"Φ","υ"=>"Υ","τ"=>"Τ","σ"=>"Σ","ς"=>"Σ","ρ"=>"Ρ","π"=>"Π",
- "ο"=>"Ο","ξ"=>"Ξ","ν"=>"Ν","μ"=>"Μ","λ"=>"Λ","κ"=>"Κ","ι"=>"Ι","θ"=>"Θ","η"=>"Η","ζ"=>"Ζ",
- "ε"=>"Ε","δ"=>"Δ","γ"=>"Γ","β"=>"Β","α"=>"Α","ί"=>"Ί","ή"=>"Ή","έ"=>"Έ","ά"=>"Ά","ʒ"=>"Ʒ",
- "ʋ"=>"Ʋ","ʊ"=>"Ʊ","ʈ"=>"Ʈ","ʃ"=>"Ʃ","ʀ"=>"Ʀ","ɵ"=>"Ɵ","ɲ"=>"Ɲ","ɯ"=>"Ɯ","ɩ"=>"Ɩ","ɨ"=>"Ɨ",
- "ɣ"=>"Ɣ","ɛ"=>"Ɛ","ə"=>"Ə","ɗ"=>"Ɗ","ɖ"=>"Ɖ","ɔ"=>"Ɔ","ɓ"=>"Ɓ","ȳ"=>"Ȳ","ȱ"=>"Ȱ","ȯ"=>"Ȯ",
- "ȭ"=>"Ȭ","ȫ"=>"Ȫ","ȩ"=>"Ȩ","ȧ"=>"Ȧ","ȥ"=>"Ȥ","ȣ"=>"Ȣ","ȟ"=>"Ȟ","ȝ"=>"Ȝ","ț"=>"Ț","ș"=>"Ș",
- "ȗ"=>"Ȗ","ȕ"=>"Ȕ","ȓ"=>"Ȓ","ȑ"=>"Ȑ","ȏ"=>"Ȏ","ȍ"=>"Ȍ","ȋ"=>"Ȋ","ȉ"=>"Ȉ","ȇ"=>"Ȇ","ȅ"=>"Ȅ",
- "ȃ"=>"Ȃ","ȁ"=>"Ȁ","ǿ"=>"Ǿ","ǽ"=>"Ǽ","ǻ"=>"Ǻ","ǹ"=>"Ǹ","ǵ"=>"Ǵ","dz"=>"Dz","ǯ"=>"Ǯ","ǭ"=>"Ǭ",
- "ǫ"=>"Ǫ","ǩ"=>"Ǩ","ǧ"=>"Ǧ","ǥ"=>"Ǥ","ǣ"=>"Ǣ","ǡ"=>"Ǡ","ǟ"=>"Ǟ","ǝ"=>"Ǝ","ǜ"=>"Ǜ","ǚ"=>"Ǚ",
- "ǘ"=>"Ǘ","ǖ"=>"Ǖ","ǔ"=>"Ǔ","ǒ"=>"Ǒ","ǐ"=>"Ǐ","ǎ"=>"Ǎ","nj"=>"Nj","lj"=>"Lj","dž"=>"Dž","ƿ"=>"Ƿ",
- "ƽ"=>"Ƽ","ƹ"=>"Ƹ","ƶ"=>"Ƶ","ƴ"=>"Ƴ","ư"=>"Ư","ƭ"=>"Ƭ","ƨ"=>"Ƨ","ƥ"=>"Ƥ","ƣ"=>"Ƣ","ơ"=>"Ơ",
- "ƞ"=>"Ƞ","ƙ"=>"Ƙ","ƕ"=>"Ƕ","ƒ"=>"Ƒ","ƌ"=>"Ƌ","ƈ"=>"Ƈ","ƅ"=>"Ƅ","ƃ"=>"Ƃ","ſ"=>"S","ž"=>"Ž",
- "ż"=>"Ż","ź"=>"Ź","ŷ"=>"Ŷ","ŵ"=>"Ŵ","ų"=>"Ų","ű"=>"Ű","ů"=>"Ů","ŭ"=>"Ŭ","ū"=>"Ū","ũ"=>"Ũ",
- "ŧ"=>"Ŧ","ť"=>"Ť","ţ"=>"Ţ","š"=>"Š","ş"=>"Ş","ŝ"=>"Ŝ","ś"=>"Ś","ř"=>"Ř","ŗ"=>"Ŗ","ŕ"=>"Ŕ",
- "œ"=>"Œ","ő"=>"Ő","ŏ"=>"Ŏ","ō"=>"Ō","ŋ"=>"Ŋ","ň"=>"Ň","ņ"=>"Ņ","ń"=>"Ń","ł"=>"Ł","ŀ"=>"Ŀ",
- "ľ"=>"Ľ","ļ"=>"Ļ","ĺ"=>"Ĺ","ķ"=>"Ķ","ĵ"=>"Ĵ","ij"=>"IJ","ı"=>"I","į"=>"Į","ĭ"=>"Ĭ","ī"=>"Ī",
- "ĩ"=>"Ĩ","ħ"=>"Ħ","ĥ"=>"Ĥ","ģ"=>"Ģ","ġ"=>"Ġ","ğ"=>"Ğ","ĝ"=>"Ĝ","ě"=>"Ě","ę"=>"Ę","ė"=>"Ė",
- "ĕ"=>"Ĕ","ē"=>"Ē","đ"=>"Đ","ď"=>"Ď","č"=>"Č","ċ"=>"Ċ","ĉ"=>"Ĉ","ć"=>"Ć","ą"=>"Ą","ă"=>"Ă",
- "ā"=>"Ā","ÿ"=>"Ÿ","þ"=>"Þ","ý"=>"Ý","ü"=>"Ü","û"=>"Û","ú"=>"Ú","ù"=>"Ù","ø"=>"Ø","ö"=>"Ö",
- "õ"=>"Õ","ô"=>"Ô","ó"=>"Ó","ò"=>"Ò","ñ"=>"Ñ","ð"=>"Ð","ï"=>"Ï","î"=>"Î","í"=>"Í","ì"=>"Ì",
- "ë"=>"Ë","ê"=>"Ê","é"=>"É","è"=>"È","ç"=>"Ç","æ"=>"Æ","å"=>"Å","ä"=>"Ä","ã"=>"Ã","â"=>"Â",
- "á"=>"Á","à"=>"À","µ"=>"Μ","z"=>"Z","y"=>"Y","x"=>"X","w"=>"W","v"=>"V","u"=>"U","t"=>"T",
- "s"=>"S","r"=>"R","q"=>"Q","p"=>"P","o"=>"O","n"=>"N","m"=>"M","l"=>"L","k"=>"K","j"=>"J",
- "i"=>"I","h"=>"H","g"=>"G","f"=>"F","e"=>"E","d"=>"D","c"=>"C","b"=>"B","a"=>"A"
- );
-
- /**
- * UTF-8 Case lookup table
- *
- * This lookuptable defines the lower case letters to their corresponding
- * upper case letter in UTF-8
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- global $UTF8_UPPER_TO_LOWER;
- if(empty($UTF8_UPPER_TO_LOWER)) $UTF8_UPPER_TO_LOWER = array (
- "Z"=>"z","Y"=>"y","X"=>"x","W"=>"w","V"=>"v","U"=>"u","T"=>"t","S"=>"s","R"=>"r","Q"=>"q",
- "P"=>"p","O"=>"o","N"=>"n","M"=>"m","L"=>"l","K"=>"k","J"=>"j","I"=>"i","H"=>"h","G"=>"g",
- "F"=>"f","E"=>"e","D"=>"d","C"=>"c","B"=>"b","A"=>"a","ῼ"=>"ῳ","Ῥ"=>"ῥ","Ῡ"=>"ῡ","Ῑ"=>"ῑ",
- "Ῐ"=>"ῐ","ῌ"=>"ῃ","Ι"=>"ι","ᾼ"=>"ᾳ","Ᾱ"=>"ᾱ","Ᾰ"=>"ᾰ","ᾯ"=>"ᾧ","ᾮ"=>"ᾦ","ᾭ"=>"ᾥ","ᾬ"=>"ᾤ",
- "ᾫ"=>"ᾣ","ᾪ"=>"ᾢ","ᾩ"=>"ᾡ","ᾟ"=>"ᾗ","ᾞ"=>"ᾖ","ᾝ"=>"ᾕ","ᾜ"=>"ᾔ","ᾛ"=>"ᾓ","ᾚ"=>"ᾒ","ᾙ"=>"ᾑ",
- "ᾘ"=>"ᾐ","ᾏ"=>"ᾇ","ᾎ"=>"ᾆ","ᾍ"=>"ᾅ","ᾌ"=>"ᾄ","ᾋ"=>"ᾃ","ᾊ"=>"ᾂ","ᾉ"=>"ᾁ","ᾈ"=>"ᾀ","Ώ"=>"ώ",
- "Ὼ"=>"ὼ","Ύ"=>"ύ","Ὺ"=>"ὺ","Ό"=>"ό","Ὸ"=>"ὸ","Ί"=>"ί","Ὶ"=>"ὶ","Ή"=>"ή","Ὴ"=>"ὴ","Έ"=>"έ",
- "Ὲ"=>"ὲ","Ά"=>"ά","Ὰ"=>"ὰ","Ὧ"=>"ὧ","Ὦ"=>"ὦ","Ὥ"=>"ὥ","Ὤ"=>"ὤ","Ὣ"=>"ὣ","Ὢ"=>"ὢ","Ὡ"=>"ὡ",
- "Ὗ"=>"ὗ","Ὕ"=>"ὕ","Ὓ"=>"ὓ","Ὑ"=>"ὑ","Ὅ"=>"ὅ","Ὄ"=>"ὄ","Ὃ"=>"ὃ","Ὂ"=>"ὂ","Ὁ"=>"ὁ","Ὀ"=>"ὀ",
- "Ἷ"=>"ἷ","Ἶ"=>"ἶ","Ἵ"=>"ἵ","Ἴ"=>"ἴ","Ἳ"=>"ἳ","Ἲ"=>"ἲ","Ἱ"=>"ἱ","Ἰ"=>"ἰ","Ἧ"=>"ἧ","Ἦ"=>"ἦ",
- "Ἥ"=>"ἥ","Ἤ"=>"ἤ","Ἣ"=>"ἣ","Ἢ"=>"ἢ","Ἡ"=>"ἡ","Ἕ"=>"ἕ","Ἔ"=>"ἔ","Ἓ"=>"ἓ","Ἒ"=>"ἒ","Ἑ"=>"ἑ",
- "Ἐ"=>"ἐ","Ἇ"=>"ἇ","Ἆ"=>"ἆ","Ἅ"=>"ἅ","Ἄ"=>"ἄ","Ἃ"=>"ἃ","Ἂ"=>"ἂ","Ἁ"=>"ἁ","Ἀ"=>"ἀ","Ỹ"=>"ỹ",
- "Ỷ"=>"ỷ","Ỵ"=>"ỵ","Ỳ"=>"ỳ","Ự"=>"ự","Ữ"=>"ữ","Ử"=>"ử","Ừ"=>"ừ","Ứ"=>"ứ","Ủ"=>"ủ","Ụ"=>"ụ",
- "Ợ"=>"ợ","Ỡ"=>"ỡ","Ở"=>"ở","Ờ"=>"ờ","Ớ"=>"ớ","Ộ"=>"ộ","Ỗ"=>"ỗ","Ổ"=>"ổ","Ồ"=>"ồ","Ố"=>"ố",
- "Ỏ"=>"ỏ","Ọ"=>"ọ","Ị"=>"ị","Ỉ"=>"ỉ","Ệ"=>"ệ","Ễ"=>"ễ","Ể"=>"ể","Ề"=>"ề","Ế"=>"ế","Ẽ"=>"ẽ",
- "Ẻ"=>"ẻ","Ẹ"=>"ẹ","Ặ"=>"ặ","Ẵ"=>"ẵ","Ẳ"=>"ẳ","Ằ"=>"ằ","Ắ"=>"ắ","Ậ"=>"ậ","Ẫ"=>"ẫ","Ẩ"=>"ẩ",
- "Ầ"=>"ầ","Ấ"=>"ấ","Ả"=>"ả","Ạ"=>"ạ","Ṡ"=>"ẛ","Ẕ"=>"ẕ","Ẓ"=>"ẓ","Ẑ"=>"ẑ","Ẏ"=>"ẏ","Ẍ"=>"ẍ",
- "Ẋ"=>"ẋ","Ẉ"=>"ẉ","Ẇ"=>"ẇ","Ẅ"=>"ẅ","Ẃ"=>"ẃ","Ẁ"=>"ẁ","Ṿ"=>"ṿ","Ṽ"=>"ṽ","Ṻ"=>"ṻ","Ṹ"=>"ṹ",
- "Ṷ"=>"ṷ","Ṵ"=>"ṵ","Ṳ"=>"ṳ","Ṱ"=>"ṱ","Ṯ"=>"ṯ","Ṭ"=>"ṭ","Ṫ"=>"ṫ","Ṩ"=>"ṩ","Ṧ"=>"ṧ","Ṥ"=>"ṥ",
- "Ṣ"=>"ṣ","Ṡ"=>"ṡ","Ṟ"=>"ṟ","Ṝ"=>"ṝ","Ṛ"=>"ṛ","Ṙ"=>"ṙ","Ṗ"=>"ṗ","Ṕ"=>"ṕ","Ṓ"=>"ṓ","Ṑ"=>"ṑ",
- "Ṏ"=>"ṏ","Ṍ"=>"ṍ","Ṋ"=>"ṋ","Ṉ"=>"ṉ","Ṇ"=>"ṇ","Ṅ"=>"ṅ","Ṃ"=>"ṃ","Ṁ"=>"ṁ","Ḿ"=>"ḿ","Ḽ"=>"ḽ",
- "Ḻ"=>"ḻ","Ḹ"=>"ḹ","Ḷ"=>"ḷ","Ḵ"=>"ḵ","Ḳ"=>"ḳ","Ḱ"=>"ḱ","Ḯ"=>"ḯ","Ḭ"=>"ḭ","Ḫ"=>"ḫ","Ḩ"=>"ḩ",
- "Ḧ"=>"ḧ","Ḥ"=>"ḥ","Ḣ"=>"ḣ","Ḡ"=>"ḡ","Ḟ"=>"ḟ","Ḝ"=>"ḝ","Ḛ"=>"ḛ","Ḙ"=>"ḙ","Ḗ"=>"ḗ","Ḕ"=>"ḕ",
- "Ḓ"=>"ḓ","Ḑ"=>"ḑ","Ḏ"=>"ḏ","Ḍ"=>"ḍ","Ḋ"=>"ḋ","Ḉ"=>"ḉ","Ḇ"=>"ḇ","Ḅ"=>"ḅ","Ḃ"=>"ḃ","Ḁ"=>"ḁ",
- "Ֆ"=>"ֆ","Օ"=>"օ","Ք"=>"ք","Փ"=>"փ","Ւ"=>"ւ","Ց"=>"ց","Ր"=>"ր","Տ"=>"տ","Վ"=>"վ","Ս"=>"ս",
- "Ռ"=>"ռ","Ջ"=>"ջ","Պ"=>"պ","Չ"=>"չ","Ո"=>"ո","Շ"=>"շ","Ն"=>"ն","Յ"=>"յ","Մ"=>"մ","Ճ"=>"ճ",
- "Ղ"=>"ղ","Ձ"=>"ձ","Հ"=>"հ","Կ"=>"կ","Ծ"=>"ծ","Խ"=>"խ","Լ"=>"լ","Ի"=>"ի","Ժ"=>"ժ","Թ"=>"թ",
- "Ը"=>"ը","Է"=>"է","Զ"=>"զ","Ե"=>"ե","Դ"=>"դ","Գ"=>"գ","Բ"=>"բ","Ա"=>"ա","Ԏ"=>"ԏ","Ԍ"=>"ԍ",
- "Ԋ"=>"ԋ","Ԉ"=>"ԉ","Ԇ"=>"ԇ","Ԅ"=>"ԅ","Ԃ"=>"ԃ","Ԁ"=>"ԁ","Ӹ"=>"ӹ","Ӵ"=>"ӵ","Ӳ"=>"ӳ","Ӱ"=>"ӱ",
- "Ӯ"=>"ӯ","Ӭ"=>"ӭ","Ӫ"=>"ӫ","Ө"=>"ө","Ӧ"=>"ӧ","Ӥ"=>"ӥ","Ӣ"=>"ӣ","Ӡ"=>"ӡ","Ӟ"=>"ӟ","Ӝ"=>"ӝ",
- "Ӛ"=>"ӛ","Ә"=>"ә","Ӗ"=>"ӗ","Ӕ"=>"ӕ","Ӓ"=>"ӓ","Ӑ"=>"ӑ","Ӎ"=>"ӎ","Ӌ"=>"ӌ","Ӊ"=>"ӊ","Ӈ"=>"ӈ",
- "Ӆ"=>"ӆ","Ӄ"=>"ӄ","Ӂ"=>"ӂ","Ҿ"=>"ҿ","Ҽ"=>"ҽ","Һ"=>"һ","Ҹ"=>"ҹ","Ҷ"=>"ҷ","Ҵ"=>"ҵ","Ҳ"=>"ҳ",
- "Ұ"=>"ұ","Ү"=>"ү","Ҭ"=>"ҭ","Ҫ"=>"ҫ","Ҩ"=>"ҩ","Ҧ"=>"ҧ","Ҥ"=>"ҥ","Ң"=>"ң","Ҡ"=>"ҡ","Ҟ"=>"ҟ",
- "Ҝ"=>"ҝ","Қ"=>"қ","Ҙ"=>"ҙ","Җ"=>"җ","Ҕ"=>"ҕ","Ғ"=>"ғ","Ґ"=>"ґ","Ҏ"=>"ҏ","Ҍ"=>"ҍ","Ҋ"=>"ҋ",
- "Ҁ"=>"ҁ","Ѿ"=>"ѿ","Ѽ"=>"ѽ","Ѻ"=>"ѻ","Ѹ"=>"ѹ","Ѷ"=>"ѷ","Ѵ"=>"ѵ","Ѳ"=>"ѳ","Ѱ"=>"ѱ","Ѯ"=>"ѯ",
- "Ѭ"=>"ѭ","Ѫ"=>"ѫ","Ѩ"=>"ѩ","Ѧ"=>"ѧ","Ѥ"=>"ѥ","Ѣ"=>"ѣ","Ѡ"=>"ѡ","Џ"=>"џ","Ў"=>"ў","Ѝ"=>"ѝ",
- "Ќ"=>"ќ","Ћ"=>"ћ","Њ"=>"њ","Љ"=>"љ","Ј"=>"ј","Ї"=>"ї","І"=>"і","Ѕ"=>"ѕ","Є"=>"є","Ѓ"=>"ѓ",
- "Ђ"=>"ђ","Ё"=>"ё","Ѐ"=>"ѐ","Я"=>"я","Ю"=>"ю","Э"=>"э","Ь"=>"ь","Ы"=>"ы","Ъ"=>"ъ","Щ"=>"щ",
- "Ш"=>"ш","Ч"=>"ч","Ц"=>"ц","Х"=>"х","Ф"=>"ф","У"=>"у","Т"=>"т","С"=>"с","Р"=>"р","П"=>"п",
- "О"=>"о","Н"=>"н","М"=>"м","Л"=>"л","К"=>"к","Й"=>"й","И"=>"и","З"=>"з","Ж"=>"ж","Е"=>"е",
- "Д"=>"д","Г"=>"г","В"=>"в","Б"=>"б","А"=>"а","Ε"=>"ϵ","Σ"=>"ϲ","Ρ"=>"ϱ","Κ"=>"ϰ","Ϯ"=>"ϯ",
- "Ϭ"=>"ϭ","Ϫ"=>"ϫ","Ϩ"=>"ϩ","Ϧ"=>"ϧ","Ϥ"=>"ϥ","Ϣ"=>"ϣ","Ϡ"=>"ϡ","Ϟ"=>"ϟ","Ϝ"=>"ϝ","Ϛ"=>"ϛ",
- "Ϙ"=>"ϙ","Π"=>"ϖ","Φ"=>"ϕ","Θ"=>"ϑ","Β"=>"ϐ","Ώ"=>"ώ","Ύ"=>"ύ","Ό"=>"ό","Ϋ"=>"ϋ","Ϊ"=>"ϊ",
- "Ω"=>"ω","Ψ"=>"ψ","Χ"=>"χ","Φ"=>"φ","Υ"=>"υ","Τ"=>"τ","Σ"=>"σ","Σ"=>"ς","Ρ"=>"ρ","Π"=>"π",
- "Ο"=>"ο","Ξ"=>"ξ","Ν"=>"ν","Μ"=>"μ","Λ"=>"λ","Κ"=>"κ","Ι"=>"ι","Θ"=>"θ","Η"=>"η","Ζ"=>"ζ",
- "Ε"=>"ε","Δ"=>"δ","Γ"=>"γ","Β"=>"β","Α"=>"α","Ί"=>"ί","Ή"=>"ή","Έ"=>"έ","Ά"=>"ά","Ʒ"=>"ʒ",
- "Ʋ"=>"ʋ","Ʊ"=>"ʊ","Ʈ"=>"ʈ","Ʃ"=>"ʃ","Ʀ"=>"ʀ","Ɵ"=>"ɵ","Ɲ"=>"ɲ","Ɯ"=>"ɯ","Ɩ"=>"ɩ","Ɨ"=>"ɨ",
- "Ɣ"=>"ɣ","Ɛ"=>"ɛ","Ə"=>"ə","Ɗ"=>"ɗ","Ɖ"=>"ɖ","Ɔ"=>"ɔ","Ɓ"=>"ɓ","Ȳ"=>"ȳ","Ȱ"=>"ȱ","Ȯ"=>"ȯ",
- "Ȭ"=>"ȭ","Ȫ"=>"ȫ","Ȩ"=>"ȩ","Ȧ"=>"ȧ","Ȥ"=>"ȥ","Ȣ"=>"ȣ","Ȟ"=>"ȟ","Ȝ"=>"ȝ","Ț"=>"ț","Ș"=>"ș",
- "Ȗ"=>"ȗ","Ȕ"=>"ȕ","Ȓ"=>"ȓ","Ȑ"=>"ȑ","Ȏ"=>"ȏ","Ȍ"=>"ȍ","Ȋ"=>"ȋ","Ȉ"=>"ȉ","Ȇ"=>"ȇ","Ȅ"=>"ȅ",
- "Ȃ"=>"ȃ","Ȁ"=>"ȁ","Ǿ"=>"ǿ","Ǽ"=>"ǽ","Ǻ"=>"ǻ","Ǹ"=>"ǹ","Ǵ"=>"ǵ","Dz"=>"dz","Ǯ"=>"ǯ","Ǭ"=>"ǭ",
- "Ǫ"=>"ǫ","Ǩ"=>"ǩ","Ǧ"=>"ǧ","Ǥ"=>"ǥ","Ǣ"=>"ǣ","Ǡ"=>"ǡ","Ǟ"=>"ǟ","Ǝ"=>"ǝ","Ǜ"=>"ǜ","Ǚ"=>"ǚ",
- "Ǘ"=>"ǘ","Ǖ"=>"ǖ","Ǔ"=>"ǔ","Ǒ"=>"ǒ","Ǐ"=>"ǐ","Ǎ"=>"ǎ","Nj"=>"nj","Lj"=>"lj","Dž"=>"dž","Ƿ"=>"ƿ",
- "Ƽ"=>"ƽ","Ƹ"=>"ƹ","Ƶ"=>"ƶ","Ƴ"=>"ƴ","Ư"=>"ư","Ƭ"=>"ƭ","Ƨ"=>"ƨ","Ƥ"=>"ƥ","Ƣ"=>"ƣ","Ơ"=>"ơ",
- "Ƞ"=>"ƞ","Ƙ"=>"ƙ","Ƕ"=>"ƕ","Ƒ"=>"ƒ","Ƌ"=>"ƌ","Ƈ"=>"ƈ","Ƅ"=>"ƅ","Ƃ"=>"ƃ","S"=>"ſ","Ž"=>"ž",
- "Ż"=>"ż","Ź"=>"ź","Ŷ"=>"ŷ","Ŵ"=>"ŵ","Ų"=>"ų","Ű"=>"ű","Ů"=>"ů","Ŭ"=>"ŭ","Ū"=>"ū","Ũ"=>"ũ",
- "Ŧ"=>"ŧ","Ť"=>"ť","Ţ"=>"ţ","Š"=>"š","Ş"=>"ş","Ŝ"=>"ŝ","Ś"=>"ś","Ř"=>"ř","Ŗ"=>"ŗ","Ŕ"=>"ŕ",
- "Œ"=>"œ","Ő"=>"ő","Ŏ"=>"ŏ","Ō"=>"ō","Ŋ"=>"ŋ","Ň"=>"ň","Ņ"=>"ņ","Ń"=>"ń","Ł"=>"ł","Ŀ"=>"ŀ",
- "Ľ"=>"ľ","Ļ"=>"ļ","Ĺ"=>"ĺ","Ķ"=>"ķ","Ĵ"=>"ĵ","IJ"=>"ij","I"=>"ı","Į"=>"į","Ĭ"=>"ĭ","Ī"=>"ī",
- "Ĩ"=>"ĩ","Ħ"=>"ħ","Ĥ"=>"ĥ","Ģ"=>"ģ","Ġ"=>"ġ","Ğ"=>"ğ","Ĝ"=>"ĝ","Ě"=>"ě","Ę"=>"ę","Ė"=>"ė",
- "Ĕ"=>"ĕ","Ē"=>"ē","Đ"=>"đ","Ď"=>"ď","Č"=>"č","Ċ"=>"ċ","Ĉ"=>"ĉ","Ć"=>"ć","Ą"=>"ą","Ă"=>"ă",
- "Ā"=>"ā","Ÿ"=>"ÿ","Þ"=>"þ","Ý"=>"ý","Ü"=>"ü","Û"=>"û","Ú"=>"ú","Ù"=>"ù","Ø"=>"ø","Ö"=>"ö",
- "Õ"=>"õ","Ô"=>"ô","Ó"=>"ó","Ò"=>"ò","Ñ"=>"ñ","Ð"=>"ð","Ï"=>"ï","Î"=>"î","Í"=>"í","Ì"=>"ì",
- "Ë"=>"ë","Ê"=>"ê","É"=>"é","È"=>"è","Ç"=>"ç","Æ"=>"æ","Å"=>"å","Ä"=>"ä","Ã"=>"ã","Â"=>"â",
- "Á"=>"á","À"=>"à","Μ"=>"µ","Z"=>"z","Y"=>"y","X"=>"x","W"=>"w","V"=>"v","U"=>"u","T"=>"t",
- "S"=>"s","R"=>"r","Q"=>"q","P"=>"p","O"=>"o","N"=>"n","M"=>"m","L"=>"l","K"=>"k","J"=>"j",
- "I"=>"i","H"=>"h","G"=>"g","F"=>"f","E"=>"e","D"=>"d","C"=>"c","B"=>"b","A"=>"a"
- );
-}; // end of case lookup tables
-
-/**
- * UTF-8 lookup table for lower case accented letters
- *
- * This lookuptable defines replacements for accented characters from the ASCII-7
- * range. This are lower case letters only.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @see utf8_deaccent()
- */
-global $UTF8_LOWER_ACCENTS;
-if(empty($UTF8_LOWER_ACCENTS)) $UTF8_LOWER_ACCENTS = array(
- 'à' => 'a', 'ô' => 'o', 'ď' => 'd', 'ḟ' => 'f', 'ë' => 'e', 'š' => 's', 'ơ' => 'o',
- 'ß' => 'ss', 'ă' => 'a', 'ř' => 'r', 'ț' => 't', 'ň' => 'n', 'ā' => 'a', 'ķ' => 'k',
- 'ŝ' => 's', 'ỳ' => 'y', 'ņ' => 'n', 'ĺ' => 'l', 'ħ' => 'h', 'ṗ' => 'p', 'ó' => 'o',
- 'ú' => 'u', 'ě' => 'e', 'é' => 'e', 'ç' => 'c', 'ẁ' => 'w', 'ċ' => 'c', 'õ' => 'o',
- 'ṡ' => 's', 'ø' => 'o', 'ģ' => 'g', 'ŧ' => 't', 'ș' => 's', 'ė' => 'e', 'ĉ' => 'c',
- 'ś' => 's', 'î' => 'i', 'ű' => 'u', 'ć' => 'c', 'ę' => 'e', 'ŵ' => 'w', 'ṫ' => 't',
- 'ū' => 'u', 'č' => 'c', 'ö' => 'oe', 'è' => 'e', 'ŷ' => 'y', 'ą' => 'a', 'ł' => 'l',
- 'ų' => 'u', 'ů' => 'u', 'ş' => 's', 'ğ' => 'g', 'ļ' => 'l', 'ƒ' => 'f', 'ž' => 'z',
- 'ẃ' => 'w', 'ḃ' => 'b', 'å' => 'a', 'ì' => 'i', 'ï' => 'i', 'ḋ' => 'd', 'ť' => 't',
- 'ŗ' => 'r', 'ä' => 'ae', 'í' => 'i', 'ŕ' => 'r', 'ê' => 'e', 'ü' => 'ue', 'ò' => 'o',
- 'ē' => 'e', 'ñ' => 'n', 'ń' => 'n', 'ĥ' => 'h', 'ĝ' => 'g', 'đ' => 'd', 'ĵ' => 'j',
- 'ÿ' => 'y', 'ũ' => 'u', 'ŭ' => 'u', 'ư' => 'u', 'ţ' => 't', 'ý' => 'y', 'ő' => 'o',
- 'â' => 'a', 'ľ' => 'l', 'ẅ' => 'w', 'ż' => 'z', 'ī' => 'i', 'ã' => 'a', 'ġ' => 'g',
- 'ṁ' => 'm', 'ō' => 'o', 'ĩ' => 'i', 'ù' => 'u', 'į' => 'i', 'ź' => 'z', 'á' => 'a',
- 'û' => 'u', 'þ' => 'th', 'ð' => 'dh', 'æ' => 'ae', 'µ' => 'u', 'ĕ' => 'e',
-);
-
-/**
- * UTF-8 lookup table for upper case accented letters
- *
- * This lookuptable defines replacements for accented characters from the ASCII-7
- * range. This are upper case letters only.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @see utf8_deaccent()
- */
-global $UTF8_UPPER_ACCENTS;
-if(empty($UTF8_UPPER_ACCENTS)) $UTF8_UPPER_ACCENTS = array(
- 'À' => 'A', 'Ô' => 'O', 'Ď' => 'D', 'Ḟ' => 'F', 'Ë' => 'E', 'Š' => 'S', 'Ơ' => 'O',
- 'Ă' => 'A', 'Ř' => 'R', 'Ț' => 'T', 'Ň' => 'N', 'Ā' => 'A', 'Ķ' => 'K',
- 'Ŝ' => 'S', 'Ỳ' => 'Y', 'Ņ' => 'N', 'Ĺ' => 'L', 'Ħ' => 'H', 'Ṗ' => 'P', 'Ó' => 'O',
- 'Ú' => 'U', 'Ě' => 'E', 'É' => 'E', 'Ç' => 'C', 'Ẁ' => 'W', 'Ċ' => 'C', 'Õ' => 'O',
- 'Ṡ' => 'S', 'Ø' => 'O', 'Ģ' => 'G', 'Ŧ' => 'T', 'Ș' => 'S', 'Ė' => 'E', 'Ĉ' => 'C',
- 'Ś' => 'S', 'Î' => 'I', 'Ű' => 'U', 'Ć' => 'C', 'Ę' => 'E', 'Ŵ' => 'W', 'Ṫ' => 'T',
- 'Ū' => 'U', 'Č' => 'C', 'Ö' => 'Oe', 'È' => 'E', 'Ŷ' => 'Y', 'Ą' => 'A', 'Ł' => 'L',
- 'Ų' => 'U', 'Ů' => 'U', 'Ş' => 'S', 'Ğ' => 'G', 'Ļ' => 'L', 'Ƒ' => 'F', 'Ž' => 'Z',
- 'Ẃ' => 'W', 'Ḃ' => 'B', 'Å' => 'A', 'Ì' => 'I', 'Ï' => 'I', 'Ḋ' => 'D', 'Ť' => 'T',
- 'Ŗ' => 'R', 'Ä' => 'Ae', 'Í' => 'I', 'Ŕ' => 'R', 'Ê' => 'E', 'Ü' => 'Ue', 'Ò' => 'O',
- 'Ē' => 'E', 'Ñ' => 'N', 'Ń' => 'N', 'Ĥ' => 'H', 'Ĝ' => 'G', 'Đ' => 'D', 'Ĵ' => 'J',
- 'Ÿ' => 'Y', 'Ũ' => 'U', 'Ŭ' => 'U', 'Ư' => 'U', 'Ţ' => 'T', 'Ý' => 'Y', 'Ő' => 'O',
- 'Â' => 'A', 'Ľ' => 'L', 'Ẅ' => 'W', 'Ż' => 'Z', 'Ī' => 'I', 'Ã' => 'A', 'Ġ' => 'G',
- 'Ṁ' => 'M', 'Ō' => 'O', 'Ĩ' => 'I', 'Ù' => 'U', 'Į' => 'I', 'Ź' => 'Z', 'Á' => 'A',
- 'Û' => 'U', 'Þ' => 'Th', 'Ð' => 'Dh', 'Æ' => 'Ae', 'Ĕ' => 'E',
-);
-
-/**
- * UTF-8 array of common special characters
- *
- * This array should contain all special characters (not a letter or digit)
- * defined in the various local charsets - it's not a complete list of non-alphanum
- * characters in UTF-8. It's not perfect but should match most cases of special
- * chars.
- *
- * The controlchars 0x00 to 0x19 are _not_ included in this array. The space 0x20 is!
- * These chars are _not_ in the array either: _ (0x5f), : 0x3a, . 0x2e, - 0x2d, * 0x2a
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @see utf8_stripspecials()
- */
-global $UTF8_SPECIAL_CHARS;
-if(empty($UTF8_SPECIAL_CHARS)) $UTF8_SPECIAL_CHARS = array(
- 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023,
- 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002b, 0x002c,
- 0x002f, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x005b,
- 0x005c, 0x005d, 0x005e, 0x0060, 0x007b, 0x007c, 0x007d, 0x007e,
- 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088,
- 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092,
- 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c,
- 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6,
- 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0,
- 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba,
- 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00d7, 0x00f7, 0x02c7, 0x02d8, 0x02d9,
- 0x02da, 0x02db, 0x02dc, 0x02dd, 0x0300, 0x0301, 0x0303, 0x0309, 0x0323, 0x0384,
- 0x0385, 0x0387, 0x03c6, 0x03d1, 0x03d2, 0x03d5, 0x03d6, 0x05b0, 0x05b1,
- 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, 0x05b8, 0x05b9, 0x05bb, 0x05bc,
- 0x05bd, 0x05be, 0x05bf, 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f3, 0x05f4, 0x060c,
- 0x061b, 0x061f, 0x0640, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, 0x0651,
- 0x0652, 0x066a, 0x0e3f, 0x200c, 0x200d, 0x200e, 0x200f, 0x2013, 0x2014, 0x2015,
- 0x2017, 0x2018, 0x2019, 0x201a, 0x201c, 0x201d, 0x201e, 0x2020, 0x2021, 0x2022,
- 0x2026, 0x2030, 0x2032, 0x2033, 0x2039, 0x203a, 0x2044, 0x20a7, 0x20aa, 0x20ab,
- 0x20ac, 0x2116, 0x2118, 0x2122, 0x2126, 0x2135, 0x2190, 0x2191, 0x2192, 0x2193,
- 0x2194, 0x2195, 0x21b5, 0x21d0, 0x21d1, 0x21d2, 0x21d3, 0x21d4, 0x2200, 0x2202,
- 0x2203, 0x2205, 0x2206, 0x2207, 0x2208, 0x2209, 0x220b, 0x220f, 0x2211, 0x2212,
- 0x2215, 0x2217, 0x2219, 0x221a, 0x221d, 0x221e, 0x2220, 0x2227, 0x2228, 0x2229,
- 0x222a, 0x222b, 0x2234, 0x223c, 0x2245, 0x2248, 0x2260, 0x2261, 0x2264, 0x2265,
- 0x2282, 0x2283, 0x2284, 0x2286, 0x2287, 0x2295, 0x2297, 0x22a5, 0x22c5, 0x2310,
- 0x2320, 0x2321, 0x2329, 0x232a, 0x2469, 0x2500, 0x2502, 0x250c, 0x2510, 0x2514,
- 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2550, 0x2551, 0x2552, 0x2553,
- 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d,
- 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567,
- 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590,
- 0x2591, 0x2592, 0x2593, 0x25a0, 0x25b2, 0x25bc, 0x25c6, 0x25ca, 0x25cf, 0x25d7,
- 0x2605, 0x260e, 0x261b, 0x261e, 0x2660, 0x2663, 0x2665, 0x2666, 0x2701, 0x2702,
- 0x2703, 0x2704, 0x2706, 0x2707, 0x2708, 0x2709, 0x270c, 0x270d, 0x270e, 0x270f,
- 0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717, 0x2718, 0x2719,
- 0x271a, 0x271b, 0x271c, 0x271d, 0x271e, 0x271f, 0x2720, 0x2721, 0x2722, 0x2723,
- 0x2724, 0x2725, 0x2726, 0x2727, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e,
- 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738,
- 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2742,
- 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0x274a, 0x274b, 0x274d,
- 0x274f, 0x2750, 0x2751, 0x2752, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c,
- 0x275d, 0x275e, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x277f,
- 0x2789, 0x2793, 0x2794, 0x2798, 0x2799, 0x279a, 0x279b, 0x279c, 0x279d, 0x279e,
- 0x279f, 0x27a0, 0x27a1, 0x27a2, 0x27a3, 0x27a4, 0x27a5, 0x27a6, 0x27a7, 0x27a8,
- 0x27a9, 0x27aa, 0x27ab, 0x27ac, 0x27ad, 0x27ae, 0x27af, 0x27b1, 0x27b2, 0x27b3,
- 0x27b4, 0x27b5, 0x27b6, 0x27b7, 0x27b8, 0x27b9, 0x27ba, 0x27bb, 0x27bc, 0x27bd,
- 0x27be, 0x3000, 0x3001, 0x3002, 0x3003, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c,
- 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x3012, 0x3014, 0x3015, 0x3016, 0x3017,
- 0x3018, 0x3019, 0x301a, 0x301b, 0x3036,
- 0xf6d9, 0xf6da, 0xf6db, 0xf8d7, 0xf8d8, 0xf8d9, 0xf8da, 0xf8db, 0xf8dc,
- 0xf8dd, 0xf8de, 0xf8df, 0xf8e0, 0xf8e1, 0xf8e2, 0xf8e3, 0xf8e4, 0xf8e5, 0xf8e6,
- 0xf8e7, 0xf8e8, 0xf8e9, 0xf8ea, 0xf8eb, 0xf8ec, 0xf8ed, 0xf8ee, 0xf8ef, 0xf8f0,
- 0xf8f1, 0xf8f2, 0xf8f3, 0xf8f4, 0xf8f5, 0xf8f6, 0xf8f7, 0xf8f8, 0xf8f9, 0xf8fa,
- 0xf8fb, 0xf8fc, 0xf8fd, 0xf8fe, 0xfe7c, 0xfe7d,
- 0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, 0xff08, 0xff09,
- 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff1a, 0xff1b, 0xff1c,
- 0xff1d, 0xff1e, 0xff1f, 0xff20, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff40, 0xff5b,
- 0xff5c, 0xff5d, 0xff5e, 0xff5f, 0xff60, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65,
- 0xffe0, 0xffe1, 0xffe2, 0xffe3, 0xffe4, 0xffe5, 0xffe6, 0xffe8, 0xffe9, 0xffea,
- 0xffeb, 0xffec, 0xffed, 0xffee,
- 0x01d6fc, 0x01d6fd, 0x01d6fe, 0x01d6ff, 0x01d700, 0x01d701, 0x01d702, 0x01d703,
- 0x01d704, 0x01d705, 0x01d706, 0x01d707, 0x01d708, 0x01d709, 0x01d70a, 0x01d70b,
- 0x01d70c, 0x01d70d, 0x01d70e, 0x01d70f, 0x01d710, 0x01d711, 0x01d712, 0x01d713,
- 0x01d714, 0x01d715, 0x01d716, 0x01d717, 0x01d718, 0x01d719, 0x01d71a, 0x01d71b,
- 0xc2a0, 0xe28087, 0xe280af, 0xe281a0, 0xefbbbf,
-);
-
-// utf8 version of above data
-global $UTF8_SPECIAL_CHARS2;
-if(empty($UTF8_SPECIAL_CHARS2)) $UTF8_SPECIAL_CHARS2 =
- "\x1A".' !"#$%&\'()+,/;<=>?@[\]^`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•�'.
- '�—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½�'.
- '�¿×÷ˇ˘˙˚˛˜˝̣̀́̃̉΄΅·ϖְֱֲֳִֵֶַָֹֻּֽ־ֿ�'.
- '�ׁׂ׃׳״،؛؟ـًٌٍَُِّْ٪฿‌‍‎‏–—―‗‘’‚“”�'.
- '��†‡•…‰′″‹›⁄₧₪₫€№℘™Ωℵ←↑→↓↔↕↵'.
- '⇐⇑⇒⇓⇔∀∂∃∅∆∇∈∉∋∏∑−∕∗∙√∝∞∠∧∨�'.
- '�∪∫∴∼≅≈≠≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌐⌠⌡〈〉⑩─�'.
- '��┌┐└┘├┤┬┴┼═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠'.
- '╡╢╣╤╥╦╧╨╩╪╫╬▀▄█▌▐░▒▓■▲▼◆◊●�'.
- '�★☎☛☞♠♣♥♦✁✂✃✄✆✇✈✉✌✍✎✏✐✑✒✓✔✕�'.
- '��✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✩✪✫✬✭✮✯✰✱'.
- '✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋�'.
- '�❏❐❑❒❖❘❙❚❛❜❝❞❡❢❣❤❥❦❧❿➉➓➔➘➙➚�'.
- '��➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➱➲➳➴➵➶'.
- '➷➸➹➺➻➼➽➾'.
- ' 、。〃〈〉《》「」『』【】〒〔〕〖〗〘〙〚〛〶'.
- '�'.
- '�ﹼﹽ'.
- '!"#$%&'()*+,-./:;<=>?@[\]^`{|}~'.
- '⦅⦆。「」、・¢£¬ ̄¦¥₩│←↑→↓■○'.
- '𝛼𝛽𝛾𝛿𝜀𝜁𝜂𝜃𝜄𝜅𝜆𝜇𝜈𝜉𝜊𝜋𝜌𝜍𝜎𝜏𝜐𝜑𝜒𝜓𝜔𝜕𝜖𝜗𝜘𝜙𝜚𝜛'.
- '   ⁠';
-
-/**
- * Romanization lookup table
- *
- * This lookup tables provides a way to transform strings written in a language
- * different from the ones based upon latin letters into plain ASCII.
- *
- * Please note: this is not a scientific transliteration table. It only works
- * oneway from nonlatin to ASCII and it works by simple character replacement
- * only. Specialities of each language are not supported.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Vitaly Blokhin <vitinfo@vitn.com>
- * @link http://www.uconv.com/translit.htm
- * @author Bisqwit <bisqwit@iki.fi>
- * @link http://kanjidict.stc.cx/hiragana.php?src=2
- * @link http://www.translatum.gr/converter/greek-transliteration.htm
- * @link http://en.wikipedia.org/wiki/Royal_Thai_General_System_of_Transcription
- * @link http://www.btranslations.com/resources/romanization/korean.asp
- * @author Arthit Suriyawongkul <arthit@gmail.com>
- * @author Denis Scheither <amorphis@uni-bremen.de>
- * @author Eivind Morland <eivind.morland@gmail.com>
- */
-global $UTF8_ROMANIZATION;
-if(empty($UTF8_ROMANIZATION)) $UTF8_ROMANIZATION = array(
- // scandinavian - differs from what we do in deaccent
- 'å'=>'a','Å'=>'A','ä'=>'a','Ä'=>'A','ö'=>'o','Ö'=>'O',
-
- //russian cyrillic
- 'а'=>'a','А'=>'A','б'=>'b','Б'=>'B','в'=>'v','В'=>'V','г'=>'g','Г'=>'G',
- 'д'=>'d','Д'=>'D','е'=>'e','Е'=>'E','ё'=>'jo','Ё'=>'Jo','ж'=>'zh','Ж'=>'Zh',
- 'з'=>'z','З'=>'Z','и'=>'i','И'=>'I','й'=>'j','Й'=>'J','к'=>'k','К'=>'K',
- 'л'=>'l','Л'=>'L','м'=>'m','М'=>'M','н'=>'n','Н'=>'N','о'=>'o','О'=>'O',
- 'п'=>'p','П'=>'P','р'=>'r','Р'=>'R','с'=>'s','С'=>'S','т'=>'t','Т'=>'T',
- 'у'=>'u','У'=>'U','ф'=>'f','Ф'=>'F','х'=>'x','Х'=>'X','ц'=>'c','Ц'=>'C',
- 'ч'=>'ch','Ч'=>'Ch','ш'=>'sh','Ш'=>'Sh','щ'=>'sch','Щ'=>'Sch','ъ'=>'',
- 'Ъ'=>'','ы'=>'y','Ы'=>'Y','ь'=>'','Ь'=>'','э'=>'eh','Э'=>'Eh','ю'=>'ju',
- 'Ю'=>'Ju','я'=>'ja','Я'=>'Ja',
- // Ukrainian cyrillic
- 'Ґ'=>'Gh','ґ'=>'gh','Є'=>'Je','є'=>'je','І'=>'I','і'=>'i','Ї'=>'Ji','ї'=>'ji',
- // Georgian
- 'ა'=>'a','ბ'=>'b','გ'=>'g','დ'=>'d','ე'=>'e','ვ'=>'v','ზ'=>'z','თ'=>'th',
- 'ი'=>'i','კ'=>'p','ლ'=>'l','მ'=>'m','ნ'=>'n','ო'=>'o','პ'=>'p','ჟ'=>'zh',
- 'რ'=>'r','ს'=>'s','ტ'=>'t','უ'=>'u','ფ'=>'ph','ქ'=>'kh','ღ'=>'gh','ყ'=>'q',
- 'შ'=>'sh','ჩ'=>'ch','ც'=>'c','ძ'=>'dh','წ'=>'w','ჭ'=>'j','ხ'=>'x','ჯ'=>'jh',
- 'ჰ'=>'xh',
- //Sanskrit
- 'अ'=>'a','आ'=>'ah','इ'=>'i','ई'=>'ih','उ'=>'u','ऊ'=>'uh','ऋ'=>'ry',
- 'ॠ'=>'ryh','ऌ'=>'ly','ॡ'=>'lyh','ए'=>'e','ऐ'=>'ay','ओ'=>'o','औ'=>'aw',
- 'अं'=>'amh','अः'=>'aq','क'=>'k','ख'=>'kh','ग'=>'g','घ'=>'gh','ङ'=>'nh',
- 'च'=>'c','छ'=>'ch','ज'=>'j','झ'=>'jh','ञ'=>'ny','ट'=>'tq','ठ'=>'tqh',
- 'ड'=>'dq','ढ'=>'dqh','ण'=>'nq','त'=>'t','थ'=>'th','द'=>'d','ध'=>'dh',
- 'न'=>'n','प'=>'p','फ'=>'ph','ब'=>'b','भ'=>'bh','म'=>'m','य'=>'z','र'=>'r',
- 'ल'=>'l','व'=>'v','श'=>'sh','ष'=>'sqh','स'=>'s','ह'=>'x',
- //Sanskrit diacritics
- 'Ā'=>'A','Ī'=>'I','Ū'=>'U','Ṛ'=>'R','Ṝ'=>'R','Ṅ'=>'N','Ñ'=>'N','Ṭ'=>'T',
- 'Ḍ'=>'D','Ṇ'=>'N','Ś'=>'S','Ṣ'=>'S','Ṁ'=>'M','Ṃ'=>'M','Ḥ'=>'H','Ḷ'=>'L','Ḹ'=>'L',
- 'ā'=>'a','ī'=>'i','ū'=>'u','ṛ'=>'r','ṝ'=>'r','ṅ'=>'n','ñ'=>'n','ṭ'=>'t',
- 'ḍ'=>'d','ṇ'=>'n','ś'=>'s','ṣ'=>'s','ṁ'=>'m','ṃ'=>'m','ḥ'=>'h','ḷ'=>'l','ḹ'=>'l',
- //Hebrew
- 'א'=>'a', 'ב'=>'b','ג'=>'g','ד'=>'d','ה'=>'h','ו'=>'v','ז'=>'z','ח'=>'kh','ט'=>'th',
- 'י'=>'y','ך'=>'h','כ'=>'k','ל'=>'l','ם'=>'m','מ'=>'m','ן'=>'n','נ'=>'n',
- 'ס'=>'s','ע'=>'ah','ף'=>'f','פ'=>'p','ץ'=>'c','צ'=>'c','ק'=>'q','ר'=>'r',
- 'ש'=>'sh','ת'=>'t',
- //Arabic
- 'ا'=>'a','ب'=>'b','ت'=>'t','ث'=>'th','ج'=>'g','ح'=>'xh','خ'=>'x','د'=>'d',
- 'ذ'=>'dh','ر'=>'r','ز'=>'z','س'=>'s','ش'=>'sh','ص'=>'s\'','ض'=>'d\'',
- 'ط'=>'t\'','ظ'=>'z\'','ع'=>'y','غ'=>'gh','ف'=>'f','ق'=>'q','ك'=>'k',
- 'ل'=>'l','م'=>'m','ن'=>'n','ه'=>'x\'','و'=>'u','ي'=>'i',
-
- // Japanese characters (last update: 2008-05-09)
-
- // Japanese hiragana
-
- // 3 character syllables, っ doubles the consonant after
- 'っちゃ'=>'ccha','っちぇ'=>'cche','っちょ'=>'ccho','っちゅ'=>'cchu',
- 'っびゃ'=>'bbya','っびぇ'=>'bbye','っびぃ'=>'bbyi','っびょ'=>'bbyo','っびゅ'=>'bbyu',
- 'っぴゃ'=>'ppya','っぴぇ'=>'ppye','っぴぃ'=>'ppyi','っぴょ'=>'ppyo','っぴゅ'=>'ppyu',
- 'っちゃ'=>'ccha','っちぇ'=>'cche','っち'=>'cchi','っちょ'=>'ccho','っちゅ'=>'cchu',
- // 'っひゃ'=>'hya','っひぇ'=>'hye','っひぃ'=>'hyi','っひょ'=>'hyo','っひゅ'=>'hyu',
- 'っきゃ'=>'kkya','っきぇ'=>'kkye','っきぃ'=>'kkyi','っきょ'=>'kkyo','っきゅ'=>'kkyu',
- 'っぎゃ'=>'ggya','っぎぇ'=>'ggye','っぎぃ'=>'ggyi','っぎょ'=>'ggyo','っぎゅ'=>'ggyu',
- 'っみゃ'=>'mmya','っみぇ'=>'mmye','っみぃ'=>'mmyi','っみょ'=>'mmyo','っみゅ'=>'mmyu',
- 'っにゃ'=>'nnya','っにぇ'=>'nnye','っにぃ'=>'nnyi','っにょ'=>'nnyo','っにゅ'=>'nnyu',
- 'っりゃ'=>'rrya','っりぇ'=>'rrye','っりぃ'=>'rryi','っりょ'=>'rryo','っりゅ'=>'rryu',
- 'っしゃ'=>'ssha','っしぇ'=>'sshe','っし'=>'sshi','っしょ'=>'ssho','っしゅ'=>'sshu',
-
- // seperate hiragana 'n' ('n' + 'i' != 'ni', normally we would write "kon'nichi wa" but the apostrophe would be converted to _ anyway)
- 'んあ'=>'n_a','んえ'=>'n_e','んい'=>'n_i','んお'=>'n_o','んう'=>'n_u',
- 'んや'=>'n_ya','んよ'=>'n_yo','んゆ'=>'n_yu',
-
- // 2 character syllables - normal
- 'ふぁ'=>'fa','ふぇ'=>'fe','ふぃ'=>'fi','ふぉ'=>'fo',
- 'ちゃ'=>'cha','ちぇ'=>'che','ち'=>'chi','ちょ'=>'cho','ちゅ'=>'chu',
- 'ひゃ'=>'hya','ひぇ'=>'hye','ひぃ'=>'hyi','ひょ'=>'hyo','ひゅ'=>'hyu',
- 'びゃ'=>'bya','びぇ'=>'bye','びぃ'=>'byi','びょ'=>'byo','びゅ'=>'byu',
- 'ぴゃ'=>'pya','ぴぇ'=>'pye','ぴぃ'=>'pyi','ぴょ'=>'pyo','ぴゅ'=>'pyu',
- 'きゃ'=>'kya','きぇ'=>'kye','きぃ'=>'kyi','きょ'=>'kyo','きゅ'=>'kyu',
- 'ぎゃ'=>'gya','ぎぇ'=>'gye','ぎぃ'=>'gyi','ぎょ'=>'gyo','ぎゅ'=>'gyu',
- 'みゃ'=>'mya','みぇ'=>'mye','みぃ'=>'myi','みょ'=>'myo','みゅ'=>'myu',
- 'にゃ'=>'nya','にぇ'=>'nye','にぃ'=>'nyi','にょ'=>'nyo','にゅ'=>'nyu',
- 'りゃ'=>'rya','りぇ'=>'rye','りぃ'=>'ryi','りょ'=>'ryo','りゅ'=>'ryu',
- 'しゃ'=>'sha','しぇ'=>'she','し'=>'shi','しょ'=>'sho','しゅ'=>'shu',
- 'じゃ'=>'ja','じぇ'=>'je','じょ'=>'jo','じゅ'=>'ju',
- 'うぇ'=>'we','うぃ'=>'wi',
- 'いぇ'=>'ye',
-
- // 2 character syllables, っ doubles the consonant after
- 'っば'=>'bba','っべ'=>'bbe','っび'=>'bbi','っぼ'=>'bbo','っぶ'=>'bbu',
- 'っぱ'=>'ppa','っぺ'=>'ppe','っぴ'=>'ppi','っぽ'=>'ppo','っぷ'=>'ppu',
- 'った'=>'tta','って'=>'tte','っち'=>'cchi','っと'=>'tto','っつ'=>'ttsu',
- 'っだ'=>'dda','っで'=>'dde','っぢ'=>'ddi','っど'=>'ddo','っづ'=>'ddu',
- 'っが'=>'gga','っげ'=>'gge','っぎ'=>'ggi','っご'=>'ggo','っぐ'=>'ggu',
- 'っか'=>'kka','っけ'=>'kke','っき'=>'kki','っこ'=>'kko','っく'=>'kku',
- 'っま'=>'mma','っめ'=>'mme','っみ'=>'mmi','っも'=>'mmo','っむ'=>'mmu',
- 'っな'=>'nna','っね'=>'nne','っに'=>'nni','っの'=>'nno','っぬ'=>'nnu',
- 'っら'=>'rra','っれ'=>'rre','っり'=>'rri','っろ'=>'rro','っる'=>'rru',
- 'っさ'=>'ssa','っせ'=>'sse','っし'=>'sshi','っそ'=>'sso','っす'=>'ssu',
- 'っざ'=>'zza','っぜ'=>'zze','っじ'=>'jji','っぞ'=>'zzo','っず'=>'zzu',
-
- // 1 character syllabels
- 'あ'=>'a','え'=>'e','い'=>'i','お'=>'o','う'=>'u','ん'=>'n',
- 'は'=>'ha','へ'=>'he','ひ'=>'hi','ほ'=>'ho','ふ'=>'fu',
- 'ば'=>'ba','べ'=>'be','び'=>'bi','ぼ'=>'bo','ぶ'=>'bu',
- 'ぱ'=>'pa','ぺ'=>'pe','ぴ'=>'pi','ぽ'=>'po','ぷ'=>'pu',
- 'た'=>'ta','て'=>'te','ち'=>'chi','と'=>'to','つ'=>'tsu',
- 'だ'=>'da','で'=>'de','ぢ'=>'di','ど'=>'do','づ'=>'du',
- 'が'=>'ga','げ'=>'ge','ぎ'=>'gi','ご'=>'go','ぐ'=>'gu',
- 'か'=>'ka','け'=>'ke','き'=>'ki','こ'=>'ko','く'=>'ku',
- 'ま'=>'ma','め'=>'me','み'=>'mi','も'=>'mo','む'=>'mu',
- 'な'=>'na','ね'=>'ne','に'=>'ni','の'=>'no','ぬ'=>'nu',
- 'ら'=>'ra','れ'=>'re','り'=>'ri','ろ'=>'ro','る'=>'ru',
- 'さ'=>'sa','せ'=>'se','し'=>'shi','そ'=>'so','す'=>'su',
- 'わ'=>'wa','を'=>'wo',
- 'ざ'=>'za','ぜ'=>'ze','じ'=>'ji','ぞ'=>'zo','ず'=>'zu',
- 'や'=>'ya','よ'=>'yo','ゆ'=>'yu',
- // old characters
- 'ゑ'=>'we','ゐ'=>'wi',
-
- // convert what's left (probably only kicks in when something's missing above)
- // 'ぁ'=>'a','ぇ'=>'e','ぃ'=>'i','ぉ'=>'o','ぅ'=>'u',
- // 'ゃ'=>'ya','ょ'=>'yo','ゅ'=>'yu',
-
- // never seen one of those (disabled for the moment)
- // 'ヴぁ'=>'va','ヴぇ'=>'ve','ヴぃ'=>'vi','ヴぉ'=>'vo','ヴ'=>'vu',
- // 'でゃ'=>'dha','でぇ'=>'dhe','でぃ'=>'dhi','でょ'=>'dho','でゅ'=>'dhu',
- // 'どぁ'=>'dwa','どぇ'=>'dwe','どぃ'=>'dwi','どぉ'=>'dwo','どぅ'=>'dwu',
- // 'ぢゃ'=>'dya','ぢぇ'=>'dye','ぢぃ'=>'dyi','ぢょ'=>'dyo','ぢゅ'=>'dyu',
- // 'ふぁ'=>'fwa','ふぇ'=>'fwe','ふぃ'=>'fwi','ふぉ'=>'fwo','ふぅ'=>'fwu',
- // 'ふゃ'=>'fya','ふぇ'=>'fye','ふぃ'=>'fyi','ふょ'=>'fyo','ふゅ'=>'fyu',
- // 'すぁ'=>'swa','すぇ'=>'swe','すぃ'=>'swi','すぉ'=>'swo','すぅ'=>'swu',
- // 'てゃ'=>'tha','てぇ'=>'the','てぃ'=>'thi','てょ'=>'tho','てゅ'=>'thu',
- // 'つゃ'=>'tsa','つぇ'=>'tse','つぃ'=>'tsi','つょ'=>'tso','つ'=>'tsu',
- // 'とぁ'=>'twa','とぇ'=>'twe','とぃ'=>'twi','とぉ'=>'two','とぅ'=>'twu',
- // 'ヴゃ'=>'vya','ヴぇ'=>'vye','ヴぃ'=>'vyi','ヴょ'=>'vyo','ヴゅ'=>'vyu',
- // 'うぁ'=>'wha','うぇ'=>'whe','うぃ'=>'whi','うぉ'=>'who','うぅ'=>'whu',
- // 'じゃ'=>'zha','じぇ'=>'zhe','じぃ'=>'zhi','じょ'=>'zho','じゅ'=>'zhu',
- // 'じゃ'=>'zya','じぇ'=>'zye','じぃ'=>'zyi','じょ'=>'zyo','じゅ'=>'zyu',
-
- // 'spare' characters from other romanization systems
- // 'だ'=>'da','で'=>'de','ぢ'=>'di','ど'=>'do','づ'=>'du',
- // 'ら'=>'la','れ'=>'le','り'=>'li','ろ'=>'lo','る'=>'lu',
- // 'さ'=>'sa','せ'=>'se','し'=>'si','そ'=>'so','す'=>'su',
- // 'ちゃ'=>'cya','ちぇ'=>'cye','ちぃ'=>'cyi','ちょ'=>'cyo','ちゅ'=>'cyu',
- //'じゃ'=>'jya','じぇ'=>'jye','じぃ'=>'jyi','じょ'=>'jyo','じゅ'=>'jyu',
- //'りゃ'=>'lya','りぇ'=>'lye','りぃ'=>'lyi','りょ'=>'lyo','りゅ'=>'lyu',
- //'しゃ'=>'sya','しぇ'=>'sye','しぃ'=>'syi','しょ'=>'syo','しゅ'=>'syu',
- //'ちゃ'=>'tya','ちぇ'=>'tye','ちぃ'=>'tyi','ちょ'=>'tyo','ちゅ'=>'tyu',
- //'し'=>'ci',,い'=>'yi','ぢ'=>'dzi',
- //'っじゃ'=>'jja','っじぇ'=>'jje','っじ'=>'jji','っじょ'=>'jjo','っじゅ'=>'jju',
-
-
- // Japanese katakana
-
- // 4 character syllables: ッ doubles the consonant after, ー doubles the vowel before (usualy written with macron, but we don't want that in our URLs)
- 'ッビャー'=>'bbyaa','ッビェー'=>'bbyee','ッビィー'=>'bbyii','ッビョー'=>'bbyoo','ッビュー'=>'bbyuu',
- 'ッピャー'=>'ppyaa','ッピェー'=>'ppyee','ッピィー'=>'ppyii','ッピョー'=>'ppyoo','ッピュー'=>'ppyuu',
- 'ッキャー'=>'kkyaa','ッキェー'=>'kkyee','ッキィー'=>'kkyii','ッキョー'=>'kkyoo','ッキュー'=>'kkyuu',
- 'ッギャー'=>'ggyaa','ッギェー'=>'ggyee','ッギィー'=>'ggyii','ッギョー'=>'ggyoo','ッギュー'=>'ggyuu',
- 'ッミャー'=>'mmyaa','ッミェー'=>'mmyee','ッミィー'=>'mmyii','ッミョー'=>'mmyoo','ッミュー'=>'mmyuu',
- 'ッニャー'=>'nnyaa','ッニェー'=>'nnyee','ッニィー'=>'nnyii','ッニョー'=>'nnyoo','ッニュー'=>'nnyuu',
- 'ッリャー'=>'rryaa','ッリェー'=>'rryee','ッリィー'=>'rryii','ッリョー'=>'rryoo','ッリュー'=>'rryuu',
- 'ッシャー'=>'sshaa','ッシェー'=>'sshee','ッシー'=>'sshii','ッショー'=>'sshoo','ッシュー'=>'sshuu',
- 'ッチャー'=>'cchaa','ッチェー'=>'cchee','ッチー'=>'cchii','ッチョー'=>'cchoo','ッチュー'=>'cchuu',
- 'ッティー'=>'ttii',
- 'ッヂィー'=>'ddii',
-
- // 3 character syllables - doubled vowels
- 'ファー'=>'faa','フェー'=>'fee','フィー'=>'fii','フォー'=>'foo',
- 'フャー'=>'fyaa','フェー'=>'fyee','フィー'=>'fyii','フョー'=>'fyoo','フュー'=>'fyuu',
- 'ヒャー'=>'hyaa','ヒェー'=>'hyee','ヒィー'=>'hyii','ヒョー'=>'hyoo','ヒュー'=>'hyuu',
- 'ビャー'=>'byaa','ビェー'=>'byee','ビィー'=>'byii','ビョー'=>'byoo','ビュー'=>'byuu',
- 'ピャー'=>'pyaa','ピェー'=>'pyee','ピィー'=>'pyii','ピョー'=>'pyoo','ピュー'=>'pyuu',
- 'キャー'=>'kyaa','キェー'=>'kyee','キィー'=>'kyii','キョー'=>'kyoo','キュー'=>'kyuu',
- 'ギャー'=>'gyaa','ギェー'=>'gyee','ギィー'=>'gyii','ギョー'=>'gyoo','ギュー'=>'gyuu',
- 'ミャー'=>'myaa','ミェー'=>'myee','ミィー'=>'myii','ミョー'=>'myoo','ミュー'=>'myuu',
- 'ニャー'=>'nyaa','ニェー'=>'nyee','ニィー'=>'nyii','ニョー'=>'nyoo','ニュー'=>'nyuu',
- 'リャー'=>'ryaa','リェー'=>'ryee','リィー'=>'ryii','リョー'=>'ryoo','リュー'=>'ryuu',
- 'シャー'=>'shaa','シェー'=>'shee','シー'=>'shii','ショー'=>'shoo','シュー'=>'shuu',
- 'ジャー'=>'jaa','ジェー'=>'jee','ジー'=>'jii','ジョー'=>'joo','ジュー'=>'juu',
- 'スァー'=>'swaa','スェー'=>'swee','スィー'=>'swii','スォー'=>'swoo','スゥー'=>'swuu',
- 'デァー'=>'daa','デェー'=>'dee','ディー'=>'dii','デォー'=>'doo','デゥー'=>'duu',
- 'チャー'=>'chaa','チェー'=>'chee','チー'=>'chii','チョー'=>'choo','チュー'=>'chuu',
- 'ヂャー'=>'dyaa','ヂェー'=>'dyee','ヂィー'=>'dyii','ヂョー'=>'dyoo','ヂュー'=>'dyuu',
- 'ツャー'=>'tsaa','ツェー'=>'tsee','ツィー'=>'tsii','ツョー'=>'tsoo','ツー'=>'tsuu',
- 'トァー'=>'twaa','トェー'=>'twee','トィー'=>'twii','トォー'=>'twoo','トゥー'=>'twuu',
- 'ドァー'=>'dwaa','ドェー'=>'dwee','ドィー'=>'dwii','ドォー'=>'dwoo','ドゥー'=>'dwuu',
- 'ウァー'=>'whaa','ウェー'=>'whee','ウィー'=>'whii','ウォー'=>'whoo','ウゥー'=>'whuu',
- 'ヴャー'=>'vyaa','ヴェー'=>'vyee','ヴィー'=>'vyii','ヴョー'=>'vyoo','ヴュー'=>'vyuu',
- 'ヴァー'=>'vaa','ヴェー'=>'vee','ヴィー'=>'vii','ヴォー'=>'voo','ヴー'=>'vuu',
- 'ウェー'=>'wee','ウィー'=>'wii',
- 'イェー'=>'yee',
- 'ティー'=>'tii',
- 'ヂィー'=>'dii',
-
- // 3 character syllables - doubled consonants
- 'ッビャ'=>'bbya','ッビェ'=>'bbye','ッビィ'=>'bbyi','ッビョ'=>'bbyo','ッビュ'=>'bbyu',
- 'ッピャ'=>'ppya','ッピェ'=>'ppye','ッピィ'=>'ppyi','ッピョ'=>'ppyo','ッピュ'=>'ppyu',
- 'ッキャ'=>'kkya','ッキェ'=>'kkye','ッキィ'=>'kkyi','ッキョ'=>'kkyo','ッキュ'=>'kkyu',
- 'ッギャ'=>'ggya','ッギェ'=>'ggye','ッギィ'=>'ggyi','ッギョ'=>'ggyo','ッギュ'=>'ggyu',
- 'ッミャ'=>'mmya','ッミェ'=>'mmye','ッミィ'=>'mmyi','ッミョ'=>'mmyo','ッミュ'=>'mmyu',
- 'ッニャ'=>'nnya','ッニェ'=>'nnye','ッニィ'=>'nnyi','ッニョ'=>'nnyo','ッニュ'=>'nnyu',
- 'ッリャ'=>'rrya','ッリェ'=>'rrye','ッリィ'=>'rryi','ッリョ'=>'rryo','ッリュ'=>'rryu',
- 'ッシャ'=>'ssha','ッシェ'=>'sshe','ッシ'=>'sshi','ッショ'=>'ssho','ッシュ'=>'sshu',
- 'ッチャ'=>'ccha','ッチェ'=>'cche','ッチ'=>'cchi','ッチョ'=>'ccho','ッチュ'=>'cchu',
- 'ッティ'=>'tti',
- 'ッヂィ'=>'ddi',
-
- // 3 character syllables - doubled vowel and consonants
- 'ッバー'=>'bbaa','ッベー'=>'bbee','ッビー'=>'bbii','ッボー'=>'bboo','ッブー'=>'bbuu',
- 'ッパー'=>'ppaa','ッペー'=>'ppee','ッピー'=>'ppii','ッポー'=>'ppoo','ップー'=>'ppuu',
- 'ッケー'=>'kkee','ッキー'=>'kkii','ッコー'=>'kkoo','ックー'=>'kkuu','ッカー'=>'kkaa',
- 'ッガー'=>'ggaa','ッゲー'=>'ggee','ッギー'=>'ggii','ッゴー'=>'ggoo','ッグー'=>'gguu',
- 'ッマー'=>'maa','ッメー'=>'mee','ッミー'=>'mii','ッモー'=>'moo','ッムー'=>'muu',
- 'ッナー'=>'nnaa','ッネー'=>'nnee','ッニー'=>'nnii','ッノー'=>'nnoo','ッヌー'=>'nnuu',
- 'ッラー'=>'rraa','ッレー'=>'rree','ッリー'=>'rrii','ッロー'=>'rroo','ッルー'=>'rruu',
- 'ッサー'=>'ssaa','ッセー'=>'ssee','ッシー'=>'sshii','ッソー'=>'ssoo','ッスー'=>'ssuu',
- 'ッザー'=>'zzaa','ッゼー'=>'zzee','ッジー'=>'jjii','ッゾー'=>'zzoo','ッズー'=>'zzuu',
- 'ッター'=>'ttaa','ッテー'=>'ttee','ッチー'=>'chii','ットー'=>'ttoo','ッツー'=>'ttsuu',
- 'ッダー'=>'ddaa','ッデー'=>'ddee','ッヂー'=>'ddii','ッドー'=>'ddoo','ッヅー'=>'dduu',
-
- // 2 character syllables - normal
- 'ファ'=>'fa','フェ'=>'fe','フィ'=>'fi','フォ'=>'fo','フゥ'=>'fu',
- // 'フャ'=>'fya','フェ'=>'fye','フィ'=>'fyi','フョ'=>'fyo','フュ'=>'fyu',
- 'フャ'=>'fa','フェ'=>'fe','フィ'=>'fi','フョ'=>'fo','フュ'=>'fu',
- 'ヒャ'=>'hya','ヒェ'=>'hye','ヒィ'=>'hyi','ヒョ'=>'hyo','ヒュ'=>'hyu',
- 'ビャ'=>'bya','ビェ'=>'bye','ビィ'=>'byi','ビョ'=>'byo','ビュ'=>'byu',
- 'ピャ'=>'pya','ピェ'=>'pye','ピィ'=>'pyi','ピョ'=>'pyo','ピュ'=>'pyu',
- 'キャ'=>'kya','キェ'=>'kye','キィ'=>'kyi','キョ'=>'kyo','キュ'=>'kyu',
- 'ギャ'=>'gya','ギェ'=>'gye','ギィ'=>'gyi','ギョ'=>'gyo','ギュ'=>'gyu',
- 'ミャ'=>'mya','ミェ'=>'mye','ミィ'=>'myi','ミョ'=>'myo','ミュ'=>'myu',
- 'ニャ'=>'nya','ニェ'=>'nye','ニィ'=>'nyi','ニョ'=>'nyo','ニュ'=>'nyu',
- 'リャ'=>'rya','リェ'=>'rye','リィ'=>'ryi','リョ'=>'ryo','リュ'=>'ryu',
- 'シャ'=>'sha','シェ'=>'she','ショ'=>'sho','シュ'=>'shu',
- 'ジャ'=>'ja','ジェ'=>'je','ジョ'=>'jo','ジュ'=>'ju',
- 'スァ'=>'swa','スェ'=>'swe','スィ'=>'swi','スォ'=>'swo','スゥ'=>'swu',
- 'デァ'=>'da','デェ'=>'de','ディ'=>'di','デォ'=>'do','デゥ'=>'du',
- 'チャ'=>'cha','チェ'=>'che','チ'=>'chi','チョ'=>'cho','チュ'=>'chu',
- // 'ヂャ'=>'dya','ヂェ'=>'dye','ヂィ'=>'dyi','ヂョ'=>'dyo','ヂュ'=>'dyu',
- 'ツャ'=>'tsa','ツェ'=>'tse','ツィ'=>'tsi','ツョ'=>'tso','ツ'=>'tsu',
- 'トァ'=>'twa','トェ'=>'twe','トィ'=>'twi','トォ'=>'two','トゥ'=>'twu',
- 'ドァ'=>'dwa','ドェ'=>'dwe','ドィ'=>'dwi','ドォ'=>'dwo','ドゥ'=>'dwu',
- 'ウァ'=>'wha','ウェ'=>'whe','ウィ'=>'whi','ウォ'=>'who','ウゥ'=>'whu',
- 'ヴャ'=>'vya','ヴェ'=>'vye','ヴィ'=>'vyi','ヴョ'=>'vyo','ヴュ'=>'vyu',
- 'ヴァ'=>'va','ヴェ'=>'ve','ヴィ'=>'vi','ヴォ'=>'vo','ヴ'=>'vu',
- 'ウェ'=>'we','ウィ'=>'wi',
- 'イェ'=>'ye',
- 'ティ'=>'ti',
- 'ヂィ'=>'di',
-
- // 2 character syllables - doubled vocal
- 'アー'=>'aa','エー'=>'ee','イー'=>'ii','オー'=>'oo','ウー'=>'uu',
- 'ダー'=>'daa','デー'=>'dee','ヂー'=>'dii','ドー'=>'doo','ヅー'=>'duu',
- 'ハー'=>'haa','ヘー'=>'hee','ヒー'=>'hii','ホー'=>'hoo','フー'=>'fuu',
- 'バー'=>'baa','ベー'=>'bee','ビー'=>'bii','ボー'=>'boo','ブー'=>'buu',
- 'パー'=>'paa','ペー'=>'pee','ピー'=>'pii','ポー'=>'poo','プー'=>'puu',
- 'ケー'=>'kee','キー'=>'kii','コー'=>'koo','クー'=>'kuu','カー'=>'kaa',
- 'ガー'=>'gaa','ゲー'=>'gee','ギー'=>'gii','ゴー'=>'goo','グー'=>'guu',
- 'マー'=>'maa','メー'=>'mee','ミー'=>'mii','モー'=>'moo','ムー'=>'muu',
- 'ナー'=>'naa','ネー'=>'nee','ニー'=>'nii','ノー'=>'noo','ヌー'=>'nuu',
- 'ラー'=>'raa','レー'=>'ree','リー'=>'rii','ロー'=>'roo','ルー'=>'ruu',
- 'サー'=>'saa','セー'=>'see','シー'=>'shii','ソー'=>'soo','スー'=>'suu',
- 'ザー'=>'zaa','ゼー'=>'zee','ジー'=>'jii','ゾー'=>'zoo','ズー'=>'zuu',
- 'ター'=>'taa','テー'=>'tee','チー'=>'chii','トー'=>'too','ツー'=>'tsuu',
- 'ワー'=>'waa','ヲー'=>'woo',
- 'ヤー'=>'yaa','ヨー'=>'yoo','ユー'=>'yuu',
- 'ヵー'=>'kaa','ヶー'=>'kee',
- // old characters
- 'ヱー'=>'wee','ヰー'=>'wii',
-
- // seperate katakana 'n'
- 'ンア'=>'n_a','ンエ'=>'n_e','ンイ'=>'n_i','ンオ'=>'n_o','ンウ'=>'n_u',
- 'ンヤ'=>'n_ya','ンヨ'=>'n_yo','ンユ'=>'n_yu',
-
- // 2 character syllables - doubled consonants
- 'ッバ'=>'bba','ッベ'=>'bbe','ッビ'=>'bbi','ッボ'=>'bbo','ッブ'=>'bbu',
- 'ッパ'=>'ppa','ッペ'=>'ppe','ッピ'=>'ppi','ッポ'=>'ppo','ップ'=>'ppu',
- 'ッケ'=>'kke','ッキ'=>'kki','ッコ'=>'kko','ック'=>'kku','ッカ'=>'kka',
- 'ッガ'=>'gga','ッゲ'=>'gge','ッギ'=>'ggi','ッゴ'=>'ggo','ッグ'=>'ggu',
- 'ッマ'=>'ma','ッメ'=>'me','ッミ'=>'mi','ッモ'=>'mo','ッム'=>'mu',
- 'ッナ'=>'nna','ッネ'=>'nne','ッニ'=>'nni','ッノ'=>'nno','ッヌ'=>'nnu',
- 'ッラ'=>'rra','ッレ'=>'rre','ッリ'=>'rri','ッロ'=>'rro','ッル'=>'rru',
- 'ッサ'=>'ssa','ッセ'=>'sse','ッシ'=>'sshi','ッソ'=>'sso','ッス'=>'ssu',
- 'ッザ'=>'zza','ッゼ'=>'zze','ッジ'=>'jji','ッゾ'=>'zzo','ッズ'=>'zzu',
- 'ッタ'=>'tta','ッテ'=>'tte','ッチ'=>'cchi','ット'=>'tto','ッツ'=>'ttsu',
- 'ッダ'=>'dda','ッデ'=>'dde','ッヂ'=>'ddi','ッド'=>'ddo','ッヅ'=>'ddu',
-
- // 1 character syllables
- 'ア'=>'a','エ'=>'e','イ'=>'i','オ'=>'o','ウ'=>'u','ン'=>'n',
- 'ハ'=>'ha','ヘ'=>'he','ヒ'=>'hi','ホ'=>'ho','フ'=>'fu',
- 'バ'=>'ba','ベ'=>'be','ビ'=>'bi','ボ'=>'bo','ブ'=>'bu',
- 'パ'=>'pa','ペ'=>'pe','ピ'=>'pi','ポ'=>'po','プ'=>'pu',
- 'ケ'=>'ke','キ'=>'ki','コ'=>'ko','ク'=>'ku','カ'=>'ka',
- 'ガ'=>'ga','ゲ'=>'ge','ギ'=>'gi','ゴ'=>'go','グ'=>'gu',
- 'マ'=>'ma','メ'=>'me','ミ'=>'mi','モ'=>'mo','ム'=>'mu',
- 'ナ'=>'na','ネ'=>'ne','ニ'=>'ni','ノ'=>'no','ヌ'=>'nu',
- 'ラ'=>'ra','レ'=>'re','リ'=>'ri','ロ'=>'ro','ル'=>'ru',
- 'サ'=>'sa','セ'=>'se','シ'=>'shi','ソ'=>'so','ス'=>'su',
- 'ザ'=>'za','ゼ'=>'ze','ジ'=>'ji','ゾ'=>'zo','ズ'=>'zu',
- 'タ'=>'ta','テ'=>'te','チ'=>'chi','ト'=>'to','ツ'=>'tsu',
- 'ダ'=>'da','デ'=>'de','ヂ'=>'di','ド'=>'do','ヅ'=>'du',
- 'ワ'=>'wa','ヲ'=>'wo',
- 'ヤ'=>'ya','ヨ'=>'yo','ユ'=>'yu',
- 'ヵ'=>'ka','ヶ'=>'ke',
- // old characters
- 'ヱ'=>'we','ヰ'=>'wi',
-
- // convert what's left (probably only kicks in when something's missing above)
- 'ァ'=>'a','ェ'=>'e','ィ'=>'i','ォ'=>'o','ゥ'=>'u',
- 'ャ'=>'ya','ョ'=>'yo','ュ'=>'yu',
-
- // special characters
- '・'=>'_','、'=>'_',
- 'ー'=>'_', // when used with hiragana (seldom), this character would not be converted otherwise
-
- // 'ラ'=>'la','レ'=>'le','リ'=>'li','ロ'=>'lo','ル'=>'lu',
- // 'チャ'=>'cya','チェ'=>'cye','チィ'=>'cyi','チョ'=>'cyo','チュ'=>'cyu',
- //'デャ'=>'dha','デェ'=>'dhe','ディ'=>'dhi','デョ'=>'dho','デュ'=>'dhu',
- // 'リャ'=>'lya','リェ'=>'lye','リィ'=>'lyi','リョ'=>'lyo','リュ'=>'lyu',
- // 'テャ'=>'tha','テェ'=>'the','ティ'=>'thi','テョ'=>'tho','テュ'=>'thu',
- //'ファ'=>'fwa','フェ'=>'fwe','フィ'=>'fwi','フォ'=>'fwo','フゥ'=>'fwu',
- //'チャ'=>'tya','チェ'=>'tye','チィ'=>'tyi','チョ'=>'tyo','チュ'=>'tyu',
- // 'ジャ'=>'jya','ジェ'=>'jye','ジィ'=>'jyi','ジョ'=>'jyo','ジュ'=>'jyu',
- // 'ジャ'=>'zha','ジェ'=>'zhe','ジィ'=>'zhi','ジョ'=>'zho','ジュ'=>'zhu',
- //'ジャ'=>'zya','ジェ'=>'zye','ジィ'=>'zyi','ジョ'=>'zyo','ジュ'=>'zyu',
- //'シャ'=>'sya','シェ'=>'sye','シィ'=>'syi','ショ'=>'syo','シュ'=>'syu',
- //'シ'=>'ci','フ'=>'hu',シ'=>'si','チ'=>'ti','ツ'=>'tu','イ'=>'yi','ヂ'=>'dzi',
-
- // "Greeklish"
- 'Γ'=>'G','Δ'=>'E','Θ'=>'Th','Λ'=>'L','Ξ'=>'X','Π'=>'P','Σ'=>'S','Φ'=>'F','Ψ'=>'Ps',
- 'γ'=>'g','δ'=>'e','θ'=>'th','λ'=>'l','ξ'=>'x','π'=>'p','σ'=>'s','φ'=>'f','ψ'=>'ps',
-
- // Thai
- 'ก'=>'k','ข'=>'kh','ฃ'=>'kh','ค'=>'kh','ฅ'=>'kh','ฆ'=>'kh','ง'=>'ng','จ'=>'ch',
- 'ฉ'=>'ch','ช'=>'ch','ซ'=>'s','ฌ'=>'ch','ญ'=>'y','ฎ'=>'d','ฏ'=>'t','ฐ'=>'th',
- 'ฑ'=>'d','ฒ'=>'th','ณ'=>'n','ด'=>'d','ต'=>'t','ถ'=>'th','ท'=>'th','ธ'=>'th',
- 'น'=>'n','บ'=>'b','ป'=>'p','ผ'=>'ph','ฝ'=>'f','พ'=>'ph','ฟ'=>'f','ภ'=>'ph',
- 'ม'=>'m','ย'=>'y','ร'=>'r','ฤ'=>'rue','ฤๅ'=>'rue','ล'=>'l','ฦ'=>'lue',
- 'ฦๅ'=>'lue','ว'=>'w','ศ'=>'s','ษ'=>'s','ส'=>'s','ห'=>'h','ฬ'=>'l','ฮ'=>'h',
- 'ะ'=>'a','ั'=>'a','รร'=>'a','า'=>'a','ๅ'=>'a','ำ'=>'am','ํา'=>'am',
- 'ิ'=>'i','ี'=>'i','ึ'=>'ue','ี'=>'ue','ุ'=>'u','ู'=>'u',
- 'เ'=>'e','แ'=>'ae','โ'=>'o','อ'=>'o',
- 'ียะ'=>'ia','ีย'=>'ia','ือะ'=>'uea','ือ'=>'uea','ัวะ'=>'ua','ัว'=>'ua',
- 'ใ'=>'ai','ไ'=>'ai','ัย'=>'ai','าย'=>'ai','าว'=>'ao',
- 'ุย'=>'ui','อย'=>'oi','ือย'=>'ueai','วย'=>'uai',
- 'ิว'=>'io','็ว'=>'eo','ียว'=>'iao',
- '่'=>'','้'=>'','๊'=>'','๋'=>'','็'=>'',
- '์'=>'','๎'=>'','ํ'=>'','ฺ'=>'',
- 'ๆ'=>'2','๏'=>'o','ฯ'=>'-','๚'=>'-','๛'=>'-',
- '๐'=>'0','๑'=>'1','๒'=>'2','๓'=>'3','๔'=>'4',
- '๕'=>'5','๖'=>'6','๗'=>'7','๘'=>'8','๙'=>'9',
-
- // Korean
- 'ㄱ'=>'k','ㅋ'=>'kh','ㄲ'=>'kk','ㄷ'=>'t','ㅌ'=>'th','ㄸ'=>'tt','ㅂ'=>'p',
- 'ㅍ'=>'ph','ㅃ'=>'pp','ㅈ'=>'c','ㅊ'=>'ch','ㅉ'=>'cc','ㅅ'=>'s','ㅆ'=>'ss',
- 'ㅎ'=>'h','ㅇ'=>'ng','ㄴ'=>'n','ㄹ'=>'l','ㅁ'=>'m', 'ㅏ'=>'a','ㅓ'=>'e','ㅗ'=>'o',
- 'ㅜ'=>'wu','ㅡ'=>'u','ㅣ'=>'i','ㅐ'=>'ay','ㅔ'=>'ey','ㅚ'=>'oy','ㅘ'=>'wa','ㅝ'=>'we',
- 'ㅟ'=>'wi','ㅙ'=>'way','ㅞ'=>'wey','ㅢ'=>'uy','ㅑ'=>'ya','ㅕ'=>'ye','ㅛ'=>'oy',
- 'ㅠ'=>'yu','ㅒ'=>'yay','ㅖ'=>'yey',
-);
-
-
diff --git a/index.php b/index.php
index 689ce1779..bfb4c0b6a 100644
--- a/index.php
+++ b/index.php
@@ -14,8 +14,10 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
if(php_sapi_name() != 'cli-server') {
- header("Location: doku.php");
- exit;
+ if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/');
+ require_once(DOKU_INC.'inc/init.php');
+
+ send_redirect(DOKU_URL.'doku.php');
}
# ROUTER starts below
@@ -34,7 +36,7 @@ if(preg_match('/^\/_media\/(.*)/', $_SERVER['SCRIPT_NAME'], $m)) {
$_GET['media'] = $m[1];
require $_SERVER['DOCUMENT_ROOT'] . '/lib/exe/detail.php';
-} else if(preg_match('/^\/_media\/(.*)/', $_SERVER['SCRIPT_NAME'], $m)) {
+} else if(preg_match('/^\/_export\/([^\/]+)\/(.*)/', $_SERVER['SCRIPT_NAME'], $m)) {
# exports
$_GET['do'] = 'export_' . $m[1];
$_GET['id'] = $m[2];
diff --git a/install.php b/install.php
index dfbce1de8..3b05267e7 100644
--- a/install.php
+++ b/install.php
@@ -46,7 +46,7 @@ header('Content-Type: text/html; charset=utf-8');
<head>
<meta charset="utf-8" />
<title><?php echo $lang['i_installer']?></title>
- <style type="text/css">
+ <style>
body { width: 90%; margin: 0 auto; font: 84% Verdana, Helvetica, Arial, sans-serif; }
img { border: none }
br.cl { clear:both; }
@@ -56,7 +56,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">
+ <script>
function acltoggle(){
var cb = document.getElementById('acl');
var fs = document.getElementById('acldep');
@@ -95,8 +95,11 @@ header('Content-Type: text/html; charset=utf-8');
print "</div>\n";
}
?>
- <a style="background: transparent url(data/dont-panic-if-you-see-this-in-your-logs-it-means-your-directory-permissions-are-correct.png) left top no-repeat;
- display: block; width:380px; height:73px; border:none; clear:both;"
+ <a style="
+ background: transparent
+ url(data/dont-panic-if-you-see-this-in-your-logs-it-means-your-directory-permissions-are-correct.png)
+ left top no-repeat;
+ display: block; width:380px; height:73px; border:none; clear:both;"
target="_blank"
href="http://www.dokuwiki.org/security#web_access_security"></a>
</div>
@@ -170,10 +173,12 @@ function print_form($d){
<fieldset id="acldep">
<label for="superuser"><?php echo $lang['i_superuser']?></label>
- <input class="text" type="text" name="d[superuser]" id="superuser" value="<?php echo $d['superuser'] ?>" />
+ <input class="text" type="text" name="d[superuser]" id="superuser"
+ value="<?php echo $d['superuser'] ?>" />
<label for="fullname"><?php echo $lang['fullname']?></label>
- <input class="text" type="text" name="d[fullname]" id="fullname" value="<?php echo $d['fullname'] ?>" />
+ <input class="text" type="text" name="d[fullname]" id="fullname"
+ value="<?php echo $d['fullname'] ?>" />
<label for="email"><?php echo $lang['email']?></label>
<input class="text" type="text" name="d[email]" id="email" value="<?php echo $d['email'] ?>" />
@@ -186,13 +191,17 @@ function print_form($d){
<label for="policy"><?php echo $lang['i_policy']?></label>
<select class="text" name="d[policy]" id="policy">
- <option value="0" <?php echo ($d['policy'] == 0)?'selected="selected"':'' ?>><?php echo $lang['i_pol0']?></option>
- <option value="1" <?php echo ($d['policy'] == 1)?'selected="selected"':'' ?>><?php echo $lang['i_pol1']?></option>
- <option value="2" <?php echo ($d['policy'] == 2)?'selected="selected"':'' ?>><?php echo $lang['i_pol2']?></option>
+ <option value="0" <?php echo ($d['policy'] == 0)?'selected="selected"':'' ?>><?php
+ echo $lang['i_pol0']?></option>
+ <option value="1" <?php echo ($d['policy'] == 1)?'selected="selected"':'' ?>><?php
+ echo $lang['i_pol1']?></option>
+ <option value="2" <?php echo ($d['policy'] == 2)?'selected="selected"':'' ?>><?php
+ echo $lang['i_pol2']?></option>
</select>
<label for="allowreg">
- <input type="checkbox" name="d[allowreg]" id="allowreg" <?php echo(($d['allowreg'] ? ' checked="checked"' : ''));?> />
+ <input type="checkbox" name="d[allowreg]" id="allowreg" <?php
+ echo(($d['allowreg'] ? ' checked="checked"' : ''));?> />
<?php echo $lang['i_allowreg']?>
</label>
</fieldset>
@@ -217,8 +226,10 @@ function print_form($d){
<fieldset>
<p><?php echo $lang['i_pop_field']?></p>
<label for="pop">
- <input type="checkbox" name="d[pop]" id="pop" <?php echo(($d['pop'] ? ' checked="checked"' : ''));?> />
- <?php echo $lang['i_pop_label']?> <a href="http://www.dokuwiki.org/popularity" target="_blank"><sup>[?]</sup></a>
+ <input type="checkbox" name="d[pop]" id="pop" <?php
+ echo(($d['pop'] ? ' checked="checked"' : ''));?> />
+ <?php echo $lang['i_pop_label']?>
+ <a href="http://www.dokuwiki.org/popularity" target="_blank"><sup>[?]</sup></a>
</label>
</fieldset>
@@ -309,6 +320,9 @@ function check_data(&$d){
$error[] = sprintf($lang['i_badval'],$lang['email']);
$ok = false;
}
+ }else{
+ // Since default = 1, browser won't send acl=0 when user untick acl
+ $d['acl'] = '0';
}
}
$d = array_merge($form_default, $d);
@@ -363,13 +377,26 @@ EOT;
if ($d['acl']) {
// hash the password
- $phash = new PassHash();
+ $phash = new \dokuwiki\PassHash();
$pass = $phash->hash_smd5($d['password']);
// create users.auth.php
+ $output = <<<EOT
+# users.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Userfile
+#
+# Auto-generated by install script
+# Date: $now
+#
+# Format:
+# login:passwordhash:Real Name:email:groups,comma,separated
+
+EOT;
// --- 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";
+ $output = $output."\n".join(":",array($d['superuser'], $pass, $d['fullname'], $d['email'], 'admin,user'))."\n";
$ok = $ok && fileWrite(DOKU_LOCAL.'users.auth.php', $output);
// create acl.auth.php
@@ -538,9 +565,23 @@ function check_functions(){
$ok = false;
}
+ try {
+ random_bytes(1);
+ } catch (\Exception $th) {
+ // If an appropriate source of randomness cannot be found, an Exception will be thrown by PHP 7+
+ // this exception is also thrown by paragonie/random_compat for PHP 5.6 support
+ $error[] = $lang['i_urandom'];
+ $ok = false;
+ }
+
+ if(ini_get('mbstring.func_overload') != 0){
+ $error[] = $lang['i_mbfuncoverload'];
+ $ok = false;
+ }
+
$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 '.
+ 'glob header ignore_user_abort ini_get mkdir '.
'ob_start opendir parse_ini_file readfile realpath '.
'rename rmdir serialize session_start unlink usleep '.
'preg_replace file_get_contents htmlspecialchars_decode '.
@@ -551,6 +592,16 @@ function check_functions(){
$funcs[] = 'utf8_decode';
}
+ if(!function_exists('mail')){
+ if(strpos(ini_get('disable_functions'),'mail') !== false) {
+ $disabled = $lang['i_disabled'];
+ }
+ else {
+ $disabled = "";
+ }
+ $error[] = sprintf($lang['i_funcnmail'],$disabled);
+ }
+
foreach($funcs as $func){
if(!function_exists($func)){
$error[] = sprintf($lang['i_funcna'],$func);
diff --git a/lib/exe/css.php b/lib/exe/css.php
index 40eaf99a6..2ea2c0963 100644
--- a/lib/exe/css.php
+++ b/lib/exe/css.php
@@ -6,7 +6,10 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
+use dokuwiki\Cache\Cache;
+use dokuwiki\Extension\Event;
+
+if(!defined('DOKU_INC')) define('DOKU_INC', __DIR__ .'/../../');
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");
@@ -45,8 +48,8 @@ function css_out(){
if(!$tpl) $tpl = $conf['template'];
// load style.ini
- $styleUtil = new \dokuwiki\StyleUtils();
- $styleini = $styleUtil->cssStyleini($tpl, $INPUT->bool('preview'));
+ $styleUtil = new \dokuwiki\StyleUtils($tpl, $INPUT->bool('preview'));
+ $styleini = $styleUtil->cssStyleini();
// cache influencers
$tplinc = tpl_incdir($tpl);
@@ -67,7 +70,8 @@ function css_out(){
// load jQuery-UI theme
if ($mediatype == 'screen') {
- $files[DOKU_INC.'lib/scripts/jquery/jquery-ui-theme/smoothness.css'] = DOKU_BASE.'lib/scripts/jquery/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));
@@ -76,7 +80,7 @@ function css_out(){
$files = array_merge($files, $styleini['stylesheets'][$mediatype]);
}
// load user styles
- if(!empty($config_cascade['userstyle'][$mediatype])) {
+ if(is_array($config_cascade['userstyle'][$mediatype])) {
foreach($config_cascade['userstyle'][$mediatype] as $userstyle) {
$files[$userstyle] = DOKU_BASE;
}
@@ -84,7 +88,7 @@ function css_out(){
// Let plugins decide to either put more styles here or to remove some
$media_files[$mediatype] = css_filewrapper($mediatype, $files);
- $CSSEvt = new Doku_Event('CSS_STYLES_INCLUDED', $media_files[$mediatype]);
+ $CSSEvt = new Event('CSS_STYLES_INCLUDED', $media_files[$mediatype]);
// Make it preventable.
if ( $CSSEvt->advise_before() ) {
@@ -99,8 +103,17 @@ function css_out(){
}
// The generated script depends on some dynamic options
- $cache = new cache('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].$INPUT->bool('preview').DOKU_BASE.$tpl.$type,'.css');
- $cache->_event = 'CSS_CACHE_USE';
+ $cache = new Cache(
+ 'styles' .
+ $_SERVER['HTTP_HOST'] .
+ $_SERVER['SERVER_PORT'] .
+ $INPUT->bool('preview') .
+ DOKU_BASE .
+ $tpl .
+ $type,
+ '.css'
+ );
+ $cache->setEvent('CSS_CACHE_USE');
// check cache age & handle conditional request
// This may exit if a cache can be used
@@ -114,7 +127,7 @@ function css_out(){
// plugins decide whether to include the DW default styles.
// This can be done by preventing the Default.
$media_files['DW_DEFAULT'] = css_filewrapper('DW_DEFAULT');
- trigger_event('CSS_STYLES_INCLUDED', $media_files['DW_DEFAULT'], 'css_defaultstyles');
+ Event::createAndTrigger('CSS_STYLES_INCLUDED', $media_files['DW_DEFAULT'], 'css_defaultstyles');
// build the stylesheet
foreach ($mediatypes as $mediatype) {
@@ -454,18 +467,13 @@ class DokuCssFile {
*/
public function replacements($match) {
- // not a relative url? - no adjustment required
- if (preg_match('#^(/|data:|https?://)#',$match[3])) {
+ if (preg_match('#^(/|data:|https?://)#', $match[3])) { // not a relative url? - no adjustment required
return $match[0];
- }
- // a less file import? - requires a file system location
- else if (substr($match[3],-5) == '.less') {
- if ($match[3]{0} != '/') {
+ } elseif (substr($match[3], -5) == '.less') { // a less file import? - requires a file system location
+ if ($match[3][0] != '/') {
$match[3] = $this->getRelativePath() . '/' . $match[3];
}
- }
- // everything else requires a url adjustment
- else {
+ } else { // everything else requires a url adjustment
$match[3] = $this->location . $match[3];
}
@@ -535,10 +543,20 @@ function css_pluginstyles($mediatype='screen'){
* @return string
*/
function css_compress($css){
- //strip comments through a callback
+ // replace quoted strings with placeholder
+ $quote_storage = [];
+
+ $quote_cb = function ($match) use (&$quote_storage) {
+ $quote_storage[] = $match[0];
+ return '"STR'.(count($quote_storage)-1).'"';
+ };
+
+ $css = preg_replace_callback('/(([\'"]).*?(?<!\\\\)\2)/', $quote_cb, $css);
+
+ // strip comments through a callback
$css = preg_replace_callback('#(/\*)(.*?)(\*/)#s','css_comment_cb',$css);
- //strip (incorrect but common) one line comments
+ // strip (incorrect but common) one line comments
$css = preg_replace_callback('/^.*\/\/.*$/m','css_onelinecomment_cb',$css);
// strip whitespaces
@@ -547,18 +565,58 @@ function css_compress($css){
$css = preg_replace('/ ?: /',':',$css);
// number compression
- $css = preg_replace('/([: ])0+(\.\d+?)0*((?:pt|pc|in|mm|cm|em|ex|px)\b|%)(?=[^\{]*[;\}])/', '$1$2$3', $css); // "0.1em" to ".1em", "1.10em" to "1.1em"
- $css = preg_replace('/([: ])\.(0)+((?:pt|pc|in|mm|cm|em|ex|px)\b|%)(?=[^\{]*[;\}])/', '$1$2', $css); // ".0em" to "0"
- $css = preg_replace('/([: ]0)0*(\.0*)?((?:pt|pc|in|mm|cm|em|ex|px)(?=[^\{]*[;\}])\b|%)/', '$1', $css); // "0.0em" to "0"
- $css = preg_replace('/([: ]\d+)(\.0*)((?:pt|pc|in|mm|cm|em|ex|px)(?=[^\{]*[;\}])\b|%)/', '$1$3', $css); // "1.0em" to "1em"
- $css = preg_replace('/([: ])0+(\d+|\d*\.\d+)((?:pt|pc|in|mm|cm|em|ex|px)(?=[^\{]*[;\}])\b|%)/', '$1$2$3', $css); // "001em" to "1em"
+ $css = preg_replace(
+ '/([: ])0+(\.\d+?)0*((?:pt|pc|in|mm|cm|em|ex|px)\b|%)(?=[^\{]*[;\}])/',
+ '$1$2$3',
+ $css
+ ); // "0.1em" to ".1em", "1.10em" to "1.1em"
+ $css = preg_replace(
+ '/([: ])\.(0)+((?:pt|pc|in|mm|cm|em|ex|px)\b|%)(?=[^\{]*[;\}])/',
+ '$1$2',
+ $css
+ ); // ".0em" to "0"
+ $css = preg_replace(
+ '/([: ]0)0*(\.0*)?((?:pt|pc|in|mm|cm|em|ex|px)(?=[^\{]*[;\}])\b|%)/',
+ '$1',
+ $css
+ ); // "0.0em" to "0"
+ $css = preg_replace(
+ '/([: ]\d+)(\.0*)((?:pt|pc|in|mm|cm|em|ex|px)(?=[^\{]*[;\}])\b|%)/',
+ '$1$3',
+ $css
+ ); // "1.0em" to "1em"
+ $css = preg_replace(
+ '/([: ])0+(\d+|\d*\.\d+)((?:pt|pc|in|mm|cm|em|ex|px)(?=[^\{]*[;\}])\b|%)/',
+ '$1$2$3',
+ $css
+ ); // "001em" to "1em"
// shorten attributes (1em 1em 1em 1em -> 1em)
- $css = preg_replace('/(?<![\w\-])((?:margin|padding|border|border-(?:width|radius)):)([\w\.]+)( \2)+(?=[;\}]| !)/', '$1$2', $css); // "1em 1em 1em 1em" to "1em"
- $css = preg_replace('/(?<![\w\-])((?:margin|padding|border|border-(?:width)):)([\w\.]+) ([\w\.]+) \2 \3(?=[;\}]| !)/', '$1$2 $3', $css); // "1em 2em 1em 2em" to "1em 2em"
+ $css = preg_replace(
+ '/(?<![\w\-])((?:margin|padding|border|border-(?:width|radius)):)([\w\.]+)( \2)+(?=[;\}]| !)/',
+ '$1$2',
+ $css
+ ); // "1em 1em 1em 1em" to "1em"
+ $css = preg_replace(
+ '/(?<![\w\-])((?:margin|padding|border|border-(?:width)):)([\w\.]+) ([\w\.]+) \2 \3(?=[;\}]| !)/',
+ '$1$2 $3',
+ $css
+ ); // "1em 2em 1em 2em" to "1em 2em"
// shorten colors
- $css = preg_replace("/#([0-9a-fA-F]{1})\\1([0-9a-fA-F]{1})\\2([0-9a-fA-F]{1})\\3(?=[^\{]*[;\}])/", "#\\1\\2\\3", $css);
+ $css = preg_replace(
+ "/#([0-9a-fA-F]{1})\\1([0-9a-fA-F]{1})\\2([0-9a-fA-F]{1})\\3(?=[^\{]*[;\}])/",
+ "#\\1\\2\\3",
+ $css
+ );
+
+ // replace back protected strings
+ $quote_back_cb = function ($match) use (&$quote_storage) {
+ return $quote_storage[$match[1]];
+ };
+
+ $css = preg_replace_callback('/"STR(\d+)"/', $quote_back_cb, $css);
+ $css = trim($css);
return $css;
}
@@ -602,23 +660,6 @@ function css_onelinecomment_cb($matches) {
break;
}
- // keep any quoted string that starts before a comment
- $nextsqt = strpos($line, "'", $i);
- $nextdqt = strpos($line, '"', $i);
- if(min($nextsqt, $nextdqt) < $nextcom) {
- $skipto = false;
- if($nextsqt !== false && ($nextdqt === false || $nextsqt < $nextdqt)) {
- $skipto = strpos($line, "'", $nextsqt+1) +1;
- } else if ($nextdqt !== false) {
- $skipto = strpos($line, '"', $nextdqt+1) +1;
- }
-
- if($skipto !== false) {
- $i = $skipto;
- continue;
- }
- }
-
if($nexturl === false || $nextcom < $nexturl) {
// no url anymore, strip comment and be done
$i = $nextcom;
diff --git a/lib/exe/detail.php b/lib/exe/detail.php
index ec1a9b874..a6cffa770 100644
--- a/lib/exe/detail.php
+++ b/lib/exe/detail.php
@@ -1,4 +1,7 @@
<?php
+
+use dokuwiki\Extension\Event;
+
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
define('DOKU_MEDIADETAIL',1);
require_once(DOKU_INC.'inc/init.php');
@@ -12,31 +15,17 @@ $REV = $INPUT->int('rev');
$INFO = array_merge(pageinfo(),mediainfo());
$tmp = array();
-trigger_event('DETAIL_STARTED', $tmp);
+Event::createAndTrigger('DETAIL_STARTED', $tmp);
//close session
session_write_close();
-if($conf['allowdebug'] && $INPUT->has('debug')){
- print '<pre>';
- foreach(explode(' ','basedir userewrite baseurl useslash') as $x){
- print '$'."conf['$x'] = '".$conf[$x]."';\n";
- }
- foreach(explode(' ','DOCUMENT_ROOT HTTP_HOST SCRIPT_FILENAME PHP_SELF '.
- 'REQUEST_URI SCRIPT_NAME PATH_INFO PATH_TRANSLATED') as $x){
- print '$'."_SERVER['$x'] = '".$_SERVER[$x]."';\n";
- }
- print "getID('media'): ".getID('media')."\n";
- print "getID('media',false): ".getID('media',false)."\n";
- print '</pre>';
-}
-
$ERROR = false;
// check image permissions
$AUTH = auth_quickaclcheck($IMG);
if($AUTH >= AUTH_READ){
// check if image exists
- $SRC = mediaFN($IMG,$REV);
+ $SRC = mediaFN($IMG,$REV);
if(!file_exists($SRC)){
//doesn't exist!
http_status(404);
diff --git a/lib/exe/fetch.php b/lib/exe/fetch.php
index 933367e35..5c5ae899b 100644
--- a/lib/exe/fetch.php
+++ b/lib/exe/fetch.php
@@ -6,6 +6,8 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
+use dokuwiki\Extension\Event;
+
if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/../../');
if (!defined('DOKU_DISABLE_GZIP_OUTPUT')) define('DOKU_DISABLE_GZIP_OUTPUT', 1);
require_once(DOKU_INC.'inc/init.php');
@@ -14,7 +16,7 @@ session_write_close(); //close session
require_once(DOKU_INC.'inc/fetch.functions.php');
if (defined('SIMPLE_TEST')) {
- $INPUT = new Input();
+ $INPUT = new \dokuwiki\Input\Input();
}
// BEGIN main
@@ -56,7 +58,7 @@ if (defined('SIMPLE_TEST')) {
);
// handle the file status
- $evt = new Doku_Event('FETCH_MEDIA_STATUS', $data);
+ $evt = new Event('FETCH_MEDIA_STATUS', $data);
if($evt->advise_before()) {
// redirects
if($data['status'] > 300 && $data['status'] <= 304) {
@@ -87,7 +89,7 @@ if (defined('SIMPLE_TEST')) {
}
// finally send the file to the client
- $evt = new Doku_Event('MEDIA_SENDFILE', $data);
+ $evt = new Event('MEDIA_SENDFILE', $data);
if($evt->advise_before()) {
sendFile($data['file'], $data['mime'], $data['download'], $data['cache'], $data['ispublic'], $data['orig']);
}
diff --git a/lib/exe/indexer.php b/lib/exe/indexer.php
deleted file mode 100644
index 4f60f1666..000000000
--- a/lib/exe/indexer.php
+++ /dev/null
@@ -1,209 +0,0 @@
-<?php
-/**
- * DokuWiki indexer
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
-define('DOKU_DISABLE_GZIP_OUTPUT',1);
-require_once(DOKU_INC.'inc/init.php');
-session_write_close(); //close session
-if(!defined('NL')) define('NL',"\n");
-
-// keep running after browser closes connection
-@ignore_user_abort(true);
-
-// check if user abort worked, if yes send output early
-$defer = !@ignore_user_abort() || $conf['broken_iua'];
-$output = $INPUT->has('debug') && $conf['allowdebug'];
-if(!$defer && !$output){
- sendGIF(); // send gif
-}
-
-$ID = cleanID($INPUT->str('id'));
-
-// Catch any possible output (e.g. errors)
-if(!$output) ob_start();
-else header('Content-Type: text/plain');
-
-// run one of the jobs
-$tmp = array(); // No event data
-$evt = new Doku_Event('INDEXER_TASKS_RUN', $tmp);
-if ($evt->advise_before()) {
- runIndexer() or
- runSitemapper() or
- sendDigest() or
- runTrimRecentChanges() or
- runTrimRecentChanges(true) or
- $evt->advise_after();
-}
-
-if(!$output) {
- ob_end_clean();
- if($defer) sendGIF();
-}
-
-exit;
-
-// --------------------------------------------------------------------
-
-/**
- * Trims the recent changes cache (or imports the old changelog) as needed.
- *
- * @param bool $media_changes If the media changelog shall be trimmed instead of
- * the page changelog
- * @return bool
- *
- * @author Ben Coburn <btcoburn@silicodon.net>
- */
-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
- // Trims the recent changes cache to the last $conf['changes_days'] recent
- // changes or $conf['recent'] items, which ever is larger.
- // The trimming is only done once a day.
- if (file_exists($fn) &&
- (@filemtime($fn.'.trimmed')+86400)<time() &&
- !file_exists($fn.'_tmp')) {
- @touch($fn.'.trimmed');
- io_lock($fn);
- $lines = file($fn);
- if (count($lines)<=$conf['recent']) {
- // nothing to trim
- io_unlock($fn);
- echo "runTrimRecentChanges($media_changes): finished".NL;
- return false;
- }
-
- io_saveFile($fn.'_tmp', ''); // presave tmp as 2nd lock
- $trim_time = time() - $conf['recent_days']*86400;
- $out_lines = array();
- $old_lines = array();
- for ($i=0; $i<count($lines); $i++) {
- $log = parseChangelogLine($lines[$i]);
- if ($log === false) continue; // discard junk
- if ($log['date'] < $trim_time) {
- $old_lines[$log['date'].".$i"] = $lines[$i]; // keep old lines for now (append .$i to prevent key collisions)
- } else {
- $out_lines[$log['date'].".$i"] = $lines[$i]; // definitely keep these lines
- }
- }
-
- if (count($lines)==count($out_lines)) {
- // nothing to trim
- @unlink($fn.'_tmp');
- io_unlock($fn);
- echo "runTrimRecentChanges($media_changes): finished".NL;
- return false;
- }
-
- // sort the final result, it shouldn't be necessary,
- // however the extra robustness in making the changelog cache self-correcting is worth it
- ksort($out_lines);
- $extra = $conf['recent'] - count($out_lines); // do we need extra lines do bring us up to minimum
- if ($extra > 0) {
- ksort($old_lines);
- $out_lines = array_merge(array_slice($old_lines,-$extra),$out_lines);
- }
-
- // save trimmed changelog
- io_saveFile($fn.'_tmp', implode('', $out_lines));
- @unlink($fn);
- if (!rename($fn.'_tmp', $fn)) {
- // rename failed so try another way...
- io_unlock($fn);
- io_saveFile($fn, implode('', $out_lines));
- @unlink($fn.'_tmp');
- } else {
- io_unlock($fn);
- }
- echo "runTrimRecentChanges($media_changes): finished".NL;
- return true;
- }
-
- // nothing done
- echo "runTrimRecentChanges($media_changes): finished".NL;
- return false;
-}
-
-/**
- * Runs the indexer for the current page
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function runIndexer(){
- global $ID;
- global $conf;
- print "runIndexer(): started".NL;
-
- if(!$ID) return false;
-
- // do the work
- return idx_addPage($ID, true);
-}
-
-/**
- * Builds a Google Sitemap of all public pages known to the indexer
- *
- * The map is placed in the root directory named sitemap.xml.gz - This
- * file needs to be writable!
- *
- * @author Andreas Gohr
- * @link https://www.google.com/webmasters/sitemaps/docs/en/about.html
- */
-function runSitemapper(){
- print "runSitemapper(): started".NL;
- $result = Sitemapper::generate() && Sitemapper::pingSearchEngines();
- print 'runSitemapper(): finished'.NL;
- return $result;
-}
-
-/**
- * Send digest and list mails for all subscriptions which are in effect for the
- * current page
- *
- * @author Adrian Lang <lang@cosmocode.de>
- */
-function sendDigest() {
- global $conf;
- global $ID;
-
- echo 'sendDigest(): started'.NL;
- if(!actionOK('subscribe')) {
- echo 'sendDigest(): disabled'.NL;
- return false;
- }
- $sub = new Subscription();
- $sent = $sub->send_bulk($ID);
-
- echo "sendDigest(): sent $sent mails".NL;
- echo 'sendDigest(): finished'.NL;
- return (bool) $sent;
-}
-
-/**
- * Just send a 1x1 pixel blank gif to the browser
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Harry Fuecks <fuecks@gmail.com>
- */
-function sendGIF(){
- $img = base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAIBTAA7');
- header('Content-Type: image/gif');
- header('Content-Length: '.strlen($img));
- header('Connection: Close');
- print $img;
- tpl_flush();
- // Browser should drop connection after this
- // Thinks it's got the whole image
-}
-
-//Setup VIM: ex: et ts=4 :
-// No trailing PHP closing tag - no output please!
-// See Note at http://php.net/manual/en/language.basic-syntax.instruction-separation.php
diff --git a/lib/exe/jquery.php b/lib/exe/jquery.php
index f32aef7d3..b8638ecc0 100644
--- a/lib/exe/jquery.php
+++ b/lib/exe/jquery.php
@@ -1,5 +1,7 @@
<?php
+use dokuwiki\Cache\Cache;
+
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('NL')) define('NL', "\n");
@@ -19,11 +21,10 @@ jquery_out();
* uses cache or fills it
*/
function jquery_out() {
- $cache = new cache('jquery', '.js');
+ $cache = new Cache('jquery', '.js');
$files = array(
DOKU_INC . 'lib/scripts/jquery/jquery.min.js',
DOKU_INC . 'lib/scripts/jquery/jquery-ui.min.js',
- DOKU_INC . 'lib/scripts/jquery/jquery-migrate.min.js',
);
$cache_files = $files;
$cache_files[] = __FILE__;
diff --git a/lib/exe/js.php b/lib/exe/js.php
index 7b76efabb..04abec6c0 100644
--- a/lib/exe/js.php
+++ b/lib/exe/js.php
@@ -6,7 +6,10 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
+use dokuwiki\Cache\Cache;
+use dokuwiki\Extension\Event;
+
+if(!defined('DOKU_INC')) define('DOKU_INC', __DIR__ .'/../../');
if(!defined('NOSESSION')) define('NOSESSION',true); // we do not use a session or authentication here (better caching)
if(!defined('NL')) define('NL',"\n");
if(!defined('DOKU_DISABLE_GZIP_OUTPUT')) define('DOKU_DISABLE_GZIP_OUTPUT',1); // we gzip ourself here
@@ -66,18 +69,18 @@ function js_out(){
// add possible plugin scripts and userscript
$files = array_merge($files,js_pluginscripts());
- if(!empty($config_cascade['userscript']['default'])) {
+ if(is_array($config_cascade['userscript']['default'])) {
foreach($config_cascade['userscript']['default'] as $userscript) {
$files[] = $userscript;
}
}
// Let plugins decide to either put more scripts here or to remove some
- trigger_event('JS_SCRIPT_LIST', $files);
+ Event::createAndTrigger('JS_SCRIPT_LIST', $files);
// The generated script depends on some dynamic options
- $cache = new cache('scripts'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].md5(serialize($files)),'.js');
- $cache->_event = 'JS_CACHE_USE';
+ $cache = new Cache('scripts'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].md5(serialize($files)),'.js');
+ $cache->setEvent('JS_CACHE_USE');
$cache_files = array_merge($files, getConfigFiles('main'));
$cache_files[] = __FILE__;
@@ -90,18 +93,21 @@ function js_out(){
// start output buffering and build the script
ob_start();
- $json = new JSON();
// add some global variables
print "var DOKU_BASE = '".DOKU_BASE."';";
print "var DOKU_TPL = '".tpl_basedir($tpl)."';";
- print "var DOKU_COOKIE_PARAM = " . $json->encode(
+ print "var DOKU_COOKIE_PARAM = " . json_encode(
array(
'path' => empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'],
'secure' => $conf['securecookie'] && is_ssl()
)).";";
// FIXME: Move those to JSINFO
- print "Object.defineProperty(window, 'DOKU_UHN', { get: function() { console.warn('Using DOKU_UHN is deprecated. Please use JSINFO.useHeadingNavigation instead'); return JSINFO.useHeadingNavigation; } });";
- print "Object.defineProperty(window, 'DOKU_UHC', { get: function() { console.warn('Using DOKU_UHC is deprecated. Please use JSINFO.useHeadingContent instead'); return JSINFO.useHeadingContent; } });";
+ print "Object.defineProperty(window, 'DOKU_UHN', { get: function() {".
+ "console.warn('Using DOKU_UHN is deprecated. Please use JSINFO.useHeadingNavigation instead');".
+ "return JSINFO.useHeadingNavigation; } });";
+ print "Object.defineProperty(window, 'DOKU_UHC', { get: function() {".
+ "console.warn('Using DOKU_UHC is deprecated. Please use JSINFO.useHeadingContent instead');".
+ "return JSINFO.useHeadingContent; } });";
// load JS specific translations
$lang['js']['plugins'] = js_pluginstrings();
@@ -109,7 +115,7 @@ function js_out(){
if(!empty($templatestrings)) {
$lang['js']['template'] = $templatestrings;
}
- echo 'LANG = '.$json->encode($lang['js']).";\n";
+ echo 'LANG = '.json_encode($lang['js']).";\n";
// load toolbar
toolbar_JSdefines('toolbar');
@@ -170,7 +176,7 @@ function js_load($file){
// is it a include_once?
if($match[1]){
- $base = utf8_basename($ifile);
+ $base = \dokuwiki\Utf8\PhpString::basename($ifile);
if(array_key_exists($base, $loaded) && $loaded[$base] === true){
$data = str_replace($match[0], '' ,$data);
continue;
@@ -178,7 +184,7 @@ function js_load($file){
$loaded[$base] = true;
}
- if($ifile{0} != '/') $ifile = dirname($file).'/'.$ifile;
+ if($ifile[0] != '/') $ifile = dirname($file).'/'.$ifile;
if(file_exists($ifile)){
$idata = io_readFile($ifile);
@@ -356,13 +362,13 @@ function js_compress($s){
// reserved word (e.g. "for", "else", "if") or a
// variable/object/method (e.g. "foo.color")
while ($i < $slen && (strpos($chars,$s[$i]) === false) ){
- $result .= $s{$i};
+ $result .= $s[$i];
$i = $i + 1;
}
- $ch = $s{$i};
+ $ch = $s[$i];
// multiline comments (keeping IE conditionals)
- if($ch == '/' && $s{$i+1} == '*' && $s{$i+2} != '@'){
+ if($ch == '/' && $s[$i+1] == '*' && $s[$i+2] != '@'){
$endC = strpos($s,'*/',$i+2);
if($endC === false) trigger_error('Found invalid /*..*/ comment', E_USER_ERROR);
@@ -381,7 +387,7 @@ function js_compress($s){
}
// singleline
- if($ch == '/' && $s{$i+1} == '/'){
+ if($ch == '/' && $s[$i+1] == '/'){
$endC = strpos($s,"\n",$i+2);
if($endC === false) trigger_error('Invalid comment', E_USER_ERROR);
$i = $endC;
@@ -392,15 +398,15 @@ function js_compress($s){
if($ch == '/'){
// rewind, skip white space
$j = 1;
- while(in_array($s{$i-$j}, $whitespaces_chars)){
+ while(in_array($s[$i-$j], $whitespaces_chars)){
$j = $j + 1;
}
- if( in_array($s{$i-$j}, $regex_starters) ){
+ if( in_array($s[$i-$j], $regex_starters) ){
// yes, this is an re
// now move forward and find the end of it
$j = 1;
- while($s{$i+$j} != '/'){
- if($s{$i+$j} == '\\') $j = $j + 2;
+ while($s[$i+$j] != '/'){
+ if($s[$i+$j] == '\\') $j = $j + 2;
else $j++;
}
$result .= substr($s,$i,$j+1);
@@ -412,8 +418,8 @@ function js_compress($s){
// double quote strings
if($ch == '"'){
$j = 1;
- while( $s{$i+$j} != '"' && ($i+$j < $slen)){
- if( $s{$i+$j} == '\\' && ($s{$i+$j+1} == '"' || $s{$i+$j+1} == '\\') ){
+ while( ($i+$j < $slen) && $s[$i+$j] != '"' ){
+ if( $s[$i+$j] == '\\' && ($s[$i+$j+1] == '"' || $s[$i+$j+1] == '\\') ){
$j += 2;
}else{
$j += 1;
@@ -430,8 +436,8 @@ function js_compress($s){
// single quote strings
if($ch == "'"){
$j = 1;
- while( $s{$i+$j} != "'" && ($i+$j < $slen)){
- if( $s{$i+$j} == '\\' && ($s{$i+$j+1} == "'" || $s{$i+$j+1} == '\\') ){
+ while( ($i+$j < $slen) && $s[$i+$j] != "'" ){
+ if( $s[$i+$j] == '\\' && ($s[$i+$j+1] == "'" || $s[$i+$j+1] == '\\') ){
$j += 2;
}else{
$j += 1;
diff --git a/lib/exe/mediamanager.php b/lib/exe/mediamanager.php
index 722254423..b43cff745 100644
--- a/lib/exe/mediamanager.php
+++ b/lib/exe/mediamanager.php
@@ -1,4 +1,7 @@
<?php
+
+use dokuwiki\Extension\Event;
+
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
define('DOKU_MEDIAMANAGER',1);
@@ -38,7 +41,7 @@
$AUTH = $INFO['perm']; // shortcut for historical reasons
$tmp = array();
- trigger_event('MEDIAMANAGER_STARTED', $tmp);
+ Event::createAndTrigger('MEDIAMANAGER_STARTED', $tmp);
session_write_close(); //close session
// do not display the manager if user does not have read access
diff --git a/lib/exe/taskrunner.php b/lib/exe/taskrunner.php
new file mode 100644
index 000000000..69ab4451a
--- /dev/null
+++ b/lib/exe/taskrunner.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * DokuWiki indexer
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+if (!defined('DOKU_INC')) {
+ define('DOKU_INC', __DIR__ . '/../../');
+}
+define('DOKU_DISABLE_GZIP_OUTPUT',1);
+require_once DOKU_INC.'inc/init.php';
+session_write_close(); //close session
+
+$taskRunner = new \dokuwiki\TaskRunner();
+$taskRunner->run();
diff --git a/lib/exe/xmlrpc.php b/lib/exe/xmlrpc.php
index 3046f47e9..dc0438ee1 100644
--- a/lib/exe/xmlrpc.php
+++ b/lib/exe/xmlrpc.php
@@ -1,67 +1,15 @@
<?php
-if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
-
-require_once(DOKU_INC.'inc/init.php');
-session_write_close(); //close session
-
-if(!$conf['remote']) die((new IXR_Error(-32605, "XML-RPC server not enabled."))->getXml());
-
/**
- * Contains needed wrapper functions and registers all available
- * XMLRPC functions.
+ * XMLRPC API backend
*/
-class dokuwiki_xmlrpc_server extends IXR_Server {
- protected $remote;
-
- /**
- * Constructor. Register methods and run Server
- */
- public function __construct(){
- $this->remote = new RemoteAPI();
- $this->remote->setDateTransformation(array($this, 'toDate'));
- $this->remote->setFileTransformation(array($this, 'toFile'));
- parent::__construct();
- }
- /**
- * @param string $methodname
- * @param array $args
- * @return IXR_Error|mixed
- */
- public function call($methodname, $args){
- try {
- $result = $this->remote->call($methodname, $args);
- return $result;
- } catch (RemoteAccessDeniedException $e) {
- if (!isset($_SERVER['REMOTE_USER'])) {
- http_status(401);
- return new IXR_Error(-32603, "server error. not authorized to call method $methodname");
- } else {
- http_status(403);
- return new IXR_Error(-32604, "server error. forbidden to call the method $methodname");
- }
- } catch (RemoteException $e) {
- return new IXR_Error($e->getCode(), $e->getMessage());
- }
- }
+use dokuwiki\Remote\XmlRpcServer;
- /**
- * @param string|int $data iso date(yyyy[-]mm[-]dd[ hh:mm[:ss]]) or timestamp
- * @return IXR_Date
- */
- public function toDate($data) {
- return new IXR_Date($data);
- }
+if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/../../');
- /**
- * @param string $data
- * @return IXR_Base64
- */
- public function toFile($data) {
- return new IXR_Base64($data);
- }
-}
+require_once(DOKU_INC.'inc/init.php');
+session_write_close(); //close session
-$server = new dokuwiki_xmlrpc_server();
+if(!$conf['remote']) die((new IXR_Error(-32605, "XML-RPC server not enabled."))->getXml());
-// vim:ts=4:sw=4:et:
+$server = new XmlRpcServer();
diff --git a/lib/images/fileicons/32x32/svg.png b/lib/images/fileicons/32x32/svg.png
new file mode 100644
index 000000000..81a3644ff
--- /dev/null
+++ b/lib/images/fileicons/32x32/svg.png
Binary files differ
diff --git a/lib/images/fileicons/index.php b/lib/images/fileicons/index.php
index 09b6c9df8..d1f233e48 100644
--- a/lib/images/fileicons/index.php
+++ b/lib/images/fileicons/index.php
@@ -1,9 +1,9 @@
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
- <title>filetype icons</title>
+ <title>Filetype icons</title>
- <style type="text/css">
+ <style>
body {
background-color: #ccc;
font-family: Arial;
@@ -11,7 +11,7 @@
.box {
width: 200px;
- float:left;
+ float: left;
padding: 0.5em;
margin: 0;
}
@@ -28,40 +28,32 @@
</head>
<body>
-<div class="white box">
<?php
+$fi_list = ''; $fi_list32 = '';
foreach (glob('*.png') as $img) {
- echo '<img src="'.$img.'" alt="'.$img.'" title="'.$img.'" /> ';
+ $fi_list .= '<img src="'.$img.'" alt="'.$img.'" title="'.$img.'" /> ';
}
-?>
+foreach (glob('32x32/*.png') as $img) {
+ $fi_list32 .= '<img src="'.$img.'" alt="'.$img.'" title="'.$img.'" /> ';
+}
+echo '<div class="white box">
+'.$fi_list.'
</div>
<div class="black box">
-<?php
-foreach (glob('*.png') as $img) {
- echo '<img src="'.$img.'" alt="'.$img.'" title="'.$img.'" /> ';
-}
-?>
+'.$fi_list.'
</div>
<br style="clear: left" />
<div class="white box">
- <?php
- foreach (glob('32x32/*.png') as $img) {
- echo '<img src="'.$img.'" alt="'.$img.'" title="'.$img.'" /> ';
- }
- ?>
+'.$fi_list32.'
</div>
<div class="black box">
- <?php
- foreach (glob('32x32/*.png') as $img) {
- echo '<img src="'.$img.'" alt="'.$img.'" title="'.$img.'" /> ';
- }
- ?>
+'.$fi_list32;
+?>
</div>
-
</body>
</html>
diff --git a/lib/images/fileicons/svg.png b/lib/images/fileicons/svg.png
new file mode 100644
index 000000000..a52132dbf
--- /dev/null
+++ b/lib/images/fileicons/svg.png
Binary files differ
diff --git a/lib/images/smileys/index.php b/lib/images/smileys/index.php
index 4167eda5b..574966628 100644
--- a/lib/images/smileys/index.php
+++ b/lib/images/smileys/index.php
@@ -1,9 +1,9 @@
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
- <title>smileys</title>
+ <title>Smileys</title>
- <style type="text/css">
+ <style>
body {
background-color: #ccc;
font-family: Arial;
@@ -11,7 +11,7 @@
.box {
width: 200px;
- float:left;
+ float: left;
padding: 0.5em;
margin: 0;
}
@@ -28,19 +28,24 @@
</head>
<body>
-<div class="white box">
<?php
+$smi_list = '';
foreach (glob('*.gif') as $img) {
- echo '<img src="'.$img.'" alt="'.$img.'" title="'.$img.'" /> ';
+ $smi_list .= '<img src="'.$img.'" alt="'.$img.'" title="'.$img.'" /> ';
}
-?>
+if(is_dir('local')) {
+ $smi_list .= '<hr />';
+ foreach (glob('local/*.gif') as $img) {
+ $smi_list .= '<img src="'.$img.'" alt="'.$img.'" title="'.$img.'" /> ';
+ }
+}
+
+echo '<div class="white box">
+'.$smi_list.'
</div>
<div class="black box">
-<?php
-foreach (glob('*.gif') as $img) {
- echo '<img src="'.$img.'" alt="'.$img.'" title="'.$img.'" /> ';
-}
+'.$smi_list;
?>
</div>
diff --git a/lib/plugins/acl/action.php b/lib/plugins/acl/action.php
index a7226f598..86e587093 100644
--- a/lib/plugins/acl/action.php
+++ b/lib/plugins/acl/action.php
@@ -6,13 +6,11 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
/**
* Register handler
*/
-class action_plugin_acl extends DokuWiki_Action_Plugin {
+class action_plugin_acl extends DokuWiki_Action_Plugin
+{
/**
* Registers a callback function for a given event
@@ -20,10 +18,10 @@ class action_plugin_acl extends DokuWiki_Action_Plugin {
* @param Doku_Event_Handler $controller DokuWiki's event controller object
* @return void
*/
- public function register(Doku_Event_Handler $controller) {
-
- $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax_call_acl');
+ public function register(Doku_Event_Handler $controller)
+ {
+ $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjaxCallAcl');
}
/**
@@ -33,9 +31,9 @@ class action_plugin_acl extends DokuWiki_Action_Plugin {
* @param mixed $param empty
* @return void
*/
-
- public function handle_ajax_call_acl(Doku_Event &$event, $param) {
- if($event->data !== 'plugin_acl') {
+ public function handleAjaxCallAcl(Doku_Event $event, $param)
+ {
+ if ($event->data !== 'plugin_acl') {
return;
}
$event->stopPropagation();
@@ -44,44 +42,44 @@ class action_plugin_acl extends DokuWiki_Action_Plugin {
global $ID;
global $INPUT;
- if(!auth_isadmin()) {
+ /** @var $acl admin_plugin_acl */
+ $acl = plugin_load('admin', 'acl');
+ if (!$acl->isAccessibleByCurrentUser()) {
echo 'for admins only';
return;
}
- if(!checkSecurityToken()) {
+ if (!checkSecurityToken()) {
echo 'CRSF Attack';
return;
}
$ID = getID();
-
- /** @var $acl admin_plugin_acl */
- $acl = plugin_load('admin', 'acl');
$acl->handle();
$ajax = $INPUT->str('ajax');
header('Content-Type: text/html; charset=utf-8');
- if($ajax == 'info') {
- $acl->_html_info();
- } elseif($ajax == 'tree') {
-
+ if ($ajax == 'info') {
+ $acl->printInfo();
+ } elseif ($ajax == 'tree') {
$ns = $INPUT->str('ns');
- if($ns == '*') {
+ if ($ns == '*') {
$ns = '';
}
$ns = cleanID($ns);
$lvl = count(explode(':', $ns));
$ns = utf8_encodeFN(str_replace(':', '/', $ns));
- $data = $acl->_get_tree($ns, $ns);
+ $data = $acl->makeTree($ns, $ns);
- foreach(array_keys($data) as $item) {
+ foreach (array_keys($data) as $item) {
$data[$item]['level'] = $lvl + 1;
}
echo html_buildlist(
- $data, 'acl', array($acl, '_html_list_acl'),
- array($acl, '_html_li_acl')
+ $data,
+ 'acl',
+ array($acl, 'makeTreeItem'),
+ array($acl, 'makeListItem')
);
}
}
diff --git a/lib/plugins/acl/admin.php b/lib/plugins/acl/admin.php
index 6edc6c621..02842fd4b 100644
--- a/lib/plugins/acl/admin.php
+++ b/lib/plugins/acl/admin.php
@@ -7,16 +7,15 @@
* @author Anika Henke <anika@selfthinker.org> (concepts)
* @author Frank Schubert <frank@schokilade.de> (old version)
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
/**
* All DokuWiki plugins to extend the admin function
* need to inherit from this class
*/
-class admin_plugin_acl extends DokuWiki_Admin_Plugin {
- var $acl = null;
- var $ns = null;
+class admin_plugin_acl extends DokuWiki_Admin_Plugin
+{
+ public $acl = null;
+ protected $ns = null;
/**
* The currently selected item, associative array with id and type.
* Populated from (in this order):
@@ -25,22 +24,24 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
* $ns
* $ID
*/
- var $current_item = null;
- var $who = '';
- var $usersgroups = array();
- var $specials = array();
+ protected $current_item = null;
+ protected $who = '';
+ protected $usersgroups = array();
+ protected $specials = array();
/**
* return prompt for admin menu
*/
- function getMenuText($language) {
+ public function getMenuText($language)
+ {
return $this->getLang('admin_acl');
}
/**
* return sort order for position in admin menu
*/
- function getMenuSort() {
+ public function getMenuSort()
+ {
return 1;
}
@@ -51,7 +52,8 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function handle() {
+ public function handle()
+ {
global $AUTH_ACL;
global $ID;
global $auth;
@@ -62,9 +64,9 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
$AUTH_ACL = file($config_cascade['acl']['default']);
// namespace given?
- if($INPUT->str('ns') == '*'){
+ if ($INPUT->str('ns') == '*') {
$this->ns = '*';
- }else{
+ } else {
$this->ns = cleanID($INPUT->str('ns'));
}
@@ -80,78 +82,78 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
// user or group choosen?
$who = trim($INPUT->str('acl_w'));
- if($INPUT->str('acl_t') == '__g__' && $who){
- $this->who = '@'.ltrim($auth->cleanGroup($who),'@');
- }elseif($INPUT->str('acl_t') == '__u__' && $who){
- $this->who = ltrim($who,'@');
- if($this->who != '%USER%' && $this->who != '%GROUP%'){ #keep wildcard as is
+ if ($INPUT->str('acl_t') == '__g__' && $who) {
+ $this->who = '@'.ltrim($auth->cleanGroup($who), '@');
+ } elseif ($INPUT->str('acl_t') == '__u__' && $who) {
+ $this->who = ltrim($who, '@');
+ if ($this->who != '%USER%' && $this->who != '%GROUP%') { #keep wildcard as is
$this->who = $auth->cleanUser($this->who);
}
- }elseif($INPUT->str('acl_t') &&
+ } elseif ($INPUT->str('acl_t') &&
$INPUT->str('acl_t') != '__u__' &&
- $INPUT->str('acl_t') != '__g__'){
+ $INPUT->str('acl_t') != '__g__') {
$this->who = $INPUT->str('acl_t');
- }elseif($who){
+ } elseif ($who) {
$this->who = $who;
}
// handle modifications
- if($INPUT->has('cmd') && checkSecurityToken()){
+ if ($INPUT->has('cmd') && checkSecurityToken()) {
$cmd = $INPUT->extract('cmd')->str('cmd');
// scope for modifications
- if($this->ns){
- if($this->ns == '*'){
+ if ($this->ns) {
+ if ($this->ns == '*') {
$scope = '*';
- }else{
+ } else {
$scope = $this->ns.':*';
}
- }else{
+ } else {
$scope = $ID;
}
- if($cmd == 'save' && $scope && $this->who && $INPUT->has('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, $INPUT->int('acl'));
- }elseif($cmd == 'del' && $scope && $this->who){
+ $this->deleteACL($scope, $this->who);
+ $this->addOrUpdateACL($scope, $this->who, $INPUT->int('acl'));
+ } elseif ($cmd == 'del' && $scope && $this->who) {
// handle single deletions
- $this->_acl_del($scope, $this->who);
- }elseif($cmd == 'update'){
+ $this->deleteACL($scope, $this->who);
+ } elseif ($cmd == 'update') {
$acl = $INPUT->arr('acl');
// handle update of the whole file
- foreach($INPUT->arr('del') as $where => $names){
+ foreach ($INPUT->arr('del') as $where => $names) {
// remove all rules marked for deletion
- foreach($names as $who)
+ foreach ($names as $who)
unset($acl[$where][$who]);
}
// prepare lines
$lines = array();
// keep header
- foreach($AUTH_ACL as $line){
- if($line{0} == '#'){
+ foreach ($AUTH_ACL as $line) {
+ if ($line[0] == '#') {
$lines[] = $line;
- }else{
+ } else {
break;
}
}
// re-add all rules
- foreach($acl as $where => $opt){
- foreach($opt as $who => $perm){
+ foreach ($acl as $where => $opt) {
+ foreach ($opt as $who => $perm) {
if ($who[0]=='@') {
if ($who!='@ALL') {
- $who = '@'.ltrim($auth->cleanGroup($who),'@');
+ $who = '@'.ltrim($auth->cleanGroup($who), '@');
}
- } elseif ($who != '%USER%' && $who != '%GROUP%'){ #keep wildcard as is
+ } elseif ($who != '%USER%' && $who != '%GROUP%') { #keep wildcard as is
$who = $auth->cleanUser($who);
}
- $who = auth_nameencode($who,true);
+ $who = auth_nameencode($who, true);
$lines[] = "$where\t$who\t$perm\n";
}
}
// save it
- io_saveFile($config_cascade['acl']['default'], join('',$lines));
+ io_saveFile($config_cascade['acl']['default'], join('', $lines));
}
// reload ACL config
@@ -159,7 +161,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
}
// initialize ACL array
- $this->_init_acl_config();
+ $this->initAclConfig();
}
/**
@@ -171,29 +173,30 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
* @author Frank Schubert <frank@schokilade.de>
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function html() {
+ public function html()
+ {
echo '<div id="acl_manager">'.NL;
echo '<h1>'.$this->getLang('admin_acl').'</h1>'.NL;
echo '<div class="level1">'.NL;
echo '<div id="acl__tree">'.NL;
- $this->_html_explorer();
+ $this->makeExplorer();
echo '</div>'.NL;
echo '<div id="acl__detail">'.NL;
- $this->_html_detail();
+ $this->printDetail();
echo '</div>'.NL;
echo '</div>'.NL;
echo '<div class="clearer"></div>';
echo '<h2>'.$this->getLang('current').'</h2>'.NL;
echo '<div class="level2">'.NL;
- $this->_html_table();
+ $this->printAclTable();
echo '</div>'.NL;
echo '<div class="footnotes"><div class="fn">'.NL;
echo '<sup><a id="fn__1" class="fn_bot" href="#fnt__1">1)</a></sup>'.NL;
- echo $this->getLang('p_include');
+ echo '<div class="content">'.$this->getLang('p_include').'</div>';
echo '</div></div>';
echo '</div>'.NL;
@@ -204,15 +207,16 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _get_opts($addopts=null){
+ protected function getLinkOptions($addopts = null)
+ {
$opts = array(
'do'=>'admin',
'page'=>'acl',
);
- if($this->ns) $opts['ns'] = $this->ns;
- if($this->who) $opts['acl_w'] = $this->who;
+ if ($this->ns) $opts['ns'] = $this->ns;
+ if ($this->who) $opts['acl_w'] = $this->who;
- if(is_null($addopts)) return $opts;
+ if (is_null($addopts)) return $opts;
return array_merge($opts, $addopts);
}
@@ -221,54 +225,61 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _html_explorer(){
+ protected function makeExplorer()
+ {
global $conf;
global $ID;
global $lang;
$ns = $this->ns;
- if(empty($ns)){
- $ns = dirname(str_replace(':','/',$ID));
- if($ns == '.') $ns ='';
- }elseif($ns == '*'){
+ if (empty($ns)) {
+ $ns = dirname(str_replace(':', '/', $ID));
+ if ($ns == '.') $ns ='';
+ } elseif ($ns == '*') {
$ns ='';
}
- $ns = utf8_encodeFN(str_replace(':','/',$ns));
+ $ns = utf8_encodeFN(str_replace(':', '/', $ns));
- $data = $this->_get_tree($ns);
+ $data = $this->makeTree($ns);
// wrap a list with the root level around the other namespaces
array_unshift($data, array( 'level' => 0, 'id' => '*', 'type' => 'd',
'open' =>'true', 'label' => '['.$lang['mediaroot'].']'));
- echo html_buildlist($data,'acl',
- array($this,'_html_list_acl'),
- array($this,'_html_li_acl'));
-
+ echo html_buildlist(
+ $data,
+ 'acl',
+ array($this, 'makeTreeItem'),
+ array($this, 'makeListItem')
+ );
}
/**
* get a combined list of media and page files
*
+ * also called via AJAX
+ *
* @param string $folder an already converted filesystem folder of the current namespace
- * @param string $limit limit the search to this folder
+ * @param string $limit limit the search to this folder
+ * @return array
*/
- function _get_tree($folder,$limit=''){
+ public function makeTree($folder, $limit = '')
+ {
global $conf;
// read tree structure from pages and media
$data = array();
- search($data,$conf['datadir'],'search_index',array('ns' => $folder),$limit);
+ search($data, $conf['datadir'], 'search_index', array('ns' => $folder), $limit);
$media = array();
- search($media,$conf['mediadir'],'search_index',array('ns' => $folder, 'nofiles' => true),$limit);
- $data = array_merge($data,$media);
+ search($media, $conf['mediadir'], 'search_index', array('ns' => $folder, 'nofiles' => true), $limit);
+ $data = array_merge($data, $media);
unset($media);
// combine by sorting and removing duplicates
- usort($data,array($this,'_tree_sort'));
+ usort($data, array($this, 'treeSort'));
$count = count($data);
- if($count>0) for($i=1; $i<$count; $i++){
- if($data[$i-1]['id'] == $data[$i]['id'] && $data[$i-1]['type'] == $data[$i]['type']) {
+ if ($count>0) for ($i=1; $i<$count; $i++) {
+ if ($data[$i-1]['id'] == $data[$i]['id'] && $data[$i-1]['type'] == $data[$i]['type']) {
unset($data[$i]);
$i++; // duplicate found, next $i can't be a duplicate, so skip forward one
}
@@ -281,7 +292,8 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* Sorts the combined trees of media and page files
*/
- function _tree_sort($a,$b){
+ public function treeSort($a, $b)
+ {
// handle the trivial cases first
if ($a['id'] == '') return -1;
if ($b['id'] == '') return 1;
@@ -315,6 +327,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
// before that other part.
if (empty($a_ids)) return ($a['type'] == 'd') ? -1 : 1;
if (empty($b_ids)) return ($b['type'] == 'd') ? 1 : -1;
+ return 0; //shouldn't happen
}
/**
@@ -323,20 +336,21 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _html_detail(){
+ protected function printDetail()
+ {
global $ID;
echo '<form action="'.wl().'" method="post" accept-charset="utf-8"><div class="no">'.NL;
echo '<div id="acl__user">';
echo $this->getLang('acl_perms').' ';
- $inl = $this->_html_select();
- echo '<input type="text" name="acl_w" class="edit" value="'.(($inl)?'':hsc(ltrim($this->who,'@'))).'" />'.NL;
+ $inl = $this->makeSelect();
+ echo '<input type="text" name="acl_w" class="edit" value="'.(($inl)?'':hsc(ltrim($this->who, '@'))).'" />'.NL;
echo '<button type="submit">'.$this->getLang('btn_select').'</button>'.NL;
echo '</div>'.NL;
echo '<div id="acl__info">';
- $this->_html_info();
+ $this->printInfo();
echo '</div>';
echo '<input type="hidden" name="ns" value="'.hsc($this->ns).'" />'.NL;
@@ -349,23 +363,26 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
/**
* Print info and editor
+ *
+ * also loaded via Ajax
*/
- function _html_info(){
+ public function printInfo()
+ {
global $ID;
- if($this->who){
- $current = $this->_get_exact_perm();
+ if ($this->who) {
+ $current = $this->getExactPermisson();
// explain current permissions
- $this->_html_explain($current);
+ $this->printExplanation($current);
// load editor
- $this->_html_acleditor($current);
- }else{
+ $this->printAclEditor($current);
+ } else {
echo '<p>';
- if($this->ns){
- printf($this->getLang('p_choose_ns'),hsc($this->ns));
- }else{
- printf($this->getLang('p_choose_id'),hsc($ID));
+ if ($this->ns) {
+ printf($this->getLang('p_choose_ns'), hsc($this->ns));
+ } else {
+ printf($this->getLang('p_choose_id'), hsc($ID));
}
echo '</p>';
@@ -378,21 +395,22 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _html_acleditor($current){
+ protected function printAclEditor($current)
+ {
global $lang;
echo '<fieldset>';
- if(is_null($current)){
+ if (is_null($current)) {
echo '<legend>'.$this->getLang('acl_new').'</legend>';
- }else{
+ } else {
echo '<legend>'.$this->getLang('acl_mod').'</legend>';
}
- echo $this->_html_checkboxes($current,empty($this->ns),'acl');
+ echo $this->makeCheckboxes($current, empty($this->ns), 'acl');
- if(is_null($current)){
+ if (is_null($current)) {
echo '<button type="submit" name="cmd[save]">'.$lang['btn_save'].'</button>'.NL;
- }else{
+ } else {
echo '<button type="submit" name="cmd[save]">'.$lang['btn_update'].'</button>'.NL;
echo '<button type="submit" name="cmd[del]">'.$lang['btn_delete'].'</button>'.NL;
}
@@ -405,7 +423,8 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _html_explain($current){
+ protected function printExplanation($current)
+ {
global $ID;
global $auth;
@@ -413,69 +432,69 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
$ns = $this->ns;
// prepare where to check
- if($ns){
- if($ns == '*'){
+ if ($ns) {
+ if ($ns == '*') {
$check='*';
- }else{
+ } else {
$check=$ns.':*';
}
- }else{
+ } else {
$check = $ID;
}
// prepare who to check
- if($who{0} == '@'){
+ if ($who[0] == '@') {
$user = '';
- $groups = array(ltrim($who,'@'));
- }else{
+ $groups = array(ltrim($who, '@'));
+ } else {
$user = $who;
$info = $auth->getUserData($user);
- if($info === false){
+ if ($info === false) {
$groups = array();
- }else{
+ } else {
$groups = $info['grps'];
}
}
// check the permissions
- $perm = auth_aclcheck($check,$user,$groups);
+ $perm = auth_aclcheck($check, $user, $groups);
// build array of named permissions
$names = array();
- if($perm){
- if($ns){
- if($perm >= AUTH_DELETE) $names[] = $this->getLang('acl_perm16');
- if($perm >= AUTH_UPLOAD) $names[] = $this->getLang('acl_perm8');
- if($perm >= AUTH_CREATE) $names[] = $this->getLang('acl_perm4');
+ if ($perm) {
+ if ($ns) {
+ if ($perm >= AUTH_DELETE) $names[] = $this->getLang('acl_perm16');
+ if ($perm >= AUTH_UPLOAD) $names[] = $this->getLang('acl_perm8');
+ if ($perm >= AUTH_CREATE) $names[] = $this->getLang('acl_perm4');
}
- if($perm >= AUTH_EDIT) $names[] = $this->getLang('acl_perm2');
- if($perm >= AUTH_READ) $names[] = $this->getLang('acl_perm1');
+ if ($perm >= AUTH_EDIT) $names[] = $this->getLang('acl_perm2');
+ if ($perm >= AUTH_READ) $names[] = $this->getLang('acl_perm1');
$names = array_reverse($names);
- }else{
+ } else {
$names[] = $this->getLang('acl_perm0');
}
// print permission explanation
echo '<p>';
- if($user){
- if($ns){
- printf($this->getLang('p_user_ns'),hsc($who),hsc($ns),join(', ',$names));
- }else{
- printf($this->getLang('p_user_id'),hsc($who),hsc($ID),join(', ',$names));
+ if ($user) {
+ if ($ns) {
+ printf($this->getLang('p_user_ns'), hsc($who), hsc($ns), join(', ', $names));
+ } else {
+ printf($this->getLang('p_user_id'), hsc($who), hsc($ID), join(', ', $names));
}
- }else{
- if($ns){
- printf($this->getLang('p_group_ns'),hsc(ltrim($who,'@')),hsc($ns),join(', ',$names));
- }else{
- printf($this->getLang('p_group_id'),hsc(ltrim($who,'@')),hsc($ID),join(', ',$names));
+ } else {
+ if ($ns) {
+ printf($this->getLang('p_group_ns'), hsc(ltrim($who, '@')), hsc($ns), join(', ', $names));
+ } else {
+ printf($this->getLang('p_group_id'), hsc(ltrim($who, '@')), hsc($ID), join(', ', $names));
}
}
echo '</p>';
// add note if admin
- if($perm == AUTH_ADMIN){
+ if ($perm == AUTH_ADMIN) {
echo '<p>'.$this->getLang('p_isadmin').'</p>';
- }elseif(is_null($current)){
+ } elseif (is_null($current)) {
echo '<p>'.$this->getLang('p_inherited').'</p>';
}
}
@@ -488,46 +507,57 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _html_list_acl($item){
+ public function makeTreeItem($item)
+ {
$ret = '';
// what to display
- if(!empty($item['label'])){
+ if (!empty($item['label'])) {
$base = $item['label'];
- }else{
+ } else {
$base = ':'.$item['id'];
- $base = substr($base,strrpos($base,':')+1);
+ $base = substr($base, strrpos($base, ':')+1);
}
// highlight?
- if( ($item['type']== $this->current_item['type'] && $item['id'] == $this->current_item['id'])) {
+ if (($item['type']== $this->current_item['type'] && $item['id'] == $this->current_item['id'])) {
$cl = ' cur';
} else {
$cl = '';
}
// namespace or page?
- if($item['type']=='d'){
- if($item['open']){
+ if ($item['type']=='d') {
+ if ($item['open']) {
$img = DOKU_BASE.'lib/images/minus.gif';
$alt = '−';
- }else{
+ } else {
$img = DOKU_BASE.'lib/images/plus.gif';
$alt = '+';
}
$ret .= '<img src="'.$img.'" alt="'.$alt.'" />';
- $ret .= '<a href="'.wl('',$this->_get_opts(array('ns'=>$item['id'],'sectok'=>getSecurityToken()))).'" class="idx_dir'.$cl.'">';
+ $ret .= '<a href="'.
+ wl('', $this->getLinkOptions(array('ns'=> $item['id'], 'sectok'=>getSecurityToken()))).
+ '" class="idx_dir'.$cl.'">';
$ret .= $base;
$ret .= '</a>';
- }else{
- $ret .= '<a href="'.wl('',$this->_get_opts(array('id'=>$item['id'],'ns'=>'','sectok'=>getSecurityToken()))).'" class="wikilink1'.$cl.'">';
+ } else {
+ $ret .= '<a href="'.
+ wl('', $this->getLinkOptions(array('id'=> $item['id'], 'ns'=>'', 'sectok'=>getSecurityToken()))).
+ '" class="wikilink1'.$cl.'">';
$ret .= noNS($item['id']);
$ret .= '</a>';
}
return $ret;
}
-
- function _html_li_acl($item){
+ /**
+ * List Item formatter
+ *
+ * @param array $item
+ * @return string
+ */
+ public function makeListItem($item)
+ {
return '<li class="level' . $item['level'] . ' ' .
($item['open'] ? 'open' : 'closed') . '">';
}
@@ -538,7 +568,8 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _init_acl_config(){
+ public function initAclConfig()
+ {
global $AUTH_ACL;
global $conf;
$acl_config=array();
@@ -547,20 +578,24 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
// get special users and groups
$this->specials[] = '@ALL';
$this->specials[] = '@'.$conf['defaultgroup'];
- if($conf['manager'] != '!!not set!!'){
- $this->specials = array_merge($this->specials,
- array_map('trim',
- explode(',',$conf['manager'])));
+ if ($conf['manager'] != '!!not set!!') {
+ $this->specials = array_merge(
+ $this->specials,
+ array_map(
+ 'trim',
+ explode(',', $conf['manager'])
+ )
+ );
}
$this->specials = array_filter($this->specials);
$this->specials = array_unique($this->specials);
sort($this->specials);
- foreach($AUTH_ACL as $line){
- $line = trim(preg_replace('/#.*$/','',$line)); //ignore comments
- if(!$line) continue;
+ foreach ($AUTH_ACL as $line) {
+ $line = trim(preg_replace('/#.*$/', '', $line)); //ignore comments
+ if (!$line) continue;
- $acl = preg_split('/[ \t]+/',$line);
+ $acl = preg_split('/[ \t]+/', $line);
//0 is pagename, 1 is user, 2 is acl
$acl[1] = rawurldecode($acl[1]);
@@ -568,7 +603,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
// store non-special users and groups for later selection dialog
$ug = $acl[1];
- if(in_array($ug,$this->specials)) continue;
+ if (in_array($ug, $this->specials)) continue;
$usersgroups[] = $ug;
}
@@ -585,14 +620,15 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _html_table(){
+ protected function printAclTable()
+ {
global $lang;
global $ID;
echo '<form action="'.wl().'" method="post" accept-charset="utf-8"><div class="no">'.NL;
- if($this->ns){
+ if ($this->ns) {
echo '<input type="hidden" name="ns" value="'.hsc($this->ns).'" />'.NL;
- }else{
+ } else {
echo '<input type="hidden" name="id" value="'.hsc($ID).'" />'.NL;
}
echo '<input type="hidden" name="acl_w" value="'.hsc($this->who).'" />'.NL;
@@ -607,29 +643,29 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
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){
- foreach($set as $who => $perm){
+ foreach ($this->acl as $where => $set) {
+ foreach ($set as $who => $perm) {
echo '<tr>';
echo '<td>';
- if(substr($where,-1) == '*'){
+ if (substr($where, -1) == '*') {
echo '<span class="aclns">'.hsc($where).'</span>';
$ispage = false;
- }else{
+ } else {
echo '<span class="aclpage">'.hsc($where).'</span>';
$ispage = true;
}
echo '</td>';
echo '<td>';
- if($who{0} == '@'){
+ if ($who[0] == '@') {
echo '<span class="aclgroup">'.hsc($who).'</span>';
- }else{
+ } else {
echo '<span class="acluser">'.hsc($who).'</span>';
}
echo '</td>';
echo '<td>';
- echo $this->_html_checkboxes($perm,$ispage,'acl['.$where.']['.$who.']');
+ echo $this->makeCheckboxes($perm, $ispage, 'acl['.$where.']['.$who.']');
echo '</td>';
echo '<td class="check">';
@@ -655,21 +691,22 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _get_exact_perm(){
+ protected function getExactPermisson()
+ {
global $ID;
- if($this->ns){
- if($this->ns == '*'){
+ if ($this->ns) {
+ if ($this->ns == '*') {
$check = '*';
- }else{
+ } else {
$check = $this->ns.':*';
}
- }else{
+ } else {
$check = $ID;
}
- if(isset($this->acl[$check][$this->who])){
+ if (isset($this->acl[$check][$this->who])) {
return $this->acl[$check][$this->who];
- }else{
+ } else {
return null;
}
}
@@ -679,13 +716,17 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Frank Schubert <frank@schokilade.de>
*/
- function _acl_add($acl_scope, $acl_user, $acl_level){
+ public function addOrUpdateACL($acl_scope, $acl_user, $acl_level)
+ {
global $config_cascade;
- $acl_user = auth_nameencode($acl_user,true);
+
+ // first make sure we won't end up with 2 lines matching this user and scope. See issue #1115
+ $this->deleteACL($acl_scope, $acl_user);
+ $acl_user = auth_nameencode($acl_user, true);
// max level for pagenames is edit
- if(strpos($acl_scope,'*') === false) {
- if($acl_level > AUTH_EDIT) $acl_level = AUTH_EDIT;
+ if (strpos($acl_scope, '*') === false) {
+ if ($acl_level > AUTH_EDIT) $acl_level = AUTH_EDIT;
}
$new_acl = "$acl_scope\t$acl_user\t$acl_level\n";
@@ -698,11 +739,12 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Frank Schubert <frank@schokilade.de>
*/
- function _acl_del($acl_scope, $acl_user){
+ public function deleteACL($acl_scope, $acl_user)
+ {
global $config_cascade;
- $acl_user = auth_nameencode($acl_user,true);
+ $acl_user = auth_nameencode($acl_user, true);
- $acl_pattern = '^'.preg_quote($acl_scope,'/').'[ \t]+'.$acl_user.'[ \t]+[0-8].*$';
+ $acl_pattern = '^'.preg_quote($acl_scope, '/').'[ \t]+'.$acl_user.'[ \t]+[0-8].*$';
return io_deleteFromFile($config_cascade['acl']['default'], "/$acl_pattern/", true);
}
@@ -713,15 +755,16 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
* @author Frank Schubert <frank@schokilade.de>
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _html_checkboxes($setperm,$ispage,$name){
+ protected function makeCheckboxes($setperm, $ispage, $name)
+ {
global $lang;
static $label = 0; //number labels
$ret = '';
- if($ispage && $setperm > AUTH_EDIT) $setperm = AUTH_EDIT;
+ if ($ispage && $setperm > AUTH_EDIT) $setperm = AUTH_EDIT;
- foreach(array(AUTH_NONE,AUTH_READ,AUTH_EDIT,AUTH_CREATE,AUTH_UPLOAD,AUTH_DELETE) as $perm){
+ foreach (array(AUTH_NONE,AUTH_READ,AUTH_EDIT,AUTH_CREATE,AUTH_UPLOAD,AUTH_DELETE) as $perm) {
$label += 1;
//general checkbox attributes
@@ -730,11 +773,11 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
'name' => $name,
'value' => $perm );
//dynamic attributes
- if(!is_null($setperm) && $setperm == $perm) $atts['checked'] = 'checked';
- if($ispage && $perm > AUTH_EDIT){
+ if (!is_null($setperm) && $setperm == $perm) $atts['checked'] = 'checked';
+ if ($ispage && $perm > AUTH_EDIT) {
$atts['disabled'] = 'disabled';
$class = ' class="disabled"';
- }else{
+ } else {
$class = '';
}
@@ -752,21 +795,21 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function _html_select(){
+ protected function makeSelect()
+ {
$inlist = false;
$usel = '';
$gsel = '';
- if($this->who &&
- !in_array($this->who,$this->usersgroups) &&
- !in_array($this->who,$this->specials)){
-
- if($this->who{0} == '@'){
+ if ($this->who &&
+ !in_array($this->who, $this->usersgroups) &&
+ !in_array($this->who, $this->specials)) {
+ if ($this->who[0] == '@') {
$gsel = ' selected="selected"';
- }else{
+ } else {
$usel = ' selected="selected"';
}
- }else{
+ } else {
$inlist = true;
}
@@ -775,17 +818,17 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
echo ' <option value="__u__" class="acluser"'.$usel.'>'.$this->getLang('acl_user').'</option>'.NL;
if (!empty($this->specials)) {
echo ' <optgroup label="&#160;">'.NL;
- foreach($this->specials as $ug){
- if($ug == $this->who){
+ foreach ($this->specials as $ug) {
+ if ($ug == $this->who) {
$sel = ' selected="selected"';
$inlist = true;
- }else{
+ } else {
$sel = '';
}
- if($ug{0} == '@'){
+ if ($ug[0] == '@') {
echo ' <option value="'.hsc($ug).'" class="aclgroup"'.$sel.'>'.hsc($ug).'</option>'.NL;
- }else{
+ } else {
echo ' <option value="'.hsc($ug).'" class="acluser"'.$sel.'>'.hsc($ug).'</option>'.NL;
}
}
@@ -793,17 +836,17 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
}
if (!empty($this->usersgroups)) {
echo ' <optgroup label="&#160;">'.NL;
- foreach($this->usersgroups as $ug){
- if($ug == $this->who){
+ foreach ($this->usersgroups as $ug) {
+ if ($ug == $this->who) {
$sel = ' selected="selected"';
$inlist = true;
- }else{
+ } else {
$sel = '';
}
- if($ug{0} == '@'){
+ if ($ug[0] == '@') {
echo ' <option value="'.hsc($ug).'" class="aclgroup"'.$sel.'>'.hsc($ug).'</option>'.NL;
- }else{
+ } else {
echo ' <option value="'.hsc($ug).'" class="acluser"'.$sel.'>'.hsc($ug).'</option>'.NL;
}
}
diff --git a/lib/plugins/acl/lang/ar/lang.php b/lib/plugins/acl/lang/ar/lang.php
index 89fe27a76..da16a8e90 100644
--- a/lib/plugins/acl/lang/ar/lang.php
+++ b/lib/plugins/acl/lang/ar/lang.php
@@ -2,11 +2,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Mostafa Hussein <mostafa@gmail.com>
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
- * @author uahello@gmail.com
*/
$lang['admin_acl'] = 'إدارة قوائم التحكم بالدخول';
$lang['acl_group'] = 'مجموعة:';
diff --git a/lib/plugins/acl/lang/bg/lang.php b/lib/plugins/acl/lang/bg/lang.php
index 648b91ef4..5e250bc19 100644
--- a/lib/plugins/acl/lang/bg/lang.php
+++ b/lib/plugins/acl/lang/bg/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
* @author Kiril <neohidra@gmail.com>
diff --git a/lib/plugins/acl/lang/ca/lang.php b/lib/plugins/acl/lang/ca/lang.php
index 0c882962d..b697c371b 100644
--- a/lib/plugins/acl/lang/ca/lang.php
+++ b/lib/plugins/acl/lang/ca/lang.php
@@ -4,10 +4,8 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Carles Bellver <carles.bellver@cent.uji.es>
- * @author Carles Bellver <carles.bellver@gmail.com>
- * @author carles.bellver@gmail.com
- * @author carles.bellver@cent.uji.es
- * @author daniel@6temes.cat
+ * @author carles.bellver <carles.bellver@gmail.com>
+ * @author daniel <daniel@6temes.cat>
*/
$lang['admin_acl'] = 'Gestió de la Llista de Control d\'Accés';
$lang['acl_group'] = 'Grup:';
diff --git a/lib/plugins/acl/lang/da/lang.php b/lib/plugins/acl/lang/da/lang.php
index 5209b7b10..103a867ee 100644
--- a/lib/plugins/acl/lang/da/lang.php
+++ b/lib/plugins/acl/lang/da/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jacob Palm <mail@jacobpalm.dk>
* @author koeppe <koeppe@kazur.dk>
* @author Jon Bendtsen <bendtsen@diku.dk>
* @author Lars Næsbye Christensen <larsnaesbye@stud.ku.dk>
@@ -38,7 +39,7 @@ $lang['acl_perm0'] = 'Ingen';
$lang['acl_perm1'] = 'Læs';
$lang['acl_perm2'] = 'Skriv';
$lang['acl_perm4'] = 'Opret';
-$lang['acl_perm8'] = 'Overføre';
+$lang['acl_perm8'] = 'Overfør';
$lang['acl_perm16'] = 'Slet';
$lang['acl_new'] = 'Tilføj ny post';
-$lang['acl_mod'] = 'Ændre post';
+$lang['acl_mod'] = 'Redigér post';
diff --git a/lib/plugins/acl/lang/el/lang.php b/lib/plugins/acl/lang/el/lang.php
index 75cc41501..fe2dd083d 100644
--- a/lib/plugins/acl/lang/el/lang.php
+++ b/lib/plugins/acl/lang/el/lang.php
@@ -11,7 +11,7 @@
* @author Konstantinos Koryllos <koryllos@gmail.com>
* @author George Petsagourakis <petsagouris@gmail.com>
* @author Petros Vidalis <pvidalis@gmail.com>
- * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
+ * @author Vasileios Karavasilis <vasileioskaravasilis@gmail.com>
*/
$lang['admin_acl'] = 'Διαχείριση Δικαιωμάτων Πρόσβασης';
$lang['acl_group'] = 'Ομάδα:';
diff --git a/lib/plugins/acl/lang/fa/lang.php b/lib/plugins/acl/lang/fa/lang.php
index 2938e1bb2..46db20893 100644
--- a/lib/plugins/acl/lang/fa/lang.php
+++ b/lib/plugins/acl/lang/fa/lang.php
@@ -5,8 +5,7 @@
*
* @author behrad eslamifar <behrad_es@yahoo.com)
* @author Mohsen Firoozmandan <info@mambolearn.com>
- * @author omidmr@gmail.com
- * @author Omid Mottaghi <omidmr@gmail.com>
+ * @author omidmr <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
* @author Milad DZand <M.DastanZand@gmail.com>
* @author AmirH Hassaneini <mytechmix@gmail.com>
diff --git a/lib/plugins/acl/lang/fi/lang.php b/lib/plugins/acl/lang/fi/lang.php
index 2dfc35801..f680f2905 100644
--- a/lib/plugins/acl/lang/fi/lang.php
+++ b/lib/plugins/acl/lang/fi/lang.php
@@ -2,9 +2,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author otto@valjakko.net
- * @author Otto Vainio <otto@valjakko.net>
+ *
+ * @author otto <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
* @author Sami Olmari <sami@olmari.fi>
*/
diff --git a/lib/plugins/acl/lang/id/lang.php b/lib/plugins/acl/lang/id/lang.php
index 3b0ecf446..93e3f4125 100644
--- a/lib/plugins/acl/lang/id/lang.php
+++ b/lib/plugins/acl/lang/id/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author mubaidillah <mubaidillah@gmail.com>
* @author Yustinus Waruwu <juswaruwu@gmail.com>
*/
diff --git a/lib/plugins/acl/lang/is/lang.php b/lib/plugins/acl/lang/is/lang.php
index 13ed7bfd7..6715c2700 100644
--- a/lib/plugins/acl/lang/is/lang.php
+++ b/lib/plugins/acl/lang/is/lang.php
@@ -1,5 +1,8 @@
<?php
+
/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
* Icelandic language file
*
* @author Hrannar Baldursson <hrannar.baldursson@gmail.com>
diff --git a/lib/plugins/acl/lang/ja/lang.php b/lib/plugins/acl/lang/ja/lang.php
index 24a36391b..0963d2b63 100644
--- a/lib/plugins/acl/lang/ja/lang.php
+++ b/lib/plugins/acl/lang/ja/lang.php
@@ -3,8 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
* @author Davilin(Yuji Takenaka) <webmaster@davilin.com>
- * @author Yuji Takenaka <webmaster@davilin.com>
* @author Ikuo Obataya <i.obataya@gmail.com>
* @author Daniel Dupriest <kououken@gmail.com>
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
@@ -22,8 +22,8 @@ $lang['p_user_id'] = 'ユーザー <b class="acluser">%s</b> は、
$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>。';
-$lang['p_choose_ns'] = '名前空間 <b class="aclns">%s</b> にセットされた権限を閲覧・編集するためには、上記のフォームに<b>ユーザー名もしくはグループ名を入力して下さい</b>。';
+$lang['p_choose_id'] = 'ページ <b class="aclpage">%s</b> にセットされた権限を閲覧・編集するには、上記のフォームに<b>ユーザー名もしくはグループ名を入力して下さい</b>。';
+$lang['p_choose_ns'] = '名前空間 <b class="aclns">%s</b> にセットされた権限を閲覧・編集するには、上記のフォームに<b>ユーザー名もしくはグループ名を入力して下さい</b>。';
$lang['p_inherited'] = '注意:これらの権限は明示されていませんが、他のグループもしくは上位の名前空間の権限を継承します。';
$lang['p_isadmin'] = '注意:選択したグループもしくはユーザーはスーパーユーザーであるため、全ての権限があります。';
$lang['p_include'] = '高次の権限は、それより低次の権限を含みます。作成・アップロード・削除の権限は、ページではなく名前空間のみに適用されます。';
diff --git a/lib/plugins/acl/lang/km/lang.php b/lib/plugins/acl/lang/km/lang.php
new file mode 100644
index 000000000..1b7f7da94
--- /dev/null
+++ b/lib/plugins/acl/lang/km/lang.php
@@ -0,0 +1,8 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author no credits taken <someone@cambodia.kh>
+ */
+$lang['where'] = 'ទំព័រ/ដ្ឋាននាម';
diff --git a/lib/plugins/acl/lang/lt/lang.php b/lib/plugins/acl/lang/lt/lang.php
index 2a1748abc..5bf5981a3 100644
--- a/lib/plugins/acl/lang/lt/lang.php
+++ b/lib/plugins/acl/lang/lt/lang.php
@@ -2,9 +2,9 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Linas Valiukas <shirshegsm@gmail.com>
- * @author audrius.klevas@gmail.com
+ * @author audrius.klevas <audrius.klevas@gmail.com>
* @author Arunas Vaitekunas <aras@fan.lt>
*/
$lang['admin_acl'] = 'Priėjimo Kontrolės Sąrašų valdymas';
diff --git a/lib/plugins/acl/lang/no/lang.php b/lib/plugins/acl/lang/no/lang.php
index 13770f498..218ea7516 100644
--- a/lib/plugins/acl/lang/no/lang.php
+++ b/lib/plugins/acl/lang/no/lang.php
@@ -14,8 +14,7 @@
* @author Knut Staring <knutst@gmail.com>
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
- * @author Rune Rasmussen syntaxerror.no@gmail.com
+ * @author Rune Rasmussen <syntaxerror.no@gmail.com>
* @author Jon Bøe <jonmagneboe@hotmail.com>
* @author Egil Hansen <egil@rosetta.no>
*/
diff --git a/lib/plugins/acl/lang/pt/help.txt b/lib/plugins/acl/lang/pt/help.txt
index cf4619deb..6b076698d 100644
--- a/lib/plugins/acl/lang/pt/help.txt
+++ b/lib/plugins/acl/lang/pt/help.txt
@@ -1,9 +1,8 @@
=== Auxílio Rápido ===
-Nesta página podes adicionar e remover permissões para espaço de nomes e páginas no seu wiki.
+Nesta página pode adicionar e remover permissões para namespace e páginas no seu wiki.
+ * O painel esquerdo exibe todos os namespaces e páginas.´
+ * O formulário acima permite a ver e modificar as permissões de um usuário ou grupo selecionado.
+ * Na tabela abaixo são exibidas todas as regras de controle de acesso atuais. Podes utilizá-la para excluir ou mudar rapidamente várias regras ao mesmo tempo.
-O painel esquerdo exibe todos os espaço de nomes e páginas. O formulario acima permite a visualização e modificar as permissões de um selecionado utilizador ou grupo.
-
-Na tabela inferior são exibidas todas as actuais regras de controle de acesso. Podes utilisá-la para excluir ou mudar rapidamente várias regras ao mesmo tempo.
-
-A leitura da [[doku>acl|documentação oficial acerca ACL]] pode ajudar a compreender melhor como o controle de acessos funciona no DokuWiki.
+A leitura da [[doku>acl|documentação oficial sobre ACL]] pode ajudar a compreender melhor como o controle de acessos funciona no DokuWiki.
diff --git a/lib/plugins/acl/lang/pt/lang.php b/lib/plugins/acl/lang/pt/lang.php
index eb77cba5c..e30ce9726 100644
--- a/lib/plugins/acl/lang/pt/lang.php
+++ b/lib/plugins/acl/lang/pt/lang.php
@@ -3,32 +3,33 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
* @author José Carlos Monteiro <jose.c.monteiro@netcabo.pt>
* @author José Monteiro <Jose.Monteiro@DoWeDo-IT.com>
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
- * @author José Campos zecarlosdecampos@gmail.com
+ * @author José Campos <zecarlosdecampos@gmail.com>
*/
-$lang['admin_acl'] = 'Gestão de ACLs';
+$lang['admin_acl'] = 'Gerenciamento de ACLs';
$lang['acl_group'] = 'Grupo:';
-$lang['acl_user'] = 'Utilizador:';
+$lang['acl_user'] = 'Usuário:';
$lang['acl_perms'] = 'Permissão para';
-$lang['page'] = 'Documento';
+$lang['page'] = 'Página';
$lang['namespace'] = 'Namespace';
$lang['btn_select'] = 'Selecionar';
$lang['p_user_id'] = 'O utilizador <b class="acluser">%s</b> tem as seguintes permissões na página <b class="aclpage">%s</b>: <i>%s</i>.';
-$lang['p_user_ns'] = 'O utilizador <b class="acluser">%s</b> tem as seguintes permissões no espaço de nomes <b class="aclns">%s</b>: <i>%s</i>.';
+$lang['p_user_ns'] = 'O utilizador <b class="acluser">%s</b> tem as seguintes permissões no namespace <b class="aclns">%s</b>: <i>%s</i>.';
$lang['p_group_id'] = 'Os membros do grupo <b class="aclgroup">%s</b> têm as seguintes permissões na página <b class="aclpage">%s</b>: <i>%s</i>.';
-$lang['p_group_ns'] = 'Os membros do grupo <b class="aclgroup">%s</b> têm as seguintes permissões no espaço de nomes <b class="aclpage">%s</b>: <i>%s</i>.';
-$lang['p_choose_id'] = 'Por favor <b>digite um utilizador ou grupo</b> no formulário acima para ver ou editar as permissões para a página <b class="aclpage">%s</b>.';
-$lang['p_choose_ns'] = 'Por favor <b>digite um utilizador ou grupo</b> no formulário acima para ver ou editar as permissões para o espaço de nomes <b class="aclpage">%s</b>.';
-$lang['p_inherited'] = 'Nota: Essas permissões não foram definidas explicitamente, mas sim herdadas de outros grupos ou espaço de nomes superiores.';
-$lang['p_isadmin'] = 'Nota: O grupo ou utilizador seleccionado tem sempre permissões completas, porque ele está configurado como superutilizador.';
-$lang['p_include'] = 'As permissões superiores incluem as inferiores. Permissões para Criar, Enviar e Apagar aplicam-se apenas aos espaços de nomes e não às páginas.';
-$lang['current'] = 'Regras Actuais ACL';
-$lang['where'] = 'Página/Espaço de Nomes';
-$lang['who'] = 'Utilizador/Grupo';
+$lang['p_group_ns'] = 'Os membros do grupo <b class="aclgroup">%s</b> têm as seguintes permissões no namespace <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_choose_id'] = 'Por favor <b>digite um usuário ou grupo</b> no formulário acima para ver ou editar as permissões para a página <b class="aclpage">%s</b>.';
+$lang['p_choose_ns'] = 'Por favor <b>digite um usuário ou grupo</b> no formulário acima para ver ou editar as permissões para o namespace <b class="aclpage">%s</b>.';
+$lang['p_inherited'] = 'Nota: Essas permissões não foram definidas explicitamente, mas sim herdadas de outros grupos ou namespaces superiores.';
+$lang['p_isadmin'] = 'Nota: O grupo ou utilizador seleccionado tem sempre permissões completas, porque ele está configurado como superusuário.';
+$lang['p_include'] = 'As permissões superiores incluem as inferiores. Permissões para Criar, Enviar e Excluir aplicam-se apenas aos namespaces e não às páginas.';
+$lang['current'] = 'Regras ACL Atuais';
+$lang['where'] = 'Página/Namespace';
+$lang['who'] = 'Usuário/Grupo';
$lang['perm'] = 'Permissões';
$lang['acl_perm0'] = 'Nenhum';
$lang['acl_perm1'] = 'Ler';
@@ -36,5 +37,5 @@ $lang['acl_perm2'] = 'Editar';
$lang['acl_perm4'] = 'Criar';
$lang['acl_perm8'] = 'Carregar';
$lang['acl_perm16'] = 'Remover';
-$lang['acl_new'] = 'Adicionar nova entrada';
+$lang['acl_new'] = 'Adicionar nova Entrada';
$lang['acl_mod'] = 'Modificar Entrada';
diff --git a/lib/plugins/acl/lang/ro/lang.php b/lib/plugins/acl/lang/ro/lang.php
index 804bc80c8..3c55a1276 100644
--- a/lib/plugins/acl/lang/ro/lang.php
+++ b/lib/plugins/acl/lang/ro/lang.php
@@ -4,14 +4,9 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Sergiu Baltariu <s_baltariu@yahoo.com>
- * @author s_baltariu@yahoo.com
* @author Emanuel-Emeric Andrasi <n30@mandrivausers.ro>
- * @author Emanuel-Emeric Andrași <n30@mandrivausers.ro>
* @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/sr/lang.php b/lib/plugins/acl/lang/sr/lang.php
index 0ba322a5e..f2c95484d 100644
--- a/lib/plugins/acl/lang/sr/lang.php
+++ b/lib/plugins/acl/lang/sr/lang.php
@@ -4,8 +4,7 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Filip Brcic <brcha@users.sourceforge.net>
- * @author Иван Петровић petrovicivan@ubuntusrbija.org
- * @author Ivan Petrovic <petrovicivan@ubuntusrbija.org>
+ * @author Иван Петровић <petrovicivan@ubuntusrbija.org>
* @author Miroslav Šolti <solti.miroslav@gmail.com>
*/
$lang['admin_acl'] = 'Управљање листом контроле приступа';
diff --git a/lib/plugins/acl/lang/th/lang.php b/lib/plugins/acl/lang/th/lang.php
index 55b707b5c..24694ac2d 100644
--- a/lib/plugins/acl/lang/th/lang.php
+++ b/lib/plugins/acl/lang/th/lang.php
@@ -2,9 +2,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Komgrit Niyomrath <n.komgrit@gmail.com>
- * @author Kittithat Arnontavilas mrtomyum@gmail.com
* @author Kittithat Arnontavilas <mrtomyum@gmail.com>
* @author Thanasak Sompaisansin <jombthep@gmail.com>
*/
diff --git a/lib/plugins/acl/lang/tr/lang.php b/lib/plugins/acl/lang/tr/lang.php
index 3c3e3dbc1..1f81da0eb 100644
--- a/lib/plugins/acl/lang/tr/lang.php
+++ b/lib/plugins/acl/lang/tr/lang.php
@@ -2,13 +2,13 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Selim Farsakoğlu <farsakogluselim@yahoo.de>
* @author Aydın Coşkuner <aydinweb@gmail.com>
* @author Cihan Kahveci <kahvecicihan@gmail.com>
* @author Yavuz Selim <yavuzselim@gmail.com>
* @author Caleb Maclennan <caleb@alerque.com>
- * @author farukerdemoncel@gmail.com
+ * @author farukerdemoncel <farukerdemoncel@gmail.com>
*/
$lang['admin_acl'] = 'Erişim Kontrol Listesi (ACL) Yönetimi';
$lang['acl_group'] = 'Grup:';
diff --git a/lib/plugins/acl/lang/vi/help.txt b/lib/plugins/acl/lang/vi/help.txt
index 816e5ee71..d657c2e23 100644
--- a/lib/plugins/acl/lang/vi/help.txt
+++ b/lib/plugins/acl/lang/vi/help.txt
@@ -1,12 +1,8 @@
=== 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.
+Trên trang này, bạn có thể thêm và xóa quyền cho không gian tên và trang trong wiki của bạn.
+ * Khung bên trái hiển thị tất cả các không gian tên và trang có sẵn
+ * Biểu mẫu trên cho phép bạn xem và sửa đổi các quyền của thành viên hoặc nhóm đã chọn.
+ * Bảng dưới đây hiện thị tất cả các quy tắc kiểm soát truy cập. Bạn có thể sử dụng nó để nhanh chóng xóa hoặc thay đổi nhiều quy tắc.
+Đọc [[doku>acl|tài liệu chính thức về ACL]] có thể giúp bạn hiểu đầy đủ cách thức kiểm soát hoạt động truy cập trong DokuWiki. \ No newline at end of file
diff --git a/lib/plugins/acl/lang/vi/lang.php b/lib/plugins/acl/lang/vi/lang.php
index 8ca888cae..fb4d3b1ff 100644
--- a/lib/plugins/acl/lang/vi/lang.php
+++ b/lib/plugins/acl/lang/vi/lang.php
@@ -2,34 +2,35 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
* @author NukeViet <admin@nukeviet.vn>
*/
$lang['admin_acl'] = 'Quản lý danh sách quyền truy cập';
$lang['acl_group'] = 'Nhóm:';
$lang['acl_user'] = 'Thành viên:';
-$lang['acl_perms'] = 'Cấp phép cho';
+$lang['acl_perms'] = 'Cấp quyền cho';
$lang['page'] = 'Trang';
-$lang['namespace'] = 'Thư mục';
+$lang['namespace'] = 'Không gian tên';
$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['p_user_id'] = 'Thành viên <b class="acluser">%s</b> hiện có các quyền sau trên trang <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_user_ns'] = 'Thành viên <b class="acluser">%s</b> hiện có các quyền sau trong không gian tên <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 có các quyền sau trên 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 có các quyền sau trong không gian tên<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 đổi 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 đổi 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 không gian tên cao hơn.';
+$lang['p_isadmin'] = 'Ghi chú: Nhóm hoặc thành viên này luôn được cấp đủ quyền vì họ được đặt là Siêu thành viên';
+$lang['p_include'] = 'Các quyền cao hơn bao gồm những quyền thấp hơn. Quyền Tạo, Tải lên và Xóa chỉ áp dụng cho không gian tên, không phải trang.';
$lang['current'] = 'Danh sách quyền truy cập hiện tại';
-$lang['where'] = 'Trang/Thư mục';
+$lang['where'] = 'Trang/Không gian tên';
$lang['who'] = 'Thành viên/Nhóm';
$lang['perm'] = 'Quyền';
$lang['acl_perm0'] = 'Không';
$lang['acl_perm1'] = 'Đọc';
-$lang['acl_perm2'] = 'Sửa';
+$lang['acl_perm2'] = 'Sửa đổi';
$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';
+$lang['acl_new'] = 'Thêm mục nhập mới';
+$lang['acl_mod'] = 'Sửa đổi mục nhập';
diff --git a/lib/plugins/acl/remote.php b/lib/plugins/acl/remote.php
index 27c5c162a..8d19add72 100644
--- a/lib/plugins/acl/remote.php
+++ b/lib/plugins/acl/remote.php
@@ -1,16 +1,20 @@
<?php
+use dokuwiki\Remote\AccessDeniedException;
+
/**
* Class remote_plugin_acl
*/
-class remote_plugin_acl extends DokuWiki_Remote_Plugin {
+class remote_plugin_acl extends DokuWiki_Remote_Plugin
+{
/**
* Returns details about the remote plugin methods
*
- * @return array Information about all provided methods. {@see RemoteAPI}
+ * @return array Information about all provided methods. {@see dokuwiki\Remote\RemoteAPI}
*/
- public function _getMethods() {
+ public function _getMethods()
+ {
return array(
'listAcls' => array(
'args' => array(),
@@ -34,16 +38,20 @@ class remote_plugin_acl extends DokuWiki_Remote_Plugin {
/**
* List all ACL config entries
*
- * @throws RemoteAccessDeniedException
+ * @throws AccessDeniedException
* @return dictionary {Scope: ACL}, where ACL = dictionnary {user/group: permissions_int}
*/
- public function listAcls(){
- if(!auth_isadmin()) {
- throw new RemoteAccessDeniedException('You are not allowed to access ACLs, superuser permission is required', 114);
+ public function listAcls()
+ {
+ if (!auth_isadmin()) {
+ throw new AccessDeniedException(
+ 'You are not allowed to access ACLs, superuser permission is required',
+ 114
+ );
}
/** @var admin_plugin_acl $apa */
$apa = plugin_load('admin', 'acl');
- $apa->_init_acl_config();
+ $apa->initAclConfig();
return $apa->acl;
}
@@ -53,17 +61,21 @@ class remote_plugin_acl extends DokuWiki_Remote_Plugin {
* @param string $scope
* @param string $user
* @param int $level see also inc/auth.php
- * @throws RemoteAccessDeniedException
+ * @throws AccessDeniedException
* @return bool
*/
- public function addAcl($scope, $user, $level){
- if(!auth_isadmin()) {
- throw new RemoteAccessDeniedException('You are not allowed to access ACLs, superuser permission is required', 114);
+ public function addAcl($scope, $user, $level)
+ {
+ if (!auth_isadmin()) {
+ throw new AccessDeniedException(
+ 'You are not allowed to access ACLs, superuser permission is required',
+ 114
+ );
}
/** @var admin_plugin_acl $apa */
$apa = plugin_load('admin', 'acl');
- return $apa->_acl_add($scope, $user, $level);
+ return $apa->addOrUpdateACL($scope, $user, $level);
}
/**
@@ -71,17 +83,20 @@ class remote_plugin_acl extends DokuWiki_Remote_Plugin {
*
* @param string $scope
* @param string $user
- * @throws RemoteAccessDeniedException
+ * @throws AccessDeniedException
* @return bool
*/
- public function delAcl($scope, $user){
- if(!auth_isadmin()) {
- throw new RemoteAccessDeniedException('You are not allowed to access ACLs, superuser permission is required', 114);
+ public function delAcl($scope, $user)
+ {
+ if (!auth_isadmin()) {
+ throw new AccessDeniedException(
+ 'You are not allowed to access ACLs, superuser permission is required',
+ 114
+ );
}
/** @var admin_plugin_acl $apa */
$apa = plugin_load('admin', 'acl');
- return $apa->_acl_del($scope, $user);
+ return $apa->deleteACL($scope, $user);
}
}
-
diff --git a/lib/plugins/acl/script.js b/lib/plugins/acl/script.js
index 86badffdd..95621a255 100644
--- a/lib/plugins/acl/script.js
+++ b/lib/plugins/acl/script.js
@@ -15,8 +15,8 @@ var dw_acl = {
return;
}
- jQuery('#acl__user select').change(dw_acl.userselhandler);
- jQuery('#acl__user button').click(dw_acl.loadinfo);
+ jQuery('#acl__user select').on('change', dw_acl.userselhandler);
+ jQuery('#acl__user button').on('click', dw_acl.loadinfo);
$tree = jQuery('#acl__tree');
$tree.dw_tree({toggle_selector: 'img',
diff --git a/lib/plugins/action.php b/lib/plugins/action.php
index 23d94a509..a3cbec722 100644
--- a/lib/plugins/action.php
+++ b/lib/plugins/action.php
@@ -1,25 +1,2 @@
<?php
-/**
- * Action Plugin Prototype
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Christopher Smith <chris@jalakai.co.uk>
- */
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-/**
- * All DokuWiki plugins to interfere with the event system
- * need to inherit from this class
- */
-class DokuWiki_Action_Plugin extends DokuWiki_Plugin {
-
- /**
- * Registers a callback function for a given event
- *
- * @param Doku_Event_Handler $controller
- */
- public function register(Doku_Event_Handler $controller) {
- trigger_error('register() not implemented in '.get_class($this), E_USER_WARNING);
- }
-}
+dbg_deprecated('Autoloading. Do not require() files yourself.');
diff --git a/lib/plugins/admin.php b/lib/plugins/admin.php
index 4e1cbbb33..a3cbec722 100644
--- a/lib/plugins/admin.php
+++ b/lib/plugins/admin.php
@@ -1,96 +1,2 @@
<?php
-/**
- * Admin Plugin Prototype
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Christopher Smith <chris@jalakai.co.uk>
- */
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-/**
- * All DokuWiki plugins to extend the admin function
- * need to inherit from this class
- */
-class DokuWiki_Admin_Plugin extends DokuWiki_Plugin {
-
- /**
- * Return the text that is displayed at the main admin menu
- * (Default localized language string 'menu' is returned, override this function for setting another name)
- *
- * @param string $language language code
- * @return string menu string
- */
- public function getMenuText($language) {
- $menutext = $this->getLang('menu');
- if (!$menutext) {
- $info = $this->getInfo();
- $menutext = $info['name'].' ...';
- }
- return $menutext;
- }
-
- /**
- * Return the path to the icon being displayed in the main admin menu.
- * By default it tries to find an 'admin.svg' file in the plugin directory.
- * (Override this function for setting another image)
- *
- * Important: you have to return a single path, monochrome SVG icon! It has to be
- * under 2 Kilobytes!
- *
- * We recommend icons from https://materialdesignicons.com/ or to use a matching
- * style.
- *
- * @return string full path to the icon file
- */
- public function getMenuIcon() {
- $plugin = $this->getPluginName();
- return DOKU_PLUGIN . $plugin . '/admin.svg';
- }
-
- /**
- * Determine position in list in admin window
- * Lower values are sorted up
- *
- * @return int
- */
- public function getMenuSort() {
- return 1000;
- }
-
- /**
- * Carry out required processing
- */
- public function handle() {
- trigger_error('handle() not implemented in '.get_class($this), E_USER_WARNING);
- }
-
- /**
- * Output html of the admin page
- */
- public function html() {
- trigger_error('html() not implemented in '.get_class($this), E_USER_WARNING);
- }
-
- /**
- * Return true for access only by admins (config:superuser) or false if managers are allowed as well
- *
- * @return bool
- */
- public function forAdminOnly() {
- return true;
- }
-
- /**
- * Return array with ToC items. Items can be created with the html_mktocitem()
- *
- * @see html_mktocitem()
- * @see tpl_toc()
- *
- * @return array
- */
- public function getTOC(){
- return array();
- }
-}
-//Setup VIM: ex: et ts=4 :
+dbg_deprecated('Autoloading. Do not require() files yourself.');
diff --git a/lib/plugins/auth.php b/lib/plugins/auth.php
index 0cd965b72..a3cbec722 100644
--- a/lib/plugins/auth.php
+++ b/lib/plugins/auth.php
@@ -1,438 +1,2 @@
<?php
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-/**
- * Auth Plugin Prototype
- *
- * 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 {
- public $success = true;
-
- /**
- * Possible 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.
- */
- protected $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
- *
- * For future compatibility, sub classes should always include a call
- * to parent::__constructor() in their constructors!
- *
- * Set $this->success to false if checks fail
- *
- * @author Christopher Smith <chris@jalakai.co.uk>
- */
- public function __construct() {
- // the base class constructor does nothing, derived class
- // constructors do the real work
- }
-
- /**
- * Available Capabilities. [ DO NOT OVERRIDE ]
- *
- * For introspection/debugging
- *
- * @author Christopher Smith <chris@jalakai.co.uk>
- * @return array
- */
- public function getCapabilities(){
- return array_keys($this->cando);
- }
-
- /**
- * 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>
- * @param string $cap the capability to check
- * @return bool
- */
- public 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];
- }
- }
-
- /**
- * 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 bool|null|int Result from the modification function or false if an event handler has canceled the action
- */
- public function triggerUserMod($type, $params) {
- $validTypes = array(
- 'create' => 'createUser',
- 'modify' => 'modifyUser',
- 'delete' => 'deleteUsers'
- );
- if(empty($validTypes[$type])) {
- return false;
- }
-
- $result = 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]), $evt->data['params']);
- $evt->data['modification_result'] = $result;
- }
- $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>
- */
- public 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
- */
- public 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;
-
- */
- }
-
- /**
- * 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>
- * @param string $user the user name
- * @param string $pass the clear text password
- * @return bool
- */
- public function checkPass($user, $pass) {
- msg("no valid authorisation system in use", -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 address of the user
- * grps array list of groups the user is in
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @param string $user the user name
- * @param bool $requireGroups whether or not the returned data must include groups
- * @return false|array containing user data or false
- */
- public function getUserData($user, $requireGroups=true) {
- if(!$this->cando['external']) msg("no valid authorisation system in use", -1);
- return false;
- }
-
- /**
- * 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>
- * @param string $user
- * @param string $pass
- * @param string $name
- * @param string $mail
- * @param null|array $grps
- * @return bool|null
- */
- public 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 string $user nick of the user to be changed
- * @param array $changes array of field/value pairs to be changed (password will be clear text)
- * @return bool
- */
- public function modifyUser($user, $changes) {
- msg("authorisation method does not allow modifying of user data", -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
- */
- public function deleteUsers($users) {
- msg("authorisation method does not allow deleting of users", -1);
- return 0;
- }
-
- /**
- * 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>
- * @param array $filter array of field/pattern pairs, empty array for no filter
- * @return int
- */
- public function getUserCount($filter = array()) {
- msg("authorisation method does not provide user counts", -1);
- return 0;
- }
-
- /**
- * Bulk retrieval of user data [implement only where required/possible]
- *
- * Set getUsers capability when implemented
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- * @param int $start index of first user to be returned
- * @param int $limit max number of users to be returned, 0 for unlimited
- * @param array $filter array of field/pattern pairs, null for no filter
- * @return array list of userinfo (refer getUserData for internal userinfo details)
- */
- public function retrieveUsers($start = 0, $limit = 0, $filter = null) {
- msg("authorisation method does not support mass retrieval of user data", -1);
- return array();
- }
-
- /**
- * Define a group [implement only where required/possible]
- *
- * Set addGroup capability when implemented
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- * @param string $group
- * @return bool
- */
- public function addGroup($group) {
- msg("authorisation method does not support independent group creation", -1);
- return false;
- }
-
- /**
- * Retrieve groups [implement only where required/possible]
- *
- * Set getGroups capability when implemented
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- * @param int $start
- * @param int $limit
- * @return array
- */
- public 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
- *
- * @return bool
- */
- public function isCaseSensitive() {
- return true;
- }
-
- /**
- * 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
- * @return string the cleaned username
- */
- public 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
- * @return string the cleaned groupname
- */
- public 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
- */
- public function useSessionCache($user) {
- global $conf;
- return ($_SESSION[DOKU_COOKIE]['auth']['time'] >= @filemtime($conf['cachedir'].'/sessionpurge'));
- }
-}
+dbg_deprecated('Autoloading. Do not require() files yourself.');
diff --git a/lib/plugins/authad/action.php b/lib/plugins/authad/action.php
index bc0f90c7e..a9fc01c1b 100644
--- a/lib/plugins/authad/action.php
+++ b/lib/plugins/authad/action.php
@@ -6,22 +6,20 @@
* @author Andreas Gohr <gohr@cosmocode.de>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
/**
* Class action_plugin_addomain
*/
-class action_plugin_authad extends DokuWiki_Action_Plugin {
+class action_plugin_authad extends DokuWiki_Action_Plugin
+{
/**
* Registers a callback function for a given event
*/
- public function register(Doku_Event_Handler $controller) {
-
- $controller->register_hook('AUTH_LOGIN_CHECK', 'BEFORE', $this, 'handle_auth_login_check');
- $controller->register_hook('HTML_LOGINFORM_OUTPUT', 'BEFORE', $this, 'handle_html_loginform_output');
+ public function register(Doku_Event_Handler $controller)
+ {
+ $controller->register_hook('AUTH_LOGIN_CHECK', 'BEFORE', $this, 'handleAuthLoginCheck');
+ $controller->register_hook('HTML_LOGINFORM_OUTPUT', 'BEFORE', $this, 'handleHtmlLoginformOutput');
}
/**
@@ -30,17 +28,18 @@ class action_plugin_authad extends DokuWiki_Action_Plugin {
* @param Doku_Event $event
* @param array $param
*/
- public function handle_auth_login_check(Doku_Event &$event, $param) {
+ public function handleAuthLoginCheck(Doku_Event $event, $param)
+ {
global $INPUT;
/** @var auth_plugin_authad $auth */
global $auth;
- if(!is_a($auth, 'auth_plugin_authad')) return; // AD not even used
+ if (!is_a($auth, 'auth_plugin_authad')) return; // AD not even used
- if($INPUT->str('dom')) {
+ if ($INPUT->str('dom')) {
$usr = $auth->cleanUser($event->data['user']);
- $dom = $auth->_userDomain($usr);
- if(!$dom) {
+ $dom = $auth->getUserDomain($usr);
+ if (!$dom) {
$usr = "$usr@".$INPUT->str('dom');
}
$INPUT->post->set('u', $usr);
@@ -54,26 +53,27 @@ class action_plugin_authad extends DokuWiki_Action_Plugin {
* @param Doku_Event $event
* @param array $param
*/
- public function handle_html_loginform_output(Doku_Event &$event, $param) {
+ public function handleHtmlLoginformOutput(Doku_Event $event, $param)
+ {
global $INPUT;
/** @var auth_plugin_authad $auth */
global $auth;
- if(!is_a($auth, 'auth_plugin_authad')) return; // AD not even used
- $domains = $auth->_getConfiguredDomains();
- if(count($domains) <= 1) return; // no choice at all
+ if (!is_a($auth, 'auth_plugin_authad')) return; // AD not even used
+ $domains = $auth->getConfiguredDomains();
+ if (count($domains) <= 1) return; // no choice at all
/** @var Doku_Form $form */
$form =& $event->data;
// any default?
$dom = '';
- if($INPUT->has('u')) {
+ if ($INPUT->has('u')) {
$usr = $auth->cleanUser($INPUT->str('u'));
- $dom = $auth->_userDomain($usr);
+ $dom = $auth->getUserDomain($usr);
// update user field value
- if($dom) {
- $usr = $auth->_userName($usr);
+ if ($dom) {
+ $usr = $auth->getUserName($usr);
$pos = $form->findElementByAttribute('name', 'u');
$ele =& $form->getElementAt($pos);
$ele['value'] = $usr;
@@ -85,7 +85,6 @@ class action_plugin_authad extends DokuWiki_Action_Plugin {
$pos = $form->findElementByAttribute('name', 'p');
$form->insertElement($pos + 1, $element);
}
-
}
-// vim:ts=4:sw=4:et: \ No newline at end of file
+// vim:ts=4:sw=4:et:
diff --git a/lib/plugins/authad/auth.php b/lib/plugins/authad/auth.php
index 50f708456..27a6b229e 100644
--- a/lib/plugins/authad/auth.php
+++ b/lib/plugins/authad/auth.php
@@ -1,9 +1,4 @@
<?php
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-require_once(DOKU_PLUGIN.'authad/adLDAP/adLDAP.php');
-require_once(DOKU_PLUGIN.'authad/adLDAP/classes/adLDAPUtils.php');
/**
* Active Directory authentication backend for DokuWiki
@@ -41,7 +36,8 @@ require_once(DOKU_PLUGIN.'authad/adLDAP/classes/adLDAPUtils.php');
* @author Andreas Gohr <andi@splitbrain.org>
* @author Jan Schumann <js@schumann-it.com>
*/
-class auth_plugin_authad extends DokuWiki_Auth_Plugin {
+class auth_plugin_authad extends DokuWiki_Auth_Plugin
+{
/**
* @var array hold connection data for a specific AD domain
@@ -66,52 +62,53 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
/**
* @var array filter patterns for listing users
*/
- protected $_pattern = array();
-
- protected $_actualstart = 0;
+ protected $pattern = array();
- protected $_grpsusers = array();
+ protected $grpsusers = array();
/**
* Constructor
*/
- public function __construct() {
+ public function __construct()
+ {
global $INPUT;
parent::__construct();
+ require_once(DOKU_PLUGIN.'authad/adLDAP/adLDAP.php');
+ require_once(DOKU_PLUGIN.'authad/adLDAP/classes/adLDAPUtils.php');
+
// we load the config early to modify it a bit here
$this->loadConfig();
// additional information fields
- if(isset($this->conf['additional'])) {
+ if (isset($this->conf['additional'])) {
$this->conf['additional'] = str_replace(' ', '', $this->conf['additional']);
$this->conf['additional'] = explode(',', $this->conf['additional']);
} else $this->conf['additional'] = array();
// ldap extension is needed
- if(!function_exists('ldap_connect')) {
- if($this->conf['debug'])
+ if (!function_exists('ldap_connect')) {
+ if ($this->conf['debug'])
msg("AD Auth: PHP LDAP extension not found.", -1);
$this->success = false;
return;
}
// Prepare SSO
- if(!empty($_SERVER['REMOTE_USER'])) {
-
+ if (!empty($_SERVER['REMOTE_USER'])) {
// make sure the right encoding is used
- if($this->getConf('sso_charset')) {
+ if ($this->getConf('sso_charset')) {
$_SERVER['REMOTE_USER'] = iconv($this->getConf('sso_charset'), 'UTF-8', $_SERVER['REMOTE_USER']);
- } elseif(!utf8_check($_SERVER['REMOTE_USER'])) {
+ } elseif (!\dokuwiki\Utf8\Clean::isUtf8($_SERVER['REMOTE_USER'])) {
$_SERVER['REMOTE_USER'] = utf8_encode($_SERVER['REMOTE_USER']);
}
// trust the incoming user
- if($this->conf['sso']) {
+ if ($this->conf['sso']) {
$_SERVER['REMOTE_USER'] = $this->cleanUser($_SERVER['REMOTE_USER']);
// we need to simulate a login
- if(empty($_COOKIE[DOKU_COOKIE])) {
+ if (empty($_COOKIE[DOKU_COOKIE])) {
$INPUT->set('u', $_SERVER['REMOTE_USER']);
$INPUT->set('p', 'sso_only');
}
@@ -130,10 +127,11 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param string $cap
* @return bool
*/
- public function canDo($cap) {
+ public function canDo($cap)
+ {
//capabilities depend on config, which may change depending on domain
- $domain = $this->_userDomain($_SERVER['REMOTE_USER']);
- $this->_loadServerConfig($domain);
+ $domain = $this->getUserDomain($_SERVER['REMOTE_USER']);
+ $this->loadServerConfig($domain);
return parent::canDo($cap);
}
@@ -149,16 +147,22 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param string $pass
* @return bool
*/
- public function checkPass($user, $pass) {
- if($_SERVER['REMOTE_USER'] &&
+ public function checkPass($user, $pass)
+ {
+ if ($_SERVER['REMOTE_USER'] &&
$_SERVER['REMOTE_USER'] == $user &&
$this->conf['sso']
) return true;
- $adldap = $this->_adldap($this->_userDomain($user));
- if(!$adldap) return false;
+ $adldap = $this->initAdLdap($this->getUserDomain($user));
+ if (!$adldap) return false;
- return $adldap->authenticate($this->_userName($user), $pass);
+ try {
+ return $adldap->authenticate($this->getUserName($user), $pass);
+ } catch (adLDAPException $e) {
+ // shouldn't really happen
+ return false;
+ }
}
/**
@@ -186,14 +190,15 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param bool $requireGroups (optional) - ignored, groups are always supplied by this plugin
* @return array
*/
- public function getUserData($user, $requireGroups=true) {
+ public function getUserData($user, $requireGroups = true)
+ {
global $conf;
global $lang;
global $ID;
- $adldap = $this->_adldap($this->_userDomain($user));
- if(!$adldap) return false;
+ $adldap = $this->initAdLdap($this->getUserDomain($user));
+ if (!$adldap) return array();
- if($user == '') return array();
+ if ($user == '') return array();
$fields = array('mail', 'displayname', 'samaccountname', 'lastpwd', 'pwdlastset', 'useraccountcontrol');
@@ -203,8 +208,8 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
$fields = array_filter($fields);
//get info for given user
- $result = $adldap->user()->info($this->_userName($user), $fields);
- if($result == false){
+ $result = $adldap->user()->info($this->getUserName($user), $fields);
+ if ($result == false) {
return array();
}
@@ -220,52 +225,56 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
$info['expires'] = !($result[0]['useraccountcontrol'][0] & 0x10000); //ADS_UF_DONT_EXPIRE_PASSWD
// additional information
- foreach($this->conf['additional'] as $field) {
- if(isset($result[0][strtolower($field)])) {
+ foreach ($this->conf['additional'] as $field) {
+ if (isset($result[0][strtolower($field)])) {
$info[$field] = $result[0][strtolower($field)][0];
}
}
// handle ActiveDirectory memberOf
- $info['grps'] = $adldap->user()->groups($this->_userName($user),(bool) $this->opts['recursive_groups']);
+ $info['grps'] = $adldap->user()->groups($this->getUserName($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'])) {
+ $domain = $this->getUserDomain($user);
+ if ($domain && !in_array("domain-$domain", (array) $info['grps'])) {
$info['grps'][] = $this->cleanGroup("domain-$domain");
}
// check expiry time
- if($info['expires'] && $this->conf['expirywarn']){
- $expiry = $adldap->user()->passwordExpiry($user);
- if(is_array($expiry)){
- $info['expiresat'] = $expiry['expiryts'];
- $info['expiresin'] = round(($info['expiresat'] - time())/(24*60*60));
-
- // if this is the current user, warn him (once per request only)
- if(($_SERVER['REMOTE_USER'] == $user) &&
- ($info['expiresin'] <= $this->conf['expirywarn']) &&
- !$this->msgshown
- ) {
- $msg = sprintf($this->getLang('authpwdexpire'), $info['expiresin']);
- if($this->canDo('modPass')) {
- $url = wl($ID, array('do'=> 'profile'));
- $msg .= ' <a href="'.$url.'">'.$lang['btn_profile'].'</a>';
+ if ($info['expires'] && $this->conf['expirywarn']) {
+ try {
+ $expiry = $adldap->user()->passwordExpiry($user);
+ if (is_array($expiry)) {
+ $info['expiresat'] = $expiry['expiryts'];
+ $info['expiresin'] = round(($info['expiresat'] - time())/(24*60*60));
+
+ // if this is the current user, warn him (once per request only)
+ if (($_SERVER['REMOTE_USER'] == $user) &&
+ ($info['expiresin'] <= $this->conf['expirywarn']) &&
+ !$this->msgshown
+ ) {
+ $msg = sprintf($this->getLang('authpwdexpire'), $info['expiresin']);
+ if ($this->canDo('modPass')) {
+ $url = wl($ID, array('do'=> 'profile'));
+ $msg .= ' <a href="'.$url.'">'.$lang['btn_profile'].'</a>';
+ }
+ msg($msg);
+ $this->msgshown = true;
}
- msg($msg);
- $this->msgshown = true;
}
+ } catch (adLDAPException $e) {
+ // ignore. should usually not happen
}
}
@@ -281,11 +290,12 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param string $group
* @return string
*/
- public function cleanGroup($group) {
+ public function cleanGroup($group)
+ {
$group = str_replace('\\', '', $group);
$group = str_replace('#', '', $group);
$group = preg_replace('[\s]', '_', $group);
- $group = utf8_strtolower(trim($group));
+ $group = \dokuwiki\Utf8\PhpString::strtolower(trim($group));
return $group;
}
@@ -298,27 +308,28 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param string $user
* @return string
*/
- public function cleanUser($user) {
+ 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;
+ if (!$user) $user = $dom;
+ if ($dom) $domain = $dom;
list($user, $dom) = explode('@', $user, 2);
- if($dom) $domain = $dom;
+ if ($dom) $domain = $dom;
// clean up both
- $domain = utf8_strtolower(trim($domain));
- $user = utf8_strtolower(trim($user));
+ $domain = \dokuwiki\Utf8\PhpString::strtolower(trim($domain));
+ $user = \dokuwiki\Utf8\PhpString::strtolower(trim($user));
- // is this a known, valid domain? if not discard
- if(!is_array($this->conf[$domain])) {
+ // is this a known, valid domain or do we work without account suffix? if not discard
+ if (!is_array($this->conf[$domain]) && $this->conf['account_suffix'] !== '') {
$domain = '';
}
// reattach domain
- if($domain) $user = "$user@$domain";
+ if ($domain) $user = "$user@$domain";
return $user;
}
@@ -327,7 +338,8 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
*
* @return bool
*/
- public function isCaseSensitive() {
+ public function isCaseSensitive()
+ {
return false;
}
@@ -337,11 +349,12 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param array $filter
* @return string
*/
- protected function _constructSearchString($filter){
- if (!$filter){
+ protected function constructSearchString($filter)
+ {
+ if (!$filter) {
return '*';
}
- $adldapUtils = new adLDAPUtils($this->_adldap(null));
+ $adldapUtils = new adLDAPUtils($this->initAdLdap(null));
$result = '*';
if (isset($filter['name'])) {
$result .= ')(displayname=*' . $adldapUtils->ldapSlashes($filter['name']) . '*';
@@ -366,32 +379,41 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param array $filter $filter array of field/pattern pairs, empty array for no filter
* @return int number of users
*/
- public function getUserCount($filter = array()) {
- $adldap = $this->_adldap(null);
- if(!$adldap) {
+ public function getUserCount($filter = array())
+ {
+ $adldap = $this->initAdLdap(null);
+ if (!$adldap) {
dbglog("authad/auth.php getUserCount(): _adldap not set.");
return -1;
}
if ($filter == array()) {
$result = $adldap->user()->all();
} else {
- $searchString = $this->_constructSearchString($filter);
+ $searchString = $this->constructSearchString($filter);
$result = $adldap->user()->all(false, $searchString);
if (isset($filter['grps'])) {
$this->users = array_fill_keys($result, false);
+ /** @var admin_plugin_usermanager $usermanager */
$usermanager = plugin_load("admin", "usermanager", false);
$usermanager->setLastdisabled(true);
- if (!isset($this->_grpsusers[$this->_filterToString($filter)])){
- $this->_fillGroupUserArray($filter,$usermanager->getStart() + 3*$usermanager->getPagesize());
- } elseif (count($this->_grpsusers[$this->_filterToString($filter)]) < $usermanager->getStart() + 3*$usermanager->getPagesize()) {
- $this->_fillGroupUserArray($filter,$usermanager->getStart() + 3*$usermanager->getPagesize() - count($this->_grpsusers[$this->_filterToString($filter)]));
+ if (!isset($this->grpsusers[$this->filterToString($filter)])) {
+ $this->fillGroupUserArray($filter, $usermanager->getStart() + 3*$usermanager->getPagesize());
+ } elseif (count($this->grpsusers[$this->filterToString($filter)]) <
+ $usermanager->getStart() + 3*$usermanager->getPagesize()
+ ) {
+ $this->fillGroupUserArray(
+ $filter,
+ $usermanager->getStart() +
+ 3*$usermanager->getPagesize() -
+ count($this->grpsusers[$this->filterToString($filter)])
+ );
}
- $result = $this->_grpsusers[$this->_filterToString($filter)];
+ $result = $this->grpsusers[$this->filterToString($filter)];
} else {
+ /** @var admin_plugin_usermanager $usermanager */
$usermanager = plugin_load("admin", "usermanager", false);
$usermanager->setLastdisabled(false);
}
-
}
if (!$result) {
@@ -407,7 +429,8 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param array $filter
* @return string
*/
- protected function _filterToString ($filter) {
+ protected function filterToString($filter)
+ {
$result = '';
if (isset($filter['user'])) {
$result .= 'user-' . $filter['user'];
@@ -433,24 +456,30 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param int $numberOfAdds additional number of users requested
* @return int number of Users actually add to Array
*/
- protected function _fillGroupUserArray($filter, $numberOfAdds){
- $this->_grpsusers[$this->_filterToString($filter)];
- $i = 0;
+ protected function fillGroupUserArray($filter, $numberOfAdds)
+ {
+ if (isset($this->grpsusers[$this->filterToString($filter)])) {
+ $actualstart = count($this->grpsusers[$this->filterToString($filter)]);
+ } else {
+ $this->grpsusers[$this->filterToString($filter)] = [];
+ $actualstart = 0;
+ }
+
+ $i=0;
$count = 0;
- $this->_constructPattern($filter);
+ $this->constructPattern($filter);
foreach ($this->users as $user => &$info) {
- if($i++ < $this->_actualstart) {
+ if ($i++ < $actualstart) {
continue;
}
- if($info === false) {
+ if ($info === false) {
$info = $this->getUserData($user);
}
- if($this->_filter($user, $info)) {
- $this->_grpsusers[$this->_filterToString($filter)][$user] = $info;
- if(($numberOfAdds > 0) && (++$count >= $numberOfAdds)) break;
+ if ($this->filter($user, $info)) {
+ $this->grpsusers[$this->filterToString($filter)][$user] = $info;
+ if (($numberOfAdds > 0) && (++$count >= $numberOfAdds)) break;
}
}
- $this->_actualstart = $i;
return $count;
}
@@ -464,50 +493,61 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param array $filter array of field/pattern pairs, null for no filter
* @return array userinfo (refer getUserData for internal userinfo details)
*/
- public function retrieveUsers($start = 0, $limit = 0, $filter = array()) {
- $adldap = $this->_adldap(null);
- if(!$adldap) return false;
+ public function retrieveUsers($start = 0, $limit = 0, $filter = array())
+ {
+ $adldap = $this->initAdLdap(null);
+ if (!$adldap) return array();
- if(!$this->users) {
+ //if (!$this->users) {
//get info for given user
- $result = $adldap->user()->all(false, $this->_constructSearchString($filter));
+ $result = $adldap->user()->all(false, $this->constructSearchString($filter));
if (!$result) return array();
$this->users = array_fill_keys($result, false);
- }
+ //}
$i = 0;
$count = 0;
$result = array();
if (!isset($filter['grps'])) {
+ /** @var admin_plugin_usermanager $usermanager */
$usermanager = plugin_load("admin", "usermanager", false);
$usermanager->setLastdisabled(false);
- $this->_constructPattern($filter);
- foreach($this->users as $user => &$info) {
- if($i++ < $start) {
+ $this->constructPattern($filter);
+ foreach ($this->users as $user => &$info) {
+ if ($i++ < $start) {
continue;
}
- if($info === false) {
+ if ($info === false) {
$info = $this->getUserData($user);
}
$result[$user] = $info;
- if(($limit > 0) && (++$count >= $limit)) break;
+ if (($limit > 0) && (++$count >= $limit)) break;
}
} else {
+ /** @var admin_plugin_usermanager $usermanager */
$usermanager = plugin_load("admin", "usermanager", false);
$usermanager->setLastdisabled(true);
- if (!isset($this->_grpsusers[$this->_filterToString($filter)]) || count($this->_grpsusers[$this->_filterToString($filter)]) < ($start+$limit)) {
- $this->_fillGroupUserArray($filter,$start+$limit - count($this->_grpsusers[$this->_filterToString($filter)]) +1);
+ if (!isset($this->grpsusers[$this->filterToString($filter)]) ||
+ count($this->grpsusers[$this->filterToString($filter)]) < ($start+$limit)
+ ) {
+ if(!isset($this->grpsusers[$this->filterToString($filter)])) {
+ $this->grpsusers[$this->filterToString($filter)] = [];
+ }
+
+ $this->fillGroupUserArray(
+ $filter,
+ $start+$limit - count($this->grpsusers[$this->filterToString($filter)]) +1
+ );
}
- if (!$this->_grpsusers[$this->_filterToString($filter)]) return false;
- foreach($this->_grpsusers[$this->_filterToString($filter)] as $user => &$info) {
- if($i++ < $start) {
+ if (!$this->grpsusers[$this->filterToString($filter)]) return array();
+ foreach ($this->grpsusers[$this->filterToString($filter)] as $user => &$info) {
+ if ($i++ < $start) {
continue;
}
$result[$user] = $info;
- if(($limit > 0) && (++$count >= $limit)) break;
+ if (($limit > 0) && (++$count >= $limit)) break;
}
-
}
return $result;
}
@@ -519,45 +559,46 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param array $changes array of field/value pairs to be changed
* @return bool
*/
- public function modifyUser($user, $changes) {
+ public function modifyUser($user, $changes)
+ {
$return = true;
- $adldap = $this->_adldap($this->_userDomain($user));
- if(!$adldap) {
+ $adldap = $this->initAdLdap($this->getUserDomain($user));
+ if (!$adldap) {
msg($this->getLang('connectfail'), -1);
return false;
}
// password changing
- if(isset($changes['pass'])) {
+ if (isset($changes['pass'])) {
try {
- $return = $adldap->user()->password($this->_userName($user),$changes['pass']);
+ $return = $adldap->user()->password($this->getUserName($user), $changes['pass']);
} catch (adLDAPException $e) {
if ($this->conf['debug']) msg('AD Auth: '.$e->getMessage(), -1);
$return = false;
}
- if(!$return) msg($this->getLang('passchangefail'), -1);
+ if (!$return) msg($this->getLang('passchangefail'), -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);
$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 & $adldap->user()->modify($this->_userName($user),$adchanges);
+ $return = $return & $adldap->user()->modify($this->getUserName($user), $adchanges);
} catch (adLDAPException $e) {
if ($this->conf['debug']) msg('AD Auth: '.$e->getMessage(), -1);
$return = false;
}
- if(!$return) msg($this->getLang('userchangefail'), -1);
+ if (!$return) msg($this->getLang('userchangefail'), -1);
}
return $return;
@@ -573,20 +614,21 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param string|null $domain The AD domain to use
* @return adLDAP|bool true if a connection was established
*/
- protected function _adldap($domain) {
- if(is_null($domain) && is_array($this->opts)) {
+ protected function initAdLdap($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];
+ $this->opts = $this->loadServerConfig((string) $domain);
+ if (isset($this->adldap[$domain])) return $this->adldap[$domain];
// connect
try {
$this->adldap[$domain] = new adLDAP($this->opts);
return $this->adldap[$domain];
- } catch(adLDAPException $e) {
- if($this->conf['debug']) {
+ } catch (Exception $e) {
+ if ($this->conf['debug']) {
msg('AD Auth: '.$e->getMessage(), -1);
}
$this->success = false;
@@ -601,7 +643,8 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param string $user
* @return string
*/
- public function _userDomain($user) {
+ public function getUserDomain($user)
+ {
list(, $domain) = explode('@', $user, 2);
return $domain;
}
@@ -609,12 +652,17 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
/**
* Get the user part from a user
*
+ * When an account suffix is set, we strip the domain part from the user
+ *
* @param string $user
* @return string
*/
- public function _userName($user) {
- list($name) = explode('@', $user, 2);
- return $name;
+ public function getUserName($user)
+ {
+ if ($this->conf['account_suffix'] !== '') {
+ list($user) = explode('@', $user, 2);
+ }
+ return $user;
}
/**
@@ -623,14 +671,15 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param string $domain current AD domain
* @return array
*/
- protected function _loadServerConfig($domain) {
+ protected function loadServerConfig($domain)
+ {
// prepare adLDAP standard configuration
$opts = $this->conf;
$opts['domain'] = $domain;
// add possible domain specific configuration
- if($domain && is_array($this->conf[$domain])) foreach($this->conf[$domain] as $key => $val) {
+ if ($domain && is_array($this->conf[$domain])) foreach ($this->conf[$domain] as $key => $val) {
$opts[$key] = $val;
}
@@ -640,23 +689,27 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
$opts['domain_controllers'] = array_filter($opts['domain_controllers']);
// compatibility with old option name
- if(empty($opts['admin_username']) && !empty($opts['ad_username'])) $opts['admin_username'] = $opts['ad_username'];
- if(empty($opts['admin_password']) && !empty($opts['ad_password'])) $opts['admin_password'] = $opts['ad_password'];
+ if (empty($opts['admin_username']) && !empty($opts['ad_username'])) {
+ $opts['admin_username'] = $opts['ad_username'];
+ }
+ if (empty($opts['admin_password']) && !empty($opts['ad_password'])) {
+ $opts['admin_password'] = $opts['ad_password'];
+ }
$opts['admin_password'] = conf_decodeString($opts['admin_password']); // deobfuscate
// we can change the password if SSL is set
- if($opts['use_ssl'] || $opts['use_tls']) {
+ if ($opts['use_ssl'] || $opts['use_tls']) {
$this->cando['modPass'] = true;
} else {
$this->cando['modPass'] = false;
}
// adLDAP expects empty user/pass as NULL, we're less strict FS#2781
- if(empty($opts['admin_username'])) $opts['admin_username'] = null;
- if(empty($opts['admin_password'])) $opts['admin_password'] = null;
+ if (empty($opts['admin_username'])) $opts['admin_username'] = null;
+ if (empty($opts['admin_password'])) $opts['admin_password'] = null;
// user listing needs admin priviledges
- if(!empty($opts['admin_username']) && !empty($opts['admin_password'])) {
+ if (!empty($opts['admin_username']) && !empty($opts['admin_password'])) {
$this->cando['getUsers'] = true;
} else {
$this->cando['getUsers'] = false;
@@ -672,16 +725,17 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
*
* @return array associative array(key => domain)
*/
- public function _getConfiguredDomains() {
+ public function getConfiguredDomains()
+ {
$domains = array();
- if(empty($this->conf['account_suffix'])) return $domains; // not configured yet
+ if (empty($this->conf['account_suffix'])) return $domains; // not configured yet
// add default domain, using the name from account suffix
$domains[''] = ltrim($this->conf['account_suffix'], '@');
// find additional domains
- foreach($this->conf as $key => $val) {
- if(is_array($val) && isset($val['account_suffix'])) {
+ foreach ($this->conf as $key => $val) {
+ if (is_array($val) && isset($val['account_suffix'])) {
$domains[$key] = ltrim($val['account_suffix'], '@');
}
}
@@ -701,14 +755,15 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
* @param array $info
* @return bool
*/
- 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;
+ protected function filter($user, $info)
+ {
+ foreach ($this->pattern as $item => $pattern) {
+ if ($item == 'user') {
+ if (!preg_match($pattern, $user)) return false;
+ } elseif ($item == 'grps') {
+ if (!count(preg_grep($pattern, $info['grps']))) return false;
} else {
- if(!preg_match($pattern, $info[$item])) return false;
+ if (!preg_match($pattern, $info[$item])) return false;
}
}
return true;
@@ -721,10 +776,11 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin {
*
* @param array $filter
*/
- protected function _constructPattern($filter) {
- $this->_pattern = array();
- foreach($filter as $item => $pattern) {
- $this->_pattern[$item] = '/'.str_replace('/', '\/', $pattern).'/i'; // allow regex characters
+ protected function constructPattern($filter)
+ {
+ $this->pattern = array();
+ foreach ($filter as $item => $pattern) {
+ $this->pattern[$item] = '/'.str_replace('/', '\/', $pattern).'/i'; // allow regex characters
}
}
}
diff --git a/lib/plugins/authad/conf/default.php b/lib/plugins/authad/conf/default.php
index f2834c808..84094ccc5 100644
--- a/lib/plugins/authad/conf/default.php
+++ b/lib/plugins/authad/conf/default.php
@@ -15,3 +15,4 @@ $conf['expirywarn'] = 0;
$conf['additional'] = '';
$conf['update_name'] = 0;
$conf['update_mail'] = 0;
+$conf['recursive_groups'] = 0;
diff --git a/lib/plugins/authad/conf/metadata.php b/lib/plugins/authad/conf/metadata.php
index 6b0fc168b..945474c72 100644
--- a/lib/plugins/authad/conf/metadata.php
+++ b/lib/plugins/authad/conf/metadata.php
@@ -15,3 +15,4 @@ $meta['expirywarn'] = array('numeric', '_min'=>0,'_caution' => 'danger')
$meta['additional'] = array('string','_caution' => 'danger');
$meta['update_name'] = array('onoff','_caution' => 'danger');
$meta['update_mail'] = array('onoff','_caution' => 'danger');
+$meta['recursive_groups'] = array('onoff','_caution' => 'danger');
diff --git a/lib/plugins/authad/lang/ar/lang.php b/lib/plugins/authad/lang/ar/lang.php
index 173c80f0c..6ba640b33 100644
--- a/lib/plugins/authad/lang/ar/lang.php
+++ b/lib/plugins/authad/lang/ar/lang.php
@@ -2,9 +2,12 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
+ * @author Khalid <khalid.aljahil@gmail.com>
* @author Mohamed Belhsine <b.mohamed897@gmail.com>
* @author Usama Akkad <uahello@gmail.com>
*/
$lang['domain'] = 'مجال تسجيل الدخول';
$lang['authpwdexpire'] = 'ستنتهي صلاحية كلمة السر في %d . عليك بتغييرها سريعا.';
+$lang['passchangefail'] = 'فشل تغيير كلمة المرور. قد يكون السبب عدم موافاة شروط كلمة المرور.';
+$lang['connectfail'] = 'فشل الاتصال بخادم Active Directory';
diff --git a/lib/plugins/authad/lang/ar/settings.php b/lib/plugins/authad/lang/ar/settings.php
index d2a2e2a35..78f3acaea 100644
--- a/lib/plugins/authad/lang/ar/settings.php
+++ b/lib/plugins/authad/lang/ar/settings.php
@@ -2,11 +2,14 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
+ * @author Khalid <khalid.aljahil@gmail.com>
* @author alhajr <alhajr300@gmail.com>
*/
$lang['account_suffix'] = 'لاحقة الحساب الخاص بك. على سبيل المثال. <code>@my.domain.org</code>';
$lang['domain_controllers'] = 'قائمة مفصولة بفواصل من وحدات التحكم بالمجال. على سبيل المثال. <code>srv1.domain.org,srv2.domain.org</code>';
$lang['admin_password'] = 'كلمة المرور للمستخدم أعلاه.';
+$lang['sso'] = 'استخدام Kerberos أم NTLM لتسجيل الدخول الموحد؟';
$lang['real_primarygroup'] = 'ينبغي أن تحل المجموعة الأساسية الحقيقية بدلاً من افتراض "Domain Users" (أبطأ).';
+$lang['use_ssl'] = 'استخدام الاتصال المشفر (SSL)؟ في حال استخدامه الرجاء عدم تفعيل (TLS) أسفله.';
$lang['expirywarn'] = 'عدد الأيام المقدمة لتحذير المستخدم حول كلمة مرور منتهية الصلاحية. (0) للتعطيل.';
diff --git a/lib/plugins/authad/lang/bg/lang.php b/lib/plugins/authad/lang/bg/lang.php
index 3de5df65f..816c4955e 100644
--- a/lib/plugins/authad/lang/bg/lang.php
+++ b/lib/plugins/authad/lang/bg/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Kiril <neohidra@gmail.com>
*/
$lang['authpwdexpire'] = 'Срока на паролата ви ще изтече след %d дни. Препоръчително е да я смените по-скоро.';
diff --git a/lib/plugins/authad/lang/bg/settings.php b/lib/plugins/authad/lang/bg/settings.php
index bf7a2d8ce..bcd2968dc 100644
--- a/lib/plugins/authad/lang/bg/settings.php
+++ b/lib/plugins/authad/lang/bg/settings.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Kiril <neohidra@gmail.com>
*/
$lang['account_suffix'] = 'Наставка на акаунта Ви. Например <code>@някакъв.домейн.org</code>';
diff --git a/lib/plugins/authad/lang/ca/settings.php b/lib/plugins/authad/lang/ca/settings.php
index 161f55264..9aa38703b 100644
--- a/lib/plugins/authad/lang/ca/settings.php
+++ b/lib/plugins/authad/lang/ca/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Adolfo Jayme Barrientos <fito@libreoffice.org>
* @author controlonline.net <controlonline.net@gmail.com>
* @author Àngel Pérez Beroy <aperezberoy@gmail.com>
* @author David Surroca <david.tb303@gmail.com>
diff --git a/lib/plugins/authad/lang/cs/settings.php b/lib/plugins/authad/lang/cs/settings.php
index c0e789581..d18d7ea1d 100644
--- a/lib/plugins/authad/lang/cs/settings.php
+++ b/lib/plugins/authad/lang/cs/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Robert Surý <rsurycz@seznam.cz>
* @author mkucera66 <mkucera66@seznam.cz>
* @author Jaroslav Lichtblau <jlichtblau@seznam.cz>
* @author Daniel Slováček <danslo@danslo.cz>
@@ -23,3 +24,4 @@ $lang['expirywarn'] = 'Dny mezi varováním o vypršení hesla uživa
$lang['additional'] = 'Čárkou oddělený seznam dodatečných atributů získávaných z uživatelských dat. Využito některými pluginy.';
$lang['update_name'] = 'Povolit uživatelům upravit jejich AD zobrazované jméno?';
$lang['update_mail'] = 'Povolit uživatelům upravit svou emailovou adresu?';
+$lang['recursive_groups'] = 'Vyřešte vnořené skupiny do jejich příslušných členů (pomalejší).';
diff --git a/lib/plugins/authad/lang/da/lang.php b/lib/plugins/authad/lang/da/lang.php
index 6badbafcc..c6a8778bb 100644
--- a/lib/plugins/authad/lang/da/lang.php
+++ b/lib/plugins/authad/lang/da/lang.php
@@ -7,6 +7,7 @@
* @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['domain'] = 'Logondomæne';
-$lang['authpwdexpire'] = 'Din adgangskode vil udløbe om %d dage, du bør ændre det snart.';
+$lang['authpwdexpire'] = 'Din adgangskode vil udløbe om %d dage, du bør ændre den snart.';
$lang['passchangefail'] = 'Kunne ikke skifte adgangskoden. Måske blev adgangskodepolitikken ikke opfyldt?';
+$lang['userchangefail'] = 'Kunne ikke ændre brugerkontoen. Din konto har muligvis ikke rettigheder til at lave ændringer.';
$lang['connectfail'] = 'Kunne ikke forbinde til Active Directory serveren.';
diff --git a/lib/plugins/authad/lang/da/settings.php b/lib/plugins/authad/lang/da/settings.php
index 8b2d62462..e93f979bf 100644
--- a/lib/plugins/authad/lang/da/settings.php
+++ b/lib/plugins/authad/lang/da/settings.php
@@ -3,21 +3,23 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jacob Palm <jacobpalmdk@icloud.com>
* @author Soren Birk <soer9648@hotmail.com>
* @author Jens Hyllegaard <jens.hyllegaard@gmail.com>
- * @author Jacob Palm <mail@jacobpalm.dk>
*/
$lang['account_suffix'] = 'Dit konto suffiks. F.eks. <code>@mit.domæne.dk</code>';
$lang['base_dn'] = 'Dit grund DN. F.eks. <code>DC=mit,DC=domæne,DC=dk</code>';
$lang['domain_controllers'] = 'En kommasepareret liste over domænecontrollere. F.eks. <code>srv1.domain.org,srv2.domain.org</code>';
$lang['admin_username'] = 'En privilegeret Active Directory bruger med adgang til alle andre brugeres data. Valgfri, men skal bruges til forskellige handlinger såsom at sende abonnement e-mails.';
-$lang['admin_password'] = 'Kodeordet til den ovenstående bruger.';
-$lang['sso'] = 'Bør Single-Sign-On via Kerberos eller NTLM bruges?';
+$lang['admin_password'] = 'Adgangskoden til den ovenstående brugerkonto.';
+$lang['sso'] = 'Skal der benyttes Single-Sign-On via Kerberos eller NTLM?';
+$lang['sso_charset'] = 'Tegnsættet din webserver leverer Kerberos eller NTLM brugernavnet i. Efterlad blank for UTF-8 eller latin-1. Kræver iconv udvidelsen.';
$lang['real_primarygroup'] = 'Bør den korrekte primære gruppe findes i stedet for at antage "Domain Users" (langsommere)';
-$lang['use_ssl'] = 'Benyt SSL forbindelse? hvis ja, vælg ikke TLS herunder.';
-$lang['use_tls'] = 'Benyt TLS forbindelse? hvis ja, vælg ikke SSL herover.';
+$lang['use_ssl'] = 'Benyt SSL forbindelse? Hvis ja, vælg ikke TLS herunder.';
+$lang['use_tls'] = 'Benyt TLS forbindelse? Hvis ja, vælg ikke SSL herover.';
$lang['debug'] = 'Vis yderligere debug output ved fejl?';
-$lang['expirywarn'] = 'Dage før brugere skal advares om udløben adgangskode. 0 for at deaktivere.';
+$lang['expirywarn'] = 'Dage før udløb af adgangskode brugere skal advares. Angiv 0 for at deaktivere notifikation.';
$lang['additional'] = 'En kommasepareret liste over yderligere AD attributter der skal hentes fra brugerdata. Brug af nogen udvidelser.';
$lang['update_name'] = 'Tillad at brugere opdaterer deres visningnavn i AD?';
$lang['update_mail'] = 'Tillad at brugere opdaterer deres e-mail adresse?';
+$lang['recursive_groups'] = 'Opslå nedarvede grupper til deres individuelle medlemmer (langsommere)';
diff --git a/lib/plugins/authad/lang/de/settings.php b/lib/plugins/authad/lang/de/settings.php
index 5708411d2..5d8d9b8de 100644
--- a/lib/plugins/authad/lang/de/settings.php
+++ b/lib/plugins/authad/lang/de/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author C!own77 <clown77@posteo.de>
* @author Frank Loizzi <contact@software.bacal.de>
* @author Matthias Schulte <dokuwiki@lupo49.de>
* @author Ben Fey <benedikt.fey@beck-heun.de>
@@ -24,3 +25,4 @@ $lang['expirywarn'] = 'Tage im Voraus um Benutzer über ablaufende Pa
$lang['additional'] = 'Eine Komma-separierte Liste von zusätzlichen AD-Attributen, die von den Benutzerobjekten abgefragt werden. Wird von einigen Plugins benutzt.';
$lang['update_name'] = 'Benutzern erlauben, ihren AD Anzeige-Namen zu ändern?';
$lang['update_mail'] = 'Benutzern erlauben, ihre E-Mail-Adresse zu ändern?';
+$lang['recursive_groups'] = 'Auflösen verschachtelter Gruppen für ihre jeweiligen Mitglieder (langsamer).';
diff --git a/lib/plugins/authad/lang/el/lang.php b/lib/plugins/authad/lang/el/lang.php
index c6064f05c..2728d0163 100644
--- a/lib/plugins/authad/lang/el/lang.php
+++ b/lib/plugins/authad/lang/el/lang.php
@@ -3,6 +3,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
- * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
+ * @author Katerina Katapodi <extragold1234@hotmail.com>
+ * @author Vasileios Karavasilis <vasileioskaravasilis@gmail.com>
*/
+$lang['domain'] = 'Logon Domain';
$lang['authpwdexpire'] = 'Ο κωδικός πρόσβασης θα λήξει σε %d ημέρες. Προτείνουμε να τον αλλάξετε σύντομα.';
+$lang['passchangefail'] = 'Ο κωδικός πρόσβασης δεν μπόρεσε να αλλάξει. Μήπως δεν ακολουθήθηκαν οι κατάλληλες οδηγίες της πολιτικής κωδικού πρόσβασης?';
+$lang['userchangefail'] = 'Αποτυχία αλλαγής των στοιχείων του χρήστη. Μπορεί ο λογαριασμός σας να μην έχει άδεια να κάνει αλλαγές. ';
+$lang['connectfail'] = 'Δεν μπόρεσε να συνδέσει στον διακομιστή Active Directory (Ενεργή Λίστα διευθύνσεων).';
diff --git a/lib/plugins/authad/lang/el/settings.php b/lib/plugins/authad/lang/el/settings.php
index b7608dff0..381b59307 100644
--- a/lib/plugins/authad/lang/el/settings.php
+++ b/lib/plugins/authad/lang/el/settings.php
@@ -3,6 +3,22 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aikaterini Katapodi <extragold1234@hotmail.com>
* @author chris taklis <ctaklis@gmail.com>
*/
+$lang['account_suffix'] = 'Το πρόσημο του λογαριασμού σας. Π.χ <code>@my.domain.org</code>';
+$lang['base_dn'] = 'Το βασικό σας DN. Eg. <code>DC=my,DC=domain,DC=org</code> ';
+$lang['domain_controllers'] = 'Μία λίστα χωρισμένη με κόμμα, των ελεγκτών του Domain. Π.χ. <code>srv1.domain.org,srv2.domain.org</code> ';
+$lang['admin_username'] = 'Ένας προνομιούχος χρήστης της Ενεργούς Λίστας Διευθύνσεων με πρόσβαση στα δεδομένα άλλων χρηστών. Προαιρετικό, αλλά χρειάζεται για ορισμένες ενέργειες όπως αποστολή ηλεκτρονικών μηνυμάτων εγγραφής. ';
$lang['admin_password'] = 'Ο κωδικός του παραπάνω χρήστη.';
+$lang['sso'] = 'Πρέπει να χρησιμοποιηθεί το Single-Sign-On μέσω Kerberos ή το NTLM ? ';
+$lang['sso_charset'] = 'To \'\'charset\'\' που ο διακομιστής ιστοσελίδας σας θα περάσει το Kerberos ή το όνομα χρήστη NTLM . Είναι άδειο για το UTF-8 η το λατινικό -1. Χρειάζεται την προέκταση inconv. ';
+$lang['real_primarygroup'] = 'Πρέπει να ισχύσει η βασική ομάδα αντί να ληφθεί υπόψη το \'\'Domain Users\'\' (πιο αργό).';
+$lang['use_ssl'] = 'Να γίνει χρήση της σύνδεσης SSL? Αν χρησιμοποιείται μην ενεργοποιείστε το TLS πιο κάτω. ';
+$lang['use_tls'] = 'Να γίνει σύνδεση του TLS?Αν ήδη χρησιμοποιείται, μην ενεργοποιείστε το SSL πιο πάνω. ';
+$lang['debug'] = 'Να προβληθεί το επιπλέον σύστημα ανίχνευσης λαθών ?';
+$lang['expirywarn'] = 'Πρέπει να προειδοποιηθεί ο χρήστης πριν λίγες ημέρες για την λήξη του κωδικού πρόσβασης. 0 για να απενεργοποιείστε.';
+$lang['additional'] = 'Μία λίστα που χωρίζεται με κόμμα, με AD επιπλέον ιδιότητες για να φέρουν στοιχεία από τον χρήστη. Χρησιμοποιείται από κάποια επιπρόσθετα.';
+$lang['update_name'] = 'Να επιτρέπεται στους χρήστες να ενημερώνουν το AD όνομα τους που προβάλλεται?';
+$lang['update_mail'] = 'Να επιτρέπεται στους χρήστες να ενημερώνουν την διεύθυνση ηλεκτρονικού τους ταχυδρομείου?';
+$lang['recursive_groups'] = 'Να γίνεται καταχώρηση των μελών των ομάδων?';
diff --git a/lib/plugins/authad/lang/en/settings.php b/lib/plugins/authad/lang/en/settings.php
index 9e7a7c320..3de9a7260 100644
--- a/lib/plugins/authad/lang/en/settings.php
+++ b/lib/plugins/authad/lang/en/settings.php
@@ -15,3 +15,4 @@ $lang['expirywarn'] = 'Days in advance to warn user about expiring passw
$lang['additional'] = 'A comma separated list of additional AD attributes to fetch from user data. Used by some plugins.';
$lang['update_name'] = 'Allow users to update their AD display name?';
$lang['update_mail'] = 'Allow users to update their email address?';
+$lang['recursive_groups'] = 'Resolve nested groups to their respective members (slower).';
diff --git a/lib/plugins/authad/lang/eo/lang.php b/lib/plugins/authad/lang/eo/lang.php
index 94580c6cf..2beab5f2e 100644
--- a/lib/plugins/authad/lang/eo/lang.php
+++ b/lib/plugins/authad/lang/eo/lang.php
@@ -3,7 +3,9 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Florian <florianmail55@gmail.com>
* @author Robert Bogenschneider <bogi@uea.org>
*/
$lang['domain'] = 'Ensaluta domajno';
$lang['authpwdexpire'] = 'Via pasvorto malvalidos post %d tagoj, prefere ŝanĝu ĝin baldaũ.';
+$lang['connectfail'] = 'Malsukcesis konekti al Aktivan Dosierumon servilo.';
diff --git a/lib/plugins/authad/lang/eo/settings.php b/lib/plugins/authad/lang/eo/settings.php
index cf9cad0c2..09b594c51 100644
--- a/lib/plugins/authad/lang/eo/settings.php
+++ b/lib/plugins/authad/lang/eo/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Florian <florianmail55@gmail.com>
* @author Robert Bogenschneider <bogi@uea.org>
*/
$lang['account_suffix'] = 'Via konto-aldonaĵo, ekz. <code>@mia.domajno.lando</code>';
@@ -18,3 +19,4 @@ $lang['use_tls'] = 'Ĉu uzi TLS-konekton? Se jes, ne aktivigu SSL
$lang['debug'] = 'Ĉu montri aldonajn informojn dum eraroj?';
$lang['expirywarn'] = 'Tagoj da antaŭaverto pri malvalidiĝonta pasvorto. 0 por malebligi.';
$lang['additional'] = 'Komodisigita listo de aldonaj AD-atributoj por preni el uzantaj datumoj. Uzita de iuj kromaĵoj.';
+$lang['update_mail'] = 'Ĉu permesi uzantoj ĝisdatigi siajn retardesojn?';
diff --git a/lib/plugins/authad/lang/es/settings.php b/lib/plugins/authad/lang/es/settings.php
index 789222236..c329c8e7f 100644
--- a/lib/plugins/authad/lang/es/settings.php
+++ b/lib/plugins/authad/lang/es/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Liliana <lilianasaidon@gmail.com>
* @author monica <may.dorado@gmail.com>
* @author Antonio Bueno <atnbueno@gmail.com>
* @author Juan De La Cruz <juann.dlc@gmail.com>
@@ -24,3 +25,4 @@ $lang['expirywarn'] = 'Días por adelantado para avisar al usuario de
$lang['additional'] = 'Una lista separada por comas de atributos AD adicionales a obtener de los datos de usuario. Usado por algunos plugins.';
$lang['update_name'] = '¿Permitir a los usuarios actualizar su nombre de AD?';
$lang['update_mail'] = '¿Permitir a los usuarios actualizar su email?';
+$lang['recursive_groups'] = 'Restituir los grupos anidados a sus respectivos miembros (más lento)';
diff --git a/lib/plugins/authad/lang/fi/lang.php b/lib/plugins/authad/lang/fi/lang.php
index 88a87b87c..776e68a86 100644
--- a/lib/plugins/authad/lang/fi/lang.php
+++ b/lib/plugins/authad/lang/fi/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Jussi Takala <jussi.takala@live.fi>
*/
$lang['authpwdexpire'] = 'Salasanasi vanhenee %d pv:n päästä, vaihda salasanasi pikaisesti.';
diff --git a/lib/plugins/authad/lang/fi/settings.php b/lib/plugins/authad/lang/fi/settings.php
index e2f432f36..f0b5276e7 100644
--- a/lib/plugins/authad/lang/fi/settings.php
+++ b/lib/plugins/authad/lang/fi/settings.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Otto Vainio <otto@valjakko.net>
*/
$lang['debug'] = 'Näytä lisää debug-koodia virheistä?';
diff --git a/lib/plugins/authad/lang/fr/settings.php b/lib/plugins/authad/lang/fr/settings.php
index f747c08ae..f0717c7a8 100644
--- a/lib/plugins/authad/lang/fr/settings.php
+++ b/lib/plugins/authad/lang/fr/settings.php
@@ -3,16 +3,16 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Schplurtz le Déboulonné <schplurtz@laposte.net>
* @author Bruno Veilleux <bruno.vey@gmail.com>
* @author Momo50 <c.brothelande@gmail.com>
- * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
*/
$lang['account_suffix'] = 'Le suffixe de votre compte. Ex.: <code>@mon.domaine.org</code>';
$lang['base_dn'] = 'Votre nom de domaine de base. <code>DC=mon,DC=domaine,DC=org</code>';
$lang['domain_controllers'] = 'Une liste de contrôleurs de domaine séparés par des virgules. Ex.: <code>srv1.domaine.org,srv2.domaine.org</code>';
$lang['admin_username'] = 'Un utilisateur Active Directory avec accès aux données de tous les autres utilisateurs. Facultatif, mais nécessaire pour certaines actions telles que l\'envoi de courriels d\'abonnement.';
$lang['admin_password'] = 'Le mot de passe de l\'utilisateur ci-dessus.';
-$lang['sso'] = 'Est-ce que la connexion unique (Single-Sign-On) par Kerberos ou NTLM doit être utilisée?';
+$lang['sso'] = 'Est-ce que l\'authentification unique (Single-Sign-On) par Kerberos ou NTLM doit être utilisée?';
$lang['sso_charset'] = 'Le jeu de caractères de votre serveur web va passer le nom d\'utilisateur Kerberos ou NTLM. Vide pour UTF-8 ou latin-1. Nécessite l\'extension iconv.';
$lang['real_primarygroup'] = 'Est-ce que le véritable groupe principal doit être résolu au lieu de présumer "Domain Users" (plus lent)?';
$lang['use_ssl'] = 'Utiliser une connexion SSL? Si utilisée, n\'activez pas TLS ci-dessous.';
@@ -22,3 +22,4 @@ $lang['expirywarn'] = 'Jours d\'avance pour l\'avertissement envoyé
$lang['additional'] = 'Une liste séparée par des virgules d\'attributs AD supplémentaires à récupérer dans les données utilisateur. Utilisée par certains modules.';
$lang['update_name'] = 'Autoriser les utilisateurs à modifier leur nom affiché de l\'AD ?';
$lang['update_mail'] = 'Autoriser les utilisateurs à modifier leur adresse de courriel ?';
+$lang['recursive_groups'] = 'Résoudre les groupes imbriqués à leur membres respectifs (plus lent).';
diff --git a/lib/plugins/authad/lang/it/settings.php b/lib/plugins/authad/lang/it/settings.php
index 9fd82352a..8d641720b 100644
--- a/lib/plugins/authad/lang/it/settings.php
+++ b/lib/plugins/authad/lang/it/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Roberto Bellingeri <bellingeri@netguru.it>
* @author Edmondo Di Tucci <snarchio@gmail.com>
* @author Torpedo <dgtorpedo@gmail.com>
*/
@@ -21,3 +22,4 @@ $lang['expirywarn'] = 'Giorni di preavviso per la scadenza della pass
$lang['additional'] = 'Valori separati da virgola di attributi AD addizionali da caricare dai dati utente. Usato da alcuni plugin.';
$lang['update_name'] = 'Permettere agli utenti di aggiornare il loro nome AD visualizzato? ';
$lang['update_mail'] = 'Permettere agli utenti di aggiornare il loro indirizzo e-mail?';
+$lang['recursive_groups'] = 'Risolvi i gruppi nidificati ai rispettivi membri (più lento).';
diff --git a/lib/plugins/authad/lang/ja/settings.php b/lib/plugins/authad/lang/ja/settings.php
index 0dc56494a..84f09b469 100644
--- a/lib/plugins/authad/lang/ja/settings.php
+++ b/lib/plugins/authad/lang/ja/settings.php
@@ -3,22 +3,24 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
* @author Satoshi Sahara <sahara.satoshi@gmail.com>
* @author Hideaki SAWADA <chuno@live.jp>
* @author PzF_X <jp_minecraft@yahoo.co.jp>
*/
-$lang['account_suffix'] = 'アカウントの接尾語。例:<code>@my.domain.org</code>';
-$lang['base_dn'] = 'ベースDN。例:<code>DC=my,DC=domain,DC=org</code>';
-$lang['domain_controllers'] = 'ドメインコントローラのカンマ区切り一覧。例:<code>srv1.domain.org,srv2.domain.org</code>';
-$lang['admin_username'] = '全ユーザーデータへのアクセス権のある特権Active Directoryユーザー。任意ですが、メール通知の登録等の特定の動作に必要。';
+$lang['account_suffix'] = 'アカウントの接尾語(例:<code>@my.domain.org</code>)';
+$lang['base_dn'] = 'ベースDN(例:<code>DC=my,DC=domain,DC=org</code>)';
+$lang['domain_controllers'] = 'ドメインコントローラのカンマ区切り一覧(例:<code>srv1.domain.org,srv2.domain.org</code>)';
+$lang['admin_username'] = '全ユーザーデータへのアクセス権のある特権Active Directoryユーザー(任意ですが、メール通知の登録等の特定の動作に必要となります。)';
$lang['admin_password'] = '上記ユーザーのパスワード';
$lang['sso'] = 'Kerberos か NTLM を使ったシングルサインオン(SSO)をしますか?';
$lang['sso_charset'] = 'サーバーは空のUTF-8かLatin-1でKerberosかNTLMユーザネームを送信します。iconv拡張モジュールが必要です。';
$lang['real_primarygroup'] = '"Domain Users" を仮定する代わりに本当のプライマリグループを解決する(低速)';
-$lang['use_ssl'] = 'SSL接続を使用しますか?使用した場合、下のSSLを有効にしないでください。';
-$lang['use_tls'] = 'TLS接続を使用しますか?使用した場合、上のSSLを有効にしないでください。';
-$lang['debug'] = 'エラー時に追加のデバッグ出力を表示する?';
-$lang['expirywarn'] = '何日前からパスワードの有効期限をユーザーに警告する。0 の場合は無効';
-$lang['additional'] = 'ユーザデータから取得する追加AD属性のカンマ区切り一覧。いくつかのプラグインが使用する。';
-$lang['update_name'] = 'ユーザー自身にAD表示名の変更を許可しますか?';
-$lang['update_mail'] = 'ユーザー自身にメールアドレスの変更を許可しますか?';
+$lang['use_ssl'] = 'SSL接続を使用する(使用する場合、下のTLSを有効にしないでください。)';
+$lang['use_tls'] = 'TLS接続を使用する(使用する場合、上のSSLを有効にしないでください。)';
+$lang['debug'] = 'エラー時に追加のデバッグ出力を表示する';
+$lang['expirywarn'] = '何日前からパスワードの有効期限をユーザーに警告するか(0 の場合は無効)';
+$lang['additional'] = 'ユーザデータから取得する追加AD属性のカンマ区切り一覧(一部プラグインが使用します。)';
+$lang['update_name'] = 'ユーザー自身にAD表示名の変更を許可する';
+$lang['update_mail'] = 'ユーザー自身にメールアドレスの変更を許可する';
+$lang['recursive_groups'] = 'それぞれのメンバーについて入れ子のグループを解決する(動作が遅くなります)';
diff --git a/lib/plugins/authad/lang/nl/settings.php b/lib/plugins/authad/lang/nl/settings.php
index c0be12e79..b8b58a1bb 100644
--- a/lib/plugins/authad/lang/nl/settings.php
+++ b/lib/plugins/authad/lang/nl/settings.php
@@ -3,8 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
- * @author Remon <no@email.local>
* @author Gerrit Uitslag <klapinklapin@gmail.com>
+ * @author Remon <no@email.local>
* @author Sjoerd <sjoerd@sjomar.eu>
*/
$lang['account_suffix'] = 'Je account domeinnaam. Bijv <code>@mijn.domein.org</code>';
@@ -22,3 +22,4 @@ $lang['expirywarn'] = 'Waarschuwingstermijn voor vervallen wachtwoord
$lang['additional'] = 'Een kommagescheiden lijst van extra AD attributen van de gebruiker. Wordt gebruikt door sommige plugins.';
$lang['update_name'] = 'Sta gebruikers toe om hun getoonde AD naam bij te werken';
$lang['update_mail'] = 'Sta gebruikers toe hun email adres bij te werken';
+$lang['recursive_groups'] = 'Zoek voor de geneste groepen hun respectievelijke leden op (langzamer).';
diff --git a/lib/plugins/authad/lang/pl/settings.php b/lib/plugins/authad/lang/pl/settings.php
index d5af79c33..6e9814e8e 100644
--- a/lib/plugins/authad/lang/pl/settings.php
+++ b/lib/plugins/authad/lang/pl/settings.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Bartek S <sadupl@gmail.com>
+ * @author Przemek <p_kudriawcew@o2.pl>
* @author Wojciech Lichota <wojciech@lichota.pl>
* @author Max <maxrb146@gmail.com>
* @author Tomasz Bosak <bosak.tomasz@gmail.com>
@@ -27,3 +29,4 @@ $lang['expirywarn'] = 'Dni poprzedzających powiadomienie użytkownik
$lang['additional'] = 'Oddzielona przecinkami lista dodatkowych atrybutów AD do pobrania z danych użytkownika. Używane przez niektóre wtyczki.';
$lang['update_name'] = 'Zezwól użytkownikom na uaktualnianie nazwy wyświetlanej w AD?';
$lang['update_mail'] = 'Zezwól użytkownikom na uaktualnianie ich adresu email?';
+$lang['recursive_groups'] = 'Rozpatrz grupy zagnieżdżone dla odpowiednich członków (wolniej).';
diff --git a/lib/plugins/authad/lang/pt-br/settings.php b/lib/plugins/authad/lang/pt-br/settings.php
index 1231077da..d606682aa 100644
--- a/lib/plugins/authad/lang/pt-br/settings.php
+++ b/lib/plugins/authad/lang/pt-br/settings.php
@@ -3,8 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Frederico Gonçalves Guimarães <frederico@teia.bio.br>
* @author Victor Westmann <victor.westmann@gmail.com>
- * @author Frederico Guimarães <frederico@teia.bio.br>
* @author Juliano Marconi Lanigra <juliano.marconi@gmail.com>
* @author Viliam Dias <viliamjr@gmail.com>
*/
@@ -23,3 +23,4 @@ $lang['expirywarn'] = 'Dias com antecedência para avisar o usuário
$lang['additional'] = 'Uma lista separada de vírgulas de atributos adicionais AD para pegar dados de usuários. Usados por alguns plugins.';
$lang['update_name'] = 'Permitir aos usuários que atualizem seus nomes de exibição AD?';
$lang['update_mail'] = 'Permitir aos usuários que atualizem seu endereço de e-mail?';
+$lang['recursive_groups'] = 'Resolver grupos aninhados para seus respectivos membros (mais lento).';
diff --git a/lib/plugins/authad/lang/pt/lang.php b/lib/plugins/authad/lang/pt/lang.php
index 4f8266b5b..5d4a9a350 100644
--- a/lib/plugins/authad/lang/pt/lang.php
+++ b/lib/plugins/authad/lang/pt/lang.php
@@ -3,11 +3,14 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
+ * @author Maykon Oliveira <maykonoliveira850@gmail.com>
* @author Paulo Silva <paulotsilva@yahoo.com>
* @author André Neves <drakferion@gmail.com>
* @author Paulo Carmino <contato@paulocarmino.com>
*/
-$lang['domain'] = 'Domínio de Início de Sessão';
-$lang['authpwdexpire'] = 'A sua senha expirará dentro de %d dias, deve mudá-la em breve.';
+$lang['domain'] = 'Domínio de Login';
+$lang['authpwdexpire'] = 'A sua senha expira dentro de %d dias, deve mudá-la em breve.';
$lang['passchangefail'] = 'Falha ao alterar a senha. Tente prosseguir com uma senha mais segura.';
+$lang['userchangefail'] = 'Não foi possível alterar os atributos do usuário. Talvez sua conta não tenha permissões para fazer alterações?';
$lang['connectfail'] = 'Falha ao conectar com o servidor Active Directory.';
diff --git a/lib/plugins/authad/lang/pt/settings.php b/lib/plugins/authad/lang/pt/settings.php
index b734c4800..4409fe14f 100644
--- a/lib/plugins/authad/lang/pt/settings.php
+++ b/lib/plugins/authad/lang/pt/settings.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
+ * @author Maykon Oliveira <maykonoliveira850@gmail.com>
* @author André Neves <drakferion@gmail.com>
* @author Murilo <muriloricci@hotmail.com>
* @author Paulo Silva <paulotsilva@yahoo.com>
@@ -12,14 +14,16 @@
$lang['account_suffix'] = 'O sufixo da sua conta. Por exemplo, <code>@my.domain.org</code>';
$lang['base_dn'] = 'Sua base DN. Eg. <code> DC=meu, DC=dominio, DC=org </code>';
$lang['domain_controllers'] = 'Uma lista separada por vírgulas de Controladores de Domínio (AD DC). Ex.: <code>srv1.domain.org,srv2.domain.org</code>';
-$lang['admin_username'] = 'Um utilizador com privilégios na Active Directory que tenha acesso aos dados de todos os outros utilizadores. Opcional, mas necessário para certas ações como enviar emails de subscrição.';
-$lang['admin_password'] = 'A senha para o utilizador acima.';
+$lang['admin_username'] = 'Um usuário com privilégios no Active Directory que tenha acesso aos dados de todos os outros usuários. Opcional, mas necessário para certas ações como enviar e-mails de subscrição.';
+$lang['admin_password'] = 'A senha para o usuário acima.';
$lang['sso'] = 'Deve ser usado o Single-Sign-On via Kerberos ou NTLM?';
$lang['sso_charset'] = 'O charset do seu servidor web vai passar o nome de usuário Kerberos ou NTLM vazio para UTF-8 ou latin-1. Requer a extensão iconv.';
-$lang['real_primarygroup'] = 'Deveria ser resolvido, de fato, o grupo primário ao invés de assumir "Usuários de Domínio" (mais lento).';
-$lang['use_ssl'] = 'Usar ligação SSL? Se usada, não ative TLS abaixo.';
-$lang['use_tls'] = 'Usar ligação TLS? Se usada, não ative SSL abaixo.';
+$lang['real_primarygroup'] = 'O grupo primário deveria ser resolvido ao invés de assumir "Usuários de Domínio" (mais lento).';
+$lang['use_ssl'] = 'Usar conexão SSL? Se usada, não ative a TLS abaixo.';
+$lang['use_tls'] = 'Usar conexão TLS? Se usada, não ative SSL abaixo.';
$lang['debug'] = 'Deve-se mostrar saída adicional de depuração de erros?';
$lang['expirywarn'] = 'Número de dias de avanço para avisar o utilizador da expiração da senha. 0 para desativar.';
$lang['additional'] = 'Uma lista separada por vírgula de atributos adicionais de AD para buscar a partir de dados do usuário. Usado por alguns plugins.';
+$lang['update_name'] = 'Permitir que os usuários atualizem seu nome de exibição do AD?';
$lang['update_mail'] = 'Permitir que usuários atualizem seus endereços de e-mail?';
+$lang['recursive_groups'] = 'Resolve grupos aninhados para seus respectivos membros (mais lento).';
diff --git a/lib/plugins/authad/lang/ro/settings.php b/lib/plugins/authad/lang/ro/settings.php
new file mode 100644
index 000000000..2a2541aac
--- /dev/null
+++ b/lib/plugins/authad/lang/ro/settings.php
@@ -0,0 +1,8 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Victor <kvp@live.com>
+ */
+$lang['admin_password'] = 'Parola utilizatorului de mai sus.';
diff --git a/lib/plugins/authad/lang/ru/settings.php b/lib/plugins/authad/lang/ru/settings.php
index d6bc8fc8a..81b3296bd 100644
--- a/lib/plugins/authad/lang/ru/settings.php
+++ b/lib/plugins/authad/lang/ru/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Alexander Kh. <001.arx@gmail.com>
* @author Yuriy Skalko <yuriy.skalko@gmail.com>
* @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua)
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
@@ -28,3 +29,4 @@ $lang['expirywarn'] = 'За сколько дней нужно пре
$lang['additional'] = 'Дополнительные AD-атрибуты, разделённые запятой, для выборки из данных пользователя. Используется некоторыми плагинами.';
$lang['update_name'] = 'Разрешить пользователям редактировать свое AD-имя?';
$lang['update_mail'] = 'Разрешить пользователям редактировать свой электронный адрес?';
+$lang['recursive_groups'] = 'Разрешить вложенные группы их соответствующим членам.';
diff --git a/lib/plugins/authad/lang/sr/settings.php b/lib/plugins/authad/lang/sr/settings.php
index 5e4409cc3..41e3fa48c 100644
--- a/lib/plugins/authad/lang/sr/settings.php
+++ b/lib/plugins/authad/lang/sr/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Milan Oparnica <milan.opa@gmail.com>
* @author Марко М. Костић <marko.m.kostic@gmail.com>
*/
$lang['account_suffix'] = 'Суфикс на вашем налогу. Нпр.: <code>@moj.domen.rs</code>';
@@ -11,9 +12,13 @@ $lang['domain_controllers'] = 'Списак доменских контрол
$lang['admin_username'] = 'Повлашћени Active Directory корисник са приступом подацима свих корисника. Изборно али је потребно за одређене радње као што је слање мејлова о претплаћивању.';
$lang['admin_password'] = 'Лозинка за корисника изнад.';
$lang['sso'] = 'Да ли треба да се користи Single-Sign-On преко Кербероса или NTLM-а?';
+$lang['sso_charset'] = 'Znakovni kod u kom će vaš webserver proslediti Kerberos ili NTLM serveru vaše ime. Ostavite prazno za UTF-8 ili latin-1. Zahteva iconv ekstenziju.';
+$lang['real_primarygroup'] = 'Da li treba razrešiti pravu primarnu grupu ili pretpostaviti grupu "Domain Users" (sporije)';
$lang['use_ssl'] = 'Користити SSL везу? Ако се користи, не омогућујте TLS испод.';
$lang['use_tls'] = 'Користити TLS везу? Ако се користи, не омогућујте SSL испод.';
$lang['debug'] = 'Приказати додатан излаз за поправљање грешака код настанка грешака?';
$lang['expirywarn'] = 'Дана унапред за које треба упозорити корисника на истицање лозинке. 0 за искључивање.';
+$lang['additional'] = 'Spisak dodatni AD atributa, razdvojen zarezima, koje treba preuzeti iz korisničkih podataka. Koristi se u nekim dodacima (plugin).';
$lang['update_name'] = 'Дозволити корисницима да ажурирају њихово AD приказно име?';
$lang['update_mail'] = 'Дозволити корисницима да ажурирају њихове мејл адрсе?';
+$lang['recursive_groups'] = 'Razrešenje ugnježdenih grupa do nivoa pripadajućih članova (sporije)';
diff --git a/lib/plugins/authad/lang/tr/lang.php b/lib/plugins/authad/lang/tr/lang.php
index 2336e0f0c..2ab16cb8c 100644
--- a/lib/plugins/authad/lang/tr/lang.php
+++ b/lib/plugins/authad/lang/tr/lang.php
@@ -2,7 +2,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author farukerdemoncel@gmail.com
+ *
+ * @author mahir <mahirtakak@gmail.com>
+ * @author farukerdemoncel <farukerdemoncel@gmail.com>
*/
+$lang['domain'] = 'Oturum alanadı';
$lang['authpwdexpire'] = 'Şifreniz %d gün sonra geçersiz hale gelecek, yakın bir zamanda değiştirmelisiniz.';
+$lang['passchangefail'] = 'Şifre değiştirilemedi. Şifre gereklilikleri yerine getirilmemiş olabilir mi?';
+$lang['connectfail'] = 'Active Directory sunucusuna bağlanılamadı';
diff --git a/lib/plugins/authad/lang/tr/settings.php b/lib/plugins/authad/lang/tr/settings.php
new file mode 100644
index 000000000..8dfc4622b
--- /dev/null
+++ b/lib/plugins/authad/lang/tr/settings.php
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Hakan <hakandursun2009@gmail.com>
+ * @author mahir <mahirtakak@gmail.com>
+ */
+$lang['admin_password'] = 'Yukarıdaki kullanıcının şifresi.';
+$lang['debug'] = 'Hatalarda ek hata ayıklama çıktısı gösterilsin mi?';
+$lang['update_name'] = 'Kullanıcıların AD görünen adlarını güncellemelerine izin verilsin mi?';
+$lang['update_mail'] = 'Kullanıcıların e-posta adresini güncellemelerine izin verilsin mi?';
diff --git a/lib/plugins/authad/lang/uk/settings.php b/lib/plugins/authad/lang/uk/settings.php
index 0c76e7d9d..1e0bd3d52 100644
--- a/lib/plugins/authad/lang/uk/settings.php
+++ b/lib/plugins/authad/lang/uk/settings.php
@@ -3,12 +3,14 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author velmyshanovnyi <velmyshanovnyi@gmail.com>
* @author Oleksii <alexey.furashev@gmail.com>
* @author Nina Zolotova <nina-z@i.ua>
*/
$lang['account_suffix'] = 'Суфікс вашого облікового запису. Щось на шквалт: <code>@my.domain.org</code>';
$lang['base_dn'] = 'Ваш DN. Щось на шквалт: <code>DC=my,DC=domain,DC=org</code>';
$lang['admin_password'] = 'Пароль вказаного користувача.';
+$lang['sso'] = 'Чи потрібно використовувати Single-Sign-On через Kerberos чи NTLM?';
$lang['use_ssl'] = 'Використовуєте SSL-з\'єднання? Якщо так, не вмикайте TLS нижче.';
$lang['use_tls'] = 'Використовуєте TLS-з\'єднання? Якщо так, не вмикайте SSL нижче.';
$lang['debug'] = 'Показати додаткові відомості щодо помилок?';
diff --git a/lib/plugins/authad/lang/vi/lang.php b/lib/plugins/authad/lang/vi/lang.php
new file mode 100644
index 000000000..36aa21219
--- /dev/null
+++ b/lib/plugins/authad/lang/vi/lang.php
@@ -0,0 +1,12 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['domain'] = 'Đăng nhập tên miền';
+$lang['authpwdexpire'] = 'Mật khẩu của bạn sẽ hết hạn sau %d ngày, bạn nên thay đổi sớm.';
+$lang['passchangefail'] = 'Không thể thay đổi mật khẩu. Có lẽ chính sách mật khẩu chưa được đáp ứng?';
+$lang['userchangefail'] = 'Không thể thay đổi thuộc tính thành viên. Có lẽ tài khoản của bạn không có quyền thực hiện thay đổi?';
+$lang['connectfail'] = 'Không thể kết nối với máy chủ Active Directory.';
diff --git a/lib/plugins/authad/lang/vi/settings.php b/lib/plugins/authad/lang/vi/settings.php
new file mode 100644
index 000000000..d0dc73dc1
--- /dev/null
+++ b/lib/plugins/authad/lang/vi/settings.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['account_suffix'] = 'Hậu tố tài khoản của bạn. VD. <code>@my.domain.org</code>';
+$lang['base_dn'] = 'DN cơ sở của bạn. VD. <code>DC=my,DC=domain,DC=org</code>';
+$lang['domain_controllers'] = 'Một danh sách các bộ điều khiển miền được phân tách bằng dấu phẩy. VD. <code>srv1.domain.org,srv2.domain.org</code>';
+$lang['admin_username'] = 'Thành viên Active Directory đặc quyền có quyền truy cập vào tất cả dữ liệu của người dùng khác. Tùy chọn, nhưng cần thiết cho một số hành động nhất định như gửi thư đăng ký.';
+$lang['admin_password'] = 'Mật khẩu của thành viên trên.';
+$lang['sso'] = 'Nên đăng nhập một lần qua Kerberos hoặc NTLM?';
+$lang['sso_charset'] = 'Bộ ký tự máy chủ web của bạn sẽ chuyển tên người dùng Kerberos hoặc NTLM. Để trống cho UTF-8 hoặc latin-1. Yêu cầu phần mở rộng iconv.';
+$lang['real_primarygroup'] = 'Nếu nhóm chính thực sự được giải quyết thay vì giả sử "Tên miền thành viên" (chậm hơn).';
+$lang['use_ssl'] = 'Sử dụng kết nối SSL? Nếu được sử dụng, không kích hoạt TLS bên dưới.';
+$lang['use_tls'] = 'Sử dụng kết nối TLS? Nếu được sử dụng, không kích hoạt SSL ở trên.';
+$lang['debug'] = 'Hiển thị đầu ra gỡ lỗi bổ sung về lỗi?';
+$lang['expirywarn'] = 'Báo trước ngày để cảnh báo thành viên về việc hết hạn mật khẩu. 0 để vô hiệu hóa.';
+$lang['additional'] = 'Một danh sách được phân tách bằng dấu phẩy của các thuộc tính AD bổ sung để tìm nạp dữ liệu thành viên. Được sử dụng bởi một số plugin.';
+$lang['update_name'] = 'Cho phép thành viên cập nhật tên hiển thị AD?';
+$lang['update_mail'] = 'Cho phép thành viên cập nhật địa chỉ thư điện tử?';
+$lang['recursive_groups'] = 'Giải quyết các nhóm lồng nhau cho các thành viên tương ứng (chậm hơn).';
diff --git a/lib/plugins/authad/lang/zh/settings.php b/lib/plugins/authad/lang/zh/settings.php
index 1ccadd318..7a0d39b64 100644
--- a/lib/plugins/authad/lang/zh/settings.php
+++ b/lib/plugins/authad/lang/zh/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HaoNan <haonan@zhuoming.info>
* @author lainme <lainme993@gmail.com>
* @author oott123 <ip.192.168.1.1@qq.com>
* @author JellyChen <451453325@qq.com>
@@ -23,3 +24,4 @@ $lang['expirywarn'] = '提前多少天警告用户密码即将到期
$lang['additional'] = '需要从用户数据中获取的额外 AD 属性的列表,以逗号分隔。用于某些插件。';
$lang['update_name'] = '允许用户更新其AD显示名称?';
$lang['update_mail'] = '是否允许用户更新他们的电子邮件地址?';
+$lang['recursive_groups'] = '将嵌套组拆分为各自的成员(较慢)';
diff --git a/lib/plugins/authldap/auth.php b/lib/plugins/authldap/auth.php
index 52f9ba50d..68d1dad60 100644
--- a/lib/plugins/authldap/auth.php
+++ b/lib/plugins/authldap/auth.php
@@ -1,6 +1,4 @@
<?php
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
/**
* LDAP authentication backend
@@ -10,8 +8,9 @@ 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 {
- /* @var resource $con holds the LDAP connection*/
+class auth_plugin_authldap extends DokuWiki_Auth_Plugin
+{
+ /* @var resource $con holds the LDAP connection */
protected $con = null;
/* @var int $bound What type of connection does already exist? */
@@ -20,18 +19,19 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
/* @var array $users User data cache */
protected $users = null;
- /* @var array $_pattern User filter pattern */
- protected $_pattern = null;
+ /* @var array $pattern User filter pattern */
+ protected $pattern = null;
/**
* Constructor
*/
- public function __construct() {
+ public function __construct()
+ {
parent::__construct();
// ldap extension is needed
- if(!function_exists('ldap_connect')) {
- $this->_debug("LDAP err: PHP LDAP extension not found.", -1, __LINE__, __FILE__);
+ if (!function_exists('ldap_connect')) {
+ $this->debug("LDAP err: PHP LDAP extension not found.", -1, __LINE__, __FILE__);
$this->success = false;
return;
}
@@ -47,73 +47,72 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
* plaintext password is correct by trying to bind
* to the LDAP server
*
- * @author Andreas Gohr <andi@splitbrain.org>
* @param string $user
* @param string $pass
* @return bool
+ * @author Andreas Gohr <andi@splitbrain.org>
*/
- public function checkPass($user, $pass) {
+ public function checkPass($user, $pass)
+ {
// reject empty password
- if(empty($pass)) return false;
- if(!$this->_openLDAP()) return false;
+ if (empty($pass)) return false;
+ if (!$this->openLDAP()) return false;
// indirect user bind
- if($this->getConf('binddn') && $this->getConf('bindpw')) {
+ if ($this->getConf('binddn') && $this->getConf('bindpw')) {
// use superuser credentials
- if(!@ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')))) {
- $this->_debug('LDAP bind as superuser: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ if (!@ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')))) {
+ $this->debug('LDAP bind as superuser: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
return false;
}
$this->bound = 2;
- } else if($this->getConf('binddn') &&
+ } elseif ($this->getConf('binddn') &&
$this->getConf('usertree') &&
$this->getConf('userfilter')
) {
// special bind string
- $dn = $this->_makeFilter(
+ $dn = $this->makeFilter(
$this->getConf('binddn'),
- array('user'=> $user, 'server'=> $this->getConf('server'))
+ array('user' => $user, 'server' => $this->getConf('server'))
);
-
- } else if(strpos($this->getConf('usertree'), '%{user}')) {
+ } elseif (strpos($this->getConf('usertree'), '%{user}')) {
// direct user bind
- $dn = $this->_makeFilter(
+ $dn = $this->makeFilter(
$this->getConf('usertree'),
- array('user'=> $user, 'server'=> $this->getConf('server'))
+ array('user' => $user, 'server' => $this->getConf('server'))
);
-
} else {
// Anonymous bind
- if(!@ldap_bind($this->con)) {
+ if (!@ldap_bind($this->con)) {
msg("LDAP: can not bind anonymously", -1);
- $this->_debug('LDAP anonymous bind: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ $this->debug('LDAP anonymous bind: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
return false;
}
}
// Try to bind to with the dn if we have one.
- if(!empty($dn)) {
+ if (!empty($dn)) {
// User/Password bind
- if(!@ldap_bind($this->con, $dn, $pass)) {
- $this->_debug("LDAP: bind with $dn failed", -1, __LINE__, __FILE__);
- $this->_debug('LDAP user dn bind: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ if (!@ldap_bind($this->con, $dn, $pass)) {
+ $this->debug("LDAP: bind with $dn failed", -1, __LINE__, __FILE__);
+ $this->debug('LDAP user dn bind: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
return false;
}
$this->bound = 1;
return true;
} else {
// See if we can find the user
- $info = $this->_getUserData($user, true);
- if(empty($info['dn'])) {
+ $info = $this->fetchUserData($user, true);
+ if (empty($info['dn'])) {
return false;
} else {
$dn = $info['dn'];
}
// Try to bind with the dn provided
- if(!@ldap_bind($this->con, $dn, $pass)) {
- $this->_debug("LDAP: bind with $dn failed", -1, __LINE__, __FILE__);
- $this->_debug('LDAP user bind: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ if (!@ldap_bind($this->con, $dn, $pass)) {
+ $this->debug("LDAP: bind with $dn failed", -1, __LINE__, __FILE__);
+ $this->debug('LDAP user bind: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
return false;
}
$this->bound = 1;
@@ -138,113 +137,119 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
* uid string Posix User ID
* inbind bool for internal use - avoid loop in binding
*
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Trouble
- * @author Dan Allen <dan.j.allen@gmail.com>
+ * @param string $user
+ * @param bool $requireGroups (optional) - ignored, groups are always supplied by this plugin
+ * @return array containing user data or false
* @author <evaldas.auryla@pheur.org>
* @author Stephane Chazelas <stephane.chazelas@emerson.com>
* @author Steffen Schoch <schoch@dsb.net>
*
- * @param string $user
- * @param bool $requireGroups (optional) - ignored, groups are always supplied by this plugin
- * @return array containing user data or false
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Trouble
+ * @author Dan Allen <dan.j.allen@gmail.com>
*/
- public function getUserData($user, $requireGroups=true) {
- return $this->_getUserData($user);
+ public function getUserData($user, $requireGroups = true)
+ {
+ return $this->fetchUserData($user);
}
/**
- * @param string $user
- * @param bool $inbind authldap specific, true if in bind phase
+ * @param string $user
+ * @param bool $inbind authldap specific, true if in bind phase
* @return array containing user data or false
*/
- protected function _getUserData($user, $inbind = false) {
+ protected function fetchUserData($user, $inbind = false)
+ {
global $conf;
- if(!$this->_openLDAP()) return false;
+ if (!$this->openLDAP()) return array();
// force superuser bind if wanted and not bound as superuser yet
- if($this->getConf('binddn') && $this->getConf('bindpw') && $this->bound < 2) {
+ if ($this->getConf('binddn') && $this->getConf('bindpw') && $this->bound < 2) {
// use superuser credentials
- if(!@ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')))) {
- $this->_debug('LDAP bind as superuser: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
- return false;
+ if (!@ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')))) {
+ $this->debug('LDAP bind as superuser: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ return array();
}
$this->bound = 2;
- } elseif($this->bound == 0 && !$inbind) {
+ } elseif ($this->bound == 0 && !$inbind) {
// in some cases getUserData is called outside the authentication workflow
// eg. for sending email notification on subscribed pages. This data might not
// be accessible anonymously, so we try to rebind the current user here
list($loginuser, $loginsticky, $loginpass) = auth_getCookie();
- if($loginuser && $loginpass) {
+ if ($loginuser && $loginpass) {
$loginpass = auth_decrypt($loginpass, auth_cookiesalt(!$loginsticky, true));
$this->checkPass($loginuser, $loginpass);
}
}
$info = array();
- $info['user'] = $user;
- $this->_debug('LDAP user to find: '.htmlspecialchars($info['user']), 0, __LINE__, __FILE__);
+ $info['user'] = $user;
+ $this->debug('LDAP user to find: ' . hsc($info['user']), 0, __LINE__, __FILE__);
$info['server'] = $this->getConf('server');
- $this->_debug('LDAP Server: '.htmlspecialchars($info['server']), 0, __LINE__, __FILE__);
-
+ $this->debug('LDAP Server: ' . hsc($info['server']), 0, __LINE__, __FILE__);
//get info for given user
- $base = $this->_makeFilter($this->getConf('usertree'), $info);
- if($this->getConf('userfilter')) {
- $filter = $this->_makeFilter($this->getConf('userfilter'), $info);
+ $base = $this->makeFilter($this->getConf('usertree'), $info);
+ if ($this->getConf('userfilter')) {
+ $filter = $this->makeFilter($this->getConf('userfilter'), $info);
} else {
$filter = "(ObjectClass=*)";
}
- $this->_debug('LDAP Filter: '.htmlspecialchars($filter), 0, __LINE__, __FILE__);
+ $this->debug('LDAP Filter: ' . hsc($filter), 0, __LINE__, __FILE__);
+
+ $this->debug('LDAP user search: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ $this->debug('LDAP search at: ' . hsc($base . ' ' . $filter), 0, __LINE__, __FILE__);
+ $sr = $this->ldapSearch($this->con, $base, $filter, $this->getConf('userscope'), $this->getConf('attributes'));
- $this->_debug('LDAP user search: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
- $this->_debug('LDAP search at: '.htmlspecialchars($base.' '.$filter), 0, __LINE__, __FILE__);
- $sr = $this->_ldapsearch($this->con, $base, $filter, $this->getConf('userscope'));
- $result = @ldap_get_entries($this->con, $sr);
+ $result = @ldap_get_entries($this->con, $sr);
// if result is not an array
- if(!is_array($result)) {
- // no objects found
- $this->_debug('LDAP search returned non-array result: '.htmlspecialchars(print($result)), -1, __LINE__, __FILE__);
- return false;
+ if (!is_array($result)) {
+ // no objects found
+ $this->debug('LDAP search returned non-array result: ' . hsc(print($result)), -1, __LINE__, __FILE__);
+ return array();
}
- // Don't accept more or less than one response
- if ($result['count'] != 1) {
- $this->_debug('LDAP search returned '.htmlspecialchars($result['count']).' results while it should return 1!', -1, __LINE__, __FILE__);
- //for($i = 0; $i < $result["count"]; $i++) {
- //$this->_debug('result: '.htmlspecialchars(print_r($result[$i])), 0, __LINE__, __FILE__);
- //}
- return false;
- }
-
+ // Don't accept more or less than one response
+ if ($result['count'] != 1) {
+ $this->debug(
+ 'LDAP search returned ' . hsc($result['count']) . ' results while it should return 1!',
+ -1,
+ __LINE__,
+ __FILE__
+ );
+ //for($i = 0; $i < $result["count"]; $i++) {
+ //$this->_debug('result: '.hsc(print_r($result[$i])), 0, __LINE__, __FILE__);
+ //}
+ return array();
+ }
- $this->_debug('LDAP search found single result !', 0, __LINE__, __FILE__);
+ $this->debug('LDAP search found single result !', 0, __LINE__, __FILE__);
$user_result = $result[0];
ldap_free_result($sr);
// general user info
- $info['dn'] = $user_result['dn'];
- $info['gid'] = $user_result['gidnumber'][0];
+ $info['dn'] = $user_result['dn'];
+ $info['gid'] = $user_result['gidnumber'][0];
$info['mail'] = $user_result['mail'][0];
$info['name'] = $user_result['cn'][0];
$info['grps'] = array();
// overwrite if other attribs are specified.
- if(is_array($this->getConf('mapping'))) {
- foreach($this->getConf('mapping') as $localkey => $key) {
- if(is_array($key)) {
+ if (is_array($this->getConf('mapping'))) {
+ foreach ($this->getConf('mapping') as $localkey => $key) {
+ if (is_array($key)) {
// use regexp to clean up user_result
// $key = array($key=>$regexp), only handles the first key-value
$regexp = current($key);
$key = key($key);
- if($user_result[$key]) foreach($user_result[$key] as $grpkey => $grp) {
- if($grpkey !== 'count' && preg_match($regexp, $grp, $match)) {
- if($localkey == 'grps') {
+ if ($user_result[$key]) foreach ($user_result[$key] as $grpkey => $grp) {
+ if ($grpkey !== 'count' && preg_match($regexp, $grp, $match)) {
+ if ($localkey == 'grps') {
$info[$localkey][] = $match[1];
} else {
$info[$localkey] = $match[1];
@@ -259,38 +264,44 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
$user_result = array_merge($info, $user_result);
//get groups for given user if grouptree is given
- if($this->getConf('grouptree') || $this->getConf('groupfilter')) {
- $base = $this->_makeFilter($this->getConf('grouptree'), $user_result);
- $filter = $this->_makeFilter($this->getConf('groupfilter'), $user_result);
- $sr = $this->_ldapsearch($this->con, $base, $filter, $this->getConf('groupscope'), array($this->getConf('groupkey')));
- $this->_debug('LDAP group search: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
- $this->_debug('LDAP search at: '.htmlspecialchars($base.' '.$filter), 0, __LINE__, __FILE__);
-
- if(!$sr) {
+ if ($this->getConf('grouptree') || $this->getConf('groupfilter')) {
+ $base = $this->makeFilter($this->getConf('grouptree'), $user_result);
+ $filter = $this->makeFilter($this->getConf('groupfilter'), $user_result);
+ $sr = $this->ldapSearch(
+ $this->con,
+ $base,
+ $filter,
+ $this->getConf('groupscope'),
+ array($this->getConf('groupkey'))
+ );
+ $this->debug('LDAP group search: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ $this->debug('LDAP search at: ' . hsc($base . ' ' . $filter), 0, __LINE__, __FILE__);
+
+ if (!$sr) {
msg("LDAP: Reading group memberships failed", -1);
- return false;
+ return array();
}
$result = ldap_get_entries($this->con, $sr);
ldap_free_result($sr);
- if(is_array($result)) foreach($result as $grp) {
- if(!empty($grp[$this->getConf('groupkey')])) {
+ if (is_array($result)) foreach ($result as $grp) {
+ if (!empty($grp[$this->getConf('groupkey')])) {
$group = $grp[$this->getConf('groupkey')];
- if(is_array($group)){
+ if (is_array($group)) {
$group = $group[0];
} else {
- $this->_debug('groupkey did not return a detailled result', 0, __LINE__, __FILE__);
+ $this->debug('groupkey did not return a detailled result', 0, __LINE__, __FILE__);
}
- if($group === '') continue;
+ if ($group === '') continue;
- $this->_debug('LDAP usergroup: '.htmlspecialchars($group), 0, __LINE__, __FILE__);
+ $this->debug('LDAP usergroup: ' . hsc($group), 0, __LINE__, __FILE__);
$info['grps'][] = $group;
}
}
}
// always add the default group to the list of groups
- if(!$info['grps'] or !in_array($conf['defaultgroup'], $info['grps'])) {
+ if (!$info['grps'] or !in_array($conf['defaultgroup'], $info['grps'])) {
$info['grps'][] = $conf['defaultgroup'];
}
return $info;
@@ -299,57 +310,66 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
/**
* Definition of the function modifyUser in order to modify the password
*
- * @param string $user nick of the user to be changed
- * @param array $changes array of field/value pairs to be changed (password will be clear text)
+ * @param string $user nick of the user to be changed
+ * @param array $changes array of field/value pairs to be changed (password will be clear text)
* @return bool true on success, false on error
*/
-
- function modifyUser($user,$changes){
+ public function modifyUser($user, $changes)
+ {
// open the connection to the ldap
- if(!$this->_openLDAP()){
- $this->_debug('LDAP cannot connect: '. htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ if (!$this->openLDAP()) {
+ $this->debug('LDAP cannot connect: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
return false;
}
// find the information about the user, in particular the "dn"
- $info = $this->getUserData($user,true);
- if(empty($info['dn'])) {
- $this->_debug('LDAP cannot find your user dn', 0, __LINE__, __FILE__);
+ $info = $this->getUserData($user, true);
+ if (empty($info['dn'])) {
+ $this->debug('LDAP cannot find your user dn', 0, __LINE__, __FILE__);
return false;
}
$dn = $info['dn'];
// find the old password of the user
- list($loginuser,$loginsticky,$loginpass) = auth_getCookie();
+ list($loginuser, $loginsticky, $loginpass) = auth_getCookie();
if ($loginuser !== null) { // the user is currently logged in
$secret = auth_cookiesalt(!$loginsticky, true);
- $pass = auth_decrypt($loginpass, $secret);
+ $pass = auth_decrypt($loginpass, $secret);
// bind with the ldap
- if(!@ldap_bind($this->con, $dn, $pass)){
- $this->_debug('LDAP user bind failed: '. htmlspecialchars($dn) .': '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ if (!@ldap_bind($this->con, $dn, $pass)) {
+ $this->debug(
+ 'LDAP user bind failed: ' . hsc($dn) . ': ' . hsc(ldap_error($this->con)),
+ 0,
+ __LINE__,
+ __FILE__
+ );
return false;
}
} elseif ($this->getConf('binddn') && $this->getConf('bindpw')) {
// we are changing the password on behalf of the user (eg: forgotten password)
// bind with the superuser ldap
- if (!@ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')))){
- $this->_debug('LDAP bind as superuser: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ if (!@ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')))) {
+ $this->debug('LDAP bind as superuser: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
return false;
}
- }
- else {
+ } else {
return false; // no otherway
}
// Generate the salted hashed password for LDAP
- $phash = new PassHash();
+ $phash = new \dokuwiki\PassHash();
$hash = $phash->hash_ssha($changes['pass']);
// change the password
- if(!@ldap_mod_replace($this->con, $dn,array('userpassword' => $hash))){
- $this->_debug('LDAP mod replace failed: '. htmlspecialchars($dn) .': '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ if (!@ldap_mod_replace($this->con, $dn, array('userpassword' => $hash))) {
+ $this->debug(
+ 'LDAP mod replace failed: ' . hsc($dn) . ': ' . hsc(ldap_error($this->con)),
+ 0,
+ __LINE__,
+ __FILE__
+ );
return false;
}
@@ -361,56 +381,58 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
*
* @return bool
*/
- public function isCaseSensitive() {
+ public function isCaseSensitive()
+ {
return false;
}
/**
* Bulk retrieval of user data
*
- * @author Dominik Eckelmann <dokuwiki@cosmocode.de>
- * @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
+ * @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 of userinfo (refer getUserData for internal userinfo details)
+ * @author Dominik Eckelmann <dokuwiki@cosmocode.de>
*/
- function retrieveUsers($start = 0, $limit = 0, $filter = array()) {
- if(!$this->_openLDAP()) return false;
+ public function retrieveUsers($start = 0, $limit = 0, $filter = array())
+ {
+ if (!$this->openLDAP()) return array();
- if(is_null($this->users)) {
+ if (is_null($this->users)) {
// Perform the search and grab all their details
- if($this->getConf('userfilter')) {
+ if ($this->getConf('userfilter')) {
$all_filter = str_replace('%{user}', '*', $this->getConf('userfilter'));
} else {
$all_filter = "(ObjectClass=*)";
}
- $sr = ldap_search($this->con, $this->getConf('usertree'), $all_filter);
- $entries = ldap_get_entries($this->con, $sr);
+ $sr = ldap_search($this->con, $this->getConf('usertree'), $all_filter);
+ $entries = ldap_get_entries($this->con, $sr);
$users_array = array();
- $userkey = $this->getConf('userkey');
- for($i = 0; $i < $entries["count"]; $i++) {
+ $userkey = $this->getConf('userkey');
+ for ($i = 0; $i < $entries["count"]; $i++) {
array_push($users_array, $entries[$i][$userkey][0]);
}
asort($users_array);
$result = $users_array;
- if(!$result) return array();
+ if (!$result) return array();
$this->users = array_fill_keys($result, false);
}
- $i = 0;
+ $i = 0;
$count = 0;
- $this->_constructPattern($filter);
+ $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;
@@ -422,23 +444,24 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
* Used by auth_getUserData to make the filter
* strings for grouptree and groupfilter
*
- * @author Troels Liebe Bentsen <tlb@rapanden.dk>
- * @param string $filter ldap search filter with placeholders
- * @param array $placeholders placeholders to fill in
+ * @param string $filter ldap search filter with placeholders
+ * @param array $placeholders placeholders to fill in
* @return string
+ * @author Troels Liebe Bentsen <tlb@rapanden.dk>
*/
- protected function _makeFilter($filter, $placeholders) {
+ protected function makeFilter($filter, $placeholders)
+ {
preg_match_all("/%{([^}]+)/", $filter, $matches, PREG_PATTERN_ORDER);
//replace each match
- foreach($matches[1] as $match) {
+ foreach ($matches[1] as $match) {
//take first element if array
- if(is_array($placeholders[$match])) {
+ if (is_array($placeholders[$match])) {
$value = $placeholders[$match][0];
} else {
$value = $placeholders[$match];
}
- $value = $this->_filterEscape($value);
- $filter = str_replace('%{'.$match.'}', $value, $filter);
+ $value = $this->filterEscape($value);
+ $filter = str_replace('%{' . $match . '}', $value, $filter);
}
return $filter;
}
@@ -446,20 +469,21 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
/**
* return true if $user + $info match $filter criteria, false otherwise
*
+ * @param string $user the user's login name
+ * @param array $info the user's userinfo array
+ * @return bool
* @author Chris Smith <chris@jalakai.co.uk>
*
- * @param string $user the user's login name
- * @param array $info the user's userinfo array
- * @return bool
*/
- 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;
+ protected function filter($user, $info)
+ {
+ foreach ($this->pattern as $item => $pattern) {
+ if ($item == 'user') {
+ if (!preg_match($pattern, $user)) return false;
+ } elseif ($item == 'grps') {
+ if (!count(preg_grep($pattern, $info['grps']))) return false;
} else {
- if(!preg_match($pattern, $info[$item])) return false;
+ if (!preg_match($pattern, $info[$item])) return false;
}
}
return true;
@@ -468,15 +492,16 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
/**
* Set the filter pattern
*
- * @author Chris Smith <chris@jalakai.co.uk>
- *
* @param $filter
* @return void
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
*/
- protected function _constructPattern($filter) {
- $this->_pattern = array();
- foreach($filter as $item => $pattern) {
- $this->_pattern[$item] = '/'.str_replace('/', '\/', $pattern).'/i'; // allow regex characters
+ protected function constructPattern($filter)
+ {
+ $this->pattern = array();
+ foreach ($filter as $item => $pattern) {
+ $this->pattern[$item] = '/' . str_replace('/', '\/', $pattern) . '/i'; // allow regex characters
}
}
@@ -485,16 +510,17 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
*
* Ported from Perl's Net::LDAP::Util escape_filter_value
*
- * @author Andreas Gohr
- * @param string $string
+ * @param string $string
* @return string
+ * @author Andreas Gohr
*/
- protected function _filterEscape($string) {
+ protected function filterEscape($string)
+ {
// see https://github.com/adldap/adLDAP/issues/22
return preg_replace_callback(
'/([\x00-\x1F\*\(\)\\\\])/',
function ($matches) {
- return "\\".join("", unpack("H2", $matches[1]));
+ return "\\" . join("", unpack("H2", $matches[1]));
},
$string
);
@@ -506,22 +532,23 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- protected function _openLDAP() {
- if($this->con) return true; // connection already established
+ protected function openLDAP()
+ {
+ if ($this->con) return true; // connection already established
- if($this->getConf('debug')) {
- ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
+ if ($this->getConf('debug')) {
+ ldap_set_option(null, LDAP_OPT_DEBUG_LEVEL, 7);
}
$this->bound = 0;
- $port = $this->getConf('port');
- $bound = false;
+ $port = $this->getConf('port');
+ $bound = false;
$servers = explode(',', $this->getConf('server'));
- foreach($servers as $server) {
- $server = trim($server);
+ foreach ($servers as $server) {
+ $server = trim($server);
$this->con = @ldap_connect($server, $port);
- if(!$this->con) {
+ if (!$this->con) {
continue;
}
@@ -534,62 +561,64 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
*/
//set protocol version and dependend options
- if($this->getConf('version')) {
- if(!@ldap_set_option(
- $this->con, LDAP_OPT_PROTOCOL_VERSION,
+ if ($this->getConf('version')) {
+ if (!@ldap_set_option(
+ $this->con,
+ LDAP_OPT_PROTOCOL_VERSION,
$this->getConf('version')
)
) {
- msg('Setting LDAP Protocol version '.$this->getConf('version').' failed', -1);
- $this->_debug('LDAP version set: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ msg('Setting LDAP Protocol version ' . $this->getConf('version') . ' failed', -1);
+ $this->debug('LDAP version set: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
} else {
//use TLS (needs version 3)
- if($this->getConf('starttls')) {
- if(!@ldap_start_tls($this->con)) {
+ if ($this->getConf('starttls')) {
+ if (!@ldap_start_tls($this->con)) {
msg('Starting TLS failed', -1);
- $this->_debug('LDAP TLS set: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ $this->debug('LDAP TLS set: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
}
}
// needs version 3
- if($this->getConf('referrals') > -1) {
- if(!@ldap_set_option(
- $this->con, LDAP_OPT_REFERRALS,
+ if ($this->getConf('referrals') > -1) {
+ if (!@ldap_set_option(
+ $this->con,
+ LDAP_OPT_REFERRALS,
$this->getConf('referrals')
)
) {
msg('Setting LDAP referrals failed', -1);
- $this->_debug('LDAP referal set: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ $this->debug('LDAP referal set: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
}
}
}
}
//set deref mode
- if($this->getConf('deref')) {
- if(!@ldap_set_option($this->con, LDAP_OPT_DEREF, $this->getConf('deref'))) {
- msg('Setting LDAP Deref mode '.$this->getConf('deref').' failed', -1);
- $this->_debug('LDAP deref set: '.htmlspecialchars(ldap_error($this->con)), 0, __LINE__, __FILE__);
+ if ($this->getConf('deref')) {
+ if (!@ldap_set_option($this->con, LDAP_OPT_DEREF, $this->getConf('deref'))) {
+ msg('Setting LDAP Deref mode ' . $this->getConf('deref') . ' failed', -1);
+ $this->debug('LDAP deref set: ' . hsc(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')) {
+ if (defined('LDAP_OPT_NETWORK_TIMEOUT')) {
ldap_set_option($this->con, LDAP_OPT_NETWORK_TIMEOUT, 1);
}
- if($this->getConf('binddn') && $this->getConf('bindpw')) {
+ if ($this->getConf('binddn') && $this->getConf('bindpw')) {
$bound = @ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')));
$this->bound = 2;
} else {
$bound = @ldap_bind($this->con);
}
- if($bound) {
+ if ($bound) {
break;
}
}
- if(!$bound) {
+ if (!$bound) {
msg("LDAP: couldn't connect to LDAP server", -1);
- $this->_debug(ldap_error($this->con), 0, __LINE__, __FILE__);
+ $this->debug(ldap_error($this->con), 0, __LINE__, __FILE__);
return false;
}
@@ -600,34 +629,54 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
/**
* Wraps around ldap_search, ldap_list or ldap_read depending on $scope
*
- * @author Andreas Gohr <andi@splitbrain.org>
- * @param resource $link_identifier
- * @param string $base_dn
- * @param string $filter
- * @param string $scope can be 'base', 'one' or 'sub'
+ * @param resource $link_identifier
+ * @param string $base_dn
+ * @param string $filter
+ * @param string $scope can be 'base', 'one' or 'sub'
* @param null|array $attributes
- * @param int $attrsonly
- * @param int $sizelimit
+ * @param int $attrsonly
+ * @param int $sizelimit
* @return resource
+ * @author Andreas Gohr <andi@splitbrain.org>
*/
- protected function _ldapsearch($link_identifier, $base_dn, $filter, $scope = 'sub', $attributes = null,
- $attrsonly = 0, $sizelimit = 0) {
- if(is_null($attributes)) $attributes = array();
-
- if($scope == 'base') {
+ protected function ldapSearch(
+ $link_identifier,
+ $base_dn,
+ $filter,
+ $scope = 'sub',
+ $attributes = null,
+ $attrsonly = 0,
+ $sizelimit = 0
+ )
+ {
+ if (is_null($attributes)) $attributes = array();
+
+ if ($scope == 'base') {
return @ldap_read(
- $link_identifier, $base_dn, $filter, $attributes,
- $attrsonly, $sizelimit
+ $link_identifier,
+ $base_dn,
+ $filter,
+ $attributes,
+ $attrsonly,
+ $sizelimit
);
- } elseif($scope == 'one') {
+ } elseif ($scope == 'one') {
return @ldap_list(
- $link_identifier, $base_dn, $filter, $attributes,
- $attrsonly, $sizelimit
+ $link_identifier,
+ $base_dn,
+ $filter,
+ $attributes,
+ $attrsonly,
+ $sizelimit
);
} else {
return @ldap_search(
- $link_identifier, $base_dn, $filter, $attributes,
- $attrsonly, $sizelimit
+ $link_identifier,
+ $base_dn,
+ $filter,
+ $attributes,
+ $attrsonly,
+ $sizelimit
);
}
}
@@ -636,14 +685,14 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin {
* Wrapper around msg() but outputs only when debug is enabled
*
* @param string $message
- * @param int $err
- * @param int $line
+ * @param int $err
+ * @param int $line
* @param string $file
* @return void
*/
- protected function _debug($message, $err, $line, $file) {
- if(!$this->getConf('debug')) return;
+ protected function debug($message, $err, $line, $file)
+ {
+ if (!$this->getConf('debug')) return;
msg($message, $err, $line, $file);
}
-
}
diff --git a/lib/plugins/authldap/conf/default.php b/lib/plugins/authldap/conf/default.php
index 116cb9d3f..52fa1e64f 100644
--- a/lib/plugins/authldap/conf/default.php
+++ b/lib/plugins/authldap/conf/default.php
@@ -20,3 +20,4 @@ $conf['userkey'] = 'uid';
$conf['groupkey'] = 'cn';
$conf['debug'] = 0;
$conf['modPass'] = 1;
+$conf['attributes'] = array();
diff --git a/lib/plugins/authldap/conf/metadata.php b/lib/plugins/authldap/conf/metadata.php
index f32aed191..3a58590a8 100644
--- a/lib/plugins/authldap/conf/metadata.php
+++ b/lib/plugins/authldap/conf/metadata.php
@@ -11,6 +11,7 @@ $meta['referrals'] = array('multichoice','_choices' => array(-1,0,1),'_caution
$meta['deref'] = array('multichoice','_choices' => array(0,1,2,3),'_caution' => 'danger');
$meta['binddn'] = array('string','_caution' => 'danger');
$meta['bindpw'] = array('password','_caution' => 'danger','_code'=>'base64');
+$meta['attributes'] = array('array');
//$meta['mapping']['name'] unsupported in config manager
//$meta['mapping']['grps'] unsupported in config manager
$meta['userscope'] = array('multichoice','_choices' => array('sub','one','base'),'_caution' => 'danger');
diff --git a/lib/plugins/authldap/lang/ar/settings.php b/lib/plugins/authldap/lang/ar/settings.php
index aaef7763f..d1be7872b 100644
--- a/lib/plugins/authldap/lang/ar/settings.php
+++ b/lib/plugins/authldap/lang/ar/settings.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author alhajr <alhajr300@gmail.com>
*/
$lang['port'] = 'LDAP المنفذ الملقم إذا لم يعط أي عنوان URL كامل أعلاه';
diff --git a/lib/plugins/authldap/lang/bg/settings.php b/lib/plugins/authldap/lang/bg/settings.php
index 165216de8..f301d1c31 100644
--- a/lib/plugins/authldap/lang/bg/settings.php
+++ b/lib/plugins/authldap/lang/bg/settings.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Kiril <neohidra@gmail.com>
*/
$lang['server'] = 'Вашият LDAP сървър. Име на хоста (<code>localhost</code>) или целият URL адрес (<code>ldap://сървър.tld:389</code>)';
diff --git a/lib/plugins/authldap/lang/ca/settings.php b/lib/plugins/authldap/lang/ca/settings.php
index 2f73833ad..08c036b38 100644
--- a/lib/plugins/authldap/lang/ca/settings.php
+++ b/lib/plugins/authldap/lang/ca/settings.php
@@ -3,8 +3,13 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Adolfo Jayme Barrientos <fito@libreoffice.org>
* @author Àngel Pérez Beroy <aperezberoy@gmail.com>
* @author David Surroca <david.tb303@gmail.com>
+ * @author Aniol Marti <amarti@caliu.cat>
*/
$lang['starttls'] = 'Utilitzar connexions TLS?';
$lang['bindpw'] = 'Contrasenya de l\'usuari referit abans.';
+$lang['attributes'] = 'Atributs a demanar a la consulta LDAP.';
+$lang['modPass'] = 'Es pot canviar la contrasenya del LDAP mitjançant el Dokuwiki?';
+$lang['debug'] = 'Mostra informació addicional de depuració als errors.';
diff --git a/lib/plugins/authldap/lang/cs/settings.php b/lib/plugins/authldap/lang/cs/settings.php
index 741a56a62..1bdaf29ba 100644
--- a/lib/plugins/authldap/lang/cs/settings.php
+++ b/lib/plugins/authldap/lang/cs/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Petr Kajzar <petr.kajzar@lf1.cuni.cz>
* @author mkucera66 <mkucera66@seznam.cz>
* @author Jaroslav Lichtblau <jlichtblau@seznam.cz>
* @author Martin Růžička <martinr@post.cz>
@@ -19,6 +20,7 @@ $lang['referrals'] = 'Přeposílat odkazy?';
$lang['deref'] = 'Jak rozlišovat aliasy?';
$lang['binddn'] = 'Doménový název DN volitelně připojeného uživatele, pokus anonymní připojení není vyhovující, tj. <code>cn=admin, dc=muj, dc=domov</code>';
$lang['bindpw'] = 'Heslo uživatele výše';
+$lang['attributes'] = 'Atributy k načtení pomocí vyhledávání LDAP.';
$lang['userscope'] = 'Omezení rozsahu vyhledávání uživatele';
$lang['groupscope'] = 'Omezení rozsahu vyhledávání skupiny';
$lang['userkey'] = 'Atribut označující uživatelské jméno; musí být konzistetní s uživatelským filtrem.';
diff --git a/lib/plugins/authldap/lang/da/settings.php b/lib/plugins/authldap/lang/da/settings.php
index 7a1384db6..f831a8f13 100644
--- a/lib/plugins/authldap/lang/da/settings.php
+++ b/lib/plugins/authldap/lang/da/settings.php
@@ -3,27 +3,34 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jacob Palm <jacobpalmdk@icloud.com>
* @author Jon Theil Nielsen <jontheil@gmail.com>
* @author Jens Hyllegaard <jens.hyllegaard@gmail.com>
* @author soer9648 <soer9648@eucl.dk>
- * @author Jacob Palm <mail@jacobpalm.dk>
*/
$lang['server'] = 'Din LDAP server. Enten værtsnavn (<code>localhost</code>) eller fuld kvalificeret URL (<code>ldap://server.tld:389</code>)';
$lang['port'] = 'LDAP server port, hvis der ikke er angivet en komplet URL ovenfor.';
-$lang['usertree'] = 'Hvor findes brugerkonti. F.eks. <code>ou=Personer, dc=server, dc=tld</code>';
-$lang['grouptree'] = 'Hvor findes brugergrupper. F.eks. <code>ou=Grupper, dc=server, dc=tld</code>';
+$lang['usertree'] = 'Sti til brugerkonti. F.eks. <code>ou=Personer, dc=server, dc=tld</code>';
+$lang['grouptree'] = 'Sti til brugergrupper. F.eks. <code>ou=Grupper, dc=server, dc=tld</code>';
$lang['userfilter'] = 'LDAP filter der benyttes til at søge efter brugerkonti. F.eks. <code>(&amp;(uid=%{user})(objectClass=posixAccount))</code>';
$lang['groupfilter'] = 'LDAP filter tder benyttes til at søge efter grupper. F.eks. <code>(&amp;(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code>';
-$lang['version'] = 'Protokol version der skal benyttes. Det er muligvis nødvendigt at sætte denne til <code>3</code>';
+$lang['version'] = 'Protokol-version der skal benyttes. Det er muligvis nødvendigt at sætte denne til <code>3</code>';
$lang['starttls'] = 'Benyt TLS forbindelser?';
-$lang['binddn'] = 'DN af en valgfri <bindings-bruger, hvis ikke anonym binding er tilstrækkeligt. Fx <code>cn=admin,dc=my,dc=home</code>';
-$lang['bindpw'] = 'Kodeord til ovenstående bruger';
+$lang['referrals'] = 'Tillad henvisninger?';
+$lang['deref'] = 'Hvordan skal opslag renses for henvisninger?';
+$lang['binddn'] = 'DN af en valgfri bindings-bruger, hvis ikke anonym binding er tilstrækkeligt. Fx <code>cn=admin,dc=my,dc=home</code>';
+$lang['bindpw'] = 'Adgangskode til ovenstående bruger';
+$lang['attributes'] = 'Attributter der skal hentes med LDAP søgning.';
$lang['userscope'] = 'Begræns søgekriterier for brugersøgning';
$lang['groupscope'] = 'Begræns søgekriterier for gruppesøgning';
$lang['userkey'] = 'Attribut der betegner brugernavnet; skal være i overensstemmelse med brugerfilteret.';
$lang['groupkey'] = 'Gruppemedlemskab fra hvilken som helst brugerattribut (i stedet for standard AD-grupper), fx gruppe fra afdeling eller telefonnummer';
$lang['modPass'] = 'Kan LDAP adgangskoden skiftes via DokuWiki?';
$lang['debug'] = 'Vis yderligere debug output ved fejl';
+$lang['deref_o_0'] = 'LDAP_DEREF_NEVER';
+$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING';
+$lang['deref_o_2'] = 'LDAP_DEREF_FINDING';
+$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS';
$lang['referrals_o_-1'] = 'brug standardindstilling';
$lang['referrals_o_0'] = 'følg ikke henvisninger';
$lang['referrals_o_1'] = 'følg henvisninger';
diff --git a/lib/plugins/authldap/lang/de/settings.php b/lib/plugins/authldap/lang/de/settings.php
index f1bfc00fd..b6622d543 100644
--- a/lib/plugins/authldap/lang/de/settings.php
+++ b/lib/plugins/authldap/lang/de/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author C!own77 <clown77@posteo.de>
* @author Matthias Schulte <dokuwiki@lupo49.de>
* @author christian studer <cstuder@existenz.ch>
* @author Philip Knack <p.knack@stollfuss.de>
@@ -21,6 +22,7 @@ $lang['referrals'] = 'Weiterverfolgen von LDAP-Referrals (Verweise)?
$lang['deref'] = 'Wie sollen Aliase aufgelöst werden?';
$lang['binddn'] = 'DN eines optionalen Benutzers, wenn der anonyme Zugriff nicht ausreichend ist. Zum Beispiel: <code>cn=admin, dc=my, dc=home</code>.';
$lang['bindpw'] = 'Passwort des angegebenen Benutzers.';
+$lang['attributes'] = 'Attribute, die mit der LDAP-Suche abgerufen werden sollen.';
$lang['userscope'] = 'Die Suchweite nach Benutzeraccounts.';
$lang['groupscope'] = 'Die Suchweite nach Benutzergruppen.';
$lang['userkey'] = 'Attribut, das den Benutzernamen enthält; muss konsistent zum userfilter sein.';
diff --git a/lib/plugins/authldap/lang/el/lang.php b/lib/plugins/authldap/lang/el/lang.php
new file mode 100644
index 000000000..3e2d26f21
--- /dev/null
+++ b/lib/plugins/authldap/lang/el/lang.php
@@ -0,0 +1,9 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Aikaterini Katapodi <extragold1234@hotmail.com>
+ */
+$lang['connectfail'] = 'Δεν υπάρχει δυνατότητα σύνδεσης LDAP %s';
+$lang['domainfail'] = 'To LDAO δεν μπορεί να εντοπίσει το dn του χρήστη σας ';
diff --git a/lib/plugins/authldap/lang/el/settings.php b/lib/plugins/authldap/lang/el/settings.php
new file mode 100644
index 000000000..296dc247c
--- /dev/null
+++ b/lib/plugins/authldap/lang/el/settings.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Aikaterini Katapodi <extragold1234@hotmail.com>
+ */
+$lang['server'] = 'Ο διακομιστής σας LDAP. Είτε το κύριο όνομα ή ολόκληρο το URL ';
+$lang['port'] = 'Η πύλη διακομιστή LDAP αν δεν εδόθη ολόκληρο το URL ';
+$lang['usertree'] = 'Πού μπορούν να βρεθούν οι λογαριασμοί χρήστη.. Π.χ . <code>ou=Κοινό , dc=server, dc=tld</code> ';
+$lang['grouptree'] = 'Πού μπορούν να βρεθούν οι ομάδες χρήστη. Πχ. <code>ou=Group, dc=server, dc=tld</code> ';
+$lang['userfilter'] = 'LDAP φίλτρο προς αναζήτηση λογαριασμών χρήστη Πχ . <code>(&amp;(uid=%{user})(objectClass=posixAccount))</code> ';
+$lang['groupfilter'] = 'LDAP φίλτρο προς αναζήτηση ομάδων . Πχ. <code>(&amp;(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code> ';
+$lang['version'] = 'Η έκδοση πρωτοκόλλου προς χρήση. Μπορεί να χρειαστείτε να τοποθετήσετε αυτό στον <κωδικό> 3 </κωδικός>';
+$lang['starttls'] = 'Να γίνει χρήση συνδέσεων TLS?';
+$lang['referrals'] = 'Να ακολουθηθούν τα μέλη αναφοράς?';
+$lang['deref'] = 'Πώς να σβηστεί η αναφορά aliases?';
+$lang['binddn'] = 'To DN ενός προαιρετικού επίσημου χρήστη αν ο ανώνυμος σύνδεσμος δεν είναι επαρκής Πχ. <code>cn=admin, dc=my, dc=home</code> ';
+$lang['bindpw'] = 'Ο κωδικός πρόσβασης του άνω χρήστη';
+$lang['userscope'] = 'Περιορισμός του εύρους αναζήτησης χρήστη';
+$lang['groupscope'] = 'Περιορίστε το εύρος της αναζήτησης για αναζήτηση ομάδας';
+$lang['userkey'] = ' Η Καταχώρηση του ονόματος χρήστη πρέπει να είναι σύμφωνα με την ανάλυση (=φίλτρο) χρήστη.';
+$lang['groupkey'] = 'Εγγραφή ομάδας ως μέλους από οιαδήποτε κατηγορία χρήστη (αντί των στάνταρ ομάδων AD) πχ ομάδα τμήματος ή αριθμός τηλεφώνου';
+$lang['modPass'] = 'Μπορεί ο κωδικός πρόσβασης LDAP να αλλάξει μέσω του dokuwiki?';
+$lang['debug'] = 'Προβολή επιπλέον πληροφοριών για την ανεύρεση σφαλμάτων';
+$lang['deref_o_0'] = 'LDAP_DEREF_NEVER ';
+$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING';
+$lang['deref_o_2'] = 'LDAP_DEREF_FINDING ';
+$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS ';
+$lang['referrals_o_-1'] = 'προεπιλογή χρήσης';
+$lang['referrals_o_0'] = 'μην ακολουθείτε τα νέα μέλη αναφοράς';
+$lang['referrals_o_1'] = 'ακολουθείστε τα νέα μέλη αναφοράς ';
diff --git a/lib/plugins/authldap/lang/en/settings.php b/lib/plugins/authldap/lang/en/settings.php
index a4194b00a..99884745d 100644
--- a/lib/plugins/authldap/lang/en/settings.php
+++ b/lib/plugins/authldap/lang/en/settings.php
@@ -11,6 +11,7 @@ $lang['referrals'] = 'Shall referrals be followed?';
$lang['deref'] = 'How to dereference aliases?';
$lang['binddn'] = 'DN of an optional bind user if anonymous bind is not sufficient. Eg. <code>cn=admin, dc=my, dc=home</code>';
$lang['bindpw'] = 'Password of above user';
+$lang['attributes'] = 'Attributes to retrieve with the LDAP search.';
$lang['userscope'] = 'Limit search scope for user search';
$lang['groupscope'] = 'Limit search scope for group search';
$lang['userkey'] = 'Attribute denoting the username; must be consistent to userfilter.';
diff --git a/lib/plugins/authldap/lang/es/settings.php b/lib/plugins/authldap/lang/es/settings.php
index ba8f41e59..7a4090fe2 100644
--- a/lib/plugins/authldap/lang/es/settings.php
+++ b/lib/plugins/authldap/lang/es/settings.php
@@ -3,11 +3,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Domingo Redal <docxml@gmail.com>
* @author Antonio Bueno <atnbueno@gmail.com>
* @author Eloy <ej.perezgomez@gmail.com>
* @author Alejandro Nunez <nunez.alejandro@gmail.com>
* @author Enny Rodriguez <aquilez.4@gmail.com>
- * @author Domingo Redal <docxml@gmail.com>
*/
$lang['server'] = 'Tu servidor LDAP. Puede ser el nombre del host (<code>localhost</code>) o una URL completa (<code>ldap://server.tld:389</code>)';
$lang['port'] = 'Servidor LDAP en caso de que no se diera la URL completa anteriormente.';
@@ -21,6 +21,7 @@ $lang['referrals'] = '¿Deben ser seguidas las referencias?';
$lang['deref'] = '¿Cómo desreferenciar los alias?';
$lang['binddn'] = 'DN de un usuario de enlace opcional si el enlace anónimo no es suficiente. P. ej. <code>cn=admin, dc=my, dc=home</code>';
$lang['bindpw'] = 'Contraseña del usuario de arriba.';
+$lang['attributes'] = 'Atributos a recuperar de la búsqueda en LDAP.';
$lang['userscope'] = 'Limitar ámbito de búsqueda para búsqueda de usuarios';
$lang['groupscope'] = 'Limitar ámbito de búsqueda para búsqueda de grupos';
$lang['userkey'] = 'Atributo que denota el nombre de usuario; debe ser coherente con el filtro.';
diff --git a/lib/plugins/authldap/lang/fa/settings.php b/lib/plugins/authldap/lang/fa/settings.php
index 3d4f17b98..658cdf8ba 100644
--- a/lib/plugins/authldap/lang/fa/settings.php
+++ b/lib/plugins/authldap/lang/fa/settings.php
@@ -3,10 +3,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author علیرضا ایوز <info@alirezaivaz.ir>
+ * @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
* @author Mohammad Sadegh <msdn2013@gmail.com>
* @author Omid Hezaveh <hezpublic@gmail.com>
* @author Mohmmad Razavi <sepent@gmail.com>
- * @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
* @author sam01 <m.sajad079@gmail.com>
*/
$lang['server'] = 'سرور LDAP شما. چه به صورت ';
diff --git a/lib/plugins/authldap/lang/fi/settings.php b/lib/plugins/authldap/lang/fi/settings.php
index b15d8c676..c322d245c 100644
--- a/lib/plugins/authldap/lang/fi/settings.php
+++ b/lib/plugins/authldap/lang/fi/settings.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Otto Vainio <otto@valjakko.net>
*/
$lang['starttls'] = 'Käytä TLS yhteyttä';
diff --git a/lib/plugins/authldap/lang/fr/settings.php b/lib/plugins/authldap/lang/fr/settings.php
index be3636708..b1285a3a1 100644
--- a/lib/plugins/authldap/lang/fr/settings.php
+++ b/lib/plugins/authldap/lang/fr/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author PaliPalo <palipalo@hotmail.fr>
* @author Bruno Veilleux <bruno.vey@gmail.com>
* @author schplurtz <Schplurtz@laposte.net>
*/
@@ -18,6 +19,7 @@ $lang['referrals'] = 'Suivre les références?';
$lang['deref'] = 'Comment déréférencer les alias ?';
$lang['binddn'] = 'Nom de domaine d\'un utilisateur de connexion facultatif si une connexion anonyme n\'est pas suffisante. Ex. : <code>cn=admin, dc=mon, dc=accueil</code>';
$lang['bindpw'] = 'Mot de passe de l\'utilisateur ci-dessus.';
+$lang['attributes'] = 'Attributs à récupérer avec la recherche LDAP.';
$lang['userscope'] = 'Limiter la portée de recherche d\'utilisateurs';
$lang['groupscope'] = 'Limiter la portée de recherche de groupes';
$lang['userkey'] = 'Attribut indiquant le nom d\'utilisateur. Doit être en accord avec le filtre d\'utilisateur.';
diff --git a/lib/plugins/authldap/lang/ja/settings.php b/lib/plugins/authldap/lang/ja/settings.php
index fd7ad7652..f9d16e7d3 100644
--- a/lib/plugins/authldap/lang/ja/settings.php
+++ b/lib/plugins/authldap/lang/ja/settings.php
@@ -3,31 +3,32 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
+ * @author lempel <riverlempel@hotmail.com>
* @author Satoshi Sahara <sahara.satoshi@gmail.com>
* @author Hideaki SAWADA <sawadakun@live.jp>
- * @author Hideaki SAWADA <chuno@live.jp>
* @author PzF_X <jp_minecraft@yahoo.co.jp>
* @author Ikuo Obataya <i.obataya@gmail.com>
*/
-$lang['server'] = 'LDAPサーバー。ホスト名(<code>localhost</code>)又は完全修飾URL(<code>ldap://server.tld:389</code>)';
-$lang['port'] = '上記が完全修飾URLでない場合、LDAPサーバーポート';
-$lang['usertree'] = 'ユーザーアカウントを探す場所。例:<code>ou=People, dc=server, dc=tld</code>';
-$lang['grouptree'] = 'ユーザーグループを探す場所。例:<code>ou=Group, dc=server, dc=tld</code>';
-$lang['userfilter'] = 'ユーザーアカウントを探すためのLDAP抽出条件。例:<code>(&amp;(uid=%{user})(objectClass=posixAccount))</code>';
-$lang['groupfilter'] = 'グループを探すLDAP抽出条件。例:<code>(&amp;(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code>';
-$lang['version'] = '使用するプロトコルのバージョン。<code>3</code>を設定する必要がある場合があります。';
-$lang['starttls'] = 'TLS接続を使用しますか?';
-$lang['referrals'] = '紹介に従いますか?';
-$lang['deref'] = 'どのように間接参照のエイリアスにしますか?';
-$lang['binddn'] = '匿名バインドでは不十分な場合、オプションバインドユーザーのDN。例:<code>cn=admin, dc=my, dc=home</code>';
+$lang['server'] = 'LDAPサーバー<br>ホスト名(<code>localhost</code>)又は完全修飾URL(<code>ldap://server.tld:389</code>)';
+$lang['port'] = '上記が完全修飾URLでない場合のLDAPサーバーポート';
+$lang['usertree'] = 'ユーザーアカウントを探す場所(例:<code>ou=People, dc=server, dc=tld</code>)';
+$lang['grouptree'] = 'ユーザーグループを探す場所(例:<code>ou=Group, dc=server, dc=tld</code>)';
+$lang['userfilter'] = 'ユーザーアカウントを探すためのLDAP抽出条件(例:<code>(&amp;(uid=%{user})(objectClass=posixAccount))</code>)';
+$lang['groupfilter'] = 'グループを探すLDAP抽出条件(例:<code>(&amp;(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code>)';
+$lang['version'] = '使用するプロトコルのバージョン(場合によっては<code>3</code>を設定する必要があります。)';
+$lang['starttls'] = 'TLS接続を使用する';
+$lang['referrals'] = '紹介に従う';
+$lang['deref'] = 'どのように間接参照のエイリアスにするか';
+$lang['binddn'] = '匿名バインドでは不十分な場合の、オプションバインドユーザーのDN(例:<code>cn=admin, dc=my, dc=home</code>)';
$lang['bindpw'] = '上記ユーザーのパスワード';
+$lang['attributes'] = 'LDAP検索で取得する属性。';
$lang['userscope'] = 'ユーザー検索の範囲を限定させる';
$lang['groupscope'] = 'グループ検索の範囲を限定させる';
-$lang['userkey'] = 'ユーザー名を示す属性。userfilter と一致している必要があります。';
-$lang['groupkey'] = 'ユーザー属性をグループのメンバーシップから設定します(代わりに標準のADグループ)。
-例えば、部署や電話番号などです。';
-$lang['modPass'] = 'DokuWiki から LDAP パスワードの変更が可能?';
-$lang['debug'] = 'エラーに関して追加のデバッグ情報を表示する。';
+$lang['userkey'] = 'ユーザー名を示す属性(userfilter と一致している必要があります。)';
+$lang['groupkey'] = 'ユーザー属性をグループのメンバーシップから設定する(標準のADグループの代わり。例:部署や電話番号など)';
+$lang['modPass'] = 'DokuWiki から LDAP パスワードの変更が可能かどうか';
+$lang['debug'] = 'エラーに関して追加のデバッグ情報を表示する';
$lang['deref_o_0'] = 'LDAP_DEREF_NEVER';
$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING';
$lang['deref_o_2'] = 'LDAP_DEREF_FINDING';
diff --git a/lib/plugins/authldap/lang/nl/settings.php b/lib/plugins/authldap/lang/nl/settings.php
index 1f80b0251..1a3120291 100644
--- a/lib/plugins/authldap/lang/nl/settings.php
+++ b/lib/plugins/authldap/lang/nl/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author PBU <pbu@xs4all.nl>
* @author Gerrit Uitslag <klapinklapin@gmail.com>
* @author Remon <no@email.local>
* @author Johan Wijnker <johan@wijnker.eu>
@@ -19,6 +20,7 @@ $lang['referrals'] = 'Moeten verwijzingen worden gevolgd?';
$lang['deref'] = 'Hoe moeten de verwijzing van aliases worden bepaald?';
$lang['binddn'] = 'DN van een optionele bind gebruiker als anonieme bind niet genoeg is. Bijv. <code>cn=beheer, dc=mijn, dc=thuis</code>';
$lang['bindpw'] = 'Wachtwoord van bovenstaande gebruiker';
+$lang['attributes'] = 'Welke onderdelen moeten in LDAP gezocht worden';
$lang['userscope'] = 'Beperken scope van zoekfuncties voor gebruikers';
$lang['groupscope'] = 'Beperken scope van zoekfuncties voor groepen';
$lang['userkey'] = 'Attribuut aanduiding van de gebruikersnaam; moet consistent zijn met userfilter.';
diff --git a/lib/plugins/authldap/lang/no/settings.php b/lib/plugins/authldap/lang/no/settings.php
index 3e320bde0..3fd09698f 100644
--- a/lib/plugins/authldap/lang/no/settings.php
+++ b/lib/plugins/authldap/lang/no/settings.php
@@ -6,7 +6,6 @@
* @author Christopher Schive <chschive@frisurf.no>
* @author Patrick <spill.p@hotmail.com>
* @author Arne Hanssen <arne.hanssen@getmail.no>
- * @author Arne Hanssen <arnehans@getmail.no>
*/
$lang['server'] = 'Din LDAP-server. Enten vertsnavnet (<code>localhost</code>) eller hele URL (<code>ldap://server.tld:389</code>)';
$lang['port'] = 'LDAP serverport dersom ingen full URL var gitt over.';
diff --git a/lib/plugins/authldap/lang/pt-br/settings.php b/lib/plugins/authldap/lang/pt-br/settings.php
index 03469e5c0..8b5cb378b 100644
--- a/lib/plugins/authldap/lang/pt-br/settings.php
+++ b/lib/plugins/authldap/lang/pt-br/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Schopf <pschopf@gmail.com>
* @author Victor Westmann <victor.westmann@gmail.com>
* @author Frederico Guimarães <frederico@teia.bio.br>
* @author Hudson FAS <hudsonfas@gmail.com>
@@ -19,6 +20,7 @@ $lang['referrals'] = 'Permitir que as referências sejam seguidas?';
$lang['deref'] = 'Como dereferenciar os aliases?';
$lang['binddn'] = 'DN de um vínculo opcional de usuário se vínculo anônimo não for suficiente. Eg. <code>cn=admin, dc=my, dc=home</code>';
$lang['bindpw'] = 'Senha do usuário acima';
+$lang['attributes'] = 'Atributos a serem recuperados com a pesquisa LDAP.';
$lang['userscope'] = 'Limitar escopo da busca para busca de usuário';
$lang['groupscope'] = 'Limitar escopo da busca para busca de grupo';
$lang['userkey'] = 'Atributo que indica o nome do usuário; deve ser consistente com userfilter.';
diff --git a/lib/plugins/authldap/lang/pt/settings.php b/lib/plugins/authldap/lang/pt/settings.php
index ff308c68e..d1c67245e 100644
--- a/lib/plugins/authldap/lang/pt/settings.php
+++ b/lib/plugins/authldap/lang/pt/settings.php
@@ -3,32 +3,37 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
+ * @author Mario AlexandTeixeira dos Santos <masterofclan@gmail.com>
+ * @author Maykon Oliveira <maykonoliveira850@gmail.com>
* @author André Neves <drakferion@gmail.com>
* @author Guido Salatino <guidorafael23@gmail.com>
* @author Romulo Pereira <romuloccomp@gmail.com>
* @author Paulo Carmino <contato@paulocarmino.com>
*/
-$lang['server'] = 'O seu servidor de LDAP. Ou hostname (<code>localhost</code>) ou URL qualificado completo (<code>ldap://servidor.tld:389</code>)';
-$lang['port'] = 'Porta de servidor de LDAP se o URL completo não foi fornecido acima';
-$lang['usertree'] = 'Onde encontrar as contas de utilizador. Por exemplo <code>ou=Pessoas, dc=servidor, dc=tld</code>';
-$lang['grouptree'] = 'Onde encontrar os grupos de utilizadores. Por exemplo code>ou=Grupo, dc=servidor, dc=tld</code>';
+$lang['server'] = 'O seu servidor de LDAP. Ou hostname (<code>localhost</code>) ou URL qualificada completa (<code>ldap://servidor.tld:389</code>)';
+$lang['port'] = 'Porta de servidor de LDAP se a URL completa não foi fornecida acima';
+$lang['usertree'] = 'Onde encontrar as contas de usuário. Por exemplo <code>ou=Pessoas, dc=servidor, dc=tld</code>';
+$lang['grouptree'] = 'Onde encontrar os grupos de usuário. Por exemplo code>ou=Grupo, dc=servidor, dc=tld</code>';
$lang['userfilter'] = 'Filtro LDAP para procurar por contas de utilizador. Por exemplo <code>(&amp;(uid=%{user})(objectClass=posixAccount))</code>';
$lang['groupfilter'] = 'Filtro LDAP para procurar por grupos. Por exemplo <code>(&amp;(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code>';
$lang['version'] = 'A versão do protocolo a utilizar. Pode precisar de alterar isto para <code>3</code>';
-$lang['starttls'] = 'Usar ligações TLS?';
+$lang['starttls'] = 'Usar conexões TLS?';
$lang['referrals'] = 'Referrals devem ser seguidos?';
$lang['deref'] = 'Como desreferenciar aliases?';
-$lang['binddn'] = 'DN de um usuário de ligação opcional, quando a ligação é anônima não é suficiente. Eg. <code> cn = admin, dc = my, dc = home </code>';
-$lang['bindpw'] = 'Senha do utilizador acima';
+$lang['binddn'] = 'DN de um usuário de ligação opcional, quando a ligação é anônima não é suficiente. Ex. <code> cn = admin, dc = my, dc = home </code>';
+$lang['bindpw'] = 'Senha do usuário acima';
+$lang['attributes'] = 'Atributos a serem recuperados com a pesquisa LDAP.';
$lang['userscope'] = 'Escopo de pesquisa Limite para pesquisa de usuário';
-$lang['groupscope'] = 'Escopo de pesquisa Limite para pesquisa de grupo';
-$lang['groupkey'] = 'A participação no grupo a partir de qualquer atributo de usuário (em vez de AD padrão de grupos) exemplo: grupo de departamento ou número de telefone';
+$lang['groupscope'] = 'Escopo de pesquisa limite para pesquisa de grupo';
+$lang['userkey'] = 'Atributo denotando o nome de usuário; deve ser consistente com o filtro do usuário.';
+$lang['groupkey'] = 'A participação no grupo a partir de qualquer atributo de usuário (em vez de AD padrão de grupos) ex: grupo de departamento ou número de telefone';
$lang['modPass'] = 'Sua senha LDAP pode ser alterada via dokuwiki?';
-$lang['debug'] = 'Mostrar informação adicional de debug aquando de erros';
-$lang['deref_o_0'] = 'LDAP_DEREF_NUNCA';
-$lang['deref_o_1'] = 'LDAP_DEREF_PESQUISANDO';
-$lang['deref_o_2'] = 'LDAP_DEREF_BUSCANDO';
-$lang['deref_o_3'] = 'LDAP_DEREF_SEMPRE';
+$lang['debug'] = 'Mostrar informação adicional de debug quando ocorrerem erros';
+$lang['deref_o_0'] = 'LDAP_DEREF_NEVER';
+$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING';
+$lang['deref_o_2'] = 'LDAP_DEREF_FINDING';
+$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS';
$lang['referrals_o_-1'] = 'usar padrão';
$lang['referrals_o_0'] = 'não seguir as referências';
$lang['referrals_o_1'] = 'seguir as referências';
diff --git a/lib/plugins/authldap/lang/ru/settings.php b/lib/plugins/authldap/lang/ru/settings.php
index 916d9a2d2..c5d3ef456 100644
--- a/lib/plugins/authldap/lang/ru/settings.php
+++ b/lib/plugins/authldap/lang/ru/settings.php
@@ -3,8 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
* @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua)
- * @author Aleksandr Selivanov <alexgearbox@gmail.com>
* @author Erli Moen <evseev.jr@gmail.com>
* @author Владимир <id37736@yandex.ru>
* @author Vitaly Filatenko <kot@hacktest.net>
@@ -22,10 +22,11 @@ $lang['referrals'] = 'Следовать за referrals?';
$lang['deref'] = 'Как расшифровывать псевдонимы?';
$lang['binddn'] = 'DN вторичного bind-пользователя, если anonymous bind недостаточно. Например: <code>cn=admin, dc=my, dc=home</code>';
$lang['bindpw'] = 'Пароль для указанного пользователя';
+$lang['attributes'] = 'Атрибуты для извлечения с помощью поиска LDAP.';
$lang['userscope'] = 'Ограничить область поиска при поиске пользователей';
$lang['groupscope'] = 'Ограничить область поиска при поиске групп';
-$lang['userkey'] = 'Атрибут означающий имя пользователя; должен быть таким же как в userfilter';
-$lang['groupkey'] = 'Использовать любой атрибут пользователя для включения в группу (вместо стандартного AD groups) Например из атрибута department или telephone number';
+$lang['userkey'] = 'Атрибут, означающий имя пользователя; должен быть таким же как в userfilter';
+$lang['groupkey'] = 'Использовать любой атрибут пользователя для включения в группу (вместо стандартного AD groups). Например, из атрибута department или telephone number';
$lang['modPass'] = 'Может ли пароль LDAP быть изменён через «Докувики»?';
$lang['debug'] = 'Показывать дополнительную отладочную информацию при ошибках';
$lang['deref_o_0'] = 'LDAP_DEREF_NEVER';
diff --git a/lib/plugins/authldap/lang/sk/settings.php b/lib/plugins/authldap/lang/sk/settings.php
index 2d45c923e..9d0456a72 100644
--- a/lib/plugins/authldap/lang/sk/settings.php
+++ b/lib/plugins/authldap/lang/sk/settings.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Tibor Repček <tiborepcek@gmail.com>
* @author Martin Michalek <michalek.dev@gmail.com>
*/
$lang['server'] = 'LDAP server. Adresa (<code>localhost</code>) alebo úplné URL (<code>ldap://server.tld:389</code>)';
@@ -27,3 +28,6 @@ $lang['deref_o_0'] = 'LDAP_DEREF_NEVER';
$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING';
$lang['deref_o_2'] = 'LDAP_DEREF_FINDING';
$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS';
+$lang['referrals_o_-1'] = 'použiť prednastavené';
+$lang['referrals_o_0'] = 'nesleduj odkazovače';
+$lang['referrals_o_1'] = 'sleduj odkazovače';
diff --git a/lib/plugins/authldap/lang/sr/settings.php b/lib/plugins/authldap/lang/sr/settings.php
index 3aec5c38a..6f99a532a 100644
--- a/lib/plugins/authldap/lang/sr/settings.php
+++ b/lib/plugins/authldap/lang/sr/settings.php
@@ -3,10 +3,19 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Milan Oparnica <milan.opa@gmail.com>
* @author Марко М. Костић <marko.m.kostic@gmail.com>
*/
+$lang['server'] = 'Vaš LDAP server. Bilo po nazivu (<code>localhost</code>) ili po punoj URL putanju (<code>ldap://server.tld:389</code>)';
+$lang['port'] = 'Port LDAP servera ako nije zadat u više unetoj punoj URL putanji.';
+$lang['usertree'] = 'Mesto za potragu za korisničkim nalozima. Npr. <code>ou=People, dc=server, dc=tld</code>';
+$lang['grouptree'] = 'Mesto za potragu za korisničkim grupama. Npr. <code>ou=Group, dc=server, dc=tld</code>';
+$lang['userfilter'] = 'LDAP filter za pretragu za korisničkim nalozima. Npr. <code>(&amp;(uid=%{user})(objectClass=posixAccount))</code>';
+$lang['groupfilter'] = 'LDAP filter za pretragu za korisničkim grupama. Npr. <code>(&amp;(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code>';
+$lang['version'] = 'Verzija protokola. Može biti neophodno da ovo postavite na vrednost <code>3</code>';
$lang['starttls'] = 'Користити TLS везе?';
$lang['referrals'] = 'Да ли треба пратити реферале?';
+$lang['deref'] = 'Kako razrešiti pseudonime?';
$lang['bindpw'] = 'Лозинка корисника изнад';
$lang['userscope'] = 'Ограничи опсег претраживања за корисничке претраге';
$lang['groupscope'] = 'Ограничи опсег претраживања за групне претраге';
diff --git a/lib/plugins/authldap/lang/tr/settings.php b/lib/plugins/authldap/lang/tr/settings.php
index 843b7ef9c..3b526ee3c 100644
--- a/lib/plugins/authldap/lang/tr/settings.php
+++ b/lib/plugins/authldap/lang/tr/settings.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author ilker rifat kapaç <irifat@gmail.com>
*/
$lang['bindpw'] = 'Üstteki kullanıcının şifresi';
diff --git a/lib/plugins/authldap/lang/vi/lang.php b/lib/plugins/authldap/lang/vi/lang.php
new file mode 100644
index 000000000..c1f328901
--- /dev/null
+++ b/lib/plugins/authldap/lang/vi/lang.php
@@ -0,0 +1,9 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['connectfail'] = 'LDAP không thể kết nối : %s';
+$lang['domainfail'] = 'LDAP không thể tìm thấy dn thành viên của bạn';
diff --git a/lib/plugins/authldap/lang/vi/settings.php b/lib/plugins/authldap/lang/vi/settings.php
new file mode 100644
index 000000000..65c756e4a
--- /dev/null
+++ b/lib/plugins/authldap/lang/vi/settings.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['server'] = 'Máy chủ LDAP của bạn. Tên máy chủ (<code>localhost</code>) hoặc URL đầy đủ (<code>ldap://server.tld:389</code>)';
+$lang['port'] = 'Cổng máy chủ LDAP nếu không có URL đầy đủ được đưa ra bên trên';
+$lang['usertree'] = 'Nơi tìm tài khoản thành viên. VD. <code>ou=People, dc=server, dc=tld</code>';
+$lang['grouptree'] = 'Nơi tìm nhóm thành viên. Eg. <code>ou=Group, dc=server, dc=tld</code>';
+$lang['userfilter'] = 'Bộ lọc LDAP để tìm kiếm tài khoản thành viên. VD. <code>(&amp;(uid=%{user})(objectClass=posixAccount))</code>';
+$lang['groupfilter'] = 'Bộ lọc LDAP để tìm kiếm nhóm thành viên. Eg. <code>(&amp;(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))</code>';
+$lang['version'] = 'Phiên bản giao thức để sử dụng. Bạn có thể cần đặt cái này thành <code>3</code>';
+$lang['starttls'] = 'Sử dụng kết nối TLS?';
+$lang['referrals'] = 'Theo dõi Shall referrals?';
+$lang['deref'] = 'Làm thế nào để xóa bỏ bí danh?';
+$lang['binddn'] = 'DN của một thành viên liên kết tùy chọn nếu liên kết ẩn danh là không đủ. VD. <code>cn=admin, dc=my, dc=home</code>';
+$lang['bindpw'] = 'Mật khẩu của thành viên trên';
+$lang['attributes'] = 'Các thuộc tính truy xuất với tìm kiếm LDAP.';
+$lang['userscope'] = 'Giới hạn phạm vi tìm kiếm cho tìm kiếm thành viên';
+$lang['groupscope'] = 'Giới hạn phạm vi tìm kiếm cho tìm kiếm nhóm';
+$lang['userkey'] = 'Thuộc tính biểu thị tên thành viên; phải phù hợp với bộ lọc thành viên.';
+$lang['groupkey'] = 'Thành viên nhóm từ bất kỳ thuộc tính thành viên nào (thay vì các nhóm AD tiêu chuẩn), VD. nhóm từ bộ phận hoặc số điện thoại';
+$lang['modPass'] = 'Có thể thay đổi mật khẩu LDAP qua dokuwiki không?';
+$lang['debug'] = 'Hiển thị thông tin gỡ lỗi bổ sung về lỗi';
+$lang['deref_o_0'] = 'LDAP_DEREF_NEVER';
+$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING';
+$lang['deref_o_2'] = 'LDAP_DEREF_FINDING';
+$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS';
+$lang['referrals_o_-1'] = 'sử dụng mặc định';
+$lang['referrals_o_0'] = 'không theo dõi referrals';
+$lang['referrals_o_1'] = 'theo dõi referrals';
diff --git a/lib/plugins/authmysql/auth.php b/lib/plugins/authmysql/auth.php
deleted file mode 100644
index 999542a3d..000000000
--- a/lib/plugins/authmysql/auth.php
+++ /dev/null
@@ -1,1110 +0,0 @@
-<?php
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-/**
- * MySQL authentication backend
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Chris Smith <chris@jalakai.co.uk>
- * @author Matthias Grimm <matthias.grimmm@sourceforge.net>
- * @author Jan Schumann <js@schumann-it.com>
- */
-class auth_plugin_authmysql extends DokuWiki_Auth_Plugin {
- /** @var resource holds the database connection */
- protected $dbcon = 0;
- /** @var int database version*/
- protected $dbver = 0;
- /** @var int database revision */
- protected $dbrev = 0;
- /** @var int database subrevision */
- protected $dbsub = 0;
-
- /** @var array cache to avoid re-reading user info data */
- protected $cacheUserInfo = array();
-
- /**
- * Constructor
- *
- * checks if the mysql interface is available, otherwise it will
- * set the variable $success of the basis class to false
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- */
- public function __construct() {
- parent::__construct();
-
- if(!function_exists('mysql_connect')) {
- $this->_debug("MySQL err: PHP MySQL extension not found.", -1, __LINE__, __FILE__);
- $this->success = false;
- return;
- }
-
- // set capabilities based upon config strings set
- if(!$this->getConf('server') || !$this->getConf('user') || !$this->getConf('database')) {
- $this->_debug("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);
-
- if($this->getConf('debug') >= 2) {
- $candoDebug = '';
- foreach($this->cando as $cd => $value) {
- if($value) { $value = 'yes'; } else { $value = 'no'; }
- $candoDebug .= $cd . ": " . $value . " | ";
- }
- $this->_debug("authmysql cando: " . $candoDebug, 0, __LINE__, __FILE__);
- }
- }
-
- /**
- * Check if the given config strings are set
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string[] $keys
- * @param bool $wop is this a check for a write operation?
- * @return bool
- */
- protected function _chkcnf($keys, $wop = false) {
- foreach($keys as $key) {
- if(!$this->getConf($key)) return false;
- }
-
- /* write operation and lock array filled with tables names? */
- if($wop && (!is_array($this->getConf('TablesToLock')) ||
- !count($this->getConf('TablesToLock')))
- ) {
- return false;
- }
-
- return true;
- }
-
- /**
- * Checks if the given user exists and the given plaintext password
- * is correct. Furtheron it might be checked wether the user is
- * member of the right group
- *
- * Depending on which SQL string is defined in the config, password
- * checking is done here (getpass) or by the database (passcheck)
- *
- * @param string $user user who would like access
- * @param string $pass user's clear text password to check
- * @return bool
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- */
- public function checkPass($user, $pass) {
- global $conf;
- $rc = false;
-
- if($this->_openDB()) {
- $sql = str_replace('%{user}', $this->_escape($user), $this->getConf('checkPass'));
- $sql = str_replace('%{pass}', $this->_escape($pass), $sql);
- $sql = str_replace('%{dgroup}', $this->_escape($conf['defaultgroup']), $sql);
- $result = $this->_queryDB($sql);
-
- if($result !== false && count($result) == 1) {
- if($this->getConf('forwardClearPass') == 1) {
- $rc = true;
- } else {
- $rc = auth_verifyPassword($pass, $result[0]['pass']);
- }
- }
- $this->_closeDB();
- }
- return $rc;
- }
-
- /**
- * Return user info
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user user login to get data for
- * @param bool $requireGroups when true, group membership information should be included in the returned array;
- * when false, it maybe included, but is not required by the caller
- * @return array|bool
- */
- public function getUserData($user, $requireGroups=true) {
- if($this->_cacheExists($user, $requireGroups)) {
- return $this->cacheUserInfo[$user];
- }
-
- if($this->_openDB()) {
- $this->_lockTables("READ");
- $info = $this->_getUserInfo($user, $requireGroups);
- $this->_unlockTables();
- $this->_closeDB();
- } else {
- $info = false;
- }
- return $info;
- }
-
- /**
- * Create a new User. Returns false if the user already exists,
- * null when an error occurred and true if everything went well.
- *
- * The new user will be added to the default group by this
- * function if grps are not specified (default behaviour).
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Chris Smith <chris@jalakai.co.uk>
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user nick of the user
- * @param string $pwd clear text password
- * @param string $name full name of the user
- * @param string $mail email address
- * @param array $grps array of groups the user should become member of
- * @return bool|null
- */
- public function createUser($user, $pwd, $name, $mail, $grps = null) {
- global $conf;
-
- if($this->_openDB()) {
- if(($info = $this->_getUserInfo($user)) !== false) {
- msg($this->getLang('userexists'), -1);
- return false; // user already exists
- }
-
- // set defaultgroup if no groups were given
- if($grps == null) {
- $grps = array($conf['defaultgroup']);
- }
-
- $this->_lockTables("WRITE");
- $pwd = $this->getConf('forwardClearPass') ? $pwd : auth_cryptPassword($pwd);
- $rc = $this->_addUser($user, $pwd, $name, $mail, $grps);
- $this->_unlockTables();
- $this->_closeDB();
- if(!$rc) {
- msg($this->getLang('writefail'));
- return null;
- }
- return true;
- } else {
- msg($this->getLang('connectfail'), -1);
- }
- return null; // return error
- }
-
- /**
- * Modify user data
- *
- * An existing user dataset will be modified. Changes are given in an array.
- *
- * The dataset update will be rejected if the user name should be changed
- * to an already existing one.
- *
- * The password must be provided unencrypted. Pasword encryption is done
- * automatically if configured.
- *
- * If one or more groups can't be updated, an error will be set. In
- * this case the dataset might already be changed and we can't rollback
- * the changes. Transactions would be really useful here.
- *
- * modifyUser() may be called without SQL statements defined that are
- * needed to change group membership (for example if only the user profile
- * should be modified). In this case we assure that we don't touch groups
- * even when $changes['grps'] is set by mistake.
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user nick of the user to be changed
- * @param array $changes array of field/value pairs to be changed (password will be clear text)
- * @return bool true on success, false on error
- */
- public function modifyUser($user, $changes) {
- $rc = false;
-
- if(!is_array($changes) || !count($changes)) {
- return true; // nothing to change
- }
-
- if($this->_openDB()) {
- $this->_lockTables("WRITE");
-
- $rc = $this->_updateUserInfo($user, $changes);
-
- if(!$rc) {
- msg($this->getLang('usernotexists'), -1);
- } elseif(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, true)) == false) {
- $rc = false;
- }
- }
-
- foreach($grpdel as $group) {
- if(($this->_delUserFromGroup($user, $group)) == false) {
- $rc = false;
- }
- }
-
- if(!$rc) msg($this->getLang('writefail'));
- }
-
- $this->_unlockTables();
- $this->_closeDB();
- } else {
- msg($this->getLang('connectfail'), -1);
- }
- return $rc;
- }
-
- /**
- * [public function]
- *
- * Remove one or more users from the list of registered users
- *
- * @param array $users array of users to be deleted
- * @return int the number of users deleted
- *
- * @author Christopher Smith <chris@jalakai.co.uk>
- * @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();
- } else {
- msg($this->getLang('connectfail'), -1);
- }
- return $count;
- }
-
- /**
- * Counts users which meet certain $filter criteria.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param array $filter filter criteria in item/pattern pairs
- * @return int count of found users
- */
- public function getUserCount($filter = array()) {
- $rc = 0;
-
- if($this->_openDB()) {
- $sql = $this->_createSQLFilter($this->getConf('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;
- }
-
- /**
- * Bulk retrieval of user data
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param int $first 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
- * @return array userinfo (refer getUserData for internal userinfo details)
- */
- public function retrieveUsers($first = 0, $limit = 0, $filter = array()) {
- $out = array();
-
- if($this->_openDB()) {
- $this->_lockTables("READ");
- $sql = $this->_createSQLFilter($this->getConf('getUsers'), $filter);
- $sql .= " ".$this->getConf('SortOrder');
- if($limit) {
- $sql .= " LIMIT $first, $limit";
- } elseif($first) {
- $sql .= " LIMIT $first";
- }
- $result = $this->_queryDB($sql);
-
- if(!empty($result)) {
- foreach($result as $user) {
- if(($info = $this->_getUserInfo($user['user']))) {
- $out[$user['user']] = $info;
- }
- }
- }
-
- $this->_unlockTables();
- $this->_closeDB();
- }
- return $out;
- }
-
- /**
- * Give user membership of a group
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user
- * @param string $group
- * @return bool true on success, false on error
- */
- protected function joinGroup($user, $group) {
- $rc = false;
-
- if($this->_openDB()) {
- $this->_lockTables("WRITE");
- $rc = $this->_addUserToGroup($user, $group);
- $this->_unlockTables();
- $this->_closeDB();
- }
- return $rc;
- }
-
- /**
- * Remove user from a group
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user user that leaves a group
- * @param string $group group to leave
- * @return bool
- */
- protected function leaveGroup($user, $group) {
- $rc = false;
-
- if($this->_openDB()) {
- $this->_lockTables("WRITE");
- $rc = $this->_delUserFromGroup($user, $group);
- $this->_unlockTables();
- $this->_closeDB();
- }
- return $rc;
- }
-
- /**
- * MySQL is case-insensitive
- */
- public function isCaseSensitive() {
- return false;
- }
-
- /**
- * Adds a user to a group.
- *
- * If $force is set to true non existing groups would be created.
- *
- * The database connection must already be established. Otherwise
- * this function does nothing and returns 'false'. It is strongly
- * recommended to call this function only after all participating
- * tables (group and usergroup) have been locked.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user user to add to a group
- * @param string $group name of the group
- * @param bool $force create missing groups
- * @return bool true on success, false on error
- */
- protected function _addUserToGroup($user, $group, $force = false) {
- $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->getConf('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->getConf('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) {
- $this->_flushUserInfoCache($user);
- return true;
- }
-
- if($newgroup) { // remove previously created group on error
- $sql = str_replace('%{gid}', $this->_escape($gid), $this->getConf('delGroup'));
- $sql = str_replace('%{group}', $this->_escape($group), $sql);
- $this->_modifyDB($sql);
- }
- }
- return false;
- }
-
- /**
- * Remove user from a group
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user user that leaves a group
- * @param string $group group to leave
- * @return bool true on success, false on error
- */
- protected function _delUserFromGroup($user, $group) {
- $rc = false;
-
- if(($this->dbcon) && ($user)) {
- $sql = $this->getConf('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 ($rc) {
- $this->_flushUserInfoCache($user);
- }
- }
- }
- return $rc;
- }
-
- /**
- * Retrieves a list of groups the user is a member off.
- *
- * The database connection must already be established
- * for this function to work. Otherwise it will return
- * false.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user user whose groups should be listed
- * @return bool|array false on error, all groups on success
- */
- protected function _getGroups($user) {
- $groups = array();
-
- if($this->dbcon) {
- $sql = str_replace('%{user}', $this->_escape($user), $this->getConf('getGroups'));
- $result = $this->_queryDB($sql);
-
- if($result !== false && count($result)) {
- foreach($result as $row) {
- $groups[] = $row['group'];
- }
- }
- return $groups;
- }
- return false;
- }
-
- /**
- * Retrieves the user id of a given user name
- *
- * The database connection must already be established
- * for this function to work. Otherwise it will return
- * false.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user user whose id is desired
- * @return mixed user id
- */
- protected function _getUserID($user) {
- if($this->dbcon) {
- $sql = str_replace('%{user}', $this->_escape($user), $this->getConf('getUserID'));
- $result = $this->_queryDB($sql);
- return $result === false ? false : $result[0]['id'];
- }
- return false;
- }
-
- /**
- * Adds a new User to the database.
- *
- * The database connection must already be established
- * for this function to work. Otherwise it will return
- * false.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Chris Smith <chris@jalakai.co.uk>
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user login of the user
- * @param string $pwd encrypted password
- * @param string $name full name of the user
- * @param string $mail email address
- * @param array $grps array of groups the user should become member of
- * @return bool
- */
- protected function _addUser($user, $pwd, $name, $mail, $grps) {
- if($this->dbcon && is_array($grps)) {
- $sql = str_replace('%{user}', $this->_escape($user), $this->getConf('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);
- $gid = false;
- $group = '';
-
- if($uid) {
- foreach($grps as $group) {
- $gid = $this->_addUserToGroup($user, $group, true);
- if($gid === false) break;
- }
-
- if($gid !== false){
- $this->_flushUserInfoCache($user);
- 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);
- $this->_debug("MySQL err: Adding user '$user' to group '$group' failed.", -1, __LINE__, __FILE__);
- }
- }
- }
- return false;
- }
-
- /**
- * Deletes a given user and all his group references.
- *
- * The database connection must already be established
- * for this function to work. Otherwise it will return
- * false.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user username of the user to be deleted
- * @return bool
- */
- protected function _delUser($user) {
- if($this->dbcon) {
- $uid = $this->_getUserID($user);
- if($uid) {
- $sql = str_replace('%{uid}', $this->_escape($uid), $this->getConf('delUserRefs'));
- $this->_modifyDB($sql);
- $sql = str_replace('%{uid}', $this->_escape($uid), $this->getConf('delUser'));
- $sql = str_replace('%{user}', $this->_escape($user), $sql);
- $this->_modifyDB($sql);
- $this->_flushUserInfoCache($user);
- return true;
- }
- }
- return false;
- }
-
- /**
- * Flush cached user information
- *
- * @author Christopher Smith <chris@jalakai.co.uk>
- *
- * @param string $user username of the user whose data is to be removed from the cache
- * if null, empty the whole cache
- */
- protected function _flushUserInfoCache($user=null) {
- if (is_null($user)) {
- $this->cacheUserInfo = array();
- } else {
- unset($this->cacheUserInfo[$user]);
- }
- }
-
- /**
- * Quick lookup to see if a user's information has been cached
- *
- * This test does not need a database connection or read lock
- *
- * @author Christopher Smith <chris@jalakai.co.uk>
- *
- * @param string $user username to be looked up in the cache
- * @param bool $requireGroups true, if cached info should include group memberships
- *
- * @return bool existence of required user information in the cache
- */
- protected function _cacheExists($user, $requireGroups=true) {
- if (isset($this->cacheUserInfo[$user])) {
- if (!is_array($this->cacheUserInfo[$user])) {
- return true; // user doesn't exist
- }
-
- if (!$requireGroups || isset($this->cacheUserInfo[$user]['grps'])) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Get a user's information
- *
- * The database connection must already be established for this function to work.
- *
- * @author Christopher Smith <chris@jalakai.co.uk>
- *
- * @param string $user username of the user whose information is being reterieved
- * @param bool $requireGroups true if group memberships should be included
- * @param bool $useCache true if ok to return cached data & to cache returned data
- *
- * @return mixed false|array false if the user doesn't exist
- * array containing user information if user does exist
- */
- protected function _getUserInfo($user, $requireGroups=true, $useCache=true) {
- $info = null;
-
- if ($useCache && isset($this->cacheUserInfo[$user])) {
- $info = $this->cacheUserInfo[$user];
- }
-
- if (is_null($info)) {
- $info = $this->_retrieveUserInfo($user);
- }
-
- if (($requireGroups == true) && $info && !isset($info['grps'])) {
- $info['grps'] = $this->_getGroups($user);
- }
-
- if ($useCache) {
- $this->cacheUserInfo[$user] = $info;
- }
-
- return $info;
- }
-
- /**
- * retrieveUserInfo
- *
- * Gets the data for a specific user. The database connection
- * must already be established for this function to work.
- * Otherwise it will return 'false'.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $user user's nick to get data for
- * @return false|array false on error, user info on success
- */
- protected function _retrieveUserInfo($user) {
- $sql = str_replace('%{user}', $this->_escape($user), $this->getConf('getUserInfo'));
- $result = $this->_queryDB($sql);
- if($result !== false && count($result)) {
- $info = $result[0];
- return $info;
- }
- return false;
- }
-
- /**
- * Updates the user info in the database
- *
- * Update a user data structure in the database according changes
- * given in an array. The user name can only be changes if it didn't
- * exists already. If the new user name exists the update procedure
- * will be aborted. The database keeps unchanged.
- *
- * The database connection has already to be established for this
- * function to work. Otherwise it will return 'false'.
- *
- * The password will be encrypted if necessary.
- *
- * @param string $user user's nick being updated
- * @param array $changes array of items to change as pairs of item and value
- * @return bool true on success or false on error
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- */
- protected function _updateUserInfo($user, $changes) {
- $sql = $this->getConf('updateUser')." ";
- $cnt = 0;
- $err = 0;
-
- if($this->dbcon) {
- $uid = $this->_getUserID($user);
- if ($uid === false) {
- return false;
- }
-
- 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->getConf('UpdateLogin'));
- } else if($item == 'name') {
- if($cnt++ > 0) $sql .= ", ";
- $sql .= str_replace('%{name}', $value, $this->getConf('UpdateName'));
- } else if($item == 'pass') {
- if(!$this->getConf('forwardClearPass'))
- $value = auth_cryptPassword($value);
- if($cnt++ > 0) $sql .= ", ";
- $sql .= str_replace('%{pass}', $value, $this->getConf('UpdatePass'));
- } else if($item == 'mail') {
- if($cnt++ > 0) $sql .= ", ";
- $sql .= str_replace('%{email}', $value, $this->getConf('UpdateEmail'));
- }
- }
-
- if($err == 0) {
- if($cnt > 0) {
- $sql .= " ".str_replace('%{uid}', $uid, $this->getConf('UpdateTarget'));
- if(get_class($this) == 'auth_mysql') $sql .= " LIMIT 1"; //some PgSQL inheritance comp.
- $this->_modifyDB($sql);
- $this->_flushUserInfoCache($user);
- }
- return true;
- }
- }
- return false;
- }
-
- /**
- * Retrieves the group id of a given group name
- *
- * The database connection must already be established
- * for this function to work. Otherwise it will return
- * false.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $group group name which id is desired
- * @return false|string group id
- */
- protected function _getGroupID($group) {
- if($this->dbcon) {
- $sql = str_replace('%{group}', $this->_escape($group), $this->getConf('getGroupID'));
- $result = $this->_queryDB($sql);
- return $result === false ? false : $result[0]['id'];
- }
- return false;
- }
-
- /**
- * Opens a connection to a database and saves the handle for further
- * usage in the object. The successful call to this functions is
- * essential for most functions in this object.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @return bool
- */
- protected function _openDB() {
- if(!$this->dbcon) {
- $con = @mysql_connect($this->getConf('server'), $this->getConf('user'), conf_decodeString($this->getConf('password')));
- if($con) {
- if((mysql_select_db($this->getConf('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($this->getConf('charset')) {
- mysql_query('SET CHARACTER SET "'.$this->getConf('charset').'"', $con);
- }
- return true; // connection and database successfully opened
- } else {
- mysql_close($con);
- $this->_debug("MySQL err: No access to database {$this->getConf('database')}.", -1, __LINE__, __FILE__);
- }
- } else {
- $this->_debug(
- "MySQL err: Connection to {$this->getConf('user')}@{$this->getConf('server')} not possible.",
- -1, __LINE__, __FILE__
- );
- }
-
- return false; // connection failed
- }
- return true; // connection already open
- }
-
- /**
- * Closes a database connection.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- */
- protected function _closeDB() {
- if($this->dbcon) {
- mysql_close($this->dbcon);
- $this->dbcon = 0;
- }
- }
-
- /**
- * Sends a SQL query to the database and transforms the result into
- * an associative array.
- *
- * This function is only able to handle queries that returns a
- * table such as SELECT.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $query SQL string that contains the query
- * @return array|false with the result table
- */
- protected function _queryDB($query) {
- if($this->getConf('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;
- }
- $this->_debug('MySQL err: '.mysql_error($this->dbcon), -1, __LINE__, __FILE__);
- }
- return false;
- }
-
- /**
- * Sends a SQL query to the database
- *
- * This function is only able to handle queries that returns
- * either nothing or an id value such as INPUT, DELETE, UPDATE, etc.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $query SQL string that contains the query
- * @return int|bool insert id or 0, false on error
- */
- protected function _modifyDB($query) {
- if($this->getConf('debug') >= 2) {
- msg('MySQL query: '.hsc($query), 0, __LINE__, __FILE__);
- }
-
- 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;
- }
- $this->_debug('MySQL err: '.mysql_error($this->dbcon), -1, __LINE__, __FILE__);
- }
- return false;
- }
-
- /**
- * Locked a list of tables for exclusive access so that modifications
- * to the database can't be disturbed by other threads. The list
- * could be set with $conf['plugin']['authmysql']['TablesToLock'] = array()
- *
- * If aliases for tables are used in SQL statements, also this aliases
- * must be locked. For eg. you use a table 'user' and the alias 'u' in
- * some sql queries, the array must looks like this (order is important):
- * array("user", "user AS u");
- *
- * MySQL V3 is not able to handle transactions with COMMIT/ROLLBACK
- * so that this functionality is simulated by this function. Nevertheless
- * it is not as powerful as transactions, it is a good compromise in safty.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $mode could be 'READ' or 'WRITE'
- * @return bool
- */
- protected function _lockTables($mode) {
- if($this->dbcon) {
- $ttl = $this->getConf('TablesToLock');
- if(is_array($ttl) && !empty($ttl)) {
- if($mode == "READ" || $mode == "WRITE") {
- $sql = "LOCK TABLES ";
- $cnt = 0;
- foreach($ttl as $table) {
- if($cnt++ != 0) $sql .= ", ";
- $sql .= "$table $mode";
- }
- $this->_modifyDB($sql);
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * Unlock locked tables. All existing locks of this thread will be
- * abrogated.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @return bool
- */
- protected function _unlockTables() {
- if($this->dbcon) {
- $this->_modifyDB("UNLOCK TABLES");
- return true;
- }
- return false;
- }
-
- /**
- * Transforms the filter settings in an filter string for a SQL database
- * The database connection must already be established, otherwise the
- * original SQL string without filter criteria will be returned.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $sql SQL string to which the $filter criteria should be added
- * @param array $filter array of filter criteria as pairs of item and pattern
- * @return string SQL string with attached $filter criteria on success, original SQL string on error
- */
- protected 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->getConf('FilterLogin'));
- } else if($item == 'name') {
- if($cnt++ > 0) $SQLfilter .= " AND ";
- $SQLfilter .= str_replace('%{name}', $tmp, $this->getConf('FilterName'));
- } else if($item == 'mail') {
- if($cnt++ > 0) $SQLfilter .= " AND ";
- $SQLfilter .= str_replace('%{email}', $tmp, $this->getConf('FilterEmail'));
- } else if($item == 'grps') {
- if($cnt++ > 0) $SQLfilter .= " AND ";
- $SQLfilter .= str_replace('%{group}', $tmp, $this->getConf('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;
- }
-
- /**
- * Escape a string for insertion into the database
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string $string The string to escape
- * @param boolean $like Escape wildcard chars as well?
- * @return string
- */
- protected 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;
- }
-
- /**
- * Wrapper around msg() but outputs only when debug is enabled
- *
- * @param string $message
- * @param int $err
- * @param int $line
- * @param string $file
- * @return void
- */
- protected function _debug($message, $err, $line, $file) {
- if(!$this->getConf('debug')) return;
- msg($message, $err, $line, $file);
- }
-}
diff --git a/lib/plugins/authmysql/conf/default.php b/lib/plugins/authmysql/conf/default.php
deleted file mode 100644
index 427bea273..000000000
--- a/lib/plugins/authmysql/conf/default.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-$conf['charset'] = 'utf8';
-$conf['server'] = '';
-$conf['user'] = '';
-$conf['password'] = '';
-$conf['database'] = '';
-$conf['debug'] = 0;
-$conf['forwardClearPass'] = 0;
-$conf['TablesToLock'] = array();
-$conf['checkPass'] = '';
-$conf['getUserInfo'] = '';
-$conf['getGroups'] = '';
-$conf['getUsers'] = '';
-$conf['FilterLogin'] = '';
-$conf['FilterName'] = '';
-$conf['FilterEmail'] = '';
-$conf['FilterGroup'] = '';
-$conf['SortOrder'] = '';
-$conf['addUser'] = '';
-$conf['addGroup'] = '';
-$conf['addUserGroup'] = '';
-$conf['delGroup'] = '';
-$conf['getUserID'] = '';
-$conf['delUser'] = '';
-$conf['delUserRefs'] = '';
-$conf['updateUser'] = '';
-$conf['UpdateLogin'] = '';
-$conf['UpdatePass'] = '';
-$conf['UpdateEmail'] = '';
-$conf['UpdateName'] = '';
-$conf['UpdateTarget'] = '';
-$conf['delUserGroup'] = '';
-$conf['getGroupID'] = ''; \ No newline at end of file
diff --git a/lib/plugins/authmysql/conf/metadata.php b/lib/plugins/authmysql/conf/metadata.php
deleted file mode 100644
index bad34e669..000000000
--- a/lib/plugins/authmysql/conf/metadata.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-$meta['server'] = array('string','_caution' => 'danger');
-$meta['user'] = array('string','_caution' => 'danger');
-$meta['password'] = array('password','_caution' => 'danger','_code' => 'base64');
-$meta['database'] = array('string','_caution' => 'danger');
-$meta['charset'] = array('string','_caution' => 'danger');
-$meta['debug'] = array('multichoice','_choices' => array(0,1,2),'_caution' => 'security');
-$meta['forwardClearPass'] = array('onoff','_caution' => 'danger');
-$meta['TablesToLock'] = array('array','_caution' => 'danger');
-$meta['checkPass'] = array('','_caution' => 'danger');
-$meta['getUserInfo'] = array('','_caution' => 'danger');
-$meta['getGroups'] = array('','_caution' => 'danger');
-$meta['getUsers'] = array('','_caution' => 'danger');
-$meta['FilterLogin'] = array('string','_caution' => 'danger');
-$meta['FilterName'] = array('string','_caution' => 'danger');
-$meta['FilterEmail'] = array('string','_caution' => 'danger');
-$meta['FilterGroup'] = array('string','_caution' => 'danger');
-$meta['SortOrder'] = array('string','_caution' => 'danger');
-$meta['addUser'] = array('','_caution' => 'danger');
-$meta['addGroup'] = array('','_caution' => 'danger');
-$meta['addUserGroup'] = array('','_caution' => 'danger');
-$meta['delGroup'] = array('','_caution' => 'danger');
-$meta['getUserID'] = array('','_caution' => 'danger');
-$meta['delUser'] = array('','_caution' => 'danger');
-$meta['delUserRefs'] = array('','_caution' => 'danger');
-$meta['updateUser'] = array('string','_caution' => 'danger');
-$meta['UpdateLogin'] = array('string','_caution' => 'danger');
-$meta['UpdatePass'] = array('string','_caution' => 'danger');
-$meta['UpdateEmail'] = array('string','_caution' => 'danger');
-$meta['UpdateName'] = array('string','_caution' => 'danger');
-$meta['UpdateTarget'] = array('string','_caution' => 'danger');
-$meta['delUserGroup'] = array('','_caution' => 'danger');
-$meta['getGroupID'] = array('','_caution' => 'danger');
diff --git a/lib/plugins/authmysql/lang/bg/lang.php b/lib/plugins/authmysql/lang/bg/lang.php
deleted file mode 100644
index d5837c726..000000000
--- a/lib/plugins/authmysql/lang/bg/lang.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Kiril <neohidra@gmail.com>
- */
-$lang['connectfail'] = 'Свързването с базата данни се провали.';
-$lang['userexists'] = 'За съжаление вече съществува потребител с това име.';
-$lang['usernotexists'] = 'За съжаление не съществува такъв потребител.';
diff --git a/lib/plugins/authmysql/lang/bg/settings.php b/lib/plugins/authmysql/lang/bg/settings.php
deleted file mode 100644
index cd6370218..000000000
--- a/lib/plugins/authmysql/lang/bg/settings.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Kiril <neohidra@gmail.com>
- * @author Ivan Peltekov <ivan.peltekov@abv.bg>
- */
-$lang['server'] = 'Вашият MySQL сървър';
-$lang['user'] = 'MySQL потребителско име';
-$lang['password'] = 'Парола за горния потребител';
-$lang['database'] = 'Име на базата от данни';
-$lang['charset'] = 'Набор от знаци, който се ползва в базата от данни';
-$lang['debug'] = 'Показване на допълнителна debug информация';
-$lang['checkPass'] = 'SQL заявка за проверка на паролите';
-$lang['getUserInfo'] = 'SQL заявка за извличане на информация за потребителя н';
-$lang['debug_o_0'] = 'не';
-$lang['debug_o_1'] = 'само при грешка';
-$lang['debug_o_2'] = 'за всяко SQL запитване';
diff --git a/lib/plugins/authmysql/lang/cs/lang.php b/lib/plugins/authmysql/lang/cs/lang.php
deleted file mode 100644
index 4dd63b437..000000000
--- a/lib/plugins/authmysql/lang/cs/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Jaroslav Lichtblau <jlichtblau@seznam.cz>
- */
-$lang['connectfail'] = 'Selhalo připojení k databázi.';
-$lang['userexists'] = 'Omlouváme se, ale uživatel s tímto jménem již existuje.';
-$lang['usernotexists'] = 'Omlouváme se, uživatel tohoto jména neexistuje.';
-$lang['writefail'] = 'Nelze změnit údaje uživatele. Informujte prosím správce wiki';
diff --git a/lib/plugins/authmysql/lang/cs/settings.php b/lib/plugins/authmysql/lang/cs/settings.php
deleted file mode 100644
index bc8e13620..000000000
--- a/lib/plugins/authmysql/lang/cs/settings.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author mkucera66 <mkucera66@seznam.cz>
- * @author Jaroslav Lichtblau <jlichtblau@seznam.cz>
- */
-$lang['server'] = 'Váš server MySQL';
-$lang['user'] = 'Uživatelské jméno pro MySQL';
-$lang['password'] = 'Heslo tohoto uživatele';
-$lang['database'] = 'Použtá databáze';
-$lang['charset'] = 'znaková sada použitá v databázi';
-$lang['debug'] = 'Zobrazit dodatečné debugovací informace';
-$lang['forwardClearPass'] = 'Posílat uživatelské heslo jako čistý text do příkazů SQL namísto využití volby passcrypt.';
-$lang['TablesToLock'] = 'Čárkou oddělený seznam tabulek, které mohou být zamčené během operací zápisu';
-$lang['checkPass'] = 'Příkaz SQL pro kontrolu hesel';
-$lang['getUserInfo'] = 'Příkaz SQL pro získání informací o uživateli';
-$lang['getGroups'] = 'Příkaz SQL pro získání uživatelovy skupiny';
-$lang['getUsers'] = 'Příkaz SQL pro seznam všech uživatelů';
-$lang['FilterLogin'] = 'Příkaz SQL pro filtrování uživatelů podle přihlašovacího jména';
-$lang['FilterName'] = 'Příkaz SQL pro filtrování uživatelů podle celého jména';
-$lang['FilterEmail'] = 'Příkaz SQL pro filtrování uživatelů podle adres e-mailů';
-$lang['FilterGroup'] = 'Příkaz SQL pro filtrování uživatelů podle členství ve skupinách';
-$lang['SortOrder'] = 'Příkaz SQL pro řazení uživatelů';
-$lang['addUser'] = 'Příkaz SQL pro přidání nového uživatele';
-$lang['addGroup'] = 'Příkaz SQL pro přidání nové skupiny';
-$lang['addUserGroup'] = 'Příkaz SQL pro přidání uživatele do existující skupiny';
-$lang['delGroup'] = 'Příkaz SQL pro vymazání skupiny';
-$lang['getUserID'] = 'Příkaz SQL pro získání primárního klíče uživatele';
-$lang['delUser'] = 'Příkaz SQL pro vymazání uživatele';
-$lang['delUserRefs'] = 'Příkaz SQL pro odstranění členství uživatele se všech skupin';
-$lang['updateUser'] = 'Příkaz SQL pro aktualizaci uživatelského profilu';
-$lang['UpdateLogin'] = 'Klauzule pro aktualizaci přihlačovacího jména uživatele';
-$lang['UpdatePass'] = 'Klauzule pro aktualizaci hesla uživatele';
-$lang['UpdateEmail'] = 'Klauzule pro aktualizaci e-mailové adresy uživatele';
-$lang['UpdateName'] = 'Klauzule pro aktualizaci celého jména uživatele';
-$lang['UpdateTarget'] = 'Omezující klauzule pro identifikaci uživatele při aktualizaci';
-$lang['delUserGroup'] = 'Příkaz SQL pro zrušení členství uživatele v dané skupině';
-$lang['getGroupID'] = 'Příkaz SQL pro získání primárního klíče skupiny';
-$lang['debug_o_0'] = 'nic';
-$lang['debug_o_1'] = 'pouze při chybách';
-$lang['debug_o_2'] = 'všechny dotazy SQL';
diff --git a/lib/plugins/authmysql/lang/cy/lang.php b/lib/plugins/authmysql/lang/cy/lang.php
deleted file mode 100644
index a96715c12..000000000
--- a/lib/plugins/authmysql/lang/cy/lang.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-/**
- * Welsh language file for authmysql plugin
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- */
-
-$lang['connectfail'] = 'Method y cysylltiad i\'r databas.';
-$lang['userexists'] = 'Sori, mae defnyddiwr gyda\'r enw mewngofnodi hwn eisoes yn bodoli.';
-$lang['usernotexists'] = 'Sori, \'dyw\'r defnyddiwr hwnnw ddim yn bodoli.';
-$lang['writefail'] = 'Methu â newid data defnyddiwr. Rhowch wybod i Weinyddwr y Wici';
-
-//Setup VIM: ex: et ts=4 :
diff --git a/lib/plugins/authmysql/lang/cy/settings.php b/lib/plugins/authmysql/lang/cy/settings.php
deleted file mode 100644
index 526cffa61..000000000
--- a/lib/plugins/authmysql/lang/cy/settings.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-$lang['server'] = 'Eich gweinydd MySQL';
-$lang['user'] = 'Defnyddair MySQL';
-$lang['password'] = 'Cyfrinair y defnyddiwr uchod';
-$lang['database'] = 'Databas i\'w ddefnyddio';
-$lang['charset'] = 'Set nodau i\'w defnyddio gyda\'r databas';
-$lang['debug'] = 'Dangos gwybodaeth dadfygio ychwanegol';
-$lang['forwardClearPass'] = 'Pasio cyfrineiriau defnyddwyr fel \'cleartext\' i\'r datganiadau SQL isod, yn hytrach na defnyddio\'r opsiwn \'passcrypt\'';
-$lang['TablesToLock'] = 'Rhestr a wahanwyd gan goma o dablau sydd angen eu cloi yn ystod gweithredoedd ysgrifennu';
-$lang['checkPass'] = 'Datganiad SQL i wirio cyfrineiriau';
-$lang['getUserInfo'] = 'Datganiad SQL i nôl gwybodaeth defnyddiwr';
-$lang['getGroups'] = 'Datganiad SQL i nôl aelodaeth grŵp y defnyddiwr';
-$lang['getUsers'] = 'Datganiad SQL i restru pob defnyddiwr';
-$lang['FilterLogin'] = 'Cymal SQL i hidlo defnyddwyr gan enw mewngofnodi';
-$lang['FilterName'] = 'Cymal SQL i hidlo defnyddwyr gan enw llawn';
-$lang['FilterEmail'] = 'Cymal SQL i hidlo defnyddwyr gan gyfeiriad ebost';
-$lang['FilterGroup'] = 'Cymal SQL i hidlo defnyddwyr gan aelodaeth grŵp';
-$lang['SortOrder'] = 'Cymal SQL i drefnu defnyddwyr';
-$lang['addUser'] = 'Datganiad SQL i ychwanegu defnyddiwr newydd';
-$lang['addGroup'] = 'Datganiad SQL i ychwanegu grŵp newydd';
-$lang['addUserGroup'] = 'Datganiad SQL i ychwanegu defnyddiwr newydd i grŵp sy\'n bodoli eisoes';
-$lang['delGroup'] = 'Datganiad SQL i dynnu grŵp';
-$lang['getUserID'] = 'Datganiad SQL i nôl prif allwedd y defnyddiwr';
-$lang['delUser'] = 'Datganiad SQL i ddileu defnyddiwr';
-$lang['delUserRefs'] = 'Datganiad SQL i dynnu defnyddiwr o bob grŵp';
-$lang['updateUser'] = 'Datganiad SQL i ddiweddaru proffil defnyddiwr';
-$lang['UpdateLogin'] = 'Cymal Diweddaru i ddiweddaru enw mewngofnodi defnyddiwr';
-$lang['UpdatePass'] = 'Cymal Diweddaru i ddiweddaru cyfrinair defnyddiwr';
-$lang['UpdateEmail'] = 'Cymal Diweddaru i ddiweddaru cyfeiriad ebost defnyddiwr';
-$lang['UpdateName'] = 'Cymal Diweddaru i ddiweddaru enw llawn defnyddiwr';
-$lang['UpdateTarget'] = 'Cymal Cyfyngu i adnabod y defnyddiwr wrth ddiweddaru';
-$lang['delUserGroup'] = 'Datganiad SQL i dynnu defnyddiwr oddi ar grŵp';
-$lang['getGroupID'] = 'Datganiad SQL i nôl prif allwedd grŵp penodol';
-
-
-$lang['debug_o_0'] = 'dim';
-$lang['debug_o_1'] = 'gyda gwallau yn unig';
-$lang['debug_o_2'] = 'pob ymholiad SQL';
diff --git a/lib/plugins/authmysql/lang/da/lang.php b/lib/plugins/authmysql/lang/da/lang.php
deleted file mode 100644
index 9806e1675..000000000
--- a/lib/plugins/authmysql/lang/da/lang.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Jon Theil Nielsen <jontheil@gmail.com>
- * @author Jacob Palm <mail@jacobpalm.dk>
- */
-$lang['connectfail'] = 'Kunne ikke forbinde til databasen.';
-$lang['userexists'] = 'Beklager, en bruger med dette login findes allerede.';
-$lang['usernotexists'] = 'Beklager, brugeren eksisterer ikke.';
-$lang['writefail'] = 'Kan ikke ændre brugerdata. Informér venligst wiki-administratoren';
diff --git a/lib/plugins/authmysql/lang/da/settings.php b/lib/plugins/authmysql/lang/da/settings.php
deleted file mode 100644
index 158765ca5..000000000
--- a/lib/plugins/authmysql/lang/da/settings.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Jens Hyllegaard <jens.hyllegaard@gmail.com>
- * @author soer9648 <soer9648@eucl.dk>
- * @author Jacob Palm <mail@jacobpalm.dk>
- */
-$lang['server'] = 'Din MySQL server';
-$lang['user'] = 'MySQL brugernavn';
-$lang['password'] = 'Kodeord til ovenstående bruger';
-$lang['database'] = 'Database der skal benyttes';
-$lang['charset'] = 'Tegnsæt benyttet i database';
-$lang['debug'] = 'Vis yderligere debug output';
-$lang['forwardClearPass'] = 'Videregiv bruger adgangskoder i klar tekst til nedenstående SQL statement, i stedet for at benytte passcrypt';
-$lang['TablesToLock'] = 'Kommasepareret liste over tabeller der skal låses under skrivning';
-$lang['checkPass'] = 'SQL-sætning til at kontrollere kodeord';
-$lang['getUserInfo'] = 'SQL-sætning til at hente brugerinformation';
-$lang['getGroups'] = 'SQL statement til at bestemme en brugers medlemskab af grupper';
-$lang['getUsers'] = 'SQL-sætning til at liste alle brugere';
-$lang['addUser'] = 'SQL-sætning til at tilføje en ny bruger';
-$lang['addGroup'] = 'SQL-sætning til at tilføje en ny gruppe';
-$lang['addUserGroup'] = 'SQL-sætning til at tilføje en bruger til en eksisterende gruppe';
-$lang['delGroup'] = 'SQL-sætning til at fjerne en gruppe';
-$lang['delUser'] = 'SQL-sætning til at slette en bruger';
-$lang['delUserRefs'] = 'SQL-sætning til at fjerne en bruger fra alle grupper';
-$lang['updateUser'] = 'SQL-sætning til at opdatere en brugerprofil';
-$lang['debug_o_0'] = 'ingen';
-$lang['debug_o_1'] = 'kun ved fejl';
-$lang['debug_o_2'] = 'alle SQL forespørgsler';
diff --git a/lib/plugins/authmysql/lang/de-informal/lang.php b/lib/plugins/authmysql/lang/de-informal/lang.php
deleted file mode 100644
index 11b130f90..000000000
--- a/lib/plugins/authmysql/lang/de-informal/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author rnck <dokuwiki@rnck.de>
- */
-$lang['connectfail'] = 'Konnte nicht zur Datenbank verbinden.';
-$lang['userexists'] = 'Entschuldigung, es existiert bereits ein Nutzer mit diesem Login.';
-$lang['usernotexists'] = 'Entschuldigung, dieser Nutzer existiert nicht.';
-$lang['writefail'] = 'Konnte Nutzer-Daten nicht modifizieren. Bitte informiere einen Admin.';
diff --git a/lib/plugins/authmysql/lang/de-informal/settings.php b/lib/plugins/authmysql/lang/de-informal/settings.php
deleted file mode 100644
index f6033d38b..000000000
--- a/lib/plugins/authmysql/lang/de-informal/settings.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Matthias Schulte <dokuwiki@lupo49.de>
- * @author Volker Bödker <volker@boedker.de>
- */
-$lang['server'] = 'MySQL-Server';
-$lang['user'] = 'Benutzername für den Zugriff auf den MySQL-Server.';
-$lang['password'] = 'Passwort des angegebenen Benutzers.';
-$lang['database'] = 'Zu verwendende Datenbank.';
-$lang['charset'] = 'Verwendetes Character-Set in der Datenbank.';
-$lang['debug'] = 'Debug-Informationen anzeigen?';
-$lang['forwardClearPass'] = 'Passwort der DokuWiki-Benutzer im Klartext an die Datenbank übergeben? (Im Normalfall wird die passcrypt-Option angewendet.)';
-$lang['TablesToLock'] = 'Eine Komma-separierte Liste von Tabellen, die vor Schreiboperationen gesperrt werden müssen.';
-$lang['checkPass'] = 'SQL-Kommando zum Überprüfen von Passwörtern.';
-$lang['getUserInfo'] = 'SQL-Kommando um Benutzerinformationen auszulesen.';
-$lang['getGroups'] = 'SQL-Kommando um Gruppen eines Benutzers auszulesen.';
-$lang['getUsers'] = 'SQL-Kommando um alle Benutzer auszulesen.';
-$lang['FilterLogin'] = 'SQL-Bedingung um Benutzer anhand ihres Anmeldenamens zu filtern.';
-$lang['FilterName'] = 'SQL-Bedingung um Benutzer anhand ihres Namens zu filtern.';
-$lang['FilterEmail'] = 'SQL-Bedingung um Benutzer anhand ihrer E-Mail-Adresse zu filtern.';
-$lang['FilterGroup'] = 'SQL-Bedingung um Benutzer anhand ihrer Gruppenzugehörigkeit zu filtern.';
-$lang['SortOrder'] = 'SQL-Bedingung um anhand der die Benutzerliste sortiert wird.';
-$lang['addUser'] = 'SQL-Kommando um einen neuen Benutzer anzulegen.';
-$lang['addGroup'] = 'SQL-Kommando um eine neue Gruppe anzulegen.';
-$lang['addUserGroup'] = 'SQL-Kommando um einen Benutzer zu einer Gruppe hinzuzufügen.';
-$lang['delGroup'] = 'SQL-Kommando um eine Gruppe zu löschen.';
-$lang['getUserID'] = 'SQL-Kommando um den Primärschlüssel des Benutzers auszulesen.';
-$lang['delUser'] = 'SQL-Kommando um einen Benutzer zu löschen.';
-$lang['delUserRefs'] = 'SQL-Kommando um einen Benutzer aus allen Gruppen zu entfernen.';
-$lang['updateUser'] = 'SQL-Kommando um das Profil eines Benutzers zu aktualisieren.';
-$lang['UpdateLogin'] = 'SQL-Bedingung um den Anmeldenamen eines Benutzers zu ändern.';
-$lang['UpdatePass'] = 'SQL-Bedingung um das Passwort eines Benutzers zu ändern.';
-$lang['UpdateEmail'] = 'SQL-Bedingung um die E-Mail-Adresse eines Benutzers zu ändern.';
-$lang['UpdateName'] = 'SQL-Bedingung um den Namen eines Benutzers zu ändern.';
-$lang['UpdateTarget'] = 'SQL-Bedingung zur eindeutigen Identifikation des Benutzers.';
-$lang['delUserGroup'] = 'SQL-Kommando um einen Benutzer aus einer angegeben Gruppe zu entfernen.';
-$lang['getGroupID'] = 'SQL-Kommando um den Primärschlüssel einer Gruppe auszulesen.';
-$lang['debug_o_0'] = 'Keine.';
-$lang['debug_o_1'] = 'Nur Fehler.';
-$lang['debug_o_2'] = 'Alle SQL-Abfragen.';
diff --git a/lib/plugins/authmysql/lang/de/lang.php b/lib/plugins/authmysql/lang/de/lang.php
deleted file mode 100644
index b5528230a..000000000
--- a/lib/plugins/authmysql/lang/de/lang.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Noel Tilliot <noeltilliot@byom.de>
- * @author Hendrik Diel <diel.hendrik@gmail.com>
- * @author Philip Knack <p.knack@stollfuss.de>
- */
-$lang['connectfail'] = 'Verbindung zur Datenbank fehlgeschlagen.';
-$lang['userexists'] = 'Entschuldigung, aber dieser Benutzername ist bereits vergeben.';
-$lang['usernotexists'] = 'Sorry, dieser Nutzer existiert nicht.';
-$lang['writefail'] = 'Die Benutzerdaten konnten nicht geändert werden. Bitte wenden Sie sich an den Wiki-Admin.';
diff --git a/lib/plugins/authmysql/lang/de/settings.php b/lib/plugins/authmysql/lang/de/settings.php
deleted file mode 100644
index 5b603e2c8..000000000
--- a/lib/plugins/authmysql/lang/de/settings.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Matthias Schulte <dokuwiki@lupo49.de>
- * @author Hella Breitkopf <hella.breitkopf@gmail.com>
- */
-$lang['server'] = 'MySQL-Server';
-$lang['user'] = 'Benutzername für den Zugriff auf den MySQL-Server.';
-$lang['password'] = 'Passwort des angegebenen Benutzers.';
-$lang['database'] = 'Zu verwendende Datenbank';
-$lang['charset'] = 'Zeichensatz der Datenbank';
-$lang['debug'] = 'Debug-Informationen anzeigen?';
-$lang['forwardClearPass'] = 'Passwort der DokuWiki-Benutzer im Klartext an die Datenbank übergeben? (Im Normalfall wird die passcrypt-Option angewendet.)';
-$lang['TablesToLock'] = 'Eine Komma-separierte Liste von Tabellen, die vor Schreiboperationen gesperrt werden müssen.';
-$lang['checkPass'] = 'SQL-Kommando zum Überprüfen von Passwörtern.';
-$lang['getUserInfo'] = 'SQL-Kommando um Benutzerinformationen auszulesen.';
-$lang['getGroups'] = 'SQL-Kommando um Gruppen eines Benutzers auszulesen.';
-$lang['getUsers'] = 'SQL-Kommando um alle Benutzer auszulesen.';
-$lang['FilterLogin'] = 'SQL-Bedingung um Benutzer anhand ihres Anmeldenamens zu filtern.';
-$lang['FilterName'] = 'SQL-Bedingung um Benutzer anhand ihres Namens zu filtern.';
-$lang['FilterEmail'] = 'SQL-Bedingung um Benutzer anhand ihrer E-Mail-Adresse zu filtern.';
-$lang['FilterGroup'] = 'SQL-Bedingung um Benutzer anhand ihrer Gruppenzugehörigkeit zu filtern.';
-$lang['SortOrder'] = 'SQL-Bedingung um anhand der die Benutzerliste sortiert wird.';
-$lang['addUser'] = 'SQL-Kommando um einen neuen Benutzer anzulegen.';
-$lang['addGroup'] = 'SQL-Kommando um eine neue Gruppe anzulegen.';
-$lang['addUserGroup'] = 'SQL-Kommando um einen Benutzer zu einer Gruppe hinzuzufügen.';
-$lang['delGroup'] = 'SQL-Kommando um eine Gruppe zu löschen.';
-$lang['getUserID'] = 'SQL-Kommando um den Primärschlüssel des Benutzers auszulesen.';
-$lang['delUser'] = 'SQL-Kommando um einen Benutzer zu löschen.';
-$lang['delUserRefs'] = 'SQL-Kommando um einen Benutzer aus allen Gruppen zu entfernen.';
-$lang['updateUser'] = 'SQL-Kommando um das Profil eines Benutzers zu aktualisieren.';
-$lang['UpdateLogin'] = 'SQL-Bedingung um den Anmeldenamen eines Benutzers zu ändern.';
-$lang['UpdatePass'] = 'SQL-Bedingung um das Passwort eines Benutzers zu ändern.';
-$lang['UpdateEmail'] = 'SQL-Bedingung um die E-Mail-Adresse eines Benutzers zu ändern.';
-$lang['UpdateName'] = 'SQL-Bedingung um den Namen eines Benutzers zu ändern.';
-$lang['UpdateTarget'] = 'SQL-Bedingung zur eindeutigen Identifikation des Benutzers.';
-$lang['delUserGroup'] = 'SQL-Kommando um einen Benutzer aus einer angegeben Gruppe zu entfernen.';
-$lang['getGroupID'] = 'SQL-Kommando um den Primärschlüssel einer Gruppe auszulesen.';
-$lang['debug_o_0'] = 'Keine.';
-$lang['debug_o_1'] = 'Nur Fehler.';
-$lang['debug_o_2'] = 'Alle SQL-Abfragen.';
diff --git a/lib/plugins/authmysql/lang/en/lang.php b/lib/plugins/authmysql/lang/en/lang.php
deleted file mode 100644
index 8313616c6..000000000
--- a/lib/plugins/authmysql/lang/en/lang.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-/**
- * English language file for authmysql plugin
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- */
-
-$lang['connectfail'] = 'Failed to connect to database.';
-$lang['userexists'] = 'Sorry, a user with this login already exists.';
-$lang['usernotexists'] = 'Sorry, that user doesn\'t exist.';
-$lang['writefail'] = 'Unable to modify user data. Please inform the Wiki-Admin';
-
-//Setup VIM: ex: et ts=4 :
diff --git a/lib/plugins/authmysql/lang/en/settings.php b/lib/plugins/authmysql/lang/en/settings.php
deleted file mode 100644
index b95f39701..000000000
--- a/lib/plugins/authmysql/lang/en/settings.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-$lang['server'] = 'Your MySQL server';
-$lang['user'] = 'MySQL user name';
-$lang['password'] = 'Password for above user';
-$lang['database'] = 'Database to use';
-$lang['charset'] = 'Character set used in database';
-$lang['debug'] = 'Display additional debug information';
-$lang['forwardClearPass'] = 'Pass user passwords as cleartext to the SQL statements below, instead of using the passcrypt option';
-$lang['TablesToLock'] = 'Comma separated list of tables that should be locked on write operations';
-$lang['checkPass'] = 'SQL statement for checking passwords';
-$lang['getUserInfo'] = 'SQL statement for retrieving user information';
-$lang['getGroups'] = 'SQL statement for retrieving a user\'s group memberships';
-$lang['getUsers'] = 'SQL statement to list all users';
-$lang['FilterLogin'] = 'SQL clause for filtering users by login name';
-$lang['FilterName'] = 'SQL clause for filtering users by full name';
-$lang['FilterEmail'] = 'SQL clause for filtering users by email address';
-$lang['FilterGroup'] = 'SQL clause for filtering users by group membership';
-$lang['SortOrder'] = 'SQL clause to sort users';
-$lang['addUser'] = 'SQL statement to add a new user';
-$lang['addGroup'] = 'SQL statement to add a new group';
-$lang['addUserGroup'] = 'SQL statement to add a user to an existing group';
-$lang['delGroup'] = 'SQL statement to remove a group';
-$lang['getUserID'] = 'SQL statement to get the primary key of a user';
-$lang['delUser'] = 'SQL statement to delete a user';
-$lang['delUserRefs'] = 'SQL statement to remove a user from all groups';
-$lang['updateUser'] = 'SQL statement to update a user profile';
-$lang['UpdateLogin'] = 'Update clause for updating the user\'s login name';
-$lang['UpdatePass'] = 'Update clause for updating the user\'s password';
-$lang['UpdateEmail'] = 'Update clause for updating the user\'s email address';
-$lang['UpdateName'] = 'Update clause for updating the user\'s full name';
-$lang['UpdateTarget'] = 'Limit clause to identify the user when updating';
-$lang['delUserGroup'] = 'SQL statement to remove a user from a given group';
-$lang['getGroupID'] = 'SQL statement to get the primary key of a given group';
-
-
-$lang['debug_o_0'] = 'none';
-$lang['debug_o_1'] = 'on errors only';
-$lang['debug_o_2'] = 'all SQL queries';
diff --git a/lib/plugins/authmysql/lang/eo/lang.php b/lib/plugins/authmysql/lang/eo/lang.php
deleted file mode 100644
index 818c392b2..000000000
--- a/lib/plugins/authmysql/lang/eo/lang.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>
- */
-$lang['usernotexists'] = 'Pardonu, tiu uzanto ne ekzistas.';
diff --git a/lib/plugins/authmysql/lang/eo/settings.php b/lib/plugins/authmysql/lang/eo/settings.php
deleted file mode 100644
index b85f81248..000000000
--- a/lib/plugins/authmysql/lang/eo/settings.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- */
-$lang['server'] = 'Via MySQL-servilo';
-$lang['user'] = 'MySQL uzantonomo';
-$lang['password'] = 'Pasvorto por tiu uzanto';
-$lang['database'] = 'Uzenda datumbazo';
-$lang['charset'] = 'Uzata tiparo en la datumbazo';
-$lang['debug'] = 'Ĉu montri aldonajn erarinformojn?';
-$lang['forwardClearPass'] = 'Ĉu transdoni pasvortojn klartekste al la SQL-frazoj sube anstataŭ uzi pasvortan kaŝon';
-$lang['TablesToLock'] = 'Komodisigita listo de tabeloj, al kiuj ne eblu skribi';
-$lang['checkPass'] = 'SQL-frazo por testi pasvortojn';
-$lang['getUserInfo'] = 'SQL-frazo por ricevi uzantajn informojn';
-$lang['getGroups'] = 'SQL-frazo por ricevi la grupmembrecojn de uzanto';
-$lang['getUsers'] = 'SQL-frazo por listigi ĉiujn uzantojn';
-$lang['FilterLogin'] = 'SQL-frazo por filtri uzantojn je ensaluta nomo';
-$lang['FilterName'] = 'SQL-frazo por filtri uzantojn je plena nomo';
-$lang['FilterEmail'] = 'SQL-frazo por filtri uzantojn je retpoŝtadreso';
-$lang['FilterGroup'] = 'SQL-frazo por filtri uzantojn je grupmembreco';
-$lang['SortOrder'] = 'SQL-frazo por ordigi uzantojn';
-$lang['addUser'] = 'SQL-frazo por aldoni novan uzanton';
-$lang['addGroup'] = 'SQL-frazo por aldoni novan grupon';
-$lang['addUserGroup'] = 'SQL-frazo por aldoni uzanton al ekzistanta grupo';
-$lang['delGroup'] = 'SQL-frazo por forigi grupon';
-$lang['getUserID'] = 'SQL-frazo por ricevi la ĉefan ŝlosilon de uzanto';
-$lang['delUser'] = 'SQL-frazo por forigi uzanton';
-$lang['delUserRefs'] = 'SQL-frazo por forigi uzanton el ĉiuj grupoj';
-$lang['updateUser'] = 'SQL-frazo por aktualigi uzantan profilon';
-$lang['UpdateLogin'] = 'Aktualiga frazo por uzanta ensalutnomo';
-$lang['UpdatePass'] = 'Aktualiga frazo por uzanta pasvorto';
-$lang['UpdateEmail'] = 'Aktualiga frazo por uzanta retpoŝtadreso';
-$lang['UpdateName'] = 'Aktualiga frazo por plena uzanta nomo';
-$lang['UpdateTarget'] = 'Limiga frazo por identigi la uzanton dum aktualigado';
-$lang['delUserGroup'] = 'SQL-frazo por forigi uzanton el indikita grupo';
-$lang['getGroupID'] = 'SQL-frazo por ricevi la ĉefan ŝlosilon de indikita grupo';
-$lang['debug_o_0'] = 'neniu';
-$lang['debug_o_1'] = 'nur dum eraroj';
-$lang['debug_o_2'] = 'ĉiuj SQL-serĉoj';
diff --git a/lib/plugins/authmysql/lang/es/lang.php b/lib/plugins/authmysql/lang/es/lang.php
deleted file mode 100644
index 3fc8228af..000000000
--- a/lib/plugins/authmysql/lang/es/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Domingo Redal <docxml@gmail.com>
- */
-$lang['connectfail'] = 'Error al conectar con la base de datos.';
-$lang['userexists'] = 'Lo sentimos, ya existe un usuario con ese inicio de sesión.';
-$lang['usernotexists'] = 'Lo sentimos, no existe ese usuario.';
-$lang['writefail'] = 'No es posible modificar los datos del usuario. Por favor, informa al Administrador del Wiki';
diff --git a/lib/plugins/authmysql/lang/es/settings.php b/lib/plugins/authmysql/lang/es/settings.php
deleted file mode 100644
index baa991d1b..000000000
--- a/lib/plugins/authmysql/lang/es/settings.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Antonio Bueno <atnbueno@gmail.com>
- * @author Eloy <ej.perezgomez@gmail.com>
- * @author Antonio Castilla <antoniocastilla@trazoide.com>
- * @author Alejandro Nunez <nunez.alejandro@gmail.com>
- * @author Domingo Redal <docxml@gmail.com>
- */
-$lang['server'] = 'Tu servidor MySQL';
-$lang['user'] = 'Nombre de usuario MySQL';
-$lang['password'] = 'Contraseña para el usuario de arriba.';
-$lang['database'] = 'Base de datos a usar';
-$lang['charset'] = 'Codificación usada en la base de datos';
-$lang['debug'] = 'Mostrar información adicional para depuración de errores';
-$lang['forwardClearPass'] = 'Enviar las contraseñas de usuario comotexto plano a las siguientes sentencias de SQL, en lugar de utilizar la opción passcrypt';
-$lang['TablesToLock'] = 'Lista separada por comasde las tablas a bloquear durante operaciones de escritura';
-$lang['checkPass'] = 'Sentencia SQL para verificar las contraseñas';
-$lang['getUserInfo'] = 'Sentencia SQL para obtener información del usuario';
-$lang['getGroups'] = 'Sentencia SQL para obtener la pertenencia a grupos de un usuario';
-$lang['getUsers'] = 'Sentencia SQL para listar todos los usuarios';
-$lang['FilterLogin'] = 'Cláusula SQL para filtrar usuarios por su nombre de usuario';
-$lang['FilterName'] = 'Cláusula SQL para filtrar usuarios por su nombre completo';
-$lang['FilterEmail'] = 'Cláusula SQL para filtrar usuarios por su dirección de correo electrónico';
-$lang['FilterGroup'] = 'Cláusula SQL para filtrar usuarios por su pertenencia a grupos';
-$lang['SortOrder'] = 'Cláusula SQL para ordenar usuarios';
-$lang['addUser'] = 'Sentencia SQL para agregar un nuevo usuario';
-$lang['addGroup'] = 'Sentencia SQL para agregar un nuevo grupo';
-$lang['addUserGroup'] = 'Sentencia SQL para agregar un usuario a un grupo existente';
-$lang['delGroup'] = 'Sentencia SQL para eliminar un grupo';
-$lang['getUserID'] = 'Sentencia SQL para obtener la clave primaria de un usuario';
-$lang['delUser'] = 'Sentencia SQL para eliminar un usuario';
-$lang['delUserRefs'] = 'Sentencia SQL para eliminar un usuario de todos los grupos';
-$lang['updateUser'] = 'Sentencia SQL para actualizar un perfil de usuario';
-$lang['UpdateLogin'] = 'Cláusula de actualización para actualizar el login del usuario';
-$lang['UpdatePass'] = 'Cláusula de actualización para actualizar la contraseña del usuario';
-$lang['UpdateEmail'] = 'Cláusula de actualización para actualizar la dirección de correo del usuario';
-$lang['UpdateName'] = 'Cláusula de actualización para actualizar el nomblre completo del usuario';
-$lang['UpdateTarget'] = 'Cláusula limite para identificar al usuario cuando se actualiza';
-$lang['delUserGroup'] = 'Sentencia SQL para eliminar un usuario de un grupo dado';
-$lang['getGroupID'] = 'Sentencia SQL para obtener la clave principal de un grupo dado';
-$lang['debug_o_0'] = 'ninguno';
-$lang['debug_o_1'] = 'sólo errores';
-$lang['debug_o_2'] = 'todas las consultas SQL';
diff --git a/lib/plugins/authmysql/lang/eu/lang.php b/lib/plugins/authmysql/lang/eu/lang.php
deleted file mode 100644
index 64083246f..000000000
--- a/lib/plugins/authmysql/lang/eu/lang.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Osoitz <oelkoro@gmail.com>
- */
-$lang['connectfail'] = 'Datu-basera konektatzeak huts egin du';
-$lang['userexists'] = 'Badago izen hori duen erabiltzaile bat.';
-$lang['usernotexists'] = 'Ez dago izen hori duen erabiltzailerik.';
diff --git a/lib/plugins/authmysql/lang/eu/settings.php b/lib/plugins/authmysql/lang/eu/settings.php
deleted file mode 100644
index 2a44a59ee..000000000
--- a/lib/plugins/authmysql/lang/eu/settings.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Osoitz <oelkoro@gmail.com>
- */
-$lang['server'] = 'Zure MYSQL zerbitzaria';
-$lang['user'] = 'MYSQL erabiltzaile-izena';
-$lang['password'] = 'Goiko erabiltzailearen pasahitza';
-$lang['database'] = 'Erabili beharreko datu-basea';
-$lang['charset'] = 'Datu-basean erabilitako karaktere kodeketa';
-$lang['forwardClearPass'] = 'Pasatu erabiltzaileen pasahitza testu argian beheko SQL esaldiei, passcrypt aukera erabili ordez';
-$lang['debug_o_0'] = 'bat ere ez';
diff --git a/lib/plugins/authmysql/lang/fa/lang.php b/lib/plugins/authmysql/lang/fa/lang.php
deleted file mode 100644
index b5b878628..000000000
--- a/lib/plugins/authmysql/lang/fa/lang.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Mohmmad Razavi <sepent@gmail.com>
- * @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
- */
-$lang['connectfail'] = 'خطا در اتصال به دیتابیس';
-$lang['userexists'] = 'با عرض پوزش، یک کاربر با این نام از قبل وجود دارد.';
-$lang['usernotexists'] = 'با عرض پوزش، آن کاربر وجود نداشت.';
-$lang['writefail'] = 'امکان تغییر داده کاربر وجود نداشت. لطفا مسئول Wiki را آگاه کنید.';
diff --git a/lib/plugins/authmysql/lang/fa/settings.php b/lib/plugins/authmysql/lang/fa/settings.php
deleted file mode 100644
index 4c708a05f..000000000
--- a/lib/plugins/authmysql/lang/fa/settings.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Mohamad Mehdi Habibi <habibi.esf@gmail.com>
- * @author Mohmmad Razavi <sepent@gmail.com>
- */
-$lang['server'] = 'سرور MySQL';
-$lang['user'] = 'نام کاربری MySQL';
-$lang['password'] = 'رمزعبور کاربر بالا';
-$lang['database'] = 'پایگاه داده مورد استفاده';
-$lang['charset'] = 'مجموعه کاراکترهایی (Character set) که در پایگاه داده بکار رفته';
-$lang['debug'] = 'نمایش اطلاعات بیشتر برای دیباگ';
-$lang['forwardClearPass'] = 'بجای استفاده از گزینه passcrypt، رمزعبورهای کاربر را بصورت آشکار به دستور SQL زیر پاس دهید.';
-$lang['TablesToLock'] = 'لیست جدولهایی که هنگام عملیات نوشتن باید قفل شود که با کاما از هم جدا شده اند';
-$lang['checkPass'] = 'دستور SQL برای بررسی رمزعبورها';
-$lang['getUserInfo'] = 'دستور SQL برای دریافت اطلاعات نام کاربری';
-$lang['getGroups'] = 'دستور SQL برای دریافت گروه‌های عضویت یک کاربر';
-$lang['getUsers'] = 'دستور SQL برای گرفتن لیست تمامی کاربران';
-$lang['FilterLogin'] = 'عبارت SQL برای فیلتر کردن کاربران با نام کاربری (login name)';
-$lang['FilterName'] = 'عبارت SQL برای فیلتر کردن کاربران با نام کامل';
-$lang['FilterEmail'] = 'عبارت SQL برای فیلتر کردن کابران با آدرس ایمیل';
-$lang['FilterGroup'] = 'عبارت SQL برای فیلتر کاربران با گروه عضویتشان';
-$lang['SortOrder'] = 'عبارت SQL برای مرتب کردن کاربران';
-$lang['addUser'] = 'دستور SQL برای اضافه کردن کاربر جدید';
-$lang['addGroup'] = 'دستور SQL برای اضافه کردن گروه جدید';
-$lang['addUserGroup'] = 'دستور SQL برای اضافه کردن یک کاربر به یک گروه موجود از قبل';
-$lang['delGroup'] = 'دستور SQL برای حذف یک گروه';
-$lang['getUserID'] = 'دستور SQL برای گرفتن کلید اصلی (primary key) یک کاربر';
-$lang['delUser'] = 'دستور SQL برای حذف یک کاربر';
-$lang['delUserRefs'] = 'دستور SQL برای حذف یک کابر از تمامی گروه‌ها';
-$lang['updateUser'] = 'دستور SQL برای بروزرسانی پروفایل یک کاربر';
-$lang['UpdateLogin'] = 'عبارت Update برای بروزرسانی نام کاربری (login name)';
-$lang['UpdatePass'] = 'عبارت Update برای بروزرسانی رمزعبور کاربر';
-$lang['UpdateEmail'] = 'عبارت Update برای بروزرسانی ادرسی ایمیل کاربر';
-$lang['UpdateName'] = 'عبارت Update برای بروزرسانی نام کامل کاربر';
-$lang['UpdateTarget'] = 'عبارت Limit برای شناسایی کابر هنگام بروزرسانی';
-$lang['delUserGroup'] = 'دستور SQL برای حذف یک کاربر ';
-$lang['getGroupID'] = 'دستور SQL برای گرفتن کلید اصلی (primary key) گروه داده شده';
-$lang['debug_o_0'] = 'هیچ';
-$lang['debug_o_1'] = 'فقط هنگام خطا';
-$lang['debug_o_2'] = 'تمام پرس‌وجوهای SQL';
diff --git a/lib/plugins/authmysql/lang/fi/settings.php b/lib/plugins/authmysql/lang/fi/settings.php
deleted file mode 100644
index 32517957b..000000000
--- a/lib/plugins/authmysql/lang/fi/settings.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Jussi Takala <jussi.takala@live.fi>
- */
-$lang['server'] = 'Sinun MySQL-serveri';
-$lang['user'] = 'MySQL-käyttäjänimi';
-$lang['password'] = 'Salasana yläolevalle käyttäjälle';
-$lang['charset'] = 'Käytetty merkistö tietokannassa';
diff --git a/lib/plugins/authmysql/lang/fr/lang.php b/lib/plugins/authmysql/lang/fr/lang.php
deleted file mode 100644
index 5e9fb6987..000000000
--- a/lib/plugins/authmysql/lang/fr/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Pietroni <pietroni@informatique.univ-paris-diderot.fr>
- */
-$lang['connectfail'] = 'Impossible de se connecter à la base de données.';
-$lang['userexists'] = 'Désolé, un utilisateur avec cet identifiant existe déjà.';
-$lang['usernotexists'] = 'Désolé, cet utilisateur n\'existe pas.';
-$lang['writefail'] = 'Impossible de modifier les données utilisateur. Veuillez en informer l\'administrateur du Wiki.';
diff --git a/lib/plugins/authmysql/lang/fr/settings.php b/lib/plugins/authmysql/lang/fr/settings.php
deleted file mode 100644
index a88b3256c..000000000
--- a/lib/plugins/authmysql/lang/fr/settings.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Bruno Veilleux <bruno.vey@gmail.com>
- */
-$lang['server'] = 'Votre serveur MySQL';
-$lang['user'] = 'Nom d\'utilisateur MySQL';
-$lang['password'] = 'Mot de passe pour l\'utilisateur ci-dessus';
-$lang['database'] = 'Base de données à utiliser';
-$lang['charset'] = 'Jeu de caractères utilisé dans la base de données';
-$lang['debug'] = 'Afficher des informations de débogage supplémentaires';
-$lang['forwardClearPass'] = 'Passer les mots de passe aux requêtes SQL ci-dessous en cleartext plutôt qu\'avec l\'option passcrypt';
-$lang['TablesToLock'] = 'Liste séparée par des virgules des tables devant être verrouillées par les opérations d\'écriture';
-$lang['checkPass'] = 'Requête SQL pour la vérification des mots de passe';
-$lang['getUserInfo'] = 'Requête SQL pour la récupération des informations d\'un utilisateur';
-$lang['getGroups'] = 'Requête SQL pour la récupération des groupes d\'un utilisateur';
-$lang['getUsers'] = 'Requête SQL pour énumérer tous les utilisateurs';
-$lang['FilterLogin'] = 'Clause SQL pour filtrer les utilisateurs par identifiant';
-$lang['FilterName'] = 'Clause SQL pour filtrer les utilisateurs par nom complet';
-$lang['FilterEmail'] = 'Clause SQL pour filtrer les utilisateurs par adresse électronique';
-$lang['FilterGroup'] = 'Clause SQL pour filtrer les utilisateurs par groupes';
-$lang['SortOrder'] = 'Clause SQL pour trier les utilisateurs';
-$lang['addUser'] = 'Requête SQL pour ajouter un nouvel utilisateur';
-$lang['addGroup'] = 'Requête SQL pour ajouter un nouveau groupe';
-$lang['addUserGroup'] = 'Requête SQL pour ajouter un utilisateur à un groupe existant';
-$lang['delGroup'] = 'Requête SQL pour retirer un groupe';
-$lang['getUserID'] = 'Requête SQL pour obtenir la clé primaire d\'un utilisateur';
-$lang['delUser'] = 'Requête SQL pour supprimer un utilisateur';
-$lang['delUserRefs'] = 'Requête SQL pour retirer un utilisateur de tous les groupes';
-$lang['updateUser'] = 'Requête SQL pour mettre à jour le profil d\'un utilisateur';
-$lang['UpdateLogin'] = 'Clause de mise à jour pour mettre à jour l\'identifiant d\'un utilisateur';
-$lang['UpdatePass'] = 'Clause de mise à jour pour mettre à jour le mot de passe d\'un utilisateur';
-$lang['UpdateEmail'] = 'Clause de mise à jour pour mettre à jour l\'adresse électronique d\'un utilisateur';
-$lang['UpdateName'] = 'Clause de mise à jour pour mettre à jour le nom complet d\'un utilisateur';
-$lang['UpdateTarget'] = 'Clause de limite pour identifier l\'utilisateur durant une mise à jour';
-$lang['delUserGroup'] = 'Requête SQL pour retirer un utilisateur d\'un groupe donné';
-$lang['getGroupID'] = 'Requête SQL pour obtenir la clé primaire d\'un groupe donné';
-$lang['debug_o_0'] = 'aucun';
-$lang['debug_o_1'] = 'sur erreur seulement';
-$lang['debug_o_2'] = 'toutes les requêtes SQL';
diff --git a/lib/plugins/authmysql/lang/he/settings.php b/lib/plugins/authmysql/lang/he/settings.php
deleted file mode 100644
index 22c30e52a..000000000
--- a/lib/plugins/authmysql/lang/he/settings.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Menashe Tomer <menashesite@gmail.com>
- */
-$lang['getUserID'] = 'שאילתת SQL לקבלת מפתח ראשי של המשתמש';
-$lang['UpdateLogin'] = 'שאילתת SQL לעדכון שם המשתמש';
-$lang['UpdatePass'] = 'שאילתת SQL לעדכון סיסמת המשתמש';
-$lang['UpdateEmail'] = 'שאילתת SQL לעדכון כתובת הדוא"ל של המשתמש';
-$lang['UpdateName'] = 'שאילתת SQL לעדכון שם המשתמש';
diff --git a/lib/plugins/authmysql/lang/hr/lang.php b/lib/plugins/authmysql/lang/hr/lang.php
deleted file mode 100644
index e839d6725..000000000
--- a/lib/plugins/authmysql/lang/hr/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Davor Turkalj <turki.bsc@gmail.com>
- */
-$lang['connectfail'] = 'Ne mogu se spojiti na bazu.';
-$lang['userexists'] = 'Oprostite ali korisnik s ovom prijavom već postoji.';
-$lang['usernotexists'] = 'Oprostite ali ovaj korisnik ne postoji.';
-$lang['writefail'] = 'Ne mogu izmijeniti podatke. Molim obavijestite Wiki administratora';
diff --git a/lib/plugins/authmysql/lang/hr/settings.php b/lib/plugins/authmysql/lang/hr/settings.php
deleted file mode 100644
index 370b645e8..000000000
--- a/lib/plugins/authmysql/lang/hr/settings.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Davor Turkalj <turki.bsc@gmail.com>
- */
-$lang['server'] = 'Vaš MySQL server';
-$lang['user'] = 'MySQL korisničko ime';
-$lang['password'] = 'Lozinka gore navedenog korisnika';
-$lang['database'] = 'Baza koja se koristi';
-$lang['charset'] = 'Znakovni set koji se koristi u bazi';
-$lang['debug'] = 'Prikaz dodatnih debug informacija';
-$lang['forwardClearPass'] = 'Proslijedi korisničku lozinku kao čisti tekst u SQL upitu niže, umjesto korištenja passcrypt opcije';
-$lang['TablesToLock'] = 'Zarezom odvojena lista tabela koje trebaju biti zaključane pri operacijama pisanja';
-$lang['checkPass'] = 'SQL izraz za provjeru lozinki';
-$lang['getUserInfo'] = 'SQL izraz za dohvaćanje informacija o korisniku';
-$lang['getGroups'] = 'SQL izraz za dohvaćanje članstva u grupama';
-$lang['getUsers'] = 'SQL izraz za ispis svih korisnika';
-$lang['FilterLogin'] = 'SQL izraz za izdvajanje korisnika po korisničkom imenu';
-$lang['FilterName'] = 'SQL izraz za izdvajanje korisnika po punom imenu';
-$lang['FilterEmail'] = 'SQL izraz za izdvajanje korisnika po adresi e-pošte';
-$lang['FilterGroup'] = 'SQL izraz za izdvajanje korisnika po članstvu u grupama';
-$lang['SortOrder'] = 'SQL izraz za sortiranje korisnika';
-$lang['addUser'] = 'SQL izraz za dodavanje novih korisnika';
-$lang['addGroup'] = 'SQL izraz za dodavanje novih grupa';
-$lang['addUserGroup'] = 'SQL izraz za dodavanje korisnika u postojeću grupu';
-$lang['delGroup'] = 'SQL izraz za uklanjanje grupe';
-$lang['getUserID'] = 'SQL izraz za dobivanje primarnog ključa korisnika';
-$lang['delUser'] = 'SQL izraz za brisanje korisnika';
-$lang['delUserRefs'] = 'SQL izraz za uklanjanje korisnika iz grupe';
-$lang['updateUser'] = 'SQL izraz za ažuriranje korisničkog profila';
-$lang['UpdateLogin'] = 'UPDATE izraz za ažuriranje korisničkog imena';
-$lang['UpdatePass'] = 'UPDATE izraz za ažuriranje korisničke lozinke';
-$lang['UpdateEmail'] = 'UPDATE izraz za ažuriranje korisničke email adrese';
-$lang['UpdateName'] = 'UPDATE izraz za ažuriranje punog imena korisnika';
-$lang['UpdateTarget'] = 'Limit izraz za identificiranje korisnika pri ažuriranju';
-$lang['delUserGroup'] = 'SQL izraz za uklanjanje korisnika iz zadane grupe';
-$lang['getGroupID'] = 'SQL izraz za dobivanje primarnoga ključa zadane grupe';
-$lang['debug_o_0'] = 'ništa';
-$lang['debug_o_1'] = 'u slučaju greške';
-$lang['debug_o_2'] = 'svi SQL upiti';
diff --git a/lib/plugins/authmysql/lang/hu/lang.php b/lib/plugins/authmysql/lang/hu/lang.php
deleted file mode 100644
index 3f48da335..000000000
--- a/lib/plugins/authmysql/lang/hu/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Marton Sebok <sebokmarton@gmail.com>
- */
-$lang['connectfail'] = 'Az adatbázishoz való csatlakozás sikertelen.';
-$lang['userexists'] = 'Sajnos már létezik ilyen azonosítójú felhasználó.';
-$lang['usernotexists'] = 'Sajnos ez a felhasználó nem létezik.';
-$lang['writefail'] = 'A felhasználói adatok módosítása sikertelen. Kérlek, fordulj a wiki rendszergazdájához!';
diff --git a/lib/plugins/authmysql/lang/hu/settings.php b/lib/plugins/authmysql/lang/hu/settings.php
deleted file mode 100644
index cf7b26bb9..000000000
--- a/lib/plugins/authmysql/lang/hu/settings.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Marton Sebok <sebokmarton@gmail.com>
- * @author Marina Vladi <deldadam@gmail.com>
- */
-$lang['server'] = 'MySQL-kiszolgáló';
-$lang['user'] = 'MySQL-felhasználónév';
-$lang['password'] = 'Fenti felhasználó jelszava';
-$lang['database'] = 'Adatbázis';
-$lang['charset'] = 'Az adatbázisban használt karakterkészlet';
-$lang['debug'] = 'Hibakeresési üzenetek megjelenítése';
-$lang['forwardClearPass'] = 'A jelszó nyílt szövegként történő átadása az alábbi SQL-utasításoknak a passcrypt opció használata helyett';
-$lang['TablesToLock'] = 'Az íráskor zárolni kívánt táblák vesszővel elválasztott listája';
-$lang['checkPass'] = 'SQL-utasítás a jelszavak ellenőrzéséhez';
-$lang['getUserInfo'] = 'SQL-utasítás a felhasználói információk lekérdezéséhez';
-$lang['getGroups'] = 'SQL-utasítás egy felhasználó csoporttagságainak lekérdezéséhez';
-$lang['getUsers'] = 'SQL-utasítás a felhasználók listázásához';
-$lang['FilterLogin'] = 'SQL-kifejezés a felhasználók azonosító alapú szűréséhez';
-$lang['FilterName'] = 'SQL-kifejezés a felhasználók név alapú szűréséhez';
-$lang['FilterEmail'] = 'SQL-kifejezés a felhasználók e-mail cím alapú szűréséhez';
-$lang['FilterGroup'] = 'SQL-kifejezés a felhasználók csoporttagság alapú szűréséhez';
-$lang['SortOrder'] = 'SQL-kifejezés a felhasználók rendezéséhez';
-$lang['addUser'] = 'SQL-utasítás új felhasználó hozzáadásához';
-$lang['addGroup'] = 'SQL-utasítás új csoport hozzáadásához';
-$lang['addUserGroup'] = 'SQL-utasítás egy felhasználó egy meglévő csoporthoz való hozzáadásához';
-$lang['delGroup'] = 'SQL-utasítás egy csoport törléséhez';
-$lang['getUserID'] = 'SQL-utasítás egy felhasználó elsődleges kulcsának lekérdezéséhez';
-$lang['delUser'] = 'SQL-utasítás egy felhasználó törléséhez';
-$lang['delUserRefs'] = 'SQL-utasítás egy felhasználó eltávolításához az összes csoportból';
-$lang['updateUser'] = 'SQL-utasítás egy felhasználó profiljának frissítéséhez';
-$lang['UpdateLogin'] = 'UPDATE-klauzula a felhasználó azonosítójának frissítéséhez';
-$lang['UpdatePass'] = 'UPDATE-klauzula a felhasználó jelszavának frissítéséhez';
-$lang['UpdateEmail'] = 'UPDATE-klauzula a felhasználó e-mail címének frissítéséhez';
-$lang['UpdateName'] = 'UPDATE-klauzula a felhasználó teljes nevének frissítéséhez';
-$lang['UpdateTarget'] = 'LIMIT-klauzula a felhasználó kiválasztásához az adatok frissítésekor';
-$lang['delUserGroup'] = 'SQL-utasítás felhasználó adott csoportból történő törléséhez ';
-$lang['getGroupID'] = 'SQL-utasítás adott csoport elsődleges kulcsának lekérdezéséhez';
-$lang['debug_o_0'] = 'nem';
-$lang['debug_o_1'] = 'csak hiba esetén';
-$lang['debug_o_2'] = 'minden SQL-lekérdezésnél';
diff --git a/lib/plugins/authmysql/lang/it/lang.php b/lib/plugins/authmysql/lang/it/lang.php
deleted file mode 100644
index 6ba3ef836..000000000
--- a/lib/plugins/authmysql/lang/it/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Torpedo <dgtorpedo@gmail.com>
- */
-$lang['connectfail'] = 'Connessione fallita al database.';
-$lang['userexists'] = 'Spiacente, esiste già un utente con queste credenziali.';
-$lang['usernotexists'] = 'Spiacente, quell\'utente non esiste.';
-$lang['writefail'] = 'Non è possibile cambiare le informazioni utente. Si prega di informare l\'Amministratore del wiki';
diff --git a/lib/plugins/authmysql/lang/it/settings.php b/lib/plugins/authmysql/lang/it/settings.php
deleted file mode 100644
index ec2d6703e..000000000
--- a/lib/plugins/authmysql/lang/it/settings.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Claudio Lanconelli <lancos@libero.it>
- * @author Mirko <malisan.mirko@gmail.com>
- * @author Francesco <francesco.cavalli@hotmail.com>
- * @author Maurizio <mcannavo@katamail.com>
- * @author Torpedo <dgtorpedo@gmail.com>
- */
-$lang['server'] = 'Il tuo server MySQL';
-$lang['user'] = 'User name di MySQL';
-$lang['password'] = 'Password per l\'utente di cui sopra';
-$lang['database'] = 'Database da usare';
-$lang['charset'] = 'Set di caratteri usato nel database';
-$lang['debug'] = 'Mostra ulteriori informazioni di debug';
-$lang['forwardClearPass'] = 'Fornisci le password utente come testo visibile alle istruzioni SQL qui sotto, invece che usare l\'opzione passcrypt';
-$lang['TablesToLock'] = 'Lista, separata da virgola, delle tabelle che devono essere bloccate in scrittura';
-$lang['checkPass'] = 'Istruzione SQL per il controllo password';
-$lang['getUserInfo'] = 'Istruzione SQL per recuperare le informazioni utente';
-$lang['getGroups'] = 'Istruzione SQL per recuperare il gruppo di appartenenza di un utente';
-$lang['getUsers'] = 'Istruzione SQL per listare tutti gli utenti';
-$lang['FilterLogin'] = 'Condizione SQL per per filtrare gli utenti in funzione del "login name"';
-$lang['FilterName'] = 'Condizione SQL per filtrare gli utenti in base al nome completo';
-$lang['FilterEmail'] = 'Condizione SQL per filtrare gli utenti in base all\'indirizzo e-mail';
-$lang['FilterGroup'] = 'Condizione SQL per filtrare gli utenti in base al gruppo di appartenenza';
-$lang['SortOrder'] = 'Condizione SQL per ordinare gli utenti';
-$lang['addUser'] = 'Istruzione SQL per aggiungere un nuovo utente';
-$lang['addGroup'] = 'Istruzione SQL per aggiungere un nuovo gruppo';
-$lang['addUserGroup'] = 'Istruzione SQL per aggiungere un utente ad un gruppo esistente';
-$lang['delGroup'] = 'Istruzione SQL per imuovere un gruppo';
-$lang['getUserID'] = 'Istruzione SQL per recuperare la primary key di un utente';
-$lang['delUser'] = 'Istruzione SQL per cancellare un utente';
-$lang['delUserRefs'] = 'Istruzione SQL per rimuovere un utente da tutti i gruppi';
-$lang['updateUser'] = 'Istruzione SQL per aggiornare il profilo utente';
-$lang['UpdateLogin'] = 'Condizione SQL per aggiornare il nome di accesso dell\'utente';
-$lang['UpdatePass'] = 'Condizione SQL per aggiornare la password utente';
-$lang['UpdateEmail'] = 'Condizione SQL per aggiornare l\'e-mail utente';
-$lang['UpdateName'] = 'Condizione SQL per aggiornare il nome completo dell\'utente';
-$lang['UpdateTarget'] = 'Condizione SQL per identificare l\'utente quando aggiornato';
-$lang['delUserGroup'] = 'Istruzione SQL per rimuovere un utente da un dato gruppo';
-$lang['getGroupID'] = 'Istruzione SQL per avere la primary key di un dato gruppo';
-$lang['debug_o_0'] = 'Nulla';
-$lang['debug_o_1'] = 'Solo in errore';
-$lang['debug_o_2'] = 'Tutte le query SQL';
diff --git a/lib/plugins/authmysql/lang/ja/lang.php b/lib/plugins/authmysql/lang/ja/lang.php
deleted file mode 100644
index 55c908b81..000000000
--- a/lib/plugins/authmysql/lang/ja/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Hideaki SAWADA <chuno@live.jp>
- */
-$lang['connectfail'] = 'データベースへの接続に失敗しました。';
-$lang['userexists'] = 'このログイン名のユーザーが既に存在しています。';
-$lang['usernotexists'] = 'そのユーザーは存在しません。';
-$lang['writefail'] = 'ユーザーデータを変更できません。Wiki の管理者に連絡してください。';
diff --git a/lib/plugins/authmysql/lang/ja/settings.php b/lib/plugins/authmysql/lang/ja/settings.php
deleted file mode 100644
index cc0146b15..000000000
--- a/lib/plugins/authmysql/lang/ja/settings.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Satoshi Sahara <sahara.satoshi@gmail.com>
- */
-$lang['server'] = 'MySQL のホスト名';
-$lang['user'] = 'MySQL 接続用ユーザー名';
-$lang['password'] = 'MySQL 接続用ユーザーのパスワード';
-$lang['database'] = '使用するデータベース名';
-$lang['charset'] = 'データベースの文字コード';
-$lang['debug'] = 'デバック情報を表示する';
-$lang['forwardClearPass'] = '以下で定義する SQL ステートメントにおいて, パスワード変数 を平文とする(DokiWiki側で暗号化しない)';
-$lang['TablesToLock'] = '書き込み時にロックするテーブル(コンマ区切りで列挙)';
-$lang['checkPass'] = 'パスワードの照合に用いる SQL ステートメント';
-$lang['getUserInfo'] = 'ユーザー情報の取得に用いる SQL ステートメント';
-$lang['getGroups'] = 'ユーザーが所属する全てのグループの取得に用いる SQL ステートメント';
-$lang['getUsers'] = 'ユーザーリストを取得する SQL ステートメント';
-$lang['FilterLogin'] = 'ユーザーリストをログイン名で絞り込む SQL 句';
-$lang['FilterName'] = 'ユーザーリストをフルネームで絞り込む SQL 句';
-$lang['FilterEmail'] = 'ユーザーリストをメールアドレスで絞り込む SQL 句';
-$lang['FilterGroup'] = 'ユーザーリストを所属グループで絞り込む SQL 句';
-$lang['SortOrder'] = 'ユーザーリストのソート方法を指定する SQL 句';
-$lang['addUser'] = '新規ユーザーを追加する SQL ステートメント';
-$lang['addGroup'] = '新規グループを追加する SQL ステートメント';
-$lang['addUserGroup'] = 'ユーザーをグループに配属する SQL ステートメント';
-$lang['delGroup'] = 'グループを削除する SQL ステートメント';
-$lang['getUserID'] = 'ユーザーIDの取得に用いる SQL ステートメント';
-$lang['delUser'] = 'ユーザーを削除する SQL ステートメント';
-$lang['delUserRefs'] = 'ユーザーのグループ所属を全て取り消す SQL ステートメント';
-$lang['updateUser'] = 'ユーザー情報を変更する SQL ステートメント';
-$lang['UpdateLogin'] = '変更後のログイン名を指定する SQL 句';
-$lang['UpdatePass'] = '変更後のパスワードを指定する SQL 句';
-$lang['UpdateEmail'] = '変更後のメールアドレスを指定する SQL 句';
-$lang['UpdateName'] = '変更後のフルネームを指定する SQL 句';
-$lang['UpdateTarget'] = '変更対象のユーザを特定するための SQL 句';
-$lang['delUserGroup'] = 'ユーザーをグループから除名する SQL ステートメント';
-$lang['getGroupID'] = 'グループIDの取得に用いる SQL ステートメント';
-$lang['debug_o_0'] = '表示しない';
-$lang['debug_o_1'] = 'エラー発生時のみ表示';
-$lang['debug_o_2'] = '全ての SQLクエリで表示';
diff --git a/lib/plugins/authmysql/lang/ko/lang.php b/lib/plugins/authmysql/lang/ko/lang.php
deleted file mode 100644
index 5e96a4403..000000000
--- a/lib/plugins/authmysql/lang/ko/lang.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author hyeonsoft <hyeonsoft@live.co.kr>
- * @author Myeongjin <aranet100@gmail.com>
- */
-$lang['connectfail'] = '데이터베이스에 연결하는 데 실패했습니다.';
-$lang['userexists'] = '죄송하지만 이 계정으로 이미 로그인한 사용자가 있습니다.';
-$lang['usernotexists'] = '죄송하지만 해당 사용자가 존재하지 않습니다.';
-$lang['writefail'] = '사용자 데이터를 수정할 수 없습니다. 위키 관리자에게 문의하시기 바랍니다';
diff --git a/lib/plugins/authmysql/lang/ko/settings.php b/lib/plugins/authmysql/lang/ko/settings.php
deleted file mode 100644
index ee7c1efde..000000000
--- a/lib/plugins/authmysql/lang/ko/settings.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Myeongjin <aranet100@gmail.com>
- * @author Garam <rowain8@gmail.com>
- */
-$lang['server'] = 'MySQL 서버';
-$lang['user'] = 'MySQL 사용자 이름';
-$lang['password'] = '위 사용자의 비밀번호';
-$lang['database'] = '사용할 데이터베이스';
-$lang['charset'] = '데이터베이스에 사용하는 문자 집합';
-$lang['debug'] = '추가적인 디버그 정보 보이기';
-$lang['forwardClearPass'] = 'passcrypt 옵션을 사용하는 대신 아래 SQL 문에 일반 텍스트로 사용자 비밀번호를 전달';
-$lang['TablesToLock'] = '쓰기 작업에 잠궈야 하는 테이블의 쉼표로 구분한 목록';
-$lang['checkPass'] = '비밀번호를 확인하기 위한 SQL 문';
-$lang['getUserInfo'] = '사용자 정보를 가져오기 위한 SQL 문';
-$lang['getGroups'] = '사용자의 그룹 구성원을 가져오기 위한 SQL 문';
-$lang['getUsers'] = '모든 사용자를 나타낼 SQL 문';
-$lang['FilterLogin'] = '로그인 이름별로 사용자를 필터하기 위한 SQL 조항';
-$lang['FilterName'] = '전체 이름별로 사용자를 필터하기 위한 SQL 조항';
-$lang['FilterEmail'] = '이메일 주소별로 사용자를 필터하기 위한 SQL 조항';
-$lang['FilterGroup'] = '그룹 구성원별로 사용자를 필터하기 위한 SQL 조항';
-$lang['SortOrder'] = '사용자를 정렬할 SQL 조항';
-$lang['addUser'] = '새 사용자를 추가할 SQL 문';
-$lang['addGroup'] = '새 그룹을 추가할 SQL 문';
-$lang['addUserGroup'] = '기존 그룹에 사용자를 추가할 SQL 문';
-$lang['delGroup'] = '그룹을 제거할 SQL 문';
-$lang['getUserID'] = '사용자의 기본 키를 얻을 SQL 문';
-$lang['delUser'] = '사용자를 삭제할 SQL 문';
-$lang['delUserRefs'] = '모든 그룹에서 사용자를 제거할 SQL 문';
-$lang['updateUser'] = '사용자 프로필을 업데이트할 SQL 문';
-$lang['UpdateLogin'] = '사용자의 로그인 이름을 업데이트하기 위한 Update 조항';
-$lang['UpdatePass'] = '사용자의 비밀번호를 업데이트하기 위한 Update 조항';
-$lang['UpdateEmail'] = '사용자의 이메일 주소를 업데이트하기 위한 Update 조항';
-$lang['UpdateName'] = '사용자의 전체 이름을 업데이트하기 위한 Update 조항';
-$lang['UpdateTarget'] = '업데이트할 때 사용자를 식별할 Limit 조항';
-$lang['delUserGroup'] = '주어진 그룹에서 사용자를 제거할 SQL 문';
-$lang['getGroupID'] = '주어진 그룹의 기본 키를 얻을 SQL 문';
-$lang['debug_o_0'] = '없음';
-$lang['debug_o_1'] = '오류에만';
-$lang['debug_o_2'] = '모든 SQL 쿼리';
diff --git a/lib/plugins/authmysql/lang/lv/settings.php b/lib/plugins/authmysql/lang/lv/settings.php
deleted file mode 100644
index 008ef344a..000000000
--- a/lib/plugins/authmysql/lang/lv/settings.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Oskars Pakers <oskars.pakers@gmail.com>
- * @author Aivars Miška <allefm@gmail.com>
- */
-$lang['server'] = 'Jūsu MySQL serveris';
-$lang['user'] = 'MySQL lietotāja vārds';
-$lang['password'] = 'Lietotāja parole';
-$lang['delUser'] = 'SQL pieprasījums lietotāja dzēšanai';
diff --git a/lib/plugins/authmysql/lang/nl/lang.php b/lib/plugins/authmysql/lang/nl/lang.php
deleted file mode 100644
index 1f6d8af73..000000000
--- a/lib/plugins/authmysql/lang/nl/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Hugo Smet <hugo.smet@scarlet.be>
- */
-$lang['connectfail'] = 'Connectie met de database mislukt.';
-$lang['userexists'] = 'Sorry, een gebruiker met deze login bestaat reeds.';
-$lang['usernotexists'] = 'Sorry, deze gebruiker bestaat niet.';
-$lang['writefail'] = 'Onmogelijk om de gebruikers data te wijzigen. Gelieve de Wiki-Admin te informeren.';
diff --git a/lib/plugins/authmysql/lang/nl/settings.php b/lib/plugins/authmysql/lang/nl/settings.php
deleted file mode 100644
index a4bab2dac..000000000
--- a/lib/plugins/authmysql/lang/nl/settings.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Remon <no@email.local>
- */
-$lang['server'] = 'De MySQL server';
-$lang['user'] = 'MySql gebruikersnaam';
-$lang['password'] = 'Wachtwoord van bovenstaande gebruiker';
-$lang['database'] = 'Te gebruiken database';
-$lang['charset'] = 'Tekenset voor database';
-$lang['debug'] = 'Tonen aanvullende debuginformatie';
-$lang['forwardClearPass'] = 'Wachtwoorden als leesbare tekst in SQL commando\'s opnemen in plaats van versleutelde tekens';
-$lang['TablesToLock'] = 'Kommagescheiden lijst van tabellen die gelocked moeten worden bij schrijfacties';
-$lang['checkPass'] = 'SQL commando voor het verifiëren van wachtwoorden';
-$lang['getUserInfo'] = 'SQL commando voor het ophalen van gebruikersinformatie';
-$lang['getGroups'] = 'SQL commando voor het ophalen van groepslidmaatschappen';
-$lang['getUsers'] = 'SQL commando voor het tonen van alle gebruikers';
-$lang['FilterLogin'] = 'SQL clausule voor het filteren van gebruikers op inlognaam';
-$lang['FilterName'] = 'SQL clausule voor het filteren van gebruikers op volledige naam';
-$lang['FilterEmail'] = 'SQL clausule voor het filteren van gebruikers op e-mailadres';
-$lang['FilterGroup'] = 'SQL clausule voor het filteren van gebruikers op groepslidmaatschap';
-$lang['SortOrder'] = 'SQL clausule voor het sorteren van gebruikers';
-$lang['addUser'] = 'SQL commando om een nieuwe gebruiker toe te voegen';
-$lang['addGroup'] = 'SQL commando om een nieuwe groep toe te voegen';
-$lang['addUserGroup'] = 'SQL commando om een gebruiker aan een bestaande groep toe te voegen';
-$lang['delGroup'] = 'SQL commando om een groep te verwijderen';
-$lang['getUserID'] = 'SQL commando om de de primaire sleutel van een gebruiker op te halen';
-$lang['delUser'] = 'SQL commando om een gebruiker te verwijderen';
-$lang['delUserRefs'] = 'SQL commando om een gebruiker uit alle groepen te verwijderen';
-$lang['updateUser'] = 'SQL commando om een gebruikersprofiel bij te werken';
-$lang['UpdateLogin'] = 'Bijwerkcommando om de inlognaam van de gebruiker bij te werken';
-$lang['UpdatePass'] = 'Bijwerkcommando om het wachtwoord van de gebruiker bij te werken';
-$lang['UpdateEmail'] = 'Bijwerkcommando om het e-mailadres van de gebruiker bij te werken';
-$lang['UpdateName'] = 'Bijwerkcommando om de volledige naam van de gebruiker bij te werken';
-$lang['UpdateTarget'] = 'Beperkingsclausule om de gebruiker te identificeren voor bijwerken';
-$lang['delUserGroup'] = 'SQL commando om een gebruiker uit een bepaalde groep te verwijderen';
-$lang['getGroupID'] = 'SQL commando om de primaire sletel van een bepaalde groep op te halen';
-$lang['debug_o_0'] = 'geen';
-$lang['debug_o_1'] = 'alleen bij fouten';
-$lang['debug_o_2'] = 'alle SQL queries';
diff --git a/lib/plugins/authmysql/lang/no/lang.php b/lib/plugins/authmysql/lang/no/lang.php
deleted file mode 100644
index 38377b561..000000000
--- a/lib/plugins/authmysql/lang/no/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Arne Hanssen <arne.hanssen@getmail.no>
- */
-$lang['connectfail'] = 'Klarte ikke koble til databasen.';
-$lang['userexists'] = 'Beklager, men en bruker med dette brukernavnet fins fra før.';
-$lang['usernotexists'] = 'Beklager med bruker fins ikke.';
-$lang['writefail'] = 'Klarte ikke endre brukerdata. Dette bør meldes til wikiens administrator';
diff --git a/lib/plugins/authmysql/lang/no/settings.php b/lib/plugins/authmysql/lang/no/settings.php
deleted file mode 100644
index 6d4134f7c..000000000
--- a/lib/plugins/authmysql/lang/no/settings.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Patrick <spill.p@hotmail.com>
- * @author Arne Hanssen <arne.hanssen@getmail.no>
- * @author Arne Hanssen <arnehans@getmail.no>
- */
-$lang['server'] = 'Din MySQL-server';
-$lang['user'] = 'Ditt MySQL-brukernavn';
-$lang['password'] = 'Passord til brukeren';
-$lang['database'] = 'Database som skal brukes';
-$lang['charset'] = 'Tegnsettet som datasen bruker';
-$lang['debug'] = 'Vis tilleggsinformasjon for feilsøking';
-$lang['forwardClearPass'] = 'Videresendt passord i klartekst til SQL-uttrykket under, i stedet for å bruke det krypterte passordet';
-$lang['TablesToLock'] = 'Kommaseparert liste over tabeller som må låses ved skriveopperasjoner';
-$lang['checkPass'] = 'SQL-uttrykk for å sjekke passord';
-$lang['getUserInfo'] = 'SQL-uttrykk for å hente informasjon om bruker';
-$lang['getGroups'] = 'SQL-uttrykk for å hente gruppene en bruker tilhører';
-$lang['getUsers'] = 'SQL-utrykk for å liste alle brukere';
-$lang['FilterLogin'] = 'SQL-utrykk for å filtrere brukere etter brukernavn';
-$lang['FilterName'] = 'SQL-utrykk for å filtrere brukere etter fult navn';
-$lang['FilterEmail'] = 'SQL-utrykk for å filtrere brukere etter e-postadresse';
-$lang['FilterGroup'] = 'SQL-uttrykk for å filtrere brukere etter hvilken grupper de tilhører';
-$lang['SortOrder'] = 'SQL-utrykk for å sortere brukere';
-$lang['addUser'] = 'SQL-utrykk for å legge til en ny bruker ';
-$lang['addGroup'] = 'SQL-utrykk for å legge til en ny gruppe';
-$lang['addUserGroup'] = 'SQL-uttrykk for å legge til en bruker i en eksisterende gruppe';
-$lang['delGroup'] = 'SQL-uttrykk for å fjerne en gruppe';
-$lang['getUserID'] = 'SQL-uttrykk for å hente primærnøkkel for en bruker';
-$lang['delUser'] = 'SQL-utrykk for å slette en bruker';
-$lang['delUserRefs'] = 'SQL-utrykk for å fjerne en bruke fra alle grupper';
-$lang['updateUser'] = 'SQL-uttrykk for å oppdatere en brukerprofil';
-$lang['UpdateLogin'] = 'Update-utrykk for å oppdatere brukernavn';
-$lang['UpdatePass'] = 'Update-utrykk for å oppdatere brukers passord';
-$lang['UpdateEmail'] = 'Update-utrykk for å oppdatere brukers e-postadresse';
-$lang['UpdateName'] = 'Update-utrykk for å oppdatere brukers fulle navn';
-$lang['UpdateTarget'] = 'Limit-uttrykk for å identifisere brukeren ved oppdatering';
-$lang['delUserGroup'] = 'SQL-uttrykk for å fjerne en bruker fra en gitt gruppe';
-$lang['getGroupID'] = 'SQL-uttrykk for å hente primærnøkkel for en gitt gruppe ';
-$lang['debug_o_0'] = 'ingen';
-$lang['debug_o_1'] = 'bare ved feil';
-$lang['debug_o_2'] = 'alle SQL-spørringer';
diff --git a/lib/plugins/authmysql/lang/pl/lang.php b/lib/plugins/authmysql/lang/pl/lang.php
deleted file mode 100644
index 14f645e67..000000000
--- a/lib/plugins/authmysql/lang/pl/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Wojciech Lichota <wojciech@lichota.pl>
- */
-$lang['connectfail'] = 'Nie można połączyć się z bazą danych.';
-$lang['userexists'] = 'Niestety, użytkownik o tym loginie już istnieje.';
-$lang['usernotexists'] = 'Niestety, taki użytkownik nie istnieje.';
-$lang['writefail'] = 'Nie można zmodyfikować danych użytkownika. Proszę poinformować administratora Wiki.';
diff --git a/lib/plugins/authmysql/lang/pl/settings.php b/lib/plugins/authmysql/lang/pl/settings.php
deleted file mode 100644
index e54372e57..000000000
--- a/lib/plugins/authmysql/lang/pl/settings.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Wojciech Lichota <wojciech@lichota.pl>
- * @author Paweł Jan Czochański <czochanski@gmail.com>
- * @author Mati <mackosa@wp.pl>
- * @author Maciej Helt <geraldziu@gmail.com>
- */
-$lang['server'] = 'Twój server MySQL';
-$lang['user'] = 'Nazwa użytkownika MySQL';
-$lang['password'] = 'Hasło dla powyższego użytkownika';
-$lang['database'] = 'Używana baza danych';
-$lang['charset'] = 'Zestaw znaków uzyty w bazie danych';
-$lang['debug'] = 'Wyświetlaj dodatkowe informacje do debugowania.';
-$lang['forwardClearPass'] = 'Zamiast używać opcji passcrypt, przekazuj hasła użytkowników jako czysty tekst do poniższej instrukcji SQL';
-$lang['TablesToLock'] = 'Rozdzielana przecinkami lista tabel, które powinny być blokowane podczas operacji zapisu';
-$lang['checkPass'] = 'Zapytanie SQL wykorzystywane do sprawdzania haseł.';
-$lang['getUserInfo'] = 'Zapytanie SQL zwracające informacje o użytkowniku';
-$lang['getGroups'] = 'Zapytanie SQL przynależność do grup danego użytkownika';
-$lang['getUsers'] = 'Zapytanie SQL zwracające listę wszystkich użytkowników';
-$lang['FilterLogin'] = 'Klauzula SQL używana do filtrowania użytkowników na podstawie ich loginu';
-$lang['FilterName'] = 'Klauzula SQL używana do filtrowania użytkowników na podstawie ich pełnej nazwy';
-$lang['FilterEmail'] = 'Klauzula SQL używana do filtrowania użytkowników na podstawie ich adresu email';
-$lang['FilterGroup'] = 'Klauzula SQL używana do filtrowania użytkowników na podstawie ich przynależności do grup';
-$lang['SortOrder'] = 'Klauzula SQL używana do sortowania użytkowników';
-$lang['addUser'] = 'Zapytanie SQL dodające nowego użytkownika';
-$lang['addGroup'] = 'Instrukcja SQL dodająca nową grupę';
-$lang['addUserGroup'] = 'Instrukcja SQL dodająca użytkownika do istniejącej grupy';
-$lang['delGroup'] = 'Instrukcja SQL usuwająca grupę';
-$lang['getUserID'] = 'Instrukcja SQL pobierająca klucz główny użytkownika';
-$lang['delUser'] = 'Instrukcja SQL usuwająca użytkownika';
-$lang['delUserRefs'] = 'Instrukcja SQL usuwająca użytkownika ze wszystkich grup';
-$lang['updateUser'] = 'Instrukcja SQL aktualizująca profil użytkownika';
-$lang['UpdateLogin'] = 'Polecenie służące do aktualizacji loginu użytkownika';
-$lang['UpdatePass'] = 'Polecenie służące do aktualizacji hasła użytkownika';
-$lang['UpdateEmail'] = 'Polecenie służące do aktualizacji e-mailu użytkownika';
-$lang['UpdateName'] = 'Polecenie służące do aktualizacji imienia i nazwiska użytkownika';
-$lang['UpdateTarget'] = 'Instrukcja limitu do identyfikacji użytkownika podczas aktualizacji';
-$lang['delUserGroup'] = 'Instrukcja SQL usuwająca użytkownika ze wskazanej grupy';
-$lang['getGroupID'] = 'Instrukcja SQL pobierający klucz główny wskazanej grupy';
-$lang['debug_o_0'] = 'brak';
-$lang['debug_o_1'] = 'tylko w przypadku błędów';
-$lang['debug_o_2'] = 'wszystkie zapytania SQL';
diff --git a/lib/plugins/authmysql/lang/pt-br/lang.php b/lib/plugins/authmysql/lang/pt-br/lang.php
deleted file mode 100644
index 02c4b9e1e..000000000
--- a/lib/plugins/authmysql/lang/pt-br/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Frederico Gonçalves Guimarães <frederico@teia.bio.br>
- */
-$lang['connectfail'] = 'Não foi possível conectar ao banco de dados.';
-$lang['userexists'] = 'Desculpe, mas já existe esse nome de usuário.';
-$lang['usernotexists'] = 'Desculpe, mas esse usuário não existe.';
-$lang['writefail'] = 'Não foi possível modificar os dados do usuário. Por favor, informe ao administrador do Wiki.';
diff --git a/lib/plugins/authmysql/lang/pt-br/settings.php b/lib/plugins/authmysql/lang/pt-br/settings.php
deleted file mode 100644
index cc637d6d4..000000000
--- a/lib/plugins/authmysql/lang/pt-br/settings.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Victor Westmann <victor.westmann@gmail.com>
- * @author Frederico Guimarães <frederico@teia.bio.br>
- */
-$lang['server'] = 'Seu servidor MySQL';
-$lang['user'] = 'usuário MySQL';
-$lang['password'] = 'Senha do usuário acima';
-$lang['database'] = 'Base de dados para usar';
-$lang['charset'] = 'Codificação de caracter usado na base de dados';
-$lang['debug'] = 'Mostrar informações adicionais de depuração';
-$lang['forwardClearPass'] = 'Passar senhas de usuários como texto puro para comandos SQL abaixo, ao invés de usar opção passcrypt';
-$lang['TablesToLock'] = 'Lista separada por vírgulas para tabelas que devem estar travadas em operações de escrita';
-$lang['checkPass'] = 'Comandos SQL para verificar senhas';
-$lang['getUserInfo'] = 'Comando SQL para obter informações de usuário';
-$lang['getGroups'] = 'Comando SQL para obter as credenciais de grupo de um usuário';
-$lang['getUsers'] = 'Comando SQL para listar todos os usuários';
-$lang['FilterLogin'] = 'Comando SQL para filtrar usuários pelo login';
-$lang['FilterName'] = 'Cláusula SQL para filtrar usuários por nome completo';
-$lang['FilterEmail'] = 'Cláusula SQL para filtrar usuários por endereço de email';
-$lang['FilterGroup'] = 'Cláusula SQL para filtrar usuários por membros de grupos';
-$lang['SortOrder'] = 'Cláusula SQL para ordenar usuários';
-$lang['addUser'] = 'Comando SQL para adicionar um novo usuário';
-$lang['addGroup'] = 'Comando SQL para adicionar um novo grupo';
-$lang['addUserGroup'] = 'Comando SQL para adicionar um usuário a um determinado grupo';
-$lang['delGroup'] = 'Comando SQL para remover um grupo';
-$lang['getUserID'] = 'Comando SQL para obter a chave primária de um usuário';
-$lang['delUser'] = 'Comando SQL para apagar um usuário';
-$lang['delUserRefs'] = 'Comando SQL para apagar um usuário de todos os grupos';
-$lang['updateUser'] = 'Comando SQL para atualizar perfil de usuário';
-$lang['UpdateLogin'] = 'Comando SQL para atualizar o login de um usuário';
-$lang['UpdatePass'] = 'Cláusula de atualização para atualizar senha de usuário';
-$lang['UpdateEmail'] = 'Cláusula de atualização para atualizar email do usuário';
-$lang['UpdateName'] = 'Cláusula de atualização para atualizar nome completo do usuário';
-$lang['UpdateTarget'] = 'Limitar cláusula para identificar usuário quando estiver atualizando';
-$lang['delUserGroup'] = 'Comando SQL para remover um usuário de um grupo determinado';
-$lang['getGroupID'] = 'Comando SQL para obter a chave primária de um grupo determinado';
-$lang['debug_o_0'] = 'nenhum';
-$lang['debug_o_1'] = 'apenas em erros';
-$lang['debug_o_2'] = 'todas as queries SQL';
diff --git a/lib/plugins/authmysql/lang/pt/lang.php b/lib/plugins/authmysql/lang/pt/lang.php
deleted file mode 100644
index 9e8bd6cd5..000000000
--- a/lib/plugins/authmysql/lang/pt/lang.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Paulo Carmino <contato@paulocarmino.com>
- * @author Guilherme Sá <guilherme.sa@hotmail.com>
- */
-$lang['connectfail'] = 'Falha ao conectar com o banco de dados.';
-$lang['userexists'] = 'Desculpe, esse login já está sendo usado.';
-$lang['usernotexists'] = 'Desculpe, esse login não existe.';
-$lang['writefail'] = 'Incapaz de modificar dados do usuário. Favor informar ao Wiki-Admin.';
diff --git a/lib/plugins/authmysql/lang/pt/settings.php b/lib/plugins/authmysql/lang/pt/settings.php
deleted file mode 100644
index 2488487fd..000000000
--- a/lib/plugins/authmysql/lang/pt/settings.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author André Neves <drakferion@gmail.com>
- * @author Guido Salatino <guidorafael23@gmail.com>
- */
-$lang['server'] = 'O seu servidor de MySQL';
-$lang['user'] = 'Utilizador MySQL';
-$lang['password'] = 'Senha para o utilizador acima';
-$lang['database'] = 'Base de dados a usar';
-$lang['charset'] = 'Conjunto de caracteres usado na base de dados';
-$lang['debug'] = 'Mostrar informação adicional de debug';
-$lang['forwardClearPass'] = 'Passe as senhas do usuário como texto puro para as instruções SQL abaixo, em vez de usar a opção passcrypt';
-$lang['TablesToLock'] = 'Lista de tabelas, separadas por virgula, que devem ser bloqueadas em operações de escrita';
-$lang['checkPass'] = 'Instrução SQL para verificar senhas';
-$lang['getUserInfo'] = 'Instrução SQL para recuperar informações do usuário';
-$lang['getGroups'] = 'Instrução SQL para recuperar os usuários participantes de um grupo';
-$lang['getUsers'] = 'Instrução SQL para listar todos usuários';
-$lang['FilterLogin'] = 'Cláusula SQL para filtrar utilizadores por tipo de login';
-$lang['FilterName'] = 'Cláusula SQL para filtrar utilizadores por nome completo';
-$lang['FilterEmail'] = 'Cláusula SQL para filtrar utilizadores por endereço de email';
-$lang['FilterGroup'] = 'Cláusula SQL para filtrar utilizadores por pertença a grupo';
-$lang['SortOrder'] = 'Cláusula SQL para ordenar utilizadores';
-$lang['addUser'] = 'Instrução SQL para adicionar novo usuário';
-$lang['addGroup'] = 'Instrução SQL para adicionar um novo grupo';
-$lang['addUserGroup'] = 'Instrução SQL para adicionar um usuário a um grupo existente';
-$lang['delGroup'] = 'Instrução SQL para remover um grupo';
-$lang['getUserID'] = 'Instrução SQL para obter a chave principal de um usuário';
-$lang['delUser'] = 'Instrução SQL para excluir um usuário';
-$lang['delUserRefs'] = 'Instrução SQL para excluir um usuário de todos os grupos';
-$lang['updateUser'] = 'Instrução SQL para atualizar um perfil de usuário';
-$lang['UpdateLogin'] = 'Cláusula de atualização para atualizar o nome de login do utilizador';
-$lang['UpdatePass'] = 'Cláusula de atualização para atualizar a senha do utilizador';
-$lang['UpdateEmail'] = 'Cláusula de atualização para atualizar o endereço de email do utilizador';
-$lang['UpdateName'] = 'Cláusula de atualização para atualizar o nome completo do utilizador';
-$lang['UpdateTarget'] = 'Cláusula limite para identificar o usuário ao atualizar';
-$lang['delUserGroup'] = 'Instrução SQL para remover um usuário de um determinado grupo';
-$lang['getGroupID'] = 'Instrução SQL para obter a chave principal de um determinado grupo';
-$lang['debug_o_0'] = 'nenhum';
-$lang['debug_o_1'] = 'só aquando de erros';
-$lang['debug_o_2'] = 'todas as consultas SQL';
diff --git a/lib/plugins/authmysql/lang/ru/lang.php b/lib/plugins/authmysql/lang/ru/lang.php
deleted file mode 100644
index 27153fd5c..000000000
--- a/lib/plugins/authmysql/lang/ru/lang.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Takumo <9206984@mail.ru>
- * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
- */
-$lang['connectfail'] = 'Ошибка соединения с базой данных.';
-$lang['userexists'] = 'Извините, пользователь с таким логином уже существует.';
-$lang['usernotexists'] = 'Извините, такой пользователь не существует.';
-$lang['writefail'] = 'Невозможно изменить данные пользователя. Сообщите об этом администратору вики.';
diff --git a/lib/plugins/authmysql/lang/ru/settings.php b/lib/plugins/authmysql/lang/ru/settings.php
deleted file mode 100644
index 810937782..000000000
--- a/lib/plugins/authmysql/lang/ru/settings.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Yuriy Skalko <yuriy.skalko@gmail.com>
- * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua)
- * @author Aleksandr Selivanov <alexgearbox@gmail.com>
- * @author Type-kun <workwork-1@yandex.ru>
- */
-$lang['server'] = 'Ваш MySQL-сервер';
-$lang['user'] = 'Имя пользователя MySQL';
-$lang['password'] = 'Пароль пользователя MySQL';
-$lang['database'] = 'Имя базы данных';
-$lang['charset'] = 'Используемый набор символов в базе данных';
-$lang['debug'] = 'Отображение дополнительной отладочной информации';
-$lang['forwardClearPass'] = 'Передача пароля пользователя открытым текстом, вместо зашифрованной формы, в используемом выражении SQL';
-$lang['TablesToLock'] = 'Имена таблиц (через запятую), которым необходимо ограничение для записи';
-$lang['checkPass'] = 'Выражение SQL, осуществляющее проверку пароля';
-$lang['getUserInfo'] = 'Выражение SQL, осуществляющее извлечение информации о пользователе';
-$lang['getGroups'] = 'Выражение SQL, осуществляющее извлечение информации о членстве пользователе в группах';
-$lang['getUsers'] = 'Выражение SQL, осуществляющее извлечение полного списка пользователей';
-$lang['FilterLogin'] = 'Выражение SQL, осуществляющее фильтрацию пользователей по логину';
-$lang['FilterName'] = 'Выражение SQL, осуществляющее фильтрацию пользователей по полному имени';
-$lang['FilterEmail'] = 'Выражение SQL, осуществляющее фильтрацию пользователей по адресу электронной почты';
-$lang['FilterGroup'] = 'Выражение SQL, осуществляющее фильтрацию пользователей согласно членству в группе';
-$lang['SortOrder'] = 'Выражение SQL, осуществляющее сортировку пользователей';
-$lang['addUser'] = 'Выражение SQL, осуществляющее добавление нового пользователя';
-$lang['addGroup'] = 'Выражение SQL, осуществляющее добавление новой группы';
-$lang['addUserGroup'] = 'Выражение SQL, осуществляющее добавление пользователя в существующую группу';
-$lang['delGroup'] = 'Выражение SQL, осуществляющее удаление группы';
-$lang['getUserID'] = 'Выражение SQL, обеспечивающее получение первичного ключа пользователя';
-$lang['delUser'] = 'Выражение SQL, осуществляющее удаление пользователя';
-$lang['delUserRefs'] = 'Выражение SQL, осуществляющее удаление пользователя из всех групп';
-$lang['updateUser'] = 'Выражение SQL, осуществляющее обновление профиля пользователя';
-$lang['UpdateLogin'] = 'Условие для обновления имени пользователя';
-$lang['UpdatePass'] = 'Условие для обновления пароля пользователя';
-$lang['UpdateEmail'] = 'Условие для обновления адреса электронной почты пользователя';
-$lang['UpdateName'] = 'Условие для обновления полного имени пользователя';
-$lang['UpdateTarget'] = 'Выражение \'LIMIT\' для идентификации пользователя при обновлении';
-$lang['delUserGroup'] = 'Выражение SQL, осуществляющее удаление пользователя из указанной группы';
-$lang['getGroupID'] = 'Выражение SQL, обеспечивающее получение первичного ключа указанной группы';
-$lang['debug_o_0'] = 'ни один из вариантов';
-$lang['debug_o_1'] = 'только при возникновении ошибок';
-$lang['debug_o_2'] = 'все SQL-запросы';
diff --git a/lib/plugins/authmysql/lang/sk/lang.php b/lib/plugins/authmysql/lang/sk/lang.php
deleted file mode 100644
index 9d792b7e9..000000000
--- a/lib/plugins/authmysql/lang/sk/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Martin Michalek <michalek.dev@gmail.com>
- */
-$lang['connectfail'] = 'Nepodarilo sa pripojiť k databáze.';
-$lang['userexists'] = 'Ľutujem, ale používateľ s týmto prihlasovacím menom už existuje.';
-$lang['usernotexists'] = 'Ľutujem, daný používateľ neexistuje.';
-$lang['writefail'] = 'Nie je možné zmeniť údaje používateľa, informujte prosím administrátora Wiki.';
diff --git a/lib/plugins/authmysql/lang/sk/settings.php b/lib/plugins/authmysql/lang/sk/settings.php
deleted file mode 100644
index 4def5d67d..000000000
--- a/lib/plugins/authmysql/lang/sk/settings.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Martin Michalek <michalek.dev@gmail.com>
- */
-$lang['server'] = 'MySQL server';
-$lang['user'] = 'Meno používateľa MySQL';
-$lang['password'] = 'Heslo pre vyššie uvedeného používateľa';
-$lang['database'] = 'Použiť databázu';
-$lang['charset'] = 'Znaková sada databázy';
-$lang['debug'] = 'Zobraziť dodatočné ladiace informácie';
-$lang['forwardClearPass'] = 'Posielať heslo ako nezakódovaný text nižšie uvedenému SQL príkazu namiesto použitia kódovania';
-$lang['TablesToLock'] = 'Zoznam tabuliek oddelených čiarkou, ktoré by mali byť uzamknuté pri operáciách zápisu';
-$lang['checkPass'] = 'SQL príkaz pre kontrolu hesla';
-$lang['getUserInfo'] = 'SQL príkaz pre získanie informácií o používateľovi';
-$lang['getGroups'] = 'SQL príkaz pre získanie informácií o skupinách používateľa';
-$lang['getUsers'] = 'SQL príkaz pre získanie zoznamu používateľov';
-$lang['FilterLogin'] = 'SQL podmienka pre filtrovanie používateľov podľa prihlasovacieho mena';
-$lang['FilterName'] = 'SQL podmienka pre filtrovanie používateľov podľa mena a priezviska';
-$lang['FilterEmail'] = 'SQL podmienka pre filtrovanie používateľov podľa emailovej adresy';
-$lang['FilterGroup'] = 'SQL podmienka pre filtrovanie používateľov podľa skupiny';
-$lang['SortOrder'] = 'SQL podmienka pre usporiadenia používateľov';
-$lang['addUser'] = 'SQL príkaz pre pridanie nového používateľa';
-$lang['addGroup'] = 'SQL príkaz pre pridanie novej skupiny';
-$lang['addUserGroup'] = 'SQL príkaz pre pridanie používateľa do existujúcej skupiny';
-$lang['delGroup'] = 'SQL príkaz pre zrušenie skupiny';
-$lang['getUserID'] = 'SQL príkaz pre získanie primárneho klúča používateľa';
-$lang['delUser'] = 'SQL príkaz pre zrušenie používateľa';
-$lang['delUserRefs'] = 'SQL príkaz pre vyradenie používateľa zo všetkých skupín';
-$lang['updateUser'] = 'SQL príkaz pre aktualizáciu informácií o používateľovi';
-$lang['UpdateLogin'] = 'SQL podmienka pre aktualizáciu prihlasovacieho mena používateľa';
-$lang['UpdatePass'] = 'SQL podmienka pre aktualizáciu hesla používateľa';
-$lang['UpdateEmail'] = 'SQL podmienka pre aktualizáciu emailovej adresy používateľa';
-$lang['UpdateName'] = 'SQL podmienka pre aktualizáciu mena a priezviska používateľa';
-$lang['UpdateTarget'] = 'Podmienka identifikácie používateľa pri aktualizácii';
-$lang['delUserGroup'] = 'SQL príkaz pre vyradenie používateľa z danej skupiny';
-$lang['getGroupID'] = 'SQL príkaz pre získanie primárneho kľúča skupiny';
-$lang['debug_o_0'] = 'žiadne';
-$lang['debug_o_1'] = 'iba pri chybách';
-$lang['debug_o_2'] = 'všetky SQL dopyty';
diff --git a/lib/plugins/authmysql/lang/sl/settings.php b/lib/plugins/authmysql/lang/sl/settings.php
deleted file mode 100644
index 8e0b58c40..000000000
--- a/lib/plugins/authmysql/lang/sl/settings.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Matej Urbančič <mateju@svn.gnome.org>
- */
-$lang['database'] = 'Podatkovna zbirka za uporabo';
-$lang['debug_o_0'] = 'brez';
-$lang['debug_o_1'] = 'le ob napakah';
-$lang['debug_o_2'] = 'vse poizvedbe SQL';
diff --git a/lib/plugins/authmysql/lang/sr/lang.php b/lib/plugins/authmysql/lang/sr/lang.php
deleted file mode 100644
index 7ec2fb6a5..000000000
--- a/lib/plugins/authmysql/lang/sr/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Марко М. Костић <marko.m.kostic@gmail.com>
- */
-$lang['connectfail'] = 'Нисам успео да се повежем на базу.';
-$lang['userexists'] = 'Нажалост, корисник са таквом пријавом већ постоји.';
-$lang['usernotexists'] = 'Нажалост, тај корисник не постоји.';
-$lang['writefail'] = 'Не могу да променим корисничке податке. Обавестите админа викија';
diff --git a/lib/plugins/authmysql/lang/sr/settings.php b/lib/plugins/authmysql/lang/sr/settings.php
deleted file mode 100644
index eabdfbc24..000000000
--- a/lib/plugins/authmysql/lang/sr/settings.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Марко М. Костић <marko.m.kostic@gmail.com>
- */
-$lang['server'] = 'Ваш MySQL сервер';
-$lang['user'] = 'MySQL корисничко име';
-$lang['password'] = 'Лозинка корисника изнад';
-$lang['database'] = 'База коју треба користити';
-$lang['charset'] = 'Кодни распоред коришћен у бази';
-$lang['debug'] = 'Прикажи додатне податке за поправљање грешака';
-$lang['forwardClearPass'] = 'Пренеси корисничке лозинке као чист текст у SQL изјавама испод уместо коришћења passcrypt опције';
-$lang['TablesToLock'] = 'Списак табела одвојених размаком које треба закључати приликом уписивања';
-$lang['checkPass'] = 'SQL упит за проверу лозинки';
-$lang['getUserInfo'] = 'SQL упит за добављање података о кориснику';
-$lang['getGroups'] = 'SQL за добављање корисничких учлањења у групе';
-$lang['getUsers'] = 'SQL упит за излиставање свих корисника';
-$lang['FilterLogin'] = 'SQL услов за филтрирање корисника по имену за пријаву';
-$lang['FilterName'] = 'SQL услов за филтрирање корисника по пуном имену';
-$lang['FilterEmail'] = 'SQL услов за филтрирање корисника по мејл адреси';
-$lang['FilterGroup'] = 'SQL услов за филтрирање корисника по чланству у групама';
-$lang['SortOrder'] = 'SQL услов за сортирање корисника';
-$lang['addUser'] = 'SQL упит за додавање новог корисника';
-$lang['addGroup'] = 'SQL упит за додавање нове групе';
-$lang['addUserGroup'] = 'SQL упит за додавање корисника у постојећу групу';
-$lang['delGroup'] = 'SQL упит за уклањање групе';
-$lang['getUserID'] = 'SQL упит за добављање примарног кључа корисника';
-$lang['delUser'] = 'SQL упит за брисање корисника';
-$lang['delUserRefs'] = 'SQL упит за брисање корисника из свих група';
-$lang['updateUser'] = 'SQL упит за ажурирање корисничког профила';
-$lang['UpdateLogin'] = 'Услов за ажурирање корисничког имена за пријаву';
-$lang['UpdatePass'] = 'Услов за ажурирање корисничке лозинке';
-$lang['UpdateEmail'] = 'Услов за ажурирање корисничке мејл адресе';
-$lang['UpdateName'] = 'Услов за ажурирање корисничког пуног имена';
-$lang['UpdateTarget'] = 'Ограничи услов да би се утврдио корисник приликом ажурирања';
-$lang['delUserGroup'] = 'SQL упит за уклањање корисника из дате групе';
-$lang['getGroupID'] = 'SQL упит за добављање примарног кључа дате групе';
-$lang['debug_o_0'] = 'ништа';
-$lang['debug_o_1'] = 'само на грешкама';
-$lang['debug_o_2'] = 'сви SQL упити';
diff --git a/lib/plugins/authmysql/lang/sv/lang.php b/lib/plugins/authmysql/lang/sv/lang.php
deleted file mode 100644
index 9c97bd7bb..000000000
--- a/lib/plugins/authmysql/lang/sv/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Tor Härnqvist <tor@harnqvist.se>
- */
-$lang['connectfail'] = 'Kunde inte ansluta till databas.';
-$lang['userexists'] = 'Tyvärr, en användare med denna inloggning existerar redan.';
-$lang['usernotexists'] = 'Tyvärr, den användaren existerar inte.';
-$lang['writefail'] = 'Kunde inte ändra användardata. Var god inormera Wiki-administratören.';
diff --git a/lib/plugins/authmysql/lang/sv/settings.php b/lib/plugins/authmysql/lang/sv/settings.php
deleted file mode 100644
index aa76b898f..000000000
--- a/lib/plugins/authmysql/lang/sv/settings.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Tor Härnqvist <tor@harnqvist.se>
- * @author Smorkster Andersson smorkster@gmail.com
- */
-$lang['server'] = 'Din MySQL server';
-$lang['user'] = 'Användarnamn för MySQL';
-$lang['password'] = 'Lösenord för användare ovan';
-$lang['database'] = 'Databas att använda';
-$lang['charset'] = 'Teckenuppsättning som används i databas';
-$lang['debug'] = 'Visa ytterligare felsökningsinformation';
-$lang['forwardClearPass'] = 'Skicka användares lösenord i klartext till SQL sats nedan, istället för att använda passcrypt alternativet';
-$lang['checkPass'] = 'SQL sats för kontroll av lösenord';
-$lang['getUserInfo'] = 'SQL sats för att hämta användarinformation';
-$lang['getGroups'] = 'SQL sats för att hämta en användares gruppmedlemskap';
-$lang['getUsers'] = 'SQL sats för att lista alla användare';
-$lang['addUser'] = 'SQL sats för att lägga till en användare';
-$lang['addGroup'] = 'SQL sats för att lägga till en grupp';
-$lang['addUserGroup'] = 'SQL sats för att lägga till en användare i en existerande grupp';
-$lang['delGroup'] = 'SQL sats för att ta bort en grupp';
-$lang['delUser'] = 'SQL sats för att ta bort en användare';
-$lang['delUserRefs'] = 'SQL sats för att ta bort en användare från alla grupper';
-$lang['updateUser'] = 'SQL sats för att uppdatera en användarprofil';
-$lang['delUserGroup'] = 'SQL sats för att ta bort en användare från en angiven grupp';
-$lang['debug_o_0'] = 'ingen';
-$lang['debug_o_1'] = 'enbart för fel';
diff --git a/lib/plugins/authmysql/lang/tr/lang.php b/lib/plugins/authmysql/lang/tr/lang.php
deleted file mode 100644
index b5c7b2fe1..000000000
--- a/lib/plugins/authmysql/lang/tr/lang.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Mete Cuma <mcumax@gmail.com>
- */
-$lang['connectfail'] = 'Veritabanına bağlantı kurulamadı.';
-$lang['usernotexists'] = 'Üzgünüz, kullanıcı mevcut değil.';
diff --git a/lib/plugins/authmysql/lang/tr/settings.php b/lib/plugins/authmysql/lang/tr/settings.php
deleted file mode 100644
index ca6a7c6ad..000000000
--- a/lib/plugins/authmysql/lang/tr/settings.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author ilker rifat kapaç <irifat@gmail.com>
- * @author İlker R. Kapaç <irifat@gmail.com>
- */
-$lang['server'] = 'Sizin MySQL sunucunuz';
-$lang['user'] = 'MySQL kullanıcısının adı';
-$lang['password'] = 'Üstteki kullanıcı için şifre';
-$lang['database'] = 'Kullanılacak veritabanı';
-$lang['charset'] = 'Veritabanında kullanılacak karakter seti';
-$lang['debug'] = 'İlave hata ayıklama bilgisini görüntüle';
-$lang['checkPass'] = 'Şifreleri kontrol eden SQL ifadesi';
-$lang['getUserInfo'] = 'Kullanıcı bilgilerini getiren SQL ifadesi';
-$lang['getGroups'] = 'Kullanıcının grup üyeliklerini getiren SQL ifadesi';
-$lang['getUsers'] = 'Tüm kullanıcıları listeleyen SQL ifadesi';
-$lang['FilterLogin'] = 'Kullanıcıları giriş yaptıkları isimlere göre süzmek için SQL şartı';
-$lang['FilterName'] = 'Kullanıcıları tam isimlerine göre süzmek için SQL şartı';
-$lang['FilterEmail'] = 'Kullanıcıları e-posta adreslerine göre süzmek için SQL şartı';
-$lang['FilterGroup'] = 'Kullanıcıları üye oldukları grup isimlerine göre süzmek için SQL şartı';
-$lang['SortOrder'] = 'Kullanıcıları sıralamak için SQL şartı';
-$lang['addUser'] = 'Yeni bir kullanıcı ekleyen SQL ifadesi';
-$lang['addGroup'] = 'Yeni bir grup ekleyen SQL ifadesi';
-$lang['addUserGroup'] = 'Varolan gruba yeni bir kullanıcı ekleyen SQL ifadesi';
-$lang['delGroup'] = 'Grup silen SQL ifadesi';
-$lang['getUserID'] = 'Kullanıcının birincil anahtarını getiren SQL ifadesi';
-$lang['delUser'] = 'Kullanıcı silen SQL ifadesi';
-$lang['delUserRefs'] = 'Kullanıcıyı tüm gruplardan çıkartan SQL ifadesi';
-$lang['updateUser'] = 'Kullanıcı profilini güncelleyen SQL ifadesi';
-$lang['UpdateLogin'] = 'Kullanıcının giriş yaptığı ismi güncelleyen, güncelleme şartı';
-$lang['UpdatePass'] = 'Kullanıcının şifresini güncelleyen, güncelleme şartı';
-$lang['UpdateEmail'] = 'Kullanıcının e-posta adresini güncelleyen, güncelleme şartı';
-$lang['UpdateName'] = 'Kullanıcının tam adını güncelleyen, güncelleme şartı';
-$lang['UpdateTarget'] = 'Güncelleme esnasında kullanıcıyı belirleyen, sınır şartı';
-$lang['delUserGroup'] = 'Kullanıcıyı verilen gruptan silen SQL ifadesi';
-$lang['getGroupID'] = 'Verilen grubun birincil anahtarını getiren SQL ifadesi';
-$lang['debug_o_0'] = 'hiçbiri';
-$lang['debug_o_1'] = 'sadece hata olduğunda';
-$lang['debug_o_2'] = 'tüm SQL sorguları';
diff --git a/lib/plugins/authmysql/lang/uk/lang.php b/lib/plugins/authmysql/lang/uk/lang.php
deleted file mode 100644
index e6cbaf026..000000000
--- a/lib/plugins/authmysql/lang/uk/lang.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Nina Zolotova <nina-z@i.ua>
- */
-$lang['connectfail'] = 'Не вдалося з\'єднатися з базою даних.';
-$lang['userexists'] = 'Вибачте, користувач з таким логіном вже існує.';
-$lang['usernotexists'] = 'Вибачте, такого користувача не існує.';
diff --git a/lib/plugins/authmysql/lang/zh-tw/settings.php b/lib/plugins/authmysql/lang/zh-tw/settings.php
deleted file mode 100644
index 3fbee151c..000000000
--- a/lib/plugins/authmysql/lang/zh-tw/settings.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author syaoranhinata@gmail.com
- */
-$lang['server'] = '您的 MySQL 伺服器';
-$lang['user'] = 'MySQL 使用者名稱';
-$lang['password'] = '上述使用者的密碼';
-$lang['database'] = '使用的資料庫';
-$lang['charset'] = '資料庫使用的字符集';
-$lang['debug'] = '顯示額外除錯資訊';
-$lang['forwardClearPass'] = '以明文形式,把使用者密碼傳送给下列的 SQL 語句,而不使用 passcrypt 密碼加密選項';
-$lang['TablesToLock'] = '在寫操作時需要鎖定的數據表列表,以逗號分隔';
-$lang['checkPass'] = '檢查密碼的 SQL 語句';
-$lang['getUserInfo'] = '獲取使用者訊息的 SQL 語句';
-$lang['getGroups'] = '獲取使用者群組成員身份的 SQL 語句';
-$lang['getUsers'] = '把所有使用者列出的 SQL 語句';
-$lang['FilterLogin'] = '根據登入名稱來篩選使用者的 SQL 子句';
-$lang['FilterName'] = '根據全名來篩選使用者的 SQL 子句';
-$lang['FilterEmail'] = '根據電郵地址來篩選使用者的 SQL 子句';
-$lang['FilterGroup'] = '根據群組成員身份來篩選使用者的 SQL 子句';
-$lang['SortOrder'] = '對使用者排序的 SQL 子句';
-$lang['addUser'] = '增加新使用者的 SQL 語句';
-$lang['addGroup'] = '增加新群組的 SQL 語句';
-$lang['addUserGroup'] = '把使用者新增至現有群組的 SQL 語句';
-$lang['delGroup'] = '把群組刪除的 SQL 語句';
-$lang['getUserID'] = '取得使用者主鍵的 SQL 語句';
-$lang['delUser'] = '把使用者刪除的 SQL 語句';
-$lang['delUserRefs'] = '把使用者從所有群組裏刪除的 SQL 語句';
-$lang['updateUser'] = '更新使用者訊息的 SQL 語句';
-$lang['UpdateLogin'] = '更新使用者登入名稱的 Update 子句';
-$lang['UpdatePass'] = '更新帳號密碼的 Update 子句';
-$lang['UpdateEmail'] = '更新使用者電郵地址的 Update 子句';
-$lang['UpdateName'] = '更新使用者全名的 Update 子句';
-$lang['UpdateTarget'] = '在更新時識別使用者的 Limit 子句';
-$lang['delUserGroup'] = '把使用者從指定群組中刪除的 SQL 語句';
-$lang['getGroupID'] = '取得指定群組主鍵的 SQL 語句';
-$lang['debug_o_0'] = '無';
-$lang['debug_o_1'] = '僅在有錯誤時';
-$lang['debug_o_2'] = '所有 SQL 查詢';
diff --git a/lib/plugins/authmysql/lang/zh/lang.php b/lib/plugins/authmysql/lang/zh/lang.php
deleted file mode 100644
index d96b7ba96..000000000
--- a/lib/plugins/authmysql/lang/zh/lang.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Errol <errol@hotmail.com>
- */
-$lang['connectfail'] = '连接数据库失败';
-$lang['userexists'] = '抱歉,用户名已被使用。';
-$lang['usernotexists'] = '抱歉,用户不存在。';
-$lang['writefail'] = '无法修改用户数据。请通知管理员';
diff --git a/lib/plugins/authmysql/lang/zh/settings.php b/lib/plugins/authmysql/lang/zh/settings.php
deleted file mode 100644
index 26ecc6b93..000000000
--- a/lib/plugins/authmysql/lang/zh/settings.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author lainme <lainme993@gmail.com>
- */
-$lang['server'] = '您的 MySQL 服务器';
-$lang['user'] = 'MySQL 用户名';
-$lang['password'] = '上述用户的密码';
-$lang['database'] = '使用的数据库';
-$lang['charset'] = '数据库中使用的字符集';
-$lang['debug'] = '显示额外调试信息';
-$lang['forwardClearPass'] = '将用户密码以明文形式传送给下面的 SQL 语句,而不使用 passcrypt 密码加密选项';
-$lang['TablesToLock'] = '在写操作时需要锁定的数据表列表,以逗号分隔';
-$lang['checkPass'] = '检查密码的 SQL 语句';
-$lang['getUserInfo'] = '获取用户信息的 SQL 语句';
-$lang['getGroups'] = '或许用户的组成员身份的 SQL 语句';
-$lang['getUsers'] = '列出所有用户的 SQL 语句';
-$lang['FilterLogin'] = '根据登录名筛选用户的 SQL 子句';
-$lang['FilterName'] = '根据全名筛选用户的 SQL 子句';
-$lang['FilterEmail'] = '根据电子邮件地址筛选用户的 SQL 子句';
-$lang['FilterGroup'] = '根据组成员身份筛选用户的 SQL 子句';
-$lang['SortOrder'] = '对用户排序的 SQL 子句';
-$lang['addUser'] = '添加新用户的 SQL 语句';
-$lang['addGroup'] = '添加新组的 SQL 语句';
-$lang['addUserGroup'] = '将用户添加到现有组的 SQL 语句';
-$lang['delGroup'] = '删除组的 SQL 语句';
-$lang['getUserID'] = '获取用户主键的 SQL 语句';
-$lang['delUser'] = '删除用户的 SQL 语句';
-$lang['delUserRefs'] = '从所有组中删除一个用户的 SQL 语句';
-$lang['updateUser'] = '更新用户信息的 SQL 语句';
-$lang['UpdateLogin'] = '更新用户登录名的 Update 子句';
-$lang['UpdatePass'] = '更新用户密码的 Update 子句';
-$lang['UpdateEmail'] = '更新用户电子邮件地址的 Update 子句';
-$lang['UpdateName'] = '更新用户全名的 Update 子句';
-$lang['UpdateTarget'] = '更新时识别用户的 Limit 子句';
-$lang['delUserGroup'] = '从指定组删除用户的 SQL 语句';
-$lang['getGroupID'] = '获取指定组主键的 SQL 语句';
-$lang['debug_o_0'] = '无';
-$lang['debug_o_1'] = '仅在有错误时';
-$lang['debug_o_2'] = '所有 SQL 查询';
diff --git a/lib/plugins/authmysql/plugin.info.txt b/lib/plugins/authmysql/plugin.info.txt
deleted file mode 100644
index 5f8493df1..000000000
--- a/lib/plugins/authmysql/plugin.info.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-base authmysql
-author Andreas Gohr
-email andi@splitbrain.org
-date 2015-07-13
-name [DEPRECATED] MYSQL Auth Plugin
-desc ▶This plugin will be removed from DokuWiki in a future release! Use authpdo instead.◀ Provides user authentication against a MySQL database
-url http://www.dokuwiki.org/plugin:authmysql
diff --git a/lib/plugins/authpdo/_test/mysql/mybb.sql b/lib/plugins/authpdo/_test/mysql/mybb.sql
index fdd1a9974..e83215c6e 100644
--- a/lib/plugins/authpdo/_test/mysql/mybb.sql
+++ b/lib/plugins/authpdo/_test/mysql/mybb.sql
@@ -30,13 +30,13 @@ CREATE TABLE `mybb_usergroups` (
`gid` smallint(5) unsigned NOT NULL,
`type` tinyint(1) unsigned NOT NULL DEFAULT '2',
`title` varchar(120) NOT NULL DEFAULT '',
- `description` text NOT NULL,
+ `description` text NOT NULL DEFAULT '',
`namestyle` varchar(200) NOT NULL DEFAULT '{username}',
`usertitle` varchar(120) NOT NULL DEFAULT '',
`stars` smallint(4) unsigned NOT NULL DEFAULT '0',
`starimage` varchar(120) NOT NULL DEFAULT '',
`image` varchar(120) NOT NULL DEFAULT '',
- `disporder` smallint(6) unsigned NOT NULL,
+ `disporder` smallint(6) unsigned NOT NULL DEFAULT '0',
`isbannedgroup` tinyint(1) NOT NULL DEFAULT '0',
`canview` tinyint(1) NOT NULL DEFAULT '0',
`canviewthreads` tinyint(1) NOT NULL DEFAULT '0',
@@ -209,7 +209,7 @@ CREATE TABLE `mybb_users` (
`google` varchar(75) NOT NULL DEFAULT '',
`birthday` varchar(15) NOT NULL DEFAULT '',
`birthdayprivacy` varchar(4) NOT NULL DEFAULT 'all',
- `signature` text NOT NULL,
+ `signature` text NOT NULL DEFAULT '',
`allownotices` tinyint(1) NOT NULL DEFAULT '0',
`hideemail` tinyint(1) NOT NULL DEFAULT '0',
`subscriptionmethod` tinyint(1) NOT NULL DEFAULT '0',
@@ -235,15 +235,15 @@ CREATE TABLE `mybb_users` (
`timezone` varchar(5) NOT NULL DEFAULT '',
`dst` tinyint(1) NOT NULL DEFAULT '0',
`dstcorrection` tinyint(1) NOT NULL DEFAULT '0',
- `buddylist` text NOT NULL,
- `ignorelist` text NOT NULL,
+ `buddylist` text NOT NULL DEFAULT '',
+ `ignorelist` text NOT NULL DEFAULT '',
`style` smallint(5) unsigned NOT NULL DEFAULT '0',
`away` tinyint(1) NOT NULL DEFAULT '0',
`awaydate` int(10) unsigned NOT NULL DEFAULT '0',
`returndate` varchar(15) NOT NULL DEFAULT '',
`awayreason` varchar(200) NOT NULL DEFAULT '',
- `pmfolders` text NOT NULL,
- `notepad` text NOT NULL,
+ `pmfolders` text NOT NULL DEFAULT '',
+ `notepad` text NOT NULL DEFAULT '',
`referrer` int(10) unsigned NOT NULL DEFAULT '0',
`referrals` int(10) unsigned NOT NULL DEFAULT '0',
`reputation` int(11) NOT NULL DEFAULT '0',
@@ -264,7 +264,7 @@ CREATE TABLE `mybb_users` (
`coppauser` tinyint(1) NOT NULL DEFAULT '0',
`classicpostbit` tinyint(1) NOT NULL DEFAULT '0',
`loginattempts` smallint(2) unsigned NOT NULL DEFAULT '1',
- `usernotes` text NOT NULL,
+ `usernotes` text NOT NULL DEFAULT '',
`sourceeditor` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=MyISAM AUTO_INCREMENT=88 DEFAULT CHARSET=utf8;
diff --git a/lib/plugins/authpdo/_test/sqlite.test.php b/lib/plugins/authpdo/_test/sqlite.test.php
index 35b612604..89cc9f60d 100644
--- a/lib/plugins/authpdo/_test/sqlite.test.php
+++ b/lib/plugins/authpdo/_test/sqlite.test.php
@@ -10,8 +10,8 @@ class testable_auth_plugin_authpdo extends auth_plugin_authpdo {
return 'authpdo';
}
- public function _selectGroups() {
- return parent::_selectGroups();
+ public function selectGroups() {
+ return parent::selectGroups();
}
public function addGroup($group) {
@@ -96,7 +96,7 @@ class sqlite_plugin_authpdo_test extends DokuWikiTest {
public function test_internals() {
$auth = new testable_auth_plugin_authpdo();
- $groups = $auth->_selectGroups();
+ $groups = $auth->selectGroups();
$this->assertArrayHasKey('user', $groups);
$this->assertEquals(1, $groups['user']['gid']);
$this->assertArrayHasKey('admin', $groups);
@@ -104,7 +104,7 @@ class sqlite_plugin_authpdo_test extends DokuWikiTest {
$ok = $auth->addGroup('test');
$this->assertTrue($ok);
- $groups = $auth->_selectGroups();
+ $groups = $auth->selectGroups();
$this->assertArrayHasKey('test', $groups);
$this->assertEquals(3, $groups['test']['gid']);
}
diff --git a/lib/plugins/authpdo/auth.php b/lib/plugins/authpdo/auth.php
index dfe125473..9c0968e30 100644
--- a/lib/plugins/authpdo/auth.php
+++ b/lib/plugins/authpdo/auth.php
@@ -6,13 +6,11 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
/**
* Class auth_plugin_authpdo
*/
-class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
+class auth_plugin_authpdo extends DokuWiki_Auth_Plugin
+{
/** @var PDO */
protected $pdo;
@@ -23,17 +21,18 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
/**
* Constructor.
*/
- public function __construct() {
+ public function __construct()
+ {
parent::__construct(); // for compatibility
- if(!class_exists('PDO')) {
- $this->_debug('PDO extension for PHP not found.', -1, __LINE__);
+ if (!class_exists('PDO')) {
+ $this->debugMsg('PDO extension for PHP not found.', -1, __LINE__);
$this->success = false;
return;
}
- if(!$this->getConf('dsn')) {
- $this->_debug('No DSN specified', -1, __LINE__);
+ if (!$this->getConf('dsn')) {
+ $this->debugMsg('No DSN specified', -1, __LINE__);
$this->success = false;
return;
}
@@ -49,15 +48,15 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // we want exceptions, not error codes
)
);
- } catch(PDOException $e) {
- $this->_debug($e);
+ } catch (PDOException $e) {
+ $this->debugMsg($e);
msg($this->getLang('connectfail'), -1);
$this->success = false;
return;
}
// can Users be created?
- $this->cando['addUser'] = $this->_chkcnf(
+ $this->cando['addUser'] = $this->checkConfig(
array(
'select-user',
'select-user-groups',
@@ -69,7 +68,7 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
);
// can Users be deleted?
- $this->cando['delUser'] = $this->_chkcnf(
+ $this->cando['delUser'] = $this->checkConfig(
array(
'select-user',
'select-user-groups',
@@ -80,7 +79,7 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
);
// can login names be changed?
- $this->cando['modLogin'] = $this->_chkcnf(
+ $this->cando['modLogin'] = $this->checkConfig(
array(
'select-user',
'select-user-groups',
@@ -89,7 +88,7 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
);
// can passwords be changed?
- $this->cando['modPass'] = $this->_chkcnf(
+ $this->cando['modPass'] = $this->checkConfig(
array(
'select-user',
'select-user-groups',
@@ -98,7 +97,7 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
);
// can real names be changed?
- $this->cando['modName'] = $this->_chkcnf(
+ $this->cando['modName'] = $this->checkConfig(
array(
'select-user',
'select-user-groups',
@@ -107,7 +106,7 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
);
// can real email be changed?
- $this->cando['modMail'] = $this->_chkcnf(
+ $this->cando['modMail'] = $this->checkConfig(
array(
'select-user',
'select-user-groups',
@@ -116,7 +115,7 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
);
// can groups be changed?
- $this->cando['modGroups'] = $this->_chkcnf(
+ $this->cando['modGroups'] = $this->checkConfig(
array(
'select-user',
'select-user-groups',
@@ -128,21 +127,21 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
);
// can a filtered list of users be retrieved?
- $this->cando['getUsers'] = $this->_chkcnf(
+ $this->cando['getUsers'] = $this->checkConfig(
array(
'list-users'
)
);
// can the number of users be retrieved?
- $this->cando['getUserCount'] = $this->_chkcnf(
+ $this->cando['getUserCount'] = $this->checkConfig(
array(
'count-users'
)
);
// can a list of available groups be retrieved?
- $this->cando['getGroups'] = $this->_chkcnf(
+ $this->cando['getGroups'] = $this->checkConfig(
array(
'select-groups'
)
@@ -154,28 +153,29 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
/**
* Check user+password
*
- * @param string $user the user name
- * @param string $pass the clear text password
+ * @param string $user the user name
+ * @param string $pass the clear text password
* @return bool
*/
- public function checkPass($user, $pass) {
+ public function checkPass($user, $pass)
+ {
- $userdata = $this->_selectUser($user);
- if($userdata == false) return false;
+ $userdata = $this->selectUser($user);
+ if ($userdata == false) return false;
// password checking done in SQL?
- if($this->_chkcnf(array('check-pass'))) {
+ if ($this->checkConfig(array('check-pass'))) {
$userdata['clear'] = $pass;
$userdata['hash'] = auth_cryptPassword($pass);
- $result = $this->_query($this->getConf('check-pass'), $userdata);
- if($result === false) return false;
+ $result = $this->query($this->getConf('check-pass'), $userdata);
+ if ($result === false) return false;
return (count($result) == 1);
}
// we do password checking on our own
- if(isset($userdata['hash'])) {
+ if (isset($userdata['hash'])) {
// hashed password
- $passhash = new PassHash();
+ $passhash = new \dokuwiki\PassHash();
return $passhash->verify_hash($pass, $userdata['hash']);
} else {
// clear text password in the database O_o
@@ -193,20 +193,21 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
* mail string email addres of the user
* grps array list of groups the user is in
*
- * @param string $user the user name
- * @param bool $requireGroups whether or not the returned data must include groups
+ * @param string $user the user name
+ * @param bool $requireGroups whether or not the returned data must include groups
* @return array|bool containing user data or false
*/
- public function getUserData($user, $requireGroups = true) {
- $data = $this->_selectUser($user);
- if($data == false) return false;
+ public function getUserData($user, $requireGroups = true)
+ {
+ $data = $this->selectUser($user);
+ if ($data == false) return false;
- if(isset($data['hash'])) unset($data['hash']);
- if(isset($data['clean'])) unset($data['clean']);
+ if (isset($data['hash'])) unset($data['hash']);
+ if (isset($data['clean'])) unset($data['clean']);
- if($requireGroups) {
- $data['grps'] = $this->_selectUserGroups($data);
- if($data['grps'] === false) return false;
+ if ($requireGroups) {
+ $data['grps'] = $this->selectUserGroups($data);
+ if ($data['grps'] === false) return false;
}
return $data;
@@ -223,23 +224,24 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
*
* Set addUser capability when implemented
*
- * @param string $user
- * @param string $clear
- * @param string $name
- * @param string $mail
- * @param null|array $grps
+ * @param string $user
+ * @param string $clear
+ * @param string $name
+ * @param string $mail
+ * @param null|array $grps
* @return bool|null
*/
- public function createUser($user, $clear, $name, $mail, $grps = null) {
+ public function createUser($user, $clear, $name, $mail, $grps = null)
+ {
global $conf;
- if(($info = $this->getUserData($user, false)) !== false) {
+ if (($info = $this->getUserData($user, false)) !== false) {
msg($this->getLang('userexists'), -1);
return false; // user already exists
}
// prepare data
- if($grps == null) $grps = array();
+ if ($grps == null) $grps = array();
array_unshift($grps, $conf['defaultgroup']);
$grps = array_unique($grps);
$hash = auth_cryptPassword($clear);
@@ -249,25 +251,25 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
$this->pdo->beginTransaction();
{
// insert the user
- $ok = $this->_query($this->getConf('insert-user'), $userdata);
- if($ok === false) goto FAIL;
+ $ok = $this->query($this->getConf('insert-user'), $userdata);
+ if ($ok === false) goto FAIL;
$userdata = $this->getUserData($user, false);
- if($userdata === false) goto FAIL;
+ if ($userdata === false) goto FAIL;
// create all groups that do not exist, the refetch the groups
- $allgroups = $this->_selectGroups();
- foreach($grps as $group) {
- if(!isset($allgroups[$group])) {
+ $allgroups = $this->selectGroups();
+ foreach ($grps as $group) {
+ if (!isset($allgroups[$group])) {
$ok = $this->addGroup($group);
- if($ok === false) goto FAIL;
+ if ($ok === false) goto FAIL;
}
}
- $allgroups = $this->_selectGroups();
+ $allgroups = $this->selectGroups();
// add user to the groups
- foreach($grps as $group) {
- $ok = $this->_joinGroup($userdata, $allgroups[$group]);
- if($ok === false) goto FAIL;
+ foreach ($grps as $group) {
+ $ok = $this->joinGroup($userdata, $allgroups[$group]);
+ if ($ok === false) goto FAIL;
}
}
$this->pdo->commit();
@@ -276,7 +278,7 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
// something went wrong, rollback
FAIL:
$this->pdo->rollBack();
- $this->_debug('Transaction rolled back', 0, __LINE__);
+ $this->debugMsg('Transaction rolled back', 0, __LINE__);
msg($this->getLang('writefail'), -1);
return null; // return error
}
@@ -284,11 +286,12 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
/**
* Modify user data
*
- * @param string $user nick of the user to be changed
- * @param array $changes array of field/value pairs to be changed (password will be clear text)
+ * @param string $user nick of the user to be changed
+ * @param array $changes array of field/value pairs to be changed (password will be clear text)
* @return bool
*/
- public function modifyUser($user, $changes) {
+ public function modifyUser($user, $changes)
+ {
// secure everything in transaction
$this->pdo->beginTransaction();
{
@@ -297,64 +300,64 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
unset($olddata['grps']);
// changing the user name?
- if(isset($changes['user'])) {
- if($this->getUserData($changes['user'], false)) goto FAIL;
+ if (isset($changes['user'])) {
+ if ($this->getUserData($changes['user'], false)) goto FAIL;
$params = $olddata;
$params['newlogin'] = $changes['user'];
- $ok = $this->_query($this->getConf('update-user-login'), $params);
- if($ok === false) goto FAIL;
+ $ok = $this->query($this->getConf('update-user-login'), $params);
+ if ($ok === false) goto FAIL;
}
// changing the password?
- if(isset($changes['pass'])) {
+ if (isset($changes['pass'])) {
$params = $olddata;
$params['clear'] = $changes['pass'];
$params['hash'] = auth_cryptPassword($changes['pass']);
- $ok = $this->_query($this->getConf('update-user-pass'), $params);
- if($ok === false) goto FAIL;
+ $ok = $this->query($this->getConf('update-user-pass'), $params);
+ if ($ok === false) goto FAIL;
}
// changing info?
- if(isset($changes['mail']) || isset($changes['name'])) {
+ if (isset($changes['mail']) || isset($changes['name'])) {
$params = $olddata;
- if(isset($changes['mail'])) $params['mail'] = $changes['mail'];
- if(isset($changes['name'])) $params['name'] = $changes['name'];
+ if (isset($changes['mail'])) $params['mail'] = $changes['mail'];
+ if (isset($changes['name'])) $params['name'] = $changes['name'];
- $ok = $this->_query($this->getConf('update-user-info'), $params);
- if($ok === false) goto FAIL;
+ $ok = $this->query($this->getConf('update-user-info'), $params);
+ if ($ok === false) goto FAIL;
}
// changing groups?
- if(isset($changes['grps'])) {
- $allgroups = $this->_selectGroups();
+ if (isset($changes['grps'])) {
+ $allgroups = $this->selectGroups();
// remove membership for previous groups
- foreach($oldgroups as $group) {
- if(!in_array($group, $changes['grps']) && isset($allgroups[$group])) {
- $ok = $this->_leaveGroup($olddata, $allgroups[$group]);
- if($ok === false) goto FAIL;
+ foreach ($oldgroups as $group) {
+ if (!in_array($group, $changes['grps']) && isset($allgroups[$group])) {
+ $ok = $this->leaveGroup($olddata, $allgroups[$group]);
+ if ($ok === false) goto FAIL;
}
}
// create all new groups that are missing
$added = 0;
- foreach($changes['grps'] as $group) {
- if(!isset($allgroups[$group])) {
+ foreach ($changes['grps'] as $group) {
+ if (!isset($allgroups[$group])) {
$ok = $this->addGroup($group);
- if($ok === false) goto FAIL;
+ if ($ok === false) goto FAIL;
$added++;
}
}
// reload group info
- if($added > 0) $allgroups = $this->_selectGroups();
+ if ($added > 0) $allgroups = $this->selectGroups();
// add membership for new groups
- foreach($changes['grps'] as $group) {
- if(!in_array($group, $oldgroups)) {
- $ok = $this->_joinGroup($olddata, $allgroups[$group]);
- if($ok === false) goto FAIL;
+ foreach ($changes['grps'] as $group) {
+ if (!in_array($group, $oldgroups)) {
+ $ok = $this->joinGroup($olddata, $allgroups[$group]);
+ if ($ok === false) goto FAIL;
}
}
}
@@ -366,7 +369,7 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
// something went wrong, rollback
FAIL:
$this->pdo->rollBack();
- $this->_debug('Transaction rolled back', 0, __LINE__);
+ $this->debugMsg('Transaction rolled back', 0, __LINE__);
msg($this->getLang('writefail'), -1);
return false; // return error
}
@@ -376,13 +379,14 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
*
* Set delUser capability when implemented
*
- * @param array $users
+ * @param array $users
* @return int number of users deleted
*/
- public function deleteUsers($users) {
+ public function deleteUsers($users)
+ {
$count = 0;
- foreach($users as $user) {
- if($this->_deleteUser($user)) $count++;
+ foreach ($users as $user) {
+ if ($this->deleteUser($user)) $count++;
}
return $count;
}
@@ -392,36 +396,41 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
*
* Set getUsers capability when implemented
*
- * @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
+ * @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 list of userinfo (refer getUserData for internal userinfo details)
*/
- public function retrieveUsers($start = 0, $limit = -1, $filter = null) {
- if($limit < 0) $limit = 10000; // we don't support no limit
- if(is_null($filter)) $filter = array();
-
- if(isset($filter['grps'])) $filter['group'] = $filter['grps'];
- foreach(array('user', 'name', 'mail', 'group') as $key) {
- if(!isset($filter[$key])) {
+ public function retrieveUsers($start = 0, $limit = -1, $filter = null)
+ {
+ if ($limit < 0) $limit = 10000; // we don't support no limit
+ if (is_null($filter)) $filter = array();
+
+ if (isset($filter['grps'])) $filter['group'] = $filter['grps'];
+ foreach (array('user', 'name', 'mail', 'group') as $key) {
+ if (!isset($filter[$key])) {
$filter[$key] = '%';
} else {
$filter[$key] = '%' . $filter[$key] . '%';
}
}
- $filter['start'] = (int) $start;
- $filter['end'] = (int) $start + $limit;
- $filter['limit'] = (int) $limit;
+ $filter['start'] = (int)$start;
+ $filter['end'] = (int)$start + $limit;
+ $filter['limit'] = (int)$limit;
- $result = $this->_query($this->getConf('list-users'), $filter);
- if(!$result) return array();
+ $result = $this->query($this->getConf('list-users'), $filter);
+ if (!$result) return array();
$users = array();
- foreach($result as $row) {
- if(!isset($row['user'])) {
- $this->_debug("Statement did not return 'user' attribute", -1, __LINE__);
- return array();
+ if (is_array($result)) {
+ foreach ($result as $row) {
+ if (!isset($row['user'])) {
+ $this->debugMsg("list-users statement did not return 'user' attribute", -1, __LINE__);
+ return array();
+ }
+ $users[] = $this->getUserData($row['user']);
}
- $users[] = $this->getUserData($row['user']);
+ } else {
+ $this->debugMsg("list-users statement did not return a list of result", -1, __LINE__);
}
return $users;
}
@@ -429,26 +438,27 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
/**
* Return a count of the number of user which meet $filter criteria
*
- * @param array $filter array of field/pattern pairs, empty array for no filter
+ * @param array $filter array of field/pattern pairs, empty array for no filter
* @return int
*/
- public function getUserCount($filter = array()) {
- if(is_null($filter)) $filter = array();
+ public function getUserCount($filter = array())
+ {
+ if (is_null($filter)) $filter = array();
- if(isset($filter['grps'])) $filter['group'] = $filter['grps'];
- foreach(array('user', 'name', 'mail', 'group') as $key) {
- if(!isset($filter[$key])) {
+ if (isset($filter['grps'])) $filter['group'] = $filter['grps'];
+ foreach (array('user', 'name', 'mail', 'group') as $key) {
+ if (!isset($filter[$key])) {
$filter[$key] = '%';
} else {
$filter[$key] = '%' . $filter[$key] . '%';
}
}
- $result = $this->_query($this->getConf('count-users'), $filter);
- if(!$result || !isset($result[0]['count'])) {
- $this->_debug("Statement did not return 'count' attribute", -1, __LINE__);
+ $result = $this->query($this->getConf('count-users'), $filter);
+ if (!$result || !isset($result[0]['count'])) {
+ $this->debugMsg("Statement did not return 'count' attribute", -1, __LINE__);
}
- return (int) $result[0]['count'];
+ return (int)$result[0]['count'];
}
/**
@@ -457,12 +467,13 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
* @param string $group
* @return bool
*/
- public function addGroup($group) {
+ public function addGroup($group)
+ {
$sql = $this->getConf('insert-group');
- $result = $this->_query($sql, array(':group' => $group));
- $this->_clearGroupCache();
- if($result === false) return false;
+ $result = $this->query($sql, array(':group' => $group));
+ $this->clearGroupCache();
+ if ($result === false) return false;
return true;
}
@@ -471,15 +482,16 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
*
* Set getGroups capability when implemented
*
- * @param int $start
- * @param int $limit
+ * @param int $start
+ * @param int $limit
* @return array
*/
- public function retrieveGroups($start = 0, $limit = 0) {
- $groups = array_keys($this->_selectGroups());
- if($groups === false) return array();
+ public function retrieveGroups($start = 0, $limit = 0)
+ {
+ $groups = array_keys($this->selectGroups());
+ if ($groups === false) return array();
- if(!$limit) {
+ if (!$limit) {
return array_splice($groups, $start);
} else {
return array_splice($groups, $start, $limit);
@@ -492,38 +504,39 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
* @param string $user the user name
* @return bool|array user data, false on error
*/
- protected function _selectUser($user) {
+ protected function selectUser($user)
+ {
$sql = $this->getConf('select-user');
- $result = $this->_query($sql, array(':user' => $user));
- if(!$result) return false;
+ $result = $this->query($sql, array(':user' => $user));
+ if (!$result) return false;
- if(count($result) > 1) {
- $this->_debug('Found more than one matching user', -1, __LINE__);
+ if (count($result) > 1) {
+ $this->debugMsg('Found more than one matching user', -1, __LINE__);
return false;
}
$data = array_shift($result);
$dataok = true;
- if(!isset($data['user'])) {
- $this->_debug("Statement did not return 'user' attribute", -1, __LINE__);
+ if (!isset($data['user'])) {
+ $this->debugMsg("Statement did not return 'user' attribute", -1, __LINE__);
$dataok = false;
}
- if(!isset($data['hash']) && !isset($data['clear']) && !$this->_chkcnf(array('check-pass'))) {
- $this->_debug("Statement did not return 'clear' or 'hash' attribute", -1, __LINE__);
+ if (!isset($data['hash']) && !isset($data['clear']) && !$this->checkConfig(array('check-pass'))) {
+ $this->debugMsg("Statement did not return 'clear' or 'hash' attribute", -1, __LINE__);
$dataok = false;
}
- if(!isset($data['name'])) {
- $this->_debug("Statement did not return 'name' attribute", -1, __LINE__);
+ if (!isset($data['name'])) {
+ $this->debugMsg("Statement did not return 'name' attribute", -1, __LINE__);
$dataok = false;
}
- if(!isset($data['mail'])) {
- $this->_debug("Statement did not return 'mail' attribute", -1, __LINE__);
+ if (!isset($data['mail'])) {
+ $this->debugMsg("Statement did not return 'mail' attribute", -1, __LINE__);
$dataok = false;
}
- if(!$dataok) return false;
+ if (!$dataok) return false;
return $data;
}
@@ -533,22 +546,23 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
* @param string $user
* @return bool true when the user was deleted
*/
- protected function _deleteUser($user) {
+ protected function deleteUser($user)
+ {
$this->pdo->beginTransaction();
{
$userdata = $this->getUserData($user);
- if($userdata === false) goto FAIL;
- $allgroups = $this->_selectGroups();
+ if ($userdata === false) goto FAIL;
+ $allgroups = $this->selectGroups();
// remove group memberships (ignore errors)
- foreach($userdata['grps'] as $group) {
- if(isset($allgroups[$group])) {
- $this->_leaveGroup($userdata, $allgroups[$group]);
+ foreach ($userdata['grps'] as $group) {
+ if (isset($allgroups[$group])) {
+ $this->leaveGroup($userdata, $allgroups[$group]);
}
}
- $ok = $this->_query($this->getConf('delete-user'), $userdata);
- if($ok === false) goto FAIL;
+ $ok = $this->query($this->getConf('delete-user'), $userdata);
+ if ($ok === false) goto FAIL;
}
$this->pdo->commit();
return true;
@@ -564,19 +578,24 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
* @param array $userdata The userdata as returned by _selectUser()
* @return array|bool list of group names, false on error
*/
- protected function _selectUserGroups($userdata) {
+ protected function selectUserGroups($userdata)
+ {
global $conf;
$sql = $this->getConf('select-user-groups');
- $result = $this->_query($sql, $userdata);
- if($result === false) return false;
+ $result = $this->query($sql, $userdata);
+ if ($result === false) return false;
$groups = array($conf['defaultgroup']); // always add default config
- foreach($result as $row) {
- if(!isset($row['group'])) {
- $this->_debug("No 'group' field returned in select-user-groups statement");
- return false;
+ if (is_array($result)) {
+ foreach ($result as $row) {
+ if (!isset($row['group'])) {
+ $this->debugMsg("No 'group' field returned in select-user-groups statement", -1, __LINE__);
+ return false;
+ }
+ $groups[] = $row['group'];
}
- $groups[] = $row['group'];
+ } else {
+ $this->debugMsg("select-user-groups statement did not return a list of result", -1, __LINE__);
}
$groups = array_unique($groups);
@@ -589,23 +608,28 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
*
* @return array|bool list of all available groups and their properties
*/
- protected function _selectGroups() {
- if($this->groupcache) return $this->groupcache;
+ protected function selectGroups()
+ {
+ if ($this->groupcache) return $this->groupcache;
$sql = $this->getConf('select-groups');
- $result = $this->_query($sql);
- if($result === false) return false;
+ $result = $this->query($sql);
+ if ($result === false) return false;
$groups = array();
- foreach($result as $row) {
- if(!isset($row['group'])) {
- $this->_debug("No 'group' field returned from select-groups statement", -1, __LINE__);
- return false;
- }
+ if (is_array($result)) {
+ foreach ($result as $row) {
+ if (!isset($row['group'])) {
+ $this->debugMsg("No 'group' field returned from select-groups statement", -1, __LINE__);
+ return false;
+ }
- // relayout result with group name as key
- $group = $row['group'];
- $groups[$group] = $row;
+ // relayout result with group name as key
+ $group = $row['group'];
+ $groups[$group] = $row;
+ }
+ } else {
+ $this->debugMsg("select-groups statement did not return a list of result", -1, __LINE__);
}
ksort($groups);
@@ -615,7 +639,8 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
/**
* Remove all entries from the group cache
*/
- protected function _clearGroupCache() {
+ protected function clearGroupCache()
+ {
$this->groupcache = null;
}
@@ -626,11 +651,12 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
* @param array $groupdata all the group data
* @return bool
*/
- protected function _joinGroup($userdata, $groupdata) {
+ protected function joinGroup($userdata, $groupdata)
+ {
$data = array_merge($userdata, $groupdata);
$sql = $this->getConf('join-group');
- $result = $this->_query($sql, $data);
- if($result === false) return false;
+ $result = $this->query($sql, $data);
+ if ($result === false) return false;
return true;
}
@@ -641,11 +667,12 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
* @param array $groupdata all the group data
* @return bool
*/
- protected function _leaveGroup($userdata, $groupdata) {
+ protected function leaveGroup($userdata, $groupdata)
+ {
$data = array_merge($userdata, $groupdata);
$sql = $this->getConf('leave-group');
- $result = $this->_query($sql, $data);
- if($result === false) return false;
+ $result = $this->query($sql, $data);
+ if ($result === false) return false;
return true;
}
@@ -656,25 +683,27 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
* @param array $arguments Named parameters to be used in the statement
* @return array|int|bool The result as associative array for SELECTs, affected rows for others, false on error
*/
- protected function _query($sql, $arguments = array()) {
+ protected function query($sql, $arguments = array())
+ {
$sql = trim($sql);
- if(empty($sql)) {
- $this->_debug('No SQL query given', -1, __LINE__);
+ if (empty($sql)) {
+ $this->debugMsg('No SQL query given', -1, __LINE__);
return false;
}
// execute
$params = array();
$sth = $this->pdo->prepare($sql);
+ $result = false;
try {
// prepare parameters - we only use those that exist in the SQL
- foreach($arguments as $key => $value) {
- if(is_array($value)) continue;
- if(is_object($value)) continue;
- if($key[0] != ':') $key = ":$key"; // prefix with colon if needed
- if(strpos($sql, $key) === false) continue; // skip if parameter is missing
+ foreach ($arguments as $key => $value) {
+ if (is_array($value)) continue;
+ if (is_object($value)) continue;
+ if ($key[0] != ':') $key = ":$key"; // prefix with colon if needed
+ if (strpos($sql, $key) === false) continue; // skip if parameter is missing
- if(is_int($value)) {
+ if (is_int($value)) {
$sth->bindValue($key, $value, PDO::PARAM_INT);
} else {
$sth->bindValue($key, $value);
@@ -683,19 +712,32 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
}
$sth->execute();
- if(strtolower(substr($sql, 0, 6)) == 'select') {
- $result = $sth->fetchAll();
- } else {
- $result = $sth->rowCount();
+ // only report last line's result
+ $hasnextrowset = true;
+ $currentsql = $sql;
+ while ($hasnextrowset) {
+ if (strtolower(substr($currentsql, 0, 6)) == 'select') {
+ $result = $sth->fetchAll();
+ } else {
+ $result = $sth->rowCount();
+ }
+ $semi_pos = strpos($currentsql, ';');
+ if ($semi_pos) {
+ $currentsql = trim(substr($currentsql, $semi_pos + 1));
+ }
+ try {
+ $hasnextrowset = $sth->nextRowset(); // run next rowset
+ } catch (PDOException $rowset_e) {
+ $hasnextrowset = false; // driver does not support multi-rowset, should be executed in one time
+ }
}
- } catch(Exception $e) {
+ } catch (Exception $e) {
// report the caller's line
$trace = debug_backtrace();
$line = $trace[0]['line'];
- $dsql = $this->_debugSQL($sql, $params, !defined('DOKU_UNITTEST'));
- $this->_debug($e, -1, $line);
- $this->_debug("SQL: <pre>$dsql</pre>", -1, $line);
- $result = false;
+ $dsql = $this->debugSQL($sql, $params, !defined('DOKU_UNITTEST'));
+ $this->debugMsg($e, -1, $line);
+ $this->debugMsg("SQL: <pre>$dsql</pre>", -1, $line);
}
$sth->closeCursor();
$sth = null;
@@ -710,17 +752,18 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
* @param int $err
* @param int $line
*/
- protected function _debug($message, $err = 0, $line = 0) {
- if(!$this->getConf('debug')) return;
- if(is_a($message, 'Exception')) {
+ protected function debugMsg($message, $err = 0, $line = 0)
+ {
+ if (!$this->getConf('debug')) return;
+ if (is_a($message, 'Exception')) {
$err = -1;
$msg = $message->getMessage();
- if(!$line) $line = $message->getLine();
+ if (!$line) $line = $message->getLine();
} else {
$msg = $message;
}
- if(defined('DOKU_UNITTEST')) {
+ if (defined('DOKU_UNITTEST')) {
printf("\n%s, %s:%d\n", $msg, __FILE__, $line);
} else {
msg('authpdo: ' . $msg, $err, $line, __FILE__);
@@ -730,22 +773,23 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
/**
* Check if the given config strings are set
*
+ * @param string[] $keys
+ * @return bool
* @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
*
- * @param string[] $keys
- * @return bool
*/
- protected function _chkcnf($keys) {
- foreach($keys as $key) {
+ protected function checkConfig($keys)
+ {
+ foreach ($keys as $key) {
$params = explode(':', $key);
$key = array_shift($params);
$sql = trim($this->getConf($key));
// check if sql is set
- if(!$sql) return false;
+ if (!$sql) return false;
// check if needed params are there
- foreach($params as $param) {
- if(strpos($sql, ":$param") === false) return false;
+ foreach ($params as $param) {
+ if (strpos($sql, ":$param") === false) return false;
}
}
@@ -760,20 +804,21 @@ class auth_plugin_authpdo extends DokuWiki_Auth_Plugin {
* @param bool $htmlescape Should the result be escaped for output in HTML?
* @return string
*/
- protected function _debugSQL($sql, $params, $htmlescape = true) {
- foreach($params as $key => $val) {
- if(is_int($val)) {
+ protected function debugSQL($sql, $params, $htmlescape = true)
+ {
+ foreach ($params as $key => $val) {
+ if (is_int($val)) {
$val = $this->pdo->quote($val, PDO::PARAM_INT);
- } elseif(is_bool($val)) {
+ } elseif (is_bool($val)) {
$val = $this->pdo->quote($val, PDO::PARAM_BOOL);
- } elseif(is_null($val)) {
+ } elseif (is_null($val)) {
$val = 'NULL';
} else {
$val = $this->pdo->quote($val);
}
$sql = str_replace($key, $val, $sql);
}
- if($htmlescape) $sql = hsc($sql);
+ if ($htmlescape) $sql = hsc($sql);
return $sql;
}
}
diff --git a/lib/plugins/authpdo/conf/metadata.php b/lib/plugins/authpdo/conf/metadata.php
index 7c2ee8cdc..34e60a40e 100644
--- a/lib/plugins/authpdo/conf/metadata.php
+++ b/lib/plugins/authpdo/conf/metadata.php
@@ -23,5 +23,3 @@ $meta['update-user-pass'] = array('', '_caution' => 'danger');
$meta['insert-group'] = array('', '_caution' => 'danger');
$meta['join-group'] = array('', '_caution' => 'danger');
$meta['leave-group'] = array('', '_caution' => 'danger');
-
-
diff --git a/lib/plugins/authpdo/lang/bg/lang.php b/lib/plugins/authpdo/lang/bg/lang.php
index f6532c453..220fbcd60 100644
--- a/lib/plugins/authpdo/lang/bg/lang.php
+++ b/lib/plugins/authpdo/lang/bg/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Kiril <neohidra@gmail.com>
*/
$lang['connectfail'] = 'Свързването с базата данни се провали.';
diff --git a/lib/plugins/authpdo/lang/ca/lang.php b/lib/plugins/authpdo/lang/ca/lang.php
new file mode 100644
index 000000000..d8c6eda05
--- /dev/null
+++ b/lib/plugins/authpdo/lang/ca/lang.php
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Adolfo Jayme Barrientos <fito@libreoffice.org>
+ */
+$lang['connectfail'] = 'Ha fallat la connexió a la base de dades.';
+$lang['userexists'] = 'Ja existeix un usuari amb aquest nom.';
+$lang['writefail'] = 'No es poden modificar les dades de l’usuari. Informeu d’això a l’administrador del wiki';
diff --git a/lib/plugins/authpdo/lang/ca/settings.php b/lib/plugins/authpdo/lang/ca/settings.php
new file mode 100644
index 000000000..b599da6f0
--- /dev/null
+++ b/lib/plugins/authpdo/lang/ca/settings.php
@@ -0,0 +1,8 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Adolfo Jayme Barrientos <fito@libreoffice.org>
+ */
+$lang['dsn'] = 'El DNS per a connectar a la base de dades.';
diff --git a/lib/plugins/authpdo/lang/cs/lang.php b/lib/plugins/authpdo/lang/cs/lang.php
index cf52a1890..5cbc85077 100644
--- a/lib/plugins/authpdo/lang/cs/lang.php
+++ b/lib/plugins/authpdo/lang/cs/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Jaroslav Lichtblau <jlichtblau@seznam.cz>
*/
$lang['connectfail'] = 'Selhalo připojení k databázi.';
diff --git a/lib/plugins/authpdo/lang/cs/settings.php b/lib/plugins/authpdo/lang/cs/settings.php
new file mode 100644
index 000000000..08de9539e
--- /dev/null
+++ b/lib/plugins/authpdo/lang/cs/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Robert Surý <rsurycz@seznam.cz>
+ */
+$lang['debug'] = 'Vytištění podrobných chybových zpráv. Po dokončení nastavení by mělo být deaktivováno.';
+$lang['dsn'] = 'DSN pro připojení k databázi.';
+$lang['user'] = 'Uživatel pro výše uvedené připojení k databázi (prázdný pro sqlite)';
+$lang['pass'] = 'Heslo pro výše uvedené připojení k databázi (prázdné pro sqlite)';
+$lang['select-user'] = 'Příkaz SQL pro výběr dat jednoho uživatele';
+$lang['select-user-groups'] = 'Příkaz SQL pro výběr všech skupin jednoho uživatele';
+$lang['select-groups'] = 'Příkaz SQL pro výběr všech dostupných skupin';
+$lang['insert-user'] = 'Příkaz SQL pro vložení nového uživatele do databáze';
+$lang['delete-user'] = 'Příkaz SQL pro odebrání jednoho uživatele z databáze';
+$lang['list-users'] = 'Příkaz SQL pro výpis seznamu uživatelů odpovídajících filtru';
+$lang['count-users'] = 'Příkaz SQL pro spočítání uživatelů odpovídajících filtru';
+$lang['update-user-info'] = 'Příkaz SQL pro aktualizaci celého jména a e-mailové adresy jednoho uživatele';
+$lang['update-user-login'] = 'Příkaz SQL pro aktualizaci přihlašovacího jména jednoho uživatele';
+$lang['update-user-pass'] = 'Příkaz SQL pro aktualizaci hesla jednoho uživatele';
+$lang['insert-group'] = 'Příkaz SQL pro vložení nové skupiny do databáze';
+$lang['join-group'] = 'Příkaz SQL pro přidání uživatele do existující skupiny';
+$lang['leave-group'] = 'Příkaz SQL pro odebrání uživatele ze skupiny';
+$lang['check-pass'] = 'Příkaz SQL ke kontrole hesla uživatele. Může zůstat prázdný, pokud jsou informace o heslech vyvolány ve vybraném uživateli.';
diff --git a/lib/plugins/authpdo/lang/da/lang.php b/lib/plugins/authpdo/lang/da/lang.php
new file mode 100644
index 000000000..85c64f084
--- /dev/null
+++ b/lib/plugins/authpdo/lang/da/lang.php
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Jacob Palm <mail@jacobpalm.dk>
+ */
+$lang['connectfail'] = 'Kunne ikke forbinde til database.';
+$lang['userexists'] = 'Beklager, en bruger med dette loginnavn findes allerede.';
+$lang['writefail'] = 'Kunne ikke ændre brugerdata. Informer venligst wikiens administrator.';
diff --git a/lib/plugins/authpdo/lang/da/settings.php b/lib/plugins/authpdo/lang/da/settings.php
new file mode 100644
index 000000000..80b6e2e93
--- /dev/null
+++ b/lib/plugins/authpdo/lang/da/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Jacob Palm <mail@jacobpalm.dk>
+ */
+$lang['debug'] = 'Vis detaljerede fejlmeddelelser. Bør deaktiveres efter opsætning.';
+$lang['dsn'] = 'DSN der benyttes til at forbinde til databasen.';
+$lang['user'] = 'Brugerkonto til ovenstående databaseforbindelse (blank ved sqlite)';
+$lang['pass'] = 'Adgangskode til ovenstående databaseforbindelse (blank ved sqlite)';
+$lang['select-user'] = 'SQL statement til at selektere data for en enkelt bruger';
+$lang['select-user-groups'] = 'SQL statement til at selektere alle grupper en enkelt bruger er medlem af';
+$lang['select-groups'] = 'SQL statement til at selektere alle tilgængelige grupper';
+$lang['insert-user'] = 'SQL statement til at indsætte en ny bruger i databasen';
+$lang['delete-user'] = 'SQL statement til at fjerne en bruger fra databasen';
+$lang['list-users'] = 'SQL statement til at selektere brugere ud fra et filter';
+$lang['count-users'] = 'SQL statement til at tælle brugere der matcher et filter';
+$lang['update-user-info'] = 'SQL statement til at opdatere fulde navn og e-mail adresse på en enkelt bruger';
+$lang['update-user-login'] = 'SQL statement til at opdatere loginnavn på en enkelt bruger';
+$lang['update-user-pass'] = 'SQL statement til at opdatere adgangskode på en enkelt bruger';
+$lang['insert-group'] = 'SQL statement til at indsætte en ny gruppe i databasen';
+$lang['join-group'] = 'SQL statement til at tilføje en bruger til en eksisterende gruppe';
+$lang['leave-group'] = 'SQL statement til at fjerne en bruger fra en gruppe';
+$lang['check-pass'] = 'SQL statement til at kontrollere adgangskode for en bruger. Kan efterlades blank hvis adgangskode information hentes når brugeren selekteres.';
diff --git a/lib/plugins/authpdo/lang/de-informal/lang.php b/lib/plugins/authpdo/lang/de-informal/lang.php
new file mode 100644
index 000000000..a3d97473a
--- /dev/null
+++ b/lib/plugins/authpdo/lang/de-informal/lang.php
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Martin <martin@andev.de>
+ */
+$lang['connectfail'] = 'Verbindung zur Datenbank fehlgeschlagen.';
+$lang['userexists'] = 'Der Benutzername existiert leider schon.';
+$lang['writefail'] = 'Die Benutzerdaten konnten nicht geändert werden. Bitte wenden Sie sich an den Wiki-Admin.';
diff --git a/lib/plugins/authpdo/lang/de/lang.php b/lib/plugins/authpdo/lang/de/lang.php
index 7ae13dd17..3fe2a440b 100644
--- a/lib/plugins/authpdo/lang/de/lang.php
+++ b/lib/plugins/authpdo/lang/de/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Noel Tilliot <noeltilliot@byom.de>
* @author Hendrik Diel <diel.hendrik@gmail.com>
* @author Philip Knack <p.knack@stollfuss.de>
diff --git a/lib/plugins/authpdo/lang/de/settings.php b/lib/plugins/authpdo/lang/de/settings.php
new file mode 100644
index 000000000..d661d5c01
--- /dev/null
+++ b/lib/plugins/authpdo/lang/de/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Jürgen Fredriksson <jfriedrich@gmx.at>
+ */
+$lang['debug'] = 'Zeige detaillierte Fehlermeldungen. Diese sollten nach dem Setup deaktiviert werden.';
+$lang['dsn'] = 'Der DSN(Data Source Name) zur Verbindung mit der Datenbank';
+$lang['user'] = 'Der Benutzer für die obige Datenbankverbindung (leer lassen für SQLite)';
+$lang['pass'] = 'Das Passwort für die obige Datenbankverbindung (leer lassen für SQLite)';
+$lang['select-user'] = 'SQL Anweisung um einen Benutzer abzufragen';
+$lang['select-user-groups'] = 'SQL Anweisung um alle Gruppen eines Benutzers abzufragen';
+$lang['select-groups'] = 'SQL Anweisung um alle verfügbaren Gruppen auszuwählen';
+$lang['insert-user'] = 'SQL Anweisung um einen neuen Benutzer in der Datenbank abzulegen';
+$lang['delete-user'] = 'SQL Anweisung um einen Benutzer aus der Datenbank zu entfernen';
+$lang['list-users'] = 'SQL Anweisung um eine Liste gefilterter Benutzer anzuzeigen';
+$lang['count-users'] = 'SQL Anweisung, welche die Anzahl der gefilterten Benutzer wiedergibt';
+$lang['update-user-info'] = 'SQL Anweisung um den vollen Namen sowie dessen E-Mail Adresse zu aktualisieren';
+$lang['update-user-login'] = 'SQL Anweisung um den Login-Namen eines Benutzers zu aktualisieren';
+$lang['update-user-pass'] = 'SQL Anweisung um das Passwort eines Benutzers zu aktualisieren';
+$lang['insert-group'] = 'SQL Anweisung um eine neue Gruppe in der Datenbank anzulegen';
+$lang['join-group'] = 'SQL Anweisung um einen Benutzer zu einer existierenden Gruppe hinzuzufügen';
+$lang['leave-group'] = 'SQL Anweisung um einen Benutzer aus einer Gruppe zu entfernen';
+$lang['check-pass'] = 'SQL Anweisung um das Passwort eines Benutzers zu überprüfen. Es kann leer gelassen werden wenn die Information über die Benutzerabfrage erhoben wurde.';
diff --git a/lib/plugins/authpdo/lang/el/lang.php b/lib/plugins/authpdo/lang/el/lang.php
new file mode 100644
index 000000000..fe944cf44
--- /dev/null
+++ b/lib/plugins/authpdo/lang/el/lang.php
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Aikaterini Katapodi <extragold1234@hotmail.com>
+ */
+$lang['connectfail'] = 'Δεν μπόρεσε να κάνει σύνδεση με την βάση δεδομένων';
+$lang['userexists'] = 'Συγγνώμη υπάρχει ήδη χρήστης με αυτά τα στοιχεία';
+$lang['writefail'] = 'Δεν μπορέσαμε τα τροποποιήσουμε τα στοιχεία χρήστη. Παρακαλώ ενημερώστε το Wiki-Admin';
diff --git a/lib/plugins/authpdo/lang/el/settings.php b/lib/plugins/authpdo/lang/el/settings.php
new file mode 100644
index 000000000..531fefeb2
--- /dev/null
+++ b/lib/plugins/authpdo/lang/el/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Aikaterini Katapodi <extragold1234@hotmail.com>
+ */
+$lang['debug'] = 'Εκτύπωση μηνυμάτων σφαλμάτων λεπτομερώς. Αυτή η ρύθμιση πρέπει μετά να απενεργοποιηθεί.';
+$lang['dsn'] = 'Να συνδεθεί το DSN με τη βάση δεδομένων';
+$lang['user'] = 'Ο συνδεδεμένος χρήστης με την άνω βάση δεδομένων';
+$lang['pass'] = 'Ο κωδικός πρόσβασης της άνω βάσης δεδομένων';
+$lang['select-user'] = 'SQL Αντίγραφο επιλογής δεδομένων ενός απλού χρήστη';
+$lang['select-user-groups'] = 'SQL Αντίγραφο to select all groups of a single user ';
+$lang['select-groups'] = 'SQL Αντίγραφο για επιλογή όλων των διαθέσιμων ομάδων ';
+$lang['insert-user'] = 'Δηλωτικό SQL για να εισάγει έναν νέο χρήστη στη βάση δεδομένων';
+$lang['delete-user'] = 'Δηλωτικό SQL για αφαίρεση χρήστη από την βάση δεδομένων';
+$lang['list-users'] = 'Δηλωτικό SQL για να ταξινομήσει τους χρήστες με προσαρμογή φίλτρου';
+$lang['count-users'] = 'Δηλωτικό SQL για να μετρήσει τον αριθμό των χρηστών με τη χρήση ενός φίλτρου';
+$lang['update-user-info'] = 'Δηλωτικό SQL για ενημέρωση του ονόματος και της διεύθυνσης email ενός χρήστη';
+$lang['update-user-login'] = 'Δηλωτικό SQL για ενημέρωση του ονόματος σύνδεσης ενός απλού χρήστη ';
+$lang['update-user-pass'] = 'Δηλωτικό SQL για ενημέρωση του κωδικού πρόσβασης ενός χρήστη';
+$lang['insert-group'] = 'Δηλωτικό SQL για να εισάγει νέα ομάδα στην βάση δεδομένων';
+$lang['join-group'] = 'Δηλωτικό SQL για πρόσθεση χρήστη σε μια υπάρχουσα ομάδα';
+$lang['leave-group'] = 'Δηλωτικό SQL για αφαίρεση χρήστη από μια ομάδα';
+$lang['check-pass'] = 'Δηλωτικό SQL για να ελέγξει τον κωδικό πρόσβασης για έναν χρήστη. Μπορεί να μείνει κενό αν εισαχθεί κωδικός χρήστη στην ομάδα επιλογής χρήστη.';
diff --git a/lib/plugins/authpdo/lang/es/lang.php b/lib/plugins/authpdo/lang/es/lang.php
index 9bd9211e9..c382ebf70 100644
--- a/lib/plugins/authpdo/lang/es/lang.php
+++ b/lib/plugins/authpdo/lang/es/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Domingo Redal <docxml@gmail.com>
*/
$lang['connectfail'] = 'Error al conectar con la base de datos.';
diff --git a/lib/plugins/authpdo/lang/es/settings.php b/lib/plugins/authpdo/lang/es/settings.php
new file mode 100644
index 000000000..f866fe1cf
--- /dev/null
+++ b/lib/plugins/authpdo/lang/es/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author WIRESLINKEA <wireslinkea@gmail.com>
+ */
+$lang['debug'] = 'Imprime mensajes de error detallados. Debería ser deshabilitado después de la instalación.';
+$lang['dsn'] = 'El DSN para conectarse a la base de datos.';
+$lang['user'] = 'El usuario de la conexión de base de datos anterior (vacía para sqlite)';
+$lang['pass'] = 'La contraseña para la conexión de base de datos anterior (vacía para sqlite)';
+$lang['select-user'] = 'Declaración SQL para seleccionar los datos de un solo usuario';
+$lang['select-user-groups'] = 'Declaración SQL para seleccionar todos los grupos de un solo usuario';
+$lang['select-groups'] = 'Declaración SQL para seleccionar todos los grupos disponibles';
+$lang['insert-user'] = 'Declaración SQL para insertar un nuevo usuario en la base de datos';
+$lang['delete-user'] = 'Declaración SQL para eliminar un único usuario de la base de datos';
+$lang['list-users'] = 'Declaración SQL para mostrar los usuarios que coinciden con un filtro';
+$lang['count-users'] = 'Declaración SQL para contar usuarios que coinciden con un filtro';
+$lang['update-user-info'] = 'Declaración SQL para actualizar el nombre completo y la dirección de correo electrónico de un único usuario';
+$lang['update-user-login'] = 'Declaración SQL para actualizar el nombre de usuario de un solo usuario';
+$lang['update-user-pass'] = 'Declaración SQL para actualizar la contraseña de un solo usuario';
+$lang['insert-group'] = 'Declaración SQL para insertar un nuevo grupo en la base de datos';
+$lang['join-group'] = 'Declaración SQL para agregar un usuario a un grupo existente ';
+$lang['leave-group'] = 'Declaración SQL para eliminar un usuario de un grupo';
+$lang['check-pass'] = 'Declaración SQL para verificar la contraseña de un usuario. Puede dejarse vacío si se busca información de contraseña en el usuario de selección.';
diff --git a/lib/plugins/authpdo/lang/fa/lang.php b/lib/plugins/authpdo/lang/fa/lang.php
index b26e83698..7f06df888 100644
--- a/lib/plugins/authpdo/lang/fa/lang.php
+++ b/lib/plugins/authpdo/lang/fa/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Mohmmad Razavi <sepent@gmail.com>
* @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
*/
diff --git a/lib/plugins/authpdo/lang/fa/settings.php b/lib/plugins/authpdo/lang/fa/settings.php
new file mode 100644
index 000000000..201687c00
--- /dev/null
+++ b/lib/plugins/authpdo/lang/fa/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
+ */
+$lang['debug'] = 'جزئیات پیام‌های خطا را نمایش بده. باید بعد از تنظیم غیرفعال شود.';
+$lang['dsn'] = 'دی‌اس‌ان برای اتصال به پایگاه داده';
+$lang['user'] = 'کاربر برای اتصال پایگاه دادهٔ بالا (برای sqlite خالی)';
+$lang['pass'] = 'کلمهٔ عبور برای اتصال پایگاه دادهٔ بالا (برای sqlite خالی)';
+$lang['select-user'] = 'دستور SQL برای انتخاب داده‌ای از یک کاربر';
+$lang['select-user-groups'] = 'دستور SQL برای انتخاب همهٔ گروه‌های یک کاربر';
+$lang['select-groups'] = 'دستور SQL برای انتخاب گروه‌های موجود';
+$lang['insert-user'] = 'دستور SQL برای افزودن یک کاربر جدید به پایگاه داده';
+$lang['delete-user'] = 'دستور SQL برای ححذف یک کاربر از پایگاه داده';
+$lang['list-users'] = 'دستور SQL برای فهرست کردن کاربران دارای ویژگی مشخص';
+$lang['count-users'] = 'دستور SQL برای شمارش کاربران دارای ویژگی مشخص';
+$lang['update-user-info'] = 'دستور SQL برای به‌روزرسانی نام کامل و ایمیل یک کاربر';
+$lang['update-user-login'] = 'دستور SQL برای به‌روزرسانی نام ورود به سیستم برای یک کاربر';
+$lang['update-user-pass'] = 'دستور SQL برای به‌روزرسانی کلمهٔ عبور برای یک کاربر';
+$lang['insert-group'] = 'دستور SQL برای افزودن گروه جدید به پایگاه داده';
+$lang['join-group'] = 'دستور SQL برای افزودن یک کاربر به یک گروه موجود';
+$lang['leave-group'] = 'دستور SQL برای حذف یک کاربر از یک گروه';
+$lang['check-pass'] = 'دستور SQL برای چک کردن کلمهٔ عبور یک کاربر. اگر اطلاعات کلمهٔ عبور در دریافت کاربر گرفته شده می‌تواند خالی بماند.';
diff --git a/lib/plugins/authpdo/lang/fr/lang.php b/lib/plugins/authpdo/lang/fr/lang.php
index ee87b0d52..5473aa71c 100644
--- a/lib/plugins/authpdo/lang/fr/lang.php
+++ b/lib/plugins/authpdo/lang/fr/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Pietroni <pietroni@informatique.univ-paris-diderot.fr>
*/
$lang['connectfail'] = 'Impossible de se connecter à la base de données.';
diff --git a/lib/plugins/authpdo/lang/fr/settings.php b/lib/plugins/authpdo/lang/fr/settings.php
new file mode 100644
index 000000000..5c2704a2c
--- /dev/null
+++ b/lib/plugins/authpdo/lang/fr/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Schplurtz le Déboulonné <schplurtz@laposte.net>
+ */
+$lang['debug'] = 'Afficher des messages d\'erreur détaillés. Devrait être désactivé passé la configuration.';
+$lang['dsn'] = 'Le DSN de connexion à la base de données.';
+$lang['user'] = 'L\'utilisateur pour la connexion à la base de donnée ci-dessus (vide pour sqlite)';
+$lang['pass'] = 'Le mot de passe pour la connexion à la base de donnée ci-dessus (vide pour sqlite)';
+$lang['select-user'] = 'Instruction SQL pour sélectionner les données d\'un seul utilisateur';
+$lang['select-user-groups'] = 'Instruction SQL pour sélectionner tous les groupes d\'un utilisateur donné';
+$lang['select-groups'] = 'Instruction SQL pour sélectionner tous les groupes disponibles';
+$lang['insert-user'] = 'Instruction SQL pour insérer un nouvel utilisateur dans la base de données';
+$lang['delete-user'] = 'Instruction SQL pour retirer un utilisateur de la base de données';
+$lang['list-users'] = 'Instruction SQL pour lister les utilisateurs correspondant à un filtre';
+$lang['count-users'] = 'Instruction SQL pour compter les utilisateurs correspondant à un filtre';
+$lang['update-user-info'] = 'Instruction SQL pour mettre à jour le nom complet et l\'adresse de courriel d\'un utilisateur donné';
+$lang['update-user-login'] = 'Instruction SQL pour mettre à jour l\'identifiant d\'un utilisateur donné';
+$lang['update-user-pass'] = 'Instruction SQL pour mettre à jour le mot de passe d\'un utilisateur donné';
+$lang['insert-group'] = 'Instruction SQL pour mettre insérer un nouveau groupe dans la base de données';
+$lang['join-group'] = 'Instruction SQL pour ajouter un utilisateur à un groupe existant';
+$lang['leave-group'] = 'Instruction SQL pour retirer un utilisateur d\'un groupe';
+$lang['check-pass'] = 'Instruction SQL pour vérifier le mot de passe d\'un utilisateur. Peut être laissé vide si l\'information de mot de passe est obtenue lors de la sélection d\'un utilisateur.';
diff --git a/lib/plugins/authpdo/lang/it/lang.php b/lib/plugins/authpdo/lang/it/lang.php
index 5c0a3f146..56b4a014b 100644
--- a/lib/plugins/authpdo/lang/it/lang.php
+++ b/lib/plugins/authpdo/lang/it/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Torpedo <dgtorpedo@gmail.com>
*/
$lang['connectfail'] = 'Connessione fallita al database.';
diff --git a/lib/plugins/authpdo/lang/it/settings.php b/lib/plugins/authpdo/lang/it/settings.php
new file mode 100644
index 000000000..d539c4abd
--- /dev/null
+++ b/lib/plugins/authpdo/lang/it/settings.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Eddy <eddy@mail.it>
+ * @author Riccardo <riccardo.furlato@gmail.com>
+ */
+$lang['debug'] = 'Stampa messaggi di errore dettagliati. Dovrebbe essere disabilitato dopo l\'installazione.';
+$lang['dsn'] = 'Il DSN per connettersi al database.';
+$lang['user'] = 'L\'utente per la connessione al database sopra (vuoto per sqlite)';
+$lang['pass'] = 'La password per la connessione al database sopra (vuoto per sqlite)';
+$lang['select-user'] = 'Istruzione SQL per selezionare i dati di un singolo utente';
+$lang['select-user-groups'] = 'Istruzione SQL per selezionare tutti i gruppi di un singolo utente';
+$lang['select-groups'] = 'Istruzione SQL per selezionare tutti i gruppi disponibili';
+$lang['insert-user'] = 'Istruzione SQL per inserire un nuovo utente nel database';
+$lang['delete-user'] = 'Istruzione SQL per rimuovere un singolo utente dal database';
+$lang['list-users'] = 'Istruzione SQL per elencare gli utenti che corrispondono a un filtro';
+$lang['count-users'] = 'Istruzione SQL per contare gli utenti che corrispondono a un filtro';
+$lang['update-user-info'] = 'Istruzione SQL per aggiornare nome completo ed indirizzo email di un singolo utente';
+$lang['update-user-login'] = 'Istruzione SQL per aggiornare il nome di login di un singolo utente';
+$lang['update-user-pass'] = 'Istruzione SQL per aggiornare la password di un singolo utente';
+$lang['insert-group'] = 'Istruzione SQL per inserire un nuovo gruppo nel database';
+$lang['join-group'] = 'Istruzione SQL per aggiungere un utente ad un gruppo esistente';
+$lang['leave-group'] = 'Istruzione SQL per rimuovere un utente da un gruppo';
+$lang['check-pass'] = 'Istruzione SQL per cercare la password di un utente. Può essere omessa se l\'informazioni sulla password è recuperate dalla selezione utente.';
diff --git a/lib/plugins/authpdo/lang/ja/lang.php b/lib/plugins/authpdo/lang/ja/lang.php
index 1cd441b60..8893f2d8a 100644
--- a/lib/plugins/authpdo/lang/ja/lang.php
+++ b/lib/plugins/authpdo/lang/ja/lang.php
@@ -2,9 +2,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
* @author Hideaki SAWADA <chuno@live.jp>
*/
$lang['connectfail'] = 'データベースへの接続に失敗しました。';
-$lang['userexists'] = 'このログイン名のユーザーが既に存在しています。';
+$lang['userexists'] = '恐れ入りますが、このログイン名のユーザーが既に存在しています。';
$lang['writefail'] = 'ユーザーデータを変更できません。Wiki の管理者に連絡してください。';
diff --git a/lib/plugins/authpdo/lang/ja/settings.php b/lib/plugins/authpdo/lang/ja/settings.php
new file mode 100644
index 000000000..b90db26f6
--- /dev/null
+++ b/lib/plugins/authpdo/lang/ja/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
+ */
+$lang['debug'] = '詳細なエラーメッセージを出力する(セットアップ後、このオプションはオフにすべきです)';
+$lang['dsn'] = 'データベースにアクセスするDSN';
+$lang['user'] = '上記データベースに接続するユーザー名(sqliteの場合は空欄にしておいて下さい)';
+$lang['pass'] = '上記データベースに接続するパスワード(sqliteの場合は空欄にしておいて下さい)';
+$lang['select-user'] = '個々のユーザーのデータを選ぶSQL命令文';
+$lang['select-user-groups'] = '個々のユーザーが属する全てのグループを選ぶSQL命令文';
+$lang['select-groups'] = '利用可能な全グループを選ぶSQL命令文';
+$lang['insert-user'] = 'データベースに新規ユーザーを追加するSQL命令文';
+$lang['delete-user'] = '個々のユーザーをデータベースから取り除くSQL命令文';
+$lang['list-users'] = 'フィルターに一致するユーザーを一覧にするSQL命令文';
+$lang['count-users'] = 'フィルターに一致するユーザーを数えるSQL命令文';
+$lang['update-user-info'] = '個々のユーザーのフルネームとメールアドレスを更新するSQL命令文';
+$lang['update-user-login'] = '個々のユーザーのログイン名を更新するSQL命令文';
+$lang['update-user-pass'] = '個々のユーザーのパスワードを更新するSQL命令文';
+$lang['insert-group'] = 'データベースに新規グループを追加するSQL命令文';
+$lang['join-group'] = '既にあるグループにユーザーを追加するSQL命令文';
+$lang['leave-group'] = 'グループからユーザーを取り除くSQL命令文';
+$lang['check-pass'] = 'ユーザーのパスワードをチェックするSQL命令文(select-userでパスワード情報を呼び出す場合は空欄にしておけます)';
diff --git a/lib/plugins/authpdo/lang/ko/lang.php b/lib/plugins/authpdo/lang/ko/lang.php
index 0b14197b4..4a8a4d42e 100644
--- a/lib/plugins/authpdo/lang/ko/lang.php
+++ b/lib/plugins/authpdo/lang/ko/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author hyeonsoft <hyeonsoft@live.co.kr>
* @author Myeongjin <aranet100@gmail.com>
*/
diff --git a/lib/plugins/authpdo/lang/ko/settings.php b/lib/plugins/authpdo/lang/ko/settings.php
new file mode 100644
index 000000000..e2361d581
--- /dev/null
+++ b/lib/plugins/authpdo/lang/ko/settings.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author pavement <pavement@rael.cc>
+ * @author Traend <Traend@ruu.kr>
+ */
+$lang['debug'] = '자세한 오류 메시지를 출력합니다. 설정 후 비활성화해야 합니다.';
+$lang['dsn'] = '데이터베이스에 연결할 DSN';
+$lang['user'] = '위의 데이터베이스 연결에 대한 사용자(sqlite의 경우 비어 있음)';
+$lang['pass'] = '위의 데이터베이스 연결에 대한 암호(sqlite의 경우 비어 있음)';
+$lang['select-user'] = '단일 사용자의 데이터를 선택하기 위한 SQL 문
+';
+$lang['select-user-groups'] = '단일 사용자의 모든 그룹을 선택하기 위한 SQL 문';
+$lang['select-groups'] = '사용 가능한 모든 그룹을 선택하기 위한 SQL 문
+';
+$lang['insert-user'] = '데이터베이스에 새 사용자를 삽입하는 SQL 문
+';
+$lang['delete-user'] = '데이터베이스에서 단일 사용자를 제거하기 위한 SQL 문';
+$lang['list-users'] = '필터와 일치하는 사용자를 나열하는 SQL 문';
+$lang['count-users'] = '필터와 일치하는 사용자를 계산하는 SQL 문';
+$lang['update-user-info'] = '단일 사용자의 전체 이름과 이메일 주소를 업데이트하는 SQL 문';
+$lang['update-user-login'] = '단일 사용자의 로그인 이름을 업데이트하는 SQL 문';
+$lang['update-user-pass'] = '단일 사용자의 암호를 업데이트하는 SQL 문';
+$lang['insert-group'] = '데이터베이스에 새 그룹을 삽입하는 SQL 문';
+$lang['join-group'] = '기존 그룹에 사용자를 추가하는 SQL 문';
+$lang['leave-group'] = '그룹에서 사용자를 제거하는 SQL 문';
+$lang['check-pass'] = '사용자의 암호를 확인하는 SQL 문입니다. 선택 사용자에서 암호 정보를 가져오는 경우 비워 둘 수 있습니다.';
diff --git a/lib/plugins/authpdo/lang/nl/lang.php b/lib/plugins/authpdo/lang/nl/lang.php
index b426f6ba5..c0c688da0 100644
--- a/lib/plugins/authpdo/lang/nl/lang.php
+++ b/lib/plugins/authpdo/lang/nl/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Hugo Smet <hugo.smet@scarlet.be>
*/
$lang['connectfail'] = 'Connectie met de database mislukt.';
diff --git a/lib/plugins/authpdo/lang/nl/settings.php b/lib/plugins/authpdo/lang/nl/settings.php
new file mode 100644
index 000000000..4929e9178
--- /dev/null
+++ b/lib/plugins/authpdo/lang/nl/settings.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Gerrit Uitslag <klapinklapin@gmail.com>
+ * @author Andy <astolker@icloud.com>
+ */
+$lang['debug'] = 'Geef gedetailleerde foutmeldingen weer. Dit zou uitgeschakeld moeten zijn na de installatie.';
+$lang['dsn'] = 'De DSN om verbinding te maken met de database.';
+$lang['user'] = 'De gebruikersnaam voor de bovengenoemde database verbinding (laat leeg voor sqlite)';
+$lang['pass'] = 'Het wachtwoord voor de bovengenoemde database verbinding (laat leeg voor sqlite)';
+$lang['select-user'] = 'SQL Statement om de data te selecteren van één gebruiker';
+$lang['select-user-groups'] = 'SQL Statement om alle groepen van één gebruiker te selecteren';
+$lang['select-groups'] = 'SQL Statement om alle beschikbare groepen te selecteren';
+$lang['insert-user'] = 'SQL Statement om een nieuwe gebruiker in de database in te voeren';
+$lang['delete-user'] = 'SQL Statement om één gebruiker uit de database te verwijderen';
+$lang['list-users'] = 'SQL-instructie om gebruikers weer te geven die overeenkomen met een filter';
+$lang['count-users'] = 'SQL-instructie om gebruikers te tellen die overeenkomen met een filter';
+$lang['update-user-info'] = 'SQL-instructie om de volledige naam en e-mailadres van een enkele gebruiker bij te werken';
+$lang['update-user-login'] = 'SQL-instructie om de inlognaam van een enkele gebruiker bij te werken';
+$lang['update-user-pass'] = 'SQL-instructie om het wachtwoord van een enkele gebruiker bij te werken';
+$lang['insert-group'] = 'SQL-instructie om een nieuwe groep aan de database toe te voegen';
+$lang['join-group'] = 'SQL-instructie om een gebruiker aan een bestaande groep toe te voegen';
+$lang['leave-group'] = 'SQL-instructie om een gebruiker uit een groep te verwijderen';
+$lang['check-pass'] = 'SQL-instructie om het wachtwoord van een gebruiker te controleren. Kan leeg gelaten worden als de wachtwoordinformatie wordt opgehaald in select-user';
diff --git a/lib/plugins/authpdo/lang/pl/lang.php b/lib/plugins/authpdo/lang/pl/lang.php
new file mode 100644
index 000000000..fd813f1f9
--- /dev/null
+++ b/lib/plugins/authpdo/lang/pl/lang.php
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Przemek <p_kudriawcew@o2.pl>
+ */
+$lang['connectfail'] = 'Błąd łącznie się z bazą danych';
+$lang['userexists'] = 'Przepraszamy, użytkownik o tym loginie już istnieje';
+$lang['writefail'] = 'Nie można zmodyfikować danych użytkownika. Proszę skontaktować się z Administratorem';
diff --git a/lib/plugins/authpdo/lang/pl/settings.php b/lib/plugins/authpdo/lang/pl/settings.php
new file mode 100644
index 000000000..93f328abb
--- /dev/null
+++ b/lib/plugins/authpdo/lang/pl/settings.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Bartek S <sadupl@gmail.com>
+ * @author Przemek <p_kudriawcew@o2.pl>
+ */
+$lang['debug'] = 'Wyświetlanie szczegółowej wiadomości o błędzie. Powinno być wyłączone po ';
+$lang['dsn'] = 'Nazwa źródła danych do łączenia się z bazą danych';
+$lang['select-user'] = 'Zapytanie SQL, aby wybrać dane jednego użytkownika';
+$lang['select-user-groups'] = 'Zapytanie SQL aby wybrać wszystkie grupy jednego użytkownika';
+$lang['update-user-pass'] = 'Zapytanie SQL do zaktualizowania hasła dla pojedynczego użytkownika';
+$lang['insert-group'] = 'Zapytanie SQL aby dodać nową grupę do bazy danych';
+$lang['join-group'] = 'Zapytanie SQL aby dodać użytkownika do istniejącej grupy';
+$lang['leave-group'] = 'Zapytanie SQL aby usunąć użytkownika z grupy';
+$lang['check-pass'] = 'Zapytanie SQL aby sprawdzić hasło użytkownika. Można pozostawić puste, jeśli informacje o haśle są pobierane w select-user.';
diff --git a/lib/plugins/authpdo/lang/pt-br/lang.php b/lib/plugins/authpdo/lang/pt-br/lang.php
index 2008ae609..8f440860b 100644
--- a/lib/plugins/authpdo/lang/pt-br/lang.php
+++ b/lib/plugins/authpdo/lang/pt-br/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Frederico Gonçalves Guimarães <frederico@teia.bio.br>
*/
$lang['connectfail'] = 'Não foi possível conectar ao banco de dados.';
diff --git a/lib/plugins/authpdo/lang/pt-br/settings.php b/lib/plugins/authpdo/lang/pt-br/settings.php
new file mode 100644
index 000000000..b1d285bad
--- /dev/null
+++ b/lib/plugins/authpdo/lang/pt-br/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Frederico Gonçalves Guimarães <frederico@teia.bio.br>
+ */
+$lang['debug'] = 'Exibir mensagens de erro detalhadas. Deve ser desabilitado após a configuração.';
+$lang['dsn'] = 'O DSN para conectar ao banco de dados.';
+$lang['user'] = 'O usuário para a conexão ao banco de dados acima (em branco para sqlite)';
+$lang['pass'] = 'A senha para a conexão ao banco de dados acima (em branco para sqlite)';
+$lang['select-user'] = 'Declaração SQL para selecionar os dados de um único usuário';
+$lang['select-user-groups'] = 'Declaração SQL para selecionar todos os grupos de um único usuário';
+$lang['select-groups'] = 'Declaração SQL para selecionar todos os grupos disponíveis';
+$lang['insert-user'] = 'Declaração SQL para inserir um novo usuário no banco de dados';
+$lang['delete-user'] = 'Declaração SQL para remover um único usuário do banco de dados';
+$lang['list-users'] = 'Declaração SQL para listar usuários correspondentes a um filtro';
+$lang['count-users'] = 'Declaração SQL para contar usuários correspondentes a um filtro';
+$lang['update-user-info'] = 'Declaração SQL para atualizar o nome completo e endereço de e-mail de um único usuário';
+$lang['update-user-login'] = 'Declaração SQL para atualizar o nome de usuário de e-mail de um único usuário';
+$lang['update-user-pass'] = 'Declaração SQL para atualizar a senha de um único usuário';
+$lang['insert-group'] = 'Declaração SQL para inserir um novo grupo no banco de dados';
+$lang['join-group'] = 'Declaração SQL para adicionar um usuário a um grupo existente';
+$lang['leave-group'] = 'Declaração SQL para remover um usuário de um grupo';
+$lang['check-pass'] = 'Declaração SQL para verificar a senha de um usuário. Pode ser deixada em branco se a informação da senha for obtida a partir do usuário selecionado.';
diff --git a/lib/plugins/authpdo/lang/pt/lang.php b/lib/plugins/authpdo/lang/pt/lang.php
index f2eca8f59..3e7ed620b 100644
--- a/lib/plugins/authpdo/lang/pt/lang.php
+++ b/lib/plugins/authpdo/lang/pt/lang.php
@@ -2,8 +2,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
+ * @author Paulo Schopf <pschopf@gmail.com>
+ * @author Maykon Oliveira <maykonoliveira850@gmail.com>
* @author Paulo Carmino <contato@paulocarmino.com>
*/
-$lang['connectfail'] = 'Falha ao conectar com o banco de dados.';
+$lang['connectfail'] = 'Erro ao conectar o banco de dados.';
$lang['userexists'] = 'Desculpe, esse login já está sendo usado.';
+$lang['writefail'] = 'Não é possível modificar os dados do usuário. Por favor, informe o Wiki-Admin';
diff --git a/lib/plugins/authpdo/lang/pt/settings.php b/lib/plugins/authpdo/lang/pt/settings.php
new file mode 100644
index 000000000..45d259b61
--- /dev/null
+++ b/lib/plugins/authpdo/lang/pt/settings.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Paulo Ricardo Schopf <pschopf@gmail.com>
+ * @author Maykon Oliveira <maykonoliveira850@gmail.com>
+ */
+$lang['debug'] = 'Imprima mensagens de erro detalhadas. Deve ser desativado após a configuração.';
+$lang['dsn'] = 'O DSN para se conectar ao banco de dados.';
+$lang['user'] = 'O usuário para a conexão de banco de dados acima (vazio para sqlite)';
+$lang['pass'] = 'A senha para a conexão de banco de dados acima (vazia para sqlite)';
+$lang['select-user'] = 'Instrução SQL para selecionar os dados de um único usuário';
+$lang['select-user-groups'] = 'Instrução SQL para selecionar todos os grupos de um único usuário';
+$lang['select-groups'] = 'Instrução SQL para selecionar todos os grupos disponíveis';
+$lang['insert-user'] = 'Instrução SQL para inserir um novo usuário no banco de dados';
+$lang['delete-user'] = 'Instrução SQL para remover um usuário do banco de dados';
+$lang['list-users'] = 'Instrução SQL para listar usuários que correspondam a um filtro';
+$lang['count-users'] = 'Instrução SQL para contar usuários que correspondam a um filtro';
+$lang['update-user-info'] = 'Instrução SQL para atualizar o nome completo e e-mail de um usuário';
+$lang['update-user-login'] = 'Instrução SQL para atualizar o nome de login de um usuário';
+$lang['update-user-pass'] = 'Instrução SQL para atualizar a senha de um usuário';
+$lang['insert-group'] = 'Instrução SQL para inserir um novo grupo no banco de dados';
+$lang['join-group'] = 'Instrução SQL para adicionar um usuário a um grupo existente';
+$lang['leave-group'] = 'Instrução SQL para remover um usuário de um grupo';
+$lang['check-pass'] = 'Instrução SQL para verificar a senha de um usuário. Pode ser deixado em branco se a informação da senha for buscada no usuário selecionado.';
diff --git a/lib/plugins/authpdo/lang/ru/lang.php b/lib/plugins/authpdo/lang/ru/lang.php
index 9f75d1726..9dc832651 100644
--- a/lib/plugins/authpdo/lang/ru/lang.php
+++ b/lib/plugins/authpdo/lang/ru/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Takumo <9206984@mail.ru>
* @author Aleksandr Selivanov <alexgearbox@yandex.ru>
*/
diff --git a/lib/plugins/authpdo/lang/ru/settings.php b/lib/plugins/authpdo/lang/ru/settings.php
new file mode 100644
index 000000000..144763a0b
--- /dev/null
+++ b/lib/plugins/authpdo/lang/ru/settings.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Vyacheslav Strenadko <vyacheslav.strenadko@gmail.com>
+ */
+$lang['debug'] = 'Выводить подробные сообщения об ошибках. Должно быть отключено после настройки.';
+$lang['dsn'] = 'DSN (имя источника данных) для подключения к базе данных';
+$lang['user'] = 'Имя пользователя для подключения к базе данных (пустое для SQLite)';
+$lang['pass'] = 'Пароль для подключения к базе данных (пустой для SQLite)';
+$lang['select-user'] = 'SQL-выражение для выбора данных одного пользователя';
+$lang['select-user-groups'] = 'SQL-выражение для выбора всех групп одного пользователя';
+$lang['select-groups'] = 'SQL-выражение для выбора всех доступных групп';
+$lang['insert-user'] = 'SQL-выражение для добавления нового пользователя в базу данных';
+$lang['delete-user'] = 'SQL-выражение для удаления одного пользователя из базы данных';
+$lang['list-users'] = 'SQL-выражение для перечисления пользователей, соответствующих фильтру';
+$lang['count-users'] = 'SQL-выражение для подсчёта пользователей, соответствующих фильтру';
+$lang['update-user-info'] = 'SQL-выражение для обновления полного имени и адреса эл. почты одного пользователя';
+$lang['update-user-login'] = 'SQL-выражение для обновления логина одного пользователя';
+$lang['update-user-pass'] = 'SQL-выражение для обновления пароля одного пользователя';
+$lang['insert-group'] = 'SQL-выражение для добавления новой группы в базу данных';
+$lang['join-group'] = 'SQL-выражение для добавления пользователя в существующую группу';
+$lang['leave-group'] = 'SQL-выражение для удаления пользователя из группы';
+$lang['check-pass'] = 'SQL-выражение для проверки пароля пользователя. Может быть пустым, если информация о пароле выбрана пользователем. (Can be left empty if password info is fetched in select-user.)';
diff --git a/lib/plugins/authpdo/lang/sk/lang.php b/lib/plugins/authpdo/lang/sk/lang.php
index d143bbf2c..9f7038157 100644
--- a/lib/plugins/authpdo/lang/sk/lang.php
+++ b/lib/plugins/authpdo/lang/sk/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Martin Michalek <michalek.dev@gmail.com>
*/
$lang['connectfail'] = 'Nepodarilo sa pripojiť k databáze.';
diff --git a/lib/plugins/authpdo/lang/sk/settings.php b/lib/plugins/authpdo/lang/sk/settings.php
new file mode 100644
index 000000000..0fdbfa4e3
--- /dev/null
+++ b/lib/plugins/authpdo/lang/sk/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Martin Michalek <michalek.dev@gmail.com>
+ */
+$lang['debug'] = 'Výpis podrobných chybových hlásení. Po nastavení by sa malo vypnúť.';
+$lang['dsn'] = 'DSN pre pripojenie k databáze.';
+$lang['user'] = 'Používateľ uvedeného databázového pripojenia (prázdne pre sqllite)';
+$lang['pass'] = 'Heslo uvedeného databázového pripojenia (prázdne pre sqllite)';
+$lang['select-user'] = 'SQL príkaz pre výber údajov používateľa';
+$lang['select-user-groups'] = 'SQL príkaz pre výber všetkých skupín používateľa';
+$lang['select-groups'] = 'SQL príkaz pre výber dostupných skupín';
+$lang['insert-user'] = 'SQL príkaz pre vloženie údajov používateľa do databázy';
+$lang['delete-user'] = 'SQL príkaz pre odstránenie používateľa z databázy';
+$lang['list-users'] = 'SQL príkaz pre výpis používateľov podľa filtra';
+$lang['count-users'] = 'SQL príkaz pre spočítanie používateľov podľa filtra';
+$lang['update-user-info'] = 'SQL príkaz pre aktualizáciu mena a emailu používateľa';
+$lang['update-user-login'] = 'SQL príkaz pre aktualizáciu prihlasovacieho mena používateľa';
+$lang['update-user-pass'] = 'SQL príkaz pre aktualizáciu hesla používateľa';
+$lang['insert-group'] = 'SQL príkaz pre vloženie údajov skupiny do databázy';
+$lang['join-group'] = 'SQL príkaz pre pridanie používateľa do existujúcej skupiny';
+$lang['leave-group'] = 'SQL príkaz pre odstránenie používateľa zo skupiny';
+$lang['check-pass'] = 'SQL príkaz pre kontrolu hesla používateľa. Môže zostať prázdny, ak je informácia o hesle pripojená k výberu údajov používateľa.';
diff --git a/lib/plugins/authpdo/lang/tr/lang.php b/lib/plugins/authpdo/lang/tr/lang.php
index 30576c074..6e907165e 100644
--- a/lib/plugins/authpdo/lang/tr/lang.php
+++ b/lib/plugins/authpdo/lang/tr/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Mete Cuma <mcumax@gmail.com>
*/
$lang['connectfail'] = 'Veritabanına bağlantı kurulamadı.';
diff --git a/lib/plugins/authpdo/lang/uk/lang.php b/lib/plugins/authpdo/lang/uk/lang.php
new file mode 100644
index 000000000..e5b9d65a3
--- /dev/null
+++ b/lib/plugins/authpdo/lang/uk/lang.php
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Dmytro Marchenko <dmytro.marchenko1989@gmail.com>
+ */
+$lang['connectfail'] = 'Не вдалося підключитися до бази даних.';
+$lang['userexists'] = 'На жаль, користувач із цим логіном вже існує.';
+$lang['writefail'] = 'Неможливо змінити дані користувача. Будь-ласка, повідомте про це Wiki-Адміністратора';
diff --git a/lib/plugins/authpdo/lang/uk/settings.php b/lib/plugins/authpdo/lang/uk/settings.php
new file mode 100644
index 000000000..94abd897a
--- /dev/null
+++ b/lib/plugins/authpdo/lang/uk/settings.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Dmytro Marchenko <dmytro.marchenko1989@gmail.com>
+ */
+$lang['dsn'] = 'DSN для підключення до бази даних.';
+$lang['user'] = 'Користувач для вищевказаного з\'єднання з базою даних (порожній для sqlite)';
+$lang['pass'] = 'Пароль для вищезазначеного з\'єднання з базою даних (порожній для sqlite)';
+$lang['select-user'] = 'Запит SQL для вибору даних одного користувача';
+$lang['select-user-groups'] = 'Запит SQL для вибору всіх груп одного користувача';
+$lang['select-groups'] = 'Запит SQL для вибору всіх доступних груп';
+$lang['insert-user'] = 'Запит SQL для вставки нового користувача в базу даних';
+$lang['delete-user'] = 'Запит SQL для видалення одного користувача з бази даних';
diff --git a/lib/plugins/authpdo/lang/vi/lang.php b/lib/plugins/authpdo/lang/vi/lang.php
new file mode 100644
index 000000000..42de9865a
--- /dev/null
+++ b/lib/plugins/authpdo/lang/vi/lang.php
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['connectfail'] = 'Không thể kết nối với cơ sở dữ liệu.';
+$lang['userexists'] = 'Xin lỗi, thành viên có thông tin đăng nhập này đã tồn tại.';
+$lang['writefail'] = 'Không thể sửa đổi dữ liệu thành viên. Vui lòng thông báo cho Admin-Wiki';
diff --git a/lib/plugins/authpdo/lang/vi/settings.php b/lib/plugins/authpdo/lang/vi/settings.php
new file mode 100644
index 000000000..dfc367ac6
--- /dev/null
+++ b/lib/plugins/authpdo/lang/vi/settings.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['debug'] = 'In ra các thông báo lỗi chi tiết. Nên bị vô hiệu hóa sau khi thiết lập.';
+$lang['dsn'] = 'DSN để kết nối với cơ sở dữ liệu.';
+$lang['user'] = 'Thành viên cho kết nối cơ sở dữ liệu trên (trống cho sqlite)';
+$lang['pass'] = 'Mật khẩu cho kết nối cơ sở dữ liệu trên (trống cho sqlite)';
+$lang['select-user'] = 'Câu lệnh SQL để chọn dữ liệu của một thành viên';
+$lang['select-user-groups'] = 'Câu lệnh SQL để chọn tất cả các nhóm của một thành viên';
+$lang['select-groups'] = 'Câu lệnh SQL để chọn tất cả các nhóm có sẵn';
+$lang['insert-user'] = 'Câu lệnh SQL để chèn thành viên mới vào cơ sở dữ liệu';
+$lang['delete-user'] = 'Câu lệnh SQL để xóa một thành viên khỏi cơ sở dữ liệu';
+$lang['list-users'] = 'Câu lệnh SQL để liệt kê thành viên khớp với bộ lọc';
+$lang['count-users'] = 'Câu lệnh SQL để đếm thành viên khớp với bộ lọc';
+$lang['update-user-info'] = 'Câu lệnh SQL để cập nhật tên đầy đủ và địa chỉ thư điện thử của một thành viên';
+$lang['update-user-login'] = 'Câu lệnh SQL để cập nhật tên đăng nhập của một thành viên';
+$lang['update-user-pass'] = 'Câu lệnh SQL để cập nhật mật khẩu của một thành viên';
+$lang['insert-group'] = 'Câu lệnh SQL để chèn một nhóm mới vào cơ sở dữ liệu';
+$lang['join-group'] = 'Câu lệnh SQL để thêm thành viên vào một nhóm hiện có';
+$lang['leave-group'] = 'Câu lệnh SQL để xóa thành viên khỏi một nhóm';
+$lang['check-pass'] = 'Câu lệnh SQL để kiểm tra mật khẩu của thành viên. Có thể để trống nếu thông tin mật khẩu được tìm nạp trong thành viên chọn.';
diff --git a/lib/plugins/authpdo/lang/zh/lang.php b/lib/plugins/authpdo/lang/zh/lang.php
index 06c258f9b..be66754a6 100644
--- a/lib/plugins/authpdo/lang/zh/lang.php
+++ b/lib/plugins/authpdo/lang/zh/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Errol <errol@hotmail.com>
*/
$lang['connectfail'] = '连接数据库失败';
diff --git a/lib/plugins/authpdo/lang/zh/settings.php b/lib/plugins/authpdo/lang/zh/settings.php
new file mode 100644
index 000000000..9374b75d9
--- /dev/null
+++ b/lib/plugins/authpdo/lang/zh/settings.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Phy <dokuwiki@phy25.com>
+ * @author Aaron Zhou <iradio@163.com>
+ */
+$lang['debug'] = '打印详细的错误信息。应该在设定完成后禁用。';
+$lang['dsn'] = '连接到数据库的DSN';
+$lang['user'] = '以上数据库连接的用户名(sqlite 留空)';
+$lang['pass'] = '以上数据库连接的密码 (sqlite 留空)';
+$lang['select-user'] = '选择单一用户数据的SQL语句';
+$lang['select-user-groups'] = '选择单一用户所有用户组的SQL语句';
+$lang['select-groups'] = '选择所有有效组的SQL语句';
+$lang['insert-user'] = '向数据库插入一个新用户的SQL语句';
+$lang['delete-user'] = '从数据库中移除单个用户的SQL语句';
+$lang['list-users'] = '列出与筛选条件匹配用户的SQL语句';
+$lang['count-users'] = '统计与筛选条件匹配的用户数量的SQL语句';
+$lang['update-user-info'] = '更新单一用户全名和email地址的SQL语句';
+$lang['update-user-login'] = '更新单一用户登录名的SQL语句';
+$lang['update-user-pass'] = '更新单一用户密码的SQL语句';
+$lang['insert-group'] = '向数据库中插入一个新组的SQL语句';
+$lang['join-group'] = '把用户增加到现有用户组的 SQL 语句';
+$lang['leave-group'] = '把用户移除出现有用户组的 SQL 语句';
+$lang['check-pass'] = '查询用户密码的 SQL 语句(如密码在 select-user 查询时已经获取,则本设置可留空)';
diff --git a/lib/plugins/authpgsql/auth.php b/lib/plugins/authpgsql/auth.php
deleted file mode 100644
index 7b677d3d7..000000000
--- a/lib/plugins/authpgsql/auth.php
+++ /dev/null
@@ -1,431 +0,0 @@
-<?php
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-/**
- * PostgreSQL authentication backend
- *
- * This class inherits much functionality from the MySQL class
- * and just reimplements the Postgres specific parts.
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Chris Smith <chris@jalakai.co.uk>
- * @author Matthias Grimm <matthias.grimmm@sourceforge.net>
- * @author Jan Schumann <js@schumann-it.com>
- */
-class auth_plugin_authpgsql extends auth_plugin_authmysql {
-
- /**
- * Constructor
- *
- * checks if the pgsql interface is available, otherwise it will
- * set the variable $success of the basis class to false
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- public function __construct() {
- // we don't want the stuff the MySQL constructor does, but the grandparent might do something
- DokuWiki_Auth_Plugin::__construct();
-
- if(!function_exists('pg_connect')) {
- $this->_debug("PgSQL err: PHP Postgres extension not found.", -1, __LINE__, __FILE__);
- $this->success = false;
- return;
- }
-
- $this->loadConfig();
-
- // set capabilities based upon config strings set
- if(empty($this->conf['user']) ||
- empty($this->conf['password']) || empty($this->conf['database'])
- ) {
- $this->_debug("PgSQL err: insufficient configuration.", -1, __LINE__, __FILE__);
- $this->success = false;
- return;
- }
-
- $this->cando['addUser'] = $this->_chkcnf(
- array(
- 'getUserInfo',
- 'getGroups',
- 'addUser',
- 'getUserID',
- 'getGroupID',
- 'addGroup',
- 'addUserGroup'
- )
- );
- $this->cando['delUser'] = $this->_chkcnf(
- array(
- 'getUserID',
- 'delUser',
- 'delUserRefs'
- )
- );
- $this->cando['modLogin'] = $this->_chkcnf(
- array(
- 'getUserID',
- 'updateUser',
- 'UpdateTarget'
- )
- );
- $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'
- )
- );
- /* getGroups is not yet supported
- $this->cando['getGroups'] = $this->_chkcnf(array('getGroups',
- 'getGroupID')); */
- $this->cando['getUsers'] = $this->_chkcnf(
- array(
- 'getUsers',
- 'getUserInfo',
- 'getGroups'
- )
- );
- $this->cando['getUserCount'] = $this->_chkcnf(array('getUsers'));
- }
-
- /**
- * Check if the given config strings are set
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string[] $keys
- * @param bool $wop
- * @return bool
- */
- protected function _chkcnf($keys, $wop = false) {
- foreach($keys as $key) {
- if(empty($this->conf[$key])) return false;
- }
- return true;
- }
-
- /**
- * Counts users which meet certain $filter criteria.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param array $filter filter criteria in item/pattern pairs
- * @return int count of found users.
- */
- public function getUserCount($filter = array()) {
- $rc = 0;
-
- if($this->_openDB()) {
- $sql = $this->_createSQLFilter($this->conf['getUsers'], $filter);
-
- // no equivalent of SQL_CALC_FOUND_ROWS in pgsql?
- if(($result = $this->_queryDB($sql))) {
- $rc = count($result);
- }
- $this->_closeDB();
- }
- return $rc;
- }
-
- /**
- * Bulk retrieval of user data
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param int $first 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
- * @return array userinfo (refer getUserData for internal userinfo details)
- */
- public function retrieveUsers($first = 0, $limit = 0, $filter = array()) {
- $out = array();
-
- if($this->_openDB()) {
- $this->_lockTables("READ");
- $sql = $this->_createSQLFilter($this->conf['getUsers'], $filter);
- $sql .= " ".$this->conf['SortOrder'];
- if($limit) $sql .= " LIMIT $limit";
- if($first) $sql .= " OFFSET $first";
- $result = $this->_queryDB($sql);
-
- foreach($result as $user) {
- if(($info = $this->_getUserInfo($user['user']))) {
- $out[$user['user']] = $info;
- }
- }
-
- $this->_unlockTables();
- $this->_closeDB();
- }
- return $out;
- }
-
- // @inherit function joinGroup($user, $group)
- // @inherit function leaveGroup($user, $group) {
-
- /**
- * Adds a user to a group.
- *
- * If $force is set to true non existing groups would be created.
- *
- * The database connection must already be established. Otherwise
- * this function does nothing and returns 'false'.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string $user user to add to a group
- * @param string $group name of the group
- * @param bool $force create missing groups
- * @return bool true on success, false on error
- */
- protected function _addUserToGroup($user, $group, $force = false) {
- $newgroup = 0;
-
- if(($this->dbcon) && ($user)) {
- $gid = $this->_getGroupID($group);
- if(!$gid) {
- if($force) { // create missing groups
- $sql = str_replace('%{group}', addslashes($group), $this->conf['addGroup']);
- $this->_modifyDB($sql);
- //group should now exists try again to fetch it
- $gid = $this->_getGroupID($group);
- $newgroup = 1; // group newly created
- }
- }
- if(!$gid) return false; // group didn't exist and can't be created
-
- $sql = $this->conf['addUserGroup'];
- if(strpos($sql, '%{uid}') !== false) {
- $uid = $this->_getUserID($user);
- $sql = str_replace('%{uid}', addslashes($uid), $sql);
- }
- $sql = str_replace('%{user}', addslashes($user), $sql);
- $sql = str_replace('%{gid}', addslashes($gid), $sql);
- $sql = str_replace('%{group}', addslashes($group), $sql);
- if($this->_modifyDB($sql) !== false) {
- $this->_flushUserInfoCache($user);
- return true;
- }
-
- if($newgroup) { // remove previously created group on error
- $sql = str_replace('%{gid}', addslashes($gid), $this->conf['delGroup']);
- $sql = str_replace('%{group}', addslashes($group), $sql);
- $this->_modifyDB($sql);
- }
- }
- return false;
- }
-
- // @inherit function _delUserFromGroup($user $group)
- // @inherit function _getGroups($user)
- // @inherit function _getUserID($user)
-
- /**
- * Adds a new User to the database.
- *
- * The database connection must already be established
- * for this function to work. Otherwise it will return
- * 'false'.
- *
- * @param string $user login of the user
- * @param string $pwd encrypted password
- * @param string $name full name of the user
- * @param string $mail email address
- * @param array $grps array of groups the user should become member of
- * @return bool
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Chris Smith <chris@jalakai.co.uk>
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- */
- protected function _addUser($user, $pwd, $name, $mail, $grps) {
- if($this->dbcon && is_array($grps)) {
- $sql = str_replace('%{user}', addslashes($user), $this->conf['addUser']);
- $sql = str_replace('%{pass}', addslashes($pwd), $sql);
- $sql = str_replace('%{name}', addslashes($name), $sql);
- $sql = str_replace('%{email}', addslashes($mail), $sql);
- if($this->_modifyDB($sql)) {
- $uid = $this->_getUserID($user);
- } else {
- return false;
- }
-
- $group = '';
- $gid = false;
-
- if($uid) {
- foreach($grps as $group) {
- $gid = $this->_addUserToGroup($user, $group, true);
- if($gid === false) break;
- }
-
- if($gid !== false){
- $this->_flushUserInfoCache($user);
- 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);
- $this->_debug("PgSQL err: Adding user '$user' to group '$group' failed.", -1, __LINE__, __FILE__);
- }
- }
- }
- return false;
- }
-
- /**
- * Opens a connection to a database and saves the handle for further
- * usage in the object. The successful call to this functions is
- * essential for most functions in this object.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @return bool
- */
- protected function _openDB() {
- if(!$this->dbcon) {
- $dsn = $this->conf['server'] ? 'host='.$this->conf['server'] : '';
- $dsn .= ' port='.$this->conf['port'];
- $dsn .= ' dbname='.$this->conf['database'];
- $dsn .= ' user='.$this->conf['user'];
- $dsn .= ' password='.conf_decodeString($this->conf['password']);
-
- $con = @pg_connect($dsn);
- if($con) {
- $this->dbcon = $con;
- return true; // connection and database successfully opened
- } else {
- $this->_debug(
- "PgSQL err: Connection to {$this->conf['user']}@{$this->conf['server']} not possible.",
- -1, __LINE__, __FILE__
- );
- }
- return false; // connection failed
- }
- return true; // connection already open
- }
-
- /**
- * Closes a database connection.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- */
- protected function _closeDB() {
- if($this->dbcon) {
- pg_close($this->dbcon);
- $this->dbcon = 0;
- }
- }
-
- /**
- * Sends a SQL query to the database and transforms the result into
- * an associative array.
- *
- * This function is only able to handle queries that returns a
- * table such as SELECT.
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $query SQL string that contains the query
- * @return array|false the result table
- */
- protected function _queryDB($query) {
- $resultarray = array();
- if($this->dbcon) {
- $result = @pg_query($this->dbcon, $query);
- if($result) {
- while(($t = pg_fetch_assoc($result)) !== false)
- $resultarray[] = $t;
- pg_free_result($result);
- return $resultarray;
- } else{
- $this->_debug('PgSQL err: '.pg_last_error($this->dbcon), -1, __LINE__, __FILE__);
- }
- }
- return false;
- }
-
- /**
- * Executes an update or insert query. This differs from the
- * MySQL one because it does NOT return the last insertID
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string $query
- * @return bool
- */
- protected function _modifyDB($query) {
- if($this->dbcon) {
- $result = @pg_query($this->dbcon, $query);
- if($result) {
- pg_free_result($result);
- return true;
- }
- $this->_debug('PgSQL err: '.pg_last_error($this->dbcon), -1, __LINE__, __FILE__);
- }
- return false;
- }
-
- /**
- * Start a transaction
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @param string $mode could be 'READ' or 'WRITE'
- * @return bool
- */
- protected function _lockTables($mode) {
- if($this->dbcon) {
- $this->_modifyDB('BEGIN');
- return true;
- }
- return false;
- }
-
- /**
- * Commit a transaction
- *
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
- *
- * @return bool
- */
- protected function _unlockTables() {
- if($this->dbcon) {
- $this->_modifyDB('COMMIT');
- return true;
- }
- return false;
- }
-
- /**
- * Escape a string for insertion into the database
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @param string $string The string to escape
- * @param bool $like Escape wildcard chars as well?
- * @return string
- */
- protected function _escape($string, $like = false) {
- $string = pg_escape_string($string);
- if($like) {
- $string = addcslashes($string, '%_');
- }
- return $string;
- }
-}
diff --git a/lib/plugins/authpgsql/conf/default.php b/lib/plugins/authpgsql/conf/default.php
deleted file mode 100644
index 7f78280f9..000000000
--- a/lib/plugins/authpgsql/conf/default.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-$conf['server'] = '';
-$conf['port'] = 5432;
-$conf['user'] = '';
-$conf['password'] = '';
-$conf['database'] = '';
-$conf['debug'] = 0;
-$conf['forwardClearPass'] = 0;
-$conf['checkPass'] = '';
-$conf['getUserInfo'] = '';
-$conf['getGroups'] = '';
-$conf['getUsers'] = '';
-$conf['FilterLogin'] = '';
-$conf['FilterName'] = '';
-$conf['FilterEmail'] = '';
-$conf['FilterGroup'] = '';
-$conf['SortOrder'] = '';
-$conf['addUser'] = '';
-$conf['addGroup'] = '';
-$conf['addUserGroup'] = '';
-$conf['delGroup'] = '';
-$conf['getUserID'] = '';
-$conf['delUser'] = '';
-$conf['delUserRefs'] = '';
-$conf['updateUser'] = '';
-$conf['UpdateLogin'] = '';
-$conf['UpdatePass'] = '';
-$conf['UpdateEmail'] = '';
-$conf['UpdateName'] = '';
-$conf['UpdateTarget'] = '';
-$conf['delUserGroup'] = '';
-$conf['getGroupID'] = ''; \ No newline at end of file
diff --git a/lib/plugins/authpgsql/conf/metadata.php b/lib/plugins/authpgsql/conf/metadata.php
deleted file mode 100644
index cb9c45643..000000000
--- a/lib/plugins/authpgsql/conf/metadata.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-$meta['server'] = array('string','_caution' => 'danger');
-$meta['port'] = array('numeric','_caution' => 'danger');
-$meta['user'] = array('string','_caution' => 'danger');
-$meta['password'] = array('password','_caution' => 'danger','_code'=>'base64');
-$meta['database'] = array('string','_caution' => 'danger');
-$meta['debug'] = array('onoff','_caution' => 'security');
-$meta['forwardClearPass'] = array('onoff','_caution' => 'danger');
-$meta['checkPass'] = array('','_caution' => 'danger');
-$meta['getUserInfo'] = array('','_caution' => 'danger');
-$meta['getGroups'] = array('');
-$meta['getUsers'] = array('','_caution' => 'danger');
-$meta['FilterLogin'] = array('string','_caution' => 'danger');
-$meta['FilterName'] = array('string','_caution' => 'danger');
-$meta['FilterEmail'] = array('string','_caution' => 'danger');
-$meta['FilterGroup'] = array('string','_caution' => 'danger');
-$meta['SortOrder'] = array('string','_caution' => 'danger');
-$meta['addUser'] = array('','_caution' => 'danger');
-$meta['addGroup'] = array('','_caution' => 'danger');
-$meta['addUserGroup'] = array('','_caution' => 'danger');
-$meta['delGroup'] = array('','_caution' => 'danger');
-$meta['getUserID'] = array('','_caution' => 'danger');
-$meta['delUser'] = array('','_caution' => 'danger');
-$meta['delUserRefs'] = array('','_caution' => 'danger');
-$meta['updateUser'] = array('string','_caution' => 'danger');
-$meta['UpdateLogin'] = array('string','_caution' => 'danger');
-$meta['UpdatePass'] = array('string','_caution' => 'danger');
-$meta['UpdateEmail'] = array('string','_caution' => 'danger');
-$meta['UpdateName'] = array('string','_caution' => 'danger');
-$meta['UpdateTarget'] = array('string','_caution' => 'danger');
-$meta['delUserGroup'] = array('','_caution' => 'danger');
-$meta['getGroupID'] = array('','_caution' => 'danger');
diff --git a/lib/plugins/authpgsql/lang/bg/settings.php b/lib/plugins/authpgsql/lang/bg/settings.php
deleted file mode 100644
index bd6ae1cee..000000000
--- a/lib/plugins/authpgsql/lang/bg/settings.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Kiril <neohidra@gmail.com>
- */
-$lang['server'] = 'Вашият PostgreSQL сървър';
-$lang['port'] = 'Порт за PostgreSQL сървъра';
-$lang['user'] = 'PostgreSQL потребител';
-$lang['password'] = 'Парола за горния потребител';
-$lang['database'] = 'Име на базата от данни';
-$lang['debug'] = 'Показване на допълнителна debug информация';
diff --git a/lib/plugins/authpgsql/lang/cs/settings.php b/lib/plugins/authpgsql/lang/cs/settings.php
deleted file mode 100644
index af8b837ca..000000000
--- a/lib/plugins/authpgsql/lang/cs/settings.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author mkucera66 <mkucera66@seznam.cz>
- * @author Jaroslav Lichtblau <jlichtblau@seznam.cz>
- */
-$lang['server'] = 'Váš server PostgreSQL';
-$lang['port'] = 'Port vašeho serveru PostgreSQL';
-$lang['user'] = 'Uživatelské jméno pro PostgreSQL';
-$lang['password'] = 'Heslo tohoto uživatele';
-$lang['database'] = 'Použtá databáze';
-$lang['debug'] = 'Zobrazit dodatečné debugovací informace';
-$lang['forwardClearPass'] = 'Posílat uživatelské heslo jako čistý text do příkazů SQL namísto využití volby passcrypt.';
-$lang['checkPass'] = 'Příkaz SQL pro kontrolu hesel';
-$lang['getUserInfo'] = 'Příkaz SQL pro získání informací o uživateli';
-$lang['getGroups'] = 'Příkaz SQL pro získání členství uživatele ve skupinách';
-$lang['getUsers'] = 'Příkaz SQL pro seznam všech uživatelů';
-$lang['FilterLogin'] = 'Příkaz SQL pro filtrování uživatelů podle přihlašovacího jména';
-$lang['FilterName'] = 'Příkaz SQL pro filtrování uživatelů podle celého jména';
-$lang['FilterEmail'] = 'Příkaz SQL pro filtrování uživatelů podle adres e-mailů';
-$lang['FilterGroup'] = 'Příkaz SQL pro filtrování uživatelů podle členství ve skupinách';
-$lang['SortOrder'] = 'Příkaz SQL pro řazení uživatelů';
-$lang['addUser'] = 'Příkaz SQL pro řazení uživatelů';
-$lang['addGroup'] = 'Příkaz SQL pro přidání nové skupiny';
-$lang['addUserGroup'] = 'Příkaz SQL pro přidání uživatele do existující skupiny';
-$lang['delGroup'] = 'Příkaz SQL pro vymazání skupiny';
-$lang['getUserID'] = 'Příkaz SQL pro získání primárního klíče uživatele';
-$lang['delUser'] = 'Příkaz SQL pro vymazání uživatele';
-$lang['delUserRefs'] = 'Příkaz SQL pro odstranění členství uživatele se všech skupin';
-$lang['updateUser'] = 'Příkaz SQL pro aktualizaci uživatelského profilu';
-$lang['UpdateLogin'] = 'Klauzule pro aktualizaci přihlačovacího jména uživatele';
-$lang['UpdatePass'] = 'Klauzule pro aktualizaci hesla uživatele';
-$lang['UpdateEmail'] = 'Klauzule pro aktualizaci e-mailové adresy uživatele';
-$lang['UpdateName'] = 'Klauzule pro aktualizaci celého jména uživatele';
-$lang['UpdateTarget'] = 'Omezující klauzule pro identifikaci uživatele při aktualizaci';
-$lang['delUserGroup'] = 'Příkaz SQL pro zrušení členství uživatele v dané skupině';
-$lang['getGroupID'] = 'Příkaz SQL pro získání primárního klíče skupiny';
diff --git a/lib/plugins/authpgsql/lang/cy/settings.php b/lib/plugins/authpgsql/lang/cy/settings.php
deleted file mode 100644
index 0c32ad7b2..000000000
--- a/lib/plugins/authpgsql/lang/cy/settings.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-$lang['server'] = 'Eich gweinydd PostgreSQL';
-$lang['port'] = 'Porth eich gweinydd PostgreSQL';
-$lang['user'] = 'Defnyddair PostgreSQL';
-$lang['password'] = 'Cyfrinair y defnyddiwr uchod';
-$lang['database'] = 'Databas i\'w ddefnyddio';
-$lang['debug'] = 'angos gwybodaeth dadfygio ychwanegol';
-$lang['forwardClearPass'] = 'Pasio cyfrineiriau defnyddwyr fel \'cleartext\' i\'r datganiadau SQL isod, yn hytrach na defnyddio\'r opsiwn \'passcrypt\'';
-$lang['checkPass'] = 'Datganiad SQL i wirio cyfrineiriau';
-$lang['getUserInfo'] = 'Datganiad SQL i nôl gwybodaeth defnyddiwr';
-$lang['getGroups'] = 'Datganiad SQL i nôl aelodaeth grŵp y defnyddiwr';
-$lang['getUsers'] = 'Datganiad SQL i restru pob defnyddiwr';
-$lang['FilterLogin'] = 'Cymal SQL i hidlo defnyddwyr gan enw mewngofnodi';
-$lang['FilterName'] = 'Cymal SQL i hidlo defnyddwyr gan enw llawn';
-$lang['FilterEmail'] = 'Cymal SQL i hidlo defnyddwyr gan gyfeiriad ebost';
-$lang['FilterGroup'] = 'Cymal SQL i hidlo defnyddwyr gan aelodaeth grŵp';
-$lang['SortOrder'] = 'Cymal SQL i drefnu defnyddwyr';
-$lang['addUser'] = 'Datganiad SQL i ychwanegu defnyddiwr newydd';
-$lang['addGroup'] = 'Datganiad SQL i ychwanegu grŵp newydd';
-$lang['addUserGroup'] = 'Datganiad SQL i ychwanegu defnyddiwr newydd i grŵp sy\'n bodoli eisoes';
-$lang['delGroup'] = 'Datganiad SQL i dynnu grŵp';
-$lang['getUserID'] = 'Datganiad SQL i nôl prif allwedd y defnyddiwr';
-$lang['delUser'] = 'Datganiad SQL i ddileu defnyddiwr';
-$lang['delUserRefs'] = 'Datganiad SQL i dynnu defnyddiwr o bob grŵp';
-$lang['updateUser'] = 'Datganiad SQL i ddiweddaru proffil defnyddiwr';
-$lang['UpdateLogin'] = 'Cymal Diweddaru i ddiweddaru enw mewngofnodi defnyddiwr';
-$lang['UpdatePass'] = 'Cymal Diweddaru i ddiweddaru cyfrinair defnyddiwr';
-$lang['UpdateEmail'] = 'Cymal Diweddaru i ddiweddaru cyfeiriad ebost defnyddiwr';
-$lang['UpdateName'] = 'Cymal Diweddaru i ddiweddaru enw llawn defnyddiwr';
-$lang['UpdateTarget'] = 'Cymal Cyfyngu i adnabod y defnyddiwr wrth ddiweddaru';
-$lang['delUserGroup'] = 'Datganiad SQL i dynnu defnyddiwr oddi ar grŵp';
-$lang['getGroupID'] = 'Datganiad SQL i nôl prif allwedd grŵp penodol';
diff --git a/lib/plugins/authpgsql/lang/da/settings.php b/lib/plugins/authpgsql/lang/da/settings.php
deleted file mode 100644
index bca2bfb36..000000000
--- a/lib/plugins/authpgsql/lang/da/settings.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Jens Hyllegaard <jens.hyllegaard@gmail.com>
- * @author soer9648 <soer9648@eucl.dk>
- */
-$lang['server'] = 'Din PostgresSQL server';
-$lang['port'] = 'Din PostgresSQL servers port';
-$lang['password'] = 'Kodeord til ovenstående bruger';
-$lang['database'] = 'Database der skal benyttes';
-$lang['debug'] = 'Vis yderligere debug output';
-$lang['checkPass'] = 'SQL-sætning til at kontrollere kodeord';
-$lang['getUsers'] = 'SQL-sætning til at liste alle brugere';
-$lang['addUser'] = 'SQL-sætning til at tilføje en ny bruger';
-$lang['addGroup'] = 'SQL-sætning til at tilføje en ny gruppe';
-$lang['addUserGroup'] = 'SQL-sætning til at tilføje en bruger til en eksisterende gruppe';
-$lang['delGroup'] = 'SQL-sætning til at fjerne en gruppe';
-$lang['delUser'] = 'SQL-sætning til at slette en bruger';
-$lang['delUserRefs'] = 'SQL-sætning til at fjerne en bruger fra alle grupper';
-$lang['updateUser'] = 'SQL-sætning til at opdatere en brugerprofil';
diff --git a/lib/plugins/authpgsql/lang/de-informal/settings.php b/lib/plugins/authpgsql/lang/de-informal/settings.php
deleted file mode 100644
index 2547e2c2f..000000000
--- a/lib/plugins/authpgsql/lang/de-informal/settings.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Matthias Schulte <dokuwiki@lupo49.de>
- * @author Volker Bödker <volker@boedker.de>
- */
-$lang['server'] = 'PostgreSQL-Server';
-$lang['port'] = 'Port des PostgreSQL-Servers.';
-$lang['user'] = 'Benutzername für den Zugriff auf den PostgreSQL-Server.';
-$lang['password'] = 'Passwort des angegebenen Benutzers.';
-$lang['database'] = 'Zu verwendende Datenbank.';
-$lang['debug'] = 'Debug-Informationen anzeigen?';
-$lang['forwardClearPass'] = 'Passwort der DokuWiki-Benutzer im Klartext an die Datenbank übergeben? (Im Normalfall wird die passcrypt-Option angewendet.)';
-$lang['checkPass'] = 'SQL-Kommando zum Überprüfen von Passwörtern.';
-$lang['getUserInfo'] = 'SQL-Kommando um Benutzerinformationen auszulesen.';
-$lang['getGroups'] = 'SQL-Kommando um Gruppen eines Benutzers auszulesen.';
-$lang['getUsers'] = 'SQL-Kommando um alle Benutzer auszulesen.';
-$lang['FilterLogin'] = 'SQL-Bedingung um Benutzer anhand ihres Anmeldenamens zu filtern.';
-$lang['FilterName'] = 'SQL-Bedingung um Benutzer anhand ihres Namens zu filtern.';
-$lang['FilterEmail'] = 'SQL-Bedingung um Benutzer anhand ihrer E-Mail-Adresse zu filtern.';
-$lang['FilterGroup'] = 'SQL-Bedingung um Benutzer anhand ihrer Gruppenzugehörigkeit zu filtern.';
-$lang['SortOrder'] = 'SQL-Bedingung um anhand der die Benutzerliste sortiert wird.';
-$lang['addUser'] = 'SQL-Kommando um einen neuen Benutzer anzulegen.';
-$lang['addGroup'] = 'SQL-Kommando um eine neue Gruppe anzulegen.';
-$lang['addUserGroup'] = 'SQL-Kommando um einen Benutzer zu einer Gruppe hinzuzufügen.';
-$lang['delGroup'] = 'SQL-Kommando um eine Gruppe zu löschen.';
-$lang['getUserID'] = 'SQL-Kommando um den Primärschlüssel des Benutzers auszulesen.';
-$lang['delUser'] = 'SQL-Kommando um einen Benutzer zu löschen.';
-$lang['delUserRefs'] = 'SQL-Kommando um einen Benutzer aus allen Gruppen zu entfernen.';
-$lang['updateUser'] = 'SQL-Kommando um das Profil eines Benutzers zu aktualisieren.';
-$lang['UpdateLogin'] = 'SQL-Bedingung um den Anmeldenamen eines Benutzers zu ändern.';
-$lang['UpdatePass'] = 'SQL-Bedingung um das Passwort eines Benutzers zu ändern.';
-$lang['UpdateEmail'] = 'SQL-Bedingung um die E-Mail-Adresse eines Benutzers zu ändern.';
-$lang['UpdateName'] = 'SQL-Bedingung um den Namen eines Benutzers zu ändern.';
-$lang['UpdateTarget'] = 'SQL-Bedingung zur eindeutigen Identifikation des Benutzers.';
-$lang['delUserGroup'] = 'SQL-Kommando um einen Benutzer aus einer angegeben Gruppe zu entfernen.';
-$lang['getGroupID'] = 'SQL-Kommando um den Primärschlüssel einer Gruppe auszulesen.';
diff --git a/lib/plugins/authpgsql/lang/de/settings.php b/lib/plugins/authpgsql/lang/de/settings.php
deleted file mode 100644
index 6a18811b3..000000000
--- a/lib/plugins/authpgsql/lang/de/settings.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Matthias Schulte <dokuwiki@lupo49.de>
- * @author Hella Breitkopf <hella.breitkopf@gmail.com>
- */
-$lang['server'] = 'PostgreSQL-Server';
-$lang['port'] = 'Port des PostgreSQL-Servers.';
-$lang['user'] = 'Benutzername für den Zugriff auf den PostgreSQL-Server.';
-$lang['password'] = 'Passwort des angegebenen Benutzers.';
-$lang['database'] = 'Zu verwendende Datenbank.';
-$lang['debug'] = 'Debug-Informationen anzeigen?';
-$lang['forwardClearPass'] = 'Passwort der DokuWiki-Benutzer im Klartext an die Datenbank übergeben? (Im Normalfall wird die passcrypt-Option angewendet.)';
-$lang['checkPass'] = 'SQL-Kommando zum Überprüfen von Passwörtern.';
-$lang['getUserInfo'] = 'SQL-Kommando um Benutzerinformationen auszulesen.';
-$lang['getGroups'] = 'SQL-Kommando um Gruppen eines Benutzers auszulesen.';
-$lang['getUsers'] = 'SQL-Kommando um alle Benutzer auszulesen.';
-$lang['FilterLogin'] = 'SQL-Bedingung um Benutzer anhand ihres Anmeldenamens zu filtern.';
-$lang['FilterName'] = 'SQL-Bedingung um Benutzer anhand ihres Namens zu filtern.';
-$lang['FilterEmail'] = 'SQL-Bedingung um Benutzer anhand ihrer E-Mail-Adresse zu filtern.';
-$lang['FilterGroup'] = 'SQL-Bedingung um Benutzer anhand ihrer Gruppenzugehörigkeit zu filtern.';
-$lang['SortOrder'] = 'SQL-Bedingung um anhand der die Benutzerliste sortiert wird.';
-$lang['addUser'] = 'SQL-Kommando um einen neuen Benutzer anzulegen.';
-$lang['addGroup'] = 'SQL-Kommando um eine neue Gruppe anzulegen.';
-$lang['addUserGroup'] = 'SQL-Kommando um einen Benutzer zu einer Gruppe hinzuzufügen.';
-$lang['delGroup'] = 'SQL-Kommando um eine Gruppe zu löschen.';
-$lang['getUserID'] = 'SQL-Kommando um den Primärschlüssel des Benutzers auszulesen.';
-$lang['delUser'] = 'SQL-Kommando um einen Benutzer zu löschen.';
-$lang['delUserRefs'] = 'SQL-Kommando um einen Benutzer aus allen Gruppen zu entfernen.';
-$lang['updateUser'] = 'SQL-Kommando um das Profil eines Benutzers zu aktualisieren.';
-$lang['UpdateLogin'] = 'SQL-Bedingung um den Anmeldenamen eines Benutzers zu ändern.';
-$lang['UpdatePass'] = 'SQL-Befehl um das Passwort eines Benutzers zu ändern.';
-$lang['UpdateEmail'] = 'SQL-Befehl um die E-Mail-Adresse eines Benutzers zu ändern.';
-$lang['UpdateName'] = 'SQL-Befehl um den Namen eines Benutzers zu ändern.';
-$lang['UpdateTarget'] = 'SQL-Filter zur eindeutigen Identifikation des Benutzers.';
-$lang['delUserGroup'] = 'SQL-Kommando um einen Benutzer aus einer angegeben Gruppe zu entfernen.';
-$lang['getGroupID'] = 'SQL-Kommando um den Primärschlüssel einer Gruppe auszulesen.';
diff --git a/lib/plugins/authpgsql/lang/en/settings.php b/lib/plugins/authpgsql/lang/en/settings.php
deleted file mode 100644
index cfb2686cb..000000000
--- a/lib/plugins/authpgsql/lang/en/settings.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-$lang['server'] = 'Your PostgreSQL server';
-$lang['port'] = 'Your PostgreSQL server\'s port';
-$lang['user'] = 'PostgreSQL user name';
-$lang['password'] = 'Password for above user';
-$lang['database'] = 'Database to use';
-$lang['debug'] = 'Display additional debug information';
-$lang['forwardClearPass'] = 'Pass user passwords as cleartext to the SQL statements below, instead of using the passcrypt option';
-$lang['checkPass'] = 'SQL statement for checking passwords';
-$lang['getUserInfo'] = 'SQL statement for retrieving user information';
-$lang['getGroups'] = 'SQL statement for retrieving a user\'s group memberships';
-$lang['getUsers'] = 'SQL statement to list all users';
-$lang['FilterLogin'] = 'SQL clause for filtering users by login name';
-$lang['FilterName'] = 'SQL clause for filtering users by full name';
-$lang['FilterEmail'] = 'SQL clause for filtering users by email address';
-$lang['FilterGroup'] = 'SQL clause for filtering users by group membership';
-$lang['SortOrder'] = 'SQL clause to sort users';
-$lang['addUser'] = 'SQL statement to add a new user';
-$lang['addGroup'] = 'SQL statement to add a new group';
-$lang['addUserGroup'] = 'SQL statement to add a user to an existing group';
-$lang['delGroup'] = 'SQL statement to remove a group';
-$lang['getUserID'] = 'SQL statement to get the primary key of a user';
-$lang['delUser'] = 'SQL statement to delete a user';
-$lang['delUserRefs'] = 'SQL statement to remove a user from all groups';
-$lang['updateUser'] = 'SQL statement to update a user profile';
-$lang['UpdateLogin'] = 'Update clause for updating the user\'s login name';
-$lang['UpdatePass'] = 'Update clause for updating the user\'s password';
-$lang['UpdateEmail'] = 'Update clause for updating the user\'s email address';
-$lang['UpdateName'] = 'Update clause for updating the user\'s full name';
-$lang['UpdateTarget'] = 'Limit clause to identify the user when updating';
-$lang['delUserGroup'] = 'SQL statement to remove a user from a given group';
-$lang['getGroupID'] = 'SQL statement to get the primary key of a given group';
diff --git a/lib/plugins/authpgsql/lang/eo/settings.php b/lib/plugins/authpgsql/lang/eo/settings.php
deleted file mode 100644
index 3af6b4079..000000000
--- a/lib/plugins/authpgsql/lang/eo/settings.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- */
-$lang['server'] = 'Via PostgreSQL-servilo';
-$lang['port'] = 'Via PostgreSQL-servila pordego';
-$lang['user'] = 'PostgreSQL-uzantonomo';
-$lang['password'] = 'Pasvorto por tiu uzanto';
-$lang['database'] = 'Uzenda datumbazo';
-$lang['debug'] = 'Ĉu indiki aldonajn erarinformojn';
-$lang['forwardClearPass'] = 'Ĉu transdoni pasvortojn klartekste al la SQL-frazoj sube anstataŭ uzi pasvortan kaŝon';
-$lang['checkPass'] = 'SQL-frazo por testi pasvortojn';
-$lang['getUserInfo'] = 'SQL-frazo por ricevi uzantajn informojn';
-$lang['getGroups'] = 'SQL-frazo por ricevi la grupmembrecojn de uzanto';
-$lang['getUsers'] = 'SQL-frazo por listigi ĉiujn uzantojn';
-$lang['FilterLogin'] = 'SQL-frazo por filtri uzantojn je ensaluta nomo';
-$lang['FilterName'] = 'SQL-frazo por filtri uzantojn je plena nomo';
-$lang['FilterEmail'] = 'SQL-frazo por filtri uzantojn je retpoŝtadreso';
-$lang['FilterGroup'] = 'SQL-frazo por filtri uzantojn je grupmembreco';
-$lang['SortOrder'] = 'SQL-frazo por ordigi uzantojn';
-$lang['addUser'] = 'SQL-frazo por aldoni novan uzanton';
-$lang['addGroup'] = 'SQL-frazo por aldoni novan grupon';
-$lang['addUserGroup'] = 'SQL-frazo por aldoni uzanton al ekzistanta grupo';
-$lang['delGroup'] = 'SQL-frazo por forigi grupon';
-$lang['getUserID'] = 'SQL-frazo por ricevi la ĉefan ŝlosilon de uzanto';
-$lang['delUser'] = 'SQL-frazo por forigi uzanton';
-$lang['delUserRefs'] = 'SQL-frazo por forigi uzanton el ĉiuj grupoj';
-$lang['updateUser'] = 'SQL-frazo por aktualigi uzantan profilon';
-$lang['UpdateLogin'] = 'Aktualiga frazo por uzanta ensalutnomo';
-$lang['UpdatePass'] = 'Aktualiga frazo por uzanta pasvorto';
-$lang['UpdateEmail'] = 'Aktualiga frazo por uzanta retpoŝtadreso';
-$lang['UpdateName'] = 'Aktualiga frazo por plena uzanta nomo';
-$lang['UpdateTarget'] = 'Limiga frazo por identigi la uzanton dum aktualigado';
-$lang['delUserGroup'] = 'SQL-frazo por forigi uzanton el indikita grupo';
-$lang['getGroupID'] = 'SQL-frazo por ricevi la ĉefan ŝlosilon de indikita grupo';
diff --git a/lib/plugins/authpgsql/lang/es/settings.php b/lib/plugins/authpgsql/lang/es/settings.php
deleted file mode 100644
index 384d79894..000000000
--- a/lib/plugins/authpgsql/lang/es/settings.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Antonio Bueno <atnbueno@gmail.com>
- * @author Antonio Castilla <antoniocastilla@trazoide.com>
- * @author pokesakura <pokesakura@gmail.com>
- * @author Domingo Redal <docxml@gmail.com>
- */
-$lang['server'] = 'Su servidor PostgreSQL';
-$lang['port'] = 'Puerto de su servidor PostgreSQL';
-$lang['user'] = 'Nombre de usuario PostgreSQL';
-$lang['password'] = 'Contraseña del usuario indicado';
-$lang['database'] = 'Base de datos a usar';
-$lang['debug'] = 'Muestra la información de depuración adicional';
-$lang['forwardClearPass'] = 'Pasar las contraseñas de usuario en texto plano a las siguientes sentencias de SQL, en lugar de utilizar la opción passcrypt';
-$lang['checkPass'] = 'Sentencia SQL para el control de las contraseñas';
-$lang['getUserInfo'] = 'Sentencia SQL para recuperar información del usuario';
-$lang['getGroups'] = 'Sentencia SQL para recuperar la pertenencia a grupos de un usuario';
-$lang['getUsers'] = 'Sentencia SQL para enumerar todos los usuarios';
-$lang['FilterLogin'] = 'Sentencia SQL para filtrar a los usuarios por su login';
-$lang['FilterName'] = 'Sentencia SQL para filtrar a los usuarios por su nombre completo';
-$lang['FilterEmail'] = 'Sentencia SQL para filtrar a los usuarios por su correo electrónico';
-$lang['FilterGroup'] = 'Sentencia SQL para filtrar a los usuarios por su membresía en un grupo';
-$lang['SortOrder'] = 'Sentencia SQL para ordenar a los usuarios';
-$lang['addUser'] = 'Sentencia de SQL para agregar un nuevo usuario';
-$lang['addGroup'] = 'Sentencia de SQL para agregar un nuevo grupo';
-$lang['addUserGroup'] = 'Sentencia SQL para agregar un usuario a un grupo existente';
-$lang['delGroup'] = 'Instrucción SQL para eliminar un grupo';
-$lang['getUserID'] = 'Sentencia SQL para obtener la clave principal de un usuario';
-$lang['delUser'] = 'Sentencia SQL para eliminar un usuario';
-$lang['delUserRefs'] = 'Sentencia SQL para remover a un usuario de su memebresia en todos los grupos';
-$lang['updateUser'] = 'Sentencia SQL para actualizar los datos del usuario';
-$lang['UpdateLogin'] = 'Sentencia de actualizacion para el login del usuario';
-$lang['UpdatePass'] = 'Sentencia de actualizacion para el password del usuario';
-$lang['UpdateEmail'] = 'Sentencia de actualizacion del correo electrónico del usuario';
-$lang['UpdateName'] = 'Sentencia de actualizacion del nombre completo del usuario';
-$lang['UpdateTarget'] = 'Cláusula limite para identificar al usuario cuando se actualiza';
-$lang['delUserGroup'] = 'Sentencia SQL para eliminar un usuario de un grupo determinado';
-$lang['getGroupID'] = 'Sentencia SQL para obtener la clave principal de un grupo dado';
diff --git a/lib/plugins/authpgsql/lang/fa/settings.php b/lib/plugins/authpgsql/lang/fa/settings.php
deleted file mode 100644
index 9fe503211..000000000
--- a/lib/plugins/authpgsql/lang/fa/settings.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Mohamad Mehdi Habibi <habibi.esf@gmail.com>
- * @author Mohmmad Razavi <sepent@gmail.com>
- * @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
- */
-$lang['server'] = 'سرور PostgreSQL شما';
-$lang['port'] = 'پورت سرور PostgreSQL شما';
-$lang['user'] = 'نام کاربری PostgreSQL';
-$lang['password'] = 'رمزعبور کابر بالا';
-$lang['database'] = 'پایگاه داده مورد استفاده';
-$lang['debug'] = 'نمایش اطلاعات بیشتر برای خطایابی';
-$lang['forwardClearPass'] = 'به جای استفاده از امکان رمزنگاری، پسورد کاربران به صورت متنی به دستورات SQL ارسال شود';
-$lang['checkPass'] = 'دستور SQL برای چک کردن پسورد';
-$lang['getUserInfo'] = 'دستور SQL برای دریافت اطلاعات کاربران';
-$lang['getGroups'] = 'دستور SQL برای دریافت گروه‌های یک کاربر';
-$lang['getUsers'] = 'دستور SQL برای فهرست کردن تمام کاربران';
-$lang['FilterLogin'] = 'کلاز SQL برای فیلتر کردن کاربران با نام کاربری';
-$lang['FilterName'] = 'کلاز SQL برای فیلتر کردن کاربران با نام کامل';
-$lang['FilterEmail'] = 'کلاز SQL برای فیلتر کردن کاربران با آدرس ایمیل';
-$lang['FilterGroup'] = 'کلاز SQL برای فیلتر کردن کاربران با عضویت در گروه';
-$lang['SortOrder'] = 'کلاز SQL برای مرتب کردن کاربران';
-$lang['addUser'] = 'دستور SQL برای افزودن کاربر جدید';
-$lang['addGroup'] = 'دستور SQL برای افزودن گروه جدید';
-$lang['addUserGroup'] = 'دستور SQL برای افزودن یک کاربر به یک گروه موجود';
-$lang['delGroup'] = 'دستور SQL برای پاک کردن یک گروه';
-$lang['getUserID'] = 'دستور SQL برای گرفتن کلید اصلی یک کاربر';
-$lang['delUser'] = 'دستور SQL برای حذف یک کاربر';
-$lang['delUserRefs'] = 'دستور SQL برای پاک کردن یک کاربر از تمام گروه‌ها';
-$lang['updateUser'] = 'دستور SQL برای به‌روزرسانی پروفایل کاربر';
-$lang['UpdateLogin'] = 'کلاز Update برای به روز کردن نام کاربری';
-$lang['UpdatePass'] = 'کلاز Update برای به روز کردن پسورد کاربر';
-$lang['UpdateEmail'] = 'کلاز Update برای به روز کردن ایمیل کاربر';
-$lang['UpdateName'] = 'کلاز Update برای به روز کردن نام کامل کاربر';
-$lang['UpdateTarget'] = 'کلاز Limit برای شناسایی کاربر هنگام به روز رسانی';
-$lang['delUserGroup'] = 'دستور SQL برای حذف یک کاربر از یک گروه';
-$lang['getGroupID'] = 'دستور SQL برای گرفتن کلید اصلی یک گروه';
diff --git a/lib/plugins/authpgsql/lang/fr/settings.php b/lib/plugins/authpgsql/lang/fr/settings.php
deleted file mode 100644
index 8cd9c6a7b..000000000
--- a/lib/plugins/authpgsql/lang/fr/settings.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Bruno Veilleux <bruno.vey@gmail.com>
- */
-$lang['server'] = 'Votre serveur PostgreSQL';
-$lang['port'] = 'Le port de votre serveur PostgreSQL';
-$lang['user'] = 'Nom d\'utilisateur PostgreSQL';
-$lang['password'] = 'Mot de passe pour l\'utilisateur ci-dessus';
-$lang['database'] = 'Base de données à utiliser';
-$lang['debug'] = 'Afficher des informations de débogage supplémentaires';
-$lang['forwardClearPass'] = 'Passer les mots de passe aux requêtes SQL ci-dessous en cleartext plutôt qu\'avec l\'option passcrypt';
-$lang['checkPass'] = 'Requête SQL pour la vérification des mots de passe';
-$lang['getUserInfo'] = 'Requête SQL pour la récupération des informations d\'un utilisateur';
-$lang['getGroups'] = 'Requête SQL pour la récupération des groupes d\'un utilisateur';
-$lang['getUsers'] = 'Requête SQL pour énumérer tous les utilisateurs';
-$lang['FilterLogin'] = 'Clause SQL pour filtrer les utilisateurs par identifiant';
-$lang['FilterName'] = 'Clause SQL pour filtrer les utilisateurs par nom complet';
-$lang['FilterEmail'] = 'Clause SQL pour filtrer les utilisateurs par adresse électronique';
-$lang['FilterGroup'] = 'Clause SQL pour filtrer les utilisateurs par groupes';
-$lang['SortOrder'] = 'Clause SQL pour trier les utilisateurs';
-$lang['addUser'] = 'Requête SQL pour ajouter un nouvel utilisateur';
-$lang['addGroup'] = 'Requête SQL pour ajouter un nouveau groupe';
-$lang['addUserGroup'] = 'Requête SQL pour ajouter un utilisateur à un groupe existant';
-$lang['delGroup'] = 'Requête SQL pour retirer un groupe';
-$lang['getUserID'] = 'Requête SQL pour obtenir la clé primaire d\'un utilisateur';
-$lang['delUser'] = 'Requête SQL pour supprimer un utilisateur';
-$lang['delUserRefs'] = 'Requête SQL pour retirer un utilisateur de tous les groupes';
-$lang['updateUser'] = 'Requête SQL pour mettre à jour le profil d\'un utilisateur';
-$lang['UpdateLogin'] = 'Clause de mise à jour pour mettre à jour l\'identifiant d\'un utilisateur';
-$lang['UpdatePass'] = 'Clause de mise à jour pour mettre à jour le mot de passe d\'un utilisateur';
-$lang['UpdateEmail'] = 'Clause de mise à jour pour mettre à jour l\'adresse électronique d\'un utilisateur';
-$lang['UpdateName'] = 'Clause de mise à jour pour mettre à jour le nom complet d\'un utilisateur';
-$lang['UpdateTarget'] = 'Clause de limite pour identifier l\'utilisateur durant une mise à jour';
-$lang['delUserGroup'] = 'Requête SQL pour retirer un utilisateur d\'un groupe donné';
-$lang['getGroupID'] = 'Requête SQL pour obtenir la clé primaire d\'un groupe donné';
diff --git a/lib/plugins/authpgsql/lang/hr/settings.php b/lib/plugins/authpgsql/lang/hr/settings.php
deleted file mode 100644
index 2cec4e5fa..000000000
--- a/lib/plugins/authpgsql/lang/hr/settings.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Davor Turkalj <turki.bsc@gmail.com>
- */
-$lang['server'] = 'Vaš PostgreSQL server';
-$lang['port'] = 'Port vašeg PostgreSQL servera';
-$lang['user'] = 'PostgreSQL korisničko ime';
-$lang['password'] = 'Lozinka gore navedenoga korisnika';
-$lang['database'] = 'Baza koja se koristi';
-$lang['debug'] = 'Prikaz dodatnih dijagnostičkih informacija';
-$lang['forwardClearPass'] = 'Proslijed lozinku kao običan tekst u SQL izrazima koji slijede, umjesto korištenja passcrypt opcije';
-$lang['checkPass'] = 'SQL izraz za provjeru lozinke';
-$lang['getUserInfo'] = 'SQL izraz za dohvat korisničkih informacija';
-$lang['getGroups'] = 'SQL izraz za dohvat korisničkog članstva u grupama';
-$lang['getUsers'] = 'SQL izraz za ispis svih korisnika';
-$lang['FilterLogin'] = 'SQL izraz za filtriranje korisnika po korisničkom imenu';
-$lang['FilterName'] = 'SQL izraz za filtriranje korisnika po punom imenu';
-$lang['FilterEmail'] = 'SQL izraz za filtriranje korisnika po email adresi';
-$lang['FilterGroup'] = 'SQL izraz za filtriranje korisnika po članstvu u grupama';
-$lang['SortOrder'] = 'SQL izraz za sortiranje korisnika';
-$lang['addUser'] = 'SQL izraz za dodavanje novog korisnika';
-$lang['addGroup'] = 'SQL izraz za dodavanje nove grupe';
-$lang['addUserGroup'] = 'SQL izraz za dodavanje korisnika u postojeću grupu';
-$lang['delGroup'] = 'SQL izraz za brisanje grupe';
-$lang['getUserID'] = 'SQL izraz za dohvaćanje primarnog ključa korisnika';
-$lang['delUser'] = 'SQL izraz za brisanje korisnika';
-$lang['delUserRefs'] = 'SQL izraz za uklanjanje korisnika iz svih grupa';
-$lang['updateUser'] = 'SQL izraz za ažuriranje korisničkog profila';
-$lang['UpdateLogin'] = 'UPDATE izraz za ažuriranje korisničkog imena';
-$lang['UpdatePass'] = 'UPDATE izraz za ažuriranje korisničke lozinke';
-$lang['UpdateEmail'] = 'UPDATE izraz za ažuriranje korisničke email adrese';
-$lang['UpdateName'] = 'UPDATE izraz za ažuriranje korisničkog punog imena';
-$lang['UpdateTarget'] = 'Limitirajući izraz za identificiranje korisnika pri ažuriranju';
-$lang['delUserGroup'] = 'SQL izraz za uklanjanje korisnika iz navedenih grupa';
-$lang['getGroupID'] = 'SQL izraz za dobivanje primarnog ključa navedene grupe';
diff --git a/lib/plugins/authpgsql/lang/hu/settings.php b/lib/plugins/authpgsql/lang/hu/settings.php
deleted file mode 100644
index 213fc8751..000000000
--- a/lib/plugins/authpgsql/lang/hu/settings.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Marton Sebok <sebokmarton@gmail.com>
- * @author Marina Vladi <deldadam@gmail.com>
- */
-$lang['server'] = 'PostgreSQL-kiszolgáló';
-$lang['port'] = 'PostgreSQL-kiszolgáló portja';
-$lang['user'] = 'PostgreSQL-felhasználónév';
-$lang['password'] = 'Fenti felhasználó jelszava';
-$lang['database'] = 'Adatbázis';
-$lang['debug'] = 'Hibakeresési üzenetek megjelenítése';
-$lang['forwardClearPass'] = 'A jelszó nyílt szövegben való átadása a következő SQL utasításokban a passcrypt opció használata helyett';
-$lang['checkPass'] = 'SQL-utasítás a jelszavak ellenőrzéséhez';
-$lang['getUserInfo'] = 'SQL-utasítás a felhasználói információk lekérdezéséhez';
-$lang['getGroups'] = 'SQL-utasítás egy felhasználó csoporttagságainak lekérdezéséhez';
-$lang['getUsers'] = 'SQL-utasítás a felhasználók listázásához';
-$lang['FilterLogin'] = 'SQL-kifejezés a felhasználók azonosító alapú szűréséhez';
-$lang['FilterName'] = 'SQL-klauzula a felhasználók név alapú szűréséhez';
-$lang['FilterEmail'] = 'SQL-klauzula a felhasználók e-mail cím alapú szűréséhez';
-$lang['FilterGroup'] = 'SQL-klauzula a felhasználók csoporttagság alapú szűréséhez';
-$lang['SortOrder'] = 'SQL-klauzula a felhasználók rendezéséhez';
-$lang['addUser'] = 'SQL-klauzula új felhasználó hozzáadásához';
-$lang['addGroup'] = 'SQL-klauzula új csoport hozzáadásához';
-$lang['addUserGroup'] = 'SQL-utasítás felhasználó meglévő csoporthoz való hozzáadásához';
-$lang['delGroup'] = 'SQL-utasítás csoport törléséhez';
-$lang['getUserID'] = 'SQL-utasítás felhasználó elsődleges kulcsának lekérdezéséhez';
-$lang['delUser'] = 'SQL-utasítás felhasználó törléséhez';
-$lang['delUserRefs'] = 'SQL-utasítás felhasználó összes csoportból való törléséhez';
-$lang['updateUser'] = 'SQL-utasítás felhasználó profiljának frissítéséhez';
-$lang['UpdateLogin'] = 'UPDATE-klauzula felhasználók azonosítójának frissítéséhez';
-$lang['UpdatePass'] = 'UPDATE-klauzula felhasználók jelszavának frissítéséhez';
-$lang['UpdateEmail'] = 'UPDATE-klauzula felhasználók e-mailcímének frissítéséhez';
-$lang['UpdateName'] = 'SQL-kifejezés a felhasználó nevének frissítéséhez';
-$lang['UpdateTarget'] = 'SQL-kifejezés a felhasználó kiválasztásához az adatok frissítésekor';
-$lang['delUserGroup'] = 'SQL-utasítás egy felhasználó eltávolításához egy adott csoportból';
-$lang['getGroupID'] = 'SQL-utasítás egy csoport elsődleges kulcsának lekérdezéséhez';
diff --git a/lib/plugins/authpgsql/lang/it/settings.php b/lib/plugins/authpgsql/lang/it/settings.php
deleted file mode 100644
index 365fc47e4..000000000
--- a/lib/plugins/authpgsql/lang/it/settings.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Francesco <francesco.cavalli@hotmail.com>
- * @author Torpedo <dgtorpedo@gmail.com>
- * @author Maurizio <mcannavo@katamail.com>
- */
-$lang['server'] = 'Il tuo server PostgreSQL ';
-$lang['port'] = 'La porta del tuo server PostgreSQL ';
-$lang['user'] = 'Lo username PostgreSQL';
-$lang['password'] = 'Password dell\'utente summenzionato';
-$lang['database'] = 'Database da usare';
-$lang['debug'] = 'Visualizza informazioni addizionali di debug';
-$lang['forwardClearPass'] = 'Fornisci le password utente come testo visibile alle istruzioni SQL qui sotto, invece che usare l\'opzione passcrypt';
-$lang['checkPass'] = 'Istruzione SQL per il controllo password';
-$lang['getUserInfo'] = 'Istruzione SQL per recuperare le informazioni utente';
-$lang['getGroups'] = 'Istruzione SQL per recuperare il gruppo di appartenenza di un utente';
-$lang['getUsers'] = 'Istruzione SQL per elencare tutti gli utenti';
-$lang['FilterLogin'] = 'Condizione SQL per filtrare gli utenti in base al nome di accesso';
-$lang['FilterName'] = 'Condizione SQL per filtrare gli utenti in base al nome completo';
-$lang['FilterEmail'] = 'Condizione SQL per filtrare gli utenti in base all\'indirizzo e-mail';
-$lang['FilterGroup'] = 'Condizione SQL per filtrare gli utenti in base al gruppo di appartenenza';
-$lang['SortOrder'] = 'Condizione SQL per ordinare gli utenti';
-$lang['addUser'] = 'Istruzione SQL per aggiungere un nuovo utente';
-$lang['addGroup'] = 'Istruzione SQL per aggiungere un nuovo gruppo';
-$lang['addUserGroup'] = 'Istruzione SQL per aggiungere un utente ad un gruppo esistente';
-$lang['delGroup'] = 'Istruzione SQL per imuovere un gruppo';
-$lang['getUserID'] = 'Istruzione SQL per recuperare la primary key di un utente';
-$lang['delUser'] = 'Istruzione SQL per cancellare un utente';
-$lang['delUserRefs'] = 'Istruzione SQL per rimuovere un utente da tutti i gruppi';
-$lang['updateUser'] = 'Istruzione SQL per aggiornare il profilo utente';
-$lang['UpdateLogin'] = 'Condizione SQL per aggiornare il nome di accesso dell\'utente';
-$lang['UpdatePass'] = 'Condizione SQL per aggiornare la password utente';
-$lang['UpdateEmail'] = 'Condizione SQL per aggiornare l\'e-mail utente';
-$lang['UpdateName'] = 'Condizione SQL per aggiornare il nome completo dell\'utente';
-$lang['UpdateTarget'] = 'Condizione SQL per identificare l\'utente quando aggiornato';
-$lang['delUserGroup'] = 'Istruzione SQL per rimuovere un utente da un dato gruppo';
-$lang['getGroupID'] = 'Istruzione SQL per avere la primary key di un dato gruppo';
diff --git a/lib/plugins/authpgsql/lang/ja/settings.php b/lib/plugins/authpgsql/lang/ja/settings.php
deleted file mode 100644
index 001008c9f..000000000
--- a/lib/plugins/authpgsql/lang/ja/settings.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Satoshi Sahara <sahara.satoshi@gmail.com>
- */
-$lang['server'] = 'PostgreSQL のサーバー名';
-$lang['port'] = 'PostgreSQL サーバーのポート番号';
-$lang['user'] = 'PostgreSQL 接続用ユーザー名';
-$lang['password'] = 'PostgreSQL 接続用ユーザーのパスワード';
-$lang['database'] = '使用するデータベース名';
-$lang['debug'] = 'デバック情報を表示する';
-$lang['forwardClearPass'] = '以下で定義する SQL ステートメントにおいて, パスワード変数 を平文とする(DokiWiki側で暗号化しない)';
-$lang['checkPass'] = 'パスワードの照合に用いる SQL ステートメント';
-$lang['getUserInfo'] = 'ユーザー情報の取得に用いる SQL ステートメント';
-$lang['getGroups'] = 'ユーザーが所属する全てのグループの取得に用いる SQL ステートメント';
-$lang['getUsers'] = 'ユーザーリストを取得する SQL ステートメント';
-$lang['FilterLogin'] = 'ユーザーリストをログイン名で絞り込む SQL 句';
-$lang['FilterName'] = 'ユーザーリストをフルネームで絞り込む SQL 句';
-$lang['FilterEmail'] = 'ユーザーリストをメールアドレスで絞り込む SQL 句';
-$lang['FilterGroup'] = 'ユーザーリストを所属グループで絞り込む SQL 句';
-$lang['SortOrder'] = 'ユーザーリストのソート方法を指定する SQL 句';
-$lang['addUser'] = '新規ユーザーを追加する SQL ステートメント';
-$lang['addGroup'] = '新規グループを追加する SQL ステートメント';
-$lang['addUserGroup'] = 'ユーザーをグループに配属する SQL ステートメント';
-$lang['delGroup'] = 'グループを削除する SQL ステートメント';
-$lang['getUserID'] = 'ユーザーIDの取得に用いる SQL ステートメン';
-$lang['delUser'] = 'ユーザーを削除する SQL ステートメント';
-$lang['delUserRefs'] = 'ユーザーのグループ所属を全て取り消す SQL ステートメント';
-$lang['updateUser'] = 'ユーザー情報を変更する SQL ステートメント';
-$lang['UpdateLogin'] = '変更後のログイン名を指定する SQL 句';
-$lang['UpdatePass'] = '変更後のパスワードを指定する SQL 句';
-$lang['UpdateEmail'] = '変更後のメールアドレスを指定する SQL 句';
-$lang['UpdateName'] = '変更後のフルネームを指定する SQL 句';
-$lang['UpdateTarget'] = '変更対象のユーザを特定するための SQL 句';
-$lang['delUserGroup'] = 'ユーザーをグループから除名する SQL ステートメント';
-$lang['getGroupID'] = 'グループIDの取得に用いる SQL ステートメント';
diff --git a/lib/plugins/authpgsql/lang/ko/settings.php b/lib/plugins/authpgsql/lang/ko/settings.php
deleted file mode 100644
index fd45bfa48..000000000
--- a/lib/plugins/authpgsql/lang/ko/settings.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Myeongjin <aranet100@gmail.com>
- * @author Garam <rowain8@gmail.com>
- */
-$lang['server'] = 'PostgreSQL 서버';
-$lang['port'] = 'PostgreSQL 서버의 포트';
-$lang['user'] = 'PostgreSQL 사용자 이름';
-$lang['password'] = '위 사용자의 비밀번호';
-$lang['database'] = '사용할 데이터베이스';
-$lang['debug'] = '추가적인 디버그 정보 보이기';
-$lang['forwardClearPass'] = 'passcrypt 옵션을 사용하는 대신 아래 SQL 문에 일반 텍스트로 사용자 비밀번호를 전달';
-$lang['checkPass'] = '비밀번호를 확인하기 위한 SQL 문';
-$lang['getUserInfo'] = '사용자 정보를 가져오기 위한 SQL 문';
-$lang['getGroups'] = '사용자의 그룹 구성원을 가져오기 위한 SQL 문';
-$lang['getUsers'] = '모든 사용자를 나타낼 SQL 문';
-$lang['FilterLogin'] = '로그인 이름별로 사용자를 필터하기 위한 SQL 조항';
-$lang['FilterName'] = '전체 이름별로 사용자를 필터하기 위한 SQL 조항';
-$lang['FilterEmail'] = '이메일 주소별로 사용자를 필터하기 위한 SQL 조항';
-$lang['FilterGroup'] = '그룹 구성원별로 사용자를 필터하기 위한 SQL 조항';
-$lang['SortOrder'] = '사용자를 정렬할 SQL 조항';
-$lang['addUser'] = '새 사용자를 추가할 SQL 문';
-$lang['addGroup'] = '새 그룹을 추가할 SQL 문';
-$lang['addUserGroup'] = '기존 그룹에 사용자를 추가할 SQL 문';
-$lang['delGroup'] = '그룹을 제거할 SQL 문';
-$lang['getUserID'] = '사용자의 기본 키를 얻을 SQL 문';
-$lang['delUser'] = '사용자를 삭제할 SQL 문';
-$lang['delUserRefs'] = '모든 그룹에서 사용자를 제거할 SQL 문';
-$lang['updateUser'] = '사용자 프로필을 업데이트할 SQL 문';
-$lang['UpdateLogin'] = '사용자의 로그인 이름을 업데이트하기 위한 Update 조항';
-$lang['UpdatePass'] = '사용자의 비밀번호를 업데이트하기 위한 Update 조항';
-$lang['UpdateEmail'] = '사용자의 이메일 주소를 업데이트하기 위한 Update 조항';
-$lang['UpdateName'] = '사용자의 전체 이름을 업데이트하기 위한 Update 조항';
-$lang['UpdateTarget'] = '업데이트할 때 사용자를 식별할 Limit 조항';
-$lang['delUserGroup'] = '주어진 그룹에서 사용자를 제거할 SQL 문';
-$lang['getGroupID'] = '주어진 그룹의 기본 키를 얻을 SQL 문';
diff --git a/lib/plugins/authpgsql/lang/lv/settings.php b/lib/plugins/authpgsql/lang/lv/settings.php
deleted file mode 100644
index dd63544b5..000000000
--- a/lib/plugins/authpgsql/lang/lv/settings.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Aivars Miška <allefm@gmail.com>
- */
-$lang['password'] = 'Lietotāja parole';
-$lang['delUser'] = 'SQL pieprasījums lietotāja dzēšanai';
diff --git a/lib/plugins/authpgsql/lang/nl/settings.php b/lib/plugins/authpgsql/lang/nl/settings.php
deleted file mode 100644
index 7b4ec702c..000000000
--- a/lib/plugins/authpgsql/lang/nl/settings.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Remon <no@email.local>
- */
-$lang['server'] = 'Je PostgreSQL server';
-$lang['port'] = 'Je PostgreSQL server poort';
-$lang['user'] = 'PostgreSQL gebruikersnaam';
-$lang['password'] = 'Wachtwoord voor bovenstaande gebruiker';
-$lang['database'] = 'Te gebruiken database';
-$lang['debug'] = 'Tonen aanvullende debuginformatie';
-$lang['forwardClearPass'] = 'Wachtwoorden als leesbare tekst in SQL commando\'s opnemen in plaats van versleuteld';
-$lang['checkPass'] = 'SQL commando voor het verifiëren van wachtwoorden';
-$lang['getUserInfo'] = 'SQL commando voor het ophalen van gebruikersinformatie';
-$lang['getGroups'] = 'SQL commando voor het ophalen van groepslidmaatschappen van gebruikers';
-$lang['getUsers'] = 'SQL commando voor het tonen van alle gebruikers';
-$lang['FilterLogin'] = 'SQL commando voor het filteren van gebruikers op inlognaam';
-$lang['FilterName'] = 'SQL commando voor het filteren van gebruikers op volledige naam';
-$lang['FilterEmail'] = 'SQL commando voor het filteren van gebruikers op e-mailadres';
-$lang['FilterGroup'] = 'SQL commando voor het filteren van gebruikers op groepslidmaatschap';
-$lang['SortOrder'] = 'SQL commando voor het sorteren van gebruikers';
-$lang['addUser'] = 'SQL commando voor het toevoegen van een nieuwe gebruiker';
-$lang['addGroup'] = 'SQL commando voor het toevoegen van een nieuwe groep';
-$lang['addUserGroup'] = 'SQL commando voor toevoegen van een gebruiker aan een bestaande groep';
-$lang['delGroup'] = 'SQL commando voor het verwijderen van een groep';
-$lang['getUserID'] = 'SQL commando om de primaire sleutel van een gebruiker op te halen';
-$lang['delUser'] = 'SQL commando voor het verwijderen van een gebruiker';
-$lang['delUserRefs'] = 'SQL commando om een gebruiker uit alle groepen te verwijderen';
-$lang['updateUser'] = 'SQL commando om een gebruikersprofiel bij te werken';
-$lang['UpdateLogin'] = 'SQL commando om een inlognaam bij te werken';
-$lang['UpdatePass'] = 'SQL commando om een wachtwoord bij te werken';
-$lang['UpdateEmail'] = 'SQL commando om een e-mailadres bij te werken';
-$lang['UpdateName'] = 'SQL commando om een volledige naam bij te werken';
-$lang['UpdateTarget'] = 'Beperkingsclausule om de gebruiker te identificeren bij het bijwerken';
-$lang['delUserGroup'] = 'SQL commando om een gebruiker uit een bepaalde groep te verwijderen';
-$lang['getGroupID'] = 'SQL commando om de primaire sleutel van een bepaalde groep op te halen';
diff --git a/lib/plugins/authpgsql/lang/no/settings.php b/lib/plugins/authpgsql/lang/no/settings.php
deleted file mode 100644
index 9e84e4d30..000000000
--- a/lib/plugins/authpgsql/lang/no/settings.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Arne Hanssen <arne.hanssen@getmail.no>
- */
-$lang['server'] = 'Din PostgreSQL-server';
-$lang['port'] = 'Porten til din PostgreSQL-server';
-$lang['user'] = 'PostgreSQL-brukernavn';
-$lang['password'] = 'Passord til bruker over';
-$lang['database'] = 'Database som brukes';
-$lang['debug'] = 'Vis utvidet feilinformasjon';
-$lang['forwardClearPass'] = 'Videresendt passord i klartekst til SQL-uttrykket under, i stedet for å bruke det krypterte passordet';
-$lang['checkPass'] = 'SQL-uttrykk for å sjekke passordet';
-$lang['getUserInfo'] = 'SQL-uttrykk for å hente informasjon om en bruker';
-$lang['getGroups'] = 'SQL-uttrykk for å hente gruppene en bruker tilhører';
-$lang['getUsers'] = 'SQL-uttrykk for å liste alle brukere ';
-$lang['FilterLogin'] = 'SQL-uttrykk for å filtrere brukere etter brukernavn';
-$lang['FilterName'] = 'SQL-uttrykk for å filtrere brukere etter fult navn';
-$lang['FilterEmail'] = 'SQL-uttrykk for å filtrere brukere etter e-postadresse';
-$lang['FilterGroup'] = 'SQL-uttrykk for å filtrere brukere etter hvilken grupper de tilhører';
-$lang['SortOrder'] = 'SQL-uttrykk for å sortere brukere';
-$lang['addUser'] = 'SQL-uttrykk for å legge til en ny bruker';
-$lang['addGroup'] = 'SQL-uttrykk for å legge til en ny gruppe';
-$lang['addUserGroup'] = 'SQL-uttrykk for å legge til en bruker i en eksisterende gruppe';
-$lang['delGroup'] = 'SQL-uttrykk for å fjerne en gruppe ';
-$lang['getUserID'] = 'SQL-uttrykk for å hente primærnøkkel for en gitt bruker';
-$lang['delUser'] = 'SQL-utrykk for å slette en bruker ';
-$lang['delUserRefs'] = 'SQL-utrykk for å fjerne en bruke fra alle grupper';
-$lang['updateUser'] = 'SQL-uttrykk for å oppdatere en brukerprofil';
-$lang['UpdateLogin'] = 'Update-utrykk for å oppdatere brukernavn';
-$lang['UpdatePass'] = 'Update-utrykk for å oppdatere brukers passord';
-$lang['UpdateEmail'] = 'Update-utrykk for å oppdatere brukers e-postadresse';
-$lang['UpdateName'] = 'Update-utrykk for å oppdatere brukers fulle navn';
-$lang['UpdateTarget'] = 'Limit-uttrykk for å identifisere brukeren ved oppdatering';
-$lang['delUserGroup'] = 'SQL-uttrykk for fjerne en bruker fra gitt gruppe';
-$lang['getGroupID'] = 'SQL-uttrykk for å hente primærnøkkel for en gitt gruppe';
diff --git a/lib/plugins/authpgsql/lang/pl/settings.php b/lib/plugins/authpgsql/lang/pl/settings.php
deleted file mode 100644
index e89fd91a2..000000000
--- a/lib/plugins/authpgsql/lang/pl/settings.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Wojciech Lichota <wojciech@lichota.pl>
- * @author Max <maxrb146@gmail.com>
- * @author Mati <mackosa@wp.pl>
- */
-$lang['server'] = 'Twój serwer PostgreSQL';
-$lang['port'] = 'Port Twojego serwera PostgreSQL';
-$lang['user'] = 'Nazwa użytkownika PostgreSQL';
-$lang['password'] = 'Hasła dla powyższego użytkownika';
-$lang['database'] = 'Baza danych do użycia';
-$lang['debug'] = 'Wyświetl dodatkowe informacje debagowania';
-$lang['forwardClearPass'] = 'Przekazuj do poniższej instrukcji SQL hasła użytkowników jako czysty tekst do instrukcji SQL zamiast używać opcji passcrypt';
-$lang['checkPass'] = 'Instrukcja SQL sprawdzająca hasła';
-$lang['getUserInfo'] = 'Instrukcja SQL pobierająca dane użytkownika';
-$lang['getGroups'] = 'Instrukcja SQL pobierająca przynależność użytkownika do grup';
-$lang['getUsers'] = 'Instrukcja SQL listująca wszystkich użytkowników';
-$lang['FilterLogin'] = 'Instrukcja SQL filtrująca użytkowników po loginie';
-$lang['FilterName'] = 'Instrukcja SQL filtrująca użytkowników po imieniu i nazwisku';
-$lang['FilterEmail'] = 'Instrukcja SQL filtrująca użytkowników po emailu';
-$lang['FilterGroup'] = 'Instrukcja SQL filtrująca użytkowników po przynależności do grupy';
-$lang['SortOrder'] = 'Instrukcja SQL sortująca użytkowników';
-$lang['addUser'] = 'Instrukcja SQL dodająca nowego użytkownika';
-$lang['addGroup'] = 'Instrukcja SQL dodająca nową grupę';
-$lang['addUserGroup'] = 'Instrukcja SQL dodająca użytkownika do istniejącej grupy';
-$lang['delGroup'] = 'Instrukcja SQL usuwająca grupę';
-$lang['getUserID'] = 'Instrukcja SQL pobierająca klucz główny użytkownika';
-$lang['delUser'] = 'Instrukcja SQL usuwająca użytkownika';
-$lang['delUserRefs'] = 'Instrukcja SQL usuwająca użytkownika ze wszystkich grup';
-$lang['updateUser'] = 'Instrukcja SQL aktualizująca profil użytkownika';
-$lang['UpdateLogin'] = 'Polecenie służące do aktualizacji loginu użytkownika';
-$lang['UpdatePass'] = 'Polecenie służące do aktualizacji hasła użytkownika';
-$lang['UpdateEmail'] = 'Polecenie służące do aktualizacji e-mailu użytkownika';
-$lang['UpdateName'] = 'Polecenie służące do aktualizacji imienia i nazwiska użytkownika';
-$lang['UpdateTarget'] = 'Instrukcja limitu do identyfikacji użytkownika podczas aktualizacji';
-$lang['delUserGroup'] = 'Instrukcja SQL usuwająca użytkownika ze wskazanej grupy';
-$lang['getGroupID'] = 'Instrukcja SQL pobierająca klucz główny wskazanej grupy';
diff --git a/lib/plugins/authpgsql/lang/pt-br/settings.php b/lib/plugins/authpgsql/lang/pt-br/settings.php
deleted file mode 100644
index a06ce0eab..000000000
--- a/lib/plugins/authpgsql/lang/pt-br/settings.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Victor Westmann <victor.westmann@gmail.com>
- * @author Frederico Guimarães <frederico@teia.bio.br>
- */
-$lang['server'] = 'Seu servidor PostgreSQL';
-$lang['port'] = 'Sua porta do servidor PostgreSQL';
-$lang['user'] = 'Nome de usuário PostgreSQL';
-$lang['password'] = 'Senha do usuário acima';
-$lang['database'] = 'Base de dados para usar';
-$lang['debug'] = 'Mostrar informações adicionais de depuração';
-$lang['forwardClearPass'] = 'Transmitir senhas de usuário como texto puro para comandos SQL abaixo, ao invés de usar a opção passcrypt';
-$lang['checkPass'] = 'Comando SQL para verificar senhas';
-$lang['getUserInfo'] = 'Comando SQL para obter informações do usuário';
-$lang['getGroups'] = 'Comando SQL para obter as credenciais de um usuário de um determinado grupo';
-$lang['getUsers'] = 'Comando SQL para listar todos os usuários';
-$lang['FilterLogin'] = 'Cláusula SQL para filtrar usuários pelo nome de login';
-$lang['FilterName'] = 'Cláusula SQL para filtrar usuários pelo nome completo';
-$lang['FilterEmail'] = 'Cláusula SQL para filtrar usuários pelo endereço de email';
-$lang['FilterGroup'] = 'Cláusula SQL para filtrar usuários pelo grupo que pertencem';
-$lang['SortOrder'] = 'Comando SQL para adicionar novo grupo';
-$lang['addUser'] = 'Comando SQL para adicionar novo usuário';
-$lang['addGroup'] = 'Comando SQL para adicionar novo grupo';
-$lang['addUserGroup'] = 'Comando SQL para adicionar um usuário a um grupo existente';
-$lang['delGroup'] = 'Comando SQL para remover um grupo';
-$lang['getUserID'] = 'Comando SQL para obter chave primária de usuário';
-$lang['delUser'] = 'Comando SQL para apagar usuário';
-$lang['delUserRefs'] = 'Comando SQL para remover um usuário de todos os grupos';
-$lang['updateUser'] = 'Comando SQL para atualizar perfil de usuário';
-$lang['UpdateLogin'] = 'Atualizar cláusula para atualizar o login do usuário';
-$lang['UpdatePass'] = 'Atualizar cláusula para atualizar a senha do usuário';
-$lang['UpdateEmail'] = 'Atualizar cláusula para atualizar o endereço de email';
-$lang['UpdateName'] = 'Atualizar cláusula para atualizar o nome completo do usuário';
-$lang['UpdateTarget'] = 'Limitar cláusula para identificar quando um usuário estiver atualizando';
-$lang['delUserGroup'] = 'Comando SQL para remover um usuário de um determinado grupo';
-$lang['getGroupID'] = 'Comando SQL para obter a chave primária de um determinado grupo';
diff --git a/lib/plugins/authpgsql/lang/pt/settings.php b/lib/plugins/authpgsql/lang/pt/settings.php
deleted file mode 100644
index edc4e1a84..000000000
--- a/lib/plugins/authpgsql/lang/pt/settings.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author André Neves <drakferion@gmail.com>
- * @author Guido Salatino <guidorafael23@gmail.com>
- */
-$lang['server'] = 'O seu servidor PostgreSQL';
-$lang['port'] = 'A porta do seu servidor PostgreSQL';
-$lang['user'] = 'Nome de utilizador PostgreSQL';
-$lang['password'] = 'Senha do utilizador acima';
-$lang['database'] = 'Base de dados a usar';
-$lang['debug'] = 'Mostrar informação adicional de debug';
-$lang['forwardClearPass'] = 'Passe as senhas do usuário como texto puro para as instruções SQL abaixo, em vez de usar a opção passcrypt';
-$lang['checkPass'] = 'Instrução SQL para verificar senhas';
-$lang['getUserInfo'] = 'Instrução SQL para recuperar informações de um usuário';
-$lang['getGroups'] = 'Instrução SQL para recuperar os usuários participantes de um grupo';
-$lang['getUsers'] = 'Instrução SQL para listar todos usuários';
-$lang['FilterLogin'] = 'Cláusula SQL para filtrar utilizadores por nome de login';
-$lang['FilterName'] = 'Cláusula SQL para filtrar utilizadores por nome completo';
-$lang['FilterEmail'] = 'Cláusula SQL para filtrar utilizadores por endereço de email';
-$lang['FilterGroup'] = 'Cláusula SQL para filtrar utilizadores por pertença a grupo';
-$lang['SortOrder'] = 'Cláusula SQL para ordenar utilizadores';
-$lang['addUser'] = 'Instrução SQL para adicionar um novo usuário';
-$lang['addGroup'] = 'Instrução SQL para adicionar um novo grupo';
-$lang['addUserGroup'] = 'Instrução SQL para adicionar um usuário a um grupo existente';
-$lang['delGroup'] = 'Instrução SQL para remover um grupo';
-$lang['getUserID'] = 'Instrução SQL para obter a chave principal de um usuário';
-$lang['delUser'] = 'Instrução SQL para remover um usuário';
-$lang['delUserRefs'] = 'Instrução SQL para remover um usuário de todos os grupos';
-$lang['updateUser'] = 'Instrução SQL para atualizar um perfil de usuário';
-$lang['UpdateLogin'] = 'Cláusula de atualização para atualizar o nome de login do utilizador';
-$lang['UpdatePass'] = 'Cláusula de atualização para atualizar a senha do utilizador';
-$lang['UpdateEmail'] = 'Cláusula de atualização para atualizar o endereço de email do utilizador';
-$lang['UpdateName'] = 'Cláusula de atualização para atualizar o nome completo do utilizador';
-$lang['UpdateTarget'] = 'Cláusula limite para identificar o usuário ao atualizar';
-$lang['delUserGroup'] = 'Instrução SQL para remover um usuário de um determinado grupo';
-$lang['getGroupID'] = 'Instrução SQL para obter a chave principal de um determinado grupo';
diff --git a/lib/plugins/authpgsql/lang/ru/settings.php b/lib/plugins/authpgsql/lang/ru/settings.php
deleted file mode 100644
index ceb5bd466..000000000
--- a/lib/plugins/authpgsql/lang/ru/settings.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua)
- * @author Aleksandr Selivanov <alexgearbox@gmail.com>
- * @author Vitaly Filatenko <kot@hacktest.net>
- * @author Type-kun <workwork-1@yandex.ru>
- * @author Alex P <alexander@lanos.co.uk>
- */
-$lang['server'] = 'Ваш PostgreSQL-сервер';
-$lang['port'] = 'Порт вашего PostgreSQL-сервера';
-$lang['user'] = 'Имя пользователя PostgreSQL';
-$lang['password'] = 'Пароль для указанного пользователя';
-$lang['database'] = 'Имя базы данных';
-$lang['debug'] = 'Отображать дополнительную отладочную информацию';
-$lang['forwardClearPass'] = 'Передать чистым текстом ползовательские пароли в SQL запросы ниже, вместо использование опции passcrypt';
-$lang['checkPass'] = 'Выражение SQL, осуществляющее проверку пароля';
-$lang['getUserInfo'] = 'Выражение SQL, осуществляющее извлечение информации о пользователе';
-$lang['getGroups'] = 'Выражение SQL, осуществляющее извлечение информации о членстве пользователе в группах';
-$lang['getUsers'] = 'Выражение SQL, осуществляющее извлечение полного списка пользователей';
-$lang['FilterLogin'] = 'Выражение SQL, осуществляющее фильтрацию пользователей по логину';
-$lang['FilterName'] = 'Выражение SQL, осуществляющее фильтрацию пользователей по полному имени';
-$lang['FilterEmail'] = 'Выражение SQL, осуществляющее фильтрацию пользователей по адресу электронной почты';
-$lang['FilterGroup'] = 'Выражение SQL, осуществляющее фильтрацию пользователей согласно членству в группе';
-$lang['SortOrder'] = 'Выражение SQL, осуществляющее сортировку пользователей';
-$lang['addUser'] = 'Выражение SQL, осуществляющее добавление нового пользователя';
-$lang['addGroup'] = 'Выражение SQL, осуществляющее добавление новой группы';
-$lang['addUserGroup'] = 'Выражение SQL, осуществляющее добавление пользователя в существующую группу';
-$lang['delGroup'] = 'Выражение SQL, осуществляющее удаление группы';
-$lang['getUserID'] = 'Выражение SQL, обеспечивающее получение первичного ключа пользователя';
-$lang['delUser'] = 'Выражение SQL, осуществляющее удаление пользователя';
-$lang['delUserRefs'] = 'Выражение SQL, осуществляющее удаление пользователя из всех группы';
-$lang['updateUser'] = 'Выражение SQL, осуществляющее обновление профиля пользователя';
-$lang['UpdateLogin'] = 'Измените условие для обновления логина';
-$lang['UpdatePass'] = 'Измените условие для обновления пароля';
-$lang['UpdateEmail'] = 'Измените условие для обновления email';
-$lang['UpdateName'] = 'Условие для обновления полного имени пользователя';
-$lang['UpdateTarget'] = 'Выражение \'LIMIT\' для идентификации пользователя при обновлении';
-$lang['delUserGroup'] = 'Выражение SQL, осуществляющее удаление пользователя из указанной группы';
-$lang['getGroupID'] = 'Выражение SQL, обеспечивающее получение первичного ключа указанной группы';
diff --git a/lib/plugins/authpgsql/lang/sk/settings.php b/lib/plugins/authpgsql/lang/sk/settings.php
deleted file mode 100644
index acdc2d72a..000000000
--- a/lib/plugins/authpgsql/lang/sk/settings.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Martin Michalek <michalek.dev@gmail.com>
- */
-$lang['server'] = 'PostgreSQL server';
-$lang['port'] = 'Port PostgreSQL servera';
-$lang['user'] = 'Meno používateľa PostgreSQL';
-$lang['password'] = 'Heslo pre vyššie uvedeného používateľa';
-$lang['database'] = 'Použiť databázu';
-$lang['debug'] = 'Zobraziť dodatočné ladiace informácie';
-$lang['forwardClearPass'] = 'Posielať heslo ako nezakódovaný text nižšie uvedenému SQL príkazu namiesto použitia kódovania';
-$lang['checkPass'] = 'SQL príkaz pre kontrolu hesla';
-$lang['getUserInfo'] = 'SQL príkaz pre získanie informácií o používateľovi';
-$lang['getGroups'] = 'SQL príkaz pre získanie informácií o skupinách používateľa';
-$lang['getUsers'] = 'SQL príkaz pre získanie zoznamu používateľov';
-$lang['FilterLogin'] = 'SQL podmienka pre filtrovanie používateľov podľa prihlasovacieho mena';
-$lang['FilterName'] = 'SQL podmienka pre filtrovanie používateľov podľa mena a priezviska';
-$lang['FilterEmail'] = 'SQL podmienka pre filtrovanie používateľov podľa emailovej adresy';
-$lang['FilterGroup'] = 'SQL podmienka pre filtrovanie používateľov podľa skupiny';
-$lang['SortOrder'] = 'SQL podmienka pre usporiadenia používateľov';
-$lang['addUser'] = 'SQL príkaz pre pridanie nového používateľa';
-$lang['addGroup'] = 'SQL príkaz pre pridanie novej skupiny';
-$lang['addUserGroup'] = 'SQL príkaz pre pridanie používateľa do existujúcej skupiny';
-$lang['delGroup'] = 'SQL príkaz pre zrušenie skupiny';
-$lang['getUserID'] = 'SQL príkaz pre získanie primárneho klúča používateľa';
-$lang['delUser'] = 'SQL príkaz pre zrušenie používateľa';
-$lang['delUserRefs'] = 'SQL príkaz pre vyradenie používateľa zo všetkých skupín';
-$lang['updateUser'] = 'SQL príkaz pre aktualizáciu informácií o používateľovi';
-$lang['UpdateLogin'] = 'SQL podmienka pre aktualizáciu prihlasovacieho mena používateľa';
-$lang['UpdatePass'] = 'SQL podmienka pre aktualizáciu hesla používateľa';
-$lang['UpdateEmail'] = 'SQL podmienka pre aktualizáciu emailovej adresy používateľa';
-$lang['UpdateName'] = 'SQL podmienka pre aktualizáciu mena a priezviska používateľa';
-$lang['UpdateTarget'] = 'Podmienka identifikácie používateľa pri aktualizácii';
-$lang['delUserGroup'] = 'SQL príkaz pre vyradenie používateľa z danej skupiny';
-$lang['getGroupID'] = 'SQL príkaz pre získanie primárneho kľúča skupiny';
diff --git a/lib/plugins/authpgsql/lang/sl/settings.php b/lib/plugins/authpgsql/lang/sl/settings.php
deleted file mode 100644
index 7110a6efd..000000000
--- a/lib/plugins/authpgsql/lang/sl/settings.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Matej Urbančič <mateju@svn.gnome.org>
- */
-$lang['database'] = 'Podatkovna zbirka za uporabo';
-$lang['addUserGroup'] = 'Ukaz SQL za dodajanje uporabnika v obstoječo skupino';
-$lang['delGroup'] = 'Ukaz SQL za odstranitev skupine';
-$lang['getUserID'] = 'Ukaz SQL za pridobitev osnovnega ključa uporabnika';
-$lang['delUser'] = 'Ukaz SQL za izbris uporabnika';
-$lang['delUserRefs'] = 'Ukaz SQL za odstranitev uporabnika iz vseh skupin';
-$lang['updateUser'] = 'Ukaz SQL za posodobitev profila uporabnika';
-$lang['delUserGroup'] = 'Ukaz SQL za odstranitev uporabnika iz podane skupine';
-$lang['getGroupID'] = 'Ukaz SQL za pridobitev osnovnega ključa podane skupine';
diff --git a/lib/plugins/authpgsql/lang/sr/settings.php b/lib/plugins/authpgsql/lang/sr/settings.php
deleted file mode 100644
index 4b1cd8bfe..000000000
--- a/lib/plugins/authpgsql/lang/sr/settings.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Марко М. Костић <marko.m.kostic@gmail.com>
- */
-$lang['server'] = 'Ваш PostgreSQL сервер';
-$lang['port'] = 'Порт вашег PostgreSQL сервера';
-$lang['user'] = 'PostgreSQL корисничко име';
-$lang['password'] = 'Лозинка за корисника изнад';
-$lang['database'] = 'База коју треба користити';
-$lang['debug'] = 'Прикажи додатне податке за поправљање грешака';
-$lang['forwardClearPass'] = 'Пренеси корисничке лозинке као чист текст ка SQL упитима испод уместо коришћења passcrypt опције';
-$lang['checkPass'] = 'SQL упит за проверу лозинки';
-$lang['getUserInfo'] = 'SQL упит за добављање корисничких података';
-$lang['getGroups'] = 'SQL упит за добављање групних учлањења корисника';
-$lang['getUsers'] = 'SQL упит за листање свих корисника';
diff --git a/lib/plugins/authpgsql/lang/sv/settings.php b/lib/plugins/authpgsql/lang/sv/settings.php
deleted file mode 100644
index 1082583dd..000000000
--- a/lib/plugins/authpgsql/lang/sv/settings.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Smorkster Andersson smorkster@gmail.com
- */
-$lang['server'] = 'Din PostgreSQL server';
-$lang['port'] = 'Din PostgreSQL servers port';
-$lang['user'] = 'PostgreSQL användarnamn';
-$lang['password'] = 'Lösenord för användaren ovan';
-$lang['database'] = 'Databas att använda';
-$lang['debug'] = 'Visa ytterligare felsökningsinformation';
-$lang['forwardClearPass'] = 'Skicka lösenord för användare som klartext till SQL satserna nedan, istället för att använda krypteringsalternativet';
-$lang['checkPass'] = 'SQL sats för kontroll av lösenord';
-$lang['getUserInfo'] = 'SQL sats för att hämta användarinformation';
-$lang['getGroups'] = 'SQL sats för att hämta en användares gruppmedlemskap';
-$lang['getUsers'] = 'SQL sats för att lista alla användare';
-$lang['FilterLogin'] = 'SQL klausul för att filtrera användare efter inloggningsnamn';
-$lang['FilterName'] = 'SQL klausul för att filtrera användare efter fullt namn';
-$lang['FilterEmail'] = 'SQL klausul för att filtrera användare efter e-post adress';
-$lang['addUser'] = 'SQL sats för att lägga till en ny användare';
-$lang['addGroup'] = 'SQL sats för att lägga till en ny grupp';
-$lang['addUserGroup'] = 'SQL sats för att lägga till en användare i en existerande grupp';
-$lang['delGroup'] = 'SQL sats för att ta bort en grupp';
-$lang['delUser'] = 'SQL sats för att ta bort en användare';
-$lang['delUserRefs'] = 'SQL sats för att ta bort en användare från alla grupper';
-$lang['updateUser'] = 'SQL sats för att uppdatera en användarprofil';
-$lang['delUserGroup'] = 'SQL sats för att ta bort en användare från angiven grupp';
diff --git a/lib/plugins/authpgsql/lang/tr/settings.php b/lib/plugins/authpgsql/lang/tr/settings.php
deleted file mode 100644
index f6fef9cde..000000000
--- a/lib/plugins/authpgsql/lang/tr/settings.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author İlker R. Kapaç <irifat@gmail.com>
- */
-$lang['server'] = 'PostgreSQL sunucunuz';
-$lang['port'] = 'PostgreSQL sunucunuzun kapısı (port)';
-$lang['user'] = 'PostgreSQL kullanıcısının adı';
-$lang['password'] = 'Yukarıdaki kullanıcı için şifre';
-$lang['database'] = 'Kullanılacak veritabanı';
-$lang['debug'] = 'İlave hata ayıklama bilgisini görüntüle';
diff --git a/lib/plugins/authpgsql/lang/uk/settings.php b/lib/plugins/authpgsql/lang/uk/settings.php
deleted file mode 100644
index 9a353414d..000000000
--- a/lib/plugins/authpgsql/lang/uk/settings.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author Nina Zolotova <nina-z@i.ua>
- */
-$lang['database'] = 'Використовувати базу даних';
diff --git a/lib/plugins/authpgsql/lang/zh-tw/settings.php b/lib/plugins/authpgsql/lang/zh-tw/settings.php
deleted file mode 100644
index b7dd9c6d8..000000000
--- a/lib/plugins/authpgsql/lang/zh-tw/settings.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author syaoranhinata@gmail.com
- */
-$lang['server'] = '您的 PostgreSQL 伺服器';
-$lang['port'] = '您的 PostgreSQL 伺服器端口';
-$lang['user'] = 'PostgreSQL 使用者名稱';
-$lang['password'] = '上述使用者的密碼';
-$lang['database'] = '使用的資料庫';
-$lang['debug'] = '顯示額外除錯資訊';
-$lang['forwardClearPass'] = '以明文形式,把使用者密碼傳送给下列的 SQL 語句,而不使用 passcrypt 密碼加密選項';
-$lang['checkPass'] = '檢查密碼的 SQL 語句';
-$lang['getUserInfo'] = '獲取使用者訊息的 SQL 語句';
-$lang['getGroups'] = '獲取使用者群組成員身份的 SQL 語句';
-$lang['getUsers'] = '把所有使用者列出的 SQL 語句';
-$lang['FilterLogin'] = '根據登入名稱來篩選使用者的 SQL 子句';
-$lang['FilterName'] = '根據全名來篩選使用者的 SQL 子句';
-$lang['FilterEmail'] = '根據電郵地址來篩選使用者的 SQL 子句';
-$lang['FilterGroup'] = '根據群組成員身份來篩選使用者的 SQL 子句';
-$lang['SortOrder'] = '對使用者排序的 SQL 子句';
-$lang['addUser'] = '增加新使用者的 SQL 語句';
-$lang['addGroup'] = '增加新群組的 SQL 語句';
-$lang['addUserGroup'] = '把使用者新增至現有群組的 SQL 語句';
-$lang['delGroup'] = '把群組刪除的 SQL 語句';
-$lang['getUserID'] = '取得使用者主鍵的 SQL 語句';
-$lang['delUser'] = '把使用者刪除的 SQL 語句';
-$lang['delUserRefs'] = '把使用者從所有群組裏刪除的 SQL 語句';
-$lang['updateUser'] = '更新使用者訊息的 SQL 語句';
-$lang['UpdateLogin'] = '更新使用者登入名稱的 Update 子句';
-$lang['UpdatePass'] = '更新帳號密碼的 Update 子句';
-$lang['UpdateEmail'] = '更新使用者電郵地址的 Update 子句';
-$lang['UpdateName'] = '更新使用者全名的 Update 子句';
-$lang['UpdateTarget'] = '在更新時識別使用者的 Limit 子句';
-$lang['delUserGroup'] = '把使用者從指定群組中刪除的 SQL 語句';
-$lang['getGroupID'] = '取得指定群組主鍵的 SQL 語句';
diff --git a/lib/plugins/authpgsql/lang/zh/settings.php b/lib/plugins/authpgsql/lang/zh/settings.php
deleted file mode 100644
index 5140d1127..000000000
--- a/lib/plugins/authpgsql/lang/zh/settings.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author lainme <lainme993@gmail.com>
- */
-$lang['server'] = '您的 PostgreSQL 服务器';
-$lang['port'] = '您的 PostgreSQL 服务器端口';
-$lang['user'] = 'PostgreSQL 用户名';
-$lang['password'] = '上述用户的密码';
-$lang['database'] = '使用的数据库';
-$lang['debug'] = '显示额外调试信息';
-$lang['forwardClearPass'] = '将用户密码以明文形式传送给下面的 SQL 语句,而不使用 passcrypt 密码加密选项';
-$lang['checkPass'] = '检查密码的 SQL 语句';
-$lang['getUserInfo'] = '获取用户信息的 SQL 语句';
-$lang['getGroups'] = '获取用户的组成员身份的 SQL 语句';
-$lang['getUsers'] = '列出所有用户的 SQL 语句';
-$lang['FilterLogin'] = '根据登录名筛选用户的 SQL 子句';
-$lang['FilterName'] = '根据全名筛选用户的 SQL 子句';
-$lang['FilterEmail'] = '根据电子邮件地址筛选用户的 SQL 子句';
-$lang['FilterGroup'] = '根据组成员身份筛选用户的 SQL 子句';
-$lang['SortOrder'] = '对用户排序的 SQL 子句';
-$lang['addUser'] = '添加新用户的 SQL 语句';
-$lang['addGroup'] = '添加新组的 SQL 语句';
-$lang['addUserGroup'] = '将用户添加到现有组的 SQL 语句';
-$lang['delGroup'] = '删除组的 SQL 语句';
-$lang['getUserID'] = '获取用户主键的 SQL 语句';
-$lang['delUser'] = '删除用户的 SQL 语句';
-$lang['delUserRefs'] = '从所有组中删除一个用户的 SQL 语句';
-$lang['updateUser'] = '更新用户信息的 SQL 语句';
-$lang['UpdateLogin'] = '更新用户登录名的 Update 子句';
-$lang['UpdatePass'] = '更新用户密码的 Update 子句';
-$lang['UpdateEmail'] = '更新用户电子邮件地址的 Update 子句';
-$lang['UpdateName'] = '更新用户全名的 Update 子句';
-$lang['UpdateTarget'] = '更新时识别用户的 Limit 子句';
-$lang['delUserGroup'] = '从指定组删除用户的 SQL 语句';
-$lang['getGroupID'] = '获取指定组主键的 SQL 语句';
diff --git a/lib/plugins/authpgsql/plugin.info.txt b/lib/plugins/authpgsql/plugin.info.txt
deleted file mode 100644
index 033c29179..000000000
--- a/lib/plugins/authpgsql/plugin.info.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-base authpgsql
-author Andreas Gohr
-email andi@splitbrain.org
-date 2015-07-13
-name [DEPRECATED] PostgreSQL Auth Plugin
-desc ▶This plugin will be removed from DokuWiki in a future release! Use authpdo instead.◀ Provides user authentication against a PostgreSQL database
-url http://www.dokuwiki.org/plugin:authpgsql
diff --git a/lib/plugins/authplain/_test/conf/auth.users.php b/lib/plugins/authplain/_test/conf/auth.users.php
new file mode 100644
index 000000000..87f54fedb
--- /dev/null
+++ b/lib/plugins/authplain/_test/conf/auth.users.php
@@ -0,0 +1,16 @@
+# users.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Userfile
+#
+# Format:
+#
+# login:passwordhash:Real Name:email:groups,comma,separated
+
+
+user_1:$1$tGu7CW5z$VpsMjRIx5tbyOJaQ2SP23.:Admin:admin@example.com:user,first_group
+user_2:$1$2uJ5C3ib$edo0EDEb/yLAFHme7RK851:User 2:user2@example.com:user,second_group,third_group
+user_3:$1$yqnlDqgZ$Sste968uKhuxH6wIQt6/D/:User 3:user3@example.com:user,fourth_group,first_group,third_group
+user_4:$1$tXjajS9s$peoGPBQep.P245H1Lfloj0:User 4:user4@example.com:user,third_group
+user_5:$1$IWrqdhol$xXOmufjZ2hW1aAVp7zDP.1:User 5:user5@example.com:user,second_group,fifth_group
diff --git a/lib/plugins/authplain/_test/escaping.test.php b/lib/plugins/authplain/_test/escaping.test.php
index a38940e1a..be4d06b4e 100644
--- a/lib/plugins/authplain/_test/escaping.test.php
+++ b/lib/plugins/authplain/_test/escaping.test.php
@@ -114,14 +114,14 @@ class auth_plugin_authplainharness extends auth_plugin_authplain {
* @param boolean $bool
*/
public function setPregsplit_safe($bool) {
- $this->_pregsplit_safe = $bool;
+ $this->pregsplit_safe = $bool;
}
/**
* @return bool|mixed
*/
public function getPregsplit_safe(){
- return $this->_pregsplit_safe;
+ return $this->pregsplit_safe;
}
/**
@@ -129,6 +129,6 @@ class auth_plugin_authplainharness extends auth_plugin_authplain {
* @return array
*/
public function splitUserData($line){
- return $this->_splitUserData($line);
+ return parent::splitUserData($line);
}
}
diff --git a/lib/plugins/authplain/_test/userdata.test.php b/lib/plugins/authplain/_test/userdata.test.php
new file mode 100644
index 000000000..b80b39349
--- /dev/null
+++ b/lib/plugins/authplain/_test/userdata.test.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * Class userdata_test
+ *
+ * Test group retrieval
+ *
+ * @group plugins
+ */
+class userdata_test extends DokuWikiTest
+{
+ /** @var auth_plugin_authplain */
+ protected $auth;
+
+ /**
+ * Load auth with test conf
+ * @throws Exception
+ */
+ public function setUp()
+ {
+ parent::setUp();
+ global $config_cascade;
+ $config_cascade['plainauth.users']['default'] = __DIR__ . '/conf/auth.users.php';
+ $this->auth = new auth_plugin_authplain();
+ }
+
+ /**
+ * Test that all groups are retrieved in the correct order, without duplicates
+ */
+ public function test_retrieve_groups()
+ {
+ $expected = ['user', 'first_group', 'second_group', 'third_group', 'fourth_group', 'fifth_group'];
+ $actual = $this->auth->retrieveGroups();
+ $this->assertEquals($expected, $actual);
+ }
+
+ /**
+ * Test with small and large limits
+ */
+ public function test_retrieve_groups_limit()
+ {
+ $expected = ['user', 'first_group'];
+ $actual = $this->auth->retrieveGroups(0, 2);
+ $this->assertEquals($expected, $actual);
+
+ $expected = ['user', 'first_group', 'second_group', 'third_group', 'fourth_group', 'fifth_group'];
+ $actual = $this->auth->retrieveGroups(0, 20);
+ $this->assertEquals($expected, $actual);
+ }
+
+ /**
+ * Test with small and large offsets
+ */
+ public function test_retrieve_groups_offset()
+ {
+ $expected = ['third_group', 'fourth_group', 'fifth_group'];
+ $actual = $this->auth->retrieveGroups(3,10);
+ $this->assertEquals($expected, $actual);
+
+ $expected = [];
+ $actual = $this->auth->retrieveGroups(10,3);
+ $this->assertEquals($expected, $actual);
+ }
+}
diff --git a/lib/plugins/authplain/auth.php b/lib/plugins/authplain/auth.php
index 7dfa43a4f..421af8847 100644
--- a/lib/plugins/authplain/auth.php
+++ b/lib/plugins/authplain/auth.php
@@ -1,6 +1,4 @@
<?php
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
/**
* Plaintext authentication backend
@@ -10,15 +8,16 @@ 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 array user cache */
protected $users = null;
/** @var array filter pattern */
- protected $_pattern = array();
+ protected $pattern = array();
/** @var bool safe version of preg_split */
- protected $_pregsplit_safe = false;
+ protected $pregsplit_safe = false;
/**
* Constructor
@@ -28,14 +27,15 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
*
* @author Christopher Smith <chris@jalakai.co.uk>
*/
- public function __construct() {
+ public function __construct()
+ {
parent::__construct();
global $config_cascade;
- if(!@is_readable($config_cascade['plainauth.users']['default'])) {
+ if (!@is_readable($config_cascade['plainauth.users']['default'])) {
$this->success = false;
} else {
- if(@is_writable($config_cascade['plainauth.users']['default'])) {
+ if (@is_writable($config_cascade['plainauth.users']['default'])) {
$this->cando['addUser'] = true;
$this->cando['delUser'] = true;
$this->cando['modLogin'] = true;
@@ -46,9 +46,10 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
}
$this->cando['getUsers'] = true;
$this->cando['getUserCount'] = true;
+ $this->cando['getGroups'] = true;
}
- $this->_pregsplit_safe = version_compare(PCRE_VERSION,'6.7','>=');
+ $this->pregsplit_safe = version_compare(PCRE_VERSION, '6.7', '>=');
}
/**
@@ -62,9 +63,10 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param string $pass
* @return bool
*/
- public function checkPass($user, $pass) {
+ public function checkPass($user, $pass)
+ {
$userinfo = $this->getUserData($user);
- if($userinfo === false) return false;
+ if ($userinfo === false) return false;
return auth_verifyPassword($pass, $this->users[$user]['pass']);
}
@@ -84,8 +86,9 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param bool $requireGroups (optional) ignored by this plugin, grps info always supplied
* @return array|false
*/
- public function getUserData($user, $requireGroups=true) {
- if($this->users === null) $this->_loadUserData();
+ public function getUserData($user, $requireGroups = true)
+ {
+ if ($this->users === null) $this->loadUserData();
return isset($this->users[$user]) ? $this->users[$user] : false;
}
@@ -101,7 +104,8 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param array $grps list of groups the user is in
* @return string
*/
- protected function _createUserLine($user, $pass, $name, $mail, $grps) {
+ protected function createUserLine($user, $pass, $name, $mail, $grps)
+ {
$groups = join(',', $grps);
$userline = array($user, $pass, $name, $mail, $groups);
$userline = str_replace('\\', '\\\\', $userline); // escape \ as \\
@@ -129,12 +133,13 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param array $grps
* @return bool|null|string
*/
- public function createUser($user, $pwd, $name, $mail, $grps = null) {
+ public function createUser($user, $pwd, $name, $mail, $grps = null)
+ {
global $conf;
global $config_cascade;
// user mustn't already exist
- if($this->getUserData($user) !== false) {
+ if ($this->getUserData($user) !== false) {
msg($this->getLang('userexists'), -1);
return false;
}
@@ -142,12 +147,12 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
$pass = auth_cryptPassword($pwd);
// set default group if no groups specified
- if(!is_array($grps)) $grps = array($conf['defaultgroup']);
+ if (!is_array($grps)) $grps = array($conf['defaultgroup']);
// prepare user line
- $userline = $this->_createUserLine($user, $pass, $name, $mail, $grps);
+ $userline = $this->createUserLine($user, $pass, $name, $mail, $grps);
- if(!io_saveFile($config_cascade['plainauth.users']['default'], $userline, true)) {
+ if (!io_saveFile($config_cascade['plainauth.users']['default'], $userline, true)) {
msg($this->getLang('writefail'), -1);
return null;
}
@@ -164,38 +169,45 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param array $changes array of field/value pairs to be changed (password will be clear text)
* @return bool
*/
- public function modifyUser($user, $changes) {
+ public function modifyUser($user, $changes)
+ {
global $ACT;
global $config_cascade;
// sanity checks, user must already exist and there must be something to change
- if(($userinfo = $this->getUserData($user)) === false) {
+ if (($userinfo = $this->getUserData($user)) === false) {
msg($this->getLang('usernotexists'), -1);
return false;
}
// don't modify protected users
- if(!empty($userinfo['protected'])) {
+ if (!empty($userinfo['protected'])) {
msg(sprintf($this->getLang('protected'), hsc($user)), -1);
return false;
}
- if(!is_array($changes) || !count($changes)) return true;
+ 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') {
+ foreach ($changes as $field => $value) {
+ if ($field == 'user') {
$newuser = $value;
continue;
}
- if($field == 'pass') $value = auth_cryptPassword($value);
+ if ($field == 'pass') $value = auth_cryptPassword($value);
$userinfo[$field] = $value;
}
- $userline = $this->_createUserLine($newuser, $userinfo['pass'], $userinfo['name'], $userinfo['mail'], $userinfo['grps']);
+ $userline = $this->createUserLine(
+ $newuser,
+ $userinfo['pass'],
+ $userinfo['name'],
+ $userinfo['mail'],
+ $userinfo['grps']
+ );
- if(!io_replaceInFile($config_cascade['plainauth.users']['default'], '/^'.$user.':/', $userline, true)) {
+ if (!io_replaceInFile($config_cascade['plainauth.users']['default'], '/^'.$user.':/', $userline, true)) {
msg('There was an error modifying your user data. You may need to register again.', -1);
// FIXME, io functions should be fail-safe so existing data isn't lost
$ACT = 'register';
@@ -213,24 +225,25 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param array $users array of users to be deleted
* @return int the number of users deleted
*/
- public function deleteUsers($users) {
+ public function deleteUsers($users)
+ {
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) {
+ foreach ($users as $user) {
// don't delete protected users
- if(!empty($this->users[$user]['protected'])) {
+ if (!empty($this->users[$user]['protected'])) {
msg(sprintf($this->getLang('protected'), hsc($user)), -1);
continue;
}
- if(isset($this->users[$user])) $deleted[] = preg_quote($user, '/');
+ if (isset($this->users[$user])) $deleted[] = preg_quote($user, '/');
}
- if(empty($deleted)) return 0;
+ if (empty($deleted)) return 0;
$pattern = '/^('.join('|', $deleted).'):/';
if (!io_deleteFromFile($config_cascade['plainauth.users']['default'], $pattern, true)) {
@@ -240,7 +253,7 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
// reload the user list and count the difference
$count = count($this->users);
- $this->_loadUserData();
+ $this->loadUserData();
$count -= count($this->users);
return $count;
}
@@ -253,17 +266,18 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param array $filter
* @return int
*/
- public function getUserCount($filter = array()) {
+ public 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);
+ $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;
@@ -279,23 +293,24 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param array $filter array of field/pattern pairs
* @return array userinfo (refer getUserData for internal userinfo details)
*/
- public function retrieveUsers($start = 0, $limit = 0, $filter = array()) {
+ public function retrieveUsers($start = 0, $limit = 0, $filter = array())
+ {
- if($this->users === null) $this->_loadUserData();
+ if ($this->users === null) $this->loadUserData();
ksort($this->users);
$i = 0;
$count = 0;
$out = array();
- $this->_constructPattern($filter);
+ $this->constructPattern($filter);
- foreach($this->users as $user => $info) {
- if($this->_filter($user, $info)) {
- if($i >= $start) {
+ foreach ($this->users as $user => $info) {
+ if ($this->filter($user, $info)) {
+ if ($i >= $start) {
$out[$user] = $info;
$count++;
- if(($limit > 0) && ($count >= $limit)) break;
+ if (($limit > 0) && ($count >= $limit)) break;
}
$i++;
}
@@ -305,12 +320,36 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
}
/**
+ * Retrieves groups.
+ * Loads complete user data into memory before searching for groups.
+ *
+ * @param int $start index of first group to be returned
+ * @param int $limit max number of groups to be returned
+ * @return array
+ */
+ public function retrieveGroups($start = 0, $limit = 0)
+ {
+ $groups = [];
+
+ if ($this->users === null) $this->loadUserData();
+ foreach($this->users as $user => $info) {
+ $groups = array_merge($groups, array_diff($info['grps'], $groups));
+ }
+
+ if($limit > 0) {
+ return array_splice($groups, $start, $limit);
+ }
+ return array_splice($groups, $start);
+ }
+
+ /**
* Only valid pageid's (no namespaces) for usernames
*
* @param string $user
* @return string
*/
- public function cleanUser($user) {
+ public function cleanUser($user)
+ {
global $conf;
return cleanID(str_replace(':', $conf['sepchar'], $user));
}
@@ -321,7 +360,8 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param string $group
* @return string
*/
- public function cleanGroup($group) {
+ public function cleanGroup($group)
+ {
global $conf;
return cleanID(str_replace(':', $conf['sepchar'], $group));
}
@@ -333,15 +373,16 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- protected function _loadUserData() {
+ protected function loadUserData()
+ {
global $config_cascade;
- $this->users = $this->_readUserFile($config_cascade['plainauth.users']['default']);
+ $this->users = $this->readUserFile($config_cascade['plainauth.users']['default']);
// support protected users
- if(!empty($config_cascade['plainauth.users']['protected'])) {
- $protected = $this->_readUserFile($config_cascade['plainauth.users']['protected']);
- foreach(array_keys($protected) as $key) {
+ if (!empty($config_cascade['plainauth.users']['protected'])) {
+ $protected = $this->readUserFile($config_cascade['plainauth.users']['protected']);
+ foreach (array_keys($protected) as $key) {
$protected[$key]['protected'] = true;
}
$this->users = array_merge($this->users, $protected);
@@ -356,17 +397,18 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param string $file the file to load data from
* @return array
*/
- protected function _readUserFile($file) {
+ protected function readUserFile($file)
+ {
$users = array();
- if(!file_exists($file)) return $users;
+ if (!file_exists($file)) return $users;
$lines = file($file);
- foreach($lines as $line) {
+ foreach ($lines as $line) {
$line = preg_replace('/#.*$/', '', $line); //ignore comments
$line = trim($line);
- if(empty($line)) continue;
+ if (empty($line)) continue;
- $row = $this->_splitUserData($line);
+ $row = $this->splitUserData($line);
$row = str_replace('\\:', ':', $row);
$row = str_replace('\\\\', '\\', $row);
@@ -380,22 +422,29 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
return $users;
}
- protected function _splitUserData($line){
+ /**
+ * Get the user line split into it's parts
+ *
+ * @param string $line
+ * @return string[]
+ */
+ protected function splitUserData($line)
+ {
// due to a bug in PCRE 6.6, preg_split will fail with the regex we use here
// refer github issues 877 & 885
- if ($this->_pregsplit_safe){
+ if ($this->pregsplit_safe) {
return preg_split('/(?<![^\\\\]\\\\)\:/', $line, 5); // allow for : escaped as \:
}
$row = array();
$piece = '';
$len = strlen($line);
- for($i=0; $i<$len; $i++){
- if ($line[$i]=='\\'){
+ for ($i=0; $i<$len; $i++) {
+ if ($line[$i]=='\\') {
$piece .= $line[$i];
$i++;
if ($i>=$len) break;
- } else if ($line[$i]==':'){
+ } elseif ($line[$i]==':') {
$row[] = $piece;
$piece = '';
continue;
@@ -416,14 +465,15 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
* @param array $info User's userinfo array
* @return bool
*/
- 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;
+ protected function filter($user, $info)
+ {
+ foreach ($this->pattern as $item => $pattern) {
+ if ($item == 'user') {
+ if (!preg_match($pattern, $user)) return false;
+ } elseif ($item == 'grps') {
+ if (!count(preg_grep($pattern, $info['grps']))) return false;
} else {
- if(!preg_match($pattern, $info[$item])) return false;
+ if (!preg_match($pattern, $info[$item])) return false;
}
}
return true;
@@ -434,10 +484,11 @@ class auth_plugin_authplain extends DokuWiki_Auth_Plugin {
*
* @param array $filter
*/
- protected function _constructPattern($filter) {
- $this->_pattern = array();
- foreach($filter as $item => $pattern) {
- $this->_pattern[$item] = '/'.str_replace('/', '\/', $pattern).'/i'; // allow regex characters
+ protected function constructPattern($filter)
+ {
+ $this->pattern = array();
+ foreach ($filter as $item => $pattern) {
+ $this->pattern[$item] = '/'.str_replace('/', '\/', $pattern).'/i'; // allow regex characters
}
}
}
diff --git a/lib/plugins/authplain/lang/ar/lang.php b/lib/plugins/authplain/lang/ar/lang.php
index 16d59f397..59016acbb 100644
--- a/lib/plugins/authplain/lang/ar/lang.php
+++ b/lib/plugins/authplain/lang/ar/lang.php
@@ -1,6 +1,7 @@
<?php
+
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
*/
-$lang['userexists'] = 'عذرا، يوجد مشترك بنفس الاسم.';
+$lang['userexists'] = 'عذرا، يوجد مشترك بنفس الاسم.';
diff --git a/lib/plugins/authplain/lang/bg/lang.php b/lib/plugins/authplain/lang/bg/lang.php
index 62e62dc13..f21b46517 100644
--- a/lib/plugins/authplain/lang/bg/lang.php
+++ b/lib/plugins/authplain/lang/bg/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Kiril <neohidra@gmail.com>
*/
$lang['userexists'] = 'Вече съществува потребител с избраното име.';
diff --git a/lib/plugins/authplain/lang/da/lang.php b/lib/plugins/authplain/lang/da/lang.php
index ff683ed38..dea4ea321 100644
--- a/lib/plugins/authplain/lang/da/lang.php
+++ b/lib/plugins/authplain/lang/da/lang.php
@@ -3,7 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jacob Palm <mail@jacobpalm.dk>
* @author Kenneth Schack Banner <kescba@gmail.com>
*/
$lang['userexists'] = 'Dette brugernavn er allerede i brug.';
+$lang['usernotexists'] = 'Beklager, brugeren eksisterer ikke.';
$lang['writefail'] = 'Ude af stand til at redigere bruger data. Kontakt venligst Wiki-Administratoren';
+$lang['protected'] = 'Data for brugeren %s er beskyttet, og kan ikke ændres eller slettes.';
diff --git a/lib/plugins/authplain/lang/el/lang.php b/lib/plugins/authplain/lang/el/lang.php
index 1d83eb170..d5b65ff74 100644
--- a/lib/plugins/authplain/lang/el/lang.php
+++ b/lib/plugins/authplain/lang/el/lang.php
@@ -3,5 +3,9 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Katerina Katapodi <extragold1234@hotmail.com>
*/
$lang['userexists'] = 'Αυτός ο λογαριασμός υπάρχει ήδη.';
+$lang['usernotexists'] = 'Λυπάμαι, αυτός ο χρήστης δεν υπάρχει.';
+$lang['writefail'] = 'Δεν μπόρεσε να τροποποιήσει τα δεδομένα χρήστη. Παρακαλώ ενημερώστε το Wiki-Admin';
+$lang['protected'] = ' Τα δεδομένα χρήστη %s είναι εμπιστευτικά και δεν μπορούν να τροποποιηθούν ή απαλειφθούν.';
diff --git a/lib/plugins/authplain/lang/fi/lang.php b/lib/plugins/authplain/lang/fi/lang.php
index abdaf6720..efd96eaae 100644
--- a/lib/plugins/authplain/lang/fi/lang.php
+++ b/lib/plugins/authplain/lang/fi/lang.php
@@ -2,6 +2,6 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
*/
$lang['userexists'] = 'Käyttäjä tällä käyttäjänimellä on jo olemassa.';
diff --git a/lib/plugins/authplain/lang/id/lang.php b/lib/plugins/authplain/lang/id/lang.php
index 5e6a99830..e01136655 100644
--- a/lib/plugins/authplain/lang/id/lang.php
+++ b/lib/plugins/authplain/lang/id/lang.php
@@ -1,6 +1,7 @@
<?php
+
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
*/
-$lang['userexists'] = 'Maaf, user dengan user login ini telah ada.';
+$lang['userexists'] = 'Maaf, user dengan user login ini telah ada.';
diff --git a/lib/plugins/authplain/lang/is/lang.php b/lib/plugins/authplain/lang/is/lang.php
index 21392ee5e..82088ddd2 100644
--- a/lib/plugins/authplain/lang/is/lang.php
+++ b/lib/plugins/authplain/lang/is/lang.php
@@ -1,6 +1,7 @@
<?php
+
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
*/
-$lang['userexists'] = 'Afsakið, notandi með þessu nafni er þegar skráður inn.';
+$lang['userexists'] = 'Afsakið, notandi með þessu nafni er þegar skráður inn.';
diff --git a/lib/plugins/authplain/lang/ja/lang.php b/lib/plugins/authplain/lang/ja/lang.php
index f290cba58..cfaca13f2 100644
--- a/lib/plugins/authplain/lang/ja/lang.php
+++ b/lib/plugins/authplain/lang/ja/lang.php
@@ -3,9 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
* @author Hideaki SAWADA <chuno@live.jp>
*/
-$lang['userexists'] = 'このユーザー名は既に存在しています。';
-$lang['usernotexists'] = 'このユーザーは未登録です。';
+$lang['userexists'] = '恐れ入りますが、このユーザー名は既に存在しています。';
+$lang['usernotexists'] = '恐れ入りますが、このユーザーは未登録です。';
$lang['writefail'] = 'ユーザーデータを変更できません。管理者に問い合わせてください。';
$lang['protected'] = 'ユーザ %s のデータは保護されており、変更・削除はできません。';
diff --git a/lib/plugins/authplain/lang/km/lang.php b/lib/plugins/authplain/lang/km/lang.php
index 322e454e5..eaac2de98 100644
--- a/lib/plugins/authplain/lang/km/lang.php
+++ b/lib/plugins/authplain/lang/km/lang.php
@@ -1,6 +1,7 @@
<?php
+
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
*/
-$lang['userexists'] = 'សុំអាទោស​ នាមប្រើនេះមានរួចហើ។';
+$lang['userexists'] = 'សុំអាទោស​ នាមប្រើនេះមានរួចហើ។';
diff --git a/lib/plugins/authplain/lang/ku/lang.php b/lib/plugins/authplain/lang/ku/lang.php
index 64cb834f3..43406d6f0 100644
--- a/lib/plugins/authplain/lang/ku/lang.php
+++ b/lib/plugins/authplain/lang/ku/lang.php
@@ -1,6 +1,7 @@
<?php
+
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
*/
-$lang['userexists'] = 'Sorry, a user with this login already exists.';
+$lang['userexists'] = 'Sorry, a user with this login already exists.';
diff --git a/lib/plugins/authplain/lang/lt/lang.php b/lib/plugins/authplain/lang/lt/lang.php
index 5ad435a04..b1834360f 100644
--- a/lib/plugins/authplain/lang/lt/lang.php
+++ b/lib/plugins/authplain/lang/lt/lang.php
@@ -1,6 +1,7 @@
<?php
+
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
*/
-$lang['userexists'] = 'Vartotojas su pasirinktu prisijungimo vardu jau egzistuoja.';
+$lang['userexists'] = 'Vartotojas su pasirinktu prisijungimo vardu jau egzistuoja.';
diff --git a/lib/plugins/authplain/lang/pt/lang.php b/lib/plugins/authplain/lang/pt/lang.php
index 3334ea667..583c6b7cb 100644
--- a/lib/plugins/authplain/lang/pt/lang.php
+++ b/lib/plugins/authplain/lang/pt/lang.php
@@ -3,9 +3,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
* @author Paulo Carmino <contato@paulocarmino.com>
* @author Guilherme Sá <guilherme.sa@hotmail.com>
*/
-$lang['userexists'] = 'Este utilizador já está inscrito. Por favor escolha outro nome de utilizador.';
-$lang['usernotexists'] = 'Desculpe, esse login não existe.';
-$lang['writefail'] = 'Incapaz de modificar dados do usuário. Favor informar ao Wiki-Admin.';
+$lang['userexists'] = 'Este nome de usuário já existe. Escolha outro.';
+$lang['usernotexists'] = 'Desculpe, esse usuário não existe.';
+$lang['writefail'] = 'Não foi possível modificar dados do usuário. Favor informar ao Wiki-Admin.';
+$lang['protected'] = 'Os dados do usuário %s estão protegidos e não podem ser modificados ou excluídos.';
diff --git a/lib/plugins/authplain/lang/th/lang.php b/lib/plugins/authplain/lang/th/lang.php
index 463a27992..9e9e104cd 100644
--- a/lib/plugins/authplain/lang/th/lang.php
+++ b/lib/plugins/authplain/lang/th/lang.php
@@ -2,6 +2,6 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
*/
$lang['userexists'] = 'ชื่อบัญชีที่ใส่นั้นมีผู้อื่นได้ใช้แล้ว กรุณาเลือกชื่อผู้ใช้อื่น';
diff --git a/lib/plugins/authplain/lang/tr/lang.php b/lib/plugins/authplain/lang/tr/lang.php
index 6111085c2..946dd0e6b 100644
--- a/lib/plugins/authplain/lang/tr/lang.php
+++ b/lib/plugins/authplain/lang/tr/lang.php
@@ -2,6 +2,6 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
*/
$lang['userexists'] = 'Üzgünüz, bu isime sahip bir kullanıcı zaten mevcut.';
diff --git a/lib/plugins/authplain/lang/vi/lang.php b/lib/plugins/authplain/lang/vi/lang.php
index 7ecb0a27c..10278560a 100644
--- a/lib/plugins/authplain/lang/vi/lang.php
+++ b/lib/plugins/authplain/lang/vi/lang.php
@@ -1,6 +1,11 @@
<?php
+
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Thien Hau <thienhausoftware@gmail.com>
*/
-$lang['userexists'] = 'Bạn khác đã dùng username này rồi.';
+$lang['userexists'] = 'Xin lỗi, thành viên có thông tin đăng nhập này đã tồn tại.';
+$lang['usernotexists'] = 'Xin lỗi, thành viên đó không tồn tại.';
+$lang['writefail'] = 'Không thể sửa đổi dữ liệu thành viên. Vui lòng thông báo cho Wiki-Admin';
+$lang['protected'] = 'Dữ liệu cho thành viên %s được bảo vệ và không thể sửa đổi hoặc xóa.';
diff --git a/lib/plugins/cli.php b/lib/plugins/cli.php
index 721f54779..a3cbec722 100644
--- a/lib/plugins/cli.php
+++ b/lib/plugins/cli.php
@@ -1,11 +1,2 @@
<?php
-
-/**
- * Base class for CLI plugins
- *
- * Provides DokuWiki plugin functionality on top of phpcli
- */
-abstract class DokuWiki_CLI_Plugin extends \splitbrain\phpcli\CLI implements DokuWiki_PluginInterface {
- use DokuWiki_PluginTrait;
-
-}
+dbg_deprecated('Autoloading. Do not require() files yourself.');
diff --git a/lib/plugins/config/_test/configuration.test.php b/lib/plugins/config/_test/ConfigParserTest.php
index 7455461a4..b7e33a539 100644
--- a/lib/plugins/config/_test/configuration.test.php
+++ b/lib/plugins/config/_test/ConfigParserTest.php
@@ -1,31 +1,20 @@
<?php
+
+namespace dokuwiki\plugin\config\test;
+
+use dokuwiki\plugin\config\core\ConfigParser;
+
/**
* @group plugin_config
* @group admin_plugins
* @group plugins
* @group bundled_plugins
*/
-
-class plugin_config_configuration_test extends DokuWikiTest {
-
- private $config = '';
- private $meta = '';
-
- /**
- * Load config files
- */
- function __construct() {
- parent::__construct();
-
- $this->config = dirname(__FILE__).'/data/config.php';
- $this->meta = dirname(__FILE__).'/data/metadata.php';
- require_once(dirname(__FILE__).'/../settings/config.class.php');
- }
+class ConfigParserTest extends \DokuWikiTest {
function test_readconfig() {
- $confmgr = new configuration($this->meta);
-
- $conf = $confmgr->_read_config($this->config);
+ $parser = new ConfigParser();
+ $conf = $parser->parse(__DIR__ . '/data/config.php');
// var_dump($conf);
@@ -42,9 +31,8 @@ class plugin_config_configuration_test extends DokuWikiTest {
}
function test_readconfig_onoff() {
- $confmgr = new configuration($this->meta);
-
- $conf = $confmgr->_read_config($this->config);
+ $parser = new ConfigParser();
+ $conf = $parser->parse(__DIR__ . '/data/config.php');
// var_dump($conf);
diff --git a/lib/plugins/config/_test/LoaderTest.php b/lib/plugins/config/_test/LoaderTest.php
new file mode 100644
index 000000000..0c315842d
--- /dev/null
+++ b/lib/plugins/config/_test/LoaderTest.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace dokuwiki\plugin\config\test;
+
+use dokuwiki\plugin\config\core\ConfigParser;
+use dokuwiki\plugin\config\core\Loader;
+
+/**
+ * @group plugin_config
+ * @group admin_plugins
+ * @group plugins
+ * @group bundled_plugins
+ */
+class LoaderTest extends \DokuWikiTest {
+
+ protected $pluginsEnabled = ['testing'];
+
+ /**
+ * Ensure loading the config meta data works
+ */
+ public function testMetaData() {
+ $loader = new Loader(new ConfigParser());
+
+ $meta = $loader->loadMeta();
+ $this->assertTrue(is_array($meta));
+
+ // there should be some defaults
+ $this->assertArrayHasKey('savedir', $meta);
+ $this->assertEquals(['savedir', '_caution' => 'danger'], $meta['savedir']);
+ $this->assertArrayHasKey('proxy____port', $meta);
+ $this->assertEquals(['numericopt'], $meta['proxy____port']);
+
+ // there should be plugin info
+ $this->assertArrayHasKey('plugin____testing____plugin_settings_name', $meta);
+ $this->assertEquals(['fieldset'], $meta['plugin____testing____plugin_settings_name']);
+ $this->assertArrayHasKey('plugin____testing____schnibble', $meta);
+ $this->assertEquals(['onoff'], $meta['plugin____testing____schnibble']);
+ }
+
+ /**
+ * Ensure loading the defaults work
+ */
+ public function testDefaults() {
+ $loader = new Loader(new ConfigParser());
+
+ $conf = $loader->loadDefaults();
+ $this->assertTrue(is_array($conf));
+
+ // basic defaults
+ $this->assertArrayHasKey('title', $conf);
+ $this->assertEquals('DokuWiki', $conf['title']);
+
+ // plugin defaults
+ $this->assertArrayHasKey('plugin____testing____schnibble', $conf);
+ $this->assertEquals(0, $conf['plugin____testing____schnibble']);
+ }
+
+ /**
+ * Ensure language loading works
+ */
+ public function testLangs() {
+ $loader = new Loader(new ConfigParser());
+
+ $lang = $loader->loadLangs();
+ $this->assertTrue(is_array($lang));
+
+ // basics are not included in the returned array!
+ $this->assertArrayNotHasKey('title', $lang);
+
+ // plugin strings
+ $this->assertArrayHasKey('plugin____testing____plugin_settings_name', $lang);
+ $this->assertEquals('Testing', $lang['plugin____testing____plugin_settings_name']);
+ $this->assertArrayHasKey('plugin____testing____schnibble', $lang);
+ $this->assertEquals(
+ 'Turns on the schnibble before the frobble is used',
+ $lang['plugin____testing____schnibble']
+ );
+ }
+}
diff --git a/lib/plugins/config/_test/Setting/AbstractSettingTest.php b/lib/plugins/config/_test/Setting/AbstractSettingTest.php
new file mode 100644
index 000000000..d18f0ec17
--- /dev/null
+++ b/lib/plugins/config/_test/Setting/AbstractSettingTest.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace dokuwiki\plugin\config\test\Setting;
+
+use dokuwiki\plugin\config\core\Setting\Setting;
+
+abstract class AbstractSettingTest extends \DokuWikiTest {
+
+ /** @var string the class to test */
+ protected $class;
+
+ /**
+ * Sets up the proper class to test based on the test's class name
+ * @throws \Exception
+ */
+ public function setUp() {
+ parent::setUp();
+ $class = get_class($this);
+ $class = substr($class, strrpos($class, '\\') + 1, -4);
+ $class = 'dokuwiki\\plugin\\config\\core\\Setting\\' . $class;
+ $this->class = $class;
+ }
+
+ public function testInitialBasics() {
+ /** @var Setting $setting */
+ $setting = new $this->class('test');
+ $this->assertEquals('test', $setting->getKey());
+ $this->assertSame(false, $setting->isProtected());
+ $this->assertSame(true, $setting->isDefault());
+ $this->assertSame(false, $setting->hasError());
+ $this->assertSame(false, $setting->shouldBeSaved());
+ }
+
+ public function testShouldHaveDefault() {
+ /** @var Setting $setting */
+ $setting = new $this->class('test');
+ $this->assertSame(true, $setting->shouldHaveDefault());
+ }
+
+ public function testPrettyKey() {
+ /** @var Setting $setting */
+ $setting = new $this->class('test');
+ $this->assertEquals('test', $setting->getPrettyKey(false));
+
+ $setting = new $this->class('test____foo');
+ $this->assertEquals('test»foo', $setting->getPrettyKey(false));
+
+ $setting = new $this->class('test');
+ $this->assertEquals(
+ '<a href="http://www.dokuwiki.org/config:test">test</a>',
+ $setting->getPrettyKey(true)
+ );
+
+ $setting = new $this->class('test____foo');
+ $this->assertEquals('test»foo', $setting->getPrettyKey(true));
+
+ $setting = new $this->class('start');
+ $this->assertEquals(
+ '<a href="http://www.dokuwiki.org/config:startpage">start</a>',
+ $setting->getPrettyKey(true)
+ );
+ }
+
+ public function testType() {
+ /** @var Setting $setting */
+ $setting = new $this->class('test');
+ $this->assertEquals('dokuwiki', $setting->getType());
+
+ $setting = new $this->class('test_foo');
+ $this->assertEquals('dokuwiki', $setting->getType());
+
+ $setting = new $this->class('plugin____test');
+ $this->assertEquals('plugin', $setting->getType());
+
+ $setting = new $this->class('tpl____test');
+ $this->assertEquals('template', $setting->getType());
+ }
+
+ public function testCaution() {
+ /** @var Setting $setting */
+ $setting = new $this->class('test');
+ $this->assertEquals(false, $setting->caution());
+
+ $setting = new $this->class('test', ['_caution' => 'warning']);
+ $this->assertEquals('warning', $setting->caution());
+
+ $setting = new $this->class('test', ['_caution' => 'danger']);
+ $this->assertEquals('danger', $setting->caution());
+
+ $setting = new $this->class('test', ['_caution' => 'security']);
+ $this->assertEquals('security', $setting->caution());
+
+ $setting = new $this->class('test', ['_caution' => 'flargh']);
+ $this->expectException(\RuntimeException::class);
+ $setting->caution();
+ }
+
+
+}
diff --git a/lib/plugins/config/_test/Setting/SettingArrayTest.php b/lib/plugins/config/_test/Setting/SettingArrayTest.php
new file mode 100644
index 000000000..09dcf1421
--- /dev/null
+++ b/lib/plugins/config/_test/Setting/SettingArrayTest.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace dokuwiki\plugin\config\test\Setting;
+
+/**
+ * @group plugin_config
+ * @group admin_plugins
+ * @group plugins
+ * @group bundled_plugins
+ */
+class SettingArrayTest extends SettingTest {
+
+ /** @inheritdoc */
+ public function dataOut() {
+ return [
+ [ ['foo','bar'], "\$conf['test'] = array('foo', 'bar');\n"]
+ ];
+ }
+
+}
diff --git a/lib/plugins/config/_test/Setting/SettingNumericTest.php b/lib/plugins/config/_test/Setting/SettingNumericTest.php
new file mode 100644
index 000000000..6248a06b7
--- /dev/null
+++ b/lib/plugins/config/_test/Setting/SettingNumericTest.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace dokuwiki\plugin\config\test\Setting;
+
+/**
+ * @group plugin_config
+ * @group admin_plugins
+ * @group plugins
+ * @group bundled_plugins
+ */
+class SettingNumericTest extends SettingTest {
+
+ /** @inheritdoc */
+ public function dataOut() {
+ return [
+ [42, "\$conf['test'] = 42;\n"],
+ [0, "\$conf['test'] = 0;\n"],
+ [-42, "\$conf['test'] = -42;\n"],
+ [-42.13, "\$conf['test'] = -42.13;\n"],
+ ['12*13', "\$conf['test'] = 12*13;\n"],
+ ];
+ }
+
+}
diff --git a/lib/plugins/config/_test/Setting/SettingNumericoptTest.php b/lib/plugins/config/_test/Setting/SettingNumericoptTest.php
new file mode 100644
index 000000000..9d29f31e7
--- /dev/null
+++ b/lib/plugins/config/_test/Setting/SettingNumericoptTest.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace dokuwiki\plugin\config\test\Setting;
+
+/**
+ * @group plugin_config
+ * @group admin_plugins
+ * @group plugins
+ * @group bundled_plugins
+ */
+class SettingNumericoptTest extends SettingNumericTest {
+
+ /** @inheritdoc */
+ public function dataOut() {
+ return array_merge(
+ parent::dataOut(),
+ [
+ ['', "\$conf['test'] = '';\n"],
+ ]
+ );
+ }
+
+}
diff --git a/lib/plugins/config/_test/Setting/SettingOnoffTest.php b/lib/plugins/config/_test/Setting/SettingOnoffTest.php
new file mode 100644
index 000000000..d6561bdf1
--- /dev/null
+++ b/lib/plugins/config/_test/Setting/SettingOnoffTest.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace dokuwiki\plugin\config\test\Setting;
+
+/**
+ * @group plugin_config
+ * @group admin_plugins
+ * @group plugins
+ * @group bundled_plugins
+ */
+class SettingOnoffTest extends SettingTest {
+
+ /** @inheritdoc */
+ public function dataOut() {
+ return [
+ [1, "\$conf['test'] = 1;\n"],
+ [0, "\$conf['test'] = 0;\n"],
+
+ ['1', "\$conf['test'] = 1;\n"],
+ ['0', "\$conf['test'] = 0;\n"],
+
+ ['on', "\$conf['test'] = 1;\n"],
+ ['off', "\$conf['test'] = 0;\n"],
+
+ ['true', "\$conf['test'] = 1;\n"],
+ ['false', "\$conf['test'] = 0;\n"],
+
+ ['On', "\$conf['test'] = 1;\n"],
+ ['Off', "\$conf['test'] = 0;\n"],
+
+ ['True', "\$conf['test'] = 1;\n"],
+ ['False', "\$conf['test'] = 0;\n"],
+
+ [true, "\$conf['test'] = 1;\n"],
+ [false, "\$conf['test'] = 0;\n"],
+
+ [3, "\$conf['test'] = 1;\n"],
+ ['3', "\$conf['test'] = 1;\n"],
+
+ ['', "\$conf['test'] = 0;\n"],
+ [' ', "\$conf['test'] = 0;\n"],
+ ];
+ }
+
+ /** @inheritdoc */
+ public function dataShouldBeSaved() {
+ return [
+ [0, null, false],
+ [1, null, false],
+ [0, 0, false],
+ [1, 1, false],
+ [0, 1, true],
+ [1, 0, true],
+
+ ['0', '0', false],
+ ['1', '1', false],
+ ['0', '1', true],
+ ['1', '0', true],
+
+ ['0', 0, false],
+ ['1', 1, false],
+ ['0', 1, true],
+ ['1', 0, true],
+
+ [0, '0', false],
+ [1, '1', false],
+ [0, '1', true],
+ [1, '0', true],
+ ];
+ }
+
+}
diff --git a/lib/plugins/config/_test/Setting/SettingStringTest.php b/lib/plugins/config/_test/Setting/SettingStringTest.php
new file mode 100644
index 000000000..3d6a71c9d
--- /dev/null
+++ b/lib/plugins/config/_test/Setting/SettingStringTest.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace dokuwiki\plugin\config\test\Setting;
+
+/**
+ * @group plugin_config
+ * @group admin_plugins
+ * @group plugins
+ * @group bundled_plugins
+ */
+class SettingStringTest extends SettingTest {
+
+}
diff --git a/lib/plugins/config/_test/Setting/SettingTest.php b/lib/plugins/config/_test/Setting/SettingTest.php
new file mode 100644
index 000000000..49e0662e0
--- /dev/null
+++ b/lib/plugins/config/_test/Setting/SettingTest.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace dokuwiki\plugin\config\test\Setting;
+
+use dokuwiki\plugin\config\core\Setting\Setting;
+
+/**
+ * @group plugin_config
+ * @group admin_plugins
+ * @group plugins
+ * @group bundled_plugins
+ */
+class SettingTest extends AbstractSettingTest {
+
+ /**
+ * Dataprovider for testOut()
+ *
+ * @return array
+ */
+ public function dataOut() {
+ return [
+ ['bar', "\$conf['test'] = 'bar';\n"],
+ ["foo'bar", "\$conf['test'] = 'foo\\'bar';\n"],
+ ];
+ }
+
+ /**
+ * Check the output
+ *
+ * @param mixed $in The value to initialize the setting with
+ * @param string $out The expected output (for conf[test])
+ * @dataProvider dataOut
+ */
+ public function testOut($in, $out) {
+ /** @var Setting $setting */
+ $setting = new $this->class('test');
+ $setting->initialize('ignore', $in);
+
+ $this->assertEquals($out, $setting->out('conf'));
+ }
+
+ /**
+ * DataProvider for testShouldBeSaved()
+ *
+ * @return array
+ */
+ public function dataShouldBeSaved() {
+ return [
+ ['default', null, false],
+ ['default', 'default', false],
+ ['default', 'new', true],
+ ];
+ }
+
+ /**
+ * Check if shouldBeSaved works as expected
+ *
+ * @dataProvider dataShouldBeSaved
+ * @param mixed $default The default value
+ * @param mixed $local The current local value
+ * @param bool $expect The expected outcome
+ */
+ public function testShouldBeSaved($default, $local, $expect) {
+ /** @var Setting $setting */
+ $setting = new $this->class('test');
+ $setting->initialize($default, $local, null);
+ $this->assertSame($expect, $setting->shouldBeSaved());
+ }
+
+}
diff --git a/lib/plugins/config/_test/WriterTest.php b/lib/plugins/config/_test/WriterTest.php
new file mode 100644
index 000000000..739f68be4
--- /dev/null
+++ b/lib/plugins/config/_test/WriterTest.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace dokuwiki\plugin\config\test;
+use dokuwiki\plugin\config\core\Setting\SettingString;
+use dokuwiki\plugin\config\core\Writer;
+
+/**
+ * @group plugin_config
+ * @group admin_plugins
+ * @group plugins
+ * @group bundled_plugins
+ */
+class WriterTest extends \DokuWikiTest {
+
+ public function testSave() {
+ global $config_cascade;
+ $config = end($config_cascade['main']['local']);
+
+ $set1 = new SettingString('test1');
+ $set1->initialize('foo','bar', null);
+ $set2 = new SettingString('test2');
+ $set2->initialize('foo','foo', null);
+ $settings = [$set1, $set2];
+ $writer = new Writer();
+
+ // before running, no backup should exist
+ $this->assertFileExists($config);
+ $this->assertFileNotExists("$config.bak.php");
+ $old = filesize($config);
+
+ /** @noinspection PhpUnhandledExceptionInspection */
+ $writer->save($settings);
+
+ // after running, both should exist
+ $this->assertFileExists($config);
+ $this->assertFileExists("$config.bak.php");
+ $this->assertEquals($old, filesize("$config.bak.php"), 'backup should have size of old file');
+
+ // check contents
+ $conf = [];
+ include $config;
+ $this->assertArrayHasKey('test1', $conf);
+ $this->assertEquals('bar', $conf['test1']);
+ $this->assertArrayNotHasKey('test2', $conf);
+
+ /** @noinspection PhpUnhandledExceptionInspection */
+ $writer->save($settings);
+ $this->assertEquals(filesize($config), filesize("$config.bak.php"));
+ }
+
+ public function testTouch() {
+ global $config_cascade;
+ $config = end($config_cascade['main']['local']);
+ $writer = new Writer();
+
+ $old = filemtime($config);
+ $this->waitForTick(true);
+ /** @noinspection PhpUnhandledExceptionInspection */
+ $writer->touch();
+ clearstatcache($config);
+ $this->assertGreaterThan($old, filemtime($config));
+ }
+}
diff --git a/lib/plugins/config/admin.php b/lib/plugins/config/admin.php
index 76ecae24c..219612cf1 100644
--- a/lib/plugins/config/admin.php
+++ b/lib/plugins/config/admin.php
@@ -6,17 +6,11 @@
* @author Christopher Smith <chris@jalakai.co.uk>
* @author Ben Coburn <btcoburn@silicodon.net>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-define('CM_KEYMARKER','____'); // used for settings with multiple dimensions of array indices
-
-define('PLUGIN_SELF',dirname(__FILE__).'/');
-define('PLUGIN_METADATA',PLUGIN_SELF.'settings/config.metadata.php');
-if(!defined('DOKU_PLUGIN_IMAGES')) define('DOKU_PLUGIN_IMAGES',DOKU_BASE.'lib/plugins/config/images/');
-
-require_once(PLUGIN_SELF.'settings/config.class.php'); // main configuration class and generic settings classes
-require_once(PLUGIN_SELF.'settings/extra.class.php'); // settings classes specific to these settings
+use dokuwiki\plugin\config\core\Configuration;
+use dokuwiki\plugin\config\core\Setting\Setting;
+use dokuwiki\plugin\config\core\Setting\SettingFieldset;
+use dokuwiki\plugin\config\core\Setting\SettingHidden;
/**
* All DokuWiki plugins to extend the admin function
@@ -24,18 +18,17 @@ require_once(PLUGIN_SELF.'settings/extra.class.php'); // settings classes spec
*/
class admin_plugin_config extends DokuWiki_Admin_Plugin {
- protected $_file = PLUGIN_METADATA;
- protected $_config = null;
- protected $_input = null;
- protected $_changed = false; // set to true if configuration has altered
- protected $_error = false;
- protected $_session_started = false;
- protected $_localised_prompts = false;
+ const IMGDIR = DOKU_BASE . 'lib/plugins/config/images/';
+
+ /** @var Configuration */
+ protected $configuration;
+
+ /** @var bool were there any errors in the submitted data? */
+ protected $hasErrors = false;
+
+ /** @var bool have the settings translations been loaded? */
+ protected $promptsLocalized = false;
- /**
- * @return int
- */
- public function getMenuSort() { return 100; }
/**
* handle user request
@@ -43,44 +36,33 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
public function handle() {
global $ID, $INPUT;
- if(!$this->_restore_session() || $INPUT->int('save') != 1 || !checkSecurityToken()) {
- $this->_close_session();
- return;
- }
+ // always initialize the configuration
+ $this->configuration = new Configuration();
- if(is_null($this->_config)) {
- $this->_config = new configuration($this->_file);
- }
-
- // don't go any further if the configuration is locked
- if($this->_config->locked) {
- $this->_close_session();
+ if(!$INPUT->bool('save') || !checkSecurityToken()) {
return;
}
- $this->_input = $INPUT->arr('config');
-
- foreach ($this->_config->setting as $key => $value){
- $input = isset($this->_input[$key]) ? $this->_input[$key] : null;
- if ($this->_config->setting[$key]->update($input)) {
- $this->_changed = true;
+ // don't go any further if the configuration is locked
+ if($this->configuration->isLocked()) return;
+
+ // update settings and redirect of successful
+ $ok = $this->configuration->updateSettings($INPUT->arr('config'));
+ if($ok) { // no errors
+ try {
+ if($this->configuration->hasChanged()) {
+ $this->configuration->save();
+ } else {
+ $this->configuration->touch();
+ }
+ msg($this->getLang('updated'), 1);
+ } catch(Exception $e) {
+ msg($this->getLang('error'), -1);
}
- if ($this->_config->setting[$key]->error()) $this->_error = true;
+ send_redirect(wl($ID, array('do' => 'admin', 'page' => 'config'), true, '&'));
+ } else {
+ $this->hasErrors = true;
}
-
- if ($this->_changed && !$this->_error) {
- $this->_config->save_settings($this->getPluginName());
-
- // save state & force a page reload to get the new settings to take effect
- $_SESSION['PLUGIN_CONFIG'] = array('state' => 'updated', 'time' => time());
- $this->_close_session();
- send_redirect(wl($ID,array('do'=>'admin','page'=>'config'),true,'&'));
- exit();
- } elseif(!$this->_error) {
- $this->_config->touch_settings(); // just touch to refresh cache
- }
-
- $this->_close_session();
}
/**
@@ -91,234 +73,137 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
global $lang;
global $ID;
- if (is_null($this->_config)) { $this->_config = new configuration($this->_file); }
$this->setupLocale(true);
- print $this->locale_xhtml('intro');
+ echo $this->locale_xhtml('intro');
- ptln('<div id="config__manager">');
+ echo '<div id="config__manager">';
- if ($this->_config->locked)
- ptln('<div class="info">'.$this->getLang('locked').'</div>');
- elseif ($this->_error)
- ptln('<div class="error">'.$this->getLang('error').'</div>');
- elseif ($this->_changed)
- ptln('<div class="success">'.$this->getLang('updated').'</div>');
+ if($this->configuration->isLocked()) {
+ echo '<div class="info">' . $this->getLang('locked') . '</div>';
+ }
// POST to script() instead of wl($ID) so config manager still works if
// rewrite config is broken. Add $ID as hidden field to remember
// current ID in most cases.
- ptln('<form action="'.script().'" method="post">');
- ptln('<div class="no"><input type="hidden" name="id" value="'.$ID.'" /></div>');
+ echo '<form id="dw__configform" action="' . script() . '" method="post">';
+ echo '<div class="no"><input type="hidden" name="id" value="' . $ID . '" /></div>';
formSecurityToken();
- $this->_print_h1('dokuwiki_settings', $this->getLang('_header_dokuwiki'));
+ $this->printH1('dokuwiki_settings', $this->getLang('_header_dokuwiki'));
- /** @var setting[] $undefined_settings */
- $undefined_settings = array();
$in_fieldset = false;
$first_plugin_fieldset = true;
$first_template_fieldset = true;
- foreach($this->_config->setting as $setting) {
- if (is_a($setting, 'setting_hidden')) {
- // skip hidden (and undefined) settings
- if ($allow_debug && is_a($setting, 'setting_undefined')) {
- $undefined_settings[] = $setting;
- } else {
- continue;
- }
- } else if (is_a($setting, 'setting_fieldset')) {
+ foreach($this->configuration->getSettings() as $setting) {
+ if(is_a($setting, SettingHidden::class)) {
+ continue;
+ } else if(is_a($setting, settingFieldset::class)) {
// config setting group
- if ($in_fieldset) {
- ptln(' </table>');
- ptln(' </div>');
- ptln(' </fieldset>');
+ if($in_fieldset) {
+ echo '</table>';
+ echo '</div>';
+ echo '</fieldset>';
} else {
$in_fieldset = true;
}
- if ($first_plugin_fieldset && substr($setting->_key, 0, 10)=='plugin'.CM_KEYMARKER) {
- $this->_print_h1('plugin_settings', $this->getLang('_header_plugin'));
+ if($first_plugin_fieldset && $setting->getType() == 'plugin') {
+ $this->printH1('plugin_settings', $this->getLang('_header_plugin'));
$first_plugin_fieldset = false;
- } else if ($first_template_fieldset && substr($setting->_key, 0, 7)=='tpl'.CM_KEYMARKER) {
- $this->_print_h1('template_settings', $this->getLang('_header_template'));
+ } else if($first_template_fieldset && $setting->getType() == 'template') {
+ $this->printH1('template_settings', $this->getLang('_header_template'));
$first_template_fieldset = false;
}
- ptln(' <fieldset id="'.$setting->_key.'">');
- ptln(' <legend>'.$setting->prompt($this).'</legend>');
- ptln(' <div class="table">');
- ptln(' <table class="inline">');
+ echo '<fieldset id="' . $setting->getKey() . '">';
+ echo '<legend>' . $setting->prompt($this) . '</legend>';
+ echo '<div class="table">';
+ echo '<table class="inline">';
} else {
// config settings
- list($label,$input) = $setting->html($this, $this->_error);
-
- $class = $setting->is_default() ? ' class="default"' : ($setting->is_protected() ? ' class="protected"' : '');
- $error = $setting->error() ? ' class="value error"' : ' class="value"';
- $icon = $setting->caution() ? '<img src="'.DOKU_PLUGIN_IMAGES.$setting->caution().'.png" alt="'.$setting->caution().'" title="'.$this->getLang($setting->caution()).'" />' : '';
-
- ptln(' <tr'.$class.'>');
- ptln(' <td class="label">');
- ptln(' <span class="outkey">'.$setting->_out_key(true, true).'</span>');
- ptln(' '.$icon.$label);
- ptln(' </td>');
- ptln(' <td'.$error.'>'.$input.'</td>');
- ptln(' </tr>');
+ list($label, $input) = $setting->html($this, $this->hasErrors);
+
+ $class = $setting->isDefault()
+ ? ' class="default"'
+ : ($setting->isProtected() ? ' class="protected"' : '');
+ $error = $setting->hasError()
+ ? ' class="value error"'
+ : ' class="value"';
+ $icon = $setting->caution()
+ ? '<img src="' . self::IMGDIR . $setting->caution() . '.png" ' .
+ 'alt="' . $setting->caution() . '" title="' . $this->getLang($setting->caution()) . '" />'
+ : '';
+
+ echo '<tr' . $class . '>';
+ echo '<td class="label">';
+ echo '<span class="outkey">' . $setting->getPrettyKey() . '</span>';
+ echo $icon . $label;
+ echo '</td>';
+ echo '<td' . $error . '>' . $input . '</td>';
+ echo '</tr>';
}
}
- ptln(' </table>');
- ptln(' </div>');
- if ($in_fieldset) {
- ptln(' </fieldset>');
+ echo '</table>';
+ echo '</div>';
+ if($in_fieldset) {
+ echo '</fieldset>';
}
// show undefined settings list
- if ($allow_debug && !empty($undefined_settings)) {
+ $undefined_settings = $this->configuration->getUndefined();
+ if($allow_debug && !empty($undefined_settings)) {
/**
* Callback for sorting settings
*
- * @param setting $a
- * @param setting $b
+ * @param Setting $a
+ * @param Setting $b
* @return int if $a is lower/equal/higher than $b
*/
- function _setting_natural_comparison($a, $b) {
- return strnatcmp($a->_key, $b->_key);
+ function settingNaturalComparison($a, $b) {
+ return strnatcmp($a->getKey(), $b->getKey());
}
- 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();
+ usort($undefined_settings, 'settingNaturalComparison');
+ $this->printH1('undefined_settings', $this->getLang('_header_undefined'));
+ echo '<fieldset>';
+ echo '<div class="table">';
+ echo '<table class="inline">';
foreach($undefined_settings as $setting) {
- if (preg_match('/^(?:plugin|tpl)'.CM_KEYMARKER.'.*?'.CM_KEYMARKER.'(.*)$/', $setting->_key, $undefined_setting_match)) {
- $undefined_setting_key = $undefined_setting_match[1];
- } else {
- $undefined_setting_key = $setting->_key;
- }
- ptln(' <tr>');
- ptln(' <td class="label"><span title="$meta[\''.$undefined_setting_key.'\']">$'.$this->_config->_name.'[\''.$setting->_out_key().'\']</span></td>');
- ptln(' <td>'.$this->getLang('_msg_'.get_class($setting)).'</td>');
- ptln(' </tr>');
+ list($label, $input) = $setting->html($this);
+ echo '<tr>';
+ echo '<td class="label">' . $label . '</td>';
+ echo '<td>' . $input . '</td>';
+ echo '</tr>';
}
- ptln('</table>');
- ptln('</div>');
- ptln('</fieldset>');
+ echo '</table>';
+ echo '</div>';
+ echo '</fieldset>';
}
// finish up form
- ptln('<p>');
- ptln(' <input type="hidden" name="do" value="admin" />');
- ptln(' <input type="hidden" name="page" value="config" />');
-
- if (!$this->_config->locked) {
- ptln(' <input type="hidden" name="save" value="1" />');
- ptln(' <button type="submit" name="submit" accesskey="s">'.$lang['btn_save'].'</button>');
- ptln(' <button type="reset">'.$lang['btn_reset'].'</button>');
- }
-
- ptln('</p>');
-
- ptln('</form>');
- ptln('</div>');
- }
-
- /**
- * @return boolean true - proceed with handle, false - don't proceed
- */
- protected function _restore_session() {
-
- // dokuwiki closes the session before act_dispatch. $_SESSION variables are all set,
- // however they can't be changed without starting the session again
- if (!headers_sent()) {
- session_start();
- $this->_session_started = true;
+ echo '<p>';
+ echo '<input type="hidden" name="do" value="admin" />';
+ echo '<input type="hidden" name="page" value="config" />';
+
+ if(!$this->configuration->isLocked()) {
+ echo '<input type="hidden" name="save" value="1" />';
+ echo '<button type="submit" name="submit" accesskey="s">' . $lang['btn_save'] . '</button>';
+ echo '<button type="reset">' . $lang['btn_reset'] . '</button>';
}
- if (!isset($_SESSION['PLUGIN_CONFIG'])) return true;
+ echo '</p>';
- $session = $_SESSION['PLUGIN_CONFIG'];
- unset($_SESSION['PLUGIN_CONFIG']);
-
- // still valid?
- if (time() - $session['time'] > 120) return true;
-
- switch ($session['state']) {
- case 'updated' :
- $this->_changed = true;
- return false;
- }
-
- return true;
- }
-
- protected function _close_session() {
- if ($this->_session_started) session_write_close();
+ echo '</form>';
+ echo '</div>';
}
/**
* @param bool $prompts
*/
- public function setupLocale($prompts=false) {
-
+ public function setupLocale($prompts = false) {
parent::setupLocale();
- if (!$prompts || $this->_localised_prompts) return;
-
- $this->_setup_localised_plugin_prompts();
- $this->_localised_prompts = true;
-
- }
-
- /**
- * @return bool
- */
- protected function _setup_localised_plugin_prompts() {
- global $conf;
-
- $langfile = '/lang/'.$conf['lang'].'/settings.php';
- $enlangfile = '/lang/en/settings.php';
-
- if ($dh = opendir(DOKU_PLUGIN)) {
- while (false !== ($plugin = readdir($dh))) {
- if ($plugin == '.' || $plugin == '..' || $plugin == 'tmp' || $plugin == 'config') continue;
- if (is_file(DOKU_PLUGIN.$plugin)) continue;
-
- if (file_exists(DOKU_PLUGIN.$plugin.$enlangfile)){
- $lang = array();
- @include(DOKU_PLUGIN.$plugin.$enlangfile);
- if ($conf['lang'] != 'en') @include(DOKU_PLUGIN.$plugin.$langfile);
- foreach ($lang as $key => $value){
- $this->lang['plugin'.CM_KEYMARKER.$plugin.CM_KEYMARKER.$key] = $value;
- }
- }
-
- // fill in the plugin name if missing (should exist for plugins with settings)
- if (!isset($this->lang['plugin'.CM_KEYMARKER.$plugin.CM_KEYMARKER.'plugin_settings_name'])) {
- $this->lang['plugin'.CM_KEYMARKER.$plugin.CM_KEYMARKER.'plugin_settings_name'] =
- ucwords(str_replace('_', ' ', $plugin));
- }
- }
- closedir($dh);
- }
-
- // the same for the active template
- $tpl = $conf['template'];
-
- if (file_exists(tpl_incdir().$enlangfile)){
- $lang = array();
- @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;
- }
- }
-
- // fill in the template name if missing (should exist for templates with settings)
- if (!isset($this->lang['tpl'.CM_KEYMARKER.$tpl.CM_KEYMARKER.'template_settings_name'])) {
- $this->lang['tpl'.CM_KEYMARKER.$tpl.CM_KEYMARKER.'template_settings_name'] =
- ucwords(str_replace('_', ' ', $tpl));
- }
-
- return true;
+ if(!$prompts || $this->promptsLocalized) return;
+ $this->lang = array_merge($this->lang, $this->configuration->getLangs());
+ $this->promptsLocalized = true;
}
/**
@@ -329,76 +214,69 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
* @return array
*/
public function getTOC() {
- if (is_null($this->_config)) { $this->_config = new configuration($this->_file); }
$this->setupLocale(true);
$allow_debug = $GLOBALS['conf']['allowdebug']; // avoid global $conf; here.
+ $toc = array();
+ $check = false;
- // gather toc data
- $has_undefined = false;
- $toc = array('conf'=>array(), 'plugin'=>array(), 'template'=>null);
- foreach($this->_config->setting as $setting) {
- if (is_a($setting, 'setting_fieldset')) {
- if (substr($setting->_key, 0, 10)=='plugin'.CM_KEYMARKER) {
- $toc['plugin'][] = $setting;
- } else if (substr($setting->_key, 0, 7)=='tpl'.CM_KEYMARKER) {
- $toc['template'] = $setting;
- } else {
- $toc['conf'][] = $setting;
- }
- } else if (!$has_undefined && is_a($setting, 'setting_undefined')) {
- $has_undefined = true;
+ // gather settings data into three sub arrays
+ $labels = ['dokuwiki' => [], 'plugin' => [], 'template' => []];
+ foreach($this->configuration->getSettings() as $setting) {
+ if(is_a($setting, SettingFieldset::class)) {
+ $labels[$setting->getType()][] = $setting;
}
}
- // build toc
- $t = array();
-
- $check = false;
+ // top header
$title = $this->getLang('_configuration_manager');
- $t[] = html_mktocitem(sectionID($title, $check), $title, 1);
- $t[] = html_mktocitem('dokuwiki_settings', $this->getLang('_header_dokuwiki'), 1);
- /** @var setting $setting */
- foreach($toc['conf'] as $setting) {
- $name = $setting->prompt($this);
- $t[] = html_mktocitem($setting->_key, $name, 2);
- }
- if (!empty($toc['plugin'])) {
- $t[] = html_mktocitem('plugin_settings', $this->getLang('_header_plugin'), 1);
- }
- foreach($toc['plugin'] as $setting) {
- $name = $setting->prompt($this);
- $t[] = html_mktocitem($setting->_key, $name, 2);
- }
- if (isset($toc['template'])) {
- $t[] = html_mktocitem('template_settings', $this->getLang('_header_template'), 1);
- $setting = $toc['template'];
- $name = $setting->prompt($this);
- $t[] = html_mktocitem($setting->_key, $name, 2);
+ $toc[] = html_mktocitem(sectionID($title, $check), $title, 1);
+
+ // main entries
+ foreach(['dokuwiki', 'plugin', 'template'] as $section) {
+ if(empty($labels[$section])) continue; // no entries, skip
+
+ // create main header
+ $toc[] = html_mktocitem(
+ $section . '_settings',
+ $this->getLang('_header_' . $section),
+ 1
+ );
+
+ // create sub headers
+ foreach($labels[$section] as $setting) {
+ /** @var SettingFieldset $setting */
+ $name = $setting->prompt($this);
+ $toc[] = html_mktocitem($setting->getKey(), $name, 2);
+ }
}
- if ($has_undefined && $allow_debug) {
- $t[] = html_mktocitem('undefined_settings', $this->getLang('_header_undefined'), 1);
+
+ // undefined settings if allowed
+ if(count($this->configuration->getUndefined()) && $allow_debug) {
+ $toc[] = html_mktocitem('undefined_settings', $this->getLang('_header_undefined'), 1);
}
- return $t;
+ return $toc;
}
/**
* @param string $id
* @param string $text
*/
- protected function _print_h1($id, $text) {
- ptln('<h1 id="'.$id.'">'.$text.'</h1>');
+ protected function printH1($id, $text) {
+ echo '<h1 id="' . $id . '">' . $text . '</h1>';
}
/**
* Adds a translation to this plugin's language array
*
+ * Used by some settings to set up dynamic translations
+ *
* @param string $key
* @param string $value
*/
public function addLang($key, $value) {
- if (!$this->localised) $this->setupLocale();
+ if(!$this->localised) $this->setupLocale();
$this->lang[$key] = $value;
}
}
diff --git a/lib/plugins/config/core/ConfigParser.php b/lib/plugins/config/core/ConfigParser.php
new file mode 100644
index 000000000..9e79b96f3
--- /dev/null
+++ b/lib/plugins/config/core/ConfigParser.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace dokuwiki\plugin\config\core;
+
+/**
+ * A naive PHP file parser
+ *
+ * This parses our very simple config file in PHP format. We use this instead of simply including
+ * the file, because we want to keep expressions such as 24*60*60 as is.
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ */
+class ConfigParser {
+ /** @var string variable to parse from the file */
+ protected $varname = 'conf';
+ /** @var string the key to mark sub arrays */
+ protected $keymarker = Configuration::KEYMARKER;
+
+ /**
+ * Parse the given PHP file into an array
+ *
+ * When the given files does not exist, this returns an empty array
+ *
+ * @param string $file
+ * @return array
+ */
+ public function parse($file) {
+ if(!file_exists($file)) return array();
+
+ $config = array();
+ $contents = @php_strip_whitespace($file);
+ $pattern = '/\$' . $this->varname . '\[[\'"]([^=]+)[\'"]\] ?= ?(.*?);(?=[^;]*(?:\$' . $this->varname . '|$))/s';
+ $matches = array();
+ preg_match_all($pattern, $contents, $matches, PREG_SET_ORDER);
+
+ for($i = 0; $i < count($matches); $i++) {
+ $value = $matches[$i][2];
+
+ // merge multi-dimensional array indices using the keymarker
+ $key = preg_replace('/.\]\[./', $this->keymarker, $matches[$i][1]);
+
+ // handle arrays
+ if(preg_match('/^array ?\((.*)\)/', $value, $match)) {
+ $arr = explode(',', $match[1]);
+
+ // remove quotes from quoted strings & unescape escaped data
+ $len = count($arr);
+ for($j = 0; $j < $len; $j++) {
+ $arr[$j] = trim($arr[$j]);
+ $arr[$j] = $this->readValue($arr[$j]);
+ }
+
+ $value = $arr;
+ } else {
+ $value = $this->readValue($value);
+ }
+
+ $config[$key] = $value;
+ }
+
+ return $config;
+ }
+
+ /**
+ * Convert php string into value
+ *
+ * @param string $value
+ * @return bool|string
+ */
+ protected function readValue($value) {
+ $removequotes_pattern = '/^(\'|")(.*)(?<!\\\\)\1$/s';
+ $unescape_pairs = array(
+ '\\\\' => '\\',
+ '\\\'' => '\'',
+ '\\"' => '"'
+ );
+
+ if($value == 'true') {
+ $value = true;
+ } elseif($value == 'false') {
+ $value = false;
+ } else {
+ // remove quotes from quoted strings & unescape escaped data
+ $value = preg_replace($removequotes_pattern, '$2', $value);
+ $value = strtr($value, $unescape_pairs);
+ }
+ return $value;
+ }
+
+}
diff --git a/lib/plugins/config/core/Configuration.php b/lib/plugins/config/core/Configuration.php
new file mode 100644
index 000000000..c58645c5b
--- /dev/null
+++ b/lib/plugins/config/core/Configuration.php
@@ -0,0 +1,219 @@
+<?php
+
+namespace dokuwiki\plugin\config\core;
+
+use dokuwiki\plugin\config\core\Setting\Setting;
+use dokuwiki\plugin\config\core\Setting\SettingNoClass;
+use dokuwiki\plugin\config\core\Setting\SettingNoDefault;
+use dokuwiki\plugin\config\core\Setting\SettingNoKnownClass;
+use dokuwiki\plugin\config\core\Setting\SettingUndefined;
+
+/**
+ * Holds all the current settings and proxies the Loader and Writer
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class Configuration {
+
+ const KEYMARKER = '____';
+
+ /** @var Setting[] metadata as array of Settings objects */
+ protected $settings = array();
+ /** @var Setting[] undefined and problematic settings */
+ protected $undefined = array();
+
+ /** @var array all metadata */
+ protected $metadata;
+ /** @var array all default settings */
+ protected $default;
+ /** @var array all local settings */
+ protected $local;
+ /** @var array all protected settings */
+ protected $protected;
+
+ /** @var bool have the settings been changed since loading from disk? */
+ protected $changed = false;
+
+ /** @var Loader */
+ protected $loader;
+ /** @var Writer */
+ protected $writer;
+
+ /**
+ * ConfigSettings constructor.
+ */
+ public function __construct() {
+ $this->loader = new Loader(new ConfigParser());
+ $this->writer = new Writer();
+
+ $this->metadata = $this->loader->loadMeta();
+ $this->default = $this->loader->loadDefaults();
+ $this->local = $this->loader->loadLocal();
+ $this->protected = $this->loader->loadProtected();
+
+ $this->initSettings();
+ }
+
+ /**
+ * Get all settings
+ *
+ * @return Setting[]
+ */
+ public function getSettings() {
+ return $this->settings;
+ }
+
+ /**
+ * Get all unknown or problematic settings
+ *
+ * @return Setting[]
+ */
+ public function getUndefined() {
+ return $this->undefined;
+ }
+
+ /**
+ * Have the settings been changed since loading from disk?
+ *
+ * @return bool
+ */
+ public function hasChanged() {
+ return $this->changed;
+ }
+
+ /**
+ * Check if the config can be written
+ *
+ * @return bool
+ */
+ public function isLocked() {
+ return $this->writer->isLocked();
+ }
+
+ /**
+ * Update the settings using the data provided
+ *
+ * @param array $input as posted
+ * @return bool true if all updates went through, false on errors
+ */
+ public function updateSettings($input) {
+ $ok = true;
+
+ foreach($this->settings as $key => $obj) {
+ $value = isset($input[$key]) ? $input[$key] : null;
+ if($obj->update($value)) {
+ $this->changed = true;
+ }
+ if($obj->hasError()) $ok = false;
+ }
+
+ return $ok;
+ }
+
+ /**
+ * Save the settings
+ *
+ * This save the current state as defined in this object, including the
+ * undefined settings
+ *
+ * @throws \Exception
+ */
+ public function save() {
+ // only save the undefined settings that have not been handled in settings
+ $undefined = array_diff_key($this->undefined, $this->settings);
+ $this->writer->save(array_merge($this->settings, $undefined));
+ }
+
+ /**
+ * Touch the settings
+ *
+ * @throws \Exception
+ */
+ public function touch() {
+ $this->writer->touch();
+ }
+
+ /**
+ * Load the extension language strings
+ *
+ * @return array
+ */
+ public function getLangs() {
+ return $this->loader->loadLangs();
+ }
+
+ /**
+ * Initalizes the $settings and $undefined properties
+ */
+ protected function initSettings() {
+ $keys = array_merge(
+ array_keys($this->metadata),
+ array_keys($this->default),
+ array_keys($this->local),
+ array_keys($this->protected)
+ );
+ $keys = array_unique($keys);
+
+ foreach($keys as $key) {
+ $obj = $this->instantiateClass($key);
+
+ if($obj->shouldHaveDefault() && !isset($this->default[$key])) {
+ $this->undefined[$key] = new SettingNoDefault($key);
+ }
+
+ $d = isset($this->default[$key]) ? $this->default[$key] : null;
+ $l = isset($this->local[$key]) ? $this->local[$key] : null;
+ $p = isset($this->protected[$key]) ? $this->protected[$key] : null;
+
+ $obj->initialize($d, $l, $p);
+ }
+ }
+
+ /**
+ * Instantiates the proper class for the given config key
+ *
+ * The class is added to the $settings or $undefined arrays and returned
+ *
+ * @param string $key
+ * @return Setting
+ */
+ protected function instantiateClass($key) {
+ if(isset($this->metadata[$key])) {
+ $param = $this->metadata[$key];
+ $class = $this->determineClassName(array_shift($param), $key); // first param is class
+ $obj = new $class($key, $param);
+ $this->settings[$key] = $obj;
+ } else {
+ $obj = new SettingUndefined($key);
+ $this->undefined[$key] = $obj;
+ }
+ return $obj;
+ }
+
+ /**
+ * Return the class to load
+ *
+ * @param string $class the class name as given in the meta file
+ * @param string $key the settings key
+ * @return string
+ */
+ protected function determineClassName($class, $key) {
+ // try namespaced class first
+ if(is_string($class)) {
+ $modern = str_replace('_', '', ucwords($class, '_'));
+ $modern = '\\dokuwiki\\plugin\\config\\core\\Setting\\Setting' . $modern;
+ if($modern && class_exists($modern)) return $modern;
+ // try class as given
+ if(class_exists($class)) return $class;
+ // class wasn't found add to errors
+ $this->undefined[$key] = new SettingNoKnownClass($key);
+ } else {
+ // no class given, add to errors
+ $this->undefined[$key] = new SettingNoClass($key);
+ }
+ return '\\dokuwiki\\plugin\\config\\core\\Setting\\Setting';
+ }
+
+}
diff --git a/lib/plugins/config/core/Loader.php b/lib/plugins/config/core/Loader.php
new file mode 100644
index 000000000..90ad0f50e
--- /dev/null
+++ b/lib/plugins/config/core/Loader.php
@@ -0,0 +1,269 @@
+<?php
+
+namespace dokuwiki\plugin\config\core;
+
+use dokuwiki\Extension\Event;
+
+/**
+ * Configuration loader
+ *
+ * Loads configuration meta data and settings from the various files. Honors the
+ * configuration cascade and installed plugins.
+ */
+class Loader {
+ /** @var ConfigParser */
+ protected $parser;
+
+ /** @var string[] list of enabled plugins */
+ protected $plugins;
+ /** @var string current template */
+ protected $template;
+
+ /**
+ * Loader constructor.
+ * @param ConfigParser $parser
+ * @triggers PLUGIN_CONFIG_PLUGINLIST
+ */
+ public function __construct(ConfigParser $parser) {
+ global $conf;
+ $this->parser = $parser;
+ $this->plugins = plugin_list();
+ $this->template = $conf['template'];
+ // allow plugins to remove configurable plugins
+ Event::createAndTrigger('PLUGIN_CONFIG_PLUGINLIST', $this->plugins);
+ }
+
+ /**
+ * Read the settings meta data
+ *
+ * Reads the main file, plugins and template settings meta data
+ *
+ * @return array
+ */
+ public function loadMeta() {
+ // load main file
+ $meta = array();
+ include DOKU_PLUGIN . 'config/settings/config.metadata.php';
+
+ // plugins
+ foreach($this->plugins as $plugin) {
+ $meta = array_merge(
+ $meta,
+ $this->loadExtensionMeta(
+ DOKU_PLUGIN . $plugin . '/conf/metadata.php',
+ 'plugin',
+ $plugin
+ )
+ );
+ }
+
+ // current template
+ $meta = array_merge(
+ $meta,
+ $this->loadExtensionMeta(
+ tpl_incdir() . '/conf/metadata.php',
+ 'tpl',
+ $this->template
+ )
+ );
+
+ return $meta;
+ }
+
+ /**
+ * Read the default values
+ *
+ * Reads the main file, plugins and template defaults
+ *
+ * @return array
+ */
+ public function loadDefaults() {
+ // load main files
+ global $config_cascade;
+ $conf = $this->loadConfigs($config_cascade['main']['default']);
+
+ // plugins
+ foreach($this->plugins as $plugin) {
+ $conf = array_merge(
+ $conf,
+ $this->loadExtensionConf(
+ DOKU_PLUGIN . $plugin . '/conf/default.php',
+ 'plugin',
+ $plugin
+ )
+ );
+ }
+
+ // current template
+ $conf = array_merge(
+ $conf,
+ $this->loadExtensionConf(
+ tpl_incdir() . '/conf/default.php',
+ 'tpl',
+ $this->template
+ )
+ );
+
+ return $conf;
+ }
+
+ /**
+ * Reads the language strings
+ *
+ * Only reads extensions, main one is loaded the usual way
+ *
+ * @return array
+ */
+ public function loadLangs() {
+ $lang = array();
+
+ // plugins
+ foreach($this->plugins as $plugin) {
+ $lang = array_merge(
+ $lang,
+ $this->loadExtensionLang(
+ DOKU_PLUGIN . $plugin . '/',
+ 'plugin',
+ $plugin
+ )
+ );
+ }
+
+ // current template
+ $lang = array_merge(
+ $lang,
+ $this->loadExtensionLang(
+ tpl_incdir() . '/',
+ 'tpl',
+ $this->template
+ )
+ );
+
+ return $lang;
+ }
+
+ /**
+ * Read the local settings
+ *
+ * @return array
+ */
+ public function loadLocal() {
+ global $config_cascade;
+ return $this->loadConfigs($config_cascade['main']['local']);
+ }
+
+ /**
+ * Read the protected settings
+ *
+ * @return array
+ */
+ public function loadProtected() {
+ global $config_cascade;
+ return $this->loadConfigs($config_cascade['main']['protected']);
+ }
+
+ /**
+ * Read the config values from the given files
+ *
+ * @param string[] $files paths to config php's
+ * @return array
+ */
+ protected function loadConfigs($files) {
+ $conf = array();
+ foreach($files as $file) {
+ $conf = array_merge($conf, $this->parser->parse($file));
+ }
+ return $conf;
+ }
+
+ /**
+ * Read settings file from an extension
+ *
+ * This is used to read the settings.php files of plugins and templates
+ *
+ * @param string $file php file to read
+ * @param string $type should be 'plugin' or 'tpl'
+ * @param string $extname name of the extension
+ * @return array
+ */
+ protected function loadExtensionMeta($file, $type, $extname) {
+ if(!file_exists($file)) return array();
+ $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER;
+
+ // include file
+ $meta = array();
+ include $file;
+ if(empty($meta)) return array();
+
+ // read data
+ $data = array();
+ $data[$prefix . $type . '_settings_name'] = ['fieldset'];
+ foreach($meta as $key => $value) {
+ if($value[0] == 'fieldset') continue; //plugins only get one fieldset
+ $data[$prefix . $key] = $value;
+ }
+
+ return $data;
+ }
+
+ /**
+ * Read a default file from an extension
+ *
+ * This is used to read the default.php files of plugins and templates
+ *
+ * @param string $file php file to read
+ * @param string $type should be 'plugin' or 'tpl'
+ * @param string $extname name of the extension
+ * @return array
+ */
+ protected function loadExtensionConf($file, $type, $extname) {
+ if(!file_exists($file)) return array();
+ $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER;
+
+ // parse file
+ $conf = $this->parser->parse($file);
+ if(empty($conf)) return array();
+
+ // read data
+ $data = array();
+ foreach($conf as $key => $value) {
+ $data[$prefix . $key] = $value;
+ }
+
+ return $data;
+ }
+
+ /**
+ * Read the language file of an extension
+ *
+ * @param string $dir directory of the extension
+ * @param string $type should be 'plugin' or 'tpl'
+ * @param string $extname name of the extension
+ * @return array
+ */
+ protected function loadExtensionLang($dir, $type, $extname) {
+ global $conf;
+ $ll = $conf['lang'];
+ $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER;
+
+ // include files
+ $lang = array();
+ if(file_exists($dir . 'lang/en/settings.php')) {
+ include $dir . 'lang/en/settings.php';
+ }
+ if($ll != 'en' && file_exists($dir . 'lang/' . $ll . '/settings.php')) {
+ include $dir . 'lang/' . $ll . '/settings.php';
+ }
+
+ // set up correct keys
+ $strings = array();
+ foreach($lang as $key => $val) {
+ $strings[$prefix . $key] = $val;
+ }
+
+ // add fieldset key
+ $strings[$prefix . $type . '_settings_name'] = ucwords(str_replace('_', ' ', $extname));
+
+ return $strings;
+ }
+}
diff --git a/lib/plugins/config/core/Setting/Setting.php b/lib/plugins/config/core/Setting/Setting.php
new file mode 100644
index 000000000..d64f68417
--- /dev/null
+++ b/lib/plugins/config/core/Setting/Setting.php
@@ -0,0 +1,294 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+use dokuwiki\plugin\config\core\Configuration;
+
+/**
+ * Class Setting
+ */
+class Setting {
+ /** @var string unique identifier of this setting */
+ protected $key = '';
+
+ /** @var mixed the default value of this setting */
+ protected $default = null;
+ /** @var mixed the local value of this setting */
+ protected $local = null;
+ /** @var mixed the protected value of this setting */
+ protected $protected = null;
+
+ /** @var array valid alerts, images matching the alerts are in the plugin's images directory */
+ static protected $validCautions = array('warning', 'danger', 'security');
+
+ protected $pattern = '';
+ protected $error = false; // only used by those classes which error check
+ protected $input = null; // only used by those classes which error check
+ protected $caution = null; // used by any setting to provide an alert along with the setting
+
+ /**
+ * Constructor.
+ *
+ * The given parameters will be set up as class properties
+ *
+ * @see initialize() to set the actual value of the setting
+ *
+ * @param string $key
+ * @param array|null $params array with metadata of setting
+ */
+ public function __construct($key, $params = null) {
+ $this->key = $key;
+
+ if(is_array($params)) {
+ foreach($params as $property => $value) {
+ $property = trim($property, '_'); // we don't use underscores anymore
+ $this->$property = $value;
+ }
+ }
+ }
+
+ /**
+ * Set the current values for the setting $key
+ *
+ * This is used to initialize the setting with the data read form the config files.
+ *
+ * @see update() to set a new value
+ * @param mixed $default default setting value
+ * @param mixed $local local setting value
+ * @param mixed $protected protected setting value
+ */
+ public function initialize($default = null, $local = null, $protected = null) {
+ $this->default = $this->cleanValue($default);
+ $this->local = $this->cleanValue($local);
+ $this->protected = $this->cleanValue($protected);
+ }
+
+ /**
+ * update changed setting with validated user provided value $input
+ * - if changed value fails validation check, save it to $this->input (to allow echoing later)
+ * - if changed value passes validation check, set $this->local to the new value
+ *
+ * @param mixed $input the new value
+ * @return boolean true if changed, false otherwise
+ */
+ public function update($input) {
+ if(is_null($input)) return false;
+ if($this->isProtected()) return false;
+ $input = $this->cleanValue($input);
+
+ $value = is_null($this->local) ? $this->default : $this->local;
+ if($value == $input) return false;
+
+ // validate new value
+ if($this->pattern && !preg_match($this->pattern, $input)) {
+ $this->error = true;
+ $this->input = $input;
+ return false;
+ }
+
+ // update local copy of this setting with new value
+ $this->local = $input;
+
+ // setting ready for update
+ return true;
+ }
+
+ /**
+ * Clean a value read from a config before using it internally
+ *
+ * Default implementation returns $value as is. Subclasses can override.
+ * Note: null should always be returned as null!
+ *
+ * This is applied in initialize() and update()
+ *
+ * @param mixed $value
+ * @return mixed
+ */
+ protected function cleanValue($value) {
+ return $value;
+ }
+
+ /**
+ * Should this type of config have a default?
+ *
+ * @return bool
+ */
+ public function shouldHaveDefault() {
+ return true;
+ }
+
+ /**
+ * Get this setting's unique key
+ *
+ * @return string
+ */
+ public function getKey() {
+ return $this->key;
+ }
+
+ /**
+ * Get the key of this setting marked up human readable
+ *
+ * @param bool $url link to dokuwiki.org manual?
+ * @return string
+ */
+ public function getPrettyKey($url = true) {
+ $out = str_replace(Configuration::KEYMARKER, "»", $this->key);
+ if($url && !strstr($out, '»')) {//provide no urls for plugins, etc.
+ if($out == 'start') {
+ // exception, because this config name is clashing with our actual start page
+ return '<a href="http://www.dokuwiki.org/config:startpage">' . $out . '</a>';
+ } else {
+ return '<a href="http://www.dokuwiki.org/config:' . $out . '">' . $out . '</a>';
+ }
+ }
+ return $out;
+ }
+
+ /**
+ * Returns setting key as an array key separator
+ *
+ * This is used to create form output
+ *
+ * @return string key
+ */
+ public function getArrayKey() {
+ return str_replace(Configuration::KEYMARKER, "']['", $this->key);
+ }
+
+ /**
+ * What type of configuration is this
+ *
+ * Returns one of
+ *
+ * 'plugin' for plugin configuration
+ * 'template' for template configuration
+ * 'dokuwiki' for core configuration
+ *
+ * @return string
+ */
+ public function getType() {
+ if(substr($this->getKey(), 0, 10) == 'plugin' . Configuration::KEYMARKER) {
+ return 'plugin';
+ } else if(substr($this->getKey(), 0, 7) == 'tpl' . Configuration::KEYMARKER) {
+ return 'template';
+ } else {
+ return 'dokuwiki';
+ }
+ }
+
+ /**
+ * Build html for label and input of setting
+ *
+ * @param \admin_plugin_config $plugin object of config plugin
+ * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting
+ * @return string[] with content array(string $label_html, string $input_html)
+ */
+ public function html(\admin_plugin_config $plugin, $echo = false) {
+ $disable = '';
+
+ if($this->isProtected()) {
+ $value = $this->protected;
+ $disable = 'disabled="disabled"';
+ } else {
+ if($echo && $this->error) {
+ $value = $this->input;
+ } else {
+ $value = is_null($this->local) ? $this->default : $this->local;
+ }
+ }
+
+ $key = htmlspecialchars($this->key);
+ $value = formText($value);
+
+ $label = '<label for="config___' . $key . '">' . $this->prompt($plugin) . '</label>';
+ $input = '<textarea rows="3" cols="40" id="config___' . $key .
+ '" name="config[' . $key . ']" class="edit" ' . $disable . '>' . $value . '</textarea>';
+ return array($label, $input);
+ }
+
+ /**
+ * Should the current local value be saved?
+ *
+ * @see out() to run when this returns true
+ * @return bool
+ */
+ public function shouldBeSaved() {
+ if($this->isProtected()) return false;
+ if($this->local === null) return false;
+ if($this->default == $this->local) return false;
+ return true;
+ }
+
+ /**
+ * Generate string to save local setting value to file according to $fmt
+ *
+ * @see shouldBeSaved() to check if this should be called
+ * @param string $var name of variable
+ * @param string $fmt save format
+ * @return string
+ */
+ public function out($var, $fmt = 'php') {
+ if($fmt != 'php') return '';
+
+ $tr = array("\\" => '\\\\', "'" => '\\\''); // escape the value
+ $out = '$' . $var . "['" . $this->getArrayKey() . "'] = '" . strtr(cleanText($this->local), $tr) . "';\n";
+
+ return $out;
+ }
+
+ /**
+ * Returns the localized prompt
+ *
+ * @param \admin_plugin_config $plugin object of config plugin
+ * @return string text
+ */
+ public function prompt(\admin_plugin_config $plugin) {
+ $prompt = $plugin->getLang($this->key);
+ if(!$prompt) $prompt = htmlspecialchars(str_replace(array('____', '_'), ' ', $this->key));
+ return $prompt;
+ }
+
+ /**
+ * Is setting protected
+ *
+ * @return bool
+ */
+ public function isProtected() {
+ return !is_null($this->protected);
+ }
+
+ /**
+ * Is setting the default?
+ *
+ * @return bool
+ */
+ public function isDefault() {
+ return !$this->isProtected() && is_null($this->local);
+ }
+
+ /**
+ * Has an error?
+ *
+ * @return bool
+ */
+ public function hasError() {
+ return $this->error;
+ }
+
+ /**
+ * Returns caution
+ *
+ * @return false|string caution string, otherwise false for invalid caution
+ */
+ public function caution() {
+ if(empty($this->caution)) return false;
+ if(!in_array($this->caution, Setting::$validCautions)) {
+ throw new \RuntimeException(
+ 'Invalid caution string (' . $this->caution . ') in metadata for setting "' . $this->key . '"'
+ );
+ }
+ return $this->caution;
+ }
+
+}
diff --git a/lib/plugins/config/core/Setting/SettingArray.php b/lib/plugins/config/core/Setting/SettingArray.php
new file mode 100644
index 000000000..c48dc760b
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingArray.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_array
+ */
+class SettingArray extends Setting {
+
+ /**
+ * Create an array from a string
+ *
+ * @param string $string
+ * @return array
+ */
+ protected function fromString($string) {
+ $array = explode(',', $string);
+ $array = array_map('trim', $array);
+ $array = array_filter($array);
+ $array = array_unique($array);
+ return $array;
+ }
+
+ /**
+ * Create a string from an array
+ *
+ * @param array $array
+ * @return string
+ */
+ protected function fromArray($array) {
+ return join(', ', (array) $array);
+ }
+
+ /**
+ * update setting with user provided value $input
+ * if value fails error check, save it
+ *
+ * @param string $input
+ * @return bool true if changed, false otherwise (incl. on error)
+ */
+ public function update($input) {
+ if(is_null($input)) return false;
+ if($this->isProtected()) return false;
+
+ $input = $this->fromString($input);
+
+ $value = is_null($this->local) ? $this->default : $this->local;
+ if($value == $input) return false;
+
+ foreach($input as $item) {
+ if($this->pattern && !preg_match($this->pattern, $item)) {
+ $this->error = true;
+ $this->input = $input;
+ return false;
+ }
+ }
+
+ $this->local = $input;
+ return true;
+ }
+
+ /**
+ * Escaping
+ *
+ * @param string $string
+ * @return string
+ */
+ protected function escape($string) {
+ $tr = array("\\" => '\\\\', "'" => '\\\'');
+ return "'" . strtr(cleanText($string), $tr) . "'";
+ }
+
+ /** @inheritdoc */
+ public function out($var, $fmt = 'php') {
+ if($fmt != 'php') return '';
+
+ $vals = array_map(array($this, 'escape'), $this->local);
+ $out = '$' . $var . "['" . $this->getArrayKey() . "'] = array(" . join(', ', $vals) . ");\n";
+ return $out;
+ }
+
+ /** @inheritdoc */
+ public function html(\admin_plugin_config $plugin, $echo = false) {
+ $disable = '';
+
+ if($this->isProtected()) {
+ $value = $this->protected;
+ $disable = 'disabled="disabled"';
+ } else {
+ if($echo && $this->error) {
+ $value = $this->input;
+ } else {
+ $value = is_null($this->local) ? $this->default : $this->local;
+ }
+ }
+
+ $key = htmlspecialchars($this->key);
+ $value = htmlspecialchars($this->fromArray($value));
+
+ $label = '<label for="config___' . $key . '">' . $this->prompt($plugin) . '</label>';
+ $input = '<input id="config___' . $key . '" name="config[' . $key .
+ ']" type="text" class="edit" value="' . $value . '" ' . $disable . '/>';
+ return array($label, $input);
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingAuthtype.php b/lib/plugins/config/core/Setting/SettingAuthtype.php
new file mode 100644
index 000000000..3a6df6fe5
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingAuthtype.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_authtype
+ */
+class SettingAuthtype extends SettingMultichoice {
+
+ /** @inheritdoc */
+ public function initialize($default = null, $local = null, $protected = null) {
+ /** @var $plugin_controller \dokuwiki\Extension\PluginController */
+ global $plugin_controller;
+
+ // retrieve auth types provided by plugins
+ foreach($plugin_controller->getList('auth') as $plugin) {
+ $this->choices[] = $plugin;
+ }
+
+ parent::initialize($default, $local, $protected);
+ }
+
+ /** @inheritdoc */
+ public function update($input) {
+ /** @var $plugin_controller \dokuwiki\Extension\PluginController */
+ global $plugin_controller;
+
+ // is an update possible/requested?
+ $local = $this->local; // save this, parent::update() may change it
+ if(!parent::update($input)) return false; // nothing changed or an error caught by parent
+ $this->local = $local; // restore original, more error checking to come
+
+ // attempt to load the plugin
+ $auth_plugin = $plugin_controller->load('auth', $input);
+
+ // @TODO: throw an error in plugin controller instead of returning null
+ if(is_null($auth_plugin)) {
+ $this->error = true;
+ msg('Cannot load Auth Plugin "' . $input . '"', -1);
+ return false;
+ }
+
+ // verify proper instantiation (is this really a plugin?) @TODO use instanceof? implement interface?
+ if(is_object($auth_plugin) && !method_exists($auth_plugin, 'getPluginName')) {
+ $this->error = true;
+ msg('Cannot create Auth Plugin "' . $input . '"', -1);
+ return false;
+ }
+
+ // did we change the auth type? logout
+ global $conf;
+ if($conf['authtype'] != $input) {
+ msg('Authentication system changed. Please re-login.');
+ auth_logoff();
+ }
+
+ $this->local = $input;
+ return true;
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingCompression.php b/lib/plugins/config/core/Setting/SettingCompression.php
new file mode 100644
index 000000000..f97d82801
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingCompression.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_compression
+ */
+class SettingCompression extends SettingMultichoice {
+
+ protected $choices = array('0'); // 0 = no compression, always supported
+
+ /** @inheritdoc */
+ public function initialize($default = null, $local = null, $protected = null) {
+
+ // populate _choices with the compression methods supported by this php installation
+ if(function_exists('gzopen')) $this->choices[] = 'gz';
+ if(function_exists('bzopen')) $this->choices[] = 'bz2';
+
+ parent::initialize($default, $local, $protected);
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingDirchoice.php b/lib/plugins/config/core/Setting/SettingDirchoice.php
new file mode 100644
index 000000000..dfb27f5f4
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingDirchoice.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_dirchoice
+ */
+class SettingDirchoice extends SettingMultichoice {
+
+ protected $dir = '';
+
+ /** @inheritdoc */
+ public function initialize($default = null, $local = null, $protected = null) {
+
+ // populate $this->_choices with a list of directories
+ $list = array();
+
+ if($dh = @opendir($this->dir)) {
+ while(false !== ($entry = readdir($dh))) {
+ if($entry == '.' || $entry == '..') continue;
+ if($this->pattern && !preg_match($this->pattern, $entry)) continue;
+
+ $file = (is_link($this->dir . $entry)) ? readlink($this->dir . $entry) : $this->dir . $entry;
+ if(is_dir($file)) $list[] = $entry;
+ }
+ closedir($dh);
+ }
+ sort($list);
+ $this->choices = $list;
+
+ parent::initialize($default, $local, $protected);
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingDisableactions.php b/lib/plugins/config/core/Setting/SettingDisableactions.php
new file mode 100644
index 000000000..2553175bd
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingDisableactions.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_disableactions
+ */
+class SettingDisableactions extends SettingMulticheckbox {
+
+ /** @inheritdoc */
+ public function html(\admin_plugin_config $plugin, $echo = false) {
+ global $lang;
+
+ // make some language adjustments (there must be a better way)
+ // transfer some DokuWiki language strings to the plugin
+ $plugin->addLang($this->key . '_revisions', $lang['btn_revs']);
+ foreach($this->choices as $choice) {
+ if(isset($lang['btn_' . $choice])) $plugin->addLang($this->key . '_' . $choice, $lang['btn_' . $choice]);
+ }
+
+ return parent::html($plugin, $echo);
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingEmail.php b/lib/plugins/config/core/Setting/SettingEmail.php
new file mode 100644
index 000000000..25a0c0e75
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingEmail.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_email
+ */
+class SettingEmail extends SettingString {
+ protected $multiple = false;
+ protected $placeholders = false;
+
+ /** @inheritdoc */
+ public function update($input) {
+ if(is_null($input)) return false;
+ if($this->isProtected()) return false;
+
+ $value = is_null($this->local) ? $this->default : $this->local;
+ if($value == $input) return false;
+ if($input === '') {
+ $this->local = $input;
+ return true;
+ }
+ $mail = $input;
+
+ if($this->placeholders) {
+ // replace variables with pseudo values
+ $mail = str_replace('@USER@', 'joe', $mail);
+ $mail = str_replace('@NAME@', 'Joe Schmoe', $mail);
+ $mail = str_replace('@MAIL@', 'joe@example.com', $mail);
+ }
+
+ // multiple mail addresses?
+ if($this->multiple) {
+ $mails = array_filter(array_map('trim', explode(',', $mail)));
+ } else {
+ $mails = array($mail);
+ }
+
+ // check them all
+ foreach($mails as $mail) {
+ // only check the address part
+ if(preg_match('#(.*?)<(.*?)>#', $mail, $matches)) {
+ $addr = $matches[2];
+ } else {
+ $addr = $mail;
+ }
+
+ if(!mail_isvalid($addr)) {
+ $this->error = true;
+ $this->input = $input;
+ return false;
+ }
+ }
+
+ $this->local = $input;
+ return true;
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingFieldset.php b/lib/plugins/config/core/Setting/SettingFieldset.php
new file mode 100644
index 000000000..4e8618967
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingFieldset.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * A do-nothing class used to detect the 'fieldset' type.
+ *
+ * Used to start a new settings "display-group".
+ */
+class SettingFieldset extends Setting {
+
+ /** @inheritdoc */
+ public function shouldHaveDefault() {
+ return false;
+ }
+
+}
diff --git a/lib/plugins/config/core/Setting/SettingHidden.php b/lib/plugins/config/core/Setting/SettingHidden.php
new file mode 100644
index 000000000..ca8a03eb9
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingHidden.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_hidden
+ */
+class SettingHidden extends Setting {
+ // Used to explicitly ignore a setting in the configuration manager.
+}
diff --git a/lib/plugins/config/core/Setting/SettingImConvert.php b/lib/plugins/config/core/Setting/SettingImConvert.php
new file mode 100644
index 000000000..8740d94c8
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingImConvert.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_im_convert
+ */
+class SettingImConvert extends SettingString {
+
+ /** @inheritdoc */
+ public function update($input) {
+ if($this->isProtected()) return false;
+
+ $input = trim($input);
+
+ $value = is_null($this->local) ? $this->default : $this->local;
+ if($value == $input) return false;
+
+ if($input && !file_exists($input)) {
+ $this->error = true;
+ $this->input = $input;
+ return false;
+ }
+
+ $this->local = $input;
+ return true;
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingLicense.php b/lib/plugins/config/core/Setting/SettingLicense.php
new file mode 100644
index 000000000..8dacf8e25
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingLicense.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_license
+ */
+class SettingLicense extends SettingMultichoice {
+
+ protected $choices = array(''); // none choosen
+
+ /** @inheritdoc */
+ public function initialize($default = null, $local = null, $protected = null) {
+ global $license;
+
+ foreach($license as $key => $data) {
+ $this->choices[] = $key;
+ $this->lang[$this->key . '_o_' . $key] = $data['name']; // stored in setting
+ }
+
+ parent::initialize($default, $local, $protected);
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingMulticheckbox.php b/lib/plugins/config/core/Setting/SettingMulticheckbox.php
new file mode 100644
index 000000000..df212cca0
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingMulticheckbox.php
@@ -0,0 +1,163 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_multicheckbox
+ */
+class SettingMulticheckbox extends SettingString {
+
+ protected $choices = array();
+ protected $combine = array();
+ protected $other = 'always';
+
+ /** @inheritdoc */
+ public function update($input) {
+ if($this->isProtected()) return false;
+
+ // split any combined values + convert from array to comma separated string
+ $input = ($input) ? $input : array();
+ $input = $this->array2str($input);
+
+ $value = is_null($this->local) ? $this->default : $this->local;
+ if($value == $input) return false;
+
+ if($this->pattern && !preg_match($this->pattern, $input)) {
+ $this->error = true;
+ $this->input = $input;
+ return false;
+ }
+
+ $this->local = $input;
+ return true;
+ }
+
+ /** @inheritdoc */
+ public function html(\admin_plugin_config $plugin, $echo = false) {
+
+ $disable = '';
+
+ if($this->isProtected()) {
+ $value = $this->protected;
+ $disable = 'disabled="disabled"';
+ } else {
+ if($echo && $this->error) {
+ $value = $this->input;
+ } else {
+ $value = is_null($this->local) ? $this->default : $this->local;
+ }
+ }
+
+ $key = htmlspecialchars($this->key);
+
+ // convert from comma separated list into array + combine complimentary actions
+ $value = $this->str2array($value);
+ $default = $this->str2array($this->default);
+
+ $input = '';
+ foreach($this->choices as $choice) {
+ $idx = array_search($choice, $value);
+ $idx_default = array_search($choice, $default);
+
+ $checked = ($idx !== false) ? 'checked="checked"' : '';
+
+ // @todo ideally this would be handled using a second class of "default"
+ $class = (($idx !== false) == (false !== $idx_default)) ? " selectiondefault" : "";
+
+ $prompt = ($plugin->getLang($this->key . '_' . $choice) ?
+ $plugin->getLang($this->key . '_' . $choice) : htmlspecialchars($choice));
+
+ $input .= '<div class="selection' . $class . '">' . "\n";
+ $input .= '<label for="config___' . $key . '_' . $choice . '">' . $prompt . "</label>\n";
+ $input .= '<input id="config___' . $key . '_' . $choice . '" name="config[' . $key .
+ '][]" type="checkbox" class="checkbox" value="' . $choice . '" ' . $disable . ' ' . $checked . "/>\n";
+ $input .= "</div>\n";
+
+ // remove this action from the disabledactions array
+ if($idx !== false) unset($value[$idx]);
+ if($idx_default !== false) unset($default[$idx_default]);
+ }
+
+ // handle any remaining values
+ if($this->other != 'never') {
+ $other = join(',', $value);
+ // test equivalent to ($this->_other == 'always' || ($other && $this->_other == 'exists')
+ // use != 'exists' rather than == 'always' to ensure invalid values default to 'always'
+ if($this->other != 'exists' || $other) {
+
+ $class = (
+ (count($default) == count($value)) &&
+ (count($value) == count(array_intersect($value, $default)))
+ ) ?
+ " selectiondefault" : "";
+
+ $input .= '<div class="other' . $class . '">' . "\n";
+ $input .= '<label for="config___' . $key . '_other">' .
+ $plugin->getLang($key . '_other') .
+ "</label>\n";
+ $input .= '<input id="config___' . $key . '_other" name="config[' . $key .
+ '][other]" type="text" class="edit" value="' . htmlspecialchars($other) .
+ '" ' . $disable . " />\n";
+ $input .= "</div>\n";
+ }
+ }
+ $label = '<label>' . $this->prompt($plugin) . '</label>';
+ return array($label, $input);
+ }
+
+ /**
+ * convert comma separated list to an array and combine any complimentary values
+ *
+ * @param string $str
+ * @return array
+ */
+ protected function str2array($str) {
+ $array = explode(',', $str);
+
+ if(!empty($this->combine)) {
+ foreach($this->combine as $key => $combinators) {
+ $idx = array();
+ foreach($combinators as $val) {
+ if(($idx[] = array_search($val, $array)) === false) break;
+ }
+
+ if(count($idx) && $idx[count($idx) - 1] !== false) {
+ foreach($idx as $i) unset($array[$i]);
+ $array[] = $key;
+ }
+ }
+ }
+
+ return $array;
+ }
+
+ /**
+ * convert array of values + other back to a comma separated list, incl. splitting any combined values
+ *
+ * @param array $input
+ * @return string
+ */
+ protected function array2str($input) {
+
+ // handle other
+ $other = trim($input['other']);
+ $other = !empty($other) ? explode(',', str_replace(' ', '', $input['other'])) : array();
+ unset($input['other']);
+
+ $array = array_unique(array_merge($input, $other));
+
+ // deconstruct any combinations
+ if(!empty($this->combine)) {
+ foreach($this->combine as $key => $combinators) {
+
+ $idx = array_search($key, $array);
+ if($idx !== false) {
+ unset($array[$idx]);
+ $array = array_merge($array, $combinators);
+ }
+ }
+ }
+
+ return join(',', array_unique($array));
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingMultichoice.php b/lib/plugins/config/core/Setting/SettingMultichoice.php
new file mode 100644
index 000000000..3a50857e0
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingMultichoice.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_multichoice
+ */
+class SettingMultichoice extends SettingString {
+ protected $choices = array();
+ public $lang; //some custom language strings are stored in setting
+
+ /** @inheritdoc */
+ public function html(\admin_plugin_config $plugin, $echo = false) {
+ $disable = '';
+ $nochoice = '';
+
+ if($this->isProtected()) {
+ $value = $this->protected;
+ $disable = ' disabled="disabled"';
+ } else {
+ $value = is_null($this->local) ? $this->default : $this->local;
+ }
+
+ // ensure current value is included
+ if(!in_array($value, $this->choices)) {
+ $this->choices[] = $value;
+ }
+ // disable if no other choices
+ if(!$this->isProtected() && count($this->choices) <= 1) {
+ $disable = ' disabled="disabled"';
+ $nochoice = $plugin->getLang('nochoice');
+ }
+
+ $key = htmlspecialchars($this->key);
+
+ $label = '<label for="config___' . $key . '">' . $this->prompt($plugin) . '</label>';
+
+ $input = "<div class=\"input\">\n";
+ $input .= '<select class="edit" id="config___' . $key . '" name="config[' . $key . ']"' . $disable . '>' . "\n";
+ foreach($this->choices as $choice) {
+ $selected = ($value == $choice) ? ' selected="selected"' : '';
+ $option = $plugin->getLang($this->key . '_o_' . $choice);
+ if(!$option && isset($this->lang[$this->key . '_o_' . $choice])) {
+ $option = $this->lang[$this->key . '_o_' . $choice];
+ }
+ if(!$option) $option = $choice;
+
+ $choice = htmlspecialchars($choice);
+ $option = htmlspecialchars($option);
+ $input .= ' <option value="' . $choice . '"' . $selected . ' >' . $option . '</option>' . "\n";
+ }
+ $input .= "</select> $nochoice \n";
+ $input .= "</div>\n";
+
+ return array($label, $input);
+ }
+
+ /** @inheritdoc */
+ public function update($input) {
+ if(is_null($input)) return false;
+ if($this->isProtected()) return false;
+
+ $value = is_null($this->local) ? $this->default : $this->local;
+ if($value == $input) return false;
+
+ if(!in_array($input, $this->choices)) return false;
+
+ $this->local = $input;
+ return true;
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingNoClass.php b/lib/plugins/config/core/Setting/SettingNoClass.php
new file mode 100644
index 000000000..8efff216a
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingNoClass.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_no_class
+ * A do-nothing class used to detect settings with a missing setting class.
+ * Used internaly to hide undefined settings, and generate the undefined settings list.
+ */
+class SettingNoClass extends SettingUndefined {
+ protected $errorMessage = '_msg_setting_no_class';
+}
diff --git a/lib/plugins/config/core/Setting/SettingNoDefault.php b/lib/plugins/config/core/Setting/SettingNoDefault.php
new file mode 100644
index 000000000..07b8412dd
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingNoDefault.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_no_default
+ *
+ * A do-nothing class used to detect settings with no default value.
+ * Used internaly to hide undefined settings, and generate the undefined settings list.
+ */
+class SettingNoDefault extends SettingUndefined {
+ protected $errorMessage = '_msg_setting_no_default';
+}
diff --git a/lib/plugins/config/core/Setting/SettingNoKnownClass.php b/lib/plugins/config/core/Setting/SettingNoKnownClass.php
new file mode 100644
index 000000000..3c527e1ee
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingNoKnownClass.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * A do-nothing class used to detect settings with a missing setting class.
+ * Used internaly to hide undefined settings, and generate the undefined settings list.
+ */
+class SettingNoKnownClass extends SettingUndefined {
+ protected $errorMessage = '_msg_setting_no_known_class';
+}
diff --git a/lib/plugins/config/core/Setting/SettingNumeric.php b/lib/plugins/config/core/Setting/SettingNumeric.php
new file mode 100644
index 000000000..8a6b17956
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingNumeric.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_numeric
+ */
+class SettingNumeric extends SettingString {
+ // This allows for many PHP syntax errors...
+ // var $_pattern = '/^[-+\/*0-9 ]*$/';
+ // much more restrictive, but should eliminate syntax errors.
+ protected $pattern = '/^[-+]? *[0-9]+ *(?:[-+*] *[0-9]+ *)*$/';
+ protected $min = null;
+ protected $max = null;
+
+ /** @inheritdoc */
+ public function update($input) {
+ $local = $this->local;
+ $valid = parent::update($input);
+ if($valid && !(is_null($this->min) && is_null($this->max))) {
+ $numeric_local = (int) eval('return ' . $this->local . ';');
+ if((!is_null($this->min) && $numeric_local < $this->min) ||
+ (!is_null($this->max) && $numeric_local > $this->max)) {
+ $this->error = true;
+ $this->input = $input;
+ $this->local = $local;
+ $valid = false;
+ }
+ }
+ return $valid;
+ }
+
+ /** @inheritdoc */
+ public function out($var, $fmt = 'php') {
+ if($fmt != 'php') return '';
+
+ $local = $this->local === '' ? "''" : $this->local;
+ $out = '$' . $var . "['" . $this->getArrayKey() . "'] = " . $local . ";\n";
+
+ return $out;
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingNumericopt.php b/lib/plugins/config/core/Setting/SettingNumericopt.php
new file mode 100644
index 000000000..a486e187f
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingNumericopt.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_numericopt
+ */
+class SettingNumericopt extends SettingNumeric {
+ // just allow an empty config
+ protected $pattern = '/^(|[-]?[0-9]+(?:[-+*][0-9]+)*)$/';
+
+ /**
+ * @inheritdoc
+ * Empty string is valid for numericopt
+ */
+ public function update($input) {
+ if($input === '') {
+ if($input == $this->local) return false;
+ $this->local = $input;
+ return true;
+ }
+
+ return parent::update($input);
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingOnoff.php b/lib/plugins/config/core/Setting/SettingOnoff.php
new file mode 100644
index 000000000..780778b48
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingOnoff.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_onoff
+ */
+class SettingOnoff extends SettingNumeric {
+
+ /**
+ * We treat the strings 'false' and 'off' as false
+ * @inheritdoc
+ */
+ protected function cleanValue($value) {
+ if($value === null) return null;
+
+ if(is_string($value)) {
+ if(strtolower($value) === 'false') return 0;
+ if(strtolower($value) === 'off') return 0;
+ if(trim($value) === '') return 0;
+ }
+
+ return (int) (bool) $value;
+ }
+
+ /** @inheritdoc */
+ public function html(\admin_plugin_config $plugin, $echo = false) {
+ $disable = '';
+
+ if($this->isProtected()) {
+ $value = $this->protected;
+ $disable = ' disabled="disabled"';
+ } else {
+ $value = is_null($this->local) ? $this->default : $this->local;
+ }
+
+ $key = htmlspecialchars($this->key);
+ $checked = ($value) ? ' checked="checked"' : '';
+
+ $label = '<label for="config___' . $key . '">' . $this->prompt($plugin) . '</label>';
+ $input = '<div class="input"><input id="config___' . $key . '" name="config[' . $key .
+ ']" type="checkbox" class="checkbox" value="1"' . $checked . $disable . '/></div>';
+ return array($label, $input);
+ }
+
+ /** @inheritdoc */
+ public function update($input) {
+ if($this->isProtected()) return false;
+
+ $input = ($input) ? 1 : 0;
+ $value = is_null($this->local) ? $this->default : $this->local;
+ if($value == $input) return false;
+
+ $this->local = $input;
+ return true;
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingPassword.php b/lib/plugins/config/core/Setting/SettingPassword.php
new file mode 100644
index 000000000..9d9c53377
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingPassword.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_password
+ */
+class SettingPassword extends SettingString {
+
+ protected $code = 'plain'; // mechanism to be used to obscure passwords
+
+ /** @inheritdoc */
+ public function update($input) {
+ if($this->isProtected()) return false;
+ if(!$input) return false;
+
+ if($this->pattern && !preg_match($this->pattern, $input)) {
+ $this->error = true;
+ $this->input = $input;
+ return false;
+ }
+
+ $this->local = conf_encodeString($input, $this->code);
+ return true;
+ }
+
+ /** @inheritdoc */
+ public function html(\admin_plugin_config $plugin, $echo = false) {
+
+ $disable = $this->isProtected() ? 'disabled="disabled"' : '';
+
+ $key = htmlspecialchars($this->key);
+
+ $label = '<label for="config___' . $key . '">' . $this->prompt($plugin) . '</label>';
+ $input = '<input id="config___' . $key . '" name="config[' . $key .
+ ']" autocomplete="off" type="password" class="edit" value="" ' . $disable . ' />';
+ return array($label, $input);
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingRegex.php b/lib/plugins/config/core/Setting/SettingRegex.php
new file mode 100644
index 000000000..b38f0a560
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingRegex.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_regex
+ */
+class SettingRegex extends SettingString {
+
+ protected $delimiter = '/'; // regex delimiter to be used in testing input
+ protected $pregflags = 'ui'; // regex pattern modifiers to be used in testing input
+
+ /** @inheritdoc */
+ public function update($input) {
+
+ // let parent do basic checks, value, not changed, etc.
+ $local = $this->local;
+ if(!parent::update($input)) return false;
+ $this->local = $local;
+
+ // see if the regex compiles and runs (we don't check for effectiveness)
+ $regex = $this->delimiter . $input . $this->delimiter . $this->pregflags;
+ $lastError = error_get_last();
+ @preg_match($regex, 'testdata');
+ if(preg_last_error() != PREG_NO_ERROR || error_get_last() != $lastError) {
+ $this->input = $input;
+ $this->error = true;
+ return false;
+ }
+
+ $this->local = $input;
+ return true;
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingRenderer.php b/lib/plugins/config/core/Setting/SettingRenderer.php
new file mode 100644
index 000000000..37ba9c70a
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingRenderer.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * additional setting classes specific to these settings
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ */
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_renderer
+ */
+class SettingRenderer extends SettingMultichoice {
+ protected $prompts = array();
+ protected $format = null;
+
+ /** @inheritdoc */
+ public function initialize($default = null, $local = null, $protected = null) {
+ $format = $this->format;
+
+ foreach(plugin_list('renderer') as $plugin) {
+ $renderer = plugin_load('renderer', $plugin);
+ if(method_exists($renderer, 'canRender') && $renderer->canRender($format)) {
+ $this->choices[] = $plugin;
+
+ $info = $renderer->getInfo();
+ $this->prompts[$plugin] = $info['name'];
+ }
+ }
+
+ parent::initialize($default, $local, $protected);
+ }
+
+ /** @inheritdoc */
+ public function html(\admin_plugin_config $plugin, $echo = false) {
+
+ // make some language adjustments (there must be a better way)
+ // transfer some plugin names to the config plugin
+ foreach($this->choices as $choice) {
+ if(!$plugin->getLang($this->key . '_o_' . $choice)) {
+ if(!isset($this->prompts[$choice])) {
+ $plugin->addLang(
+ $this->key . '_o_' . $choice,
+ sprintf($plugin->getLang('renderer__core'), $choice)
+ );
+ } else {
+ $plugin->addLang(
+ $this->key . '_o_' . $choice,
+ sprintf($plugin->getLang('renderer__plugin'), $this->prompts[$choice])
+ );
+ }
+ }
+ }
+ return parent::html($plugin, $echo);
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingSavedir.php b/lib/plugins/config/core/Setting/SettingSavedir.php
new file mode 100644
index 000000000..43e428dd3
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingSavedir.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_savedir
+ */
+class SettingSavedir extends SettingString {
+
+ /** @inheritdoc */
+ public function update($input) {
+ if($this->isProtected()) return false;
+
+ $value = is_null($this->local) ? $this->default : $this->local;
+ if($value == $input) return false;
+
+ if(!init_path($input)) {
+ $this->error = true;
+ $this->input = $input;
+ return false;
+ }
+
+ $this->local = $input;
+ return true;
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingSepchar.php b/lib/plugins/config/core/Setting/SettingSepchar.php
new file mode 100644
index 000000000..57cd0ae92
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingSepchar.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_sepchar
+ */
+class SettingSepchar extends SettingMultichoice {
+
+ /** @inheritdoc */
+ public function __construct($key, $param = null) {
+ $str = '_-.';
+ for($i = 0; $i < strlen($str); $i++) $this->choices[] = $str[$i];
+
+ // call foundation class constructor
+ parent::__construct($key, $param);
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingString.php b/lib/plugins/config/core/Setting/SettingString.php
new file mode 100644
index 000000000..b819407b7
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingString.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+/**
+ * Class setting_string
+ */
+class SettingString extends Setting {
+ /** @inheritdoc */
+ public function html(\admin_plugin_config $plugin, $echo = false) {
+ $disable = '';
+
+ if($this->isProtected()) {
+ $value = $this->protected;
+ $disable = 'disabled="disabled"';
+ } else {
+ if($echo && $this->error) {
+ $value = $this->input;
+ } else {
+ $value = is_null($this->local) ? $this->default : $this->local;
+ }
+ }
+
+ $key = htmlspecialchars($this->key);
+ $value = htmlspecialchars($value);
+
+ $label = '<label for="config___' . $key . '">' . $this->prompt($plugin) . '</label>';
+ $input = '<input id="config___' . $key . '" name="config[' . $key .
+ ']" type="text" class="edit" value="' . $value . '" ' . $disable . '/>';
+ return array($label, $input);
+ }
+}
diff --git a/lib/plugins/config/core/Setting/SettingUndefined.php b/lib/plugins/config/core/Setting/SettingUndefined.php
new file mode 100644
index 000000000..fa46a9f1d
--- /dev/null
+++ b/lib/plugins/config/core/Setting/SettingUndefined.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace dokuwiki\plugin\config\core\Setting;
+
+use dokuwiki\plugin\config\core\Configuration;
+
+/**
+ * A do-nothing class used to detect settings with no metadata entry.
+ * Used internaly to hide undefined settings, and generate the undefined settings list.
+ */
+class SettingUndefined extends SettingHidden {
+
+ protected $errorMessage = '_msg_setting_undefined';
+
+ /** @inheritdoc */
+ public function shouldHaveDefault() {
+ return false;
+ }
+
+ /** @inheritdoc */
+ public function html(\admin_plugin_config $plugin, $echo = false) {
+ // determine the name the meta key would be called
+ if(preg_match(
+ '/^(?:plugin|tpl)' . Configuration::KEYMARKER . '.*?' . Configuration::KEYMARKER . '(.*)$/',
+ $this->getKey(),
+ $undefined_setting_match
+ )) {
+ $undefined_setting_key = $undefined_setting_match[1];
+ } else {
+ $undefined_setting_key = $this->getKey();
+ }
+
+ $label = '<span title="$meta[\'' . $undefined_setting_key . '\']">$' .
+ 'conf' . '[\'' . $this->getArrayKey() . '\']</span>';
+ $input = $plugin->getLang($this->errorMessage);
+
+ return array($label, $input);
+ }
+
+}
diff --git a/lib/plugins/config/core/Writer.php b/lib/plugins/config/core/Writer.php
new file mode 100644
index 000000000..56de621d9
--- /dev/null
+++ b/lib/plugins/config/core/Writer.php
@@ -0,0 +1,116 @@
+<?php
+
+namespace dokuwiki\plugin\config\core;
+use dokuwiki\plugin\config\core\Setting\Setting;
+
+/**
+ * Writes the settings to the correct local file
+ */
+class Writer {
+ /** @var string header info */
+ protected $header = 'Dokuwiki\'s Main Configuration File - Local Settings';
+
+ /** @var string the file where the config will be saved to */
+ protected $savefile;
+
+ /**
+ * Writer constructor.
+ */
+ public function __construct() {
+ global $config_cascade;
+ $this->savefile = end($config_cascade['main']['local']);
+ }
+
+ /**
+ * Save the given settings
+ *
+ * @param Setting[] $settings
+ * @throws \Exception
+ */
+ public function save($settings) {
+ global $conf;
+ if($this->isLocked()) throw new \Exception('no save');
+
+ // backup current file (remove any existing backup)
+ if(file_exists($this->savefile)) {
+ if(file_exists($this->savefile . '.bak.php')) @unlink($this->savefile . '.bak.php');
+ if(!io_rename($this->savefile, $this->savefile . '.bak.php')) throw new \Exception('no backup');
+ }
+
+ if(!$fh = @fopen($this->savefile, 'wb')) {
+ io_rename($this->savefile . '.bak.php', $this->savefile); // problem opening, restore the backup
+ throw new \Exception('no save');
+ }
+
+ $out = $this->getHeader();
+ foreach($settings as $setting) {
+ if($setting->shouldBeSaved()) {
+ $out .= $setting->out('conf', 'php');
+ }
+ }
+
+ fwrite($fh, $out);
+ fclose($fh);
+ if($conf['fperm']) chmod($this->savefile, $conf['fperm']);
+ $this->opcacheUpdate($this->savefile);
+ }
+
+ /**
+ * Update last modified time stamp of the config file
+ *
+ * Will invalidate all DokuWiki caches
+ *
+ * @throws \Exception when the config isn't writable
+ */
+ public function touch() {
+ if($this->isLocked()) throw new \Exception('no save');
+ @touch($this->savefile);
+ $this->opcacheUpdate($this->savefile);
+ }
+
+ /**
+ * Invalidate the opcache of the given file
+ *
+ * @todo this should probably be moved to core
+ * @param string $file
+ */
+ protected function opcacheUpdate($file) {
+ if(!function_exists('opcache_invalidate')) return;
+ opcache_invalidate($file);
+ }
+
+ /**
+ * Configuration is considered locked if there is no local settings filename
+ * or the directory its in is not writable or the file exists and is not writable
+ *
+ * @return bool true: locked, false: writable
+ */
+ public function isLocked() {
+ if(!$this->savefile) return true;
+ if(!is_writable(dirname($this->savefile))) return true;
+ if(file_exists($this->savefile) && !is_writable($this->savefile)) return true;
+ return false;
+ }
+
+ /**
+ * Returns the PHP intro header for the config file
+ *
+ * @return string
+ */
+ protected function getHeader() {
+ return join(
+ "\n",
+ array(
+ '<?php',
+ '/*',
+ ' * ' . $this->header,
+ ' * Auto-generated by config plugin',
+ ' * Run for user: ' . $_SERVER['REMOTE_USER'],
+ ' * Date: ' . date('r'),
+ ' */',
+ '',
+ ''
+ )
+ );
+ }
+}
diff --git a/lib/plugins/config/lang/ar/lang.php b/lib/plugins/config/lang/ar/lang.php
index 69e843ffd..bc83ddaf9 100644
--- a/lib/plugins/config/lang/ar/lang.php
+++ b/lib/plugins/config/lang/ar/lang.php
@@ -1,10 +1,13 @@
<?php
+
/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
* Arabic language file
*
+ * @author Khalid <khalid.aljahil@gmail.com>
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
- * @author uahello@gmail.com
*/
$lang['menu'] = 'الإعدادات';
$lang['error'] = 'لم تحدث الاعدادات بسبب قيمة غير صالحة، رجاء راجع تغييراتك ثم ارسلها.
@@ -142,12 +145,6 @@ $lang['proxy____user'] = 'اسم مستخدم الوكيل';
$lang['proxy____pass'] = 'كلمة سر الوكيل';
$lang['proxy____ssl'] = 'استخدم ssl للاتصال بالوكيل';
$lang['proxy____except'] = 'تعبير شرطي لمقابلة العناوين التي ستتجاوز البروكسي.';
-$lang['safemodehack'] = 'مكّن hack الوضع الآمن';
-$lang['ftp____host'] = 'خادوم FTP ل hack الوضع الآمن';
-$lang['ftp____port'] = 'منفذ FTP ل hack الوضع الآمن';
-$lang['ftp____user'] = 'اسم مستخدم FTP ل hack الوضع الآمن';
-$lang['ftp____pass'] = 'كلمة سر FTP ل hack الوضع الآمن';
-$lang['ftp____root'] = 'دليل الجذر ل FTP لأجل hack الوضع الآمن';
$lang['license_o_'] = 'غير مختار';
$lang['typography_o_0'] = 'لاشيء';
$lang['typography_o_1'] = 'استبعاد الاقتباس المفرد';
diff --git a/lib/plugins/config/lang/bg/lang.php b/lib/plugins/config/lang/bg/lang.php
index 75508a525..04aa5b0a3 100644
--- a/lib/plugins/config/lang/bg/lang.php
+++ b/lib/plugins/config/lang/bg/lang.php
@@ -2,7 +2,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
+ * @author Salif Mehmed <salif13mehmed@gmail.com>
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
* @author Kiril <neohidra@gmail.com>
@@ -145,12 +146,6 @@ $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'] = 'с изключение на единични кавички';
diff --git a/lib/plugins/config/lang/ca-valencia/lang.php b/lib/plugins/config/lang/ca-valencia/lang.php
index db86dc916..944b891ee 100644
--- a/lib/plugins/config/lang/ca-valencia/lang.php
+++ b/lib/plugins/config/lang/ca-valencia/lang.php
@@ -128,12 +128,6 @@ $lang['proxy____port'] = 'Port del proxy';
$lang['proxy____user'] = 'Nom d\'usuari del proxy';
$lang['proxy____pass'] = 'Contrasenya del proxy';
$lang['proxy____ssl'] = 'Utilisar SSL per a conectar al proxy';
-$lang['safemodehack'] = 'Activar \'hack\' de modo segur';
-$lang['ftp____host'] = 'Servidor FTP per al \'hack\' de modo segur';
-$lang['ftp____port'] = 'Port FTP per al \'hack\' de modo segur';
-$lang['ftp____user'] = 'Nom de l\'usuari per al \'hack\' de modo segur';
-$lang['ftp____pass'] = 'Contrasenya FTP per al \'hack\' de modo segur';
-$lang['ftp____root'] = 'Directori base FTP per al \'hack\' de modo segur';
$lang['license_o_'] = 'Cap triada';
$lang['typography_o_0'] = 'cap';
$lang['typography_o_1'] = 'Excloure cometes simples';
diff --git a/lib/plugins/config/lang/ca/lang.php b/lib/plugins/config/lang/ca/lang.php
index 7ef19e74c..7dc528026 100644
--- a/lib/plugins/config/lang/ca/lang.php
+++ b/lib/plugins/config/lang/ca/lang.php
@@ -3,11 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Adolfo Jayme Barrientos <fito@libreoffice.org>
* @author Carles Bellver <carles.bellver@gmail.com>
- * @author carles.bellver@gmail.com
- * @author carles.bellver@cent.uji.es
- * @author Carles Bellver <carles.bellver@cent.uji.es>
- * @author daniel@6temes.cat
+ * @author carles.bellver <carles.bellver@cent.uji.es>
+ * @author daniel <daniel@6temes.cat>
* @author controlonline.net <controlonline.net@gmail.com>
* @author Pauet <pauet@gmx.com>
* @author Àngel Pérez Beroy <aperezberoy@gmail.com>
@@ -86,6 +85,7 @@ $lang['disableactions'] = 'Inhabilita accions DokuWiki';
$lang['disableactions_check'] = 'Revisa';
$lang['disableactions_subscription'] = 'Subscripció/cancel·lació';
$lang['disableactions_wikicode'] = 'Mostra/exporta font';
+$lang['disableactions_profile_delete'] = 'Suprimeix el propi compte';
$lang['disableactions_other'] = 'Altres accions (separades per comes)';
$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.';
@@ -119,6 +119,7 @@ $lang['rss_linkto'] = 'Destinació dels enllaços en el canal XML';
$lang['rss_content'] = 'Què es mostrarà en els elements del canal XML?';
$lang['rss_update'] = 'Interval d\'actualització del canal XML (segons)';
$lang['rss_show_summary'] = 'Mostra resum en els títols del canal XML';
+$lang['rss_media_o_pages'] = 'pàgines';
$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';
@@ -134,17 +135,15 @@ $lang['xsendfile'] = 'Utilitza la capçalera X-Sendfile perquè el s
$lang['renderer_xhtml'] = 'Renderitzador que cal utilitzar per a la sortida principal (xhtml) del wiki';
$lang['renderer__core'] = '%s (ànima del dokuwiki)';
$lang['renderer__plugin'] = '%s (connector)';
+$lang['search_fragment_o_exact'] = 'exacte';
+$lang['search_fragment_o_starts_with'] = 'comença per';
+$lang['search_fragment_o_ends_with'] = 'termina per';
+$lang['search_fragment_o_contains'] = 'conté';
$lang['proxy____host'] = 'Nom del servidor intermediari';
$lang['proxy____port'] = 'Port del servidor intermediari';
$lang['proxy____user'] = 'Nom d\'usuari del servidor intermediari';
$lang['proxy____pass'] = 'Contrasenya del servidor intermediari';
$lang['proxy____ssl'] = 'Utilitza SSL per connectar amb el servidor intermediari';
-$lang['safemodehack'] = 'Utilitza el hack per a safemode';
-$lang['ftp____host'] = 'Servidor FTP per al hack de safemode';
-$lang['ftp____port'] = 'Port FTP per al hack de safemode';
-$lang['ftp____user'] = 'Nom d\'usuari FTP per al hack de safemode';
-$lang['ftp____pass'] = 'Contrasenya FTP per al hack de safemode';
-$lang['ftp____root'] = 'Directori arrel FTP per al hack de safemode';
$lang['license_o_'] = 'Cap selecció';
$lang['typography_o_0'] = 'cap';
$lang['typography_o_1'] = 'només cometes dobles';
diff --git a/lib/plugins/config/lang/cs/lang.php b/lib/plugins/config/lang/cs/lang.php
index 80a9d29a0..a72ab7b2c 100644
--- a/lib/plugins/config/lang/cs/lang.php
+++ b/lib/plugins/config/lang/cs/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Petr Kajzar <petr.kajzar@lf1.cuni.cz>
+ * @author Robert Surý <rsurycz@seznam.cz>
+ * @author Martin Hořínek <hev@hev.cz>
* @author Jonáš Dyba <jonas.dyba@gmail.com>
* @author Bohumir Zamecnik <bohumir@zamecnik.org>
* @author Zbynek Krivka <zbynek.krivka@seznam.cz>
@@ -48,6 +52,7 @@ $lang['_advanced'] = 'Pokročilá nastavení';
$lang['_network'] = 'Nastavení sítě';
$lang['_msg_setting_undefined'] = 'Chybí metadata položky.';
$lang['_msg_setting_no_class'] = 'Chybí třída položky.';
+$lang['_msg_setting_no_known_class'] = 'Konfigurační třída není dostupná.';
$lang['_msg_setting_no_default'] = 'Chybí výchozí hodnota položky.';
$lang['title'] = 'Název celé wiki';
$lang['start'] = 'Název úvodní stránky';
@@ -99,7 +104,7 @@ $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_profile_delete'] = 'Smazat vlasní účet';
+$lang['disableactions_profile_delete'] = 'Smazat vlastní účet';
$lang['disableactions_other'] = 'Další akce (oddělené čárkou)';
$lang['disableactions_rss'] = 'XMS syndikace (RSS)';
$lang['auth_security_timeout'] = 'Časový limit pro autentikaci (v sekundách)';
@@ -132,6 +137,7 @@ $lang['subscribe_time'] = 'Časový interval v sekundách, ve kterém jso
$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['mailreturnpath'] = 'E-mailová adresa příjemce pro oznámení o nedoručení';
$lang['mailprefix'] = 'Předpona předmětu e-mailu, která se bude používat pro automatické maily';
$lang['htmlmail'] = 'Posílat emaily v HTML (hezčí ale větší). Při vypnutí budou posílány jen textové emaily.';
$lang['sitemap'] = 'Generovat Google sitemap (interval ve dnech)';
@@ -141,6 +147,7 @@ $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['rss_media'] = 'Jaký typ změn má být uveden v kanálu XML';
+$lang['rss_media_o_both'] = 'oba';
$lang['rss_media_o_pages'] = 'stránky';
$lang['rss_media_o_media'] = 'média';
$lang['updatecheck'] = 'Kontrolovat aktualizace a bezpečnostní varování? DokuWiki potřebuje pro tuto funkci přístup k update.dokuwiki.org';
@@ -160,9 +167,13 @@ $lang['xsendfile'] = 'Používat X-Sendfile hlavničky pro download
$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['search_nslimit'] = 'Omezit vyhledávání na současných X jmenných prostorů. Když je vyhledávání provedeno ze stránky zanořeného jmenného prostoru, bude jako filtr přidáno prvních X jmenných prostorů.';
+$lang['search_fragment'] = 'Určete výchozí chování vyhledávání fragmentů';
+$lang['search_fragment_o_exact'] = 'přesný';
$lang['search_fragment_o_starts_with'] = 'začíná s';
$lang['search_fragment_o_ends_with'] = 'končí s';
$lang['search_fragment_o_contains'] = 'obsahuje';
+$lang['trustedproxy'] = 'Důvěřovat proxy serverům odpovídajícím tomuto regulárním výrazu ohledně skutečné IP adresy klienta, kterou hlásí. Výchozí hodnota odpovídá místním sítím. Ponechejte prázdné, pokud nechcete důvěřovat žádné proxy.';
$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['jquerycdn'] = 'Mají být skripty jQuery a jQuery UI načítány z CDN?
Vzniknou tím další HTTP dotazy, ale soubory se mohou načíst rychleji a uživatelé je už mohou mít ve vyrovnávací paměti.';
@@ -175,12 +186,6 @@ $lang['proxy____user'] = 'Proxy uživatelské jméno';
$lang['proxy____pass'] = 'Proxy heslo';
$lang['proxy____ssl'] = 'Použít SSL při připojení k proxy';
$lang['proxy____except'] = 'Regulární výrazy pro URL, pro které bude přeskočena proxy.';
-$lang['safemodehack'] = 'Zapnout safemode hack';
-$lang['ftp____host'] = 'FTP server pro safemode hack';
-$lang['ftp____port'] = 'FTP port pro safemode hack';
-$lang['ftp____user'] = 'FTP uživatelské jméno pro safemode hack';
-$lang['ftp____pass'] = 'FTP heslo pro safemode hack';
-$lang['ftp____root'] = 'FTP kořenový adresář pro safemode hack';
$lang['license_o_'] = 'Nic nevybráno';
$lang['typography_o_0'] = 'vypnuto';
$lang['typography_o_1'] = 'Pouze uvozovky';
diff --git a/lib/plugins/config/lang/cy/lang.php b/lib/plugins/config/lang/cy/lang.php
index 4fa8ab853..781419429 100644
--- a/lib/plugins/config/lang/cy/lang.php
+++ b/lib/plugins/config/lang/cy/lang.php
@@ -185,14 +185,6 @@ $lang['proxy____pass'] = 'Cyfrinair procsi';
$lang['proxy____ssl'] = 'Defnyddio SSL i gysylltu â\'r procsi';
$lang['proxy____except'] = 'Mynegiad rheolaidd i gydweddu URL ar gyfer y procsi a ddylai cael eu hanwybyddu.';
-/* Safemode Hack */
-$lang['safemodehack'] = 'Galluogi safemode hack';
-$lang['ftp____host'] = 'Gweinydd FTP safemode hack';
-$lang['ftp____port'] = 'Porth FTP safemode hack';
-$lang['ftp____user'] = 'Defnyddair FTP safemode hack';
-$lang['ftp____pass'] = 'Cyfrinair FTP safemode hack';
-$lang['ftp____root'] = 'Gwraiddffolder FTP safemode hack';
-
/* License Options */
$lang['license_o_'] = 'Dim wedi\'i ddewis';
diff --git a/lib/plugins/config/lang/da/lang.php b/lib/plugins/config/lang/da/lang.php
index 7546264e9..ff601811d 100644
--- a/lib/plugins/config/lang/da/lang.php
+++ b/lib/plugins/config/lang/da/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jacob Palm <jacobpalmdk@icloud.com>
* @author Kenneth Schack Banner <kescba@gmail.com>
* @author Jon Theil Nielsen <jontheil@gmail.com>
* @author Lars Næsbye Christensen <larsnaesbye@stud.ku.dk>
@@ -13,7 +14,6 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus <rasmus@kinnerup.com>
* @author Mikael Lyngvig <mikael@lyngvig.org>
- * @author Jacob Palm <mail@jacobpalm.dk>
*/
$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.
@@ -28,146 +28,164 @@ $lang['security'] = 'Sikkerhedsadvarsel: Ændring af denne mulighed
$lang['_configuration_manager'] = 'Opsætningsstyring';
$lang['_header_dokuwiki'] = 'DokuWiki indstillinger';
$lang['_header_plugin'] = 'Udvidelsesindstillinger';
-$lang['_header_template'] = 'Skabelonindstillinger';
-$lang['_header_undefined'] = 'Ikke satte indstillinger';
+$lang['_header_template'] = 'Tema';
+$lang['_header_undefined'] = 'Udefinerede indstillinger';
$lang['_basic'] = 'Grundindstillinger';
-$lang['_display'] = 'Synlighedsindstillinger';
+$lang['_display'] = 'Visningsindstillinger';
$lang['_authentication'] = 'Bekræftelsesindstillinger';
$lang['_anti_spam'] = 'Trafikkontrolsindstillinger';
$lang['_editing'] = 'Redigeringsindstillinger';
$lang['_links'] = 'Henvisningsindstillinger';
$lang['_media'] = 'Medieindstillinger';
$lang['_notifications'] = 'Notificeringsindstillinger';
+$lang['_syndication'] = 'Syndikering (RSS)';
$lang['_advanced'] = 'Avancerede indstillinger';
$lang['_network'] = 'Netværksindstillinger';
$lang['_msg_setting_undefined'] = 'Ingen indstillingsmetadata.';
$lang['_msg_setting_no_class'] = 'Ingen indstillingsklasse.';
+$lang['_msg_setting_no_known_class'] = 'Indstillingsklasse ikke tilgængelig.';
$lang['_msg_setting_no_default'] = 'Ingen standardværdi.';
-$lang['title'] = 'Wiki titel';
-$lang['start'] = 'Startsidens navn';
+$lang['title'] = 'Wiki titel (navnet på din wiki)';
+$lang['start'] = 'Startsidens navn (benyttes som startside i alle navnerum)';
$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['template'] = 'Tema';
+$lang['tagline'] = 'Tagline (hvis tema understøtter det)';
+$lang['sidebar'] = 'Sidepanelet sidenavn (hvis temaet understøtter det). Lad være blankt for at deaktivere sidepanelet.';
$lang['license'] = 'Under hvilken licens skal dit indhold frigives?';
$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['baseurl'] = 'Serverens URL-adresse (f.eks. <code>http://www.minserver.dk<code>). Lad være blank for at detektere automatisk.';
+$lang['cookiedir'] = 'Cookie sti. Hvis tom benyttes grundlæggende URL.';
+$lang['dmode'] = 'Mappe oprettelsestilstand';
+$lang['fmode'] = 'Fil oprettelsestilstand';
+$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['breadcrumbs'] = 'Stilængde. Sæt til 0 for at deaktivere.';
+$lang['youarehere'] = 'Brug hierarkisk sti (hvis slået til, bør du formentlig slå ovenstående fra)';
+$lang['fullpath'] = 'Vis den fulde sti til siderne i sidefoden';
$lang['typography'] = 'Typografiske erstatninger';
$lang['dformat'] = 'Datoformat (se PHP\'s <a href="http://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['tocminheads'] = 'Mindste antal overskrifter for at danne en indholdsfortegnelse';
$lang['maxtoclevel'] = 'Højeste niveau for indholdsfortegnelse';
$lang['maxseclevel'] = 'Højeste niveau for redigering af sektioner';
-$lang['camelcase'] = 'Brug KamelKasse til henvisninger';
+$lang['camelcase'] = 'Brug CamelCase til henvisninger';
$lang['deaccent'] = 'Pæne sidenavne';
$lang['useheading'] = 'Brug første overskrift til sidenavne';
$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['useacl'] = 'Benyt adgangskontrollister (ACL)';
$lang['autopasswd'] = 'Generer adgangskoder automatisk';
$lang['authtype'] = 'Bekræftelsesgrundlag';
$lang['passcrypt'] = 'Krypteringsmetode for adgangskoder';
$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['profileconfirm'] = 'Bekræft profilændringer med adgangskode';
$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_profile_delete'] = 'Slet egen brugerkonto';
$lang['disableactions_other'] = 'Andre muligheder (kommasepareret)';
+$lang['disableactions_rss'] = 'XML syndikering (RSS)';
$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['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['remote'] = 'Aktivér fjern-API\'et. 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'] = 'Bloker uønsket sprogbrug med en ordliste';
+$lang['relnofollow'] = 'Brug rel="nofollow" til udgående henvisninger';
$lang['indexdelay'] = 'Tidsforsinkelse før katalogisering (sek.)';
-$lang['mailguard'] = 'Slør elektroniske adresser';
+$lang['mailguard'] = 'Slør e-mail 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['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['mediarevisions'] = 'Aktiver revisioner af medier?';
$lang['refcheck'] = 'Mediehenvisningerkontrol';
-$lang['gdlib'] = 'Udgave af GD Lib';
+$lang['gdlib'] = 'Version 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['fetchsize'] = 'Største antal (bytes) fetch.php må hente udefra, til eksempelvis cache og størrelsesændring af eksterne billeder';
$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['mailfrom'] = 'E-mail adresse til brug for automatiske meddelelser';
+$lang['mailreturnpath'] = 'E-mail adresse til notifikation når en mail ikke kan leveres';
+$lang['mailprefix'] = 'Præfiks på e-mail emne til automatiske mails. Efterlad blank for at bruge wikien titel.';
+$lang['htmlmail'] = 'Send pænere, men større, HTML multipart mails. Deaktiver for at sende mails i klar tekst.';
+$lang['sitemap'] = 'Interval for dannelse af Google sitemap (i dage). Sæt til 0 for at deaktivere.';
+$lang['rss_type'] = 'Type af XML-feed';
+$lang['rss_linkto'] = 'XML-feed henviser til';
+$lang['rss_content'] = 'Hvad skal der vises i XML-feed?';
+$lang['rss_update'] = 'XML-feed opdateringsinterval (sek)';
+$lang['rss_show_summary'] = 'XML-feed vis referat i overskriften';
+$lang['rss_show_deleted'] = 'XML feed Vis slettede feeds';
+$lang['rss_media'] = 'Hvilke ændringer skal vises i XML feed?';
+$lang['rss_media_o_both'] = 'begge';
+$lang['rss_media_o_pages'] = 'sider';
+$lang['rss_media_o_media'] = 'media';
$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['sepchar'] = 'Orddelingstegn til sidenavne';
$lang['canonical'] = 'Benyt fuldt kanoniske netadresser';
-$lang['fnencode'] = 'Metode for indkodning af ikke ASCII filnavne';
+$lang['fnencode'] = 'Metode til kodning af ikke-ASCII filnavne';
$lang['autoplural'] = 'Tjek for flertalsendelser i henvisninger';
$lang['compression'] = 'Pakningsmetode for attic-filer';
-$lang['gzip_output'] = 'Benyt gzip-Content-Encoding (indholdskryptering) til XHTML';
+$lang['gzip_output'] = 'Benyt gzip-Content-Encoding (indholdskodning) til XHTML';
$lang['compress'] = 'Komprimer CSS- og JavaScript-filer';
+$lang['cssdatauri'] = 'Maksimal størrelse i bytes hvor billeder refereret fra CSS filer integreres direkte i CSS, for at reducere HTTP headerens størrelse. <code>400</code> til <code>600</code> bytes anbefales. Sæt til <code>0</code> for at deaktivere.';
$lang['send404'] = 'Send "HTTP 404/Page Not Found" for ikke-eksisterende sider';
$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['proxy____host'] = 'Proxy-servernavn';
-$lang['proxy____port'] = 'Proxy-port';
-$lang['proxy____user'] = 'Proxy-brugernavn';
-$lang['proxy____pass'] = 'Proxy-kodeord';
+$lang['search_nslimit'] = 'Begræns søgningen til de aktuelle X navnerum. Når en søgning udføres fra en side i et underliggende navnerum, tilføjes de første X navnerum som filter';
+$lang['search_fragment'] = 'Angiv standardadfærd ved fragment søgning';
+$lang['search_fragment_o_exact'] = 'præcis';
+$lang['search_fragment_o_starts_with'] = 'starter med';
+$lang['search_fragment_o_ends_with'] = 'slutter med';
+$lang['search_fragment_o_contains'] = 'indeholder';
+$lang['trustedproxy'] = 'Hav tillid til viderestillede proxyer som rapporterer en oprindelig IP der matcher denne regular expression. Som standard matcher lokale netværk. Efterlad blank for ikke at have tillid til nogen proxyer.';
+$lang['_feature_flags'] = 'Funktionsflag';
+$lang['defer_js'] = 'Afvent med JavaScript ekserkvering, til sidens HTML er behandlet. Dette kan få sideindlæsning til at føles hurtigere, men kan potentielt forhindre et fåtal af udvidelser i at fungere korrekt.';
+$lang['dnslookups'] = 'DokuWiki laver DNS-opslag for at finde hostnames på de IP-adresser hvorfra brugere redigerer sider. Hvis du har en langsom eller ikke-fungerende DNS-server, eller ikke ønsker denne funktion, kan du slå den fra.';
+$lang['jquerycdn'] = 'Skal jQuery og jQuery UI kode hentes fra et CDN (content delivery network)? Dette resulterer i flere HTTP-forespørgsler, men filerne indlæses muligvis hurtigere, og brugere har dem muligvis allerede i cachen.';
+$lang['jquerycdn_o_0'] = 'Intet CDN, kode hentes fra denne server';
+$lang['jquerycdn_o_jquery'] = 'Benyt code.jquery.com';
+$lang['jquerycdn_o_cdnjs'] = 'Benyt cdnjs.com';
+$lang['proxy____host'] = 'Proxyserver';
+$lang['proxy____port'] = 'Proxy port';
+$lang['proxy____user'] = 'Proxy brugernavn';
+$lang['proxy____pass'] = 'Proxy adgangskode';
$lang['proxy____ssl'] = 'Brug SSL til at forbinde til proxy';
$lang['proxy____except'] = 'Regular expression til at matche URL\'er for hvilke proxier der skal ignores';
-$lang['safemodehack'] = 'Slå "safemode hack" til ';
-$lang['ftp____host'] = 'FTP-server til "safemode hack"';
-$lang['ftp____port'] = 'FTP-port til "safemode hack"';
-$lang['ftp____user'] = 'FTP-brugernavn til "safemode hack"';
-$lang['ftp____pass'] = 'FTP-adgangskode til "safemode hack"';
-$lang['ftp____root'] = 'FTP-rodmappe til "safemode hack"';
$lang['license_o_'] = 'Ingen valgt';
$lang['typography_o_0'] = 'ingen';
$lang['typography_o_1'] = 'Kun gåseøjne';
$lang['typography_o_2'] = 'Tillader enkelttegnscitering (vil måske ikke altid virke)';
$lang['userewrite_o_0'] = 'ingen';
$lang['userewrite_o_1'] = '.htaccess';
-$lang['userewrite_o_2'] = 'Dokuwiki indre';
+$lang['userewrite_o_2'] = 'Dokuwiki internt';
$lang['deaccent_o_0'] = 'fra';
$lang['deaccent_o_1'] = 'fjern accenttegn';
$lang['deaccent_o_2'] = 'romaniser';
$lang['gdlib_o_0'] = 'GD Lib ikke tilstede';
-$lang['gdlib_o_1'] = 'Udgave 1.x';
+$lang['gdlib_o_1'] = 'Version 1.x';
$lang['gdlib_o_2'] = 'automatisk sondering';
$lang['rss_type_o_rss'] = 'RSS 0.91';
$lang['rss_type_o_rss1'] = 'RSS 1.0';
@@ -179,20 +197,21 @@ $lang['rss_content_o_diff'] = '"Unified Diff" (Sammensat)';
$lang['rss_content_o_htmldiff'] = 'HTML-formateret diff-tabel';
$lang['rss_content_o_html'] = 'Fuldt HTML-sideindhold';
$lang['rss_linkto_o_diff'] = 'liste over forskelle';
-$lang['rss_linkto_o_page'] = 'den redigerede side';
-$lang['rss_linkto_o_rev'] = 'liste over ændringer';
+$lang['rss_linkto_o_page'] = 'den reviderede side';
+$lang['rss_linkto_o_rev'] = 'liste over revideringer';
$lang['rss_linkto_o_current'] = 'den nuværende side';
$lang['compression_o_0'] = 'ingen';
$lang['compression_o_gz'] = 'gzip';
$lang['compression_o_bz2'] = 'bz2';
$lang['xsendfile_o_0'] = 'brug ikke';
$lang['xsendfile_o_1'] = 'Proprietær lighttpd-hovedfil (før udgave 1.5)';
-$lang['xsendfile_o_2'] = 'Standard X-Sendfile-hovedfil';
-$lang['xsendfile_o_3'] = 'Proprietær Nginx X-Accel-Redirect hovedfil';
+$lang['xsendfile_o_2'] = 'Standard X-Sendfile header';
+$lang['xsendfile_o_3'] = 'Proprietær Nginx X-Accel-Redirect header';
$lang['showuseras_o_loginname'] = 'Brugernavn';
$lang['showuseras_o_username'] = 'Brugerens fulde navn';
-$lang['showuseras_o_email'] = 'Brugerens e-adresse (ændret i forhold til mailguard-indstillingerne)';
-$lang['showuseras_o_email_link'] = 'Brugers e-adresse som en mailto:-henvisning';
+$lang['showuseras_o_username_link'] = 'Brugerens fulde navn som interwiki bruger-link';
+$lang['showuseras_o_email'] = 'Brugerens e-mail adresse (sløret i henhold til mailguard-indstillingerne)';
+$lang['showuseras_o_email_link'] = 'Brugers e-mail adresse som en mailto:-henvisning';
$lang['useheading_o_0'] = 'Aldrig';
$lang['useheading_o_navigation'] = 'Kun navigering';
$lang['useheading_o_content'] = 'Kun wiki-indhold';
diff --git a/lib/plugins/config/lang/de-informal/lang.php b/lib/plugins/config/lang/de-informal/lang.php
index 6c31e8520..dec3641ec 100644
--- a/lib/plugins/config/lang/de-informal/lang.php
+++ b/lib/plugins/config/lang/de-informal/lang.php
@@ -157,12 +157,6 @@ $lang['proxy____user'] = 'Benutzername für den Proxy';
$lang['proxy____pass'] = 'Passwort von dem Proxybenutzer';
$lang['proxy____ssl'] = 'SSL verwenden um auf den Proxy zu zugreifen';
$lang['proxy____except'] = 'Regulärer Ausdruck um Adressen zu beschreiben, für die kein Proxy verwendet werden soll';
-$lang['safemodehack'] = 'Aktiviere safemode Hack';
-$lang['ftp____host'] = 'FTP Server für safemode Hack';
-$lang['ftp____port'] = 'FTP Port für safemode Hack';
-$lang['ftp____user'] = 'FTP Benutzername für safemode Hack';
-$lang['ftp____pass'] = 'FTP Passwort für safemode Hack';
-$lang['ftp____root'] = 'FTP Wurzelverzeichnis für Safemodehack';
$lang['license_o_'] = 'Nichts ausgewählt';
$lang['typography_o_0'] = 'nichts';
$lang['typography_o_1'] = 'ohne einfache Anführungszeichen';
diff --git a/lib/plugins/config/lang/de/lang.php b/lib/plugins/config/lang/de/lang.php
index 65c319b70..114c5790f 100644
--- a/lib/plugins/config/lang/de/lang.php
+++ b/lib/plugins/config/lang/de/lang.php
@@ -3,9 +3,13 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Eric Haberstroh <ehaberstroh@gmail.com>
+ * @author C!own77 <clown77@posteo.de>
+ * @author Alex Beck <alex@4becks.com>
+ * @author Jürgen Fredriksson <jfriedrich@gmx.at>
* @author Michael Bohn <mjbohn@gmail.com>
* @author Joel Strasser <strasser999@gmail.com>
- * @author Andreas Gohr <andi@splitbrain.org>
* @author Michael Klier <chi@chimeric.de>
* @author Leo Moll <leo@yeasoft.com>
* @author Florian Anderiasch <fa@art-core.org>
@@ -50,6 +54,7 @@ $lang['_advanced'] = 'Erweitert';
$lang['_network'] = 'Netzwerk';
$lang['_msg_setting_undefined'] = 'Keine Konfigurationsmetadaten.';
$lang['_msg_setting_no_class'] = 'Keine Konfigurationsklasse.';
+$lang['_msg_setting_no_known_class'] = 'Setting-Klasse nicht verfügbar.';
$lang['_msg_setting_no_default'] = 'Kein Standardwert.';
$lang['title'] = 'Titel des Wikis';
$lang['start'] = 'Startseitenname';
@@ -159,12 +164,16 @@ $lang['xsendfile'] = 'Den X-Sendfile-Header nutzen, um Dateien direk
$lang['renderer_xhtml'] = 'Standard-Renderer für die normale (XHTML) Wiki-Ausgabe.';
$lang['renderer__core'] = '%s (DokuWiki Kern)';
$lang['renderer__plugin'] = '%s (Plugin)';
+$lang['search_nslimit'] = 'Beschränke die Suche auf die jetzigen X Namensräume. Wenn eine Suche von einer Seite in einem tieferen Namensraum aus ausgeführt wird, werden die ersten X Namensräume als Filter hinzugefügt';
+$lang['search_fragment'] = 'Spezifiziere das vorgegebenen Fragment-Suchverhalten';
$lang['search_fragment_o_exact'] = 'genaue Treffer';
$lang['search_fragment_o_starts_with'] = 'beginnt mit';
$lang['search_fragment_o_ends_with'] = 'endet mit';
$lang['search_fragment_o_contains'] = 'enthält';
+$lang['trustedproxy'] = 'Vertrauen Sie Weiterleitungs-Proxys, welche dem regulärem Ausdruck entsprechen, hinsichtlich der angegebenen Client-ID. Der Standardwert entspricht dem lokalem Netzwerk. Leer lassen um jedem Proxy zu vertrauen.';
+$lang['defer_js'] = 'JavaScript-Ausführung verzögern bis das HTML der gesamten Seite verarbeitet wurde. Erhöht die gefühlte Geschwindigkeit des Seitenaufbaus, kann aber mit einigen wenigen Plugins inkompatibel sein.';
$lang['dnslookups'] = 'DokuWiki löst die IP-Adressen von Benutzern zu deren Hostnamen auf. Wenn Sie einen langsamen oder unzuverlässigen DNS-Server verwenden oder die Funktion nicht benötigen, dann sollte diese Option deaktiviert sein.';
-$lang['jquerycdn'] = 'Sollen jQuery und jQuery UI Skriptdateien von einem CDN (Contend Delivery Network) geladen werden? Dadurch entstehen zusätzliche HTTP-Anfragen, aber die Daten werden voraussichtlich schneller geladen und eventuell sind sie auch schon beim Benutzer im Cache.';
+$lang['jquerycdn'] = 'Sollen jQuery und jQuery UI Skriptdateien von einem CDN (Content Delivery Network) geladen werden? Dadurch entstehen zusätzliche HTTP-Anfragen, aber die Daten werden voraussichtlich schneller geladen und eventuell sind sie auch schon beim Benutzer im Cache.';
$lang['jquerycdn_o_0'] = 'Kein CDN, ausschließlich lokale Auslieferung';
$lang['jquerycdn_o_jquery'] = 'CDN von code.jquery.com';
$lang['jquerycdn_o_cdnjs'] = 'CDN von cdnjs.com';
@@ -174,12 +183,6 @@ $lang['proxy____user'] = 'Proxy Benutzername';
$lang['proxy____pass'] = 'Proxy Passwort';
$lang['proxy____ssl'] = 'SSL bei Verbindung zum Proxy verwenden';
$lang['proxy____except'] = 'Regulärer Ausdruck für URLs, bei denen kein Proxy verwendet werden soll';
-$lang['safemodehack'] = 'Safemodehack verwenden';
-$lang['ftp____host'] = 'FTP-Host für Safemodehack';
-$lang['ftp____port'] = 'FTP-Port für Safemodehack';
-$lang['ftp____user'] = 'FTP Benutzername für Safemodehack';
-$lang['ftp____pass'] = 'FTP Passwort für Safemodehack';
-$lang['ftp____root'] = 'FTP Wurzelverzeichnis für Safemodehack';
$lang['license_o_'] = 'Keine gewählt';
$lang['typography_o_0'] = 'keine';
$lang['typography_o_1'] = 'ohne einfache Anführungszeichen';
diff --git a/lib/plugins/config/lang/el/lang.php b/lib/plugins/config/lang/el/lang.php
index 7904c63bd..625f5a05b 100644
--- a/lib/plugins/config/lang/el/lang.php
+++ b/lib/plugins/config/lang/el/lang.php
@@ -3,13 +3,15 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Apostolos Tsompanopoulos <info@aptlogs.com>
+ * @author Katerina Katapodi <extragold1234@hotmail.com>
* @author Christopher Smith <chris@jalakai.co.uk>
* @author Thanos Massias <tm@thriasio.gr>
* @author Αθανάσιος Νταής <homunculus@wana.gr>
* @author Konstantinos Koryllos <koryllos@gmail.com>
* @author George Petsagourakis <petsagouris@gmail.com>
* @author Petros Vidalis <pvidalis@gmail.com>
- * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
+ * @author Vasileios Karavasilis <vasileioskaravasilis@gmail.com>
* @author Zacharias Sdregas <zsdregas@sch.gr>
*/
$lang['menu'] = 'Ρυθμίσεις';
@@ -85,7 +87,9 @@ $lang['disableactions'] = 'Απενεργοποίηση λειτουργ
$lang['disableactions_check'] = 'Έλεγχος';
$lang['disableactions_subscription'] = 'Εγγραφή/Διαγραφή χρήστη';
$lang['disableactions_wikicode'] = 'Προβολή κώδικα σελίδας';
+$lang['disableactions_profile_delete'] = 'Διαγραφή Λογαριασμού ';
$lang['disableactions_other'] = 'Άλλες λειτουργίες (διαχωρίστε τις με κόμμα)';
+$lang['disableactions_rss'] = 'XML Ομαδοποίηση (RSS)';
$lang['auth_security_timeout'] = 'Διάρκεια χρόνου για ασφάλεια πιστοποίησης (δευτερόλεπτα)';
$lang['securecookie'] = 'Τα cookies που έχουν οριστεί μέσω HTTPS πρέπει επίσης να αποστέλλονται μόνο μέσω HTTPS από τον φυλλομετρητή? Απενεργοποιήστε αυτή την επιλογή όταν μόνο η είσοδος στο wiki σας διασφαλίζεται μέσω SSL αλλά η περιήγηση γίνεται και χωρίς αυτό.';
$lang['remote'] = 'Ενεργοποίησης απομακρυσμένης προγραμματιστικής διεπαφής εφαρμογών (API). Με αυτό τον τρόπο επιτρέπεται η πρόσβαση στο wiki με το XML-RPC ή με άλλα πρωτόκολλα επικοινωνίας.';
@@ -116,6 +120,7 @@ $lang['subscribe_time'] = 'Χρόνος μετά τον οποίο οι
$lang['notify'] = 'Αποστολή ενημέρωσης για αλλαγές σε αυτή την e-mail διεύθυνση';
$lang['registernotify'] = 'Αποστολή ενημερωτικών μηνυμάτων σε αυτή την e-mail διεύθυνση κατά την εγγραφή νέων χρηστών';
$lang['mailfrom'] = 'e-mail διεύθυνση αποστολέα για μηνύματα από την εφαρμογή';
+$lang['mailreturnpath'] = 'Διεύθυνση ηλεκτρονικού ταχυδρομείου λήπτη για μηνύματα που δεν έλαβε';
$lang['mailprefix'] = 'Πρόθεμα θέματος που να χρησιμοποιείται για τα αυτόματα μηνύματα ηλεκτρονικού ταχυδρομείου.';
$lang['htmlmail'] = 'Αποστολή οπτικά καλύτερου, αλλά μεγαλύτερου σε μέγεθος email με χρήση HTML. Απενεργοποιήστε το για αποστέλλονται μόνο email απλού κειμένου.';
$lang['sitemap'] = 'Δημιουργία Google sitemap (ημέρες)';
@@ -125,6 +130,9 @@ $lang['rss_content'] = 'Τι να εμφανίζεται στα XML fe
$lang['rss_update'] = 'Χρόνος ανανέωσης XML feed (sec)';
$lang['rss_show_summary'] = 'Να εμφανίζεται σύνοψη του XML feed στον τίτλο';
$lang['rss_media'] = 'Τι είδους αλλαγές πρέπει να εμφανίζονται στο XLM feed;';
+$lang['rss_media_o_both'] = 'αμφότεροι';
+$lang['rss_media_o_pages'] = 'σελίδες';
+$lang['rss_media_o_media'] = 'μέσα ενημέρωσης ';
$lang['updatecheck'] = 'Έλεγχος για ύπαρξη νέων εκδόσεων και ενημερώσεων ασφαλείας της εφαρμογής? Απαιτείται η σύνδεση με το update.dokuwiki.org για να λειτουργήσει σωστά αυτή η επιλογή.';
$lang['userewrite'] = 'Χρήση ωραίων URLs';
$lang['useslash'] = 'Χρήση slash σαν διαχωριστικό φακέλων στα URLs';
@@ -142,19 +150,23 @@ $lang['xsendfile'] = 'Χρήση της κεφαλίδας X-Sendfil
$lang['renderer_xhtml'] = 'Πρόγραμμα δημιουργίας βασικής (xhtml) εξόδου wiki.';
$lang['renderer__core'] = '%s (βασικός κώδικας dokuwiki)';
$lang['renderer__plugin'] = '%s (επέκταση)';
+$lang['search_nslimit'] = 'Περιορίστε την αναζήτηση στα παρόντα αρχεία που δεν έχουν τίτλο Χ. Όταν η αναζήτηση διεξάγεται από μια σελίδα στα πλαίσια ενός μεγαλύτερου άτιτλου αρχείου, τα πρώτα ονόματα αρχείων Χ θα προστεθούν για να καλύψουν.';
+$lang['search_fragment'] = 'Κάντε την αναζήτηση ορίζοντας το πλαίσιο μη πρόσβασης που λείπει';
+$lang['search_fragment_o_exact'] = 'ακριβής';
+$lang['search_fragment_o_starts_with'] = 'αρχίζει με';
+$lang['search_fragment_o_ends_with'] = 'τελειώνει με';
+$lang['search_fragment_o_contains'] = 'περιέχει';
$lang['dnslookups'] = 'Το DokuWiki θα ψάξει τα ονόματα υπολογιστών που αντιστοιχούν σε διευθύνσεις IP των χρηστών που γράφουν στις σελίδες. Αν ο DNS είναι αργός, δεν δουλεύει ή δεν χρειάζεστε αυτή την λειτουργία, απενεργοποιήστε την.';
+$lang['jquerycdn'] = 'Πρέπει οι φάκελλοι με περιεχόμενο jQuery και jQuery UI να φορτωθούν από το CDN? Αυτό προσθέτει επιπλέον αιτήματα HTTP , αλλά οι φάκελλοι μπορούν να φορτωθούν ταχύτερα και οι χρήστες μπορεί να τους έχουν κρύψει ήδη.';
+$lang['jquerycdn_o_0'] = 'Δεν υπάρχει CDN, τοπική μετάδοση μόνο';
+$lang['jquerycdn_o_jquery'] = 'CDN στον κωδικό.jquery.com ';
+$lang['jquerycdn_o_cdnjs'] = 'CDN στο cdnjs.com ';
$lang['proxy____host'] = 'Διακομιστής Proxy';
$lang['proxy____port'] = 'Θύρα Proxy';
$lang['proxy____user'] = 'Όνομα χρήστη Proxy';
$lang['proxy____pass'] = 'Κωδικός χρήστη Proxy';
$lang['proxy____ssl'] = 'Χρήση ssl για σύνδεση με διακομιστή Proxy';
$lang['proxy____except'] = 'Regular expression για να πιάνει τα URLs για τα οποία θα παρακάμπτεται το proxy.';
-$lang['safemodehack'] = 'Ενεργοποίηση safemode hack';
-$lang['ftp____host'] = 'Διακομιστής FTP για safemode hack';
-$lang['ftp____port'] = 'Θύρα FTP για safemode hack';
-$lang['ftp____user'] = 'Όνομα χρήστη FTP για safemode hack';
-$lang['ftp____pass'] = 'Κωδικός χρήστη FTP για safemode hack';
-$lang['ftp____root'] = 'Αρχικός φάκελος FTP για safemode hack';
$lang['license_o_'] = 'Δεν επελέγει άδεια';
$lang['typography_o_0'] = 'κανένα';
$lang['typography_o_1'] = 'μόνο διπλά εισαγωγικά';
@@ -190,6 +202,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_username_link'] = 'Το ονοματεπώνυμο του χρήστη ως σύνδεσμος χρήστη interwiki ';
$lang['showuseras_o_email'] = 'e-mail διεύθυνση χρήστη (εμφανίζεται σύμφωνα με την ρύθμιση για την κωδικοποίηση e-mail διευθύνσεων)';
$lang['showuseras_o_email_link'] = 'Εμφάνιση e-mail διεύθυνσης χρήστη σαν σύνδεσμος mailto:';
$lang['useheading_o_0'] = 'Ποτέ';
diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php
index 356db4e5e..fb8186cd8 100644
--- a/lib/plugins/config/lang/en/lang.php
+++ b/lib/plugins/config/lang/en/lang.php
@@ -46,6 +46,7 @@ $lang['_network'] = 'Network';
/* --- Undefined Setting Messages --- */
$lang['_msg_setting_undefined'] = 'No setting metadata.';
$lang['_msg_setting_no_class'] = 'No setting class.';
+$lang['_msg_setting_no_known_class'] = 'Setting class not available.';
$lang['_msg_setting_no_default'] = 'No default value.';
/* -------------------- Config Options --------------------------- */
@@ -110,7 +111,7 @@ $lang['remoteuser'] = 'Restrict remote API access to the comma separated groups
/* Anti-Spam Settings */
$lang['usewordblock']= 'Block spam based on wordlist';
-$lang['relnofollow'] = 'Use rel="nofollow" on external links';
+$lang['relnofollow'] = 'Use rel="ugc 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';
@@ -154,6 +155,7 @@ $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_show_deleted'] = 'XML feed Show deleted feeds';
$lang['rss_media'] = 'What kind of changes should be listed in the XML feed?';
$lang['rss_media_o_both'] = 'both';
$lang['rss_media_o_pages'] = 'pages';
@@ -184,6 +186,10 @@ $lang['search_fragment_o_exact'] = 'exact';
$lang['search_fragment_o_starts_with'] = 'starts with';
$lang['search_fragment_o_ends_with'] = 'ends with';
$lang['search_fragment_o_contains'] = 'contains';
+$lang['trustedproxy'] = 'Trust forwarding proxies matching this regular expression about the true client IP they report. The default matches local networks. Leave empty to trust no proxy.';
+
+$lang['_feature_flags'] = 'Feature Flags';
+$lang['defer_js'] = 'Defer javascript to be execute after the page\'s HTML has been parsed. Improves perceived page speed but could break a small number of plugins.';
/* 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';
@@ -202,14 +208,6 @@ $lang['proxy____pass'] = 'Proxy password';
$lang['proxy____ssl'] = 'Use SSL to connect to proxy';
$lang['proxy____except'] = 'Regular expression to match URLs for which the proxy should be skipped.';
-/* Safemode Hack */
-$lang['safemodehack'] = 'Enable safemode hack';
-$lang['ftp____host'] = 'FTP server for safemode hack';
-$lang['ftp____port'] = 'FTP port for safemode hack';
-$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';
diff --git a/lib/plugins/config/lang/eo/lang.php b/lib/plugins/config/lang/eo/lang.php
index 7201b3267..ad779da43 100644
--- a/lib/plugins/config/lang/eo/lang.php
+++ b/lib/plugins/config/lang/eo/lang.php
@@ -5,6 +5,7 @@
*
* Esperantolanguage file
*
+ * @author Florian <florianmail55@gmail.com>
* @author Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>
* @author Felipe Castro <fefcas@uol.com.br>
* @author Felipo Kastro <fefcas@gmail.com>
@@ -152,12 +153,6 @@ $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';
-$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 elektita';
$lang['typography_o_0'] = 'nenio';
$lang['typography_o_1'] = 'Nur duoblaj citiloj';
diff --git a/lib/plugins/config/lang/es/lang.php b/lib/plugins/config/lang/es/lang.php
index 4d6647e7b..97b5540d1 100644
--- a/lib/plugins/config/lang/es/lang.php
+++ b/lib/plugins/config/lang/es/lang.php
@@ -51,6 +51,7 @@ $lang['_advanced'] = 'Parámetros Avanzados';
$lang['_network'] = 'Parámetros de Red';
$lang['_msg_setting_undefined'] = 'Sin parámetros de metadata.';
$lang['_msg_setting_no_class'] = 'Sin clase establecida.';
+$lang['_msg_setting_no_known_class'] = 'Configuración de la clase no disponible.';
$lang['_msg_setting_no_default'] = 'Sin valor por defecto.';
$lang['title'] = 'Título del wiki';
$lang['start'] = 'Nombre de la página inicial';
@@ -166,6 +167,7 @@ $lang['search_fragment_o_exact'] = 'exacto';
$lang['search_fragment_o_starts_with'] = 'comienza con';
$lang['search_fragment_o_ends_with'] = 'termina con';
$lang['search_fragment_o_contains'] = 'contiene';
+$lang['trustedproxy'] = 'Confíe en los proxys de reenvío que coincidan con esta expresión regular acerca de la IP verdadera del cliente que referencia. El valor predeterminado coincide con las redes locales. Dejar en blanco para no confiar en ningún proxy.';
$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['jquerycdn'] = '¿Deberían cargarse los ficheros de script jQuery y jQuery UI desde un CDN? Esto añade peticiones HTTP adicionales, pero los ficheros se pueden cargar más rápido y los usuarios pueden tenerlas ya almacenadas en caché.';
$lang['jquerycdn_o_0'] = 'No CDN, sólo entrega local';
@@ -177,12 +179,6 @@ $lang['proxy____user'] = 'Nombre de usuario para el servidor Proxy';
$lang['proxy____pass'] = 'Contraseña para el servidor Proxy';
$lang['proxy____ssl'] = 'Usar ssl para conectarse al servidor Proxy';
$lang['proxy____except'] = 'Expresiones regulares para encontrar URLs que el proxy debería omitir.';
-$lang['safemodehack'] = 'Habilitar edición (hack) de modo seguro';
-$lang['ftp____host'] = 'Nombre del servidor FTP para modo seguro';
-$lang['ftp____port'] = 'Puerto del servidor FTP para modo seguro';
-$lang['ftp____user'] = 'Nombre de usuario para el servidor FTP para modo seguro';
-$lang['ftp____pass'] = 'Contraseña para el servidor FTP para modo seguro';
-$lang['ftp____root'] = 'Directorio raiz para el servidor FTP para modo seguro';
$lang['license_o_'] = 'No se eligió ninguna';
$lang['typography_o_0'] = 'ninguno';
$lang['typography_o_1'] = 'Dobles comillas solamente';
diff --git a/lib/plugins/config/lang/eu/lang.php b/lib/plugins/config/lang/eu/lang.php
index b48df552a..cf9972d8f 100644
--- a/lib/plugins/config/lang/eu/lang.php
+++ b/lib/plugins/config/lang/eu/lang.php
@@ -135,12 +135,6 @@ $lang['proxy____user'] = 'Proxyaren erabiltzaile izena';
$lang['proxy____pass'] = 'Proxyaren pasahitza ';
$lang['proxy____ssl'] = 'Erabili SSL Proxyra konektatzeko';
$lang['proxy____except'] = 'URLak detektatzeko espresio erregularra, zeinentzat Proxy-a sahiestu beharko litzatekeen.';
-$lang['safemodehack'] = 'Gaitu modu segurua hack-a';
-$lang['ftp____host'] = 'FTP zerbitzaria modu seguruarentzat';
-$lang['ftp____port'] = 'FTP portua modu seguruarentzat';
-$lang['ftp____user'] = 'FTP erabiltzailea modu seguruarentzat';
-$lang['ftp____pass'] = 'FTP pasahitza modu seguruarentzat';
-$lang['ftp____root'] = 'FTP erro direktorioa modu seguruarentzat';
$lang['license_o_'] = 'Bat ere ez hautaturik';
$lang['typography_o_0'] = 'ezer';
$lang['typography_o_1'] = 'Komatxo bikoitzak bakarrik';
diff --git a/lib/plugins/config/lang/fa/lang.php b/lib/plugins/config/lang/fa/lang.php
index 72bbbe1f8..e9c4e3cd6 100644
--- a/lib/plugins/config/lang/fa/lang.php
+++ b/lib/plugins/config/lang/fa/lang.php
@@ -3,15 +3,15 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author علیرضا ایوز <info@alirezaivaz.ir>
+ * @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
* @author behrad eslamifar <behrad_es@yahoo.com)
* @author Mohsen Firoozmandan <info@mambolearn.com>
- * @author omidmr@gmail.com
- * @author Omid Mottaghi <omidmr@gmail.com>
+ * @author omidmr <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
* @author Milad DZand <M.DastanZand@gmail.com>
* @author AmirH Hassaneini <mytechmix@gmail.com>
* @author Mohmmad Razavi <sepent@gmail.com>
- * @author Masoud Sadrnezhaad <masoud@sadrnezhaad.ir>
* @author sam01 <m.sajad079@gmail.com>
*/
$lang['menu'] = 'تنظیمات پیکر‌بندی';
@@ -119,6 +119,7 @@ $lang['subscribe_time'] = 'زمان مورد نیاز برای ارسال
$lang['notify'] = 'تغییرات به این ایمیل ارسال شود';
$lang['registernotify'] = 'اطلاعات کاربران تازه وارد به این ایمیل ارسال شود';
$lang['mailfrom'] = 'آدرس ایمیلی که برای ایمیل‌های خودکار استفاده می‌شود';
+$lang['mailreturnpath'] = 'نشانی ایمیل گیرنده برای اعلان‌های دریافت نشده';
$lang['mailprefix'] = 'پیشوند تیتر ایمیل (جهت ایمیل های خودکار)';
$lang['htmlmail'] = 'فرستادن با ظاهر بهتر ، امّا با اندازه بیشتر در ایمیل های چند قسمتی HTML.
برای استفاده از ایمیل متنی ، غیر فعال کنید.';
@@ -129,6 +130,9 @@ $lang['rss_content'] = 'چه چیزی در تکه‌های خوراک
$lang['rss_update'] = 'زمان به روز رسانی خوراک به ثانیه';
$lang['rss_show_summary'] = 'خوراک مختصری از مطلب را در عنوان نمایش دهد';
$lang['rss_media'] = 'چه نوع تغییراتی باید در خوراک XML لیست شود؟';
+$lang['rss_media_o_both'] = 'هر دو';
+$lang['rss_media_o_pages'] = 'صفحات';
+$lang['rss_media_o_media'] = 'مدیا';
$lang['updatecheck'] = 'هشدارهای به روز رسانی و امنیتی بررسی شود؟ برای این‌کار دوکوویکی با سرور update.dokuwiki.org تماس خواهد گرفت.';
$lang['userewrite'] = 'از زیباکننده‌ی آدرس‌ها استفاده شود';
$lang['useslash'] = 'از اسلش «/» برای جداکننده‌ی آدرس فضای‌نام‌ها استفاده شود';
@@ -146,19 +150,23 @@ $lang['xsendfile'] = 'استفاده از هدر X-Sendfile، تا
$lang['renderer_xhtml'] = 'مفسری که برای خروجی اصلی ویکی استفاده شود';
$lang['renderer__core'] = '%s (هسته‌ی dokuwiki)';
$lang['renderer__plugin'] = '%s (افزونه)';
+$lang['search_nslimit'] = 'جستجو را به فضای‌نام X محدود کن. اگر جستجو از صفحه‌ای که از فضای نام عمیق‌تری هست انجام شود اولین فضای نام X به عنوان فیلتر اضافه می‌شود.';
+$lang['search_fragment'] = 'رفتار جستجوی بخشی پیشفرض را مشخص کنید.';
+$lang['search_fragment_o_exact'] = 'دقیقا';
+$lang['search_fragment_o_starts_with'] = 'شروع شده با';
+$lang['search_fragment_o_ends_with'] = 'پایان یافته با';
+$lang['search_fragment_o_contains'] = 'شامل';
$lang['dnslookups'] = 'دوکوویکی نام هاست ها را برای آدرسهای آی‌پی‌های صفحات ویرایشی کاربران ، جستجو می کند. اگر یک سرور DNS کند یا نا کارامد دارید یا این ویژگی را نمی خواهید ، این گزینه را غیر فعال کنید.';
+$lang['jquerycdn'] = 'آیا فایل‌های اسکریپت jQuery و jQuery UI باید از روی یک CDN باز شوند؟ این قابلیت تعداد درخواست‌های HTTP بیشتری اضافه می‌کند، اما فایل‌ها ممکن است سریع‌تر باز شوند و کاربران ممکن است آن‌ها را کش کرده باشند.';
+$lang['jquerycdn_o_0'] = 'بدون CDN فقط برای دریافت داخلی';
+$lang['jquerycdn_o_jquery'] = 'CDN در code.jquery.com';
+$lang['jquerycdn_o_cdnjs'] = 'CDN در cdnjs.com';
$lang['proxy____host'] = 'آدرس سرور پروکسی';
$lang['proxy____port'] = 'پورت پروکسی';
$lang['proxy____user'] = 'نام کاربری پروکسی';
$lang['proxy____pass'] = 'گذرواژهي پروکسی';
$lang['proxy____ssl'] = 'استفاده از SSL برای اتصال به پروکسی';
$lang['proxy____except'] = 'عبارت منظم برای تطبیق با URLها برای این‌که دریابیم که از روی چه پروکسی‌ای باید بپریم!';
-$lang['safemodehack'] = 'فعال کردن safemode hack';
-$lang['ftp____host'] = 'آدرس FTP برای safemode hack';
-$lang['ftp____port'] = 'پورت FTP برای safemode hack';
-$lang['ftp____user'] = 'نام کاربری FTP برای safemode hack';
-$lang['ftp____pass'] = 'گذرواژه‌ی FTP برای safemode hack';
-$lang['ftp____root'] = 'شاخه‌ی FTP برای safemode hack';
$lang['license_o_'] = 'هیچ کدام';
$lang['typography_o_0'] = 'هیچ';
$lang['typography_o_1'] = 'حذف کردن single-quote';
diff --git a/lib/plugins/config/lang/fi/lang.php b/lib/plugins/config/lang/fi/lang.php
index 3389754f2..e8d7c8f4c 100644
--- a/lib/plugins/config/lang/fi/lang.php
+++ b/lib/plugins/config/lang/fi/lang.php
@@ -2,9 +2,9 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author otto@valjakko.net
- * @author Otto Vainio <otto@valjakko.net>
+ *
+ * @author Tuomo Hartikainen <tuomo.hartikainen@heksia.fi>
+ * @author otto <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
* @author Sami Olmari <sami@olmari.fi>
* @author Wiki Doku <SugarKidder@mailinator.com>
@@ -42,7 +42,7 @@ $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['tagline'] = 'Apuotsikko - slogan sivustonimen yhteyteen (jos template tukee)';
$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.';
@@ -114,7 +114,7 @@ $lang['subscribe_time'] = 'Aika jonka jälkeen tilauslinkit ja yhteenveto
$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['mailprefix'] = 'Etuliite automaattisesti lähetettyihin sähköposteihin';
$lang['htmlmail'] = 'Lähetä paremman näköisiä, mutta isompia HTML multipart sähköposteja. Ota pois päältä, jos haluat vain tekstimuotoisia posteja.';
$lang['sitemap'] = 'Luo Google sitemap (päiviä)';
$lang['rss_type'] = 'XML-syötteen tyyppi';
@@ -148,12 +148,6 @@ $lang['proxy____user'] = 'Proxy käyttäjän nimi';
$lang['proxy____pass'] = 'Proxy salasana';
$lang['proxy____ssl'] = 'Käytä ssl-yhteyttä kytkeytyäksesi proxy-palvelimeen';
$lang['proxy____except'] = 'Säännönmukainen lause, URLiin, jolle proxy ohitetaan.';
-$lang['safemodehack'] = 'Käytä safemode kiertoa';
-$lang['ftp____host'] = 'FTP-palvelin safemode kiertoa varten';
-$lang['ftp____port'] = 'FTP-portti safemode kiertoa varten';
-$lang['ftp____user'] = 'FTP-käyttäjä safemode kiertoa varten';
-$lang['ftp____pass'] = 'FTP-salasana safemode kiertoa varten';
-$lang['ftp____root'] = 'FTP-juurihakemisto safemode kiertoa varten';
$lang['license_o_'] = 'ei mitään valittuna';
$lang['typography_o_0'] = 'ei mitään';
$lang['typography_o_1'] = 'ilman yksinkertaisia lainausmerkkejä';
diff --git a/lib/plugins/config/lang/fr/lang.php b/lib/plugins/config/lang/fr/lang.php
index 520a8bdaa..5f0a03f24 100644
--- a/lib/plugins/config/lang/fr/lang.php
+++ b/lib/plugins/config/lang/fr/lang.php
@@ -3,8 +3,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
- * @author Damien Regad <dregad@mantisbt.org>
+ * @author Nicolas Friedli <nicolas@theologique.ch>
* @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
+ * @author PaliPalo <palipalo@hotmail.fr>
+ * @author Laurent Ponthieu <contact@coopindus.fr>
+ * @author Damien Regad <dregad@mantisbt.org>
* @author Michael Bohn <mjbohn@gmail.com>
* @author Guy Brand <gb@unistra.fr>
* @author Delassaux Julien <julien@delassaux.fr>
@@ -23,7 +26,6 @@
* @author Anael Mobilia <contrib@anael.eu>
* @author Bruno Veilleux <bruno.vey@gmail.com>
* @author Carbain Frédéric <fcarbain@yahoo.fr>
- * @author Nicolas Friedli <nicolas@theologique.ch>
* @author Floriang <antispam@floriang.eu>
* @author Simon DELAGE <simon.geekitude@gmail.com>
* @author Eric <ericstevenart@netc.fr>
@@ -55,6 +57,7 @@ $lang['_advanced'] = 'Paramètres avancés';
$lang['_network'] = 'Paramètres réseaux';
$lang['_msg_setting_undefined'] = 'Pas de définition de métadonnées';
$lang['_msg_setting_no_class'] = 'Pas de définition de paramètres.';
+$lang['_msg_setting_no_known_class'] = 'Classe de réglage non disponible.';
$lang['_msg_setting_no_default'] = 'Pas de valeur par défaut.';
$lang['title'] = 'Titre du wiki (nom du wiki)';
$lang['start'] = 'Nom de la page d\'accueil à utiliser pour toutes les catégories';
@@ -83,7 +86,7 @@ $lang['toptoclevel'] = 'Niveau le plus haut à afficher dans la table
$lang['tocminheads'] = 'Nombre minimum de titres pour qu\'une table des matières soit affichée';
$lang['maxtoclevel'] = 'Niveau maximum pour figurer dans la table des matières';
$lang['maxseclevel'] = 'Niveau maximum pour modifier des sections';
-$lang['camelcase'] = 'Utiliser l\'affichage «CamelCase » pour les liens';
+$lang['camelcase'] = 'Les mots en CamelCase créent des liens';
$lang['deaccent'] = 'Retirer les accents dans les noms de pages';
$lang['useheading'] = 'Utiliser le titre de premier niveau pour le nom de 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 les catégories pour lesquelles l\'utilisateur n\'a pas l\'autorisation de lecture. Il peut en résulter le masquage de sous-catégories accessibles. Ceci peut rendre l\'index inutilisable avec certains contrôles d\'accès.';
@@ -143,6 +146,7 @@ $lang['rss_linkto'] = 'Lien du flux XML vers';
$lang['rss_content'] = 'Quel contenu afficher dans le flux XML?';
$lang['rss_update'] = 'Fréquence de mise à jour du flux XML (secondes)';
$lang['rss_show_summary'] = 'Le flux XML affiche le résumé dans le titre';
+$lang['rss_show_deleted'] = 'Le flux XML montre les flux détruits';
$lang['rss_media'] = 'Quels types de changements doivent être listés dans le flux XML?';
$lang['rss_media_o_both'] = 'les deux';
$lang['rss_media_o_pages'] = 'pages';
@@ -171,6 +175,9 @@ $lang['search_fragment_o_exact'] = 'exact';
$lang['search_fragment_o_starts_with'] = 'commence par';
$lang['search_fragment_o_ends_with'] = 'se termine par';
$lang['search_fragment_o_contains'] = 'contient';
+$lang['trustedproxy'] = 'Faire confiance aux mandataires qui correspondent à cette expression régulière pour l\'adresse IP réelle des clients qu\'ils rapportent. La valeur par défaut correspond aux réseaux locaux. Laisser vide pour ne faire confiance à aucun mandataire.';
+$lang['_feature_flags'] = 'Fonctionnalités expérimentales';
+$lang['defer_js'] = 'Attendre que le code HTML des pages soit analysé avant d\'exécuter le javascript. Améliore la vitesse de chargement perçue, mais pourrait casser un petit nombre de greffons.';
$lang['dnslookups'] = 'DokuWiki effectuera une résolution du nom d\'hôte sur les adresses IP des utilisateurs modifiant des pages. Si vous ne possédez pas de serveur DNS, que ce dernier est lent ou que vous ne souhaitez pas utiliser cette fonctionnalité : désactivez-la.';
$lang['jquerycdn'] = 'Faut-il distribuer les scripts JQuery et JQuery UI depuis un CDN ? Cela ajoute une requête HTTP, mais les fichiers peuvent se charger plus vite et les internautes les ont peut-être déjà en cache.';
$lang['jquerycdn_o_0'] = 'Non : utilisation de votre serveur.';
@@ -182,12 +189,6 @@ $lang['proxy____user'] = 'Mandataire - Identifiant';
$lang['proxy____pass'] = 'Mandataire - Mot de passe';
$lang['proxy____ssl'] = 'Mandataire - Utilisation de SSL';
$lang['proxy____except'] = 'Mandataire - Expression régulière de test des URLs pour lesquelles le mandataire (proxy) ne doit pas être utilisé.';
-$lang['safemodehack'] = 'Activer l\'option Mode sans échec';
-$lang['ftp____host'] = 'FTP / Mode sans échec - Serveur hôte';
-$lang['ftp____port'] = 'FTP / Mode sans échec - Port';
-$lang['ftp____user'] = 'FTP / Mode sans échec - Identifiant';
-$lang['ftp____pass'] = 'FTP / Mode sans échec - Mot de passe';
-$lang['ftp____root'] = 'FTP / Mode sans échec - Répertoire racine';
$lang['license_o_'] = 'Aucune choisie';
$lang['typography_o_0'] = 'aucun';
$lang['typography_o_1'] = 'guillemets uniquement';
diff --git a/lib/plugins/config/lang/gl/lang.php b/lib/plugins/config/lang/gl/lang.php
index 551396481..933cedc8e 100644
--- a/lib/plugins/config/lang/gl/lang.php
+++ b/lib/plugins/config/lang/gl/lang.php
@@ -144,12 +144,6 @@ $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)';
-$lang['ftp____user'] = 'Nome de usuario FTP para o hack de modo seguro(safemode)';
-$lang['ftp____pass'] = 'Contrasinal FTP para o hack de modo seguro(safemode)';
-$lang['ftp____root'] = 'Directorio raigaña do FTP para o hack de modo seguro(safemode)';
$lang['license_o_'] = 'Non se escolleu nada';
$lang['typography_o_0'] = 'ningunha';
$lang['typography_o_1'] = 'Só dobres aspas';
diff --git a/lib/plugins/config/lang/he/lang.php b/lib/plugins/config/lang/he/lang.php
index 8c986ae65..4a7f32d34 100644
--- a/lib/plugins/config/lang/he/lang.php
+++ b/lib/plugins/config/lang/he/lang.php
@@ -124,12 +124,6 @@ $lang['proxy____port'] = 'שער השרת המתווך';
$lang['proxy____user'] = 'שם המשתמש בשרת המתווך';
$lang['proxy____pass'] = 'סיסמת ההשרת המתווך';
$lang['proxy____ssl'] = 'השתמש ב-ssl כדי להתחבר לשרת המתווך';
-$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['typography_o_0'] = 'ללא';
$lang['typography_o_1'] = 'רק גרשיים כפולים';
$lang['typography_o_2'] = 'כל הגרשים (עלול שלא לעבוד לעיתים)';
diff --git a/lib/plugins/config/lang/hr/lang.php b/lib/plugins/config/lang/hr/lang.php
index d6f93b354..f6851b484 100644
--- a/lib/plugins/config/lang/hr/lang.php
+++ b/lib/plugins/config/lang/hr/lang.php
@@ -159,12 +159,6 @@ $lang['proxy____user'] = 'Proxy poslužitelj - korisničko ime';
$lang['proxy____pass'] = 'Proxy poslužitelj - lozinka';
$lang['proxy____ssl'] = 'Koristi SSL za vezu prema proxy poslužitelju';
$lang['proxy____except'] = 'Preskoči proxy za URL-ove koji odgovaraju ovom regularnom izrazu.';
-$lang['safemodehack'] = 'Omogući safemode hack';
-$lang['ftp____host'] = 'FTP poslužitelj za safemode hack';
-$lang['ftp____port'] = 'FTP port za safemode hack';
-$lang['ftp____user'] = 'FTP korisničko ime za safemode hack';
-$lang['ftp____pass'] = 'FTP lozinka za safemode hack';
-$lang['ftp____root'] = 'FTP root direktorij za safemode hack';
$lang['license_o_'] = 'Ništa odabrano';
$lang['typography_o_0'] = 'ništa';
$lang['typography_o_1'] = 'isključivši jednostruke navodnike';
diff --git a/lib/plugins/config/lang/hu/lang.php b/lib/plugins/config/lang/hu/lang.php
index 972a731d8..71782632a 100644
--- a/lib/plugins/config/lang/hu/lang.php
+++ b/lib/plugins/config/lang/hu/lang.php
@@ -151,12 +151,6 @@ $lang['proxy____user'] = 'Proxy felhasználó név';
$lang['proxy____pass'] = 'Proxy jelszó';
$lang['proxy____ssl'] = 'SSL használata a proxyhoz csatlakozáskor';
$lang['proxy____except'] = 'URL szabály azokra a webcímekre, amit szeretnél, hogy ne kezeljen a proxy.';
-$lang['safemodehack'] = 'A PHP safemode beállítás megkerülésének engedélyezése';
-$lang['ftp____host'] = 'FTP szerver a safemode megkerüléshez';
-$lang['ftp____port'] = 'FTP port a safemode megkerüléshez';
-$lang['ftp____user'] = 'FTP felhasználó név a safemode megkerüléshez';
-$lang['ftp____pass'] = 'FTP jelszó a safemode megkerüléshez';
-$lang['ftp____root'] = 'FTP gyökérkönyvtár a safemode megkerüléshez';
$lang['license_o_'] = 'Nincs kiválasztva';
$lang['typography_o_0'] = 'nem';
$lang['typography_o_1'] = 'Csak a dupla idézőjelet';
diff --git a/lib/plugins/config/lang/ia/lang.php b/lib/plugins/config/lang/ia/lang.php
index 511d08101..df0f4512a 100644
--- a/lib/plugins/config/lang/ia/lang.php
+++ b/lib/plugins/config/lang/ia/lang.php
@@ -126,12 +126,6 @@ $lang['proxy____port'] = 'Porto del proxy';
$lang['proxy____user'] = 'Nomine de usator pro le proxy';
$lang['proxy____pass'] = 'Contrasigno pro le proxy';
$lang['proxy____ssl'] = 'Usar SSL pro connecter al proxy';
-$lang['safemodehack'] = 'Permitter truco de modo secur';
-$lang['ftp____host'] = 'Servitor FTP pro truco de modo secur';
-$lang['ftp____port'] = 'Porto FTP pro truco de modo secur';
-$lang['ftp____user'] = 'Nomine de usator FTP pro truco de modo secur';
-$lang['ftp____pass'] = 'Contrasigno FTP pro truco de modo secur';
-$lang['ftp____root'] = 'Directorio radice FTP pro truco de modo securr';
$lang['license_o_'] = 'Nihil seligite';
$lang['typography_o_0'] = 'nulle';
$lang['typography_o_1'] = 'excludente ';
diff --git a/lib/plugins/config/lang/id-ni/lang.php b/lib/plugins/config/lang/id-ni/lang.php
index 7b7e14ce5..c30752f97 100644
--- a/lib/plugins/config/lang/id-ni/lang.php
+++ b/lib/plugins/config/lang/id-ni/lang.php
@@ -24,12 +24,6 @@ $lang['proxy____port'] = 'Port proxy';
$lang['proxy____user'] = 'Töi proxy';
$lang['proxy____pass'] = 'Kode proxy';
$lang['proxy____ssl'] = 'Fake ssl ba connect awö Proxy';
-$lang['safemodehack'] = 'Orifi safemode hack';
-$lang['ftp____host'] = 'FTP server khö safemode hack';
-$lang['ftp____port'] = 'FTP port khö safemode hack';
-$lang['ftp____user'] = 'Töi FTP khö safemode hack';
-$lang['ftp____pass'] = 'FTP kode khö safemode hack';
-$lang['ftp____root'] = 'FTP root directory for safemode hack';
$lang['typography_o_0'] = 'lö\'ö';
$lang['typography_o_1'] = 'Ha sitombua kutip';
$lang['typography_o_2'] = 'Fefu nikutip (itataria lömohalöwö)';
diff --git a/lib/plugins/config/lang/id/intro.txt b/lib/plugins/config/lang/id/intro.txt
index 296206d02..c5a9297df 100644
--- a/lib/plugins/config/lang/id/intro.txt
+++ b/lib/plugins/config/lang/id/intro.txt
@@ -1,5 +1,7 @@
====== Manajemen Konfigurasi ======
-Gunakan halaman ini untuk mengatur konfigurasi instalasi DokuWiki Anda. Untuk bantuan dalam konfigurasi, silahkan lihat di [[doku>config]]. Unuk mengetahui lebih lanjut tentang plugin in silahkan lihat [[doku>plugin:config]].
+Gunakan halaman ini untuk mengontrol pengaturan instalasi DokuWiki anda. Untuk bantuan tentang pengaturan individual, lihat [[doku>config]]. Untuk detail lebih lanjut tentang plugin ini lihat [[doku>plugin:config]].
-Konfigurasi dengan warna merah dilindungi dan tidak bisa diubah dengan plugin ini. Konfigurasi dengan warna biru adalah nilai default, dan konfigurasi dengan latar putih telah diset khusus untuk instalasi ini. Konfigurasi berwarna putih atau b
+Pengaturan yang ditunjukkan dengan latar belakang merah muda dilindungi dan tidak dapat diubah dengan plugin ini. Pengaturan yang ditunjukkan dengan latar belakang biru adalah nilai bawaan (default) dan pengaturan yang ditunjukkan dengan latar belakang putih telah diatur secara lokal oleh anda. Pengaturan biru dan putih dapat diubah.
+
+Ingatlah untuk menekan tombol **Simpan** sebelum meninggalkan halaman ini, jika tidak perubahan anda akan hilang. \ No newline at end of file
diff --git a/lib/plugins/config/lang/is/lang.php b/lib/plugins/config/lang/is/lang.php
index 4f4944616..fa18b37d1 100644
--- a/lib/plugins/config/lang/is/lang.php
+++ b/lib/plugins/config/lang/is/lang.php
@@ -1,5 +1,8 @@
<?php
+
/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
* Icelandic language file
*
* @author Hrannar Baldursson <hrannar.baldursson@gmail.com>
@@ -13,24 +16,24 @@ $lang['nochoice'] = '(engir aðrir valmöguleikar fyrir hendi)';
$lang['_display'] = 'Skjástillingar';
$lang['_anti_spam'] = 'Stillingar gegn ruslpósti';
$lang['_editing'] = 'Útgáfastillingar';
-$lang['lang'] = 'Tungumál';
$lang['title'] = 'Heiti wikis';
+$lang['lang'] = 'Tungumál';
$lang['template'] = 'Mát';
$lang['recent'] = 'Nýlegar breytingar';
$lang['breadcrumbs'] = 'Fjöldi brauðmolar';
$lang['youarehere'] = 'Stigveldisá brauðmolar';
$lang['typography'] = 'Gera stað fyrir leturgerðir';
-$lang['htmlok'] = 'Fella HTML inn';
-$lang['phpok'] = 'Fella PHP inn';
$lang['dformat'] = 'Dagsetningarsnið (sjá PHP-aðgerð <a href="http://php.net/strftime">strftime</a>)';
$lang['signature'] = 'Undirskrift';
$lang['passcrypt'] = 'Dulritunaraðferð aðgangsorðs';
$lang['defaultgroup'] = 'Sjálfgefinn hópur';
$lang['superuser'] = 'Hópur kerfisstjóra ';
$lang['profileconfirm'] = 'Staðfestu breytingar með aðgangsorði';
-$lang['mailfrom'] = 'Rafpóstfang fyrir sjálfvirkar póstsendingar';
+$lang['htmlok'] = 'Fella HTML inn';
+$lang['phpok'] = 'Fella PHP inn';
$lang['gdlib'] = 'Útgáfa af GD Lib';
$lang['jpg_quality'] = 'JPG gæðastilling (0-100)';
+$lang['mailfrom'] = 'Rafpóstfang fyrir sjálfvirkar póstsendingar';
$lang['proxy____host'] = 'Heiti staðgengilsþjóns';
$lang['proxy____port'] = 'Staðgengilstengi';
$lang['proxy____user'] = 'Staðgengill notendanafn';
diff --git a/lib/plugins/config/lang/it/lang.php b/lib/plugins/config/lang/it/lang.php
index 9e9ece4e9..801ec6218 100644
--- a/lib/plugins/config/lang/it/lang.php
+++ b/lib/plugins/config/lang/it/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Roberto Bellingeri <bellingeri@netguru.it>
+ * @author Eddy <eddy@mail.it>
+ * @author Riccardo <riccardo.furlato@gmail.com>
+ * @author Stefano <stefano.stefano@gmail.com>
* @author damiano <damiano@spagnuolo.eu>
* @author Torpedo <dgtorpedo@gmail.com>
* @author Christopher Smith <chris@jalakai.co.uk>
@@ -12,7 +16,6 @@
* @author robocap <robocap1@gmail.com>
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
* @author Matteo Pasotti <matteo@xquiet.eu>
- * @author Riccardo <riccardofila@gmail.com>
* @author Paolo <paolopoz12@gmail.com>
*/
$lang['menu'] = 'Configurazione Wiki';
@@ -152,6 +155,12 @@ $lang['xsendfile'] = 'Usare l\'header X-Sendfile per permettere al w
$lang['renderer_xhtml'] = 'Renderer da usare per la visualizzazione del wiki (xhtml)';
$lang['renderer__core'] = '%s (dokuwiki)';
$lang['renderer__plugin'] = '%s (plugin)';
+$lang['search_nslimit'] = 'Limita la ricerca agli attuali spazi dei nomi X. Quando una ricerca viene eseguita da una pagina all\'interno di uno spazio dei nomi più profondo, i primi spazi dei nomi X verranno aggiunti come filtro';
+$lang['search_fragment'] = 'Specificare il comportamento di ricerca del frammento predefinito';
+$lang['search_fragment_o_exact'] = 'esatto';
+$lang['search_fragment_o_starts_with'] = 'inizia con';
+$lang['search_fragment_o_ends_with'] = 'finisce con';
+$lang['search_fragment_o_contains'] = 'contiene';
$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['jquerycdn'] = 'Vuoi che gli script jQuery e jQuery UI siano caricati da una CDN? Questo richiederà richieste HTTP aggiuntive ma i file potrebbero caricarsi più velocemente e gli utenti potrebbero averli già in cache.';
$lang['jquerycdn_o_0'] = 'Nessuna CDN, solo consegna locale';
@@ -163,12 +172,6 @@ $lang['proxy____user'] = 'Nome utente proxy';
$lang['proxy____pass'] = 'Password proxy';
$lang['proxy____ssl'] = 'Usa SSL per connetterti al proxy';
$lang['proxy____except'] = 'Espressioni regolari per far corrispondere le URLs per i quali i proxy dovrebbero essere ommessi.';
-$lang['safemodehack'] = 'Abilita safemode hack';
-$lang['ftp____host'] = 'Server FTP per safemode hack';
-$lang['ftp____port'] = 'Porta FTP per safemode hack';
-$lang['ftp____user'] = 'Nome utente FTP per safemode hack';
-$lang['ftp____pass'] = 'Password FTP per safemode hack';
-$lang['ftp____root'] = 'Directory principale FTP per safemode hack';
$lang['license_o_'] = 'Nessuna scelta';
$lang['typography_o_0'] = 'nessuno';
$lang['typography_o_1'] = 'Solo virgolette';
diff --git a/lib/plugins/config/lang/ja/intro.txt b/lib/plugins/config/lang/ja/intro.txt
index 4d98dd3ed..29e3e7539 100644
--- a/lib/plugins/config/lang/ja/intro.txt
+++ b/lib/plugins/config/lang/ja/intro.txt
@@ -4,8 +4,8 @@
個々の設定に関しては[[doku>ja:config|DokuWiki の設定]]を参照してください。
このプラグインに関する詳細な情報は[[doku>ja:plugin:config|設定管理プラグイン]]を参照してください。
-背景が薄い赤の場合、その設定は変更することが出来ません。
-背景が青の場合はデフォルト設定、背景が白の場合はサイト固有の設定になっており、どちら設定も変更が可能です。
+背景が薄い赤の場合、その設定は保護されており、本プラグインを通して変更することは出来ません。
+背景が青の場合はデフォルト設定、背景が白の場合はサイト固有の設定になっており、どちらの場合でも変更が可能です。
設定の変更後は必ず **保存** ボタンを押して変更を確定してください。
ボタンを押さなかった場合、変更は破棄されます。
diff --git a/lib/plugins/config/lang/ja/lang.php b/lib/plugins/config/lang/ja/lang.php
index 9475f900f..76d254142 100644
--- a/lib/plugins/config/lang/ja/lang.php
+++ b/lib/plugins/config/lang/ja/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
+ * @author lempel <riverlempel@hotmail.com>
* @author Yuji Takenaka <webmaster@davilin.com>
* @author Christopher Smith <chris@jalakai.co.uk>
* @author Ikuo Obataya <i.obataya@gmail.com>
@@ -21,7 +23,7 @@ $lang['locked'] = '設定用ファイルを更新できません
ローカル設定ファイルの名前と権限を確認して下さい。';
$lang['danger'] = '危険:この設定を変更するとウィキや設定管理画面にアクセスできなくなる恐れがあります。';
$lang['warning'] = '注意:この設定を変更すると意図しない作動につながる可能性があります。';
-$lang['security'] = '警告:この設定を変更するとセキュリティに悪影響する恐れがあります。';
+$lang['security'] = 'セキュリティ警告:この設定を変更するとセキュリティに悪影響する恐れがあります。';
$lang['_configuration_manager'] = '設定管理';
$lang['_header_dokuwiki'] = 'DokuWiki';
$lang['_header_plugin'] = 'プラグイン';
@@ -35,52 +37,53 @@ $lang['_editing'] = '編集';
$lang['_links'] = 'リンク';
$lang['_media'] = 'メディア';
$lang['_notifications'] = '通知設定';
-$lang['_syndication'] = 'RSS配信設定';
+$lang['_syndication'] = '配信設定(RSS)';
$lang['_advanced'] = '高度な設定';
$lang['_network'] = 'ネットワーク';
$lang['_msg_setting_undefined'] = '設定のためのメタデータがありません。';
$lang['_msg_setting_no_class'] = '設定クラスがありません。';
+$lang['_msg_setting_no_known_class'] = 'クラス設定が利用出来ません。';
$lang['_msg_setting_no_default'] = '初期値が設定されていません。';
-$lang['title'] = 'WIKIタイトル';
-$lang['start'] = 'スタートページ名';
+$lang['title'] = 'Wikiタイトル(あなたの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['cookiedir'] = 'Cookie のパス。空欄にすると baseurl を使用します。';
+$lang['template'] = 'テンプレート(Wikiのデザイン)';
+$lang['tagline'] = 'キャッチフレーズ(テンプレートが対応している場合に有効)';
+$lang['sidebar'] = 'サイドバー用ページ名(テンプレートが対応している場合に有効。空欄でサイドバーを無効化します。)';
+$lang['license'] = '作成した内容をどのライセンスでリリースするか';
+$lang['savedir'] = 'データ保存用のディレクトリ';
+$lang['basedir'] = 'サーバのパス (例: <code>/dokuwiki/</code>)<br>空欄にすると自動的に検出します。';
+$lang['baseurl'] = 'サーバの URL (例: <code>http://www.yourserver.com</code>)<br>空欄にすると自動的に検出します。';
+$lang['cookiedir'] = 'Cookie のパス(空欄にすると baseurl を使用します。)';
$lang['dmode'] = 'フォルダ作成マスク';
$lang['fmode'] = 'ファイル作成マスク';
$lang['allowdebug'] = 'デバッグモード(<b>必要で無いときは無効にしてください</b>)';
-$lang['recent'] = '最近の変更表示数';
+$lang['recent'] = '最近の変更で1ページごとに表示する数';
$lang['recent_days'] = '最近の変更とする期間(日数)';
-$lang['breadcrumbs'] = 'トレース(パンくず)表示数';
-$lang['youarehere'] = '現在位置を表示';
+$lang['breadcrumbs'] = 'トレース(パンくず)表示数(0で無効化します)';
+$lang['youarehere'] = '現在位置を表示(こちらをオンにする場合、恐らく、上のオプションをオフにしたいとも思うでしょう)';
$lang['fullpath'] = 'ページのフッターに絶対パスを表示';
$lang['typography'] = 'タイポグラフィー変換';
$lang['dformat'] = '日付フォーマット(PHPの<a href="http://php.net/strftime">strftime</a>関数を参照)';
-$lang['signature'] = '署名';
+$lang['signature'] = 'エディターの署名ボタンで挿入する内容';
$lang['showuseras'] = '最終編集者の情報として表示する内容';
-$lang['toptoclevel'] = '目次 トップレベル見出し';
-$lang['tocminheads'] = '目次を生成するための最小見出し数';
-$lang['maxtoclevel'] = '目次 表示限度見出し';
-$lang['maxseclevel'] = '編集可能見出し';
-$lang['camelcase'] = 'キャメルケースリンク';
+$lang['toptoclevel'] = '目次のトップレベル見出し';
+$lang['tocminheads'] = '目次を生成する最小見出し数';
+$lang['maxtoclevel'] = '目次に表示する最大レベルの見出し';
+$lang['maxseclevel'] = '部分編集を有効にする最大レベルの見出し';
+$lang['camelcase'] = 'キャメルケースリンクを使う';
$lang['deaccent'] = 'ページ名の変換方法';
$lang['useheading'] = '最初の見出しをページ名とする';
-$lang['sneaky_index'] = 'デフォルトでは索引にすべての名前空間を表示しますが、この機能はユーザーに閲覧権限のない名前空間を非表示にします。ただし、閲覧が可能な副名前空間まで表示されなくなるため、ACLの設定が適正でない場合は索引機能が使えなくなる場合があります。';
-$lang['hidepages'] = '検索、サイトマップ、その他の自動インデックスの結果に表示しないページ(Regex)';
-$lang['useacl'] = 'アクセス管理を行う(ACL)';
-$lang['autopasswd'] = 'パスワードの自動生成(ACL)';
-$lang['authtype'] = '認証方法(ACL)';
-$lang['passcrypt'] = '暗号化方法(ACL)';
-$lang['defaultgroup'] = 'デフォルトグループ(ACL)';
-$lang['superuser'] = 'スーパーユーザー(ACL)';
-$lang['manager'] = 'マネージャー(特定の管理機能を使用可能なユーザーもしくはグループ)';
-$lang['profileconfirm'] = 'プロフィール変更時に現在のパスワードを要求(ACL)';
+$lang['sneaky_index'] = 'デフォルトでは索引にすべての名前空間を表示しますが、このオプションを有効にすると、ユーザーに閲覧権限のない名前空間を非表示にします。ただし、閲覧が可能な副名前空間まで表示されなくなるため、ACLの設定が適正でない場合は索引機能が使えなくなる場合があります。';
+$lang['hidepages'] = '検索、サイトマップ、その他の自動インデックスの結果に表示しないページ';
+$lang['useacl'] = 'アクセス管理(ACL)を行う';
+$lang['autopasswd'] = 'パスワードの自動生成';
+$lang['authtype'] = '認証方法';
+$lang['passcrypt'] = '暗号化方法';
+$lang['defaultgroup'] = 'デフォルトグループ(全てのユーザーがこのグループに属します。)';
+$lang['superuser'] = 'スーパーユーザー(ACL設定に関わらず全てのページと機能へのアクセス権を有します。グループ、ユーザー、もしくはそれらをカンマ区切りしたリスト(例:user1,@group1,user2)を入力して下さい。)';
+$lang['manager'] = 'マネージャー(特定の管理機能へのアクセス権を有します。グループ、ユーザー、もしくはそれらをカンマ区切りしたリスト(例:user1,@group1,user2)を入力して下さい。)';
+$lang['profileconfirm'] = 'プロフィール変更時に現在のパスワードを要求';
$lang['rememberme'] = 'ログイン用クッキーを永久に保持することを許可(ログインを保持)';
$lang['disableactions'] = 'DokuWiki の動作を無効にする';
$lang['disableactions_check'] = 'チェック';
@@ -90,64 +93,78 @@ $lang['disableactions_profile_delete'] = '自分のアカウントの抹消';
$lang['disableactions_other'] = 'その他の動作(カンマ区切り)';
$lang['disableactions_rss'] = 'XML 配信(RSS)';
$lang['auth_security_timeout'] = '認証タイムアウト設定(秒)';
-$lang['securecookie'] = 'クッキーをHTTPSにてセットする場合は、ブラウザよりHTTPS経由で送信された場合にみに制限しますか?ログインのみをSSLで行う場合は、この機能を無効にしてください。';
-$lang['remote'] = 'リモートAPIを有効化します。有効化するとXML-RPCまたは他の手段でwikiにアプリケーションがアクセスすることを許可します。';
-$lang['remoteuser'] = 'カンマ区切りで書かれたグループ名、またはユーザ名だけにリモートAPIへのアクセスを許可します。空白の場合は、すべてのユーザにアクセスを許可します。';
+$lang['securecookie'] = 'クッキーをHTTPSにてセットする場合は、ブラウザよりHTTPS経由で送信された場合にみに制限する(ログインのみをSSLで行う場合は、この機能を無効にしてください。)';
+$lang['remote'] = 'リモートAPIを有効化(有効化するとXML-RPCまたは他の手段でwikiにアプリケーションがアクセスすることを許可します。)';
+$lang['remoteuser'] = 'リモートAPIへのアクセス許可(カンマ区切りで指定されたグループ、またはユーザーに対してのみ許可します。空白の場合は、すべてのユーザにアクセスを許可します。)';
$lang['usewordblock'] = '単語リストに基づくスパムブロック';
-$lang['relnofollow'] = 'rel="nofollow"を付加';
+$lang['relnofollow'] = '外部リンクにrel="nofollow"を付加';
$lang['indexdelay'] = 'インデックスを許可(何秒後)';
$lang['mailguard'] = 'メールアドレス保護';
$lang['iexssprotect'] = 'アップロードファイルに悪意のあるJavaScriptやHTMLが含まれていないかチェックする';
$lang['usedraft'] = '編集中の自動保存(ドラフト)機能を使用';
-$lang['htmlok'] = 'HTML埋め込み';
-$lang['phpok'] = 'PHP埋め込み';
+$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['target____wiki'] = '内部リンクの表示先(target="……")';
+$lang['target____interwiki'] = 'InterWikiリンクの表示先(target="……")';
+$lang['target____extern'] = '外部リンクの表示先(target="……")';
+$lang['target____media'] = 'メディアリンクの表示先(target="……")';
+$lang['target____windows'] = 'Windowsリンクの表示先(target="……")';
+$lang['mediarevisions'] = 'メディアファイルの履歴を有効にする';
+$lang['refcheck'] = 'メディアファイルを削除する前に、それがまだ使われているかどうかチェックする';
$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['htmlmail'] = 'メールをテキスト形式ではなく、HTML形式で送信する。';
-$lang['sitemap'] = 'Googleサイトマップ作成頻度(日数)';
-$lang['rss_type'] = 'RSSフィード形式';
-$lang['rss_linkto'] = 'RSS内リンク先';
-$lang['rss_content'] = 'XMLフィードに何を表示させますか?';
-$lang['rss_update'] = 'RSSフィードの更新間隔(秒)';
-$lang['rss_show_summary'] = 'フィードのタイトルにサマリーを表示';
+$lang['fetchsize'] = 'fetch.phpが外部URLからダウンロードする内容(キャッシュ保存や、外部イメージのリサイズなど)の最大サイズ(バイト数指定)';
+$lang['subscribers'] = 'ユーザーがEメールで更新通知を受ける機能を有効にする';
+$lang['subscribe_time'] = '購読リストと概要を送信する期間(秒)<br>「最近の変更とする期間(recent_days)」で指定した期間より小さくしてください。';
+$lang['notify'] = '変更を常に通知する送信先メールアドレス';
+$lang['registernotify'] = '新規ユーザー登録を常に通知する送信先メールアドレス';
+$lang['mailfrom'] = 'メール自動送信時の送信元アドレス';
+$lang['mailreturnpath'] = '不届き通知を受け取るメールアドレス';
+$lang['mailprefix'] = '自動メールの題名に使用する接頭語(空欄の場合、Wikiタイトルが使用されます。)';
+$lang['htmlmail'] = 'メールをテキスト形式ではなく、HTML形式で送信する(見た目は良くなりますが、サイズは大きくなります。このオプションを無効にすると、プレーンテキストのみのメールを送信します。)';
+$lang['sitemap'] = 'Googleサイトマップ作成頻度(日数。0で無効化します。)';
+$lang['rss_type'] = 'XMLフィード形式';
+$lang['rss_linkto'] = 'XMLフィード内リンク先';
+$lang['rss_content'] = 'XMLフィードに表示する内容';
+$lang['rss_update'] = 'XMLフィードの更新間隔(秒)';
+$lang['rss_show_summary'] = 'XMLフィードのタイトルにサマリーを表示';
+$lang['rss_show_deleted'] = '削除されたフィードを含める';
$lang['rss_media'] = 'XMLフィードで、どんな種類の変更を記載するか';
-$lang['updatecheck'] = 'DokuWikiの更新とセキュリティに関する情報をチェックしますか? この機能は update.dokuwiki.org への接続が必要です。';
+$lang['rss_media_o_both'] = '両方';
+$lang['rss_media_o_pages'] = 'ページ';
+$lang['rss_media_o_media'] = 'メディア';
+$lang['updatecheck'] = 'DokuWikiの更新とセキュリティに関する情報をチェックする(この機能は update.dokuwiki.org への接続が必要です。)';
$lang['userewrite'] = 'URLの書き換え';
$lang['useslash'] = 'URL上の名前空間の区切りにスラッシュを使用';
$lang['sepchar'] = 'ページ名の単語区切り文字';
$lang['canonical'] = 'canonical URL(正準URL)を使用';
$lang['fnencode'] = '非アスキーファイル名のエンコーディング方法';
-$lang['autoplural'] = '自動複数形処理';
+$lang['autoplural'] = 'リンク内での自動複数形処理';
$lang['compression'] = 'アーカイブファイルの圧縮方法';
$lang['gzip_output'] = 'xhtmlに対するコンテンツ圧縮(gzip)を使用';
$lang['compress'] = 'CSSとJavaScriptを圧縮';
$lang['cssdatauri'] = 'HTTP リクエスト数によるオーバーヘッドを減らすため、CSS ファイルから参照される画像ファイルのサイズがここで指定するバイト数以内の場合は CSS ファイル内に Data URI として埋め込みます。 <code>400</code> から <code>600</code> バイトがちょうどよい値です。<code>0</code> を指定すると埋め込み処理は行われません。';
$lang['send404'] = '文書が存在しないページに"HTTP404/Page Not Found"を使用';
-$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['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['dnslookups'] = 'ページを編集しているユーザーのIPアドレスからホスト名を逆引きする。利用できるDNSサーバーがない、あるいはこの機能が不要な場合にはオフにします。';
-$lang['jquerycdn'] = 'コンテンツ・デリバリー・ネットワーク (CDN) の選択:jQuery と jQuery UI スクリプトを CDN からロードさせる場合には、追加的な HTTP リクエストが発生しますが、ブラウザキャッシュが使用されるため、表示速度の向上が期待できます。';
-$lang['jquerycdn_o_0'] = 'CDN を使用しない(または利用できない)';
+$lang['search_nslimit'] = '現在の名前空間 X 内のみ検索する<br>より下層の名前空間から検索が実行された場合、最初の名前空間 X がフィルターとして追加されます。';
+$lang['search_fragment'] = '部分検索の規定の動作を指定する';
+$lang['search_fragment_o_exact'] = '完全一致';
+$lang['search_fragment_o_starts_with'] = '前方一致';
+$lang['search_fragment_o_ends_with'] = '後方一致';
+$lang['search_fragment_o_contains'] = '部分一致';
+$lang['trustedproxy'] = '報告される真のクライアントIPに関して、ここで指定する正規表現に合う転送プロキシを信頼します。あらゆるプロキシを信頼する場合は、何も入力しないでおいて下さい。';
+$lang['_feature_flags'] = '機能フラグ';
+$lang['defer_js'] = 'ページのHTMLが解析されるまでJavascriptの実行を延期する(ページの読み込み速度が向上しますが、一部のプラグインが正常に動作しない可能性があります)';
+$lang['dnslookups'] = 'ページを編集しているユーザーのIPアドレスからホスト名を逆引きする(利用できるDNSサーバーがない、あるいはこの機能が不要な場合にはオフにします。)';
+$lang['jquerycdn'] = 'コンテンツ・デリバリー・ネットワーク (CDN) の選択(jQuery と jQuery UI スクリプトを CDN からロードさせる場合には、追加的な HTTP リクエストが発生しますが、ブラウザキャッシュが使用されるため、表示速度の向上が期待できます。)';
+$lang['jquerycdn_o_0'] = 'CDN を使用せず、ローカルデリバリーのみ使用する';
$lang['jquerycdn_o_jquery'] = 'CDN: code.jquery.com を使用';
$lang['jquerycdn_o_cdnjs'] = 'CDN: cdnjs.com を使用';
$lang['proxy____host'] = 'プロキシ - サーバー名';
@@ -156,12 +173,6 @@ $lang['proxy____user'] = 'プロキシ - ユーザー名';
$lang['proxy____pass'] = 'プロキシ - パスワード';
$lang['proxy____ssl'] = 'プロキシへの接続にsslを使用';
$lang['proxy____except'] = 'スキップするプロキシのURL正規表現';
-$lang['safemodehack'] = 'セーフモード対策を行う';
-$lang['ftp____host'] = 'FTP サーバー名(セーフモード対策)';
-$lang['ftp____port'] = 'FTP ポート(セーフモード対策)';
-$lang['ftp____user'] = 'FTP ユーザー名(セーフモード対策)';
-$lang['ftp____pass'] = 'FTP パスワード(セーフモード対策)';
-$lang['ftp____root'] = 'FTP ルートディレクトリ(セーフモード対策)';
$lang['license_o_'] = '選択されていません';
$lang['typography_o_0'] = '変換しない';
$lang['typography_o_1'] = '二重引用符(ダブルクオート)のみ';
@@ -170,9 +181,9 @@ $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_1'] = 'アクセント付きの文字からアクセントを取り除く';
$lang['deaccent_o_2'] = 'ローマ字化';
-$lang['gdlib_o_0'] = 'GDを利用できません';
+$lang['gdlib_o_0'] = 'GD Libが利用不可';
$lang['gdlib_o_1'] = 'バージョン 1.x';
$lang['gdlib_o_2'] = '自動検出';
$lang['rss_type_o_rss'] = 'RSS 0.91';
@@ -199,7 +210,7 @@ $lang['showuseras_o_loginname'] = 'ログイン名';
$lang['showuseras_o_username'] = 'ユーザーのフルネーム';
$lang['showuseras_o_username_link'] = 'user という InterWiki リンクになったユーザーのフルネーム';
$lang['showuseras_o_email'] = 'ユーザーのメールアドレス(メールガード設定による難読化)';
-$lang['showuseras_o_email_link'] = 'ユーザーのメールアドレスをリンクにする';
+$lang['showuseras_o_email_link'] = 'ユーザーのメールアドレスをmailtoリンクにする';
$lang['useheading_o_0'] = '使用しない';
$lang['useheading_o_navigation'] = 'ナビゲーションのみ';
$lang['useheading_o_content'] = 'Wikiの内容のみ';
diff --git a/lib/plugins/config/lang/ko/lang.php b/lib/plugins/config/lang/ko/lang.php
index cfca44278..2d2582a09 100644
--- a/lib/plugins/config/lang/ko/lang.php
+++ b/lib/plugins/config/lang/ko/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author pavement <pavement@rael.cc>
+ * @author Traend <Traend@ruu.kr>
* @author Seungheon Song <esketch@gmail.com>
* @author jk Lee
* @author dongnak <dongnak@gmail.com>
@@ -149,6 +151,7 @@ $lang['xsendfile'] = '웹 서버가 정적 파일을 제공할 수
$lang['renderer_xhtml'] = '주요 (xhtml) 위키 출력에 사용할 렌더러';
$lang['renderer__core'] = '%s (도쿠위키 코어)';
$lang['renderer__plugin'] = '%s (플러그인)';
+$lang['search_nslimit'] = '검색을 현재 X 네임스페이스로 제한하십시오. 더 깊은 네임스페이스 내의 페이지에서 검색을 실행하면 첫 번째 X 네임스페이스가 필터로 추가됩니다.';
$lang['dnslookups'] = '도쿠위키가 문서를 편집하는 사용자의 원격 IP 주소에 대한 호스트 이름을 조회합니다. 서버가 느리거나 DNS 서버를 작동하지 않거나 이 기능을 원하지 않으면, 이 옵션을 비활성화하세요';
$lang['jquerycdn'] = '제이쿼리(jQuery)와 제이쿼리UI 스크립트 파일을 컨텐츠전송네트워크(CDN)에서 불러와야만 합니까? 이것은 추가적인 HTTP요청을 합니다. 하지만 파일이 빨리 불러지고 캐쉬에 저장되게 할 수 있습니다.';
$lang['jquerycdn_o_0'] = '컨텐츠전송네트워크(CDN) 사용 안 함. 로컬 전송만 함';
@@ -160,12 +163,6 @@ $lang['proxy____user'] = '프록시 사용자 이름';
$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 포트';
-$lang['ftp____user'] = 'safemode hack의 FTP 사용자 이름';
-$lang['ftp____pass'] = 'safemode hack의 FTP 비밀번호';
-$lang['ftp____root'] = 'safemode hack의 FTP 루트 디렉터리';
$lang['license_o_'] = '선택하지 않음';
$lang['typography_o_0'] = '없음';
$lang['typography_o_1'] = '작은따옴표를 제외';
diff --git a/lib/plugins/config/lang/la/lang.php b/lib/plugins/config/lang/la/lang.php
index 515aa9551..dc926e5d3 100644
--- a/lib/plugins/config/lang/la/lang.php
+++ b/lib/plugins/config/lang/la/lang.php
@@ -127,12 +127,6 @@ $lang['proxy____user'] = 'Proxis nomen sodalis';
$lang['proxy____pass'] = 'Proxis tessera';
$lang['proxy____ssl'] = 'SSL ut connectas uti';
$lang['proxy____except'] = 'Verba, ut VRL inspicias, quibus Proxis non agnoscitur.';
-$lang['safemodehack'] = 'Ad tempus conseruatio apta facere';
-$lang['ftp____host'] = 'FTP computator seruitor ad tempus seruatis';
-$lang['ftp____port'] = 'FTP ianua ad tempus seruatis';
-$lang['ftp____user'] = 'FTP Sodalis ad tempus seruatis';
-$lang['ftp____pass'] = 'FTP tessera ad tempus seruatis';
-$lang['ftp____root'] = 'FTP domicilium ad tempus seruatis';
$lang['license_o_'] = 'Nihil electum';
$lang['typography_o_0'] = 'neuter';
$lang['typography_o_1'] = 'sine singulis uirgulis';
diff --git a/lib/plugins/config/lang/lt/lang.php b/lib/plugins/config/lang/lt/lang.php
index eff7f0e4a..f69ed6cf4 100644
--- a/lib/plugins/config/lang/lt/lang.php
+++ b/lib/plugins/config/lang/lt/lang.php
@@ -1,8 +1,11 @@
<?php
+
/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
* Lithuanian language file
*
- * @author audrius.klevas@gmail.com
+ * @author audrius.klevas <audrius.klevas@gmail.com>
* @author Arunas Vaitekunas <aras@fan.lt>
*/
$lang['lang'] = 'Kalba';
diff --git a/lib/plugins/config/lang/lv/lang.php b/lib/plugins/config/lang/lv/lang.php
index 8caba8ed3..893e9a72b 100644
--- a/lib/plugins/config/lang/lv/lang.php
+++ b/lib/plugins/config/lang/lv/lang.php
@@ -135,12 +135,6 @@ $lang['proxy____user'] = 'Proxy lietotāja vārds';
$lang['proxy____pass'] = 'Proxy parole';
$lang['proxy____ssl'] = 'Lietot SSL savienojumu ar proxy';
$lang['proxy____except'] = 'Regulārā izteiksme tiem URL, kam nevar lietot proxy.';
-$lang['safemodehack'] = 'Lietot safemode apeju';
-$lang['ftp____host'] = 'FTP serveris safemode apejai';
-$lang['ftp____port'] = 'FTP ports safemode apejai';
-$lang['ftp____user'] = 'FTP lietotājvārds safemode apejai';
-$lang['ftp____pass'] = 'FTP parole safemode apejai';
-$lang['ftp____root'] = 'FTP saknes diektorija safemode apejai';
$lang['license_o_'] = 'Ar nekādu';
$lang['typography_o_0'] = 'neko';
$lang['typography_o_1'] = 'tikai dubultpēdiņas';
diff --git a/lib/plugins/config/lang/mr/lang.php b/lib/plugins/config/lang/mr/lang.php
index 5dbb8ecee..a1b47c80e 100644
--- a/lib/plugins/config/lang/mr/lang.php
+++ b/lib/plugins/config/lang/mr/lang.php
@@ -128,12 +128,6 @@ $lang['proxy____port'] = 'छद्म ( proxy ) सर्वरचे
$lang['proxy____user'] = 'छद्म ( proxy ) सर्वरचे सदस्यनाम';
$lang['proxy____pass'] = 'छद्म ( proxy ) सर्वरचा पासवर्ड';
$lang['proxy____ssl'] = 'छद्म सर्वरला संपर्क साधण्यासाठी SSL वापरा';
-$lang['safemodehack'] = 'सेफमोड़ हॅक चालू करा';
-$lang['ftp____host'] = 'सेफमोड़ हॅक साठी FTP सर्वर';
-$lang['ftp____port'] = 'सेफमोड़ हॅक साठी FTP पोर्ट';
-$lang['ftp____user'] = 'सेफमोड़ हॅक साठी FTP सदस्यनाम';
-$lang['ftp____pass'] = 'सेफमोड़ हॅक साठी FTP पासवर्ड';
-$lang['ftp____root'] = 'सेफमोड़ हॅक साठी FTP मूळ डिरेक्टरी';
$lang['license_o_'] = 'काही निवडले नाही';
$lang['typography_o_0'] = 'काही नाही';
$lang['typography_o_1'] = 'फक्त दुहेरी अवतरण चिह्न';
diff --git a/lib/plugins/config/lang/nl/lang.php b/lib/plugins/config/lang/nl/lang.php
index 8fdd76c03..6346143b6 100644
--- a/lib/plugins/config/lang/nl/lang.php
+++ b/lib/plugins/config/lang/nl/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author PBU <pbu@xs4all.nl>
+ * @author Gerrit Uitslag <klapinklapin@gmail.com>
* @author Harriet Neitz <harrietneitz@gmail.com>
* @author mark prins <mprins@users.sf.net>
* @author Pieter van der Meulen <pieter@vdmeulen.net>
@@ -14,7 +16,6 @@
* @author Marijn Hofstra <hofstra.m@gmail.com>
* @author Timon Van Overveldt <timonvo@gmail.com>
* @author Ricardo Guijt <ricardoguijt@gmail.com>
- * @author Gerrit <klapinklapin@gmail.com>
* @author Hugo Smet <hugo.smet@scarlet.be>
*/
$lang['menu'] = 'Configuratie-instellingen';
@@ -43,6 +44,7 @@ $lang['_advanced'] = 'Geavanceerde instellingen';
$lang['_network'] = 'Netwerkinstellingen';
$lang['_msg_setting_undefined'] = 'Geen metadata voor deze instelling.';
$lang['_msg_setting_no_class'] = 'Geen class voor deze instelling.';
+$lang['_msg_setting_no_known_class'] = 'Setting class niet beschikbaar';
$lang['_msg_setting_no_default'] = 'Geen standaard waarde.';
$lang['title'] = 'Titel van de wiki';
$lang['start'] = 'Naam startpagina';
@@ -153,10 +155,12 @@ $lang['renderer_xhtml'] = 'Weergavesysteem voor de standaard (xhtml) wiki
$lang['renderer__core'] = '%s (dokuwiki core)';
$lang['renderer__plugin'] = '%s (plugin)';
$lang['search_nslimit'] = 'Beperk het zoeken tot de huidige X namespaces. Wanneer het zoeken wordt uitgevoerd vanaf een pagina binnen een diepere namespace, worden de eerste X aantal namespaces toegevoegd als filter';
+$lang['search_fragment'] = 'Specifeer het standaard zoekgedrag voor fragmenten';
$lang['search_fragment_o_exact'] = 'exact';
$lang['search_fragment_o_starts_with'] = 'begint met';
$lang['search_fragment_o_ends_with'] = 'eindigt op';
$lang['search_fragment_o_contains'] = 'bevat';
+$lang['trustedproxy'] = 'Vertrouw op doorstuurproxy\'s die overeenkomen met deze reguliere expressie over het echte client-IP dat ze rapporteren. De standaard komt overeen met lokale netwerken. Laat leeg om geen proxy te vertrouwen.';
$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['jquerycdn'] = 'Moet er een CDN gebruikt worden om de jQuery en jQuery UI bestanden te laden. Dit zorgt voor extra HTTP verzoeken, maar bestanden laden mogelijk sneller en zitten misschien al in de cache van de gebruiker.';
$lang['jquerycdn_o_0'] = 'Geen CDN gebruiken';
@@ -168,12 +172,6 @@ $lang['proxy____user'] = 'Proxy gebruikersnaam';
$lang['proxy____pass'] = 'Proxy wachtwoord';
$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';
-$lang['ftp____user'] = 'FTP gebruikersnaam voor safemode hack';
-$lang['ftp____pass'] = 'FTP wachtwoord voor safemode hack';
-$lang['ftp____root'] = 'FTP root directory voor safemode hack';
$lang['license_o_'] = 'Geen gekozen';
$lang['typography_o_0'] = 'geen';
$lang['typography_o_1'] = 'Alleen dubbele aanhalingstekens';
diff --git a/lib/plugins/config/lang/no/lang.php b/lib/plugins/config/lang/no/lang.php
index ae612807c..a20415f0e 100644
--- a/lib/plugins/config/lang/no/lang.php
+++ b/lib/plugins/config/lang/no/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Torgeir Blesvik <bletor@banenor.no>
+ * @author Rut Kristin Aanestad <dark@met.no>
+ * @author ThorPrestboen <thor.erling.prestboen@gmail.com>
+ * @author Christian McKenna <mckchr@banenor.no>
* @author Thomas Nygreen <nygreen@gmail.com>
* @author Arild Burud <arildb@met.no>
* @author Torkill Bruland <torkar-b@online.no>
@@ -12,12 +16,10 @@
* @author Knut Staring <knutst@gmail.com>
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
- * @author Rune Rasmussen syntaxerror.no@gmail.com
+ * @author Rune Rasmussen <syntaxerror.no@gmail.com>
* @author Jon Bøe <jonmagneboe@hotmail.com>
* @author Egil Hansen <egil@rosetta.no>
* @author Arne Hanssen <arne.hanssen@getmail.no>
- * @author Arne Hanssen <arnehans@getmail.no>
* @author Patrick Sletvold <patricksletvold@hotmail.com>
*/
$lang['menu'] = 'Konfigurasjonsinnstillinger';
@@ -163,12 +165,6 @@ $lang['proxy____user'] = 'Brukernavn på proxyserver';
$lang['proxy____pass'] = 'Passord på proxyserver';
$lang['proxy____ssl'] = 'Bruk SSL for å koble til proxyserver';
$lang['proxy____except'] = 'Regulært uttrykk for URLer som ikke trenger bruk av proxy';
-$lang['safemodehack'] = 'Bruk safemode-hack';
-$lang['ftp____host'] = 'FTP-server for safemode-hack';
-$lang['ftp____port'] = 'FTP-port for safemode-hack';
-$lang['ftp____user'] = 'FTP-brukernavn for safemode-hack';
-$lang['ftp____pass'] = 'FTP-passord for safemode-hack';
-$lang['ftp____root'] = 'FTP-rotmappe for safemode-hack';
$lang['license_o_'] = 'Ingen valgt';
$lang['typography_o_0'] = 'ingen';
$lang['typography_o_1'] = 'Kun doble anførselstegn';
diff --git a/lib/plugins/config/lang/pl/lang.php b/lib/plugins/config/lang/pl/lang.php
index 0a3df552d..55790ce0e 100644
--- a/lib/plugins/config/lang/pl/lang.php
+++ b/lib/plugins/config/lang/pl/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Bartek S <sadupl@gmail.com>
* @author Wojciech Lichota <wojciech@lichota.pl>
* @author Max <maxrb146@gmail.com>
* @author Grzegorz Żur <grzegorz.zur@gmail.com>
@@ -153,6 +154,11 @@ $lang['xsendfile'] = 'Użyj nagłówka HTTP X-Sendfile w celu przesy
$lang['renderer_xhtml'] = 'Mechanizm renderowania głównej treści strony (xhtml)';
$lang['renderer__core'] = '%s (dokuwiki)';
$lang['renderer__plugin'] = '%s (wtyczka)';
+$lang['search_fragment'] = 'Określ domyślne zachowanie wyszukiwania fragmentów';
+$lang['search_fragment_o_exact'] = 'dokładny';
+$lang['search_fragment_o_starts_with'] = 'zaczyna się z';
+$lang['search_fragment_o_ends_with'] = 'kończy się z';
+$lang['search_fragment_o_contains'] = 'zawiera';
$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['jquerycdn'] = 'Czy pliki skryptów jQuery i jQuery UI powinny być ładowane z CDN? Powoduje to dodanie dodatkowych żądań HTTP, ale pliki mogą być ładowane szybciej, a użytkownicy mogą już je mieć zbuforowane.';
$lang['jquerycdn_o_0'] = 'Bez CDN, tylko lokalne zasoby';
@@ -164,12 +170,6 @@ $lang['proxy____user'] = 'Proxy - nazwa użytkownika';
$lang['proxy____pass'] = 'Proxy - hasło';
$lang['proxy____ssl'] = 'Proxy - SSL';
$lang['proxy____except'] = 'Wyrażenie regularne określające adresy URL, do których nie należy używać proxy.';
-$lang['safemodehack'] = 'Bezpieczny tryb (przez FTP)';
-$lang['ftp____host'] = 'FTP - serwer';
-$lang['ftp____port'] = 'FTP - port';
-$lang['ftp____user'] = 'FTP - nazwa użytkownika';
-$lang['ftp____pass'] = 'FTP - hasło';
-$lang['ftp____root'] = 'FTP - katalog główny';
$lang['license_o_'] = 'Nie wybrano żadnej';
$lang['typography_o_0'] = 'brak';
$lang['typography_o_1'] = 'tylko podwójne cudzysłowy';
diff --git a/lib/plugins/config/lang/pt-br/lang.php b/lib/plugins/config/lang/pt-br/lang.php
index fe532fbcb..57de8bb7c 100644
--- a/lib/plugins/config/lang/pt-br/lang.php
+++ b/lib/plugins/config/lang/pt-br/lang.php
@@ -3,7 +3,11 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Davi Jorge <davimoises2015@hotmail.com>
+ * @author Schopf <pschopf@gmail.com>
* @author Frederico Gonçalves Guimarães <frederico@teia.bio.br>
+ * @author Márcio Gomes Gonçalves <gomes@metha.com.br>
* @author Felipe Castro <fefcas@gmail.com>
* @author Lucien Raven <lucienraven@yahoo.com.br>
* @author Enrico Nicoletto <liverig@gmail.com>
@@ -46,6 +50,7 @@ $lang['_advanced'] = 'Configurações avançadas';
$lang['_network'] = 'Configurações de rede';
$lang['_msg_setting_undefined'] = 'Nenhum metadado configurado.';
$lang['_msg_setting_no_class'] = 'Nenhuma classe definida.';
+$lang['_msg_setting_no_known_class'] = 'Classe de configuração não disponível.';
$lang['_msg_setting_no_default'] = 'Nenhum valor padrão.';
$lang['title'] = 'Título do wiki';
$lang['start'] = 'Nome da página inicial';
@@ -134,6 +139,7 @@ $lang['rss_linkto'] = 'Os links da fonte XML apontam para';
$lang['rss_content'] = 'O que deve ser exibido nos itens da fonte XML?';
$lang['rss_update'] = 'Intervalo de atualização da fonte XML (seg)';
$lang['rss_show_summary'] = 'Resumo de exibição da fonte XML no título';
+$lang['rss_show_deleted'] = 'Feed XML Mostrar feeds excluídos';
$lang['rss_media'] = 'Que tipo de alterações devem ser listadas na fonte XML?';
$lang['rss_media_o_both'] = 'ambos';
$lang['rss_media_o_pages'] = 'páginas';
@@ -155,6 +161,15 @@ $lang['xsendfile'] = 'Usar o cabeçalho "X-Sendfile" para permitir q
$lang['renderer_xhtml'] = 'Renderizador a ser utilizado para a saída principal (xhtml) do wiki';
$lang['renderer__core'] = '%s (núcleo do DokuWiki)';
$lang['renderer__plugin'] = '%s ("plug-in")';
+$lang['search_nslimit'] = 'Limite a pesquisa aos atuais X espaços de nomes. Quando uma pesquisa é executada a partir de uma página em um espaço de nomes mais interno, os primeiros X espaços de nomes serão adicionados como filtro';
+$lang['search_fragment'] = 'Especifique o comportamento padrão da pesquisa de fragmentos';
+$lang['search_fragment_o_exact'] = 'exato';
+$lang['search_fragment_o_starts_with'] = 'começa com';
+$lang['search_fragment_o_ends_with'] = 'termina com';
+$lang['search_fragment_o_contains'] = 'contém';
+$lang['trustedproxy'] = 'Confie nos proxies de encaminhamento que correspondem a essa expressão regular sobre o verdadeiro IP do cliente que eles relatam. O padrão corresponde às redes locais. Deixe em branco para não confiar em proxy.';
+$lang['_feature_flags'] = 'Sinalizadores de recursos';
+$lang['defer_js'] = 'Adie o javascript para ser executado após a análise do HTML da página. Melhora a velocidade percebida da página, mas pode interromper um pequeno número de plugins.';
$lang['dnslookups'] = 'O DokuWiki procurará pelo nome de host dos endereços IP remotos dos usuários que estão editando as páginas. Caso você tenha um DNS lento, ele não esteja funcionando ou, ainda, você não queira esse recurso, desabilite essa opção.';
$lang['jquerycdn'] = 'Os scripts jQuery e jQuery UI devem ser carregados a partir de uma CND? Isso adiciona requisições HTTP adicionais, mas os arquivos podem carregar mais rapidamente e os usuários podem já tê-los no cache.';
$lang['jquerycdn_o_0'] = 'Sem CDN, somente entrega local';
@@ -166,12 +181,6 @@ $lang['proxy____user'] = 'Nome de usuário do proxy';
$lang['proxy____pass'] = 'Senha do proxy';
$lang['proxy____ssl'] = 'Usar SSL para conectar ao proxy';
$lang['proxy____except'] = 'Expressões regulares de URL para excessão de proxy.';
-$lang['safemodehack'] = 'Habilitar o contorno de segurança';
-$lang['ftp____host'] = 'Servidor FTP para o contorno de segurança';
-$lang['ftp____port'] = 'Porta do FTP para o contorno de segurança';
-$lang['ftp____user'] = 'Nome do usuário FTP para o contorno de segurança';
-$lang['ftp____pass'] = 'Senha do usuário FTP para o contorno de segurança';
-$lang['ftp____root'] = 'Diretório raiz do FTP para o contorno de segurança';
$lang['license_o_'] = 'Nenhuma escolha';
$lang['typography_o_0'] = 'nenhuma';
$lang['typography_o_1'] = 'excluir aspas simples';
diff --git a/lib/plugins/config/lang/pt/intro.txt b/lib/plugins/config/lang/pt/intro.txt
index 06a68c475..29e17d6b4 100644
--- a/lib/plugins/config/lang/pt/intro.txt
+++ b/lib/plugins/config/lang/pt/intro.txt
@@ -1,7 +1,7 @@
====== Gerenciador de Configurações ======
-Use esta página para controlar as definições da instalação do seu DokuWiki. Para ajuda acerca dos itens, consulte [[doku>config]]. Para mais detalhes sobre este plugin, veja [[doku>plugin:config]].
+Use esta página para controlar as definições da instalação do seu DokuWiki. Para ajuda em itens individuais, consulte [[doku>config]]. Para mais detalhes sobre este plugin, veja [[doku>plugin:config]].
Definições que apresentem um fundo vermelho claro são protegidas e não podem ser alteradas com este plugin. Definições com um fundo azul são padrão e definições com um fundo branco foram configuradas localmente para essa instalação em particular. Tanto as definições em azul como em branco podem ser alteradas.
-Lembre-se de pressionar o botão **Guardar** antes de sair desta página, caso contrário, as suas definições serão perdidas.
+Lembre-se de pressionar o botão **Salvar** antes de sair desta página, caso contrário, as suas definições serão perdidas.
diff --git a/lib/plugins/config/lang/pt/lang.php b/lib/plugins/config/lang/pt/lang.php
index ba0ab0b3c..3fb851b28 100644
--- a/lib/plugins/config/lang/pt/lang.php
+++ b/lib/plugins/config/lang/pt/lang.php
@@ -3,159 +3,184 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
+ * @author Mario AlexandTeixeira dos Santos <masterofclan@gmail.com>
+ * @author Maykon Oliveira <maykonoliveira850@gmail.com>
+ * @author José Vieira <jmsv63@gmail.com>
* @author José Monteiro <Jose.Monteiro@DoWeDo-IT.com>
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
- * @author José Campos zecarlosdecampos@gmail.com
+ * @author José Campos <zecarlosdecampos@gmail.com>
* @author Paulo Carmino <contato@paulocarmino.com>
* @author Alfredo Silva <alfredo.silva@sky.com>
* @author Guilherme Sá <guilherme.sa@hotmail.com>
*/
-$lang['menu'] = 'Configuração';
-$lang['error'] = 'Parâmetros de Configuração não actualizados devido a valores inválidos. Por favor, reveja as modificações que pretende efectuar antes de re-submetê-las.<br /> Os valores incorrectos serão mostrados dentro de uma "moldura" vermelha.';
-$lang['updated'] = 'Parâmetros de Configuração actualizados com sucesso.';
+$lang['menu'] = 'Configurações';
+$lang['error'] = 'Parâmetros de configuração não atualizados devido a valores inválidos. Reveja as modificações que pretende efetuar antes de re-submetê-las.<br />Os valores incorretos serão mostrados dentro de uma "moldura" vermelha.';
+$lang['updated'] = 'Parâmetros de configuração atualizados.';
$lang['nochoice'] = '(não existem outras escolhas disponíveis)';
-$lang['locked'] = 'O ficheiro de configuração não pôde ser actualizado, se isso foi não intencional, <br />certifique-se que o nome e as permissões do ficheiro de configuração estejam correctas.
+$lang['locked'] = 'O arquivo de configuração não pôde ser atualizado, se isso foi não intencional, <br />certifique-se que o nome e as permissões do arquivo de configuração estejam corretos.
';
-$lang['danger'] = 'Perigo: Alterar esta opção poderá tornar o seu wiki e o menu de configuração inacessíveis.';
+$lang['danger'] = 'Perigo: Alterar esta opção poderá tornar seu wiki e o menu de configuração inacessíveis.';
$lang['warning'] = 'Aviso: A alteração desta opção poderá causar comportamento involuntário.';
-$lang['security'] = 'Aviso de segurança: Alterar esta opção pode apresentar um risco de segurança.';
-$lang['_configuration_manager'] = 'Gestor de Parâmetros de Configuração';
-$lang['_header_dokuwiki'] = 'Parâmetros DokuWiki';
-$lang['_header_plugin'] = 'Parâmetros dos Plugins';
-$lang['_header_template'] = 'Parâmetros das Templates';
-$lang['_header_undefined'] = 'Parâmetros não definidos';
-$lang['_basic'] = 'Configurações Básicas';
-$lang['_display'] = 'Configuração de Apresentação';
-$lang['_authentication'] = 'Configuração de Autenticação';
-$lang['_anti_spam'] = 'Configuração Anti-Spam';
-$lang['_editing'] = 'Configuração de Edição';
-$lang['_links'] = 'Configuração de Ligações';
-$lang['_media'] = 'Configuração de Media';
+$lang['security'] = 'Aviso de Segurança: Alterar esta opção pode apresentar um risco de segurança.';
+$lang['_configuration_manager'] = 'Gerenciamento de Configuração';
+$lang['_header_dokuwiki'] = 'DokuWiki';
+$lang['_header_plugin'] = 'Plugins';
+$lang['_header_template'] = 'Modelos';
+$lang['_header_undefined'] = 'Configurações não Definidas';
+$lang['_basic'] = 'Básicas';
+$lang['_display'] = 'Apresentação';
+$lang['_authentication'] = 'Autenticação';
+$lang['_anti_spam'] = 'Anti-Spam';
+$lang['_editing'] = 'Edição';
+$lang['_links'] = 'Links';
+$lang['_media'] = 'Mídia';
$lang['_notifications'] = 'Notificação';
$lang['_syndication'] = 'Sindicação (RSS)';
-$lang['_advanced'] = 'Configurações Avançadas';
-$lang['_network'] = 'Configuração de Rede';
-$lang['_msg_setting_undefined'] = 'Nenhum metadado configurado.';
+$lang['_advanced'] = 'Avançadas';
+$lang['_network'] = 'Rede';
+$lang['_msg_setting_undefined'] = 'Nenhum metadado definido.';
$lang['_msg_setting_no_class'] = 'Nenhuma classe definida.';
-$lang['_msg_setting_no_default'] = 'Sem valor por omissão.';
+$lang['_msg_setting_no_known_class'] = 'Classe de configuração não disponível.';
+$lang['_msg_setting_no_default'] = 'Sem valor padrão.';
$lang['title'] = 'Título deste Wiki';
$lang['start'] = 'Nome da Página Inicial';
$lang['lang'] = 'Idioma';
-$lang['template'] = 'Template';
+$lang['template'] = 'Modelo';
+$lang['tagline'] = 'Slogan (se o modelo for compatível)';
+$lang['sidebar'] = 'Nome da página da barra lateral (se o modelo for compatível). Um campo vazio desativará a barra lateral';
$lang['license'] = 'Sob que licença o seu conteúdo deverá ser disponibilizado?';
-$lang['savedir'] = 'Pasta para guardar dados';
-$lang['basedir'] = 'Pasta Base';
-$lang['baseurl'] = 'URL Base';
+$lang['savedir'] = 'Pasta para salvar dados';
+$lang['basedir'] = 'Caminho do servidor (ex. <code>/dokuwiki/</code>). Deixe em branco para auto detecção.';
+$lang['baseurl'] = 'URL do servidor (ex. <code>http://www.yourserver.com</code>). Deixe em branco para auto detecção.';
+$lang['cookiedir'] = 'Caminho do cookie. Deixe em branco para usar a baseurl.';
$lang['dmode'] = 'Modo de criação de pastas.';
-$lang['fmode'] = 'Modo de criação de ficheiros.';
+$lang['fmode'] = 'Modo de criação de arquivos.';
$lang['allowdebug'] = 'Permitir depuração <b>desabilite se não for necessário!</b>';
-$lang['recent'] = 'Alterações recentes';
+$lang['recent'] = 'Número de entradas por página em alterações recentes';
$lang['recent_days'] = 'Quantas mudanças recentes devem ser mantidas? (dias)';
$lang['breadcrumbs'] = 'Número máximo de breadcrumbs';
-$lang['youarehere'] = 'Breadcrumbs hierárquicas';
-$lang['fullpath'] = 'Revelar caminho completo no rodapé';
+$lang['youarehere'] = 'Usar breadcrumbs hierárquicas (você provavelmente irá querer desativar a opção acima então)';
+$lang['fullpath'] = 'Mostrar o caminho completo das páginas no rodapé';
$lang['typography'] = 'Executar substituições tipográficas';
$lang['dformat'] = 'Formato de Data (ver função PHP\'s <a href="http://php.net/strftime">strftime</a>)';
-$lang['signature'] = 'Assinatura';
+$lang['signature'] = 'O que inserir quando clicar no botão de assinatura do editor';
$lang['showuseras'] = 'O que exibir quando mostrar o utilizador que editou a página pela última vez';
$lang['toptoclevel'] = 'Nível de topo para a tabela de conteúdo';
$lang['tocminheads'] = 'Quantidade mínima de cabeçalhos para a construção da tabela de conteúdos.';
-$lang['maxtoclevel'] = 'Máximo nível para a tabela de conteúdo';
-$lang['maxseclevel'] = 'Máximo nível para editar secção';
-$lang['camelcase'] = 'Usar CamelCase';
-$lang['deaccent'] = 'Nomes das páginas sem acentos';
+$lang['maxtoclevel'] = 'Nível máximo para a tabela de conteúdo';
+$lang['maxseclevel'] = 'Nível máximo para editar seção';
+$lang['camelcase'] = 'Usar CamelCase para links';
+$lang['deaccent'] = 'Como limpar nomes de páginas';
$lang['useheading'] = 'Usar o primeiro cabeçalho para o nome da página';
-$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['hidepages'] = 'Esconder páginas correspondentes (expressões regulares)';
-$lang['useacl'] = 'Usar ACL - Listas de Controlo de Acessos';
+$lang['sneaky_index'] = 'Por padrão, o DokuWiki irá exibir todos os namespaces na visualização do índice. Ao ativar essa opção, serão escondidos aqueles em que o utilizador não tenha permissão de leitura. Isto pode resultar na ocultação de subnamespaces acessíveis, o que poderá tornar o índice inútil para certas configurações de ACL.';
+$lang['hidepages'] = 'Esconder páginas correspondentes com expressões regulares da pesquisa, índice e outros índices automáticos';
+$lang['useacl'] = 'Usar listas de controle de acesso';
$lang['autopasswd'] = 'Auto-gerar senhas';
$lang['authtype'] = 'Método de autenticação';
-$lang['passcrypt'] = 'Método de cifragem da senha';
-$lang['defaultgroup'] = 'Grupo por omissão';
-$lang['superuser'] = 'Superutilizador - um grupo, utilizador ou uma lista separada por vírgulas usuário1,@grupo1,usuário2 que tem acesso completo a todas as páginas e funções, independente das definições da ACL';
-$lang['manager'] = 'Gestor - um grupo, utilizador ou uma lista separada por vírgulas usuário1,@grupo1,usuário2 que tem acesso a certas funções de gestão';
+$lang['passcrypt'] = 'Método de criptografia da senha';
+$lang['defaultgroup'] = 'Grupo padrão onde novos usuários serão colocados';
+$lang['superuser'] = 'Superusuário - um grupo, utilizador ou uma lista separada por vírgulas usuário1,@grupo1,usuário2 que tem acesso completo a todas as páginas e funções, independente das definições da ACL';
+$lang['manager'] = 'Gerenciador - um grupo, utilizador ou uma lista separada por vírgulas usuário1,@grupo1,usuário2 que tem acesso a certas funções de gerenciamento';
$lang['profileconfirm'] = 'Confirmar mudanças no perfil com a senha';
-$lang['rememberme'] = 'Permitir cookies de autenticação permanentes (Memorizar?)';
-$lang['disableactions'] = 'Desactivar acções DokuWiki';
-$lang['disableactions_check'] = 'Checar';
-$lang['disableactions_subscription'] = 'Subscrever/Não Subscrver';
-$lang['disableactions_wikicode'] = 'Ver fonte/Exportar em bruto';
-$lang['disableactions_profile_delete'] = 'Deletar Sua Conta.';
-$lang['disableactions_other'] = 'Outras acções (separadas por vírgula)';
+$lang['rememberme'] = 'Permitir cookies de login permanentes (lembrar-me)';
+$lang['disableactions'] = 'Desativar ações DokuWiki';
+$lang['disableactions_check'] = 'Verificar';
+$lang['disableactions_subscription'] = 'Subscrever/Des-subscrever';
+$lang['disableactions_wikicode'] = 'Ver fonte/Exportar Direto';
+$lang['disableactions_profile_delete'] = 'Excluir Sua Conta';
+$lang['disableactions_other'] = 'Outras ações (separadas por vírgula)';
$lang['disableactions_rss'] = 'Sindicação XML (RSS)';
-$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['auth_security_timeout'] = 'Tempo Limite para Autenticações (segundos)';
+$lang['securecookie'] = 'Os cookies definidos via HTTPS deverão ser enviados para o navegador somente via HTTPS? Desative 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['remote'] = 'Ativar o sistema de API remota. Isso permite que outros aplicativos acessem o wiki via XML-RPC ou outros mecanismos.';
+$lang['remoteuser'] = 'Restringe o acesso remoto da API aos grupos separados por vírgula ou aos usuários fornecidos aqui. Deixe em branco para dar acesso a todos.';
$lang['usewordblock'] = 'Bloquear spam baseado em lista de palavras (wordlist)';
$lang['relnofollow'] = 'Usar rel="nofollow" em links externos';
$lang['indexdelay'] = 'Tempo de espera antes da indexação (seg)';
$lang['mailguard'] = 'Obscurecer endereços de email';
$lang['iexssprotect'] = 'Verificar os arquivos enviados contra possíveis códigos maliciosos em HTML ou JavaScript';
-$lang['usedraft'] = 'Guardar o rascunho automaticamente durante a edição';
-$lang['htmlok'] = 'Permitir embeber HTML';
-$lang['phpok'] = 'Permitir embeber PHP';
-$lang['locktime'] = 'Idade máxima para locks (seg.)';
-$lang['cachetime'] = 'Idade máxima para cache (seg.)';
+$lang['usedraft'] = 'Salvar o rascunho automaticamente durante a edição';
+$lang['htmlok'] = 'Permitir incorporar HTML';
+$lang['phpok'] = 'Permitir incorporar PHP';
+$lang['locktime'] = 'Idade máxima para arquivos de lock (seg)';
+$lang['cachetime'] = 'Idade máxima para cache (seg)';
$lang['target____wiki'] = 'Parâmetro "target" para links internos';
$lang['target____interwiki'] = 'Parâmetro "target" para links entre wikis';
$lang['target____extern'] = 'Parâmetro "target" para links externos';
$lang['target____media'] = 'Parâmetro "target" para links de media';
$lang['target____windows'] = 'Parâmetro "target" para links do Windows';
$lang['mediarevisions'] = 'Ativar Mediarevisions?';
-$lang['refcheck'] = 'Verificação de referência da media';
+$lang['refcheck'] = 'Verificar se a mídia está em uso antes de excluí-la';
$lang['gdlib'] = 'Versão GD Lib';
$lang['im_convert'] = 'Caminho para a ferramenta "convert" do ImageMagick';
$lang['jpg_quality'] = 'Compressão/Qualidade JPG (0-100)';
-$lang['fetchsize'] = 'Tamanho máximo (bytes) que o fetch.php pode transferir do exterior';
-$lang['subscribers'] = 'Habilitar o suporte a subscrição de páginas ';
-$lang['subscribe_time'] = 'Tempo após o qual as listas de subscrição e "digests" são enviados (seg.); Isto deve ser inferior ao tempo especificado em recent_days.';
-$lang['notify'] = 'Enviar notificações de mudanças para este endereço de email';
-$lang['registernotify'] = 'Enviar informações de utilizadores registados para este endereço de email';
-$lang['mailfrom'] = 'Endereço de email a ser utilizado para mensagens automáticas';
-$lang['mailprefix'] = 'Prefixo de email a ser utilizado para mensagens automáticas';
-$lang['sitemap'] = 'Gerar Sitemap Google (dias)';
+$lang['fetchsize'] = 'Tamanho máximo (bytes) que o fetch.php pode baixar de URLs externas, ex. para cache e redimensionamento de imagens externas.';
+$lang['subscribers'] = 'Habilitar o suporte a subscrição de páginas por e-mail';
+$lang['subscribe_time'] = 'Tempo após o qual as listas de subscrição e "digests" são enviados (seg); Isto deve ser inferior ao tempo especificado em recent_days.';
+$lang['notify'] = 'Sempre enviar notificações de mudanças para este endereço de e-mail';
+$lang['registernotify'] = 'Sempre enviar informações de usuários registados para este endereço de e-mail';
+$lang['mailfrom'] = 'Endereço de e-mail a ser utilizado para mensagens automáticas';
+$lang['mailreturnpath'] = 'Endereço de e-mail do destinatário para notificações não entregues';
+$lang['mailprefix'] = 'Prefixo de e-mail a ser utilizado para mensagens automáticas. Deixe em branco para usar o título do wiki';
+$lang['htmlmail'] = 'Envie e-mails multipartes em HTML para uma melhor aparência, mas maiores em tamanho. Desative para mensagens em texto simples.';
+$lang['sitemap'] = 'Gerar sitemap Google frequentemente (dias). 0 para desativar';
$lang['rss_type'] = 'Tipo de feed XML';
-$lang['rss_linkto'] = 'Links de feed XML ara';
+$lang['rss_linkto'] = 'Links de feed XML para';
$lang['rss_content'] = 'O que deve ser exibido nos itens do alimentador XML?';
-$lang['rss_update'] = 'Intervalo de actualização do alimentador XML (seg)';
-$lang['rss_show_summary'] = 'Resumo de exibição do alimentador XML no título';
-$lang['updatecheck'] = 'Verificar por actualizações e avisos de segurança? O DokuWiki precisa contactar o "splitbrain.org" para efectuar esta verificação.';
+$lang['rss_update'] = 'Intervalo de atualização do feed XML (seg)';
+$lang['rss_show_summary'] = 'Resumo de exibição do feed XML no título';
+$lang['rss_show_deleted'] = 'O feed XML mostra feeds excluídos';
+$lang['rss_media'] = 'Que tipo de alterações devem ser listadas no feed XML?';
+$lang['rss_media_o_both'] = 'ambos';
+$lang['rss_media_o_pages'] = 'páginas';
+$lang['rss_media_o_media'] = 'mídia';
+$lang['updatecheck'] = 'Verificar por atualizações e avisos de segurança? O DokuWiki precisa contactar o "splitbrain.org" para efetuar esta verificação.';
$lang['userewrite'] = 'Usar URLs SEO';
-$lang['useslash'] = 'Usar a barra como separador de espaços de nomes nas URLs';
+$lang['useslash'] = 'Usar a barra como separador de namespaces nas URLs';
$lang['sepchar'] = 'Separador de palavras no nome da página';
-$lang['canonical'] = 'Usar URLs absolutas (http://servidor/caminho)';
-$lang['fnencode'] = 'Método de codificar nomes de ficheiro não-ASCII.';
+$lang['canonical'] = 'Usar URLs absolutas';
+$lang['fnencode'] = 'Método de codificar nomes de arquivo não-ASCII.';
$lang['autoplural'] = 'Verificar formas plurais nos links';
-$lang['compression'] = 'Método de compressão para histórico';
-$lang['gzip_output'] = 'Usar "Content-Encoding" do gzip para o código xhtml';
+$lang['compression'] = 'Método de compressão para arquivos attic';
+$lang['gzip_output'] = 'Usar Content-Encoding do gzip para código xhtml';
$lang['compress'] = 'Compactar as saídas de CSS e JavaScript';
-$lang['cssdatauri'] = 'Tamanho em bytes até ao qual as imagens referenciadas em ficheiros CSS devem ser embutidas diretamente no CSS para reduzir a carga de pedidos HTTP extra. <code>400</code> a <code>600</code> bytes é um bom valor. Escolher <code>0</code> para desativar.';
-$lang['send404'] = 'Enviar "HTTP 404/Página não encontrada" para páginas não existentes';
-$lang['broken_iua'] = 'A função "ignore_user_abort" não está a funcionar no seu sistema? Isso pode causar um índice de busca defeituoso. Sistemas com IIS+PHP/CGI são conhecidos por possuírem este problema. Veja o <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">bug 852</a> para mais informações.';
-$lang['xsendfile'] = 'Usar o cabeçalho "X-Sendfile" para permitir o servidor de internet encaminhar ficheiros estáticos? O seu servidor de internet precisa ter suporte a isso.';
+$lang['cssdatauri'] = 'Tamanho em bytes até ao qual as imagens referenciadas em arquivos CSS devem ser embutidas diretamente no CSS para reduzir carga extra de pedidos HTTP. <code>400</code> a <code>600</code> bytes é um bom valor. Defina <code>0</code> para desativar.';
+$lang['send404'] = 'Enviar "HTTP 404/Página não encontrada" para páginas inexistentes';
+$lang['broken_iua'] = 'A função ignore_user_abort não está funcionando no seu sistema? Isso pode causar um índice de busca defeituoso. Sistemas com IIS+PHP/CGI são conhecidos por possuírem este problema. Veja o <a href="http://bugs.dokuwiki.org/?do=details&amp;task_id=852">Bug 852</a> para mais informações.';
+$lang['xsendfile'] = 'Usar o cabeçalho X-Sendfile para permitir o servidor de internet encaminhar arquivos estáticos? O seu servidor de internet precisa ter suporte a isso.';
$lang['renderer_xhtml'] = 'Renderizador a ser utilizado para a saída principal do wiki (xhtml)';
$lang['renderer__core'] = '%s (núcleo dokuwiki)';
$lang['renderer__plugin'] = '%s (plugin)';
+$lang['search_nslimit'] = 'Limite a pesquisa aos atuais X namespaces. Quando uma pesquisa é executada a partir de uma página em um namespace mais profundo, os primeiros X namespaces serão adicionados como filtro';
+$lang['search_fragment'] = 'Especifique o comportamento de pesquisa de fragmento padrão';
+$lang['search_fragment_o_exact'] = 'exato';
+$lang['search_fragment_o_starts_with'] = 'começa com';
+$lang['search_fragment_o_ends_with'] = 'termina com';
+$lang['search_fragment_o_contains'] = 'contém';
+$lang['trustedproxy'] = 'Confie nos proxies de encaminhamento que correspondem a essa expressão regular sobre o verdadeiro IP do cliente que eles relatam. O padrão corresponde às redes locais. Deixe em branco para não confiar em proxy.';
+$lang['_feature_flags'] = 'Sinalizadores de recursos';
+$lang['defer_js'] = 'Adie a execução do javascript para depois da análise do HTML da página. Isso Melhora a velocidade da página, mas pode interromper um pequeno número de plugins.';
+$lang['dnslookups'] = 'O DokuWiki irá procurar nomes de host para endereços IP remotos de usuários editando páginas. Se você tiver um servidor DNS lento, inoperante ou não quiser esse recurso, desabilite essa opção';
+$lang['jquerycdn'] = 'Os arquivos de script jQuery e jQuery UI devem ser carregados de um CDN? Isso gera solicitações HTTP adicionais mas os arquivos são carregados mais rapidamente e os usuários já podem tê-los armazenados em cache.';
+$lang['jquerycdn_o_0'] = 'Sem CDN, somente entrega local';
+$lang['jquerycdn_o_jquery'] = 'CDN em code.jquery.com';
+$lang['jquerycdn_o_cdnjs'] = 'CDN em cdnjs.com';
$lang['proxy____host'] = 'Nome do servidor proxy';
$lang['proxy____port'] = 'Porta de Proxy';
-$lang['proxy____user'] = 'Nome de utilizador Proxy';
-$lang['proxy____pass'] = 'Password de Proxy ';
+$lang['proxy____user'] = 'Nome de usuário Proxy';
+$lang['proxy____pass'] = 'Senha do Proxy ';
$lang['proxy____ssl'] = 'Usar SSL para conectar ao proxy';
-$lang['proxy____except'] = 'Expressão regular para condizer URLs para os quais o proxy deve ser saltado.';
-$lang['safemodehack'] = 'Habilitar modo de segurança';
-$lang['ftp____host'] = 'Servidor FTP para o modo de segurança';
-$lang['ftp____port'] = 'Porta de FTP para o modo de segurança';
-$lang['ftp____user'] = 'Nome do utilizador FTP para o modo de segurança';
-$lang['ftp____pass'] = 'Senha do utilizador FTP para o modo de segurança';
-$lang['ftp____root'] = 'Directoria raiz do FTP para o modo de segurança';
+$lang['proxy____except'] = 'Expressão regular para bater com URLs para os quais o proxy deve ser ignorado.';
$lang['license_o_'] = 'Nenhuma escolha';
$lang['typography_o_0'] = 'nenhum';
-$lang['typography_o_1'] = 'Apenas entre aspas';
-$lang['typography_o_2'] = 'Entre aspas e apóstrofes';
+$lang['typography_o_1'] = 'excluindo aspas simples';
+$lang['typography_o_2'] = 'incluindo aspas simples (pode não funcionar sempre)';
$lang['userewrite_o_0'] = 'nenhum';
$lang['userewrite_o_1'] = '.htaccess';
-$lang['userewrite_o_2'] = 'interno (DokuWiki)';
+$lang['userewrite_o_2'] = 'DokuWiki interno';
$lang['deaccent_o_0'] = 'desligado';
$lang['deaccent_o_1'] = 'remover acentos';
$lang['deaccent_o_2'] = 'romanizar';
@@ -167,27 +192,28 @@ $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['rss_content_o_abstract'] = 'Abstracto';
+$lang['rss_content_o_abstract'] = 'Abstrato';
$lang['rss_content_o_diff'] = 'Diferenças Unificadas';
-$lang['rss_content_o_htmldiff'] = 'Tabela de diff formatada em HTML';
+$lang['rss_content_o_htmldiff'] = 'Tabela diff formatada em HTML';
$lang['rss_content_o_html'] = 'Conteúdo completo da página em HTML';
-$lang['rss_linkto_o_diff'] = 'vista de diferenças';
+$lang['rss_linkto_o_diff'] = 'visualizar diferenças';
$lang['rss_linkto_o_page'] = 'página revista';
$lang['rss_linkto_o_rev'] = 'lista de revisões';
-$lang['rss_linkto_o_current'] = 'página actual';
-$lang['compression_o_0'] = 'Sem Compressão';
+$lang['rss_linkto_o_current'] = 'página atual';
+$lang['compression_o_0'] = 'sem compressão';
$lang['compression_o_gz'] = 'gzip';
$lang['compression_o_bz2'] = 'bz2';
$lang['xsendfile_o_0'] = 'não usar';
$lang['xsendfile_o_1'] = 'Cabeçalho proprietário lighttpd (anterior à versão 1.5)';
-$lang['xsendfile_o_2'] = 'Cabeçalho "X-Sendfile" padrão';
-$lang['xsendfile_o_3'] = 'Cabeçalho proprietário "Nginx X-Accel-Redirect"';
-$lang['showuseras_o_loginname'] = 'Nome de utilizador';
-$lang['showuseras_o_username'] = 'Nome completo do utilizador';
-$lang['showuseras_o_email'] = 'Endereço email do utilizador (ofuscado de acordo com a configuração mailguard)';
-$lang['showuseras_o_email_link'] = 'Endereço de e-mail de usuário como um link "mailto:"';
+$lang['xsendfile_o_2'] = 'Cabeçalho X-Sendfile padrão';
+$lang['xsendfile_o_3'] = 'Cabeçalho proprietário Nginx X-Accel-Redirect';
+$lang['showuseras_o_loginname'] = 'Nome de usuário';
+$lang['showuseras_o_username'] = 'Nome completo do usuário';
+$lang['showuseras_o_username_link'] = 'Nome completo do usuário como link do usuário interwiki';
+$lang['showuseras_o_email'] = 'E-mail do usuário (ofuscado de acordo com a configuração mailguard)';
+$lang['showuseras_o_email_link'] = 'E-mail do usuário como um link mailto:';
$lang['useheading_o_0'] = 'Nunca';
$lang['useheading_o_navigation'] = 'Apenas Navegação';
$lang['useheading_o_content'] = 'Apenas Conteúdo Wiki';
$lang['useheading_o_1'] = 'Sempre';
-$lang['readdircache'] = 'Idade máxima para a cache de "readdir" (seg)';
+$lang['readdircache'] = 'Idade máxima para a cache readdir (seg)';
diff --git a/lib/plugins/config/lang/ro/lang.php b/lib/plugins/config/lang/ro/lang.php
index 649954de0..4df72ecba 100644
--- a/lib/plugins/config/lang/ro/lang.php
+++ b/lib/plugins/config/lang/ro/lang.php
@@ -4,14 +4,9 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Sergiu Baltariu <s_baltariu@yahoo.com>
- * @author s_baltariu@yahoo.com
* @author Emanuel-Emeric Andrasi <n30@mandrivausers.ro>
- * @author Emanuel-Emeric Andrași <n30@mandrivausers.ro>
* @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.';
@@ -145,12 +140,6 @@ $lang['proxy____user'] = 'Nume utilizator Proxy';
$lang['proxy____pass'] = 'Parolă Proxy';
$lang['proxy____ssl'] = 'Foloseşte SSL pentru conectare la Proxy';
$lang['proxy____except'] = 'Expresie regulară de potrivit cu URL-uri pentru care proxy-ul trebuie păsuit.';
-$lang['safemodehack'] = 'Activează safemode hack';
-$lang['ftp____host'] = 'Server FTP pentru safemode hack';
-$lang['ftp____port'] = 'Port FTP pentru safemode hack';
-$lang['ftp____user'] = 'Nume utilizator pentru safemode hack';
-$lang['ftp____pass'] = 'Parolă FTP pentru safemode hack';
-$lang['ftp____root'] = 'Director rădăcină FTP pentru safemode hack';
$lang['license_o_'] = 'Nici una aleasă';
$lang['typography_o_0'] = 'nimic';
$lang['typography_o_1'] = 'Numai ghilimele duble';
diff --git a/lib/plugins/config/lang/ru/lang.php b/lib/plugins/config/lang/ru/lang.php
index 3d6914d8c..2164882dc 100644
--- a/lib/plugins/config/lang/ru/lang.php
+++ b/lib/plugins/config/lang/ru/lang.php
@@ -3,7 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Анатолий <anatol_m@mail.ru>
* @author Yuriy Skalko <yuriy.skalko@gmail.com>
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Vyacheslav Strenadko <vyacheslav.strenadko@gmail.com>
* @author Zhassulan <zyesmukanov@gmail.com>
* @author Denis Simakov <akinoame1@gmail.com>
* @author Andrew Pleshakov <beotiger@mail.ru>
@@ -14,7 +17,6 @@
* @author Kirill Krasnov <krasnovforum@gmail.com>
* @author Vlad Tsybenko <vlad.development@gmail.com>
* @author Aleksey Osadchiy <rfc@nm.ru>
- * @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>
@@ -25,7 +27,7 @@ $lang['menu'] = 'Настройки вики';
$lang['error'] = 'Настройки не были сохранены из-за ошибки в одном из значений. Пожалуйста, проверьте свои изменения и попробуйте ещё раз.<br />Неправильные значения будут обведены красной рамкой.';
$lang['updated'] = 'Настройки успешно сохранены.';
$lang['nochoice'] = '(нет других вариантов)';
-$lang['locked'] = 'Файл настройки недоступен для изменения. Если это не специально, <br />убедитесь, что файл локальной настройки имеет правильное имя и права доступа.';
+$lang['locked'] = 'Файл настройки недоступен для изменения. Если это не специально,<br />убедитесь, что файл локальной настройки имеет правильное имя и права доступа.';
$lang['danger'] = 'Внимание: изменение этой опции может сделать вашу вики и меню конфигурации недоступными.';
$lang['warning'] = 'Предостережение: изменение этой опции может вызвать непредсказуемое поведение.';
$lang['security'] = 'Предостережение по безопасности: изменение этой опции может вызвать риск, связанный с безопасностью.';
@@ -47,13 +49,14 @@ $lang['_advanced'] = 'Тонкая настройка';
$lang['_network'] = 'Параметры сети';
$lang['_msg_setting_undefined'] = 'Не найдены метаданные настроек.';
$lang['_msg_setting_no_class'] = 'Не найден класс настроек.';
+$lang['_msg_setting_no_known_class'] = 'Класс настроек недоступен.';
$lang['_msg_setting_no_default'] = 'Не задано значение по умолчанию.';
-$lang['title'] = 'Название вики';
-$lang['start'] = 'Имя стартовой страницы';
-$lang['lang'] = 'Язык';
-$lang['template'] = 'Шаблон';
+$lang['title'] = 'Название (заголовок) вики';
+$lang['start'] = 'Имя страницы, используемой как стартовой в каждом пространства имён';
+$lang['lang'] = 'Язык интерфейса';
+$lang['template'] = 'Шаблон (дизайн)';
$lang['tagline'] = 'Слоган (если поддерживается шаблоном)';
-$lang['sidebar'] = 'Боковая панель; пустое поле отключает боковую панель.';
+$lang['sidebar'] = 'Боковая панель (если поддерживается шаблоном); пустое поле отключает боковую панель.';
$lang['license'] = 'На условиях какой лицензии будет предоставляться содержимое вики?';
$lang['savedir'] = 'Директория для данных';
$lang['basedir'] = 'Корневая директория (например, <code>/dokuwiki/</code>). Оставьте пустым для автоопределения.';
@@ -64,9 +67,9 @@ $lang['fmode'] = 'Права для создаваемых фа
$lang['allowdebug'] = 'Включить отладку. <b>Отключите, если она вам не нужна!</b>';
$lang['recent'] = 'Недавние изменения (кол-во)';
$lang['recent_days'] = 'На сколько дней назад сохранять недавние изменения';
-$lang['breadcrumbs'] = 'Вы посетили (кол-во). Поставьте 0 (ноль) для отключения.';
+$lang['breadcrumbs'] = 'Вы посетили (количество страниц). Поставьте 0 (ноль) для отключения.';
$lang['youarehere'] = 'Показывать «Вы находитесь здесь»';
-$lang['fullpath'] = 'Полный путь к документу';
+$lang['fullpath'] = 'Полный путь к документу внизу страницы';
$lang['typography'] = 'Выполнять замену на типографские символы';
$lang['dformat'] = 'Формат даты и времени (см. функцию PHP <a href="http://php.net/strftime">strftime</a>)';
$lang['signature'] = 'Шаблон подписи';
@@ -78,7 +81,7 @@ $lang['maxseclevel'] = 'Макс. уровень для правки';
$lang['camelcase'] = 'Использовать ВикиРегистр для ссылок';
$lang['deaccent'] = 'Транслитерация в именах страниц';
$lang['useheading'] = 'Первый заголовок вместо имени страницы';
-$lang['sneaky_index'] = 'По умолчанию, «Докувики» показывает в индексе страниц все пространства имён. Включение этой опции скроет пространства имён, для которых пользователь не имеет прав чтения. Это может привести к скрытию доступных вложенных пространств имён и потере функциональности индекса страниц при некоторых конфигурациях прав доступа.';
+$lang['sneaky_index'] = 'По умолчанию, «Докувики» показывает все пространства имён на «Все страницы». Включение этой опции скроет пространства имён, для которых пользователь не имеет прав чтения. Это может привести к скрытию доступных вложенных пространств имён и потере функциональности индекса страниц при некоторых конфигурациях прав доступа.';
$lang['hidepages'] = 'Скрыть страницы (регулярное выражение)';
$lang['useacl'] = 'Использовать списки прав доступа';
$lang['autopasswd'] = 'Автогенерация паролей';
@@ -97,11 +100,11 @@ $lang['disableactions_profile_delete'] = 'Удалить свой аккаунт
$lang['disableactions_other'] = 'Другие операции (через запятую)';
$lang['disableactions_rss'] = 'XML-синдикация (RSS)';
$lang['auth_security_timeout'] = 'Интервал для безопасности авторизации (сек.)';
-$lang['securecookie'] = 'Должны ли куки (cookies), выставленные через HTTPS, отправляться браузером только через HTTPS. Отключите эту опцию в случае, когда только логин вашей вики передаётся через SSL, а обычный просмотр осуществляется в небезопасном режиме.';
+$lang['securecookie'] = 'Должны ли куки (cookies), выставленные через HTTPS, отправляться браузером только через HTTPS? Отключите эту опцию в случае, когда только логин вашей вики передаётся через SSL, а обычный просмотр осуществляется в небезопасном режиме.';
$lang['remote'] = 'Включить систему API для подключений. Это позволит другим приложениям получить доступ к вики через XML-RPC или другие механизмы.';
$lang['remoteuser'] = 'Дать права для удалённого API-доступа пользователям, указанным здесь (разделяйте запятыми). Оставьте поле пустым для предоставления доступа всем.';
$lang['usewordblock'] = 'Блокировать спам по ключевым словам';
-$lang['relnofollow'] = 'Использовать rel="nofollow" для внешних ссылок';
+$lang['relnofollow'] = 'Использовать rel="ugc nofollow" для внешних ссылок';
$lang['indexdelay'] = 'Задержка перед индексированием (сек.)';
$lang['mailguard'] = 'Кодировать адреса электронной почты';
$lang['iexssprotect'] = 'Проверять закачанные файлы на наличие потенциально опасного кода JavaScript или HTML';
@@ -117,16 +120,16 @@ $lang['target____media'] = 'target для ссылок на медиафа
$lang['target____windows'] = 'target для ссылок на сетевые каталоги';
$lang['mediarevisions'] = 'Включение версий медиафайлов';
$lang['refcheck'] = 'Проверять ссылки на медиафайлы';
-$lang['gdlib'] = 'Версия LibGD';
+$lang['gdlib'] = 'Версия GD Lib';
$lang['im_convert'] = 'Путь к ImageMagick';
-$lang['jpg_quality'] = 'Качество сжатия JPG (0–100). Значение по умолчанию — 70.';
+$lang['jpg_quality'] = 'Качество сжатия JPG (0–100)';
$lang['fetchsize'] = 'Максимальный размер файла (в байтах), который fetch.php может скачивать с внешнего источника';
$lang['subscribers'] = 'Разрешить подписку на изменения';
$lang['subscribe_time'] = 'Интервал рассылки подписок и сводок (сек.). Должен быть меньше, чем значение, указанное в recent_days.';
$lang['notify'] = 'Всегда отправлять сообщения об изменениях на этот электронный адрес';
-$lang['registernotify'] = 'Всегода отправлять информацию о новых зарегистрированных пользователях на этот электронный адрес';
+$lang['registernotify'] = 'Всегда отправлять информацию о новых зарегистрированных пользователях на этот электронный адрес';
$lang['mailfrom'] = 'Электронный адрес вики (От:)';
-$lang['mailreturnpath'] = 'Адрес электронной почты для доставки отчета о недоставленных сообщений';
+$lang['mailreturnpath'] = 'Адрес электронной почты для доставки отчёта о недоставленных сообщениях';
$lang['mailprefix'] = 'Префикс, используемый для автоматического письма, станет темой сообщения. Оставьте поле пустым для использования названия вики.';
$lang['htmlmail'] = 'Отправлять красивые, но более крупные HTML-письма. Отключите для отправки простых текстовых писем.';
$lang['sitemap'] = 'Число дней, через которое нужно создавать (обновлять) карту сайта для поисковиков (Гугл, Яндекс и др.). Укажите 0 (ноль) для отключения.';
@@ -135,6 +138,7 @@ $lang['rss_linkto'] = 'Ссылки в XML-ленте указыва
$lang['rss_content'] = 'Что показывать в XML-ленте?';
$lang['rss_update'] = 'Интервал обновления XML-ленты (сек.)';
$lang['rss_show_summary'] = 'Показывать краткую выдержку в заголовках XML-ленты';
+$lang['rss_show_deleted'] = 'XML feed Показать удаленные каналы';
$lang['rss_media'] = 'Какие изменения должны быть отображены в XML-ленте?';
$lang['rss_media_o_both'] = 'оба';
$lang['rss_media_o_pages'] = 'страницы';
@@ -149,17 +153,22 @@ $lang['autoplural'] = 'Проверять можественную ф
$lang['compression'] = 'Метод сжатия для архивных файлов';
$lang['gzip_output'] = 'Использовать gzip-сжатие для xhtml (Content-Encoding)';
$lang['compress'] = 'Сжимать файлы CSS и javascript';
-$lang['cssdatauri'] = 'Размер в байтах, до которого изображения, указанные в CSS-файлах, должны быть встроены прямо в таблицу стилей, для уменьшения избыточных HTTP-запросов. Этот метод не будет работать в IE версии 7 и ниже! Установка от <code>400</code> до <code>600</code> байт является хорошим показателем. Установите <code>0</code>, чтобы отключить.';
+$lang['cssdatauri'] = 'Размер в байтах, до которого изображения, указанные в CSS-файлах, должны быть встроены прямо в таблицу стилей для уменьшения избыточных HTTP-запросов. Значение между <code>400</code> и <code>600</code> байт является хорошим. Укажите <code>0</code>, чтобы отключить.';
$lang['send404'] = 'Посылать «HTTP 404/Страница не найдена» для несуществующих страниц';
$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['search_nslimit'] = 'Ограничить поиск текущими пространствами имён X. Когда поиск выполняется со страницы в более глубоком пространстве имён, первые X-пространства имен будут добавлены в качестве фильтра.';
+$lang['search_fragment'] = 'Укажите поведение поиска фрагмента по умолчанию';
$lang['search_fragment_o_exact'] = 'точно';
$lang['search_fragment_o_starts_with'] = 'начинается на';
$lang['search_fragment_o_ends_with'] = 'заканчивается';
$lang['search_fragment_o_contains'] = 'содержит';
+$lang['trustedproxy'] = 'Доверять прокси-серверам, соответствующим этому регулярному выражению, в отношении реального IP-адреса клиента, который они сообщают. Значение по умолчанию соответствует локальным сетям. Оставьте пустым, чтобы не доверять никаким прокси-серверам.';
+$lang['_feature_flags'] = 'Флаги функций';
+$lang['defer_js'] = 'Отложено выполнение javascript после анализа HTML-кода страницы. Улучшает воспринимаемую скорость страницы, но может нарушить работу небольшого количества плагинов.';
$lang['dnslookups'] = '«Докувики» ищет DNS-имена пользователей, редактирующих страницы. Если у вас нет DNS-сервера или он работает медленно, рекомендуем отключить эту опцию.';
$lang['jquerycdn'] = 'Требуется ли загрузка jQuery-скриптов (включая jQuery UI-скрипты) из CDN сети? Данная функция увеличивает количество HTTP запросов, но загрузка файлов будет проходить быстрее и пользователи смогут кэшировать запросы.';
$lang['jquerycdn_o_0'] = 'Не использовать CDN. Использовать только локальную доставку';
@@ -171,12 +180,6 @@ $lang['proxy____user'] = 'proxy-имя пользователя';
$lang['proxy____pass'] = 'proxy-пароль';
$lang['proxy____ssl'] = 'Использовать SSL для соединения с прокси';
$lang['proxy____except'] = 'Регулярное выражение для адресов (URL), для которых прокси должен быть пропущен.';
-$lang['safemodehack'] = 'Включить обход safemode (хак)';
-$lang['ftp____host'] = 'ftp-адрес';
-$lang['ftp____port'] = 'ftp-порт';
-$lang['ftp____user'] = 'ftp-имя пользователя';
-$lang['ftp____pass'] = 'ftp-пароль';
-$lang['ftp____root'] = 'ftp-корневая директория';
$lang['license_o_'] = 'Не выбрано';
$lang['typography_o_0'] = 'нет';
$lang['typography_o_1'] = 'только двойные кавычки';
diff --git a/lib/plugins/config/lang/sk/lang.php b/lib/plugins/config/lang/sk/lang.php
index 79054aaea..c69605dad 100644
--- a/lib/plugins/config/lang/sk/lang.php
+++ b/lib/plugins/config/lang/sk/lang.php
@@ -3,7 +3,9 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Peter Mydliar <peto.mydliar@gmail.com>
* @author Martin Michalek <michalek.dev@gmail.com>
+ * @author Tibor Repček <tiborepcek@gmail.com>
* @author Michal Mesko <michal.mesko@gmail.com>
* @author exusik <exusik@gmail.com>
*/
@@ -80,7 +82,9 @@ $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_profile_delete'] = 'Zrušenie vlastného účtu';
$lang['disableactions_other'] = 'Iné akcie (oddelené čiarkou)';
+$lang['disableactions_rss'] = 'RSS';
$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['remote'] = 'Povolenie vzdialeného API. Umožnuje iným aplikáciám pristupovať k wiki cez XML-RPC alebo iným spôsobom.';
@@ -120,6 +124,9 @@ $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['rss_media_o_both'] = 'oboje';
+$lang['rss_media_o_pages'] = 'strany';
+$lang['rss_media_o_media'] = 'média';
$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';
@@ -137,6 +144,10 @@ $lang['xsendfile'] = 'Používať X-Sendfile hlavičku pre doručeni
$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['search_fragment_o_exact'] = 'presne';
+$lang['search_fragment_o_starts_with'] = 'začína s';
+$lang['search_fragment_o_ends_with'] = 'končí na';
+$lang['search_fragment_o_contains'] = 'obsahuje';
$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['jquerycdn'] = 'Mali by byť jQuery a jQuery UI skripty načítané z CDN? Voľba zvýši počet dodatočných HTTP požiadaviek, ale súbory sa môžu načítať rýchlejšie a používatelia ich už môžu mať vo vyrovnávacej pamäti.';
$lang['jquerycdn_o_0'] = 'Nepoužívať CDN, iba lokálne súbory';
@@ -148,12 +159,6 @@ $lang['proxy____user'] = 'Proxy server - používateľské meno';
$lang['proxy____pass'] = 'Proxy server - heslo';
$lang['proxy____ssl'] = 'Proxy server - použiť SSL';
$lang['proxy____except'] = 'Regulárny výraz popisujúci URL odkazy, pre ktoré by proxy nemala byť použitá.';
-$lang['safemodehack'] = 'Povoliť "safemode hack"';
-$lang['ftp____host'] = 'FTP server pre "safemode hack"';
-$lang['ftp____port'] = 'FTP port pre "safemode hack"';
-$lang['ftp____user'] = 'FTP používateľ pre "safemode hack"';
-$lang['ftp____pass'] = 'FTP heslo pre "safemode hack"';
-$lang['ftp____root'] = 'FTP hlavný adresár pre "safemode hack"';
$lang['license_o_'] = 'žiadna';
$lang['typography_o_0'] = 'žiadne';
$lang['typography_o_1'] = 'okrem jednoduchých úvodzoviek';
diff --git a/lib/plugins/config/lang/sl/lang.php b/lib/plugins/config/lang/sl/lang.php
index 7db4b4b34..270a5a480 100644
--- a/lib/plugins/config/lang/sl/lang.php
+++ b/lib/plugins/config/lang/sl/lang.php
@@ -139,12 +139,6 @@ $lang['proxy____user'] = 'Uporabniško ime posredniškega strežnika';
$lang['proxy____pass'] = 'Geslo posredniškega strežnika';
$lang['proxy____ssl'] = 'Uporabi varno povezavo SSL za povezavo z posredniškim strežnikom';
$lang['proxy____except'] = 'Logični izrazi morajo biti skladni z naslovi URL, ki gredo mimo posredniškega strežnika.';
-$lang['safemodehack'] = 'Omogoči obhod načina SafeMode PHP';
-$lang['ftp____host'] = 'Strežnik FTP za obhod načina SafeMode';
-$lang['ftp____port'] = 'Vrata strežnika FTP za obhod načina SafeMode';
-$lang['ftp____user'] = 'Uporabniško ime za FTP za obhod načina SafeMode';
-$lang['ftp____pass'] = 'Geslo za strežnik FTP za obhod načina SafeMode';
-$lang['ftp____root'] = 'Korenska mapa FTP za obhod načina SafeMode';
$lang['license_o_'] = 'Ni izbranega dovoljenja';
$lang['typography_o_0'] = 'brez';
$lang['typography_o_1'] = 'izloči enojne narekovaje';
diff --git a/lib/plugins/config/lang/sq/lang.php b/lib/plugins/config/lang/sq/lang.php
index 72c500a49..c231b54ab 100644
--- a/lib/plugins/config/lang/sq/lang.php
+++ b/lib/plugins/config/lang/sq/lang.php
@@ -126,12 +126,6 @@ $lang['proxy____port'] = 'Porta e proxy-t';
$lang['proxy____user'] = 'Emri i përdoruesit për proxy-n';
$lang['proxy____pass'] = 'Fjalëkalimi proxy-t';
$lang['proxy____ssl'] = 'Përdor SSL për tu lidhur me proxy-n';
-$lang['safemodehack'] = 'Aktivizo hack në safemode';
-$lang['ftp____host'] = 'Server FTP për safemode hack';
-$lang['ftp____port'] = 'Porta FTP për safemode hack';
-$lang['ftp____user'] = 'Emri përdoruesit për safemode hack';
-$lang['ftp____pass'] = 'Fjalëkalimi FTP për safemode hack';
-$lang['ftp____root'] = 'Direktoria rrënjë për safemode hack';
$lang['license_o_'] = 'Nuk u zgjodh asgjë';
$lang['typography_o_0'] = 'Asgjë';
$lang['typography_o_1'] = 'përjashtim i thonjëzave teke';
diff --git a/lib/plugins/config/lang/sr/lang.php b/lib/plugins/config/lang/sr/lang.php
index e8f3b8335..4e5e94871 100644
--- a/lib/plugins/config/lang/sr/lang.php
+++ b/lib/plugins/config/lang/sr/lang.php
@@ -3,8 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
- * @author Иван Петровић petrovicivan@ubuntusrbija.org
- * @author Ivan Petrovic <petrovicivan@ubuntusrbija.org>
+ * @author Иван Петровић <petrovicivan@ubuntusrbija.org>
* @author Miroslav Šolti <solti.miroslav@gmail.com>
* @author Марко М. Костић <marko.m.kostic@gmail.com>
*/
@@ -134,12 +133,6 @@ $lang['proxy____user'] = 'Корисничко име на посред
$lang['proxy____pass'] = 'Лозинка на посреднику (проксију)';
$lang['proxy____ssl'] = 'Користи ССЛ за повезивање са посредником (проксијем)';
$lang['proxy____except'] = 'Редован израз који би требало да се подудара са веб адресом странице за коју треба прескочити посредника (прокси).';
-$lang['safemodehack'] = 'Укључи преправку за безбедни режим';
-$lang['ftp____host'] = 'ФТП сервер за безбедни режим';
-$lang['ftp____port'] = 'ФТП порт за безбедни режим';
-$lang['ftp____user'] = 'ФТП корисничко име за безбедни режим';
-$lang['ftp____pass'] = 'ФТП лозинка за безбедни режим';
-$lang['ftp____root'] = 'ФТП основна фасцикла за безбедни режим';
$lang['license_o_'] = 'Није одабрано';
$lang['typography_o_0'] = 'не';
$lang['typography_o_1'] = 'Само дупли наводници';
diff --git a/lib/plugins/config/lang/sv/lang.php b/lib/plugins/config/lang/sv/lang.php
index 268cc364e..6631f109a 100644
--- a/lib/plugins/config/lang/sv/lang.php
+++ b/lib/plugins/config/lang/sv/lang.php
@@ -146,12 +146,6 @@ $lang['proxy____user'] = 'Användarnamn för proxy';
$lang['proxy____pass'] = 'Lösenord för proxy';
$lang['proxy____ssl'] = 'Använd ssl för anslutning till proxy';
$lang['proxy____except'] = 'Regular expression för matchning av URL som proxy ska hoppa över.';
-$lang['safemodehack'] = 'Aktivera safemode hack';
-$lang['ftp____host'] = 'FTP-server för safemode hack';
-$lang['ftp____port'] = 'FTP-port för safemode hack';
-$lang['ftp____user'] = 'FTP-användarnamn för safemode hack';
-$lang['ftp____pass'] = 'FTP-lösenord för safemode hack';
-$lang['ftp____root'] = 'FTP-rotkatalog för safemode hack';
$lang['license_o_'] = 'Ingen vald';
$lang['typography_o_0'] = 'Inga';
$lang['typography_o_1'] = 'enbart dubbla citattecken';
diff --git a/lib/plugins/config/lang/th/lang.php b/lib/plugins/config/lang/th/lang.php
index ce1d30d62..8d9e73439 100644
--- a/lib/plugins/config/lang/th/lang.php
+++ b/lib/plugins/config/lang/th/lang.php
@@ -2,11 +2,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Komgrit Niyomrath <n.komgrit@gmail.com>
- * @author Kittithat Arnontavilas mrtomyum@gmail.com
- * @author Arthit Suriyawongkul <arthit@gmail.com>
* @author Kittithat Arnontavilas <mrtomyum@gmail.com>
+ * @author Arthit Suriyawongkul <arthit@gmail.com>
* @author Thanasak Sompaisansin <jombthep@gmail.com>
*/
$lang['menu'] = 'ตั้งค่าการปรับแต่ง';
diff --git a/lib/plugins/config/lang/tr/lang.php b/lib/plugins/config/lang/tr/lang.php
index 3e83d45a6..d86455d1f 100644
--- a/lib/plugins/config/lang/tr/lang.php
+++ b/lib/plugins/config/lang/tr/lang.php
@@ -2,12 +2,14 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
+ * @author Hakan <hakandursun2009@gmail.com>
+ * @author mahir <mahirtakak@gmail.com>
* @author Aydın Coşkuner <aydinweb@gmail.com>
* @author Cihan Kahveci <kahvecicihan@gmail.com>
* @author Yavuz Selim <yavuzselim@gmail.com>
* @author Caleb Maclennan <caleb@alerque.com>
- * @author farukerdemoncel@gmail.com
+ * @author farukerdemoncel <farukerdemoncel@gmail.com>
* @author Mete Cuma <mcumax@gmail.com>
*/
$lang['menu'] = 'Site Ayarları';
@@ -93,10 +95,6 @@ $lang['proxy____host'] = 'Proxy sunucu adı';
$lang['proxy____user'] = 'Proxy kullanıcı adı';
$lang['proxy____pass'] = 'Proxy şifresi';
$lang['proxy____ssl'] = 'Proxy ile bağlanırken ssl kullan';
-$lang['safemodehack'] = 'Safemod hackını etkili kıl';
-$lang['ftp____host'] = 'Safemod hackı için kullanılacak FTP suncusu';
-$lang['ftp____user'] = 'Safemod hackı için kullanılacak FTP kullanıcı adı';
-$lang['ftp____pass'] = 'Safemod hackı için kullanılacak FTP parolası';
$lang['license_o_'] = 'Seçilmedi';
$lang['typography_o_0'] = 'Yok';
$lang['userewrite_o_0'] = 'hiçbiri';
diff --git a/lib/plugins/config/lang/uk/lang.php b/lib/plugins/config/lang/uk/lang.php
index d8b1d5b04..01e9202cd 100644
--- a/lib/plugins/config/lang/uk/lang.php
+++ b/lib/plugins/config/lang/uk/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author velmyshanovnyi <velmyshanovnyi@gmail.com>
+ * @author Dmytro Marchenko <dmytro.marchenko1989@gmail.com>
* @author Oleksii <alexey.furashev@gmail.com>
* @author Vitaly <vitaly.balashov@smuzzy.com.ua>
* @author Oleksiy Voronin <ovoronin@gmail.com>
@@ -117,6 +119,8 @@ $lang['rss_linkto'] = 'посилання в RSS';
$lang['rss_content'] = 'Що відображати в пунктах XML-feed';
$lang['rss_update'] = 'Інтервал оновлення RSS (сек)';
$lang['rss_show_summary'] = 'Показувати підсумки змін в заголовку XML-feed';
+$lang['rss_media_o_both'] = 'обидва';
+$lang['rss_media_o_pages'] = 'сторінки';
$lang['updatecheck'] = 'Перевірити наявність оновлень чи попереджень безпеки? Для цього ДокуВікі необхідно зв\'язатися зі update.dokuwiki.org.';
$lang['userewrite'] = 'Красиві URL';
$lang['useslash'] = 'Слеш, як розділювач просторів імен в URL';
@@ -133,18 +137,13 @@ $lang['xsendfile'] = 'Використовувати заголов
$lang['renderer_xhtml'] = 'Транслятор (Renderer) для основного виводу wiki (xhtml)';
$lang['renderer__core'] = '%s (ядро докуВікі)';
$lang['renderer__plugin'] = '%s (доданок)';
+$lang['search_fragment_o_exact'] = 'точно';
$lang['proxy____host'] = 'Адреса Proxy';
$lang['proxy____port'] = 'Порт Proxy';
$lang['proxy____user'] = 'Користувач Proxy';
$lang['proxy____pass'] = 'Пароль Proxy';
$lang['proxy____ssl'] = 'Використовувати ssl для з\'єднання з Proxy';
$lang['proxy____except'] = 'Регулярний вираз для веб-адреси, яку проксі-сервер пропустить.';
-$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'] = 'Лише подвійні лапки';
diff --git a/lib/plugins/config/lang/vi/intro.txt b/lib/plugins/config/lang/vi/intro.txt
new file mode 100644
index 000000000..5851cec21
--- /dev/null
+++ b/lib/plugins/config/lang/vi/intro.txt
@@ -0,0 +1,7 @@
+====== Quản lý cấu hình ======
+
+Sử dụng trang này để kiểm soát cài đặt cho trình cài đặt DokuWiki của bạn. Để được trợ giúp về cài đặt cá nhân, hãy tham khảo [[doku>config]]. Để biết thêm chi tiết về plugin này, xem [[doku>plugin:config]].
+
+Các cài đặt hiển thị với nền đỏ nhạt được bảo vệ và không thể thay đổi bằng plugin này. Các cài đặt hiển thị với nền màu xanh là các giá trị mặc định và cài đặt được hiển thị với nền trắng đã được đặt cục bộ cho cài đặt cụ thể này. Cả hai cài đặt màu xanh và trắng có thể được thay đổi.
+
+Hãy nhớ nhấn nút **Lưu** trước khi rời trang này nếu không các thay đổi của bạn sẽ bị mất. \ No newline at end of file
diff --git a/lib/plugins/config/lang/vi/lang.php b/lib/plugins/config/lang/vi/lang.php
new file mode 100644
index 000000000..e152918c8
--- /dev/null
+++ b/lib/plugins/config/lang/vi/lang.php
@@ -0,0 +1,198 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['menu'] = 'Thiết lập cấu hình';
+$lang['error'] = 'Không thể cập nhật cài đặt do giá trị không hợp lệ, vui lòng xem lại các thay đổi của bạn và gửi lại.';
+$lang['updated'] = 'Đã cập nhật cài đặt thành công .';
+$lang['nochoice'] = '(không có lựa chọn nào khác)';
+$lang['locked'] = 'Không thể cập nhật tập tin cài đặt, nếu điều này là vô ý, <br />
+ đảm bảo tên tập tin cài đặt cục bộ và quyền là chính xác.';
+$lang['danger'] = 'Nguy hiểm: Thay đổi tùy chọn này có thể khiến wiki và menu cấu hình của bạn không thể truy cập được.';
+$lang['warning'] = 'Cảnh báo: Thay đổi tùy chọn này có thể gây ra hành vi ngoài ý muốn.';
+$lang['security'] = 'Cảnh báo bảo mật: Thay đổi tùy chọn này có thể gây rủi ro bảo mật.';
+$lang['_configuration_manager'] = 'Quản lý cấu hình';
+$lang['_header_template'] = 'Chủ đề';
+$lang['_header_undefined'] = 'Cài đặt không xác định';
+$lang['_basic'] = 'Cơ bản';
+$lang['_display'] = 'Hiển thị';
+$lang['_authentication'] = 'Xác thực';
+$lang['_editing'] = 'Sửa đổi';
+$lang['_links'] = 'Liên kết';
+$lang['_media'] = 'Phương tiện';
+$lang['_notifications'] = 'Thông báo';
+$lang['_syndication'] = 'Đồng bộ (RSS)';
+$lang['_advanced'] = 'Nâng cao';
+$lang['_network'] = 'Mạng';
+$lang['_msg_setting_undefined'] = 'Không có cài đặt siêu dữ liệu.';
+$lang['_msg_setting_no_class'] = 'Không có lớp thiết lập.';
+$lang['_msg_setting_no_known_class'] = 'Lớp thiết lập không có sẵn.';
+$lang['_msg_setting_no_default'] = 'Không có giá trị mặc định.';
+$lang['title'] = 'Tiêu đề Wiki (tên wiki của bạn)';
+$lang['start'] = 'Tên trang sử dụng làm điểm bắt đầu cho mỗi không gian tên';
+$lang['lang'] = 'Ngôn ngữ giao diện';
+$lang['template'] = 'Chủ đề (thiết kế của wiki)';
+$lang['tagline'] = 'Tagline (nếu chủ đề hỗ trợ)';
+$lang['sidebar'] = 'Tên trang thanh bên (nếu chủ đề hỗ trợ), để trống sẽ vô hiệu hóa thanh bên';
+$lang['license'] = 'Nội dung của bạn nên được phát hành dưới?';
+$lang['savedir'] = 'Đường dẫn lưu dữ liệu';
+$lang['basedir'] = 'Đường dẫn máy chủ (eg. <code>/dokuwiki/</code>). Để trống để tự động phát hiện.';
+$lang['baseurl'] = 'URL máy chủ (eg. <code>http://www.yourserver.com</code>). Để trống để tự động phát hiện.';
+$lang['cookiedir'] = 'Đường dẫn cookie. Để trống để sử dụng baseurl.';
+$lang['dmode'] = 'Chế độ tạo đường dẫn';
+$lang['fmode'] = 'Chế độ tạo tập tin';
+$lang['allowdebug'] = 'Cho phép gỡ lỗi. <b>Vô hiệu hóa nếu không cần thiết!</ b>';
+$lang['recent'] = 'Số lượng mục trên mỗi trang trong thay đổi gần đây';
+$lang['recent_days'] = 'Có bao nhiêu thay đổi gần đây được giữ (ngày)';
+$lang['breadcrumbs'] = 'Số lượng thanh điều hướng "Trang đã xem". Đặt thành 0 để vô hiệu.';
+$lang['youarehere'] = 'Sử dụng thanh điều hướng phân cấp (có thể bạn muốn tắt tùy chọn ở trên)';
+$lang['fullpath'] = 'Hiển thị đường dẫn đầy đủ của trang trong phần chân trang';
+$lang['typography'] = 'Thay thế đánh máy';
+$lang['dformat'] = 'Định dạng ngày (xem chức năng <a href="http://php.net/strftime">strftime</a> của PHP)';
+$lang['signature'] = 'Nội dung nhập vào khi nhấn nút chữ ký trong trình sửa đổi';
+$lang['showuseras'] = 'Nội dung hiển thị khi xem thành viên cuối cùng sửa đổi trang';
+$lang['toptoclevel'] = 'Cấp cao nhất cho mục lục';
+$lang['tocminheads'] = 'Số lượng đầu đề tối thiểu cần thiết để xây dựng bảng mục lục';
+$lang['maxtoclevel'] = 'Cấp tối đa cho bảng mục lục';
+$lang['maxseclevel'] = 'Cấp tối đa cho phần mục sửa đổi';
+$lang['camelcase'] = 'Sử dụng CamelCase cho các liên kết';
+$lang['deaccent'] = 'Cách làm sạch tên trang';
+$lang['useheading'] = 'Sử dụng đầu đề đầu tiên làm tên trang';
+$lang['sneaky_index'] = 'Theo mặc định, DokuWiki sẽ hiển thị tất cả các không gian tên trong sơ đồ trang web. Bật tùy chọn này sẽ ẩn những nơi mà thành viên không có quyền đọc. Điều này có thể dẫn đến việc ẩn các không gian tên con có thể truy cập, có thể làm cho chỉ mục không thể sử dụng được với các thiết lập ACL nhất định.';
+$lang['hidepages'] = 'Ẩn các trang khớp với biểu thức chính quy này khỏi tìm kiếm, sơ đồ trang web và các chỉ mục tự động khác';
+$lang['useacl'] = 'Sử dụng danh sách kiểm soát truy cập';
+$lang['autopasswd'] = 'Tự động tạo mật khẩu';
+$lang['authtype'] = 'Xác thực phụ trợ';
+$lang['passcrypt'] = 'Phương thức mã hóa mật khẩu';
+$lang['defaultgroup'] = 'Nhóm mặc định, tất cả thành viên mới sẽ được đặt trong nhóm này';
+$lang['superuser'] = 'Siêu thành viên - danh sách được phân tách bằng nhóm, thành viên hoặc dấu phẩy user1,@group1,user2 có toàn quyền truy cập vào tất cả các trang và chức năng bất kể cài đặt ACL';
+$lang['manager'] = 'Quản lý - nhóm, thành viên hoặc danh sách được phân tách bằng dấu phẩy user1,@group1,user2 có quyền truy cập vào một số chức năng quản lý';
+$lang['profileconfirm'] = 'Xác nhận thay đổi hồ sơ bằng mật khẩu';
+$lang['rememberme'] = 'Cho phép cookie đăng nhập vĩnh viễn (nhớ tôi)';
+$lang['disableactions'] = 'Vô hiệu hóa hành động DokuWiki';
+$lang['disableactions_check'] = 'Kiểm tra';
+$lang['disableactions_subscription'] = 'Đăng ký/Hủy đăng ký';
+$lang['disableactions_wikicode'] = 'Xem mã nguồn/Xuất Raw';
+$lang['disableactions_profile_delete'] = 'Xóa tài khoản riêng';
+$lang['disableactions_other'] = 'Hành động khác (được phân tách bằng dấu phẩy)';
+$lang['disableactions_rss'] = 'Đồng bộ XML (RSS)';
+$lang['auth_security_timeout'] = 'Thời gian chờ bảo mật xác thực (giây)';
+$lang['securecookie'] = 'Có nên gửi cookie qua HTTPS qua trình duyệt HTTPS không? Vô hiệu hóa tùy chọn này khi chỉ đăng nhập wiki của bạn được bảo mật bằng SSL nhưng việc duyệt wiki được thực hiện không bảo mật.';
+$lang['remote'] = 'Kích hoạt hệ thống API từ xa. Cho phép các ứng dụng khác truy cập wiki thông qua XML-RPC hoặc các cơ chế khác.';
+$lang['remoteuser'] = 'Hạn chế quyền truy cập API từ xa đối với các nhóm hoặc thành viên được phân tách bằng dấu phẩy ở đây. Để trống để cho phép mọi người truy cập.';
+$lang['usewordblock'] = 'Chặn thư rác dựa trên danh sách từ';
+$lang['relnofollow'] = 'Dùng rel="ugc nofollow" cho liên kết ngoài';
+$lang['indexdelay'] = 'Thời gian trễ trước khi lập chỉ mục (giây)';
+$lang['mailguard'] = 'Làm xáo trộn địa chỉ thư điện tử';
+$lang['iexssprotect'] = 'Kiểm tra các tệp đã tải lên có thể có mã JavaScript hoặc HTML độc hại';
+$lang['usedraft'] = 'Tự động lưu bản nháp trong khi đang sửa đổi';
+$lang['htmlok'] = 'Cho phép nhúng HTML';
+$lang['phpok'] = 'Cho phép nhúng PHP';
+$lang['locktime'] = 'Thời gian tối đa cho các tệp khóa (giây)';
+$lang['cachetime'] = 'Thời gian tối đa cho bộ đệm (giây)';
+$lang['target____wiki'] = 'Cửa sổ đích cho các liên kết nội bộ';
+$lang['target____interwiki'] = 'Cửa sổ đích cho các liên kết liên wiki';
+$lang['target____extern'] = 'Cửa sổ đích cho các liên kết ngoài';
+$lang['target____media'] = 'Cửa sổ đích cho các liên kết phương tiên';
+$lang['target____windows'] = 'Cửa sổ đích cho các liên kết cửa sổ';
+$lang['mediarevisions'] = 'Kích hoạt Mediarevisions?';
+$lang['refcheck'] = 'Kiểm tra tệp phương tiện vẫn đang được sử dụng không trước khi xóa nó';
+$lang['gdlib'] = 'Phiên bản GD Lib';
+$lang['im_convert'] = 'Đường dẫn đến công cụ chuyển đổi của ImageMagick';
+$lang['jpg_quality'] = 'Chất lượng nén JPEG (0-100)';
+$lang['fetchsize'] = 'Kích thước tối đa (byte) fetch.php có thể tải xuống từ các URL bên ngoài, ví dụ: để lưu trữ và thay đổi kích thước hình ảnh bên ngoài.';
+$lang['subscribers'] = 'Cho phép thành viên đăng ký thay đổi trang bằng thư điện tử';
+$lang['subscribe_time'] = 'Thời gian danh sách đăng ký và thông báo được gửi (giây); Thời gian này phải nhỏ hơn thời gian được chỉ định trong recent_days.';
+$lang['notify'] = 'Luôn gửi thông báo thay đổi đến địa chỉ thư điện tử này';
+$lang['registernotify'] = 'Luôn gửi thông tin về thành viên mới đăng ký đến địa chỉ thư điện tử này';
+$lang['mailfrom'] = 'Đia chỉ thư điện tử người gửi sử dụng cho thư tự động';
+$lang['mailreturnpath'] = 'Địa chỉ thư điện tử người nhận cho thông báo không cung cấp';
+$lang['mailprefix'] = 'Tiền tố chủ đề thư điện tử sử dụng cho thư tự động. Để trống nếu muốn sử dụng tiêu đề wiki';
+$lang['htmlmail'] = 'Gửi tìm kiếm tốt hơn, nhưng kích thước lớn hơn thư điện tử HTML nhiều phần. Vô hiệu hóa cho các văn bản đơn thuần chỉ thư.';
+$lang['sitemap'] = 'Tạo sơ đồ trang web của Google này thường xuyên (tính theo ngày). Đặt thành 0 để vô hiệu';
+$lang['rss_type'] = 'Loại nguồn cấp dữ liệu XML';
+$lang['rss_linkto'] = 'Liên kết đến nguồn cấp dữ liệu XML ';
+$lang['rss_content'] = 'Hiển thị gì trong các mục nguồn cấp dữ liệu XML?';
+$lang['rss_update'] = 'Khoảng thời gian cập nhật nguồn cấp dữ liệu XML (giây)';
+$lang['rss_show_summary'] = 'Tóm tắt nguồn cấp dữ liệu XML trong tiêu đề';
+$lang['rss_show_deleted'] = 'Hiển thị nguồn cấp dữ liệu XML đã xóa';
+$lang['rss_media'] = 'Loại thay đổi nào sẽ được liệt kê trong nguồn cấp dữ liệu XML?';
+$lang['rss_media_o_both'] = 'cả hai';
+$lang['rss_media_o_pages'] = 'trang';
+$lang['rss_media_o_media'] = 'phương tiện';
+$lang['updatecheck'] = 'Kiểm tra cập nhật và cảnh báo bảo mật? DokuWiki cần kết nối với update.dokuwiki.org để sử dụng tính năng này.';
+$lang['userewrite'] = 'Sử dụng URL đẹp';
+$lang['useslash'] = 'Sử dụng dấu gạch chéo làm dấu phân cách không gian tên trong URL';
+$lang['sepchar'] = 'Phân cách từ trong tên trang';
+$lang['canonical'] = 'Sử dụng URL hoàn toàn kinh điển';
+$lang['fnencode'] = 'Phương pháp mã hóa tên tập tin không phải ASCII.';
+$lang['autoplural'] = 'Kiểm tra các hình thức số nhiều trong các liên kết';
+$lang['compression'] = 'Phương pháp nén cho các tập tin attic ';
+$lang['gzip_output'] = 'Sử dụng mã hóa nội dung gzip cho xhtml';
+$lang['compress'] = 'Đầu ra CSS và javascript nhỏ gọn';
+$lang['cssdatauri'] = 'Kích thước tính theo byte mà hình ảnh được tham chiếu trong tập tin CSS phải được nhúng ngay vào biểu định kiểu để giảm chi phí đầu đề yêu cầu HTTP. <code>400</code> đến <code>600</code> bytes làm các giá trị tốt. Đặt thành <code>0</code> để vô hiệu.';
+$lang['send404'] = 'Gửi "HTTP 404/Không tìm thấy trang" cho các trang không tồn tại';
+$lang['broken_iua'] = 'Chức năng ign_user_abort có bị hỏng trên hệ thống của bạn không? Điều này có thể khiến chỉ mục tìm kiếm không hoạt động. IIS + PHP/CGI được biết sẽ bị hỏng. Xem <a href="http://bugs.dokuwiki.org/?do=details&amp;task_id=852">Bug 852</a> để biết thêm thông tin.';
+$lang['xsendfile'] = 'Sử dụng đầu đề X-Sendfile cho phép máy chủ web cung cấp các tệp tĩnh? Máy chủ web của bạn cần hỗ trợ này.';
+$lang['renderer_xhtml'] = 'Trình kết xuất để sử dụng cho đầu ra wiki chính (xhtml)';
+$lang['renderer__core'] = '%s (lõi dokuwiki)';
+$lang['search_nslimit'] = 'Giới hạn tìm kiếm trong không gian tên X hiện tại. Khi tìm kiếm được thực hiện từ một trang trong không gian tên sâu hơn, không gian tên X đầu tiên sẽ được thêm vào dưới dạng bộ lọc';
+$lang['search_fragment'] = 'Chỉ định hành vi tìm kiếm đoạn mặc định';
+$lang['search_fragment_o_exact'] = 'chính xác';
+$lang['search_fragment_o_starts_with'] = 'bắt đầu với';
+$lang['search_fragment_o_ends_with'] = 'kết thúc bằng';
+$lang['search_fragment_o_contains'] = 'chứa';
+$lang['trustedproxy'] = 'Các proxy chuyển tiếp tin cậy khớp với biểu thức chính quy này về IP máy khách thực mà họ báo cáo. Mặc định phù hợp với các mạng cục bộ. Để trống để tin tưởng không có proxy.';
+$lang['_feature_flags'] = 'Cờ đặc trưng';
+$lang['defer_js'] = 'Trì hoãn javascript được thực thi sau khi HTML của trang được phân tích cú pháp. Cải thiện tốc độ trang nhận thức nhưng có thể phá vỡ một số lượng nhỏ plugin.';
+$lang['dnslookups'] = 'DokuWiki sẽ tra cứu tên máy chủ cho các địa chỉ IP từ xa của các trang sửa đổi người dùng. Nếu bạn có máy chủ DNS chậm hoặc không hoạt động hoặc không muốn tính năng này, hãy tắt tùy chọn này';
+$lang['jquerycdn'] = 'Các tập tin script jQuery và jQuery UI có nên được tải từ CDN không? Việc này thêm các yêu cầu HTTP bổ sung, nhưng có thể tải tập tin nhanh hơn và người dùng có thể đã lưu chúng vào bộ nhớ cache.';
+$lang['jquerycdn_o_0'] = 'Không có CDN, chỉ tải nội bộ';
+$lang['jquerycdn_o_jquery'] = 'CDN tại code.jquery.com';
+$lang['jquerycdn_o_cdnjs'] = 'CDN tại cdnjs.com';
+$lang['proxy____host'] = 'Tên máy chủ Proxy';
+$lang['proxy____port'] = 'Cổng Proxy ';
+$lang['proxy____user'] = 'Tên thành viên Proxy ';
+$lang['proxy____pass'] = 'Mật khẩu Proxy ';
+$lang['proxy____ssl'] = 'Sử dụng SSL khi kết nối với proxy';
+$lang['proxy____except'] = 'Biểu thức chính quy để khớp với các URL mà proxy nên được bỏ qua.';
+$lang['license_o_'] = 'Không chọn';
+$lang['typography_o_0'] = 'Không';
+$lang['typography_o_1'] = 'không bao gồm dấu ngoặc đơn';
+$lang['typography_o_2'] = 'bao gồm cả dấu ngoặc đơn (có thể không phải lúc nào cũng hoạt động)';
+$lang['userewrite_o_0'] = 'không';
+$lang['userewrite_o_2'] = 'Nội bộ DokuWiki ';
+$lang['deaccent_o_0'] = 'tắt';
+$lang['deaccent_o_1'] = 'xóa dấu';
+$lang['deaccent_o_2'] = 'La tinh hóa';
+$lang['gdlib_o_0'] = 'Không có sẵn GD Lib ';
+$lang['gdlib_o_1'] = 'Phiên bản 1.x';
+$lang['gdlib_o_2'] = 'Tự động phát hiện';
+$lang['rss_content_o_abstract'] = 'Abstract';
+$lang['rss_content_o_diff'] = 'Unified Diff';
+$lang['rss_content_o_htmldiff'] = 'bảng HTML định dạng khác';
+$lang['rss_content_o_html'] = 'Nội dung trang HTML đầy đủ';
+$lang['rss_linkto_o_diff'] = 'Xem khác biệt';
+$lang['rss_linkto_o_page'] = 'Trang đã xem lại';
+$lang['rss_linkto_o_rev'] = 'Danh sách phiên bản';
+$lang['rss_linkto_o_current'] = 'trang hiện tại';
+$lang['compression_o_0'] = 'không';
+$lang['compression_o_gz'] = 'gzip';
+$lang['compression_o_bz2'] = 'bz2';
+$lang['xsendfile_o_0'] = 'không sử dụng';
+$lang['xsendfile_o_1'] = 'Đầu đề lighttpd độc quyền (trước khi phát hành 1.5)';
+$lang['xsendfile_o_2'] = 'Đầu đề X-Sendfile tiêu chuẩn';
+$lang['xsendfile_o_3'] = 'Đầu đề Nginx X-Accel-Redirect độc quyền';
+$lang['showuseras_o_loginname'] = 'Tên đăng nhập';
+$lang['showuseras_o_username'] = 'Tên đầy đủ của thành viên';
+$lang['showuseras_o_username_link'] = 'Tên đầy đủ của thành viên dưới dạng liên kết người dùng liên wiki';
+$lang['showuseras_o_email'] = 'Địa chỉ thư điện tử của thành viên (bị xáo trộn theo cài đặt mailguard)';
+$lang['showuseras_o_email_link'] = 'Địa chỉ thư điện tử của thành viên dưới dạng mailto: link';
+$lang['useheading_o_0'] = 'Không bao giờ';
+$lang['useheading_o_navigation'] = 'Chỉ điều hướng';
+$lang['useheading_o_content'] = 'Chỉ nội dung Wiki';
+$lang['useheading_o_1'] = 'Luôn luôn';
+$lang['readdircache'] = 'Thời gian tối đa cho bộ nhớ cache readdir (giây)';
diff --git a/lib/plugins/config/lang/zh-tw/lang.php b/lib/plugins/config/lang/zh-tw/lang.php
index 6723fe424..677015cb8 100644
--- a/lib/plugins/config/lang/zh-tw/lang.php
+++ b/lib/plugins/config/lang/zh-tw/lang.php
@@ -151,12 +151,6 @@ $lang['proxy____user'] = 'Proxy 使用者名稱';
$lang['proxy____pass'] = 'Proxy 密碼';
$lang['proxy____ssl'] = '使用 SSL 連接到 Proxy';
$lang['proxy____except'] = '比對 proxy 代理時應跳過的地址的正規式。';
-$lang['safemodehack'] = '啟用 Safemode Hack';
-$lang['ftp____host'] = 'Safemode Hack 的 FTP 伺服器';
-$lang['ftp____port'] = 'Safemode Hack 的 FTP 端口';
-$lang['ftp____user'] = 'Safemode Hack 的 FTP 帳戶';
-$lang['ftp____pass'] = 'Safemode Hack 的 FTP 密碼';
-$lang['ftp____root'] = 'Safemode Hack 的 FTP 根路徑';
$lang['license_o_'] = '未選擇';
$lang['typography_o_0'] = '無';
$lang['typography_o_1'] = '只限雙引號';
diff --git a/lib/plugins/config/lang/zh/lang.php b/lib/plugins/config/lang/zh/lang.php
index 6da00eeb1..205b571c3 100644
--- a/lib/plugins/config/lang/zh/lang.php
+++ b/lib/plugins/config/lang/zh/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Xin <chenxin1034@gmail.com>
+ * @author HaoNan <haonan@zhuoming.info>
+ * @author Phy <dokuwiki@phy25.com>
+ * @author Aaron Zhou <iradio@163.com>
* @author lempel <riverlempel@hotmail.com>
* @author ZDYX <zhangduyixiong@gmail.com>
* @author http://www.chinese-tools.com/tools/converter-tradsimp.html
@@ -48,6 +52,7 @@ $lang['_advanced'] = '高级设置';
$lang['_network'] = '网络设置';
$lang['_msg_setting_undefined'] = '设置的元数据不存在。';
$lang['_msg_setting_no_class'] = '设置的分类不存在。';
+$lang['_msg_setting_no_known_class'] = '设置分类不可用';
$lang['_msg_setting_no_default'] = '设置的默认值不存在。';
$lang['title'] = '维基站点的标题';
$lang['start'] = '开始页面的名称';
@@ -158,6 +163,14 @@ $lang['xsendfile'] = '使用 X-Sendfile 头让服务器发送状态
$lang['renderer_xhtml'] = '主维基页面 (xhtml) 输出使用的渲染';
$lang['renderer__core'] = '%s(DokuWiki 内核)';
$lang['renderer__plugin'] = '%s(插件)';
+$lang['search_nslimit'] = '限制搜索范围为当前若干层命名空间。当搜索在更深的命名空间中被执行时,前若干层命名空间将会被用来筛选';
+$lang['search_fragment'] = '指定默认的分段搜索方式';
+$lang['search_fragment_o_exact'] = '精确';
+$lang['search_fragment_o_starts_with'] = '开头为';
+$lang['search_fragment_o_ends_with'] = '结尾为';
+$lang['search_fragment_o_contains'] = '包含';
+$lang['_feature_flags'] = '功能标志';
+$lang['defer_js'] = '推迟在页面HTML解析后执行的JavaScript。提高了页面的感知速度,但可能会破坏少量插件。';
$lang['dnslookups'] = 'DokuWiki 将会查询用户编辑页面的远程 IP 地址的主机名。如果您的 DNS 服务器比较缓慢或者不工作,或者您不想要这个功能,请禁用此选项。';
$lang['jquerycdn'] = 'jQuery和jQuery UI脚本文件应该从CDN加载吗?
这会增加额外的HTTP请求,但文件加载可能会更快,且用户可能已经缓存过。';
@@ -170,12 +183,6 @@ $lang['proxy____user'] = '代理服务器的用户名';
$lang['proxy____pass'] = '代理服务器的密码';
$lang['proxy____ssl'] = '使用 SSL 连接到代理服务器';
$lang['proxy____except'] = '用来匹配代理应跳过的地址的正则表达式。';
-$lang['safemodehack'] = '启用 Safemode Hack';
-$lang['ftp____host'] = 'Safemode Hack 的 FTP 服务器';
-$lang['ftp____port'] = 'Safemode Hack 的 FTP 端口';
-$lang['ftp____user'] = 'Safemode Hack 的 FTP 用户名';
-$lang['ftp____pass'] = 'Safemode Hack 的 FTP 密码';
-$lang['ftp____root'] = 'Safemode Hack 的 FTP 根路径';
$lang['license_o_'] = '什么都没有选';
$lang['typography_o_0'] = '无';
$lang['typography_o_1'] = '仅限双引号';
diff --git a/lib/plugins/config/settings/config.class.php b/lib/plugins/config/settings/config.class.php
deleted file mode 100644
index 3196d7527..000000000
--- a/lib/plugins/config/settings/config.class.php
+++ /dev/null
@@ -1,1430 +0,0 @@
-<?php
-/**
- * Configuration Class and generic setting classes
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- * @author Ben Coburn <btcoburn@silicodon.net>
- */
-
-
-if(!defined('CM_KEYMARKER')) define('CM_KEYMARKER','____');
-
-if (!class_exists('configuration')) {
- /**
- * Class configuration
- */
- class configuration {
-
- var $_name = 'conf'; // name of the config variable found in the files (overridden by $config['varname'])
- var $_format = 'php'; // format of the config file, supported formats - php (overridden by $config['format'])
- var $_heading = ''; // heading string written at top of config file - don't include comment indicators
- var $_loaded = false; // set to true after configuration files are loaded
- var $_metadata = array(); // holds metadata describing the settings
- /** @var setting[] */
- var $setting = array(); // array of setting objects
- var $locked = false; // configuration is considered locked if it can't be updated
- var $show_disabled_plugins = false;
-
- // configuration filenames
- var $_default_files = array();
- var $_local_files = array(); // updated configuration is written to the first file
- var $_protected_files = array();
-
- var $_plugin_list = null;
-
- /**
- * constructor
- *
- * @param string $datafile path to config metadata file
- */
- public function __construct($datafile) {
- global $conf, $config_cascade;
-
- if (!file_exists($datafile)) {
- msg('No configuration metadata found at - '.htmlspecialchars($datafile),-1);
- return;
- }
- $meta = array();
- include($datafile);
-
- if (isset($config['varname'])) $this->_name = $config['varname'];
- if (isset($config['format'])) $this->_format = $config['format'];
- if (isset($config['heading'])) $this->_heading = $config['heading'];
-
- $this->_default_files = $config_cascade['main']['default'];
- $this->_local_files = $config_cascade['main']['local'];
- $this->_protected_files = $config_cascade['main']['protected'];
-
- $this->locked = $this->_is_locked();
- $this->_metadata = array_merge($meta, $this->get_plugintpl_metadata($conf['template']));
- $this->retrieve_settings();
- }
-
- /**
- * Retrieve and stores settings in setting[] attribute
- */
- public function retrieve_settings() {
- global $conf;
- $no_default_check = array('setting_fieldset', 'setting_undefined', 'setting_no_class');
-
- if (!$this->_loaded) {
- $default = array_merge($this->get_plugintpl_default($conf['template']), $this->_read_config_group($this->_default_files));
- $local = $this->_read_config_group($this->_local_files);
- $protected = $this->_read_config_group($this->_protected_files);
-
- $keys = array_merge(array_keys($this->_metadata),array_keys($default), array_keys($local), array_keys($protected));
- $keys = array_unique($keys);
-
- $param = null;
- foreach ($keys as $key) {
- if (isset($this->_metadata[$key])) {
- $class = $this->_metadata[$key][0];
-
- if($class && class_exists('setting_'.$class)){
- $class = 'setting_'.$class;
- } else {
- if($class != '') {
- $this->setting[] = new setting_no_class($key,$param);
- }
- $class = 'setting';
- }
-
- $param = $this->_metadata[$key];
- array_shift($param);
- } else {
- $class = 'setting_undefined';
- $param = null;
- }
-
- if (!in_array($class, $no_default_check) && !isset($default[$key])) {
- $this->setting[] = new setting_no_default($key,$param);
- }
-
- $this->setting[$key] = new $class($key,$param);
-
- $d = array_key_exists($key, $default) ? $default[$key] : null;
- $l = array_key_exists($key, $local) ? $local[$key] : null;
- $p = array_key_exists($key, $protected) ? $protected[$key] : null;
-
- $this->setting[$key]->initialize($d,$l,$p);
- }
-
- $this->_loaded = true;
- }
- }
-
- /**
- * Stores setting[] array to file
- *
- * @param string $id Name of plugin, which saves the settings
- * @param string $header Text at the top of the rewritten settings file
- * @param bool $backup backup current file? (remove any existing backup)
- * @return bool succesful?
- */
- public function save_settings($id, $header='', $backup=true) {
- global $conf;
-
- if ($this->locked) return false;
-
- // write back to the last file in the local config cascade
- $file = end($this->_local_files);
-
- // backup current file (remove any existing backup)
- if (file_exists($file) && $backup) {
- if (file_exists($file.'.bak')) @unlink($file.'.bak');
- if (!io_rename($file, $file.'.bak')) return false;
- }
-
- if (!$fh = @fopen($file, 'wb')) {
- io_rename($file.'.bak', $file); // problem opening, restore the backup
- return false;
- }
-
- if (empty($header)) $header = $this->_heading;
-
- $out = $this->_out_header($id,$header);
-
- foreach ($this->setting as $setting) {
- $out .= $setting->out($this->_name, $this->_format);
- }
-
- $out .= $this->_out_footer();
-
- @fwrite($fh, $out);
- fclose($fh);
- if($conf['fperm']) chmod($file, $conf['fperm']);
- return true;
- }
-
- /**
- * Update last modified time stamp of the config file
- *
- * @return bool
- */
- public function touch_settings(){
- if ($this->locked) return false;
- $file = end($this->_local_files);
- return @touch($file);
- }
-
- /**
- * Read and merge given config files
- *
- * @param array $files file paths
- * @return array config settings
- */
- protected function _read_config_group($files) {
- $config = array();
- foreach ($files as $file) {
- $config = array_merge($config, $this->_read_config($file));
- }
-
- return $config;
- }
-
- /**
- * Return an array of config settings
- *
- * @param string $file file path
- * @return array config settings
- */
- function _read_config($file) {
-
- if (!$file) return array();
-
- $config = array();
-
- if ($this->_format == 'php') {
-
- if(file_exists($file)){
- $contents = @php_strip_whitespace($file);
- }else{
- $contents = '';
- }
- $pattern = '/\$'.$this->_name.'\[[\'"]([^=]+)[\'"]\] ?= ?(.*?);(?=[^;]*(?:\$'.$this->_name.'|$))/s';
- $matches=array();
- preg_match_all($pattern,$contents,$matches,PREG_SET_ORDER);
-
- for ($i=0; $i<count($matches); $i++) {
- $value = $matches[$i][2];
-
- // correct issues with the incoming data
- // FIXME ... for now merge multi-dimensional array indices using ____
- $key = preg_replace('/.\]\[./',CM_KEYMARKER,$matches[$i][1]);
-
- // handle arrays
- if(preg_match('/^array ?\((.*)\)/', $value, $match)){
- $arr = explode(',', $match[1]);
-
- // remove quotes from quoted strings & unescape escaped data
- $len = count($arr);
- for($j=0; $j<$len; $j++){
- $arr[$j] = trim($arr[$j]);
- $arr[$j] = $this->_readValue($arr[$j]);
- }
-
- $value = $arr;
- }else{
- $value = $this->_readValue($value);
- }
-
- $config[$key] = $value;
- }
- }
-
- return $config;
- }
-
- /**
- * Convert php string into value
- *
- * @param string $value
- * @return bool|string
- */
- protected function _readValue($value) {
- $removequotes_pattern = '/^(\'|")(.*)(?<!\\\\)\1$/s';
- $unescape_pairs = array(
- '\\\\' => '\\',
- '\\\'' => '\'',
- '\\"' => '"'
- );
-
- if($value == 'true') {
- $value = true;
- } elseif($value == 'false') {
- $value = false;
- } else {
- // remove quotes from quoted strings & unescape escaped data
- $value = preg_replace($removequotes_pattern,'$2',$value);
- $value = strtr($value, $unescape_pairs);
- }
- return $value;
- }
-
- /**
- * Returns header of rewritten settings file
- *
- * @param string $id plugin name of which generated this output
- * @param string $header additional text for at top of the file
- * @return string text of header
- */
- protected function _out_header($id, $header) {
- $out = '';
- if ($this->_format == 'php') {
- $out .= '<'.'?php'."\n".
- "/*\n".
- " * ".$header."\n".
- " * Auto-generated by ".$id." plugin\n".
- " * Run for user: ".$_SERVER['REMOTE_USER']."\n".
- " * Date: ".date('r')."\n".
- " */\n\n";
- }
-
- return $out;
- }
-
- /**
- * Returns footer of rewritten settings file
- *
- * @return string text of footer
- */
- protected function _out_footer() {
- $out = '';
- if ($this->_format == 'php') {
- $out .= "\n// end auto-generated content\n";
- }
-
- return $out;
- }
-
- /**
- * Configuration is considered locked if there is no local settings filename
- * or the directory its in is not writable or the file exists and is not writable
- *
- * @return bool true: locked, false: writable
- */
- protected function _is_locked() {
- if (!$this->_local_files) return true;
-
- $local = $this->_local_files[0];
-
- if (!is_writable(dirname($local))) return true;
- if (file_exists($local) && !is_writable($local)) return true;
-
- return false;
- }
-
- /**
- * not used ... conf's contents are an array!
- * reduce any multidimensional settings to one dimension using CM_KEYMARKER
- *
- * @param $conf
- * @param string $prefix
- * @return array
- */
- protected function _flatten($conf,$prefix='') {
-
- $out = array();
-
- foreach($conf as $key => $value) {
- if (!is_array($value)) {
- $out[$prefix.$key] = $value;
- continue;
- }
-
- $tmp = $this->_flatten($value,$prefix.$key.CM_KEYMARKER);
- $out = array_merge($out,$tmp);
- }
-
- return $out;
- }
-
- /**
- * Returns array of plugin names
- *
- * @return array plugin names
- * @triggers PLUGIN_CONFIG_PLUGINLIST event
- */
- function get_plugin_list() {
- if (is_null($this->_plugin_list)) {
- $list = plugin_list('',$this->show_disabled_plugins);
-
- // remove this plugin from the list
- $idx = array_search('config',$list);
- unset($list[$idx]);
-
- trigger_event('PLUGIN_CONFIG_PLUGINLIST',$list);
- $this->_plugin_list = $list;
- }
-
- return $this->_plugin_list;
- }
-
- /**
- * load metadata for plugin and template settings
- *
- * @param string $tpl name of active template
- * @return array metadata of settings
- */
- function get_plugintpl_metadata($tpl){
- $file = '/conf/metadata.php';
- $class = '/conf/settings.class.php';
- $metadata = array();
-
- foreach ($this->get_plugin_list() as $plugin) {
- $plugin_dir = plugin_directory($plugin);
- if (file_exists(DOKU_PLUGIN.$plugin_dir.$file)){
- $meta = array();
- @include(DOKU_PLUGIN.$plugin_dir.$file);
- @include(DOKU_PLUGIN.$plugin_dir.$class);
- if (!empty($meta)) {
- $metadata['plugin'.CM_KEYMARKER.$plugin.CM_KEYMARKER.'plugin_settings_name'] = array('fieldset');
- }
- foreach ($meta as $key => $value){
- if ($value[0]=='fieldset') { continue; } //plugins only get one fieldset
- $metadata['plugin'.CM_KEYMARKER.$plugin.CM_KEYMARKER.$key] = $value;
- }
- }
- }
-
- // the same for the active template
- if (file_exists(tpl_incdir().$file)){
- $meta = array();
- @include(tpl_incdir().$file);
- @include(tpl_incdir().$class);
- if (!empty($meta)) {
- $metadata['tpl'.CM_KEYMARKER.$tpl.CM_KEYMARKER.'template_settings_name'] = array('fieldset');
- }
- foreach ($meta as $key => $value){
- if ($value[0]=='fieldset') { continue; } //template only gets one fieldset
- $metadata['tpl'.CM_KEYMARKER.$tpl.CM_KEYMARKER.$key] = $value;
- }
- }
-
- return $metadata;
- }
-
- /**
- * Load default settings for plugins and templates
- *
- * @param string $tpl name of active template
- * @return array default settings
- */
- function get_plugintpl_default($tpl){
- $file = '/conf/default.php';
- $default = array();
-
- foreach ($this->get_plugin_list() as $plugin) {
- $plugin_dir = plugin_directory($plugin);
- if (file_exists(DOKU_PLUGIN.$plugin_dir.$file)){
- $conf = $this->_read_config(DOKU_PLUGIN.$plugin_dir.$file);
- foreach ($conf as $key => $value){
- $default['plugin'.CM_KEYMARKER.$plugin.CM_KEYMARKER.$key] = $value;
- }
- }
- }
-
- // the same for the active template
- if (file_exists(tpl_incdir().$file)){
- $conf = $this->_read_config(tpl_incdir().$file);
- foreach ($conf as $key => $value){
- $default['tpl'.CM_KEYMARKER.$tpl.CM_KEYMARKER.$key] = $value;
- }
- }
-
- return $default;
- }
-
- }
-}
-
-if (!class_exists('setting')) {
- /**
- * Class setting
- */
- class setting {
-
- var $_key = '';
- var $_default = null;
- var $_local = null;
- var $_protected = null;
-
- var $_pattern = '';
- var $_error = false; // only used by those classes which error check
- var $_input = null; // only used by those classes which error check
- var $_caution = null; // used by any setting to provide an alert along with the setting
- // valid alerts, 'warning', 'danger', 'security'
- // images matching the alerts are in the plugin's images directory
-
- static protected $_validCautions = array('warning','danger','security');
-
- /**
- * @param string $key
- * @param array|null $params array with metadata of setting
- */
- public function __construct($key, $params=null) {
- $this->_key = $key;
-
- if (is_array($params)) {
- foreach($params as $property => $value) {
- $this->$property = $value;
- }
- }
- }
-
- /**
- * Receives current values for the setting $key
- *
- * @param mixed $default default setting value
- * @param mixed $local local setting value
- * @param mixed $protected protected setting value
- */
- public function initialize($default, $local, $protected) {
- if (isset($default)) $this->_default = $default;
- if (isset($local)) $this->_local = $local;
- if (isset($protected)) $this->_protected = $protected;
- }
-
- /**
- * update changed setting with user provided value $input
- * - if changed value fails error check, save it to $this->_input (to allow echoing later)
- * - if changed value passes error check, set $this->_local to the new value
- *
- * @param mixed $input the new value
- * @return boolean true if changed, false otherwise (also on error)
- */
- public function update($input) {
- if (is_null($input)) return false;
- if ($this->is_protected()) return false;
-
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- if ($value == $input) return false;
-
- if ($this->_pattern && !preg_match($this->_pattern,$input)) {
- $this->_error = true;
- $this->_input = $input;
- return false;
- }
-
- $this->_local = $input;
- return true;
- }
-
- /**
- * Build html for label and input of setting
- *
- * @param admin_plugin_config $plugin object of config plugin
- * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting
- * @return string[] with content array(string $label_html, string $input_html)
- */
- public function html(admin_plugin_config $plugin, $echo=false) {
- $disable = '';
-
- if ($this->is_protected()) {
- $value = $this->_protected;
- $disable = 'disabled="disabled"';
- } else {
- if ($echo && $this->_error) {
- $value = $this->_input;
- } else {
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- }
- }
-
- $key = htmlspecialchars($this->_key);
- $value = formText($value);
-
- $label = '<label for="config___'.$key.'">'.$this->prompt($plugin).'</label>';
- $input = '<textarea rows="3" cols="40" id="config___'.$key.'" name="config['.$key.']" class="edit" '.$disable.'>'.$value.'</textarea>';
- return array($label,$input);
- }
-
- /**
- * Generate string to save setting value to file according to $fmt
- *
- * @param string $var name of variable
- * @param string $fmt save format
- * @return string
- */
- public function out($var, $fmt='php') {
-
- if ($this->is_protected()) return '';
- if (is_null($this->_local) || ($this->_default == $this->_local)) return '';
-
- $out = '';
-
- if ($fmt=='php') {
- $tr = array("\\" => '\\\\', "'" => '\\\'');
-
- $out = '$'.$var."['".$this->_out_key()."'] = '".strtr( cleanText($this->_local), $tr)."';\n";
- }
-
- return $out;
- }
-
- /**
- * Returns the localized prompt
- *
- * @param admin_plugin_config $plugin object of config plugin
- * @return string text
- */
- public function prompt(admin_plugin_config $plugin) {
- $prompt = $plugin->getLang($this->_key);
- if (!$prompt) $prompt = htmlspecialchars(str_replace(array('____','_'),' ',$this->_key));
- return $prompt;
- }
-
- /**
- * Is setting protected
- *
- * @return bool
- */
- public function is_protected() { return !is_null($this->_protected); }
-
- /**
- * Is setting the default?
- *
- * @return bool
- */
- public function is_default() { return !$this->is_protected() && is_null($this->_local); }
-
- /**
- * Has an error?
- *
- * @return bool
- */
- public function error() { return $this->_error; }
-
- /**
- * Returns caution
- *
- * @return false|string caution string, otherwise false for invalid caution
- */
- public function caution() {
- if (!empty($this->_caution)) {
- if (!in_array($this->_caution, setting::$_validCautions)) {
- trigger_error('Invalid caution string ('.$this->_caution.') in metadata for setting "'.$this->_key.'"', E_USER_WARNING);
- return false;
- }
- return $this->_caution;
- }
- // compatibility with previous cautionList
- // TODO: check if any plugins use; remove
- if (!empty($this->_cautionList[$this->_key])) {
- $this->_caution = $this->_cautionList[$this->_key];
- unset($this->_cautionList);
-
- return $this->caution();
- }
- return false;
- }
-
- /**
- * Returns setting key, eventually with referer to config: namespace at dokuwiki.org
- *
- * @param bool $pretty create nice key
- * @param bool $url provide url to config: namespace
- * @return string key
- */
- public function _out_key($pretty=false,$url=false) {
- if($pretty){
- $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
- return '<a href="http://www.dokuwiki.org/config:'.$out.'">'.$out.'</a>';
- }
- return $out;
- }else{
- return str_replace(CM_KEYMARKER,"']['",$this->_key);
- }
- }
- }
-}
-
-
-if (!class_exists('setting_array')) {
- /**
- * Class setting_array
- */
- class setting_array extends setting {
-
- /**
- * Create an array from a string
- *
- * @param string $string
- * @return array
- */
- protected function _from_string($string){
- $array = explode(',', $string);
- $array = array_map('trim', $array);
- $array = array_filter($array);
- $array = array_unique($array);
- return $array;
- }
-
- /**
- * Create a string from an array
- *
- * @param array $array
- * @return string
- */
- protected function _from_array($array){
- return join(', ', (array) $array);
- }
-
- /**
- * update setting with user provided value $input
- * if value fails error check, save it
- *
- * @param string $input
- * @return bool true if changed, false otherwise (incl. on error)
- */
- function update($input) {
- if (is_null($input)) return false;
- if ($this->is_protected()) return false;
-
- $input = $this->_from_string($input);
-
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- if ($value == $input) return false;
-
- foreach($input as $item){
- if ($this->_pattern && !preg_match($this->_pattern,$item)) {
- $this->_error = true;
- $this->_input = $input;
- return false;
- }
- }
-
- $this->_local = $input;
- return true;
- }
-
- /**
- * Escaping
- *
- * @param string $string
- * @return string
- */
- protected function _escape($string) {
- $tr = array("\\" => '\\\\', "'" => '\\\'');
- return "'".strtr( cleanText($string), $tr)."'";
- }
-
- /**
- * Generate string to save setting value to file according to $fmt
- *
- * @param string $var name of variable
- * @param string $fmt save format
- * @return string
- */
- function out($var, $fmt='php') {
-
- if ($this->is_protected()) return '';
- if (is_null($this->_local) || ($this->_default == $this->_local)) return '';
-
- $out = '';
-
- if ($fmt=='php') {
- $vals = array_map(array($this, '_escape'), $this->_local);
- $out = '$'.$var."['".$this->_out_key()."'] = array(".join(', ',$vals).");\n";
- }
-
- return $out;
- }
-
- /**
- * Build html for label and input of setting
- *
- * @param admin_plugin_config $plugin object of config plugin
- * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting
- * @return string[] with content array(string $label_html, string $input_html)
- */
- function html(admin_plugin_config $plugin, $echo=false) {
- $disable = '';
-
- if ($this->is_protected()) {
- $value = $this->_protected;
- $disable = 'disabled="disabled"';
- } else {
- if ($echo && $this->_error) {
- $value = $this->_input;
- } else {
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- }
- }
-
- $key = htmlspecialchars($this->_key);
- $value = htmlspecialchars($this->_from_array($value));
-
- $label = '<label for="config___'.$key.'">'.$this->prompt($plugin).'</label>';
- $input = '<input id="config___'.$key.'" name="config['.$key.']" type="text" class="edit" value="'.$value.'" '.$disable.'/>';
- return array($label,$input);
- }
- }
-}
-
-if (!class_exists('setting_string')) {
- /**
- * Class setting_string
- */
- class setting_string extends setting {
- /**
- * Build html for label and input of setting
- *
- * @param admin_plugin_config $plugin object of config plugin
- * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting
- * @return string[] with content array(string $label_html, string $input_html)
- */
- function html(admin_plugin_config $plugin, $echo=false) {
- $disable = '';
-
- if ($this->is_protected()) {
- $value = $this->_protected;
- $disable = 'disabled="disabled"';
- } else {
- if ($echo && $this->_error) {
- $value = $this->_input;
- } else {
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- }
- }
-
- $key = htmlspecialchars($this->_key);
- $value = htmlspecialchars($value);
-
- $label = '<label for="config___'.$key.'">'.$this->prompt($plugin).'</label>';
- $input = '<input id="config___'.$key.'" name="config['.$key.']" type="text" class="edit" value="'.$value.'" '.$disable.'/>';
- return array($label,$input);
- }
- }
-}
-
-if (!class_exists('setting_password')) {
- /**
- * Class setting_password
- */
- class setting_password extends setting_string {
-
- var $_code = 'plain'; // mechanism to be used to obscure passwords
-
- /**
- * update changed setting with user provided value $input
- * - if changed value fails error check, save it to $this->_input (to allow echoing later)
- * - if changed value passes error check, set $this->_local to the new value
- *
- * @param mixed $input the new value
- * @return boolean true if changed, false otherwise (also on error)
- */
- function update($input) {
- if ($this->is_protected()) return false;
- if (!$input) return false;
-
- if ($this->_pattern && !preg_match($this->_pattern,$input)) {
- $this->_error = true;
- $this->_input = $input;
- return false;
- }
-
- $this->_local = conf_encodeString($input,$this->_code);
- return true;
- }
-
- /**
- * Build html for label and input of setting
- *
- * @param admin_plugin_config $plugin object of config plugin
- * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting
- * @return string[] with content array(string $label_html, string $input_html)
- */
- function html(admin_plugin_config $plugin, $echo=false) {
-
- $disable = $this->is_protected() ? 'disabled="disabled"' : '';
-
- $key = htmlspecialchars($this->_key);
-
- $label = '<label for="config___'.$key.'">'.$this->prompt($plugin).'</label>';
- $input = '<input id="config___'.$key.'" name="config['.$key.']" autocomplete="off" type="password" class="edit" value="" '.$disable.' />';
- return array($label,$input);
- }
- }
-}
-
-if (!class_exists('setting_email')) {
- /**
- * Class setting_email
- */
- class setting_email extends setting_string {
- var $_multiple = false;
- var $_placeholders = false;
-
- /**
- * update setting with user provided value $input
- * if value fails error check, save it
- *
- * @param mixed $input
- * @return boolean true if changed, false otherwise (incl. on error)
- */
- function update($input) {
- if (is_null($input)) return false;
- if ($this->is_protected()) return false;
-
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- if ($value == $input) return false;
- if($input === ''){
- $this->_local = $input;
- return true;
- }
- $mail = $input;
-
- if($this->_placeholders){
- // replace variables with pseudo values
- $mail = str_replace('@USER@','joe',$mail);
- $mail = str_replace('@NAME@','Joe Schmoe',$mail);
- $mail = str_replace('@MAIL@','joe@example.com',$mail);
- }
-
- // multiple mail addresses?
- if ($this->_multiple) {
- $mails = array_filter(array_map('trim', explode(',', $mail)));
- } else {
- $mails = array($mail);
- }
-
- // check them all
- foreach ($mails as $mail) {
- // only check the address part
- if(preg_match('#(.*?)<(.*?)>#', $mail, $matches)){
- $addr = $matches[2];
- }else{
- $addr = $mail;
- }
-
- if (!mail_isvalid($addr)) {
- $this->_error = true;
- $this->_input = $input;
- return false;
- }
- }
-
- $this->_local = $input;
- return true;
- }
- }
-}
-
-if (!class_exists('setting_numeric')) {
- /**
- * Class setting_numeric
- */
- class setting_numeric extends setting_string {
- // This allows for many PHP syntax errors...
- // var $_pattern = '/^[-+\/*0-9 ]*$/';
- // much more restrictive, but should eliminate syntax errors.
- var $_pattern = '/^[-+]? *[0-9]+ *(?:[-+*] *[0-9]+ *)*$/';
- var $_min = null;
- var $_max = null;
-
- /**
- * update changed setting with user provided value $input
- * - if changed value fails error check, save it to $this->_input (to allow echoing later)
- * - if changed value passes error check, set $this->_local to the new value
- *
- * @param mixed $input the new value
- * @return boolean true if changed, false otherwise (also on error)
- */
- function update($input) {
- $local = $this->_local;
- $valid = parent::update($input);
- if ($valid && !(is_null($this->_min) && is_null($this->_max))) {
- $numeric_local = (int) eval('return '.$this->_local.';');
- if ((!is_null($this->_min) && $numeric_local < $this->_min) ||
- (!is_null($this->_max) && $numeric_local > $this->_max)) {
- $this->_error = true;
- $this->_input = $input;
- $this->_local = $local;
- $valid = false;
- }
- }
- return $valid;
- }
-
- /**
- * Generate string to save setting value to file according to $fmt
- *
- * @param string $var name of variable
- * @param string $fmt save format
- * @return string
- */
- function out($var, $fmt='php') {
-
- if ($this->is_protected()) return '';
- if (is_null($this->_local) || ($this->_default == $this->_local)) return '';
-
- $out = '';
-
- if ($fmt=='php') {
- $local = $this->_local === '' ? "''" : $this->_local;
- $out .= '$'.$var."['".$this->_out_key()."'] = ".$local.";\n";
- }
-
- return $out;
- }
- }
-}
-
-if (!class_exists('setting_numericopt')) {
- /**
- * Class setting_numericopt
- */
- class setting_numericopt extends setting_numeric {
- // just allow an empty config
- var $_pattern = '/^(|[-]?[0-9]+(?:[-+*][0-9]+)*)$/';
-
-
- /**
- * Empty string is valid for numericopt
- *
- * @param mixed $input
- *
- * @return bool
- */
- function update($input) {
- if ($input === '') {
- return true;
- }
-
- return parent::update($input);
- }
- }
-}
-
-if (!class_exists('setting_onoff')) {
- /**
- * Class setting_onoff
- */
- class setting_onoff extends setting_numeric {
- /**
- * Build html for label and input of setting
- *
- * @param admin_plugin_config $plugin object of config plugin
- * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting
- * @return string[] with content array(string $label_html, string $input_html)
- */
- function html(admin_plugin_config $plugin, $echo = false) {
- $disable = '';
-
- if ($this->is_protected()) {
- $value = $this->_protected;
- $disable = ' disabled="disabled"';
- } else {
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- }
-
- $key = htmlspecialchars($this->_key);
- $checked = ($value) ? ' checked="checked"' : '';
-
- $label = '<label for="config___'.$key.'">'.$this->prompt($plugin).'</label>';
- $input = '<div class="input"><input id="config___'.$key.'" name="config['.$key.']" type="checkbox" class="checkbox" value="1"'.$checked.$disable.'/></div>';
- return array($label,$input);
- }
-
- /**
- * update changed setting with user provided value $input
- * - if changed value fails error check, save it to $this->_input (to allow echoing later)
- * - if changed value passes error check, set $this->_local to the new value
- *
- * @param mixed $input the new value
- * @return boolean true if changed, false otherwise (also on error)
- */
- function update($input) {
- if ($this->is_protected()) return false;
-
- $input = ($input) ? 1 : 0;
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- if ($value == $input) return false;
-
- $this->_local = $input;
- return true;
- }
- }
-}
-
-if (!class_exists('setting_multichoice')) {
- /**
- * Class setting_multichoice
- */
- class setting_multichoice extends setting_string {
- var $_choices = array();
- var $lang; //some custom language strings are stored in setting
-
- /**
- * Build html for label and input of setting
- *
- * @param admin_plugin_config $plugin object of config plugin
- * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting
- * @return string[] with content array(string $label_html, string $input_html)
- */
- function html(admin_plugin_config $plugin, $echo = false) {
- $disable = '';
- $nochoice = '';
-
- if ($this->is_protected()) {
- $value = $this->_protected;
- $disable = ' disabled="disabled"';
- } else {
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- }
-
- // ensure current value is included
- if (!in_array($value, $this->_choices)) {
- $this->_choices[] = $value;
- }
- // disable if no other choices
- if (!$this->is_protected() && count($this->_choices) <= 1) {
- $disable = ' disabled="disabled"';
- $nochoice = $plugin->getLang('nochoice');
- }
-
- $key = htmlspecialchars($this->_key);
-
- $label = '<label for="config___'.$key.'">'.$this->prompt($plugin).'</label>';
-
- $input = "<div class=\"input\">\n";
- $input .= '<select class="edit" id="config___'.$key.'" name="config['.$key.']"'.$disable.'>'."\n";
- foreach ($this->_choices as $choice) {
- $selected = ($value == $choice) ? ' selected="selected"' : '';
- $option = $plugin->getLang($this->_key.'_o_'.$choice);
- if (!$option && isset($this->lang[$this->_key.'_o_'.$choice])) $option = $this->lang[$this->_key.'_o_'.$choice];
- if (!$option) $option = $choice;
-
- $choice = htmlspecialchars($choice);
- $option = htmlspecialchars($option);
- $input .= ' <option value="'.$choice.'"'.$selected.' >'.$option.'</option>'."\n";
- }
- $input .= "</select> $nochoice \n";
- $input .= "</div>\n";
-
- return array($label,$input);
- }
-
- /**
- * update changed setting with user provided value $input
- * - if changed value fails error check, save it to $this->_input (to allow echoing later)
- * - if changed value passes error check, set $this->_local to the new value
- *
- * @param mixed $input the new value
- * @return boolean true if changed, false otherwise (also on error)
- */
- function update($input) {
- if (is_null($input)) return false;
- if ($this->is_protected()) return false;
-
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- if ($value == $input) return false;
-
- if (!in_array($input, $this->_choices)) return false;
-
- $this->_local = $input;
- return true;
- }
- }
-}
-
-
-if (!class_exists('setting_dirchoice')) {
- /**
- * Class setting_dirchoice
- */
- class setting_dirchoice extends setting_multichoice {
-
- var $_dir = '';
-
- /**
- * Receives current values for the setting $key
- *
- * @param mixed $default default setting value
- * @param mixed $local local setting value
- * @param mixed $protected protected setting value
- */
- function initialize($default,$local,$protected) {
-
- // populate $this->_choices with a list of directories
- $list = array();
-
- if ($dh = @opendir($this->_dir)) {
- while (false !== ($entry = readdir($dh))) {
- if ($entry == '.' || $entry == '..') continue;
- if ($this->_pattern && !preg_match($this->_pattern,$entry)) continue;
-
- $file = (is_link($this->_dir.$entry)) ? readlink($this->_dir.$entry) : $this->_dir.$entry;
- if (is_dir($file)) $list[] = $entry;
- }
- closedir($dh);
- }
- sort($list);
- $this->_choices = $list;
-
- parent::initialize($default,$local,$protected);
- }
- }
-}
-
-
-if (!class_exists('setting_hidden')) {
- /**
- * Class setting_hidden
- */
- class setting_hidden extends setting {
- // Used to explicitly ignore a setting in the configuration manager.
- }
-}
-
-if (!class_exists('setting_fieldset')) {
- /**
- * Class setting_fieldset
- */
- class setting_fieldset extends setting {
- // A do-nothing class used to detect the 'fieldset' type.
- // Used to start a new settings "display-group".
- }
-}
-
-if (!class_exists('setting_undefined')) {
- /**
- * Class setting_undefined
- */
- class setting_undefined extends setting_hidden {
- // A do-nothing class used to detect settings with no metadata entry.
- // Used internaly to hide undefined settings, and generate the undefined settings list.
- }
-}
-
-if (!class_exists('setting_no_class')) {
- /**
- * Class setting_no_class
- */
- class setting_no_class extends setting_undefined {
- // A do-nothing class used to detect settings with a missing setting class.
- // Used internaly to hide undefined settings, and generate the undefined settings list.
- }
-}
-
-if (!class_exists('setting_no_default')) {
- /**
- * Class setting_no_default
- */
- class setting_no_default extends setting_undefined {
- // A do-nothing class used to detect settings with no default value.
- // Used internaly to hide undefined settings, and generate the undefined settings list.
- }
-}
-
-if (!class_exists('setting_multicheckbox')) {
- /**
- * Class setting_multicheckbox
- */
- class setting_multicheckbox extends setting_string {
-
- var $_choices = array();
- var $_combine = array();
- var $_other = 'always';
-
- /**
- * update changed setting with user provided value $input
- * - if changed value fails error check, save it to $this->_input (to allow echoing later)
- * - if changed value passes error check, set $this->_local to the new value
- *
- * @param mixed $input the new value
- * @return boolean true if changed, false otherwise (also on error)
- */
- function update($input) {
- if ($this->is_protected()) return false;
-
- // split any combined values + convert from array to comma separated string
- $input = ($input) ? $input : array();
- $input = $this->_array2str($input);
-
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- if ($value == $input) return false;
-
- if ($this->_pattern && !preg_match($this->_pattern,$input)) {
- $this->_error = true;
- $this->_input = $input;
- return false;
- }
-
- $this->_local = $input;
- return true;
- }
-
- /**
- * Build html for label and input of setting
- *
- * @param admin_plugin_config $plugin object of config plugin
- * @param bool $echo true: show input value, when error occurred, otherwise the stored setting
- * @return string[] with content array(string $label_html, string $input_html)
- */
- function html(admin_plugin_config $plugin, $echo=false) {
-
- $disable = '';
-
- if ($this->is_protected()) {
- $value = $this->_protected;
- $disable = 'disabled="disabled"';
- } else {
- if ($echo && $this->_error) {
- $value = $this->_input;
- } else {
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- }
- }
-
- $key = htmlspecialchars($this->_key);
-
- // convert from comma separated list into array + combine complimentary actions
- $value = $this->_str2array($value);
- $default = $this->_str2array($this->_default);
-
- $input = '';
- foreach ($this->_choices as $choice) {
- $idx = array_search($choice, $value);
- $idx_default = array_search($choice,$default);
-
- $checked = ($idx !== false) ? 'checked="checked"' : '';
-
- // @todo ideally this would be handled using a second class of "default"
- $class = (($idx !== false) == (false !== $idx_default)) ? " selectiondefault" : "";
-
- $prompt = ($plugin->getLang($this->_key.'_'.$choice) ?
- $plugin->getLang($this->_key.'_'.$choice) : htmlspecialchars($choice));
-
- $input .= '<div class="selection'.$class.'">'."\n";
- $input .= '<label for="config___'.$key.'_'.$choice.'">'.$prompt."</label>\n";
- $input .= '<input id="config___'.$key.'_'.$choice.'" name="config['.$key.'][]" type="checkbox" class="checkbox" value="'.$choice.'" '.$disable.' '.$checked."/>\n";
- $input .= "</div>\n";
-
- // remove this action from the disabledactions array
- if ($idx !== false) unset($value[$idx]);
- if ($idx_default !== false) unset($default[$idx_default]);
- }
-
- // handle any remaining values
- if ($this->_other != 'never'){
- $other = join(',',$value);
- // test equivalent to ($this->_other == 'always' || ($other && $this->_other == 'exists')
- // use != 'exists' rather than == 'always' to ensure invalid values default to 'always'
- if ($this->_other != 'exists' || $other) {
-
- $class = ((count($default) == count($value)) && (count($value) == count(array_intersect($value,$default)))) ?
- " selectiondefault" : "";
-
- $input .= '<div class="other'.$class.'">'."\n";
- $input .= '<label for="config___'.$key.'_other">'.$plugin->getLang($key.'_other')."</label>\n";
- $input .= '<input id="config___'.$key.'_other" name="config['.$key.'][other]" type="text" class="edit" value="'.htmlspecialchars($other).'" '.$disable." />\n";
- $input .= "</div>\n";
- }
- }
- $label = '<label>'.$this->prompt($plugin).'</label>';
- return array($label,$input);
- }
-
- /**
- * convert comma separated list to an array and combine any complimentary values
- *
- * @param string $str
- * @return array
- */
- function _str2array($str) {
- $array = explode(',',$str);
-
- if (!empty($this->_combine)) {
- foreach ($this->_combine as $key => $combinators) {
- $idx = array();
- foreach ($combinators as $val) {
- if (($idx[] = array_search($val, $array)) === false) break;
- }
-
- if (count($idx) && $idx[count($idx)-1] !== false) {
- foreach ($idx as $i) unset($array[$i]);
- $array[] = $key;
- }
- }
- }
-
- return $array;
- }
-
- /**
- * convert array of values + other back to a comma separated list, incl. splitting any combined values
- *
- * @param array $input
- * @return string
- */
- function _array2str($input) {
-
- // handle other
- $other = trim($input['other']);
- $other = !empty($other) ? explode(',',str_replace(' ','',$input['other'])) : array();
- unset($input['other']);
-
- $array = array_unique(array_merge($input, $other));
-
- // deconstruct any combinations
- if (!empty($this->_combine)) {
- foreach ($this->_combine as $key => $combinators) {
-
- $idx = array_search($key,$array);
- if ($idx !== false) {
- unset($array[$idx]);
- $array = array_merge($array, $combinators);
- }
- }
- }
-
- return join(',',array_unique($array));
- }
- }
-}
-
-if (!class_exists('setting_regex')){
- /**
- * Class setting_regex
- */
- class setting_regex extends setting_string {
-
- var $_delimiter = '/'; // regex delimiter to be used in testing input
- var $_pregflags = 'ui'; // regex pattern modifiers to be used in testing input
-
- /**
- * update changed setting with user provided value $input
- * - if changed value fails error check, save it to $this->_input (to allow echoing later)
- * - if changed value passes error check, set $this->_local to the new value
- *
- * @param mixed $input the new value
- * @return boolean true if changed, false otherwise (incl. on error)
- */
- function update($input) {
-
- // let parent do basic checks, value, not changed, etc.
- $local = $this->_local;
- if (!parent::update($input)) return false;
- $this->_local = $local;
-
- // see if the regex compiles and runs (we don't check for effectiveness)
- $regex = $this->_delimiter . $input . $this->_delimiter . $this->_pregflags;
- $lastError = error_get_last();
- @preg_match($regex,'testdata');
- if (preg_last_error() != PREG_NO_ERROR || error_get_last() != $lastError) {
- $this->_input = $input;
- $this->_error = true;
- return false;
- }
-
- $this->_local = $input;
- return true;
- }
- }
-}
diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php
index acdf93ba7..6fdd64d6e 100644
--- a/lib/plugins/config/settings/config.metadata.php
+++ b/lib/plugins/config/settings/config.metadata.php
@@ -2,16 +2,15 @@
/**
* Metadata for configuration manager plugin
*
- * Note: This file should be included within a function to ensure it
- * doesn't clash with the settings it is describing.
+ * Note: This file is loaded in Loader::loadMeta().
*
* Format:
* $meta[<setting name>] = array(<handler class id>,<param name> => <param value>);
*
* <handler class id> is the handler class name without the "setting_" prefix
*
- * Defined classes:
- * Generic (source: settings/config.class.php)
+ * Defined classes (see core/Setting/*):
+ * Generic
* -------------------------------------------
* '' - default class ('setting'), textarea, minimal input validation, setting output in quotes
* 'string' - single line text input, minimal input validation, setting output in quotes
@@ -38,7 +37,7 @@
* to see if will compile & run as a regex. in addition to _pattern, also accepts _delimiter
* (default '/') and _pregflags (default 'ui')
*
- * Single Setting (source: settings/extra.class.php)
+ * Single Setting
* -------------------------------------------------
* 'savedir' - as 'setting', input tested against initpath() (inc/init.php)
* 'sepchar' - as multichoice, selection constructed from string of valid values
@@ -76,26 +75,10 @@
* 'never' as it will not discard unknown/other values.
* optional for 'multicheckbox', ignored by others
*
+ * The order of the settings influences the order in which they apppear in the config manager
*
* @author Chris Smith <chris@jalakai.co.uk>
*/
-// ---------------[ settings for settings ]------------------------------
-$config['format'] = 'php'; // format of setting files, supported formats: php
-$config['varname'] = 'conf'; // name of the config variable, sans $
-
-// this string is written at the top of the rewritten settings file,
-// !! do not include any comment indicators !!
-// this value can be overriden when calling save_settings() method
-$config['heading'] = 'Dokuwiki\'s Main Configuration File - Local Settings';
-
-// test value (FIXME, remove before publishing)
-//$meta['test'] = array('multichoice','_choices' => array(''));
-
-// --------------[ setting metadata ]------------------------------------
-// - for description of format and fields see top of file
-// - order the settings in the order you wish them to appear
-// - any settings not mentioned will come after the last setting listed and
-// will use the default class with no parameters
$meta['_basic'] = array('fieldset');
$meta['title'] = array('string');
@@ -122,7 +105,10 @@ $meta['fullpath'] = array('onoff','_caution' => 'security');
$meta['typography'] = array('multichoice','_choices' => array(0,1,2));
$meta['dformat'] = array('string');
$meta['signature'] = array('string');
-$meta['showuseras'] = array('multichoice','_choices' => array('loginname','username','username_link','email','email_link'));
+$meta['showuseras'] = array(
+ 'multichoice',
+ '_choices' => array('loginname', 'username', 'username_link', 'email', 'email_link')
+);
$meta['toptoclevel'] = array('multichoice','_choices' => array(1,2,3,4,5)); // 5 toc levels
$meta['tocminheads'] = array('multichoice','_choices' => array(0,1,2,3,4,5,10,15,20));
$meta['maxtoclevel'] = array('multichoice','_choices' => array(0,1,2,3,4,5));
@@ -139,16 +125,37 @@ $meta['autopasswd'] = array('onoff');
$meta['authtype'] = array('authtype','_caution' => 'danger');
$meta['passcrypt'] = array('multichoice','_choices' => array(
'smd5','md5','apr1','sha1','ssha','lsmd5','crypt','mysql','my411','kmd5','pmd5','hmd5',
- 'mediawiki','bcrypt','djangomd5','djangosha1','djangopbkdf2_sha1','djangopbkdf2_sha256','sha512'
+ 'mediawiki','bcrypt','djangomd5','djangosha1','djangopbkdf2_sha1','djangopbkdf2_sha256',
+ 'sha512','argon2i','argon2id'
));
$meta['defaultgroup']= array('string');
$meta['superuser'] = array('string','_caution' => 'danger');
$meta['manager'] = array('string');
$meta['profileconfirm'] = array('onoff');
$meta['rememberme'] = array('onoff');
-$meta['disableactions'] = array('disableactions',
- '_choices' => array('backlink','index','recent','revisions','search','subscription','register','resendpwd','profile','profile_delete','edit','wikicode','check', 'rss'),
- '_combine' => array('subscription' => array('subscribe','unsubscribe'), 'wikicode' => array('source','export_raw')));
+$meta['disableactions'] = array(
+ 'disableactions',
+ '_choices' => array(
+ 'backlink',
+ 'index',
+ 'recent',
+ 'revisions',
+ 'search',
+ 'subscription',
+ 'register',
+ 'resendpwd',
+ 'profile',
+ 'profile_delete',
+ 'edit',
+ 'wikicode',
+ 'check',
+ 'rss'
+ ),
+ '_combine' => array(
+ 'subscription' => array('subscribe', 'unsubscribe'),
+ 'wikicode' => array('source', 'export_raw')
+ )
+);
$meta['auth_security_timeout'] = array('numeric');
$meta['securecookie'] = array('onoff');
$meta['remote'] = array('onoff','_caution' => 'security');
@@ -201,6 +208,7 @@ $meta['rss_content'] = array('multichoice','_choices' => array('abstract','diff'
$meta['rss_media'] = array('multichoice','_choices' => array('both','pages','media'));
$meta['rss_update'] = array('numeric');
$meta['rss_show_summary'] = array('onoff');
+$meta['rss_show_deleted'] = array('onoff');
$meta['_advanced'] = array('fieldset');
$meta['updatecheck'] = array('onoff');
@@ -221,6 +229,10 @@ $meta['renderer_xhtml'] = array('renderer','_format' => 'xhtml','_choices' => ar
$meta['readdircache'] = array('numeric');
$meta['search_nslimit'] = array('numeric', '_min' => 0);
$meta['search_fragment'] = array('multichoice','_choices' => array('exact', 'starts_with', 'ends_with', 'contains'),);
+$meta['trustedproxy'] = array('regex');
+
+$meta['_feature_flags'] = ['fieldset'];
+$meta['defer_js'] = ['onoff'];
$meta['_network'] = array('fieldset');
$meta['dnslookups'] = array('onoff');
@@ -231,10 +243,3 @@ $meta['proxy____user'] = array('string');
$meta['proxy____pass'] = array('password','_code' => 'base64');
$meta['proxy____ssl'] = array('onoff');
$meta['proxy____except'] = array('string');
-$meta['safemodehack'] = array('onoff');
-$meta['ftp____host'] = array('string','_pattern' => '#^(|[a-z0-9\-\.+]+)$#i');
-$meta['ftp____port'] = array('numericopt');
-$meta['ftp____user'] = array('string');
-$meta['ftp____pass'] = array('password','_code' => 'base64');
-$meta['ftp____root'] = array('string');
-
diff --git a/lib/plugins/config/settings/extra.class.php b/lib/plugins/config/settings/extra.class.php
deleted file mode 100644
index 41af42247..000000000
--- a/lib/plugins/config/settings/extra.class.php
+++ /dev/null
@@ -1,309 +0,0 @@
-<?php
-/**
- * additional setting classes specific to these settings
- *
- * @author Chris Smith <chris@jalakai.co.uk>
- */
-
-if (!class_exists('setting_sepchar')) {
- /**
- * Class setting_sepchar
- */
- class setting_sepchar extends setting_multichoice {
-
- /**
- * @param string $key
- * @param array|null $param array with metadata of setting
- */
- function __construct($key,$param=null) {
- $str = '_-.';
- for ($i=0;$i<strlen($str);$i++) $this->_choices[] = $str{$i};
-
- // call foundation class constructor
- parent::__construct($key,$param);
- }
- }
-}
-
-if (!class_exists('setting_savedir')) {
- /**
- * Class setting_savedir
- */
- class setting_savedir extends setting_string {
-
- /**
- * update changed setting with user provided value $input
- * - if changed value fails error check, save it to $this->_input (to allow echoing later)
- * - if changed value passes error check, set $this->_local to the new value
- *
- * @param mixed $input the new value
- * @return boolean true if changed, false otherwise (also on error)
- */
- function update($input) {
- if ($this->is_protected()) return false;
-
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- if ($value == $input) return false;
-
- if (!init_path($input)) {
- $this->_error = true;
- $this->_input = $input;
- return false;
- }
-
- $this->_local = $input;
- return true;
- }
- }
-}
-
-if (!class_exists('setting_authtype')) {
- /**
- * Class setting_authtype
- */
- class setting_authtype extends setting_multichoice {
-
- /**
- * Receives current values for the setting $key
- *
- * @param mixed $default default setting value
- * @param mixed $local local setting value
- * @param mixed $protected protected setting value
- */
- function initialize($default,$local,$protected) {
- /** @var $plugin_controller Doku_Plugin_Controller */
- global $plugin_controller;
-
- // retrieve auth types provided by plugins
- foreach ($plugin_controller->getList('auth') as $plugin) {
- $this->_choices[] = $plugin;
- }
-
- parent::initialize($default,$local,$protected);
- }
-
- /**
- * update changed setting with user provided value $input
- * - if changed value fails error check, save it to $this->_input (to allow echoing later)
- * - if changed value passes error check, set $this->_local to the new value
- *
- * @param mixed $input the new value
- * @return boolean true if changed, false otherwise (also on error)
- */
- function update($input) {
- /** @var $plugin_controller Doku_Plugin_Controller */
- global $plugin_controller;
-
- // is an update possible/requested?
- $local = $this->_local; // save this, parent::update() may change it
- if (!parent::update($input)) return false; // nothing changed or an error caught by parent
- $this->_local = $local; // restore original, more error checking to come
-
- // attempt to load the plugin
- $auth_plugin = $plugin_controller->load('auth', $input);
-
- // @TODO: throw an error in plugin controller instead of returning null
- if (is_null($auth_plugin)) {
- $this->_error = true;
- msg('Cannot load Auth Plugin "' . $input . '"', -1);
- return false;
- }
-
- // verify proper instantiation (is this really a plugin?) @TODO use instanceof? implement interface?
- if (is_object($auth_plugin) && !method_exists($auth_plugin, 'getPluginName')) {
- $this->_error = true;
- msg('Cannot create Auth Plugin "' . $input . '"', -1);
- return false;
- }
-
- // did we change the auth type? logout
- global $conf;
- if($conf['authtype'] != $input) {
- msg('Authentication system changed. Please re-login.');
- auth_logoff();
- }
-
- $this->_local = $input;
- return true;
- }
- }
-}
-
-if (!class_exists('setting_im_convert')) {
- /**
- * Class setting_im_convert
- */
- class setting_im_convert extends setting_string {
-
- /**
- * update changed setting with user provided value $input
- * - if changed value fails error check, save it to $this->_input (to allow echoing later)
- * - if changed value passes error check, set $this->_local to the new value
- *
- * @param mixed $input the new value
- * @return boolean true if changed, false otherwise (also on error)
- */
- function update($input) {
- if ($this->is_protected()) return false;
-
- $input = trim($input);
-
- $value = is_null($this->_local) ? $this->_default : $this->_local;
- if ($value == $input) return false;
-
- if ($input && !file_exists($input)) {
- $this->_error = true;
- $this->_input = $input;
- return false;
- }
-
- $this->_local = $input;
- return true;
- }
- }
-}
-
-if (!class_exists('setting_disableactions')) {
- /**
- * Class setting_disableactions
- */
- class setting_disableactions extends setting_multicheckbox {
-
- /**
- * Build html for label and input of setting
- *
- * @param admin_plugin_config $plugin object of config plugin
- * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting
- * @return array with content array(string $label_html, string $input_html)
- */
- function html(admin_plugin_config $plugin, $echo=false) {
- global $lang;
-
- // make some language adjustments (there must be a better way)
- // transfer some DokuWiki language strings to the plugin
- $plugin->addLang($this->_key.'_revisions', $lang['btn_revs']);
- foreach ($this->_choices as $choice) {
- if (isset($lang['btn_'.$choice])) $plugin->addLang($this->_key.'_'.$choice, $lang['btn_'.$choice]);
- }
-
- return parent::html($plugin, $echo);
- }
- }
-}
-
-if (!class_exists('setting_compression')) {
- /**
- * Class setting_compression
- */
- class setting_compression extends setting_multichoice {
-
- var $_choices = array('0'); // 0 = no compression, always supported
-
- /**
- * Receives current values for the setting $key
- *
- * @param mixed $default default setting value
- * @param mixed $local local setting value
- * @param mixed $protected protected setting value
- */
- function initialize($default,$local,$protected) {
-
- // populate _choices with the compression methods supported by this php installation
- if (function_exists('gzopen')) $this->_choices[] = 'gz';
- if (function_exists('bzopen')) $this->_choices[] = 'bz2';
-
- parent::initialize($default,$local,$protected);
- }
- }
-}
-
-if (!class_exists('setting_license')) {
- /**
- * Class setting_license
- */
- class setting_license extends setting_multichoice {
-
- var $_choices = array(''); // none choosen
-
- /**
- * Receives current values for the setting $key
- *
- * @param mixed $default default setting value
- * @param mixed $local local setting value
- * @param mixed $protected protected setting value
- */
- function initialize($default,$local,$protected) {
- global $license;
-
- foreach($license as $key => $data){
- $this->_choices[] = $key;
- $this->lang[$this->_key.'_o_'.$key] = $data['name']; // stored in setting
- }
-
- parent::initialize($default,$local,$protected);
- }
- }
-}
-
-
-if (!class_exists('setting_renderer')) {
- /**
- * Class setting_renderer
- */
- class setting_renderer extends setting_multichoice {
- var $_prompts = array();
- var $_format = null;
-
- /**
- * Receives current values for the setting $key
- *
- * @param mixed $default default setting value
- * @param mixed $local local setting value
- * @param mixed $protected protected setting value
- */
- function initialize($default,$local,$protected) {
- $format = $this->_format;
-
- foreach (plugin_list('renderer') as $plugin) {
- $renderer = plugin_load('renderer',$plugin);
- if (method_exists($renderer,'canRender') && $renderer->canRender($format)) {
- $this->_choices[] = $plugin;
-
- $info = $renderer->getInfo();
- $this->_prompts[$plugin] = $info['name'];
- }
- }
-
- parent::initialize($default,$local,$protected);
- }
-
- /**
- * Build html for label and input of setting
- *
- * @param admin_plugin_config $plugin object of config plugin
- * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting
- * @return array with content array(string $label_html, string $input_html)
- */
- function html(admin_plugin_config $plugin, $echo=false) {
-
- // make some language adjustments (there must be a better way)
- // transfer some plugin names to the config plugin
- foreach($this->_choices as $choice) {
- if(!$plugin->getLang($this->_key . '_o_' . $choice)) {
- if(!isset($this->_prompts[$choice])) {
- $plugin->addLang(
- $this->_key . '_o_' . $choice,
- sprintf($plugin->getLang('renderer__core'), $choice)
- );
- } else {
- $plugin->addLang(
- $this->_key . '_o_' . $choice,
- sprintf($plugin->getLang('renderer__plugin'), $this->_prompts[$choice])
- );
- }
- }
- }
- return parent::html($plugin, $echo);
- }
- }
-}
diff --git a/lib/plugins/extension/_test/extension.test.php b/lib/plugins/extension/_test/extension.test.php
index d4f13201d..1f8e2fca7 100644
--- a/lib/plugins/extension/_test/extension.test.php
+++ b/lib/plugins/extension/_test/extension.test.php
@@ -6,8 +6,8 @@
* makes protected methods accessible
*/
class mock_helper_plugin_extension_extension extends helper_plugin_extension_extension {
- public function find_folders(&$result, $base, $default_type = 'plugin', $dir = '') {
- return parent::find_folders($result, $base, $default_type, $dir);
+ public function findFolders(&$result, $base, $default_type = 'plugin', $dir = '') {
+ return parent::findFolders($result, $base, $default_type, $dir);
}
}
@@ -78,7 +78,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$tdir = dirname(__FILE__).'/testdata';
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/plugin1", 'plugin');
+ $ok = $extension->findFolders($result, "$tdir/plugin1", 'plugin');
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -86,7 +86,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('plugin1', $this->extdir($result['old'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/plugin2", 'plugin');
+ $ok = $extension->findFolders($result, "$tdir/plugin2", 'plugin');
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('plugin', $result['new'][0]['type']);
@@ -94,7 +94,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('plugin2', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/plgsub3", 'plugin');
+ $ok = $extension->findFolders($result, "$tdir/plgsub3", 'plugin');
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -102,7 +102,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('plgsub3/plugin3', $this->extdir($result['old'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/plgsub4", 'plugin');
+ $ok = $extension->findFolders($result, "$tdir/plgsub4", 'plugin');
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('plugin', $result['new'][0]['type']);
@@ -110,7 +110,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('plgsub4/plugin4', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/plgfoo5", 'plugin');
+ $ok = $extension->findFolders($result, "$tdir/plgfoo5", 'plugin');
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('plugin', $result['new'][0]['type']);
@@ -118,7 +118,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('plgfoo5', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/plgsub6/plgfoo6", 'plugin');
+ $ok = $extension->findFolders($result, "$tdir/plgsub6/plgfoo6", 'plugin');
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('plugin', $result['new'][0]['type']);
@@ -126,7 +126,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('plgsub6/plgfoo6', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/either1", 'plugin');
+ $ok = $extension->findFolders($result, "$tdir/either1", 'plugin');
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -134,7 +134,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('either1', $this->extdir($result['old'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/eithersub2/either2", 'plugin');
+ $ok = $extension->findFolders($result, "$tdir/eithersub2/either2", 'plugin');
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -147,7 +147,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$tdir = dirname(__FILE__).'/testdata';
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/template1", 'template');
+ $ok = $extension->findFolders($result, "$tdir/template1", 'template');
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -155,7 +155,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('template1', $this->extdir($result['old'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/template2", 'template');
+ $ok = $extension->findFolders($result, "$tdir/template2", 'template');
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('template', $result['new'][0]['type']);
@@ -163,7 +163,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('template2', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/tplsub3", 'template');
+ $ok = $extension->findFolders($result, "$tdir/tplsub3", 'template');
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -171,7 +171,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('tplsub3/template3', $this->extdir($result['old'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/tplsub4", 'template');
+ $ok = $extension->findFolders($result, "$tdir/tplsub4", 'template');
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('template', $result['new'][0]['type']);
@@ -179,7 +179,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('tplsub4/template4', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/tplfoo5", 'template');
+ $ok = $extension->findFolders($result, "$tdir/tplfoo5", 'template');
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('template', $result['new'][0]['type']);
@@ -187,7 +187,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('tplfoo5', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/tplsub6/tplfoo6", 'template');
+ $ok = $extension->findFolders($result, "$tdir/tplsub6/tplfoo6", 'template');
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('template', $result['new'][0]['type']);
@@ -195,7 +195,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('tplsub6/tplfoo6', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/either1", 'template');
+ $ok = $extension->findFolders($result, "$tdir/either1", 'template');
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -203,7 +203,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('either1', $this->extdir($result['old'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/eithersub2/either2", 'template');
+ $ok = $extension->findFolders($result, "$tdir/eithersub2/either2", 'template');
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -216,7 +216,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$tdir = dirname(__FILE__).'/testdata';
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/template1");
+ $ok = $extension->findFolders($result, "$tdir/template1");
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -224,7 +224,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('template1', $this->extdir($result['old'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/template2");
+ $ok = $extension->findFolders($result, "$tdir/template2");
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('template', $result['new'][0]['type']);
@@ -232,7 +232,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('template2', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/tplsub3");
+ $ok = $extension->findFolders($result, "$tdir/tplsub3");
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -240,7 +240,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('tplsub3/template3', $this->extdir($result['old'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/tplsub4");
+ $ok = $extension->findFolders($result, "$tdir/tplsub4");
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('template', $result['new'][0]['type']);
@@ -248,7 +248,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('tplsub4/template4', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/tplfoo5");
+ $ok = $extension->findFolders($result, "$tdir/tplfoo5");
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('template', $result['new'][0]['type']);
@@ -256,7 +256,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('tplfoo5', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/tplsub6/tplfoo6");
+ $ok = $extension->findFolders($result, "$tdir/tplsub6/tplfoo6");
$this->assertTrue($ok);
$this->assertEquals(1, count($result['new']));
$this->assertEquals('template', $result['new'][0]['type']);
@@ -264,7 +264,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('tplsub6/tplfoo6', $this->extdir($result['new'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/either1");
+ $ok = $extension->findFolders($result, "$tdir/either1");
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -272,7 +272,7 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$this->assertEquals('either1', $this->extdir($result['old'][0]['tmp']));
$result = array('old' => array(), 'new' => array());
- $ok = $extension->find_folders($result, "$tdir/eithersub2/either2");
+ $ok = $extension->findFolders($result, "$tdir/eithersub2/either2");
$this->assertTrue($ok);
$this->assertEquals(0, count($result['new']));
$this->assertEquals(1, count($result['old']));
@@ -292,4 +292,4 @@ class helper_plugin_extension_extension_test extends DokuWikiTest {
$dir = trim(substr($dir, $len), '/');
return $dir;
}
-} \ No newline at end of file
+}
diff --git a/lib/plugins/extension/action.php b/lib/plugins/extension/action.php
index 9e48f134b..3bb044825 100644
--- a/lib/plugins/extension/action.php
+++ b/lib/plugins/extension/action.php
@@ -5,10 +5,8 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-class action_plugin_extension extends DokuWiki_Action_Plugin {
+class action_plugin_extension extends DokuWiki_Action_Plugin
+{
/**
* Registers a callback function for a given event
@@ -16,10 +14,9 @@ class action_plugin_extension extends DokuWiki_Action_Plugin {
* @param Doku_Event_Handler $controller DokuWiki's event controller object
* @return void
*/
- public function register(Doku_Event_Handler $controller) {
-
+ public function register(Doku_Event_Handler $controller)
+ {
$controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'info');
-
}
/**
@@ -28,22 +25,25 @@ class action_plugin_extension extends DokuWiki_Action_Plugin {
* @param Doku_Event $event
* @param $param
*/
- public function info(Doku_Event &$event, $param) {
+ public function info(Doku_Event $event, $param)
+ {
global $USERINFO;
global $INPUT;
- if($event->data != 'plugin_extension') return;
+ if ($event->data != 'plugin_extension') return;
$event->preventDefault();
$event->stopPropagation();
- if(empty($_SERVER['REMOTE_USER']) || !auth_isadmin($_SERVER['REMOTE_USER'], $USERINFO['grps'])) {
+ /** @var admin_plugin_extension $admin */
+ $admin = plugin_load('admin', 'extension');
+ if (!$admin->isAccessibleByCurrentUser()) {
http_status(403);
echo 'Forbidden';
exit;
}
$ext = $INPUT->str('ext');
- if(!$ext) {
+ if (!$ext) {
http_status(400);
echo 'no extension given';
return;
@@ -54,10 +54,9 @@ class action_plugin_extension extends DokuWiki_Action_Plugin {
$extension->setExtension($ext);
$act = $INPUT->str('act');
- switch($act) {
+ switch ($act) {
case 'enable':
case 'disable':
- $json = new JSON();
$extension->$act(); //enables/disables
$reverse = ($act == 'disable') ? 'enable' : 'disable';
@@ -69,7 +68,7 @@ class action_plugin_extension extends DokuWiki_Action_Plugin {
);
header('Content-Type: application/json');
- echo $json->encode($return);
+ echo json_encode($return);
break;
case 'info':
@@ -77,9 +76,7 @@ class action_plugin_extension extends DokuWiki_Action_Plugin {
/** @var helper_plugin_extension_list $list */
$list = plugin_load('helper', 'extension_list');
header('Content-Type: text/html; charset=utf-8');
- echo $list->make_info($extension);
+ echo $list->makeInfo($extension);
}
}
-
}
-
diff --git a/lib/plugins/extension/admin.php b/lib/plugins/extension/admin.php
index 71257cf43..7e7eb60d4 100644
--- a/lib/plugins/extension/admin.php
+++ b/lib/plugins/extension/admin.php
@@ -6,13 +6,11 @@
* @author Michael Hamann <michael@content-space.de>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
/**
* Admin part of the extension manager
*/
-class admin_plugin_extension extends DokuWiki_Admin_Plugin {
+class admin_plugin_extension extends DokuWiki_Admin_Plugin
+{
protected $infoFor = null;
/** @var helper_plugin_extension_gui */
protected $gui;
@@ -22,39 +20,45 @@ class admin_plugin_extension extends DokuWiki_Admin_Plugin {
*
* loads additional helpers
*/
- public function __construct() {
+ public function __construct()
+ {
$this->gui = plugin_load('helper', 'extension_gui');
}
/**
* @return int sort number in admin menu
*/
- public function getMenuSort() {
+ public function getMenuSort()
+ {
return 0;
}
/**
* @return bool true if only access for superuser, false is for superusers and moderators
*/
- public function forAdminOnly() {
+ public function forAdminOnly()
+ {
return true;
}
/**
* Execute the requested action(s) and initialize the plugin repository
*/
- public function handle() {
+ public function handle()
+ {
global $INPUT;
// initialize the remote repository
/* @var helper_plugin_extension_repository $repository */
$repository = $this->loadHelper('extension_repository');
- if(!$repository->hasAccess()) {
- $url = $this->gui->tabURL('', array('purge' => 1));
- msg($this->getLang('repo_error').' [<a href="'.$url.'">'.$this->getLang('repo_retry').'</a>]', -1);
+ if (!$repository->hasAccess(!$INPUT->bool('purge'))) {
+ $url = $this->gui->tabURL('', ['purge' => 1], '&');
+ msg($this->getLang('repo_error').
+ ' [<a href="'.$url.'">'.$this->getLang('repo_retry').'</a>]', -1
+ );
}
- if(!in_array('ssl', stream_get_transports())) {
+ if (!in_array('ssl', stream_get_transports())) {
msg($this->getLang('nossl'), -1);
}
@@ -62,82 +66,104 @@ class admin_plugin_extension extends DokuWiki_Admin_Plugin {
$extension = $this->loadHelper('extension_extension');
try {
- if($INPUT->post->has('fn') && checkSecurityToken()) {
+ if ($INPUT->post->has('fn') && checkSecurityToken()) {
$actions = $INPUT->post->arr('fn');
- foreach($actions as $action => $extensions) {
- foreach($extensions as $extname => $label) {
- switch($action) {
+ foreach ($actions as $action => $extensions) {
+ foreach ($extensions as $extname => $label) {
+ switch ($action) {
case 'install':
case 'reinstall':
case 'update':
$extension->setExtension($extname);
$installed = $extension->installOrUpdate();
- foreach($installed as $ext => $info) {
- msg(sprintf($this->getLang('msg_'.$info['type'].'_'.$info['action'].'_success'), $info['base']), 1);
+ foreach ($installed as $ext => $info) {
+ msg(sprintf(
+ $this->getLang('msg_'.$info['type'].'_'.$info['action'].'_success'),
+ $info['base']), 1
+ );
}
break;
case 'uninstall':
$extension->setExtension($extname);
$status = $extension->uninstall();
- if($status) {
- msg(sprintf($this->getLang('msg_delete_success'), hsc($extension->getDisplayName())), 1);
+ if ($status) {
+ msg(sprintf(
+ $this->getLang('msg_delete_success'),
+ hsc($extension->getDisplayName())), 1
+ );
} else {
- msg(sprintf($this->getLang('msg_delete_failed'), hsc($extension->getDisplayName())), -1);
+ msg(sprintf(
+ $this->getLang('msg_delete_failed'),
+ hsc($extension->getDisplayName())), -1
+ );
}
break;
- case 'enable';
+ case 'enable':
$extension->setExtension($extname);
$status = $extension->enable();
- if($status !== true) {
+ if ($status !== true) {
msg($status, -1);
} else {
- msg(sprintf($this->getLang('msg_enabled'), hsc($extension->getDisplayName())), 1);
+ msg(sprintf(
+ $this->getLang('msg_enabled'),
+ hsc($extension->getDisplayName())), 1
+ );
}
break;
- case 'disable';
+ case 'disable':
$extension->setExtension($extname);
$status = $extension->disable();
- if($status !== true) {
+ if ($status !== true) {
msg($status, -1);
} else {
- msg(sprintf($this->getLang('msg_disabled'), hsc($extension->getDisplayName())), 1);
+ msg(sprintf(
+ $this->getLang('msg_disabled'),
+ hsc($extension->getDisplayName())), 1
+ );
}
break;
}
}
}
- send_redirect($this->gui->tabURL('', array(), '&', true));
- } elseif($INPUT->post->str('installurl') && checkSecurityToken()) {
- $installed = $extension->installFromURL($INPUT->post->str('installurl'));
- foreach($installed as $ext => $info) {
- msg(sprintf($this->getLang('msg_'.$info['type'].'_'.$info['action'].'_success'), $info['base']), 1);
+ send_redirect($this->gui->tabURL('', [], '&', true));
+ } elseif ($INPUT->post->str('installurl') && checkSecurityToken()) {
+ $installed = $extension->installFromURL(
+ $INPUT->post->str('installurl'),
+ $INPUT->post->bool('overwrite'));
+ foreach ($installed as $ext => $info) {
+ msg(sprintf(
+ $this->getLang('msg_'.$info['type'].'_'.$info['action'].'_success'),
+ $info['base']), 1
+ );
}
- send_redirect($this->gui->tabURL('', array(), '&', true));
- } elseif(isset($_FILES['installfile']) && checkSecurityToken()) {
- $installed = $extension->installFromUpload('installfile');
- foreach($installed as $ext => $info) {
- msg(sprintf($this->getLang('msg_'.$info['type'].'_'.$info['action'].'_success'), $info['base']), 1);
+ send_redirect($this->gui->tabURL('', [], '&', true));
+ } elseif (isset($_FILES['installfile']) && checkSecurityToken()) {
+ $installed = $extension->installFromUpload('installfile', $INPUT->post->bool('overwrite'));
+ foreach ($installed as $ext => $info) {
+ msg(sprintf(
+ $this->getLang('msg_'.$info['type'].'_'.$info['action'].'_success'),
+ $info['base']), 1
+ );
}
- send_redirect($this->gui->tabURL('', array(), '&', true));
+ send_redirect($this->gui->tabURL('', [], '&', true));
}
-
- } catch(Exception $e) {
+ } catch (Exception $e) {
msg($e->getMessage(), -1);
- send_redirect($this->gui->tabURL('', array(), '&', true));
+ send_redirect($this->gui->tabURL('', [], '&', true));
}
-
}
/**
* Render HTML output
*/
- public function html() {
- ptln('<h1>'.$this->getLang('menu').'</h1>');
- ptln('<div id="extension__manager">');
+ public function html()
+ {
+ echo '<h1>'.$this->getLang('menu').'</h1>'.DOKU_LF;
+ echo '<div id="extension__manager">'.DOKU_LF;
$this->gui->tabNavigation();
- switch($this->gui->currentTab()) {
+ switch ($this->gui->currentTab()) {
case 'search':
$this->gui->tabSearch();
break;
@@ -152,8 +178,8 @@ class admin_plugin_extension extends DokuWiki_Admin_Plugin {
$this->gui->tabPlugins();
}
- ptln('</div>');
+ echo '</div>'.DOKU_LF;
}
}
-// vim:ts=4:sw=4:et: \ No newline at end of file
+// vim:ts=4:sw=4:et:
diff --git a/lib/plugins/extension/cli.php b/lib/plugins/extension/cli.php
new file mode 100644
index 000000000..a293f8728
--- /dev/null
+++ b/lib/plugins/extension/cli.php
@@ -0,0 +1,372 @@
+<?php
+
+use splitbrain\phpcli\Colors;
+
+/**
+ * Class cli_plugin_extension
+ *
+ * Command Line component for the extension manager
+ *
+ * @license GPL2
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class cli_plugin_extension extends DokuWiki_CLI_Plugin
+{
+ /** @inheritdoc */
+ protected function setup(\splitbrain\phpcli\Options $options)
+ {
+ // general setup
+ $options->setHelp(
+ "Manage plugins and templates for this DokuWiki instance\n\n" .
+ "Status codes:\n" .
+ " i - installed\n" .
+ " b - bundled with DokuWiki\n" .
+ " g - installed via git\n" .
+ " d - disabled\n" .
+ " u - update available\n"
+ );
+
+ // search
+ $options->registerCommand('search', 'Search for an extension');
+ $options->registerOption('max', 'Maximum number of results (default 10)', 'm', 'number', 'search');
+ $options->registerOption('verbose', 'Show detailed extension information', 'v', false, 'search');
+ $options->registerArgument('query', 'The keyword(s) to search for', true, 'search');
+
+ // list
+ $options->registerCommand('list', 'List installed extensions');
+ $options->registerOption('verbose', 'Show detailed extension information', 'v', false, 'list');
+ $options->registerOption('filter', 'Filter by this status', 'f', 'status', 'list');
+
+ // upgrade
+ $options->registerCommand('upgrade', 'Update all installed extensions to their latest versions');
+
+ // install
+ $options->registerCommand('install', 'Install or upgrade extensions');
+ $options->registerArgument('extensions...', 'One or more extensions to install', true, 'install');
+
+ // uninstall
+ $options->registerCommand('uninstall', 'Uninstall a new extension');
+ $options->registerArgument('extensions...', 'One or more extensions to install', true, 'uninstall');
+
+ // enable
+ $options->registerCommand('enable', 'Enable installed extensions');
+ $options->registerArgument('extensions...', 'One or more extensions to enable', true, 'enable');
+
+ // disable
+ $options->registerCommand('disable', 'Disable installed extensions');
+ $options->registerArgument('extensions...', 'One or more extensions to disable', true, 'disable');
+
+
+ }
+
+ /** @inheritdoc */
+ protected function main(\splitbrain\phpcli\Options $options)
+ {
+ /** @var helper_plugin_extension_repository $repo */
+ $repo = plugin_load('helper', 'extension_repository');
+ if (!$repo->hasAccess(false)) {
+ $this->warning('Extension Repository API is not accessible, no remote info available!');
+ }
+
+ switch ($options->getCmd()) {
+ case 'list':
+ $ret = $this->cmdList($options->getOpt('verbose'), $options->getOpt('filter', ''));
+ break;
+ case 'search':
+ $ret = $this->cmdSearch(
+ implode(' ', $options->getArgs()),
+ $options->getOpt('verbose'),
+ (int)$options->getOpt('max', 10)
+ );
+ break;
+ case 'install':
+ $ret = $this->cmdInstall($options->getArgs());
+ break;
+ case 'uninstall':
+ $ret = $this->cmdUnInstall($options->getArgs());
+ break;
+ case 'enable':
+ $ret = $this->cmdEnable(true, $options->getArgs());
+ break;
+ case 'disable':
+ $ret = $this->cmdEnable(false, $options->getArgs());
+ break;
+ case 'upgrade':
+ $ret = $this->cmdUpgrade();
+ break;
+ default:
+ echo $options->help();
+ $ret = 0;
+ }
+
+ exit($ret);
+ }
+
+ /**
+ * Upgrade all extensions
+ *
+ * @return int
+ */
+ protected function cmdUpgrade()
+ {
+ /* @var helper_plugin_extension_extension $ext */
+ $ext = $this->loadHelper('extension_extension');
+ $list = $this->getInstalledExtensions();
+
+ $ok = 0;
+ foreach ($list as $extname) {
+ $ext->setExtension($extname);
+ $date = $ext->getInstalledVersion();
+ $avail = $ext->getLastUpdate();
+ if ($avail && $avail > $date) {
+ $ok += $this->cmdInstall([$extname]);
+ }
+ }
+
+ return $ok;
+ }
+
+ /**
+ * Enable or disable one or more extensions
+ *
+ * @param bool $set
+ * @param string[] $extensions
+ * @return int
+ */
+ protected function cmdEnable($set, $extensions)
+ {
+ /* @var helper_plugin_extension_extension $ext */
+ $ext = $this->loadHelper('extension_extension');
+
+ $ok = 0;
+ foreach ($extensions as $extname) {
+ $ext->setExtension($extname);
+ if (!$ext->isInstalled()) {
+ $this->error(sprintf('Extension %s is not installed', $ext->getID()));
+ $ok += 1;
+ continue;
+ }
+
+ if ($set) {
+ $status = $ext->enable();
+ $msg = 'msg_enabled';
+ } else {
+ $status = $ext->disable();
+ $msg = 'msg_disabled';
+ }
+
+ if ($status !== true) {
+ $this->error($status);
+ $ok += 1;
+ continue;
+ } else {
+ $this->success(sprintf($this->getLang($msg), $ext->getID()));
+ }
+ }
+
+ return $ok;
+ }
+
+ /**
+ * Uninstall one or more extensions
+ *
+ * @param string[] $extensions
+ * @return int
+ */
+ protected function cmdUnInstall($extensions)
+ {
+ /* @var helper_plugin_extension_extension $ext */
+ $ext = $this->loadHelper('extension_extension');
+
+ $ok = 0;
+ foreach ($extensions as $extname) {
+ $ext->setExtension($extname);
+ if (!$ext->isInstalled()) {
+ $this->error(sprintf('Extension %s is not installed', $ext->getID()));
+ $ok += 1;
+ continue;
+ }
+
+ $status = $ext->uninstall();
+ if ($status) {
+ $this->success(sprintf($this->getLang('msg_delete_success'), $ext->getID()));
+ } else {
+ $this->error(sprintf($this->getLang('msg_delete_failed'), hsc($ext->getID())));
+ $ok = 1;
+ }
+ }
+
+ return $ok;
+ }
+
+ /**
+ * Install one or more extensions
+ *
+ * @param string[] $extensions
+ * @return int
+ */
+ protected function cmdInstall($extensions)
+ {
+ /* @var helper_plugin_extension_extension $ext */
+ $ext = $this->loadHelper('extension_extension');
+
+ $ok = 0;
+ foreach ($extensions as $extname) {
+ $ext->setExtension($extname);
+
+ if (!$ext->getDownloadURL()) {
+ $ok += 1;
+ $this->error(
+ sprintf('Could not find download for %s', $ext->getID())
+ );
+ continue;
+ }
+
+ try {
+ $installed = $ext->installOrUpdate();
+ foreach ($installed as $name => $info) {
+ $this->success(sprintf(
+ $this->getLang('msg_' . $info['type'] . '_' . $info['action'] . '_success'),
+ $info['base'])
+ );
+ }
+ } catch (Exception $e) {
+ $this->error($e->getMessage());
+ $ok += 1;
+ }
+ }
+ return $ok;
+ }
+
+ /**
+ * Search for an extension
+ *
+ * @param string $query
+ * @param bool $showdetails
+ * @param int $max
+ * @return int
+ * @throws \splitbrain\phpcli\Exception
+ */
+ protected function cmdSearch($query, $showdetails, $max)
+ {
+ /** @var helper_plugin_extension_repository $repository */
+ $repository = $this->loadHelper('extension_repository');
+ $result = $repository->search($query);
+ if ($max) {
+ $result = array_slice($result, 0, $max);
+ }
+
+ $this->listExtensions($result, $showdetails);
+ return 0;
+ }
+
+ /**
+ * @param bool $showdetails
+ * @param string $filter
+ * @return int
+ * @throws \splitbrain\phpcli\Exception
+ */
+ protected function cmdList($showdetails, $filter)
+ {
+ $list = $this->getInstalledExtensions();
+ $this->listExtensions($list, $showdetails, $filter);
+
+ return 0;
+ }
+
+ /**
+ * Get all installed extensions
+ *
+ * @return array
+ */
+ protected function getInstalledExtensions()
+ {
+ /** @var Doku_Plugin_Controller $plugin_controller */
+ global $plugin_controller;
+ $pluginlist = $plugin_controller->getList('', true);
+ $tpllist = glob(DOKU_INC . 'lib/tpl/*', GLOB_ONLYDIR);
+ $tpllist = array_map(function ($path) {
+ return 'template:' . basename($path);
+ }, $tpllist);
+ $list = array_merge($pluginlist, $tpllist);
+ sort($list);
+ return $list;
+ }
+
+ /**
+ * List the given extensions
+ *
+ * @param string[] $list
+ * @param bool $details display details
+ * @param string $filter filter for this status
+ * @throws \splitbrain\phpcli\Exception
+ */
+ protected function listExtensions($list, $details, $filter = '')
+ {
+ /** @var helper_plugin_extension_extension $ext */
+ $ext = $this->loadHelper('extension_extension');
+ $tr = new \splitbrain\phpcli\TableFormatter($this->colors);
+
+
+ foreach ($list as $name) {
+ $ext->setExtension($name);
+
+ $status = '';
+ if ($ext->isInstalled()) {
+ $date = $ext->getInstalledVersion();
+ $avail = $ext->getLastUpdate();
+ $status = 'i';
+ if ($avail && $avail > $date) {
+ $vcolor = Colors::C_RED;
+ $status .= 'u';
+ } else {
+ $vcolor = Colors::C_GREEN;
+ }
+ if ($ext->isGitControlled()) $status = 'g';
+ if ($ext->isBundled()) $status = 'b';
+ if ($ext->isEnabled()) {
+ $ecolor = Colors::C_BROWN;
+ } else {
+ $ecolor = Colors::C_DARKGRAY;
+ $status .= 'd';
+ }
+ } else {
+ $ecolor = null;
+ $date = $ext->getLastUpdate();
+ $vcolor = null;
+ }
+
+ if ($filter && strpos($status, $filter) === false) {
+ continue;
+ }
+
+ echo $tr->format(
+ [20, 3, 12, '*'],
+ [
+ $ext->getID(),
+ $status,
+ $date,
+ strip_tags(sprintf(
+ $this->getLang('extensionby'),
+ $ext->getDisplayName(),
+ $this->colors->wrap($ext->getAuthor(), Colors::C_PURPLE))
+ )
+ ],
+ [
+ $ecolor,
+ Colors::C_YELLOW,
+ $vcolor,
+ null,
+ ]
+ );
+
+ if (!$details) continue;
+
+ echo $tr->format(
+ [5, '*'],
+ ['', $ext->getDescription()],
+ [null, Colors::C_CYAN]
+ );
+ }
+ }
+}
diff --git a/lib/plugins/extension/helper/extension.php b/lib/plugins/extension/helper/extension.php
index e77528b97..5ddf3323e 100644
--- a/lib/plugins/extension/helper/extension.php
+++ b/lib/plugins/extension/helper/extension.php
@@ -6,14 +6,14 @@
* @author Michael Hamann <michael@content-space.de>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-if(!defined('DOKU_TPLLIB')) define('DOKU_TPLLIB', DOKU_INC.'lib/tpl/');
+use dokuwiki\HTTP\DokuHTTPClient;
+use dokuwiki\Extension\PluginController;
/**
* Class helper_plugin_extension_extension represents a single extension (plugin or template)
*/
-class helper_plugin_extension_extension extends DokuWiki_Plugin {
+class helper_plugin_extension_extension extends DokuWiki_Plugin
+{
private $id;
private $base;
private $is_template = false;
@@ -26,13 +26,25 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
/** @var array list of temporary directories */
private $temporary = array();
+ /** @var string where templates are installed to */
+ private $tpllib = '';
+
+ /**
+ * helper_plugin_extension_extension constructor.
+ */
+ public function __construct()
+ {
+ $this->tpllib = dirname(tpl_incdir()).'/';
+ }
+
/**
* Destructor
*
* deletes any dangling temporary directories
*/
- public function __destruct() {
- foreach($this->temporary as $dir){
+ public function __destruct()
+ {
+ foreach ($this->temporary as $dir) {
io_rmdir($dir, true);
}
}
@@ -40,7 +52,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
/**
* @return bool false, this component is not a singleton
*/
- public function isSingleton() {
+ public function isSingleton()
+ {
return false;
}
@@ -50,12 +63,13 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
* @param string $id The id of the extension (prefixed with template: for templates)
* @return bool If some (local or remote) data was found
*/
- public function setExtension($id) {
+ public function setExtension($id)
+ {
$id = cleanID($id);
$this->id = $id;
$this->base = $id;
- if(substr($id, 0 , 9) == 'template:'){
+ if (substr($id, 0, 9) == 'template:') {
$this->base = substr($id, 9);
$this->is_template = true;
} else {
@@ -85,7 +99,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool If the extension is installed locally
*/
- public function isInstalled() {
+ public function isInstalled()
+ {
return is_dir($this->getInstallDir());
}
@@ -94,8 +109,9 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool
*/
- public function isGitControlled() {
- if(!$this->isInstalled()) return false;
+ public function isGitControlled()
+ {
+ if (!$this->isInstalled()) return false;
return is_dir($this->getInstallDir().'/.git');
}
@@ -104,13 +120,17 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool If the extension is bundled
*/
- public function isBundled() {
+ public function isBundled()
+ {
if (!empty($this->remoteInfo['bundled'])) return $this->remoteInfo['bundled'];
- return in_array($this->id,
- array(
- 'authad', 'authldap', 'authmysql', 'authpdo', 'authpgsql', 'authplain', 'acl', 'info', 'extension',
- 'revert', 'popularity', 'config', 'safefnrecode', 'styling', 'testing', 'template:dokuwiki'
- )
+ return in_array(
+ $this->id,
+ array(
+ 'authad', 'authldap', 'authpdo', 'authplain',
+ 'acl', 'config', 'extension', 'info', 'popularity', 'revert',
+ 'safefnrecode', 'styling', 'testing', 'usermanager',
+ 'template:dokuwiki',
+ )
);
}
@@ -119,12 +139,13 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool if the extension is protected
*/
- public function isProtected() {
+ public function isProtected()
+ {
// never allow deinstalling the current auth plugin:
global $conf;
if ($this->id == $conf['authtype']) return true;
- /** @var Doku_Plugin_Controller $plugin_controller */
+ /** @var PluginController $plugin_controller */
global $plugin_controller;
$cascade = $plugin_controller->getCascade();
return (isset($cascade['protected'][$this->id]) && $cascade['protected'][$this->id]);
@@ -135,7 +156,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool If the extension is installed in the correct directory
*/
- public function isInWrongFolder() {
+ public function isInWrongFolder()
+ {
return $this->base != $this->getBase();
}
@@ -144,15 +166,16 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool If the extension is enabled
*/
- public function isEnabled() {
+ public function isEnabled()
+ {
global $conf;
- if($this->isTemplate()){
+ if ($this->isTemplate()) {
return ($conf['template'] == $this->getBase());
}
- /* @var Doku_Plugin_Controller $plugin_controller */
+ /* @var PluginController $plugin_controller */
global $plugin_controller;
- return !$plugin_controller->isdisabled($this->base);
+ return $plugin_controller->isEnabled($this->base);
}
/**
@@ -160,9 +183,10 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool If an update is available
*/
- public function updateAvailable() {
- if(!$this->isInstalled()) return false;
- if($this->isBundled()) return false;
+ public function updateAvailable()
+ {
+ if (!$this->isInstalled()) return false;
+ if ($this->isBundled()) return false;
$lastupdate = $this->getLastUpdate();
if ($lastupdate === false) return false;
$installed = $this->getInstalledVersion();
@@ -175,7 +199,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool If this extension is a template
*/
- public function isTemplate() {
+ public function isTemplate()
+ {
return $this->is_template;
}
@@ -186,7 +211,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string
*/
- public function getID() {
+ public function getID()
+ {
return $this->id;
}
@@ -195,7 +221,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string The name of the installation directory
*/
- public function getInstallName() {
+ public function getInstallName()
+ {
return $this->base;
}
@@ -205,7 +232,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string The basename
*/
- public function getBase() {
+ public function getBase()
+ {
if (!empty($this->localInfo['base'])) return $this->localInfo['base'];
return $this->base;
}
@@ -215,7 +243,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string The display name
*/
- public function getDisplayName() {
+ public function getDisplayName()
+ {
if (!empty($this->localInfo['name'])) return $this->localInfo['name'];
if (!empty($this->remoteInfo['name'])) return $this->remoteInfo['name'];
return $this->base;
@@ -226,7 +255,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The name of the author or false if there is none
*/
- public function getAuthor() {
+ public function getAuthor()
+ {
if (!empty($this->localInfo['author'])) return $this->localInfo['author'];
if (!empty($this->remoteInfo['author'])) return $this->remoteInfo['author'];
return false;
@@ -237,7 +267,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The email address or false if there is none
*/
- public function getEmail() {
+ public function getEmail()
+ {
// email is only in the local data
if (!empty($this->localInfo['email'])) return $this->localInfo['email'];
return false;
@@ -248,7 +279,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The md5sum of the email if there is any, false otherwise
*/
- public function getEmailID() {
+ public function getEmailID()
+ {
if (!empty($this->remoteInfo['emailid'])) return $this->remoteInfo['emailid'];
if (!empty($this->localInfo['email'])) return md5($this->localInfo['email']);
return false;
@@ -259,7 +291,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string The description
*/
- public function getDescription() {
+ public function getDescription()
+ {
if (!empty($this->localInfo['desc'])) return $this->localInfo['desc'];
if (!empty($this->remoteInfo['description'])) return $this->remoteInfo['description'];
return '';
@@ -270,9 +303,11 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string The URL
*/
- public function getURL() {
+ public function getURL()
+ {
if (!empty($this->localInfo['url'])) return $this->localInfo['url'];
- return 'https://www.dokuwiki.org/'.($this->isTemplate() ? 'template' : 'plugin').':'.$this->getBase();
+ return 'https://www.dokuwiki.org/'.
+ ($this->isTemplate() ? 'template' : 'plugin').':'.$this->getBase();
}
/**
@@ -280,7 +315,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The version, usually in the form yyyy-mm-dd if there is any
*/
- public function getInstalledVersion() {
+ public function getInstalledVersion()
+ {
if (!empty($this->localInfo['date'])) return $this->localInfo['date'];
if ($this->isInstalled()) return $this->getLang('unknownversion');
return false;
@@ -291,7 +327,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The date of the last update or false if not available
*/
- public function getUpdateDate() {
+ public function getUpdateDate()
+ {
if (!empty($this->managerData['updated'])) return $this->managerData['updated'];
return $this->getInstallDate();
}
@@ -301,7 +338,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The date of the installation or false if not available
*/
- public function getInstallDate() {
+ public function getInstallDate()
+ {
if (!empty($this->managerData['installed'])) return $this->managerData['installed'];
return false;
}
@@ -311,7 +349,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return array The base names of the dependencies
*/
- public function getDependencies() {
+ public function getDependencies()
+ {
if (!empty($this->remoteInfo['dependencies'])) return $this->remoteInfo['dependencies'];
return array();
}
@@ -321,13 +360,14 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return array The base names of the missing dependencies
*/
- public function getMissingDependencies() {
- /* @var Doku_Plugin_Controller $plugin_controller */
+ public function getMissingDependencies()
+ {
+ /* @var PluginController $plugin_controller */
global $plugin_controller;
$dependencies = $this->getDependencies();
$missing_dependencies = array();
foreach ($dependencies as $dependency) {
- if ($plugin_controller->isdisabled($dependency)) {
+ if (!$plugin_controller->isEnabled($dependency)) {
$missing_dependencies[] = $dependency;
}
}
@@ -339,7 +379,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return array The names of the conflicting extensions
*/
- public function getConflicts() {
+ public function getConflicts()
+ {
if (!empty($this->remoteInfo['conflicts'])) return $this->remoteInfo['conflicts'];
return array();
}
@@ -349,7 +390,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return array The names of similar extensions
*/
- public function getSimilarExtensions() {
+ public function getSimilarExtensions()
+ {
if (!empty($this->remoteInfo['similar'])) return $this->remoteInfo['similar'];
return array();
}
@@ -359,7 +401,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return array The names of the tags of the extension
*/
- public function getTags() {
+ public function getTags()
+ {
if (!empty($this->remoteInfo['tags'])) return $this->remoteInfo['tags'];
return array();
}
@@ -369,7 +412,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return float|bool The popularity information or false if it isn't available
*/
- public function getPopularity() {
+ public function getPopularity()
+ {
if (!empty($this->remoteInfo['popularity'])) return $this->remoteInfo['popularity'];
return false;
}
@@ -380,7 +424,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The security warning if there is any, false otherwise
*/
- public function getSecurityWarning() {
+ public function getSecurityWarning()
+ {
if (!empty($this->remoteInfo['securitywarning'])) return $this->remoteInfo['securitywarning'];
return false;
}
@@ -390,7 +435,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The security issue if there is any, false otherwise
*/
- public function getSecurityIssue() {
+ public function getSecurityIssue()
+ {
if (!empty($this->remoteInfo['securityissue'])) return $this->remoteInfo['securityissue'];
return false;
}
@@ -400,7 +446,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The screenshot URL if there is any, false otherwise
*/
- public function getScreenshotURL() {
+ public function getScreenshotURL()
+ {
if (!empty($this->remoteInfo['screenshoturl'])) return $this->remoteInfo['screenshoturl'];
return false;
}
@@ -410,7 +457,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The thumbnail URL if there is any, false otherwise
*/
- public function getThumbnailURL() {
+ public function getThumbnailURL()
+ {
if (!empty($this->remoteInfo['thumbnailurl'])) return $this->remoteInfo['thumbnailurl'];
return false;
}
@@ -419,7 +467,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The previously used download URL, false if the extension has been installed manually
*/
- public function getLastDownloadURL() {
+ public function getLastDownloadURL()
+ {
if (!empty($this->managerData['downloadurl'])) return $this->managerData['downloadurl'];
return false;
}
@@ -429,7 +478,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The download URL if there is any, false otherwise
*/
- public function getDownloadURL() {
+ public function getDownloadURL()
+ {
if (!empty($this->remoteInfo['downloadurl'])) return $this->remoteInfo['downloadurl'];
return false;
}
@@ -439,7 +489,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool If the download URL has changed
*/
- public function hasDownloadURLChanged() {
+ public function hasDownloadURLChanged()
+ {
$lasturl = $this->getLastDownloadURL();
$currenturl = $this->getDownloadURL();
return ($lasturl && $currenturl && $lasturl != $currenturl);
@@ -450,7 +501,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The bug tracker URL if there is any, false otherwise
*/
- public function getBugtrackerURL() {
+ public function getBugtrackerURL()
+ {
if (!empty($this->remoteInfo['bugtracker'])) return $this->remoteInfo['bugtracker'];
return false;
}
@@ -460,7 +512,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The URL of the source repository if there is any, false otherwise
*/
- public function getSourcerepoURL() {
+ public function getSourcerepoURL()
+ {
if (!empty($this->remoteInfo['sourcerepo'])) return $this->remoteInfo['sourcerepo'];
return false;
}
@@ -470,7 +523,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The donation URL if there is any, false otherwise
*/
- public function getDonationURL() {
+ public function getDonationURL()
+ {
if (!empty($this->remoteInfo['donationurl'])) return $this->remoteInfo['donationurl'];
return false;
}
@@ -480,7 +534,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return array The type(s) as array of strings
*/
- public function getTypes() {
+ public function getTypes()
+ {
if (!empty($this->remoteInfo['types'])) return $this->remoteInfo['types'];
if ($this->isTemplate()) return array(32 => 'template');
return array();
@@ -491,7 +546,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return array The versions in the form yyyy-mm-dd => ('label' => label, 'implicit' => implicit)
*/
- public function getCompatibleVersions() {
+ public function getCompatibleVersions()
+ {
if (!empty($this->remoteInfo['compatible'])) return $this->remoteInfo['compatible'];
return array();
}
@@ -501,7 +557,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string|bool The last available update in the form yyyy-mm-dd if there is any, false otherwise
*/
- public function getLastUpdate() {
+ public function getLastUpdate()
+ {
if (!empty($this->remoteInfo['lastupdate'])) return $this->remoteInfo['lastupdate'];
return false;
}
@@ -511,9 +568,10 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string The base path of the extension
*/
- public function getInstallDir() {
+ public function getInstallDir()
+ {
if ($this->isTemplate()) {
- return DOKU_TPLLIB.$this->base;
+ return $this->tpllib.$this->base;
} else {
return DOKU_PLUGIN.$this->base;
}
@@ -524,7 +582,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return string One of "none", "manual", "git" or "automatic"
*/
- public function getInstallType() {
+ public function getInstallType()
+ {
if (!$this->isInstalled()) return 'none';
if (!empty($this->managerData)) return 'automatic';
if (is_dir($this->getInstallDir().'/.git')) return 'git';
@@ -536,17 +595,17 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool|string True or error string
*/
- public function canModify() {
- if($this->isInstalled()) {
- if(!is_writable($this->getInstallDir())) {
+ public function canModify()
+ {
+ if ($this->isInstalled()) {
+ if (!is_writable($this->getInstallDir())) {
return 'noperms';
}
}
- if($this->isTemplate() && !is_writable(DOKU_TPLLIB)) {
+ if ($this->isTemplate() && !is_writable($this->tpllib)) {
return 'notplperms';
-
- } elseif(!is_writable(DOKU_PLUGIN)) {
+ } elseif (!is_writable(DOKU_PLUGIN)) {
return 'nopluginperms';
}
return true;
@@ -556,33 +615,35 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
* Install an extension from a user upload
*
* @param string $field name of the upload file
+ * @param boolean $overwrite overwrite folder if the extension name is the same
* @throws Exception when something goes wrong
* @return array The list of installed extensions
*/
- public function installFromUpload($field){
- if($_FILES[$field]['error']){
+ public function installFromUpload($field, $overwrite = true)
+ {
+ if ($_FILES[$field]['error']) {
throw new Exception($this->getLang('msg_upload_failed').' ('.$_FILES[$field]['error'].')');
}
$tmp = $this->mkTmpDir();
- if(!$tmp) throw new Exception($this->getLang('error_dircreate'));
+ if (!$tmp) throw new Exception($this->getLang('error_dircreate'));
// filename may contain the plugin name for old style plugins...
$basename = basename($_FILES[$field]['name']);
$basename = preg_replace('/\.(tar\.gz|tar\.bz|tar\.bz2|tar|tgz|tbz|zip)$/', '', $basename);
$basename = preg_replace('/[\W]+/', '', $basename);
- if(!move_uploaded_file($_FILES[$field]['tmp_name'], "$tmp/upload.archive")){
+ if (!move_uploaded_file($_FILES[$field]['tmp_name'], "$tmp/upload.archive")) {
throw new Exception($this->getLang('msg_upload_failed'));
}
try {
- $installed = $this->installArchive("$tmp/upload.archive", true, $basename);
+ $installed = $this->installArchive("$tmp/upload.archive", $overwrite, $basename);
$this->updateManagerData('', $installed);
$this->removeDeletedfiles($installed);
// purge cache
$this->purgeCache();
- }catch (Exception $e){
+ } catch (Exception $e) {
throw $e;
}
return $installed;
@@ -592,19 +653,21 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
* Install an extension from a remote URL
*
* @param string $url
+ * @param boolean $overwrite overwrite folder if the extension name is the same
* @throws Exception when something goes wrong
* @return array The list of installed extensions
*/
- public function installFromURL($url){
+ public function installFromURL($url, $overwrite = true)
+ {
try {
$path = $this->download($url);
- $installed = $this->installArchive($path, true);
+ $installed = $this->installArchive($path, $overwrite);
$this->updateManagerData($url, $installed);
$this->removeDeletedfiles($installed);
// purge cache
$this->purgeCache();
- }catch (Exception $e){
+ } catch (Exception $e) {
throw $e;
}
return $installed;
@@ -616,7 +679,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
* @throws \Exception when something goes wrong
* @return array The list of installed extensions
*/
- public function installOrUpdate() {
+ public function installOrUpdate()
+ {
$url = $this->getDownloadURL();
$path = $this->download($url);
$installed = $this->installArchive($path, $this->isInstalled(), $this->getBase());
@@ -637,7 +701,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool If the plugin was sucessfully uninstalled
*/
- public function uninstall() {
+ public function uninstall()
+ {
$this->purgeCache();
return io_rmdir($this->getInstallDir(), true);
}
@@ -647,12 +712,13 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool|string True or an error message
*/
- public function enable() {
+ public function enable()
+ {
if ($this->isTemplate()) return $this->getLang('notimplemented');
if (!$this->isInstalled()) return $this->getLang('notinstalled');
if ($this->isEnabled()) return $this->getLang('alreadyenabled');
- /* @var Doku_Plugin_Controller $plugin_controller */
+ /* @var PluginController $plugin_controller */
global $plugin_controller;
if ($plugin_controller->enable($this->base)) {
$this->purgeCache();
@@ -667,10 +733,11 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return bool|string True or an error message
*/
- public function disable() {
+ public function disable()
+ {
if ($this->isTemplate()) return $this->getLang('notimplemented');
- /* @var Doku_Plugin_Controller $plugin_controller */
+ /* @var PluginController $plugin_controller */
global $plugin_controller;
if (!$this->isInstalled()) return $this->getLang('notinstalled');
if (!$this->isEnabled()) return $this->getLang('alreadydisabled');
@@ -685,7 +752,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
/**
* Purge the cache by touching the main configuration file
*/
- protected function purgeCache() {
+ protected function purgeCache()
+ {
global $config_cascade;
// expire dokuwiki caches
@@ -696,7 +764,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
/**
* Read local extension data either from info.txt or getInfo()
*/
- protected function readLocalData() {
+ protected function readLocalData()
+ {
if ($this->isTemplate()) {
$infopath = $this->getInstallDir().'/template.info.txt';
} else {
@@ -706,19 +775,18 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
if (is_readable($infopath)) {
$this->localInfo = confToHash($infopath);
} elseif (!$this->isTemplate() && $this->isEnabled()) {
- global $plugin_types;
- $path = $this->getInstallDir().'/';
- $plugin = null;
+ $path = $this->getInstallDir().'/';
+ $plugin = null;
- foreach($plugin_types as $type) {
- if(file_exists($path.$type.'.php')) {
+ foreach (PluginController::PLUGIN_TYPES as $type) {
+ if (file_exists($path.$type.'.php')) {
$plugin = plugin_load($type, $this->base);
if ($plugin) break;
}
- if($dh = @opendir($path.$type.'/')) {
- while(false !== ($cp = readdir($dh))) {
- if($cp == '.' || $cp == '..' || strtolower(substr($cp, -4)) != '.php') continue;
+ if ($dh = @opendir($path.$type.'/')) {
+ while (false !== ($cp = readdir($dh))) {
+ if ($cp == '.' || $cp == '..' || strtolower(substr($cp, -4)) != '.php') continue;
$plugin = plugin_load($type, $this->base.'_'.substr($cp, 0, -4));
if ($plugin) break;
@@ -741,21 +809,22 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
* @param string $url Where the extension was downloaded from. (empty for manual installs via upload)
* @param array $installed Optional list of installed plugins
*/
- protected function updateManagerData($url = '', $installed = null) {
+ protected function updateManagerData($url = '', $installed = null)
+ {
$origID = $this->getID();
- if(is_null($installed)) {
+ if (is_null($installed)) {
$installed = array($origID);
}
- foreach($installed as $ext => $info) {
- if($this->getID() != $ext) $this->setExtension($ext);
- if($url) {
+ foreach ($installed as $ext => $info) {
+ if ($this->getID() != $ext) $this->setExtension($ext);
+ if ($url) {
$this->managerData['downloadurl'] = $url;
- } elseif(isset($this->managerData['downloadurl'])) {
+ } elseif (isset($this->managerData['downloadurl'])) {
unset($this->managerData['downloadurl']);
}
- if(isset($this->managerData['installed'])) {
+ if (isset($this->managerData['installed'])) {
$this->managerData['updated'] = date('r');
} else {
$this->managerData['installed'] = date('r');
@@ -763,23 +832,24 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
$this->writeManagerData();
}
- if($this->getID() != $origID) $this->setExtension($origID);
+ if ($this->getID() != $origID) $this->setExtension($origID);
}
/**
* Read the manager.dat file
*/
- protected function readManagerData() {
+ protected function readManagerData()
+ {
$managerpath = $this->getInstallDir().'/manager.dat';
if (is_readable($managerpath)) {
$file = @file($managerpath);
- if(!empty($file)) {
- foreach($file as $line) {
+ if (!empty($file)) {
+ foreach ($file as $line) {
list($key, $value) = explode('=', trim($line, DOKU_LF), 2);
$key = trim($key);
$value = trim($value);
// backwards compatible with old plugin manager
- if($key == 'url') $key = 'downloadurl';
+ if ($key == 'url') $key = 'downloadurl';
$this->managerData[$key] = $value;
}
}
@@ -789,7 +859,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
/**
* Write the manager.data file
*/
- protected function writeManagerData() {
+ protected function writeManagerData()
+ {
$managerpath = $this->getInstallDir().'/manager.dat';
$data = '';
foreach ($this->managerData as $k => $v) {
@@ -805,43 +876,101 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @return false|string
*/
- protected function mkTmpDir(){
+ protected function mkTmpDir()
+ {
$dir = io_mktmpdir();
- if(!$dir) return false;
+ if (!$dir) return false;
$this->temporary[] = $dir;
return $dir;
}
/**
+ * downloads a file from the net and saves it
+ *
+ * - $file is the directory where the file should be saved
+ * - if successful will return the name used for the saved file, false otherwise
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ * @param string $url url to download
+ * @param string $file path to file or directory where to save
+ * @param string $defaultName fallback for name of download
+ * @return bool|string if failed false, otherwise true or the name of the file in the given dir
+ */
+ protected function downloadToFile($url, $file, $defaultName = '')
+ {
+ global $conf;
+ $http = new DokuHTTPClient();
+ $http->max_bodysize = 0;
+ $http->timeout = 25; //max. 25 sec
+ $http->keep_alive = false; // we do single ops here, no need for keep-alive
+ $http->agent = 'DokuWiki HTTP Client (Extension Manager)';
+
+ $data = $http->get($url);
+ if ($data === false) return false;
+
+ $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 = \dokuwiki\Utf8\PhpString::basename($match[1]);
+ }
+
+ }
+
+ if (!$name) {
+ if (!$defaultName) return false;
+ $name = $defaultName;
+ }
+
+ $file = $file.$name;
+
+ $fileexists = file_exists($file);
+ $fp = @fopen($file,"w");
+ if (!$fp) return false;
+ fwrite($fp, $data);
+ fclose($fp);
+ if (!$fileexists and $conf['fperm']) chmod($file, $conf['fperm']);
+ return $name;
+ }
+
+ /**
* Download an archive to a protected path
*
* @param string $url The url to get the archive from
* @throws Exception when something goes wrong
* @return string The path where the archive was saved
*/
- public function download($url) {
+ public function download($url)
+ {
// check the url
- if(!preg_match('/https?:\/\//i', $url)){
+ if (!preg_match('/https?:\/\//i', $url)) {
throw new Exception($this->getLang('error_badurl'));
}
// try to get the file from the path (used as plugin name fallback)
$file = parse_url($url, PHP_URL_PATH);
- if(is_null($file)){
+ if (is_null($file)) {
$file = md5($url);
- }else{
- $file = utf8_basename($file);
+ } else {
+ $file = \dokuwiki\Utf8\PhpString::basename($file);
}
// create tmp directory for download
- if(!($tmp = $this->mkTmpDir())) {
+ if (!($tmp = $this->mkTmpDir())) {
throw new Exception($this->getLang('error_dircreate'));
}
// download
- if(!$file = io_download($url, $tmp.'/', true, $file, 0)) {
+ if (!$file = $this->downloadToFile($url, $tmp.'/', $file)) {
io_rmdir($tmp, true);
- throw new Exception(sprintf($this->getLang('error_download'), '<bdi>'.hsc($url).'</bdi>'));
+ throw new Exception(sprintf($this->getLang('error_download'),
+ '<bdi>'.hsc($url).'</bdi>')
+ );
}
return $tmp.'/'.$file;
@@ -854,16 +983,17 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
* @throws Exception when something went wrong
* @return array list of installed extensions
*/
- public function installArchive($file, $overwrite=false, $base = '') {
+ public function installArchive($file, $overwrite = false, $base = '')
+ {
$installed_extensions = array();
// create tmp directory for decompression
- if(!($tmp = $this->mkTmpDir())) {
+ if (!($tmp = $this->mkTmpDir())) {
throw new Exception($this->getLang('error_dircreate'));
}
// add default base folder if specified to handle case where zip doesn't contain this
- if($base && !@mkdir($tmp.'/'.$base)) {
+ if ($base && !@mkdir($tmp.'/'.$base)) {
throw new Exception($this->getLang('error_dircreate'));
}
@@ -874,33 +1004,33 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
// move the folder(s) to lib/..
$result = array('old'=>array(), 'new'=>array());
$default = ($this->isTemplate() ? 'template' : 'plugin');
- if(!$this->find_folders($result, $tmp.'/'.$base, $default)) {
+ if (!$this->findFolders($result, $tmp.'/'.$base, $default)) {
throw new Exception($this->getLang('error_findfolder'));
}
// choose correct result array
- if(count($result['new'])) {
+ if (count($result['new'])) {
$install = $result['new'];
- }else{
+ } else {
$install = $result['old'];
}
- if(!count($install)){
+ if (!count($install)) {
throw new Exception($this->getLang('error_findfolder'));
}
// now install all found items
- foreach($install as $item) {
+ foreach ($install as $item) {
// where to install?
- if($item['type'] == 'template') {
- $target_base_dir = DOKU_TPLLIB;
- }else{
+ if ($item['type'] == 'template') {
+ $target_base_dir = $this->tpllib;
+ } else {
$target_base_dir = DOKU_PLUGIN;
}
- if(!empty($item['base'])) {
+ if (!empty($item['base'])) {
// use base set in info.txt
- } elseif($base && count($install) == 1) {
+ } elseif ($base && count($install) == 1) {
$item['base'] = $base;
} else {
// default - use directory as found in zip
@@ -911,18 +1041,20 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
// check to make sure we aren't overwriting anything
$target = $target_base_dir.$item['base'];
- if(!$overwrite && file_exists($target)) {
- // TODO remember our settings, ask the user to confirm overwrite
+ if (!$overwrite && file_exists($target)) {
+ // this info message is not being exposed via exception,
+ // so that it's not interrupting the installation
+ msg(sprintf($this->getLang('msg_nooverwrite'), $item['base']));
continue;
}
$action = file_exists($target) ? 'update' : 'install';
// copy action
- if($this->dircopy($item['tmp'], $target)) {
+ if ($this->dircopy($item['tmp'], $target)) {
// return info
$id = $item['base'];
- if($item['type'] == 'template') {
+ if ($item['type'] == 'template') {
$id = 'template:'.$id;
}
$installed_extensions[$id] = array(
@@ -931,12 +1063,14 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
'action' => $action
);
} else {
- throw new Exception(sprintf($this->getLang('error_copy').DOKU_LF, '<bdi>'.$item['base'].'</bdi>'));
+ throw new Exception(sprintf($this->getLang('error_copy').DOKU_LF,
+ '<bdi>'.$item['base'].'</bdi>')
+ );
}
}
// cleanup
- if($tmp) io_rmdir($tmp, true);
+ if ($tmp) io_rmdir($tmp, true);
return $installed_extensions;
}
@@ -962,20 +1096,20 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
* @param string $subdir - a subdirectory. do not set. used by recursion
* @return bool - false on error
*/
- protected function find_folders(&$result, $directory, $default_type='plugin', $subdir='') {
+ protected function findFolders(&$result, $directory, $default_type = 'plugin', $subdir = '')
+ {
$this_dir = "$directory$subdir";
$dh = @opendir($this_dir);
- if(!$dh) return false;
+ if (!$dh) return false;
$found_dirs = array();
$found_files = 0;
$found_template_parts = 0;
while (false !== ($f = readdir($dh))) {
- if($f == '.' || $f == '..') continue;
+ if ($f == '.' || $f == '..') continue;
- if(is_dir("$this_dir/$f")) {
+ if (is_dir("$this_dir/$f")) {
$found_dirs[] = "$subdir/$f";
-
} else {
// it's a file -> check for config
$found_files++;
@@ -1004,14 +1138,14 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
closedir($dh);
// files where found but no info.txt - use old method
- if($found_files){
- $info = array();
- $info['tmp'] = $this_dir;
+ if ($found_files) {
+ $info = array();
+ $info['tmp'] = $this_dir;
// does this look like a template or should we use the default type?
- if($found_template_parts >= 2) {
- $info['type'] = 'template';
+ if ($found_template_parts >= 2) {
+ $info['type'] = 'template';
} else {
- $info['type'] = $default_type;
+ $info['type'] = $default_type;
}
$result['old'][] = $info;
@@ -1020,7 +1154,7 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
// we have no files yet -> recurse
foreach ($found_dirs as $found_dir) {
- $this->find_folders($result, $directory, $default_type, "$found_dir");
+ $this->findFolders($result, $directory, $default_type, "$found_dir");
}
return true;
}
@@ -1035,13 +1169,13 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
* @throws Exception
* @return bool
*/
- private function decompress($file, $target) {
+ private function decompress($file, $target)
+ {
// decompression library doesn't like target folders ending in "/"
- if(substr($target, -1) == "/") $target = substr($target, 0, -1);
-
- $ext = $this->guess_archive($file);
- if(in_array($ext, array('tar', 'bz', 'gz'))) {
+ if (substr($target, -1) == "/") $target = substr($target, 0, -1);
+ $ext = $this->guessArchiveType($file);
+ if (in_array($ext, array('tar', 'bz', 'gz'))) {
try {
$tar = new \splitbrain\PHPArchive\Tar();
$tar->open($file);
@@ -1051,8 +1185,7 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
}
return true;
- } elseif($ext == 'zip') {
-
+ } elseif ($ext == 'zip') {
try {
$zip = new \splitbrain\PHPArchive\Zip();
$zip->open($file);
@@ -1064,7 +1197,8 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
return true;
}
- // the only case when we don't get one of the recognized archive types is when the archive file can't be read
+ // the only case when we don't get one of the recognized archive types is
+ // when the archive file can't be read
throw new Exception($this->getLang('error_decompress').' Couldn\'t read archive file');
}
@@ -1078,15 +1212,16 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
* @param string $file The file to analyze
* @return string|false false if the file can't be read, otherwise an "extension"
*/
- private function guess_archive($file) {
+ private function guessArchiveType($file)
+ {
$fh = fopen($file, 'rb');
- if(!$fh) return false;
+ if (!$fh) return false;
$magic = fread($fh, 5);
fclose($fh);
- if(strpos($magic, "\x42\x5a") === 0) return 'bz';
- if(strpos($magic, "\x1f\x8b") === 0) return 'gz';
- if(strpos($magic, "\x50\x4b\x03\x04") === 0) return 'zip';
+ if (strpos($magic, "\x42\x5a") === 0) return 'bz';
+ if (strpos($magic, "\x1f\x8b") === 0) return 'gz';
+ if (strpos($magic, "\x50\x4b\x03\x04") === 0) return 'zip';
return 'tar';
}
@@ -1097,27 +1232,27 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
* @param string $dst filename path to file
* @return bool|int|string
*/
- private function dircopy($src, $dst) {
+ private function dircopy($src, $dst)
+ {
global $conf;
- if(is_dir($src)) {
- if(!$dh = @opendir($src)) return false;
+ if (is_dir($src)) {
+ if (!$dh = @opendir($src)) return false;
- if($ok = io_mkdir_p($dst)) {
+ if ($ok = io_mkdir_p($dst)) {
while ($ok && (false !== ($f = readdir($dh)))) {
- if($f == '..' || $f == '.') continue;
+ if ($f == '..' || $f == '.') continue;
$ok = $this->dircopy("$src/$f", "$dst/$f");
}
}
closedir($dh);
return $ok;
-
} else {
- $exists = file_exists($dst);
+ $existed = file_exists($dst);
- if(!@copy($src, $dst)) return false;
- if(!$exists && !empty($conf['fperm'])) chmod($dst, $conf['fperm']);
+ if (!@copy($src, $dst)) return false;
+ if (!$existed && $conf['fperm']) chmod($dst, $conf['fperm']);
@touch($dst, filemtime($src));
}
@@ -1129,29 +1264,30 @@ class helper_plugin_extension_extension extends DokuWiki_Plugin {
*
* @param array $installed
*/
- private function removeDeletedfiles($installed) {
- foreach($installed as $id => $extension) {
+ private function removeDeletedfiles($installed)
+ {
+ foreach ($installed as $id => $extension) {
// only on update
- if($extension['action'] == 'install') continue;
+ if ($extension['action'] == 'install') continue;
// get definition file
- if($extension['type'] == 'template') {
- $extensiondir = DOKU_TPLLIB;
- }else{
+ if ($extension['type'] == 'template') {
+ $extensiondir = $this->tpllib;
+ } else {
$extensiondir = DOKU_PLUGIN;
}
$extensiondir = $extensiondir . $extension['base'] .'/';
$definitionfile = $extensiondir . 'deleted.files';
- if(!file_exists($definitionfile)) continue;
+ if (!file_exists($definitionfile)) continue;
// delete the old files
$list = file($definitionfile);
- foreach($list as $line) {
+ foreach ($list as $line) {
$line = trim(preg_replace('/#.*$/', '', $line));
- if(!$line) continue;
+ if (!$line) continue;
$file = $extensiondir . $line;
- if(!file_exists($file)) continue;
+ if (!file_exists($file)) continue;
io_rmdir($file, true);
}
diff --git a/lib/plugins/extension/helper/gui.php b/lib/plugins/extension/helper/gui.php
index 4ec6fec85..919eb2c0b 100644
--- a/lib/plugins/extension/helper/gui.php
+++ b/lib/plugins/extension/helper/gui.php
@@ -6,14 +6,13 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
+use dokuwiki\Form\Form;
/**
* Class helper_plugin_extension_list takes care of the overall GUI
*/
-class helper_plugin_extension_gui extends DokuWiki_Plugin {
-
+class helper_plugin_extension_gui extends DokuWiki_Plugin
+{
protected $tabs = array('plugins', 'templates', 'search', 'install');
/** @var string the extension that should have an open info window FIXME currently broken */
@@ -24,7 +23,8 @@ class helper_plugin_extension_gui extends DokuWiki_Plugin {
*
* initializes requested info window
*/
- public function __construct() {
+ public function __construct()
+ {
global $INPUT;
$this->infoFor = $INPUT->str('info');
}
@@ -32,33 +32,37 @@ class helper_plugin_extension_gui extends DokuWiki_Plugin {
/**
* display the plugin tab
*/
- public function tabPlugins() {
- /* @var Doku_Plugin_Controller $plugin_controller */
- global $plugin_controller;
-
+ public function tabPlugins()
+ {
echo '<div class="panelHeader">';
echo $this->locale_xhtml('intro_plugins');
echo '</div>';
- $pluginlist = $plugin_controller->getList('', true);
- sort($pluginlist);
+ $pluginlist = plugin_list('', true);
/* @var helper_plugin_extension_extension $extension */
$extension = $this->loadHelper('extension_extension');
/* @var helper_plugin_extension_list $list */
$list = $this->loadHelper('extension_list');
- $list->start_form();
- foreach($pluginlist as $name) {
+
+ $form = new Form([
+ 'action' => $this->tabURL('', [], '&'),
+ 'id' => 'extension__list',
+ ]);
+ $list->startForm();
+ foreach ($pluginlist as $name) {
$extension->setExtension($name);
- $list->add_row($extension, $extension->getID() == $this->infoFor);
+ $list->addRow($extension, $extension->getID() == $this->infoFor);
}
- $list->end_form();
- $list->render();
+ $list->endForm();
+ $form->addHTML($list->render(true));
+ echo $form->toHTML();
}
/**
* Display the template tab
*/
- public function tabTemplates() {
+ public function tabTemplates()
+ {
echo '<div class="panelHeader">';
echo $this->locale_xhtml('intro_templates');
echo '</div>';
@@ -72,30 +76,45 @@ class helper_plugin_extension_gui extends DokuWiki_Plugin {
$extension = $this->loadHelper('extension_extension');
/* @var helper_plugin_extension_list $list */
$list = $this->loadHelper('extension_list');
- $list->start_form();
- foreach($tpllist as $name) {
+
+ $form = new Form([
+ 'action' => $this->tabURL('', [], '&'),
+ 'id' => 'extension__list',
+ ]);
+ $list->startForm();
+ foreach ($tpllist as $name) {
$extension->setExtension("template:$name");
- $list->add_row($extension, $extension->getID() == $this->infoFor);
+ $list->addRow($extension, $extension->getID() == $this->infoFor);
}
- $list->end_form();
- $list->render();
+ $list->endForm();
+ $form->addHTML($list->render(true));
+ echo $form->toHTML();
}
/**
* Display the search tab
*/
- public function tabSearch() {
+ public function tabSearch()
+ {
global $INPUT;
echo '<div class="panelHeader">';
echo $this->locale_xhtml('intro_search');
echo '</div>';
- $form = new Doku_Form(array('action' => $this->tabURL('', array(), '&'), 'class' => 'search'));
- $form->addElement(form_makeTextField('q', $INPUT->str('q'), $this->getLang('search_for')));
- $form->addElement(form_makeButton('submit', '', $this->getLang('search')));
- $form->printForm();
-
- if(!$INPUT->bool('q')) return;
+ $form = new Form([
+ 'action' => $this->tabURL('', [], '&'),
+ 'class' => 'search',
+ ]);
+ $form->addTagOpen('div')->addClass('no');
+ $form->addTextInput('q', $this->getLang('search_for'))
+ ->addClass('edit')
+ ->val($INPUT->str('q'));
+ $form->addButton('submit', $this->getLang('search'))
+ ->attrs(['type' => 'submit', 'title' => $this->getLang('search')]);
+ $form->addTagClose('div');
+ echo $form->toHTML();
+
+ if (!$INPUT->bool('q')) return;
/* @var helper_plugin_extension_repository $repository FIXME should we use some gloabl instance? */
$repository = $this->loadHelper('extension_repository');
@@ -105,33 +124,56 @@ class helper_plugin_extension_gui extends DokuWiki_Plugin {
$extension = $this->loadHelper('extension_extension');
/* @var helper_plugin_extension_list $list */
$list = $this->loadHelper('extension_list');
- $list->start_form();
- if($result){
- foreach($result as $name) {
+
+ $form = new Form([
+ 'action' => $this->tabURL('', [], '&'),
+ 'id' => 'extension__list',
+ ]);
+ $list->startForm();
+ if ($result) {
+ foreach ($result as $name) {
$extension->setExtension($name);
- $list->add_row($extension, $extension->getID() == $this->infoFor);
+ $list->addRow($extension, $extension->getID() == $this->infoFor);
}
} else {
- $list->nothing_found();
+ $list->nothingFound();
}
- $list->end_form();
- $list->render();
-
+ $list->endForm();
+ $form->addHTML($list->render(true));
+ echo $form->toHTML();
}
/**
* Display the template tab
*/
- public function tabInstall() {
+ public function tabInstall()
+ {
+ global $lang;
echo '<div class="panelHeader">';
echo $this->locale_xhtml('intro_install');
echo '</div>';
- $form = new Doku_Form(array('action' => $this->tabURL('', array(), '&'), 'enctype' => 'multipart/form-data', 'class' => 'install'));
- $form->addElement(form_makeTextField('installurl', '', $this->getLang('install_url'), '', 'block'));
- $form->addElement(form_makeFileField('installfile', $this->getLang('install_upload'), '', 'block'));
- $form->addElement(form_makeButton('submit', '', $this->getLang('btn_install')));
- $form->printForm();
+ $form = new Form([
+ 'action' => $this->tabURL('', [], '&'),
+ 'enctype' => 'multipart/form-data',
+ 'class' => 'install',
+ ]);
+ $form->addTagOpen('div')->addClass('no');
+ $form->addTextInput('installurl', $this->getLang('install_url'))
+ ->addClass('block')
+ ->attrs(['type' => 'url']);
+ $form->addTag('br');
+ $form->addTextInput('installfile', $this->getLang('install_upload'))
+ ->addClass('block')
+ ->attrs(['type' => 'file']);
+ $form->addTag('br');
+ $form->addCheckbox('overwrite', $lang['js']['media_overwrt'])
+ ->addClass('block');
+ $form->addTag('br');
+ $form->addButton('', $this->getLang('btn_install'))
+ ->attrs(['type' => 'submit', 'title' => $this->getLang('btn_install')]);
+ $form->addTagClose('div');
+ echo $form->toHTML();
}
/**
@@ -139,11 +181,12 @@ class helper_plugin_extension_gui extends DokuWiki_Plugin {
*
* @fixme style active one
*/
- public function tabNavigation() {
+ public function tabNavigation()
+ {
echo '<ul class="tabs">';
- foreach($this->tabs as $tab) {
+ foreach ($this->tabs as $tab) {
$url = $this->tabURL($tab);
- if($this->currentTab() == $tab) {
+ if ($this->currentTab() == $tab) {
$class = ' active';
} else {
$class = '';
@@ -158,11 +201,12 @@ class helper_plugin_extension_gui extends DokuWiki_Plugin {
*
* @return string
*/
- public function currentTab() {
+ public function currentTab()
+ {
global $INPUT;
$tab = $INPUT->str('tab', 'plugins', true);
- if(!in_array($tab, $this->tabs)) $tab = 'plugins';
+ if (!in_array($tab, $this->tabs)) $tab = 'plugins';
return $tab;
}
@@ -175,19 +219,19 @@ class helper_plugin_extension_gui extends DokuWiki_Plugin {
* @param bool $absolute create absolute URLs?
* @return string
*/
- public function tabURL($tab = '', $params = array(), $sep = '&amp;', $absolute = false) {
+ public function tabURL($tab = '', $params = [], $sep = '&', $absolute = false)
+ {
global $ID;
global $INPUT;
- if(!$tab) $tab = $this->currentTab();
+ if (!$tab) $tab = $this->currentTab();
$defaults = array(
'do' => 'admin',
'page' => 'extension',
'tab' => $tab,
);
- if($tab == 'search') $defaults['q'] = $INPUT->str('q');
+ if ($tab == 'search') $defaults['q'] = $INPUT->str('q');
return wl($ID, array_merge($defaults, $params), $absolute, $sep);
}
-
}
diff --git a/lib/plugins/extension/helper/list.php b/lib/plugins/extension/helper/list.php
index 656b4ea09..647575b10 100644
--- a/lib/plugins/extension/helper/list.php
+++ b/lib/plugins/extension/helper/list.php
@@ -6,13 +6,11 @@
* @author Michael Hamann <michael@content-space.de>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
/**
* Class helper_plugin_extension_list takes care of creating a HTML list of extensions
*/
-class helper_plugin_extension_list extends DokuWiki_Plugin {
+class helper_plugin_extension_list extends DokuWiki_Plugin
+{
protected $form = '';
/** @var helper_plugin_extension_gui */
protected $gui;
@@ -22,30 +20,31 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
*
* loads additional helpers
*/
- public function __construct(){
+ public function __construct()
+ {
$this->gui = plugin_load('helper', 'extension_gui');
}
- function start_form() {
- $this->form .= '<form id="extension__list" accept-charset="utf-8" method="post" action="">';
- $hidden = array(
- 'do'=>'admin',
- 'page'=>'extension',
- 'sectok'=>getSecurityToken()
- );
- $this->add_hidden($hidden);
+ /**
+ * Initialize the extension table form
+ */
+ public function startForm()
+ {
$this->form .= '<ul class="extensionList">';
}
+
/**
* Build single row of extension table
+ *
* @param helper_plugin_extension_extension $extension The extension that shall be added
* @param bool $showinfo Show the info area
*/
- function add_row(helper_plugin_extension_extension $extension, $showinfo = false) {
- $this->start_row($extension);
- $this->populate_column('legend', $this->make_legend($extension, $showinfo));
- $this->populate_column('actions', $this->make_actions($extension));
- $this->end_row();
+ public function addRow(helper_plugin_extension_extension $extension, $showinfo = false)
+ {
+ $this->startRow($extension);
+ $this->populateColumn('legend', $this->makeLegend($extension, $showinfo));
+ $this->populateColumn('actions', $this->makeActions($extension));
+ $this->endRow();
}
/**
@@ -55,7 +54,8 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param string $header The content of the header
* @param int $level The level of the header
*/
- function add_header($id, $header, $level = 2) {
+ public function addHeader($id, $header, $level = 2)
+ {
$this->form .='<h'.$level.' id="'.$id.'">'.hsc($header).'</h'.$level.'>'.DOKU_LF;
}
@@ -64,17 +64,20 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
*
* @param string $data The content
*/
- function add_p($data) {
+ public function addParagraph($data)
+ {
$this->form .= '<p>'.hsc($data).'</p>'.DOKU_LF;
}
/**
* Add hidden fields to the form with the given data
- * @param array $array
+ *
+ * @param array $data key-value list of fields and their values to add
*/
- function add_hidden(array $array) {
+ public function addHidden(array $data)
+ {
$this->form .= '<div class="no">';
- foreach ($array as $key => $value) {
+ foreach ($data as $key => $value) {
$this->form .= '<input type="hidden" name="'.hsc($key).'" value="'.hsc($value).'" />';
}
$this->form .= '</div>'.DOKU_LF;
@@ -83,23 +86,28 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
/**
* Add closing tags
*/
- function end_form() {
+ public function endForm()
+ {
$this->form .= '</ul>';
- $this->form .= '</form>'.DOKU_LF;
}
/**
* Show message when no results are found
*/
- function nothing_found() {
+ public function nothingFound()
+ {
global $lang;
$this->form .= '<li class="notfound">'.$lang['nothingfound'].'</li>';
}
/**
* Print the form
+ *
+ * @param bool $returnonly whether to return html or print
*/
- function render() {
+ public function render($returnonly = false)
+ {
+ if ($returnonly) return $this->form;
echo $this->form;
}
@@ -108,8 +116,10 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
*
* @param helper_plugin_extension_extension $extension The extension
*/
- private function start_row(helper_plugin_extension_extension $extension) {
- $this->form .= '<li id="extensionplugin__'.hsc($extension->getID()).'" class="'.$this->make_class($extension).'">';
+ private function startRow(helper_plugin_extension_extension $extension)
+ {
+ $this->form .= '<li id="extensionplugin__'.hsc($extension->getID()).
+ '" class="'.$this->makeClass($extension).'">';
}
/**
@@ -117,14 +127,16 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param string $class The class name
* @param string $html The content
*/
- private function populate_column($class, $html) {
+ private function populateColumn($class, $html)
+ {
$this->form .= '<div class="'.$class.' col">'.$html.'</div>'.DOKU_LF;
}
/**
* End the row
*/
- private function end_row() {
+ private function endRow()
+ {
$this->form .= '</li>'.DOKU_LF;
}
@@ -134,27 +146,46 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param helper_plugin_extension_extension $extension The extension
* @return string The HTML code
*/
- function make_homepagelink(helper_plugin_extension_extension $extension) {
- $text = $this->getLang('homepage_link');
- $url = hsc($extension->getURL());
- return '<a href="'.$url.'" title="'.$url.'" class ="urlextern">'.$text.'</a> ';
+ public function makeHomepageLink(helper_plugin_extension_extension $extension)
+ {
+ global $conf;
+ $url = $extension->getURL();
+ if (strtolower(parse_url($url, PHP_URL_HOST)) == 'www.dokuwiki.org') {
+ $linktype = 'interwiki';
+ } else {
+ $linktype = 'extern';
+ }
+ $param = array(
+ 'href' => $url,
+ 'title' => $url,
+ 'class' => ($linktype == 'extern') ? 'urlextern' : 'interwiki iw_doku',
+ 'target' => $conf['target'][$linktype],
+ 'rel' => ($linktype == 'extern') ? 'noopener' : '',
+ );
+ if ($linktype == 'extern' && $conf['relnofollow']) {
+ $param['rel'] = implode(' ', [$param['rel'], 'ugc nofollow']);
+ }
+ $html = ' <a '. buildAttributes($param, true).'>'.
+ $this->getLang('homepage_link').'</a>';
+ return $html;
}
/**
- * Generate the class name for the row of the extensio
+ * Generate the class name for the row of the extension
*
* @param helper_plugin_extension_extension $extension The extension object
* @return string The class name
*/
- function make_class(helper_plugin_extension_extension $extension) {
+ public function makeClass(helper_plugin_extension_extension $extension)
+ {
$class = ($extension->isTemplate()) ? 'template' : 'plugin';
- if($extension->isInstalled()) {
+ if ($extension->isInstalled()) {
$class.=' installed';
$class.= ($extension->isEnabled()) ? ' enabled':' disabled';
- if($extension->updateAvailable()) $class .= ' updatable';
+ if ($extension->updateAvailable()) $class .= ' updatable';
}
- if(!$extension->canModify()) $class.= ' notselect';
- if($extension->isProtected()) $class.= ' protected';
+ if (!$extension->canModify()) $class.= ' notselect';
+ if ($extension->isProtected()) $class.= ' protected';
//if($this->showinfo) $class.= ' showinfo';
return $class;
}
@@ -165,21 +196,24 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param helper_plugin_extension_extension $extension The extension object
* @return string The HTML code of the link
*/
- function make_author(helper_plugin_extension_extension $extension) {
- global $ID;
-
- if($extension->getAuthor()) {
-
+ public function makeAuthor(helper_plugin_extension_extension $extension)
+ {
+ if ($extension->getAuthor()) {
$mailid = $extension->getEmailID();
- if($mailid){
+ if ($mailid) {
$url = $this->gui->tabURL('search', array('q' => 'authorid:'.$mailid));
- return '<bdi><a href="'.$url.'" class="author" title="'.$this->getLang('author_hint').'" ><img src="//www.gravatar.com/avatar/'.$mailid.'?s=20&amp;d=mm" width="20" height="20" alt="" /> '.hsc($extension->getAuthor()).'</a></bdi>';
-
- }else{
- return '<bdi><span class="author">'.hsc($extension->getAuthor()).'</span></bdi>';
+ $html = '<a href="'.$url.'" class="author" title="'.$this->getLang('author_hint').'" >'.
+ '<img src="//www.gravatar.com/avatar/'.$mailid.
+ '?s=20&amp;d=mm" width="20" height="20" alt="" /> '.
+ hsc($extension->getAuthor()).'</a>';
+ } else {
+ $html = '<span class="author">'.hsc($extension->getAuthor()).'</span>';
}
+ $html = '<bdi>'.$html.'</bdi>';
+ } else {
+ $html = '<em class="author">'.$this->getLang('unknown_author').'</em>'.DOKU_LF;
}
- return "<em class=\"author\">".$this->getLang('unknown_author')."</em>".DOKU_LF;
+ return $html;
}
/**
@@ -188,11 +222,12 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param helper_plugin_extension_extension $extension The extension object
* @return string The HTML code
*/
- function make_screenshot(helper_plugin_extension_extension $extension) {
+ public function makeScreenshot(helper_plugin_extension_extension $extension)
+ {
$screen = $extension->getScreenshotURL();
$thumb = $extension->getThumbnailURL();
- if($screen) {
+ if ($screen) {
// use protocol independent URLs for images coming from us #595
$screen = str_replace('http://www.dokuwiki.org', '//www.dokuwiki.org', $screen);
$thumb = str_replace('http://www.dokuwiki.org', '//www.dokuwiki.org', $thumb);
@@ -201,13 +236,15 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
$img = '<a href="'.hsc($screen).'" target="_blank" class="extension_screenshot">'.
'<img alt="'.$title.'" width="120" height="70" src="'.hsc($thumb).'" />'.
'</a>';
- } elseif($extension->isTemplate()) {
- $img = '<img alt="" width="120" height="70" src="'.DOKU_BASE.'lib/plugins/extension/images/template.png" />';
-
+ } elseif ($extension->isTemplate()) {
+ $img = '<img alt="" width="120" height="70" src="'.DOKU_BASE.
+ 'lib/plugins/extension/images/template.png" />';
} else {
- $img = '<img alt="" width="120" height="70" src="'.DOKU_BASE.'lib/plugins/extension/images/plugin.png" />';
+ $img = '<img alt="" width="120" height="70" src="'.DOKU_BASE.
+ 'lib/plugins/extension/images/plugin.png" />';
}
- return '<div class="screenshot" >'.$img.'<span></span></div>'.DOKU_LF;
+ $html = '<div class="screenshot" >'.$img.'<span></span></div>'.DOKU_LF;
+ return $html;
}
/**
@@ -217,43 +254,53 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param bool $showinfo Show the info section
* @return string The HTML code
*/
- function make_legend(helper_plugin_extension_extension $extension, $showinfo = false) {
- $return = '<div>';
- $return .= '<h2>';
- $return .= sprintf($this->getLang('extensionby'), '<bdi>'.hsc($extension->getDisplayName()).'</bdi>', $this->make_author($extension));
- $return .= '</h2>'.DOKU_LF;
+ public function makeLegend(helper_plugin_extension_extension $extension, $showinfo = false)
+ {
+ $html = '<div>';
+ $html .= '<h2>';
+ $html .= sprintf(
+ $this->getLang('extensionby'),
+ '<bdi>'.hsc($extension->getDisplayName()).'</bdi>',
+ $this->makeAuthor($extension)
+ );
+ $html .= '</h2>'.DOKU_LF;
- $return .= $this->make_screenshot($extension);
+ $html .= $this->makeScreenshot($extension);
$popularity = $extension->getPopularity();
if ($popularity !== false && !$extension->isBundled()) {
$popularityText = sprintf($this->getLang('popularity'), round($popularity*100, 2));
- $return .= '<div class="popularity" title="'.$popularityText.'"><div style="width: '.($popularity * 100).'%;"><span class="a11y">'.$popularityText.'</span></div></div>'.DOKU_LF;
+ $html .= '<div class="popularity" title="'.$popularityText.'">'.
+ '<div style="width: '.($popularity * 100).'%;">'.
+ '<span class="a11y">'.$popularityText.'</span>'.
+ '</div></div>'.DOKU_LF;
}
- if($extension->getDescription()) {
- $return .= '<p><bdi>';
- $return .= hsc($extension->getDescription()).' ';
- $return .= '</bdi></p>'.DOKU_LF;
+ if ($extension->getDescription()) {
+ $html .= '<p><bdi>';
+ $html .= hsc($extension->getDescription()).' ';
+ $html .= '</bdi></p>'.DOKU_LF;
}
- $return .= $this->make_linkbar($extension);
+ $html .= $this->makeLinkbar($extension);
- if($showinfo){
+ if ($showinfo) {
$url = $this->gui->tabURL('');
$class = 'close';
- }else{
+ } else {
$url = $this->gui->tabURL('', array('info' => $extension->getID()));
$class = '';
}
- $return .= ' <a href="'.$url.'#extensionplugin__'.$extension->getID().'" class="info '.$class.'" title="'.$this->getLang('btn_info').'" data-extid="'.$extension->getID().'">'.$this->getLang('btn_info').'</a>';
+ $html .= ' <a href="'.$url.'#extensionplugin__'.$extension->getID().
+ '" class="info '.$class.'" title="'.$this->getLang('btn_info').
+ '" data-extid="'.$extension->getID().'">'.$this->getLang('btn_info').'</a>';
if ($showinfo) {
- $return .= $this->make_info($extension);
+ $html .= $this->makeInfo($extension);
}
- $return .= $this->make_noticearea($extension);
- $return .= '</div>'.DOKU_LF;
- return $return;
+ $html .= $this->makeNoticeArea($extension);
+ $html .= '</div>'.DOKU_LF;
+ return $html;
}
/**
@@ -262,28 +309,48 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param helper_plugin_extension_extension $extension The extension instance
* @return string The HTML code
*/
- function make_linkbar(helper_plugin_extension_extension $extension) {
- $return = '<div class="linkbar">';
- $return .= $this->make_homepagelink($extension);
- if ($extension->getBugtrackerURL()) {
- $return .= ' <a href="'.hsc($extension->getBugtrackerURL()).'" title="'.hsc($extension->getBugtrackerURL()).'" class ="bugs">'.$this->getLang('bugs_features').'</a> ';
+ public function makeLinkbar(helper_plugin_extension_extension $extension)
+ {
+ global $conf;
+ $html = '<div class="linkbar">';
+ $html .= $this->makeHomepageLink($extension);
+
+ $bugtrackerURL = $extension->getBugtrackerURL();
+ if ($bugtrackerURL) {
+ if (strtolower(parse_url($bugtrackerURL, PHP_URL_HOST)) == 'www.dokuwiki.org') {
+ $linktype = 'interwiki';
+ } else {
+ $linktype = 'extern';
+ }
+ $param = array(
+ 'href' => $bugtrackerURL,
+ 'title' => $bugtrackerURL,
+ 'class' => 'bugs',
+ 'target' => $conf['target'][$linktype],
+ 'rel' => ($linktype == 'extern') ? 'noopener' : '',
+ );
+ if ($conf['relnofollow']) {
+ $param['rel'] = implode(' ', [$param['rel'], 'ugc nofollow']);
+ }
+ $html .= ' <a '.buildAttributes($param, true).'>'.
+ $this->getLang('bugs_features').'</a>';
}
- if ($extension->getTags()){
+ if ($extension->getTags()) {
$first = true;
- $return .= '<span class="tags">'.$this->getLang('tags').' ';
+ $html .= ' <span class="tags">'.$this->getLang('tags').' ';
foreach ($extension->getTags() as $tag) {
- if (!$first){
- $return .= ', ';
+ if (!$first) {
+ $html .= ', ';
} else {
$first = false;
}
- $url = $this->gui->tabURL('search', array('q' => 'tag:'.$tag));
- $return .= '<bdi><a href="'.$url.'">'.hsc($tag).'</a></bdi>';
+ $url = $this->gui->tabURL('search', ['q' => 'tag:'.$tag]);
+ $html .= '<bdi><a href="'.$url.'">'.hsc($tag).'</a></bdi>';
}
- $return .= '</span>';
+ $html .= '</span>';
}
- $return .= '</div>'.DOKU_LF;
- return $return;
+ $html .= '</div>'.DOKU_LF;
+ return $html;
}
/**
@@ -292,40 +359,52 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param helper_plugin_extension_extension $extension The extension
* @return string The HTML code
*/
- function make_noticearea(helper_plugin_extension_extension $extension) {
- $return = '';
+ public function makeNoticeArea(helper_plugin_extension_extension $extension)
+ {
+ $html = '';
$missing_dependencies = $extension->getMissingDependencies();
- if(!empty($missing_dependencies)) {
- $return .= '<div class="msg error">'.
- sprintf($this->getLang('missing_dependency'), '<bdi>'.implode(', ', /*array_map(array($this->helper, 'make_extensionsearchlink'),*/ $missing_dependencies).'</bdi>').
+ if (!empty($missing_dependencies)) {
+ $html .= '<div class="msg error">' .
+ sprintf(
+ $this->getLang('missing_dependency'),
+ '<bdi>' . implode(', ', $missing_dependencies) . '</bdi>'
+ ) .
'</div>';
}
- if($extension->isInWrongFolder()) {
- $return .= '<div class="msg error">'.
- sprintf($this->getLang('wrong_folder'), '<bdi>'.hsc($extension->getInstallName()).'</bdi>', '<bdi>'.hsc($extension->getBase()).'</bdi>').
+ if ($extension->isInWrongFolder()) {
+ $html .= '<div class="msg error">' .
+ sprintf(
+ $this->getLang('wrong_folder'),
+ '<bdi>' . hsc($extension->getInstallName()) . '</bdi>',
+ '<bdi>' . hsc($extension->getBase()) . '</bdi>'
+ ) .
'</div>';
}
- if(($securityissue = $extension->getSecurityIssue()) !== false) {
- $return .= '<div class="msg error">'.
+ if (($securityissue = $extension->getSecurityIssue()) !== false) {
+ $html .= '<div class="msg error">'.
sprintf($this->getLang('security_issue'), '<bdi>'.hsc($securityissue).'</bdi>').
'</div>';
}
- if(($securitywarning = $extension->getSecurityWarning()) !== false) {
- $return .= '<div class="msg notify">'.
+ if (($securitywarning = $extension->getSecurityWarning()) !== false) {
+ $html .= '<div class="msg notify">'.
sprintf($this->getLang('security_warning'), '<bdi>'.hsc($securitywarning).'</bdi>').
'</div>';
}
- if($extension->updateAvailable()) {
- $return .= '<div class="msg notify">'.
+ if ($extension->updateAvailable()) {
+ $html .= '<div class="msg notify">'.
sprintf($this->getLang('update_available'), hsc($extension->getLastUpdate())).
'</div>';
}
- if($extension->hasDownloadURLChanged()) {
- $return .= '<div class="msg notify">'.
- sprintf($this->getLang('url_change'), '<bdi>'.hsc($extension->getDownloadURL()).'</bdi>', '<bdi>'.hsc($extension->getLastDownloadURL()).'</bdi>').
+ if ($extension->hasDownloadURLChanged()) {
+ $html .= '<div class="msg notify">' .
+ sprintf(
+ $this->getLang('url_change'),
+ '<bdi>' . hsc($extension->getDownloadURL()) . '</bdi>',
+ '<bdi>' . hsc($extension->getLastDownloadURL()) . '</bdi>'
+ ) .
'</div>';
}
- return $return.DOKU_LF;
+ return $html.DOKU_LF;
}
/**
@@ -336,17 +415,19 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param string $url
* @return string HTML link
*/
- function shortlink($url){
+ public function shortlink($url)
+ {
$link = parse_url($url);
$base = $link['host'];
- if(!empty($link['port'])) $base .= $base.':'.$link['port'];
+ if (!empty($link['port'])) $base .= $base.':'.$link['port'];
$long = $link['path'];
- if(!empty($link['query'])) $long .= $link['query'];
+ if (!empty($link['query'])) $long .= $link['query'];
$name = shorten($base, $long, 55);
- return '<a href="'.hsc($url).'" class="urlextern">'.hsc($name).'</a>';
+ $html = '<a href="'.hsc($url).'" class="urlextern">'.hsc($name).'</a>';
+ return $html;
}
/**
@@ -355,89 +436,101 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param helper_plugin_extension_extension $extension The extension
* @return string The HTML code
*/
- function make_info(helper_plugin_extension_extension $extension) {
+ public function makeInfo(helper_plugin_extension_extension $extension)
+ {
$default = $this->getLang('unknown');
- $return = '<dl class="details">';
+ $html = '<dl class="details">';
- $return .= '<dt>'.$this->getLang('status').'</dt>';
- $return .= '<dd>'.$this->make_status($extension).'</dd>';
+ $html .= '<dt>'.$this->getLang('status').'</dt>';
+ $html .= '<dd>'.$this->makeStatus($extension).'</dd>';
if ($extension->getDonationURL()) {
- $return .= '<dt>'.$this->getLang('donate').'</dt>';
- $return .= '<dd>';
- $return .= '<a href="'.$extension->getDonationURL().'" class="donate">'.$this->getLang('donate_action').'</a>';
- $return .= '</dd>';
+ $html .= '<dt>'.$this->getLang('donate').'</dt>';
+ $html .= '<dd>';
+ $html .= '<a href="'.$extension->getDonationURL().'" class="donate">'.
+ $this->getLang('donate_action').'</a>';
+ $html .= '</dd>';
}
if (!$extension->isBundled()) {
- $return .= '<dt>'.$this->getLang('downloadurl').'</dt>';
- $return .= '<dd><bdi>';
- $return .= ($extension->getDownloadURL() ? $this->shortlink($extension->getDownloadURL()) : $default);
- $return .= '</bdi></dd>';
-
- $return .= '<dt>'.$this->getLang('repository').'</dt>';
- $return .= '<dd><bdi>';
- $return .= ($extension->getSourcerepoURL() ? $this->shortlink($extension->getSourcerepoURL()) : $default);
- $return .= '</bdi></dd>';
+ $html .= '<dt>'.$this->getLang('downloadurl').'</dt>';
+ $html .= '<dd><bdi>';
+ $html .= ($extension->getDownloadURL()
+ ? $this->shortlink($extension->getDownloadURL())
+ : $default);
+ $html .= '</bdi></dd>';
+
+ $html .= '<dt>'.$this->getLang('repository').'</dt>';
+ $html .= '<dd><bdi>';
+ $html .= ($extension->getSourcerepoURL()
+ ? $this->shortlink($extension->getSourcerepoURL())
+ : $default);
+ $html .= '</bdi></dd>';
}
if ($extension->isInstalled()) {
if ($extension->getInstalledVersion()) {
- $return .= '<dt>'.$this->getLang('installed_version').'</dt>';
- $return .= '<dd>';
- $return .= hsc($extension->getInstalledVersion());
- $return .= '</dd>';
+ $html .= '<dt>'.$this->getLang('installed_version').'</dt>';
+ $html .= '<dd>';
+ $html .= hsc($extension->getInstalledVersion());
+ $html .= '</dd>';
}
if (!$extension->isBundled()) {
- $return .= '<dt>'.$this->getLang('install_date').'</dt>';
- $return .= '<dd>';
- $return .= ($extension->getUpdateDate() ? hsc($extension->getUpdateDate()) : $this->getLang('unknown'));
- $return .= '</dd>';
+ $html .= '<dt>'.$this->getLang('install_date').'</dt>';
+ $html .= '<dd>';
+ $html .= ($extension->getUpdateDate()
+ ? hsc($extension->getUpdateDate())
+ : $this->getLang('unknown'));
+ $html .= '</dd>';
}
}
if (!$extension->isInstalled() || $extension->updateAvailable()) {
- $return .= '<dt>'.$this->getLang('available_version').'</dt>';
- $return .= '<dd>';
- $return .= ($extension->getLastUpdate() ? hsc($extension->getLastUpdate()) : $this->getLang('unknown'));
- $return .= '</dd>';
+ $html .= '<dt>'.$this->getLang('available_version').'</dt>';
+ $html .= '<dd>';
+ $html .= ($extension->getLastUpdate()
+ ? hsc($extension->getLastUpdate())
+ : $this->getLang('unknown'));
+ $html .= '</dd>';
}
- $return .= '<dt>'.$this->getLang('provides').'</dt>';
- $return .= '<dd><bdi>';
- $return .= ($extension->getTypes() ? hsc(implode(', ', $extension->getTypes())) : $default);
- $return .= '</bdi></dd>';
+ $html .= '<dt>'.$this->getLang('provides').'</dt>';
+ $html .= '<dd><bdi>';
+ $html .= ($extension->getTypes()
+ ? hsc(implode(', ', $extension->getTypes()))
+ : $default);
+ $html .= '</bdi></dd>';
- if(!$extension->isBundled() && $extension->getCompatibleVersions()) {
- $return .= '<dt>'.$this->getLang('compatible').'</dt>';
- $return .= '<dd>';
+ if (!$extension->isBundled() && $extension->getCompatibleVersions()) {
+ $html .= '<dt>'.$this->getLang('compatible').'</dt>';
+ $html .= '<dd>';
foreach ($extension->getCompatibleVersions() as $date => $version) {
- $return .= '<bdi>'.$version['label'].' ('.$date.')</bdi>, ';
+ $html .= '<bdi>'.$version['label'].' ('.$date.')</bdi>, ';
}
- $return = rtrim($return, ', ');
- $return .= '</dd>';
+ $html = rtrim($html, ', ');
+ $html .= '</dd>';
}
- if($extension->getDependencies()) {
- $return .= '<dt>'.$this->getLang('depends').'</dt>';
- $return .= '<dd>';
- $return .= $this->make_linklist($extension->getDependencies());
- $return .= '</dd>';
+ if ($extension->getDependencies()) {
+ $html .= '<dt>'.$this->getLang('depends').'</dt>';
+ $html .= '<dd>';
+ $html .= $this->makeLinkList($extension->getDependencies());
+ $html .= '</dd>';
}
- if($extension->getSimilarExtensions()) {
- $return .= '<dt>'.$this->getLang('similar').'</dt>';
- $return .= '<dd>';
- $return .= $this->make_linklist($extension->getSimilarExtensions());
- $return .= '</dd>';
+ if ($extension->getSimilarExtensions()) {
+ $html .= '<dt>'.$this->getLang('similar').'</dt>';
+ $html .= '<dd>';
+ $html .= $this->makeLinkList($extension->getSimilarExtensions());
+ $html .= '</dd>';
}
- if($extension->getConflicts()) {
- $return .= '<dt>'.$this->getLang('conflicts').'</dt>';
- $return .= '<dd>';
- $return .= $this->make_linklist($extension->getConflicts());
- $return .= '</dd>';
+ if ($extension->getConflicts()) {
+ $html .= '<dt>'.$this->getLang('conflicts').'</dt>';
+ $html .= '<dd>';
+ $html .= $this->makeLinkList($extension->getConflicts());
+ $html .= '</dd>';
}
- $return .= '</dl>'.DOKU_LF;
- return $return;
+ $html .= '</dl>'.DOKU_LF;
+ return $html;
}
/**
@@ -446,12 +539,15 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param array $ext The extensions
* @return string The HTML code
*/
- function make_linklist($ext) {
- $return = '';
+ public function makeLinkList($ext)
+ {
+ $html = '';
foreach ($ext as $link) {
- $return .= '<bdi><a href="'.$this->gui->tabURL('search', array('q'=>'ext:'.$link)).'">'.hsc($link).'</a></bdi>, ';
+ $html .= '<bdi><a href="'.
+ $this->gui->tabURL('search', array('q'=>'ext:'.$link)).'">'.
+ hsc($link).'</a></bdi>, ';
}
- return rtrim($return, ', ');
+ return rtrim($html, ', ');
}
/**
@@ -460,59 +556,64 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param helper_plugin_extension_extension $extension The extension
* @return string The HTML code
*/
- function make_actions(helper_plugin_extension_extension $extension) {
+ public function makeActions(helper_plugin_extension_extension $extension)
+ {
global $conf;
- $return = '';
+ $html = '';
$errors = '';
if ($extension->isInstalled()) {
if (($canmod = $extension->canModify()) === true) {
if (!$extension->isProtected()) {
- $return .= $this->make_action('uninstall', $extension);
+ $html .= $this->makeAction('uninstall', $extension);
}
if ($extension->getDownloadURL()) {
if ($extension->updateAvailable()) {
- $return .= $this->make_action('update', $extension);
+ $html .= $this->makeAction('update', $extension);
} else {
- $return .= $this->make_action('reinstall', $extension);
+ $html .= $this->makeAction('reinstall', $extension);
}
}
- }else{
+ } else {
$errors .= '<p class="permerror">'.$this->getLang($canmod).'</p>';
}
if (!$extension->isProtected() && !$extension->isTemplate()) { // no enable/disable for templates
if ($extension->isEnabled()) {
- $return .= $this->make_action('disable', $extension);
+ $html .= $this->makeAction('disable', $extension);
} else {
- $return .= $this->make_action('enable', $extension);
+ $html .= $this->makeAction('enable', $extension);
}
}
- if ($extension->isGitControlled()){
+ if ($extension->isGitControlled()) {
$errors .= '<p class="permerror">'.$this->getLang('git').'</p>';
}
- if ($extension->isEnabled() && in_array('Auth', $extension->getTypes()) && $conf['authtype'] != $extension->getID()) {
+ if ($extension->isEnabled() &&
+ in_array('Auth', $extension->getTypes()) &&
+ $conf['authtype'] != $extension->getID()
+ ) {
$errors .= '<p class="permerror">'.$this->getLang('auth').'</p>';
}
-
- }else{
+ } else {
if (($canmod = $extension->canModify()) === true) {
if ($extension->getDownloadURL()) {
- $return .= $this->make_action('install', $extension);
+ $html .= $this->makeAction('install', $extension);
}
- }else{
+ } else {
$errors .= '<div class="permerror">'.$this->getLang($canmod).'</div>';
}
}
if (!$extension->isInstalled() && $extension->getDownloadURL()) {
- $return .= ' <span class="version">'.$this->getLang('available_version').' ';
- $return .= ($extension->getLastUpdate() ? hsc($extension->getLastUpdate()) : $this->getLang('unknown')).'</span>';
+ $html .= ' <span class="version">'.$this->getLang('available_version').' ';
+ $html .= ($extension->getLastUpdate()
+ ? hsc($extension->getLastUpdate())
+ : $this->getLang('unknown')).'</span>';
}
- return $return.' '.$errors.DOKU_LF;
+ return $html.' '.$errors.DOKU_LF;
}
/**
@@ -522,7 +623,8 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param helper_plugin_extension_extension $extension The extension
* @return string The HTML code
*/
- function make_action($action, $extension) {
+ public function makeAction($action, $extension)
+ {
$title = '';
switch ($action) {
@@ -535,7 +637,9 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
$classes = 'button '.$action;
$name = 'fn['.$action.']['.hsc($extension->getID()).']';
- return '<button class="'.$classes.'" name="'.$name.'" type="submit" '.$title.'>'.$this->getLang('btn_'.$action).'</button> ';
+ $html = '<button class="'.$classes.'" name="'.$name.'" type="submit" '.$title.'>'.
+ $this->getLang('btn_'.$action).'</button> ';
+ return $html;
}
/**
@@ -544,24 +648,27 @@ class helper_plugin_extension_list extends DokuWiki_Plugin {
* @param helper_plugin_extension_extension $extension The extension
* @return string The description of all relevant statusses
*/
- function make_status(helper_plugin_extension_extension $extension) {
+ public function makeStatus(helper_plugin_extension_extension $extension)
+ {
$status = array();
-
if ($extension->isInstalled()) {
$status[] = $this->getLang('status_installed');
if ($extension->isProtected()) {
$status[] = $this->getLang('status_protected');
} else {
- $status[] = $extension->isEnabled() ? $this->getLang('status_enabled') : $this->getLang('status_disabled');
+ $status[] = $extension->isEnabled()
+ ? $this->getLang('status_enabled')
+ : $this->getLang('status_disabled');
}
} else {
$status[] = $this->getLang('status_not_installed');
}
- if(!$extension->canModify()) $status[] = $this->getLang('status_unmodifiable');
- if($extension->isBundled()) $status[] = $this->getLang('status_bundled');
- $status[] = $extension->isTemplate() ? $this->getLang('status_template') : $this->getLang('status_plugin');
- return join(', ', $status);
+ if (!$extension->canModify()) $status[] = $this->getLang('status_unmodifiable');
+ if ($extension->isBundled()) $status[] = $this->getLang('status_bundled');
+ $status[] = $extension->isTemplate()
+ ? $this->getLang('status_template')
+ : $this->getLang('status_plugin');
+ return implode(', ', $status);
}
-
}
diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php
index 5dc2707cf..712baa05c 100644
--- a/lib/plugins/extension/helper/repository.php
+++ b/lib/plugins/extension/helper/repository.php
@@ -6,34 +6,39 @@
* @author Michael Hamann <michael@content-space.de>
*/
-#define('EXTENSION_REPOSITORY_API', 'http://localhost/dokuwiki/lib/plugins/pluginrepo/api.php');
-
-if (!defined('EXTENSION_REPOSITORY_API_ENDPOINT'))
- define('EXTENSION_REPOSITORY_API', 'http://www.dokuwiki.org/lib/plugins/pluginrepo/api.php');
-
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
+use dokuwiki\Cache\Cache;
+use dokuwiki\HTTP\DokuHTTPClient;
+use dokuwiki\Extension\PluginController;
/**
* Class helper_plugin_extension_repository provides access to the extension repository on dokuwiki.org
*/
-class helper_plugin_extension_repository extends DokuWiki_Plugin {
+class helper_plugin_extension_repository extends DokuWiki_Plugin
+{
+
+ const EXTENSION_REPOSITORY_API = 'http://www.dokuwiki.org/lib/plugins/pluginrepo/api.php';
+
private $loaded_extensions = array();
private $has_access = null;
+
/**
* Initialize the repository (cache), fetches data for all installed plugins
*/
- public function init() {
- /* @var Doku_Plugin_Controller $plugin_controller */
+ public function init()
+ {
+ /* @var PluginController $plugin_controller */
global $plugin_controller;
if ($this->hasAccess()) {
$list = $plugin_controller->getList('', true);
$request_data = array('fmt' => 'php');
$request_needed = false;
foreach ($list as $name) {
- $cache = new cache('##extension_manager##'.$name, '.repo');
+ $cache = new Cache('##extension_manager##'.$name, '.repo');
- if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) {
+ if (!isset($this->loaded_extensions[$name]) &&
+ $this->hasAccess() &&
+ !$cache->useCache(array('age' => 3600 * 24))
+ ) {
$this->loaded_extensions[$name] = true;
$request_data['ext'][] = $name;
$request_needed = true;
@@ -42,11 +47,11 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin {
if ($request_needed) {
$httpclient = new DokuHTTPClient();
- $data = $httpclient->post(EXTENSION_REPOSITORY_API, $request_data);
+ $data = $httpclient->post(self::EXTENSION_REPOSITORY_API, $request_data);
if ($data !== false) {
$extensions = unserialize($data);
foreach ($extensions as $extension) {
- $cache = new cache('##extension_manager##'.$extension['plugin'], '.repo');
+ $cache = new Cache('##extension_manager##'.$extension['plugin'], '.repo');
$cache->storeCache(serialize($extension));
}
} else {
@@ -59,16 +64,17 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin {
/**
* If repository access is available
*
+ * @param bool $usecache use cached result if still valid
* @return bool If repository access is available
*/
- public function hasAccess() {
+ public function hasAccess($usecache = true) {
if ($this->has_access === null) {
- $cache = new cache('##extension_manager###hasAccess', '.repo');
+ $cache = new Cache('##extension_manager###hasAccess', '.repo');
- if (!$cache->useCache(array('age' => 3600 * 24, 'purge'=>1))) {
+ if (!$cache->useCache(array('age' => 60*10, 'purge' => !$usecache))) {
$httpclient = new DokuHTTPClient();
$httpclient->timeout = 5;
- $data = $httpclient->get(EXTENSION_REPOSITORY_API.'?cmd=ping');
+ $data = $httpclient->get(self::EXTENSION_REPOSITORY_API.'?cmd=ping');
if ($data !== false) {
$this->has_access = true;
$cache->storeCache(1);
@@ -89,13 +95,17 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin {
* @param string $name The plugin name to get the data for, template names need to be prefix by 'template:'
* @return array The data or null if nothing was found (possibly no repository access)
*/
- public function getData($name) {
- $cache = new cache('##extension_manager##'.$name, '.repo');
-
- if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) {
+ public function getData($name)
+ {
+ $cache = new Cache('##extension_manager##'.$name, '.repo');
+
+ if (!isset($this->loaded_extensions[$name]) &&
+ $this->hasAccess() &&
+ !$cache->useCache(array('age' => 3600 * 24))
+ ) {
$this->loaded_extensions[$name] = true;
$httpclient = new DokuHTTPClient();
- $data = $httpclient->get(EXTENSION_REPOSITORY_API.'?fmt=php&ext[]='.urlencode($name));
+ $data = $httpclient->get(self::EXTENSION_REPOSITORY_API.'?fmt=php&ext[]='.urlencode($name));
if ($data !== false) {
$result = unserialize($data);
$cache->storeCache(serialize($result[0]));
@@ -116,21 +126,22 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin {
* @param string $q the query string
* @return array a list of matching extensions
*/
- public function search($q){
- $query = $this->parse_query($q);
+ public function search($q)
+ {
+ $query = $this->parseQuery($q);
$query['fmt'] = 'php';
$httpclient = new DokuHTTPClient();
- $data = $httpclient->post(EXTENSION_REPOSITORY_API, $query);
+ $data = $httpclient->post(self::EXTENSION_REPOSITORY_API, $query);
if ($data === false) return array();
$result = unserialize($data);
$ids = array();
// store cache info for each extension
- foreach($result as $ext){
+ foreach ($result as $ext) {
$name = $ext['plugin'];
- $cache = new cache('##extension_manager##'.$name, '.repo');
+ $cache = new Cache('##extension_manager##'.$name, '.repo');
$cache->storeCache(serialize($ext));
$ids[] = $name;
}
@@ -144,7 +155,8 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin {
* @param string $q
* @return array
*/
- protected function parse_query($q){
+ protected function parseQuery($q)
+ {
$parameters = array(
'tag' => array(),
'mail' => array(),
@@ -153,29 +165,29 @@ class helper_plugin_extension_repository extends DokuWiki_Plugin {
);
// extract tags
- if(preg_match_all('/(^|\s)(tag:([\S]+))/', $q, $matches, PREG_SET_ORDER)){
- foreach($matches as $m){
+ if (preg_match_all('/(^|\s)(tag:([\S]+))/', $q, $matches, PREG_SET_ORDER)) {
+ foreach ($matches as $m) {
$q = str_replace($m[2], '', $q);
$parameters['tag'][] = $m[3];
}
}
// extract author ids
- if(preg_match_all('/(^|\s)(authorid:([\S]+))/', $q, $matches, PREG_SET_ORDER)){
- foreach($matches as $m){
+ if (preg_match_all('/(^|\s)(authorid:([\S]+))/', $q, $matches, PREG_SET_ORDER)) {
+ foreach ($matches as $m) {
$q = str_replace($m[2], '', $q);
$parameters['mail'][] = $m[3];
}
}
// extract extensions
- if(preg_match_all('/(^|\s)(ext:([\S]+))/', $q, $matches, PREG_SET_ORDER)){
- foreach($matches as $m){
+ if (preg_match_all('/(^|\s)(ext:([\S]+))/', $q, $matches, PREG_SET_ORDER)) {
+ foreach ($matches as $m) {
$q = str_replace($m[2], '', $q);
$parameters['ext'][] = $m[3];
}
}
// extract types
- if(preg_match_all('/(^|\s)(type:([\S]+))/', $q, $matches, PREG_SET_ORDER)){
- foreach($matches as $m){
+ if (preg_match_all('/(^|\s)(type:([\S]+))/', $q, $matches, PREG_SET_ORDER)) {
+ foreach ($matches as $m) {
$q = str_replace($m[2], '', $q);
$parameters['type'][] = $m[3];
}
diff --git a/lib/plugins/extension/lang/bg/intro_search.txt b/lib/plugins/extension/lang/bg/intro_search.txt
index cec4cd243..f41c8c6df 100644
--- a/lib/plugins/extension/lang/bg/intro_search.txt
+++ b/lib/plugins/extension/lang/bg/intro_search.txt
@@ -1 +1 @@
-От тук имате достъп до всички налични приставки и шаблони за DokuWiki, които са дело на трети лица. Имайте предвид, че кодът им е потенциален **риск за сигурността на сървъра**! Повече по темата можете да прочетете в [[doku>security#plugin_security|plugin security]] first. \ No newline at end of file
+От тук имате достъп до всички налични [[doku>plugins|приставки]] и [[doku>template|шаблони]] за DokuWiki, които са дело на трети лица. Имайте предвид, че кодът им е потенциален **риск за сигурността на сървъра**! Повече по темата можете да прочетете в [[doku>security#plugin_security|plugin security]] first.
diff --git a/lib/plugins/extension/lang/bg/lang.php b/lib/plugins/extension/lang/bg/lang.php
index dda69a4b9..69ec260ef 100644
--- a/lib/plugins/extension/lang/bg/lang.php
+++ b/lib/plugins/extension/lang/bg/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Kiril <neohidra@gmail.com>
*/
$lang['menu'] = 'Диспечер на приставки';
diff --git a/lib/plugins/extension/lang/ca/lang.php b/lib/plugins/extension/lang/ca/lang.php
new file mode 100644
index 000000000..76fe584e8
--- /dev/null
+++ b/lib/plugins/extension/lang/ca/lang.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Adolfo Jayme Barrientos <fito@libreoffice.org>
+ */
+$lang['menu'] = 'Gestor d’extensions';
+$lang['tab_plugins'] = 'Connectors instal·lats';
+$lang['tab_templates'] = 'Plantilles instal·lades';
+$lang['tab_search'] = 'Cerca i instal·la';
+$lang['tab_install'] = 'Instal·lació manual';
+$lang['notimplemented'] = 'Encara no s’ha implementat aquesta prestació';
+$lang['notinstalled'] = 'No s’ha instal·lat aquesta extensió';
+$lang['alreadyenabled'] = 'Ja s’ha activat aquesta extensió';
+$lang['alreadydisabled'] = 'Ja s’ha desactivat aquesta extensió';
+$lang['pluginlistsaveerror'] = 'S’ha produït un error en desar la llista de connectors';
+$lang['unknownauthor'] = 'Autor desconegut';
+$lang['unknownversion'] = 'Versió desconeguda';
+$lang['btn_info'] = 'Mostra’n més informació';
+$lang['btn_update'] = 'Actualitza';
+$lang['btn_uninstall'] = 'Desinstal·la';
+$lang['btn_enable'] = 'Activa';
+$lang['btn_disable'] = 'Desactiva';
+$lang['btn_install'] = 'Instal·la';
+$lang['btn_reinstall'] = 'Reinstal·la';
+$lang['js']['reallydel'] = 'Esteu segur que voleu desinstal·lar aquesta extensió?';
+$lang['js']['display_viewoptions'] = 'Opcions de visualització:';
+$lang['js']['display_enabled'] = 'activat';
+$lang['js']['display_disabled'] = 'desactivat';
+$lang['js']['display_updatable'] = 'actualitzable';
+$lang['search_for'] = 'Cerca l’extensió:';
+$lang['search'] = 'Cerca';
+$lang['extensionby'] = '<strong>%s</strong> de %s';
+$lang['screenshot'] = 'Captura de pantalla de %s';
+$lang['popularity'] = 'Popularitat: %s %%';
+$lang['homepage_link'] = 'Documentació';
+$lang['bugs_features'] = 'Problemes';
+$lang['tags'] = 'Etiquetes:';
+$lang['author_hint'] = 'Cerca extensions d’aquest autor';
+$lang['installed'] = 'Instal·lat:';
+$lang['downloadurl'] = 'URL de baixada:';
+$lang['repository'] = 'Repositori:';
+$lang['unknown'] = '<em>desconegut</em>';
+$lang['installed_version'] = 'Versió instal·lada:';
+$lang['install_date'] = 'La darrera actualització:';
+$lang['available_version'] = 'Versió disponible:';
+$lang['compatible'] = 'Compatible amb:';
+$lang['depends'] = 'Depèn de:';
+$lang['similar'] = 'Semblant a:';
+$lang['conflicts'] = 'Entra en conflicte amb:';
+$lang['donate'] = 'Us agrada això?';
+$lang['donate_action'] = 'Compreu un cafè a l’autor!';
+$lang['repo_retry'] = 'Torna a provar';
+$lang['provides'] = 'Proporciona:';
+$lang['status'] = 'Estat:';
+$lang['status_installed'] = 'instal·lat';
+$lang['status_not_installed'] = 'no instal·lat';
+$lang['status_protected'] = 'protegit';
+$lang['status_enabled'] = 'activat';
+$lang['status_disabled'] = 'desactivat';
+$lang['status_unmodifiable'] = 'immodificable';
+$lang['status_plugin'] = 'connector';
+$lang['status_template'] = 'plantilla';
+$lang['msg_delete_failed'] = 'Ha fallat la desinstal·lació de l’extensió %s';
+$lang['msg_upload_failed'] = 'Ha fallat l’actualització del fitxer';
+$lang['security_issue'] = '<strong>Problema de seguretat:</strong> %s ';
+$lang['security_warning'] = '<strong>Avís de seguretat:</strong> %s';
+$lang['wrong_folder'] = '<strong>El connector s’ha instal·lat incorrectament:</strong> canvieu el nom del directori del connector «%s» a «%s». ';
+$lang['url_change'] = '<strong>L’URL ha canviat:</strong> l’URL de baixada ha canviat des de la darrera baixada. Reviseu que l’URL nou sigui vàlid abans d’actualitzar l’extensió.<br />Nou: %s<br />Anterior: %s ';
+$lang['error_badurl'] = 'Els URL han de començar per http o https';
+$lang['error_download'] = 'No es pot baixar el fitxer: %s';
+$lang['install_url'] = 'Instal·la a partir d’un URL:';
diff --git a/lib/plugins/extension/lang/cs/intro_search.txt b/lib/plugins/extension/lang/cs/intro_search.txt
index 4258ac4f2..b1659a577 100644
--- a/lib/plugins/extension/lang/cs/intro_search.txt
+++ b/lib/plugins/extension/lang/cs/intro_search.txt
@@ -1 +1 @@
-Tato záložka poskytuje náhled na všechny dostupné moduly a šablony třetích stran pro DokuWiki. Jejich instalací se múžete vystavit **bezpečnostním rizikům** o kterých se můžete více dočíst v oddíle [[doku>security#plugin_security|plugin security]]. \ No newline at end of file
+Tato záložka poskytuje náhled na všechny dostupné [[doku>plugins|moduly]] a [[doku>cs:template|šablony]] třetích stran pro DokuWiki. Jejich instalací se múžete vystavit **bezpečnostním rizikům** o kterých se můžete více dočíst v oddíle [[doku>security#plugin_security|plugin security]].
diff --git a/lib/plugins/extension/lang/cy/intro_search.txt b/lib/plugins/extension/lang/cy/intro_search.txt
index 8aef96039..d60f70fff 100644
--- a/lib/plugins/extension/lang/cy/intro_search.txt
+++ b/lib/plugins/extension/lang/cy/intro_search.txt
@@ -1 +1 @@
-Mae'r tab hwn yn rhoi mynediad i bob ategyn a thempled 3ydd parti ar gael ar gyfer DokuWiki. Sylwch fod arsefydlu cod 3ydd parti yn achosi **risg diogelwch**. Efallai hoffech chi ddarllen mwy ar [[doku>security#plugin_security|ddiogelwch ategion]] yn gyntaf. \ No newline at end of file
+Mae'r tab hwn yn rhoi mynediad i bob [[doku>plugins|ategyn]] a [[doku>template|thempled]] 3ydd parti ar gael ar gyfer DokuWiki. Sylwch fod arsefydlu cod 3ydd parti yn achosi **risg diogelwch**. Efallai hoffech chi ddarllen mwy ar [[doku>security#plugin_security|ddiogelwch ategion]] yn gyntaf.
diff --git a/lib/plugins/extension/lang/da/intro_install.txt b/lib/plugins/extension/lang/da/intro_install.txt
index e5657f218..b686f3fb6 100644
--- a/lib/plugins/extension/lang/da/intro_install.txt
+++ b/lib/plugins/extension/lang/da/intro_install.txt
@@ -1 +1 @@
-Her kan du installerer plugins eller templates manuelt, ved enten at uploade dem eller angive en direkte URL til download. \ No newline at end of file
+Her kan du installerer udvidelser eller temaer manuelt, ved enten at uploade dem eller angive en direkte URL til download. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/da/intro_plugins.txt b/lib/plugins/extension/lang/da/intro_plugins.txt
index 5d9deaf1e..1c4e7877a 100644
--- a/lib/plugins/extension/lang/da/intro_plugins.txt
+++ b/lib/plugins/extension/lang/da/intro_plugins.txt
@@ -1 +1 @@
-Dette er de plugins du aktuelt har installeret i din DokuWiki. Du kan aktivere, deaktiver eller fjerne plugins fra denne side. Opdateringer til plugins vises også her - husk at læse dokumentationen til et plugin inden du opdaterer det. \ No newline at end of file
+Dette er de udvidelser du aktuelt har installeret i din DokuWiki. Du kan aktivere, deaktive eller fjerne udvidelser fra denne side. Opdateringer til udvidelser vises også her - husk at læse dokumentationen til en udvidelse inden du opdaterer den. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/da/intro_search.txt b/lib/plugins/extension/lang/da/intro_search.txt
new file mode 100644
index 000000000..11caf32f7
--- /dev/null
+++ b/lib/plugins/extension/lang/da/intro_search.txt
@@ -0,0 +1 @@
+Denne fane giver dig adgang til alle tredje-parts [[doku>plugins|udvidelser]] og [[doku>template|temaer]] til DokuWiki. Vær opmærksom på at installation af tredje-parts kode kan være en **sikkerhedsrisiko**. Overvej at læse dokumentation af [[doku>security#plugin_security|sikkerhed vedr. udvidelser]] først. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/da/intro_templates.txt b/lib/plugins/extension/lang/da/intro_templates.txt
index 1914500b1..fb1868b1d 100644
--- a/lib/plugins/extension/lang/da/intro_templates.txt
+++ b/lib/plugins/extension/lang/da/intro_templates.txt
@@ -1 +1 @@
-Dette er de templates du aktuelt har installeret i din DokuWiki. Du kan vælge det template du vil benytte under [[?do=admin&page=config|Opsætningsstyring]]. \ No newline at end of file
+Dette er de temaer du aktuelt har installeret i din DokuWiki. Du kan vælge det tema du vil benytte under [[?do=admin&page=config|Opsætningsstyring]]. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/da/lang.php b/lib/plugins/extension/lang/da/lang.php
index 5d31357ca..83a0223b6 100644
--- a/lib/plugins/extension/lang/da/lang.php
+++ b/lib/plugins/extension/lang/da/lang.php
@@ -3,15 +3,20 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jacob Palm <jacobpalmdk@icloud.com>
* @author Søren Birk <soer9648@eucl.dk>
- * @author Jacob Palm <mail@jacobpalm.dk>
*/
-$lang['tab_plugins'] = 'Installerede plugins';
-$lang['tab_templates'] = 'Installerede templates';
+$lang['menu'] = 'Udvidelseshåndtering';
+$lang['tab_plugins'] = 'Installerede udvidelser';
+$lang['tab_templates'] = 'Installerede temaer';
$lang['tab_search'] = 'Søg og installer';
$lang['tab_install'] = 'Manuel installation';
$lang['notimplemented'] = 'Denne funktion er ikke implementeret endnu';
-$lang['unknownauthor'] = 'Ukendt udgiver';
+$lang['notinstalled'] = 'Denne udvidelse er ikke installeret';
+$lang['alreadyenabled'] = 'Denne udvidelse er allerede aktiveret';
+$lang['alreadydisabled'] = 'Denne udvidelse er allerede deaktiveret';
+$lang['pluginlistsaveerror'] = 'Der opstod en fejl under opdatering af udvidelseslisten';
+$lang['unknownauthor'] = 'Ukendt udvikler';
$lang['unknownversion'] = 'Ukendt version';
$lang['btn_info'] = 'Vis mere information';
$lang['btn_update'] = 'Opdater';
@@ -21,6 +26,10 @@ $lang['btn_disable'] = 'Deaktiver';
$lang['btn_install'] = 'Installer';
$lang['btn_reinstall'] = 'Geninstaller';
$lang['js']['reallydel'] = 'Er du sikker på at du vil afinstallere denne udvidelse?';
+$lang['js']['display_viewoptions'] = 'Visningsindstillinger:';
+$lang['js']['display_enabled'] = 'aktiveret';
+$lang['js']['display_disabled'] = 'deaktiveret';
+$lang['js']['display_updatable'] = 'kan opdateres';
$lang['search_for'] = 'Søg efter udvidelse:';
$lang['search'] = 'Søg';
$lang['extensionby'] = '<strong>%s</strong> af %s';
@@ -29,9 +38,10 @@ $lang['popularity'] = 'Popularitet: %s%%';
$lang['homepage_link'] = 'Dokumenter';
$lang['bugs_features'] = 'Fejl';
$lang['tags'] = 'Tags:';
-$lang['author_hint'] = 'Søg efter udvidelse af denne udgiver';
+$lang['author_hint'] = 'Søg efter udvidelser udgivet af denne udvikler';
$lang['installed'] = 'Installeret:';
$lang['downloadurl'] = 'Download URL:';
+$lang['repository'] = 'Arkiv:';
$lang['unknown'] = '<em>ukendt</em>';
$lang['installed_version'] = 'Installeret version:';
$lang['install_date'] = 'Din sidste opdatering:';
@@ -39,9 +49,11 @@ $lang['available_version'] = 'Tilgængelig version:';
$lang['compatible'] = 'Kompatibel med:';
$lang['depends'] = 'Afhængig af:';
$lang['similar'] = 'Ligner:';
+$lang['conflicts'] = 'Konflikter med:';
$lang['donate'] = 'Synes du om denne?';
$lang['donate_action'] = 'Køb en kop kaffe til udvikleren!';
$lang['repo_retry'] = 'Førsøg igen';
+$lang['provides'] = 'Giver:';
$lang['status'] = 'Status:';
$lang['status_installed'] = 'installeret';
$lang['status_not_installed'] = 'ikke installeret';
@@ -49,32 +61,37 @@ $lang['status_protected'] = 'beskyttet';
$lang['status_enabled'] = 'aktiveret';
$lang['status_disabled'] = 'deaktiveret';
$lang['status_unmodifiable'] = 'låst for ændringer';
-$lang['status_plugin'] = 'plugin';
-$lang['status_template'] = 'template';
-$lang['msg_enabled'] = 'Plugin %s aktiveret';
-$lang['msg_disabled'] = 'Plugin %s deaktiveret';
-$lang['msg_delete_success'] = 'Udvidelse %s afinstalleret';
+$lang['status_plugin'] = 'udvidelse';
+$lang['status_template'] = 'tema';
+$lang['status_bundled'] = 'inkluderet';
+$lang['msg_enabled'] = 'Udvidelsen %s aktiveret';
+$lang['msg_disabled'] = 'Udvidelsen %s deaktiveret';
+$lang['msg_delete_success'] = 'Udvidelsen %s afinstalleret';
$lang['msg_delete_failed'] = 'Kunne ikke afinstallere udvidelsen %s';
-$lang['msg_template_install_success'] = 'Template %s blev installeret';
-$lang['msg_template_update_success'] = 'Template %s blev opdateret';
-$lang['msg_plugin_install_success'] = 'Plugin %s blev installeret';
-$lang['msg_plugin_update_success'] = 'Plugin %s blev opdateret';
+$lang['msg_template_install_success'] = 'Temaet %s blev installeret';
+$lang['msg_template_update_success'] = 'Temaet %s blev opdateret';
+$lang['msg_plugin_install_success'] = 'Udvidelsen %s blev installeret';
+$lang['msg_plugin_update_success'] = 'Udvidelsen %s blev opdateret';
$lang['msg_upload_failed'] = 'Kunne ikke uploade filen';
+$lang['msg_nooverwrite'] = 'Udvidelsen %s findes allerede og overskrives ikke. For at overskrive, marker indstillingen for overskrivelse';
+$lang['missing_dependency'] = '<strong>Manglende eller deaktiveret afhængighed:</strong> %s';
+$lang['security_issue'] = '<strong>Sikkerhedsproblem:</strong> %s';
+$lang['security_warning'] = '<strong>Sikkerhedsadvarsel:</strong> %s';
$lang['update_available'] = '<strong>Opdatering:</strong> Ny version %s er tilgængelig.';
-$lang['wrong_folder'] = '<strong>Plugin ikke installeret korrekt:</strong> Omdøb plugin-mappe "%s" til "%s".';
+$lang['wrong_folder'] = '<strong>Udvidelse ikke installeret korrekt:</strong> Omdøb udvidelses-mappe "%s" til "%s".';
$lang['url_change'] = '<strong>URL ændret:</strong> Download-URL er blevet ændret siden sidste download. Kontrollér om den nye URL er valid, inden udvidelsen opdateres.<br />Ny: %s<br />Gammel: %s';
$lang['error_badurl'] = 'URL\'er skal starte med http eller https';
$lang['error_dircreate'] = 'Ikke i stand til at oprette midlertidig mappe til modtagelse af download';
$lang['error_download'] = 'Ikke i stand til at downloade filen: %s';
-$lang['error_decompress'] = 'Ikke i stand til at dekomprimere den downloadede fil. Dette kan være et resultat af en dårlig download, hvor du i så fald bør du prøve igen; eller komprimeringsformatet kan være ukendt, hvor du i så fald bliver nød til at downloade og installere manuelt.';
+$lang['error_decompress'] = 'Ikke i stand til at dekomprimere den downloadede fil. Dette kan være et resultat af en dårlig download (i så fald bør du prøve igen), eller komprimeringsformatet kan være ukendt - i så fald bliver nød til at downloade og installere manuelt.';
$lang['error_findfolder'] = 'Ikke i stand til at identificere udvidelsesmappe - du bliver nød til at downloade og installere manuelt.';
-$lang['error_copy'] = 'Der opstod en kopieringsfejl under installation af filer til mappen <em>%s</em>: disken kan være fuld, eller mangel på fil-tilladelser. Dette kan have resulteret i et delvist installeret plugin, og efterladt din wiki-installation ustabil.';
+$lang['error_copy'] = 'Der opstod en kopieringsfejl under installation af filer til mappen <em>%s</em>: disken kan være fuld, eller mangel på fil-tilladelser. Dette kan have resulteret i en delvist installeret udvidelse, hvilket kan gøre din wiki-installation ustabil.';
$lang['noperms'] = 'Udvidelsesmappe er ikke skrivbar';
-$lang['notplperms'] = 'Skabelonmappe er ikke skrivbar';
-$lang['nopluginperms'] = 'Pluginmappe er ikke skrivbar';
-$lang['git'] = 'Udvidelsen blev installeret via git - du vil muligvis ikke opdatere herfra.';
-$lang['auth'] = 'Auth-plugin er ikke aktiveret i konfigurationen - overvej at deaktivere den.';
+$lang['notplperms'] = 'Temamappe er ikke skrivbar';
+$lang['nopluginperms'] = 'Udvidelsesmappe er ikke skrivbar';
+$lang['git'] = 'Udvidelsen blev installeret via git - du bør muligvis ikke opdatere herfra.';
+$lang['auth'] = 'Auth-udvidelse er ikke aktiveret i konfigurationen - overvej at deaktivere den.';
$lang['install_url'] = 'Installér fra URL:';
-$lang['install_upload'] = 'Upload Udvidelse:';
-$lang['repo_error'] = 'Plugin-arkivet kunne ikke kontaktes. Kontrollér at din server kan kontakte www.dokuwiki.org kontrollér dine proxy-indstillinger.';
+$lang['install_upload'] = 'Upload udvidelse:';
+$lang['repo_error'] = 'Udvidelses-arkivet kunne ikke kontaktes. Kontrollér at din server kan kontakte www.dokuwiki.org kontrollér dine proxy-indstillinger.';
$lang['nossl'] = 'Din PHP lader til at mangle understøttelse for SSL. Mange DokuWiki udvidelser vil ikke kunne downloades.';
diff --git a/lib/plugins/extension/lang/de-informal/intro_plugins.txt b/lib/plugins/extension/lang/de-informal/intro_plugins.txt
index 13ba70519..b02041e3a 100644
--- a/lib/plugins/extension/lang/de-informal/intro_plugins.txt
+++ b/lib/plugins/extension/lang/de-informal/intro_plugins.txt
@@ -1 +1 @@
-Dies sind die Plugins, die bereits installiert sind. Du kannst sie hier an- oder abschalten oder sie komplett deinstallieren. Außerdem werden hier Updates zu den installiereten Plugins angezeigt. Bitte lies vor einem Update die zugehörige Dokumentation. \ No newline at end of file
+Dies sind die Plugins, die bereits installiert sind. Du kannst sie hier an- oder abschalten oder sie komplett deinstallieren. Außerdem werden hier Updates zu den installierten Plugins angezeigt. Bitte lies vor einem Update die zugehörige Dokumentation.
diff --git a/lib/plugins/extension/lang/de-informal/intro_search.txt b/lib/plugins/extension/lang/de-informal/intro_search.txt
index 9300f9edf..2c2191b64 100644
--- a/lib/plugins/extension/lang/de-informal/intro_search.txt
+++ b/lib/plugins/extension/lang/de-informal/intro_search.txt
@@ -1 +1 @@
-Dieser Tab gibt Dir Zugriff auf alle vorhandenen Plugins und Templates für DokuWiki. Bitte bedenke, dass jede installierte Erweiterung ein Sicherheitsrisiko darstellen kann. Du solltest vor einer Installation die [[doku>security#plugin_security|Plugin Security]] Informationen lesen. \ No newline at end of file
+Dieser Tab gibt Dir Zugriff auf alle vorhandenen [[doku>de:plugins|Plugins]] und [[doku>de:template|Templates]] für DokuWiki. Bitte bedenke, dass jede installierte Erweiterung ein Sicherheitsrisiko darstellen kann. Du solltest vor einer Installation die [[doku>security#plugin_security|Plugin Security]] Informationen lesen.
diff --git a/lib/plugins/extension/lang/de-informal/lang.php b/lib/plugins/extension/lang/de-informal/lang.php
index 4daec7f65..10401061e 100644
--- a/lib/plugins/extension/lang/de-informal/lang.php
+++ b/lib/plugins/extension/lang/de-informal/lang.php
@@ -77,19 +77,19 @@ $lang['security_issue'] = '<strong>Sicherheitsproblem:</strong> %s';
$lang['security_warning'] = '<strong>Sicherheitswarnung:</strong> %s';
$lang['update_available'] = '<strong>Update:</strong> Version %s steht zum Download bereit.';
$lang['wrong_folder'] = '<strong>Plugin wurde nicht korrekt installiert:</strong> Benenne das Plugin-Verzeichnis "%s" in "%s" um.';
-$lang['url_change'] = '<strong>URL geändert:</strong> Die Download URL wurde seit dem letzten Download geändert. Internetadresse vor Aktualisierung der Erweiterung auf Gültigkeit prüfen.<br />Neu: %s<br />Alt: %s';
+$lang['url_change'] = '<strong>URL geändert:</strong> Die Download-URL wurde seit dem letzten Download geändert. Internetadresse vor Aktualisierung der Erweiterung auf Gültigkeit prüfen.<br />Neu: %s<br />Alt: %s';
$lang['error_badurl'] = 'URLs sollten mit http oder https beginnen';
$lang['error_dircreate'] = 'Temporärer Ordner konnte nicht erstellt werden um Download zu abzuspeichern';
$lang['error_download'] = 'Download der Datei: %s nicht möglich.';
-$lang['error_decompress'] = 'Die heruntergeladene Datei konnte nicht entpackt werden. Dies kann die Folge eines fehlerhaften Downloads sein. In diesem Fall solltest du versuchen den Vorgang zu wiederholen. Es kann auch die Folge eines unbekannten Kompressionsformates sein, in diesem ​​Fall musst du die Datei selber herunterladen und manuell installieren.';
+$lang['error_decompress'] = 'Die heruntergeladene Datei konnte nicht entpackt werden. Dies kann die Folge eines fehlerhaften Downloads sein. In diesem Fall solltest du versuchen den Vorgang zu wiederholen. Es kann auch die Folge eines unbekannten Kompressionsformates sein, in diesem Fall musst du die Datei selber herunterladen und manuell installieren.';
$lang['error_findfolder'] = 'Das Erweiterungs-Verzeichnis konnte nicht identifiziert werden, lade die Datei herunter und installiere sie manuell.';
$lang['error_copy'] = 'Beim Versuch Dateien in den Ordner <em>%s</em>: zu installieren trat ein Kopierfehler auf. Die Dateizugriffsberechtigungen könnten falsch sein. Dies kann an einem unvollständig installierten Plugin liegen und beeinträchtigt somit die Stabilität deiner Wiki-Installation.';
$lang['noperms'] = 'Das Erweiterungs-Verzeichnis ist schreibgeschützt';
$lang['notplperms'] = 'Das Template-Verzeichnis ist schreibgeschützt';
$lang['nopluginperms'] = 'Das Plugin-Verzeichnis ist schreibgeschützt';
$lang['git'] = 'Diese Erweiterung wurde über git installiert und sollte daher nicht hier aktualisiert werden.';
-$lang['auth'] = 'Dieses Auth Plugin ist in der Konfiguration nicht aktiviert, Du solltest es deaktivieren.';
+$lang['auth'] = 'Dieses Auth-Plugin ist in der Konfiguration nicht aktiviert, Du solltest es deaktivieren.';
$lang['install_url'] = 'Von URL installieren:';
$lang['install_upload'] = 'Erweiterung hochladen:';
-$lang['repo_error'] = 'Es konnte keine Verbindung zum Plugin-Verzeichnis hergestellt werden. Stelle sicher dass der Server Verbindung mit www.dokuwiki.org aufnehmen darf und überprüfe deine Proxy-Einstellungen.';
-$lang['nossl'] = 'Deine PHP-Installation scheint SSL nicht zu unterstützen. Das Herunterladen vieler DokuWiki Erweiterungen wird scheitern.';
+$lang['repo_error'] = 'Es konnte keine Verbindung zum Plugin-Verzeichnis hergestellt werden. Stelle sicher, dass der Server Verbindung mit www.dokuwiki.org aufnehmen darf und überprüfe deine Proxy-Einstellungen.';
+$lang['nossl'] = 'Deine PHP-Installation scheint SSL nicht zu unterstützen. Das Herunterladen vieler DokuWiki-Erweiterungen wird scheitern.';
diff --git a/lib/plugins/extension/lang/de/intro_plugins.txt b/lib/plugins/extension/lang/de/intro_plugins.txt
index 1a1521050..5ea4cf12c 100644
--- a/lib/plugins/extension/lang/de/intro_plugins.txt
+++ b/lib/plugins/extension/lang/de/intro_plugins.txt
@@ -1 +1 @@
-Dies sind die Plugins, die bereits installiert sind. Sie können sie hier an- oder abschalten oder sie komplett deinstallieren. Außerdem werden hier Updates zu den installiereten Plugins angezeigt. Bitte lesen Sie vor einem Update die zugehörige Dokumentation. \ No newline at end of file
+Dies sind die Plugins, die bereits installiert sind. Sie können sie hier an- oder abschalten oder sie komplett deinstallieren. Außerdem werden hier Updates zu den installierten Plugins angezeigt. Bitte lesen Sie vor einem Update die zugehörige Dokumentation.
diff --git a/lib/plugins/extension/lang/de/intro_search.txt b/lib/plugins/extension/lang/de/intro_search.txt
index 366925b92..12b439d38 100644
--- a/lib/plugins/extension/lang/de/intro_search.txt
+++ b/lib/plugins/extension/lang/de/intro_search.txt
@@ -1 +1 @@
-Dieser Tab gibt Ihnen Zugriff auf alle vorhandenen Plugins und Templates für DokuWiki. Bitte bedenken Sie, dass jede installierte Erweiterung ein Sicherheitsrisiko darstellen kann. Sie sollten vor einer Installation die [[doku>security#plugin_security|Plugin Security]] Informationen lesen. \ No newline at end of file
+Dieser Tab gibt Ihnen Zugriff auf alle vorhandenen [[doku>de:plugins|Plugins]] und [[doku>de:template|Templates]] für DokuWiki. Bitte bedenken Sie, dass jede installierte Erweiterung ein Sicherheitsrisiko darstellen kann. Sie sollten vor einer Installation die [[doku>security#plugin_security|Plugin Security]] Informationen lesen.
diff --git a/lib/plugins/extension/lang/de/lang.php b/lib/plugins/extension/lang/de/lang.php
index 68ce0adb5..f2dd77cc4 100644
--- a/lib/plugins/extension/lang/de/lang.php
+++ b/lib/plugins/extension/lang/de/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Benjamin Molitor <bmolitor@uos.de>
* @author H. Richard <wanderer379@t-online.de>
* @author Joerg <scooter22@gmx.de>
* @author Simon <st103267@stud.uni-stuttgart.de>
@@ -46,7 +47,7 @@ $lang['bugs_features'] = 'Bugs';
$lang['tags'] = 'Schlagworte';
$lang['author_hint'] = 'Suche weitere Erweiterungen dieses Autors';
$lang['installed'] = 'Installiert:';
-$lang['downloadurl'] = 'URL zum Herunterladen:';
+$lang['downloadurl'] = 'Download-URL:';
$lang['repository'] = 'Quelle:';
$lang['unknown'] = '<em>unbekannt</em>';
$lang['installed_version'] = 'Installierte Version:';
@@ -84,19 +85,19 @@ $lang['security_issue'] = '<strong>Sicherheitsproblem:</strong> %s';
$lang['security_warning'] = '<strong>Sicherheitswarnung:</strong> %s';
$lang['update_available'] = '<strong>Update:</strong> Version %s steht zum Download bereit.';
$lang['wrong_folder'] = '<strong>Plugin wurde nicht korrekt installiert:</strong> Benennen Sie das Plugin-Verzeichnis "%s" in "%s" um.';
-$lang['url_change'] = '<strong>URL geändert:</strong> Die Download URL wurde seit dem letzten Download geändert. Internetadresse vor Aktualisierung der Erweiterung auf Gültigkeit prüfen.<br />Neu: %s<br />Alt: %s';
+$lang['url_change'] = '<strong>URL geändert:</strong> Die Download-URL wurde seit dem letzten Download geändert. Internetadresse vor Aktualisierung der Erweiterung auf Gültigkeit prüfen.<br />Neu: %s<br />Alt: %s';
$lang['error_badurl'] = 'URLs sollten mit http oder https beginnen';
$lang['error_dircreate'] = 'Temporärer Ordner konnte nicht erstellt werden, um Download zu abzuspeichern';
$lang['error_download'] = 'Download der Datei: %s nicht möglich.';
-$lang['error_decompress'] = 'Die heruntergeladene Datei konnte nicht entpackt werden. Dies kann die Folge eines fehlerhaften Downloads sein. In diesem Fall sollten Sie versuchen den Vorgang zu wiederholen. Es kann auch die Folge eines unbekannten Kompressionsformates sein, in diesem ​​Fall müssen Sie die Datei selber herunterladen und manuell installieren.';
+$lang['error_decompress'] = 'Die heruntergeladene Datei konnte nicht entpackt werden. Dies kann die Folge eines fehlerhaften Downloads sein. In diesem Fall sollten Sie versuchen den Vorgang zu wiederholen. Es kann auch die Folge eines unbekannten Kompressionsformates sein, in diesem Fall müssen Sie die Datei selber herunterladen und manuell installieren.';
$lang['error_findfolder'] = 'Das Erweiterungs-Verzeichnis konnte nicht identifiziert werden, laden und installieren Sie die Datei manuell.';
$lang['error_copy'] = 'Beim Versuch Dateien in den Ordner <em>%s</em>: zu installieren trat ein Kopierfehler auf. Die Dateizugriffsberechtigungen könnten falsch sein. Dies kann an einem unvollständig installierten Plugin liegen und beeinträchtigt somit die Stabilität Ihre Wiki-Installation.';
$lang['noperms'] = 'Das Erweiterungs-Verzeichnis ist schreibgeschützt';
$lang['notplperms'] = 'Das Template-Verzeichnis ist schreibgeschützt';
$lang['nopluginperms'] = 'Das Plugin-Verzeichnis ist schreibgeschützt';
$lang['git'] = 'Diese Erweiterung wurde über git installiert und sollte daher nicht hier aktualisiert werden.';
-$lang['auth'] = 'Dieses Auth Plugin ist in der Konfiguration nicht aktiviert, Sie sollten es deaktivieren.';
+$lang['auth'] = 'Dieses Auth-Plugin ist in der Konfiguration nicht aktiviert, Sie sollten es deaktivieren.';
$lang['install_url'] = 'Von Webadresse (URL) installieren';
$lang['install_upload'] = 'Erweiterung hochladen:';
-$lang['repo_error'] = 'Es konnte keine Verbindung zum Plugin-Verzeichnis hergestellt werden. Stellen sie sicher das der Server Verbindung mit www.dokuwiki.org aufnehmen darf und überprüfen sie ihre Proxy Einstellungen.';
-$lang['nossl'] = 'Ihr PHP scheint SSL nicht zu unterstützen. Das Herunterladen vieler DokuWiki Erweiterungen wird scheitern.';
+$lang['repo_error'] = 'Es konnte keine Verbindung zum Plugin-Verzeichnis hergestellt werden. Stellen Sie sicher, dass der Server Verbindung mit www.dokuwiki.org aufnehmen darf und überprüfen Sie ihre Proxy-Einstellungen.';
+$lang['nossl'] = 'Ihr PHP scheint SSL nicht zu unterstützen. Das Herunterladen vieler DokuWiki-Erweiterungen wird scheitern.';
diff --git a/lib/plugins/extension/lang/el/intro_install.txt b/lib/plugins/extension/lang/el/intro_install.txt
new file mode 100644
index 000000000..bdb342d8b
--- /dev/null
+++ b/lib/plugins/extension/lang/el/intro_install.txt
@@ -0,0 +1 @@
+Εδώ μπορείτε να φορτώσετε επιπρόσθετα με το χέρι και πρότυπα είτε με αποστολή από τον υπολογιστή ή με την παροχή ενός URLμε άμεσο κατέβασμα από τον υπολογιστή. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/el/intro_plugins.txt b/lib/plugins/extension/lang/el/intro_plugins.txt
new file mode 100644
index 000000000..189a27c4e
--- /dev/null
+++ b/lib/plugins/extension/lang/el/intro_plugins.txt
@@ -0,0 +1 @@
+Αυτά είναι το επιπρόσθετα που εισήχθηκαν τώρα στο DokuWiki. Μπορείτε να ενεργοποιήσετε ή απενεργοποιήσετε ή να ακυρώσετε την εγκατάσταση εδώ. Οι ενημερώσεις των επιπρόσθετων προβάλλονται εδώ επίσης, βεβαιωθείτε πως διαβάσατε τα σχετικά έγγραφα πριν την ενημέρωση. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/el/intro_search.txt b/lib/plugins/extension/lang/el/intro_search.txt
new file mode 100644
index 000000000..1fdbfe10e
--- /dev/null
+++ b/lib/plugins/extension/lang/el/intro_search.txt
@@ -0,0 +1 @@
+Πατώντας στο τόξο έχετε πρόσβαση σε στοιχεία τρίτων του [[doku>plugins|plugins]] and [[doku>template|templates]] DokuWiki. Παρακαλώ να γνωρίζετε ότι η εγκατάσταση κωδικού τρίτου μπορεί να θέσει θέμα **ρίσκου ασφάλειας**, για την οποία μπορεί να θέλετε να διαβάζετε πρώτα.you[[doku>security#plugin_security|plugin security]]
diff --git a/lib/plugins/extension/lang/el/intro_templates.txt b/lib/plugins/extension/lang/el/intro_templates.txt
new file mode 100644
index 000000000..d8d212ea2
--- /dev/null
+++ b/lib/plugins/extension/lang/el/intro_templates.txt
@@ -0,0 +1 @@
+Αυτά είναι τα πρότυπα που είναι τώρα εγκαταστημένα στο DokuWiki. σας. Μπορείτε να επιλέξετε αυτό που θα χρησιμοποιήσετε [[?do=admin&page=config|Configuration Manager]].
diff --git a/lib/plugins/extension/lang/el/lang.php b/lib/plugins/extension/lang/el/lang.php
new file mode 100644
index 000000000..cfbea5d0d
--- /dev/null
+++ b/lib/plugins/extension/lang/el/lang.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Katerina Katapodi <extragold1234@hotmail.com>
+ */
+$lang['menu'] = 'Κύρια Παράταση';
+$lang['tab_plugins'] = 'Εγκαταστημένα Επιπρόσθετα';
+$lang['tab_templates'] = 'Εγκατεστημένα μοντέλα';
+$lang['tab_search'] = 'Αναζήτηση και Εγκατάσταση';
+$lang['tab_install'] = 'Εγκατάσταση Χειροκίνητα';
+$lang['notimplemented'] = 'Αυτό το χαρακτηριστικό δεν έχει καθιερωθεί ακόμα';
+$lang['notinstalled'] = 'Αυτή η προέκταση δεν έχει εγκαταταθεί';
+$lang['alreadyenabled'] = 'Αυτή το επιπρόσθετο έχει ήδη ενεργοποιηθεί.';
+$lang['alreadydisabled'] = 'Το επιπρόσθετο έχει ήδη απενεργοποιηθεί.';
+$lang['pluginlistsaveerror'] = 'Υπήρξε σφάλμα κατά την αποθήκευση της λίστας επιπρόσθετων.';
+$lang['unknownauthor'] = 'Άγνωστος συγγραφέας ';
+$lang['unknownversion'] = 'Άγνωστη εκδοχή ';
+$lang['btn_info'] = 'Προβάλλετε περισσότερες πληροφορίες';
+$lang['btn_update'] = 'Ενημέρωση';
+$lang['btn_uninstall'] = 'Ακύρωση εγκατάστασης';
+$lang['btn_enable'] = 'Ενεργοποίηση';
+$lang['btn_disable'] = 'Απενεργοποίηση';
+$lang['btn_install'] = 'Ρύθμιση, εγκατάσταση';
+$lang['btn_reinstall'] = 'Εγκαταστήστε ξανά';
+$lang['js']['reallydel'] = 'Θέλετε οπωσδήποτε να ακυρώσετε αυτήν την προέκταση?';
+$lang['js']['display_viewoptions'] = 'Επιλογές:';
+$lang['js']['display_enabled'] = 'ενεργοποίηση';
+$lang['js']['display_disabled'] = 'απενεργοποίηση';
+$lang['js']['display_updatable'] = 'πρέπει να ενημερωθεί';
+$lang['search_for'] = 'Προέκταση Αναζήτησης';
+$lang['search'] = 'Αναζήτηση';
+$lang['extensionby'] = '<strong>%s</strong> από %s ';
+$lang['screenshot'] = 'Εικονίδιο %s ';
+$lang['popularity'] = 'Φήμη: %s%%';
+$lang['homepage_link'] = 'Έγγραφα ';
+$lang['bugs_features'] = 'Λάθη';
+$lang['tags'] = 'Tags ';
+$lang['author_hint'] = 'Αναζητήστε περαιτέρω από αυτόν τον συγγραφέα';
+$lang['installed'] = 'Εγκατάσταση:';
+$lang['downloadurl'] = 'Κατεβάστε URL:';
+$lang['repository'] = 'Χώρος αρχείων';
+$lang['unknown'] = '<em>άγνωστο</em> ';
+$lang['installed_version'] = 'Μορφή εγκατάστασης:';
+$lang['install_date'] = 'Η τελευταία σας ενημέρωση:';
+$lang['available_version'] = 'Διαθέσιμη μορφή;';
+$lang['compatible'] = 'Συμβατό με:';
+$lang['depends'] = 'Εξαρτάται από:';
+$lang['similar'] = 'Όμοιο με : ';
+$lang['conflicts'] = 'Αντιτίθεται στο:';
+$lang['donate'] = 'Έτσι? ';
+$lang['donate_action'] = 'Αγόρασε στον συγγραφέα έναν καφέ';
+$lang['repo_retry'] = 'Προσπαθήστε πάλι';
+$lang['provides'] = 'Παρέχει; ';
+$lang['status'] = 'Στάτους;';
+$lang['status_installed'] = 'εγκαταστημένο';
+$lang['status_not_installed'] = 'μη εγκαταστημένο';
+$lang['status_protected'] = 'προστατευμένο';
+$lang['status_enabled'] = 'ενεργοποιημένο';
+$lang['status_disabled'] = 'απενεργοποιημένο';
+$lang['status_unmodifiable'] = 'δεν μπορεί να τροποποιηθεί';
+$lang['status_plugin'] = 'επιπρόσθετο';
+$lang['status_template'] = 'μοντέλο';
+$lang['status_bundled'] = 'δεμένο';
+$lang['msg_enabled'] = 'Το επιπρόσθετο %s ενεργοποιήθηκε';
+$lang['msg_disabled'] = 'Το επιπρόσθετο %s απενεργοποιήθηκε';
+$lang['msg_delete_success'] = 'Η προέκταση %s δεν εγκαταστάθηκε ';
+$lang['msg_delete_failed'] = 'Η ακύρωση εγκατάστασης Προέκτασης %s απέτυχε';
+$lang['msg_template_install_success'] = 'Το μοντέλο %s εγκαταστάθηκε με επιτυχία ';
+$lang['msg_template_update_success'] = 'Το μοντέλο %s ενημερώθηκε με επιτυχία ';
+$lang['msg_plugin_install_success'] = 'Το επιπρόσθετο %s εγκαταστάθηκε με επιτυχία ';
+$lang['msg_plugin_update_success'] = 'Το επιπρόσθετο %s ενημερώθηκε με επιτυχία ';
+$lang['msg_upload_failed'] = 'Το ανέβασμα του φακέλλου απέτυχε';
+$lang['missing_dependency'] = '<strong>Ιδιότητα που λείπει ή απενεργοποιήθηκε:</strong> %s ';
+$lang['security_issue'] = '<strong>Δεν είναι ασφαλές:</strong> %s ';
+$lang['security_warning'] = '<strong>Προειδοποίηση Ασφάλειας:</strong> %s ';
+$lang['update_available'] = '<strong>Ενημέρωση:</strong> Η νέα εκδοχή %s είναι διαθέσιμη. ';
+$lang['wrong_folder'] = '<strong>Λάθος εγκατάσταση του επιπρόσθετου:</strong> Δώστε όνομα ξανά στην λίστα διευθύνσεων του επιπρόσθετου "%s" στο "%s". ';
+$lang['url_change'] = '<strong>URL άλλαξε:</strong> Ο τρόπος κατεβάσματος του URL έχει ανοίξει μια φορά από το πρώτο κατέβασμα. Ελέγξετε αν το νέο URL ισχύει πριν την ενημέρωση της επέκτασης. (επιπρόσθετου).<br />Καινούργιο: %s<br />Παλιό: %s ';
+$lang['error_badurl'] = 'Τα URLs πρέπει να αρχίζουν με http ή https ';
+$lang['error_dircreate'] = 'Δεν μπόρεσε να δημιουργήσει προσωρινό φάκελλο για να κατεβάσει αρχεία';
+$lang['error_download'] = 'Δεν μπόρεσε να κατεβάσει τον φάκελλο : %s';
+$lang['error_findfolder'] = 'Δεν μπόρεσε να εντοπίσει την λίστα διευθύνσεως επέκτασης, πρέπει να κατεβάσετε και εγκαταστήσετε χειροκίνητα';
+$lang['git'] = 'Αυτή η περαιτέρω ρύθμιση εγκαταστάθηκε μέσω git, μπορεί να μην θέλετε να την ανανεώσετε εδώ.';
+$lang['auth'] = 'Αυτό το αυθεντικό plugin(επιπρόσθετο) δεν έχει ενεργοποιηθεί κατά την διαμόρφωση, προσπαθήστε να το απενεργοποιήσετε. ';
+$lang['install_url'] = 'Εγκαταστήσετε από το URL:';
+$lang['install_upload'] = 'Ανεβάστε στον υπολογιστή την Προέκταση:';
+$lang['repo_error'] = 'Δεν μπόρεσε να υπάρξει πρόσβαση στον χώρο αποθήκευσης επιπρόσθετων. Βεβαιωθείτε πως ο διακομιστής σας μπορεί να επικοινωνήσει με το www.dokuwiki.org για να ελέγξετε τις σχετικές ρυθμίσεις.';
diff --git a/lib/plugins/extension/lang/en/intro_search.txt b/lib/plugins/extension/lang/en/intro_search.txt
index 244cd6812..81aa4314d 100644
--- a/lib/plugins/extension/lang/en/intro_search.txt
+++ b/lib/plugins/extension/lang/en/intro_search.txt
@@ -1 +1 @@
-This tab gives you access to all available 3rd party plugins and templates for DokuWiki. Please be aware that installing 3rd party code may pose a **security risk**, you may want to read about [[doku>security#plugin_security|plugin security]] first. \ No newline at end of file
+This tab gives you access to all available 3rd party [[doku>plugins|plugins]] and [[doku>template|templates]] for DokuWiki. Please be aware that installing 3rd party code may pose a **security risk**, you may want to read about [[doku>security#plugin_security|plugin security]] first.
diff --git a/lib/plugins/extension/lang/en/lang.php b/lib/plugins/extension/lang/en/lang.php
index 79f643629..f9753ae4d 100644
--- a/lib/plugins/extension/lang/en/lang.php
+++ b/lib/plugins/extension/lang/en/lang.php
@@ -76,6 +76,7 @@ $lang['msg_template_update_success'] = 'Template %s updated successfully';
$lang['msg_plugin_install_success'] = 'Plugin %s installed successfully';
$lang['msg_plugin_update_success'] = 'Plugin %s updated successfully';
$lang['msg_upload_failed'] = 'Uploading the file failed';
+$lang['msg_nooverwrite'] = 'Extension %s already exists so it is not being overwritten; to overwrite, tick the overwrite option';
$lang['missing_dependency'] = '<strong>Missing or disabled dependency:</strong> %s';
$lang['security_issue'] = '<strong>Security Issue:</strong> %s';
diff --git a/lib/plugins/extension/lang/eo/intro_search.txt b/lib/plugins/extension/lang/eo/intro_search.txt
index 5d194948c..c42096aa9 100644
--- a/lib/plugins/extension/lang/eo/intro_search.txt
+++ b/lib/plugins/extension/lang/eo/intro_search.txt
@@ -1 +1 @@
-Tiu tabelo donas aliron al ĉiuj haveblaj eksteraj kromaĵoj kaj ŝablonoj por DokuWiki. Bonvolu konscii, ke instali eksteran kodaĵon povas enkonduki **sekurecriskon**, prefere legu antaŭe pri [[doku>security#plugin_security|sekureco de kromaĵo]]. \ No newline at end of file
+Tiu tabelo donas aliron al ĉiuj haveblaj eksteraj [[doku>plugins|kromaĵoj]] kaj [[doku>template|ŝablonoj]] por DokuWiki. Bonvolu konscii, ke instali eksteran kodaĵon povas enkonduki **sekurecriskon**, prefere legu antaŭe pri [[doku>security#plugin_security|sekureco de kromaĵo]].
diff --git a/lib/plugins/extension/lang/es/intro_search.txt b/lib/plugins/extension/lang/es/intro_search.txt
index f59bb33df..0942262a6 100644
--- a/lib/plugins/extension/lang/es/intro_search.txt
+++ b/lib/plugins/extension/lang/es/intro_search.txt
@@ -1 +1 @@
-Esta pestaña te da acceso a todos los plugins de 3as partes disponibles y plantillas para DokuWiki. Tenga en cuenta que la instalación de código de terceras partes puede plantear un **riesgo de seguridad**, es posible que desee leer primero sobre [[doku>security#plugin_security|plugin security]]. \ No newline at end of file
+Esta pestaña te da acceso a todos los [[doku>es:plugins]] de 3as partes disponibles y [[doku>es:template|plantillas]] para DokuWiki. Tenga en cuenta que la instalación de código de terceras partes puede plantear un **riesgo de seguridad**, es posible que desee leer primero sobre [[doku>security#plugin_security|plugin security]].
diff --git a/lib/plugins/extension/lang/fa/intro_search.txt b/lib/plugins/extension/lang/fa/intro_search.txt
index 07fde76c1..f47b24262 100644
--- a/lib/plugins/extension/lang/fa/intro_search.txt
+++ b/lib/plugins/extension/lang/fa/intro_search.txt
@@ -1 +1 @@
-این شاخه به تمام افزونه‌ها و قالب‌های نسل سوم داکو ویکی دسترسی می‌دهد. لطفا دقت کنید که نصب کد نسل سوم یک **ریسک امنیتی** است برای همین بهتر است که ابتدا [[doku>security#plugin_security|امنیت افزونه]] را مطالعه نمایید. \ No newline at end of file
+این شاخه به تمام [[doku>plugins|افزونه‌ها]] و [[doku>template|قالب‌های]] نسل سوم داکو ویکی دسترسی می‌دهد. لطفا دقت کنید که نصب کد نسل سوم یک **ریسک امنیتی** است برای همین بهتر است که ابتدا [[doku>security#plugin_security|امنیت افزونه]] را مطالعه نمایید.
diff --git a/lib/plugins/extension/lang/fi/lang.php b/lib/plugins/extension/lang/fi/lang.php
index a154f2563..08052fe47 100644
--- a/lib/plugins/extension/lang/fi/lang.php
+++ b/lib/plugins/extension/lang/fi/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Jussi Takala <jussi.takala@live.fi>
*/
$lang['tab_plugins'] = 'Asennetut liitännäiset';
diff --git a/lib/plugins/extension/lang/fr/intro_search.txt b/lib/plugins/extension/lang/fr/intro_search.txt
index 418e35972..b51fb9570 100644
--- a/lib/plugins/extension/lang/fr/intro_search.txt
+++ b/lib/plugins/extension/lang/fr/intro_search.txt
@@ -1 +1 @@
-Cet onglet vous donne accès à toutes les extensions de tierces parties. Restez conscients qu'installer du code de tierce partie peut poser un problème de **sécurité**. Vous voudrez peut-être au préalable lire l'article sur la [[doku>fr:security##securite_des_plugins|sécurité des plugins]]. \ No newline at end of file
+Cet onglet vous donne accès à toutes les [[doku>fr:plugins|extensions]] et les [[doku>fr:template|thèmes]] de tierces parties. Restez conscients qu'installer du code de tierce partie peut poser un problème de **sécurité**. Vous voudrez peut-être au préalable lire l'article sur la [[doku>fr:security##securite_des_plugins|sécurité des plugins]].
diff --git a/lib/plugins/extension/lang/fr/lang.php b/lib/plugins/extension/lang/fr/lang.php
index 9a578516a..29616080f 100644
--- a/lib/plugins/extension/lang/fr/lang.php
+++ b/lib/plugins/extension/lang/fr/lang.php
@@ -3,8 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Schplurtz le Déboulonné <Schplurtz@laposte.net>
* @author Damien Regad <dregad@mantisbt.org>
- * @author Schplurtz le Déboulonné <schplurtz@laposte.net>
* @author Yves Grandvalet <Yves.Grandvalet@laposte.net>
* @author Carbain Frédéric <fcarbain@yahoo.fr>
* @author Nicolas Friedli <nicolas@theologique.ch>
@@ -43,11 +43,11 @@ $lang['bugs_features'] = 'Bogues';
$lang['tags'] = 'Étiquettes :';
$lang['author_hint'] = 'Chercher les extensions de cet auteur';
$lang['installed'] = 'Installés :';
-$lang['downloadurl'] = 'URL de téléchargement :';
+$lang['downloadurl'] = 'Téléchargement :';
$lang['repository'] = 'Dépôt : ';
$lang['unknown'] = '<em>inconnu</em>';
$lang['installed_version'] = 'Version installée :';
-$lang['install_date'] = 'Votre dernière mise à jour :';
+$lang['install_date'] = 'Dernière mise à jour :';
$lang['available_version'] = 'Version disponible :';
$lang['compatible'] = 'Compatible avec :';
$lang['depends'] = 'Dépend de :';
@@ -76,6 +76,7 @@ $lang['msg_template_update_success'] = 'Thème %s mis à jour avec succès';
$lang['msg_plugin_install_success'] = 'Greffon %s installé avec succès';
$lang['msg_plugin_update_success'] = 'Greffon %s mis à jour avec succès';
$lang['msg_upload_failed'] = 'Téléversement échoué';
+$lang['msg_nooverwrite'] = 'L\'extension %s existe déjà et ne sera pas remplacée. Pour la remplacer, cocher l\'option de remplacement d\'extension.';
$lang['missing_dependency'] = '<strong>Dépendance absente ou désactivée :</strong> %s';
$lang['security_issue'] = '<strong>Problème de sécurité :</strong> %s';
$lang['security_warning'] = '<strong>Avertissement de sécurité :</strong> %s';
diff --git a/lib/plugins/extension/lang/hr/intro_search.txt b/lib/plugins/extension/lang/hr/intro_search.txt
index 405690581..88b6c3ad5 100644
--- a/lib/plugins/extension/lang/hr/intro_search.txt
+++ b/lib/plugins/extension/lang/hr/intro_search.txt
@@ -1 +1 @@
-Ovdje možete potražiti i druge dostupne dodatke i predloške za DokuWiki. Molimo budite svjesni da postavljanje koda razvijenog od treće strane može biti **sigurnosni rizik**, možda želite prvo pročitati o [[doku>security#plugin_security|sigurnosti dodataka]]. \ No newline at end of file
+Ovdje možete potražiti i druge dostupne [[doku>plugins|dodatke]] i [[doku>template|predloške]] za DokuWiki. Molimo budite svjesni da postavljanje koda razvijenog od treće strane može biti **sigurnosni rizik**, možda želite prvo pročitati o [[doku>security#plugin_security|sigurnosti dodataka]].
diff --git a/lib/plugins/extension/lang/hu/intro_search.txt b/lib/plugins/extension/lang/hu/intro_search.txt
index 87a2a5d64..aaa34eb59 100644
--- a/lib/plugins/extension/lang/hu/intro_search.txt
+++ b/lib/plugins/extension/lang/hu/intro_search.txt
@@ -1 +1 @@
-Ezen a fülön harmadik fél által készített modulokat és sablonokat találsz a DokuWiki-hez. Ne feledd, hogy a harmadik féltől származó kódok **biztonsági kockázatot** jelenthetnek, ennek a [[doku>security#plugin_security|modulok biztonsága]] oldalon olvashatsz utána a telepítés előtt. \ No newline at end of file
+Ezen a fülön harmadik fél által készített [[doku>plugins|modulokat]] és [[doku>template|sablonokat]] találsz a DokuWiki-hez. Ne feledd, hogy a harmadik féltől származó kódok **biztonsági kockázatot** jelenthetnek, ennek a [[doku>security#plugin_security|modulok biztonsága]] oldalon olvashatsz utána a telepítés előtt.
diff --git a/lib/plugins/extension/lang/it/intro_search.txt b/lib/plugins/extension/lang/it/intro_search.txt
index fb77d3683..40eace508 100644
--- a/lib/plugins/extension/lang/it/intro_search.txt
+++ b/lib/plugins/extension/lang/it/intro_search.txt
@@ -1 +1 @@
-Questa sezione ti da accesso a tutti i plugin e temi di terze parti disponibili per DokuWiki. Sappi che l'installazione di codice di terze parti potrebbe rappresentare un **rischio di sicurezza**, quindi, forse, prima vorresti informarti a proposito della [[doku>security#plugin_security|sicurezza dei plugin]]. \ No newline at end of file
+Questa sezione ti da accesso a tutti i [[doku>it:plugins|plugin]] e [[doku>it:template|temi]] di terze parti disponibili per DokuWiki. Sappi che l'installazione di codice di terze parti potrebbe rappresentare un **rischio di sicurezza**, quindi, forse, prima vorresti informarti a proposito della [[doku>security#plugin_security|sicurezza dei plugin]].
diff --git a/lib/plugins/extension/lang/ja/intro_search.txt b/lib/plugins/extension/lang/ja/intro_search.txt
index 66d977b1b..1998e8dde 100644
--- a/lib/plugins/extension/lang/ja/intro_search.txt
+++ b/lib/plugins/extension/lang/ja/intro_search.txt
@@ -1 +1 @@
-このタブでは、DokuWiki用の利用可能なすべてのサードパーティのプラグインとテンプレートにアクセスできます。サードパーティ製のコードには、**セキュリティ上のリスク**の可能性があることに注意してください、最初に[[doku>ja:security#プラグインのセキュリティ|プラグインのセキュリティ]]を読むことをお勧めします。 \ No newline at end of file
+このタブでは、DokuWiki用の利用可能なすべてのサードパーティの[[doku>ja:plugins|プラグイン]]と[[doku>ja:template|テンプレート]]にアクセスできます。サードパーティ製のコードには、**セキュリティ上のリスク**の可能性があることに注意してください。最初に[[doku>ja:security#プラグインのセキュリティ|プラグインのセキュリティ]]を読むことをお勧めします。
diff --git a/lib/plugins/extension/lang/ja/lang.php b/lib/plugins/extension/lang/ja/lang.php
index 6b3ef676a..1d288fa99 100644
--- a/lib/plugins/extension/lang/ja/lang.php
+++ b/lib/plugins/extension/lang/ja/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
* @author Hideaki SAWADA <chuno@live.jp>
* @author PzF_X <jp_minecraft@yahoo.co.jp>
* @author Satoshi Sahara <sahara.satoshi@gmail.com>
@@ -20,7 +21,7 @@ $lang['alreadydisabled'] = 'この拡張機能は無効です。';
$lang['pluginlistsaveerror'] = 'プラグイン一覧の保存中にエラーが発生しました。';
$lang['unknownauthor'] = '作者不明';
$lang['unknownversion'] = 'バージョン不明';
-$lang['btn_info'] = '詳細情報を表示する。';
+$lang['btn_info'] = '詳細情報を表示する';
$lang['btn_update'] = '更新';
$lang['btn_uninstall'] = 'アンインストール';
$lang['btn_enable'] = '有効化';
@@ -48,14 +49,14 @@ $lang['unknown'] = '<em>不明</em>';
$lang['installed_version'] = 'インストール済バージョン:';
$lang['install_date'] = '最終更新日:';
$lang['available_version'] = '利用可能バージョン:';
-$lang['compatible'] = '互換:';
-$lang['depends'] = '依存:';
-$lang['similar'] = '類似:';
-$lang['conflicts'] = '競合:';
-$lang['donate'] = 'お気に入り?';
-$lang['donate_action'] = '寄付先';
+$lang['compatible'] = '互換性のあるバージョン:';
+$lang['depends'] = '必須プラグイン:';
+$lang['similar'] = '類似しているプラグイン:';
+$lang['conflicts'] = '競合するプラグイン:';
+$lang['donate'] = '気に入りましたか?';
+$lang['donate_action'] = '寄付先はこちら';
$lang['repo_retry'] = '再実行';
-$lang['provides'] = '提供:';
+$lang['provides'] = '機能:';
$lang['status'] = '状態:';
$lang['status_installed'] = 'インストール済';
$lang['status_not_installed'] = '未インストール';
@@ -70,13 +71,13 @@ $lang['msg_enabled'] = '%s プラグインを有効化しました。'
$lang['msg_disabled'] = '%s プラグインを無効化しました。';
$lang['msg_delete_success'] = '拡張機能 %s をアンインストールしました。';
$lang['msg_delete_failed'] = '拡張機能 %s のアンインストールに失敗しました。';
-$lang['msg_template_install_success'] = '%s テンプレートをインストールできました。';
-$lang['msg_template_update_success'] = '%s テンプレートを更新できました。';
-$lang['msg_plugin_install_success'] = '%s プラグインをインストールできました。';
-$lang['msg_plugin_update_success'] = '%s プラグインを更新できました。';
+$lang['msg_template_install_success'] = '%s テンプレートは正常にインストールされました。';
+$lang['msg_template_update_success'] = '%s テンプレートは正常に更新されました。';
+$lang['msg_plugin_install_success'] = '%s プラグインは正常にインストールされました。';
+$lang['msg_plugin_update_success'] = '%s プラグインは正常に更新されました。';
$lang['msg_upload_failed'] = 'ファイルのアップロードに失敗しました。';
$lang['missing_dependency'] = '<strong>依存関係が欠落または無効:</strong> %s';
-$lang['security_issue'] = '<strong>セキュリティ問題:</strong> %s';
+$lang['security_issue'] = '<strong>セキュリティ上の問題:</strong> %s';
$lang['security_warning'] = '<strong>セキュリティ警告:</strong> %s';
$lang['update_available'] = '<strong>更新:</strong> %sの新バージョンが利用可能です。';
$lang['wrong_folder'] = '<strong>プラグインは正しくインストールされませんでした:</strong> プラグインのディレクトリを "%s" から "%s" へ変更して下さい。';
@@ -86,13 +87,13 @@ $lang['error_dircreate'] = 'ダウンロード用の一時フォルダが
$lang['error_download'] = 'ファイルをダウンロードできません:%s';
$lang['error_decompress'] = 'ダウンロードしたファイルを解凍できません。ダウンロードの失敗の結果であれば、再度試して下さい。圧縮形式が不明の場合は、手動でダウンロード・インストールしてください。';
$lang['error_findfolder'] = '拡張機能ディレクトリを認識できません。手動でダウンロード・インストールしてください。';
-$lang['error_copy'] = '<em>%s</em> ディレクトリのファイルをインストールしようとした時、ファイルコピーエラーが発生しました:ディスクがいっぱいかもしれませんし、ファイルのアクセス権が正しくないかもしれません。プラグインが一部分インストールされ、wiki が不安定になるかもしれません。';
+$lang['error_copy'] = '<em>%s</em> ディレクトリのファイルをインストールしようとした時、ファイルコピーエラーが発生しました。ディスクの空き容量が不足しているかもしれませんし、ファイルのアクセス権が正しくないかもしれません。今回の操作の結果、プラグインが一部分インストールされ、wiki が不安定になるかもしれません。';
$lang['noperms'] = '拡張機能ディレクトリが書き込み不可です。';
$lang['notplperms'] = 'テンプレートディレクトリが書き込み不可です。';
$lang['nopluginperms'] = 'プラグインディレクトリが書き込み不可です。';
$lang['git'] = 'この拡張機能は Git 経由でインストールされており、ここで更新すべきでないかもしれません。';
-$lang['auth'] = 'この認証プラグインは設定管理画面で無効化されています。';
+$lang['auth'] = 'この認証プラグインは設定管理画面で有効化されていません。この画面で無効化する事もご検討頂けます。';
$lang['install_url'] = 'URL からインストール:';
$lang['install_upload'] = '拡張機能をアップロード:';
$lang['repo_error'] = 'プラグインのリポジトリに接続できません。サーバーが www.dokuwiki.org に接続できることやプロキシの設定を確認して下さい。';
-$lang['nossl'] = 'PHP機能がSSLをサポートしていないため、拡張機能のダウンロードが正常に動作しません。';
+$lang['nossl'] = 'お使いのPHP機能がSSLをサポートしていないため、拡張機能のダウンロードが正常に動作しません。';
diff --git a/lib/plugins/extension/lang/ko/intro_search.txt b/lib/plugins/extension/lang/ko/intro_search.txt
index b6760264e..e7bfca522 100644
--- a/lib/plugins/extension/lang/ko/intro_search.txt
+++ b/lib/plugins/extension/lang/ko/intro_search.txt
@@ -1 +1 @@
-이 탭은 도쿠위키를 위한 사용할 수 있는 모든 타사 플러그인과 템플릿에 접근하도록 제공합니다. 타사 코드를 설치하면 **보안 위험에 노출**될 수 있음을 유의하십시오, 먼저 [[doku>security#plugin_security|플러그인 보안]]에 대해 읽을 수 있습니다. \ No newline at end of file
+이 탭은 도쿠위키를 위한 사용할 수 있는 모든 타사 [[doku>ko:plugins|플러그인]]과 [[doku>ko:template|템플릿에]] 접근하도록 제공합니다. 타사 코드를 설치하면 **보안 위험에 노출**될 수 있음을 유의하십시오, 먼저 [[doku>security#plugin_security|플러그인 보안]]에 대해 읽을 수 있습니다.
diff --git a/lib/plugins/extension/lang/nl/intro_search.txt b/lib/plugins/extension/lang/nl/intro_search.txt
index f0c8d7435..0530f13a5 100644
--- a/lib/plugins/extension/lang/nl/intro_search.txt
+++ b/lib/plugins/extension/lang/nl/intro_search.txt
@@ -1 +1 @@
-Deze tab verschaft u toegang tot alle plugins en templates vervaardigd door derden en bestemd voor Dokuwiki. Houdt er rekening mee dat indien u Plugins van derden installeert deze een **veiligheids risico ** kunnen bevatten, geadviseerd wordt om eerst te lezen [[doku>security#plugin_security|plugin security]]. \ No newline at end of file
+Deze tab verschaft u toegang tot alle [[doku>nl:plugins|plugins]] en [[doku>nl:template|templates]] vervaardigd door derden en bestemd voor Dokuwiki. Houdt er rekening mee dat indien u Plugins van derden installeert deze een **veiligheids risico ** kunnen bevatten, geadviseerd wordt om eerst te lezen [[doku>security#plugin_security|plugin security]].
diff --git a/lib/plugins/extension/lang/no/intro_search.txt b/lib/plugins/extension/lang/no/intro_search.txt
index d139fe930..32af4ff66 100644
--- a/lib/plugins/extension/lang/no/intro_search.txt
+++ b/lib/plugins/extension/lang/no/intro_search.txt
@@ -1 +1 @@
-Denne fanen gir deg tillgang til alle tilgjengelige tredjeparts programtillegg og maler for DokuWiki. Merk at det å installere tillegg fra tredjepart kan innebære en **sikerhetsrisiko**. Les mer om [[doku>security#plugin_security|sikkerhet og tillegg ]] før installasjon av disse. \ No newline at end of file
+Denne fanen gir deg tillgang til alle tilgjengelige tredjeparts [[doku>plugins|programtillegg]] og [[doku>template|maler]] for DokuWiki. Merk at det å installere tillegg fra tredjepart kan innebære en **sikerhetsrisiko**. Les mer om [[doku>security#plugin_security|sikkerhet og tillegg ]] før installasjon av disse.
diff --git a/lib/plugins/extension/lang/pl/intro_search.txt b/lib/plugins/extension/lang/pl/intro_search.txt
index d1773fa02..b6e497fb1 100644
--- a/lib/plugins/extension/lang/pl/intro_search.txt
+++ b/lib/plugins/extension/lang/pl/intro_search.txt
@@ -1 +1 @@
-W tej zakładka znajdziesz wszystkie wtyczki i szablony przygotowane dla DokuWiki przez osoby trzecie. Należy pamiętać, że instalacja kodu zewnętrznego może stwarzać ** zagrożenie bezpieczeństwa **. Koniecznie przeczytaj o [[doku>security#plugin_security|bezpieczeństwie wtyczek]]. \ No newline at end of file
+W tej zakładka znajdziesz wszystkie [[doku>pl:plugins|wtyczki]] i [[doku>pl:template|szablony]] przygotowane dla DokuWiki przez osoby trzecie. Należy pamiętać, że instalacja kodu zewnętrznego może stwarzać ** zagrożenie bezpieczeństwa **. Koniecznie przeczytaj o [[doku>security#plugin_security|bezpieczeństwie wtyczek]].
diff --git a/lib/plugins/extension/lang/pt-br/intro_search.txt b/lib/plugins/extension/lang/pt-br/intro_search.txt
index f2101d73b..965ac306b 100644
--- a/lib/plugins/extension/lang/pt-br/intro_search.txt
+++ b/lib/plugins/extension/lang/pt-br/intro_search.txt
@@ -1 +1 @@
-Esta aba lhe dá acesso a extensões e modelos disponibilizados por terceiros para o DokuWiki. Favor ter cuidado pois instalar código de terceiros pode acarretar um **risco de segurança**, você poderia ler sobre [[doku>security#plugin_security|segurança de extensões]] primeiramente. \ No newline at end of file
+Esta aba lhe dá acesso a [[doku>plugins|extensões]] e [[doku>template|modelos]] disponibilizados por terceiros para o DokuWiki. Favor ter cuidado pois instalar código de terceiros pode acarretar um **risco de segurança**, você poderia ler sobre [[doku>security#plugin_security|segurança de extensões]] primeiramente.
diff --git a/lib/plugins/extension/lang/pt-br/lang.php b/lib/plugins/extension/lang/pt-br/lang.php
index ce4c3b819..79cb3b072 100644
--- a/lib/plugins/extension/lang/pt-br/lang.php
+++ b/lib/plugins/extension/lang/pt-br/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Davi Jorge <davimoises2015@hotmail.com>
* @author Felipe Castro <fefcas@gmail.com>
* @author Hudson FAS <hudsonfas@gmail.com>
* @author Frederico Gonçalves Guimarães <frederico@teia.bio.br>
@@ -74,6 +76,7 @@ $lang['msg_template_update_success'] = 'Modelo %s atualizado com sucesso';
$lang['msg_plugin_install_success'] = 'Extensão %s instalada com sucesso';
$lang['msg_plugin_update_success'] = 'Extensão %s atualizada com sucesso';
$lang['msg_upload_failed'] = 'Subida do arquivo falhou';
+$lang['msg_nooverwrite'] = 'A extensão %s já existe e, portanto, não está sendo substituída; para substituir, marque a opção de substituição';
$lang['missing_dependency'] = '<strong>Dependência faltante ou desabilitada:</strong> %s';
$lang['security_issue'] = '<strong>Problema com segurança:</strong> %s';
$lang['security_warning'] = '<strong>Aviso sobre segurança:</strong> %s';
diff --git a/lib/plugins/extension/lang/pt/intro_install.txt b/lib/plugins/extension/lang/pt/intro_install.txt
index 5e5871391..049cc8c0c 100644
--- a/lib/plugins/extension/lang/pt/intro_install.txt
+++ b/lib/plugins/extension/lang/pt/intro_install.txt
@@ -1 +1 @@
-Aqui você pode instalar manualmente plugins e modelos ou enviando-os (upload) ou fornecendo uma URL de download direto. \ No newline at end of file
+Aqui você pode instalar manualmente plugins e modelos enviando-os ou fornecendo uma URL de download direto. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/pt/intro_plugins.txt b/lib/plugins/extension/lang/pt/intro_plugins.txt
index fcfaa5cea..a789250ba 100644
--- a/lib/plugins/extension/lang/pt/intro_plugins.txt
+++ b/lib/plugins/extension/lang/pt/intro_plugins.txt
@@ -1 +1 @@
-Estes são os plugins instalados atualmente em seu DokuWiki. Você pode ativar ou desativar ou desinstala-los completamente aqui. Atualizações de plugins também são mostradas aqui, não se esqueça de ler a documentação do plug-in antes de atualizar. \ No newline at end of file
+Estes são os plugins instalados atualmente em seu DokuWiki. Você pode ativar, desativar ou desinstalá-los completamente aqui. Atualizações de plugins também são mostradas aqui, não se esqueça de ler a documentação do plug-in antes de atualizar. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/pt/intro_search.txt b/lib/plugins/extension/lang/pt/intro_search.txt
index be39a9860..565f5b7f6 100644
--- a/lib/plugins/extension/lang/pt/intro_search.txt
+++ b/lib/plugins/extension/lang/pt/intro_search.txt
@@ -1 +1 @@
-Esta guia lhe dá acesso a todos os plugins e modelos de terceiros disponíveis DokuWiki. Por favor, esteja ciente de que a instalação de componentes de terceiros pode representar um risco de segurança ** **, você pode querer ler sobre [[doku> segurança # plugin_security | segurança plug-in]] antes de realizar a instalação de módulos de terceiros. \ No newline at end of file
+Esta aba lhe dá acesso a todos os [[doku>plugins|plugins]] e [[doku>template|modelos]] de terceiros disponíveis para o DokuWiki. Esteja ciente de que a instalação de componentes de terceiros pode representar um **risco de segurança**. Você pode querer ler sobre [[doku>segurança#plugin_security|segurança de plug-ins]] antes de realizar a instalação de módulos.
diff --git a/lib/plugins/extension/lang/pt/intro_templates.txt b/lib/plugins/extension/lang/pt/intro_templates.txt
index 02bc33643..405141a81 100644
--- a/lib/plugins/extension/lang/pt/intro_templates.txt
+++ b/lib/plugins/extension/lang/pt/intro_templates.txt
@@ -1 +1 @@
-Estes são os modelos atualmente instalados em seu DokuWiki. Você pode selecionar o modelo a ser usado no [[?do=admin&page=config|Configuration Manager]].
+Estes são os modelos atualmente instalados em seu DokuWiki. Você pode selecionar o modelo a ser usado no [[?do=admin&page=config|Gerenciador de Configuração]].
diff --git a/lib/plugins/extension/lang/pt/lang.php b/lib/plugins/extension/lang/pt/lang.php
index e31907c5c..2c066eab0 100644
--- a/lib/plugins/extension/lang/pt/lang.php
+++ b/lib/plugins/extension/lang/pt/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
+ * @author Mario AlexandTeixeira dos Santos <masterofclan@gmail.com>
+ * @author Maykon Oliveira <maykonoliveira850@gmail.com>
+ * @author José Vieira <jmsv63@gmail.com>
* @author Guido Salatino <guidorafael23@gmail.com>
* @author Romulo Pereira <romuloccomp@gmail.com>
* @author Paulo Carmino <contato@paulocarmino.com>
@@ -24,23 +28,23 @@ $lang['unknownversion'] = 'Versão desconhecida';
$lang['btn_info'] = 'Mostrar mais informações';
$lang['btn_update'] = 'Atualizar';
$lang['btn_uninstall'] = 'Desinstalar';
-$lang['btn_enable'] = 'Habilitar';
-$lang['btn_disable'] = 'Desabilitar';
+$lang['btn_enable'] = 'Ativar';
+$lang['btn_disable'] = 'Desativar';
$lang['btn_install'] = 'Instalar';
$lang['btn_reinstall'] = 'Reinstalar';
$lang['js']['reallydel'] = 'Confirma a desinstalação desta extensão?';
-$lang['js']['display_viewoptions'] = 'Ver Opções:';
+$lang['js']['display_viewoptions'] = 'Opções de Visualização:';
$lang['js']['display_enabled'] = 'ativado';
$lang['js']['display_disabled'] = 'desativado';
$lang['js']['display_updatable'] = 'atualizável';
$lang['search_for'] = 'Pesquisar Extensão:';
$lang['search'] = 'Pesquisar';
$lang['extensionby'] = '<strong>%s</strong> by %s';
-$lang['screenshot'] = 'Screenshot of %s';
+$lang['screenshot'] = 'Screenshot de %s';
$lang['popularity'] = 'Popularidade: %s%%';
$lang['homepage_link'] = 'Documentos';
$lang['bugs_features'] = 'Erros';
-$lang['tags'] = 'Tags:';
+$lang['tags'] = 'Rótulos:';
$lang['author_hint'] = 'Pesquisar extensões deste autor';
$lang['installed'] = 'Instalado:
';
@@ -48,7 +52,7 @@ $lang['downloadurl'] = 'Baixar URL:
';
$lang['repository'] = 'Repositório:
';
-$lang['unknown'] = '<em> desconhecido </em>
+$lang['unknown'] = '<em>desconhecido</em>
';
$lang['installed_version'] = 'Versão instalada:';
$lang['install_date'] = 'Sua última atualização:';
@@ -59,7 +63,7 @@ $lang['depends'] = 'Depende de:
';
$lang['similar'] = 'Semelhante a:
';
-$lang['conflicts'] = 'Conflitos com:
+$lang['conflicts'] = 'Conflita com:
';
$lang['donate'] = 'Assim?
';
@@ -76,21 +80,20 @@ $lang['status_not_installed'] = 'não instalado
';
$lang['status_protected'] = 'protegido
';
-$lang['status_enabled'] = 'habilitado';
-$lang['status_disabled'] = 'desabilitado';
-$lang['status_unmodifiable'] = 'imodificável
-';
+$lang['status_enabled'] = 'ativado';
+$lang['status_disabled'] = 'desativado';
+$lang['status_unmodifiable'] = 'inalterável';
$lang['status_plugin'] = 'plugin
';
$lang['status_template'] = 'modelo
';
$lang['status_bundled'] = 'empacotado
';
-$lang['msg_enabled'] = 'Plugin %s habilitado
+$lang['msg_enabled'] = 'Plugin %s ativado
';
-$lang['msg_disabled'] = 'Plugin %s desabilitado';
+$lang['msg_disabled'] = 'Plugin %s desativado';
$lang['msg_delete_success'] = 'Extensão %s desinstalada';
-$lang['msg_delete_failed'] = 'Desinstalar Extensão %s falhou
+$lang['msg_delete_failed'] = 'A desinstalação da Extensão %s falhou
';
$lang['msg_template_install_success'] = 'Modelo %s instalado com sucesso';
$lang['msg_template_update_success'] = 'Modelo %s atualizado com sucesso
@@ -99,18 +102,19 @@ $lang['msg_plugin_install_success'] = 'Plugin %s instalado com sucesso
';
$lang['msg_plugin_update_success'] = 'Plugin %s atualizado com sucesso
';
-$lang['msg_upload_failed'] = 'Enviando o arquivo falhou
+$lang['msg_upload_failed'] = 'O envio do arquivo falhou
';
+$lang['msg_nooverwrite'] = 'A extensão %s já existe e não será substituída. Para substituir, marque a opção de substituição';
$lang['missing_dependency'] = '<strong>dependência ausente ou desabilitada:</strong> %s
';
-$lang['security_issue'] = '<strong> Questão de segurança:</strong> %s
+$lang['security_issue'] = '<strong>Questão de Segurança:</strong> %s
';
-$lang['security_warning'] = '<strong> Aviso de segurança:</strong> %s';
+$lang['security_warning'] = '<strong>Aviso de Segurança:</strong> %s';
$lang['update_available'] = '<strong>Atualização:</strong> Nova versão %s está disponível.
';
-$lang['wrong_folder'] = '<strong>Plugin instalado incorretamente: </strong> Renomear pasta de plugins de "%s" para "%s".
+$lang['wrong_folder'] = '<strong>Plugin instalado incorretamente:</strong> Renomear pasta de plugins de "%s" para "%s".
';
-$lang['url_change'] = '<strong>URL mudou: </strong> URL para download mudou desde o último download. Verifique se a nova URL é válida antes de atualizar a extensão <br/> Nova:%s<br/>Antiga:%s
+$lang['url_change'] = '<strong>A URL mudou: </strong> A URL para download mudou desde o último download. Verifique se a nova URL é válida antes de atualizar a extensão <br/> Nova:%s<br/>Antiga:%s
';
$lang['error_badurl'] = 'URLs deve começar com http ou https
';
@@ -118,10 +122,10 @@ $lang['error_dircreate'] = 'Não é possível criar pasta temporária para
';
$lang['error_download'] = 'Não é possível baixar o arquivo:%s
';
-$lang['error_decompress'] = 'Não é possível descompactar o arquivo baixado. Talvez seja resultado de um download ruim, nesse caso, você deve tentar novamente; ou o formato de compressão pode ser desconhecido, nesse caso, você precisará baixar e instalar manualmente.';
+$lang['error_decompress'] = 'Não é possível descompactar o arquivo baixado. Talvez seja resultado de um download ruim e nesse caso você deve tentar novamente; ou o formato de compressão pode ser desconhecido e nesse caso, você precisará baixar e instalar manualmente.';
$lang['error_findfolder'] = 'Não foi possível identificar diretório de extensão, você precisa baixar e instalar manualmente
';
-$lang['error_copy'] = 'Houve um erro na cópia do arquivo durante a tentativa de instalar os arquivos para o diretório <em>%s </em>: o disco pode estar cheio ou as permissões de acesso ao arquivo podem estar incorretas. Isso pode ter resultado em um plugin parcialmente instalado e tornar instável a sua instalação wiki
+$lang['error_copy'] = 'Houve um erro na cópia do arquivo durante a tentativa de instalar os arquivos para o diretório <em>%s</em>: o disco pode estar cheio ou as permissões de acesso incorretas. Isso pode ter resultado em um plugin parcialmente instalado e tornar instável seu wiki
';
$lang['noperms'] = 'Diretório da extensão não é gravável
';
@@ -129,12 +133,12 @@ $lang['notplperms'] = 'Diretório do modelo não é gravável
';
$lang['nopluginperms'] = 'Diretório do plugin não é gravável
';
-$lang['git'] = 'Esta extensão foi instalada via git, você não pode querer atualizá-la aqui.
+$lang['git'] = 'Esta extensão foi instalada via git, você pode não querer atualizá-la aqui.
';
-$lang['auth'] = 'Este plugin não está habilitado na configuração, considere desabilita-lo.';
+$lang['auth'] = 'Este plugin não está ativado na configuração, considere desativá-lo.';
$lang['install_url'] = 'Instalar a partir da URL:';
-$lang['install_upload'] = 'Publique a Extensão:';
-$lang['repo_error'] = 'O repositório do plugin não pôde ser conectado. Verifique se o seu servidor está autorizado a conectar com www.dokuwiki.org e verifique as configurações de proxy do servidor.
+$lang['install_upload'] = 'Enviar Extensão:';
+$lang['repo_error'] = 'O repositório do plugin não pôde ser contactado. Verifique se o seu servidor está autorizado a conectar com www.dokuwiki.org e verifique as configurações de proxy do servidor.
';
$lang['nossl'] = 'Seu PHP parece que perdeu o suporte a SSL. O download não vai funcionar para muitas extensões DokuWiki.
';
diff --git a/lib/plugins/extension/lang/ru/intro_install.txt b/lib/plugins/extension/lang/ru/intro_install.txt
index 0c555aee2..94382dbd7 100644
--- a/lib/plugins/extension/lang/ru/intro_install.txt
+++ b/lib/plugins/extension/lang/ru/intro_install.txt
@@ -1 +1 @@
-Здесь вы можете самостоятельно установить плагины и шаблоны, загрузив их или предоставив прямой URL для скачивания. \ No newline at end of file
+Здесь вы можете самостоятельно установить плагины и шаблоны, загрузив их или указав прямую (direct) ссылку для скачивания. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/ru/intro_search.txt b/lib/plugins/extension/lang/ru/intro_search.txt
index 609985bf4..c60bfdc4a 100644
--- a/lib/plugins/extension/lang/ru/intro_search.txt
+++ b/lib/plugins/extension/lang/ru/intro_search.txt
@@ -1 +1 @@
-Вкладка даёт вам доступ ко всем имеющимся сторонним плагинам и шаблонам для «Докувики». Имейте в виду, что установка стороннего кода может представлять **угрозу безопасности,** возможно вам нужно сперва прочитать о [[doku>security#plugin_security|безопасности плагинов]]. \ No newline at end of file
+Вкладка даёт вам доступ ко всем имеющимся сторонним [[doku>ru:plugins|плагинам]] и [[doku>ru:template|шаблонам]] для «Докувики». Имейте в виду, что установка стороннего кода может представлять **угрозу безопасности**. Возможно, вам нужно сперва прочитать о [[doku>security#plugin_security|безопасности плагинов]].
diff --git a/lib/plugins/extension/lang/ru/lang.php b/lib/plugins/extension/lang/ru/lang.php
index 97ad123db..6699b746a 100644
--- a/lib/plugins/extension/lang/ru/lang.php
+++ b/lib/plugins/extension/lang/ru/lang.php
@@ -4,6 +4,7 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Анатолий <anatol_m@mail.ru>
* @author Igor Degraf <igordegraf@gmail.com>
* @author Type-kun <workwork-1@yandex.ru>
* @author Vitaly Filatenko <kot@hacktest.net>
@@ -77,6 +78,7 @@ $lang['msg_template_update_success'] = 'Шаблон %s успешно обно
$lang['msg_plugin_install_success'] = 'Плагин %s успешно установлен';
$lang['msg_plugin_update_success'] = 'Плагин %s успешно обновлён';
$lang['msg_upload_failed'] = 'Не удалось загрузить файл';
+$lang['msg_nooverwrite'] = 'Расширение %s уже существует, поэтому оно не перезаписано; для перезаписи отметьте опцию перезаписи';
$lang['missing_dependency'] = '<strong>Отсутствует или отключена зависимость:</strong> %s';
$lang['security_issue'] = '<strong>Проблема безопасности:</strong> %s';
$lang['security_warning'] = '<strong>Предупреждение безопасности:</strong> %s';
@@ -96,5 +98,5 @@ $lang['git'] = 'Это дополнение было уста
$lang['auth'] = 'Этот auth-плагин не включён в конфигурации, подумайте об его отключении';
$lang['install_url'] = 'Установить с адреса';
$lang['install_upload'] = 'Загрузить дополнение';
-$lang['repo_error'] = 'Сайт с плагинами недоступен. Убедитесь, что у сайта есть доступ на www.dokuwiki.org, а также проверьте настройки соединения прокси.';
-$lang['nossl'] = 'Ваша PHP-конфигурация не имеет SSL-поддержки. Это нарушит скачивание для многих дополнений.';
+$lang['repo_error'] = 'Репозиторий плагина недоступен. Убедитесь, что у вашей вики есть доступ к www.dokuwiki.org, а также проверьте настройки соединения прокси.';
+$lang['nossl'] = 'Ваша конфигурация PHP не имеет поддержки SSL. Это нарушит скачивание для многих дополнений.';
diff --git a/lib/plugins/extension/lang/sk/intro_install.txt b/lib/plugins/extension/lang/sk/intro_install.txt
new file mode 100644
index 000000000..bfff6a4ce
--- /dev/null
+++ b/lib/plugins/extension/lang/sk/intro_install.txt
@@ -0,0 +1 @@
+Tu môžete manuálne nainštalovať rozšírenia a témy. Buď ich nahráte, alebo zadáte priamu adresu na stiahnutie.
diff --git a/lib/plugins/extension/lang/sk/intro_plugins.txt b/lib/plugins/extension/lang/sk/intro_plugins.txt
new file mode 100644
index 000000000..381341bb5
--- /dev/null
+++ b/lib/plugins/extension/lang/sk/intro_plugins.txt
@@ -0,0 +1 @@
+Toto sú aktuálne nainštalované rozšírenia vo Vašom systéme DokuWiki. Tu ich môžete povoliť, zakázať alebo odinštalovať. Tiež tu nájdete aj aktualizácie rozšírení. Pred aktualizovaním si prečítajte dokumentáciu rozšírenia.
diff --git a/lib/plugins/extension/lang/sk/intro_search.txt b/lib/plugins/extension/lang/sk/intro_search.txt
new file mode 100644
index 000000000..920193ad8
--- /dev/null
+++ b/lib/plugins/extension/lang/sk/intro_search.txt
@@ -0,0 +1 @@
+Táto záložka vám dáva prístup k všetkým dostupným rozšíreniam a témam pre DokuWiki od tretích strán. Prosím, myslite na to, že inštalácia kódu od tretích strán môže predstavovať **bezpečnostné riziko**. Prečítajte si najskôr [[doku>security#plugin_security|o zabezpečení rozšírení]].
diff --git a/lib/plugins/extension/lang/sk/intro_templates.txt b/lib/plugins/extension/lang/sk/intro_templates.txt
new file mode 100644
index 000000000..ca1c4ed4b
--- /dev/null
+++ b/lib/plugins/extension/lang/sk/intro_templates.txt
@@ -0,0 +1 @@
+Toto sú aktuálne nainštalované témy vo Vašom systéme DokuWiki. Tému, ktorú chcete použiť, môžete vybrať v [[?do=admin&page=config|Nastavení konfigurácie]].
diff --git a/lib/plugins/extension/lang/sk/lang.php b/lib/plugins/extension/lang/sk/lang.php
index 775e89a6b..32f3239dc 100644
--- a/lib/plugins/extension/lang/sk/lang.php
+++ b/lib/plugins/extension/lang/sk/lang.php
@@ -1,15 +1,23 @@
<?php
/**
+ * Slovak language file for extension plugin
+ *
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Martin Michalek <michalek.dev@gmail.com>
+ * @author Tibor Repček <tiborepcek@gmail.com>
*/
-$lang['tab_plugins'] = 'Inštalované pluginy';
+$lang['menu'] = 'Správca rozšírení';
+$lang['tab_plugins'] = 'Inštalované rozšírenia';
$lang['tab_templates'] = 'Inštalované šablóny';
-$lang['tab_search'] = 'Hľadanie e inštalácia';
+$lang['tab_search'] = 'Hľadanie a inštalácia';
$lang['tab_install'] = 'Manuálna inštalácia';
$lang['notimplemented'] = 'Táto vlastnosť ešte nebola implementovaná';
+$lang['notinstalled'] = 'Toto rozšírenie nie je nainštalované';
+$lang['alreadyenabled'] = 'Toto rozšírenie už bolo povolené';
+$lang['alreadydisabled'] = 'Toto rozšírenie už bolo zakázané';
+$lang['pluginlistsaveerror'] = 'Pri ukladaní zoznamu rozšírení sa vyskytla chyba';
$lang['unknownauthor'] = 'Neznámy autor';
$lang['unknownversion'] = 'Neznáma verzia';
$lang['btn_info'] = 'Viac informácií';
@@ -19,6 +27,12 @@ $lang['btn_enable'] = 'Povolenie';
$lang['btn_disable'] = 'Zablokovanie';
$lang['btn_install'] = 'Inštalácia';
$lang['btn_reinstall'] = 'Re-Inštalácia';
+$lang['js']['reallydel'] = 'Naozaj chcete toto rozšírenie odinštalovať?';
+$lang['js']['display_viewoptions'] = 'Zobraziť možnosti:';
+$lang['js']['display_enabled'] = 'povolené';
+$lang['js']['display_disabled'] = 'zakázané';
+$lang['js']['display_updatable'] = 'aktualizovateľné';
+$lang['search_for'] = 'Hľadať rozšírenie:';
$lang['search'] = 'Vyhľadávanie';
$lang['extensionby'] = '<strong>%s</strong> od %s';
$lang['screenshot'] = 'Obrázok od %s';
@@ -26,22 +40,36 @@ $lang['popularity'] = 'Popularita: %s%%';
$lang['homepage_link'] = 'Dokumentácia';
$lang['bugs_features'] = 'Chyby:';
$lang['tags'] = 'Kľúčové slová:';
+$lang['author_hint'] = 'Hľadať rozšírenia podľa autora';
+$lang['installed'] = 'Nainštalované:';
+$lang['downloadurl'] = 'Stiahnuť z:';
+$lang['repository'] = 'Repozitár:';
$lang['unknown'] = '<em>neznámy</em>';
$lang['installed_version'] = 'Inštalovaná verzia:';
$lang['install_date'] = 'Posledná aktualizácia:';
$lang['available_version'] = 'Dostupné verzie:';
$lang['compatible'] = 'Kompaktibilita:';
+$lang['depends'] = 'Závislé na:';
$lang['similar'] = 'Podobné:';
$lang['conflicts'] = 'V konflikte:';
+$lang['donate'] = 'Páči sa Vám?';
+$lang['donate_action'] = 'Kúpte autorovi kávu!';
+$lang['repo_retry'] = 'Znovu skúsiť';
+$lang['provides'] = 'Poskytuje:';
+$lang['status'] = 'Stav:';
$lang['status_installed'] = 'inštalovaný';
$lang['status_not_installed'] = 'neinštalovaný';
$lang['status_protected'] = 'chránený';
$lang['status_enabled'] = 'povolený';
$lang['status_disabled'] = 'nepovolený';
+$lang['status_unmodifiable'] = 'nezmeniteľný';
$lang['status_plugin'] = 'plugin';
$lang['status_template'] = 'šablóna';
+$lang['status_bundled'] = 'vstavaný';
$lang['msg_enabled'] = 'Plugin %s povolený';
$lang['msg_disabled'] = 'Plugin %s nepovolený';
+$lang['msg_delete_success'] = 'Rozšírenie %s odinštalované';
+$lang['msg_delete_failed'] = 'Odinštalovanie rozšírenia %s sa nepodarilo';
$lang['msg_template_install_success'] = 'Šablóna %s úspešne nainštalovaná';
$lang['msg_template_update_success'] = 'Šablóna %s úspešne aktualizovaná';
$lang['msg_plugin_install_success'] = 'Plugin %s úspešne nainštalovaný';
@@ -52,10 +80,19 @@ $lang['security_issue'] = '<strong>Bezpečnostný problém:</strong> %s';
$lang['security_warning'] = '<strong>Bezpečnostné upozornenie:</strong> %s';
$lang['update_available'] = '<strong>Aktualizácia:</strong> Nová verzia %s.';
$lang['wrong_folder'] = '<strong>Plugin nesprávne nainštalovaný:</strong> Premenujte adresár s pluginom "%s" na "%s".';
+$lang['url_change'] = '<strong>URL sa zmenila:</strong> URL na stiahnutie sa od posledného sťahovania zmenila. Pred aktualizáciou rozšírenia skontrolujte, či je nová URL správna. <br />Nová: %s<br />Stará: %s';
$lang['error_badurl'] = 'URL by mali mať na začiatku http alebo https';
$lang['error_dircreate'] = 'Nie je možné vytvoriť dočasný adresár pre uloženie sťahovaného súboru';
$lang['error_download'] = 'Nie je možné stiahnuť súbor: %s';
$lang['error_decompress'] = 'Nie je možné dekomprimovať stiahnutý súbor. Môže to byť dôvodom chyby sťahovania (v tom prípade to skúste znova) alebo neznámym kompresným formátom (v tom prípade musíte stiahnuť a inštalovať manuálne).';
+$lang['error_findfolder'] = 'Nepodarilo sa identifikovať cestu rozšírenia. Rozšírenie musíte stiahnuť a inštalovať manuálne.';
$lang['error_copy'] = 'Chyba kopírovania pri inštalácii do adresára <em>%s</em>: disk môže byť plný alebo nemáte potrebné prístupové oprávnenie. Dôsledkom može byť čiastočne inštalovaný plugin a nestabilná wiki inštalácia.';
-$lang['nopluginperms'] = 'Adresár s pluginom nie je zapisovateľný.';
+$lang['noperms'] = 'Do priečinka rozšírenia sa nedá zapisovať.';
+$lang['notplperms'] = 'Do priečinka s témou sa nedá zapisovať.';
+$lang['nopluginperms'] = 'Do priečinka s pluginom sa nedá zapisovať.';
+$lang['git'] = 'Toto rozšírenie bolo nainštalované cez git. Nemali by ste ho tu aktualizovať.';
+$lang['auth'] = 'Toto rozšírenie nie je povolené v nastaveniach. Zvážte jeho zakázanie.';
$lang['install_url'] = 'Inštalácia z URL:';
+$lang['install_upload'] = 'Nahrať rozšírenie:';
+$lang['repo_error'] = 'Nepodarilo sa kontaktovať repozitár rozšírenia. Uistite sa, že váš server má povolené kontaktovať www.dokuwiki.org a skontrolujte nastavenia proxy.';
+$lang['nossl'] = 'Vaše PHP zrejme nepodporuje SSL. Sťahovanie nebude funkčné pre mnohé rozšírenia.';
diff --git a/lib/plugins/extension/lang/tr/lang.php b/lib/plugins/extension/lang/tr/lang.php
index c90b7b1c5..bddb9e522 100644
--- a/lib/plugins/extension/lang/tr/lang.php
+++ b/lib/plugins/extension/lang/tr/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author İlker R. Kapaç <irifat@gmail.com>
* @author Mete Cuma <mcumax@gmail.com>
*/
diff --git a/lib/plugins/extension/lang/uk/lang.php b/lib/plugins/extension/lang/uk/lang.php
new file mode 100644
index 000000000..3414ea7d8
--- /dev/null
+++ b/lib/plugins/extension/lang/uk/lang.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Dmytro Marchenko <dmytro.marchenko1989@gmail.com>
+ */
+$lang['menu'] = 'Менеджер розширень';
+$lang['tab_plugins'] = 'Встановлені плагіни';
+$lang['tab_templates'] = 'Встановлені шаблони';
+$lang['tab_search'] = 'Пошук та встановлення';
+$lang['tab_install'] = 'Встановити вручну';
+$lang['notimplemented'] = 'Ця функція ще не була реалізована';
+$lang['notinstalled'] = 'Це розширення не встановлено';
+$lang['alreadyenabled'] = 'Це розширення вже ввімкнено';
+$lang['alreadydisabled'] = 'Це розширення вже вимкнено';
+$lang['pluginlistsaveerror'] = 'Під час збереження списку плагінів сталася помилка';
+$lang['unknownauthor'] = 'Невідомий автор';
+$lang['unknownversion'] = 'Невідома версія';
+$lang['btn_info'] = 'Показати більше інформації';
+$lang['btn_update'] = 'Оновити';
+$lang['btn_uninstall'] = 'Видалити';
+$lang['btn_enable'] = 'Увімкнути';
+$lang['btn_disable'] = 'Вимкнути';
+$lang['btn_install'] = 'Встановити';
+$lang['btn_reinstall'] = 'Перевстановити';
+$lang['js']['reallydel'] = 'Дійсно видалити це розширення?';
+$lang['js']['display_viewoptions'] = 'Параметри перегляду:';
+$lang['js']['display_enabled'] = 'увімкнено';
+$lang['js']['display_disabled'] = 'вимкнено';
+$lang['js']['display_updatable'] = 'оновлюваний';
+$lang['search_for'] = 'Пошук розширень:';
+$lang['search'] = 'Пошук';
+$lang['bugs_features'] = 'Помилки';
+$lang['tags'] = 'Теги:';
+$lang['repo_retry'] = 'Спробувати знову';
+$lang['status_installed'] = 'Статус:';
+$lang['install_url'] = 'Встановити з URL-адреси:';
diff --git a/lib/plugins/extension/lang/vi/intro_install.txt b/lib/plugins/extension/lang/vi/intro_install.txt
new file mode 100644
index 000000000..91d6d2d4e
--- /dev/null
+++ b/lib/plugins/extension/lang/vi/intro_install.txt
@@ -0,0 +1 @@
+Tại đây, bạn có thể cài đặt thủ công các plugin và chủ đề bằng cách tải chúng lên hoặc cung cấp URL tải xuống trực tiếp. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/vi/intro_plugins.txt b/lib/plugins/extension/lang/vi/intro_plugins.txt
new file mode 100644
index 000000000..028be57dd
--- /dev/null
+++ b/lib/plugins/extension/lang/vi/intro_plugins.txt
@@ -0,0 +1 @@
+Đây là những plugin hiện đã được cài đặt trong DokuWiki của bạn. Bạn có thể bật hoặc tắt hoặc thậm chí gỡ cài đặt hoàn toàn chúng ở đây. Cập nhật plugin cũng được hiển thị ở đây, hãy nhớ đọc tài liệu của plugin trước khi cập nhật. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/vi/intro_search.txt b/lib/plugins/extension/lang/vi/intro_search.txt
new file mode 100644
index 000000000..a5183b945
--- /dev/null
+++ b/lib/plugins/extension/lang/vi/intro_search.txt
@@ -0,0 +1 @@
+Tab này cho phép bạn truy cập vào tất cả [[doku>plugins|plugins]] và [[doku>template|chủ đề]] có sẵn cho DokuWiki của các bên thứ 3. Xin lưu ý rằng việc cài đặt mã của bên thứ 3 có thể gây ra **rủi ro bảo mật**, bạn có thể muốn đọc về [[doku>security#plugin_security|bảo mật plugin]] trước. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/vi/intro_templates.txt b/lib/plugins/extension/lang/vi/intro_templates.txt
new file mode 100644
index 000000000..23831d218
--- /dev/null
+++ b/lib/plugins/extension/lang/vi/intro_templates.txt
@@ -0,0 +1 @@
+Đây là các chủ đề hiện được cài đặt trong DokuWiki của bạn. Bạn có thể chọn sử dụng chủ đề trong [[?do=admin&page=config|Quản lý cấu hình]]. \ No newline at end of file
diff --git a/lib/plugins/extension/lang/vi/lang.php b/lib/plugins/extension/lang/vi/lang.php
new file mode 100644
index 000000000..98f233217
--- /dev/null
+++ b/lib/plugins/extension/lang/vi/lang.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['menu'] = 'Quản lý phần mở rộng';
+$lang['tab_plugins'] = 'Plugin đã cài đặt';
+$lang['tab_templates'] = 'Chủ đề đã cài đặt';
+$lang['tab_search'] = 'Tìm kiếm và Cài đặt';
+$lang['tab_install'] = 'Cài đặt thủ công';
+$lang['notimplemented'] = 'Tính năng này chưa được triển khai';
+$lang['notinstalled'] = 'Phần mở rộng này chưa được cài đặt';
+$lang['alreadyenabled'] = 'Phần mở rộng này đã được kích hoạt';
+$lang['alreadydisabled'] = 'Phần mở rộng này đã bị vô hiệu hóa';
+$lang['pluginlistsaveerror'] = 'Có lỗi khi lưu danh sách plugin';
+$lang['unknownauthor'] = 'Không rõ tác giả';
+$lang['unknownversion'] = 'Không rõ phiên bản';
+$lang['btn_info'] = 'Hiện thêm thông tin';
+$lang['btn_update'] = 'Cập nhật';
+$lang['btn_uninstall'] = 'Gỡ bỏ';
+$lang['btn_enable'] = 'Kích hoạt';
+$lang['btn_disable'] = 'Vô hiệu';
+$lang['btn_install'] = 'Cài đặt';
+$lang['btn_reinstall'] = 'Cài đặt lại';
+$lang['js']['reallydel'] = 'Bạn thực sự muốn gỡ cài đặt phần mở rộng này?';
+$lang['js']['display_viewoptions'] = 'Tùy chọn xem:';
+$lang['js']['display_enabled'] = 'đã kích hoạt';
+$lang['js']['display_disabled'] = 'đã vô hiệu';
+$lang['js']['display_updatable'] = 'có sẫn cập nhật';
+$lang['search_for'] = 'Tìm kiếm Phần mở rộng:';
+$lang['search'] = 'Tìm kiếm';
+$lang['extensionby'] = '<strong>%s</strong> bởi %s';
+$lang['screenshot'] = 'Ảnh chụp màn hình của %s';
+$lang['popularity'] = 'Độ phổ biến: %s%%';
+$lang['homepage_link'] = 'Tài liệu';
+$lang['bugs_features'] = 'Lỗi';
+$lang['tags'] = 'Thẻ';
+$lang['author_hint'] = 'Tìm kiếm phần mở rộng của tác giả này';
+$lang['installed'] = 'Đã cài đặt:';
+$lang['downloadurl'] = 'URL tải về:';
+$lang['repository'] = 'Repository:';
+$lang['unknown'] = '<em>không rõ</em>';
+$lang['installed_version'] = 'Phiên bản đã cài đặt:';
+$lang['install_date'] = 'Cập nhật cuối cùng của bạn:';
+$lang['available_version'] = 'Có sẵn phiên bản:';
+$lang['compatible'] = 'Tương thích với:';
+$lang['depends'] = 'Phụ thuộc vào:';
+$lang['similar'] = 'Tương tự như:';
+$lang['conflicts'] = 'Xung đột với:';
+$lang['donate'] = 'Thích thứ này?';
+$lang['donate_action'] = 'Mua cho tác giả một ly cà phê!';
+$lang['repo_retry'] = 'Thử lại';
+$lang['provides'] = 'Cung cấp:';
+$lang['status'] = 'Trạng thái:';
+$lang['status_installed'] = 'đã cài đặt';
+$lang['status_not_installed'] = 'chưa cài đặt';
+$lang['status_protected'] = 'đã bảo vệ';
+$lang['status_enabled'] = 'đã kích hoạt';
+$lang['status_disabled'] = 'đã vô hiệu';
+$lang['status_unmodifiable'] = 'không thể thay đổi';
+$lang['status_plugin'] = 'plugin';
+$lang['status_template'] = 'chủ đề';
+$lang['status_bundled'] = 'đi kèm';
+$lang['msg_enabled'] = 'Plugin %s đã được kích hoạt';
+$lang['msg_disabled'] = 'Plugin %s đã bị vô hiệu';
+$lang['msg_delete_success'] = 'Đã gỡ cài đặt phần mở rộng %s';
+$lang['msg_delete_failed'] = 'Thất bại khi gỡ cài đặt phần mở rộng %s';
+$lang['msg_template_install_success'] = 'Cài đặt thành công chủ đề %s';
+$lang['msg_template_update_success'] = 'Cập nhật thành công chủ đề %s';
+$lang['msg_plugin_install_success'] = 'Cài đặt thành công chủ đề %s';
+$lang['msg_plugin_update_success'] = 'Cập nhật thành công chủ đề %s';
+$lang['msg_upload_failed'] = 'Tải tập tin không thành công';
+$lang['msg_nooverwrite'] = 'Phần mở rộng %s đã tồn tại để không bị ghi đè; để ghi đè, đánh dấu tùy chọn ghi đè';
+$lang['missing_dependency'] = '<strong>Thiếu hoặc đã vô hiệu phần phụ thuộc:</strong> %s';
+$lang['security_issue'] = '<strong>Vấn đề bảo mật:</strong> %s';
+$lang['security_warning'] = '<strong>Cảnh báo bảo mật:</strong> %s';
+$lang['update_available'] = '<strong>Cập nhật:</strong> Phiên bản mới %s hiện có sẵn.';
+$lang['wrong_folder'] = '<strong>Plugin đã được cài đặt không đúng:</strong> Đổi tên đường dẫn plugin "%s" thành "%s".';
+$lang['url_change'] = '<strong>URL thay đổi:</strong>URL tải xuống đã thay đổi kể từ lần tải xuống trước. Kiểm tra xem URL mới có hợp lệ không trước khi cập nhật phần mở rộng.<br />Mới: %s<br />Cũ: %s';
+$lang['error_badurl'] = 'URL phải bắt đầu bằng http hoặc https';
+$lang['error_dircreate'] = 'Không thể tạo thư mục tạm thời để nhận tải xuống';
+$lang['error_download'] = 'Không thể tải xuống tập tin: %s';
+$lang['error_decompress'] = 'Không thể giải nén tập tin đã tải xuống. Việc này có thể là kết quả của một tải xuống xấu, trường hợp này bạn nên thử lại; hoặc nếu định dạng nén có thể không xác định, bạn sẽ cần phải tải xuống và cài đặt thủ công.';
+$lang['error_findfolder'] = 'Không thể xác định đường dẫn phần mở rộng, bạn cần tải xuống và cài đặt thủ công';
+$lang['error_copy'] = 'Có lỗi sao chép tập tin trong khi cố gắng cài đặt tập tin cho đường dẫn <em>%s</em>: đĩa có thể đầy hoặc quyền truy cập tập tin có thể không chính xác. Việc này có thể đã dẫn đến plugin được cài đặt một phần và khiến cài đặt wiki của bạn không ổn định';
+$lang['noperms'] = 'Không thể ghi đường dẫn Phần mở rộng';
+$lang['notplperms'] = 'Không thể ghi đường dẫn Chủ đề';
+$lang['nopluginperms'] = 'Không thể ghi đường dẫn Plugin';
+$lang['git'] = 'Phần mở rộng này đã được cài đặt qua git, bạn có thể không muốn cập nhật nó ở đây.';
+$lang['auth'] = 'Plugin xác thực này không được kích hoạt trong cấu hình, hãy xem xét việc vô hiệu hóa nó.';
+$lang['install_url'] = 'Cài đặt từ URL:';
+$lang['install_upload'] = 'Tải lên Phần mở rộng:';
+$lang['repo_error'] = 'Không thể kết nối đến Kho lưu trữ plugin. Đảm bảo rằng máy chủ của bạn được phép kết nối với www.dokuwiki.org và kiểm tra cài đặt proxy của bạn.';
+$lang['nossl'] = 'PHP của bạn dường như bỏ lỡ hỗ trợ SSL. Tải xuống sẽ không hoạt động đối với nhiều phần mở rộng DokuWiki.';
diff --git a/lib/plugins/extension/lang/zh/intro_search.txt b/lib/plugins/extension/lang/zh/intro_search.txt
index ebc7e99ad..aa979ab87 100644
--- a/lib/plugins/extension/lang/zh/intro_search.txt
+++ b/lib/plugins/extension/lang/zh/intro_search.txt
@@ -1 +1 @@
-这个标签会为你展示所有 DokuWiki 的第三方插件和模板。但你需要知道这些由第三方提供的代码可能会给你带来**安全方面的风险**,你最好先读一下[[doku>security#plugin_security|插件安全性]]。 \ No newline at end of file
+这个标签会为你展示所有 DokuWiki 的第三方[[doku>zh:plugins|插件]]和[[doku>zh:template|模板]]。但你需要知道这些由第三方提供的代码可能会给你带来**安全方面的风险**,你最好先读一下[[doku>security#plugin_security|插件安全性]]。
diff --git a/lib/plugins/extension/lang/zh/lang.php b/lib/plugins/extension/lang/zh/lang.php
index 622a007b4..6d0b321be 100644
--- a/lib/plugins/extension/lang/zh/lang.php
+++ b/lib/plugins/extension/lang/zh/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Xin <chenxin1034@gmail.com>
* @author lempel <riverlempel@hotmail.com>
* @author Cupen <Cupenoruler@foxmail.com>
* @author xiqingongzi <Xiqingongzi@Gmail.com>
@@ -10,17 +11,18 @@
* @author lainme <lainme993@gmail.com>
* @author Errol <errol@hotmail.com>
* @author phy25 <git@phy25.com>
+ * @author fengyqf <fengyqf@gmail.com>
*/
$lang['menu'] = '扩展管理器';
-$lang['tab_plugins'] = '安装插件';
-$lang['tab_templates'] = '安装模板';
-$lang['tab_search'] = '搜索和安装';
+$lang['tab_plugins'] = '现有插件';
+$lang['tab_templates'] = '现有模板';
+$lang['tab_search'] = '搜索安装';
$lang['tab_install'] = '手动安装';
$lang['notimplemented'] = '未实现的特性';
$lang['notinstalled'] = '该扩展未安装';
$lang['alreadyenabled'] = '该扩展已激活';
$lang['alreadydisabled'] = '该扩展已关闭';
-$lang['pluginlistsaveerror'] = '保存插件列表时碰到个错误';
+$lang['pluginlistsaveerror'] = '保存插件列表时出现错误';
$lang['unknownauthor'] = '未知作者';
$lang['unknownversion'] = '未知版本';
$lang['btn_info'] = '查看更多信息';
@@ -30,8 +32,8 @@ $lang['btn_enable'] = '激活';
$lang['btn_disable'] = '关闭';
$lang['btn_install'] = '安装';
$lang['btn_reinstall'] = '重新安装';
-$lang['js']['reallydel'] = '确定卸载这个扩展么?';
-$lang['js']['display_viewoptions'] = '查看选项:';
+$lang['js']['reallydel'] = '确定卸载这个扩展吗?';
+$lang['js']['display_viewoptions'] = '查看选项:';
$lang['js']['display_enabled'] = '启用';
$lang['js']['display_disabled'] = '禁用';
$lang['js']['display_updatable'] = '可更新';
@@ -43,7 +45,7 @@ $lang['popularity'] = '人气: %s%%';
$lang['homepage_link'] = '文档';
$lang['bugs_features'] = '错误';
$lang['tags'] = '标签:';
-$lang['author_hint'] = '搜索这个作者的插件';
+$lang['author_hint'] = '搜索这个作者的扩展';
$lang['installed'] = '已安装的:';
$lang['downloadurl'] = '下载地址:';
$lang['repository'] = '版本库:';
@@ -55,11 +57,11 @@ $lang['compatible'] = '兼容于:';
$lang['depends'] = '依赖于:';
$lang['similar'] = '相似于:';
$lang['conflicts'] = '冲突于:';
-$lang['donate'] = '喜欢?';
-$lang['donate_action'] = '捐给作者一杯咖啡钱!';
+$lang['donate'] = '喜欢吗?';
+$lang['donate_action'] = '赞赏作者一杯咖啡的钱!';
$lang['repo_retry'] = '重试';
$lang['provides'] = '提供:';
-$lang['status'] = '现状:';
+$lang['status'] = '状态:';
$lang['status_installed'] = '已安装的';
$lang['status_not_installed'] = '未安装';
$lang['status_protected'] = '受保护';
@@ -78,18 +80,19 @@ $lang['msg_template_update_success'] = '模板 %s 更新成功';
$lang['msg_plugin_install_success'] = '插件 %s 安装成功';
$lang['msg_plugin_update_success'] = '插件 %s 更新成功';
$lang['msg_upload_failed'] = '上传文件失败';
-$lang['missing_dependency'] = '<strong>缺少或者被禁用依赖:</strong> %s';
+$lang['msg_nooverwrite'] = '扩展名 %s 已存在,因此不会被覆盖;要覆盖,请选中覆盖选项。';
+$lang['missing_dependency'] = '<strong>缺少或者被禁用的依赖:</strong> %s';
$lang['security_issue'] = '<strong>安全问题:</strong> %s';
$lang['security_warning'] = '<strong>安全警告:</strong> %s';
$lang['update_available'] = '<strong>更新:</strong>新版本 %s 已经可用。';
-$lang['wrong_folder'] = '<strong>插件安装不正确:</strong>重命名插件目录 "%s" 为 "%s"。';
-$lang['url_change'] = '<strong>URL已改变:</strong>自上次下载以来的下载 URL 已经改变。请在更新扩展前检查新 URL 是否有效。<br />新的:%s<br />旧的:%s';
+$lang['wrong_folder'] = '<strong>扩展安装错误:</strong>请将扩展目录 "%s" 重命名为 "%s"。';
+$lang['url_change'] = '<strong>URL 已改变:</strong>自上次下载以来的下载 URL 已经改变。请在更新扩展前检查新 URL 是否有效。<br />新的:%s<br />旧的:%s';
$lang['error_badurl'] = 'URL 应当以 http 或者 https 作为开头';
$lang['error_dircreate'] = '无法创建用于保存下载的临时文件夹';
$lang['error_download'] = '无法下载文件:%s';
$lang['error_decompress'] = '无法解压下载的文件。这可能是由于文件损坏,在这种情况下您可以重试。这也可能是由于压缩格式是未知的,在这种情况下您需要手动下载并且安装。';
$lang['error_findfolder'] = '无法识别扩展目录,您需要手动下载和安装';
-$lang['error_copy'] = '在尝试安装文件到目录 <em>%s</em> 时出现文件复制错误:磁盘可能已满或者文件访问权限不正确。这可能导致插件被部分安装并使您的维基处在不稳定状态';
+$lang['error_copy'] = '在尝试安装文件到目录 <em>%s</em> 时出现文件复制错误:可能磁盘已满或文件权限不正确。这可能导致扩展安装不完整,并使您的维基处在不稳定状态';
$lang['noperms'] = '扩展目录不可写';
$lang['notplperms'] = '模板目录不可写';
$lang['nopluginperms'] = '插件目录不可写';
@@ -97,5 +100,5 @@ $lang['git'] = '这个扩展是通过 Git 安装的,您可
$lang['auth'] = '这个认证插件没有在配置中启用,请考虑禁用它。';
$lang['install_url'] = '从 URL 安装:';
$lang['install_upload'] = '上传扩展:';
-$lang['repo_error'] = '无法连接到插件仓库。请确定您的服务器可以连接 www.dokuwiki.org 并检查您的代理设置。';
-$lang['nossl'] = '您的 PHP 似乎不支持 SSL。很多 DokuWiki 扩展将无法下载。';
+$lang['repo_error'] = '无法连接到扩展库。请确定您的服务器可以连接 www.dokuwiki.org 并检查您的代理设置。';
+$lang['nossl'] = '您的 PHP 似乎不支持 SSL,这将导致无法下载多数 DokuWiki 扩展。';
diff --git a/lib/plugins/extension/script.js b/lib/plugins/extension/script.js
index 8627db420..7c915808e 100644
--- a/lib/plugins/extension/script.js
+++ b/lib/plugins/extension/script.js
@@ -5,7 +5,7 @@ jQuery(function(){
/**
* Confirm uninstalling
*/
- $extmgr.find('button.uninstall').click(function(e){
+ $extmgr.find('button.uninstall').on('click', function(e){
if(!window.confirm(LANG.plugins.extension.reallydel)){
e.preventDefault();
return false;
@@ -17,7 +17,7 @@ jQuery(function(){
* very simple lightbox
* @link http://webdesign.tutsplus.com/tutorials/htmlcss-tutorials/super-simple-lightbox-with-css-and-jquery/
*/
- $extmgr.find('a.extension_screenshot').click(function(e) {
+ $extmgr.find('a.extension_screenshot').on('click', function(e) {
e.preventDefault();
//Get clicked link href
@@ -29,7 +29,7 @@ jQuery(function(){
$lightbox = jQuery('<div id="plugin__extensionlightbox"><p>Click to close</p><div></div></div>')
.appendTo(jQuery('body'))
.hide()
- .click(function(){
+ .on('click', function(){
$lightbox.hide();
});
}
@@ -46,7 +46,7 @@ jQuery(function(){
/**
* Enable/Disable extension via AJAX
*/
- $extmgr.find('button.disable, button.enable').click(function (e) {
+ $extmgr.find('button.disable, button.enable').on('click', function (e) {
e.preventDefault();
var $btn = jQuery(this);
@@ -85,7 +85,7 @@ jQuery(function(){
/**
* AJAX detail infos
*/
- $extmgr.find('a.info').click(function(e){
+ $extmgr.find('a.info').on('click', function(e){
e.preventDefault();
var $link = jQuery(this);
@@ -129,12 +129,12 @@ jQuery(function(){
var $label = jQuery( '<label></label>' )
.appendTo($displayOpts);
var $input = jQuery( '<input />', { type: 'checkbox', name: chkName })
- .change(displayOptionsHandler)
+ .on('change', displayOptionsHandler)
.appendTo($label);
var previous = DokuCookie.getValue('ext_'+chkName);
if(typeof previous === "undefined" || previous == '1') {
- $input.click();
+ $input.trigger('click');
}
jQuery( '<span/>' )
diff --git a/lib/plugins/info/syntax.php b/lib/plugins/info/syntax.php
index 773256faf..19e49bfcd 100644
--- a/lib/plugins/info/syntax.php
+++ b/lib/plugins/info/syntax.php
@@ -6,33 +6,30 @@
* @author Andreas Gohr <andi@splitbrain.org>
* @author Esther Brunner <wikidesign@gmail.com>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-/**
- * All DokuWiki plugins to extend the parser/rendering mechanism
- * need to inherit from this class
- */
-class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
+class syntax_plugin_info extends DokuWiki_Syntax_Plugin
+{
/**
* What kind of syntax are we?
*/
- function getType(){
+ public function getType()
+ {
return 'substition';
}
/**
* What about paragraphs?
*/
- function getPType(){
+ public function getPType()
+ {
return 'block';
}
/**
* Where to sort in?
*/
- function getSort(){
+ public function getSort()
+ {
return 155;
}
@@ -40,8 +37,9 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
/**
* Connect pattern to lexer
*/
- function connectTo($mode) {
- $this->Lexer->addSpecialPattern('~~INFO:\w+~~',$mode,'plugin_info');
+ public function connectTo($mode)
+ {
+ $this->Lexer->addSpecialPattern('~~INFO:\w+~~', $mode, 'plugin_info');
}
/**
@@ -53,8 +51,9 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
* @param Doku_Handler $handler The Doku_Handler object
* @return array Return an array with all data you want to use in render
*/
- function handle($match, $state, $pos, Doku_Handler $handler){
- $match = substr($match,7,-2); //strip ~~INFO: from start and ~~ from end
+ public function handle($match, $state, $pos, Doku_Handler $handler)
+ {
+ $match = substr($match, 7, -2); //strip ~~INFO: from start and ~~ from end
return array(strtolower($match));
}
@@ -66,40 +65,41 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
* @param array $data data created by handler()
* @return boolean rendered correctly?
*/
- function render($format, Doku_Renderer $renderer, $data) {
- if($format == 'xhtml'){
+ public function render($format, Doku_Renderer $renderer, $data)
+ {
+ if ($format == 'xhtml') {
/** @var Doku_Renderer_xhtml $renderer */
//handle various info stuff
- switch ($data[0]){
+ switch ($data[0]) {
case 'syntaxmodes':
- $renderer->doc .= $this->_syntaxmodes_xhtml();
+ $renderer->doc .= $this->renderSyntaxModes();
break;
case 'syntaxtypes':
- $renderer->doc .= $this->_syntaxtypes_xhtml();
+ $renderer->doc .= $this->renderSyntaxTypes();
break;
case 'syntaxplugins':
- $this->_plugins_xhtml('syntax', $renderer);
+ $this->renderPlugins('syntax', $renderer);
break;
case 'adminplugins':
- $this->_plugins_xhtml('admin', $renderer);
+ $this->renderPlugins('admin', $renderer);
break;
case 'actionplugins':
- $this->_plugins_xhtml('action', $renderer);
+ $this->renderPlugins('action', $renderer);
break;
case 'rendererplugins':
- $this->_plugins_xhtml('renderer', $renderer);
+ $this->renderPlugins('renderer', $renderer);
break;
case 'helperplugins':
- $this->_plugins_xhtml('helper', $renderer);
+ $this->renderPlugins('helper', $renderer);
break;
case 'authplugins':
- $this->_plugins_xhtml('auth', $renderer);
+ $this->renderPlugins('auth', $renderer);
break;
case 'remoteplugins':
- $this->_plugins_xhtml('remote', $renderer);
+ $this->renderPlugins('remote', $renderer);
break;
case 'helpermethods':
- $this->_helpermethods_xhtml($renderer);
+ $this->renderHelperMethods($renderer);
break;
default:
$renderer->doc .= "no info about ".htmlspecialchars($data[0]);
@@ -117,7 +117,8 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
* @param string $type
* @param Doku_Renderer_xhtml $renderer
*/
- function _plugins_xhtml($type, Doku_Renderer_xhtml $renderer){
+ protected function renderPlugins($type, Doku_Renderer_xhtml $renderer)
+ {
global $lang;
$renderer->doc .= '<ul>';
@@ -125,24 +126,24 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
$plginfo = array();
// remove subparts
- foreach($plugins as $p){
- if (!$po = plugin_load($type,$p)) continue;
- list($name,/* $part */) = explode('_',$p,2);
+ foreach ($plugins as $p) {
+ if (!$po = plugin_load($type, $p)) continue;
+ list($name,/* $part */) = explode('_', $p, 2);
$plginfo[$name] = $po->getInfo();
}
// list them
- foreach($plginfo as $info){
+ foreach ($plginfo as $info) {
$renderer->doc .= '<li><div class="li">';
- $renderer->externallink($info['url'],$info['name']);
+ $renderer->externallink($info['url'], $info['name']);
$renderer->doc .= ' ';
$renderer->doc .= '<em>'.$info['date'].'</em>';
$renderer->doc .= ' ';
$renderer->doc .= $lang['by'];
$renderer->doc .= ' ';
- $renderer->emaillink($info['email'],$info['author']);
+ $renderer->emaillink($info['email'], $info['author']);
$renderer->doc .= '<br />';
- $renderer->doc .= strtr(hsc($info['desc']),array("\n"=>"<br />"));
+ $renderer->doc .= strtr(hsc($info['desc']), array("\n"=>"<br />"));
$renderer->doc .= '</div></li>';
unset($po);
}
@@ -157,39 +158,40 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
*
* @param Doku_Renderer_xhtml $renderer
*/
- function _helpermethods_xhtml(Doku_Renderer_xhtml $renderer){
+ protected function renderHelperMethods(Doku_Renderer_xhtml $renderer)
+ {
$plugins = plugin_list('helper');
- foreach($plugins as $p){
- if (!$po = plugin_load('helper',$p)) continue;
+ foreach ($plugins as $p) {
+ if (!$po = plugin_load('helper', $p)) continue;
if (!method_exists($po, 'getMethods')) continue;
$methods = $po->getMethods();
$info = $po->getInfo();
- $hid = $this->_addToTOC($info['name'], 2, $renderer);
+ $hid = $this->addToToc($info['name'], 2, $renderer);
$doc = '<h2><a name="'.$hid.'" id="'.$hid.'">'.hsc($info['name']).'</a></h2>';
$doc .= '<div class="level2">';
$doc .= '<p>'.strtr(hsc($info['desc']), array("\n"=>"<br />")).'</p>';
$doc .= '<pre class="code">$'.$p." = plugin_load('helper', '".$p."');</pre>";
$doc .= '</div>';
- foreach ($methods as $method){
+ foreach ($methods as $method) {
$title = '$'.$p.'->'.$method['name'].'()';
- $hid = $this->_addToTOC($title, 3, $renderer);
+ $hid = $this->addToToc($title, 3, $renderer);
$doc .= '<h3><a name="'.$hid.'" id="'.$hid.'">'.hsc($title).'</a></h3>';
$doc .= '<div class="level3">';
$doc .= '<div class="table"><table class="inline"><tbody>';
$doc .= '<tr><th>Description</th><td colspan="2">'.$method['desc'].
'</td></tr>';
- if ($method['params']){
+ if ($method['params']) {
$c = count($method['params']);
$doc .= '<tr><th rowspan="'.$c.'">Parameters</th><td>';
$params = array();
- foreach ($method['params'] as $desc => $type){
+ foreach ($method['params'] as $desc => $type) {
$params[] = hsc($desc).'</td><td>'.hsc($type);
}
- $doc .= join($params, '</td></tr><tr><td>').'</td></tr>';
+ $doc .= join('</td></tr><tr><td>', $params).'</td></tr>';
}
- if ($method['return']){
+ if ($method['return']) {
$doc .= '<tr><th>Return value</th><td>'.hsc(key($method['return'])).
'</td><td>'.hsc(current($method['return'])).'</td></tr>';
}
@@ -207,18 +209,19 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
*
* @return string
*/
- function _syntaxtypes_xhtml(){
+ protected function renderSyntaxTypes()
+ {
global $PARSER_MODES;
$doc = '';
$doc .= '<div class="table"><table class="inline"><tbody>';
- foreach($PARSER_MODES as $mode => $modes){
+ foreach ($PARSER_MODES as $mode => $modes) {
$doc .= '<tr>';
$doc .= '<td class="leftalign">';
$doc .= $mode;
$doc .= '</td>';
$doc .= '<td class="leftalign">';
- $doc .= join(', ',$modes);
+ $doc .= join(', ', $modes);
$doc .= '</td>';
$doc .= '</tr>';
}
@@ -231,29 +234,30 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
*
* @return string
*/
- function _syntaxmodes_xhtml(){
+ protected function renderSyntaxModes()
+ {
$modes = p_get_parsermodes();
$compactmodes = array();
- foreach($modes as $mode){
+ foreach ($modes as $mode) {
$compactmodes[$mode['sort']][] = $mode['mode'];
}
$doc = '';
$doc .= '<div class="table"><table class="inline"><tbody>';
- foreach($compactmodes as $sort => $modes){
+ foreach ($compactmodes as $sort => $modes) {
$rowspan = '';
- if(count($modes) > 1) {
+ if (count($modes) > 1) {
$rowspan = ' rowspan="'.count($modes).'"';
}
- foreach($modes as $index => $mode) {
+ foreach ($modes as $index => $mode) {
$doc .= '<tr>';
$doc .= '<td class="leftalign">';
$doc .= $mode;
$doc .= '</td>';
- if($index === 0) {
+ if ($index === 0) {
$doc .= '<td class="rightalign" '.$rowspan.'>';
$doc .= $sort;
$doc .= '</td>';
@@ -274,11 +278,12 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin {
* @param Doku_Renderer_xhtml $renderer
* @return string
*/
- protected function _addToTOC($text, $level, Doku_Renderer_xhtml $renderer){
+ protected function addToToc($text, $level, Doku_Renderer_xhtml $renderer)
+ {
global $conf;
$hid = '';
- if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])){
+ if (($level >= $conf['toptoclevel']) && ($level <= $conf['maxtoclevel'])) {
$hid = $renderer->_headerToLink($text, true);
$renderer->toc[] = array(
'hid' => $hid,
diff --git a/lib/plugins/popularity/action.php b/lib/plugins/popularity/action.php
index d5ec0f5c5..fac610735 100644
--- a/lib/plugins/popularity/action.php
+++ b/lib/plugins/popularity/action.php
@@ -5,44 +5,49 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*/
-require_once(DOKU_PLUGIN.'action.php');
-require_once(DOKU_PLUGIN.'popularity/admin.php');
-
-class action_plugin_popularity extends Dokuwiki_Action_Plugin {
+class action_plugin_popularity extends DokuWiki_Action_Plugin
+{
/**
* @var helper_plugin_popularity
*/
- var $helper;
+ protected $helper;
- function __construct(){
+ public function __construct()
+ {
$this->helper = $this->loadHelper('popularity', false);
}
- /**
- * Register its handlers with the dokuwiki's event controller
- */
- function register(Doku_Event_Handler $controller) {
- $controller->register_hook('INDEXER_TASKS_RUN', 'AFTER', $this, '_autosubmit', array());
+ /** @inheritdoc */
+ public function register(Doku_Event_Handler $controller)
+ {
+ $controller->register_hook('INDEXER_TASKS_RUN', 'AFTER', $this, 'autosubmit', array());
}
- function _autosubmit(Doku_Event &$event, $param){
+ /**
+ * Event handler
+ *
+ * @param Doku_Event $event
+ * @param $param
+ */
+ public function autosubmit(Doku_Event &$event, $param)
+ {
//Do we have to send the data now
- if ( !$this->helper->isAutosubmitEnabled() || $this->_isTooEarlyToSubmit() ){
+ if (!$this->helper->isAutosubmitEnabled() || $this->isTooEarlyToSubmit()) {
return;
}
//Actually send it
- $status = $this->helper->sendData( $this->helper->gatherAsString() );
+ $status = $this->helper->sendData($this->helper->gatherAsString());
- if ( $status !== '' ){
+ if ($status !== '') {
//If an error occured, log it
- io_saveFile( $this->helper->autosubmitErrorFile, $status );
+ io_saveFile($this->helper->autosubmitErrorFile, $status);
} else {
//If the data has been sent successfully, previous log of errors are useless
@unlink($this->helper->autosubmitErrorFile);
//Update the last time we sent data
- touch ( $this->helper->autosubmitFile );
+ touch($this->helper->autosubmitFile);
}
$event->stopPropagation();
@@ -53,7 +58,8 @@ class action_plugin_popularity extends Dokuwiki_Action_Plugin {
* Check if it's time to send autosubmit data
* (we should have check if autosubmit is enabled first)
*/
- function _isTooEarlyToSubmit(){
+ protected function isTooEarlyToSubmit()
+ {
$lastSubmit = $this->helper->lastSentTime();
return $lastSubmit + 24*60*60*30 > time();
}
diff --git a/lib/plugins/popularity/admin.php b/lib/plugins/popularity/admin.php
index 0cf174e0d..61d8cc3bf 100644
--- a/lib/plugins/popularity/admin.php
+++ b/lib/plugins/popularity/admin.php
@@ -5,43 +5,44 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
+class admin_plugin_popularity extends DokuWiki_Admin_Plugin
+{
-/**
- * All DokuWiki plugins to extend the admin function
- * need to inherit from this class
- */
-class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
+ /** @var helper_plugin_popularity */
+ protected $helper;
+ protected $sentStatus = null;
/**
- * @var helper_plugin_popularity
+ * admin_plugin_popularity constructor.
*/
- var $helper;
- var $sentStatus = null;
-
- function __construct(){
+ public function __construct()
+ {
$this->helper = $this->loadHelper('popularity', false);
}
/**
* return prompt for admin menu
+ * @param $language
+ * @return string
*/
- function getMenuText($language) {
+ public function getMenuText($language)
+ {
return $this->getLang('name');
}
/**
* return sort order for position in admin menu
*/
- function getMenuSort() {
+ public function getMenuSort()
+ {
return 2000;
}
/**
* Accessible for managers
*/
- function forAdminOnly() {
+ public function forAdminOnly()
+ {
return false;
}
@@ -49,18 +50,19 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
/**
* handle user request
*/
- function handle() {
+ public function handle()
+ {
global $INPUT;
//Send the data
- if ( $INPUT->has('data') ){
- $this->sentStatus = $this->helper->sendData( $INPUT->str('data') );
- if ( $this->sentStatus === '' ){
+ 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 );
+ touch($this->helper->popularityLastSubmitFile);
}
//Deal with the autosubmit option
- $this->_enableAutosubmit( $INPUT->has('autosubmit') );
+ $this->enableAutosubmit($INPUT->has('autosubmit'));
}
}
@@ -68,9 +70,10 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
* Enable or disable autosubmit
* @param bool $enable If TRUE, it will enable autosubmit. Else, it will disable it.
*/
- function _enableAutosubmit( $enable ){
- if ( $enable ){
- io_saveFile( $this->helper->autosubmitFile, ' ');
+ protected function enableAutosubmit($enable)
+ {
+ if ($enable) {
+ io_saveFile($this->helper->autosubmitFile, ' ');
} else {
@unlink($this->helper->autosubmitFile);
}
@@ -79,17 +82,18 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
/**
* Output HTML form
*/
- function html() {
+ public function html()
+ {
global $INPUT;
- if ( ! $INPUT->has('data') ){
+ if (! $INPUT->has('data')) {
echo $this->locale_xhtml('intro');
//If there was an error the last time we tried to autosubmit, warn the user
- if ( $this->helper->isAutoSubmitEnabled() ){
- if ( file_exists($this->helper->autosubmitErrorFile) ){
+ if ($this->helper->isAutoSubmitEnabled()) {
+ if (file_exists($this->helper->autosubmitErrorFile)) {
echo $this->getLang('autosubmitError');
- echo io_readFile( $this->helper->autosubmitErrorFile );
+ echo io_readFile($this->helper->autosubmitErrorFile);
}
}
@@ -98,12 +102,12 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
//Print the last time the data was sent
$lastSent = $this->helper->lastSentTime();
- if ( $lastSent !== 0 ){
+ if ($lastSent !== 0) {
echo $this->getLang('lastSent') . ' ' . datetime_h($lastSent);
}
} else {
//If we just submitted the form
- if ( $this->sentStatus === '' ){
+ if ($this->sentStatus === '') {
//If we successfully sent the data
echo $this->locale_xhtml('submitted');
} else {
@@ -122,9 +126,10 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
* @param string $data The popularity data, if it has already been computed. NULL otherwise.
* @return string The form, as an html string
*/
- function buildForm($submissionMode, $data = null){
+ protected function buildForm($submissionMode, $data = null)
+ {
$url = ($submissionMode === 'browser' ? $this->helper->submitUrl : script());
- if ( is_null($data) ){
+ if (is_null($data)) {
$data = $this->helper->gatherAsString();
}
@@ -135,7 +140,7 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
.'</textarea><br />';
//If we submit via the server, we give the opportunity to suscribe to the autosubmission option
- if ( $submissionMode !== 'browser' ){
+ if ($submissionMode !== 'browser') {
$form .= '<label for="autosubmit">'
.'<input type="checkbox" name="autosubmit" id="autosubmit" '
.($this->helper->isAutosubmitEnabled() ? 'checked' : '' )
diff --git a/lib/plugins/popularity/helper.php b/lib/plugins/popularity/helper.php
index b81ab7005..4537976ae 100644
--- a/lib/plugins/popularity/helper.php
+++ b/lib/plugins/popularity/helper.php
@@ -1,36 +1,43 @@
<?php
+
+use dokuwiki\HTTP\DokuHTTPClient;
+use dokuwiki\Extension\Event;
+
/**
* Popularity Feedback Plugin
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*/
-
-class helper_plugin_popularity extends Dokuwiki_Plugin {
+class helper_plugin_popularity extends Dokuwiki_Plugin
+{
/**
* The url where the data should be sent
*/
- var $submitUrl = 'http://update.dokuwiki.org/popularity.php';
+ public $submitUrl = 'http://update.dokuwiki.org/popularity.php';
/**
* Name of the file which determine if the the autosubmit is enabled,
* and when it was submited for the last time
*/
- var $autosubmitFile;
+ public $autosubmitFile;
/**
* File where the last error which happened when we tried to autosubmit, will be log
*/
- var $autosubmitErrorFile;
+ public $autosubmitErrorFile;
/**
* Name of the file which determine when the popularity data was manually
* submitted for the last time
* (If this file doesn't exist, the data has never been sent)
*/
- var $popularityLastSubmitFile;
+ public $popularityLastSubmitFile;
-
- function __construct(){
+ /**
+ * helper_plugin_popularity constructor.
+ */
+ public function __construct()
+ {
global $conf;
$this->autosubmitFile = $conf['cachedir'].'/autosubmit.txt';
$this->autosubmitErrorFile = $conf['cachedir'].'/autosubmitError.txt';
@@ -38,46 +45,12 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
}
/**
- * Return methods of this helper
- *
- * @return array with methods description
- */
- function getMethods(){
- $result = array();
- $result[] = array(
- 'name' => 'isAutoSubmitEnabled',
- 'desc' => 'Check if autosubmit is enabled',
- 'params' => array(),
- 'return' => array('result' => 'bool')
- );
- $result[] = array(
- 'name' => 'sendData',
- 'desc' => 'Send the popularity data',
- 'params' => array('data' => 'string'),
- 'return' => array()
- );
- $result[] = array(
- 'name' => 'gatherAsString',
- 'desc' => 'Gather the popularity data',
- 'params' => array(),
- 'return' => array('data' => 'string')
- );
- $result[] = array(
- 'name' => 'lastSentTime',
- 'desc' => 'Compute the last time popularity data was sent',
- 'params' => array(),
- 'return' => array('data' => 'int')
- );
- return $result;
-
- }
-
- /**
* Check if autosubmit is enabled
*
* @return boolean TRUE if we should send data once a month, FALSE otherwise
*/
- function isAutoSubmitEnabled(){
+ public function isAutoSubmitEnabled()
+ {
return file_exists($this->autosubmitFile);
}
@@ -87,11 +60,12 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
* @param string $data The popularity data
* @return string An empty string if everything worked fine, a string describing the error otherwise
*/
- function sendData($data){
+ public function sendData($data)
+ {
$error = '';
$httpClient = new DokuHTTPClient();
$status = $httpClient->sendRequest($this->submitUrl, array('data' => $data), 'POST');
- if ( ! $status ){
+ if (! $status) {
$error = $httpClient->error;
}
return $error;
@@ -102,7 +76,8 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
*
* @return int
*/
- function lastSentTime(){
+ public function lastSentTime()
+ {
$manualSubmission = @filemtime($this->popularityLastSubmitFile);
$autoSubmission = @filemtime($this->autosubmitFile);
@@ -114,13 +89,14 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
*
* @return string The popularity data as a string
*/
- function gatherAsString(){
- $data = $this->_gather();
+ public function gatherAsString()
+ {
+ $data = $this->gather();
$string = '';
- foreach($data as $key => $val){
- if(is_array($val)) foreach($val as $v){
+ foreach ($data as $key => $val) {
+ if (is_array($val)) foreach ($val as $v) {
$string .= hsc($key)."\t".hsc($v)."\n";
- }else{
+ } else {
$string .= hsc($key)."\t".hsc($val)."\n";
}
}
@@ -132,7 +108,8 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
*
* @return array The popularity data as an array
*/
- function _gather(){
+ protected function gather()
+ {
global $conf;
/** @var $auth DokuWiki_Auth_Plugin */
global $auth;
@@ -156,81 +133,81 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
// number and size of pages
$list = array();
- search($list,$conf['datadir'],array($this,'_search_count'),array('all'=>false),'');
+ search($list, $conf['datadir'], array($this, 'searchCountCallback'), array('all'=>false), '');
$data['page_count'] = $list['file_count'];
$data['page_size'] = $list['file_size'];
$data['page_biggest'] = $list['file_max'];
$data['page_smallest'] = $list['file_min'];
$data['page_nscount'] = $list['dir_count'];
$data['page_nsnest'] = $list['dir_nest'];
- if($list['file_count']) $data['page_avg'] = $list['file_size'] / $list['file_count'];
+ if ($list['file_count']) $data['page_avg'] = $list['file_size'] / $list['file_count'];
$data['page_oldest'] = $list['file_oldest'];
unset($list);
// number and size of media
$list = array();
- search($list,$conf['mediadir'],array($this,'_search_count'),array('all'=>true));
+ search($list, $conf['mediadir'], array($this, 'searchCountCallback'), array('all'=>true));
$data['media_count'] = $list['file_count'];
$data['media_size'] = $list['file_size'];
$data['media_biggest'] = $list['file_max'];
$data['media_smallest'] = $list['file_min'];
$data['media_nscount'] = $list['dir_count'];
$data['media_nsnest'] = $list['dir_nest'];
- if($list['file_count']) $data['media_avg'] = $list['file_size'] / $list['file_count'];
+ if ($list['file_count']) $data['media_avg'] = $list['file_size'] / $list['file_count'];
unset($list);
// number and size of cache
$list = array();
- search($list,$conf['cachedir'],array($this,'_search_count'),array('all'=>true));
+ search($list, $conf['cachedir'], array($this, 'searchCountCallback'), array('all'=>true));
$data['cache_count'] = $list['file_count'];
$data['cache_size'] = $list['file_size'];
$data['cache_biggest'] = $list['file_max'];
$data['cache_smallest'] = $list['file_min'];
- if($list['file_count']) $data['cache_avg'] = $list['file_size'] / $list['file_count'];
+ if ($list['file_count']) $data['cache_avg'] = $list['file_size'] / $list['file_count'];
unset($list);
// number and size of index
$list = array();
- search($list,$conf['indexdir'],array($this,'_search_count'),array('all'=>true));
+ search($list, $conf['indexdir'], array($this, 'searchCountCallback'), array('all'=>true));
$data['index_count'] = $list['file_count'];
$data['index_size'] = $list['file_size'];
$data['index_biggest'] = $list['file_max'];
$data['index_smallest'] = $list['file_min'];
- if($list['file_count']) $data['index_avg'] = $list['file_size'] / $list['file_count'];
+ if ($list['file_count']) $data['index_avg'] = $list['file_size'] / $list['file_count'];
unset($list);
// number and size of meta
$list = array();
- search($list,$conf['metadir'],array($this,'_search_count'),array('all'=>true));
+ search($list, $conf['metadir'], array($this, 'searchCountCallback'), array('all'=>true));
$data['meta_count'] = $list['file_count'];
$data['meta_size'] = $list['file_size'];
$data['meta_biggest'] = $list['file_max'];
$data['meta_smallest'] = $list['file_min'];
- if($list['file_count']) $data['meta_avg'] = $list['file_size'] / $list['file_count'];
+ if ($list['file_count']) $data['meta_avg'] = $list['file_size'] / $list['file_count'];
unset($list);
// number and size of attic
$list = array();
- search($list,$conf['olddir'],array($this,'_search_count'),array('all'=>true));
+ search($list, $conf['olddir'], array($this, 'searchCountCallback'), array('all'=>true));
$data['attic_count'] = $list['file_count'];
$data['attic_size'] = $list['file_size'];
$data['attic_biggest'] = $list['file_max'];
$data['attic_smallest'] = $list['file_min'];
- if($list['file_count']) $data['attic_avg'] = $list['file_size'] / $list['file_count'];
+ if ($list['file_count']) $data['attic_avg'] = $list['file_size'] / $list['file_count'];
$data['attic_oldest'] = $list['file_oldest'];
unset($list);
// user count
- if($auth && $auth->canDo('getUserCount')){
+ if ($auth && $auth->canDo('getUserCount')) {
$data['user_count'] = $auth->getUserCount();
}
// calculate edits per day
$list = @file($conf['metadir'].'/_dokuwiki.changes');
$count = count($list);
- if($count > 2){
- $first = (int) substr(array_shift($list),0,10);
- $last = (int) substr(array_pop($list),0,10);
+ if ($count > 2) {
+ $first = (int) substr(array_shift($list), 0, 10);
+ $last = (int) substr(array_pop($list), 0, 10);
$dur = ($last - $first)/(60*60*24); // number of days in the changelog
$data['edits_per_day'] = $count/$dur;
}
@@ -240,7 +217,7 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
$data['plugin'] = plugin_list();
// pcre info
- if(defined('PCRE_VERSION')) $data['pcre_version'] = PCRE_VERSION;
+ if (defined('PCRE_VERSION')) $data['pcre_version'] = PCRE_VERSION;
$data['pcre_backtrack'] = ini_get('pcre.backtrack_limit');
$data['pcre_recursion'] = ini_get('pcre.recursion_limit');
@@ -249,27 +226,33 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
$data['webserver'] = $_SERVER['SERVER_SOFTWARE'];
$data['php_version'] = phpversion();
$data['php_sapi'] = php_sapi_name();
- $data['php_memory'] = $this->_to_byte(ini_get('memory_limit'));
+ $data['php_memory'] = php_to_byte(ini_get('memory_limit'));
$data['php_exectime'] = $phptime;
$data['php_extension'] = get_loaded_extensions();
// plugin usage data
- $this->_add_plugin_usage_data($data);
+ $this->addPluginUsageData($data);
return $data;
}
- protected function _add_plugin_usage_data(&$data){
+ /**
+ * Triggers event to let plugins add their own data
+ *
+ * @param $data
+ */
+ protected function addPluginUsageData(&$data)
+ {
$pluginsData = array();
- trigger_event('PLUGIN_POPULARITY_DATA_SETUP', $pluginsData);
- foreach($pluginsData as $plugin => $d){
- if ( is_array($d) ) {
- foreach($d as $key => $value){
- $data['plugin_' . $plugin . '_' . $key] = $value;
- }
- } else {
- $data['plugin_' . $plugin] = $d;
- }
+ Event::createAndTrigger('PLUGIN_POPULARITY_DATA_SETUP', $pluginsData);
+ foreach ($pluginsData as $plugin => $d) {
+ if (is_array($d)) {
+ foreach ($d as $key => $value) {
+ $data['plugin_' . $plugin . '_' . $key] = $value;
+ }
+ } else {
+ $data['plugin_' . $plugin] = $d;
+ }
}
}
@@ -284,57 +267,26 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
* @param array $opts option array as given to search()
* @return bool
*/
- function _search_count(&$data,$base,$file,$type,$lvl,$opts){
+ public function searchCountCallback(&$data, $base, $file, $type, $lvl, $opts)
+ {
// traverse
- if($type == 'd'){
- if($data['dir_nest'] < $lvl) $data['dir_nest'] = $lvl;
+ if ($type == 'd') {
+ if ($data['dir_nest'] < $lvl) $data['dir_nest'] = $lvl;
$data['dir_count']++;
return true;
}
//only search txt files if 'all' option not set
- if($opts['all'] || substr($file,-4) == '.txt'){
+ if ($opts['all'] || substr($file, -4) == '.txt') {
$size = filesize($base.'/'.$file);
$date = filemtime($base.'/'.$file);
$data['file_count']++;
$data['file_size'] += $size;
- if(!isset($data['file_min']) || $data['file_min'] > $size) $data['file_min'] = $size;
- if($data['file_max'] < $size) $data['file_max'] = $size;
- if(!isset($data['file_oldest']) || $data['file_oldest'] > $date) $data['file_oldest'] = $date;
+ if (!isset($data['file_min']) || $data['file_min'] > $size) $data['file_min'] = $size;
+ if ($data['file_max'] < $size) $data['file_max'] = $size;
+ if (!isset($data['file_oldest']) || $data['file_oldest'] > $date) $data['file_oldest'] = $date;
}
return false;
}
-
- /**
- * Convert php.ini shorthands to byte
- *
- * @author <gilthans dot NO dot SPAM at gmail dot com>
- * @link http://php.net/manual/en/ini.core.php#79564
- *
- * @param string $v
- * @return int|string
- */
- function _to_byte($v){
- $l = substr($v, -1);
- $ret = substr($v, 0, -1);
- switch(strtoupper($l)){
- /** @noinspection PhpMissingBreakStatementInspection */
- case 'P':
- $ret *= 1024;
- /** @noinspection PhpMissingBreakStatementInspection */
- case 'T':
- $ret *= 1024;
- /** @noinspection PhpMissingBreakStatementInspection */
- case 'G':
- $ret *= 1024;
- /** @noinspection PhpMissingBreakStatementInspection */
- case 'M':
- $ret *= 1024;
- case 'K':
- $ret *= 1024;
- break;
- }
- return $ret;
- }
}
diff --git a/lib/plugins/popularity/lang/ar/lang.php b/lib/plugins/popularity/lang/ar/lang.php
index c3e21868f..0006ed216 100644
--- a/lib/plugins/popularity/lang/ar/lang.php
+++ b/lib/plugins/popularity/lang/ar/lang.php
@@ -2,10 +2,9 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
- * @author uahello@gmail.com
*/
$lang['name'] = 'رد الشعبية (قد يأخذ بعض الوقت ليحمل)';
$lang['submit'] = 'أرسل البيانات';
diff --git a/lib/plugins/popularity/lang/bg/lang.php b/lib/plugins/popularity/lang/bg/lang.php
index 963b50e84..f60c44142 100644
--- a/lib/plugins/popularity/lang/bg/lang.php
+++ b/lib/plugins/popularity/lang/bg/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Viktor Usunov <usun0v@mail.bg>
* @author Kiril <neohidra@gmail.com>
*/
diff --git a/lib/plugins/popularity/lang/ca/lang.php b/lib/plugins/popularity/lang/ca/lang.php
index 9c1759726..a3e50520a 100644
--- a/lib/plugins/popularity/lang/ca/lang.php
+++ b/lib/plugins/popularity/lang/ca/lang.php
@@ -3,10 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Adolfo Jayme Barrientos <fito@libreoffice.org>
* @author Carles Bellver <carles.bellver@cent.uji.es>
- * @author Carles Bellver <carles.bellver@gmail.com>
- * @author carles.bellver@cent.uji.es
- * @author daniel@6temes.cat
+ * @author daniel <daniel@6temes.cat>
*/
$lang['name'] = 'Retroacció sobre popularitat (pot trigar una mica a carregar)';
$lang['submit'] = 'Envia dades';
+$lang['lastSent'] = 'S’han enviat les dades';
diff --git a/lib/plugins/popularity/lang/da/intro.txt b/lib/plugins/popularity/lang/da/intro.txt
index e2122c94d..9af7ce948 100644
--- a/lib/plugins/popularity/lang/da/intro.txt
+++ b/lib/plugins/popularity/lang/da/intro.txt
@@ -4,6 +4,6 @@ Dette værktøj samler anonyme oplysninge rom din wiki og giver dig mulighed for
Vi anbefaler dig til at gentage dette trin fra tid til anden for at holde udviklerne underrettede eftersom din wiki vokser. Dine anonyme datasamlinger vil blive tilkendegivet ved et anonymt navn.
-Opsamlede data indeholder oplysninger som eksempelvis din udgave af DokuWiki, antallet og størrelsen af dens sider, tilføjede udvidelse og oplysninger om din PHP-opsætning.
+Opsamlede data indeholder oplysninger som eksempelvis din udgave af DokuWiki, antallet og størrelsen af dens sider, tilføjede udvidelser og oplysninger om din PHP-opsætning.
De egentlige data, som vil blive sendt, er vist herunder. Brug venligst knappen 'Send Data' for at videresende oplysningerne. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/da/lang.php b/lib/plugins/popularity/lang/da/lang.php
index 715d6ac93..5e22a4b37 100644
--- a/lib/plugins/popularity/lang/da/lang.php
+++ b/lib/plugins/popularity/lang/da/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jacob Palm <mail@jacobpalm.dk>
* @author Kalle Sommer Nielsen <kalle@php.net>
* @author Esben Laursen <hyber@hyber.dk>
* @author Harith <haj@berlingske.dk>
@@ -13,7 +14,7 @@
*/
$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['autosubmit'] = 'Send automatisk 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:';
diff --git a/lib/plugins/popularity/lang/el/lang.php b/lib/plugins/popularity/lang/el/lang.php
index fe38a98f7..8e285cbe0 100644
--- a/lib/plugins/popularity/lang/el/lang.php
+++ b/lib/plugins/popularity/lang/el/lang.php
@@ -6,7 +6,7 @@
* @author Konstantinos Koryllos <koryllos@gmail.com>
* @author George Petsagourakis <petsagouris@gmail.com>
* @author Petros Vidalis <pvidalis@gmail.com>
- * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
+ * @author Vasileios Karavasilis <vasileioskaravasilis@gmail.com>
*/
$lang['name'] = 'Αναφορά Δημοτικότητας (ίσως αργήσει λίγο να εμφανιστεί)';
$lang['submit'] = 'Αποστολή Δεδομένων';
diff --git a/lib/plugins/popularity/lang/fa/lang.php b/lib/plugins/popularity/lang/fa/lang.php
index e6c642dc5..a13727d83 100644
--- a/lib/plugins/popularity/lang/fa/lang.php
+++ b/lib/plugins/popularity/lang/fa/lang.php
@@ -5,8 +5,7 @@
*
* @author behrad eslamifar <behrad_es@yahoo.com)
* @author Mohsen Firoozmandan <info@mambolearn.com>
- * @author omidmr@gmail.com
- * @author Omid Mottaghi <omidmr@gmail.com>
+ * @author omidmr <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
* @author Milad DZand <M.DastanZand@gmail.com>
* @author AmirH Hassaneini <mytechmix@gmail.com>
diff --git a/lib/plugins/popularity/lang/fi/lang.php b/lib/plugins/popularity/lang/fi/lang.php
index ec0fc4071..bea4f758b 100644
--- a/lib/plugins/popularity/lang/fi/lang.php
+++ b/lib/plugins/popularity/lang/fi/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Otto Vainio <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
* @author Sami Olmari <sami@olmari.fi>
diff --git a/lib/plugins/popularity/lang/is/lang.php b/lib/plugins/popularity/lang/is/lang.php
index 9add4cae4..0270d3fe2 100644
--- a/lib/plugins/popularity/lang/is/lang.php
+++ b/lib/plugins/popularity/lang/is/lang.php
@@ -1,5 +1,8 @@
<?php
+
/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
* Icelandic language file
*
* @author Hrannar Baldursson <hrannar.baldursson@gmail.com>
diff --git a/lib/plugins/popularity/lang/lt/lang.php b/lib/plugins/popularity/lang/lt/lang.php
index dca350475..c0cc342c7 100644
--- a/lib/plugins/popularity/lang/lt/lang.php
+++ b/lib/plugins/popularity/lang/lt/lang.php
@@ -2,8 +2,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author audrius.klevas@gmail.com
+ *
+ * @author audrius.klevas <audrius.klevas@gmail.com>
* @author Arunas Vaitekunas <aras@fan.lt>
*/
$lang['name'] = 'Populiarumo apklausa (gali užtrukti pakrovimas)';
diff --git a/lib/plugins/popularity/lang/no/lang.php b/lib/plugins/popularity/lang/no/lang.php
index 688cc4ff6..800c8a1cc 100644
--- a/lib/plugins/popularity/lang/no/lang.php
+++ b/lib/plugins/popularity/lang/no/lang.php
@@ -9,8 +9,7 @@
* @author Knut Staring <knutst@gmail.com>
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
- * @author Rune Rasmussen syntaxerror.no@gmail.com
+ * @author Rune Rasmussen <syntaxerror.no@gmail.com>
* @author Thomas Nygreen <nygreen@gmail.com>
* @author Jon Bøe <jonmagneboe@hotmail.com>
* @author Egil Hansen <egil@rosetta.no>
diff --git a/lib/plugins/popularity/lang/pt/intro.txt b/lib/plugins/popularity/lang/pt/intro.txt
index 9ec37e208..4a4bccc48 100644
--- a/lib/plugins/popularity/lang/pt/intro.txt
+++ b/lib/plugins/popularity/lang/pt/intro.txt
@@ -1,9 +1,9 @@
====== Retorno de Popularidade ======
-Esta ferramenta junta dados anónimos sobre o seu wiki e permite estes sejam enviados para a equipa de desenvolvimento do DokuWiki. Isto ajuda-os a compreender como o DokuWiki é usado pelos seus utilizadores de forma a permitir que desenvolvimentos futuros sejam baseadas em estatísticas de uso real.
+Esta [[doku>popularity|ferramenta]] junta dados anônimos sobre o seu wiki e envia-os para a equipe de desenvolvimento do DokuWiki. Isto ajuda-os a compreender como o DokuWiki é usado pelos seus usuários de forma a permitir que desenvolvimentos futuros sejam baseadas em estatísticas de uso real.
-Você é encorajado a repetir este passo regularmente para manter a equipa informada quando o seu wiki crescer. Os seus dados permanecerão sempre anónimos.
+Você é encorajado a repetir este passo regularmente para manter a equipe informada quando o seu wiki crescer. Os seus dados permanecerão sempre anônimos.
-Os dados colectados contêm informação como a versão do DokuWiki que você utiliza, o número e tamanho das suas páginas e ficheiros, os plugins instalados e informação sobre a sua instalação do PHP.
+Os dados coletados contêm informação como a versão do DokuWiki que você utiliza, o número e tamanho das suas páginas e ficheiros, os plugins instalados e informação sobre a sua instalação do PHP.
Os dados que serão enviados são mostrados abaixo. Use o botão "Enviar Dados" para transferir a informação. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/pt/lang.php b/lib/plugins/popularity/lang/pt/lang.php
index a14d176d7..792fb3797 100644
--- a/lib/plugins/popularity/lang/pt/lang.php
+++ b/lib/plugins/popularity/lang/pt/lang.php
@@ -3,12 +3,13 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
- * @author José Campos zecarlosdecampos@gmail.com
+ * @author José Campos <zecarlosdecampos@gmail.com>
*/
-$lang['name'] = 'Retorno (feedback) de Popularidade (pode levar algum tempo a carregar)';
+$lang['name'] = 'Retorno de Popularidade (pode levar algum tempo a carregar)';
$lang['submit'] = 'Enviar Dados';
$lang['autosubmit'] = 'Enviar dados automáticamente uma vez por mês';
$lang['submissionFailed'] = 'Os dados não foram enviados devido ao seguinte erro:';
diff --git a/lib/plugins/popularity/lang/ro/lang.php b/lib/plugins/popularity/lang/ro/lang.php
index 4a3130ad5..4f6c8476b 100644
--- a/lib/plugins/popularity/lang/ro/lang.php
+++ b/lib/plugins/popularity/lang/ro/lang.php
@@ -4,12 +4,8 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Emanuel-Emeric Andrasi <n30@mandrivausers.ro>
- * @author Emanuel-Emeric Andrași <n30@mandrivausers.ro>
* @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/sr/lang.php b/lib/plugins/popularity/lang/sr/lang.php
index b67aaa8ef..fe768f370 100644
--- a/lib/plugins/popularity/lang/sr/lang.php
+++ b/lib/plugins/popularity/lang/sr/lang.php
@@ -3,8 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
- * @author Иван Петровић petrovicivan@ubuntusrbija.org
- * @author Ivan Petrovic <petrovicivan@ubuntusrbija.org>
+ * @author Иван Петровић <petrovicivan@ubuntusrbija.org>
* @author Miroslav Šolti <solti.miroslav@gmail.com>
*/
$lang['name'] = 'Мерење популарности (може потрајати док се не учита)';
diff --git a/lib/plugins/popularity/lang/th/lang.php b/lib/plugins/popularity/lang/th/lang.php
index f6a736a06..5601acfd2 100644
--- a/lib/plugins/popularity/lang/th/lang.php
+++ b/lib/plugins/popularity/lang/th/lang.php
@@ -2,9 +2,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Komgrit Niyomrath <n.komgrit@gmail.com>
- * @author Kittithat Arnontavilas mrtomyum@gmail.com
* @author Kittithat Arnontavilas <mrtomyum@gmail.com>
* @author Thanasak Sompaisansin <jombthep@gmail.com>
*/
diff --git a/lib/plugins/popularity/lang/tr/lang.php b/lib/plugins/popularity/lang/tr/lang.php
index 696ee38dc..7e837efeb 100644
--- a/lib/plugins/popularity/lang/tr/lang.php
+++ b/lib/plugins/popularity/lang/tr/lang.php
@@ -2,12 +2,12 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Aydın Coşkuner <aydinweb@gmail.com>
* @author Cihan Kahveci <kahvecicihan@gmail.com>
* @author Yavuz Selim <yavuzselim@gmail.com>
* @author Caleb Maclennan <caleb@alerque.com>
- * @author farukerdemoncel@gmail.com
+ * @author farukerdemoncel <farukerdemoncel@gmail.com>
*/
$lang['name'] = 'Popülerlik Geribeslemesi (yüklemesi uzun sürebilir)';
$lang['submit'] = 'Verileri Gönder';
diff --git a/lib/plugins/popularity/lang/vi/intro.txt b/lib/plugins/popularity/lang/vi/intro.txt
new file mode 100644
index 000000000..4f06b394e
--- /dev/null
+++ b/lib/plugins/popularity/lang/vi/intro.txt
@@ -0,0 +1,9 @@
+====== Phản hồi độ phổ biến ======
+
+[[doku>popularity|Công cụ này]] thu thập dữ liệu ẩn danh về wiki của bạn và cho phép bạn gửi lại cho nhà phát triển DokuWiki. Điều này giúp họ hiểu cách người dùng sử dụng DokuWiki và đảm bảo các quyết định phát triển trong tương lai được hỗ trợ bởi các thống kê sử dụng trong thế giới thực.
+
+Thỉnh thoảng bạn nên lặp lại bước này để thông báo cho các nhà phát triển khi wiki của bạn phát triển. Bộ dữ liệu lặp lại của bạn sẽ được xác định bởi một ID ẩn danh.
+
+Dữ liệu được thu thập chứa thông tin như phiên bản DokuWiki của bạn, số lượng, kích thước của các trang và tập tin của bạn, các plugin đã cài đặt và thông tin về cài đặt PHP của bạn.
+
+Dữ liệu thô sẽ gửi được hiển thị dưới đây. Vui lòng sử dụng nút "Gửi dữ liệu" để chuyển thông tin. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/vi/lang.php b/lib/plugins/popularity/lang/vi/lang.php
new file mode 100644
index 000000000..f8be56793
--- /dev/null
+++ b/lib/plugins/popularity/lang/vi/lang.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['name'] = 'Phản hồi độ phổ biến (có thể mất một chút thời gian tải)';
+$lang['submit'] = 'Gửi dữ liệu';
+$lang['autosubmit'] = 'Tự động gửi dữ liệu mỗi tháng một lần';
+$lang['submissionFailed'] = 'Dữ liệu không thể được gửi do lỗi sau:';
+$lang['submitDirectly'] = 'Bạn có thể gửi dữ liệu theo cách thủ công bằng cách gửi biểu mẫu sau.';
+$lang['autosubmitError'] = 'Tự động gửi cuối cùng không thành công, vì lỗi sau:';
+$lang['lastSent'] = 'Dữ liệu đã được gửi';
diff --git a/lib/plugins/popularity/lang/vi/submitted.txt b/lib/plugins/popularity/lang/vi/submitted.txt
new file mode 100644
index 000000000..8c4abc745
--- /dev/null
+++ b/lib/plugins/popularity/lang/vi/submitted.txt
@@ -0,0 +1,3 @@
+====== Phản hồi độ phổ biến ======
+
+Dữ liệu đã được gửi thành công. \ No newline at end of file
diff --git a/lib/plugins/remote.php b/lib/plugins/remote.php
index c2253dbd5..a3cbec722 100644
--- a/lib/plugins/remote.php
+++ b/lib/plugins/remote.php
@@ -1,104 +1,2 @@
<?php
-
-/**
- * Class DokuWiki_Remote_Plugin
- */
-abstract class DokuWiki_Remote_Plugin extends DokuWiki_Plugin {
-
- private $api;
-
- /**
- * Constructor
- */
- public function __construct() {
- $this->api = new RemoteAPI();
- }
-
- /**
- * Get all available methods with remote access.
- *
- * By default it exports all public methods of a remote plugin. Methods beginning
- * with an underscore are skipped.
- *
- * @return array Information about all provided methods. {@see RemoteAPI}.
- */
- public function _getMethods() {
- $result = array();
-
- $reflection = new \ReflectionClass($this);
- foreach($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
- // skip parent methods, only methods further down are exported
- $declaredin = $method->getDeclaringClass()->name;
- if($declaredin == 'DokuWiki_Plugin' || $declaredin == 'DokuWiki_Remote_Plugin') continue;
- $method_name = $method->name;
- if(substr($method_name, 0, 1) == '_') continue;
-
- // strip asterisks
- $doc = $method->getDocComment();
- $doc = preg_replace(
- array('/^[ \t]*\/\*+[ \t]*/m', '/[ \t]*\*+[ \t]*/m', '/\*+\/\s*$/m','/\s*\/\s*$/m'),
- array('', '', '', ''),
- $doc
- );
-
- // prepare data
- $data = array();
- $data['name'] = $method_name;
- $data['public'] = 0;
- $data['doc'] = $doc;
- $data['args'] = array();
-
- // get parameter type from doc block type hint
- foreach($method->getParameters() as $parameter) {
- $name = $parameter->name;
- $type = 'string'; // we default to string
- if(preg_match('/^@param[ \t]+([\w|\[\]]+)[ \t]\$'.$name.'/m', $doc, $m)){
- $type = $this->cleanTypeHint($m[1]);
- }
- $data['args'][] = $type;
- }
-
- // get return type from doc block type hint
- if(preg_match('/^@return[ \t]+([\w|\[\]]+)/m', $doc, $m)){
- $data['return'] = $this->cleanTypeHint($m[1]);
- } else {
- $data['return'] = 'string';
- }
-
- // add to result
- $result[$method_name] = $data;
- }
-
- return $result;
- }
-
- /**
- * Matches the given type hint against the valid options for the remote API
- *
- * @param string $hint
- * @return string
- */
- protected function cleanTypeHint($hint) {
- $types = explode('|', $hint);
- foreach($types as $t) {
- if(substr($t, -2) == '[]') {
- return 'array';
- }
- if($t == 'boolean') {
- return 'bool';
- }
- if(in_array($t, array('array', 'string', 'int', 'double', 'bool', 'null', 'date', 'file'))) {
- return $t;
- }
- }
- return 'string';
- }
-
- /**
- * @return RemoteAPI
- */
- protected function getApi() {
- return $this->api;
- }
-
-}
+dbg_deprecated('Autoloading. Do not require() files yourself.');
diff --git a/lib/plugins/revert/admin.php b/lib/plugins/revert/admin.php
index 1a0300585..2d11dc05a 100644
--- a/lib/plugins/revert/admin.php
+++ b/lib/plugins/revert/admin.php
@@ -1,66 +1,73 @@
<?php
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
+
+use dokuwiki\ChangeLog\PageChangeLog;
/**
* All DokuWiki plugins to extend the admin function
* need to inherit from this class
*/
-class admin_plugin_revert extends DokuWiki_Admin_Plugin {
- var $cmd;
+class admin_plugin_revert extends DokuWiki_Admin_Plugin
+{
+ protected $cmd;
// some vars which might need tuning later
- var $max_lines = 800; // lines to read from changelog
- var $max_revs = 20; // numer of old revisions to check
+ protected $max_lines = 800; // lines to read from changelog
+ protected $max_revs = 20; // numer of old revisions to check
/**
* Constructor
*/
- function __construct(){
+ public function __construct()
+ {
$this->setupLocale();
}
/**
* access for managers
*/
- function forAdminOnly(){
+ public function forAdminOnly()
+ {
return false;
}
/**
* return sort order for position in admin menu
*/
- function getMenuSort() {
+ public function getMenuSort()
+ {
return 40;
}
/**
* handle user request
*/
- function handle() {
+ public function handle()
+ {
}
/**
* output appropriate html
*/
- function html() {
+ public function html()
+ {
global $INPUT;
echo $this->locale_xhtml('intro');
- $this->_searchform();
+ $this->printSearchForm();
- if(is_array($INPUT->param('revert')) && checkSecurityToken()){
- $this->_revert($INPUT->arr('revert'),$INPUT->str('filter'));
- }elseif($INPUT->has('filter')){
- $this->_list($INPUT->str('filter'));
+ if (is_array($INPUT->param('revert')) && checkSecurityToken()) {
+ $this->revertEdits($INPUT->arr('revert'), $INPUT->str('filter'));
+ } elseif ($INPUT->has('filter')) {
+ $this->listEdits($INPUT->str('filter'));
}
}
/**
* Display the form for searching spam pages
*/
- function _searchform(){
+ protected function printSearchForm()
+ {
global $lang, $INPUT;
echo '<form action="" method="post"><div class="no">';
echo '<label>'.$this->getLang('filter').': </label>';
@@ -73,31 +80,32 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
/**
* Start the reversion process
*/
- function _revert($revert,$filter){
+ protected function revertEdits($revert, $filter)
+ {
echo '<hr /><br />';
echo '<p>'.$this->getLang('revstart').'</p>';
echo '<ul>';
- foreach($revert as $id){
+ foreach ($revert as $id) {
global $REV;
// find the last non-spammy revision
$data = '';
$pagelog = new PageChangeLog($id);
$old = $pagelog->getRevisions(0, $this->max_revs);
- if(count($old)){
- foreach($old as $REV){
- $data = rawWiki($id,$REV);
- if(strpos($data,$filter) === false) break;
+ if (count($old)) {
+ foreach ($old as $REV) {
+ $data = rawWiki($id, $REV);
+ if (strpos($data, $filter) === false) break;
}
}
- if($data){
- saveWikiText($id,$data,'old revision restored',false);
- printf('<li><div class="li">'.$this->getLang('reverted').'</div></li>',$id,$REV);
- }else{
- saveWikiText($id,'','',false);
- printf('<li><div class="li">'.$this->getLang('removed').'</div></li>',$id);
+ if ($data) {
+ saveWikiText($id, $data, 'old revision restored', false);
+ printf('<li><div class="li">'.$this->getLang('reverted').'</div></li>', $id, $REV);
+ } else {
+ saveWikiText($id, '', '', false);
+ printf('<li><div class="li">'.$this->getLang('removed').'</div></li>', $id);
}
@set_time_limit(10);
flush();
@@ -110,7 +118,8 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
/**
* List recent edits matching the given filter
*/
- function _list($filter){
+ protected function listEdits($filter)
+ {
global $conf;
global $lang;
echo '<hr /><br />';
@@ -118,13 +127,13 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
echo '<input type="hidden" name="filter" value="'.hsc($filter).'" />';
formSecurityToken();
- $recents = getRecents(0,$this->max_lines);
+ $recents = getRecents(0, $this->max_lines);
echo '<ul>';
$cnt = 0;
- foreach($recents as $recent){
- if($filter){
- if(strpos(rawWiki($recent['id']),$filter) === false) continue;
+ foreach ($recents as $recent) {
+ if ($filter) {
+ if (strpos(rawWiki($recent['id']), $filter) === false) continue;
}
$cnt++;
@@ -132,10 +141,11 @@ 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 '<input type="checkbox" name="revert[]" value="'.hsc($recent['id']).
+ '" checked="checked" id="revert__'.$cnt.'" />';
echo ' <label for="revert__'.$cnt.'">'.$date.'</label> ';
- echo '<a href="'.wl($recent['id'],"do=diff").'">';
+ echo '<a href="'.wl($recent['id'], "do=diff").'">';
$p = array();
$p['src'] = DOKU_BASE.'lib/images/diff.png';
$p['width'] = 15;
@@ -146,7 +156,7 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
echo "<img $att />";
echo '</a> ';
- echo '<a href="'.wl($recent['id'],"do=revisions").'">';
+ echo '<a href="'.wl($recent['id'], "do=revisions").'">';
$p = array();
$p['src'] = DOKU_BASE.'lib/images/history.png';
$p['width'] = 12;
@@ -157,7 +167,7 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
echo "<img $att />";
echo '</a> ';
- echo html_wikilink(':'.$recent['id'],(useHeading('navigation'))?null:$recent['id']);
+ echo html_wikilink(':'.$recent['id'], (useHeading('navigation'))?null:$recent['id']);
echo ' – '.htmlspecialchars($recent['sum']);
echo ' <span class="user">';
@@ -174,11 +184,10 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
echo '<p>';
echo '<button type="submit">'.$this->getLang('revert').'</button> ';
- printf($this->getLang('note2'),hsc($filter));
+ printf($this->getLang('note2'), hsc($filter));
echo '</p>';
echo '</div></form>';
}
-
}
//Setup VIM: ex: et ts=4 :
diff --git a/lib/plugins/revert/lang/ar/lang.php b/lib/plugins/revert/lang/ar/lang.php
index 6262cc674..57e1b32b4 100644
--- a/lib/plugins/revert/lang/ar/lang.php
+++ b/lib/plugins/revert/lang/ar/lang.php
@@ -2,10 +2,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
+ * @author Khalid <khalid.aljahil@gmail.com>
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
- * @author uahello@gmail.com
* @author Ahmad Abd-Elghany <tolpa1@gmail.com>
* @author alhajr <alhajr300@gmail.com>
* @author Mohamed Belhsine <b.mohamed897@gmail.com>
diff --git a/lib/plugins/revert/lang/bg/lang.php b/lib/plugins/revert/lang/bg/lang.php
index 5062a12ad..f68db5b0e 100644
--- a/lib/plugins/revert/lang/bg/lang.php
+++ b/lib/plugins/revert/lang/bg/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
* @author Kiril <neohidra@gmail.com>
diff --git a/lib/plugins/revert/lang/ca/lang.php b/lib/plugins/revert/lang/ca/lang.php
index a2a7915f3..15223578e 100644
--- a/lib/plugins/revert/lang/ca/lang.php
+++ b/lib/plugins/revert/lang/ca/lang.php
@@ -4,10 +4,8 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Carles Bellver <carles.bellver@gmail.com>
- * @author carles.bellver@gmail.com
- * @author carles.bellver@cent.uji.es
- * @author Carles Bellver <carles.bellver@cent.uji.es>
- * @author daniel@6temes.cat
+ * @author carles.bellver <carles.bellver@cent.uji.es>
+ * @author daniel <daniel@6temes.cat>
*/
$lang['menu'] = 'Gestió de reversions';
$lang['filter'] = 'Cerca pàgines brossa';
diff --git a/lib/plugins/revert/lang/cs/lang.php b/lib/plugins/revert/lang/cs/lang.php
index fd9e332c8..98d6e9e57 100644
--- a/lib/plugins/revert/lang/cs/lang.php
+++ b/lib/plugins/revert/lang/cs/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
+ * @author Petr Kajzar <petr.kajzar@lf1.cuni.cz>
+ * @author Robert Surý <rsurycz@seznam.cz>
+ * @author Martin Hořínek <hev@hev.cz>
* @author Jonáš Dyba <jonas.dyba@gmail.com>
* @author Bohumir Zamecnik <bohumir@zamecnik.org>
* @author Zbynek Krivka <zbynek.krivka@seznam.cz>
diff --git a/lib/plugins/revert/lang/da/intro.txt b/lib/plugins/revert/lang/da/intro.txt
index fdb0c5f32..9ce18ec43 100644
--- a/lib/plugins/revert/lang/da/intro.txt
+++ b/lib/plugins/revert/lang/da/intro.txt
@@ -1,3 +1,3 @@
===== Gendannelsesstyring =====
-Denne side hjælper dig med at gendanne sider efter et angreb af uønskede indlæg. For at finde en liste af sider, der muligvis er blevet ændret, så skriv en søgestreng (for eksempel. en uønsket netadresse) og bekræft, at de fundne sider virkeligt er uønskede og gendan ændringerne. \ No newline at end of file
+Denne side hjælper dig med at gendanne sider efter et angreb af spam. For at finde en liste af sider, der muligvis er blevet ændret, så skriv en søgestreng (f.eks. en uønsket netadresse) og bekræft, at de fundne sider virkeligt er uønskede og gendan ændringerne. \ No newline at end of file
diff --git a/lib/plugins/revert/lang/da/lang.php b/lib/plugins/revert/lang/da/lang.php
index 11114bd1b..2dee82ff7 100644
--- a/lib/plugins/revert/lang/da/lang.php
+++ b/lib/plugins/revert/lang/da/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jacob Palm <mail@jacobpalm.dk>
* @author Kalle Sommer Nielsen <kalle@php.net>
* @author Esben Laursen <hyber@hyber.dk>
* @author Harith <haj@berlingske.dk>
@@ -14,7 +15,7 @@
$lang['menu'] = 'Gendannelsesstyring';
$lang['filter'] = 'Søg efter uønskede sider';
$lang['revert'] = 'Gendan valgte sider';
-$lang['reverted'] = '%s gendannet til ændring %s';
+$lang['reverted'] = '%s gendannet til revision %s';
$lang['removed'] = '%s fjernet';
$lang['revstart'] = 'Gendannelsesforløbet er startet. Dette kan tage et stykke tid. Hvis kodefilen giver "time out" før processen færdiggøres, skal du gendanne i mindre dele.';
$lang['revstop'] = 'Gendannelsesforløbet fuldført uden fejl';
diff --git a/lib/plugins/revert/lang/el/lang.php b/lib/plugins/revert/lang/el/lang.php
index 48bbb22d0..5f1e345c6 100644
--- a/lib/plugins/revert/lang/el/lang.php
+++ b/lib/plugins/revert/lang/el/lang.php
@@ -8,7 +8,7 @@
* @author Konstantinos Koryllos <koryllos@gmail.com>
* @author George Petsagourakis <petsagouris@gmail.com>
* @author Petros Vidalis <pvidalis@gmail.com>
- * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
+ * @author Vasileios Karavasilis <vasileioskaravasilis@gmail.com>
*/
$lang['menu'] = 'Αποκατάσταση κακόβουλων αλλαγών σελίδων';
$lang['filter'] = 'Αναζήτηση σελίδων που περιέχουν spam';
diff --git a/lib/plugins/revert/lang/fa/lang.php b/lib/plugins/revert/lang/fa/lang.php
index c6e41ea22..073b254e8 100644
--- a/lib/plugins/revert/lang/fa/lang.php
+++ b/lib/plugins/revert/lang/fa/lang.php
@@ -5,8 +5,7 @@
*
* @author behrad eslamifar <behrad_es@yahoo.com)
* @author Mohsen Firoozmandan <info@mambolearn.com>
- * @author omidmr@gmail.com
- * @author Omid Mottaghi <omidmr@gmail.com>
+ * @author omidmr <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
* @author Milad DZand <M.DastanZand@gmail.com>
* @author AmirH Hassaneini <mytechmix@gmail.com>
diff --git a/lib/plugins/revert/lang/fi/lang.php b/lib/plugins/revert/lang/fi/lang.php
index d14f527f9..02b4d35b2 100644
--- a/lib/plugins/revert/lang/fi/lang.php
+++ b/lib/plugins/revert/lang/fi/lang.php
@@ -2,9 +2,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author otto@valjakko.net
- * @author Otto Vainio <otto@valjakko.net>
+ *
+ * @author otto <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
* @author Sami Olmari <sami@olmari.fi>
*/
diff --git a/lib/plugins/revert/lang/is/lang.php b/lib/plugins/revert/lang/is/lang.php
index 9de404992..6923395cd 100644
--- a/lib/plugins/revert/lang/is/lang.php
+++ b/lib/plugins/revert/lang/is/lang.php
@@ -1,5 +1,8 @@
<?php
+
/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
* Icelandic language file
*
* @author Hrannar Baldursson <hrannar.baldursson@gmail.com>
diff --git a/lib/plugins/revert/lang/ja/lang.php b/lib/plugins/revert/lang/ja/lang.php
index 1bca8a7c4..60423e8b0 100644
--- a/lib/plugins/revert/lang/ja/lang.php
+++ b/lib/plugins/revert/lang/ja/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
* @author Yuji Takenaka <webmaster@davilin.com>
* @author Ikuo Obataya <i.obataya@gmail.com>
* @author Daniel Dupriest <kououken@gmail.com>
@@ -12,10 +13,10 @@
*/
$lang['menu'] = '復元管理';
$lang['filter'] = 'スパムを受けたページを検索';
-$lang['revert'] = '選択したページを検索';
+$lang['revert'] = '選択したページを復元';
$lang['reverted'] = '%s はリビジョン %s へ復元されました';
$lang['removed'] = '%s は削除されました';
-$lang['revstart'] = '復元処理中です。時間が掛かる可能性がありますが、もしタイムアウトした場合は、復元を複数回に分けて行ってください。';
+$lang['revstart'] = '復元処理中です。処理には時間が掛かる可能性があります。もしタイムアウトした場合は、復元を複数回に分けて行ってください。';
$lang['revstop'] = '復元処理が正しく完了しました。';
$lang['note1'] = '注意:検索語句は大文字・小文字を区別します';
-$lang['note2'] = '注意:最新の内容に検索したスパムキーワード <i>%s</i> が含まれていないページが復元されます。';
+$lang['note2'] = '注意:検索したスパムキーワード <i>%s</i> が含まれていない版のうち、最新のものに復元されます。';
diff --git a/lib/plugins/revert/lang/ko/lang.php b/lib/plugins/revert/lang/ko/lang.php
index f9e16cc09..a71dc067a 100644
--- a/lib/plugins/revert/lang/ko/lang.php
+++ b/lib/plugins/revert/lang/ko/lang.php
@@ -3,6 +3,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author pavement <pavement@rael.cc>
+ * @author Traend <Traend@ruu.kr>
* @author Seungheon Song <esketch@gmail.com>
* @author jk Lee
* @author dongnak <dongnak@gmail.com>
diff --git a/lib/plugins/revert/lang/no/lang.php b/lib/plugins/revert/lang/no/lang.php
index 88c25af36..3e65a94b5 100644
--- a/lib/plugins/revert/lang/no/lang.php
+++ b/lib/plugins/revert/lang/no/lang.php
@@ -3,6 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Torgeir Blesvik <bletor@banenor.no>
+ * @author Rut Kristin Aanestad <dark@met.no>
+ * @author ThorPrestboen <thor.erling.prestboen@gmail.com>
+ * @author Christian McKenna <mckchr@banenor.no>
* @author Thomas Nygreen <nygreen@gmail.com>
* @author Arild Burud <arildb@met.no>
* @author Torkill Bruland <torkar-b@online.no>
@@ -12,8 +16,7 @@
* @author Knut Staring <knutst@gmail.com>
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
- * @author Rune Rasmussen syntaxerror.no@gmail.com
+ * @author Rune Rasmussen <syntaxerror.no@gmail.com>
* @author Jon Bøe <jonmagneboe@hotmail.com>
* @author Egil Hansen <egil@rosetta.no>
* @author Thomas Juberg <Thomas.Juberg@Gmail.com>
@@ -22,7 +25,6 @@
* @author Patrick <spill.p@hotmail.com>
* @author Danny Buckhof <daniel.raknes@hotmail.no>
* @author Arne Hanssen <arne.hanssen@getmail.no>
- * @author Arne Hanssen <arnehans@getmail.no>
* @author Patrick Sletvold <patricksletvold@hotmail.com>
*/
$lang['menu'] = 'Tilbakestillingsbehandler';
diff --git a/lib/plugins/revert/lang/pt/intro.txt b/lib/plugins/revert/lang/pt/intro.txt
index 7adfe5f21..f5514839c 100644
--- a/lib/plugins/revert/lang/pt/intro.txt
+++ b/lib/plugins/revert/lang/pt/intro.txt
@@ -1,3 +1,3 @@
-====== Gerir Reversões ======
+====== Gerenciar Reversões ======
-Esta página ajuda a reverter automaticamente de um ataque spam. Para encontrar as páginas afectadas insira primeiro um texto de pesquisa (i.e spam URL), confirme as páginas encontradas como sendo resultantes de um ataque spam e reverta essas edições. \ No newline at end of file
+Esta página ajuda a reverter automaticamente de um ataque de spam. Para encontrar as páginas afetadas insira primeiro um texto de pesquisa (ie, uma URL de spam), confirme as páginas encontradas como sendo resultantes de um ataque spam e reverta essas edições. \ No newline at end of file
diff --git a/lib/plugins/revert/lang/pt/lang.php b/lib/plugins/revert/lang/pt/lang.php
index 665b846bf..73c5db72d 100644
--- a/lib/plugins/revert/lang/pt/lang.php
+++ b/lib/plugins/revert/lang/pt/lang.php
@@ -3,18 +3,19 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
* @author José Monteiro <Jose.Monteiro@DoWeDo-IT.com>
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
- * @author José Campos zecarlosdecampos@gmail.com
+ * @author José Campos <zecarlosdecampos@gmail.com>
*/
-$lang['menu'] = 'Gestor de Reversões';
+$lang['menu'] = 'Gerenciador de Reversões';
$lang['filter'] = 'Pesquisar por páginas "spammy"';
-$lang['revert'] = 'Reverter páginas seleccionadas';
+$lang['revert'] = 'Reverter páginas selecionadas';
$lang['reverted'] = '%s revertida para revisão %s';
-$lang['removed'] = '%s removidas.';
+$lang['removed'] = '%s removidas';
$lang['revstart'] = 'Processo de reversão iniciado. A sua execução pode demorar. Se der timeout antes de terminar então é preciso escolher quantidades menores de páginas a reverter.';
$lang['revstop'] = 'Processo de reversão bem sucedido.';
-$lang['note1'] = 'Nota: a pesquisa é case-sensitive';
+$lang['note1'] = 'Nota: esta pesquisa é case-sensitive';
$lang['note2'] = 'Nota: a página será revertida para a versão anterior que não contém os termos spam pesquisados: <i>%s</i>.';
diff --git a/lib/plugins/revert/lang/ro/lang.php b/lib/plugins/revert/lang/ro/lang.php
index 663447e6a..6fde325db 100644
--- a/lib/plugins/revert/lang/ro/lang.php
+++ b/lib/plugins/revert/lang/ro/lang.php
@@ -4,14 +4,9 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Sergiu Baltariu <s_baltariu@yahoo.com>
- * @author s_baltariu@yahoo.com
* @author Emanuel-Emeric Andrasi <n30@mandrivausers.ro>
- * @author Emanuel-Emeric Andrași <n30@mandrivausers.ro>
* @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/intro.txt b/lib/plugins/revert/lang/ru/intro.txt
index 52d1f8d3d..93f8b8286 100644
--- a/lib/plugins/revert/lang/ru/intro.txt
+++ b/lib/plugins/revert/lang/ru/intro.txt
@@ -1,3 +1,3 @@
====== Менеджер откаток ======
-Эта страница поможет вам в автоматической откатке изменений после спам-атаки. Для того, чтобы найти спам-страницы, введите ключевые слова и произведите поиск (например, по URL спамера). Затем убедитесь, что найденные страницы действительно содержат спам и сделайте откатку изменений.
+Эта страница поможет вам в автоматической откатке изменений после спам-атаки. Для того чтобы найти спам-страницы, введите ключевые слова и произведите поиск (например, по URL спамера). Затем убедитесь, что найденные страницы действительно содержат спам и сделайте откатку изменений.
diff --git a/lib/plugins/revert/lang/ru/lang.php b/lib/plugins/revert/lang/ru/lang.php
index 5de67b470..3890db44b 100644
--- a/lib/plugins/revert/lang/ru/lang.php
+++ b/lib/plugins/revert/lang/ru/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
* @author Denis Simakov <akinoame1@gmail.com>
* @author Andrew Pleshakov <beotiger@mail.ru>
* @author Змей Этерийский <evil_snake@eternion.ru>
@@ -12,7 +13,6 @@
* @author Kirill Krasnov <krasnovforum@gmail.com>
* @author Vlad Tsybenko <vlad.development@gmail.com>
* @author Aleksey Osadchiy <rfc@nm.ru>
- * @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>
@@ -22,7 +22,7 @@ $lang['filter'] = 'Поиск спам-страниц';
$lang['revert'] = 'Откатить изменения для выбранных страниц';
$lang['reverted'] = '%s возвращена к версии %s';
$lang['removed'] = '%s удалена';
-$lang['revstart'] = 'Начат процесс откатки. Он может занять много времени. Если скрипт не успевает завершить работу и выдаёт ошибку, необходимо произвести откатку более маленькими частями.';
+$lang['revstart'] = 'Начат процесс откатки. Он может занять много времени. Если скрипт не успевает завершить работу и выдаёт ошибку, необходимо произвести откатку небольшими частями.';
$lang['revstop'] = 'Процесс откатки успешно завершён.';
$lang['note1'] = 'Замечание: поиск с учётом регистра';
$lang['note2'] = 'Замечание: страница будет восстановлена до последней версии, не содержащей спам-термин <i>%s</i>.';
diff --git a/lib/plugins/revert/lang/sr/lang.php b/lib/plugins/revert/lang/sr/lang.php
index e0ac43971..2a3d9432d 100644
--- a/lib/plugins/revert/lang/sr/lang.php
+++ b/lib/plugins/revert/lang/sr/lang.php
@@ -3,8 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
- * @author Иван Петровић petrovicivan@ubuntusrbija.org
- * @author Ivan Petrovic <petrovicivan@ubuntusrbija.org>
+ * @author Иван Петровић <petrovicivan@ubuntusrbija.org>
* @author Miroslav Šolti <solti.miroslav@gmail.com>
*/
$lang['menu'] = 'Управљач за враћање';
diff --git a/lib/plugins/revert/lang/th/lang.php b/lib/plugins/revert/lang/th/lang.php
index 7b6217b7c..0df04c322 100644
--- a/lib/plugins/revert/lang/th/lang.php
+++ b/lib/plugins/revert/lang/th/lang.php
@@ -2,11 +2,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Komgrit Niyomrath <n.komgrit@gmail.com>
- * @author Kittithat Arnontavilas mrtomyum@gmail.com
- * @author Arthit Suriyawongkul <arthit@gmail.com>
* @author Kittithat Arnontavilas <mrtomyum@gmail.com>
+ * @author Arthit Suriyawongkul <arthit@gmail.com>
* @author Thanasak Sompaisansin <jombthep@gmail.com>
*/
$lang['menu'] = 'ตัวจัดการคืนสภาพเอกสารฉบับเดิม';
diff --git a/lib/plugins/revert/lang/tr/lang.php b/lib/plugins/revert/lang/tr/lang.php
index 52d28c6fa..ca903cdac 100644
--- a/lib/plugins/revert/lang/tr/lang.php
+++ b/lib/plugins/revert/lang/tr/lang.php
@@ -2,12 +2,12 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Aydın Coşkuner <aydinweb@gmail.com>
* @author Cihan Kahveci <kahvecicihan@gmail.com>
* @author Yavuz Selim <yavuzselim@gmail.com>
* @author Caleb Maclennan <caleb@alerque.com>
- * @author farukerdemoncel@gmail.com
+ * @author farukerdemoncel <farukerdemoncel@gmail.com>
*/
$lang['menu'] = 'Eskiye Döndürme';
$lang['filter'] = 'Spam bulunan sayfaları ara';
diff --git a/lib/plugins/revert/lang/vi/intro.txt b/lib/plugins/revert/lang/vi/intro.txt
new file mode 100644
index 000000000..9b26a28bf
--- /dev/null
+++ b/lib/plugins/revert/lang/vi/intro.txt
@@ -0,0 +1,3 @@
+====== Quản lý lùi sửa ======
+
+Trang này giúp bạn hồi sửa tự động các cuộc spam tấn công. Để tìm danh sách các trang spam, trước tiên, hãy nhập chuỗi tìm kiếm (ví dụ: URL spam), sau đó xác nhận rằng các trang tìm thấy thực sự là spam và lùi lại các sửa đổi. \ No newline at end of file
diff --git a/lib/plugins/revert/lang/vi/lang.php b/lib/plugins/revert/lang/vi/lang.php
new file mode 100644
index 000000000..eb86c66c0
--- /dev/null
+++ b/lib/plugins/revert/lang/vi/lang.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['menu'] = 'Quản lý lùi sửa';
+$lang['filter'] = 'Tìm kiếm các trang spam';
+$lang['revert'] = 'Lùi sửa các trang đã chọn';
+$lang['reverted'] = 'Đã lùi sửa %s về phiên bản %s';
+$lang['removed'] = 'Đã xóa %s';
+$lang['revstart'] = 'Quá trình đảo ngược bắt đầu. Việc này có thể mất một thời gian. Nếu
+ kịch bản hết thời gian trước khi hoàn thành, bạn cần lùi sửa nhỏ hơn, đơn lẻ.';
+$lang['revstop'] = 'Quá trình đảo ngược kết thúc thành công.';
+$lang['note1'] = 'Lưu ý: tìm kiếm này là trường hợp nhạy cảm';
+$lang['note2'] = 'Lưu ý: trang sẽ được lùi sửa về phiên bản cuối cùng không chứa thuật ngữ spam đã cho <i>%s</i>.';
diff --git a/lib/plugins/safefnrecode/action.php b/lib/plugins/safefnrecode/action.php
index 9127f8df2..952d95c90 100644
--- a/lib/plugins/safefnrecode/action.php
+++ b/lib/plugins/safefnrecode/action.php
@@ -6,63 +6,63 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
-// must be run within Dokuwiki
-if (!defined('DOKU_INC')) die();
-
-require_once DOKU_PLUGIN.'action.php';
-
-class action_plugin_safefnrecode extends DokuWiki_Action_Plugin {
-
- public function register(Doku_Event_Handler $controller) {
-
- $controller->register_hook('INDEXER_TASKS_RUN', 'BEFORE', $this, 'handle_indexer_tasks_run');
+class action_plugin_safefnrecode extends DokuWiki_Action_Plugin
+{
+ /** @inheritdoc */
+ public function register(Doku_Event_Handler $controller)
+ {
+ $controller->register_hook('INDEXER_TASKS_RUN', 'BEFORE', $this, 'handleIndexerTasksRun');
}
- public function handle_indexer_tasks_run(Doku_Event &$event, $param) {
+ /**
+ * Handle indexer event
+ *
+ * @param Doku_Event $event
+ * @param $param
+ */
+ public function handleIndexerTasksRun(Doku_Event $event, $param)
+ {
global $conf;
- if($conf['fnencode'] != 'safe') return;
+ if ($conf['fnencode'] != 'safe') return;
- if(!file_exists($conf['datadir'].'_safefn.recoded')){
+ if (!file_exists($conf['datadir'].'_safefn.recoded')) {
$this->recode($conf['datadir']);
touch($conf['datadir'].'_safefn.recoded');
}
- if(!file_exists($conf['olddir'].'_safefn.recoded')){
+ if (!file_exists($conf['olddir'].'_safefn.recoded')) {
$this->recode($conf['olddir']);
touch($conf['olddir'].'_safefn.recoded');
}
- if(!file_exists($conf['metadir'].'_safefn.recoded')){
+ if (!file_exists($conf['metadir'].'_safefn.recoded')) {
$this->recode($conf['metadir']);
touch($conf['metadir'].'_safefn.recoded');
}
- if(!file_exists($conf['mediadir'].'_safefn.recoded')){
+ if (!file_exists($conf['mediadir'].'_safefn.recoded')) {
$this->recode($conf['mediadir']);
touch($conf['mediadir'].'_safefn.recoded');
}
-
}
/**
* Recursive function to rename all safe encoded files to use the new
* square bracket post indicator
*/
- private function recode($dir){
+ private function recode($dir)
+ {
$dh = opendir($dir);
- if(!$dh) return;
+ if (!$dh) return;
while (($file = readdir($dh)) !== false) {
- if($file == '.' || $file == '..') continue; # cur and upper dir
- if(is_dir("$dir/$file")) $this->recode("$dir/$file"); #recurse
- if(strpos($file,'%') === false) continue; # no encoding used
- $new = preg_replace('/(%[^\]]*?)\./','\1]',$file); # new post indicator
- if(preg_match('/%[^\]]+$/',$new)) $new .= ']'; # fix end FS#2122
- rename("$dir/$file","$dir/$new"); # rename it
+ if ($file == '.' || $file == '..') continue; # cur and upper dir
+ if (is_dir("$dir/$file")) $this->recode("$dir/$file"); #recurse
+ if (strpos($file, '%') === false) continue; # no encoding used
+ $new = preg_replace('/(%[^\]]*?)\./', '\1]', $file); # new post indicator
+ if (preg_match('/%[^\]]+$/', $new)) $new .= ']'; # fix end FS#2122
+ rename("$dir/$file", "$dir/$new"); # rename it
}
closedir($dh);
}
-
}
-
-// vim:ts=4:sw=4:et:
diff --git a/lib/plugins/styling/action.php b/lib/plugins/styling/action.php
index 896e14bef..46245ca75 100644
--- a/lib/plugins/styling/action.php
+++ b/lib/plugins/styling/action.php
@@ -5,19 +5,8 @@
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
* @author Andreas Gohr <andi@splitbrain.org>
*/
-
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-/**
- * Class action_plugin_styling
- *
- * This handles all the save actions and loading the interface
- *
- * All this usually would be done within an admin plugin, but we want to have this available outside
- * the admin interface using our floating dialog.
- */
-class action_plugin_styling extends DokuWiki_Action_Plugin {
+class action_plugin_styling extends DokuWiki_Action_Plugin
+{
/**
* Registers a callback functions
@@ -25,8 +14,9 @@ class action_plugin_styling extends DokuWiki_Action_Plugin {
* @param Doku_Event_Handler $controller DokuWiki's event controller object
* @return void
*/
- public function register(Doku_Event_Handler $controller) {
- $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handle_header');
+ public function register(Doku_Event_Handler $controller)
+ {
+ $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handleHeader');
}
/**
@@ -37,24 +27,25 @@ class action_plugin_styling extends DokuWiki_Action_Plugin {
* handler was registered]
* @return void
*/
- public function handle_header(Doku_Event &$event, $param) {
+ public function handleHeader(Doku_Event &$event, $param)
+ {
global $ACT;
global $INPUT;
- if($ACT != 'admin' || $INPUT->str('page') != 'styling') return;
- if(!auth_isadmin()) return;
+ if ($ACT != 'admin' || $INPUT->str('page') != 'styling') return;
+ /** @var admin_plugin_styling $admin */
+ $admin = plugin_load('admin', 'styling');
+ if (!$admin->isAccessibleByCurrentUser()) return;
// set preview
$len = count($event->data['link']);
- for($i = 0; $i < $len; $i++) {
- if(
- $event->data['link'][$i]['rel'] == 'stylesheet' &&
+ for ($i = 0; $i < $len; $i++) {
+ if ($event->data['link'][$i]['rel'] == 'stylesheet' &&
strpos($event->data['link'][$i]['href'], 'lib/exe/css.php') !== false
) {
$event->data['link'][$i]['href'] .= '&preview=1&tseed='.time();
}
}
}
-
}
// vim:ts=4:sw=4:et:
diff --git a/lib/plugins/styling/admin.php b/lib/plugins/styling/admin.php
index 055ac2279..70c0572ea 100644
--- a/lib/plugins/styling/admin.php
+++ b/lib/plugins/styling/admin.php
@@ -5,45 +5,46 @@
* @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
* @author Andreas Gohr <andi@splitbrain.org>
*/
-
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-class admin_plugin_styling extends DokuWiki_Admin_Plugin {
+class admin_plugin_styling extends DokuWiki_Admin_Plugin
+{
public $ispopup = false;
/**
* @return int sort number in admin menu
*/
- public function getMenuSort() {
+ public function getMenuSort()
+ {
return 1000;
}
/**
* @return bool true if only access for superuser, false is for superusers and moderators
*/
- public function forAdminOnly() {
+ public function forAdminOnly()
+ {
return true;
}
/**
* handle the different actions (also called from ajax)
*/
- public function handle() {
+ public function handle()
+ {
global $INPUT;
$run = $INPUT->extract('run')->str('run');
- if(!$run) return;
- $run = "run_$run";
+ if (!$run) return;
+ $run = 'run'.ucfirst($run);
$this->$run();
}
/**
* Render HTML output, e.g. helpful text and a form
*/
- public function html() {
+ public function html()
+ {
$class = 'nopopup';
- if($this->ispopup) $class = 'ispopup page';
+ if ($this->ispopup) $class = 'ispopup page';
echo '<div id="plugin__styling" class="'.$class.'">';
ptln('<h1>'.$this->getLang('menu').'</h1>');
@@ -54,21 +55,22 @@ class admin_plugin_styling extends DokuWiki_Admin_Plugin {
/**
* Create the actual editing form
*/
- public function form() {
+ public function form()
+ {
global $conf;
global $ID;
- $styleUtil = new \dokuwiki\StyleUtils();
- $styleini = $styleUtil->cssStyleini($conf['template'], true);
+ $styleUtil = new \dokuwiki\StyleUtils($conf['template'], true);
+ $styleini = $styleUtil->cssStyleini();
$replacements = $styleini['replacements'];
- if($this->ispopup) {
+ if ($this->ispopup) {
$target = DOKU_BASE.'lib/plugins/styling/popup.php';
} else {
$target = wl($ID, array('do' => 'admin', 'page' => 'styling'));
}
- if(empty($replacements)) {
+ if (empty($replacements)) {
echo '<p class="error">'.$this->getLang('error').'</p>';
} else {
echo $this->locale_xhtml('intro');
@@ -76,21 +78,24 @@ class admin_plugin_styling extends DokuWiki_Admin_Plugin {
echo '<form class="styling" method="post" action="'.$target.'">';
echo '<table><tbody>';
- foreach($replacements as $key => $value) {
+ foreach ($replacements as $key => $value) {
$name = tpl_getLang($key);
- if(empty($name)) $name = $this->getLang($key);
- if(empty($name)) $name = $key;
+ if (empty($name)) $name = $this->getLang($key);
+ if (empty($name)) $name = $key;
echo '<tr>';
echo '<td><label for="tpl__'.hsc($key).'">'.$name.'</label></td>';
- echo '<td><input type="text" name="tpl['.hsc($key).']" id="tpl__'.hsc($key).'" value="'.hsc($value).'" '.$this->colorClass($key).' dir="ltr" /></td>';
+ echo '<td><input type="'.$this->colorType($key).'" name="tpl['.hsc($key).']" id="tpl__'.hsc($key).'"
+ value="'.hsc($value).'" dir="ltr" /></td>';
echo '</tr>';
}
echo '</tbody></table>';
echo '<p>';
- echo '<button type="submit" name="run[preview]" class="btn_preview primary">'.$this->getLang('btn_preview').'</button> ';
- echo '<button type="submit" name="run[reset]">'.$this->getLang('btn_reset').'</button>'; #FIXME only if preview.ini exists
+ echo '<button type="submit" name="run[preview]" class="btn_preview primary">'.
+ $this->getLang('btn_preview').'</button> ';
+ #FIXME only if preview.ini exists:
+ echo '<button type="submit" name="run[reset]">'.$this->getLang('btn_reset').'</button>';
echo '</p>';
echo '<p>';
@@ -98,20 +103,24 @@ class admin_plugin_styling extends DokuWiki_Admin_Plugin {
echo '</p>';
echo '<p>';
- echo '<button type="submit" name="run[revert]">'.$this->getLang('btn_revert').'</button>'; #FIXME only if local.ini exists
+ #FIXME only if local.ini exists:
+ echo '<button type="submit" name="run[revert]">'.$this->getLang('btn_revert').'</button>';
echo '</p>';
echo '</form>';
echo tpl_locale_xhtml('style');
-
}
}
/**
- * set the color class attribute
+ * Decide the input type based on the key name
+ *
+ * @param string $key
+ * @return string color|text
*/
- protected function colorClass($key) {
+ protected function colorType($key)
+ {
static $colors = array(
'text',
'background',
@@ -127,17 +136,18 @@ class admin_plugin_styling extends DokuWiki_Admin_Plugin {
'missing',
);
- if(preg_match('/colou?r/', $key) || in_array(trim($key,'_'), $colors)) {
- return 'class="color"';
+ if (preg_match('/colou?r/', $key) || in_array(trim($key, '_'), $colors)) {
+ return 'color';
} else {
- return '';
+ return 'text';
}
}
/**
* saves the preview.ini (alos called from ajax directly)
*/
- public function run_preview() {
+ public function runPreview()
+ {
global $conf;
$ini = $conf['cachedir'].'/preview.ini';
io_saveFile($ini, $this->makeini());
@@ -146,7 +156,8 @@ class admin_plugin_styling extends DokuWiki_Admin_Plugin {
/**
* deletes the preview.ini
*/
- protected function run_reset() {
+ protected function runReset()
+ {
global $conf;
$ini = $conf['cachedir'].'/preview.ini';
io_saveFile($ini, '');
@@ -155,17 +166,19 @@ class admin_plugin_styling extends DokuWiki_Admin_Plugin {
/**
* deletes the local style.ini replacements
*/
- protected function run_revert() {
- $this->replaceini('');
- $this->run_reset();
+ protected function runRevert()
+ {
+ $this->replaceIni('');
+ $this->runReset();
}
/**
* save the local style.ini replacements
*/
- protected function run_save() {
- $this->replaceini($this->makeini());
- $this->run_reset();
+ protected function runSave()
+ {
+ $this->replaceIni($this->makeini());
+ $this->runReset();
}
/**
@@ -173,13 +186,14 @@ class admin_plugin_styling extends DokuWiki_Admin_Plugin {
*
* @return string
*/
- protected function makeini() {
+ protected function makeini()
+ {
global $INPUT;
$ini = "[replacements]\n";
$ini .= ";These overwrites have been generated from the Template styling Admin interface\n";
$ini .= ";Any values in this section will be overwritten by that tool again\n";
- foreach($INPUT->arr('tpl') as $key => $val) {
+ foreach ($INPUT->arr('tpl') as $key => $val) {
$ini .= $key.' = "'.addslashes($val).'"'."\n";
}
@@ -191,10 +205,11 @@ class admin_plugin_styling extends DokuWiki_Admin_Plugin {
*
* @param string $new the new ini contents
*/
- protected function replaceini($new) {
+ protected function replaceIni($new)
+ {
global $conf;
$ini = DOKU_CONF."tpl/".$conf['template']."/style.ini";
- if(file_exists($ini)) {
+ if (file_exists($ini)) {
$old = io_readFile($ini);
$old = preg_replace('/\[replacements\]\n.*?(\n\[.*]|$)/s', '\\1', $old);
$old = trim($old);
@@ -205,7 +220,6 @@ class admin_plugin_styling extends DokuWiki_Admin_Plugin {
io_makeFileDir($ini);
io_saveFile($ini, "$old\n\n$new");
}
-
}
// vim:ts=4:sw=4:et:
diff --git a/lib/plugins/styling/iris.js b/lib/plugins/styling/iris.js
deleted file mode 100644
index 4eda5022e..000000000
--- a/lib/plugins/styling/iris.js
+++ /dev/null
@@ -1,1488 +0,0 @@
-/*! Iris Color Picker - v1.0.7 - 2014-11-28
-* https://github.com/Automattic/Iris
-* Copyright (c) 2014 Matt Wiebe; Licensed GPLv2 */
-(function( $, undef ){
- var _html, nonGradientIE, gradientType, vendorPrefixes, _css, Iris, UA, isIE, IEVersion;
-
- _html = '<div class="iris-picker"><div class="iris-picker-inner"><div class="iris-square"><a class="iris-square-value" href="#"><span class="iris-square-handle ui-slider-handle"></span></a><div class="iris-square-inner iris-square-horiz"></div><div class="iris-square-inner iris-square-vert"></div></div><div class="iris-slider iris-strip"><div class="iris-slider-offset"></div></div></div></div>';
- _css = '.iris-picker{display:block;position:relative}.iris-picker,.iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input+.iris-picker{margin-top:4px}.iris-error{background-color:#ffafaf}.iris-border{border-radius:3px;border:1px solid #aaa;width:200px;background-color:#fff}.iris-picker-inner{position:absolute;top:0;right:0;left:0;bottom:0}.iris-border .iris-picker-inner{top:10px;right:10px;left:10px;bottom:10px}.iris-picker .iris-square-inner{position:absolute;left:0;right:0;top:0;bottom:0}.iris-picker .iris-square,.iris-picker .iris-slider,.iris-picker .iris-square-inner,.iris-picker .iris-palette{border-radius:3px;box-shadow:inset 0 0 5px rgba(0,0,0,.4);height:100%;width:12.5%;float:left;margin-right:5%}.iris-picker .iris-square{width:76%;margin-right:10%;position:relative}.iris-picker .iris-square-inner{width:auto;margin:0}.iris-ie-9 .iris-square,.iris-ie-9 .iris-slider,.iris-ie-9 .iris-square-inner,.iris-ie-9 .iris-palette{box-shadow:none;border-radius:0}.iris-ie-9 .iris-square,.iris-ie-9 .iris-slider,.iris-ie-9 .iris-palette{outline:1px solid rgba(0,0,0,.1)}.iris-ie-lt9 .iris-square,.iris-ie-lt9 .iris-slider,.iris-ie-lt9 .iris-square-inner,.iris-ie-lt9 .iris-palette{outline:1px solid #aaa}.iris-ie-lt9 .iris-square .ui-slider-handle{outline:1px solid #aaa;background-color:#fff;-ms-filter:"alpha(Opacity=30)"}.iris-ie-lt9 .iris-square .iris-square-handle{background:0;border:3px solid #fff;-ms-filter:"alpha(Opacity=50)"}.iris-picker .iris-strip{margin-right:0;position:relative}.iris-picker .iris-strip .ui-slider-handle{position:absolute;background:0;margin:0;right:-3px;left:-3px;border:4px solid #aaa;border-width:4px 3px;width:auto;height:6px;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.2);opacity:.9;z-index:5;cursor:ns-resize}.iris-strip .ui-slider-handle:before{content:" ";position:absolute;left:-2px;right:-2px;top:-3px;bottom:-3px;border:2px solid #fff;border-radius:3px}.iris-picker .iris-slider-offset{position:absolute;top:11px;left:0;right:0;bottom:-3px;width:auto;height:auto;background:transparent;border:0;border-radius:0}.iris-picker .iris-square-handle{background:transparent;border:5px solid #aaa;border-radius:50%;border-color:rgba(128,128,128,.5);box-shadow:none;width:12px;height:12px;position:absolute;left:-10px;top:-10px;cursor:move;opacity:1;z-index:10}.iris-picker .ui-state-focus .iris-square-handle{opacity:.8}.iris-picker .iris-square-handle:hover{border-color:#999}.iris-picker .iris-square-value:focus .iris-square-handle{box-shadow:0 0 2px rgba(0,0,0,.75);opacity:.8}.iris-picker .iris-square-handle:hover::after{border-color:#fff}.iris-picker .iris-square-handle::after{position:absolute;bottom:-4px;right:-4px;left:-4px;top:-4px;border:3px solid #f9f9f9;border-color:rgba(255,255,255,.8);border-radius:50%;content:" "}.iris-picker .iris-square-value{width:8px;height:8px;position:absolute}.iris-ie-lt9 .iris-square-value,.iris-mozilla .iris-square-value{width:1px;height:1px}.iris-palette-container{position:absolute;bottom:0;left:0;margin:0;padding:0}.iris-border .iris-palette-container{left:10px;bottom:10px}.iris-picker .iris-palette{margin:0;cursor:pointer}.iris-square-handle,.ui-slider-handle{border:0;outline:0}';
-
- // Even IE9 dosen't support gradients. Elaborate sigh.
- UA = navigator.userAgent.toLowerCase();
- isIE = navigator.appName === 'Microsoft Internet Explorer';
- IEVersion = isIE ? parseFloat( UA.match( /msie ([0-9]{1,}[\.0-9]{0,})/ )[1] ) : 0;
- nonGradientIE = ( isIE && IEVersion < 10 );
- gradientType = false;
-
- // we don't bother with an unprefixed version, as it has a different syntax
- vendorPrefixes = [ '-moz-', '-webkit-', '-o-', '-ms-' ];
-
- // Bail for IE <= 7
- if ( nonGradientIE && IEVersion <= 7 ) {
- $.fn.iris = $.noop;
- $.support.iris = false;
- return;
- }
-
- $.support.iris = true;
-
- function testGradientType() {
- var el, base,
- bgImageString = 'backgroundImage';
-
- if ( nonGradientIE ) {
- gradientType = 'filter';
- }
- else {
- el = $( '<div id="iris-gradtest" />' );
- base = 'linear-gradient(top,#fff,#000)';
- $.each( vendorPrefixes, function( i, val ){
- el.css( bgImageString, val + base );
- if ( el.css( bgImageString ).match( 'gradient' ) ) {
- gradientType = i;
- return false;
- }
- });
- // check for legacy webkit gradient syntax
- if ( gradientType === false ) {
- el.css( 'background', '-webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#000))' );
- if ( el.css( bgImageString ).match( 'gradient' ) ) {
- gradientType = 'webkit';
- }
- }
- el.remove();
- }
-
- }
-
- /**
- * Only for CSS3 gradients. oldIE will use a separate function.
- *
- * Accepts as many color stops as necessary from 2nd arg on, or 2nd
- * arg can be an array of color stops
- *
- * @param {string} origin Gradient origin - top or left, defaults to left.
- * @return {string} Appropriate CSS3 gradient string for use in
- */
- function createGradient( origin, stops ) {
- origin = ( origin === 'top' ) ? 'top' : 'left';
- stops = $.isArray( stops ) ? stops : Array.prototype.slice.call( arguments, 1 );
- if ( gradientType === 'webkit' ) {
- return legacyWebkitGradient( origin, stops );
- } else {
- return vendorPrefixes[ gradientType ] + 'linear-gradient(' + origin + ', ' + stops.join(', ') + ')';
- }
- }
-
- /**
- * Stupid gradients for a stupid browser.
- */
- function stupidIEGradient( origin, stops ) {
- var type, self, lastIndex, filter, startPosProp, endPosProp, dimensionProp, template, html;
-
- origin = ( origin === 'top' ) ? 'top' : 'left';
- stops = $.isArray( stops ) ? stops : Array.prototype.slice.call( arguments, 1 );
- // 8 hex: AARRGGBB
- // GradientType: 0 vertical, 1 horizontal
- type = ( origin === 'top' ) ? 0 : 1;
- self = $( this );
- lastIndex = stops.length - 1;
- filter = 'filter';
- startPosProp = ( type === 1 ) ? 'left' : 'top';
- endPosProp = ( type === 1 ) ? 'right' : 'bottom';
- dimensionProp = ( type === 1 ) ? 'height' : 'width';
- template = '<div class="iris-ie-gradient-shim" style="position:absolute;' + dimensionProp + ':100%;' + startPosProp + ':%start%;' + endPosProp + ':%end%;' + filter + ':%filter%;" data-color:"%color%"></div>';
- html = '';
- // need a positioning context
- if ( self.css('position') === 'static' ) {
- self.css( {position: 'relative' } );
- }
-
- stops = fillColorStops( stops );
- $.each(stops, function( i, startColor ) {
- var endColor, endStop, filterVal;
-
- // we want two at a time. if we're on the last pair, bail.
- if ( i === lastIndex ) {
- return false;
- }
-
- endColor = stops[ i + 1 ];
- //if our pairs are at the same color stop, moving along.
- if ( startColor.stop === endColor.stop ) {
- return;
- }
-
- endStop = 100 - parseFloat( endColor.stop ) + '%';
- startColor.octoHex = new Color( startColor.color ).toIEOctoHex();
- endColor.octoHex = new Color( endColor.color ).toIEOctoHex();
-
- filterVal = 'progid:DXImageTransform.Microsoft.Gradient(GradientType=' + type + ', StartColorStr=\'' + startColor.octoHex + '\', EndColorStr=\'' + endColor.octoHex + '\')';
- html += template.replace( '%start%', startColor.stop ).replace( '%end%', endStop ).replace( '%filter%', filterVal );
- });
- self.find( '.iris-ie-gradient-shim' ).remove();
- $( html ).prependTo( self );
- }
-
- function legacyWebkitGradient( origin, colorList ) {
- var stops = [];
- origin = ( origin === 'top' ) ? '0% 0%,0% 100%,' : '0% 100%,100% 100%,';
- colorList = fillColorStops( colorList );
- $.each( colorList, function( i, val ){
- stops.push( 'color-stop(' + ( parseFloat( val.stop ) / 100 ) + ', ' + val.color + ')' );
- });
- return '-webkit-gradient(linear,' + origin + stops.join(',') + ')';
- }
-
- function fillColorStops( colorList ) {
- var colors = [],
- percs = [],
- newColorList = [],
- lastIndex = colorList.length - 1;
-
- $.each( colorList, function( index, val ) {
- var color = val,
- perc = false,
- match = val.match( /1?[0-9]{1,2}%$/ );
-
- if ( match ) {
- color = val.replace( /\s?1?[0-9]{1,2}%$/, '' );
- perc = match.shift();
- }
- colors.push( color );
- percs.push( perc );
- });
-
- // back fill first and last
- if ( percs[0] === false ) {
- percs[0] = '0%';
- }
-
- if ( percs[lastIndex] === false ) {
- percs[lastIndex] = '100%';
- }
-
- percs = backFillColorStops( percs );
-
- $.each( percs, function( i ){
- newColorList[i] = { color: colors[i], stop: percs[i] };
- });
- return newColorList;
- }
-
- function backFillColorStops( stops ) {
- var first = 0,
- last = stops.length - 1,
- i = 0,
- foundFirst = false,
- incr,
- steps,
- step,
- firstVal;
-
- if ( stops.length <= 2 || $.inArray( false, stops ) < 0 ) {
- return stops;
- }
- while ( i < stops.length - 1 ) {
- if ( ! foundFirst && stops[i] === false ) {
- first = i - 1;
- foundFirst = true;
- } else if ( foundFirst && stops[i] !== false ) {
- last = i;
- i = stops.length;
- }
- i++;
- }
- steps = last - first;
- firstVal = parseInt( stops[first].replace('%'), 10 );
- incr = ( parseFloat( stops[last].replace('%') ) - firstVal ) / steps;
- i = first + 1;
- step = 1;
- while ( i < last ) {
- stops[i] = ( firstVal + ( step * incr ) ) + '%';
- step++;
- i++;
- }
- return backFillColorStops( stops );
- }
-
- $.fn.gradient = function() {
- var args = arguments;
- return this.each( function() {
- // this'll be oldishIE
- if ( nonGradientIE ) {
- stupidIEGradient.apply( this, args );
- } else {
- // new hotness
- $( this ).css( 'backgroundImage', createGradient.apply( this, args ) );
- }
- });
- };
-
- $.fn.raninbowGradient = function( origin, args ) {
- var opts, template, i, steps;
-
- origin = origin || 'top';
- opts = $.extend( {}, { s: 100, l: 50 }, args );
- template = 'hsl(%h%,' + opts.s + '%,' + opts.l + '%)';
- i = 0;
- steps = [];
- while ( i <= 360 ) {
- steps.push( template.replace('%h%', i) );
- i += 30;
- }
- return this.each(function() {
- $(this).gradient( origin, steps );
- });
- };
-
- // the colorpicker widget def.
- Iris = {
- options: {
- color: false,
- mode: 'hsl',
- controls: {
- horiz: 's', // horizontal defaults to saturation
- vert: 'l', // vertical defaults to lightness
- strip: 'h' // right strip defaults to hue
- },
- hide: true, // hide the color picker by default
- border: true, // draw a border around the collection of UI elements
- target: false, // a DOM element / jQuery selector that the element will be appended within. Only used when called on an input.
- width: 200, // the width of the collection of UI elements
- palettes: false // show a palette of basic colors beneath the square.
- },
- _color: '',
- _palettes: [ '#000', '#fff', '#d33', '#d93', '#ee2', '#81d742', '#1e73be', '#8224e3' ],
- _inited: false,
- _defaultHSLControls: {
- horiz: 's',
- vert: 'l',
- strip: 'h'
- },
- _defaultHSVControls: {
- horiz: 'h',
- vert: 'v',
- strip: 's'
- },
- _scale: {
- h: 360,
- s: 100,
- l: 100,
- v: 100
- },
- _create: function() {
- var self = this,
- el = self.element,
- color = self.options.color || el.val();
-
- if ( gradientType === false ) {
- testGradientType();
- }
-
- if ( el.is( 'input' ) ) {
- if ( self.options.target ) {
- self.picker = $( _html ).appendTo( self.options.target );
- } else {
- self.picker = $( _html ).insertAfter( el );
- }
-
- self._addInputListeners( el );
- } else {
- el.append( _html );
- self.picker = el.find( '.iris-picker' );
- }
-
- // Browsers / Versions
- // Feature detection doesn't work for these, and $.browser is deprecated
- if ( isIE ) {
- if ( IEVersion === 9 ) {
- self.picker.addClass( 'iris-ie-9' );
- } else if ( IEVersion <= 8 ) {
- self.picker.addClass( 'iris-ie-lt9' );
- }
- } else if ( UA.indexOf('compatible') < 0 && UA.indexOf('khtml') < 0 && UA.match( /mozilla/ ) ) {
- self.picker.addClass( 'iris-mozilla' );
- }
-
- if ( self.options.palettes ) {
- self._addPalettes();
- }
-
- self._color = new Color( color ).setHSpace( self.options.mode );
- self.options.color = self._color.toString();
-
- // prep 'em for re-use
- self.controls = {
- square: self.picker.find( '.iris-square' ),
- squareDrag: self.picker.find( '.iris-square-value' ),
- horiz: self.picker.find( '.iris-square-horiz' ),
- vert: self.picker.find( '.iris-square-vert' ),
- strip: self.picker.find( '.iris-strip' ),
- stripSlider: self.picker.find( '.iris-strip .iris-slider-offset' )
- };
-
- // small sanity check - if we chose hsv, change default controls away from hsl
- if ( self.options.mode === 'hsv' && self._has('l', self.options.controls) ) {
- self.options.controls = self._defaultHSVControls;
- } else if ( self.options.mode === 'hsl' && self._has('v', self.options.controls) ) {
- self.options.controls = self._defaultHSLControls;
- }
-
- // store it. HSL gets squirrely
- self.hue = self._color.h();
-
- if ( self.options.hide ) {
- self.picker.hide();
- }
-
- if ( self.options.border ) {
- self.picker.addClass( 'iris-border' );
- }
-
- self._initControls();
- self.active = 'external';
- self._dimensions();
- self._change();
- },
- _has: function(needle, haystack) {
- var ret = false;
- $.each(haystack, function(i,v){
- if ( needle === v ) {
- ret = true;
- // exit the loop
- return false;
- }
- });
- return ret;
- },
- _addPalettes: function () {
- var container = $( '<div class="iris-palette-container" />' ),
- palette = $( '<a class="iris-palette" tabindex="0" />' ),
- colors = $.isArray( this.options.palettes ) ? this.options.palettes : this._palettes;
-
- // do we have an existing container? Empty and reuse it.
- if ( this.picker.find( '.iris-palette-container' ).length ) {
- container = this.picker.find( '.iris-palette-container' ).detach().html( '' );
- }
-
- $.each(colors, function(index, val) {
- palette.clone().data( 'color', val )
- .css( 'backgroundColor', val ).appendTo( container )
- .height( 10 ).width( 10 );
- });
-
- this.picker.append(container);
- },
- _paint: function() {
- var self = this;
- self._paintDimension( 'top', 'strip' );
- self._paintDimension( 'top', 'vert' );
- self._paintDimension( 'left', 'horiz' );
- },
- _paintDimension: function( origin, control ) {
- var self = this,
- c = self._color,
- mode = self.options.mode,
- color = self._getHSpaceColor(),
- target = self.controls[ control ],
- controlOpts = self.options.controls,
- stops;
-
- // don't paint the active control
- if ( control === self.active || ( self.active === 'square' && control !== 'strip' ) ) {
- return;
- }
-
- switch ( controlOpts[ control ] ) {
- case 'h':
- if ( mode === 'hsv' ) {
- color = c.clone();
- switch ( control ) {
- case 'horiz':
- color[controlOpts.vert](100);
- break;
- case 'vert':
- color[controlOpts.horiz](100);
- break;
- case 'strip':
- color.setHSpace('hsl');
- break;
- }
- stops = color.toHsl();
- } else {
- if ( control === 'strip' ) {
- stops = { s: color.s, l: color.l };
- } else {
- stops = { s: 100, l: color.l };
- }
- }
-
- target.raninbowGradient( origin, stops );
- break;
- case 's':
- if ( mode === 'hsv' ) {
- if ( control === 'vert' ) {
- stops = [ c.clone().a(0).s(0).toCSS('rgba'), c.clone().a(1).s(0).toCSS('rgba') ];
- } else if ( control === 'strip' ) {
- stops = [ c.clone().s(100).toCSS('hsl'), c.clone().s(0).toCSS('hsl') ];
- } else if ( control === 'horiz' ) {
- stops = [ '#fff', 'hsl(' + color.h + ',100%,50%)' ];
- }
- } else { // implicit mode === 'hsl'
- if ( control === 'vert' && self.options.controls.horiz === 'h' ) {
- stops = ['hsla(0, 0%, ' + color.l + '%, 0)', 'hsla(0, 0%, ' + color.l + '%, 1)'];
- } else {
- stops = ['hsl('+ color.h +',0%,50%)', 'hsl(' + color.h + ',100%,50%)'];
- }
- }
-
-
- target.gradient( origin, stops );
- break;
- case 'l':
- if ( control === 'strip' ) {
- stops = ['hsl(' + color.h + ',100%,100%)', 'hsl(' + color.h + ', ' + color.s + '%,50%)', 'hsl('+ color.h +',100%,0%)'];
- } else {
- stops = ['#fff', 'rgba(255,255,255,0) 50%', 'rgba(0,0,0,0) 50%', 'rgba(0,0,0,1)'];
- }
- target.gradient( origin, stops );
- break;
- case 'v':
- if ( control === 'strip' ) {
- stops = [ c.clone().v(100).toCSS(), c.clone().v(0).toCSS() ];
- } else {
- stops = ['rgba(0,0,0,0)', '#000'];
- }
- target.gradient( origin, stops );
- break;
- default:
- break;
- }
- },
-
- _getHSpaceColor: function() {
- return ( this.options.mode === 'hsv' ) ? this._color.toHsv() : this._color.toHsl();
- },
-
- _dimensions: function( reset ) {
- // whatever size
- var self = this,
- opts = self.options,
- controls = self.controls,
- square = controls.square,
- strip = self.picker.find( '.iris-strip' ),
- squareWidth = '77.5%',
- stripWidth = '12%',
- totalPadding = 20,
- innerWidth = opts.border ? opts.width - totalPadding : opts.width,
- controlsHeight,
- paletteCount = $.isArray( opts.palettes ) ? opts.palettes.length : self._palettes.length,
- paletteMargin, paletteWidth, paletteContainerWidth;
-
- if ( reset ) {
- square.css( 'width', '' );
- strip.css( 'width', '' );
- self.picker.css( {width: '', height: ''} );
- }
-
- squareWidth = innerWidth * ( parseFloat( squareWidth ) / 100 );
- stripWidth = innerWidth * ( parseFloat( stripWidth ) / 100 );
- controlsHeight = opts.border ? squareWidth + totalPadding : squareWidth;
-
- square.width( squareWidth ).height( squareWidth );
- strip.height( squareWidth ).width( stripWidth );
- self.picker.css( { width: opts.width, height: controlsHeight } );
-
- if ( ! opts.palettes ) {
- return self.picker.css( 'paddingBottom', '' );
- }
-
- // single margin at 2%
- paletteMargin = squareWidth * 2 / 100;
- paletteContainerWidth = squareWidth - ( ( paletteCount - 1 ) * paletteMargin );
- paletteWidth = paletteContainerWidth / paletteCount;
- self.picker.find('.iris-palette').each( function( i ) {
- var margin = i === 0 ? 0 : paletteMargin;
- $( this ).css({
- width: paletteWidth,
- height: paletteWidth,
- marginLeft: margin
- });
- });
- self.picker.css( 'paddingBottom', paletteWidth + paletteMargin );
- strip.height( paletteWidth + paletteMargin + squareWidth );
- },
-
- _addInputListeners: function( input ) {
- var self = this,
- debounceTimeout = 100,
- callback = function( event ){
- var color = new Color( input.val() ),
- val = input.val().replace( /^#/, '' );
-
- input.removeClass( 'iris-error' );
- // we gave a bad color
- if ( color.error ) {
- // don't error on an empty input - we want those allowed
- if ( val !== '' ) {
- input.addClass( 'iris-error' );
- }
- } else {
- if ( color.toString() !== self._color.toString() ) {
- // let's not do this on keyup for hex shortcodes
- if ( ! ( event.type === 'keyup' && val.match( /^[0-9a-fA-F]{3}$/ ) ) ) {
- self._setOption( 'color', color.toString() );
- }
- }
- }
- };
-
- input.on( 'change', callback ).on( 'keyup', self._debounce( callback, debounceTimeout ) );
-
- // If we initialized hidden, show on first focus. The rest is up to you.
- if ( self.options.hide ) {
- input.one( 'focus', function() {
- self.show();
- });
- }
- },
-
- _initControls: function() {
- var self = this,
- controls = self.controls,
- square = controls.square,
- controlOpts = self.options.controls,
- stripScale = self._scale[controlOpts.strip];
-
- controls.stripSlider.slider({
- orientation: 'vertical',
- max: stripScale,
- slide: function( event, ui ) {
- self.active = 'strip';
- // "reverse" for hue.
- if ( controlOpts.strip === 'h' ) {
- ui.value = stripScale - ui.value;
- }
-
- self._color[controlOpts.strip]( ui.value );
- self._change.apply( self, arguments );
- }
- });
-
- controls.squareDrag.draggable({
- containment: controls.square.find( '.iris-square-inner' ),
- zIndex: 1000,
- cursor: 'move',
- drag: function( event, ui ) {
- self._squareDrag( event, ui );
- },
- start: function() {
- square.addClass( 'iris-dragging' );
- $(this).addClass( 'ui-state-focus' );
- },
- stop: function() {
- square.removeClass( 'iris-dragging' );
- $(this).removeClass( 'ui-state-focus' );
- }
- }).on( 'mousedown mouseup', function( event ) {
- var focusClass = 'ui-state-focus';
- event.preventDefault();
- if (event.type === 'mousedown' ) {
- self.picker.find( '.' + focusClass ).removeClass( focusClass ).blur();
- $(this).addClass( focusClass ).focus();
- } else {
- $(this).removeClass( focusClass );
- }
- }).on( 'keydown', function( event ) {
- var container = controls.square,
- draggable = controls.squareDrag,
- position = draggable.position(),
- distance = self.options.width / 100; // Distance in pixels the draggable should be moved: 1 "stop"
-
- // make alt key go "10"
- if ( event.altKey ) {
- distance *= 10;
- }
-
- // Reposition if one of the directional keys is pressed
- switch ( event.keyCode ) {
- case 37: position.left -= distance; break; // Left
- case 38: position.top -= distance; break; // Up
- case 39: position.left += distance; break; // Right
- case 40: position.top += distance; break; // Down
- default: return true; // Exit and bubble
- }
-
- // Keep draggable within container
- position.left = Math.max( 0, Math.min( position.left, container.width() ) );
- position.top = Math.max( 0, Math.min( position.top, container.height() ) );
-
- draggable.css(position);
- self._squareDrag( event, { position: position });
- event.preventDefault();
- });
-
- // allow clicking on the square to move there and keep dragging
- square.mousedown( function( event ) {
- var squareOffset, pos;
- // only left click
- if ( event.which !== 1 ) {
- return;
- }
-
- // prevent bubbling from the handle: no infinite loops
- if ( ! $( event.target ).is( 'div' ) ) {
- return;
- }
-
- squareOffset = self.controls.square.offset();
- pos = {
- top: event.pageY - squareOffset.top,
- left: event.pageX - squareOffset.left
- };
- event.preventDefault();
- self._squareDrag( event, { position: pos } );
- event.target = self.controls.squareDrag.get(0);
- self.controls.squareDrag.css( pos ).trigger( event );
- });
-
- // palettes
- if ( self.options.palettes ) {
- self._paletteListeners();
- }
- },
-
- _paletteListeners: function() {
- var self = this;
- self.picker.find('.iris-palette-container').on('click.palette', '.iris-palette', function() {
- self._color.fromCSS( $(this).data('color') );
- self.active = 'external';
- self._change();
- }).on( 'keydown.palette', '.iris-palette', function( event ) {
- if ( ! ( event.keyCode === 13 || event.keyCode === 32 ) ) {
- return true;
- }
- event.stopPropagation();
- $( this ).click();
- });
- },
-
- _squareDrag: function( event, ui ) {
- var self = this,
- controlOpts = self.options.controls,
- dimensions = self._squareDimensions(),
- vertVal = Math.round( ( dimensions.h - ui.position.top ) / dimensions.h * self._scale[controlOpts.vert] ),
- horizVal = self._scale[controlOpts.horiz] - Math.round( ( dimensions.w - ui.position.left ) / dimensions.w * self._scale[controlOpts.horiz] );
-
- self._color[controlOpts.horiz]( horizVal )[controlOpts.vert]( vertVal );
-
- self.active = 'square';
- self._change.apply( self, arguments );
- },
-
- _setOption: function( key, value ) {
- var self = this,
- oldValue = self.options[key],
- doDimensions = false,
- hexLessColor,
- newColor,
- method;
-
- // ensure the new value is set. We can reset to oldValue if some check wasn't met.
- self.options[key] = value;
-
- switch(key) {
- case 'color':
- // cast to string in case we have a number
- value = '' + value;
- hexLessColor = value.replace( /^#/, '' );
- newColor = new Color( value ).setHSpace( self.options.mode );
- if ( newColor.error ) {
- self.options[key] = oldValue;
- } else {
- self._color = newColor;
- self.options.color = self.options[key] = self._color.toString();
- self.active = 'external';
- self._change();
- }
- break;
- case 'palettes':
- doDimensions = true;
-
- if ( value ) {
- self._addPalettes();
- } else {
- self.picker.find('.iris-palette-container').remove();
- }
-
- // do we need to add events?
- if ( ! oldValue ) {
- self._paletteListeners();
- }
- break;
- case 'width':
- doDimensions = true;
- break;
- case 'border':
- doDimensions = true;
- method = value ? 'addClass' : 'removeClass';
- self.picker[method]('iris-border');
- break;
- case 'mode':
- case 'controls':
- // if nothing's changed, let's bail, since this causes re-rendering the whole widget
- if ( oldValue === value ) {
- return;
- }
-
- // we're using these poorly named variables because they're already scoped.
- // method is the element that Iris was called on. oldValue will be the options
- method = self.element;
- oldValue = self.options;
- oldValue.hide = ! self.picker.is( ':visible' );
- self.destroy();
- self.picker.remove();
- return $(self.element).iris(oldValue);
- }
-
- // Do we need to recalc dimensions?
- if ( doDimensions ) {
- self._dimensions(true);
- }
- },
-
- _squareDimensions: function( forceRefresh ) {
- var square = this.controls.square,
- dimensions,
- control;
-
- if ( forceRefresh !== undef && square.data('dimensions') ) {
- return square.data('dimensions');
- }
-
- control = this.controls.squareDrag;
- dimensions = {
- w: square.width(),
- h: square.height()
- };
- square.data( 'dimensions', dimensions );
- return dimensions;
- },
-
- _isNonHueControl: function( active, type ) {
- if ( active === 'square' && this.options.controls.strip === 'h' ) {
- return true;
- } else if ( type === 'external' || ( type === 'h' && active === 'strip' ) ) {
- return false;
- }
-
- return true;
- },
-
- _change: function() {
- var self = this,
- controls = self.controls,
- color = self._getHSpaceColor(),
- actions = [ 'square', 'strip' ],
- controlOpts = self.options.controls,
- type = controlOpts[self.active] || 'external',
- oldHue = self.hue;
-
- if ( self.active === 'strip' ) {
- // take no action on any of the square sliders if we adjusted the strip
- actions = [];
- } else if ( self.active !== 'external' ) {
- // for non-strip, non-external, strip should never change
- actions.pop(); // conveniently the last item
- }
-
- $.each( actions, function(index, item) {
- var value, dimensions, cssObj;
- if ( item !== self.active ) {
- switch ( item ) {
- case 'strip':
- // reverse for hue
- value = ( controlOpts.strip === 'h' ) ? self._scale[controlOpts.strip] - color[controlOpts.strip] : color[controlOpts.strip];
- controls.stripSlider.slider( 'value', value );
- break;
- case 'square':
- dimensions = self._squareDimensions();
- cssObj = {
- left: color[controlOpts.horiz] / self._scale[controlOpts.horiz] * dimensions.w,
- top: dimensions.h - ( color[controlOpts.vert] / self._scale[controlOpts.vert] * dimensions.h )
- };
-
- self.controls.squareDrag.css( cssObj );
- break;
- }
- }
- });
-
- // Ensure that we don't change hue if we triggered a hue reset
- if ( color.h !== oldHue && self._isNonHueControl( self.active, type ) ) {
- self._color.h(oldHue);
- }
-
- // store hue for repeating above check next time
- self.hue = self._color.h();
-
- self.options.color = self._color.toString();
-
- // only run after the first time
- if ( self._inited ) {
- self._trigger( 'change', { type: self.active }, { color: self._color } );
- }
-
- if ( self.element.is( ':input' ) && ! self._color.error ) {
- self.element.removeClass( 'iris-error' );
- if ( self.element.val() !== self._color.toString() ) {
- self.element.val( self._color.toString() );
- }
- }
-
- self._paint();
- self._inited = true;
- self.active = false;
- },
- // taken from underscore.js _.debounce method
- _debounce: function( func, wait, immediate ) {
- var timeout, result;
- return function() {
- var context = this,
- args = arguments,
- later,
- callNow;
-
- later = function() {
- timeout = null;
- if ( ! immediate) {
- result = func.apply( context, args );
- }
- };
-
- callNow = immediate && !timeout;
- clearTimeout( timeout );
- timeout = setTimeout( later, wait );
- if ( callNow ) {
- result = func.apply( context, args );
- }
- return result;
- };
- },
- show: function() {
- this.picker.show();
- },
- hide: function() {
- this.picker.hide();
- },
- toggle: function() {
- this.picker.toggle();
- },
- color: function(newColor) {
- if ( newColor === true ) {
- return this._color.clone();
- } else if ( newColor === undef ) {
- return this._color.toString();
- }
- this.option('color', newColor);
- }
- };
- // initialize the widget
- $.widget( 'a8c.iris', Iris );
- // add CSS
- $( '<style id="iris-css">' + _css + '</style>' ).appendTo( 'head' );
-
-}( jQuery ));
-/*! Color.js - v0.9.11 - 2013-08-09
-* https://github.com/Automattic/Color.js
-* Copyright (c) 2013 Matt Wiebe; Licensed GPLv2 */
-(function(global, undef) {
-
- var Color = function( color, type ) {
- if ( ! ( this instanceof Color ) )
- return new Color( color, type );
-
- return this._init( color, type );
- };
-
- Color.fn = Color.prototype = {
- _color: 0,
- _alpha: 1,
- error: false,
- // for preserving hue/sat in fromHsl().toHsl() flows
- _hsl: { h: 0, s: 0, l: 0 },
- // for preserving hue/sat in fromHsv().toHsv() flows
- _hsv: { h: 0, s: 0, v: 0 },
- // for setting hsl or hsv space - needed for .h() & .s() functions to function properly
- _hSpace: 'hsl',
- _init: function( color ) {
- var func = 'noop';
- switch ( typeof color ) {
- case 'object':
- // alpha?
- if ( color.a !== undef )
- this.a( color.a );
- func = ( color.r !== undef ) ? 'fromRgb' :
- ( color.l !== undef ) ? 'fromHsl' :
- ( color.v !== undef ) ? 'fromHsv' : func;
- return this[func]( color );
- case 'string':
- return this.fromCSS( color );
- case 'number':
- return this.fromInt( parseInt( color, 10 ) );
- }
- return this;
- },
-
- _error: function() {
- this.error = true;
- return this;
- },
-
- clone: function() {
- var newColor = new Color( this.toInt() ),
- copy = ['_alpha', '_hSpace', '_hsl', '_hsv', 'error'];
- for ( var i = copy.length - 1; i >= 0; i-- ) {
- newColor[ copy[i] ] = this[ copy[i] ];
- }
- return newColor;
- },
-
- setHSpace: function( space ) {
- this._hSpace = ( space === 'hsv' ) ? space : 'hsl';
- return this;
- },
-
- noop: function() {
- return this;
- },
-
- fromCSS: function( color ) {
- var list,
- leadingRE = /^(rgb|hs(l|v))a?\(/;
- this.error = false;
-
- // whitespace and semicolon trim
- color = color.replace(/^\s+/, '').replace(/\s+$/, '').replace(/;$/, '');
-
- if ( color.match(leadingRE) && color.match(/\)$/) ) {
- list = color.replace(/(\s|%)/g, '').replace(leadingRE, '').replace(/,?\);?$/, '').split(',');
-
- if ( list.length < 3 )
- return this._error();
-
- if ( list.length === 4 ) {
- this.a( parseFloat( list.pop() ) );
- // error state has been set to true in .a() if we passed NaN
- if ( this.error )
- return this;
- }
-
- for (var i = list.length - 1; i >= 0; i--) {
- list[i] = parseInt(list[i], 10);
- if ( isNaN( list[i] ) )
- return this._error();
- }
-
- if ( color.match(/^rgb/) ) {
- return this.fromRgb( {
- r: list[0],
- g: list[1],
- b: list[2]
- } );
- } else if ( color.match(/^hsv/) ) {
- return this.fromHsv( {
- h: list[0],
- s: list[1],
- v: list[2]
- } );
- } else {
- return this.fromHsl( {
- h: list[0],
- s: list[1],
- l: list[2]
- } );
- }
- } else {
- // must be hex amirite?
- return this.fromHex( color );
- }
- },
-
- fromRgb: function( rgb, preserve ) {
- if ( typeof rgb !== 'object' || rgb.r === undef || rgb.g === undef || rgb.b === undef )
- return this._error();
-
- this.error = false;
- return this.fromInt( parseInt( ( rgb.r << 16 ) + ( rgb.g << 8 ) + rgb.b, 10 ), preserve );
- },
-
- fromHex: function( color ) {
- color = color.replace(/^#/, '').replace(/^0x/, '');
- if ( color.length === 3 ) {
- color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];
- }
-
- // rough error checking - this is where things go squirrely the most
- this.error = ! /^[0-9A-F]{6}$/i.test( color );
- return this.fromInt( parseInt( color, 16 ) );
- },
-
- fromHsl: function( hsl ) {
- var r, g, b, q, p, h, s, l;
-
- if ( typeof hsl !== 'object' || hsl.h === undef || hsl.s === undef || hsl.l === undef )
- return this._error();
-
- this._hsl = hsl; // store it
- this._hSpace = 'hsl'; // implicit
- h = hsl.h / 360; s = hsl.s / 100; l = hsl.l / 100;
- if ( s === 0 ) {
- r = g = b = l; // achromatic
- }
- else {
- q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s;
- p = 2 * l - q;
- r = this.hue2rgb( p, q, h + 1/3 );
- g = this.hue2rgb( p, q, h );
- b = this.hue2rgb( p, q, h - 1/3 );
- }
- return this.fromRgb( {
- r: r * 255,
- g: g * 255,
- b: b * 255
- }, true ); // true preserves hue/sat
- },
-
- fromHsv: function( hsv ) {
- var h, s, v, r, g, b, i, f, p, q, t;
- if ( typeof hsv !== 'object' || hsv.h === undef || hsv.s === undef || hsv.v === undef )
- return this._error();
-
- this._hsv = hsv; // store it
- this._hSpace = 'hsv'; // implicit
-
- h = hsv.h / 360; s = hsv.s / 100; v = hsv.v / 100;
- i = Math.floor( h * 6 );
- f = h * 6 - i;
- p = v * ( 1 - s );
- q = v * ( 1 - f * s );
- t = v * ( 1 - ( 1 - f ) * s );
-
- switch( i % 6 ) {
- case 0:
- r = v; g = t; b = p;
- break;
- case 1:
- r = q; g = v; b = p;
- break;
- case 2:
- r = p; g = v; b = t;
- break;
- case 3:
- r = p; g = q; b = v;
- break;
- case 4:
- r = t; g = p; b = v;
- break;
- case 5:
- r = v; g = p; b = q;
- break;
- }
-
- return this.fromRgb( {
- r: r * 255,
- g: g * 255,
- b: b * 255
- }, true ); // true preserves hue/sat
-
- },
- // everything comes down to fromInt
- fromInt: function( color, preserve ) {
- this._color = parseInt( color, 10 );
-
- if ( isNaN( this._color ) )
- this._color = 0;
-
- // let's coerce things
- if ( this._color > 16777215 )
- this._color = 16777215;
- else if ( this._color < 0 )
- this._color = 0;
-
- // let's not do weird things
- if ( preserve === undef ) {
- this._hsv.h = this._hsv.s = this._hsl.h = this._hsl.s = 0;
- }
- // EVENT GOES HERE
- return this;
- },
-
- hue2rgb: function( p, q, t ) {
- if ( t < 0 ) {
- t += 1;
- }
- if ( t > 1 ) {
- t -= 1;
- }
- if ( t < 1/6 ) {
- return p + ( q - p ) * 6 * t;
- }
- if ( t < 1/2 ) {
- return q;
- }
- if ( t < 2/3 ) {
- return p + ( q - p ) * ( 2/3 - t ) * 6;
- }
- return p;
- },
-
- toString: function() {
- var hex = parseInt( this._color, 10 ).toString( 16 );
- if ( this.error )
- return '';
- // maybe left pad it
- if ( hex.length < 6 ) {
- for (var i = 6 - hex.length - 1; i >= 0; i--) {
- hex = '0' + hex;
- }
- }
- return '#' + hex;
- },
-
- toCSS: function( type, alpha ) {
- type = type || 'hex';
- alpha = parseFloat( alpha || this._alpha );
- switch ( type ) {
- case 'rgb':
- case 'rgba':
- var rgb = this.toRgb();
- if ( alpha < 1 ) {
- return "rgba( " + rgb.r + ", " + rgb.g + ", " + rgb.b + ", " + alpha + " )";
- }
- else {
- return "rgb( " + rgb.r + ", " + rgb.g + ", " + rgb.b + " )";
- }
- break;
- case 'hsl':
- case 'hsla':
- var hsl = this.toHsl();
- if ( alpha < 1 ) {
- return "hsla( " + hsl.h + ", " + hsl.s + "%, " + hsl.l + "%, " + alpha + " )";
- }
- else {
- return "hsl( " + hsl.h + ", " + hsl.s + "%, " + hsl.l + "% )";
- }
- break;
- default:
- return this.toString();
- }
- },
-
- toRgb: function() {
- return {
- r: 255 & ( this._color >> 16 ),
- g: 255 & ( this._color >> 8 ),
- b: 255 & ( this._color )
- };
- },
-
- toHsl: function() {
- var rgb = this.toRgb();
- var r = rgb.r / 255, g = rgb.g / 255, b = rgb.b / 255;
- var max = Math.max( r, g, b ), min = Math.min( r, g, b );
- var h, s, l = ( max + min ) / 2;
-
- if ( max === min ) {
- h = s = 0; // achromatic
- } else {
- var d = max - min;
- s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min );
- switch ( max ) {
- case r: h = ( g - b ) / d + ( g < b ? 6 : 0 );
- break;
- case g: h = ( b - r ) / d + 2;
- break;
- case b: h = ( r - g ) / d + 4;
- break;
- }
- h /= 6;
- }
-
- // maintain hue & sat if we've been manipulating things in the HSL space.
- h = Math.round( h * 360 );
- if ( h === 0 && this._hsl.h !== h ) {
- h = this._hsl.h;
- }
- s = Math.round( s * 100 );
- if ( s === 0 && this._hsl.s ) {
- s = this._hsl.s;
- }
-
- return {
- h: h,
- s: s,
- l: Math.round( l * 100 )
- };
-
- },
-
- toHsv: function() {
- var rgb = this.toRgb();
- var r = rgb.r / 255, g = rgb.g / 255, b = rgb.b / 255;
- var max = Math.max( r, g, b ), min = Math.min( r, g, b );
- var h, s, v = max;
- var d = max - min;
- s = max === 0 ? 0 : d / max;
-
- if ( max === min ) {
- h = s = 0; // achromatic
- } else {
- switch( max ){
- case r:
- h = ( g - b ) / d + ( g < b ? 6 : 0 );
- break;
- case g:
- h = ( b - r ) / d + 2;
- break;
- case b:
- h = ( r - g ) / d + 4;
- break;
- }
- h /= 6;
- }
-
- // maintain hue & sat if we've been manipulating things in the HSV space.
- h = Math.round( h * 360 );
- if ( h === 0 && this._hsv.h !== h ) {
- h = this._hsv.h;
- }
- s = Math.round( s * 100 );
- if ( s === 0 && this._hsv.s ) {
- s = this._hsv.s;
- }
-
- return {
- h: h,
- s: s,
- v: Math.round( v * 100 )
- };
- },
-
- toInt: function() {
- return this._color;
- },
-
- toIEOctoHex: function() {
- // AARRBBGG
- var hex = this.toString();
- var AA = parseInt( 255 * this._alpha, 10 ).toString(16);
- if ( AA.length === 1 ) {
- AA = '0' + AA;
- }
- return '#' + AA + hex.replace(/^#/, '' );
- },
-
- toLuminosity: function() {
- var rgb = this.toRgb();
- return 0.2126 * Math.pow( rgb.r / 255, 2.2 ) + 0.7152 * Math.pow( rgb.g / 255, 2.2 ) + 0.0722 * Math.pow( rgb.b / 255, 2.2);
- },
-
- getDistanceLuminosityFrom: function( color ) {
- if ( ! ( color instanceof Color ) ) {
- throw 'getDistanceLuminosityFrom requires a Color object';
- }
- var lum1 = this.toLuminosity();
- var lum2 = color.toLuminosity();
- if ( lum1 > lum2 ) {
- return ( lum1 + 0.05 ) / ( lum2 + 0.05 );
- }
- else {
- return ( lum2 + 0.05 ) / ( lum1 + 0.05 );
- }
- },
-
- getMaxContrastColor: function() {
- var lum = this.toLuminosity();
- var hex = ( lum >= 0.5 ) ? '000000' : 'ffffff';
- return new Color( hex );
- },
-
- getReadableContrastingColor: function( bgColor, minContrast ) {
- if ( ! bgColor instanceof Color ) {
- return this;
- }
-
- // you shouldn't use less than 5, but you might want to.
- var targetContrast = ( minContrast === undef ) ? 5 : minContrast;
- // working things
- var contrast = bgColor.getDistanceLuminosityFrom( this );
- var maxContrastColor = bgColor.getMaxContrastColor();
- var maxContrast = maxContrastColor.getDistanceLuminosityFrom( bgColor );
-
- // if current max contrast is less than the target contrast, we had wishful thinking.
- // still, go max
- if ( maxContrast <= targetContrast ) {
- return maxContrastColor;
- }
- // or, we might already have sufficient contrast
- else if ( contrast >= targetContrast ) {
- return this;
- }
-
- var incr = ( 0 === maxContrastColor.toInt() ) ? -1 : 1;
- while ( contrast < targetContrast ) {
- this.l( incr, true ); // 2nd arg turns this into an incrementer
- contrast = this.getDistanceLuminosityFrom( bgColor );
- // infininite loop prevention: you never know.
- if ( this._color === 0 || this._color === 16777215 ) {
- break;
- }
- }
-
- return this;
-
- },
-
- a: function( val ) {
- if ( val === undef )
- return this._alpha;
-
- var a = parseFloat( val );
-
- if ( isNaN( a ) )
- return this._error();
-
- this._alpha = a;
- return this;
- },
-
- // TRANSFORMS
-
- darken: function( amount ) {
- amount = amount || 5;
- return this.l( - amount, true );
- },
-
- lighten: function( amount ) {
- amount = amount || 5;
- return this.l( amount, true );
- },
-
- saturate: function( amount ) {
- amount = amount || 15;
- return this.s( amount, true );
- },
-
- desaturate: function( amount ) {
- amount = amount || 15;
- return this.s( - amount, true );
- },
-
- toGrayscale: function() {
- return this.setHSpace('hsl').s( 0 );
- },
-
- getComplement: function() {
- return this.h( 180, true );
- },
-
- getSplitComplement: function( step ) {
- step = step || 1;
- var incr = 180 + ( step * 30 );
- return this.h( incr, true );
- },
-
- getAnalog: function( step ) {
- step = step || 1;
- var incr = step * 30;
- return this.h( incr, true );
- },
-
- getTetrad: function( step ) {
- step = step || 1;
- var incr = step * 60;
- return this.h( incr, true );
- },
-
- getTriad: function( step ) {
- step = step || 1;
- var incr = step * 120;
- return this.h( incr, true );
- },
-
- _partial: function( key ) {
- var prop = shortProps[key];
- return function( val, incr ) {
- var color = this._spaceFunc('to', prop.space);
-
- // GETTER
- if ( val === undef )
- return color[key];
-
- // INCREMENT
- if ( incr === true )
- val = color[key] + val;
-
- // MOD & RANGE
- if ( prop.mod )
- val = val % prop.mod;
- if ( prop.range )
- val = ( val < prop.range[0] ) ? prop.range[0] : ( val > prop.range[1] ) ? prop.range[1] : val;
-
- // NEW VALUE
- color[key] = val;
-
- return this._spaceFunc('from', prop.space, color);
- };
- },
-
- _spaceFunc: function( dir, s, val ) {
- var space = s || this._hSpace,
- funcName = dir + space.charAt(0).toUpperCase() + space.substr(1);
- return this[funcName](val);
- }
- };
-
- var shortProps = {
- h: {
- mod: 360
- },
- s: {
- range: [0,100]
- },
- l: {
- space: 'hsl',
- range: [0,100]
- },
- v: {
- space: 'hsv',
- range: [0,100]
- },
- r: {
- space: 'rgb',
- range: [0,255]
- },
- g: {
- space: 'rgb',
- range: [0,255]
- },
- b: {
- space: 'rgb',
- range: [0,255]
- }
- };
-
- for ( var key in shortProps ) {
- if ( shortProps.hasOwnProperty( key ) )
- Color.fn[key] = Color.fn._partial(key);
- }
-
- // play nicely with Node + browser
- if ( typeof exports === 'object' )
- module.exports = Color;
- else
- global.Color = Color;
-
-}(this));
diff --git a/lib/plugins/styling/lang/bg/lang.php b/lib/plugins/styling/lang/bg/lang.php
index 7d17caffb..dc1884d63 100644
--- a/lib/plugins/styling/lang/bg/lang.php
+++ b/lib/plugins/styling/lang/bg/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Kiril <neohidra@gmail.com>
*/
$lang['menu'] = 'Настройки на стила на шаблона';
diff --git a/lib/plugins/styling/lang/ca/lang.php b/lib/plugins/styling/lang/ca/lang.php
new file mode 100644
index 000000000..94ed85cbd
--- /dev/null
+++ b/lib/plugins/styling/lang/ca/lang.php
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Adolfo Jayme Barrientos <fito@libreoffice.org>
+ */
+$lang['menu'] = 'Paràmetres d’estil de la plantilla';
+$lang['error'] = 'Aquesta plantilla no admet aquesta funcionalitat.';
+$lang['btn_preview'] = 'Previsualitza els canvis';
+$lang['btn_save'] = 'Desa els canvis';
+$lang['btn_reset'] = 'Reinicialitza els canvis actuals';
+$lang['btn_revert'] = 'Reverteix els canvis als valors per defecte de la plantilla';
+$lang['__text__'] = 'Color principal del text';
+$lang['__background__'] = 'Color principal del fons';
+$lang['__text_alt__'] = 'Color alternatiu del text';
+$lang['__background_alt__'] = 'Color alternatiu del fons';
+$lang['__border__'] = 'Color de la vora';
diff --git a/lib/plugins/styling/lang/da/intro.txt b/lib/plugins/styling/lang/da/intro.txt
new file mode 100644
index 000000000..ecb0e2ef6
--- /dev/null
+++ b/lib/plugins/styling/lang/da/intro.txt
@@ -0,0 +1,2 @@
+Dette værktøj giver dig mulighed for at ændre udvalgte formateringer i dit valgte tema.
+Alle ændringer gemmes i en lokal indstillingsfil, og bevares ved opgraderinger. \ No newline at end of file
diff --git a/lib/plugins/styling/lang/da/lang.php b/lib/plugins/styling/lang/da/lang.php
new file mode 100644
index 000000000..1a69e7627
--- /dev/null
+++ b/lib/plugins/styling/lang/da/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Jacob Palm <mail@jacobpalm.dk>
+ */
+$lang['menu'] = 'Tema indstillinger - formatering';
+$lang['js']['loader'] = 'Eksempel indlæses...<br />Hvis denne side ikke forsvinder, er dine indstillinger muligvis ugyldige';
+$lang['js']['popup'] = 'Åbn som popup';
+$lang['error'] = 'Beklager, dette tema understøtter ikke denne funktion.';
+$lang['btn_preview'] = 'Forhåndsvis ændringer';
+$lang['btn_save'] = 'Gem ændringer';
+$lang['btn_reset'] = 'Nulstil ændringer';
+$lang['btn_revert'] = 'Nulstil formatering til temaets standardindstillinger';
+$lang['__text__'] = 'Grundlæggende tekstfarve';
+$lang['__background__'] = 'Grundlæggende baggrundsfarve';
+$lang['__text_alt__'] = 'Alternativ tekstfarve';
+$lang['__background_alt__'] = 'Alternativ baggrundsfarve';
+$lang['__text_neu__'] = 'Neutral tekstfarve';
+$lang['__background_neu__'] = 'Neutral baggrundsfarve';
+$lang['__border__'] = 'Ramme farve';
+$lang['__highlight__'] = 'Fremhævningsfarve (hovedsageligt til søgeresultater)';
diff --git a/lib/plugins/styling/lang/el/lang.php b/lib/plugins/styling/lang/el/lang.php
new file mode 100644
index 000000000..9f6b15012
--- /dev/null
+++ b/lib/plugins/styling/lang/el/lang.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Katerina Katapodi <extragold1234@hotmail.com>
+ */
+$lang['menu'] = 'Ρυθμίσεις Τύπου Μοντέλου';
+$lang['error'] = 'Συγγνώμη, αυτό το πρότυπο δεν υποστηρίζει αυτήν την λειτουργία.';
+$lang['btn_preview'] = 'Έλεγχος αλλαγών ';
+$lang['btn_save'] = 'Αποθηκεύσετε τις αλλαγές';
+$lang['btn_reset'] = 'Ρυθμίστε ξανά τις τρέχουσες αλλαγές';
+$lang['btn_revert'] = 'Τα πρότυπα επαναφοράς πίσω στο επιλεγμένο πρότυπο';
+$lang['__text__'] = 'Κύριο χρώμα κειμένου';
+$lang['__background__'] = 'Κύριο χρώμα φόντου';
+$lang['__text_alt__'] = 'Εναλλακτικό χρώμα κειμένου';
+$lang['__background_alt__'] = 'Εναλλακτικό χρώμα φόντου';
+$lang['__text_neu__'] = 'Ουδέτερο χρώμα κειμένου';
+$lang['__background_neu__'] = 'Ουδέτερο (λευκό?) χρώμα βάσης';
+$lang['__border__'] = 'Χρώμα πλαισίων';
+$lang['__highlight__'] = 'Χρώμα φωτισμού (κυρίως για αναζήτηση αποτελεσμάτων)';
diff --git a/lib/plugins/styling/lang/ja/lang.php b/lib/plugins/styling/lang/ja/lang.php
index 5c546a7cd..3069477f6 100644
--- a/lib/plugins/styling/lang/ja/lang.php
+++ b/lib/plugins/styling/lang/ja/lang.php
@@ -3,12 +3,13 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
* @author Hideaki SAWADA <chuno@live.jp>
*/
$lang['menu'] = 'テンプレートのスタイル設定';
$lang['js']['loader'] = 'プレビューを読込み中です・・・<br/>この表示が消えない場合、変更した設定値に問題があるかもしれません。';
$lang['js']['popup'] = 'ポップアップとして表示';
-$lang['error'] = 'このテンプレートは、この機能に対応していません。';
+$lang['error'] = '恐れ入りますが、このテンプレートはこの機能に対応していません。';
$lang['btn_preview'] = '変更内容のプレビュー';
$lang['btn_save'] = '変更内容の保存';
$lang['btn_reset'] = '変更内容の初期化';
diff --git a/lib/plugins/styling/lang/no/lang.php b/lib/plugins/styling/lang/no/lang.php
index f9a478b06..79229c957 100644
--- a/lib/plugins/styling/lang/no/lang.php
+++ b/lib/plugins/styling/lang/no/lang.php
@@ -4,7 +4,6 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Arne Hanssen <arne.hanssen@getmail.no>
- * @author Arne Hanssen <arnehans@getmail.no>
*/
$lang['menu'] = 'Innstillinger for malstil';
$lang['js']['loader'] = 'Forhåndsvisning laster...<br />Dersom denne ikke forsvinner, kan det hende at dine verdier er feil';
diff --git a/lib/plugins/styling/lang/oc/lang.php b/lib/plugins/styling/lang/oc/lang.php
new file mode 100644
index 000000000..a319e2d02
--- /dev/null
+++ b/lib/plugins/styling/lang/oc/lang.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author En Mathis <heartattack@free.fr>
+ */
+$lang['__text__'] = 'Color principala del tèxte';
+$lang['__background__'] = 'Color principala del fons';
+$lang['__text_alt__'] = 'Color alternativa del tèxte';
+$lang['__background_alt__'] = 'Color alternativa del fons';
diff --git a/lib/plugins/styling/lang/pt/intro.txt b/lib/plugins/styling/lang/pt/intro.txt
new file mode 100644
index 000000000..af48c6027
--- /dev/null
+++ b/lib/plugins/styling/lang/pt/intro.txt
@@ -0,0 +1,2 @@
+Essa ferramenta permite que você altere determinadas configurações de estilo do modelo atualmente selecionado.
+Todas as alterações são armazenadas em um arquivo de configuração local e são atualizadas com segurança. \ No newline at end of file
diff --git a/lib/plugins/styling/lang/pt/lang.php b/lib/plugins/styling/lang/pt/lang.php
index 1c64c0430..ac4d55f3a 100644
--- a/lib/plugins/styling/lang/pt/lang.php
+++ b/lib/plugins/styling/lang/pt/lang.php
@@ -3,17 +3,23 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
* @author Alfredo Silva <alfredo.silva@sky.com>
* @author Guilherme Sá <guilherme.sa@hotmail.com>
*/
$lang['menu'] = 'Configurações de Estilo do Modelo';
+$lang['js']['loader'] = 'A pré-visualização está carregando...<br />se isto não desaparecer, os seus valores podem estar errados';
$lang['js']['popup'] = 'Abrir como uma janela extra';
$lang['error'] = 'Desculpe, este modelo não suporta esta funcionalidade.';
$lang['btn_preview'] = 'Pré-visualizar alterações';
-$lang['btn_save'] = 'Guardar alterações';
+$lang['btn_save'] = 'Salvar alterações';
$lang['btn_reset'] = 'Reiniciar alterações atuais';
+$lang['btn_revert'] = 'Reverter estilos de volta ao padrão do modelo';
$lang['__text__'] = 'Cor do texto principal';
$lang['__background__'] = 'Cor principal do fundo';
$lang['__text_alt__'] = 'Cor alternativa de texto';
$lang['__background_alt__'] = 'Cor alternativa de fundo';
$lang['__text_neu__'] = 'Cor neutra de texto';
+$lang['__background_neu__'] = 'Cor de fundo neutro';
+$lang['__border__'] = 'Cor da borda';
+$lang['__highlight__'] = 'Cor de destaque (principalmente para resultados de pesquisa)';
diff --git a/lib/plugins/styling/lang/ru/lang.php b/lib/plugins/styling/lang/ru/lang.php
index 3c8e60b18..e034ae107 100644
--- a/lib/plugins/styling/lang/ru/lang.php
+++ b/lib/plugins/styling/lang/ru/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
* @author RainbowSpike <1@2.ru>
*/
$lang['menu'] = 'Настройки стилей шаблона';
@@ -20,4 +21,4 @@ $lang['__background_alt__'] = 'Второй цвет фона';
$lang['__text_neu__'] = 'Нейтральный цвет текста';
$lang['__background_neu__'] = 'Нейтральный цвет фона';
$lang['__border__'] = 'Цвет границ';
-$lang['__highlight__'] = 'Цвет подсветки (в основном для результатов поиска)';
+$lang['__highlight__'] = 'Цвет подсветки (в основном, для результатов поиска)';
diff --git a/lib/plugins/styling/lang/sk/lang.php b/lib/plugins/styling/lang/sk/lang.php
index 005835898..fcc32ad69 100644
--- a/lib/plugins/styling/lang/sk/lang.php
+++ b/lib/plugins/styling/lang/sk/lang.php
@@ -3,11 +3,16 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Peter Mydliar <peto.mydliar@gmail.com>
* @author Martin Michalek <michalek.dev@gmail.com>
*/
+$lang['menu'] = 'Nastavenie typov šablón';
+$lang['js']['popup'] = 'Otvor vo vyskakovacom okne';
+$lang['error'] = 'Táto šablóna nepodporuje túto funkciu.';
$lang['btn_preview'] = 'Náhľad zmien';
$lang['btn_save'] = 'Uloženie zmien';
$lang['btn_reset'] = 'Zruš prevedené zmeny';
+$lang['btn_revert'] = 'Vrátiť späť k základnej šablóne.';
$lang['__text__'] = 'Primárna farba textu';
$lang['__background__'] = 'Primárna farba pozadia';
$lang['__text_alt__'] = 'Alternatívna farba textu';
diff --git a/lib/plugins/styling/lang/uk/lang.php b/lib/plugins/styling/lang/uk/lang.php
new file mode 100644
index 000000000..61a9530c5
--- /dev/null
+++ b/lib/plugins/styling/lang/uk/lang.php
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Dmytro Marchenko <dmytro.marchenko1989@gmail.com>
+ */
+$lang['menu'] = 'Налаштування стилю шаблону';
+$lang['js']['popup'] = 'Відкрити як спливаюче вікно';
+$lang['error'] = 'На жаль, цей шаблон не підтримує цю функцію.';
+$lang['btn_preview'] = 'Попередній перегляд змін';
+$lang['btn_save'] = 'Зберегти зміни';
+$lang['btn_reset'] = 'Скидання поточних змін';
diff --git a/lib/plugins/styling/lang/vi/intro.txt b/lib/plugins/styling/lang/vi/intro.txt
new file mode 100644
index 000000000..c433a631b
--- /dev/null
+++ b/lib/plugins/styling/lang/vi/intro.txt
@@ -0,0 +1,2 @@
+Công cụ này cho phép bạn thay đổi các cài đặt kiểu dáng nhất định của chủ đề đang được sử dụng.
+Tất cả các thay đổi được lưu trữ trong một tập tin cấu hình cục bộ và được nâng cấp an toàn. \ No newline at end of file
diff --git a/lib/plugins/styling/lang/vi/lang.php b/lib/plugins/styling/lang/vi/lang.php
new file mode 100644
index 000000000..c987aa8d6
--- /dev/null
+++ b/lib/plugins/styling/lang/vi/lang.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['menu'] = 'Cài đặt kiểu dáng Chủ đề';
+$lang['js']['loader'] = 'Đang tải xem trước...<br />nếu cái này không biến mất, giá trị của bạn có thể bị lỗi';
+$lang['js']['popup'] = 'Mở dưới dạng cửa sổ bật lên';
+$lang['error'] = 'Xin lỗi, chủ đề này không hỗ trợ chức năng này.';
+$lang['btn_preview'] = 'Xem trước thay đổi';
+$lang['btn_save'] = 'Lưu thay đổi';
+$lang['btn_reset'] = 'Đặt lại các thay đổi hiện tại';
+$lang['btn_revert'] = 'Lùi sửa các kiểu dáng về mặc định của chủ đề';
+$lang['__text__'] = 'Màu văn bản chính';
+$lang['__background__'] = 'Màu nền chính';
+$lang['__text_alt__'] = 'Màu văn bản thay thế';
+$lang['__background_alt__'] = 'Màu nền thay thế';
+$lang['__text_neu__'] = 'Màu văn bản trung tính';
+$lang['__background_neu__'] = 'Màu nền trung tính';
+$lang['__border__'] = 'Màu viền';
+$lang['__highlight__'] = 'Màu phần tô lên (chủ yếu cho kết quả tìm kiếm)';
diff --git a/lib/plugins/styling/popup.php b/lib/plugins/styling/popup.php
index 964b19e29..079062e43 100644
--- a/lib/plugins/styling/popup.php
+++ b/lib/plugins/styling/popup.php
@@ -1,5 +1,6 @@
<?php
-if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__) . '/../../../');
+// phpcs:disable PSR1.Files.SideEffects
+if (!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__) . '/../../../');
require_once(DOKU_INC . 'inc/init.php');
//close session
session_write_close();
@@ -8,7 +9,7 @@ header('X-UA-Compatible: IE=edge,chrome=1');
/** @var admin_plugin_styling $plugin */
$plugin = plugin_load('admin', 'styling');
-if(!auth_isadmin()) die('only admins allowed');
+if (!$plugin->isAccessibleByCurrentUser()) die('only admins allowed');
$plugin->ispopup = true;
// handle posts
diff --git a/lib/plugins/styling/script.js b/lib/plugins/styling/script.js
index 074c8dc40..7fa8b2571 100644
--- a/lib/plugins/styling/script.js
+++ b/lib/plugins/styling/script.js
@@ -1,5 +1,3 @@
-/* DOKUWIKI:include_once iris.js */
-
jQuery(function () {
/**
@@ -55,16 +53,13 @@ jQuery(function () {
/* ---- from here on we're in the popup or admin page ---- */
- // add the color picker
- $styling_plugin.find('.color').iris({});
-
// add button on main page
if (!$styling_plugin.hasClass('ispopup')) {
var $form = $styling_plugin.find('form.styling').first();
var $btn = jQuery('<button>' + LANG.plugins.styling.popup + '</button>');
$form.prepend($btn);
- $btn.click(function (e) {
+ $btn.on('click', function (e) {
var windowFeatures = "menubar=no,location=no,resizable=yes,scrollbars=yes,status=false,width=500,height=500";
window.open(DOKU_BASE + 'lib/plugins/styling/popup.php', 'styling_popup', windowFeatures);
e.preventDefault();
@@ -78,8 +73,8 @@ jQuery(function () {
// reload the main page on close
window.onunload = function(e) {
if(doreload) {
- window.opener.DokuCookie.setValue('styling_plugin', 0);
- window.opener.document.location.reload();
+ DokuCookie.setValue('styling_plugin', 0);
+ if(window.opener) window.opener.document.location.reload();
}
return null;
};
@@ -90,8 +85,8 @@ jQuery(function () {
});
// on first load apply preview
- applyPreview(window.opener);
+ if(window.opener) applyPreview(window.opener);
// enable the preview cookie
- window.opener.DokuCookie.setValue('styling_plugin', 1);
+ DokuCookie.setValue('styling_plugin', 1);
});
diff --git a/lib/plugins/syntax.php b/lib/plugins/syntax.php
index 9e2913d78..a3cbec722 100644
--- a/lib/plugins/syntax.php
+++ b/lib/plugins/syntax.php
@@ -1,134 +1,2 @@
<?php
-/**
- * Syntax Plugin Prototype
- *
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-/**
- * All DokuWiki plugins to extend the parser/rendering mechanism
- * need to inherit from this class
- */
-class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode_Plugin {
-
- var $allowedModesSetup = false;
-
- /**
- * Syntax Type
- *
- * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
- *
- * @return string
- */
- function getType(){
- trigger_error('getType() not implemented in '.get_class($this), E_USER_WARNING);
- return '';
- }
-
- /**
- * Allowed Mode Types
- *
- * Defines the mode types for other dokuwiki markup that maybe nested within the
- * plugin's own markup. Needs to return an array of one or more of the mode types
- * defined in $PARSER_MODES in parser.php
- *
- * @return array
- */
- function getAllowedTypes() {
- return array();
- }
-
- /**
- * Paragraph Type
- *
- * Defines how this syntax is handled regarding paragraphs. This is important
- * for correct XHTML nesting. Should return one of the following:
- *
- * 'normal' - The plugin can be used inside paragraphs
- * 'block' - Open paragraphs need to be closed before plugin output
- * 'stack' - Special case. Plugin wraps other paragraphs.
- *
- * @see Doku_Handler_Block
- *
- * @return string
- */
- function getPType(){
- return 'normal';
- }
-
- /**
- * Handler to prepare matched data for the rendering process
- *
- * This function can only pass data to render() via its return value - render()
- * may be not be run during the object's current life.
- *
- * Usually you should only need the $match param.
- *
- * @param string $match The text matched by the patterns
- * @param int $state The lexer state for the match
- * @param int $pos The character position of the matched text
- * @param Doku_Handler $handler The Doku_Handler object
- * @return bool|array Return an array with all data you want to use in render, false don't add an instruction
- */
- function handle($match, $state, $pos, Doku_Handler $handler){
- trigger_error('handle() not implemented in '.get_class($this), E_USER_WARNING);
- }
-
- /**
- * Handles the actual output creation.
- *
- * The function must not assume any other of the classes methods have been run
- * during the object's current life. The only reliable data it receives are its
- * parameters.
- *
- * The function should always check for the given output format and return false
- * when a format isn't supported.
- *
- * $renderer contains a reference to the renderer object which is
- * currently handling the rendering. You need to use it for writing
- * the output. How this is done depends on the renderer used (specified
- * by $format
- *
- * The contents of the $data array depends on what the handler() function above
- * created
- *
- * @param string $format output format being rendered
- * @param Doku_Renderer $renderer the current renderer object
- * @param array $data data created by handler()
- * @return boolean rendered correctly? (however, returned value is not used at the moment)
- */
- function render($format, Doku_Renderer $renderer, $data) {
- trigger_error('render() not implemented in '.get_class($this), E_USER_WARNING);
-
- }
-
- /**
- * There should be no need to override this function
- *
- * @param string $mode
- * @return bool
- */
- function accepts($mode) {
-
- if (!$this->allowedModesSetup) {
- global $PARSER_MODES;
-
- $allowedModeTypes = $this->getAllowedTypes();
- foreach($allowedModeTypes as $mt) {
- $this->allowedModes = array_merge($this->allowedModes, $PARSER_MODES[$mt]);
- }
-
- $idx = array_search(substr(get_class($this), 7), (array) $this->allowedModes);
- if ($idx !== false) {
- unset($this->allowedModes[$idx]);
- }
- $this->allowedModesSetup = true;
- }
-
- return parent::accepts($mode);
- }
-}
-//Setup VIM: ex: et ts=4 :
+dbg_deprecated('Autoloading. Do not require() files yourself.');
diff --git a/lib/plugins/testing/action.php b/lib/plugins/testing/action.php
index a242ab0b7..09b84262e 100644
--- a/lib/plugins/testing/action.php
+++ b/lib/plugins/testing/action.php
@@ -1,4 +1,7 @@
<?php
+
+use dokuwiki\Extension\Event;
+
/**
* Plugin for testing the test system
*
@@ -8,13 +11,14 @@
*/
class action_plugin_testing extends DokuWiki_Action_Plugin {
- function register(Doku_Event_Handler $controller) {
+ /** @inheritdoc */
+ public function register(Doku_Event_Handler $controller) {
$controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'dokuwikiStarted');
}
- function dokuwikiStarted() {
+ public function dokuwikiStarted() {
$param = array();
- trigger_event('TESTING_PLUGIN_INSTALLED', $param);
+ Event::createAndTrigger('TESTING_PLUGIN_INSTALLED', $param);
msg('The testing plugin is enabled and should be disabled.',-1);
}
}
diff --git a/lib/plugins/testing/conf/default.php b/lib/plugins/testing/conf/default.php
new file mode 100644
index 000000000..392233dd8
--- /dev/null
+++ b/lib/plugins/testing/conf/default.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * Default options
+ *
+ * They don't do anything and are just there for testing config reading
+ */
+$conf['schnibble'] = 0;
diff --git a/lib/plugins/testing/conf/metadata.php b/lib/plugins/testing/conf/metadata.php
new file mode 100644
index 000000000..377da63eb
--- /dev/null
+++ b/lib/plugins/testing/conf/metadata.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * Option Metadata
+ *
+ * They don't do anything and are just there for testing config reading
+ */
+$meta['schnibble'] = array('onoff');
diff --git a/lib/plugins/testing/lang/en/settings.php b/lib/plugins/testing/lang/en/settings.php
new file mode 100644
index 000000000..e717c9021
--- /dev/null
+++ b/lib/plugins/testing/lang/en/settings.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Default options texts
+ */
+$lang['schnibble'] = 'Turns on the schnibble before the frobble is used';
diff --git a/lib/plugins/usermanager/_test/csv_import.test.php b/lib/plugins/usermanager/_test/csv_import.test.php
index 299e0183d..13034a012 100644
--- a/lib/plugins/usermanager/_test/csv_import.test.php
+++ b/lib/plugins/usermanager/_test/csv_import.test.php
@@ -14,13 +14,14 @@ require_once(dirname(__FILE__).'/mocks.class.php');
*
* At present, users imported in individual tests remain in the user list for subsequent tests
*/
-class plugin_usermanager_csv_import_test extends DokuWikiTest {
-
+class plugin_usermanager_csv_import_test extends DokuWikiTest
+{
private $old_files;
protected $usermanager;
protected $importfile;
- function setUp() {
+ public function setUp()
+ {
$this->importfile = tempnam(TMP_DIR, 'csv');
$this->old_files = $_FILES;
@@ -38,22 +39,27 @@ class plugin_usermanager_csv_import_test extends DokuWikiTest {
parent::setUp();
}
- function tearDown() {
+ public function tearDown()
+ {
$_FILES = $this->old_files;
parent::tearDown();
}
- function doImportTest($importCsv, $expectedResult, $expectedNewUsers, $expectedFailures) {
+ public function doImportTest($importCsv, $expectedResult, $expectedNewUsers, $expectedFailures)
+ {
global $auth;
$before_users = $auth->retrieveUsers();
- io_savefile($this->importfile, $importCsv);
+ io_saveFile($this->importfile, $importCsv);
$result = $this->usermanager->tryImport();
$after_users = $auth->retrieveUsers();
+
+ $before_users = array_map('serialize', $before_users);
+ $after_users = array_map('serialize', $after_users);
$import_count = count($after_users) - count($before_users);
- $new_users = array_diff_key($after_users, $before_users);
- $diff_users = array_diff_assoc($after_users, $before_users);
+ $new_users = array_map('unserialize', array_diff_key($after_users, $before_users));
+ $diff_users = array_map('unserialize', array_diff_assoc($after_users, $before_users));
$expectedCount = count($expectedNewUsers);
@@ -66,7 +72,8 @@ class plugin_usermanager_csv_import_test extends DokuWikiTest {
$this->assertEquals($expectedFailures, $this->usermanager->getImportFailures()); // failures as expected
}
- function test_cantImport(){
+ public function test_cantImport()
+ {
global $auth;
$oldauth = $auth;
@@ -82,7 +89,8 @@ importuser,"Ford Prefect",ford@example.com,user
$auth = $oldauth;
}
- function test_import() {
+ public function test_import()
+ {
$csv = 'User,"Real Name",Email,Groups
importuser,"Ford Prefect",ford@example.com,user
';
@@ -97,7 +105,8 @@ importuser,"Ford Prefect",ford@example.com,user
$this->doImportTest($csv, true, $expected, array());
}
- function test_importExisting() {
+ public function test_importExisting()
+ {
$csv = 'User,"Real Name",Email,Groups
importuser,"Ford Prefect",ford@example.com,user
';
@@ -117,7 +126,8 @@ importuser,"Ford Prefect",ford@example.com,user
$this->doImportTest($csv, true, array(), $failures);
}
- function test_importUtf8() {
+ public function test_importUtf8()
+ {
$csv = 'User,"Real Name",Email,Groups
importutf8,"Førd Prefect",ford@example.com,user
';
@@ -135,7 +145,8 @@ importutf8,"Førd Prefect",ford@example.com,user
/**
* utf8: u+00F8 (ø) <=> 0xF8 :iso-8859-1
*/
- function test_importIso8859() {
+ public function test_importIso8859()
+ {
$csv = 'User,"Real Name",Email,Groups
importiso8859,"F'.chr(0xF8).'rd Prefect",ford@example.com,user
';
@@ -150,14 +161,16 @@ importiso8859,"F'.chr(0xF8).'rd Prefect",ford@example.com,user
$this->doImportTest($csv, true, $expected, array());
}
- private function stripPasswords($array){
+ private function stripPasswords($array)
+ {
foreach ($array as $user => $data) {
unset($array[$user]['pass']);
}
return $array;
}
- private function countPasswords($array){
+ private function countPasswords($array)
+ {
$count = 0;
foreach ($array as $user => $data) {
if (!empty($data['pass'])) {
@@ -166,6 +179,4 @@ importiso8859,"F'.chr(0xF8).'rd Prefect",ford@example.com,user
}
return $count;
}
-
}
-
diff --git a/lib/plugins/usermanager/_test/mocks.class.php b/lib/plugins/usermanager/_test/mocks.class.php
index e524e451b..75ac51422 100644
--- a/lib/plugins/usermanager/_test/mocks.class.php
+++ b/lib/plugins/usermanager/_test/mocks.class.php
@@ -16,30 +16,30 @@ class admin_mock_usermanager extends admin_plugin_usermanager {
public $lang;
public function getImportFailures() {
- return $this->_import_failures;
+ return $this->import_failures;
}
public function tryExport() {
ob_start();
- $this->_export();
+ $this->exportCSV();
return ob_get_clean();
}
public function tryImport() {
- return $this->_import();
+ return $this->importCSV();
}
// no need to send email notifications (mostly)
- protected function _notifyUser($user, $password, $status_alert=true) {
+ protected function notifyUser($user, $password, $status_alert=true) {
if ($this->mock_email_notifications) {
$this->mock_email_notifications_sent++;
return true;
} else {
- return parent::_notifyUser($user, $password, $status_alert);
+ return parent::notifyUser($user, $password, $status_alert);
}
}
- protected function _isUploadedFile($file) {
+ protected function isUploadedFile($file) {
return file_exists($file);
}
}
diff --git a/lib/plugins/usermanager/admin.php b/lib/plugins/usermanager/admin.php
index 6d9bf3b20..423467133 100644
--- a/lib/plugins/usermanager/admin.php
+++ b/lib/plugins/usermanager/admin.php
@@ -10,52 +10,49 @@
* @author neolao <neolao@neolao.com>
* @author Chris Smith <chris@jalakai.co.uk>
*/
-// must be run within Dokuwiki
-if(!defined('DOKU_INC')) die();
-
-if(!defined('DOKU_PLUGIN_IMAGES')) define('DOKU_PLUGIN_IMAGES',DOKU_BASE.'lib/plugins/usermanager/images/');
/**
* All DokuWiki plugins to extend the admin function
* need to inherit from this class
*/
-class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
-
- protected $_auth = null; // auth object
- protected $_user_total = 0; // number of registered users
- protected $_filter = array(); // user selection filter(s)
- protected $_start = 0; // index of first user to be displayed
- protected $_last = 0; // index of the last user to be displayed
- protected $_pagesize = 20; // number of users to list on one page
- protected $_edit_user = ''; // set to user selected for editing
- protected $_edit_userdata = array();
- protected $_disabled = ''; // if disabled set to explanatory string
- protected $_import_failures = array();
- protected $_lastdisabled = false; // set to true if last user is unknown and last button is hence buggy
+class admin_plugin_usermanager extends DokuWiki_Admin_Plugin
+{
+ const IMAGE_DIR = DOKU_BASE.'lib/plugins/usermanager/images/';
+
+ protected $auth = null; // auth object
+ protected $users_total = 0; // number of registered users
+ protected $filter = array(); // user selection filter(s)
+ protected $start = 0; // index of first user to be displayed
+ protected $last = 0; // index of the last user to be displayed
+ protected $pagesize = 20; // number of users to list on one page
+ protected $edit_user = ''; // set to user selected for editing
+ protected $edit_userdata = array();
+ protected $disabled = ''; // if disabled set to explanatory string
+ protected $import_failures = array();
+ protected $lastdisabled = false; // set to true if last user is unknown and last button is hence buggy
/**
* Constructor
*/
- public function __construct(){
+ public function __construct()
+ {
/** @var DokuWiki_Auth_Plugin $auth */
global $auth;
$this->setupLocale();
if (!isset($auth)) {
- $this->_disabled = $this->lang['noauth'];
- } else if (!$auth->canDo('getUsers')) {
- $this->_disabled = $this->lang['nosupport'];
+ $this->disabled = $this->lang['noauth'];
+ } elseif (!$auth->canDo('getUsers')) {
+ $this->disabled = $this->lang['nosupport'];
} else {
-
// we're good to go
- $this->_auth = & $auth;
-
+ $this->auth = & $auth;
}
// attempt to retrieve any import failures from the session
- if (!empty($_SESSION['import_failures'])){
- $this->_import_failures = $_SESSION['import_failures'];
+ if (!empty($_SESSION['import_failures'])) {
+ $this->import_failures = $_SESSION['import_failures'];
}
}
@@ -65,12 +62,13 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param string $language
* @return string
*/
- public function getMenuText($language) {
+ public function getMenuText($language)
+ {
- if (!is_null($this->_auth))
+ if (!is_null($this->auth))
return parent::getMenuText($language);
- return $this->getLang('menu').' '.$this->_disabled;
+ return $this->getLang('menu').' '.$this->disabled;
}
/**
@@ -78,29 +76,33 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @return int
*/
- public function getMenuSort() {
+ public function getMenuSort()
+ {
return 2;
}
/**
* @return int current start value for pageination
*/
- public function getStart() {
- return $this->_start;
+ public function getStart()
+ {
+ return $this->start;
}
/**
* @return int number of users per page
*/
- public function getPagesize() {
- return $this->_pagesize;
+ public function getPagesize()
+ {
+ return $this->pagesize;
}
/**
* @param boolean $lastdisabled
*/
- public function setLastdisabled($lastdisabled) {
- $this->_lastdisabled = $lastdisabled;
+ public function setLastdisabled($lastdisabled)
+ {
+ $this->lastdisabled = $lastdisabled;
}
/**
@@ -108,9 +110,10 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @return bool
*/
- public function handle() {
+ public function handle()
+ {
global $INPUT;
- if (is_null($this->_auth)) return false;
+ if (is_null($this->auth)) return false;
// extract the command and any specific parameters
// submit button name is of the form - fn[cmd][param(s)]
@@ -125,33 +128,56 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
}
if ($cmd != "search") {
- $this->_start = $INPUT->int('start', 0);
- $this->_filter = $this->_retrieveFilter();
+ $this->start = $INPUT->int('start', 0);
+ $this->filter = $this->retrieveFilter();
}
- switch($cmd){
- case "add" : $this->_addUser(); break;
- case "delete" : $this->_deleteUser(); break;
- case "modify" : $this->_modifyUser(); break;
- case "edit" : $this->_editUser($param); break;
- case "search" : $this->_setFilter($param);
- $this->_start = 0;
- break;
- case "export" : $this->_export(); break;
- case "import" : $this->_import(); break;
- case "importfails" : $this->_downloadImportFailures(); break;
+ switch ($cmd) {
+ case "add":
+ $this->addUser();
+ break;
+ case "delete":
+ $this->deleteUser();
+ break;
+ case "modify":
+ $this->modifyUser();
+ break;
+ case "edit":
+ $this->editUser($param);
+ break;
+ case "search":
+ $this->setFilter($param);
+ $this->start = 0;
+ break;
+ case "export":
+ $this->exportCSV();
+ break;
+ case "import":
+ $this->importCSV();
+ break;
+ case "importfails":
+ $this->downloadImportFailures();
+ break;
}
- $this->_user_total = $this->_auth->canDo('getUserCount') ? $this->_auth->getUserCount($this->_filter) : -1;
+ $this->users_total = $this->auth->canDo('getUserCount') ? $this->auth->getUserCount($this->filter) : -1;
// page handling
- switch($cmd){
- case 'start' : $this->_start = 0; break;
- case 'prev' : $this->_start -= $this->_pagesize; break;
- case 'next' : $this->_start += $this->_pagesize; break;
- case 'last' : $this->_start = $this->_user_total; break;
+ switch ($cmd) {
+ case 'start':
+ $this->start = 0;
+ break;
+ case 'prev':
+ $this->start -= $this->pagesize;
+ break;
+ case 'next':
+ $this->start += $this->pagesize;
+ break;
+ case 'last':
+ $this->start = $this->users_total;
+ break;
}
- $this->_validatePagination();
+ $this->validatePagination();
return true;
}
@@ -160,21 +186,22 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @return bool
*/
- public function html() {
+ public function html()
+ {
global $ID;
- if(is_null($this->_auth)) {
+ if (is_null($this->auth)) {
print $this->lang['badauth'];
return false;
}
- $user_list = $this->_auth->retrieveUsers($this->_start, $this->_pagesize, $this->_filter);
+ $user_list = $this->auth->retrieveUsers($this->start, $this->pagesize, $this->filter);
- $page_buttons = $this->_pagination();
- $delete_disable = $this->_auth->canDo('delUser') ? '' : 'disabled="disabled"';
+ $page_buttons = $this->pagination();
+ $delete_disable = $this->auth->canDo('delUser') ? '' : 'disabled="disabled"';
- $editable = $this->_auth->canDo('UserMod');
- $export_label = empty($this->_filter) ? $this->lang['export_all'] : $this->lang['export_filtered'];
+ $editable = $this->auth->canDo('UserMod');
+ $export_label = empty($this->filter) ? $this->lang['export_all'] : $this->lang['export_filtered'];
print $this->locale_xhtml('intro');
print $this->locale_xhtml('list');
@@ -182,13 +209,21 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
ptln("<div id=\"user__manager\">");
ptln("<div class=\"level2\">");
- if ($this->_user_total > 0) {
- ptln("<p>".sprintf($this->lang['summary'],$this->_start+1,$this->_last,$this->_user_total,$this->_auth->getUserCount())."</p>");
+ if ($this->users_total > 0) {
+ ptln(
+ "<p>" . sprintf(
+ $this->lang['summary'],
+ $this->start + 1,
+ $this->last,
+ $this->users_total,
+ $this->auth->getUserCount()
+ ) . "</p>"
+ );
} else {
- if($this->_user_total < 0) {
+ if ($this->users_total < 0) {
$allUserTotal = 0;
} else {
- $allUserTotal = $this->_auth->getUserCount();
+ $allUserTotal = $this->auth->getUserCount();
}
ptln("<p>".sprintf($this->lang['nonefound'], $allUserTotal)."</p>");
}
@@ -198,19 +233,29 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
ptln(" <table class=\"inline\">");
ptln(" <thead>");
ptln(" <tr>");
- 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(" <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>");
- ptln(" <td class=\"rightalign\"><input type=\"image\" src=\"".DOKU_PLUGIN_IMAGES."search.png\" name=\"fn[search][new]\" title=\"".$this->lang['search_prompt']."\" alt=\"".$this->lang['search']."\" class=\"button\" /></td>");
- ptln(" <td><input type=\"text\" name=\"userid\" class=\"edit\" value=\"".$this->_htmlFilter('user')."\" /></td>");
- ptln(" <td><input type=\"text\" name=\"username\" class=\"edit\" value=\"".$this->_htmlFilter('name')."\" /></td>");
- ptln(" <td><input type=\"text\" name=\"usermail\" class=\"edit\" value=\"".$this->_htmlFilter('mail')."\" /></td>");
- ptln(" <td><input type=\"text\" name=\"usergroups\" class=\"edit\" value=\"".$this->_htmlFilter('grps')."\" /></td>");
+ ptln(" <td class=\"rightalign\"><input type=\"image\" src=\"".
+ self::IMAGE_DIR."search.png\" name=\"fn[search][new]\" title=\"".
+ $this->lang['search_prompt']."\" alt=\"".$this->lang['search']."\" class=\"button\" /></td>");
+ ptln(" <td><input type=\"text\" name=\"userid\" class=\"edit\" value=\"".
+ $this->htmlFilter('user')."\" /></td>");
+ ptln(" <td><input type=\"text\" name=\"username\" class=\"edit\" value=\"".
+ $this->htmlFilter('name')."\" /></td>");
+ ptln(" <td><input type=\"text\" name=\"usermail\" class=\"edit\" value=\"".
+ $this->htmlFilter('mail')."\" /></td>");
+ ptln(" <td><input type=\"text\" name=\"usergroups\" class=\"edit\" value=\"".
+ $this->htmlFilter('grps')."\" /></td>");
ptln(" </tr>");
ptln(" </thead>");
- if ($this->_user_total) {
+ if ($this->users_total) {
ptln(" <tbody>");
foreach ($user_list as $user => $userinfo) {
extract($userinfo);
@@ -220,11 +265,12 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @var string $mail
* @var array $grps
*/
- $groups = join(', ',$grps);
+ $groups = join(', ', $grps);
ptln(" <tr class=\"user_info\">");
- ptln(" <td class=\"centeralign\"><input type=\"checkbox\" name=\"delete[".hsc($user)."]\" ".$delete_disable." /></td>");
+ ptln(" <td class=\"centeralign\"><input type=\"checkbox\" name=\"delete[".hsc($user).
+ "]\" ".$delete_disable." /></td>");
if ($editable) {
- ptln(" <td><a href=\"".wl($ID,array('fn[edit]['.$user.']' => 1,
+ ptln(" <td><a href=\"".wl($ID, array('fn[edit]['.$user.']' => 1,
'do' => 'admin',
'page' => 'usermanager',
'sectok' => getSecurityToken())).
@@ -241,22 +287,27 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
ptln(" <tbody>");
ptln(" <tr><td colspan=\"5\" class=\"centeralign\">");
ptln(" <span class=\"medialeft\">");
- ptln(" <button type=\"submit\" name=\"fn[delete]\" id=\"usrmgr__del\" ".$delete_disable.">".$this->lang['delete_selected']."</button>");
+ ptln(" <button type=\"submit\" name=\"fn[delete]\" id=\"usrmgr__del\" ".$delete_disable.">".
+ $this->lang['delete_selected']."</button>");
ptln(" </span>");
ptln(" <span class=\"mediaright\">");
- ptln(" <button type=\"submit\" name=\"fn[start]\" ".$page_buttons['start'].">".$this->lang['start']."</button>");
- ptln(" <button type=\"submit\" name=\"fn[prev]\" ".$page_buttons['prev'].">".$this->lang['prev']."</button>");
- ptln(" <button type=\"submit\" name=\"fn[next]\" ".$page_buttons['next'].">".$this->lang['next']."</button>");
- ptln(" <button type=\"submit\" name=\"fn[last]\" ".$page_buttons['last'].">".$this->lang['last']."</button>");
+ ptln(" <button type=\"submit\" name=\"fn[start]\" ".$page_buttons['start'].">".
+ $this->lang['start']."</button>");
+ ptln(" <button type=\"submit\" name=\"fn[prev]\" ".$page_buttons['prev'].">".
+ $this->lang['prev']."</button>");
+ ptln(" <button type=\"submit\" name=\"fn[next]\" ".$page_buttons['next'].">".
+ $this->lang['next']."</button>");
+ ptln(" <button type=\"submit\" name=\"fn[last]\" ".$page_buttons['last'].">".
+ $this->lang['last']."</button>");
ptln(" </span>");
- if (!empty($this->_filter)) {
+ if (!empty($this->filter)) {
ptln(" <button type=\"submit\" name=\"fn[search][clear]\">".$this->lang['clear']."</button>");
}
ptln(" <button type=\"submit\" name=\"fn[export]\">".$export_label."</button>");
ptln(" <input type=\"hidden\" name=\"do\" value=\"admin\" />");
ptln(" <input type=\"hidden\" name=\"page\" value=\"usermanager\" />");
- $this->_htmlFilterSettings(2);
+ $this->htmlFilterSettings(2);
ptln(" </td></tr>");
ptln(" </tbody>");
@@ -266,38 +317,56 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
ptln("</form>");
ptln("</div>");
- $style = $this->_edit_user ? " class=\"edit_user\"" : "";
+ $style = $this->edit_user ? " class=\"edit_user\"" : "";
- if ($this->_auth->canDo('addUser')) {
+ if ($this->auth->canDo('addUser')) {
ptln("<div".$style.">");
print $this->locale_xhtml('add');
ptln(" <div class=\"level2\">");
- $this->_htmlUserForm('add',null,array(),4);
+ $this->htmlUserForm('add', null, array(), 4);
ptln(" </div>");
ptln("</div>");
}
- if($this->_edit_user && $this->_auth->canDo('UserMod')){
+ if ($this->edit_user && $this->auth->canDo('UserMod')) {
ptln("<div".$style." id=\"scroll__here\">");
print $this->locale_xhtml('edit');
ptln(" <div class=\"level2\">");
- $this->_htmlUserForm('modify',$this->_edit_user,$this->_edit_userdata,4);
+ $this->htmlUserForm('modify', $this->edit_user, $this->edit_userdata, 4);
ptln(" </div>");
ptln("</div>");
}
- if ($this->_auth->canDo('addUser')) {
- $this->_htmlImportForm();
+ if ($this->auth->canDo('addUser')) {
+ $this->htmlImportForm();
}
ptln("</div>");
return true;
}
/**
+ * User Manager is only available if the auth backend supports it
+ *
+ * @inheritdoc
+ * @return bool
+ */
+ public function isAccessibleByCurrentUser()
+ {
+ /** @var DokuWiki_Auth_Plugin $auth */
+ global $auth;
+ if(!$auth || !$auth->canDo('getUsers') ) {
+ return false;
+ }
+
+ return parent::isAccessibleByCurrentUser();
+ }
+
+
+ /**
* Display form to add or modify a user
*
* @param string $cmd 'add' or 'modify'
@@ -305,7 +374,8 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param array $userdata array with name, mail, pass and grps
* @param int $indent
*/
- protected function _htmlUserForm($cmd,$user='',$userdata=array(),$indent=0) {
+ protected function htmlUserForm($cmd, $user = '', $userdata = array(), $indent = 0)
+ {
global $conf;
global $ID;
global $lang;
@@ -315,28 +385,76 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
if ($user) {
extract($userdata);
- if (!empty($grps)) $groups = join(',',$grps);
+ if (!empty($grps)) $groups = join(',', $grps);
} else {
- $notes[] = sprintf($this->lang['note_group'],$conf['defaultgroup']);
+ $notes[] = sprintf($this->lang['note_group'], $conf['defaultgroup']);
}
- ptln("<form action=\"".wl($ID)."\" method=\"post\">",$indent);
+ 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);
- ptln(" </thead>",$indent);
- ptln(" <tbody>",$indent);
-
- $this->_htmlInputField($cmd."_userid", "userid", $this->lang["user_id"], $user, $this->_auth->canDo("modLogin"), true, $indent+6);
- $this->_htmlInputField($cmd."_userpass", "userpass", $this->lang["user_pass"], "", $this->_auth->canDo("modPass"), false, $indent+6);
- $this->_htmlInputField($cmd."_userpass2", "userpass2", $lang["passchk"], "", $this->_auth->canDo("modPass"), false, $indent+6);
- $this->_htmlInputField($cmd."_username", "username", $this->lang["user_name"], $name, $this->_auth->canDo("modName"), true, $indent+6);
- $this->_htmlInputField($cmd."_usermail", "usermail", $this->lang["user_mail"], $mail, $this->_auth->canDo("modMail"), true, $indent+6);
- $this->_htmlInputField($cmd."_usergroups","usergroups",$this->lang["user_groups"],$groups,$this->_auth->canDo("modGroups"), false, $indent+6);
-
- if ($this->_auth->canDo("modPass")) {
+ 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);
+ ptln(" </thead>", $indent);
+ ptln(" <tbody>", $indent);
+
+ $this->htmlInputField(
+ $cmd . "_userid",
+ "userid",
+ $this->lang["user_id"],
+ $user,
+ $this->auth->canDo("modLogin"),
+ true,
+ $indent + 6
+ );
+ $this->htmlInputField(
+ $cmd . "_userpass",
+ "userpass",
+ $this->lang["user_pass"],
+ "",
+ $this->auth->canDo("modPass"),
+ false,
+ $indent + 6
+ );
+ $this->htmlInputField(
+ $cmd . "_userpass2",
+ "userpass2",
+ $lang["passchk"],
+ "",
+ $this->auth->canDo("modPass"),
+ false,
+ $indent + 6
+ );
+ $this->htmlInputField(
+ $cmd . "_username",
+ "username",
+ $this->lang["user_name"],
+ $name,
+ $this->auth->canDo("modName"),
+ true,
+ $indent + 6
+ );
+ $this->htmlInputField(
+ $cmd . "_usermail",
+ "usermail",
+ $this->lang["user_mail"],
+ $mail,
+ $this->auth->canDo("modMail"),
+ true,
+ $indent + 6
+ );
+ $this->htmlInputField(
+ $cmd . "_usergroups",
+ "usergroups",
+ $this->lang["user_groups"],
+ $groups,
+ $this->auth->canDo("modGroups"),
+ false,
+ $indent + 6
+ );
+
+ if ($this->auth->canDo("modPass")) {
if ($cmd == 'add') {
$notes[] = $this->lang['note_pass'];
}
@@ -344,37 +462,40 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
$notes[] = $this->lang['note_notify'];
}
- ptln("<tr><td><label for=\"".$cmd."_usernotify\" >".$this->lang["user_notify"].": </label></td><td><input type=\"checkbox\" id=\"".$cmd."_usernotify\" name=\"usernotify\" value=\"1\" /></td></tr>", $indent);
+ ptln("<tr><td><label for=\"".$cmd."_usernotify\" >".
+ $this->lang["user_notify"].": </label></td>
+ <td><input type=\"checkbox\" id=\"".$cmd."_usernotify\" name=\"usernotify\" value=\"1\" />
+ </td></tr>", $indent);
}
- ptln(" </tbody>",$indent);
- ptln(" <tbody>",$indent);
- ptln(" <tr>",$indent);
- ptln(" <td colspan=\"2\">",$indent);
- ptln(" <input type=\"hidden\" name=\"do\" value=\"admin\" />",$indent);
- ptln(" <input type=\"hidden\" name=\"page\" value=\"usermanager\" />",$indent);
+ ptln(" </tbody>", $indent);
+ ptln(" <tbody>", $indent);
+ ptln(" <tr>", $indent);
+ ptln(" <td colspan=\"2\">", $indent);
+ ptln(" <input type=\"hidden\" name=\"do\" value=\"admin\" />", $indent);
+ ptln(" <input type=\"hidden\" name=\"page\" value=\"usermanager\" />", $indent);
// save current $user, we need this to access details if the name is changed
if ($user)
- ptln(" <input type=\"hidden\" name=\"userid_old\" value=\"".hsc($user)."\" />",$indent);
+ ptln(" <input type=\"hidden\" name=\"userid_old\" value=\"".hsc($user)."\" />", $indent);
- $this->_htmlFilterSettings($indent+10);
+ $this->htmlFilterSettings($indent+10);
- ptln(" <button type=\"submit\" name=\"fn[".$cmd."]\">".$this->lang[$cmd]."</button>",$indent);
- ptln(" </td>",$indent);
- ptln(" </tr>",$indent);
- ptln(" </tbody>",$indent);
- ptln(" </table>",$indent);
+ ptln(" <button type=\"submit\" name=\"fn[".$cmd."]\">".$this->lang[$cmd]."</button>", $indent);
+ ptln(" </td>", $indent);
+ ptln(" </tr>", $indent);
+ ptln(" </tbody>", $indent);
+ ptln(" </table>", $indent);
if ($notes) {
ptln(" <ul class=\"notes\">");
foreach ($notes as $note) {
- ptln(" <li><span class=\"li\">".$note."</li>",$indent);
+ ptln(" <li><span class=\"li\">".$note."</li>", $indent);
}
ptln(" </ul>");
}
- ptln(" </div>",$indent);
- ptln("</form>",$indent);
+ ptln(" </div>", $indent);
+ ptln("</form>", $indent);
}
/**
@@ -388,17 +509,18 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param bool $required is this field required?
* @param int $indent
*/
- protected function _htmlInputField($id, $name, $label, $value, $cando, $required, $indent=0) {
+ protected function htmlInputField($id, $name, $label, $value, $cando, $required, $indent = 0)
+ {
$class = $cando ? '' : ' class="disabled"';
- echo str_pad('',$indent);
+ echo str_pad('', $indent);
- if($name == 'userpass' || $name == 'userpass2'){
+ if ($name == 'userpass' || $name == 'userpass2') {
$fieldtype = 'password';
$autocomp = 'autocomplete="off"';
- }elseif($name == 'usermail'){
+ } elseif ($name == 'usermail') {
$fieldtype = 'email';
$autocomp = '';
- }else{
+ } else {
$fieldtype = 'text';
$autocomp = '';
}
@@ -407,13 +529,15 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
echo "<tr $class>";
echo "<td><label for=\"$id\" >$label: </label></td>";
echo "<td>";
- if($cando){
+ if ($cando) {
$req = '';
- if($required) $req = 'required="required"';
- echo "<input type=\"$fieldtype\" id=\"$id\" name=\"$name\" value=\"$value\" class=\"edit\" $autocomp $req />";
- }else{
+ if ($required) $req = 'required="required"';
+ echo "<input type=\"$fieldtype\" id=\"$id\" name=\"$name\"
+ value=\"$value\" class=\"edit\" $autocomp $req />";
+ } else {
echo "<input type=\"hidden\" name=\"$name\" value=\"$value\" />";
- echo "<input type=\"$fieldtype\" id=\"$id\" name=\"$name\" value=\"$value\" class=\"edit disabled\" disabled=\"disabled\" />";
+ echo "<input type=\"$fieldtype\" id=\"$id\" name=\"$name\"
+ value=\"$value\" class=\"edit disabled\" disabled=\"disabled\" />";
}
echo "</td>";
echo "</tr>";
@@ -425,9 +549,10 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param string $key name of search field
* @return string html escaped value
*/
- protected function _htmlFilter($key) {
- if (empty($this->_filter)) return '';
- return (isset($this->_filter[$key]) ? hsc($this->_filter[$key]) : '');
+ protected function htmlFilter($key)
+ {
+ if (empty($this->filter)) return '';
+ return (isset($this->filter[$key]) ? hsc($this->filter[$key]) : '');
}
/**
@@ -435,12 +560,13 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @param int $indent
*/
- protected function _htmlFilterSettings($indent=0) {
+ protected function htmlFilterSettings($indent = 0)
+ {
- ptln("<input type=\"hidden\" name=\"start\" value=\"".$this->_start."\" />",$indent);
+ ptln("<input type=\"hidden\" name=\"start\" value=\"".$this->start."\" />", $indent);
- foreach ($this->_filter as $key => $filter) {
- ptln("<input type=\"hidden\" name=\"filter[".$key."]\" value=\"".hsc($filter)."\" />",$indent);
+ foreach ($this->filter as $key => $filter) {
+ ptln("<input type=\"hidden\" name=\"filter[".$key."]\" value=\"".hsc($filter)."\" />", $indent);
}
}
@@ -449,57 +575,57 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @param int $indent
*/
- protected function _htmlImportForm($indent=0) {
+ protected function htmlImportForm($indent = 0)
+ {
global $ID;
- $failure_download_link = wl($ID,array('do'=>'admin','page'=>'usermanager','fn[importfails]'=>1));
+ $failure_download_link = wl($ID, array('do'=>'admin','page'=>'usermanager','fn[importfails]'=>1));
- ptln('<div class="level2 import_users">',$indent);
+ ptln('<div class="level2 import_users">', $indent);
print $this->locale_xhtml('import');
- ptln(' <form action="'.wl($ID).'" method="post" enctype="multipart/form-data">',$indent);
+ ptln(' <form action="'.wl($ID).'" method="post" enctype="multipart/form-data">', $indent);
formSecurityToken();
- ptln(' <label>'.$this->lang['import_userlistcsv'].'<input type="file" name="import" /></label>',$indent);
- ptln(' <button type="submit" name="fn[import]">'.$this->lang['import'].'</button>',$indent);
- ptln(' <input type="hidden" name="do" value="admin" />',$indent);
- ptln(' <input type="hidden" name="page" value="usermanager" />',$indent);
+ ptln(' <label>'.$this->lang['import_userlistcsv'].'<input type="file" name="import" /></label>', $indent);
+ ptln(' <button type="submit" name="fn[import]">'.$this->lang['import'].'</button>', $indent);
+ ptln(' <input type="hidden" name="do" value="admin" />', $indent);
+ ptln(' <input type="hidden" name="page" value="usermanager" />', $indent);
- $this->_htmlFilterSettings($indent+4);
- ptln(' </form>',$indent);
+ $this->htmlFilterSettings($indent+4);
+ ptln(' </form>', $indent);
ptln('</div>');
// list failures from the previous import
- if ($this->_import_failures) {
- $digits = strlen(count($this->_import_failures));
- ptln('<div class="level3 import_failures">',$indent);
+ if ($this->import_failures) {
+ $digits = strlen(count($this->import_failures));
+ ptln('<div class="level3 import_failures">', $indent);
ptln(' <h3>'.$this->lang['import_header'].'</h3>');
- ptln(' <table class="import_failures">',$indent);
- ptln(' <thead>',$indent);
- ptln(' <tr>',$indent);
- ptln(' <th class="line">'.$this->lang['line'].'</th>',$indent);
- ptln(' <th class="error">'.$this->lang['error'].'</th>',$indent);
- ptln(' <th class="userid">'.$this->lang['user_id'].'</th>',$indent);
- ptln(' <th class="username">'.$this->lang['user_name'].'</th>',$indent);
- ptln(' <th class="usermail">'.$this->lang['user_mail'].'</th>',$indent);
- ptln(' <th class="usergroups">'.$this->lang['user_groups'].'</th>',$indent);
- ptln(' </tr>',$indent);
- ptln(' </thead>',$indent);
- ptln(' <tbody>',$indent);
- foreach ($this->_import_failures as $line => $failure) {
- ptln(' <tr>',$indent);
- ptln(' <td class="lineno"> '.sprintf('%0'.$digits.'d',$line).' </td>',$indent);
+ ptln(' <table class="import_failures">', $indent);
+ ptln(' <thead>', $indent);
+ ptln(' <tr>', $indent);
+ ptln(' <th class="line">'.$this->lang['line'].'</th>', $indent);
+ ptln(' <th class="error">'.$this->lang['error'].'</th>', $indent);
+ ptln(' <th class="userid">'.$this->lang['user_id'].'</th>', $indent);
+ ptln(' <th class="username">'.$this->lang['user_name'].'</th>', $indent);
+ ptln(' <th class="usermail">'.$this->lang['user_mail'].'</th>', $indent);
+ ptln(' <th class="usergroups">'.$this->lang['user_groups'].'</th>', $indent);
+ ptln(' </tr>', $indent);
+ ptln(' </thead>', $indent);
+ ptln(' <tbody>', $indent);
+ foreach ($this->import_failures as $line => $failure) {
+ ptln(' <tr>', $indent);
+ ptln(' <td class="lineno"> '.sprintf('%0'.$digits.'d', $line).' </td>', $indent);
ptln(' <td class="error">' .$failure['error'].' </td>', $indent);
- ptln(' <td class="field userid"> '.hsc($failure['user'][0]).' </td>',$indent);
- ptln(' <td class="field username"> '.hsc($failure['user'][2]).' </td>',$indent);
- ptln(' <td class="field usermail"> '.hsc($failure['user'][3]).' </td>',$indent);
- ptln(' <td class="field usergroups"> '.hsc($failure['user'][4]).' </td>',$indent);
- ptln(' </tr>',$indent);
+ ptln(' <td class="field userid"> '.hsc($failure['user'][0]).' </td>', $indent);
+ ptln(' <td class="field username"> '.hsc($failure['user'][2]).' </td>', $indent);
+ ptln(' <td class="field usermail"> '.hsc($failure['user'][3]).' </td>', $indent);
+ ptln(' <td class="field usergroups"> '.hsc($failure['user'][4]).' </td>', $indent);
+ ptln(' </tr>', $indent);
}
- ptln(' </tbody>',$indent);
- ptln(' </table>',$indent);
+ ptln(' </tbody>', $indent);
+ ptln(' </table>', $indent);
ptln(' <p><a href="'.$failure_download_link.'">'.$this->lang['import_downloadfailures'].'</a></p>');
ptln('</div>');
}
-
}
/**
@@ -507,17 +633,18 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @return bool whether succesful
*/
- protected function _addUser(){
+ protected function addUser()
+ {
global $INPUT;
if (!checkSecurityToken()) return false;
- if (!$this->_auth->canDo('addUser')) return false;
+ if (!$this->auth->canDo('addUser')) return false;
- list($user,$pass,$name,$mail,$grps,$passconfirm) = $this->_retrieveUser();
+ list($user,$pass,$name,$mail,$grps,$passconfirm) = $this->retrieveUser();
if (empty($user)) return false;
- if ($this->_auth->canDo('modPass')){
- if (empty($pass)){
- if($INPUT->has('usernotify')){
+ if ($this->auth->canDo('modPass')) {
+ if (empty($pass)) {
+ if ($INPUT->has('usernotify')) {
$pass = auth_pwgen($user);
} else {
msg($this->lang['add_fail'], -1);
@@ -525,54 +652,53 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
return false;
}
} else {
- if (!$this->_verifyPassword($pass,$passconfirm)) {
+ if (!$this->verifyPassword($pass, $passconfirm)) {
msg($this->lang['add_fail'], -1);
msg($this->lang['addUser_error_pass_not_identical'], -1);
return false;
}
}
} else {
- if (!empty($pass)){
+ if (!empty($pass)) {
msg($this->lang['add_fail'], -1);
msg($this->lang['addUser_error_modPass_disabled'], -1);
return false;
}
}
- if ($this->_auth->canDo('modName')){
- if (empty($name)){
+ if ($this->auth->canDo('modName')) {
+ if (empty($name)) {
msg($this->lang['add_fail'], -1);
msg($this->lang['addUser_error_name_missing'], -1);
return false;
}
} else {
- if (!empty($name)){
+ if (!empty($name)) {
msg($this->lang['add_fail'], -1);
msg($this->lang['addUser_error_modName_disabled'], -1);
return false;
}
}
- if ($this->_auth->canDo('modMail')){
- if (empty($mail)){
+ if ($this->auth->canDo('modMail')) {
+ if (empty($mail)) {
msg($this->lang['add_fail'], -1);
msg($this->lang['addUser_error_mail_missing'], -1);
return false;
}
} else {
- if (!empty($mail)){
+ if (!empty($mail)) {
msg($this->lang['add_fail'], -1);
msg($this->lang['addUser_error_modMail_disabled'], -1);
return false;
}
}
- if ($ok = $this->_auth->triggerUserMod('create', array($user,$pass,$name,$mail,$grps))) {
-
+ if ($ok = $this->auth->triggerUserMod('create', array($user, $pass, $name, $mail, $grps))) {
msg($this->lang['add_ok'], 1);
if ($INPUT->has('usernotify') && $pass) {
- $this->_notifyUser($user,$pass);
+ $this->notifyUser($user, $pass);
}
} else {
msg($this->lang['add_fail'], -1);
@@ -587,33 +713,34 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @return bool whether succesful
*/
- protected function _deleteUser(){
+ protected function deleteUser()
+ {
global $conf, $INPUT;
if (!checkSecurityToken()) return false;
- if (!$this->_auth->canDo('delUser')) return false;
+ if (!$this->auth->canDo('delUser')) return false;
$selected = $INPUT->arr('delete');
if (empty($selected)) return false;
$selected = array_keys($selected);
- if(in_array($_SERVER['REMOTE_USER'], $selected)) {
+ if (in_array($_SERVER['REMOTE_USER'], $selected)) {
msg("You can't delete yourself!", -1);
return false;
}
- $count = $this->_auth->triggerUserMod('delete', array($selected));
+ $count = $this->auth->triggerUserMod('delete', array($selected));
if ($count == count($selected)) {
$text = str_replace('%d', $count, $this->lang['delete_ok']);
msg("$text.", 1);
} else {
$part1 = str_replace('%d', $count, $this->lang['delete_ok']);
$part2 = str_replace('%d', (count($selected)-$count), $this->lang['delete_fail']);
- msg("$part1, $part2",-1);
+ msg("$part1, $part2", -1);
}
// invalidate all sessions
- io_saveFile($conf['cachedir'].'/sessionpurge',time());
+ io_saveFile($conf['cachedir'].'/sessionpurge', time());
return true;
}
@@ -624,20 +751,21 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param string $param id of the user
* @return bool whether succesful
*/
- protected function _editUser($param) {
+ protected function editUser($param)
+ {
if (!checkSecurityToken()) return false;
- if (!$this->_auth->canDo('UserMod')) return false;
- $user = $this->_auth->cleanUser(preg_replace('/.*[:\/]/','',$param));
- $userdata = $this->_auth->getUserData($user);
+ if (!$this->auth->canDo('UserMod')) return false;
+ $user = $this->auth->cleanUser(preg_replace('/.*[:\/]/', '', $param));
+ $userdata = $this->auth->getUserData($user);
// no user found?
if (!$userdata) {
- msg($this->lang['edit_usermissing'],-1);
+ msg($this->lang['edit_usermissing'], -1);
return false;
}
- $this->_edit_user = $user;
- $this->_edit_userdata = $userdata;
+ $this->edit_user = $user;
+ $this->edit_userdata = $userdata;
return true;
}
@@ -647,39 +775,39 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @return bool whether succesful
*/
- protected function _modifyUser(){
+ protected function modifyUser()
+ {
global $conf, $INPUT;
if (!checkSecurityToken()) return false;
- if (!$this->_auth->canDo('UserMod')) return false;
+ if (!$this->auth->canDo('UserMod')) return false;
// get currently valid user data
- $olduser = $this->_auth->cleanUser(preg_replace('/.*[:\/]/','',$INPUT->str('userid_old')));
- $oldinfo = $this->_auth->getUserData($olduser);
+ $olduser = $this->auth->cleanUser(preg_replace('/.*[:\/]/', '', $INPUT->str('userid_old')));
+ $oldinfo = $this->auth->getUserData($olduser);
// get new user data subject to change
- list($newuser,$newpass,$newname,$newmail,$newgrps,$passconfirm) = $this->_retrieveUser();
+ list($newuser,$newpass,$newname,$newmail,$newgrps,$passconfirm) = $this->retrieveUser();
if (empty($newuser)) return false;
$changes = array();
if ($newuser != $olduser) {
-
- if (!$this->_auth->canDo('modLogin')) { // sanity check, shouldn't be possible
- msg($this->lang['update_fail'],-1);
+ if (!$this->auth->canDo('modLogin')) { // sanity check, shouldn't be possible
+ msg($this->lang['update_fail'], -1);
return false;
}
// check if $newuser already exists
- if ($this->_auth->getUserData($newuser)) {
- msg(sprintf($this->lang['update_exists'],$newuser),-1);
+ if ($this->auth->getUserData($newuser)) {
+ msg(sprintf($this->lang['update_exists'], $newuser), -1);
$re_edit = true;
} else {
$changes['user'] = $newuser;
}
}
- if ($this->_auth->canDo('modPass')) {
+ if ($this->auth->canDo('modPass')) {
if ($newpass || $passconfirm) {
- if ($this->_verifyPassword($newpass,$passconfirm)) {
+ if ($this->verifyPassword($newpass, $passconfirm)) {
$changes['pass'] = $newpass;
} else {
return false;
@@ -692,33 +820,32 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
}
}
- if (!empty($newname) && $this->_auth->canDo('modName') && $newname != $oldinfo['name']) {
+ if (!empty($newname) && $this->auth->canDo('modName') && $newname != $oldinfo['name']) {
$changes['name'] = $newname;
}
- if (!empty($newmail) && $this->_auth->canDo('modMail') && $newmail != $oldinfo['mail']) {
+ if (!empty($newmail) && $this->auth->canDo('modMail') && $newmail != $oldinfo['mail']) {
$changes['mail'] = $newmail;
}
- if (!empty($newgrps) && $this->_auth->canDo('modGroups') && $newgrps != $oldinfo['grps']) {
+ if (!empty($newgrps) && $this->auth->canDo('modGroups') && $newgrps != $oldinfo['grps']) {
$changes['grps'] = $newgrps;
}
- if ($ok = $this->_auth->triggerUserMod('modify', array($olduser, $changes))) {
- msg($this->lang['update_ok'],1);
+ if ($ok = $this->auth->triggerUserMod('modify', array($olduser, $changes))) {
+ msg($this->lang['update_ok'], 1);
if ($INPUT->has('usernotify') && !empty($changes['pass'])) {
$notify = empty($changes['user']) ? $olduser : $newuser;
- $this->_notifyUser($notify,$changes['pass']);
+ $this->notifyUser($notify, $changes['pass']);
}
// invalidate all sessions
- io_saveFile($conf['cachedir'].'/sessionpurge',time());
-
+ io_saveFile($conf['cachedir'].'/sessionpurge', time());
} else {
- msg($this->lang['update_fail'],-1);
+ msg($this->lang['update_fail'], -1);
}
if (!empty($re_edit)) {
- $this->_editUser($olduser);
+ $this->editUser($olduser);
}
return $ok;
@@ -732,9 +859,10 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param bool $status_alert whether status alert should be shown
* @return bool whether succesful
*/
- protected function _notifyUser($user, $password, $status_alert=true) {
+ protected function notifyUser($user, $password, $status_alert = true)
+ {
- if ($sent = auth_sendPassword($user,$password)) {
+ if ($sent = auth_sendPassword($user, $password)) {
if ($status_alert) {
msg($this->lang['notify_ok'], 1);
}
@@ -755,7 +883,8 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param string $confirm repeated password for confirmation
* @return bool true if meets requirements, false otherwise
*/
- protected function _verifyPassword($password, $confirm) {
+ protected function verifyPassword($password, $confirm)
+ {
global $lang;
if (empty($password) && empty($confirm)) {
@@ -779,7 +908,8 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param bool $clean whether the cleanUser method of the authentication backend is applied
* @return array (user, password, full name, email, array(groups))
*/
- protected function _retrieveUser($clean=true) {
+ protected function retrieveUser($clean = true)
+ {
/** @var DokuWiki_Auth_Plugin $auth */
global $auth;
global $INPUT;
@@ -789,14 +919,14 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
$user[1] = $INPUT->str('userpass');
$user[2] = $INPUT->str('username');
$user[3] = $INPUT->str('usermail');
- $user[4] = explode(',',$INPUT->str('usergroups'));
+ $user[4] = explode(',', $INPUT->str('usergroups'));
$user[5] = $INPUT->str('userpass2'); // repeated password for confirmation
- $user[4] = array_map('trim',$user[4]);
- if($clean) $user[4] = array_map(array($auth,'cleanGroup'),$user[4]);
+ $user[4] = array_map('trim', $user[4]);
+ if ($clean) $user[4] = array_map(array($auth,'cleanGroup'), $user[4]);
$user[4] = array_filter($user[4]);
$user[4] = array_unique($user[4]);
- if(!count($user[4])) $user[4] = null;
+ if (!count($user[4])) $user[4] = null;
return $user;
}
@@ -806,17 +936,18 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @param string $op 'new' or 'clear'
*/
- protected function _setFilter($op) {
+ protected function setFilter($op)
+ {
- $this->_filter = array();
+ $this->filter = array();
if ($op == 'new') {
- list($user,/* $pass */,$name,$mail,$grps) = $this->_retrieveUser(false);
+ list($user,/* $pass */,$name,$mail,$grps) = $this->retrieveUser(false);
- if (!empty($user)) $this->_filter['user'] = $user;
- if (!empty($name)) $this->_filter['name'] = $name;
- if (!empty($mail)) $this->_filter['mail'] = $mail;
- if (!empty($grps)) $this->_filter['grps'] = join('|',$grps);
+ if (!empty($user)) $this->filter['user'] = $user;
+ if (!empty($name)) $this->filter['name'] = $name;
+ if (!empty($mail)) $this->filter['mail'] = $mail;
+ if (!empty($grps)) $this->filter['grps'] = join('|', $grps);
}
}
@@ -825,7 +956,8 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @return array
*/
- protected function _retrieveFilter() {
+ protected function retrieveFilter()
+ {
global $INPUT;
$t_filter = $INPUT->arr('filter');
@@ -844,14 +976,15 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
/**
* Validate and improve the pagination values
*/
- protected function _validatePagination() {
+ protected function validatePagination()
+ {
- if ($this->_start >= $this->_user_total) {
- $this->_start = $this->_user_total - $this->_pagesize;
+ if ($this->start >= $this->users_total) {
+ $this->start = $this->users_total - $this->pagesize;
}
- if ($this->_start < 0) $this->_start = 0;
+ if ($this->start < 0) $this->start = 0;
- $this->_last = min($this->_user_total, $this->_start + $this->_pagesize);
+ $this->last = min($this->users_total, $this->start + $this->pagesize);
}
/**
@@ -859,21 +992,23 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @return array with enable/disable attributes
*/
- protected function _pagination() {
+ protected function pagination()
+ {
$disabled = 'disabled="disabled"';
$buttons = array();
- $buttons['start'] = $buttons['prev'] = ($this->_start == 0) ? $disabled : '';
+ $buttons['start'] = $buttons['prev'] = ($this->start == 0) ? $disabled : '';
- if ($this->_user_total == -1) {
+ if ($this->users_total == -1) {
$buttons['last'] = $disabled;
$buttons['next'] = '';
} else {
- $buttons['last'] = $buttons['next'] = (($this->_start + $this->_pagesize) >= $this->_user_total) ? $disabled : '';
+ $buttons['last'] = $buttons['next'] =
+ (($this->start + $this->pagesize) >= $this->users_total) ? $disabled : '';
}
- if ($this->_lastdisabled) {
+ if ($this->lastdisabled) {
$buttons['last'] = $disabled;
}
@@ -883,9 +1018,10 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
/**
* Export a list of users in csv format using the current filter criteria
*/
- protected function _export() {
+ protected function exportCSV()
+ {
// list of users for export - based on current filter criteria
- $user_list = $this->_auth->retrieveUsers(0, 0, $this->_filter);
+ $user_list = $this->auth->retrieveUsers(0, 0, $this->filter);
$column_headings = array(
$this->lang["user_id"],
$this->lang["user_name"],
@@ -902,14 +1038,16 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
# header('Content-type: text/plain;charset=utf-8');
// output the csv
- $fd = fopen('php://output','w');
+ $fd = fopen('php://output', 'w');
fputcsv($fd, $column_headings);
foreach ($user_list as $user => $info) {
- $line = array($user, $info['name'], $info['mail'], join(',',$info['grps']));
+ $line = array($user, $info['name'], $info['mail'], join(',', $info['grps']));
fputcsv($fd, $line);
}
fclose($fd);
- if (defined('DOKU_UNITTEST')){ return; }
+ if (defined('DOKU_UNITTEST')) {
+ return;
+ }
die;
}
@@ -921,25 +1059,28 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
*
* @return bool whether successful
*/
- protected function _import() {
+ protected function importCSV()
+ {
// check we are allowed to add users
if (!checkSecurityToken()) return false;
- if (!$this->_auth->canDo('addUser')) return false;
+ if (!$this->auth->canDo('addUser')) return false;
// check file uploaded ok.
- if (empty($_FILES['import']['size']) || !empty($_FILES['import']['error']) && $this->_isUploadedFile($_FILES['import']['tmp_name'])) {
- msg($this->lang['import_error_upload'],-1);
+ if (empty($_FILES['import']['size']) ||
+ !empty($_FILES['import']['error']) && $this->isUploadedFile($_FILES['import']['tmp_name'])
+ ) {
+ msg($this->lang['import_error_upload'], -1);
return false;
}
// retrieve users from the file
- $this->_import_failures = array();
+ $this->import_failures = array();
$import_success_count = 0;
$import_fail_count = 0;
$line = 0;
- $fd = fopen($_FILES['import']['tmp_name'],'r');
+ $fd = fopen($_FILES['import']['tmp_name'], 'r');
if ($fd) {
- while($csv = fgets($fd)){
- if (!utf8_check($csv)) {
+ while ($csv = fgets($fd)) {
+ if (!\dokuwiki\Utf8\Clean::isUtf8($csv)) {
$csv = utf8_encode($csv);
}
$raw = str_getcsv($csv);
@@ -951,35 +1092,42 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
if (count($raw) < 4) { // need at least four fields
$import_fail_count++;
$error = sprintf($this->lang['import_error_fields'], count($raw));
- $this->_import_failures[$line] = array('error' => $error, 'user' => $raw, 'orig' => $csv);
+ $this->import_failures[$line] = array('error' => $error, 'user' => $raw, 'orig' => $csv);
continue;
}
- array_splice($raw,1,0,auth_pwgen()); // splice in a generated password
- $clean = $this->_cleanImportUser($raw, $error);
- if ($clean && $this->_addImportUser($clean, $error)) {
- $sent = $this->_notifyUser($clean[0],$clean[1],false);
- if (!$sent){
- msg(sprintf($this->lang['import_notify_fail'],$clean[0],$clean[3]),-1);
+ array_splice($raw, 1, 0, auth_pwgen()); // splice in a generated password
+ $clean = $this->cleanImportUser($raw, $error);
+ if ($clean && $this->importUser($clean, $error)) {
+ $sent = $this->notifyUser($clean[0], $clean[1], false);
+ if (!$sent) {
+ msg(sprintf($this->lang['import_notify_fail'], $clean[0], $clean[3]), -1);
}
$import_success_count++;
} else {
$import_fail_count++;
array_splice($raw, 1, 1); // remove the spliced in password
- $this->_import_failures[$line] = array('error' => $error, 'user' => $raw, 'orig' => $csv);
+ $this->import_failures[$line] = array('error' => $error, 'user' => $raw, 'orig' => $csv);
}
}
- msg(sprintf($this->lang['import_success_count'], ($import_success_count+$import_fail_count), $import_success_count),($import_success_count ? 1 : -1));
+ msg(
+ sprintf(
+ $this->lang['import_success_count'],
+ ($import_success_count + $import_fail_count),
+ $import_success_count
+ ),
+ ($import_success_count ? 1 : -1)
+ );
if ($import_fail_count) {
- msg(sprintf($this->lang['import_failure_count'], $import_fail_count),-1);
+ msg(sprintf($this->lang['import_failure_count'], $import_fail_count), -1);
}
} else {
- msg($this->lang['import_error_readfail'],-1);
+ msg($this->lang['import_error_readfail'], -1);
}
// save import failures into the session
if (!headers_sent()) {
session_start();
- $_SESSION['import_failures'] = $this->_import_failures;
+ $_SESSION['import_failures'] = $this->import_failures;
session_write_close();
}
return true;
@@ -992,17 +1140,18 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param string $error
* @return array|false cleaned data or false
*/
- protected function _cleanImportUser($candidate, & $error){
+ protected function cleanImportUser($candidate, & $error)
+ {
global $INPUT;
- // kludgy ....
+ // FIXME kludgy ....
$INPUT->set('userid', $candidate[0]);
$INPUT->set('userpass', $candidate[1]);
$INPUT->set('username', $candidate[2]);
$INPUT->set('usermail', $candidate[3]);
$INPUT->set('usergroups', $candidate[4]);
- $cleaned = $this->_retrieveUser();
+ $cleaned = $this->retrieveUser();
list($user,/* $pass */,$name,$mail,/* $grps */) = $cleaned;
if (empty($user)) {
$error = $this->lang['import_error_baduserid'];
@@ -1011,12 +1160,12 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
// no need to check password, handled elsewhere
- if (!($this->_auth->canDo('modName') xor empty($name))){
+ if (!($this->auth->canDo('modName') xor empty($name))) {
$error = $this->lang['import_error_badname'];
return false;
}
- if ($this->_auth->canDo('modMail')) {
+ if ($this->auth->canDo('modMail')) {
if (empty($mail) || !mail_isvalid($mail)) {
$error = $this->lang['import_error_badmail'];
return false;
@@ -1040,8 +1189,9 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param string &$error reference catched error message
* @return bool whether successful
*/
- protected function _addImportUser($user, & $error){
- if (!$this->_auth->triggerUserMod('create', $user)) {
+ protected function importUser($user, &$error)
+ {
+ if (!$this->auth->triggerUserMod('create', $user)) {
$error = $this->lang['import_error_create'];
return false;
}
@@ -1052,7 +1202,8 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
/**
* Downloads failures as csv file
*/
- protected function _downloadImportFailures(){
+ protected function downloadImportFailures()
+ {
// ==============================================================================================
// GENERATE OUTPUT
@@ -1063,8 +1214,8 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
# header('Content-type: text/plain;charset=utf-8');
// output the csv
- $fd = fopen('php://output','w');
- foreach ($this->_import_failures as $fail) {
+ $fd = fopen('php://output', 'w');
+ foreach ($this->import_failures as $fail) {
fputs($fd, $fail['orig']);
}
fclose($fd);
@@ -1077,7 +1228,8 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @param string $file filename
* @return bool
*/
- protected function _isUploadedFile($file) {
+ protected function isUploadedFile($file)
+ {
return is_uploaded_file($file);
}
}
diff --git a/lib/plugins/usermanager/lang/ar/lang.php b/lib/plugins/usermanager/lang/ar/lang.php
index 0a751e7fb..7cff02980 100644
--- a/lib/plugins/usermanager/lang/ar/lang.php
+++ b/lib/plugins/usermanager/lang/ar/lang.php
@@ -2,10 +2,9 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
- * @author uahello@gmail.com
*/
$lang['menu'] = 'مدير المستخدمين';
$lang['noauth'] = '(مصادقة المستخدمين غير متوفرة)';
diff --git a/lib/plugins/usermanager/lang/bg/lang.php b/lib/plugins/usermanager/lang/bg/lang.php
index f98cc8c40..533fe70ff 100644
--- a/lib/plugins/usermanager/lang/bg/lang.php
+++ b/lib/plugins/usermanager/lang/bg/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
* @author Kiril <neohidra@gmail.com>
diff --git a/lib/plugins/usermanager/lang/ca/lang.php b/lib/plugins/usermanager/lang/ca/lang.php
index 36b777455..c9ccaa41a 100644
--- a/lib/plugins/usermanager/lang/ca/lang.php
+++ b/lib/plugins/usermanager/lang/ca/lang.php
@@ -3,11 +3,10 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Adolfo Jayme Barrientos <fito@libreoffice.org>
* @author Carles Bellver <carles.bellver@gmail.com>
- * @author carles.bellver@gmail.com
- * @author carles.bellver@cent.uji.es
- * @author Carles Bellver <carles.bellver@cent.uji.es>
- * @author daniel@6temes.cat
+ * @author carles.bellver <carles.bellver@cent.uji.es>
+ * @author daniel <daniel@6temes.cat>
*/
$lang['menu'] = 'Gestió d\'usuaris';
$lang['noauth'] = '(l\'autenticació d\'usuaris no està disponible)';
@@ -30,6 +29,11 @@ $lang['search'] = 'Cerca';
$lang['search_prompt'] = 'Fes la cerca';
$lang['clear'] = 'Reinicia el filtre de cerca';
$lang['filter'] = 'Filtre';
+$lang['export_all'] = 'Exporta tots els usuaris (CSV)';
+$lang['export_filtered'] = 'Exporta la llista filtrada d’usuaris (CSV)';
+$lang['import'] = 'Importa usuaris nous';
+$lang['line'] = 'Línia nro.';
+$lang['error'] = 'Missatge d’error';
$lang['summary'] = 'Visualització d\'usuaris %1$d-%2$d de %3$d trobats. %4$d usuaris en total.';
$lang['nonefound'] = 'No s\'han trobat usuaris. %d usuaris en total.';
$lang['delete_ok'] = 'S\'han suprimit %d usuaris';
@@ -50,3 +54,9 @@ $lang['add_ok'] = 'L\'usuari s\'ha afegit amb èxit';
$lang['add_fail'] = 'No s\'ha pogut afegir l\'usuari';
$lang['notify_ok'] = 'S\'ha enviat el correu de notificació';
$lang['notify_fail'] = 'No s\'ha pogut enviar el correu de notificació';
+$lang['import_userlistcsv'] = 'Fitxer de llista d’usuaris (CSV):';
+$lang['import_error_badname'] = 'Nom incorrecte';
+$lang['import_error_badmail'] = 'Adreça electrònica incorrecta';
+$lang['import_error_create'] = 'No es pot crear l’usuari';
+$lang['addUser_error_pass_not_identical'] = 'Les contrasenyes introduïdes no són idèntiques.';
+$lang['addUser_error_name_missing'] = 'Introduïu un nom per a l’usuari nou.';
diff --git a/lib/plugins/usermanager/lang/cs/lang.php b/lib/plugins/usermanager/lang/cs/lang.php
index 3ed18006a..326ae7edf 100644
--- a/lib/plugins/usermanager/lang/cs/lang.php
+++ b/lib/plugins/usermanager/lang/cs/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Petr Kajzar <petr.kajzar@lf1.cuni.cz>
* @author Tomas Valenta <t.valenta@sh.cvut.cz>
* @author Zbynek Krivka <zbynek.krivka@seznam.cz>
* @author Bohumir Zamecnik <bohumir@zamecnik.org>
@@ -75,7 +76,7 @@ $lang['import_error_upload'] = 'Import selhal. CSV soubor nemohl být nahrán
$lang['import_error_readfail'] = 'Import selhal. Nelze číst nahraný soubor.';
$lang['import_error_create'] = 'Nelze vytvořit uživatele';
$lang['import_notify_fail'] = 'Importovanému uživateli %s s e-mailem %s nemohlo být zasláno upozornění.';
-$lang['import_downloadfailures'] = 'Stáhnout chyby pro nápravu jako CVS';
+$lang['import_downloadfailures'] = 'Stáhnout chyby pro nápravu jako CSV';
$lang['addUser_error_missing_pass'] = 'Buď prosím nastavte heslo nebo aktivujte upozorňování uživatel aby fungovalo vytváření hesel.';
$lang['addUser_error_pass_not_identical'] = 'Zadaná hesla nebyla shodná.';
$lang['addUser_error_modPass_disabled'] = 'Změna hesel je momentálně zakázána.';
diff --git a/lib/plugins/usermanager/lang/da/import.txt b/lib/plugins/usermanager/lang/da/import.txt
index 8ff1946b8..4bd9a8409 100644
--- a/lib/plugins/usermanager/lang/da/import.txt
+++ b/lib/plugins/usermanager/lang/da/import.txt
@@ -1,9 +1,9 @@
-===== Samling af Brugere Import =====
+===== Import af brugere =====
-Kræver en CSV-fil med brugere på mindst fire kolonner.
-Kolonnerne skal indeholde, i denne orden: bruger-id, fulde navn, email-adresse og grupper.
-CSV-felterne skal separeres af kommaer (,) og strengafgrænser med anførelsestegn (%%""%%). Backslash (\) kan benyttes som "escape character".
-For et eksempel på en brugbar fil, kan du prøve "Eksportér Brugere"-funktionen her over.
-Overlappende bruger-id'er bliver ignoreret.
+Kræver en CSV-fil med brugere, med mindst fire kolonner.
+Kolonnerne skal indeholde, i denne orden: brugernavn, fulde navn, e-mail adresse og grupper.
+CSV-felterne skal separeres af kommaer (,) og tekststrenge afgrænses med anførelsestegn (%%""%%). Omvent skråstreg (\) kan benyttes som "escape character".
+For et eksempel på filformat, kan du prøve "Eksportér Brugere"-funktionen herover.
+Bruger-id'er som allerede eksisterer importeres ikke.
-En adgangskode vil blive genereret og sendt til hver succesfuldt importeret bruger. \ No newline at end of file
+En adgangskode vil blive genereret og sendt til hver importeret bruger. \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/da/lang.php b/lib/plugins/usermanager/lang/da/lang.php
index b4e3c6c25..96af57f0c 100644
--- a/lib/plugins/usermanager/lang/da/lang.php
+++ b/lib/plugins/usermanager/lang/da/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jacob Palm <mail@jacobpalm.dk>
* @author Lars Næsbye Christensen <larsnaesbye@stud.ku.dk>
* @author Kalle Sommer Nielsen <kalle@php.net>
* @author Esben Laursen <hyber@hyber.dk>
@@ -16,11 +17,11 @@
$lang['menu'] = 'Brugerstyring';
$lang['noauth'] = '(Brugervalidering er ikke tilgængelig)';
$lang['nosupport'] = '(Brugerstyring er ikke understøttet)';
-$lang['badauth'] = 'Ugyldig brugerbekræftelsesfunktion';
-$lang['user_id'] = 'Bruger';
+$lang['badauth'] = 'Ugyldig brugerbekræftelsesmetode';
+$lang['user_id'] = 'Brugernavn';
$lang['user_pass'] = 'Adgangskode';
$lang['user_name'] = 'Navn';
-$lang['user_mail'] = 'E-mail';
+$lang['user_mail'] = 'E-mail adresse';
$lang['user_groups'] = 'Grupper';
$lang['field'] = 'Felt';
$lang['value'] = 'Værdi';
@@ -34,9 +35,9 @@ $lang['search'] = 'Søg';
$lang['search_prompt'] = 'Udfør søgning';
$lang['clear'] = 'Nulstil søgefilter';
$lang['filter'] = 'Filter';
-$lang['export_all'] = 'Eksportér Alle Brugere (CSV)';
-$lang['export_filtered'] = 'Eksportér Filtrerede Brugerliste (CSV)';
-$lang['import'] = 'Importér Nye Brugere';
+$lang['export_all'] = 'Eksporter alle brugere (CSV)';
+$lang['export_filtered'] = 'Eksporter filteret brugerliste (CSV)';
+$lang['import'] = 'Importér nye brugere';
$lang['line'] = 'Linje nr.';
$lang['error'] = 'Fejlmeddelelse';
$lang['summary'] = 'Viser brugerne %1$d-%2$d ud af %3$d fundne. %4$d brugere totalt.';
@@ -44,31 +45,39 @@ $lang['nonefound'] = 'Ingen brugere fundet. %d brugere totalt.';
$lang['delete_ok'] = '%d brugere slettet';
$lang['delete_fail'] = '%d kunne ikke slettes.';
$lang['update_ok'] = 'Bruger opdateret korrekt';
-$lang['update_fail'] = 'Brugeropdatering mislykkedes';
-$lang['update_exists'] = 'Ændring af brugernavn mislykkedes, det valgte brugernavn (%s) er allerede optaget (andre ændringer vil blive udført).';
+$lang['update_fail'] = 'Opdatering af bruger mislykkedes';
+$lang['update_exists'] = 'Ændring af brugernavn mislykkedes, det valgte brugernavn (%s) er allerede benyttet (øvrige ændringer vil blive udført).';
$lang['start'] = 'begynde';
$lang['prev'] = 'forrige';
$lang['next'] = 'næste';
$lang['last'] = 'sidste';
$lang['edit_usermissing'] = 'Den valgte bruger blev ikke fundet. Brugernavnet kan være slettet eller ændret andetsteds.';
-$lang['user_notify'] = 'Meddel bruger';
-$lang['note_notify'] = 'Meddelelser bliver kun sendt, hvis brugeren får givet et nyt adgangskode.';
+$lang['user_notify'] = 'Notificer bruger';
+$lang['note_notify'] = 'Notifikationsmails bliver kun sendt, hvis brugeren får tildelt en nyt adgangskode.';
$lang['note_group'] = 'Nye brugere vil blive tilføjet til standardgruppen (%s), hvis ingen gruppe er opgivet.';
-$lang['note_pass'] = 'Adgangskoden vil blive dannet automatisk, hvis feltet er tomt og underretning af brugeren er aktiveret.';
+$lang['note_pass'] = 'Adgangskoden vil blive dannet automatisk hvis feltet er tomt og underretning af brugeren er aktiveret.';
$lang['add_ok'] = 'Bruger tilføjet uden fejl.';
$lang['add_fail'] = 'Tilføjelse af bruger mislykkedes';
-$lang['notify_ok'] = 'Meddelelse sendt';
-$lang['notify_fail'] = 'Meddelelse kunne ikke sendes';
-$lang['import_userlistcsv'] = 'Brugerlistefil (CSV):';
-$lang['import_header'] = 'Nyeste Import - Fejl';
-$lang['import_success_count'] = 'Bruger-Import: %d brugere fundet, %d importeret med succes.';
-$lang['import_failure_count'] = 'Bruger-Import: %d fejlet. Fejl er listet nedenfor.';
-$lang['import_error_fields'] = 'Utilstrækkelige felter, fandt %d, påkrævet 4.';
+$lang['notify_ok'] = 'Notifikationsmail sendt';
+$lang['notify_fail'] = 'Notifikationsmail kunne ikke sendes';
+$lang['import_userlistcsv'] = 'Fil med brugerliste (CSV):';
+$lang['import_header'] = 'Nyeste import - fejl';
+$lang['import_success_count'] = 'Bruger import: %d brugere fundet, %d importeret med succes.';
+$lang['import_failure_count'] = 'Bruger import: %d fejlet. Fejl er listet nedenfor.';
+$lang['import_error_fields'] = 'Utilstrækkelige felter - fandt %d, påkrævet 4.';
$lang['import_error_baduserid'] = 'Bruger-id mangler';
$lang['import_error_badname'] = 'Ugyldigt navn';
$lang['import_error_badmail'] = 'Ugyldig email-adresse';
-$lang['import_error_upload'] = 'Import Fejlet. CSV-filen kunne ikke uploades eller er tom.';
-$lang['import_error_readfail'] = 'Import Fejlet. Ikke muligt at læse uploadede fil.';
+$lang['import_error_upload'] = 'Import fejlet. CSV-filen kunne ikke uploades, eller er tom.';
+$lang['import_error_readfail'] = 'Import fejlet. Ikke muligt at læse uploadede fil.';
$lang['import_error_create'] = 'Ikke muligt at oprette brugeren';
-$lang['import_notify_fail'] = 'Notifikationsmeddelelse kunne ikke sendes for importerede bruger %s, med emailen %s.';
-$lang['import_downloadfailures'] = 'Download Fejl som CSV til rettelser';
+$lang['import_notify_fail'] = 'Notifikationsmeddelelse kunne ikke sendes for importerede bruger %s, med e-mail adressen %s.';
+$lang['import_downloadfailures'] = 'Download fejlliste som CSV, til rettelse';
+$lang['addUser_error_missing_pass'] = 'Angiv venligst en adgangskode, eller aktiver brugernotifikation for at tillade dannelse af adgangskoder.';
+$lang['addUser_error_pass_not_identical'] = 'De indtastede adgangskoder var ikke ens.';
+$lang['addUser_error_modPass_disabled'] = 'Skift af adgangskode er i øjeblikket deaktiveret';
+$lang['addUser_error_name_missing'] = 'Indtast venligst et navn til den nye bruger.';
+$lang['addUser_error_modName_disabled'] = 'Ændring af navne er i øjeblikket deaktiveret.';
+$lang['addUser_error_mail_missing'] = 'Indtast venligst en e-mail adresse til den nye bruger';
+$lang['addUser_error_modMail_disabled'] = 'Ændring af e-mail adresser er i øjeblikket deaktiveret.';
+$lang['addUser_error_create_event_failed'] = 'En udvidelse forhindrede den nye bruger i at blive tilføjet. For yderligere information, kontroller om der er øvrige fejlmeddelelser.';
diff --git a/lib/plugins/usermanager/lang/el/lang.php b/lib/plugins/usermanager/lang/el/lang.php
index a838f7346..609b99ac4 100644
--- a/lib/plugins/usermanager/lang/el/lang.php
+++ b/lib/plugins/usermanager/lang/el/lang.php
@@ -3,13 +3,14 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Katerina Katapodi <extragold1234@hotmail.com>
* @author Chris Smith <chris@jalakai.co.uk>
* @author Thanos Massias <tm@thriasio.gr>
* @author Αθανάσιος Νταής <homunculus@wana.gr>
* @author Konstantinos Koryllos <koryllos@gmail.com>
* @author George Petsagourakis <petsagouris@gmail.com>
* @author Petros Vidalis <pvidalis@gmail.com>
- * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
+ * @author Vasileios Karavasilis <vasileioskaravasilis@gmail.com>
*/
$lang['menu'] = 'Διαχείριση Χρηστών';
$lang['noauth'] = '(η είσοδος χρηστών δεν είναι δυνατή)';
@@ -32,6 +33,11 @@ $lang['search'] = 'Αναζήτηση';
$lang['search_prompt'] = 'Εκκίνηση αναζήτησης';
$lang['clear'] = 'Καθαρισμός φίλτρων';
$lang['filter'] = 'Φίλτρο';
+$lang['export_all'] = 'Εξάγετε Όλους τους Χρήστες (CSV)';
+$lang['export_filtered'] = 'Επεξεργασία Λίστας Εξαγωγής Χρήστη (CSV)';
+$lang['import'] = 'Εισάγετε Νέους Χρήστες';
+$lang['line'] = 'Αριθμός Σειράς';
+$lang['error'] = 'Μήνυμα λάθους';
$lang['summary'] = 'Εμφάνιση χρηστών %1$d-%2$d από %3$d σχετικούς. %4$d χρήστες συνολικά.';
$lang['nonefound'] = 'Δεν βρέθηκαν σχετικοί χρήστες. %d χρήστες συνολικά.';
$lang['delete_ok'] = '%d χρήστες διεγράφησαν';
@@ -52,3 +58,24 @@ $lang['add_ok'] = 'Επιτυχημένη εγγραφή χρή
$lang['add_fail'] = 'Η εγγραφή του χρήστη απέτυχε';
$lang['notify_ok'] = 'Εστάλη ενημερωτικό e-mail';
$lang['notify_fail'] = 'Δεν ήταν δυνατή η αποστολή του ενημερωτικού e-mail';
+$lang['import_userlistcsv'] = 'Αρχείο λίστας Χρήστη';
+$lang['import_header'] = 'Η Τελευταία Εισαγωγή-Λάθη';
+$lang['import_success_count'] = 'Εισαγωγή χρήστη: %d χρήστες βρέθηκαν%d εισήχθηκε με επιτυχία.. ';
+$lang['import_failure_count'] = 'Εισαγωγή χρήστη: %d απέτυχαν. Τα λάθη παρατίθενται πιο κάτω.. ';
+$lang['import_error_fields'] = 'Δεν υπάρχουν αρκετά πεδία, βρέθηκε %d, χρειάζονται 4.';
+$lang['import_error_baduserid'] = 'Το id του χρήστη λείπει';
+$lang['import_error_badname'] = 'Λάθος όνομα';
+$lang['import_error_badmail'] = 'Λάθος διεύθυνση ηλεκτρονικού ταχυδρομείου';
+$lang['import_error_upload'] = 'Η εισαγωγή απέτυχε. Ο φάκελλος csv δεν μπόρεσε να φορτωθεί ή είναι άδειος.';
+$lang['import_error_readfail'] = 'Η εισαγωγή Απέτυχε. Δεν μπόρεσε να διαβάσει τον φάκελλο που φορτώθηκε. ';
+$lang['import_error_create'] = 'Δεν μπόρεσε να δημιουργήσει τον χρήστη';
+$lang['import_notify_fail'] = 'Το μήνυμα ειδοποίησης δεν μπόρεσε να αποσταλεί για τον χρήστη που εισήχθηκε, %s με email %s.';
+$lang['import_downloadfailures'] = 'Αποτυχίες στο κατέβασμα ως CSV για διόρθωση';
+$lang['addUser_error_missing_pass'] = 'Παρακαλώ είτε βάλετε έναν κωδικό πρόσβασης ή ενεργοποιείστε την ειδοποίηση χρήστη για την αναπαραγωγή κωδικού πάλι.';
+$lang['addUser_error_pass_not_identical'] = 'Οι κωδικοί πρόσβασης που εισήχθηκαν δεν ήταν οι ίδιοι.';
+$lang['addUser_error_modPass_disabled'] = 'Η τροποποίηση των κωδικών πρόσβασης είναι προς το παρόν απενεργοποιημένη';
+$lang['addUser_error_name_missing'] = 'Παρακαλώ εισάγετε όνομα για τον νέο χρήστη.';
+$lang['addUser_error_modName_disabled'] = 'Δεν μπορεί προς το παρόν να γίνει αλλαγή ονομάτων γιατί η λειτουργία αυτή είναι απενεργοποιημένη.';
+$lang['addUser_error_mail_missing'] = 'Παρακαλώ εισάγετε Διεύθυνση Ηλεκτρονικού Ταχυδρομείου για τον νέο χρήστη.';
+$lang['addUser_error_modMail_disabled'] = 'Η αλλαγή Διευθύνσεων Email είναι προς το παρόν απενεργοποιημένη.';
+$lang['addUser_error_create_event_failed'] = 'Ένα επιπρόσθετο εμπόδισε την πρόσθεση νέου χρήστη. Είναι πιθανόν να ελέγξουμε άλλα μηνύματα για περισσότερες πληροφορίες.';
diff --git a/lib/plugins/usermanager/lang/fa/lang.php b/lib/plugins/usermanager/lang/fa/lang.php
index 02734fef1..b79d34310 100644
--- a/lib/plugins/usermanager/lang/fa/lang.php
+++ b/lib/plugins/usermanager/lang/fa/lang.php
@@ -5,8 +5,7 @@
*
* @author behrad eslamifar <behrad_es@yahoo.com)
* @author Mohsen Firoozmandan <info@mambolearn.com>
- * @author omidmr@gmail.com
- * @author Omid Mottaghi <omidmr@gmail.com>
+ * @author omidmr <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
* @author Milad DZand <M.DastanZand@gmail.com>
* @author AmirH Hassaneini <mytechmix@gmail.com>
diff --git a/lib/plugins/usermanager/lang/fi/lang.php b/lib/plugins/usermanager/lang/fi/lang.php
index dba67fb61..d376c8100 100644
--- a/lib/plugins/usermanager/lang/fi/lang.php
+++ b/lib/plugins/usermanager/lang/fi/lang.php
@@ -2,9 +2,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
- * @author otto@valjakko.net
- * @author Otto Vainio <otto@valjakko.net>
+ *
+ * @author otto <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
* @author Sami Olmari <sami@olmari.fi>
* @author Jussi Takala <jussi.takala@live.fi>
diff --git a/lib/plugins/usermanager/lang/id/lang.php b/lib/plugins/usermanager/lang/id/lang.php
index 425b2ff59..0fa847a94 100644
--- a/lib/plugins/usermanager/lang/id/lang.php
+++ b/lib/plugins/usermanager/lang/id/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Irwan Butar Butar <irwansah.putra@gmail.com>
* @author Yustinus Waruwu <juswaruwu@gmail.com>
*/
diff --git a/lib/plugins/usermanager/lang/is/lang.php b/lib/plugins/usermanager/lang/is/lang.php
index cabf83d64..7801ffdee 100644
--- a/lib/plugins/usermanager/lang/is/lang.php
+++ b/lib/plugins/usermanager/lang/is/lang.php
@@ -1,5 +1,8 @@
<?php
+
/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
* Icelandic language file
*
* @author Hrannar Baldursson <hrannar.baldursson@gmail.com>
diff --git a/lib/plugins/usermanager/lang/ja/import.txt b/lib/plugins/usermanager/lang/ja/import.txt
index 4987df0e3..cacf063ed 100644
--- a/lib/plugins/usermanager/lang/ja/import.txt
+++ b/lib/plugins/usermanager/lang/ja/import.txt
@@ -1,10 +1,10 @@
===== 一括ユーザーインポート =====
少なくとも4列のユーザーCSVファイルが必要です。
-列の順序: ユーザーID、フルネーム、電子メールアドレス、グループ。
+列には、「ユーザーID、フルネーム、メールアドレス、グループ」を、この順序で含む必要があります。
CSVフィールドはカンマ(,)区切り、文字列は引用符(%%""%%)区切りです。
エスケープにバックスラッシュ(\)を使用できます。
-適切なファイル例は、上記の"エクスポートユーザー"機能で試して下さい。
+適切なファイル例を確認するには、上記の"エクスポートユーザー"機能をお試し下さい。
重複するユーザーIDは無視されます。
-正常にインポートされたユーザー毎に、パスワードを作成し、電子メールで送付します。 \ No newline at end of file
+正常にインポートされたユーザー毎に、パスワードを作成し、Eメールで送付します。 \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/ja/lang.php b/lib/plugins/usermanager/lang/ja/lang.php
index 5c252bb2f..fbd9b11fb 100644
--- a/lib/plugins/usermanager/lang/ja/lang.php
+++ b/lib/plugins/usermanager/lang/ja/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
* @author Yuji Takenaka <webmaster@davilin.com>
* @author Chris Smith <chris@jalakai.co.uk>
* @author Ikuo Obataya <i.obataya@gmail.com>
@@ -11,7 +12,6 @@
* @author Taisuke Shimamoto <dentostar@gmail.com>
* @author Satoshi Sahara <sahara.satoshi@gmail.com>
* @author Hideaki SAWADA <sawadakun@live.jp>
- * @author Hideaki SAWADA <chuno@live.jp>
*/
$lang['menu'] = 'ユーザー管理';
$lang['noauth'] = '(ユーザー認証が無効です)';
@@ -39,11 +39,11 @@ $lang['export_filtered'] = '抽出したユーザー一覧のエクスポ
$lang['import'] = '新規ユーザーのインポート';
$lang['line'] = '行番号';
$lang['error'] = 'エラーメッセージ';
-$lang['summary'] = 'ユーザー %1$d-%2$d / %3$d, 総ユーザー数 %4$d';
-$lang['nonefound'] = 'ユーザーが見つかりません, 総ユーザー数 %d';
+$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_ok'] = 'ユーザーは正常に更新されました';
$lang['update_fail'] = 'ユーザーの更新に失敗しました';
$lang['update_exists'] = 'ユーザー名(%s)は既に存在するため、ユーザー名の変更に失敗しました(その他の項目は変更されました)。';
$lang['start'] = '最初';
@@ -55,7 +55,7 @@ $lang['user_notify'] = 'ユーザーに通知する';
$lang['note_notify'] = '通知メールは、ユーザーに新たなパスワードが設定された場合のみ送信されます。';
$lang['note_group'] = 'グループを指定しない場合は、既定のグループ(%s)に配属されます。';
$lang['note_pass'] = '”ユーザーに通知する”をチェックしてパスワードを空欄にすると、パスワードは自動生成されます。';
-$lang['add_ok'] = 'ユーザーを登録しました';
+$lang['add_ok'] = 'ユーザーを正常に登録しました';
$lang['add_fail'] = 'ユーザーの登録に失敗しました';
$lang['notify_ok'] = '通知メールを送信しました';
$lang['notify_fail'] = '通知メールを送信できませんでした';
@@ -72,8 +72,8 @@ $lang['import_error_readfail'] = 'インポートが失敗しました。アッ
$lang['import_error_create'] = 'ユーザーが作成できません。';
$lang['import_notify_fail'] = '通知メッセージがインポートされたユーザー(%s)・電子メールアドレス(%s)に送信できませんでした。';
$lang['import_downloadfailures'] = '修正用に失敗を CSVファイルとしてダウンロードする。';
-$lang['addUser_error_missing_pass'] = 'パスワードを設定するかパスワードの自動生成できるようにユーザーへの通知を有効にして下さい。';
-$lang['addUser_error_pass_not_identical'] = '入力されたパスワードは同一ではありません。';
+$lang['addUser_error_missing_pass'] = 'パスワードを設定するか、パスワードを自動生成できるようにユーザーへの通知を有効にして下さい。';
+$lang['addUser_error_pass_not_identical'] = '確認用のパスワードが間違っています。';
$lang['addUser_error_modPass_disabled'] = 'パスワードの変更は現在無効になっています。';
$lang['addUser_error_name_missing'] = '新規ユーザーのフルネームを入力してください。';
$lang['addUser_error_modName_disabled'] = 'フルネームの変更は現在無効になっています。';
diff --git a/lib/plugins/usermanager/lang/lt/lang.php b/lib/plugins/usermanager/lang/lt/lang.php
index 3c0029303..2039de459 100644
--- a/lib/plugins/usermanager/lang/lt/lang.php
+++ b/lib/plugins/usermanager/lang/lt/lang.php
@@ -2,9 +2,9 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author grawity <grawity@gmail.com>
- * @author audrius.klevas@gmail.com
+ * @author audrius.klevas <audrius.klevas@gmail.com>
* @author Arunas Vaitekunas <aras@fan.lt>
*/
$lang['menu'] = 'Vartotojų administravimas';
diff --git a/lib/plugins/usermanager/lang/no/lang.php b/lib/plugins/usermanager/lang/no/lang.php
index 8bd88945d..04a76912e 100644
--- a/lib/plugins/usermanager/lang/no/lang.php
+++ b/lib/plugins/usermanager/lang/no/lang.php
@@ -12,8 +12,7 @@
* @author Knut Staring <knutst@gmail.com>
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
- * @author Rune Rasmussen syntaxerror.no@gmail.com
+ * @author Rune Rasmussen <syntaxerror.no@gmail.com>
* @author Jon Bøe <jonmagneboe@hotmail.com>
* @author Egil Hansen <egil@rosetta.no>
* @author Arne Hanssen <arne.hanssen@getmail.no>
diff --git a/lib/plugins/usermanager/lang/oc/lang.php b/lib/plugins/usermanager/lang/oc/lang.php
new file mode 100644
index 000000000..ca4d88815
--- /dev/null
+++ b/lib/plugins/usermanager/lang/oc/lang.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author En Mathis <heartattack@free.fr>
+ */
+$lang['menu'] = 'Gestion dels utilizaires';
+$lang['user_id'] = 'Utilizaire';
+$lang['user_pass'] = 'Senhal';
+$lang['user_name'] = 'Nom vertadièr';
+$lang['user_mail'] = 'Corrièl';
+$lang['user_groups'] = 'Grops';
+$lang['field'] = 'Camp';
+$lang['value'] = 'Valor';
+$lang['add'] = 'Ajustar';
+$lang['delete'] = 'Suprimir';
+$lang['edit'] = 'Modificar';
+$lang['edit_prompt'] = 'Modificar aqueste utilizaire';
+$lang['modify'] = 'Salvagardar los cambiaments';
+$lang['search'] = 'Recercar';
+$lang['filter'] = 'Filtre';
+$lang['line'] = 'Numèro de linha';
+$lang['error'] = 'Messatge d\'error';
+$lang['start'] = 'començar';
+$lang['prev'] = 'precedent';
+$lang['next'] = 'seguent';
+$lang['last'] = 'darrièr';
+$lang['user_notify'] = 'Avisar l\'utilizaire';
+$lang['add_fail'] = 'Fracàs de l\'apondon de l\'utilizaire';
+$lang['notify_ok'] = 'Corrièl de notificacion enviat';
+$lang['notify_fail'] = 'Lo corrièl de notificacion a pas pogut èsser enviat';
+$lang['import_userlistcsv'] = 'Fichièr lista d\'utilizaire (CSV) :';
+$lang['import_error_badname'] = 'Marrit nom';
+$lang['import_error_badmail'] = 'Marrida adreça de corrièl';
+$lang['import_error_create'] = 'Creacion impossibla de l\'utilizaire';
+$lang['addUser_error_modPass_disabled'] = 'La modificacion dels senhals es desactivada pel moment';
+$lang['addUser_error_name_missing'] = 'Picatz lo nom del nòu utilizaire.';
+$lang['addUser_error_modName_disabled'] = 'La modificacion dels noms es desactivada pel moment.';
+$lang['addUser_error_mail_missing'] = 'Picatz l\'adreça pel nòu utilizaire';
+$lang['addUser_error_modMail_disabled'] = 'La modificacion de las adreças es desactivada pel moment.';
diff --git a/lib/plugins/usermanager/lang/oc/list.txt b/lib/plugins/usermanager/lang/oc/list.txt
new file mode 100644
index 000000000..d5fc36919
--- /dev/null
+++ b/lib/plugins/usermanager/lang/oc/list.txt
@@ -0,0 +1 @@
+===== Lista utilizaire ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/pt/add.txt b/lib/plugins/usermanager/lang/pt/add.txt
index a4c2672c7..83ff95c64 100644
--- a/lib/plugins/usermanager/lang/pt/add.txt
+++ b/lib/plugins/usermanager/lang/pt/add.txt
@@ -1 +1 @@
-===== Adicionar Utilizador ===== \ No newline at end of file
+===== Adicionar Usuário ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/pt/delete.txt b/lib/plugins/usermanager/lang/pt/delete.txt
index 95bffc1e3..6b9680438 100644
--- a/lib/plugins/usermanager/lang/pt/delete.txt
+++ b/lib/plugins/usermanager/lang/pt/delete.txt
@@ -1 +1 @@
-===== Remover Utilizador ===== \ No newline at end of file
+===== Remover usuário ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/pt/edit.txt b/lib/plugins/usermanager/lang/pt/edit.txt
index 176798454..3b8ea7e3c 100644
--- a/lib/plugins/usermanager/lang/pt/edit.txt
+++ b/lib/plugins/usermanager/lang/pt/edit.txt
@@ -1 +1 @@
-===== Editar Utilizador ===== \ No newline at end of file
+===== Editar Usuário ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/pt/import.txt b/lib/plugins/usermanager/lang/pt/import.txt
index 3a604030c..c4650a31d 100644
--- a/lib/plugins/usermanager/lang/pt/import.txt
+++ b/lib/plugins/usermanager/lang/pt/import.txt
@@ -1,9 +1,9 @@
-===== Importação de Utilizadores em Massa =====
+===== Importação de Usuários em Massa =====
-Requer um ficheiro CSV de utilizadores com pelo menos quatro colunas.
-As colunas têm de conter, em ordem: id de utilizador, nome completo, endereço de email e grupos.
-Os campos CSV devem ser separados por vírgulas (,) e as strings delimitadas por aspas (""). A contra-barra (\) pode ser usada para escapar.
-Para um exemplo de um ficheiro adequado, tente a função "Exportar Utilizadores" acima.
-Ids de utilizador duplicados serão ignorados.
+Requer um arquivo CSV de usuários com pelo menos quatro colunas.
+As colunas têm de conter, em ordem: id do usuário, nome completo, e-mail e grupos.
+Os campos CSV devem ser separados por vírgulas (,) e as strings delimitadas por aspas (%%""%%). A contra-barra (\) pode ser usada para escapar algum caractere.
+Para um exemplo de um arquivo adequado, tente a função "Exportar Usuários" acima.
+Ids de usuário duplicados serão ignorados.
-Uma senha será gerada e enviada por email a cada utilizador importado com sucesso. \ No newline at end of file
+Uma senha será gerada e enviada por e-mail a cada usuário importado com sucesso. \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/pt/intro.txt b/lib/plugins/usermanager/lang/pt/intro.txt
index 27985ded6..1a5a4ec25 100644
--- a/lib/plugins/usermanager/lang/pt/intro.txt
+++ b/lib/plugins/usermanager/lang/pt/intro.txt
@@ -1 +1 @@
-===== Gerir Utilizadores ===== \ No newline at end of file
+===== Gerenciar Usuários ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/pt/lang.php b/lib/plugins/usermanager/lang/pt/lang.php
index b12e5dc70..45a30dc48 100644
--- a/lib/plugins/usermanager/lang/pt/lang.php
+++ b/lib/plugins/usermanager/lang/pt/lang.php
@@ -3,22 +3,26 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Paulo Schopf <pschopf@gmail.com>
+ * @author Mario AlexandTeixeira dos Santos <masterofclan@gmail.com>
+ * @author Maykon Oliveira <maykonoliveira850@gmail.com>
+ * @author José Vieira <jmsv63@gmail.com>
* @author José Monteiro <Jose.Monteiro@DoWeDo-IT.com>
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
- * @author José Campos zecarlosdecampos@gmail.com
+ * @author José Campos <zecarlosdecampos@gmail.com>
* @author Guido Salatino <guidorafael23@gmail.com>
* @author Romulo Pereira <romuloccomp@gmail.com>
* @author Paulo Carmino <contato@paulocarmino.com>
* @author Alfredo Silva <alfredo.silva@sky.com>
* @author Guilherme Sá <guilherme.sa@hotmail.com>
*/
-$lang['menu'] = 'Gestor de Perfis';
-$lang['noauth'] = '(autenticação indisponível)';
-$lang['nosupport'] = '(gestão de utilizadores não suportada)';
+$lang['menu'] = 'Gerenciador de Perfis';
+$lang['noauth'] = '(autenticação de usuário indisponível)';
+$lang['nosupport'] = '(gerenciamento de usuários não suportado)';
$lang['badauth'] = 'Mecanismo de autenticação inválido';
-$lang['user_id'] = 'Utilizador';
+$lang['user_id'] = 'Usuário';
$lang['user_pass'] = 'Senha';
$lang['user_name'] = 'Nome Real';
$lang['user_mail'] = 'E-mail';
@@ -26,52 +30,59 @@ $lang['user_groups'] = 'Grupos';
$lang['field'] = 'Campo';
$lang['value'] = 'Valor';
$lang['add'] = 'Adicionar';
-$lang['delete'] = 'Remover';
-$lang['delete_selected'] = 'Remover Seleccionado(s)';
+$lang['delete'] = 'Excluir';
+$lang['delete_selected'] = 'Excluir Selecionado(s)';
$lang['edit'] = 'Editar';
-$lang['edit_prompt'] = 'Editar utilizador';
-$lang['modify'] = 'Gravar Alterações';
+$lang['edit_prompt'] = 'Editar usuário';
+$lang['modify'] = 'Salvar Alterações';
$lang['search'] = 'Pesquisar';
$lang['search_prompt'] = 'Pesquisar';
$lang['clear'] = 'Limpar Filtro de Pesquisa';
$lang['filter'] = 'Filtro';
-$lang['export_all'] = 'Exportar Todos os Utilizadores (CSV)';
-$lang['export_filtered'] = 'Exportar a lista de utilizadores filtrada (CSV)';
-$lang['import'] = 'Importar Novos Utilizadores';
-$lang['line'] = 'Linha nº
-';
+$lang['export_all'] = 'Exportar Todos os Usuários (CSV)';
+$lang['export_filtered'] = 'Exportar a Lista de Usuários Filtrada (CSV)';
+$lang['import'] = 'Importar Novos Usuários';
+$lang['line'] = 'Linha nº';
$lang['error'] = 'Mensagem de erro';
-$lang['summary'] = 'Apresentar utilizadores %1$d-%2$d de %3$d encontrados. %4$d inscritos.';
-$lang['nonefound'] = 'Nenhum utilizador encontrado. %d inscritos.';
-$lang['delete_ok'] = '%d utilizadores removidos';
-$lang['delete_fail'] = '%d remoções falhadas.';
-$lang['update_ok'] = 'Utilizador actualizado';
-$lang['update_fail'] = 'Utilizador não actualizado';
-$lang['update_exists'] = 'Falhou a alteração do nome, porque o utilizador (%s) já existe (as restantes alterações serão aplicadas).';
-$lang['start'] = 'primeiro';
+$lang['summary'] = 'Mostrando usuários %1$d-%2$d de %3$d encontrados. Total de %4$d inscritos.';
+$lang['nonefound'] = 'Nenhum usuário encontrado. Total de %d inscritos.';
+$lang['delete_ok'] = '%d usuários excluídos';
+$lang['delete_fail'] = '%d exclusões com erro.';
+$lang['update_ok'] = 'Usuário atualizado';
+$lang['update_fail'] = 'Usuário não atualizado';
+$lang['update_exists'] = 'Erro na alteração do nome, porque o usuário (%s) já existe (as alterações restantes serão aplicadas).';
+$lang['start'] = 'início';
$lang['prev'] = 'anterior';
$lang['next'] = 'seguinte';
$lang['last'] = 'último';
-$lang['edit_usermissing'] = 'Utilizador seleccionado não encontrado. Terá já sido removido ou alterado entretanto?';
-$lang['user_notify'] = 'Notificar utilizador';
-$lang['note_notify'] = 'Notificações só são enviadas se for atribuída uma nova senha ao utilizador.';
-$lang['note_group'] = 'Os novos utilizadores são adicionados ao grupo por omissão (%s) se não for especificado nenhum grupo.';
-$lang['note_pass'] = 'A password será automáticamente gerada se o campo esquerdo estiver vazio e a notificação de utilizador estiver activada.';
-$lang['add_ok'] = 'Utilizador adicionado.';
-$lang['add_fail'] = 'Utilizador não adicionado.';
-$lang['notify_ok'] = 'Mensagem de notificação enviada.';
-$lang['notify_fail'] = 'Não foi possível enviar mensagem de notificação';
-$lang['import_userlistcsv'] = 'Arquivo de lista do usuário (CSV):
+$lang['edit_usermissing'] = 'Usuário selecionado não encontrado. Terá já sido excluído ou alterado?';
+$lang['user_notify'] = 'Notificar usuário';
+$lang['note_notify'] = 'Notificações só são enviadas se for atribuída uma nova senha ao usuário.';
+$lang['note_group'] = 'Os novos usuários são adicionados ao grupo padrão (%s) se não for especificado nenhum grupo.';
+$lang['note_pass'] = 'A senha será automaticamente gerada se o campo esquerdo estiver vazio e a notificação de usuário estiver ativada.';
+$lang['add_ok'] = 'Usuário adicionado';
+$lang['add_fail'] = 'Usuário não adicionado';
+$lang['notify_ok'] = 'E-mail de notificação enviada.';
+$lang['notify_fail'] = 'Não foi possível enviar e-mail de notificação';
+$lang['import_userlistcsv'] = 'Arquivo de lista de usuário (CSV):
';
-$lang['import_header'] = 'Mais Recentes Importações - Falhas';
-$lang['import_success_count'] = 'Importar Utilizadores: %d utiliyadores encontrados, %d importados com sucesso.';
-$lang['import_failure_count'] = 'Importar Utilizadores: %d falharam. As falhas estão listadas abaixo.';
+$lang['import_header'] = 'Importações Mais Recentes - Falhas';
+$lang['import_success_count'] = 'Importar Usuários: %d usuários encontrados, %d importados com sucesso.';
+$lang['import_failure_count'] = 'Importar Usuários: %d falharam. As falhas estão listadas abaixo.';
$lang['import_error_fields'] = 'Campos insuficientes, encontrados %d mas requeridos 4.';
-$lang['import_error_baduserid'] = 'Falta id de utilizador';
+$lang['import_error_baduserid'] = 'Falta id de usuário';
$lang['import_error_badname'] = 'Nome inválido';
-$lang['import_error_badmail'] = 'E-Mail inválido';
-$lang['import_error_upload'] = 'Falhou a importação. O ficheiro csv não pôde ser importado ou está vazio.';
-$lang['import_error_readfail'] = 'Falhou a importação. Não foi possível ler o ficheiro submetido.';
-$lang['import_error_create'] = 'Não foi possível criar o utilizador.';
-$lang['import_notify_fail'] = 'A mensagem de notificação não pôde ser enviada para o utilizador importado, %s com email %s.';
-$lang['import_downloadfailures'] = 'Baixe Falhas como CSV para a correção';
+$lang['import_error_badmail'] = 'E-mail inválido';
+$lang['import_error_upload'] = 'Erro na importação. O arquivo csv não pôde ser importado ou está vazio.';
+$lang['import_error_readfail'] = 'Erro na importação. Não foi possível ler o arquivo submetido.';
+$lang['import_error_create'] = 'Não foi possível criar o usuário';
+$lang['import_notify_fail'] = 'A mensagem de notificação não pôde ser enviada para o usuário importado, %s com e-mail %s.';
+$lang['import_downloadfailures'] = 'Baixar Falhas como CSV para correção';
+$lang['addUser_error_missing_pass'] = 'Por favor, defina uma senha ou ative a notificação do usuário para ativar a geração de senha.';
+$lang['addUser_error_pass_not_identical'] = 'As senhas digitadas não são idênticas.';
+$lang['addUser_error_modPass_disabled'] = 'A alteração de senhas está desativada no momento';
+$lang['addUser_error_name_missing'] = 'Por favor, insira um nome para o novo usuário.';
+$lang['addUser_error_modName_disabled'] = 'A alteração de nomes está desativada no momento.';
+$lang['addUser_error_mail_missing'] = 'Por favor, insira um endereço de e-mail para o novo usuário.';
+$lang['addUser_error_modMail_disabled'] = 'A alteração do e-mail está desativada no momento.';
+$lang['addUser_error_create_event_failed'] = 'Um plugin impediu que o novo usuário fosse adicionado. Revise outras possíveis mensagens para mais informações.';
diff --git a/lib/plugins/usermanager/lang/pt/list.txt b/lib/plugins/usermanager/lang/pt/list.txt
index 01a0460aa..630647f9e 100644
--- a/lib/plugins/usermanager/lang/pt/list.txt
+++ b/lib/plugins/usermanager/lang/pt/list.txt
@@ -1 +1 @@
-===== Lista de Utilizadores ===== \ No newline at end of file
+===== Lista de Usuários ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/ro/lang.php b/lib/plugins/usermanager/lang/ro/lang.php
index d65fac95b..4ef6843e9 100644
--- a/lib/plugins/usermanager/lang/ro/lang.php
+++ b/lib/plugins/usermanager/lang/ro/lang.php
@@ -4,14 +4,9 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
* @author Sergiu Baltariu <s_baltariu@yahoo.com>
- * @author s_baltariu@yahoo.com
* @author Emanuel-Emeric Andrasi <n30@mandrivausers.ro>
- * @author Emanuel-Emeric Andrași <n30@mandrivausers.ro>
* @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/import.txt b/lib/plugins/usermanager/lang/ru/import.txt
index 0f303f32c..02a6a7925 100644
--- a/lib/plugins/usermanager/lang/ru/import.txt
+++ b/lib/plugins/usermanager/lang/ru/import.txt
@@ -1,9 +1,9 @@
===== Импорт нескольких пользователей =====
-Потребуется список пользователей в файле формата CSV, состоящем из 4 столбцов.
-Столбцы должны быть заполнены следующим образом: user-id, полное имя, эл. почта, группы.
-Поля CSV должны быть отделены запятой (,), а строки должны быть заключены в кавычки (%%""%%). Обратный слэш (\) используется для экранирования.
-В качестве примера можете взять список пользователей, экспортированный через «Экспорт пользователей».
-Повторяющиеся идентификаторы user-id будут игнорироваться.
+Потребуется список пользователей в файле формата CSV, состоящем из 4 столбцов.
+Столбцы должны быть заполнены следующим образом: идентификатор, полное имя, эл. почта, группы.
+Поля CSV должны быть разделены запятой (,), а строки должны быть заключены в кавычки (%%""%%). Обратный слэш (\) используется для экранирования.
+В качестве примера можете взять список пользователей, полученный через «Экспорт пользователей».
+Повторяющиеся идентификаторы будут игнорироваться.
-Пароль доступа будет сгенерирован и отправлен по почте удачно импортированному пользователю.
+Пароль доступа будет сгенерирован и отправлен по почте удачно импортированному пользователю. \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/ru/lang.php b/lib/plugins/usermanager/lang/ru/lang.php
index d0f98184d..f5d0e7a9c 100644
--- a/lib/plugins/usermanager/lang/ru/lang.php
+++ b/lib/plugins/usermanager/lang/ru/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Aleksandr Selivanov <alexgearbox@yandex.ru>
* @author Yuriy Skalko <yuriy.skalko@gmail.com>
* @author Denis Simakov <akinoame1@gmail.com>
* @author Andrew Pleshakov <beotiger@mail.ru>
@@ -13,7 +14,6 @@
* @author Kirill Krasnov <krasnovforum@gmail.com>
* @author Vlad Tsybenko <vlad.development@gmail.com>
* @author Aleksey Osadchiy <rfc@nm.ru>
- * @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>
@@ -55,7 +55,7 @@ $lang['delete_ok'] = 'Удалено пользователей: %d'
$lang['delete_fail'] = 'Не удалось удалить %d.';
$lang['update_ok'] = 'Пользователь успешно обновлён';
$lang['update_fail'] = 'Не удалось обновить пользователя';
-$lang['update_exists'] = 'Не удалось изменить имя пользователя, такой пользователь (%s) уже существует (все остальные изменения будут применены).';
+$lang['update_exists'] = 'Не удалось изменить имя пользователя, потому что такой пользователь (%s) уже существует (все остальные изменения будут применены).';
$lang['start'] = 'в начало';
$lang['prev'] = 'назад';
$lang['next'] = 'вперёд';
@@ -71,7 +71,7 @@ $lang['notify_ok'] = 'Письмо с уведомлением от
$lang['notify_fail'] = 'Не удалось отправить письмо с уведомлением';
$lang['import_userlistcsv'] = 'Файл со списком пользователей (CSV):';
$lang['import_header'] = 'Последний импорт — список ошибок';
-$lang['import_success_count'] = 'Импорт пользователей: %d пользователей найдено, %d импортировано успешно.';
+$lang['import_success_count'] = 'Импорт пользователей. Найдено пользователей: %d, импортировано успешно: %d.';
$lang['import_failure_count'] = 'Импорт пользователей: %d не удалось. Ошибки перечислены ниже.';
$lang['import_error_fields'] = 'Не все поля заполнены. Найдено %d, а требуется 4.';
$lang['import_error_baduserid'] = 'Отсутствует идентификатор пользователя';
@@ -81,12 +81,12 @@ $lang['import_error_upload'] = 'Импорт не удался. CSV-файл
$lang['import_error_readfail'] = 'Импорт не удался. Невозможно прочесть загруженный файл.';
$lang['import_error_create'] = 'Невозможно создать пользователя';
$lang['import_notify_fail'] = 'Оповещение не может быть отправлено импортированному пользователю %s по электронной почте %s.';
-$lang['import_downloadfailures'] = 'Скачать ошибки в формате CSV для исправления';
+$lang['import_downloadfailures'] = 'Скачать ошибочные данные в формате CSV для исправления';
$lang['addUser_error_missing_pass'] = 'Для возможности генерации пароля, пожалуйста, установите пароль или активируйте оповещения.';
$lang['addUser_error_pass_not_identical'] = 'Введённые пароли не совпадают.';
$lang['addUser_error_modPass_disabled'] = 'Изменение пароля в настоящее время невозможно.';
$lang['addUser_error_name_missing'] = 'Укажите имя нового пользователя.';
$lang['addUser_error_modName_disabled'] = 'Изменение имени в настоящее время невозможно.';
$lang['addUser_error_mail_missing'] = 'Укажите адрес эл. почты нового пользователя.';
-$lang['addUser_error_modMail_disabled'] = 'Изменение e-mail в настоящее время невозможно.';
+$lang['addUser_error_modMail_disabled'] = 'Изменение адреса эл. почты отключено.';
$lang['addUser_error_create_event_failed'] = 'Плагин заблокировал добавление нового пользователя. Смотрите также другие сообщения.';
diff --git a/lib/plugins/usermanager/lang/sk/lang.php b/lib/plugins/usermanager/lang/sk/lang.php
index 96f8fb60e..d244408a7 100644
--- a/lib/plugins/usermanager/lang/sk/lang.php
+++ b/lib/plugins/usermanager/lang/sk/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Peter Mydliar <peto.mydliar@gmail.com>
* @author Martin Michalek <michalek.dev@gmail.com>
* @author Ondrej Végh <ov@vsieti.sk>
* @author Michal Mesko <michal.mesko@gmail.com>
@@ -67,6 +68,7 @@ $lang['import_error_readfail'] = 'Import neúspešný. Nie je možné prečíta
$lang['import_error_create'] = 'Nie je možné vytvoriť pouzívateľa';
$lang['import_notify_fail'] = 'Správa nemohla byť zaslaná importovanému používatelovi, %s s emailom %s.';
$lang['import_downloadfailures'] = 'Stiahnuť chyby vo formáte CSV za účelom opravy';
+$lang['addUser_error_pass_not_identical'] = 'Zadané heslo nie je identické.';
$lang['addUser_error_modPass_disabled'] = 'Zmena hesla nie je momentálne povolená';
$lang['addUser_error_name_missing'] = 'Prosím zadajte meno nového používateľa.';
$lang['addUser_error_modName_disabled'] = 'Zmena mena nie je momentálne povolená.';
diff --git a/lib/plugins/usermanager/lang/sr/lang.php b/lib/plugins/usermanager/lang/sr/lang.php
index 858a2139b..5339e4ac1 100644
--- a/lib/plugins/usermanager/lang/sr/lang.php
+++ b/lib/plugins/usermanager/lang/sr/lang.php
@@ -3,8 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
- * @author Иван Петровић petrovicivan@ubuntusrbija.org
- * @author Ivan Petrovic <petrovicivan@ubuntusrbija.org>
+ * @author Иван Петровић <petrovicivan@ubuntusrbija.org>
* @author Miroslav Šolti <solti.miroslav@gmail.com>
*/
$lang['menu'] = 'Управљач корисницима';
diff --git a/lib/plugins/usermanager/lang/th/lang.php b/lib/plugins/usermanager/lang/th/lang.php
index d6e14f65f..0062dbedc 100644
--- a/lib/plugins/usermanager/lang/th/lang.php
+++ b/lib/plugins/usermanager/lang/th/lang.php
@@ -2,9 +2,8 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Komgrit Niyomrath <n.komgrit@gmail.com>
- * @author Kittithat Arnontavilas mrtomyum@gmail.com
* @author Kittithat Arnontavilas <mrtomyum@gmail.com>
* @author Thanasak Sompaisansin <jombthep@gmail.com>
*/
diff --git a/lib/plugins/usermanager/lang/tr/lang.php b/lib/plugins/usermanager/lang/tr/lang.php
index 6329803a8..97044ce24 100644
--- a/lib/plugins/usermanager/lang/tr/lang.php
+++ b/lib/plugins/usermanager/lang/tr/lang.php
@@ -2,12 +2,12 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Aydın Coşkuner <aydinweb@gmail.com>
* @author Cihan Kahveci <kahvecicihan@gmail.com>
* @author Yavuz Selim <yavuzselim@gmail.com>
* @author Caleb Maclennan <caleb@alerque.com>
- * @author farukerdemoncel@gmail.com
+ * @author farukerdemoncel <farukerdemoncel@gmail.com>
*/
$lang['menu'] = 'Kullanıcı Yönetimi';
$lang['noauth'] = '(kullanıcı onaylaması yoktur)';
diff --git a/lib/plugins/usermanager/lang/vi/add.txt b/lib/plugins/usermanager/lang/vi/add.txt
new file mode 100644
index 000000000..8684ee564
--- /dev/null
+++ b/lib/plugins/usermanager/lang/vi/add.txt
@@ -0,0 +1 @@
+===== Thêm thành viên ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/vi/delete.txt b/lib/plugins/usermanager/lang/vi/delete.txt
new file mode 100644
index 000000000..786ea4616
--- /dev/null
+++ b/lib/plugins/usermanager/lang/vi/delete.txt
@@ -0,0 +1 @@
+===== Xóa thành viên ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/vi/edit.txt b/lib/plugins/usermanager/lang/vi/edit.txt
new file mode 100644
index 000000000..2cca5cb2d
--- /dev/null
+++ b/lib/plugins/usermanager/lang/vi/edit.txt
@@ -0,0 +1 @@
+===== Sửa đổi thành viên ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/vi/import.txt b/lib/plugins/usermanager/lang/vi/import.txt
new file mode 100644
index 000000000..b2118bd78
--- /dev/null
+++ b/lib/plugins/usermanager/lang/vi/import.txt
@@ -0,0 +1,8 @@
+===== Nhập số lượng lớn thành viên =====
+
+Yêu cầu tập tin CSV của thành viên có ít nhất bốn cột.
+Các cột phải chứa, theo thứ tự: id thành viên, tên đầy đủ, địa chỉ email và các nhóm.
+Các trường CSV nên được phân tách bằng dấu phẩy (,) và chuỗi được phân cách bằng dấu ngoặc kép (%%""%%). Dấu gạch chéo ngược (\) có thể được sử dụng để thoát.
+Để biết ví dụ về một tệp phù hợp, hãy thử chức năng "Xuất thành viên" ở trên.
+Id thành viên trùng lặp sẽ bị bỏ qua.
+Một mật khẩu sẽ được tạo và gửi qua email cho mỗi thành viên được nhập thành công. \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/vi/intro.txt b/lib/plugins/usermanager/lang/vi/intro.txt
new file mode 100644
index 000000000..083cca434
--- /dev/null
+++ b/lib/plugins/usermanager/lang/vi/intro.txt
@@ -0,0 +1 @@
+====== Trình quản lý thành viên ====== \ 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..7c811ef39
--- /dev/null
+++ b/lib/plugins/usermanager/lang/vi/lang.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['menu'] = 'Trình quản lý thành viên';
+$lang['noauth'] = '(xác thực thành viên không có sẵn)';
+$lang['nosupport'] = '(quản lý thành viên không được hỗ trợ)';
+$lang['badauth'] = 'cơ chế xác thực không hợp lệ';
+$lang['user_id'] = 'Thành viên';
+$lang['user_pass'] = 'Mật khẩu';
+$lang['user_name'] = 'Tên thật';
+$lang['user_mail'] = 'Thư điện tử';
+$lang['user_groups'] = 'Nhóm';
+$lang['field'] = 'Trường';
+$lang['value'] = 'Giá trị';
+$lang['add'] = 'Thêm';
+$lang['delete'] = 'Xóa';
+$lang['delete_selected'] = 'Xóa những mục đã chọn';
+$lang['edit'] = 'Sửa';
+$lang['edit_prompt'] = 'Sửa đổi thành viên này';
+$lang['modify'] = 'Lưu thay đổi';
+$lang['search'] = 'Tìm kiếm';
+$lang['search_prompt'] = 'Thực hiện tìm kiếm';
+$lang['clear'] = 'Đặt lại bộ lọc tìm kiếm';
+$lang['filter'] = 'Bộ lọc';
+$lang['export_all'] = 'Xuất tất cả thành viên (CSV)';
+$lang['export_filtered'] = 'Xuất danh sách thành viên được lọc (CSV)';
+$lang['import'] = 'Nhập thành viên mới';
+$lang['line'] = 'Dòng số';
+$lang['error'] = 'Thông báo lỗi';
+$lang['summary'] = 'Hiển thị thành viên %1$d-%2$d trong %3$d được tìm thấy. %4$d thành viên tổng cộng.';
+$lang['nonefound'] = 'Không tìm thấy thành viên. %d thành viên tổng cộng.';
+$lang['delete_ok'] = 'Đã xóa %d thành viên.';
+$lang['delete_fail'] = 'Xóa không thành công %d';
+$lang['update_ok'] = 'Cập nhật thành viên thành công';
+$lang['update_fail'] = 'Cập nhật thành viên không thành công';
+$lang['update_exists'] = 'Thay đổi tên thành viên không thành công, tên thành viên được chỉ định (%s) đã tồn tại (mọi thay đổi khác sẽ được áp dụng).';
+$lang['start'] = 'bắt đầu';
+$lang['prev'] = 'trước';
+$lang['next'] = 'sau';
+$lang['last'] = 'cuối';
+$lang['edit_usermissing'] = 'Không tìm thấy thành viên đã chọn, tên thành viên được chỉ định có thể đã bị xóa hoặc thay đổi ở nơi khác.';
+$lang['user_notify'] = 'Thông báo cho thành viên';
+$lang['note_notify'] = 'Chỉ gửi thư điện tử thông báo nếu thành viên được cung cấp mật khẩu mới.';
+$lang['note_group'] = 'Thành viên mới sẽ được thêm vào nhóm mặc định (%s) nếu không có nhóm nào được chỉ định.';
+$lang['note_pass'] = 'Mật khẩu sẽ được tự động tạo nếu trường bị bỏ trống và thông báo của thành viên được bật.';
+$lang['add_ok'] = 'Đã thêm thành viên thành công';
+$lang['add_fail'] = 'Thêm thành viên đã không thành công';
+$lang['notify_ok'] = 'Đã gửi thư điện tử thông báo';
+$lang['notify_fail'] = 'Không thể gửi thư điện tử thông báo';
+$lang['import_userlistcsv'] = 'Tập tin danh sách thành viên (CSV):';
+$lang['import_header'] = 'Nhập gần đây nhất - Không thành công';
+$lang['import_success_count'] = 'Nhập thành viên: Đã tìm thấy %d thành viên, đã nhập thành công %d.';
+$lang['import_failure_count'] = 'Nhập thành viên: %d không thành công. Thành viên không được nhập thành công được liệt kê dưới đây.';
+$lang['import_error_fields'] = 'Không đủ trường, tìm thấy %d, yêu cầu 4.';
+$lang['import_error_baduserid'] = 'Thiếu id thành viên';
+$lang['import_error_badname'] = 'Tên không đúng';
+$lang['import_error_badmail'] = 'Địa chỉ thư điện tử không đúng';
+$lang['import_error_upload'] = 'Việc nhập không thành công. Không thể tải lên tập tin csv hoặc trống.';
+$lang['import_error_readfail'] = 'Việc nhập không thành công. Không thể đọc tệp đã tải lên.';
+$lang['import_error_create'] = 'Không thể tạo thành viên';
+$lang['import_notify_fail'] = 'Không thể gửi tin nhắn thông báo cho thành viên đã nhập, %s với thư điện tử %s.';
+$lang['import_downloadfailures'] = 'Tải xuống Lỗi dưới dạng CSV để sửa';
+$lang['addUser_error_missing_pass'] = 'Vui lòng đặt mật khẩu hoặc kích hoạt thông báo thành viên để cho phép tạo mật khẩu.';
+$lang['addUser_error_pass_not_identical'] = 'Các mật khẩu đã nhập không giống nhau.';
+$lang['addUser_error_modPass_disabled'] = 'Việc sửa đổi mật khẩu hiện đang bị vô hiệu hóa';
+$lang['addUser_error_name_missing'] = 'Vui lòng nhập tên cho người dùng mới.';
+$lang['addUser_error_modName_disabled'] = 'Việc sửa đổi tên hiện đang bị vô hiệu hóa.';
+$lang['addUser_error_mail_missing'] = 'Vui lòng nhập địa chỉ thư điện tử cho người dùng mới.';
+$lang['addUser_error_modMail_disabled'] = 'Việc sửa đổi địa chỉ thư điện tử hiện đang bị vô hiệu hóa.';
+$lang['addUser_error_create_event_failed'] = 'Một plugin ngăn không cho thành viên mới được thêm vào. Xem lại các tin nhắn khác có thể để biết thêm thông tin.';
diff --git a/lib/plugins/usermanager/lang/vi/list.txt b/lib/plugins/usermanager/lang/vi/list.txt
new file mode 100644
index 000000000..b6dbae8fa
--- /dev/null
+++ b/lib/plugins/usermanager/lang/vi/list.txt
@@ -0,0 +1 @@
+===== Danh sách thành viên ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/script.js b/lib/plugins/usermanager/script.js
index de013242b..3b7ad0964 100644
--- a/lib/plugins/usermanager/script.js
+++ b/lib/plugins/usermanager/script.js
@@ -2,7 +2,7 @@
* Add JavaScript confirmation to the User Delete button
*/
jQuery(function(){
- jQuery('#usrmgr__del').click(function(){
+ jQuery('#usrmgr__del').on('click', function(){
return confirm(LANG.del_confirm);
});
});
diff --git a/lib/scripts/behaviour.js b/lib/scripts/behaviour.js
index 18308d68a..f9aad3d02 100644
--- a/lib/scripts/behaviour.js
+++ b/lib/scripts/behaviour.js
@@ -85,14 +85,14 @@ var dw_behaviour = {
* Looks for an element with the ID focus__this at sets focus to it
*/
focusMarker: function(){
- jQuery('#focus__this').focus();
+ jQuery('#focus__this').trigger('focus');
},
/**
* Remove all search highlighting when clicking on a highlighted term
*/
removeHighlightOnClick: function(){
- jQuery('span.search_hit').click(
+ jQuery('span.search_hit').on('click',
function(e){
jQuery(e.target).removeClass('search_hit', 1000);
}
@@ -110,7 +110,7 @@ var dw_behaviour = {
*/
quickSelect: function(){
jQuery('select.quickselect')
- .change(function(e){ e.target.form.submit(); })
+ .on('change', function(e){ e.target.form.submit(); })
.closest('form').find(':button').not('.show').hide();
},
@@ -120,7 +120,7 @@ var dw_behaviour = {
* @author Michael Klier <chi@chimeric.de>
*/
checkWindowsShares: function() {
- if(!LANG.nosmblinks || navigator.userAgent.match(/(Trident|MSIE)/)) {
+ if(!LANG.nosmblinks || navigator.userAgent.match(/(Trident|MSIE|Edge)/)) {
// No warning requested or none necessary
return;
}
@@ -146,7 +146,7 @@ var dw_behaviour = {
$digest = $form.find("input[name='sub_style'][value='digest']");
$form.find("input[name='sub_target']")
- .click(
+ .on('click',
function () {
var $this = jQuery(this), show_list;
if (!$this.prop('checked')) {
@@ -161,7 +161,7 @@ var dw_behaviour = {
}
)
.filter(':checked')
- .click();
+ .trigger('click');
},
/**
@@ -177,15 +177,15 @@ var dw_behaviour = {
var $button = jQuery('button', $revisions);
if($checked.length < 2) {
- $all.removeAttr('disabled');
- $button.attr('disabled', true);
+ $all.prop('disabled', false);
+ $button.prop('disabled', true);
} else {
- $all.attr('disabled', true);
- $button.removeAttr('disabled');
+ $all.prop('disabled', true);
+ $button.prop('disabled', false);
$checked.each(function(i) {
- jQuery(this).removeAttr('disabled');
+ jQuery(this).prop('disabled', false);
if(i>1) {
- jQuery(this).attr('checked', false);
+ jQuery(this).prop('checked', false);
}
});
}
diff --git a/lib/scripts/cookie.js b/lib/scripts/cookie.js
index 8417d2064..e260e5919 100644
--- a/lib/scripts/cookie.js
+++ b/lib/scripts/cookie.js
@@ -22,7 +22,13 @@ var DokuCookie = {
var text = [],
_this = this;
this.init();
- this.data[key] = val;
+ if (val === false){
+ delete this.data[key];
+ }else{
+ val = val + "";
+ this.data[key] = val;
+ }
+
//save the whole data array
jQuery.each(_this.data, function (key, val) {
@@ -37,10 +43,11 @@ var DokuCookie = {
* Get a Value from the Cookie
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param def default value if key does not exist; if not set, returns undefined by default
*/
- getValue: function(key){
+ getValue: function(key, def){
this.init();
- return this.data[key];
+ return this.data.hasOwnProperty(key) ? this.data[key] : def;
},
/**
diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js
index b3e97b63c..f53a6d4ae 100644
--- a/lib/scripts/edit.js
+++ b/lib/scripts/edit.js
@@ -161,7 +161,7 @@ function currentHeadlineLevel(textboxId){
var field = jQuery('#' + textboxId)[0],
s = false,
opts = [field.value.substr(0,DWgetSelection(field).start)];
- if (field.form.prefix) {
+ if (field.form && field.form.prefix) {
// we need to look in prefix context
opts.push(field.form.prefix.value);
}
@@ -238,7 +238,7 @@ jQuery(function () {
sel.start = 0;
sel.end = 0;
DWsetSelection(sel);
- $edit_text.focus();
+ $edit_text.trigger('focus');
doku_edit_text_content = $edit_text.val();
}
@@ -260,13 +260,13 @@ jQuery(function () {
window.onunload = deleteDraft;
// reset change memory var on submit
- jQuery('#edbtn__save').click(
+ jQuery('#edbtn__save').on('click',
function() {
window.onbeforeunload = '';
textChanged = false;
}
);
- jQuery('#edbtn__preview').click(
+ jQuery('#edbtn__preview').on('click',
function() {
window.onbeforeunload = '';
textChanged = false;
@@ -275,8 +275,7 @@ jQuery(function () {
);
var $summary = jQuery('#edit__summary');
- $summary.change(doku_summaryCheck);
- $summary.keyup(doku_summaryCheck);
+ $summary.on('change keyup', doku_summaryCheck);
if (textChanged) doku_summaryCheck();
});
diff --git a/lib/scripts/editor.js b/lib/scripts/editor.js
index c9cb312b0..0df556172 100644
--- a/lib/scripts/editor.js
+++ b/lib/scripts/editor.js
@@ -60,7 +60,7 @@ var dw_editor = {
jQuery(document.createElement('img'))
.attr('src', DOKU_BASE+'lib/images/' + img[0] + '.gif')
.attr('alt', '')
- .click(img[1])
+ .on('click', img[1])
.appendTo($ctl);
});
},
@@ -140,7 +140,7 @@ var dw_editor = {
if((e.keyCode == 13 || e.keyCode == 10) && e.ctrlKey) { // Ctrl-Enter (With Chrome workaround)
// Submit current edit
- jQuery('#edbtn__save').click();
+ jQuery('#edbtn__save').trigger('click');
e.preventDefault(); // prevent enter key
return false;
}else if(e.keyCode == 13){ // Enter
diff --git a/lib/scripts/fileuploaderextended.js b/lib/scripts/fileuploaderextended.js
index ba2aa3ea5..b7f9f5f30 100644
--- a/lib/scripts/fileuploaderextended.js
+++ b/lib/scripts/fileuploaderextended.js
@@ -149,7 +149,7 @@ qq.extend(qq.FileUploaderExtended.prototype, {
self._handler._options.onUpload();
jQuery(".qq-upload-name-input").each(function (i) {
- jQuery(this).attr('disabled', 'disabled');
+ jQuery(this).prop('disabled', true);
});
});
},
diff --git a/lib/scripts/jquery/jquery-migrate.min.js b/lib/scripts/jquery/jquery-migrate.min.js
deleted file mode 100644
index a2813c5d2..000000000
--- a/lib/scripts/jquery/jquery-migrate.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery Migrate v3.0.0 | (c) jQuery Foundation and other contributors | jquery.org/license */
-"undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(a,b){"use strict";function c(c){var d=b.console;e[c]||(e[c]=!0,a.migrateWarnings.push(c),d&&d.warn&&!a.migrateMute&&(d.warn("JQMIGRATE: "+c),a.migrateTrace&&d.trace&&d.trace()))}function d(a,b,d,e){Object.defineProperty(a,b,{configurable:!0,enumerable:!0,get:function(){return c(e),d}})}a.migrateVersion="3.0.0",function(){var c=b.console&&b.console.log&&function(){b.console.log.apply(b.console,arguments)},d=/^[12]\./;c&&(a&&!d.test(a.fn.jquery)||c("JQMIGRATE: jQuery 3.0.0+ REQUIRED"),a.migrateWarnings&&c("JQMIGRATE: Migrate plugin loaded multiple times"),c("JQMIGRATE: Migrate is installed"+(a.migrateMute?"":" with logging active")+", version "+a.migrateVersion))}();var e={};a.migrateWarnings=[],void 0===a.migrateTrace&&(a.migrateTrace=!0),a.migrateReset=function(){e={},a.migrateWarnings.length=0},"BackCompat"===document.compatMode&&c("jQuery is not compatible with Quirks Mode");var f=a.fn.init,g=a.isNumeric,h=a.find,i=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,j=/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g;a.fn.init=function(a){var b=Array.prototype.slice.call(arguments);return"string"==typeof a&&"#"===a&&(c("jQuery( '#' ) is not a valid selector"),b[0]=[]),f.apply(this,b)},a.fn.init.prototype=a.fn,a.find=function(a){var b=Array.prototype.slice.call(arguments);if("string"==typeof a&&i.test(a))try{document.querySelector(a)}catch(d){a=a.replace(j,function(a,b,c,d){return"["+b+c+'"'+d+'"]'});try{document.querySelector(a),c("Attribute selector with '#' must be quoted: "+b[0]),b[0]=a}catch(e){c("Attribute selector with '#' was not fixed: "+b[0])}}return h.apply(this,b)};var k;for(k in h)Object.prototype.hasOwnProperty.call(h,k)&&(a.find[k]=h[k]);a.fn.size=function(){return c("jQuery.fn.size() is deprecated; use the .length property"),this.length},a.parseJSON=function(){return c("jQuery.parseJSON is deprecated; use JSON.parse"),JSON.parse.apply(null,arguments)},a.isNumeric=function(b){function d(b){var c=b&&b.toString();return!a.isArray(b)&&c-parseFloat(c)+1>=0}var e=g(b),f=d(b);return e!==f&&c("jQuery.isNumeric() should not be called on constructed objects"),f},d(a,"unique",a.uniqueSort,"jQuery.unique is deprecated, use jQuery.uniqueSort"),d(a.expr,"filters",a.expr.pseudos,"jQuery.expr.filters is now jQuery.expr.pseudos"),d(a.expr,":",a.expr.pseudos,'jQuery.expr[":"] is now jQuery.expr.pseudos');var l=a.ajax;a.ajax=function(){var a=l.apply(this,arguments);return a.promise&&(d(a,"success",a.done,"jQXHR.success is deprecated and removed"),d(a,"error",a.fail,"jQXHR.error is deprecated and removed"),d(a,"complete",a.always,"jQXHR.complete is deprecated and removed")),a};var m=a.fn.removeAttr,n=a.fn.toggleClass,o=/\S+/g;a.fn.removeAttr=function(b){var d=this;return a.each(b.match(o),function(b,e){a.expr.match.bool.test(e)&&(c("jQuery.fn.removeAttr no longer sets boolean properties: "+e),d.prop(e,!1))}),m.apply(this,arguments)},a.fn.toggleClass=function(b){return void 0!==b&&"boolean"!=typeof b?n.apply(this,arguments):(c("jQuery.fn.toggleClass( boolean ) is deprecated"),this.each(function(){var c=this.getAttribute&&this.getAttribute("class")||"";c&&a.data(this,"__className__",c),this.setAttribute&&this.setAttribute("class",c||b===!1?"":a.data(this,"__className__")||"")}))};var p=!1;a.swap&&a.each(["height","width","reliableMarginRight"],function(b,c){var d=a.cssHooks[c]&&a.cssHooks[c].get;d&&(a.cssHooks[c].get=function(){var a;return p=!0,a=d.apply(this,arguments),p=!1,a})}),a.swap=function(a,b,d,e){var f,g,h={};p||c("jQuery.swap() is undocumented and deprecated");for(g in b)h[g]=a.style[g],a.style[g]=b[g];f=d.apply(a,e||[]);for(g in b)a.style[g]=h[g];return f};var q=a.data;a.data=function(b,d,e){var f;return d&&d!==a.camelCase(d)&&(f=a.hasData(b)&&q.call(this,b),f&&d in f)?(c("jQuery.data() always sets/gets camelCased names: "+d),arguments.length>2&&(f[d]=e),f[d]):q.apply(this,arguments)};var r=a.Tween.prototype.run;a.Tween.prototype.run=function(b){a.easing[this.easing].length>1&&(c('easing function "jQuery.easing.'+this.easing.toString()+'" should use only first argument'),a.easing[this.easing]=a.easing[this.easing].bind(a.easing,b,this.options.duration*b,0,1,this.options.duration)),r.apply(this,arguments)};var s=a.fn.load,t=a.event.fix;a.event.props=[],a.event.fixHooks={},a.event.fix=function(b){var d,e=b.type,f=this.fixHooks[e],g=a.event.props;if(g.length)for(c("jQuery.event.props are deprecated and removed: "+g.join());g.length;)a.event.addProp(g.pop());if(f&&!f._migrated_&&(f._migrated_=!0,c("jQuery.event.fixHooks are deprecated and removed: "+e),(g=f.props)&&g.length))for(;g.length;)a.event.addProp(g.pop());return d=t.call(this,b),f&&f.filter?f.filter(d,b):d},a.each(["load","unload","error"],function(b,d){a.fn[d]=function(){var a=Array.prototype.slice.call(arguments,0);return"load"===d&&"string"==typeof a[0]?s.apply(this,a):(c("jQuery.fn."+d+"() is deprecated"),a.splice(0,0,d),arguments.length?this.on.apply(this,a):(this.triggerHandler.apply(this,a),this))}}),a(function(){a(document).triggerHandler("ready")}),a.event.special.ready={setup:function(){this===document&&c("'ready' event is deprecated")}},a.fn.extend({bind:function(a,b,d){return c("jQuery.fn.bind() is deprecated"),this.on(a,null,b,d)},unbind:function(a,b){return c("jQuery.fn.unbind() is deprecated"),this.off(a,null,b)},delegate:function(a,b,d,e){return c("jQuery.fn.delegate() is deprecated"),this.on(b,a,d,e)},undelegate:function(a,b,d){return c("jQuery.fn.undelegate() is deprecated"),1===arguments.length?this.off(a,"**"):this.off(b,a||"**",d)}});var u=a.fn.offset;a.fn.offset=function(){var b,d=this[0],e={top:0,left:0};return d&&d.nodeType?(b=(d.ownerDocument||document).documentElement,a.contains(b,d)?u.apply(this,arguments):(c("jQuery.fn.offset() requires an element connected to a document"),e)):(c("jQuery.fn.offset() requires a valid DOM element"),e)};var v=a.param;a.param=function(b,d){var e=a.ajaxSettings&&a.ajaxSettings.traditional;return void 0===d&&e&&(c("jQuery.param() no longer uses jQuery.ajaxSettings.traditional"),d=e),v.call(this,b,d)};var w=a.fn.andSelf||a.fn.addBack;a.fn.andSelf=function(){return c("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)};var x=a.Deferred,y=[["resolve","done",a.Callbacks("once memory"),a.Callbacks("once memory"),"resolved"],["reject","fail",a.Callbacks("once memory"),a.Callbacks("once memory"),"rejected"],["notify","progress",a.Callbacks("memory"),a.Callbacks("memory")]];a.Deferred=function(b){var d=x(),e=d.promise();return d.pipe=e.pipe=function(){var b=arguments;return c("deferred.pipe() is deprecated"),a.Deferred(function(c){a.each(y,function(f,g){var h=a.isFunction(b[f])&&b[f];d[g[1]](function(){var b=h&&h.apply(this,arguments);b&&a.isFunction(b.promise)?b.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[g[0]+"With"](this===e?c.promise():this,h?[b]:arguments)})}),b=null}).promise()},b&&b.call(d,d),d}}(jQuery,window); \ No newline at end of file
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_95_fef1ec_1x400.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_95_fef1ec_1x400.png
index e69de29bb..b9356a287 100644
--- a/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_95_fef1ec_1x400.png
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_95_fef1ec_1x400.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery.cookie.js b/lib/scripts/jquery/jquery.cookie.js
index c4f99af00..c7f3a59b5 100644
--- a/lib/scripts/jquery/jquery.cookie.js
+++ b/lib/scripts/jquery/jquery.cookie.js
@@ -1,5 +1,5 @@
/*!
- * jQuery Cookie Plugin v1.3.1
+ * jQuery Cookie Plugin v1.4.1
* https://github.com/carhartl/jquery-cookie
*
* Copyright 2013 Klaus Hartl
@@ -7,51 +7,65 @@
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
- // AMD. Register as anonymous module.
+ // AMD
define(['jquery'], factory);
+ } else if (typeof exports === 'object') {
+ // CommonJS
+ factory(require('jquery'));
} else {
- // Browser globals.
+ // Browser globals
factory(jQuery);
}
}(function ($) {
var pluses = /\+/g;
- function raw(s) {
- return s;
+ function encode(s) {
+ return config.raw ? s : encodeURIComponent(s);
}
- function decoded(s) {
- return decodeURIComponent(s.replace(pluses, ' '));
+ function decode(s) {
+ return config.raw ? s : decodeURIComponent(s);
}
- function converted(s) {
+ function stringifyCookieValue(value) {
+ return encode(config.json ? JSON.stringify(value) : String(value));
+ }
+
+ function parseCookieValue(s) {
if (s.indexOf('"') === 0) {
- // This is a quoted cookie as according to RFC2068, unescape
+ // This is a quoted cookie as according to RFC2068, unescape...
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
}
+
try {
+ // Replace server-side written pluses with spaces.
+ // If we can't decode the cookie, ignore it, it's unusable.
+ // If we can't parse the cookie, ignore it, it's unusable.
+ s = decodeURIComponent(s.replace(pluses, ' '));
return config.json ? JSON.parse(s) : s;
- } catch(er) {}
+ } catch(e) {}
+ }
+
+ function read(s, converter) {
+ var value = config.raw ? s : parseCookieValue(s);
+ return $.isFunction(converter) ? converter(value) : value;
}
var config = $.cookie = function (key, value, options) {
- // write
- if (value !== undefined) {
+ // Write
+
+ if (value !== undefined && !$.isFunction(value)) {
options = $.extend({}, config.defaults, options);
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
- t.setDate(t.getDate() + days);
+ t.setTime(+t + days * 864e+5);
}
- value = config.json ? JSON.stringify(value) : String(value);
-
return (document.cookie = [
- config.raw ? key : encodeURIComponent(key),
- '=',
- config.raw ? value : encodeURIComponent(value),
+ encode(key), '=', stringifyCookieValue(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
@@ -59,22 +73,29 @@
].join(''));
}
- // read
- var decode = config.raw ? raw : decoded;
- var cookies = document.cookie.split('; ');
+ // Read
+
var result = key ? undefined : {};
+
+ // To prevent the for loop in the first place assign an empty array
+ // in case there are no cookies at all. Also prevents odd result when
+ // calling $.cookie().
+ var cookies = document.cookie ? document.cookie.split('; ') : [];
+
for (var i = 0, l = cookies.length; i < l; i++) {
var parts = cookies[i].split('=');
var name = decode(parts.shift());
- var cookie = decode(parts.join('='));
+ var cookie = parts.join('=');
if (key && key === name) {
- result = converted(cookie);
+ // If second argument (value) is a function it's a converter...
+ result = read(cookie, value);
break;
}
- if (!key) {
- result[name] = converted(cookie);
+ // Prevent storing a cookie that we couldn't decode.
+ if (!key && (cookie = read(cookie)) !== undefined) {
+ result[name] = cookie;
}
}
@@ -84,12 +105,13 @@
config.defaults = {};
$.removeCookie = function (key, options) {
- if ($.cookie(key) !== undefined) {
- // Must not alter options, thus extending a fresh object...
- $.cookie(key, '', $.extend({}, options, { expires: -1 }));
- return true;
+ if ($.cookie(key) === undefined) {
+ return false;
}
- return false;
+
+ // Must not alter options, thus extending a fresh object...
+ $.cookie(key, '', $.extend({}, options, { expires: -1 }));
+ return !$.cookie(key);
};
}));
diff --git a/lib/scripts/jquery/jquery.min.js b/lib/scripts/jquery/jquery.min.js
index 4c5be4c0f..47b639702 100644
--- a/lib/scripts/jquery/jquery.min.js
+++ b/lib/scripts/jquery/jquery.min.js
@@ -1,4 +1,2 @@
-/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */
-!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),
-a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:X.test(a)?JSON.parse(a):a)}function $(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=Z(c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),$(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=$(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var _=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,aa=new RegExp("^(?:([+-])=|)("+_+")([a-z%]*)$","i"),ba=["Top","Right","Bottom","Left"],ca=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function ea(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&aa.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var fa={};function ga(a){var b,c=a.ownerDocument,d=a.nodeName,e=fa[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),fa[d]=e,e)}function ha(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ca(d)&&(e[f]=ga(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ha(this,!0)},hide:function(){return ha(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ca(this)?r(this).show():r(this).hide()})}});var ia=/^(?:checkbox|radio)$/i,ja=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var oa=/<|&#?\w+;/;function pa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(oa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ja.exec(f)||["",""])[1].toLowerCase(),i=la[h]||la._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==wa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===wa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ua:va,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:va,isPropagationStopped:va,isImmediatePropagationStopped:va,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ua,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ua,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ua,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&ra.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&sa.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return xa(this,a,b,c,d)},one:function(a,b,c,d){return xa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=va),this.each(function(){r.event.remove(this,a,c,b)})}});var ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/<script|<style|<link/i,Aa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ba=/^true\/(.*)/,Ca=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ha(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ia.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ia(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,ma(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Fa),l=0;l<i;l++)j=h[l],ka.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ca,""),k))}return a}function Ja(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(ma(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&na(ma(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(ya,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);if(b)if(c)for(f=f||ma(a),g=g||ma(h),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);else Ga(a,h);return g=ma(h,"script"),g.length>0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(ma(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ia(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(ma(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ka=/^margin/,La=new RegExp("^("+_+")(?!px)[a-z%]+$","i"),Ma=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",qa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,qa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Na(a,b,c){var d,e,f,g,h=a.style;return c=c||Ma(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&La.test(g)&&Ka.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Oa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Pa=/^(none|table(?!-c[ea]).+)/,Qa={position:"absolute",visibility:"hidden",display:"block"},Ra={letterSpacing:"0",fontWeight:"400"},Sa=["Webkit","Moz","ms"],Ta=d.createElement("div").style;function Ua(a){if(a in Ta)return a;var b=a[0].toUpperCase()+a.slice(1),c=Sa.length;while(c--)if(a=Sa[c]+b,a in Ta)return a}function Va(a,b,c){var d=aa.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Wa(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ba[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ba[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ba[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ba[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ba[f]+"Width",!0,e)));return g}function Xa(a,b,c){var d,e=!0,f=Ma(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Na(a,b,f),(d<0||null==d)&&(d=a.style[b]),La.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Wa(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Na(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=aa.exec(c))&&e[1]&&(c=ea(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Na(a,b,d)),"normal"===e&&b in Ra&&(e=Ra[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Pa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Xa(a,b,d):da(a,Qa,function(){return Xa(a,b,d)})},set:function(a,c,d){var e,f=d&&Ma(a),g=d&&Wa(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=aa.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Va(a,c,g)}}}),r.cssHooks.marginLeft=Oa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Na(a,"marginLeft"))||a.getBoundingClientRect().left-da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ba[d]+b]=f[d]||f[d-2]||f[0];return e}},Ka.test(a)||(r.cssHooks[a+b].set=Va)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=Ma(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function fb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ca(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],_a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ha([a],!0),j=a.style.display||j,k=r.css(a,"display"),ha([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ha([a],!0),m.done(function(){p||ha([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=eb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function gb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function hb(a,b,c){var d,e,f=0,g=hb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Za||cb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Za||cb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(gb(k,j.opts.specialEasing);f<g;f++)if(d=hb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,eb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(hb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return ea(c.elem,a,aa.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],hb.tweeners[c]=hb.tweeners[c]||[],hb.tweeners[c].unshift(b)},prefilters:[fb],prefilter:function(a,b){b?hb.prefilters.unshift(a):hb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:"number"!=typeof e.duration&&(e.duration in r.fx.speeds?e.duration=r.fx.speeds[e.duration]:e.duration=r.fx.speeds._default),null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ca).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=hb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ab.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(db(b,!0),a,d,e)}}),r.each({slideDown:db("show"),slideUp:db("hide"),slideToggle:db("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Za=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Za=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){$a||($a=a.requestAnimationFrame?a.requestAnimationFrame(bb):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame($a):a.clearInterval($a),$a=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var ib,jb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)),
-void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=pa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=mb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||qa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Oa(o.pixelPosition,function(a,c){if(c)return c=Na(a,b),La.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
+/*! jQuery v3.5.0 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t=Object.create(null),V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/lib/scripts/jquery/update.sh b/lib/scripts/jquery/update.sh
index 31b859ecd..e950d89b7 100755
--- a/lib/scripts/jquery/update.sh
+++ b/lib/scripts/jquery/update.sh
@@ -17,8 +17,6 @@ JQUI_GIT="https://raw.githubusercontent.com/jquery/jquery-ui/$JQUI_VERSION/ui"
wget -nv https://code.jquery.com/jquery-${JQ_VERSION}.min.js -O jquery.min.js
# load jQuery-UI
wget -nv "$JQUI_HOST/jquery-ui.min.js" -O jquery-ui.min.js
-# load jQuery Migrate
-wget -nv https://code.jquery.com/jquery-migrate-${JQM_VERSION}.min.js -O jquery-migrate.min.js
# load the smoothness theme
mkdir -p jquery-ui-theme/images
diff --git a/lib/scripts/jquery/versions b/lib/scripts/jquery/versions
index dfc354932..d5c9c3ccd 100644
--- a/lib/scripts/jquery/versions
+++ b/lib/scripts/jquery/versions
@@ -1,4 +1,3 @@
# this is loaded from the update.sh script and our PHP code
-JQ_VERSION=3.1.1
+JQ_VERSION=3.5.0
JQUI_VERSION=1.12.1
-JQM_VERSION=3.0.0
diff --git a/lib/scripts/linkwiz.js b/lib/scripts/linkwiz.js
index da1e072a1..d82ca9681 100644
--- a/lib/scripts/linkwiz.js
+++ b/lib/scripts/linkwiz.js
@@ -57,7 +57,7 @@ var dw_linkwiz = {
}
// attach event handlers
- jQuery('#link__wiz .ui-dialog-titlebar-close').click(dw_linkwiz.hide);
+ jQuery('#link__wiz .ui-dialog-titlebar-close').on('click', dw_linkwiz.hide);
dw_linkwiz.$entry.keyup(dw_linkwiz.onEntry);
jQuery(dw_linkwiz.result).on('click', 'a', dw_linkwiz.onResultClick);
},
diff --git a/lib/scripts/locktimer.js b/lib/scripts/locktimer.js
index f83b6334e..7bc8a3969 100644
--- a/lib/scripts/locktimer.js
+++ b/lib/scripts/locktimer.js
@@ -8,6 +8,13 @@ var dw_locktimer = {
lasttime: null,
msg: LANG.willexpire,
pageid: '',
+ fieldsToSaveAsDraft: [
+ 'input[name=prefix]',
+ 'textarea[name=wikitext]',
+ 'input[name=suffix]',
+ 'input[name=date]',
+ ],
+ callbacks: [],
/**
* Initialize the lock timer
@@ -43,6 +50,26 @@ var dw_locktimer = {
},
/**
+ * Add another field of the editform to be posted to the server when a draft is saved
+ */
+ addField: function(selector) {
+ dw_locktimer.fieldsToSaveAsDraft.push(selector);
+ },
+
+ /**
+ * Add a callback that is executed when the post request to renew the lock and save the draft returns successfully
+ *
+ * If the user types into the edit-area, then dw_locktimer will regularly send a post request to the DokuWiki server
+ * to extend the page's lock and update the draft. When this request returns successfully, then the draft__status
+ * is updated. This method can be used to add further callbacks to be executed at that moment.
+ *
+ * @param {function} callback the only param is the data returned by the server
+ */
+ addRefreshCallback: function(callback) {
+ dw_locktimer.callbacks.push(callback);
+ },
+
+ /**
* (Re)start the warning timer
*/
reset: function(){
@@ -77,25 +104,28 @@ var dw_locktimer = {
var now = new Date(),
params = 'call=lock&id=' + dw_locktimer.pageid + '&';
- // refresh every minute only
+ // refresh every half minute only
if(now.getTime() - dw_locktimer.lasttime.getTime() <= 30*1000) {
return;
}
// POST everything necessary for draft saving
if(dw_locktimer.draft && jQuery('#dw__editform').find('textarea[name=wikitext]').length > 0){
- params += jQuery('#dw__editform').find('input[name=prefix], ' +
- 'textarea[name=wikitext], ' +
- 'input[name=suffix], ' +
- 'input[name=date]').serialize();
+ params += jQuery('#dw__editform').find(dw_locktimer.fieldsToSaveAsDraft.join(', ')).serialize();
}
jQuery.post(
DOKU_BASE + 'lib/exe/ajax.php',
params,
- dw_locktimer.refreshed,
- 'html'
- );
+ null,
+ 'json'
+ ).done(function dwLocktimerRefreshDoneHandler(data) {
+ dw_locktimer.callbacks.forEach(
+ function (callback) {
+ callback(data);
+ }
+ );
+ });
dw_locktimer.lasttime = now;
},
@@ -103,13 +133,19 @@ var dw_locktimer = {
* Callback. Resets the warning timer
*/
refreshed: function(data){
- var error = data.charAt(0);
- data = data.substring(1);
+ if (data.errors.length) {
+ data.errors.forEach(function(error) {
+ jQuery('#draft__status').after(
+ jQuery('<div class="error"></div>').text(error)
+ );
+ })
+ }
- jQuery('#draft__status').html(data);
- if(error != '1') {
+ jQuery('#draft__status').html(data.draft);
+ if(data.lock !== '1') {
return; // locking failed
}
dw_locktimer.reset();
}
};
+dw_locktimer.callbacks.push(dw_locktimer.refreshed);
diff --git a/lib/scripts/media.js b/lib/scripts/media.js
index 1e9d0328f..6f36d3b2e 100644
--- a/lib/scripts/media.js
+++ b/lib/scripts/media.js
@@ -107,7 +107,7 @@ var dw_mediamanager = {
dw_mediamanager.update_resizable();
dw_mediamanager.layout_width = $page.width();
- jQuery(window).resize(dw_mediamanager.window_resize);
+ jQuery(window).on('resize', dw_mediamanager.window_resize);
},
init_options: function () {
@@ -194,7 +194,7 @@ var dw_mediamanager = {
.addClass('button')
.attr('id', "media__" + opt.id + "btn" + (i + 1))
.attr('title', LANG['media' + text])
- .click(bind(dw_mediamanager.setOpt, opt.id));
+ .on('click', bind(dw_mediamanager.setOpt, opt.id));
$img = jQuery(document.createElement('img'))
.attr('src', DOKU_BASE + 'lib/images/media_' + opt.id + '_' + text + '.png');
@@ -474,7 +474,7 @@ var dw_mediamanager = {
if ($container.length === 0) {
$container = $content;
}
- $container.html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />');
+ $container.html('<img src="' + DOKU_BASE + 'lib/images/throbber.gif" alt="..." class="load" />');
},
window_resize: function () {
@@ -735,7 +735,7 @@ var dw_mediamanager = {
// remove old callback from the insert button and set the new one.
var $sendbtn = jQuery('#media__sendbtn');
- $sendbtn.off().click(bind(dw_mediamanager.insert, id));
+ $sendbtn.off().on('click', bind(dw_mediamanager.insert, id));
dw_mediamanager.unforbid('ext');
if (ext === '.swf') {
@@ -801,7 +801,7 @@ var dw_mediamanager = {
$box = jQuery(document.createElement('input'))
.attr('type', 'checkbox')
.attr('id', 'media__' + opt[0])
- .click(bind(dw_mediamanager.toggleOption, opt[0]));
+ .on('click', bind(dw_mediamanager.toggleOption, opt[0]));
if (DokuCookie.getValue(opt[0])) {
$box.prop('checked', true);
diff --git a/lib/scripts/page.js b/lib/scripts/page.js
index aadff8ecf..77d644a38 100644
--- a/lib/scripts/page.js
+++ b/lib/scripts/page.js
@@ -9,7 +9,8 @@ dw_page = {
*/
init: function(){
dw_page.sectionHighlight();
- jQuery('a.fn_top').mouseover(dw_page.footnoteDisplay);
+ dw_page.currentIDHighlight();
+ jQuery('a.fn_top').on('mouseover', dw_page.footnoteDisplay);
dw_page.makeToggle('#dw__toc h3','#dw__toc > div');
},
@@ -20,7 +21,7 @@ dw_page = {
*/
sectionHighlight: function() {
jQuery('form.btn_secedit')
- .mouseover(function(){
+ .on('mouseover', function(){
var $tgt = jQuery(this).parent(),
nr = $tgt.attr('class').match(/(\s+|^)editbutton_(\d+)(\s+|$)/)[2],
$highlight = jQuery(), // holder for elements in the section to be highlighted
@@ -36,7 +37,7 @@ dw_page = {
// and move the elements to be highlighted inside the section highlight wrapper
$highlight.detach().appendTo($highlightWrap);
})
- .mouseout(function(){
+ .on('mouseout', function(){
// find the section highlight wrapper...
var $highlightWrap = jQuery('.section_highlight');
// ...move its children in front of it (as siblings)...
@@ -46,6 +47,16 @@ dw_page = {
});
},
+
+ /**
+ * Highlight internal link pointing to current page
+ *
+ * @author Henry Pan <dokuwiki@phy25.com>
+ */
+ currentIDHighlight: function(){
+ jQuery('a.wikilink1, a.wikilink2').filter('[data-wiki-id="'+JSINFO.id+'"]').wrap('<span class="curid"></div>');
+ },
+
/**
* Create/get a insitu popup used by the footnotes
*
@@ -63,7 +74,7 @@ dw_page = {
.attr('id', popup_id)
.addClass('insitu-footnote JSpopup')
.attr('aria-hidden', 'true')
- .mouseleave(function () {jQuery(this).hide().attr('aria-hidden', 'true');})
+ .on('mouseleave', function () {jQuery(this).hide().attr('aria-hidden', 'true');})
.attr('role', 'tooltip');
jQuery('.dokuwiki:first').append($fndiv);
}
@@ -89,7 +100,7 @@ dw_page = {
var $content = jQuery(jQuery(this).attr('href')) // Footnote text anchor
.parent().siblings('.content').clone();
- if (!$content) {
+ if (!$content.length) {
return;
}
@@ -179,7 +190,7 @@ dw_page = {
// click function
$handle.css('cursor','pointer')
- .click($handle[0].setState)
+ .on('click', $handle[0].setState)
.prepend($clicky);
// initial state
diff --git a/lib/scripts/qsearch.js b/lib/scripts/qsearch.js
index 18e51506c..f95515b93 100644
--- a/lib/scripts/qsearch.js
+++ b/lib/scripts/qsearch.js
@@ -57,7 +57,7 @@ jQuery.fn.dw_qsearch = function (overrides) {
);
};
- dw_qsearch.$inObj.keyup(
+ dw_qsearch.$inObj.on('keyup',
function () {
if (dw_qsearch.timer) {
window.clearTimeout(dw_qsearch.timer);
@@ -68,7 +68,7 @@ jQuery.fn.dw_qsearch = function (overrides) {
);
// attach eventhandler to output field
- dw_qsearch.$outObj.click(dw_qsearch.clear_results);
+ dw_qsearch.$outObj.on('click', dw_qsearch.clear_results);
},
/**
diff --git a/lib/scripts/script.js b/lib/scripts/script.js
index 97edef0b7..0e03dcf37 100644
--- a/lib/scripts/script.js
+++ b/lib/scripts/script.js
@@ -26,5 +26,5 @@ function closePopups(){
}
jQuery(function () {
- jQuery(document).click(closePopups);
+ jQuery(document).on('click', closePopups);
});
diff --git a/lib/scripts/search.js b/lib/scripts/search.js
index 363170825..111dca99a 100644
--- a/lib/scripts/search.js
+++ b/lib/scripts/search.js
@@ -1,12 +1,12 @@
jQuery(function () {
'use strict';
- const $searchForm = jQuery('.search-results-form');
+ var $searchForm = jQuery('.search-results-form');
if (!$searchForm.length) {
return;
}
- const $toggleAssistanceButton = jQuery('<button>')
+ var $toggleAssistanceButton = jQuery('<button>')
.addClass('toggleAssistant')
.attr('type', 'button')
.attr('aria-expanded', 'false')
@@ -30,7 +30,7 @@ jQuery(function () {
});
if (DokuCookie.getValue('sa') === 'on') {
- $toggleAssistanceButton.click();
+ $toggleAssistanceButton.trigger('click');
}
$searchForm.find('.advancedOptions .toggle div.current').on('click', function () {
diff --git a/lib/tpl/dokuwiki/css/_edit.css b/lib/tpl/dokuwiki/css/_edit.css
index 526d49b99..30926bed1 100644
--- a/lib/tpl/dokuwiki/css/_edit.css
+++ b/lib/tpl/dokuwiki/css/_edit.css
@@ -12,6 +12,7 @@
/*____________ toolbar ____________*/
.dokuwiki div.toolbar {
+ display: inline-block;
margin-bottom: .5em;
}
#draft__status {
diff --git a/lib/tpl/dokuwiki/css/_tabs.css b/lib/tpl/dokuwiki/css/_tabs.css
index c4576c5ab..507f49e96 100644
--- a/lib/tpl/dokuwiki/css/_tabs.css
+++ b/lib/tpl/dokuwiki/css/_tabs.css
@@ -18,7 +18,6 @@
bottom: 0;
left: 0;
border-bottom: 1px solid @ini_border;
- z-index: 1;
}
.dokuwiki .tabs > ul li,
diff --git a/lib/tpl/dokuwiki/css/basic.less b/lib/tpl/dokuwiki/css/basic.less
index ccec240a4..abb330a15 100644
--- a/lib/tpl/dokuwiki/css/basic.less
+++ b/lib/tpl/dokuwiki/css/basic.less
@@ -312,6 +312,10 @@ small {
font-size: .8em;
}
+wbr {
+ display: inline-block; /* for IE 11 */
+}
+
/*____________ forms ____________*/
/* for all of the form styles, style.ini colours are not used on purpose (except for fieldset border) */
diff --git a/lib/tpl/dokuwiki/css/design.less b/lib/tpl/dokuwiki/css/design.less
index 89f671b7c..86315d211 100644
--- a/lib/tpl/dokuwiki/css/design.less
+++ b/lib/tpl/dokuwiki/css/design.less
@@ -66,16 +66,16 @@
********************************************************************/
/* 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 {
+.mode_admin .action.admin a,
+.mode_login .action.login a,
+.mode_register .action.register a,
+.mode_profile .action.profile a,
+.mode_recent .action.recent a,
+.mode_index .action.index a,
+.mode_media .action.media a,
+.mode_revisions .action.revs a,
+.mode_backlink .action.backlink a,
+.mode_subscribe .action.subscribe a {
font-weight: bold;
}
diff --git a/lib/tpl/dokuwiki/css/pagetools.less b/lib/tpl/dokuwiki/css/pagetools.less
index 2aaf0b978..5473594d8 100644
--- a/lib/tpl/dokuwiki/css/pagetools.less
+++ b/lib/tpl/dokuwiki/css/pagetools.less
@@ -109,8 +109,8 @@
}
}
-// on hover show all items
-#dokuwiki__pagetools:hover {
+// on hover or focus show all items
+#dokuwiki__pagetools:hover, #dokuwiki__pagetools:focus-within {
div.tools ul {
background-color: @ini_background;
border-color: @ini_border;
diff --git a/lib/tpl/dokuwiki/images/pagetools-build.php b/lib/tpl/dokuwiki/images/pagetools-build.php
index eaceeb257..e19d750c7 100644
--- a/lib/tpl/dokuwiki/images/pagetools-build.php
+++ b/lib/tpl/dokuwiki/images/pagetools-build.php
@@ -1,4 +1,5 @@
<?php
+// phpcs:ignoreFile -- deprecated and will be removed
/**
* This script generates a sprite from the unprocessed pagetool icons by combining them
* and overlaying a color layer for the active state.
@@ -10,6 +11,7 @@
* The final sprite is optimized with optipng if available.
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @deprecated 2018-06-15 we no longer use PNG based icons
* @todo Maybe add some more error checking
*/
$GAMMA = 0.8;
diff --git a/lib/tpl/dokuwiki/lang/bg/lang.php b/lib/tpl/dokuwiki/lang/bg/lang.php
index 7717607c0..c08bd3da4 100644
--- a/lib/tpl/dokuwiki/lang/bg/lang.php
+++ b/lib/tpl/dokuwiki/lang/bg/lang.php
@@ -2,7 +2,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- *
+ *
* @author Kiril <neohidra@gmail.com>
*/
$lang['__background_site__'] = 'Цвят за фона, под съдъжанието';
diff --git a/lib/tpl/dokuwiki/lang/cs/lang.php b/lib/tpl/dokuwiki/lang/cs/lang.php
index 58af0d2e3..1bf69a5f8 100644
--- a/lib/tpl/dokuwiki/lang/cs/lang.php
+++ b/lib/tpl/dokuwiki/lang/cs/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Robert Surý <rsurycz@seznam.cz>
* @author Jaroslav Lichtblau <jlichtblau@seznam.cz>
*/
$lang['__background_site__'] = 'Barva hlavního pozadí (pod kontextovým boxem)';
@@ -13,3 +14,4 @@ $lang['__site_width__'] = 'Šířka plné stránky (jakákoliv jednotka d
$lang['__sidebar_width__'] = 'Šířka postranního panelu, pokud je použit (jakákoliv jednotka délky: %, px, em, ...)';
$lang['__tablet_width__'] = 'Přepnout stránku do módu pro tablet pro velikost obrazovky menší než';
$lang['__phone_width__'] = 'Přepnout stránku do módu pro telefon pro velikost obrazovky menší než';
+$lang['__theme_color__'] = 'Barva motivu webové aplikace';
diff --git a/lib/tpl/dokuwiki/lang/da/lang.php b/lib/tpl/dokuwiki/lang/da/lang.php
new file mode 100644
index 000000000..71e03a084
--- /dev/null
+++ b/lib/tpl/dokuwiki/lang/da/lang.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Jacob Palm <mail@jacobpalm.dk>
+ */
+$lang['__background_site__'] = 'Farve til den "bagerste" baggrund (bagved indholdets kasse)';
+$lang['__link__'] = 'Grundlæggende link-farve';
+$lang['__existing__'] = 'Link-farve til eksisterende sider';
+$lang['__missing__'] = 'Link-farve til ikke-eksisterende sider';
+$lang['__site_width__'] = 'Hele sidens bredde (kan angives i enhver enhed: %, px, em m.fl.)';
+$lang['__sidebar_width__'] = 'Sidepanelets bredde (kan angives i enhver enhed: %, px, em m.fl.)';
+$lang['__tablet_width__'] = 'Ved skærmstørrelser under denne bredde, skiftes til tablet-visning';
+$lang['__phone_width__'] = 'Ved skærmstørrelser under denne bredde, skiftes til mobilvisning';
+$lang['__theme_color__'] = 'Temafarve til web appen';
diff --git a/lib/tpl/dokuwiki/lang/da/style.txt b/lib/tpl/dokuwiki/lang/da/style.txt
new file mode 100644
index 000000000..9e15aa819
--- /dev/null
+++ b/lib/tpl/dokuwiki/lang/da/style.txt
@@ -0,0 +1 @@
+If you want to adjust the logo, simply use the Media Manager to upload a ''logo.png'' into the ''wiki'' or the root namespace and it will be automatically used. You can also upload a ''favicon.ico'' there. If you use a closed wiki it is recommended to make the ''wiki'' (or root) namespace world readable in the ACL settings or your logo is not shown to not logged in users. \ No newline at end of file
diff --git a/lib/tpl/dokuwiki/lang/de/lang.php b/lib/tpl/dokuwiki/lang/de/lang.php
index 1e3115f24..c08a9b753 100644
--- a/lib/tpl/dokuwiki/lang/de/lang.php
+++ b/lib/tpl/dokuwiki/lang/de/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Jürgen Fredriksson <jfriedrich@gmx.at>
* @author Anika Henke <anika@selfthinker.org>
*/
$lang['__background_site__'] = 'Farbe für den Seitenhintergrund (hinter dem Inhaltsbereich)';
@@ -13,3 +14,4 @@ $lang['__site_width__'] = 'Breite der ganzen Seite (kann eine beliebige L
$lang['__sidebar_width__'] = 'Breite der Seitenleiste, falls vorhanden (kann eine beliebige Längeneinheit sein: %, px, em, ...)';
$lang['__tablet_width__'] = 'Unter dieser Fensterbreite wechselt die Seite in den Tabletmodus';
$lang['__phone_width__'] = 'Unter dieser Fensterbreite wechselt die Seite in den Handymodus';
+$lang['__theme_color__'] = 'Farbschema der Webapplikation';
diff --git a/lib/tpl/dokuwiki/lang/el/lang.php b/lib/tpl/dokuwiki/lang/el/lang.php
new file mode 100644
index 000000000..5f2162f61
--- /dev/null
+++ b/lib/tpl/dokuwiki/lang/el/lang.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Katerina Katapodi <extragold1234@hotmail.com>
+ */
+$lang['__background_site__'] = 'Χρώμα φόντου (πίσω από το κουτί περιεχομένων)';
+$lang['__link__'] = 'Το χρώμα γενικής σύνδεσης';
+$lang['__existing__'] = 'Το χρώμα συνδέσμων για τις υπάρχουσες σελίδες';
+$lang['__missing__'] = 'Το χρώμα συνδέσμων για μη υπάρχουσες σελίδες';
+$lang['__site_width__'] = 'Το εύρος ιστοσελίδας (μπορεί να είναι μονάδα μήκους %, px, em..)';
+$lang['__sidebar_width__'] = 'Το πλάτος της μπάρας στο πλάι, αν υπάρχει (μπορεί να είναι μονάδα μήκους, %, px, em..)';
+$lang['__tablet_width__'] = 'Κάτω από τα μεγέθη της οθόνης αυτού του πλάτους, η ιστοσελίδα λειτουργεί με την δισκέτα.';
+$lang['__phone_width__'] = 'Κάτω από τα μεγέθη της οθόνης αυτού του πλάτους, η ιστοσελίδα λειτουργεί με τηλέφωνο';
+$lang['__theme_color__'] = 'Χρώμα θέματος ιστοσελίδας';
diff --git a/lib/tpl/dokuwiki/lang/el/style.txt b/lib/tpl/dokuwiki/lang/el/style.txt
new file mode 100644
index 000000000..433f82e85
--- /dev/null
+++ b/lib/tpl/dokuwiki/lang/el/style.txt
@@ -0,0 +1 @@
+Αν θέλετε να προσαρμόσετε το logo, χρησιμοποιείστε απλώς το MediaManager για να φορτώσετε ένα ''logo.png'' μέσα στο ''wiki'' η τον βασικό χώρο ονόματος και θα χρησιμοποιηθεί αυτόματα. Μπορείτε επίσης να φορτώσετε ένα ''favicon.ico'' εκεί. Αν χρησιμοποιήσετε ένα κλειστό wiki συστήνεται να διαμορφώσετε το ''wiki'' ως αναγνώσιμο στις ρυθμίσεις ACL, ειδάλλως το logo σας δεν θα φαίνεται στους χρήστες που δεν έχουν συνδεθεί \ No newline at end of file
diff --git a/lib/tpl/dokuwiki/lang/fa/lang.php b/lib/tpl/dokuwiki/lang/fa/lang.php
index e96276042..dc982a7b8 100644
--- a/lib/tpl/dokuwiki/lang/fa/lang.php
+++ b/lib/tpl/dokuwiki/lang/fa/lang.php
@@ -13,3 +13,4 @@ $lang['__site_width__'] = 'عرض کل سایت (از واحدهای طو
$lang['__sidebar_width__'] = 'عرض نوار کناری درصورت وجود (از واحدهای طول شامل % یا px یا em و ... می‌شود استفاده کرد)';
$lang['__tablet_width__'] = 'در پایین اندازه‌های صفحه با این عرض وقتی که در تبلت باز می‌شود';
$lang['__phone_width__'] = 'در پایین اندازه‌های صفحه با این عرض وقتی که در تلفن موبایل باز می‌شود';
+$lang['__theme_color__'] = 'رنگ قالب برای برنامهٔ وب';
diff --git a/lib/tpl/dokuwiki/lang/it/lang.php b/lib/tpl/dokuwiki/lang/it/lang.php
index cec5ff61c..9ce1eb9c1 100644
--- a/lib/tpl/dokuwiki/lang/it/lang.php
+++ b/lib/tpl/dokuwiki/lang/it/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Stefano <stefano.stefano@gmail.com>
* @author Torpedo <dgtorpedo@gmail.com>
*/
$lang['__background_site__'] = 'Colore per lo sfondo di livello più basso (dietro il riquadro del contenuto)';
@@ -13,3 +14,4 @@ $lang['__site_width__'] = 'Larghezza dell\'intero sito (può essere una q
$lang['__sidebar_width__'] = 'Larghezza della barra laterale, se presente (può essere una qualunque unità di lunghezza: %, px, em, ...)';
$lang['__tablet_width__'] = 'Per dimensioni dello schermo al di sotto di questa larghezza, il sito passa in modalità tablet';
$lang['__phone_width__'] = 'Per dimensioni dello schermo al di sotto di questa larghezza, il sito passa in modalità telefono';
+$lang['__theme_color__'] = 'il colore del tema dell\'app';
diff --git a/lib/tpl/dokuwiki/lang/ja/lang.php b/lib/tpl/dokuwiki/lang/ja/lang.php
index 353bf0776..d07364672 100644
--- a/lib/tpl/dokuwiki/lang/ja/lang.php
+++ b/lib/tpl/dokuwiki/lang/ja/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author HokkaidoPerson <dosankomali@yahoo.co.jp>
* @author Hideaki SAWADA <chuno@live.jp>
*/
$lang['__background_site__'] = 'サイト全体の背景色(content box の背後)';
@@ -13,3 +14,4 @@ $lang['__site_width__'] = 'サイトの全体幅(任意の長さの単
$lang['__sidebar_width__'] = 'サイドバーがある場合、サイドバーの幅(任意の長さの単位を使用可能: % px em 他)';
$lang['__tablet_width__'] = 'タブレットモードにサイトを切替える、画面幅';
$lang['__phone_width__'] = '携帯電話モードにサイトを切替える、画面幅';
+$lang['__theme_color__'] = 'ウェブアプリのテーマカラー';
diff --git a/lib/tpl/dokuwiki/lang/ko/lang.php b/lib/tpl/dokuwiki/lang/ko/lang.php
index fcc422c80..df6af9214 100644
--- a/lib/tpl/dokuwiki/lang/ko/lang.php
+++ b/lib/tpl/dokuwiki/lang/ko/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Traend <Traend@ruu.kr>
* @author Myeongjin <aranet100@gmail.com>
*/
$lang['__background_site__'] = '(내용 상자 뒤의) 매우 배경 색';
@@ -13,3 +14,4 @@ $lang['__site_width__'] = '전체 사이트의 너비 (아무 길이 단
$lang['__sidebar_width__'] = '사이드바가 있다면, 그것의 너비 (아무 길이 단위나 될 수 있음: %, px, em, ...)';
$lang['__tablet_width__'] = '사이트를 태블릿 모드로 전환할 화면 너비';
$lang['__phone_width__'] = '사이트를 폰 모드로 전환할 화면 너비';
+$lang['__theme_color__'] = '웹 앱의 테마 색상';
diff --git a/lib/tpl/dokuwiki/lang/oc/lang.php b/lib/tpl/dokuwiki/lang/oc/lang.php
new file mode 100644
index 000000000..e51cb40f2
--- /dev/null
+++ b/lib/tpl/dokuwiki/lang/oc/lang.php
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author En Mathis <heartattack@free.fr>
+ */
+$lang['__link__'] = 'La color generala dels ligams';
+$lang['__existing__'] = 'La color pels ligams cap a paginas qu\'existisson';
+$lang['__missing__'] = 'La color pels ligams cap a paginas qu\'existisson pas';
diff --git a/lib/tpl/dokuwiki/lang/pl/lang.php b/lib/tpl/dokuwiki/lang/pl/lang.php
index ffff09f58..082565096 100644
--- a/lib/tpl/dokuwiki/lang/pl/lang.php
+++ b/lib/tpl/dokuwiki/lang/pl/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Bartek S <sadupl@gmail.com>
* @author Wojciech Lichota <wojciech@lichota.pl>
*/
$lang['__background_site__'] = 'Kolor tła za polem zawartości';
@@ -13,3 +14,4 @@ $lang['__site_width__'] = 'Szerokość pełnej strony (możliwa dowolna j
$lang['__sidebar_width__'] = 'Szerokość paska bocznego, jeśli istnieje (możliwa dowolna jednostka długości: %, px, em, ...)';
$lang['__tablet_width__'] = 'Szerokość ekrany poniżej której, strona przełączy się w tryb tabletu';
$lang['__phone_width__'] = 'Szerokość ekrany poniżej której, strona przełączy się w tryb telefonu';
+$lang['__theme_color__'] = 'Kolor motywu aplikacji internetowej';
diff --git a/lib/tpl/dokuwiki/lang/pt-br/lang.php b/lib/tpl/dokuwiki/lang/pt-br/lang.php
index edf8ec9d0..3e9f410b0 100644
--- a/lib/tpl/dokuwiki/lang/pt-br/lang.php
+++ b/lib/tpl/dokuwiki/lang/pt-br/lang.php
@@ -13,3 +13,4 @@ $lang['__site_width__'] = 'Largura do site inteiro (pode ser qualquer uni
$lang['__sidebar_width__'] = 'Largura da barra lateral, caso exista (pode ser qualquer unidade: %, px, em, ...)';
$lang['__tablet_width__'] = 'Em larguras abaixo dessa medida, o site mudará para o modo tablet';
$lang['__phone_width__'] = 'Em larguras abaixo dessa medida, o site mudará para o modo telefone';
+$lang['__theme_color__'] = 'Tema de cor da aplicação web';
diff --git a/lib/tpl/dokuwiki/lang/pt/lang.php b/lib/tpl/dokuwiki/lang/pt/lang.php
new file mode 100644
index 000000000..45f35fbc7
--- /dev/null
+++ b/lib/tpl/dokuwiki/lang/pt/lang.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Paulo Ricardo Schopf <pschopf@gmail.com>
+ */
+$lang['__background_site__'] = 'A cor para o fundo (atrás da caixa de conteúdo)';
+$lang['__link__'] = 'A cor para links gerais';
+$lang['__existing__'] = 'A cor para links de páginas existentes';
+$lang['__missing__'] = 'A cor para links de páginas inexistentes';
+$lang['__site_width__'] = 'A largura do site completo (pode ser qualquer unidade de tamanho: %, px, em, ...)';
+$lang['__sidebar_width__'] = 'A largura da barra lateral, se houver (pode ser qualquer unidade de comprimento: %, px, em, ...)';
+$lang['__tablet_width__'] = 'Abaixo dessa largura, o site alterna para o modo tablet';
+$lang['__phone_width__'] = 'Abaixo desta largura, o site muda para o modo de telefone';
+$lang['__theme_color__'] = 'Cor do tema do aplicativo da web';
diff --git a/lib/tpl/dokuwiki/lang/pt/style.txt b/lib/tpl/dokuwiki/lang/pt/style.txt
new file mode 100644
index 000000000..5327ce10b
--- /dev/null
+++ b/lib/tpl/dokuwiki/lang/pt/style.txt
@@ -0,0 +1 @@
+Se você quiser ajustar o logotipo, basta usar o Gerenciador de Mídia para enviar um "logo.png" no "wiki"' ou no namespace raiz e ele será usado automaticamente. Você também pode fazer upload de um "favicon.ico". Se você usa um wiki fechado, é recomendado deixar o namespace "wiki" (ou raiz) legível nas configurações da ACL ou seu logotipo não será mostrado para usuários não logados. \ No newline at end of file
diff --git a/lib/tpl/dokuwiki/lang/sk/lang.php b/lib/tpl/dokuwiki/lang/sk/lang.php
index ad200d351..5b27ba213 100644
--- a/lib/tpl/dokuwiki/lang/sk/lang.php
+++ b/lib/tpl/dokuwiki/lang/sk/lang.php
@@ -3,9 +3,15 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Peter Mydliar <peto.mydliar@gmail.com>
* @author Martin Michalek <michalek.dev@gmail.com>
*/
$lang['__background_site__'] = 'Farba základného pozadia (za oknom s obsahom)';
$lang['__link__'] = 'Všeobecná farba odkazu';
$lang['__existing__'] = 'Farba odkazov na existujúce stránky';
$lang['__missing__'] = 'Farba odkazov na neexistujúce stránky';
+$lang['__site_width__'] = 'Šírka stránky (môže byť ľubovoľná jednotka dĺžky: %, px, em, ...}';
+$lang['__sidebar_width__'] = 'Šírka bočného panela (môže byť ľubovoľná jednotka dĺžky: %, px, em, ...}';
+$lang['__tablet_width__'] = 'Nižšia šírka stránky prepne zobrazenie do režimu tabletu';
+$lang['__phone_width__'] = 'Nižšia šírka stránky prepne zobrazenie do režimu telefónu';
+$lang['__theme_color__'] = 'Farba témy pre webovú aplikáciu';
diff --git a/lib/tpl/dokuwiki/lang/vi/lang.php b/lib/tpl/dokuwiki/lang/vi/lang.php
new file mode 100644
index 000000000..a3c61db24
--- /dev/null
+++ b/lib/tpl/dokuwiki/lang/vi/lang.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ *
+ * @author Thien Hau <thienhausoftware@gmail.com>
+ */
+$lang['__background_site__'] = 'Màu cho nền (phía sau hộp nội dung)';
+$lang['__link__'] = 'Màu liên kết chung';
+$lang['__existing__'] = 'Màu của liên kết đến các trang hiện có';
+$lang['__missing__'] = 'Màu cho các liên kết đến các trang không tồn tại';
+$lang['__site_width__'] = 'Độ rộng của trang web đầy đủ (có thể là bất kỳ đơn vị độ dài nào: %, px, em, ...)';
+$lang['__sidebar_width__'] = 'Chiều rộng của thanh bên, nếu có (có thể là bất kỳ đơn vị độ dài nào: %, px, em, ...)';
+$lang['__tablet_width__'] = 'Cỡ màn hình dưới chiều rộng này, trang web chuyển sang chế độ máy tính bảng';
+$lang['__phone_width__'] = 'Cỡ màn hình chiều rộng này, trang web chuyển sang chế độ điện thoại';
+$lang['__theme_color__'] = 'Màu chủ đề của ứng dụng web';
diff --git a/lib/tpl/dokuwiki/lang/vi/style.txt b/lib/tpl/dokuwiki/lang/vi/style.txt
new file mode 100644
index 000000000..9fd759089
--- /dev/null
+++ b/lib/tpl/dokuwiki/lang/vi/style.txt
@@ -0,0 +1,4 @@
+Nếu bạn muốn điều chỉnh logo, chỉ cần sử dụng Trình quản lý phương tiện để tải lên ''logo.png'' vào ''wiki'' hoặc không gian tên gốc và nó
+sẽ được tự động sử dụng. Bạn cũng có thể tải lên ''favicon.ico'' ở đó. Nếu bạn sử dụng một wiki đóng
+nên để thế giới không gian tên ''wiki'' (hoặc gốc) có thể đọc được trong cài đặt ACL hoặc
+logo của bạn không được hiển thị để không đăng nhập người dùng. \ No newline at end of file
diff --git a/lib/tpl/dokuwiki/lang/zh/lang.php b/lib/tpl/dokuwiki/lang/zh/lang.php
index a9a284f8e..a7b61b955 100644
--- a/lib/tpl/dokuwiki/lang/zh/lang.php
+++ b/lib/tpl/dokuwiki/lang/zh/lang.php
@@ -3,6 +3,7 @@
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*
+ * @author Phy <dokuwiki@phy25.com>
* @author lainme <lainme993@gmail.com>
*/
$lang['__background_site__'] = '特别背景的颜色 (内容框后面)';
@@ -13,3 +14,4 @@ $lang['__site_width__'] = '全站的宽度 (可以是任何长度单位
$lang['__sidebar_width__'] = '侧边栏的宽度 (如有,可以是任何长度单位:%,px,em,...)';
$lang['__tablet_width__'] = '当屏幕尺寸小于这个宽度,站点切换到平板模式';
$lang['__phone_width__'] = '当屏幕尺寸小于这个宽度,站点切换到手机模式';
+$lang['__theme_color__'] = 'webapp 主题颜色';
diff --git a/lib/tpl/dokuwiki/main.php b/lib/tpl/dokuwiki/main.php
index 2d2151f9c..67b6e61de 100644
--- a/lib/tpl/dokuwiki/main.php
+++ b/lib/tpl/dokuwiki/main.php
@@ -9,7 +9,6 @@
*/
if (!defined('DOKU_INC')) die(); /* must be run from within DokuWiki */
-header('X-UA-Compatible: IE=edge,chrome=1');
$hasSidebar = page_findnearest($conf['sidebar']);
$showSidebar = $hasSidebar && ($ACT=='show');
diff --git a/lib/tpl/dokuwiki/script.js b/lib/tpl/dokuwiki/script.js
index b4e6ced6d..88dae9023 100644
--- a/lib/tpl/dokuwiki/script.js
+++ b/lib/tpl/dokuwiki/script.js
@@ -71,9 +71,19 @@ jQuery(function(){
);
// increase sidebar length to match content (desktop mode only)
- var $sidebar = jQuery('.desktop #dokuwiki__aside');
- if($sidebar.length) {
+ var sidebar_height = jQuery('.desktop #dokuwiki__aside').height();
+ var pagetool_height = jQuery('.desktop #dokuwiki__pagetools ul:first').height();
+ // pagetools div has no height; ul has a height
+ var content_min = Math.max(sidebar_height || 0, pagetool_height || 0);
+
+ var content_height = jQuery('#dokuwiki__content div.page').height();
+ if(content_min && content_min > content_height) {
var $content = jQuery('#dokuwiki__content div.page');
- $content.css('min-height', $sidebar.height());
+ $content.css('min-height', content_min);
}
+
+ // blur when clicked
+ jQuery('#dokuwiki__pagetools div.tools>ul>li>a').on('click', function(){
+ this.blur();
+ });
});
diff --git a/lib/tpl/dokuwiki/tpl_footer.php b/lib/tpl/dokuwiki/tpl_footer.php
index 34e8b90f6..c7a04e155 100644
--- a/lib/tpl/dokuwiki/tpl_footer.php
+++ b/lib/tpl/dokuwiki/tpl_footer.php
@@ -25,7 +25,8 @@ if (!defined('DOKU_INC')) die();
<a href="//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="https://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>
+ src="<?php echo tpl_basedir(); ?>images/button-dw.png" width="80" height="15"
+ alt="Driven by DokuWiki" /></a>
</div>
</div></div><!-- /footer -->
diff --git a/lib/tpl/index.php b/lib/tpl/index.php
index d6f00343b..4d48d5127 100644
--- a/lib/tpl/index.php
+++ b/lib/tpl/index.php
@@ -8,6 +8,7 @@
* @author Andreas Gohr <andi@splitbrain.org>
* @author Anika Henke <anika@selfthinker.org>
*/
+// phpcs:disable PSR1.Files.SideEffects
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
if(!defined('NOSESSION')) define('NOSESSION',1);
require_once(DOKU_INC.'inc/init.php');
@@ -17,7 +18,7 @@ require_once(DOKU_INC.'inc/init.php');
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Template Replacements</title>
- <style type="text/css">
+ <style>
body {
background-color: #fff;
color: #000;
@@ -44,12 +45,10 @@ require_once(DOKU_INC.'inc/init.php');
<body>
<?php
// get merged style.ini
-define('SIMPLE_TEST', true); // hack to prevent css output and headers
-require_once(DOKU_INC.'lib/exe/css.php');
-$styleUtils = new \dokuwiki\StyleUtils();
-$ini = $styleUtils->cssStyleini($conf['template']);
+$styleUtils = new \dokuwiki\StyleUtils($conf['template']);
+$ini = $styleUtils->cssStyleini();
-if ($ini) {
+if (!empty($ini)) {
echo '<table>';
echo "<caption>".hsc($conf['template'])."'s style.ini</caption>";
foreach($ini['replacements'] as $key => $val){
diff --git a/vendor/.htaccess b/vendor/.htaccess
index 5f279f180..76253143a 100644
--- a/vendor/.htaccess
+++ b/vendor/.htaccess
@@ -1,7 +1,7 @@
-<IfModule mod_authz_host>
+<IfModule mod_authz_core.c>
Require all denied
</IfModule>
-<IfModule !mod_authz_host>
+<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
index 2c72175e7..fce8549f0 100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@ -279,7 +279,7 @@ class ClassLoader
*/
public function setApcuPrefix($apcuPrefix)
{
- $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
}
/**
@@ -377,11 +377,11 @@ class ClassLoader
$subPath = $class;
while (false !== $lastPos = strrpos($subPath, '\\')) {
$subPath = substr($subPath, 0, $lastPos);
- $search = $subPath.'\\';
+ $search = $subPath . '\\';
if (isset($this->prefixDirsPsr4[$search])) {
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
foreach ($this->prefixDirsPsr4[$search] as $dir) {
- $length = $this->prefixLengthsPsr4[$first][$search];
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+ if (file_exists($file = $dir . $pathEnd)) {
return $file;
}
}
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 55787b617..403be68f0 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -6,6 +6,7 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'fdc0e9724ddc47859c8bf0c1ea0a623a' => $vendorDir . '/openpsa/universalfeedcreator/lib/constants.php',
'5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php',
);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index 2daff3431..99e063b99 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -13,6 +13,9 @@ class ComposerAutoloaderInita19a915ee98347a0c787119619d2ff9b
}
}
+ /**
+ * @return \Composer\Autoload\ClassLoader
+ */
public static function getLoader()
{
if (null !== self::$loader) {
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 3f7b01e01..db89c9eb9 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -7,6 +7,7 @@ namespace Composer\Autoload;
class ComposerStaticInita19a915ee98347a0c787119619d2ff9b
{
public static $files = array (
+ 'fdc0e9724ddc47859c8bf0c1ea0a623a' => __DIR__ . '/..' . '/openpsa/universalfeedcreator/lib/constants.php',
'5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php',
);
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 23ae5c1e0..204f40be2 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1,158 +1,108 @@
[
{
- "name": "geshi/geshi",
- "version": "v1.0.9.0",
- "version_normalized": "1.0.9.0",
+ "name": "aziraphale/email-address-validator",
+ "version": "2.0.1",
+ "version_normalized": "2.0.1.0",
"source": {
"type": "git",
- "url": "https://github.com/GeSHi/geshi-1.0.git",
- "reference": "5a7b461338d322d941986a656d4d1651452e73dd"
+ "url": "https://github.com/aziraphale/email-address-validator.git",
+ "reference": "fa25bc22c1c0b6491657c91473fae3e40719a650"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GeSHi/geshi-1.0/zipball/5a7b461338d322d941986a656d4d1651452e73dd",
- "reference": "5a7b461338d322d941986a656d4d1651452e73dd",
+ "url": "https://api.github.com/repos/aziraphale/email-address-validator/zipball/fa25bc22c1c0b6491657c91473fae3e40719a650",
+ "reference": "fa25bc22c1c0b6491657c91473fae3e40719a650",
"shasum": ""
},
"require-dev": {
"phpunit/phpunit": "^5.7"
},
- "time": "2017-05-05T05:51:25+00:00",
+ "time": "2017-05-22T14:05:57+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
- "classmap": [
- "src/geshi/",
- "src/geshi.php"
- ]
+ "psr-0": {
+ "EmailAddressValidator": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "GPL-2.0+"
+ "MIT"
],
"authors": [
{
- "name": "Benny Baumann",
- "email": "BenBE@geshi.org",
- "homepage": "http://blog.benny-baumann.de/",
- "role": "Developer"
+ "name": "Dave Child",
+ "email": "dave@addedbytes.com"
+ },
+ {
+ "name": "Andrew Gillard",
+ "email": "andrew@lorddeath.net"
}
],
- "description": "Generic Syntax Highlighter",
- "homepage": "http://qbnz.com/highlighter/"
+ "description": "Fork of AddedBytes' PHP EmailAddressValidator script, now with Composer support!",
+ "homepage": "https://github.com/aziraphale/email-address-validator"
},
{
- "name": "openpsa/universalfeedcreator",
- "version": "v1.8.3",
- "version_normalized": "1.8.3.0",
+ "name": "geshi/geshi",
+ "version": "v1.0.9.1",
+ "version_normalized": "1.0.9.1",
"source": {
"type": "git",
- "url": "https://github.com/flack/UniversalFeedCreator.git",
- "reference": "6261e130446d8f787bbfd229a602fb11e6816a4e"
+ "url": "https://github.com/GeSHi/geshi-1.0.git",
+ "reference": "fd22ab78481bf90337862b590e6f7517863926b8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/flack/UniversalFeedCreator/zipball/6261e130446d8f787bbfd229a602fb11e6816a4e",
- "reference": "6261e130446d8f787bbfd229a602fb11e6816a4e",
+ "url": "https://api.github.com/repos/GeSHi/geshi-1.0/zipball/fd22ab78481bf90337862b590e6f7517863926b8",
+ "reference": "fd22ab78481bf90337862b590e6f7517863926b8",
"shasum": ""
},
- "require": {
- "php": ">=5.0"
- },
"require-dev": {
- "phpunit/phpunit": "*"
+ "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.2"
},
- "time": "2017-05-18T08:28:48+00:00",
+ "time": "2019-10-20T20:54:46+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"classmap": [
- "lib"
+ "src/geshi/",
+ "src/geshi.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL"
- ],
- "authors": [
- {
- "name": "Andreas Flack",
- "email": "flack@contentcontrol-berlin.de",
- "homepage": "http://www.contentcontrol-berlin.de/"
- }
- ],
- "description": "RSS and Atom feed generator by Kai Blankenhorn",
- "keywords": [
- "atom",
- "georss",
- "gpx",
- "opml",
- "pie",
- "rss"
- ]
- },
- {
- "name": "aziraphale/email-address-validator",
- "version": "2.0.1",
- "version_normalized": "2.0.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/aziraphale/email-address-validator.git",
- "reference": "fa25bc22c1c0b6491657c91473fae3e40719a650"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/aziraphale/email-address-validator/zipball/fa25bc22c1c0b6491657c91473fae3e40719a650",
- "reference": "fa25bc22c1c0b6491657c91473fae3e40719a650",
- "shasum": ""
- },
- "require-dev": {
- "phpunit/phpunit": "^5.7"
- },
- "time": "2017-05-22T14:05:57+00:00",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-0": {
- "EmailAddressValidator": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
+ "GPL-2.0+"
],
"authors": [
{
- "name": "Dave Child",
- "email": "dave@addedbytes.com"
- },
- {
- "name": "Andrew Gillard",
- "email": "andrew@lorddeath.net"
+ "name": "Benny Baumann",
+ "email": "BenBE@geshi.org",
+ "homepage": "http://blog.benny-baumann.de/",
+ "role": "Developer"
}
],
- "description": "Fork of AddedBytes' PHP EmailAddressValidator script, now with Composer support!",
- "homepage": "https://github.com/aziraphale/email-address-validator"
+ "description": "Generic Syntax Highlighter",
+ "homepage": "http://qbnz.com/highlighter/"
},
{
"name": "marcusschwarz/lesserphp",
- "version": "v0.5.1",
- "version_normalized": "0.5.1.0",
+ "version": "v0.5.4",
+ "version_normalized": "0.5.4.0",
"source": {
"type": "git",
"url": "https://github.com/MarcusSchwarz/lesserphp.git",
- "reference": "e9e3d53980c0e486b07c75e12f2bae5e10bdee44"
+ "reference": "3a0f5ae0d63cbb661b5f4afd2f96875e73b3ad7e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/MarcusSchwarz/lesserphp/zipball/e9e3d53980c0e486b07c75e12f2bae5e10bdee44",
- "reference": "e9e3d53980c0e486b07c75e12f2bae5e10bdee44",
+ "url": "https://api.github.com/repos/MarcusSchwarz/lesserphp/zipball/3a0f5ae0d63cbb661b5f4afd2f96875e73b3ad7e",
+ "reference": "3a0f5ae0d63cbb661b5f4afd2f96875e73b3ad7e",
"shasum": ""
},
"require-dev": {
"phpunit/phpunit": "~4.3"
},
- "time": "2016-09-30T11:13:18+00:00",
+ "time": "2020-01-19T19:18:49+00:00",
"bin": [
"plessc"
],
@@ -189,148 +139,89 @@
"homepage": "http://leafo.net/lessphp/"
},
{
- "name": "paragonie/random_compat",
- "version": "v2.0.12",
- "version_normalized": "2.0.12.0",
+ "name": "openpsa/universalfeedcreator",
+ "version": "v1.8.3.2",
+ "version_normalized": "1.8.3.2",
"source": {
"type": "git",
- "url": "https://github.com/paragonie/random_compat.git",
- "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb"
+ "url": "https://github.com/flack/UniversalFeedCreator.git",
+ "reference": "906745196469b13ceefa6523ef04851a78ad10f4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb",
- "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb",
+ "url": "https://api.github.com/repos/flack/UniversalFeedCreator/zipball/906745196469b13ceefa6523ef04851a78ad10f4",
+ "reference": "906745196469b13ceefa6523ef04851a78ad10f4",
"shasum": ""
},
"require": {
- "php": ">=5.2.0"
+ "php": ">=5.0"
},
"require-dev": {
- "phpunit/phpunit": "4.*|5.*"
- },
- "suggest": {
- "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ "phpunit/phpunit": "*"
},
- "time": "2018-04-04T21:24:14+00:00",
+ "time": "2019-09-01T17:49:46+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
+ "classmap": [
+ "lib"
+ ],
"files": [
- "lib/random.php"
+ "lib/constants.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "LGPL-2.1-or-later"
],
"authors": [
{
- "name": "Paragon Initiative Enterprises",
- "email": "security@paragonie.com",
- "homepage": "https://paragonie.com"
- }
- ],
- "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
- "keywords": [
- "csprng",
- "pseudorandom",
- "random"
- ]
- },
- {
- "name": "simplepie/simplepie",
- "version": "1.5.1",
- "version_normalized": "1.5.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/simplepie/simplepie.git",
- "reference": "db9fff27b6d49eed3d4047cd3211ec8dba2f5d6e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/simplepie/simplepie/zipball/db9fff27b6d49eed3d4047cd3211ec8dba2f5d6e",
- "reference": "db9fff27b6d49eed3d4047cd3211ec8dba2f5d6e",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "require-dev": {
- "phpunit/phpunit": "~4 || ~5"
- },
- "suggest": {
- "mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
- },
- "time": "2017-11-12T02:03:34+00:00",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-0": {
- "SimplePie": "library"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Ryan Parman",
- "homepage": "http://ryanparman.com/",
- "role": "Creator, alumnus developer"
- },
- {
- "name": "Geoffrey Sneddon",
- "homepage": "http://gsnedders.com/",
- "role": "Alumnus developer"
- },
- {
- "name": "Ryan McCue",
- "email": "me@ryanmccue.info",
- "homepage": "http://ryanmccue.info/",
- "role": "Developer"
+ "name": "Andreas Flack",
+ "email": "flack@contentcontrol-berlin.de",
+ "homepage": "http://www.contentcontrol-berlin.de/"
}
],
- "description": "A simple Atom/RSS parsing library for PHP",
- "homepage": "http://simplepie.org/",
+ "description": "RSS and Atom feed generator by Kai Blankenhorn",
"keywords": [
"atom",
- "feeds",
+ "georss",
+ "gpx",
+ "opml",
+ "pie",
"rss"
]
},
{
- "name": "splitbrain/php-cli",
- "version": "1.1.2",
- "version_normalized": "1.1.2.0",
+ "name": "paragonie/random_compat",
+ "version": "v2.0.18",
+ "version_normalized": "2.0.18.0",
"source": {
"type": "git",
- "url": "https://github.com/splitbrain/php-cli.git",
- "reference": "1d6f0bf9eccbfd79d1f4d185ef27573601185c23"
+ "url": "https://github.com/paragonie/random_compat.git",
+ "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/splitbrain/php-cli/zipball/1d6f0bf9eccbfd79d1f4d185ef27573601185c23",
- "reference": "1d6f0bf9eccbfd79d1f4d185ef27573601185c23",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
+ "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": ">=5.2.0"
},
"require-dev": {
- "phpunit/phpunit": "4.5.*"
+ "phpunit/phpunit": "4.*|5.*"
},
"suggest": {
- "psr/log": "Allows you to make the CLI available as PSR-3 logger"
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
},
- "time": "2018-02-02T08:46:12+00:00",
+ "time": "2019-01-03T20:59:08+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
- "psr-4": {
- "splitbrain\\phpcli\\": "src"
- }
+ "files": [
+ "lib/random.php"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -338,34 +229,32 @@
],
"authors": [
{
- "name": "Andreas Gohr",
- "email": "andi@splitbrain.org"
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com"
}
],
- "description": "Easy command line scripts for PHP with opt parsing and color output. No dependencies",
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
"keywords": [
- "argparse",
- "cli",
- "command line",
- "console",
- "getopt",
- "optparse",
- "terminal"
+ "csprng",
+ "polyfill",
+ "pseudorandom",
+ "random"
]
},
{
"name": "phpseclib/phpseclib",
- "version": "2.0.11",
- "version_normalized": "2.0.11.0",
+ "version": "2.0.27",
+ "version_normalized": "2.0.27.0",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
- "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b"
+ "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/7053f06f91b3de78e143d430e55a8f7889efc08b",
- "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc",
+ "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc",
"shasum": ""
},
"require": {
@@ -383,7 +272,7 @@
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
"ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
},
- "time": "2018-04-15T16:55:05+00:00",
+ "time": "2020-04-04T23:17:33+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -445,21 +334,104 @@
"twofish",
"x.509",
"x509"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/terrafrost",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/phpseclib",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+ "type": "tidelift"
+ }
+ ]
+ },
+ {
+ "name": "simplepie/simplepie",
+ "version": "1.5.5",
+ "version_normalized": "1.5.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplepie/simplepie.git",
+ "reference": "ae49e2201b6da9c808e5dac437aca356a11831b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplepie/simplepie/zipball/ae49e2201b6da9c808e5dac437aca356a11831b4",
+ "reference": "ae49e2201b6da9c808e5dac437aca356a11831b4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-pcre": "*",
+ "ext-xml": "*",
+ "ext-xmlreader": "*",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5.4.3 || ~6.5"
+ },
+ "suggest": {
+ "ext-curl": "",
+ "ext-iconv": "",
+ "ext-intl": "",
+ "ext-mbstring": "",
+ "mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
+ },
+ "time": "2020-05-01T12:23:14+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "SimplePie": "library"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ryan Parman",
+ "homepage": "http://ryanparman.com/",
+ "role": "Creator, alumnus developer"
+ },
+ {
+ "name": "Sam Sneddon",
+ "homepage": "https://gsnedders.com/",
+ "role": "Alumnus developer"
+ },
+ {
+ "name": "Ryan McCue",
+ "email": "me@ryanmccue.info",
+ "homepage": "http://ryanmccue.info/",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple Atom/RSS parsing library for PHP",
+ "homepage": "http://simplepie.org/",
+ "keywords": [
+ "atom",
+ "feeds",
+ "rss"
]
},
{
"name": "splitbrain/php-archive",
- "version": "1.0.10",
- "version_normalized": "1.0.10.0",
+ "version": "1.1.1",
+ "version_normalized": "1.1.1.0",
"source": {
"type": "git",
"url": "https://github.com/splitbrain/php-archive.git",
- "reference": "a46f3aaeb9f123fdb7db4e192b0600feebf7f773"
+ "reference": "10d89013572ba1f4d4ad7fcb74860242f4c3860b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/splitbrain/php-archive/zipball/a46f3aaeb9f123fdb7db4e192b0600feebf7f773",
- "reference": "a46f3aaeb9f123fdb7db4e192b0600feebf7f773",
+ "url": "https://api.github.com/repos/splitbrain/php-archive/zipball/10d89013572ba1f4d4ad7fcb74860242f4c3860b",
+ "reference": "10d89013572ba1f4d4ad7fcb74860242f4c3860b",
"shasum": ""
},
"require": {
@@ -475,7 +447,7 @@
"ext-iconv": "Used for proper filename encode handling",
"ext-mbstring": "Can be used alternatively for handling filename encoding"
},
- "time": "2018-05-01T08:03:56+00:00",
+ "time": "2018-09-09T12:13:53+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -502,5 +474,58 @@
"unzip",
"zip"
]
+ },
+ {
+ "name": "splitbrain/php-cli",
+ "version": "1.1.6",
+ "version_normalized": "1.1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/splitbrain/php-cli.git",
+ "reference": "b7be3726872547253dd0bd61098fa9f634c33555"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/splitbrain/php-cli/zipball/b7be3726872547253dd0bd61098fa9f634c33555",
+ "reference": "b7be3726872547253dd0bd61098fa9f634c33555",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.5.*"
+ },
+ "suggest": {
+ "psr/log": "Allows you to make the CLI available as PSR-3 logger"
+ },
+ "time": "2019-10-16T07:31:14+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "splitbrain\\phpcli\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Gohr",
+ "email": "andi@splitbrain.org"
+ }
+ ],
+ "description": "Easy command line scripts for PHP with opt parsing and color output. No dependencies",
+ "keywords": [
+ "argparse",
+ "cli",
+ "command line",
+ "console",
+ "getopt",
+ "optparse",
+ "terminal"
+ ]
}
]
diff --git a/vendor/geshi/geshi/.gitignore b/vendor/geshi/geshi/.gitignore
index 44e52f21a..75fda85d5 100644
--- a/vendor/geshi/geshi/.gitignore
+++ b/vendor/geshi/geshi/.gitignore
@@ -1,3 +1,5 @@
-dist
-build.properties
+/build.properties
+/composer.lock
+/dist/
+/vendor/
diff --git a/vendor/geshi/geshi/CHANGELOG b/vendor/geshi/geshi/CHANGELOG
index 514e1a895..93fa76cdf 100644
--- a/vendor/geshi/geshi/CHANGELOG
+++ b/vendor/geshi/geshi/CHANGELOG
@@ -12,6 +12,26 @@ modified by me for consistency/bug fixing.
Please send any bug reports to BenBE@omorphia.de, or use the bug report tracker
at sourceforge (http://sourceforge.net/tracker/?group_id=114997&atid=670231)
+Version 1.0.9.1
+ - Added language files
+ * OpenSSH config (Kevin Ernst)
+ * roff (Artur Iwicki)
+ * Wolfram (Mysterious Light)
+ - Some minor tweaks for RFC822 email support (BenBE)
+ - Introduce strip_language function (phy25)
+ - Recognize additional file extensions (RealityRipple)
+ - Code style update by avoiding create_function (cweiske)
+ - Backported CLI tool from GeSHi 1.1 branch (cweiske)
+ - Improvements to language files
+ * bash: Update list of keywords (apjanke)
+ * Haskell: Updated doc links and types from Prelude (Jeremy Singer)
+ * INI files: support single quotes (peterdd)
+ * Matlab: Add keywords and functions from recent Matlab releases (apjanke)
+ * MySQL: Some missing keywords (Abu3safeer)
+ * MySQL: Updated documentation links (splitbrain)
+ * R/S+: Fix broken linking of keywords (BenBE)
+ * SciLab: Fix broken linking of keywords (BenBE)
+ * SQL: Some missing keywords (peterdd)
Version 1.0.9.0
- Add public/protected method & property visibility.
THIS MAY BREAK YOUR CODE
diff --git a/vendor/geshi/geshi/README.md b/vendor/geshi/geshi/README.md
index 6f6756804..6c49bc17a 100644
--- a/vendor/geshi/geshi/README.md
+++ b/vendor/geshi/geshi/README.md
@@ -1,6 +1,6 @@
GeSHi - Generic Syntax Highlighter
==================================
-### Version 1.0.9.0
+### Version 1.0.9.1
Author: [Benny Baumann](http://blog.benny-baumann.de/), [Nigel McNie](http://nigel.mcnie.name/)
Email: <BenBE@geshi.org>, <nigel@geshi.org>
diff --git a/vendor/geshi/geshi/THANKS b/vendor/geshi/geshi/THANKS
index c52d7fd3b..1ed6e885d 100644
--- a/vendor/geshi/geshi/THANKS
+++ b/vendor/geshi/geshi/THANKS
@@ -187,6 +187,7 @@ PEOPE WHO MADE LANGUAGE FILES
- Octave Carnë Draug, Juan Pablo Carbajal
- OpenBSD Packet Filter David Berard
- OpenOffice.org BASIC Roberto Rossi
+- OpenSSH config Kevin Ernst
- Oracle 8 Guy Wicks
- Oracle 11i Simon Redhead
- Oxygene (Delphi Prism) Carlo Kok
@@ -227,6 +228,7 @@ PEOPE WHO MADE LANGUAGE FILES
- Reg SmokingRope
- Rexx Jon Wolfers
- Robots Christian Lescuyer
+- roff Artur Iwicki
- RPM Specification File Paul Grinberg
- Ruby Amit Gupta, Moises Deniz
- Rust Dave Hodder
@@ -272,6 +274,7 @@ PEOPE WHO MADE LANGUAGE FILES
- Whois \ RPSL format Benny Baumann
- Winbatch Craig Storey
- Windows Batch FraidZZ
+- Wolfram Mysterious Light
- X++ Simon Butcher
- XBasic José Gabriel Moya Yangüela
- Xojo Garry Pettet
diff --git a/vendor/geshi/geshi/build.xml b/vendor/geshi/geshi/build.xml
index d9bae0f33..198db1354 100644
--- a/vendor/geshi/geshi/build.xml
+++ b/vendor/geshi/geshi/build.xml
@@ -8,7 +8,7 @@
-->
<property file="build.properties" />
- <property name="version" value="1.0.9.0" />
+ <property name="version" value="1.0.9.1" />
<property name="stability" value="stable" />
<property name="zipfile" value="${phing.project.name}-${version}.zip" />
<property name="gzfile" value="${phing.project.name}-${version}.tar.gz" />
@@ -19,7 +19,7 @@
<property name="sffilepath" value="g/ge/geshi/" />
<property name="releasenotes" value="
-Version 1.0.9.0
+Version 1.0.9.1
" />
diff --git a/vendor/geshi/geshi/composer.json b/vendor/geshi/geshi/composer.json
index 95f844aed..1dd3f7eb5 100644
--- a/vendor/geshi/geshi/composer.json
+++ b/vendor/geshi/geshi/composer.json
@@ -20,6 +20,6 @@
"classmap": ["src/geshi/", "src/geshi.php"]
},
"require-dev": {
- "phpunit/phpunit": "^5.7"
+ "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.2"
}
}
diff --git a/vendor/geshi/geshi/src/geshi.php b/vendor/geshi/geshi/src/geshi.php
index c353299b3..cf5e16329 100644
--- a/vendor/geshi/geshi/src/geshi.php
+++ b/vendor/geshi/geshi/src/geshi.php
@@ -40,7 +40,7 @@
//
/** The version of this GeSHi file */
-define('GESHI_VERSION', '1.0.9.0');
+define('GESHI_VERSION', '1.0.9.1');
// Define the root directory for the GeSHi code tree
if (!defined('GESHI_ROOT')) {
@@ -628,6 +628,19 @@ class GeSHi {
}
/**
+ * Clean up the language name to prevent malicious code injection
+ *
+ * @param string $language The name of the language to strip
+ * @since 1.0.9.1
+ */
+ public function strip_language_name($language) {
+ $language = preg_replace('#[^a-zA-Z0-9\-_]#', '', $language);
+ $language = strtolower($language);
+
+ return $language;
+ }
+
+ /**
* Sets the language for this object
*
* @note since 1.0.8 this function won't reset language-settings by default anymore!
@@ -646,9 +659,7 @@ class GeSHi {
}
//Clean up the language name to prevent malicious code injection
- $language = preg_replace('#[^a-zA-Z0-9\-_]#', '', $language);
-
- $language = strtolower($language);
+ $language = $this->strip_language_name($language);
//Retreive the full filename
$file_name = $this->language_path . $language . '.php';
@@ -1472,7 +1483,7 @@ class GeSHi {
'haskell' => array('hs'),
'haxe' => array('hx'),
'html4strict' => array('html', 'htm'),
- 'ini' => array('ini', 'desktop'),
+ 'ini' => array('ini', 'desktop', 'vbp'),
'java' => array('java'),
'javascript' => array('js'),
'klonec' => array('kl1'),
@@ -1506,11 +1517,11 @@ class GeSHi {
'smarty' => array(),
'tcl' => array('tcl'),
'text' => array('txt'),
- 'vb' => array('bas'),
- 'vbnet' => array(),
+ 'vb' => array('bas', 'ctl', 'frm'),
+ 'vbnet' => array('vb', 'sln'),
'visualfoxpro' => array(),
'whitespace' => array('ws'),
- 'xml' => array('xml', 'svg', 'xrc'),
+ 'xml' => array('xml', 'svg', 'xrc', 'vbproj', 'csproj', 'userprefs', 'resx', 'stetic', 'settings', 'manifest', 'myapp'),
'z80' => array('z80', 'asm', 'inc')
);
}
@@ -1959,6 +1970,11 @@ class GeSHi {
* @since 1.0.8
*/
protected function build_parse_cache() {
+ // check whether language_data is available
+ if (empty($this->language_data)) {
+ return false;
+ }
+
// cache symbol regexp
//As this is a costy operation, we avoid doing it for multiple groups ...
//Instead we perform it for all symbols at once.
@@ -2140,7 +2156,7 @@ class GeSHi {
*
* @since 1.0.0
*/
- public function parse_code () {
+ public function parse_code() {
// Start the timer
$start_time = microtime();
@@ -2148,6 +2164,11 @@ class GeSHi {
$code = str_replace("\r\n", "\n", $this->source);
$code = str_replace("\r", "\n", $code);
+ // check whether language_data is available
+ if (empty($this->language_data)) {
+ $this->error = GESHI_ERROR_NO_SUCH_LANG;
+ }
+
// Firstly, if there is an error, we won't highlight
if ($this->error) {
//Escape the source for output
@@ -4024,7 +4045,7 @@ class GeSHi {
$parsed_code .= str_repeat('</span>', $close);
$close = 0;
}
- if ($i + 1 < $n) {
+ elseif ($i + 1 < $n) {
$parsed_code .= "\n";
}
unset($code[$i]);
@@ -4695,7 +4716,9 @@ class GeSHi {
// TODO: a|bb|c => [ac]|bb
static $callback_2;
if (!isset($callback_2)) {
- $callback_2 = create_function('$matches', 'return "[" . str_replace("|", "", $matches[1]) . "]";');
+ $callback_2 = function($matches) {
+ return "[" . str_replace("|", "", $matches[1]) . "]";
+ };
}
$list = preg_replace_callback('#\(\?\:((?:.\|)+.)\)#', $callback_2, $list);
}
diff --git a/vendor/geshi/geshi/src/geshi/4cs.php b/vendor/geshi/geshi/src/geshi/4cs.php
index cae453f66..228d523e5 100644
--- a/vendor/geshi/geshi/src/geshi/4cs.php
+++ b/vendor/geshi/geshi/src/geshi/4cs.php
@@ -4,7 +4,7 @@
* ------
* Author: Jason Curl (jason.curl@continental-corporation.com)
* Copyright: (c) 2009 Jason Curl
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/09/05
*
* 4CS language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/6502acme.php b/vendor/geshi/geshi/src/geshi/6502acme.php
index a11a108fc..5d40da987 100644
--- a/vendor/geshi/geshi/src/geshi/6502acme.php
+++ b/vendor/geshi/geshi/src/geshi/6502acme.php
@@ -4,7 +4,7 @@
* -------
* Author: Warren Willmey
* Copyright: (c) 2010 Warren Willmey.
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/05/26
*
* MOS 6502 (more specifically 6510) ACME Cross Assembler 0.93 by Marco Baye language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/6502kickass.php b/vendor/geshi/geshi/src/geshi/6502kickass.php
index 9da8f2407..1ddbc597e 100644
--- a/vendor/geshi/geshi/src/geshi/6502kickass.php
+++ b/vendor/geshi/geshi/src/geshi/6502kickass.php
@@ -4,7 +4,7 @@
* -------
* Author: Warren Willmey
* Copyright: (c) 2010 Warren Willmey.
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/06/07
*
* MOS 6502 (6510) Kick Assembler 3.13 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/6502tasm.php b/vendor/geshi/geshi/src/geshi/6502tasm.php
index 4ce348f42..539db014f 100644
--- a/vendor/geshi/geshi/src/geshi/6502tasm.php
+++ b/vendor/geshi/geshi/src/geshi/6502tasm.php
@@ -4,7 +4,7 @@
* -------
* Author: Warren Willmey
* Copyright: (c) 2010 Warren Willmey.
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/06/02
*
* MOS 6502 (6510) TASM/64TASS (64TASS being the super set of TASM) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/68000devpac.php b/vendor/geshi/geshi/src/geshi/68000devpac.php
index 96a9d0820..db5c85b25 100644
--- a/vendor/geshi/geshi/src/geshi/68000devpac.php
+++ b/vendor/geshi/geshi/src/geshi/68000devpac.php
@@ -4,7 +4,7 @@
* -------
* Author: Warren Willmey
* Copyright: (c) 2010 Warren Willmey.
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/06/09
*
* Motorola 68000 - HiSoft Devpac ST 2 Assembler language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/abap.php b/vendor/geshi/geshi/src/geshi/abap.php
index d9df3ea88..99536f022 100644
--- a/vendor/geshi/geshi/src/geshi/abap.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/04
*
* ABAP language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/actionscript.php b/vendor/geshi/geshi/src/geshi/actionscript.php
index bbafbdfc9..d350a18a7 100644
--- a/vendor/geshi/geshi/src/geshi/actionscript.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/20
*
* Actionscript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/actionscript3.php b/vendor/geshi/geshi/src/geshi/actionscript3.php
index 20dcf5d56..351b6b0b3 100644
--- a/vendor/geshi/geshi/src/geshi/actionscript3.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/11/26
*
* ActionScript3 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/ada.php b/vendor/geshi/geshi/src/geshi/ada.php
index bad8595be..0eb0b7c6d 100644
--- a/vendor/geshi/geshi/src/geshi/ada.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/29
*
* Ada language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/aimms.php b/vendor/geshi/geshi/src/geshi/aimms.php
index ea49b8e63..6c653917c 100644
--- a/vendor/geshi/geshi/src/geshi/aimms.php
+++ b/vendor/geshi/geshi/src/geshi/aimms.php
@@ -4,7 +4,7 @@
* --------
* Author: Guido Diepen (guido.diepen@aimms.com)
* Copyright: (c) 2011 Guido Diepen (http://www.aimms.com)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/05/05
*
* AIMMS language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/algol68.php b/vendor/geshi/geshi/src/geshi/algol68.php
index f1555c61a..956d35c1b 100644
--- a/vendor/geshi/geshi/src/geshi/algol68.php
+++ b/vendor/geshi/geshi/src/geshi/algol68.php
@@ -4,7 +4,7 @@
* --------
* Author: Neville Dempsey (NevilleD.sourceforge@sgr-a.net)
* Copyright: (c) 2010 Neville Dempsey (https://sourceforge.net/projects/algol68/files/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/04/24
*
* ALGOL 68 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/apache.php b/vendor/geshi/geshi/src/geshi/apache.php
index da1f5dd22..8db1b9a33 100644
--- a/vendor/geshi/geshi/src/geshi/apache.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/29/07
*
* Apache language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/applescript.php b/vendor/geshi/geshi/src/geshi/applescript.php
index e71eb327d..c46912fc1 100644
--- a/vendor/geshi/geshi/src/geshi/applescript.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/07/20
*
* AppleScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/apt_sources.php b/vendor/geshi/geshi/src/geshi/apt_sources.php
index 49c51b06e..6e9790927 100644
--- a/vendor/geshi/geshi/src/geshi/apt_sources.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/06/17
*
* Apt sources.list language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/arm.php b/vendor/geshi/geshi/src/geshi/arm.php
index 86b71e1b1..8ac526403 100644
--- a/vendor/geshi/geshi/src/geshi/arm.php
+++ b/vendor/geshi/geshi/src/geshi/arm.php
@@ -4,7 +4,7 @@
* -------
* Author: Marat Dukhan (mdukhan3.at.gatech.dot.edu)
* Copyright: (c) Marat Dukhan (mdukhan3.at.gatech.dot.edu)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/10/06
*
* ARM Assembler language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/asm.php b/vendor/geshi/geshi/src/geshi/asm.php
index 606f2f487..44a70ca05 100644
--- a/vendor/geshi/geshi/src/geshi/asm.php
+++ b/vendor/geshi/geshi/src/geshi/asm.php
@@ -8,7 +8,7 @@
* 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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/27
*
* x86 Assembler language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/asp.php b/vendor/geshi/geshi/src/geshi/asp.php
index 6ba8f98c2..db9daae95 100644
--- a/vendor/geshi/geshi/src/geshi/asp.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/13
*
* ASP language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/asymptote.php b/vendor/geshi/geshi/src/geshi/asymptote.php
index a75a6299e..a701ae957 100644
--- a/vendor/geshi/geshi/src/geshi/asymptote.php
+++ b/vendor/geshi/geshi/src/geshi/asymptote.php
@@ -4,7 +4,7 @@
* -------------
* Author: Manuel Yguel (manuel.yguel.robotics@gmail.com)
* Copyright: (c) 2012 Manuel Yguel (http://manuelyguel.eu)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/05/24
*
* asymptote language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/autoconf.php b/vendor/geshi/geshi/src/geshi/autoconf.php
index 9c1cf125b..f7090fed6 100644
--- a/vendor/geshi/geshi/src/geshi/autoconf.php
+++ b/vendor/geshi/geshi/src/geshi/autoconf.php
@@ -4,7 +4,7 @@
* -----
* Author: Mihai Vasilian (grayasm@gmail.com)
* Copyright: (c) 2010 Mihai Vasilian
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/01/25
*
* autoconf language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/autohotkey.php b/vendor/geshi/geshi/src/geshi/autohotkey.php
index 4a47d7302..03a03ab64 100644
--- a/vendor/geshi/geshi/src/geshi/autohotkey.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/06/11
*
* Autohotkey language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/autoit.php b/vendor/geshi/geshi/src/geshi/autoit.php
index 5742afef5..2286aaec9 100644
--- a/vendor/geshi/geshi/src/geshi/autoit.php
+++ b/vendor/geshi/geshi/src/geshi/autoit.php
@@ -4,7 +4,7 @@
* --------
* Author: big_daddy, guinness & Tlem
* Copyright: (c) 2006-2015
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/01/26
*
* AutoIt: v3.3.14.2
diff --git a/vendor/geshi/geshi/src/geshi/avisynth.php b/vendor/geshi/geshi/src/geshi/avisynth.php
index cbd8a1207..ea9fc9a78 100644
--- a/vendor/geshi/geshi/src/geshi/avisynth.php
+++ b/vendor/geshi/geshi/src/geshi/avisynth.php
@@ -4,7 +4,7 @@
* --------
* Author: Ryan Jones (sciguyryan@gmail.com)
* Copyright: (c) 2008 Ryan Jones
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/10/08
*
* AviSynth language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/awk.php b/vendor/geshi/geshi/src/geshi/awk.php
index e94e64f32..f116b81a9 100644
--- a/vendor/geshi/geshi/src/geshi/awk.php
+++ b/vendor/geshi/geshi/src/geshi/awk.php
@@ -4,7 +4,7 @@
* -------
* Author: George Pollard (porges@porg.es)
* Copyright: (c) 2009 George Pollard
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/01/28
*
* Awk language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/bascomavr.php b/vendor/geshi/geshi/src/geshi/bascomavr.php
index 96ec60908..90d8506bb 100644
--- a/vendor/geshi/geshi/src/geshi/bascomavr.php
+++ b/vendor/geshi/geshi/src/geshi/bascomavr.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: aquaticus.info
* Copyright: (c) 2008 aquaticus.info
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/01/09
*
* BASCOM AVR language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/bash.php b/vendor/geshi/geshi/src/geshi/bash.php
index d9752155d..939b23aaa 100644
--- a/vendor/geshi/geshi/src/geshi/bash.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/20
*
* BASH language file for GeSHi.
@@ -88,10 +88,12 @@ $language_data = array (
5 => "/`[^`]*`/"
),
'KEYWORDS' => array(
+ // Control flow keywords and super-important builtins
1 => array(
'case', 'do', 'done', 'elif', 'else', 'esac', 'fi', 'for', 'function',
- 'if', 'in', 'select', 'set', 'then', 'until', 'while', 'time'
+ 'if', 'in', 'select', 'set', 'then', 'time', 'until', 'while'
),
+ // Common Unix commands
2 => array(
'aclocal', 'aconnect', 'apachectl', 'apache2ctl', 'aplay', 'apm',
'apmsleep', 'apropos', 'apt-cache', 'apt-cdrom', 'apt-config',
@@ -265,7 +267,7 @@ $language_data = array (
'jar', 'java', 'javac', 'join',
- 'kbd_mode','kbdrate', 'kdialog', 'kfile', 'kill', 'killall',
+ 'kbd_mode','kbdrate', 'kdialog', 'kfile', 'killall',
'lame', 'last', 'lastb', 'ld', 'ld86', 'ldd', 'less', 'lex', 'link',
'ln', 'loadkeys', 'loadunimap', 'locate', 'lockfile', 'login',
@@ -286,7 +288,7 @@ $language_data = array (
'ps2pdf', 'ps2ps', 'psbook', 'psmerge', 'psnup', 'psresize',
'psselect', 'pstops',
- 'rbash', 'rcs', 'rcs2log', 'read', 'readlink', 'red', 'resizecons',
+ 'rbash', 'rcs', 'rcs2log', 'readlink', 'red', 'resizecons',
'rev', 'rm', 'rmdir', 'rsh', 'run-parts',
'sash', 'scp', 'screen', 'sed', 'seq', 'sendmail', 'setfont',
@@ -365,15 +367,16 @@ $language_data = array (
'zgrep', 'zip', 'zipgrep', 'zipinfo', 'zless', 'zmore', 'znew',
'zsh', 'zsoelim'
),
+ // Builtin commands
3 => array(
- 'alias', 'bg', 'bind', 'break', 'builtin', 'cd', 'command',
- 'compgen', 'complete', 'continue', 'declare', 'dirs', 'disown',
+ 'alias', 'bg', 'bind', 'break', 'builtin', 'caller', 'cd', 'command',
+ 'compgen', 'complete', 'compopt', 'continue', 'coproc', 'declare', 'dirs', 'disown',
'echo', 'enable', 'eval', 'exec', 'exit', 'export', 'fc',
- 'fg', 'getopts', 'hash', 'help', 'history', 'jobs', 'let',
- 'local', 'logout', 'popd', 'printf', 'pushd', 'pwd', 'readonly',
- 'return', 'shift', 'shopt', 'source', 'suspend', 'test', 'times',
- 'trap', 'type', 'typeset', 'ulimit', 'umask', 'unalias', 'unset',
- 'wait'
+ 'fg', 'getopts', 'hash', 'help', 'history', 'jobs', 'kill', 'let',
+ 'local', 'logout', 'mapfile', 'popd', 'printf', 'pushd', 'pwd', 'read',
+ 'readarray', 'readonly', 'return', 'shift', 'shopt', 'source',
+ 'suspend', 'test', 'times', 'trap', 'type', 'typeset', 'ulimit',
+ 'umask', 'unalias', 'unset', 'wait'
)
),
'SYMBOLS' => array(
diff --git a/vendor/geshi/geshi/src/geshi/basic4gl.php b/vendor/geshi/geshi/src/geshi/basic4gl.php
index 499428f8b..ab4b6ef38 100644
--- a/vendor/geshi/geshi/src/geshi/basic4gl.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/09/15
*
* Basic4GL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/batch.php b/vendor/geshi/geshi/src/geshi/batch.php
index 03a972e8d..4f048b627 100644
--- a/vendor/geshi/geshi/src/geshi/batch.php
+++ b/vendor/geshi/geshi/src/geshi/batch.php
@@ -4,7 +4,7 @@
* ------------
* Author: FraidZZ ( fraidzz [@] bk.ru )
* Copyright: (c) 2015 FraidZZ ( http://vk.com/fraidzz , http://www.cyberforum.ru/members/340557.html )
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2015/03/28
*
* Windows batch file language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/bf.php b/vendor/geshi/geshi/src/geshi/bf.php
index 06fddfec4..4206d2f6e 100644
--- a/vendor/geshi/geshi/src/geshi/bf.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/10/31
*
* Brainfuck language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/biblatex.php b/vendor/geshi/geshi/src/geshi/biblatex.php
index 8500cb61f..873c4ad72 100644
--- a/vendor/geshi/geshi/src/geshi/biblatex.php
+++ b/vendor/geshi/geshi/src/geshi/biblatex.php
@@ -5,7 +5,7 @@
* Author: Maïeul Rouquette from
* Quinn Taylor (quinntaylor@mac.com)
* Copyright: (c) 2009 Quinn Taylor (quinntaylor@mac.com), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/04/29
*
* BibLaTeX language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/bibtex.php b/vendor/geshi/geshi/src/geshi/bibtex.php
index 169011eeb..684f938ee 100644
--- a/vendor/geshi/geshi/src/geshi/bibtex.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/04/29
*
* BibTeX language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/blitzbasic.php b/vendor/geshi/geshi/src/geshi/blitzbasic.php
index 6311e8ad6..092aaa7df 100644
--- a/vendor/geshi/geshi/src/geshi/blitzbasic.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 16.10.2005
*
* BlitzBasic language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/bnf.php b/vendor/geshi/geshi/src/geshi/bnf.php
index fafd94fa7..1d7b0535c 100644
--- a/vendor/geshi/geshi/src/geshi/bnf.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/09/28
*
* BNF (Backus-Naur form) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/boo.php b/vendor/geshi/geshi/src/geshi/boo.php
index 19c8378f9..0a35d5d53 100644
--- a/vendor/geshi/geshi/src/geshi/boo.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/09/10
*
* Boo language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/c.php b/vendor/geshi/geshi/src/geshi/c.php
index 75e1c2717..1d217ea72 100644
--- a/vendor/geshi/geshi/src/geshi/c.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/04
*
* C language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/c_loadrunner.php b/vendor/geshi/geshi/src/geshi/c_loadrunner.php
index c1559bc72..2d5cc7308 100644
--- a/vendor/geshi/geshi/src/geshi/c_loadrunner.php
+++ b/vendor/geshi/geshi/src/geshi/c_loadrunner.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Stuart Moncrieff (stuart at myloadtest dot com)
* Copyright: (c) 2010 Stuart Moncrieff (http://www.myloadtest.com/loadrunner-syntax-highlighter/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010-07-25
*
* C (for LoadRunner) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/c_mac.php b/vendor/geshi/geshi/src/geshi/c_mac.php
index dc0318417..5a364d919 100644
--- a/vendor/geshi/geshi/src/geshi/c_mac.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/04
*
* C for Macs language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/c_winapi.php b/vendor/geshi/geshi/src/geshi/c_winapi.php
index 37db047a5..52ea4911b 100644
--- a/vendor/geshi/geshi/src/geshi/c_winapi.php
+++ b/vendor/geshi/geshi/src/geshi/c_winapi.php
@@ -7,7 +7,7 @@
* - Jack Lloyd (lloyd@randombit.net)
* - Michael Mol (mikemol@gmail.com)
* Copyright: (c) 2012 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/08/12
*
* C (WinAPI) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/caddcl.php b/vendor/geshi/geshi/src/geshi/caddcl.php
index 6a205f972..72d1cd9d7 100644
--- a/vendor/geshi/geshi/src/geshi/caddcl.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/30
*
* CAD DCL (Dialog Control Language) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/cadlisp.php b/vendor/geshi/geshi/src/geshi/cadlisp.php
index 97ac8edc7..1123af1d7 100644
--- a/vendor/geshi/geshi/src/geshi/cadlisp.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/30
*
* AutoCAD/IntelliCAD Lisp language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/ceylon.php b/vendor/geshi/geshi/src/geshi/ceylon.php
index 1c806d377..52b74c12f 100644
--- a/vendor/geshi/geshi/src/geshi/ceylon.php
+++ b/vendor/geshi/geshi/src/geshi/ceylon.php
@@ -4,7 +4,7 @@
* ----------
* Author: Lucas Werkmeister (mail@lucaswerkmeister.de)
* Copyright: (c) 2015 Lucas Werkmeister (http://lucaswerkmeister.de)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2015-01-08
*
* Ceylon language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/cfdg.php b/vendor/geshi/geshi/src/geshi/cfdg.php
index 7ad658df5..2cf72f4f7 100644
--- a/vendor/geshi/geshi/src/geshi/cfdg.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/03/11
*
* CFDG language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/cfm.php b/vendor/geshi/geshi/src/geshi/cfm.php
index 7f98c33bf..516c66606 100644
--- a/vendor/geshi/geshi/src/geshi/cfm.php
+++ b/vendor/geshi/geshi/src/geshi/cfm.php
@@ -4,7 +4,7 @@
* -------
* Author: Diego
* Copyright: (c) 2006 Diego
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/02/25
*
* ColdFusion language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/chaiscript.php b/vendor/geshi/geshi/src/geshi/chaiscript.php
index 13570c900..e8167820f 100644
--- a/vendor/geshi/geshi/src/geshi/chaiscript.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/07/03
*
* ChaiScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/chapel.php b/vendor/geshi/geshi/src/geshi/chapel.php
index d0436348c..4f31f886b 100644
--- a/vendor/geshi/geshi/src/geshi/chapel.php
+++ b/vendor/geshi/geshi/src/geshi/chapel.php
@@ -4,7 +4,7 @@
* -----
* Author: Richard Molitor (richard.molitor@student.kit.edu)
* Copyright: (c) 2013 Richard Molitor
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2013/06/22
*
* Chapel language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/cil.php b/vendor/geshi/geshi/src/geshi/cil.php
index 82a2052fd..152fcc2d9 100644
--- a/vendor/geshi/geshi/src/geshi/cil.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/10/24
*
* CIL (Common Intermediate Language) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/clojure.php b/vendor/geshi/geshi/src/geshi/clojure.php
index 0a5d1dd4c..55cbc42d5 100644
--- a/vendor/geshi/geshi/src/geshi/clojure.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/09/20
*
* Clojure language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/cmake.php b/vendor/geshi/geshi/src/geshi/cmake.php
index cebf147a2..13e67ffdd 100644
--- a/vendor/geshi/geshi/src/geshi/cmake.php
+++ b/vendor/geshi/geshi/src/geshi/cmake.php
@@ -4,7 +4,7 @@
* -------
* Author: Daniel Nelson (danieln@eng.utah.edu)
* Copyright: (c) 2009 Daniel Nelson
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/04/06
*
* CMake language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/cobol.php b/vendor/geshi/geshi/src/geshi/cobol.php
index 990551a55..ac466f22d 100644
--- a/vendor/geshi/geshi/src/geshi/cobol.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/07/02
*
* COBOL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/coffeescript.php b/vendor/geshi/geshi/src/geshi/coffeescript.php
index 9656668df..4b5feb28c 100644
--- a/vendor/geshi/geshi/src/geshi/coffeescript.php
+++ b/vendor/geshi/geshi/src/geshi/coffeescript.php
@@ -4,7 +4,7 @@
* ----------
* Author: Trevor Burnham (trevorburnham@gmail.com)
* Copyright: (c) 2010 Trevor Burnham (http://iterative.ly)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/06/08
*
* CoffeeScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/cpp-qt.php b/vendor/geshi/geshi/src/geshi/cpp-qt.php
index 40b7e5aa1..3d9e55df2 100644
--- a/vendor/geshi/geshi/src/geshi/cpp-qt.php
+++ b/vendor/geshi/geshi/src/geshi/cpp-qt.php
@@ -4,7 +4,7 @@
* -------
* Author: Iulian M
* Copyright: (c) 2006 Iulian M
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/09/27
*
* C++ (with Qt extensions) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/cpp-winapi.php b/vendor/geshi/geshi/src/geshi/cpp-winapi.php
index b8bc6ccde..662e4c4e6 100644
--- a/vendor/geshi/geshi/src/geshi/cpp-winapi.php
+++ b/vendor/geshi/geshi/src/geshi/cpp-winapi.php
@@ -8,7 +8,7 @@
* - Jack Lloyd (lloyd@randombit.net)
* - Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2004 Dennis Bayer, Nigel McNie, 2012 Benny Baumann (http://qbnz.com/highlighter)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/09/27
*
* C++ language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/cpp.php b/vendor/geshi/geshi/src/geshi/cpp.php
index 1439dfe09..348c7cf02 100644
--- a/vendor/geshi/geshi/src/geshi/cpp.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/09/27
*
* C++ language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/csharp.php b/vendor/geshi/geshi/src/geshi/csharp.php
index a5a0f1120..da72167c2 100644
--- a/vendor/geshi/geshi/src/geshi/csharp.php
+++ b/vendor/geshi/geshi/src/geshi/csharp.php
@@ -5,7 +5,7 @@
* 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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/04
*
* C# language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/css.php b/vendor/geshi/geshi/src/geshi/css.php
index 5d15fad4f..15450ed8b 100644
--- a/vendor/geshi/geshi/src/geshi/css.php
+++ b/vendor/geshi/geshi/src/geshi/css.php
@@ -4,7 +4,7 @@
* -------
* Author: Nigel McNie (nigel@geshi.org), Zéfling (zefling@ikilote.net)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/18
*
* CSS language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/cuesheet.php b/vendor/geshi/geshi/src/geshi/cuesheet.php
index 97d631c40..c9724f57d 100644
--- a/vendor/geshi/geshi/src/geshi/cuesheet.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/12/21
*
* Cuesheet language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/d.php b/vendor/geshi/geshi/src/geshi/d.php
index 5e3713a80..2f0e3525c 100644
--- a/vendor/geshi/geshi/src/geshi/d.php
+++ b/vendor/geshi/geshi/src/geshi/d.php
@@ -6,7 +6,7 @@
* Contributors:
* - Jimmy Cao
* Copyright: (c) 2005 Thomas Kuehne (http://thomas.kuehne.cn/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/04/22
*
* D language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/dart.php b/vendor/geshi/geshi/src/geshi/dart.php
index 83c00c918..4d1d824e1 100644
--- a/vendor/geshi/geshi/src/geshi/dart.php
+++ b/vendor/geshi/geshi/src/geshi/dart.php
@@ -4,7 +4,7 @@
* --------
* Author: Edward Hart (edward.dan.hart@gmail.com)
* Copyright: (c) 2013 Edward Hart
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2013/10/25
*
* Dart language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/dcl.php b/vendor/geshi/geshi/src/geshi/dcl.php
index a1489c739..660774489 100644
--- a/vendor/geshi/geshi/src/geshi/dcl.php
+++ b/vendor/geshi/geshi/src/geshi/dcl.php
@@ -4,7 +4,7 @@
* --------
* Author: Petr Hendl (petr@hendl.cz)
* Copyright: (c) 2011 Petr Hendl http://hendl.cz/geshi/
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/02/17
*
* DCL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/dcpu16.php b/vendor/geshi/geshi/src/geshi/dcpu16.php
index 8c61bff8c..b5dbb2f58 100644
--- a/vendor/geshi/geshi/src/geshi/dcpu16.php
+++ b/vendor/geshi/geshi/src/geshi/dcpu16.php
@@ -4,7 +4,7 @@
* -------
* Author: Benny Baumann (BenBE@omorphia.de)
* Copyright: (c) 2007-2014 Benny Baumann (http://geshi.org/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/04/12
*
* DCPU/16 Assembly language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/dcs.php b/vendor/geshi/geshi/src/geshi/dcs.php
index 58bf5a0fb..72b0c37a6 100644
--- a/vendor/geshi/geshi/src/geshi/dcs.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/01/20
*
* DCS language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/delphi.php b/vendor/geshi/geshi/src/geshi/delphi.php
index fadb4ad71..3533f6233 100644
--- a/vendor/geshi/geshi/src/geshi/delphi.php
+++ b/vendor/geshi/geshi/src/geshi/delphi.php
@@ -4,7 +4,7 @@
* ----------
* 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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/26
*
* Delphi (Object Pascal) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/diff.php b/vendor/geshi/geshi/src/geshi/diff.php
index ee01e0c1f..b630be2e6 100644
--- a/vendor/geshi/geshi/src/geshi/diff.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/12/29
*
* Diff-output language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/div.php b/vendor/geshi/geshi/src/geshi/div.php
index 6ae99f149..674072446 100644
--- a/vendor/geshi/geshi/src/geshi/div.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/06/19
*
* DIV language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/dos.php b/vendor/geshi/geshi/src/geshi/dos.php
index 744cb8276..1a4ebb7f4 100644
--- a/vendor/geshi/geshi/src/geshi/dos.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/07/05
*
* DOS language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/dot.php b/vendor/geshi/geshi/src/geshi/dot.php
index 77de029e1..a4e8267ff 100644
--- a/vendor/geshi/geshi/src/geshi/dot.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/05/30
*
* dot language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/e.php b/vendor/geshi/geshi/src/geshi/e.php
index 5f321e6fd..6a04779d0 100644
--- a/vendor/geshi/geshi/src/geshi/e.php
+++ b/vendor/geshi/geshi/src/geshi/e.php
@@ -4,7 +4,7 @@
* --------
* Author: Kevin Reid (kpreid@switchb.org)
* Copyright: (c) 2010 Kevin Reid (http://switchb.org/kpreid/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/04/16
*
* E language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/ecmascript.php b/vendor/geshi/geshi/src/geshi/ecmascript.php
index 8d4ab15a5..05069ff85 100644
--- a/vendor/geshi/geshi/src/geshi/ecmascript.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/01/08
*
* ECMAScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/eiffel.php b/vendor/geshi/geshi/src/geshi/eiffel.php
index 14a2cc033..50cdf6f8c 100644
--- a/vendor/geshi/geshi/src/geshi/eiffel.php
+++ b/vendor/geshi/geshi/src/geshi/eiffel.php
@@ -4,7 +4,7 @@
* ----------
* Author: Zoran Simic (zsimic@axarosenberg.com)
* Copyright: (c) 2005 Zoran Simic
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/06/30
*
* Eiffel language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/email.php b/vendor/geshi/geshi/src/geshi/email.php
index c77d0fac3..c9bdf26f9 100644
--- a/vendor/geshi/geshi/src/geshi/email.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/10/19
*
* Email (mbox \ eml \ RFC format) language file for GeSHi.
@@ -51,14 +51,55 @@ $language_data = array (
'HTTP', 'SMTP', 'ASMTP', 'ESMTP'
),
2 => array(
- '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',
- 'Reply-To', 'Resend-From','Resend-To','Return-Path','User-Agent'
+ 'Original-Recipient','Accept-Language','Alternate-Recipient',
+ 'Archived-At','Authentication-Results','Auto-Submitted',
+ 'Autoforwarded','Autosubmitted','Base','Comments',
+ 'Content-Alternative','Content-Base','Content-Description',
+ 'Content-Disposition','Content-Duration','Content-features',
+ 'Content-ID','Content-Identifier','Content-Language',
+ 'Content-Location','Content-MD5','Content-Return',
+ 'Content-Transfer-Encoding','Content-Type','Conversion',
+ 'Conversion-With-Loss','Deferred-Delivery','Delivery-Date',
+ 'Discarded-X400-IPMS-Extensions','Discarded-X400-MTS-Extensions',
+ 'Disclose-Recipients','Disposition-Notification-Options',
+ 'Disposition-Notification-To','DKIM-Signature',
+ 'DL-Expansion-History','Downgraded-Bcc','Downgraded-Cc',
+ 'Downgraded-Disposition-Notification-To',
+ 'Downgraded-Final-Recipient','Downgraded-From',
+ 'Downgraded-In-Reply-To','Downgraded-Mail-From',
+ 'Downgraded-Message-Id','Downgraded-Original-Recipient',
+ 'Downgraded-Rcpt-To','Downgraded-References',
+ 'Downgraded-Reply-To','Downgraded-Resent-Bcc',
+ 'Downgraded-Resent-Cc','Downgraded-Resent-From',
+ 'Downgraded-Resent-Reply-To','Downgraded-Resent-Sender',
+ 'Downgraded-Resent-To','Downgraded-Return-Path',
+ 'Downgraded-Sender','Downgraded-To','Encoding','Encrypted','Expires',
+ 'Expiry-Date','Generate-Delivery-Report','Importance','In-Reply-To',
+ 'Incomplete-Copy','Keywords','Language','Latest-Delivery-Time',
+ 'List-Archive','List-Help','List-ID','List-Owner','List-Post',
+ 'List-Subscribe','List-Unsubscribe','List-Unsubscribe-Post',
+ 'Message-Context','Message-ID','Message-Type','MIME-Version',
+ 'MMHS-Acp127-Message-Identifier','MMHS-Codress-Message-Indicator',
+ 'MMHS-Copy-Precedence','MMHS-Exempted-Address',
+ 'MMHS-Extended-Authorisation-Info','MMHS-Handling-Instructions',
+ 'MMHS-Message-Instructions','MMHS-Message-Type',
+ 'MMHS-Originator-PLAD','MMHS-Originator-Reference',
+ 'MMHS-Other-Recipients-Indicator-CC',
+ 'MMHS-Other-Recipients-Indicator-To','MMHS-Primary-Precedence',
+ 'MMHS-Subject-Indicator-Codes','MT-Priority','Obsoletes',
+ 'Organization','Original-Encoded-Information-Types','Original-From',
+ 'Original-Message-ID','Original-Subject','Originator-Return-Address',
+ 'PICS-Label','Prevent-NonDelivery-Report','Priority','Received',
+ 'Received-SPF','References','Reply-By','Reply-To',
+ 'Require-Recipient-Valid-Since','Resent-Bcc','Resent-Cc',
+ 'Resent-Date','Resent-From','Resent-Message-ID','Resent-Reply-To',
+ 'Resent-Sender','Resent-To','Return-Path','Sensitivity',
+ 'Solicitation','Supersedes','VBR-Info','X400-Content-Identifier',
+ 'X400-Content-Return','X400-Content-Type','X400-MTS-Identifier',
+ 'X400-Originator','X400-Received','X400-Recipients','X400-Trace'
),
3 => array(
- 'Date','From','Sender','Subject','To','CC'
+ 'Bcc','CC','Date','From','Sender','Subject','To'
),
4 => array(
'by', 'for', 'from', 'id', 'with'
@@ -102,6 +143,7 @@ $language_data = array (
),
'SCRIPT' => array(
0 => 'color: #000040;',
+ 1 => 'color: #002040;',
),
'REGEXPS' => array(
1 => 'color: #000000; font-weight: bold;',
@@ -190,10 +232,12 @@ $language_data = array (
),
'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
'SCRIPT_DELIMITERS' => array(
- 0 => "/(?P<start>^)[A-Za-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",
+ 1 => "/(?P<start>^)--[a-zA-Z0-9_=\-]+[a-zA-Z0-9_](?:--)?(?P<end>$)/m"
),
'HIGHLIGHT_STRICT_BLOCK' => array(
0 => true,
+ 1 => false
),
'TAB_WIDTH' => 4,
'PARSER_CONTROL' => array(
diff --git a/vendor/geshi/geshi/src/geshi/epc.php b/vendor/geshi/geshi/src/geshi/epc.php
index b3ea4ae21..7882d00ae 100644
--- a/vendor/geshi/geshi/src/geshi/epc.php
+++ b/vendor/geshi/geshi/src/geshi/epc.php
@@ -4,7 +4,7 @@
* --------
* Author: Thorsten Muehlfelder (muehlfelder@enertex.de)
* Copyright: (c) 2010 Enertex Bayern GmbH
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/08/26
*
* Enerscript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/erlang.php b/vendor/geshi/geshi/src/geshi/erlang.php
index a15383283..8053d8719 100644
--- a/vendor/geshi/geshi/src/geshi/erlang.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008-09-27
*
* Erlang language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/euphoria.php b/vendor/geshi/geshi/src/geshi/euphoria.php
index 5888d0f51..35c99ecb9 100644
--- a/vendor/geshi/geshi/src/geshi/euphoria.php
+++ b/vendor/geshi/geshi/src/geshi/euphoria.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Nicholas Koceja (nerketur@hotmail.com)
* Copyright: (c) 2010 Nicholas Koceja
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 11/24/2010
*
* Euphoria language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/ezt.php b/vendor/geshi/geshi/src/geshi/ezt.php
index 505241239..a02ebc41d 100644
--- a/vendor/geshi/geshi/src/geshi/ezt.php
+++ b/vendor/geshi/geshi/src/geshi/ezt.php
@@ -4,7 +4,7 @@
* -----------
* Author: Ramesh Vishveshwar (ramesh.vishveshwar@gmail.com)
* Copyright: (c) 2012 Ramesh Vishveshwar (http://thecodeisclear.in)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/09/01
*
* Easytrieve language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/f1.php b/vendor/geshi/geshi/src/geshi/f1.php
index 1203e1bed..c6f93cc8c 100644
--- a/vendor/geshi/geshi/src/geshi/f1.php
+++ b/vendor/geshi/geshi/src/geshi/f1.php
@@ -4,7 +4,7 @@
* -------
* Author: Juro Bystricky (juro@f1compiler.com)
* Copyright: K2 Software Corp.
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/07/06
*
* Formula One language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/falcon.php b/vendor/geshi/geshi/src/geshi/falcon.php
index ad5f3a69d..6160cba34 100644
--- a/vendor/geshi/geshi/src/geshi/falcon.php
+++ b/vendor/geshi/geshi/src/geshi/falcon.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: billykater (billykater+geshi@gmail.com)
* Copyright: (c) 2010 billykater (http://falconpl.org/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/06/07
*
* Falcon language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/fo.php b/vendor/geshi/geshi/src/geshi/fo.php
index 8628bb10b..c9dca6c2f 100644
--- a/vendor/geshi/geshi/src/geshi/fo.php
+++ b/vendor/geshi/geshi/src/geshi/fo.php
@@ -4,7 +4,7 @@
* --------
* Author: Tan-Vinh Nguyen (tvnguyen@web.de)
* Copyright: (c) 2009 Tan-Vinh Nguyen
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/03/23
*
* fo language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/fortran.php b/vendor/geshi/geshi/src/geshi/fortran.php
index e463cb9af..6e41e9d06 100644
--- a/vendor/geshi/geshi/src/geshi/fortran.php
+++ b/vendor/geshi/geshi/src/geshi/fortran.php
@@ -4,7 +4,7 @@
* -----------
* Author: Cedric Arrabie (cedric.arrabie@univ-pau.fr)
* Copyright: (C) 2006 Cetric Arrabie
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/04/22
*
* Fortran language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/freebasic.php b/vendor/geshi/geshi/src/geshi/freebasic.php
index cc6bd7b77..952d8f1f5 100644
--- a/vendor/geshi/geshi/src/geshi/freebasic.php
+++ b/vendor/geshi/geshi/src/geshi/freebasic.php
@@ -4,7 +4,7 @@
* -------------
* Author: Roberto Rossi
* Copyright: (c) 2005 Roberto Rossi (http://rsoftware.altervista.org)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/08/19
*
* FreeBasic (http://www.freebasic.net/) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/freeswitch.php b/vendor/geshi/geshi/src/geshi/freeswitch.php
index 14f2b93a7..a4729a4ca 100644
--- a/vendor/geshi/geshi/src/geshi/freeswitch.php
+++ b/vendor/geshi/geshi/src/geshi/freeswitch.php
@@ -4,7 +4,7 @@
* --------
* Author: James Rose (james.gs@stubbornroses.com)
* Copyright: (c) 2006 Christian Lescuyer http://xtian.goelette.info
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/11/18
*
* FreeSWITCH language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/fsharp.php b/vendor/geshi/geshi/src/geshi/fsharp.php
index 5fc987841..c88c4c217 100644
--- a/vendor/geshi/geshi/src/geshi/fsharp.php
+++ b/vendor/geshi/geshi/src/geshi/fsharp.php
@@ -4,7 +4,7 @@
* ----------
* Author: julien ortin (jo_spam-divers@yahoo.fr)
* Copyright: (c) 2009 julien ortin
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/09/20
*
* F# language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/gambas.php b/vendor/geshi/geshi/src/geshi/gambas.php
index 8510b86a9..9993a6cd4 100644
--- a/vendor/geshi/geshi/src/geshi/gambas.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/20
*
* GAMBAS language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/gdb.php b/vendor/geshi/geshi/src/geshi/gdb.php
index d05a9ca9d..250e2777b 100644
--- a/vendor/geshi/geshi/src/geshi/gdb.php
+++ b/vendor/geshi/geshi/src/geshi/gdb.php
@@ -4,7 +4,7 @@
* --------
* Author: Milian Wolff (mail@milianw.de)
* Copyright: (c) 2009 Milian Wolff
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/06/24
*
* GDB language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/genero.php b/vendor/geshi/geshi/src/geshi/genero.php
index 4d3cc3638..afdf9d9b6 100644
--- a/vendor/geshi/geshi/src/geshi/genero.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/07/01
*
* Genero (FOURJ's Genero 4GL) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/genie.php b/vendor/geshi/geshi/src/geshi/genie.php
index dabc38913..05b356581 100644
--- a/vendor/geshi/geshi/src/geshi/genie.php
+++ b/vendor/geshi/geshi/src/geshi/genie.php
@@ -4,7 +4,7 @@
* ----------
* Author: Nicolas Joseph (nicolas.joseph@valaide.org)
* Copyright: (c) 2009 Nicolas Joseph
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/04/29
*
* Genie language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/gettext.php b/vendor/geshi/geshi/src/geshi/gettext.php
index 871f5ae67..4161cb8fb 100644
--- a/vendor/geshi/geshi/src/geshi/gettext.php
+++ b/vendor/geshi/geshi/src/geshi/gettext.php
@@ -4,7 +4,7 @@
* --------
* Author: Milian Wolff (mail@milianw.de)
* Copyright: (c) 2008 Milian Wolff
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/05/25
*
* GNU Gettext .po/.pot language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/glsl.php b/vendor/geshi/geshi/src/geshi/glsl.php
index d67adb2b5..eab78e9a7 100644
--- a/vendor/geshi/geshi/src/geshi/glsl.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/03/20
*
* glSlang language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/gml.php b/vendor/geshi/geshi/src/geshi/gml.php
index 2cb0cd2e6..30b900ebf 100644
--- a/vendor/geshi/geshi/src/geshi/gml.php
+++ b/vendor/geshi/geshi/src/geshi/gml.php
@@ -4,7 +4,7 @@
* -------
* Author: José Jorge Enríquez <jenriquez@users.sourceforge.net>, Timon Knigge <timonknigge@live.nl>
* Copyright: (c) 2005 José Jorge Enríquez Rodríguez (http://www.zonamakers.com), (c) 2013 Timon Knigge (http://www.bluemoonproductions.nl)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/06/21
*
* GML language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/gnuplot.php b/vendor/geshi/geshi/src/geshi/gnuplot.php
index 55e1055d9..3af5f9350 100644
--- a/vendor/geshi/geshi/src/geshi/gnuplot.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/07/07
*
* Gnuplot script language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/go.php b/vendor/geshi/geshi/src/geshi/go.php
index 5c9212beb..83d3cabc8 100644
--- a/vendor/geshi/geshi/src/geshi/go.php
+++ b/vendor/geshi/geshi/src/geshi/go.php
@@ -4,7 +4,7 @@
* --------
* Author: Markus Jarderot (mizardx at gmail dot com)
* Copyright: (c) 2010 Markus Jarderot
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/05/20
*
* Go language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/groovy.php b/vendor/geshi/geshi/src/geshi/groovy.php
index 9f201bbdf..f8a228e28 100644
--- a/vendor/geshi/geshi/src/geshi/groovy.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/04/29
*
* Groovy language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/gwbasic.php b/vendor/geshi/geshi/src/geshi/gwbasic.php
index 9bf2c1592..0fd7a2991 100644
--- a/vendor/geshi/geshi/src/geshi/gwbasic.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/01/30
*
* GwBasic language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/haskell.php b/vendor/geshi/geshi/src/geshi/haskell.php
index 7b7c904a3..1a2244741 100644
--- a/vendor/geshi/geshi/src/geshi/haskell.php
+++ b/vendor/geshi/geshi/src/geshi/haskell.php
@@ -6,7 +6,7 @@
* Based on haskell.php by Jason Dagit (dagit@codersbase.com), which was
* based on ocaml.php by Flaie (fireflaie@gmail.com).
* Copyright: (c) 2005 Flaie, Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2014/05/12
*
* Haskell language file for GeSHi.
@@ -105,7 +105,7 @@ $language_data = array (
4 => array (
'Bool', 'Maybe', 'Either', 'Ordering',
'Char', 'String',
- 'Int', 'Integer', 'Float', 'Double', 'Rational',
+ 'Int', 'Integer', 'Float', 'Double', 'Rational', 'Word',
'ShowS', 'ReadS',
'IO', 'IOError', 'IOException'
),
@@ -114,7 +114,9 @@ $language_data = array (
'Ord', 'Eq', 'Enum', 'Bounded',
'Num', 'Real', 'Integral', 'Fractional',
'Floating', 'RealFrac', 'RealFloat',
- 'Monad', 'Functor',
+ 'Semigroup', 'Monoid',
+ 'Monad', 'Applicative', 'Functor',
+ 'Foldable', 'Traversable',
'Show', 'Read'
)
),
@@ -172,13 +174,13 @@ $language_data = array (
/* some of keywords are Prelude functions */
1 => '',
/* link to the wanted library */
- 2 => 'http://haskell.org/ghc/docs/latest/html/libraries/base/{FNAME}.html',
+ 2 => 'http://hackage.haskell.org/package/base/docs/{FNAME}.html',
/* link to Prelude functions */
- 3 => 'http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:{FNAME}',
+ 3 => 'http://hackage.haskell.org/package/base/docs/Prelude.html#v:{FNAME}',
/* link to Prelude types */
- 4 => 'http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:{FNAME}',
+ 4 => 'http://hackage.haskell.org/package/base/docs/Prelude.html#t:{FNAME}',
/* link to Prelude exceptions */
- 5 => 'http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:{FNAME}'
+ 5 => 'http://hackage.haskell.org/package/base/docs/Prelude.html#t:{FNAME}'
),
'OOLANG' => false,
'OBJECT_SPLITTERS' => array(
diff --git a/vendor/geshi/geshi/src/geshi/haxe.php b/vendor/geshi/geshi/src/geshi/haxe.php
index c9376bdff..f63674db0 100644
--- a/vendor/geshi/geshi/src/geshi/haxe.php
+++ b/vendor/geshi/geshi/src/geshi/haxe.php
@@ -6,7 +6,7 @@
* John Liao (colorhook@gmail.com)
* Copyright: (c) 2012 onthewings (http://www.onthewings.net/)
* 2010 colorhook (http://colorhook.com/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/10/05
*
* Haxe language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/hicest.php b/vendor/geshi/geshi/src/geshi/hicest.php
index b8639bbe2..f92f6d62f 100644
--- a/vendor/geshi/geshi/src/geshi/hicest.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/03/15
*
* HicEst language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/hq9plus.php b/vendor/geshi/geshi/src/geshi/hq9plus.php
index 843f2d671..29878ed03 100644
--- a/vendor/geshi/geshi/src/geshi/hq9plus.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/10/31
*
* HQ9+ language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/html4strict.php b/vendor/geshi/geshi/src/geshi/html4strict.php
index 42ff9c707..56c40a19f 100644
--- a/vendor/geshi/geshi/src/geshi/html4strict.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/10
*
* HTML 4.01 strict language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/html5.php b/vendor/geshi/geshi/src/geshi/html5.php
index 25d33cb44..f6316f778 100644
--- a/vendor/geshi/geshi/src/geshi/html5.php
+++ b/vendor/geshi/geshi/src/geshi/html5.php
@@ -4,7 +4,7 @@
* ---------------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/10
*
* HTML 5 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/icon.php b/vendor/geshi/geshi/src/geshi/icon.php
index 10226902b..feb3d840f 100644
--- a/vendor/geshi/geshi/src/geshi/icon.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/04/24
*
* Icon language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/idl.php b/vendor/geshi/geshi/src/geshi/idl.php
index f960f8b31..e7596cee2 100644
--- a/vendor/geshi/geshi/src/geshi/idl.php
+++ b/vendor/geshi/geshi/src/geshi/idl.php
@@ -4,7 +4,7 @@
* -------
* Author: Cedric Bosdonnat (cedricbosdo@openoffice.org)
* Copyright: (c) 2006 Cedric Bosdonnat
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/08/20
*
* Unoidl language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/ini.php b/vendor/geshi/geshi/src/geshi/ini.php
index fe0422498..bf25d4b6b 100644
--- a/vendor/geshi/geshi/src/geshi/ini.php
+++ b/vendor/geshi/geshi/src/geshi/ini.php
@@ -4,7 +4,7 @@
* --------
* Author: deguix (cevo_deguix@yahoo.com.br)
* Copyright: (c) 2005 deguix
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/03/27
*
* INI language file for GeSHi.
@@ -48,7 +48,7 @@ $language_data = array (
'COMMENT_MULTI' => array(),
'COMMENT_REGEXP' => array(0 => '/^\s*;.*?$/m'),
'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
- 'QUOTEMARKS' => array('"'),
+ 'QUOTEMARKS' => array('"', "'"),
'ESCAPE_CHAR' => '',
'KEYWORDS' => array(
),
diff --git a/vendor/geshi/geshi/src/geshi/inno.php b/vendor/geshi/geshi/src/geshi/inno.php
index 542719c50..32202af54 100644
--- a/vendor/geshi/geshi/src/geshi/inno.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/07/29
*
* Inno Script language inkl. Delphi (Object Pascal) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/intercal.php b/vendor/geshi/geshi/src/geshi/intercal.php
index 669050aae..5702d91ef 100644
--- a/vendor/geshi/geshi/src/geshi/intercal.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/10/31
*
* INTERCAL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/io.php b/vendor/geshi/geshi/src/geshi/io.php
index 5c8b93fda..ce1c0e948 100644
--- a/vendor/geshi/geshi/src/geshi/io.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/09/23
*
* Io language file for GeSHi. Thanks to Johnathan Wright for the suggestion and help
diff --git a/vendor/geshi/geshi/src/geshi/ispfpanel.php b/vendor/geshi/geshi/src/geshi/ispfpanel.php
index 8e60eed98..37e04b67e 100644
--- a/vendor/geshi/geshi/src/geshi/ispfpanel.php
+++ b/vendor/geshi/geshi/src/geshi/ispfpanel.php
@@ -4,7 +4,7 @@
* -------------
* Author: Ramesh Vishveshwar (ramesh.vishveshwar@gmail.com)
* Copyright: (c) 2012 Ramesh Vishveshwar (http://thecodeisclear.in)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/09/18
*
* ISPF Panel Definition (MVS) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/j.php b/vendor/geshi/geshi/src/geshi/j.php
index 499c489b7..c39e54f2d 100644
--- a/vendor/geshi/geshi/src/geshi/j.php
+++ b/vendor/geshi/geshi/src/geshi/j.php
@@ -4,7 +4,7 @@
* --------
* Author: Ric Sherlock (tikkanz@gmail.com)
* Copyright: (c) 2009 Ric Sherlock
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/11/10
*
* J language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/java.php b/vendor/geshi/geshi/src/geshi/java.php
index 59733b51c..71c2d713b 100644
--- a/vendor/geshi/geshi/src/geshi/java.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/10
*
* Java language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/java5.php b/vendor/geshi/geshi/src/geshi/java5.php
index f9dbf3106..fbd0e30a5 100644
--- a/vendor/geshi/geshi/src/geshi/java5.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/10
*
* Java language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/javascript.php b/vendor/geshi/geshi/src/geshi/javascript.php
index bc13dc4e8..70fca9c79 100644
--- a/vendor/geshi/geshi/src/geshi/javascript.php
+++ b/vendor/geshi/geshi/src/geshi/javascript.php
@@ -4,7 +4,7 @@
* --------------
* 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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/20
*
* JavaScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/jcl.php b/vendor/geshi/geshi/src/geshi/jcl.php
index 07e3b5084..9bc0c6c9c 100644
--- a/vendor/geshi/geshi/src/geshi/jcl.php
+++ b/vendor/geshi/geshi/src/geshi/jcl.php
@@ -4,7 +4,7 @@
* -----------
* Author: Ramesh Vishveshwar (ramesh.vishveshwar@gmail.com)
* Copyright: (c) 2012 Ramesh Vishveshwar (http://thecodeisclear.in)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/09/16
*
* JCL (MVS), DFSORT, IDCAMS language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/jquery.php b/vendor/geshi/geshi/src/geshi/jquery.php
index 0ffd83fb8..f8b9c118b 100644
--- a/vendor/geshi/geshi/src/geshi/jquery.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/07/20
*
* jQuery 1.3 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/julia.php b/vendor/geshi/geshi/src/geshi/julia.php
index 93459c561..70848e62b 100644
--- a/vendor/geshi/geshi/src/geshi/julia.php
+++ b/vendor/geshi/geshi/src/geshi/julia.php
@@ -7,7 +7,7 @@
* - Magnus Lie Hetland
* - Curtis Vogt
* Copyright: (c) 2013 John Lynch
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2013/11/06
*
* Julia language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/kixtart.php b/vendor/geshi/geshi/src/geshi/kixtart.php
index 7f66e74f4..0d67f64c5 100644
--- a/vendor/geshi/geshi/src/geshi/kixtart.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/08/31
*
* PHP language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/klonec.php b/vendor/geshi/geshi/src/geshi/klonec.php
index 58f2d7b43..faecffe71 100644
--- a/vendor/geshi/geshi/src/geshi/klonec.php
+++ b/vendor/geshi/geshi/src/geshi/klonec.php
@@ -4,7 +4,7 @@
* --------
* Author: AUGER Mickael
* Copyright: Synchronic
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/04/16
*
* KLone with C language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/klonecpp.php b/vendor/geshi/geshi/src/geshi/klonecpp.php
index 4b71cba3d..7f5949d9f 100644
--- a/vendor/geshi/geshi/src/geshi/klonecpp.php
+++ b/vendor/geshi/geshi/src/geshi/klonecpp.php
@@ -4,7 +4,7 @@
* --------
* Author: AUGER Mickael
* Copyright: Synchronic
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/04/16
*
* KLone with C++ language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/kotlin.php b/vendor/geshi/geshi/src/geshi/kotlin.php
index cb20ad8ac..d83e76cf9 100644
--- a/vendor/geshi/geshi/src/geshi/kotlin.php
+++ b/vendor/geshi/geshi/src/geshi/kotlin.php
@@ -4,7 +4,7 @@
* --------
* Author: Ole Sandum (oksandum@gmail.com)
* Copyright: (c) 2017 Ole Sandum
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/10
*
* Kotlin language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/latex.php b/vendor/geshi/geshi/src/geshi/latex.php
index d03dde924..79f1f9dec 100644
--- a/vendor/geshi/geshi/src/geshi/latex.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/09/23
*
* LaTeX language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/lb.php b/vendor/geshi/geshi/src/geshi/lb.php
index 6882ea86d..b1193c0ae 100644
--- a/vendor/geshi/geshi/src/geshi/lb.php
+++ b/vendor/geshi/geshi/src/geshi/lb.php
@@ -4,7 +4,7 @@
* --------
* Author: Chris Iverson (cj.no.one@gmail.com)
* Copyright: (c) 2010 Chris Iverson
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/07/18
*
* Liberty BASIC language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/ldif.php b/vendor/geshi/geshi/src/geshi/ldif.php
index 86be996c7..b77b8ee2e 100644
--- a/vendor/geshi/geshi/src/geshi/ldif.php
+++ b/vendor/geshi/geshi/src/geshi/ldif.php
@@ -4,7 +4,7 @@
* --------
* Author: Bruno Harbulot (Bruno.Harbulot@manchester.ac.uk)
* Copyright: (c) 2005 deguix, (c) 2010 Bruno Harbulot
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/03/01
*
* LDIF language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/lisp.php b/vendor/geshi/geshi/src/geshi/lisp.php
index 9b3dbf832..5029ca225 100644
--- a/vendor/geshi/geshi/src/geshi/lisp.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/30
*
* Generic Lisp language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/llvm.php b/vendor/geshi/geshi/src/geshi/llvm.php
index ca375bb1f..0c19c7d92 100644
--- a/vendor/geshi/geshi/src/geshi/llvm.php
+++ b/vendor/geshi/geshi/src/geshi/llvm.php
@@ -4,7 +4,7 @@
* --------
* 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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/10/14
*
* LLVM language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/locobasic.php b/vendor/geshi/geshi/src/geshi/locobasic.php
index 596cb1207..709de5d0e 100644
--- a/vendor/geshi/geshi/src/geshi/locobasic.php
+++ b/vendor/geshi/geshi/src/geshi/locobasic.php
@@ -4,7 +4,7 @@
* -------------
* Author: Nacho Cabanes
* Copyright: (c) 2009 Nacho Cabanes (http://www.nachocabanes.com)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/03/22
*
* Locomotive Basic (Amstrad CPC series) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/logtalk.php b/vendor/geshi/geshi/src/geshi/logtalk.php
index a3ed129a3..a4af76cc5 100644
--- a/vendor/geshi/geshi/src/geshi/logtalk.php
+++ b/vendor/geshi/geshi/src/geshi/logtalk.php
@@ -5,7 +5,7 @@
*
* Author: Paulo Moura (pmoura@logtalk.org)
* Copyright: (c) 2009-2011 Paulo Moura (http://logtalk.org/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/10/24
*
* Logtalk language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/lolcode.php b/vendor/geshi/geshi/src/geshi/lolcode.php
index 39cae2014..f473c0dcf 100644
--- a/vendor/geshi/geshi/src/geshi/lolcode.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/10/31
*
* LOLcode language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/lotusformulas.php b/vendor/geshi/geshi/src/geshi/lotusformulas.php
index 4f1c67819..57d34f3d5 100644
--- a/vendor/geshi/geshi/src/geshi/lotusformulas.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/04/12
*
* @Formula/@Command language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/lotusscript.php b/vendor/geshi/geshi/src/geshi/lotusscript.php
index 069e603a6..8e41f3675 100644
--- a/vendor/geshi/geshi/src/geshi/lotusscript.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/04/12
*
* LotusScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/lscript.php b/vendor/geshi/geshi/src/geshi/lscript.php
index 432d54aab..a73e786b7 100644
--- a/vendor/geshi/geshi/src/geshi/lscript.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 15/11/2008
*
* Lightwave Script language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/lsl2.php b/vendor/geshi/geshi/src/geshi/lsl2.php
index 608b5e124..94f475457 100644
--- a/vendor/geshi/geshi/src/geshi/lsl2.php
+++ b/vendor/geshi/geshi/src/geshi/lsl2.php
@@ -4,7 +4,7 @@
* --------
* Author: William Fry (william.fry@nyu.edu)
* Copyright: (c) 2009 William Fry
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/02/04
*
* Linden Scripting Language (LSL2) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/lua.php b/vendor/geshi/geshi/src/geshi/lua.php
index 313bbb535..2b8ebc409 100644
--- a/vendor/geshi/geshi/src/geshi/lua.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/10
*
* LUA language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/m68k.php b/vendor/geshi/geshi/src/geshi/m68k.php
index e2040a648..2d995c56f 100644
--- a/vendor/geshi/geshi/src/geshi/m68k.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/02/06
*
* Motorola 68000 Assembler language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/magiksf.php b/vendor/geshi/geshi/src/geshi/magiksf.php
index 154cd26d3..44f069d8f 100644
--- a/vendor/geshi/geshi/src/geshi/magiksf.php
+++ b/vendor/geshi/geshi/src/geshi/magiksf.php
@@ -4,7 +4,7 @@
* --------
* Author: Sjoerd van Leent (svanleent@gmail.com)
* Copyright: (c) 2010 Sjoerd van Leent
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/02/15
*
* MagikSF language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/make.php b/vendor/geshi/geshi/src/geshi/make.php
index fa3193e7e..6ea601f21 100644
--- a/vendor/geshi/geshi/src/geshi/make.php
+++ b/vendor/geshi/geshi/src/geshi/make.php
@@ -4,7 +4,7 @@
* --------
* Author: Neil Bird <phoenix@fnxweb.com>
* Copyright: (c) 2008 Neil Bird
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/08/26
*
* make language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/mapbasic.php b/vendor/geshi/geshi/src/geshi/mapbasic.php
index d85e5741b..383bb51d2 100644
--- a/vendor/geshi/geshi/src/geshi/mapbasic.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/11/25
*
* MapBasic language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/mathematica.php b/vendor/geshi/geshi/src/geshi/mathematica.php
index 77d8653a0..238ccdef9 100644
--- a/vendor/geshi/geshi/src/geshi/mathematica.php
+++ b/vendor/geshi/geshi/src/geshi/mathematica.php
@@ -4,7 +4,7 @@
* --------
* Author: Connor Glosser (glosser1@gmail.com)
* Copyright: (c) 2014 Connor Glosser (http://www.msu.edu/~glosser1)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2014/08/11
*
* Mathematica language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/matlab.php b/vendor/geshi/geshi/src/geshi/matlab.php
index f6e8ee5f2..84c0209c6 100644
--- a/vendor/geshi/geshi/src/geshi/matlab.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/02/09
*
* Matlab M-file language file for GeSHi.
@@ -53,7 +53,7 @@ $language_data = array (
'ESCAPE_CHAR' => '',
'KEYWORDS' => array(
1 => array(
- 'break', 'case', 'catch', 'continue', 'elseif', 'else', 'end', 'for',
+ 'break', 'case', 'catch', 'classdef', 'continue', 'elseif', 'else', 'end', 'for',
'function', 'global', 'if', 'otherwise', 'persistent', 'return',
'switch', 'try', 'while'
),
@@ -61,12 +61,12 @@ $language_data = array (
'all','any','exist','is','logical','mislocked',
'abs','acos','acosh','acot','acoth','acsc','acsch','airy','angle',
- 'ans','area','asec','asech','asin','asinh','atan','atan2','atanh',
+ 'ans','area','arrayfun','asec','asech','asin','asinh','atan','atan2','atanh',
'auread','autumn','auwrite','axes','axis','balance','bar','bar3',
'bar3h','barh','besselh','besseli','besselj','besselk','Bessely',
'beta','betainc','betaln','bicg','bicgstab','bin2dec','bitand',
'bitcmp','bitget','bitmax','bitor','bitset','bitshift','bitxor',
- 'blkdiag','bone','box','brighten','builtin','bwcontr','calendar',
+ 'blkdiag','bone','bounds','box','brighten','builtin','bwcontr','calendar',
'camdolly','camlight','camlookat','camorbit','campan','campos',
'camproj','camroll','camtarget','camup','camva','camzoom','capture',
'cart2pol','cart2sph','cat','caxis','cdf2rdf','ceil','cell',
@@ -78,12 +78,12 @@ $language_data = array (
'contour','contourc','contourf','contourslice','contrast','conv',
'conv2','convhull','cool','copper','copyobj','corrcoef','cos',
'cosh','cot','coth','cov','cplxpair','cputime','cross','csc','csch',
- 'cumprod','cumsum','cumtrapz','cylinder','daspect','date','datenum',
- 'datestr','datetick','datevec','dbclear','dbcont','dbdown',
+ 'cumprod','cumsum','cumtrapz','cylinder','daspect','dataset','datastore','date','datenum',
+ 'datestr','datetick','datetime','datevec','dbclear','dbcont','dbdown',
'dblquad','dbmex','dbquit','dbstack','dbstatus','dbstep','dbstop',
'dbtype','dbup','deblank','dec2bin','dec2hex','deconv','del2',
- 'delaunay','det','diag','dialog','diff','diffuse','dlmread',
- 'dlmwrite','dmperm','double','dragrect','drawnow','dsearch','eig',
+ 'delaunay','det','diag','dialog','diff','diffuse','discretize','dlmread',
+ 'dlmwrite','dmperm','double','dragrect','drawnow','dsearch','duration','eig',
'eigs','ellipj','ellipke','eomday','eps','erf','erfc','erfcx',
'erfiny','error','errorbar','errordlg','etime','eval','evalc',
'evalin','exp','expint','expm','eye','ezcontour','ezcontourf',
@@ -96,19 +96,20 @@ $language_data = array (
'fseek','ftell','full','funm','fwrite','fzero','gallery','gamma',
'gammainc','gammaln','gca','gcbo','gcd','gcf','gco','get',
'getfield','ginput','gmres','gradient','gray','graymon','grid',
- 'griddata','gsvd','gtext','hadamard','hankel','hdf','helpdlg',
+ 'griddata','gsvd','gtext','hadamard','hankel','hdf','head','helpdlg',
'hess','hex2dec','hex2num','hidden','hilb','hist','hold','hot',
'hsv','hsv2rgb','i','ifft','ifft2','ifftn','ifftshift','imag',
'image','imfinfo','imread','imwrite','ind2sub','Inf','inferiorto',
'inline','inpolygon','input','inputdlg','inputname','int16',
- 'int2str','int32','int8','interp1','interp2','interp3','interpft',
- 'interpn','intersect','inv','invhilb','ipermute','isa','ishandle',
- 'ismember','isocaps','isonormals','isosurface','j','jet','keyboard',
+ 'int2str','int32','int8','int64','interp1','interp2','interp3','interpft',
+ 'interpn','intersect','inv','invhilb','ipermute','isa','iscell',
+ 'iscellstr','isfile','isfolder','ishandle','isinf',
+ 'ismember','isnan','isocaps','isonormals','isosurface','issorted','j','jet','keyboard',
'lcm','legend','legendre','light','lighting','lightingangle',
'lin2mu','line','lines','linspace','listdlg','loadobj','log',
'log10','log2','loglog','logm','logspace','lower','lscov','lu',
'luinc','magic','mat2str','material','max','mean','median','menu',
- 'menuedit','mesh','meshc','meshgrid','min','mod','msgbox','mu2lin',
+ 'menuedit','mesh','meshc','meshgrid','min','missing','mod','msgbox','mu2lin',
'NaN','nargchk','nargin','nargout','nchoosek','ndgrid','ndims',
'newplot','nextpow2','nnls','nnz','nonzeros','norm','normest','now',
'null','num2cell','num2str','nzmax','ode113,','ode15s,','ode23s,',
@@ -120,7 +121,7 @@ $language_data = array (
'polyvalm','pow2','primes','print','printdlg','printopt','prism',
'prod','propedit','qmr','qr','qrdelete','qrinsert','qrupdate',
'quad','questdlg','quiver','quiver3','qz','rand','randn','randperm',
- 'rank','rat','rats','rbbox','rcond','real','realmax','realmin',
+ 'rank','rat','rats','rbbox','rcond','readtable','real','realmax','realmin',
'rectangle','reducepatch','reducevolume','refresh','rem','repmat',
'reset','reshape','residue','rgb2hsv','rgbplot','ribbon','rmfield',
'roots','rose','rot90','rotate','rotate3d','round','rref',
@@ -133,27 +134,27 @@ $language_data = array (
'spline','spones','spparms','sprand','sprandn','sprandsym','spring',
'sprintf','sqrt','sqrtm','squeeze','sscanf','stairs','std','stem',
'stem3','str2double','str2num','strcat','strcmp','strcmpi',
- 'stream2','stream3','streamline','strings','strjust','strmatch',
- 'strncmp','strrep','strtok','struct','struct2cell','strvcat',
+ 'stream2','stream3','streamline','string','strings','strjust','strmatch',
+ 'strncmp','strrep','strtok','struct','structfun','struct2cell','strvcat',
'sub2ind','subplot','subspace','subvolume','sum','summer',
'superiorto','surf','surf2patch','surface','surfc','surfl',
- 'surfnorm','svd','svds','symmmd','symrcm','symvar','tan','tanh',
- 'texlabel','text Create','textread','textwrap','tic','title','toc',
+ 'surfnorm','svd','svds','symmmd','symrcm','symvar','tail','tall','tan','tanh',
+ 'texlabel','text Create','textread','textwrap','tic','timeseries','timer','timetable','title','toc',
'toeplitz','trace','trapz','tril','trimesh','trisurf','triu',
'tsearch','uicontext Create','uicontextmenu','uicontrol',
- 'uigetfile','uimenu','uint32','uint8','uiputfile','uiresume',
+ 'uigetfile','uimenu','uint32','uint8','uint64','uiputfile','uiresume',
'uisetcolor','uisetfont','uiwait Used','union','unique','unwrap',
'upper','var','varargin','varargout','vectorize','view','viewmtx',
'voronoi','waitbar','waitforbuttonpress','warndlg','warning',
'waterfall','wavread','wavwrite','weekday','whitebg','wilkinson',
- 'winter','wk1read','wk1write','xlabel','xlim','ylabel','ylim',
+ 'winter','wk1read','wk1write','writetable','xlabel','xlim','ylabel','ylim',
'zeros','zlabel','zlim','zoom',
//'[Keywords 6]',
'addpath','cd','clear','copyfile','delete','diary','dir','disp',
'doc','docopt','echo','edit','fileparts','format','fullfile','help',
'helpdesk','helpwin','home','inmem','lasterr','lastwarn','length',
'load','lookfor','ls','matlabrc','matlabroot','mkdir','mlock',
- 'more','munlock','open','openvar','pack','partialpath','path',
+ 'more','munlock','numel','open','openvar','pack','partialpath','path',
'pathtool','profile','profreport','pwd','quit','rmpath','save',
'saveas','size','tempdir','tempname','type','ver','version','web',
'what','whatsnew','which','who','whos','workspace'
@@ -206,7 +207,7 @@ $language_data = array (
),
'URLS' => array(
1 => '',
- 2 => 'http://www.mathworks.com/access/helpdesk/help/techdoc/ref/{FNAMEL}.html'
+ 2 => 'https://www.mathworks.com/help/matlab/ref/{FNAMEL}.html'
),
'OOLANG' => true,
'OBJECT_SPLITTERS' => array(
diff --git a/vendor/geshi/geshi/src/geshi/mercury.php b/vendor/geshi/geshi/src/geshi/mercury.php
index 9f77e4b6e..df8c9bbea 100644
--- a/vendor/geshi/geshi/src/geshi/mercury.php
+++ b/vendor/geshi/geshi/src/geshi/mercury.php
@@ -4,7 +4,7 @@
* --------
* Author: Sebastian Godelet (sebastian.godelet+github@gmail.com)
* Copyright: (c) 2014
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2014/10/30
*
* Mercury language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/metapost.php b/vendor/geshi/geshi/src/geshi/metapost.php
index f5944cbc8..83882d8e6 100644
--- a/vendor/geshi/geshi/src/geshi/metapost.php
+++ b/vendor/geshi/geshi/src/geshi/metapost.php
@@ -4,7 +4,7 @@
* -----------
* Author: Maxime Chupin (notezik@gmail.com)
* Copyright: (c) 2011 Maxime Chupin
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/08/02
*
* Metapost language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/mirc.php b/vendor/geshi/geshi/src/geshi/mirc.php
index 4aea845e8..a58b45fb7 100644
--- a/vendor/geshi/geshi/src/geshi/mirc.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/05/29
*
* mIRC Scripting language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/mk-61.php b/vendor/geshi/geshi/src/geshi/mk-61.php
index 653a3363d..669799ce9 100644
--- a/vendor/geshi/geshi/src/geshi/mk-61.php
+++ b/vendor/geshi/geshi/src/geshi/mk-61.php
@@ -4,7 +4,7 @@
*
* Author: Russkiy
* Copyright: (c) 2014 Russkiy
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2014-03-11
*
*********************************************************************
diff --git a/vendor/geshi/geshi/src/geshi/mmix.php b/vendor/geshi/geshi/src/geshi/mmix.php
index 5c8178c04..21fc061d7 100644
--- a/vendor/geshi/geshi/src/geshi/mmix.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/10/16
*
* MMIX Assembler language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/modula2.php b/vendor/geshi/geshi/src/geshi/modula2.php
index 2a20973b6..850b9e645 100644
--- a/vendor/geshi/geshi/src/geshi/modula2.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/11/05
*
* Modula-2 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/modula3.php b/vendor/geshi/geshi/src/geshi/modula3.php
index b3c223cad..1ba83f687 100644
--- a/vendor/geshi/geshi/src/geshi/modula3.php
+++ b/vendor/geshi/geshi/src/geshi/modula3.php
@@ -4,7 +4,7 @@
* ----------
* Author: mbishop (mbishop@esoteriq.org)
* Copyright: (c) 2009 mbishop (mbishop@esoteriq.org)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/01/21
*
* Modula-3 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/mpasm.php b/vendor/geshi/geshi/src/geshi/mpasm.php
index e6cf70e6c..42c85a1cc 100644
--- a/vendor/geshi/geshi/src/geshi/mpasm.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/12/6
*
* Microchip Assembler language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/mxml.php b/vendor/geshi/geshi/src/geshi/mxml.php
index 4bac67252..afc076936 100644
--- a/vendor/geshi/geshi/src/geshi/mxml.php
+++ b/vendor/geshi/geshi/src/geshi/mxml.php
@@ -4,7 +4,7 @@
* -------
* Author: David Spurr
* Copyright: (c) 2007 David Spurr (http://www.defusion.org.uk/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/10/04
*
* MXML language file for GeSHi. Based on the XML file by Nigel McNie
diff --git a/vendor/geshi/geshi/src/geshi/mysql.php b/vendor/geshi/geshi/src/geshi/mysql.php
index e62a122d2..afe86841c 100644
--- a/vendor/geshi/geshi/src/geshi/mysql.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008-12-12
*
* MySQL language file for GeSHi.
@@ -390,15 +390,15 @@ $language_data = array (
)
),
'URLS' => array(
- 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}',
+ 1 => 'https://www.oracle.com/search/results?cat=mysql&amp;Ntk=SI-ALL5&amp;Ntt={FNAME}',
+ 2 => 'https://www.oracle.com/search/results?cat=mysql&amp;Ntk=SI-ALL5&amp;Ntt={FNAME}',
+ 3 => 'https://www.oracle.com/search/results?cat=mysql&amp;Ntk=SI-ALL5&amp;Ntt={FNAME}',
+ 4 => 'https://www.oracle.com/search/results?cat=mysql&amp;Ntk=SI-ALL5&amp;Ntt={FNAME}',
+ 5 => 'https://www.oracle.com/search/results?cat=mysql&amp;Ntk=SI-ALL5&amp;Ntt={FNAME}',
+ 6 => 'https://www.oracle.com/search/results?cat=mysql&amp;Ntk=SI-ALL5&amp;Ntt={FNAME}',
+ 7 => 'https://www.oracle.com/search/results?cat=mysql&amp;Ntk=SI-ALL5&amp;Ntt={FNAME}',
+ 8 => 'https://www.oracle.com/search/results?cat=mysql&amp;Ntk=SI-ALL5&amp;Ntt={FNAME}',
+ 9 => 'https://www.oracle.com/search/results?cat=mysql&amp;Ntk=SI-ALL5&amp;Ntt={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/vendor/geshi/geshi/src/geshi/nagios.php b/vendor/geshi/geshi/src/geshi/nagios.php
index ac6d63a90..2358598ab 100644
--- a/vendor/geshi/geshi/src/geshi/nagios.php
+++ b/vendor/geshi/geshi/src/geshi/nagios.php
@@ -4,7 +4,7 @@
* --------
* 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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/01/19
*
* Nagios language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/netrexx.php b/vendor/geshi/geshi/src/geshi/netrexx.php
index 38e09fafb..a6d444b72 100644
--- a/vendor/geshi/geshi/src/geshi/netrexx.php
+++ b/vendor/geshi/geshi/src/geshi/netrexx.php
@@ -6,7 +6,7 @@
* Contributors:
* - Walter Pachl (pachl@chello.at)
* Copyright: (c) 2008 Jon Wolfers, (c) 2012 Walter Pachl
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/01/07
*
* NetRexx language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/newlisp.php b/vendor/geshi/geshi/src/geshi/newlisp.php
index b5a943152..2daa72bb6 100644
--- a/vendor/geshi/geshi/src/geshi/newlisp.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/09/30
*
* newLISP language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/nginx.php b/vendor/geshi/geshi/src/geshi/nginx.php
index 47ced0ab2..ab2a9fb48 100644
--- a/vendor/geshi/geshi/src/geshi/nginx.php
+++ b/vendor/geshi/geshi/src/geshi/nginx.php
@@ -7,7 +7,7 @@
* Contributors:
* - Deoren Moor (http://www.whyaskwhy.org/blog/)
* - Thomas Joiner
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/08/24
*
* nginx language file for GeSHi.
@@ -864,5 +864,10 @@ $language_data = array (
),
'STRICT_MODE_APPLIES' => GESHI_NEVER,
'SCRIPT_DELIMITERS' => array(),
- 'HIGHLIGHT_STRICT_BLOCK' => array()
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
);
diff --git a/vendor/geshi/geshi/src/geshi/nimrod.php b/vendor/geshi/geshi/src/geshi/nimrod.php
index a85edfbbc..1be79705e 100644
--- a/vendor/geshi/geshi/src/geshi/nimrod.php
+++ b/vendor/geshi/geshi/src/geshi/nimrod.php
@@ -4,7 +4,7 @@
* ----------
* Author: Dennis Felsing (dennis@felsin9.de)
* Copyright: (c) 2014 Dennis Felsing
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2014/07/15
*
* Nimrod language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/nsis.php b/vendor/geshi/geshi/src/geshi/nsis.php
index 61da046bb..3fb54a094 100644
--- a/vendor/geshi/geshi/src/geshi/nsis.php
+++ b/vendor/geshi/geshi/src/geshi/nsis.php
@@ -4,7 +4,7 @@
* --------
* Author: deguix (cevo_deguix@yahoo.com.br), Tux (http://tux.a4.cz/), Jan T. Sott (http://github.com/idleberg)
* Copyright: (c) 2005 deguix, 2004 Tux (http://tux.a4.cz/), Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/12/03
*
* Nullsoft Scriptable Install System language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/oberon2.php b/vendor/geshi/geshi/src/geshi/oberon2.php
index 8540cadf4..38a191594 100644
--- a/vendor/geshi/geshi/src/geshi/oberon2.php
+++ b/vendor/geshi/geshi/src/geshi/oberon2.php
@@ -4,7 +4,7 @@
* ----------
* Author: mbishop (mbishop@esoteriq.org)
* Copyright: (c) 2009 mbishop (mbishop@esoteriq.org)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/02/10
*
* Oberon-2 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/objc.php b/vendor/geshi/geshi/src/geshi/objc.php
index 3fdf49ae1..0f6ee1d75 100644
--- a/vendor/geshi/geshi/src/geshi/objc.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/04
*
* Objective-C language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/objeck.php b/vendor/geshi/geshi/src/geshi/objeck.php
index 6fab2d07c..465db8911 100644
--- a/vendor/geshi/geshi/src/geshi/objeck.php
+++ b/vendor/geshi/geshi/src/geshi/objeck.php
@@ -4,7 +4,7 @@
* --------
* Author: Randy Hollines (objeck@gmail.com)
* Copyright: (c) 2010 Randy Hollines (http://code.google.com/p/objeck-lang/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/07/01
*
* Objeck Programming Language language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/ocaml-brief.php b/vendor/geshi/geshi/src/geshi/ocaml-brief.php
index f63c9e794..1d7563e70 100644
--- a/vendor/geshi/geshi/src/geshi/ocaml-brief.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/08/27
*
* OCaml (Objective Caml) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/ocaml.php b/vendor/geshi/geshi/src/geshi/ocaml.php
index 4e14082fd..e9e57ef66 100644
--- a/vendor/geshi/geshi/src/geshi/ocaml.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/08/27
*
* OCaml (Objective Caml) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/octave.php b/vendor/geshi/geshi/src/geshi/octave.php
index a77e5da77..999ab261f 100644
--- a/vendor/geshi/geshi/src/geshi/octave.php
+++ b/vendor/geshi/geshi/src/geshi/octave.php
@@ -6,7 +6,7 @@
* Juan Pablo Carbajal (carbajal@ifi.uzh.ch)
* Copyright: (c) 2012 Carnë Draug
* (c) 2012 Juan Pablo Carbajal
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/05/22
*
* GNU/Octave M-file language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/oobas.php b/vendor/geshi/geshi/src/geshi/oobas.php
index e6f5efd68..b022ebf69 100644
--- a/vendor/geshi/geshi/src/geshi/oobas.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/30
*
* OpenOffice.org Basic language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/oorexx.php b/vendor/geshi/geshi/src/geshi/oorexx.php
index 5fde8008b..db629b53a 100644
--- a/vendor/geshi/geshi/src/geshi/oorexx.php
+++ b/vendor/geshi/geshi/src/geshi/oorexx.php
@@ -6,7 +6,7 @@
* Contributors:
* - Walter Pachl (pachl@chello.at)
* Copyright: (c) 2008 Jon Wolfers, (c) 2012 Walter Pachl
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/01/07
*
* ooRexx language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/oracle11.php b/vendor/geshi/geshi/src/geshi/oracle11.php
index 36b208279..0e2cf4a28 100644
--- a/vendor/geshi/geshi/src/geshi/oracle11.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/04
*
* Oracle 11i language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/oracle8.php b/vendor/geshi/geshi/src/geshi/oracle8.php
index f13209029..f723e65bb 100644
--- a/vendor/geshi/geshi/src/geshi/oracle8.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/04
*
* Oracle 8 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/oxygene.php b/vendor/geshi/geshi/src/geshi/oxygene.php
index 662bba2b1..ac7e88c47 100644
--- a/vendor/geshi/geshi/src/geshi/oxygene.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/01/11
*
* Delphi Prism (Oxygene) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/oz.php b/vendor/geshi/geshi/src/geshi/oz.php
index 3b965663f..943eb8dd2 100644
--- a/vendor/geshi/geshi/src/geshi/oz.php
+++ b/vendor/geshi/geshi/src/geshi/oz.php
@@ -4,7 +4,7 @@
* --------
* Author: Wolfgang Meyer (Wolfgang.Meyer@gmx.net)
* Copyright: (c) 2010 Wolfgang Meyer
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/01/03
*
* Oz language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/parasail.php b/vendor/geshi/geshi/src/geshi/parasail.php
index a72d8457d..7a136b9ee 100644
--- a/vendor/geshi/geshi/src/geshi/parasail.php
+++ b/vendor/geshi/geshi/src/geshi/parasail.php
@@ -4,7 +4,7 @@
* -------
* Author: T. Taft (taft@adacore.com)
* Copyright: (c) 2012 AdaCore (http://adacore.com/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/08/02
*
* ParaSail language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/parigp.php b/vendor/geshi/geshi/src/geshi/parigp.php
index 9c6a143cb..fe99c10fd 100644
--- a/vendor/geshi/geshi/src/geshi/parigp.php
+++ b/vendor/geshi/geshi/src/geshi/parigp.php
@@ -4,7 +4,7 @@
* --------
* Author: Charles R Greathouse IV (charles@crg4.com)
* Copyright: 2011-2013 Charles R Greathouse IV (http://math.crg4.com/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/05/11
*
* PARI/GP language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/pascal.php b/vendor/geshi/geshi/src/geshi/pascal.php
index 0d95af503..ee89223cc 100644
--- a/vendor/geshi/geshi/src/geshi/pascal.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/26
*
* Pascal language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/pcre.php b/vendor/geshi/geshi/src/geshi/pcre.php
index 243121bcd..fd48c3962 100644
--- a/vendor/geshi/geshi/src/geshi/pcre.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/05/22
*
* PCRE language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/per.php b/vendor/geshi/geshi/src/geshi/per.php
index 8337823aa..096223580 100644
--- a/vendor/geshi/geshi/src/geshi/per.php
+++ b/vendor/geshi/geshi/src/geshi/per.php
@@ -4,7 +4,7 @@
* --------
* Author: Lars Gersmann (lars.gersmann@gmail.com)
* Copyright: (c) 2007 Lars Gersmann
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/06/03
*
* Per (forms) (FOURJ's Genero 4GL) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/perl.php b/vendor/geshi/geshi/src/geshi/perl.php
index 0a05708d7..e60c4c460 100644
--- a/vendor/geshi/geshi/src/geshi/perl.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/20
*
* Perl language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/perl6.php b/vendor/geshi/geshi/src/geshi/perl6.php
index f063a6b2c..ce2fafb3d 100644
--- a/vendor/geshi/geshi/src/geshi/perl6.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/11/07
*
* Perl 6 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/pf.php b/vendor/geshi/geshi/src/geshi/pf.php
index 2f80e23f2..440ecb34f 100644
--- a/vendor/geshi/geshi/src/geshi/pf.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/10/16
* Based on bash.php
*
diff --git a/vendor/geshi/geshi/src/geshi/phix.php b/vendor/geshi/geshi/src/geshi/phix.php
index a4f4e4e0b..66096a255 100644
--- a/vendor/geshi/geshi/src/geshi/phix.php
+++ b/vendor/geshi/geshi/src/geshi/phix.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Pete Lomax
* Copyright: (c) 2010 Nicholas Koceja
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 16/08/2015
*
* Phix language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/php-brief.php b/vendor/geshi/geshi/src/geshi/php-brief.php
index 922c9d930..f7fb4158b 100644
--- a/vendor/geshi/geshi/src/geshi/php-brief.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/02
*
* PHP (brief version) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/php.php b/vendor/geshi/geshi/src/geshi/php.php
index 6b2484091..dc9561a78 100644
--- a/vendor/geshi/geshi/src/geshi/php.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/20
*
* PHP language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/pic16.php b/vendor/geshi/geshi/src/geshi/pic16.php
index bd742ad5a..da5e263d5 100644
--- a/vendor/geshi/geshi/src/geshi/pic16.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/07/30
*
* PIC16 Assembler language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/pike.php b/vendor/geshi/geshi/src/geshi/pike.php
index 12dabf20b..b07a05e34 100644
--- a/vendor/geshi/geshi/src/geshi/pike.php
+++ b/vendor/geshi/geshi/src/geshi/pike.php
@@ -4,7 +4,7 @@
* --------
* Author: Rick E. (codeblock@eighthbit.net)
* Copyright: (c) 2009 Rick E.
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/12/10
*
* Pike language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/pixelbender.php b/vendor/geshi/geshi/src/geshi/pixelbender.php
index d7bcc0802..bb9c2a4bd 100644
--- a/vendor/geshi/geshi/src/geshi/pixelbender.php
+++ b/vendor/geshi/geshi/src/geshi/pixelbender.php
@@ -4,7 +4,7 @@
* ----------------
* Author: Richard Olsson (r@richardolsson.se)
* Copyright: (c) 2008 Richard Olsson (richardolsson.se)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/11/16
*
* Pixel Bender 1.0 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/pli.php b/vendor/geshi/geshi/src/geshi/pli.php
index 6f12c1fdc..ac52a4c17 100644
--- a/vendor/geshi/geshi/src/geshi/pli.php
+++ b/vendor/geshi/geshi/src/geshi/pli.php
@@ -4,7 +4,7 @@
* --------
* Author: Robert AH Prins (robert@prino.org)
* Copyright: (c) 2011 Robert AH Prins (http://hitchwiki.org/en/User:Prino)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/02/09
*
* PL/I language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/plsql.php b/vendor/geshi/geshi/src/geshi/plsql.php
index c2ad85153..70dfb13c5 100644
--- a/vendor/geshi/geshi/src/geshi/plsql.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/10/26
*
* Oracle 9.2 PL/SQL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/postgresql.php b/vendor/geshi/geshi/src/geshi/postgresql.php
index 2816c6c95..5a666c80d 100644
--- a/vendor/geshi/geshi/src/geshi/postgresql.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/07/20
*
* PostgreSQL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/postscript.php b/vendor/geshi/geshi/src/geshi/postscript.php
index 00ee93c8c..d29b8a7c8 100644
--- a/vendor/geshi/geshi/src/geshi/postscript.php
+++ b/vendor/geshi/geshi/src/geshi/postscript.php
@@ -4,7 +4,7 @@
* -----
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2014 Benny Baumann (http://qbnz.com/highlighter/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2014/08/10
*
* PostScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/povray.php b/vendor/geshi/geshi/src/geshi/povray.php
index eb75d41c5..e71efd742 100644
--- a/vendor/geshi/geshi/src/geshi/povray.php
+++ b/vendor/geshi/geshi/src/geshi/povray.php
@@ -4,7 +4,7 @@
* --------
* Author: Carl Fürstenberg (azatoth@gmail.com)
* Copyright: © 2007 Carl Fürstenberg
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/07/11
*
* Povray language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/powerbuilder.php b/vendor/geshi/geshi/src/geshi/powerbuilder.php
index b93e7dd90..5e0cbc798 100644
--- a/vendor/geshi/geshi/src/geshi/powerbuilder.php
+++ b/vendor/geshi/geshi/src/geshi/powerbuilder.php
@@ -4,7 +4,7 @@
* ------
* Author: Doug Porter (powerbuilder.geshi@gmail.com)
* Copyright: (c) 2009 Doug Porter
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/07/13
*
* PowerBuilder (PowerScript) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/powershell.php b/vendor/geshi/geshi/src/geshi/powershell.php
index 423045918..5b3330661 100644
--- a/vendor/geshi/geshi/src/geshi/powershell.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/06/20
*
* PowerShell language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/proftpd.php b/vendor/geshi/geshi/src/geshi/proftpd.php
index 99ae9664d..63d392497 100644
--- a/vendor/geshi/geshi/src/geshi/proftpd.php
+++ b/vendor/geshi/geshi/src/geshi/proftpd.php
@@ -4,7 +4,7 @@
* ----------
* Author: Benny Baumann (BenBE@geshi.org)
* Copyright: (c) 2010 Benny Baumann (http://qbnz.com/highlighter)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/01/25
*
* ProFTPd language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/progress.php b/vendor/geshi/geshi/src/geshi/progress.php
index 154147286..2160a3cce 100644
--- a/vendor/geshi/geshi/src/geshi/progress.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/07/11
*
* Progress language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/prolog.php b/vendor/geshi/geshi/src/geshi/prolog.php
index f3c8e8f19..26d7448d8 100644
--- a/vendor/geshi/geshi/src/geshi/prolog.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/10/02
*
* Prolog language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/properties.php b/vendor/geshi/geshi/src/geshi/properties.php
index 3cbde9d3a..89c6d625d 100644
--- a/vendor/geshi/geshi/src/geshi/properties.php
+++ b/vendor/geshi/geshi/src/geshi/properties.php
@@ -4,7 +4,7 @@
* --------
* Author: Edy Hinzen
* Copyright: (c) 2009 Edy Hinzen
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/04/03
*
* Property language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/providex.php b/vendor/geshi/geshi/src/geshi/providex.php
index 2d09be432..1a17865e2 100644
--- a/vendor/geshi/geshi/src/geshi/providex.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/10/18
*
* ProvideX language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/purebasic.php b/vendor/geshi/geshi/src/geshi/purebasic.php
index e40890b2c..8b9b65e34 100644
--- a/vendor/geshi/geshi/src/geshi/purebasic.php
+++ b/vendor/geshi/geshi/src/geshi/purebasic.php
@@ -4,7 +4,7 @@
* -------
* Author: GuShH
* Copyright: (c) 2009 Gustavo Julio Fiorenza
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 13/06/2009
*
* PureBasic language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/pycon.php b/vendor/geshi/geshi/src/geshi/pycon.php
index 31531a7fd..4e372ac72 100644
--- a/vendor/geshi/geshi/src/geshi/pycon.php
+++ b/vendor/geshi/geshi/src/geshi/pycon.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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/30
*
* Python language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/pys60.php b/vendor/geshi/geshi/src/geshi/pys60.php
index caedc2ff7..54a1f5955 100644
--- a/vendor/geshi/geshi/src/geshi/pys60.php
+++ b/vendor/geshi/geshi/src/geshi/pys60.php
@@ -4,7 +4,7 @@
* ----------
* 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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/05/03
*
* Python for S60 language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/python.php b/vendor/geshi/geshi/src/geshi/python.php
index 3df07ea4f..a34ed749c 100644
--- a/vendor/geshi/geshi/src/geshi/python.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/30
*
* Python language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/q.php b/vendor/geshi/geshi/src/geshi/q.php
index 926ddbf07..a6b005dd5 100644
--- a/vendor/geshi/geshi/src/geshi/q.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/01/21
*
* q/kdb+ language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/qbasic.php b/vendor/geshi/geshi/src/geshi/qbasic.php
index 0a09b4d4f..9f3be88d2 100644
--- a/vendor/geshi/geshi/src/geshi/qbasic.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/20
*
* QBasic/QuickBASIC language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/qml.php b/vendor/geshi/geshi/src/geshi/qml.php
index 3aa345766..fe89e4596 100644
--- a/vendor/geshi/geshi/src/geshi/qml.php
+++ b/vendor/geshi/geshi/src/geshi/qml.php
@@ -4,7 +4,7 @@
* --------------
* Author: J-P Nurmi <jpnurmi@gmail.com>
* Copyright: (c) 2012-2014 J-P Nurmi <jpnurmi@gmail.com>
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/08/19
*
* QML language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/racket.php b/vendor/geshi/geshi/src/geshi/racket.php
index 2b25b9bba..c26ea604d 100644
--- a/vendor/geshi/geshi/src/geshi/racket.php
+++ b/vendor/geshi/geshi/src/geshi/racket.php
@@ -4,7 +4,7 @@
* ----------
* Author: Tim Brown (tim@timb.net)
* Copyright: (c) 2013 Tim Brown ((https://github.com/tim-brown/geshi-racket))
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2013-03-01
*
* Racket language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/rails.php b/vendor/geshi/geshi/src/geshi/rails.php
index f5683b85d..9ca7046e3 100644
--- a/vendor/geshi/geshi/src/geshi/rails.php
+++ b/vendor/geshi/geshi/src/geshi/rails.php
@@ -4,7 +4,7 @@
* ---------
* Author: Moises Deniz
* Copyright: (c) 2005 Moises Deniz
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/03/21
*
* Ruby (with Ruby on Rails Framework) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/rbs.php b/vendor/geshi/geshi/src/geshi/rbs.php
index 76610d1e4..6e9e77526 100644
--- a/vendor/geshi/geshi/src/geshi/rbs.php
+++ b/vendor/geshi/geshi/src/geshi/rbs.php
@@ -4,7 +4,7 @@
* ------
* Author: Deng Wen Gang (deng@priity.com)
* Copyright: (c) 2013 Deng Wen Gang
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2013/01/15
*
* RBScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/rebol.php b/vendor/geshi/geshi/src/geshi/rebol.php
index d11447ab5..16c4ceaf4 100644
--- a/vendor/geshi/geshi/src/geshi/rebol.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/12/22
*
* Rebol language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/reg.php b/vendor/geshi/geshi/src/geshi/reg.php
index e73c961f9..c96667426 100644
--- a/vendor/geshi/geshi/src/geshi/reg.php
+++ b/vendor/geshi/geshi/src/geshi/reg.php
@@ -4,7 +4,7 @@
* -------
* Author: Sean Hanna (smokingrope@gmail.com)
* Copyright: (c) 2006 Sean Hanna
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 03/15/2006
*
* Microsoft Registry Editor language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/rexx.php b/vendor/geshi/geshi/src/geshi/rexx.php
index 9e0a73e7c..6a4f1a88f 100644
--- a/vendor/geshi/geshi/src/geshi/rexx.php
+++ b/vendor/geshi/geshi/src/geshi/rexx.php
@@ -6,7 +6,7 @@
* Contributors:
* - Walter Pachl (pachl@chello.at)
* Copyright: (c) 2008 Jon Wolfers, (c) 2012 Walter Pachl
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/01/07
*
* Rexx language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/robots.php b/vendor/geshi/geshi/src/geshi/robots.php
index 91fd87e9c..92863c3a8 100644
--- a/vendor/geshi/geshi/src/geshi/robots.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/02/17
*
* robots.txt language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/roff.php b/vendor/geshi/geshi/src/geshi/roff.php
new file mode 100644
index 000000000..6f8769054
--- /dev/null
+++ b/vendor/geshi/geshi/src/geshi/roff.php
@@ -0,0 +1,510 @@
+<?php
+/*************************************************************************************
+ * roff.php
+ * ---------------------------------
+ * Author: Artur Iwicki (iwicki DOT artur AT svgames DOT pl)
+ * Copyright: (c) 2017 Artur Iwicki
+ * Release Version: 1.0.9.1
+ * Date Started: 2017-11-17
+ *
+ * roff (Unix man page) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2018-12-06 (1.0.1)
+ * - Fix reqex for line-start requests (must start with [.'], not [\.'])
+ * - Add some missing whitespace escapes
+ * 2017-11-20 (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' => 'roff',
+ 'COMMENT_SINGLE' => array(
+ 1 => '\\"',
+ 2 => '\\#',
+ ),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ 1 => '/^\\.\\\\"[[:print:]]*/m'
+ ),
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ ),
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '\\[-D]', '\\(-D',
+ '\\[Sd]', '\\(Sd',
+ '\\[TP]', '\\(TP',
+ '\\[Tp]', '\\(Tp',
+ '\\[ss]', '\\(ss',
+ '\\[ff]', '\\(ff',
+ '\\[fi]', '\\(fi',
+ '\\[fl]', '\\(fl',
+ '\\[Fi]', '\\(Fi',
+ '\\[Fl]', '\\(Fl',
+ '\\[/L]', '\\(/L',
+ '\\[/l]', '\\(/l',
+ '\\[/O]', '\\(/O',
+ '\\[/o]', '\\(/o',
+ '\\[AE]', '\\(AE',
+ '\\[ae]', '\\(ae',
+ '\\[OE]', '\\(OE',
+ '\\[oe]', '\\(oe',
+ '\\[IJ]', '\\(IJ',
+ '\\[ij]', '\\(ij',
+ '\\[.i]', '\\(.i',
+ '\\[.j]', '\\(.j',
+ '\\[\'A]', '\\(\'A',
+ '\\[\'C]', '\\(\'C',
+ '\\[\'E]', '\\(\'E',
+ '\\[\'I]', '\\(\'I',
+ '\\[\'O]', '\\(\'O',
+ '\\[\'U]', '\\(\'U',
+ '\\[\'Y]', '\\(\'Y',
+ '\\[\'a]', '\\(\'a',
+ '\\[\'c]', '\\(\'c',
+ '\\[\'e]', '\\(\'e',
+ '\\[\'i]', '\\(\'i',
+ '\\[\'o]', '\\(\'o',
+ '\\[\'u]', '\\(\'u',
+ '\\[\'y]', '\\(\'y',
+ '\\[:A]', '\\(:A',
+ '\\[:E]', '\\(:E',
+ '\\[:I]', '\\(:I',
+ '\\[:O]', '\\(:O',
+ '\\[:U]', '\\(:U',
+ '\\[:Y]', '\\(:Y',
+ '\\[:a]', '\\(:a',
+ '\\[:e]', '\\(:e',
+ '\\[:i]', '\\(:i',
+ '\\[:o]', '\\(:o',
+ '\\[:u]', '\\(:u',
+ '\\[:y]', '\\(:y',
+ '\\[^A]', '\\(^A',
+ '\\[^E]', '\\(^E',
+ '\\[^I]', '\\(^I',
+ '\\[^O]', '\\(^O',
+ '\\[^U]', '\\(^U',
+ '\\[^a]', '\\(^a',
+ '\\[^e]', '\\(^e',
+ '\\[^i]', '\\(^i',
+ '\\[^o]', '\\(^o',
+ '\\[^u]', '\\(^u',
+ '\\[`A]', '\\(`A',
+ '\\[`E]', '\\(`E',
+ '\\[`I]', '\\(`I',
+ '\\[`O]', '\\(`O',
+ '\\[`U]', '\\(`U',
+ '\\[`a]', '\\(`a',
+ '\\[`e]', '\\(`e',
+ '\\[`i]', '\\(`i',
+ '\\[`o]', '\\(`o',
+ '\\[`u]', '\\(`u',
+ '\\[~A]', '\\(~A',
+ '\\[~N]', '\\(~N',
+ '\\[~O]', '\\(~O',
+ '\\[~a]', '\\(~a',
+ '\\[~n]', '\\(~n',
+ '\\[~o]', '\\(~o',
+ '\\[vS]', '\\(vS',
+ '\\[vs]', '\\(vs',
+ '\\[vZ]', '\\(vZ',
+ '\\[vz]', '\\(vz',
+ '\\[,C]', '\\(,C',
+ '\\[,c]', '\\(,c',
+ '\\[oA]', '\\(oA',
+ '\\[oa]', '\\(oa',
+ '\\[a"]', '\\(a"',
+ '\\[a-]', '\\(a-',
+ '\\[a.]', '\\(a.',
+ '\\[a^]', '\\(a^',
+ '\\[aa]', '\\(aa',
+ '\\[ga]', '\\(ga',
+ '\\[ab]', '\\(ab',
+ '\\[ac]', '\\(ac',
+ '\\[ad]', '\\(ad',
+ '\\[ah]', '\\(ah',
+ '\\[ao]', '\\(ao',
+ '\\[a~]', '\\(a~',
+ '\\[ho]', '\\(ho',
+ '\\[ha]', '\\(ha',
+ '\\[ti]', '\\(ti',
+ '\\[Bq]', '\\(Bq',
+ '\\[bq]', '\\(bq',
+ '\\[lq]', '\\(lq',
+ '\\[rq]', '\\(rq',
+ '\\[oq]', '\\(oq',
+ '\\[cq]', '\\(cq',
+ '\\[aq]', '\\(aq',
+ '\\[dq]', '\\(dq',
+ '\\[Fo]', '\\(Fo',
+ '\\[Fc]', '\\(Fc',
+ '\\[fo]', '\\(fo',
+ '\\[fc]', '\\(fc',
+ '\\[r!]', '\\(r!',
+ '\\[r?]', '\\(r?',
+ '\\[em]', '\\(em',
+ '\\[en]', '\\(en',
+ '\\[hy]', '\\(hy',
+ '\\[lB]', '\\(lB',
+ '\\[rB]', '\\(rB',
+ '\\[lC]', '\\(lC',
+ '\\[rC]', '\\(rC',
+ '\\[la]', '\\(la',
+ '\\[ra]', '\\(ra',
+ '\\[bv]', '\\(bv',
+ '\\[braceex]',
+ '\\[bracketlefttp]',
+ '\\[bracketleftbt]',
+ '\\[bracketleftex]',
+ '\\[bracketrighttp]',
+ '\\[bracketrightbt]',
+ '\\[bracketrightex]',
+ '\\[lt]', '\\(lt',
+ '\\[bracelefttp]',
+ '\\[lk]', '\\(lk',
+ '\\[braceleftmid]',
+ '\\[lb]', '\\(lb',
+ '\\[braceleftbt]',
+ '\\[braceleftex]',
+ '\\[rt]', '\\(rt',
+ '\\[bracerighttp]',
+ '\\[rk]', '\\(rk',
+ '\\[bracerightmid]',
+ '\\[rb]', '\\(rb',
+ '\\[bracerightbt]',
+ '\\[bracerightex]',
+ '\\[parenlefttp]',
+ '\\[parenleftbt]',
+ '\\[parenleftex]',
+ '\\[parenrighttp]',
+ '\\[parenrightbt]',
+ '\\[parenrightex]',
+ '\\[&lt;-]', '\\(&lt;-',
+ '\\[-&gt;]', '\\(-&gt;',
+ '\\[&lt;&gt;]', '\\(&lt;&gt;',
+ '\\[da]', '\\(da',
+ '\\[ua]', '\\(ua',
+ '\\[va]', '\\(va',
+ '\\[lA]', '\\(lA',
+ '\\[rA]', '\\(rA',
+ '\\[hA]', '\\(hA',
+ '\\[dA]', '\\(dA',
+ '\\[uA]', '\\(uA',
+ '\\[vA]', '\\(vA',
+ '\\[an]', '\\(an',
+ '\\[ba]', '\\(ba',
+ '\\[br]', '\\(br',
+ '\\[ul]', '\\(ul',
+ '\\[rn]', '\\(rn',
+ '\\[ru]', '\\(ru',
+ '\\[bb]', '\\(bb',
+ '\\[sl]', '\\(sl',
+ '\\[rs]', '\\(rs',
+ '\\[ci]', '\\(ci',
+ '\\[bu]', '\\(bu',
+ '\\[dd]', '\\(dd',
+ '\\[dg]', '\\(dg',
+ '\\[lz]', '\\(lz',
+ '\\[sq]', '\\(sq',
+ '\\[ps]', '\\(ps',
+ '\\[sc]', '\\(sc',
+ '\\[lh]', '\\(lh',
+ '\\[rh]', '\\(rh',
+ '\\[at]', '\\(at',
+ '\\[sh]', '\\(sh',
+ '\\[CR]', '\\(CR',
+ '\\[OK]', '\\(OK',
+ '\\[co]', '\\(co',
+ '\\[rg]', '\\(rg',
+ '\\[tm]', '\\(tm',
+ '\\[bs]', '\\(bs',
+ '\\[Do]', '\\(Do',
+ '\\[ct]', '\\(ct',
+ '\\[eu]', '\\(eu',
+ '\\[Eu]', '\\(Eu',
+ '\\[Ye]', '\\(Ye',
+ '\\[Po]', '\\(Po',
+ '\\[Cs]', '\\(Cs',
+ '\\[Fn]', '\\(Fn',
+ '\\[de]', '\\(de',
+ '\\[%0]', '\\(%0',
+ '\\[fm]', '\\(fm',
+ '\\[sd]', '\\(sd',
+ '\\[mc]', '\\(mc',
+ '\\[Of]', '\\(Of',
+ '\\[Om]', '\\(Om',
+ '\\[AN]', '\\(AN',
+ '\\[OR]', '\\(OR',
+ '\\[no]', '\\(no',
+ '\\[tno]',
+ '\\[te]', '\\(te',
+ '\\[fa]', '\\(fa',
+ '\\[st]', '\\(st',
+ '\\[3d]', '\\(3d',
+ '\\[tf]', '\\(tf',
+ '\\[or]', '\\(or',
+ '\\[12]', '\\(12',
+ '\\[14]', '\\(14',
+ '\\[34]', '\\(34',
+ '\\[18]', '\\(18',
+ '\\[38]', '\\(38',
+ '\\[58]', '\\(58',
+ '\\[78]', '\\(78',
+ '\\[S1]', '\\(S1',
+ '\\[S2]', '\\(S2',
+ '\\[S3]', '\\(S3',
+ '\\[pl]', '\\(pl',
+ '\\[mi]', '\\(mi',
+ '\\[-+]', '\\(-+',
+ '\\[+-]', '\\(+-',
+ '\\[t+-]',
+ '\\[pc]', '\\(pc',
+ '\\[md]', '\\(md',
+ '\\[mu]', '\\(mu',
+ '\\[tmu]',
+ '\\[c*]', '\\(c*',
+ '\\[c+]', '\\(c+',
+ '\\[di]', '\\(di',
+ '\\[tdi]',
+ '\\[f/]', '\\(f/',
+ '\\[**]', '\\(**',
+ '\\[&lt;=]', '\\(&lt;=',
+ '\\[&gt;=]', '\\(&gt;=',
+ '\\[&lt;&lt;]', '\\(&lt;&lt;',
+ '\\[&gt;&gt;]', '\\(&gt;&gt;',
+ '\\[eq]', '\\(eq',
+ '\\[!=]', '\\(!=',
+ '\\[==]', '\\(==',
+ '\\[ne]', '\\(ne',
+ '\\[=~]', '\\(=~',
+ '\\[|=]', '\\(|=',
+ '\\[ap]', '\\(ap',
+ '\\[~~]', '\\(~~',
+ '\\[~=]', '\\(~=',
+ '\\[pt]', '\\(pt',
+ '\\[es]', '\\(es',
+ '\\[mo]', '\\(mo',
+ '\\[nm]', '\\(nm',
+ '\\[sb]', '\\(sb',
+ '\\[nb]', '\\(nb',
+ '\\[sp]', '\\(sp',
+ '\\[nc]', '\\(nc',
+ '\\[ib]', '\\(ib',
+ '\\[ip]', '\\(ip',
+ '\\[ca]', '\\(ca',
+ '\\[cu]', '\\(cu',
+ '\\[/_]', '\\(/_',
+ '\\[pp]', '\\(pp',
+ '\\[is]', '\\(is',
+ '\\[integral]',
+ '\\[sum]',
+ '\\[product]',
+ '\\[coproduct]',
+ '\\[gr]', '\\(gr',
+ '\\[sr]', '\\(sr',
+ '\\[sqrt]',
+ '\\[radicalex]',
+ '\\[sqrtex]',
+ '\\[lc]', '\\(lc',
+ '\\[rc]', '\\(rc',
+ '\\[lf]', '\\(lf',
+ '\\[rf]', '\\(rf',
+ '\\[if]', '\\(if',
+ '\\[Ah]', '\\(Ah',
+ '\\[Im]', '\\(Im',
+ '\\[Re]', '\\(Re',
+ '\\[wp]', '\\(wp',
+ '\\[pd]', '\\(pd',
+ '\\[-h]', '\\(-h',
+ '\\[hbar]',
+ '\\[*A]', '\\(*A',
+ '\\[*B]', '\\(*B',
+ '\\[*G]', '\\(*G',
+ '\\[*D]', '\\(*D',
+ '\\[*E]', '\\(*E',
+ '\\[*Z]', '\\(*Z',
+ '\\[*Y]', '\\(*Y',
+ '\\[*H]', '\\(*H',
+ '\\[*I]', '\\(*I',
+ '\\[*K]', '\\(*K',
+ '\\[*L]', '\\(*L',
+ '\\[*M]', '\\(*M',
+ '\\[*N]', '\\(*N',
+ '\\[*C]', '\\(*C',
+ '\\[*O]', '\\(*O',
+ '\\[*P]', '\\(*P',
+ '\\[*R]', '\\(*R',
+ '\\[*S]', '\\(*S',
+ '\\[*T]', '\\(*T',
+ '\\[*U]', '\\(*U',
+ '\\[*F]', '\\(*F',
+ '\\[*X]', '\\(*X',
+ '\\[*Q]', '\\(*Q',
+ '\\[*W]', '\\(*W',
+ '\\[*a]', '\\(*a',
+ '\\[*b]', '\\(*b',
+ '\\[*g]', '\\(*g',
+ '\\[*d]', '\\(*d',
+ '\\[*e]', '\\(*e',
+ '\\[*z]', '\\(*z',
+ '\\[*y]', '\\(*y',
+ '\\[*h]', '\\(*h',
+ '\\[*i]', '\\(*i',
+ '\\[*k]', '\\(*k',
+ '\\[*l]', '\\(*l',
+ '\\[*m]', '\\(*m',
+ '\\[*n]', '\\(*n',
+ '\\[*c]', '\\(*c',
+ '\\[*o]', '\\(*o',
+ '\\[*p]', '\\(*p',
+ '\\[*r]', '\\(*r',
+ '\\[ts]', '\\(ts',
+ '\\[*s]', '\\(*s',
+ '\\[*t]', '\\(*t',
+ '\\[*u]', '\\(*u',
+ '\\[*f]', '\\(*f',
+ '\\[*x]', '\\(*x',
+ '\\[*q]', '\\(*q',
+ '\\[*w]', '\\(*w',
+ '\\[+h]', '\\(+h',
+ '\\[+f]', '\\(+f',
+ '\\[+p]', '\\(+p',
+ '\\[+e]', '\\(+e',
+ '\\[CL]', '\\(CL',
+ '\\[SP]', '\\(SP',
+ '\\[HE]', '\\(HE',
+ '\\[DI]', '\\(DI',
+ ),
+ 1 => array(
+ // Special characters
+ '\\\\', '\\´', '\\`', '\\-',
+ '\\_', '\\.', '\\%', '\\!',
+ '\\0', '\\|', '\\^', '\\&',
+ '\\)', '\\/', '\\,', '\\~',
+ '\\:', '\\{', '\\}', '\\a',
+ '\\c', '\\d', '\\e', '\\E',
+ '\\p', '\\r', '\\t', '\\u',
+
+ // Whitespace escapes
+ '\\ ', '\\h', "\\\n",
+
+ // Text modifiers
+ '\\fB', '\\fI', '\\fR', '\\fP',
+ '\\f0', '\\f1', '\\f2', '\\f3', '\\f4', '\\f5', '\\f6', '\\f7', '\\f8', '\\f9',
+ ),
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #ffff55;',
+ 2 => 'color: #ffff55;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ ),
+ 'STRINGS' => array(
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #00aaaa',
+ 1 => 'color: #aa00aa',
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #ffff55;',
+ 1 => 'font-weight: bold;',
+ 2 => 'font-style: italic;',
+ 3 => 'font-weight: bold;',
+ 4 => 'font-style: italic;',
+ 5 => 'color: #55aaff;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'REGEXPS' => array(
+ 0 => array(
+ // Unicode characters
+ GESHI_SEARCH => '\\\\\\[u([[:xdigit:]]{4,5})\\]',
+ GESHI_REPLACE => '\\\\[\\1]',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ 1 => array(
+ // Bold text - formatted using .B or 'B
+ GESHI_SEARCH => "^([\\.']{1}B[[:blank:]]*\\n{0,1})([[:print:]]+)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '',
+ ),
+ 2 => array(
+ // Italic text - formatted using .I or 'I
+ GESHI_SEARCH => "^([\\.']{1}I[[:blank:]]*\\n{0,1})([[:print:]]+)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '',
+ ),
+ 3 => array(
+ // Bold text - formatted inline
+ GESHI_SEARCH => '(\\\\fB)([[:print:]]+?)(\\\\fR)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3',
+ ),
+ 4 => array (
+ // Italic text - formatted inline
+ GESHI_SEARCH => '(\\\\fI)([[:print:]]+?)(\\\\fR)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3',
+ ),
+ 5 => array(
+ // Line start macros (.TP, .SH, et cetera)
+ GESHI_SEARCH => "^([.']{1}[a-zA-Z]+)",
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ ),
+ 'URLS' => array(),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+);
diff --git a/vendor/geshi/geshi/src/geshi/rpmspec.php b/vendor/geshi/geshi/src/geshi/rpmspec.php
index 55d722d85..49c41069f 100644
--- a/vendor/geshi/geshi/src/geshi/rpmspec.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/04/27
*
* RPM Spec language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/rsplus.php b/vendor/geshi/geshi/src/geshi/rsplus.php
index 6c8771dd4..4dad7db53 100644
--- a/vendor/geshi/geshi/src/geshi/rsplus.php
+++ b/vendor/geshi/geshi/src/geshi/rsplus.php
@@ -7,7 +7,7 @@
* - 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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/03/28
*
* R language file for GeSHi.
@@ -374,7 +374,7 @@ $language_data = array (
'getS3method', 'getTxtProgressBar', 'glob2rx', 'head', 'head.matrix', 'help', 'help.request', 'help.search',
'help.start', 'history', 'index.search', 'install.packages', 'installed.packages', 'is.relistable',
'limitedLabels', 'loadhistory', 'localeToCharset', 'ls.str', 'lsf.str', 'make.packages.html', 'make.socket',
- 'makeRweaveLatexCodeRunner', 'memory.limit', 'memory.size', 'menu', 'methods', 'mirror2html', 'modifyList',
+ 'makeRweaveLatexCodeRunner', 'memory.limit', 'memory.size', 'menu', 'mirror2html', 'modifyList',
'new.packages', 'normalizePath', 'nsl', 'object.size', 'old.packages', 'package.contents', 'package.skeleton',
'packageDescription', 'packageStatus', 'page', 'person', 'personList', 'pico', 'prompt', 'promptData',
'promptPackage', 'rc.getOption', 'rc.options', 'rc.settings', 'rc.status', 'read.csv', 'read.csv2', 'read.delim',
diff --git a/vendor/geshi/geshi/src/geshi/ruby.php b/vendor/geshi/geshi/src/geshi/ruby.php
index b47953d8e..0b8aa333c 100644
--- a/vendor/geshi/geshi/src/geshi/ruby.php
+++ b/vendor/geshi/geshi/src/geshi/ruby.php
@@ -4,7 +4,7 @@
* --------
* Author: Moises Deniz
* Copyright: (c) 2007 Moises Deniz
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/03/21
*
* Ruby language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/rust.php b/vendor/geshi/geshi/src/geshi/rust.php
index 46d46c817..3fb5c363f 100644
--- a/vendor/geshi/geshi/src/geshi/rust.php
+++ b/vendor/geshi/geshi/src/geshi/rust.php
@@ -4,7 +4,7 @@
* --------
* Author: Edward Hart (edward.dan.hart@gmail.com)
* Copyright: (c) 2013 Edward Hart
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2013/10/20
*
* Rust language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/sas.php b/vendor/geshi/geshi/src/geshi/sas.php
index 31446d715..3d370be08 100644
--- a/vendor/geshi/geshi/src/geshi/sas.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/12/27
*
* SAS language file for GeSHi. Based on the sas vim file.
diff --git a/vendor/geshi/geshi/src/geshi/sass.php b/vendor/geshi/geshi/src/geshi/sass.php
index a4408a991..725435aae 100644
--- a/vendor/geshi/geshi/src/geshi/sass.php
+++ b/vendor/geshi/geshi/src/geshi/sass.php
@@ -4,7 +4,7 @@
* -------
* Author: Javier Eguiluz (javier.eguiluz@gmail.com)
* Copyright: (c) 2014 Javier Eguiluz (javier.eguiluz@gmail.com)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2014/05/10
*
* SASS language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/scala.php b/vendor/geshi/geshi/src/geshi/scala.php
index d288eb0c2..d9b0bac10 100644
--- a/vendor/geshi/geshi/src/geshi/scala.php
+++ b/vendor/geshi/geshi/src/geshi/scala.php
@@ -4,7 +4,7 @@
* ----------
* Author: Franco Lombardo (franco@francolombardo.net)
* Copyright: (c) 2008 Franco Lombardo, Benny Baumann
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/02/08
*
* Scala language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/scheme.php b/vendor/geshi/geshi/src/geshi/scheme.php
index 3230d5f58..e5a289af0 100644
--- a/vendor/geshi/geshi/src/geshi/scheme.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/30
*
* Scheme language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/scilab.php b/vendor/geshi/geshi/src/geshi/scilab.php
index 6b3552032..dbe8a39a6 100644
--- a/vendor/geshi/geshi/src/geshi/scilab.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/08/04
*
* SciLab language file for GeSHi.
@@ -182,7 +182,7 @@ $language_data = array (
'rubberbox', 'salesman', 'sample', 'samplef', 'samwr', 'save', 'save_format', 'save_graph', 'savehistory',
'savematfile', 'savewave', 'sca', 'scaling', 'scanf', 'scanf_conversion', 'scf', 'schur', 'sci_files',
'sci2exp', 'sci2for', 'sci2map', 'sciargs', 'SciComplex', 'SciComplexArray', 'SciDouble', 'SciDoubleArray',
- 'scilab', 'Scilab', 'ScilabEval', 'scilink', 'scipad', 'SciString', 'SciStringArray', 'sd2sci', 'sda', 'sdf',
+ 'ScilabEval', 'scilink', 'scipad', 'SciString', 'SciStringArray', 'sd2sci', 'sda', 'sdf',
'secto3d', 'segs_properties', 'semi', 'semicolon', 'semidef', 'sensi', 'set', 'set_posfig_dim',
'setbpt', 'setdiff', 'setenv', 'seteventhandler', 'setfield', 'sethomedirectory', 'setlanguage', 'setmenu',
'sfact', 'Sfgrayplot', 'Sgrayplot', 'sgrid', 'shortest_path', 'show_arcs', 'show_graph', 'show_nodes',
diff --git a/vendor/geshi/geshi/src/geshi/scl.php b/vendor/geshi/geshi/src/geshi/scl.php
index 761a0ac1e..17bad11b3 100644
--- a/vendor/geshi/geshi/src/geshi/scl.php
+++ b/vendor/geshi/geshi/src/geshi/scl.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Leonhard Hösch (leonhard.hoesch@siemens.com)
* Copyright: (c) 2008 by Leonhard Hösch (siemens.de)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/09/25
*
* SCL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/sdlbasic.php b/vendor/geshi/geshi/src/geshi/sdlbasic.php
index 170c665e8..b5fc9fa9f 100644
--- a/vendor/geshi/geshi/src/geshi/sdlbasic.php
+++ b/vendor/geshi/geshi/src/geshi/sdlbasic.php
@@ -4,7 +4,7 @@
* ------------
* Author: Roberto Rossi
* Copyright: (c) 2005 Roberto Rossi (http://rsoftware.altervista.org)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/08/19
*
* sdlBasic (http://sdlbasic.sf.net) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/smalltalk.php b/vendor/geshi/geshi/src/geshi/smalltalk.php
index d57e54302..faa07986f 100644
--- a/vendor/geshi/geshi/src/geshi/smalltalk.php
+++ b/vendor/geshi/geshi/src/geshi/smalltalk.php
@@ -4,7 +4,7 @@
* --------
* Author: Bananeweizen (Bananeweizen@gmx.de)
* Copyright: (c) 2005 Bananeweizen (www.bananeweizen.de)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/03/27
*
* Smalltalk language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/smarty.php b/vendor/geshi/geshi/src/geshi/smarty.php
index cb8833f89..62b37f2af 100644
--- a/vendor/geshi/geshi/src/geshi/smarty.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/07/10
*
* Smarty template language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/spark.php b/vendor/geshi/geshi/src/geshi/spark.php
index 30213ec2e..0d722e7a3 100644
--- a/vendor/geshi/geshi/src/geshi/spark.php
+++ b/vendor/geshi/geshi/src/geshi/spark.php
@@ -4,7 +4,7 @@
* -------
* Author: Phil Thornley (tux@inmail.cz)
* Copyright: (c) 2004 Phil Thornley (http://www.sparksure.com)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/08/22
*
* SPARK language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/sparql.php b/vendor/geshi/geshi/src/geshi/sparql.php
index 68aaa5fd6..d5847f2bf 100644
--- a/vendor/geshi/geshi/src/geshi/sparql.php
+++ b/vendor/geshi/geshi/src/geshi/sparql.php
@@ -4,7 +4,7 @@
* -------
* Author: Karima Rafes (karima.rafes@bordercloud.com)
* Copyright: (c) 2011 Bourdercloud.com
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/11/05
*
* SPARQL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/sql.php b/vendor/geshi/geshi/src/geshi/sql.php
index b38672933..73e2109f4 100644
--- a/vendor/geshi/geshi/src/geshi/sql.php
+++ b/vendor/geshi/geshi/src/geshi/sql.php
@@ -6,7 +6,7 @@
* Contributors:
* - Jürgen Thomas (Juergen.Thomas@vs-polis.de)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/04
*
* SQL language file for GeSHi.
@@ -69,7 +69,7 @@ $language_data = array (
'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',
+ 'DEFAULT', 'DEFERRABLE', 'DEFERRED', 'DELAYED', 'DELETE', 'DESC', 'DESCRIBE', 'DISTINCT', 'DOUBLE',
'DOMAIN', 'DROP',
'ELSE', 'ELSEIF', 'ENCLOSED', 'END', 'ESCAPED', 'EXCEPT', 'EXEC', 'EXECUTE', 'EXISTS',
'EXP', 'EXPLAIN', 'EXTRACT',
@@ -77,7 +77,7 @@ $language_data = array (
'FOREIGN', 'FROM', 'FULL', 'FUNCTION',
'GET', 'GROUP', 'GROUPING', 'GO', 'GOTO', 'GRANT', 'GRANTED',
'HAVING', 'HOUR',
- 'IDENTIFIED', 'IDENTITY', 'IF', 'IGNORE', 'IN', 'INCREMENT', 'INDEX', 'INFILE', 'INNER',
+ 'IDENTIFIED', 'IDENTITY', 'IF', 'IGNORE', 'IMMEDIATE', 'IN', 'INCREMENT', 'INDEX', 'INFILE', 'INITIALLY', 'INNER',
'INOUT', 'INPUT', 'INSERT', 'INT', 'INTEGER', 'INTERSECT', 'INTERSECTION', 'INTERVAL',
'INTO', 'IS',
'JOIN',
diff --git a/vendor/geshi/geshi/src/geshi/sshconfig.php b/vendor/geshi/geshi/src/geshi/sshconfig.php
new file mode 100644
index 000000000..d38cc4628
--- /dev/null
+++ b/vendor/geshi/geshi/src/geshi/sshconfig.php
@@ -0,0 +1,165 @@
+<?php
+/*************************************************************************************
+ * sshconfig.php
+ * --------
+ * Author: Kevin Ernst (kevin.ernst -at- cchmc.org)
+ * Copyright: (c) 2017 Kevin Ernst
+ * Release Version: 1.0.9.1
+ * Date Started: 2017/12/01
+ *
+ * OpenSSH config file (~/.ssh/config) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2017/12/02 (1.0.0)
+ * - First release; couldn't figure out how to separately highlight negated
+ * hostnames/wildcards, but it's good enough for a basic ~/.ssh/config
+ *
+ *************************************************************************************
+ *
+ * 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' => 'sshconfig',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(0 => '/^\s*#.*?$/m'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 0 => array(
+ 'Host',
+ ),
+ 1 => array(
+ "Hostname", "Match", "AddKeysToAgent", "AddressFamily", "BatchMode",
+ "BindAddress", "CanonicalDomains", "CanonicalizeFallbackLocal",
+ "CanonicalizeHostname", "CanonicalizeMaxDots",
+ "CanonicalizePermittedCNAMEs", "CertificateFile",
+ "ChallengeResponseAuthentication", "CheckHostIP", "Ciphers",
+ "ClearAllForwardings", "Compression", "ConnectionAttempts",
+ "ConnectTimeout", "ControlMaster", "ControlPath", "ControlPersist",
+ "DynamicForward", "EnableSSHKeysign", "EscapeChar",
+ "ExitOnForwardFailure", "FingerprintHash", "ForwardAgent",
+ "ForwardX11", "ForwardX11Timeout", "ForwardX11Trusted",
+ "GatewayPorts", "GlobalKnownHostsFile", "GSSAPIAuthentication",
+ "GSSAPIDelegateCredentials", "HashKnownHosts",
+ "HostbasedAuthentication", "HostbasedKeyTypes", "HostKeyAlgorithms",
+ "HostKeyAlias", "HostName", "IdentitiesOnly", "IdentityAgent",
+ "IdentityFile", "IgnoreUnknown", "Include", "IPQoS",
+ "KbdInteractiveAuthentication", "KbdInteractiveDevices",
+ "KexAlgorithms", "LocalCommand", "LocalForward", "LogLevel", "MACs",
+ "NoHostAuthenticationForLocalhost", "NumberOfPasswordPrompts",
+ "PasswordAuthentication", "PermitLocalCommand", "PKCS11Provider",
+ "Port", "PreferredAuthentications", "ProxyCommand", "ProxyJump",
+ "ProxyUseFdpass", "PubkeyAcceptedKeyTypes", "PubkeyAuthentication",
+ "RekeyLimit", "RemoteCommand", "RemoteForward", "RequestTTY",
+ "RevokedHostKeys", "SendEnv", "ServerAliveCountMax",
+ "ServerAliveInterval", "StreamLocalBindMask",
+ "StreamLocalBindUnlink", "StrictHostKeyChecking", "SyslogFacility",
+ "TCPKeepAlive", "Tunnel", "TunnelDevice", "UpdateHostKeys",
+ "UsePrivilegedPort", "User", "UserKnownHostsFile",
+ "VerifyHostKeyDNS", "VisualHostKey", "XAuthLocation",
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '%h', '%p',
+ ),
+ // these get clobbered by regexes anyway
+ //1 => array( '!'),
+ //2 => array( '*')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 0 => true,
+ 1 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 0 => 'color: green; font-weight: bold',
+ 1 => 'color: blue',
+ ),
+ 'COMMENTS' => array(
+ 0 => '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(
+ 0 => 'color: lightseagreen; font-weight: bold',
+ // these two get clobbered by regexes below anyway
+ 1 => 'color: red; font-weight: bold',
+ 1 => 'color: darkmagenta; font-weight: bold',
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: darkmagenta;',
+ //1 => 'color: red; font-weight: bold',
+ 2 => 'color: magenta; font-weight: bold',
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ 0=> 'https://man.openbsd.org/ssh_config#{FNAME}',
+ 1=> 'https://man.openbsd.org/ssh_config#{FNAME}',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // Hostnames
+ 0 => array(
+ GESHI_SEARCH => '(Host(name)?.*?)(?<=\s)(.*)',
+ GESHI_REPLACE => '\\3',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ // Negated hostanmes (doesn't work)
+ //1 => array(
+ // GESHI_SEARCH => '([([{,<+*-\/=\s!]|&lt;)(?!(?:PIPE|SEMI|DOT|NUM|REG3XP\d*)\W)(![a-zA-Z*]\w*)(?!\w)',
+ // GESHI_SEARCH => '(?<=!)(.*?)',
+ // GESH_REPLACE => '\\2',
+ // GESHI_MODIFIERS => '',
+ // GESHI_BEFORE => '\\1',
+ // GESHI_AFTER => ''
+ // ),
+ // Wildcards
+ 2 => '\*'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
diff --git a/vendor/geshi/geshi/src/geshi/standardml.php b/vendor/geshi/geshi/src/geshi/standardml.php
index 9979ac5e4..c48494c58 100644
--- a/vendor/geshi/geshi/src/geshi/standardml.php
+++ b/vendor/geshi/geshi/src/geshi/standardml.php
@@ -4,7 +4,7 @@
* ----------
* Author: eldesh (nephits@gmail.com)
* Copyright: (c) 2014 eldesh (http://d.hatena.ne.jp/eldesh/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2014/02/04
*
* SML (StandardML'97) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/stonescript.php b/vendor/geshi/geshi/src/geshi/stonescript.php
index 6ea1971d8..cdf89919d 100644
--- a/vendor/geshi/geshi/src/geshi/stonescript.php
+++ b/vendor/geshi/geshi/src/geshi/stonescript.php
@@ -4,7 +4,7 @@
* --------
* Author: Archimmersion ( based on ruby.php by Moises Deniz )
* Copyright: (c) 2011 Archimmersion ( http://www.archimmersion.com )
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/03/30
*
* StoneScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/swift.php b/vendor/geshi/geshi/src/geshi/swift.php
index 4069035f5..93091bbe4 100644
--- a/vendor/geshi/geshi/src/geshi/swift.php
+++ b/vendor/geshi/geshi/src/geshi/swift.php
@@ -4,7 +4,7 @@
* ----------
* Author: Ken Woo (ikenwoo@gmail.com)
* Copyright: (c) 2015 Ken Woo
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2015/05/20
*
* Swift language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/systemverilog.php b/vendor/geshi/geshi/src/geshi/systemverilog.php
index 24ed3439b..6d3124b36 100644
--- a/vendor/geshi/geshi/src/geshi/systemverilog.php
+++ b/vendor/geshi/geshi/src/geshi/systemverilog.php
@@ -4,7 +4,7 @@
* -------
* Author: Sean O'Boyle
* Copyright: (C) 2008 IntelligentDV
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/06/25
*
* SystemVerilog IEEE 1800-2009(draft8) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/tcl.php b/vendor/geshi/geshi/src/geshi/tcl.php
index 73b854eb5..ddaf13499 100644
--- a/vendor/geshi/geshi/src/geshi/tcl.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/05/05
*
* TCL/iTCL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/tclegg.php b/vendor/geshi/geshi/src/geshi/tclegg.php
index cc787e8c5..725e1e213 100644
--- a/vendor/geshi/geshi/src/geshi/tclegg.php
+++ b/vendor/geshi/geshi/src/geshi/tclegg.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: Reid van Melle (rvanmelle@gmail.com)
* Copyright: (c) 2004 Reid van Melle (sorry@nowhere)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/05/05
*
* TCL/iTCL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/teraterm.php b/vendor/geshi/geshi/src/geshi/teraterm.php
index 7c360029d..9f04b7bcd 100644
--- a/vendor/geshi/geshi/src/geshi/teraterm.php
+++ b/vendor/geshi/geshi/src/geshi/teraterm.php
@@ -4,7 +4,7 @@
* --------
* Author: Boris Maisuradze (boris at logmett.com)
* Copyright: (c) 2008 Boris Maisuradze (http://logmett.com)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/09/26
*
* Tera Term Macro language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/texgraph.php b/vendor/geshi/geshi/src/geshi/texgraph.php
index ed579555b..1f82d4280 100644
--- a/vendor/geshi/geshi/src/geshi/texgraph.php
+++ b/vendor/geshi/geshi/src/geshi/texgraph.php
@@ -4,7 +4,7 @@
* -----------
* Author: Patrick Fradin (patrick.fradin@gmail.com)
* Copyright: (c) 2011 Patrick Fradin
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011-09-18
*
* TeXgraph language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/text.php b/vendor/geshi/geshi/src/geshi/text.php
index 5b97cff39..217e9c073 100644
--- a/vendor/geshi/geshi/src/geshi/text.php
+++ b/vendor/geshi/geshi/src/geshi/text.php
@@ -4,7 +4,7 @@
* --------
* Author: Sean Hanna (smokingrope@gmail.com)
* Copyright: (c) 2006 Sean Hanna
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 04/23/2006
*
* Standard Text File (No Syntax Highlighting).
diff --git a/vendor/geshi/geshi/src/geshi/thinbasic.php b/vendor/geshi/geshi/src/geshi/thinbasic.php
index d4c91e246..a8b413e37 100644
--- a/vendor/geshi/geshi/src/geshi/thinbasic.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/05/12
*
* thinBasic language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/tsql.php b/vendor/geshi/geshi/src/geshi/tsql.php
index e333c9712..a20ac91b7 100644
--- a/vendor/geshi/geshi/src/geshi/tsql.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/11/22
*
* T-SQL language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/twig.php b/vendor/geshi/geshi/src/geshi/twig.php
index 2936e0f1e..62b193d1e 100644
--- a/vendor/geshi/geshi/src/geshi/twig.php
+++ b/vendor/geshi/geshi/src/geshi/twig.php
@@ -4,7 +4,7 @@
* ----------
* Author: Keyvan Akbary (keyvan@kiwwito.com)
* Copyright: (c) 2011 Keyvan Akbary (http://www.kiwwito.com/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/12/05
*
* Twig template language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/typoscript.php b/vendor/geshi/geshi/src/geshi/typoscript.php
index c52ba91ea..4fa2fd9a4 100644
--- a/vendor/geshi/geshi/src/geshi/typoscript.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/07/29
*
* TypoScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/unicon.php b/vendor/geshi/geshi/src/geshi/unicon.php
index bd56f5089..736c29d48 100644
--- a/vendor/geshi/geshi/src/geshi/unicon.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/04/20
*
* Unicon the Unified Extended Dialect of Icon language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/upc.php b/vendor/geshi/geshi/src/geshi/upc.php
index 0b8b4859b..228940d08 100644
--- a/vendor/geshi/geshi/src/geshi/upc.php
+++ b/vendor/geshi/geshi/src/geshi/upc.php
@@ -8,7 +8,7 @@
* - Jack Lloyd (lloyd@randombit.net)
* - Michael Mol (mikemol@gmail.com)
* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/04
*
* UPC language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/urbi.php b/vendor/geshi/geshi/src/geshi/urbi.php
index f87e6c17a..236a33177 100644
--- a/vendor/geshi/geshi/src/geshi/urbi.php
+++ b/vendor/geshi/geshi/src/geshi/urbi.php
@@ -4,7 +4,7 @@
* -------
* Author: Alexandre Morgand (morgand.alexandre@gmail.com)
* Copyright: (c) 2011 Morgand (http://gostai.com)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2011/09/10
*
* Urbi language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/uscript.php b/vendor/geshi/geshi/src/geshi/uscript.php
index 216eaff71..eb385dbd2 100644
--- a/vendor/geshi/geshi/src/geshi/uscript.php
+++ b/vendor/geshi/geshi/src/geshi/uscript.php
@@ -4,7 +4,7 @@
* ---------------------------------
* Author: pospi (pospi@spadgos.com)
* Copyright: (c) 2007 pospi (http://pospi.spadgos.com)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/05/21
*
* UnrealScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/vala.php b/vendor/geshi/geshi/src/geshi/vala.php
index fd8ce68f2..d69354d81 100644
--- a/vendor/geshi/geshi/src/geshi/vala.php
+++ b/vendor/geshi/geshi/src/geshi/vala.php
@@ -4,7 +4,7 @@
* ----------
* Author: Nicolas Joseph (nicolas.joseph@valaide.org)
* Copyright: (c) 2009 Nicolas Joseph
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/04/29
*
* Vala language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/vb.php b/vendor/geshi/geshi/src/geshi/vb.php
index 2d2a7b669..3a4405315 100644
--- a/vendor/geshi/geshi/src/geshi/vb.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/08/30
*
* Visual Basic language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/vbnet.php b/vendor/geshi/geshi/src/geshi/vbnet.php
index 058b9c460..3932c5208 100644
--- a/vendor/geshi/geshi/src/geshi/vbnet.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/06/04
*
* VB.NET language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/vbscript.php b/vendor/geshi/geshi/src/geshi/vbscript.php
index 4f7366469..66796ec80 100644
--- a/vendor/geshi/geshi/src/geshi/vbscript.php
+++ b/vendor/geshi/geshi/src/geshi/vbscript.php
@@ -6,7 +6,7 @@
* Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org),
* Nigel McNie (http://qbnz.com/highlighter),
* Rory Prendergast (http://www.tanium.com)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2012/08/20
*
* VBScript language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/vedit.php b/vendor/geshi/geshi/src/geshi/vedit.php
index fa79420fb..4a6e1c6dd 100644
--- a/vendor/geshi/geshi/src/geshi/vedit.php
+++ b/vendor/geshi/geshi/src/geshi/vedit.php
@@ -4,7 +4,7 @@
* --------
* Author: Pauli Lindgren (pauli0212@yahoo.com)
* Copyright: (c) 2009 Pauli Lindgren (http://koti.mbnet.fi/pkl/)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/12/16
*
* Vedit macro language language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/verilog.php b/vendor/geshi/geshi/src/geshi/verilog.php
index 863230400..afcd91e46 100644
--- a/vendor/geshi/geshi/src/geshi/verilog.php
+++ b/vendor/geshi/geshi/src/geshi/verilog.php
@@ -4,7 +4,7 @@
* -----------
* Author: Günter Dannoritzer <dannoritzer@web.de>
* Copyright: (C) 2008 Günter Dannoritzer
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/05/28
*
* Verilog language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/vhdl.php b/vendor/geshi/geshi/src/geshi/vhdl.php
index edb0fd611..9ff11ec43 100644
--- a/vendor/geshi/geshi/src/geshi/vhdl.php
+++ b/vendor/geshi/geshi/src/geshi/vhdl.php
@@ -6,7 +6,7 @@
* Contributors:
* - Kevin Thibedeau (kevinpt@yahoo.com)
* Copyright: (c) 2005 Alexander Krause
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/06/15
*
* VHDL (VHSICADL, very high speed integrated circuit HDL) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/vim.php b/vendor/geshi/geshi/src/geshi/vim.php
index 39ec83137..6f959a095 100644
--- a/vendor/geshi/geshi/src/geshi/vim.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/10/19
*
* Vim scripting language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/visualfoxpro.php b/vendor/geshi/geshi/src/geshi/visualfoxpro.php
index 9e43eaddf..cda3d5abe 100644
--- a/vendor/geshi/geshi/src/geshi/visualfoxpro.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/09/17
*
* Visual FoxPro language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/visualprolog.php b/vendor/geshi/geshi/src/geshi/visualprolog.php
index 72ddb4510..edb186c37 100644
--- a/vendor/geshi/geshi/src/geshi/visualprolog.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/11/20
*
* Visual Prolog language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/whitespace.php b/vendor/geshi/geshi/src/geshi/whitespace.php
index 47ca8fd91..c11f69fd6 100644
--- a/vendor/geshi/geshi/src/geshi/whitespace.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2009/10/31
*
* Whitespace language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/whois.php b/vendor/geshi/geshi/src/geshi/whois.php
index 5ca47e173..e429d2531 100644
--- a/vendor/geshi/geshi/src/geshi/whois.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/09/14
*
* Whois response (RPSL format) language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/winbatch.php b/vendor/geshi/geshi/src/geshi/winbatch.php
index aa1ce5268..618fb6e26 100644
--- a/vendor/geshi/geshi/src/geshi/winbatch.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2006/05/19
*
* WinBatch language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/wolfram.php b/vendor/geshi/geshi/src/geshi/wolfram.php
new file mode 100644
index 000000000..9ea9e3cee
--- /dev/null
+++ b/vendor/geshi/geshi/src/geshi/wolfram.php
@@ -0,0 +1,967 @@
+<?php
+/******************************************************************************
+ * wolfram.php
+ * ----------
+ * Author: Mysterious Light (youngmysteriouslight@gmail.com)
+ * Copyright: (c) 2018 Mysterious Light (youngmysteriouslight@gmail.com)
+ * Release Version: 1.0.9.1
+ * Date Started: 2018/01/12
+ *
+ * Wolfram language file for GeSHi.
+ *
+ ******************************************************************************
+ *
+ * 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' => 'Wolfram',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('(*' => '*)'),
+ 'COMMENT_REGEXP' => array(
+ 2 => '/\\(\\*.*\\*\\)/',
+ 3 => '/\\\\\\[\\w+]/'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ /* main wolfram keywords */
+ 1 => array(
+ 'AbelianGroup', '$Aborted', 'AbortKernels', 'Abort', 'Abs', 'All',
+ 'AbortProtect', 'AbsoluteCurrentValue', 'AbsoluteDashing', 'AddTo',
+ 'AbsoluteFileName', 'AbsoluteOptions', 'AbsolutePointSize', 'And',
+ 'AbsoluteThickness', 'AbsoluteTime', 'AbsoluteTiming', 'Accuracy',
+ 'AccountingForm', 'Accumulate', 'AccuracyGoal', 'ActionMenu', 'C',
+ 'Active', 'ActiveStyle', 'AcyclicGraphQ', 'AddOnHelpPath', 'Alias',
+ 'AdjacencyGraph', 'AdjacencyMatrix', 'AdjustmentBox', 'AiryAi',
+ 'AffineTransform', 'AiryAiPrime', 'AiryAiZero', 'AiryBi', 'AngerJ',
+ 'AiryBiPrime', 'AiryBiZero', 'AlgebraicIntegerQ', 'AlgebraicRules',
+ 'AlgebraicNumberDenominator', 'AlgebraicNumber', 'Algebraics', 'D',
+ 'AlgebraicNumberNorm', 'AlgebraicNumberPolynomial', 'Alignment',
+ 'AlgebraicNumberTrace', 'AlgebraicUnitQ', 'AlignmentPoint', 'Arg',
+ 'AllowGroupClose', 'AllowInlineCells', 'AllowReverseGroupClose',
+ 'AllowScriptLevelChange', 'AlphaChannel', 'AlternatingGroup', 'Do',
+ 'AlternativeHypothesis', 'Alternatives', 'AmbientLight', 'Animate',
+ 'AnchoredSearch', 'AndersonDarlingTest', 'AngleBracket', 'Annuity',
+ 'AnimationCycleOffset', 'AnimationCycleRepetitions', 'Animator',
+ 'AnimationDirection', 'AnimationDisplayTime', 'AnimationRate', 'E',
+ 'AnimationRepetitions', 'AnimationRunning', 'Annotation', 'Apart',
+ 'AnnuityDue', 'Antialiasing', 'ApartSquareFree', 'Appearance', 'I',
+ 'AppearanceElements', 'AppellF1', 'Append', 'AppendTo', 'Apply',
+ 'ArcCosh', 'ArcCos', 'ArcCoth', 'ArcCot', 'ArcCsch', 'ArcCsc', 'N',
+ 'ArcSech', 'ArcSec', 'ArcSinDistribution', 'ArcSinh', 'ArcSin',
+ 'ArcTanh', 'ArcTan', 'ArgMax', 'ArgMin', 'ArithmeticGeometricMean',
+ 'ArrayComponents', 'ArrayDepth', 'ArrayFlatten', 'Array', 'ArrayQ',
+ 'ArrayPad', 'ArrayPlot', 'ArrayRules', 'Arrowheads', 'Arrow', 'Dt',
+ 'AspectRatioFixed', 'AspectRatio', '$AssertFunction', 'Assert',
+ 'Assuming', '$Assumptions', 'Assumptions', 'AstronomicalData', 'O',
+ 'Asynchronous', 'AtomQ', 'Attributes', 'AutoAction', 'AutoDelete',
+ 'AugmentedSymmetricPolynomial', 'AutoGeneratedPackage', 'AxesEdge',
+ 'AutoIndent', 'AutoItalicWords', 'AutoloadPath', 'Automatic', 'If',
+ 'AutoMultiplicationSymbol', 'AutoOpenNotebooks', 'AutoScroll',
+ 'AutoOpenPalettes', 'AutorunSequencing', 'AutoSpacing', 'Axes',
+ 'AxesLabel', 'AxesOrigin', 'AxesStyle', 'Axis', 'Background', 'Im',
+ 'BabyMonsterGroupB', 'Back', 'Backslash', 'Backward', 'Band', 'In',
+ 'BarabasiAlbertGraphDistribution', 'BarChart3D', 'BarChart', 'Cap',
+ 'BarnesG', 'BarOrigin', 'BarSpacing', '$BaseDirectory', 'BaseForm',
+ 'Baseline', 'BaselinePosition', 'BaseStyle', '$BatchInput', 'Beep',
+ '$BatchOutput', 'BatesDistribution', 'BattleLemarieWavelet', 'CDF',
+ 'Because', 'BeckmannDistribution', 'BeginDialogPacket', 'Begin',
+ 'BeginPackage', 'BellB', 'BellY', 'BenfordDistribution', 'BesselI',
+ 'BeniniDistribution', 'BenktanderGibratDistribution', 'BernoulliB',
+ 'BenktanderWeibullDistribution', 'BernoulliDistribution', 'Beta',
+ 'BernoulliGraphDistribution', 'BernsteinBasis', 'BesselJ', 'BitOr',
+ 'BesselJZero', 'BesselK', 'BesselY', 'BesselYZero', 'BezierCurve',
+ 'BetaBinomialDistribution', 'BetaDistribution', 'BetaRegularized',
+ 'BetaNegativeBinomialDistribution', 'BetaPrimeDistribution', 'Cos',
+ 'BetweennessCentrality', 'BezierFunction', 'BilateralFilter', 'On',
+ 'Binarize', 'BinaryFormat', 'BinaryImageQ', 'BinaryReadList', 'Or',
+ 'BinaryRead', 'BinaryWrite', 'BinCounts', 'BinLists', 'Binomial',
+ 'BinomialDistribution', 'BinormalDistribution', 'BipartiteGraphQ',
+ 'BiorthogonalSplineWavelet', 'BirnbaumSaundersDistribution', 'Cot',
+ 'BitAnd', 'BitClear', 'BitGet', 'BitLength', 'BitNot', 'BitSet',
+ 'BitShiftLeft', 'BitShiftRight', 'BitXor', 'Black', 'Blank', 'Csc',
+ 'BlankNullSequence', 'BlankSequence', 'Blend', 'Block', 'Blue',
+ 'BlockRandom', 'Blur', 'BodePlot', 'Bold', 'Bookmarks', 'Booleans',
+ 'BooleanConvert', 'BooleanCountingFunction', 'BooleanFunction',
+ 'BooleanGraph', 'BooleanMaxterms', 'BooleanMinimize', 'Boole',
+ 'BooleanMinterms', 'BooleanTable', 'BooleanVariables', 'Bottom',
+ 'BorderDimensions', 'BorelTannerDistribution', 'BoundaryStyle',
+ 'BottomHatTransform', 'BoxBaselineShift', 'BoxData', 'Boxed', 'Pi',
+ 'BoxFormFormatTypes', 'BoxFrame', 'BoxMargins', 'BoxMatrix', 'Cup',
+ 'BoxRatios', 'BoxStyle', 'BoxWhiskerChart', 'BracketingBar', 'Del',
+ 'BrayCurtisDistance', 'BreadthFirstScan', 'Break', 'Brown', 'Byte',
+ 'BrownForsytheTest', 'BSplineBasis', 'BSplineCurve', 'BubbleChart',
+ 'BSplineFunction', 'BSplineSurface', 'BubbleChart3D', 'ButtonBar',
+ 'BubbleScale', 'BubbleSizes', 'ButterflyGraph', 'ButtonBox', 'Det',
+ 'ButtonBoxOptions', 'ButtonData', 'ButtonEvaluator', 'ButtonFrame',
+ 'ButtonExpandable', 'ButtonFunction', 'ButtonMargins', 'Button',
+ 'ButtonMinHeight', 'ButtonNotebook', 'ButtonNote', 'ButtonSource',
+ 'ButtonStyle', 'ByteCount', '$ByteOrdering', 'ByteOrdering', 'Dot',
+ 'CallPacket', 'CanberraDistance', 'CancelButton', '$Canceled',
+ 'Cancel', 'CandlestickChart', 'CapForm', 'CapitalDifferentialD',
+ 'CarmichaelLambda', 'Cases', 'Cashflow', 'Casoratian', 'Catalan',
+ 'CatalanNumber', 'Catch', 'CauchyDistribution', 'CayleyGraph',
+ 'CDFWavelet', 'Ceiling', 'CellArray', 'CellAutoOverwrite', 'Cell',
+ 'CellBaseline', 'CellBracketOptions', 'CellChangeTimes', 'Center',
+ 'CellContext', 'CellDingbat', 'CellDynamicExpression', 'CellFrame',
+ 'CellEditDuplicate', 'CellEpilog', 'CellEvaluationDuplicate', 'Re',
+ 'CellEvaluationFunction', 'CellEventActions', 'CellFrameColor',
+ 'CellFrameLabelMargins', 'CellFrameLabels', 'CellFrameMargins',
+ 'CellGroupData', 'CellGrouping', 'CellGroupingRules', 'CellGroup',
+ 'CellHorizontalScrolling', 'CellLabelAutoDelete', 'CellLabel',
+ 'CellLabelMargins', 'CellLabelPositioning', 'CellMargins', 'CForm',
+ 'CellOpen', 'CellPrint', 'CellProlog', 'CellSize', 'CellTags',
+ 'CellularAutomaton', 'CensoredDistribution', 'Censoring', 'Check',
+ 'CenterDot', 'CentralMomentGeneratingFunction', 'CentralMoment',
+ 'ChampernowneNumber', 'ChanVeseBinarize', '$CharacterEncoding',
+ 'CharacterEncoding', '$CharacterEncodings', 'Character', 'Chop',
+ 'CharacterEncodingsPath', 'CharacteristicFunction', 'Characters',
+ 'CharacteristicPolynomial', 'CharacterRange', 'ChartBaseStyle',
+ 'ChartElementFunction', 'ChartElements', 'ChartLabels', 'Checkbox',
+ 'ChartLayout', 'ChartLegends', 'ChartStyle', 'ChebyshevDistance',
+ 'ChebyshevT', 'ChebyshevU', 'CheckAbort', 'CheckboxBar', 'Circle',
+ 'ChemicalData', 'ChessboardDistance', 'ChiDistribution', 'Clear',
+ 'ChineseRemainder', 'ChiSquareDistribution', 'ChoiceButtons', 'Tr',
+ 'ChoiceDialog', 'CholeskyDecomposition', 'CircleDot', 'CirclePlus',
+ 'CircleMinus', 'CircleTimes', 'CirculantGraph', 'CityData', 'Clip',
+ 'ClearAll', 'ClearAttributes', 'ClearSystemCache', 'ClebschGordan',
+ 'ClickPane', 'ClipFill', 'ClippingStyle', 'Clock', 'CloseKernels',
+ 'Close', 'ClosenessCentrality', 'ClosingAutoSave', 'Closing',
+ 'ClusteringComponents', 'CMYKColor', 'CoefficientArrays', 'Colon',
+ 'CoefficientList', 'Coefficient', 'CoefficientRules', 'Collect',
+ 'CoifletWavelet', 'ColorCombine', 'ColorConvert', 'ColorData',
+ 'ColorDataFunction', 'ColorFunction', 'ColorFunctionScaling',
+ 'Colorize', 'ColorNegate', 'ColorOutput', 'ColorQuantize', 'Cone',
+ 'ColorRules', 'ColorSelectorSettings', 'ColorSeparate', 'Column',
+ 'ColorSetter', 'ColorSlider', 'ColorSpace', 'ColumnAlignments',
+ 'ColumnForm', 'ColumnLines', 'ColumnsEqual', 'ColumnSpacings',
+ 'ColumnWidths', '$CommandLine', 'CommonDefaultFormatTypes', 'Cosh',
+ 'CommonestFilter', 'Commonest', 'CompilationOptions', 'Compiled',
+ '$CompilationTarget', 'CompilationTarget', 'CompiledFunction',
+ 'Compile', 'Complement', 'CompleteGraph', 'CompleteGraphQ', 'Coth',
+ 'CompleteKaryTree', 'Complexes', 'ComplexExpand', 'Complex', 'End',
+ 'ComplexInfinity', 'ComplexityFunction', 'ComponentMeasurements',
+ 'ComposeList', 'Compose', 'ComposeSeries', 'Composition', 'Count',
+ 'CompoundExpression', 'Compress', 'ConditionalExpression', 'Cross',
+ 'Conditioned', 'Condition', 'ConfidenceLevel', 'ConfigurationPath',
+ '$ConfiguredKernels', 'Congruent', 'Conjugate', 'Conjunction',
+ 'ConjugateTranspose', 'ConnectedComponents', 'ConnectedGraphQ',
+ 'ConoverTest', 'ConstantArray', 'Constant', 'Constants', 'Context',
+ 'ConstrainedMax', 'ConstrainedMin', 'ContentPadding', '$Context',
+ 'ContentSelectable', 'ContentSize', '$ContextPath', 'Contexts',
+ 'ContextToFileName', 'ContinuedFractionK', 'ContinuedFraction',
+ 'Continue', 'ContinuousAction', 'ContinuousTimeModelQ', 'Contours',
+ 'ContinuousWaveletData', 'ContinuousWaveletTransform', 'Control',
+ 'ContourDetect', 'ContourGraphics', 'ContourLabels', 'ContourPlot',
+ 'ContourLevels', 'ContourLines', 'ContourPlot3D', 'ContourShading',
+ 'ContourSpacing', 'ContourStyle', 'ContraharmonicMean', 'Convolve',
+ 'ControlActive', '$ControlActiveSetting', 'ControllabilityGramian',
+ 'ControllabilityMatrix', 'ControllableDecomposition', 'CoprimeQ',
+ 'ControllableModelQ', 'ControllerInformation', 'ControllerLinking',
+ 'ControllerManipulate', 'ControllerMethod', 'ControllerPath',
+ 'ControllerState', 'ControlPlacement', 'ControlsRendering', 'Csch',
+ 'ControlType', 'Convergents', 'ConversionOptions', 'Coproduct',
+ 'ConversionRules', 'ConwayGroupCo1', 'ConwayGroupCo2', 'Copyable',
+ 'ConwayGroupCo3', 'CoordinatesToolOptions', 'CopulaDistribution',
+ 'CopyDirectory', 'CopyFile', 'CopyToClipboard', 'CornerFilter',
+ 'CornerNeighbors', 'CorrelationDistance', 'Correlation', 'Cubics',
+ 'CoshIntegral', 'CosineDistance', 'CosIntegral', 'CounterFunction',
+ 'CounterAssignments', 'CounterIncrements', 'CountRoots', 'Cuboid',
+ 'CounterStyleMenuListing', 'CountryData', 'Covariance', 'Cumulant',
+ 'CovarianceEstimatorFunction', 'CramerVonMisesTest', 'CrossMatrix',
+ 'CreateArchive', 'CreateDialog', 'CreateDirectory', 'CreateWindow',
+ 'CreateDocument', 'CreateIntermediateDirectories', 'CreatePalette',
+ 'CreateScheduledTask', '$CreationDate', 'CriticalSection', 'Cyan',
+ 'CrossingDetect', 'CumulantGeneratingFunction', 'CupCap', 'Cycles',
+ 'CurrentImage', '$CurrentLink', 'CurrentValue', 'CurveClosed',
+ 'CurvatureFlowFilter', 'CycleGraph', 'CyclicGroup', 'Cyclotomic',
+ 'Cylinder', 'CylindricalDecomposition', 'DagumDistribution', 'Erf',
+ 'DamerauLevenshteinDistance', 'Darker', 'Dashed', 'Dashing', 'Exp',
+ 'DataDistribution', 'DataRange', 'DataReversed', 'DateDifference',
+ 'DateFunction', 'DateListLogPlot', 'DateList', 'DateListPlot',
+ 'Date', 'DatePattern', 'DatePlus', '$DateStringFormat', 'DawsonF',
+ 'DateString', 'DateTicksFormat', 'DaubechiesWavelet', 'Debug',
+ 'DavisDistribution', 'DeBruijnGraph', 'DeclarePackage', 'Default',
+ 'Decompose', 'Decrement', 'DedekindEta', 'DefaultAxesStyle', 'Fit',
+ 'DefaultBaseStyle', 'DefaultBoxStyle', 'DefaultButton', 'Defer',
+ 'DefaultColor', 'DefaultDuplicateCellStyle', 'DefaultDuration',
+ 'DefaultElement', 'DefaultFaceGridsStyle', 'DefaultFieldHintStyle',
+ '$DefaultFont', 'DefaultFont', 'DefaultFontProperties', 'Degree',
+ 'DefaultFormatType', 'DefaultFrameStyle', 'DefaultFrameTicksStyle',
+ 'DefaultGridLinesStyle', '$DefaultImagingDevice', 'DefaultOptions',
+ 'DefaultInlineFormatType', 'DefaultLabelStyle', 'DefaultMenuStyle',
+ 'DefaultNaturalLanguage', 'DefaultNewCellStyle', 'DefaultNotebook',
+ 'DefaultNewInlineCellStyle', 'DefaultStyleDefinitions', 'Delete',
+ 'DefaultTicksStyle', 'Definition', 'DegreeCentrality', 'Deletable',
+ 'DegreeGraphDistribution', 'Deinitialization', 'DeleteCases',
+ 'DeleteBorderComponents', 'DeleteContents', 'DeleteDirectory',
+ 'DeleteDuplicates', 'DeleteFile', 'DeleteSmallComponents', 'Depth',
+ 'DeletionWarning', 'DelimiterFlashTime', 'DelimiterMatching',
+ 'Delimiter', 'Denominator', 'DensityGraphics', 'DensityHistogram',
+ 'DensityPlot', 'DependentVariables', 'Deployed', 'Deploy', 'Disk',
+ 'DepthFirstScan', 'DerivativeFilter', 'Derivative', 'DesignMatrix',
+ 'DGaussianWavelet', 'DiacriticalPositioning', 'DiagonalMatrix',
+ 'Diagonal', 'DialogInput', 'Dialog', 'DialogNotebook', 'Diamond',
+ 'DialogProlog', 'DialogReturn', 'DialogSymbols', 'DiamondMatrix',
+ 'DiceDissimilarity', 'DictionaryLookup', 'DifferenceDelta', 'Drop',
+ 'DifferenceRoot', 'DifferenceRootReduce', 'Differences', 'DigitQ',
+ 'DifferentialD', 'DifferentialRoot', 'DifferentialRootReduce',
+ 'DigitBlock', 'DigitCharacter', 'DigitCount', 'DihedralGroup',
+ 'Dilation', 'Dimensions', 'DiracComb', 'DiracDelta', 'Direction',
+ 'DirectedEdge', 'DirectedEdges', 'DirectedGraph', 'DirectedGraphQ',
+ 'DirectedInfinity', 'Directive', 'DirectoryName', 'Directory',
+ 'DirectoryQ', 'DirectoryStack', 'DirichletCharacter', 'DirichletL',
+ 'DirichletConvolve', 'DirichletDistribution', 'DirichletTransform',
+ 'DiscreteConvolve', 'DiscreteDelta', 'DiscreteIndicator', 'Divide',
+ 'DiscreteLQEstimatorGains', 'DiscreteLQRegulatorGains', 'Dispatch',
+ 'DiscreteLyapunovSolve', 'DiscretePlot3D', 'DiscretePlot', 'Dump',
+ 'DiscreteRatio', 'DiscreteRiccatiSolve', 'DiscreteShift', 'Dotted',
+ 'DiscreteTimeModelQ', 'DiscreteUniformDistribution', 'Disjunction',
+ 'DiscreteWaveletData', 'DiscreteWaveletPacketTransform', 'Display',
+ 'DiscreteWaveletTransform', 'Discriminant', 'DiskMatrix', 'DSolve',
+ 'DispersionEstimatorFunction', 'DisplayAllSteps', 'DisplayForm',
+ 'DisplayEndPacket', '$DisplayFunction', 'DisplayFunction', '$Echo',
+ '$Display', 'DisplayPacket', 'DisplayString', 'DistanceFunction',
+ 'DistanceTransform', '$DistributedContexts', 'DistributedContexts',
+ 'DistributeDefinitions', 'Distributed', 'Distribute', 'Dithering',
+ 'DistributionChart', 'DistributionFitTest', 'DivideBy', 'Dividers',
+ 'DistributionParameterAssumptions', 'DistributionParameterQ',
+ 'Divisible', 'DivisorSigma', 'Divisors', 'DivisorSum', 'DMSList',
+ 'DMSString', 'DockedCells', 'DocumentNotebook', 'DotDashed', 'For',
+ 'DotEqual', 'DoubleBracketingBar', 'DoubleDownArrow', 'DownArrow',
+ 'DoubleLeftArrow', 'DoubleLeftRightArrow', 'DoubleLongLeftArrow',
+ 'DoubleLongLeftRightArrow', 'DoubleLongRightArrow', 'DownArrowBar',
+ 'DoubleRightArrow', 'DoubleUpArrow', 'DoubleUpDownArrow', 'EdgeQ',
+ 'DoubleVerticalBar', 'DownArrowUpArrow', 'DownLeftRightVector',
+ 'DownLeftTeeVector', 'DownLeftVectorBar', 'DownLeftVector', 'Erfc',
+ 'DownRightTeeVector', 'DownRightVectorBar', 'DownRightVector',
+ 'DownTeeArrow', 'DownValues', 'DragAndDrop', 'DSolveConstants',
+ 'DualSystemsModel', 'DumpSave', '$DynamicEvaluation', 'Dynamic',
+ 'DynamicEvaluationTimeout', 'DynamicModule', 'DynamicModuleValues',
+ 'DynamicSetting', 'DynamicWrapper', 'EdgeAdd', 'EdgeCount', 'Erfi',
+ 'EdgeCoverQ', 'EdgeDelete', 'EdgeDetect', 'EdgeForm', 'EdgeIndex',
+ 'EdgeLabeling', 'EdgeLabels', 'EdgeLabelStyle', 'EdgeList', 'Exit',
+ 'EdgeRenderingFunction', 'EdgeRules', 'EdgeShapeFunction', 'Equal',
+ 'EdgeStyle', 'EdgeWeight', 'Editable', 'EditCellTagsSettings',
+ 'EditDistance', 'EffectiveInterest', 'Eigensystem', 'Eigenvalues',
+ 'EigenvectorCentrality', 'Eigenvectors', 'ElementData', 'Element',
+ 'Eliminate', 'EllipticE', 'EllipticExp', 'EllipticExpPrime', 'GCD',
+ 'EllipticF', 'EllipticK', 'EllipticLog', 'EllipticNomeQ', 'Encode',
+ 'EllipticPi', 'EllipticTheta', 'EllipticThetaPrime', 'EmitSound',
+ 'EmpiricalDistribution', 'EmptyGraphQ', 'Enabled', 'EndOfFile',
+ 'EndDialogPacket', 'EndOfLine', 'EndOfString', 'EndPackage', 'Get',
+ 'EngineeringForm', 'EnterExpressionPacket', 'EnterTextPacket',
+ 'EntropyFilter', 'Entropy', 'Environment', '$Epilog', 'Epilog',
+ 'EqualTilde', 'Equilibrium', 'Equivalent', 'ErlangDistribution',
+ 'Erosion', 'ErrorBox', 'ErrorBoxOptions', 'EstimatedDistribution',
+ 'EstimatorGains', 'EstimatorRegulator', 'EuclideanDistance', 'Hue',
+ 'EulerE', 'EulerGamma', 'EulerianGraphQ', 'EulerPhi', 'Evaluate',
+ 'Evaluatable', 'EvaluatePacket', 'EvaluationCompletionAction',
+ 'EvaluationElements', 'EvaluationMonitor', 'EvaluationNotebook',
+ 'EvaluationObject', 'EvaluatorNames', 'Evaluator', 'EvenQ', 'Find',
+ 'EventHandler', 'EventLabels', 'ExactNumberQ', 'ExampleData',
+ 'Except', 'ExcludedForms', 'ExcludePods', 'Exclusions', 'Exists',
+ 'ExclusionsStyle', 'ExpandAll', 'ExpandDenominator', 'Expand',
+ 'ExpandFileName', 'ExpandNumerator', 'Expectation', 'ExpIntegralE',
+ 'ExpectedValue', 'ExpGammaDistribution', 'ExpIntegralEi', 'Export',
+ 'ExponentFunction', 'ExponentialDistribution', 'ExponentialFamily',
+ 'ExponentialGeneratingFunction', 'ExponentialMovingAverage', 'LCM',
+ 'ExponentialPowerDistribution', 'Exponent', 'ExponentPosition',
+ 'ExponentStep', 'ExportAutoReplacements', '$ExportFormats', 'Flat',
+ 'ExportString', 'ExpressionCell', 'Expression', 'ExpToTrig', 'Log',
+ 'ExtendedGCD', 'Extension', 'ExtentElementFunction', 'ExtentSize',
+ 'ExtentMarkers', 'ExternalDataCharacterEncoding', 'ExtractArchive',
+ 'Extract', 'ExtremeValueDistribution', 'FaceForm', 'FaceGrids',
+ 'FaceGridsStyle', 'FactorComplete', 'Factorial2', 'Factorial',
+ 'FactorialMomentGeneratingFunction', 'FactorialMoment', 'Factor',
+ 'FactorialPower', 'FactorInteger', 'FactorList', 'FactorTermsList',
+ 'FactorSquareFreeList', 'FactorSquareFree', 'FactorTerms', 'False',
+ '$Failed', 'FeedbackType', 'Fibonacci', 'FieldHint', 'FieldMasked',
+ 'FieldHintStyle', 'FieldSize', 'FileBaseName', 'FileByteCount',
+ 'FileDate', 'FileExistsQ', 'FileExtension', 'FileFormat', 'First',
+ 'FileHash', 'FileNameDepth', 'FileNameDialogSettings', 'FileNames',
+ 'FileNameDrop', 'FileNameJoin', 'FileNameSetter', 'FileNameSplit',
+ 'FileNameTake', 'FilePrint', 'FileType', 'FilledCurve', 'Filling',
+ 'FillingStyle', 'FillingTransform', 'FilterRules', 'FinancialBond',
+ 'FinancialData', 'FinancialDerivative', 'FinancialIndicator',
+ 'FindArgMax', 'FindArgMin', 'FindClique', 'FindClusters', 'Floor',
+ 'FindCurvePath', 'FindDistributionParameters', 'FindDivisions',
+ 'FindEdgeCover', 'FindEulerianCycle', 'FindFile', 'FindFit', 'Map',
+ 'FindGeneratingFunction', 'FindGeoLocation', 'FindInstance', 'Max',
+ 'FindGeometricTransform', 'FindGraphIsomorphism', 'FindLibrary',
+ 'FindHamiltonianCycle', 'FindIndependentEdgeSet', 'FindList',
+ 'FindIndependentVertexSet', 'FindIntegerNullVector', 'FindMaximum',
+ 'FindLinearRecurrence', 'FindMaxValue', 'FindMinimum', 'FindRoot',
+ 'FindMinValue', 'FindPermutation', 'FindSequenceFunction', 'Fold',
+ 'FindSettings', 'FindShortestPath', 'FindShortestTour', 'Flatten',
+ 'FindThreshold', 'FindVertexCover', 'FinishDynamic', 'FittedModel',
+ 'FiniteAbelianGroupCount', 'FiniteGroupCount', 'FiniteGroupData',
+ 'FischerGroupFi22', 'FischerGroupFi23', 'FischerGroupFi24Prime',
+ 'FisherHypergeometricDistribution', 'FisherRatioTest', 'FlattenAt',
+ 'FisherZDistribution', 'FixedPointList', 'FixedPoint', 'FlipView',
+ 'FoldList', 'FontColor', 'FontFamily', 'FontForm', 'FontSize',
+ 'FontProperties', 'FontSlant', 'FontSubstitutions', 'FontTracking',
+ 'FontVariations', 'FontWeight', 'ForAll', 'Format', '$FormatType',
+ 'FormatTypeAutoConvert', 'FormatType', 'FormBox', 'FormBoxOptions',
+ 'FortranForm', 'ForwardBackward', 'Forward', 'FourierCoefficient',
+ 'FourierCosCoefficient', 'FourierCosSeries', 'FourierCosTransform',
+ 'FourierDCT', 'FourierDST', 'Fourier', 'FourierParameters', 'Full',
+ 'FourierSequenceTransform', 'FourierSeries', 'FourierSinSeries',
+ 'FourierSinCoefficient', 'FourierSinTransform', 'FourierTransform',
+ 'FourierTrigSeries', 'FractionalPart', 'FractionBox', 'FrameBox',
+ 'FractionBoxOptions', 'FractionLine', 'FrameBoxOptions', 'Framed',
+ 'FrameLabel', 'FrameMargins', 'Frame', 'FrameStyle', 'FrameTicks',
+ 'FrameTicksStyle', 'FRatioDistribution', 'FrechetDistribution',
+ 'FreeQ', 'FresnelC', 'FresnelS', 'FrobeniusNumber', 'FromASCII',
+ 'FrobeniusSolve', 'FromCharacterCode', 'FromCoefficientRules',
+ 'FromContinuedFraction', 'FromDate', 'FromDigits', 'FromDMS',
+ 'FrontEndDynamicExpression', 'FrontEndEventActions', '$FrontEnd',
+ 'FrontEndExecute', '$FrontEndSession', 'FrontEndStackSize', 'Glow',
+ 'FrontEndTokenExecute', 'FrontEndToken', 'Front', 'FullDefinition',
+ 'FullForm', 'FullGraphics', 'FullOptions', 'FullSimplify', 'Gamma',
+ 'FunctionExpand', 'FunctionInterpolation', 'Function', 'GatherBy',
+ 'FunctionSpace', 'GaborWavelet', 'GainMargins', 'GainPhaseMargins',
+ 'GammaDistribution', 'GammaRegularized', 'GapPenalty', 'Gather',
+ 'GaussianFilter', 'GaussianIntegers', 'GaussianMatrix', 'General',
+ 'GegenbauerC', 'GeneralizedLinearModelFit', 'GenerateConditions',
+ 'GeneratedCell', 'GeneratedParameters', 'GeneratingFunction',
+ 'GenericCylindricalDecomposition', 'GenomeData', 'GenomeLookup',
+ 'GeodesicDilation', 'GeodesicErosion', 'GeoDestination', 'Goto',
+ 'GeodesyData', 'GeoDirection', 'GeoDistance', 'GeoGridPosition',
+ '$GeoLocation', 'GeometricDistribution', 'GeometricMeanFilter',
+ 'GeometricMean', 'GeometricTransformation', 'GeoPositionENU',
+ 'GeoPosition', 'GeoPositionXYZ', 'GeoProjectionData', 'Glaisher',
+ 'GoldenRatio', 'GompertzMakehamDistribution', 'GradientFilter',
+ 'Gradient', 'GraphCenter', 'GraphComplement', 'GraphData', 'Graph',
+ 'GraphDiameter', 'GraphDifference', 'GraphDisjointUnion', 'GraphQ',
+ 'GraphDistanceMatrix', 'GraphDistance', 'GraphHighlight', 'Gray',
+ 'GraphHighlightStyle', 'Graphics3D', 'GraphicsArray', 'Graphics',
+ 'GraphicsColumn', 'GraphicsComplex', 'GraphicsGrid', 'GraphicsRow',
+ 'GraphicsGroup', 'GraphicsSpacing', 'GraphIntersection', 'Greater',
+ 'GraphLayout', 'GraphPeriphery', 'GraphPlot3D', 'GraphPlot', 'Min',
+ 'GraphPower', 'GraphRadius', 'GraphStyle', 'GraphUnion', 'Green',
+ 'GrayLevel', 'GreaterEqualLess', 'GreaterEqual', 'GreaterGreater',
+ 'GreaterFullEqual', 'GreaterLess', 'GreaterSlantEqual', 'GridBox',
+ 'GreaterTilde', 'GridBaseline', 'GridCreationSettings', 'Grid',
+ 'GridDefaultElement', 'GridFrameMargins', 'GridFrame', 'GridGraph',
+ 'GridLines', 'GridLinesStyle', 'GroebnerBasis', 'GroupActionBase',
+ 'GroupCentralizer', 'GroupElementPosition', 'GroupElementQ', 'Mod',
+ 'GroupElements', 'GroupGenerators', 'GroupMultiplicationTable',
+ 'GroupOrbits', 'GroupOrder', 'GroupPageBreakWithin', 'HaarWavelet',
+ 'GroupSetwiseStabilizer', 'GroupStabilizerChain', 'Gudermannian',
+ 'GroupStabilizer', 'GumbelDistribution', 'HalfNormalDistribution',
+ 'HamiltonianGraphQ', 'HammingDistance', 'HankelH1', 'HankelH2',
+ 'HankelMatrix', 'HaradaNortonGroupHN', 'HararyGraph', 'Hash',
+ 'HarmonicMeanFilter', 'HarmonicMean', 'HarmonicNumber', 'Head',
+ 'Haversine', 'HazardFunction', 'Heads', 'HeavisideLambda', 'Hold',
+ 'HeavisidePi', 'HeavisideTheta', 'HeldGroupHe', 'HeldPart', 'Item',
+ 'HelpBrowserSettings', 'HermiteDecomposition', 'HermiteH', 'Image',
+ 'HermitianMatrixQ', 'HessenbergDecomposition', 'HiddenSurface',
+ 'HexadecimalCharacter', 'HighlightGraph', 'HigmanSimsGroupHS',
+ 'HilbertMatrix', 'Histogram3D', 'HistogramDistribution', 'HoldAll',
+ 'HistogramList', 'Histogram', '$HistoryLength', 'HitMissTransform',
+ 'HITSCentrality', 'HoldAllComplete', 'HoldComplete', 'HoldFirst',
+ 'HoldForm', 'HoldPattern', 'HoldRest', '$HomeDirectory', 'ImageQ',
+ 'HomeDirectory', 'HornerForm', 'HotellingTSquareDistribution',
+ 'HoytDistribution', 'HTMLSave', 'HumpDownHump', 'HumpEqual', 'Nor',
+ 'HurwitzLerchPhi', 'HurwitzZeta', 'HyperbolicDistribution', 'Join',
+ 'HypercubeGraph', 'Hyperfactorial', 'Hypergeometric0F1', 'Implies',
+ 'Hypergeometric0F1Regularized', 'Hypergeometric1F1', 'Hyperlink',
+ 'Hypergeometric1F1Regularized', 'Hypergeometric2F1', 'Hyphenation',
+ 'Hypergeometric2F1Regularized', 'HypergeometricDistribution',
+ 'HypergeometricPFQ', 'HypergeometricPFQRegularized', 'Identity',
+ 'HypergeometricU', 'HypothesisTestData', 'IdentityMatrix', 'Infix',
+ 'IgnoreCase', '$IgnoreEOF', 'ImageAdd', 'ImageAdjust', 'ImageClip',
+ 'ImageAlign', 'ImageApply', 'ImageAspectRatio', 'ImageAssemble',
+ 'ImageCapture', 'ImageChannels', 'ImageColorSpace', 'ImageCompose',
+ 'ImageConvolve', 'ImageCooccurrence', 'ImageCorrelate', 'ImagePad',
+ 'ImageCorrespondingPoints', 'ImageCrop', 'ImageData', 'ImageLines',
+ 'ImageDeconvolve', 'ImageDifference', 'ImageDimensions', 'Import',
+ 'ImageEffect', 'ImageFilter', 'ImageForestingComponents', 'Inner',
+ 'ImageForwardTransformation', 'ImageHistogram', 'ImageKeypoints',
+ 'ImageLevels', 'ImageMargins', 'ImageMultiply', 'ImagePadding',
+ 'ImagePartition', 'ImagePerspectiveTransformation', 'ImageReflect',
+ 'ImageRegion', 'ImageResize', 'ImageResolution', 'ImageRotated',
+ 'ImageRotate', 'ImageScaled', 'ImageSizeAction', 'ImageSize',
+ 'ImageSizeMultipliers', 'ImageSubtract', 'ImageTake', 'ImageTrim',
+ 'ImageTransformation', 'ImageType', 'ImageValue', '$ImportFormats',
+ '$ImagingDevices', 'ImportAutoReplacements', 'ImportString', 'Not',
+ 'IncidenceGraph', 'IncidenceMatrix', 'IncludeConstantBasis', 'Off',
+ 'IncludeFileExtension', 'IncludePods', 'Increment', 'IndexGraph',
+ 'IndependentEdgeSetQ', 'IndependentVertexSetQ', 'Indeterminate',
+ 'InexactNumberQ', 'Infinity', 'Information', 'Inherited', '$Input',
+ '$InitialDirectory', 'InitializationCellEvaluation', 'Inpaint',
+ 'InitializationCell', 'InitializationCellWarning', 'InputAliases',
+ 'InitializationGroup', 'Initialization', 'InputAssumptions', 'Out',
+ 'InputAutoReplacements', 'InputField', '$InputFileName', 'Input',
+ 'InputForm', 'InputNamePacket', 'InputNotebook', 'InputPacket',
+ 'InputStream', 'InputString', 'InputStringPacket', 'Insert', 'PDF',
+ 'InsertResults', 'Inset', '$Inspector', '$InstallationDate', 'Put',
+ '$InstallationDirectory', 'Install', 'InstallService', 'InString',
+ 'IntegerDigits', 'IntegerExponent', 'IntegerLength', 'Integer',
+ 'IntegerPartitions', 'IntegerPart', 'IntegerQ', 'Integers', 'Last',
+ 'IntegerString', 'Integrate', 'InteractiveTradingChart', 'Inverse',
+ 'Interleaving', 'InternallyBalancedDecomposition', 'Interpolation',
+ 'InterpolatingFunction', 'InterpolatingPolynomial', 'Interrupt',
+ 'InterpolationOrder', 'InterpolationPoints', 'InterpretationBox',
+ 'InterpretationBoxOptions', 'Interpretation', 'InterquartileRange',
+ 'Intersection', 'IntervalIntersection', 'IntervalMemberQ', 'Label',
+ 'Interval', 'IntervalUnion', 'InverseBetaRegularized', 'Invisible',
+ 'InverseCDF', 'InverseChiSquareDistribution', 'InverseErfc', 'Raw',
+ 'InverseContinuousWaveletTransform', 'InverseDistanceTransform',
+ 'InverseEllipticNomeQ', 'InverseErf', 'InverseFourierCosTransform',
+ 'InverseFourier', 'InverseFourierSequenceTransform', 'IsotopeData',
+ 'InverseFourierSinTransform', 'InverseFourierTransform', 'Italic',
+ 'InverseFunction', 'InverseFunctions', 'InverseGammaDistribution',
+ 'InverseGammaRegularized', 'InverseGaussianDistribution', 'Joined',
+ 'InverseGudermannian', 'InverseHaversine', 'InverseJacobiCD',
+ 'InverseJacobiCN', 'InverseJacobiCS', 'InverseJacobiDC', 'JacobiP',
+ 'InverseJacobiDN', 'InverseJacobiDS', 'InverseJacobiNC', 'Kernels',
+ 'InverseJacobiND', 'InverseJacobiNS', 'InverseJacobiSC', 'Labeled',
+ 'InverseJacobiSD', 'InverseJacobiSN', 'InverseLaplaceTransform',
+ 'InversePermutation', 'InverseRadon', 'InverseSeries', 'ItemSize',
+ 'InverseSurvivalFunction', 'InverseWaveletTransform', 'ItemStyle',
+ 'InverseWeierstrassP', 'InverseZTransform', 'IsolatingInterval',
+ 'IrreduciblePolynomialQ', 'IsomorphicGraphQ', 'ItemAspectRatio',
+ '$IterationLimit', 'JaccardDissimilarity', 'JacobiAmplitude',
+ 'JacobiCD', 'JacobiCN', 'JacobiCS', 'JacobiDC', 'JacobiDN', 'Left',
+ 'JacobiDS', 'JacobiNC', 'JacobiND', 'JacobiNS', 'JacobiSC', 'Less',
+ 'JacobiSD', 'JacobiSN', 'JacobiSymbol', 'JacobiZeta', 'JoinForm',
+ 'JankoGroupJ1', 'JankoGroupJ2', 'JankoGroupJ3', 'JankoGroupJ4',
+ 'JarqueBeraALMTest', 'JohnsonDistribution', 'JoinedCurve', 'Large',
+ 'JordanDecomposition', 'JordanModelDecomposition', 'KagiChart',
+ 'KalmanEstimator', 'KarhunenLoeveDecomposition', 'KaryTree', 'Red',
+ 'KatzCentrality', 'KCoreComponents', 'KDistribution', 'KelvinBei',
+ 'KelvinBer', 'KelvinKei', 'KelvinKer', '$KernelCount', '$KernelID',
+ 'KernelMixtureDistribution', 'KernelObject', 'Khinchin', 'Larger',
+ 'KirchhoffGraph', 'KirchhoffMatrix', 'KleinInvariantJ', 'KnotData',
+ 'KnightTourGraph', 'KolmogorovSmirnovTest', 'KroneckerDelta',
+ 'KroneckerProduct', 'KroneckerSymbol', 'KuiperTest', 'Kurtosis',
+ 'KumaraswamyDistribution', 'KuwaharaFilter', 'LabelingFunction',
+ 'LabelStyle', 'LaguerreL', 'LandauDistribution', '$Language',
+ 'LanguageCategory', 'Language', 'LaplaceDistribution', 'Latitude',
+ 'LaplaceTransform', 'LaplacianFilter', 'LaplacianGaussianFilter',
+ 'LatitudeLongitude', 'LatticeData', 'LatticeReduce', 'LeafCount',
+ 'LaunchKernels', 'LayeredGraphPlot', 'LayerSizeFunction', 'Length',
+ 'LeastSquares', 'LeftArrowBar', 'LeftArrow', 'LeftArrowRightArrow',
+ 'LeftDownTeeVector', 'LeftDownVectorBar', 'LeftDownVector', 'Line',
+ 'LeftRightArrow', 'LeftRightVector', 'LeftTeeArrow', 'LeftVector',
+ 'LeftTeeVector', 'LeftTriangleBar', 'LeftTriangleEqual', 'LetterQ',
+ 'LeftTriangle', 'LeftUpDownVector', 'LeftUpTeeVector', 'Legended',
+ 'LeftUpVectorBar', 'LeftUpVector', 'LeftVectorBar', 'LegendreP',
+ 'LegendAppearance', 'LegendreQ', 'LegendreType', 'LengthWhile',
+ 'LerchPhi', 'LessEqualGreater', 'LessEqual', 'LessFullEqual',
+ 'LessGreater', 'LessLess', 'LessSlantEqual', 'LessTilde', 'Level',
+ 'LetterCharacter', 'LeveneTest', 'LeviCivitaTensor', 'LibraryLoad',
+ 'LevyDistribution', 'LibraryFunctionError', 'LibraryFunctionLoad',
+ 'LibraryFunctionInformation', 'LibraryFunction', '$LibraryPath',
+ 'LibraryFunctionUnload', 'LibraryUnload', '$LicenseExpirationDate',
+ '$LicenseID', '$LicenseServer', 'LiftingFilterData', 'LightBlue',
+ 'LiftingWaveletTransform', 'LightBrown', 'LightCyan', 'Lighter',
+ 'LightGray', 'LightGreen', 'LightingAngle', 'Lighting', 'LightRed',
+ 'LightMagenta', 'LightOrange', 'LightPink', 'LightPurple', 'Limit',
+ 'LightSources', 'LightYellow', 'Likelihood', 'LimitsPositioning',
+ 'LimitsPositioningTokens', 'LindleyDistribution', 'LinearModelFit',
+ 'LinearFractionalTransform', 'LinearOffsetFunction', 'LinearSolve',
+ 'LinearProgramming', 'LinearRecurrence', 'LinearSolveFunction',
+ 'LinebreakAdjustments', 'LineBreakChart', 'LineBreakWithin', 'Row',
+ 'LineGraph', 'LineIndentMaxFraction', 'LineIndent', '$Line', 'Run',
+ 'LineIntegralConvolutionPlot', 'LineIntegralConvolutionScale',
+ 'LineSpacing', 'LinkClose', 'LinkConnect', 'LinkCreate', '$Linked',
+ 'LinkFunction', 'LinkInterrupt', 'LinkLaunch', 'LinkObject', 'Sec',
+ 'LinkOpen', 'LinkPatterns', 'LinkProtocol', 'LinkRead', 'Links',
+ 'LinkReadyQ', 'LinkWrite', 'LiouvilleLambda', 'Listable', 'List',
+ 'ListAnimate', 'ListContourPlot3D', 'ListContourPlot', 'ListPlay',
+ 'ListConvolve', 'ListCorrelate', 'ListCurvePathPlot', 'ListPlot3D',
+ 'ListDeconvolve', 'ListDensityPlot', 'ListInterpolation', 'Locked',
+ 'ListLineIntegralConvolutionPlot', 'ListLinePlot', 'ListLogPlot',
+ 'ListLogLinearPlot', 'ListLogLogPlot', 'ListPlot', 'ListPolarPlot',
+ 'ListPointPlot3D', 'ListStreamDensityPlot', 'ListStreamPlot',
+ 'ListSurfacePlot3D', 'ListVectorDensityPlot', 'ListVectorPlot3D',
+ 'ListVectorPlot', 'Literal', 'LocalizeVariables', 'LocationTest',
+ 'LocationEquivalenceTest', 'LocatorAutoCreate', 'Locator', 'Log10',
+ 'LocatorPane', 'LocatorRegion', 'Log2', 'LogBarnesG', 'LogGamma',
+ 'LogGammaDistribution', 'LogicalExpand', 'LogIntegral', 'LogPlot',
+ 'LogisticDistribution', 'LogitModelFit', 'LogLikelihood', 'LucasL',
+ 'LogLinearPlot', 'LogLogisticDistribution', 'LogLogPlot', 'Manual',
+ 'LogNormalDistribution', 'LogSeriesDistribution', 'LongestMatch',
+ 'LongestCommonSequence', 'LongestCommonSubsequence', 'Longest',
+ 'Longitude', 'LongLeftArrow', 'LongLeftRightArrow', 'LowerCaseQ',
+ 'LongRightArrow', 'LoopFreeGraphQ', 'LowerLeftArrow', '$MachineID',
+ 'LowerRightArrow', 'LowerTriangularize', 'LQEstimatorGains', 'Set',
+ 'LQGRegulator', 'LQOutputRegulatorGains', 'LQRegulatorGains',
+ 'LUBackSubstitution', 'LUDecomposition', 'LyapunovSolve', 'MapAll',
+ 'LyonsGroupLy', '$MachineAddresses', '$MachineDomain', 'Magenta',
+ '$MachineDomains', '$MachineEpsilon', '$MachineName', 'Magnify',
+ 'MachineNumberQ', '$MachinePrecision', 'MachinePrecision', 'MapAt',
+ '$MachineType', 'Magnification', 'Majority', 'MakeBoxes', 'MatchQ',
+ 'MakeExpression', 'MangoldtLambda', 'ManhattanDistance', 'MarcumQ',
+ 'Manipulate', 'Manipulator', 'MannWhitneyTest', 'MantissaExponent',
+ 'MapIndexed', 'MapThread', 'MardiaCombinedTest', 'Masking', 'Mean',
+ 'MardiaKurtosisTest', 'MardiaSkewnessTest', 'MarginalDistribution',
+ 'MatchingDissimilarity', 'MatchLocalNames', 'MathieuC', 'MathieuS',
+ 'MathieuCharacteristicA', 'MathieuCharacteristicB', 'MathMLForm',
+ 'MathieuCharacteristicExponent', 'MathieuCPrime', 'MathieuSPrime',
+ 'MathieuGroupM11', 'MathieuGroupM12', 'MathieuGroupM22', 'MatrixQ',
+ 'MathieuGroupM23', 'MathieuGroupM24', 'MatrixExp', 'MatrixForm',
+ 'MatrixPlot', 'MatrixPower', 'MatrixRank', 'MaxDetect', 'Maximize',
+ 'MaxExtraBandwidths', 'MaxExtraConditions', '$MaxExtraPrecision',
+ 'MaxFilter', 'MaxIterations', '$MaxMachineNumber', 'MaxMemoryUsed',
+ 'MaxMixtureKernels', '$MaxNumber', '$MaxPiecewiseCases', '$$Media',
+ 'MaxPlotPoints', '$MaxPrecision', 'MaxRecursion', '$MaxRootDegree',
+ 'MaxStableDistribution', 'MaxStepFraction', 'MaxStepSize', 'Mesh',
+ 'MaxSteps', 'MaxValue', 'MaxwellDistribution', 'MeanDeviation',
+ 'McLaughlinGroupMcL', 'MeanFilter', 'MeanShiftFilter', 'MeanShift',
+ 'MedianDeviation', 'MedianFilter', 'Median', 'Medium', 'MeijerG',
+ 'MemberQ', 'MemoryConstrained', 'MemoryInUse', 'MenuCommandKey',
+ 'MenuPacket', 'MenuSortingValue', 'MenuStyle', 'MenuView', 'Minus',
+ 'MeshFunctions', 'MeshRange', 'MeshShading', 'MeshStyle', 'Method',
+ 'MessageDialog', '$MessageGroups', '$MessageList', 'MessageList',
+ 'MessageName', 'Message', 'MessagePacket', '$MessagePrePrint',
+ '$Messages', 'Messages', 'MexicanHatWavelet', 'MeyerWavelet',
+ 'MinDetect', 'MinFilter', 'MinimalPolynomial', 'Minimize', 'Modal',
+ 'MinimalStateSpaceModel', '$MinMachineNumber', '$MinNumber', 'Sin',
+ 'Minors', '$MinPrecision', 'MinStableDistribution', 'MinusPlus',
+ 'MinValue', 'Missing', 'MixtureDistribution', 'ModularLambda',
+ 'Module', '$ModuleNumber', 'Modulus', 'MoebiusMu', 'MomentConvert',
+ 'MomentEvaluate', 'MomentGeneratingFunction', 'Moment', 'Monitor',
+ 'MonomialList', 'MonsterGroupM', 'MorletWavelet', 'Most', 'NameQ',
+ 'MorphologicalBinarize', 'MorphologicalBranchPoints', 'Mouseover',
+ 'MorphologicalComponents', 'MorphologicalEulerNumber', 'Names',
+ 'MorphologicalGraph', 'MorphologicalPerimeter', 'MouseAnnotation',
+ 'MorphologicalTransform', 'MouseAppearance', 'MousePosition',
+ 'MovingAverage', 'MovingMedian', 'MoyalDistribution', 'Nand',
+ 'MultiedgeStyle', 'MultilaunchWarning', 'MultilineFunction', 'Sow',
+ 'MultinomialDistribution', 'Multinomial', 'MultiplicativeOrder',
+ 'MultinormalDistribution', 'MultivariatePoissonDistribution',
+ 'MultivariateHypergeometricDistribution', 'NakagamiDistribution',
+ 'MultivariateTDistribution', 'NArgMax', 'NArgMin', 'NCache', 'Sum',
+ 'NDSolve', 'NearestFunction', 'Nearest', 'Needs', 'Negative',
+ 'NeedlemanWunschSimilarity', 'NegativeBinomialDistribution', 'Tan',
+ 'NegativeMultinomialDistribution', 'NeighborhoodGraph', 'NestList',
+ 'NestedGreaterGreater', 'NestedLessLess', 'Nest', 'NestWhileList',
+ 'NestWhile', 'NevilleThetaC', 'NevilleThetaD', 'NevilleThetaN',
+ 'NevilleThetaS', '$NewMessage', '$NewSymbol', 'NExpectation',
+ 'NextPrime', 'NHoldAll', 'NHoldFirst', 'NHoldRest', 'NicholsPlot',
+ 'NicholsGridLines', 'NIntegrate', 'NMaximize', 'NMaxValue', 'None',
+ 'NMinimize', 'NMinValue', 'NominalVariables', 'NonConstants',
+ 'NoncentralBetaDistribution', 'NoncentralChiSquareDistribution',
+ 'NoncentralFRatioDistribution', 'NoncentralStudentTDistribution',
+ 'NonCommutativeMultiply', 'NonlinearModelFit', 'NonNegative',
+ 'NonPositive', 'NorlundB', 'NormalDistribution', 'Normalize',
+ 'NormalizedSquaredEuclideanDistance', 'Normal', 'NormalsFunction',
+ 'NormFunction', 'Norm', 'NotCongruent', 'NotCupCap', 'NotebookGet',
+ 'NotDoubleVerticalBar', 'NotebookApply', 'NotebookAutoSave', 'Top',
+ 'NotebookBrowseDirectory', 'NotebookClose', 'NotebookCreate',
+ 'NotebookConvertSettings', 'NotebookDelete', 'NotebookDirectory',
+ 'NotebookDynamicExpression', 'NotebookEvaluate', 'NotebookFind',
+ 'NotebookEventActions', 'NotebookFileName', 'NotebookInformation',
+ 'NotebookLocate', 'Notebook', 'NotebookObject', 'NotebookOpen',
+ 'NotebookPath', 'NotebookPrint', 'NotebookPut', 'NotebookRead',
+ 'NotebookSave', 'NotebookSelection', 'NotebooksMenu', '$Notebooks',
+ 'Notebooks', 'NotebookWrite', 'NotElement', 'NotEqualTilde', 'Vee',
+ 'NotExists', 'NotGreaterEqual', 'NotGreaterFullEqual', 'NotLess',
+ 'NotGreaterGreater', 'NotGreaterLess', 'NotGreater', 'NotLessLess',
+ 'NotGreaterSlantEqual', 'NotGreaterTilde', 'NotHumpDownHump',
+ 'NotHumpEqual', 'NotLeftTriangleBar', 'NotLeftTriangleEqual',
+ 'NotLeftTriangle', 'NotLessEqual', 'NotLessFullEqual', 'NotSubset',
+ 'NotLessGreater', 'NotLessSlantEqual', 'NotLessTilde', 'NotTilde',
+ 'NotNestedGreaterGreater', 'NotNestedLessLess', 'NotPrecedesEqual',
+ 'NotPrecedes', 'NotPrecedesSlantEqual', 'NotPrecedesTilde', 'NSum',
+ 'NotReverseElement', 'NotRightTriangleBar', 'NotRightTriangle',
+ 'NotRightTriangleEqual', 'NotSquareSubsetEqual', 'NotSquareSubset',
+ 'NotSquareSupersetEqual', 'NotSquareSuperset', 'NotSubsetEqual',
+ 'NotSucceedsEqual', 'NotSucceeds', 'NotSucceedsSlantEqual', 'Null',
+ 'NotSucceedsTilde', 'NotSupersetEqual', 'NotSuperset', 'NProduct',
+ 'NotTildeEqual', 'NotTildeFullEqual', 'NotTildeTilde', 'NRoots',
+ 'NotVerticalBar', 'NProbability', 'NSolve', 'NullRecords', 'OddQ',
+ 'NullSpace', 'NullWords', 'NumberFieldClassNumber', 'NumberFormat',
+ 'NumberFieldDiscriminant', 'NumberFieldFundamentalUnits', 'Number',
+ 'NumberFieldIntegralBasis', 'NumberFieldNormRepresentatives',
+ 'NumberFieldRegulator', 'NumberFieldRootsOfUnity', 'NumberForm',
+ 'NumberFieldSignature', '$NumberMarks', 'NumberMarks', 'NumberQ',
+ 'NumberMultiplier', 'NumberPadding', 'NumberPoint', 'NumberSigns',
+ 'NumberSeparator', 'NumberString', 'Numerator', 'NumericFunction',
+ 'NumericQ', 'NyquistGridLines', 'NyquistPlot', 'ObservableModelQ',
+ 'ObservabilityGramian', 'ObservabilityMatrix', 'Offset', 'Opacity',
+ 'ObservableDecomposition', 'ONanGroupON', 'OneIdentity', 'Opener',
+ 'OpenAppend', 'OpenerView', 'Opening', 'OpenRead', 'OpenTemporary',
+ 'OpenWrite', 'Operate', '$OperatingSystem', 'OperatingSystem',
+ 'Optional', 'OptionInspectorSettings', 'Options', 'OptionsPattern',
+ 'OptionValue', 'Orange', 'OrderDistribution', 'OrderedQ', 'Order',
+ 'Ordering', 'Orderless', 'Orthogonalize', 'Outer', 'OutputForm',
+ 'OutputAutoOverwrite', 'OutputControllabilityMatrix', '$Output',
+ 'OutputControllableModelQ', 'OutputNamePacket', 'OutputResponse',
+ '$OutputSizeLimit', 'OutputSizeLimit', 'OutputStream', 'OverBar',
+ 'OverDot', 'Overflow', 'OverHat', 'Overlaps', 'Overlay', 'OwenT',
+ 'OverscriptBox', 'OverscriptBoxOptions', 'Overscript', 'OverTilde',
+ 'OverVector', 'OwnValues', '$Packages', 'PackingMethod', 'Padding',
+ 'PaddedForm', 'PadeApproximant', 'PadLeft', 'PadRight', 'Paneled',
+ 'PageBreakAbove', 'PageBreakBelow', 'PageBreakWithin', 'PageWidth',
+ 'PageFooterLines', 'PageFooters', 'PageHeaderLines', 'PageHeaders',
+ 'PageRankCentrality', 'PairedBarChart', 'PairedHistogram', 'Panel',
+ 'PairedTTest', 'PairedZTest', 'PaletteNotebook', 'PalettePath',
+ 'Pane', 'PaneSelector', 'ParabolicCylinderD', 'ParagraphIndent',
+ 'ParagraphSpacing', 'ParallelArray', 'ParallelCombine', 'Part',
+ 'ParallelDo', 'ParallelEvaluate', 'Parallelization', 'Parallelize',
+ 'ParallelMap', 'ParallelNeeds', 'ParallelProduct', 'ParallelSum',
+ 'ParallelSubmit', 'ParallelTable', 'ParallelTry', 'ParametricPlot',
+ 'ParameterEstimator', 'ParameterMixtureDistribution', 'Partition',
+ 'ParametricPlot3D', 'ParentDirectory', '$ParentLink', 'Paste',
+ '$ParentProcessID', 'ParetoDistribution', 'ParticleData', '$Path',
+ 'PartitionsP', 'PartitionsQ', 'PascalDistribution', 'PassEventsUp',
+ 'PassEventsDown', 'PasteBoxFormInlineCells', 'PasteButton', 'Path',
+ 'PathGraph', 'PathGraphQ', '$PathnameSeparator', 'Pattern', 'Pick',
+ 'PatternSequence', 'PatternTest', 'PauliMatrix', 'PaulWavelet',
+ 'Pause', 'PearsonChiSquareTest', 'PearsonDistribution', 'Permute',
+ '$PerformanceGoal', 'PerformanceGoal', 'PermutationCycles', 'Pink',
+ 'PermutationCyclesQ', 'PermutationGroup', 'PermutationLength',
+ 'PermutationList', 'PermutationListQ', 'PermutationMax', 'Placed',
+ 'PermutationMin', 'PermutationOrder', 'PermutationPower', 'Plain',
+ 'PermutationProduct', 'PermutationReplace', 'Permutations', 'Play',
+ 'PermutationSupport', 'PeronaMalikFilter', 'PERTDistribution',
+ 'PetersenGraph', 'PhaseMargins', 'PiecewiseExpand', 'Piecewise',
+ 'PieChart3D', 'PieChart', 'PixelConstrained', 'PixelValue', 'Plot',
+ 'Placeholder', 'PlaceholderReplace', 'PlayRange', 'Plot3D', 'Plus',
+ 'Plot3Matrix', 'PlotDivision', 'PlotJoined', 'PlotLabel', 'Point',
+ 'PlotLayout', 'PlotMarkers', 'PlotPoints', 'PlotRangeClipping',
+ 'PlotRange', 'PlotRangePadding', 'PlotRegion', 'PlotStyle', '$Pre',
+ 'PlusMinus', 'Pochhammer', 'PodStates', 'PodWidth', 'PointSize',
+ 'PointFigureChart', 'PoissonConsulDistribution', 'PolarAxes',
+ 'PoissonDistribution', 'PolarAxesOrigin', 'PolarGridLines', 'Quit',
+ 'PolarPlot', 'PolarTicks', 'PoleZeroMarkers', 'PolyGamma', '$Post',
+ 'PolyaAeppliDistribution', 'PolygonIntersections', 'Polygon',
+ 'PolyhedronData', 'PolyLog', 'PolynomialExtendedGCD', 'PopupMenu',
+ 'PolynomialGCD', 'PolynomialLCM', 'PolynomialMod', 'PolynomialQ',
+ 'PolynomialQuotient', 'PolynomialQuotientRemainder', 'PopupView',
+ 'PolynomialReduce', 'PolynomialRemainder', 'PopupWindow', 'Power',
+ 'Position', 'PositiveDefiniteMatrixQ', 'Positive', 'PossibleZeroQ',
+ 'Postfix', 'PowerDistribution', 'PowerExpand', 'PowerModList',
+ 'PowerMod', 'PowersRepresentations', 'PowerSymmetricPolynomial',
+ 'PrecedenceForm', 'PrecedesEqual', 'Precedes', 'PrecedesTilde',
+ 'PrecedesSlantEqual', 'PrecisionGoal', 'Precision', 'PreDecrement',
+ 'PreemptProtect', 'PreferencesPath', 'Prefix', 'PreIncrement',
+ 'Prepend', 'PrependTo', '$PrePrint', '$PreRead', 'Prime', 'PrimeQ',
+ 'PreserveImageOptions', 'PriceGraphDistribution', 'PrimeNu', 'Xor',
+ 'PrimeOmega', 'PrimePi', 'PrimePowerQ', 'Primes', 'PrimeZetaP',
+ 'PrimitiveRoot', 'PrincipalComponents', 'PrincipalValue', 'Print',
+ 'PrintAction', 'PrintingCopies', 'PrintingOptions', 'PrivatePaths',
+ 'PrintingPageRange', 'PrintingStartingPageNumber', 'Probability',
+ 'PrintingStyleEnvironment', 'PrintPrecision', 'PrintTemporary',
+ 'PrivateEvaluationOptions', 'PrivateFontOptions', 'ProbitModelFit',
+ 'PrivateNotebookOptions', 'ProbabilityDistribution', '$ProcessID',
+ 'ProbabilityPlot', 'ProbabilityScalePlot', '$ProcessorCount',
+ '$ProcessorType', 'ProductDistribution', '$ProductInformation',
+ 'ProductLog', 'Product', 'ProgressIndicator', 'Projection', 'Read',
+ 'Prolog', 'Properties', 'PropertyList', 'Property', 'Proportional',
+ 'PropertyValue', 'Proportion', 'Protected', 'Protect', 'Pruning',
+ 'ProteinData', 'PseudoInverse', 'Purple', 'PutAppend', 'QBinomial',
+ 'QFactorial', 'QGamma', 'QHypergeometricPFQ', 'QPochhammer',
+ 'QPolyGamma', 'QRDecomposition', 'QuadraticIrrationalQ', 'Quiet',
+ 'Quantile', 'QuantilePlot', 'Quartics', 'QuartileDeviation',
+ 'QuartileSkewness', 'Quartiles', 'Quotient', 'QuotientRemainder',
+ 'RadicalBox', 'RadicalBoxOptions', 'RadioButtonBar', 'RadioButton',
+ 'Radon', 'RamanujanTauL', 'RamanujanTau', 'RamanujanTauTheta',
+ 'RamanujanTauZ', 'RandomChoice', 'RandomComplex', 'RandomGraph',
+ 'RandomImage', 'RandomInteger', 'Random', 'RandomPermutation',
+ 'RandomPrime', 'RandomReal', 'RandomSample', '$RandomState',
+ 'RandomVariate', 'RangeFilter', 'Range', 'RankedMax', 'RankedMin',
+ 'RasterArray', 'Rasterize', 'Raster', 'RasterSize', 'Rationalize',
+ 'Rational', 'Rationals', 'Ratios', 'RawBoxes', 'RawData', 'Real',
+ 'RayleighDistribution', 'ReadList', 'ReadProtected', 'RealDigits',
+ 'RealBlockDiagonalForm', 'RealExponent', 'Reals', 'Reap', 'Record',
+ 'RecordLists', 'RecordSeparators', 'RectangleChart3D', 'Rectangle',
+ 'RectangleChart', 'RecurrenceTable', '$RecursionLimit', 'Reduce',
+ 'ReferenceLineStyle', 'Refine', 'ReflectionMatrix', 'Refresh',
+ 'ReflectionTransform', 'RefreshRate', 'RegionBinarize', 'Release',
+ 'RegionFunction', 'RegionPlot3D', 'RegionPlot', 'Regularization',
+ 'RegularExpression', 'ReleaseHold', '$ReleaseNumber', 'ReliefPlot',
+ 'ReliefImage', 'RemoveAlphaChannel', 'Remove', 'RemoveProperty',
+ 'RemoveScheduledTask', 'RenameDirectory', 'RenameFile', 'Repeated',
+ 'RenderAll', 'RenkoChart', 'RepeatedNull', 'ReplaceAll', 'Replace',
+ 'ReplaceHeldPart', 'ReplaceList', 'ReplacePart', 'ReplaceRepeated',
+ 'Resampling', 'Rescale', 'RescalingTransform', 'ResetDirectory',
+ 'ResetMedium', 'ResetScheduledTask', 'Residue', 'Resolve', 'Rest',
+ 'Resultant', 'ResumePacket', 'ReturnExpressionPacket', 'Return',
+ 'ReturnPacket', 'ReturnTextPacket', 'ReverseElement', 'Reverse',
+ 'ReverseBiorthogonalSplineWavelet', 'ReverseEquilibrium', 'Riffle',
+ 'ReverseGraph', 'ReverseUpEquilibrium', 'RevolutionAxis', 'Right',
+ 'RevolutionPlot3D', 'RGBColor', 'RiccatiSolve', 'RiceDistribution',
+ 'RidgeFilter', 'RiemannR', 'RiemannSiegelTheta', 'RiemannSiegelZ',
+ 'RightArrowBar', 'RightArrowLeftArrow', 'RightArrow', 'Root',
+ 'RightCosetRepresentative', 'RightDownTeeVector', 'RightTeeArrow',
+ 'RightDownVectorBar', 'RightDownVector', 'RightTeeVector', 'Roots',
+ 'RightTriangleBar', 'RightTriangleEqual', 'RightTriangle', 'Round',
+ 'RightUpDownVector', 'RightUpTeeVector', 'RightUpVectorBar',
+ 'RightUpVector', 'RightVectorBar', 'RightVector', '$RootDirectory',
+ 'RogersTanimotoDissimilarity', 'RootApproximant', 'RootIntervals',
+ 'RootLocusPlot', 'RootMeanSquare', 'RootOfUnityQ', 'RootReduce',
+ 'RootSum', 'RotateLabel', 'RotateLeft', 'Rotate', 'RotateRight',
+ 'RotationAction', 'RotationMatrix', 'RotationTransform', 'RowBox',
+ 'RoundingRadius', 'RowAlignments', 'RowLines', 'RowMinHeight',
+ 'RowReduce', 'RowsEqual', 'RowSpacings', 'RSolve', 'RuleDelayed',
+ 'RudvalisGroupRu', 'Rule', 'RulerUnits', 'RunScheduledTask',
+ 'RunThrough', 'RuntimeAttributes', 'RuntimeOptions', 'SameQ',
+ 'RussellRaoDissimilarity', 'SameTest', 'SampleDepth', 'SampleRate',
+ 'SampledSoundFunction', 'SampledSoundList', 'SamplingPeriod',
+ 'SatisfiabilityCount', 'SatisfiabilityInstances', 'SatisfiableQ',
+ 'Saveable', 'SaveAutoDelete', 'SaveDefinitions', 'Save', 'Scaled',
+ 'SawtoothWave', 'Scale', 'ScalingFunctions', 'ScalingMatrix',
+ 'ScalingTransform', 'Scan', '$ScheduledTask', 'ScheduledTasks',
+ 'ScheduledTaskObject', 'SchurDecomposition', 'ScientificForm',
+ 'ScreenRectangle', 'ScreenStyleEnvironment', '$ScriptCommandLine',
+ 'ScriptBaselineShifts', 'ScriptLevel', 'ScriptMinSize', 'Sech',
+ 'ScriptSizeMultipliers', 'Scrollbars', 'ScrollingOptions', 'Share',
+ 'ScrollPosition', 'SechDistribution', 'SectorChart3D', 'Select',
+ 'SectorChart', 'SectorOrigin', 'SectorSpacing', 'SeedRandom',
+ 'Selectable', 'SelectComponents', 'SelectedNotebook', 'SendMail',
+ 'SelectionAnimate', 'SelectionCreateCell', 'SelectionEvaluate',
+ 'SelectionEvaluateCreateCell', 'SelectionMove', 'SelfLoopStyle',
+ 'SemialgebraicComponentInstances', 'SequenceAlignment', 'Sequence',
+ 'SequenceForm', 'SequenceHold', 'SeriesCoefficient', 'SeriesData',
+ 'Series', '$SessionID', 'SessionTime', 'SetAccuracy', 'SetDelayed',
+ 'SetAlphaChannel', 'SetAttributes', 'SetDirectory', 'SetFileDate',
+ 'SetOptions', 'SetPrecision', 'SetProperty', 'SetSelectedNotebook',
+ 'SetSharedFunction', 'SetSharedVariable', 'SetStreamPosition',
+ 'SetSystemOptions', 'SetterBar', 'Setter', 'Setting', 'Shading',
+ 'Shallow', 'ShannonWavelet', 'ShapiroWilkTest', '$SharedFunctions',
+ '$SharedVariables', 'Sharpen', 'ShearingMatrix', 'ShortDownArrow',
+ 'ShearingTransform', 'ShortestMatch', 'Shortest', 'ShortLeftArrow',
+ 'ShortestPathFunction', 'Short', 'ShortRightArrow', 'ShortUpArrow',
+ 'ShowAutoStyles', 'ShowCellBracket', 'ShowCellLabel', 'Show',
+ 'ShowCellTags', 'ShowClosedCellArea', 'ShowContents', 'Signature',
+ 'ShowCursorTracker', 'ShowGroupOpener', 'ShowPageBreaks', 'Sign',
+ 'ShowSelection', 'ShowShortBoxForm', 'ShowSpecialCharacters',
+ 'ShowStringCharacters', 'ShrinkingDelay', 'SiegelTheta', 'Sinc',
+ 'SiegelTukeyTest', 'SignedRankTest', 'SignificanceLevel', 'Sinh',
+ 'SignPadding', 'SignTest', 'SimilarityRules', 'SimpleGraph',
+ 'SimpleGraphQ', 'Simplify', 'SinghMaddalaDistribution', 'Skeleton',
+ 'SingleLetterItalics', 'SingularValueDecomposition', 'SinIntegral',
+ 'SingularValueList', 'SingularValuePlot', 'SingularValues', 'Skip',
+ 'SinhIntegral', 'SixJSymbol', 'SkeletonTransform', 'Skewness',
+ 'SkellamDistribution', 'SkewNormalDistribution', 'Slider2D',
+ 'Slider', 'SlideView', 'Slot', 'SlotSequence', 'SmallCircle',
+ 'Smaller', 'Small', 'SmithWatermanSimilarity', 'SmoothHistogram3D',
+ 'SmoothDensityHistogram', 'SmoothHistogram', 'SolveAlways', 'Sort',
+ 'SmoothKernelDistribution', 'SokalSneathDissimilarity', 'Solve',
+ 'SortBy', '$SoundDisplayFunction', 'Sound', 'SoundNote', 'Spacer',
+ 'SoundVolume', 'Spacings', 'SpanAdjustments', 'SpanFromAbove',
+ 'SpanCharacterRounding', 'SpanFromBoth', 'SpanFromLeft', 'Span',
+ 'SpanLineThickness', 'SpanMaxSize', 'SpanMinSize', 'SpanSymmetric',
+ 'SparseArray', 'Speak', 'Specularity', 'SpellingCorrection',
+ 'SpellingDictionaries', 'SpellingDictionariesPath', 'Sphere',
+ 'SpellingOptions', 'SphericalBesselJ', 'SphericalBesselY', 'Split',
+ 'SphericalHankelH1', 'SphericalHankelH2', 'SphericalHarmonicY',
+ 'SphericalPlot3D', 'SphericalRegion', 'SpheroidalEigenvalue',
+ 'SpheroidalJoiningFactor', 'SpheroidalPS', 'SpheroidalPSPrime',
+ 'SpheroidalQS', 'SpheroidalQSPrime', 'SpheroidalRadialFactor',
+ 'SpheroidalS1', 'SpheroidalS1Prime', 'SpheroidalS2', 'Splice',
+ 'SpheroidalS2Prime', 'SplineClosed', 'SplineDegree', 'SplineKnots',
+ 'SplineWeights', 'SplitBy', 'SpokenString', 'SqrtBox', 'Sqrt',
+ 'SquaredEuclideanDistance', 'SquareFreeQ', 'SquareIntersection',
+ 'Square', 'SquaresR', 'SquareSubsetEqual', 'SquareSubset', 'Stack',
+ 'SquareSupersetEqual', 'SquareSuperset', 'SquareUnion', 'Star',
+ 'SquareWave', 'StabilityMargins', 'StabilityMarginsStyle', 'Stub',
+ 'StableDistribution', 'StackBegin', 'StackComplete', 'Standardize',
+ 'StackInhibit', 'StandardDeviationFilter', 'StandardDeviation',
+ 'StandardForm', 'StarGraph', 'StartingStepSize', 'StartOfLine',
+ 'StartOfString', 'StartProcess', 'StartScheduledTask', 'Streams',
+ 'StartupSound', 'StateFeedbackGains', 'StateOutputEstimator',
+ 'StateResponse', 'StateSpaceModel', 'StateSpaceRealization',
+ 'StateSpaceTransform', 'StationaryWaveletPacketTransform', 'Style',
+ 'StationaryWaveletTransform', 'StatusArea', 'StepMonitor', 'Table',
+ 'StieltjesGamma', 'StirlingS1', 'StirlingS2', 'StopScheduledTask',
+ 'StreamColorFunction', 'StreamColorFunctionScaling', 'StreamPlot',
+ 'StreamDensityPlot', 'StreamPoints', 'StreamPosition', 'String',
+ 'StreamScale', 'StreamStyle', 'StringCases', 'StringCount', 'Take',
+ 'StringDrop', 'StringExpression', 'StringFormat', 'StringForm',
+ 'StringFreeQ', 'StringInsert', 'StringJoin', 'StringLength',
+ 'StringMatchQ', 'StringPosition', 'StringQ', 'StringReplaceList',
+ 'StringReplace', 'StringReplacePart', 'StringReverse', 'StruveH',
+ 'StringSkeleton', 'StringSplit', 'StringTake', 'StringToStream',
+ 'StringTrim', 'StructuredSelection', 'StruveL', 'StyleBox', 'Tanh',
+ 'StudentTDistribution', 'StyleBoxAutoDelete', 'StyleData', 'Tally',
+ 'StyleDefinitions', 'StyleForm', 'StyleMenuListing', 'StylePrint',
+ 'StyleNameDialogSettings', 'StyleSheetPath', 'Subfactorial',
+ 'Subgraph', 'SubMinus', 'SubPlus', 'Subresultants', 'SubscriptBox',
+ 'SubscriptBoxOptions', 'Subscripted', 'Subscript', 'SubsetEqual',
+ 'Subset', 'Subsets', 'SubStar', 'SubsuperscriptBox', 'Subtract',
+ 'SubsuperscriptBoxOptions', 'Subsuperscript', 'SubtractFrom',
+ 'SucceedsEqual', 'Succeeds', 'SucceedsSlantEqual', 'SucceedsTilde',
+ 'SuchThat', 'SumConvergence', 'SuperDagger', 'SuperMinus', 'Text',
+ 'SuperPlus', 'SuperscriptBox', 'SuperscriptBoxOptions', 'Superset',
+ 'Superscript', 'SupersetEqual', 'SuperStar', 'SurfaceColor',
+ 'SurfaceGraphics', 'SurvivalDistribution', 'SurvivalFunction',
+ 'SuspendPacket', 'SuzukiDistribution', 'SuzukiGroupSuz', 'Switch',
+ 'SymbolName', 'Symbol', 'SymletWavelet', 'SymmetricGroup', 'Thick',
+ 'SymmetricMatrixQ', 'SymmetricPolynomial', 'SymmetricReduction',
+ 'SynchronousInitialization', 'SynchronousUpdating', 'SyntaxForm',
+ '$SyntaxHandler', 'SyntaxInformation', 'SyntaxLength', 'SyntaxQ',
+ 'SyntaxPacket', '$SystemCharacterEncoding', 'SystemDialogInput',
+ 'SystemHelpPath', '$SystemID', 'SystemInformation', '$System',
+ 'SystemOpen', 'SystemOptions', 'SystemsModelDelete', 'TabFilling',
+ 'SystemsModelDimensions', 'SystemsModelExtract', 'TableAlignments',
+ 'SystemsModelFeedbackConnect', 'SystemsModelLabels', 'TableDepth',
+ 'SystemsModelOrder', 'SystemsModelParallelConnect', 'TableForm',
+ 'SystemsModelSeriesConnect', 'SystemsModelStateFeedbackConnect',
+ '$SystemWordLength', 'TableDirections', 'TableHeadings', 'TabView',
+ 'TableSpacing', 'TabSpacings', 'TagBox', 'TaggingRules', 'TagSet',
+ 'TagSetDelayed', 'TagUnset', 'TakeWhile', 'TargetFunctions',
+ 'TautologyQ', '$TemporaryDirectory', 'Temporary', 'TensorRank',
+ '$TemporaryPrefix', 'TeXForm', 'TeXSave', 'TextAlignment', 'Thin',
+ 'TextCell', 'TextClipboardType', 'TextData', 'TextJustification',
+ 'TextPacket', 'TextRecognize', '$TextStyle', 'TextStyle', 'Thread',
+ 'TextureCoordinateFunction', 'TextureCoordinateScaling', 'Texture',
+ 'Therefore', 'Thickness', 'Thinning', 'ThompsonGroupTh', 'Through',
+ 'ThreeJSymbol', 'Threshold', 'Throw', 'Thumbnail', 'Ticks', 'Tiny',
+ 'TicksStyle', 'TildeEqual', 'TildeFullEqual', 'Tilde', '$TimedOut',
+ 'TildeTilde', 'TimeConstrained', 'TimeConstraint', 'TimesBy',
+ 'Times', '$TimeUnit', 'TimeUsed', 'TimeValue', '$TimeZone', 'Trig',
+ 'TimeZone', 'Timing', 'TitsGroupT', 'ToASCII', 'ToBoxes', 'ToDate',
+ 'ToCharacterCode', 'ToContinuousTimeModel', 'ToDiscreteTimeModel',
+ 'ToeplitzMatrix', 'ToExpression', 'ToFileName', 'Together', 'True',
+ 'TogglerBar', 'Toggler', 'ToHeldExpression', 'TokenWords', 'Total',
+ 'Tolerance', 'ToLowerCase', 'ToNumberField', 'TooltipDelay',
+ 'Tooltip', '$TopDirectory', 'TopHatTransform', 'TopologicalSort',
+ 'ToRadicals', 'ToRules', 'ToString', 'TotalVariationFilter',
+ 'TotalWidth', 'ToUpperCase', 'TraceAbove', 'TraceBackward', 'Tube',
+ 'TraceDepth', 'TraceDialog', 'TraceForward', 'Trace', 'TraceOff',
+ 'TraceOn', 'TraceOriginal', 'TracePrint', 'TraceScan', 'Translate',
+ 'TrackedSymbols', 'TradingChart', 'TraditionalForm', 'Transparent',
+ 'TraditionalFunctionNotation', 'TransferFunctionCancel', 'Trigger',
+ 'TransferFunctionExpand', 'TransferFunctionFactor', 'Transpose',
+ 'TransferFunctionModel', 'TransferFunctionPoles', 'TreeForm',
+ 'TransferFunctionZeros', 'TransformationFunction', 'TreeGraph',
+ 'TransformationFunctions', 'TransformationMatrix', 'TreeGraphQ',
+ 'TransformedDistribution', 'TranslationTransform', 'TreePlot',
+ 'TrendStyle', 'TriangleWave', 'TriangularDistribution', 'TrueQ',
+ 'TrigExpand', 'TrigFactorList', 'TrigFactor', 'TrigReduce', 'With',
+ 'TrigToExp', 'TrimmedMean', 'TruncatedDistribution', 'TTest',
+ 'TukeyLambdaDistribution', 'Tuples', 'TuranGraph', 'TuringMachine',
+ 'Uncompress', 'Undefined', 'UnderBar', 'Underflow', 'Underlined',
+ 'UnderoverscriptBox', 'UnderoverscriptBoxOptions', 'Underscript',
+ 'Underoverscript', 'UnderscriptBox', 'UnderscriptBoxOptions',
+ 'UndirectedEdge', 'UndirectedGraph', 'UndirectedGraphQ', 'Unequal',
+ 'Unevaluated', 'UniformDistribution', 'UniformGraphDistribution',
+ 'UniformSumDistribution', 'Uninstall', 'Union', 'UnionPlus',
+ 'Unique', 'UnitBox', 'Unitize', 'UnitStep', 'UnitTriangle', 'Word',
+ 'UnitVector', 'Unprotect', 'UnsameQ', 'UnsavedVariables', 'Unset',
+ 'UnsetShared', 'UpArrowBar', 'UpArrowDownArrow', 'UpArrow', 'Xnor',
+ 'UpdateInterval', 'Update', 'UpDownArrow', 'UpEquilibrium', 'Zeta',
+ 'UpperCaseQ', 'UpperLeftArrow', 'UpperRightArrow', 'UpSetDelayed',
+ 'UpperTriangularize', 'UpSet', 'UpTeeArrow', 'UpValues', '$Urgent',
+ '$UserAddOnsDirectory', '$UserBaseDirectory', '$UserName', 'Wedge',
+ '$UserDocumentsDirectory', 'UsingFrontEnd', 'ValidationLength',
+ 'ValueQ', 'Variables', 'VarianceEquivalenceTest', 'Variance',
+ 'VarianceEstimatorFunction', 'VarianceTest', 'VectorAngle',
+ 'VectorColorFunction', 'VectorColorFunctionScaling', 'VectorPlot',
+ 'VectorDensityPlot', 'VectorPlot3D', 'VectorPoints', 'VectorQ',
+ 'VectorScale', 'VectorStyle', 'Verbatim', 'VerifyConvergence',
+ 'VerifyTestAssumptions', '$Version', '$VersionNumber', 'VertexAdd',
+ 'VertexColors', 'VertexComponent', 'VertexCoordinateRules',
+ 'VertexCoordinates', 'VertexCount', 'VertexCoverQ', 'VertexDegree',
+ 'VertexDelete', 'VertexEccentricity', 'VertexInComponent', 'Which',
+ 'VertexInDegree', 'VertexIndex', 'VertexLabeling', 'VertexLabels',
+ 'VertexLabelStyle', 'VertexList', 'VertexNormals', 'VertexQ',
+ 'VertexOutComponent', 'VertexOutDegree', 'VertexRenderingFunction',
+ 'VertexReplace', 'VertexShapeFunction', 'VertexShape', 'ViewAngle',
+ 'VertexSize', 'VertexStyle', 'VertexTextureCoordinates', 'Visible',
+ 'VertexWeight', 'VerticalBar', 'VerticalSeparator', 'ViewCenter',
+ 'VerticalSlider', 'VerticalTilde', 'ViewMatrix', 'ViewPoint',
+ 'ViewRange', 'ViewVector', 'ViewVertical', 'VonMisesDistribution',
+ 'WaitAll', 'WaitNext', 'WakebyDistribution', 'WatershedComponents',
+ 'WalleniusHypergeometricDistribution', 'WaringYuleDistribution',
+ 'WatsonUSquareTest', 'WattsStrogatzGraphDistribution', 'WeberE',
+ 'WaveletBestBasis', 'WaveletFilterCoefficients', 'WaveletListPlot',
+ 'WaveletImagePlot', 'WaveletMapIndexed', 'WaveletMatrixPlot',
+ 'WaveletPhi', 'WaveletPsi', 'WaveletScale', 'WaveletScalogram',
+ 'WaveletThreshold', 'WeatherData', 'WeibullDistribution', 'While',
+ 'WeierstrassHalfPeriods', 'WeierstrassInvariants', 'WeierstrassP',
+ 'WeierstrassPPrime', 'WeierstrassSigma', 'WeierstrassZeta',
+ 'WeightedAdjacencyGraph', 'WeightedAdjacencyMatrix', 'Weights',
+ 'WeightedGraphQ', 'WheelGraph', 'White', 'WhitespaceCharacter',
+ 'Whitespace', 'WhittakerM', 'WhittakerW', 'WienerFilter', 'Write',
+ 'WignerD', 'WignerSemicircleDistribution', 'WindowClickSelect',
+ 'WindowElements', 'WindowFloating', 'WindowFrameElements', 'ZTest',
+ 'WindowFrame', 'WindowMargins', 'WindowMovable', 'WindowOpacity',
+ 'WindowSize', 'WindowStatusArea', 'WindowTitle', 'WindowToolbars',
+ 'WolframAlpha', 'WordBoundary', 'WordCharacter', 'WordData',
+ 'WordSearch', 'WordSeparators', 'WorkingPrecision', 'WriteString',
+ 'Wronskian', 'XMLElement', 'XMLObject', 'Yellow', 'ZernikeR',
+ 'YuleDissimilarity', 'ZeroTest', 'ZeroWidthTimes', 'ZetaZero',
+ 'ZipfDistribution', 'ZTransform'
+ )
+ ),
+ /* Most symbol combinations can be valid Wolfram operators */
+ 'SYMBOLS' => array(
+ '!', '@', '#', '$', '%', '&', '*', '-', '+', '=',
+ '^', '~', '|', '\\', '>', '<', ':', '?', '/'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true /* Wolfram is a case sensitive language */
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'font-weight: bold;', /* make the system functions bold */
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: grey;',
+ 2 => 'color: grey;', /* nested comments are grey as well */
+ 3 => 'color: #000aa; font-weight: bold;' /* complex symbols */
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'background-color: #3cb371; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: green; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: grey; font-weight: bold;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: red;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #060;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933; font-weight: bold;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ /* online documentation for system functions */
+ 1 => 'http://reference.wolfram.com/language/ref/{FNAME}.html'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
diff --git a/vendor/geshi/geshi/src/geshi/xbasic.php b/vendor/geshi/geshi/src/geshi/xbasic.php
index 45af71095..c78a7b917 100644
--- a/vendor/geshi/geshi/src/geshi/xbasic.php
+++ b/vendor/geshi/geshi/src/geshi/xbasic.php
@@ -4,7 +4,7 @@
* ----------
* Author: Jos Gabriel Moya Yangela (josemoya@gmail.com)
* Copyright: (c) 2005 Jos Gabriel Moya Yangela (http://aprenderadesaprender.6te.net)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2005/11/23
*
* XBasic language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/xml.php b/vendor/geshi/geshi/src/geshi/xml.php
index a6a145f11..6f127391e 100644
--- a/vendor/geshi/geshi/src/geshi/xml.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2004/09/01
*
* XML language file for GeSHi. Based on the idea/file by Christian Weiske
diff --git a/vendor/geshi/geshi/src/geshi/xojo.php b/vendor/geshi/geshi/src/geshi/xojo.php
index e067acf4a..abd252572 100644
--- a/vendor/geshi/geshi/src/geshi/xojo.php
+++ b/vendor/geshi/geshi/src/geshi/xojo.php
@@ -4,7 +4,7 @@
* --------
* Author: Dr Garry Pettet (contact@garrypettet.com)
* Copyright: (c) 2014 Dr Garry Pettet (http://garrypettet.com)
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2014/10/19
*
* Xojo language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/xorg_conf.php b/vendor/geshi/geshi/src/geshi/xorg_conf.php
index 92b276bd9..b9280bb36 100644
--- a/vendor/geshi/geshi/src/geshi/xorg_conf.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2008/06/18
*
* xorg.conf language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/xpp.php b/vendor/geshi/geshi/src/geshi/xpp.php
index d249c487c..0e57f4d1e 100644
--- a/vendor/geshi/geshi/src/geshi/xpp.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/02/27
*
* Axapta/Dynamics Ax X++ language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/yaml.php b/vendor/geshi/geshi/src/geshi/yaml.php
index 252779e9d..e42371761 100644
--- a/vendor/geshi/geshi/src/geshi/yaml.php
+++ b/vendor/geshi/geshi/src/geshi/yaml.php
@@ -4,7 +4,7 @@
* --------
* Author: Josh Ventura (JoshV10@gmail.com)
* Copyright: (c) 2010 Josh Ventura
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/12/14
*
* YAML language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/z80.php b/vendor/geshi/geshi/src/geshi/z80.php
index 5c8021f9e..d934933c9 100644
--- a/vendor/geshi/geshi/src/geshi/z80.php
+++ b/vendor/geshi/geshi/src/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.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2007/02/06
*
* ZiLOG Z80 Assembler language file for GeSHi.
diff --git a/vendor/geshi/geshi/src/geshi/zxbasic.php b/vendor/geshi/geshi/src/geshi/zxbasic.php
index d09719490..ec90e796f 100644
--- a/vendor/geshi/geshi/src/geshi/zxbasic.php
+++ b/vendor/geshi/geshi/src/geshi/zxbasic.php
@@ -4,7 +4,7 @@
* -------------
* Author: Jose Rodriguez (a.k.a. Boriel)
* Based on Copyright: (c) 2005 Roberto Rossi (http://rsoftware.altervista.org) Freebasic template
- * Release Version: 1.0.9.0
+ * Release Version: 1.0.9.1
* Date Started: 2010/06/19
*
* ZXBasic language file for GeSHi.
diff --git a/vendor/marcusschwarz/lesserphp/HISTORY.md b/vendor/marcusschwarz/lesserphp/HISTORY.md
index 19ec7dc83..4a55d823c 100644
--- a/vendor/marcusschwarz/lesserphp/HISTORY.md
+++ b/vendor/marcusschwarz/lesserphp/HISTORY.md
@@ -1,10 +1,15 @@
-# lesserphp v0.5.1
+# lesserphp v0.5.4
Originally written by Leaf Corcoran, obviously abandoned circa 2014
https://github.com/leafo/lessphp
Last version provided by Leaf was 0.5.0
+### v.0.5.4
+* 2020-01-19: added 7.4 support to travis and removed antique php versions (@phy25)
+* 2020-01-19: fixed wrong array access in lib_luma
+* 2020-01-19: removed HHVM profile from travis. HHVM support is now broken anyway
+
### v.0.5.1
* 2016-09-30: renaming it to lesserphp for easier distinction
* 2016-09-30: applying some pull requests of the origin repository
diff --git a/vendor/marcusschwarz/lesserphp/README.md b/vendor/marcusschwarz/lesserphp/README.md
index b30e07eac..8c26ab14a 100644
--- a/vendor/marcusschwarz/lesserphp/README.md
+++ b/vendor/marcusschwarz/lesserphp/README.md
@@ -1,6 +1,6 @@
-[![Build Status](https://travis-ci.org/MarcusSchwarz/lessphp.svg?branch=0.5.1)](https://travis-ci.org/MarcusSchwarz/lessphp)
+[![Build Status](https://travis-ci.org/MarcusSchwarz/lesserphp.svg)](https://travis-ci.org/MarcusSchwarz/lesserphp)
-# lesserphp v0.5.1
+# lesserphp v0.5.4
### <http://github.com/MarcusSchwarz/lesserphp>
`lesserphp` is a compiler for LESS written in PHP. It is based on lessphp bei leafo.
diff --git a/vendor/marcusschwarz/lesserphp/lessc.inc.php b/vendor/marcusschwarz/lesserphp/lessc.inc.php
index b9e80ccc8..4764b28b8 100644
--- a/vendor/marcusschwarz/lesserphp/lessc.inc.php
+++ b/vendor/marcusschwarz/lesserphp/lessc.inc.php
@@ -1,7 +1,7 @@
<?php
/**
- * lessphp v0.5.1
+ * lessphp v0.5.2
* http://leafo.net/lessphp
*
* LESS CSS compiler, adapted from http://lesscss.org
@@ -39,7 +39,7 @@
* handling things like indentation.
*/
class lessc {
- static public $VERSION = "v0.5.1";
+ static public $VERSION = "v0.5.2";
static public $TRUE = array("keyword", "true");
static public $FALSE = array("keyword", "false");
@@ -352,9 +352,9 @@ class lessc {
$other = array_merge($other, $stack);
if ($split) {
- return array(array_merge($imports, $vars), $other);
+ return array(array_merge($vars, $imports, $vars), $other);
} else {
- return array_merge($imports, $vars, $other);
+ return array_merge($vars, $imports, $vars, $other);
}
}
@@ -668,7 +668,7 @@ class lessc {
// check for a rest
$last = end($args);
- if ($last[0] == "rest") {
+ if ($last !== false && $last[0] === "rest") {
$rest = array_slice($orderedValues, count($args) - 1);
$this->set($last[1], $this->reduce(array("list", " ", $rest)));
}
@@ -1349,7 +1349,7 @@ class lessc {
protected function lib_luma($color) {
$color = $this->coerceColor($color);
- return (0.2126 * $color[0] / 255) + (0.7152 * $color[1] / 255) + (0.0722 * $color[2] / 255);
+ return (0.2126 * $color[1] / 255) + (0.7152 * $color[2] / 255) + (0.0722 * $color[3] / 255);
}
@@ -2052,7 +2052,7 @@ class lessc {
$this->pushEnv();
$parser = new lessc_parser($this, __METHOD__);
foreach ($args as $name => $strValue) {
- if ($name{0} != '@') $name = '@'.$name;
+ if ($name[0] != '@') $name = '@'.$name;
$parser->count = 0;
$parser->buffer = (string)$strValue;
if (!$parser->propertyValue($value)) {
diff --git a/vendor/openpsa/universalfeedcreator/composer.json b/vendor/openpsa/universalfeedcreator/composer.json
index caabfcedc..57b1b0c75 100644
--- a/vendor/openpsa/universalfeedcreator/composer.json
+++ b/vendor/openpsa/universalfeedcreator/composer.json
@@ -3,7 +3,7 @@
"type": "library",
"description": "RSS and Atom feed generator by Kai Blankenhorn",
"keywords": ["rss", "atom", "pie", "opml", "gpx", "georss"],
- "license": "LGPL",
+ "license": "LGPL-2.1-or-later",
"authors": [
{
"name": "Andreas Flack",
@@ -15,7 +15,8 @@
"php": ">=5.0"
},
"autoload": {
- "classmap": ["lib"]
+ "classmap": ["lib"],
+ "files": ["lib/constants.php"]
},
"require-dev": {
"phpunit/phpunit": "*"
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/AtomCreator03.php b/vendor/openpsa/universalfeedcreator/lib/Creator/AtomCreator03.php
index 5f80a7562..2ec95a402 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/AtomCreator03.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/AtomCreator03.php
@@ -14,7 +14,6 @@
* @see FeedCreator#additionalElements
* @since 1.6
* @author Kai Blankenhorn <kaib@bitfolge.de>, Scott Reynen <scott@randomchaos.com>
- * @package de.bitfolge.feedcreator
*/
class AtomCreator03 extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/AtomCreator10.php b/vendor/openpsa/universalfeedcreator/lib/Creator/AtomCreator10.php
index db7314ed5..2f4532262 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/AtomCreator10.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/AtomCreator10.php
@@ -14,7 +14,6 @@
* @see FeedCreator#additionalElements
* @since 1.7.2-mod (modified)
* @author Mohammad Hafiz Ismail (mypapit@gmail.com)
- * @package de.bitfolge.feedcreator
*/
class AtomCreator10 extends FeedCreator
{
@@ -103,14 +102,16 @@ class AtomCreator10 extends FeedCreator
$feed .= " </author>\n";
}
- if ($this->items[$i]->category != "") {
- $feed .= " <category ";
+ if (!empty($this->items[$i]->category)) {
+ foreach ((array) $this->items[$i]->category as $category) {
+ $feed .= " <category ";
- if ($this->items[$i]->categoryScheme != "") {
- $feed .= " scheme=\"".htmlspecialchars($this->items[$i]->categoryScheme)."\" ";
- }
+ if ($this->items[$i]->categoryScheme != "") {
+ $feed .= " scheme=\"".htmlspecialchars($this->items[$i]->categoryScheme)."\" ";
+ }
- $feed .= " term=\"".htmlspecialchars($this->items[$i]->category)."\" />\n";
+ $feed .= " term=\"".htmlspecialchars($category)."\" />\n";
+ }
}
if ($this->items[$i]->description != "") {
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/FeedCreator.php b/vendor/openpsa/universalfeedcreator/lib/Creator/FeedCreator.php
index d5e99cd46..907ca8377 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/FeedCreator.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/FeedCreator.php
@@ -6,7 +6,6 @@
*
* @author Kai Blankenhorn <kaib@bitfolge.de>
* @since 1.4
- * @package de.bitfolge.feedcreator
*/
abstract class FeedCreator extends HtmlDescribable
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/GPXCreator.php b/vendor/openpsa/universalfeedcreator/lib/Creator/GPXCreator.php
index e8df3081e..367fb46b4 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/GPXCreator.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/GPXCreator.php
@@ -5,7 +5,6 @@
*
* @since 1.7.6
* @author Barry Hunter <geo@barryhunter.co.uk>
- * @package de.bitfolge.feedcreator
*/
class GPXCreator extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/HTMLCreator.php b/vendor/openpsa/universalfeedcreator/lib/Creator/HTMLCreator.php
index 9b6f8b5ca..e02a8d767 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/HTMLCreator.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/HTMLCreator.php
@@ -10,7 +10,6 @@
*
* @author Pascal Van Hecke
* @since 1.7
- * @package de.bitfolge.feedcreator
*/
class HTMLCreator extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/JSCreator.php b/vendor/openpsa/universalfeedcreator/lib/Creator/JSCreator.php
index 5b75ea7b5..5aa31faa0 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/JSCreator.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/JSCreator.php
@@ -5,7 +5,6 @@
* location, overriding the createFeed method of the parent HTMLCreator.
*
* @author Pascal Van Hecke
- * @package de.bitfolge.feedcreator
*/
class JSCreator extends HTMLCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/KMLCreator.php b/vendor/openpsa/universalfeedcreator/lib/Creator/KMLCreator.php
index acb0abc0f..31073d8bf 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/KMLCreator.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/KMLCreator.php
@@ -5,7 +5,6 @@
*
* @since 1.7.3
* @author Barry Hunter <geo@barryhunter.co.uk>
- * @package de.bitfolge.feedcreator
*/
class KMLCreator extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/MBOXCreator.php b/vendor/openpsa/universalfeedcreator/lib/Creator/MBOXCreator.php
index d7f898dc3..9198f1ff6 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/MBOXCreator.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/MBOXCreator.php
@@ -6,7 +6,6 @@
*
* @since 1.3
* @author Kai Blankenhorn <kaib@bitfolge.de>
- * @package de.bitfolge.feedcreator
*/
class MBOXCreator extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/OPMLCreator.php b/vendor/openpsa/universalfeedcreator/lib/Creator/OPMLCreator.php
index 6dcdc82b9..b795558d6 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/OPMLCreator.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/OPMLCreator.php
@@ -6,7 +6,6 @@
* @see http://opml.scripting.com/spec
* @author Dirk Clemens, Kai Blankenhorn
* @since 1.5
- * @package de.bitfolge.feedcreator
*/
class OPMLCreator extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/PHPCreator.php b/vendor/openpsa/universalfeedcreator/lib/Creator/PHPCreator.php
index 23b83529a..fe61a3f6f 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/PHPCreator.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/PHPCreator.php
@@ -5,7 +5,6 @@
*
* @since 1.7.3
* @author Barry Hunter <geo@barryhunter.co.uk>
- * @package de.bitfolge.feedcreator
*/
class PHPCreator extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/PIECreator01.php b/vendor/openpsa/universalfeedcreator/lib/Creator/PIECreator01.php
index 5700123c2..2f069aac4 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/PIECreator01.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/PIECreator01.php
@@ -7,7 +7,6 @@
* @deprecated
* @since 1.3
* @author Scott Reynen <scott@randomchaos.com> and Kai Blankenhorn <kaib@bitfolge.de>
- * @package de.bitfolge.feedcreator
*/
class PIECreator01 extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator091.php b/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator091.php
index cd229e954..7b13acd83 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator091.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator091.php
@@ -6,7 +6,6 @@
* @see http://my.netscape.com/publish/formats/rss-spec-0.91.html
* @since 1.3
* @author Kai Blankenhorn <kaib@bitfolge.de>
- * @package de.bitfolge.feedcreator
*/
class RSSCreator091 extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator10.php b/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator10.php
index d9ed1d01d..8d0c1ca8c 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator10.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator10.php
@@ -6,7 +6,6 @@
* @see http://www.purl.org/rss/1.0/
* @since 1.3
* @author Kai Blankenhorn <kaib@bitfolge.de>
- * @package de.bitfolge.feedcreator
*/
class RSSCreator10 extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator20.php b/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator20.php
index dbc25ab76..fb39efe61 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator20.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Creator/RSSCreator20.php
@@ -6,7 +6,6 @@
* @see http://backend.userland.com/rss
* @since 1.3
* @author Kai Blankenhorn <kaib@bitfolge.de>
- * @package de.bitfolge.feedcreator
*/
class RSSCreator20 extends RSSCreator091
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Element/FeedDate.php b/vendor/openpsa/universalfeedcreator/lib/Element/FeedDate.php
index 690c65ad6..249f96c89 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Element/FeedDate.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Element/FeedDate.php
@@ -3,8 +3,6 @@
/**
* FeedDate is an internal class that stores a date for a feed or feed item.
* Usually, you won't need to use this.
- *
- * @package de.bitfolge.feedcreator
*/
class FeedDate
{
@@ -109,11 +107,7 @@ class FeedDate
*/
public function iso8601()
{
- $date = gmdate("Y-m-d\TH:i:sO", $this->unix);
- $date = substr($date, 0, 22).':'.substr($date, -2);
- if (TIME_ZONE != "") {
- $date = str_replace("+00:00", TIME_ZONE, $date);
- }
+ $date = gmdate("Y-m-d\TH:i:sP", $this->unix);
return $date;
}
diff --git a/vendor/openpsa/universalfeedcreator/lib/Element/FeedHtmlField.php b/vendor/openpsa/universalfeedcreator/lib/Element/FeedHtmlField.php
index 8979e958f..84f0ac4bb 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Element/FeedHtmlField.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Element/FeedHtmlField.php
@@ -7,7 +7,6 @@
*
* @author Pascal Van Hecke <feedcreator.class.php@vanhecke.info>
* @version 1.6
- * @package de.bitfolge.feedcreator
*/
class FeedHtmlField
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Element/FeedImage.php b/vendor/openpsa/universalfeedcreator/lib/Element/FeedImage.php
index d525379fa..cc9df46aa 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Element/FeedImage.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Element/FeedImage.php
@@ -5,7 +5,6 @@
*
* @author Kai Blankenhorn <kaib@bitfolge.de>
* @since 1.3
- * @package de.bitfolge.feedcreator
*/
class FeedImage extends HtmlDescribable
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Element/FeedItem.php b/vendor/openpsa/universalfeedcreator/lib/Element/FeedItem.php
index 827768515..3b51cc2ab 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Element/FeedItem.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Element/FeedItem.php
@@ -5,7 +5,6 @@
*
* @author Kai Blankenhorn <kaib@bitfolge.de>
* @since 1.3
- * @package de.bitfolge.feedcreator
*/
class FeedItem extends HtmlDescribable
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/Element/HtmlDescribable.php b/vendor/openpsa/universalfeedcreator/lib/Element/HtmlDescribable.php
index 0fce11f76..e34e2b1df 100644
--- a/vendor/openpsa/universalfeedcreator/lib/Element/HtmlDescribable.php
+++ b/vendor/openpsa/universalfeedcreator/lib/Element/HtmlDescribable.php
@@ -3,8 +3,6 @@
/**
* An HtmlDescribable is an item within a feed that can have a description that may
* include HTML markup.
- *
- * @package de.bitfolge.feedcreator
*/
class HtmlDescribable
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/UniversalFeedCreator.php b/vendor/openpsa/universalfeedcreator/lib/UniversalFeedCreator.php
index 7804e73ee..4b7afe6f2 100644
--- a/vendor/openpsa/universalfeedcreator/lib/UniversalFeedCreator.php
+++ b/vendor/openpsa/universalfeedcreator/lib/UniversalFeedCreator.php
@@ -1,14 +1,4 @@
<?php
-// your local timezone, set to "" to disable or for GMT
-if (!defined('TIME_ZONE')) {
- define("TIME_ZONE", date("O", time()));
-}
-
-/**
- * Version string.
- */
-define("FEEDCREATOR_VERSION", "FeedCreator 1.8");
-
/**
* UniversalFeedCreator lets you choose during runtime which
* format to build.
@@ -17,7 +7,6 @@ define("FEEDCREATOR_VERSION", "FeedCreator 1.8");
*
* @since 1.3
* @author Kai Blankenhorn <kaib@bitfolge.de>
- * @package de.bitfolge.feedcreator
*/
class UniversalFeedCreator extends FeedCreator
{
diff --git a/vendor/openpsa/universalfeedcreator/lib/constants.php b/vendor/openpsa/universalfeedcreator/lib/constants.php
new file mode 100644
index 000000000..146c1897f
--- /dev/null
+++ b/vendor/openpsa/universalfeedcreator/lib/constants.php
@@ -0,0 +1,10 @@
+<?php
+// your local timezone, set to "" to disable or for GMT
+if (!defined('TIME_ZONE')) {
+ define("TIME_ZONE", date("O", time()));
+}
+
+/**
+ * Version string.
+ */
+define("FEEDCREATOR_VERSION", "FeedCreator 1.8");
diff --git a/vendor/paragonie/random_compat/composer.json b/vendor/paragonie/random_compat/composer.json
index 1c5978c6f..34f1381d5 100644
--- a/vendor/paragonie/random_compat/composer.json
+++ b/vendor/paragonie/random_compat/composer.json
@@ -4,6 +4,7 @@
"keywords": [
"csprng",
"random",
+ "polyfill",
"pseudorandom"
],
"license": "MIT",
diff --git a/vendor/paragonie/random_compat/lib/byte_safe_strings.php b/vendor/paragonie/random_compat/lib/byte_safe_strings.php
index 3de86b223..ef24488f9 100644
--- a/vendor/paragonie/random_compat/lib/byte_safe_strings.php
+++ b/vendor/paragonie/random_compat/lib/byte_safe_strings.php
@@ -5,7 +5,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -28,8 +28,9 @@
if (!is_callable('RandomCompat_strlen')) {
if (
- defined('MB_OVERLOAD_STRING') &&
- ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING
+ defined('MB_OVERLOAD_STRING')
+ &&
+ ((int) ini_get('mbstring.func_overload')) & MB_OVERLOAD_STRING
) {
/**
* strlen() implementation that isn't brittle to mbstring.func_overload
@@ -82,8 +83,8 @@ if (!is_callable('RandomCompat_substr')) {
if (
defined('MB_OVERLOAD_STRING')
- &&
- ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING
+ &&
+ ((int) ini_get('mbstring.func_overload')) & MB_OVERLOAD_STRING
) {
/**
* substr() implementation that isn't brittle to mbstring.func_overload
@@ -93,7 +94,7 @@ if (!is_callable('RandomCompat_substr')) {
*
* @param string $binary_string
* @param int $start
- * @param int $length (optional)
+ * @param int|null $length (optional)
*
* @throws TypeError
*
@@ -118,6 +119,7 @@ if (!is_callable('RandomCompat_substr')) {
* mb_substr($str, 0, NULL, '8bit') returns an empty string on
* PHP 5.3, so we have to find the length ourselves.
*/
+ /** @var int $length */
$length = RandomCompat_strlen($binary_string) - $start;
} elseif (!is_int($length)) {
throw new TypeError(
@@ -133,7 +135,12 @@ if (!is_callable('RandomCompat_substr')) {
return '';
}
- return (string) mb_substr($binary_string, $start, $length, '8bit');
+ return (string) mb_substr(
+ (string) $binary_string,
+ (int) $start,
+ (int) $length,
+ '8bit'
+ );
}
} else {
@@ -145,7 +152,7 @@ if (!is_callable('RandomCompat_substr')) {
*
* @param string $binary_string
* @param int $start
- * @param int $length (optional)
+ * @param int|null $length (optional)
*
* @throws TypeError
*
@@ -172,10 +179,17 @@ if (!is_callable('RandomCompat_substr')) {
);
}
- return (string) substr($binary_string, $start, $length);
+ return (string) substr(
+ (string )$binary_string,
+ (int) $start,
+ (int) $length
+ );
}
- return (string) substr($binary_string, $start);
+ return (string) substr(
+ (string) $binary_string,
+ (int) $start
+ );
}
}
}
diff --git a/vendor/paragonie/random_compat/lib/cast_to_int.php b/vendor/paragonie/random_compat/lib/cast_to_int.php
index 9a4fab991..1b1bbfe8d 100644
--- a/vendor/paragonie/random_compat/lib/cast_to_int.php
+++ b/vendor/paragonie/random_compat/lib/cast_to_int.php
@@ -5,7 +5,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -27,19 +27,19 @@
*/
if (!is_callable('RandomCompat_intval')) {
-
+
/**
* Cast to an integer if we can, safely.
- *
+ *
* If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
* (non-inclusive), it will sanely cast it to an int. If you it's equal to
* ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats
* lose precision, so the <= and => operators might accidentally let a float
* through.
- *
+ *
* @param int|float $number The number we want to convert to an int
* @param bool $fail_open Set to true to not throw an exception
- *
+ *
* @return float|int
* @psalm-suppress InvalidReturnType
*
@@ -50,14 +50,16 @@ if (!is_callable('RandomCompat_intval')) {
if (is_int($number) || is_float($number)) {
$number += 0;
} elseif (is_numeric($number)) {
+ /** @psalm-suppress InvalidOperand */
$number += 0;
}
+ /** @var int|float $number */
if (
is_float($number)
- &&
+ &&
$number > ~PHP_INT_MAX
- &&
+ &&
$number < PHP_INT_MAX
) {
$number = (int) $number;
diff --git a/vendor/paragonie/random_compat/lib/error_polyfill.php b/vendor/paragonie/random_compat/lib/error_polyfill.php
index 6a91990ce..c02c5c8b4 100644
--- a/vendor/paragonie/random_compat/lib/error_polyfill.php
+++ b/vendor/paragonie/random_compat/lib/error_polyfill.php
@@ -1,12 +1,12 @@
<?php
/**
- * Random_* Compatibility Library
+ * Random_* Compatibility Library
* for using the new PHP 7 random_* API in PHP 5 projects
- *
+ *
* The MIT License (MIT)
*
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- *
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
@@ -30,7 +30,7 @@ if (!class_exists('Error', false)) {
// We can't really avoid making this extend Exception in PHP 5.
class Error extends Exception
{
-
+
}
}
@@ -38,12 +38,12 @@ if (!class_exists('TypeError', false)) {
if (is_subclass_of('Error', 'Exception')) {
class TypeError extends Error
{
-
+
}
} else {
class TypeError extends Exception
{
-
+
}
}
}
diff --git a/vendor/paragonie/random_compat/lib/random.php b/vendor/paragonie/random_compat/lib/random.php
index 080b87c19..36245f542 100644
--- a/vendor/paragonie/random_compat/lib/random.php
+++ b/vendor/paragonie/random_compat/lib/random.php
@@ -3,12 +3,12 @@
* Random_* Compatibility Library
* for using the new PHP 7 random_* API in PHP 5 projects
*
- * @version 2.0.10
- * @released 2017-03-13
+ * @version 2.0.17
+ * @released 2018-07-04
*
* The MIT License (MIT)
*
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -54,9 +54,9 @@ if (!defined('RANDOM_COMPAT_READ_BUFFER')) {
$RandomCompatDIR = dirname(__FILE__);
-require_once $RandomCompatDIR . '/byte_safe_strings.php';
-require_once $RandomCompatDIR . '/cast_to_int.php';
-require_once $RandomCompatDIR . '/error_polyfill.php';
+require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'byte_safe_strings.php';
+require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'cast_to_int.php';
+require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'error_polyfill.php';
if (!is_callable('random_bytes')) {
/**
@@ -76,9 +76,9 @@ if (!is_callable('random_bytes')) {
if (extension_loaded('libsodium')) {
// See random_bytes_libsodium.php
if (PHP_VERSION_ID >= 50300 && is_callable('\\Sodium\\randombytes_buf')) {
- require_once $RandomCompatDIR . '/random_bytes_libsodium.php';
+ require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_libsodium.php';
} elseif (method_exists('Sodium', 'randombytes_buf')) {
- require_once $RandomCompatDIR . '/random_bytes_libsodium_legacy.php';
+ require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_libsodium_legacy.php';
}
}
@@ -117,7 +117,7 @@ if (!is_callable('random_bytes')) {
// place, that is not helpful to us here.
// See random_bytes_dev_urandom.php
- require_once $RandomCompatDIR . '/random_bytes_dev_urandom.php';
+ require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_dev_urandom.php';
}
// Unset variables after use
$RandomCompat_basedir = null;
@@ -159,7 +159,7 @@ if (!is_callable('random_bytes')) {
extension_loaded('mcrypt')
) {
// See random_bytes_mcrypt.php
- require_once $RandomCompatDIR . '/random_bytes_mcrypt.php';
+ require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_mcrypt.php';
}
$RandomCompatUrandom = null;
@@ -184,7 +184,7 @@ if (!is_callable('random_bytes')) {
$RandomCompatCOMtest = new COM('CAPICOM.Utilities.1');
if (method_exists($RandomCompatCOMtest, 'GetRandom')) {
// See random_bytes_com_dotnet.php
- require_once $RandomCompatDIR . '/random_bytes_com_dotnet.php';
+ require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_com_dotnet.php';
}
} catch (com_exception $e) {
// Don't try to use it.
@@ -203,7 +203,7 @@ if (!is_callable('random_bytes')) {
* and hope the developer won't let it fail silently.
*
* @param mixed $length
- * @psalm-suppress MissingReturnType
+ * @psalm-suppress InvalidReturnType
* @throws Exception
* @return string
*/
@@ -219,7 +219,7 @@ if (!is_callable('random_bytes')) {
}
if (!is_callable('random_int')) {
- require_once $RandomCompatDIR . '/random_int.php';
+ require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_int.php';
}
$RandomCompatDIR = null;
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php b/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php
index fc1926e5c..537d02b27 100644
--- a/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php
+++ b/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php
@@ -1,22 +1,22 @@
<?php
/**
- * Random_* Compatibility Library
+ * Random_* Compatibility Library
* for using the new PHP 7 random_* API in PHP 5 projects
- *
+ *
* The MIT License (MIT)
- *
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- *
+ *
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
- *
+ *
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -41,6 +41,7 @@ if (!is_callable('random_bytes')) {
function random_bytes($bytes)
{
try {
+ /** @var int $bytes */
$bytes = RandomCompat_intval($bytes);
} catch (TypeError $ex) {
throw new TypeError(
@@ -54,12 +55,14 @@ if (!is_callable('random_bytes')) {
);
}
+ /** @var string $buf */
$buf = '';
if (!class_exists('COM')) {
throw new Error(
'COM does not exist'
);
}
+ /** @var COM $util */
$util = new COM('CAPICOM.Utilities.1');
$execCount = 0;
@@ -68,12 +71,12 @@ if (!is_callable('random_bytes')) {
* get N bytes of random data, then CAPICOM has failed us.
*/
do {
- $buf .= base64_decode($util->GetRandom($bytes, 0));
+ $buf .= base64_decode((string) $util->GetRandom($bytes, 0));
if (RandomCompat_strlen($buf) >= $bytes) {
/**
* Return our random entropy buffer here:
*/
- return RandomCompat_substr($buf, 0, $bytes);
+ return (string) RandomCompat_substr($buf, 0, $bytes);
}
++$execCount;
} while ($execCount < $bytes);
@@ -85,4 +88,4 @@ if (!is_callable('random_bytes')) {
'Could not gather sufficient random data'
);
}
-} \ No newline at end of file
+}
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php b/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php
index df5b91524..c4e31ccbb 100644
--- a/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php
+++ b/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php
@@ -1,22 +1,22 @@
<?php
/**
- * Random_* Compatibility Library
+ * Random_* Compatibility Library
* for using the new PHP 7 random_* API in PHP 5 projects
- *
+ *
* The MIT License (MIT)
*
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- *
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
- *
+ *
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -36,6 +36,7 @@ if (!is_callable('random_bytes')) {
* random numbers in accordance with best practices
*
* Why we use /dev/urandom and not /dev/random
+ * @ref https://www.2uo.de/myths-about-urandom
* @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers
*
* @param int $bytes
@@ -46,25 +47,47 @@ if (!is_callable('random_bytes')) {
*/
function random_bytes($bytes)
{
+ /** @var resource $fp */
static $fp = null;
+
/**
* This block should only be run once
*/
if (empty($fp)) {
/**
- * We use /dev/urandom if it is a char device.
- * We never fall back to /dev/random
+ * We don't want to ever read C:\dev\random, only /dev/urandom on
+ * Unix-like operating systems. While we guard against this
+ * condition in random.php, it doesn't hurt to be defensive in depth
+ * here.
+ *
+ * To that end, we only try to open /dev/urandom if we're on a Unix-
+ * like operating system (which means the directory separator is set
+ * to "/" not "\".
*/
- $fp = fopen('/dev/urandom', 'rb');
- if (!empty($fp)) {
- $st = fstat($fp);
- if (($st['mode'] & 0170000) !== 020000) {
- fclose($fp);
- $fp = false;
+ if (DIRECTORY_SEPARATOR === '/') {
+ if (!is_readable('/dev/urandom')) {
+ throw new Exception(
+ 'Environment misconfiguration: ' .
+ '/dev/urandom cannot be read.'
+ );
+ }
+ /**
+ * We use /dev/urandom if it is a char device.
+ * We never fall back to /dev/random
+ */
+ /** @var resource|bool $fp */
+ $fp = fopen('/dev/urandom', 'rb');
+ if (is_resource($fp)) {
+ /** @var array<string, int> $st */
+ $st = fstat($fp);
+ if (($st['mode'] & 0170000) !== 020000) {
+ fclose($fp);
+ $fp = false;
+ }
}
}
- if (!empty($fp)) {
+ if (is_resource($fp)) {
/**
* stream_set_read_buffer() does not exist in HHVM
*
@@ -83,6 +106,7 @@ if (!is_callable('random_bytes')) {
}
try {
+ /** @var int $bytes */
$bytes = RandomCompat_intval($bytes);
} catch (TypeError $ex) {
throw new TypeError(
@@ -103,7 +127,7 @@ if (!is_callable('random_bytes')) {
* if (empty($fp)) line is logic that should only be run once per
* page load.
*/
- if (!empty($fp)) {
+ if (is_resource($fp)) {
/**
* @var int
*/
@@ -123,29 +147,28 @@ if (!is_callable('random_bytes')) {
*/
$read = fread($fp, $remaining);
if (!is_string($read)) {
- if ($read === false) {
- /**
- * We cannot safely read from the file. Exit the
- * do-while loop and trigger the exception condition
- *
- * @var string|bool
- */
- $buf = false;
- break;
- }
+ /**
+ * We cannot safely read from the file. Exit the
+ * do-while loop and trigger the exception condition
+ *
+ * @var string|bool
+ */
+ $buf = false;
+ break;
}
/**
* Decrease the number of bytes returned from remaining
*/
$remaining -= RandomCompat_strlen($read);
/**
- * @var string|bool
+ * @var string $buf
*/
- $buf = $buf . $read;
+ $buf .= $read;
} while ($remaining > 0);
/**
* Is our result valid?
+ * @var string|bool $buf
*/
if (is_string($buf)) {
if (RandomCompat_strlen($buf) === $bytes) {
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php b/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php
index 4af1a2422..2e5629018 100644
--- a/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php
+++ b/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php
@@ -1,22 +1,22 @@
<?php
/**
- * Random_* Compatibility Library
+ * Random_* Compatibility Library
* for using the new PHP 7 random_* API in PHP 5 projects
- *
+ *
* The MIT License (MIT)
*
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- *
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
- *
+ *
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -43,6 +43,7 @@ if (!is_callable('random_bytes')) {
function random_bytes($bytes)
{
try {
+ /** @var int $bytes */
$bytes = RandomCompat_intval($bytes);
} catch (TypeError $ex) {
throw new TypeError(
@@ -60,6 +61,7 @@ if (!is_callable('random_bytes')) {
* \Sodium\randombytes_buf() doesn't allow more than 2147483647 bytes to be
* generated in one invocation.
*/
+ /** @var string|bool $buf */
if ($bytes > 2147483647) {
$buf = '';
for ($i = 0; $i < $bytes; $i += 1073741824) {
@@ -69,10 +71,11 @@ if (!is_callable('random_bytes')) {
$buf .= \Sodium\randombytes_buf($n);
}
} else {
+ /** @var string|bool $buf */
$buf = \Sodium\randombytes_buf($bytes);
}
- if ($buf !== false) {
+ if (is_string($buf)) {
if (RandomCompat_strlen($buf) === $bytes) {
return $buf;
}
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php b/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
index 705af5262..f78b2199a 100644
--- a/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
+++ b/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
@@ -1,22 +1,22 @@
<?php
/**
- * Random_* Compatibility Library
+ * Random_* Compatibility Library
* for using the new PHP 7 random_* API in PHP 5 projects
- *
+ *
* The MIT License (MIT)
*
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- *
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
- *
+ *
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -43,6 +43,7 @@ if (!is_callable('random_bytes')) {
function random_bytes($bytes)
{
try {
+ /** @var int $bytes */
$bytes = RandomCompat_intval($bytes);
} catch (TypeError $ex) {
throw new TypeError(
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php b/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php
index aac9c013d..0b13fa73c 100644
--- a/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php
+++ b/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php
@@ -1,22 +1,22 @@
<?php
/**
- * Random_* Compatibility Library
+ * Random_* Compatibility Library
* for using the new PHP 7 random_* API in PHP 5 projects
- *
+ *
* The MIT License (MIT)
*
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- *
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
- *
+ *
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -42,6 +42,7 @@ if (!is_callable('random_bytes')) {
function random_bytes($bytes)
{
try {
+ /** @var int $bytes */
$bytes = RandomCompat_intval($bytes);
} catch (TypeError $ex) {
throw new TypeError(
@@ -55,10 +56,11 @@ if (!is_callable('random_bytes')) {
);
}
- $buf = @mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM);
+ /** @var string|bool $buf */
+ $buf = @mcrypt_create_iv((int) $bytes, (int) MCRYPT_DEV_URANDOM);
if (
- $buf !== false
- &&
+ is_string($buf)
+ &&
RandomCompat_strlen($buf) === $bytes
) {
/**
diff --git a/vendor/paragonie/random_compat/lib/random_int.php b/vendor/paragonie/random_compat/lib/random_int.php
index 5b2143a16..ff80dfa43 100644
--- a/vendor/paragonie/random_compat/lib/random_int.php
+++ b/vendor/paragonie/random_compat/lib/random_int.php
@@ -7,7 +7,7 @@ if (!is_callable('random_int')) {
*
* The MIT License (MIT)
*
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -51,6 +51,7 @@ if (!is_callable('random_int')) {
*/
try {
+ /** @var int $min */
$min = RandomCompat_intval($min);
} catch (TypeError $ex) {
throw new TypeError(
@@ -59,6 +60,7 @@ if (!is_callable('random_int')) {
}
try {
+ /** @var int $max */
$max = RandomCompat_intval($max);
} catch (TypeError $ex) {
throw new TypeError(
@@ -90,11 +92,18 @@ if (!is_callable('random_int')) {
* so we can minimize the number of discards
*/
$attempts = $bits = $bytes = $mask = $valueShift = 0;
+ /** @var int $attempts */
+ /** @var int $bits */
+ /** @var int $bytes */
+ /** @var int $mask */
+ /** @var int $valueShift */
/**
* At this point, $range is a positive number greater than 0. It might
* overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to
* a float and we will lose some precision.
+ *
+ * @var int|float $range
*/
$range = $max - $min;
@@ -115,6 +124,7 @@ if (!is_callable('random_int')) {
* @ref http://3v4l.org/XX9r5 (64-bit)
*/
$bytes = PHP_INT_SIZE;
+ /** @var int $mask */
$mask = ~0;
} else {
@@ -129,16 +139,19 @@ if (!is_callable('random_int')) {
}
++$bits;
$range >>= 1;
+ /** @var int $mask */
$mask = $mask << 1 | 1;
}
$valueShift = $min;
}
+ /** @var int $val */
$val = 0;
/**
* Now that we have our parameters set up, let's begin generating
* random integers until one falls between $min and $max
*/
+ /** @psalm-suppress RedundantCondition */
do {
/**
* The rejection probability is at most 0.5, so this corresponds
@@ -169,6 +182,7 @@ if (!is_callable('random_int')) {
for ($i = 0; $i < $bytes; ++$i) {
$val |= ord($randomByteString[$i]) << ($i * 8);
}
+ /** @var int $val */
/**
* Apply mask
diff --git a/vendor/paragonie/random_compat/psalm-autoload.php b/vendor/paragonie/random_compat/psalm-autoload.php
deleted file mode 100644
index d71d1b818..000000000
--- a/vendor/paragonie/random_compat/psalm-autoload.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-require_once 'lib/byte_safe_strings.php';
-require_once 'lib/cast_to_int.php';
-require_once 'lib/error_polyfill.php';
-require_once 'other/ide_stubs/libsodium.php';
-require_once 'lib/random.php';
-
-$int = random_int(0, 65536);
diff --git a/vendor/paragonie/random_compat/psalm.xml b/vendor/paragonie/random_compat/psalm.xml
deleted file mode 100644
index ee072a972..000000000
--- a/vendor/paragonie/random_compat/psalm.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-<psalm
- autoloader="psalm-autoload.php"
- stopOnFirstError="false"
- useDocblockTypes="true"
->
- <projectFiles>
- <directory name="lib" />
- </projectFiles>
- <issueHandlers>
- <RedundantConditionGivenDocblockType errorLevel="info" />
- <UnresolvableInclude errorLevel="info" />
- <DuplicateClass errorLevel="info" />
- <InvalidOperand errorLevel="info" />
- <UndefinedConstant errorLevel="info" />
- <MissingReturnType errorLevel="info" />
- </issueHandlers>
-</psalm>
diff --git a/vendor/phpseclib/phpseclib/BACKERS.md b/vendor/phpseclib/phpseclib/BACKERS.md
new file mode 100644
index 000000000..e03152ca1
--- /dev/null
+++ b/vendor/phpseclib/phpseclib/BACKERS.md
@@ -0,0 +1,8 @@
+# Backers
+
+phpseclib ongoing development is made possible by [Tidelift](https://tidelift.com/subscription/pkg/packagist-phpseclib-phpseclib?utm_source=packagist-phpseclib-phpseclib&utm_medium=referral&utm_campaign=readme) and by contributions by users like you. Thank you.
+
+## Backers
+
+- Zane Hooper
+- [Setasign](https://www.setasign.com/) \ No newline at end of file
diff --git a/vendor/phpseclib/phpseclib/LICENSE b/vendor/phpseclib/phpseclib/LICENSE
index a8ec8ebd4..e7214ebbe 100644
--- a/vendor/phpseclib/phpseclib/LICENSE
+++ b/vendor/phpseclib/phpseclib/LICENSE
@@ -1,5 +1,4 @@
-Copyright 2007-2016 TerraFrost and other contributors
-http://phpseclib.sourceforge.net/
+Copyright (c) 2011-2019 TerraFrost and other contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -18,4 +17,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/vendor/phpseclib/phpseclib/README.md b/vendor/phpseclib/phpseclib/README.md
index 53f58db1e..ac0eb2f99 100644
--- a/vendor/phpseclib/phpseclib/README.md
+++ b/vendor/phpseclib/phpseclib/README.md
@@ -2,12 +2,19 @@
[![Build Status](https://travis-ci.org/phpseclib/phpseclib.svg?branch=2.0)](https://travis-ci.org/phpseclib/phpseclib)
+## Supporting phpseclib
+
+- [Become a backer or sponsor on Patreon](https://www.patreon.com/phpseclib)
+- [One-time donation via PayPal or crypto-currencies](http://sourceforge.net/donate/index.php?group_id=198487)
+- [Subscribe to Tidelift](https://tidelift.com/subscription/pkg/packagist-phpseclib-phpseclib?utm_source=packagist-phpseclib-phpseclib&utm_medium=referral&utm_campaign=readme)
+
+## Introduction
+
MIT-licensed pure-PHP implementations of an arbitrary-precision integer
arithmetic library, fully PKCS#1 (v2.1) compliant RSA, DES, 3DES, RC4, Rijndael,
AES, Blowfish, Twofish, SSH-1, SSH-2, SFTP, and X.509
* [Browse Git](https://github.com/phpseclib/phpseclib)
-* [Code Coverage Report](https://coverage.phpseclib.org/2.0/latest/)
## Documentation
@@ -24,19 +31,24 @@ AES, Blowfish, Twofish, SSH-1, SSH-2, SFTP, and X.509
### 2.0
+* Long term support (LTS) release
* Modernized version of 1.0
* Minimum PHP version: 5.3.3
* PSR-4 autoloading with namespace rooted at `\phpseclib`
-* Install via Composer: `composer require phpseclib/phpseclib ~2.0`
+* Install via Composer: `composer require phpseclib/phpseclib:~2.0`
### 1.0
* Long term support (LTS) release
* PHP4 compatible
* Composer compatible (PSR-0 autoloading)
-* Install using Composer: `composer require phpseclib/phpseclib ~1.0`
+* Install using Composer: `composer require phpseclib/phpseclib:~1.0`
* Install using PEAR: See [phpseclib PEAR Channel Documentation](http://phpseclib.sourceforge.net/pear.htm)
-* [Download 1.0.11 as ZIP](http://sourceforge.net/projects/phpseclib/files/phpseclib1.0.11.zip/download)
+* [Download 1.0.18 as ZIP](http://sourceforge.net/projects/phpseclib/files/phpseclib1.0.18.zip/download)
+
+## Security contact information
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.
## Support
diff --git a/vendor/phpseclib/phpseclib/appveyor.yml b/vendor/phpseclib/phpseclib/appveyor.yml
new file mode 100644
index 000000000..210a90347
--- /dev/null
+++ b/vendor/phpseclib/phpseclib/appveyor.yml
@@ -0,0 +1,27 @@
+build: false
+shallow_clone: false
+platform:
+ - x86
+ - x64
+clone_folder: C:\projects\phpseclib
+
+install:
+ - cinst -y OpenSSL.Light
+ - SET PATH=C:\Program Files\OpenSSL;%PATH%
+ - sc config wuauserv start= auto
+ - net start wuauserv
+ - cinst -y php --version 5.6.30
+ - cd c:\tools\php56
+ - copy php.ini-production php.ini
+ - echo date.timezone="UTC" >> php.ini
+ - echo extension_dir=ext >> php.ini
+ - echo extension=php_openssl.dll >> php.ini
+ - echo extension=php_gmp.dll >> php.ini
+ - cd C:\projects\phpseclib
+ - SET PATH=C:\tools\php56;%PATH%
+ - php.exe -r "readfile('http://getcomposer.org/installer');" | php.exe
+ - php.exe composer.phar install --prefer-source --no-interaction
+
+test_script:
+ - cd C:\projects\phpseclib
+ - vendor\bin\phpunit.bat tests/Windows32Test.php \ No newline at end of file
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php b/vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php
index 7c9032f0d..03b176e7b 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php
@@ -649,10 +649,10 @@ abstract class Base
case !function_exists('hash_algos'):
case !in_array($hash, hash_algos()):
$i = 1;
+ $hmac = new Hash();
+ $hmac->setHash($hash);
+ $hmac->setKey($password);
while (strlen($key) < $dkLen) {
- $hmac = new Hash();
- $hmac->setHash($hash);
- $hmac->setKey($password);
$f = $u = $hmac->hash($salt . pack('N', $i++));
for ($j = 2; $j <= $count; ++$j) {
$u = $hmac->hash($u);
@@ -707,7 +707,7 @@ abstract class Base
case self::MODE_STREAM:
return openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
case self::MODE_ECB:
- $result = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
+ $result = @openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
return !defined('OPENSSL_RAW_DATA') ? substr($result, 0, -$this->block_size) : $result;
case self::MODE_CBC:
$result = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $this->encryptIV);
@@ -1040,14 +1040,14 @@ abstract class Base
break;
case self::MODE_ECB:
if (!defined('OPENSSL_RAW_DATA')) {
- $ciphertext.= openssl_encrypt('', $this->cipher_name_openssl_ecb, $this->key, true);
+ $ciphertext.= @openssl_encrypt('', $this->cipher_name_openssl_ecb, $this->key, true);
}
$plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
break;
case self::MODE_CBC:
if (!defined('OPENSSL_RAW_DATA')) {
$padding = str_repeat(chr($this->block_size), $this->block_size) ^ substr($ciphertext, -$this->block_size);
- $ciphertext.= substr(openssl_encrypt($padding, $this->cipher_name_openssl_ecb, $this->key, true), 0, $this->block_size);
+ $ciphertext.= substr(@openssl_encrypt($padding, $this->cipher_name_openssl_ecb, $this->key, true), 0, $this->block_size);
$offset = 2 * $this->block_size;
} else {
$offset = $this->block_size;
@@ -1358,7 +1358,7 @@ abstract class Base
for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
$block = substr($plaintext, $i, $block_size);
if (strlen($block) > strlen($buffer['ciphertext'])) {
- $result = openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
+ $result = @openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
$result = !defined('OPENSSL_RAW_DATA') ? substr($result, 0, -$this->block_size) : $result;
$buffer['ciphertext'].= $result;
}
@@ -1369,7 +1369,7 @@ abstract class Base
} else {
for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
$block = substr($plaintext, $i, $block_size);
- $otp = openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
+ $otp = @openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
$otp = !defined('OPENSSL_RAW_DATA') ? substr($otp, 0, -$this->block_size) : $otp;
$this->_increment_str($xor);
$ciphertext.= $block ^ $otp;
@@ -1413,7 +1413,7 @@ abstract class Base
}
if ($this->continuousBuffer) {
if (!defined('OPENSSL_RAW_DATA')) {
- $encryptIV.= openssl_encrypt('', $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
+ $encryptIV.= @openssl_encrypt('', $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
}
$encryptIV = openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
if ($overflow) {
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Crypt/Hash.php b/vendor/phpseclib/phpseclib/phpseclib/Crypt/Hash.php
index 6ae01329e..a61668209 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Crypt/Hash.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Crypt/Hash.php
@@ -113,6 +113,15 @@ class Hash
var $key = false;
/**
+ * Computed Key
+ *
+ * @see self::_computeKey()
+ * @var string
+ * @access private
+ */
+ var $computedKey = false;
+
+ /**
* Outer XOR (Internal HMAC)
*
* @see self::setKey()
@@ -131,6 +140,15 @@ class Hash
var $ipad;
/**
+ * Engine
+ *
+ * @see self::setHash()
+ * @var string
+ * @access private
+ */
+ var $engine;
+
+ /**
* Default Constructor.
*
* @param string $hash
@@ -166,6 +184,43 @@ class Hash
function setKey($key = false)
{
$this->key = $key;
+ $this->_computeKey();
+ }
+
+ /**
+ * Pre-compute the key used by the HMAC
+ *
+ * Quoting http://tools.ietf.org/html/rfc2104#section-2, "Applications that use keys longer than B bytes
+ * will first hash the key using H and then use the resultant L byte string as the actual key to HMAC."
+ *
+ * As documented in https://www.reddit.com/r/PHP/comments/9nct2l/symfonypolyfill_hash_pbkdf2_correct_fix_for/
+ * when doing an HMAC multiple times it's faster to compute the hash once instead of computing it during
+ * every call
+ *
+ * @access private
+ */
+ function _computeKey()
+ {
+ if ($this->key === false) {
+ $this->computedKey = false;
+ return;
+ }
+
+ if (strlen($this->key) <= $this->b) {
+ $this->computedKey = $this->key;
+ return;
+ }
+
+ switch ($this->engine) {
+ case self::MODE_MHASH:
+ $this->computedKey = mhash($this->hash, $this->key);
+ break;
+ case self::MODE_HASH:
+ $this->computedKey = hash($this->hash, $this->key, true);
+ break;
+ case self::MODE_INTERNAL:
+ $this->computedKey = call_user_func($this->hash, $this->key);
+ }
}
/**
@@ -216,19 +271,38 @@ class Hash
}
switch ($hash) {
+ case 'md2-96':
+ case 'md2':
+ $this->b = 16;
+ case 'md5-96':
+ case 'sha1-96':
+ case 'sha224-96':
+ case 'sha256-96':
case 'md2':
- $mode = CRYPT_HASH_MODE == self::MODE_HASH && in_array('md2', hash_algos()) ?
+ case 'md5':
+ case 'sha1':
+ case 'sha224':
+ case 'sha256':
+ $this->b = 64;
+ break;
+ default:
+ $this->b = 128;
+ }
+
+ switch ($hash) {
+ case 'md2':
+ $this->engine = CRYPT_HASH_MODE == self::MODE_HASH && in_array('md2', hash_algos()) ?
self::MODE_HASH : self::MODE_INTERNAL;
break;
case 'sha384':
case 'sha512':
- $mode = CRYPT_HASH_MODE == self::MODE_MHASH ? self::MODE_INTERNAL : CRYPT_HASH_MODE;
+ $this->engine = CRYPT_HASH_MODE == self::MODE_MHASH ? self::MODE_INTERNAL : CRYPT_HASH_MODE;
break;
default:
- $mode = CRYPT_HASH_MODE;
+ $this->engine = CRYPT_HASH_MODE;
}
- switch ($mode) {
+ switch ($this->engine) {
case self::MODE_MHASH:
switch ($hash) {
case 'md5':
@@ -241,6 +315,7 @@ class Hash
default:
$this->hash = MHASH_SHA1;
}
+ $this->_computeKey(self::MODE_MHASH);
return;
case self::MODE_HASH:
switch ($hash) {
@@ -257,35 +332,33 @@ class Hash
default:
$this->hash = 'sha1';
}
+ $this->_computeKey(self::MODE_HASH);
return;
}
switch ($hash) {
case 'md2':
- $this->b = 16;
$this->hash = array($this, '_md2');
break;
case 'md5':
- $this->b = 64;
$this->hash = array($this, '_md5');
break;
case 'sha256':
- $this->b = 64;
$this->hash = array($this, '_sha256');
break;
case 'sha384':
case 'sha512':
- $this->b = 128;
$this->hash = array($this, '_sha512');
break;
case 'sha1':
default:
- $this->b = 64;
$this->hash = array($this, '_sha1');
}
$this->ipad = str_repeat(chr(0x36), $this->b);
$this->opad = str_repeat(chr(0x5C), $this->b);
+
+ $this->_computeKey(self::MODE_INTERNAL);
}
/**
@@ -297,33 +370,25 @@ class Hash
*/
function hash($text)
{
- $mode = is_array($this->hash) ? self::MODE_INTERNAL : CRYPT_HASH_MODE;
-
if (!empty($this->key) || is_string($this->key)) {
- switch ($mode) {
+ switch ($this->engine) {
case self::MODE_MHASH:
- $output = mhash($this->hash, $text, $this->key);
+ $output = mhash($this->hash, $text, $this->computedKey);
break;
case self::MODE_HASH:
- $output = hash_hmac($this->hash, $text, $this->key, true);
+ $output = hash_hmac($this->hash, $text, $this->computedKey, true);
break;
case self::MODE_INTERNAL:
- /* "Applications that use keys longer than B bytes will first hash the key using H and then use the
- resultant L byte string as the actual key to HMAC."
-
- -- http://tools.ietf.org/html/rfc2104#section-2 */
- $key = strlen($this->key) > $this->b ? call_user_func($this->hash, $this->key) : $this->key;
-
- $key = str_pad($key, $this->b, chr(0)); // step 1
- $temp = $this->ipad ^ $key; // step 2
- $temp .= $text; // step 3
- $temp = call_user_func($this->hash, $temp); // step 4
- $output = $this->opad ^ $key; // step 5
- $output.= $temp; // step 6
- $output = call_user_func($this->hash, $output); // step 7
+ $key = str_pad($this->computedKey, $this->b, chr(0)); // step 1
+ $temp = $this->ipad ^ $key; // step 2
+ $temp .= $text; // step 3
+ $temp = call_user_func($this->hash, $temp); // step 4
+ $output = $this->opad ^ $key; // step 5
+ $output.= $temp; // step 6
+ $output = call_user_func($this->hash, $output); // step 7
}
} else {
- switch ($mode) {
+ switch ($this->engine) {
case self::MODE_MHASH:
$output = mhash($this->hash, $text);
break;
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php b/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php
index c15e86d38..72be6eeb1 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php
@@ -182,6 +182,10 @@ class RSA
* PKCS#8 formatted private key
*/
const PRIVATE_FORMAT_PKCS8 = 8;
+ /**
+ * OpenSSH formatted private key
+ */
+ const PRIVATE_FORMAT_OPENSSH = 9;
/**#@-*/
/**#@+
@@ -820,6 +824,58 @@ class RSA
$key.= 'Private-MAC: ' . bin2hex($hash->hash($source)) . "\r\n";
return $key;
+ case self::PRIVATE_FORMAT_OPENSSH:
+ if ($num_primes != 2) {
+ return false;
+ }
+ $publicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($raw['publicExponent']), $raw['publicExponent'], strlen($raw['modulus']), $raw['modulus']);
+ $privateKey = pack(
+ 'Na*Na*Na*Na*Na*Na*Na*',
+ strlen('ssh-rsa'),
+ 'ssh-rsa',
+ strlen($raw['modulus']),
+ $raw['modulus'],
+ strlen($raw['publicExponent']),
+ $raw['publicExponent'],
+ strlen($raw['privateExponent']),
+ $raw['privateExponent'],
+ strlen($raw['coefficient']),
+ $raw['coefficient'],
+ strlen($raw['prime1']),
+ $raw['prime1'],
+ strlen($raw['prime2']),
+ $raw['prime2']
+ );
+ $checkint = Random::string(4);
+ $paddedKey = pack(
+ 'a*Na*',
+ $checkint . $checkint . $privateKey,
+ strlen($this->comment),
+ $this->comment
+ );
+ $paddingLength = (7 * strlen($paddedKey)) % 8;
+ for ($i = 1; $i <= $paddingLength; $i++) {
+ $paddedKey.= chr($i);
+ }
+ $key = pack(
+ 'Na*Na*Na*NNa*Na*',
+ strlen('none'),
+ 'none',
+ strlen('none'),
+ 'none',
+ 0,
+ '',
+ 1,
+ strlen($publicKey),
+ $publicKey,
+ strlen($paddedKey),
+ $paddedKey
+ );
+ $key = "openssh-key-v1\0$key";
+
+ return "-----BEGIN OPENSSH PRIVATE KEY-----\r\n" .
+ chunk_split(base64_encode($key), 70) .
+ "-----END OPENSSH PRIVATE KEY-----";
default: // eg. self::PRIVATE_FORMAT_PKCS1
$components = array();
foreach ($raw as $name => $value) {
@@ -1020,9 +1076,9 @@ class RSA
* @access private
* @see self::_convertPublicKey()
* @see self::_convertPrivateKey()
- * @param string $key
+ * @param string|array $key
* @param int $type
- * @return array
+ * @return array|bool
*/
function _parseKey($key, $type)
{
@@ -1333,9 +1389,14 @@ class RSA
xml_set_character_data_handler($xml, '_data_handler');
// add <xml></xml> to account for "dangling" tags like <BitStrength>...</BitStrength> that are sometimes added
if (!xml_parse($xml, '<xml>' . $key . '</xml>')) {
+ xml_parser_free($xml);
+ unset($xml);
return false;
}
+ xml_parser_free($xml);
+ unset($xml);
+
return isset($this->components['modulus']) && isset($this->components['publicExponent']) ? $this->components : false;
// from PuTTY's SSHPUBK.C
case self::PRIVATE_FORMAT_PUTTY:
@@ -1408,6 +1469,75 @@ class RSA
$components['coefficients'] = array(2 => new BigInteger($this->_string_shift($private, $length), -256));
return $components;
+ case self::PRIVATE_FORMAT_OPENSSH:
+ $components = array();
+ $decoded = $this->_extractBER($key);
+ $magic = $this->_string_shift($decoded, 15);
+ if ($magic !== "openssh-key-v1\0") {
+ return false;
+ }
+ $options = $this->_string_shift($decoded, 24);
+ // \0\0\0\4none = ciphername
+ // \0\0\0\4none = kdfname
+ // \0\0\0\0 = kdfoptions
+ // \0\0\0\1 = numkeys
+ if ($options != "\0\0\0\4none\0\0\0\4none\0\0\0\0\0\0\0\1") {
+ return false;
+ }
+ extract(unpack('Nlength', $this->_string_shift($decoded, 4)));
+ if (strlen($decoded) < $length) {
+ return false;
+ }
+ $publicKey = $this->_string_shift($decoded, $length);
+ extract(unpack('Nlength', $this->_string_shift($decoded, 4)));
+ if (strlen($decoded) < $length) {
+ return false;
+ }
+ $paddedKey = $this->_string_shift($decoded, $length);
+
+ if ($this->_string_shift($publicKey, 11) !== "\0\0\0\7ssh-rsa") {
+ return false;
+ }
+
+ $checkint1 = $this->_string_shift($paddedKey, 4);
+ $checkint2 = $this->_string_shift($paddedKey, 4);
+ if (strlen($checkint1) != 4 || $checkint1 !== $checkint2) {
+ return false;
+ }
+
+ if ($this->_string_shift($paddedKey, 11) !== "\0\0\0\7ssh-rsa") {
+ return false;
+ }
+
+ $values = array(
+ &$components['modulus'],
+ &$components['publicExponent'],
+ &$components['privateExponent'],
+ &$components['coefficients'][2],
+ &$components['primes'][1],
+ &$components['primes'][2]
+ );
+
+ foreach ($values as &$value) {
+ extract(unpack('Nlength', $this->_string_shift($paddedKey, 4)));
+ if (strlen($paddedKey) < $length) {
+ return false;
+ }
+ $value = new BigInteger($this->_string_shift($paddedKey, $length), -256);
+ }
+
+ extract(unpack('Nlength', $this->_string_shift($paddedKey, 4)));
+ if (strlen($paddedKey) < $length) {
+ return false;
+ }
+ $components['comment'] = $this->_string_shift($decoded, $length);
+
+ $temp = $components['primes'][1]->subtract($this->one);
+ $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp));
+ $temp = $components['primes'][2]->subtract($this->one);
+ $components['exponents'][] = $components['publicExponent']->modInverse($temp);
+
+ return $components;
}
}
@@ -1505,8 +1635,9 @@ class RSA
* Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed)
*
* @access public
- * @param string $key
- * @param int $type optional
+ * @param string|RSA|array $key
+ * @param bool|int $type optional
+ * @return bool
*/
function loadKey($key, $type = false)
{
@@ -1563,7 +1694,8 @@ class RSA
self::PRIVATE_FORMAT_PKCS1,
self::PRIVATE_FORMAT_XML,
self::PRIVATE_FORMAT_PUTTY,
- self::PUBLIC_FORMAT_OPENSSH
+ self::PUBLIC_FORMAT_OPENSSH,
+ self::PRIVATE_FORMAT_OPENSSH
);
foreach ($types as $type) {
$components = $this->_parseKey($key, $type);
@@ -2211,16 +2343,21 @@ class RSA
*/
function _equals($x, $y)
{
+ if (function_exists('hash_equals')) {
+ return hash_equals($x, $y);
+ }
+
if (strlen($x) != strlen($y)) {
return false;
}
- $result = 0;
+ $result = "\0";
+ $x^= $y;
for ($i = 0; $i < strlen($x); $i++) {
- $result |= ord($x[$i]) ^ ord($y[$i]);
+ $result|= $x[$i];
}
- return $result == 0;
+ return $result === "\0";
}
/**
@@ -2427,19 +2564,26 @@ class RSA
$db = $maskedDB ^ $dbMask;
$lHash2 = substr($db, 0, $this->hLen);
$m = substr($db, $this->hLen);
- if (!$this->_equals($lHash, $lHash2)) {
- user_error('Decryption error');
- return false;
- }
- $m = ltrim($m, chr(0));
- if (ord($m[0]) != 1) {
+ $hashesMatch = $this->_equals($lHash, $lHash2);
+ $leadingZeros = 1;
+ $patternMatch = 0;
+ $offset = 0;
+ for ($i = 0; $i < strlen($m); $i++) {
+ $patternMatch|= $leadingZeros & ($m[$i] === "\1");
+ $leadingZeros&= $m[$i] === "\0";
+ $offset+= $patternMatch ? 0 : 1;
+ }
+
+ // we do & instead of && to avoid https://en.wikipedia.org/wiki/Short-circuit_evaluation
+ // to protect against timing attacks
+ if (!$hashesMatch & !$patternMatch) {
user_error('Decryption error');
return false;
}
// Output the message M
- return substr($m, 1);
+ return substr($m, $offset + 1);
}
/**
@@ -2618,7 +2762,7 @@ class RSA
// if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
// be output.
- $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8);
+ $emLen = ($emBits + 7) >> 3; // ie. ceil($emBits / 8);
$sLen = $this->sLen !== null ? $this->sLen : $this->hLen;
$mHash = $this->hash->hash($m);
@@ -2696,7 +2840,7 @@ class RSA
// RSA verification
- $modBits = 8 * $this->k;
+ $modBits = strlen($this->modulus->toBits());
$s2 = $this->_os2ip($s);
$m2 = $this->_rsavp1($s2);
@@ -2704,7 +2848,7 @@ class RSA
user_error('Invalid signature');
return false;
}
- $em = $this->_i2osp($m2, $modBits >> 3);
+ $em = $this->_i2osp($m2, $this->k);
if ($em === false) {
user_error('Invalid signature');
return false;
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php b/vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php
index 01e34cc36..8f53eb319 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php
@@ -97,7 +97,10 @@ class Random
$fp = @fopen('/dev/urandom', 'rb');
}
if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource()
- return fread($fp, $length);
+ $temp = fread($fp, $length);
+ if (strlen($temp) == $length) {
+ return $temp;
+ }
}
// method 3. pretty much does the same thing as method 2 per the following url:
// https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391
diff --git a/vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php b/vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php
index 76ff8e3ac..a304a000a 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php
@@ -244,9 +244,10 @@ class ASN1
$tag = 0;
// process septets (since the eighth bit is ignored, it's not an octet)
do {
- $loop = ord($encoded[0]) >> 7;
+ $temp = ord($encoded[$encoded_pos++]);
+ $loop = $temp >> 7;
$tag <<= 7;
- $tag |= ord($encoded[$encoded_pos++]) & 0x7F;
+ $tag |= $temp & 0x7F;
$start++;
} while ($loop);
}
@@ -308,6 +309,9 @@ class ASN1
$remainingLength = $length;
while ($remainingLength > 0) {
$temp = $this->_decode_ber($content, $start, $content_pos);
+ if ($temp === false) {
+ break;
+ }
$length = $temp['length'];
// end-of-content octets - see paragraph 8.1.5
if (substr($content, $content_pos + $length, 2) == "\0\0") {
@@ -359,6 +363,9 @@ class ASN1
$current['content'] = substr($content, $content_pos);
} else {
$temp = $this->_decode_ber($content, $start, $content_pos);
+ if ($temp === false) {
+ return false;
+ }
$length-= (strlen($content) - $content_pos);
$last = count($temp) - 1;
for ($i = 0; $i < $last; $i++) {
@@ -383,6 +390,9 @@ class ASN1
$length = 0;
while (substr($content, $content_pos, 2) != "\0\0") {
$temp = $this->_decode_ber($content, $length + $start, $content_pos);
+ if ($temp === false) {
+ return false;
+ }
$content_pos += $temp['length'];
// all subtags should be octet strings
//if ($temp['type'] != self::TYPE_OCTET_STRING) {
@@ -415,30 +425,16 @@ class ASN1
break 2;
}
$temp = $this->_decode_ber($content, $start + $offset, $content_pos);
+ if ($temp === false) {
+ return false;
+ }
$content_pos += $temp['length'];
$current['content'][] = $temp;
$offset+= $temp['length'];
}
break;
case self::TYPE_OBJECT_IDENTIFIER:
- $temp = ord($content[$content_pos++]);
- $current['content'] = sprintf('%d.%d', floor($temp / 40), $temp % 40);
- $valuen = 0;
- // process septets
- $content_len = strlen($content);
- while ($content_pos < $content_len) {
- $temp = ord($content[$content_pos++]);
- $valuen <<= 7;
- $valuen |= $temp & 0x7F;
- if (~$temp & 0x80) {
- $current['content'].= ".$valuen";
- $valuen = 0;
- }
- }
- // the eighth bit of the last byte should not be 1
- //if ($temp >> 7) {
- // return false;
- //}
+ $current['content'] = $this->_decodeOID(substr($content, $content_pos));
break;
/* Each character string type shall be encoded as if it had been declared:
[UNIVERSAL x] IMPLICIT OCTET STRING
@@ -497,6 +493,10 @@ class ASN1
*/
function asn1map($decoded, $mapping, $special = array())
{
+ if (!is_array($decoded)) {
+ return false;
+ }
+
if (isset($mapping['explicit']) && is_array($decoded['content'])) {
$decoded = $decoded['content'][0];
}
@@ -706,7 +706,14 @@ class ASN1
return isset($this->oids[$decoded['content']]) ? $this->oids[$decoded['content']] : $decoded['content'];
case self::TYPE_UTC_TIME:
case self::TYPE_GENERALIZED_TIME:
- if (isset($mapping['implicit'])) {
+ // for explicitly tagged optional stuff
+ if (is_array($decoded['content'])) {
+ $decoded['content'] = $decoded['content'][0]['content'];
+ }
+ // for implicitly tagged optional stuff
+ // in theory, doing isset($mapping['implicit']) would work but malformed certs do exist
+ // in the wild that OpenSSL decodes without issue so we'll support them as well
+ if (!is_object($decoded['content'])) {
$decoded['content'] = $this->_decodeTime($decoded['content'], $decoded['type']);
}
return $decoded['content'] ? $decoded['content']->format($this->format) : false;
@@ -847,7 +854,7 @@ class ASN1
if ($mapping['type'] == self::TYPE_SET) {
sort($value);
}
- $value = implode($value, '');
+ $value = implode('', $value);
break;
}
@@ -1001,27 +1008,7 @@ class ASN1
$value = base64_decode($source);
break;
case self::TYPE_OBJECT_IDENTIFIER:
- $oid = preg_match('#(?:\d+\.)+#', $source) ? $source : array_search($source, $this->oids);
- if ($oid === false) {
- user_error('Invalid OID');
- return false;
- }
- $value = '';
- $parts = explode('.', $oid);
- $value = chr(40 * $parts[0] + $parts[1]);
- for ($i = 2; $i < count($parts); $i++) {
- $temp = '';
- if (!$parts[$i]) {
- $temp = "\0";
- } else {
- while ($parts[$i]) {
- $temp = chr(0x80 | ($parts[$i] & 0x7F)) . $temp;
- $parts[$i] >>= 7;
- }
- $temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F);
- }
- $value.= $temp;
- }
+ $value = $this->_encodeOID($source);
break;
case self::TYPE_ANY:
$loc = $this->location;
@@ -1121,6 +1108,108 @@ class ASN1
}
/**
+ * BER-decode the OID
+ *
+ * Called by _decode_ber()
+ *
+ * @access private
+ * @param string $content
+ * @return string
+ */
+ function _decodeOID($content)
+ {
+ static $eighty;
+ if (!$eighty) {
+ $eighty = new BigInteger(80);
+ }
+
+ $oid = array();
+ $pos = 0;
+ $len = strlen($content);
+ $n = new BigInteger();
+ while ($pos < $len) {
+ $temp = ord($content[$pos++]);
+ $n = $n->bitwise_leftShift(7);
+ $n = $n->bitwise_or(new BigInteger($temp & 0x7F));
+ if (~$temp & 0x80) {
+ $oid[] = $n;
+ $n = new BigInteger();
+ }
+ }
+ $part1 = array_shift($oid);
+ $first = floor(ord($content[0]) / 40);
+ /*
+ "This packing of the first two object identifier components recognizes that only three values are allocated from the root
+ node, and at most 39 subsequent values from nodes reached by X = 0 and X = 1."
+
+ -- https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=22
+ */
+ if ($first <= 2) { // ie. 0 <= ord($content[0]) < 120 (0x78)
+ array_unshift($oid, ord($content[0]) % 40);
+ array_unshift($oid, $first);
+ } else {
+ array_unshift($oid, $part1->subtract($eighty));
+ array_unshift($oid, 2);
+ }
+
+ return implode('.', $oid);
+ }
+
+ /**
+ * DER-encode the OID
+ *
+ * Called by _encode_der()
+ *
+ * @access private
+ * @param string $content
+ * @return string
+ */
+ function _encodeOID($source)
+ {
+ static $mask, $zero, $forty;
+ if (!$mask) {
+ $mask = new BigInteger(0x7F);
+ $zero = new BigInteger();
+ $forty = new BigInteger(40);
+ }
+
+ $oid = preg_match('#(?:\d+\.)+#', $source) ? $source : array_search($source, $this->oids);
+ if ($oid === false) {
+ user_error('Invalid OID');
+ return false;
+ }
+ $parts = explode('.', $oid);
+ $part1 = array_shift($parts);
+ $part2 = array_shift($parts);
+
+ $first = new BigInteger($part1);
+ $first = $first->multiply($forty);
+ $first = $first->add(new BigInteger($part2));
+
+ array_unshift($parts, $first->toString());
+
+ $value = '';
+ foreach ($parts as $part) {
+ if (!$part) {
+ $temp = "\0";
+ } else {
+ $temp = '';
+ $part = new BigInteger($part);
+ while (!$part->equals($zero)) {
+ $submask = $part->bitwise_and($mask);
+ $submask->setPrecision(8);
+ $temp = (chr(0x80) | $submask->toBytes()) . $temp;
+ $part = $part->bitwise_rightShift(7);
+ }
+ $temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F);
+ }
+ $value.= $temp;
+ }
+
+ return $value;
+ }
+
+ /**
* BER-decode the time
*
* Called by _decode_ber() and in the case of implicit tags asn1map().
diff --git a/vendor/phpseclib/phpseclib/phpseclib/File/X509.php b/vendor/phpseclib/phpseclib/phpseclib/File/X509.php
index f3ee81377..ddbc61595 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/File/X509.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/File/X509.php
@@ -963,6 +963,13 @@ class X509
'children' => $AccessDescription
);
+ $this->SubjectInfoAccessSyntax = array(
+ 'type' => ASN1::TYPE_SEQUENCE,
+ 'min' => 1,
+ 'max' => -1,
+ 'children' => $AccessDescription
+ );
+
$this->SubjectAltName = $GeneralNames;
$this->PrivateKeyUsagePeriod = array(
@@ -1620,7 +1627,10 @@ class X509
corresponding to the extension type identified by extnID */
$map = $this->_getMapping($id);
if (!is_bool($map)) {
- $mapped = $asn1->asn1map($decoded[0], $map, array('iPAddress' => array($this, '_decodeIP')));
+ $decoder = $id == 'id-ce-nameConstraints' ?
+ array($this, '_decodeNameConstraintIP') :
+ array($this, '_decodeIP');
+ $mapped = $asn1->asn1map($decoded[0], $map, array('iPAddress' => $decoder));
$value = $mapped === false ? $decoded[0] : $mapped;
if ($id == 'id-ce-certificatePolicies') {
@@ -1889,6 +1899,8 @@ class X509
return $this->ExtKeyUsageSyntax;
case 'id-pe-authorityInfoAccess':
return $this->AuthorityInfoAccessSyntax;
+ case 'id-pe-subjectInfoAccess':
+ return $this->SubjectInfoAccessSyntax;
case 'id-ce-subjectAltName':
return $this->SubjectAltName;
case 'id-ce-subjectDirectoryAttributes':
@@ -1928,6 +1940,9 @@ class X509
// "Certificate Transparency"
// https://tools.ietf.org/html/rfc6962
case '1.3.6.1.4.1.11129.2.4.2':
+ // "Qualified Certificate statements"
+ // https://tools.ietf.org/html/rfc3739#section-3.2.6
+ case '1.3.6.1.5.5.7.1.3':
return true;
// CSR attributes
@@ -2092,7 +2107,7 @@ class X509
*
* If $date isn't defined it is assumed to be the current date.
*
- * @param int $date optional
+ * @param \DateTime|string $date optional
* @access public
*/
function validateDate($date = null)
@@ -2102,7 +2117,7 @@ class X509
}
if (!isset($date)) {
- $date = new DateTime($date, new DateTimeZone(@date_default_timezone_get()));
+ $date = new DateTime(null, new DateTimeZone(@date_default_timezone_get()));
}
$notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore'];
@@ -2111,9 +2126,16 @@ class X509
$notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter'];
$notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime'];
+ if (is_string($date)) {
+ $date = new DateTime($date, new DateTimeZone(@date_default_timezone_get()));
+ }
+
+ $notBefore = new DateTime($notBefore, new DateTimeZone(@date_default_timezone_get()));
+ $notAfter = new DateTime($notAfter, new DateTimeZone(@date_default_timezone_get()));
+
switch (true) {
- case $date < new DateTime($notBefore, new DateTimeZone(@date_default_timezone_get())):
- case $date > new DateTime($notAfter, new DateTimeZone(@date_default_timezone_get())):
+ case $date < $notBefore:
+ case $date > $notAfter:
return false;
}
@@ -2157,7 +2179,11 @@ class X509
}
while (!feof($fsock)) {
- $data.= fread($fsock, 1024);
+ $temp = fread($fsock, 1024);
+ if ($temp === false) {
+ return false;
+ }
+ $data.= $temp;
}
break;
@@ -2502,17 +2528,37 @@ class X509
}
/**
+ * Decodes an IP address in a name constraints extension
+ *
+ * Takes in a base64 encoded "blob" and returns a human readable IP address / mask
+ *
+ * @param string $ip
+ * @access private
+ * @return array
+ */
+ function _decodeNameConstraintIP($ip)
+ {
+ $ip = base64_decode($ip);
+ $size = strlen($ip) >> 1;
+ $mask = substr($ip, $size);
+ $ip = substr($ip, 0, $size);
+ return array(inet_ntop($ip), inet_ntop($mask));
+ }
+
+ /**
* Encodes an IP address
*
* Takes a human readable IP address into a base64-encoded "blob"
*
- * @param string $ip
+ * @param string|array $ip
* @access private
* @return string
*/
function _encodeIP($ip)
{
- return base64_encode(inet_pton($ip));
+ return is_string($ip) ?
+ base64_encode(inet_pton($ip)) :
+ base64_encode(inet_pton($ip[0]) . inet_pton($ip[1]));
}
/**
@@ -2920,7 +2966,7 @@ class X509
}
$output.= $desc . '=' . $value;
$result[$desc] = isset($result[$desc]) ?
- array_merge((array) $dn[$prop], array($value)) :
+ array_merge((array) $result[$desc], array($value)) :
$value;
$start = false;
}
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php b/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php
index d82d123d8..e7f664670 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php
@@ -45,7 +45,6 @@
* @author Jim Wigginton <terrafrost@php.net>
* @copyright 2006 Jim Wigginton
* @license http://www.opensource.org/licenses/mit-license.html MIT License
- * @link http://pear.php.net/package/Math_BigInteger
*/
namespace phpseclib\Math;
@@ -446,6 +445,9 @@ class BigInteger
// (?<=^|-)0*: find any 0's that are preceded by the start of the string or by a - (ie. octals)
// [^-0-9].*: find any non-numeric characters and then any characters that follow that
$x = preg_replace('#(?<!^)(?:-).*|(?<=^|-)0*|[^-0-9].*#', '', $x);
+ if (!strlen($x) || $x == '-') {
+ $x = '0';
+ }
switch (MATH_BIGINTEGER_MODE) {
case self::MODE_GMP:
@@ -543,7 +545,7 @@ class BigInteger
$bytes = chr(0);
}
- if (ord($bytes[0]) & 0x80) {
+ if ($this->precision <= 0 && (ord($bytes[0]) & 0x80)) {
$bytes = chr(0) . $bytes;
}
@@ -705,6 +707,7 @@ class BigInteger
}
$temp = $this->copy();
+ $temp->bitmask = false;
$temp->is_negative = false;
$divisor = new static();
@@ -841,7 +844,7 @@ class BigInteger
$opts[] = 'OpenSSL';
}
if (!empty($opts)) {
- $engine.= ' (' . implode($opts, ', ') . ')';
+ $engine.= ' (' . implode('.', $opts) . ')';
}
return array(
'value' => '0x' . $this->toHex(true),
@@ -1559,7 +1562,9 @@ class BigInteger
$temp_value = array($quotient_value[$q_index]);
$temp = $temp->multiply($y);
$temp_value = &$temp->value;
- $temp_value = array_merge($adjust, $temp_value);
+ if (count($temp_value)) {
+ $temp_value = array_merge($adjust, $temp_value);
+ }
$x = $x->subtract($temp);
@@ -2692,7 +2697,14 @@ class BigInteger
{
switch (MATH_BIGINTEGER_MODE) {
case self::MODE_GMP:
- return gmp_cmp($this->value, $y->value);
+ $r = gmp_cmp($this->value, $y->value);
+ if ($r < -1) {
+ $r = -1;
+ }
+ if ($r > 1) {
+ $r = 1;
+ }
+ return $r;
case self::MODE_BCMATH:
return bccomp($this->value, $y->value, 0);
}
@@ -3558,7 +3570,14 @@ class BigInteger
switch (MATH_BIGINTEGER_MODE) {
case self::MODE_GMP:
if ($this->bitmask !== false) {
+ $flip = gmp_cmp($result->value, gmp_init(0)) < 0;
+ if ($flip) {
+ $result->value = gmp_neg($result->value);
+ }
$result->value = gmp_and($result->value, $result->bitmask->value);
+ if ($flip) {
+ $result->value = gmp_neg($result->value);
+ }
}
return $result;
@@ -3573,6 +3592,7 @@ class BigInteger
$value = &$result->value;
if (!count($value)) {
+ $result->is_negative = false;
return $result;
}
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Net/SCP.php b/vendor/phpseclib/phpseclib/phpseclib/Net/SCP.php
index f95bce6df..cf13496cd 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Net/SCP.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Net/SCP.php
@@ -144,6 +144,11 @@ class SCP
return false;
}
+ if (empty($remote_file)) {
+ user_error('remote_file cannot be blank', E_USER_NOTICE);
+ return false;
+ }
+
if (!$this->ssh->exec('scp -t ' . escapeshellarg($remote_file), false)) { // -t = to
return false;
}
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php b/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php
index 8825f30cf..bf7ef36b4 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php
@@ -109,11 +109,11 @@ class SFTP extends SSH2
* The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support
* concurrent actions, so it's somewhat academic, here.
*
- * @var int
+ * @var boolean
* @see self::_send_sftp_packet()
* @access private
*/
- var $request_id = false;
+ var $use_request_id = false;
/**
* The Packet Type
@@ -251,6 +251,15 @@ class SFTP extends SSH2
var $canonicalize_paths = true;
/**
+ * Request Buffers
+ *
+ * @see self::_get_sftp_packet()
+ * @var array
+ * @access private
+ */
+ var $requestBuffer = array();
+
+ /**
* Default Constructor.
*
* Connects to an SFTP server
@@ -388,6 +397,9 @@ class SFTP extends SSH2
if (!defined('NET_SFTP_QUEUE_SIZE')) {
define('NET_SFTP_QUEUE_SIZE', 32);
}
+ if (!defined('NET_SFTP_UPLOAD_QUEUE_SIZE')) {
+ define('NET_SFTP_UPLOAD_QUEUE_SIZE', 1024);
+ }
}
/**
@@ -400,8 +412,7 @@ class SFTP extends SSH2
*/
function login($username)
{
- $args = func_get_args();
- if (!call_user_func_array(array(&$this, '_login'), $args)) {
+ if (!call_user_func_array('parent::login', func_get_args())) {
return false;
}
@@ -519,7 +530,7 @@ class SFTP extends SSH2
}
*/
- $this->request_id = 1;
+ $this->use_request_id = true;
/*
A Note on SFTPv4/5/6 support:
@@ -833,6 +844,7 @@ class SFTP extends SSH2
}
if (is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $value)))) {
$temp = $this->_nlist_helper($dir . '/' . $value, true, $relativeDir . $value . '/');
+ $temp = is_array($temp) ? $temp : array();
$result = array_merge($result, $temp);
} else {
$result[] = $relativeDir . $value;
@@ -864,7 +876,17 @@ class SFTP extends SSH2
unset($files[$key]);
continue;
}
- if ($key != '.' && $key != '..' && is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)))) {
+ $is_directory = false;
+ if ($key != '.' && $key != '..') {
+ if ($this->use_stat_cache) {
+ $is_directory = is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)));
+ } else {
+ $stat = $this->lstat($dir . '/' . $key);
+ $is_directory = $stat && $stat['type'] === NET_SFTP_TYPE_DIRECTORY;
+ }
+ }
+
+ if ($is_directory) {
$depth++;
$files[$key] = $this->rawlist($dir . '/' . $key, true);
$depth--;
@@ -1754,9 +1776,6 @@ class SFTP extends SSH2
}
$dir = $this->_realpath($dir);
- // by not providing any permissions, hopefully the server will use the logged in users umask - their
- // default permissions.
- $attr = $mode == -1 ? "\0\0\0\0" : pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777);
if ($recursive) {
$dirs = explode('/', preg_replace('#/(?=/)|/$#', '', $dir));
@@ -1767,12 +1786,12 @@ class SFTP extends SSH2
for ($i = 0; $i < count($dirs); $i++) {
$temp = array_slice($dirs, 0, $i + 1);
$temp = implode('/', $temp);
- $result = $this->_mkdir_helper($temp, $attr);
+ $result = $this->_mkdir_helper($temp, $mode);
}
return $result;
}
- return $this->_mkdir_helper($dir, $attr);
+ return $this->_mkdir_helper($dir, $mode);
}
/**
@@ -1782,9 +1801,10 @@ class SFTP extends SSH2
* @return bool
* @access private
*/
- function _mkdir_helper($dir, $attr)
+ function _mkdir_helper($dir, $mode)
{
- if (!$this->_send_sftp_packet(NET_SFTP_MKDIR, pack('Na*a*', strlen($dir), $dir, $attr))) {
+ // send SSH_FXP_MKDIR without any attributes (that's what the \0\0\0\0 is doing)
+ if (!$this->_send_sftp_packet(NET_SFTP_MKDIR, pack('Na*a*', strlen($dir), $dir, "\0\0\0\0"))) {
return false;
}
@@ -1803,6 +1823,10 @@ class SFTP extends SSH2
return false;
}
+ if ($mode !== -1) {
+ $this->chmod($mode, $dir);
+ }
+
return true;
}
@@ -1997,7 +2021,7 @@ class SFTP extends SSH2
$sftp_packet_size = 4096; // PuTTY uses 4096
// make the SFTP packet be exactly 4096 bytes by including the bytes in the NET_SFTP_WRITE packets "header"
$sftp_packet_size-= strlen($handle) + 25;
- $i = 0;
+ $i = $j = 0;
while ($dataCallback || ($size === 0 || $sent < $size)) {
if ($dataCallback) {
$temp = call_user_func($dataCallback, $sftp_packet_size);
@@ -2013,7 +2037,7 @@ class SFTP extends SSH2
$subtemp = $offset + $sent;
$packet = pack('Na*N3a*', strlen($handle), $handle, $subtemp / 4294967296, $subtemp, strlen($temp), $temp);
- if (!$this->_send_sftp_packet(NET_SFTP_WRITE, $packet)) {
+ if (!$this->_send_sftp_packet(NET_SFTP_WRITE, $packet, $j)) {
if ($mode & self::SOURCE_LOCAL_FILE) {
fclose($fp);
}
@@ -2025,8 +2049,9 @@ class SFTP extends SSH2
}
$i++;
+ $j++;
- if ($i == NET_SFTP_QUEUE_SIZE) {
+ if ($i == NET_SFTP_UPLOAD_QUEUE_SIZE) {
if (!$this->_read_put_responses($i)) {
$i = 0;
break;
@@ -2128,10 +2153,11 @@ class SFTP extends SSH2
* @param string $local_file
* @param int $offset
* @param int $length
+ * @param callable|null $progressCallback
* @return mixed
* @access public
*/
- function get($remote_file, $local_file = false, $offset = 0, $length = -1)
+ function get($remote_file, $local_file = false, $offset = 0, $length = -1, $progressCallback = null)
{
if (!($this->bitmap & SSH2::MASK_LOGIN)) {
return false;
@@ -2189,7 +2215,7 @@ class SFTP extends SSH2
$packet_size = $length > 0 ? min($this->max_sftp_packet, $length - $read) : $this->max_sftp_packet;
$packet = pack('Na*N3', strlen($handle), $handle, $tempoffset / 4294967296, $tempoffset, $packet_size);
- if (!$this->_send_sftp_packet(NET_SFTP_READ, $packet)) {
+ if (!$this->_send_sftp_packet(NET_SFTP_READ, $packet, $i)) {
if ($fclose_check) {
fclose($fp);
}
@@ -2197,6 +2223,9 @@ class SFTP extends SSH2
}
$packet = null;
$read+= $packet_size;
+ if (is_callable($progressCallback)) {
+ call_user_func($progressCallback, $read);
+ }
$i++;
}
@@ -2204,15 +2233,17 @@ class SFTP extends SSH2
break;
}
+ $packets_sent = $i - 1;
+
$clear_responses = false;
while ($i > 0) {
$i--;
if ($clear_responses) {
- $this->_get_sftp_packet();
+ $this->_get_sftp_packet($packets_sent - $i);
continue;
} else {
- $response = $this->_get_sftp_packet();
+ $response = $this->_get_sftp_packet($packets_sent - $i);
}
switch ($this->packet_type) {
@@ -2921,10 +2952,10 @@ class SFTP extends SSH2
* @return bool
* @access private
*/
- function _send_sftp_packet($type, $data)
+ function _send_sftp_packet($type, $data, $request_id = 1)
{
- $packet = $this->request_id !== false ?
- pack('NCNa*', strlen($data) + 5, $type, $this->request_id, $data) :
+ $packet = $this->use_request_id ?
+ pack('NCNa*', strlen($data) + 5, $type, $request_id, $data) :
pack('NCa*', strlen($data) + 1, $type, $data);
$start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
@@ -2950,6 +2981,20 @@ class SFTP extends SSH2
}
/**
+ * Resets a connection for re-use
+ *
+ * @param int $reason
+ * @access private
+ */
+ function _reset_connection($reason)
+ {
+ parent::_reset_connection($reason);
+ $this->use_request_id = false;
+ $this->pwd = false;
+ $this->requestBuffer = array();
+ }
+
+ /**
* Receives SFTP Packets
*
* See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info.
@@ -2962,9 +3007,18 @@ class SFTP extends SSH2
* @return string
* @access private
*/
- function _get_sftp_packet()
+ function _get_sftp_packet($request_id = null)
{
- $this->curTimeout = false;
+ if (isset($request_id) && isset($this->requestBuffer[$request_id])) {
+ $this->packet_type = $this->requestBuffer[$request_id]['packet_type'];
+ $temp = $this->requestBuffer[$request_id]['packet'];
+ unset($this->requestBuffer[$request_id]);
+ return $temp;
+ }
+
+ // in SSH2.php the timeout is cumulative per function call. eg. exec() will
+ // timeout after 10s. but for SFTP.php it's cumulative per packet
+ $this->curTimeout = $this->timeout;
$start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
@@ -2985,6 +3039,13 @@ class SFTP extends SSH2
$tempLength = $length;
$tempLength-= strlen($this->packet_buffer);
+
+ // 256 * 1024 is what SFTP_MAX_MSG_LENGTH is set to in OpenSSH's sftp-common.h
+ if ($tempLength > 256 * 1024) {
+ user_error('Invalid SFTP packet size');
+ return false;
+ }
+
// SFTP packet type and data payload
while ($tempLength > 0) {
$temp = $this->_get_channel_packet(self::CHANNEL, true);
@@ -3001,8 +3062,8 @@ class SFTP extends SSH2
$this->packet_type = ord($this->_string_shift($this->packet_buffer));
- if ($this->request_id !== false) {
- $this->_string_shift($this->packet_buffer, 4); // remove the request id
+ if ($this->use_request_id) {
+ extract(unpack('Npacket_id', $this->_string_shift($this->packet_buffer, 4))); // remove the request id
$length-= 5; // account for the request id and the packet type
} else {
$length-= 1; // account for the packet type
@@ -3025,6 +3086,14 @@ class SFTP extends SSH2
}
}
+ if (isset($request_id) && $this->use_request_id && $packet_id != $request_id) {
+ $this->requestBuffer[$packet_id] = array(
+ 'packet_type' => $this->packet_type,
+ 'packet' => $packet
+ );
+ return $this->_get_sftp_packet($request_id);
+ }
+
return $packet;
}
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Net/SSH1.php b/vendor/phpseclib/phpseclib/phpseclib/Net/SSH1.php
index 514b20a2d..ff48d5436 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Net/SSH1.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Net/SSH1.php
@@ -1124,6 +1124,9 @@ class SSH1
while ($length > 0) {
$temp = fread($this->fsock, $length);
+ if (strlen($temp) != $length) {
+ return false;
+ }
$raw.= $temp;
$length-= strlen($temp);
}
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php b/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php
index cdb7cb39e..f37a04948 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php
@@ -104,6 +104,7 @@ class SSH2
const CHANNEL_SHELL = 2;
const CHANNEL_SUBSYSTEM = 3;
const CHANNEL_AGENT_FORWARD = 4;
+ const CHANNEL_KEEP_ALIVE = 5;
/**#@-*/
/**#@+
@@ -145,7 +146,10 @@ class SSH2
*/
const READ_REGEX = 2;
/**
- * Returns when a string matching the regular expression $expect is found
+ * Returns whenever a data packet is received.
+ *
+ * Some data packets may only contain a single character so it may be necessary
+ * to call read() multiple times when using this option
*/
const READ_NEXT = 3;
/**#@-*/
@@ -206,6 +210,15 @@ class SSH2
var $kex_algorithms = false;
/**
+ * Key Exchange Algorithm
+ *
+ * @see self::getMethodsNegotiated()
+ * @var string|false
+ * @access private
+ */
+ var $kex_algorithm = false;
+
+ /**
* Minimum Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods
*
* @see self::_key_exchange()
@@ -314,6 +327,15 @@ class SSH2
var $languages_client_to_server = false;
/**
+ * Preferred Algorithms
+ *
+ * @see self::setPreferredAlgorithms()
+ * @var array
+ * @access private
+ */
+ var $preferred = array();
+
+ /**
* Block Size for Server to Client Encryption
*
* "Note that the length of the concatenation of 'packet_length',
@@ -571,6 +593,20 @@ class SSH2
var $window_size = 0x7FFFFFFF;
/**
+ * What we resize the window to
+ *
+ * When PuTTY resizes the window it doesn't add an additional 0x7FFFFFFF bytes - it adds 0x40000000 bytes.
+ * Some SFTP clients (GoAnywhere) don't support adding 0x7FFFFFFF to the window size after the fact so
+ * we'll just do what PuTTY does
+ *
+ * @var int
+ * @see self::_send_channel_packet()
+ * @see self::exec()
+ * @access private
+ */
+ var $window_resize = 0x40000000;
+
+ /**
* Window size, server to client
*
* Window size indexed by channel
@@ -895,14 +931,6 @@ class SSH2
var $bad_key_size_fix = false;
/**
- * The selected decryption algorithm
- *
- * @var string
- * @access private
- */
- var $decrypt_algorithm = '';
-
- /**
* Should we try to re-connect to re-establish keys?
*
* @var bool
@@ -919,6 +947,22 @@ class SSH2
var $binary_packet_buffer = false;
/**
+ * Preferred Signature Format
+ *
+ * @var string|false
+ * @access private
+ */
+ var $preferred_signature_format = false;
+
+ /**
+ * Authentication Credentials
+ *
+ * @var array
+ * @access private
+ */
+ var $auth = array();
+
+ /**
* Default Constructor.
*
* $host can either be a string, representing the host, or a stream resource.
@@ -1124,11 +1168,12 @@ class SSH2
}
$elapsed = microtime(true) - $start;
- $this->curTimeout-= $elapsed;
-
- if ($this->curTimeout <= 0) {
- $this->is_timeout = true;
- return false;
+ if ($this->curTimeout) {
+ $this->curTimeout-= $elapsed;
+ if ($this->curTimeout < 0) {
+ $this->is_timeout = true;
+ return false;
+ }
}
}
@@ -1173,6 +1218,9 @@ class SSH2
if (strlen($temp) == 255) {
continue;
}
+ if ($temp === false) {
+ return false;
+ }
$line.= "$temp\n";
@@ -1193,6 +1241,7 @@ class SSH2
}
if (feof($this->fsock)) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -1206,7 +1255,7 @@ class SSH2
$this->server_identifier = trim($temp, "\r\n");
if (strlen($extra)) {
- $this->errors[] = utf8_decode($data);
+ $this->errors[] = $data;
}
if (version_compare($matches[3], '1.99', '<')) {
@@ -1221,6 +1270,7 @@ class SSH2
if (!$this->send_kex_first) {
$response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -1257,7 +1307,7 @@ class SSH2
$identifier = 'SSH-2.0-phpseclib_2.0';
$ext = array();
- if (function_exists('\\Sodium\\library_version_major')) {
+ if (function_exists('sodium_crypto_box_publickey_from_secretkey')) {
$ext[] = 'libsodium';
}
@@ -1288,139 +1338,59 @@ class SSH2
*/
function _key_exchange($kexinit_payload_server = false)
{
- $kex_algorithms = array(
- // Elliptic Curve Diffie-Hellman Key Agreement (ECDH) using
- // Curve25519. See doc/curve25519-sha256@libssh.org.txt in the
- // libssh repository for more information.
- 'curve25519-sha256@libssh.org',
-
- // Diffie-Hellman Key Agreement (DH) using integer modulo prime
- // groups.
- 'diffie-hellman-group1-sha1', // REQUIRED
- 'diffie-hellman-group14-sha1', // REQUIRED
- 'diffie-hellman-group-exchange-sha1', // RFC 4419
- 'diffie-hellman-group-exchange-sha256', // RFC 4419
- );
- if (!function_exists('\\Sodium\\library_version_major')) {
- $kex_algorithms = array_diff(
- $kex_algorithms,
- array('curve25519-sha256@libssh.org')
- );
- }
-
- $server_host_key_algorithms = array(
- 'ssh-rsa', // RECOMMENDED sign Raw RSA Key
- 'ssh-dss' // REQUIRED sign Raw DSS Key
- );
-
- $encryption_algorithms = array(
- // from <http://tools.ietf.org/html/rfc4345#section-4>:
- 'arcfour256',
- 'arcfour128',
-
- //'arcfour', // OPTIONAL the ARCFOUR stream cipher with a 128-bit key
-
- // CTR modes from <http://tools.ietf.org/html/rfc4344#section-4>:
- 'aes128-ctr', // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key
- 'aes192-ctr', // RECOMMENDED AES with 192-bit key
- 'aes256-ctr', // RECOMMENDED AES with 256-bit key
-
- 'twofish128-ctr', // OPTIONAL Twofish in SDCTR mode, with 128-bit key
- 'twofish192-ctr', // OPTIONAL Twofish with 192-bit key
- 'twofish256-ctr', // OPTIONAL Twofish with 256-bit key
-
- 'aes128-cbc', // RECOMMENDED AES with a 128-bit key
- 'aes192-cbc', // OPTIONAL AES with a 192-bit key
- 'aes256-cbc', // OPTIONAL AES in CBC mode, with a 256-bit key
-
- 'twofish128-cbc', // OPTIONAL Twofish with a 128-bit key
- 'twofish192-cbc', // OPTIONAL Twofish with a 192-bit key
- 'twofish256-cbc',
- 'twofish-cbc', // OPTIONAL alias for "twofish256-cbc"
- // (this is being retained for historical reasons)
-
- 'blowfish-ctr', // OPTIONAL Blowfish in SDCTR mode
-
- 'blowfish-cbc', // OPTIONAL Blowfish in CBC mode
-
- '3des-ctr', // RECOMMENDED Three-key 3DES in SDCTR mode
-
- '3des-cbc', // REQUIRED three-key 3DES in CBC mode
- //'none' // OPTIONAL no encryption; NOT RECOMMENDED
- );
-
- if (extension_loaded('openssl') && !extension_loaded('mcrypt')) {
- // OpenSSL does not support arcfour256 in any capacity and arcfour128 / arcfour support is limited to
- // instances that do not use continuous buffers
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('arcfour256', 'arcfour128', 'arcfour')
- );
- }
-
- if (class_exists('\phpseclib\Crypt\RC4') === false) {
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('arcfour256', 'arcfour128', 'arcfour')
- );
- }
- if (class_exists('\phpseclib\Crypt\Rijndael') === false) {
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-cbc', 'aes192-cbc', 'aes256-cbc')
- );
- }
- if (class_exists('\phpseclib\Crypt\Twofish') === false) {
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('twofish128-ctr', 'twofish192-ctr', 'twofish256-ctr', 'twofish128-cbc', 'twofish192-cbc', 'twofish256-cbc', 'twofish-cbc')
- );
- }
- if (class_exists('\phpseclib\Crypt\Blowfish') === false) {
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('blowfish-ctr', 'blowfish-cbc')
- );
- }
- if (class_exists('\phpseclib\Crypt\TripleDES') === false) {
- $encryption_algorithms = array_diff(
- $encryption_algorithms,
- array('3des-ctr', '3des-cbc')
- );
- }
- $encryption_algorithms = array_values($encryption_algorithms);
-
- $mac_algorithms = array(
- // from <http://www.ietf.org/rfc/rfc6668.txt>:
- 'hmac-sha2-256',// RECOMMENDED HMAC-SHA256 (digest length = key length = 32)
-
- 'hmac-sha1-96', // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20)
- 'hmac-sha1', // REQUIRED HMAC-SHA1 (digest length = key length = 20)
- 'hmac-md5-96', // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16)
- 'hmac-md5', // OPTIONAL HMAC-MD5 (digest length = key length = 16)
- //'none' // OPTIONAL no MAC; NOT RECOMMENDED
- );
-
- $compression_algorithms = array(
- 'none' // REQUIRED no compression
- //'zlib' // OPTIONAL ZLIB (LZ77) compression
- );
+ $preferred = $this->preferred;
+
+ $kex_algorithms = isset($preferred['kex']) ?
+ $preferred['kex'] :
+ $this->getSupportedKEXAlgorithms();
+ $server_host_key_algorithms = isset($preferred['hostkey']) ?
+ $preferred['hostkey'] :
+ $this->getSupportedHostKeyAlgorithms();
+ $s2c_encryption_algorithms = isset($preferred['server_to_client']['crypt']) ?
+ $preferred['server_to_client']['crypt'] :
+ $this->getSupportedEncryptionAlgorithms();
+ $c2s_encryption_algorithms = isset($preferred['client_to_server']['crypt']) ?
+ $preferred['client_to_server']['crypt'] :
+ $this->getSupportedEncryptionAlgorithms();
+ $s2c_mac_algorithms = isset($preferred['server_to_client']['mac']) ?
+ $preferred['server_to_client']['mac'] :
+ $this->getSupportedMACAlgorithms();
+ $c2s_mac_algorithms = isset($preferred['client_to_server']['mac']) ?
+ $preferred['client_to_server']['mac'] :
+ $this->getSupportedMACAlgorithms();
+ $s2c_compression_algorithms = isset($preferred['server_to_client']['comp']) ?
+ $preferred['server_to_client']['comp'] :
+ $this->getSupportedCompressionAlgorithms();
+ $c2s_compression_algorithms = isset($preferred['client_to_server']['comp']) ?
+ $preferred['client_to_server']['comp'] :
+ $this->getSupportedCompressionAlgorithms();
// some SSH servers have buggy implementations of some of the above algorithms
switch (true) {
case $this->server_identifier == 'SSH-2.0-SSHD':
case substr($this->server_identifier, 0, 13) == 'SSH-2.0-DLINK':
- $mac_algorithms = array_values(array_diff(
- $mac_algorithms,
- array('hmac-sha1-96', 'hmac-md5-96')
- ));
+ if (!isset($preferred['server_to_client']['mac'])) {
+ $s2c_mac_algorithms = array_values(array_diff(
+ $s2c_mac_algorithms,
+ array('hmac-sha1-96', 'hmac-md5-96')
+ ));
+ }
+ if (!isset($preferred['client_to_server']['mac'])) {
+ $c2s_mac_algorithms = array_values(array_diff(
+ $c2s_mac_algorithms,
+ array('hmac-sha1-96', 'hmac-md5-96')
+ ));
+ }
}
$str_kex_algorithms = implode(',', $kex_algorithms);
$str_server_host_key_algorithms = implode(',', $server_host_key_algorithms);
- $encryption_algorithms_server_to_client = $encryption_algorithms_client_to_server = implode(',', $encryption_algorithms);
- $mac_algorithms_server_to_client = $mac_algorithms_client_to_server = implode(',', $mac_algorithms);
- $compression_algorithms_server_to_client = $compression_algorithms_client_to_server = implode(',', $compression_algorithms);
+ $encryption_algorithms_server_to_client = implode(',', $s2c_encryption_algorithms);
+ $encryption_algorithms_client_to_server = implode(',', $c2s_encryption_algorithms);
+ $mac_algorithms_server_to_client = implode(',', $s2c_mac_algorithms);
+ $mac_algorithms_client_to_server = implode(',', $c2s_mac_algorithms);
+ $compression_algorithms_server_to_client = implode(',', $s2c_compression_algorithms);
+ $compression_algorithms_client_to_server = implode(',', $c2s_compression_algorithms);
$client_cookie = Random::string(16);
@@ -1459,6 +1429,7 @@ class SSH2
$kexinit_payload_server = $this->_get_binary_packet();
if ($kexinit_payload_server === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -1546,14 +1517,14 @@ class SSH2
// we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange
// we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the
// diffie-hellman key exchange as fast as possible
- $decrypt = $this->_array_intersect_first($encryption_algorithms, $this->encryption_algorithms_server_to_client);
+ $decrypt = $this->_array_intersect_first($s2c_encryption_algorithms, $this->encryption_algorithms_server_to_client);
$decryptKeyLength = $this->_encryption_algorithm_to_key_size($decrypt);
if ($decryptKeyLength === null) {
user_error('No compatible server to client encryption algorithms found');
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
}
- $encrypt = $this->_array_intersect_first($encryption_algorithms, $this->encryption_algorithms_client_to_server);
+ $encrypt = $this->_array_intersect_first($c2s_encryption_algorithms, $this->encryption_algorithms_client_to_server);
$encryptKeyLength = $this->_encryption_algorithm_to_key_size($encrypt);
if ($encryptKeyLength === null) {
user_error('No compatible client to server encryption algorithms found');
@@ -1561,7 +1532,7 @@ class SSH2
}
// through diffie-hellman key exchange a symmetric key is obtained
- $kex_algorithm = $this->_array_intersect_first($kex_algorithms, $this->kex_algorithms);
+ $this->kex_algorithm = $kex_algorithm = $this->_array_intersect_first($kex_algorithms, $this->kex_algorithms);
if ($kex_algorithm === false) {
user_error('No compatible key exchange algorithms found');
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
@@ -1572,9 +1543,9 @@ class SSH2
if ($kex_algorithm === 'curve25519-sha256@libssh.org') {
$x = Random::string(32);
- $eBytes = \Sodium\crypto_box_publickey_from_secretkey($x);
- $clientKexInitMessage = NET_SSH2_MSG_KEX_ECDH_INIT;
- $serverKexReplyMessage = NET_SSH2_MSG_KEX_ECDH_REPLY;
+ $eBytes = sodium_crypto_box_publickey_from_secretkey($x);
+ $clientKexInitMessage = 'NET_SSH2_MSG_KEX_ECDH_INIT';
+ $serverKexReplyMessage = 'NET_SSH2_MSG_KEX_ECDH_REPLY';
$kexHash = new Hash('sha256');
} else {
if (strpos($kex_algorithm, 'diffie-hellman-group-exchange') === 0) {
@@ -1592,9 +1563,11 @@ class SSH2
if (!$this->_send_binary_packet($packet)) {
return false;
}
+ $this->_updateLogHistory('UNKNOWN (34)', 'NET_SSH2_MSG_KEXDH_GEX_REQUEST');
$response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -1603,6 +1576,7 @@ class SSH2
user_error('Expected SSH_MSG_KEX_DH_GEX_GROUP');
return false;
}
+ $this->_updateLogHistory('NET_SSH2_MSG_KEXDH_REPLY', 'NET_SSH2_MSG_KEXDH_GEX_GROUP');
if (strlen($response) < 4) {
return false;
@@ -1627,8 +1601,8 @@ class SSH2
$gBytes
);
- $clientKexInitMessage = NET_SSH2_MSG_KEXDH_GEX_INIT;
- $serverKexReplyMessage = NET_SSH2_MSG_KEXDH_GEX_REPLY;
+ $clientKexInitMessage = 'NET_SSH2_MSG_KEXDH_GEX_INIT';
+ $serverKexReplyMessage = 'NET_SSH2_MSG_KEXDH_GEX_REPLY';
} else {
switch ($kex_algorithm) {
// see http://tools.ietf.org/html/rfc2409#section-6.2 and
@@ -1655,8 +1629,8 @@ class SSH2
// the generator field element is 2 (decimal) and the hash function is sha1.
$g = new BigInteger(2);
$prime = new BigInteger($prime, 16);
- $clientKexInitMessage = NET_SSH2_MSG_KEXDH_INIT;
- $serverKexReplyMessage = NET_SSH2_MSG_KEXDH_REPLY;
+ $clientKexInitMessage = 'NET_SSH2_MSG_KEXDH_INIT';
+ $serverKexReplyMessage = 'NET_SSH2_MSG_KEXDH_REPLY';
}
switch ($kex_algorithm) {
@@ -1684,15 +1658,24 @@ class SSH2
$eBytes = $e->toBytes(true);
}
- $data = pack('CNa*', $clientKexInitMessage, strlen($eBytes), $eBytes);
+ $data = pack('CNa*', constant($clientKexInitMessage), strlen($eBytes), $eBytes);
if (!$this->_send_binary_packet($data)) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
+ switch ($clientKexInitMessage) {
+ case 'NET_SSH2_MSG_KEX_ECDH_INIT':
+ $this->_updateLogHistory('NET_SSH2_MSG_KEXDH_INIT', 'NET_SSH2_MSG_KEX_ECDH_INIT');
+ break;
+ case 'NET_SSH2_MSG_KEXDH_GEX_INIT':
+ $this->_updateLogHistory('UNKNOWN (32)', 'NET_SSH2_MSG_KEXDH_GEX_INIT');
+ }
$response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -1701,10 +1684,17 @@ class SSH2
}
extract(unpack('Ctype', $this->_string_shift($response, 1)));
- if ($type != $serverKexReplyMessage) {
- user_error('Expected SSH_MSG_KEXDH_REPLY');
+ if ($type != constant($serverKexReplyMessage)) {
+ user_error("Expected $serverKexReplyMessage");
return false;
}
+ switch ($serverKexReplyMessage) {
+ case 'NET_SSH2_MSG_KEX_ECDH_REPLY':
+ $this->_updateLogHistory('NET_SSH2_MSG_KEXDH_REPLY', 'NET_SSH2_MSG_KEX_ECDH_REPLY');
+ break;
+ case 'NET_SSH2_MSG_KEXDH_GEX_REPLY':
+ $this->_updateLogHistory('UNKNOWN (33)', 'NET_SSH2_MSG_KEXDH_GEX_REPLY');
+ }
if (strlen($response) < 4) {
return false;
@@ -1741,8 +1731,15 @@ class SSH2
user_error('Received curve25519 public key of invalid length.');
return false;
}
- $key = new BigInteger(\Sodium\crypto_scalarmult($x, $fBytes), 256);
- \Sodium\memzero($x);
+ $key = new BigInteger(sodium_crypto_scalarmult($x, $fBytes), 256);
+ // sodium_compat doesn't emulate sodium_memzero
+ // also, with v1 of libsodium API the extension identifies itself as
+ // libsodium whereas v2 of the libsodium API (what PHP 7.2+ includes)
+ // identifies itself as sodium. sodium_compat uses the v1 API to
+ // emulate the v2 API if it's the v1 API that's available
+ if (extension_loaded('sodium') || extension_loaded('libsodium')) {
+ sodium_memzero($x);
+ }
} else {
$f = new BigInteger($fBytes, -256);
$key = $f->modPow($x, $prime);
@@ -1782,9 +1779,25 @@ class SSH2
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
}
- if ($public_key_format != $server_host_key_algorithm || $this->signature_format != $server_host_key_algorithm) {
- user_error('Server Host Key Algorithm Mismatch');
- return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
+ switch ($server_host_key_algorithm) {
+ case 'ssh-dss':
+ $expected_key_format = 'ssh-dss';
+ break;
+ //case 'rsa-sha2-256':
+ //case 'rsa-sha2-512':
+ //case 'ssh-rsa':
+ default:
+ $expected_key_format = 'ssh-rsa';
+ }
+
+ if ($public_key_format != $expected_key_format || $this->signature_format != $server_host_key_algorithm) {
+ switch (true) {
+ case $this->signature_format == $server_host_key_algorithm:
+ case $server_host_key_algorithm != 'rsa-sha2-256' && $server_host_key_algorithm != 'rsa-sha2-512':
+ case $this->signature_format != 'ssh-rsa':
+ user_error('Server Host Key Algorithm Mismatch');
+ return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
+ }
}
$packet = pack(
@@ -1799,6 +1812,7 @@ class SSH2
$response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -1813,14 +1827,12 @@ class SSH2
return false;
}
- $this->decrypt_algorithm = $decrypt;
-
$keyBytes = pack('Na*', strlen($keyBytes), $keyBytes);
$this->encrypt = $this->_encryption_algorithm_to_crypt_instance($encrypt);
if ($this->encrypt) {
if ($this->crypto_engine) {
- $this->encrypt->setEngine($this->crypto_engine);
+ $this->encrypt->setPreferredEngine($this->crypto_engine);
}
if ($this->encrypt->block_size) {
$this->encrypt_block_size = $this->encrypt->block_size;
@@ -1828,6 +1840,10 @@ class SSH2
$this->encrypt->enableContinuousBuffer();
$this->encrypt->disablePadding();
+ if ($this->encrypt->getBlockLength()) {
+ $this->encrypt_block_size = $this->encrypt->getBlockLength() >> 3;
+ }
+
$iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id);
while ($this->encrypt_block_size > strlen($iv)) {
$iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv);
@@ -1839,12 +1855,14 @@ class SSH2
$key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key);
}
$this->encrypt->setKey(substr($key, 0, $encryptKeyLength));
+
+ $this->encrypt->name = $decrypt;
}
$this->decrypt = $this->_encryption_algorithm_to_crypt_instance($decrypt);
if ($this->decrypt) {
if ($this->crypto_engine) {
- $this->decrypt->setEngine($this->crypto_engine);
+ $this->decrypt->setPreferredEngine($this->crypto_engine);
}
if ($this->decrypt->block_size) {
$this->decrypt_block_size = $this->decrypt->block_size;
@@ -1852,6 +1870,10 @@ class SSH2
$this->decrypt->enableContinuousBuffer();
$this->decrypt->disablePadding();
+ if ($this->decrypt->getBlockLength()) {
+ $this->decrypt_block_size = $this->decrypt->getBlockLength() >> 3;
+ }
+
$iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id);
while ($this->decrypt_block_size > strlen($iv)) {
$iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv);
@@ -1863,6 +1885,8 @@ class SSH2
$key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key);
}
$this->decrypt->setKey(substr($key, 0, $decryptKeyLength));
+
+ $this->decrypt->name = $decrypt;
}
/* The "arcfour128" algorithm is the RC4 cipher, as described in
@@ -1879,7 +1903,7 @@ class SSH2
$this->decrypt->decrypt(str_repeat("\0", 1536));
}
- $mac_algorithm = $this->_array_intersect_first($mac_algorithms, $this->mac_algorithms_client_to_server);
+ $mac_algorithm = $this->_array_intersect_first($c2s_mac_algorithms, $this->mac_algorithms_client_to_server);
if ($mac_algorithm === false) {
user_error('No compatible client to server message authentication algorithms found');
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
@@ -1907,8 +1931,9 @@ class SSH2
$this->hmac_create = new Hash('md5-96');
$createKeyLength = 16;
}
+ $this->hmac_create->name = $mac_algorithm;
- $mac_algorithm = $this->_array_intersect_first($mac_algorithms, $this->mac_algorithms_server_to_client);
+ $mac_algorithm = $this->_array_intersect_first($s2c_mac_algorithms, $this->mac_algorithms_server_to_client);
if ($mac_algorithm === false) {
user_error('No compatible server to client message authentication algorithms found');
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
@@ -1942,6 +1967,7 @@ class SSH2
$checkKeyLength = 16;
$this->hmac_size = 12;
}
+ $this->hmac_check->name = $mac_algorithm;
$key = $kexHash->hash($keyBytes . $this->exchange_hash . 'E' . $this->session_id);
while ($createKeyLength > strlen($key)) {
@@ -1955,19 +1981,19 @@ class SSH2
}
$this->hmac_check->setKey(substr($key, 0, $checkKeyLength));
- $compression_algorithm = $this->_array_intersect_first($compression_algorithms, $this->compression_algorithms_server_to_client);
+ $compression_algorithm = $this->_array_intersect_first($c2s_compression_algorithms, $this->compression_algorithms_client_to_server);
if ($compression_algorithm === false) {
- user_error('No compatible server to client compression algorithms found');
+ user_error('No compatible client to server compression algorithms found');
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
}
- $this->decompress = $compression_algorithm == 'zlib';
+ //$this->decompress = $compression_algorithm == 'zlib';
- $compression_algorithm = $this->_array_intersect_first($compression_algorithms, $this->compression_algorithms_client_to_server);
+ $compression_algorithm = $this->_array_intersect_first($s2c_compression_algorithms, $this->compression_algorithms_client_to_server);
if ($compression_algorithm === false) {
- user_error('No compatible client to server compression algorithms found');
+ user_error('No compatible server to client compression algorithms found');
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
}
- $this->compress = $compression_algorithm == 'zlib';
+ //$this->compress = $compression_algorithm == 'zlib';
return true;
}
@@ -2059,7 +2085,7 @@ class SSH2
return null;
}
- /*
+ /**
* Tests whether or not proposed algorithm has a potential for issues
*
* @link https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/ssh2-aesctr-openssh.html
@@ -2095,6 +2121,16 @@ class SSH2
function login($username)
{
$args = func_get_args();
+ $this->auth[] = $args;
+
+ // try logging with 'none' as an authentication method first since that's what
+ // PuTTY does
+ if ($this->_login($username)) {
+ return true;
+ }
+ if (count($args) == 1) {
+ return false;
+ }
return call_user_func_array(array(&$this, '_login'), $args);
}
@@ -2166,6 +2202,7 @@ class SSH2
}
return $this->_login_helper($username, $password);
}
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -2218,6 +2255,7 @@ class SSH2
$response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -2276,6 +2314,7 @@ class SSH2
$response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -2287,14 +2326,12 @@ class SSH2
switch ($type) {
case NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: // in theory, the password can be changed
- if (defined('NET_SSH2_LOGGING')) {
- $this->message_number_log[count($this->message_number_log) - 1] = 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ';
- }
+ $this->_updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ');
if (strlen($response) < 4) {
return false;
}
extract(unpack('Nlength', $this->_string_shift($response, 4)));
- $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . utf8_decode($this->_string_shift($response, $length));
+ $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . $this->_string_shift($response, $length);
return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER);
case NET_SSH2_MSG_USERAUTH_FAILURE:
// can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
@@ -2376,6 +2413,7 @@ class SSH2
} else {
$orig = $response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -2439,12 +2477,8 @@ class SSH2
// see http://tools.ietf.org/html/rfc4256#section-3.2
if (strlen($this->last_interactive_response)) {
$this->last_interactive_response = '';
- } elseif (defined('NET_SSH2_LOGGING')) {
- $this->message_number_log[count($this->message_number_log) - 1] = str_replace(
- 'UNKNOWN',
- 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST',
- $this->message_number_log[count($this->message_number_log) - 1]
- );
+ } else {
+ $this->_updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST');
}
if (!count($responses) && $num_prompts) {
@@ -2467,13 +2501,7 @@ class SSH2
return false;
}
- if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == self::LOG_COMPLEX) {
- $this->message_number_log[count($this->message_number_log) - 1] = str_replace(
- 'UNKNOWN',
- 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE',
- $this->message_number_log[count($this->message_number_log) - 1]
- );
- }
+ $this->_updateLogHistory('UNKNOWN (61)', 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE');
/*
After receiving the response, the server MUST send either an
@@ -2545,6 +2573,21 @@ class SSH2
$publickey['n']
);
+ switch ($this->signature_format) {
+ case 'rsa-sha2-512':
+ $hash = 'sha512';
+ $signatureType = 'rsa-sha2-512';
+ break;
+ case 'rsa-sha2-256':
+ $hash = 'sha256';
+ $signatureType = 'rsa-sha2-256';
+ break;
+ //case 'ssh-rsa':
+ default:
+ $hash = 'sha1';
+ $signatureType = 'ssh-rsa';
+ }
+
$part1 = pack(
'CNa*Na*Na*',
NET_SSH2_MSG_USERAUTH_REQUEST,
@@ -2555,7 +2598,7 @@ class SSH2
strlen('publickey'),
'publickey'
);
- $part2 = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey), $publickey);
+ $part2 = pack('Na*Na*', strlen($signatureType), $signatureType, strlen($publickey), $publickey);
$packet = $part1 . chr(0) . $part2;
if (!$this->_send_binary_packet($packet)) {
@@ -2564,6 +2607,7 @@ class SSH2
$response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -2584,19 +2628,14 @@ class SSH2
case NET_SSH2_MSG_USERAUTH_PK_OK:
// we'll just take it on faith that the public key blob and the public key algorithm name are as
// they should be
- if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == self::LOG_COMPLEX) {
- $this->message_number_log[count($this->message_number_log) - 1] = str_replace(
- 'UNKNOWN',
- 'NET_SSH2_MSG_USERAUTH_PK_OK',
- $this->message_number_log[count($this->message_number_log) - 1]
- );
- }
+ $this->_updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_PK_OK');
}
$packet = $part1 . chr(1) . $part2;
$privatekey->setSignatureMode(RSA::SIGNATURE_PKCS1);
+ $privatekey->setHash($hash);
$signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet));
- $signature = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($signature), $signature);
+ $signature = pack('Na*Na*', strlen($signatureType), $signatureType, strlen($signature), $signature);
$packet.= pack('Na*', strlen($signature), $signature);
if (!$this->_send_binary_packet($packet)) {
@@ -2605,6 +2644,7 @@ class SSH2
$response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -2731,6 +2771,7 @@ class SSH2
$response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -2870,6 +2911,7 @@ class SSH2
$response = $this->_get_binary_packet();
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -3185,6 +3227,69 @@ class SSH2
}
/**
+ * Pings a server connection, or tries to reconnect if the connection has gone down
+ *
+ * Inspired by http://php.net/manual/en/mysqli.ping.php
+ *
+ * @return bool
+ * @access public
+ */
+ function ping()
+ {
+ if (!$this->isAuthenticated()) {
+ if (!empty($this->auth)) {
+ return $this->_reconnect();
+ }
+ return false;
+ }
+
+ $this->window_size_server_to_client[self::CHANNEL_KEEP_ALIVE] = $this->window_size;
+ $packet_size = 0x4000;
+ $packet = pack(
+ 'CNa*N3',
+ NET_SSH2_MSG_CHANNEL_OPEN,
+ strlen('session'),
+ 'session',
+ self::CHANNEL_KEEP_ALIVE,
+ $this->window_size_server_to_client[self::CHANNEL_KEEP_ALIVE],
+ $packet_size
+ );
+
+ if (!@$this->_send_binary_packet($packet)) {
+ return $this->_reconnect();
+ }
+
+ $this->channel_status[self::CHANNEL_KEEP_ALIVE] = NET_SSH2_MSG_CHANNEL_OPEN;
+
+ $response = @$this->_get_channel_packet(self::CHANNEL_KEEP_ALIVE);
+ if ($response !== false) {
+ $this->_close_channel(self::CHANNEL_KEEP_ALIVE);
+ return true;
+ }
+
+ return $this->_reconnect();
+ }
+
+ /**
+ * In situ reconnect method
+ *
+ * @return boolean
+ * @access private
+ */
+ function _reconnect()
+ {
+ $this->_reset_connection(NET_SSH2_DISCONNECT_CONNECTION_LOST);
+ $this->retry_connect = true;
+ if (!$this->_connect()) {
+ return false;
+ }
+ foreach ($this->auth as $auth) {
+ $result = call_user_func_array(array(&$this, 'login'), $auth);
+ }
+ return $result;
+ }
+
+ /**
* Resets a connection for re-use
*
* @param int $reason
@@ -3214,8 +3319,8 @@ class SSH2
function _get_binary_packet($skip_channel_filter = false)
{
if (!is_resource($this->fsock) || feof($this->fsock)) {
- user_error('Connection closed prematurely');
$this->bitmap = 0;
+ user_error('Connection closed prematurely');
return false;
}
@@ -3245,7 +3350,7 @@ class SSH2
// "implementations SHOULD check that the packet length is reasonable"
// PuTTY uses 0x9000 as the actual max packet size and so to shall we
if ($remaining_length < -$this->decrypt_block_size || $remaining_length > 0x9000 || $remaining_length % $this->decrypt_block_size != 0) {
- if (!$this->bad_key_size_fix && $this->_bad_algorithm_candidate($this->decrypt_algorithm) && !($this->bitmap & SSH2::MASK_LOGIN)) {
+ if (!$this->bad_key_size_fix && $this->_bad_algorithm_candidate($this->decrypt->name) && !($this->bitmap & SSH2::MASK_LOGIN)) {
$this->bad_key_size_fix = true;
$this->_reset_connection(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
return false;
@@ -3258,8 +3363,8 @@ class SSH2
while ($remaining_length > 0) {
$temp = stream_get_contents($this->fsock, $remaining_length);
if ($temp === false || feof($this->fsock)) {
- user_error('Error reading from socket');
$this->bitmap = 0;
+ user_error('Error reading from socket');
return false;
}
$buffer.= $temp;
@@ -3277,8 +3382,8 @@ class SSH2
if ($this->hmac_check !== false) {
$hmac = stream_get_contents($this->fsock, $this->hmac_size);
if ($hmac === false || strlen($hmac) != $this->hmac_size) {
- user_error('Error reading socket');
$this->bitmap = 0;
+ user_error('Error reading socket');
return false;
} elseif ($hmac != $this->hmac_check->hash(pack('NNCa*', $this->get_seq_no, $packet_length, $padding_length, $payload . $padding))) {
user_error('Invalid HMAC');
@@ -3322,7 +3427,7 @@ class SSH2
return false;
}
extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8)));
- $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . utf8_decode($this->_string_shift($payload, $length));
+ $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . $this->_string_shift($payload, $length);
$this->bitmap = 0;
return false;
case NET_SSH2_MSG_IGNORE:
@@ -3334,7 +3439,7 @@ class SSH2
return false;
}
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
- $this->errors[] = 'SSH_MSG_DEBUG: ' . utf8_decode($this->_string_shift($payload, $length));
+ $this->errors[] = 'SSH_MSG_DEBUG: ' . $this->_string_shift($payload, $length);
$payload = $this->_get_binary_packet($skip_channel_filter);
break;
case NET_SSH2_MSG_UNIMPLEMENTED:
@@ -3357,7 +3462,7 @@ class SSH2
return false;
}
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
- $this->banner_message = utf8_decode($this->_string_shift($payload, $length));
+ $this->banner_message = $this->_string_shift($payload, $length);
$payload = $this->_get_binary_packet();
}
@@ -3561,7 +3666,12 @@ class SSH2
$response = $this->binary_packet_buffer;
$this->binary_packet_buffer = false;
} else {
- if ($this->curTimeout) {
+ $read = array($this->fsock);
+ $write = $except = null;
+
+ if (!$this->curTimeout) {
+ @stream_select($read, $write, $except, null);
+ } else {
if ($this->curTimeout < 0) {
$this->is_timeout = true;
return true;
@@ -3576,6 +3686,9 @@ class SSH2
// on windows this returns a "Warning: Invalid CRT parameters detected" error
if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
$this->is_timeout = true;
+ if ($client_channel == self::CHANNEL_EXEC && !$this->request_pty) {
+ $this->_close_channel($client_channel);
+ }
return true;
}
$elapsed = microtime(true) - $start;
@@ -3584,6 +3697,7 @@ class SSH2
$response = $this->_get_binary_packet(true);
if ($response === false) {
+ $this->bitmap = 0;
user_error('Connection closed by server');
return false;
}
@@ -3593,10 +3707,6 @@ class SSH2
return true;
}
if (!strlen($response)) {
- return '';
- }
-
- if (!strlen($response)) {
return false;
}
extract(unpack('Ctype', $this->_string_shift($response, 1)));
@@ -3616,17 +3726,19 @@ class SSH2
// resize the window, if appropriate
if ($this->window_size_server_to_client[$channel] < 0) {
- $packet = pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_size);
+ // PuTTY does something more analogous to the following:
+ //if ($this->window_size_server_to_client[$channel] < 0x3FFFFFFF) {
+ $packet = pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_resize);
if (!$this->_send_binary_packet($packet)) {
return false;
}
- $this->window_size_server_to_client[$channel]+= $this->window_size;
+ $this->window_size_server_to_client[$channel]+= $this->window_resize;
}
switch ($type) {
case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA:
/*
- if ($client_channel == NET_SSH2_CHANNEL_EXEC) {
+ if ($client_channel == self::CHANNEL_EXEC) {
$this->_send_channel_packet($client_channel, chr(0));
}
*/
@@ -3818,8 +3930,8 @@ class SSH2
function _send_binary_packet($data, $logged = null)
{
if (!is_resource($this->fsock) || feof($this->fsock)) {
- user_error('Connection closed prematurely');
$this->bitmap = 0;
+ user_error('Connection closed prematurely');
return false;
}
@@ -4037,10 +4149,14 @@ class SSH2
if ($this->bitmap & self::MASK_CONNECTED) {
$data = pack('CNNa*Na*', NET_SSH2_MSG_DISCONNECT, $reason, 0, '', 0, '');
$this->_send_binary_packet($data);
- $this->bitmap = 0;
+ }
+
+ $this->bitmap = 0;
+ if (is_resource($this->fsock) && get_resource_type($this->fsock) == 'stream') {
fclose($this->fsock);
- return false;
}
+
+ return false;
}
/**
@@ -4362,6 +4478,306 @@ class SSH2
}
/**
+ * Returns a list of algorithms the server supports
+ *
+ * @return array
+ * @access public
+ */
+ function getServerAlgorithms()
+ {
+ $this->_connect();
+
+ return array(
+ 'kex' => $this->kex_algorithms,
+ 'hostkey' => $this->server_host_key_algorithms,
+ 'client_to_server' => array(
+ 'crypt' => $this->encryption_algorithms_client_to_server,
+ 'mac' => $this->mac_algorithms_client_to_server,
+ 'comp' => $this->compression_algorithms_client_to_server,
+ 'lang' => $this->languages_client_to_server
+ ),
+ 'server_to_client' => array(
+ 'crypt' => $this->encryption_algorithms_server_to_client,
+ 'mac' => $this->mac_algorithms_server_to_client,
+ 'comp' => $this->compression_algorithms_server_to_client,
+ 'lang' => $this->languages_server_to_client
+ )
+ );
+ }
+
+ /**
+ * Returns a list of KEX algorithms that phpseclib supports
+ *
+ * @return array
+ * @access public
+ */
+ function getSupportedKEXAlgorithms()
+ {
+ $kex_algorithms = array(
+ // Elliptic Curve Diffie-Hellman Key Agreement (ECDH) using
+ // Curve25519. See doc/curve25519-sha256@libssh.org.txt in the
+ // libssh repository for more information.
+ 'curve25519-sha256@libssh.org',
+
+ 'diffie-hellman-group-exchange-sha256',// RFC 4419
+ 'diffie-hellman-group-exchange-sha1', // RFC 4419
+
+ // Diffie-Hellman Key Agreement (DH) using integer modulo prime
+ // groups.
+ 'diffie-hellman-group14-sha1', // REQUIRED
+ 'diffie-hellman-group1-sha1', // REQUIRED
+ );
+
+ if (!function_exists('sodium_crypto_box_publickey_from_secretkey')) {
+ $kex_algorithms = array_diff(
+ $kex_algorithms,
+ array('curve25519-sha256@libssh.org')
+ );
+ }
+
+ return $kex_algorithms;
+ }
+
+ /**
+ * Returns a list of host key algorithms that phpseclib supports
+ *
+ * @return array
+ * @access public
+ */
+ function getSupportedHostKeyAlgorithms()
+ {
+ return array(
+ 'rsa-sha2-256', // RFC 8332
+ 'rsa-sha2-512', // RFC 8332
+ 'ssh-rsa', // RECOMMENDED sign Raw RSA Key
+ 'ssh-dss' // REQUIRED sign Raw DSS Key
+ );
+ }
+
+ /**
+ * Returns a list of symmetric key algorithms that phpseclib supports
+ *
+ * @return array
+ * @access public
+ */
+ function getSupportedEncryptionAlgorithms()
+ {
+ $algos = array(
+ // from <http://tools.ietf.org/html/rfc4345#section-4>:
+ 'arcfour256',
+ 'arcfour128',
+
+ //'arcfour', // OPTIONAL the ARCFOUR stream cipher with a 128-bit key
+
+ // CTR modes from <http://tools.ietf.org/html/rfc4344#section-4>:
+ 'aes128-ctr', // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key
+ 'aes192-ctr', // RECOMMENDED AES with 192-bit key
+ 'aes256-ctr', // RECOMMENDED AES with 256-bit key
+
+ 'twofish128-ctr', // OPTIONAL Twofish in SDCTR mode, with 128-bit key
+ 'twofish192-ctr', // OPTIONAL Twofish with 192-bit key
+ 'twofish256-ctr', // OPTIONAL Twofish with 256-bit key
+
+ 'aes128-cbc', // RECOMMENDED AES with a 128-bit key
+ 'aes192-cbc', // OPTIONAL AES with a 192-bit key
+ 'aes256-cbc', // OPTIONAL AES in CBC mode, with a 256-bit key
+
+ 'twofish128-cbc', // OPTIONAL Twofish with a 128-bit key
+ 'twofish192-cbc', // OPTIONAL Twofish with a 192-bit key
+ 'twofish256-cbc',
+ 'twofish-cbc', // OPTIONAL alias for "twofish256-cbc"
+ // (this is being retained for historical reasons)
+
+ 'blowfish-ctr', // OPTIONAL Blowfish in SDCTR mode
+
+ 'blowfish-cbc', // OPTIONAL Blowfish in CBC mode
+
+ '3des-ctr', // RECOMMENDED Three-key 3DES in SDCTR mode
+
+ '3des-cbc', // REQUIRED three-key 3DES in CBC mode
+
+ //'none' // OPTIONAL no encryption; NOT RECOMMENDED
+ );
+
+ $engines = array(
+ Base::ENGINE_OPENSSL,
+ Base::ENGINE_MCRYPT,
+ Base::ENGINE_INTERNAL
+ );
+
+ $ciphers = array();
+ foreach ($engines as $engine) {
+ foreach ($algos as $algo) {
+ $obj = $this->_encryption_algorithm_to_crypt_instance($algo);
+ if ($obj instanceof Rijndael) {
+ $obj->setKeyLength(preg_replace('#[^\d]#', '', $algo));
+ }
+ switch ($algo) {
+ case 'arcfour128':
+ case 'arcfour256':
+ if ($engine != Base::ENGINE_INTERNAL) {
+ continue 2;
+ }
+ }
+ if ($obj->isValidEngine($engine)) {
+ $algos = array_diff($algos, array($algo));
+ $ciphers[] = $algo;
+ }
+ }
+ }
+
+ return $ciphers;
+ }
+
+ /**
+ * Returns a list of MAC algorithms that phpseclib supports
+ *
+ * @return array
+ * @access public
+ */
+ function getSupportedMACAlgorithms()
+ {
+ return array(
+ // from <http://www.ietf.org/rfc/rfc6668.txt>:
+ 'hmac-sha2-256',// RECOMMENDED HMAC-SHA256 (digest length = key length = 32)
+
+ 'hmac-sha1-96', // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20)
+ 'hmac-sha1', // REQUIRED HMAC-SHA1 (digest length = key length = 20)
+ 'hmac-md5-96', // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16)
+ 'hmac-md5', // OPTIONAL HMAC-MD5 (digest length = key length = 16)
+ //'none' // OPTIONAL no MAC; NOT RECOMMENDED
+ );
+ }
+
+ /**
+ * Returns a list of compression algorithms that phpseclib supports
+ *
+ * @return array
+ * @access public
+ */
+ function getSupportedCompressionAlgorithms()
+ {
+ return array(
+ 'none' // REQUIRED no compression
+ //'zlib' // OPTIONAL ZLIB (LZ77) compression
+ );
+ }
+
+ /**
+ * Return list of negotiated algorithms
+ *
+ * Uses the same format as https://www.php.net/ssh2-methods-negotiated
+ *
+ * @return array
+ * @access public
+ */
+ function getAlgorithmsNegotiated()
+ {
+ $this->_connect();
+
+ return array(
+ 'kex' => $this->kex_algorithm,
+ 'hostkey' => $this->signature_format,
+ 'client_to_server' => array(
+ 'crypt' => $this->encrypt->name,
+ 'mac' => $this->hmac_create->name,
+ 'comp' => 'none',
+ ),
+ 'server_to_client' => array(
+ 'crypt' => $this->decrypt->name,
+ 'mac' => $this->hmac_check->name,
+ 'comp' => 'none',
+ )
+ );
+ }
+
+ /**
+ * Accepts an associative array with up to four parameters as described at
+ * <https://www.php.net/manual/en/function.ssh2-connect.php>
+ *
+ * @param array $methods
+ * @access public
+ */
+ function setPreferredAlgorithms($methods)
+ {
+ $preferred = $methods;
+
+ if (isset($preferred['kex'])) {
+ $preferred['kex'] = array_intersect(
+ $preferred['kex'],
+ $this->getSupportedKEXAlgorithms()
+ );
+ }
+
+ if (isset($preferred['hostkey'])) {
+ $preferred['hostkey'] = array_intersect(
+ $preferred['hostkey'],
+ $this->getSupportedHostKeyAlgorithms()
+ );
+ }
+
+ $keys = array('client_to_server', 'server_to_client');
+ foreach ($keys as $key) {
+ if (isset($preferred[$key])) {
+ $a = &$preferred[$key];
+ if (isset($a['crypt'])) {
+ $a['crypt'] = array_intersect(
+ $a['crypt'],
+ $this->getSupportedEncryptionAlgorithms()
+ );
+ }
+ if (isset($a['comp'])) {
+ $a['comp'] = array_intersect(
+ $a['comp'],
+ $this->getSupportedCompressionAlgorithms()
+ );
+ }
+ if (isset($a['mac'])) {
+ $a['mac'] = array_intersect(
+ $a['mac'],
+ $this->getSupportedMACAlgorithms()
+ );
+ }
+ }
+ }
+
+ $keys = array(
+ 'kex',
+ 'hostkey',
+ 'client_to_server/crypt',
+ 'client_to_server/comp',
+ 'client_to_server/mac',
+ 'server_to_client/crypt',
+ 'server_to_client/comp',
+ 'server_to_client/mac',
+ );
+ foreach ($keys as $key) {
+ $p = $preferred;
+ $m = $methods;
+
+ $subkeys = explode('/', $key);
+ foreach ($subkeys as $subkey) {
+ if (!isset($p[$subkey])) {
+ continue 2;
+ }
+ $p = $p[$subkey];
+ $m = $m[$subkey];
+ }
+
+ if (count($p) != count($m)) {
+ $diff = array_diff($m, $p);
+ $msg = count($diff) == 1 ?
+ ' is not a supported algorithm' :
+ ' are not supported algorithms';
+ user_error(implode(', ', $diff) . $msg);
+ return false;
+ }
+ }
+
+ $this->preferred = $preferred;
+ }
+
+ /**
* Returns the banner message.
*
* Quoting from the RFC, "in some jurisdictions, sending a warning message before
@@ -4480,6 +4896,8 @@ class SSH2
break;
case 'ssh-rsa':
+ case 'rsa-sha2-256':
+ case 'rsa-sha2-512':
if (strlen($server_public_host_key) < 4) {
return false;
}
@@ -4502,8 +4920,21 @@ class SSH2
$signature = $this->_string_shift($signature, $temp['length']);
$rsa = new RSA();
+ switch ($this->signature_format) {
+ case 'rsa-sha2-512':
+ $hash = 'sha512';
+ break;
+ case 'rsa-sha2-256':
+ $hash = 'sha256';
+ break;
+ //case 'ssh-rsa':
+ default:
+ $hash = 'sha1';
+ }
+ $rsa->setHash($hash);
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
$rsa->loadKey(array('e' => $e, 'n' => $n), RSA::PUBLIC_FORMAT_RAW);
+
if (!$rsa->verify($this->exchange_hash, $signature)) {
user_error('Bad server signature');
return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE);
@@ -4530,7 +4961,30 @@ class SSH2
$s = $s->modPow($e, $n);
$s = $s->toBytes();
- $h = pack('N4H*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, sha1($this->exchange_hash));
+ switch ($this->signature_format) {
+ case 'rsa-sha2-512':
+ $hash = 'sha512';
+ break;
+ case 'rsa-sha2-256':
+ $hash = 'sha256';
+ break;
+ //case 'ssh-rsa':
+ default:
+ $hash = 'sha1';
+ }
+ $hashObj = new Hash($hash);
+ switch ($this->signature_format) {
+ case 'rsa-sha2-512':
+ $h = pack('N5a*', 0x00305130, 0x0D060960, 0x86480165, 0x03040203, 0x05000440, $hashObj->hash($this->exchange_hash));
+ break;
+ case 'rsa-sha2-256':
+ $h = pack('N5a*', 0x00303130, 0x0D060960, 0x86480165, 0x03040201, 0x05000420, $hashObj->hash($this->exchange_hash));
+ break;
+ //case 'ssh-rsa':
+ default:
+ $hash = 'sha1';
+ $h = pack('N4a*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, $hashObj->hash($this->exchange_hash));
+ }
$h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h;
if ($s != $h) {
@@ -4616,4 +5070,22 @@ class SSH2
$this->windowColumns = $columns;
$this->windowRows = $rows;
}
+
+ /**
+ * Update packet types in log history
+ *
+ * @param string $old
+ * @param string $new
+ * @access private
+ */
+ function _updateLogHistory($old, $new)
+ {
+ if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == self::LOG_COMPLEX) {
+ $this->message_number_log[count($this->message_number_log) - 1] = str_replace(
+ $old,
+ $new,
+ $this->message_number_log[count($this->message_number_log) - 1]
+ );
+ }
+ }
}
diff --git a/vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php b/vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php
index a4ff0549d..2b25250bd 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php
@@ -43,7 +43,7 @@ use phpseclib\System\SSH\Agent\Identity;
*
* @package SSH\Agent
* @author Jim Wigginton <terrafrost@php.net>
- * @access internal
+ * @access public
*/
class Agent
{
@@ -117,18 +117,20 @@ class Agent
* @return \phpseclib\System\SSH\Agent
* @access public
*/
- function __construct()
+ function __construct($address = null)
{
- switch (true) {
- case isset($_SERVER['SSH_AUTH_SOCK']):
- $address = $_SERVER['SSH_AUTH_SOCK'];
- break;
- case isset($_ENV['SSH_AUTH_SOCK']):
- $address = $_ENV['SSH_AUTH_SOCK'];
- break;
- default:
- user_error('SSH_AUTH_SOCK not found');
- return false;
+ if (!$address) {
+ switch (true) {
+ case isset($_SERVER['SSH_AUTH_SOCK']):
+ $address = $_SERVER['SSH_AUTH_SOCK'];
+ break;
+ case isset($_ENV['SSH_AUTH_SOCK']):
+ $address = $_ENV['SSH_AUTH_SOCK'];
+ break;
+ default:
+ user_error('SSH_AUTH_SOCK not found');
+ return false;
+ }
}
$this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr);
@@ -155,23 +157,54 @@ class Agent
$packet = pack('NC', 1, self::SSH_AGENTC_REQUEST_IDENTITIES);
if (strlen($packet) != fputs($this->fsock, $packet)) {
user_error('Connection closed while requesting identities');
+ return array();
}
- $length = current(unpack('N', fread($this->fsock, 4)));
+ $temp = fread($this->fsock, 4);
+ if (strlen($temp) != 4) {
+ user_error('Connection closed while requesting identities');
+ return array();
+ }
+ $length = current(unpack('N', $temp));
$type = ord(fread($this->fsock, 1));
if ($type != self::SSH_AGENT_IDENTITIES_ANSWER) {
user_error('Unable to request identities');
+ return array();
}
$identities = array();
- $keyCount = current(unpack('N', fread($this->fsock, 4)));
+ $temp = fread($this->fsock, 4);
+ if (strlen($temp) != 4) {
+ user_error('Connection closed while requesting identities');
+ return array();
+ }
+ $keyCount = current(unpack('N', $temp));
for ($i = 0; $i < $keyCount; $i++) {
- $length = current(unpack('N', fread($this->fsock, 4)));
+ $temp = fread($this->fsock, 4);
+ if (strlen($temp) != 4) {
+ user_error('Connection closed while requesting identities');
+ return array();
+ }
+ $length = current(unpack('N', $temp));
$key_blob = fread($this->fsock, $length);
+ if (strlen($key_blob) != $length) {
+ user_error('Connection closed while requesting identities');
+ return array();
+ }
$key_str = 'ssh-rsa ' . base64_encode($key_blob);
- $length = current(unpack('N', fread($this->fsock, 4)));
+ $temp = fread($this->fsock, 4);
+ if (strlen($temp) != 4) {
+ user_error('Connection closed while requesting identities');
+ return array();
+ }
+ $length = current(unpack('N', $temp));
if ($length) {
- $key_str.= ' ' . fread($this->fsock, $length);
+ $temp = fread($this->fsock, $length);
+ if (strlen($temp) != $length) {
+ user_error('Connection closed while requesting identities');
+ return array();
+ }
+ $key_str.= ' ' . $temp;
}
$length = current(unpack('N', substr($key_blob, 0, 4)));
$key_type = substr($key_blob, 4, $length);
@@ -293,14 +326,24 @@ class Agent
if (strlen($this->socket_buffer) != fwrite($this->fsock, $this->socket_buffer)) {
user_error('Connection closed attempting to forward data to SSH agent');
+ return false;
}
$this->socket_buffer = '';
$this->expected_bytes = 0;
- $agent_reply_bytes = current(unpack('N', fread($this->fsock, 4)));
+ $temp = fread($this->fsock, 4);
+ if (strlen($temp) != 4) {
+ user_error('Connection closed while reading data response');
+ return false;
+ }
+ $agent_reply_bytes = current(unpack('N', $temp));
$agent_reply_data = fread($this->fsock, $agent_reply_bytes);
+ if (strlen($agent_reply_data) != $agent_reply_bytes) {
+ user_error('Connection closed while reading data response');
+ return false;
+ }
$agent_reply_data = current(unpack('a*', $agent_reply_data));
return pack('Na*', $agent_reply_bytes, $agent_reply_data);
diff --git a/vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php b/vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php
index b8cc6cded..68b6bfdfa 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php
@@ -32,6 +32,17 @@ use phpseclib\System\SSH\Agent;
*/
class Identity
{
+ /**@+
+ * Signature Flags
+ *
+ * See https://tools.ietf.org/html/draft-miller-ssh-agent-00#section-5.3
+ *
+ * @access private
+ */
+ const SSH_AGENT_RSA2_256 = 2;
+ const SSH_AGENT_RSA2_512 = 4;
+ /**#@-*/
+
/**
* Key Object
*
@@ -60,6 +71,16 @@ class Identity
var $fsock;
/**
+ * Signature flags
+ *
+ * @var int
+ * @access private
+ * @see self::sign()
+ * @see self::setHash()
+ */
+ var $flags = 0;
+
+ /**
* Default Constructor.
*
* @param resource $fsock
@@ -127,6 +148,31 @@ class Identity
}
/**
+ * Set Hash
+ *
+ * ssh-agent doesn't support using hashes for RSA other than SHA1
+ *
+ * @param string $hash
+ * @access public
+ */
+ function setHash($hash)
+ {
+ $this->flags = 0;
+ switch ($hash) {
+ case 'sha1':
+ break;
+ case 'sha256':
+ $this->flags = self::SSH_AGENT_RSA2_256;
+ break;
+ case 'sha512':
+ $this->flags = self::SSH_AGENT_RSA2_512;
+ break;
+ default:
+ user_error('The only supported hashes for RSA are sha1, sha256 and sha512');
+ }
+ }
+
+ /**
* Create a signature
*
* See "2.6.2 Protocol 2 private key signature request"
@@ -138,21 +184,58 @@ class Identity
function sign($message)
{
// the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE
- $packet = pack('CNa*Na*N', Agent::SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, 0);
+ $packet = pack('CNa*Na*N', Agent::SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, $this->flags);
$packet = pack('Na*', strlen($packet), $packet);
if (strlen($packet) != fputs($this->fsock, $packet)) {
user_error('Connection closed during signing');
+ return false;
}
- $length = current(unpack('N', fread($this->fsock, 4)));
+ $temp = fread($this->fsock, 4);
+ if (strlen($temp) != 4) {
+ user_error('Connection closed during signing');
+ return false;
+ }
+ $length = current(unpack('N', $temp));
$type = ord(fread($this->fsock, 1));
if ($type != Agent::SSH_AGENT_SIGN_RESPONSE) {
user_error('Unable to retrieve signature');
+ return false;
}
$signature_blob = fread($this->fsock, $length - 1);
- // the only other signature format defined - ssh-dss - is the same length as ssh-rsa
- // the + 12 is for the other various SSH added length fields
- return substr($signature_blob, strlen('ssh-rsa') + 12);
+ if (strlen($signature_blob) != $length - 1) {
+ user_error('Connection closed during signing');
+ return false;
+ }
+ $length = current(unpack('N', $this->_string_shift($signature_blob, 4)));
+ if ($length != strlen($signature_blob)) {
+ user_error('Malformed signature blob');
+ }
+ $length = current(unpack('N', $this->_string_shift($signature_blob, 4)));
+ if ($length > strlen($signature_blob) + 4) {
+ user_error('Malformed signature blob');
+ }
+ $type = $this->_string_shift($signature_blob, $length);
+ $this->_string_shift($signature_blob, 4);
+
+ return $signature_blob;
+ }
+
+ /**
+ * String Shift
+ *
+ * Inspired by array_shift
+ *
+ * @param string $string
+ * @param int $index
+ * @return string
+ * @access private
+ */
+ function _string_shift(&$string, $index = 1)
+ {
+ $substr = substr($string, 0, $index);
+ $string = substr($string, $index);
+ return $substr;
}
}
diff --git a/vendor/simplepie/simplepie/CHANGELOG.md b/vendor/simplepie/simplepie/CHANGELOG.md
new file mode 100644
index 000000000..60395f0f7
--- /dev/null
+++ b/vendor/simplepie/simplepie/CHANGELOG.md
@@ -0,0 +1,134 @@
+## 1.5.5 (May 1, 2020)
+
+* Ensure that feeds retrieved with `force_feed` do not share the same cache as those retrieved without. [#643](https://github.com/simplepie/simplepie/pull/643)
+* Removed references to removed PHP directives and some PHP < 5.6 checks. [#645](https://github.com/simplepie/simplepie/pull/645)
+* Corrected incorrect alumni name. [#638](https://github.com/simplepie/simplepie/pull/638)
+
+## 1.5.4 (December 17, 2019)
+
+* PHP 5.6 or newer is now required. [#625](https://github.com/simplepie/simplepie/pull/625)
+* Fixed invalid docblock parameter types [#633](https://github.com/simplepie/simplepie/pull/633)
+* Added support for German short forms for weekdays and months. [#632](https://github.com/simplepie/simplepie/pull/632)
+* PHP 7.4 support: Fixed instances of accessing array offset on null type values. [#628](https://github.com/simplepie/simplepie/pull/628)
+* Return an effective feed URL when asking for non-permanent `subscribe_url`. [#627](https://github.com/simplepie/simplepie/pull/627)
+
+## 1.5.3 (September 22, 2019)
+
+* Replaced `pow()` call with `**` operator (micro performance optimization). [#622](https://github.com/simplepie/simplepie/pull/622)
+* Match links containing `feed` in the Locator class. [#621](https://github.com/simplepie/simplepie/pull/621)
+* PHP 7.4 support: Ensure the proper argument order for `implode()` calls. [#617](https://github.com/simplepie/simplepie/pull/617)
+* Added support for Russian dates. [#607](https://github.com/simplepie/simplepie/pull/607)
+* Preemptively changed `is_writeable()` calls to `is_writable()` in case the former is deprecated in PHP. [#604](https://github.com/simplepie/simplepie/pull/604)
+
+## 1.5.2 (August 2, 2018)
+
+* Added support for PHPUnit 6. [#565](https://github.com/simplepie/simplepie/pull/565)
+* Added PHP module requirements to Composer. [#590](https://github.com/simplepie/simplepie/pull/590)
+* Added support for Redis password and database. [#589](https://github.com/simplepie/simplepie/pull/589)
+* Changed the spelling of `writeable` to `writable` within inline documentation. [#586](https://github.com/simplepie/simplepie/pull/586)
+* Fixed various issues in the test suite and Travis. [#576](https://github.com/simplepie/simplepie/pull/576)
+* Removed ambiguous tests failing on `usort()` in PHP 7. [#578](https://github.com/simplepie/simplepie/pull/578)
+* Simplified logic for some function returns. [#573](https://github.com/simplepie/simplepie/pull/573)
+* Fixed inline documentation for return value types for accuracy. [#570](https://github.com/simplepie/simplepie/pull/570)
+* Fixed Travis to run `composer install`. [#567](https://github.com/simplepie/simplepie/pull/567)
+* Removed unnecessary `else`s when a value has already been returned. [#566](https://github.com/simplepie/simplepie/pull/566)
+* Fixed a bug where URL fragments are included when `SimplePie_File` normalizes URLs when really old versions of cURL are used. [#564](https://github.com/simplepie/simplepie/pull/564)
+* Updated `SimplePie_Locator` to respect cURL options specified. [#561](https://github.com/simplepie/simplepie/pull/561)
+
+## 1.5.1 (November 17, 2017)
+
+* Fixed photos so they are not added if the URL is empty. [#530](https://github.com/simplepie/simplepie/pull/530)
+* Fixed issues with retrieving feeds from behind a proxy. [#512](https://github.com/simplepie/simplepie/pull/512)/[#548](https://github.com/simplepie/simplepie/pull/548)
+* Updated favicon URL in `get_favicon()`. [#525](https://github.com/simplepie/simplepie/pull/525)
+* Fixed inline documentation typo. [#540](https://github.com/simplepie/simplepie/pull/540)
+* Removed extra closing `<a>` tag. [#537](https://github.com/simplepie/simplepie/pull/537)
+* Removed and updated feed URLs in the demo. [#535](https://github.com/simplepie/simplepie/pull/535)
+* Improvements to microformat feed parsing. [#533](https://github.com/simplepie/simplepie/pull/533)
+* Switched from regex to xpath for microformats discovery. [#536](https://github.com/simplepie/simplepie/pull/536)
+* Update the registry if the Sanitize class has been changed. [#532](https://github.com/simplepie/simplepie/pull/532)
+* Changed the sanitization type for author and category back to text from HTML. [#531](https://github.com/simplepie/simplepie/pull/531)
+
+## 1.5 (April 17, 2017)
+
+* Introduced `SimplePie_Category->get_type()` for retrieving category type. [#492](https://github.com/simplepie/simplepie/pull/492)
+* Added `$enable_exceptions` to the class property declarations for `SimplePie` class. [#504](https://github.com/simplepie/simplepie/pull/504)
+* Titles are now parsed for ATOM10 enclosure links. [#507](https://github.com/simplepie/simplepie/pull/507)
+* `$item->get_id()` can now be forced to return the supplied ID instead of generating a new one. [#509](https://github.com/simplepie/simplepie/pull/509)
+
+## 1.4.3 (November 26, 2016)
+
+* Removed support for PHP 5.2. [#469](https://github.com/simplepie/simplepie/pull/469)
+* Added support for the PHP `UConverter` class. [#485](https://github.com/simplepie/simplepie/pull/485)
+* PHP 7.1 Support: Fixed PHP error when trying to use a non-numeric value in `round()`. [#458](https://github.com/simplepie/simplepie/pull/458)
+* PHP 7 Support: Fixed deprecated message for old style constructors. [#489](https://github.com/simplepie/simplepie/pull/489)
+* Fixed the error message shown when a feed has an empty body. [#487](https://github.com/simplepie/simplepie/pull/487)
+* Added an error message when the XML or PCRE PHP extensions are missing. [#468](https://github.com/simplepie/simplepie/pull/468)
+* Check the result of sanitize before returning in `get_content()` and `get_description()`. [#494](https://github.com/simplepie/simplepie/pull/494)
+* Use `saveHTML()` to fix issues with non UTF-8 characters. [#470](https://github.com/simplepie/simplepie/pull/470)
+* Stop passing compressed data through `trim()`. [#455](https://github.com/simplepie/simplepie/pull/455)
+* Refactored the UTF-8 conversion error message. [#467](https://github.com/simplepie/simplepie/pull/467)
+* Updated the readme file. [#486](https://github.com/simplepie/simplepie/pull/486)
+* Added command line support for compayibility test. [#481](https://github.com/simplepie/simplepie/pull/481)
+* Added PHP 7.1 to the testing matrix. [#462](https://github.com/simplepie/simplepie/pull/462)
+* Use the latest HHVM version in testing (3.15.2). [#480](https://github.com/simplepie/simplepie/pull/480)
+* Added PHPUnit as a `dev-dependency` in Composer. [#463](https://github.com/simplepie/simplepie/pull/463)
+* Added `mf2/mf2` as a suggestion in Composer for use with microformats. [#491](https://github.com/simplepie/simplepie/pull/491)
+* Fixed misspelled occurrences of "separated". [#459](https://github.com/simplepie/simplepie/pull/459)
+* Improvements to the compatibility test and error messages. [#488](https://github.com/simplepie/simplepie/pull/488)
+
+## 1.4.2 (June 14, 2016)
+
+* Fixed a bug with IRI parsing.
+* More cleanly separates discovery of microformats and parsing when php-mf2 is not present.
+
+## 1.4.1 (June 2, 2016)
+
+* Fixed inconsistent hash results in `SimplePie_Item->get_id()`.
+* Leading and trailing whitespace is now trimmed from XML feed content to prevent errors. [#445](https://github.com/simplepie/simplepie/pull/445)
+* Improved support for microformat feeds.
+
+## 1.4.0 (April 25, 2016)
+
+* Dropped support for PHP 5.2. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Serialized data is now used for hashing in `SimplePie_Item->get_id()`. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Added support for PHP 5.5 and 5.6. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Added the `add_attributes()` method to `SimplePie`. [#394](https://github.com/simplepie/simplepie/pull/394)
+* Added the `force_cache_fallback()` method to `SimplePie` to allow an expired cache to be used when a feed is unavailable. [#389](https://github.com/simplepie/simplepie/pull/389)
+* Added Memcached. [#386](https://github.com/simplepie/simplepie/pull/386)
+* Added `set_curl_options()` method to `SimplePie` to allow custom options. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Added Redis Caching. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Added the CEST timezone. [#380](https://github.com/simplepie/simplepie/pull/380)
+* Added support for HTTP 301 Moved Permanently. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Added support for `application/x-rss+xml` in `SimplePie_Locator`. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Added photo de-duping in microformats. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Added decoding for special characters in MAYBE_HTML. [#400](https://github.com/simplepie/simplepie/pull/400)
+* Added `SimplePie_Exception` for internally reporting errors. Also, use this to show an error when trying to load the class instead of causing a failure. [#241](https://github.com/simplepie/simplepie/pull/241)
+* Added sanitization of the `</html>` and `</body>` tags. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Added support for media thumbnails through `SimplePie_Item->get_thumbnail()`. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Added the `feed_url` to a returned error message. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Added cache purging after a specified period of time when using MySQL cache. [#329](https://github.com/simplepie/simplepie/pull/329)
+* Added backwards compatibility for removed `subscribe_*()` and `enable_xml_dump()` methods. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Re-added the deprecated `get/set_favicon()` methods for backwards compatibility.
+* Charsets are now compared without case sensitivity to avoid duplicates. [#352](https://github.com/simplepie/simplepie/pull/352)
+* Fixed encoding of ampersands in `SimplePie->subscribe_url()`. [#348](https://github.com/simplepie/simplepie/pull/348)
+* The feed URL is now updated based on the URL returned by cURL. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Explicitly use UTF-8 in `SimplePie_Misc->get_element()` and `Simple_ie_Misc->element_implode()`. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Improved support, feed and authorship discovery, and parsing for microformats. [#348](https://github.com/simplepie/simplepie/pull/348)
+* `rss:pubDate` is now used over `atom:updated` when determining the posting date. [#288](https://github.com/simplepie/simplepie/pull/288)
+* Simplified the use of `mtime()` and `touch()`. [#403](https://github.com/simplepie/simplepie/pull/403)
+* All items are now forced to have a timestamp. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Fixed typo in the date parser that incorrectly identified September as month 8. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Fixed backwards compatibility with cache subclasses. [#243](https://github.com/simplepie/simplepie/pull/243)
+* Fixed a bug where the updated date was not fetched correctly. [#239](https://github.com/simplepie/simplepie/pull/239)
+* Fixed the datatype for `items.data` to be more appropriate in when using MySQL cache. [#302](https://github.com/simplepie/simplepie/pull/302)
+* Fixed cURL not failing when the server returns an error. [#425](https://github.com/simplepie/simplepie/pull/425)
+* Fixed an error caused when trying to instantiate a `SimplePie_File` object with a bad URI. [#272](https://github.com/simplepie/simplepie/pull/272)
+* Fixed a PHP notice that occurs when a date starts with `(`. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Fixed uninitialized string offeset PHP notices. [#353](https://github.com/simplepie/simplepie/pull/353)
+* Fixed call to non-existent property in Memcache. [#311](https://github.com/simplepie/simplepie/pull/311)
+* Fixed a bug where MySQL statements were not being passed thorugh `prepare()`. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Fixed an instance where an error message in `SimplePie` was not being triggered correctly. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Fixed a bug with Russian feeds. [#348](https://github.com/simplepie/simplepie/pull/348)
+* Fixed an issue with memory leaks. [#287](https://github.com/simplepie/simplepie/pull/287)
+* Fixed use of `DOMElement` as array. [#315](https://github.com/simplepie/simplepie/pull/315)
+* Improved the error message when a feed cannot be found. [#348](https://github.com/simplepie/simplepie/pull/348)
diff --git a/vendor/simplepie/simplepie/LICENSE.txt b/vendor/simplepie/simplepie/LICENSE.txt
index a822a4bd9..6503e83c1 100644
--- a/vendor/simplepie/simplepie/LICENSE.txt
+++ b/vendor/simplepie/simplepie/LICENSE.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2007, Ryan Parman and Geoffrey Sneddon.
+Copyright (c) 2004-2007, Ryan Parman and Sam Sneddon.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are
diff --git a/vendor/simplepie/simplepie/README.markdown b/vendor/simplepie/simplepie/README.markdown
index c346204d0..9fcc12937 100644
--- a/vendor/simplepie/simplepie/README.markdown
+++ b/vendor/simplepie/simplepie/README.markdown
@@ -11,9 +11,7 @@ compatibility and standards compliance][what_is].
Requirements
------------
-* PHP 5.3.0+ (5.3.6+ recommended since SimplePie 1.4.2)
- * Support for PHP 5.2 stopped in branch `one-dot-three`
- * Support for PHP 4 stopped in branch `one-dot-two`
+* PHP 5.6+ (Required since SimplePie 1.5.3)
* libxml2 (certain 2.7.x releases are too buggy for words, and will crash)
* One of iconv, mbstring or intl extensions
* cURL or fsockopen()
@@ -89,14 +87,14 @@ Authors and contributors
### Alumni
* [Ryan McCue][] (developer, support)
* [Ryan Parman][] (Creator, developer, evangelism, support)
-* [Geoffrey Sneddon][] (Lead developer)
+* [Sam Sneddon][] (Lead developer)
* [Michael Shipley][] (Submitter of patches, support)
* [Steve Minutillo][] (Submitter of patches)
[Malcolm Blaney]: https://unicyclic.com/mal
[Ryan McCue]: http://ryanmccue.info
[Ryan Parman]: http://ryanparman.com
-[Geoffrey Sneddon]: http://gsnedders.com
+[Sam Sneddon]: https://gsnedders.com
[Michael Shipley]: http://michaelpshipley.com
[Steve Minutillo]: http://minutillo.com/steve/
diff --git a/vendor/simplepie/simplepie/autoloader.php b/vendor/simplepie/simplepie/autoloader.php
index fd7690da2..e42f07b3a 100644
--- a/vendor/simplepie/simplepie/autoloader.php
+++ b/vendor/simplepie/simplepie/autoloader.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
diff --git a/vendor/simplepie/simplepie/composer.json b/vendor/simplepie/simplepie/composer.json
index b5965b26f..d76ee7d4d 100644
--- a/vendor/simplepie/simplepie/composer.json
+++ b/vendor/simplepie/simplepie/composer.json
@@ -12,8 +12,8 @@
"role": "Creator, alumnus developer"
},
{
- "name": "Geoffrey Sneddon",
- "homepage": "http://gsnedders.com/",
+ "name": "Sam Sneddon",
+ "homepage": "https://gsnedders.com/",
"role": "Alumnus developer"
},
{
@@ -24,17 +24,30 @@
}
],
"require": {
- "php": ">=5.3.0"
+ "php": ">=5.6.0",
+ "ext-pcre": "*",
+ "ext-xml": "*",
+ "ext-xmlreader": "*"
},
"require-dev": {
- "phpunit/phpunit": "~4 || ~5"
+ "phpunit/phpunit": "~5.4.3 || ~6.5"
},
"suggest": {
+ "ext-curl": "",
+ "ext-iconv": "",
+ "ext-intl": "",
+ "ext-mbstring": "",
"mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
},
"autoload": {
"psr-0": {
"SimplePie": "library"
}
- }
+ },
+ "config": {
+ "bin-dir": "bin"
+ },
+ "scripts": {
+ "test": "phpunit"
+ }
}
diff --git a/vendor/simplepie/simplepie/idn/idna_convert.class.php b/vendor/simplepie/simplepie/idn/idna_convert.class.php
index eb9d5f516..ec137dc4c 100644
--- a/vendor/simplepie/simplepie/idn/idna_convert.class.php
+++ b/vendor/simplepie/simplepie/idn/idna_convert.class.php
@@ -306,20 +306,20 @@ class idna_convert
if ($this->_strict_mode) {
$this->_error('Neither email addresses nor URLs are allowed in strict mode.');
return false;
- } else {
- // Skip first char
- if ($k) {
- $encoded = '';
- $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin)));
- if ($encoded) {
- $output .= $encoded;
- } else {
- $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin)));
- }
- $output .= chr($decoded[$k]);
+ }
+
+ // Skip first char
+ if ($k) {
+ $encoded = '';
+ $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin)));
+ if ($encoded) {
+ $output .= $encoded;
+ } else {
+ $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin)));
}
- $last_begin = $k + 1;
+ $output .= chr($decoded[$k]);
}
+ $last_begin = $k + 1;
}
}
// Catch the rest of the string
@@ -333,13 +333,13 @@ class idna_convert
$output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
}
return $output;
- } else {
- if ($output = $this->_encode($decoded)) {
- return $output;
- } else {
- return $this->_ucs4_to_utf8($decoded);
- }
}
+
+ if ($output = $this->_encode($decoded)) {
+ return $output;
+ }
+
+ return $this->_ucs4_to_utf8($decoded);
}
/**
diff --git a/vendor/simplepie/simplepie/library/SimplePie.php b/vendor/simplepie/simplepie/library/SimplePie.php
index 34b6ca0c9..5ce5f82f3 100755
--- a/vendor/simplepie/simplepie/library/SimplePie.php
+++ b/vendor/simplepie/simplepie/library/SimplePie.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2017, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2017, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,10 +33,10 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @version 1.5.1
- * @copyright 2004-2017 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @version 1.5.5
+ * @copyright 2004-2017 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -50,7 +50,7 @@ define('SIMPLEPIE_NAME', 'SimplePie');
/**
* SimplePie Version
*/
-define('SIMPLEPIE_VERSION', '1.5.1');
+define('SIMPLEPIE_VERSION', '1.5.5');
/**
* SimplePie Build
@@ -648,7 +648,7 @@ class SimplePie
* @access private
*/
public $enable_exceptions = false;
-
+
/**
* The SimplePie class contains feed level data and options
*
@@ -665,9 +665,9 @@ class SimplePie
*/
public function __construct()
{
- if (version_compare(PHP_VERSION, '5.3', '<'))
+ if (version_compare(PHP_VERSION, '5.6', '<'))
{
- trigger_error('Please upgrade to PHP 5.3 or newer.');
+ trigger_error('Please upgrade to PHP 5.6 or newer.');
die();
}
@@ -706,7 +706,7 @@ class SimplePie
*/
public function __destruct()
{
- if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
+ if (!gc_enabled())
{
if (!empty($this->data['items']))
{
@@ -1251,8 +1251,8 @@ class SimplePie
/**
* Set the handler to enable the display of cached images.
*
- * @param str $page Web-accessible path to the handler_image.php file.
- * @param str $qs The query string that the value should be passed to.
+ * @param string $page Web-accessible path to the handler_image.php file.
+ * @param string $qs The query string that the value should be passed to.
*/
public function set_image_handler($page = false, $qs = 'i')
{
@@ -1373,7 +1373,8 @@ class SimplePie
// Decide whether to enable caching
if ($this->cache && $parsed_feed_url['scheme'] !== '')
{
- $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'));
+ $url = $this->feed_url . ($this->force_feed ? '#force_feed' : '');
+ $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $url), 'spc'));
}
// Fetch the data via SimplePie_File into $this->raw_data
@@ -1387,7 +1388,7 @@ class SimplePie
list($headers, $sniffed) = $fetched;
}
-
+
// Empty response check
if(empty($this->raw_data)){
$this->error = "A feed could not be found at `$this->feed_url`. Empty body.";
@@ -1471,7 +1472,7 @@ class SimplePie
// Cache the file if caching is enabled
if ($cache && !$cache->save($this))
{
- trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
+ trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
}
return true;
}
@@ -1640,7 +1641,7 @@ class SimplePie
if (!$this->force_feed)
{
// Check if the supplied URL is a feed, if it isn't, look for it.
- $locate = $this->registry->create('Locator', array(&$file, $this->timeout, $this->useragent, $this->max_checked_feeds));
+ $locate = $this->registry->create('Locator', array(&$file, $this->timeout, $this->useragent, $this->max_checked_feeds, $this->force_fsockopen, $this->curl_options));
if (!$locate->is_feed($file))
{
@@ -1708,12 +1709,12 @@ class SimplePie
$this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
if (!$cache->save($this))
{
- trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
+ trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
}
$cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'));
}
- $this->feed_url = $file->url;
}
+ $this->feed_url = $file->url;
$locate = null;
}
@@ -1904,14 +1905,15 @@ class SimplePie
/**
* Get the URL for the feed
- *
+ *
* When the 'permanent' mode is enabled, returns the original feed URL,
* except in the case of an `HTTP 301 Moved Permanently` status response,
* in which case the location of the first redirection is returned.
*
* When the 'permanent' mode is disabled (default),
* may or may not be different from the URL passed to {@see set_feed_url()},
- * depending on whether auto-discovery was used.
+ * depending on whether auto-discovery was used, and whether there were
+ * any redirects along the way.
*
* @since Preview Release (previously called `get_feed_url()` since SimplePie 0.8.)
* @todo Support <itunes:new-feed-url>
@@ -2138,10 +2140,8 @@ class SimplePie
{
return $this->get_link();
}
- else
- {
- return $this->subscribe_url();
- }
+
+ return $this->subscribe_url();
}
/**
@@ -2211,10 +2211,8 @@ class SimplePie
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2231,10 +2229,8 @@ class SimplePie
{
return $categories[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2296,10 +2292,8 @@ class SimplePie
{
return array_unique($categories);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2316,10 +2310,8 @@ class SimplePie
{
return $authors[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2394,10 +2386,8 @@ class SimplePie
{
return array_unique($authors);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2414,10 +2404,8 @@ class SimplePie
{
return $contributors[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2480,10 +2468,8 @@ class SimplePie
{
return array_unique($contributors);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2501,10 +2487,8 @@ class SimplePie
{
return $links[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2606,10 +2590,8 @@ class SimplePie
{
return $this->data['links'][$rel];
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_all_discovered_feeds()
@@ -2664,10 +2646,8 @@ class SimplePie
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2700,10 +2680,8 @@ class SimplePie
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2744,10 +2722,8 @@ class SimplePie
{
return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2773,10 +2749,8 @@ class SimplePie
{
return (float) $match[1];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2805,10 +2779,8 @@ class SimplePie
{
return (float) $match[2];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2842,10 +2814,8 @@ class SimplePie
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2885,10 +2855,8 @@ class SimplePie
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
}
- else
- {
- return null;
- }
+
+ return null;
}
@@ -2917,10 +2885,8 @@ class SimplePie
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2943,10 +2909,8 @@ class SimplePie
{
return 88.0;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2969,10 +2933,8 @@ class SimplePie
{
return 31.0;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2992,10 +2954,8 @@ class SimplePie
{
return $qty;
}
- else
- {
- return ($qty > $max) ? $max : $qty;
- }
+
+ return ($qty > $max) ? $max : $qty;
}
/**
@@ -3017,10 +2977,8 @@ class SimplePie
{
return $items[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -3115,10 +3073,8 @@ class SimplePie
{
return array_slice($items, $start);
}
- else
- {
- return array_slice($items, $start, $end);
- }
+
+ return array_slice($items, $start, $end);
}
/**
@@ -3241,16 +3197,12 @@ class SimplePie
{
return array_slice($items, $start);
}
- else
- {
- return array_slice($items, $start, $end);
- }
- }
- else
- {
- trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING);
- return array();
+
+ return array_slice($items, $start, $end);
}
+
+ trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING);
+ return array();
}
/**
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Author.php b/vendor/simplepie/simplepie/library/SimplePie/Author.php
index e6768ff29..563932f4c 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Author.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Author.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -113,10 +113,8 @@ class SimplePie_Author
{
return $this->name;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -130,10 +128,8 @@ class SimplePie_Author
{
return $this->link;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -147,10 +143,7 @@ class SimplePie_Author
{
return $this->email;
}
- else
- {
- return null;
- }
+
+ return null;
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache.php b/vendor/simplepie/simplepie/library/SimplePie/Cache.php
index d98cc6511..9c5577d95 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Cache.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/Base.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/Base.php
index 333fb05cf..522ff7e10 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Cache/Base.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/Base.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/DB.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/DB.php
index 7e8f77532..74d57b8da 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Cache/DB.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/DB.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/File.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/File.php
index 6ba6c5f6e..03758e923 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Cache/File.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/File.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -101,7 +101,7 @@ class SimplePie_Cache_File implements SimplePie_Cache_Base
*/
public function save($data)
{
- if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))
+ if (file_exists($this->name) && is_writable($this->name) || file_exists($this->location) && is_writable($this->location))
{
if ($data instanceof SimplePie)
{
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcache.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcache.php
index 5190eef93..caf785275 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcache.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcache.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcached.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcached.php
index 1f73b3890..0b40d87c8 100755
--- a/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcached.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/Memcached.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/MySQL.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/MySQL.php
index 8686b6c67..a684eb833 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Cache/MySQL.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/MySQL.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -96,7 +96,7 @@ class SimplePie_Cache_MySQL extends SimplePie_Cache_DB
'cache_purge_time' => 2592000
),
);
-
+
$this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
// Path is prefixed with a "/"
@@ -395,10 +395,8 @@ class SimplePie_Cache_MySQL extends SimplePie_Cache_DB
{
return $time;
}
- else
- {
- return false;
- }
+
+ return false;
}
/**
@@ -416,14 +414,8 @@ class SimplePie_Cache_MySQL extends SimplePie_Cache_DB
$query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `mtime` = :time WHERE `id` = :id');
$query->bindValue(':time', time());
$query->bindValue(':id', $this->id);
- if ($query->execute() && $query->rowCount() > 0)
- {
- return true;
- }
- else
- {
- return false;
- }
+
+ return $query->execute() && $query->rowCount() > 0;
}
/**
@@ -442,13 +434,7 @@ class SimplePie_Cache_MySQL extends SimplePie_Cache_DB
$query->bindValue(':id', $this->id);
$query2 = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :id');
$query2->bindValue(':id', $this->id);
- if ($query->execute() && $query2->execute())
- {
- return true;
- }
- else
- {
- return false;
- }
+
+ return $query->execute() && $query2->execute();
}
}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Cache/Redis.php b/vendor/simplepie/simplepie/library/SimplePie/Cache/Redis.php
index 04d72c79a..dbc88e829 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Cache/Redis.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Cache/Redis.php
@@ -65,6 +65,12 @@ class SimplePie_Cache_Redis implements SimplePie_Cache_Base {
$parsed = SimplePie_Cache::parse_URL($location);
$redis = new Redis();
$redis->connect($parsed['host'], $parsed['port']);
+ if (isset($parsed['pass'])) {
+ $redis->auth($parsed['pass']);
+ }
+ if (isset($parsed['path'])) {
+ $redis->select((int)substr($parsed['path'], 1));
+ }
$this->cache = $redis;
if (!is_null($options) && is_array($options)) {
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Caption.php b/vendor/simplepie/simplepie/library/SimplePie/Caption.php
index abf07de1b..3d7bfdd71 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Caption.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Caption.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -131,10 +131,8 @@ class SimplePie_Caption
{
return $this->endTime;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -149,10 +147,8 @@ class SimplePie_Caption
{
return $this->lang;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -166,10 +162,8 @@ class SimplePie_Caption
{
return $this->startTime;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -183,10 +177,8 @@ class SimplePie_Caption
{
return $this->text;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -200,10 +192,7 @@ class SimplePie_Caption
{
return $this->type;
}
- else
- {
- return null;
- }
+
+ return null;
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Category.php b/vendor/simplepie/simplepie/library/SimplePie/Category.php
index df0f13f9a..e4dabed8b 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Category.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Category.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php b/vendor/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php
index ff35de614..39972b5a7 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Content/Type/Sniffer.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -120,24 +120,18 @@ class SimplePie_Content_Type_Sniffer
{
return $return;
}
- else
- {
- return $official;
- }
+
+ return $official;
}
elseif ($official === 'text/html')
{
return $this->feed_or_html();
}
- else
- {
- return $official;
- }
- }
- else
- {
- return $this->unknown();
+
+ return $official;
}
+
+ return $this->unknown();
}
/**
@@ -158,10 +152,8 @@ class SimplePie_Content_Type_Sniffer
{
return 'application/octect-stream';
}
- else
- {
- return 'text/plain';
- }
+
+ return 'text/plain';
}
/**
@@ -207,10 +199,8 @@ class SimplePie_Content_Type_Sniffer
{
return 'image/vnd.microsoft.icon';
}
- else
- {
- return $this->text_or_binary();
- }
+
+ return $this->text_or_binary();
}
/**
@@ -241,10 +231,8 @@ class SimplePie_Content_Type_Sniffer
{
return 'image/vnd.microsoft.icon';
}
- else
- {
- return false;
- }
+
+ return false;
}
/**
@@ -328,4 +316,3 @@ class SimplePie_Content_Type_Sniffer
return 'text/html';
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Copyright.php b/vendor/simplepie/simplepie/library/SimplePie/Copyright.php
index 3f3d07d3b..92f9b0947 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Copyright.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Copyright.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -103,10 +103,8 @@ class SimplePie_Copyright
{
return $this->url;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -120,10 +118,7 @@ class SimplePie_Copyright
{
return $this->label;
}
- else
- {
- return null;
- }
+
+ return null;
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Core.php b/vendor/simplepie/simplepie/library/SimplePie/Core.php
index c856ba361..ffcca46f5 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Core.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Core.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Credit.php b/vendor/simplepie/simplepie/library/SimplePie/Credit.php
index 9bad9ef34..d6ff07eba 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Credit.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Credit.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -112,10 +112,8 @@ class SimplePie_Credit
{
return $this->role;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -129,10 +127,8 @@ class SimplePie_Credit
{
return $this->scheme;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -146,10 +142,7 @@ class SimplePie_Credit
{
return $this->name;
}
- else
- {
- return null;
- }
+
+ return null;
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php b/vendor/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php
index de3f2cb53..a43c374b3 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Decode/HTML/Entities.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -117,10 +117,8 @@ class SimplePie_Decode_HTML_Entities
$this->consumed .= $this->data[$this->position];
return $this->data[$this->position++];
}
- else
- {
- return false;
- }
+
+ return false;
}
/**
@@ -139,10 +137,8 @@ class SimplePie_Decode_HTML_Entities
$this->position += $len;
return $data;
}
- else
- {
- return false;
- }
+
+ return false;
}
/**
@@ -612,4 +608,3 @@ class SimplePie_Decode_HTML_Entities
}
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Enclosure.php b/vendor/simplepie/simplepie/library/SimplePie/Enclosure.php
index 15060e193..32216d848 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Enclosure.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Enclosure.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -282,10 +282,8 @@ class SimplePie_Enclosure
{
return $this->bitrate;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -301,10 +299,8 @@ class SimplePie_Enclosure
{
return $captions[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -318,10 +314,8 @@ class SimplePie_Enclosure
{
return $this->captions;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -337,10 +331,8 @@ class SimplePie_Enclosure
{
return $categories[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -354,10 +346,8 @@ class SimplePie_Enclosure
{
return $this->categories;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -371,10 +361,8 @@ class SimplePie_Enclosure
{
return $this->channels;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -388,10 +376,8 @@ class SimplePie_Enclosure
{
return $this->copyright;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -407,10 +393,8 @@ class SimplePie_Enclosure
{
return $credits[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -424,10 +408,8 @@ class SimplePie_Enclosure
{
return $this->credits;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -441,10 +423,8 @@ class SimplePie_Enclosure
{
return $this->description;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -462,15 +442,11 @@ class SimplePie_Enclosure
$time = SimplePie_Misc::time_hms($this->duration);
return $time;
}
- else
- {
- return $this->duration;
- }
- }
- else
- {
- return null;
+
+ return $this->duration;
}
+
+ return null;
}
/**
@@ -484,10 +460,8 @@ class SimplePie_Enclosure
{
return $this->expression;
}
- else
- {
- return 'full';
- }
+
+ return 'full';
}
/**
@@ -519,10 +493,8 @@ class SimplePie_Enclosure
{
return $this->framerate;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -549,10 +521,8 @@ class SimplePie_Enclosure
{
return $hashes[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -566,10 +536,8 @@ class SimplePie_Enclosure
{
return $this->hashes;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -583,10 +551,8 @@ class SimplePie_Enclosure
{
return $this->height;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -601,10 +567,8 @@ class SimplePie_Enclosure
{
return $this->lang;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -620,10 +584,8 @@ class SimplePie_Enclosure
{
return $keywords[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -637,10 +599,8 @@ class SimplePie_Enclosure
{
return $this->keywords;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -654,10 +614,8 @@ class SimplePie_Enclosure
{
return $this->length;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -671,10 +629,8 @@ class SimplePie_Enclosure
{
return urldecode($this->link);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -689,10 +645,8 @@ class SimplePie_Enclosure
{
return $this->medium;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -707,10 +661,8 @@ class SimplePie_Enclosure
{
return $this->player;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -726,10 +678,8 @@ class SimplePie_Enclosure
{
return $ratings[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -743,10 +693,8 @@ class SimplePie_Enclosure
{
return $this->ratings;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -762,10 +710,8 @@ class SimplePie_Enclosure
{
return $restrictions[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -779,10 +725,8 @@ class SimplePie_Enclosure
{
return $this->restrictions;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -796,10 +740,8 @@ class SimplePie_Enclosure
{
return $this->samplingrate;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -814,10 +756,8 @@ class SimplePie_Enclosure
{
return round($length/1048576, 2);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -833,10 +773,8 @@ class SimplePie_Enclosure
{
return $thumbnails[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -850,10 +788,8 @@ class SimplePie_Enclosure
{
return $this->thumbnails;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -867,10 +803,8 @@ class SimplePie_Enclosure
{
return $this->title;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -885,10 +819,8 @@ class SimplePie_Enclosure
{
return $this->type;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -902,10 +834,8 @@ class SimplePie_Enclosure
{
return $this->width;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -1365,15 +1295,10 @@ class SimplePie_Enclosure
{
return 'mp3';
}
- else
- {
- return null;
- }
- }
- else
- {
- return $type;
+
+ return null;
}
+
+ return $type;
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Exception.php b/vendor/simplepie/simplepie/library/SimplePie/Exception.php
index 53c015e77..7a04c560c 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Exception.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Exception.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
diff --git a/vendor/simplepie/simplepie/library/SimplePie/File.php b/vendor/simplepie/simplepie/library/SimplePie/File.php
index 2bb0a3b44..82db47ec9 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/File.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/File.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -71,7 +71,7 @@ class SimplePie_File
{
$idn = new idna_convert();
$parsed = SimplePie_Misc::parse_url($url);
- $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
+ $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], NULL);
}
$this->url = $url;
$this->permanent_url = $url;
@@ -109,7 +109,7 @@ class SimplePie_File
curl_setopt($fp, CURLOPT_REFERER, $url);
curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
- if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))
+ if (!ini_get('open_basedir') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))
{
curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
diff --git a/vendor/simplepie/simplepie/library/SimplePie/HTTP/Parser.php b/vendor/simplepie/simplepie/library/SimplePie/HTTP/Parser.php
index e982c206f..1dbe06c3e 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/HTTP/Parser.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/HTTP/Parser.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -155,15 +155,13 @@ class SimplePie_HTTP_Parser
{
return true;
}
- else
- {
- $this->http_version = '';
- $this->status_code = '';
- $this->reason = '';
- $this->headers = array();
- $this->body = '';
- return false;
- }
+
+ $this->http_version = '';
+ $this->status_code = '';
+ $this->reason = '';
+ $this->headers = array();
+ $this->body = '';
+ return false;
}
/**
diff --git a/vendor/simplepie/simplepie/library/SimplePie/IRI.php b/vendor/simplepie/simplepie/library/SimplePie/IRI.php
index 2b3fbaf07..a02de682c 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/IRI.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/IRI.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -46,10 +46,10 @@
*
* @package SimplePie
* @subpackage HTTP
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Steve Minutillo
* @author Ryan McCue
- * @copyright 2007-2012 Geoffrey Sneddon, Steve Minutillo, Ryan McCue
+ * @copyright 2007-2012 Sam Sneddon, Steve Minutillo, Ryan McCue
* @license http://www.opensource.org/licenses/bsd-license.php
*/
class SimplePie_IRI
@@ -211,10 +211,8 @@ class SimplePie_IRI
{
return $this->normalization[$this->scheme][$name];
}
- else
- {
- return $return;
- }
+
+ return $return;
}
/**
@@ -225,14 +223,7 @@ class SimplePie_IRI
*/
public function __isset($name)
{
- if (method_exists($this, 'get_' . $name) || isset($this->$name))
- {
- return true;
- }
- else
- {
- return false;
- }
+ return method_exists($this, 'get_' . $name) || isset($this->$name);
}
/**
@@ -356,10 +347,8 @@ class SimplePie_IRI
$target->scheme_normalization();
return $target;
}
- else
- {
- return false;
- }
+
+ return false;
}
}
@@ -396,11 +385,9 @@ class SimplePie_IRI
}
return $match;
}
- else
- {
- // This can occur when a paragraph is accidentally parsed as a URI
- return false;
- }
+
+ // This can occur when a paragraph is accidentally parsed as a URI
+ return false;
}
/**
@@ -804,7 +791,7 @@ class SimplePie_IRI
public function set_iri($iri, $clear_cache = false)
{
static $cache;
- if ($clear_cache)
+ if ($clear_cache)
{
$cache = null;
return;
@@ -830,30 +817,28 @@ class SimplePie_IRI
$return) = $cache[$iri];
return $return;
}
- else
- {
- $parsed = $this->parse_iri((string) $iri);
- if (!$parsed)
- {
- return false;
- }
- $return = $this->set_scheme($parsed['scheme'])
- && $this->set_authority($parsed['authority'])
- && $this->set_path($parsed['path'])
- && $this->set_query($parsed['query'])
- && $this->set_fragment($parsed['fragment']);
-
- $cache[$iri] = array($this->scheme,
- $this->iuserinfo,
- $this->ihost,
- $this->port,
- $this->ipath,
- $this->iquery,
- $this->ifragment,
- $return);
- return $return;
+ $parsed = $this->parse_iri((string) $iri);
+ if (!$parsed)
+ {
+ return false;
}
+
+ $return = $this->set_scheme($parsed['scheme'])
+ && $this->set_authority($parsed['authority'])
+ && $this->set_path($parsed['path'])
+ && $this->set_query($parsed['query'])
+ && $this->set_fragment($parsed['fragment']);
+
+ $cache[$iri] = array($this->scheme,
+ $this->iuserinfo,
+ $this->ihost,
+ $this->port,
+ $this->ipath,
+ $this->iquery,
+ $this->ifragment,
+ $return);
+ return $return;
}
/**
@@ -915,42 +900,40 @@ class SimplePie_IRI
return $return;
}
+
+ $remaining = $authority;
+ if (($iuserinfo_end = strrpos($remaining, '@')) !== false)
+ {
+ $iuserinfo = substr($remaining, 0, $iuserinfo_end);
+ $remaining = substr($remaining, $iuserinfo_end + 1);
+ }
else
{
- $remaining = $authority;
- if (($iuserinfo_end = strrpos($remaining, '@')) !== false)
- {
- $iuserinfo = substr($remaining, 0, $iuserinfo_end);
- $remaining = substr($remaining, $iuserinfo_end + 1);
- }
- else
- {
- $iuserinfo = null;
- }
- if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false)
- {
- if (($port = substr($remaining, $port_start + 1)) === false)
- {
- $port = null;
- }
- $remaining = substr($remaining, 0, $port_start);
- }
- else
+ $iuserinfo = null;
+ }
+ if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false)
+ {
+ if (($port = substr($remaining, $port_start + 1)) === false)
{
$port = null;
}
+ $remaining = substr($remaining, 0, $port_start);
+ }
+ else
+ {
+ $port = null;
+ }
- $return = $this->set_userinfo($iuserinfo) &&
- $this->set_host($remaining) &&
- $this->set_port($port);
+ $return = $this->set_userinfo($iuserinfo) &&
+ $this->set_host($remaining) &&
+ $this->set_port($port);
- $cache[$authority] = array($this->iuserinfo,
- $this->ihost,
- $this->port,
- $return);
+ $cache[$authority] = array($this->iuserinfo,
+ $this->ihost,
+ $this->port,
+ $return);
- return $return;
- }
+ return $return;
}
/**
@@ -1050,11 +1033,9 @@ class SimplePie_IRI
$this->scheme_normalization();
return true;
}
- else
- {
- $this->port = null;
- return false;
- }
+
+ $this->port = null;
+ return false;
}
/**
@@ -1066,7 +1047,7 @@ class SimplePie_IRI
public function set_path($ipath, $clear_cache = false)
{
static $cache;
- if ($clear_cache)
+ if ($clear_cache)
{
$cache = null;
return;
@@ -1185,7 +1166,7 @@ class SimplePie_IRI
{
$iri .= $this->ipath;
}
- elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '')
+ elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '')
{
$iri .= $this->normalization[$this->scheme]['ipath'];
}
@@ -1229,16 +1210,14 @@ class SimplePie_IRI
{
$iauthority .= $this->ihost;
}
- if ($this->port !== null)
+ if ($this->port !== null && $this->port !== 0)
{
$iauthority .= ':' . $this->port;
}
return $iauthority;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -1251,7 +1230,7 @@ class SimplePie_IRI
$iauthority = $this->get_iauthority();
if (is_string($iauthority))
return $this->to_uri($iauthority);
- else
- return $iauthority;
+
+ return $iauthority;
}
}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Item.php b/vendor/simplepie/simplepie/library/SimplePie/Item.php
index 2083e7a92..5be6b1994 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Item.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Item.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -121,7 +121,7 @@ class SimplePie_Item
*/
public function __destruct()
{
- if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
+ if (!gc_enabled())
{
unset($this->feed);
}
@@ -147,10 +147,8 @@ class SimplePie_Item
{
return $this->data['child'][$namespace][$tag];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -366,10 +364,8 @@ class SimplePie_Item
{
return $this->get_content(true);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -407,18 +403,16 @@ class SimplePie_Item
{
return $this->get_description(true);
}
- else
- {
- return null;
- }
+
+ return null;
}
-
+
/**
* Get the media:thumbnail of the item
*
* Uses `<media:thumbnail>`
*
- *
+ *
* @return array|null
*/
public function get_thumbnail()
@@ -435,7 +429,7 @@ class SimplePie_Item
}
}
return $this->data['thumbnail'];
- }
+ }
/**
* Get a category for the item
@@ -451,10 +445,8 @@ class SimplePie_Item
{
return $categories[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -519,10 +511,8 @@ class SimplePie_Item
{
return array_unique($categories);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -539,10 +529,8 @@ class SimplePie_Item
{
return $authors[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -559,10 +547,8 @@ class SimplePie_Item
{
return $contributors[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -571,7 +557,7 @@ class SimplePie_Item
* Uses `<atom:contributor>`
*
* @since 1.1
- * @return array|null List of {@see SimplePie_Author} objects
+ * @return SimplePie_Author[]|null List of {@see SimplePie_Author} objects
*/
public function get_contributors()
{
@@ -625,10 +611,8 @@ class SimplePie_Item
{
return array_unique($contributors);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -637,7 +621,7 @@ class SimplePie_Item
* Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>`
*
* @since Beta 2
- * @return array|null List of {@see SimplePie_Author} objects
+ * @return SimplePie_Author[]|null List of {@see SimplePie_Author} objects
*/
public function get_authors()
{
@@ -715,10 +699,8 @@ class SimplePie_Item
{
return $authors;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -743,10 +725,8 @@ class SimplePie_Item
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -825,10 +805,8 @@ class SimplePie_Item
return date($date_format, $this->data['date']['parsed']);
}
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -876,10 +854,8 @@ class SimplePie_Item
return date($date_format, $this->data['updated']['parsed']);
}
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -905,10 +881,8 @@ class SimplePie_Item
{
return strftime($date_format, $date);
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -969,10 +943,8 @@ class SimplePie_Item
{
return $enclosure->get_link();
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -986,14 +958,12 @@ class SimplePie_Item
public function get_link($key = 0, $rel = 'alternate')
{
$links = $this->get_links($rel);
- if ($links[$key] !== null)
+ if ($links && $links[$key] !== null)
{
return $links[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -1073,10 +1043,8 @@ class SimplePie_Item
{
return $this->data['links'][$rel];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -1096,10 +1064,8 @@ class SimplePie_Item
{
return $enclosures[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2922,10 +2888,8 @@ class SimplePie_Item
{
return $this->data['enclosures'];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2950,10 +2914,8 @@ class SimplePie_Item
{
return (float) $match[1];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -2982,10 +2944,8 @@ class SimplePie_Item
{
return (float) $match[2];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -3000,10 +2960,7 @@ class SimplePie_Item
{
return $this->registry->create('Source', array($this, $return[0]));
}
- else
- {
- return null;
- }
+
+ return null;
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Locator.php b/vendor/simplepie/simplepie/library/SimplePie/Locator.php
index bc314c2cd..bf7c21a6f 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Locator.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Locator.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -62,14 +62,18 @@ class SimplePie_Locator
var $base_location = 0;
var $checked_feeds = 0;
var $max_checked_feeds = 10;
+ var $force_fsockopen = false;
+ var $curl_options = array();
protected $registry;
- public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10)
+ public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10, $force_fsockopen = false, $curl_options = array())
{
$this->file = $file;
$this->useragent = $useragent;
$this->timeout = $timeout;
$this->max_checked_feeds = $max_checked_feeds;
+ $this->force_fsockopen = $force_fsockopen;
+ $this->curl_options = $curl_options;
if (class_exists('DOMDocument'))
{
@@ -154,14 +158,8 @@ class SimplePie_Locator
{
$mime_types[] = 'text/html';
}
- if (in_array($sniffed, $mime_types))
- {
- return true;
- }
- else
- {
- return false;
- }
+
+ return in_array($sniffed, $mime_types);
}
elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL)
{
@@ -210,10 +208,8 @@ class SimplePie_Locator
{
return array_values($feeds);
}
- else
- {
- return null;
- }
+
+ return null;
}
protected function search_elements_by_tag($name, &$done, $feeds)
@@ -254,7 +250,7 @@ class SimplePie_Locator
$headers = array(
'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
);
- $feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent));
+ $feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed, true))
{
$feeds[$href] = $feed;
@@ -384,7 +380,7 @@ class SimplePie_Locator
$headers = array(
'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
);
- $feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent));
+ $feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
{
return array($feed);
@@ -406,13 +402,13 @@ class SimplePie_Locator
{
break;
}
- if (preg_match('/(rss|rdf|atom|xml)/i', $value))
+ if (preg_match('/(feed|rss|rdf|atom|xml)/i', $value))
{
$this->checked_feeds++;
$headers = array(
'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
);
- $feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent));
+ $feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen, $this->curl_options));
if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
{
return array($feed);
@@ -426,4 +422,3 @@ class SimplePie_Locator
return null;
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Misc.php b/vendor/simplepie/simplepie/library/SimplePie/Misc.php
index 2e3107eb4..48d7c860a 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Misc.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Misc.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -217,10 +217,8 @@ class SimplePie_Misc
{
return substr_replace($url, 'itpc', 0, 4);
}
- else
- {
- return $url;
- }
+
+ return $url;
}
public static function array_merge_recursive($array1, $array2)
@@ -234,9 +232,9 @@ class SimplePie_Misc
else
{
$array1[$key] = $value;
- }
+ }
}
-
+
return $array1;
}
@@ -276,10 +274,8 @@ class SimplePie_Misc
{
return chr($integer);
}
- else
- {
- return strtoupper($match[0]);
- }
+
+ return strtoupper($match[0]);
}
/**
@@ -343,11 +339,9 @@ class SimplePie_Misc
{
return $return;
}
+
// If we can't do anything, just fail
- else
- {
- return false;
- }
+ return false;
}
protected static function change_encoding_mbstring($data, $input, $output)
@@ -1858,10 +1852,8 @@ class SimplePie_Misc
{
return trim($mime);
}
- else
- {
- return trim(substr($mime, 0, $pos));
- }
+
+ return trim(substr($mime, 0, $pos));
}
public static function atom_03_construct_type($attribs)
@@ -1894,10 +1886,8 @@ class SimplePie_Misc
return SIMPLEPIE_CONSTRUCT_NONE | $mode;
}
}
- else
- {
- return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
- }
+
+ return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
}
public static function atom_10_construct_type($attribs)
@@ -1947,10 +1937,8 @@ class SimplePie_Misc
return SIMPLEPIE_CONSTRUCT_BASE64;
}
}
- else
- {
- return SIMPLEPIE_CONSTRUCT_TEXT;
- }
+
+ return SIMPLEPIE_CONSTRUCT_TEXT;
}
public static function is_isegment_nz_nc($string)
@@ -2007,11 +1995,9 @@ class SimplePie_Misc
{
return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
}
- else
- {
- // U+FFFD REPLACEMENT CHARACTER
- return "\xEF\xBF\xBD";
- }
+
+ // U+FFFD REPLACEMENT CHARACTER
+ return "\xEF\xBF\xBD";
}
/**
@@ -2215,10 +2201,8 @@ function embed_wmedia(width, height, link) {
{
return filemtime(dirname(__FILE__) . '/Core.php');
}
- else
- {
- return filemtime(__FILE__);
- }
+
+ return filemtime(__FILE__);
}
/**
@@ -2276,4 +2260,3 @@ function embed_wmedia(width, height, link) {
// No-op
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Net/IPv6.php b/vendor/simplepie/simplepie/library/SimplePie/Net/IPv6.php
index 47658aff2..25c992bd1 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Net/IPv6.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Net/IPv6.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -53,7 +53,7 @@
* @author Alexander Merz <alexander.merz@web.de>
* @author elfrink at introweb dot nl
* @author Josh Peck <jmp at joshpeck dot org>
- * @author Geoffrey Sneddon <geoffers@gmail.com>
+ * @author Sam Sneddon <geoffers@gmail.com>
*/
class SimplePie_Net_IPv6
{
@@ -173,10 +173,8 @@ class SimplePie_Net_IPv6
{
return implode(':', $ip_parts);
}
- else
- {
- return $ip_parts[0];
- }
+
+ return $ip_parts[0];
}
/**
@@ -200,10 +198,8 @@ class SimplePie_Net_IPv6
$ipv4_part = substr($ip, $pos + 1);
return array($ipv6_part, $ipv4_part);
}
- else
- {
- return array($ip, '');
- }
+
+ return array($ip, '');
}
/**
@@ -253,10 +249,8 @@ class SimplePie_Net_IPv6
}
return true;
}
- else
- {
- return false;
- }
+
+ return false;
}
/**
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Parse/Date.php b/vendor/simplepie/simplepie/library/SimplePie/Parse/Date.php
index 1f2156655..cf57437d2 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Parse/Date.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Parse/Date.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -98,12 +98,20 @@ class SimplePie_Parse_Date
'dimanche' => 7,
// German
'montag' => 1,
+ 'mo' => 1,
'dienstag' => 2,
+ 'di' => 2,
'mittwoch' => 3,
+ 'mi' => 3,
'donnerstag' => 4,
+ 'do' => 4,
'freitag' => 5,
+ 'fr' => 5,
'samstag' => 6,
+ 'sa' => 6,
'sonnabend' => 6,
+ // AFAIK no short form for sonnabend
+ 'so' => 7,
'sonntag' => 7,
// Italian
'lunedì' => 1,
@@ -145,6 +153,14 @@ class SimplePie_Parse_Date
'Παρ' => 5,
'Σαβ' => 6,
'Κυρ' => 7,
+ // Russian
+ 'Пн.' => 1,
+ 'Вт.' => 2,
+ 'Ср.' => 3,
+ 'Чт.' => 4,
+ 'Пт.' => 5,
+ 'Сб.' => 6,
+ 'Вс.' => 7,
);
/**
@@ -207,17 +223,28 @@ class SimplePie_Parse_Date
'décembre' => 12,
// German
'januar' => 1,
+ 'jan' => 1,
'februar' => 2,
+ 'feb' => 2,
'märz' => 3,
+ 'mär' => 3,
'april' => 4,
- 'mai' => 5,
+ 'apr' => 4,
+ 'mai' => 5, // no short form for may
'juni' => 6,
+ 'jun' => 6,
'juli' => 7,
+ 'jul' => 7,
'august' => 8,
+ 'aug' => 8,
'september' => 9,
+ 'sep' => 9,
'oktober' => 10,
+ 'okt' => 10,
'november' => 11,
+ 'nov' => 11,
'dezember' => 12,
+ 'dez' => 12,
// Italian
'gennaio' => 1,
'febbraio' => 2,
@@ -289,7 +316,33 @@ class SimplePie_Parse_Date
'Σεπ' => 9,
'Οκτ' => 10,
'Νοέ' => 11,
- 'Δεκ' => 12,
+ 'Δεκ' => 12,
+ // Russian
+ 'Янв' => 1,
+ 'января' => 1,
+ 'Фев' => 2,
+ 'февраля' => 2,
+ 'Мар' => 3,
+ 'марта' => 3,
+ 'Апр' => 4,
+ 'апреля' => 4,
+ 'Май' => 5,
+ 'мая' => 5,
+ 'Июн' => 6,
+ 'июня' => 6,
+ 'Июл' => 7,
+ 'июля' => 7,
+ 'Авг' => 8,
+ 'августа' => 8,
+ 'Сен' => 9,
+ 'сентября' => 9,
+ 'Окт' => 10,
+ 'октября' => 10,
+ 'Ноя' => 11,
+ 'ноября' => 11,
+ 'Дек' => 12,
+ 'декабря' => 12,
+
);
/**
@@ -541,8 +594,8 @@ class SimplePie_Parse_Date
*/
public function __construct()
{
- $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
- $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
+ $this->day_pcre = '(' . implode('|', array_keys($this->day)) . ')';
+ $this->month_pcre = '(' . implode('|', array_keys($this->month)) . ')';
static $cache;
if (!isset($cache[get_class($this)]))
@@ -690,14 +743,12 @@ class SimplePie_Parse_Date
}
// Convert the number of seconds to an integer, taking decimals into account
- $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));
+ $second = round((int)$match[6] + (int)$match[7] / (10 ** strlen($match[7])));
return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
}
- else
- {
- return false;
- }
+
+ return false;
}
/**
@@ -848,10 +899,8 @@ class SimplePie_Parse_Date
return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
}
- else
- {
- return false;
- }
+
+ return false;
}
/**
@@ -913,10 +962,8 @@ class SimplePie_Parse_Date
return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
}
- else
- {
- return false;
- }
+
+ return false;
}
/**
@@ -955,10 +1002,8 @@ class SimplePie_Parse_Date
$month = $this->month[strtolower($match[2])];
return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
}
- else
- {
- return false;
- }
+
+ return false;
}
/**
@@ -974,10 +1019,7 @@ class SimplePie_Parse_Date
{
return false;
}
- else
- {
- return $strtotime;
- }
+
+ return $strtotime;
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Parser.php b/vendor/simplepie/simplepie/library/SimplePie/Parser.php
index df1234023..4efdf41a7 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Parser.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Parser.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -176,76 +176,72 @@ class SimplePie_Parser
xml_parser_free($xml);
return $return;
}
- else
+
+ libxml_clear_errors();
+ $xml = new XMLReader();
+ $xml->xml($data);
+ while (@$xml->read())
{
- libxml_clear_errors();
- $xml = new XMLReader();
- $xml->xml($data);
- while (@$xml->read())
+ switch ($xml->nodeType)
{
- switch ($xml->nodeType)
- {
- case constant('XMLReader::END_ELEMENT'):
+ case constant('XMLReader::END_ELEMENT'):
+ if ($xml->namespaceURI !== '')
+ {
+ $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
+ }
+ else
+ {
+ $tagName = $xml->localName;
+ }
+ $this->tag_close(null, $tagName);
+ break;
+ case constant('XMLReader::ELEMENT'):
+ $empty = $xml->isEmptyElement;
+ if ($xml->namespaceURI !== '')
+ {
+ $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
+ }
+ else
+ {
+ $tagName = $xml->localName;
+ }
+ $attributes = array();
+ while ($xml->moveToNextAttribute())
+ {
if ($xml->namespaceURI !== '')
{
- $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
+ $attrName = $xml->namespaceURI . $this->separator . $xml->localName;
}
else
{
- $tagName = $xml->localName;
+ $attrName = $xml->localName;
}
+ $attributes[$attrName] = $xml->value;
+ }
+ $this->tag_open(null, $tagName, $attributes);
+ if ($empty)
+ {
$this->tag_close(null, $tagName);
- break;
- case constant('XMLReader::ELEMENT'):
- $empty = $xml->isEmptyElement;
- if ($xml->namespaceURI !== '')
- {
- $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
- }
- else
- {
- $tagName = $xml->localName;
- }
- $attributes = array();
- while ($xml->moveToNextAttribute())
- {
- if ($xml->namespaceURI !== '')
- {
- $attrName = $xml->namespaceURI . $this->separator . $xml->localName;
- }
- else
- {
- $attrName = $xml->localName;
- }
- $attributes[$attrName] = $xml->value;
- }
- $this->tag_open(null, $tagName, $attributes);
- if ($empty)
- {
- $this->tag_close(null, $tagName);
- }
- break;
- case constant('XMLReader::TEXT'):
+ }
+ break;
+ case constant('XMLReader::TEXT'):
- case constant('XMLReader::CDATA'):
- $this->cdata(null, $xml->value);
- break;
- }
- }
- if ($error = libxml_get_last_error())
- {
- $this->error_code = $error->code;
- $this->error_string = $error->message;
- $this->current_line = $error->line;
- $this->current_column = $error->column;
- return false;
- }
- else
- {
- return true;
+ case constant('XMLReader::CDATA'):
+ $this->cdata(null, $xml->value);
+ break;
}
}
+ if ($error = libxml_get_last_error())
+ {
+ $this->error_code = $error->code;
+ $this->error_string = $error->message;
+ $this->current_line = $error->line;
+ $this->current_column = $error->column;
+ return false;
+ }
+
+ return true;
}
public function get_error_code()
@@ -662,4 +658,4 @@ class SimplePie_Parser
// html is allowed, but the xml specification says they must be declared.
return '<!DOCTYPE html [ <!ENTITY nbsp "&#x00A0;"> <!ENTITY iexcl "&#x00A1;"> <!ENTITY cent "&#x00A2;"> <!ENTITY pound "&#x00A3;"> <!ENTITY curren "&#x00A4;"> <!ENTITY yen "&#x00A5;"> <!ENTITY brvbar "&#x00A6;"> <!ENTITY sect "&#x00A7;"> <!ENTITY uml "&#x00A8;"> <!ENTITY copy "&#x00A9;"> <!ENTITY ordf "&#x00AA;"> <!ENTITY laquo "&#x00AB;"> <!ENTITY not "&#x00AC;"> <!ENTITY shy "&#x00AD;"> <!ENTITY reg "&#x00AE;"> <!ENTITY macr "&#x00AF;"> <!ENTITY deg "&#x00B0;"> <!ENTITY plusmn "&#x00B1;"> <!ENTITY sup2 "&#x00B2;"> <!ENTITY sup3 "&#x00B3;"> <!ENTITY acute "&#x00B4;"> <!ENTITY micro "&#x00B5;"> <!ENTITY para "&#x00B6;"> <!ENTITY middot "&#x00B7;"> <!ENTITY cedil "&#x00B8;"> <!ENTITY sup1 "&#x00B9;"> <!ENTITY ordm "&#x00BA;"> <!ENTITY raquo "&#x00BB;"> <!ENTITY frac14 "&#x00BC;"> <!ENTITY frac12 "&#x00BD;"> <!ENTITY frac34 "&#x00BE;"> <!ENTITY iquest "&#x00BF;"> <!ENTITY Agrave "&#x00C0;"> <!ENTITY Aacute "&#x00C1;"> <!ENTITY Acirc "&#x00C2;"> <!ENTITY Atilde "&#x00C3;"> <!ENTITY Auml "&#x00C4;"> <!ENTITY Aring "&#x00C5;"> <!ENTITY AElig "&#x00C6;"> <!ENTITY Ccedil "&#x00C7;"> <!ENTITY Egrave "&#x00C8;"> <!ENTITY Eacute "&#x00C9;"> <!ENTITY Ecirc "&#x00CA;"> <!ENTITY Euml "&#x00CB;"> <!ENTITY Igrave "&#x00CC;"> <!ENTITY Iacute "&#x00CD;"> <!ENTITY Icirc "&#x00CE;"> <!ENTITY Iuml "&#x00CF;"> <!ENTITY ETH "&#x00D0;"> <!ENTITY Ntilde "&#x00D1;"> <!ENTITY Ograve "&#x00D2;"> <!ENTITY Oacute "&#x00D3;"> <!ENTITY Ocirc "&#x00D4;"> <!ENTITY Otilde "&#x00D5;"> <!ENTITY Ouml "&#x00D6;"> <!ENTITY times "&#x00D7;"> <!ENTITY Oslash "&#x00D8;"> <!ENTITY Ugrave "&#x00D9;"> <!ENTITY Uacute "&#x00DA;"> <!ENTITY Ucirc "&#x00DB;"> <!ENTITY Uuml "&#x00DC;"> <!ENTITY Yacute "&#x00DD;"> <!ENTITY THORN "&#x00DE;"> <!ENTITY szlig "&#x00DF;"> <!ENTITY agrave "&#x00E0;"> <!ENTITY aacute "&#x00E1;"> <!ENTITY acirc "&#x00E2;"> <!ENTITY atilde "&#x00E3;"> <!ENTITY auml "&#x00E4;"> <!ENTITY aring "&#x00E5;"> <!ENTITY aelig "&#x00E6;"> <!ENTITY ccedil "&#x00E7;"> <!ENTITY egrave "&#x00E8;"> <!ENTITY eacute "&#x00E9;"> <!ENTITY ecirc "&#x00EA;"> <!ENTITY euml "&#x00EB;"> <!ENTITY igrave "&#x00EC;"> <!ENTITY iacute "&#x00ED;"> <!ENTITY icirc "&#x00EE;"> <!ENTITY iuml "&#x00EF;"> <!ENTITY eth "&#x00F0;"> <!ENTITY ntilde "&#x00F1;"> <!ENTITY ograve "&#x00F2;"> <!ENTITY oacute "&#x00F3;"> <!ENTITY ocirc "&#x00F4;"> <!ENTITY otilde "&#x00F5;"> <!ENTITY ouml "&#x00F6;"> <!ENTITY divide "&#x00F7;"> <!ENTITY oslash "&#x00F8;"> <!ENTITY ugrave "&#x00F9;"> <!ENTITY uacute "&#x00FA;"> <!ENTITY ucirc "&#x00FB;"> <!ENTITY uuml "&#x00FC;"> <!ENTITY yacute "&#x00FD;"> <!ENTITY thorn "&#x00FE;"> <!ENTITY yuml "&#x00FF;"> <!ENTITY OElig "&#x0152;"> <!ENTITY oelig "&#x0153;"> <!ENTITY Scaron "&#x0160;"> <!ENTITY scaron "&#x0161;"> <!ENTITY Yuml "&#x0178;"> <!ENTITY fnof "&#x0192;"> <!ENTITY circ "&#x02C6;"> <!ENTITY tilde "&#x02DC;"> <!ENTITY Alpha "&#x0391;"> <!ENTITY Beta "&#x0392;"> <!ENTITY Gamma "&#x0393;"> <!ENTITY Epsilon "&#x0395;"> <!ENTITY Zeta "&#x0396;"> <!ENTITY Eta "&#x0397;"> <!ENTITY Theta "&#x0398;"> <!ENTITY Iota "&#x0399;"> <!ENTITY Kappa "&#x039A;"> <!ENTITY Lambda "&#x039B;"> <!ENTITY Mu "&#x039C;"> <!ENTITY Nu "&#x039D;"> <!ENTITY Xi "&#x039E;"> <!ENTITY Omicron "&#x039F;"> <!ENTITY Pi "&#x03A0;"> <!ENTITY Rho "&#x03A1;"> <!ENTITY Sigma "&#x03A3;"> <!ENTITY Tau "&#x03A4;"> <!ENTITY Upsilon "&#x03A5;"> <!ENTITY Phi "&#x03A6;"> <!ENTITY Chi "&#x03A7;"> <!ENTITY Psi "&#x03A8;"> <!ENTITY Omega "&#x03A9;"> <!ENTITY alpha "&#x03B1;"> <!ENTITY beta "&#x03B2;"> <!ENTITY gamma "&#x03B3;"> <!ENTITY delta "&#x03B4;"> <!ENTITY epsilon "&#x03B5;"> <!ENTITY zeta "&#x03B6;"> <!ENTITY eta "&#x03B7;"> <!ENTITY theta "&#x03B8;"> <!ENTITY iota "&#x03B9;"> <!ENTITY kappa "&#x03BA;"> <!ENTITY lambda "&#x03BB;"> <!ENTITY mu "&#x03BC;"> <!ENTITY nu "&#x03BD;"> <!ENTITY xi "&#x03BE;"> <!ENTITY omicron "&#x03BF;"> <!ENTITY pi "&#x03C0;"> <!ENTITY rho "&#x03C1;"> <!ENTITY sigmaf "&#x03C2;"> <!ENTITY sigma "&#x03C3;"> <!ENTITY tau "&#x03C4;"> <!ENTITY upsilon "&#x03C5;"> <!ENTITY phi "&#x03C6;"> <!ENTITY chi "&#x03C7;"> <!ENTITY psi "&#x03C8;"> <!ENTITY omega "&#x03C9;"> <!ENTITY thetasym "&#x03D1;"> <!ENTITY upsih "&#x03D2;"> <!ENTITY piv "&#x03D6;"> <!ENTITY ensp "&#x2002;"> <!ENTITY emsp "&#x2003;"> <!ENTITY thinsp "&#x2009;"> <!ENTITY zwnj "&#x200C;"> <!ENTITY zwj "&#x200D;"> <!ENTITY lrm "&#x200E;"> <!ENTITY rlm "&#x200F;"> <!ENTITY ndash "&#x2013;"> <!ENTITY mdash "&#x2014;"> <!ENTITY lsquo "&#x2018;"> <!ENTITY rsquo "&#x2019;"> <!ENTITY sbquo "&#x201A;"> <!ENTITY ldquo "&#x201C;"> <!ENTITY rdquo "&#x201D;"> <!ENTITY bdquo "&#x201E;"> <!ENTITY dagger "&#x2020;"> <!ENTITY Dagger "&#x2021;"> <!ENTITY bull "&#x2022;"> <!ENTITY hellip "&#x2026;"> <!ENTITY permil "&#x2030;"> <!ENTITY prime "&#x2032;"> <!ENTITY Prime "&#x2033;"> <!ENTITY lsaquo "&#x2039;"> <!ENTITY rsaquo "&#x203A;"> <!ENTITY oline "&#x203E;"> <!ENTITY frasl "&#x2044;"> <!ENTITY euro "&#x20AC;"> <!ENTITY image "&#x2111;"> <!ENTITY weierp "&#x2118;"> <!ENTITY real "&#x211C;"> <!ENTITY trade "&#x2122;"> <!ENTITY alefsym "&#x2135;"> <!ENTITY larr "&#x2190;"> <!ENTITY uarr "&#x2191;"> <!ENTITY rarr "&#x2192;"> <!ENTITY darr "&#x2193;"> <!ENTITY harr "&#x2194;"> <!ENTITY crarr "&#x21B5;"> <!ENTITY lArr "&#x21D0;"> <!ENTITY uArr "&#x21D1;"> <!ENTITY rArr "&#x21D2;"> <!ENTITY dArr "&#x21D3;"> <!ENTITY hArr "&#x21D4;"> <!ENTITY forall "&#x2200;"> <!ENTITY part "&#x2202;"> <!ENTITY exist "&#x2203;"> <!ENTITY empty "&#x2205;"> <!ENTITY nabla "&#x2207;"> <!ENTITY isin "&#x2208;"> <!ENTITY notin "&#x2209;"> <!ENTITY ni "&#x220B;"> <!ENTITY prod "&#x220F;"> <!ENTITY sum "&#x2211;"> <!ENTITY minus "&#x2212;"> <!ENTITY lowast "&#x2217;"> <!ENTITY radic "&#x221A;"> <!ENTITY prop "&#x221D;"> <!ENTITY infin "&#x221E;"> <!ENTITY ang "&#x2220;"> <!ENTITY and "&#x2227;"> <!ENTITY or "&#x2228;"> <!ENTITY cap "&#x2229;"> <!ENTITY cup "&#x222A;"> <!ENTITY int "&#x222B;"> <!ENTITY there4 "&#x2234;"> <!ENTITY sim "&#x223C;"> <!ENTITY cong "&#x2245;"> <!ENTITY asymp "&#x2248;"> <!ENTITY ne "&#x2260;"> <!ENTITY equiv "&#x2261;"> <!ENTITY le "&#x2264;"> <!ENTITY ge "&#x2265;"> <!ENTITY sub "&#x2282;"> <!ENTITY sup "&#x2283;"> <!ENTITY nsub "&#x2284;"> <!ENTITY sube "&#x2286;"> <!ENTITY supe "&#x2287;"> <!ENTITY oplus "&#x2295;"> <!ENTITY otimes "&#x2297;"> <!ENTITY perp "&#x22A5;"> <!ENTITY sdot "&#x22C5;"> <!ENTITY lceil "&#x2308;"> <!ENTITY rceil "&#x2309;"> <!ENTITY lfloor "&#x230A;"> <!ENTITY rfloor "&#x230B;"> <!ENTITY lang "&#x2329;"> <!ENTITY rang "&#x232A;"> <!ENTITY loz "&#x25CA;"> <!ENTITY spades "&#x2660;"> <!ENTITY clubs "&#x2663;"> <!ENTITY hearts "&#x2665;"> <!ENTITY diams "&#x2666;"> ]>';
}
-} \ No newline at end of file
+}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Rating.php b/vendor/simplepie/simplepie/library/SimplePie/Rating.php
index eaf57080c..599f75acb 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Rating.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Rating.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -103,10 +103,8 @@ class SimplePie_Rating
{
return $this->scheme;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -120,9 +118,7 @@ class SimplePie_Rating
{
return $this->value;
}
- else
- {
- return null;
- }
+
+ return null;
}
}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Registry.php b/vendor/simplepie/simplepie/library/SimplePie/Registry.php
index e0909bb74..bf3baf179 100755
--- a/vendor/simplepie/simplepie/library/SimplePie/Registry.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Registry.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Restriction.php b/vendor/simplepie/simplepie/library/SimplePie/Restriction.php
index 001a5cd28..950017fae 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Restriction.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Restriction.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -112,10 +112,8 @@ class SimplePie_Restriction
{
return $this->relationship;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -129,10 +127,8 @@ class SimplePie_Restriction
{
return $this->type;
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -146,9 +142,7 @@ class SimplePie_Restriction
{
return $this->value;
}
- else
- {
- return null;
- }
+
+ return null;
}
}
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Sanitize.php b/vendor/simplepie/simplepie/library/SimplePie/Sanitize.php
index 5a11721df..35838032f 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Sanitize.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Sanitize.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -354,7 +354,7 @@ class SimplePie_Sanitize
}
else
{
- trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
+ trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
}
}
}
@@ -365,14 +365,7 @@ class SimplePie_Sanitize
// Get content node
$div = $document->getElementsByTagName('body')->item(0)->firstChild;
// Finally, convert to a HTML string
- if (version_compare(PHP_VERSION, '5.3.6', '>='))
- {
- $data = trim($document->saveHTML($div));
- }
- else
- {
- $data = trim($document->saveXML($div));
- }
+ $data = trim($document->saveHTML($div));
if ($this->remove_div)
{
diff --git a/vendor/simplepie/simplepie/library/SimplePie/Source.php b/vendor/simplepie/simplepie/library/SimplePie/Source.php
index 1a66a392d..f14e5b220 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/Source.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/Source.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -79,10 +79,8 @@ class SimplePie_Source
{
return $this->data['child'][$namespace][$tag];
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_base($element = array())
@@ -130,10 +128,8 @@ class SimplePie_Source
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_category($key = 0)
@@ -143,10 +139,8 @@ class SimplePie_Source
{
return $categories[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_categories()
@@ -200,10 +194,8 @@ class SimplePie_Source
{
return array_unique($categories);
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_author($key = 0)
@@ -213,10 +205,8 @@ class SimplePie_Source
{
return $authors[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_authors()
@@ -283,10 +273,8 @@ class SimplePie_Source
{
return array_unique($authors);
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_contributor($key = 0)
@@ -296,10 +284,8 @@ class SimplePie_Source
{
return $contributors[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_contributors()
@@ -354,10 +340,8 @@ class SimplePie_Source
{
return array_unique($contributors);
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_link($key = 0, $rel = 'alternate')
@@ -367,10 +351,8 @@ class SimplePie_Source
{
return $links[$key];
}
- else
- {
- return null;
- }
+
+ return null;
}
/**
@@ -449,10 +431,8 @@ class SimplePie_Source
{
return $this->data['links'][$rel];
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_description()
@@ -493,10 +473,8 @@ class SimplePie_Source
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_copyright()
@@ -521,10 +499,8 @@ class SimplePie_Source
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_language()
@@ -545,10 +521,8 @@ class SimplePie_Source
{
return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_latitude()
@@ -561,10 +535,8 @@ class SimplePie_Source
{
return (float) $match[1];
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_longitude()
@@ -581,10 +553,8 @@ class SimplePie_Source
{
return (float) $match[2];
}
- else
- {
- return null;
- }
+
+ return null;
}
public function get_image_url()
@@ -601,10 +571,7 @@ class SimplePie_Source
{
return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
}
- else
- {
- return null;
- }
+
+ return null;
}
}
-
diff --git a/vendor/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php b/vendor/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php
index 99e751672..0c857a586 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/XML/Declaration/Parser.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -136,13 +136,11 @@ class SimplePie_XML_Declaration_Parser
{
return true;
}
- else
- {
- $this->version = '';
- $this->encoding = '';
- $this->standalone = '';
- return false;
- }
+
+ $this->version = '';
+ $this->encoding = '';
+ $this->standalone = '';
+ return false;
}
/**
diff --git a/vendor/simplepie/simplepie/library/SimplePie/gzdecode.php b/vendor/simplepie/simplepie/library/SimplePie/gzdecode.php
index 0e8bc8fc6..9c54f8833 100644
--- a/vendor/simplepie/simplepie/library/SimplePie/gzdecode.php
+++ b/vendor/simplepie/simplepie/library/SimplePie/gzdecode.php
@@ -5,7 +5,7 @@
* A PHP-Based RSS and Atom Feed Framework.
* Takes the hard work out of managing a complete RSS/Atom solution.
*
- * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
@@ -33,9 +33,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* @package SimplePie
- * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
* @author Ryan Parman
- * @author Geoffrey Sneddon
+ * @author Sam Sneddon
* @author Ryan McCue
* @link http://simplepie.org/ SimplePie
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -338,10 +338,8 @@ class SimplePie_gzdecode
{
return false;
}
- else
- {
- $this->position = $this->compressed_size - 8;
- }
+
+ $this->position = $this->compressed_size - 8;
// Check CRC of data
$crc = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
@@ -362,9 +360,7 @@ class SimplePie_gzdecode
// Wow, against all odds, we've actually got a valid gzip string
return true;
}
- else
- {
- return false;
- }
+
+ return false;
}
}
diff --git a/vendor/splitbrain/php-archive/src/Archive.php b/vendor/splitbrain/php-archive/src/Archive.php
index d672cc6ec..45c87fda6 100644
--- a/vendor/splitbrain/php-archive/src/Archive.php
+++ b/vendor/splitbrain/php-archive/src/Archive.php
@@ -10,12 +10,15 @@ abstract class Archive
const COMPRESS_GZIP = 1;
const COMPRESS_BZIP = 2;
+ /** @var callable */
+ protected $callback;
+
/**
* Set the compression level and type
*
* @param int $level Compression level (0 to 9)
* @param int $type Type of compression to use (use COMPRESS_* constants)
- * @return mixed
+ * @throws ArchiveIllegalCompressionException
*/
abstract public function setCompression($level = 9, $type = Archive::COMPRESS_AUTO);
@@ -117,16 +120,16 @@ abstract class Archive
*/
abstract public function save($file);
-}
-
-class ArchiveIOException extends \Exception
-{
-}
-
-class ArchiveIllegalCompressionException extends \Exception
-{
-}
-
-class ArchiveCorruptedException extends \Exception
-{
+ /**
+ * Set a callback function to be called whenever a file is added or extracted.
+ *
+ * The callback is called with a FileInfo object as parameter. You can use this to show progress
+ * info during an operation.
+ *
+ * @param callable $callback
+ */
+ public function setCallback($callback)
+ {
+ $this->callback = $callback;
+ }
}
diff --git a/vendor/splitbrain/php-archive/src/ArchiveCorruptedException.php b/vendor/splitbrain/php-archive/src/ArchiveCorruptedException.php
new file mode 100644
index 000000000..a87cff4ff
--- /dev/null
+++ b/vendor/splitbrain/php-archive/src/ArchiveCorruptedException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace splitbrain\PHPArchive;
+
+/**
+ * The archive is unreadable
+ */
+class ArchiveCorruptedException extends \Exception
+{
+} \ No newline at end of file
diff --git a/vendor/splitbrain/php-archive/src/ArchiveIOException.php b/vendor/splitbrain/php-archive/src/ArchiveIOException.php
new file mode 100644
index 000000000..6128caf2f
--- /dev/null
+++ b/vendor/splitbrain/php-archive/src/ArchiveIOException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace splitbrain\PHPArchive;
+
+/**
+ * Read/Write Errors
+ */
+class ArchiveIOException extends \Exception
+{
+} \ No newline at end of file
diff --git a/vendor/splitbrain/php-archive/src/ArchiveIllegalCompressionException.php b/vendor/splitbrain/php-archive/src/ArchiveIllegalCompressionException.php
new file mode 100644
index 000000000..40a680f37
--- /dev/null
+++ b/vendor/splitbrain/php-archive/src/ArchiveIllegalCompressionException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace splitbrain\PHPArchive;
+
+/**
+ * Bad or unsupported compression settings requested
+ */
+class ArchiveIllegalCompressionException extends \Exception
+{
+} \ No newline at end of file
diff --git a/vendor/splitbrain/php-archive/src/FileInfo.php b/vendor/splitbrain/php-archive/src/FileInfo.php
index 99f60c0fe..11fca7e4f 100644
--- a/vendor/splitbrain/php-archive/src/FileInfo.php
+++ b/vendor/splitbrain/php-archive/src/FileInfo.php
@@ -288,7 +288,6 @@ class FileInfo
* the prefix will be stripped. It is recommended to give prefixes with a trailing slash.
*
* @param int|string $strip
- * @return FileInfo
*/
public function strip($strip)
{
@@ -339,6 +338,3 @@ class FileInfo
}
}
-class FileInfoException extends \Exception
-{
-} \ No newline at end of file
diff --git a/vendor/splitbrain/php-archive/src/FileInfoException.php b/vendor/splitbrain/php-archive/src/FileInfoException.php
new file mode 100644
index 000000000..9c6acaac2
--- /dev/null
+++ b/vendor/splitbrain/php-archive/src/FileInfoException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace splitbrain\PHPArchive;
+
+/**
+ * File meta data problems
+ */
+class FileInfoException extends \Exception
+{
+} \ No newline at end of file
diff --git a/vendor/splitbrain/php-archive/src/Tar.php b/vendor/splitbrain/php-archive/src/Tar.php
index 5f01f39bd..9550b6c91 100644
--- a/vendor/splitbrain/php-archive/src/Tar.php
+++ b/vendor/splitbrain/php-archive/src/Tar.php
@@ -28,12 +28,15 @@ class Tar extends Archive
* Sets the compression to use
*
* @param int $level Compression level (0 to 9)
- * @param int $type Type of compression to use (use COMPRESS_* constants)
- * @return mixed
+ * @param int $type Type of compression to use (use COMPRESS_* constants)
+ * @throws ArchiveIllegalCompressionException
*/
public function setCompression($level = 9, $type = Archive::COMPRESS_AUTO)
{
$this->compressioncheck($type);
+ if ($level < -1 || $level > 9) {
+ throw new ArchiveIllegalCompressionException('Compression level should be between -1 and 9');
+ }
$this->comptype = $type;
$this->complevel = $level;
if($level == 0) $this->comptype = Archive::COMPRESS_NONE;
@@ -45,6 +48,7 @@ class Tar extends Archive
*
* @param string $file
* @throws ArchiveIOException
+ * @throws ArchiveIllegalCompressionException
*/
public function open($file)
{
@@ -79,6 +83,7 @@ class Tar extends Archive
* Reopen the file with open() again if you want to do additional operations
*
* @throws ArchiveIOException
+ * @throws ArchiveCorruptedException
* @returns FileInfo[]
*/
public function contents()
@@ -120,11 +125,12 @@ class Tar extends Archive
* The archive is closed afer reading the contents, because rewinding is not possible in bzip2 streams.
* Reopen the file with open() again if you want to do additional operations
*
- * @param string $outdir the target directory for extracting
- * @param int|string $strip either the number of path components or a fixed prefix to strip
- * @param string $exclude a regular expression of files to exclude
- * @param string $include a regular expression of files to include
+ * @param string $outdir the target directory for extracting
+ * @param int|string $strip either the number of path components or a fixed prefix to strip
+ * @param string $exclude a regular expression of files to exclude
+ * @param string $include a regular expression of files to include
* @throws ArchiveIOException
+ * @throws ArchiveCorruptedException
* @return FileInfo[]
*/
public function extract($outdir, $strip = '', $exclude = '', $include = '')
@@ -178,12 +184,15 @@ class Tar extends Archive
}
fclose($fp);
- touch($output, $fileinfo->getMtime());
- chmod($output, $fileinfo->getMode());
+ @touch($output, $fileinfo->getMtime());
+ @chmod($output, $fileinfo->getMode());
} else {
$this->skipbytes(ceil($header['size'] / 512) * 512); // the size is usually 0 for directories
}
+ if(is_callable($this->callback)) {
+ call_user_func($this->callback, $fileinfo);
+ }
$extracted[] = $fileinfo;
}
@@ -198,6 +207,7 @@ class Tar extends Archive
*
* @param string $file
* @throws ArchiveIOException
+ * @throws ArchiveIllegalCompressionException
*/
public function create($file = '')
{
@@ -234,6 +244,7 @@ class Tar extends Archive
* @param string|FileInfo $fileinfo either the name to us in archive (string) or a FileInfo oject with all meta data, empty to take from original
* @throws ArchiveCorruptedException when the file changes while reading it, the archive will be corrupt and should be deleted
* @throws ArchiveIOException there was trouble reading the given file, it was not added
+ * @throws FileInfoException trouble reading file info, it was not added
*/
public function addFile($file, $fileinfo = '')
{
@@ -273,6 +284,10 @@ class Tar extends Archive
$this->close();
throw new ArchiveCorruptedException("The size of $file changed while reading, archive corrupted. read $read expected ".$fileinfo->getSize());
}
+
+ if(is_callable($this->callback)) {
+ call_user_func($this->callback, $fileinfo);
+ }
}
/**
@@ -299,6 +314,10 @@ class Tar extends Archive
for ($s = 0; $s < $len; $s += 512) {
$this->writebytes(pack("a512", substr($data, $s, 512)));
}
+
+ if (is_callable($this->callback)) {
+ call_user_func($this->callback, $fileinfo);
+ }
}
/**
@@ -311,6 +330,7 @@ class Tar extends Archive
* consists of two 512 blocks of zero bytes"
*
* @link http://www.gnu.org/software/tar/manual/html_chapter/tar_8.html#SEC134
+ * @throws ArchiveIOException
*/
public function close()
{
@@ -346,6 +366,7 @@ class Tar extends Archive
* Returns the created in-memory archive data
*
* This implicitly calls close() on the Archive
+ * @throws ArchiveIOException
*/
public function getArchive()
{
@@ -372,6 +393,7 @@ class Tar extends Archive
*
* @param string $file
* @throws ArchiveIOException
+ * @throws ArchiveIllegalCompressionException
*/
public function save($file)
{
@@ -451,9 +473,10 @@ class Tar extends Archive
}
/**
- * Write the given file metat data as header
+ * Write the given file meta data as header
*
* @param FileInfo $fileinfo
+ * @throws ArchiveIOException
*/
protected function writeFileHeader(FileInfo $fileinfo)
{
@@ -472,12 +495,13 @@ class Tar extends Archive
* Write a file header to the stream
*
* @param string $name
- * @param int $uid
- * @param int $gid
- * @param int $perm
- * @param int $size
- * @param int $mtime
+ * @param int $uid
+ * @param int $gid
+ * @param int $perm
+ * @param int $size
+ * @param int $mtime
* @param string $typeflag Set to '5' for directories
+ * @throws ArchiveIOException
*/
protected function writeRawFileHeader($name, $uid, $gid, $perm, $size, $mtime, $typeflag = '')
{
@@ -664,4 +688,5 @@ class Tar extends Archive
return Archive::COMPRESS_NONE;
}
+
}
diff --git a/vendor/splitbrain/php-archive/src/Zip.php b/vendor/splitbrain/php-archive/src/Zip.php
index e84516b63..3dade8063 100644
--- a/vendor/splitbrain/php-archive/src/Zip.php
+++ b/vendor/splitbrain/php-archive/src/Zip.php
@@ -34,10 +34,13 @@ class Zip extends Archive
*
* @param int $level Compression level (0 to 9)
* @param int $type Type of compression to use ignored for ZIP
- * @return mixed
+ * @throws ArchiveIllegalCompressionException
*/
public function setCompression($level = 9, $type = Archive::COMPRESS_AUTO)
{
+ if ($level < -1 || $level > 9) {
+ throw new ArchiveIllegalCompressionException('Compression level should be between -1 and 9');
+ }
$this->complevel = $level;
}
@@ -152,6 +155,9 @@ class Zip extends Archive
// nothing more to do for directories
if ($fileinfo->getIsdir()) {
+ if(is_callable($this->callback)) {
+ call_user_func($this->callback, $fileinfo);
+ }
continue;
}
@@ -226,8 +232,11 @@ class Zip extends Archive
unlink($extractto); // remove temporary gz file
}
- touch($output, $fileinfo->getMtime());
+ @touch($output, $fileinfo->getMtime());
//FIXME what about permissions?
+ if(is_callable($this->callback)) {
+ call_user_func($this->callback, $fileinfo);
+ }
}
$this->close();
@@ -271,9 +280,10 @@ class Zip extends Archive
/**
* Add a file to the current archive using an existing file in the filesystem
*
- * @param string $file path to the original file
+ * @param string $file path to the original file
* @param string|FileInfo $fileinfo either the name to use in archive (string) or a FileInfo oject with all meta data, empty to take from original
* @throws ArchiveIOException
+ * @throws FileInfoException
*/
public function addFile($file, $fileinfo = '')
{
@@ -350,6 +360,10 @@ class Zip extends Archive
$name,
(bool) $this->complevel
);
+
+ if(is_callable($this->callback)) {
+ call_user_func($this->callback, $fileinfo);
+ }
}
/**
@@ -357,6 +371,7 @@ class Zip extends Archive
*
* After a call to this function no more data can be added to the archive, for
* read access no reading is allowed anymore
+ * @throws ArchiveIOException
*/
public function close()
{
@@ -400,6 +415,7 @@ class Zip extends Archive
* Returns the created in-memory archive data
*
* This implicitly calls close() on the Archive
+ * @throws ArchiveIOException
*/
public function getArchive()
{
diff --git a/vendor/splitbrain/php-cli/README.md b/vendor/splitbrain/php-cli/README.md
index 7cc52ed81..5e42a55eb 100644
--- a/vendor/splitbrain/php-cli/README.md
+++ b/vendor/splitbrain/php-cli/README.md
@@ -10,7 +10,7 @@ It takes care of
- **colored output**
- **optional PSR3 compatibility**
-It is lightweight and has **no 3rd party dependencies**.
+It is lightweight and has **no 3rd party dependencies**. Note: this is for non-interactive scripts only. It has no readline or similar support.
[![Build Status](https://travis-ci.org/splitbrain/php-cli.svg)](https://travis-ci.org/splitbrain/php-cli)
@@ -155,4 +155,4 @@ Messages from `warning` level onwards are printed to `STDERR` all below are prin
The default log level of your script can be set by overwriting the `$logdefault` member.
-See `example/logging.php` for an example. \ No newline at end of file
+See `example/logging.php` for an example.
diff --git a/vendor/splitbrain/php-cli/src/CLI.php b/vendor/splitbrain/php-cli/src/CLI.php
index 569ec6756..2ee799027 100644
--- a/vendor/splitbrain/php-cli/src/CLI.php
+++ b/vendor/splitbrain/php-cli/src/CLI.php
@@ -21,7 +21,7 @@ abstract class CLI
/** @var array PSR-3 compatible loglevels and their prefix, color, output channel */
protected $loglevel = array(
- 'debug' => array('', Colors::C_LIGHTGRAY, STDOUT),
+ 'debug' => array('', Colors::C_RESET, STDOUT),
'info' => array('ℹ ', Colors::C_CYAN, STDOUT),
'notice' => array('☛ ', Colors::C_CYAN, STDOUT),
'success' => array('✓ ', Colors::C_GREEN, STDOUT),
@@ -77,7 +77,8 @@ abstract class CLI
* Execute the CLI program
*
* Executes the setup() routine, adds default options, initiate the options parsing and argument checking
- * and finally executes main()
+ * and finally executes main() - Each part is split into their own protected function below, so behaviour
+ * can easily be overwritten
*
* @throws Exception
*/
@@ -87,11 +88,27 @@ abstract class CLI
throw new Exception('This has to be run from the command line');
}
- // setup
$this->setup($this->options);
+ $this->registerDefaultOptions();
+ $this->parseOptions();
+ $this->handleDefaultOptions();
+ $this->setupLogging();
+ $this->checkArgments();
+ $this->execute();
+
+ exit(0);
+ }
+
+ // region run handlers - for easier overriding
+
+ /**
+ * Add the default help, color and log options
+ */
+ protected function registerDefaultOptions()
+ {
$this->options->registerOption(
'help',
- 'Display this help screen and exit immeadiately.',
+ 'Display this help screen and exit immediately.',
'h'
);
$this->options->registerOption(
@@ -105,11 +122,13 @@ abstract class CLI
null,
'level'
);
+ }
- // parse
- $this->options->parseOptions();
-
- // handle defaults
+ /**
+ * Handle the default options
+ */
+ protected function handleDefaultOptions()
+ {
if ($this->options->getOpt('no-colors')) {
$this->colors->disable();
}
@@ -117,22 +136,47 @@ abstract class CLI
echo $this->options->help();
exit(0);
}
+ }
+
+ /**
+ * Handle the logging options
+ */
+ protected function setupLogging()
+ {
$level = $this->options->getOpt('loglevel', $this->logdefault);
if (!isset($this->loglevel[$level])) $this->fatal('Unknown log level');
foreach (array_keys($this->loglevel) as $l) {
if ($l == $level) break;
unset($this->loglevel[$l]);
}
+ }
- // check arguments
+ /**
+ * Wrapper around the option parsing
+ */
+ protected function parseOptions()
+ {
+ $this->options->parseOptions();
+ }
+
+ /**
+ * Wrapper around the argument checking
+ */
+ protected function checkArgments()
+ {
$this->options->checkArguments();
+ }
- // execute
+ /**
+ * Wrapper around main
+ */
+ protected function execute()
+ {
$this->main($this->options);
-
- exit(0);
}
+ // endregion
+
// region logging
/**
@@ -286,7 +330,7 @@ abstract class CLI
/** @var string $color */
/** @var resource $channel */
list($prefix, $color, $channel) = $this->loglevel[$level];
- if(!$this->colors->isEnabled()) $prefix = '';
+ if (!$this->colors->isEnabled()) $prefix = '';
$message = $this->interpolate($message, $context);
$this->colors->ptln($prefix . $message, $color, $channel);
diff --git a/vendor/splitbrain/php-cli/src/Exception.php b/vendor/splitbrain/php-cli/src/Exception.php
index b2aa98115..4d24d587a 100644
--- a/vendor/splitbrain/php-cli/src/Exception.php
+++ b/vendor/splitbrain/php-cli/src/Exception.php
@@ -11,7 +11,7 @@ namespace splitbrain\phpcli;
* @author Andreas Gohr <andi@splitbrain.org>
* @license MIT
*/
-class Exception extends \Exception
+class Exception extends \RuntimeException
{
const E_ANY = -1; // no error code specified
const E_UNKNOWN_OPT = 1; //Unrecognized option
diff --git a/vendor/splitbrain/php-cli/src/Options.php b/vendor/splitbrain/php-cli/src/Options.php
index 4d8b44deb..76733aa16 100644
--- a/vendor/splitbrain/php-cli/src/Options.php
+++ b/vendor/splitbrain/php-cli/src/Options.php
@@ -58,6 +58,14 @@ class Options
$this->options = array();
}
+
+ /**
+ * Gets the bin value
+ */
+ public function getBin()
+ {
+ return $this->bin;
+ }
/**
* Sets the help text for the tool itself
diff --git a/vendor/splitbrain/php-cli/src/TableFormatter.php b/vendor/splitbrain/php-cli/src/TableFormatter.php
index 73fd6b36e..23bb89472 100644
--- a/vendor/splitbrain/php-cli/src/TableFormatter.php
+++ b/vendor/splitbrain/php-cli/src/TableFormatter.php
@@ -29,15 +29,7 @@ class TableFormatter
public function __construct(Colors $colors = null)
{
// try to get terminal width
- $width = 0;
- if (isset($_SERVER['COLUMNS'])) {
- // from environment
- $width = (int)$_SERVER['COLUMNS'];
- }
- if (!$width) {
- // via tput command
- $width = @exec('tput cols');
- }
+ $width = $this->getTerminalWidth();
if ($width) {
$this->max = $width - 1;
}
@@ -93,6 +85,27 @@ class TableFormatter
}
/**
+ * Tries to figure out the width of the terminal
+ *
+ * @return int terminal width, 0 if unknown
+ */
+ protected function getTerminalWidth()
+ {
+ // from environment
+ if (isset($_SERVER['COLUMNS'])) return (int)$_SERVER['COLUMNS'];
+
+ // via tput
+ $process = proc_open('tput cols', array(
+ 1 => array('pipe', 'w'),
+ 2 => array('pipe', 'w'),
+ ), $pipes);
+ $width = (int)stream_get_contents($pipes[1]);
+ proc_close($process);
+
+ return $width;
+ }
+
+ /**
* Takes an array with dynamic column width and calculates the correct width
*
* Column width can be given as fixed char widths, percentages and a single * width can be given
@@ -260,7 +273,12 @@ class TableFormatter
if (function_exists('mb_substr')) {
return mb_substr($string, $start, $length);
} else {
- return substr($string, $start, $length);
+ // mb_substr() treats $length differently than substr()
+ if ($length) {
+ return substr($string, $start, $length);
+ } else {
+ return substr($string, $start);
+ }
}
}